Merge "Update migrateUserGroup to deal with primary key issue"
authorDemon <chadh@wikimedia.org>
Thu, 30 Aug 2012 20:20:59 +0000 (20:20 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 30 Aug 2012 20:20:59 +0000 (20:20 +0000)
1184 files changed:
.gitignore
.jshintignore [new file with mode: 0644]
.jshintrc [new file with mode: 0644]
CREDITS
README
RELEASE-NOTES-1.20
UPGRADE
api.php
docs/export-0.7.xsd
docs/hooks.txt
docs/magicword.txt
docs/memcached.txt
docs/uidesign/mediawiki.action.history.diff.html
extensions/README
img_auth.php
includes/Action.php
includes/AjaxDispatcher.php
includes/Article.php
includes/AuthPlugin.php
includes/AutoLoader.php
includes/Block.php
includes/CacheHelper.php
includes/Category.php
includes/CategoryViewer.php
includes/ChangeTags.php
includes/ChangesFeed.php
includes/ChangesList.php
includes/Cookie.php
includes/CryptRand.php
includes/DataUpdate.php
includes/DefaultSettings.php
includes/DeferredUpdates.php
includes/Defines.php
includes/EditPage.php
includes/Exception.php
includes/Export.php
includes/Feed.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/Html.php
includes/HttpFunctions.php
includes/ImageGallery.php
includes/ImagePage.php
includes/Import.php
includes/Licenses.php
includes/Linker.php
includes/LinksUpdate.php
includes/LocalisationCache.php
includes/MagicWord.php
includes/Message.php
includes/MessageBlobStore.php
includes/Metadata.php
includes/Namespace.php
includes/OutputPage.php
includes/Pager.php
includes/Preferences.php
includes/ProtectionForm.php
includes/QueryPage.php
includes/RecentChange.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/ScopedPHPTimeout.php
includes/Setup.php
includes/SiteConfiguration.php
includes/SiteStats.php
includes/Skin.php
includes/SkinLegacy.php
includes/SkinTemplate.php
includes/SpecialPage.php
includes/SpecialPageFactory.php
includes/SqlDataUpdate.php
includes/SquidPurgeClient.php
includes/Status.php
includes/StreamFile.php
includes/StringUtils.php
includes/Title.php
includes/User.php
includes/WebRequest.php
includes/WebStart.php
includes/Wiki.php
includes/WikiMap.php
includes/WikiPage.php
includes/Xml.php
includes/ZhConversion.php
includes/ZipDirectoryReader.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RevisiondeleteAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiDelete.php
includes/api/ApiDisabled.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatDbg.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatTxt.php
includes/api/ApiFormatWddx.php
includes/api/ApiFormatXml.php
includes/api/ApiFormatYaml.php
includes/api/ApiHelp.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiLogout.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDisabled.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiResult.php
includes/api/ApiRollback.php
includes/api/ApiSetNotificationTimestamp.php [new file with mode: 0644]
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiWatch.php
includes/cache/HTMLFileCache.php
includes/cache/MemcachedSessions.php [deleted file]
includes/cache/MessageCache.php
includes/cache/ProcessCacheLRU.php [new file with mode: 0644]
includes/cache/SquidUpdate.php
includes/cache/UserCache.php [new file with mode: 0644]
includes/dao/IDBAccessObject.php [new file with mode: 0644]
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseIbm_db2.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/IORMRow.php
includes/db/IORMTable.php
includes/db/LBFactory.php
includes/db/ORMIterator.php
includes/db/ORMResult.php
includes/db/ORMRow.php
includes/db/ORMTable.php
includes/debug/Debug.php
includes/diff/DifferenceEngine.php
includes/filebackend/FSFile.php [new file with mode: 0644]
includes/filebackend/FSFileBackend.php [new file with mode: 0644]
includes/filebackend/FileBackend.php [new file with mode: 0644]
includes/filebackend/FileBackendGroup.php [new file with mode: 0644]
includes/filebackend/FileBackendMultiWrite.php [new file with mode: 0644]
includes/filebackend/FileBackendStore.php [new file with mode: 0644]
includes/filebackend/FileOp.php [new file with mode: 0644]
includes/filebackend/FileOpBatch.php [new file with mode: 0644]
includes/filebackend/SwiftFileBackend.php [new file with mode: 0644]
includes/filebackend/TempFSFile.php [new file with mode: 0644]
includes/filebackend/filejournal/DBFileJournal.php [new file with mode: 0644]
includes/filebackend/filejournal/FileJournal.php [new file with mode: 0644]
includes/filebackend/lockmanager/DBLockManager.php [new file with mode: 0644]
includes/filebackend/lockmanager/FSLockManager.php [new file with mode: 0644]
includes/filebackend/lockmanager/LSLockManager.php [new file with mode: 0644]
includes/filebackend/lockmanager/LockManager.php [new file with mode: 0644]
includes/filebackend/lockmanager/LockManagerGroup.php [new file with mode: 0644]
includes/filebackend/lockmanager/MemcLockManager.php [new file with mode: 0644]
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/backend/FSFile.php [deleted file]
includes/filerepo/backend/FSFileBackend.php [deleted file]
includes/filerepo/backend/FileBackend.php [deleted file]
includes/filerepo/backend/FileBackendGroup.php [deleted file]
includes/filerepo/backend/FileBackendMultiWrite.php [deleted file]
includes/filerepo/backend/FileBackendStore.php [deleted file]
includes/filerepo/backend/FileOp.php [deleted file]
includes/filerepo/backend/FileOpBatch.php [deleted file]
includes/filerepo/backend/SwiftFileBackend.php [deleted file]
includes/filerepo/backend/TempFSFile.php [deleted file]
includes/filerepo/backend/filejournal/DBFileJournal.php [deleted file]
includes/filerepo/backend/filejournal/FileJournal.php [deleted file]
includes/filerepo/backend/lockmanager/DBLockManager.php [deleted file]
includes/filerepo/backend/lockmanager/FSLockManager.php [deleted file]
includes/filerepo/backend/lockmanager/LSLockManager.php [deleted file]
includes/filerepo/backend/lockmanager/LockManager.php [deleted file]
includes/filerepo/backend/lockmanager/LockManagerGroup.php [deleted file]
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/installer/CliInstaller.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Ibm_db2Installer.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/job/DoubleRedirectJob.php
includes/job/Job.php [new file with mode: 0644]
includes/job/JobQueue.php [deleted file]
includes/job/RefreshLinksJob.php
includes/job/UploadFromUrlJob.php
includes/json/FormatJson.php
includes/libs/CSSJanus.php
includes/libs/CSSMin.php
includes/libs/GenericArrayObject.php [new file with mode: 0644]
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/PatrolLog.php
includes/media/Bitmap.php
includes/media/DjVu.php
includes/media/Exif.php
includes/media/ExifBitmap.php
includes/media/FormatMetadata.php
includes/media/GIF.php
includes/media/Generic.php [deleted file]
includes/media/ImageHandler.php [new file with mode: 0644]
includes/media/MediaHandler.php [new file with mode: 0644]
includes/media/MediaTransformOutput.php
includes/media/PNG.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/media/XMP.php
includes/mobile/DeviceDetection.php
includes/normal/UtfNormal.php
includes/objectcache/APCBagOStuff.php
includes/objectcache/BagOStuff.php
includes/objectcache/DBABagOStuff.php
includes/objectcache/EhcacheBagOStuff.php
includes/objectcache/EmptyBagOStuff.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MemcachedPhpBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/ObjectCacheSessionHandler.php [new file with mode: 0644]
includes/objectcache/RedisBagOStuff.php [new file with mode: 0644]
includes/objectcache/SqlBagOStuff.php
includes/objectcache/WinCacheBagOStuff.php
includes/objectcache/XCacheBagOStuff.php
includes/parser/CacheTime.php [new file with mode: 0644]
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/Preprocessor_HipHop.hphp
includes/parser/StripState.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/search/SearchOracle.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllmessages.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.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/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/SpecialImport.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialListusers.php
includes/specials/SpecialLog.php
includes/specials/SpecialLonelypages.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostimages.php
includes/specials/SpecialMostinterwikis.php [new file with mode: 0644]
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPopularpages.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialTags.php
includes/specials/SpecialUncategorizedimages.php
includes/specials/SpecialUncategorizedpages.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnusedimages.php
includes/specials/SpecialUnusedtemplates.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedcategories.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWantedtemplates.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWithoutinterwiki.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/tidy.conf
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromFile.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.php
includes/zhtable/simp2trad.manual
includes/zhtable/toCN.manual
includes/zhtable/trad2simp.manual
includes/zhtable/tradphrases.manual
index.php
languages/Language.php
languages/LanguageConverter.php
languages/Names.php
languages/classes/LanguageAm.php [deleted file]
languages/classes/LanguageAr.php
languages/classes/LanguageBe.php [deleted file]
languages/classes/LanguageBh.php [deleted file]
languages/classes/LanguageBs.php
languages/classes/LanguageCs.php [deleted file]
languages/classes/LanguageCu.php
languages/classes/LanguageCy.php [deleted file]
languages/classes/LanguageDsb.php
languages/classes/LanguageFr.php [deleted file]
languages/classes/LanguageGa.php
languages/classes/LanguageGan.php
languages/classes/LanguageGd.php [deleted file]
languages/classes/LanguageHe.php
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageKu.php
languages/classes/LanguageShi.php
languages/classes/LanguageSr.php
languages/classes/LanguageTg.php
languages/classes/LanguageUz.php [new file with mode: 0644]
languages/classes/LanguageZh.php
languages/data/plurals-mediawiki.xml [new file with mode: 0644]
languages/data/plurals.xml [new file with mode: 0644]
languages/messages/MessagesAb.php
languages/messages/MessagesAce.php
languages/messages/MessagesAeb.php
languages/messages/MessagesAf.php
languages/messages/MessagesAk.php
languages/messages/MessagesAln.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesAry.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAz.php
languages/messages/MessagesBa.php
languages/messages/MessagesBar.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBpy.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCu.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEgl.php [new file with mode: 0644]
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFit.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGag.php
languages/messages/MessagesGan.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGot.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesHak.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHil.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIe.php
languages/messages/MessagesIg.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJut.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKbd_cyrl.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cn.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_arab.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKw.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLn.php
languages/messages/MessagesLt.php
languages/messages/MessagesLtg.php
languages/messages/MessagesLus.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesLzz.php
languages/messages/MessagesMai.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMrj.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMwl.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNah.php
languages/messages/MessagesNan.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesNso.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPam.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPrg.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesRif.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSat.php
languages/messages/MessagesSc.php
languages/messages/MessagesScn.php
languages/messages/MessagesSco.php
languages/messages/MessagesSd.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSei.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesShi.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSli.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSrn.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTg_latn.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTly.php
languages/messages/MessagesTo.php
languages/messages/MessagesTpi.php
languages/messages/MessagesTr.php
languages/messages/MessagesTru.php [new file with mode: 0644]
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVo.php
languages/messages/MessagesVot.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesXal.php
languages/messages/MessagesXmf.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/messages/MessagesZh_tw.php
languages/utils/CLDRPluralRuleEvaluator.php [new file with mode: 0644]
load.php
maintenance/Doxyfile
maintenance/Maintenance.php
maintenance/archives/patch-filejournal.sql
maintenance/archives/upgradeLogging.php
maintenance/attachLatest.php
maintenance/backupTextPass.inc
maintenance/benchmarks/Benchmarker.php
maintenance/benchmarks/bench_HTTP_HTTPS.php
maintenance/benchmarks/bench_delete_truncate.php
maintenance/benchmarks/bench_if_switch.php
maintenance/benchmarks/bench_strtr_str_replace.php
maintenance/benchmarks/bench_utf8_title_check.php
maintenance/benchmarks/bench_wfIsWindows.php
maintenance/benchmarks/benchmarkHooks.php
maintenance/benchmarks/benchmarkPurge.php
maintenance/cdb.php
maintenance/changePassword.php
maintenance/checkAutoLoader.php
maintenance/checkBadRedirects.php
maintenance/checkImages.php
maintenance/checkSyntax.php
maintenance/checkUsernames.php
maintenance/cleanupAncientTables.php
maintenance/cleanupCaps.php
maintenance/cleanupImages.php
maintenance/cleanupPreferences.php [new file with mode: 0755]
maintenance/cleanupRemovedModules.php
maintenance/cleanupSpam.php
maintenance/cleanupTable.inc
maintenance/cleanupTitles.php
maintenance/cleanupUploadStash.php
maintenance/cleanupWatchlist.php
maintenance/clear_interwiki_cache.php
maintenance/clear_stats.php
maintenance/commandLine.inc
maintenance/compareParsers.php
maintenance/convertLinks.php
maintenance/convertUserOptions.php
maintenance/copyFileBackend.php
maintenance/createAndPromote.php
maintenance/deleteArchivedFiles.inc
maintenance/deleteArchivedFiles.php
maintenance/deleteArchivedRevisions.inc
maintenance/deleteArchivedRevisions.php
maintenance/deleteBatch.php
maintenance/deleteDefaultMessages.php
maintenance/deleteImageMemcached.php
maintenance/deleteOldRevisions.php
maintenance/deleteOrphanedRevisions.php
maintenance/deleteRevision.php
maintenance/deleteSelfExternals.php
maintenance/dev/includes/php.sh
maintenance/doMaintenance.php
maintenance/dumpBackup.php
maintenance/dumpIterator.php
maintenance/dumpLinks.php
maintenance/dumpSisterSites.php
maintenance/dumpTextPass.php
maintenance/dumpUploads.php
maintenance/edit.php
maintenance/eval.php
maintenance/fetchText.php
maintenance/fileOpPerfTest.php
maintenance/findHooks.php
maintenance/fixDoubleRedirects.php
maintenance/fixExtLinksProtocolRelative.php
maintenance/fixSlaveDesync.php
maintenance/fixTimestamps.php
maintenance/fixUserRegistration.php
maintenance/formatInstallDoc.php
maintenance/fuzz-tester.php
maintenance/generateSitemap.php
maintenance/getLagTimes.php
maintenance/getSlaveServer.php
maintenance/getText.php
maintenance/hiphop/make
maintenance/hiphop/run-server
maintenance/importDump.php
maintenance/importImages.inc
maintenance/importImages.php
maintenance/importSiteScripts.php
maintenance/importTextFile.php
maintenance/initEditCount.php
maintenance/initStats.php
maintenance/install.php
maintenance/jsparse.php
maintenance/lag.php
maintenance/language/alltrans.php
maintenance/language/checkDupeMessages.php
maintenance/language/checkExtensions.php
maintenance/language/checkLanguage.php
maintenance/language/countMessages.php
maintenance/language/date-formats.php
maintenance/language/digit2html.php
maintenance/language/dumpMessages.php
maintenance/language/generateCollationData.php
maintenance/language/generateNormalizerData.php
maintenance/language/langmemusage.php
maintenance/language/languages.inc
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/language/rebuildLanguage.php
maintenance/language/transstat.php
maintenance/language/validate.php
maintenance/language/writeMessagesArray.inc
maintenance/locking/LockServerDaemon.php
maintenance/mcc.php
maintenance/mctest.php
maintenance/mergeMessageFileList.php
maintenance/migrateUserGroup.php
maintenance/minify.php
maintenance/moveBatch.php
maintenance/mwdoc-filter.php [new file with mode: 0644]
maintenance/mwdocgen.php
maintenance/namespaceDupes.php
maintenance/nextJobDB.php
maintenance/nukeNS.php
maintenance/nukePage.php
maintenance/oracle/alterSharedConstraints.php
maintenance/oracle/archives/patch-ipblocks_i05_index.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-page_restrictions_pkuk_fix.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-revision_i05_index.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-ufg_group-length-increase.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-ug_group-length-increase.sql
maintenance/oracle/tables.sql
maintenance/orphans.php
maintenance/parse.php
maintenance/patchSql.php
maintenance/populateCategory.php
maintenance/populateImageSha1.php
maintenance/populateLogSearch.php
maintenance/populateLogUsertext.php
maintenance/populateParentId.php
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/preprocessDump.php
maintenance/preprocessorFuzzTest.php
maintenance/protect.php
maintenance/pruneFileCache.php
maintenance/purgeDeletedFiles.php
maintenance/purgeList.php
maintenance/purgeOldText.php
maintenance/purgeParserCache.php
maintenance/purgeStaleMemcachedText.php
maintenance/reassignEdits.php
maintenance/rebuildFileCache.php
maintenance/rebuildImages.php
maintenance/rebuildLocalisationCache.php
maintenance/rebuildall.php
maintenance/rebuildmessages.php
maintenance/rebuildrecentchanges.php
maintenance/rebuildtextindex.php
maintenance/refreshImageCount.php
maintenance/refreshImageMetadata.php
maintenance/refreshLinks.php
maintenance/removeUnusedAccounts.php
maintenance/renameDbPrefix.php
maintenance/renderDump.php
maintenance/resetUserTokens.php
maintenance/rollbackEdits.php
maintenance/runBatchedQuery.php
maintenance/runJobs.php
maintenance/showJobs.php
maintenance/showStats.php
maintenance/sql.php
maintenance/sqlite.php
maintenance/stats.php
maintenance/storage/checkStorage.php
maintenance/storage/compressOld.php
maintenance/storage/dumpRev.php
maintenance/storage/fixBug20757.php
maintenance/storage/moveToExternal.php
maintenance/storage/orphanStats.php
maintenance/storage/recompressTracked.php
maintenance/storage/resolveStubs.php
maintenance/storage/storageTypeStats.php
maintenance/storage/testCompression.php
maintenance/storage/trackBlobs.php
maintenance/syncFileBackend.php
maintenance/undelete.php
maintenance/update.php
maintenance/updateArticleCount.php
maintenance/updateCollation.php
maintenance/updateDoubleWidthSearch.php
maintenance/updateRestrictions.php
maintenance/updateSearchIndex.php
maintenance/updateSpecialPages.php
maintenance/upgrade1_5.php
maintenance/userOptions.inc
maintenance/waitForSlave.php
mw-config/index.php
opensearch_desc.php
profileinfo.php
redirect.php
resources/Resources.php
resources/jquery.effects/jquery.effects.blind.js
resources/jquery.effects/jquery.effects.bounce.js
resources/jquery.effects/jquery.effects.clip.js
resources/jquery.effects/jquery.effects.core.js
resources/jquery.effects/jquery.effects.drop.js
resources/jquery.effects/jquery.effects.explode.js
resources/jquery.effects/jquery.effects.fade.js
resources/jquery.effects/jquery.effects.fold.js
resources/jquery.effects/jquery.effects.highlight.js
resources/jquery.effects/jquery.effects.pulsate.js
resources/jquery.effects/jquery.effects.scale.js
resources/jquery.effects/jquery.effects.shake.js
resources/jquery.effects/jquery.effects.slide.js
resources/jquery.effects/jquery.effects.transfer.js
resources/jquery.tipsy/images/tipsy.png
resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js [deleted file]
resources/jquery.ui/jquery.ui.accordion.js
resources/jquery.ui/jquery.ui.autocomplete.js
resources/jquery.ui/jquery.ui.button.js
resources/jquery.ui/jquery.ui.core.js
resources/jquery.ui/jquery.ui.datepicker.js
resources/jquery.ui/jquery.ui.dialog.js
resources/jquery.ui/jquery.ui.draggable.js
resources/jquery.ui/jquery.ui.droppable.js
resources/jquery.ui/jquery.ui.mouse.js
resources/jquery.ui/jquery.ui.position.js
resources/jquery.ui/jquery.ui.progressbar.js
resources/jquery.ui/jquery.ui.resizable.js
resources/jquery.ui/jquery.ui.selectable.js
resources/jquery.ui/jquery.ui.slider.js
resources/jquery.ui/jquery.ui.sortable.js
resources/jquery.ui/jquery.ui.tabs.js
resources/jquery.ui/jquery.ui.widget.js
resources/jquery.ui/themes/default/jquery.ui.accordion.css
resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
resources/jquery.ui/themes/default/jquery.ui.button.css
resources/jquery.ui/themes/default/jquery.ui.core.css
resources/jquery.ui/themes/default/jquery.ui.datepicker.css
resources/jquery.ui/themes/default/jquery.ui.dialog.css
resources/jquery.ui/themes/default/jquery.ui.progressbar.css
resources/jquery.ui/themes/default/jquery.ui.resizable.css
resources/jquery.ui/themes/default/jquery.ui.selectable.css
resources/jquery.ui/themes/default/jquery.ui.slider.css
resources/jquery.ui/themes/default/jquery.ui.tabs.css
resources/jquery.ui/themes/default/jquery.ui.theme.css
resources/jquery.ui/themes/vector/images/button-disabled-blue.png
resources/jquery.ui/themes/vector/images/button-disabled-green.png
resources/jquery.ui/themes/vector/images/button-disabled-red.png
resources/jquery.ui/themes/vector/images/button-disabled.png
resources/jquery.ui/themes/vector/images/button-down-blue.png
resources/jquery.ui/themes/vector/images/button-down-green.png
resources/jquery.ui/themes/vector/images/button-down-red.png
resources/jquery.ui/themes/vector/images/button-down.png
resources/jquery.ui/themes/vector/images/button-off-green.png
resources/jquery.ui/themes/vector/images/button-off.png
resources/jquery.ui/themes/vector/images/button-over-green.png
resources/jquery.ui/themes/vector/images/button-over-red.png
resources/jquery.ui/themes/vector/images/button-over.png
resources/jquery.ui/themes/vector/images/close.png
resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png
resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png
resources/jquery.ui/themes/vector/jquery.ui.button.css
resources/jquery/images/jquery.arrowSteps.divider-ltr.png
resources/jquery/images/jquery.arrowSteps.divider-rtl.png
resources/jquery/jquery.arrowSteps.css
resources/jquery/jquery.arrowSteps.js
resources/jquery/jquery.autoEllipsis.js
resources/jquery/jquery.badge.css [new file with mode: 0644]
resources/jquery/jquery.badge.js [new file with mode: 0644]
resources/jquery/jquery.byteLength.js
resources/jquery/jquery.byteLimit.js
resources/jquery/jquery.checkboxShiftClick.js
resources/jquery/jquery.client.js
resources/jquery/jquery.collapsibleTabs.js
resources/jquery/jquery.color.js
resources/jquery/jquery.colorUtil.js
resources/jquery/jquery.cookie.js
resources/jquery/jquery.delayedBind.js
resources/jquery/jquery.expandableField.js
resources/jquery/jquery.form.js
resources/jquery/jquery.getAttrs.js
resources/jquery/jquery.highlightText.js
resources/jquery/jquery.jStorage.js [new file with mode: 0644]
resources/jquery/jquery.js
resources/jquery/jquery.localize.js
resources/jquery/jquery.makeCollapsible.js
resources/jquery/jquery.messageBox.js
resources/jquery/jquery.mwExtension.js
resources/jquery/jquery.placeholder.js
resources/jquery/jquery.qunit.completenessTest.js
resources/jquery/jquery.qunit.css
resources/jquery/jquery.qunit.js
resources/jquery/jquery.spinner.js
resources/jquery/jquery.suggestions.js
resources/jquery/jquery.tabIndex.js
resources/jquery/jquery.tablesorter.js
resources/jquery/jquery.textSelection.js
resources/mediawiki.action/mediawiki.action.edit.js
resources/mediawiki.action/mediawiki.action.history.js
resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js
resources/mediawiki.action/mediawiki.action.view.metadata.js
resources/mediawiki.action/mediawiki.action.watch.ajax.js [deleted file]
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.api/mediawiki.api.parse.js
resources/mediawiki.language/languages/ar.js [deleted file]
resources/mediawiki.language/languages/he.js
resources/mediawiki.language/languages/hi.js [deleted file]
resources/mediawiki.language/mediawiki.cldr.js [new file with mode: 0644]
resources/mediawiki.language/mediawiki.language.init.js
resources/mediawiki.language/mediawiki.language.js
resources/mediawiki.libs/CLDRPluralRuleParser.js [new file with mode: 0644]
resources/mediawiki.page/mediawiki.page.startup.js
resources/mediawiki.page/mediawiki.page.watch.ajax.js [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.changeemail.js
resources/mediawiki.special/mediawiki.special.changeslist.css
resources/mediawiki.special/mediawiki.special.javaScriptTest.js
resources/mediawiki.special/mediawiki.special.preferences.js
resources/mediawiki.special/mediawiki.special.recentchanges.js
resources/mediawiki.special/mediawiki.special.upload.js
resources/mediawiki/mediawiki.Title.js
resources/mediawiki/mediawiki.Uri.js
resources/mediawiki/mediawiki.debug.js
resources/mediawiki/mediawiki.feedback.js
resources/mediawiki/mediawiki.htmlform.js
resources/mediawiki/mediawiki.jqueryMsg.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.log.js
resources/mediawiki/mediawiki.user.js
resources/mediawiki/mediawiki.util.js
serialized/serialize.php
skins/CologneBlue.php
skins/Modern.php
skins/MonoBook.php
skins/Nostalgia.php
skins/Simple.php
skins/Standard.php
skins/Vector.php
skins/common/images/Arr_.png
skins/common/images/add.png
skins/common/images/ajax-loader.gif
skins/common/images/ar/button_bold.png
skins/common/images/ar/button_link.png
skins/common/images/ar/button_nowiki.png
skins/common/images/be-tarask/button_bold.png
skins/common/images/button_hr.png
skins/common/images/button_sig.png
skins/common/images/button_template.png
skins/common/images/closewindow.png
skins/common/images/closewindow19x19.png
skins/common/images/cyrl/button_italic.png
skins/common/images/fa/button_italic.png
skins/common/images/fa/button_nowiki.png
skins/common/images/nextredirectltr.png
skins/common/images/nextredirectrtl.png
skins/common/images/spinner.gif
skins/common/images/tooltip_icon.png
skins/common/preview.js
skins/common/shared.css
skins/common/upload.js
skins/common/wikibits.js
skins/modern/document.png
skins/modern/footer-grad.png
skins/modern/news_icon.png
skins/modern/video.png
skins/monobook/document.png
skins/monobook/main.css
skins/monobook/news_icon.png
skins/monobook/video.png
skins/vector/images/arrow-down-focus-icon.png
skins/vector/images/arrow-down-icon.png
skins/vector/images/audio-icon.png
skins/vector/images/border.png
skins/vector/images/bullet-icon.png
skins/vector/images/link-icon.png
skins/vector/images/lock-icon.png
skins/vector/images/mail-icon.png
skins/vector/images/page-base.png
skins/vector/images/page-fade.png
skins/vector/images/portal-break.png
skins/vector/images/preferences-base.png
skins/vector/images/preferences-break.png
skins/vector/images/preferences-edge.png
skins/vector/images/preferences-fade.png
skins/vector/images/search-fade.png
skins/vector/images/tab-current-fade.png
skins/vector/images/user-icon.png
skins/vector/images/video-icon.png
skins/vector/screen.css
skins/vector/vector.js
tests/RunSeleniumTests.php
tests/TestsAutoLoader.php
tests/jasmine/spec_makers/makeJqueryMsgSpec.php
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/data/media/exif-gps.jpg
tests/phpunit/data/xmp/gps.result.php [new file with mode: 0644]
tests/phpunit/data/xmp/gps.xmp [new file with mode: 0644]
tests/phpunit/docs/ExportDemoTest.php [new file with mode: 0644]
tests/phpunit/includes/ArticleTablesTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/LocalisationCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MockOutputPage.php [deleted file]
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/TemplateCategoriesTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/ZipDirectoryReaderTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiEditPageTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/api/RandomImageGenerator.php
tests/phpunit/includes/api/generateRandomImages.php
tests/phpunit/includes/cache/ProcessCacheLRUTest.php [new file with mode: 0644]
tests/phpunit/includes/db/DatabaseSQLTest.php [new file with mode: 0644]
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/db/TestORMRowTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/filerepo/FileBackendTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/libs/CSSJanusTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/GenericArrayObjectTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/ExifRotationTest.php
tests/phpunit/includes/media/ExifTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/GIFMetadataExtractorTest.php
tests/phpunit/includes/media/GIFTest.php
tests/phpunit/includes/media/JpegMetadataExtractorTest.php
tests/phpunit/includes/media/JpegTest.php
tests/phpunit/includes/media/PNGMetadataExtractorTest.php
tests/phpunit/includes/media/PNGTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/media/TiffTest.php
tests/phpunit/includes/media/XMPTest.php
tests/phpunit/includes/parser/MediaWikiParserTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php [new file with mode: 0644]
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/upload/UploadTest.php
tests/phpunit/languages/LanguageHeTest.php
tests/phpunit/languages/LanguageSrTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/LanguageUzTest.php [new file with mode: 0644]
tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php [new file with mode: 0644]
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/backupPrefetchTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/maintenance/getSlaveServerTest.php
tests/phpunit/phpunit.php
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/load.mock.php [new file with mode: 0644]
tests/qunit/data/qunitOkCall.js
tests/qunit/data/testloader.php [deleted file]
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
tests/qunit/suites/resources/jquery/jquery.client.test.js
tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js
tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
tests/qunit/suites/resources/jquery/jquery.highlightText.test.js
tests/qunit/suites/resources/jquery/jquery.localize.test.js
tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js
tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
tests/selenium/installer/MediaWikiInstallationCommonFunction.php
tests/selenium/installer/MediaWikiInstallerTestSuite.php
tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
tests/selenium/suites/MediawikiCoreSmokeTestCase.php
tests/selenium/suites/MyContributionsTestCase.php
tests/selenium/suites/MyWatchListTestCase.php
thumb.php
thumb_handler.php

index fb2b81b..ff3ced3 100644 (file)
@@ -1,30 +1,43 @@
+# Repository management
 .svn
-*~
+
+# Editors
 *.kate-swp
+*~
 .*.swp
-.classpath
-.idea
-.metadata*
 .project
-.settings
-AdminSettings.php
-LocalSettings.php
-StartProfiler.php
 cscope.files
 cscope.out
-favicon.ico
+## NetBeans
 nbproject*
 project.index
-static*
-tags
-cache/*.cdb
+
+# MediaWiki install & usage
+cache
 images/[0-9a-f]
 images/archive
 images/deleted
 images/temp
 images/thumb
+## Extension:EasyTimeline
 images/timeline
 images/tmp
-maintenance/dev/data
 maintenance/.mweval_history
 maintenance/.mwsql_history
+maintenance/dev/data
+AdminSettings.php
+LocalSettings.php
+StartProfiler.php
+
+# Operating systems
+## Mac OS X
+.DS_Store
+
+# Misc
+.classpath
+.idea
+.metadata*
+.settings
+favicon.ico
+static*
+tags
diff --git a/.jshintignore b/.jshintignore
new file mode 100644 (file)
index 0000000..45f2da7
--- /dev/null
@@ -0,0 +1,21 @@
+# upstream libs
+resources/jquery/jquery.appear.js
+resources/jquery/jquery.async.js
+resources/jquery/jquery.cycle.all.js
+resources/jquery/jquery.cookie.js
+resources/jquery/jquery.farbtastic.js
+resources/jquery/jquery.form.js
+resources/jquery/jquery.hoverIntent.js
+resources/jquery/jquery.js
+resources/jquery/jquery.json.js
+resources/jquery/jquery.jStorage.js
+resources/jquery/jquery.mockjax.js
+resources/jquery/jquery.qunit.js
+resources/jquery/jquery.validate.js
+resources/jquery/jquery.xmldom.js
+resources/jquery.effects
+resources/jquery.tipsy
+resources/jquery.ui
+resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
+tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
+tests/jasmine/lib/jasmine-1.0.1/jasmine.js
diff --git a/.jshintrc b/.jshintrc
new file mode 100644 (file)
index 0000000..4cf86b8
--- /dev/null
+++ b/.jshintrc
@@ -0,0 +1,30 @@
+{
+       "predef": [
+               "mediaWiki",
+               "QUnit"
+       ],
+
+       "bitwise": true,
+       "curly": true,
+       "eqeqeq": true,
+       "immed": true,
+       "latedef": true,
+       "newcap": true,
+       "noarg": true,
+       "noempty": true,
+       "nonew": true,
+       "regexp": false,
+       "undef": true,
+       "strict": false,
+       "trailing": true,
+
+       "laxbreak": true,
+       "smarttabs": true,
+       "multistr": true,
+
+       "browser": true,
+       "jquery": true,
+
+       "nomen": true,
+       "onevar": false
+}
diff --git a/CREDITS b/CREDITS
index fd86da8..5ceccc5 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -118,13 +118,14 @@ following names for their contribution to the product.
 * Grunny
 * Harry Burt
 * Ireas
+* Jacob Block
 * Jaska Zedlik
 * Jeremy Baron
 * Jidanni
 * Jimmy Xu
 * Jonathan Wiltshire
 * John N
-* Karun Dambietz
+* Karun Dambiec
 * Kim Hyun-Joon
 * Krenair
 * Lee Worden
diff --git a/README b/README
index 48cf336..805b8ee 100644 (file)
--- a/README
+++ b/README
@@ -46,8 +46,7 @@ The MediaWiki software was written by:
 * Victor Vasiliev
 * Rotem Liss
 * Platonides
-* Antoine Musso
-* Several others (view CREDITS for a more complete list)
+* Many others (view CREDITS for a more complete list)
 
 The contributors hold the copyright to this work, and it is licensed under the
 terms of the GNU General Public License, version 2 or later (see
index addf484..eaf8b7c 100644 (file)
@@ -20,11 +20,23 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * `$wgUsePathInfo = true;` is no longer needed to make $wgArticlePath work on servers
   using like nginx, lighttpd, and apache over fastcgi. MediaWiki now always extracts
   path info from REQUEST_URI if it's available.
+* The user right 'upload_by_url' is no longer given to sysops by default.
+  This only affects installations which have $wgAllowCopyUploads set to true.
+* Removed f-prot support from $wgAntivirusSetup.
+* New variable $wgDBerrorLogTZ to provide dates in the error log in a
+  different timezone than the wiki timezone set by $wgLocalTimezone.
+* New variables $wgDBssl and $wgDBcompress to enable SSL and compression for database
+  connections, if either are available for the selected DB type.
 
 === New features in 1.20 ===
 * Added TitleIsAlwaysKnown hook which gets called when determining if a page exists.
 * Added NamespaceIsMovable hook which gets called when determining if pages in a
   certain namespace can be moved.
+* Added SpecialPageBeforeExecute hook which gets called before SpecialPage::execute.
+* Added SpecialPageAfterExecute hook which gets called after SpecialPage::execute.
+* Added ORMTable, ORMRow and ORMResult classes for additional abstraction of
+  database interaction.
+* Added CacheHelper and associated SpecialCachedPage and CachedAction helper classes.
 * (bug 32341) Add upload by URL domain limitation.
 * &useskin=default will now always display the default skin. Useful for users with a
   preference for the non-default skin to look at something using the default skin.
@@ -53,8 +65,10 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 35685) api.php URL and other entry point URLs are now listed on
   Special:Version
 * Edit notices can now be translated.
-* (bug 35680) jQuery upgraded to 1.7.2.
-* jQuery UI upgraded to 1.8.21.
+* jQuery upgraded to 1.8.
+* jQuery UI upgraded to 1.8.22.
+* (bug 35705) QUnit upgraded from v1.2.0 to v1.8.0.
+* (bug 37604) jquery.cookie upgraded to 2011 version.
 * (bug 22887) Add warning and tracking category for preprocessor errors
 * (bug 31704) Allow selection of associated namespace on the watchlist
 * (bug 5445) Now remove autoblocks when a user is unblocked.
@@ -67,10 +81,60 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * New getCreator and getOldestRevision methods added to WikiPage class
 * (bug 4220) the XML dump format schema now have unique identity constraints
   for page and revision identifiers. Patch by Elvis Stansvik.
-* (bug 35705) QUnit upgraded from v1.2.0 to v1.8.0.
 * cleanupSpam.php now can delete spam pages if --delete was specified instead of blanking
   them.
 * Added new hook ChangePasswordForm to allow adding of additional fields in Special:ChangePassword
+* Added new function getDomain to AuthPlugin for getting a user's domain
+* (bug 23427) New magic word {{PAGEID}} which gives the current page ID.
+  Will be null on previewing a page being created.
+* (bug 37627) UserNotLoggedIn() exception to show a generic error page whenever
+  a user is not logged in.
+* Watched status in changes lists are no longer indicated by <strong></strong>
+  tags with class "mw-watched". Instead, each line now has a class
+  "mw-changeslist-line-watched" or "mw-changeslist-line-not-watched", and the
+  title itself is surrounded by <span></span> tags with class "mw-title".
+* Added ContribsPager::reallyDoQuery hook allowing extensions to data to MyContribs
+* Added new hook ParserAfterParse to allow extensions to affect parsed output
+  after the parse is complete but before block level processing, link holder
+  replacement, and so on.
+* (bug 34678) Added InternalParseBeforeSanitize hook which gets called during Parser's
+  internalParse method just before the parser removes unwanted/dangerous HTML tags.
+* (bug 36783) Implement jQuery Promise interface in mediawiki.api module.
+* Make dates in sortable tables sort according to the page content language
+  instead of the site content language
+* (bug 37926) Deleterevision will no longer allow users to delete log entries,
+  the new deletelogentry permission is required for this.
+* (bug 14237) Allow PAGESINCATEGORY to distinguish between 'all', 'pages', 'files'
+  and 'subcats'
+* (bug 38362) Make Special:Listuser includeable on wiki pages.
+* Added support in jquery.localize for placeholder attributes.
+* (bug 38151) Implemented mw.user.getRights for getting and caching the current
+  user's user rights.
+* Session storage can now configured independently of general object cache
+  storage, by using $wgSessionCacheType. $wgSessionsInMemcached has been
+  renamed to $wgSessionsInObjectCache, with the old name retained for backwards
+  compatibility. When this feature is enabled, the expiry time can now be
+  configured with $wgObjectCacheSessionExpiry.
+* Added a Redis client for object caching.
+* Implemented mw.user.getGroups for getting and caching user groups.
+* (bug 37830) Added $wgRequirePasswordforEmailChange to control whether password
+  confirmation is required for changing an email address or not.
+* HTMLForm mutators can now be chained (they return $this)
+* A new message, "api-error-filetype-banned-type", is available for formatting
+  API upload errors due to the file extension blacklist.
+* jsMessage: Redesigned in Vector/Monobook as floating bubble with auto-hide.
+* New hook 'ParserTestGlobals' allows to set globals before running parser tests.
+* Allow importing pages as subpage.
+* Add lang and hreflang attributes to language links on Login page.
+* (bug 22749) Create Special:MostInterwikis.
+* Show change tags when transclude Special:Recentchanges(linked) or Special:Newpages.
+* (bug 23226) Add |class= parameter to image links in order to add class(es) to HTML img tag.
+* (bug 39431) SVG animated status is now shown in long description
+* (bug 39376) jquery.form upgraded to 3.14
+* SVG files will now show the actual width in the SVG's specified units
+  in the metadata box.
+* Added ResourceLoader module "jquery.jStorage".
+* (bug 39273) Added AJAX support for "Show changes" (diff) in LivePreview.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
@@ -113,33 +177,95 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 35572) Blocks appear to succeed even if query fails due to wrong DB structure
 * (bug 31757) Add a word-separator between help-messages in HTMLForm
 * (bug 30410) Removed deprecated $wgFilterCallback and the 'filtered' API error.
-* (bug 32604) Some messages needs escaping of wikitext inside username
+* (bug 32604) Some messages needs escaping of wikitext inside username.
 * (bug 36537) Rename wfArrayToCGI to wfArrayToCgi for consistency with wfCgiToArray.
-* (bug 25946) The message on the top of Special:RecentChanges is now displayed
-  in user language instead of content language
+* (bug 25946) The message on the top of Special:RecentChanges is now displayed.
+  in user language instead of content language.
 * (bug 35264) Wrong type used for <ns> in export.xsd
 * (bug 24985) Use $wgTmpDirectory as the default temp directory so that people
   who don't have access to /tmp can specify an alternative.
-* (bug 27283) SqlBagOStuff breaks PostgreSQL transactions
+* (bug 27283) SqlBagOStuff breaks PostgreSQL transactions.
 * (bug 35727) mw.Api ajax() should put token parameter last.
+* (bug 37708) mw.Uri.clone() should make a deep copy.
+* (bug 38024) ResourceLoader should not create empty stylesheets for modules
+  that don't have stylesheets.
+* (bug 36812) Special:ActiveUsers "Hide bots" should hide users from any group
+  having the "bot" user right, instead of just the default "bot" user group.
+* (bug 35082) mw.util.addPortletLink incorrectly adds link to mutiple <ul> tags.
+* (bug 36495) Sanitizer::fixDeprecatedAttributes should convert "align"
+  attribute to margin or float instead of text-align (for non-table-cells).
+* (bug 36991) jquery.tablesorter should extract date sort format from date
+  string instead of global config. Dates like "April 1 2012" and "1 April 2012"
+  now sort correctly regardless of the content language's DefaultDateFormat.
+* (bug 31895) mw.loader mode now correct when triggered from a $.fn.ready
+  handler that is bound before mediawiki.js's handler (e.g. browser-userscripts
+  like greasemonkey).
+* (bug 38152) jquery.tablesorter: Use .data() instead of .attr(), so that live
+  values are used instead of just the fixed values from when the tablesorter
+  was initialized.
+* (bug 38093) Gender of changed user groups missing in Special:Log/rights
+* (bug 35893) Special:Block needs to load mediawiki.special.block.js.
+* (bug 37331) ResourceLoader modules sometimes execute twice in Firefox
+* (bug 31644) GlobalUsage, CentralAuth and AbuseLog extensions should not use
+  insecure links to foreign wikis in the WikiMap.
+* (bug 36073) Avoid duplicate element IDs on File pages.
+* (bug 25095) Special:Categories should also include the first relevant item
+  when "from" is filled.
+* (bug 35526) jquery.tablesorter now uses a stable sort.
+* (bug 38953) --memory-limit switch not working for runJobs.php.
+* (bug 33037) Make subpage of Special:newfiles control how many files
+  are returned, like in previous versions.
+* (bug 36524) "Show" options on Special:RecentChanges and Special:RecentChangesLinked
+  are now remembered between successive clicks.
+* (bug 26069) Page title is no longer "Error" for all error pages.
+* (bug 39297) Show warning if thumbnail of animated image will not be animated.
+* (bug 38249) Parser will throw an exception instead of outputting gibberish if
+  PCRE is compiled without support for unicode properties.
+* (bug 30390) Suggested file name on Special:Upload should not contain
+  illegal characters.
+* (bug 27111) Cascading foreign file repos now fetch shared descriptions properly.
+* EXIF below sea level GPS altitude data is now shown correctly.
+* (bug 39284) jquery.tablesorter should not consider "."" or "?"" to be a currency.
+* (bug 39273) "Show changes" should not be incorrectly displayed in the Live Preview state.
 
 === API changes in 1.20 ===
 * (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
 * (bug 34313) MediaWiki API intro message about "HTML format" should mention
   the format parameter.
 * (bug 32384) Allow descending order for list=watchlistraw.
-* (bug 31883) Limit of bkusers of list=blocks and titles of action=query is not documented in API help.
-* (bug 32492) API now allows editing using pageid
-* (bug 32497) API now allows changing of protection level using pageid
-* (bug 32498) API now allows comparing pages using pageids
-* (bug 30975) API import of pages with invalid characters in this wiki leads to Fatal Error
-* (bug 30488) API now allows listing of backlinks/embeddedin/imageusage per pageid
-* (bug 34927) Output media_type for list=filearchive
-* (bug 28814) add properties to output of action=parse
-* (bug 33224) add variants of content language to meta=siteinfo
-* (bug 36761) "Mark pages as visited" now submits previously established filter options
-* (bug 32643) action=purge with forcelinkupdate no longer crashes when ratelimit is reached
-* The paraminfo module now also contains result properties for most modules
+* (bug 31883) Limit of bkusers of list=blocks and titles of action=query is
+  not documented in API help.
+* (bug 32492) API now allows editing using pageid.
+* (bug 32497) API now allows changing of protection level using pageid.
+* (bug 32498) API now allows comparing pages using pageids.
+* (bug 30975) API import of pages with invalid characters in this wiki leads to Fatal Error.
+* (bug 30488) API now allows listing of backlinks/embeddedin/imageusage per pageid.
+* (bug 34927) Output media_type for list=filearchive.
+* (bug 28814) add properties to output of action=parse.
+* (bug 33224) add variants of content language to meta=siteinfo.
+* (bug 36761) "Mark pages as visited" now submits previously established filter options.
+* (bug 32643) action=purge with forcelinkupdate no longer crashes when ratelimit is reached.
+* The paraminfo module now also contains result properties for most modules.
+* (bug 32348) Allow descending order for list=alllinks.
+* (bug 31777) Upload unknown error ``fileexists-forbidden''.
+* (bug 32382) Allow descending order for list=iwbacklinks.
+* (bug 32381) Allow descending order for list=backlinks, list=embeddedin and list=imageusage.
+* (bug 32383) Allow descending order for list=langbacklinks.
+* API meta=siteinfo can now return the list of known variable IDs.
+* (bug 35980) list=deletedrevs now honors drdir correctly in "all" mode (mode #3).
+* (bug 29290) API avoids mangling fields in continuation parameters
+* (bug 36987) API avoids mangling fields in continuation parameters
+* (bug 30836) siteinfo prop=specialpagealiases will no longer return nonexistent special pages
+* (bug 38190) Add "required" flag to some token params for hint in api docs.
+* (bug 27567) Add file repo support to prop=duplicatefiles.
+* (bug 27610) Add archivename for non-latest image version to list=filearchive
+* (bug 38231) Add xml parse tree to action=parse.
+* Watchlist notification timestamp may be queried by page and may be updated via the API.
+* (bug 38904) prop=revisions&rvstart=... no longer blows up when continuing.
+* (bug 39032) ApiQuery generates help in constructor.
+* (bug 11142) Improve file extension blacklist error reporting in API upload.
+* (bug 39635) PostgreSQL LOCK IN SHARE MODE option is a syntax error.
+* (bug 36329) Accesskey tooltips for Firefox 14 on Mac should use "ctrl-option-" prefix.
 
 === Languages updated in 1.20 ===
 
@@ -147,6 +273,7 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Bugzilla reports.
 
+* Emilian (egl) added.
 * Tornedalen Finnish (fit) added.
 * Mizo (lus) added.
 * Santali (sat) added.
@@ -154,6 +281,8 @@ changes to languages because of Bugzilla reports.
 * (bug 35541) Namespace gender aliases for Croatian (hr).
 * (bug 36012) Space in $separatorTransformTable should be non-breaking in
   Portuguese, Esperanto and Udmurt.
+* Turoyo (tru) added.
+* Cyrillic-Latin language converter added for Uzbek (uz).
 
 === Other changes in 1.20 ===
 * The user_token field is now left empty until a user attempts to login and
@@ -166,6 +295,11 @@ changes to languages because of Bugzilla reports.
   and only applies to MyISAM or similar DBs. Those should only be used
   for archived sites anyway. We can't get edit conflicts on such sites,
   so the WikiPage code wasn't useful there either.
+* Deprecated mw.user.name in favour of mw.user.getName.
+* Deprecated mw.user.anonymous in favour of mw.user.isAnon.
+* Deprecated DatabaseBase functions newFromParams(), newFromType(), set(),
+  quote_ident(), and escapeLike() were removed.
+* Use of __DIR__ instead of dirname( __FILE__ ).
 
 == Compatibility ==
 
diff --git a/UPGRADE b/UPGRADE
index 9e7d035..cdaf4f9 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -76,7 +76,7 @@ behaviour of MediaWiki.
 
 Extensions usually need to be upgraded at the same time as the MediaWiki core.
 
-In MediaWiki 1.14 some extensions are migrated into the core. Please see the
+In MediaWiki 1.14 some extensions were migrated into the core. Please see the
 HISTORY section "Migrated extensions" and disable these extensions in your
 LocalSettings.php
 
diff --git a/api.php b/api.php
index 1cd5497..7fae373 100644 (file)
--- a/api.php
+++ b/api.php
@@ -35,6 +35,7 @@ define( 'MW_API', true );
 
 // Bail if PHP is too low
 if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
+       // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
        require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
        wfPHPVersionError( 'api.php' );
 }
@@ -43,7 +44,7 @@ if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require ( 'core/includes/WebStart.php' );
 } else {
-       require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
+       require ( __DIR__ . '/includes/WebStart.php' );
 }
 
 wfProfileIn( 'api.php' );
@@ -62,43 +63,6 @@ if ( !$wgEnableAPI ) {
        die(1);
 }
 
-// Selectively allow cross-site AJAX
-
-/**
- * Helper function to convert wildcard string into a regex
- * '*' => '.*?'
- * '?' => '.'
- *
- * @param $search string
- * @return string
- */
-function convertWildcard( $search ) {
-       $search = preg_quote( $search, '/' );
-       $search = str_replace(
-               array( '\*', '\?' ),
-               array( '.*?', '.' ),
-               $search
-       );
-       return "/$search/";
-}
-
-if ( $wgCrossSiteAJAXdomains && isset( $_SERVER['HTTP_ORIGIN'] ) ) {
-       $exceptions = array_map( 'convertWildcard', $wgCrossSiteAJAXdomainExceptions );
-       $regexes = array_map( 'convertWildcard', $wgCrossSiteAJAXdomains );
-       foreach ( $regexes as $regex ) {
-               if ( preg_match( $regex, $_SERVER['HTTP_ORIGIN'] ) ) {
-                       foreach ( $exceptions as $exc ) { // Check against exceptions
-                               if ( preg_match( $exc, $_SERVER['HTTP_ORIGIN'] ) ) {
-                                       break 2;
-                               }
-                       }
-                       header( "Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}" );
-                       header( 'Access-Control-Allow-Credentials: true' );
-                       break;
-               }
-       }
-}
-
 // Set a dummy $wgTitle, because $wgTitle == null breaks various things
 // In a perfect world this wouldn't be necessary
 $wgTitle = Title::makeTitle( NS_MAIN, 'API' );
@@ -107,7 +71,7 @@ $wgTitle = Title::makeTitle( NS_MAIN, 'API' );
  * is some form of an ApiMain, possibly even one that produces an error message,
  * but we don't care here, as that is handled by the ctor.
  */
-$processor = new ApiMain( $wgRequest, $wgEnableWriteAPI );
+$processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
 
 // Process data & print results
 $processor->execute();
index 6d02328..4803746 100644 (file)
@@ -23,6 +23,7 @@
        Fix type for <ns> from "positiveInteger" to "nonNegativeInteger" to allow 0
        Moves <logitem> to its right location.
        Add parentid to revision.
+       Fix type for <id> within <contributor> to "nonNegativeInteger"
 
        The canonical URL to the schema document is:
        http://www.mediawiki.org/xml/export-0.7.xsd
        <complexType name="ContributorType">
                <sequence>
                        <element name="username" type="string" minOccurs="0" />
-                       <element name="id" type="positiveInteger" minOccurs="0" />
+                       <element name="id" type="nonNegativeInteger" minOccurs="0" />
 
                        <element name="ip" type="string" minOccurs="0" />
                </sequence>
index 147e524..7844aaf 100644 (file)
@@ -245,6 +245,10 @@ $block: The block from which the autoblock is coming.
 'AbortDiffCache': Can be used to cancel the caching of a diff
 &$diffEngine: DifferenceEngine object
 
+'AbortEmailNotification': Can be used to cancel email notifications for an edit.
+$editor: The User who made the change.
+$title: The Title of the page that was edited.
+
 'AbortLogin': Return false to cancel account login.
 $user: the User object being authenticated against
 $password: the password being submitted, not yet checked for validity
@@ -262,7 +266,7 @@ $reason: the reason for the move (added in 1.13)
 
 'AbortNewAccount': Return false to cancel explicit account creation.
 $user: the User object about to be created (read-only, incomplete)
-&$msg: out parameter: name of error message to display on abort
+&$msg: out parameter: HTML to display on abort
 
 'ActionBeforeFormDisplay': before executing the HTMLForm object
 $name: name of the action
@@ -393,6 +397,11 @@ is the User object. In the hook, just add your callback to the
 $tokenFunctions array and return true (returning false makes no sense)
 $tokenFunctions: array(action => callback)
 
+'ApiMain::onException': Called by ApiMain::executeActionWithErrorHandling()
+when an exception is thrown during API action execution.
+$apiMain: Calling ApiMain instance.
+$e: Exception object.
+
 'ApiRsdServiceApis': Add or remove APIs from the RSD services list.
 Each service should have its own entry in the $apis array and have a
 unique name, passed as key for the array that represents the service data.
@@ -427,6 +436,8 @@ $user: the user (object) deleting the article
 $reason: the reason (string) the article is being deleted
 $error: if the deletion was prohibited, the (raw HTML) error message to display
   (added in 1.13)
+$status: Status object, modify this to throw an error. Overridden by $error
+  (added in 1.20)
 
 'ArticleDeleteComplete': after an article is deleted
 $article: the WikiPage that was deleted
@@ -701,10 +712,18 @@ $user: user (object) whose email is being confirmed
 &$pager: Pager object for contributions
 &$queryInfo: The query for the contribs Pager
 
+'ContribsPager::reallyDoQuery': Called before really executing the query for My Contributions
+&$data: an array of results of all contribs queries
+$pager: The ContribsPager object hooked into
+$offset: Index offset, inclusive
+$limit: Exact query limit
+$descending: Query direction, false for ascending, true for descending
+
 'ContributionsLineEnding': Called before a contributions HTML line is finished
 $page: SpecialPage object for contributions
-$ret: the HTML line
+&$ret: the HTML line
 $row: the DB row for this line
+&$classes: the classes to add to the surrounding <li>
 
 'ContributionsToolLinks': Change tool links above Special:Contributions
 $id: User identifier
@@ -749,11 +768,11 @@ $title: Title object for the title being linked to (may not be the same as
   $wgTitle, if the section is included from a template)
 $section: The designation of the section being pointed to, to be included in
   the link, like "&section=$section"
-$tooltip: The default tooltip.  Escape with htmlspecialchars() before using.
+$tooltip: The default tooltip.  Escape before using.
   By default, this is wrapped in the 'editsectionhint' message.
 &$result: The HTML to return, prefilled with the default plus whatever other
   changes earlier hooks have made
-$lang: The language code to use for the link in the wfMsg* functions
+$lang: The language code to use for the link in the wfMessage function
 
 'EditFilter': Perform checks on an edit
 $editor: Edit form (see includes/EditPage.php)
@@ -854,7 +873,7 @@ $title: Title being linked to
 $section: Section to link to
 $link: Default link
 &$result: Result (alter this to override the generated links)
-$lang: The language code to use for the link in the wfMsg* functions
+$lang: The language code to use for the link in the wfMessage function
 
 'EmailConfirmed': When checking that the user's email address is "confirmed"
 $user: User being checked
@@ -1037,9 +1056,9 @@ $result: User permissions error to add. If none, return true.
 &$title: Title object of the image
 &$file: File object, or false if it doesn't exist
 &$frameParams: Various parameters with special meanings; see documentation in
-       includes/Linker.php for Linker::makeImageLink2
+       includes/Linker.php for Linker::makeImageLink
 &$handlerParams: Various parameters with special meanings; see documentation in
-       includes/Linker.php for Linker::makeImageLink2
+       includes/Linker.php for Linker::makeImageLink
 &$time: Timestamp of file in 'YYYYMMDDHHIISS' string form, or false for current
 &$res: Final HTML output, used if you return false
 
@@ -1119,8 +1138,16 @@ $prefix: interwiki prefix we are looking for.
 &$iwData: output array describing the interwiki with keys iw_url, iw_local,
   iw_trans and optionally iw_api and iw_wikiid.
 
+'InternalParseBeforeSanitize': during Parser's internalParse method just before the
+parser removes unwanted/dangerous HTML tags and after nowiki/noinclude/includeonly/
+onlyinclude and other processings. Ideal for syntax-extensions after template/parser
+function execution which respect nowiki and HTML-comments.
+&$parser: Parser object
+&$text: string containing partially parsed text
+&$stripState: Parser's internal StripState object
+
 'InternalParseBeforeLinks': during Parser's internalParse method before links
-but after noinclude/includeonly/onlyinclude and other processing.
+but after nowiki/noinclude/includeonly/onlyinclude and other processings.
 &$parser: Parser object
 &$text: string containing partially parsed text
 &$stripState: Parser's internal StripState object
@@ -1261,7 +1288,7 @@ $param: Associative Array with the following additional options:
  - lim Integer Limit of items to show, default is 50
  - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
  - showIfEmpty boolean Set to false if you don't want any output in case the loglist is empty if set to true (default), "No matching items in log" is displayed if loglist is empty
- - msgKey Array If you want a nice box with a message, set this to the key of the message. First element is the message key, additional optional elements are parameters for the key that are processed with wfMsgExt and option 'parse'
+ - msgKey Array If you want a nice box with a message, set this to the key of the message. First element is the message key, additional optional elements are parameters for the key that are processed with wfMessage()->params()->parseAsBlock()
  - offset Set to overwrite offset parameter in $wgRequest set to '' to unset offset
  - wrap String Wrap the message in html (usually something like "&lt;div ...>$1&lt;/div>").
  - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
@@ -1460,6 +1487,12 @@ A parser extension which depends on user options should install
 this hook and append its values to the key.
 $hash: reference to a hash key string which can be modified
 
+'ParserAfterParse': Called from Parser::parse() just after the call to
+Parser::internalParse() returns
+$parser: parser object
+$text: text being parsed
+$stripState: stripState used (object)
+
 'ParserAfterStrip': Same as ParserBeforeStrip
 
 'ParserAfterTidy': Called after Parser::tidy() in Parser::parse()
@@ -1533,6 +1566,10 @@ $showEditLinks: boolean describing whether this section has an edit link
 maintenance/parserTests.inc
 $parser: Parser object created
 
+'ParserTestGlobals': Allows to define globals for parser tests.
+&$globals: Array with all the globals which should be set for parser tests.
+       The arrays keys serve as the globals names, its values are the globals values.
+
 'ParserTestTables': alter the list of tables to duplicate when parser tests
 are run. Use when page save hooks require the presence of custom tables
 to ensure that tests continue to run properly.
@@ -1560,7 +1597,7 @@ Return false and put the merged text into $text to override the default behavior
 'PreferencesGetLegend': Override the text used for the <legend> of a preferences section
 $form: the PreferencesForm object. This is a ContextSource as well
 $key: the section name
-&$legend: the legend text. Defaults to wfMsg( "prefs-$key" ) but may be overridden
+&$legend: the legend text. Defaults to wfMessage( "prefs-$key" )->text() but may be overridden
 
 'PrefixSearchBackend': Override the title prefix search used for OpenSearch and
 AJAX search suggestions. Put results into &$results outparam and return false.
@@ -1598,6 +1635,11 @@ $out: OutputPage object
 'RecentChange_save': called at the end of RecentChange::save()
 $recentChange: RecentChange object
 
+'RedirectSpecialArticleRedirectParams': lets you alter the set of
+parameter names such as "oldid" that are preserved when using
+redirecting special pages such as Special:MyPage and Special:MyTalk.
+&$redirectParams: An array of parameters preserved by redirecting special pages.
+
 'RequestContextCreateSkin': Called when RequestContext::getSkin creates a skin instance.
 Can be used by an extension override what skin is used in certain contexts.
 IContextSource $context: The RequestContext the skin is being created for.
@@ -1828,6 +1870,14 @@ Each key maps to an associative array with a 'msg' (message key) and a 'default'
 hook to remove a core special page
 $list: list (array) of core special pages
 
+'SpecialPageAfterExecute': called after SpecialPage::execute
+$special: the SpecialPage object
+$subPage: the subpage string or null if no subpage was specified
+
+'SpecialPageBeforeExecute': called before SpecialPage::execute
+$special: the SpecialPage object
+$subPage: the subpage string or null if no subpage was specified
+
 'SpecialPasswordResetOnSubmit': when executing a form submission on Special:PasswordReset
 $users: array of User objects
 $data: array of data submitted by the user
index ceae026..1d9bf7d 100644 (file)
@@ -40,7 +40,7 @@ $magicWords['es'] = array(
 );
 ----
 
-$wgExtensionMessagesFiles['ExtensionNameMagic'] = dirname( __FILE__ ) . '/ExtensionName.i18n.magic.php';
+$wgExtensionMessagesFiles['ExtensionNameMagic'] = __DIR__ . '/ExtensionName.i18n.magic.php';
 $wgHooks['MagicWordwgVariableIDs'][] = 'wfAddCustomMagicWordID';
 $wgHooks['ParserGetVariableValueSwitch'][] = 'wfGetCustomMagicWordValue';
 
@@ -74,7 +74,7 @@ $magicWords['es'] = array(
 );
 ----
 
-$wgExtensionMessagesFiles['ExtensionNameMagic'] = dirname( __FILE__ ) . '/ExtensionName.i18n.magic.php';
+$wgExtensionMessagesFiles['ExtensionNameMagic'] = __DIR__ . '/ExtensionName.i18n.magic.php';
 $wgHooks['ParserFirstCallInit'][] = 'wfRegisterCustomMagicWord';
 
 function wfRegisterCustomMagicWord( &$parser ){
index f5384f9..3872edc 100644 (file)
@@ -138,7 +138,7 @@ Message Cache:
        key: $wgDBname:messages, $wgDBname:messages-hash, $wgDBname:messages-status
        ex: wikidb:messages, wikidb:messages-hash, wikidb:messages-status
        stores: an array where the keys are DB keys and the values are messages
-       set in: wfMsg(), Article::editUpdates() and Title::moveTo()
+       set in: wfMessage(), Article::editUpdates() and Title::moveTo()
        expriy: $wgMsgCacheExpiry
        cleared by: nothing
 
index fdc54aa..7b8eb2a 100644 (file)
@@ -5,9 +5,9 @@
 </head>
 <body style="background-color: #C0C0C0;">
 <p>
-This show various styles for our diff action, the background being hardcoded to gray (<tt>#C0C0C0</tt>) The reference style sheet is:</p>
+This show various styles for our diff action, the background being hardcoded to gray (<code>#C0C0C0</code>) The reference style sheet is:</p>
 <p>
-<tt><a href="../../resources/mediawiki.action/mediawiki.action.history.diff.css">resources/mediawiki.action/mediawiki.action.history.diff.css</a></tt>.
+<code><a href="../../resources/mediawiki.action/mediawiki.action.history.diff.css">resources/mediawiki.action/mediawiki.action.history.diff.css</a></code>.
 </p>
 <p>
 This file might help us fix our diff colors which have been a recurring issues among the community for a loooong time.</p>
@@ -35,12 +35,12 @@ Below are some basic lines being applied one or two classes. Mainly for debuggin
 
        <tr><th>Diff</th></tr>
 
-       <tr><td class="diff-addedline"><tt>diff-addedline</tt>: added line</td></tr>
-       <tr><td class="diff-deletedline"><tt>diff-deletedline</tt>: deleted line</td></tr>
-       <tr><td class="diff-context"><tt>diff-context</tt>: context</td></tr>
+       <tr><td class="diff-addedline"><code>diff-addedline</code>: added line</td></tr>
+       <tr><td class="diff-deletedline"><code>diff-deletedline</code>: deleted line</td></tr>
+       <tr><td class="diff-context"><code>diff-context</code>: context</td></tr>
 
 
-       <tr><th>Same as above with a <tt>&lt;span&gt;</tt> child element having the <tt>diffchange</tt> class</th></tr>
+       <tr><th>Same as above with a <code>&lt;span&gt;</code> child element having the <code>diffchange</code> class</th></tr>
 
        <tr><td class="diffchange">Diffchange</td></tr>
        <tr><td class="diff-addedline">
index 22f4710..66236e8 100644 (file)
@@ -21,10 +21,10 @@ Please note that under POSIX systems (Linux...), parent of a symbolic path
 refers to the link source, NOT to the target! You should check the env
 variable MW_INSTALL_PATH in case the extension is not in the default location.
 
-The following code snippet let you override the default path: 
+The following code snippet lets you override the default path:
 
  $IP = getenv( 'MW_INSTALL_PATH' );
  if( $IP === false ) {
-       $IP = dirname( __FILE__ ) . '/../..';
+       $IP = __DIR__ . '/../..';
  }
  require_once( "$IP/maintenance/Maintenance.php" ); // a MediaWiki core file
index d712589..b3a3495 100644 (file)
@@ -43,7 +43,7 @@ define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require ( 'core/includes/WebStart.php' );
 } else {
-       require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
+       require ( __DIR__ . '/includes/WebStart.php' );
 }
 wfProfileIn( 'img_auth.php' );
 
@@ -148,13 +148,13 @@ function wfForbidden( $msg1, $msg2 ) {
        array_shift( $args );
        array_shift( $args );
 
-       $msgHdr = htmlspecialchars( wfMsg( $msg1 ) );
+       $msgHdr = wfMessage( $msg1 )->escaped();
        $detailMsgKey = $wgImgAuthDetails ? $msg2 : 'badaccess-group0';
-       $detailMsg = htmlspecialchars( wfMsg( $detailMsgKey, $args ) );
+       $detailMsg = wfMessage( $detailMsgKey, $args )->escaped();
 
        wfDebugLog( 'img_auth',
-               "wfForbidden Hdr:" . wfMsgExt( $msg1, array( 'language' => 'en' ) ). " Msg: ".
-               wfMsgExt( $msg2, array( 'language' => 'en' ), $args )
+               "wfForbidden Hdr:" . wfMessage( $msg1 )->inLanguage( 'en' )->text() . " Msg: ".
+               wfMessage( $msg2, $args )->inLanguage( 'en' )->text()
        );
 
        header( 'HTTP/1.0 403 Forbidden' );
index a9891ec..5192225 100644 (file)
@@ -341,7 +341,7 @@ abstract class Action {
         * @return String
         */
        protected function getDescription() {
-               return wfMsgHtml( strtolower( $this->getName() ) );
+               return $this->msg( strtolower( $this->getName() ) )->escaped();
        }
 
        /**
@@ -397,7 +397,7 @@ abstract class FormAction extends Action {
                // Give hooks a chance to alter the form, adding extra fields or text etc
                wfRunHooks( 'ActionModifyFormFields', array( $this->getName(), &$this->fields, $this->page ) );
 
-               $form = new HTMLForm( $this->fields, $this->getContext() );
+               $form = new HTMLForm( $this->fields, $this->getContext(), $this->getName() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
 
                // Retain query parameters (uselang etc)
index e3df520..b00cf30 100644 (file)
@@ -97,7 +97,7 @@ class AjaxDispatcher {
         * request.
         */
        function performAction() {
-               global $wgAjaxExportList, $wgOut, $wgUser;
+               global $wgAjaxExportList, $wgUser;
 
                if ( empty( $this->mode ) ) {
                        return;
@@ -113,7 +113,7 @@ class AjaxDispatcher {
                                'Bad Request',
                                "unknown function " . (string) $this->func_name
                        );
-               } elseif ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) 
+               } elseif ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true )
                        && !$wgUser->isAllowed( 'read' ) )
                {
                        wfHttpError(
@@ -123,14 +123,8 @@ class AjaxDispatcher {
                } else {
                        wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" );
 
-                       if ( strpos( $this->func_name, '::' ) !== false ) {
-                               $func = explode( '::', $this->func_name, 2 );
-                       } else {
-                               $func = $this->func_name;
-                       }
-
                        try {
-                               $result = call_user_func_array( $func, $this->args );
+                               $result = call_user_func_array( $this->func_name, $this->args );
 
                                if ( $result === false || $result === null ) {
                                        wfDebug( __METHOD__ . ' ERROR while dispatching '
@@ -163,7 +157,6 @@ class AjaxDispatcher {
                        }
                }
 
-               $wgOut = null;
                wfProfileOut( __METHOD__ );
        }
 }
index dcde2cf..a3fb747 100644 (file)
@@ -245,7 +245,8 @@ class Article extends Page {
                                        $text = '';
                                }
                        } else {
-                               $text = wfMsgExt( $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon', 'parsemag' );
+                               $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
+                               $text = wfMessage( $message )->text();
                        }
                        wfProfileOut( __METHOD__ );
 
@@ -350,9 +351,7 @@ class Article extends Page {
 
                # Pre-fill content with error message so that if something
                # fails we'll have something telling us what we intended.
-               $t = $this->getTitle()->getPrefixedText();
-               $d = $oldid ? wfMsgExt( 'missingarticle-rev', array( 'escape' ), $oldid ) : '';
-               $this->mContent = wfMsgNoTrans( 'missing-article', $t, $d ) ;
+               $this->mContent = wfMessage( 'missing-revision', $oldid )->plain();
 
                if ( $oldid ) {
                        # $this->mRevision might already be fetched by getOldIDFromRequest()
@@ -963,22 +962,20 @@ class Article extends Page {
                $token = $user->getEditToken( $rcid );
                $outputPage->preventClickjacking();
 
+               $link = Linker::linkKnown(
+                       $this->getTitle(),
+                       wfMessage( 'markaspatrolledtext' )->escaped(),
+                       array(),
+                       array(
+                               'action' => 'markpatrolled',
+                               'rcid' => $rcid,
+                               'token' => $token,
+                       )
+               );
+
                $outputPage->addHTML(
                        "<div class='patrollink'>" .
-                               wfMsgHtml(
-                                       'markaspatrolledlink',
-                                       Linker::link(
-                                               $this->getTitle(),
-                                               wfMsgHtml( 'markaspatrolledtext' ),
-                                               array(),
-                                               array(
-                                                       'action' => 'markpatrolled',
-                                                       'rcid' => $rcid,
-                                                       'token' => $token,
-                                               ),
-                                               array( 'known', 'noclasses' )
-                                       )
-                               ) .
+                               wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
                        '</div>'
                );
        }
@@ -1005,7 +1002,7 @@ class Article extends Page {
                                LogEventsList::showLogExtract(
                                        $outputPage,
                                        'block',
-                                       $user->getUserPage()->getPrefixedText(),
+                                       $user->getUserPage(),
                                        '',
                                        array(
                                                'lim' => 1,
@@ -1022,7 +1019,7 @@ class Article extends Page {
                wfRunHooks( 'ShowMissingArticle', array( $this ) );
 
                # Show delete and move logs
-               LogEventsList::showLogExtract( $outputPage, array( 'delete', 'move' ), $this->getTitle()->getPrefixedText(), '',
+               LogEventsList::showLogExtract( $outputPage, array( 'delete', 'move' ), $this->getTitle(), '',
                        array(  'lim' => 10,
                                'conds' => array( "log_action != 'revision'" ),
                                'showIfEmpty' => false,
@@ -1044,18 +1041,16 @@ class Article extends Page {
                # Show error message
                $oldid = $this->getOldID();
                if ( $oldid ) {
-                       $text = wfMsgNoTrans( 'missing-article',
-                               $this->getTitle()->getPrefixedText(),
-                               wfMsgNoTrans( 'missingarticle-rev', $oldid ) );
+                       $text = wfMessage( 'missing-revision', $oldid )->plain();
                } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
                        // Use the default message text
                        $text = $this->getTitle()->getDefaultMessageText();
                } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
                        && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
                ) {
-                       $text = wfMsgNoTrans( 'noarticletext' );
+                       $text = wfMessage( 'noarticletext' )->plain();
                } else {
-                       $text = wfMsgNoTrans( 'noarticletext-nopermission' );
+                       $text = wfMessage( 'noarticletext-nopermission' )->plain();
                }
                $text = "<div class='noarticletext'>\n$text\n</div>";
 
@@ -1075,8 +1070,9 @@ class Article extends Page {
                }
 
                $outputPage = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
                // If the user is not allowed to see it...
-               if ( !$this->mRevision->userCan( Revision::DELETED_TEXT ) ) {
+               if ( !$this->mRevision->userCan( Revision::DELETED_TEXT, $user ) ) {
                        $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                'rev-deleted-text-permission' );
 
@@ -1152,74 +1148,68 @@ class Article extends Page {
                        $tdtime, $revision->getUser() )->parse() . "</div>" );
 
                $lnk = $current
-                       ? wfMsgHtml( 'currentrevisionlink' )
-                       : Linker::link(
+                       ? wfMessage( 'currentrevisionlink' )->escaped()
+                       : Linker::linkKnown(
                                $this->getTitle(),
-                               wfMsgHtml( 'currentrevisionlink' ),
+                               wfMessage( 'currentrevisionlink' )->escaped(),
                                array(),
-                               $extraParams,
-                               array( 'known', 'noclasses' )
+                               $extraParams
                        );
                $curdiff = $current
-                       ? wfMsgHtml( 'diff' )
-                       : Linker::link(
+                       ? wfMessage( 'diff' )->escaped()
+                       : Linker::linkKnown(
                                $this->getTitle(),
-                               wfMsgHtml( 'diff' ),
+                               wfMessage( 'diff' )->escaped(),
                                array(),
                                array(
                                        'diff' => 'cur',
                                        'oldid' => $oldid
-                               ) + $extraParams,
-                               array( 'known', 'noclasses' )
+                               ) + $extraParams
                        );
                $prev = $this->getTitle()->getPreviousRevisionID( $oldid ) ;
                $prevlink = $prev
-                       ? Linker::link(
+                       ? Linker::linkKnown(
                                $this->getTitle(),
-                               wfMsgHtml( 'previousrevision' ),
+                               wfMessage( 'previousrevision' )->escaped(),
                                array(),
                                array(
                                        'direction' => 'prev',
                                        'oldid' => $oldid
-                               ) + $extraParams,
-                               array( 'known', 'noclasses' )
+                               ) + $extraParams
                        )
-                       : wfMsgHtml( 'previousrevision' );
+                       : wfMessage( 'previousrevision' )->escaped();
                $prevdiff = $prev
-                       ? Linker::link(
+                       ? Linker::linkKnown(
                                $this->getTitle(),
-                               wfMsgHtml( 'diff' ),
+                               wfMessage( 'diff' )->escaped(),
                                array(),
                                array(
                                        'diff' => 'prev',
                                        'oldid' => $oldid
-                               ) + $extraParams,
-                               array( 'known', 'noclasses' )
+                               ) + $extraParams
                        )
-                       : wfMsgHtml( 'diff' );
+                       : wfMessage( 'diff' )->escaped();
                $nextlink = $current
-                       ? wfMsgHtml( 'nextrevision' )
-                       : Linker::link(
+                       ? wfMessage( 'nextrevision' )->escaped()
+                       : Linker::linkKnown(
                                $this->getTitle(),
-                               wfMsgHtml( 'nextrevision' ),
+                               wfMessage( 'nextrevision' )->escaped(),
                                array(),
                                array(
                                        'direction' => 'next',
                                        'oldid' => $oldid
-                               ) + $extraParams,
-                               array( 'known', 'noclasses' )
+                               ) + $extraParams
                        );
                $nextdiff = $current
-                       ? wfMsgHtml( 'diff' )
-                       : Linker::link(
+                       ? wfMessage( 'diff' )->escaped()
+                       : Linker::linkKnown(
                                $this->getTitle(),
-                               wfMsgHtml( 'diff' ),
+                               wfMessage( 'diff' )->escaped(),
                                array(),
                                array(
                                        'diff' => 'next',
                                        'oldid' => $oldid
-                               ) + $extraParams,
-                               array( 'known', 'noclasses' )
+                               ) + $extraParams
                        );
 
                $cdel = Linker::getRevDeleteLink( $user, $revision, $this->getTitle() );
@@ -1228,8 +1218,9 @@ class Article extends Page {
                }
 
                $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
-                       wfMsgExt( 'revision-nav', array( 'escapenoentities', 'parsemag', 'replaceafter' ),
-                       $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff ) . "</div>" );
+                       wfMessage( 'revision-nav' )->rawParams(
+                               $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
+                       )->escaped() . "</div>" );
        }
 
        /**
@@ -1251,7 +1242,8 @@ class Article extends Page {
                $imageDir = $lang->getDir();
 
                if ( $appendSubtitle ) {
-                       $this->getContext()->getOutput()->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
+                       $out = $this->getContext()->getOutput();
+                       $out->appendSubtitle( wfMessage( 'redirectpagesub' )->escaped() );
                }
 
                // the loop prepends the arrow image before the link, so the first case needs to be outside
@@ -1329,20 +1321,21 @@ class Article extends Page {
                }
 
                # Better double-check that it hasn't been deleted yet!
-               $dbw = wfGetDB( DB_MASTER );
-               $conds = $title->pageCond();
-               $latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
-               if ( $latest === false ) {
+               $this->mPage->loadPageData( 'fromdbmaster' );
+               if ( !$this->mPage->exists() ) {
+                       $deleteLogPage = new LogPage( 'delete' );
                        $outputPage = $this->getContext()->getOutput();
                        $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
                        $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
                                        array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
                                );
-                       $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+                       $outputPage->addHTML(
+                               Xml::element( 'h2', null, $deleteLogPage->getName()->text() )
+                       );
                        LogEventsList::showLogExtract(
                                $outputPage,
                                'delete',
-                               $title->getPrefixedText()
+                               $title
                        );
 
                        return;
@@ -1356,7 +1349,8 @@ class Article extends Page {
                        $reason = $deleteReason;
                } elseif ( $deleteReason != '' ) {
                        // Entry from drop down menu + additional comment
-                       $reason = $deleteReasonList . wfMsgForContent( 'colon-separator' ) . $deleteReason;
+                       $colonseparator = wfMessage( 'colon-separator' )->inContentLanguage()->text();
+                       $reason = $deleteReasonList . $colonseparator . $deleteReason;
                } else {
                        $reason = $deleteReasonList;
                }
@@ -1369,10 +1363,12 @@ class Article extends Page {
 
                        $this->doDelete( $reason, $suppress );
 
-                       if ( $request->getCheck( 'wpWatch' ) && $user->isLoggedIn() ) {
-                               WatchAction::doWatch( $title, $user );
-                       } elseif ( $title->userIsWatching() ) {
-                               WatchAction::doUnwatch( $title, $user );
+                       if ( $user->isLoggedIn() && $request->getCheck( 'wpWatch' ) != $user->isWatched( $title ) ) {
+                               if ( $request->getCheck( 'wpWatch' ) ) {
+                                       WatchAction::doWatch( $title, $user );
+                               } else {
+                                       WatchAction::doUnwatch( $title, $user );
+                               }
                        }
 
                        return;
@@ -1389,9 +1385,9 @@ class Article extends Page {
                        $revisions = $this->mTitle->estimateRevisionCount();
                        // @todo FIXME: i18n issue/patchwork message
                        $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
-                               wfMsgExt( 'historywarning', array( 'parseinline' ), $this->getContext()->getLanguage()->formatNum( $revisions ) ) .
-                               wfMsgHtml( 'word-separator' ) . Linker::link( $title,
-                                       wfMsgHtml( 'history' ),
+                               wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
+                               wfMessage( 'word-separator' )->plain() . Linker::linkKnown( $title,
+                                       wfMessage( 'history' )->escaped(),
                                        array( 'rel' => 'archives' ),
                                        array( 'action' => 'history' ) ) .
                                '</strong>'
@@ -1429,33 +1425,33 @@ class Article extends Page {
                        $suppress = "<tr id=\"wpDeleteSuppressRow\">
                                        <td></td>
                                        <td class='mw-input'><strong>" .
-                                               Xml::checkLabel( wfMsg( 'revdelete-suppress' ),
+                                               Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
                                                        'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '4' ) ) .
                                        "</strong></td>
                                </tr>";
                } else {
                        $suppress = '';
                }
-               $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $this->getTitle()->userIsWatching();
+               $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $this->getTitle() );
 
                $form = Xml::openElement( 'form', array( 'method' => 'post',
                        'action' => $this->getTitle()->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
                        Xml::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
-                       Xml::tags( 'legend', null, wfMsgExt( 'delete-legend', array( 'parsemag', 'escapenoentities' ) ) ) .
+                       Xml::tags( 'legend', null, wfMessage( 'delete-legend' )->escaped() ) .
                        Xml::openElement( 'table', array( 'id' => 'mw-deleteconfirm-table' ) ) .
                        "<tr id=\"wpDeleteReasonListRow\">
                                <td class='mw-label'>" .
-                                       Xml::label( wfMsg( 'deletecomment' ), 'wpDeleteReasonList' ) .
+                                       Xml::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) .
                                "</td>
                                <td class='mw-input'>" .
                                        Xml::listDropDown( 'wpDeleteReasonList',
-                                               wfMsgForContent( 'deletereason-dropdown' ),
-                                               wfMsgForContent( 'deletereasonotherlist' ), '', 'wpReasonDropDown', 1 ) .
+                                               wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(),
+                                               wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(), '', 'wpReasonDropDown', 1 ) .
                                "</td>
                        </tr>
                        <tr id=\"wpDeleteReasonRow\">
                                <td class='mw-label'>" .
-                                       Xml::label( wfMsg( 'deleteotherreason' ), 'wpReason' ) .
+                                       Xml::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) .
                                "</td>
                                <td class='mw-input'>" .
                                Html::input( 'wpReason', $reason, 'text', array(
@@ -1474,7 +1470,7 @@ class Article extends Page {
                        <tr>
                                <td></td>
                                <td class='mw-input'>" .
-                                       Xml::checkLabel( wfMsg( 'watchthis' ),
+                                       Xml::checkLabel( wfMessage( 'watchthis' )->text(),
                                                'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
                                "</td>
                        </tr>";
@@ -1485,7 +1481,7 @@ class Article extends Page {
                        <tr>
                                <td></td>
                                <td class='mw-submit'>" .
-                                       Xml::submitButton( wfMsg( 'deletepage' ),
+                                       Xml::submitButton( wfMessage( 'deletepage' )->text(),
                                                array( 'name' => 'wpConfirmB', 'id' => 'wpConfirmB', 'tabindex' => '5' ) ) .
                                "</td>
                        </tr>" .
@@ -1498,7 +1494,7 @@ class Article extends Page {
                                $title = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' );
                                $link = Linker::link(
                                        $title,
-                                       wfMsgHtml( 'delete-edit-reasonlist' ),
+                                       wfMessage( 'delete-edit-reasonlist' )->escaped(),
                                        array(),
                                        array( 'action' => 'edit' )
                                );
@@ -1506,9 +1502,11 @@ class Article extends Page {
                        }
 
                $outputPage->addHTML( $form );
-               $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+
+               $deleteLogPage = new LogPage( 'delete' );
+               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
                LogEventsList::showLogExtract( $outputPage, 'delete',
-                       $this->getTitle()->getPrefixedText()
+                       $this->getTitle()
                );
        }
 
@@ -1520,28 +1518,30 @@ class Article extends Page {
        public function doDelete( $reason, $suppress = false ) {
                $error = '';
                $outputPage = $this->getContext()->getOutput();
-               if ( $this->mPage->doDeleteArticle( $reason, $suppress, 0, true, $error ) ) {
+               $status = $this->mPage->doDeleteArticleReal( $reason, $suppress, 0, true, $error );
+               if ( $status->isGood() ) {
                        $deleted = $this->getTitle()->getPrefixedText();
 
                        $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
                        $outputPage->setRobotPolicy( 'noindex,nofollow' );
 
-                       $loglink = '[[Special:Log/delete|' . wfMsgNoTrans( 'deletionlog' ) . ']]';
+                       $loglink = '[[Special:Log/delete|' . wfMessage( 'deletionlog' )->text() . ']]';
 
                        $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
                        $outputPage->returnToMain( false );
                } else {
                        $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $this->getTitle()->getPrefixedText() ) );
                        if ( $error == '' ) {
-                               $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
-                                       array( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) )
+                               $outputPage->addWikiText(
+                                       "<div class=\"error mw-error-cannotdelete\">\n" . $status->getWikiText() . "\n</div>"
                                );
-                               $outputPage->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
+                               $deleteLogPage = new LogPage( 'delete' );
+                               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
 
                                LogEventsList::showLogExtract(
                                        $outputPage,
                                        'delete',
-                                       $this->getTitle()->getPrefixedText()
+                                       $this->getTitle()
                                );
                        } else {
                                $outputPage->addHTML( $error );
index e550473..c7fcf93 100644 (file)
  * someone logs in who can be authenticated externally.
  */
 class AuthPlugin {
+
+       /**
+        * @var string
+        */
+       protected $domain;
+
        /**
         * Check whether there exists a user account with the given name.
         * The name will be normalized to MediaWiki's requirements, so
@@ -83,6 +89,19 @@ class AuthPlugin {
                $this->domain = $domain;
        }
 
+       /**
+        * Get the user's domain
+        *
+        * @return string
+        */
+       public function getDomain() {
+               if ( isset( $this->domain ) ) {
+                       return $this->domain;
+               } else {
+                       return 'invaliddomain';
+               }
+       }
+
        /**
         * Check to see if the specific domain is a valid domain.
         *
index cedb3d2..9d78dbd 100644 (file)
@@ -256,6 +256,8 @@ $wgAutoloadLocalClasses = array(
        'UserArray' => 'includes/UserArray.php',
        'UserArrayFromResult' => 'includes/UserArray.php',
        'UserBlockedError' => 'includes/Exception.php',
+       'UserNotLoggedIn' => 'includes/Exception.php',
+       'UserCache' => 'includes/cache/UserCache.php',
        'UserMailer' => 'includes/UserMailer.php',
        'UserRightsProxy' => 'includes/UserRightsProxy.php',
        'ViewCountUpdate' => 'includes/ViewCountUpdate.php',
@@ -396,6 +398,7 @@ $wgAutoloadLocalClasses = array(
        'ApiResult' => 'includes/api/ApiResult.php',
        'ApiRollback' => 'includes/api/ApiRollback.php',
        'ApiRsd' => 'includes/api/ApiRsd.php',
+       'ApiSetNotificationTimestamp' => 'includes/api/ApiSetNotificationTimestamp.php',
        'ApiTokens' => 'includes/api/ApiTokens.php',
        'ApiUnblock' => 'includes/api/ApiUnblock.php',
        'ApiUndelete' => 'includes/api/ApiUndelete.php',
@@ -419,6 +422,7 @@ $wgAutoloadLocalClasses = array(
        'LinkCache' => 'includes/cache/LinkCache.php',
        'MessageCache' => 'includes/cache/MessageCache.php',
        'ObjectFileCache' => 'includes/cache/ObjectFileCache.php',
+       'ProcessCacheLRU' => 'includes/cache/ProcessCacheLRU.php',
        'ResourceFileCache' => 'includes/cache/ResourceFileCache.php',
        'SquidUpdate' => 'includes/cache/SquidUpdate.php',
        'TitleDependency' => 'includes/cache/CacheDependency.php',
@@ -435,6 +439,9 @@ $wgAutoloadLocalClasses = array(
        'IContextSource' => 'includes/context/IContextSource.php',
        'RequestContext' => 'includes/context/RequestContext.php',
 
+       # includes/dao
+       'IDBAccessObject' => 'includes/dao/IDBAccessObject.php',
+
        # includes/db
        'Blob' => 'includes/db/DatabaseUtility.php',
        'ChronologyProtector' => 'includes/db/LBFactory.php',
@@ -518,6 +525,50 @@ $wgAutoloadLocalClasses = array(
        'ExternalUser_MediaWiki' => 'includes/extauth/MediaWiki.php',
        'ExternalUser_vB' => 'includes/extauth/vB.php',
 
+       # includes/filebackend
+       'FileBackendGroup' => 'includes/filebackend/FileBackendGroup.php',
+       'FileBackend' => 'includes/filebackend/FileBackend.php',
+       'FileBackendStore' => 'includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreShardListIterator' => 'includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreShardDirIterator' => 'includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreShardFileIterator' => 'includes/filebackend/FileBackendStore.php',
+       'FileBackendMultiWrite' => 'includes/filebackend/FileBackendMultiWrite.php',
+       'FileBackendStoreOpHandle' => 'includes/filebackend/FileBackendStore.php',
+       'FSFile' => 'includes/filebackend/FSFile.php',
+       'FSFileBackend' => 'includes/filebackend/FSFileBackend.php',
+       'FSFileBackendList' => 'includes/filebackend/FSFileBackend.php',
+       'FSFileBackendDirList' => 'includes/filebackend/FSFileBackend.php',
+       'FSFileBackendFileList' => 'includes/filebackend/FSFileBackend.php',
+       'FSFileOpHandle' => 'includes/filebackend/FSFileBackend.php',
+       'SwiftFileBackend' => 'includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileBackendList' => 'includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileBackendDirList' => 'includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileBackendFileList' => 'includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileOpHandle' => 'includes/filebackend/SwiftFileBackend.php',
+       'TempFSFile' => 'includes/filebackend/TempFSFile.php',
+       'FileJournal' => 'includes/filebackend/filejournal/FileJournal.php',
+       'DBFileJournal' => 'includes/filebackend/filejournal/DBFileJournal.php',
+       'NullFileJournal' => 'includes/filebackend/filejournal/FileJournal.php',
+       'LockManagerGroup' => 'includes/filebackend/lockmanager/LockManagerGroup.php',
+       'LockManager' => 'includes/filebackend/lockmanager/LockManager.php',
+       'ScopedLock' => 'includes/filebackend/lockmanager/LockManager.php',
+       'FSLockManager' => 'includes/filebackend/lockmanager/FSLockManager.php',
+       'DBLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
+       'LSLockManager' => 'includes/filebackend/lockmanager/LSLockManager.php',
+       'MemcLockManager' => 'includes/filebackend/lockmanager/MemcLockManager.php',
+       'QuorumLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
+       'MySqlLockManager'=> 'includes/filebackend/lockmanager/DBLockManager.php',
+       'NullLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
+       'FileOp' => 'includes/filebackend/FileOp.php',
+       'FileOpBatch' => 'includes/filebackend/FileOpBatch.php',
+       'StoreFileOp' => 'includes/filebackend/FileOp.php',
+       'CopyFileOp' => 'includes/filebackend/FileOp.php',
+       'MoveFileOp' => 'includes/filebackend/FileOp.php',
+       'DeleteFileOp' => 'includes/filebackend/FileOp.php',
+       'ConcatenateFileOp' => 'includes/filebackend/FileOp.php',
+       'CreateFileOp' => 'includes/filebackend/FileOp.php',
+       'NullFileOp' => 'includes/filebackend/FileOp.php',
+
        # includes/filerepo
        'FileRepo' => 'includes/filerepo/FileRepo.php',
        'FileRepoStatus' => 'includes/filerepo/FileRepoStatus.php',
@@ -541,48 +592,6 @@ $wgAutoloadLocalClasses = array(
        'LocalFileRestoreBatch' => 'includes/filerepo/file/LocalFile.php',
        'OldLocalFile' => 'includes/filerepo/file/OldLocalFile.php',
        'UnregisteredLocalFile' => 'includes/filerepo/file/UnregisteredLocalFile.php',
-       'FSFile' => 'includes/filerepo/backend/FSFile.php',
-       'TempFSFile' => 'includes/filerepo/backend/TempFSFile.php',
-
-       # includes/filerepo/backend
-       'FileBackendGroup' => 'includes/filerepo/backend/FileBackendGroup.php',
-       'FileBackend' => 'includes/filerepo/backend/FileBackend.php',
-       'FileBackendStore' => 'includes/filerepo/backend/FileBackendStore.php',
-       'FileBackendStoreShardListIterator' => 'includes/filerepo/backend/FileBackendStore.php',
-       'FileBackendStoreShardDirIterator' => 'includes/filerepo/backend/FileBackendStore.php',
-       'FileBackendStoreShardFileIterator' => 'includes/filerepo/backend/FileBackendStore.php',
-       'FileBackendMultiWrite' => 'includes/filerepo/backend/FileBackendMultiWrite.php',
-       'FileBackendStoreOpHandle' => 'includes/filerepo/backend/FileBackendStore.php',
-       'FSFileBackend' => 'includes/filerepo/backend/FSFileBackend.php',
-       'FSFileBackendList' => 'includes/filerepo/backend/FSFileBackend.php',
-       'FSFileBackendDirList' => 'includes/filerepo/backend/FSFileBackend.php',
-       'FSFileBackendFileList' => 'includes/filerepo/backend/FSFileBackend.php',
-       'FSFileOpHandle' => 'includes/filerepo/backend/FSFileBackend.php',
-       'SwiftFileBackend' => 'includes/filerepo/backend/SwiftFileBackend.php',
-       'SwiftFileBackendList' => 'includes/filerepo/backend/SwiftFileBackend.php',
-       'SwiftFileBackendDirList' => 'includes/filerepo/backend/SwiftFileBackend.php',
-       'SwiftFileBackendFileList' => 'includes/filerepo/backend/SwiftFileBackend.php',
-       'SwiftFileOpHandle' => 'includes/filerepo/backend/SwiftFileBackend.php',
-       'FileJournal' => 'includes/filerepo/backend/filejournal/FileJournal.php',
-       'DBFileJournal' => 'includes/filerepo/backend/filejournal/DBFileJournal.php',
-       'NullFileJournal' => 'includes/filerepo/backend/filejournal/FileJournal.php',
-       'LockManagerGroup' => 'includes/filerepo/backend/lockmanager/LockManagerGroup.php',
-       'LockManager' => 'includes/filerepo/backend/lockmanager/LockManager.php',
-       'ScopedLock' => 'includes/filerepo/backend/lockmanager/LockManager.php',
-       'FSLockManager' => 'includes/filerepo/backend/lockmanager/FSLockManager.php',
-       'DBLockManager' => 'includes/filerepo/backend/lockmanager/DBLockManager.php',
-       'LSLockManager' => 'includes/filerepo/backend/lockmanager/LSLockManager.php',
-       'MySqlLockManager'=> 'includes/filerepo/backend/lockmanager/DBLockManager.php',
-       'NullLockManager' => 'includes/filerepo/backend/lockmanager/LockManager.php',
-       'FileOp' => 'includes/filerepo/backend/FileOp.php',
-       'FileOpBatch' => 'includes/filerepo/backend/FileOpBatch.php',
-       'StoreFileOp' => 'includes/filerepo/backend/FileOp.php',
-       'CopyFileOp' => 'includes/filerepo/backend/FileOp.php',
-       'MoveFileOp' => 'includes/filerepo/backend/FileOp.php',
-       'DeleteFileOp' => 'includes/filerepo/backend/FileOp.php',
-       'ConcatenateFileOp' => 'includes/filerepo/backend/FileOp.php',
-       'CreateFileOp' => 'includes/filerepo/backend/FileOp.php',
-       'NullFileOp' => 'includes/filerepo/backend/FileOp.php',
 
        # includes/installer
        'CliInstaller' => 'includes/installer/CliInstaller.php',
@@ -628,7 +637,7 @@ $wgAutoloadLocalClasses = array(
        'DoubleRedirectJob' => 'includes/job/DoubleRedirectJob.php',
        'EmaillingJob' => 'includes/job/EmaillingJob.php',
        'EnotifNotifyJob' => 'includes/job/EnotifNotifyJob.php',
-       'Job' => 'includes/job/JobQueue.php',
+       'Job' => 'includes/job/Job.php',
        'RefreshLinksJob' => 'includes/job/RefreshLinksJob.php',
        'RefreshLinksJob2' => 'includes/job/RefreshLinksJob.php',
        'UploadFromUrlJob' => 'includes/job/UploadFromUrlJob.php',
@@ -642,6 +651,7 @@ $wgAutoloadLocalClasses = array(
        'CSSJanus' => 'includes/libs/CSSJanus.php',
        'CSSJanus_Tokenizer' => 'includes/libs/CSSJanus.php',
        'CSSMin' => 'includes/libs/CSSMin.php',
+       'GenericArrayObject' => 'includes/libs/GenericArrayObject.php',
        'HttpStatus' => 'includes/libs/HttpStatus.php',
        'IEContentAnalyzer' => 'includes/libs/IEContentAnalyzer.php',
        'IEUrlExtension' => 'includes/libs/IEUrlExtension.php',
@@ -683,11 +693,11 @@ $wgAutoloadLocalClasses = array(
        'FormatMetadata' => 'includes/media/FormatMetadata.php',
        'GIFHandler' => 'includes/media/GIF.php',
        'GIFMetadataExtractor' => 'includes/media/GIFMetadataExtractor.php',
-       'ImageHandler' => 'includes/media/Generic.php',
+       'ImageHandler' => 'includes/media/ImageHandler.php',
        'IPTC' => 'includes/media/IPTC.php',
        'JpegHandler' => 'includes/media/Jpeg.php',
        'JpegMetadataExtractor' => 'includes/media/JpegMetadataExtractor.php',
-       'MediaHandler' => 'includes/media/Generic.php',
+       'MediaHandler' => 'includes/media/MediaHandler.php',
        'MediaTransformError' => 'includes/media/MediaTransformOutput.php',
        'MediaTransformOutput' => 'includes/media/MediaTransformOutput.php',
        'PNGHandler' => 'includes/media/PNG.php',
@@ -722,12 +732,14 @@ $wgAutoloadLocalClasses = array(
        'MultiWriteBagOStuff' => 'includes/objectcache/MultiWriteBagOStuff.php',
        'MWMemcached' => 'includes/objectcache/MemcachedClient.php',
        'ObjectCache' => 'includes/objectcache/ObjectCache.php',
+       'ObjectCacheSessionHandler' => 'includes/objectcache/ObjectCacheSessionHandler.php',
+       'RedisBagOStuff' => 'includes/objectcache/RedisBagOStuff.php',
        'SqlBagOStuff' => 'includes/objectcache/SqlBagOStuff.php',
        'WinCacheBagOStuff' => 'includes/objectcache/WinCacheBagOStuff.php',
        'XCacheBagOStuff' => 'includes/objectcache/XCacheBagOStuff.php',
 
        # includes/parser
-       'CacheTime' => 'includes/parser/ParserOutput.php',
+       'CacheTime' => 'includes/parser/CacheTime.php',
        'CoreLinkFunctions' => 'includes/parser/CoreLinkFunctions.php',
        'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
        'CoreTagHooks' => 'includes/parser/CoreTagHooks.php',
@@ -879,6 +891,7 @@ $wgAutoloadLocalClasses = array(
        'MIMEsearchPage' => 'includes/specials/SpecialMIMEsearch.php',
        'MostcategoriesPage' => 'includes/specials/SpecialMostcategories.php',
        'MostimagesPage' => 'includes/specials/SpecialMostimages.php',
+       'MostinterwikisPage' => 'includes/specials/SpecialMostinterwikis.php',
        'MostlinkedCategoriesPage' => 'includes/specials/SpecialMostlinkedcategories.php',
        'MostlinkedPage' => 'includes/specials/SpecialMostlinked.php',
        'MostlinkedTemplatesPage' => 'includes/specials/SpecialMostlinkedtemplates.php',
@@ -993,6 +1006,8 @@ $wgAutoloadLocalClasses = array(
        'FakeConverter' => 'languages/Language.php',
        'Language' => 'languages/Language.php',
        'LanguageConverter' => 'languages/LanguageConverter.php',
+       'CLDRPluralRuleEvaluator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+       'CLDRPluralRuleError' => 'languages/utils/CLDRPluralRuleEvaluator.php',
 
        # maintenance
        'ConvertLinks' => 'maintenance/convertLinks.php',
@@ -1041,6 +1056,12 @@ $wgAutoloadLocalClasses = array(
        'TestFileIterator' => 'tests/testHelpers.inc',
        'TestRecorder' => 'tests/testHelpers.inc',
 
+       # tests/phpunit/includes
+       'GenericArrayObjectTest' => 'tests/phpunit/includes/libs/GenericArrayObjectTest.php',
+
+       # tests/phpunit/includes/db
+       'ORMRowTest' => 'tests/phpunit/includes/db/ORMRowTest.php',
+
        # tests/parser
        'ParserTest' => 'tests/parser/parserTest.inc',
        'ParserTestParserHook' => 'tests/parser/parserTestsParserHook.php',
index 301a45a..6e8f9f3 100644 (file)
@@ -613,7 +613,7 @@ class Block {
                $key = wfMemcKey( 'ipb', 'autoblock', 'whitelist' );
                $lines = $wgMemc->get( $key );
                if ( !$lines ) {
-                       $lines = explode( "\n", wfMsgForContentNoTrans( 'autoblock_whitelist' ) );
+                       $lines = explode( "\n", wfMessage( 'autoblock_whitelist' )->inContentLanguage()->plain() );
                        $wgMemc->set( $key, $lines, 3600 * 24 );
                }
 
@@ -687,7 +687,7 @@ class Block {
                wfDebug( "Autoblocking {$this->getTarget()}@" . $autoblockIP . "\n" );
                $autoblock->setTarget( $autoblockIP );
                $autoblock->setBlocker( $this->getBlocker() );
-               $autoblock->mReason = wfMsgForContent( 'autoblocker', $this->getTarget(), $this->mReason );
+               $autoblock->mReason = wfMessage( 'autoblocker', $this->getTarget(), $this->mReason )->inContentLanguage()->text();
                $timestamp = wfTimestampNow();
                $autoblock->mTimestamp = $timestamp;
                $autoblock->mAuto = 1;
@@ -1020,7 +1020,7 @@ class Block {
                        $keys = array( 'infiniteblock', 'expiringblock' );
 
                        foreach ( $keys as $key ) {
-                               $msg[$key] = wfMsgHtml( $key );
+                               $msg[$key] = wfMessage( $key )->escaped();
                        }
                }
 
index 5209857..8199cb4 100644 (file)
@@ -73,7 +73,8 @@ interface ICacheHelper {
        function saveCache();
 
        /**
-        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry..
+        * Sets the time to live for the cache, in seconds or a unix timestamp
+        * indicating the point of expiry...
         *
         * @since 1.20
         *
@@ -319,7 +320,8 @@ class CacheHelper implements ICacheHelper {
        }
 
        /**
-        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry..
+        * Sets the time to live for the cache, in seconds or a unix timestamp
+        * indicating the point of expiry...
         *
         * @since 1.20
         *
index 7987069..b7b12e8 100644 (file)
@@ -297,13 +297,13 @@ class Category {
                        'IGNORE'
                );
 
-               $cond1 = $dbw->conditional( 'page_namespace=' . NS_CATEGORY, 1, 'NULL' );
-               $cond2 = $dbw->conditional( 'page_namespace=' . NS_FILE, 1, 'NULL' );
+               $cond1 = $dbw->conditional( array( 'page_namespace' => NS_CATEGORY ), 1, 'NULL' );
+               $cond2 = $dbw->conditional( array( 'page_namespace' => NS_FILE ), 1, 'NULL' );
                $result = $dbw->selectRow(
                        array( 'categorylinks', 'page' ),
-                       array( 'COUNT(*) AS pages',
-                                  "COUNT($cond1) AS subcats",
-                                  "COUNT($cond2) AS files"
+                       array( 'pages' => 'COUNT(*)',
+                                  'subcats' => "COUNT($cond1)",
+                                  'files' => "COUNT($cond2)"
                        ),
                        array( 'cl_to' => $this->mName, 'page_id = cl_from' ),
                        __METHOD__,
index ddd01eb..5f4aaea 100644 (file)
@@ -504,7 +504,7 @@ class CategoryViewer extends ContextSource {
                # Split into three columns
                $columns = array_chunk( $columns, ceil( count( $columns ) / 3 ), true /* preserve keys */ );
 
-               $ret = '<table width="100%"><tr valign="top">';
+               $ret = '<table width="100%"><tr style="vertical-align: top;">';
                $prevchar = null;
 
                foreach ( $columns as $column ) {
@@ -526,7 +526,7 @@ class CategoryViewer extends ContextSource {
                                if ( $first && $char === $prevchar ) {
                                        # We're continuing a previous chunk at the top of a new
                                        # column, so add " cont." after the letter.
-                                       $ret .= ' ' . wfMsgHtml( 'listingcontinuesabbrev' );
+                                       $ret .= ' ' . wfMessage( 'listingcontinuesabbrev' )->escaped();
                                }
                                $ret .= "</h3>\n";
 
index 204df45..0ebc926 100644 (file)
@@ -35,6 +35,8 @@ class ChangeTags {
         *
         */
        static function formatSummaryRow( $tags, $page ) {
+               global $wgLang;
+
                if( !$tags )
                        return array( '', array() );
 
@@ -51,7 +53,7 @@ class ChangeTags {
                        );
                        $classes[] = Sanitizer::escapeClass( "mw-tag-$tag" );
                }
-               $markers = '(' . implode( ', ', $displayTags ) . ')';
+               $markers = wfMessage( 'parentheses' )->rawParams( $wgLang->commaList( $displayTags ) )->text();
                $markers = Xml::tags( 'span', array( 'class' => 'mw-tag-markers' ), $markers );
 
                return array( $markers, $classes );
@@ -225,7 +227,7 @@ class ChangeTags {
                if ( !$wgUseTagFilter || !count( self::listDefinedTags() ) )
                        return $fullForm ? '' : array();
 
-               $data = array( Html::rawElement( 'label', array( 'for' => 'tagfilter' ), wfMsgExt( 'tag-filter', 'parseinline' ) ),
+               $data = array( Html::rawElement( 'label', array( 'for' => 'tagfilter' ), wfMessage( 'tag-filter' )->parse() ),
                        Xml::input( 'tagfilter', 20, $selected, array( 'class' => 'mw-tagfilter-input' ) ) );
 
                if ( !$fullForm ) {
@@ -233,7 +235,7 @@ class ChangeTags {
                }
 
                $html = implode( '&#160;', $data );
-               $html .= "\n" . Xml::element( 'input', array( 'type' => 'submit', 'value' => wfMsg( 'tag-filter-submit' ) ) );
+               $html .= "\n" . Xml::element( 'input', array( 'type' => 'submit', 'value' => wfMessage( 'tag-filter-submit' )->text() ) );
                $html .= "\n" . Html::hidden( 'title', $title->getPrefixedText() );
                $html = Xml::tags( 'form', array( 'action' => $title->getLocalURL(), 'class' => 'mw-tagfilter-form', 'method' => 'get' ), $html );
 
index 2954920..ee4c2d6 100644 (file)
@@ -206,7 +206,7 @@ class ChangesFeed {
                                FeedUtils::formatDiff( $obj ),
                                $url,
                                $obj->rc_timestamp,
-                               ($obj->rc_deleted & Revision::DELETED_USER) ? wfMsgHtml('rev-deleted-user') : $obj->rc_user_text,
+                               ( $obj->rc_deleted & Revision::DELETED_USER ) ? wfMessage( 'rev-deleted-user' )->escaped() : $obj->rc_user_text,
                                $talkpage
                        );
                        $feed->outItem( $item );
index 4ddc667..8cca4bb 100644 (file)
@@ -108,7 +108,7 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * Sets the list to use a <li class="watchlist-(namespace)-(page)"> tag
+        * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
         * @param $value Boolean
         */
        public function setWatchlistDivs( $value = true ) {
@@ -123,7 +123,7 @@ class ChangesList extends ContextSource {
                if( !isset( $this->message ) ) {
                        foreach ( explode( ' ', 'cur diff hist last blocklink history ' .
                        'semicolon-separator pipe-separator' ) as $msg ) {
-                               $this->message[$msg] = wfMsgExt( $msg, array( 'escapenoentities' ) );
+                               $this->message[$msg] = $this->msg( $msg )->escaped();
                        }
                }
        }
@@ -145,7 +145,7 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * Provide the <abbr> element appropriate to a given abbreviated flag,
+        * Provide the "<abbr>" element appropriate to a given abbreviated flag,
         * namely the flag indicating a new page, a minor edit, a bot edit, or an
         * unpatrolled edit.  By default in English it will contain "N", "m", "b",
         * "!" respectively, plus it will have an appropriate title and class.
@@ -163,8 +163,8 @@ class ChangesList extends ContextSource {
                                'unpatrolled' => array( 'unpatrolledletter', 'recentchanges-label-unpatrolled' ),
                        );
                        foreach( $messages as &$value ) {
-                               $value[0] = wfMsgExt( $value[0], 'escapenoentities' );
-                               $value[1] = wfMsgExt( $value[1], 'escapenoentities' );
+                               $value[0] = wfMessage( $value[0] )->escaped();
+                               $value[1] = wfMessage( $value[1] )->escaped();
                        }
                }
 
@@ -192,6 +192,7 @@ class ChangesList extends ContextSource {
                $this->rcCacheIndex = 0;
                $this->lastdate = '';
                $this->rclistOpen = false;
+               $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
                return '';
        }
 
@@ -199,22 +200,31 @@ class ChangesList extends ContextSource {
         * Show formatted char difference
         * @param $old Integer: bytes
         * @param $new Integer: bytes
+        * @param $context IContextSource context to use
         * @return String
         */
-       public static function showCharacterDifference( $old, $new ) {
-               global $wgRCChangedSizeThreshold, $wgLang, $wgMiserMode;
+       public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
+               global $wgRCChangedSizeThreshold, $wgMiserMode;
+
+               if ( !$context ) {
+                       $context = RequestContext::getMain();
+               }
+
+               $new = (int)$new;
+               $old = (int)$old;
                $szdiff = $new - $old;
 
-               $code = $wgLang->getCode();
+               $lang = $context->getLanguage();
+               $code = $lang->getCode();
                static $fastCharDiff = array();
                if ( !isset($fastCharDiff[$code]) ) {
-                       $fastCharDiff[$code] = $wgMiserMode || wfMsgNoTrans( 'rc-change-size' ) === '$1';
+                       $fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
                }
 
-               $formattedSize = $wgLang->formatNum($szdiff);
+               $formattedSize = $lang->formatNum( $szdiff );
 
                if ( !$fastCharDiff[$code] ) {
-                       $formattedSize = wfMsgExt( 'rc-change-size', array( 'parsemag' ), $formattedSize );
+                       $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
                }
 
                if( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
@@ -234,11 +244,34 @@ class ChangesList extends ContextSource {
                        $formattedSizeClass = 'mw-plusminus-neg';
                }
 
-               $formattedTotalSize = wfMsgExt( 'rc-change-size-new', 'parsemag', $wgLang->formatNum( $new ) );
+               $formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text();
 
                return Html::element( $tag,
                        array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
-                       wfMessage( 'parentheses', $formattedSize )->plain() ) . $wgLang->getDirMark();
+                       $context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark();
+       }
+
+       /**
+        * Format the character difference of one or several changes.
+        *
+        * @param $old RecentChange
+        * @param $new RecentChange last change to use, if not provided, $old will be used
+        * @return string HTML fragment
+        */
+       public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
+               $oldlen = $old->mAttribs['rc_old_len'];
+
+               if ( $new ) {
+                       $newlen = $new->mAttribs['rc_new_len'];
+               } else {
+                       $newlen = $old->mAttribs['rc_new_len'];
+               }
+
+               if( $oldlen === null || $newlen === null ) {
+                       return '';
+               }
+
+               return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() );
        }
 
        /**
@@ -255,7 +288,7 @@ class ChangesList extends ContextSource {
 
        public function insertDateHeader( &$s, $rc_timestamp ) {
                # Make date header if necessary
-               $date = $this->getLanguage()->date( $rc_timestamp, true, true );
+               $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
                if( $date != $this->lastdate ) {
                        if( $this->lastdate != '' ) {
                                $s .= "</ul>\n";
@@ -339,10 +372,8 @@ class ChangesList extends ContextSource {
                if( $this->isDeleted($rc,Revision::DELETED_TEXT) ) {
                        $articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
                }
-               # Bolden pages watched by this user
-               if( $watched ) {
-                       $articlelink = "<strong class=\"mw-watched\">{$articlelink}</strong>";
-               }
+               # To allow for boldening pages watched by this user
+               $articlelink = "<span class=\"mw-title\">{$articlelink}</span>";
                # RTL/LTR marker
                $articlelink .= $this->getLanguage()->getDirMark();
 
@@ -358,7 +389,7 @@ class ChangesList extends ContextSource {
         */
        public function insertTimestamp( &$s, $rc ) {
                $s .= $this->message['semicolon-separator'] .
-                       $this->getLanguage()->time( $rc->mAttribs['rc_timestamp'], true, true ) . ' . . ';
+                       $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . ' . . ';
        }
 
        /**
@@ -369,7 +400,7 @@ class ChangesList extends ContextSource {
         */
        public function insertUserRelatedLinks( &$s, &$rc ) {
                if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
-                       $s .= ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+                       $s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
                                $rc->mAttribs['rc_user_text'] );
@@ -385,12 +416,13 @@ class ChangesList extends ContextSource {
         */
        public function insertLogEntry( $rc ) {
                $formatter = LogFormatter::newFromRow( $rc->mAttribs );
+               $formatter->setContext( $this->getContext() );
                $formatter->setShowUserToolLinks( true );
                $mark = $this->getLanguage()->getDirMark();
                return $formatter->getActionText() . " $mark" . $formatter->getComment();
        }
 
-       /** 
+       /**
         * Insert a formatted comment
         * @param $rc RecentChange
         * @return string
@@ -398,7 +430,7 @@ class ChangesList extends ContextSource {
        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 ) ) {
-                               return ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-comment' ) . '</span>';
+                               return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
                        } else {
                                return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
                        }
@@ -422,8 +454,7 @@ class ChangesList extends ContextSource {
                static $cache = array();
                if( $count > 0 ) {
                        if( !isset( $cache[$count] ) ) {
-                               $cache[$count] = wfMsgExt( 'number_of_watching_users_RCview',
-                                       array('parsemag', 'escape' ), $this->getLanguage()->formatNum( $count ) );
+                               $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
                        }
                        return $cache[$count];
                } else {
@@ -476,7 +507,7 @@ class ChangesList extends ContextSource {
         * @param $rc RecentChange
         */
        public function insertRollback( &$s, &$rc ) {
-               if( !$rc->mAttribs['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 */
@@ -517,7 +548,7 @@ class ChangesList extends ContextSource {
                if ( !$rc->mAttribs['rc_patrolled'] ) {
                        if ( $this->getUser()->useRCPatrol() ) {
                                $unpatrolled = true;
-                       } elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_new'] ) {
+                       } elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_type'] == RC_NEW ) {
                                $unpatrolled = true;
                        }
                }
@@ -533,7 +564,9 @@ class OldChangesList extends ChangesList {
        /**
         * Format a line using the old system (aka without any javascript).
         *
-        * @param $rc RecentChange
+        * @param $rc RecentChange, passed by reference
+        * @param $watched Bool (default false)
+        * @param $linenumber Int (default null)
         * @return string
         */
        public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
@@ -558,6 +591,10 @@ class OldChangesList extends ChangesList {
                        }
                }
 
+               // Indicate watched status on the line to allow for more
+               // comprehensive styling.
+               $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 ) {
                // Log entries
@@ -576,7 +613,7 @@ class OldChangesList extends ChangesList {
                        # M, N, b and ! (minor, new, bot and unpatrolled)
                        $s .= $this->recentChangesFlags(
                                array(
-                                       'newpage' => $rc->mAttribs['rc_new'],
+                                       'newpage' => $rc->mAttribs['rc_type'] == RC_NEW,
                                        'minor' => $rc->mAttribs['rc_minor'],
                                        'unpatrolled' => $unpatrolled,
                                        'bot' => $rc->mAttribs['rc_bot']
@@ -588,9 +625,9 @@ class OldChangesList extends ChangesList {
                # Edit/log timestamp
                $this->insertTimestamp( $s, $rc );
                # Bytes added or removed
-               if( $wgRCShowChangedSize ) {
-                       $cd = $rc->getCharacterDifference();
-                       if( $cd != '' ) {
+               if ( $wgRCShowChangedSize ) {
+                       $cd = $this->formatCharacterDifference( $rc );
+                       if ( $cd !== '' ) {
                                $s .= "$cd  . . ";
                        }
                }
@@ -614,8 +651,7 @@ class OldChangesList extends ChangesList {
 
                # How many users watch this page
                if( $rc->numberofWatchingusers > 0 ) {
-                       $s .= ' ' . wfMsgExt( 'number_of_watching_users_RCview',
-                               array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $rc->numberofWatchingusers ) );
+                       $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
                }
 
                if( $this->watchlist ) {
@@ -667,7 +703,7 @@ class EnhancedChangesList extends ChangesList {
                $curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
 
                # If it's a new day, add the headline and flush the cache
-               $date = $this->getLanguage()->date( $rc->mAttribs['rc_timestamp'], true );
+               $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() );
                $ret = '';
                if( $date != $this->lastdate ) {
                        # Process current cache
@@ -715,7 +751,7 @@ class EnhancedChangesList extends ChangesList {
                        $showdifflinks = false;
                }
 
-               $time = $this->getLanguage()->time( $rc->mAttribs['rc_timestamp'], true, true );
+               $time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() );
                $rc->watched = $watched;
                $rc->link = $clink;
                $rc->timestamp = $time;
@@ -764,7 +800,7 @@ class EnhancedChangesList extends ChangesList {
 
                # Make user links
                if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
-                       $rc->userlink = ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+                       $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'] );
                        $rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
@@ -808,14 +844,16 @@ class EnhancedChangesList extends ChangesList {
                wfProfileIn( __METHOD__ );
 
                # Add the namespace and title of the block as part of the class
+               $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
                if ( $block[0]->mAttribs['rc_log_type'] ) {
                        # Log entry
-                       $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-'
+                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
                                        . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
                } else {
-                       $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns'
+                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
                                        . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
                }
+               $classes[] = $block[0]->watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
                $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
                        Html::openElement( 'tr' );
 
@@ -830,7 +868,7 @@ class EnhancedChangesList extends ChangesList {
                $allLogs = true;
                foreach( $block as $rcObj ) {
                        $oldid = $rcObj->mAttribs['rc_last_oldid'];
-                       if( $rcObj->mAttribs['rc_new'] ) {
+                       if( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
                                $isnew = true;
                        }
                        // If all log actions to this page were hidden, then don't
@@ -875,9 +913,9 @@ class EnhancedChangesList extends ChangesList {
                }
 
                $users = ' <span class="changedby">'
-                       . $this->getContext()->msg( 'brackets' )->rawParams(
+                       . $this->msg( 'brackets' )->rawParams(
                                implode( $this->message['semicolon-separator'], $users )
-                       )->plain() . '</span>';
+                       )->escaped() . '</span>';
 
                $tl = '<span class="mw-collapsible-toggle mw-enhancedchanges-arrow"></span>';
                $r .= "<td>$tl</td>";
@@ -895,7 +933,7 @@ class EnhancedChangesList extends ChangesList {
 
                # Article link
                if( $namehidden ) {
-                       $r .= ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-event' ) . '</span>';
+                       $r .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
                } elseif( $allLogs ) {
                        $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
                } else {
@@ -909,7 +947,7 @@ class EnhancedChangesList extends ChangesList {
                $n = count($block);
                static $nchanges = array();
                if ( !isset( $nchanges[$n] ) ) {
-                       $nchanges[$n] = wfMsgExt( 'nchanges', array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $n ) );
+                       $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
                }
                # Total change link
                $r .= ' ';
@@ -970,8 +1008,7 @@ class EnhancedChangesList extends ChangesList {
                                $first--;
                        }
                        # Get net change
-                       $chardiff = $rcObj->getCharacterDifference( $block[$first]->mAttribs['rc_old_len'],
-                               $block[$last]->mAttribs['rc_new_len'] );
+                       $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
 
                        if( $chardiff == '' ) {
                                $r .= ' ';
@@ -991,7 +1028,7 @@ class EnhancedChangesList extends ChangesList {
 
                        $r .= '<tr><td></td><td class="mw-enhanced-rc">';
                        $r .= $this->recentChangesFlags( array(
-                               'newpage' => $rcObj->mAttribs['rc_new'],
+                               'newpage' => $type == RC_NEW,
                                'minor' => $rcObj->mAttribs['rc_minor'],
                                'unpatrolled' => $rcObj->unpatrolled,
                                'bot' => $rcObj->mAttribs['rc_bot'],
@@ -1032,8 +1069,11 @@ class EnhancedChangesList extends ChangesList {
                        $r .= ' . . ';
 
                        # Character diff
-                       if( $wgRCShowChangedSize && $rcObj->getCharacterDifference() ) {
-                               $r .= $rcObj->getCharacterDifference() . ' . . ' ;
+                       if ( $wgRCShowChangedSize ) {
+                               $cd = $this->formatCharacterDifference( $rcObj );
+                               if ( $cd !== '' ) {
+                                       $r .= "$cd . . ";
+                               }
                        }
 
                        if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
@@ -1066,7 +1106,7 @@ class EnhancedChangesList extends ChangesList {
         * @param $dir String: one of '', 'd', 'l', 'r'
         * @param $alt String: text
         * @param $title String: text
-        * @return String: HTML <img> tag
+        * @return String: HTML "<img>" tag
         */
        protected function arrow( $dir, $alt='', $title='' ) {
                global $wgStylePath;
@@ -1079,26 +1119,25 @@ class EnhancedChangesList extends ChangesList {
        /**
         * Generate HTML for a right- or left-facing arrow,
         * depending on language direction.
-        * @return String: HTML <img> tag
+        * @return String: HTML "<img>" tag
         */
        protected function sideArrow() {
-               global $wgLang;
-               $dir = $wgLang->isRTL() ? 'l' : 'r';
-               return $this->arrow( $dir, '+', wfMsg( 'rc-enhanced-expand' ) );
+               $dir = $this->getLanguage()->isRTL() ? 'l' : 'r';
+               return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() );
        }
 
        /**
         * Generate HTML for a down-facing arrow
         * depending on language direction.
-        * @return String: HTML <img> tag
+        * @return String: HTML "<img>" tag
         */
        protected function downArrow() {
-               return $this->arrow( 'd', '-', wfMsg( 'rc-enhanced-hide' ) );
+               return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() );
        }
 
        /**
         * Generate HTML for a spacer image
-        * @return String: HTML <img> tag
+        * @return String: HTML "<img>" tag
         */
        protected function spacerArrow() {
                return $this->arrow( '', codepointToUtf8( 0xa0 ) ); // non-breaking space
@@ -1118,14 +1157,16 @@ class EnhancedChangesList extends ChangesList {
 
                $type = $rcObj->mAttribs['rc_type'];
                $logType = $rcObj->mAttribs['rc_log_type'];
+               $classes = array( 'mw-enhanced-rc' );
                if( $logType ) {
                        # Log entry
-                       $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-'
+                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
                                        . $logType . '-' . $rcObj->mAttribs['rc_title'] );
                } else {
-                       $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns' .
+                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
                                        $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
                }
+               $classes[] = $rcObj->watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
                $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
                        Html::openElement( 'tr' );
 
@@ -1144,9 +1185,10 @@ class EnhancedChangesList extends ChangesList {
                $r .= '&#160;'.$rcObj->timestamp.'&#160;</td><td>';
                # Article or log link
                if( $logType ) {
-                       $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
-                       $logname = LogPage::logName( $logType );
-                       $r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, htmlspecialchars( $logname ) ) )->escaped();
+                       $logPage = new LogPage( $logType );
+                       $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
+                       $logName = $logPage->getName()->escaped();
+                       $r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
                } else {
                        $this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched );
                }
@@ -1162,20 +1204,22 @@ class EnhancedChangesList extends ChangesList {
                }
                $r .= ' . . ';
                # Character diff
-               if( $wgRCShowChangedSize && ($cd = $rcObj->getCharacterDifference()) ) {
-                       $r .= "$cd . . ";
+               if ( $wgRCShowChangedSize ) {
+                       $cd = $this->formatCharacterDifference( $rcObj );
+                       if ( $cd !== '' ) {
+                               $r .= "$cd . . ";
+                       }
                }
 
                if ( $type == RC_LOG ) {
                        $r .= $this->insertLogEntry( $rcObj );
-               } else { 
+               } else {
                        $r .= ' '.$rcObj->userlink . $rcObj->usertalklink;
                        $r .= $this->insertComment( $rcObj );
                        $this->insertRollback( $r, $rcObj );
                }
 
                # Tags
-               $classes = explode( ' ', $classes );
                $this->insertTags( $r, $rcObj, $classes );
                # Show how many people are watching this if enabled
                $r .= $this->numberofWatchingusers($rcObj->numberofWatchingusers);
index 1ca02b5..7984d63 100644 (file)
@@ -80,8 +80,8 @@ class Cookie {
         * A better method might be to use a blacklist like
         * http://publicsuffix.org/
         *
-        * @fixme fails to detect 3-letter top-level domains
-        * @fixme fails to detect 2-letter top-level domains for single-domain use (probably not a big problem in practice, but there are test cases)
+        * @todo fixme fails to detect 3-letter top-level domains
+        * @todo fixme fails to detect 2-letter top-level domains for single-domain use (probably not a big problem in practice, but there are test cases)
         *
         * @param $domain String: the domain to validate
         * @param $originDomain String: (optional) the domain the cookie originates from
index bb80eeb..858eebf 100644 (file)
@@ -83,8 +83,8 @@ class MWCryptRand {
                $files[] = __FILE__;
 
                // We must also have a parent folder, and with the usual file structure, a grandparent
-               $files[] = dirname( __FILE__ );
-               $files[] = dirname( dirname( __FILE__ ) );
+               $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.
index 7203c3b..377b64c 100644 (file)
 /**
  * Abstract base class for update jobs that do something with some secondary
  * data extracted from article.
+ *
+ * @note: subclasses should NOT start or commit transactions in their doUpdate() method,
+ *        a transaction will automatically be wrapped around the update. If need be,
+ *        subclasses can override the beginTransaction() and commitTransaction() methods.
  */
 abstract class DataUpdate implements DeferrableUpdate {
 
@@ -80,8 +84,8 @@ abstract class DataUpdate implements DeferrableUpdate {
                $exception = null;
 
                /**
-                * @var $update StorageUpdate
-                * @var $trans StorageUpdate
+                * @var $update DataUpdate
+                * @var $trans DataUpdate
                 */
 
                try {
index 6e59a86..e898edf 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Default values for configuration settings.
+ * Default values for MediaWiki configuration settings.
  *
  *
  *                 NEVER EDIT THIS FILE
@@ -17,6 +17,9 @@
  * Documentation is in the source and on:
  * http://www.mediawiki.org/wiki/Manual:Configuration_settings
  *
+ * @warning  Note: this (and other things) will break if the autoloader is not
+ * enabled. Please include includes/AutoLoader.php before including this file.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * @file
  */
 
+/**
+ * @defgroup Globalsettings Global settings
+ */
+
 /**
  * @cond file_level_code
- * This is not a valid entry point, perform no further processing unless MEDIAWIKI is defined
+ * This is not a valid entry point, perform no further processing unless
+ * MEDIAWIKI is defined
  */
 if( !defined( 'MEDIAWIKI' ) ) {
        echo "This file is part of MediaWiki and is not a valid entry point\n";
        die( 1 );
 }
 
-# Create a site configuration object. Not used for much in a default install.
-# Note: this (and other things) will break if the autoloader is not enabled.
-# Please include includes/AutoLoader.php before including this file.
+/**
+ * wgConf hold the site configuration.
+ * Not used for much in a default install.
+ */
 $wgConf = new SiteConfiguration;
-/** @endcond */
 
 /** MediaWiki version number */
 $wgVersion = '1.20alpha';
@@ -59,10 +67,10 @@ $wgSitename = 'MediaWiki';
 /**
  * URL of the server.
  *
- * Example:
- * <code>
+ * @par Example:
+ * @code
  * $wgServer = 'http://example.com';
- * </code>
+ * @endcode
  *
  * This is usually detected correctly by MediaWiki. If MediaWiki detects the
  * wrong server, it will redirect incorrectly after you save a page. In that
@@ -128,28 +136,6 @@ $wgUsePathInfo =
  */
 $wgScriptExtension  = '.php';
 
-/**
- * The URL path to index.php.
- *
- * Will default to "{$wgScriptPath}/index{$wgScriptExtension}" in Setup.php
- */
-$wgScript = false;
-
-/**
- * The URL path to redirect.php. This is a script that is used by the Nostalgia
- * skin.
- *
- * Will default to "{$wgScriptPath}/redirect{$wgScriptExtension}" in Setup.php
- */
-$wgRedirectScript = false;
-
-/**
- * The URL path to load.php.
- *
- * Defaults to "{$wgScriptPath}/load{$wgScriptExtension}".
- */
-$wgLoadScript = false;
-
 
 /**@}*/
 
@@ -172,7 +158,30 @@ $wgLoadScript = false;
  */
 
 /**
- * The URL path of the skins directory. Will default to "{$wgScriptPath}/skins" in Setup.php
+ * The URL path to index.php.
+ *
+ * Defaults to "{$wgScriptPath}/index{$wgScriptExtension}".
+ */
+$wgScript = false;
+
+/**
+ * The URL path to redirect.php. This is a script that is used by the Nostalgia
+ * skin.
+ *
+ * Defaults to "{$wgScriptPath}/redirect{$wgScriptExtension}".
+ */
+$wgRedirectScript = false;
+
+/**
+ * The URL path to load.php.
+ *
+ * Defaults to "{$wgScriptPath}/load{$wgScriptExtension}".
+ */
+$wgLoadScript = false;
+
+/**
+ * The URL path of the skins directory.
+ * Defaults to "{$wgScriptPath}/skins".
  */
 $wgStylePath = false;
 $wgStyleSheetPath = &$wgStylePath;
@@ -191,7 +200,8 @@ $wgLocalStylePath = false;
 $wgExtensionAssetsPath = false;
 
 /**
- * Filesystem stylesheets directory. Will default to "{$IP}/skins" in Setup.php
+ * Filesystem stylesheets directory.
+ * Defaults to "{$IP}/skins".
  */
 $wgStyleDirectory = false;
 
@@ -199,29 +209,31 @@ $wgStyleDirectory = false;
  * The URL path for primary article page views. This path should contain $1,
  * which is replaced by the article title.
  *
- * Will default to "{$wgScript}/$1" or "{$wgScript}?title=$1" in Setup.php,
+ * Defaults to "{$wgScript}/$1" or "{$wgScript}?title=$1",
  * depending on $wgUsePathInfo.
  */
 $wgArticlePath = false;
 
 /**
- * The URL path for the images directory. Will default to "{$wgScriptPath}/images" in Setup.php
+ * The URL path for the images directory.
+ * Defaults to "{$wgScriptPath}/images".
  */
 $wgUploadPath = false;
 
 /**
- * The maximum age of temporary (incomplete) uploaded files
+ * The filesystem path of the images directory. Defaults to "{$IP}/images".
  */
-$wgUploadStashMaxAge = 6 * 3600; // 6 hours
+$wgUploadDirectory = false;
 
 /**
- * The filesystem path of the images directory. Defaults to "{$IP}/images".
+ * Directory where the cached page will be saved.
+ * Defaults to "{$wgUploadDirectory}/cache".
  */
-$wgUploadDirectory = false;
+$wgFileCacheDirectory = false;
 
 /**
  * The URL path of the wiki logo. The logo size should be 135x135 pixels.
- * Will default to "{$wgStylePath}/common/images/wiki.png" in Setup.php
+ * Defaults to "{$wgStylePath}/common/images/wiki.png".
  */
 $wgLogo = false;
 
@@ -241,14 +253,14 @@ $wgAppleTouchIcon = false;
  * be web accessible.
  *
  * When this setting is set to false, its value will be set through a call
- * to wfTempDir(). See that methods implementation for the actul detection
+ * to wfTempDir(). See that methods implementation for the actual detection
  * logic.
  *
  * Developers should use the global function wfTempDir() instead of this
  * variable.
  *
  * @see wfTempDir()
- * @note Default modified to false in v1.20
+ * @note Default changed to false in MediaWiki 1.20.
  *
  */
 $wgTmpDirectory = false;
@@ -269,11 +281,16 @@ $wgUploadStashScalerBaseUrl = false;
 
 /**
  * To set 'pretty' URL paths for actions other than
- * plain page views, add to this array. For instance:
+ * plain page views, add to this array.
+ *
+ * @par Example:
+ * Set pretty URL for the edit action:
+ * @code
  *   'edit' => "$wgScriptPath/edit/$1"
+ * @endcode
  *
- * There must be an appropriate script or rewrite rule
- * in place to handle these URLs.
+ * There must be an appropriate script or rewrite rule in place to handle these
+ * URLs.
  */
 $wgActionPaths = array();
 
@@ -287,11 +304,16 @@ $wgActionPaths = array();
 /** Uploads have to be specially set up to be secure */
 $wgEnableUploads = false;
 
+/**
+ * The maximum age of temporary (incomplete) uploaded files
+ */
+$wgUploadStashMaxAge = 6 * 3600; // 6 hours
+
 /** Allows to move images and other media files */
 $wgAllowImageMoving = true;
 
 /**
- * These are additional characters that should be replaced with '-' in file names
+ * These are additional characters that should be replaced with '-' in filenames
  */
 $wgIllegalFileChars = ":";
 
@@ -301,9 +323,10 @@ $wgIllegalFileChars = ":";
 $wgFileStore = array();
 
 /**
- * What directory to place deleted uploads in
+ * What directory to place deleted uploads in.
+ * Defaults to "{$wgUploadDirectory}/deleted".
  */
-$wgDeletedDirectory = false; //  Defaults to $wgUploadDirectory/deleted
+$wgDeletedDirectory = false;
 
 /**
  * Set this to true if you use img_auth and want the user to see details on why access failed.
@@ -335,10 +358,12 @@ $wgImgAuthPublicTest = true;
  *
  * For most core repos:
  *   - zones            Associative array of zone names that each map to an array with:
- *                          container : backend container name the zone is in
- *                          directory : root path within container for the zone
- *                          url       : base URL to the root of the zone
- *                      Zones default to using <repo name>-<zone name> as the container name
+ *                          container  : backend container name the zone is in
+ *                          directory  : root path within container for the zone
+ *                          url        : base URL to the root of the zone
+ *                          handlerUrl : base script handled URL to the root of the zone
+ *                                       (see FileRepo::getZoneHandlerUrl() function)
+ *                      Zones default to using "<repo name>-<zone name>" as the container name
  *                      and default to using the container root as the zone's root directory.
  *                      Nesting of zone locations within other zones should be avoided.
  *   - url              Public zone URL. The 'zones' settings take precedence.
@@ -358,9 +383,11 @@ $wgImgAuthPublicTest = true;
  *                      is 0644.
  *   - directory        The local filesystem directory where public files are stored. Not used for
  *                      some remote repos.
- *   - thumbDir         The base thumbnail directory. Defaults to <directory>/thumb.
- *   - thumbUrl         The base thumbnail URL. Defaults to <url>/thumb.
- *
+ *   - thumbDir         The base thumbnail directory. Defaults to "<directory>/thumb".
+ *   - thumbUrl         The base thumbnail URL. Defaults to "<url>/thumb".
+ *   - isPrivate        Set this if measures should always be taken to keep the files private.
+ *                      One should not trust this to assure that the files are not web readable;
+ *                      the server configuration should be done manually depending on the backend.
  *
  * These settings describe a foreign MediaWiki installation. They are optional, and will be ignored
  * for local repositories:
@@ -409,10 +436,11 @@ $wgUseInstantCommons = false;
  * File backend structure configuration.
  * This is an array of file backend configuration arrays.
  * Each backend configuration has the following parameters:
- *     'name'        : A unique name for the backend
- *     'class'       : The file backend class to use
- *     'wikiId'      : A unique string that identifies the wiki (container prefix)
- *     'lockManager' : The name of a lock manager (see $wgLockManagers)
+ *  - 'name'        : A unique name for the backend
+ *  - 'class'       : The file backend class to use
+ *  - 'wikiId'      : A unique string that identifies the wiki (container prefix)
+ *  - 'lockManager' : The name of a lock manager (see $wgLockManagers)
+ *
  * Additional parameters are specific to the class used.
  */
 $wgFileBackends = array();
@@ -420,8 +448,8 @@ $wgFileBackends = array();
 /**
  * Array of configuration arrays for each lock manager.
  * Each backend configuration has the following parameters:
- *     'name'        : A unique name for the lock manger
- *     'class'       : The lock manger class to use
+ *  - 'name'        : A unique name for the lock manager
+ *  - 'class'       : The lock manger class to use
  * Additional parameters are specific to the class used.
  */
 $wgLockManagers = array();
@@ -430,12 +458,13 @@ $wgLockManagers = array();
  * Show EXIF data, on by default if available.
  * Requires PHP's EXIF extension: http://www.php.net/manual/en/ref.exif.php
  *
- * NOTE FOR WINDOWS USERS:
- * To enable EXIF functions, add the following lines to the
- * "Windows extensions" section of php.ini:
- *
+ * @note FOR WINDOWS USERS:
+ * To enable EXIF functions, add the following lines to the "Windows
+ * extensions" section of php.ini:
+ * @code{.ini}
  * extension=extensions/php_mbstring.dll
  * extension=extensions/php_exif.dll
+ * @endcode
  */
 $wgShowEXIF = function_exists( 'exif_read_data' );
 
@@ -460,44 +489,63 @@ $wgUpdateCompatibleMetadata = false;
  * $wgForeignFileRepos variable.
  */
 $wgUseSharedUploads = false;
+
 /** Full path on the web server where shared uploads can be found */
 $wgSharedUploadPath = "http://commons.wikimedia.org/shared/images";
+
 /** Fetch commons image description pages and display them on the local wiki? */
 $wgFetchCommonsDescriptions = false;
+
 /** Path on the file system where shared uploads can be found. */
 $wgSharedUploadDirectory = "/var/www/wiki3/images";
+
 /** DB name with metadata about shared directory. Set this to false if the uploads do not come from a wiki. */
 $wgSharedUploadDBname = false;
+
 /** Optional table prefix used in database. */
 $wgSharedUploadDBprefix = '';
+
 /** Cache shared metadata in memcached. Don't do this if the commons wiki is in a different memcached domain */
 $wgCacheSharedUploads = true;
+
 /**
-* Allow for upload to be copied from an URL. Requires Special:Upload?source=web
-* The timeout for copy uploads is set by $wgHTTPTimeout.
-*/
+ * Allow for upload to be copied from an URL.
+ * The timeout for copy uploads is set by $wgHTTPTimeout.
+ * You have to assign the user right 'upload_by_url' to a user group, to use this.
+ */
 $wgAllowCopyUploads = false;
+
 /**
  * Allow asynchronous copy uploads.
  * This feature is experimental and broken as of r81612.
  */
 $wgAllowAsyncCopyUploads = false;
+
 /**
  * A list of domains copy uploads can come from
  */
 $wgCopyUploadsDomains = array();
 
+/**
+ * Enable copy uploads from Special:Upload. $wgAllowCopyUploads must also be
+ * true. If $wgAllowCopyUploads is true, but this is false, you will only be
+ * able to perform copy uploads from the API or extensions (e.g. UploadWizard).
+ */
+$wgCopyUploadsFromSpecialUpload = false;
+
 /**
  * Max size for uploads, in bytes. If not set to an array, applies to all
  * uploads. If set to an array, per upload type maximums can be set, using the
  * file and url keys. If the * key is set this value will be used as maximum
  * for non-specified types.
  *
- * For example:
+ * @par Example:
+ * @code
  * $wgMaxUploadSize = array(
  *     '*' => 250 * 1024,
  *     'url' => 500 * 1024,
  * );
+ * @endcode
  * Sets the maximum for all uploads to 250 kB except for upload-by-url, which
  * will have a maximum of 500 kB.
  *
@@ -507,27 +555,37 @@ $wgMaxUploadSize = 1024*1024*100; # 100MB
 /**
  * Point the upload navigation link to an external URL
  * Useful if you want to use a shared repository by default
- * without disabling local uploads (use $wgEnableUploads = false for that)
- * e.g. $wgUploadNavigationUrl = 'http://commons.wikimedia.org/wiki/Special:Upload';
+ * without disabling local uploads (use $wgEnableUploads = false for that).
+ *
+ * @par Example:
+ * @code
+ * $wgUploadNavigationUrl = 'http://commons.wikimedia.org/wiki/Special:Upload';
+ * @endcode
  */
 $wgUploadNavigationUrl = false;
 
 /**
  * Point the upload link for missing files to an external URL, as with
- * $wgUploadNavigationUrl. The URL will get (?|&)wpDestFile=<filename>
+ * $wgUploadNavigationUrl. The URL will get "(?|&)wpDestFile=<filename>"
  * appended to it as appropriate.
  */
 $wgUploadMissingFileUrl = false;
 
 /**
- * Give a path here to use thumb.php for thumbnail generation on client request, instead of
- * generating them on render and outputting a static URL. This is necessary if some of your
- * apache servers don't have read/write access to the thumbnail path.
+ * Give a path here to use thumb.php for thumbnail generation on client
+ * request, instead of generating them on render and outputting a static URL.
+ * This is necessary if some of your apache servers don't have read/write
+ * access to the thumbnail path.
  *
- * Example:
+ * @par Example:
+ * @code
  *   $wgThumbnailScriptPath = "{$wgScriptPath}/thumb{$wgScriptExtension}";
+ * @endcode
  */
 $wgThumbnailScriptPath = false;
+/**
+ * @see $wgThumbnailScriptPath
+ */
 $wgSharedThumbnailScriptPath = false;
 
 /**
@@ -540,7 +598,8 @@ $wgSharedThumbnailScriptPath = false;
  * maintenance/rebuildImages.php to register them in the database. This is no
  * longer recommended, use maintenance/importImages.php instead.
  *
- * Note that this variable may be ignored if $wgLocalFileRepo is set.
+ * @note That this variable may be ignored if $wgLocalFileRepo is set.
+ * @todo Deprecate the setting and ultimately remove it from Core.
  */
 $wgHashedUploadDirectory = true;
 
@@ -565,13 +624,17 @@ $wgRepositoryBaseUrl = "http://commons.wikimedia.org/wiki/File:";
  * This is the list of preferred extensions for uploading files. Uploading files
  * with extensions not in this list will trigger a warning.
  *
- * WARNING: If you add any OpenOffice or Microsoft Office file formats here,
+ * @warning If you add any OpenOffice or Microsoft Office file formats here,
  * such as odt or doc, and untrusted users are allowed to upload files, then
  * your wiki will be vulnerable to cross-site request forgery (CSRF).
  */
 $wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' );
 
-/** Files with these extensions will never be allowed as uploads. */
+/**
+ * Files with these extensions will never be allowed as uploads.
+ * An array of file extensions to blacklist. You should append to this array
+ * if you want to blacklist additional files.
+ * */
 $wgFileBlacklist = array(
        # HTML may contain cookie-stealing JavaScript and web bugs
        'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
@@ -609,7 +672,7 @@ $wgAllowJavaUploads = false;
 /**
  * This is a flag to determine whether or not to check file extensions on upload.
  *
- * WARNING: setting this to false is insecure for public wikis.
+ * @warning Setting this to false is insecure for public wikis.
  */
 $wgCheckFileExtensions = true;
 
@@ -617,18 +680,21 @@ $wgCheckFileExtensions = true;
  * If this is turned off, users may override the warning for files not covered
  * by $wgFileExtensions.
  *
- * WARNING: setting this to false is insecure for public wikis.
+ * @warning Setting this to false is insecure for public wikis.
  */
 $wgStrictFileExtensions = true;
 
 /**
  * Setting this to true will disable the upload system's checks for HTML/JavaScript.
- * THIS IS VERY DANGEROUS on a publicly editable site, so USE wgGroupPermissions
- * TO RESTRICT UPLOADING to only those that you trust
+ *
+ * @warning THIS IS VERY DANGEROUS on a publicly editable site, so USE
+ * $wgGroupPermissions TO RESTRICT UPLOADING to only those that you trust
  */
 $wgDisableUploadScriptChecks = false;
 
-/** Warn if uploaded files are larger than this (in bytes), or false to disable*/
+/**
+ * Warn if uploaded files are larger than this (in bytes), or false to disable
+ */
 $wgUploadSizeWarning = false;
 
 /**
@@ -655,18 +721,18 @@ $wgTrustedMediaFormats = array(
  * Each entry in the array maps a MIME type to a class name
  */
 $wgMediaHandlers = array(
-       'image/jpeg' => 'JpegHandler',
-       'image/png' => 'PNGHandler',
-       'image/gif' => 'GIFHandler',
-       'image/tiff' => 'TiffHandler',
+       'image/jpeg'     => 'JpegHandler',
+       'image/png'      => 'PNGHandler',
+       'image/gif'      => 'GIFHandler',
+       'image/tiff'     => 'TiffHandler',
        'image/x-ms-bmp' => 'BmpHandler',
-       'image/x-bmp' => 'BmpHandler',
-       'image/x-xcf' => 'XCFHandler',
-       'image/svg+xml' => 'SvgHandler', // official
-       'image/svg' => 'SvgHandler', // compat
+       'image/x-bmp'    => 'BmpHandler',
+       'image/x-xcf'    => 'XCFHandler',
+       'image/svg+xml'  => 'SvgHandler', // official
+       'image/svg'      => 'SvgHandler', // compat
        'image/vnd.djvu' => 'DjVuHandler', // official
-       'image/x.djvu' => 'DjVuHandler', // compat
-       'image/x-djvu' => 'DjVuHandler', // compat
+       'image/x.djvu'   => 'DjVuHandler', // compat
+       'image/x-djvu'   => 'DjVuHandler', // compat
 );
 
 /**
@@ -700,17 +766,18 @@ $wgImageMagickTempDir = false;
  * %s will be replaced with the source path, %d with the destination
  * %w and %h will be replaced with the width and height.
  *
- * Example for GraphicMagick:
- * <code>
+ * @par Example for GraphicMagick:
+ * @code
  * $wgCustomConvertCommand = "gm convert %s -resize %wx%h %d"
- * </code>
+ * @endcode
  *
  * Leave as false to skip this.
  */
 $wgCustomConvertCommand = false;
 
 /**
- * Some tests and extensions use exiv2 to manipulate the EXIF metadata in some image formats.
+ * Some tests and extensions use exiv2 to manipulate the EXIF metadata in some
+ * image formats.
  */
 $wgExiv2Command = '/usr/bin/exiv2';
 
@@ -732,22 +799,31 @@ $wgSVGConverters = array(
        'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
        'ImagickExt' => array( 'SvgHandler::rasterizeImagickExt' ),
        );
+
 /** Pick a converter defined in $wgSVGConverters */
 $wgSVGConverter = 'ImageMagick';
+
 /** If not in the executable PATH, specify the SVG converter path. */
 $wgSVGConverterPath = '';
+
 /** Don't scale a SVG larger than this */
 $wgSVGMaxSize = 2048;
+
 /** Don't read SVG metadata beyond this point.
- * Default is 1024*256 bytes */
+ * Default is 1024*256 bytes
+ */
 $wgSVGMetadataCutoff = 262144;
 
 /**
- * MediaWiki will reject HTMLesque tags in uploaded files due to idiotic browsers which can't
- * perform basic stuff like MIME detection and which are vulnerable to further idiots uploading
- * crap files as images. When this directive is on, <title> will be allowed in files with
- * an "image/svg+xml" MIME type. You should leave this disabled if your web server is misconfigured
- * and doesn't send appropriate MIME types for SVG images.
+ * Disallow <title> element in SVG files.
+ *
+ * MediaWiki will reject HTMLesque tags in uploaded files due to idiotic
+ * browsers which can not perform basic stuff like MIME detection and which are
+ * vulnerable to further idiots uploading crap files as images.
+ *
+ * When this directive is on, "<title>" will be allowed in files with an
+ * "image/svg+xml" MIME type. You should leave this disabled if your web server
+ * is misconfigured and doesn't send appropriate MIME types for SVG images.
  */
 $wgAllowTitlesInSVG = false;
 
@@ -777,13 +853,13 @@ $wgMaxAnimatedGifArea = 1.25e7;
  * For inline display, we need to convert to PNG or JPEG.
  * Note scaling should work with ImageMagick, but may not with GD scaling.
  *
- * Example:
- * <code>
+ * @par Example:
+ * @code
  *  // PNG is lossless, but inefficient for photos
  *  $wgTiffThumbnailType = array( 'png', 'image/png' );
  *  // JPEG is good for photos, but has no transparency support. Bad for diagrams.
  *  $wgTiffThumbnailType = array( 'jpg', 'image/jpeg' );
- * </code>
+ * @endcode
  */
  $wgTiffThumbnailType = false;
 
@@ -796,7 +872,7 @@ $wgMaxAnimatedGifArea = 1.25e7;
 $wgThumbnailEpoch = '20030516000000';
 
 /**
- * If set, inline scaled images will still produce <img> tags ready for
+ * If set, inline scaled images will still produce "<img>" tags ready for
  * output instead of showing an error message.
  *
  * This may be useful if errors are transitory, especially if the site
@@ -888,20 +964,6 @@ $wgAntivirusSetup = array(
 
                'messagepattern' => '/.*?:(.*)/sim',
        ),
-
-       #setup for f-prot
-       'f-prot' => array (
-               'command' => "f-prot ",
-
-               'codemap' => array (
-                       "0" => AV_NO_VIRUS, # no virus
-                       "3" => AV_VIRUS_FOUND, # virus found
-                       "6" => AV_VIRUS_FOUND, # virus found
-                       "*" => AV_SCAN_FAILED, # else scan failed
-               ),
-
-               'messagepattern' => '/.*?Infection:(.*)$/m',
-       ),
 );
 
 
@@ -931,10 +993,11 @@ $wgLoadFileinfoExtension = false;
  * the mime type to standard output.
  * The name of the file to process will be appended to the command given here.
  * If not set or NULL, mime_content_type will be used if available.
- * Example:
- * <code>
+ *
+ * @par Example:
+ * @code
  * #$wgMimeDetectorCommand = "file -bi"; # use external mime detector (Linux)
- * </code>
+ * @endcode
  */
 $wgMimeDetectorCommand = null;
 
@@ -988,7 +1051,7 @@ $wgThumbLimits = array(
 );
 
 /**
- * Default parameters for the <gallery> tag
+ * Default parameters for the "<gallery>" tag
  */
 $wgGalleryOptions = array (
        'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize
@@ -1011,7 +1074,10 @@ $wgThumbUpright = 0.75;
 $wgDirectoryMode = 0777;
 
 /**
- * DJVU settings
+ * @name DJVU settings
+ * @{
+ */
+/**
  * Path of the djvudump executable
  * Enable this and $wgDjvuRenderer to enable djvu rendering
  */
@@ -1036,15 +1102,18 @@ $wgDjvuTxt = null;
  * Path of the djvutoxml executable
  * This works like djvudump except much, much slower as of version 3.5.
  *
- * For now I recommend you use djvudump instead. The djvuxml output is
+ * For now we  recommend you use djvudump instead. The djvuxml output is
  * probably more stable, so we'll switch back to it as soon as they fix
  * the efficiency problem.
  * http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
+ *
+ * @par Example:
+ * @code
+ * $wgDjvuToXML = 'djvutoxml';
+ * @endcode
  */
-# $wgDjvuToXML = 'djvutoxml';
 $wgDjvuToXML = null;
 
-
 /**
  * Shell command for the DJVU post processor
  * Default: pnmtopng, since ddjvu generates ppm output
@@ -1055,6 +1124,7 @@ $wgDjvuPostProcessor = 'pnmtojpeg';
  * File extension for the DJVU post processor output
  */
 $wgDjvuOutputExtension = 'jpg';
+/** @} */ # end of DJvu }
 
 /** @} */ # end of file uploads }
 
@@ -1131,17 +1201,21 @@ $wgNewPasswordExpiry = 3600 * 24 * 7;
 $wgUserEmailConfirmationTokenExpiry = 7 * 24 * 60 * 60;
 
 /**
- * SMTP Mode
+ * SMTP Mode.
+ *
  * For using a direct (authenticated) SMTP server connection.
  * Default to false or fill an array :
- * <code>
- * "host" => 'SMTP domain',
- * "IDHost" => 'domain for MessageID',
- * "port" => "25",
- * "auth" => true/false,
- * "username" => user,
- * "password" => password
- * </code>
+ *
+ * @code
+ * $wgSMTP = array(
+ *     'host'     => 'SMTP domain',
+ *     'IDHost'   => 'domain for MessageID',
+ *     'port'     => '25',
+ *     'auth'     => [true|false],
+ *     'username' => [SMTP username],
+ *     'password' => [SMTP password],
+ * );
+ * @endcode
  */
 $wgSMTP = false;
 
@@ -1163,9 +1237,9 @@ $wgEnotifFromEditor = false;
 # It call this to be a "user-preferences-option (UPO)"
 
 /**
- * Require email authentication before sending mail to an email addres. This is
- * highly recommended. It prevents MediaWiki from being used as an open spam
- * relay.
+ * Require email authentication before sending mail to an email address.
+ * This is highly recommended. It prevents MediaWiki from being used as an open
+ * spam relay.
  */
 $wgEmailAuthentication = true;
 
@@ -1243,6 +1317,10 @@ $wgDBuser = 'wikiuser';
 $wgDBpassword = '';
 /** Database type */
 $wgDBtype = 'mysql';
+/** Whether to use SSL in DB connection. */
+$wgDBssl = false;
+/** Whether to use compression in DB connection. */
+$wgDBcompress = false;
 
 /** Separate username for maintenance tasks. Leave as null to use the default. */
 $wgDBadminuser = null;
@@ -1328,6 +1406,8 @@ $wgSharedTables = array( 'user', 'user_properties' );
  *                  - DBO_IGNORE -- ignore errors (not useful in LocalSettings.php)
  *                  - DBO_NOBUFFER -- turn off buffering (not useful in LocalSettings.php)
  *                  - DBO_PERSISTENT -- enables persistent database connections
+ *                  - DBO_SSL -- uses SSL/TLS encryption in database connections, if available
+ *                  - DBO_COMPRESS -- uses internal compression in database connections, if available
  *
  *   - max lag:     (optional) Maximum replication lag before a slave will taken out of rotation
  *   - max threads: (optional) Maximum number of running threads
@@ -1344,9 +1424,9 @@ $wgSharedTables = array( 'user', 'user_properties' );
  * accidental misconfiguration or MediaWiki bugs, set read_only=1 on all your
  * slaves in my.cnf. You can set read_only mode at runtime using:
  *
- * <code>
+ * @code
  *     SET @@read_only=1;
- * </code>
+ * @endcode
  *
  * Since the effect of writing to a slave is so damaging and difficult to clean
  * up, we at Wikimedia set read_only=1 in my.cnf on all our DB servers, even
@@ -1372,12 +1452,33 @@ $wgMasterWaitTimeout = 10;
 /** File to log database errors to */
 $wgDBerrorLog = false;
 
+/**
+ * Timezone to use in the error log.
+ * Defaults to the wiki timezone ($wgLocalTimezone).
+ *
+ * A list of useable timezones can found at:
+ * http://php.net/manual/en/timezones.php
+ *
+ * @par Examples:
+ * @code
+ * $wgLocaltimezone = 'UTC';
+ * $wgLocaltimezone = 'GMT';
+ * $wgLocaltimezone = 'PST8PDT';
+ * $wgLocaltimezone = 'Europe/Sweden';
+ * $wgLocaltimezone = 'CET';
+ * @endcode
+ *
+ * @since 1.20
+ */
+$wgDBerrorLogTZ = false;
+
 /** When to give an error message */
 $wgDBClusterTimeout = 10;
 
 /**
- * Scale load balancer polling time so that under overload conditions, the database server
- * receives a SHOW STATUS query at an average interval of this many microseconds
+ * Scale load balancer polling time so that under overload conditions, the
+ * database server receives a SHOW STATUS query at an average interval of this
+ * many microseconds
  */
 $wgDBAvgStatusPoll = 2000;
 
@@ -1385,7 +1486,7 @@ $wgDBAvgStatusPoll = 2000;
  * Set to true to engage MySQL 4.1/5.0 charset-related features;
  * for now will just cause sending of 'SET NAMES=utf8' on connect.
  *
- * WARNING: THIS IS EXPERIMENTAL!
+ * @warning THIS IS EXPERIMENTAL!
  *
  * May break if you're not using the table defs from mysql5/tables.sql.
  * May break if you're upgrading an existing wiki if set differently.
@@ -1438,19 +1539,30 @@ $wgCompressRevisions = false;
 
 /**
  * External stores allow including content
- * from non database sources following URL links
+ * from non database sources following URL links.
  *
  * Short names of ExternalStore classes may be specified in an array here:
+ * @code
  * $wgExternalStores = array("http","file","custom")...
+ * @endcode
  *
  * CAUTION: Access to database might lead to code execution
  */
 $wgExternalStores = false;
 
 /**
- * An array of external mysql servers, e.g.
- * $wgExternalServers = array( 'cluster1' => array( 'srv28', 'srv29', 'srv30' ) );
- * Used by LBFactory_Simple, may be ignored if $wgLBFactoryConf is set to another class.
+ * An array of external MySQL servers.
+ *
+ * @par Example:
+ * Create a cluster named 'cluster1' containing three servers:
+ * @code
+ * $wgExternalServers = array(
+ *     'cluster1' => array( 'srv28', 'srv29', 'srv30' )
+ * );
+ * @endcode
+ *
+ * Used by LBFactory_Simple, may be ignored if $wgLBFactoryConf is set to
+ * another class.
  */
 $wgExternalServers = array();
 
@@ -1459,9 +1571,12 @@ $wgExternalServers = array();
  * Part of a URL, e.g. DB://cluster1
  *
  * Can be an array instead of a single string, to enable data distribution. Keys
- * must be consecutive integers, starting at zero. Example:
+ * must be consecutive integers, starting at zero.
  *
+ * @par Example:
+ * @code
  * $wgDefaultExternalStore = array( 'DB://cluster1', 'DB://cluster2' );
+ * @endcode
  *
  * @var array
  */
@@ -1501,17 +1616,10 @@ $wgUseDumbLinkUpdate = false;
 
 /**
  * Anti-lock flags - bitfield
- *   - ALF_PRELOAD_LINKS:
- *       Preload links during link update for save
- *   - ALF_PRELOAD_EXISTENCE:
- *       Preload cur_id during replaceLinkHolders
  *   - ALF_NO_LINK_LOCK:
  *       Don't use locking reads when updating the link table. This is
  *       necessary for wikis with a high edit rate for performance
  *       reasons, but may cause link table inconsistency
- *   - ALF_NO_BLOCK_LOCK:
- *       As for ALF_LINK_LOCK, this flag is a necessity for high-traffic
- *       wikis.
  */
 $wgAntiLockFlags = 0;
 
@@ -1581,6 +1689,13 @@ $wgMessageCacheType = CACHE_ANYTHING;
  */
 $wgParserCacheType = CACHE_ANYTHING;
 
+/**
+ * The cache type for storing session data. Used if $wgSessionsInObjectCache is true.
+ *
+ * For available types see $wgMainCacheType.
+ */
+$wgSessionCacheType = CACHE_ANYTHING;
+
 /**
  * The cache type for storing language conversion tables,
  * which are used when parsing certain text and interface messages.
@@ -1624,23 +1739,38 @@ $wgObjectCaches = array(
 );
 
 /**
- * The expiry time for the parser cache, in seconds. The default is 86.4k
- * seconds, otherwise known as a day.
+ * The expiry time for the parser cache, in seconds.
+ * The default is 86400 (one day).
  */
 $wgParserCacheExpireTime = 86400;
 
 /**
- * Select which DBA handler <http://www.php.net/manual/en/dba.requirements.php> to use as CACHE_DBA backend
+ * Select which DBA handler <http://www.php.net/manual/en/dba.requirements.php>
+ * to use as CACHE_DBA backend.
  */
 $wgDBAhandler = 'db3';
 
 /**
- * Store sessions in MemCached. This can be useful to improve performance, or to
- * avoid the locking behaviour of PHP's default session handler, which tends to
- * prevent multiple requests for the same user from acting concurrently.
+ * Deprecated alias for $wgSessionsInObjectCache.
+ *
+ * @deprecated Use $wgSessionsInObjectCache
  */
 $wgSessionsInMemcached = false;
 
+/**
+ * Store sessions in an object cache, configured by $wgSessionCacheType. This
+ * can be useful to improve performance, or to avoid the locking behaviour of
+ * PHP's default session handler, which tends to prevent multiple requests for
+ * the same user from acting concurrently.
+ */
+$wgSessionsInObjectCache = false;
+
+/**
+ * The expiry time to use for session storage when $wgSessionsInObjectCache is
+ * enabled, in seconds.
+ */
+$wgObjectCacheSessionExpiry = 3600;
+
 /**
  * This is used for setting php's session.save_handler. In practice, you will
  * almost never need to change this ever. Other options might be 'user' or
@@ -1664,7 +1794,7 @@ $wgMemCachedPersistent = false;
 /**
  * Read/write timeout for MemCached server communication, in microseconds.
  */
-$wgMemCachedTimeout = 100000;
+$wgMemCachedTimeout = 500000;
 
 /**
  * Set this to true to make a local copy of the message cache, for use in
@@ -1673,9 +1803,9 @@ $wgMemCachedTimeout = 100000;
 $wgUseLocalMessageCache = false;
 
 /**
- * Defines format of local cache
- * true - Serialized object
- * false - PHP source file (Warning - security risk)
+ * Defines format of local cache.
+ *  - true: Serialized object
+ *  - false: PHP source file (Warning - security risk)
  */
 $wgLocalMessageCacheSerialized = true;
 
@@ -1688,23 +1818,23 @@ $wgAdaptiveMessageCache = false;
 
 /**
  * Localisation cache configuration. Associative array with keys:
- *     class:       The class to use. May be overridden by extensions.
+ * class:       The class to use. May be overridden by extensions.
  *
- *     store:       The location to store cache data. May be 'files', 'db' or
- *                  'detect'. If set to "files", data will be in CDB files. If set
- *                  to "db", data will be stored to the database. If set to
- *                  "detect", files will be used if $wgCacheDirectory is set,
- *                  otherwise the database will be used.
+ * store:       The location to store cache data. May be 'files', 'db' or
+ *              'detect'. If set to "files", data will be in CDB files. If set
+ *              to "db", data will be stored to the database. If set to
+ *              "detect", files will be used if $wgCacheDirectory is set,
+ *              otherwise the database will be used.
  *
- *     storeClass:  The class name for the underlying storage. If set to a class
- *                  name, it overrides the "store" setting.
+ * storeClass:  The class name for the underlying storage. If set to a class
+ *              name, it overrides the "store" setting.
  *
- *     storeDirectory:  If the store class puts its data in files, this is the
- *                      directory it will use. If this is false, $wgCacheDirectory
- *                      will be used.
+ * storeDirectory:  If the store class puts its data in files, this is the
+ *                  directory it will use. If this is false, $wgCacheDirectory
+ *                  will be used.
  *
- *     manualRecache:   Set this to true to disable cache updates on web requests.
- *                      Use maintenance/rebuildLocalisationCache.php instead.
+ * manualRecache:   Set this to true to disable cache updates on web requests.
+ *                  Use maintenance/rebuildLocalisationCache.php instead.
  */
 $wgLocalisationCacheConf = array(
        'class' => 'LocalisationCache',
@@ -1719,14 +1849,17 @@ $wgCachePages = true;
 
 /**
  * Set this to current time to invalidate all prior cached pages. Affects both
- * client- and server-side caching.
+ * client-side and server-side caching.
  * You can get the current date on your server by using the command:
+ * @verbatim
  *   date +%Y%m%d%H%M%S
+ * @endverbatim
  */
 $wgCacheEpoch = '20030516000000';
 
 /**
  * Bump this number when changing the global style sheets and JavaScript.
+ *
  * It should be appended in the query string of static CSS and JS includes,
  * to ensure that client-side caches do not keep obsolete copies of global
  * styles.
@@ -1742,12 +1875,6 @@ $wgStyleVersion = '303';
  */
 $wgUseFileCache = false;
 
-/**
- * Directory where the cached page will be saved.
- * Will default to "{$wgUploadDirectory}/cache" in Setup.php
- */
-$wgFileCacheDirectory = false;
-
 /**
  * Depth of the subdirectory hierarchy to be created under
  * $wgFileCacheDirectory.  The subdirectories will be named based on
@@ -1858,10 +1985,12 @@ $wgUseXVO = false;
 $wgVaryOnXFP = false;
 
 /**
- * Internal server name as known to Squid, if different. Example:
- * <code>
+ * Internal server name as known to Squid, if different.
+ *
+ * @par Example:
+ * @code
  * $wgInternalServer = 'http://yourinternal.tld:8000';
- * </code>
+ * @endcode
  */
 $wgInternalServer = false;
 
@@ -1909,6 +2038,7 @@ $wgMaxSquidPurgeTitles = 400;
  *
  * Example configuration to send purges for upload.wikimedia.org to one
  * multicast group and all other purges to another:
+ * @code
  * $wgHTCPMulticastRouting = array(
  *         '|^https?://upload\.wikimedia\.org|' => array(
  *                 'host' => '239.128.0.113',
@@ -1919,6 +2049,7 @@ $wgMaxSquidPurgeTitles = 400;
  *                 'port' => 4827,
  *         ),
  * );
+ * @endcode
  *
  * @see $wgHTCPMulticastTTL
  */
@@ -1967,11 +2098,12 @@ $wgLanguageCode = 'en';
 
 /**
  * Some languages need different word forms, usually for different cases.
- * Used in Language::convertGrammar(). Example:
+ * Used in Language::convertGrammar().
  *
- * <code>
+ * @par Example:
+ * @code
  * $wgGrammarForms['en']['genitive']['car'] = 'car\'s';
- * </code>
+ * @endcode
  */
 $wgGrammarForms = array();
 
@@ -2054,7 +2186,7 @@ $wgAllUnicodeFixes = false;
  * converting a wiki from MediaWiki 1.4 or earlier to UTF-8 without the
  * burdensome mass conversion of old text data.
  *
- * NOTE! This DOES NOT touch any fields other than old_text.Titles, comments,
+ * @note This DOES NOT touch any fields other than old_text. Titles, comments,
  * user names, etc still must be converted en masse in the database before
  * continuing as a UTF-8 wiki.
  */
@@ -2163,28 +2295,27 @@ $wgCanonicalLanguageLinks = true;
 $wgDefaultLanguageVariant = false;
 
 /**
- * Disabled variants array of language variant conversion. Example:
- * <code>
+ * Disabled variants array of language variant conversion.
+ *
+ * @par Example:
+ * @code
  *  $wgDisabledVariants[] = 'zh-mo';
  *  $wgDisabledVariants[] = 'zh-my';
- * </code>
- *
- * or:
- *
- * <code>
- *  $wgDisabledVariants = array('zh-mo', 'zh-my');
- * </code>
+ * @endcode
  */
 $wgDisabledVariants = array();
 
 /**
  * Like $wgArticlePath, but on multi-variant wikis, this provides a
  * path format that describes which parts of the URL contain the
- * language variant.  For Example:
+ * language variant.
  *
- *   $wgLanguageCode = 'sr';
- *   $wgVariantArticlePath = '/$2/$1';
- *   $wgArticlePath = '/wiki/$1';
+ * @par Example:
+ * @code
+ *     $wgLanguageCode = 'sr';
+ *     $wgVariantArticlePath = '/$2/$1';
+ *     $wgArticlePath = '/wiki/$1';
+ * @endcode
  *
  * A link to /wiki/ would be redirected to /sr/Главна_страна
  *
@@ -2201,19 +2332,23 @@ $wgVariantArticlePath = false;
 $wgLoginLanguageSelector = false;
 
 /**
- * When translating messages with wfMsg(), it is not always clear what should
- * be considered UI messages and what should be content messages.
+ * When translating messages with wfMessage(), it is not always clear what
+ * should be considered UI messages and what should be content messages.
  *
  * For example, for the English Wikipedia, there should be only one 'mainpage',
  * so when getting the link for 'mainpage', we should treat it as site content
- * and call wfMsgForContent(), but for rendering the text of the link, we call
- * wfMsg(). The code behaves this way by default. However, sites like the
- * Wikimedia Commons do offer different versions of 'mainpage' and the like for
- * different languages. This array provides a way to override the default
- * behavior. For example, to allow language-specific main page and community
- * portal, set
- *
- * $wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' );
+ * and call ->inContentLanguage()->text(), but for rendering the text of the
+ * link, we call ->text(). The code behaves this way by default. However,
+ * sites like the Wikimedia Commons do offer different versions of 'mainpage'
+ * and the like for different languages. This array provides a way to override
+ * the default behavior.
+ *
+ * @par Example:
+ * To allow language-specific main page and community
+ * portal:
+ * @code
+ *     $wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' );
+ * @endcode
  */
 $wgForceUIMsgAsContentMsg = array();
 
@@ -2228,13 +2363,17 @@ $wgForceUIMsgAsContentMsg = array();
  * Timezones can be translated by editing MediaWiki messages of type
  * timezone-nameinlowercase like timezone-utc.
  *
- * Examples:
- * <code>
+ * A list of useable timezones can found at:
+ * http://php.net/manual/en/timezones.php
+ *
+ * @par Examples:
+ * @code
+ * $wgLocaltimezone = 'UTC';
  * $wgLocaltimezone = 'GMT';
  * $wgLocaltimezone = 'PST8PDT';
  * $wgLocaltimezone = 'Europe/Sweden';
  * $wgLocaltimezone = 'CET';
- * </code>
+ * @endcode
  */
 $wgLocaltimezone = null;
 
@@ -2255,7 +2394,7 @@ $wgLocalTZoffset = null;
  * language variant conversion is disabled in interface messages. Setting this
  * to true re-enables it.
  *
- * This variable should be removed (implicitly false) in 1.20 or earlier.
+ * @todo This variable should be removed (implicitly false) in 1.20 or earlier.
  */
 $wgBug34832TransitionalRollback = true;
 
@@ -2352,10 +2491,14 @@ $wgWellFormedXml = true;
 
 /**
  * Permit other namespaces in addition to the w3.org default.
- * Use the prefix for the key and the namespace for the value. For
- * example:
+ *
+ * Use the prefix for the key and the namespace for the value.
+ *
+ * @par Example:
+ * @code
  * $wgXhtmlNamespaces['svg'] = 'http://www.w3.org/2000/svg';
- * Normally we wouldn't have to define this in the root <html>
+ * @endCode
+ * Normally we wouldn't have to define this in the root "<html>"
  * element, but IE needs it there in some circumstances.
  *
  * This is ignored if $wgHtml5 is true, for the same reason as
@@ -2366,7 +2509,7 @@ $wgXhtmlNamespaces = array();
 /**
  * Show IP address, for non-logged in users. It's necessary to switch this off
  * for some forms of caching.
- * Will disable file cache.
+ * @warning Will disable file cache.
  */
 $wgShowIPinHeader = true;
 
@@ -2525,15 +2668,16 @@ $wgExperimentalHtmlIds = false;
  * The value should be either a string or an array. If it is a string it will be output
  * directly as html, however some skins may choose to ignore it. An array is the preferred format
  * for the icon, the following keys are used:
- *   src: An absolute url to the image to use for the icon, this is recommended
+ *  - src: An absolute url to the image to use for the icon, this is recommended
  *        but not required, however some skins will ignore icons without an image
- *   url: The url to use in the <a> arround the text or icon, if not set an <a> will not be outputted
- *   alt: This is the text form of the icon, it will be displayed without an image in
+ * - url: The url to use in the a element arround the text or icon, if not set an a element will not be outputted
+ * - alt: This is the text form of the icon, it will be displayed without an image in
  *        skins like Modern or if src is not set, and will otherwise be used as
  *        the alt="" for the image. This key is required.
- *   width and height: If the icon specified by src is not of the standard size
+ * - width and height: If the icon specified by src is not of the standard size
  *                     you can specify the size of image to use with these keys.
  *                     Otherwise they will default to the standard 88x31.
+ * @todo Reformat documentation.
  */
 $wgFooterIcons = array(
        "copyright" => array(
@@ -2549,23 +2693,24 @@ $wgFooterIcons = array(
 );
 
 /**
- * Login / create account link behavior when it's possible for anonymous users to create an account
- * true = use a combined login / create account link
- * false = split login and create account into two separate links
+ * Login / create account link behavior when it's possible for anonymous users
+ * to create an account.
+ *  - true = use a combined login / create account link
+ *  - false = split login and create account into two separate links
  */
 $wgUseCombinedLoginLink = true;
 
 /**
- * Search form behavior for Vector skin only
- * true = use an icon search button
- * false = use Go & Search buttons
+ * Search form behavior for Vector skin only.
+ *  - true = use an icon search button
+ *  - false = use Go & Search buttons
  */
 $wgVectorUseSimpleSearch = false;
 
 /**
- * Watch and unwatch as an icon rather than a link for Vector skin only
- * true = use an icon watch/unwatch button
- * false = use watch/unwatch text link
+ * Watch and unwatch as an icon rather than a link for Vector skin only.
+ *  - true = use an icon watch/unwatch button
+ *  - false = use watch/unwatch text link
  */
 $wgVectorUseIconWatch = false;
 
@@ -2595,6 +2740,14 @@ $wgBetterDirectionality = true;
  */
 $wgSend404Code = true;
 
+
+/**
+ * The $wgShowRollbackEditCount variable is used to show how many edits will be
+ * rollback. The numeric value of the varible are the limit up to are counted.
+ * If the value is false or 0, the edits are not counted.
+ */
+$wgShowRollbackEditCount = 10;
+
 /** @} */ # End of output format settings }
 
 /*************************************************************************//**
@@ -2603,17 +2756,21 @@ $wgSend404Code = true;
  */
 
 /**
- * Client-side resource modules. Extensions should add their module definitions
- * here.
+ * Client-side resource modules.
+ *
+ * Extensions should add their resource loader module definitions
+ * to the $wgResourceModules variable.
  *
- * Example:
+ * @par Example:
+ * @code
  *   $wgResourceModules['ext.myExtension'] = array(
  *      'scripts' => 'myExtension.js',
  *      'styles' => 'myExtension.css',
  *      'dependencies' => array( 'jquery.cookie', 'jquery.tabIndex' ),
- *      'localBasePath' => dirname( __FILE__ ),
+ *      'localBasePath' => __DIR__,
  *      'remoteExtPath' => 'MyExtension',
  *   );
+ * @endcode
  */
 $wgResourceModules = array();
 
@@ -2622,22 +2779,26 @@ $wgResourceModules = array();
  * built-in source that is not in this array, but defined by
  * ResourceLoader::__construct() so that it cannot be unset.
  *
- * Example:
+ * @par Example:
+ * @code
  *   $wgResourceLoaderSources['foo'] = array(
  *       'loadScript' => 'http://example.org/w/load.php',
  *       'apiScript' => 'http://example.org/w/api.php'
  *   );
+ * @endcode
  */
 $wgResourceLoaderSources = array();
 
 /**
- * Default 'remoteBasePath' value for resource loader modules.
+ * Default 'remoteBasePath' value for instances of ResourceLoaderFileModule.
  * If not set, then $wgScriptPath will be used as a fallback.
  */
 $wgResourceBasePath = null;
 
 /**
- * Maximum time in seconds to cache resources served by the resource loader
+ * Maximum time in seconds to cache resources served by the resource loader.
+ *
+ * @todo Document array structure
  */
 $wgResourceLoaderMaxage = array(
        'versioned' => array(
@@ -2653,8 +2814,9 @@ $wgResourceLoaderMaxage = array(
 );
 
 /**
- * The default debug mode (on/off) for of ResourceLoader requests. This will still
- * be overridden when the debug URL parameter is used.
+ * The default debug mode (on/off) for of ResourceLoader requests.
+ *
+ * This will still be overridden when the debug URL parameter is used.
  */
 $wgResourceLoaderDebug = false;
 
@@ -2680,33 +2842,54 @@ $wgResourceLoaderMinifierMaxLineLength = 1000;
 
 /**
  * Whether to include the mediawiki.legacy JS library (old wikibits.js), and its
- * dependencies
+ * dependencies.
  */
 $wgIncludeLegacyJavaScript = true;
 
 /**
- * Whether to preload the mediawiki.util module as blocking module in the top queue.
- * Before MediaWiki 1.19, modules used to load slower/less asynchronous which allowed
- * modules to lack dependencies on 'popular' modules that were likely loaded already.
+ * Whether to preload the mediawiki.util module as blocking module in the top
+ * queue.
+ *
+ * Before MediaWiki 1.19, modules used to load slower/less asynchronous which
+ * allowed modules to lack dependencies on 'popular' modules that were likely
+ * loaded already.
+ *
  * This setting is to aid scripts during migration by providing mediawiki.util
  * unconditionally (which was the most commonly missed dependency).
- * It doesn't cover all missing dependencies obviously but should fix most of them.
+ * It doesn't cover all missing dependencies obviously but should fix most of
+ * them.
+ *
  * This should be removed at some point after site/user scripts have been fixed.
- * Enable this if your wiki has a large amount of user/site scripts that are lacking
- * dependencies.
+ * Enable this if your wiki has a large amount of user/site scripts that are
+ * lacking dependencies.
+ * @todo Deprecate
  */
 $wgPreloadJavaScriptMwUtil = false;
 
 /**
- * Whether or not to assing configuration variables to the global window object.
- * If this is set to false, old code using deprecated variables like:
- * " if ( window.wgRestrictionEdit ) ..."
+ * Whether or not to assign configuration variables to the global window object.
+ *
+ * If this is set to false, old code using deprecated variables will no longer
+ * work.
+ *
+ * @par Example of legacy code:
+ * @code{,js}
+ *     if ( window.wgRestrictionEdit ) { ... }
+ * @endcode
  * or:
- * " if ( wgIsArticle ) ..."
- * will no longer work and needs to use mw.config instead. For example:
- * " if ( mw.config.exists('wgRestrictionEdit') )"
- * or
- * " if ( mw.config.get('wgIsArticle') )".
+ * @code{,js}
+ *     if ( wgIsArticle ) { ... }
+ * @endcode
+ *
+ * Instead, one needs to use mw.config.
+ * @par Example using mw.config global configuration:
+ * @code{,js}
+ *     if ( mw.config.exists('wgRestrictionEdit') ) { ... }
+ * @endcode
+ * or:
+ * @code{,js}
+ *     if ( mw.config.get('wgIsArticle') ) { ... }
+ * @endcode
  */
 $wgLegacyJavaScriptGlobals = true;
 
@@ -2724,8 +2907,8 @@ $wgLegacyJavaScriptGlobals = true;
 $wgResourceLoaderMaxQueryLength = -1;
 
 /**
- * If set to true, JavaScript modules loaded from wiki pages will be parsed prior
- * to minification to validate it.
+ * If set to true, JavaScript modules loaded from wiki pages will be parsed
+ * prior to minification to validate it.
  *
  * Parse errors will result in a JS exception being thrown during module load,
  * which avoids breaking other modules loaded in the same request.
@@ -2743,7 +2926,7 @@ $wgResourceLoaderValidateJS = true;
 $wgResourceLoaderValidateStaticJS = false;
 
 /**
- * If set to true, asynchronous loading of bottom-queue scripts in the <head>
+ * If set to true, asynchronous loading of bottom-queue scripts in the "<head>"
  * will be enabled. This is an experimental feature that's supposed to make
  * JavaScript load faster.
  */
@@ -2779,19 +2962,25 @@ $wgMetaNamespaceTalk = false;
  * names of existing namespaces. Extensions developers should use
  * $wgCanonicalNamespaceNames.
  *
- * PLEASE  NOTE: Once you delete a namespace, the pages in that namespace will
+ * @warning Once you delete a namespace, the pages in that namespace will
  * no longer be accessible. If you rename it, then you can access them through
  * the new namespace name.
  *
  * Custom namespaces should start at 100 to avoid conflicting with standard
  * namespaces, and should always follow the even/odd main/talk pattern.
+ *
+ * @par Example:
+ * @code
+ * $wgExtraNamespaces = array(
+ *    100 => "Hilfe",
+ *    101 => "Hilfe_Diskussion",
+ *    102 => "Aide",
+ *    103 => "Discussion_Aide"
+ * );
+ * @endcode
+ *
+ * @todo Add a note about maintenance/namespaceDupes.php
  */
-# $wgExtraNamespaces = array(
-#     100 => "Hilfe",
-#     101 => "Hilfe_Diskussion",
-#     102 => "Aide",
-#     103 => "Discussion_Aide"
-# );
 $wgExtraNamespaces = array();
 
 /**
@@ -2803,18 +2992,22 @@ $wgExtraNamespaces = array();
 $wgExtraGenderNamespaces = array();
 
 /**
- * Namespace aliases
+ * Namespace aliases.
+ *
  * These are alternate names for the primary localised namespace names, which
  * are defined by $wgExtraNamespaces and the language file. If a page is
  * requested with such a prefix, the request will be redirected to the primary
  * name.
  *
  * Set this to a map from namespace names to IDs.
- * Example:
+ *
+ * @par Example:
+ * @code
  *    $wgNamespaceAliases = array(
  *        'Wikipedian' => NS_USER,
  *        'Help' => 100,
  *    );
+ * @endcode
  */
 $wgNamespaceAliases = array();
 
@@ -2829,8 +3022,8 @@ $wgNamespaceAliases = array();
  *   -  +         Enabled by default, but doesn't work with path to query rewrite rules, corrupted by apache
  *   -  ?         Enabled by default, but doesn't work with path to PATH_INFO rewrites
  *
- * All three of these punctuation problems can be avoided by using an alias, instead of a
- * rewrite rule of either variety.
+ * All three of these punctuation problems can be avoided by using an alias,
+ * instead of a rewrite rule of either variety.
  *
  * The problem with % is that when using a path to query rewrite rule, URLs are
  * double-unescaped: once by Apache's path conversion code, and again by PHP. So
@@ -2856,33 +3049,47 @@ $wgLocalInterwiki = false;
  */
 $wgInterwikiExpiry = 10800;
 
-/** Interwiki caching settings.
-       $wgInterwikiCache specifies path to constant database file
-               This cdb database is generated by dumpInterwiki from maintenance
-               and has such key formats:
-                       dbname:key - a simple key (e.g. enwiki:meta)
-                       _sitename:key - site-scope key (e.g. wiktionary:meta)
-                       __global:key - global-scope key (e.g. __global:meta)
-                       __sites:dbname - site mapping (e.g. __sites:enwiki)
-               Sites mapping just specifies site name, other keys provide
-                       "local url" data layout.
-       $wgInterwikiScopes specify number of domains to check for messages:
-               1 - Just wiki(db)-level
-               2 - wiki and global levels
-               3 - site levels
-       $wgInterwikiFallbackSite - if unable to resolve from cache
+/**
+ * @name Interwiki caching settings.
+ * @{
+ */
+/**
+ *$wgInterwikiCache specifies path to constant database file.
+ *
+ * This cdb database is generated by dumpInterwiki from maintenance and has
+ * such key formats:
+ *  - dbname:key - a simple key (e.g. enwiki:meta)
+ *  - _sitename:key - site-scope key (e.g. wiktionary:meta)
+ *  - __global:key - global-scope key (e.g. __global:meta)
+ *  - __sites:dbname - site mapping (e.g. __sites:enwiki)
+ *
+ * Sites mapping just specifies site name, other keys provide "local url"
+ * data layout.
  */
 $wgInterwikiCache = false;
+/**
+ * Specify number of domains to check for messages.
+ *     - 1: Just wiki(db)-level
+ *     - 2: wiki and global levels
+ *     - 3: site levels
+ */
 $wgInterwikiScopes = 3;
+/**
+ *     $wgInterwikiFallbackSite - if unable to resolve from cache
+ */
 $wgInterwikiFallbackSite = 'wiki';
+/** @} */ # end of Interwiki caching settings.
 
 /**
  * If local interwikis are set up which allow redirects,
  * set this regexp to restrict URLs which will be displayed
  * as 'redirected from' links.
  *
+ * @par Example:
  * It might look something like this:
+ * @code
  * $wgRedirectSources = '!^https?://[a-z-]+\.wikipedia\.org/!';
+ * @endcode
  *
  * Leave at false to avoid displaying any incoming redirect markers.
  * This does not affect intra-wiki redirects, which don't change
@@ -2892,7 +3099,8 @@ $wgRedirectSources = false;
 
 /**
  * Set this to false to avoid forcing the first letter of links to capitals.
- * WARNING: may break links! This makes links COMPLETELY case-sensitive. Links
+ *
+ * @warning may break links! This makes links COMPLETELY case-sensitive. Links
  * appearing with a capital at the beginning of a sentence will *not* go to the
  * same place as links in the middle of a sentence using a lowercase initial.
  */
@@ -2906,7 +3114,11 @@ $wgCapitalLinks = true;
  * associated content namespaces, the values for those are ignored in favor of the
  * subject namespace's setting. Setting for NS_MEDIA is taken automatically from
  * NS_FILE.
- * EX: $wgCapitalLinkOverrides[ NS_FILE ] = false;
+ *
+ * @par Example:
+ * @code
+ *     $wgCapitalLinkOverrides[ NS_FILE ] = false;
+ * @endcode
  */
 $wgCapitalLinkOverrides = array();
 
@@ -3039,11 +3251,11 @@ $wgAllowExternalImages = false;
  * You can use this to set up a trusted, simple repository of images.
  * You may also specify an array of strings to allow multiple sites
  *
- * Examples:
- * <code>
+ * @par Examples:
+ * @code
  * $wgAllowExternalImagesFrom = 'http://127.0.0.1/';
  * $wgAllowExternalImagesFrom = array( 'http://127.0.0.1/', 'http://example.com' );
- * </code>
+ * @endcode
  */
 $wgAllowExternalImagesFrom = '';
 
@@ -3058,7 +3270,7 @@ $wgAllowExternalImagesFrom = '';
 $wgEnableImageWhitelist = true;
 
 /**
- * A different approach to the above: simply allow the <img> tag to be used.
+ * A different approach to the above: simply allow the "<img>" tag to be used.
  * This allows you to specify alt text and other attributes, copy-paste HTML to
  * your wiki more easily, etc.  However, allowing external images in any manner
  * will allow anyone with editing rights to snoop on your visitors' IP
@@ -3100,7 +3312,7 @@ $wgTidyInternal = extension_loaded( 'tidy' );
  */
 $wgDebugTidy = false;
 
-/** Allow raw, unchecked HTML in <html>...</html> sections.
+/** Allow raw, unchecked HTML in "<html>...</html>" sections.
  * THIS IS VERY DANGEROUS on a publicly editable site, so USE wgGroupPermissions
  * TO RESTRICT EDITING to only those that you trust
  */
@@ -3368,7 +3580,7 @@ $wgInvalidUsernameCharacters = '@';
 /**
  * Character used as a delimiter when testing for interwiki userrights
  * (In Special:UserRights, it is possible to modify users on different
- * databases if the delimiter is used, e.g. Someuser@enwiki).
+ * databases if the delimiter is used, e.g. "Someuser@enwiki").
  *
  * It is recommended that you have this delimiter in
  * $wgInvalidUsernameCharacters above, or you will not be able to
@@ -3490,18 +3702,19 @@ $wgBlockCIDRLimit = array(
 $wgBlockDisablesLogin = false;
 
 /**
- * Pages anonymous user may see as an array, e.g.
+ * Pages anonymous user may see, set as an array of pages titles.
  *
- * <code>
+ * @par Example:
+ * @code
  * $wgWhitelistRead = array ( "Main Page", "Wikipedia:Help");
- * </code>
+ * @endcode
  *
  * Special:Userlogin and Special:ChangePassword are always whitelisted.
  *
- * NOTE: This will only work if $wgGroupPermissions['*']['read'] is false --
+ * @note This will only work if $wgGroupPermissions['*']['read'] is false --
  * see below. Otherwise, ALL pages are accessible, regardless of this setting.
  *
- * Also note that this will only protect _pages in the wiki_. Uploaded files
+ * @note Also that this will only protect _pages in the wiki_. Uploaded files
  * will remain readable. You can use img_auth.php to protect uploaded files,
  * see http://www.mediawiki.org/wiki/Manual:Image_Authorization
  */
@@ -3515,6 +3728,7 @@ $wgEmailConfirmToEdit = false;
 
 /**
  * Permission keys given to users in each group.
+ *
  * This is an array where the keys are all groups and each value is an
  * array of the format (right => boolean).
  *
@@ -3605,7 +3819,6 @@ $wgGroupPermissions['sysop']['reupload']         = true;
 $wgGroupPermissions['sysop']['reupload-shared']  = true;
 $wgGroupPermissions['sysop']['unwatchedpages']   = true;
 $wgGroupPermissions['sysop']['autoconfirmed']    = true;
-$wgGroupPermissions['sysop']['upload_by_url']    = true;
 $wgGroupPermissions['sysop']['ipblock-exempt']   = true;
 $wgGroupPermissions['sysop']['blockemail']       = true;
 $wgGroupPermissions['sysop']['markbotedits']     = true;
@@ -3615,6 +3828,7 @@ $wgGroupPermissions['sysop']['noratelimit']      = true;
 $wgGroupPermissions['sysop']['movefile']         = true;
 $wgGroupPermissions['sysop']['unblockself']      = true;
 $wgGroupPermissions['sysop']['suppressredirect'] = true;
+#$wgGroupPermissions['sysop']['upload_by_url']    = true;
 #$wgGroupPermissions['sysop']['mergehistory']     = true;
 
 // Permission to change users' group assignments
@@ -3625,6 +3839,7 @@ $wgGroupPermissions['bureaucrat']['noratelimit'] = true;
 // Permission to export pages including linked pages regardless of $wgExportMaxLinkDepth
 #$wgGroupPermissions['bureaucrat']['override-export-depth'] = true;
 
+#$wgGroupPermissions['sysop']['deletelogentry']  = true;
 #$wgGroupPermissions['sysop']['deleterevision']  = true;
 // To hide usernames from users and Sysops
 #$wgGroupPermissions['suppress']['hideuser'] = true;
@@ -3645,6 +3860,7 @@ $wgGroupPermissions['bureaucrat']['noratelimit'] = true;
 
 /**
  * Permission keys revoked from users in each group.
+ *
  * This acts the same way as wgGroupPermissions above, except that
  * if the user is in a group here, the permission will be removed from them.
  *
@@ -3662,16 +3878,20 @@ $wgImplicitGroups = array( '*', 'user', 'autoconfirmed' );
  * A map of group names that the user is in, to group names that those users
  * are allowed to add or revoke.
  *
- * Setting the list of groups to add or revoke to true is equivalent to "any group".
- *
- * For example, to allow sysops to add themselves to the "bot" group:
+ * Setting the list of groups to add or revoke to true is equivalent to "any
+ * group".
  *
+ * @par Example:
+ * To allow sysops to add themselves to the "bot" group:
+ * @code
  *    $wgGroupsAddToSelf = array( 'sysop' => array( 'bot' ) );
+ * @endcode
  *
+ * @par Example:
  * Implicit groups may be used for the source group, for instance:
- *
+ * @code
  *    $wgGroupsRemoveFromSelf = array( '*' => true );
- *
+ * @endcode
  * This allows users in the '*' group (i.e. any user) to remove themselves from
  * any group that they happen to be in.
  *
@@ -3707,13 +3927,16 @@ $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' );
  * namespace.  If you list more than one permission, a user must
  * have all of them to edit pages in that namespace.
  *
- * Note: NS_MEDIAWIKI is implicitly restricted to editinterface.
+ * @note NS_MEDIAWIKI is implicitly restricted to 'editinterface'.
  */
 $wgNamespaceProtection = array();
 
 /**
  * Pages in namespaces in this array can not be used as templates.
- * Elements must be numeric namespace ids.
+ *
+ * Elements MUST be numeric namespace ids, you can safely use the MediaWiki
+ * namespaces constants (NS_USER, NS_MAIN...).
+ *
  * Among other things, this may be useful to enforce read-restrictions
  * which may otherwise be bypassed by using the template machanism.
  */
@@ -3729,11 +3952,15 @@ $wgNonincludableNamespaces = array();
  *
  * When left at 0, all registered accounts will pass.
  *
- * Example:
- * <code>
+ * @par Example:
+ * Set automatic confirmation to 10 minutes (which is 600 seconds):
+ * @code
  *  $wgAutoConfirmAge = 600;     // ten minutes
+ * @endcode
+ * Set age to one day:
+ * @code
  *  $wgAutoConfirmAge = 3600*24; // one day
- * </code>
+ * @endcode
  */
 $wgAutoConfirmAge = 0;
 
@@ -3741,14 +3968,18 @@ $wgAutoConfirmAge = 0;
  * Number of edits an account requires before it is autoconfirmed.
  * Passing both this AND the time requirement is needed. Example:
  *
- * <code>
+ * @par Example:
+ * @code
  * $wgAutoConfirmCount = 50;
- * </code>
+ * @endcode
  */
 $wgAutoConfirmCount = 0;
 
 /**
  * Automatically add a usergroup to any user who matches certain conditions.
+ *
+ * @todo Redocument $wgAutopromote
+ *
  * The format is
  *   array( '&' or '|' or '^' or '!', cond1, cond2, ... )
  * where cond1, cond2, ... are themselves conditions; *OR*
@@ -3776,14 +4007,19 @@ $wgAutopromote = array(
 
 /**
  * Automatically add a usergroup to any user who matches certain conditions.
+ *
  * Does not add the user to the group again if it has been removed.
  * Also, does not remove the group if the user no longer meets the criteria.
  *
- * The format is
+ * The format is:
+ * @code
  *     array( event => criteria, ... )
- * where event is
- *     'onEdit' (when user edits) or 'onView' (when user views the wiki)
- * and criteria has the same format as $wgAutopromote
+ * @endcode
+ * Where event is either:
+ *     - 'onEdit' (when user edits)
+ *     - 'onView' (when user views the wiki)
+ *
+ * Criteria has the same format as $wgAutopromote
  *
  * @see $wgAutopromote
  * @since 1.18
@@ -3801,16 +4037,23 @@ $wgAutopromoteOnceLogInRC = true;
 
 /**
  * $wgAddGroups and $wgRemoveGroups can be used to give finer control over who
- * can assign which groups at Special:Userrights.  Example configuration:
+ * can assign which groups at Special:Userrights.
  *
+ * @par Example:
+ * Bureaucrats can add any group:
  * @code
- * // Bureaucrat can add any group
  * $wgAddGroups['bureaucrat'] = true;
- * // Bureaucrats can only remove bots and sysops
+ * @endcode
+ * Bureaucrats can only remove bots and sysops:
+ * @code
  * $wgRemoveGroups['bureaucrat'] = array( 'bot', 'sysop' );
- * // Sysops can make bots
+ * @endcode
+ * Sysops can make bots:
+ * @code
  * $wgAddGroups['sysop'] = array( 'bot' );
- * // Sysops can disable other sysops in an emergency, and disable bots
+ * @endcode
+ * Sysops can disable other sysops in an emergency, and disable bots:
+ * @code
  * $wgRemoveGroups['sysop'] = array( 'sysop', 'bot' );
  * @endcode
  */
@@ -3830,8 +4073,10 @@ $wgAvailableRights = array();
  */
 $wgDeleteRevisionsLimit = 0;
 
-/** Number of accounts each IP address may create, 0 to disable.
- * Requires memcached */
+/**
+ * Number of accounts each IP address may create, 0 to disable.
+ *
+ * @warning Requires memcached */
 $wgAccountCreationThrottle = 0;
 
 /**
@@ -3841,8 +4086,9 @@ $wgAccountCreationThrottle = 0;
  * There's no administrator override on-wiki, so be careful what you set. :)
  * May be an array of regexes or a single string for backwards compatibility.
  *
- * See http://en.wikipedia.org/wiki/Regular_expression
- * Note that each regex needs a beginning/end delimiter, eg: # or /
+ * @see http://en.wikipedia.org/wiki/Regular_expression
+ *
+ * @note Each regex needs a beginning/end delimiter, eg: # or /
  */
 $wgSpamRegex = array();
 
@@ -3850,39 +4096,46 @@ $wgSpamRegex = array();
 $wgSummarySpamRegex = array();
 
 /**
- * Whether to use DNS blacklists in $wgDnsBlacklistUrls to check for open proxies
+ * Whether to use DNS blacklists in $wgDnsBlacklistUrls to check for open
+ * proxies
  * @since 1.16
  */
 $wgEnableDnsBlacklist = false;
 
 /**
- * @deprecated since 1.17 Use $wgEnableDnsBlacklist instead, only kept for backward
- *  compatibility
+ * @deprecated since 1.17 Use $wgEnableDnsBlacklist instead, only kept for
+ * backward compatibility.
  */
 $wgEnableSorbs = false;
 
 /**
- * List of DNS blacklists to use, if $wgEnableDnsBlacklist is true. This is an
- * array of either a URL or an array with the URL and a key (should the blacklist
- * require a key). For example:
+ * List of DNS blacklists to use, if $wgEnableDnsBlacklist is true.
+ *
+ * This is an array of either a URL or an array with the URL and a key (should
+ * the blacklist require a key).
+ *
+ * @par Example:
  * @code
  * $wgDnsBlacklistUrls = array(
  *   // String containing URL
- *   'http.dnsbl.sorbs.net',
+ *   'http.dnsbl.sorbs.net.',
  *   // Array with URL and key, for services that require a key
- *   array( 'dnsbl.httpbl.net', 'mykey' ),
+ *   array( 'dnsbl.httpbl.net.', 'mykey' ),
  *   // Array with just the URL. While this works, it is recommended that you
  *   // just use a string as shown above
- *   array( 'opm.tornevall.org' )
+ *   array( 'opm.tornevall.org.' )
  * );
  * @endcode
+ *
+ * @note You should end the domain name with a . to avoid searching your
+ * eventual domain search suffixes.
  * @since 1.16
  */
 $wgDnsBlacklistUrls = array( 'http.dnsbl.sorbs.net.' );
 
 /**
- * @deprecated since 1.17 Use $wgDnsBlacklistUrls instead, only kept for backward
- *  compatibility
+ * @deprecated since 1.17 Use $wgDnsBlacklistUrls instead, only kept for
+ * backward compatibility.
  */
 $wgSorbsUrl = array();
 
@@ -3893,13 +4146,24 @@ $wgSorbsUrl = array();
 $wgProxyWhitelist = array();
 
 /**
- * Simple rate limiter options to brake edit floods.  Maximum number actions
- * allowed in the given number of seconds; after that the violating client re-
- * ceives HTTP 500 error pages until the period elapses.
+ * Simple rate limiter options to brake edit floods.
+ *
+ * Maximum number actions allowed in the given number of seconds; after that
+ * the violating client receives HTTP 500 error pages until the period
+ * elapses.
  *
- * array( 4, 60 ) for a maximum of 4 hits in 60 seconds.
+ * @par Example:
+ * To set a generic maximum of 4 hits in 60 seconds:
+ * @code
+ * $wgRateLimits = array( 4, 60 );
+ * @endcode
+ *
+ * You could also limit per action and then type of users. See the inline
+ * code for a template to use.
  *
- * This option set is experimental and likely to change. Requires memcached.
+ * This option set is experimental and likely to change.
+ *
+ * @warning Requires memcached.
  */
 $wgRateLimits = array(
        'edit' => array(
@@ -3948,7 +4212,8 @@ $wgQueryPageDefaultLimit = 50;
 
 /**
  * Limit password attempts to X attempts per Y seconds per IP per account.
- * Requires memcached.
+ *
+ * @warning Requires memcached.
  */
 $wgPasswordAttemptThrottle = array( 'count' => 5, 'seconds' => 300 );
 
@@ -3963,10 +4228,10 @@ $wgPasswordAttemptThrottle = array( 'count' => 5, 'seconds' => 300 );
  * If you enable this, every editor's IP address will be scanned for open HTTP
  * proxies.
  *
- * Don't enable this. Many sysops will report "hostile TCP port scans" to your
- * ISP and ask for your server to be shut down.
- *
+ * @warning Don't enable this. Many sysops will report "hostile TCP port scans"
+ * to your ISP and ask for your server to be shut down.
  * You have been warned.
+ *
  */
 $wgBlockOpenProxies = false;
 /** Port we want to scan for a proxy */
@@ -4100,18 +4365,18 @@ $wgDebugRedirects = false;
 
 /**
  * If true, log debugging data from action=raw and load.php.
- * This is normally false to avoid overlapping debug entries due to gen=css and
- * gen=js requests.
+ * This is normally false to avoid overlapping debug entries due to gen=css
+ * and gen=js requests.
  */
 $wgDebugRawPage = false;
 
 /**
  * Send debug data to an HTML comment in the output.
  *
- * This may occasionally be useful when supporting a non-technical end-user. It's
- * more secure than exposing the debug log file to the web, since the output only
- * contains private data for the current user. But it's not ideal for development
- * use since data is lost on fatal errors and redirects.
+ * This may occasionally be useful when supporting a non-technical end-user.
+ * It's more secure than exposing the debug log file to the web, since the
+ * output only contains private data for the current user. But it's not ideal
+ * for development use since data is lost on fatal errors and redirects.
  */
 $wgDebugComments = false;
 
@@ -4186,6 +4451,13 @@ $wgLogExceptionBacktrace = true;
  */
 $wgShowHostnames = false;
 
+/**
+ * Override server hostname detection with a hardcoded value.
+ * Should be a string, default false.
+ * @since 1.20
+ */
+$wgOverrideHostname = false;
+
 /**
  * If set to true MediaWiki will throw notices for some possible error
  * conditions and for deprecated functions.
@@ -4420,12 +4692,13 @@ $wgMWSuggestTemplate = false;
 $wgDisableSearchUpdate = false;
 
 /**
- * List of namespaces which are searched by default. Example:
+ * List of namespaces which are searched by default.
  *
- * <code>
+ * @par Example:
+ * @code
  * $wgNamespacesToBeSearchedDefault[NS_MAIN] = true;
  * $wgNamespacesToBeSearchedDefault[NS_PROJECT] = true;
- * </code>
+ * @endcode
  */
 $wgNamespacesToBeSearchedDefault = array(
        NS_MAIN => true,
@@ -4433,9 +4706,9 @@ $wgNamespacesToBeSearchedDefault = array(
 
 /**
  * Namespaces to be searched when user clicks the "Help" tab
- * on Special:Search
+ * on Special:Search.
  *
- * Same format as $wgNamespacesToBeSearchedDefault
+ * Same format as $wgNamespacesToBeSearchedDefault.
  */
 $wgNamespacesToBeSearchedHelp = array(
        NS_PROJECT => true,
@@ -4443,8 +4716,10 @@ $wgNamespacesToBeSearchedHelp = array(
 );
 
 /**
- * If set to true the 'searcheverything' preference will be effective only for logged-in users.
- * Useful for big wikis to maintain different search profiles for anonymous and logged-in users.
+ * If set to true the 'searcheverything' preference will be effective only for
+ * logged-in users.
+ * Useful for big wikis to maintain different search profiles for anonymous and
+ * logged-in users.
  *
  */
 $wgSearchEverythingOnlyLoggedIn = false;
@@ -4460,18 +4735,22 @@ $wgDisableInternalSearch = false;
  * If the URL includes '$1', this will be replaced with the URL-encoded
  * search term.
  *
- * For example, to forward to Google you'd have something like:
- * $wgSearchForwardUrl = 'http://www.google.com/search?q=$1' .
- *                       '&domains=http://example.com' .
- *                       '&sitesearch=http://example.com' .
- *                       '&ie=utf-8&oe=utf-8';
+ * @par Example:
+ * To forward to Google you'd have something like:
+ * @code
+ * $wgSearchForwardUrl =
+ *     'http://www.google.com/search?q=$1' .
+ *     '&domains=http://example.com' .
+ *     '&sitesearch=http://example.com' .
+ *     '&ie=utf-8&oe=utf-8';
+ * @endcode
  */
 $wgSearchForwardUrl = null;
 
 /**
- * Search form behavior
- * true = use Go & Search buttons
- * false = use Go button & Advanced search link
+ * Search form behavior.
+ * true = use Go & Search buttons
+ * false = use Go button & Advanced search link
  */
 $wgUseTwoButtonsSearchForm = true;
 
@@ -4488,11 +4767,13 @@ $wgSitemapNamespaces = false;
  * maintenance/generateSitemap.php script.
  *
  * This should be a map of namespace IDs to priority
- * Example:
+ * @par Example:
+ * @code
  *  $wgSitemapNamespacesPriorities = array(
  *      NS_USER => '0.9',
  *      NS_HELP => '0.0',
  *  );
+ * @endcode
  */
 $wgSitemapNamespacesPriorities = false;
 
@@ -4721,18 +5002,23 @@ $wgFeedDiffCutoff = 32768;
 /** Override the site's default RSS/ATOM feed for recentchanges that appears on
  * every page. Some sites might have a different feed they'd like to promote
  * instead of the RC feed (maybe like a "Recent New Articles" or "Breaking news" one).
- * Ex: $wgSiteFeed['format'] = "http://example.com/somefeed.xml"; Format can be one
- * of either 'rss' or 'atom'.
+ * Should be a format as key (either 'rss' or 'atom') and an URL to the feed
+ * as value.
+ * @par Example:
+ * Configure the 'atom' feed to http://example.com/somefeed.xml
+ * @code
+ * $wgSiteFeed['atom'] = "http://example.com/somefeed.xml";
+ * @endcode
  */
 $wgOverrideSiteFeed = array();
 
 /**
- * Available feeds objects
+ * Available feeds objects.
  * Should probably only be defined when a page is syndicated ie when
- * $wgOut->isSyndicated() is true
+ * $wgOut->isSyndicated() is true.
  */
 $wgFeedClasses = array(
-       'rss' => 'RSSFeed',
+       'rss'  => 'RSSFeed',
        'atom' => 'AtomFeed',
 );
 
@@ -4891,9 +5177,9 @@ $wgExportAllowListContributors = false;
  * can become *insanely large* and could easily break your wiki,
  * it's disabled by default for now.
  *
- * There's a HARD CODED limit of 5 levels of recursion to prevent a
- * crazy-big export from being done by someone setting the depth
- * number too high. In other words, last resort safety net.
+ * @warning There's a HARD CODED limit of 5 levels of recursion to prevent a
+ * crazy-big export from being done by someone setting the depth number too
+ * high. In other words, last resort safety net.
  */
 $wgExportMaxLinkDepth = 0;
 
@@ -4915,7 +5201,8 @@ $wgExportAllowAll = false;
  */
 
 /**
- * A list of callback functions which are called once MediaWiki is fully initialised
+ * A list of callback functions which are called once MediaWiki is fully
+ * initialised
  */
 $wgExtensionFunctions = array();
 
@@ -4930,9 +5217,10 @@ $wgExtensionFunctions = array();
  * Variables defined in extensions will override conflicting variables defined
  * in the core.
  *
- * Example:
- *    $wgExtensionMessagesFiles['ConfirmEdit'] = dirname(__FILE__).'/ConfirmEdit.i18n.php';
- *
+ * @par Example:
+ * @code
+ *    $wgExtensionMessagesFiles['ConfirmEdit'] = __DIR__.'/ConfirmEdit.i18n.php';
+ * @endcode
  */
 $wgExtensionMessagesFiles = array();
 
@@ -4946,7 +5234,9 @@ $wgExtensionMessagesFiles = array();
  * Registration is done with $pout->addOutputHook( $tag, $data ).
  *
  * The callback has the form:
+ * @code
  *    function outputHook( $outputPage, $parserOutput, $data ) { ... }
+ * @endcode
  */
 $wgParserOutputHooks = array();
 
@@ -4977,7 +5267,7 @@ $wgAutoloadClasses = array();
  * urls, descriptions and pointers to localized description msgs. Note that
  * the version, url, description and descriptionmsg key can be omitted.
  *
- * <code>
+ * @code
  * $wgExtensionCredits[$type][] = array(
  *     'name' => 'Example extension',
  *     'version' => 1.9,
@@ -4987,7 +5277,7 @@ $wgAutoloadClasses = array();
  *     'description' => 'An example extension',
  *     'descriptionmsg' => 'exampleextension-desc',
  * );
- * </code>
+ * @endcode
  *
  * Where $type is 'specialpage', 'parserhook', 'variable', 'media' or 'other'.
  * Where 'descriptionmsg' can be an array with message key and parameters:
@@ -5003,12 +5293,30 @@ $wgAuth = null;
 
 /**
  * Global list of hooks.
- * Add a hook by doing:
+ *
+ * The key is one of the events made available by MediaWiki, you can find
+ * a description for most of them in docs/hooks.txt. The array is used
+ * internally by Hook:run().
+ *
+ * The value can be one of:
+ *
+ * - A function name:
+ * @code
  *     $wgHooks['event_name'][] = $function;
- * or:
+ * @endcode
+ * - A function with some data:
+ * @code
  *     $wgHooks['event_name'][] = array($function, $data);
- * or:
+ * @endcode
+ * - A an object method:
+ * @code
  *     $wgHooks['event_name'][] = array($object, 'method');
+ * @endcode
+ *
+ * @warning You should always append to an event array or you will end up
+ * deleting a previous registered hook.
+ *
+ * @todo Does it support PHP closures?
  */
 $wgHooks = array();
 
@@ -5162,17 +5470,19 @@ $wgLogRestrictions = array(
  *
  * See $wgLogTypes for a list of available log types.
  *
- * For example:
+ * @par Example:
+ * @code
  *   $wgFilterLogTypes => array(
  *      'move' => true,
  *      'import' => false,
  *   );
+ * @endcode
  *
  * Will display show/hide links for the move and import logs. Move logs will be
  * hidden by default unless the link is clicked. Import logs will be shown by
  * default, and hidden when the link is clicked.
  *
- * A message of the form log-show-hide-<type> should be added, and will be used
+ * A message of the form log-show-hide-[type] should be added, and will be used
  * for the link text.
  */
 $wgFilterLogTypes = array(
@@ -5185,7 +5495,7 @@ $wgFilterLogTypes = array(
  *
  * Extensions with custom log types may add to this array.
  *
- * Since 1.19, if you follow the naming convention log-name-TYPE,
+ * @since 1.19, if you follow the naming convention log-name-TYPE,
  * where TYPE is your log type, yoy don't need to use this array.
  */
 $wgLogNames = array(
@@ -5208,7 +5518,7 @@ $wgLogNames = array(
  *
  * Extensions with custom log types may add to this array.
  *
- * Since 1.19, if you follow the naming convention log-description-TYPE,
+ * @since 1.19, if you follow the naming convention log-description-TYPE,
  * where TYPE is your log type, yoy don't need to use this array.
  */
 $wgLogHeaders = array(
@@ -5258,10 +5568,12 @@ $wgLogActions = array(
  * @see LogFormatter
  */
 $wgLogActionsHandlers = array(
-       // move, move_redir
-       'move/*'            => 'MoveLogFormatter',
-       // delete, restore, revision, event
-       'delete/*'          => 'DeleteLogFormatter',
+       'move/move'         => 'MoveLogFormatter',
+       'move/move_redir'  => 'MoveLogFormatter',
+       'delete/delete'     => 'DeleteLogFormatter',
+       'delete/restore'    => 'DeleteLogFormatter',
+       'delete/revision'   => 'DeleteLogFormatter',
+       'delete/event'      => 'DeleteLogFormatter',
        'suppress/revision' => 'DeleteLogFormatter',
        'suppress/event'    => 'DeleteLogFormatter',
        'suppress/delete'   => 'DeleteLogFormatter',
@@ -5360,6 +5672,7 @@ $wgSpecialPageGroups = array(
        'Mostlinkedtemplates'       => 'highuse',
        'Mostcategories'            => 'highuse',
        'Mostimages'                => 'highuse',
+       'Mostinterwikis'            => 'highuse',
        'Mostrevisions'             => 'highuse',
 
        'Allpages'                  => 'pages',
@@ -5422,7 +5735,7 @@ $wgMaxRedirectLinksRetrieved = 500;
  */
 
 /**
- * Array of allowed values for the title=foo&action=<action> parameter. Syntax is:
+ * Array of allowed values for the "title=foo&action=<action>" parameter. Syntax is:
  *     'foo' => 'ClassName'    Load the specified class which subclasses Action
  *     'foo' => true           Load the class FooAction which subclasses Action
  *                             If something is specified in the getActionOverrides()
@@ -5487,8 +5800,10 @@ $wgDefaultRobotPolicy = 'index,follow';
  * URLs, so search engine spiders risk getting lost in a maze of twisty special
  * pages, all alike, and never reaching your actual content.
  *
- * Example:
+ * @par Example:
+ * @code
  *   $wgNamespaceRobotPolicies = array( NS_TALK => 'noindex' );
+ * @endcode
  */
 $wgNamespaceRobotPolicies = array();
 
@@ -5496,10 +5811,18 @@ $wgNamespaceRobotPolicies = array();
  * Robot policies per article. These override the per-namespace robot policies.
  * Must be in the form of an array where the key part is a properly canonical-
  * ised text form title and the value is a robot policy.
- * Example:
- *   $wgArticleRobotPolicies = array( 'Main Page' => 'noindex,follow',
- *     'User:Bob' => 'index,follow' );
- * Example that DOES NOT WORK because the names are not canonical text forms:
+ *
+ * @par Example:
+ * @code
+ * $wgArticleRobotPolicies = array(
+ *             'Main Page' => 'noindex,follow',
+ *             'User:Bob' => 'index,follow',
+ * );
+ * @endcode
+ *
+ * @par Example that DOES NOT WORK because the names are not canonical text
+ * forms:
+ * @code
  *   $wgArticleRobotPolicies = array(
  *     # Underscore, not space!
  *     'Main_Page' => 'noindex,follow',
@@ -5508,6 +5831,7 @@ $wgNamespaceRobotPolicies = array();
  *     # Needs to be "Abc", not "abc" (unless $wgCapitalLinks is false for that namespace)!
  *     'abc' => 'noindex,nofollow'
  *   );
+ * @endcode
  */
 $wgArticleRobotPolicies = array();
 
@@ -5515,8 +5839,11 @@ $wgArticleRobotPolicies = array();
  * An array of namespace keys in which the __INDEX__/__NOINDEX__ magic words
  * will not function, so users can't decide whether pages in that namespace are
  * indexed by search engines.  If set to null, default to $wgContentNamespaces.
- * Example:
+ *
+ * @par Example:
+ * @code
  *   $wgExemptFromUserRobotsControl = array( NS_MAIN, NS_TALK, NS_PROJECT );
+ * @endcode
  */
 $wgExemptFromUserRobotsControl = null;
 
@@ -5546,9 +5873,10 @@ $wgEnableAPI = true;
 $wgEnableWriteAPI = true;
 
 /**
- * API module extensions
+ * API module extensions.
  * Associative array mapping module name to class name.
  * Extension modules may override the core modules.
+ * @todo Describe each of the variables, group them and add examples
  */
 $wgAPIModules = array();
 $wgAPIMetaModules = array();
@@ -5563,7 +5891,7 @@ $wgAPIMaxDBRows = 5000;
 
 /**
  * The maximum size (in bytes) of an API result.
- * Don't set this lower than $wgMaxArticleSize*1024
+ * @warning Do not set this lower than $wgMaxArticleSize*1024
  */
 $wgAPIMaxResultSize = 8388608;
 
@@ -5618,17 +5946,18 @@ $wgAjaxLicensePreview = true;
  * This is currently only used by the API (requests to api.php)
  * $wgCrossSiteAJAXdomains can be set using a wildcard syntax:
  *
- * '*' matches any number of characters
- * '?' matches any 1 character
- *
- * Example:
- $wgCrossSiteAJAXdomains = array(
-  'www.mediawiki.org',
-  '*.wikipedia.org',
-  '*.wikimedia.org',
-  '*.wiktionary.org',
- );
+ * - '*' matches any number of characters
+ * - '?' matches any 1 character
  *
+ * @par Example:
+ * @code
+ * $wgCrossSiteAJAXdomains = array(
+ *     'www.mediawiki.org',
+ *     '*.wikipedia.org',
+ *     '*.wikimedia.org',
+ *     '*.wiktionary.org',
+ * );
+ * @endcode
  */
 $wgCrossSiteAJAXdomains = array();
 
@@ -5732,7 +6061,7 @@ $wgUpdateRowsPerQuery = 100;
 
 /**
  * The build directory for HipHop compilation.
- * Defaults to $IP/maintenance/hiphop/build.
+ * Defaults to '$IP/maintenance/hiphop/build'.
  */
 $wgHipHopBuildDirectory = false;
 
@@ -5752,8 +6081,9 @@ $wgHipHopCompilerProcs = 'detect';
  *
  * To compile extensions with HipHop, set $wgExtensionsDirectory correctly,
  * and use code like:
- *
+ * @code
  *    require( MWInit::extensionSetupPath( 'Extension/Extension.php' ) );
+ * @endcode
  *
  * to include the extension setup file from LocalSettings.php. It is not
  * necessary to set this variable unless you use MWInit::extensionSetupPath().
@@ -5798,9 +6128,11 @@ $wgExternalDiffEngine = false;
 
 /**
  * Disable redirects to special pages and interwiki redirects, which use a 302
- * and have no "redirected from" link. Note this is only for articles with #Redirect
- * in them. URL's containing a local interwiki prefix (or a non-canonical special
- * page name) are still hard redirected regardless of this setting.
+ * and have no "redirected from" link.
+ *
+ * @note This is only for articles with #REDIRECT in them. URL's containing a
+ * local interwiki prefix (or a non-canonical special page name) are still hard
+ * redirected regardless of this setting.
  */
 $wgDisableHardRedirects = false;
 
@@ -5811,8 +6143,8 @@ $wgDisableHardRedirects = false;
 $wgLinkHolderBatchSize = 1000;
 
 /**
- * By default MediaWiki does not register links pointing to same server in externallinks dataset,
- * use this value to override:
+ * By default MediaWiki does not register links pointing to same server in
+ * externallinks dataset, use this value to override:
  */
 $wgRegisterInternalExternals = false;
 
@@ -5840,8 +6172,10 @@ $wgRedirectOnLogin = null;
  * This configuration array maps pool types to an associative array. The only
  * defined key in the associative array is "class", which gives the class name.
  * The remaining elements are passed through to the class as constructor
- * parameters. Example:
+ * parameters.
  *
+ * @par Example:
+ * @code
  *   $wgPoolCounterConf = array( 'ArticleView' => array(
  *     'class' => 'PoolCounter_Client',
  *     'timeout' => 15, // wait timeout in seconds
@@ -5849,6 +6183,7 @@ $wgRedirectOnLogin = null;
  *     'maxqueue' => 50, // maximum number of total threads in each pool
  *     ... any extension-specific options...
  *   );
+ * @endcode
  */
 $wgPoolCounterConf = null;
 
@@ -5866,6 +6201,11 @@ $wgSeleniumConfigFile = null;
 $wgDBtestuser = ''; //db user that has permission to create and drop the test databases only
 $wgDBtestpassword = '';
 
+/**
+ * Whether the user must enter their password to change their e-mail address
+ */
+$wgRequirePasswordforEmailChange = true;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 00af974..b4989a6 100644 (file)
@@ -88,10 +88,19 @@ class DeferredUpdates {
                }
 
                foreach ( $updates as $update ) {
-                       $update->doUpdate();
+                       try {
+                               $update->doUpdate();
 
-                       if ( $doCommit && $dbw->trxLevel() ) {
-                               $dbw->commit( __METHOD__ );
+                               if ( $doCommit && $dbw->trxLevel() ) {
+                                       $dbw->commit( __METHOD__ );
+                               }
+                       } catch ( MWException $e ) {
+                               // We don't want exceptions thrown during deferred updates to
+                               // be reported to the user since the output is already sent.
+                               // Instead we just log them.
+                               if ( !$e instanceof ErrorPageError ) {
+                                       wfDebugLog( 'exception', $e->getLogMessage() );
+                               }
                        }
                }
 
index d0f0c26..be9f981 100644 (file)
@@ -25,7 +25,7 @@
  */
 
 /**
- * @defgroup Constants
+ * @defgroup Constants MediaWiki constants
  */
 
 /**
@@ -44,6 +44,8 @@ define( 'DBO_DEFAULT', 16 );
 define( 'DBO_PERSISTENT', 32 );
 define( 'DBO_SYSDBA', 64 ); //for oracle maintenance
 define( 'DBO_DDLMODE', 128 ); // when using schema files: mostly for Oracle
+define( 'DBO_SSL', 256 );
+define( 'DBO_COMPRESS', 512 );
 /**@}*/
 
 /**@{
@@ -144,8 +146,8 @@ define( 'AV_SCAN_FAILED', false );  #scan failed (scanner not found or error in
  * Anti-lock flags
  * See DefaultSettings.php for a description
  */
-define( 'ALF_PRELOAD_LINKS', 1 );
-define( 'ALF_PRELOAD_EXISTENCE', 2 );
+define( 'ALF_PRELOAD_LINKS', 1 ); // unused
+define( 'ALF_PRELOAD_EXISTENCE', 2 ); // unused
 define( 'ALF_NO_LINK_LOCK', 4 );
 define( 'ALF_NO_BLOCK_LOCK', 8 );
 /**@}*/
@@ -203,7 +205,7 @@ define( 'LIST_SET_PREPARED', 8);  // List of (?, ?, ?) for DatabaseIbm_db2
 /**
  * Unicode and normalisation related
  */
-require_once dirname(__FILE__).'/normal/UtfNormalDefines.php';
+require_once __DIR__.'/normal/UtfNormalDefines.php';
 
 /**@{
  * Hook support constants
index 6e6f825..f9bba19 100644 (file)
@@ -591,8 +591,8 @@ class EditPage {
                                wfProfileOut( get_class( $this ) . "::importContentFormData" );
                        }
 
-                       # Truncate for whole multibyte characters. +5 bytes for ellipsis
-                       $this->summary = $wgLang->truncate( $request->getText( 'wpSummary' ), 250 );
+                       # Truncate for whole multibyte characters
+                       $this->summary = $wgLang->truncate( $request->getText( 'wpSummary' ), 255 );
 
                        # If the summary consists of a heading, e.g. '==Foobar==', extract the title from the
                        # header syntax, e.g. 'Foobar'. This is mainly an issue when we are using wpSummary for
@@ -604,7 +604,7 @@ class EditPage {
                        # currently doing double duty as both edit summary and section title. Right now this
                        # is just to allow API edits to work around this limitation, but this should be
                        # incorporated into the actual edit form when EditPage is rewritten (Bugs 18654, 26312).
-                       $this->sectiontitle = $wgLang->truncate( $request->getText( 'wpSectionTitle' ), 250 );
+                       $this->sectiontitle = $wgLang->truncate( $request->getText( 'wpSectionTitle' ), 255 );
                        $this->sectiontitle = preg_replace( '/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->sectiontitle );
 
                        $this->edittime = $request->getVal( 'wpEdittime' );
@@ -756,7 +756,7 @@ class EditPage {
                } elseif ( $wgUser->getOption( 'watchcreations' ) && !$this->mTitle->exists() ) {
                        # Watch creations
                        $this->watchthis = true;
-               } elseif ( $this->mTitle->userIsWatching() ) {
+               } elseif ( $wgUser->isWatched( $this->mTitle ) ) {
                        # Already watched
                        $this->watchthis = true;
                }
@@ -836,11 +836,12 @@ class EditPage {
                                                        # If we just undid one rev, use an autosummary
                                                        $firstrev = $oldrev->getNext();
                                                        if ( $firstrev && $firstrev->getId() == $undo ) {
-                                                               $undoSummary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() );
+                                                               $undoSummary = wfMessage( 'undo-summary', $undo, $undorev->getUserText() )->inContentLanguage()->text();
                                                                if ( $this->summary === '' ) {
                                                                        $this->summary = $undoSummary;
                                                                } else {
-                                                                       $this->summary = $undoSummary . wfMsgForContent( 'colon-separator' ) . $this->summary;
+                                                                       $this->summary = $undoSummary . wfMessage( 'colon-separator' )
+                                                                               ->inContentLanguage()->text() . $this->summary;
                                                                }
                                                                $this->undidRev = $undo;
                                                        }
@@ -855,7 +856,7 @@ class EditPage {
 
                                        $class = ( $undoMsg == 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}";
                                        $this->editFormPageTop .= $wgOut->parse( "<div class=\"{$class}\">" .
-                                               wfMsgNoTrans( 'undo-' . $undoMsg ) . '</div>', true, /* interface */true );
+                                               wfMessage( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
                                }
 
                                if ( $text === false ) {
@@ -877,7 +878,7 @@ class EditPage {
         *
         * This difers from Article::getContent() that when a missing revision is
         * encountered the result will be an empty string and not the
-        * 'missing-article' message.
+        * 'missing-revision' message.
         *
         * @since 1.19
         * @return string
@@ -1201,9 +1202,9 @@ class EditPage {
 
                wfProfileOut( __METHOD__ . '-checks' );
 
-               // Use SELECT FOR UPDATE here to avoid transaction collision in
-               // WikiPage::updateRevisionOn() and ending in the self::AS_END case.
-               $this->mArticle->loadPageData( 'forupdate' );
+               # Load the page data from the master. If anything changes in the meantime,
+               # we detect it by using page_latest like a token in a 1 try compare-and-swap.
+               $this->mArticle->loadPageData( 'fromdbmaster' );
                $new = !$this->mArticle->exists();
 
                if ( $new ) {
@@ -1243,7 +1244,8 @@ class EditPage {
                        if ( $this->section == 'new' ) {
                                if ( $this->sectiontitle !== '' ) {
                                        // Insert the section title above the content.
-                                       $text = wfMsgForContent( 'newsectionheaderdefaultlevel', $this->sectiontitle ) . "\n\n" . $text;
+                                       $text = wfMessage( 'newsectionheaderdefaultlevel', $this->sectiontitle )
+                                               ->inContentLanguage()->text() . "\n\n" . $text;
 
                                        // Jump to the new section
                                        $result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
@@ -1253,18 +1255,21 @@ class EditPage {
                                        // passed.
                                        if ( $this->summary === '' ) {
                                                $cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
-                                               $this->summary = wfMsgForContent( 'newsectionsummary', $cleanSectionTitle );
+                                               $this->summary = wfMessage( 'newsectionsummary', $cleanSectionTitle )
+                                                       ->inContentLanguage()->text();
                                        }
                                } elseif ( $this->summary !== '' ) {
                                        // Insert the section title above the content.
-                                       $text = wfMsgForContent( 'newsectionheaderdefaultlevel', $this->summary ) . "\n\n" . $text;
+                                       $text = wfMessage( 'newsectionheaderdefaultlevel', $this->summary )
+                                               ->inContentLanguage()->text() . "\n\n" . $text;
 
                                        // Jump to the new section
                                        $result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
 
                                        // Create a link to the new section from the edit summary.
                                        $cleanSummary = $wgParser->stripSectionName( $this->summary );
-                                       $this->summary = wfMsgForContent( 'newsectionsummary', $cleanSummary );
+                                       $this->summary = wfMessage( 'newsectionsummary', $cleanSummary )
+                                               ->inContentLanguage()->text();
                                }
                        }
 
@@ -1394,14 +1399,16 @@ class EditPage {
                                        // passed.
                                        if ( $this->summary === '' ) {
                                                $cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
-                                               $this->summary = wfMsgForContent( 'newsectionsummary', $cleanSectionTitle );
+                                               $this->summary = wfMessage( 'newsectionsummary', $cleanSectionTitle )
+                                                       ->inContentLanguage()->text();
                                        }
                                } elseif ( $this->summary !== '' ) {
                                        $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
                                        # This is a new section, so create a link to the new section
                                        # in the revision summary.
                                        $cleanSummary = $wgParser->stripSectionName( $this->summary );
-                                       $this->summary = wfMsgForContent( 'newsectionsummary', $cleanSummary );
+                                       $this->summary = wfMessage( 'newsectionsummary', $cleanSummary )
+                                               ->inContentLanguage()->text();
                                }
                        } elseif ( $this->section != '' ) {
                                # Try to get a section anchor from the section source, redirect to edited section if header found
@@ -1470,7 +1477,7 @@ class EditPage {
         */
        protected function commitWatch() {
                global $wgUser;
-               if ( $this->watchthis xor $this->mTitle->userIsWatching() ) {
+               if ( $wgUser->isLoggedIn() && $this->watchthis != $wgUser->isWatched( $this->mTitle ) ) {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->begin( __METHOD__ );
                        if ( $this->watchthis ) {
@@ -1515,7 +1522,7 @@ class EditPage {
         * @private
         * @todo document
         *
-        * @parma $editText string
+        * @param $editText string
         *
         * @return bool
         */
@@ -1582,7 +1589,7 @@ class EditPage {
        /**
         * Check given input text against $wgSpamRegex, and return the text of the first match.
         *
-        * @parma $text string
+        * @param $text string
         *
         * @return string|bool  matching string or false
         */
@@ -1813,8 +1820,8 @@ class EditPage {
                                : 'confirmrecreate';
                        $wgOut->addHTML(
                                '<div class="mw-confirm-recreate">' .
-                               wfMsgExt( $key, 'parseinline', $username, "<nowiki>$comment</nowiki>" ) .
-                               Xml::checkLabel( wfMsg( 'recreate' ), 'wpRecreate', 'wpRecreate', false,
+                                       wfMessage( $key, $username, "<nowiki>$comment</nowiki>" )->parse() .
+                               Xml::checkLabel( wfMessage( 'recreate' )->text(), 'wpRecreate', 'wpRecreate', false,
                                        array( 'title' => Linker::titleAttrib( 'recreate' ), 'tabindex' => 1, 'id' => 'wpRecreate' )
                                ) .
                                '</div>'
@@ -1837,6 +1844,10 @@ class EditPage {
                        $wgOut->addHTML( Html::hidden( 'wpIgnoreBlankSummary', true ) );
                }
 
+               if ( $this->undidRev ) {
+                       $wgOut->addHTML( Html::hidden( 'wpUndidRevision', $this->undidRev ) );
+               }
+
                if ( $this->hasPresetSummary ) {
                        // If a summary has been preset using &summary= we dont want to prompt for
                        // a different summary. Only prompt for a summary if the summary is blanked.
@@ -1875,10 +1886,6 @@ class EditPage {
 
                $wgOut->addHTML( $this->editFormTextAfterContent );
 
-               $wgOut->addWikiText( $this->getCopywarn() );
-
-               $wgOut->addHTML( $this->editFormTextAfterWarn );
-
                $this->showStandardInputs();
 
                $this->showFormAfterText();
@@ -2016,8 +2023,7 @@ class EditPage {
                                        // Something went wrong
 
                                        $wgOut->wrapWikiMsg( "<div class='errorbox'>\n$1\n</div>\n",
-                                               array( 'missing-article', $this->mTitle->getPrefixedText(),
-                                               wfMsgNoTrans( 'missingarticle-rev', $this->oldid ) ) );
+                                               array( 'missing-revision', $this->oldid ) );
                                }
                        }
                }
@@ -2092,8 +2098,11 @@ class EditPage {
                                );
                        }
                }
+               # Add header copyright warning
+               $this->showHeaderCopyrightWarning();
        }
 
+
        /**
         * Standard summary input and label (wgSummary), abstracted so EditPage
         * subclasses may reorganize the form.
@@ -2109,7 +2118,7 @@ class EditPage {
         * @return array An array in the format array( $label, $input )
         */
        function getSummaryInput( $summary = "", $labelText = null, $inputAttrs = null, $spanLabelAttrs = null ) {
-               // Note: the maxlength is overriden in JS to 250 and to make it use UTF-8 bytes, not characters.
+               // Note: the maxlength is overriden in JS to 255 and to make it use UTF-8 bytes, not characters.
                $inputAttrs = ( is_array( $inputAttrs ) ? $inputAttrs : array() ) + array(
                        'id' => 'wpSummary',
                        'maxlength' => '200',
@@ -2155,7 +2164,7 @@ class EditPage {
                        }
                }
                $summary = $wgContLang->recodeForEdit( $summary );
-               $labelText = wfMsgExt( $isSubjectPreview ? 'subject' : 'summary', 'parseinline' );
+               $labelText = wfMessage( $isSubjectPreview ? 'subject' : 'summary' )->parse();
                list( $label, $input ) = $this->getSummaryInput( $summary, $labelText, array( 'class' => $summaryClass ), array() );
                $wgOut->addHTML( "{$label} {$input}" );
        }
@@ -2174,11 +2183,12 @@ class EditPage {
                global $wgParser;
 
                if ( $isSubjectPreview )
-                       $summary = wfMsgForContent( 'newsectionsummary', $wgParser->stripSectionName( $summary ) );
+                       $summary = wfMessage( 'newsectionsummary', $wgParser->stripSectionName( $summary ) )
+                               ->inContentLanguage()->text();
 
                $message = $isSubjectPreview ? 'subject-preview' : 'summary-preview';
 
-               $summary = wfMsgExt( $message, 'parseinline' ) . Linker::commentBlock( $summary, $this->mTitle, $isSubjectPreview );
+               $summary = wfMessage( $message )->parse() . Linker::commentBlock( $summary, $this->mTitle, $isSubjectPreview );
                return Xml::tags( 'div', array( 'class' => 'mw-summary-preview' ), $summary );
        }
 
@@ -2374,8 +2384,8 @@ HTML
                $newtext = $wgParser->preSaveTransform( $newtext, $this->mTitle, $wgUser, $popts );
 
                if ( $oldtext !== false  || $newtext != '' ) {
-                       $oldtitle = wfMsgExt( $oldtitlemsg, array( 'parseinline' ) );
-                       $newtitle = wfMsgExt( 'yourtext', array( 'parseinline' ) );
+                       $oldtitle = wfMessage( $oldtitlemsg )->parse();
+                       $newtitle = wfMessage( 'yourtext' )->parse();
 
                        $de = new DifferenceEngine( $this->mArticle->getContext() );
                        $de->setText( $oldtext, $newtext );
@@ -2388,6 +2398,18 @@ HTML
                $wgOut->addHTML( '<div id="wikiDiff">' . $difftext . '</div>' );
        }
 
+       /**
+        * Show the header copyright warning.
+        */
+       protected function showHeaderCopyrightWarning() {
+               $msg = 'editpage-head-copy-warn';
+               if ( !wfMessage( $msg )->isDisabled() ) {
+                       global $wgOut;
+                       $wgOut->wrapWikiMsg( "<div class='editpage-head-copywarn'>\n$1\n</div>",
+                               'editpage-head-copy-warn' );
+               }
+       }
+
        /**
         * Give a chance for site and per-namespace customizations of
         * terms of service summary link that might exist separately
@@ -2414,18 +2436,27 @@ HTML
                        '</div>' );
        }
 
+       /**
+        * Get the copyright warning
+        *
+        * Renamed to getCopyrightWarning(), old name kept around for backwards compatibility
+        */
        protected function getCopywarn() {
+               return self::getCopyrightWarning( $this->mTitle );
+       }
+
+       public static function getCopyrightWarning( $title ) {
                global $wgRightsText;
                if ( $wgRightsText ) {
                        $copywarnMsg = array( 'copyrightwarning',
-                               '[[' . wfMsgForContent( 'copyrightpage' ) . ']]',
+                               '[[' . wfMessage( 'copyrightpage' )->inContentLanguage()->text() . ']]',
                                $wgRightsText );
                } else {
                        $copywarnMsg = array( 'copyrightwarning2',
-                               '[[' . wfMsgForContent( 'copyrightpage' ) . ']]' );
+                               '[[' . wfMessage( 'copyrightpage' )->inContentLanguage()->text() . ']]' );
                }
                // Allow for site and per-namespace customization of contribution/copyright notice.
-               wfRunHooks( 'EditPageCopyrightWarning', array( $this->mTitle, &$copywarnMsg ) );
+               wfRunHooks( 'EditPageCopyrightWarning', array( $title, &$copywarnMsg ) );
 
                return "<div id=\"editpage-copywarn\">\n" .
                        call_user_func_array( "wfMsgNoTrans", $copywarnMsg ) . "\n</div>";
@@ -2443,18 +2474,24 @@ HTML
                $checkboxes = $this->getCheckboxes( $tabindex,
                        array( 'minor' => $this->minoredit, 'watch' => $this->watchthis ) );
                $wgOut->addHTML( "<div class='editCheckboxes'>" . implode( $checkboxes, "\n" ) . "</div>\n" );
+
+               // Show copyright warning.
+               $wgOut->addWikiText( $this->getCopywarn() );
+               $wgOut->addHTML( $this->editFormTextAfterWarn );
+
                $wgOut->addHTML( "<div class='editButtons'>\n" );
                $wgOut->addHTML( implode( $this->getEditButtons( $tabindex ), "\n" ) . "\n" );
 
                $cancel = $this->getCancelLink();
                if ( $cancel !== '' ) {
-                       $cancel .= wfMsgExt( 'pipe-separator' , 'escapenoentities' );
+                       $cancel .= wfMessage( 'pipe-separator' )->text();
                }
-               $edithelpurl = Skin::makeInternalOrExternalUrl( wfMsgForContent( 'edithelppage' ) );
+               $edithelpurl = Skin::makeInternalOrExternalUrl( wfMessage( 'edithelppage' )->inContentLanguage()->text() );
                $edithelp = '<a target="helpwindow" href="' . $edithelpurl . '">' .
-                       htmlspecialchars( wfMsg( 'edithelp' ) ) . '</a> ' .
-                       htmlspecialchars( wfMsg( 'newwindow' ) );
-               $wgOut->addHTML( "      <span class='editHelp'>{$cancel}{$edithelp}</span>\n" );
+                       wfMessage( 'edithelp' )->escaped() . '</a> ' .
+                       wfMessage( 'newwindow' )->escaped();
+               $wgOut->addHTML( "      <span class='cancelLink'>{$cancel}</span>\n" );
+               $wgOut->addHTML( "      <span class='editHelp'>{$edithelp}</span>\n" );
                $wgOut->addHTML( "</div><!-- editButtons -->\n</div><!-- editOptions -->\n" );
        }
 
@@ -2470,7 +2507,10 @@ HTML
 
                        $de = new DifferenceEngine( $this->mArticle->getContext() );
                        $de->setText( $this->textbox2, $this->textbox1 );
-                       $de->showDiff( wfMsgExt( 'yourtext', 'parseinline' ), wfMsg( 'storedversion' ) );
+                       $de->showDiff(
+                               wfMessage( 'yourtext' )->parse(),
+                               wfMessage( 'storedversion' )->text()
+                       );
 
                        $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourtext" );
                        $this->showTextbox2();
@@ -2488,7 +2528,7 @@ HTML
 
                return Linker::linkKnown(
                        $this->getContextTitle(),
-                       wfMsgExt( 'cancel', array( 'parseinline' ) ),
+                       wfMessage( 'cancel' )->parse(),
                        array( 'id' => 'mw-editform-cancel' ),
                        $cancelParams
                );
@@ -2558,9 +2598,9 @@ HTML
                // Quick paranoid permission checks...
                if ( is_object( $data ) ) {
                        if ( $data->log_deleted & LogPage::DELETED_USER )
-                               $data->user_name = wfMsgHtml( 'rev-deleted-user' );
+                               $data->user_name = wfMessage( 'rev-deleted-user' )->escaped();
                        if ( $data->log_deleted & LogPage::DELETED_COMMENT )
-                               $data->log_comment = wfMsgHtml( 'rev-deleted-comment' );
+                               $data->log_comment = wfMessage( 'rev-deleted-comment' )->escaped();
                }
                return $data;
        }
@@ -2583,7 +2623,7 @@ HTML
                                // string, which happens when you initially edit
                                // a category page, due to automatic preview-on-open.
                                $parsedNote = $wgOut->parse( "<div class='previewnote'>" .
-                                       wfMsg( 'session_fail_preview_html' ) . "</div>", true, /* interface */true );
+                                       wfMessage( 'session_fail_preview_html' )->text() . "</div>", true, /* interface */true );
                        }
                        wfProfileOut( __METHOD__ );
                        return $parsedNote;
@@ -2591,15 +2631,15 @@ HTML
 
                if ( $this->mTriedSave && !$this->mTokenOk ) {
                        if ( $this->mTokenOkExceptSuffix ) {
-                               $note = wfMsg( 'token_suffix_mismatch' );
+                               $note = wfMessage( 'token_suffix_mismatch' )->plain();
                        } else {
-                               $note = wfMsg( 'session_fail_preview' );
+                               $note = wfMessage( 'session_fail_preview' )->plain();
                        }
                } elseif ( $this->incompleteForm ) {
-                       $note = wfMsg( 'edit_form_incomplete' );
+                       $note = wfMessage( 'edit_form_incomplete' )->plain();
                } else {
-                       $note = wfMsg( 'previewnote' ) .
-                               ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMsg( 'continue-editing' ) . ']]';
+                       $note = wfMessage( 'previewnote' )->plain() .
+                               ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMessage( 'continue-editing' )->text() . ']]';
                }
 
                $parserOptions = ParserOptions::newFromUser( $wgUser );
@@ -2623,10 +2663,10 @@ HTML
                        $class = 'mw-code';
                        if ( $level ) {
                                if ( preg_match( "/\\.css$/", $this->mTitle->getText() ) ) {
-                                       $previewtext = "<div id='mw-{$level}csspreview'>\n" . wfMsg( "{$level}csspreview" ) . "\n</div>";
+                                       $previewtext = "<div id='mw-{$level}csspreview'>\n" . wfMessage( "{$level}csspreview" )->text() . "\n</div>";
                                        $class .= " mw-css";
                                } elseif ( preg_match( "/\\.js$/", $this->mTitle->getText() ) ) {
-                                       $previewtext = "<div id='mw-{$level}jspreview'>\n" . wfMsg( "{$level}jspreview" ) . "\n</div>";
+                                       $previewtext = "<div id='mw-{$level}jspreview'>\n" . wfMessage( "{$level}jspreview" )->text() . "\n</div>";
                                        $class .= " mw-js";
                                } else {
                                        throw new MWException( 'A CSS/JS (sub)page but which is not css nor js!' );
@@ -2644,7 +2684,7 @@ HTML
                        # If we're adding a comment, we need to show the
                        # summary as the headline
                        if ( $this->section == "new" && $this->summary != "" ) {
-                               $toparse = wfMsgForContent( 'newsectionheaderdefaultlevel', $this->summary ) . "\n\n" . $toparse;
+                               $toparse = wfMessage( 'newsectionheaderdefaultlevel', $this->summary )->inContentLanguage()->text() . "\n\n" . $toparse;
                        }
 
                        wfRunHooks( 'EditPageGetPreviewText', array( $this, &$toparse ) );
@@ -2670,13 +2710,13 @@ HTML
                }
 
                if ( $this->isConflict ) {
-                       $conflict = '<h2 id="mw-previewconflict">' . htmlspecialchars( wfMsg( 'previewconflict' ) ) . "</h2>\n";
+                       $conflict = '<h2 id="mw-previewconflict">' . wfMessage( 'previewconflict' )->escaped() . "</h2>\n";
                } else {
                        $conflict = '<hr />';
                }
 
                $previewhead = "<div class='previewnote'>\n" .
-                       '<h2 id="mw-previewheader">' . htmlspecialchars( wfMsg( 'preview' ) ) . "</h2>" .
+                       '<h2 id="mw-previewheader">' . wfMessage( 'preview' )->escaped() . "</h2>" .
                        $wgOut->parse( $note, true, /* interface */true ) . $conflict . "</div>\n";
 
                $pageLang = $this->mTitle->getPageLanguage();
@@ -2740,8 +2780,8 @@ HTML
                                'id'     => 'mw-editbutton-bold',
                                'open'   => '\'\'\'',
                                'close'  => '\'\'\'',
-                               'sample' => wfMsg( 'bold_sample' ),
-                               'tip'    => wfMsg( 'bold_tip' ),
+                               'sample' => wfMessage( 'bold_sample' )->text(),
+                               'tip'    => wfMessage( 'bold_tip' )->text(),
                                'key'    => 'B'
                        ),
                        array(
@@ -2749,8 +2789,8 @@ HTML
                                'id'     => 'mw-editbutton-italic',
                                'open'   => '\'\'',
                                'close'  => '\'\'',
-                               'sample' => wfMsg( 'italic_sample' ),
-                               'tip'    => wfMsg( 'italic_tip' ),
+                               'sample' => wfMessage( 'italic_sample' )->text(),
+                               'tip'    => wfMessage( 'italic_tip' )->text(),
                                'key'    => 'I'
                        ),
                        array(
@@ -2758,8 +2798,8 @@ HTML
                                'id'     => 'mw-editbutton-link',
                                'open'   => '[[',
                                'close'  => ']]',
-                               'sample' => wfMsg( 'link_sample' ),
-                               'tip'    => wfMsg( 'link_tip' ),
+                               'sample' => wfMessage( 'link_sample' )->text(),
+                               'tip'    => wfMessage( 'link_tip' )->text(),
                                'key'    => 'L'
                        ),
                        array(
@@ -2767,8 +2807,8 @@ HTML
                                'id'     => 'mw-editbutton-extlink',
                                'open'   => '[',
                                'close'  => ']',
-                               'sample' => wfMsg( 'extlink_sample' ),
-                               'tip'    => wfMsg( 'extlink_tip' ),
+                               'sample' => wfMessage( 'extlink_sample' )->text(),
+                               'tip'    => wfMessage( 'extlink_tip' )->text(),
                                'key'    => 'X'
                        ),
                        array(
@@ -2776,8 +2816,8 @@ HTML
                                'id'     => 'mw-editbutton-headline',
                                'open'   => "\n== ",
                                'close'  => " ==\n",
-                               'sample' => wfMsg( 'headline_sample' ),
-                               'tip'    => wfMsg( 'headline_tip' ),
+                               'sample' => wfMessage( 'headline_sample' )->text(),
+                               'tip'    => wfMessage( 'headline_tip' )->text(),
                                'key'    => 'H'
                        ),
                        $imagesAvailable ? array(
@@ -2785,8 +2825,8 @@ HTML
                                'id'     => 'mw-editbutton-image',
                                'open'   => '[[' . $wgContLang->getNsText( NS_FILE ) . ':',
                                'close'  => ']]',
-                               'sample' => wfMsg( 'image_sample' ),
-                               'tip'    => wfMsg( 'image_tip' ),
+                               'sample' => wfMessage( 'image_sample' )->text(),
+                               'tip'    => wfMessage( 'image_tip' )->text(),
                                'key'    => 'D',
                        ) : false,
                        $imagesAvailable ? array(
@@ -2794,8 +2834,8 @@ HTML
                                'id'     => 'mw-editbutton-media',
                                'open'   => '[[' . $wgContLang->getNsText( NS_MEDIA ) . ':',
                                'close'  => ']]',
-                               'sample' => wfMsg( 'media_sample' ),
-                               'tip'    => wfMsg( 'media_tip' ),
+                               'sample' => wfMessage( 'media_sample' )->text(),
+                               'tip'    => wfMessage( 'media_tip' )->text(),
                                'key'    => 'M'
                        ) : false,
                        $wgUseTeX ? array(
@@ -2803,8 +2843,8 @@ HTML
                                'id'     => 'mw-editbutton-math',
                                'open'   => "<math>",
                                'close'  => "</math>",
-                               'sample' => wfMsg( 'math_sample' ),
-                               'tip'    => wfMsg( 'math_tip' ),
+                               'sample' => wfMessage( 'math_sample' )->text(),
+                               'tip'    => wfMessage( 'math_tip' )->text(),
                                'key'    => 'C'
                        ) : false,
                        array(
@@ -2812,8 +2852,8 @@ HTML
                                'id'     => 'mw-editbutton-nowiki',
                                'open'   => "<nowiki>",
                                'close'  => "</nowiki>",
-                               'sample' => wfMsg( 'nowiki_sample' ),
-                               'tip'    => wfMsg( 'nowiki_tip' ),
+                               'sample' => wfMessage( 'nowiki_sample' )->text(),
+                               'tip'    => wfMessage( 'nowiki_tip' )->text(),
                                'key'    => 'N'
                        ),
                        array(
@@ -2822,7 +2862,7 @@ HTML
                                'open'   => '--~~~~',
                                'close'  => '',
                                'sample' => '',
-                               'tip'    => wfMsg( 'sig_tip' ),
+                               'tip'    => wfMessage( 'sig_tip' )->text(),
                                'key'    => 'Y'
                        ),
                        array(
@@ -2831,7 +2871,7 @@ HTML
                                'open'   => "\n----\n",
                                'close'  => '',
                                'sample' => '',
-                               'tip'    => wfMsg( 'hr_tip' ),
+                               'tip'    => wfMessage( 'hr_tip' )->text(),
                                'key'    => 'R'
                        )
                );
@@ -2892,11 +2932,11 @@ HTML
                // don't show the minor edit checkbox if it's a new page or section
                if ( !$this->isNew ) {
                        $checkboxes['minor'] = '';
-                       $minorLabel = wfMsgExt( 'minoredit', array( 'parseinline' ) );
+                       $minorLabel = wfMessage( 'minoredit' )->parse();
                        if ( $wgUser->isAllowed( 'minoredit' ) ) {
                                $attribs = array(
                                        'tabindex'  => ++$tabindex,
-                                       'accesskey' => wfMsg( 'accesskey-minoredit' ),
+                                       'accesskey' => wfMessage( 'accesskey-minoredit' )->text(),
                                        'id'        => 'wpMinoredit',
                                );
                                $checkboxes['minor'] =
@@ -2907,12 +2947,12 @@ HTML
                        }
                }
 
-               $watchLabel = wfMsgExt( 'watchthis', array( 'parseinline' ) );
+               $watchLabel = wfMessage( 'watchthis' )->parse();
                $checkboxes['watch'] = '';
                if ( $wgUser->isLoggedIn() ) {
                        $attribs = array(
                                'tabindex'  => ++$tabindex,
-                               'accesskey' => wfMsg( 'accesskey-watch' ),
+                               'accesskey' => wfMessage( 'accesskey-watch' )->text(),
                                'id'        => 'wpWatchthis',
                        );
                        $checkboxes['watch'] =
@@ -2941,9 +2981,9 @@ HTML
                        'name'      => 'wpSave',
                        'type'      => 'submit',
                        'tabindex'  => ++$tabindex,
-                       'value'     => wfMsg( 'savearticle' ),
-                       'accesskey' => wfMsg( 'accesskey-save' ),
-                       'title'     => wfMsg( 'tooltip-save' ) . ' [' . wfMsg( 'accesskey-save' ) . ']',
+                       'value'     => wfMessage( 'savearticle' )->text(),
+                       'accesskey' => wfMessage( 'accesskey-save' )->text(),
+                       'title'     => wfMessage( 'tooltip-save' )->text() . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
                );
                $buttons['save'] = Xml::element( 'input', $temp, '' );
 
@@ -2953,9 +2993,9 @@ HTML
                        'name'      => 'wpPreview',
                        'type'      => 'submit',
                        'tabindex'  => $tabindex,
-                       'value'     => wfMsg( 'showpreview' ),
-                       'accesskey' => wfMsg( 'accesskey-preview' ),
-                       'title'     => wfMsg( 'tooltip-preview' ) . ' [' . wfMsg( 'accesskey-preview' ) . ']',
+                       'value'     => wfMessage( 'showpreview' )->text(),
+                       'accesskey' => wfMessage( 'accesskey-preview' )->text(),
+                       'title'     => wfMessage( 'tooltip-preview' )->text() . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
                );
                $buttons['preview'] = Xml::element( 'input', $temp, '' );
                $buttons['live'] = '';
@@ -2965,9 +3005,9 @@ HTML
                        'name'      => 'wpDiff',
                        'type'      => 'submit',
                        'tabindex'  => ++$tabindex,
-                       'value'     => wfMsg( 'showdiff' ),
-                       'accesskey' => wfMsg( 'accesskey-diff' ),
-                       'title'     => wfMsg( 'tooltip-diff' ) . ' [' . wfMsg( 'accesskey-diff' ) . ']',
+                       'value'     => wfMessage( 'showdiff' )->text(),
+                       'accesskey' => wfMessage( 'accesskey-diff' )->text(),
+                       'title'     => wfMessage( 'tooltip-diff' )->text() . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
                );
                $buttons['diff'] = Xml::element( 'input', $temp, '' );
 
@@ -2983,8 +3023,8 @@ HTML
         * failure, etc).
         *
         * @todo This doesn't include category or interlanguage links.
-        *       Would need to enhance it a bit, <s>maybe wrap them in XML
-        *       or something...</s> that might also require more skin
+        *       Would need to enhance it a bit, "<s>maybe wrap them in XML
+        *       or something...</s>" that might also require more skin
         *       initialization, so check whether that's a problem.
         */
        function livePreview() {
@@ -3048,7 +3088,7 @@ HTML
 
                $wgOut->prepareErrorPage( wfMessage( 'nosuchsectiontitle' ) );
 
-               $res = wfMsgExt( 'nosuchsectiontext', 'parse', $this->section );
+               $res = wfMessage( 'nosuchsectiontext', $this->section )->parseAsBlock();
                wfRunHooks( 'EditPageNoSuchSection', array( &$this, &$res ) );
                $wgOut->addHTML( $res );
 
@@ -3127,12 +3167,14 @@ HTML
         * @private
         */
        function checkUnicodeCompliantBrowser() {
-               global $wgBrowserBlackList;
-               if ( empty( $_SERVER["HTTP_USER_AGENT"] ) ) {
+               global $wgBrowserBlackList, $wgRequest;
+
+               $currentbrowser = $wgRequest->getHeader( 'User-Agent' );
+               if ( $currentbrowser === false ) {
                        // No User-Agent header sent? Trust it by default...
                        return true;
                }
-               $currentbrowser = $_SERVER["HTTP_USER_AGENT"];
+
                foreach ( $wgBrowserBlackList as $browser ) {
                        if ( preg_match( $browser, $currentbrowser ) ) {
                                return false;
index 9f6d5bd..a131cca 100644 (file)
@@ -33,7 +33,8 @@ class MWException extends Exception {
        var $logId;
 
        /**
-        * Should the exception use $wgOut to output the error ?
+        * Should the exception use $wgOut to output the error?
+        *
         * @return bool
         */
        function useOutputPage() {
@@ -44,7 +45,8 @@ class MWException extends Exception {
        }
 
        /**
-        * Can the extension use wfMsg() to get i18n messages ?
+        * Can the extension use the Message class/wfMessage to get i18n-ed messages?
+        *
         * @return bool
         */
        function useMessageCache() {
@@ -62,9 +64,9 @@ class MWException extends Exception {
        /**
         * Run hook to allow extensions to modify the text of the exception
         *
-        * @param $name String: class name of the exception
-        * @param $args Array: arguments to pass to the callback functions
-        * @return Mixed: string to output or null if any hook has been called
+        * @param $name string: class name of the exception
+        * @param $args array: arguments to pass to the callback functions
+        * @return string|null string to output or null if any hook has been called
         */
        function runHooks( $name, $args = array() ) {
                global $wgExceptionHooks;
@@ -97,17 +99,17 @@ class MWException extends Exception {
        /**
         * Get a message from i18n
         *
-        * @param $key String: message name
-        * @param $fallback String: default message if the message cache can't be
+        * @param $key string: message name
+        * @param $fallback string: default message if the message cache can't be
         *                  called by the exception
         * The function also has other parameters that are arguments for the message
-        * @return String message with arguments replaced
+        * @return string message with arguments replaced
         */
        function msg( $key, $fallback /*[, params...] */ ) {
                $args = array_slice( func_get_args(), 2 );
 
                if ( $this->useMessageCache() ) {
-                       return wfMsgNoTrans( $key, $args );
+                       return wfMessage( $key, $args )->plain();
                } else {
                        return wfMsgReplaceArgs( $fallback, $args );
                }
@@ -118,7 +120,7 @@ class MWException extends Exception {
         * backtrace to the error, otherwise show a message to ask to set it to true
         * to show that information.
         *
-        * @return String html to output
+        * @return string html to output
         */
        function getHTML() {
                global $wgShowExceptionDetails;
@@ -128,10 +130,10 @@ class MWException extends Exception {
                                '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
                                "</p>\n";
                } else {
-                       return 
+                       return
                                "<div class=\"errorbox\">" .
                                '[' . $this->getLogId() . '] ' .
-                               gmdate( 'Y-m-d H:i:s' ) . 
+                               gmdate( 'Y-m-d H:i:s' ) .
                                ": Fatal exception of type " . get_class( $this ) . "</div>\n" .
                                "<!-- Set \$wgShowExceptionDetails = true; " .
                                "at the bottom of LocalSettings.php to show detailed " .
@@ -140,8 +142,10 @@ class MWException extends Exception {
        }
 
        /**
+        * Get the text to display when reporting the error on the command line.
         * If $wgShowExceptionDetails is true, return a text message with a
         * backtrace to the error.
+        *
         * @return string
         */
        function getText() {
@@ -157,13 +161,21 @@ class MWException extends Exception {
        }
 
        /**
-        * Return titles of this error page
-        * @return String
+        * Return the title of the page when reporting this error in a HTTP response.
+        *
+        * @return string
         */
        function getPageTitle() {
                return $this->msg( 'internalerror', "Internal error" );
        }
 
+       /**
+        * Get a random ID for this error.
+        * This allows to link the exception to its correspoding log entry when
+        * $wgShowExceptionDetails is set to false.
+        *
+        * @return string
+        */
        function getLogId() {
                if ( $this->logId === null ) {
                        $this->logId = wfRandomString( 8 );
@@ -173,9 +185,9 @@ class MWException extends Exception {
 
        /**
         * Return the requested URL and point to file and line number from which the
-        * exception occured
+        * exception occurred
         *
-        * @return String
+        * @return string
         */
        function getLogMessage() {
                global $wgRequest;
@@ -197,7 +209,9 @@ class MWException extends Exception {
                return "[$id] $url   Exception from line $line of $file: $message";
        }
 
-       /** Output the exception report using HTML */
+       /**
+        * Output the exception report using HTML.
+        */
        function reportHTML() {
                global $wgOut;
                if ( $this->useOutputPage() ) {
@@ -213,13 +227,20 @@ class MWException extends Exception {
                        $wgOut->output();
                } else {
                        header( "Content-Type: text/html; charset=utf-8" );
+                       echo "<!doctype html>\n" .
+                               '<html><head>' .
+                               '<title>' . htmlspecialchars( $this->getPageTitle() ) . '</title>' .
+                               "</head><body>\n";
+
                        $hookResult = $this->runHooks( get_class( $this ) . "Raw" );
                        if ( $hookResult ) {
-                               die( $hookResult );
+                               echo $hookResult;
+                       } else {
+                               echo $this->getHTML();
                        }
 
-                       echo $this->getHTML();
-                       die(1);
+                       echo "</body></html>\n";
+                       die( 1 );
                }
        }
 
@@ -254,7 +275,9 @@ class MWException extends Exception {
        }
 
        /**
-        * @static
+        * Check whether we are in command line mode or not to report the exception
+        * in the correct format.
+        *
         * @return bool
         */
        static function isCommandLine() {
@@ -265,6 +288,8 @@ class MWException extends Exception {
 /**
  * Exception class which takes an HTML error message, and does not
  * produce a backtrace. Replacement for OutputPage::fatalError().
+ *
+ * @since 1.7
  * @ingroup Exception
  */
 class FatalError extends MWException {
@@ -285,14 +310,20 @@ class FatalError extends MWException {
 }
 
 /**
- * An error page which can definitely be safely rendered using the OutputPage
+ * An error page which can definitely be safely rendered using the OutputPage.
+ *
+ * @since 1.7
  * @ingroup Exception
  */
 class ErrorPageError extends MWException {
        public $title, $msg, $params;
 
        /**
-        * Note: these arguments are keys into wfMsg(), not text!
+        * Note: these arguments are keys into wfMessage(), not text!
+        *
+        * @param $title string|Message Message key (string) for page title, or a Message object
+        * @param $msg string|Message Message key (string) for error text, or a Message object
+        * @param $params array with parameters to wfMessage()
         */
        function __construct( $title, $msg, $params = null ) {
                $this->title = $title;
@@ -302,7 +333,7 @@ class ErrorPageError extends MWException {
                if( $msg instanceof Message ){
                        parent::__construct( $msg );
                } else {
-                       parent::__construct( wfMsg( $msg ) );
+                       parent::__construct( wfMessage( $msg )->text() );
                }
        }
 
@@ -318,12 +349,14 @@ class ErrorPageError extends MWException {
  * Show an error page on a badtitle.
  * Similar to ErrorPage, but emit a 400 HTTP error code to let mobile
  * browser it is not really a valid content.
+ *
+ * @since 1.19
+ * @ingroup Exception
  */
 class BadTitleError extends ErrorPageError {
-
        /**
-        * @param $msg string A message key (default: 'badtitletext')
-        * @param $params Array parameter to wfMsg()
+        * @param $msg string|Message A message key (default: 'badtitletext')
+        * @param $params Array parameter to wfMessage()
         */
        function __construct( $msg = 'badtitletext', $params = null ) {
                parent::__construct( 'badtitle', $msg, $params );
@@ -347,6 +380,8 @@ class BadTitleError extends ErrorPageError {
 /**
  * Show an error when a user tries to do something they do not have the necessary
  * permissions for.
+ *
+ * @since 1.18
  * @ingroup Exception
  */
 class PermissionsError extends ErrorPageError {
@@ -383,7 +418,9 @@ class PermissionsError extends ErrorPageError {
 
 /**
  * Show an error when the wiki is locked/read-only and the user tries to do
- * something that requires write access
+ * something that requires write access.
+ *
+ * @since 1.18
  * @ingroup Exception
  */
 class ReadOnlyError extends ErrorPageError {
@@ -397,7 +434,9 @@ class ReadOnlyError extends ErrorPageError {
 }
 
 /**
- * Show an error when the user hits a rate limit
+ * Show an error when the user hits a rate limit.
+ *
+ * @since 1.18
  * @ingroup Exception
  */
 class ThrottledError extends ErrorPageError {
@@ -416,7 +455,9 @@ class ThrottledError extends ErrorPageError {
 }
 
 /**
- * Show an error when the user tries to do something whilst blocked
+ * Show an error when the user tries to do something whilst blocked.
+ *
+ * @since 1.18
  * @ingroup Exception
  */
 class UserBlockedError extends ErrorPageError {
@@ -433,7 +474,7 @@ class UserBlockedError extends ErrorPageError {
 
                $reason = $block->mReason;
                if( $reason == '' ) {
-                       $reason = wfMsg( 'blockednoreason' );
+                       $reason = wfMessage( 'blockednoreason' )->text();
                }
 
                /* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
@@ -457,10 +498,58 @@ class UserBlockedError extends ErrorPageError {
        }
 }
 
+/**
+ * Shows a generic "user is not logged in" error page.
+ *
+ * This is essentially an ErrorPageError exception which by default use the
+ * 'exception-nologin' as a title and 'exception-nologin-text' for the message.
+ * @see bug 37627
+ * @since 1.20
+ *
+ * @par Example:
+ * @code
+ * if( $user->isAnon ) {
+ *     throw new UserNotLoggedIn();
+ * }
+ * @endcode
+ *
+ * Please note the parameters are mixed up compared to ErrorPageError, this
+ * is done to be able to simply specify a reason whitout overriding the default
+ * title.
+ *
+ * @par Example:
+ * @code
+ * if( $user->isAnon ) {
+ *     throw new UserNotLoggedIn( 'action-require-loggedin' );
+ * }
+ * @endcode
+ *
+ * @ingroup Exception
+ */
+class UserNotLoggedIn extends ErrorPageError {
+
+       /**
+        * @param $reasonMsg A message key containing the reason for the error.
+        *        Optional, default: 'exception-nologin-text'
+        * @param $titleMsg A message key to set the page title.
+        *        Optional, default: 'exception-nologin'
+        * @param $params Parameters to wfMessage().
+        *        Optiona, default: null
+        */
+       public function __construct(
+               $reasonMsg = 'exception-nologin-text',
+               $titleMsg  = 'exception-nologin',
+               $params = null
+       ) {
+               parent::__construct( $titleMsg, $reasonMsg, $params );
+       }
+}
+
 /**
  * Show an error that looks like an HTTP server error.
  * Replacement for wfHttpError().
  *
+ * @since 1.19
  * @ingroup Exception
  */
 class HttpError extends MWException {
@@ -572,7 +661,8 @@ class MWExceptionHandler {
        /**
         * Print a message, if possible to STDERR.
         * Use this in command line mode only (see isCommandLine)
-        * @param $message String Failure text
+        *
+        * @param $message string Failure text
         */
        public static function printError( $message ) {
                # NOTE: STDERR may not be available, especially if php-cgi is used from the command line (bug #15602).
@@ -586,8 +676,9 @@ class MWExceptionHandler {
 
        /**
         * Print a message after escaping it and converting newlines to <br>
-        * Use this for non-command line failures
-        * @param $message String Failure text
+        * Use this for non-command line failures.
+        *
+        * @param $message string Failure text
         */
        private static function escapeEchoAndDie( $message ) {
                echo nl2br( htmlspecialchars( $message ) ) . "\n";
index aa571f4..f01fb23 100644 (file)
@@ -58,6 +58,14 @@ class WikiExporter {
         */
        var $sink;
 
+       /**
+        * Returns the export schema version.
+        * @return string
+        */
+       public static function schemaVersion() {
+               return "0.7";
+       }
+
        /**
         * If using WikiExporter::STREAM to stream a large amount of data,
         * provide a database connection which is not managed by
@@ -465,14 +473,16 @@ class WikiExporter {
 class XmlDumpWriter {
        /**
         * Returns the export schema version.
+        * @deprecated in 1.20; use WikiExporter::schemaVersion() instead
         * @return string
         */
        function schemaVersion() {
-               return "0.7";
+               wfDeprecated( __METHOD__, '1.20' );
+               return WikiExporter::schemaVersion();
        }
 
        /**
-        * Opens the XML output stream's root <mediawiki> element.
+        * Opens the XML output stream's root "<mediawiki>" element.
         * This does not include an xml directive, so is safe to include
         * as a subelement in a larger XML stream. Namespace and XML Schema
         * references are included.
@@ -483,7 +493,7 @@ class XmlDumpWriter {
         */
        function openStream() {
                global $wgLanguageCode;
-               $ver = $this->schemaVersion();
+               $ver = WikiExporter::schemaVersion();
                return Xml::element( 'mediawiki', array(
                        'xmlns'              => "http://www.mediawiki.org/xml/export-$ver/",
                        'xmlns:xsi'          => "http://www.w3.org/2001/XMLSchema-instance",
@@ -572,7 +582,7 @@ class XmlDumpWriter {
        }
 
        /**
-        * Opens a <page> section on the output stream, with data
+        * Opens a "<page>" section on the output stream, with data
         * from the given database row.
         *
         * @param $row object
@@ -604,7 +614,7 @@ class XmlDumpWriter {
        }
 
        /**
-        * Closes a <page> section on the output stream.
+        * Closes a "<page>" section on the output stream.
         *
         * @access private
         * @return string
@@ -614,7 +624,7 @@ class XmlDumpWriter {
        }
 
        /**
-        * Dumps a <revision> section on the output stream, with
+        * Dumps a "<revision>" section on the output stream, with
         * data filled in from the given database row.
         *
         * @param $row object
@@ -678,7 +688,7 @@ class XmlDumpWriter {
        }
 
        /**
-        * Dumps a <logitem> section on the output stream, with
+        * Dumps a "<logitem>" section on the output stream, with
         * data filled in from the given database row.
         *
         * @param $row object
@@ -726,6 +736,7 @@ class XmlDumpWriter {
 
        /**
         * @param $timestamp string
+        * @param $indent string Default to six spaces
         * @return string
         */
        function writeTimestamp( $timestamp, $indent = "      " ) {
@@ -736,6 +747,7 @@ class XmlDumpWriter {
        /**
         * @param $id
         * @param $text string
+        * @param $indent string Default to six spaces
         * @return string
         */
        function writeContributor( $id, $text, $indent = "      " ) {
@@ -757,7 +769,7 @@ class XmlDumpWriter {
         * @return string
         */
        function writeUploads( $row, $dumpContents = false ) {
-               if ( $row->page_namespace == NS_IMAGE ) {
+               if ( $row->page_namespace == NS_FILE ) {
                        $img = wfLocalFile( $row->page_title );
                        if ( $img && $img->exists() ) {
                                $out = '';
@@ -815,7 +827,7 @@ class XmlDumpWriter {
         * Return prefixed text form of title, but using the content language's
         * canonical namespace. This skips any special-casing such as gendered
         * user namespaces -- which while useful, are not yet listed in the
-        * XML <siteinfo> data so are unsafe in export.
+        * XML "<siteinfo>" data so are unsafe in export.
         *
         * @param Title $title
         * @return string
index 950b437..f9dbf5b 100644 (file)
@@ -183,34 +183,35 @@ class FeedItem {
  * @todo document (needs one-sentence top-level class description).
  * @ingroup Feed
  */
-class ChannelFeed extends FeedItem {
-       /**#@+
-        * Abstract function, override!
-        * @abstract
-        */
-
+abstract class ChannelFeed extends FeedItem {
        /**
         * Generate Header of the feed
+        * @par Example:
+        * @code
+        * print "<feed>";
+        * @endcode
+        * @param $item
         */
-       function outHeader() {
-               # print "<feed>";
-       }
+       abstract public function outHeader();
 
        /**
         * Generate an item
+        * @par Example:
+        * @code
+        * print "<item>...</item>";
+        * @endcode
         * @param $item
         */
-       function outItem( $item ) {
-               # print "<item>...</item>";
-       }
+       abstract public function outItem( $item );
 
        /**
         * Generate Footer of the feed
+        * @par Example:
+        * @code
+        * print "</feed>";
+        * @endcode
         */
-       function outFooter() {
-               # print "</feed>";
-       }
-       /**#@-*/
+       abstract public function outFooter();
 
        /**
         * Setup and send HTTP headers. Don't send any content;
index 1c5e777..11b2675 100644 (file)
@@ -85,7 +85,7 @@ class FeedUtils {
                        $row->rc_last_oldid, $row->rc_this_oldid,
                        $timestamp,
                        ($row->rc_deleted & Revision::DELETED_COMMENT)
-                               ? wfMsgHtml('rev-deleted-comment') 
+                               ? wfMessage('rev-deleted-comment')->escaped()
                                : $row->rc_comment,
                        $actiontext 
                );
@@ -129,22 +129,22 @@ class FeedUtils {
                if( $oldid ) {
                        wfProfileIn( __METHOD__."-dodiff" );
 
-                       #$diffText = $de->getDiff( wfMsg( 'revisionasof',
+                       #$diffText = $de->getDiff( wfMessage( 'revisionasof',
                        #       $wgLang->timeanddate( $timestamp ),
                        #       $wgLang->date( $timestamp ),
-                       #       $wgLang->time( $timestamp ) ),
-                       #       wfMsg( 'currentrev' ) );
+                       #       $wgLang->time( $timestamp ) )->text(),
+                       #       wfMessage( 'currentrev' )->text() );
 
                        $diffText = '';
                        // Don't bother generating the diff if we won't be able to show it
                        if ( $wgFeedDiffCutoff > 0 ) {
                                $de = new DifferenceEngine( $title, $oldid, $newid );
                                $diffText = $de->getDiff(
-                                       wfMsg( 'previousrevision' ), // hack
-                                       wfMsg( 'revisionasof',
+                                       wfMessage( 'previousrevision' )->text(), // hack
+                                       wfMessage( 'revisionasof',
                                        $wgLang->timeanddate( $timestamp ),
                                        $wgLang->date( $timestamp ),
-                                       $wgLang->time( $timestamp ) ) );
+                                       $wgLang->time( $timestamp ) )->text() );
                        }
 
                        if ( $wgFeedDiffCutoff <= 0 || ( strlen( $diffText ) > $wgFeedDiffCutoff ) ) {
@@ -170,7 +170,7 @@ class FeedUtils {
                                // Omit large new page diffs, bug 29110
                                $diffText = self::getDiffLink( $title, $newid );
                        } else {
-                               $diffText = '<p><b>' . wfMsg( 'newpage' ) . '</b></p>' .
+                               $diffText = '<p><b>' . wfMessage( 'newpage' )->text() . '</b></p>' .
                                        '<div>' . nl2br( htmlspecialchars( $newtext ) ) . '</div>';
                        }
                }
@@ -196,7 +196,7 @@ class FeedUtils {
                $diffUrl = $title->getFullUrl( $queryParameters );
 
                $diffLink = Html::element( 'a', array( 'href' => $diffUrl ),
-                       wfMsgForContent( 'showdiff' ) );
+                       wfMessage( 'showdiff' )->inContentLanguage()->text() );
 
                return $diffLink;
        }
index 9d6ab65..e75ad72 100644 (file)
@@ -101,7 +101,8 @@ class FileDeleteForm {
                                $reason = $deleteReason;
                        } elseif ( $deleteReason != '' ) {
                                // Entry from drop down menu + additional comment
-                               $reason = $deleteReasonList . wfMsgForContent( 'colon-separator' ) . $deleteReason;
+                               $reason = $deleteReasonList . wfMessage( 'colon-separator' )
+                                       ->inContentLanguage()->text() . $deleteReason;
                        } else {
                                $reason = $deleteReasonList;
                        }
@@ -119,10 +120,12 @@ class FileDeleteForm {
                                // file, otherwise go back to the description page
                                $wgOut->addReturnTo( $this->oldimage ? $this->title : Title::newMainPage() );
 
-                               if ( $wgRequest->getCheck( 'wpWatch' ) && $wgUser->isLoggedIn() ) {
-                                       WatchAction::doWatch( $this->title, $wgUser );
-                               } elseif ( $this->title->userIsWatching() ) {
-                                       WatchAction::doUnwatch( $this->title, $wgUser );
+                               if ( $wgUser->isLoggedIn() && $wgRequest->getCheck( 'wpWatch' ) != $wgUser->isWatched( $this->title ) ) {
+                                       if ( $wgRequest->getCheck( 'wpWatch' ) ) {
+                                               WatchAction::doWatch( $this->title, $wgUser );
+                                       } else {
+                                               WatchAction::doUnwatch( $this->title, $wgUser );
+                                       }
                                }
                        }
                        return;
@@ -154,12 +157,20 @@ class FileDeleteForm {
                        $status = $file->deleteOld( $oldimage, $reason, $suppress );
                        if( $status->ok ) {
                                // Need to do a log item
-                               $log = new LogPage( 'delete' );
-                               $logComment = wfMsgForContent( 'deletedrevision', $oldimage );
+                               $logComment = wfMessage( 'deletedrevision', $oldimage )->inContentLanguage()->text();
                                if( trim( $reason ) != '' ) {
-                                       $logComment .= wfMsgForContent( 'colon-separator' ) . $reason;
+                                       $logComment .= wfMessage( 'colon-separator' )
+                                               ->inContentLanguage()->text() . $reason;
                                }
-                               $log->addEntry( 'delete', $title, $logComment );
+
+                               $logtype = $suppress ? 'suppress' : 'delete';
+
+                               $logEntry = new ManualLogEntry( $logtype, 'delete' );
+                               $logEntry->setPerformer( $user );
+                               $logEntry->setTarget( $title );
+                               $logEntry->setComment( $logComment );
+                               $logid = $logEntry->insert();
+                               $logEntry->publish( $logid );
                        }
                } else {
                        $status = Status::newFatal( 'cannotdelete',
@@ -170,7 +181,10 @@ class FileDeleteForm {
                        try {
                                // delete the associated article first
                                $error = '';
-                               if ( $page->doDeleteArticleReal( $reason, $suppress, 0, false, $error, $user ) >= WikiPage::DELETE_SUCCESS ) {
+                               $deleteStatus = $page->doDeleteArticleReal( $reason, $suppress, 0, false, $error, $user );
+                               // doDeleteArticleReal() returns a non-fatal error status if the page
+                               // or revision is missing, so check for isOK() rather than isGood()
+                               if ( $deleteStatus->isOK() ) {
                                        $status = $file->delete( $reason, $suppress );
                                        if( $status->isOK() ) {
                                                $dbw->commit( __METHOD__ );
@@ -202,7 +216,7 @@ class FileDeleteForm {
                        $suppress = "<tr id=\"wpDeleteSuppressRow\">
                                        <td></td>
                                        <td class='mw-input'><strong>" .
-                                               Xml::checkLabel( wfMsg( 'revdelete-suppress' ),
+                                               Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
                                                        'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '3' ) ) .
                                        "</strong></td>
                                </tr>";
@@ -210,27 +224,32 @@ class FileDeleteForm {
                        $suppress = '';
                }
 
-               $checkWatch = $wgUser->getBoolOption( 'watchdeletion' ) || $this->title->userIsWatching();
+               $checkWatch = $wgUser->getBoolOption( 'watchdeletion' ) || $wgUser->isWatched( $this->title );
                $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getAction(),
                        'id' => 'mw-img-deleteconfirm' ) ) .
                        Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, wfMsg( 'filedelete-legend' ) ) .
+                       Xml::element( 'legend', null, wfMessage( 'filedelete-legend' )->text() ) .
                        Html::hidden( 'wpEditToken', $wgUser->getEditToken( $this->oldimage ) ) .
                        $this->prepareMessage( 'filedelete-intro' ) .
                        Xml::openElement( 'table', array( 'id' => 'mw-img-deleteconfirm-table' ) ) .
                        "<tr>
                                <td class='mw-label'>" .
-                                       Xml::label( wfMsg( 'filedelete-comment' ), 'wpDeleteReasonList' ) .
+                                       Xml::label( wfMessage( 'filedelete-comment' )->text(), 'wpDeleteReasonList' ) .
                                "</td>
                                <td class='mw-input'>" .
-                                       Xml::listDropDown( 'wpDeleteReasonList',
-                                               wfMsgForContent( 'filedelete-reason-dropdown' ),
-                                               wfMsgForContent( 'filedelete-reason-otherlist' ), '', 'wpReasonDropDown', 1 ) .
+                                       Xml::listDropDown(
+                                               'wpDeleteReasonList',
+                                               wfMessage( 'filedelete-reason-dropdown' )->inContentLanguage()->text(),
+                                               wfMessage( 'filedelete-reason-otherlist' )->inContentLanguage()->text(),
+                                               '',
+                                               'wpReasonDropDown',
+                                               1
+                                       ) .
                                "</td>
                        </tr>
                        <tr>
                                <td class='mw-label'>" .
-                                       Xml::label( wfMsg( 'filedelete-otherreason' ), 'wpReason' ) .
+                                       Xml::label( wfMessage( 'filedelete-otherreason' )->text(), 'wpReason' ) .
                                "</td>
                                <td class='mw-input'>" .
                                        Xml::input( 'wpReason', 60, $wgRequest->getText( 'wpReason' ),
@@ -243,7 +262,7 @@ class FileDeleteForm {
                        <tr>
                                <td></td>
                                <td class='mw-input'>" .
-                                       Xml::checkLabel( wfMsg( 'watchthis' ),
+                                       Xml::checkLabel( wfMessage( 'watchthis' )->text(),
                                                'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
                                "</td>
                        </tr>";
@@ -252,7 +271,7 @@ class FileDeleteForm {
                        <tr>
                                <td></td>
                                <td class='mw-submit'>" .
-                                       Xml::submitButton( wfMsg( 'filedelete-submit' ),
+                                       Xml::submitButton( wfMessage( 'filedelete-submit' )->text(),
                                                array( 'name' => 'mw-filedelete-submit', 'id' => 'mw-filedelete-submit', 'tabindex' => '4' ) ) .
                                "</td>
                        </tr>" .
@@ -264,7 +283,7 @@ class FileDeleteForm {
                                $title = Title::makeTitle( NS_MEDIAWIKI, 'Filedelete-reason-dropdown' );
                                $link = Linker::link(
                                        $title,
-                                       wfMsgHtml( 'filedelete-edit-reasonlist' ),
+                                       wfMessage( 'filedelete-edit-reasonlist' )->escaped(),
                                        array(),
                                        array( 'action' => 'edit' )
                                );
@@ -279,7 +298,8 @@ class FileDeleteForm {
         */
        private function showLogEntries() {
                global $wgOut;
-               $wgOut->addHTML( '<h2>' . htmlspecialchars( LogPage::logName( 'delete' ) ) . "</h2>\n" );
+               $deleteLogPage = new LogPage( 'delete' );
+               $wgOut->addHTML( '<h2>' . $deleteLogPage->getName()->escaped() . "</h2>\n" );
                LogEventsList::showLogExtract( $wgOut, 'delete', $this->title );
        }
 
@@ -294,19 +314,17 @@ class FileDeleteForm {
        private function prepareMessage( $message ) {
                global $wgLang;
                if( $this->oldimage ) {
-                       return wfMsgExt(
+                       return wfMessage(
                                "{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
-                               'parse',
                                wfEscapeWikiText( $this->title->getText() ),
                                $wgLang->date( $this->getTimestamp(), true ),
                                $wgLang->time( $this->getTimestamp(), true ),
-                               wfExpandUrl( $this->file->getArchiveUrl( $this->oldimage ), PROTO_CURRENT ) );
+                               wfExpandUrl( $this->file->getArchiveUrl( $this->oldimage ), PROTO_CURRENT ) )->parseAsBlock();
                } else {
-                       return wfMsgExt(
+                       return wfMessage(
                                $message,
-                               'parse',
                                wfEscapeWikiText( $this->title->getText() )
-                       );
+                       )->parseAsBlock();
                }
        }
 
index ba9bf74..84cdeea 100644 (file)
@@ -932,10 +932,7 @@ function wfMatchesDomainList( $url, $domains ) {
  * @param $logonly Bool: set true to avoid appearing in HTML when $wgDebugComments is set
  */
 function wfDebug( $text, $logonly = false ) {
-       global $wgOut, $wgDebugLogFile, $wgDebugComments, $wgProfileOnly, $wgDebugRawPage;
-       global $wgDebugLogPrefix, $wgShowDebug;
-
-       static $cache = array(); // Cache of unoutputted messages
+       global $wgDebugLogFile, $wgProfileOnly, $wgDebugRawPage, $wgDebugLogPrefix;
 
        if ( !$wgDebugRawPage && wfIsDebugRawPage() ) {
                return;
@@ -946,15 +943,10 @@ function wfDebug( $text, $logonly = false ) {
                $text = preg_replace( '/[^\n]/', $timer . '\0', $text, 1 );
        }
 
-       if ( ( $wgDebugComments || $wgShowDebug ) && !$logonly ) {
-               $cache[] = $text;
-
-               if ( isset( $wgOut ) && is_object( $wgOut ) ) {
-                       // add the message and any cached messages to the output
-                       array_map( array( $wgOut, 'debug' ), $cache );
-                       $cache = array();
-               }
+       if ( !$logonly ) {
+               MWDebug::debugMsg( $text );
        }
+
        if ( wfRunHooks( 'Debug', array( $text, null /* no log group */ ) ) ) {
                if ( $wgDebugLogFile != '' && !$wgProfileOnly ) {
                        # Strip unprintables; they can switch terminal modes when binary data
@@ -964,8 +956,6 @@ function wfDebug( $text, $logonly = false ) {
                        wfErrorLog( $text, $wgDebugLogFile );
                }
        }
-
-       MWDebug::debugMsg( $text );
 }
 
 /**
@@ -1053,11 +1043,28 @@ function wfDebugLog( $logGroup, $text, $public = true ) {
  * @param $text String: database error message.
  */
 function wfLogDBError( $text ) {
-       global $wgDBerrorLog;
+       global $wgDBerrorLog, $wgDBerrorLogTZ;
+       static $logDBErrorTimeZoneObject = null;
+
        if ( $wgDBerrorLog ) {
                $host = wfHostname();
                $wiki = wfWikiID();
-               $text = date( 'D M j G:i:s T Y' ) . "\t$host\t$wiki\t$text";
+
+               if ( $wgDBerrorLogTZ && !$logDBErrorTimeZoneObject ) {
+                       $logDBErrorTimeZoneObject = new DateTimeZone( $wgDBerrorLogTZ );
+               }
+
+               // Workaround for https://bugs.php.net/bug.php?id=52063
+               // Can be removed when min PHP > 5.3.2
+               if ( $logDBErrorTimeZoneObject === null ) {
+                       $d = date_create( "now" );
+               } else {
+                       $d = date_create( "now", $logDBErrorTimeZoneObject );
+               }
+
+               $date = $d->format( 'D M j G:i:s T Y' );
+
+               $text = "$date\t$host\t$wiki\t$text";
                wfErrorLog( $text, $wgDBerrorLog );
        }
 }
@@ -1075,35 +1082,7 @@ function wfLogDBError( $text ) {
  * @return null
  */
 function wfDeprecated( $function, $version = false, $component = false, $callerOffset = 2 ) {
-       static $functionsWarned = array();
-
-       MWDebug::deprecated( $function, $version, $component );
-
-       if ( !isset( $functionsWarned[$function] ) ) {
-               $functionsWarned[$function] = true;
-
-               if ( $version ) {
-                       global $wgDeprecationReleaseLimit;
-
-                       if ( $wgDeprecationReleaseLimit && $component === false ) {
-                               # Strip -* off the end of $version so that branches can use the
-                               # format #.##-branchname to avoid issues if the branch is merged into
-                               # a version of MediaWiki later than what it was branched from
-                               $comparableVersion = preg_replace( '/-.*$/', '', $version );
-
-                               # If the comparableVersion is larger than our release limit then
-                               # skip the warning message for the deprecation
-                               if ( version_compare( $wgDeprecationReleaseLimit, $comparableVersion, '<' ) ) {
-                                       return;
-                               }
-                       }
-
-                       $component = $component === false ? 'MediaWiki' : $component;
-                       wfWarn( "Use of $function was deprecated in $component $version.", $callerOffset );
-               } else {
-                       wfWarn( "Use of $function is deprecated.", $callerOffset );
-               }
-       }
+       MWDebug::deprecated( $function, $version, $component, $callerOffset + 1 );
 }
 
 /**
@@ -1117,34 +1096,7 @@ function wfDeprecated( $function, $version = false, $component = false, $callerO
  *        is true
  */
 function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
-       global $wgDevelopmentWarnings;
-
-       MWDebug::warning( $msg, $callerOffset + 2 );
-
-       $callers = wfDebugBacktrace();
-       if ( isset( $callers[$callerOffset + 1] ) ) {
-               $callerfunc = $callers[$callerOffset + 1];
-               $callerfile = $callers[$callerOffset];
-               if ( isset( $callerfile['file'] ) && isset( $callerfile['line'] ) ) {
-                       $file = $callerfile['file'] . ' at line ' . $callerfile['line'];
-               } else {
-                       $file = '(internal function)';
-               }
-               $func = '';
-               if ( isset( $callerfunc['class'] ) ) {
-                       $func .= $callerfunc['class'] . '::';
-               }
-               if ( isset( $callerfunc['function'] ) ) {
-                       $func .= $callerfunc['function'];
-               }
-               $msg .= " [Called from $func in $file]";
-       }
-
-       if ( $wgDevelopmentWarnings ) {
-               trigger_error( $msg, $level );
-       } else {
-               wfDebug( "$msg\n" );
-       }
+       MWDebug::warning( $msg, $callerOffset + 1, $level );
 }
 
 /**
@@ -1447,6 +1399,8 @@ function wfMessageFallback( /*...*/ ) {
  * Use wfMsgForContent() instead if the message should NOT
  * change depending on the user preferences.
  *
+ * @deprecated since 1.18
+ *
  * @param $key String: lookup key for the message, usually
  *    defined in languages/Language.php
  *
@@ -1467,6 +1421,8 @@ function wfMsg( $key ) {
 /**
  * Same as above except doesn't transform the message
  *
+ * @deprecated since 1.18
+ *
  * @param $key String
  * @return String
  */
@@ -1495,6 +1451,8 @@ function wfMsgNoTrans( $key ) {
  * customize potentially hundreds of messages in
  * order to, e.g., fix a link in every possible language.
  *
+ * @deprecated since 1.18
+ *
  * @param $key String: lookup key for the message, usually
  *     defined in languages/Language.php
  * @return String
@@ -1515,6 +1473,8 @@ function wfMsgForContent( $key ) {
 /**
  * Same as above except doesn't transform the message
  *
+ * @deprecated since 1.18
+ *
  * @param $key String
  * @return String
  */
@@ -1534,6 +1494,8 @@ function wfMsgForContentNoTrans( $key ) {
 /**
  * Really get a message
  *
+ * @deprecated since 1.18
+ *
  * @param $key String: key to get.
  * @param $args
  * @param $useDB Boolean
@@ -1552,6 +1514,8 @@ function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform
 /**
  * Fetch a message string value, but don't replace any keys yet.
  *
+ * @deprecated since 1.18
+ *
  * @param $key String
  * @param $useDB Bool
  * @param $langCode String: Code of the language to get the message for, or
@@ -1575,6 +1539,8 @@ function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true
 /**
  * Replace message parameter keys on the given formatted output.
  *
+ * @deprecated since 1.18
+ *
  * @param $message String
  * @param $args Array
  * @return string
@@ -1607,6 +1573,8 @@ function wfMsgReplaceArgs( $message, $args ) {
  * to pre-escape them if you really do want plaintext, or just wrap
  * the whole thing in htmlspecialchars().
  *
+ * @deprecated since 1.18
+ *
  * @param $key String
  * @param string ... parameters
  * @return string
@@ -1624,6 +1592,8 @@ function wfMsgHtml( $key ) {
  * to pre-escape them if you really do want plaintext, or just wrap
  * the whole thing in htmlspecialchars().
  *
+ * @deprecated since 1.18
+ *
  * @param $key String
  * @param string ... parameters
  * @return string
@@ -1639,6 +1609,9 @@ function wfMsgWikiHtml( $key ) {
 
 /**
  * Returns message in the requested format
+ *
+ * @deprecated since 1.18
+ *
  * @param $key String: key of the message
  * @param $options Array: processing rules. Can take the following options:
  *   <i>parse</i>: parses wikitext to HTML
@@ -1731,6 +1704,8 @@ function wfMsgExt( $key, $options ) {
  * looked up didn't exist but a XHTML string, this function checks for the
  * nonexistance of messages by checking the MessageCache::get() result directly.
  *
+ * @deprecated since 1.18. Use Message::isDisabled().
+ *
  * @param $key      String: the message key looked up
  * @return Boolean True if the message *doesn't* exist.
  */
@@ -1758,6 +1733,15 @@ function wfDebugDieBacktrace( $msg = '' ) {
 function wfHostname() {
        static $host;
        if ( is_null( $host ) ) {
+
+               # Hostname overriding
+               global $wgOverrideHostname;
+               if( $wgOverrideHostname !== false ) {
+                       # Set static and skip any detection
+                       $host = $wgOverrideHostname;
+                       return $host;
+               }
+
                if ( function_exists( 'posix_uname' ) ) {
                        // This function not present on Windows
                        $uname = posix_uname();
@@ -1895,16 +1879,15 @@ function wfBacktrace() {
  * wfGetCaller( 3 ) is the parent of that.
  *
  * @param $level Int
- * @return Bool|string
+ * @return string
  */
 function wfGetCaller( $level = 2 ) {
        $backtrace = wfDebugBacktrace( $level + 1 );
        if ( isset( $backtrace[$level] ) ) {
                return wfFormatStackFrame( $backtrace[$level] );
        } else {
-               $caller = 'unknown';
+               return 'unknown';
        }
-       return $caller;
 }
 
 /**
@@ -1928,7 +1911,7 @@ function wfGetAllCallers( $limit = 3 ) {
  * Return a string representation of frame
  *
  * @param $frame Array
- * @return Bool
+ * @return string
  */
 function wfFormatStackFrame( $frame ) {
        return isset( $frame['class'] ) ?
@@ -1948,13 +1931,7 @@ function wfFormatStackFrame( $frame ) {
  * @return String
  */
 function wfShowingResults( $offset, $limit ) {
-       global $wgLang;
-       return wfMsgExt(
-               'showingresults',
-               array( 'parseinline' ),
-               $wgLang->formatNum( $limit ),
-               $wgLang->formatNum( $offset + 1 )
-       );
+       return wfMessage( 'showingresults' )->numParams( $limit, $offset + 1 )->parse();
 }
 
 /**
@@ -2054,7 +2031,7 @@ function wfCheckLimits( $deflimit = 50, $optionname = 'rclimit' ) {
  * Escapes the given text so that it may be output using addWikiText()
  * without any linking, formatting, etc. making its way through. This
  * is achieved by substituting certain characters with HTML entities.
- * As required by the callers, <nowiki> is not used.
+ * As required by the callers, "<nowiki>" is not used.
  *
  * @param $text String: text to be escaped
  * @return String
@@ -2350,11 +2327,7 @@ function wfSuppressWarnings( $end = false ) {
                }
        } else {
                if ( !$suppressCount ) {
-                       // E_DEPRECATED is undefined in PHP 5.2
-                       if( !defined( 'E_DEPRECATED' ) ) {
-                               define( 'E_DEPRECATED', 8192 );
-                       }
-                       $originalLevel = error_reporting( E_ALL & ~( E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE | E_DEPRECATED ) );
+                       $originalLevel = error_reporting( E_ALL & ~( E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE | E_DEPRECATED | E_USER_DEPRECATED ) );
                }
                ++$suppressCount;
        }
@@ -2649,7 +2622,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
        global $wgDirectoryMode;
 
        if ( FileBackend::isStoragePath( $dir ) ) { // sanity
-               throw new MWException( __FUNCTION__ . " given storage path `$dir`.");
+               throw new MWException( __FUNCTION__ . " given storage path '$dir'." );
        }
 
        if ( !is_null( $caller ) ) {
@@ -2865,9 +2838,11 @@ function wfEscapeShellArg( ) {
  *                 (non-zero is usually failure)
  * @param $environ Array optional environment variables which should be
  *                 added to the executed command environment.
+ * @param $limits Array optional array with limits(filesize, memory, time)
+ *                 this overwrites the global wgShellMax* limits.
  * @return string collected stdout as a string (trailing newlines stripped)
  */
-function wfShellExec( $cmd, &$retval = null, $environ = array() ) {
+function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
        global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime;
 
        static $disabled;
@@ -2915,9 +2890,9 @@ function wfShellExec( $cmd, &$retval = null, $environ = array() ) {
        $cmd = $envcmd . $cmd;
 
        if ( php_uname( 's' ) == 'Linux' ) {
-               $time = intval( $wgMaxShellTime );
-               $mem = intval( $wgMaxShellMemory );
-               $filesize = intval( $wgMaxShellFileSize );
+               $time = intval ( isset($limits['time']) ? $limits['time'] : $wgMaxShellTime );
+               $mem = intval ( isset($limits['memory']) ? $limits['memory'] : $wgMaxShellMemory );
+               $filesize = intval ( isset($limits['filesize']) ? $limits['filesize'] : $wgMaxShellFileSize );
 
                if ( $time > 0 && $mem > 0 ) {
                        $script = "$IP/bin/ulimit4.sh";
@@ -3183,11 +3158,11 @@ function wfUseMW( $req_ver ) {
 
 /**
  * Return the final portion of a pathname.
- * Reimplemented because PHP5's basename() is buggy with multibyte text.
+ * Reimplemented because PHP5's "basename()" is buggy with multibyte text.
  * http://bugs.php.net/bug.php?id=33898
  *
  * PHP's basename() only considers '\' a pathchar on Windows and Netware.
- * We'll consider it so always, as we don't want \s in our Unix paths either.
+ * We'll consider it so always, as we don't want '\s' in our Unix paths either.
  *
  * @param $path String
  * @param $suffix String: to remove if present
@@ -3412,21 +3387,10 @@ function wfFixSessionID() {
  * @param $sessionId Bool
  */
 function wfSetupSession( $sessionId = false ) {
-       global $wgSessionsInMemcached, $wgCookiePath, $wgCookieDomain,
+       global $wgSessionsInMemcached, $wgSessionsInObjectCache, $wgCookiePath, $wgCookieDomain,
                        $wgCookieSecure, $wgCookieHttpOnly, $wgSessionHandler;
-       if( $wgSessionsInMemcached ) {
-               if ( !defined( 'MW_COMPILED' ) ) {
-                       global $IP;
-                       require_once( "$IP/includes/cache/MemcachedSessions.php" );
-               }
-               session_set_save_handler( 'memsess_open', 'memsess_close', 'memsess_read',
-                       'memsess_write', 'memsess_destroy', 'memsess_gc' );
-
-               // It's necessary to register a shutdown function to call session_write_close(),
-               // because by the time the request shutdown function for the session module is
-               // called, $wgMemc has already been destroyed. Shutdown functions registered
-               // this way are called before object destruction.
-               register_shutdown_function( 'memsess_write_close' );
+       if( $wgSessionsInObjectCache || $wgSessionsInMemcached ) {
+               ObjectCacheSessionHandler::install();
        } 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)
@@ -3641,13 +3605,20 @@ function wfQueriesMustScale() {
 /**
  * Get the path to a specified script file, respecting file
  * extensions; this is a wrapper around $wgScriptExtension etc.
+ * except for 'index' and 'load' which use $wgScript/$wgLoadScript
  *
  * @param $script String: script filename, sans extension
  * @return String
  */
 function wfScript( $script = 'index' ) {
-       global $wgScriptPath, $wgScriptExtension;
-       return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
+       global $wgScriptPath, $wgScriptExtension, $wgScript, $wgLoadScript;
+       if ( $script === 'index' ) {
+               return $wgScript;
+       } else if ( $script === 'load' ) {
+               return $wgLoadScript;
+       } else {
+               return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
+       }
 }
 
 /**
@@ -3778,17 +3749,18 @@ function wfGenerateToken( $salt = '' ) {
 
 /**
  * Replace all invalid characters with -
+ * Additional characters can be defined in $wgIllegalFileChars (see bug 20489)
+ * By default, $wgIllegalFileChars = ':'
  *
  * @param $name Mixed: filename to process
  * @return String
  */
 function wfStripIllegalFilenameChars( $name ) {
        global $wgIllegalFileChars;
+       $illegalFileChars = $wgIllegalFileChars ? "|[" . $wgIllegalFileChars . "]" : '';
        $name = wfBaseName( $name );
        $name = preg_replace(
-               "/[^" . Title::legalChars() . "]" .
-                       ( $wgIllegalFileChars ? "|[" . $wgIllegalFileChars . "]" : '' ) .
-                       "/",
+               "/[^" . Title::legalChars() . "]" . $illegalFileChars . "/",
                '-',
                $name
        );
@@ -4019,7 +3991,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
                $badImages = $badImageCache;
        } else { // cache miss
                if ( $blacklist === null ) {
-                       $blacklist = wfMsgForContentNoTrans( 'bad_image_list' ); // site list
+                       $blacklist = wfMessage( 'bad_image_list' )->inContentLanguage()->plain(); // site list
                }
                # Build the list now
                $badImages = array();
index 36008fb..5c00b9f 100644 (file)
  * object, and typically implement at least getInputHTML, which generates
  * the HTML for the input field to be placed in the table.
  *
+ * You can find extensive documentation on the www.mediawiki.org wiki:
+ *  - http://www.mediawiki.org/wiki/HTMLForm
+ *  - http://www.mediawiki.org/wiki/HTMLForm/tutorial
+ *
  * The constructor input is an associative array of $fieldname => $info,
  * where $info is an Associative Array with any of the following:
  *
  *                              (eg one without the "wp" prefix), specify it here and
  *                              it will be used without modification.
  *
+ * Since 1.20, you can chain mutators to ease the form generation:
+ * @par Example:
+ * @code
+ * $form = new HTMLForm( $someFields );
+ * $form->setMethod( 'get' )
+ *      ->setWrapperLegendMsg( 'message-key' )
+ *      ->suppressReset()
+ *      ->prepareForm()
+ *      ->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 :(
+ *
  * TODO: Document 'section' / 'subsection' stuff
  */
 class HTMLForm extends ContextSource {
@@ -232,12 +249,14 @@ class HTMLForm extends ContextSource {
         * @param $format String the name of the format to use, must be one of
         *        $this->availableDisplayFormats
         * @since 1.20
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setDisplayFormat( $format ) {
                if ( !in_array( $format, $this->availableDisplayFormats ) ) {
                        throw new MWException ( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
                }
                $this->displayFormat = $format;
+               return $this;
        }
 
        /**
@@ -288,7 +307,12 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * Prepare form for submission
+        * Prepare form for submission.
+        *
+        * @attention When doing method chaining, that should be the very last
+        * method call before displayForm().
+        *
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function prepareForm() {
                # Check if we have the info we need
@@ -298,6 +322,7 @@ class HTMLForm extends ContextSource {
 
                # Load data from the request.
                $this->loadData();
+               return $this;
        }
 
        /**
@@ -390,45 +415,60 @@ class HTMLForm extends ContextSource {
         *       the output from HTMLForm::filterDataForSubmit, and must
         *       return Bool true on success, Bool false if no submission
         *       was attempted, or String HTML output to display on error.
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setSubmitCallback( $cb ) {
                $this->mSubmitCallback = $cb;
+               return $this;
        }
 
        /**
         * Set a message to display on a validation error.
-        * @param $msg Mixed String or Array of valid inputs to wfMsgExt()
+        * @param $msg Mixed String or Array of valid inputs to wfMessage()
         *       (so each entry can be either a String or Array)
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setValidationErrorMessage( $msg ) {
                $this->mValidationErrorMessage = $msg;
+               return $this;
        }
 
        /**
         * Set the introductory message, overwriting any existing message.
         * @param $msg String complete text of message to display
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setIntro( $msg ) {
                $this->setPreText( $msg );
+               return $this;
        }
 
        /**
         * Set the introductory message, overwriting any existing message.
         * @since 1.19
         * @param $msg String complete text of message to display
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
-       function setPreText( $msg ) { $this->mPre = $msg; }
+       function setPreText( $msg ) {
+               $this->mPre = $msg;
+               return $this;
+       }
 
        /**
         * Add introductory text.
         * @param $msg String complete text of message to display
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
-       function addPreText( $msg ) { $this->mPre .= $msg; }
+       function addPreText( $msg ) {
+               $this->mPre .= $msg;
+               return $this;
+       }
 
        /**
         * Add header text, inside the form.
         * @param $msg String complete text of message to display
         * @param $section string The section to add the header to
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function addHeaderText( $msg, $section = null ) {
                if ( is_null( $section ) ) {
@@ -439,6 +479,7 @@ class HTMLForm extends ContextSource {
                        }
                        $this->mSectionHeaders[$section] .= $msg;
                }
+               return $this;
        }
 
        /**
@@ -446,6 +487,7 @@ class HTMLForm extends ContextSource {
         * @since 1.19
         * @param $msg String complete text of message to display
         * @param $section The section to add the header to
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setHeaderText( $msg, $section = null ) {
                if ( is_null( $section ) ) {
@@ -453,12 +495,14 @@ class HTMLForm extends ContextSource {
                } else {
                        $this->mSectionHeaders[$section] = $msg;
                }
+               return $this;
        }
 
        /**
         * Add footer text, inside the form.
         * @param $msg String complete text of message to display
         * @param $section string The section to add the footer text to
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function addFooterText( $msg, $section = null ) {
                if ( is_null( $section ) ) {
@@ -469,6 +513,7 @@ class HTMLForm extends ContextSource {
                        }
                        $this->mSectionFooters[$section] .= $msg;
                }
+               return $this;
        }
 
        /**
@@ -476,6 +521,7 @@ class HTMLForm extends ContextSource {
         * @since 1.19
         * @param $msg String complete text of message to display
         * @param $section string The section to add the footer text to
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setFooterText( $msg, $section = null ) {
                if ( is_null( $section ) ) {
@@ -483,39 +529,65 @@ class HTMLForm extends ContextSource {
                } else {
                        $this->mSectionFooters[$section] = $msg;
                }
+               return $this;
        }
 
        /**
         * Add text to the end of the display.
         * @param $msg String complete text of message to display
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
-       function addPostText( $msg ) { $this->mPost .= $msg; }
+       function addPostText( $msg ) {
+               $this->mPost .= $msg;
+               return $this;
+       }
 
        /**
         * Set text at the end of the display.
         * @param $msg String complete text of message to display
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
-       function setPostText( $msg ) { $this->mPost = $msg; }
+       function setPostText( $msg ) {
+               $this->mPost = $msg;
+               return $this;
+       }
 
        /**
         * Add a hidden field to the output
         * @param $name String field name.  This will be used exactly as entered
         * @param $value String field value
         * @param $attribs Array
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function addHiddenField( $name, $value, $attribs = array() ) {
                $attribs += array( 'name' => $name );
                $this->mHiddenFields[] = array( $value, $attribs );
+               return $this;
        }
 
+       /**
+        * Add a button to the form
+        * @param $name String field name.
+        * @param $value String field value
+        * @param $id String DOM id for the button (default: null)
+        * @param $attribs Array
+        * @return HTMLForm $this for chaining calls (since 1.20)
+        */
        public function addButton( $name, $value, $id = null, $attribs = null ) {
                $this->mButtons[] = compact( 'name', 'value', 'id', 'attribs' );
+               return $this;
        }
 
        /**
         * Display the form (sending to $wgOut), with an appropriate error
         * message or stack of messages, and any validation errors, etc.
+        *
+        * @attention You should call prepareForm() before calling this function.
+        * Moreover, when doing method chaining this should be the very last method
+        * call just after prepareForm().
+        *
         * @param $submitResult Mixed output from HTMLForm::trySubmit()
+        * @return Nothing, should be last call
         */
        function displayForm( $submitResult ) {
                $this->getOutput()->addHTML( $this->getHTML( $submitResult ) );
@@ -546,7 +618,7 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * Wrap the form innards in an actual <form> element
+        * Wrap the form innards in an actual "<form>" element
         * @param $html String HTML contents to wrap.
         * @return String wrapped HTML.
         */
@@ -628,7 +700,7 @@ class HTMLForm extends ContextSource {
                                'input',
                                array(
                                        'type' => 'reset',
-                                       'value' => wfMsg( 'htmlform-reset' )
+                                       'value' => $this->msg( 'htmlform-reset' )->text()
                                )
                        ) . "\n";
                }
@@ -688,7 +760,7 @@ class HTMLForm extends ContextSource {
        /**
         * Format a stack of error messages into a single HTML string
         * @param $errors Array of message keys/values
-        * @return String HTML, a <ul> list of errors
+        * @return String HTML, a "<ul>" list of errors
         */
        public static function formatErrors( $errors ) {
                $errorstr = '';
@@ -704,7 +776,7 @@ class HTMLForm extends ContextSource {
                        $errorstr .= Html::rawElement(
                                'li',
                                array(),
-                               wfMsgExt( $msg, array( 'parseinline' ), $error )
+                               wfMessage( $msg, $error )->parse()
                        );
                }
 
@@ -716,18 +788,22 @@ class HTMLForm extends ContextSource {
        /**
         * Set the text for the submit button
         * @param $t String plaintext.
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setSubmitText( $t ) {
                $this->mSubmitText = $t;
+               return $this;
        }
 
        /**
         * Set the text for the submit button to a message
         * @since 1.19
         * @param $msg String message key
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setSubmitTextMsg( $msg ) {
                $this->setSubmitText( $this->msg( $msg )->text() );
+               return $this;
        }
 
        /**
@@ -737,63 +813,90 @@ class HTMLForm extends ContextSource {
        function getSubmitText() {
                return $this->mSubmitText
                        ? $this->mSubmitText
-                       : wfMsg( 'htmlform-submit' );
+                       : $this->msg( 'htmlform-submit' )->text();
        }
 
+       /**
+        * @param $name String Submit button name
+        * @return HTMLForm $this for chaining calls (since 1.20)
+        */
        public function setSubmitName( $name ) {
                $this->mSubmitName = $name;
+               return $this;
        }
 
+       /**
+        * @param $name String Tooltip for the submit button
+        * @return HTMLForm $this for chaining calls (since 1.20)
+        */
        public function setSubmitTooltip( $name ) {
                $this->mSubmitTooltip = $name;
+               return $this;
        }
 
        /**
         * Set the id for the submit button.
         * @param $t String.
         * @todo FIXME: Integrity of $t is *not* validated
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setSubmitID( $t ) {
                $this->mSubmitID = $t;
+               return $this;
        }
 
+       /**
+        * @param $id String DOM id for the form
+        * @return HTMLForm $this for chaining calls (since 1.20)
+        */
        public function setId( $id ) {
                $this->mId = $id;
+               return $this;
        }
        /**
-        * Prompt the whole form to be wrapped in a <fieldset>, with
-        * this text as its <legend> element.
-        * @param $legend String HTML to go inside the <legend> element.
+        * Prompt the whole form to be wrapped in a "<fieldset>", with
+        * this text as its "<legend>" element.
+        * @param $legend String HTML to go inside the "<legend>" element.
         *       Will be escaped
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
-       public function setWrapperLegend( $legend ) { $this->mWrapperLegend = $legend; }
+       public function setWrapperLegend( $legend ) {
+               $this->mWrapperLegend = $legend;
+               return $this;
+       }
 
        /**
-        * Prompt the whole form to be wrapped in a <fieldset>, with
-        * this message as its <legend> element.
+        * Prompt the whole form to be wrapped in a "<fieldset>", with
+        * this message as its "<legend>" element.
         * @since 1.19
         * @param $msg String message key
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setWrapperLegendMsg( $msg ) {
-               $this->setWrapperLegend( $this->msg( $msg )->escaped() );
+               $this->setWrapperLegend( $this->msg( $msg )->text() );
+               return $this;
        }
 
        /**
         * Set the prefix for various default messages
-        * TODO: currently only used for the <fieldset> legend on forms
+        * @todo currently only used for the "<fieldset>" legend on forms
         * with multiple sections; should be used elsewhre?
         * @param $p String
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setMessagePrefix( $p ) {
                $this->mMessagePrefix = $p;
+               return $this;
        }
 
        /**
         * Set the title for form submission
         * @param $t Title of page the form is on/should be posted to
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function setTitle( $t ) {
                $this->mTitle = $t;
+               return $this;
        }
 
        /**
@@ -809,9 +912,11 @@ class HTMLForm extends ContextSource {
        /**
         * Set the method used to submit the form
         * @param $method String
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setMethod( $method = 'post' ) {
                $this->mMethod = $method;
+               return $this;
        }
 
        public function getMethod() {
@@ -819,10 +924,10 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * TODO: Document
+        * @todo Document
         * @param $fields array[]|HTMLFormField[] array of fields (either arrays or objects)
-        * @param $sectionName string ID attribute of the <table> tag for this section, ignored if empty
-        * @param $fieldsetIDPrefix string ID prefix for the <fieldset> tag of each subsection, ignored if empty
+        * @param $sectionName string ID attribute of the "<table>" tag for this section, ignored if empty
+        * @param $fieldsetIDPrefix string ID prefix for the "<fieldset>" tag of each subsection, ignored if empty
         * @return String
         */
        public function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '' ) {
@@ -921,9 +1026,11 @@ class HTMLForm extends ContextSource {
         * Stop a reset button being shown for this form
         * @param $suppressReset Bool set to false to re-enable the
         *       button again
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function suppressReset( $suppressReset = true ) {
                $this->mShowReset = !$suppressReset;
+               return $this;
        }
 
        /**
@@ -938,13 +1045,13 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * Get a string to go in the <legend> of a section fieldset.  Override this if you
-        * want something more complicated
+        * Get a string to go in the "<legend>" of a section fieldset.
+        * Override this if you want something more complicated.
         * @param $key String
         * @return String
         */
        public function getLegend( $key ) {
-               return wfMsg( "{$this->mMessagePrefix}-$key" );
+               return $this->msg( "{$this->mMessagePrefix}-$key" )->text();
        }
 
        /**
@@ -954,9 +1061,11 @@ class HTMLForm extends ContextSource {
         * @since 1.19
         *
         * @param string|bool $action
+        * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function setAction( $action ) {
                $this->mAction = $action;
+               return $this;
        }
 
 }
@@ -991,6 +1100,28 @@ abstract class HTMLFormField {
         */
        abstract function getInputHTML( $value );
 
+       /**
+        * Get a translated interface message
+        *
+        * This is a wrapper arround $this->mParent->msg() if $this->mParent is set
+        * and wfMessage() otherwise.
+        *
+        * Parameters are the same as wfMessage().
+        *
+        * @return Message object
+        */
+       function msg() {
+               $args = func_get_args();
+
+               if ( $this->mParent ) {
+                       $callback = array( $this->mParent, 'msg' );
+               } else {
+                       $callback = 'wfMessage';
+               }
+
+               return call_user_func_array( $callback, $args );
+       }
+
        /**
         * Override this function to add specific validation checks on the
         * field input.  Don't forget to call parent::validate() to ensure
@@ -1000,8 +1131,8 @@ abstract class HTMLFormField {
         * @return Mixed Bool true on success, or String error to display.
         */
        function validate( $value, $alldata ) {
-               if ( isset( $this->mParams['required'] ) && $value === '' ) {
-                       return wfMsgExt( 'htmlform-required', 'parseinline' );
+               if ( isset( $this->mParams['required'] ) && $this->mParams['required'] !== false && $value === '' ) {
+                       return $this->msg( 'htmlform-required' )->parse();
                }
 
                if ( isset( $this->mValidationCallback ) ) {
@@ -1061,7 +1192,7 @@ abstract class HTMLFormField {
                                $msgInfo = array();
                        }
 
-                       $this->mLabel = wfMsgExt( $msg, 'parseinline', $msgInfo );
+                       $this->mLabel = wfMessage( $msg, $msgInfo )->parse();
                } elseif ( isset( $params['label'] ) ) {
                        $this->mLabel = $params['label'];
                }
@@ -1262,13 +1393,13 @@ abstract class HTMLFormField {
                if ( isset( $this->mParams['help-messages'] ) ) {
                        foreach ( $this->mParams['help-messages'] as $name ) {
                                $helpMessage = (array)$name;
-                               $msg = wfMessage( array_shift( $helpMessage ), $helpMessage );
+                               $msg = $this->msg( array_shift( $helpMessage ), $helpMessage );
 
                                if ( $msg->exists() ) {
                                        if ( is_null( $helptext ) ) {
                                                $helptext = '';
                                        } else {
-                                               $helptext .= wfMessage( 'word-separator' )->escaped(); // some space
+                                               $helptext .= $this->msg( 'word-separator' )->escaped(); // some space
                                        }
                                        $helptext .= $msg->parse(); // Append message
                                }
@@ -1350,7 +1481,7 @@ abstract class HTMLFormField {
 
        /**
         * flatten an array of options to a single array, for instance,
-        * a set of <options> inside <optgroups>.
+        * a set of "<options>" inside "<optgroups>".
         * @param $options array Associative Array with values either Strings
         *       or Arrays
         * @return Array flattened input
@@ -1418,18 +1549,15 @@ class HTMLTextField extends HTMLFormField {
                        $attribs['class'] = $this->mClass;
                }
 
-               if ( isset( $this->mParams['maxlength'] ) ) {
-                       $attribs['maxlength'] = $this->mParams['maxlength'];
-               }
-
                if ( !empty( $this->mParams['disabled'] ) ) {
                        $attribs['disabled'] = 'disabled';
                }
 
                # TODO: Enforce pattern, step, required, readonly on the server side as
                # well
-               foreach ( array( 'min', 'max', 'pattern', 'title', 'step',
-               'placeholder' ) as $param ) {
+               $allowedParams = array( 'min', 'max', 'pattern', 'title', 'step',
+                       'placeholder', 'list', 'maxlength' );
+               foreach ( $allowedParams as $param ) {
                        if ( isset( $this->mParams[$param] ) ) {
                                $attribs[$param] = $this->mParams[$param];
                        }
@@ -1536,7 +1664,7 @@ class HTMLFloatField extends HTMLTextField {
                # http://dev.w3.org/html5/spec/common-microsyntaxes.html#real-numbers
                # with the addition that a leading '+' sign is ok.
                if ( !preg_match( '/^((\+|\-)?\d+(\.\d+)?(E(\+|\-)?\d+)?)?$/i', $value ) ) {
-                       return wfMsgExt( 'htmlform-float-invalid', 'parse' );
+                       return $this->msg( 'htmlform-float-invalid' )->parseAsBlock();
                }
 
                # The "int" part of these message names is rather confusing.
@@ -1545,7 +1673,7 @@ class HTMLFloatField extends HTMLTextField {
                        $min = $this->mParams['min'];
 
                        if ( $min > $value ) {
-                               return wfMsgExt( 'htmlform-int-toolow', 'parse', array( $min ) );
+                               return $this->msg( 'htmlform-int-toolow', $min )->parseAsBlock();
                        }
                }
 
@@ -1553,7 +1681,7 @@ class HTMLFloatField extends HTMLTextField {
                        $max = $this->mParams['max'];
 
                        if ( $max < $value ) {
-                               return wfMsgExt( 'htmlform-int-toohigh', 'parse', array( $max ) );
+                               return $this->msg( 'htmlform-int-toohigh', $max )->parseAsBlock();
                        }
                }
 
@@ -1580,7 +1708,7 @@ class HTMLIntField extends HTMLFloatField {
                # value to, eg, save in the DB, clean it up with intval().
                if ( !preg_match( '/^((\+|\-)?\d+)?$/', trim( $value ) )
                ) {
-                       return wfMsgExt( 'htmlform-int-invalid', 'parse' );
+                       return $this->msg( 'htmlform-int-invalid' )->parseAsBlock();
                }
 
                return true;
@@ -1664,7 +1792,7 @@ class HTMLSelectField extends HTMLFormField {
                if ( in_array( $value, $validOptions ) )
                        return true;
                else
-                       return wfMsgExt( 'htmlform-select-badoption', 'parseinline' );
+                       return $this->msg( 'htmlform-select-badoption' )->parse();
        }
 
        function getInputHTML( $value ) {
@@ -1702,7 +1830,9 @@ class HTMLSelectOrOtherField extends HTMLTextField {
 
        function __construct( $params ) {
                if ( !in_array( 'other', $params['options'], true ) ) {
-                       $msg = isset( $params['other'] ) ? $params['other'] : wfMsg( 'htmlform-selectorother-other' );
+                       $msg = isset( $params['other'] ) ?
+                               $params['other'] :
+                               wfMessage( 'htmlform-selectorother-other' )->text();
                        $params['options'][$msg] = 'other';
                }
 
@@ -1806,7 +1936,7 @@ class HTMLMultiSelectField extends HTMLFormField {
                if ( count( $validValues ) == count( $value ) ) {
                        return true;
                } else {
-                       return wfMsgExt( 'htmlform-select-badoption', 'parseinline' );
+                       return $this->msg( 'htmlform-select-badoption' )->parse();
                }
        }
 
@@ -1889,7 +2019,7 @@ class HTMLMultiSelectField extends HTMLFormField {
  *     ** <option value>
  *     * New Optgroup header
  * Plus a text field underneath for an additional reason.  The 'value' of the field is
- * ""<select>: <extra reason>"", or "<extra reason>" if nothing has been selected in the
+ * "<select>: <extra reason>", or "<extra reason>" if nothing has been selected in the
  * select dropdown.
  * @todo FIXME: If made 'required', only the text field should be compulsory.
  */
@@ -1991,7 +2121,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
 
        /**
         * @param  $request WebRequest
-        * @return Array( <overall message>, <select value>, <text field value> )
+        * @return Array("<overall message>","<select value>","<text field value>")
         */
        function loadDataFromRequest( $request ) {
                if ( $request->getCheck( $this->mName ) ) {
@@ -2008,7 +2138,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        } elseif ( $text == '' ) {
                                $final = $list;
                        } else {
-                               $final = $list . wfMsgForContent( 'colon-separator' ) . $text;
+                               $final = $list . $this->msg( 'colon-separator' )->inContentLanguage()->text() . $text;
                        }
 
                } else {
@@ -2017,7 +2147,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        $list = 'other';
                        $text = $final;
                        foreach ( $this->mFlatOptions as $option ) {
-                               $match = $option . wfMsgForContent( 'colon-separator' );
+                               $match = $option . $this->msg( 'colon-separator' )->inContentLanguage()->text();
                                if ( strpos( $text, $match ) === 0 ) {
                                        $list = $option;
                                        $text = substr( $text, strlen( $match ) );
@@ -2044,8 +2174,8 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        return $p;
                }
 
-               if ( isset( $this->mParams['required'] ) && $value[1] === '' ) {
-                       return wfMsgExt( 'htmlform-required', 'parseinline' );
+               if ( isset( $this->mParams['required'] ) && $this->mParams['required'] !== false && $value[1] === '' ) {
+                       return $this->msg( 'htmlform-required' )->parse();
                }
 
                return true;
@@ -2074,7 +2204,7 @@ class HTMLRadioField extends HTMLFormField {
                if ( in_array( $value, $validOptions ) ) {
                        return true;
                } else {
-                       return wfMsgExt( 'htmlform-select-badoption', 'parseinline' );
+                       return $this->msg( 'htmlform-select-badoption' )->parse();
                }
        }
 
@@ -2284,11 +2414,11 @@ class HTMLEditTools extends HTMLFormField {
 
        protected function formatMsg() {
                if ( empty( $this->mParams['message'] ) ) {
-                       $msg = wfMessage( 'edittools' );
+                       $msg = $this->msg( 'edittools' );
                } else {
-                       $msg = wfMessage( $this->mParams['message'] );
+                       $msg = $this->msg( $this->mParams['message'] );
                        if ( $msg->isDisabled() ) {
-                               $msg = wfMessage( 'edittools' );
+                               $msg = $this->msg( 'edittools' );
                        }
                }
                $msg->inContentLanguage();
index 3986a7b..23fead7 100644 (file)
@@ -548,9 +548,10 @@ class Html {
        }
 
        /**
-        * Output a <script> tag with the given contents.  TODO: do some useful
-        * escaping as well, like if $contents contains literal '</script>' or (for
-        * XML) literal "]]>".
+        * Output a "<script>" tag with the given contents.
+        *
+        * @todo do some useful escaping as well, like if $contents contains
+        * literal "</script>" or (for XML) literal "]]>".
         *
         * @param $contents string JavaScript
         * @return string Raw HTML
@@ -572,8 +573,8 @@ class Html {
        }
 
        /**
-        * Output a <script> tag linking to the given URL, e.g.,
-        * <script src=foo.js></script>.
+        * Output a "<script>" tag linking to the given URL, e.g.,
+        * "<script src=foo.js></script>".
         *
         * @param $url string
         * @return string Raw HTML
@@ -591,9 +592,9 @@ class Html {
        }
 
        /**
-        * Output a <style> tag with the given contents for the given media type
+        * Output a "<style>" tag with the given contents for the given media type
         * (if any).  TODO: do some useful escaping as well, like if $contents
-        * contains literal '</style>' (admittedly unlikely).
+        * contains literal "</style>" (admittedly unlikely).
         *
         * @param $contents string CSS
         * @param $media mixed A media type string, like 'screen'
@@ -613,7 +614,7 @@ class Html {
        }
 
        /**
-        * Output a <link rel=stylesheet> linking to the given URL for the given
+        * Output a "<link rel=stylesheet>" linking to the given URL for the given
         * media type (if any).
         *
         * @param $url string
@@ -630,7 +631,7 @@ class Html {
        }
 
        /**
-        * Convenience function to produce an <input> element.  This supports the
+        * Convenience function to produce an "<input>" element.  This supports the
         * new HTML5 input types and attributes, and will silently strip them if
         * $wgHtml5 is false.
         *
@@ -663,11 +664,12 @@ class Html {
        }
 
        /**
-        * Convenience function to produce an <input> element.  This supports leaving
-        * out the cols= and rows= which Xml requires and are required by HTML4/XHTML
-        * but not required by HTML5 and will silently set cols="" and rows="" if
-        * $wgHtml5 is false and cols and rows are omitted (HTML4 validates present
-        * but empty cols="" and rows="" as valid).
+        * Convenience function to produce an "<input>" element.
+        *
+        * This supports leaving out the cols= and rows= which Xml requires and are
+        * required by HTML4/XHTML but not required by HTML5 and will silently set
+        * cols="" and rows="" if $wgHtml5 is false and cols and rows are omitted
+        * (HTML4 validates present but empty cols="" and rows="" as valid).
         *
         * @param $name    string name attribute
         * @param $value   string value attribute
@@ -706,7 +708,7 @@ class Html {
         *
         * @param $params array:
         * - selected: [optional] Id of namespace which should be pre-selected
-        * - all: [optional] Value of item for "all namespaces". If null or unset, no <option> is generated to select all namespaces
+        * - all: [optional] Value of item for "all namespaces". If null or unset, no "<option>" is generated to select all namespaces
         * - label: text for label to add before the field
         * - exclude: [optional] Array of namespace ids to exclude
         * - disable: [optional] Array of namespace ids for which the option should be disabled in the selector
@@ -747,7 +749,7 @@ class Html {
                if ( isset( $params['all'] ) ) {
                        // add an option that would let the user select all namespaces.
                        // Value is provided by user, the name shown is localized for the user.
-                       $options[$params['all']] = wfMsg( 'namespacesall' );
+                       $options[$params['all']] = wfMessage( 'namespacesall' )->text();
                }
                // Add all namespaces as options (in the content langauge)
                $options += $wgContLang->getFormattedNamespaces();
@@ -761,7 +763,7 @@ class Html {
                        if ( $nsId === 0 ) {
                                // For other namespaces use use the namespace prefix as label, but for
                                // main we don't use "" but the user message descripting it (e.g. "(Main)" or "(Article)")
-                               $nsName = wfMsg( 'blanknamespace' );
+                               $nsName = wfMessage( 'blanknamespace' )->text();
                        }
                        $optionsHtml[] = Html::element(
                                'option', array(
@@ -857,7 +859,7 @@ class Html {
        /**
         * Get HTML for an info box with an icon.
         *
-        * @param $text String: wikitext, get this with wfMsgNoTrans()
+        * @param $text String: wikitext, get this with wfMessage()->plain()
         * @param $icon String: icon name, file in skins/common/images
         * @param $alt String: alternate text for the icon
         * @param $class String: additional class name to add to the wrapper div
index 201a9e5..8453e62 100644 (file)
@@ -156,7 +156,7 @@ class Http {
         *
         * file:// should not be allowed here for security purpose (r67684)
         *
-        * @fixme this is wildly inaccurate and fails to actually check most stuff
+        * @todo FIXME this is wildly inaccurate and fails to actually check most stuff
         *
         * @param $uri Mixed: URI to check for validity
         * @return Boolean
@@ -212,7 +212,7 @@ class MWHttpRequest {
         * @param $url String: url to use. If protocol-relative, will be expanded to an http:// URL
         * @param $options Array: (optional) extra params to pass (see Http::request())
         */
-       function __construct( $url, $options = array() ) {
+       protected function __construct( $url, $options = array() ) {
                global $wgHTTPTimeout;
 
                $this->url = wfExpandUrl( $url, PROTO_HTTP );
index d391ead..91c3190 100644 (file)
@@ -339,7 +339,7 @@ class ImageGallery {
                                if( $img ) {
                                        $fileSize = htmlspecialchars( $wgLang->formatSize( $img->getSize() ) );
                                } else {
-                                       $fileSize = wfMsgHtml( 'filemissing' );
+                                       $fileSize = wfMessage( 'filemissing' )->escaped();
                                }
                                $fileSize = "$fileSize<br />\n";
                        } else {
index 8f683e9..fdc2061 100644 (file)
@@ -94,10 +94,47 @@ class ImagePage extends Article {
        /**
         * Handler for action=render
         * Include body text only; none of the image extras
+        * However, also include the shared description text
+        * so that cascading ForeignAPIRepo's work.
+        *
+        * @note This uses a div with the class "mw-shared-image-desc"
+        *    as opposed to the id "mw-shared-image-desc" since the text
+        *    from here may be cascadingly transcluded to other shared
+        *    repos, and we want all ids to be unique. On normal
+        *    view, the outermost shared description will still have
+        *    the id.
+        *
+        * This also differs from normal view in that "shareddescriptionfollows"
+        * message is not shown. I was not sure if it was appropriate to
+        * add that message here.
         */
        public function render() {
-               $this->getContext()->getOutput()->setArticleBodyOnly( true );
-               parent::view();
+               $out = $this->getContext()->getOutput();
+                $this->loadFile();
+
+                $descText = $this->mPage->getFile()->getDescriptionText();
+
+               $out->setArticleBodyOnly( true );
+
+               if ( !$descText ) {
+                       // If no description text, just do standard action=render
+                       parent::view();
+               } else {
+                       if ( $this->mPage->getID() !== 0 ) {
+                               // Local description exists. We need to output both
+                               parent::view();
+                               $out->addHTML( '<div class="mw-shared-image-desc">' . $descText . "</div>\n" );
+                       } else {
+                               // We don't want to output both a "noarticletext" message and the shared
+                               // description, so don't call parent::view().
+                               $out->addHTML( '<div class="mw-shared-image-desc">' . $descText . "</div>\n" );
+                               // Since we did not call parent::view(), have to call some methods it
+                               // normally takes care of. (Not that it matters much since skin not displayed)
+                               $out->setArticleFlag( true );
+                               $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+                               $this->mPage->doViewUpdates( $this->getContext()->getUser() );
+                       }
+               }
        }
 
        public function view() {
@@ -155,7 +192,7 @@ class ImagePage extends Article {
                        # should be in page content language
                        $pageLang = $this->getTitle()->getPageLanguage();
                        $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
-                               'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
+                               'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
                                'class' => 'mw-content-'.$pageLang->getDir() ) ) );
                        parent::view();
                        $out->addHTML( Xml::closeElement( 'div' ) );
@@ -172,7 +209,7 @@ class ImagePage extends Article {
                        if ( !$fol->isDisabled() ) {
                                $out->addWikiText( $fol->plain() );
                        }
-                       $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
+                       $out->addHTML( '<div id="shared-image-desc" class="mw-shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
                }
 
                $this->closeShowImage();
@@ -181,7 +218,7 @@ class ImagePage extends Article {
 
                $out->addHTML( Xml::element( 'h2',
                        array( 'id' => 'filelinks' ),
-                       wfMsg( 'imagelinks' ) ) . "\n" );
+                       wfMessage( 'imagelinks' )->text() ) . "\n" );
                $this->imageDupes();
                # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
                # Yet we return metadata about the target. Definitely an issue in the FileRepo
@@ -195,7 +232,10 @@ class ImagePage extends Article {
                }
 
                if ( $showmeta ) {
-                       $out->addHTML( Xml::element( 'h2', array( 'id' => 'metadata' ), wfMsg( 'metadata' ) ) . "\n" );
+                       $out->addHTML( Xml::element(
+                               'h2',
+                               array( 'id' => 'metadata' ),
+                               wfMessage( 'metadata' )->text() ) . "\n" );
                        $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
                        $out->addModules( array( 'mediawiki.action.view.metadata' ) );
                }
@@ -227,12 +267,12 @@ class ImagePage extends Article {
         */
        protected function showTOC( $metadata ) {
                $r = array(
-                       '<li><a href="#file">' . wfMsgHtml( 'file-anchor-link' ) . '</a></li>',
-                       '<li><a href="#filehistory">' . wfMsgHtml( 'filehist' ) . '</a></li>',
-                       '<li><a href="#filelinks">' . wfMsgHtml( 'imagelinks' ) . '</a></li>',
+                       '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
+                       '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
+                       '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
                );
                if ( $metadata ) {
-                       $r[] = '<li><a href="#metadata">' . wfMsgHtml( 'metadata' ) . '</a></li>';
+                       $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
                }
 
                wfRunHooks( 'ImagePageShowTOC', array( $this, &$r ) );
@@ -250,7 +290,7 @@ class ImagePage extends Article {
         */
        protected function makeMetadataTable( $metadata ) {
                $r = "<div class=\"mw-imagepage-section-metadata\">";
-               $r .= wfMsgNoTrans( 'metadata-help' );
+               $r .= wfMessage( 'metadata-help' )->plain();
                $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
                foreach ( $metadata as $type => $stuff ) {
                        foreach ( $stuff as $v ) {
@@ -322,7 +362,7 @@ class ImagePage extends Article {
                        $height_orig = $this->displayImg->getHeight( $page );
                        $height = $height_orig;
 
-                       $longDesc = wfMsg( 'parentheses', $this->displayImg->getLongDesc() );
+                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
 
                        wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
 
@@ -330,7 +370,7 @@ class ImagePage extends Article {
                                # image
 
                                # "Download high res version" link below the image
-                               # $msgsize = wfMsgHtml( 'file-info-size', $width_orig, $height_orig, Linker::formatSize( $this->displayImg->getSize() ), $mime );
+                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig, Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
                                # We'll show a thumbnail of this image
                                if ( $width > $maxWidth || $height > $maxHeight ) {
                                        # Calculate the thumbnail size.
@@ -346,7 +386,7 @@ class ImagePage extends Article {
                                                # Note that $height <= $maxHeight now, but might not be identical
                                                # because of rounding.
                                        }
-                                       $msgbig = wfMsgHtml( 'show-big-image' );
+                                       $msgbig = wfMessage( 'show-big-image' )->escaped();
                                        if ( $this->displayImg->getRepo()->canTransformVia404() ) {
                                                $thumbSizes = $wgImageLimits;
                                        } else {
@@ -411,13 +451,12 @@ class ImagePage extends Article {
                                        $count = $this->displayImg->pageCount();
 
                                        if ( $page > 1 ) {
-                                               $label = $out->parse( wfMsg( 'imgmultipageprev' ), false );
-                                               $link = Linker::link(
+                                               $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
+                                               $link = Linker::linkKnown(
                                                        $this->getTitle(),
                                                        $label,
                                                        array(),
-                                                       array( 'page' => $page - 1 ),
-                                                       array( 'known', 'noclasses' )
+                                                       array( 'page' => $page - 1 )
                                                );
                                                $thumb1 = Linker::makeThumbLinkObj( $this->getTitle(), $this->displayImg, $link, $label, 'none',
                                                        array( 'page' => $page - 1 ) );
@@ -426,13 +465,12 @@ class ImagePage extends Article {
                                        }
 
                                        if ( $page < $count ) {
-                                               $label = wfMsg( 'imgmultipagenext' );
-                                               $link = Linker::link(
+                                               $label = wfMessage( 'imgmultipagenext' )->text();
+                                               $link = Linker::linkKnown(
                                                        $this->getTitle(),
                                                        $label,
                                                        array(),
-                                                       array( 'page' => $page + 1 ),
-                                                       array( 'known', 'noclasses' )
+                                                       array( 'page' => $page + 1 )
                                                );
                                                $thumb2 = Linker::makeThumbLinkObj( $this->getTitle(), $this->displayImg, $link, $label, 'none',
                                                        array( 'page' => $page + 1 ) );
@@ -459,8 +497,8 @@ class ImagePage extends Article {
                                                '</td><td><div class="multipageimagenavbox">' .
                                                Xml::openElement( 'form', $formParams ) .
                                                Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                                               wfMsgExt( 'imgmultigoto', array( 'parseinline', 'replaceafter' ), $select ) .
-                                               Xml::submitButton( wfMsg( 'imgmultigo' ) ) .
+                                                       wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
+                                               Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
                                                Xml::closeElement( 'form' ) .
                                                "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
                                        );
@@ -487,7 +525,7 @@ class ImagePage extends Article {
                                $medialink = "[[Media:$filename|$linktext]]";
 
                                if ( !$this->displayImg->isSafeFile() ) {
-                                       $warning = wfMsgNoTrans( 'mediawarning' );
+                                       $warning = wfMessage( 'mediawarning' )->plain();
                                        // dirmark is needed here to separate the file name, which
                                        // most likely ends in Latin characters, from the description,
                                        // which may begin with the file type. In RTL environment
@@ -509,6 +547,25 @@ EOT
                                }
                        }
 
+                       // Add cannot animate thumbnail warning
+                       if ( !$this->displayImg->canAnimateThumbIfAppropriate() ) {
+                               // Include the extension so wiki admins can
+                               // customize it on a per file-type basis
+                               // (aka say things like use format X instead).
+                               // additionally have a specific message for
+                               // file-no-thumb-animation-gif
+                               $ext = $this->displayImg->getExtension();
+                               $noAnimMesg = wfMessageFallback(
+                                       'file-no-thumb-animation-' . $ext,
+                                       'file-no-thumb-animation'
+                               )->plain();
+
+                               $out->addWikiText( <<<EOT
+<div class="mw-noanimatethumb">{$noAnimMesg}</div>
+EOT
+                               );
+                       }
+
                        if ( !$this->displayImg->isLocal() ) {
                                $this->printSharedImageText();
                        }
@@ -595,9 +652,9 @@ EOT
                $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
                $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
 
-               if ( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-'  ) {
+               if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-'  ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
-               } elseif ( $descUrl && wfMsgNoTrans( 'sharedupload-desc-there' ) !== '-' ) {
+               } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
                } else {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
@@ -634,31 +691,33 @@ EOT
                }
 
                $out = $this->getContext()->getOutput();
-               $out->addHTML( "<br /><ul>\n" );
+               $out->addHTML( "<ul>\n" );
 
                # "Upload a new version of this file" link
-               if ( UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
-                       $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMsg( 'uploadnewversion-linktext' ) );
+               $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
+               if ( $canUpload && UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
+                       $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMessage( 'uploadnewversion-linktext' )->text() );
                        $out->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
+               } else {
+                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">" . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
                }
 
                # External editing link
                if ( $wgUseExternalEditor ) {
-                       $elink = Linker::link(
+                       $elink = Linker::linkKnown(
                                $this->getTitle(),
-                               wfMsgHtml( 'edit-externally' ),
+                               wfMessage( 'edit-externally' )->escaped(),
                                array(),
                                array(
                                        'action' => 'edit',
                                        'externaledit' => 'true',
                                        'mode' => 'file'
-                               ),
-                               array( 'known', 'noclasses' )
+                               )
                        );
                        $out->addHTML(
                                '<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
-                               wfMsgExt( 'edit-externally-help', array( 'parseinline' ) ) .
-                               "</small></li>\n"
+                                       wfMessage( 'edit-externally-help' )->parse() .
+                                       "</small></li>\n"
                        );
                }
 
@@ -781,7 +840,7 @@ EOT
                                        $link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
                                        $ul .= Html::rawElement(
                                                'li',
-                                               array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+                                               array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
                                                $link2
                                                ) . "\n";
                                }
@@ -791,7 +850,7 @@ EOT
                        }
                        $out->addHTML( Html::rawElement(
                                        'li',
-                                       array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+                                       array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
                                        $liContents
                                ) . "\n"
                        );
@@ -828,17 +887,11 @@ EOT
                foreach ( $dupes as $file ) {
                        $fromSrc = '';
                        if ( $file->isLocal() ) {
-                               $link = Linker::link(
-                                       $file->getTitle(),
-                                       null,
-                                       array(),
-                                       array(),
-                                       array( 'known', 'noclasses' )
-                               );
+                               $link = Linker::linkKnown( $file->getTitle() );
                        } else {
                                $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
                                        $file->getTitle()->getPrefixedText() );
-                               $fromSrc = wfMsg( 'shared-repo-from', $file->getRepo()->getDisplayName() );
+                               $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
                        }
                        $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
                }
@@ -953,18 +1006,18 @@ class ImageHistoryList extends ContextSource {
         * @return string
         */
        public function beginImageHistoryList( $navLinks = '' ) {
-               return Xml::element( 'h2', array( 'id' => 'filehistory' ), wfMsg( 'filehist' ) ) . "\n"
+               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() ) . "\n"
                        . "<div id=\"mw-imagepage-section-filehistory\">\n"
-                       . $this->getOutput()->parse( wfMsgNoTrans( 'filehist-help' ) )
+                       . $this->msg( 'filehist-help' )->parseAsBlock()
                        . $navLinks . "\n"
                        . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
                        . '<tr><td></td>'
                        . ( $this->current->isLocal() && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
-                       . '<th>' . wfMsgHtml( 'filehist-datetime' ) . '</th>'
-                       . ( $this->showThumb ? '<th>' . wfMsgHtml( 'filehist-thumb' ) . '</th>' : '' )
-                       . '<th>' . wfMsgHtml( 'filehist-dimensions' ) . '</th>'
-                       . '<th>' . wfMsgHtml( 'filehist-user' ) . '</th>'
-                       . '<th>' . wfMsgHtml( 'filehist-comment' ) . '</th>'
+                       . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
+                       . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
+                       . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
+                       . '<th>' . $this->msg( 'filehist-user' )->escaped() . '</th>'
+                       . '<th>' . $this->msg( 'filehist-comment' )->escaped() . '</th>'
                        . "</tr>\n";
        }
 
@@ -1004,10 +1057,10 @@ class ImageHistoryList extends ContextSource {
                                if ( !$iscur ) {
                                        $q['oldimage'] = $img;
                                }
-                               $row .= Linker::link(
+                               $row .= Linker::linkKnown(
                                        $this->title,
-                                       wfMsgHtml( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' ),
-                                       array(), $q, array( 'known' )
+                                       $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(),
+                                       array(), $q
                                );
                        }
                        # Link to hide content. Don't show useless link to people who cannot hide revisions.
@@ -1017,7 +1070,7 @@ class ImageHistoryList extends ContextSource {
                                        $row .= '<br />';
                                }
                                // If file is top revision or locked from this user, don't link
-                               if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED ) ) {
+                               if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
                                        $del = Linker::revDeleteLinkDisabled( $canHide );
                                } else {
                                        list( $ts, ) = explode( '!', $img, 2 );
@@ -1037,23 +1090,22 @@ class ImageHistoryList extends ContextSource {
                // Reversion link/current indicator
                $row .= '<td>';
                if ( $iscur ) {
-                       $row .= wfMsgHtml( 'filehist-current' );
-               } elseif ( $local && $this->title->quickUserCan( 'edit' )
-                       && $this->title->quickUserCan( 'upload' )
+                       $row .= $this->msg( 'filehist-current' )->escaped();
+               } elseif ( $local && $this->title->quickUserCan( 'edit', $user )
+                       && $this->title->quickUserCan( 'upload', $user )
                ) {
                        if ( $file->isDeleted( File::DELETED_FILE ) ) {
-                               $row .= wfMsgHtml( 'filehist-revert' );
+                               $row .= $this->msg( 'filehist-revert' )->escaped();
                        } else {
-                               $row .= Linker::link(
+                               $row .= Linker::linkKnown(
                                        $this->title,
-                                       wfMsgHtml( 'filehist-revert' ),
+                                       $this->msg( 'filehist-revert' )->escaped(),
                                        array(),
                                        array(
                                                'action' => 'revert',
                                                'oldimage' => $img,
                                                'wpEditToken' => $user->getEditToken( $img )
-                                       ),
-                                       array( 'known', 'noclasses' )
+                                       )
                                );
                        }
                }
@@ -1064,32 +1116,31 @@ class ImageHistoryList extends ContextSource {
                        $selected = "class='filehistory-selected'";
                }
                $row .= "<td $selected style='white-space: nowrap;'>";
-               if ( !$file->userCan( File::DELETED_FILE ) ) {
+               if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
                        # Don't link to unviewable files
-                       $row .= '<span class="history-deleted">' . $lang->timeanddate( $timestamp, true ) . '</span>';
+                       $row .= '<span class="history-deleted">' . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
                } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
                        if ( $local ) {
                                $this->preventClickjacking();
                                $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
                                # Make a link to review the image
-                               $url = Linker::link(
+                               $url = Linker::linkKnown(
                                        $revdel,
-                                       $lang->timeanddate( $timestamp, true ),
+                                       $lang->userTimeAndDate( $timestamp, $user ),
                                        array(),
                                        array(
                                                'target' => $this->title->getPrefixedText(),
                                                'file' => $img,
                                                'token' => $user->getEditToken( $img )
-                                       ),
-                                       array( 'known', 'noclasses' )
+                                       )
                                );
                        } else {
-                               $url = $lang->timeanddate( $timestamp, true );
+                               $url = $lang->userTimeAndDate( $timestamp, $user );
                        }
                        $row .= '<span class="history-deleted">' . $url . '</span>';
                } else {
                        $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
-                       $row .= Xml::element( 'a', array( 'href' => $url ), $lang->timeanddate( $timestamp, true ) );
+                       $row .= Xml::element( 'a', array( 'href' => $url ), $lang->userTimeAndDate( $timestamp, $user ) );
                }
                $row .= "</td>";
 
@@ -1101,9 +1152,9 @@ class ImageHistoryList extends ContextSource {
                // Image dimensions + size
                $row .= '<td>';
                $row .= htmlspecialchars( $file->getDimensionsString() );
-               $row .= $this->getContext()->msg( 'word-separator' )->plain();
+               $row .= $this->msg( 'word-separator' )->plain();
                $row .= '<span style="white-space: nowrap;">';
-               $row .= $this->getContext()->msg( 'parentheses' )->rawParams( Linker::formatSize( $file->getSize() ) )->plain();
+               $row .= $this->msg( 'parentheses' )->rawParams( Linker::formatSize( $file->getSize() ) )->plain();
                $row .= '</span>';
                $row .= '</td>';
 
@@ -1111,11 +1162,11 @@ class ImageHistoryList extends ContextSource {
                $row .= '<td>';
                // Hide deleted usernames
                if ( $file->isDeleted( File::DELETED_USER ) ) {
-                       $row .= '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+                       $row .= '<span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        if ( $local ) {
                                $row .= Linker::userLink( $userId, $userText );
-                               $row .= $this->getContext()->msg( 'word-separator' )->plain();
+                               $row .= $this->msg( 'word-separator' )->plain();
                                $row .= '<span style="white-space: nowrap;">';
                                $row .= Linker::userToolLinks( $userId, $userText );
                                $row .= '</span>';
@@ -1127,7 +1178,7 @@ class ImageHistoryList extends ContextSource {
 
                // Don't show deleted descriptions
                if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                       $row .= '<td><span class="history-deleted">' . wfMsgHtml( 'rev-deleted-comment' ) . '</span></td>';
+                       $row .= '<td><span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
                } else {
                        $row .= '<td dir="' . $wgContLang->getDir() . '">' . Linker::formatComment( $description, $this->title ) . '</td>';
                }
@@ -1145,7 +1196,10 @@ class ImageHistoryList extends ContextSource {
         */
        protected function getThumbForLine( $file ) {
                $lang = $this->getLanguage();
-               if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE ) && !$file->isDeleted( File::DELETED_FILE ) ) {
+               $user = $this->getUser();
+               if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE,$user )
+                       && !$file->isDeleted( File::DELETED_FILE ) )
+               {
                        $params = array(
                                'width' => '120',
                                'height' => '120',
@@ -1154,20 +1208,20 @@ class ImageHistoryList extends ContextSource {
 
                        $thumbnail = $file->transform( $params );
                        $options = array(
-                               'alt' => wfMsg( 'filehist-thumbtext',
-                                       $lang->timeanddate( $timestamp, true ),
-                                       $lang->date( $timestamp, true ),
-                                       $lang->time( $timestamp, true ) ),
+                               'alt' => $this->msg( 'filehist-thumbtext',
+                                       $lang->userTimeAndDate( $timestamp, $user ),
+                                       $lang->userDate( $timestamp, $user ),
+                                       $lang->userTime( $timestamp, $user ) )->text(),
                                'file-link' => true,
                        );
 
                        if ( !$thumbnail ) {
-                               return wfMsgHtml( 'filehist-nothumb' );
+                               return $this->msg( 'filehist-nothumb' )->escaped();
                        }
 
                        return $thumbnail->toHtml( $options );
                } else {
-                       return wfMsgHtml( 'filehist-nothumb' );
+                       return $this->msg( 'filehist-nothumb' )->escaped();
                }
        }
 
index 9ebc34c..11f3795 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * MediaWiki page data importer
+ * MediaWiki page data importer.
  *
  * Copyright © 2003,2005 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
@@ -33,7 +33,7 @@
 class WikiImporter {
        private $reader = null;
        private $mLogItemCallback, $mUploadCallback, $mRevisionCallback, $mPageCallback;
-       private $mSiteInfoCallback, $mTargetNamespace, $mPageOutCallback;
+       private $mSiteInfoCallback, $mTargetNamespace, $mTargetRootPage, $mPageOutCallback;
        private $mNoticeCallback, $mDebug;
        private $mImportUploads, $mImageBasePath;
        private $mNoUpdates = false;
@@ -199,6 +199,39 @@ class WikiImporter {
                }
        }
 
+       /**
+        * Set a target root page under which all pages are imported
+        * @param $rootpage
+        * @return status object
+        */
+       public function setTargetRootPage( $rootpage ) {
+               $status = Status::newGood();
+               if( is_null( $rootpage ) ) {
+                       // No rootpage
+                       $this->mTargetRootPage = null;
+               } elseif( $rootpage !== '' ) {
+                       $rootpage = rtrim( $rootpage, '/' ); //avoid double slashes
+                       $title = Title::newFromText( $rootpage, !is_null( $this->mTargetNamespace ) ? $this->mTargetNamespace : NS_MAIN );
+                       if( !$title || $title->isExternal() ) {
+                               $status->fatal( 'import-rootpage-invalid' );
+                       } else {
+                               if( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
+                                       global $wgContLang;
+
+                                       $displayNSText = $title->getNamespace() == NS_MAIN
+                                               ? wfMessage( 'blanknamespace' )->text()
+                                               : $wgContLang->getNsText( $title->getNamespace() );
+                                       $status->fatal( 'import-rootpage-nosubpage', $displayNSText );
+                               } else {
+                                       // set namespace to 'all', so the namespace check in processTitle() can passed
+                                       $this->setTargetNamespace( null );
+                                       $this->mTargetRootPage = $title->getPrefixedDBKey();
+                               }
+                       }
+               }
+               return $status;
+       }
+
        /**
         * @param $dir
         */
@@ -275,7 +308,7 @@ class WikiImporter {
        }
 
        /**
-        * Notify the callback function when a new <page> is reached.
+        * Notify the callback function when a new "<page>" is reached.
         * @param $title Title
         */
        function pageCallback( $title ) {
@@ -285,7 +318,7 @@ class WikiImporter {
        }
 
        /**
-        * Notify the callback function when a </page> is closed.
+        * Notify the callback function when a "</page>" is closed.
         * @param $title Title
         * @param $origTitle Title
         * @param $revCount Integer
@@ -791,6 +824,9 @@ class WikiImporter {
                        $title = Title::makeTitleSafe( $this->mTargetNamespace,
                                $origTitle->getDBkey() );
                } else {
+                       if( !is_null( $this->mTargetRootPage ) ) {
+                               $workTitle = $this->mTargetRootPage . '/' . $workTitle;
+                       }
                        $title = Title::newFromText( $workTitle );
                }
 
index c498a57..ba504a9 100644 (file)
@@ -52,7 +52,7 @@ class Licenses extends HTMLFormField {
        public function __construct( $params ) {
                parent::__construct( $params );
 
-               $this->msg = empty( $params['licenses'] ) ? wfMsgForContent( 'licenses' ) : $params['licenses'];
+               $this->msg = empty( $params['licenses'] ) ? wfMessage( 'licenses' )->inContentLanguage()->plain() : $params['licenses'];
                $this->selected = null;
 
                $this->makeLicenses();
@@ -120,7 +120,7 @@ class Licenses extends HTMLFormField {
                foreach ( $tagset as $key => $val )
                        if ( is_array( $val ) ) {
                                $this->html .= $this->outputOption(
-                                       $this->msg( $key ), '',
+                                       $key, '',
                                        array(
                                                'disabled' => 'disabled',
                                                'style' => 'color: GrayText', // for MSIE
@@ -130,7 +130,7 @@ class Licenses extends HTMLFormField {
                                $this->makeHtml( $val, $depth + 1 );
                        } else {
                                $this->html .= $this->outputOption(
-                                       $this->msg( $val->text ), $val->template,
+                                       $val->text, $val->template,
                                        array( 'title' => '{{' . $val->template . '}}' ),
                                        $depth
                                );
@@ -138,13 +138,15 @@ class Licenses extends HTMLFormField {
        }
 
        /**
-        * @param $text
+        * @param $message
         * @param $value
         * @param $attribs null
         * @param $depth int
         * @return string
         */
-       protected function outputOption( $text, $value, $attribs = null, $depth = 0 ) {
+       protected function outputOption( $message, $value, $attribs = null, $depth = 0 ) {
+               $msgObj = $this->msg( $message );
+               $text = $msgObj->exists() ? $msgObj->text() : $message;
                $attribs['value'] = $value;
                if ( $value === $this->selected )
                        $attribs['selected'] = 'selected';
@@ -152,15 +154,6 @@ class Licenses extends HTMLFormField {
                return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
        }
 
-       /**
-        * @param $str string
-        * @return String
-        */
-       protected function msg( $str ) {
-               $msg = wfMessage( $str );
-               return $msg->exists() ? $msg->text() : $str;
-       }
-
        /**#@-*/
 
        /**
@@ -182,7 +175,7 @@ class Licenses extends HTMLFormField {
        public function getInputHTML( $value ) {
                $this->selected = $value;
 
-               $this->html = $this->outputOption( wfMsg( 'nolicense' ), '',
+               $this->html = $this->outputOption( wfMessage( 'nolicense' )->text(), '',
                        (bool)$this->selected ? null : array( 'selected' => 'selected' ) );
                $this->makeHtml( $this->getLicenses() );
 
index 9fcac65..7aba444 100644 (file)
@@ -139,9 +139,9 @@ class Linker {
                if ( $t->isRedirect() ) {
                        # Page is a redirect
                        $colour = 'mw-redirect';
-               } elseif ( $threshold > 0 &&
-                          $t->exists() && $t->getLength() < $threshold &&
-                          $t->isContentPage() ) {
+               } elseif ( $threshold > 0 && $t->isContentPage() &&
+                       $t->exists() && $t->getLength() < $threshold
+               ) {
                        # Page is a stub
                        $colour = 'stub';
                }
@@ -198,6 +198,12 @@ class Linker {
                        wfProfileOut( __METHOD__ );
                        return "<!-- ERROR -->$html";
                }
+
+               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 );
+               }
                $options = (array)$options;
 
                $dummy = new DummyLinker; // dummy linker instance for bc on the hooks
@@ -339,7 +345,7 @@ class Linker {
                } elseif ( in_array( 'known', $options ) ) {
                        $defaults['title'] = $target->getPrefixedText();
                } else {
-                       $defaults['title'] = wfMsg( 'red-link-title', $target->getPrefixedText() );
+                       $defaults['title'] = wfMessage( 'red-link-title', $target->getPrefixedText() )->text();
                }
 
                # Finally, merge the custom attribs with the default ones, and iterate
@@ -407,6 +413,11 @@ class Linker {
         * despite $query not being used.
         *
         * @param $nt Title
+        * @param $html String [optional]
+        * @param $query String [optional]
+        * @param $trail String [optional]
+        * @param $prefix String [optional]
+        *
         *
         * @return string
         */
@@ -508,7 +519,8 @@ class Linker {
         * Given parameters derived from [[Image:Foo|options...]], generate the
         * HTML that that syntax inserts in the page.
         *
-        * @param $title Title object
+        * @param $parser Parser object
+        * @param $title Title object of the file (not the currently viewed page)
         * @param $file File object, or false if it doesn't exist
         * @param $frameParams Array: associative array of parameters external to the media handler.
         *     Boolean parameters are indicated by presence or absence, the value is arbitrary and
@@ -524,6 +536,7 @@ class Linker {
         *          valign          Vertical alignment (baseline, sub, super, top, text-top, middle,
         *                          bottom, text-bottom)
         *          alt             Alternate text for image (i.e. alt attribute). Plain text.
+        *          class           HTML for image classes. Plain text.
         *          caption         HTML for image caption.
         *          link-url        URL to link to
         *          link-title      Title object to link to
@@ -535,9 +548,10 @@ class Linker {
         * @param $time String: timestamp of the file, set as false for current
         * @param $query String: query params for desc url
         * @param $widthOption: Used by the parser to remember the user preference thumbnailsize
+        * @since 1.20
         * @return String: HTML for an image, with links, wrappers, etc.
         */
-       public static function makeImageLink2( Title $title, $file, $frameParams = array(),
+       public static function makeImageLink( /*Parser*/ $parser, Title $title, $file, $frameParams = array(),
                $handlerParams = array(), $time = false, $query = "", $widthOption = null )
        {
                $res = null;
@@ -567,6 +581,9 @@ class Linker {
                if ( !isset( $fp['title'] ) ) {
                        $fp['title'] = '';
                }
+               if ( !isset( $fp['class'] ) ) {
+                       $fp['class'] = '';
+               }
 
                $prefix = $postfix = '';
 
@@ -610,16 +627,20 @@ class Linker {
                }
 
                if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) ) {
-                       global $wgContLang;
-                       # Create a thumbnail. Alignment depends on language
-                       # writing direction, # right aligned for left-to-right-
-                       # languages ("Western languages"), left-aligned
-                       # for right-to-left-languages ("Semitic languages")
+                       # Create a thumbnail. Alignment depends on the writing direction of
+                       # the page content language (right-aligned for LTR languages,
+                       # left-aligned for RTL languages)
                        #
-                       # If  thumbnail width has not been provided, it is set
+                       # If a thumbnail width has not been provided, it is set
                        # to the default user option as specified in Language*.php
                        if ( $fp['align'] == '' ) {
-                               $fp['align'] = $wgContLang->alignEnd();
+                               if( $parser instanceof Parser ) {
+                                       $fp['align'] = $parser->getTargetLanguage()->alignEnd();
+                               } else {
+                                       # backwards compatibility, remove with makeImageLink2()
+                                       global $wgContLang;
+                                       $fp['align'] = $wgContLang->alignEnd();
+                               }
                        }
                        return $prefix . self::makeThumbLink2( $title, $file, $fp, $hp, $time, $query ) . $postfix;
                }
@@ -646,9 +667,12 @@ class Linker {
                        $params = array(
                                'alt' => $fp['alt'],
                                'title' => $fp['title'],
-                               'valign' => isset( $fp['valign'] ) ? $fp['valign'] : false ,
-                               'img-class' => isset( $fp['border'] ) ? 'thumbborder' : false );
-                       $params = self::getImageLinkMTOParams( $fp, $query ) + $params;
+                               'valign' => isset( $fp['valign'] ) ? $fp['valign'] : false,
+                               'img-class' => $fp['class'] );
+                       if ( isset( $fp['border'] ) ) {
+                               $params['img-class'] .= ( $params['img-class'] !== '' ) ? ' thumbborder' : 'thumbborder';
+                       }
+                       $params = self::getImageLinkMTOParams( $fp, $query, $parser ) + $params;
 
                        $s = $thumb->toHtml( $params );
                }
@@ -658,6 +682,17 @@ class Linker {
                return str_replace( "\n", ' ', $prefix . $s . $postfix );
        }
 
+       /**
+        * See makeImageLink()
+        * When this function is removed, remove if( $parser instanceof Parser ) check there too
+        * @deprecated since 1.20
+        */
+       public static function makeImageLink2( Title $title, $file, $frameParams = array(),
+               $handlerParams = array(), $time = false, $query = "", $widthOption = null ) {
+               return self::makeImageLink( null, $title, $file, $frameParams,
+                       $handlerParams, $time, $query, $widthOption );
+       }
+
        /**
         * Get the link parameters for MediaTransformOutput::toHtml() from given
         * frame parameters supplied by the Parser.
@@ -665,13 +700,20 @@ class Linker {
         * @param $query string An optional query string to add to description page links
         * @return array
         */
-       private static function getImageLinkMTOParams( $frameParams, $query = '' ) {
+       private static function getImageLinkMTOParams( $frameParams, $query = '', $parser = null ) {
                $mtoParams = array();
                if ( isset( $frameParams['link-url'] ) && $frameParams['link-url'] !== '' ) {
                        $mtoParams['custom-url-link'] = $frameParams['link-url'];
                        if ( isset( $frameParams['link-target'] ) ) {
                                $mtoParams['custom-target-link'] = $frameParams['link-target'];
                        }
+                       if ( $parser ) {
+                               $extLinkAttrs = $parser->getExternalLinkAttribs( $frameParams['link-url'] );
+                               foreach ( $extLinkAttrs as $name => $val ) {
+                                       // Currently could include 'rel' and 'target'
+                                       $mtoParams['parser-extlink-'.$name] = $val;
+                               }
+                       }
                } elseif ( isset( $frameParams['link-title'] ) && $frameParams['link-title'] !== '' ) {
                        $mtoParams['custom-title-link'] = self::normaliseSpecialPage( $frameParams['link-title'] );
                } elseif ( !empty( $frameParams['no-link'] ) ) {
@@ -790,13 +832,14 @@ class Linker {
                        $s .= self::makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time == true );
                        $zoomIcon = '';
                } elseif ( !$thumb ) {
-                       $s .= htmlspecialchars( wfMsg( 'thumbnail_error', '' ) );
+                       $s .= wfMessage( 'thumbnail_error', '' )->escaped();
                        $zoomIcon = '';
                } else {
                        $params = array(
                                'alt' => $fp['alt'],
                                'title' => $fp['title'],
-                               'img-class' => 'thumbimage' );
+                               'img-class' => ( isset( $fp['class'] ) && $fp['class'] !== '' ) ? $fp['class'] . ' thumbimage' : 'thumbimage'
+                       );
                        $params = self::getImageLinkMTOParams( $fp, $query ) + $params;
                        $s .= $thumb->toHtml( $params );
                        if ( isset( $fp['framed'] ) ) {
@@ -806,7 +849,7 @@ class Linker {
                                        Html::rawElement( 'a', array(
                                                'href' => $url,
                                                'class' => 'internal',
-                                               'title' => wfMsg( 'thumbnail-more' ) ),
+                                               'title' => wfMessage( 'thumbnail-more' )->text() ),
                                                Html::element( 'img', array(
                                                        'src' => $wgStylePath . '/common/images/magnify-clip' . ( $wgContLang->isRTL() ? '-rtl' : '' ) . '.png',
                                                        'width' => 15,
@@ -846,7 +889,7 @@ class Linker {
 
                        if ( $redir ) {
                                wfProfileOut( __METHOD__ );
-                               return self::linkKnown( $title, "$prefix$html$inside", array(), $query ) . $trail;
+                               return self::linkKnown( $title, "$prefix$html$inside", array(), wfCgiToArray( $query ) ) . $trail;
                        }
 
                        $href = self::getUploadUrl( $title, $query );
@@ -857,7 +900,7 @@ class Linker {
                                "$prefix$html$inside</a>$trail";
                } else {
                        wfProfileOut( __METHOD__ );
-                       return self::linkKnown( $title, "$prefix$html$inside", array(), $query ) . $trail;
+                       return self::linkKnown( $title, "$prefix$html$inside", array(), wfCgiToArray( $query ) ) . $trail;
                }
        }
 
@@ -936,7 +979,7 @@ class Linker {
                        $key = strtolower( $name );
                }
 
-               return self::linkKnown( SpecialPage::getTitleFor( $name ) , wfMsg( $key ) );
+               return self::linkKnown( SpecialPage::getTitleFor( $name ) , wfMessage( $key )->text() );
        }
 
        /**
@@ -978,7 +1021,7 @@ class Linker {
         * @param $userName String: user name in database.
         * @param $altUserName String: text to display instead of the user name (optional)
         * @return String: HTML fragment
-        * @since 1.19 Method exists for a long time. $displayText was added in 1.19.
+        * @since 1.19 Method exists for a long time. $altUserName was added in 1.19.
         */
        public static function userLink( $userId, $userName, $altUserName = false ) {
                if ( $userId == 0 ) {
@@ -1028,7 +1071,7 @@ class Linker {
                        }
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $userText );
 
-                       $items[] = self::link( $contribsPage, wfMsgHtml( 'contribslink' ), $attribs );
+                       $items[] = self::link( $contribsPage, wfMessage( 'contribslink' )->escaped(), $attribs );
                }
                if ( $blockable && $wgUser->isAllowed( 'block' ) ) {
                        $items[] = self::blockLink( $userId, $userText );
@@ -1069,7 +1112,7 @@ class Linker {
         */
        public static function userTalkLink( $userId, $userText ) {
                $userTalkPage = Title::makeTitle( NS_USER_TALK, $userText );
-               $userTalkLink = self::link( $userTalkPage, wfMsgHtml( 'talkpagelinktext' ) );
+               $userTalkLink = self::link( $userTalkPage, wfMessage( 'talkpagelinktext' )->escaped() );
                return $userTalkLink;
        }
 
@@ -1080,7 +1123,7 @@ class Linker {
         */
        public static function blockLink( $userId, $userText ) {
                $blockPage = SpecialPage::getTitleFor( 'Block', $userText );
-               $blockLink = self::link( $blockPage, wfMsgHtml( 'blocklink' ) );
+               $blockLink = self::link( $blockPage, wfMessage( 'blocklink' )->escaped() );
                return $blockLink;
        }
 
@@ -1091,7 +1134,7 @@ class Linker {
         */
        public static function emailLink( $userId, $userText ) {
                $emailPage = SpecialPage::getTitleFor( 'Emailuser', $userText );
-               $emailLink = self::link( $emailPage, wfMsgHtml( 'emaillink' ) );
+               $emailLink = self::link( $emailPage, wfMessage( 'emaillink' )->escaped() );
                return $emailLink;
        }
 
@@ -1103,12 +1146,12 @@ class Linker {
         */
        public static function revUserLink( $rev, $isPublic = false ) {
                if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
-                       $link = wfMsgHtml( 'rev-deleted-user' );
+                       $link = wfMessage( 'rev-deleted-user' )->escaped();
                } elseif ( $rev->userCan( Revision::DELETED_USER ) ) {
                        $link = self::userLink( $rev->getUser( Revision::FOR_THIS_USER ),
                                $rev->getUserText( Revision::FOR_THIS_USER ) );
                } else {
-                       $link = wfMsgHtml( 'rev-deleted-user' );
+                       $link = wfMessage( 'rev-deleted-user' )->escaped();
                }
                if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
                        return '<span class="history-deleted">' . $link . '</span>';
@@ -1124,7 +1167,7 @@ class Linker {
         */
        public static function revUserTools( $rev, $isPublic = false ) {
                if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
-                       $link = wfMsgHtml( 'rev-deleted-user' );
+                       $link = wfMessage( 'rev-deleted-user' )->escaped();
                } elseif ( $rev->userCan( Revision::DELETED_USER ) ) {
                        $userId = $rev->getUser( Revision::FOR_THIS_USER );
                        $userText = $rev->getUserText( Revision::FOR_THIS_USER );
@@ -1132,7 +1175,7 @@ class Linker {
                                . wfMessage( 'word-separator' )->plain()
                                . self::userToolLinks( $userId, $userText );
                } else {
-                       $link = wfMsgHtml( 'rev-deleted-user' );
+                       $link = wfMessage( 'rev-deleted-user' )->escaped();
                }
                if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
                        return ' <span class="history-deleted">' . $link . '</span>';
@@ -1246,11 +1289,11 @@ class Linker {
                        }
                        if ( $pre ) {
                                # written summary $presep autocomment (summary /* section */)
-                               $pre .= wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) );
+                               $pre .= wfMessage( 'autocomment-prefix' )->inContentLanguage()->escaped();
                        }
                        if ( $post ) {
                                # autocomment $postsep written summary (/* section */ summary)
-                               $auto .= wfMsgExt( 'colon-separator', array( 'escapenoentities', 'content' ) );
+                               $auto .= wfMessage( 'colon-separator' )->inContentLanguage()->escaped();
                        }
                        $auto = '<span class="autocomment">' . $auto . '</span>';
                        $comment = $pre . $link . $wgLang->getDirMark() . '<span dir="auto">' . $auto . $post . '</span>';
@@ -1472,12 +1515,12 @@ class Linker {
                        return "";
                }
                if ( $rev->isDeleted( Revision::DELETED_COMMENT ) && $isPublic ) {
-                       $block = " <span class=\"comment\">" . wfMsgHtml( 'rev-deleted-comment' ) . "</span>";
+                       $block = " <span class=\"comment\">" . wfMessage( 'rev-deleted-comment' )->escaped() . "</span>";
                } elseif ( $rev->userCan( Revision::DELETED_COMMENT ) ) {
                        $block = self::commentBlock( $rev->getComment( Revision::FOR_THIS_USER ),
                                $rev->getTitle(), $local );
                } else {
-                       $block = " <span class=\"comment\">" . wfMsgHtml( 'rev-deleted-comment' ) . "</span>";
+                       $block = " <span class=\"comment\">" . wfMessage( 'rev-deleted-comment' )->escaped() . "</span>";
                }
                if ( $rev->isDeleted( Revision::DELETED_COMMENT ) ) {
                        return " <span class=\"history-deleted\">$block</span>";
@@ -1491,13 +1534,11 @@ class Linker {
         */
        public static function formatRevisionSize( $size ) {
                if ( $size == 0 ) {
-                       $stxt = wfMsgExt( 'historyempty', 'parsemag' );
+                       $stxt = wfMessage( 'historyempty' )->escaped();
                } else {
-                       global $wgLang;
-                       $stxt = wfMsgExt( 'nbytes', 'parsemag', $wgLang->formatNum( $size ) );
+                       $stxt = wfMessage( 'nbytes' )->numParams( $size )->escaped();
                        $stxt = wfMessage( 'parentheses' )->rawParams( $stxt )->escaped();
                }
-               $stxt = htmlspecialchars( $stxt );
                return "<span class=\"history-size\">$stxt</span>";
        }
 
@@ -1549,11 +1590,13 @@ class Linker {
         * Wraps the TOC in a table and provides the hide/collapse javascript.
         *
         * @param $toc String: html of the Table Of Contents
-        * @param $lang mixed: Language code for the toc title
+        * @param $lang String|Language|false: Language for the toc title, defaults to user language
         * @return String: full html of the TOC
         */
        public static function tocList( $toc, $lang = false ) {
-               $title = wfMsgExt( 'toc', array( 'language' => $lang, 'escape' ) );
+               $lang = wfGetLangObj( $lang );
+               $title = wfMessage( 'toc' )->inLanguage( $lang )->escaped();
+
                return
                   '<table id="toc" class="toc"><tr><td>'
                 . '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
@@ -1646,11 +1689,17 @@ class Linker {
         * other users.
         *
         * @param $rev Revision object
+        * @param $context IContextSource context to use or null for the main context.
         * @return string
         */
-       public static function generateRollback( $rev ) {
+       public static function generateRollback( $rev, IContextSource $context = null ) {
+               if ( $context === null ) {
+                       $context = RequestContext::getMain();
+               }
+
                return '<span class="mw-rollback-link">'
-                       . wfMessage( 'brackets' )->rawParams( self::buildRollbackLink( $rev ) )->plain()
+                       . $context->msg( 'brackets' )->rawParams(
+                               self::buildRollbackLink( $rev, $context ) )->plain()
                        . '</span>';
        }
 
@@ -1658,27 +1707,84 @@ class Linker {
         * Build a raw rollback link, useful for collections of "tool" links
         *
         * @param $rev Revision object
+        * @param $context IContextSource context to use or null for the main context.
         * @return String: HTML fragment
         */
-       public static function buildRollbackLink( $rev ) {
-               global $wgRequest, $wgUser;
+       public static function buildRollbackLink( $rev, IContextSource $context = null ) {
+               global $wgShowRollbackEditCount, $wgMiserMode;
+               
+               // To config which pages are effected by miser mode
+               $disableRollbackEditCountSpecialPage = array( 'Recentchanges', 'Watchlist' );
+
+               if ( $context === null ) {
+                       $context = RequestContext::getMain();
+               }
+
                $title = $rev->getTitle();
                $query = array(
                        'action' => 'rollback',
                        'from' => $rev->getUserText(),
-                       'token' => $wgUser->getEditToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
+                       'token' => $context->getUser()->getEditToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
                );
-               if ( $wgRequest->getBool( 'bot' ) ) {
+               if ( $context->getRequest()->getBool( 'bot' ) ) {
                        $query['bot'] = '1';
                        $query['hidediff'] = '1'; // bug 15999
                }
-               return self::link(
-                       $title,
-                       wfMsgHtml( 'rollbacklink' ),
-                       array( 'title' => wfMsg( 'tooltip-rollback' ) ),
-                       $query,
-                       array( 'known', 'noclasses' )
-               );
+
+               $disableRollbackEditCount = false;
+               if( $wgMiserMode ) {
+                       foreach( $disableRollbackEditCountSpecialPage as $specialPage ) {
+                               if( $context->getTitle()->isSpecial( $specialPage ) ) {
+                                       $disableRollbackEditCount = true;
+                                       break;
+                               }
+                       }
+               }
+
+               if( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
+                       $dbr = wfGetDB( DB_SLAVE );
+
+                       // Up to the value of $wgShowRollbackEditCount revisions are counted
+                       $res = $dbr->select( 'revision',
+                               array( 'rev_id', 'rev_user_text' ),
+                               // $rev->getPage() returns null sometimes
+                               array( 'rev_page' => $rev->getTitle()->getArticleID() ),
+                               __METHOD__,
+                               array(  'USE INDEX' => 'page_timestamp',
+                                       'ORDER BY' => 'rev_timestamp DESC',
+                                       'LIMIT' => $wgShowRollbackEditCount + 1 )
+                       );
+
+                       $editCount = 0;
+                       while( $row = $dbr->fetchObject( $res ) ) {
+                               if( $rev->getUserText() != $row->rev_user_text ) {
+                                       break;
+                               }
+                               $editCount++;
+                       }
+
+                       if( $editCount > $wgShowRollbackEditCount ) {
+                               $editCount_output = $context->msg( 'rollbacklinkcount-morethan' )->numParams( $wgShowRollbackEditCount )->parse();
+                       } else {
+                               $editCount_output = $context->msg( 'rollbacklinkcount' )->numParams( $editCount )->parse();
+                       }
+
+                       return self::link(
+                               $title,
+                               $editCount_output,
+                               array( 'title' => $context->msg( 'tooltip-rollback' )->text() ),
+                               $query,
+                               array( 'known', 'noclasses' )
+                       );
+               } else {
+                       return self::link(
+                               $title,
+                               $context->msg( 'rollbacklink' )->escaped(),
+                               array( 'title' => $context->msg( 'tooltip-rollback' )->text() ),
+                               $query,
+                               array( 'known', 'noclasses' )
+                       );
+               }
        }
 
        /**
@@ -1705,35 +1811,38 @@ class Linker {
                        # Construct the HTML
                        $outText = '<div class="mw-templatesUsedExplanation">';
                        if ( $preview ) {
-                               $outText .= wfMsgExt( 'templatesusedpreview', array( 'parse' ), count( $templates ) );
+                               $outText .= wfMessage( 'templatesusedpreview' )->numParams( count( $templates ) )
+                                       ->parseAsBlock();
                        } elseif ( $section ) {
-                               $outText .= wfMsgExt( 'templatesusedsection', array( 'parse' ), count( $templates ) );
+                               $outText .= wfMessage( 'templatesusedsection' )->numParams( count( $templates ) )
+                                       ->parseAsBlock();
                        } else {
-                               $outText .= wfMsgExt( 'templatesused', array( 'parse' ), count( $templates ) );
+                               $outText .= wfMessage( 'templatesused' )->numParams( count( $templates ) )
+                                       ->parseAsBlock();
                        }
                        $outText .= "</div><ul>\n";
 
-                       usort( $templates, array( 'Title', 'compare' ) );
+                       usort( $templates, 'Title::compare' );
                        foreach ( $templates as $titleObj ) {
                                $r = $titleObj->getRestrictions( 'edit' );
                                if ( in_array( 'sysop', $r ) ) {
-                                       $protected = wfMsgExt( 'template-protected', array( 'parseinline' ) );
+                                       $protected = wfMessage( 'template-protected' )->parse();
                                } elseif ( in_array( 'autoconfirmed', $r ) ) {
-                                       $protected = wfMsgExt( 'template-semiprotected', array( 'parseinline' ) );
+                                       $protected = wfMessage( 'template-semiprotected' )->parse();
                                } else {
                                        $protected = '';
                                }
                                if ( $titleObj->quickUserCan( 'edit' ) ) {
                                        $editLink = self::link(
                                                $titleObj,
-                                               wfMsg( 'editlink' ),
+                                               wfMessage( 'editlink' )->text(),
                                                array(),
                                                array( 'action' => 'edit' )
                                        );
                                } else {
                                        $editLink = self::link(
                                                $titleObj,
-                                               wfMsg( 'viewsourcelink' ),
+                                               wfMessage( 'viewsourcelink' )->text(),
                                                array(),
                                                array( 'action' => 'edit' )
                                        );
@@ -1754,14 +1863,13 @@ class Linker {
         * @return String: HTML output
         */
        public static function formatHiddenCategories( $hiddencats ) {
-               global $wgLang;
                wfProfileIn( __METHOD__ );
 
                $outText = '';
                if ( count( $hiddencats ) > 0 ) {
                        # Construct the HTML
                        $outText = '<div class="mw-hiddenCategoriesExplanation">';
-                       $outText .= wfMsgExt( 'hiddencategories', array( 'parse' ), $wgLang->formatnum( count( $hiddencats ) ) );
+                       $outText .= wfMessage( 'hiddencategories' )->numParams( count( $hiddencats ) )->parseAsBlock();
                        $outText .= "</div><ul>\n";
 
                        foreach ( $hiddencats as $titleObj ) {
@@ -1913,15 +2021,16 @@ class Linker {
         * Creates a (show/hide) link for deleting revisions/log entries
         *
         * @param $query Array: query parameters to be passed to link()
-        * @param $restricted Boolean: set to true to use a <strong> instead of a <span>
+        * @param $restricted Boolean: set to true to use a "<strong>" instead of a "<span>"
         * @param $delete Boolean: set to true to use (show/hide) rather than (show)
         *
-        * @return String: HTML <a> link to Special:Revisiondelete, wrapped in a
+        * @return String: HTML "<a>" link to Special:Revisiondelete, wrapped in a
         * span to allow for customization of appearance with CSS
         */
        public static function revDeleteLink( $query = array(), $restricted = false, $delete = true ) {
                $sp = SpecialPage::getTitleFor( 'Revisiondelete' );
-               $html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
+               $msgKey = $delete ? 'rev-delundel' : 'rev-showdeleted';
+               $html = wfMessage( $msgKey )->escaped();
                $tag = $restricted ? 'strong' : 'span';
                $link = self::link( $sp, $html, array(), $query, array( 'known', 'noclasses' ) );
                return Xml::tags( $tag, array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $link )->escaped() );
@@ -1936,8 +2045,10 @@ class Linker {
         * of appearance with CSS
         */
        public static function revDeleteLinkDisabled( $delete = true ) {
-               $html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
-               return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $html )->escaped() );
+               $msgKey = $delete ? 'rev-delundel' : 'rev-showdeleted';
+               $html = wfMessage( $msgKey )->escaped();
+               $htmlParentheses = wfMessage( 'parentheses' )->rawParams( $html )->escaped();
+               return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), $htmlParentheses );
        }
 
        /* Deprecated methods */
index 0712ac8..1d0bcf7 100644 (file)
@@ -822,9 +822,7 @@ class LinksDeletionUpdate extends SqlDataUpdate {
        /**
         * Constructor
         *
-        * @param $title Title of the page we're updating
-        * @param $parserOutput ParserOutput: output from a full parse of this page
-        * @param $recursive Boolean: queue jobs for recursive updates?
+        * @param $page WikiPage Page we are updating
         */
        function __construct( WikiPage $page ) {
                parent::__construct( );
index 9ce26d0..d8e5d3a 100644 (file)
@@ -110,7 +110,7 @@ class LocalisationCache {
                'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
                'defaultDateFormat', 'extraUserToggles', 'specialPageAliases',
                'imageFiles', 'preloadedMessages', 'namespaceGenderAliases',
-               'digitGroupingPattern'
+               'digitGroupingPattern', 'pluralRules', 'compiledPluralRules',
        );
 
        /**
@@ -118,7 +118,7 @@ class LocalisationCache {
         * by a fallback sequence.
         */
        static public $mergeableMapKeys = array( 'messages', 'namespaceNames',
-               'dateFormats', 'imageFiles', 'preloadedMessages',
+               'dateFormats', 'imageFiles', 'preloadedMessages'
        );
 
        /**
@@ -154,6 +154,12 @@ class LocalisationCache {
         */
        static public $preloadedKeys = array( 'dateFormats', 'namespaceNames' );
 
+       /**
+        * Associative array of cached plural rules. The key is the language code,
+        * the value is an array of plural rules for that language.
+        */
+       var $pluralRules = null;
+
        var $mergeableKeys = null;
 
        /**
@@ -234,9 +240,9 @@ class LocalisationCache {
         */
        public function getItem( $code, $key ) {
                if ( !isset( $this->loadedItems[$code][$key] ) ) {
-                       wfProfileIn( __METHOD__.'-load' );
+                       wfProfileIn( __METHOD__ . '-load' );
                        $this->loadItem( $code, $key );
-                       wfProfileOut( __METHOD__.'-load' );
+                       wfProfileOut( __METHOD__ . '-load' );
                }
 
                if ( $key === 'fallback' && isset( $this->shallowFallbacks[$code] ) ) {
@@ -256,9 +262,9 @@ class LocalisationCache {
        public function getSubitem( $code, $key, $subkey ) {
                if ( !isset( $this->loadedSubitems[$code][$key][$subkey] ) &&
                         !isset( $this->loadedItems[$code][$key] ) ) {
-                       wfProfileIn( __METHOD__.'-load' );
+                       wfProfileIn( __METHOD__ . '-load' );
                        $this->loadSubitem( $code, $key, $subkey );
-                       wfProfileOut( __METHOD__.'-load' );
+                       wfProfileOut( __METHOD__ . '-load' );
                }
 
                if ( isset( $this->data[$code][$key][$subkey] ) ) {
@@ -367,7 +373,7 @@ class LocalisationCache {
         */
        public function isExpired( $code ) {
                if ( $this->forceRecache && !isset( $this->recachedLangs[$code] ) ) {
-                       wfDebug( __METHOD__."($code): forced reload\n" );
+                       wfDebug( __METHOD__ . "($code): forced reload\n" );
                        return true;
                }
 
@@ -376,7 +382,7 @@ class LocalisationCache {
                $preload = $this->store->get( $code, 'preload' );
                // Different keys may expire separately, at least in LCStore_Accel
                if ( $deps === null || $keys === null || $preload === null ) {
-                       wfDebug( __METHOD__."($code): cache missing, need to make one\n" );
+                       wfDebug( __METHOD__ . "($code): cache missing, need to make one\n" );
                        return true;
                }
 
@@ -386,7 +392,7 @@ class LocalisationCache {
                        // anymore (e.g. uninstalled extensions)
                        // When this happens, always expire the cache
                        if ( !$dep instanceof CacheDependency || $dep->isExpired() ) {
-                               wfDebug( __METHOD__."($code): cache for $code expired due to " .
+                               wfDebug( __METHOD__ . "($code): cache for $code expired due to " .
                                        get_class( $dep ) . "\n" );
                                return true;
                        }
@@ -481,9 +487,95 @@ class LocalisationCache {
                } elseif ( $_fileType == 'aliases' ) {
                        $data = compact( 'aliases' );
                } else {
-                       throw new MWException( __METHOD__.": Invalid file type: $_fileType" );
+                       throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
+               }
+               return $data;
+       }
+
+       /**
+        * Get the compiled plural rules for a given language from the XML files.
+        * @since 1.20
+        */
+       public function getCompiledPluralRules( $code ) {
+               $rules = $this->getPluralRules( $code );
+               if ( $rules === null ) {
+                       return null;
+               }
+               try {
+                       $compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
+               } catch( CLDRPluralRuleError $e ) {
+                       wfDebugLog( 'l10n', $e->getMessage() . "\n" );
+                       return array();
+               }
+               return $compiledRules;
+       }
+
+       /**
+        * Get the plural rules for a given language from the XML files.
+        * Cached.
+        * @since 1.20
+        */
+       public function getPluralRules( $code ) {
+               if ( $this->pluralRules === null ) {
+                       $cldrPlural = __DIR__ . "/../languages/data/plurals.xml";
+                       $mwPlural = __DIR__ . "/../languages/data/plurals-mediawiki.xml";
+                       // Load CLDR plural rules
+                       $this->loadPluralFile( $cldrPlural );
+                       if ( file_exists( $mwPlural ) ) {
+                               // Override or extend
+                               $this->loadPluralFile( $mwPlural );
+                       }
+               }
+               if ( !isset( $this->pluralRules[$code] ) ) {
+                       return null;
+               } else {
+                       return $this->pluralRules[$code];
+               }
+       }
+
+
+       /**
+        * Load a plural XML file with the given filename, compile the relevant
+        * rules, and save the compiled rules in a process-local cache.
+        */
+       protected function loadPluralFile( $fileName ) {
+               $doc = new DOMDocument;
+               $doc->load( $fileName );
+               $rulesets = $doc->getElementsByTagName( "pluralRules" );
+               foreach ( $rulesets as $ruleset ) {
+                       $codes = $ruleset->getAttribute( 'locales' );
+                       $rules = array();
+                       $ruleElements = $ruleset->getElementsByTagName( "pluralRule" );
+                       foreach ( $ruleElements as $elt ) {
+                               $rules[] = $elt->nodeValue;
+                       }
+                       foreach ( explode( ' ', $codes ) as $code ) {
+                               $this->pluralRules[$code] = $rules;
+                       }
+               }
+       }
+
+       /**
+        * Read the data from the source files for a given language, and register
+        * the relevant dependencies in the $deps array. If the localisation
+        * exists, the data array is returned, otherwise false is returned.
+        */
+       protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
+               $fileName = Language::getMessagesFileName( $code );
+               if ( !file_exists( $fileName ) ) {
+                       return false;
                }
 
+               $deps[] = new FileDependency( $fileName );
+               $data = $this->readPHPFile( $fileName, 'core' );
+
+               # Load CLDR plural rules for JavaScript
+               $data['pluralRules'] = $this->getPluralRules( $code );
+               # And for PHP
+               $data['compiledPluralRules'] = $this->getCompiledPluralRules( $code );
+
+               $deps['plurals'] = new FileDependency( __DIR__ . "/../languages/data/plurals.xml" );
+               $deps['plurals-mw'] = new FileDependency( __DIR__ . "/../languages/data/plurals-mediawiki.xml" );
                return $data;
        }
 
@@ -585,14 +677,12 @@ class LocalisationCache {
                $deps = array();
 
                # Load the primary localisation from the source file
-               $fileName = Language::getMessagesFileName( $code );
-               if ( !file_exists( $fileName ) ) {
-                       wfDebug( __METHOD__.": no localisation file for $code, using fallback to en\n" );
+               $data = $this->readSourceFilesAndRegisterDeps( $code, $deps );
+               if ( $data === false ) {
+                       wfDebug( __METHOD__ . ": no localisation file for $code, using fallback to en\n" );
                        $coreData['fallback'] = 'en';
                } else {
-                       $deps[] = new FileDependency( $fileName );
-                       $data = $this->readPHPFile( $fileName, 'core' );
-                       wfDebug( __METHOD__.": got localisation for $code from source\n" );
+                       wfDebug( __METHOD__ . ": got localisation for $code from source\n" );
 
                        # Merge primary localisation
                        foreach ( $data as $key => $value ) {
@@ -605,7 +695,6 @@ class LocalisationCache {
                if ( is_null( $coreData['fallback'] ) ) {
                        $coreData['fallback'] = $code === 'en' ? false : 'en';
                }
-
                if ( $coreData['fallback'] === false ) {
                        $coreData['fallbackSequence'] = array();
                } else {
@@ -621,15 +710,11 @@ class LocalisationCache {
                        foreach ( $coreData['fallbackSequence'] as $fbCode ) {
                                # Load the secondary localisation from the source file to
                                # avoid infinite cycles on cyclic fallbacks
-                               $fbFilename = Language::getMessagesFileName( $fbCode );
-
-                               if ( !file_exists( $fbFilename ) ) {
+                               $fbData = $this->readSourceFilesAndRegisterDeps( $fbCode, $deps );
+                               if ( $fbData === false ) {
                                        continue;
                                }
 
-                               $deps[] = new FileDependency( $fbFilename );
-                               $fbData = $this->readPHPFile( $fbFilename, 'core' );
-
                                foreach ( self::$allKeys as $key ) {
                                        if ( !isset( $fbData[$key] ) ) {
                                                continue;
@@ -654,7 +739,7 @@ class LocalisationCache {
                        $used = false;
 
                        foreach ( $data as $key => $item ) {
-                               if( $this->mergeExtensionItem( $codeSequence, $key, $allData[$key], $item ) ) {
+                               if ( $this->mergeExtensionItem( $codeSequence, $key, $allData[$key], $item ) ) {
                                        $used = true;
                                }
                        }
@@ -684,19 +769,26 @@ class LocalisationCache {
                        $page = str_replace( ' ', '_', $page );
                }
                # Decouple the reference to prevent accidental damage
-               unset($page);
+               unset( $page );
+
+               # If there were no plural rules, return an empty array
+               if ( $allData['pluralRules'] === null ) {
+                       $allData['pluralRules'] = array();
+               }
+               if ( $allData['compiledPluralRules'] === null ) {
+                       $allData['compiledPluralRules'] = array();
+               }
 
                # Set the list keys
                $allData['list'] = array();
                foreach ( self::$splitKeys as $key ) {
                        $allData['list'][$key] = array_keys( $allData[$key] );
                }
-
                # Run hooks
                wfRunHooks( 'LocalisationCacheRecache', array( $this, $code, &$allData ) );
 
                if ( is_null( $allData['namespaceNames'] ) ) {
-                       throw new MWException( __METHOD__.': Localisation data failed sanity check! ' .
+                       throw new MWException( __METHOD__ . ': Localisation data failed sanity check! ' .
                                'Check that your languages/messages/MessagesEn.php file is intact.' );
                }
 
@@ -924,7 +1016,7 @@ class LCStore_DB implements LCStore {
                }
 
                if ( !$code ) {
-                       throw new MWException( __METHOD__.": Invalid language \"$code\"" );
+                       throw new MWException( __METHOD__ . ": Invalid language \"$code\"" );
                }
 
                $this->dbw = wfGetDB( DB_MASTER );
@@ -968,7 +1060,7 @@ class LCStore_DB implements LCStore {
                }
 
                if ( is_null( $this->currentLang ) ) {
-                       throw new MWException( __CLASS__.': must call startWrite() before calling set()' );
+                       throw new MWException( __CLASS__ . ': must call startWrite() before calling set()' );
                }
 
                $this->batch[] = array(
@@ -1040,7 +1132,7 @@ class LCStore_CDB implements LCStore {
                }
 
                // Close reader to stop permission errors on write
-               if( !empty($this->readers[$code]) ) {
+               if ( !empty( $this->readers[$code] ) ) {
                        $this->readers[$code]->close();
                }
 
@@ -1058,14 +1150,14 @@ class LCStore_CDB implements LCStore {
 
        public function set( $key, $value ) {
                if ( is_null( $this->writer ) ) {
-                       throw new MWException( __CLASS__.': must call startWrite() before calling set()' );
+                       throw new MWException( __CLASS__ . ': must call startWrite() before calling set()' );
                }
                $this->writer->set( $key, serialize( $value ) );
        }
 
        protected function getFileName( $code ) {
                if ( !$code || strpos( $code, '/' ) !== false ) {
-                       throw new MWException( __METHOD__.": Invalid language \"$code\"" );
+                       throw new MWException( __METHOD__ . ": Invalid language \"$code\"" );
                }
                return "{$this->directory}/l10n_cache-$code.cdb";
        }
@@ -1181,8 +1273,9 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
                while ( count( $this->data ) > $this->maxLoadedLangs && count( $this->mruLangs ) ) {
                        reset( $this->mruLangs );
                        $code = key( $this->mruLangs );
-                       wfDebug( __METHOD__.": unloading $code\n" );
+                       wfDebug( __METHOD__ . ": unloading $code\n" );
                        $this->unload( $code );
                }
        }
+
 }
index f838ad0..42791f5 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 /**
- * This class encapsulates "magic words" such as #redirect, __NOTOC__, etc.
+ * This class encapsulates "magic words" such as "#redirect", __NOTOC__, etc.
  *
  * @par Usage:
  * @code
@@ -42,7 +42,7 @@
  *
  * To add magic words in an extension, use $magicWords in a file listed in
  * $wgExtensionMessagesFiles[].
- * 
+ *
  * @par Example:
  * @code
  * $magicWords = array();
@@ -99,6 +99,7 @@ class MagicWord {
                'numberoffiles',
                'numberofedits',
                'articlepath',
+               'pageid',
                'sitename',
                'server',
                'servername',
@@ -298,6 +299,7 @@ class MagicWord {
         * Initialises this object with an ID
         *
         * @param $id
+        * @throws MWException
         */
        function load( $id ) {
                global $wgContLang;
@@ -644,6 +646,9 @@ class MagicWordArray {
        var $baseRegex, $regex;
        var $matches;
 
+       /**
+        * @param $names array
+        */
        function __construct( $names = array() ) {
                $this->names = $names;
        }
@@ -771,6 +776,14 @@ class MagicWordArray {
                return $newRegex;
        }
 
+       /**
+        * @since 1.20
+        * @return array
+        */
+       public function getNames() {
+               return $this->names;
+       }
+
        /**
         * Parse a match array from preg_match
         * Returns array(magic word ID, parameter value)
@@ -778,6 +791,7 @@ class MagicWordArray {
         *
         * @param $m array
         *
+        * @throws MWException
         * @return array
         */
        function parseMatch( $m ) {
@@ -814,7 +828,7 @@ class MagicWordArray {
                $regexes = $this->getVariableStartToEndRegex();
                foreach ( $regexes as $regex ) {
                        if ( $regex !== '' ) {
-                               $m = false;
+                               $m = array();
                                if ( preg_match( $regex, $text, $m ) ) {
                                        return $this->parseMatch( $m );
                                }
index 3a87a00..776a52f 100644 (file)
@@ -28,7 +28,7 @@
  *
  * First implemented with MediaWiki 1.17, the Message class is intented to
  * replace the old wfMsg* functions that over time grew unusable.
- * @see https://www.mediawiki.org/wiki/New_messages_API for equivalences
+ * @see https://www.mediawiki.org/wiki/Manual:Messages_API for equivalences
  * between old and new functions.
  *
  * You should use the wfMessage() global function which acts as a wrapper for
@@ -209,6 +209,7 @@ class Message {
 
        /**
         * Constructor.
+        * @since 1.17
         * @param $key: message key, or array of message keys to try and use the first non-empty message for
         * @param $params Array message parameters
         * @return Message: $this
@@ -224,6 +225,7 @@ class Message {
         * Factory function that is just wrapper for the real constructor. It is
         * intented to be used instead of the real constructor, because it allows
         * chaining method calls, while new objects don't.
+        * @since 1.17
         * @param $key String: message key
         * @param Varargs: parameters as Strings
         * @return Message: $this
@@ -238,6 +240,7 @@ class Message {
         * Factory function accepting multiple message keys and returning a message instance
         * for the first message which is non-empty. If all messages are empty then an
         * instance of the first message key is returned.
+        * @since 1.18
         * @param Varargs: message keys (or first arg as an array of all the message keys)
         * @return Message: $this
         */
@@ -257,6 +260,7 @@ class Message {
 
        /**
         * Adds parameters to the parameter list of this message.
+        * @since 1.17
         * @param Varargs: parameters as Strings, or a single argument that is an array of Strings
         * @return Message: $this
         */
@@ -275,6 +279,7 @@ class Message {
         * In other words the parsing process cannot access the contents
         * of this type of parameter, and you need to make sure it is
         * sanitized beforehand.  The parser will see "$n", instead.
+        * @since 1.17
         * @param Varargs: raw parameters as Strings (or single argument that is an array of raw parameters)
         * @return Message: $this
         */
@@ -292,6 +297,7 @@ class Message {
        /**
         * Add parameters that are numeric and will be passed through
         * Language::formatNum before substitution
+        * @since 1.18
         * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
         * @return Message: $this
         */
@@ -308,7 +314,7 @@ class Message {
 
        /**
         * Set the language and the title from a context object
-        *
+        * @since 1.19
         * @param $context IContextSource
         * @return Message: $this
         */
@@ -324,6 +330,7 @@ class Message {
         * Request the message in any language that is supported.
         * As a side effect interface message status is unconditionally
         * turned off.
+        * @since 1.17
         * @param $lang Mixed: language code or Language object.
         * @return Message: $this
         */
@@ -347,6 +354,7 @@ class Message {
        /**
         * Request the message in the wiki's content language,
         * unless it is disabled for this message.
+        * @since 1.17
         * @see $wgForceUIMsgAsContentMsg
         * @return Message: $this
         */
@@ -376,6 +384,7 @@ class Message {
 
        /**
         * Enable or disable database use.
+        * @since 1.17
         * @param $value Boolean
         * @return Message: $this
         */
@@ -386,7 +395,7 @@ class Message {
 
        /**
         * Set the Title object to use as context when transforming the message
-        *
+        * @since 1.18
         * @param $title Title object
         * @return Message: $this
         */
@@ -397,6 +406,7 @@ class Message {
 
        /**
         * Returns the message parsed from wikitext to HTML.
+        * @since 1.17
         * @return String: HTML
         */
        public function toString() {
@@ -439,6 +449,7 @@ class Message {
         * Magic method implementation of the above (for PHP >= 5.2.0), so we can do, eg:
         *     $foo = Message::get($key);
         *     $string = "<abbr>$foo</abbr>";
+        * @since 1.18
         * @return String
         */
        public function __toString() {
@@ -447,6 +458,7 @@ class Message {
 
        /**
         * Fully parse the text from wikitext to HTML
+        * @since 1.17
         * @return String parsed HTML
         */
        public function parse() {
@@ -456,6 +468,7 @@ class Message {
 
        /**
         * Returns the message text. {{-transformation is done.
+        * @since 1.17
         * @return String: Unescaped message text.
         */
        public function text() {
@@ -465,6 +478,7 @@ class Message {
 
        /**
         * Returns the message text as-is, only parameters are subsituted.
+        * @since 1.17
         * @return String: Unescaped untransformed message text.
         */
        public function plain() {
@@ -474,6 +488,7 @@ class Message {
 
        /**
         * Returns the parsed message text which is always surrounded by a block element.
+        * @since 1.17
         * @return String: HTML
         */
        public function parseAsBlock() {
@@ -484,6 +499,7 @@ class Message {
        /**
         * Returns the message text. {{-transformation is done and the result
         * is escaped excluding any raw parameters.
+        * @since 1.17
         * @return String: Escaped message text.
         */
        public function escaped() {
@@ -493,6 +509,7 @@ class Message {
 
        /**
         * Check whether a message key has been defined currently.
+        * @since 1.17
         * @return Bool: true if it is and false if not.
         */
        public function exists() {
@@ -501,6 +518,7 @@ class Message {
 
        /**
         * Check whether a message does not exist, or is an empty string
+        * @since 1.18
         * @return Bool: true if is is and false if not
         * @todo FIXME: Merge with isDisabled()?
         */
@@ -511,6 +529,7 @@ class Message {
 
        /**
         * Check whether a message does not exist, is an empty string, or is "-"
+        * @since 1.18
         * @return Bool: true if is is and false if not
         */
        public function isDisabled() {
@@ -519,6 +538,7 @@ class Message {
        }
 
        /**
+        * @since 1.17
         * @param $value
         * @return array
         */
@@ -527,6 +547,7 @@ class Message {
        }
 
        /**
+        * @since 1.18
         * @param $value
         * @return array
         */
@@ -536,6 +557,7 @@ class Message {
 
        /**
         * Substitutes any paramaters into the message text.
+        * @since 1.17
         * @param $message String: the message text
         * @param $type String: either before or after
         * @return String
@@ -554,6 +576,7 @@ class Message {
 
        /**
         * Extracts the parameter type and preprocessed the value if needed.
+        * @since 1.18
         * @param $param String|Array: Parameter as defined in this class.
         * @return Tuple(type, value)
         * @throws MWException
@@ -574,6 +597,7 @@ class Message {
 
        /**
         * Wrapper for what ever method we use to parse wikitext.
+        * @since 1.17
         * @param $string String: Wikitext message contents
         * @return string Wikitext parsed into HTML
         */
@@ -583,6 +607,7 @@ class Message {
 
        /**
         * Wrapper for what ever method we use to {{-transform wikitext.
+        * @since 1.17
         * @param $string String: Wikitext message contents
         * @return string Wikitext with {{-constructs replaced with their values.
         */
@@ -592,7 +617,7 @@ class Message {
 
        /**
         * Wrapper for what ever method we use to get message contents
-        *
+        * @since 1.17
         * @return string
         */
        protected function fetchMessage() {
index 23955ae..34014e1 100644 (file)
@@ -299,7 +299,7 @@ class MessageBlobStore {
         */
        private static function reencodeBlob( $blob, $key, $lang ) {
                $decoded = FormatJson::decode( $blob, true );
-               $decoded[$key] = wfMsgExt( $key, array( 'language' => $lang ) );
+               $decoded[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
 
                return FormatJson::encode( (object)$decoded );
        }
@@ -353,7 +353,7 @@ class MessageBlobStore {
                $messages = array();
 
                foreach ( $module->getMessages() as $key ) {
-                       $messages[$key] = wfMsgExt( $key, array( 'language' => $lang ) );
+                       $messages[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
                }
 
                return FormatJson::encode( (object)$messages );
index 229856d..0ca1539 100644 (file)
@@ -60,7 +60,7 @@ abstract class RdfMetaData {
                global $wgLanguageCode, $wgSitename;
 
                $this->element( 'title', $this->mArticle->getTitle()->getText() );
-               $this->pageOrString( 'publisher', wfMsg( 'aboutpage' ), $wgSitename );
+               $this->pageOrString( 'publisher', wfMessage( 'aboutpage' )->text(), $wgSitename );
                $this->element( 'language', $wgLanguageCode );
                $this->element( 'type', 'Text' );
                $this->element( 'format', 'text/html' );
@@ -117,14 +117,18 @@ abstract class RdfMetaData {
 
        protected function person( $name, User $user ) {
                if( $user->isAnon() ){
-                       $this->element( $name, wfMsgExt( 'anonymous', array( 'parsemag' ), 1 ) );
+                       $this->element( $name, wfMessage( 'anonymous' )->numParams( 1 )->text() );
                } else {
                        $real = $user->getRealName();
                        if( $real ) {
                                $this->element( $name, $real );
                        } else {
                                $userName = $user->getName();
-                               $this->pageOrString( $name, $user->getUserPage(), wfMsgExt( 'siteuser', 'parsemag', $userName, $userName ) );
+                               $this->pageOrString(
+                                       $name,
+                                       $user->getUserPage(),
+                                       wfMessage( 'siteuser', $userName, $userName )->text()
+                               );
                        }
                }
        }
index c87a12b..2e2b8d6 100644 (file)
@@ -339,6 +339,33 @@ class MWNamespace {
                        return $wgContentNamespaces;
                }
        }
+
+       /**
+        * List all namespace indices which are considered subject, aka not a talk
+        * or special namespace. See also MWNamespace::isSubject
+        *
+        * @return array of namespace indices
+        */
+       public static function getSubjectNamespaces() {
+               return array_filter(
+                       MWNamespace::getValidNamespaces(),
+                       'MWNamespace::isSubject'
+               );
+       }
+
+       /**
+        * List all namespace indices which are considered talks, aka not a subject
+        * or special namespace. See also MWNamespace::isTalk
+        *
+        * @return array of namespace indices
+        */
+       public static function getTalkNamespaces() {
+               return array_filter(
+                       MWNamespace::getValidNamespaces(),
+                       'MWNamespace::isTalk'
+               );
+       }
+
        /**
         * Is the namespace first-letter capitalized?
         *
index 35b2f38..bc9eaa9 100644 (file)
  * @todo document
  */
 class OutputPage extends ContextSource {
-       /// Should be private. Used with addMeta() which adds <meta>
+       /// Should be private. Used with addMeta() which adds "<meta>"
        var $mMetatags = array();
 
-       /// <meta keywords="stuff"> most of the time the first 10 links to an article
+       /// "<meta keywords='stuff'>" most of the time the first 10 links to an article
        var $mKeywords = array();
 
        var $mLinktags = array();
@@ -50,17 +50,17 @@ class OutputPage extends ContextSource {
        /// Should be private - has getter and setter. Contains the HTML title
        var $mPagetitle = '';
 
-       /// Contains all of the <body> content. Should be private we got set/get accessors and the append() method.
+       /// Contains all of the "<body>" content. Should be private we got set/get accessors and the append() method.
        var $mBodytext = '';
 
        /**
         * Holds the debug lines that will be output as comments in page source if
         * $wgDebugComments is enabled. See also $wgShowDebug.
-        * TODO: make a getter method for this
+        * @deprecated since 1.20; use MWDebug class instead.
         */
-       public $mDebugtext = ''; // TODO: we might want to replace it by wfDebug() wfDebugLog()
+       public $mDebugtext = '';
 
-       /// Should be private. Stores contents of <title> tag
+       /// Should be private. Stores contents of "<title>" tag
        var $mHTMLtitle = '';
 
        /// Should be private. Is the displayed content related to the source of the corresponding wiki article.
@@ -116,8 +116,8 @@ class OutputPage extends ContextSource {
        /**
         * Should be private. Used for JavaScript (pre resource loader)
         * We should split js / css.
-        * mScripts content is inserted as is in <head> by Skin. This might contains
-        * either a link to a stylesheet or inline css.
+        * mScripts content is inserted as is in "<head>" by Skin. This might
+        * contains either a link to a stylesheet or inline css.
         */
        var $mScripts = '';
 
@@ -135,7 +135,7 @@ class OutputPage extends ContextSource {
         */
        var $mPageLinkTitle = '';
 
-       /// Array of elements in <head>. Parser might add its own headers!
+       /// Array of elements in "<head>". Parser might add its own headers!
        var $mHeadItems = array();
 
        // @todo FIXME: Next variables probably comes from the resource loader
@@ -197,7 +197,7 @@ class OutputPage extends ContextSource {
 
        /**
         * Comes from the parser. This was probably made to load CSS/JS only
-        * if we had <gallery>. Used directly in CategoryPage.php
+        * if we had "<gallery>". Used directly in CategoryPage.php
         * Looks like resource loader can replace this.
         */
        var $mNoGallery = false;
@@ -237,7 +237,6 @@ class OutputPage extends ContextSource {
        private $mFollowPolicy = 'follow';
        private $mVaryHeader = array(
                'Accept-Encoding' => array( 'list-contains=gzip' ),
-               'Cookie' => null
        );
 
        /**
@@ -293,7 +292,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add a new <meta> tag
+        * Add a new "<meta>" tag
         * To add an http-equiv meta tag, precede the name with "http:"
         *
         * @param $name String tag name
@@ -406,7 +405,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a self-contained script tag with the given contents
         *
-        * @param $script String: JavaScript text, no <script> tags
+        * @param $script String: JavaScript text, no "<script>" tags
         */
        public function addInlineScript( $script ) {
                $this->mScripts .= Html::inlineScript( "\n$script\n" ) . "\n";
@@ -648,24 +647,16 @@ class OutputPage extends ContextSource {
                $maxModified = max( $modifiedTimes );
                $this->mLastModified = wfTimestamp( TS_RFC2822, $maxModified );
 
-               if( empty( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
+               $clientHeader = $this->getRequest()->getHeader( 'If-Modified-Since' );
+               if ( $clientHeader === false ) {
                        wfDebug( __METHOD__ . ": client did not send If-Modified-Since header\n", false );
                        return false;
                }
 
-               # Make debug info
-               $info = '';
-               foreach ( $modifiedTimes as $name => $value ) {
-                       if ( $info !== '' ) {
-                               $info .= ', ';
-                       }
-                       $info .= "$name=" . wfTimestamp( TS_ISO_8601, $value );
-               }
-
                # IE sends sizes after the date like this:
                # Wed, 20 Aug 2003 06:51:19 GMT; length=5202
                # this breaks strtotime().
-               $clientHeader = preg_replace( '/;.*$/', '', $_SERVER["HTTP_IF_MODIFIED_SINCE"] );
+               $clientHeader = preg_replace( '/;.*$/', '', $clientHeader );
 
                wfSuppressWarnings(); // E_STRICT system time bitching
                $clientHeaderTime = strtotime( $clientHeader );
@@ -676,6 +667,15 @@ class OutputPage extends ContextSource {
                }
                $clientHeaderTime = wfTimestamp( TS_MW, $clientHeaderTime );
 
+               # Make debug info
+               $info = '';
+               foreach ( $modifiedTimes as $name => $value ) {
+                       if ( $info !== '' ) {
+                               $info .= ', ';
+                       }
+                       $info .= "$name=" . wfTimestamp( TS_ISO_8601, $value );
+               }
+
                wfDebug( __METHOD__ . ": client sent If-Modified-Since: " .
                        wfTimestamp( TS_ISO_8601, $clientHeaderTime ) . "\n", false );
                wfDebug( __METHOD__ . ": effective Last-Modified: " .
@@ -780,7 +780,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * "HTML title" means the contents of <title>.
+        * "HTML title" means the contents of "<title>".
         * It is stored as plain, unescaped text and will be run through htmlspecialchars in the skin file.
         *
         * @param $name string
@@ -794,7 +794,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Return the "HTML title", i.e. the content of the <title> tag.
+        * Return the "HTML title", i.e. the content of the "<title>" tag.
         *
         * @return String
         */
@@ -805,7 +805,7 @@ class OutputPage extends ContextSource {
        /**
         * Set $mRedirectedFrom, the Title of the page which redirected us to the current page.
         *
-        * param @t Title
+        * @param $t Title
         */
        public function setRedirectedFrom( $t ) {
                $this->mRedirectedFrom = $t;
@@ -1314,15 +1314,6 @@ class OutputPage extends ContextSource {
                return $this->mBodytext;
        }
 
-       /**
-        * Add $text to the debug output
-        *
-        * @param $text String: debug text
-        */
-       public function debug( $text ) {
-               $this->mDebugtext .= $text;
-       }
-
        /**
         * Get/set the ParserOptions object to use for wikitext parsing
         *
@@ -1363,11 +1354,11 @@ class OutputPage extends ContextSource {
         * Set the timestamp of the revision which will be displayed. This is used
         * to avoid a extra DB call in Skin::lastModified().
         *
-        * @param $revid Mixed: string, or null
+        * @param $timestamp Mixed: string, or null
         * @return Mixed: previous value
         */
-       public function setRevisionTimestamp( $timestmap ) {
-               return wfSetVar( $this->mRevisionTimestamp, $timestmap );
+       public function setRevisionTimestamp( $timestamp) {
+               return wfSetVar( $this->mRevisionTimestamp, $timestamp );
        }
 
        /**
@@ -1722,6 +1713,16 @@ class OutputPage extends ContextSource {
                $this->mVaryHeader[$header] = array_unique( (array)$this->mVaryHeader[$header] );
        }
 
+       /**
+        * Return a Vary: header on which to vary caches. Based on the keys of $mVaryHeader,
+        * such as Accept-Encoding or Cookie
+        *
+        * @return String
+        */
+       public function getVaryHeader() {
+               return 'Vary: ' . join( ', ', array_keys( $this->mVaryHeader ) );
+       }
+
        /**
         * Get a complete X-Vary-Options header
         *
@@ -1834,11 +1835,12 @@ class OutputPage extends ContextSource {
                        $response->header( "ETag: $this->mETag" );
                }
 
+               $this->addVaryHeader( 'Cookie' );
                $this->addAcceptLanguage();
 
                # don't serve compressed data to clients who can't handle it
                # maintain different caches for logged-in users and non-logged in ones
-               $response->header( 'Vary: ' . join( ', ', array_keys( $this->mVaryHeader ) ) );
+               $response->header( $this->getVaryHeader() );
 
                if ( $wgUseXVO ) {
                        # Add an X-Vary-Options header for Squid with Wikimedia patches
@@ -2013,18 +2015,14 @@ class OutputPage extends ContextSource {
        /**
         * Prepare this object to display an error page; disable caching and
         * indexing, clear the current text and redirect, set the page's title
-        * and optionally an custom HTML title (content of the <title> tag).
+        * and optionally an custom HTML title (content of the "<title>" tag).
         *
         * @param $pageTitle String|Message will be passed directly to setPageTitle()
         * @param $htmlTitle String|Message will be passed directly to setHTMLTitle();
-        *                   optional, if not passed the <title> attribute will be
+        *                   optional, if not passed the "<title>" attribute will be
         *                   based on $pageTitle
         */
        public function prepareErrorPage( $pageTitle, $htmlTitle = false ) {
-               if ( $this->getTitle() ) {
-                       $this->mDebugtext .= 'Original title: ' . $this->getTitle()->getPrefixedText() . "\n";
-               }
-
                $this->setPageTitle( $pageTitle );
                if ( $htmlTitle !== false ) {
                        $this->setHTMLTitle( $htmlTitle );
@@ -2042,13 +2040,18 @@ class OutputPage extends ContextSource {
         *
         * showErrorPage( 'titlemsg', 'pagetextmsg', array( 'param1', 'param2' ) );
         * showErrorPage( 'titlemsg', $messageObject );
+        * showErrorPage( $titleMessageObj, $messageObject );
         *
-        * @param $title String: message key for page title
+        * @param $title Mixed: message key (string) for page title, or a Message object
         * @param $msg Mixed: message key (string) for page text, or a Message object
         * @param $params Array: message parameters; ignored if $msg is a Message object
         */
        public function showErrorPage( $title, $msg, $params = array() ) {
-               $this->prepareErrorPage( $this->msg( $title ), $this->msg( 'errorpagetitle' ) );
+               if( !$title instanceof Message ) {
+                       $title = $this->msg( $title );
+               }
+
+               $this->prepareErrorPage( $title );
 
                if ( $msg instanceof Message ){
                        $this->addHTML( $msg->parse() );
@@ -2335,7 +2338,7 @@ $templates
         * Add a "return to" link pointing to a specified title
         *
         * @param $title Title to link
-        * @param $query String query string
+        * @param $query Array query string parameters
         * @param $text String text of the link (input is not escaped)
         */
        public function addReturnTo( $title, $query = array(), $text = null ) {
@@ -2375,13 +2378,13 @@ $templates
                        $titleObj = Title::newMainPage();
                }
 
-               $this->addReturnTo( $titleObj, $returntoquery );
+               $this->addReturnTo( $titleObj, wfCgiToArray( $returntoquery ) );
        }
 
        /**
         * @param $sk Skin The given Skin
         * @param $includeStyle Boolean: unused
-        * @return String: The doctype, opening <html>, and head element.
+        * @return String: The doctype, opening "<html>", and head element.
         */
        public function headElement( Skin $sk, $includeStyle = true ) {
                global $wgContLang;
@@ -2470,7 +2473,7 @@ $templates
                        wfRunHooks( 'AjaxAddScript', array( &$this ) );
 
                        if( $wgAjaxWatch && $this->getUser()->isLoggedIn() ) {
-                               $this->addModules( 'mediawiki.action.watch.ajax' );
+                               $this->addModules( 'mediawiki.page.watch.ajax' );
                        }
 
                        if ( $wgEnableMWSuggest && !$this->getUser()->getOption( 'disablesuggest', false ) ) {
@@ -2506,19 +2509,21 @@ $templates
         * @param $only String ResourceLoaderModule TYPE_ class constant
         * @param $useESI boolean
         * @param $extraQuery Array with extra query parameters to add to each request. array( param => value )
-        * @param $loadCall boolean If true, output an (asynchronous) mw.loader.load() call rather than a <script src="..."> tag
-        * @return string html <script> and <style> tags
+        * @param $loadCall boolean If true, output an (asynchronous) mw.loader.load() call rather than a "<script src='...'>" tag
+        * @return string html "<script>" and "<style>" tags
         */
        protected function makeResourceLoaderLink( $modules, $only, $useESI = false, array $extraQuery = array(), $loadCall = false ) {
                global $wgResourceLoaderUseESI;
 
+               $modules = (array) $modules;
+
                if ( !count( $modules ) ) {
                        return '';
                }
 
                if ( count( $modules ) > 1 ) {
                        // Remove duplicate module requests
-                       $modules = array_unique( (array) $modules );
+                       $modules = array_unique( $modules );
                        // Sort module names so requests are more uniform
                        sort( $modules );
 
@@ -2535,7 +2540,7 @@ $templates
                // Create keyed-by-group list of module objects from modules list
                $groups = array();
                $resourceLoader = $this->getResourceLoader();
-               foreach ( (array) $modules as $name ) {
+               foreach ( $modules as $name ) {
                        $module = $resourceLoader->getModule( $name );
                        # Check that we're allowed to include this module on this page
                        if ( !$module
@@ -2556,7 +2561,7 @@ $templates
                }
 
                $links = '';
-               foreach ( $groups as $group => $modules ) {
+               foreach ( $groups as $group => $grpModules ) {
                        // Special handling for user-specific groups
                        $user = null;
                        if ( ( $group === 'user' || $group === 'private' ) && $this->getUser()->isLoggedIn() ) {
@@ -2580,10 +2585,10 @@ $templates
                        $context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
                        // Extract modules that know they're empty
                        $emptyModules = array ();
-                       foreach ( $modules as $key => $module ) {
+                       foreach ( $grpModules as $key => $module ) {
                                if ( $module->isKnownEmpty( $context ) ) {
                                        $emptyModules[$key] = 'ready';
-                                       unset( $modules[$key] );
+                                       unset( $grpModules[$key] );
                                }
                        }
                        // Inline empty modules: since they're empty, just mark them as 'ready'
@@ -2601,7 +2606,7 @@ $templates
                        }
 
                        // If there are no modules left, skip this group
-                       if ( $modules === array() ) {
+                       if ( count( $grpModules ) === 0 ) {
                                continue;
                        }
 
@@ -2612,12 +2617,12 @@ $templates
                        if ( $group === 'private' ) {
                                if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
                                        $links .= Html::inlineStyle(
-                                               $resourceLoader->makeModuleResponse( $context, $modules )
+                                               $resourceLoader->makeModuleResponse( $context, $grpModules )
                                        );
                                } else {
                                        $links .= Html::inlineScript(
                                                ResourceLoader::makeLoaderConditionalScript(
-                                                       $resourceLoader->makeModuleResponse( $context, $modules )
+                                                       $resourceLoader->makeModuleResponse( $context, $grpModules )
                                                )
                                        );
                                }
@@ -2633,7 +2638,7 @@ $templates
                        if ( $group === 'user' ) {
                                // Get the maximum timestamp
                                $timestamp = 1;
-                               foreach ( $modules as $module ) {
+                               foreach ( $grpModules as $module ) {
                                        $timestamp = max( $timestamp, $module->getModifiedTime( $context ) );
                                }
                                // Add a version parameter so cache will break when things change
@@ -2641,7 +2646,7 @@ $templates
                        }
 
                        $url = ResourceLoader::makeLoaderURL(
-                               array_keys( $modules ),
+                               array_keys( $grpModules ),
                                $this->getLanguage()->getCode(),
                                $this->getSkin()->getSkinName(),
                                $user,
@@ -2684,7 +2689,7 @@ $templates
        }
 
        /**
-        * JS stuff to put in the <head>. This is the startup module, config
+        * JS stuff to put in the "<head>". This is the startup module, config
         * vars and modules marked with position 'top'
         *
         * @return String: HTML fragment
@@ -2732,12 +2737,12 @@ $templates
        }
 
        /**
-        * JS stuff to put at the 'bottom', which can either be the bottom of the <body>
-        * or the bottom of the <head> depending on $wgResourceLoaderExperimentalAsyncLoading:
+        * JS stuff to put at the 'bottom', which can either be the bottom of the "<body>"
+        * or the bottom of the "<head>" depending on $wgResourceLoaderExperimentalAsyncLoading:
         * modules marked with position 'bottom', legacy scripts ($this->mScripts),
         * user preferences, site JS and user JS
         *
-        * @param $inHead boolean If true, this HTML goes into the <head>, if false it goes into the <body>
+        * @param $inHead boolean If true, this HTML goes into the "<head>", if false it goes into the "<body>"
         * @return string
         */
        function getScriptsForBottomQueue( $inHead ) {
@@ -2853,7 +2858,7 @@ $templates
        }
 
        /**
-        * JS stuff to put at the bottom of the <body>
+        * JS stuff to put at the bottom of the "<body>"
         * @return string
         */
        function getBottomScripts() {
@@ -2868,7 +2873,7 @@ $templates
        /**
         * Add one or more variables to be set in mw.config in JavaScript.
         *
-        * @param $key {String|Array} Key or array of key/value pars.
+        * @param $keys {String|Array} Key or array of key/value pairs.
         * @param $value {Mixed} [optional] Value of the configuration variable.
         */
        public function addJsConfigVars( $keys, $value = null ) {
@@ -2951,6 +2956,9 @@ $templates
                        'wgPageContentLanguage' => $lang->getCode(),
                        'wgSeparatorTransformTable' => $compactSeparatorTransTable,
                        'wgDigitTransformTable' => $compactDigitTransTable,
+                       'wgDefaultDateFormat' => $lang->getDefaultDateFormat(),
+                       'wgMonthNames' => $lang->getMonthNamesArray(),
+                       'wgMonthNamesShort' => $lang->getMonthAbbreviationsArray(),
                        'wgRelevantPageName' => $relevantTitle->getPrefixedDBKey(),
                );
                if ( $wgContLang->hasVariants() ) {
@@ -3004,7 +3012,7 @@ $templates
        }
 
        /**
-        * @param $addContentType bool: Whether <meta> specifying content type should be returned
+        * @param $addContentType bool: Whether "<meta>" specifying content type should be returned
         *
         * @return array in format "link name or number => 'link html'".
         */
@@ -3238,7 +3246,7 @@ $templates
 
        /**
         * @param $unused
-        * @param $addContentType bool: Whether <meta> specifying content type should be returned
+        * @param $addContentType bool: Whether "<meta>" specifying content type should be returned
         *
         * @return string HTML tag links to be put in the header.
         */
@@ -3247,7 +3255,7 @@ $templates
        }
 
        /**
-        * Generate a <link rel/> for a feed.
+        * Generate a "<link rel/>" for a feed.
         *
         * @param $type String: feed type
         * @param $url String: URL to the feed
@@ -3302,7 +3310,7 @@ $templates
        }
 
        /**
-        * Build a set of <link>s for the stylesheets specified in the $this->styles array.
+        * Build a set of "<link>" elements for the stylesheets specified in the $this->styles array.
         * These will be applied to various media & IE conditionals.
         *
         * @return string
@@ -3500,7 +3508,7 @@ $templates
         * Add a wikitext-formatted message to the output.
         * This is equivalent to:
         *
-        *    $wgOut->addWikiText( wfMsgNoTrans( ... ) )
+        *    $wgOut->addWikiText( wfMessage( ... )->plain() )
         */
        public function addWikiMsg( /*...*/ ) {
                $args = func_get_args();
index bcd6d14..96ba446 100644 (file)
@@ -118,6 +118,11 @@ abstract class IndexPager extends ContextSource implements Pager {
 
        protected $mLastShown, $mFirstShown, $mPastTheEndIndex, $mDefaultQuery, $mNavigationBar;
 
+       /**
+        * Whether to include the offset in the query
+        */
+       protected $mIncludeOffset = false;
+
        /**
         * Result object for the query. Warning: seek before use.
         *
@@ -139,7 +144,10 @@ abstract class IndexPager extends ContextSource implements Pager {
 
                # Use consistent behavior for the limit options
                $this->mDefaultLimit = intval( $this->getUser()->getOption( 'rclimit' ) );
-               list( $this->mLimit, /* $offset */ ) = $this->mRequest->getLimitOffset();
+               if ( !$this->mLimit ) {
+                       // Don't override if a subclass calls $this->setLimit() in its constructor.
+                       list( $this->mLimit, /* $offset */ ) = $this->mRequest->getLimitOffset();
+               }
 
                $this->mIsBackwards = ( $this->mRequest->getVal( 'dir' ) == 'prev' );
                $this->mDb = wfGetDB( DB_SLAVE );
@@ -175,6 +183,15 @@ abstract class IndexPager extends ContextSource implements Pager {
                }
        }
 
+       /**
+        * Get the Database object in use
+        *
+        * @return DatabaseBase
+        */
+       public function getDatabase() {
+               return $this->mDb;
+       }
+
        /**
         * Do the query, using information from the object context. This function
         * has been kept minimal to make it overridable if necessary, to allow for
@@ -194,6 +211,7 @@ abstract class IndexPager extends ContextSource implements Pager {
                        $queryLimit,
                        $descending
                );
+
                $this->extractResultInfo( $this->mOffset, $queryLimit, $this->mResult );
                $this->mQueryDone = true;
 
@@ -221,10 +239,30 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Set the limit from an other source than the request
         *
+        * Verifies limit is between 1 and 5000
+        *
         * @param $limit Int|String
         */
        function setLimit( $limit ) {
-               $this->mLimit = $limit;
+               $limit = (int) $limit;
+               // WebRequest::getLimitOffset() puts a cap of 5000, so do same here.
+               if ( $limit > 5000 ) {
+                       $limit = 5000;
+               }
+               if ( $limit > 0 ) {
+                       $this->mLimit = $limit;
+               }
+       }
+
+       /**
+        * Set whether a row matching exactly the offset should be also included
+        * in the result or not. By default this is not the case, but when the
+        * offset is user-supplied this might be wanted.
+        *
+        * @param $include bool
+        */
+       public function setIncludeOffset( $include ) {
+               $this->mIncludeOffset = $include;
        }
 
        /**
@@ -303,7 +341,20 @@ abstract class IndexPager extends ContextSource implements Pager {
         * @param $descending Boolean: query direction, false for ascending, true for descending
         * @return ResultWrapper
         */
-       function reallyDoQuery( $offset, $limit, $descending ) {
+       public function reallyDoQuery( $offset, $limit, $descending ) {
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $descending );
+               return $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
+       }
+
+       /**
+        * Build variables to use by the database wrapper.
+        *
+        * @param $offset String: index offset, inclusive
+        * @param $limit Integer: exact query limit
+        * @param $descending Boolean: query direction, false for ascending, true for descending
+        * @return array
+        */
+       protected function buildQueryInfo( $offset, $limit, $descending ) {
                $fname = __METHOD__ . ' (' . $this->getSqlComment() . ')';
                $info = $this->getQueryInfo();
                $tables = $info['tables'];
@@ -314,21 +365,20 @@ abstract class IndexPager extends ContextSource implements Pager {
                $sortColumns = array_merge( array( $this->mIndexField ), $this->mExtraSortFields );
                if ( $descending ) {
                        $options['ORDER BY'] = $sortColumns;
-                       $operator = '>';
+                       $operator = $this->mIncludeOffset ? '>=' : '>';
                } else {
                        $orderBy = array();
                        foreach ( $sortColumns as $col ) {
                                $orderBy[] = $col . ' DESC';
                        }
                        $options['ORDER BY'] = $orderBy;
-                       $operator = '<';
+                       $operator = $this->mIncludeOffset ? '<=' : '<';
                }
                if ( $offset != '' ) {
                        $conds[] = $this->mIndexField . $operator . $this->mDb->addQuotes( $offset );
                }
                $options['LIMIT'] = intval( $limit );
-               $res = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
-               return new ResultWrapper( $this->mDb, $res );
+               return array( $tables, $fields, $conds, $fname, $options, $join_conds );
        }
 
        /**
@@ -877,7 +927,7 @@ abstract class TablePager extends IndexPager {
                $tableClass = htmlspecialchars( $this->getTableClass() );
                $sortClass = htmlspecialchars( $this->getSortHeaderClass() );
 
-               $s = "<table style='border:1;' class=\"mw-datatable $tableClass\"><thead><tr>\n";
+               $s = "<table style='border:1px;' class=\"mw-datatable $tableClass\"><thead><tr>\n";
                $fields = $this->getFieldNames();
 
                # Make table header
@@ -980,7 +1030,7 @@ abstract class TablePager extends IndexPager {
         * @protected
         *
         * @param $row Object: the database result row
-        * @return Array of <attr> => <value>
+        * @return Array of attribute => value
         */
        function getRowAttrs( $row ) {
                $class = $this->getRowClass( $row );
@@ -1095,7 +1145,7 @@ abstract class TablePager extends IndexPager {
        }
 
        /**
-        * Get a <select> element which has options for each of the allowed limits
+        * Get a "<select>" element which has options for each of the allowed limits
         *
         * @return String: HTML fragment
         */
@@ -1125,7 +1175,7 @@ abstract class TablePager extends IndexPager {
        }
 
        /**
-        * Get <input type="hidden"> elements for use in a method="get" form.
+        * Get \<input type="hidden"\> elements for use in a method="get" form.
         * Resubmits all defined elements of the query string, except for a
         * blacklist, passed in the $blacklist parameter.
         *
index bf63d65..eaf781b 100644 (file)
@@ -939,7 +939,7 @@ class Preferences {
 
                if ( $wgEnableAPI ) {
                        # Some random gibberish as a proposed default
-                       // @fixme This should use CryptRand but we may not want to read urandom on every view
+                       // @todo Fixme: this should use CryptRand but we may not want to read urandom on every view
                        $hash = sha1( mt_rand() . microtime( true ) );
 
                        $defaultPreferences['watchlisttoken'] = array(
@@ -1587,7 +1587,7 @@ class PreferencesForm extends HTMLForm {
        }
 
        /**
-        * Get the <legend> for a given section key. Normally this is the
+        * Get the "<legend>" for a given section key. Normally this is the
         * prefs-$key message but we'll allow extensions to override it.
         * @param $key string
         * @return string
index dbe06d4..ce0e36b 100644 (file)
@@ -74,17 +74,17 @@ class ProtectionForm {
                $this->disabledAttrib = $this->disabled
                        ? array( 'disabled' => 'disabled' )
                        : array();
-               
+
                $this->loadData();
        }
-       
+
        /**
         * Loads the current state of protection into the object.
         */
        function loadData() {
                global $wgRequest, $wgUser;
                global $wgRestrictionLevels;
-               
+
                $this->mCascade = $this->mTitle->areRestrictionsCascading();
 
                $this->mReason = $wgRequest->getText( 'mwProtect-reason' );
@@ -94,7 +94,7 @@ class ProtectionForm {
                foreach( $this->mApplicableTypes as $action ) {
                        // @todo FIXME: This form currently requires individual selections,
                        // but the db allows multiples separated by commas.
-                       
+
                        // Pull the actual restriction from the DB
                        $this->mRestrictions[$action] = implode( '', $this->mTitle->getRestrictions( $action ) );
 
@@ -151,7 +151,7 @@ class ProtectionForm {
         * Get the expiry time for a given action, by combining the relevant inputs.
         *
         * @param $action string
-        * 
+        *
         * @return string 14-char timestamp or "infinity", or false if the input was invalid
         */
        function getExpiry( $action ) {
@@ -265,7 +265,7 @@ class ProtectionForm {
                $reasonstr = $this->mReasonSelection;
                if ( $reasonstr != 'other' && $this->mReason != '' ) {
                        // Entry from drop down menu + additional comment
-                       $reasonstr .= wfMsgForContent( 'colon-separator' ) . $this->mReason;
+                       $reasonstr .= wfMessage( 'colon-separator' )->text() . $this->mReason;
                } elseif ( $reasonstr == 'other' ) {
                        $reasonstr = $this->mReason;
                }
@@ -318,10 +318,12 @@ class ProtectionForm {
                        return false;
                }
 
-               if ( $wgRequest->getCheck( 'mwProtectWatch' ) && $wgUser->isLoggedIn() ) {
-                       WatchAction::doWatch( $this->mTitle, $wgUser );
-               } elseif ( $this->mTitle->userIsWatching() ) {
-                       WatchAction::doUnwatch( $this->mTitle, $wgUser );
+               if ( $wgUser->isLoggedIn() && $wgRequest->getCheck( 'mwProtectWatch' ) != $wgUser->isWatched( $this->mTitle ) ) {
+                       if ( $wgRequest->getCheck( 'mwProtectWatch' ) ) {
+                               WatchAction::doWatch( $this->mTitle, $wgUser );
+                       } else {
+                               WatchAction::doUnwatch( $this->mTitle, $wgUser );
+                       }
                }
                return true;
        }
@@ -334,8 +336,14 @@ class ProtectionForm {
        function buildForm() {
                global $wgUser, $wgLang, $wgOut;
 
-               $mProtectreasonother = Xml::label( wfMsg( 'protectcomment' ), 'wpProtectReasonSelection' );
-               $mProtectreason = Xml::label( wfMsg( 'protect-otherreason' ), 'mwProtect-reason' );
+               $mProtectreasonother = Xml::label(
+                       wfMessage( 'protectcomment' )->text(),
+                       'wpProtectReasonSelection'
+               );
+               $mProtectreason = Xml::label(
+                       wfMessage( 'protect-otherreason' )->text(),
+                       'mwProtect-reason'
+               );
 
                $out = '';
                if( !$this->disabled ) {
@@ -346,7 +354,7 @@ class ProtectionForm {
                }
 
                $out .= Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, wfMsg( 'protect-legend' ) ) .
+                       Xml::element( 'legend', null, wfMessage( 'protect-legend' )->text() ) .
                        Xml::openElement( 'table', array( 'id' => 'mwProtectSet' ) ) .
                        Xml::openElement( 'tbody' );
 
@@ -360,16 +368,22 @@ class ProtectionForm {
                                "<tr><td>" . $this->buildSelector( $action, $selected ) . "</td></tr><tr><td>";
 
                        $reasonDropDown = Xml::listDropDown( 'wpProtectReasonSelection',
-                               wfMsgForContent( 'protect-dropdown' ),
-                               wfMsgForContent( 'protect-otherreason-op' ),
+                               wfMessage( 'protect-dropdown' )->inContentLanguage()->text(),
+                               wfMessage( 'protect-otherreason-op' )->inContentLanguage()->text(),
                                $this->mReasonSelection,
                                'mwProtect-reason', 4 );
-                       $scExpiryOptions = wfMsgForContent( 'protect-expiry-options' );
+                       $scExpiryOptions = wfMessage( 'protect-expiry-options' )->inContentLanguage()->text();
 
                        $showProtectOptions = ($scExpiryOptions !== '-' && !$this->disabled);
 
-                       $mProtectexpiry = Xml::label( wfMsg( 'protectexpiry' ), "mwProtectExpirySelection-$action" );
-                       $mProtectother = Xml::label( wfMsg( 'protect-othertime' ), "mwProtect-$action-expires" );
+                       $mProtectexpiry = Xml::label(
+                               wfMessage( 'protectexpiry' )->text(),
+                               "mwProtectExpirySelection-$action"
+                       );
+                       $mProtectother = Xml::label(
+                               wfMessage( 'protect-othertime' )->text(),
+                               "mwProtect-$action-expires"
+                       );
 
                        $expiryFormOptions = '';
                        if ( $this->mExistingExpiry[$action] && $this->mExistingExpiry[$action] != 'infinity' ) {
@@ -378,13 +392,16 @@ class ProtectionForm {
                                $t = $wgLang->time( $this->mExistingExpiry[$action], true );
                                $expiryFormOptions .=
                                        Xml::option(
-                                               wfMsg( 'protect-existing-expiry', $timestamp, $d, $t ),
+                                               wfMessage( 'protect-existing-expiry', $timestamp, $d, $t )->text(),
                                                'existing',
                                                $this->mExpirySelection[$action] == 'existing'
                                        ) . "\n";
                        }
 
-                       $expiryFormOptions .= Xml::option( wfMsg( 'protect-othertime-op' ), "othertime" ) . "\n";
+                       $expiryFormOptions .= Xml::option(
+                               wfMessage( 'protect-othertime-op' )->text(),
+                               "othertime"
+                       ) . "\n";
                        foreach( explode(',', $scExpiryOptions) as $option ) {
                                if ( strpos($option, ":") === false ) {
                                        $show = $value = $option;
@@ -442,8 +459,12 @@ class ProtectionForm {
                        $out .= '<tr>
                                        <td></td>
                                        <td class="mw-input">' .
-                                               Xml::checkLabel( wfMsg( 'protect-cascade' ), 'mwProtect-cascade', 'mwProtect-cascade',
-                                                       $this->mCascade, $this->disabledAttrib ) .
+                                               Xml::checkLabel(
+                                                       wfMessage( 'protect-cascade' )->text(),
+                                                       'mwProtect-cascade',
+                                                       'mwProtect-cascade',
+                                                       $this->mCascade, $this->disabledAttrib
+                                               ) .
                                        "</td>
                                </tr>\n";
                        $out .= Xml::closeElement( 'tbody' ) . Xml::closeElement( 'table' );
@@ -480,7 +501,7 @@ class ProtectionForm {
                                <tr>
                                        <td></td>
                                        <td class='mw-input'>" .
-                                               Xml::checkLabel( wfMsg( 'watchthis' ),
+                                               Xml::checkLabel( wfMessage( 'watchthis' )->text(),
                                                        'mwProtectWatch', 'mwProtectWatch',
                                                        $this->mTitle->userIsWatching() || $wgUser->getOption( 'watchdefault' ) ) .
                                        "</td>
@@ -490,7 +511,10 @@ class ProtectionForm {
                                <tr>
                                        <td></td>
                                        <td class='mw-submit'>" .
-                                               Xml::submitButton( wfMsg( 'confirm' ), array( 'id' => 'mw-Protect-submit' ) ) .
+                                               Xml::submitButton(
+                                                       wfMessage( 'confirm' )->text(),
+                                                       array( 'id' => 'mw-Protect-submit' )
+                                               ) .
                                        "</td>
                                </tr>\n";
                        $out .= Xml::closeElement( 'tbody' ) . Xml::closeElement( 'table' );
@@ -501,7 +525,7 @@ class ProtectionForm {
                        $title = Title::makeTitle( NS_MEDIAWIKI, 'Protect-dropdown' );
                        $link = Linker::link(
                                $title,
-                               wfMsgHtml( 'protect-edit-reasonlist' ),
+                               wfMessage( 'protect-edit-reasonlist' )->escaped(),
                                array(),
                                array( 'action' => 'edit' )
                        );
@@ -565,23 +589,23 @@ class ProtectionForm {
         */
        private function getOptionLabel( $permission ) {
                if( $permission == '' ) {
-                       return wfMsg( 'protect-default' );
+                       return wfMessage( 'protect-default' )->text();
                } else {
                        $msg = wfMessage( "protect-level-{$permission}" );
                        if( $msg->exists() ) {
                                return $msg->text();
                        }
-                       return wfMsg( 'protect-fallback', $permission );
+                       return wfMessage( 'protect-fallback', $permission )->text();
                }
        }
-       
+
        function buildCleanupScript() {
                global $wgRestrictionLevels, $wgGroupPermissions, $wgOut;
 
                $cascadeableLevels = array();
                foreach( $wgRestrictionLevels as $key ) {
                        if ( ( isset( $wgGroupPermissions[$key]['protect'] ) && $wgGroupPermissions[$key]['protect'] )
-                               || $key == 'protect' 
+                               || $key == 'protect'
                        ) {
                                $cascadeableLevels[] = $key;
                        }
@@ -606,7 +630,8 @@ class ProtectionForm {
         */
        function showLogExtract( &$out ) {
                # Show relevant lines from the protection log:
-               $out->addHTML( Xml::element( 'h2', null, LogPage::logName( 'protect' ) ) );
+               $protectLogPage = new LogPage( 'protect' );
+               $out->addHTML( Xml::element( 'h2', null, $protectLogPage->getName()->text() ) );
                LogEventsList::showLogExtract( $out, 'protect', $this->mTitle );
                # Let extensions add other relevant log extracts
                wfRunHooks( 'ProtectionForm::showLogExtract', array($this->mArticle,$out) );
index 4440aac..ac559dc 100644 (file)
@@ -45,6 +45,7 @@ $wgQueryPages = array(
        array( 'MIMEsearchPage',                'MIMEsearch'                    ),
        array( 'MostcategoriesPage',            'Mostcategories'                ),
        array( 'MostimagesPage',                'Mostimages'                    ),
+       array( 'MostinterwikisPage',            'Mostinterwikis'                ),
        array( 'MostlinkedCategoriesPage',      'Mostlinkedcategories'          ),
        array( 'MostlinkedtemplatesPage',       'Mostlinkedtemplates'           ),
        array( 'MostlinkedPage',                'Mostlinked'                    ),
@@ -432,9 +433,9 @@ abstract class QueryPage extends SpecialPage {
                        $options['ORDER BY'] = 'qc_value ASC';
                }
                $res = $dbr->select( 'querycache', array( 'qc_type',
-                               'qc_namespace AS namespace',
-                               'qc_title AS title',
-                               'qc_value AS value' ),
+                               'namespace' => 'qc_namespace',
+                               'title' => 'qc_title',
+                               'value' => 'qc_value' ),
                                array( 'qc_type' => $this->getName() ),
                                __METHOD__, $options
                );
@@ -483,10 +484,11 @@ abstract class QueryPage extends SpecialPage {
 
                // TODO: Use doQuery()
                if ( !$this->isCached() ) {
-                       $res = $this->reallyDoQuery( $this->limit, $this->offset );
+                       # select one extra row for navigation
+                       $res = $this->reallyDoQuery( $this->limit + 1, $this->offset );
                } else {
-                       # Get the cached result
-                       $res = $this->fetchFromCache( $this->limit, $this->offset );
+                       # Get the cached result, select one extra row for navigation
+                       $res = $this->fetchFromCache( $this->limit + 1, $this->offset );
                        if ( !$this->listoutput ) {
 
                                # Fetch the timestamp of this update
@@ -525,10 +527,11 @@ abstract class QueryPage extends SpecialPage {
                        $out->addHTML( $this->getPageHeader() );
                        if ( $this->numRows > 0 ) {
                                $out->addHTML( $this->msg( 'showingresults' )->numParams(
-                                       $this->numRows, $this->offset + 1 )->parseAsBlock() );
+                                       min( $this->numRows, $this->limit ), # do not show the one extra row, if exist
+                                       $this->offset + 1 )->parseAsBlock() );
                                # Disable the "next" link when we reach the end
                                $paging = $this->getLanguage()->viewPrevNext( $this->getTitle( $par ), $this->offset,
-                                       $this->limit, $this->linkParameters(), ( $this->numRows < $this->limit ) );
+                                       $this->limit, $this->linkParameters(), ( $this->numRows <= $this->limit ) );
                                $out->addHTML( '<p>' . $paging . '</p>' );
                        } else {
                                # No results to show, so don't bother with "showing X of Y" etc.
@@ -546,7 +549,7 @@ abstract class QueryPage extends SpecialPage {
                        $this->getSkin(),
                        $dbr, # Should use a ResultWrapper for this
                        $res,
-                       $this->numRows,
+                       min( $this->numRows, $this->limit ), # do not format the one extra row, if exist
                        $this->offset );
 
                # Repeat the paging links at the bottom
@@ -556,7 +559,7 @@ abstract class QueryPage extends SpecialPage {
 
                $out->addHTML( Xml::closeElement( 'div' ) );
 
-               return $this->numRows;
+               return min( $this->numRows, $this->limit ); # do not return the one extra row, if exist
        }
 
        /**
index cd8a1b5..332d039 100644 (file)
@@ -19,7 +19,7 @@
  *
  * @file
  */
+
 /**
  * Utility class for creating new RC entries
  *
@@ -70,6 +70,11 @@ class RecentChange {
         */
        var $mTitle = false;
 
+       /**
+        * @var User
+        */
+       private $mPerformer = false;
+
        /**
         * @var Title
         */
@@ -108,13 +113,7 @@ class RecentChange {
         * @return RecentChange
         */
        public static function newFromId( $rcid ) {
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'recentchanges', '*', array( 'rc_id' => $rcid ), __METHOD__ );
-               if( $row !== false ) {
-                       return self::newFromRow( $row );
-               } else {
-                       return null;
-               }
+               return self::newFromConds( array( 'rc_id' => $rcid ), __METHOD__ );
        }
 
        /**
@@ -126,18 +125,12 @@ class RecentChange {
         */
        public static function newFromConds( $conds, $fname = __METHOD__ ) {
                $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select(
-                       'recentchanges',
-                       '*',
-                       $conds,
-                       $fname
-               );
-               if( $res instanceof ResultWrapper && $res->numRows() > 0 ) {
-                       $row = $res->fetchObject();
-                       $res->free();
+               $row = $dbr->selectRow( 'recentchanges', '*', $conds, $fname );
+               if ( $row !== false ) {
                        return self::newFromRow( $row );
+               } else {
+                       return null;
                }
-               return null;
        }
 
        # Accessors
@@ -170,7 +163,7 @@ class RecentChange {
        }
 
        /**
-        * @return bool|\Title
+        * @return bool|Title
         */
        public function getMovedToTitle() {
                if( $this->mMovedToTitle === false ) {
@@ -180,12 +173,28 @@ class RecentChange {
                return $this->mMovedToTitle;
        }
 
+       /**
+        * Get the User object of the person who performed this change.
+        *
+        * @return User
+        */
+       public function getPerformer() {
+               if ( $this->mPerformer === false ) {
+                       if ( $this->mAttribs['rc_user'] ) {
+                               $this->mPerformer = User::newFromID( $this->mAttribs['rc_user'] );
+                       } else {
+                               $this->mPerformer = User::newFromName( $this->mAttribs['rc_user_text'], false );
+                       }
+               }
+               return $this->mPerformer;
+       }
+
        /**
         * Writes the data in this object to the database
         * @param $noudp bool
         */
        public function save( $noudp = false ) {
-               global $wgLocalInterwiki, $wgPutIPinRC, $wgContLang;
+               global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
 
                $dbw = wfGetDB( DB_MASTER );
                if( !is_array($this->mExtra) ) {
@@ -230,26 +239,19 @@ class RecentChange {
                }
 
                # E-mail notifications
-               global $wgUseEnotif, $wgShowUpdatedMarker, $wgUser;
                if( $wgUseEnotif || $wgShowUpdatedMarker ) {
-                       // Users
-                       if( $this->mAttribs['rc_user'] ) {
-                               $editor = ($wgUser->getId() == $this->mAttribs['rc_user']) ?
-                                       $wgUser : User::newFromID( $this->mAttribs['rc_user'] );
-                       // Anons
-                       } else {
-                               $editor = ($wgUser->getName() == $this->mAttribs['rc_user_text']) ?
-                                       $wgUser : User::newFromName( $this->mAttribs['rc_user_text'], false );
+                       $editor = $this->getPerformer();
+                       $title = $this->getTitle();
+
+                       if ( wfRunHooks( 'AbortEmailNotification', array($editor, $title) ) ) {
+                               # @todo FIXME: This would be better as an extension hook
+                               $enotif = new EmailNotification();
+                               $enotif->notifyOnPageChange( $editor, $title,
+                                       $this->mAttribs['rc_timestamp'],
+                                       $this->mAttribs['rc_comment'],
+                                       $this->mAttribs['rc_minor'],
+                                       $this->mAttribs['rc_last_oldid'] );
                        }
-                       $title = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
-
-                       # @todo FIXME: This would be better as an extension hook
-                       $enotif = new EmailNotification();
-                       $status = $enotif->notifyOnPageChange( $editor, $title,
-                               $this->mAttribs['rc_timestamp'],
-                               $this->mAttribs['rc_comment'],
-                               $this->mAttribs['rc_minor'],
-                               $this->mAttribs['rc_last_oldid'] );
                }
        }
 
@@ -403,6 +405,8 @@ class RecentChange {
        public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId,
                $lastTimestamp, $bot, $ip='', $oldSize=0, $newSize=0, $newId=0, $patrol=0 ) {
                $rc = new RecentChange;
+               $rc->mTitle = $title;
+               $rc->mPerformer = $user;
                $rc->mAttribs = array(
                        'rc_timestamp'  => $timestamp,
                        'rc_cur_time'   => $timestamp,
@@ -461,6 +465,8 @@ class RecentChange {
        public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot,
                $ip='', $size=0, $newId=0, $patrol=0 ) {
                $rc = new RecentChange;
+               $rc->mTitle = $title;
+               $rc->mPerformer = $user;
                $rc->mAttribs = array(
                        'rc_timestamp'      => $timestamp,
                        'rc_cur_time'       => $timestamp,
@@ -548,6 +554,8 @@ class RecentChange {
                global $wgRequest;
 
                $rc = new RecentChange;
+               $rc->mTitle = $target;
+               $rc->mPerformer = $user;
                $rc->mAttribs = array(
                        'rc_timestamp'  => $timestamp,
                        'rc_cur_time'   => $timestamp,
@@ -726,10 +734,10 @@ class RecentChange {
                } else {
                        $comment = self::cleanupForIRC( $this->mAttribs['rc_comment'] );
                        $flag = '';
-                       if ( !$this->mAttribs['rc_patrolled'] && ( $wgUseRCPatrol || $this->mAttribs['rc_new'] && $wgUseNPPatrol ) ) {
+                       if ( !$this->mAttribs['rc_patrolled'] && ( $wgUseRCPatrol || $this->mAttribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
                                $flag .= '!';
                        }
-                       $flag .= ( $this->mAttribs['rc_new'] ? "N" : "" ) . ( $this->mAttribs['rc_minor'] ? "M" : "" ) . ( $this->mAttribs['rc_bot'] ? "B" : "" );
+                       $flag .= ( $this->mAttribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $this->mAttribs['rc_minor'] ? "M" : "" ) . ( $this->mAttribs['rc_bot'] ? "B" : "" );
                }
 
                if ( $wgRC2UDPInterwikiPrefix === true && $wgLocalInterwiki !== false ) {
@@ -781,7 +789,7 @@ class RecentChange {
                        }
                } else {
                        $ip = $wgRequest->getIP();
-                       if( !$ip ) 
+                       if( !$ip )
                                $ip = '';
                }
                return $ip;
index 14bd587..9da031e 100644 (file)
@@ -23,7 +23,7 @@
 /**
  * @todo document
  */
-class Revision {
+class Revision implements IDBAccessObject {
        protected $mId;
        protected $mPage;
        protected $mUserText;
@@ -41,13 +41,14 @@ class Revision {
        protected $mTitle;
        protected $mCurrent;
 
+       // Revision deletion constants
        const DELETED_TEXT = 1;
        const DELETED_COMMENT = 2;
        const DELETED_USER = 4;
        const DELETED_RESTRICTED = 8;
-       // Convenience field
-       const SUPPRESSED_USER = 12;
-       // Audience options for Revision::getText()
+       const SUPPRESSED_USER = 12; // convenience
+
+       // Audience options for accessors
        const FOR_PUBLIC = 1;
        const FOR_THIS_USER = 2;
        const RAW = 3;
@@ -56,11 +57,16 @@ class Revision {
         * Load a page revision from a given revision ID number.
         * Returns null if no such revision can be found.
         *
+        * $flags include:
+        *      Revision::READ_LATEST  : Select the data from the master
+        *      Revision::READ_LOCKING : Select & lock the data from the master
+        *
         * @param $id Integer
+        * @param $flags Integer (optional)
         * @return Revision or null
         */
-       public static function newFromId( $id ) {
-               return Revision::newFromConds( array( 'rev_id' => intval( $id ) ) );
+       public static function newFromId( $id, $flags = 0 ) {
+               return self::newFromConds( array( 'rev_id' => intval( $id ) ), $flags );
        }
 
        /**
@@ -68,11 +74,16 @@ class Revision {
         * that's attached to a given title. If not attached
         * to that title, will return null.
         *
+        * $flags include:
+        *      Revision::READ_LATEST  : Select the data from the master
+        *      Revision::READ_LOCKING : Select & lock the data from the master
+        *
         * @param $title Title
         * @param $id Integer (optional)
+        * @param $flags Integer Bitfield (optional)
         * @return Revision or null
         */
-       public static function newFromTitle( $title, $id = 0 ) {
+       public static function newFromTitle( $title, $id = 0, $flags = null ) {
                $conds = array(
                        'page_namespace' => $title->getNamespace(),
                        'page_title'     => $title->getDBkey()
@@ -80,19 +91,13 @@ class Revision {
                if ( $id ) {
                        // Use the specified ID
                        $conds['rev_id'] = $id;
-               } elseif ( wfGetLB()->getServerCount() > 1 ) {
-                       // Get the latest revision ID from the master
-                       $dbw = wfGetDB( DB_MASTER );
-                       $latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
-                       if ( $latest === false ) {
-                               return null; // page does not exist
-                       }
-                       $conds['rev_id'] = $latest;
                } else {
                        // Use a join to get the latest revision
                        $conds[] = 'rev_id=page_latest';
+                       // Callers assume this will be up-to-date
+                       $flags = is_int( $flags ) ? $flags : self::READ_LATEST; // b/c
                }
-               return Revision::newFromConds( $conds );
+               return self::newFromConds( $conds, (int)$flags );
        }
 
        /**
@@ -100,26 +105,26 @@ class Revision {
         * that's attached to a given page ID.
         * Returns null if no such revision can be found.
         *
+        * $flags include:
+        *      Revision::READ_LATEST  : Select the data from the master
+        *      Revision::READ_LOCKING : Select & lock the data from the master
+        *
         * @param $revId Integer
         * @param $pageId Integer (optional)
+        * @param $flags Integer Bitfield (optional)
         * @return Revision or null
         */
-       public static function newFromPageId( $pageId, $revId = 0 ) {
+       public static function newFromPageId( $pageId, $revId = 0, $flags = null ) {
                $conds = array( 'page_id' => $pageId );
                if ( $revId ) {
                        $conds['rev_id'] = $revId;
-               } elseif ( wfGetLB()->getServerCount() > 1 ) {
-                       // Get the latest revision ID from the master
-                       $dbw = wfGetDB( DB_MASTER );
-                       $latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
-                       if ( $latest === false ) {
-                               return null; // page does not exist
-                       }
-                       $conds['rev_id'] = $latest;
                } else {
+                       // Use a join to get the latest revision
                        $conds[] = 'rev_id = page_latest';
+                       // Callers assume this will be up-to-date
+                       $flags = is_int( $flags ) ? $flags : self::READ_LATEST; // b/c
                }
-               return Revision::newFromConds( $conds );
+               return self::newFromConds( $conds, (int)$flags );
        }
 
        /**
@@ -175,7 +180,7 @@ class Revision {
         * @return Revision or null
         */
        public static function loadFromId( $db, $id ) {
-               return Revision::loadFromConds( $db, array( 'rev_id' => intval( $id ) ) );
+               return self::loadFromConds( $db, array( 'rev_id' => intval( $id ) ) );
        }
 
        /**
@@ -195,7 +200,7 @@ class Revision {
                } else {
                        $conds[] = 'rev_id=page_latest';
                }
-               return Revision::loadFromConds( $db, $conds );
+               return self::loadFromConds( $db, $conds );
        }
 
        /**
@@ -214,7 +219,7 @@ class Revision {
                } else {
                        $matchId = 'page_latest';
                }
-               return Revision::loadFromConds( $db,
+               return self::loadFromConds( $db,
                        array( "rev_id=$matchId",
                                   'page_namespace' => $title->getNamespace(),
                                   'page_title'     => $title->getDBkey() )
@@ -232,7 +237,7 @@ class Revision {
         * @return Revision or null
         */
        public static function loadFromTimestamp( $db, $title, $timestamp ) {
-               return Revision::loadFromConds( $db,
+               return self::loadFromConds( $db,
                        array( 'rev_timestamp'  => $db->timestamp( $timestamp ),
                                   'page_namespace' => $title->getNamespace(),
                                   'page_title'     => $title->getDBkey() )
@@ -243,14 +248,17 @@ class Revision {
         * Given a set of conditions, fetch a revision.
         *
         * @param $conditions Array
+        * @param $flags integer (optional)
         * @return Revision or null
         */
-       public static function newFromConds( $conditions ) {
-               $db = wfGetDB( DB_SLAVE );
-               $rev = Revision::loadFromConds( $db, $conditions );
-               if( is_null( $rev ) && wfGetLB()->getServerCount() > 1 ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $rev = Revision::loadFromConds( $dbw, $conditions );
+       private static function newFromConds( $conditions, $flags = 0 ) {
+               $db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : DB_SLAVE );
+               $rev = self::loadFromConds( $db, $conditions, $flags );
+               if ( is_null( $rev ) && wfGetLB()->getServerCount() > 1 ) {
+                       if ( !( $flags & self::READ_LATEST ) ) {
+                               $dbw = wfGetDB( DB_MASTER );
+                               $rev = self::loadFromConds( $dbw, $conditions, $flags );
+                       }
                }
                return $rev;
        }
@@ -261,10 +269,11 @@ class Revision {
         *
         * @param $db DatabaseBase
         * @param $conditions Array
+        * @param $flags integer (optional)
         * @return Revision or null
         */
-       private static function loadFromConds( $db, $conditions ) {
-               $res = Revision::fetchFromConds( $db, $conditions );
+       private static function loadFromConds( $db, $conditions, $flags = 0 ) {
+               $res = self::fetchFromConds( $db, $conditions, $flags );
                if( $res ) {
                        $row = $res->fetchObject();
                        if( $row ) {
@@ -285,7 +294,7 @@ class Revision {
         * @return ResultWrapper
         */
        public static function fetchRevision( $title ) {
-               return Revision::fetchFromConds(
+               return self::fetchFromConds(
                        wfGetDB( DB_SLAVE ),
                        array( 'rev_id=page_latest',
                                   'page_namespace' => $title->getNamespace(),
@@ -300,20 +309,25 @@ class Revision {
         *
         * @param $db DatabaseBase
         * @param $conditions Array
+        * @param $flags integer (optional)
         * @return ResultWrapper
         */
-       private static function fetchFromConds( $db, $conditions ) {
+       private static function fetchFromConds( $db, $conditions, $flags = 0 ) {
                $fields = array_merge(
                        self::selectFields(),
                        self::selectPageFields(),
                        self::selectUserFields()
                );
+               $options = array( 'LIMIT' => 1 );
+               if ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING ) {
+                       $options[] = 'FOR UPDATE';
+               }
                return $db->select(
                        array( 'revision', 'page', 'user' ),
                        $fields,
                        $conditions,
                        __METHOD__,
-                       array( 'LIMIT' => 1 ),
+                       $options,
                        array( 'page' => self::pageJoinCond(), 'user' => self::userJoinCond() )
                );
        }
@@ -834,7 +848,7 @@ class Revision {
                if( $this->getTitle() ) {
                        $prev = $this->getTitle()->getPreviousRevisionID( $this->getId() );
                        if( $prev ) {
-                               return Revision::newFromTitle( $this->getTitle(), $prev );
+                               return self::newFromTitle( $this->getTitle(), $prev );
                        }
                }
                return null;
@@ -849,7 +863,7 @@ class Revision {
                if( $this->getTitle() ) {
                        $next = $this->getTitle()->getNextRevisionID( $this->getId() );
                        if ( $next ) {
-                               return Revision::newFromTitle( $this->getTitle(), $next );
+                               return self::newFromTitle( $this->getTitle(), $next );
                        }
                }
                return null;
@@ -979,7 +993,7 @@ class Revision {
                                $text = gzdeflate( $text );
                                $flags[] = 'gzip';
                        } else {
-                               wfDebug( "Revision::compressRevisionText() -- no zlib support, not compressing\n" );
+                               wfDebug( __METHOD__ . " -- no zlib support, not compressing\n" );
                        }
                }
                return implode( ',', $flags );
@@ -998,7 +1012,7 @@ class Revision {
                wfProfileIn( __METHOD__ );
 
                $data = $this->mText;
-               $flags = Revision::compressRevisionText( $data );
+               $flags = self::compressRevisionText( $data );
 
                # Write to external storage if required
                if( $wgDefaultExternalStore ) {
@@ -1048,7 +1062,7 @@ class Revision {
                                        ? $this->getPreviousRevisionId( $dbw )
                                        : $this->mParentId,
                                'rev_sha1'       => is_null( $this->mSha1 )
-                                       ? Revision::base36Sha1( $this->mText )
+                                       ? self::base36Sha1( $this->mText )
                                        : $this->mSha1
                        ), __METHOD__
                );
@@ -1254,7 +1268,7 @@ class Revision {
         * @return Integer
         */
        static function countByPageId( $db, $id ) {
-               $row = $db->selectRow( 'revision', 'COUNT(*) AS revCount',
+               $row = $db->selectRow( 'revision', array( 'revCount' => 'COUNT(*)' ),
                        array( 'rev_page' => $id ), __METHOD__ );
                if( $row ) {
                        return $row->revCount;
@@ -1272,7 +1286,7 @@ class Revision {
        static function countByTitle( $db, $title ) {
                $id = $title->getArticleID();
                if( $id ) {
-                       return Revision::countByPageId( $db, $id );
+                       return self::countByPageId( $db, $id );
                }
                return 0;
        }
index fc777b5..3c5cfa8 100644 (file)
@@ -245,7 +245,7 @@ abstract class RevisionItemBase {
        abstract public function canViewContent();
 
        /**
-        * Get the HTML of the list item. Should be include <li></li> tags.
+        * Get the HTML of the list item. Should be include "<li></li>" tags.
         * This is used to show the list in HTML form, by the special page.
         */
        abstract public function getHTML();
index 8cd5a37..a0c77da 100644 (file)
@@ -692,6 +692,16 @@ class Sanitizer {
                                }
                        }
 
+                       if ( $attribute === 'align' && !in_array( $element, $cells ) ) {
+                               if ( $value === 'center' ) {
+                                       $style .= ' margin-left: auto;';
+                                       $property = 'margin-right';
+                                       $value = 'auto';
+                               } else {
+                                       $property = 'float';
+                               }
+                       }
+
                        $style .= " $property: $value;";
 
                        unset( $attribs[$attribute] );
@@ -1243,7 +1253,7 @@ class Sanitizer {
         * a. named char refs can only be &lt; &gt; &amp; &quot;, others are
         *   numericized (this way we're well-formed even without a DTD)
         * b. any numeric char refs must be legal chars, not invalid or forbidden
-        * c. use &#x, not &#X
+        * c. use lower cased "&#x", not "&#X"
         * d. fix or reject non-valid attributes
         *
         * @param $text String
@@ -1411,7 +1421,7 @@ class Sanitizer {
        /**
         * If the named entity is defined in the HTML 4.0/XHTML 1.0 DTD,
         * return the UTF-8 encoding of that character. Otherwise, returns
-        * pseudo-entity source (eg &foo;)
+        * pseudo-entity source (eg "&foo;")
         *
         * @param $name String
         * @return String
index 359b20b..d1493c3 100644 (file)
 
 /**
  * Class to expand PHP execution time for a function call.
+ * Use this when performing changes that should not be interrupted.
+ *
  * On construction, set_time_limit() is called and set to $seconds.
+ * If the client aborts the connection, PHP will continue to run.
  * When the object goes out of scope, the timer is restarted, with
  * the original time limit minus the time the object existed.
  */
 class ScopedPHPTimeout {
        protected $startTime; // float; seconds
        protected $oldTimeout; // integer; seconds
+       protected $oldIgnoreAbort; // boolean
 
        protected static $stackDepth = 0; // integer
        protected static $totalCalls = 0; // integer
@@ -50,6 +54,7 @@ class ScopedPHPTimeout {
                        } elseif ( self::$stackDepth > 0 ) { // recursion guard
                                trigger_error( "Resursive invocation of " . __CLASS__ . " attempted." );
                        } else {
+                               $this->oldIgnoreAbort = ignore_user_abort( true );
                                $this->oldTimeout = ini_set( 'max_execution_time', $seconds );
                                $this->startTime = microtime( true );
                                ++self::$stackDepth;
@@ -73,6 +78,7 @@ class ScopedPHPTimeout {
                        // take some measures to prevent this. Track total time and calls.
                        self::$totalElapsed += $elapsed;
                        --self::$stackDepth;
+                       ignore_user_abort( $this->oldIgnoreAbort );
                }
        }
 }
index 18a880e..baf7b35 100644 (file)
@@ -365,12 +365,14 @@ if ( $wgNewUserLog ) {
        $wgLogTypes[]                        = 'newusers';
        $wgLogNames['newusers']              = 'newuserlogpage';
        $wgLogHeaders['newusers']            = 'newuserlogpagetext';
-       # newusers, create, create2, autocreate
-       $wgLogActionsHandlers['newusers/*']  = 'NewUsersLogFormatter';
+       $wgLogActionsHandlers['newusers/newusers'] = 'NewUsersLogFormatter';
+       $wgLogActionsHandlers['newusers/create'] = 'NewUsersLogFormatter';
+       $wgLogActionsHandlers['newusers/create2'] = 'NewUsersLogFormatter';
+       $wgLogActionsHandlers['newusers/autocreate'] = 'NewUsersLogFormatter';
 }
 
 if ( $wgCookieSecure === 'detect' ) {
-       $wgCookieSecure = ( substr( $wgServer, 0, 6 ) === 'https:' );
+       $wgCookieSecure = ( WebRequest::detectProtocol() === 'https:' );
 }
 
 // Disable MWDebug for command line mode, this prevents MWDebug from eating up
@@ -447,7 +449,7 @@ if ( $wgCommandLineMode ) {
        # Can't stub this one, it sets up $_GET and $_REQUEST in its constructor
        $wgRequest = new WebRequest;
 
-       $debug = "\n\nStart request {$_SERVER['REQUEST_METHOD']} {$wgRequest->getRequestURL()}\n";
+       $debug = "\n\nStart request {$wgRequest->getMethod()} {$wgRequest->getRequestURL()}\n";
 
        if ( $wgDebugPrintHttpHeaders ) {
                $debug .= "HTTP HEADERS:\n";
index 6410695..6a861d8 100644 (file)
@@ -138,6 +138,7 @@ class SiteConfiguration {
 
        /**
         * Optional callback to load full configuration data.
+        * @var string|array
         */
        public $fullLoadCallback = null;
 
@@ -155,6 +156,8 @@ class SiteConfiguration {
         * argument and the wiki in the second one.
         * if suffix and lang are passed they will be used for the return value of
         * self::siteFromDB() and self::$suffixes will be ignored
+        *
+        * @var string|array
         */
        public $siteParamsCallback = null;
 
@@ -189,7 +192,7 @@ class SiteConfiguration {
                                if( array_key_exists( $wiki, $thisSetting ) ) {
                                        $retval = $thisSetting[$wiki];
                                        break;
-                               } elseif( array_key_exists( "+$wiki", $thisSetting ) && is_array( $thisSetting["+$wiki"] ) ) {
+                               } elseif ( array_key_exists( "+$wiki", $thisSetting ) && is_array( $thisSetting["+$wiki"] ) ) {
                                        $retval = $thisSetting["+$wiki"];
                                }
 
@@ -203,8 +206,9 @@ class SiteConfiguration {
                                                }
                                                break 2;
                                        } elseif( array_key_exists( "+$tag", $thisSetting ) && is_array($thisSetting["+$tag"]) ) {
-                                               if( !isset( $retval ) )
+                                               if( !isset( $retval ) ) {
                                                        $retval = array();
+                                               }
                                                $retval = self::arrayMerge( $retval, $thisSetting["+$tag"] );
                                        }
                                }
@@ -218,9 +222,10 @@ class SiteConfiguration {
                                                        $retval = $thisSetting[$suffix];
                                                }
                                                break;
-                                       } elseif( array_key_exists( "+$suffix", $thisSetting ) && is_array($thisSetting["+$suffix"]) ) {
-                                               if (!isset($retval))
+                                       } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array($thisSetting["+$suffix"]) ) {
+                                               if ( !isset( $retval ) ) {
                                                        $retval = array();
+                                               }
                                                $retval = self::arrayMerge( $retval, $thisSetting["+$suffix"] );
                                        }
                                }
@@ -287,8 +292,9 @@ class SiteConfiguration {
                        }
 
                        $value = $this->getSetting( $varname, $wiki, $params );
-                       if ( $append && is_array( $value ) && is_array( $GLOBALS[$var] ) )
+                       if ( $append && is_array( $value ) && is_array( $GLOBALS[$var] ) ) {
                                $value = self::arrayMerge( $value, $GLOBALS[$var] );
+                       }
                        if ( !is_null( $value ) ) {
                                $localSettings[$var] = $value;
                        }
@@ -408,8 +414,9 @@ class SiteConfiguration {
                }
 
                foreach( $default as $name => $def ){
-                       if( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) )
+                       if( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) ) {
                                $ret[$name] = $default[$name];
+                       }
                }
 
                return $ret;
@@ -430,18 +437,21 @@ 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;
+               }
 
                $ret['tags'] = array_unique( array_merge( $ret['tags'], $wikiTags ) );
 
                $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'];
+               }
 
                return $ret;
        }
@@ -455,8 +465,9 @@ 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'] );
+               }
 
                $site = null;
                $lang = null;
@@ -513,7 +524,7 @@ class SiteConfiguration {
        }
 
        public function loadFullData() {
-               if ($this->fullLoadCallback && !$this->fullLoadDone) {
+               if ( $this->fullLoadCallback && !$this->fullLoadDone ) {
                        call_user_func( $this->fullLoadCallback, $this );
                        $this->fullLoadDone = true;
                }
index 7f3f655..1c2c454 100644 (file)
@@ -347,8 +347,8 @@ class SiteStatsUpdate implements DeferrableUpdate {
                        array(
                                'rc_user != 0',
                                'rc_bot' => 0,
-                               "rc_log_type != 'newusers' OR rc_log_type IS NULL",
-                               "rc_timestamp >= '{$dbw->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 )}'",
+                               'rc_log_type != ' . $dbr->addQuotes( 'newusers' ) . ' OR rc_log_type IS NULL',
+                               'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 ) ),
                        ),
                        __METHOD__
                );
index 8d47b83..00eb5e8 100644 (file)
@@ -72,7 +72,7 @@ abstract class Skin extends ContextSource {
                }
                return $wgValidSkinNames;
        }
+
        /**
         * Fetch the skinname messages for available skins.
         * @return array of strings
@@ -326,7 +326,7 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Make a <script> tag containing global variables
+        * Make a "<script>" tag containing global variables
         *
         * @deprecated in 1.19
         * @param $unused
@@ -363,7 +363,7 @@ abstract class Skin extends ContextSource {
         * inside ->getOutput() is deprecated. The $out arg is kept
         * for compatibility purposes with skins.
         * @param $out OutputPage
-        * @delete
+        * @todo delete
         */
        abstract function setupSkinUserCss( OutputPage $out );
 
@@ -397,7 +397,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * This will be called by OutputPage::headElement when it is creating the
-        * <body> tag, skins can override it if they have a need to add in any
+        * "<body>" tag, skins can override it if they have a need to add in any
         * body attributes or classes of their own.
         * @param $out OutputPage
         * @param $bodyAttrs Array
@@ -437,7 +437,7 @@ abstract class Skin extends ContextSource {
                if ( !empty( $allCats['normal'] ) ) {
                        $t = $embed . implode( "{$pop}{$embed}" , $allCats['normal'] ) . $pop;
 
-                       $msg = $this->msg( 'pagecategories', count( $allCats['normal'] ) )->escaped();
+                       $msg = $this->msg( 'pagecategories' )->numParams( count( $allCats['normal'] ) )->escaped();
                        $linkPage = wfMessage( 'pagecategorieslink' )->inContentLanguage()->text();
                        $s .= '<div id="mw-normal-catlinks" class="mw-normal-catlinks">' .
                                Linker::link( Title::newFromText( $linkPage ), $msg )
@@ -455,7 +455,7 @@ abstract class Skin extends ContextSource {
                        }
 
                        $s .= "<div id=\"mw-hidden-catlinks\" class=\"mw-hidden-catlinks$class\">" .
-                               $this->msg( 'hidden-categories', count( $allCats['hidden'] ) )->escaped() .
+                               $this->msg( 'hidden-categories' )->numParams( count( $allCats['hidden'] ) )->escaped() .
                                $colon . '<ul>' . $embed . implode( "{$pop}{$embed}" , $allCats['hidden'] ) . $pop . '</ul>' .
                                '</div>';
                }
@@ -568,77 +568,13 @@ abstract class Skin extends ContextSource {
         * @return String HTML containing debug data, if enabled (otherwise empty).
         */
        protected function generateDebugHTML() {
-               global $wgShowDebug;
-
-               $html = MWDebug::getDebugHTML( $this->getContext() );
-
-               if ( $wgShowDebug ) {
-                       $listInternals = $this->formatDebugHTML( $this->getOutput()->mDebugtext );
-                       $html .= "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">" .
-                               $listInternals . "</ul>\n";
-               }
-
-               return $html;
-       }
-
-       /**
-        * @param $debugText string
-        * @return string
-        */
-       private function formatDebugHTML( $debugText ) {
-               global $wgDebugTimestamps;
-
-               $lines = explode( "\n", $debugText );
-               $curIdent = 0;
-               $ret = '<li>';
-
-               foreach ( $lines as $line ) {
-                       $pre = '';
-                       if ( $wgDebugTimestamps ) {
-                               $matches = array();
-                               if ( preg_match( '/^(\d+\.\d+ {1,3}\d+.\dM\s{2})/', $line, $matches ) ) {
-                                       $pre = $matches[1];
-                                       $line = substr( $line, strlen( $pre ) );
-                               }
-                       }
-                       $display = ltrim( $line );
-                       $ident = strlen( $line ) - strlen( $display );
-                       $diff = $ident - $curIdent;
-
-                       $display = $pre . $display;
-                       if ( $display == '' ) {
-                               $display = "\xc2\xa0";
-                       }
-
-                       if ( !$ident && $diff < 0 && substr( $display, 0, 9 ) != 'Entering ' && substr( $display, 0, 8 ) != 'Exiting ' ) {
-                               $ident = $curIdent;
-                               $diff = 0;
-                               $display = '<span style="background:yellow;">' . htmlspecialchars( $display ) . '</span>';
-                       } else {
-                               $display = htmlspecialchars( $display );
-                       }
-
-                       if ( $diff < 0 ) {
-                               $ret .= str_repeat( "</li></ul>\n", -$diff ) . "</li><li>\n";
-                       } elseif ( $diff == 0 ) {
-                               $ret .= "</li><li>\n";
-                       } else {
-                               $ret .= str_repeat( "<ul><li>\n", $diff );
-                       }
-                       $ret .= "<tt>$display</tt>\n";
-
-                       $curIdent = $ident;
-               }
-
-               $ret .= str_repeat( '</li></ul>', $curIdent ) . '</li>';
-
-               return $ret;
+               return MWDebug::getHTMLDebugLog();
        }
 
        /**
-        * This gets called shortly before the </body> tag.
+        * This gets called shortly before the "</body>" tag.
         *
-        * @return String HTML-wrapped JS code to be put before </body>
+        * @return String HTML-wrapped JS code to be put before "</body>"
         */
        function bottomScripts() {
                // TODO and the suckage continues. This function is really just a wrapper around
@@ -899,7 +835,7 @@ abstract class Skin extends ContextSource {
         */
        function logoText( $align = '' ) {
                if ( $align != '' ) {
-                       $a = " align='{$align}'";
+                       $a = " style='float: {$align};'";
                } else {
                        $a = '';
                }
@@ -1067,13 +1003,23 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @param $name string
-        * @param $urlaction string
+        * Make a URL for a Special Page using the given query and protocol.
+        *
+        * If $proto is set to null, make a local URL. Otherwise, make a full
+        * URL with the protocol specified.
+        *
+        * @param $name string Name of the Special page
+        * @param $urlaction string Query to append
+        * @param $proto Protocol to use or null for a local URL
         * @return String
         */
-       static function makeSpecialUrl( $name, $urlaction = '' ) {
+       static function makeSpecialUrl( $name, $urlaction = '', $proto = null ) {
                $title = SpecialPage::getSafeTitleFor( $name );
-               return $title->getLocalURL( $urlaction );
+               if( is_null( $proto ) ) {
+                       return $title->getLocalURL( $urlaction );
+               } else {
+                       return $title->getFullURL( $urlaction, false, $proto );
+               }
        }
 
        /**
@@ -1093,7 +1039,7 @@ abstract class Skin extends ContextSource {
         * @return String
         */
        static function makeI18nUrl( $name, $urlaction = '' ) {
-               $title = Title::newFromText( wfMsgForContent( $name ) );
+               $title = Title::newFromText( wfMessage( $name )->inContentLanguage()->text() );
                self::checkTitle( $title, $name );
                return $title->getLocalURL( $urlaction );
        }
@@ -1225,7 +1171,7 @@ abstract class Skin extends ContextSource {
         * @param $message String
         */
        function addToSidebar( &$bar, $message ) {
-               $this->addToSidebarPlain( $bar, wfMsgForContentNoTrans( $message ) );
+               $this->addToSidebarPlain( $bar, wfMessage( $message )->inContentLanguage()->plain() );
        }
 
        /**
@@ -1342,29 +1288,59 @@ abstract class Skin extends ContextSource {
                $ntl = '';
 
                if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
-                       $userTitle = $this->getUser()->getUserPage();
-                       $userTalkTitle = $userTitle->getTalkPage();
-
-                       if ( !$userTalkTitle->equals( $out->getTitle() ) ) {
+                       $uTalkTitle = $this->getUser()->getTalkPage();
+
+                       if ( !$uTalkTitle->equals( $out->getTitle() ) ) {
+                               $lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null;
+                               $nofAuthors = 0;
+                               if ( $lastSeenRev !== null ) {
+                                       $plural = true; // Default if we have a last seen revision: if unknown, use plural
+                                       $latestRev = Revision::newFromTitle( $uTalkTitle, false, Revision::READ_NORMAL );
+                                       if ( $latestRev !== null ) {
+                                               // Singular if only 1 unseen revision, plural if several unseen revisions.
+                                               $plural = $latestRev->getParentId() !== $lastSeenRev->getId();
+                                               $nofAuthors = $uTalkTitle->countAuthorsBetween(
+                                                       $lastSeenRev, $latestRev, 10, 'include_new' );
+                                       }
+                               } else {
+                                       // Singular if no revision -> diff link will show latest change only in any case
+                                       $plural = false;
+                               }
+                               $plural = $plural ? 2 : 1;
+                               // 2 signifies "more than one revision". We don't know how many, and even if we did,
+                               // the number of revisions or authors is not necessarily the same as the number of
+                               // "messages".
                                $newMessagesLink = Linker::linkKnown(
-                                       $userTalkTitle,
-                                       $this->msg( 'newmessageslink' )->escaped(),
+                                       $uTalkTitle,
+                                       $this->msg( 'newmessageslinkplural' )->params( $plural )->escaped(),
                                        array(),
                                        array( 'redirect' => 'no' )
                                );
 
                                $newMessagesDiffLink = Linker::linkKnown(
-                                       $userTalkTitle,
-                                       $this->msg( 'newmessagesdifflink' )->escaped(),
+                                       $uTalkTitle,
+                                       $this->msg( 'newmessagesdifflinkplural' )->params( $plural )->escaped(),
                                        array(),
-                                       array( 'diff' => 'cur' )
+                                       $lastSeenRev !== null
+                                               ? array( 'oldid' => $lastSeenRev->getId(), 'diff' => 'cur' )
+                                               : array( 'diff' => 'cur' )
                                );
 
-                               $ntl = $this->msg(
-                                       'youhavenewmessages',
-                                       $newMessagesLink,
-                                       $newMessagesDiffLink
-                               )->text();
+                               if ( $nofAuthors >= 1 && $nofAuthors <= 10 ) {
+                                       $ntl = $this->msg(
+                                               'youhavenewmessagesfromusers',
+                                               $newMessagesLink,
+                                               $newMessagesDiffLink
+                                       )->numParams( $nofAuthors );
+                               } else {
+                                       // $nofAuthors === 11 signifies "11 or more" ("more than 10")
+                                       $ntl = $this->msg(
+                                               $nofAuthors > 10 ? 'youhavenewmessagesmanyusers' : 'youhavenewmessages',
+                                               $newMessagesLink,
+                                               $newMessagesDiffLink
+                                       );
+                               }
+                               $ntl = $ntl->text();
                                # Disable Squid cache
                                $out->setSquidMaxage( 0 );
                        }
@@ -1508,13 +1484,17 @@ abstract class Skin extends ContextSource {
        public function doEditSectionLink( Title $nt, $section, $tooltip = null, $lang = false ) {
                // HTML generated here should probably have userlangattributes
                // added to it for LTR text on RTL pages
+
+               $lang = wfGetLangObj( $lang );
+
                $attribs = array();
                if ( !is_null( $tooltip ) ) {
                        # Bug 25462: undo double-escaping.
                        $tooltip = Sanitizer::decodeCharReferences( $tooltip );
-                       $attribs['title'] = wfMsgExt( 'editsectionhint', array( 'language' => $lang, 'parsemag', 'replaceafter' ), $tooltip );
+                       $attribs['title'] = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
+                               ->inLanguage( $lang )->text();
                }
-               $link = Linker::link( $nt, wfMsgExt( 'editsection', array( 'language' => $lang ) ),
+               $link = Linker::link( $nt, wfMessage( 'editsection' )->inLanguage( $lang )->text(),
                        $attribs,
                        array( 'action' => 'edit', 'section' => $section ),
                        array( 'noclasses', 'known' )
@@ -1524,7 +1504,8 @@ abstract class Skin extends ContextSource {
                # we can rid of it someday.
                $attribs = '';
                if ( $tooltip ) {
-                       $attribs = wfMsgExt( 'editsectionhint', array( 'language' => $lang, 'parsemag', 'escape', 'replaceafter' ), $tooltip );
+                       $attribs = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
+                               ->inLanguage( $lang )->escaped();
                        $attribs = " title=\"$attribs\"";
                }
                $result = null;
@@ -1534,13 +1515,15 @@ abstract class Skin extends ContextSource {
                        # run, and even add them to hook-provided text.  (This is the main
                        # reason that the EditSectionLink hook is deprecated in favor of
                        # DoEditSectionLink: it can't change the brackets or the span.)
-                       $result = wfMsgExt( 'editsection-brackets', array( 'escape', 'replaceafter', 'language' => $lang ), $result );
+                       $result = wfMessage( 'editsection-brackets' )->rawParams( $result )
+                               ->inLanguage( $lang )->escaped();
                        return "<span class=\"editsection\">$result</span>";
                }
 
                # Add the brackets and the span, and *then* run the nice new hook, with
                # clean and non-redundant arguments.
-               $result = wfMsgExt( 'editsection-brackets', array( 'escape', 'replaceafter', 'language' => $lang ), $link );
+               $result = wfMessage( 'editsection-brackets' )->rawParams( $link )
+                       ->inLanguage( $lang )->escaped();
                $result = "<span class=\"editsection\">$result</span>";
 
                wfRunHooks( 'DoEditSectionLink', array( $this, $nt, $section, $tooltip, &$result, $lang ) );
index e1ec897..1ae1cb3 100644 (file)
@@ -95,7 +95,7 @@ class LegacyTemplate extends BaseTemplate {
        }
 
        /**
-        * This will be called immediately after the <body> tag.  Split into
+        * This will be called immediately after the "<body>" tag.  Split into
         * two functions to make it easier to subclass.
         * @return string
         */
@@ -123,18 +123,18 @@ class LegacyTemplate extends BaseTemplate {
                  "<table border='0' cellspacing='0' width='100%'>\n<tr>\n";
 
                if ( $this->getSkin()->qbSetting() == 0 ) {
-                       $s .= "<td class='top' align='left' valign='top' rowspan='{$rows}'>\n" .
+                       $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} align='$l' valign='top'>\n";
+               $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} valign='top' align='$r' nowrap='nowrap'>";
+               $s .= "</td>\n<td {$borderhack} style='text-align: $r; vertical-align: top;' nowrap='nowrap'>";
                $s .= $this->nameAndLogin();
                $s .= "\n<br />" . $this->searchForm() . '</td>';
 
@@ -159,8 +159,8 @@ class LegacyTemplate extends BaseTemplate {
        }
 
        /**
-        * This gets called shortly before the </body> tag.
-        * @return String HTML to be put before </body>
+        * This gets called shortly before the "</body>" tag.
+        * @return String HTML to be put before "</body>"
         */
        function afterContent() {
                return $this->doAfterContent();
@@ -182,12 +182,12 @@ class LegacyTemplate extends BaseTemplate {
                  . $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="' . wfMsg( 'searcharticle' ) . '" />';
+                 . '<input type="submit" name="go" value="' . wfMessage( 'searcharticle' )->text() . '" />';
 
                if ( $wgUseTwoButtonsSearchForm ) {
-                       $s .= '&#160;<input type="submit" name="fulltext" value="' . wfMsg( 'searchbutton' ) . "\" />\n";
+                       $s .= '&#160;<input type="submit" name="fulltext" value="' . wfMessage( 'searchbutton' )->text() . "\" />\n";
                } else {
-                       $s .= ' <a href="' . $this->getSkin()->escapeSearchLink() . '" rel="search">' . wfMsg( 'powersearch-legend' ) . "</a>\n";
+                       $s .= ' <a href="' . $this->getSkin()->escapeSearchLink() . '" rel="search">' . wfMessage( 'powersearch-legend' )->text() . "</a>\n";
                }
 
                $s .= '</form>';
@@ -236,7 +236,7 @@ class LegacyTemplate extends BaseTemplate {
                }
 
                // @todo FIXME: Is using Language::pipeList impossible here? Do not quite understand the use of the newline
-               return implode( $s, wfMsgExt( 'pipe-separator', 'escapenoentities' ) . "\n" );
+               return implode( $s, wfMessage( 'pipe-separator' )->escaped() . "\n" );
        }
 
        /**
@@ -292,7 +292,7 @@ class LegacyTemplate extends BaseTemplate {
                if ( count( $s ) ) {
                        global $wgLang;
 
-                       $out = wfMsgExt( 'pipe-separator' , 'escapenoentities' );
+                       $out = wfMessage( 'pipe-separator' )->escaped();
                        $out .= $wgLang->pipeList( $s );
                }
 
@@ -301,7 +301,7 @@ class LegacyTemplate extends BaseTemplate {
 
        function bottomLinks() {
                global $wgOut, $wgUser;
-               $sep = wfMsgExt( 'pipe-separator', 'escapenoentities' ) . "\n";
+               $sep = wfMessage( 'pipe-separator' )->escaped() . "\n";
 
                $s = '';
                if ( $wgOut->isArticleRelated() ) {
@@ -373,7 +373,7 @@ class LegacyTemplate extends BaseTemplate {
                        return '';
                }
 
-               $s = wfMsg( 'otherlanguages' ) . wfMsg( 'colon-separator' );
+               $s = wfMessage( 'otherlanguages' )->text() . wfMessage( 'colon-separator' )->text();
                $first = true;
 
                if ( $wgLang->isRTL() ) {
@@ -382,7 +382,7 @@ class LegacyTemplate extends BaseTemplate {
 
                foreach ( $a as $l ) {
                        if ( !$first ) {
-                               $s .= wfMsgExt( 'pipe-separator', 'escapenoentities' );
+                               $s .= wfMessage( 'pipe-separator' )->escaped();
                        }
 
                        $first = false;
@@ -417,8 +417,9 @@ class LegacyTemplate extends BaseTemplate {
                                $obj->getTitle()->getPrefixedDBkey() );
                }
 
-               return Html::rawElement( 'form', array( 'id' => 'specialpages', 'method' => 'get',
-                       'action' => $wgScript ), $select->getHTML() . Xml::submitButton( wfMsg( 'go' ) ) );
+               return Html::rawElement( 'form',
+                       array( 'id' => 'specialpages', 'method' => 'get', 'action' => $wgScript ),
+                       $select->getHTML() . Xml::submitButton( wfMessage( 'go' )->text() ) );
        }
 
        function pageTitleLinks() {
@@ -446,21 +447,21 @@ class LegacyTemplate extends BaseTemplate {
 
                if ( $wgOut->isArticleRelated() ) {
                        if ( $title->getNamespace() == NS_FILE ) {
-                               $name = $title->getDBkey();
                                $image = wfFindFile( $title );
 
                                if ( $image ) {
-                                       $link = htmlspecialchars( $image->getURL() );
-                                       $style = Linker::getInternalLinkAttributes( $link, $name );
-                                       $s[] = "<a href=\"{$link}\"{$style}>{$name}</a>";
+                                       $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,
-                                       wfMsg( 'currentrev' )
+                               $title,
+                               wfMessage( 'currentrev' )->text()
                        );
                }
 
@@ -470,18 +471,18 @@ class LegacyTemplate extends BaseTemplate {
                        if ( !$title->equals( $wgUser->getTalkPage() ) ) {
                                $tl = Linker::linkKnown(
                                        $wgUser->getTalkPage(),
-                                       wfMsgHtml( 'newmessageslink' ),
+                                       wfMessage( 'newmessageslink' )->escaped(),
                                        array(),
                                        array( 'redirect' => 'no' )
                                );
 
                                $dl = Linker::linkKnown(
                                        $wgUser->getTalkPage(),
-                                       wfMsgHtml( 'newmessagesdifflink' ),
+                                       wfMessage( 'newmessagesdifflink' )->escaped(),
                                        array(),
                                        array( 'diff' => 'cur' )
                                );
-                               $s[] = '<strong>' . wfMsg( 'youhavenewmessages', $tl, $dl ) . '</strong>';
+                               $s[] = '<strong>' . wfMessage( 'youhavenewmessages', $tl, $dl )->text() . '</strong>';
                                # disable caching
                                $wgOut->setSquidMaxage( 0 );
                                $wgOut->enableClientCache( false );
@@ -514,7 +515,7 @@ class LegacyTemplate extends BaseTemplate {
 
                if ( $sub == '' ) {
                        global $wgExtraSubtitle;
-                       $sub = wfMsgExt( 'tagline', 'parsemag' ) . $wgExtraSubtitle;
+                       $sub = wfMessage( 'tagline' )->parse() . $wgExtraSubtitle;
                }
 
                $subpages = $this->getSkin()->subPageSubtitle();
@@ -532,14 +533,15 @@ class LegacyTemplate extends BaseTemplate {
                if ( !$wgOut->isPrintable() ) {
                        $printurl = htmlspecialchars( $this->getSkin()->getTitle()->getLocalUrl(
                                $wgRequest->appendQueryValue( 'printable', 'yes', true ) ) );
-                       $s[] = "<a href=\"$printurl\" rel=\"alternate\">" . wfMsg( 'printableversion' ) . '</a>';
+                       $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\">" . wfMsgHtml( "feed-$format" ) . "</a>";
+                                               . " class=\"feedlink\">" . wfMessage( "feed-$format" )->escaped() . "</a>";
                        }
                }
                return $wgLang->pipeList( $s );
@@ -558,15 +560,15 @@ class LegacyTemplate extends BaseTemplate {
                global $wgOut;
 
                if ( !$wgOut->isArticleRelated() ) {
-                       $s = wfMsg( 'protectedpage' );
+                       $s = wfMessage( 'protectedpage' )->text();
                } else {
                        $title = $this->getSkin()->getTitle();
                        if ( $title->quickUserCan( 'edit' ) && $title->exists() ) {
-                               $t = wfMsg( 'editthispage' );
+                               $t = wfMessage( 'editthispage' )->text();
                        } elseif ( $title->quickUserCan( 'create' ) && !$title->exists() ) {
-                               $t = wfMsg( 'create-this-page' );
+                               $t = wfMessage( 'create-this-page' )->text();
                        } else {
-                               $t = wfMsg( 'viewsource' );
+                               $t = wfMessage( 'viewsource' )->text();
                        }
 
                        $s = Linker::linkKnown(
@@ -587,7 +589,7 @@ class LegacyTemplate extends BaseTemplate {
                $title = $this->getSkin()->getTitle();
 
                if ( $title->getArticleID() && ( !$diff ) && $wgUser->isAllowed( 'delete' ) ) {
-                       $t = wfMsg( 'deletethispage' );
+                       $t = wfMessage( 'deletethispage' )->text();
 
                        $s = Linker::linkKnown(
                                $title,
@@ -610,10 +612,10 @@ class LegacyTemplate extends BaseTemplate {
 
                if ( $title->getArticleID() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) ) {
                        if ( $title->isProtected() ) {
-                               $text = wfMsg( 'unprotectthispage' );
+                               $text = wfMessage( 'unprotectthispage' )->text();
                                $query = array( 'action' => 'unprotect' );
                        } else {
-                               $text = wfMsg( 'protectthispage' );
+                               $text = wfMessage( 'protectthispage' )->text();
                                $query = array( 'action' => 'protect' );
                        }
 
@@ -638,15 +640,15 @@ class LegacyTemplate extends BaseTemplate {
                $title = $this->getSkin()->getTitle();
 
                if ( $wgOut->isArticleRelated() ) {
-                       if ( $title->userIsWatching() ) {
-                               $text = wfMsg( 'unwatchthispage' );
+                       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 = wfMsg( 'watchthispage' );
+                               $text = wfMessage( 'watchthispage' )->text();
                                $query = array(
                                        'action' => 'watch',
                                        'token' => WatchAction::getWatchToken( $title, $wgUser ),
@@ -661,7 +663,7 @@ class LegacyTemplate extends BaseTemplate {
                                $query
                        );
                } else {
-                       $s = wfMsg( 'notanarticle' );
+                       $s = wfMessage( 'notanarticle' )->text();
                }
 
                return $s;
@@ -671,7 +673,7 @@ class LegacyTemplate extends BaseTemplate {
                if ( $this->getSkin()->getTitle()->quickUserCan( 'move' ) ) {
                        return Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Movepage' ),
-                               wfMsg( 'movethispage' ),
+                               wfMessage( 'movethispage' )->text(),
                                array(),
                                array( 'target' => $this->getSkin()->getTitle()->getPrefixedDBkey() )
                        );
@@ -684,7 +686,7 @@ class LegacyTemplate extends BaseTemplate {
        function historyLink() {
                return Linker::link(
                        $this->getSkin()->getTitle(),
-                       wfMsgHtml( 'history' ),
+                       wfMessage( 'history' )->escaped(),
                        array( 'rel' => 'archives' ),
                        array( 'action' => 'history' )
                );
@@ -693,21 +695,21 @@ class LegacyTemplate extends BaseTemplate {
        function whatLinksHere() {
                return Linker::linkKnown(
                        SpecialPage::getTitleFor( 'Whatlinkshere', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
-                       wfMsgHtml( 'whatlinkshere' )
+                       wfMessage( 'whatlinkshere' )->escaped()
                );
        }
 
        function userContribsLink() {
                return Linker::linkKnown(
                        SpecialPage::getTitleFor( 'Contributions', $this->getSkin()->getTitle()->getDBkey() ),
-                       wfMsgHtml( 'contributions' )
+                       wfMessage( 'contributions' )->escaped()
                );
        }
 
        function emailUserLink() {
                return Linker::linkKnown(
                        SpecialPage::getTitleFor( 'Emailuser', $this->getSkin()->getTitle()->getDBkey() ),
-                       wfMsgHtml( 'emailuser' )
+                       wfMessage( 'emailuser' )->escaped()
                );
        }
 
@@ -719,7 +721,7 @@ class LegacyTemplate extends BaseTemplate {
                } else {
                        return Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Recentchangeslinked', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
-                               wfMsgHtml( 'recentchangeslinked-toolbox' )
+                               wfMessage( 'recentchangeslinked-toolbox' )->escaped()
                        );
                }
        }
@@ -737,41 +739,41 @@ class LegacyTemplate extends BaseTemplate {
                        $link = $title->getSubjectPage();
                        switch( $link->getNamespace() ) {
                                case NS_MAIN:
-                                       $text = wfMsg( 'articlepage' );
+                                       $text = wfMessage( 'articlepage' );
                                        break;
                                case NS_USER:
-                                       $text = wfMsg( 'userpage' );
+                                       $text = wfMessage( 'userpage' );
                                        break;
                                case NS_PROJECT:
-                                       $text = wfMsg( 'projectpage' );
+                                       $text = wfMessage( 'projectpage' );
                                        break;
                                case NS_FILE:
-                                       $text = wfMsg( 'imagepage' );
+                                       $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 = wfMsg( 'mediawikipage' );
+                                       $text = wfMessage( 'mediawikipage' );
                                        break;
                                case NS_TEMPLATE:
-                                       $text = wfMsg( 'templatepage' );
+                                       $text = wfMessage( 'templatepage' );
                                        break;
                                case NS_HELP:
-                                       $text = wfMsg( 'viewhelppage' );
+                                       $text = wfMessage( 'viewhelppage' );
                                        break;
                                case NS_CATEGORY:
-                                       $text = wfMsg( 'categorypage' );
+                                       $text = wfMessage( 'categorypage' );
                                        break;
                                default:
-                                       $text = wfMsg( 'articlepage' );
+                                       $text = wfMessage( 'articlepage' );
                        }
                } else {
                        $link = $title->getTalkPage();
-                       $text = wfMsg( 'talkpage' );
+                       $text = wfMessage( 'talkpage' );
                }
 
-               $s = Linker::link( $link, $text, array(), array(), $linkOptions );
+               $s = Linker::link( $link, $text->text(), array(), array(), $linkOptions );
 
                return $s;
        }
@@ -793,7 +795,7 @@ class LegacyTemplate extends BaseTemplate {
 
                return Linker::linkKnown(
                        $title,
-                       wfMsg( 'postcomment' ),
+                       wfMessage( 'postcomment' )->text(),
                        array(),
                        array(
                                'action' => 'edit',
@@ -807,11 +809,13 @@ class LegacyTemplate extends BaseTemplate {
 
                if ( $wgUploadNavigationUrl ) {
                        # Using an empty class attribute to avoid automatic setting of "external" class
-                       return Linker::makeExternalLink( $wgUploadNavigationUrl, wfMsgHtml( 'upload' ), false, null, array( 'class' => '' ) );
+                       return Linker::makeExternalLink( $wgUploadNavigationUrl,
+                               wfMessage( 'upload' )->escaped(),
+                               false, null, array( 'class' => '' ) );
                } else {
                        return Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Upload' ),
-                               wfMsgHtml( 'upload' )
+                               wfMessage( 'upload' )->escaped()
                        );
                }
        }
@@ -832,7 +836,7 @@ class LegacyTemplate extends BaseTemplate {
 
                                $ret .= "$name $talkLink";
                        } else {
-                               $ret .= wfMsg( 'notloggedin' );
+                               $ret .= wfMessage( 'notloggedin' )->text();
                        }
 
                        $query = array();
@@ -846,7 +850,7 @@ class LegacyTemplate extends BaseTemplate {
                                : 'login';
                        $ret .= "\n<br />" . Linker::link(
                                SpecialPage::getTitleFor( 'Userlogin' ),
-                               wfMsg( $loginlink ), array(), $query
+                               wfMessage( $loginlink )->text(), array(), $query
                        );
                } else {
                        $talkLink = Linker::link( $wgUser->getTalkPage(),
@@ -858,7 +862,7 @@ class LegacyTemplate extends BaseTemplate {
                        $ret .= " $talkLink<br />";
                        $ret .= $wgLang->pipeList( array(
                                Linker::link(
-                                       SpecialPage::getTitleFor( 'Userlogout' ), wfMsg( 'logout' ),
+                                       SpecialPage::getTitleFor( 'Userlogout' ), wfMessage( 'logout' )->text(),
                                        array(), array( 'returnto' => $returnTo->getPrefixedDBkey() )
                                ),
                                Linker::specialLink( 'Preferences' ),
@@ -868,8 +872,8 @@ class LegacyTemplate extends BaseTemplate {
                $ret = $wgLang->pipeList( array(
                        $ret,
                        Linker::link(
-                               Title::newFromText( wfMsgForContent( 'helppage' ) ),
-                               wfMsg( 'help' )
+                               Title::newFromText( wfMessage( 'helppage' )->inContentLanguage()->text() ),
+                               wfMessage( 'help' )->text()
                        ),
                ) );
 
index 8306304..d3502e9 100644 (file)
@@ -40,7 +40,7 @@ class MediaWiki_I18N {
                // Hack for i18n:attributes in PHPTAL 1.0.0 dev version as of 2004-10-23
                $value = preg_replace( '/^string:/', '', $value );
 
-               $value = wfMsg( $value );
+               $value = wfMessage( $value )->text();
                // interpolate variables
                $m = array();
                while( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
@@ -91,7 +91,7 @@ class SkinTemplate extends Skin {
        var $template = 'QuickTemplate';
 
        /**
-        * Whether this skin use OutputPage::headElement() to generate the <head>
+        * Whether this skin use OutputPage::headElement() to generate the "<head>"
         * tag
         */
        var $useHeadElement = false;
@@ -135,7 +135,6 @@ class SkinTemplate extends Skin {
                global $wgDisableCounters, $wgSitename, $wgLogo, $wgHideInterlanguageLinks;
                global $wgMaxCredits, $wgShowCreditsIfMax;
                global $wgPageShowWatchingUsers;
-               global $wgDebugComments;
                global $wgArticlePath, $wgScriptPath, $wgServer;
 
                wfProfileIn( __METHOD__ );
@@ -258,7 +257,7 @@ class SkinTemplate extends Skin {
                /* XXX currently unused, might get useful later
                $tpl->set( 'editable', ( !$title->isSpecialPage() ) );
                $tpl->set( 'exists', $title->getArticleID() != 0 );
-               $tpl->set( 'watch', $title->userIsWatching() ? 'unwatch' : 'watch' );
+               $tpl->set( 'watch', $user->isWatched( $title ) ? 'unwatch' : 'watch' );
                $tpl->set( 'protect', count( $title->isProtected() ) ? 'unprotect' : 'protect' );
                $tpl->set( 'helppage', $this->msg( 'helppage' )->text() );
                */
@@ -387,12 +386,6 @@ class SkinTemplate extends Skin {
                        }
                }
 
-               if ( $wgDebugComments ) {
-                       $tpl->setRef( 'debug', $out->mDebugtext );
-               } else {
-                       $tpl->set( 'debug', '' );
-               }
-
                $tpl->set( 'sitenotice', $this->getSiteNotice() );
                $tpl->set( 'bottomscripts', $this->bottomScripts() );
                $tpl->set( 'printfooter', $this->printSource() );
@@ -426,10 +419,15 @@ class SkinTemplate extends Skin {
                                unset( $tmp );
                                $nt = Title::newFromText( $l );
                                if ( $nt ) {
+                                       $ilLangName = Language::fetchLanguageName( $nt->getInterwiki() );
+                                       if ( strval( $ilLangName ) === '' ) {
+                                               $ilLangName = $l;
+                                       } else {
+                                               $ilLangName = $this->getLanguage()->ucfirst( $ilLangName );
+                                       }
                                        $language_urls[] = array(
                                                'href' => $nt->getFullURL(),
-                                               'text' => ( Language::fetchLanguageName( $nt->getInterwiki() ) != '' ?
-                                                                       Language::fetchLanguageName( $nt->getInterwiki() ) : $l ),
+                                               'text' => $ilLangName,
                                                'title' => $nt->getText(),
                                                'class' => $class,
                                                'lang' => $nt->getInterwiki(),
@@ -463,6 +461,7 @@ class SkinTemplate extends Skin {
                        $tpl->set( 'headscripts', $out->getHeadScripts() . $out->getHeadItems() );
                }
 
+               $tpl->set( 'debug', '' );
                $tpl->set( 'debughtml', $this->generateDebugHTML() );
                $tpl->set( 'reporttime', wfReportTime() );
 
@@ -558,7 +557,8 @@ class SkinTemplate extends Skin {
                                'text' => $this->username,
                                'href' => &$this->userpageUrlDetails['href'],
                                'class' => $this->userpageUrlDetails['exists'] ? false : 'new',
-                               'active' => ( $this->userpageUrlDetails['href'] == $pageurl )
+                               'active' => ( $this->userpageUrlDetails['href'] == $pageurl ),
+                               'dir' => 'auto'
                        );
                        $usertalkUrlDetails = $this->makeTalkUrlDetails( $this->userpage );
                        $personal_urls['mytalk'] = array(
@@ -620,37 +620,22 @@ class SkinTemplate extends Skin {
                        $is_signup = $request->getText( 'type' ) == 'signup';
 
                        # anonlogin & login are the same
+                       global $wgSecureLogin;
+                       $proto = $wgSecureLogin ? PROTO_HTTPS : null;
+
+                       $login_id = $this->showIPinHeader() ? 'anonlogin' : 'login';
                        $login_url = array(
                                'text' => $this->msg( $loginlink )->text(),
-                               'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
-                               'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == 'nav-login-createaccount' || !$is_signup )
+                               'href' => self::makeSpecialUrl( 'Userlogin', $returnto, $proto ),
+                               'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
+                               'class' => $wgSecureLogin ? 'link-https' : ''
+                       );
+                       $createaccount_url = array(
+                               'text' => $this->msg( 'createaccount' )->text(),
+                               'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup", $proto ),
+                               'active' => $title->isSpecial( 'Userlogin' ) && $is_signup,
+                               'class' => $wgSecureLogin ? 'link-https' : ''
                        );
-                       if ( $this->getUser()->isAllowed( 'createaccount' ) && !$useCombinedLoginLink ) {
-                               $createaccount_url = array(
-                                       'text' => $this->msg( 'createaccount' )->text(),
-                                       'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ),
-                                       'active' => $title->isSpecial( 'Userlogin' ) && $is_signup
-                               );
-                       }
-                       global $wgServer, $wgSecureLogin;
-                       if( substr( $wgServer, 0, 5 ) === 'http:' && $wgSecureLogin ) {
-                               $title = SpecialPage::getTitleFor( 'Userlogin' );
-                               $https_url = preg_replace( '/^http:/', 'https:', $title->getFullURL() );
-                               $login_url['href']  = $https_url;
-                               # @todo FIXME: Class depends on skin
-                               $login_url['class'] = 'link-https';
-                               if ( isset( $createaccount_url ) ) {
-                                       $https_url = preg_replace( '/^http:/', 'https:',
-                                               $title->getFullURL( 'type=signup' ) );
-                                       $createaccount_url['href']  = $https_url;
-                                       # @todo FIXME: Class depends on skin
-                                       $createaccount_url['class'] = 'link-https';
-                               }
-                       }
-
-                       if ( isset( $createaccount_url ) ) {
-                               $personal_urls['createaccount'] = $createaccount_url;
-                       }
 
                        if( $this->showIPinHeader() ) {
                                $href = &$this->userpageUrlDetails['href'];
@@ -668,10 +653,13 @@ class SkinTemplate extends Skin {
                                        'class' => $usertalkUrlDetails['exists'] ? false : 'new',
                                        'active' => ( $pageurl == $href )
                                );
-                               $personal_urls['anonlogin'] = $login_url;
-                       } else {
-                               $personal_urls['login'] = $login_url;
                        }
+
+                       if ( $this->getUser()->isAllowed( 'createaccount' ) && !$useCombinedLoginLink ) {
+                               $personal_urls['createaccount'] = $createaccount_url;
+                       }
+
+                       $personal_urls[$login_id] = $login_url;
                }
 
                wfRunHooks( 'PersonalUrls', array( &$personal_urls, &$title ) );
@@ -969,7 +957,7 @@ class SkinTemplate extends Skin {
                                         * a change to that procedure these messages will have to remain as
                                         * the global versions.
                                         */
-                                       $mode = $title->userIsWatching() ? 'unwatch' : 'watch';
+                                       $mode = $user->isWatched( $title ) ? 'unwatch' : 'watch';
                                        $token = WatchAction::getWatchToken( $title, $user, $mode );
                                        $content_navigation['actions'][$mode] = array(
                                                'class' => $onPage && ( $action == 'watch' || $action == 'unwatch' ) ? 'selected' : false,
@@ -1415,6 +1403,7 @@ abstract class BaseTemplate extends QuickTemplate {
                }
                if ( isset( $this->data['nav_urls']['print'] ) && $this->data['nav_urls']['print'] ) {
                        $toolbox['print'] = $this->data['nav_urls']['print'];
+                       $toolbox['print']['id'] = 't-print';
                        $toolbox['print']['rel'] = 'alternate';
                        $toolbox['print']['msg'] = 'printableversion';
                }
@@ -1600,26 +1589,39 @@ abstract class BaseTemplate extends QuickTemplate {
         * Makes a link, usually used by makeListItem to generate a link for an item
         * in a list used in navigation lists, portlets, portals, sidebars, etc...
         *
-        * $key is a string, usually a key from the list you are generating this link from
-        * $item is an array containing some of a specific set of keys.
-        * The text of the link will be generated either from the contents of the "text"
-        * key in the $item array, if a "msg" key is present a message by that name will
-        * be used, and if neither of those are set the $key will be used as a message name.
+        * @param $key string usually a key from the list you are generating this
+        * link from.
+        * @param $item array contains some of a specific set of keys.
+        *
+        * The text of the link will be generated either from the contents of the
+        * "text" key in the $item array, if a "msg" key is present a message by
+        * that name will be used, and if neither of those are set the $key will be
+        * used as a message name.
+        *
         * If a "href" key is not present makeLink will just output htmlescaped text.
-        * The href, id, class, rel, and type keys are used as attributes for the link if present.
-        * If an "id" or "single-id" (if you don't want the actual id to be output on the link)
-        * is present it will be used to generate a tooltip and accesskey for the link.
+        * The "href", "id", "class", "rel", and "type" keys are used as attributes
+        * for the link if present.
+        *
+        * If an "id" or "single-id" (if you don't want the actual id to be output
+        * on the link) is present it will be used to generate a tooltip and
+        * accesskey for the link.
+        *
         * If you don't want an accesskey, set $item['tooltiponly'] = true;
-        * $options can be used to affect the output of a link:
-        *   You can use a text-wrapper key to specify a list of elements to wrap the
-        *     text of a link in. This should be an array of arrays containing a 'tag' and
-        *     optionally an 'attributes' key. If you only have one element you don't need
-        *     to wrap it in another array. eg: To use <a><span>...</span></a> in all links
-        *     use array( 'text-wrapper' => array( 'tag' => 'span' ) ) for your options.
-        *   A link-class key can be used to specify additional classes to apply to all links.
-        *   A link-fallback can be used to specify a tag to use instead of <a> if there is
-        *   no link. eg: If you specify 'link-fallback' => 'span' than any non-link will
-        *   output a <span> instead of just text.
+        *
+        * @param $options array can be used to affect the output of a link.
+        * Possible options are:
+        *   - 'text-wrapper' key to specify a list of elements to wrap the text of
+        *   a link in. This should be an array of arrays containing a 'tag' and
+        *   optionally an 'attributes' key. If you only have one element you don't
+        *   need to wrap it in another array. eg: To use <a><span>...</span></a>
+        *   in all links use array( 'text-wrapper' => array( 'tag' => 'span' ) )
+        *   for your options.
+        *   - 'link-class' key can be used to specify additional classes to apply
+        *   to all links.
+        *   - 'link-fallback' can be used to specify a tag to use instead of "<a>"
+        *   if there is no link. eg: If you specify 'link-fallback' => 'span' than
+        *   any non-link will output a "<span>" instead of just text.
+        *
         * @return string
         */
        function makeLink( $key, $item, $options = array() ) {
@@ -1681,17 +1683,22 @@ abstract class BaseTemplate extends QuickTemplate {
        }
 
        /**
-        * Generates a list item for a navigation, portlet, portal, sidebar... etc list
-        * $key is a string, usually a key from the list you are generating this link from
-        * $item is an array of list item data containing some of a specific set of keys.
+        * Generates a list item for a navigation, portlet, portal, sidebar... list
+        *
+        * @param $key string, usually a key from the list you are generating this link from.
+        * @param $item array, of list item data containing some of a specific set of keys.
         * The "id" and "class" keys will be used as attributes for the list item,
         * if "active" contains a value of true a "active" class will also be appended to class.
-        * If you want something other than a <li> you can pass a tag name such as
+        *
+        * @param $options array
+        *
+        * If you want something other than a "<li>" you can pass a tag name such as
         * "tag" => "span" in the $options array to change the tag used.
         * link/content data for the list item may come in one of two forms
         * A "links" key may be used, in which case it should contain an array with
-        * a list of links to include inside the list item, see makeLink for the format
-        * of individual links array items.
+        * a list of links to include inside the list item, see makeLink for the
+        * format of individual links array items.
+        *
         * Otherwise the relevant keys from the list item $item array will be passed
         * to makeLink instead. Note however that "id" and "class" are used by the
         * list item directly so they will not be passed to makeLink
@@ -1699,6 +1706,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * If you need an id or class on a single link you should include a "links"
         * array with just one link item inside of it.
         * $options is also passed on to makeLink calls
+        *
         * @return string
         */
        function makeListItem( $key, $item, $options = array() ) {
@@ -1872,13 +1880,7 @@ abstract class BaseTemplate extends QuickTemplate {
        function printTrail() { ?>
 <?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
 <?php $this->html( 'reporttime' ) ?>
-<?php if ( $this->data['debug'] ): ?>
-<!-- Debug output:
-<?php $this->text( 'debug' ); ?>
-
--->
-<?php endif;
+<?php echo MWDebug::getDebugHTML( $this->getSkin()->getContext() );
        }
 
 }
-
index 9e6717f..2e5e02b 100644 (file)
@@ -351,7 +351,7 @@ class SpecialPage {
                        $this->mFunction = $function;
                }
                if ( $file === 'default' ) {
-                       $this->mFile = dirname( __FILE__ ) . "/specials/Special$name.php";
+                       $this->mFile = __DIR__ . "/specials/Special$name.php";
                } else {
                        $this->mFile = $file;
                }
@@ -589,15 +589,70 @@ class SpecialPage {
                $out->setPageTitle( $this->getDescription() );
        }
 
+       /**
+        * Entry point.
+        *
+        * @since 1.20
+        *
+        * @param $subPage string|null
+        */
+       public final function run( $subPage ) {
+               /**
+                * Gets called before @see SpecialPage::execute.
+                *
+                * @since 1.20
+                *
+                * @param $special SpecialPage
+                * @param $subPage string|null
+                */
+               wfRunHooks( 'SpecialPageBeforeExecute', array( $this, $subPage ) );
+
+               $this->beforeExecute( $subPage );
+               $this->execute( $subPage );
+               $this->afterExecute( $subPage );
+
+               /**
+                * Gets called after @see SpecialPage::execute.
+                *
+                * @since 1.20
+                *
+                * @param $special SpecialPage
+                * @param $subPage string|null
+                */
+               wfRunHooks( 'SpecialPageAfterExecute', array( $this, $subPage ) );
+       }
+
+       /**
+        * Gets called before @see SpecialPage::execute.
+        *
+        * @since 1.20
+        *
+        * @param $subPage string|null
+        */
+       protected function beforeExecute( $subPage ) {
+               // No-op
+       }
+
+       /**
+        * Gets called after @see SpecialPage::execute.
+        *
+        * @since 1.20
+        *
+        * @param $subPage string|null
+        */
+       protected function afterExecute( $subPage ) {
+               // No-op
+       }
+
        /**
         * Default execute method
         * Checks user permissions, calls the function given in mFunction
         *
         * This must be overridden by subclasses; it will be made abstract in a future version
         *
-        * @param $par String subpage string, if one was specified
+        * @param $subPage string|null
         */
-       function execute( $par ) {
+       public function execute( $subPage ) {
                $this->setHeaders();
                $this->checkPermissions();
 
@@ -607,7 +662,7 @@ class SpecialPage {
                        require_once( $this->mFile );
                }
                $this->outputHeader();
-               call_user_func( $func, $par, $this );
+               call_user_func( $func, $subPage, $this );
        }
 
        /**
@@ -1081,17 +1136,103 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial {
  * users.
  */
 
+/**
+ * Superclass for any RedirectSpecialPage which redirects the user
+ * to a particular article (as opposed to user contributions, logs, etc.).
+ *
+ * For security reasons these special pages are restricted to pass on
+ * the following subset of GET parameters to the target page while
+ * removing all others:
+ *
+ * - useskin, uselang, printable: to alter the appearance of the resulting page
+ *
+ * - redirect: allows viewing one's user page or talk page even if it is a
+ * redirect.
+ *
+ * - rdfrom: allows redirecting to one's user page or talk page from an
+ * external wiki with the "Redirect from..." notice.
+ *
+ * - limit, offset: Useful for linking to history of one's own user page or
+ * user talk page. For example, this would be a link to "the last edit to your
+ * user talk page in the year 2010":
+ * http://en.wikipedia.org/w/index.php?title=Special:MyPage&offset=20110000000000&limit=1&action=history
+ *
+ * - feed: would allow linking to the current user's RSS feed for their user
+ * talk page:
+ * http://en.wikipedia.org/w/index.php?title=Special:MyTalk&action=history&feed=rss
+ *
+ * - preloadtitle: Can be used to provide a default section title for a
+ * preloaded new comment on one's own talk page.
+ *
+ * - summary : Can be used to provide a default edit summary for a preloaded
+ * edit to one's own user page or talk page.
+ *
+ * - preview: Allows showing/hiding preview on first edit regardless of user
+ * preference, useful for preloaded edits where you know preview wouldn't be
+ * useful.
+ *
+ * - internaledit, externaledit, mode: Allows forcing the use of the
+ * internal/external editor, e.g. to force the internal editor for
+ * short/simple preloaded edits.
+ *
+ * - redlink: Affects the message the user sees if their talk page/user talk
+ * page does not currently exist. Avoids confusion for newbies with no user
+ * pages over why they got a "permission error" following this link:
+ * http://en.wikipedia.org/w/index.php?title=Special:MyPage&redlink=1
+ *
+ * - debug: determines whether the debug parameter is passed to load.php,
+ * which disables reformatting and allows scripts to be debugged. Useful
+ * when debugging scripts that manipulate one's own user page or talk page.
+ *
+ * @par Hook extension:
+ * Extensions can add to the redirect parameters list by using the hook
+ * RedirectSpecialArticleRedirectParams
+ *
+ * This hook allows extensions which add GET parameters like FlaggedRevs to
+ * retain those parameters when redirecting using special pages.
+ *
+ * @par Hook extension example:
+ * @code
+ *     $wgHooks['RedirectSpecialArticleRedirectParams'][] =
+ *             'MyExtensionHooks::onRedirectSpecialArticleRedirectParams';
+ *     public static function onRedirectSpecialArticleRedirectParams( &$redirectParams ) {
+ *             $redirectParams[] = 'stable';
+ *             return true;
+ *     }
+ * @endcode
+ * @ingroup SpecialPage
+ */
+abstract class RedirectSpecialArticle extends RedirectSpecialPage {
+       function __construct( $name ) {
+               parent::__construct( $name );
+               $redirectParams = array(
+                       'action',
+                       'redirect', 'rdfrom',
+                       # Options for preloaded edits
+                       'preload', 'editintro', 'preloadtitle', 'summary',
+                       # Options for overriding user settings
+                       'preview', 'internaledit', 'externaledit', 'mode',
+                       # Options for history/diffs
+                       'section', 'oldid', 'diff', 'dir',
+                       'limit', 'offset', 'feed',
+                       # Misc options
+                       'redlink', 'debug',
+                       # Options for action=raw; missing ctype can break JS or CSS in some browsers
+                       'ctype', 'maxage', 'smaxage',
+               );
+
+               wfRunHooks( "RedirectSpecialArticleRedirectParams", array(&$redirectParams) );
+               $this->mAllowedRedirectParams = $redirectParams;
+       }
+}
+
 /**
  * Shortcut to construct a special page pointing to current user user's page.
  * @ingroup SpecialPage
  */
-class SpecialMypage extends RedirectSpecialPage {
+class SpecialMypage extends RedirectSpecialArticle {
        function __construct() {
                parent::__construct( 'Mypage' );
-               $this->mAllowedRedirectParams = array( 'action', 'preload', 'preloadtitle', 'editintro',
-                       'section', 'oldid', 'diff', 'dir',
-                       // Options for action=raw; missing ctype can break JS or CSS in some browsers
-                       'ctype', 'maxage', 'smaxage' );
        }
 
        function getRedirect( $subpage ) {
@@ -1107,11 +1248,9 @@ class SpecialMypage extends RedirectSpecialPage {
  * Shortcut to construct a special page pointing to current user talk page.
  * @ingroup SpecialPage
  */
-class SpecialMytalk extends RedirectSpecialPage {
+class SpecialMytalk extends RedirectSpecialArticle {
        function __construct() {
                parent::__construct( 'Mytalk' );
-               $this->mAllowedRedirectParams = array( 'action', 'preload', 'preloadtitle', 'editintro',
-                       'section', 'oldid', 'diff', 'dir' );
        }
 
        function getRedirect( $subpage ) {
index 02b8d54..95f75a8 100644 (file)
@@ -134,6 +134,7 @@ class SpecialPageFactory {
                // High use pages
                'Mostlinkedcategories'      => 'MostlinkedCategoriesPage',
                'Mostimages'                => 'MostimagesPage',
+               'Mostinterwikis'            => 'MostinterwikisPage',
                'Mostlinked'                => 'MostlinkedPage',
                'Mostlinkedtemplates'       => 'MostlinkedTemplatesPage',
                'Mostcategories'            => 'MostcategoriesPage',
@@ -490,7 +491,7 @@ class SpecialPageFactory {
                // Execute special page
                $profName = 'Special:' . $page->getName();
                wfProfileIn( $profName );
-               $page->execute( $par );
+               $page->run( $par );
                wfProfileOut( $profName );
                wfProfileOut( __METHOD__ );
                return true;
index 6d36a43..aeb9ba4 100644 (file)
 /**
  * Abstract base class for update jobs that put some secondary data extracted
  * from article content into the database.
+ *
+ * @note: subclasses should NOT start or commit transactions in their doUpdate() method,
+ *        a transaction will automatically be wrapped around the update. Starting another
+ *        one would break the outer transaction bracket. If need be, subclasses can override
+ *        the beginTransaction() and commitTransaction() methods.
  */
 abstract class SqlDataUpdate extends DataUpdate {
 
index 7cd2b03..8eb0f6b 100644 (file)
@@ -44,7 +44,15 @@ class SquidPurgeClient {
         * The socket resource, or null for unconnected, or false for disabled due to error
         */
        var $socket;
-       
+
+       var $readBuffer;
+
+       var $bodyRemaining;
+
+       /**
+        * @param $server string
+        * @param $options array
+        */
        public function __construct( $server, $options = array() ) {
                $parts = explode( ':', $server, 2 );
                $this->host = $parts[0];
@@ -340,6 +348,9 @@ class SquidPurgeClient {
                $this->bodyRemaining = null;
        }
 
+       /**
+        * @param $msg string
+        */
        protected function log( $msg ) {
                wfDebugLog( 'squid', __CLASS__." ($this->host): $msg\n" );
        }
@@ -353,6 +364,9 @@ class SquidPurgeClientPool {
        var $clients = array();
        var $timeout = 5;
 
+       /**
+        * @param $options array
+        */
        function __construct( $options = array() ) {
                if ( isset( $options['timeout'] ) ) {
                        $this->timeout = $options['timeout'];
@@ -372,6 +386,9 @@ class SquidPurgeClientPool {
                $startTime = microtime( true );
                while ( !$done ) {
                        $readSockets = $writeSockets = array();
+                       /**
+                        * @var $client SquidPurgeClient
+                        */
                        foreach ( $this->clients as $clientIndex => $client ) {
                                $sockets = $client->getReadSocketsForSelect();
                                foreach ( $sockets as $i => $socket ) {
index a2df380..10dfb51 100644 (file)
@@ -164,35 +164,6 @@ class Status {
                return $cleanParams;
        }
 
-       /**
-        * @param $item
-        * @return string
-        */
-       protected function getItemXML( $item ) {
-               $params = $this->cleanParams( $item['params'] );
-               $xml = "<{$item['type']}>\n" .
-                       Xml::element( 'message', null, $item['message'] ) . "\n" .
-                       Xml::element( 'text', null, wfMsg( $item['message'], $params ) ) ."\n";
-               foreach ( $params as $param ) {
-                       $xml .= Xml::element( 'param', null, $param );
-               }
-               $xml .= "</{$item['type']}>\n";
-               return $xml;
-       }
-
-       /**
-        * Get the error list as XML
-        * @return string
-        */
-       function getXML() {
-               $xml = "<errors>\n";
-               foreach ( $this->errors as $error ) {
-                       $xml .= $this->getItemXML( $error );
-               }
-               $xml .= "</errors>\n";
-               return $xml;
-       }
-
        /**
         * Get the error list as a wikitext formatted list
         *
@@ -214,17 +185,17 @@ class Status {
                if ( count( $this->errors ) == 1 ) {
                        $s = $this->getWikiTextForError( $this->errors[0], $this->errors[0]  );
                        if ( $shortContext ) {
-                               $s = wfMsgNoTrans( $shortContext, $s );
+                               $s = wfMessage( $shortContext, $s )->plain();
                        } elseif ( $longContext ) {
-                               $s = wfMsgNoTrans( $longContext, "* $s\n" );
+                               $s = wfMessage( $longContext, "* $s\n" )->plain();
                        }
                } else {
                        $s = '* '. implode("\n* ",
                                $this->getWikiTextArray( $this->errors ) ) . "\n";
                        if ( $longContext ) {
-                               $s = wfMsgNoTrans( $longContext, $s );
+                               $s = wfMessage( $longContext, $s )->plain();
                        } elseif ( $shortContext ) {
-                               $s = wfMsgNoTrans( $shortContext, "\n$s\n" );
+                               $s = wfMessage( $shortContext, "\n$s\n" )->plain();
                        }
                }
                return $s;
@@ -242,15 +213,15 @@ class Status {
        protected function getWikiTextForError( $error ) {
                if ( is_array( $error ) ) {
                        if ( isset( $error['message'] ) && isset( $error['params'] ) ) {
-                               return wfMsgNoTrans( $error['message'],
-                                       array_map( 'wfEscapeWikiText', $this->cleanParams( $error['params'] ) )  );
+                               return wfMessage( $error['message'],
+                                       array_map( 'wfEscapeWikiText', $this->cleanParams( $error['params'] ) )  )->plain();
                        } else {
                                $message = array_shift($error);
-                               return wfMsgNoTrans( $message,
-                                       array_map( 'wfEscapeWikiText', $this->cleanParams( $error ) ) );
+                               return wfMessage( $message,
+                                       array_map( 'wfEscapeWikiText', $this->cleanParams( $error ) ) )->plain();
                        }
                } else {
-                       return wfMsgNoTrans( $error );
+                       return wfMessage( $error )->plain();
                }
        }
 
index 6539e08..e7f7811 100644 (file)
@@ -31,7 +31,7 @@ class StreamFile {
         * Stream a file to the browser, adding all the headings and fun stuff.
         * Headers sent include: Content-type, Content-Length, Last-Modified,
         * and Content-Disposition.
-        * 
+        *
         * @param $fname string Full name and path of the file to stream
         * @param $headers array Any additional headers to send
         * @param $sendErrors bool Send error messages if errors occur (like 404)
@@ -40,6 +40,10 @@ class StreamFile {
        public static function stream( $fname, $headers = array(), $sendErrors = true ) {
                wfProfileIn( __METHOD__ );
 
+               if ( FileBackend::isStoragePath( $fname ) ) { // sanity
+                       throw new MWException( __FUNCTION__ . " given storage path '$fname'." );
+               }
+
                wfSuppressWarnings();
                $stat = stat( $fname );
                wfRestoreWarnings();
@@ -142,7 +146,7 @@ class StreamFile {
 
        /**
         * Determine the file type of a file based on the path
-        * 
+        *
         * @param $filename string Storage path or file system path
         * @param $safe bool Whether to do retroactive upload blacklist checks
         * @return null|string
index 3b500ae..43275a6 100644 (file)
@@ -213,7 +213,7 @@ class StringUtils {
         * Returns an Iterator
         * @param $separator
         * @param $subject
-        * @return ArrayIterator|\ExplodeIterator
+        * @return ArrayIterator|ExplodeIterator
         */
        static function explode( $separator, $subject ) {
                if ( substr_count( $subject, $separator ) > 1000 ) {
index 046fadb..94ae062 100644 (file)
@@ -825,7 +825,7 @@ class Title {
 
        /**
         * Returns true if the title is inside the specified namespace.
-        * 
+        *
         * Please make use of this instead of comparing to getNamespace()
         * This function is much more resistant to changes we may make
         * to namespaces than code that makes direct comparisons.
@@ -1270,9 +1270,11 @@ class Title {
         * See getLocalURL for the arguments.
         *
         * @see self::getLocalURL
+        * @see wfExpandUrl
+        * @param $proto Protocol type to use in URL
         * @return String the URL
         */
-       public function getFullURL( $query = '', $query2 = false ) {
+       public function getFullURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
                $query = self::fixUrlQueryArgs( $query, $query2 );
 
                # Hand off all the decisions on urls to getLocalURL
@@ -1281,7 +1283,7 @@ class Title {
                # Expand the url to make it a full url. Note that getLocalURL has the
                # potential to output full urls for a variety of reasons, so we use
                # wfExpandUrl instead of simply prepending $wgServer
-               $url = wfExpandUrl( $url, PROTO_RELATIVE );
+               $url = wfExpandUrl( $url, $proto );
 
                # Finally, add the fragment.
                $url .= $this->getFragmentForURL();
@@ -1516,6 +1518,7 @@ class Title {
        /**
         * Is $wgUser watching this page?
         *
+        * @deprecated in 1.20; use User::isWatched() instead.
         * @return Bool
         */
        public function userIsWatching() {
@@ -1881,7 +1884,7 @@ class Title {
                                        $title_protection['pt_create_perm'] = 'protect'; // B/C
                                }
                                if( $title_protection['pt_create_perm'] == '' ||
-                                       !$user->isAllowed( $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'] );
                                }
@@ -2858,7 +2861,7 @@ class Title {
         * @return Int or 0 if the page doesn't exist
         */
        public function getLatestRevID( $flags = 0 ) {
-               if ( $this->mLatestID !== false ) {
+               if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLatestID !== false ) {
                        return intval( $this->mLatestID );
                }
                # Calling getArticleID() loads the field from cache as needed
@@ -2877,7 +2880,7 @@ class Title {
         *
         * - This is called from WikiPage::doEdit() and WikiPage::insertOn() to allow
         * loading of the new page_id. It's also called from
-        * WikiPage::doDeleteArticle()
+        * WikiPage::doDeleteArticleReal()
         *
         * @param $newid Int the new Article ID
         */
@@ -3284,16 +3287,14 @@ class Title {
         * @return Array of String the URLs
         */
        public function getSquidURLs() {
-               global $wgContLang;
-
                $urls = array(
                        $this->getInternalURL(),
                        $this->getInternalURL( 'action=history' )
                );
 
-               // purge variant urls as well
-               if ( $wgContLang->hasVariants() ) {
-                       $variants = $wgContLang->getVariants();
+               $pageLang = $this->getPageLanguage();
+               if ( $pageLang->hasVariants() ) {
+                       $variants = $pageLang->getVariants();
                        foreach ( $variants as $vCode ) {
                                $urls[] = $this->getInternalURL( '', $vCode );
                        }
@@ -3475,6 +3476,10 @@ class Title {
                        $wgUser->spreadAnyEditBlock();
                        return $err;
                }
+               // Check suppressredirect permission
+               if ( $auth && !$wgUser->isAllowed( 'suppressredirect' ) ) {
+                       $createRedirect = true;
+               }
 
                // If it is a file, move it first.
                // It is done before all other moving stuff is done because it's hard to revert.
@@ -3571,8 +3576,8 @@ class Title {
         *
         * @param $nt Title the page to move to, which should be a redirect or nonexistent
         * @param $reason String The reason for the move
-        * @param $createRedirect Bool Whether to leave a redirect at the old title.  Ignored
-        *   if the user doesn't have the suppressredirect right
+        * @param $createRedirect Bool Whether to leave a redirect at the old title. Does not check
+        *   if the user has the suppressredirect right
         * @throws MWException
         */
        private function moveToInternal( &$nt, $reason = '', $createRedirect = true ) {
@@ -3586,7 +3591,7 @@ class Title {
                        $logType = 'move';
                }
 
-               $redirectSuppressed = !$createRedirect && $wgUser->isAllowed( 'suppressredirect' );
+               $redirectSuppressed = !$createRedirect;
 
                $logEntry = new ManualLogEntry( 'move', $logType );
                $logEntry->setPerformer( $wgUser );
@@ -3815,7 +3820,7 @@ class Title {
                        return false;
                }
                # Get the article text
-               $rev = Revision::newFromTitle( $nt );
+               $rev = Revision::newFromTitle( $nt, false, Revision::READ_LATEST );
                if( !is_object( $rev ) ){
                        return false;
                }
@@ -4076,30 +4081,60 @@ class Title {
        }
 
        /**
-        * Get the number of authors between the given revision IDs.
+        * Get the number of authors between the given revisions or revision IDs.
         * Used for diffs and other things that really need it.
         *
-        * @param $old int|Revision Old revision or rev ID (first before range)
-        * @param $new int|Revision New revision or rev ID (first after range)
-        * @param $limit Int Maximum number of authors
-        * @return Int Number of revision authors between these revisions.
-        */
-       public function countAuthorsBetween( $old, $new, $limit ) {
+        * @param $old int|Revision Old revision or rev ID (first before range by default)
+        * @param $new int|Revision New revision or rev ID (first after range by default)
+        * @param $limit int Maximum number of authors
+        * @param $options string|array (Optional): Single option, or an array of options:
+        *     'include_old' Include $old in the range; $new is excluded.
+        *     'include_new' Include $new in the range; $old is excluded.
+        *     'include_both' Include both $old and $new in the range.
+        *     Unknown option values are ignored.
+        * @return int Number of revision authors in the range; zero if not both revisions exist
+        */
+       public function countAuthorsBetween( $old, $new, $limit, $options = array() ) {
                if ( !( $old instanceof Revision ) ) {
                        $old = Revision::newFromTitle( $this, (int)$old );
                }
                if ( !( $new instanceof Revision ) ) {
                        $new = Revision::newFromTitle( $this, (int)$new );
                }
+               // XXX: what if Revision objects are passed in, but they don't refer to this title?
+               // Add $old->getPage() != $new->getPage() || $old->getPage() != $this->getArticleID()
+               // in the sanity check below?
                if ( !$old || !$new ) {
                        return 0; // nothing to compare
                }
+               $old_cmp = '>';
+               $new_cmp = '<';
+               $options = (array) $options;
+               if ( in_array( 'include_old', $options ) ) {
+                       $old_cmp = '>=';
+               }
+               if ( in_array( 'include_new', $options ) ) {
+                       $new_cmp = '<=';
+               }
+               if ( in_array( 'include_both', $options ) ) {
+                       $old_cmp = '>=';
+                       $new_cmp = '<=';
+               }
+               // 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() ) {
+                       if ( $old_cmp === '>' || $new_cmp === '<' ) {
+                               return ( $old_cmp === '>' && $new_cmp === '<' ) ? 0 : 1;
+                       }
+                       return ( $old->getRawUserText() === $new->getRawUserText() ) ? 1 : 2;
+               }
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'revision', 'DISTINCT rev_user_text',
                        array(
                                'rev_page' => $this->getArticleID(),
-                               'rev_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( $old->getTimestamp() ) ),
-                               'rev_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( $new->getTimestamp() ) )
+                               "rev_timestamp $old_cmp " . $dbr->addQuotes( $dbr->timestamp( $old->getTimestamp() ) ),
+                               "rev_timestamp $new_cmp " . $dbr->addQuotes( $dbr->timestamp( $new->getTimestamp() ) )
                        ), __METHOD__,
                        array( 'LIMIT' => $limit + 1 ) // add one so caller knows it was truncated
                );
index 01407b1..f43844e 100644 (file)
@@ -65,6 +65,11 @@ class User {
        const MW_USER_VERSION = MW_USER_VERSION;
        const EDIT_TOKEN_SUFFIX = EDIT_TOKEN_SUFFIX;
 
+       /**
+        * Maximum items in $mWatchedItems
+        */
+       const MAX_WATCHED_ITEMS_CACHE = 100;
+
        /**
         * Array of Strings List of member variables which are saved to the
         * shared cache (memcached). Any operation which changes the
@@ -114,9 +119,11 @@ class User {
                'delete',
                'deletedhistory',
                'deletedtext',
+               'deletelogentry',
                'deleterevision',
                'edit',
                'editinterface',
+               'editprotected',
                'editusercssjs', #deprecated
                'editusercss',
                'edituserjs',
@@ -134,12 +141,15 @@ class User {
                'nominornewtalk',
                'noratelimit',
                'override-export-depth',
+               'passwordreset',
                'patrol',
+               'patrolmarks',
                'protect',
                'proxyunbannable',
                'purge',
                'read',
                'reupload',
+               'reupload-own',
                'reupload-shared',
                'rollback',
                'sendemail',
@@ -219,6 +229,11 @@ class User {
         */
        private $mBlockedFromCreateAccount = false;
 
+       /**
+        * @var Array
+        */
+       private $mWatchedItems = array();
+
        static $idCacheByName = array();
 
        /**
@@ -453,8 +468,7 @@ class User {
         * @return String|bool The corresponding username
         */
        public static function whoIs( $id ) {
-               $dbr = wfGetDB( DB_SLAVE );
-               return $dbr->selectField( 'user', 'user_name', array( 'user_id' => $id ), __METHOD__ );
+               return UserCache::singleton()->getProp( $id, 'name' );
        }
 
        /**
@@ -464,8 +478,7 @@ class User {
         * @return String|bool The corresponding user's real name
         */
        public static function whoIsReal( $id ) {
-               $dbr = wfGetDB( DB_SLAVE );
-               return $dbr->selectField( 'user', 'user_real_name', array( 'user_id' => $id ), __METHOD__ );
+               return UserCache::singleton()->getProp( $id, 'real_name' );
        }
 
        /**
@@ -517,7 +530,7 @@ class User {
         * as 300.300.300.300 will return true because it looks like an IP
         * address, despite not being strictly valid.
         *
-        * We match \d{1,3}\.\d{1,3}\.\d{1,3}\.xxx as an anonymous IP
+        * We match "\d{1,3}\.\d{1,3}\.\d{1,3}\.xxx" as an anonymous IP
         * address because the usemod software would "cloak" anonymous IP
         * addresses like this, if we allowed accounts like this to be created
         * new users could get the old edits of these anonymous users.
@@ -1377,11 +1390,11 @@ class User {
                                $ipList = gethostbynamel( $host );
 
                                if( $ipList ) {
-                                       wfDebug( "Hostname $host is {$ipList[0]}, it's a proxy says $base!\n" );
+                                       wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $base!\n" );
                                        $found = true;
                                        break;
                                } else {
-                                       wfDebug( "Requested $host, not found in $base.\n" );
+                                       wfDebugLog( 'dnsblacklist', "Requested $host, not found in $base.\n" );
                                }
                        }
                }
@@ -1753,16 +1766,22 @@ class User {
                        # Check memcached separately for anons, who have no
                        # entire User object stored in there.
                        if( !$this->mId ) {
-                               global $wgMemc;
-                               $key = wfMemcKey( 'newtalk', 'ip', $this->getName() );
-                               $newtalk = $wgMemc->get( $key );
-                               if( strval( $newtalk ) !== '' ) {
-                                       $this->mNewtalk = (bool)$newtalk;
+                               global $wgDisableAnonTalk;
+                               if( $wgDisableAnonTalk ) {
+                                       // Anon newtalk disabled by configuration.
+                                       $this->mNewtalk = false;
                                } else {
-                                       // Since we are caching this, make sure it is up to date by getting it
-                                       // from the master
-                                       $this->mNewtalk = $this->checkNewtalk( 'user_ip', $this->getName(), true );
-                                       $wgMemc->set( $key, (int)$this->mNewtalk, 1800 );
+                                       global $wgMemc;
+                                       $key = wfMemcKey( 'newtalk', 'ip', $this->getName() );
+                                       $newtalk = $wgMemc->get( $key );
+                                       if( strval( $newtalk ) !== '' ) {
+                                               $this->mNewtalk = (bool)$newtalk;
+                                       } else {
+                                               // Since we are caching this, make sure it is up to date by getting it
+                                               // from the master
+                                               $this->mNewtalk = $this->checkNewtalk( 'user_ip', $this->getName(), true );
+                                               $wgMemc->set( $key, (int)$this->mNewtalk, 1800 );
+                                       }
                                }
                        } else {
                                $this->mNewtalk = $this->checkNewtalk( 'user_id', $this->mId );
@@ -1778,14 +1797,20 @@ class User {
         */
        public function getNewMessageLinks() {
                $talks = array();
-               if( !wfRunHooks( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) )
+               if( !wfRunHooks( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) ) {
                        return $talks;
-
-               if( !$this->getNewtalk() )
+               } elseif( !$this->getNewtalk() ) {
                        return array();
-               $up = $this->getUserPage();
-               $utp = $up->getTalkPage();
-               return array( array( 'wiki' => wfWikiID(), 'link' => $utp->getLocalURL() ) );
+               }
+               $utp = $this->getTalkPage();
+               $dbr = wfGetDB( DB_SLAVE );
+               // Get the "last viewed rev" timestamp from the oldest message notification
+               $timestamp = $dbr->selectField( 'user_newtalk',
+                       'MIN(user_last_timestamp)',
+                       $this->isAnon() ? array( 'user_ip' => $this->getName() ) : array( 'user_id' => $this->getID() ),
+                       __METHOD__ );
+               $rev = $timestamp ? Revision::loadFromTimestamp( $dbr, $utp, $timestamp ) : null;
+               return array( array( 'wiki' => wfWikiID(), 'link' => $utp->getLocalURL(), 'rev' => $rev ) );
        }
 
        /**
@@ -1812,12 +1837,17 @@ class User {
         * Add or update the new messages flag
         * @param $field String 'user_ip' for anonymous users, 'user_id' otherwise
         * @param $id String|Int User's IP address for anonymous users, User ID otherwise
+        * @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null.
         * @return Bool True if successful, false otherwise
         */
-       protected function updateNewtalk( $field, $id ) {
+       protected function updateNewtalk( $field, $id, $curRev = null ) {
+               // Get timestamp of the talk page revision prior to the current one
+               $prevRev = $curRev ? $curRev->getPrevious() : false;
+               $ts = $prevRev ? $prevRev->getTimestamp() : null;
+               // Mark the user as having new messages since this revision
                $dbw = wfGetDB( DB_MASTER );
                $dbw->insert( 'user_newtalk',
-                       array( $field => $id ),
+                       array( $field => $id, 'user_last_timestamp' => $dbw->timestampOrNull( $ts ) ),
                        __METHOD__,
                        'IGNORE' );
                if ( $dbw->affectedRows() ) {
@@ -1852,8 +1882,9 @@ class User {
        /**
         * Update the 'You have new messages!' status.
         * @param $val Bool Whether the user has new messages
+        * @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null or !$val.
         */
-       public function setNewtalk( $val ) {
+       public function setNewtalk( $val, $curRev = null ) {
                if( wfReadOnly() ) {
                        return;
                }
@@ -1871,7 +1902,7 @@ class User {
                global $wgMemc;
 
                if( $val ) {
-                       $changed = $this->updateNewtalk( $field, $id );
+                       $changed = $this->updateNewtalk( $field, $id, $curRev );
                } else {
                        $changed = $this->deleteNewtalk( $field, $id );
                }
@@ -2278,9 +2309,11 @@ class User {
                $this->loadOptions();
 
                // Explicitly NULL values should refer to defaults
-               global $wgDefaultUserOptions;
-               if( is_null( $val ) && isset( $wgDefaultUserOptions[$oname] ) ) {
-                       $val = $wgDefaultUserOptions[$oname];
+               if( is_null( $val ) ) {
+                       $defaultOption = self::getDefaultOption( $oname );
+                       if( !is_null( $defaultOption ) ) {
+                               $val = $defaultOption;
+                       }
                }
 
                $this->mOptions[$oname] = $val;
@@ -2613,14 +2646,34 @@ class User {
                return RequestContext::getMain()->getSkin();
        }
 
+       /**
+        * Get a WatchedItem for this user and $title.
+        *
+        * @param $title Title
+        * @return WatchedItem
+        */
+       public function getWatchedItem( $title ) {
+               $key = $title->getNamespace() . ':' . $title->getDBkey();
+
+               if ( isset( $this->mWatchedItems[$key] ) ) {
+                       return $this->mWatchedItems[$key];
+               }
+
+               if ( count( $this->mWatchedItems ) >= self::MAX_WATCHED_ITEMS_CACHE ) {
+                       $this->mWatchedItems = array();
+               }
+
+               $this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title );
+               return $this->mWatchedItems[$key];
+       }
+
        /**
         * Check the watched status of an article.
         * @param $title Title of the article to look at
         * @return Bool
         */
        public function isWatched( $title ) {
-               $wl = WatchedItem::fromUserTitle( $this, $title );
-               return $wl->isWatched();
+               return $this->getWatchedItem( $title )->isWatched();
        }
 
        /**
@@ -2628,8 +2681,7 @@ class User {
         * @param $title Title of the article to look at
         */
        public function addWatch( $title ) {
-               $wl = WatchedItem::fromUserTitle( $this, $title );
-               $wl->addWatch();
+               $this->getWatchedItem( $title )->addWatch();
                $this->invalidateCache();
        }
 
@@ -2638,8 +2690,7 @@ class User {
         * @param $title Title of the article to look at
         */
        public function removeWatch( $title ) {
-               $wl = WatchedItem::fromUserTitle( $this, $title );
-               $wl->removeWatch();
+               $this->getWatchedItem( $title )->removeWatch();
                $this->invalidateCache();
        }
 
@@ -2684,8 +2735,7 @@ class User {
                        $force = 'force';
                }
 
-               $wi = WatchedItem::fromUserTitle( $this, $title );
-               $wi->resetNotificationTimestamp( $force );
+               $this->getWatchedItem( $title )->resetNotificationTimestamp( $force );
        }
 
        /**
index 87526fc..2cc6338 100644 (file)
@@ -88,7 +88,9 @@ class WebRequest {
                        if ( !preg_match( '!^https?://!', $url ) ) {
                                $url = 'http://unused' . $url;
                        }
+                       wfSuppressWarnings();
                        $a = parse_url( $url );
+                       wfRestoreWarnings();
                        if( $a ) {
                                $path = isset( $a['path'] ) ? $a['path'] : '';
 
@@ -496,17 +498,16 @@ class WebRequest {
        public function getCheck( $name ) {
                # Checkboxes and buttons are only present when clicked
                # Presence connotes truth, abscense false
-               $val = $this->getVal( $name, null );
-               return isset( $val );
+               return $this->getVal( $name, null ) !== null;
        }
 
        /**
         * Fetch a text string from the given array or return $default if it's not
         * set. Carriage returns are stripped from the text, and with some language
         * modules there is an input transliteration applied. This should generally
-        * be used for form <textarea> and <input> fields. Used for user-supplied
-        * freeform text input (for which input transformations may be required - e.g.
-        * Esperanto x-coding).
+        * be used for form "<textarea>" and "<input>" fields. Used for
+        * user-supplied freeform text input (for which input transformations may
+        * be required - e.g.  Esperanto x-coding).
         *
         * @param $name String
         * @param $default String: optional
@@ -562,6 +563,15 @@ class WebRequest {
                return $_GET;
         }
 
+       /**
+        * Get the HTTP method used for this request.
+        *
+        * @return String
+        */
+       public function getMethod() {
+               return isset( $_SERVER['REQUEST_METHOD'] ) ? $_SERVER['REQUEST_METHOD'] : 'GET';
+       }
+
        /**
         * Returns true if the present request was reached by a POST operation,
         * false otherwise (GET, HEAD, or command-line).
@@ -572,7 +582,7 @@ class WebRequest {
         * @return Boolean
         */
        public function wasPosted() {
-               return isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] == 'POST';
+               return $this->getMethod() == 'POST';
        }
 
        /**
@@ -1276,6 +1286,10 @@ class FauxRequest extends WebRequest {
                }
        }
 
+       public function getMethod() {
+               return $this->wasPosted ? 'POST' : 'GET';
+       }
+
        /**
         * @return bool
         */
index 17f8216..01c5eea 100644 (file)
@@ -81,7 +81,7 @@ define( 'MEDIAWIKI', true );
 # Full path to working directory.
 # Makes it possible to for example to have effective exclude path in apc.
 # Also doesn't break installations using symlinked includes, like
-# dirname( __FILE__ ) would do.
+# __DIR__ would do.
 $IP = getenv( 'MW_INSTALL_PATH' );
 if ( $IP === false ) {
        $IP = realpath( '.' );
index 7efb082..a4a8903 100644 (file)
@@ -62,7 +62,6 @@ class MediaWiki {
                }
 
                $this->context = $context;
-               $this->context->setTitle( $this->parseTitle() );
        }
 
        /**
@@ -133,6 +132,34 @@ class MediaWiki {
                return $this->context->getTitle();
        }
 
+       /**
+        * Returns the name of the action that will be executed.
+        *
+        * @return string: action
+        */
+       public function getAction() {
+               static $action = null;
+
+               if ( $action === null ) {
+                       $action = Action::getActionName( $this->context );
+               }
+
+               return $action;
+       }
+
+       /**
+        * Create an Article object of the appropriate class for the given page.
+        *
+        * @deprecated in 1.18; use Article::newFromTitle() instead
+        * @param $title Title
+        * @param $context IContextSource
+        * @return Article object
+        */
+       public static function articleFromTitle( $title, IContextSource $context ) {
+               wfDeprecated( __METHOD__, '1.18' );
+               return Article::newFromTitle( $title, $context );
+       }
+
        /**
         * Performs the request.
         * - bad titles
@@ -291,34 +318,6 @@ class MediaWiki {
                wfProfileOut( __METHOD__ );
        }
 
-       /**
-        * Create an Article object of the appropriate class for the given page.
-        *
-        * @deprecated in 1.18; use Article::newFromTitle() instead
-        * @param $title Title
-        * @param $context IContextSource
-        * @return Article object
-        */
-       public static function articleFromTitle( $title, IContextSource $context ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return Article::newFromTitle( $title, $context );
-       }
-
-       /**
-        * Returns the name of the action that will be executed.
-        *
-        * @return string: action
-        */
-       public function getAction() {
-               static $action = null;
-               
-               if ( $action === null ) {
-                       $action = Action::getActionName( $this->context );
-               }
-
-               return $action;
-       }
-
        /**
         * Initialize the main Article object for "standard" actions (view, etc)
         * Create an Article object for the page, following redirects if needed.
@@ -392,70 +391,6 @@ class MediaWiki {
                return $article;
        }
 
-       /**
-        * Cleaning up request by doing deferred updates, DB transaction, and the output
-        */
-       public function finalCleanup() {
-               wfProfileIn( __METHOD__ );
-               // Now commit any transactions, so that unreported errors after
-               // output() don't roll back the whole DB transaction
-               $factory = wfGetLBFactory();
-               $factory->commitMasterChanges();
-               // Output everything!
-               $this->context->getOutput()->output();
-               // Do any deferred jobs
-               DeferredUpdates::doUpdates( 'commit' );
-               $this->doJobs();
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * Do a job from the job queue
-        */
-       private function doJobs() {
-               global $wgJobRunRate;
-
-               if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
-                       return;
-               }
-               if ( $wgJobRunRate < 1 ) {
-                       $max = mt_getrandmax();
-                       if ( mt_rand( 0, $max ) > $max * $wgJobRunRate ) {
-                               return;
-                       }
-                       $n = 1;
-               } else {
-                       $n = intval( $wgJobRunRate );
-               }
-
-               while ( $n-- && false != ( $job = Job::pop() ) ) {
-                       $output = $job->toString() . "\n";
-                       $t = - microtime( true );
-                       $success = $job->run();
-                       $t += microtime( true );
-                       $t = round( $t * 1000 );
-                       if ( !$success ) {
-                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
-                       } else {
-                               $output .= "Success, Time: $t ms\n";
-                       }
-                       wfDebugLog( 'jobqueue', $output );
-               }
-       }
-
-       /**
-        * Ends this task peacefully
-        */
-       public function restInPeace() {
-               MessageCache::logMessages();
-               wfLogProfilingData();
-               // Commit and close up!
-               $factory = wfGetLBFactory();
-               $factory->commitMasterChanges();
-               $factory->shutdown();
-               wfDebug( "Request ended normally\n" );
-       }
-
        /**
         * Perform one of the "standard" actions
         *
@@ -599,8 +534,72 @@ class MediaWiki {
                }
 
                $this->performRequest();
-               $this->finalCleanup();
+
+               // Now commit any transactions, so that unreported errors after
+               // output() don't roll back the whole DB transaction
+               wfGetLBFactory()->commitMasterChanges();
+
+               // Output everything!
+               $this->context->getOutput()->output();
 
                wfProfileOut( __METHOD__ );
        }
+
+       /**
+        * Ends this task peacefully
+        */
+       public function restInPeace() {
+               // Do any deferred jobs
+               DeferredUpdates::doUpdates( 'commit' );
+
+               // Execute a job from the queue
+               $this->doJobs();
+
+               // Log message usage, if $wgAdaptiveMessageCache is set to true
+               MessageCache::logMessages();
+
+               // Log profiling data, e.g. in the database or UDP
+               wfLogProfilingData();
+
+               // Commit and close up!
+               $factory = wfGetLBFactory();
+               $factory->commitMasterChanges();
+               $factory->shutdown();
+
+               wfDebug( "Request ended normally\n" );
+       }
+
+       /**
+        * Do a job from the job queue
+        */
+       private function doJobs() {
+               global $wgJobRunRate;
+
+               if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
+                       return;
+               }
+               if ( $wgJobRunRate < 1 ) {
+                       $max = mt_getrandmax();
+                       if ( mt_rand( 0, $max ) > $max * $wgJobRunRate ) {
+                               return;
+                       }
+                       $n = 1;
+               } else {
+                       $n = intval( $wgJobRunRate );
+               }
+
+               while ( $n-- && false != ( $job = Job::pop() ) ) {
+                       $output = $job->toString() . "\n";
+                       $t = - microtime( true );
+                       $success = $job->run();
+                       $t += microtime( true );
+                       $t = round( $t * 1000 );
+                       if ( !$success ) {
+                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+                       } else {
+                               $output .= "Success, Time: $t ms\n";
+                       }
+                       wfDebugLog( 'jobqueue', $output );
+               }
+       }
 }
index 1190172..4a5e2bc 100644 (file)
@@ -109,7 +109,7 @@ class WikiMap {
                $wiki = WikiMap::getWiki( $wikiID );
 
                if ( $wiki ) {
-                       return $wiki->getUrl( $page );
+                       return $wiki->getFullUrl( $page );
                }
 
                return false;
@@ -126,6 +126,13 @@ class WikiReference {
        private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
        private $mPath;   ///< path, '/wiki/$1'
 
+       /**
+        * @param $major string
+        * @param $minor string
+        * @param $canonicalServer string
+        * @param $path string
+        * @param $server null|string
+        */
        public function __construct( $major, $minor, $canonicalServer, $path, $server = null ) {
                $this->mMajor = $major;
                $this->mMinor = $minor;
@@ -186,8 +193,17 @@ class WikiReference {
                return $this->mCanonicalServer . $this->getLocalUrl( $page );
        }
 
+       /**
+        * Get a canonical server URL
+        * @return string
+        */
+       public function getCanonicalServer() {
+               return $this->mCanonicalServer;
+       }
+
        /**
         * Alias for getCanonicalUrl(), for backwards compatibility.
+        * @param $page string
         * @return String
         */
        public function getUrl( $page ) {
index c203e4f..a4e1d8d 100644 (file)
@@ -33,53 +33,9 @@ abstract class Page {}
  *
  * @internal documentation reviewed 15 Mar 2010
  */
-class WikiPage extends Page {
-       // doDeleteArticleReal() return values. Values less than zero indicate fatal errors,
-       // values greater than zero indicate that there were problems not resulting in page
-       // not being deleted
-
-       /**
-        * Delete operation aborted by hook
-        */
-       const DELETE_HOOK_ABORTED = -1;
-
-       /**
-        * Deletion successful
-        */
-       const DELETE_SUCCESS = 0;
-
-       /**
-        * Page not found
-        */
-       const DELETE_NO_PAGE = 1;
-
-       /**
-        * No revisions found to delete
-        */
-       const DELETE_NO_REVISIONS = 2;
-
+class WikiPage extends Page implements IDBAccessObject {
        // Constants for $mDataLoadedFrom and related
 
-       /**
-        * Data has not been loaded yet (or the object was cleared)
-        */
-       const DATA_NOT_LOADED = 0;
-
-       /**
-        * Data has been loaded from a slave database
-        */
-       const DATA_FROM_SLAVE = 1;
-
-       /**
-        * Data has been loaded from the master database
-        */
-       const DATA_FROM_MASTER = 2;
-
-       /**
-        * Data has been loaded from the master database using FOR UPDATE
-        */
-       const DATA_FOR_UPDATE = 3;
-
        /**
         * @var Title
         */
@@ -95,9 +51,9 @@ class WikiPage extends Page {
        /**@}}*/
 
        /**
-        * @var int; one of the DATA_* constants
+        * @var int; one of the READ_* constants
         */
-       protected $mDataLoadedFrom = self::DATA_NOT_LOADED;
+       protected $mDataLoadedFrom = self::READ_NONE;
 
        /**
         * @var Title
@@ -166,14 +122,14 @@ class WikiPage extends Page {
         *
         * @param $id Int article ID to load
         * @param $from string|int one of the following values:
-        *        - "fromdb" or self::DATA_FROM_SLAVE to select from a slave database
-        *        - "fromdbmaster" or self::DATA_FROM_MASTER to select from the master database
+        *        - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
+        *        - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
         *
         * @return WikiPage|null
         */
        public static function newFromID( $id, $from = 'fromdb' ) {
                $from = self::convertSelectType( $from );
-               $db = wfGetDB( $from === self::DATA_FROM_MASTER ? DB_MASTER : DB_SLAVE );
+               $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
                $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
                if ( !$row ) {
                        return null;
@@ -188,9 +144,9 @@ class WikiPage extends Page {
         * @param $row object: database row containing at least fields returned
         *        by selectFields().
         * @param $from string|int: source of $data:
-        *        - "fromdb" or self::DATA_FROM_SLAVE: from a slave DB
-        *        - "fromdbmaster" or self::DATA_FROM_MASTER: from the master DB
-        *        - "forupdate" or self::DATA_FOR_UPDATE: from the master DB using SELECT FOR UPDATE
+        *        - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
+        *        - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
+        *        - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
         * @return WikiPage
         */
        public static function newFromRow( $row, $from = 'fromdb' ) {
@@ -200,7 +156,7 @@ class WikiPage extends Page {
        }
 
        /**
-        * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to DATA_* constants.
+        * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to READ_* constants.
         *
         * @param $type object|string|int
         * @return mixed
@@ -208,11 +164,11 @@ class WikiPage extends Page {
        private static function convertSelectType( $type ) {
                switch ( $type ) {
                case 'fromdb':
-                       return self::DATA_FROM_SLAVE;
+                       return self::READ_NORMAL;
                case 'fromdbmaster':
-                       return self::DATA_FROM_MASTER;
+                       return self::READ_LATEST;
                case 'forupdate':
-                       return self::DATA_FOR_UPDATE;
+                       return self::READ_LOCKING;
                default:
                        // It may already be an integer or whatever else
                        return $type;
@@ -247,7 +203,7 @@ class WikiPage extends Page {
         */
        public function clear() {
                $this->mDataLoaded = false;
-               $this->mDataLoadedFrom = self::DATA_NOT_LOADED;
+               $this->mDataLoadedFrom = self::READ_NONE;
 
                $this->clearCacheFields();
        }
@@ -341,9 +297,9 @@ class WikiPage extends Page {
         *
         * @param $from object|string|int One of the following:
         *        - A DB query result object
-        *        - "fromdb" or self::DATA_FROM_SLAVE to get from a slave DB
-        *        - "fromdbmaster" or self::DATA_FROM_MASTER to get from the master DB
-        *        - "forupdate"  or self::DATA_FOR_UPDATE to get from the master DB using SELECT FOR UPDATE
+        *        - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB
+        *        - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB
+        *        - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB using SELECT FOR UPDATE
         *
         * @return void
         */
@@ -354,25 +310,25 @@ class WikiPage extends Page {
                        return;
                }
 
-               if ( $from === self::DATA_FOR_UPDATE ) {
+               if ( $from === self::READ_LOCKING ) {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
-               } elseif ( $from === self::DATA_FROM_MASTER ) {
+               } elseif ( $from === self::READ_LATEST ) {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
-               } elseif ( $from === self::DATA_FROM_SLAVE ) {
+               } elseif ( $from === self::READ_NORMAL ) {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
                        # Use a "last rev inserted" timestamp key to dimish the issue of slave lag.
                        # Note that DB also stores the master position in the session and checks it.
                        $touched = $this->getCachedLastEditTime();
                        if ( $touched ) { // key set
                                if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
-                                       $from = self::DATA_FROM_MASTER;
+                                       $from = self::READ_LATEST;
                                        $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
                                }
                        }
                } else {
                        // No idea from where the caller got this data, assume slave database.
                        $data = $from;
-                       $from = self::DATA_FROM_SLAVE;
+                       $from = self::READ_NORMAL;
                }
 
                $this->loadFromRow( $data, $from );
@@ -385,9 +341,9 @@ class WikiPage extends Page {
         * @param $data object: database row containing at least fields returned
         *        by selectFields()
         * @param $from string|int One of the following:
-        *        - "fromdb" or self::DATA_FROM_SLAVE if the data comes from a slave DB
-        *        - "fromdbmaster" or self::DATA_FROM_MASTER if the data comes from the master DB
-        *        - "forupdate"  or self::DATA_FOR_UPDATE if the data comes from from
+        *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
+        *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
+        *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from from
         *          the master DB using SELECT FOR UPDATE
         */
        public function loadFromRow( $data, $from ) {
@@ -564,7 +520,14 @@ class WikiPage extends Page {
                        return; // page doesn't exist or is missing page_latest info
                }
 
-               $revision = Revision::newFromPageId( $this->getId(), $latest );
+               // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always includes the
+               // latest changes committed. This is true even within REPEATABLE-READ transactions, where
+               // S1 normally only sees changes committed before the first S1 SELECT. Thus we need S1 to
+               // also gets the revision row FOR UPDATE; otherwise, it may not find it since a page row
+               // UPDATE and revision row INSERT by S2 may have happened after the first S1 SELECT.
+               // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read.
+               $flags = ( $this->mDataLoadedFrom == self::READ_LOCKING ) ? Revision::READ_LOCKING : 0;
+               $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
                if ( $revision ) { // sanity
                        $this->setLastEdit( $revision );
                }
@@ -928,10 +891,10 @@ class WikiPage extends Page {
                $tables = array( 'revision', 'user' );
 
                $fields = array(
-                       'rev_user as user_id',
-                       'rev_user_text AS user_name',
+                       'user_id' => 'rev_user',
+                       'user_name' => 'rev_user_text',
                        $realNameField,
-                       'MAX(rev_timestamp) AS timestamp',
+                       'timestamp' => 'MAX(rev_timestamp)',
                );
 
                $conds = array( 'rev_page' => $this->getId() );
@@ -1205,7 +1168,7 @@ class WikiPage extends Page {
                        $conditions,
                        __METHOD__ );
 
-               $result = $dbw->affectedRows() != 0;
+               $result = $dbw->affectedRows() > 0;
                if ( $result ) {
                        $this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
                        $this->setLastEdit( $revision );
@@ -1445,7 +1408,7 @@ class WikiPage extends Page {
         *  Compatibility note: this function previously returned a boolean value indicating success/failure
         */
        public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
-               global $wgUser, $wgUseAutomaticEditSummaries;
+               global $wgUser, $wgUseAutomaticEditSummaries, $wgUseRCPatrol, $wgUseNPPatrol;
 
                # Low-level sanity check
                if ( $this->mTitle->getText() === '' ) {
@@ -1511,6 +1474,10 @@ class WikiPage extends Page {
 
                                wfProfileOut( __METHOD__ );
                                return $status;
+                       } elseif ( $oldtext === false ) {
+                               # Sanity check for bug 37225
+                               wfProfileOut( __METHOD__ );
+                               throw new MWException( "Could not find text for current revision {$oldid}." );
                        }
 
                        $revision = new Revision( array(
@@ -1523,6 +1490,9 @@ class WikiPage extends Page {
                                'user_text'  => $user->getName(),
                                'timestamp'  => $now
                        ) );
+                       # Bug 37225: use accessor to get the text as Revision may trim it.
+                       # After trimming, the text may be a duplicate of the current text.
+                       $text = $revision->getText(); // sanity; EditPage should trim already
 
                        $changed = ( strcmp( $text, $oldtext ) != 0 );
 
@@ -1540,45 +1510,40 @@ class WikiPage extends Page {
                                $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
 
                                if ( !$ok ) {
-                                       /* Belated edit conflict! Run away!! */
+                                       # Belated edit conflict! Run away!!
                                        $status->fatal( 'edit-conflict' );
 
-                                       $revisionId = 0;
                                        $dbw->rollback( __METHOD__ );
-                               } else {
-                                       global $wgUseRCPatrol;
-                                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
-                                       # Update recentchanges
-                                       if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                                               # Mark as patrolled if the user can do so
-                                               $patrolled = $wgUseRCPatrol && !count(
-                                                       $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                                               # Add RC row to the DB
-                                               $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
-                                                       $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
-                                                       $revisionId, $patrolled
-                                               );
-
-                                               # Log auto-patrolled edits
-                                               if ( $patrolled ) {
-                                                       PatrolLog::record( $rc, true, $user );
-                                               }
+
+                                       wfProfileOut( __METHOD__ );
+                                       return $status;
+                               }
+
+                               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
+                               # Update recentchanges
+                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                                       # Mark as patrolled if the user can do so
+                                       $patrolled = $wgUseRCPatrol && !count(
+                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                                       # Add RC row to the DB
+                                       $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
+                                               $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
+                                               $revisionId, $patrolled
+                                       );
+
+                                       # Log auto-patrolled edits
+                                       if ( $patrolled ) {
+                                               PatrolLog::record( $rc, true, $user );
                                        }
-                                       $user->incEditCount();
-                                       $dbw->commit( __METHOD__ );
                                }
+                               $user->incEditCount();
+                               $dbw->commit( __METHOD__ );
                        } else {
                                // Bug 32948: revision ID must be set to page {{REVISIONID}} and
                                // related variables correctly
                                $revision->setId( $this->getLatest() );
                        }
 
-                       // Now that ignore_user_abort is restored, we can respond to fatal errors
-                       if ( !$status->isOK() ) {
-                               wfProfileOut( __METHOD__ );
-                               return $status;
-                       }
-
                        # Update links tables, site stats, etc.
                        $this->doEditUpdates( $revision, $user, array( 'changed' => $changed,
                                'oldcountable' => $oldcountable ) );
@@ -1620,6 +1585,9 @@ class WikiPage extends Page {
                        ) );
                        $revisionId = $revision->insertOn( $dbw );
 
+                       # Bug 37225: use accessor to get the text as Revision may trim it
+                       $text = $revision->getText(); // sanity; EditPage should trim already
+
                        # Update the page record with revision data
                        $this->updateRevisionOn( $dbw, $revision, 0 );
 
@@ -1627,8 +1595,6 @@ class WikiPage extends Page {
 
                        # Update recentchanges
                        if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                               global $wgUseRCPatrol, $wgUseNPPatrol;
-
                                # Mark as patrolled if the user can do so
                                $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
                                        $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
@@ -1822,9 +1788,9 @@ class WikiPage extends Page {
                                        wfDebug( __METHOD__ . ": invalid username\n" );
                                } elseif ( User::isIP( $shortTitle ) ) {
                                        // An anonymous user
-                                       $other->setNewtalk( true );
+                                       $other->setNewtalk( true, $revision );
                                } elseif ( $other->isLoggedIn() ) {
-                                       $other->setNewtalk( true );
+                                       $other->setNewtalk( true, $revision );
                                } else {
                                        wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
                                }
@@ -2105,15 +2071,15 @@ class WikiPage extends Page {
        }
 
        /**
-        * Same as doDeleteArticleReal(), but returns more detailed success/failure status
+        * Same as doDeleteArticleReal(), but returns a simple boolean. This is kept around for
+        * backwards compatibility, if you care about error reporting you should use
+        * doDeleteArticleReal() instead.
+        *
         * Deletes the article with database consistency, writes logs, purges caches
         *
         * @param $reason string delete reason for deletion log
-        * @param $suppress int bitfield
-        *      Revision::DELETED_TEXT
-        *      Revision::DELETED_COMMENT
-        *      Revision::DELETED_USER
-        *      Revision::DELETED_RESTRICTED
+        * @param $suppress boolean suppress all revisions and log the deletion in
+        *        the suppression log instead of the deletion log
         * @param $id int article ID
         * @param $commit boolean defaults to true, triggers transaction end
         * @param &$error Array of errors to append to
@@ -2123,25 +2089,25 @@ class WikiPage extends Page {
        public function doDeleteArticle(
                $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
        ) {
-               return $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user )
-                       == WikiPage::DELETE_SUCCESS;
+               $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
+               return $status->isGood();
        }
 
        /**
         * Back-end article deletion
         * Deletes the article with database consistency, writes logs, purges caches
         *
+        * @since 1.19
+        *
         * @param $reason string delete reason for deletion log
-        * @param $suppress int bitfield
-        *      Revision::DELETED_TEXT
-        *      Revision::DELETED_COMMENT
-        *      Revision::DELETED_USER
-        *      Revision::DELETED_RESTRICTED
-        * @param $id int article ID
+        * @param $suppress boolean suppress all revisions and log the deletion in
+        *        the suppression log instead of the deletion log
         * @param $commit boolean defaults to true, triggers transaction end
         * @param &$error Array of errors to append to
         * @param $user User The deleting user
-        * @return int: One of WikiPage::DELETE_* constants
+        * @return Status: Status object; if successful, $status->value is the log_id of the
+        *                 deletion log entry. If the page couldn't be deleted because it wasn't
+        *                 found, $status is a non-fatal 'cannotdelete' error
         */
        public function doDeleteArticleReal(
                $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
@@ -2150,20 +2116,28 @@ class WikiPage extends Page {
 
                wfDebug( __METHOD__ . "\n" );
 
+               $status = Status::newGood();
+
                if ( $this->mTitle->getDBkey() === '' ) {
-                       return WikiPage::DELETE_NO_PAGE;
+                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       return $status;
                }
 
                $user = is_null( $user ) ? $wgUser : $user;
-               if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error ) ) ) {
-                       return WikiPage::DELETE_HOOK_ABORTED;
+               if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
+                       if ( $status->isOK() ) {
+                               // Hook aborted but didn't set a fatal status
+                               $status->fatal( 'delete-hook-aborted' );
+                       }
+                       return $status;
                }
 
                if ( $id == 0 ) {
                        $this->loadPageData( 'forupdate' );
                        $id = $this->getID();
                        if ( $id == 0 ) {
-                               return WikiPage::DELETE_NO_PAGE;
+                               $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                               return $status;
                        }
                }
 
@@ -2221,7 +2195,8 @@ class WikiPage extends Page {
 
                if ( !$ok ) {
                        $dbw->rollback( __METHOD__ );
-                       return WikiPage::DELETE_NO_REVISIONS;
+                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       return $status;
                }
 
                $this->doDeleteUpdates( $id );
@@ -2241,7 +2216,8 @@ class WikiPage extends Page {
                }
 
                wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id ) );
-               return WikiPage::DELETE_SUCCESS;
+               $status->value = $logid;
+               return $status;
        }
 
        /**
@@ -2407,7 +2383,7 @@ class WikiPage extends Page {
                                array( /* WHERE */
                                        'rc_cur_id' => $current->getPage(),
                                        'rc_user_text' => $current->getUserText(),
-                                       "rc_timestamp > '{$s->rev_timestamp}'",
+                                       'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
                                ), __METHOD__
                        );
                }
@@ -2430,6 +2406,9 @@ class WikiPage extends Page {
                );
                $summary = wfMsgReplaceArgs( $summary, $args );
 
+               # Truncate for whole multibyte characters.
+               $summary = $wgContLang->truncate( $summary, 255 );
+
                # Save
                $flags = EDIT_UPDATE;
 
@@ -2605,7 +2584,7 @@ class WikiPage extends Page {
                if ( is_object( $rt ) && ( !is_object( $ot ) || !$rt->equals( $ot ) || $ot->getFragment() != $rt->getFragment() ) ) {
                        $truncatedtext = $wgContLang->truncate(
                                str_replace( "\n", ' ', $newtext ),
-                               max( 0, 250
+                               max( 0, 255
                                        - strlen( wfMsgForContent( 'autoredircomment' ) )
                                        - strlen( $rt->getFullText() )
                                ) );
index 6e4bb3a..120312d 100644 (file)
@@ -166,7 +166,7 @@ class Xml {
                if( is_null( $selected ) )
                        $selected = '';
                if( !is_null( $allmonths ) )
-                       $options[] = self::option( wfMsg( 'monthsall' ), $allmonths, $selected === $allmonths );
+                       $options[] = self::option( wfMessage( 'monthsall' )->text(), $allmonths, $selected === $allmonths );
                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' ) )
@@ -198,9 +198,9 @@ class Xml {
                } else {
                        $encYear = '';
                }
-               return Xml::label( wfMsg( 'year' ), 'year' ) . ' '.
+               return Xml::label( wfMessage( 'year' )->text(), 'year' ) . ' '.
                        Xml::input( 'year', 4, $encYear, array('id' => 'year', 'maxlength' => 4) ) . ' '.
-                       Xml::label( wfMsg( 'month' ), 'month' ) . ' '.
+                       Xml::label( wfMessage( 'month' )->text(), 'month' ) . ' '.
                        Xml::monthSelector( $encMonth, -1 );
        }
 
@@ -210,15 +210,18 @@ class Xml {
         * @param string $selected The language code of the selected language
         * @param boolean $customisedOnly If true only languages which have some content are listed
         * @param string $inLanguage The ISO code of the language to display the select list in (optional)
+        * @param array $overrideAttrs Override the attributes of the select tag (since 1.20)
+        * @param Message|null $msg Label message key (since 1.20)
         * @return array containing 2 items: label HTML and select list HTML
         */
-       public static function languageSelector( $selected, $customisedOnly = true, $inLanguage = null ) {
+       public static function languageSelector( $selected, $customisedOnly = true, $inLanguage = null, $overrideAttrs = array(), Message $msg = null ) {
                global $wgLanguageCode;
 
-               $languages = Language::fetchLanguageNames( $inLanguage, $customisedOnly ? 'mwfile' : 'mw' );
+               $include = $customisedOnly ? 'mwfile' : 'mw';
+               $languages = Language::fetchLanguageNames( $inLanguage, $include );
 
-               // Make sure the site language is in the list; a custom language code might not have a
-               // defined name...
+               // 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 ) ) {
                        $languages[$wgLanguageCode] = $wgLanguageCode;
                }
@@ -228,7 +231,7 @@ class Xml {
                /**
                 * If a bogus value is set, default to the content language.
                 * Otherwise, no default is selected and the user ends up
-                * with an Afrikaans interface since it's first in the list.
+                * with Afrikaans since it's first in the list.
                 */
                $selected = isset( $languages[$selected] ) ? $selected : $wgLanguageCode;
                $options = "\n";
@@ -236,12 +239,15 @@ class Xml {
                        $options .= Xml::option( "$code - $name", $code, ($code == $selected) ) . "\n";
                }
 
+               $attrs = array( 'id' => 'wpUserLanguage', 'name' => 'wpUserLanguage' );
+               $attrs = array_merge( $attrs, $overrideAttrs );
+
+               if( $msg === null ) {
+                       $msg = wfMessage( 'yourlanguage' );
+               }
                return array(
-                       Xml::label( wfMsg('yourlanguage'), 'wpUserLanguage' ),
-                       Xml::tags( 'select',
-                               array( 'id' => 'wpUserLanguage', 'name' => 'wpUserLanguage' ),
-                               $options
-                       )
+                       Xml::label( $msg->text(), $attrs['id'] ),
+                       Xml::tags( 'select', $attrs, $options )
                );
 
        }
@@ -766,7 +772,7 @@ class Xml {
                foreach( $fields as $labelmsg => $input ) {
                        $id = "mw-$labelmsg";
                        $form .= Xml::openElement( 'tr', array( 'id' => $id ) );
-                       $form .= Xml::tags( 'td', array('class' => 'mw-label'), wfMsgExt( $labelmsg, array('parseinline') ) );
+                       $form .= Xml::tags( 'td', array('class' => 'mw-label'), wfMessage( $labelmsg )->parse() );
                        $form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) ) . $input . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
@@ -774,7 +780,7 @@ class Xml {
                if( $submitLabel ) {
                        $form .= Xml::openElement( 'tr' );
                        $form .= Xml::tags( 'td', array(), '' );
-                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMsg( $submitLabel ) ) . Xml::closeElement( 'td' );
+                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text() ) . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
 
index 2a2d31e..b98f521 100644 (file)
@@ -2570,7 +2570,6 @@ $zh2Hant = array(
 '龚' => '龔',
 '龛' => '龕',
 '龟' => '龜',
-'' => '棡',
 '𠮶' => '嗰',
 '𡒄' => '壈',
 '𦈖' => '䌈',
@@ -7062,6 +7061,7 @@ $zh2Hant = array(
 '皇庄' => '皇莊',
 '皓发' => '皓髮',
 '皮制服' => '皮制服',
+'皮肤' => '皮膚',
 '皮里春秋' => '皮裡春秋',
 '皮里阳秋' => '皮裡陽秋',
 '皮制' => '皮製',
@@ -8410,6 +8410,7 @@ $zh2Hant = array(
 '跌扑' => '跌扑',
 '跌荡' => '跌蕩',
 '路签' => '路籤',
+'路面' => '路面',
 '跳梁小丑' => '跳樑小丑',
 '跳荡' => '跳蕩',
 '跳表' => '跳錶',
@@ -10389,7 +10390,6 @@ $zh2Hans = array(
 '棖' => '枨',
 '棗' => '枣',
 '棟' => '栋',
-'棡' => '',
 '棧' => '栈',
 '棲' => '栖',
 '棶' => '梾',
@@ -18194,7 +18194,6 @@ $zh2CN = array(
 '攜帶型' => '便携式',
 '資訊理論' => '信息论',
 '母音' => '元音',
-'游標' => '光标',
 '光碟' => '光盘',
 '光碟機' => '光驱',
 '柯林頓' => '克林顿',
@@ -18457,4 +18456,4 @@ $zh2SG = array(
 '笨豬跳' => '绑紧跳',
 '蹦极跳' => '绑紧跳',
 '笑星' => '谐星',
-);
\ No newline at end of file
+);
index 5b96b40..0e84583 100644 (file)
@@ -696,10 +696,10 @@ class ZipDirectoryReader {
  * Internal exception class. Will be caught by private code.
  */
 class ZipDirectoryReaderError extends Exception {
-       var $code;
+       var $errorCode;
 
        function __construct( $code ) {
-               $this->code = $code;
+               $this->errorCode = $code;
                parent::__construct( "ZipDirectoryReader error: $code" );
        }
 
@@ -707,6 +707,6 @@ class ZipDirectoryReaderError extends Exception {
         * @return mixed
         */
        function getErrorCode() {
-               return $this->code;
+               return $this->errorCode;
        }
 }
index 50d210f..1c57f25 100644 (file)
@@ -248,8 +248,8 @@ class HistoryAction extends FormlessAction {
 
                $feed = new $wgFeedClasses[$type](
                        $this->getTitle()->getPrefixedText() . ' - ' .
-                       wfMsgForContent( 'history-feed-title' ),
-                       wfMsgForContent( 'history-feed-description' ),
+                       $this->msg( 'history-feed-title' )->inContentLanguage()->text(),
+                       $this->msg( 'history-feed-description' )->inContentLanguage()->text(),
                        $this->getTitle()->getFullUrl( 'action=history' )
                );
 
@@ -275,8 +275,8 @@ class HistoryAction extends FormlessAction {
 
        function feedEmpty() {
                return new FeedItem(
-                       wfMsgForContent( 'nohistory' ),
-                       $this->getOutput()->parse( wfMsgForContent( 'history-feed-empty' ) ),
+                       $this->msg( 'nohistory' )->inContentLanguage()->text(),
+                       $this->msg( 'history-feed-empty' )->inContentLanguage()->parseAsBlock(),
                        $this->getTitle()->getFullUrl(),
                        wfTimestamp( TS_MW ),
                        '',
@@ -304,15 +304,14 @@ class HistoryAction extends FormlessAction {
                );
                if ( $rev->getComment() == '' ) {
                        global $wgContLang;
-                       $title = wfMsgForContent( 'history-feed-item-nocomment',
+                       $title = $this->msg( 'history-feed-item-nocomment',
                                $rev->getUserText(),
                                $wgContLang->timeanddate( $rev->getTimestamp() ),
                                $wgContLang->date( $rev->getTimestamp() ),
-                               $wgContLang->time( $rev->getTimestamp() )
-                       );
+                               $wgContLang->time( $rev->getTimestamp() ) )->inContentLanguage()->text();
                } else {
                        $title = $rev->getUserText() .
-                       wfMsgForContent( 'colon-separator' ) .
+                       $this->msg( 'colon-separator' )->inContentLanguage()->text() .
                        FeedItem::stripComment( $rev->getComment() );
                }
                return new FeedItem(
@@ -418,34 +417,11 @@ class HistoryPager extends ReverseChronologicalPager {
                                $batch->add( NS_USER_TALK, $row->rev_user_text );
                        }
                }
-               $this->parentLens = $this->getParentLengths( $revIds );
+               $this->parentLens = Revision::getParentLengths( $this->mDb, $revIds );
                $batch->execute();
                $this->mResult->seek( 0 );
        }
 
-       /**
-        * Do a batched query to get the parent revision lengths
-        * @param $revIds array
-        * @return array
-        * @TODO: stolen from Contributions, refactor
-        */
-       private function getParentLengths( array $revIds ) {
-               $revLens = array();
-               if ( !$revIds ) {
-                       return $revLens; // empty
-               }
-               wfProfileIn( __METHOD__ );
-               $res = $this->mDb->select( 'revision',
-                       array( 'rev_id', 'rev_len' ),
-                       array( 'rev_id' => $revIds ),
-                       __METHOD__ );
-               foreach ( $res as $row ) {
-                       $revLens[$row->rev_id] = $row->rev_len;
-               }
-               wfProfileOut( __METHOD__ );
-               return $revLens;
-       }
-
        /**
         * Creates begin of history list with a submit button
         *
@@ -635,18 +611,17 @@ class HistoryPager extends ReverseChronologicalPager {
 
                if ( $notificationtimestamp && ( $row->rev_timestamp >= $notificationtimestamp ) ) {
                        $s2 .= ' <span class="updatedmarker">' .  $this->msg( 'updatedmarker' )->escaped() . '</span>';
+                       $classes[] = 'mw-history-line-updated';
                }
 
                $tools = array();
 
                # Rollback and undo links
-               if ( $prevRev &&
-                       !count( $this->getTitle()->getUserPermissionsErrors( 'edit', $this->getUser() ) ) )
-               {
-                       if ( $latest && !count( $this->getTitle()->getUserPermissionsErrors( 'rollback', $this->getUser() ) ) ) {
+               if ( $prevRev && $this->getTitle()->quickUserCan( 'edit', $user ) ) {
+                       if ( $latest && $this->getTitle()->quickUserCan( 'rollback', $user ) ) {
                                $this->preventClickjacking();
                                $tools[] = '<span class="mw-rollback-link">' .
-                                       Linker::buildRollbackLink( $rev ) . '</span>';
+                                       Linker::buildRollbackLink( $rev, $this->getContext() ) . '</span>';
                        }
 
                        if ( !$rev->isDeleted( Revision::DELETED_TEXT )
index 543beb7..6c21306 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
- * Display informations about a page.
- * Very inefficient for the moment.
+ * Displays information about a page.
  *
  * Copyright © 2011 Alexandre Emsenhuber
  *
  */
 
 class InfoAction extends FormlessAction {
-
+       /**
+        * Returns the name of the action this object responds to.
+        *
+        * @return string lowercase
+        */
        public function getName() {
                return 'info';
        }
 
-       protected function getDescription() {
-               return '';
+       /**
+        * Whether this action can still be executed by a blocked user.
+        *
+        * @return bool
+        */
+       public function requiresUnblock() {
+               return false;
        }
 
+       /**
+        * Whether this action requires the wiki not to be locked.
+        *
+        * @return bool
+        */
        public function requiresWrite() {
                return false;
        }
 
-       public function requiresUnblock() {
-               return false;
-       }
+       /**
+        * Shows page information on GET request.
+        *
+        * @return string Page information that will be added to the output
+        */
+       public function onView() {
+               global $wgContLang, $wgDisableCounters, $wgRCMaxAge, $wgRestrictionTypes;
 
-       protected function getPageTitle() {
-               return $this->msg( 'pageinfo-title', $this->getTitle()->getSubjectPage()->getPrefixedText() )->text();
-       }
+               $user = $this->getUser();
+               $lang = $this->getLanguage();
+               $title = $this->getTitle();
+               $id = $title->getArticleID();
 
-       public function onView() {
-               global $wgDisableCounters;
-
-               $title = $this->getTitle()->getSubjectPage();
-
-               $pageInfo = self::pageCountInfo( $title );
-               $talkInfo = self::pageCountInfo( $title->getTalkPage() );
-
-               return Html::rawElement( 'table', array( 'class' => 'wikitable mw-page-info' ),
-                       Html::rawElement( 'tr', array(),
-                               Html::element( 'th', array(), '' ) .
-                               Html::element( 'th', array(), $this->msg( 'pageinfo-subjectpage' )->text() ) .
-                               Html::element( 'th', array(), $this->msg( 'pageinfo-talkpage' )->text() )
-                       ) .
-                       Html::rawElement( 'tr', array(),
-                               Html::element( 'th', array( 'colspan' => 3 ), $this->msg( 'pageinfo-header-edits' )->text() )
-                       ) .
-                       Html::rawElement( 'tr', array(),
-                               Html::element( 'td', array(), $this->msg( 'pageinfo-edits' )->text() ) .
-                               Html::element( 'td', array(), $this->getLanguage()->formatNum( $pageInfo['edits'] ) ) .
-                               Html::element( 'td', array(), $this->getLanguage()->formatNum( $talkInfo['edits'] ) )
-                       ) .
-                       Html::rawElement( 'tr', array(),
-                               Html::element( 'td', array(), $this->msg( 'pageinfo-authors' )->text() ) .
-                               Html::element( 'td', array(), $this->getLanguage()->formatNum( $pageInfo['authors'] ) ) .
-                               Html::element( 'td', array(), $this->getLanguage()->formatNum( $talkInfo['authors'] ) )
-                       ) .
-                       ( !$this->getUser()->isAllowed( 'unwatchedpages' ) ? '' :
-                               Html::rawElement( 'tr', array(),
-                                       Html::element( 'th', array( 'colspan' => 3 ), $this->msg( 'pageinfo-header-watchlist' )->text() )
-                               ) .
-                               Html::rawElement( 'tr', array(),
-                                       Html::element( 'td', array(), $this->msg( 'pageinfo-watchers' )->text() ) .
-                                       Html::element( 'td', array( 'colspan' => 2 ), $this->getLanguage()->formatNum( $pageInfo['watchers'] ) )
-                               )
-                       ).
-                       ( $wgDisableCounters ? '' :
-                               Html::rawElement( 'tr', array(),
-                                       Html::element( 'th', array( 'colspan' => 3 ), $this->msg( 'pageinfo-header-views' )->text() )
-                               ) .
-                               Html::rawElement( 'tr', array(),
-                                       Html::element( 'td', array(), $this->msg( 'pageinfo-views' )->text() ) .
-                                       Html::element( 'td', array(), $this->getLanguage()->formatNum( $pageInfo['views'] ) ) .
-                                       Html::element( 'td', array(), $this->getLanguage()->formatNum( $talkInfo['views'] ) )
-                               ) .
-                               Html::rawElement( 'tr', array(),
-                                       Html::element( 'td', array(), $this->msg( 'pageinfo-viewsperedit' )->text() ) .
-                                       Html::element( 'td', array(), $this->getLanguage()->formatNum( sprintf( '%.2f', $pageInfo['edits'] ? $pageInfo['views'] / $pageInfo['edits'] : 0 ) ) ) .
-                                       Html::element( 'td', array(), $this->getLanguage()->formatNum( sprintf( '%.2f', $talkInfo['edits'] ? $talkInfo['views'] / $talkInfo['edits'] : 0 ) ) )
-                               )
-                       )
+               // Get page information that would be too "expensive" to retrieve by normal means
+               $userCanViewUnwatchedPages = $user->isAllowed( 'unwatchedpages' );
+               $pageInfo = self::pageCountInfo( $title, $userCanViewUnwatchedPages, $wgDisableCounters );
+
+               // Get page properties
+               $dbr = wfGetDB( DB_SLAVE );
+               $result = $dbr->select(
+                       'page_props',
+                       array( 'pp_propname', 'pp_value' ),
+                       array( 'pp_page' => $id ),
+                       __METHOD__
                );
+
+               $pageProperties = array();
+               foreach ( $result as $row ) {
+                       $pageProperties[$row->pp_propname] = $row->pp_value;
+               }
+
+               $content = '';
+               $table = '';
+
+               // Header
+               if ( !$this->msg( 'pageinfo-header' )->isDisabled() ) {
+                       $content .= $this->msg( 'pageinfo-header ' )->parse();
+               }
+
+               // Basic information
+               $content = $this->addHeader( $content, $this->msg( 'pageinfo-header-basic' )->text() );
+
+               // Display title
+               $displayTitle = $title->getPrefixedText();
+               if ( !empty( $pageProperties['displaytitle'] ) ) {
+                       $displayTitle = $pageProperties['displaytitle'];
+               }
+
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-display-title' )->escaped(), $displayTitle );
+
+               // Default sort key
+               $sortKey = $title->getCategorySortKey();
+               if ( !empty( $pageProperties['defaultsort'] ) ) {
+                       $sortKey = $pageProperties['defaultsort'];
+               }
+
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-default-sort' )->escaped(), $sortKey );
+
+               // Page length (in bytes)
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-length' )->escaped(), $lang->formatNum( $title->getLength() ) );
+
+               // Page ID (number not localised, as it's a database ID.)
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-article-id' )->escaped(), $id );
+
+               // Search engine status
+               $pOutput = new ParserOutput();
+               if ( isset( $pageProperties['noindex'] ) ) {
+                       $pOutput->setIndexPolicy( 'noindex' );
+               }
+
+               // Use robot policy logic
+               $policy = $this->page->getRobotPolicy( 'view', $pOutput );
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-robot-policy' )->escaped(),
+                       $this->msg( "pageinfo-robot-${policy['index']}" )->escaped()
+               );
+
+               if ( !$wgDisableCounters ) {
+                       // Number of views
+                       $table = $this->addRow( $table,
+                               $this->msg( 'pageinfo-views' )->escaped(), $lang->formatNum( $pageInfo['views'] )
+                       );
+               }
+
+               if ( $userCanViewUnwatchedPages ) {
+                       // Number of page watchers
+                       $table = $this->addRow( $table,
+                               $this->msg( 'pageinfo-watchers' )->escaped(), $lang->formatNum( $pageInfo['watchers'] ) );
+               }
+
+               // Redirects to this page
+               $whatLinksHere = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
+               $table = $this->addRow( $table,
+                       Linker::link(
+                               $whatLinksHere,
+                               $this->msg( 'pageinfo-redirects-name' )->escaped(),
+                               array(),
+                               array( 'hidelinks' => 1, 'hidetrans' => 1 )
+                       ),
+                       $this->msg( 'pageinfo-redirects-value' )
+                               ->numParams( count( $title->getRedirectsHere() ) )->escaped()
+               );
+
+               // Subpages of this page
+               $prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' );
+               $table = $this->addRow( $table,
+                       Linker::link( $prefixIndex, $this->msg( 'pageinfo-subpages-name' )->escaped() ),
+                       $this->msg( 'pageinfo-subpages-value' )
+                               ->numParams(
+                                       $pageInfo['subpages']['total'],
+                                       $pageInfo['subpages']['redirects'],
+                                       $pageInfo['subpages']['nonredirects'] )->escaped()
+               );
+
+               // Page protection
+               $content = $this->addTable( $content, $table );
+               $content = $this->addHeader( $content, $this->msg( 'pageinfo-header-restrictions' )->text() );
+               $table = '';
+
+               // Page protection
+               foreach ( $wgRestrictionTypes as $restrictionType ) {
+                       $protectionLevel = implode( ', ', $title->getRestrictions( $restrictionType ) );
+                       if ( $protectionLevel == '' ) {
+                               // Allow all users
+                               $message = $this->msg( 'protect-default' )->escaped();
+                       } else {
+                               // Administrators only
+                               $message = $this->msg( "protect-level-$protectionLevel" );
+                               if ( $message->isDisabled() ) {
+                                       // Require "$1" permission
+                                       $message = $this->msg( "protect-fallback", $protectionLevel )->parse();
+                               } else {
+                                       $message = $message->escaped();
+                               }
+                       }
+
+                       $table = $this->addRow( $table,
+                               $this->msg( 'pageinfo-restriction',
+                                       $this->msg( "restriction-$restrictionType" )->plain()
+                               )->parse(), $message
+                       );
+               }
+
+               // Edit history
+               $content = $this->addTable( $content, $table );
+               $content = $this->addHeader( $content, $this->msg( 'pageinfo-header-edits' )->text() );
+               $table = '';
+
+               // Page creator
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-firstuser' )->escaped(), $pageInfo['firstuser']
+               );
+
+               // Date of page creation
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-firsttime' )->escaped(), $lang->userTimeAndDate( $pageInfo['firsttime'], $user )
+               );
+
+               // Latest editor
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-lastuser' )->escaped(), $pageInfo['lastuser']
+               );
+
+               // Date of latest edit
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-lasttime' )->escaped(), $lang->userTimeAndDate( $pageInfo['lasttime'], $user )
+               );
+
+               // Total number of edits
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-edits' )->escaped(), $lang->formatNum( $pageInfo['edits'] )
+               );
+
+               // Total number of distinct authors
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-authors' )->escaped(), $lang->formatNum( $pageInfo['authors'] )
+               );
+
+               // Recent number of edits (within past 30 days)
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-recent-edits', $lang->formatDuration( $wgRCMaxAge ) )->escaped(),
+                       $lang->formatNum( $pageInfo['recent_edits'] )
+               );
+
+               // Recent number of distinct authors
+               $table = $this->addRow( $table,
+                       $this->msg( 'pageinfo-recent-authors' )->escaped(), $lang->formatNum( $pageInfo['recent_authors'] )
+               );
+
+               $content = $this->addTable( $content, $table );
+
+               // Array of MagicWord objects
+               $magicWords = MagicWord::getDoubleUnderscoreArray();
+
+               // Array of magic word IDs
+               $wordIDs = $magicWords->names;
+
+               // Array of IDs => localized magic words
+               $localizedWords = $wgContLang->getMagicWords();
+
+               $listItems = array();
+               foreach ( $pageProperties as $property => $value ) {
+                       if ( in_array( $property, $wordIDs ) ) {
+                               $listItems[] = Html::element( 'li', array(), $localizedWords[$property][1] );
+                       }
+               }
+
+               $localizedList = Html::rawElement( 'ul', array(), implode( '', $listItems ) );
+               $hiddenCategories = $this->page->getHiddenCategories();
+               $transcludedTemplates = $title->getTemplateLinksFrom();
+
+               if ( count( $listItems ) > 0
+                       || count( $hiddenCategories ) > 0
+                       || count( $transcludedTemplates ) > 0 ) {
+                       // Page properties
+                       $content = $this->addHeader( $content, $this->msg( 'pageinfo-header-properties' )->text() );
+                       $table = '';
+
+                       // Magic words
+                       if ( count( $listItems ) > 0 ) {
+                               $table = $this->addRow( $table,
+                                       $this->msg( 'pageinfo-magic-words' )->numParams( count( $listItems ) )->escaped(),
+                                       $localizedList
+                               );
+                       }
+
+                       // Hide "This page is a member of # hidden categories explanation
+                       $content .= Html::element( 'style', array(),
+                               '.mw-hiddenCategoriesExplanation { display: none; }' );
+
+                       // Hidden categories
+                       if ( count( $hiddenCategories ) > 0 ) {
+                               $table = $this->addRow( $table,
+                                       $this->msg( 'pageinfo-hidden-categories' )
+                                               ->numParams( count( $hiddenCategories ) )->escaped(),
+                                       Linker::formatHiddenCategories( $hiddenCategories )
+                               );
+                       }
+
+                       // Hide "Templates used on this page:" explanation
+                       $content .= Html::element( 'style', array(),
+                               '.mw-templatesUsedExplanation { display: none; }' );
+
+                       // Transcluded templates
+                       if ( count( $transcludedTemplates ) > 0 ) {
+                               $table = $this->addRow( $table,
+                                       $this->msg( 'pageinfo-templates' )
+                                               ->numParams( count( $transcludedTemplates ) )->escaped(),
+                                       Linker::formatTemplates( $transcludedTemplates )
+                               );
+                       }
+
+                       $content = $this->addTable( $content, $table );
+               }
+
+               // Footer
+               if ( !$this->msg( 'pageinfo-footer' )->isDisabled() ) {
+                       $content .= $this->msg( 'pageinfo-footer' )->parse();
+               }
+
+               return $content;
        }
 
        /**
-        * Return the total number of edits and number of unique editors
-        * on a given page. If page does not exist, returns false.
+        * Returns page information that would be too "expensive" to retrieve by normal means.
         *
         * @param $title Title object
-        * @return mixed array or boolean false
+        * @param $canViewUnwatched bool
+        * @param $disableCounter bool
+        * @return array
         */
-       public static function pageCountInfo( $title ) {
+       public static function pageCountInfo( $title, $canViewUnwatched, $disableCounter ) {
+               global $wgRCMaxAge;
+
+               wfProfileIn( __METHOD__ );
                $id = $title->getArticleID();
+
                $dbr = wfGetDB( DB_SLAVE );
+               $result = array();
 
-               $watchers = (int)$dbr->selectField(
-                       'watchlist',
-                       'COUNT(*)',
-                       array(
-                               'wl_title'     => $title->getDBkey(),
-                               'wl_namespace' => $title->getNamespace()
-                       ),
-                       __METHOD__
-               );
+               if ( !$disableCounter ) {
+                       // Number of views
+                       $views = (int) $dbr->selectField(
+                               'page',
+                               'page_counter',
+                               array( 'page_id' => $id ),
+                               __METHOD__
+                       );
+                       $result['views'] = $views;
+               }
+
+               if ( $canViewUnwatched ) {
+                       // Number of page watchers
+                       $watchers = (int) $dbr->selectField(
+                               'watchlist',
+                               'COUNT(*)',
+                               array(
+                                       'wl_namespace' => $title->getNamespace(),
+                                       'wl_title'     => $title->getDBkey(),
+                               ),
+                               __METHOD__
+                       );
+                       $result['watchers'] = $watchers;
+               }
 
-               $edits = (int)$dbr->selectField(
+               // Total number of edits
+               $edits = (int) $dbr->selectField(
                        'revision',
                        'COUNT(rev_page)',
                        array( 'rev_page' => $id ),
                        __METHOD__
                );
+               $result['edits'] = $edits;
 
-               $authors = (int)$dbr->selectField(
+               // Total number of distinct authors
+               $authors = (int) $dbr->selectField(
                        'revision',
                        'COUNT(DISTINCT rev_user_text)',
                        array( 'rev_page' => $id ),
                        __METHOD__
                );
+               $result['authors'] = $authors;
 
-               $views = (int)$dbr->selectField(
+               // "Recent" threshold defined by $wgRCMaxAge
+               $threshold = $dbr->timestamp( time() - $wgRCMaxAge );
+
+               // Recent number of edits
+               $edits = (int) $dbr->selectField(
+                       'revision',
+                       'COUNT(rev_page)',
+                       array(
+                               'rev_page' => $id ,
+                               "rev_timestamp >= $threshold"
+                       ),
+                       __METHOD__
+               );
+               $result['recent_edits'] = $edits;
+
+               // Recent number of distinct authors
+               $authors = (int) $dbr->selectField(
+                       'revision',
+                       'COUNT(DISTINCT rev_user_text)',
+                       array(
+                               'rev_page' => $id,
+                               "rev_timestamp >= $threshold"
+                       ),
+                       __METHOD__
+               );
+               $result['recent_authors'] = $authors;
+
+               $conds = array( 'page_namespace' => $title->getNamespace(), 'page_is_redirect' => 1 );
+               $conds[] = 'page_title ' . $dbr->buildLike( $title->getDBkey() . '/', $dbr->anyString() );
+
+               // Subpages of this page (redirects)
+               $result['subpages']['redirects'] = (int) $dbr->selectField(
                        'page',
-                       'page_counter',
-                       array( 'page_id' => $id ),
+                       'COUNT(page_id)',
+                       $conds,
+                       __METHOD__ );
+
+               // Subpages of this page (non-redirects)
+               $conds['page_is_redirect'] = 0;
+               $result['subpages']['nonredirects'] = (int) $dbr->selectField(
+                       'page',
+                       'COUNT(page_id)',
+                       $conds,
                        __METHOD__
                );
 
-               return array( 'watchers' => $watchers, 'edits' => $edits,
-                       'authors' => $authors, 'views' => $views );
+               // Subpages of this page (total)
+               $result['subpages']['total'] = $result['subpages']['redirects']
+                       + $result['subpages']['nonredirects'];
+
+               // Latest editor + date of latest edit
+               $options = array( 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 1 );
+               $row = $dbr->fetchRow( $dbr->select(
+                       'revision',
+                       array( 'rev_user_text', 'rev_timestamp' ),
+                       array( 'rev_page' => $id ),
+                       __METHOD__,
+                       $options
+               ) );
+
+               $result['firstuser'] = $row['rev_user_text'];
+               $result['firsttime'] = $row['rev_timestamp'];
+
+               // Latest editor + date of latest edit
+               $options['ORDER BY'] = 'rev_timestamp DESC';
+               $row = $dbr->fetchRow( $dbr->select(
+                       'revision',
+                       array( 'rev_user_text', 'rev_timestamp' ),
+                       array( 'rev_page' => $id ),
+                       __METHOD__,
+                       $options
+               ) );
+
+               $result['lastuser'] = $row['rev_user_text'];
+               $result['lasttime'] = $row['rev_timestamp'];
+
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       /**
+        * Adds a header to the content that will be added to the output.
+        *
+        * @param $content string The content that will be added to the output
+        * @param $header string The value of the header
+        * @return string The content with the header added
+        */
+       protected function addHeader( $content, $header ) {
+               return $content . Html::element( 'h2', array(), $header );
+       }
+
+       /**
+        * Adds a row to a table that will be added to the content.
+        *
+        * @param $table string The table that will be added to the content
+        * @param $name string The name of the row
+        * @param $value string The value of the row
+        * @return string The table with the row added
+        */
+       protected function addRow( $table, $name, $value ) {
+               return $table . Html::rawElement( 'tr', array(),
+                       Html::rawElement( 'td', array(), $name ) .
+                       Html::rawElement( 'td', array(), $value )
+               );
+       }
+
+       /**
+        * Adds a table to the content that will be added to the output.
+        *
+        * @param $content string The content that will be added to the output
+        * @param $table string The table
+        * @return string The content with the table added
+        */
+       protected function addTable( $content, $table ) {
+               return $content . Html::rawElement( 'table', array( 'class' => 'wikitable mw-page-info' ),
+                       $table );
+       }
+
+       /**
+        * Returns the description that goes below the <h1> tag.
+        *
+        * @return string
+        */
+       protected function getDescription() {
+               return '';
+       }
+
+       /**
+        * Returns the name that goes in the <h1> page title.
+        *
+        * @return string
+        */
+       protected function getPageTitle() {
+               return $this->msg( 'pageinfo-title', $this->getTitle()->getPrefixedText() )->text();
        }
 }
index f07e493..14da2fc 100644 (file)
@@ -44,6 +44,6 @@ class RevisiondeleteAction extends FormlessAction {
        public function show() {
                $special = SpecialPageFactory::getPage( 'Revisiondelete' );
                $special->setContext( $this->getContext() );
-               $special->execute( '' );
+               $special->run( '' );
        }
 }
index 6a9be24..1e62766 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 5, 2006
  *
- * Copyright © 2006, 2010 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006, 2010 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -134,7 +134,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Get the name of the module as shown in the profiler log
         *
-        * @param $db DatabaseBase
+        * @param $db DatabaseBase|bool
         *
         * @return string
         */
@@ -401,7 +401,9 @@ abstract class ApiBase extends ContextSource {
 
                                $type = isset( $paramSettings[self::PARAM_TYPE] ) ? $paramSettings[self::PARAM_TYPE] : null;
                                if ( isset( $type ) ) {
-                                       if ( isset( $paramSettings[self::PARAM_ISMULTI] ) && $paramSettings[self::PARAM_ISMULTI] ) {
+                                       $hintPipeSeparated = true;
+                                       $multi = isset( $paramSettings[self::PARAM_ISMULTI] ) ? $paramSettings[self::PARAM_ISMULTI] : false;
+                                       if ( $multi ) {
                                                $prompt = 'Values (separate with \'|\'): ';
                                        } else {
                                                $prompt = 'One value: ';
@@ -409,7 +411,7 @@ abstract class ApiBase extends ContextSource {
 
                                        if ( is_array( $type ) ) {
                                                $choices = array();
-                                               $nothingPrompt = false;
+                                               $nothingPrompt = '';
                                                foreach ( $type as $t ) {
                                                        if ( $t === '' ) {
                                                                $nothingPrompt = 'Can be empty, or ';
@@ -420,6 +422,7 @@ abstract class ApiBase extends ContextSource {
                                                $desc .= $paramPrefix . $nothingPrompt . $prompt;
                                                $choicesstring = implode( ', ', $choices );
                                                $desc .= wordwrap( $choicesstring, 100, $descWordwrap );
+                                               $hintPipeSeparated = false;
                                        } else {
                                                switch ( $type ) {
                                                        case 'namespace':
@@ -427,6 +430,7 @@ abstract class ApiBase extends ContextSource {
                                                                $desc .= $paramPrefix . $prompt;
                                                                $desc .= wordwrap( implode( ', ', MWNamespace::getValidNamespaces() ),
                                                                        100, $descWordwrap );
+                                                               $hintPipeSeparated = false;
                                                                break;
                                                        case 'limit':
                                                                $desc .= $paramPrefix . "No more than {$paramSettings[self :: PARAM_MAX]}";
@@ -436,15 +440,16 @@ abstract class ApiBase extends ContextSource {
                                                                $desc .= ' allowed';
                                                                break;
                                                        case 'integer':
+                                                               $s = $multi ? 's' : '';
                                                                $hasMin = isset( $paramSettings[self::PARAM_MIN] );
                                                                $hasMax = isset( $paramSettings[self::PARAM_MAX] );
                                                                if ( $hasMin || $hasMax ) {
                                                                        if ( !$hasMax ) {
-                                                                               $intRangeStr = "The value must be no less than {$paramSettings[self::PARAM_MIN]}";
+                                                                               $intRangeStr = "The value$s must be no less than {$paramSettings[self::PARAM_MIN]}";
                                                                        } elseif ( !$hasMin ) {
-                                                                               $intRangeStr = "The value must be no more than {$paramSettings[self::PARAM_MAX]}";
+                                                                               $intRangeStr = "The value$s must be no more than {$paramSettings[self::PARAM_MAX]}";
                                                                        } else {
-                                                                               $intRangeStr = "The value must be between {$paramSettings[self::PARAM_MIN]} and {$paramSettings[self::PARAM_MAX]}";
+                                                                               $intRangeStr = "The value$s must be between {$paramSettings[self::PARAM_MIN]} and {$paramSettings[self::PARAM_MAX]}";
                                                                        }
 
                                                                        $desc .= $paramPrefix . $intRangeStr;
@@ -453,9 +458,12 @@ abstract class ApiBase extends ContextSource {
                                                }
                                        }
 
-                                       if ( isset( $paramSettings[self::PARAM_ISMULTI] ) && $paramSettings[self::PARAM_ISMULTI] ) {
-                                               $isArray = is_array( $type );
+                                       if ( $multi ) {
+                                               if ( $hintPipeSeparated ) {
+                                                       $desc .= $paramPrefix . "Separate values with '|'";
+                                               }
 
+                                               $isArray = is_array( $type );
                                                if ( !$isArray
                                                                || $isArray && count( $type ) > self::LIMIT_SML1 ) {
                                                        $desc .= $paramPrefix . "Maximum number of values " .
@@ -689,14 +697,15 @@ abstract class ApiBase extends ContextSource {
        public function requireOnlyOneParameter( $params ) {
                $required = func_get_args();
                array_shift( $required );
+               $p = $this->getModulePrefix();
 
                $intersection = array_intersect( array_keys( array_filter( $params,
                        array( $this, "parameterNotEmpty" ) ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
-                       $this->dieUsage( 'The parameters ' . implode( ', ', $intersection ) . ' can not be used together', 'invalidparammix' );
+                       $this->dieUsage( "The parameters {$p}" . implode( ", {$p}",  $intersection ) . ' can not be used together', "{$p}invalidparammix" );
                } elseif ( count( $intersection ) == 0 ) {
-                       $this->dieUsage( 'One of the parameters ' . implode( ', ', $required ) . ' is required', 'missingparam' );
+                       $this->dieUsage( "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
                }
        }
 
@@ -724,12 +733,13 @@ abstract class ApiBase extends ContextSource {
        public function requireMaxOneParameter( $params ) {
                $required = func_get_args();
                array_shift( $required );
+               $p = $this->getModulePrefix();
 
                $intersection = array_intersect( array_keys( array_filter( $params,
                        array( $this, "parameterNotEmpty" ) ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
-                       $this->dieUsage( 'The parameters ' . implode( ', ', $intersection ) . ' can not be used together', 'invalidparammix' );
+                       $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', "{$p}invalidparammix" );
                }
        }
 
@@ -825,7 +835,7 @@ abstract class ApiBase extends ContextSource {
         */
        protected function getWatchlistValue ( $watchlist, $titleObj, $userOption = null ) {
 
-               $userWatching = $titleObj->userIsWatching();
+               $userWatching = $this->getUser()->isWatched( $titleObj );
 
                switch ( $watchlist ) {
                        case 'watch':
@@ -1184,7 +1194,8 @@ abstract class ApiBase extends ContextSource {
         * @param $errorCode string Brief, arbitrary, stable string to allow easy
         *   automated identification of the error, e.g., 'unknown_action'
         * @param $httpRespCode int HTTP response code
-        * @param $extradata array Data to add to the <error> element; array in ApiResult format
+        * @param $extradata array Data to add to the "<error>" element; array in ApiResult format
+        * @throws UsageException
         */
        public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
                Profiler::instance()->close();
@@ -1261,6 +1272,8 @@ abstract class ApiBase extends ContextSource {
                'nouserspecified' => array( 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ),
                'noname' => array( 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ),
                'summaryrequired' => array( 'code' => 'summaryrequired', 'info' => 'Summary required' ),
+               'import-rootpage-invalid' => array( 'code' => 'import-rootpage-invalid', 'info' => 'Root page is an invalid title' ),
+               'import-rootpage-nosubpage' => array( 'code' => 'import-rootpage-nosubpage', 'info' => 'Namespace "$1" of the root page does not allow subpages' ),
 
                // API-specific messages
                'readrequired' => array( 'code' => 'readapidenied', 'info' => "You need read permission to use this module" ),
@@ -1307,6 +1320,9 @@ abstract class ApiBase extends ContextSource {
                'specialpage-cantexecute' => array( 'code' => 'specialpage-cantexecute', 'info' => "You don't have permission to view the results of this special page" ),
                'invalidoldimage' => array( 'code' => 'invalidoldimage', 'info' => 'The oldimage parameter has invalid format' ),
                'nodeleteablefile' => array( 'code' => 'nodeleteablefile', 'info' => 'No such old version of the file' ),
+               'fileexists-forbidden' => array( 'code' => 'fileexists-forbidden', 'info' => 'A file with name "$1" already exists, and cannot be overwritten.' ),
+               'fileexists-shared-forbidden' => array( 'code' => 'fileexists-shared-forbidden', 'info' => 'A file with name "$1" already exists in the shared file repository, and cannot be overwritten.' ),
+               'filerevert-badversion' => array( 'code' => 'filerevert-badversion', 'info' => 'There is no previous local version of this file with the provided timestamp.' ),
 
                // ApiEditPage messages
                'noimageredirect-anon' => array( 'code' => 'noimageredirect-anon', 'info' => "Anonymous users can't create image redirects" ),
@@ -1331,7 +1347,7 @@ abstract class ApiBase extends ContextSource {
                'edit-already-exists' => array( 'code' => 'edit-already-exists', 'info' => "It seems the page you tried to create already exist" ),
 
                // uploadMsgs
-               'invalid-session-key' => array( 'code' => 'invalid-session-key', 'info' => 'Not a valid session key' ),
+               'invalid-file-key' => array( 'code' => 'invalid-file-key', 'info' => 'Not a valid file key' ),
                'nouploadmodule' => array( 'code' => 'nouploadmodule', 'info' => 'No upload module set' ),
                'uploaddisabled' => array( 'code' => 'uploaddisabled', 'info' => 'Uploads are not enabled.  Make sure $wgEnableUploads is set to true in LocalSettings.php and the PHP ini setting file_uploads is true' ),
                'copyuploaddisabled' => array( 'code' => 'copyuploaddisabled', 'info' => 'Uploads by URL is not enabled.  Make sure $wgAllowCopyUploads is set to true in LocalSettings.php.' ),
@@ -1437,7 +1453,9 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * Returns whether this module requires a Token to execute
+        * Returns whether this module requires a token to execute
+        * It is used to show possible errors in action=paraminfo
+        * see bug 25248
         * @return bool
         */
        public function needsToken() {
@@ -1445,8 +1463,12 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * Returns the token salt if there is one, '' if the module doesn't require a salt, else false if the module doesn't need a token
-        * @return bool|string
+        * Returns the token salt if there is one,
+        * '' if the module doesn't require a salt,
+        * else false if the module doesn't need a token
+        * You have also to override needsToken()
+        * Value is passed to User::getEditToken
+        * @return bool|string|array
         */
        public function getTokenSalt() {
                return false;
index 6cd31ae..c879b35 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 4, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -72,9 +72,9 @@ class ApiBlock extends ApiBase {
                $data = array(
                        'Target' => $params['user'],
                        'Reason' => array(
-                               is_null( $params['reason'] ) ? '' : $params['reason'],
+                               $params['reason'],
                                'other',
-                               is_null( $params['reason'] ) ? '' : $params['reason']
+                               $params['reason']
                        ),
                        'Expiry' => $params['expiry'] == 'never' ? 'infinite' : $params['expiry'],
                        'HardBlock' => !$params['anononly'],
@@ -156,7 +156,7 @@ class ApiBlock extends ApiBase {
                                ApiBase::PARAM_DEPRECATED => true,
                        ),
                        'expiry' => 'never',
-                       'reason' => null,
+                       'reason' => '',
                        'anononly' => false,
                        'nocreate' => false,
                        'autoblock' => false,
@@ -174,7 +174,7 @@ class ApiBlock extends ApiBase {
                        'token' => 'A block token previously obtained through prop=info',
                        'gettoken' => 'If set, a block token will be returned, and no other action will be taken',
                        'expiry' => 'Relative expiry time, e.g. \'5 months\' or \'2 weeks\'. If set to \'infinite\', \'indefinite\' or \'never\', the block will never expire.',
-                       'reason' => 'Reason for block (optional)',
+                       'reason' => 'Reason for block',
                        'anononly' => 'Block anonymous users only (i.e. disable anonymous edits for this IP)',
                        'nocreate' => 'Prevent account creation',
                        'autoblock' => 'Automatically block the last used IP address, and any subsequent IP addresses they try to login from',
index 1927490..2d36f19 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Jun 30, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -52,17 +52,18 @@ class ApiDelete extends ApiBase {
                }
 
                $titleObj = $pageObj->getTitle();
-               $reason = ( isset( $params['reason'] ) ? $params['reason'] : null );
+               $reason = $params['reason'];
                $user = $this->getUser();
 
                if ( $titleObj->getNamespace() == NS_FILE ) {
-                       $retval = self::deleteFile( $pageObj, $user, $params['token'], $params['oldimage'], $reason, false );
+                       $status = self::deleteFile( $pageObj, $user, $params['token'], $params['oldimage'], $reason, false );
                } else {
-                       $retval = self::delete( $pageObj, $user, $params['token'], $reason );
+                       $status = self::delete( $pageObj, $user, $params['token'], $reason );
                }
 
-               if ( count( $retval ) ) {
-                       $this->dieUsageMsg( reset( $retval ) ); // We don't care about multiple errors, just report one of them
+               if ( !$status->isGood() ) {
+                       $errors = $status->getErrorsArray();
+                       $this->dieUsageMsg( $errors[0] ); // We don't care about multiple errors, just report one of them
                }
 
                // Deprecated parameters
@@ -75,7 +76,11 @@ class ApiDelete extends ApiBase {
                }
                $this->setWatch( $watch, $titleObj, 'watchdeletion' );
 
-               $r = array( 'title' => $titleObj->getPrefixedText(), 'reason' => $reason );
+               $r = array(
+                       'title' => $titleObj->getPrefixedText(),
+                       'reason' => $reason,
+                       'logid' => $status->value
+               );
                $this->getResult()->addValue( null, $this->getModuleName(), $r );
        }
 
@@ -97,7 +102,7 @@ class ApiDelete extends ApiBase {
         * @param $user User doing the action
         * @param $token String: delete token (same as edit token)
         * @param $reason String: reason for the deletion. Autogenerated if NULL
-        * @return Title::getUserPermissionsErrors()-like array
+        * @return Status
         */
        public static function delete( Page $page, User $user, $token, &$reason = null ) {
                $title = $page->getTitle();
@@ -119,11 +124,7 @@ class ApiDelete extends ApiBase {
 
                $error = '';
                // Luckily, Article.php provides a reusable delete function that does the hard work for us
-               if ( $page->doDeleteArticle( $reason, false, 0, true, $error ) ) {
-                       return array();
-               } else {
-                       return array( array( 'cannotdelete', $title->getPrefixedText() ) );
-               }
+               return $page->doDeleteArticleReal( $reason, false, 0, true, $error );
        }
 
        /**
@@ -133,7 +134,7 @@ class ApiDelete extends ApiBase {
         * @param $oldimage
         * @param $reason
         * @param $suppress bool
-        * @return array|Title
+        * @return Status
         */
        public static function deleteFile( Page $page, User $user, $token, $oldimage, &$reason = null, $suppress = false ) {
                $title = $page->getTitle();
@@ -155,19 +156,12 @@ class ApiDelete extends ApiBase {
                        if ( !$oldfile->exists() || !$oldfile->isLocal() || $oldfile->getRedirected() ) {
                                return array( array( 'nodeleteablefile' ) );
                        }
-               } else {
-                       $oldfile = false;
                }
 
                if ( is_null( $reason ) ) { // Log and RC don't like null reasons
                        $reason = '';
                }
-               $status = FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, $suppress );
-               if ( !$status->isGood() ) {
-                       return array( array( 'cannotdelete', $title->getPrefixedText() ) );
-               }
-
-               return array();
+               return FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, $suppress );
        }
 
        public function mustBePosted() {
@@ -184,7 +178,10 @@ class ApiDelete extends ApiBase {
                        'pageid' => array(
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                        'reason' => null,
                        'watch' => array(
                                ApiBase::PARAM_DFLT => false,
@@ -225,7 +222,8 @@ class ApiDelete extends ApiBase {
                return array(
                        '' => array(
                                'title' => 'string',
-                               'reason' => 'string'
+                               'reason' => 'string',
+                               'logid' => 'integer'
                        )
                );
        }
index 5575489..13975ae 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 25, 2008
  *
- * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9a16007..0963fe7 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on August 16, 2007
  *
- * Copyright © 2007 Iker Labarga <Firstname><Lastname>@gmail.com
+ * Copyright © 2007 Iker Labarga "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -60,7 +60,11 @@ class ApiEditPage extends ApiBase {
                        if ( $titleObj->isRedirect() ) {
                                $oldTitle = $titleObj;
 
-                               $titles = Title::newFromRedirectArray( Revision::newFromTitle( $oldTitle )->getText( Revision::FOR_THIS_USER ) );
+                               $titles = Title::newFromRedirectArray(
+                                       Revision::newFromTitle(
+                                               $oldTitle, false, Revision::READ_LATEST
+                                       )->getText( Revision::FOR_THIS_USER )
+                               );
                                // array_shift( $titles );
 
                                $redirValues = array();
@@ -162,7 +166,7 @@ class ApiEditPage extends ApiBase {
                        // If no summary was given and we only undid one rev,
                        // use an autosummary
                        if ( is_null( $params['summary'] ) && $titleObj->getNextRevisionID( $undoafterRev->getID() ) == $params['undo'] ) {
-                               $params['summary'] = wfMsgForContent( 'undo-summary', $params['undo'], $undoRev->getUserText() );
+                               $params['summary'] = wfMessage( 'undo-summary', $params['undo'], $undoRev->getUserText() )->inContentLanguage()->text();
                        }
                }
 
@@ -182,7 +186,7 @@ class ApiEditPage extends ApiBase {
                if ( !is_null( $params['summary'] ) ) {
                        $requestArray['wpSummary'] = $params['summary'];
                }
-               
+
                if ( !is_null( $params['sectiontitle'] ) ) {
                        $requestArray['wpSectionTitle'] = $params['sectiontitle'];
                }
@@ -413,7 +417,10 @@ class ApiEditPage extends ApiBase {
                                ApiBase::PARAM_REQUIRED => false,
                        ),
                        'text' => null,
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                        'summary' => null,
                        'minor' => false,
                        'notminor' => false,
index 4b6ba00..4fa0343 100644 (file)
@@ -98,7 +98,10 @@ class ApiEmailUser extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                        'ccme' => false,
                );
        }
index 2ed118f..160f5b9 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 05, 2007
  *
- * Copyright © 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index d808075..1cf760a 100644 (file)
@@ -60,7 +60,7 @@ class ApiFeedContributions extends ApiBase {
                        $this->dieUsage( 'Size difference is disabled in Miser Mode', 'sizediffdisabled' );
                }
 
-               $msg = wfMsgForContent( 'Contributions' );
+               $msg = wfMessage( 'Contributions' )->inContentLanguage()->text();
                $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']';
                $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL();
 
@@ -129,7 +129,8 @@ class ApiFeedContributions extends ApiBase {
         */
        protected function feedItemDesc( $revision ) {
                if( $revision ) {
-                       return '<p>' . htmlspecialchars( $revision->getUserText() ) . wfMsgForContent( 'colon-separator' ) .
+                       $msg = wfMessage( 'colon-separator' )->inContentLanguage()->text();
+                       return '<p>' . htmlspecialchars( $revision->getUserText() ) . $msg .
                                htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
                                "</p>\n<hr />\n<div>" .
                                nl2br( htmlspecialchars( $revision->getText() ) ) . "</div>";
index eee8fa1..6ccb02f 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 13, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -117,7 +117,7 @@ class ApiFeedWatchlist extends ApiBase {
                                $feedItems[] = $this->createFeedItem( $info );
                        }
 
-                       $msg = wfMsgForContent( 'watchlist' );
+                       $msg = wfMessage( 'watchlist' )->inContentLanguage()->text();
 
                        $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']';
                        $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
@@ -131,11 +131,12 @@ class ApiFeedWatchlist extends ApiBase {
                        // Error results should not be cached
                        $this->getMain()->setCacheMaxAge( 0 );
 
-                       $feedTitle = $wgSitename . ' - Error - ' . wfMsgForContent( 'watchlist' ) . ' [' . $wgLanguageCode . ']';
+                       $feedTitle = $wgSitename . ' - Error - ' . wfMessage( 'watchlist' )->inContentLanguage()->text() . ' [' . $wgLanguageCode . ']';
                        $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
 
                        $feedFormat = isset( $params['feedformat'] ) ? $params['feedformat'] : 'rss';
-                       $feed = new $wgFeedClasses[$feedFormat] ( $feedTitle, htmlspecialchars( wfMsgForContent( 'watchlist' ) ), $feedUrl );
+                       $msg = wfMessage( 'watchlist' )->inContentLanguage()->escaped();
+                       $feed = new $wgFeedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
 
                        if ( $e instanceof UsageException ) {
                                $errorCode = $e->getCodeString();
index 7cac0eb..83d078d 100644 (file)
@@ -71,9 +71,10 @@ class ApiFileRevert extends ApiBase {
         * @param $user User The user to check.
         */
        protected function checkPermissions( $user ) {
+               $title = $this->file->getTitle();
                $permissionErrors = array_merge(
-                       $this->file->getTitle()->getUserPermissionsErrors( 'edit' , $user ),
-                       $this->file->getTitle()->getUserPermissionsErrors( 'upload' , $user )
+                       $title->getUserPermissionsErrors( 'edit' , $user ),
+                       $title->getUserPermissionsErrors( 'upload' , $user )
                );
 
                if ( $permissionErrors ) {
@@ -91,15 +92,17 @@ class ApiFileRevert extends ApiBase {
                if ( is_null( $title ) ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $this->params['filename'] ) );
                }
+               $localRepo = RepoGroup::singleton()->getLocalRepo();
+
                // Check if the file really exists
-               $this->file = wfLocalFile( $title );
+               $this->file = $localRepo->newFile( $title );
                if ( !$this->file->exists() ) {
                        $this->dieUsageMsg( 'notanarticle' );
                }
 
                // Check if the archivename is valid for this file
                $this->archiveName = $this->params['archivename'];
-               $oldFile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $this->archiveName );
+               $oldFile = $localRepo->newFromArchiveName( $title, $this->archiveName );
                if ( !$oldFile->exists() ) {
                        $this->dieUsageMsg( 'filerevert-badversion' );
                }
@@ -126,7 +129,10 @@ class ApiFileRevert extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true,
                        ),
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                );
 
        }
index 7dfdffc..a8d69f5 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 19, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -326,7 +326,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
         */
        public static function setResult( $result, $feed, $feedItems ) {
                // Store output in the Result data.
-               // This way we can check during execution if any error has occured
+               // This way we can check during execution if any error has occurred
                // Disable size checking for this because we can't continue
                // cleanly; size checking would cause more problems than it'd
                // solve
@@ -371,7 +371,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
                        }
                        $feed->outFooter();
                } else {
-                       // Error has occured, print something useful
+                       // Error has occurred, print something useful
                        ApiBase::dieDebug( __METHOD__, 'Invalid feed class/item' );
                }
        }
index 92619f7..3d2a39c 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 22, 2006
  *
- * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index e728d05..acbc7d3 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 19, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 60552c4..fac2ca5 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 22, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index db81aac..184f0a3 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Feb 2, 2009
  *
- * Copyright © 2009 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2009 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index e26b82b..7141459 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 22, 2006
  *
- * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1bc9d02..65056e4 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 22, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index ef2c54f..5ccf185 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 19, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -83,16 +83,40 @@ class ApiFormatXml extends ApiFormatBase {
 
        /**
         * This method takes an array and converts it to XML.
+        *
         * There are several noteworthy cases:
         *
-        *  If array contains a key '_element', then the code assumes that ALL other keys are not important and replaces them with the value['_element'].
-        *      Example:        name='root',  value = array( '_element'=>'page', 'x', 'y', 'z') creates <root>  <page>x</page>  <page>y</page>  <page>z</page> </root>
+        * If array contains a key '_element', then the code assumes that ALL
+        * other keys are not important and replaces them with the
+        * value['_element'].
+        *
+        * @par Example:
+        * @verbatim
+        * name='root',  value = array( '_element'=>'page', 'x', 'y', 'z')
+        * @endverbatim
+        * creates:
+        * @verbatim
+        * <root>  <page>x</page>  <page>y</page>  <page>z</page> </root>
+        * @endverbatim
+        *
+        * If any of the array's element key is '*', then the code treats all
+        * other key->value pairs as attributes, and the value['*'] as the
+        * element's content.
+        *
+        * @par Example:
+        * @verbatim
+        * name='root',  value = array( '*'=>'text', 'lang'=>'en', 'id'=>10)
+        * @endverbatim
+        * creates:
+        * @verbatim
+        * <root lang='en' id='10'>text</root>
+        * @endverbatim
         *
-        *  If any of the array's element key is '*', then the code treats all other key->value pairs as attributes, and the value['*'] as the element's content.
-        *      Example:        name='root',  value = array( '*'=>'text', 'lang'=>'en', 'id'=>10)   creates  <root lang='en' id='10'>text</root>
+        * Finally neither key is found, all keys become element names, and values
+        * become element content.
         *
-        * If neither key is found, all keys become element names, and values become element content.
-        * The method is recursive, so the same rules apply to any sub-arrays.
+        * @note The method is recursive, so the same rules apply to any
+        * sub-arrays.
         *
         * @param $elemName
         * @param $elemValue
index dbcdb21..730ad8e 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 19, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 97da786..2b5de21 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 6, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 6663d97..637c1ff 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Feb 4, 2009
  *
- * Copyright © 2009 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2009 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -68,6 +68,12 @@ class ApiImport extends ApiBase {
                if ( isset( $params['namespace'] ) ) {
                        $importer->setTargetNamespace( $params['namespace'] );
                }
+               if ( isset( $params['rootpage'] ) ) {
+                       $statusRootPage = $importer->setTargetRootPage( $params['rootpage'] );
+                       if( !$statusRootPage->isGood() ) {
+                               $this->dieUsageMsg( $statusRootPage->getErrorsArray() );
+                       }
+               }
                $reporter = new ApiImportReporter(
                        $importer,
                        $isUpload,
@@ -98,7 +104,10 @@ class ApiImport extends ApiBase {
        public function getAllowedParams() {
                global $wgImportSources;
                return array(
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                        'summary' => null,
                        'xml' => null,
                        'interwikisource' => array(
@@ -109,7 +118,8 @@ class ApiImport extends ApiBase {
                        'templates' => false,
                        'namespace' => array(
                                ApiBase::PARAM_TYPE => 'namespace'
-                       )
+                       ),
+                       'rootpage' => null,
                );
        }
 
@@ -123,6 +133,7 @@ class ApiImport extends ApiBase {
                        'fullhistory' => 'For interwiki imports: import the full history, not just the current version',
                        'templates' => 'For interwiki imports: import all included templates as well',
                        'namespace' => 'For interwiki imports: import to this namespace',
+                       'rootpage' => 'Import as subpage of this page',
                );
        }
 
@@ -152,6 +163,8 @@ class ApiImport extends ApiBase {
                        array( 'cantimport-upload' ),
                        array( 'import-unknownerror', 'source' ),
                        array( 'import-unknownerror', 'result' ),
+                       array( 'import-rootpage-nosubpage', 'namespace' ),
+                       array( 'import-rootpage-invalid' ),
                ) );
        }
 
index 0bdaa1b..1f91fe9 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 19, 2006
  *
- * Copyright © 2006-2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com,
+ * Copyright © 2006-2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com",
  * Daniel Cannon (cannon dot danielc at gmail dot com)
  *
  * This program is free software; you can redistribute it and/or modify
@@ -79,6 +79,8 @@ class ApiLogin extends ApiBase {
                                $user->setOption( 'rememberpassword', 1 );
                                $user->setCookies( $this->getRequest() );
 
+                               ApiQueryInfo::resetTokenCache();
+
                                // Run hooks.
                                // @todo FIXME: Split back and frontend from this hook.
                                // @todo FIXME: This hook should be placed in the backend
index cab2430..b2f634d 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Jan 4, 2008
  *
- * Copyright © 2008 Yuri Astrakhan <Firstname><Lastname>@gmail.com,
+ * Copyright © 2008 Yuri Astrakhan "<Firstname><Lastname>@gmail.com",
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 7414a97..2a94a65 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 4, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -65,6 +65,7 @@ class ApiMain extends ApiBase {
 
                // Write modules
                'purge' => 'ApiPurge',
+               'setnotificationtimestamp' => 'ApiSetNotificationTimestamp',
                'rollback' => 'ApiRollback',
                'delete' => 'ApiDelete',
                'undelete' => 'ApiUndelete',
@@ -354,6 +355,12 @@ class ApiMain extends ApiBase {
         * have been accumulated, and replace it with an error message and a help screen.
         */
        protected function executeActionWithErrorHandling() {
+               // Verify the CORS header before executing the action
+               if ( !$this->handleCORS() ) {
+                       // handleCORS() has sent a 403, abort
+                       return;
+               }
+
                // In case an error occurs during data output,
                // clear the output buffer and print just the error information
                ob_start();
@@ -361,6 +368,9 @@ class ApiMain extends ApiBase {
                try {
                        $this->executeAction();
                } catch ( Exception $e ) {
+                       // Allow extra cleanup and logging
+                       wfRunHooks( 'ApiMain::onException', array( $this, $e ) );
+
                        // Log it
                        if ( !( $e instanceof UsageException ) ) {
                                wfDebugLog( 'exception', $e->getLogMessage() );
@@ -386,7 +396,7 @@ class ApiMain extends ApiBase {
                        // Reset and print just the error message
                        ob_clean();
 
-                       // If the error occured during printing, do a printer->profileOut()
+                       // If the error occurred during printing, do a printer->profileOut()
                        $this->mPrinter->safeProfileOut();
                        $this->printResult( true );
                }
@@ -402,9 +412,101 @@ class ApiMain extends ApiBase {
                ob_end_flush();
        }
 
+       /**
+        * Check the &origin= query parameter against the Origin: HTTP header and respond appropriately.
+        *
+        * If no origin parameter is present, nothing happens.
+        * If an origin parameter is present but doesn't match the Origin header, a 403 status code
+        * is set and false is returned.
+        * If the parameter and the header do match, the header is checked against $wgCrossSiteAJAXdomains
+        * and $wgCrossSiteAJAXdomainExceptions, and if the origin qualifies, the appropriate CORS
+        * headers are set.
+        *
+        * @return bool False if the caller should abort (403 case), true otherwise (all other cases)
+        */
+       protected function handleCORS() {
+               global $wgCrossSiteAJAXdomains, $wgCrossSiteAJAXdomainExceptions;
+
+               $originParam = $this->getParameter( 'origin' ); // defaults to null
+               if ( $originParam === null ) {
+                       // No origin parameter, nothing to do
+                       return true;
+               }
+
+               $request = $this->getRequest();
+               $response = $request->response();
+               // Origin: header is a space-separated list of origins, check all of them
+               $originHeader = $request->getHeader( 'Origin' );
+               if ( $originHeader === false ) {
+                       $origins = array();
+               } else {
+                       $origins = explode( ' ', $originHeader );
+               }
+               if ( !in_array( $originParam, $origins ) ) {
+                       // origin parameter set but incorrect
+                       // Send a 403 response
+                       $message = HttpStatus::getMessage( 403 );
+                       $response->header( "HTTP/1.1 403 $message", true, 403 );
+                       $response->header( 'Cache-Control: no-cache' );
+                       echo "'origin' parameter does not match Origin header\n";
+                       return false;
+               }
+               if ( self::matchOrigin( $originParam, $wgCrossSiteAJAXdomains, $wgCrossSiteAJAXdomainExceptions ) ) {
+                       $response->header( "Access-Control-Allow-Origin: $originParam" );
+                       $response->header( 'Access-Control-Allow-Credentials: true' );
+                       $this->getOutput()->addVaryHeader( 'Origin' );
+               }
+               return true;
+       }
+
+       /**
+        * Attempt to match an Origin header against a set of rules and a set of exceptions
+        * @param $value string Origin header
+        * @param $rules array Set of wildcard rules
+        * @param $exceptions array Set of wildcard rules
+        * @return bool True if $value matches a rule in $rules and doesn't match any rules in $exceptions, false otherwise
+        */
+       protected static function matchOrigin( $value, $rules, $exceptions ) {
+               foreach ( $rules as $rule ) {
+                       if ( preg_match( self::wildcardToRegex( $rule ), $value ) ) {
+                               // Rule matches, check exceptions
+                               foreach ( $exceptions as $exc ) {
+                                       if ( preg_match( self::wildcardToRegex( $exc ), $value ) ) {
+                                               return false;
+                                       }
+                               }
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Helper function to convert wildcard string into a regex
+        * '*' => '.*?'
+        * '?' => '.'
+        *
+        * @param $wildcard string String with wildcards
+        * @return string Regular expression
+        */
+       protected static function wildcardToRegex( $wildcard ) {
+               $wildcard = preg_quote( $wildcard, '/' );
+               $wildcard = str_replace(
+                       array( '\*', '\?' ),
+                       array( '.*?', '.' ),
+                       $wildcard
+               );
+               return "/https?:\/\/$wildcard/";
+       }
+
        protected function sendCacheHeaders() {
                global $wgUseXVO, $wgVaryOnXFP;
                $response = $this->getRequest()->response();
+               $out = $this->getOutput();
+
+               if ( $wgVaryOnXFP ) {
+                       $out->addVaryHeader( 'X-Forwarded-Proto' );
+               }
 
                if ( $this->mCacheMode == 'private' ) {
                        $response->header( 'Cache-Control: private' );
@@ -412,13 +514,9 @@ class ApiMain extends ApiBase {
                }
 
                if ( $this->mCacheMode == 'anon-public-user-private' ) {
-                       $xfp = $wgVaryOnXFP ? ', X-Forwarded-Proto' : '';
-                       $response->header( 'Vary: Accept-Encoding, Cookie' . $xfp );
+                       $out->addVaryHeader( 'Cookie' );
+                       $response->header( $out->getVaryHeader() );
                        if ( $wgUseXVO ) {
-                               $out = $this->getOutput();
-                               if ( $wgVaryOnXFP ) {
-                                       $out->addVaryHeader( 'X-Forwarded-Proto' );
-                               }
                                $response->header( $out->getXVO() );
                                if ( $out->haveCacheVaryCookies() ) {
                                        // Logged in, mark this request private
@@ -435,12 +533,9 @@ class ApiMain extends ApiBase {
                }
 
                // Send public headers
-               if ( $wgVaryOnXFP ) {
-                       $response->header( 'Vary: Accept-Encoding, X-Forwarded-Proto' );
-                       if ( $wgUseXVO ) {
-                               // Bleeeeegh. Our header setting system sucks
-                               $response->header( 'X-Vary-Options: Accept-Encoding;list-contains=gzip, X-Forwarded-Proto' );
-                       }
+               $response->header( $out->getVaryHeader() );
+               if ( $wgUseXVO ) {
+                       $response->header( $out->getXVO() );
                }
 
                // If nobody called setCacheMaxAge(), use the (s)maxage parameters
@@ -607,7 +702,7 @@ class ApiMain extends ApiBase {
                        if ( !isset( $moduleParams['token'] ) ) {
                                $this->dieUsageMsg( array( 'missingparam', 'token' ) );
                        } else {
-                               if ( !$this->getUser()->matchEditToken( $moduleParams['token'], $salt ) ) {
+                               if ( !$this->getUser()->matchEditToken( $moduleParams['token'], $salt, $this->getContext()->getRequest() ) ) {
                                        $this->dieUsageMsg( 'sessionfailure' );
                                }
                        }
@@ -784,6 +879,7 @@ class ApiMain extends ApiBase {
                        ),
                        'requestid' => null,
                        'servedby'  => false,
+                       'origin' => null,
                );
        }
 
@@ -809,6 +905,12 @@ class ApiMain extends ApiBase {
                        'maxage' => 'Set the max-age header to this many seconds. Errors are never cached',
                        'requestid' => 'Request ID to distinguish requests. This will just be output back to you',
                        'servedby' => 'Include the hostname that served the request in the results. Unconditionally shown on error',
+                       'origin' => array(
+                               'When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain.',
+                               'This must match one of the origins in the Origin: header exactly, so it has to be set to something like http://en.wikipedia.org or https://meta.wikimedia.org .',
+                               'If this parameter does not match the Origin: header, a 403 response will be returned.',
+                               'If this parameter matches the Origin: header and the origin is whitelisted, an Access-Control-Allow-Origin header will be set.',
+                       ),
                );
        }
 
@@ -876,11 +978,11 @@ class ApiMain extends ApiBase {
        protected function getCredits() {
                return array(
                        'API developers:',
-                       '    Roan Kattouw <Firstname>.<Lastname>@gmail.com (lead developer Sep 2007-present)',
+                       '    Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-present)',
                        '    Victor Vasiliev - vasilvv at gee mail dot 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)',
+                       '    Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007)',
                        '',
                        'Please send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org',
                        'or file a bug report at https://bugzilla.wikimedia.org/'
@@ -1069,8 +1171,18 @@ class ApiMain extends ApiBase {
 class UsageException extends MWException {
 
        private $mCodestr;
+
+       /**
+        * @var null|array
+        */
        private $mExtraData;
 
+       /**
+        * @param $message string
+        * @param $codestr string
+        * @param $code int
+        * @param $extradata array|null
+        */
        public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
                parent::__construct( $message, $code );
                $this->mCodestr = $codestr;
index c89f59b..55148b1 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 31, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,9 +37,6 @@ class ApiMove extends ApiBase {
        public function execute() {
                $user = $this->getUser();
                $params = $this->extractRequestParams();
-               if ( is_null( $params['reason'] ) ) {
-                       $params['reason'] = '';
-               }
 
                $this->requireOnlyOneParameter( $params, 'from', 'fromid' );
 
@@ -180,8 +177,11 @@ class ApiMove extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => null,
-                       'reason' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
+                       'reason' => '',
                        'movetalk' => false,
                        'movesubpages' => false,
                        'noredirect' => false,
@@ -213,7 +213,7 @@ class ApiMove extends ApiBase {
                        'fromid' => "Page ID of the page you want to move. Cannot be used together with {$p}from",
                        'to' => 'Title you want to rename the page to',
                        'token' => 'A move token previously retrieved through prop=info',
-                       'reason' => 'Reason for the move (optional)',
+                       'reason' => 'Reason for the move',
                        'movetalk' => 'Move the talk page, if it exists',
                        'movesubpages' => 'Move subpages, if applicable',
                        'noredirect' => 'Don\'t create a redirect',
index 0727cff..5a78354 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 13, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 2b3d5e3..4398eb0 100644 (file)
@@ -123,7 +123,7 @@ class ApiOptions extends ApiBase {
                return array(
                        'token' => 'An options token previously obtained through the action=tokens',
                        'reset' => 'Resets all preferences to the site defaults',
-                       'change' => 'Pipe-separated list of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters',
+                       'change' => 'List of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters',
                        'optionname' => 'A name of a option which should have an optionvalue set',
                        'optionvalue' => 'A value of the option specified by the optionname, can contain pipe characters',
                );
@@ -135,8 +135,8 @@ class ApiOptions extends ApiBase {
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'notloggedin' ),
-                       array( 'nochanges' ),
+                       array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot change preferences' ),
+                       array( 'code' => 'nochanges', 'info' => 'No changes were requested' ),
                ) );
        }
 
index b7db4f0..0f5be6b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 24, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -52,7 +52,7 @@ class ApiPageSet extends ApiQueryBase {
 
        /**
         * Constructor
-        * @param $query ApiQueryBase
+        * @param $query ApiBase
         * @param $resolveRedirects bool Whether redirects should be resolved
         * @param $convertTitles bool
         */
@@ -266,8 +266,8 @@ class ApiPageSet extends ApiQueryBase {
        }
 
        /**
-        * Returns the number of revisions (requested with revids= parameter)\
-        * @return int
+        * Returns the number of revisions (requested with revids= parameter).
+        * @return int Number of revisions.
         */
        public function getRevisionCount() {
                return count( $this->getRevisionIDs() );
index dffce5b..343a262 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Dec 01, 2007
  *
- * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index dbcd43c..c63ae8a 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Created on Dec 01, 2007
  *
- * Copyright © 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -289,6 +289,18 @@ class ApiParse extends ApiBase {
                        $result_array['properties'] = $this->formatProperties( $p_result->getProperties() );
                }
 
+               if ( $params['generatexml'] ) {
+                       $wgParser->startExternalParse( $titleObj, $popts, OT_PREPROCESS );
+                       $dom = $wgParser->preprocessToDom( $this->text );
+                       if ( is_callable( array( $dom, 'saveXML' ) ) ) {
+                               $xml = $dom->saveXML();
+                       } else {
+                               $xml = $dom->__toString();
+                       }
+                       $result_array['parsetree'] = array();
+                       $result->setContent( $result_array['parsetree'], $xml );
+               }
+
                $result_mapping = array(
                        'redirects' => 'r',
                        'langlinks' => 'll',
@@ -401,7 +413,7 @@ class ApiParse extends ApiBase {
                        return '';
                }
 
-               $s = htmlspecialchars( wfMsg( 'otherlanguages' ) . wfMsg( 'colon-separator' ) );
+               $s = htmlspecialchars( wfMessage( 'otherlanguages' )->text() . wfMessage( 'colon-separator' )->text() );
 
                $langs = array();
                foreach ( $languages as $l ) {
@@ -413,7 +425,7 @@ class ApiParse extends ApiBase {
                                $text == '' ? $l : $text );
                }
 
-               $s .= implode( htmlspecialchars( wfMsgExt( 'pipe-separator', 'escapenoentities' ) ), $langs );
+               $s .= implode( wfMessage( 'pipe-separator' )->escaped(), $langs );
 
                if ( $wgContLang->isRTL() ) {
                        $s = Html::rawElement( 'span', array( 'dir' => "LTR" ), $s );
@@ -541,6 +553,7 @@ class ApiParse extends ApiBase {
                        'uselang' => null,
                        'section' => null,
                        'disablepp' => false,
+                       'generatexml' => false,
                );
        }
 
@@ -585,6 +598,7 @@ class ApiParse extends ApiBase {
                        'uselang' => 'Which language to parse the request in',
                        'section' => 'Only retrieve the content of this section number',
                        'disablepp' => 'Disable the PP Report from the parser output',
+                       'generatexml' => 'Generate XML parse tree',
                );
        }
 
index 45d19d0..cb5e081 100644 (file)
@@ -65,7 +65,10 @@ class ApiPatrol extends ApiBase {
 
        public function getAllowedParams() {
                return array(
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                        'rcid' => array(
                                ApiBase::PARAM_TYPE => 'integer',
                                ApiBase::PARAM_REQUIRED => true
index 0fcaf42..b3ca67e 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 1, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -139,7 +139,10 @@ class ApiProtect extends ApiBase {
                        'pageid' => array(
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                        'protections' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_REQUIRED => true,
@@ -173,10 +176,10 @@ class ApiProtect extends ApiBase {
                        'title' => "Title of the page you want to (un)protect. Cannot be used together with {$p}pageid",
                        'pageid' => "ID of the page you want to (un)protect. Cannot be used together with {$p}title",
                        'token' => 'A protect token previously retrieved through prop=info',
-                       'protections' => 'Pipe-separated list of protection levels, formatted action=group (e.g. edit=sysop)',
+                       'protections' => 'List of protection levels, formatted action=group (e.g. edit=sysop)',
                        'expiry' => array( 'Expiry timestamps. If only one timestamp is set, it\'ll be used for all protections.',
                                        'Use \'infinite\', \'indefinite\' or \'never\', for a neverexpiring protection.' ),
-                       'reason' => 'Reason for (un)protecting (optional)',
+                       'reason' => 'Reason for (un)protecting',
                        'cascade' => array( 'Enable cascading protection (i.e. protect pages included in this page)',
                                        'Ignored if not all protection levels are \'sysop\' or \'protect\'' ),
                        'watch' => 'If set, add the page being (un)protected to your watchlist',
index e27068d..9fedaf1 100644 (file)
@@ -88,8 +88,7 @@ class ApiPurge extends ApiBase {
                                if ( !$user->pingLimiter() ) {
                                        global $wgParser, $wgEnableParserCache;
 
-                                       $popts = ParserOptions::newFromContext( $this->getContext() );
-                                       $popts->setTidy( true );
+                                       $popts = $page->makeParserOptions( 'canonical' );
                                        $p_result = $wgParser->parse( $page->getRawText(), $title, $popts,
                                                true, true, $page->getLatest() );
 
@@ -173,7 +172,6 @@ class ApiPurge extends ApiBase {
                $psModule = new ApiPageSet( $this );
                return array_merge(
                        parent::getPossibleErrors(),
-                       array( array( 'cantpurge' ), ),
                        $psModule->getPossibleErrors()
                );
        }
index 866b71c..7823e2f 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 7, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -103,6 +103,10 @@ class ApiQuery extends ApiBase {
 
        protected $mAllowedGenerators = array();
 
+       /**
+        * @param $main ApiMain
+        * @param $action string
+        */
        public function __construct( $main, $action ) {
                parent::__construct( $main, $action );
 
@@ -116,8 +120,8 @@ class ApiQuery extends ApiBase {
                $this->mListModuleNames = array_keys( $this->mQueryListModules );
                $this->mMetaModuleNames = array_keys( $this->mQueryMetaModules );
 
-               $this->makeHelpMsgHelper( $this->mQueryPropModules, 'prop' );
-               $this->makeHelpMsgHelper( $this->mQueryListModules, 'list' );
+               $this->makeGeneratorList( $this->mQueryPropModules );
+               $this->makeGeneratorList( $this->mQueryListModules );
        }
 
        /**
@@ -202,6 +206,9 @@ class ApiQuery extends ApiBase {
                return null;
        }
 
+       /**
+        * @return ApiFormatRaw|null
+        */
        public function getCustomPrinter() {
                // If &exportnowrap is set, use the raw formatter
                if ( $this->getParameter( 'export' ) &&
@@ -258,6 +265,9 @@ class ApiQuery extends ApiBase {
                $this->outputGeneralPageInfo();
 
                // Execute all requested modules.
+               /**
+                * @var $module ApiQueryBase
+                */
                foreach ( $modules as $module ) {
                        $params = $module->extractRequestParams();
                        $cacheMode = $this->mergeCacheMode(
@@ -303,6 +313,9 @@ class ApiQuery extends ApiBase {
         */
        private function addCustomFldsToPageSet( $modules, $pageSet ) {
                // Query all requested modules.
+               /**
+                * @var $module ApiQueryBase
+                */
                foreach ( $modules as $module ) {
                        $module->requestExtraData( $pageSet );
                }
@@ -384,6 +397,9 @@ class ApiQuery extends ApiBase {
 
                // Show redirect information
                $redirValues = array();
+               /**
+                * @var $titleTo Title
+                */
                foreach ( $pageSet->getRedirectTitles() as $titleStrFrom => $titleTo ) {
                        $r = array(
                                'from' => strval( $titleStrFrom ),
@@ -602,7 +618,6 @@ class ApiQuery extends ApiBase {
                // Make sure the internal object is empty
                // (just in case a sub-module decides to optimize during instantiation)
                $this->mPageSet = null;
-               $this->mAllowedGenerators = array(); // Will be repopulated
 
                $querySeparator = str_repeat( '--- ', 12 );
                $moduleSeparator = str_repeat( '*** ', 14 );
@@ -614,8 +629,6 @@ class ApiQuery extends ApiBase {
                $msg .= $this->makeHelpMsgHelper( $this->mQueryMetaModules, 'meta' );
                $msg .= "\n\n$moduleSeparator Modules: continuation  $moduleSeparator\n\n";
 
-               // Perform the base call last because the $this->mAllowedGenerators
-               // will be updated inside makeHelpMsgHelper()
                // Use parent to make default message for the query module
                $msg = parent::makeHelpMsg() . $msg;
 
@@ -643,7 +656,6 @@ class ApiQuery extends ApiBase {
                                $msg .= $msg2;
                        }
                        if ( $module instanceof ApiQueryGeneratorBase ) {
-                               $this->mAllowedGenerators[] = $moduleName;
                                $msg .= "Generator:\n  This module may be used as a generator\n";
                        }
                        $moduleDescriptions[] = $msg;
@@ -652,6 +664,19 @@ class ApiQuery extends ApiBase {
                return implode( "\n", $moduleDescriptions );
        }
 
+       /**
+        * Adds any classes that are a subclass of ApiQueryGeneratorBase
+        * to the allowed generator list
+        * @param $moduleList array()
+        */
+       private function makeGeneratorList( $moduleList ) {
+               foreach( $moduleList as  $moduleName => $moduleClass ) {
+                       if ( is_subclass_of( $moduleClass, 'ApiQueryGeneratorBase'  ) ) {
+                               $this->mAllowedGenerators[] = $moduleName;
+                       }
+               }
+       }
+
        /**
         * Override to add extra parameters from PageSet
         * @return string
@@ -674,7 +699,7 @@ class ApiQuery extends ApiBase {
                                        'NOTE: generator parameter names must be prefixed with a \'g\', see examples' ),
                        'redirects' => 'Automatically resolve redirects',
                        'converttitles' => array( "Convert titles to other variants if necessary. Only works if the wiki's content language supports variant conversion.",
-                                       'Languages that support variant conversion include gan, iu, kk, ku, shi, sr, tg, zh' ),
+                                       'Languages that support variant conversion include ' . implode( ', ', LanguageConverter::$languagesWithVariants ) ),
                        'indexpageids' => 'Include an additional pageids section listing all returned page IDs',
                        'export' => 'Export the current revisions of all given or generated pages',
                        'exportnowrap' => 'Return the export XML without wrapping it in an XML result (same format as Special:Export). Can only be used with export',
index 60b57bf..4f4c77f 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on December 12, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -58,6 +58,17 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                $this->addTables( 'category' );
                $this->addFields( 'cat_title' );
 
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       if ( count( $cont ) != 1 ) {
+                               $this->dieUsage( "Invalid continue param. You should pass the " .
+                                       "original value returned by the previous query", "_badcontinue" );
+                       }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $cont_from = $db->addQuotes( $cont[0] );
+                       $this->addWhere( "cat_title $op= $cont_from" );
+               }
+
                $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
                $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
                $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
@@ -92,7 +103,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                                        'pp_page=page_id',
                                        'pp_propname' => 'hiddencat' ) ),
                        ) );
-                       $this->addFields( 'pp_propname AS cat_hidden' );
+                       $this->addFields( array( 'cat_hidden' => 'pp_propname' ) );
                }
 
                $res = $this->select( __METHOD__ );
@@ -104,8 +115,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                foreach ( $res as $row ) {
                        if ( ++ $count > $params['limit'] ) {
                                // We've reached the one extra which shows that there are additional cats to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->cat_title ) );
+                               $this->setContinueEnumParameter( 'continue', $row->cat_title );
                                break;
                        }
 
@@ -127,7 +137,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                                }
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $item );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->cat_title ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->cat_title );
                                        break;
                                }
                        }
@@ -143,6 +153,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
        public function getAllowedParams() {
                return array(
                        'from' => null,
+                       'continue' => null,
                        'to' => null,
                        'prefix' => null,
                        'dir' => array(
@@ -178,6 +189,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
        public function getParamDescription() {
                return array(
                        'from' => 'The category to start enumerating from',
+                       'continue' => 'When more results are available, use this to continue',
                        'to' => 'The category to stop enumerating at',
                        'prefix' => 'Search for all category titles that begin with this value',
                        'dir' => 'Direction to sort in',
@@ -213,6 +225,12 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                return 'Enumerate all categories';
        }
 
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
+               ) );
+       }
+
        public function getExamples() {
                return array(
                        'api.php?action=query&list=allcategories&acprop=size',
index ce5aac2..45cc404 100644 (file)
@@ -85,6 +85,17 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                $params = $this->extractRequestParams();
 
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       if ( count( $cont ) != 1 ) {
+                               $this->dieUsage( "Invalid continue param. You should pass the " .
+                                       "original value returned by the previous query", "_badcontinue" );
+                       }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $cont_from = $db->addQuotes( $cont[0] );
+                       $this->addWhere( "img_name $op= $cont_from" );
+               }
+
                // Image filters
                $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
                $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
@@ -148,8 +159,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                foreach ( $res as $row ) {
                        if ( ++ $count > $limit ) {
                                // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
+                               $this->setContinueEnumParameter( 'continue', $row->img_name );
                                break;
                        }
 
@@ -161,11 +171,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $info );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->img_name );
                                        break;
                                }
                        } else {
-                               $titles[] = Title::makeTitle( NS_IMAGE, $row->img_name );
+                               $titles[] = Title::makeTitle( NS_FILE, $row->img_name );
                        }
                }
 
@@ -179,6 +189,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        public function getAllowedParams() {
                return array (
                        'from' => null,
+                       'continue' => null,
                        'to' => null,
                        'prefix' => null,
                        'minsize' => array(
@@ -215,6 +226,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        public function getParamDescription() {
                return array(
                        'from' => 'The image title to start enumerating from',
+                       'continue' => 'When more results are available, use this to continue',
                        'to' => 'The image title to stop enumerating at',
                        'prefix' => 'Search for all image titles that begin with this value',
                        'dir' => 'The direction in which to list',
@@ -228,7 +240,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                );
        }
 
-       private $propertyFilter = array( 'archivename' );
+       private $propertyFilter = array( 'archivename', 'thumbmime' );
 
        public function getResultProperties() {
                return array_merge(
@@ -254,6 +266,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
                        array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
                        array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
+                       array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
                ) );
        }
 
index 6b8fe57..da4840f 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on July 7, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -77,16 +77,25 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                }
                if ( !is_null( $params['continue'] ) ) {
                        $continueArr = explode( '|', $params['continue'] );
-                       if ( count( $continueArr ) != 2 ) {
-                               $this->dieUsage( 'Invalid continue parameter', 'badcontinue' );
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       if ( $params['unique'] ) {
+                               if ( count( $continueArr ) != 1 ) {
+                                       $this->dieUsage( 'Invalid continue parameter', 'badcontinue' );
+                               }
+                               $continueTitle = $db->addQuotes( $continueArr[0] );
+                               $this->addWhere( "pl_title $op= $continueTitle" );
+                       } else {
+                               if ( count( $continueArr ) != 2 ) {
+                                       $this->dieUsage( 'Invalid continue parameter', 'badcontinue' );
+                               }
+                               $continueTitle = $db->addQuotes( $continueArr[0] );
+                               $continueFrom = intval( $continueArr[1] );
+                               $this->addWhere(
+                                       "pl_title $op $continueTitle OR " .
+                                       "(pl_title = $continueTitle AND " .
+                                       "pl_from $op= $continueFrom)"
+                               );
                        }
-                       $continueTitle = $db->addQuotes( $this->titleToKey( $continueArr[0] ) );
-                       $continueFrom = intval( $continueArr[1] );
-                       $this->addWhere(
-                               "pl_title > $continueTitle OR " .
-                               "(pl_title = $continueTitle AND " .
-                               "pl_from > $continueFrom)"
-                       );
                }
 
                $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
@@ -104,12 +113,13 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                $limit = $params['limit'];
                $this->addOption( 'LIMIT', $limit + 1 );
 
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $orderBy = array();
+               $orderBy[] = 'pl_title' . $sort;
                if ( !$params['unique'] ) {
-                       $this->addOption( 'ORDER BY', array(
-                               'pl_title',
-                               'pl_from'
-                       ));
+                       $orderBy[] = 'pl_from' . $sort;
                }
+               $this->addOption( 'ORDER BY', $orderBy );
 
                $res = $this->select( __METHOD__ );
 
@@ -119,11 +129,10 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                foreach ( $res as $row ) {
                        if ( ++ $count > $limit ) {
                                // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
                                if ( $params['unique'] ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->pl_title ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->pl_title );
                                } else {
-                                       $this->setContinueEnumParameter( 'continue', $this->keyToTitle( $row->pl_title ) . "|" . $row->pl_from );
+                                       $this->setContinueEnumParameter( 'continue', $row->pl_title . "|" . $row->pl_from );
                                }
                                break;
                        }
@@ -140,9 +149,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
                                        if ( $params['unique'] ) {
-                                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->pl_title ) );
+                                               $this->setContinueEnumParameter( 'continue', $row->pl_title );
                                        } else {
-                                               $this->setContinueEnumParameter( 'continue', $this->keyToTitle( $row->pl_title ) . "|" . $row->pl_from );
+                                               $this->setContinueEnumParameter( 'continue', $row->pl_title . "|" . $row->pl_from );
                                        }
                                        break;
                                }
@@ -183,7 +192,14 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_MIN => 1,
                                ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
                                ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       )
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending'
+                               )
+                       ),
                );
        }
 
@@ -202,6 +218,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        'namespace' => 'The namespace to enumerate',
                        'limit' => 'How many total links to return',
                        'continue' => 'When more results are available, use this to continue',
+                       'dir' => 'The direction in which to list',
                );
        }
 
index ac000bf..f5e1146 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Dec 1, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index cfc22ff..16cc31d 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 25, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -67,6 +67,17 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                // Page filters
                $this->addTables( 'page' );
 
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       if ( count( $cont ) != 1 ) {
+                               $this->dieUsage( "Invalid continue param. You should pass the " .
+                                       "original value returned by the previous query", "_badcontinue" );
+                       }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $cont_from = $db->addQuotes( $cont[0] );
+                       $this->addWhere( "page_title $op= $cont_from" );
+               }
+
                if ( $params['filterredir'] == 'redirects' ) {
                        $this->addWhereFld( 'page_is_redirect', 1 );
                } elseif ( $params['filterredir'] == 'nonredirects' ) {
@@ -165,13 +176,22 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                $this->addOption( 'LIMIT', $limit + 1 );
                $res = $this->select( __METHOD__ );
 
+               //Get gender information
+               if( MWNamespace::hasGenderDistinction( $params['namespace'] ) ) {
+                       $users = array();
+                       foreach ( $res as $row ) {
+                               $users[] = $row->page_title;
+                       }
+                       GenderCache::singleton()->doQuery( $users, __METHOD__ );
+                       $res->rewind(); //reset
+               }
+
                $count = 0;
                $result = $this->getResult();
                foreach ( $res as $row ) {
                        if ( ++ $count > $limit ) {
                                // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
+                               $this->setContinueEnumParameter( 'continue', $row->page_title );
                                break;
                        }
 
@@ -184,7 +204,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                );
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->page_title );
                                        break;
                                }
                        } else {
@@ -202,6 +222,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
 
                return array(
                        'from' => null,
+                       'continue' => null,
                        'to' => null,
                        'prefix' => null,
                        'namespace' => array(
@@ -275,6 +296,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                $p = $this->getModulePrefix();
                return array(
                        'from' => 'The page title to start enumerating from',
+                       'continue' => 'When more results are available, use this to continue',
                        'to' => 'The page title to stop enumerating at',
                        'prefix' => 'Search for all page titles that begin with this value',
                        'namespace' => 'The namespace to enumerate',
@@ -314,6 +336,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ),
                        array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ),
+                       array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
                ) );
        }
 
index dda8c72..1325662 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on July 7, 2007
  *
- * Copyright © 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -152,7 +152,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                'INNER JOIN', 'rc_user_text=user_name'
                        ) ) );
 
-                       $this->addFields( 'COUNT(*) AS recentedits' );
+                       $this->addFields( array( 'recentedits' => 'COUNT(*)' ) );
 
                        $this->addWhere( 'rc_log_type IS NULL OR rc_log_type != ' . $db->addQuotes( 'newusers' ) );
                        $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 );
index fcb9c4b..06db87b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 16, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        private $rootTitle;
 
        private $params, $contID, $redirID, $redirect;
-       private $bl_ns, $bl_from, $bl_table, $bl_code, $bl_title, $bl_sort, $bl_fields, $hasNS;
+       private $bl_ns, $bl_from, $bl_table, $bl_code, $bl_title, $bl_fields, $hasNS;
 
        /**
         * Maps ns and title to pageid
@@ -91,14 +91,12 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $this->hasNS = $moduleName !== 'imageusage';
                if ( $this->hasNS ) {
                        $this->bl_title = $prefix . '_title';
-                       $this->bl_sort = "{$this->bl_ns}, {$this->bl_title}, {$this->bl_from}";
                        $this->bl_fields = array(
                                $this->bl_ns,
                                $this->bl_title
                        );
                } else {
                        $this->bl_title = $prefix . '_to';
-                       $this->bl_sort = "{$this->bl_title}, {$this->bl_from}";
                        $this->bl_fields = array(
                                $this->bl_title
                        );
@@ -144,7 +142,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $this->addWhereFld( 'page_namespace', $this->params['namespace'] );
 
                if ( !is_null( $this->contID ) ) {
-                       $this->addWhere( "{$this->bl_from}>={$this->contID}" );
+                       $op = $this->params['dir'] == 'descending' ? '<' : '>';
+                       $this->addWhere( "{$this->bl_from}$op={$this->contID}" );
                }
 
                if ( $this->params['filterredir'] == 'redirects' ) {
@@ -155,7 +154,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                }
 
                $this->addOption( 'LIMIT', $this->params['limit'] + 1 );
-               $this->addOption( 'ORDER BY', $this->bl_from );
+               $sort = ( $this->params['dir'] == 'descending' ? ' DESC' : '' );
+               $this->addOption( 'ORDER BY', $this->bl_from . $sort );
                $this->addOption( 'STRAIGHT_JOIN' );
        }
 
@@ -186,28 +186,35 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 
                // We can't use LinkBatch here because $this->hasNS may be false
                $titleWhere = array();
+               $allRedirNs = array();
+               $allRedirDBkey = array();
                foreach ( $this->redirTitles as $t ) {
-                       $titleWhere[] = "{$this->bl_title} = " . $db->addQuotes( $t->getDBkey() ) .
-                                       ( $this->hasNS ? " AND {$this->bl_ns} = {$t->getNamespace()}" : '' );
+                       $redirNs = $t->getNamespace();
+                       $redirDBkey = $t->getDBkey();
+                       $titleWhere[] = "{$this->bl_title} = " . $db->addQuotes( $redirDBkey ) .
+                                       ( $this->hasNS ? " AND {$this->bl_ns} = {$redirNs}" : '' );
+                       $allRedirNs[] = $redirNs;
+                       $allRedirDBkey[] = $redirDBkey;
                }
                $this->addWhere( $db->makeList( $titleWhere, LIST_OR ) );
                $this->addWhereFld( 'page_namespace', $this->params['namespace'] );
 
                if ( !is_null( $this->redirID ) ) {
+                       $op = $this->params['dir'] == 'descending' ? '<' : '>';
                        $first = $this->redirTitles[0];
                        $title = $db->addQuotes( $first->getDBkey() );
                        $ns = $first->getNamespace();
                        $from = $this->redirID;
                        if ( $this->hasNS ) {
-                               $this->addWhere( "{$this->bl_ns} > $ns OR " .
+                               $this->addWhere( "{$this->bl_ns} $op $ns OR " .
                                                "({$this->bl_ns} = $ns AND " .
-                                               "({$this->bl_title} > $title OR " .
+                                               "({$this->bl_title} $op $title OR " .
                                                "({$this->bl_title} = $title AND " .
-                                               "{$this->bl_from} >= $from)))" );
+                                               "{$this->bl_from} $op= $from)))" );
                        } else {
-                               $this->addWhere( "{$this->bl_title} > $title OR " .
+                               $this->addWhere( "{$this->bl_title} $op $title OR " .
                                                "({$this->bl_title} = $title AND " .
-                                               "{$this->bl_from} >= $from)" );
+                                               "{$this->bl_from} $op= $from)" );
                        }
                }
                if ( $this->params['filterredir'] == 'redirects' ) {
@@ -217,7 +224,17 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                }
 
                $this->addOption( 'LIMIT', $this->params['limit'] + 1 );
-               $this->addOption( 'ORDER BY', $this->bl_sort );
+               $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 ) {
+                       $orderBy[] = $this->bl_ns . $sort;
+               }
+               if( count( array_unique( $allRedirDBkey ) ) != 1 ) {
+                       $orderBy[] = $this->bl_title . $sort;
+               }
+               $orderBy[] = $this->bl_from . $sort;
+               $this->addOption( 'ORDER BY', $orderBy );
                $this->addOption( 'USE INDEX', array( 'page' => 'PRIMARY' ) );
        }
 
@@ -277,7 +294,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                        if ( $this->hasNS ) {
                                                $parentID = $this->pageMap[$row-> { $this->bl_ns } ][$row-> { $this->bl_title } ];
                                        } else {
-                                               $parentID = $this->pageMap[NS_IMAGE][$row-> { $this->bl_title } ];
+                                               $parentID = $this->pageMap[NS_FILE][$row-> { $this->bl_title } ];
                                        }
                                        $this->continueStr = $this->getContinueRedirStr( $parentID, $row->page_id );
                                        break;
@@ -438,6 +455,13 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => 'namespace'
                        ),
+                       'dir' => array(\r
+                               ApiBase::PARAM_DFLT => 'ascending',\r
+                               ApiBase::PARAM_TYPE => array(\r
+                                       'ascending',\r
+                                       'descending'\r
+                               )\r
+                       ),
                        'filterredir' => array(
                                ApiBase::PARAM_DFLT => 'all',
                                ApiBase::PARAM_TYPE => array(
@@ -467,6 +491,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        'pageid' => "Pageid to search. Cannot be used together with {$this->bl_code}title",
                        'continue' => 'When more results are available, use this to continue',
                        'namespace' => 'The namespace to enumerate',
+                       'dir' => 'The direction in which to list',
                );
                if ( $this->getModuleName() != 'embeddedin' ) {
                        return array_merge( $retval, array(
index 92fabdd..2c48aca 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 7, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -571,6 +571,11 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
 
        private $mIsGenerator;
 
+       /**
+        * @param $query ApiBase
+        * @param $moduleName string
+        * @param $paramPrefix string
+        */
        public function __construct( $query, $moduleName, $paramPrefix = '' ) {
                parent::__construct( $query, $moduleName, $paramPrefix );
                $this->mIsGenerator = false;
index 49cd590..96b8696 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 10, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -299,8 +299,8 @@ class ApiQueryBlocks extends ApiQueryBase {
                        'start' => 'The timestamp to start enumerating from',
                        'end' => 'The timestamp to stop enumerating at',
                        'dir' => $this->getDirectionDescription( $p ),
-                       'ids' => 'Pipe-separated list of block IDs to list (optional)',
-                       'users' => 'Pipe-separated list of users to search for (optional)',
+                       'ids' => 'List of block IDs to list (optional)',
+                       'users' => 'List of users to search for (optional)',
                        'ip' => array(  'Get all blocks applying to this IP or CIDR range, including range blocks.',
                                        'Cannot be used together with bkusers. CIDR ranges broader than /16 are not accepted' ),
                        'limit' => 'The maximum amount of blocks to list',
@@ -383,13 +383,15 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
+               return array_merge( parent::getPossibleErrors(),
                        $this->getRequireOnlyOneParameterErrorMessages( array( 'users', 'ip' ) ),
-                       array( 'code' => 'cidrtoobroad', 'info' => 'CIDR ranges broader than /16 are not accepted' ),
-                       array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ),
-                       array( 'code' => 'param_user', 'info' => 'User name user is not valid' ),
-                       array( 'show' ),
-               ) );
+                       array(
+                               array( 'code' => 'cidrtoobroad', 'info' => 'CIDR ranges broader than /16 are not accepted' ),
+                               array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ),
+                               array( 'code' => 'param_user', 'info' => 'User name user is not valid' ),
+                               array( 'show' ),
+                       )
+               );
        }
 
        public function getExamples() {
index 283eb13..309c2ce 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on May 13, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -91,7 +91,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                        }
                        $op = $params['dir'] == 'descending' ? '<' : '>';
                        $clfrom = intval( $cont[0] );
-                       $clto = $this->getDB()->addQuotes( $this->titleToKey( $cont[1] ) );
+                       $clto = $this->getDB()->addQuotes( $cont[1] );
                        $this->addWhere(
                                "cl_from $op $clfrom OR " .
                                "(cl_from = $clfrom AND " .
@@ -143,8 +143,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                                if ( ++$count > $params['limit'] ) {
                                        // We've reached the one extra which shows that
                                        // there are additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'continue', $row->cl_from .
-                                                       '|' . $this->keyToTitle( $row->cl_to ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->cl_from . '|' . $row->cl_to );
                                        break;
                                }
 
@@ -164,8 +163,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
 
                                $fit = $this->addPageSubItem( $row->cl_from, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue', $row->cl_from .
-                                                       '|' . $this->keyToTitle( $row->cl_to ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->cl_from . '|' . $row->cl_to );
                                        break;
                                }
                        }
@@ -175,8 +173,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                                if ( ++$count > $params['limit'] ) {
                                        // We've reached the one extra which shows that
                                        // there are additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'continue', $row->cl_from .
-                                                       '|' . $this->keyToTitle( $row->cl_to ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->cl_from . '|' . $row->cl_to );
                                        break;
                                }
 
index e5eca85..31517fa 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on May 13, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,8 @@
  */
 
 /**
- * This query adds the <categories> subelement to all pages with the list of categories the page is in
+ * This query adds the "<categories>" subelement to all pages with the list of
+ * categories the page is in.
  *
  * @ingroup API
  */
@@ -61,7 +62,7 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
                                'pp_propname' => 'hiddencat' ) ),
                ) );
 
-               $this->addFields( array( 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files', 'pp_propname AS cat_hidden' ) );
+               $this->addFields( array( 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files', 'cat_hidden' => 'pp_propname' ) );
                $this->addWhere( array( 'cat_title' => $cattitles ) );
 
                if ( !is_null( $params['continue'] ) ) {
index 9f66f22..55ce023 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on June 14, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 06f649d..e69ccbd 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Jul 2, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -164,7 +164,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', 'badcontinue' );
                        }
                        $ns = intval( $cont[0] );
-                       $title = $db->addQuotes( $this->titleToKey( $cont[1] ) );
+                       $title = $db->addQuotes( $cont[1] );
                        $ts = $db->addQuotes( $db->timestamp( $cont[2] ) );
                        $op = ( $dir == 'newer' ? '>' : '<' );
                        $this->addWhere( "ar_namespace $op $ns OR " .
@@ -180,9 +180,10 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        if ( $params['unique'] ) {
                                $this->addOption( 'GROUP BY', 'ar_title' );
                        } else {
+                               $sort = ( $dir == 'newer' ? '' : ' DESC' );
                                $this->addOption( 'ORDER BY', array(
-                                       'ar_title',
-                                       'ar_timestamp'
+                                       'ar_title' . $sort,
+                                       'ar_timestamp' . $sort
                                ));
                        }
                } else {
@@ -202,7 +203,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                // We've had enough
                                if ( $mode == 'all' || $mode == 'revs' ) {
                                        $this->setContinueEnumParameter( 'continue', intval( $row->ar_namespace ) . '|' .
-                                               $this->keyToTitle( $row->ar_title ) . '|' . $row->ar_timestamp );
+                                               $row->ar_title . '|' . $row->ar_timestamp );
                                } else {
                                        $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ar_timestamp ) );
                                }
@@ -268,7 +269,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        if ( !$fit ) {
                                if ( $mode == 'all' || $mode == 'revs' ) {
                                        $this->setContinueEnumParameter( 'continue', intval( $row->ar_namespace ) . '|' .
-                                               $this->keyToTitle( $row->ar_title ) . '|' . $row->ar_timestamp );
+                                               $row->ar_title . '|' . $row->ar_timestamp );
                                } else {
                                        $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->ar_timestamp ) );
                                }
index d68480c..6715969 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 25, 2008
  *
- * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 856d0fd..8f0fd3b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 27, 2008
  *
- * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -59,77 +59,99 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                }
                $images = $namespaces[NS_FILE];
 
-               $this->addTables( 'image', 'i1' );
-               $this->addTables( 'image', 'i2' );
-               $this->addFields( array(
-                       'i1.img_name AS orig_name',
-                       'i2.img_name AS dup_name',
-                       'i2.img_user_text AS dup_user_text',
-                       'i2.img_timestamp AS dup_timestamp'
-               ) );
-
-               $this->addWhere( array(
-                       'i1.img_name' => array_keys( $images ),
-                       'i1.img_sha1 = i2.img_sha1',
-                       'i1.img_name != i2.img_name',
-               ) );
+               if( $params['dir'] == 'descending' ) {
+                       $images = array_reverse( $images );
+               }
 
+               $skipUntilThisDup = false;
                if ( isset( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
                        if ( count( $cont ) != 2 ) {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
-                       $op = $params['dir'] == 'descending' ? '<' : '>';
-                       $db = $this->getDB();
-                       $orig = $db->addQuotes( $this->titleTokey( $cont[0] ) );
-                       $dup = $db->addQuotes( $this->titleToKey( $cont[1] ) );
-                       $this->addWhere(
-                               "i1.img_name $op $orig OR " .
-                               "(i1.img_name = $orig AND " .
-                               "i2.img_name $op= $dup)"
-                       );
+                       $fromImage = $cont[0];
+                       $skipUntilThisDup = $cont[1];
+                       // Filter out any images before $fromImage
+                       foreach ( $images as $image => $pageId ) {
+                               if ( $image < $fromImage ) {
+                                       unset( $images[$image] );
+                               } else {
+                                       break;
+                               }
+                       }
                }
 
-               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-               // Don't order by i1.img_name if it's constant in the WHERE clause
-               if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
-                       $this->addOption( 'ORDER BY', 'i2.img_name' . $sort );
+               $filesToFind = array_keys( $images );
+               if( $params['localonly'] ) {
+                       $files = RepoGroup::singleton()->getLocalRepo()->findFiles( $filesToFind );
                } else {
-                       $this->addOption( 'ORDER BY', array(
-                                       'i1.img_name' . $sort,
-                                       'i2.img_name' . $sort
-                       ));
+                       $files = RepoGroup::singleton()->findFiles( $filesToFind );
                }
-               $this->addOption( 'LIMIT', $params['limit'] + 1 );
 
-               $res = $this->select( __METHOD__ );
+               $fit = true;
                $count = 0;
                $titles = array();
-               foreach ( $res as $row ) {
-                       if ( ++$count > $params['limit'] ) {
-                               // We've reached the one extra which shows that
-                               // there are additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'continue',
-                                       $this->keyToTitle( $row->orig_name ) . '|' .
-                                       $this->keyToTitle( $row->dup_name ) );
-                               break;
+
+               $sha1s = array();
+               foreach ( $files as $file ) {
+                       $sha1s[$file->getName()] = $file->getSha1();
+               }
+
+               // find all files with the hashes, result format is: array( hash => array( dup1, dup2 ), hash1 => ... )
+               $filesToFindBySha1s = array_unique( array_values( $sha1s ) );
+               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] ) ) {
+                               continue; //file does not exist
+                       }
+                       $sha1 = $sha1s[$image];
+                       $dupFiles = $filesBySha1s[$sha1];
+                       if( $params['dir'] == 'descending' ) {
+                               $dupFiles = array_reverse( $dupFiles );
                        }
-                       if ( !is_null( $resultPageSet ) ) {
-                               $titles[] = Title::makeTitle( NS_FILE, $row->dup_name );
-                       } else {
-                               $r = array(
-                                       'name' => $row->dup_name,
-                                       'user' => $row->dup_user_text,
-                                       'timestamp' => wfTimestamp( TS_ISO_8601, $row->dup_timestamp )
-                               );
-                               $fit = $this->addPageSubItem( $images[$row->orig_name], $r );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue',
-                                                       $this->keyToTitle( $row->orig_name ) . '|' .
-                                                       $this->keyToTitle( $row->dup_name ) );
+                       foreach ( $dupFiles as $dupFile ) {
+                               $dupName = $dupFile->getName();
+                               if( $image == $dupName && $dupFile->isLocal() ) {
+                                       continue; //ignore the local file itself
+                               }
+                               if( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
+                                       continue; //skip to pos after the image from continue param
+                               }
+                               $skipUntilThisDup = false;
+                               if ( ++$count > $params['limit'] ) {
+                                       $fit = false; //break outer loop
+                                       // We're one over limit which shows that
+                                       // there are additional images to be had. Stop here...
+                                       $this->setContinueEnumParameter( 'continue', $image . '|' . $dupName );
                                        break;
                                }
+                               if ( !is_null( $resultPageSet ) ) {
+                                       $titles[] = $file->getTitle();
+                               } else {
+                                       $r = array(
+                                               'name' => $dupName,
+                                               'user' => $dupFile->getUser( 'text' ),
+                                               'timestamp' => wfTimestamp( TS_ISO_8601, $dupFile->getTimestamp() )
+                                       );
+                                       if( !$dupFile->isLocal() ) {
+                                               $r['shared'] = '';
+                                       }
+                                       $fit = $this->addPageSubItem( $pageId, $r );
+                                       if ( !$fit ) {
+                                               $this->setContinueEnumParameter( 'continue', $image . '|' . $dupName );
+                                               break;
+                                       }
+                               }
+                       }
+                       if( !$fit ) {
+                               break;
                        }
                }
                if ( !is_null( $resultPageSet ) ) {
@@ -154,14 +176,16 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                                        'descending'
                                )
                        ),
+                       'localonly' => false,
                );
        }
 
        public function getParamDescription() {
                return array(
-                       'limit' => 'How many files to return',
+                       'limit' => 'How many duplicate files to return',
                        'continue' => 'When more results are available, use this to continue',
                        'dir' => 'The direction in which to list',
+                       'localonly' => 'Look only for files in the local repository',
                );
        }
 
@@ -170,13 +194,14 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                        '' => array(
                                'name' => 'string',
                                'user' => 'string',
-                               'timestamp' => 'timestamp'
+                               'timestamp' => 'timestamp',
+                               'shared' => 'boolean',
                        )
                );
        }
 
        public function getDescription() {
-               return 'List all files that are duplicates of the given file(s)';
+               return 'List all files that are duplicates of the given file(s) based on hash values';
        }
 
        public function getPossibleErrors() {
index 221ffac..42b398b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on July 7, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 999ddc8..9365a9b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on May 13, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 07d5b41..a5486ef 100644 (file)
@@ -59,6 +59,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $fld_mediatype = isset( $prop['mediatype'] );
                $fld_metadata = isset( $prop['metadata'] );
                $fld_bitdepth = isset( $prop['bitdepth'] );
+               $fld_archivename = isset( $prop['archivename'] );
 
                $this->addTables( 'filearchive' );
 
@@ -72,10 +73,25 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $this->addFieldsIf( 'fa_media_type', $fld_mediatype );
                $this->addFieldsIf( 'fa_metadata', $fld_metadata );
                $this->addFieldsIf( 'fa_bits', $fld_bitdepth );
+               $this->addFieldsIf( 'fa_archive_name', $fld_archivename );
+
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       if ( count( $cont ) != 1 ) {
+                               $this->dieUsage( "Invalid continue param. You should pass the " .
+                                       "original value returned by the previous query", "_badcontinue" );
+                       }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $cont_from = $db->addQuotes( $cont[0] );
+                       $this->addWhere( "fa_name $op= $cont_from" );
+               }
 
                // Image filters
                $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
                $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+               if ( !is_null( $params['continue'] ) ) {
+                       $from = $params['continue'];
+               }
                $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
                $this->addWhereRange( 'fa_name', $dir, $from, $to );
                if ( isset( $params['prefix'] ) ) {
@@ -129,8 +145,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                foreach ( $res as $row ) {
                        if ( ++$count > $limit ) {
                                // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->fa_name ) );
+                               $this->setContinueEnumParameter( 'continue', $row->fa_name );
                                break;
                        }
 
@@ -181,6 +196,9 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        if ( $fld_mime ) {
                                $file['mime'] = "$row->fa_major_mime/$row->fa_minor_mime";
                        }
+                       if ( $fld_archivename && !is_null( $row->fa_archive_name ) ) {
+                               $file['archivename'] = $row->fa_archive_name;
+                       }
 
                        if ( $row->fa_deleted & File::DELETED_FILE ) {
                                $file['filehidden'] = '';
@@ -199,7 +217,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
 
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $file );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->fa_name ) );
+                               $this->setContinueEnumParameter( 'continue', $row->fa_name );
                                break;
                        }
                }
@@ -210,6 +228,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
        public function getAllowedParams() {
                return array (
                        'from' => null,
+                       'continue' => null,
                        'to' => null,
                        'prefix' => null,
                        'limit' => array(
@@ -242,7 +261,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                        'mime',
                                        'mediatype',
                                        'metadata',
-                                       'bitdepth'
+                                       'bitdepth',
+                                       'archivename',
                                ),
                        ),
                );
@@ -251,6 +271,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
        public function getParamDescription() {
                return array(
                        'from' => 'The image title to start enumerating from',
+                       'continue' => 'When more results are available, use this to continue',
                        'to' => 'The image title to stop enumerating at',
                        'prefix' => 'Search for all image titles that begin with this value',
                        'dir' => 'The direction in which to list',
@@ -270,6 +291,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                ' mediatype         - Adds the media type of the image',
                                ' metadata          - Lists EXIF metadata for the version of the image',
                                ' bitdepth          - Adds the bit depth of the version',
+                               ' archivename       - Adds the file name of the archive version for non-latest versions'
                        ),
                );
        }
@@ -331,7 +353,10 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        ),
                        'mediatype' => array(
                                'mediatype' => 'string'
-                       )
+                       ),
+                       'archivename' => array(
+                               'archivename' => 'string'
+                       ),
                );
        }
 
@@ -345,6 +370,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        array( 'code' => 'hashsearchdisabled', 'info' => 'Search by hash disabled in Miser Mode' ),
                        array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
                        array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
+                       array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
                ) );
        }
 
index d2837e9..c5012f0 100644 (file)
@@ -5,7 +5,7 @@
  * Created on May 14, 2010
  *
  * Copyright © 2010 Sam Reed
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -62,15 +62,16 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                        }
 
                        $db = $this->getDB();
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $prefix = $db->addQuotes( $cont[0] );
-                       $title = $db->addQuotes( $this->titleToKey( $cont[1] ) );
+                       $title = $db->addQuotes( $cont[1] );
                        $from = intval( $cont[2] );
                        $this->addWhere(
-                               "iwl_prefix > $prefix OR " .
+                               "iwl_prefix $op $prefix OR " .
                                "(iwl_prefix = $prefix AND " .
-                               "(iwl_title > $title OR " .
+                               "(iwl_title $op $title OR " .
                                "(iwl_title = $title AND " .
-                               "iwl_from >= $from)))"
+                               "iwl_from $op= $from)))"
                        );
                }
 
@@ -84,22 +85,23 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                $this->addFields( array( 'page_id', 'page_title', 'page_namespace', 'page_is_redirect',
                        'iwl_from', 'iwl_prefix', 'iwl_title' ) );
 
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                if ( isset( $params['prefix'] ) ) {
                        $this->addWhereFld( 'iwl_prefix', $params['prefix'] );
                        if ( isset( $params['title'] ) ) {
                                $this->addWhereFld( 'iwl_title', $params['title'] );
-                               $this->addOption( 'ORDER BY', 'iwl_from' );
+                               $this->addOption( 'ORDER BY', 'iwl_from' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                       'iwl_title',
-                                       'iwl_from'
+                                       'iwl_title' . $sort,
+                                       'iwl_from' . $sort
                                ));
                        }
                } else {
                        $this->addOption( 'ORDER BY', array(
-                               'iwl_prefix',
-                               'iwl_title',
-                               'iwl_from'
+                               'iwl_prefix' . $sort,
+                               'iwl_title' . $sort,
+                               'iwl_from' . $sort
                        ));
                }
 
@@ -178,6 +180,13 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                                        'iwtitle',
                                ),
                        ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending'
+                               )
+                       ),
                );
        }
 
@@ -192,6 +201,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                                ' iwtitle        - Adds the title of the interwiki',
                        ),
                        'limit' => 'How many total pages to return',
+                       'dir' => 'The direction in which to list',
                );
        }
 
index 7e69513..30c7f5a 100644 (file)
@@ -5,7 +5,7 @@
  * Created on May 14, 2010
  *
  * Copyright © 2010 Sam Reed
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -66,7 +66,7 @@ class ApiQueryIWLinks extends ApiQueryBase {
                        $db = $this->getDB();
                        $iwlfrom = intval( $cont[0] );
                        $iwlprefix = $db->addQuotes( $cont[1] );
-                       $iwltitle = $db->addQuotes( $this->titleToKey( $cont[2] ) );
+                       $iwltitle = $db->addQuotes( $cont[2] );
                        $this->addWhere(
                                "iwl_from $op $iwlfrom OR " .
                                "(iwl_from = $iwlfrom AND " .
index 969293b..d822eed 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on July 6, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -73,7 +73,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        }
 
                        $result = $this->getResult();
-                       $images = RepoGroup::singleton()->findFiles( $titles );
+                       //search only inside the local repo
+                       if( $params['localonly'] ) {
+                               $images = RepoGroup::singleton()->getLocalRepo()->findFiles( $titles );
+                       } else {
+                               $images = RepoGroup::singleton()->findFiles( $titles );
+                       }
                        foreach ( $images as $img ) {
                                // Skip redirects
                                if ( $img->getOriginalTitle()->isRedirect() ) {
@@ -81,14 +86,14 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                }
 
                                $start = $skip ? $fromTimestamp : $params['start'];
-                               $pageId = $pageIds[NS_IMAGE][ $img->getOriginalTitle()->getDBkey() ];
+                               $pageId = $pageIds[NS_FILE][ $img->getOriginalTitle()->getDBkey() ];
 
                                $fit = $result->addValue(
                                        array( 'query', 'pages', intval( $pageId ) ),
                                        'imagerepository', $img->getRepoName()
                                );
                                if ( !$fit ) {
-                                       if ( count( $pageIds[NS_IMAGE] ) == 1 ) {
+                                       if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                // The user is screwed. imageinfo can't be solely
                                                // responsible for exceeding the limit in this case,
                                                // so set a query-continue that just returns the same
@@ -119,7 +124,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                                self::getInfo( $img, $prop, $result,
                                                        $finalThumbParams, $params['metadataversion'] ) );
                                        if ( !$fit ) {
-                                               if ( count( $pageIds[NS_IMAGE] ) == 1 ) {
+                                               if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                        // See the 'the user is screwed' comment above
                                                        $this->setContinueEnumParameter( 'start',
                                                                wfTimestamp( TS_ISO_8601, $img->getTimestamp() ) );
@@ -149,7 +154,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                                self::getInfo( $oldie, $prop, $result,
                                                        $finalThumbParams, $params['metadataversion'] ) );
                                        if ( !$fit ) {
-                                               if ( count( $pageIds[NS_IMAGE] ) == 1 ) {
+                                               if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                        $this->setContinueEnumParameter( 'start',
                                                                wfTimestamp( TS_ISO_8601, $oldie->getTimestamp() ) );
                                                } else {
@@ -356,8 +361,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                                        if ( isset( $prop['thumbmime'] ) && $file->getHandler() ) {
                                                list( $ext, $mime ) = $file->getHandler()->getThumbType(
-                                                       substr( $mto->getPath(), strrpos( $mto->getPath(), '.' ) + 1 ),
-                                                       $file->getMimeType(), $thumbParams );
+                                                       $mto->getExtension(), $file->getMimeType(), $thumbParams );
                                                $vals['thumbmime'] = $mime;
                                        }
                                } elseif ( $mto && $mto->isError() ) {
@@ -472,6 +476,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                ApiBase::PARAM_TYPE => 'string',
                        ),
                        'continue' => null,
+                       'localonly' => false,
                );
        }
 
@@ -491,7 +496,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         *
         * @return array
         */
-       private static function getProperties() {
+       private static function getProperties( $modulePrefix = '' ) {
                return array(
                        'timestamp' =>      ' timestamp     - Adds timestamp for the uploaded version',
                        'user' =>           ' user          - Adds the user who uploaded the image version',
@@ -503,7 +508,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'dimensions' =>     ' dimensions    - Alias for size', // For backwards compatibility with Allimages
                        'sha1' =>           ' sha1          - Adds SHA-1 hash for the image',
                        'mime' =>           ' mime          - Adds MIME type of the image',
-                       'thumbmime' =>      ' thumbmime     - Adds MIME type of the image thumbnail (requires url)',
+                       'thumbmime' =>      ' thumbmime     - Adds MIME type of the image thumbnail' .
+                               ' (requires url and param ' . $modulePrefix . 'urlwidth)',
                        'mediatype' =>      ' mediatype     - Adds the media type of the image',
                        'metadata' =>       ' metadata      - Lists EXIF metadata for the version of the image',
                        'archivename' =>    ' archivename   - Adds the file name of the archive version for non-latest versions',
@@ -518,10 +524,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
         *
         * @return array
         */
-       public static function getPropertyDescriptions( $filter = array() ) {
+       public static function getPropertyDescriptions( $filter = array(), $modulePrefix = '' ) {
                return array_merge(
                        array( 'What image information to get:' ),
-                       array_values( array_diff_key( self::getProperties(), array_flip( $filter ) ) )
+                       array_values( array_diff_key( self::getProperties( $modulePrefix ), array_flip( $filter ) ) )
                );
        }
 
@@ -532,7 +538,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
        public function getParamDescription() {
                $p = $this->getModulePrefix();
                return array(
-                       'prop' => self::getPropertyDescriptions(),
+                       'prop' => self::getPropertyDescriptions( array(), $p ),
                        'urlwidth' => array( "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
                                            'Only the current version of the image can be scaled' ),
                        'urlheight' => "Similar to {$p}urlwidth. Cannot be used without {$p}urlwidth",
@@ -543,7 +549,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'end' => 'Timestamp to stop listing at',
                        'metadataversion' => array( "Version of metadata to use. if 'latest' is specified, use latest version.",
                                                "Defaults to '1' for backwards compatibility" ),
-                       'continue' => 'If the query response includes a continue value, use it here to get another page of results'
+                       'continue' => 'If the query response includes a continue value, use it here to get another page of results',
+                       'localonly' => 'Look only for files in the local repository',
                );
        }
 
index 147ab67..6052a75 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on May 13, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,8 @@
  */
 
 /**
- * This query adds an <images> subelement to all pages with the list of images embedded into those pages.
+ * This query adds an "<images>" subelement to all pages with the list of
+ * images embedded into those pages.
  *
  * @ingroup API
  */
@@ -67,7 +68,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                        }
                        $op = $params['dir'] == 'descending' ? '<' : '>';
                        $ilfrom = intval( $cont[0] );
-                       $ilto = $this->getDB()->addQuotes( $this->titleToKey( $cont[1] ) );
+                       $ilto = $this->getDB()->addQuotes( $cont[1] );
                        $this->addWhere(
                                "il_from $op $ilfrom OR " .
                                "(il_from = $ilfrom AND " .
@@ -108,16 +109,14 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                                if ( ++$count > $params['limit'] ) {
                                        // We've reached the one extra which shows that
                                        // there are additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'continue', $row->il_from .
-                                                       '|' . $this->keyToTitle( $row->il_to ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->il_from . '|' . $row->il_to );
                                        break;
                                }
                                $vals = array();
                                ApiQueryBase::addTitleInfo( $vals, Title::makeTitle( NS_FILE, $row->il_to ) );
                                $fit = $this->addPageSubItem( $row->il_from, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue', $row->il_from .
-                                                       '|' . $this->keyToTitle( $row->il_to ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->il_from . '|' . $row->il_to );
                                        break;
                                }
                        }
@@ -128,8 +127,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                                if ( ++$count > $params['limit'] ) {
                                        // We've reached the one extra which shows that
                                        // there are additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'continue', $row->il_from .
-                                                       '|' . $this->keyToTitle( $row->il_to ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->il_from . '|' . $row->il_to );
                                        break;
                                }
                                $titles[] = Title::makeTitle( NS_FILE, $row->il_to );
index a6c0ed5..5d4f034 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 25, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@ class ApiQueryInfo extends ApiQueryBase {
 
        private $fld_protection = false, $fld_talkid = false,
                $fld_subjectid = false, $fld_url = false,
-               $fld_readable = false, $fld_watched = false,
+               $fld_readable = false, $fld_watched = false, $fld_notificationtimestamp = false,
                $fld_preload = false, $fld_displaytitle = false;
 
        private $params, $titles, $missing, $everything, $pageCounter;
@@ -41,7 +41,7 @@ class ApiQueryInfo extends ApiQueryBase {
        private $pageRestrictions, $pageIsRedir, $pageIsNew, $pageTouched,
                $pageLatest, $pageLength;
 
-       private $protections, $watched, $talkids, $subjectids, $displaytitles;
+       private $protections, $watched, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
 
        private $tokenFunctions;
 
@@ -57,7 +57,10 @@ class ApiQueryInfo extends ApiQueryBase {
                global $wgDisableCounters;
 
                $pageSet->requestField( 'page_restrictions' );
-               $pageSet->requestField( 'page_is_redirect' );
+               // when resolving redirects, no page will have this field
+               if( !$pageSet->isResolvingRedirects() ) {
+                       $pageSet->requestField( 'page_is_redirect' );
+               }
                $pageSet->requestField( 'page_is_new' );
                if ( !$wgDisableCounters ) {
                        $pageSet->requestField( 'page_counter' );
@@ -99,6 +102,12 @@ class ApiQueryInfo extends ApiQueryBase {
                return $this->tokenFunctions;
        }
 
+       static $cachedTokens = array();
+
+       public static function resetTokenCache() {
+               ApiQueryInfo::$cachedTokens = array();
+       }
+
        public static function getEditToken( $pageid, $title ) {
                // We could check for $title->userCan('edit') here,
                // but that's too expensive for this purpose
@@ -108,14 +117,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               // The edit token is always the same, let's exploit that
-               static $cachedEditToken = null;
-               if ( !is_null( $cachedEditToken ) ) {
-                       return $cachedEditToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'edit' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'edit' ] = $wgUser->getEditToken();
                }
 
-               $cachedEditToken = $wgUser->getEditToken();
-               return $cachedEditToken;
+               return ApiQueryInfo::$cachedTokens[ 'edit' ];
        }
 
        public static function getDeleteToken( $pageid, $title ) {
@@ -124,13 +131,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedDeleteToken = null;
-               if ( !is_null( $cachedDeleteToken ) ) {
-                       return $cachedDeleteToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'delete' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'delete' ] = $wgUser->getEditToken();
                }
 
-               $cachedDeleteToken = $wgUser->getEditToken();
-               return $cachedDeleteToken;
+               return ApiQueryInfo::$cachedTokens[ 'delete' ];
        }
 
        public static function getProtectToken( $pageid, $title ) {
@@ -139,13 +145,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedProtectToken = null;
-               if ( !is_null( $cachedProtectToken ) ) {
-                       return $cachedProtectToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'protect' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'protect' ] = $wgUser->getEditToken();
                }
 
-               $cachedProtectToken = $wgUser->getEditToken();
-               return $cachedProtectToken;
+               return ApiQueryInfo::$cachedTokens[ 'protect' ];
        }
 
        public static function getMoveToken( $pageid, $title ) {
@@ -154,13 +159,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedMoveToken = null;
-               if ( !is_null( $cachedMoveToken ) ) {
-                       return $cachedMoveToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'move' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'move' ] = $wgUser->getEditToken();
                }
 
-               $cachedMoveToken = $wgUser->getEditToken();
-               return $cachedMoveToken;
+               return ApiQueryInfo::$cachedTokens[ 'move' ];
        }
 
        public static function getBlockToken( $pageid, $title ) {
@@ -169,13 +173,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedBlockToken = null;
-               if ( !is_null( $cachedBlockToken ) ) {
-                       return $cachedBlockToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'block' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'block' ] = $wgUser->getEditToken();
                }
 
-               $cachedBlockToken = $wgUser->getEditToken();
-               return $cachedBlockToken;
+               return ApiQueryInfo::$cachedTokens[ 'block' ];
        }
 
        public static function getUnblockToken( $pageid, $title ) {
@@ -189,13 +192,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedEmailToken = null;
-               if ( !is_null( $cachedEmailToken ) ) {
-                       return $cachedEmailToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'email' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'email' ] = $wgUser->getEditToken();
                }
 
-               $cachedEmailToken = $wgUser->getEditToken();
-               return $cachedEmailToken;
+               return ApiQueryInfo::$cachedTokens[ 'email' ];
        }
 
        public static function getImportToken( $pageid, $title ) {
@@ -204,13 +206,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedImportToken = null;
-               if ( !is_null( $cachedImportToken ) ) {
-                       return $cachedImportToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'import' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'import' ] = $wgUser->getEditToken();
                }
 
-               $cachedImportToken = $wgUser->getEditToken();
-               return $cachedImportToken;
+               return ApiQueryInfo::$cachedTokens[ 'import' ];
        }
 
        public static function getWatchToken( $pageid, $title ) {
@@ -219,13 +220,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedWatchToken = null;
-               if ( !is_null( $cachedWatchToken ) ) {
-                       return $cachedWatchToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'watch' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'watch' ] = $wgUser->getEditToken( 'watch' );
                }
 
-               $cachedWatchToken = $wgUser->getEditToken( 'watch' );
-               return $cachedWatchToken;
+               return ApiQueryInfo::$cachedTokens[ 'watch' ];
        }
 
        public static function getOptionsToken( $pageid, $title ) {
@@ -234,13 +234,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedOptionsToken = null;
-               if ( !is_null( $cachedOptionsToken ) ) {
-                       return $cachedOptionsToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'options' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'options' ] = $wgUser->getEditToken();
                }
 
-               $cachedOptionsToken = $wgUser->getEditToken();
-               return $cachedOptionsToken;
+               return ApiQueryInfo::$cachedTokens[ 'options' ];
        }
 
        public function execute() {
@@ -249,6 +248,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        $prop = array_flip( $this->params['prop'] );
                        $this->fld_protection = isset( $prop['protection'] );
                        $this->fld_watched = isset( $prop['watched'] );
+                       $this->fld_notificationtimestamp = isset( $prop['notificationtimestamp'] );
                        $this->fld_talkid = isset( $prop['talkid'] );
                        $this->fld_subjectid = isset( $prop['subjectid'] );
                        $this->fld_url = isset( $prop['url'] );
@@ -284,7 +284,10 @@ class ApiQueryInfo extends ApiQueryBase {
                }
 
                $this->pageRestrictions = $pageSet->getCustomField( 'page_restrictions' );
-               $this->pageIsRedir = $pageSet->getCustomField( 'page_is_redirect' );
+               // when resolving redirects, no page will have this field
+               $this->pageIsRedir = !$pageSet->isResolvingRedirects()
+                       ? $pageSet->getCustomField( 'page_is_redirect' )
+                       : array();
                $this->pageIsNew = $pageSet->getCustomField( 'page_is_new' );
 
                global $wgDisableCounters;
@@ -301,7 +304,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        $this->getProtectionInfo();
                }
 
-               if ( $this->fld_watched ) {
+               if ( $this->fld_watched || $this->fld_notificationtimestamp ) {
                        $this->getWatchedInfo();
                }
 
@@ -350,7 +353,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                : intval( $this->pageCounter[$pageid] );
                        $pageInfo['length'] = intval( $this->pageLength[$pageid] );
 
-                       if ( $this->pageIsRedir[$pageid] ) {
+                       if ( isset( $this->pageIsRedir[$pageid] ) && $this->pageIsRedir[$pageid] ) {
                                $pageInfo['redirect'] = '';
                        }
                        if ( $this->pageIsNew[$pageid] ) {
@@ -384,6 +387,13 @@ class ApiQueryInfo extends ApiQueryBase {
                        $pageInfo['watched'] = '';
                }
 
+               if ( $this->fld_notificationtimestamp ) {
+                       $pageInfo['notificationtimestamp'] = '';
+                       if ( isset( $this->notificationtimestamps[$ns][$dbkey] ) ) {
+                               $pageInfo['notificationtimestamp'] = wfTimestamp( TS_ISO_8601, $this->notificationtimestamps[$ns][$dbkey] );
+                       }
+               }
+
                if ( $this->fld_talkid && isset( $this->talkids[$ns][$dbkey] ) )        {
                        $pageInfo['talkid'] = $this->talkids[$ns][$dbkey];
                }
@@ -433,15 +443,14 @@ class ApiQueryInfo extends ApiQueryBase {
                // Get normal protections for existing titles
                if ( count( $this->titles ) ) {
                        $this->resetQueryParams();
-                       $this->addTables( array( 'page_restrictions', 'page' ) );
-                       $this->addWhere( 'page_id=pr_page' );
+                       $this->addTables( 'page_restrictions' );
                        $this->addFields( array( 'pr_page', 'pr_type', 'pr_level',
-                                       'pr_expiry', 'pr_cascade', 'page_namespace',
-                                       'page_title' ) );
+                                       'pr_expiry', 'pr_cascade' ) );
                        $this->addWhereFld( 'pr_page', array_keys( $this->titles ) );
 
                        $res = $this->select( __METHOD__ );
                        foreach ( $res as $row ) {
+                               $title = $this->titles[$row->pr_page];
                                $a = array(
                                        'type' => $row->pr_type,
                                        'level' => $row->pr_level,
@@ -450,11 +459,14 @@ class ApiQueryInfo extends ApiQueryBase {
                                if ( $row->pr_cascade ) {
                                        $a['cascade'] = '';
                                }
-                               $this->protections[$row->page_namespace][$row->page_title][] = $a;
-
-                               // Also check old restrictions
-                               if ( $this->pageRestrictions[$row->pr_page] ) {
-                                       $restrictions = explode( ':', trim( $this->pageRestrictions[$row->pr_page] ) );
+                               $this->protections[$title->getNamespace()][$title->getDBkey()][] = $a;
+                       }
+                       // Also check old restrictions
+                       foreach( $this->titles as $pageId => $title ) {
+                               if ( $this->pageRestrictions[$pageId] ) {
+                                       $namespace = $title->getNamespace();
+                                       $dbKey = $title->getDBkey();
+                                       $restrictions = explode( ':', trim( $this->pageRestrictions[$pageId] ) );
                                        foreach ( $restrictions as $restrict ) {
                                                $temp = explode( '=', trim( $restrict ) );
                                                if ( count( $temp ) == 1 ) {
@@ -464,12 +476,12 @@ class ApiQueryInfo extends ApiQueryBase {
                                                        if ( $restriction == '' ) {
                                                                continue;
                                                        }
-                                                       $this->protections[$row->page_namespace][$row->page_title][] = array(
+                                                       $this->protections[$namespace][$dbKey][] = array(
                                                                'type' => 'edit',
                                                                'level' => $restriction,
                                                                'expiry' => 'infinity',
                                                        );
-                                                       $this->protections[$row->page_namespace][$row->page_title][] = array(
+                                                       $this->protections[$namespace][$dbKey][] = array(
                                                                'type' => 'move',
                                                                'level' => $restriction,
                                                                'expiry' => 'infinity',
@@ -479,7 +491,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                                        if ( $restriction == '' ) {
                                                                continue;
                                                        }
-                                                       $this->protections[$row->page_namespace][$row->page_title][] = array(
+                                                       $this->protections[$namespace][$dbKey][] = array(
                                                                'type' => $temp[0],
                                                                'level' => $restriction,
                                                                'expiry' => 'infinity',
@@ -630,6 +642,7 @@ class ApiQueryInfo extends ApiQueryBase {
 
        /**
         * Get information about watched status and put it in $this->watched
+        * and $this->notificationtimestamps
         */
        private function getWatchedInfo() {
                $user = $this->getUser();
@@ -639,6 +652,7 @@ class ApiQueryInfo extends ApiQueryBase {
                }
 
                $this->watched = array();
+               $this->notificationtimestamps = array();
                $db = $this->getDB();
 
                $lb = new LinkBatch( $this->everything );
@@ -646,6 +660,7 @@ class ApiQueryInfo extends ApiQueryBase {
                $this->resetQueryParams();
                $this->addTables( array( 'watchlist' ) );
                $this->addFields( array( 'wl_title', 'wl_namespace' ) );
+               $this->addFieldsIf( 'wl_notificationtimestamp', $this->fld_notificationtimestamp );
                $this->addWhere( array(
                        $lb->constructSet( 'wl', $db ),
                        'wl_user' => $user->getID()
@@ -654,7 +669,12 @@ class ApiQueryInfo extends ApiQueryBase {
                $res = $this->select( __METHOD__ );
 
                foreach ( $res as $row ) {
-                       $this->watched[$row->wl_namespace][$row->wl_title] = true;
+                       if ( $this->fld_watched ) {
+                               $this->watched[$row->wl_namespace][$row->wl_title] = true;
+                       }
+                       if ( $this->fld_notificationtimestamp ) {
+                               $this->notificationtimestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
+                       }
                }
        }
 
@@ -689,6 +709,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                        'protection',
                                        'talkid',
                                        'watched', # private
+                                       'notificationtimestamp', # private
                                        'subjectid',
                                        'url',
                                        'readable', # private
@@ -710,14 +731,15 @@ class ApiQueryInfo extends ApiQueryBase {
                return array(
                        'prop' => array(
                                'Which additional properties to get:',
-                               ' protection   - List the protection level of each page',
-                               ' talkid       - The page ID of the talk page for each non-talk page',
-                               ' watched      - List the watched status of each page',
-                               ' subjectid    - The page ID of the parent page for each talk page',
-                               ' url          - Gives a full URL to the page, and also an edit URL',
-                               ' readable     - Whether the user can read this page',
-                               ' preload      - Gives the text returned by EditFormPreloadText',
-                               ' displaytitle - Gives the way the page title is actually displayed',
+                               ' protection            - List the protection level of each page',
+                               ' talkid                - The page ID of the talk page for each non-talk page',
+                               ' watched               - List the watched status of each page',
+                               ' notificationtimestamp - The watchlist notification timestamp of each page',
+                               ' subjectid             - The page ID of the parent page for each talk page',
+                               ' url                   - Gives a full URL to the page, and also an edit URL',
+                               ' readable              - Whether the user can read this page',
+                               ' preload               - Gives the text returned by EditFormPreloadText',
+                               ' displaytitle          - Gives the way the page title is actually displayed',
                        ),
                        'token' => 'Request a token to perform a data-modifying action on a page',
                        'continue' => 'When more results are available, use this to continue',
@@ -745,6 +767,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        'watched' => array(
                                'watched' => 'boolean'
                        ),
+                       'notificationtimestamp' => array(
+                               'notificationtimestamp' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
                        'talkid' => array(
                                'talkid' => array(
                                        ApiBase::PROP_TYPE => 'integer',
index f423719..3920407 100644 (file)
@@ -5,7 +5,7 @@
  * Created on May 14, 2011
  *
  * Copyright © 2011 Sam Reed
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -62,15 +62,16 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                        }
 
                        $db = $this->getDB();
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $prefix = $db->addQuotes( $cont[0] );
-                       $title = $db->addQuotes( $this->titleToKey( $cont[1] ) );
+                       $title = $db->addQuotes( $cont[1] );
                        $from = intval( $cont[2] );
                        $this->addWhere(
-                               "ll_lang > $prefix OR " .
+                               "ll_lang $op $prefix OR " .
                                "(ll_lang = $prefix AND " .
-                               "(ll_title > $title OR " .
+                               "(ll_title $op $title OR " .
                                "(ll_title = $title AND " .
-                               "ll_from >= $from)))"
+                               "ll_from $op= $from)))"
                        );
                }
 
@@ -84,22 +85,23 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                $this->addFields( array( 'page_id', 'page_title', 'page_namespace', 'page_is_redirect',
                        'll_from', 'll_lang', 'll_title' ) );
 
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
                if ( isset( $params['lang'] ) ) {
                        $this->addWhereFld( 'll_lang', $params['lang'] );
                        if ( isset( $params['title'] ) ) {
                                $this->addWhereFld( 'll_title', $params['title'] );
-                               $this->addOption( 'ORDER BY', 'll_from' );
+                               $this->addOption( 'ORDER BY', 'll_from' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                       'll_title',
-                                       'll_from'
+                                       'll_title' . $sort,
+                                       'll_from' . $sort
                                ));
                        }
                } else {
                        $this->addOption( 'ORDER BY', array(
-                               'll_lang',
-                               'll_title',
-                               'll_from'
+                               'll_lang' . $sort,
+                               'll_title' . $sort,
+                               'll_from' . $sort
                        ));
                }
 
@@ -178,6 +180,13 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                                        'lltitle',
                                ),
                        ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending'
+                               )
+                       ),
                );
        }
 
@@ -192,6 +201,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                                ' lltitle        - Adds the title of the language ink',
                        ),
                        'limit' => 'How many total pages to return',
+                       'dir' => 'The direction in which to list',
                );
        }
 
index 7cab739..3109a09 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on May 13, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 5cf9068..9e4b7eb 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on May 12, 2007
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -85,9 +85,9 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                $params = $this->extractRequestParams();
 
                $this->addFields( array(
-                       $this->prefix . '_from AS pl_from',
-                       $this->prefix . '_namespace AS pl_namespace',
-                       $this->prefix . '_title AS pl_title'
+                       'pl_from' => $this->prefix . '_from',
+                       'pl_namespace' => $this->prefix . '_namespace',
+                       'pl_title' => $this->prefix . '_title'
                ) );
 
                $this->addTables( $this->table );
@@ -119,7 +119,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                        $op = $params['dir'] == 'descending' ? '<' : '>';
                        $plfrom = intval( $cont[0] );
                        $plns = intval( $cont[1] );
-                       $pltitle = $this->getDB()->addQuotes( $this->titleToKey( $cont[2] ) );
+                       $pltitle = $this->getDB()->addQuotes( $cont[2] );
                        $this->addWhere(
                                "{$this->prefix}_from $op $plfrom OR " .
                                "({$this->prefix}_from = $plfrom AND " .
@@ -157,8 +157,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                                        // We've reached the one extra which shows that
                                        // there are additional pages to be had. Stop here...
                                        $this->setContinueEnumParameter( 'continue',
-                                               "{$row->pl_from}|{$row->pl_namespace}|" .
-                                               $this->keyToTitle( $row->pl_title ) );
+                                               "{$row->pl_from}|{$row->pl_namespace}|{$row->pl_title}" );
                                        break;
                                }
                                $vals = array();
@@ -166,8 +165,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                                $fit = $this->addPageSubItem( $row->pl_from, $vals );
                                if ( !$fit ) {
                                        $this->setContinueEnumParameter( 'continue',
-                                               "{$row->pl_from}|{$row->pl_namespace}|" .
-                                               $this->keyToTitle( $row->pl_title ) );
+                                               "{$row->pl_from}|{$row->pl_namespace}|{$row->pl_title}" );
                                        break;
                                }
                        }
@@ -179,8 +177,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                                        // We've reached the one extra which shows that
                                        // there are additional pages to be had. Stop here...
                                        $this->setContinueEnumParameter( 'continue',
-                                               "{$row->pl_from}|{$row->pl_namespace}|" .
-                                               $this->keyToTitle( $row->pl_title ) );
+                                               "{$row->pl_from}|{$row->pl_namespace}|{$row->pl_title}" );
                                        break;
                                }
                                $titles[] = Title::makeTitle( $row->pl_namespace, $row->pl_title );
index bb4b429..f2fd425 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 16, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -359,7 +359,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
        public function getCacheMode( $params ) {
                if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
-                       // formatComment() calls wfMsg() among other things
+                       // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';
                } else {
                        return 'public';
@@ -367,7 +367,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        public function getAllowedParams() {
-               global $wgLogTypes, $wgLogActions;
+               global $wgLogTypes, $wgLogActions, $wgLogActionsHandlers;
                return array(
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
@@ -389,7 +389,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                ApiBase::PARAM_TYPE => $wgLogTypes
                        ),
                        'action' => array(
-                               ApiBase::PARAM_TYPE => array_keys( $wgLogActions )
+                               ApiBase::PARAM_TYPE => array_keys( array_merge( $wgLogActions, $wgLogActionsHandlers ) )
                        ),
                        'start' => array(
                                ApiBase::PARAM_TYPE => 'timestamp'
index 360183c..14aed28 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Feb 13, 2009
  *
- * Copyright © 2009 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2009 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -139,7 +139,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
 
        public function getCacheMode( $params ) {
                if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
-                       // formatComment() calls wfMsg() among other things
+                       // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';
                } else {
                        return 'public';
index 2c7ba12..a8be26d 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Dec 22, 2010
  *
- * Copyright © 2010 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2010 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 62c6678..7ae4f37 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 19, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -236,7 +236,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
                        $this->addFieldsIf( 'rc_user', $this->fld_user );
                        $this->addFieldsIf( 'rc_user_text', $this->fld_user || $this->fld_userid );
-                       $this->addFieldsIf( array( 'rc_minor', 'rc_new', 'rc_bot' ) , $this->fld_flags );
+                       $this->addFieldsIf( array( 'rc_minor', 'rc_type', 'rc_bot' ) , $this->fld_flags );
                        $this->addFieldsIf( array( 'rc_old_len', 'rc_new_len' ), $this->fld_sizes );
                        $this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
                        $this->addFieldsIf( array( 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ), $this->fld_loginfo );
@@ -393,7 +393,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        if ( $row->rc_bot ) {
                                $vals['bot'] = '';
                        }
-                       if ( $row->rc_new ) {
+                       if ( $row->rc_type == RC_NEW ) {
                                $vals['new'] = '';
                        }
                        if ( $row->rc_minor ) {
@@ -503,7 +503,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        return 'private';
                }
                if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
-                       // formatComment() calls wfMsg() among other things
+                       // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';
                }
                return 'public';
index 1a5ad17..b89a8ea 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 7, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -248,6 +248,16 @@ class ApiQueryRevisions extends ApiQueryBase {
                                $this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
                        }
 
+                       // Continuing effectively uses startid. But we can't use rvstartid
+                       // directly, because there is no way to tell the client to ''not''
+                       // send rvstart if it sent it in the original query. So instead we
+                       // send the continuation startid as rvcontinue, and ignore both
+                       // rvstart and rvstartid when that is supplied.
+                       if ( !is_null( $params['continue'] ) ) {
+                               $params['startid'] = $params['continue'];
+                               unset( $params['start'] );
+                       }
+
                        // This code makes an assumption that sorting by rev_id and rev_timestamp produces
                        // the same result. This way users may request revisions starting at a given time,
                        // but to page through results use the rev_id returned after each page.
@@ -357,14 +367,14 @@ class ApiQueryRevisions extends ApiQueryBase {
                                if ( !$enumRevMode ) {
                                        ApiBase::dieDebug( __METHOD__, 'Got more rows then expected' ); // bug report
                                }
-                               $this->setContinueEnumParameter( 'startid', intval( $row->rev_id ) );
+                               $this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
                                break;
                        }
 
                        $fit = $this->addPageSubItem( $row->rev_page, $this->extractRowInfo( $row ), 'rev' );
                        if ( !$fit ) {
                                if ( $enumRevMode ) {
-                                       $this->setContinueEnumParameter( 'startid', intval( $row->rev_id ) );
+                                       $this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
                                } elseif ( $revCount > 0 ) {
                                        $this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
                                } else {
@@ -538,7 +548,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        return 'private';
                }
                if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
-                       // formatComment() calls wfMsg() among other things
+                       // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';
                }
                return 'public';
index ed6c3cb..364433d 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on July 30, 2007
  *
- * Copyright © 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index e7102e0..ec503d6 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 25, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -93,6 +93,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                case 'showhooks':
                                        $fit = $this->appendSubscribedHooks( $p );
                                        break;
+                               case 'variables':
+                                       $fit = $this->appendVariables( $p );
+                                       break;
                                default:
                                        ApiBase::dieDebug( __METHOD__, "Unknown prop=$p" );
                        }
@@ -121,9 +124,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['dbtype'] = $GLOBALS['wgDBtype'];
                $data['dbversion'] = $this->getDB()->getServerVersion();
 
-               $svn = SpecialVersion::getSvnRevision( $GLOBALS['IP'] );
-               if ( $svn ) {
-                       $data['rev'] = $svn;
+               $git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
+               if ( $git ) {
+                       $data['git-hash'] = $git;
+               } else {
+                       $svn = SpecialVersion::getSvnRevision( $GLOBALS['IP'] );
+                       if ( $svn ) {
+                               $data['rev'] = $svn;
+                       }
                }
 
                // 'case-insensitive' option is reserved for future
@@ -249,10 +257,13 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        protected function appendSpecialPageAliases( $property ) {
                global $wgContLang;
                $data = array();
-               foreach ( $wgContLang->getSpecialPageAliases() as $specialpage => $aliases ) {
-                       $arr = array( 'realname' => $specialpage, 'aliases' => $aliases );
-                       $this->getResult()->setIndexedTagName( $arr['aliases'], 'alias' );
-                       $data[] = $arr;
+               $aliases = $wgContLang->getSpecialPageAliases();
+               foreach ( SpecialPageFactory::getList() as $specialpage => $stuff ) {
+                       if ( isset( $aliases[$specialpage] ) ) {
+                               $arr = array( 'realname' => $specialpage, 'aliases' => $aliases[$specialpage] );
+                               $this->getResult()->setIndexedTagName( $arr['aliases'], 'alias' );
+                               $data[] = $arr;
+                       }
                }
                $this->getResult()->setIndexedTagName( $data, 'specialpage' );
                return $this->getResult()->addValue( 'query', $property, $data );
@@ -527,6 +538,12 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                return $this->getResult()->addValue( 'query', $property, $hooks );
        }
 
+       public function appendVariables( $property ) {
+               $variables = MagicWord::getVariableIDs();
+               $this->getResult()->setIndexedTagName( $variables, 'v' );
+               return $this->getResult()->addValue( 'query', $property, $variables );
+       }
+
        private function formatParserTags( $item ) {
                return "<{$item}>";
        }
@@ -578,6 +595,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        'extensiontags',
                                        'functionhooks',
                                        'showhooks',
+                                       'variables',
                                )
                        ),
                        'filteriw' => array(
@@ -613,7 +631,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                ' skins                 - Returns a list of all enabled skins',
                                ' extensiontags         - Returns a list of parser extension tags',
                                ' functionhooks         - Returns a list of parser function hooks',
-                               ' showhooks             - Returns a list of all subscribed hooks (contents of $wgHooks)'
+                               ' showhooks             - Returns a list of all subscribed hooks (contents of $wgHooks)',
+                               ' variables             - Returns a list of variable IDs',
                        ),
                        'filteriw' =>  'Return only local or only nonlocal entries of the interwiki map',
                        'showalldb' => 'List all database servers, not just the one lagging the most',
index 02484ae..a310d10 100644 (file)
@@ -113,7 +113,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
        public function getParamDescription() {
                $p = $this->getModulePrefix();
                return array(
-                       'prop' => self::getPropertyDescriptions( $this->propertyFilter ),
+                       'prop' => self::getPropertyDescriptions( $this->propertyFilter, $p ),
                        'filekey' => 'Key that identifies a previous upload that was stashed temporarily.',
                        'sessionkey' => 'Alias for filekey, for backward compatibility.',
                        'urlwidth' => "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
index edd1553..f97c1b2 100644 (file)
@@ -59,7 +59,7 @@ class ApiQueryTags extends ApiQueryBase {
                $this->addTables( 'change_tag' );
                $this->addFields( 'ct_tag' );
 
-               $this->addFieldsIf( 'count(*) AS hitcount', $this->fld_hitcount );
+               $this->addFieldsIf( array( 'hitcount' => 'COUNT(*)' ), $this->fld_hitcount );
 
                $this->addOption( 'LIMIT', $this->limit + 1 );
                $this->addOption( 'GROUP BY', 'ct_tag' );
@@ -73,7 +73,7 @@ class ApiQueryTags extends ApiQueryBase {
                        if ( !$ok ) {
                                break;
                        }
-                       $ok = $this->doTag( $row->ct_tag, $row->hitcount );
+                       $ok = $this->doTag( $row->ct_tag, $this->fld_hitcount ? $row->hitcount : 0 );
                }
 
                // include tags with no hits yet
index f531980..f30b132 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 16, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -256,7 +256,7 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->addFieldsIf( 'page_latest', $this->fld_flags );
                // $this->addFieldsIf( 'rev_text_id', $this->fld_ids ); // Should this field be exposed?
                $this->addFieldsIf( 'rev_comment', $this->fld_comment || $this->fld_parsedcomment );
-               $this->addFieldsIf( 'rev_len', $this->fld_size );
+               $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( 'rc_patrolled', $this->fld_patrolled );
@@ -513,6 +513,12 @@ class ApiQueryContributions extends ApiQueryBase {
                                        ApiBase::PROP_TYPE => 'integer',
                                        ApiBase::PROP_NULLABLE => true
                                )
+                       ),
+                       'sizediff' => array(
+                               'sizediff' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
                        )
                );
        }
index e4617d9..d211918 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on July 30, 2007
  *
- * Copyright © 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 02fcf01..855e270 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on July 30, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -253,14 +253,16 @@ class ApiQueryUsers extends ApiQueryBase {
        * @return array
        */
        public static function getAutoGroups( $user ) {
+               // FIXME this logic is duplicated from User::getEffectiveGroups(), centralize this
                $groups = array();
                $groups[] = '*';
 
                if ( !$user->isAnon() ) {
                        $groups[] = 'user';
+                       $groups = array_merge( $groups, Autopromote::getAutopromoteGroups( $user ) );
                }
 
-               return array_merge( $groups, Autopromote::getAutopromoteGroups( $user ) );
+               return $groups;
        }
 
        public function getCacheMode( $params ) {
index a93f94f..a1a3372 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 25, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -96,7 +96,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                'rc_last_oldid',
                        ) );
 
-                       $this->addFieldsIf( array( 'rc_new', 'rc_minor', 'rc_bot' ), $this->fld_flags );
+                       $this->addFieldsIf( array( 'rc_type', 'rc_minor', 'rc_bot' ), $this->fld_flags );
                        $this->addFieldsIf( 'rc_user', $this->fld_user || $this->fld_userid );
                        $this->addFieldsIf( 'rc_user_text', $this->fld_user );
                        $this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
@@ -254,7 +254,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                }
 
                if ( $this->fld_flags ) {
-                       if ( $row->rc_new ) {
+                       if ( $row->rc_type == RC_NEW ) {
                                $vals['new'] = '';
                        }
                        if ( $row->rc_minor ) {
index 1b1eee0..6b24aef 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Oct 4, 2008
  *
- * Copyright © 2008 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2008 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -76,7 +76,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                                        "original value returned by the previous query", "_badcontinue" );
                        }
                        $ns = intval( $cont[0] );
-                       $title = $this->getDB()->addQuotes( $this->titleToKey( $cont[1] ) );
+                       $title = $this->getDB()->addQuotes( $cont[1] );
                        $op = $params['dir'] == 'ascending' ? '>' : '<';
                        $this->addWhere(
                                "wl_namespace $op $ns OR " .
@@ -103,8 +103,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                foreach ( $res as $row ) {
                        if ( ++$count > $params['limit'] ) {
                                // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' .
-                                                                       $this->keyToTitle( $row->wl_title ) );
+                               $this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' . $row->wl_title );
                                break;
                        }
                        $t = Title::makeTitle( $row->wl_namespace, $row->wl_title );
@@ -118,8 +117,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                                }
                                $fit = $this->getResult()->addValue( $this->getModuleName(), null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' .
-                                                                       $this->keyToTitle( $row->wl_title ) );
+                                       $this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' . $row->wl_title );
                                        break;
                                }
                        } else {
index 798b227..91e2081 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 4, 2006
  *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -165,7 +165,7 @@ class ApiResult extends ApiBase {
         * @param $value Mixed
         * @param $subElemName string when present, content element is created
         *  as a sub item of $arr. Use this parameter to create elements in
-        *  format <elem>text</elem> without attributes
+        *  format "<elem>text</elem>" without attributes.
         */
        public static function setContent( &$arr, $value, $subElemName = null ) {
                if ( is_array( $value ) ) {
index 4de49ea..677df16 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Jun 20, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,7 +49,7 @@ class ApiRollback extends ApiBase {
                // User and title already validated in call to getTokenSalt from Main
                $titleObj = $this->getRbTitle();
                $pageObj = WikiPage::factory( $titleObj );
-               $summary = ( isset( $params['summary'] ) ? $params['summary'] : '' );
+               $summary = $params['summary'];
                $details = array();
                $retval = $pageObj->doRollback( $this->getRbUser(), $summary, $params['token'], $params['markbot'], $details, $this->getUser() );
 
@@ -90,8 +90,11 @@ class ApiRollback extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => null,
-                       'summary' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
+                       'summary' => '',
                        'markbot' => false,
                        'watchlist' => array(
                                ApiBase::PARAM_DFLT => 'preferences',
@@ -110,7 +113,7 @@ class ApiRollback extends ApiBase {
                        'title' => 'Title of the page you want to rollback.',
                        'user' => 'Name of the user whose edits are to be rolled back. If set incorrectly, you\'ll get a badtoken error.',
                        'token' => "A rollback token previously retrieved through {$this->getModulePrefix()}prop=revisions",
-                       'summary' => 'Custom edit summary. If not set, default summary will be used',
+                       'summary' => 'Custom edit summary. If empty, default summary will be used',
                        'markbot' => 'Mark the reverted edits and the revert as bot edits',
                        'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
                );
diff --git a/includes/api/ApiSetNotificationTimestamp.php b/includes/api/ApiSetNotificationTimestamp.php
new file mode 100644 (file)
index 0000000..098b1a6
--- /dev/null
@@ -0,0 +1,285 @@
+<?php
+
+/**
+ * API for MediaWiki 1.14+
+ *
+ * Created on Jun 18, 2012
+ *
+ * Copyright © 2012 Brad Jorsch
+ *
+ * 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
+ */
+
+/**
+ * API interface for setting the wl_notificationtimestamp field
+ * @ingroup API
+ */
+class ApiSetNotificationTimestamp extends ApiBase {
+
+       public function __construct( $main, $action ) {
+               parent::__construct( $main, $action );
+       }
+
+       public function execute() {
+               $user = $this->getUser();
+
+               if ( $user->isAnon() ) {
+                       $this->dieUsage( 'Anonymous users cannot use watchlist change notifications', 'notloggedin' );
+               }
+
+               $params = $this->extractRequestParams();
+               $this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
+
+               $pageSet = new ApiPageSet( $this );
+               $args = array_merge( array( $params, 'entirewatchlist' ), array_keys( $pageSet->getAllowedParams() ) );
+               call_user_func_array( array( $this, 'requireOnlyOneParameter' ), $args );
+
+               $dbw = $this->getDB( DB_MASTER );
+
+               $timestamp = null;
+               if ( isset( $params['timestamp'] ) ) {
+                       $timestamp = $dbw->timestamp( $params['timestamp'] );
+               }
+
+               if ( !$params['entirewatchlist'] ) {
+                       $pageSet->execute();
+               }
+
+               if ( isset( $params['torevid'] ) ) {
+                       if ( $params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1 ) {
+                               $this->dieUsage( 'torevid may only be used with a single page', 'multpages' );
+                       }
+                       $title = reset( $pageSet->getGoodTitles() );
+                       $timestamp = Revision::getTimestampFromId( $title, $params['torevid'] );
+                       if ( $timestamp ) {
+                               $timestamp = $dbw->timestamp( $timestamp );
+                       } else {
+                               $timestamp = null;
+                       }
+               } elseif ( isset( $params['newerthanrevid'] ) ) {
+                       if ( $params['entirewatchlist'] || $pageSet->getGoodTitleCount() > 1 ) {
+                               $this->dieUsage( 'newerthanrevid may only be used with a single page', 'multpages' );
+                       }
+                       $title = reset( $pageSet->getGoodTitles() );
+                       $revid = $title->getNextRevisionID( $params['newerthanrevid'] );
+                       if ( $revid ) {
+                               $timestamp = $dbw->timestamp( Revision::getTimestampFromId( $title, $revid ) );
+                       } else {
+                               $timestamp = null;
+                       }
+               }
+
+               $apiResult = $this->getResult();
+               $result = array();
+               if ( $params['entirewatchlist'] ) {
+                       // Entire watchlist mode: Just update the thing and return a success indicator
+                       $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => $timestamp ),
+                               array( 'wl_user' => $user->getID() ),
+                               __METHOD__
+                       );
+
+                       $result['notificationtimestamp'] = ( is_null( $timestamp ) ? '' : wfTimestamp( TS_ISO_8601, $timestamp ) );
+               } else {
+                       // First, log the invalid titles
+                       foreach( $pageSet->getInvalidTitles() as $title ) {
+                               $r = array();
+                               $r['title'] = $title;
+                               $r['invalid'] = '';
+                               $result[] = $r;
+                       }
+                       foreach( $pageSet->getMissingPageIDs() as $p ) {
+                               $page = array();
+                               $page['pageid'] = $p;
+                               $page['missing'] = '';
+                               $page['notwatched'] = '';
+                               $result[] = $page;
+                       }
+                       foreach( $pageSet->getMissingRevisionIDs() as $r ) {
+                               $rev = array();
+                               $rev['revid'] = $r;
+                               $rev['missing'] = '';
+                               $rev['notwatched'] = '';
+                               $result[] = $rev;
+                       }
+
+                       // Now process the valid titles
+                       $lb = new LinkBatch( $pageSet->getTitles() );
+                       $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => $timestamp ),
+                               array( 'wl_user' => $user->getID(), $lb->constructSet( 'wl', $dbw ) ),
+                               __METHOD__
+                       );
+
+                       // Query the results of our update
+                       $timestamps = array();
+                       $res = $dbw->select( 'watchlist', array( 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ),
+                               array( 'wl_user' => $user->getID(), $lb->constructSet( 'wl', $dbw ) ),
+                               __METHOD__
+                       );
+                       foreach ( $res as $row ) {
+                               $timestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
+                       }
+
+                       // Now, put the valid titles into the result
+                       foreach ( $pageSet->getTitles() as $title ) {
+                               $ns = $title->getNamespace();
+                               $dbkey = $title->getDBkey();
+                               $r = array(
+                                       'ns' => intval( $ns ),
+                                       'title' => $title->getPrefixedText(),
+                               );
+                               if ( !$title->exists() ) {
+                                       $r['missing'] = '';
+                               }
+                               if ( isset( $timestamps[$ns] ) && array_key_exists( $dbkey, $timestamps[$ns] ) ) {
+                                       $r['notificationtimestamp'] = '';
+                                       if ( $timestamps[$ns][$dbkey] !== null ) {
+                                               $r['notificationtimestamp'] = wfTimestamp( TS_ISO_8601, $timestamps[$ns][$dbkey] );
+                                       }
+                               } else {
+                                       $r['notwatched'] = '';
+                               }
+                               $result[] = $r;
+                       }
+
+                       $apiResult->setIndexedTagName( $result, 'page' );
+               }
+               $apiResult->addValue( null, $this->getModuleName(), $result );
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function needsToken() {
+               return true;
+       }
+
+       public function getTokenSalt() {
+               return '';
+       }
+
+       public function getAllowedParams() {
+               $psModule = new ApiPageSet( $this );
+               return $psModule->getAllowedParams() + array(
+                       'entirewatchlist' => array(
+                               ApiBase::PARAM_TYPE => 'boolean'
+                       ),
+                       'token' => null,
+                       'timestamp' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp'
+                       ),
+                       'torevid' => array(
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ),
+                       'newerthanrevid' => array(
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               $psModule = new ApiPageSet( $this );
+               return $psModule->getParamDescription() + array(
+                       'entirewatchlist' => 'Work on all watched pages',
+                       'timestamp' => 'Timestamp to which to set the notification timestamp',
+                       'torevid' => 'Revision to set the notification timestamp to (one page only)',
+                       'newerthanrevid' => 'Revision to set the notification timestamp newer than (one page only)',
+                       'token' => 'A token previously acquired via prop=info',
+               );
+       }
+
+       public function getResultProperties() {
+               return array(
+                       ApiBase::PROP_LIST => true,
+                       ApiBase::PROP_ROOT => array(
+                               'notificationtimestamp' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       '' => array(
+                               'ns' => array(
+                                       ApiBase::PROP_TYPE => 'namespace',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'title' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'pageid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'revid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'invalid' => 'boolean',
+                               'missing' => 'boolean',
+                               'notwatched' => 'boolean',
+                               'notificationtimestamp' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
+       public function getDescription() {
+               return array( 'Update the notification timestamp for watched pages.',
+                       'This affects the highlighting of changed pages in the watchlist and history,',
+                       'and the sending of email when the "E-mail me when a page on my watchlist is',
+                       'changed" preference is enabled.'
+               );
+       }
+
+       public function getPossibleErrors() {
+               $psModule = new ApiPageSet( $this );
+               return array_merge(
+                       parent::getPossibleErrors(),
+                       $psModule->getPossibleErrors(),
+                       $this->getRequireMaxOneParameterErrorMessages( array( 'timestamp', 'torevid', 'newerthanrevid' ) ),
+                       $this->getRequireOnlyOneParameterErrorMessages( array_merge( array( 'entirewatchlist' ), array_keys( $psModule->getAllowedParams() ) ) ),
+                       array(
+                               array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot use watchlist change notifications' ),
+                               array( 'code' => 'multpages', 'info' => 'torevid may only be used with a single page' ),
+                               array( 'code' => 'multpages', 'info' => 'newerthanrevid may only be used with a single page' ),
+                       )
+               );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=setnotificationtimestamp&entirewatchlist=&token=ABC123' => 'Reset the notification status for the entire watchlist',
+                       'api.php?action=setnotificationtimestamp&titles=Main_page&token=ABC123' => 'Reset the notification status for "Main page"',
+                       'api.php?action=setnotificationtimestamp&titles=Main_page&timestamp=2012-01-01T00:00:00Z&token=ABC123' => 'Set the notification timestamp for "Main page" so all edits since 1 January 2012 are unviewed',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:SetNotificationTimestamp';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
index 40a6d44..e34771f 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Sep 7, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -69,7 +69,7 @@ class ApiUnblock extends ApiBase {
 
                $data = array(
                        'Target' => is_null( $params['id'] ) ? $params['user'] : "#{$params['id']}",
-                       'Reason' => is_null( $params['reason'] ) ? '' : $params['reason']
+                       'Reason' => $params['reason']
                );
                $block = Block::newFromTarget( $data['Target'] );
                $retval = SpecialUnblock::processUnblock( $data, $this->getContext() );
@@ -104,7 +104,7 @@ class ApiUnblock extends ApiBase {
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_DEPRECATED => true,
                        ),
-                       'reason' => null,
+                       'reason' => '',
                );
        }
 
@@ -115,7 +115,7 @@ class ApiUnblock extends ApiBase {
                        'user' => "Username, IP address or IP range you want to unblock. Cannot be used together with {$p}id",
                        'token' => "An unblock token previously obtained through prop=info",
                        'gettoken' => 'If set, an unblock token will be returned, and no other action will be taken',
-                       'reason' => 'Reason for unblock (optional)',
+                       'reason' => 'Reason for unblock',
                );
        }
 
index c89f49a..c996251 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Jul 3, 2007
  *
- * Copyright © 2007 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -94,7 +94,10 @@ class ApiUndelete extends ApiBase {
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
                        ),
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                        'reason' => '',
                        'timestamps' => array(
                                ApiBase::PARAM_TYPE => 'timestamp',
@@ -116,7 +119,7 @@ class ApiUndelete extends ApiBase {
                return array(
                        'title' => 'Title of the page you want to restore',
                        'token' => 'An undelete token previously retrieved through list=deletedrevs',
-                       'reason' => 'Reason for restoring (optional)',
+                       'reason' => 'Reason for restoring',
                        'timestamps' => 'Timestamps of the revisions to restore. If not set, all revisions will be restored.',
                        'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
                );
index db1ee16..3a9b5c5 100644 (file)
@@ -117,25 +117,26 @@ class ApiUpload extends ApiBase {
         */
        private function getContextResult(){
                $warnings = $this->getApiWarnings();
-               if ( $warnings ) {
+               if ( $warnings && !$this->mParams['ignorewarnings'] ) {
                        // Get warnings formated in result array format
                        return $this->getWarningsResult( $warnings );
                } elseif ( $this->mParams['chunk'] ) {
                        // Add chunk, and get result
-                       return $this->getChunkResult();
+                       return $this->getChunkResult( $warnings );
                } elseif ( $this->mParams['stash'] ) {
                        // Stash the file and get stash result
-                       return $this->getStashResult();
+                       return $this->getStashResult( $warnings );
                }
                // This is the most common case -- a normal upload with no warnings
                // performUpload will return a formatted properly for the API with status
-               return $this->performUpload();
+               return $this->performUpload( $warnings );
        }
        /**
         * Get Stash Result, throws an expetion if the file could not be stashed.
+        * @param $warnings array Array of Api upload warnings
         * @return array
         */
-       private function getStashResult(){
+       private function getStashResult( $warnings ){
                $result = array ();
                // Some uploads can request they be stashed, so as not to publish them immediately.
                // In this case, a failure to stash ought to be fatal
@@ -143,6 +144,9 @@ class ApiUpload extends ApiBase {
                        $result['result'] = 'Success';
                        $result['filekey'] = $this->performStash();
                        $result['sessionkey'] = $result['filekey']; // backwards compatibility
+                       if ( $warnings && count( $warnings ) > 0 ) {
+                               $result['warnings'] = $warnings;
+                       }
                } catch ( MWException $e ) {
                        $this->dieUsage( $e->getMessage(), 'stashfailed' );
                }
@@ -150,7 +154,7 @@ class ApiUpload extends ApiBase {
        }
        /**
         * Get Warnings Result
-        * @param $warnings Array of Api upload warnings
+        * @param $warnings array Array of Api upload warnings
         * @return array
         */
        private function getWarningsResult( $warnings ){
@@ -169,12 +173,16 @@ class ApiUpload extends ApiBase {
        }
        /**
         * Get the result of a chunk upload.
+        * @param $warnings array Array of Api upload warnings
         * @return array
         */
-       private function getChunkResult(){
+       private function getChunkResult( $warnings ){
                $result = array();
 
                $result['result'] = 'Continue';
+               if ( $warnings && count( $warnings ) > 0 ) {
+                       $result['warnings'] = $warnings;
+               }
                $request = $this->getMain()->getRequest();
                $chunkPath = $request->getFileTempname( 'chunk' );
                $chunkSize = $request->getUpload( 'chunk' )->getSize();
@@ -420,11 +428,21 @@ class ApiUpload extends ApiBase {
                                break;
 
                        case UploadBase::FILETYPE_BADTYPE:
-                               $this->dieUsage( 'This type of file is banned', 'filetype-banned',
-                                               0, array(
-                                                       'filetype' => $verification['finalExt'],
-                                                       'allowed' => $wgFileExtensions
-                                               ) );
+                               $extradata = array(
+                                       'filetype' => $verification['finalExt'],
+                                       'allowed' => $wgFileExtensions
+                               );
+                               $this->getResult()->setIndexedTagName( $extradata['allowed'], 'ext' );
+
+                               $msg = "Filetype not permitted: ";
+                               if ( isset( $verification['blacklistedExt'] ) ) {
+                                       $msg .= join( ', ', $verification['blacklistedExt'] );
+                                       $extradata['blacklisted'] = array_values( $verification['blacklistedExt'] );
+                                       $this->getResult()->setIndexedTagName( $extradata['blacklisted'], 'ext' );
+                               } else {
+                                       $msg .= $verification['finalExt'];
+                               }
+                               $this->dieUsage( $msg, 'filetype-banned', 0, $extradata );
                                break;
                        case UploadBase::VERIFICATION_ERROR:
                                $this->getResult()->setIndexedTagName( $verification['details'], 'detail' );
@@ -444,18 +462,15 @@ class ApiUpload extends ApiBase {
 
 
        /**
-        * Check warnings if ignorewarnings is not set.
+        * Check warnings.
         * Returns a suitable array for inclusion into API results if there were warnings
         * Returns the empty array if there were no warnings
         *
         * @return array
         */
        protected function getApiWarnings() {
-               $warnings = array();
+               $warnings = $this->mUpload->checkWarnings();
 
-               if ( !$this->mParams['ignorewarnings'] ) {
-                       $warnings = $this->mUpload->checkWarnings();
-               }
                return $this->transformWarnings( $warnings );
        }
 
@@ -488,9 +503,10 @@ class ApiUpload extends ApiBase {
         * Perform the actual upload. Returns a suitable result array on success;
         * dies on failure.
         *
+        * @param $warnings array Array of Api upload warnings
         * @return array
         */
-       protected function performUpload() {
+       protected function performUpload( $warnings ) {
                // Use comment as initial page text by default
                if ( is_null( $this->mParams['text'] ) ) {
                        $this->mParams['text'] = $this->mParams['comment'];
@@ -529,6 +545,9 @@ class ApiUpload extends ApiBase {
 
                $result['result'] = 'Success';
                $result['filename'] = $file->getName();
+               if ( $warnings && count( $warnings ) > 0 ) {
+                       $result['warnings'] = $warnings;
+               }
 
                return $result;
        }
@@ -560,7 +579,10 @@ class ApiUpload extends ApiBase {
                                ApiBase::PARAM_DFLT => ''
                        ),
                        'text' => null,
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                        'watch' => array(
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_DEPRECATED => true,
@@ -687,6 +709,8 @@ class ApiUpload extends ApiBase {
                                array( 'code' => 'stashfailed', 'info' => 'Stashing temporary file failed' ),
                                array( 'code' => 'internal-error', 'info' => 'An internal error occurred' ),
                                array( 'code' => 'asynccopyuploaddisabled', 'info' => 'Asynchronous copy uploads disabled' ),
+                               array( 'fileexists-forbidden' ),
+                               array( 'fileexists-shared-forbidden' ),
                        )
                );
        }
index 399bc54..cbb66a4 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Created on Mar 24, 2009
  *
- * Copyright © 2009 Roan Kattouw <Firstname>.<Lastname>@gmail.com
+ * Copyright © 2009 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -100,7 +100,10 @@ class ApiUserrights extends ApiBase {
                                ApiBase::PARAM_TYPE => User::getAllGroups(),
                                ApiBase::PARAM_ISMULTI => true
                        ),
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                        'reason' => array(
                                ApiBase::PARAM_DFLT => ''
                        )
index c923c6d..0509f1f 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Jan 4, 2008
  *
- * Copyright © 2008 Yuri Astrakhan <Firstname><Lastname>@gmail.com,
+ * Copyright © 2008 Yuri Astrakhan "<Firstname><Lastname>@gmail.com",
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -88,7 +88,10 @@ class ApiWatch extends ApiBase {
                                ApiBase::PARAM_REQUIRED => true
                        ),
                        'unwatch' => false,
-                       'token' => null,
+                       'token' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true
+                       ),
                );
        }
 
index f9ea135..6bfeed3 100644 (file)
@@ -142,6 +142,8 @@ class HTMLFileCache extends FileCacheBase {
                                wfDebug( __METHOD__ . " uncompressing cache file and sending it\n" );
                                readgzfile( $filename );
                        }
+               } else {
+                       readfile( $filename );
                }
                $context->getOutput()->disable(); // tell $wgOut that output is taken care of
        }
diff --git a/includes/cache/MemcachedSessions.php b/includes/cache/MemcachedSessions.php
deleted file mode 100644 (file)
index fe43635..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-/**
- * Session storage in object cache.
- *
- * This file gets included if $wgSessionsInMemcache is set in the config.
- * It redirects session handling functions to store their data in memcached
- * instead of the local filesystem. Depending on circumstances, it may also
- * be necessary to change the cookie settings to work across hostnames.
- * See: http://www.php.net/manual/en/function.session-set-save-handler.php
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Cache
- */
-
-/**
- * Get a cache key for the given session id.
- *
- * @param $id String: session id
- * @return String: cache key
- */
-function memsess_key( $id ) {
-       return wfMemcKey( 'session', $id );
-}
-
-/**
- * Callback when opening a session.
- * NOP: $wgMemc should be set up already.
- *
- * @param $save_path String: path used to store session files, unused
- * @param $session_name String: session name
- * @return Boolean: success
- */
-function memsess_open( $save_path, $session_name ) {
-       return true;
-}
-
-/**
- * Callback when closing a session.
- * NOP.
- *
- * @return Boolean: success
- */
-function memsess_close() {
-       return true;
-}
-
-/**
- * Callback when reading session data.
- *
- * @param $id String: session id
- * @return Mixed: session data
- */
-function memsess_read( $id ) {
-       global $wgMemc;
-       $data = $wgMemc->get( memsess_key( $id ) );
-       if( ! $data ) return '';
-       return $data;
-}
-
-/**
- * Callback when writing session data.
- *
- * @param $id String: session id
- * @param $data Mixed: session data
- * @return Boolean: success
- */
-function memsess_write( $id, $data ) {
-       global $wgMemc;
-       $wgMemc->set( memsess_key( $id ), $data, 3600 );
-       return true;
-}
-
-/**
- * Callback to destroy a session when calling session_destroy().
- *
- * @param $id String: session id
- * @return Boolean: success
- */
-function memsess_destroy( $id ) {
-       global $wgMemc;
-
-       $wgMemc->delete( memsess_key( $id ) );
-       return true;
-}
-
-/**
- * Callback to execute garbage collection.
- * NOP: Memcached performs garbage collection.
- *
- * @param $maxlifetime Integer: maximum session life time
- * @return Boolean: success
- */
-function memsess_gc( $maxlifetime ) {
-       return true;
-}
-
-function memsess_write_close() {
-       session_write_close();
-}
-
index 24f32d6..b854a2e 100644 (file)
@@ -766,7 +766,9 @@ class MessageCache {
                }
 
                # Try loading it from the database
-               $revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) );
+               $revision = Revision::newFromTitle(
+                       Title::makeTitle( NS_MEDIAWIKI, $title ), false, Revision::READ_LATEST
+               );
                if ( $revision ) {
                        $message = $revision->getText();
                        if ($message === false) {
diff --git a/includes/cache/ProcessCacheLRU.php b/includes/cache/ProcessCacheLRU.php
new file mode 100644 (file)
index 0000000..f215ebd
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Per-process memory cache for storing items.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
+/**
+ * Handles per process caching of items
+ * @ingroup Cache
+ */
+class ProcessCacheLRU {
+       /** @var Array */
+       protected $cache = array(); // (key => prop => value)
+
+       protected $maxCacheKeys; // integer; max entries
+
+       /**
+        * @param $maxKeys integer Maximum number of entries allowed (min 1).
+        * @throws MWException When $maxCacheKeys is not an int or =< 0.
+        */
+       public function __construct( $maxKeys ) {
+               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
+                       throw new MWException( __METHOD__ . " must be given an integer and >= 1" );
+               }
+               $this->maxCacheKeys = $maxKeys;
+       }
+
+       /**
+        * Set a property field for a cache entry.
+        * This will prune the cache if it gets too large.
+        * If the item is already set, it will be pushed to the top of the cache.
+        *
+        * @param $key string
+        * @param $prop string
+        * @param $value mixed
+        * @return void
+        */
+       public function set( $key, $prop, $value ) {
+               if ( isset( $this->cache[$key] ) ) {
+                       $this->ping( $key ); // push to top
+               } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
+                       reset( $this->cache );
+                       unset( $this->cache[key( $this->cache )] );
+               }
+               $this->cache[$key][$prop] = $value;
+       }
+
+       /**
+        * Check if a property field exists for a cache entry.
+        *
+        * @param $key string
+        * @param $prop string
+        * @return bool
+        */
+       public function has( $key, $prop ) {
+               return isset( $this->cache[$key][$prop] );
+       }
+
+       /**
+        * Get a property field for a cache entry.
+        * This returns null if the property is not set.
+        * If the item is already set, it will be pushed to the top of the cache.
+        *
+        * @param $key string
+        * @param $prop string
+        * @return mixed
+        */
+       public function get( $key, $prop ) {
+               if ( isset( $this->cache[$key][$prop] ) ) {
+                       $this->ping( $key ); // push to top
+                       return $this->cache[$key][$prop];
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Clear one or several cache entries, or all cache entries
+        *
+        * @param $keys string|Array
+        * @return void
+        */
+       public function clear( $keys = null ) {
+               if ( $keys === null ) {
+                       $this->cache = array();
+               } else {
+                       foreach ( (array)$keys as $key ) {
+                               unset( $this->cache[$key] );
+                       }
+               }
+       }
+
+       /**
+        * Push an entry to the top of the cache
+        *
+        * @param $key string
+        */
+       protected function ping( $key ) {
+               $item = $this->cache[$key];
+               unset( $this->cache[$key] );
+               $this->cache[$key] = $item;
+       }
+}
index e8e57cd..423e388 100644 (file)
 class SquidUpdate {
        var $urlArr, $mMaxTitles;
 
-       function __construct( $urlArr = Array(), $maxTitles = false ) {
+       /**
+        * @param $urlArr array
+        * @param $maxTitles bool|int
+        */
+       function __construct( $urlArr = array(), $maxTitles = false ) {
                global $wgMaxSquidPurgeTitles;
                if ( $maxTitles === false ) {
                        $this->mMaxTitles = $wgMaxSquidPurgeTitles;
@@ -121,11 +125,6 @@ class SquidUpdate {
        static function purge( $urlArr ) {
                global $wgSquidServers, $wgHTCPMulticastRouting;
 
-               /*if ( (@$wgSquidServers[0]) == 'echo' ) {
-                       echo implode("<br />\n", $urlArr) . "<br />\n";
-                       return;
-               }*/
-
                if( !$urlArr ) {
                        return;
                }
diff --git a/includes/cache/UserCache.php b/includes/cache/UserCache.php
new file mode 100644 (file)
index 0000000..6ec2366
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Caches current user names and other info based on user IDs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
+/**
+ * @since 1.20
+ */
+class UserCache {
+       protected $cache = array(); // (uid => property => value)
+       protected $typesCached = array(); // (uid => cache type => 1)
+
+       /**
+        * @return UserCache
+        */
+       public static function singleton() {
+               static $instance = null;
+               if ( $instance === null ) {
+                       $instance = new self();
+               }
+               return $instance;
+       }
+
+       protected function __construct() {}
+
+       /**
+        * Get a property of a user based on their user ID
+        *
+        * @param $userId integer User ID
+        * @param $prop string User property
+        * @return mixed The property or false if the user does not exist
+        */
+       public function getProp( $userId, $prop ) {
+               if ( !isset( $this->cache[$userId][$prop] ) ) {
+                       wfDebug( __METHOD__ . ": querying DB for prop '$prop' for user ID '$userId'.\n" );
+                       $this->doQuery( array( $userId ) ); // cache miss
+               }
+               return isset( $this->cache[$userId][$prop] )
+                       ? $this->cache[$userId][$prop]
+                       : false; // user does not exist?
+       }
+
+       /**
+        * Preloads user names for given list of users.
+        * @param $userIds Array List of user IDs
+        * @param $options Array Option flags; include 'userpage' and 'usertalk'
+        * @param $caller String: the calling method
+        */
+       public function doQuery( array $userIds, $options = array(), $caller = '' ) {
+               wfProfileIn( __METHOD__ );
+
+               $usersToCheck = array();
+               $usersToQuery = array();
+
+               foreach ( $userIds as $userId ) {
+                       $userId = (int)$userId;
+                       if ( $userId <= 0 ) {
+                               continue; // skip anons
+                       }
+                       if ( isset( $this->cache[$userId]['name'] ) ) {
+                               $usersToCheck[$userId] = $this->cache[$userId]['name']; // already have name
+                       } else {
+                               $usersToQuery[] = $userId; // we need to get the name
+                       }
+               }
+
+               // Lookup basic info for users not yet loaded...
+               if ( count( $usersToQuery ) ) {
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $table = array( 'user' );
+                       $conds = array( 'user_id' => $usersToQuery );
+                       $fields = array( 'user_name', 'user_real_name', 'user_registration', 'user_id' );
+
+                       $comment = __METHOD__;
+                       if ( strval( $caller ) !== '' ) {
+                               $comment .= "/$caller";
+                       }
+
+                       $res = $dbr->select( $table, $fields, $conds, $comment );
+                       foreach ( $res as $row ) { // load each user into cache
+                               $userId = (int)$row->user_id;
+                               $this->cache[$userId]['name'] = $row->user_name;
+                               $this->cache[$userId]['real_name'] = $row->user_real_name;
+                               $this->cache[$userId]['registration'] = $row->user_registration;
+                               $usersToCheck[$userId] = $row->user_name;
+                       }
+               }
+
+               $lb = new LinkBatch();
+               foreach ( $usersToCheck as $userId => $name ) {
+                       if ( $this->queryNeeded( $userId, 'userpage', $options ) ) {
+                               $lb->add( NS_USER, str_replace( ' ', '_', $row->user_name ) );
+                               $this->typesCached[$userId]['userpage'] = 1;
+                       }
+                       if ( $this->queryNeeded( $userId, 'usertalk', $options ) ) {
+                               $lb->add( NS_USER_TALK, str_replace( ' ', '_', $row->user_name ) );
+                               $this->typesCached[$userId]['usertalk'] = 1;
+                       }
+               }
+               $lb->execute();
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Check if a cache type is in $options and was not loaded for this user
+        *
+        * @param $uid integer user ID
+        * @param $type string Cache type
+        * @param $options Array Requested cache types
+        * @return bool
+        */
+       protected function queryNeeded( $uid, $type, array $options ) {
+               return ( in_array( $type, $options ) && !isset( $this->typesCached[$uid][$type] ) );
+       }
+}
diff --git a/includes/dao/IDBAccessObject.php b/includes/dao/IDBAccessObject.php
new file mode 100644 (file)
index 0000000..e30522a
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+/**
+ * This file contains database access object related constants.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Interface for database access objects.
+ *
+ * Classes using this support a set of constants in a bitfield argument to their data loading
+ * functions. In general, objects should assume READ_NORMAL if no flags are explicitly given,
+ * though certain objects may assume READ_LATEST for common use case or legacy reasons.
+ *
+ * There are three types of reads:
+ *   - READ_NORMAL  : Potentially cached read of data (e.g. from a slave or stale replica)
+ *   - READ_LATEST  : Up-to-date read as of transaction start (e.g. from master or a quorum read)
+ *   - READ_LOCKING : Up-to-date read as of now, that locks the records for the transaction
+ *
+ * Callers should use READ_NORMAL (or pass in no flags) unless the read determines a write.
+ * In theory, such cases may require READ_LOCKING, though to avoid contention, READ_LATEST is
+ * often good enough. If UPDATE race condition checks are required on a row and expensive code
+ * must run after the row is fetched to determine the UPDATE, it may help to do something like:
+ *   - a) Read the current row
+ *   - b) Determine the new row (expensive, so we don't want to hold locks now)
+ *   - c) Re-read the current row with READ_LOCKING; if it changed then bail out
+ *   - d) otherwise, do the updates
+ */
+interface IDBAccessObject {
+       // Constants for object loading bitfield flags (higher => higher QoS)
+       const READ_LATEST  = 1; // read from the master
+       const READ_LOCKING = 3; // READ_LATEST and "FOR UPDATE"
+
+       // Convenience constant for callers to explicitly request slave data
+       const READ_NORMAL = 0; // read from the slave
+
+       // Convenience constant for tracking how data was loaded (higher => higher QoS)
+       const READ_NONE = -1; // not loaded yet (or the object was cleared)
+}
index 0a1f988..3354f98 100644 (file)
@@ -225,12 +225,12 @@ abstract class DatabaseBase implements DatabaseType {
 
        protected $mServer, $mUser, $mPassword, $mDBname;
 
-       /**
-        * @var DatabaseBase
-        */
        protected $mConn = null;
        protected $mOpened = false;
 
+       /** @var Array */
+       protected $trxIdleCallbacks = array();
+
        protected $mTablePrefix;
        protected $mFlags;
        protected $mTrxLevel = 0;
@@ -271,7 +271,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool|null previous value of the flag
         */
-       function debug( $debug = null ) {
+       public function debug( $debug = null ) {
                return wfSetBit( $this->mFlags, DBO_DEBUG, $debug );
        }
 
@@ -297,7 +297,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return null|bool The previous value of the flag
         */
-       function bufferResults( $buffer = null ) {
+       public function bufferResults( $buffer = null ) {
                if ( is_null( $buffer ) ) {
                        return !(bool)( $this->mFlags & DBO_NOBUFFER );
                } else {
@@ -316,7 +316,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool The previous value of the flag.
         */
-       function ignoreErrors( $ignoreErrors = null ) {
+       public function ignoreErrors( $ignoreErrors = null ) {
                return wfSetBit( $this->mFlags, DBO_IGNORE, $ignoreErrors );
        }
 
@@ -329,7 +329,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $level int An integer (0 or 1), or omitted to leave it unchanged.
         * @return int The previous value
         */
-       function trxLevel( $level = null ) {
+       public function trxLevel( $level = null ) {
                return wfSetVar( $this->mTrxLevel, $level );
        }
 
@@ -338,7 +338,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $count int The count to set, or omitted to leave it unchanged.
         * @return int The error count
         */
-       function errorCount( $count = null ) {
+       public function errorCount( $count = null ) {
                return wfSetVar( $this->mErrorCount, $count );
        }
 
@@ -347,7 +347,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $prefix string The table prefix to set, or omitted to leave it unchanged.
         * @return string The previous table prefix.
         */
-       function tablePrefix( $prefix = null ) {
+       public function tablePrefix( $prefix = null ) {
                return wfSetVar( $this->mTablePrefix, $prefix );
        }
 
@@ -360,7 +360,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return LoadBalancer|null
         */
-       function getLBInfo( $name = null ) {
+       public function getLBInfo( $name = null ) {
                if ( is_null( $name ) ) {
                        return $this->mLBInfo;
                } else {
@@ -380,7 +380,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $name
         * @param $value
         */
-       function setLBInfo( $name, $value = null ) {
+       public function setLBInfo( $name, $value = null ) {
                if ( is_null( $value ) ) {
                        $this->mLBInfo = $name;
                } else {
@@ -393,7 +393,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $lag int
         */
-       function setFakeSlaveLag( $lag ) {
+       public function setFakeSlaveLag( $lag ) {
                $this->mFakeSlaveLag = $lag;
        }
 
@@ -402,7 +402,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $enabled bool
         */
-       function setFakeMaster( $enabled = true ) {
+       public function setFakeMaster( $enabled = true ) {
                $this->mFakeMaster = $enabled;
        }
 
@@ -411,7 +411,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function cascadingDeletes() {
+       public function cascadingDeletes() {
                return false;
        }
 
@@ -420,7 +420,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function cleanupTriggers() {
+       public function cleanupTriggers() {
                return false;
        }
 
@@ -430,7 +430,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function strictIPs() {
+       public function strictIPs() {
                return false;
        }
 
@@ -439,7 +439,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
        */
-       function realTimestamps() {
+       public function realTimestamps() {
                return false;
        }
 
@@ -448,7 +448,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function implicitGroupby() {
+       public function implicitGroupby() {
                return true;
        }
 
@@ -458,17 +458,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function implicitOrderby() {
-               return true;
-       }
-
-       /**
-        * Returns true if this database requires that SELECT DISTINCT queries require that all
-          ORDER BY expressions occur in the SELECT list per the SQL92 standard
-        *
-        * @return bool
-        */
-       function standardSelectDistinct() {
+       public function implicitOrderby() {
                return true;
        }
 
@@ -478,7 +468,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function searchableIPs() {
+       public function searchableIPs() {
                return false;
        }
 
@@ -487,7 +477,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function functionalIndexes() {
+       public function functionalIndexes() {
                return false;
        }
 
@@ -495,7 +485,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Return the last query that went through DatabaseBase::query()
         * @return String
         */
-       function lastQuery() {
+       public function lastQuery() {
                return $this->mLastQuery;
        }
 
@@ -505,7 +495,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function doneWrites() {
+       public function doneWrites() {
                return $this->mDoneWrites;
        }
 
@@ -513,7 +503,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Is a connection to the database open?
         * @return Boolean
         */
-       function isOpen() {
+       public function isOpen() {
                return $this->mOpened;
        }
 
@@ -529,7 +519,7 @@ abstract class DatabaseBase implements DatabaseType {
         *       and removes it in command line mode
         *   - DBO_PERSISTENT: use persistant database connection
         */
-       function setFlag( $flag ) {
+       public function setFlag( $flag ) {
                global $wgDebugDBTransactions;
                $this->mFlags |= $flag;
                if ( ( $flag & DBO_TRX) & $wgDebugDBTransactions ) {
@@ -542,7 +532,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $flag: same as setFlag()'s $flag param
         */
-       function clearFlag( $flag ) {
+       public function clearFlag( $flag ) {
                global $wgDebugDBTransactions;
                $this->mFlags &= ~$flag;
                if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
@@ -556,7 +546,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $flag: same as setFlag()'s $flag param
         * @return Boolean
         */
-       function getFlag( $flag ) {
+       public function getFlag( $flag ) {
                return !!( $this->mFlags & $flag );
        }
 
@@ -567,14 +557,14 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return string
         */
-       function getProperty( $name ) {
+       public function getProperty( $name ) {
                return $this->$name;
        }
 
        /**
         * @return string
         */
-       function getWikiID() {
+       public function getWikiID() {
                if ( $this->mTablePrefix ) {
                        return "{$this->mDBname}-{$this->mTablePrefix}";
                } else {
@@ -651,36 +641,6 @@ abstract class DatabaseBase implements DatabaseType {
                throw new MWException( 'Database serialization may cause problems, since the connection is not restored on wakeup.' );
        }
 
-       /**
-        * Same as new DatabaseMysql( ... ), kept for backward compatibility
-        * @deprecated since 1.17
-        *
-        * @param $server
-        * @param $user
-        * @param $password
-        * @param $dbName
-        * @param $flags int
-        * @return DatabaseMysql
-        */
-       static function newFromParams( $server, $user, $password, $dbName, $flags = 0 ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               return new DatabaseMysql( $server, $user, $password, $dbName, $flags );
-       }
-
-       /**
-        * Same as new factory( ... ), kept for backward compatibility
-        * @deprecated since 1.18
-        * @see Database::factory()
-        * @return DatabaseBase
-        */
-       public final static function newFromType( $dbType, $p = array() ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               if ( isset( $p['tableprefix'] ) ) {
-                       $p['tablePrefix'] = $p['tableprefix'];
-               }
-               return self::factory( $dbType, $p );
-       }
-
        /**
         * Given a DB type, construct the name of the appropriate child class of
         * DatabaseBase. This is designed to replace all of the manual stuff like:
@@ -811,7 +771,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function isWriteQuery( $sql ) {
+       public function isWriteQuery( $sql ) {
                return !preg_match( '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|EXPLAIN|\(SELECT)\b/i', $sql );
        }
 
@@ -957,7 +917,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $fname String
         * @param $tempIgnore Boolean
         */
-       function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
+       public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
                # Ignore errors during error handling to avoid infinite recursion
                $ignore = $this->ignoreErrors( true );
                ++$this->mErrorCount;
@@ -982,16 +942,12 @@ abstract class DatabaseBase implements DatabaseType {
         * & = filename; reads the file and inserts as a blob
         *     (we don't use this though...)
         *
-        * This function should not be used directly by new code outside of the
-        * database classes. The query wrapper functions (select() etc.) should be
-        * used instead.
-        *
         * @param $sql string
         * @param $func string
         *
         * @return array
         */
-       function prepare( $sql, $func = 'DatabaseBase::prepare' ) {
+       protected function prepare( $sql, $func = 'DatabaseBase::prepare' ) {
                /* MySQL doesn't support prepared statements (yet), so just
                   pack up the query for reference. We'll manually replace
                   the bits later. */
@@ -1002,7 +958,7 @@ abstract class DatabaseBase implements DatabaseType {
         * Free a prepared query, generated by prepare().
         * @param $prepared
         */
-       function freePrepared( $prepared ) {
+       protected function freePrepared( $prepared ) {
                /* No-op by default */
        }
 
@@ -1013,7 +969,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return ResultWrapper
         */
-       function execute( $prepared, $args = null ) {
+       public function execute( $prepared, $args = null ) {
                if ( !is_array( $args ) ) {
                        # Pull the var args
                        $args = func_get_args();
@@ -1026,41 +982,13 @@ abstract class DatabaseBase implements DatabaseType {
        }
 
        /**
-        * Prepare & execute an SQL statement, quoting and inserting arguments
-        * in the appropriate places.
-        *
-        * This function should not be used directly by new code outside of the
-        * database classes. The query wrapper functions (select() etc.) should be
-        * used instead.
+        * For faking prepared SQL statements on DBs that don't support it directly.
         *
-        * @param $query String
-        * @param $args ...
-        *
-        * @return ResultWrapper
-        */
-       function safeQuery( $query, $args = null ) {
-               $prepared = $this->prepare( $query, 'DatabaseBase::safeQuery' );
-
-               if ( !is_array( $args ) ) {
-                       # Pull the var args
-                       $args = func_get_args();
-                       array_shift( $args );
-               }
-
-               $retval = $this->execute( $prepared, $args );
-               $this->freePrepared( $prepared );
-
-               return $retval;
-       }
-
-       /**
-        * For faking prepared SQL statements on DBs that don't support
-        * it directly.
         * @param $preparedQuery String: a 'preparable' SQL statement
         * @param $args Array of arguments to fill it with
         * @return string executable SQL
         */
-       function fillPrepared( $preparedQuery, $args ) {
+       public function fillPrepared( $preparedQuery, $args ) {
                reset( $args );
                $this->preparedArgs =& $args;
 
@@ -1076,7 +1004,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $matches Array
         * @return String
         */
-       function fillPreparedArg( $matches ) {
+       protected function fillPreparedArg( $matches ) {
                switch( $matches[1] ) {
                        case '\\?': return '?';
                        case '\\!': return '!';
@@ -1103,32 +1031,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $res Mixed: A SQL result
         */
-       function freeResult( $res ) {
-       }
-
-       /**
-        * Simple UPDATE wrapper.
-        * Usually throws a DBQueryError on failure.
-        * If errors are explicitly ignored, returns success
-        *
-        * This function exists for historical reasons, DatabaseBase::update() has a more standard
-        * calling convention and feature set
-        *
-        * @param $table string
-        * @param $var
-        * @param $value
-        * @param $cond
-        * @param $fname string
-        *
-        * @return bool
-        */
-       function set( $table, $var, $value, $cond, $fname = 'DatabaseBase::set' ) {
-               $table = $this->tableName( $table );
-               $sql = "UPDATE $table SET $var = '" .
-                 $this->strencode( $value ) . "' WHERE ($cond)";
-
-               return (bool)$this->query( $sql, $fname );
-       }
+       public function freeResult( $res ) {}
 
        /**
         * A SELECT wrapper which returns a single field from a single result row.
@@ -1147,7 +1050,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool|mixed The value from the field, or false on failure.
         */
-       function selectField( $table, $var, $cond = '', $fname = 'DatabaseBase::selectField',
+       public function selectField( $table, $var, $cond = '', $fname = 'DatabaseBase::selectField',
                $options = array() )
        {
                if ( !is_array( $options ) ) {
@@ -1180,7 +1083,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @return Array
         * @see DatabaseBase::select()
         */
-       function makeSelectOptions( $options ) {
+       public function makeSelectOptions( $options ) {
                $preLimitTail = $postLimitTail = '';
                $startOpts = '';
 
@@ -1299,10 +1202,12 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $vars string|array
         *
         * May be either a field name or an array of field names. The field names
-        * here are complete fragments of SQL, for direct inclusion into the SELECT
-        * query. Expressions and aliases may be specified as in SQL, for example:
+        * can be complete fragments of SQL, for direct inclusion into the SELECT
+        * query. If an array is given, field aliases can be specified, for example:
         *
-        *   array( 'MAX(rev_id) AS maxrev' )
+        *   array( 'maxrev' => 'MAX(rev_id)' )
+        *
+        * This includes an expression with the alias "maxrev" in the query.
         *
         * If an expression is given, care must be taken to ensure that it is
         * DBMS-independent.
@@ -1405,7 +1310,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.
         */
-       function select( $table, $vars, $conds = '', $fname = 'DatabaseBase::select',
+       public function select( $table, $vars, $conds = '', $fname = 'DatabaseBase::select',
                $options = array(), $join_conds = array() ) {
                $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
 
@@ -1414,7 +1319,9 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * The equivalent of DatabaseBase::select() except that the constructed SQL
-        * is returned, instead of being immediately executed.
+        * is returned, instead of being immediately executed. This can be useful for
+        * doing UNION queries, where the SQL text of each query is needed. In general,
+        * however, callers outside of Database classes should just use select().
         *
         * @param $table string|array Table name
         * @param $vars string|array Field names
@@ -1426,9 +1333,11 @@ abstract class DatabaseBase implements DatabaseType {
         * @return string SQL query string.
         * @see DatabaseBase::select()
         */
-       function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseBase::select', $options = array(), $join_conds = array() ) {
+       public function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseBase::select',
+               $options = array(), $join_conds = array() )
+       {
                if ( is_array( $vars ) ) {
-                       $vars = implode( ',', $vars );
+                       $vars = implode( ',', $this->fieldNamesWithAlias( $vars ) );
                }
 
                $options = (array)$options;
@@ -1491,7 +1400,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return object|bool
         */
-       function selectRow( $table, $vars, $conds, $fname = 'DatabaseBase::selectRow',
+       public function selectRow( $table, $vars, $conds, $fname = 'DatabaseBase::selectRow',
                $options = array(), $join_conds = array() )
        {
                $options = (array)$options;
@@ -1535,7 +1444,7 @@ abstract class DatabaseBase implements DatabaseType {
                $fname = 'DatabaseBase::estimateRowCount', $options = array() )
        {
                $rows = 0;
-               $res = $this->select ( $table, 'COUNT(*) AS rowcount', $conds, $fname, $options );
+               $res = $this->select( $table, array( 'rowcount' => 'COUNT(*)' ), $conds, $fname, $options );
 
                if ( $res ) {
                        $row = $this->fetchRow( $res );
@@ -1581,7 +1490,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $fname String: calling function name (optional)
         * @return Boolean: whether $table has filed $field
         */
-       function fieldExists( $table, $field, $fname = 'DatabaseBase::fieldExists' ) {
+       public function fieldExists( $table, $field, $fname = 'DatabaseBase::fieldExists' ) {
                $info = $this->fieldInfo( $table, $field );
 
                return (bool)$info;
@@ -1598,7 +1507,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool|null
         */
-       function indexExists( $table, $index, $fname = 'DatabaseBase::indexExists' ) {
+       public function indexExists( $table, $index, $fname = 'DatabaseBase::indexExists' ) {
                $info = $this->indexInfo( $table, $index, $fname );
                if ( is_null( $info ) ) {
                        return null;
@@ -1615,7 +1524,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function tableExists( $table, $fname = __METHOD__ ) {
+       public function tableExists( $table, $fname = __METHOD__ ) {
                $table = $this->tableName( $table );
                $old = $this->ignoreErrors( true );
                $res = $this->query( "SELECT 1 FROM $table LIMIT 1", $fname );
@@ -1630,7 +1539,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $index
         * @return string
         */
-       function fieldType( $res, $index ) {
+       public function fieldType( $res, $index ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -1646,7 +1555,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function indexUnique( $table, $index ) {
+       public function indexUnique( $table, $index ) {
                $indexInfo = $this->indexInfo( $table, $index );
 
                if ( !$indexInfo ) {
@@ -1662,7 +1571,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $options array
         * @return string
         */
-       function makeInsertOptions( $options ) {
+       protected function makeInsertOptions( $options ) {
                return implode( ' ', $options );
        }
 
@@ -1699,7 +1608,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function insert( $table, $a, $fname = 'DatabaseBase::insert', $options = array() ) {
+       public function insert( $table, $a, $fname = 'DatabaseBase::insert', $options = array() ) {
                # No rows to insert, easy just return now
                if ( !count( $a ) ) {
                        return true;
@@ -1747,7 +1656,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $options Array: The options passed to DatabaseBase::update
         * @return string
         */
-       function makeUpdateOptions( $options ) {
+       protected function makeUpdateOptions( $options ) {
                if ( !is_array( $options ) ) {
                        $options = array( $options );
                }
@@ -1813,7 +1722,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return string
         */
-       function makeList( $a, $mode = LIST_COMMA ) {
+       public function makeList( $a, $mode = LIST_COMMA ) {
                if ( !is_array( $a ) ) {
                        throw new DBUnexpectedError( $this, 'DatabaseBase::makeList called with incorrect parameters' );
                }
@@ -1873,12 +1782,12 @@ abstract class DatabaseBase implements DatabaseType {
         * The keys on each level may be either integers or strings.
         *
         * @param $data Array: organized as 2-d
-        *              array(baseKeyVal => array(subKeyVal => <ignored>, ...), ...)
+        *              array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
         * @param $baseKey String: field name to match the base-level keys to (eg 'pl_namespace')
         * @param $subKey String: field name to match the sub-level keys to (eg 'pl_title')
         * @return Mixed: string SQL fragment, or false if no items in array.
         */
-       function makeWhereFrom2d( $data, $baseKey, $subKey ) {
+       public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
                $conds = array();
 
                foreach ( $data as $base => $sub ) {
@@ -1898,14 +1807,22 @@ abstract class DatabaseBase implements DatabaseType {
        }
 
        /**
-        * Bitwise operations
+        * Return aggregated value alias
+        *
+        * @param $valuedata
+        * @param $valuename string
+        *
+        * @return string
         */
+       public function aggregateValue( $valuedata, $valuename = 'value' ) {
+               return $valuename;
+       }
 
        /**
         * @param $field
         * @return string
         */
-       function bitNot( $field ) {
+       public function bitNot( $field ) {
                return "(~$field)";
        }
 
@@ -1914,7 +1831,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $fieldRight
         * @return string
         */
-       function bitAnd( $fieldLeft, $fieldRight ) {
+       public function bitAnd( $fieldLeft, $fieldRight ) {
                return "($fieldLeft & $fieldRight)";
        }
 
@@ -1923,10 +1840,19 @@ abstract class DatabaseBase implements DatabaseType {
         * @param  $fieldRight
         * @return string
         */
-       function bitOr( $fieldLeft, $fieldRight ) {
+       public function bitOr( $fieldLeft, $fieldRight ) {
                return "($fieldLeft | $fieldRight)";
        }
 
+       /**
+        * Build a concatenation list to feed into a SQL query
+        * @param $stringList Array: list of raw SQL expressions; caller is responsible for any quoting
+        * @return String
+        */
+       public function buildConcat( $stringList ) {
+               return 'CONCAT(' . implode( ',', $stringList ) . ')';
+       }
+
        /**
         * Change the current database
         *
@@ -1936,7 +1862,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool Success or failure
         */
-       function selectDB( $db ) {
+       public function selectDB( $db ) {
                # Stub.  Shouldn't cause serious problems if it's not overridden, but
                # if your database engine supports a concept similar to MySQL's
                # databases you may as well.
@@ -1947,14 +1873,14 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Get the current DB name
         */
-       function getDBname() {
+       public function getDBname() {
                return $this->mDBname;
        }
 
        /**
         * Get the server hostname or IP address
         */
-       function getServer() {
+       public function getServer() {
                return $this->mServer;
        }
 
@@ -1975,7 +1901,7 @@ abstract class DatabaseBase implements DatabaseType {
         *   raw - Do not add identifier quotes to the table name
         * @return String: full database name
         */
-       function tableName( $name, $format = 'quoted' ) {
+       public function tableName( $name, $format = 'quoted' ) {
                global $wgSharedDB, $wgSharedPrefix, $wgSharedTables;
                # Skip the entire process when we have a string quoted on both ends.
                # Note that we check the end so that we will still quote any use of
@@ -2027,7 +1953,9 @@ abstract class DatabaseBase implements DatabaseType {
 
                # Quote the $database and $table and apply the prefix if not quoted.
                if ( isset( $database ) ) {
-                       $database = ( $format == 'quoted' || $this->isQuotedIdentifier( $database ) ? $database : $this->addIdentifierQuotes( $database ) );
+                       if ( $format == 'quoted' && !$this->isQuotedIdentifier( $database ) ) {
+                               $database = $this->addIdentifierQuotes( $database );
+                       }
                }
 
                $table = "{$prefix}{$table}";
@@ -2118,6 +2046,39 @@ abstract class DatabaseBase implements DatabaseType {
                return $retval;
        }
 
+       /**
+        * Get an aliased field name
+        * e.g. fieldName AS newFieldName
+        *
+        * @param $name string Field name
+        * @param $alias string|bool Alias (optional)
+        * @return string SQL name for aliased field. Will not alias a field to its own name
+        */
+       public function fieldNameWithAlias( $name, $alias = false ) {
+               if ( !$alias || (string)$alias === (string)$name ) {
+                       return $name;
+               } else {
+                       return $name . ' AS ' . $alias; //PostgreSQL needs AS
+               }
+       }
+
+       /**
+        * Gets an array of aliased field names
+        *
+        * @param $fields array( [alias] => field )
+        * @return array of strings, see fieldNameWithAlias()
+        */
+       public function fieldNamesWithAlias( $fields ) {
+               $retval = array();
+               foreach ( $fields as $alias => $field ) {
+                       if ( is_numeric( $alias ) ) {
+                               $alias = $field;
+                       }
+                       $retval[] = $this->fieldNameWithAlias( $field, $alias );
+               }
+               return $retval;
+       }
+
        /**
         * Get the aliased table name clause for a FROM clause
         * which might have a JOIN and/or USE INDEX clause
@@ -2186,7 +2147,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return string
         */
-       function indexName( $index ) {
+       protected function indexName( $index ) {
                // Backwards-compatibility hack
                $renamed = array(
                        'ar_usertext_timestamp' => 'usertext_timestamp',
@@ -2209,7 +2170,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return string
         */
-       function addQuotes( $s ) {
+       public function addQuotes( $s ) {
                if ( $s === null ) {
                        return 'NULL';
                } else {
@@ -2247,36 +2208,6 @@ abstract class DatabaseBase implements DatabaseType {
                return $name[0] == '"' && substr( $name, -1, 1 ) == '"';
        }
 
-       /**
-        * Backwards compatibility, identifier quoting originated in DatabasePostgres
-        * which used quote_ident which does not follow our naming conventions
-        * was renamed to addIdentifierQuotes.
-        * @deprecated since 1.18 use addIdentifierQuotes
-        *
-        * @param $s string
-        *
-        * @return string
-        */
-       function quote_ident( $s ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return $this->addIdentifierQuotes( $s );
-       }
-
-       /**
-        * Escape string for safe LIKE usage.
-        * WARNING: you should almost never use this function directly,
-        * instead use buildLike() that escapes everything automatically
-        * @deprecated since 1.17, warnings in 1.17, removed in ???
-        *
-        * @param $s string
-        *
-        * @return string
-        */
-       public function escapeLike( $s ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               return $this->escapeLikeInternal( $s );
-       }
-
        /**
         * @param $s string
         * @return string
@@ -2301,7 +2232,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @since 1.16
         * @return String: fully built LIKE statement
         */
-       function buildLike() {
+       public function buildLike() {
                $params = func_get_args();
 
                if ( count( $params ) > 0 && is_array( $params[0] ) ) {
@@ -2326,7 +2257,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return LikeMatch
         */
-       function anyChar() {
+       public function anyChar() {
                return new LikeMatch( '_' );
        }
 
@@ -2335,7 +2266,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return LikeMatch
         */
-       function anyString() {
+       public function anyString() {
                return new LikeMatch( '%' );
        }
 
@@ -2350,7 +2281,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $seqName string
         * @return null
         */
-       function nextSequenceValue( $seqName ) {
+       public function nextSequenceValue( $seqName ) {
                return null;
        }
 
@@ -2364,7 +2295,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $index
         * @return string
         */
-       function useIndexClause( $index ) {
+       public function useIndexClause( $index ) {
                return '';
        }
 
@@ -2390,7 +2321,7 @@ abstract class DatabaseBase implements DatabaseType {
         *    a field name or an array of field names
         * @param $fname String: Calling function name (use __METHOD__) for logs/profiling
         */
-       function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseBase::replace' ) {
+       public function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseBase::replace' ) {
                $quotedTable = $this->tableName( $table );
 
                if ( count( $rows ) == 0 ) {
@@ -2491,7 +2422,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $fname      String: Calling function name (use __METHOD__) for
         *                    logs/profiling
         */
-       function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
+       public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
                $fname = 'DatabaseBase::deleteJoin' )
        {
                if ( !$conds ) {
@@ -2518,7 +2449,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return int
         */
-       function textFieldSize( $table, $field ) {
+       public function textFieldSize( $table, $field ) {
                $table = $this->tableName( $table );
                $sql = "SHOW COLUMNS FROM $table LIKE \"$field\";";
                $res = $this->query( $sql, 'DatabaseBase::textFieldSize' );
@@ -2543,7 +2474,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @return string Returns the text of the low priority option if it is
         *   supported, or a blank string otherwise
         */
-       function lowPriorityOption() {
+       public function lowPriorityOption() {
                return '';
        }
 
@@ -2557,7 +2488,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function delete( $table, $conds, $fname = 'DatabaseBase::delete' ) {
+       public function delete( $table, $conds, $fname = 'DatabaseBase::delete' ) {
                if ( !$conds ) {
                        throw new DBUnexpectedError( $this, 'DatabaseBase::delete() called with no conditions' );
                }
@@ -2598,7 +2529,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return ResultWrapper
         */
-       function insertSelect( $destTable, $srcTable, $varMap, $conds,
+       public function insertSelect( $destTable, $srcTable, $varMap, $conds,
                $fname = 'DatabaseBase::insertSelect',
                $insertOptions = array(), $selectOptions = array() )
        {
@@ -2644,8 +2575,7 @@ abstract class DatabaseBase implements DatabaseType {
         * If the result of the query is not ordered, then the rows to be returned
         * are theoretically arbitrary.
         *
-        * $sql is expected to be a SELECT, if that makes a difference.  For
-        * UPDATE, limitResultForUpdate should be used.
+        * $sql is expected to be a SELECT, if that makes a difference.
         *
         * The version provided by default works in MySQL and SQLite.  It will very
         * likely need to be overridden for most other DBMSes.
@@ -2656,23 +2586,13 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return string
         */
-       function limitResult( $sql, $limit, $offset = false ) {
+       public function limitResult( $sql, $limit, $offset = false ) {
                if ( !is_numeric( $limit ) ) {
                        throw new DBUnexpectedError( $this, "Invalid non-numeric limit passed to limitResult()\n" );
                }
-
                return "$sql LIMIT "
-                               . ( ( is_numeric( $offset ) && $offset != 0 ) ? "{$offset}," : "" )
-                               . "{$limit} ";
-       }
-
-       /**
-        * @param $sql
-        * @param $num
-        * @return string
-        */
-       function limitResultForUpdate( $sql, $num ) {
-               return $this->limitResult( $sql, $num, 0 );
+                       . ( ( is_numeric( $offset ) && $offset != 0 ) ? "{$offset}," : "" )
+                       . "{$limit} ";
        }
 
        /**
@@ -2680,7 +2600,7 @@ abstract class DatabaseBase implements DatabaseType {
         * within the UNION construct.
         * @return Boolean
         */
-       function unionSupportsOrderAndLimit() {
+       public function unionSupportsOrderAndLimit() {
                return true; // True for almost every DB supported
        }
 
@@ -2692,7 +2612,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $all Boolean: use UNION ALL
         * @return String: SQL fragment
         */
-       function unionQueries( $sqls, $all ) {
+       public function unionQueries( $sqls, $all ) {
                $glue = $all ? ') UNION ALL (' : ') UNION (';
                return '(' . implode( $glue, $sqls ) . ')';
        }
@@ -2701,12 +2621,15 @@ abstract class DatabaseBase implements DatabaseType {
         * Returns an SQL expression for a simple conditional.  This doesn't need
         * to be overridden unless CASE isn't supported in your DBMS.
         *
-        * @param $cond String: SQL expression which will result in a boolean value
+        * @param $cond string|array SQL expression which will result in a boolean value
         * @param $trueVal String: SQL expression to return if true
         * @param $falseVal String: SQL expression to return if false
         * @return String: SQL fragment
         */
-       function conditional( $cond, $trueVal, $falseVal ) {
+       public function conditional( $cond, $trueVal, $falseVal ) {
+               if ( is_array( $cond ) ) {
+                       $cond = $this->makeList( $cond, LIST_AND );
+               }
                return " (CASE WHEN $cond THEN $trueVal ELSE $falseVal END) ";
        }
 
@@ -2720,7 +2643,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return string
         */
-       function strreplace( $orig, $old, $new ) {
+       public function strreplace( $orig, $old, $new ) {
                return "REPLACE({$orig}, {$old}, {$new})";
        }
 
@@ -2730,7 +2653,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return int
         */
-       function getServerUptime() {
+       public function getServerUptime() {
                return 0;
        }
 
@@ -2740,7 +2663,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function wasDeadlock() {
+       public function wasDeadlock() {
                return false;
        }
 
@@ -2750,7 +2673,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function wasLockTimeout() {
+       public function wasLockTimeout() {
                return false;
        }
 
@@ -2761,7 +2684,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function wasErrorReissuable() {
+       public function wasErrorReissuable() {
                return false;
        }
 
@@ -2771,7 +2694,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function wasReadOnlyError() {
+       public function wasReadOnlyError() {
                return false;
        }
 
@@ -2793,8 +2716,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       function deadlockLoop() {
-
+       public function deadlockLoop() {
                $this->begin( __METHOD__ );
                $args = func_get_args();
                $function = array_shift( $args );
@@ -2846,7 +2768,7 @@ abstract class DatabaseBase implements DatabaseType {
         *   greater than zero if we waited for some period of time, less than
         *   zero if we timed out.
         */
-       function masterPosWait( DBMasterPos $pos, $timeout ) {
+       public function masterPosWait( DBMasterPos $pos, $timeout ) {
                wfProfileIn( __METHOD__ );
 
                if ( !is_null( $this->mFakeSlaveLag ) ) {
@@ -2879,7 +2801,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return DBMasterPos, or false if this is not a slave.
         */
-       function getSlavePos() {
+       public function getSlavePos() {
                if ( !is_null( $this->mFakeSlaveLag ) ) {
                        $pos = new MySQLMasterPos( 'fake', microtime( true ) - $this->mFakeSlaveLag );
                        wfDebug( __METHOD__ . ": fake slave pos = $pos\n" );
@@ -2895,7 +2817,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return DBMasterPos, or false if this is not a master
         */
-       function getMasterPos() {
+       public function getMasterPos() {
                if ( $this->mFakeMaster ) {
                        return new MySQLMasterPos( 'fake', microtime( true ) );
                } else {
@@ -2903,12 +2825,62 @@ 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.
+        * Callbacks must commit any transactions that they begin.
+        *
+        * This is useful for updates to different systems or separate transactions are needed.
+        *
+        * @param Closure $callback
+        * @return void
+        */
+       final public function onTransactionIdle( Closure $callback ) {
+               if ( $this->mTrxLevel ) {
+                       $this->trxIdleCallbacks[] = $callback;
+               } else {
+                       $callback();
+               }
+       }
+
+       /**
+        * Actually run the "on transaction idle" callbacks
+        */
+       protected function runOnTransactionIdleCallbacks() {
+               $e = null; // last exception
+               do { // callbacks may add callbacks :)
+                       $callbacks = $this->trxIdleCallbacks;
+                       $this->trxIdleCallbacks = array(); // recursion guard
+                       foreach ( $callbacks as $callback ) {
+                               try {
+                                       $callback();
+                               } catch ( Exception $e ) {}
+                       }
+               } while ( count( $this->trxIdleCallbacks ) );
+
+               if ( $e instanceof Exception ) {
+                       throw $e; // re-throw any last exception
+               }
+       }
+
        /**
         * Begin a transaction
         *
         * @param $fname string
         */
-       function begin( $fname = 'DatabaseBase::begin' ) {
+       final public function begin( $fname = 'DatabaseBase::begin' ) {
+               if ( $this->mTrxLevel ) { // implicit commit
+                       $this->doCommit( $fname );
+                       $this->runOnTransactionIdleCallbacks();
+               }
+               $this->doBegin( $fname );
+       }
+
+       /**
+        * @see DatabaseBase::begin()
+        * @param type $fname
+        */
+       protected function doBegin( $fname ) {
                $this->query( 'BEGIN', $fname );
                $this->mTrxLevel = 1;
        }
@@ -2918,7 +2890,16 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $fname string
         */
-       function commit( $fname = 'DatabaseBase::commit' ) {
+       final public function commit( $fname = 'DatabaseBase::commit' ) {
+               $this->doCommit( $fname );
+               $this->runOnTransactionIdleCallbacks();
+       }
+
+       /**
+        * @see DatabaseBase::commit()
+        * @param type $fname
+        */
+       protected function doCommit( $fname ) {
                if ( $this->mTrxLevel ) {
                        $this->query( 'COMMIT', $fname );
                        $this->mTrxLevel = 0;
@@ -2931,7 +2912,16 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $fname string
         */
-       function rollback( $fname = 'DatabaseBase::rollback' ) {
+       final public function rollback( $fname = 'DatabaseBase::rollback' ) {
+               $this->doRollback( $fname );
+               $this->trxIdleCallbacks = array(); // cancel
+       }
+
+       /**
+        * @see DatabaseBase::rollback()
+        * @param type $fname
+        */
+       protected function doRollback( $fname ) {
                if ( $this->mTrxLevel ) {
                        $this->query( 'ROLLBACK', $fname, true );
                        $this->mTrxLevel = 0;
@@ -2952,7 +2942,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $fname String: calling function name
         * @return Boolean: true if operation was successful
         */
-       function duplicateTableStructure( $oldName, $newName, $temporary = false,
+       public function duplicateTableStructure( $oldName, $newName, $temporary = false,
                $fname = 'DatabaseBase::duplicateTableStructure' )
        {
                throw new MWException(
@@ -2980,7 +2970,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return string
         */
-       function timestamp( $ts = 0 ) {
+       public function timestamp( $ts = 0 ) {
                return wfTimestamp( TS_MW, $ts );
        }
 
@@ -2997,7 +2987,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return string
         */
-       function timestampOrNull( $ts = null ) {
+       public function timestampOrNull( $ts = null ) {
                if ( is_null( $ts ) ) {
                        return null;
                } else {
@@ -3020,7 +3010,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool|ResultWrapper
         */
-       function resultObject( $result ) {
+       public function resultObject( $result ) {
                if ( empty( $result ) ) {
                        return false;
                } elseif ( $result instanceof ResultWrapper ) {
@@ -3033,24 +3023,12 @@ abstract class DatabaseBase implements DatabaseType {
                }
        }
 
-       /**
-        * Return aggregated value alias
-        *
-        * @param $valuedata
-        * @param $valuename string
-        *
-        * @return string
-        */
-       function aggregateValue ( $valuedata, $valuename = 'value' ) {
-               return $valuename;
-       }
-
        /**
         * Ping the server and try to reconnect if it there is no connection
         *
         * @return bool Success or failure
         */
-       function ping() {
+       public function ping() {
                # Stub.  Not essential to override.
                return true;
        }
@@ -3064,7 +3042,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return int Database replication lag in seconds
         */
-       function getLag() {
+       public function getLag() {
                return intval( $this->mFakeSlaveLag );
        }
 
@@ -3085,7 +3063,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $b string
         * @return string
         */
-       function encodeBlob( $b ) {
+       public function encodeBlob( $b ) {
                return $b;
        }
 
@@ -3096,22 +3074,10 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $b string
         * @return string
         */
-       function decodeBlob( $b ) {
+       public function decodeBlob( $b ) {
                return $b;
        }
 
-       /**
-        * Override database's default connection timeout
-        *
-        * @param $timeout Integer in seconds
-        * @return void
-        * @deprecated since 1.19; use setSessionOptions()
-        */
-       public function setTimeout( $timeout ) {
-               wfDeprecated( __METHOD__, '1.19' );
-               $this->setSessionOptions( array( 'connTimeout' => $timeout ) );
-       }
-
        /**
         * Override database's default behavior. $options include:
         *     'connTimeout' : Set the connection timeout value in seconds.
@@ -3137,7 +3103,9 @@ abstract class DatabaseBase implements DatabaseType {
         *      generated dynamically using $filename
         * @return bool|string
         */
-       function sourceFile( $filename, $lineCallback = false, $resultCallback = false, $fname = false ) {
+       public function sourceFile(
+               $filename, $lineCallback = false, $resultCallback = false, $fname = false
+       ) {
                wfSuppressWarnings();
                $fp = fopen( $filename, 'r' );
                wfRestoreWarnings();
@@ -3189,7 +3157,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $vars bool|array mapping variable name to value.
         */
-       function setSchemaVars( $vars ) {
+       public function setSchemaVars( $vars ) {
                $this->mSchemaVars = $vars;
        }
 
@@ -3374,15 +3342,6 @@ abstract class DatabaseBase implements DatabaseType {
                return $this->indexName( $matches[1] );
        }
 
-       /**
-        * Build a concatenation list to feed into a SQL query
-        * @param $stringList Array: list of raw SQL expressions; caller is responsible for any quoting
-        * @return String
-        */
-       function buildConcat( $stringList ) {
-               return 'CONCAT(' . implode( ',', $stringList ) . ')';
-       }
-
        /**
         * Check to see if a named lock is available. This is non-blocking.
         *
index 53341c3..a53a674 100644 (file)
@@ -318,7 +318,7 @@ class DBQueryError extends DBError {
                                $fname = $this->fname;
                                $error = $this->error;
                        }
-                       return wfMsg( $msg, $sql, $fname, $this->errno, $error );
+                       return wfMessage( $msg )->rawParams( $sql, $fname, $this->errno, $error )->text();
                } else {
                        return parent::getContentMessage( $html );
                }
index 1fdcd5c..f1f6dfc 100644 (file)
@@ -145,21 +145,21 @@ class IBM_DB2Result{
         */
        public function __construct( $db, $result, $num_rows, $sql, $columns ){
                $this->db = $db;
-               
+
                if( $result instanceof ResultWrapper ){
                        $this->result = $result->result;
                }
                else{
                        $this->result = $result;
                }
-               
+
                $this->num_rows = $num_rows;
                $this->current_pos = 0;
                if ( $this->num_rows > 0 ) {
                        // Make a lower-case list of the column names
                        // By default, DB2 column names are capitalized
                        //  while MySQL column names are lowercase
-                       
+
                        // Is there a reasonable maximum value for $i?
                        // Setting to 2048 to prevent an infinite loop
                        for( $i = 0; $i < 2048; $i++ ) {
@@ -170,11 +170,11 @@ class IBM_DB2Result{
                                else {
                                        return false;
                                }
-                               
+
                                $this->columns[$i] = strtolower( $name );
                        }
                }
-               
+
                $this->sql = $sql;
        }
 
@@ -202,14 +202,14 @@ class IBM_DB2Result{
         * @return mixed Object on success, false on failure.
         */
        public function fetchObject() {
-               if ( $this->result 
-                               && $this->num_rows > 0 
-                               && $this->current_pos >= 0 
-                               && $this->current_pos < $this->num_rows ) 
+               if ( $this->result
+                               && $this->num_rows > 0
+                               && $this->current_pos >= 0
+                               && $this->current_pos < $this->num_rows )
                {
                        $row = $this->fetchRow();
                        $ret = new stdClass();
-                       
+
                        foreach ( $row as $k => $v ) {
                                $lc = $this->columns[$k];
                                $ret->$lc = $v;
@@ -225,9 +225,9 @@ class IBM_DB2Result{
         * @throws DBUnexpectedError
         */
        public function fetchRow(){
-               if ( $this->result 
-                               && $this->num_rows > 0 
-                               && $this->current_pos >= 0 
+               if ( $this->result
+                               && $this->num_rows > 0
+                               && $this->current_pos >= 0
                                && $this->current_pos < $this->num_rows )
                {
                        if ( $this->loadedLines <= $this->current_pos ) {
@@ -242,7 +242,7 @@ class IBM_DB2Result{
                        if ( $this->loadedLines > $this->current_pos ){
                                return $this->resultSet[$this->current_pos++];
                        }
-                       
+
                }
                return false;
        }
@@ -416,7 +416,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
                return 'ibm_db2';
        }
 
-       /** 
+       /**
         * Returns the database connection object
         * @return Object
         */
@@ -807,7 +807,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
        /**
         * Start a transaction (mandatory)
         */
-       public function begin( $fname = 'DatabaseIbm_db2::begin' ) {
+       protected function doBegin( $fname = 'DatabaseIbm_db2::begin' ) {
                // BEGIN is implicit for DB2
                // However, it requires that AutoCommit be off.
 
@@ -823,7 +823,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
         * End a transaction
         * Must have a preceding begin()
         */
-       public function commit( $fname = 'DatabaseIbm_db2::commit' ) {
+       protected function doCommit( $fname = 'DatabaseIbm_db2::commit' ) {
                db2_commit( $this->mConn );
 
                // Some MediaWiki code is still transaction-less (?).
@@ -837,7 +837,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
        /**
         * Cancel a transaction
         */
-       public function rollback( $fname = 'DatabaseIbm_db2::rollback' ) {
+       protected function doRollback( $fname = 'DatabaseIbm_db2::rollback' ) {
                db2_rollback( $this->mConn );
                // turn auto-commit back on
                // not sure if this is appropriate
@@ -1341,10 +1341,10 @@ class DatabaseIbm_db2 extends DatabaseBase {
 
                $res2 = parent::select( $table, $vars2, $conds, $fname, $options2,
                        $join_conds );
-               
+
                $obj = $this->fetchObject( $res2 );
                $this->mNumRows = $obj->num_rows;
-               
+
                return new ResultWrapper( $this, new IBM_DB2Result( $this, $res, $obj->num_rows, $vars, $sql ) );
        }
 
@@ -1441,14 +1441,6 @@ class DatabaseIbm_db2 extends DatabaseBase {
        ######################################
        # Unimplemented and not applicable
        ######################################
-       /**
-        * Not implemented
-        * @return string $sql
-        */
-       public function limitResultForUpdate( $sql, $num ) {
-               $this->installPrint( 'Not implemented for DB2: limitResultForUpdate()' );
-               return $sql;
-       }
 
        /**
         * Only useful with fake prepare like in base Database class
@@ -1656,26 +1648,6 @@ SQL;
                return $res;
        }
 
-       /**
-        * Prepare & execute an SQL statement, quoting and inserting arguments
-        * in the appropriate places.
-        * @param $query String
-        * @param $args ...
-        * @return Resource
-        */
-       public function safeQuery( $query, $args = null ) {
-               // copied verbatim from Database.php
-               $prepared = $this->prepare( $query, 'DB2::safeQuery' );
-               if( !is_array( $args ) ) {
-                       # Pull the var args
-                       $args = func_get_args();
-                       array_shift( $args );
-               }
-               $retval = $this->execute( $prepared, $args );
-               $this->freePrepared( $prepared );
-               return $retval;
-       }
-
        /**
         * For faking prepared SQL statements on DBs that don't support
         * it directly.
index 7a75e1e..914ab40 100644 (file)
@@ -620,14 +620,6 @@ class DatabaseMssql extends DatabaseBase {
                return $sql;
        }
 
-       // MSSQL does support this, but documentation is too thin to make a generalized
-       // function for this. Apparently UPDATE TOP (N) works, but the sort order
-       // may not be what we're expecting so the top n results may be a random selection.
-       // TODO: Implement properly.
-       function limitResultForUpdate( $sql, $num ) {
-               return $sql;
-       }
-
        function timestamp( $ts = 0 ) {
                return wfTimestamp( TS_ISO_8601, $ts );
        }
@@ -702,7 +694,7 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * Begin a transaction, committing any previously open transaction
         */
-       function begin( $fname = 'DatabaseMssql::begin' ) {
+       protected function doBegin( $fname = 'DatabaseMssql::begin' ) {
                sqlsrv_begin_transaction( $this->mConn );
                $this->mTrxLevel = 1;
        }
@@ -710,7 +702,7 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * End a transaction
         */
-       function commit( $fname = 'DatabaseMssql::commit' ) {
+       protected function doCommit( $fname = 'DatabaseMssql::commit' ) {
                sqlsrv_commit( $this->mConn );
                $this->mTrxLevel = 0;
        }
@@ -719,7 +711,7 @@ class DatabaseMssql extends DatabaseBase {
         * Rollback a transaction.
         * No-op on non-transactional databases.
         */
-       function rollback( $fname = 'DatabaseMssql::rollback' ) {
+       protected function doRollback( $fname = 'DatabaseMssql::rollback' ) {
                sqlsrv_rollback( $this->mConn );
                $this->mTrxLevel = 0;
        }
index 1d03073..4b34310 100644 (file)
@@ -83,6 +83,14 @@ class DatabaseMysql extends DatabaseBase {
                $this->mPassword = $password;
                $this->mDBname = $dbName;
 
+               $connFlags = 0;
+               if ( $this->mFlags & DBO_SSL ) {
+                       $connFlags |= MYSQL_CLIENT_SSL;
+               }
+               if ( $this->mFlags & DBO_COMPRESS ) {
+                       $connFlags |= MYSQL_CLIENT_COMPRESS;
+               }
+
                wfProfileIn("dbconnect-$server");
 
                # The kernel's default SYN retransmission period is far too slow for us,
@@ -100,10 +108,10 @@ class DatabaseMysql extends DatabaseBase {
                                usleep( 1000 );
                        }
                        if ( $this->mFlags & DBO_PERSISTENT ) {
-                               $this->mConn = mysql_pconnect( $realServer, $user, $password );
+                               $this->mConn = mysql_pconnect( $realServer, $user, $password, $connFlags );
                        } else {
                                # Create a new connection...
-                               $this->mConn = mysql_connect( $realServer, $user, $password, true );
+                               $this->mConn = mysql_connect( $realServer, $user, $password, true, $connFlags );
                        }
                        #if ( $this->mConn === false ) {
                                #$iplus = $i + 1;
@@ -659,13 +667,6 @@ class DatabaseMysql extends DatabaseBase {
                return '[http://www.mysql.com/ MySQL]';
        }
 
-       /**
-        * @return bool
-        */
-       function standardSelectDistinct() {
-               return false;
-       }
-
        /**
         * @param $options array
         */
index 8ce6e70..7d8884f 100644 (file)
@@ -810,7 +810,7 @@ class DatabaseOracle extends DatabaseBase {
        /**
         * Return aggregated value function call
         */
-       function aggregateValue ( $valuedata, $valuename = 'value' ) {
+       public function aggregateValue( $valuedata, $valuename = 'value' ) {
                return $valuedata;
        }
 
@@ -955,12 +955,12 @@ class DatabaseOracle extends DatabaseBase {
                return $this->fieldInfoMulti ($table, $field);
        }
 
-       function begin( $fname = 'DatabaseOracle::begin' ) {
+       protected function doBegin( $fname = 'DatabaseOracle::begin' ) {
                $this->mTrxLevel = 1;
                $this->doQuery( 'SET CONSTRAINTS ALL DEFERRED' );
        }
 
-       function commit( $fname = 'DatabaseOracle::commit' ) {
+       protected function doCommit( $fname = 'DatabaseOracle::commit' ) {
                if ( $this->mTrxLevel ) {
                        $ret = oci_commit( $this->mConn );
                        if ( !$ret ) {
@@ -971,7 +971,7 @@ class DatabaseOracle extends DatabaseBase {
                }
        }
 
-       function rollback( $fname = 'DatabaseOracle::rollback' ) {
+       protected function doRollback( $fname = 'DatabaseOracle::rollback' ) {
                if ( $this->mTrxLevel ) {
                        oci_rollback( $this->mConn );
                        $this->mTrxLevel = 0;
@@ -979,11 +979,6 @@ class DatabaseOracle extends DatabaseBase {
                }
        }
 
-       /* Not even sure why this is used in the main codebase... */
-       function limitResultForUpdate( $sql, $num ) {
-               return $sql;
-       }
-
        /* defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}'; */
        function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
                $fname = 'DatabaseOracle::sourceStream', $inputCallback = false ) {
index f0838bb..457bf38 100644 (file)
@@ -356,6 +356,10 @@ class DatabasePostgres extends DatabaseBase {
                if ( $port != false && $port != '' ) {
                        $connectVars['port'] = $port;
                }
+               if ( $this->mFlags & DBO_SSL ) {
+                       $connectVars['sslmode'] = 1;
+               }
+
                $this->connectString = $this->makeConnectionString( $connectVars, PGSQL_CONNECT_FORCE_NEW );
                $this->close();
                $this->installErrorHandler();
@@ -840,9 +844,22 @@ __INDEXATTR__;
        {
                $destTable = $this->tableName( $destTable );
 
-               if( is_array( $insertOptions ) ) {
-                       $insertOptions = implode( ' ', $insertOptions ); // FIXME: This is unused
+               if( !is_array( $insertOptions ) ) {
+                       $insertOptions = array( $insertOptions );
+               }
+
+               /*
+                * If IGNORE is set, we use savepoints to emulate mysql's behavior
+                * Ignore LOW PRIORITY option, since it is MySQL-specific
+                */
+               $savepoint = null;
+               if ( in_array( 'IGNORE', $insertOptions ) ) {
+                       $savepoint = new SavepointPostgres( $this, 'mw' );
+                       $olde = error_reporting( 0 );
+                       $numrowsinserted = 0;
+                       $savepoint->savepoint();
                }
+
                if( !is_array( $selectOptions ) ) {
                        $selectOptions = array( $selectOptions );
                }
@@ -853,15 +870,6 @@ __INDEXATTR__;
                        $srcTable = $this->tableName( $srcTable );
                }
 
-               // If IGNORE is set, we use savepoints to emulate mysql's behavior
-               $savepoint = null;
-               if ( in_array( 'IGNORE', $options ) ) {
-                       $savepoint = new SavepointPostgres( $this, 'mw' );
-                       $olde = error_reporting( 0 );
-                       $numrowsinserted = 0;
-                       $savepoint->savepoint();
-               }
-
                $sql = "INSERT INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' .
                                " SELECT $startOpts " . implode( ',', $varMap ) .
                                " FROM $srcTable $useIndex";
@@ -1033,7 +1041,7 @@ __INDEXATTR__;
        /**
         * Return aggregated value function call
         */
-       function aggregateValue( $valuedata, $valuename = 'value' ) {
+       public function aggregateValue( $valuedata, $valuename = 'value' ) {
                return $valuedata;
        }
 
@@ -1292,11 +1300,6 @@ SQL;
                return pg_field_type( $res, $index );
        }
 
-       /* Not even sure why this is used in the main codebase... */
-       function limitResultForUpdate( $sql, $num ) {
-               return $sql;
-       }
-
        /**
         * @param $b
         * @return Blob
@@ -1403,9 +1406,6 @@ SQL;
                if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
-               if ( isset( $noKeyOptions['LOCK IN SHARE MODE'] ) ) {
-                       $postLimitTail .= ' LOCK IN SHARE MODE';
-               }
                if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
                        $startOpts .= 'DISTINCT';
                }
index 15d1ad0..f1e553d 100644 (file)
@@ -176,7 +176,7 @@ class DatabaseSqlite extends DatabaseBase {
                }
                $cachedResult = false;
                $table = 'dummy_search_test';
-               
+
                $db = new DatabaseSqliteStandalone( ':memory:' );
 
                if ( $db->query( "CREATE VIRTUAL TABLE $table USING FTS3(dummy_field)", __METHOD__, true ) ) {
@@ -313,7 +313,7 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * @param $res ResultWrapper
-        * @param $n 
+        * @param $n
         * @return bool
         */
        function fieldName( $res, $n ) {
@@ -622,7 +622,7 @@ class DatabaseSqlite extends DatabaseBase {
         * @return string User-friendly database information
         */
        public function getServerInfo() {
-               return wfMsg( self::getFulltextSearchModule() ? 'sqlite-has-fts' : 'sqlite-no-fts', $this->getServerVersion() );
+               return wfMessage( self::getFulltextSearchModule() ? 'sqlite-has-fts' : 'sqlite-no-fts', $this->getServerVersion() )->text();
        }
 
        /**
@@ -645,7 +645,7 @@ class DatabaseSqlite extends DatabaseBase {
                return false;
        }
 
-       function begin( $fname = '' ) {
+       protected function doBegin( $fname = '' ) {
                if ( $this->mTrxLevel == 1 ) {
                        $this->commit( __METHOD__ );
                }
@@ -653,7 +653,7 @@ class DatabaseSqlite extends DatabaseBase {
                $this->mTrxLevel = 1;
        }
 
-       function commit( $fname = '' ) {
+       protected function doCommit( $fname = '' ) {
                if ( $this->mTrxLevel == 0 ) {
                        return;
                }
@@ -661,7 +661,7 @@ class DatabaseSqlite extends DatabaseBase {
                $this->mTrxLevel = 0;
        }
 
-       function rollback( $fname = '' ) {
+       protected function doRollback( $fname = '' ) {
                if ( $this->mTrxLevel == 0 ) {
                        return;
                }
@@ -669,15 +669,6 @@ class DatabaseSqlite extends DatabaseBase {
                $this->mTrxLevel = 0;
        }
 
-       /**
-        * @param  $sql
-        * @param  $num
-        * @return string
-        */
-       function limitResultForUpdate( $sql, $num ) {
-               return $this->limitResult( $sql, $num );
-       }
-
        /**
         * @param $s string
         * @return string
@@ -827,8 +818,8 @@ class DatabaseSqlite extends DatabaseBase {
                }
                return $this->query( $sql, $fname );
        }
-       
-       
+
+
        /**
         * List all tables on the database
         *
@@ -843,21 +834,21 @@ class DatabaseSqlite extends DatabaseBase {
                        'name',
                        "type='table'"
                );
-               
+
                $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 ( strpos( $table, 'sqlite_' ) !== 0 ) {
                                        $endArray[] = $table;
                                }
-                               
+
                        }
                }
-               
+
                return $endArray;
        }
 
index eacebcf..c846788 100644 (file)
@@ -242,7 +242,11 @@ class FakeResultWrapper extends ResultWrapper {
                        $this->currentRow = false;
                }
                $this->pos++;
-               return $this->currentRow;
+               if ( is_object( $this->currentRow ) ) {
+                       return get_object_vars( $this->currentRow );
+               } else {
+                       return $this->currentRow;
+               }
        }
 
        function seek( $row ) {
index a530620..e99ba6c 100644 (file)
@@ -5,6 +5,8 @@
  * aims to be both simple and very flexible. It is centered around an associative
  * array of fields and various methods to do common interaction with the database.
  *
+ * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 8fa7220..99413f9 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 /**
  * Interface for objects representing a single database table.
+ * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -410,7 +411,7 @@ interface IORMTable {
         *
         * @return IORMRow
         */
-       public function newFromDBResult( stdClass $result );
+       public function newRowFromDBResult( stdClass $result );
 
        /**
         * Get a new instance of the class from an array.
@@ -422,7 +423,7 @@ interface IORMTable {
         *
         * @return IORMRow
         */
-       public function newFromArray( array $data, $loadDefaults = false );
+       public function newRow( array $data, $loadDefaults = false );
 
        /**
         * Return the names of the fields.
index aaca12c..e82c54b 100644 (file)
@@ -191,6 +191,16 @@ class LBFactory_Simple extends LBFactory {
                        $servers = $wgDBservers;
                } else {
                        global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgDebugDumpSql;
+                       global $wgDBssl, $wgDBcompress;
+
+                       $flags = ( $wgDebugDumpSql ? DBO_DEBUG : 0 ) | DBO_DEFAULT;
+                       if ( $wgDBssl ) {
+                               $flags |= DBO_SSL;
+                       }
+                       if ( $wgDBcompress ) {
+                               $flags |= DBO_COMPRESS;
+                       }
+
                        $servers = array(array(
                                'host' => $wgDBserver,
                                'user' => $wgDBuser,
@@ -198,7 +208,7 @@ class LBFactory_Simple extends LBFactory {
                                'dbname' => $wgDBname,
                                'type' => $wgDBtype,
                                'load' => 1,
-                               'flags' => ($wgDebugDumpSql ? DBO_DEBUG : 0) | DBO_DEFAULT
+                               'flags' => $flags
                        ));
                }
 
index f0a6363..090b893 100644 (file)
  */
 interface ORMIterator extends Iterator {
 
-       /**
-        * @see Iterator::current()
-        * @return IORMRow
-        */
-       public function current();
-
 }
\ No newline at end of file
index 1342b02..2a5837a 100644 (file)
@@ -3,6 +3,8 @@
  * ORMIterator that takes a ResultWrapper object returned from
  * a select operation returning IORMRow objects (ie IORMTable::select).
  *
+ * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -67,7 +69,7 @@ class ORMResult implements ORMIterator {
                if ( $row === false ) {
                        $this->current = false;
                } else {
-                       $this->current = $this->table->newFromDBResult( $row );
+                       $this->current = $this->table->newRowFromDBResult( $row );
                }
        }
 
index 6f19fe1..303f3a2 100644 (file)
@@ -5,6 +5,8 @@
  * aims to be both simple and very flexible. It is centered around an associative
  * array of fields and various methods to do common interaction with the database.
  *
+ * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index b6e2d52..a77074f 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 /**
  * Abstract base class for representing a single database table.
+ * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -117,7 +118,7 @@ abstract class ORMTable implements IORMTable {
                $objects = array();
 
                foreach ( $result as $record ) {
-                       $objects[] = $this->newFromArray( $record );
+                       $objects[] = $this->newRow( $record );
                }
 
                return $objects;
@@ -307,7 +308,7 @@ abstract class ORMTable implements IORMTable {
         */
        public function count( array $conditions = array(), array $options = array() ) {
                $res = $this->rawSelectRow(
-                       array( 'COUNT(*) AS rowcount' ),
+                       array( 'rowcount' => 'COUNT(*)' ),
                        $this->getPrefixedValues( $conditions ),
                        $options
                );
@@ -328,7 +329,7 @@ abstract class ORMTable implements IORMTable {
        public function delete( array $conditions, $functionName = null ) {
                return wfGetDB( DB_MASTER )->delete(
                        $this->getName(),
-                       $this->getPrefixedValues( $conditions ),
+                       $conditions === array() ? '*' : $this->getPrefixedValues( $conditions ),
                        $functionName
                ) !== false; // DatabaseBase::delete does not always return true for success as documented...
        }
@@ -451,7 +452,10 @@ abstract class ORMTable implements IORMTable {
        public function updateSummaryFields( $summaryFields = null, array $conditions = array() ) {
                $this->setReadDb( DB_MASTER );
 
-               foreach ( $this->select( null, $conditions ) as /* IORMRow */ $item ) {
+               /**
+                * @var IORMRow $item
+                */
+               foreach ( $this->select( null, $conditions ) as $item ) {
                        $item->loadSummaryFields( $summaryFields );
                        $item->setSummaryMode( true );
                        $item->save();
@@ -559,7 +563,7 @@ abstract class ORMTable implements IORMTable {
         * @return IORMTable
         */
        public static function singleton() {
-               $class = function_exists( 'get_called_class' ) ? get_called_class() : self::get_called_class();
+               $class = get_called_class();
 
                if ( !array_key_exists( $class, self::$instanceCache ) ) {
                        self::$instanceCache[$class] = new $class;
@@ -568,36 +572,6 @@ abstract class ORMTable implements IORMTable {
                return self::$instanceCache[$class];
        }
 
-       /**
-        * Compatibility fallback function so the singleton method works on PHP < 5.3.
-        * Code borrowed from http://www.php.net/manual/en/function.get-called-class.php#107445
-        *
-        * @since 1.20
-        *
-        * @return string
-        */
-       protected static function get_called_class() {
-               $bt = debug_backtrace();
-               $l = count($bt) - 1;
-               $matches = array();
-               while(empty($matches) && $l > -1){
-                       $lines = file($bt[$l]['file']);
-                       $callerLine = $lines[$bt[$l]['line']-1];
-                       preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l--]['function'].'/',
-                               $callerLine,
-                               $matches);
-               }
-               if (!isset($matches[1])) $matches[1]=NULL; //for notices
-               if ($matches[1] == 'self') {
-                       $line = $bt[$l]['line']-1;
-                       while ($line > 0 && strpos($lines[$line], 'class') === false) {
-                               $line--;
-                       }
-                       preg_match('/class[\s]+(.+?)[\s]+/si', $lines[$line], $matches);
-               }
-               return $matches[1];
-       }
-
        /**
         * Get an array with fields from a database result,
         * that can be fed directly to the constructor or
@@ -618,8 +592,9 @@ abstract class ORMTable implements IORMTable {
        }
 
        /**
-        * Get a new instance of the class from a database result.
+        * @see ORMTable::newRowFromFromDBResult
         *
+        * @deprecated use newRowFromDBResult instead
         * @since 1.20
         *
         * @param stdClass $result
@@ -627,20 +602,48 @@ abstract class ORMTable implements IORMTable {
         * @return IORMRow
         */
        public function newFromDBResult( stdClass $result ) {
-               return $this->newFromArray( $this->getFieldsFromDBResult( $result ) );
+               return self::newRowFromDBResult( $result );
        }
 
        /**
-        * Get a new instance of the class from an array.
+        * Get a new instance of the class from a database result.
         *
         * @since 1.20
         *
+        * @param stdClass $result
+        *
+        * @return IORMRow
+        */
+       public function newRowFromDBResult( stdClass $result ) {
+               return $this->newRow( $this->getFieldsFromDBResult( $result ) );
+       }
+
+       /**
+        * @see ORMTable::newRow
+        *
+        * @deprecated use newRow instead
+        * @since 1.20
+        *
         * @param array $data
         * @param boolean $loadDefaults
         *
         * @return IORMRow
         */
        public function newFromArray( array $data, $loadDefaults = false ) {
+               return static::newRow( $data, $loadDefaults );
+       }
+
+       /**
+        * Get a new instance of the class from an array.
+        *
+        * @since 1.20
+        *
+        * @param array $data
+        * @param boolean $loadDefaults
+        *
+        * @return IORMRow
+        */
+       public function newRow( array $data, $loadDefaults = false ) {
                $class = $this->getRowClass();
                return new $class( $this, $data, $loadDefaults );
        }
index 0c0052f..d02bcf5 100644 (file)
@@ -133,70 +133,156 @@ class MWDebug {
         * Adds a warning entry to the log
         *
         * @since 1.19
-        * @param $msg
-        * @param int $callerOffset
+        * @param $msg string
+        * @param $callerOffset int
         * @return mixed
         */
-       public static function warning( $msg, $callerOffset = 1 ) {
-               if ( !self::$enabled ) {
-                       return;
-               }
+       public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
+               $callerDescription = self::getCallerDescription( $callerOffset );
 
-               // Check to see if there was already a deprecation notice, so not to
-               // get a duplicate warning
-               $logCount = count( self::$log );
-               $caller = wfGetCaller( $callerOffset + 1 );
-               if ( $logCount ) {
-                       $lastLog = self::$log[ $logCount - 1 ];
-                       if ( $lastLog['type'] == 'deprecated' && $lastLog['caller'] == $caller ) {
-                               return;
-                       }
-               }
+               self::sendWarning( $msg, $callerDescription, $level );
 
-               self::$log[] = array(
-                       'msg' => htmlspecialchars( $msg ),
-                       'type' => 'warn',
-                       'caller' => $caller,
-               );
+               if ( self::$enabled ) {
+                       self::$log[] = array(
+                               'msg' => htmlspecialchars( $msg ),
+                               'type' => 'warn',
+                               'caller' => $callerDescription['func'],
+                       );
+               }
        }
 
        /**
-        * Adds a depreciation entry to the log, along with a backtrace
+        * Show a warning that $function is deprecated.
+        * This will send it to the following locations:
+        * - Debug toolbar, with one item per function and caller, if $wgDebugToolbar
+        *   is set to true.
+        * - PHP's error log, with level E_USER_DEPRECATED, if $wgDevelopmentWarnings
+        *   is set to true.
+        * - MediaWiki's debug log, if $wgDevelopmentWarnings is set to false.
         *
         * @since 1.19
-        * @param $function
-        * @param $version
-        * @param $component
+        * @param $function string: Function that is deprecated.
+        * @param $version string|bool: Version in which the function was deprecated.
+        * @param $component string|bool: Component to which the function belongs.
+        *     If false, it is assumbed the function is in MediaWiki core.
+        * @param $callerOffset integer: How far up the callstack is the original
+        *    caller. 2 = function that called the function that called
+        *    MWDebug::deprecated() (Added in 1.20).
         * @return mixed
         */
-       public static function deprecated( $function, $version, $component ) {
-               if ( !self::$enabled ) {
-                       return;
-               }
+       public static function deprecated( $function, $version = false, $component = false, $callerOffset = 2 ) {
+               $callerDescription = self::getCallerDescription( $callerOffset );
+               $callerFunc = $callerDescription['func'];
 
-               // Chain: This function -> wfDeprecated -> deprecatedFunction -> caller
-               $caller = wfGetCaller( 4 );
+               $sendToLog = true;
 
                // Check to see if there already was a warning about this function
-               $functionString = "$function-$caller";
-               if ( in_array( $functionString, self::$deprecationWarnings ) ) {
+               if ( isset( self::$deprecationWarnings[$function][$callerFunc] ) ) {
                        return;
+               } elseif ( isset( self::$deprecationWarnings[$function] ) ) {
+                       if ( self::$enabled ) {
+                               $sendToLog = false;
+                       } else {
+                               return;
+                       }
                }
 
-               $version = $version === false ? '(unknown version)' : $version;
-               $component = $component === false ? 'MediaWiki' : $component;
-               $msg = htmlspecialchars( "Use of function $function was deprecated in $component $version" );
-               $msg .= Html::rawElement( 'div', array( 'class' => 'mw-debug-backtrace' ),
-                       Html::element( 'span', array(), 'Backtrace:' )
-                        . wfBacktrace()
-               );
+               self::$deprecationWarnings[$function][$callerFunc] = true;
+
+               if ( $version ) {
+                       global $wgDeprecationReleaseLimit;
+                       if ( $wgDeprecationReleaseLimit && $component === false ) {
+                               # Strip -* off the end of $version so that branches can use the
+                               # format #.##-branchname to avoid issues if the branch is merged into
+                               # a version of MediaWiki later than what it was branched from
+                               $comparableVersion = preg_replace( '/-.*$/', '', $version );
+
+                               # If the comparableVersion is larger than our release limit then
+                               # skip the warning message for the deprecation
+                               if ( version_compare( $wgDeprecationReleaseLimit, $comparableVersion, '<' ) ) {
+                                       $sendToLog = false;
+                               }
+                       }
 
-               self::$deprecationWarnings[] = $functionString;
-               self::$log[] = array(
-                       'msg' => $msg,
-                       'type' => 'deprecated',
-                       'caller' => $caller,
-               );
+                       $component = $component === false ? 'MediaWiki' : $component;
+                       $msg = "Use of $function was deprecated in $component $version.";
+               } else {
+                       $msg = "Use of $function is deprecated.";
+               }
+
+               if ( $sendToLog ) {
+                       self::sendWarning( $msg, $callerDescription, E_USER_DEPRECATED );
+               }
+
+               if ( self::$enabled ) {
+                       $logMsg = htmlspecialchars( $msg ) .
+                               Html::rawElement( 'div', array( 'class' => 'mw-debug-backtrace' ),
+                                       Html::element( 'span', array(), 'Backtrace:' ) . wfBacktrace()
+                               );
+
+                       self::$log[] = array(
+                               'msg' => $logMsg,
+                               'type' => 'deprecated',
+                               'caller' => $callerFunc,
+                       );
+               }
+       }
+
+       /**
+        * Get an array describing the calling function at a specified offset.
+        *
+        * @param $callerOffset integer: How far up the callstack is the original
+        *    caller. 0 = function that called getCallerDescription()
+        * @return array with two keys: 'file' and 'func'
+        */
+       private static function getCallerDescription( $callerOffset ) {
+               $callers = wfDebugBacktrace();
+
+               if ( isset( $callers[$callerOffset] ) ) {
+                       $callerfile = $callers[$callerOffset];
+                       if ( isset( $callerfile['file'] ) && isset( $callerfile['line'] ) ) {
+                               $file = $callerfile['file'] . ' at line ' . $callerfile['line'];
+                       } else {
+                               $file = '(internal function)';
+                       }
+               } else {
+                       $file = '(unknown location)';
+               }
+
+               if ( isset( $callers[$callerOffset + 1] ) ) {
+                       $callerfunc = $callers[$callerOffset + 1];
+                       $func = '';
+                       if ( isset( $callerfunc['class'] ) ) {
+                               $func .= $callerfunc['class'] . '::';
+                       }
+                       if ( isset( $callerfunc['function'] ) ) {
+                               $func .= $callerfunc['function'];
+                       }
+               } else {
+                       $func = 'unknown';
+               }
+
+               return array( 'file' => $file, 'func' => $func );
+       }
+
+       /**
+        * Send a warning either to the debug log or by triggering an user PHP
+        * error depending on $wgDevelopmentWarnings.
+        *
+        * @param $msg string Message to send
+        * @param $caller array caller description get from getCallerDescription()
+        * @param $level error level to use if $wgDevelopmentWarnings is true
+        */
+       private static function sendWarning( $msg, $caller, $level ) {
+               global $wgDevelopmentWarnings;
+
+               $msg .= ' [Called from ' . $caller['func'] . ' in ' . $caller['file'] . ']';
+
+               if ( $wgDevelopmentWarnings ) {
+                       trigger_error( $msg, $level );
+               } else {
+                       wfDebug( "$msg\n" );
+               }
        }
 
        /**
@@ -207,11 +293,11 @@ class MWDebug {
         * @param $str string
         */
        public static function debugMsg( $str ) {
-               if ( !self::$enabled ) {
-                       return;
-               }
+               global $wgDebugComments, $wgShowDebug;
 
-               self::$debug[] = trim( $str );
+               if ( self::$enabled || $wgDebugComments || $wgShowDebug ) {
+                       self::$debug[] = rtrim( $str );
+               }
        }
 
        /**
@@ -283,22 +369,91 @@ class MWDebug {
         * @return string
         */
        public static function getDebugHTML( IContextSource $context ) {
-               if ( !self::$enabled ) {
+               global $wgDebugComments;
+
+               $html = '';
+
+               if ( self::$enabled ) {
+                       MWDebug::log( 'MWDebug output complete' );
+                       $debugInfo = self::getDebugInfo( $context );
+
+                       // Cannot use OutputPage::addJsConfigVars because those are already outputted
+                       // by the time this method is called.
+                       $html = Html::inlineScript(
+                               ResourceLoader::makeLoaderConditionalScript(
+                                       ResourceLoader::makeConfigSetScript( array( 'debugInfo' => $debugInfo ) )
+                               )
+                       );
+               }
+
+               if ( $wgDebugComments ) {
+                       $html .= "<!-- Debug output:\n" .
+                               htmlspecialchars( implode( "\n", self::$debug ) ) .
+                               "\n\n-->";
+               }
+
+               return $html;
+       }
+
+       /**
+        * Generate debug log in HTML for displaying at the bottom of the main
+        * content area.
+        * If $wgShowDebug is false, an empty string is always returned.
+        *
+        * @since 1.20
+        * @return string HTML fragment
+        */
+       public static function getHTMLDebugLog() {
+               global $wgDebugTimestamps, $wgShowDebug;
+
+               if ( !$wgShowDebug ) {
                        return '';
                }
 
-               MWDebug::log( 'MWDebug output complete' );
-               $debugInfo = self::getDebugInfo( $context );
+               $curIdent = 0;
+               $ret = "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">\n<li>";
+
+               foreach ( self::$debug as $line ) {
+                       $pre = '';
+                       if ( $wgDebugTimestamps ) {
+                               $matches = array();
+                               if ( preg_match( '/^(\d+\.\d+ {1,3}\d+.\dM\s{2})/', $line, $matches ) ) {
+                                       $pre = $matches[1];
+                                       $line = substr( $line, strlen( $pre ) );
+                               }
+                       }
+                       $display = ltrim( $line );
+                       $ident = strlen( $line ) - strlen( $display );
+                       $diff = $ident - $curIdent;
 
-               // Cannot use OutputPage::addJsConfigVars because those are already outputted
-               // by the time this method is called.
-               $html = Html::inlineScript(
-                       ResourceLoader::makeLoaderConditionalScript(
-                               ResourceLoader::makeConfigSetScript( array( 'debugInfo' => $debugInfo ) )
-                       )
-               );
+                       $display = $pre . $display;
+                       if ( $display == '' ) {
+                               $display = "\xc2\xa0";
+                       }
 
-               return $html;
+                       if ( !$ident && $diff < 0 && substr( $display, 0, 9 ) != 'Entering ' && substr( $display, 0, 8 ) != 'Exiting ' ) {
+                               $ident = $curIdent;
+                               $diff = 0;
+                               $display = '<span style="background:yellow;">' . nl2br( htmlspecialchars( $display ) ) . '</span>';
+                       } else {
+                               $display = nl2br( htmlspecialchars( $display ) );
+                       }
+
+                       if ( $diff < 0 ) {
+                               $ret .= str_repeat( "</li></ul>\n", -$diff ) . "</li><li>\n";
+                       } elseif ( $diff == 0 ) {
+                               $ret .= "</li><li>\n";
+                       } else {
+                               $ret .= str_repeat( "<ul><li>\n", $diff );
+                       }
+                       $ret .= "<tt>$display</tt>\n";
+
+                       $curIdent = $ident;
+               }
+
+               $ret .= str_repeat( '</li></ul>', $curIdent ) . "</li>\n</ul>\n";
+
+               return $ret;
        }
 
        /**
@@ -312,6 +467,18 @@ class MWDebug {
                        return;
                }
 
+               // 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 ) {
+                       $obContentArray = explode( '<br />', $obContents );
+                       foreach( $obContentArray as $obContent ) {
+                               if( trim( $obContent ) ) {
+                                       self::debugMsg( Sanitizer::stripAllTags( $obContent ) );
+                               }
+                       }
+               }
+
                MWDebug::log( 'MWDebug output complete' );
                $debugInfo = self::getDebugInfo( $context );
 
@@ -352,7 +519,7 @@ class MWDebug {
                        'debugLog' => self::$debug,
                        'queries' => self::$query,
                        'request' => array(
-                               'method' => $_SERVER['REQUEST_METHOD'],
+                               'method' => $request->getMethod(),
                                'url' => $request->getRequestURL(),
                                'headers' => $request->getAllHeaders(),
                                'params' => $request->getValues(),
index e624ec2..3846473 100644 (file)
@@ -179,6 +179,22 @@ class DifferenceEngine extends ContextSource {
                }
        }
 
+       private function showMissingRevision() {
+               $out = $this->getOutput();
+
+               $missing = array();
+               if ( $this->mOldRev === null ) {
+                       $missing[] = $this->deletedIdMarker( $this->mOldid );
+               }
+               if ( $this->mNewRev === null ) {
+                       $missing[] = $this->deletedIdMarker( $this->mNewid );
+               }
+
+               $out->setPageTitle( $this->msg( 'errorpagetitle' ) );
+               $out->addWikiMsg( 'difference-missing-revision',
+                       $this->getLanguage()->listToText( $missing ), count( $missing ) );
+       }
+
        function showDiffPage( $diffOnly = false ) {
                wfProfileIn( __METHOD__ );
 
@@ -188,13 +204,7 @@ class DifferenceEngine extends ContextSource {
                $out->setRobotPolicy( 'noindex,nofollow' );
 
                if ( !$this->loadRevisionData() ) {
-                       // Sounds like a deleted revision... Let's see what we can do.
-                       $t = $this->getTitle()->getPrefixedText();
-                       $d = $this->msg( 'missingarticle-diff',
-                               $this->deletedIdMarker( $this->mOldid ),
-                               $this->deletedIdMarker( $this->mNewid ) )->escaped();
-                       $out->setPageTitle( $this->msg( 'errorpagetitle' ) );
-                       $out->addWikiMsg( 'missing-article', "<nowiki>$t</nowiki>", "<span class='plainlinks'>$d</span>" );
+                       $this->showMissingRevision();
                        wfProfileOut( __METHOD__ );
                        return;
                }
@@ -278,7 +288,7 @@ class DifferenceEngine extends ContextSource {
                        if ( $samePage && $this->mNewPage->quickUserCan( 'edit', $user ) ) {
                                if ( $this->mNewRev->isCurrent() && $this->mNewPage->userCan( 'rollback', $user ) ) {
                                        $out->preventClickjacking();
-                                       $rollback = '&#160;&#160;&#160;' . Linker::generateRollback( $this->mNewRev );
+                                       $rollback = '&#160;&#160;&#160;' . Linker::generateRollback( $this->mNewRev, $this->getContext() );
                                }
                                if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
                                        $undoLink = ' ' . $this->msg( 'parentheses' )->rawParams(
@@ -557,7 +567,7 @@ class DifferenceEngine extends ContextSource {
        function showDiff( $otitle, $ntitle, $notice = '' ) {
                $diff = $this->getDiff( $otitle, $ntitle, $notice );
                if ( $diff === false ) {
-                       $this->getOutput()->addWikiMsg( 'missing-article', "<nowiki>(fixme, bug)</nowiki>", '' );
+                       $this->showMissingRevision();
                        return false;
                } else {
                        $this->showDiffStyle();
@@ -612,7 +622,7 @@ class DifferenceEngine extends ContextSource {
                        return false;
                }
                // Short-circuit
-               // If mOldRev is false, it means that the 
+               // If mOldRev is false, it means that the
                if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev
                        && $this->mOldRev->getID() == $this->mNewRev->getID() ) )
                {
@@ -882,7 +892,8 @@ class DifferenceEngine extends ContextSource {
                        }
 
                        $msg = $this->msg( $title->quickUserCan( 'edit', $user ) ? 'editold' : 'viewsourceold' )->escaped();
-                       $header .= ' (' . Linker::linkKnown( $title, $msg, array(), $editQuery ) . ')';
+                       $header .= ' ' . $this->msg( 'parentheses' )->rawParams(
+                               Linker::linkKnown( $title, $msg, array(), $editQuery ) )->plain();
                        if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
                                $header = Html::rawElement( 'span', array( 'class' => 'history-deleted' ), $header );
                        }
@@ -906,7 +917,7 @@ class DifferenceEngine extends ContextSource {
 
                if ( !$diff && !$otitle ) {
                        $header .= "
-                       <tr valign='top'>
+                       <tr style='vertical-align: top;'>
                        <td class='diff-ntitle'>{$ntitle}</td>
                        </tr>";
                        $multiColspan = 1;
@@ -924,17 +935,17 @@ class DifferenceEngine extends ContextSource {
                                $multiColspan = 2;
                        }
                        $header .= "
-                       <tr valign='top'>
+                       <tr style='vertical-align: top;'>
                        <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
                        <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
                        </tr>";
                }
 
                if ( $multi != '' ) {
-                       $header .= "<tr><td colspan='{$multiColspan}' align='center' class='diff-multi'>{$multi}</td></tr>";
+                       $header .= "<tr><td colspan='{$multiColspan}' style='text-align: center;' class='diff-multi'>{$multi}</td></tr>";
                }
                if ( $notice != '' ) {
-                       $header .= "<tr><td colspan='{$multiColspan}' align='center'>{$notice}</td></tr>";
+                       $header .= "<tr><td colspan='{$multiColspan}' style='text-align: center;'>{$notice}</td></tr>";
                }
 
                return $header . $diff . "</table>";
@@ -1019,7 +1030,7 @@ class DifferenceEngine extends ContextSource {
                // Load the new revision object
                $this->mNewRev = $this->mNewid
                        ? Revision::newFromId( $this->mNewid )
-                       : Revision::newFromTitle( $this->getTitle() );
+                       : Revision::newFromTitle( $this->getTitle(), false, Revision::READ_NORMAL );
 
                if ( !$this->mNewRev instanceof Revision ) {
                        return false;
diff --git a/includes/filebackend/FSFile.php b/includes/filebackend/FSFile.php
new file mode 100644 (file)
index 0000000..e07c99d
--- /dev/null
@@ -0,0 +1,252 @@
+<?php
+/**
+ * Non-directory file on the file system.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ */
+
+/**
+ * Class representing a non-directory file on the file system
+ *
+ * @ingroup FileBackend
+ */
+class FSFile {
+       protected $path; // path to file
+
+       /**
+        * Sets up the file object
+        *
+        * @param $path string Path to temporary file on local disk
+        * @throws MWException
+        */
+       public function __construct( $path ) {
+               if ( FileBackend::isStoragePath( $path ) ) {
+                       throw new MWException( __METHOD__ . " given storage path `$path`." );
+               }
+               $this->path = $path;
+       }
+
+       /**
+        * Returns the file system path
+        *
+        * @return String
+        */
+       public function getPath() {
+               return $this->path;
+       }
+
+       /**
+        * Checks if the file exists
+        *
+        * @return bool
+        */
+       public function exists() {
+               return is_file( $this->path );
+       }
+
+       /**
+        * Get the file size in bytes
+        *
+        * @return int|bool
+        */
+       public function getSize() {
+               return filesize( $this->path );
+       }
+
+       /**
+        * Get the file's last-modified timestamp
+        *
+        * @return string|bool TS_MW timestamp or false on failure
+        */
+       public function getTimestamp() {
+               wfSuppressWarnings();
+               $timestamp = filemtime( $this->path );
+               wfRestoreWarnings();
+               if ( $timestamp !== false ) {
+                       $timestamp = wfTimestamp( TS_MW, $timestamp );
+               }
+               return $timestamp;
+       }
+
+       /**
+        * Guess the MIME type from the file contents alone
+        * 
+        * @return string 
+        */
+       public function getMimeType() {
+               return MimeMagic::singleton()->guessMimeType( $this->path, false );
+       }
+
+       /**
+        * Get an associative array containing information about
+        * a file with the given storage path.
+        *
+        * @param $ext Mixed: the file extension, or true to extract it from the filename.
+        *             Set it to false to ignore the extension.
+        *
+        * @return array
+        */
+       public function getProps( $ext = true ) {
+               wfProfileIn( __METHOD__ );
+               wfDebug( __METHOD__.": Getting file info for $this->path\n" );
+
+               $info = self::placeholderProps();
+               $info['fileExists'] = $this->exists();
+
+               if ( $info['fileExists'] ) {
+                       $magic = MimeMagic::singleton();
+
+                       # get the file extension
+                       if ( $ext === true ) {
+                               $ext = self::extensionFromPath( $this->path );
+                       }
+
+                       # mime type according to file contents
+                       $info['file-mime'] = $this->getMimeType();
+                       # logical mime type
+                       $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext );
+
+                       list( $info['major_mime'], $info['minor_mime'] ) = File::splitMime( $info['mime'] );
+                       $info['media_type'] = $magic->getMediaType( $this->path, $info['mime'] );
+
+                       # Get size in bytes
+                       $info['size'] = $this->getSize();
+
+                       # Height, width and metadata
+                       $handler = MediaHandler::getHandler( $info['mime'] );
+                       if ( $handler ) {
+                               $tempImage = (object)array();
+                               $info['metadata'] = $handler->getMetadata( $tempImage, $this->path );
+                               $gis = $handler->getImageSize( $tempImage, $this->path, $info['metadata'] );
+                               if ( is_array( $gis ) ) {
+                                       $info = $this->extractImageSizeInfo( $gis ) + $info;
+                               }
+                       }
+                       $info['sha1'] = $this->getSha1Base36();
+
+                       wfDebug(__METHOD__.": $this->path loaded, {$info['size']} bytes, {$info['mime']}.\n");
+               } else {
+                       wfDebug(__METHOD__.": $this->path NOT FOUND!\n");
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $info;
+       }
+
+       /**
+        * Placeholder file properties to use for files that don't exist
+        *
+        * @return Array
+        */
+       public static function placeholderProps() {
+               $info = array();
+               $info['fileExists'] = false;
+               $info['mime'] = null;
+               $info['media_type'] = MEDIATYPE_UNKNOWN;
+               $info['metadata'] = '';
+               $info['sha1'] = '';
+               $info['width'] = 0;
+               $info['height'] = 0;
+               $info['bits'] = 0;
+               return $info;
+       }
+
+       /**
+        * Exract image size information
+        *
+        * @param $gis array
+        * @return Array
+        */
+       protected function extractImageSizeInfo( array $gis ) {
+               $info = array();
+               # NOTE: $gis[2] contains a code for the image type. This is no longer used.
+               $info['width'] = $gis[0];
+               $info['height'] = $gis[1];
+               if ( isset( $gis['bits'] ) ) {
+                       $info['bits'] = $gis['bits'];
+               } else {
+                       $info['bits'] = 0;
+               }
+               return $info;
+       }
+
+       /**
+        * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case
+        * encoding, zero padded to 31 digits.
+        *
+        * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
+        * fairly neatly.
+        *
+        * @return bool|string False on failure
+        */
+       public function getSha1Base36() {
+               wfProfileIn( __METHOD__ );
+
+               wfSuppressWarnings();
+               $hash = sha1_file( $this->path );
+               wfRestoreWarnings();
+               if ( $hash !== false ) {
+                       $hash = wfBaseConvert( $hash, 16, 36, 31 );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $hash;
+       }
+
+       /**
+        * Get the final file extension from a file system path
+        * 
+        * @param $path string
+        * @return string
+        */
+       public static function extensionFromPath( $path ) {
+               $i = strrpos( $path, '.' );
+               return strtolower( $i ? substr( $path, $i + 1 ) : '' );
+       }
+
+       /**
+        * Get an associative array containing information about a file in the local filesystem.
+        *
+        * @param $path String: absolute local filesystem path
+        * @param $ext Mixed: the file extension, or true to extract it from the filename.
+        *             Set it to false to ignore the extension.
+        *
+        * @return array
+        */
+       public static function getPropsFromPath( $path, $ext = true ) {
+               $fsFile = new self( $path );
+               return $fsFile->getProps( $ext );
+       }
+
+       /**
+        * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case
+        * encoding, zero padded to 31 digits.
+        *
+        * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
+        * fairly neatly.
+        *
+        * @param $path string
+        *
+        * @return bool|string False on failure
+        */
+       public static function getSha1Base36FromPath( $path ) {
+               $fsFile = new self( $path );
+               return $fsFile->getSha1Base36();
+       }
+}
diff --git a/includes/filebackend/FSFileBackend.php b/includes/filebackend/FSFileBackend.php
new file mode 100644 (file)
index 0000000..9349534
--- /dev/null
@@ -0,0 +1,986 @@
+<?php
+/**
+ * File system based backend.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * @brief Class for a file system (FS) based file backend.
+ *
+ * All "containers" each map to a directory under the backend's base directory.
+ * For backwards-compatibility, some container paths can be set to custom paths.
+ * The wiki ID will not be used in any custom paths, so this should be avoided.
+ *
+ * Having directories with thousands of files will diminish performance.
+ * Sharding can be accomplished by using FileRepo-style hash paths.
+ *
+ * Status messages should avoid mentioning the internal FS paths.
+ * PHP warnings are assumed to be logged rather than output.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+class FSFileBackend extends FileBackendStore {
+       protected $basePath; // string; directory holding the container directories
+       /** @var Array Map of container names to root paths */
+       protected $containerPaths = array(); // for custom container paths
+       protected $fileMode; // integer; file permission mode
+       protected $fileOwner; // string; required OS username to own files
+       protected $currentUser; // string; OS username running this script
+
+       protected $hadWarningErrors = array();
+
+       /**
+        * @see FileBackendStore::__construct()
+        * Additional $config params include:
+        *   - basePath       : File system directory that holds containers.
+        *   - containerPaths : Map of container names to custom file system directories.
+        *                      This should only be used for backwards-compatibility.
+        *   - fileMode       : Octal UNIX file permissions to use on files stored.
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+
+               // Remove any possible trailing slash from directories
+               if ( isset( $config['basePath'] ) ) {
+                       $this->basePath = rtrim( $config['basePath'], '/' ); // remove trailing slash
+               } else {
+                       $this->basePath = null; // none; containers must have explicit paths
+               }
+
+               if ( isset( $config['containerPaths'] ) ) {
+                       $this->containerPaths = (array)$config['containerPaths'];
+                       foreach ( $this->containerPaths as &$path ) {
+                               $path = rtrim( $path, '/' );  // remove trailing slash
+                       }
+               }
+
+               $this->fileMode = isset( $config['fileMode'] ) ? $config['fileMode'] : 0644;
+               if ( isset( $config['fileOwner'] ) && function_exists( 'posix_getuid' ) ) {
+                       $this->fileOwner = $config['fileOwner'];
+                       $info = posix_getpwuid( posix_getuid() );
+                       $this->currentUser = $info['name']; // cache this, assuming it doesn't change
+               }
+       }
+
+       /**
+        * @see FileBackendStore::resolveContainerPath()
+        * @param $container string
+        * @param $relStoragePath string
+        * @return null|string
+        */
+       protected function resolveContainerPath( $container, $relStoragePath ) {
+               // Check that container has a root directory
+               if ( isset( $this->containerPaths[$container] ) || isset( $this->basePath ) ) {
+                       // Check for sane relative paths (assume the base paths are OK)
+                       if ( $this->isLegalRelPath( $relStoragePath ) ) {
+                               return $relStoragePath;
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * Sanity check a relative file system path for validity
+        *
+        * @param $path string Normalized relative path
+        * @return bool
+        */
+       protected function isLegalRelPath( $path ) {
+               // Check for file names longer than 255 chars
+               if ( preg_match( '![^/]{256}!', $path ) ) { // ext3/NTFS
+                       return false;
+               }
+               if ( wfIsWindows() ) { // NTFS
+                       return !preg_match( '![:*?"<>|]!', $path );
+               } else {
+                       return true;
+               }
+       }
+
+       /**
+        * Given the short (unresolved) and full (resolved) name of
+        * a container, return the file system path of the container.
+        *
+        * @param $shortCont string
+        * @param $fullCont string
+        * @return string|null
+        */
+       protected function containerFSRoot( $shortCont, $fullCont ) {
+               if ( isset( $this->containerPaths[$shortCont] ) ) {
+                       return $this->containerPaths[$shortCont];
+               } elseif ( isset( $this->basePath ) ) {
+                       return "{$this->basePath}/{$fullCont}";
+               }
+               return null; // no container base path defined
+       }
+
+       /**
+        * Get the absolute file system path for a storage path
+        *
+        * @param $storagePath string Storage path
+        * @return string|null
+        */
+       protected function resolveToFSPath( $storagePath ) {
+               list( $fullCont, $relPath ) = $this->resolveStoragePathReal( $storagePath );
+               if ( $relPath === null ) {
+                       return null; // invalid
+               }
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $storagePath );
+               $fsPath = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               if ( $relPath != '' ) {
+                       $fsPath .= "/{$relPath}";
+               }
+               return $fsPath;
+       }
+
+       /**
+        * @see FileBackendStore::isPathUsableInternal()
+        * @return bool
+        */
+       public function isPathUsableInternal( $storagePath ) {
+               $fsPath = $this->resolveToFSPath( $storagePath );
+               if ( $fsPath === null ) {
+                       return false; // invalid
+               }
+               $parentDir = dirname( $fsPath );
+
+               if ( file_exists( $fsPath ) ) {
+                       $ok = is_file( $fsPath ) && is_writable( $fsPath );
+               } else {
+                       $ok = is_dir( $parentDir ) && is_writable( $parentDir );
+               }
+
+               if ( $this->fileOwner !== null && $this->currentUser !== $this->fileOwner ) {
+                       $ok = false;
+                       trigger_error( __METHOD__ . ": PHP process owner is not '{$this->fileOwner}'." );
+               }
+
+               return $ok;
+       }
+
+       /**
+        * @see FileBackendStore::doStoreInternal()
+        * @return Status
+        */
+       protected function doStoreInternal( array $params ) {
+               $status = Status::newGood();
+
+               $dest = $this->resolveToFSPath( $params['dst'] );
+               if ( $dest === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               if ( file_exists( $dest ) ) {
+                       if ( !empty( $params['overwrite'] ) ) {
+                               $ok = unlink( $dest );
+                               if ( !$ok ) {
+                                       $status->fatal( 'backend-fail-delete', $params['dst'] );
+                                       return $status;
+                               }
+                       } else {
+                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+                               return $status;
+                       }
+               }
+
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $params['src'] ) ),
+                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Store', $cmd, $dest );
+               } else { // immediate write
+                       $ok = copy( $params['src'], $dest );
+                       // In some cases (at least over NFS), copy() returns true when it fails
+                       if ( !$ok || ( filesize( $params['src'] ) !== filesize( $dest ) ) ) {
+                               if ( $ok ) { // PHP bug
+                                       unlink( $dest ); // remove broken file
+                                       trigger_error( __METHOD__ . ": copy() failed but returned true." );
+                               }
+                               $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+                               return $status;
+                       }
+                       $this->chmod( $dest );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseStore( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doCopyInternal()
+        * @return Status
+        */
+       protected function doCopyInternal( array $params ) {
+               $status = Status::newGood();
+
+               $source = $this->resolveToFSPath( $params['src'] );
+               if ( $source === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+                       return $status;
+               }
+
+               $dest = $this->resolveToFSPath( $params['dst'] );
+               if ( $dest === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               if ( file_exists( $dest ) ) {
+                       if ( !empty( $params['overwrite'] ) ) {
+                               $ok = unlink( $dest );
+                               if ( !$ok ) {
+                                       $status->fatal( 'backend-fail-delete', $params['dst'] );
+                                       return $status;
+                               }
+                       } else {
+                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+                               return $status;
+                       }
+               }
+
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
+                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
+               } else { // immediate write
+                       $ok = copy( $source, $dest );
+                       // In some cases (at least over NFS), copy() returns true when it fails
+                       if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
+                               if ( $ok ) { // PHP bug
+                                       unlink( $dest ); // remove broken file
+                                       trigger_error( __METHOD__ . ": copy() failed but returned true." );
+                               }
+                               $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                               return $status;
+                       }
+                       $this->chmod( $dest );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseCopy( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doMoveInternal()
+        * @return Status
+        */
+       protected function doMoveInternal( array $params ) {
+               $status = Status::newGood();
+
+               $source = $this->resolveToFSPath( $params['src'] );
+               if ( $source === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+                       return $status;
+               }
+
+               $dest = $this->resolveToFSPath( $params['dst'] );
+               if ( $dest === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               if ( file_exists( $dest ) ) {
+                       if ( !empty( $params['overwrite'] ) ) {
+                               // Windows does not support moving over existing files
+                               if ( wfIsWindows() ) {
+                                       $ok = unlink( $dest );
+                                       if ( !$ok ) {
+                                               $status->fatal( 'backend-fail-delete', $params['dst'] );
+                                               return $status;
+                                       }
+                               }
+                       } else {
+                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+                               return $status;
+                       }
+               }
+
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'MOVE' : 'mv',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
+                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
+               } else { // immediate write
+                       $ok = rename( $source, $dest );
+                       clearstatcache(); // file no longer at source
+                       if ( !$ok ) {
+                               $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                               return $status;
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseMove( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doDeleteInternal()
+        * @return Status
+        */
+       protected function doDeleteInternal( array $params ) {
+               $status = Status::newGood();
+
+               $source = $this->resolveToFSPath( $params['src'] );
+               if ( $source === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+                       return $status;
+               }
+
+               if ( !is_file( $source ) ) {
+                       if ( empty( $params['ignoreMissingSource'] ) ) {
+                               $status->fatal( 'backend-fail-delete', $params['src'] );
+                       }
+                       return $status; // do nothing; either OK or bad status
+               }
+
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'DEL' : 'unlink',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $source ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd );
+               } else { // immediate write
+                       $ok = unlink( $source );
+                       if ( !$ok ) {
+                               $status->fatal( 'backend-fail-delete', $params['src'] );
+                               return $status;
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseDelete( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-delete', $params['src'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doCreateInternal()
+        * @return Status
+        */
+       protected function doCreateInternal( array $params ) {
+               $status = Status::newGood();
+
+               $dest = $this->resolveToFSPath( $params['dst'] );
+               if ( $dest === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               if ( file_exists( $dest ) ) {
+                       if ( !empty( $params['overwrite'] ) ) {
+                               $ok = unlink( $dest );
+                               if ( !$ok ) {
+                                       $status->fatal( 'backend-fail-delete', $params['dst'] );
+                                       return $status;
+                               }
+                       } else {
+                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+                               return $status;
+                       }
+               }
+
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $tempFile = TempFSFile::factory( 'create_', 'tmp' );
+                       if ( !$tempFile ) {
+                               $status->fatal( 'backend-fail-create', $params['dst'] );
+                               return $status;
+                       }
+                       $bytes = file_put_contents( $tempFile->getPath(), $params['content'] );
+                       if ( $bytes === false ) {
+                               $status->fatal( 'backend-fail-create', $params['dst'] );
+                               return $status;
+                       }
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
+                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
+                       $tempFile->bind( $status->value );
+               } else { // immediate write
+                       $bytes = file_put_contents( $dest, $params['content'] );
+                       if ( $bytes === false ) {
+                               $status->fatal( 'backend-fail-create', $params['dst'] );
+                               return $status;
+                       }
+                       $this->chmod( $dest );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseCreate( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-create', $params['dst'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doPrepareInternal()
+        * @return Status
+        */
+       protected function doPrepareInternal( $fullCont, $dirRel, array $params ) {
+               $status = Status::newGood();
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+               $existed = is_dir( $dir ); // already there?
+               if ( !wfMkdirParents( $dir ) ) { // make directory and its parents
+                       $status->fatal( 'directorycreateerror', $params['dir'] ); // fails on races
+               } elseif ( !is_writable( $dir ) ) {
+                       $status->fatal( 'directoryreadonlyerror', $params['dir'] );
+               } elseif ( !is_readable( $dir ) ) {
+                       $status->fatal( 'directorynotreadableerror', $params['dir'] );
+               }
+               if ( is_dir( $dir ) && !$existed ) {
+                       // Respect any 'noAccess' or 'noListing' flags...
+                       $status->merge( $this->doSecureInternal( $fullCont, $dirRel, $params ) );
+               }
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doSecureInternal()
+        * @return Status
+        */
+       protected function doSecureInternal( $fullCont, $dirRel, array $params ) {
+               $status = Status::newGood();
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+               // Seed new directories with a blank index.html, to prevent crawling...
+               if ( !empty( $params['noListing'] ) && !file_exists( "{$dir}/index.html" ) ) {
+                       $bytes = file_put_contents( "{$dir}/index.html", $this->indexHtmlPrivate() );
+                       if ( $bytes === false ) {
+                               $status->fatal( 'backend-fail-create', $params['dir'] . '/index.html' );
+                               return $status;
+                       }
+               }
+               // Add a .htaccess file to the root of the container...
+               if ( !empty( $params['noAccess'] ) && !file_exists( "{$contRoot}/.htaccess" ) ) {
+                       $bytes = file_put_contents( "{$contRoot}/.htaccess", $this->htaccessPrivate() );
+                       if ( $bytes === false ) {
+                               $storeDir = "mwstore://{$this->name}/{$shortCont}";
+                               $status->fatal( 'backend-fail-create', "{$storeDir}/.htaccess" );
+                               return $status;
+                       }
+               }
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doPublishInternal()
+        * @return Status
+        */
+       protected function doPublishInternal( $fullCont, $dirRel, array $params ) {
+               $status = Status::newGood();
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+               // Unseed new directories with a blank index.html, to allow crawling...
+               if ( !empty( $params['listing'] ) && is_file( "{$dir}/index.html" ) ) {
+                       $exists = ( file_get_contents( "{$dir}/index.html" ) === $this->indexHtmlPrivate() );
+                       if ( $exists && !unlink( "{$dir}/index.html" ) ) { // reverse secure()
+                               $status->fatal( 'backend-fail-delete', $params['dir'] . '/index.html' );
+                               return $status;
+                       }
+               }
+               // Remove the .htaccess file from the root of the container...
+               if ( !empty( $params['access'] ) && is_file( "{$contRoot}/.htaccess" ) ) {
+                       $exists = ( file_get_contents( "{$contRoot}/.htaccess" ) === $this->htaccessPrivate() );
+                       if ( $exists && !unlink( "{$contRoot}/.htaccess" ) ) { // reverse secure()
+                               $storeDir = "mwstore://{$this->name}/{$shortCont}";
+                               $status->fatal( 'backend-fail-delete', "{$storeDir}/.htaccess" );
+                               return $status;
+                       }
+               }
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doCleanInternal()
+        * @return Status
+        */
+       protected function doCleanInternal( $fullCont, $dirRel, array $params ) {
+               $status = Status::newGood();
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+               wfSuppressWarnings();
+               if ( is_dir( $dir ) ) {
+                       rmdir( $dir ); // remove directory if empty
+               }
+               wfRestoreWarnings();
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doFileExists()
+        * @return array|bool|null
+        */
+       protected function doGetFileStat( array $params ) {
+               $source = $this->resolveToFSPath( $params['src'] );
+               if ( $source === null ) {
+                       return false; // invalid storage path
+               }
+
+               $this->trapWarnings(); // don't trust 'false' if there were errors
+               $stat = is_file( $source ) ? stat( $source ) : false; // regular files only
+               $hadError = $this->untrapWarnings();
+
+               if ( $stat ) {
+                       return array(
+                               'mtime' => wfTimestamp( TS_MW, $stat['mtime'] ),
+                               'size'  => $stat['size']
+                       );
+               } elseif ( !$hadError ) {
+                       return false; // file does not exist
+               } else {
+                       return null; // failure
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doClearCache()
+        */
+       protected function doClearCache( array $paths = null ) {
+               clearstatcache(); // clear the PHP file stat cache
+       }
+
+       /**
+        * @see FileBackendStore::doDirectoryExists()
+        * @return bool|null
+        */
+       protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+
+               $this->trapWarnings(); // don't trust 'false' if there were errors
+               $exists = is_dir( $dir );
+               $hadError = $this->untrapWarnings();
+
+               return $hadError ? null : $exists;
+       }
+
+       /**
+        * @see FileBackendStore::getDirectoryListInternal()
+        * @return Array|null
+        */
+       public function getDirectoryListInternal( $fullCont, $dirRel, array $params ) {
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+               $exists = is_dir( $dir );
+               if ( !$exists ) {
+                       wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
+                       return array(); // nothing under this dir
+               } elseif ( !is_readable( $dir ) ) {
+                       wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
+                       return null; // bad permissions?
+               }
+               return new FSFileBackendDirList( $dir, $params );
+       }
+
+       /**
+        * @see FileBackendStore::getFileListInternal()
+        * @return array|FSFileBackendFileList|null
+        */
+       public function getFileListInternal( $fullCont, $dirRel, array $params ) {
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+               $exists = is_dir( $dir );
+               if ( !$exists ) {
+                       wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
+                       return array(); // nothing under this dir
+               } elseif ( !is_readable( $dir ) ) {
+                       wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
+                       return null; // bad permissions?
+               }
+               return new FSFileBackendFileList( $dir, $params );
+       }
+
+       /**
+        * @see FileBackendStore::getLocalReference()
+        * @return FSFile|null
+        */
+       public function getLocalReference( array $params ) {
+               $source = $this->resolveToFSPath( $params['src'] );
+               if ( $source === null ) {
+                       return null;
+               }
+               return new FSFile( $source );
+       }
+
+       /**
+        * @see FileBackendStore::getLocalCopy()
+        * @return null|TempFSFile
+        */
+       public function getLocalCopy( array $params ) {
+               $source = $this->resolveToFSPath( $params['src'] );
+               if ( $source === null ) {
+                       return null;
+               }
+
+               // Create a new temporary file with the same extension...
+               $ext = FileBackend::extensionFromPath( $params['src'] );
+               $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
+               if ( !$tmpFile ) {
+                       return null;
+               }
+               $tmpPath = $tmpFile->getPath();
+
+               // Copy the source file over the temp file
+               $ok = copy( $source, $tmpPath );
+               if ( !$ok ) {
+                       return null;
+               }
+
+               $this->chmod( $tmpPath );
+
+               return $tmpFile;
+       }
+
+       /**
+        * @see FileBackendStore::directoriesAreVirtual()
+        * @return bool
+        */
+       protected function directoriesAreVirtual() {
+               return false;
+       }
+
+       /**
+        * @see FileBackendStore::doExecuteOpHandlesInternal()
+        * @return Array List of corresponding Status objects
+        */
+       protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
+               $statuses = array();
+
+               $pipes = array();
+               foreach ( $fileOpHandles as $index => $fileOpHandle ) {
+                       $pipes[$index] = popen( "{$fileOpHandle->cmd} 2>&1", 'r' );
+               }
+
+               $errs = array();
+               foreach ( $pipes as $index => $pipe ) {
+                       // Result will be empty on success in *NIX. On Windows,
+                       // it may be something like "        1 file(s) [copied|moved].".
+                       $errs[$index] = stream_get_contents( $pipe );
+                       fclose( $pipe );
+               }
+
+               foreach ( $fileOpHandles as $index => $fileOpHandle ) {
+                       $status = Status::newGood();
+                       $function = '_getResponse' . $fileOpHandle->call;
+                       $this->$function( $errs[$index], $status, $fileOpHandle->params, $fileOpHandle->cmd );
+                       $statuses[$index] = $status;
+                       if ( $status->isOK() && $fileOpHandle->chmodPath ) {
+                               $this->chmod( $fileOpHandle->chmodPath );
+                       }
+               }
+
+               clearstatcache(); // files changed
+               return $statuses;
+       }
+
+       /**
+        * Chmod a file, suppressing the warnings
+        *
+        * @param $path string Absolute file system path
+        * @return bool Success
+        */
+       protected function chmod( $path ) {
+               wfSuppressWarnings();
+               $ok = chmod( $path, $this->fileMode );
+               wfRestoreWarnings();
+
+               return $ok;
+       }
+
+       /**
+        * Return the text of an index.html file to hide directory listings
+        *
+        * @return string
+        */
+       protected function indexHtmlPrivate() {
+               return '';
+       }
+
+       /**
+        * Return the text of a .htaccess file to make a directory private
+        *
+        * @return string
+        */
+       protected function htaccessPrivate() {
+               return "Deny from all\n";
+       }
+
+       /**
+        * Clean up directory separators for the given OS
+        *
+        * @param $path string FS path
+        * @return string
+        */
+       protected function cleanPathSlashes( $path ) {
+               return wfIsWindows() ? strtr( $path, '/', '\\' ) : $path;
+       }
+
+       /**
+        * Listen for E_WARNING errors and track whether any happen
+        *
+        * @return bool
+        */
+       protected function trapWarnings() {
+               $this->hadWarningErrors[] = false; // push to stack
+               set_error_handler( array( $this, 'handleWarning' ), E_WARNING );
+               return false; // invoke normal PHP error handler
+       }
+
+       /**
+        * Stop listening for E_WARNING errors and return true if any happened
+        *
+        * @return bool
+        */
+       protected function untrapWarnings() {
+               restore_error_handler(); // restore previous handler
+               return array_pop( $this->hadWarningErrors ); // pop from stack
+       }
+
+       /**
+        * @return bool
+        */
+       private function handleWarning() {
+               $this->hadWarningErrors[count( $this->hadWarningErrors ) - 1] = true;
+               return true; // suppress from PHP handler
+       }
+}
+
+/**
+ * @see FileBackendStoreOpHandle
+ */
+class FSFileOpHandle extends FileBackendStoreOpHandle {
+       public $cmd; // string; shell command
+       public $chmodPath; // string; file to chmod
+
+       /**
+        * @param $backend
+        * @param $params array
+        * @param $call
+        * @param $cmd
+        * @param $chmodPath null
+        */
+       public function __construct( $backend, array $params, $call, $cmd, $chmodPath = null ) {
+               $this->backend = $backend;
+               $this->params = $params;
+               $this->call = $call;
+               $this->cmd = $cmd;
+               $this->chmodPath = $chmodPath;
+       }
+}
+
+/**
+ * Wrapper around RecursiveDirectoryIterator/DirectoryIterator that
+ * catches exception or does any custom behavoir that we may want.
+ * Do not use this class from places outside FSFileBackend.
+ *
+ * @ingroup FileBackend
+ */
+abstract class FSFileBackendList implements Iterator {
+       /** @var Iterator */
+       protected $iter;
+       protected $suffixStart; // integer
+       protected $pos = 0; // integer
+       /** @var Array */
+       protected $params = array();
+
+       /**
+        * @param $dir string file system directory
+        * @param $params array
+        */
+       public function __construct( $dir, array $params ) {
+               $dir = realpath( $dir ); // normalize
+               $this->suffixStart = strlen( $dir ) + 1; // size of "path/to/dir/"
+               $this->params = $params;
+
+               try {
+                       $this->iter = $this->initIterator( $dir );
+               } catch ( UnexpectedValueException $e ) {
+                       $this->iter = null; // bad permissions? deleted?
+               }
+       }
+
+       /**
+        * Return an appropriate iterator object to wrap
+        *
+        * @param $dir string file system directory
+        * @return Iterator
+        */
+       protected function initIterator( $dir ) {
+               if ( !empty( $this->params['topOnly'] ) ) { // non-recursive
+                       # Get an iterator that will get direct sub-nodes
+                       return new DirectoryIterator( $dir );
+               } else { // recursive
+                       # Get an iterator that will return leaf nodes (non-directories)
+                       # RecursiveDirectoryIterator extends FilesystemIterator.
+                       # FilesystemIterator::SKIP_DOTS default is inconsistent in PHP 5.3.x.
+                       $flags = FilesystemIterator::CURRENT_AS_SELF | FilesystemIterator::SKIP_DOTS;
+                       return new RecursiveIteratorIterator(
+                               new RecursiveDirectoryIterator( $dir, $flags ),
+                               RecursiveIteratorIterator::CHILD_FIRST // include dirs
+                       );
+               }
+       }
+
+       /**
+        * @see Iterator::key()
+        * @return integer
+        */
+       public function key() {
+               return $this->pos;
+       }
+
+       /**
+        * @see Iterator::current()
+        * @return string|bool String or false
+        */
+       public function current() {
+               return $this->getRelPath( $this->iter->current()->getPathname() );
+       }
+
+       /**
+        * @see Iterator::next()
+        * @return void
+        */
+       public function next() {
+               try {
+                       $this->iter->next();
+                       $this->filterViaNext();
+               } catch ( UnexpectedValueException $e ) {
+                       $this->iter = null;
+               }
+               ++$this->pos;
+       }
+
+       /**
+        * @see Iterator::rewind()
+        * @return void
+        */
+       public function rewind() {
+               $this->pos = 0;
+               try {
+                       $this->iter->rewind();
+                       $this->filterViaNext();
+               } catch ( UnexpectedValueException $e ) {
+                       $this->iter = null;
+               }
+       }
+
+       /**
+        * @see Iterator::valid()
+        * @return bool
+        */
+       public function valid() {
+               return $this->iter && $this->iter->valid();
+       }
+
+       /**
+        * Filter out items by advancing to the next ones
+        */
+       protected function filterViaNext() {}
+
+       /**
+        * Return only the relative path and normalize slashes to FileBackend-style.
+        * Uses the "real path" since the suffix is based upon that.
+        *
+        * @param $path string
+        * @return string
+        */
+       protected function getRelPath( $path ) {
+               return strtr( substr( realpath( $path ), $this->suffixStart ), '\\', '/' );
+       }
+}
+
+class FSFileBackendDirList extends FSFileBackendList {
+       protected function filterViaNext() {
+               while ( $this->iter->valid() ) {
+                       if ( $this->iter->current()->isDot() || !$this->iter->current()->isDir() ) {
+                               $this->iter->next(); // skip non-directories and dot files
+                       } else {
+                               break;
+                       }
+               }
+       }
+}
+
+class FSFileBackendFileList extends FSFileBackendList {
+       protected function filterViaNext() {
+               while ( $this->iter->valid() ) {
+                       if ( !$this->iter->current()->isFile() ) {
+                               $this->iter->next(); // skip non-files and dot files
+                       } else {
+                               break;
+                       }
+               }
+       }
+}
diff --git a/includes/filebackend/FileBackend.php b/includes/filebackend/FileBackend.php
new file mode 100644 (file)
index 0000000..cb2433a
--- /dev/null
@@ -0,0 +1,1124 @@
+<?php
+/**
+ * @defgroup FileBackend File backend
+ * @ingroup  FileRepo
+ *
+ * File backend is used to interact with file storage systems,
+ * such as the local file system, NFS, or cloud storage systems.
+ */
+
+/**
+ * Base class for all file backends.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * @brief Base class for all file backend classes (including multi-write backends).
+ *
+ * This class defines the methods as abstract that subclasses must implement.
+ * Outside callers can assume that all backends will have these functions.
+ *
+ * All "storage paths" are of the format "mwstore://<backend>/<container>/<path>".
+ * The "<path>" portion is a relative path that uses UNIX file system (FS)
+ * notation, though any particular backend may not actually be using a local
+ * filesystem.
+ * Therefore, the relative paths are only virtual.
+ *
+ * Backend contents are stored under wiki-specific container names by default.
+ * For legacy reasons, this has no effect for the FS backend class, and per-wiki
+ * segregation must be done by setting the container paths appropriately.
+ *
+ * FS-based backends are somewhat more restrictive due to the existence of real
+ * directory files; a regular file cannot have the same name as a directory. Other
+ * backends with virtual directories may not have this limitation. Callers should
+ * store files in such a way that no files and directories are under the same path.
+ *
+ * Methods should avoid throwing exceptions at all costs.
+ * As a corollary, external dependencies should be kept to a minimum.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+abstract class FileBackend {
+       protected $name; // string; unique backend name
+       protected $wikiId; // string; unique wiki name
+       protected $readOnly; // string; read-only explanation message
+       protected $parallelize; // string; when to do operations in parallel
+       protected $concurrency; // integer; how many operations can be done in parallel
+
+       /** @var LockManager */
+       protected $lockManager;
+       /** @var FileJournal */
+       protected $fileJournal;
+
+       /**
+        * Create a new backend instance from configuration.
+        * This should only be called from within FileBackendGroup.
+        *
+        * $config includes:
+        *   - name        : The unique name of this backend.
+        *                   This should consist of alphanumberic, '-', and '_' characters.
+        *                   This name should not be changed after use.
+        *   - wikiId      : Prefix to container names that is unique to this wiki.
+        *                   It should only consist of alphanumberic, '-', and '_' characters.
+        *   - lockManager : Registered name of a file lock manager to use.
+        *   - fileJournal : File journal configuration; see FileJournal::factory().
+        *                   Journals simply log changes to files stored in the backend.
+        *   - readOnly    : Write operations are disallowed if this is a non-empty string.
+        *                   It should be an explanation for the backend being read-only.
+        *   - parallelize : When to do file operations in parallel (when possible).
+        *                   Allowed values are "implicit", "explicit" and "off".
+        *   - concurrency : How many file operations can be done in parallel.
+        *
+        * @param $config Array
+        * @throws MWException
+        */
+       public function __construct( array $config ) {
+               $this->name = $config['name'];
+               if ( !preg_match( '!^[a-zA-Z0-9-_]{1,255}$!', $this->name ) ) {
+                       throw new MWException( "Backend name `{$this->name}` is invalid." );
+               }
+               $this->wikiId = isset( $config['wikiId'] )
+                       ? $config['wikiId']
+                       : wfWikiID(); // e.g. "my_wiki-en_"
+               $this->lockManager = ( $config['lockManager'] instanceof LockManager )
+                       ? $config['lockManager']
+                       : LockManagerGroup::singleton()->get( $config['lockManager'] );
+               $this->fileJournal = isset( $config['fileJournal'] )
+                       ? ( ( $config['fileJournal'] instanceof FileJournal )
+                               ? $config['fileJournal']
+                               : FileJournal::factory( $config['fileJournal'], $this->name ) )
+                       : FileJournal::factory( array( 'class' => 'NullFileJournal' ), $this->name );
+               $this->readOnly = isset( $config['readOnly'] )
+                       ? (string)$config['readOnly']
+                       : '';
+               $this->parallelize = isset( $config['parallelize'] )
+                       ? (string)$config['parallelize']
+                       : 'off';
+               $this->concurrency = isset( $config['concurrency'] )
+                       ? (int)$config['concurrency']
+                       : 50;
+       }
+
+       /**
+        * Get the unique backend name.
+        * We may have multiple different backends of the same type.
+        * For example, we can have two Swift backends using different proxies.
+        *
+        * @return string
+        */
+       final public function getName() {
+               return $this->name;
+       }
+
+       /**
+        * Check if this backend is read-only
+        *
+        * @return bool
+        */
+       final public function isReadOnly() {
+               return ( $this->readOnly != '' );
+       }
+
+       /**
+        * Get an explanatory message if this backend is read-only
+        *
+        * @return string|bool Returns false if the backend is not read-only
+        */
+       final public function getReadOnlyReason() {
+               return ( $this->readOnly != '' ) ? $this->readOnly : false;
+       }
+
+       /**
+        * This is the main entry point into the backend for write operations.
+        * Callers supply an ordered list of operations to perform as a transaction.
+        * Files will be locked, the stat cache cleared, and then the operations attempted.
+        * If any serious errors occur, all attempted operations will be rolled back.
+        *
+        * $ops is an array of arrays. The outer array holds a list of operations.
+        * Each inner array is a set of key value pairs that specify an operation.
+        *
+        * Supported operations and their parameters. The supported actions are:
+        *  - create
+        *  - store
+        *  - copy
+        *  - move
+        *  - delete
+        *  - null
+        *
+        * a) Create a new file in storage with the contents of a string
+        * @code
+        *     array(
+        *         'op'                  => 'create',
+        *         'dst'                 => <storage path>,
+        *         'content'             => <string of new file contents>,
+        *         'overwrite'           => <boolean>,
+        *         'overwriteSame'       => <boolean>
+        *     );
+        * @endcode
+        *
+        * b) Copy a file system file into storage
+        * @code
+        *     array(
+        *         'op'                  => 'store',
+        *         'src'                 => <file system path>,
+        *         'dst'                 => <storage path>,
+        *         'overwrite'           => <boolean>,
+        *         'overwriteSame'       => <boolean>
+        *     )
+        * @endcode
+        *
+        * c) Copy a file within storage
+        * @code
+        *     array(
+        *         'op'                  => 'copy',
+        *         'src'                 => <storage path>,
+        *         'dst'                 => <storage path>,
+        *         'overwrite'           => <boolean>,
+        *         'overwriteSame'       => <boolean>
+        *     )
+        * @endcode
+        *
+        * d) Move a file within storage
+        * @code
+        *     array(
+        *         'op'                  => 'move',
+        *         'src'                 => <storage path>,
+        *         'dst'                 => <storage path>,
+        *         'overwrite'           => <boolean>,
+        *         'overwriteSame'       => <boolean>
+        *     )
+        * @endcode
+        *
+        * e) Delete a file within storage
+        * @code
+        *     array(
+        *         'op'                  => 'delete',
+        *         'src'                 => <storage path>,
+        *         'ignoreMissingSource' => <boolean>
+        *     )
+        * @endcode
+        *
+        * f) Do nothing (no-op)
+        * @code
+        *     array(
+        *         'op'                  => 'null',
+        *     )
+        * @endcode
+        *
+        * Boolean flags for operations (operation-specific):
+        *   - ignoreMissingSource : The operation will simply succeed and do
+        *                           nothing if the source file does not exist.
+        *   - overwrite           : Any destination file will be overwritten.
+        *   - overwriteSame       : An error will not be given if a file already
+        *                           exists at the destination that has the same
+        *                           contents as the new contents to be written there.
+        *
+        * $opts is an associative of boolean flags, including:
+        *   - force               : Operation precondition errors no longer trigger an abort.
+        *                           Any remaining operations are still attempted. Unexpected
+        *                           failures may still cause remaning operations to be aborted.
+        *   - nonLocking          : No locks are acquired for the operations.
+        *                           This can increase performance for non-critical writes.
+        *                           This has no effect unless the 'force' flag is set.
+        *   - allowStale          : Don't require the latest available data.
+        *                           This can increase performance for non-critical writes.
+        *                           This has no effect unless the 'force' flag is set.
+        *   - preserveCache       : Don't clear the process cache before checking files.
+        *                           This should only be used if all entries in the process
+        *                           cache were added after the files were already locked.
+        *   - nonJournaled        : Don't log this operation batch in the file journal.
+        *                           This limits the ability of recovery scripts.
+        *   - parallelize         : Try to do operations in parallel when possible.
+        *   - bypassReadOnly      : Allow writes in read-only mode (since 1.20).
+        *
+        * @remarks Remarks on locking:
+        * File system paths given to operations should refer to files that are
+        * already locked or otherwise safe from modification from other processes.
+        * Normally these files will be new temp files, which should be adequate.
+        *
+        * @par Return value:
+        *
+        * This returns a Status, which contains all warnings and fatals that occurred
+        * during the operation. The 'failCount', 'successCount', and 'success' members
+        * will reflect each operation attempted.
+        *
+        * The status will be "OK" unless:
+        *   - a) unexpected operation errors occurred (network partitions, disk full...)
+        *   - b) significant operation errors occurred and 'force' was not set
+        *
+        * @param $ops Array List of operations to execute in order
+        * @param $opts Array Batch operation options
+        * @return Status
+        */
+       final public function doOperations( array $ops, array $opts = array() ) {
+               if ( empty( $opts['bypassReadOnly'] ) && $this->isReadOnly() ) {
+                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+               }
+               if ( empty( $opts['force'] ) ) { // sanity
+                       unset( $opts['nonLocking'] );
+                       unset( $opts['allowStale'] );
+               }
+               $opts['concurrency'] = 1; // off
+               if ( $this->parallelize === 'implicit' ) {
+                       if ( !isset( $opts['parallelize'] ) || $opts['parallelize'] ) {
+                               $opts['concurrency'] = $this->concurrency;
+                       }
+               } elseif ( $this->parallelize === 'explicit' ) {
+                       if ( !empty( $opts['parallelize'] ) ) {
+                               $opts['concurrency'] = $this->concurrency;
+                       }
+               }
+               return $this->doOperationsInternal( $ops, $opts );
+       }
+
+       /**
+        * @see FileBackend::doOperations()
+        */
+       abstract protected function doOperationsInternal( array $ops, array $opts );
+
+       /**
+        * Same as doOperations() except it takes a single operation.
+        * If you are doing a batch of operations that should either
+        * all succeed or all fail, then use that function instead.
+        *
+        * @see FileBackend::doOperations()
+        *
+        * @param $op Array Operation
+        * @param $opts Array Operation options
+        * @return Status
+        */
+       final public function doOperation( array $op, array $opts = array() ) {
+               return $this->doOperations( array( $op ), $opts );
+       }
+
+       /**
+        * Performs a single create operation.
+        * This sets $params['op'] to 'create' and passes it to doOperation().
+        *
+        * @see FileBackend::doOperation()
+        *
+        * @param $params Array Operation parameters
+        * @param $opts Array Operation options
+        * @return Status
+        */
+       final public function create( array $params, array $opts = array() ) {
+               return $this->doOperation( array( 'op' => 'create' ) + $params, $opts );
+       }
+
+       /**
+        * Performs a single store operation.
+        * This sets $params['op'] to 'store' and passes it to doOperation().
+        *
+        * @see FileBackend::doOperation()
+        *
+        * @param $params Array Operation parameters
+        * @param $opts Array Operation options
+        * @return Status
+        */
+       final public function store( array $params, array $opts = array() ) {
+               return $this->doOperation( array( 'op' => 'store' ) + $params, $opts );
+       }
+
+       /**
+        * Performs a single copy operation.
+        * This sets $params['op'] to 'copy' and passes it to doOperation().
+        *
+        * @see FileBackend::doOperation()
+        *
+        * @param $params Array Operation parameters
+        * @param $opts Array Operation options
+        * @return Status
+        */
+       final public function copy( array $params, array $opts = array() ) {
+               return $this->doOperation( array( 'op' => 'copy' ) + $params, $opts );
+       }
+
+       /**
+        * Performs a single move operation.
+        * This sets $params['op'] to 'move' and passes it to doOperation().
+        *
+        * @see FileBackend::doOperation()
+        *
+        * @param $params Array Operation parameters
+        * @param $opts Array Operation options
+        * @return Status
+        */
+       final public function move( array $params, array $opts = array() ) {
+               return $this->doOperation( array( 'op' => 'move' ) + $params, $opts );
+       }
+
+       /**
+        * Performs a single delete operation.
+        * This sets $params['op'] to 'delete' and passes it to doOperation().
+        *
+        * @see FileBackend::doOperation()
+        *
+        * @param $params Array Operation parameters
+        * @param $opts Array Operation options
+        * @return Status
+        */
+       final public function delete( array $params, array $opts = array() ) {
+               return $this->doOperation( array( 'op' => 'delete' ) + $params, $opts );
+       }
+
+       /**
+        * Perform a set of independent file operations on some files.
+        *
+        * This does no locking, nor journaling, and possibly no stat calls.
+        * Any destination files that already exist will be overwritten.
+        * This should *only* be used on non-original files, like cache files.
+        *
+        * Supported operations and their parameters:
+        *  - create
+        *  - store
+        *  - copy
+        *  - move
+        *  - delete
+        *  - null
+        *
+        * a) Create a new file in storage with the contents of a string
+        * @code
+        *     array(
+        *         'op'                  => 'create',
+        *         'dst'                 => <storage path>,
+        *         'content'             => <string of new file contents>
+        *     )
+        * @endcode
+        * b) Copy a file system file into storage
+        * @code
+        *     array(
+        *         'op'                  => 'store',
+        *         'src'                 => <file system path>,
+        *         'dst'                 => <storage path>
+        *     )
+        * @endcode
+        * c) Copy a file within storage
+        * @code
+        *     array(
+        *         'op'                  => 'copy',
+        *         'src'                 => <storage path>,
+        *         'dst'                 => <storage path>
+        *     )
+        * @endcode
+        * d) Move a file within storage
+        * @code
+        *     array(
+        *         'op'                  => 'move',
+        *         'src'                 => <storage path>,
+        *         'dst'                 => <storage path>
+        *     )
+        * @endcode
+        * e) Delete a file within storage
+        * @code
+        *     array(
+        *         'op'                  => 'delete',
+        *         'src'                 => <storage path>,
+        *         'ignoreMissingSource' => <boolean>
+        *     )
+        * @endcode
+        * f) Do nothing (no-op)
+        * @code
+        *     array(
+        *         'op'                  => 'null',
+        *     )
+        * @endcode
+        *
+        * @par Boolean flags for operations (operation-specific):
+        *   - ignoreMissingSource : The operation will simply succeed and do
+        *                           nothing if the source file does not exist.
+        *
+        * $opts is an associative of boolean flags, including:
+        *   - bypassReadOnly      : Allow writes in read-only mode (since 1.20)
+        *
+        * @par Return value:
+        * This returns a Status, which contains all warnings and fatals that occurred
+        * during the operation. The 'failCount', 'successCount', and 'success' members
+        * will reflect each operation attempted for the given files. The status will be
+        * considered "OK" as long as no fatal errors occurred.
+        *
+        * @param $ops Array Set of operations to execute
+        * @param $opts Array Batch operation options
+        * @return Status
+        * @since 1.20
+        */
+       final public function doQuickOperations( array $ops, array $opts = array() ) {
+               if ( empty( $opts['bypassReadOnly'] ) && $this->isReadOnly() ) {
+                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+               }
+               foreach ( $ops as &$op ) {
+                       $op['overwrite'] = true; // avoids RTTs in key/value stores
+               }
+               return $this->doQuickOperationsInternal( $ops );
+       }
+
+       /**
+        * @see FileBackend::doQuickOperations()
+        * @since 1.20
+        */
+       abstract protected function doQuickOperationsInternal( array $ops );
+
+       /**
+        * Same as doQuickOperations() except it takes a single operation.
+        * If you are doing a batch of operations, then use that function instead.
+        *
+        * @see FileBackend::doQuickOperations()
+        *
+        * @param $op Array Operation
+        * @return Status
+        * @since 1.20
+        */
+       final public function doQuickOperation( array $op ) {
+               return $this->doQuickOperations( array( $op ) );
+       }
+
+       /**
+        * Performs a single quick create operation.
+        * This sets $params['op'] to 'create' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickCreate( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'create' ) + $params );
+       }
+
+       /**
+        * Performs a single quick store operation.
+        * This sets $params['op'] to 'store' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickStore( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'store' ) + $params );
+       }
+
+       /**
+        * Performs a single quick copy operation.
+        * This sets $params['op'] to 'copy' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickCopy( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'copy' ) + $params );
+       }
+
+       /**
+        * Performs a single quick move operation.
+        * This sets $params['op'] to 'move' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickMove( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'move' ) + $params );
+       }
+
+       /**
+        * Performs a single quick delete operation.
+        * This sets $params['op'] to 'delete' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickDelete( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'delete' ) + $params );
+       }
+
+       /**
+        * Concatenate a list of storage files into a single file system file.
+        * The target path should refer to a file that is already locked or
+        * otherwise safe from modification from other processes. Normally,
+        * the file will be a new temp file, which should be adequate.
+        *
+        * @param $params Array Operation parameters
+        * $params include:
+        *   - srcs : ordered source storage paths (e.g. chunk1, chunk2, ...)
+        *   - dst  : file system path to 0-byte temp file
+        * @return Status
+        */
+       abstract public function concatenate( array $params );
+
+       /**
+        * Prepare a storage directory for usage.
+        * This will create any required containers and parent directories.
+        * Backends using key/value stores only need to create the container.
+        *
+        * The 'noAccess' and 'noListing' parameters works the same as in secure(),
+        * except they are only applied *if* the directory/container had to be created.
+        * These flags should always be set for directories that have private files.
+        *
+        * @param $params Array
+        * $params include:
+        *   - dir            : storage directory
+        *   - noAccess       : try to deny file access (since 1.20)
+        *   - noListing      : try to deny file listing (since 1.20)
+        *   - bypassReadOnly : allow writes in read-only mode (since 1.20)
+        * @return Status
+        */
+       final public function prepare( array $params ) {
+               if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
+                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+               }
+               return $this->doPrepare( $params );
+       }
+
+       /**
+        * @see FileBackend::prepare()
+        */
+       abstract protected function doPrepare( array $params );
+
+       /**
+        * Take measures to block web access to a storage directory and
+        * the container it belongs to. FS backends might add .htaccess
+        * files whereas key/value store backends might revoke container
+        * access to the storage user representing end-users in web requests.
+        * This is not guaranteed to actually do anything.
+        *
+        * @param $params Array
+        * $params include:
+        *   - dir            : storage directory
+        *   - noAccess       : try to deny file access
+        *   - noListing      : try to deny file listing
+        *   - bypassReadOnly : allow writes in read-only mode (since 1.20)
+        * @return Status
+        */
+       final public function secure( array $params ) {
+               if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
+                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+               }
+               return $this->doSecure( $params );
+       }
+
+       /**
+        * @see FileBackend::secure()
+        */
+       abstract protected function doSecure( array $params );
+
+       /**
+        * Remove measures to block web access to a storage directory and
+        * the container it belongs to. FS backends might remove .htaccess
+        * files whereas key/value store backends might grant container
+        * access to the storage user representing end-users in web requests.
+        * This essentially can undo the result of secure() calls.
+        *
+        * @param $params Array
+        * $params include:
+        *   - dir            : storage directory
+        *   - access         : try to allow file access
+        *   - listing        : try to allow file listing
+        *   - bypassReadOnly : allow writes in read-only mode (since 1.20)
+        * @return Status
+        * @since 1.20
+        */
+       final public function publish( array $params ) {
+               if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
+                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+               }
+               return $this->doPublish( $params );
+       }
+
+       /**
+        * @see FileBackend::publish()
+        */
+       abstract protected function doPublish( array $params );
+
+       /**
+        * Delete a storage directory if it is empty.
+        * Backends using key/value stores may do nothing unless the directory
+        * is that of an empty container, in which case it should be deleted.
+        *
+        * @param $params Array
+        * $params include:
+        *   - dir            : storage directory
+        *   - recursive      : recursively delete empty subdirectories first (since 1.20)
+        *   - bypassReadOnly : allow writes in read-only mode (since 1.20)
+        * @return Status
+        */
+       final public function clean( array $params ) {
+               if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
+                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+               }
+               return $this->doClean( $params );
+       }
+
+       /**
+        * @see FileBackend::clean()
+        */
+       abstract protected function doClean( array $params );
+
+       /**
+        * Check if a file exists at a storage path in the backend.
+        * This returns false if only a directory exists at the path.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return bool|null Returns null on failure
+        */
+       abstract public function fileExists( array $params );
+
+       /**
+        * Get the last-modified timestamp of the file at a storage path.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return string|bool TS_MW timestamp or false on failure
+        */
+       abstract public function getFileTimestamp( array $params );
+
+       /**
+        * Get the contents of a file at a storage path in the backend.
+        * This should be avoided for potentially large files.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return string|bool Returns false on failure
+        */
+       abstract public function getFileContents( array $params );
+
+       /**
+        * Get the size (bytes) of a file at a storage path in the backend.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return integer|bool Returns false on failure
+        */
+       abstract public function getFileSize( array $params );
+
+       /**
+        * Get quick information about a file at a storage path in the backend.
+        * If the file does not exist, then this returns false.
+        * Otherwise, the result is an associative array that includes:
+        *   - mtime  : the last-modified timestamp (TS_MW)
+        *   - size   : the file size (bytes)
+        * Additional values may be included for internal use only.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return Array|bool|null Returns null on failure
+        */
+       abstract public function getFileStat( array $params );
+
+       /**
+        * Get a SHA-1 hash of the file at a storage path in the backend.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return string|bool Hash string or false on failure
+        */
+       abstract public function getFileSha1Base36( array $params );
+
+       /**
+        * Get the properties of the file at a storage path in the backend.
+        * Returns FSFile::placeholderProps() on failure.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return Array
+        */
+       abstract public function getFileProps( array $params );
+
+       /**
+        * Stream the file at a storage path in the backend.
+        * If the file does not exists, a 404 error will be given.
+        * Appropriate HTTP headers (Status, Content-Type, Content-Length)
+        * must be sent if streaming began, while none should be sent otherwise.
+        * Implementations should flush the output buffer before sending data.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src     : source storage path
+        *   - headers : additional HTTP headers to send on success
+        *   - latest  : use the latest available data
+        * @return Status
+        */
+       abstract public function streamFile( array $params );
+
+       /**
+        * Returns a file system file, identical to the file at a storage path.
+        * The file returned is either:
+        *   - a) A local copy of the file at a storage path in the backend.
+        *        The temporary copy will have the same extension as the source.
+        *   - b) An original of the file at a storage path in the backend.
+        * Temporary files may be purged when the file object falls out of scope.
+        *
+        * Write operations should *never* be done on this file as some backends
+        * may do internal tracking or may be instances of FileBackendMultiWrite.
+        * In that later case, there are copies of the file that must stay in sync.
+        * Additionally, further calls to this function may return the same file.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return FSFile|null Returns null on failure
+        */
+       abstract public function getLocalReference( array $params );
+
+       /**
+        * Get a local copy on disk of the file at a storage path in the backend.
+        * The temporary copy will have the same file extension as the source.
+        * Temporary files may be purged when the file object falls out of scope.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return TempFSFile|null Returns null on failure
+        */
+       abstract public function getLocalCopy( array $params );
+
+       /**
+        * Check if a directory exists at a given storage path.
+        * Backends using key/value stores will check if the path is a
+        * virtual directory, meaning there are files under the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * @param $params array
+        * $params include:
+        *   - dir : storage directory
+        * @return bool|null Returns null on failure
+        * @since 1.20
+        */
+       abstract public function directoryExists( array $params );
+
+       /**
+        * Get an iterator to list *all* directories under a storage directory.
+        * If the directory is of the form "mwstore://backend/container",
+        * then all directories in the container should be listed.
+        * If the directory is of form "mwstore://backend/container/dir",
+        * then all directories directly under that directory should be listed.
+        * Results should be storage directories relative to the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * @param $params array
+        * $params include:
+        *   - dir     : storage directory
+        *   - topOnly : only return direct child dirs of the directory
+        * @return Traversable|Array|null Returns null on failure
+        * @since 1.20
+        */
+       abstract public function getDirectoryList( array $params );
+
+       /**
+        * Same as FileBackend::getDirectoryList() except only lists
+        * directories that are immediately under the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * @param $params array
+        * $params include:
+        *   - dir : storage directory
+        * @return Traversable|Array|null Returns null on failure
+        * @since 1.20
+        */
+       final public function getTopDirectoryList( array $params ) {
+               return $this->getDirectoryList( array( 'topOnly' => true ) + $params );
+       }
+
+       /**
+        * Get an iterator to list *all* stored files under a storage directory.
+        * If the directory is of the form "mwstore://backend/container",
+        * then all files in the container should be listed.
+        * If the directory is of form "mwstore://backend/container/dir",
+        * then all files under that directory should be listed.
+        * Results should be storage paths relative to the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * @param $params array
+        * $params include:
+        *   - dir     : storage directory
+        *   - topOnly : only return direct child files of the directory (since 1.20)
+        * @return Traversable|Array|null Returns null on failure
+        */
+       abstract public function getFileList( array $params );
+
+       /**
+        * Same as FileBackend::getFileList() except only lists
+        * files that are immediately under the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * @param $params array
+        * $params include:
+        *   - dir : storage directory
+        * @return Traversable|Array|null Returns null on failure
+        * @since 1.20
+        */
+       final public function getTopFileList( array $params ) {
+               return $this->getFileList( array( 'topOnly' => true ) + $params );
+       }
+
+       /**
+        * Preload persistent file stat and property cache into in-process cache.
+        * This should be used when stat calls will be made on a known list of a many files.
+        *
+        * @param $paths Array Storage paths
+        * @return void
+        */
+       public function preloadCache( array $paths ) {}
+
+       /**
+        * Invalidate any in-process file stat and property cache.
+        * If $paths is given, then only the cache for those files will be cleared.
+        *
+        * @param $paths Array Storage paths (optional)
+        * @return void
+        */
+       public function clearCache( array $paths = null ) {}
+
+       /**
+        * Lock the files at the given storage paths in the backend.
+        * This will either lock all the files or none (on failure).
+        *
+        * Callers should consider using getScopedFileLocks() instead.
+        *
+        * @param $paths Array Storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @return Status
+        */
+       final public function lockFiles( array $paths, $type ) {
+               return $this->lockManager->lock( $paths, $type );
+       }
+
+       /**
+        * Unlock the files at the given storage paths in the backend.
+        *
+        * @param $paths Array Storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @return Status
+        */
+       final public function unlockFiles( array $paths, $type ) {
+               return $this->lockManager->unlock( $paths, $type );
+       }
+
+       /**
+        * Lock the files at the given storage paths in the backend.
+        * This will either lock all the files or none (on failure).
+        * On failure, the status object will be updated with errors.
+        *
+        * Once the return value goes out scope, the locks will be released and
+        * the status updated. Unlock fatals will not change the status "OK" value.
+        *
+        * @param $paths Array Storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @param $status Status Status to update on lock/unlock
+        * @return ScopedLock|null Returns null on failure
+        */
+       final public function getScopedFileLocks( array $paths, $type, Status $status ) {
+               return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
+       }
+
+       /**
+        * Get an array of scoped locks needed for a batch of file operations.
+        *
+        * Normally, FileBackend::doOperations() handles locking, unless
+        * the 'nonLocking' param is passed in. This function is useful if you
+        * want the files to be locked for a broader scope than just when the
+        * files are changing. For example, if you need to update DB metadata,
+        * you may want to keep the files locked until finished.
+        *
+        * @see FileBackend::doOperations()
+        *
+        * @param $ops Array List of file operations to FileBackend::doOperations()
+        * @param $status Status Status to update on lock/unlock
+        * @return Array List of ScopedFileLocks or null values
+        * @since 1.20
+        */
+       abstract public function getScopedLocksForOps( array $ops, Status $status );
+
+       /**
+        * Get the root storage path of this backend.
+        * All container paths are "subdirectories" of this path.
+        *
+        * @return string Storage path
+        * @since 1.20
+        */
+       final public function getRootStoragePath() {
+               return "mwstore://{$this->name}";
+       }
+
+       /**
+        * Get the file journal object for this backend
+        *
+        * @return FileJournal
+        */
+       final public function getJournal() {
+               return $this->fileJournal;
+       }
+
+       /**
+        * Check if a given path is a "mwstore://" path.
+        * This does not do any further validation or any existence checks.
+        *
+        * @param $path string
+        * @return bool
+        */
+       final public static function isStoragePath( $path ) {
+               return ( strpos( $path, 'mwstore://' ) === 0 );
+       }
+
+       /**
+        * Split a storage path into a backend name, a container name,
+        * and a relative file path. The relative path may be the empty string.
+        * This does not do any path normalization or traversal checks.
+        *
+        * @param $storagePath string
+        * @return Array (backend, container, rel object) or (null, null, null)
+        */
+       final public static function splitStoragePath( $storagePath ) {
+               if ( self::isStoragePath( $storagePath ) ) {
+                       // Remove the "mwstore://" prefix and split the path
+                       $parts = explode( '/', substr( $storagePath, 10 ), 3 );
+                       if ( count( $parts ) >= 2 && $parts[0] != '' && $parts[1] != '' ) {
+                               if ( count( $parts ) == 3 ) {
+                                       return $parts; // e.g. "backend/container/path"
+                               } else {
+                                       return array( $parts[0], $parts[1], '' ); // e.g. "backend/container"
+                               }
+                       }
+               }
+               return array( null, null, null );
+       }
+
+       /**
+        * Normalize a storage path by cleaning up directory separators.
+        * Returns null if the path is not of the format of a valid storage path.
+        *
+        * @param $storagePath string
+        * @return string|null
+        */
+       final public static function normalizeStoragePath( $storagePath ) {
+               list( $backend, $container, $relPath ) = self::splitStoragePath( $storagePath );
+               if ( $relPath !== null ) { // must be for this backend
+                       $relPath = self::normalizeContainerPath( $relPath );
+                       if ( $relPath !== null ) {
+                               return ( $relPath != '' )
+                                       ? "mwstore://{$backend}/{$container}/{$relPath}"
+                                       : "mwstore://{$backend}/{$container}";
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * Get the parent storage directory of a storage path.
+        * This returns a path like "mwstore://backend/container",
+        * "mwstore://backend/container/...", or null if there is no parent.
+        *
+        * @param $storagePath string
+        * @return string|null
+        */
+       final public static function parentStoragePath( $storagePath ) {
+               $storagePath = dirname( $storagePath );
+               list( $b, $cont, $rel ) = self::splitStoragePath( $storagePath );
+               return ( $rel === null ) ? null : $storagePath;
+       }
+
+       /**
+        * Get the final extension from a storage or FS path
+        *
+        * @param $path string
+        * @return string
+        */
+       final public static function extensionFromPath( $path ) {
+               $i = strrpos( $path, '.' );
+               return strtolower( $i ? substr( $path, $i + 1 ) : '' );
+       }
+
+       /**
+        * Check if a relative path has no directory traversals
+        *
+        * @param $path string
+        * @return bool
+        * @since 1.20
+        */
+       final public static function isPathTraversalFree( $path ) {
+               return ( self::normalizeContainerPath( $path ) !== null );
+       }
+
+       /**
+        * Validate and normalize a relative storage path.
+        * Null is returned if the path involves directory traversal.
+        * Traversal is insecure for FS backends and broken for others.
+        *
+        * This uses the same traversal protection as Title::secureAndSplit().
+        *
+        * @param $path string Storage path relative to a container
+        * @return string|null
+        */
+       final protected static function normalizeContainerPath( $path ) {
+               // Normalize directory separators
+               $path = strtr( $path, '\\', '/' );
+               // Collapse any consecutive directory separators
+               $path = preg_replace( '![/]{2,}!', '/', $path );
+               // Remove any leading directory separator
+               $path = ltrim( $path, '/' );
+               // Use the same traversal protection as Title::secureAndSplit()
+               if ( strpos( $path, '.' ) !== false ) {
+                       if (
+                               $path === '.' ||
+                               $path === '..' ||
+                               strpos( $path, './' ) === 0 ||
+                               strpos( $path, '../' ) === 0 ||
+                               strpos( $path, '/./' ) !== false ||
+                               strpos( $path, '/../' ) !== false
+                       ) {
+                               return null;
+                       }
+               }
+               return $path;
+       }
+}
diff --git a/includes/filebackend/FileBackendGroup.php b/includes/filebackend/FileBackendGroup.php
new file mode 100644 (file)
index 0000000..8bbc96d
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+/**
+ * File backend registration handling.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle file backend registration
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+class FileBackendGroup {
+       /**
+        * @var FileBackendGroup
+        */
+       protected static $instance = null;
+
+       /** @var Array (name => ('class' => string, 'config' => array, 'instance' => object)) */
+       protected $backends = array();
+
+       protected function __construct() {}
+
+       /**
+        * @return FileBackendGroup
+        */
+       public static function singleton() {
+               if ( self::$instance == null ) {
+                       self::$instance = new self();
+                       self::$instance->initFromGlobals();
+               }
+               return self::$instance;
+       }
+
+       /**
+        * Destroy the singleton instance
+        *
+        * @return void
+        */
+       public static function destroySingleton() {
+               self::$instance = null;
+       }
+
+       /**
+        * Register file backends from the global variables
+        *
+        * @return void
+        */
+       protected function initFromGlobals() {
+               global $wgLocalFileRepo, $wgForeignFileRepos, $wgFileBackends;
+
+               // Register explicitly defined backends
+               $this->register( $wgFileBackends );
+
+               $autoBackends = array();
+               // Automatically create b/c backends for file repos...
+               $repos = array_merge( $wgForeignFileRepos, array( $wgLocalFileRepo ) );
+               foreach ( $repos as $info ) {
+                       $backendName = $info['backend'];
+                       if ( is_object( $backendName ) || isset( $this->backends[$backendName] ) ) {
+                               continue; // already defined (or set to the object for some reason)
+                       }
+                       $repoName = $info['name'];
+                       // Local vars that used to be FSRepo members...
+                       $directory = $info['directory'];
+                       $deletedDir = isset( $info['deletedDir'] )
+                               ? $info['deletedDir']
+                               : false; // deletion disabled
+                       $thumbDir = isset( $info['thumbDir'] )
+                               ? $info['thumbDir']
+                               : "{$directory}/thumb";
+                       $fileMode = isset( $info['fileMode'] )
+                               ? $info['fileMode']
+                               : 0644;
+                       // Get the FS backend configuration
+                       $autoBackends[] = array(
+                               'name'           => $backendName,
+                               'class'          => 'FSFileBackend',
+                               'lockManager'    => 'fsLockManager',
+                               'containerPaths' => array(
+                                       "{$repoName}-public"  => "{$directory}",
+                                       "{$repoName}-thumb"   => $thumbDir,
+                                       "{$repoName}-deleted" => $deletedDir,
+                                       "{$repoName}-temp"    => "{$directory}/temp"
+                               ),
+                               'fileMode'       => $fileMode,
+                       );
+               }
+
+               // Register implicitly defined backends
+               $this->register( $autoBackends );
+       }
+
+       /**
+        * Register an array of file backend configurations
+        *
+        * @param $configs Array
+        * @return void
+        * @throws MWException
+        */
+       protected function register( array $configs ) {
+               foreach ( $configs as $config ) {
+                       if ( !isset( $config['name'] ) ) {
+                               throw new MWException( "Cannot register a backend with no name." );
+                       }
+                       $name = $config['name'];
+                       if ( !isset( $config['class'] ) ) {
+                               throw new MWException( "Cannot register backend `{$name}` with no class." );
+                       }
+                       $class = $config['class'];
+
+                       unset( $config['class'] ); // backend won't need this
+                       $this->backends[$name] = array(
+                               'class'    => $class,
+                               'config'   => $config,
+                               'instance' => null
+                       );
+               }
+       }
+
+       /**
+        * Get the backend object with a given name
+        *
+        * @param $name string
+        * @return FileBackend
+        * @throws MWException
+        */
+       public function get( $name ) {
+               if ( !isset( $this->backends[$name] ) ) {
+                       throw new MWException( "No backend defined with the name `$name`." );
+               }
+               // Lazy-load the actual backend instance
+               if ( !isset( $this->backends[$name]['instance'] ) ) {
+                       $class = $this->backends[$name]['class'];
+                       $config = $this->backends[$name]['config'];
+                       $this->backends[$name]['instance'] = new $class( $config );
+               }
+               return $this->backends[$name]['instance'];
+       }
+
+       /**
+        * Get the config array for a backend object with a given name
+        *
+        * @param $name string
+        * @return Array
+        * @throws MWException
+        */
+       public function config( $name ) {
+               if ( !isset( $this->backends[$name] ) ) {
+                       throw new MWException( "No backend defined with the name `$name`." );
+               }
+               $class = $this->backends[$name]['class'];
+               return array( 'class' => $class ) + $this->backends[$name]['config'];
+       }
+
+       /**
+        * Get an appropriate backend object from a storage path
+        *
+        * @param $storagePath string
+        * @return FileBackend|null Backend or null on failure
+        */
+       public function backendFromPath( $storagePath ) {
+               list( $backend, $c, $p ) = FileBackend::splitStoragePath( $storagePath );
+               if ( $backend !== null && isset( $this->backends[$backend] ) ) {
+                       return $this->get( $backend );
+               }
+               return null;
+       }
+}
diff --git a/includes/filebackend/FileBackendMultiWrite.php b/includes/filebackend/FileBackendMultiWrite.php
new file mode 100644 (file)
index 0000000..9efa0db
--- /dev/null
@@ -0,0 +1,645 @@
+<?php
+/**
+ * Proxy backend that mirrors writes to several internal backends.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * @brief Proxy backend that mirrors writes to several internal backends.
+ *
+ * This class defines a multi-write backend. Multiple backends can be
+ * registered to this proxy backend and it will act as a single backend.
+ * Use this when all access to those backends is through this proxy backend.
+ * At least one of the backends must be declared the "master" backend.
+ *
+ * Only use this class when transitioning from one storage system to another.
+ *
+ * Read operations are only done on the 'master' backend for consistency.
+ * Write operations are performed on all backends, in the order defined.
+ * If an operation fails on one backend it will be rolled back from the others.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+class FileBackendMultiWrite extends FileBackend {
+       /** @var Array Prioritized list of FileBackendStore objects */
+       protected $backends = array(); // array of (backend index => backends)
+       protected $masterIndex = -1; // integer; index of master backend
+       protected $syncChecks = 0; // integer; bitfield
+       /** @var Array */
+       protected $noPushDirConts = array();
+       protected $noPushQuickOps = false; // boolean
+
+       /* Possible internal backend consistency checks */
+       const CHECK_SIZE = 1;
+       const CHECK_TIME = 2;
+       const CHECK_SHA1 = 4;
+
+       /**
+        * Construct a proxy backend that consists of several internal backends.
+        * Locking, journaling, and read-only checks are handled by the proxy backend.
+        *
+        * Additional $config params include:
+        *   - backends       : Array of backend config and multi-backend settings.
+        *                      Each value is the config used in the constructor of a
+        *                          FileBackendStore class, but with these additional settings:
+        *                        - class         : The name of the backend class
+        *                        - isMultiMaster : This must be set for one backend.
+        *                        - template:     : If given a backend name, this will use
+        *                                          the config of that backend as a template.
+        *                                          Values specified here take precedence.
+        *   - syncChecks     : Integer bitfield of internal backend sync checks to perform.
+        *                      Possible bits include the FileBackendMultiWrite::CHECK_* constants.
+        *                      There are constants for SIZE, TIME, and SHA1.
+        *                      The checks are done before allowing any file operations.
+        *   - noPushQuickOps : (hack) Only apply doQuickOperations() to the master backend.
+        *   - noPushDirConts : (hack) Only apply directory functions to the master backend.
+        *
+        * @param $config Array
+        * @throws MWException
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+               $this->syncChecks = isset( $config['syncChecks'] )
+                       ? $config['syncChecks']
+                       : self::CHECK_SIZE;
+               $this->noPushQuickOps = isset( $config['noPushQuickOps'] )
+                       ? $config['noPushQuickOps']
+                       : false;
+               $this->noPushDirConts = isset( $config['noPushDirConts'] )
+                       ? $config['noPushDirConts']
+                       : array();
+               // Construct backends here rather than via registration
+               // to keep these backends hidden from outside the proxy.
+               $namesUsed = array();
+               foreach ( $config['backends'] as $index => $config ) {
+                       if ( isset( $config['template'] ) ) {
+                               // Config is just a modified version of a registered backend's.
+                               // This should only be used when that config is used only by this backend.
+                               $config = $config + FileBackendGroup::singleton()->config( $config['template'] );
+                       }
+                       $name = $config['name'];
+                       if ( isset( $namesUsed[$name] ) ) { // don't break FileOp predicates
+                               throw new MWException( "Two or more backends defined with the name $name." );
+                       }
+                       $namesUsed[$name] = 1;
+                       // Alter certain sub-backend settings for sanity
+                       unset( $config['readOnly'] ); // use proxy backend setting
+                       unset( $config['fileJournal'] ); // use proxy backend journal
+                       $config['wikiId'] = $this->wikiId; // use the proxy backend wiki ID
+                       $config['lockManager'] = 'nullLockManager'; // lock under proxy backend
+                       if ( !empty( $config['isMultiMaster'] ) ) {
+                               if ( $this->masterIndex >= 0 ) {
+                                       throw new MWException( 'More than one master backend defined.' );
+                               }
+                               $this->masterIndex = $index; // this is the "master"
+                               $config['fileJournal'] = $this->fileJournal; // log under proxy backend
+                       }
+                       // Create sub-backend object
+                       if ( !isset( $config['class'] ) ) {
+                               throw new MWException( 'No class given for a backend config.' );
+                       }
+                       $class = $config['class'];
+                       $this->backends[$index] = new $class( $config );
+               }
+               if ( $this->masterIndex < 0 ) { // need backends and must have a master
+                       throw new MWException( 'No master backend defined.' );
+               }
+       }
+
+       /**
+        * @see FileBackend::doOperationsInternal()
+        * @return Status
+        */
+       final protected function doOperationsInternal( array $ops, array $opts ) {
+               $status = Status::newGood();
+
+               $mbe = $this->backends[$this->masterIndex]; // convenience
+
+               // Get the paths to lock from the master backend
+               $realOps = $this->substOpBatchPaths( $ops, $mbe );
+               $paths = $mbe->getPathsToLockForOpsInternal( $mbe->getOperationsInternal( $realOps ) );
+               // Get the paths under the proxy backend's name
+               $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
+               $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
+               // Try to lock those files for the scope of this function...
+               if ( empty( $opts['nonLocking'] ) ) {
+                       // Try to lock those files for the scope of this function...
+                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
+                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
+                       if ( !$status->isOK() ) {
+                               return $status; // abort
+                       }
+               }
+               // Clear any cache entries (after locks acquired)
+               $this->clearCache();
+               $opts['preserveCache'] = true; // only locked files are cached
+               // Do a consistency check to see if the backends agree
+               $status->merge( $this->consistencyCheck( $this->fileStoragePathsForOps( $ops ) ) );
+               if ( !$status->isOK() ) {
+                       return $status; // abort
+               }
+               // Actually attempt the operation batch on the master backend...
+               $masterStatus = $mbe->doOperations( $realOps, $opts );
+               $status->merge( $masterStatus );
+               // Propagate the operations to the clone backends if there were no fatal errors.
+               // If $ops only had one operation, this might avoid backend inconsistencies.
+               if ( !count( $masterStatus->getErrorsArray() ) ) {
+                       foreach ( $this->backends as $index => $backend ) {
+                               if ( $index !== $this->masterIndex ) { // not done already
+                                       $realOps = $this->substOpBatchPaths( $ops, $backend );
+                                       $status->merge( $backend->doOperations( $realOps, $opts ) );
+                               }
+                       }
+               }
+               // Make 'success', 'successCount', and 'failCount' fields reflect
+               // the overall operation, rather than all the batches for each backend.
+               // Do this by only using success values from the master backend's batch.
+               $status->success = $masterStatus->success;
+               $status->successCount = $masterStatus->successCount;
+               $status->failCount = $masterStatus->failCount;
+
+               return $status;
+       }
+
+       /**
+        * Check that a set of files are consistent across all internal backends
+        *
+        * @param $paths Array List of storage paths
+        * @return Status
+        */
+       public function consistencyCheck( array $paths ) {
+               $status = Status::newGood();
+               if ( $this->syncChecks == 0 || count( $this->backends ) <= 1 ) {
+                       return $status; // skip checks
+               }
+
+               $mBackend = $this->backends[$this->masterIndex];
+               foreach ( array_unique( $paths ) as $path ) {
+                       $params = array( 'src' => $path, 'latest' => true );
+                       $mParams = $this->substOpPaths( $params, $mBackend );
+                       // Stat the file on the 'master' backend
+                       $mStat = $mBackend->getFileStat( $mParams );
+                       if ( $this->syncChecks & self::CHECK_SHA1 ) {
+                               $mSha1 = $mBackend->getFileSha1Base36( $mParams );
+                       } else {
+                               $mSha1 = false;
+                       }
+                       $mUsable = $mBackend->isPathUsableInternal( $mParams['src'] );
+                       // Check of all clone backends agree with the master...
+                       foreach ( $this->backends as $index => $cBackend ) {
+                               if ( $index === $this->masterIndex ) {
+                                       continue; // master
+                               }
+                               $cParams = $this->substOpPaths( $params, $cBackend );
+                               $cStat = $cBackend->getFileStat( $cParams );
+                               if ( $mStat ) { // file is in master
+                                       if ( !$cStat ) { // file should exist
+                                               $status->fatal( 'backend-fail-synced', $path );
+                                               continue;
+                                       }
+                                       if ( $this->syncChecks & self::CHECK_SIZE ) {
+                                               if ( $cStat['size'] != $mStat['size'] ) { // wrong size
+                                                       $status->fatal( 'backend-fail-synced', $path );
+                                                       continue;
+                                               }
+                                       }
+                                       if ( $this->syncChecks & self::CHECK_TIME ) {
+                                               $mTs = wfTimestamp( TS_UNIX, $mStat['mtime'] );
+                                               $cTs = wfTimestamp( TS_UNIX, $cStat['mtime'] );
+                                               if ( abs( $mTs - $cTs ) > 30 ) { // outdated file somewhere
+                                                       $status->fatal( 'backend-fail-synced', $path );
+                                                       continue;
+                                               }
+                                       }
+                                       if ( $this->syncChecks & self::CHECK_SHA1 ) {
+                                               if ( $cBackend->getFileSha1Base36( $cParams ) !== $mSha1 ) { // wrong SHA1
+                                                       $status->fatal( 'backend-fail-synced', $path );
+                                                       continue;
+                                               }
+                                       }
+                               } else { // file is not in master
+                                       if ( $cStat ) { // file should not exist
+                                               $status->fatal( 'backend-fail-synced', $path );
+                                       }
+                               }
+                               if ( $mUsable !== $cBackend->isPathUsableInternal( $cParams['src'] ) ) {
+                                       $status->fatal( 'backend-fail-synced', $path );
+                               }
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * Check that a set of files are consistent across all internal backends
+        * and re-synchronize those files againt the "multi master" if needed.
+        *
+        * @param $paths Array List of storage paths
+        * @return Status
+        */
+       public function resyncFiles( array $paths ) {
+               $status = Status::newGood();
+
+               $mBackend = $this->backends[$this->masterIndex];
+               foreach ( $paths as $path ) {
+                       $mPath  = $this->substPaths( $path, $mBackend );
+                       $mSha1  = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
+                       $mExist = $mBackend->fileExists( array( 'src' => $mPath ) );
+                       // Check of all clone backends agree with the master...
+                       foreach ( $this->backends as $index => $cBackend ) {
+                               if ( $index === $this->masterIndex ) {
+                                       continue; // master
+                               }
+                               $cPath = $this->substPaths( $path, $cBackend );
+                               $cSha1 = $cBackend->getFileSha1Base36( array( 'src' => $cPath ) );
+                               if ( $mSha1 === $cSha1 ) {
+                                       // already synced; nothing to do
+                               } elseif ( $mSha1 ) { // file is in master
+                                       $fsFile = $mBackend->getLocalReference( array( 'src' => $mPath ) );
+                                       $status->merge( $cBackend->quickStore(
+                                               array( 'src' => $fsFile->getPath(), 'dst' => $cPath )
+                                       ) );
+                               } elseif ( $mExist === false ) { // file is not in master
+                                       $status->merge( $cBackend->quickDelete( array( 'src' => $cPath ) ) );
+                               }
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * Get a list of file storage paths to read or write for a list of operations
+        *
+        * @param $ops Array Same format as doOperations()
+        * @return Array List of storage paths to files (does not include directories)
+        */
+       protected function fileStoragePathsForOps( array $ops ) {
+               $paths = array();
+               foreach ( $ops as $op ) {
+                       if ( isset( $op['src'] ) ) {
+                               $paths[] = $op['src'];
+                       }
+                       if ( isset( $op['srcs'] ) ) {
+                               $paths = array_merge( $paths, $op['srcs'] );
+                       }
+                       if ( isset( $op['dst'] ) ) {
+                               $paths[] = $op['dst'];
+                       }
+               }
+               return array_unique( $paths );
+       }
+
+       /**
+        * Substitute the backend name in storage path parameters
+        * for a set of operations with that of a given internal backend.
+        *
+        * @param $ops Array List of file operation arrays
+        * @param $backend FileBackendStore
+        * @return Array
+        */
+       protected function substOpBatchPaths( array $ops, FileBackendStore $backend ) {
+               $newOps = array(); // operations
+               foreach ( $ops as $op ) {
+                       $newOp = $op; // operation
+                       foreach ( array( 'src', 'srcs', 'dst', 'dir' ) as $par ) {
+                               if ( isset( $newOp[$par] ) ) { // string or array
+                                       $newOp[$par] = $this->substPaths( $newOp[$par], $backend );
+                               }
+                       }
+                       $newOps[] = $newOp;
+               }
+               return $newOps;
+       }
+
+       /**
+        * Same as substOpBatchPaths() but for a single operation
+        *
+        * @param $ops array File operation array
+        * @param $backend FileBackendStore
+        * @return Array
+        */
+       protected function substOpPaths( array $ops, FileBackendStore $backend ) {
+               $newOps = $this->substOpBatchPaths( array( $ops ), $backend );
+               return $newOps[0];
+       }
+
+       /**
+        * Substitute the backend of storage paths with an internal backend's name
+        *
+        * @param $paths Array|string List of paths or single string path
+        * @param $backend FileBackendStore
+        * @return Array|string
+        */
+       protected function substPaths( $paths, FileBackendStore $backend ) {
+               return preg_replace(
+                       '!^mwstore://' . preg_quote( $this->name ) . '/!',
+                       StringUtils::escapeRegexReplacement( "mwstore://{$backend->getName()}/" ),
+                       $paths // string or array
+               );
+       }
+
+       /**
+        * Substitute the backend of internal storage paths with the proxy backend's name
+        *
+        * @param $paths Array|string List of paths or single string path
+        * @return Array|string
+        */
+       protected function unsubstPaths( $paths ) {
+               return preg_replace(
+                       '!^mwstore://([^/]+)!',
+                       StringUtils::escapeRegexReplacement( "mwstore://{$this->name}" ),
+                       $paths // string or array
+               );
+       }
+
+       /**
+        * @see FileBackend::doQuickOperationsInternal()
+        * @return Status
+        */
+       protected function doQuickOperationsInternal( array $ops ) {
+               $status = Status::newGood();
+               // Do the operations on the master backend; setting Status fields...
+               $realOps = $this->substOpBatchPaths( $ops, $this->backends[$this->masterIndex] );
+               $masterStatus = $this->backends[$this->masterIndex]->doQuickOperations( $realOps );
+               $status->merge( $masterStatus );
+               // Propagate the operations to the clone backends...
+               if ( !$this->noPushQuickOps ) {
+                       foreach ( $this->backends as $index => $backend ) {
+                               if ( $index !== $this->masterIndex ) { // not done already
+                                       $realOps = $this->substOpBatchPaths( $ops, $backend );
+                                       $status->merge( $backend->doQuickOperations( $realOps ) );
+                               }
+                       }
+               }
+               // Make 'success', 'successCount', and 'failCount' fields reflect
+               // the overall operation, rather than all the batches for each backend.
+               // Do this by only using success values from the master backend's batch.
+               $status->success = $masterStatus->success;
+               $status->successCount = $masterStatus->successCount;
+               $status->failCount = $masterStatus->failCount;
+               return $status;
+       }
+
+       /**
+        * @param $path string Storage path
+        * @return bool Path container should have dir changes pushed to all backends
+        */
+       protected function replicateContainerDirChanges( $path ) {
+               list( $b, $shortCont, $r ) = self::splitStoragePath( $path );
+               return !in_array( $shortCont, $this->noPushDirConts );
+       }
+
+       /**
+        * @see FileBackend::doPrepare()
+        * @return Status
+        */
+       protected function doPrepare( array $params ) {
+               $status = Status::newGood();
+               $replicate = $this->replicateContainerDirChanges( $params['dir'] );
+               foreach ( $this->backends as $index => $backend ) {
+                       if ( $replicate || $index == $this->masterIndex ) {
+                               $realParams = $this->substOpPaths( $params, $backend );
+                               $status->merge( $backend->doPrepare( $realParams ) );
+                       }
+               }
+               return $status;
+       }
+
+       /**
+        * @see FileBackend::doSecure()
+        * @param $params array
+        * @return Status
+        */
+       protected function doSecure( array $params ) {
+               $status = Status::newGood();
+               $replicate = $this->replicateContainerDirChanges( $params['dir'] );
+               foreach ( $this->backends as $index => $backend ) {
+                       if ( $replicate || $index == $this->masterIndex ) {
+                               $realParams = $this->substOpPaths( $params, $backend );
+                               $status->merge( $backend->doSecure( $realParams ) );
+                       }
+               }
+               return $status;
+       }
+
+       /**
+        * @see FileBackend::doPublish()
+        * @param $params array
+        * @return Status
+        */
+       protected function doPublish( array $params ) {
+               $status = Status::newGood();
+               $replicate = $this->replicateContainerDirChanges( $params['dir'] );
+               foreach ( $this->backends as $index => $backend ) {
+                       if ( $replicate || $index == $this->masterIndex ) {
+                               $realParams = $this->substOpPaths( $params, $backend );
+                               $status->merge( $backend->doPublish( $realParams ) );
+                       }
+               }
+               return $status;
+       }
+
+       /**
+        * @see FileBackend::doClean()
+        * @param $params array
+        * @return Status
+        */
+       protected function doClean( array $params ) {
+               $status = Status::newGood();
+               $replicate = $this->replicateContainerDirChanges( $params['dir'] );
+               foreach ( $this->backends as $index => $backend ) {
+                       if ( $replicate || $index == $this->masterIndex ) {
+                               $realParams = $this->substOpPaths( $params, $backend );
+                               $status->merge( $backend->doClean( $realParams ) );
+                       }
+               }
+               return $status;
+       }
+
+       /**
+        * @see FileBackend::concatenate()
+        * @param $params array
+        * @return Status
+        */
+       public function concatenate( array $params ) {
+               // We are writing to an FS file, so we don't need to do this per-backend
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->concatenate( $realParams );
+       }
+
+       /**
+        * @see FileBackend::fileExists()
+        * @param $params array
+        */
+       public function fileExists( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->fileExists( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getFileTimestamp()
+        * @param $params array
+        * @return bool|string
+        */
+       public function getFileTimestamp( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getFileTimestamp( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getFileSize()
+        * @param $params array
+        * @return bool|int
+        */
+       public function getFileSize( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getFileSize( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getFileStat()
+        * @param $params array
+        * @return Array|bool|null
+        */
+       public function getFileStat( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getFileStat( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getFileContents()
+        * @param $params array
+        * @return bool|string
+        */
+       public function getFileContents( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getFileContents( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getFileSha1Base36()
+        * @param $params array
+        * @return bool|string
+        */
+       public function getFileSha1Base36( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getFileSha1Base36( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getFileProps()
+        * @param $params array
+        * @return Array
+        */
+       public function getFileProps( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getFileProps( $realParams );
+       }
+
+       /**
+        * @see FileBackend::streamFile()
+        * @param $params array
+        * @return \Status
+        */
+       public function streamFile( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->streamFile( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getLocalReference()
+        * @param $params array
+        * @return FSFile|null
+        */
+       public function getLocalReference( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getLocalReference( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getLocalCopy()
+        * @param $params array
+        * @return null|TempFSFile
+        */
+       public function getLocalCopy( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getLocalCopy( $realParams );
+       }
+
+       /**
+        * @see FileBackend::directoryExists()
+        * @param $params array
+        * @return bool|null
+        */
+       public function directoryExists( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->directoryExists( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getSubdirectoryList()
+        * @param $params array
+        * @return Array|null|Traversable
+        */
+       public function getDirectoryList( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getDirectoryList( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getFileList()
+        * @param $params array
+        * @return Array|null|\Traversable
+        */
+       public function getFileList( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getFileList( $realParams );
+       }
+
+       /**
+        * @see FileBackend::clearCache()
+        */
+       public function clearCache( array $paths = null ) {
+               foreach ( $this->backends as $backend ) {
+                       $realPaths = is_array( $paths ) ? $this->substPaths( $paths, $backend ) : null;
+                       $backend->clearCache( $realPaths );
+               }
+       }
+
+       /**
+        * @see FileBackend::getScopedLocksForOps()
+        */
+       public function getScopedLocksForOps( array $ops, Status $status ) {
+               $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $ops );
+               // Get the paths to lock from the master backend
+               $paths = $this->backends[$this->masterIndex]->getPathsToLockForOpsInternal( $fileOps );
+               // Get the paths under the proxy backend's name
+               $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
+               $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
+               return array(
+                       $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
+                       $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
+               );
+       }
+}
diff --git a/includes/filebackend/FileBackendStore.php b/includes/filebackend/FileBackendStore.php
new file mode 100644 (file)
index 0000000..9bec145
--- /dev/null
@@ -0,0 +1,1746 @@
+<?php
+/**
+ * Base class for all backends using particular storage medium.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * @brief Base class for all backends using particular storage medium.
+ *
+ * This class defines the methods as abstract that subclasses must implement.
+ * Outside callers should *not* use functions with "Internal" in the name.
+ *
+ * The FileBackend operations are implemented using basic functions
+ * such as storeInternal(), copyInternal(), deleteInternal() and the like.
+ * This class is also responsible for path resolution and sanitization.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+abstract class FileBackendStore extends FileBackend {
+       /** @var BagOStuff */
+       protected $memCache;
+       /** @var ProcessCacheLRU */
+       protected $cheapCache; // Map of paths to small (RAM/disk) cache items
+       /** @var ProcessCacheLRU */
+       protected $expensiveCache; // Map of paths to large (RAM/disk) cache items
+
+       /** @var Array Map of container names to sharding settings */
+       protected $shardViaHashLevels = array(); // (container name => config array)
+
+       protected $maxFileSize = 4294967296; // integer bytes (4GiB)
+
+       /**
+        * @see FileBackend::__construct()
+        *
+        * @param $config Array
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+               $this->memCache       = new EmptyBagOStuff(); // disabled by default
+               $this->cheapCache     = new ProcessCacheLRU( 300 );
+               $this->expensiveCache = new ProcessCacheLRU( 5 );
+       }
+
+       /**
+        * Get the maximum allowable file size given backend
+        * medium restrictions and basic performance constraints.
+        * Do not call this function from places outside FileBackend and FileOp.
+        *
+        * @return integer Bytes
+        */
+       final public function maxFileSizeInternal() {
+               return $this->maxFileSize;
+       }
+
+       /**
+        * Check if a file can be created at a given storage path.
+        * FS backends should check if the parent directory exists and the file is writable.
+        * Backends using key/value stores should check if the container exists.
+        *
+        * @param $storagePath string
+        * @return bool
+        */
+       abstract public function isPathUsableInternal( $storagePath );
+
+       /**
+        * Create a file in the backend with the given contents.
+        * Do not call this function from places outside FileBackend and FileOp.
+        *
+        * $params include:
+        *   - content       : the raw file contents
+        *   - dst           : destination storage path
+        *   - overwrite     : overwrite any file that exists at the destination
+        *   - async         : Status will be returned immediately if supported.
+        *                     If the status is OK, then its value field will be
+        *                     set to a FileBackendStoreOpHandle object.
+        *
+        * @param $params Array
+        * @return Status
+        */
+       final public function createInternal( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               if ( strlen( $params['content'] ) > $this->maxFileSizeInternal() ) {
+                       $status = Status::newFatal( 'backend-fail-maxsize',
+                               $params['dst'], $this->maxFileSizeInternal() );
+               } else {
+                       $status = $this->doCreateInternal( $params );
+                       $this->clearCache( array( $params['dst'] ) );
+                       $this->deleteFileCache( $params['dst'] ); // persistent cache
+               }
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::createInternal()
+        */
+       abstract protected function doCreateInternal( array $params );
+
+       /**
+        * Store a file into the backend from a file on disk.
+        * Do not call this function from places outside FileBackend and FileOp.
+        *
+        * $params include:
+        *   - src           : source path on disk
+        *   - dst           : destination storage path
+        *   - overwrite     : overwrite any file that exists at the destination
+        *   - async         : Status will be returned immediately if supported.
+        *                     If the status is OK, then its value field will be
+        *                     set to a FileBackendStoreOpHandle object.
+        *
+        * @param $params Array
+        * @return Status
+        */
+       final public function storeInternal( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               if ( filesize( $params['src'] ) > $this->maxFileSizeInternal() ) {
+                       $status = Status::newFatal( 'backend-fail-maxsize',
+                               $params['dst'], $this->maxFileSizeInternal() );
+               } else {
+                       $status = $this->doStoreInternal( $params );
+                       $this->clearCache( array( $params['dst'] ) );
+                       $this->deleteFileCache( $params['dst'] ); // persistent cache
+               }
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::storeInternal()
+        */
+       abstract protected function doStoreInternal( array $params );
+
+       /**
+        * Copy a file from one storage path to another in the backend.
+        * Do not call this function from places outside FileBackend and FileOp.
+        *
+        * $params include:
+        *   - src           : source storage path
+        *   - dst           : destination storage path
+        *   - overwrite     : overwrite any file that exists at the destination
+        *   - async         : Status will be returned immediately if supported.
+        *                     If the status is OK, then its value field will be
+        *                     set to a FileBackendStoreOpHandle object.
+        *
+        * @param $params Array
+        * @return Status
+        */
+       final public function copyInternal( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = $this->doCopyInternal( $params );
+               $this->clearCache( array( $params['dst'] ) );
+               $this->deleteFileCache( $params['dst'] ); // persistent cache
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::copyInternal()
+        */
+       abstract protected function doCopyInternal( array $params );
+
+       /**
+        * Delete a file at the storage path.
+        * Do not call this function from places outside FileBackend and FileOp.
+        *
+        * $params include:
+        *   - src                 : source storage path
+        *   - ignoreMissingSource : do nothing if the source file does not exist
+        *   - async               : Status will be returned immediately if supported.
+        *                           If the status is OK, then its value field will be
+        *                           set to a FileBackendStoreOpHandle object.
+        *
+        * @param $params Array
+        * @return Status
+        */
+       final public function deleteInternal( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = $this->doDeleteInternal( $params );
+               $this->clearCache( array( $params['src'] ) );
+               $this->deleteFileCache( $params['src'] ); // persistent cache
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::deleteInternal()
+        */
+       abstract protected function doDeleteInternal( array $params );
+
+       /**
+        * Move a file from one storage path to another in the backend.
+        * Do not call this function from places outside FileBackend and FileOp.
+        *
+        * $params include:
+        *   - src           : source storage path
+        *   - dst           : destination storage path
+        *   - overwrite     : overwrite any file that exists at the destination
+        *   - async         : Status will be returned immediately if supported.
+        *                     If the status is OK, then its value field will be
+        *                     set to a FileBackendStoreOpHandle object.
+        *
+        * @param $params Array
+        * @return Status
+        */
+       final public function moveInternal( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = $this->doMoveInternal( $params );
+               $this->clearCache( array( $params['src'], $params['dst'] ) );
+               $this->deleteFileCache( $params['src'] ); // persistent cache
+               $this->deleteFileCache( $params['dst'] ); // persistent cache
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::moveInternal()
+        * @return Status
+        */
+       protected function doMoveInternal( array $params ) {
+               unset( $params['async'] ); // two steps, won't work here :)
+               // Copy source to dest
+               $status = $this->copyInternal( $params );
+               if ( $status->isOK() ) {
+                       // Delete source (only fails due to races or medium going down)
+                       $status->merge( $this->deleteInternal( array( 'src' => $params['src'] ) ) );
+                       $status->setResult( true, $status->value ); // ignore delete() errors
+               }
+               return $status;
+       }
+
+       /**
+        * No-op file operation that does nothing.
+        * Do not call this function from places outside FileBackend and FileOp.
+        *
+        * @param $params Array
+        * @return Status
+        */
+       final public function nullInternal( array $params ) {
+               return Status::newGood();
+       }
+
+       /**
+        * @see FileBackend::concatenate()
+        * @return Status
+        */
+       final public function concatenate( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = Status::newGood();
+
+               // Try to lock the source files for the scope of this function
+               $scopeLockS = $this->getScopedFileLocks( $params['srcs'], LockManager::LOCK_UW, $status );
+               if ( $status->isOK() ) {
+                       // Actually do the concatenation
+                       $status->merge( $this->doConcatenate( $params ) );
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::concatenate()
+        * @return Status
+        */
+       protected function doConcatenate( array $params ) {
+               $status = Status::newGood();
+               $tmpPath = $params['dst']; // convenience
+
+               // Check that the specified temp file is valid...
+               wfSuppressWarnings();
+               $ok = ( is_file( $tmpPath ) && !filesize( $tmpPath ) );
+               wfRestoreWarnings();
+               if ( !$ok ) { // not present or not empty
+                       $status->fatal( 'backend-fail-opentemp', $tmpPath );
+                       return $status;
+               }
+
+               // Build up the temp file using the source chunks (in order)...
+               $tmpHandle = fopen( $tmpPath, 'ab' );
+               if ( $tmpHandle === false ) {
+                       $status->fatal( 'backend-fail-opentemp', $tmpPath );
+                       return $status;
+               }
+               foreach ( $params['srcs'] as $virtualSource ) {
+                       // Get a local FS version of the chunk
+                       $tmpFile = $this->getLocalReference( array( 'src' => $virtualSource ) );
+                       if ( !$tmpFile ) {
+                               $status->fatal( 'backend-fail-read', $virtualSource );
+                               return $status;
+                       }
+                       // Get a handle to the local FS version
+                       $sourceHandle = fopen( $tmpFile->getPath(), 'r' );
+                       if ( $sourceHandle === false ) {
+                               fclose( $tmpHandle );
+                               $status->fatal( 'backend-fail-read', $virtualSource );
+                               return $status;
+                       }
+                       // Append chunk to file (pass chunk size to avoid magic quotes)
+                       if ( !stream_copy_to_stream( $sourceHandle, $tmpHandle ) ) {
+                               fclose( $sourceHandle );
+                               fclose( $tmpHandle );
+                               $status->fatal( 'backend-fail-writetemp', $tmpPath );
+                               return $status;
+                       }
+                       fclose( $sourceHandle );
+               }
+               if ( !fclose( $tmpHandle ) ) {
+                       $status->fatal( 'backend-fail-closetemp', $tmpPath );
+                       return $status;
+               }
+
+               clearstatcache(); // temp file changed
+
+               return $status;
+       }
+
+       /**
+        * @see FileBackend::doPrepare()
+        * @return Status
+        */
+       final protected function doPrepare( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               $status = Status::newGood();
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
+                       wfProfileOut( __METHOD__ . '-' . $this->name );
+                       wfProfileOut( __METHOD__ );
+                       return $status; // invalid storage path
+               }
+
+               if ( $shard !== null ) { // confined to a single container/shard
+                       $status->merge( $this->doPrepareInternal( $fullCont, $dir, $params ) );
+               } else { // directory is on several shards
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+                               $status->merge( $this->doPrepareInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doPrepare()
+        * @return Status
+        */
+       protected function doPrepareInternal( $container, $dir, array $params ) {
+               return Status::newGood();
+       }
+
+       /**
+        * @see FileBackend::doSecure()
+        * @return Status
+        */
+       final protected function doSecure( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = Status::newGood();
+
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
+                       wfProfileOut( __METHOD__ . '-' . $this->name );
+                       wfProfileOut( __METHOD__ );
+                       return $status; // invalid storage path
+               }
+
+               if ( $shard !== null ) { // confined to a single container/shard
+                       $status->merge( $this->doSecureInternal( $fullCont, $dir, $params ) );
+               } else { // directory is on several shards
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+                               $status->merge( $this->doSecureInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doSecure()
+        * @return Status
+        */
+       protected function doSecureInternal( $container, $dir, array $params ) {
+               return Status::newGood();
+       }
+
+       /**
+        * @see FileBackend::doPublish()
+        * @return Status
+        */
+       final protected function doPublish( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = Status::newGood();
+
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
+                       wfProfileOut( __METHOD__ . '-' . $this->name );
+                       wfProfileOut( __METHOD__ );
+                       return $status; // invalid storage path
+               }
+
+               if ( $shard !== null ) { // confined to a single container/shard
+                       $status->merge( $this->doPublishInternal( $fullCont, $dir, $params ) );
+               } else { // directory is on several shards
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+                               $status->merge( $this->doPublishInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doPublish()
+        * @return Status
+        */
+       protected function doPublishInternal( $container, $dir, array $params ) {
+               return Status::newGood();
+       }
+
+       /**
+        * @see FileBackend::doClean()
+        * @return Status
+        */
+       final protected function doClean( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = Status::newGood();
+
+               // Recursive: first delete all empty subdirs recursively
+               if ( !empty( $params['recursive'] ) && !$this->directoriesAreVirtual() ) {
+                       $subDirsRel = $this->getTopDirectoryList( array( 'dir' => $params['dir'] ) );
+                       if ( $subDirsRel !== null ) { // no errors
+                               foreach ( $subDirsRel as $subDirRel ) {
+                                       $subDir = $params['dir'] . "/{$subDirRel}"; // full path
+                                       $status->merge( $this->doClean( array( 'dir' => $subDir ) + $params ) );
+                               }
+                       }
+               }
+
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
+                       wfProfileOut( __METHOD__ . '-' . $this->name );
+                       wfProfileOut( __METHOD__ );
+                       return $status; // invalid storage path
+               }
+
+               // Attempt to lock this directory...
+               $filesLockEx = array( $params['dir'] );
+               $scopedLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+               if ( !$status->isOK() ) {
+                       wfProfileOut( __METHOD__ . '-' . $this->name );
+                       wfProfileOut( __METHOD__ );
+                       return $status; // abort
+               }
+
+               if ( $shard !== null ) { // confined to a single container/shard
+                       $status->merge( $this->doCleanInternal( $fullCont, $dir, $params ) );
+                       $this->deleteContainerCache( $fullCont ); // purge cache
+               } else { // directory is on several shards
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+                               $status->merge( $this->doCleanInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+                               $this->deleteContainerCache( "{$fullCont}{$suffix}" ); // purge cache
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doClean()
+        * @return Status
+        */
+       protected function doCleanInternal( $container, $dir, array $params ) {
+               return Status::newGood();
+       }
+
+       /**
+        * @see FileBackend::fileExists()
+        * @return bool|null
+        */
+       final public function fileExists( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $stat = $this->getFileStat( $params );
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return ( $stat === null ) ? null : (bool)$stat; // null => failure
+       }
+
+       /**
+        * @see FileBackend::getFileTimestamp()
+        * @return bool
+        */
+       final public function getFileTimestamp( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $stat = $this->getFileStat( $params );
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $stat ? $stat['mtime'] : false;
+       }
+
+       /**
+        * @see FileBackend::getFileSize()
+        * @return bool
+        */
+       final public function getFileSize( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $stat = $this->getFileStat( $params );
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $stat ? $stat['size'] : false;
+       }
+
+       /**
+        * @see FileBackend::getFileStat()
+        * @return bool
+        */
+       final public function getFileStat( array $params ) {
+               $path = self::normalizeStoragePath( $params['src'] );
+               if ( $path === null ) {
+                       return false; // invalid storage path
+               }
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $latest = !empty( $params['latest'] ); // use latest data?
+               if ( !$this->cheapCache->has( $path, 'stat' ) ) {
+                       $this->primeFileCache( array( $path ) ); // check persistent cache
+               }
+               if ( $this->cheapCache->has( $path, 'stat' ) ) {
+                       $stat = $this->cheapCache->get( $path, 'stat' );
+                       // If we want the latest data, check that this cached
+                       // value was in fact fetched with the latest available data.
+                       if ( !$latest || $stat['latest'] ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
+                               return $stat;
+                       }
+               }
+               wfProfileIn( __METHOD__ . '-miss' );
+               wfProfileIn( __METHOD__ . '-miss-' . $this->name );
+               $stat = $this->doGetFileStat( $params );
+               wfProfileOut( __METHOD__ . '-miss-' . $this->name );
+               wfProfileOut( __METHOD__ . '-miss' );
+               if ( is_array( $stat ) ) { // don't cache negatives
+                       $stat['latest'] = $latest;
+                       $this->cheapCache->set( $path, 'stat', $stat );
+                       $this->setFileCache( $path, $stat ); // update persistent cache
+                       if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
+                               $this->cheapCache->set( $path, 'sha1',
+                                       array( 'hash' => $stat['sha1'], 'latest' => $latest ) );
+                       }
+               } else {
+                       wfDebug( __METHOD__ . ": File $path does not exist.\n" );
+               }
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $stat;
+       }
+
+       /**
+        * @see FileBackendStore::getFileStat()
+        */
+       abstract protected function doGetFileStat( array $params );
+
+       /**
+        * @see FileBackend::getFileContents()
+        * @return bool|string
+        */
+       public function getFileContents( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $tmpFile = $this->getLocalReference( $params );
+               if ( !$tmpFile ) {
+                       wfProfileOut( __METHOD__ . '-' . $this->name );
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+               wfSuppressWarnings();
+               $data = file_get_contents( $tmpFile->getPath() );
+               wfRestoreWarnings();
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $data;
+       }
+
+       /**
+        * @see FileBackend::getFileSha1Base36()
+        * @return bool|string
+        */
+       final public function getFileSha1Base36( array $params ) {
+               $path = self::normalizeStoragePath( $params['src'] );
+               if ( $path === null ) {
+                       return false; // invalid storage path
+               }
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $latest = !empty( $params['latest'] ); // use latest data?
+               if ( $this->cheapCache->has( $path, 'sha1' ) ) {
+                       $stat = $this->cheapCache->get( $path, 'sha1' );
+                       // If we want the latest data, check that this cached
+                       // value was in fact fetched with the latest available data.
+                       if ( !$latest || $stat['latest'] ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
+                               return $stat['hash'];
+                       }
+               }
+               wfProfileIn( __METHOD__ . '-miss' );
+               wfProfileIn( __METHOD__ . '-miss-' . $this->name );
+               $hash = $this->doGetFileSha1Base36( $params );
+               wfProfileOut( __METHOD__ . '-miss-' . $this->name );
+               wfProfileOut( __METHOD__ . '-miss' );
+               if ( $hash ) { // don't cache negatives
+                       $this->cheapCache->set( $path, 'sha1',
+                               array( 'hash' => $hash, 'latest' => $latest ) );
+               }
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $hash;
+       }
+
+       /**
+        * @see FileBackendStore::getFileSha1Base36()
+        * @return bool|string
+        */
+       protected function doGetFileSha1Base36( array $params ) {
+               $fsFile = $this->getLocalReference( $params );
+               if ( !$fsFile ) {
+                       return false;
+               } else {
+                       return $fsFile->getSha1Base36();
+               }
+       }
+
+       /**
+        * @see FileBackend::getFileProps()
+        * @return Array
+        */
+       final public function getFileProps( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $fsFile = $this->getLocalReference( $params );
+               $props = $fsFile ? $fsFile->getProps() : FSFile::placeholderProps();
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $props;
+       }
+
+       /**
+        * @see FileBackend::getLocalReference()
+        * @return TempFSFile|null
+        */
+       public function getLocalReference( array $params ) {
+               $path = self::normalizeStoragePath( $params['src'] );
+               if ( $path === null ) {
+                       return null; // invalid storage path
+               }
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $latest = !empty( $params['latest'] ); // use latest data?
+               if ( $this->expensiveCache->has( $path, 'localRef' ) ) {
+                       $val = $this->expensiveCache->get( $path, 'localRef' );
+                       // If we want the latest data, check that this cached
+                       // value was in fact fetched with the latest available data.
+                       if ( !$latest || $val['latest'] ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
+                               return $val['object'];
+                       }
+               }
+               $tmpFile = $this->getLocalCopy( $params );
+               if ( $tmpFile ) { // don't cache negatives
+                       $this->expensiveCache->set( $path, 'localRef',
+                               array( 'object' => $tmpFile, 'latest' => $latest ) );
+               }
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $tmpFile;
+       }
+
+       /**
+        * @see FileBackend::streamFile()
+        * @return Status
+        */
+       final public function streamFile( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = Status::newGood();
+
+               $info = $this->getFileStat( $params );
+               if ( !$info ) { // let StreamFile handle the 404
+                       $status->fatal( 'backend-fail-notexists', $params['src'] );
+               }
+
+               // Set output buffer and HTTP headers for stream
+               $extraHeaders = isset( $params['headers'] ) ? $params['headers'] : array();
+               $res = StreamFile::prepareForStream( $params['src'], $info, $extraHeaders );
+               if ( $res == StreamFile::NOT_MODIFIED ) {
+                       // do nothing; client cache is up to date
+               } elseif ( $res == StreamFile::READY_STREAM ) {
+                       wfProfileIn( __METHOD__ . '-send' );
+                       wfProfileIn( __METHOD__ . '-send-' . $this->name );
+                       $status = $this->doStreamFile( $params );
+                       wfProfileOut( __METHOD__ . '-send-' . $this->name );
+                       wfProfileOut( __METHOD__ . '-send' );
+               } else {
+                       $status->fatal( 'backend-fail-stream', $params['src'] );
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::streamFile()
+        * @return Status
+        */
+       protected function doStreamFile( array $params ) {
+               $status = Status::newGood();
+
+               $fsFile = $this->getLocalReference( $params );
+               if ( !$fsFile ) {
+                       $status->fatal( 'backend-fail-stream', $params['src'] );
+               } elseif ( !readfile( $fsFile->getPath() ) ) {
+                       $status->fatal( 'backend-fail-stream', $params['src'] );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FileBackend::directoryExists()
+        * @return bool|null
+        */
+       final public function directoryExists( array $params ) {
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) {
+                       return false; // invalid storage path
+               }
+               if ( $shard !== null ) { // confined to a single container/shard
+                       return $this->doDirectoryExists( $fullCont, $dir, $params );
+               } else { // directory is on several shards
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       $res = false; // response
+                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+                               $exists = $this->doDirectoryExists( "{$fullCont}{$suffix}", $dir, $params );
+                               if ( $exists ) {
+                                       $res = true;
+                                       break; // found one!
+                               } elseif ( $exists === null ) { // error?
+                                       $res = null; // if we don't find anything, it is indeterminate
+                               }
+                       }
+                       return $res;
+               }
+       }
+
+       /**
+        * @see FileBackendStore::directoryExists()
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return bool|null
+        */
+       abstract protected function doDirectoryExists( $container, $dir, array $params );
+
+       /**
+        * @see FileBackend::getDirectoryList()
+        * @return Traversable|Array|null Returns null on failure
+        */
+       final public function getDirectoryList( array $params ) {
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) { // invalid storage path
+                       return null;
+               }
+               if ( $shard !== null ) {
+                       // File listing is confined to a single container/shard
+                       return $this->getDirectoryListInternal( $fullCont, $dir, $params );
+               } else {
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       // File listing spans multiple containers/shards
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       return new FileBackendStoreShardDirIterator( $this,
+                               $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
+               }
+       }
+
+       /**
+        * Do not call this function from places outside FileBackend
+        *
+        * @see FileBackendStore::getDirectoryList()
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return Traversable|Array|null Returns null on failure
+        */
+       abstract public function getDirectoryListInternal( $container, $dir, array $params );
+
+       /**
+        * @see FileBackend::getFileList()
+        * @return Traversable|Array|null Returns null on failure
+        */
+       final public function getFileList( array $params ) {
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) { // invalid storage path
+                       return null;
+               }
+               if ( $shard !== null ) {
+                       // File listing is confined to a single container/shard
+                       return $this->getFileListInternal( $fullCont, $dir, $params );
+               } else {
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       // File listing spans multiple containers/shards
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       return new FileBackendStoreShardFileIterator( $this,
+                               $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
+               }
+       }
+
+       /**
+        * Do not call this function from places outside FileBackend
+        *
+        * @see FileBackendStore::getFileList()
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return Traversable|Array|null Returns null on failure
+        */
+       abstract public function getFileListInternal( $container, $dir, array $params );
+
+       /**
+        * Return a list of FileOp objects from a list of operations.
+        * Do not call this function from places outside FileBackend.
+        *
+        * The result must have the same number of items as the input.
+        * An exception is thrown if an unsupported operation is requested.
+        *
+        * @param $ops Array Same format as doOperations()
+        * @return Array List of FileOp objects
+        * @throws MWException
+        */
+       final public function getOperationsInternal( array $ops ) {
+               $supportedOps = array(
+                       'store'       => 'StoreFileOp',
+                       'copy'        => 'CopyFileOp',
+                       'move'        => 'MoveFileOp',
+                       'delete'      => 'DeleteFileOp',
+                       'create'      => 'CreateFileOp',
+                       'null'        => 'NullFileOp'
+               );
+
+               $performOps = array(); // array of FileOp objects
+               // Build up ordered array of FileOps...
+               foreach ( $ops as $operation ) {
+                       $opName = $operation['op'];
+                       if ( isset( $supportedOps[$opName] ) ) {
+                               $class = $supportedOps[$opName];
+                               // Get params for this operation
+                               $params = $operation;
+                               // Append the FileOp class
+                               $performOps[] = new $class( $this, $params );
+                       } else {
+                               throw new MWException( "Operation '$opName' is not supported." );
+                       }
+               }
+
+               return $performOps;
+       }
+
+       /**
+        * Get a list of storage paths to lock for a list of operations
+        * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
+        * each corresponding to a list of storage paths to be locked.
+        *
+        * @param $performOps Array List of FileOp objects
+        * @return Array ('sh' => list of paths, 'ex' => list of paths)
+        */
+       final public function getPathsToLockForOpsInternal( array $performOps ) {
+               // Build up a list of files to lock...
+               $paths = array( 'sh' => array(), 'ex' => array() );
+               foreach ( $performOps as $fileOp ) {
+                       $paths['sh'] = array_merge( $paths['sh'], $fileOp->storagePathsRead() );
+                       $paths['ex'] = array_merge( $paths['ex'], $fileOp->storagePathsChanged() );
+               }
+               // Optimization: if doing an EX lock anyway, don't also set an SH one
+               $paths['sh'] = array_diff( $paths['sh'], $paths['ex'] );
+               // Get a shared lock on the parent directory of each path changed
+               $paths['sh'] = array_merge( $paths['sh'], array_map( 'dirname', $paths['ex'] ) );
+
+               return $paths;
+       }
+
+       /**
+        * @see FileBackend::getScopedLocksForOps()
+        * @return Array
+        */
+       public function getScopedLocksForOps( array $ops, Status $status ) {
+               $paths = $this->getPathsToLockForOpsInternal( $this->getOperationsInternal( $ops ) );
+               return array(
+                       $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
+                       $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
+               );
+       }
+
+       /**
+        * @see FileBackend::doOperationsInternal()
+        * @return Status
+        */
+       final protected function doOperationsInternal( array $ops, array $opts ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = Status::newGood();
+
+               // Build up a list of FileOps...
+               $performOps = $this->getOperationsInternal( $ops );
+
+               // Acquire any locks as needed...
+               if ( empty( $opts['nonLocking'] ) ) {
+                       // Build up a list of files to lock...
+                       $paths = $this->getPathsToLockForOpsInternal( $performOps );
+                       // Try to lock those files for the scope of this function...
+                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
+                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
+                       if ( !$status->isOK() ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
+                               return $status; // abort
+                       }
+               }
+
+               // Clear any file cache entries (after locks acquired)
+               if ( empty( $opts['preserveCache'] ) ) {
+                       $this->clearCache();
+               }
+
+               // Load from the persistent file and container caches
+               $this->primeFileCache( $performOps );
+               $this->primeContainerCache( $performOps );
+
+               // Actually attempt the operation batch...
+               $subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
+
+               // Merge errors into status fields
+               $status->merge( $subStatus );
+               $status->success = $subStatus->success; // not done in merge()
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackend::doQuickOperationsInternal()
+        * @return Status
+        * @throws MWException
+        */
+       final protected function doQuickOperationsInternal( array $ops ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = Status::newGood();
+
+               $supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'null' );
+               $async = ( $this->parallelize === 'implicit' );
+               $maxConcurrency = $this->concurrency; // throttle
+
+               $statuses = array(); // array of (index => Status)
+               $fileOpHandles = array(); // list of (index => handle) arrays
+               $curFileOpHandles = array(); // current handle batch
+               // Perform the sync-only ops and build up op handles for the async ops...
+               foreach ( $ops as $index => $params ) {
+                       if ( !in_array( $params['op'], $supportedOps ) ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
+                               throw new MWException( "Operation '{$params['op']}' is not supported." );
+                       }
+                       $method = $params['op'] . 'Internal'; // e.g. "storeInternal"
+                       $subStatus = $this->$method( array( 'async' => $async ) + $params );
+                       if ( $subStatus->value instanceof FileBackendStoreOpHandle ) { // async
+                               if ( count( $curFileOpHandles ) >= $maxConcurrency ) {
+                                       $fileOpHandles[] = $curFileOpHandles; // push this batch
+                                       $curFileOpHandles = array();
+                               }
+                               $curFileOpHandles[$index] = $subStatus->value; // keep index
+                       } else { // error or completed
+                               $statuses[$index] = $subStatus; // keep index
+                       }
+               }
+               if ( count( $curFileOpHandles ) ) {
+                       $fileOpHandles[] = $curFileOpHandles; // last batch
+               }
+               // Do all the async ops that can be done concurrently...
+               foreach ( $fileOpHandles as $fileHandleBatch ) {
+                       $statuses = $statuses + $this->executeOpHandlesInternal( $fileHandleBatch );
+               }
+               // Marshall and merge all the responses...
+               foreach ( $statuses as $index => $subStatus ) {
+                       $status->merge( $subStatus );
+                       if ( $subStatus->isOK() ) {
+                               $status->success[$index] = true;
+                               ++$status->successCount;
+                       } else {
+                               $status->success[$index] = false;
+                               ++$status->failCount;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * Execute a list of FileBackendStoreOpHandle handles in parallel.
+        * The resulting Status object fields will correspond
+        * to the order in which the handles where given.
+        *
+        * @param $handles Array List of FileBackendStoreOpHandle objects
+        * @return Array Map of Status objects
+        * @throws MWException
+        */
+       final public function executeOpHandlesInternal( array $fileOpHandles ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               foreach ( $fileOpHandles as $fileOpHandle ) {
+                       if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
+                               throw new MWException( "Given a non-FileBackendStoreOpHandle object." );
+                       } elseif ( $fileOpHandle->backend->getName() !== $this->getName() ) {
+                               throw new MWException( "Given a FileBackendStoreOpHandle for the wrong backend." );
+                       }
+               }
+               $res = $this->doExecuteOpHandlesInternal( $fileOpHandles );
+               foreach ( $fileOpHandles as $fileOpHandle ) {
+                       $fileOpHandle->closeResources();
+               }
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see FileBackendStore::executeOpHandlesInternal()
+        * @return Array List of corresponding Status objects
+        */
+       protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
+               foreach ( $fileOpHandles as $fileOpHandle ) { // OK if empty
+                       throw new MWException( "This backend supports no asynchronous operations." );
+               }
+               return array();
+       }
+
+       /**
+        * @see FileBackend::preloadCache()
+        */
+       final public function preloadCache( array $paths ) {
+               $fullConts = array(); // full container names
+               foreach ( $paths as $path ) {
+                       list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
+                       $fullConts[] = $fullCont;
+               }
+               // Load from the persistent file and container caches
+               $this->primeContainerCache( $fullConts );
+               $this->primeFileCache( $paths );
+       }
+
+       /**
+        * @see FileBackend::clearCache()
+        */
+       final public function clearCache( array $paths = null ) {
+               if ( is_array( $paths ) ) {
+                       $paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
+                       $paths = array_filter( $paths, 'strlen' ); // remove nulls
+               }
+               if ( $paths === null ) {
+                       $this->cheapCache->clear();
+                       $this->expensiveCache->clear();
+               } else {
+                       foreach ( $paths as $path ) {
+                               $this->cheapCache->clear( $path );
+                               $this->expensiveCache->clear( $path );
+                       }
+               }
+               $this->doClearCache( $paths );
+       }
+
+       /**
+        * Clears any additional stat caches for storage paths
+        *
+        * @see FileBackend::clearCache()
+        *
+        * @param $paths Array Storage paths (optional)
+        * @return void
+        */
+       protected function doClearCache( array $paths = null ) {}
+
+       /**
+        * Is this a key/value store where directories are just virtual?
+        * Virtual directories exists in so much as files exists that are
+        * prefixed with the directory path followed by a forward slash.
+        *
+        * @return bool
+        */
+       abstract protected function directoriesAreVirtual();
+
+       /**
+        * Check if a container name is valid.
+        * This checks for for length and illegal characters.
+        *
+        * @param $container string
+        * @return bool
+        */
+       final protected static function isValidContainerName( $container ) {
+               // This accounts for Swift and S3 restrictions while leaving room
+               // for things like '.xxx' (hex shard chars) or '.seg' (segments).
+               // This disallows directory separators or traversal characters.
+               // Note that matching strings URL encode to the same string;
+               // in Swift, the length restriction is *after* URL encoding.
+               return preg_match( '/^[a-z0-9][a-z0-9-_]{0,199}$/i', $container );
+       }
+
+       /**
+        * Splits a storage path into an internal container name,
+        * an internal relative file name, and a container shard suffix.
+        * Any shard suffix is already appended to the internal container name.
+        * This also checks that the storage path is valid and within this backend.
+        *
+        * If the container is sharded but a suffix could not be determined,
+        * this means that the path can only refer to a directory and can only
+        * be scanned by looking in all the container shards.
+        *
+        * @param $storagePath string
+        * @return Array (container, path, container suffix) or (null, null, null) if invalid
+        */
+       final protected function resolveStoragePath( $storagePath ) {
+               list( $backend, $container, $relPath ) = self::splitStoragePath( $storagePath );
+               if ( $backend === $this->name ) { // must be for this backend
+                       $relPath = self::normalizeContainerPath( $relPath );
+                       if ( $relPath !== null ) {
+                               // Get shard for the normalized path if this container is sharded
+                               $cShard = $this->getContainerShard( $container, $relPath );
+                               // Validate and sanitize the relative path (backend-specific)
+                               $relPath = $this->resolveContainerPath( $container, $relPath );
+                               if ( $relPath !== null ) {
+                                       // Prepend any wiki ID prefix to the container name
+                                       $container = $this->fullContainerName( $container );
+                                       if ( self::isValidContainerName( $container ) ) {
+                                               // Validate and sanitize the container name (backend-specific)
+                                               $container = $this->resolveContainerName( "{$container}{$cShard}" );
+                                               if ( $container !== null ) {
+                                                       return array( $container, $relPath, $cShard );
+                                               }
+                                       }
+                               }
+                       }
+               }
+               return array( null, null, null );
+       }
+
+       /**
+        * Like resolveStoragePath() except null values are returned if
+        * the container is sharded and the shard could not be determined.
+        *
+        * @see FileBackendStore::resolveStoragePath()
+        *
+        * @param $storagePath string
+        * @return Array (container, path) or (null, null) if invalid
+        */
+       final protected function resolveStoragePathReal( $storagePath ) {
+               list( $container, $relPath, $cShard ) = $this->resolveStoragePath( $storagePath );
+               if ( $cShard !== null ) {
+                       return array( $container, $relPath );
+               }
+               return array( null, null );
+       }
+
+       /**
+        * Get the container name shard suffix for a given path.
+        * Any empty suffix means the container is not sharded.
+        *
+        * @param $container string Container name
+        * @param $relPath string Storage path relative to the container
+        * @return string|null Returns null if shard could not be determined
+        */
+       final protected function getContainerShard( $container, $relPath ) {
+               list( $levels, $base, $repeat ) = $this->getContainerHashLevels( $container );
+               if ( $levels == 1 || $levels == 2 ) {
+                       // Hash characters are either base 16 or 36
+                       $char = ( $base == 36 ) ? '[0-9a-z]' : '[0-9a-f]';
+                       // Get a regex that represents the shard portion of paths.
+                       // The concatenation of the captures gives us the shard.
+                       if ( $levels === 1 ) { // 16 or 36 shards per container
+                               $hashDirRegex = '(' . $char . ')';
+                       } else { // 256 or 1296 shards per container
+                               if ( $repeat ) { // verbose hash dir format (e.g. "a/ab/abc")
+                                       $hashDirRegex = $char . '/(' . $char . '{2})';
+                               } else { // short hash dir format (e.g. "a/b/c")
+                                       $hashDirRegex = '(' . $char . ')/(' . $char . ')';
+                               }
+                       }
+                       // Allow certain directories to be above the hash dirs so as
+                       // to work with FileRepo (e.g. "archive/a/ab" or "temp/a/ab").
+                       // They must be 2+ chars to avoid any hash directory ambiguity.
+                       $m = array();
+                       if ( preg_match( "!^(?:[^/]{2,}/)*$hashDirRegex(?:/|$)!", $relPath, $m ) ) {
+                               return '.' . implode( '', array_slice( $m, 1 ) );
+                       }
+                       return null; // failed to match
+               }
+               return ''; // no sharding
+       }
+
+       /**
+        * Check if a storage path maps to a single shard.
+        * Container dirs like "a", where the container shards on "x/xy",
+        * can reside on several shards. Such paths are tricky to handle.
+        *
+        * @param $storagePath string Storage path
+        * @return bool
+        */
+       final public function isSingleShardPathInternal( $storagePath ) {
+               list( $c, $r, $shard ) = $this->resolveStoragePath( $storagePath );
+               return ( $shard !== null );
+       }
+
+       /**
+        * Get the sharding config for a container.
+        * If greater than 0, then all file storage paths within
+        * the container are required to be hashed accordingly.
+        *
+        * @param $container string
+        * @return Array (integer levels, integer base, repeat flag) or (0, 0, false)
+        */
+       final protected function getContainerHashLevels( $container ) {
+               if ( isset( $this->shardViaHashLevels[$container] ) ) {
+                       $config = $this->shardViaHashLevels[$container];
+                       $hashLevels = (int)$config['levels'];
+                       if ( $hashLevels == 1 || $hashLevels == 2 ) {
+                               $hashBase = (int)$config['base'];
+                               if ( $hashBase == 16 || $hashBase == 36 ) {
+                                       return array( $hashLevels, $hashBase, $config['repeat'] );
+                               }
+                       }
+               }
+               return array( 0, 0, false ); // no sharding
+       }
+
+       /**
+        * Get a list of full container shard suffixes for a container
+        *
+        * @param $container string
+        * @return Array
+        */
+       final protected function getContainerSuffixes( $container ) {
+               $shards = array();
+               list( $digits, $base ) = $this->getContainerHashLevels( $container );
+               if ( $digits > 0 ) {
+                       $numShards = pow( $base, $digits );
+                       for ( $index = 0; $index < $numShards; $index++ ) {
+                               $shards[] = '.' . wfBaseConvert( $index, 10, $base, $digits );
+                       }
+               }
+               return $shards;
+       }
+
+       /**
+        * Get the full container name, including the wiki ID prefix
+        *
+        * @param $container string
+        * @return string
+        */
+       final protected function fullContainerName( $container ) {
+               if ( $this->wikiId != '' ) {
+                       return "{$this->wikiId}-$container";
+               } else {
+                       return $container;
+               }
+       }
+
+       /**
+        * Resolve a container name, checking if it's allowed by the backend.
+        * This is intended for internal use, such as encoding illegal chars.
+        * Subclasses can override this to be more restrictive.
+        *
+        * @param $container string
+        * @return string|null
+        */
+       protected function resolveContainerName( $container ) {
+               return $container;
+       }
+
+       /**
+        * Resolve a relative storage path, checking if it's allowed by the backend.
+        * This is intended for internal use, such as encoding illegal chars or perhaps
+        * getting absolute paths (e.g. FS based backends). Note that the relative path
+        * may be the empty string (e.g. the path is simply to the container).
+        *
+        * @param $container string Container name
+        * @param $relStoragePath string Storage path relative to the container
+        * @return string|null Path or null if not valid
+        */
+       protected function resolveContainerPath( $container, $relStoragePath ) {
+               return $relStoragePath;
+       }
+
+       /**
+        * Get the cache key for a container
+        *
+        * @param $container string Resolved container name
+        * @return string
+        */
+       private function containerCacheKey( $container ) {
+               return wfMemcKey( 'backend', $this->getName(), 'container', $container );
+       }
+
+       /**
+        * Set the cached info for a container
+        *
+        * @param $container string Resolved container name
+        * @param $val mixed Information to cache
+        */
+       final protected function setContainerCache( $container, $val ) {
+               $this->memCache->add( $this->containerCacheKey( $container ), $val, 14*86400 );
+       }
+
+       /**
+        * Delete the cached info for a container.
+        * The cache key is salted for a while to prevent race conditions.
+        *
+        * @param $container string Resolved container name
+        */
+       final protected function deleteContainerCache( $container ) {
+               if ( !$this->memCache->set( $this->containerCacheKey( $container ), 'PURGED', 300 ) ) {
+                       trigger_error( "Unable to delete stat cache for container $container." );
+               }
+       }
+
+       /**
+        * Do a batch lookup from cache for container stats for all containers
+        * used in a list of container names, storage paths, or FileOp objects.
+        *
+        * @param $items Array
+        * @return void
+        */
+       final protected function primeContainerCache( array $items ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               $paths = array(); // list of storage paths
+               $contNames = array(); // (cache key => resolved container name)
+               // Get all the paths/containers from the items...
+               foreach ( $items as $item ) {
+                       if ( $item instanceof FileOp ) {
+                               $paths = array_merge( $paths, $item->storagePathsRead() );
+                               $paths = array_merge( $paths, $item->storagePathsChanged() );
+                       } elseif ( self::isStoragePath( $item ) ) {
+                               $paths[] = $item;
+                       } elseif ( is_string( $item ) ) { // full container name
+                               $contNames[$this->containerCacheKey( $item )] = $item;
+                       }
+               }
+               // Get all the corresponding cache keys for paths...
+               foreach ( $paths as $path ) {
+                       list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
+                       if ( $fullCont !== null ) { // valid path for this backend
+                               $contNames[$this->containerCacheKey( $fullCont )] = $fullCont;
+                       }
+               }
+
+               $contInfo = array(); // (resolved container name => cache value)
+               // Get all cache entries for these container cache keys...
+               $values = $this->memCache->getMulti( array_keys( $contNames ) );
+               foreach ( $values as $cacheKey => $val ) {
+                       $contInfo[$contNames[$cacheKey]] = $val;
+               }
+
+               // Populate the container process cache for the backend...
+               $this->doPrimeContainerCache( array_filter( $contInfo, 'is_array' ) );
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Fill the backend-specific process cache given an array of
+        * resolved container names and their corresponding cached info.
+        * Only containers that actually exist should appear in the map.
+        *
+        * @param $containerInfo Array Map of resolved container names to cached info
+        * @return void
+        */
+       protected function doPrimeContainerCache( array $containerInfo ) {}
+
+       /**
+        * Get the cache key for a file path
+        *
+        * @param $path string Storage path
+        * @return string
+        */
+       private function fileCacheKey( $path ) {
+               return wfMemcKey( 'backend', $this->getName(), 'file', sha1( $path ) );
+       }
+
+       /**
+        * Set the cached stat info for a file path
+        *
+        * @param $path string Storage path
+        * @param $val mixed Information to cache
+        */
+       final protected function setFileCache( $path, $val ) {
+               $this->memCache->add( $this->fileCacheKey( $path ), $val, 7*86400 );
+       }
+
+       /**
+        * Delete the cached stat info for a file path.
+        * The cache key is salted for a while to prevent race conditions.
+        *
+        * @param $path string Storage path
+        */
+       final protected function deleteFileCache( $path ) {
+               if ( !$this->memCache->set( $this->fileCacheKey( $path ), 'PURGED', 300 ) ) {
+                       trigger_error( "Unable to delete stat cache for file $path." );
+               }
+       }
+
+       /**
+        * Do a batch lookup from cache for file stats for all paths
+        * used in a list of storage paths or FileOp objects.
+        *
+        * @param $items Array List of storage paths or FileOps
+        * @return void
+        */
+       final protected function primeFileCache( array $items ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               $paths = array(); // list of storage paths
+               $pathNames = array(); // (cache key => storage path)
+               // Get all the paths/containers from the items...
+               foreach ( $items as $item ) {
+                       if ( $item instanceof FileOp ) {
+                               $paths = array_merge( $paths, $item->storagePathsRead() );
+                               $paths = array_merge( $paths, $item->storagePathsChanged() );
+                       } elseif ( self::isStoragePath( $item ) ) {
+                               $paths[] = $item;
+                       }
+               }
+               // Get all the corresponding cache keys for paths...
+               foreach ( $paths as $path ) {
+                       list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
+                       if ( $rel !== null ) { // valid path for this backend
+                               $pathNames[$this->fileCacheKey( $path )] = $path;
+                       }
+               }
+               // Get all cache entries for these container cache keys...
+               $values = $this->memCache->getMulti( array_keys( $pathNames ) );
+               foreach ( $values as $cacheKey => $val ) {
+                       if ( is_array( $val ) ) {
+                               $path = $pathNames[$cacheKey];
+                               $this->cheapCache->set( $path, 'stat', $val );
+                               if ( isset( $val['sha1'] ) ) { // some backends store SHA-1 as metadata
+                                       $this->cheapCache->set( $path, 'sha1',
+                                               array( 'hash' => $val['sha1'], 'latest' => $val['latest'] ) );
+                               }
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+       }
+}
+
+/**
+ * FileBackendStore helper class for performing asynchronous file operations.
+ *
+ * For example, calling FileBackendStore::createInternal() with the "async"
+ * param flag may result in a Status that contains this object as a value.
+ * This class is largely backend-specific and is mostly just "magic" to be
+ * passed to FileBackendStore::executeOpHandlesInternal().
+ */
+abstract class FileBackendStoreOpHandle {
+       /** @var Array */
+       public $params = array(); // params to caller functions
+       /** @var FileBackendStore */
+       public $backend;
+       /** @var Array */
+       public $resourcesToClose = array();
+
+       public $call; // string; name that identifies the function called
+
+       /**
+        * Close all open file handles
+        *
+        * @return void
+        */
+       public function closeResources() {
+               array_map( 'fclose', $this->resourcesToClose );
+       }
+}
+
+/**
+ * FileBackendStore helper function to handle listings that span container shards.
+ * Do not use this class from places outside of FileBackendStore.
+ *
+ * @ingroup FileBackend
+ */
+abstract class FileBackendStoreShardListIterator implements Iterator {
+       /** @var FileBackendStore */
+       protected $backend;
+       /** @var Array */
+       protected $params;
+       /** @var Array */
+       protected $shardSuffixes;
+       protected $container; // string; full container name
+       protected $directory; // string; resolved relative path
+
+       /** @var Traversable */
+       protected $iter;
+       protected $curShard = 0; // integer
+       protected $pos = 0; // integer
+
+       /** @var Array */
+       protected $multiShardPaths = array(); // (rel path => 1)
+
+       /**
+        * @param $backend FileBackendStore
+        * @param $container string Full storage container name
+        * @param $dir string Storage directory relative to container
+        * @param $suffixes Array List of container shard suffixes
+        * @param $params Array
+        */
+       public function __construct(
+               FileBackendStore $backend, $container, $dir, array $suffixes, array $params
+       ) {
+               $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
+               }
+               return false; // some failure?
+       }
+
+       /**
+        * @see Iterator::current()
+        * @return string|bool String or false
+        */
+       public function current() {
+               return ( $this->iter instanceof Iterator )
+                       ? $this->iter->current()
+                       : current( $this->iter );
+       }
+
+       /**
+        * @see Iterator::next()
+        * @return void
+        */
+       public function next() {
+               ++$this->pos;
+               ( $this->iter instanceof Iterator ) ? $this->iter->next() : next( $this->iter );
+               do {
+                       $continue = false; // keep scanning shards?
+                       $this->filterViaNext(); // filter out duplicates
+                       // Find the next non-empty shard if no elements are left
+                       if ( !$this->valid() ) {
+                               $this->nextShardIteratorIfNotValid();
+                               $continue = $this->valid(); // re-filter unless we ran out of shards
+                       }
+               } while ( $continue );
+       }
+
+       /**
+        * @see Iterator::rewind()
+        * @return void
+        */
+       public function rewind() {
+               $this->pos = 0;
+               $this->curShard = 0;
+               $this->setIteratorFromCurrentShard();
+               do {
+                       $continue = false; // keep scanning shards?
+                       $this->filterViaNext(); // filter out duplicates
+                       // Find the next non-empty shard if no elements are left
+                       if ( !$this->valid() ) {
+                               $this->nextShardIteratorIfNotValid();
+                               $continue = $this->valid(); // re-filter unless we ran out of shards
+                       }
+               } while ( $continue );
+       }
+
+       /**
+        * 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();
+               }
+       }
+
+       /**
+        * 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 );
+               }
+       }
+
+       /**
+        * Get the list for a given container shard
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return Traversable|Array|null
+        */
+       abstract protected function listFromShard( $container, $dir, array $params );
+}
+
+/**
+ * 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 );
+       }
+}
+
+/**
+ * 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 );
+       }
+}
diff --git a/includes/filebackend/FileOp.php b/includes/filebackend/FileOp.php
new file mode 100644 (file)
index 0000000..fa87c3a
--- /dev/null
@@ -0,0 +1,778 @@
+<?php
+/**
+ * Helper class for representing operations with transaction support.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * FileBackend helper class for representing operations.
+ * Do not use this class from places outside FileBackend.
+ *
+ * Methods called from FileOpBatch::attempt() should avoid throwing
+ * exceptions at all costs. FileOp objects should be lightweight in order
+ * to support large arrays in memory and serialization.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+abstract class FileOp {
+       /** @var Array */
+       protected $params = array();
+       /** @var FileBackendStore */
+       protected $backend;
+
+       protected $state = self::STATE_NEW; // integer
+       protected $failed = false; // boolean
+       protected $async = false; // boolean
+       protected $useLatest = true; // boolean
+       protected $batchId; // string
+
+       protected $sourceSha1; // string
+       protected $destSameAsSource; // boolean
+
+       /* Object life-cycle */
+       const STATE_NEW = 1;
+       const STATE_CHECKED = 2;
+       const STATE_ATTEMPTED = 3;
+
+       /**
+        * Build a new file operation transaction
+        *
+        * @param $backend FileBackendStore
+        * @param $params Array
+        * @throws MWException
+        */
+       final public function __construct( FileBackendStore $backend, array $params ) {
+               $this->backend = $backend;
+               list( $required, $optional ) = $this->allowedParams();
+               foreach ( $required as $name ) {
+                       if ( isset( $params[$name] ) ) {
+                               $this->params[$name] = $params[$name];
+                       } else {
+                               throw new MWException( "File operation missing parameter '$name'." );
+                       }
+               }
+               foreach ( $optional as $name ) {
+                       if ( isset( $params[$name] ) ) {
+                               $this->params[$name] = $params[$name];
+                       }
+               }
+               $this->params = $params;
+       }
+
+       /**
+        * Set the batch UUID this operation belongs to
+        *
+        * @param $batchId string
+        * @return void
+        */
+       final public function setBatchId( $batchId ) {
+               $this->batchId = $batchId;
+       }
+
+       /**
+        * Whether to allow stale data for file reads and stat checks
+        *
+        * @param $allowStale bool
+        * @return void
+        */
+       final public function allowStaleReads( $allowStale ) {
+               $this->useLatest = !$allowStale;
+       }
+
+       /**
+        * Get the value of the parameter with the given name
+        *
+        * @param $name string
+        * @return mixed Returns null if the parameter is not set
+        */
+       final public function getParam( $name ) {
+               return isset( $this->params[$name] ) ? $this->params[$name] : null;
+       }
+
+       /**
+        * Check if this operation failed precheck() or attempt()
+        *
+        * @return bool
+        */
+       final public function failed() {
+               return $this->failed;
+       }
+
+       /**
+        * Get a new empty predicates array for precheck()
+        *
+        * @return Array
+        */
+       final public static function newPredicates() {
+               return array( 'exists' => array(), 'sha1' => array() );
+       }
+
+       /**
+        * Get a new empty dependency tracking array for paths read/written to
+        *
+        * @return Array
+        */
+       final public static function newDependencies() {
+               return array( 'read' => array(), 'write' => array() );
+       }
+
+       /**
+        * Update a dependency tracking array to account for this operation
+        *
+        * @param $deps Array Prior path reads/writes; format of FileOp::newPredicates()
+        * @return Array
+        */
+       final public function applyDependencies( array $deps ) {
+               $deps['read']  += array_fill_keys( $this->storagePathsRead(), 1 );
+               $deps['write'] += array_fill_keys( $this->storagePathsChanged(), 1 );
+               return $deps;
+       }
+
+       /**
+        * Check if this operation changes files listed in $paths
+        *
+        * @param $paths Array Prior path reads/writes; format of FileOp::newPredicates()
+        * @return boolean
+        */
+       final public function dependsOn( array $deps ) {
+               foreach ( $this->storagePathsChanged() as $path ) {
+                       if ( isset( $deps['read'][$path] ) || isset( $deps['write'][$path] ) ) {
+                               return true; // "output" or "anti" dependency
+                       }
+               }
+               foreach ( $this->storagePathsRead() as $path ) {
+                       if ( isset( $deps['write'][$path] ) ) {
+                               return true; // "flow" dependency
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Get the file journal entries for this file operation
+        *
+        * @param $oPredicates Array Pre-op info about files (format of FileOp::newPredicates)
+        * @param $nPredicates Array Post-op info about files (format of FileOp::newPredicates)
+        * @return Array
+        */
+       final public function getJournalEntries( array $oPredicates, array $nPredicates ) {
+               $nullEntries = array();
+               $updateEntries = array();
+               $deleteEntries = array();
+               $pathsUsed = array_merge( $this->storagePathsRead(), $this->storagePathsChanged() );
+               foreach ( $pathsUsed as $path ) {
+                       $nullEntries[] = array( // assertion for recovery
+                               '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,
+                                       'newSha1' => ''
+                               );
+                       } else { // created/updated
+                               $updateEntries[] = array(
+                                       'op'      => $this->fileExists( $path, $oPredicates ) ? 'update' : 'create',
+                                       'path'    => $path,
+                                       'newSha1' => $nPredicates['sha1'][$path]
+                               );
+                       }
+               }
+               return array_merge( $nullEntries, $updateEntries, $deleteEntries );
+       }
+
+       /**
+        * Check preconditions of the operation without writing anything
+        *
+        * @param $predicates Array
+        * @return Status
+        */
+       final public function precheck( array &$predicates ) {
+               if ( $this->state !== self::STATE_NEW ) {
+                       return Status::newFatal( 'fileop-fail-state', self::STATE_NEW, $this->state );
+               }
+               $this->state = self::STATE_CHECKED;
+               $status = $this->doPrecheck( $predicates );
+               if ( !$status->isOK() ) {
+                       $this->failed = true;
+               }
+               return $status;
+       }
+
+       /**
+        * @return Status
+        */
+       protected function doPrecheck( array &$predicates ) {
+               return Status::newGood();
+       }
+
+       /**
+        * Attempt the operation
+        *
+        * @return Status
+        */
+       final public function attempt() {
+               if ( $this->state !== self::STATE_CHECKED ) {
+                       return Status::newFatal( 'fileop-fail-state', self::STATE_CHECKED, $this->state );
+               } elseif ( $this->failed ) { // failed precheck
+                       return Status::newFatal( 'fileop-fail-attempt-precheck' );
+               }
+               $this->state = self::STATE_ATTEMPTED;
+               $status = $this->doAttempt();
+               if ( !$status->isOK() ) {
+                       $this->failed = true;
+                       $this->logFailure( 'attempt' );
+               }
+               return $status;
+       }
+
+       /**
+        * @return Status
+        */
+       protected function doAttempt() {
+               return Status::newGood();
+       }
+
+       /**
+        * Attempt the operation in the background
+        *
+        * @return Status
+        */
+       final public function attemptAsync() {
+               $this->async = true;
+               $result = $this->attempt();
+               $this->async = false;
+               return $result;
+       }
+
+       /**
+        * Get the file operation parameters
+        *
+        * @return Array (required params list, optional params list)
+        */
+       protected function allowedParams() {
+               return array( array(), array() );
+       }
+
+       /**
+        * Adjust params to FileBackendStore internal file calls
+        *
+        * @param $params Array
+        * @return Array (required params list, optional params list)
+        */
+       protected function setFlags( array $params ) {
+               return array( 'async' => $this->async ) + $params;
+       }
+
+       /**
+        * Get a list of storage paths read from for this operation
+        *
+        * @return Array
+        */
+       final public function storagePathsRead() {
+               return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsRead() );
+       }
+
+       /**
+        * @see FileOp::storagePathsRead()
+        * @return Array
+        */
+       protected function doStoragePathsRead() {
+               return array();
+       }
+
+       /**
+        * Get a list of storage paths written to for this operation
+        *
+        * @return Array
+        */
+       final public function storagePathsChanged() {
+               return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsChanged() );
+       }
+
+       /**
+        * @see FileOp::storagePathsChanged()
+        * @return Array
+        */
+       protected function doStoragePathsChanged() {
+               return array();
+       }
+
+       /**
+        * Check for errors with regards to the destination file already existing.
+        * This also updates the destSameAsSource and sourceSha1 member variables.
+        * A bad status will be returned if there is no chance it can be overwritten.
+        *
+        * @param $predicates Array
+        * @return Status
+        */
+       protected function precheckDestExistence( array $predicates ) {
+               $status = Status::newGood();
+               // Get hash of source file/string and the destination file
+               $this->sourceSha1 = $this->getSourceSha1Base36(); // FS file or data string
+               if ( $this->sourceSha1 === null ) { // file in storage?
+                       $this->sourceSha1 = $this->fileSha1( $this->params['src'], $predicates );
+               }
+               $this->destSameAsSource = false;
+               if ( $this->fileExists( $this->params['dst'], $predicates ) ) {
+                       if ( $this->getParam( 'overwrite' ) ) {
+                               return $status; // OK
+                       } elseif ( $this->getParam( 'overwriteSame' ) ) {
+                               $dhash = $this->fileSha1( $this->params['dst'], $predicates );
+                               // Check if hashes are valid and match each other...
+                               if ( !strlen( $this->sourceSha1 ) || !strlen( $dhash ) ) {
+                                       $status->fatal( 'backend-fail-hashes' );
+                               } elseif ( $this->sourceSha1 !== $dhash ) {
+                                       // Give an error if the files are not identical
+                                       $status->fatal( 'backend-fail-notsame', $this->params['dst'] );
+                               } else {
+                                       $this->destSameAsSource = true; // OK
+                               }
+                               return $status; // do nothing; either OK or bad status
+                       } else {
+                               $status->fatal( 'backend-fail-alreadyexists', $this->params['dst'] );
+                               return $status;
+                       }
+               }
+               return $status;
+       }
+
+       /**
+        * precheckDestExistence() helper function to get the source file SHA-1.
+        * Subclasses should overwride this iff the source is not in storage.
+        *
+        * @return string|bool Returns false on failure
+        */
+       protected function getSourceSha1Base36() {
+               return null; // N/A
+       }
+
+       /**
+        * Check if a file will exist in storage when this operation is attempted
+        *
+        * @param $source string Storage path
+        * @param $predicates Array
+        * @return bool
+        */
+       final protected function fileExists( $source, array $predicates ) {
+               if ( isset( $predicates['exists'][$source] ) ) {
+                       return $predicates['exists'][$source]; // previous op assures this
+               } else {
+                       $params = array( 'src' => $source, 'latest' => $this->useLatest );
+                       return $this->backend->fileExists( $params );
+               }
+       }
+
+       /**
+        * Get the SHA-1 of a file in storage when this operation is attempted
+        *
+        * @param $source string Storage path
+        * @param $predicates Array
+        * @return string|bool False on failure
+        */
+       final protected function fileSha1( $source, array $predicates ) {
+               if ( isset( $predicates['sha1'][$source] ) ) {
+                       return $predicates['sha1'][$source]; // previous op assures this
+               } else {
+                       $params = array( 'src' => $source, 'latest' => $this->useLatest );
+                       return $this->backend->getFileSha1Base36( $params );
+               }
+       }
+
+       /**
+        * Get the backend this operation is for
+        *
+        * @return FileBackendStore
+        */
+       public function getBackend() {
+               return $this->backend;
+       }
+
+       /**
+        * Log a file operation failure and preserve any temp files
+        *
+        * @param $action string
+        * @return void
+        */
+       final public function logFailure( $action ) {
+               $params = $this->params;
+               $params['failedAction'] = $action;
+               try {
+                       wfDebugLog( 'FileOperation', get_class( $this ) .
+                               " failed (batch #{$this->batchId}): " . FormatJson::encode( $params ) );
+               } catch ( Exception $e ) {
+                       // bad config? debug log error?
+               }
+       }
+}
+
+/**
+ * Store a file into the backend from a file on the file system.
+ * Parameters similar to FileBackendStore::storeInternal(), which include:
+ *   - src           : source path on file system
+ *   - dst           : destination storage path
+ *   - overwrite     : do nothing and pass if an identical file exists at destination
+ *   - overwriteSame : override any existing file at destination
+ */
+class StoreFileOp extends FileOp {
+       /**
+        * @return array
+        */
+       protected function allowedParams() {
+               return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
+       }
+
+       /**
+        * @param $predicates array
+        * @return Status
+        */
+       protected function doPrecheck( array &$predicates ) {
+               $status = Status::newGood();
+               // Check if the source file exists on the file system
+               if ( !is_file( $this->params['src'] ) ) {
+                       $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+                       return $status;
+               // Check if the source file is too big
+               } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
+                       $status->fatal( 'backend-fail-maxsize',
+                               $this->params['dst'], $this->backend->maxFileSizeInternal() );
+                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+                       return $status;
+               // Check if a file can be placed at the destination
+               } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
+                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+                       return $status;
+               }
+               // Check if destination file exists
+               $status->merge( $this->precheckDestExistence( $predicates ) );
+               if ( $status->isOK() ) {
+                       // Update file existence predicates
+                       $predicates['exists'][$this->params['dst']] = true;
+                       $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
+               }
+               return $status; // safe to call attempt()
+       }
+
+       /**
+        * @return Status
+        */
+       protected function doAttempt() {
+               // Store the file at the destination
+               if ( !$this->destSameAsSource ) {
+                       return $this->backend->storeInternal( $this->setFlags( $this->params ) );
+               }
+               return Status::newGood();
+       }
+
+       /**
+        * @return bool|string
+        */
+       protected function getSourceSha1Base36() {
+               wfSuppressWarnings();
+               $hash = sha1_file( $this->params['src'] );
+               wfRestoreWarnings();
+               if ( $hash !== false ) {
+                       $hash = wfBaseConvert( $hash, 16, 36, 31 );
+               }
+               return $hash;
+       }
+
+       protected function doStoragePathsChanged() {
+               return array( $this->params['dst'] );
+       }
+}
+
+/**
+ * Create a file in the backend with the given content.
+ * Parameters similar to FileBackendStore::createInternal(), which include:
+ *   - content       : the raw file contents
+ *   - dst           : destination storage path
+ *   - overwrite     : do nothing and pass if an identical file exists at destination
+ *   - overwriteSame : override any existing file at destination
+ */
+class CreateFileOp extends FileOp {
+       protected function allowedParams() {
+               return array( array( 'content', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
+       }
+
+       protected function doPrecheck( array &$predicates ) {
+               $status = Status::newGood();
+               // Check if the source data is too big
+               if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
+                       $status->fatal( 'backend-fail-maxsize',
+                               $this->params['dst'], $this->backend->maxFileSizeInternal() );
+                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
+                       return $status;
+               // Check if a file can be placed at the destination
+               } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
+                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
+                       return $status;
+               }
+               // Check if destination file exists
+               $status->merge( $this->precheckDestExistence( $predicates ) );
+               if ( $status->isOK() ) {
+                       // Update file existence predicates
+                       $predicates['exists'][$this->params['dst']] = true;
+                       $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
+               }
+               return $status; // safe to call attempt()
+       }
+
+       /**
+        * @return Status
+        */
+       protected function doAttempt() {
+               if ( !$this->destSameAsSource ) {
+                       // Create the file at the destination
+                       return $this->backend->createInternal( $this->setFlags( $this->params ) );
+               }
+               return Status::newGood();
+       }
+
+       /**
+        * @return bool|String
+        */
+       protected function getSourceSha1Base36() {
+               return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
+       }
+
+       /**
+        * @return array
+        */
+       protected function doStoragePathsChanged() {
+               return array( $this->params['dst'] );
+       }
+}
+
+/**
+ * Copy a file from one storage path to another in the backend.
+ * Parameters similar to FileBackendStore::copyInternal(), which include:
+ *   - src           : source storage path
+ *   - dst           : destination storage path
+ *   - overwrite     : do nothing and pass if an identical file exists at destination
+ *   - overwriteSame : override any existing file at destination
+ */
+class CopyFileOp extends FileOp {
+       /**
+        * @return array
+        */
+       protected function allowedParams() {
+               return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
+       }
+
+       /**
+        * @param $predicates array
+        * @return Status
+        */
+       protected function doPrecheck( array &$predicates ) {
+               $status = Status::newGood();
+               // Check if the source file exists
+               if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
+                       $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+                       return $status;
+               // Check if a file can be placed at the destination
+               } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
+                       $status->fatal( 'backend-fail-copy', $this->params['src'], $this->params['dst'] );
+                       return $status;
+               }
+               // Check if destination file exists
+               $status->merge( $this->precheckDestExistence( $predicates ) );
+               if ( $status->isOK() ) {
+                       // Update file existence predicates
+                       $predicates['exists'][$this->params['dst']] = true;
+                       $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
+               }
+               return $status; // safe to call attempt()
+       }
+
+       /**
+        * @return Status
+        */
+       protected function doAttempt() {
+               // Do nothing if the src/dst paths are the same
+               if ( $this->params['src'] !== $this->params['dst'] ) {
+                       // Copy the file into the destination
+                       if ( !$this->destSameAsSource ) {
+                               return $this->backend->copyInternal( $this->setFlags( $this->params ) );
+                       }
+               }
+               return Status::newGood();
+       }
+
+       /**
+        * @return array
+        */
+       protected function doStoragePathsRead() {
+               return array( $this->params['src'] );
+       }
+
+       /**
+        * @return array
+        */
+       protected function doStoragePathsChanged() {
+               return array( $this->params['dst'] );
+       }
+}
+
+/**
+ * Move a file from one storage path to another in the backend.
+ * Parameters similar to FileBackendStore::moveInternal(), which include:
+ *   - src           : source storage path
+ *   - dst           : destination storage path
+ *   - overwrite     : do nothing and pass if an identical file exists at destination
+ *   - overwriteSame : override any existing file at destination
+ */
+class MoveFileOp extends FileOp {
+       /**
+        * @return array
+        */
+       protected function allowedParams() {
+               return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
+       }
+
+       /**
+        * @param $predicates array
+        * @return Status
+        */
+       protected function doPrecheck( array &$predicates ) {
+               $status = Status::newGood();
+               // Check if the source file exists
+               if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
+                       $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+                       return $status;
+               // Check if a file can be placed at the destination
+               } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
+                       $status->fatal( 'backend-fail-move', $this->params['src'], $this->params['dst'] );
+                       return $status;
+               }
+               // Check if destination file exists
+               $status->merge( $this->precheckDestExistence( $predicates ) );
+               if ( $status->isOK() ) {
+                       // Update file existence predicates
+                       $predicates['exists'][$this->params['src']] = false;
+                       $predicates['sha1'][$this->params['src']] = false;
+                       $predicates['exists'][$this->params['dst']] = true;
+                       $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
+               }
+               return $status; // safe to call attempt()
+       }
+
+       /**
+        * @return Status
+        */
+       protected function doAttempt() {
+               // Do nothing if the src/dst paths are the same
+               if ( $this->params['src'] !== $this->params['dst'] ) {
+                       if ( !$this->destSameAsSource ) {
+                               // Move the file into the destination
+                               return $this->backend->moveInternal( $this->setFlags( $this->params ) );
+                       } else {
+                               // Just delete source as the destination needs no changes
+                               $params = array( 'src' => $this->params['src'] );
+                               return $this->backend->deleteInternal( $this->setFlags( $params ) );
+                       }
+               }
+               return Status::newGood();
+       }
+
+       /**
+        * @return array
+        */
+       protected function doStoragePathsRead() {
+               return array( $this->params['src'] );
+       }
+
+       /**
+        * @return array
+        */
+       protected function doStoragePathsChanged() {
+               return array( $this->params['src'], $this->params['dst'] );
+       }
+}
+
+/**
+ * Delete a file at the given storage path from the backend.
+ * Parameters similar to FileBackendStore::deleteInternal(), which include:
+ *   - src                 : source storage path
+ *   - ignoreMissingSource : don't return an error if the file does not exist
+ */
+class DeleteFileOp extends FileOp {
+       /**
+        * @return array
+        */
+       protected function allowedParams() {
+               return array( array( 'src' ), array( 'ignoreMissingSource' ) );
+       }
+
+       protected $needsDelete = true;
+
+       /**
+        * @param array $predicates
+        * @return Status
+        */
+       protected function doPrecheck( array &$predicates ) {
+               $status = Status::newGood();
+               // Check if the source file exists
+               if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
+                       if ( !$this->getParam( 'ignoreMissingSource' ) ) {
+                               $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+                               return $status;
+                       }
+                       $this->needsDelete = false;
+               }
+               // Update file existence predicates
+               $predicates['exists'][$this->params['src']] = false;
+               $predicates['sha1'][$this->params['src']] = false;
+               return $status; // safe to call attempt()
+       }
+
+       /**
+        * @return Status
+        */
+       protected function doAttempt() {
+               if ( $this->needsDelete ) {
+                       // Delete the source file
+                       return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
+               }
+               return Status::newGood();
+       }
+
+       /**
+        * @return array
+        */
+       protected function doStoragePathsChanged() {
+               return array( $this->params['src'] );
+       }
+}
+
+/**
+ * Placeholder operation that has no params and does nothing
+ */
+class NullFileOp extends FileOp {}
diff --git a/includes/filebackend/FileOpBatch.php b/includes/filebackend/FileOpBatch.php
new file mode 100644 (file)
index 0000000..3355872
--- /dev/null
@@ -0,0 +1,240 @@
+<?php
+/**
+ * Helper class for representing batch file operations.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * Helper class for representing batch file operations.
+ * Do not use this class from places outside FileBackend.
+ *
+ * Methods should avoid throwing exceptions at all costs.
+ *
+ * @ingroup FileBackend
+ * @since 1.20
+ */
+class FileOpBatch {
+       /* Timeout related parameters */
+       const MAX_BATCH_SIZE = 1000; // integer
+
+       /**
+        * Attempt to perform a series of file operations.
+        * Callers are responsible for handling file locking.
+        *
+        * $opts is an array of options, including:
+        *   - force        : Errors that would normally cause a rollback do not.
+        *                    The remaining operations are still attempted if any fail.
+        *   - allowStale   : Don't require the latest available data.
+        *                    This can increase performance for non-critical writes.
+        *                    This has no effect unless the 'force' flag is set.
+        *   - nonJournaled : Don't log this operation batch in the file journal.
+        *   - concurrency  : Try to do this many operations in parallel when possible.
+        *
+        * The resulting Status will be "OK" unless:
+        *   - a) unexpected operation errors occurred (network partitions, disk full...)
+        *   - b) significant operation errors occurred and 'force' was not set
+        *
+        * @param $performOps Array List of FileOp operations
+        * @param $opts Array Batch operation options
+        * @param $journal FileJournal Journal to log operations to
+        * @return Status
+        */
+       public static function attempt( array $performOps, array $opts, FileJournal $journal ) {
+               wfProfileIn( __METHOD__ );
+               $status = Status::newGood();
+
+               $n = count( $performOps );
+               if ( $n > self::MAX_BATCH_SIZE ) {
+                       $status->fatal( 'backend-fail-batchsize', $n, self::MAX_BATCH_SIZE );
+                       wfProfileOut( __METHOD__ );
+                       return $status;
+               }
+
+               $batchId = $journal->getTimestampedUUID();
+               $allowStale = !empty( $opts['allowStale'] );
+               $ignoreErrors = !empty( $opts['force'] );
+               $journaled = empty( $opts['nonJournaled'] );
+               $maxConcurrency = isset( $opts['concurrency'] ) ? $opts['concurrency'] : 1;
+
+               $entries = array(); // file journal entry list
+               $predicates = FileOp::newPredicates(); // account for previous ops in prechecks
+               $curBatch = array(); // concurrent FileOp sub-batch accumulation
+               $curBatchDeps = FileOp::newDependencies(); // paths used in FileOp sub-batch
+               $pPerformOps = array(); // ordered list of concurrent FileOp sub-batches
+               $lastBackend = null; // last op backend name
+               // Do pre-checks for each operation; abort on failure...
+               foreach ( $performOps as $index => $fileOp ) {
+                       $backendName = $fileOp->getBackend()->getName();
+                       $fileOp->setBatchId( $batchId ); // transaction ID
+                       $fileOp->allowStaleReads( $allowStale ); // consistency level
+                       // Decide if this op can be done concurrently within this sub-batch
+                       // or if a new concurrent sub-batch must be started after this one...
+                       if ( $fileOp->dependsOn( $curBatchDeps )
+                               || count( $curBatch ) >= $maxConcurrency
+                               || ( $backendName !== $lastBackend && count( $curBatch ) )
+                       ) {
+                               $pPerformOps[] = $curBatch; // push this batch
+                               $curBatch = array(); // start a new sub-batch
+                               $curBatchDeps = FileOp::newDependencies();
+                       }
+                       $lastBackend = $backendName;
+                       $curBatch[$index] = $fileOp; // keep index
+                       // Update list of affected paths in this batch
+                       $curBatchDeps = $fileOp->applyDependencies( $curBatchDeps );
+                       // Simulate performing the operation...
+                       $oldPredicates = $predicates;
+                       $subStatus = $fileOp->precheck( $predicates ); // updates $predicates
+                       $status->merge( $subStatus );
+                       if ( $subStatus->isOK() ) {
+                               if ( $journaled ) { // journal log entries
+                                       $entries = array_merge( $entries,
+                                               $fileOp->getJournalEntries( $oldPredicates, $predicates ) );
+                               }
+                       } else { // operation failed?
+                               $status->success[$index] = false;
+                               ++$status->failCount;
+                               if ( !$ignoreErrors ) {
+                                       wfProfileOut( __METHOD__ );
+                                       return $status; // abort
+                               }
+                       }
+               }
+               // Push the last sub-batch
+               if ( count( $curBatch ) ) {
+                       $pPerformOps[] = $curBatch;
+               }
+
+               // Log the operations in the file journal...
+               if ( count( $entries ) ) {
+                       $subStatus = $journal->logChangeBatch( $entries, $batchId );
+                       if ( !$subStatus->isOK() ) {
+                               wfProfileOut( __METHOD__ );
+                               return $subStatus; // abort
+                       }
+               }
+
+               if ( $ignoreErrors ) { // treat precheck() fatals as mere warnings
+                       $status->setResult( true, $status->value );
+               }
+
+               // Attempt each operation (in parallel if allowed and possible)...
+               if ( count( $pPerformOps ) < count( $performOps ) ) {
+                       self::runBatchParallel( $pPerformOps, $status );
+               } else {
+                       self::runBatchSeries( $performOps, $status );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * Attempt a list of file operations in series.
+        * This will abort remaining ops on failure.
+        *
+        * @param $performOps Array
+        * @param $status Status
+        * @return bool Success
+        */
+       protected static function runBatchSeries( array $performOps, Status $status ) {
+               foreach ( $performOps as $index => $fileOp ) {
+                       if ( $fileOp->failed() ) {
+                               continue; // nothing to do
+                       }
+                       $subStatus = $fileOp->attempt();
+                       $status->merge( $subStatus );
+                       if ( $subStatus->isOK() ) {
+                               $status->success[$index] = true;
+                               ++$status->successCount;
+                       } else {
+                               $status->success[$index] = false;
+                               ++$status->failCount;
+                               // We can't continue (even with $ignoreErrors) as $predicates is wrong.
+                               // Log the remaining ops as failed for recovery...
+                               for ( $i = ($index + 1); $i < count( $performOps ); $i++ ) {
+                                       $performOps[$i]->logFailure( 'attempt_aborted' );
+                               }
+                               return false; // bail out
+                       }
+               }
+               return true;
+       }
+
+       /**
+        * Attempt a list of file operations sub-batches in series.
+        *
+        * The operations *in* each sub-batch will be done in parallel.
+        * The caller is responsible for making sure the operations
+        * within any given sub-batch do not depend on each other.
+        * This will abort remaining ops on failure.
+        *
+        * @param $pPerformOps Array
+        * @param $status Status
+        * @return bool Success
+        */
+       protected static function runBatchParallel( array $pPerformOps, Status $status ) {
+               $aborted = false;
+               foreach ( $pPerformOps as $performOpsBatch ) {
+                       if ( $aborted ) { // check batch op abort flag...
+                               // We can't continue (even with $ignoreErrors) as $predicates is wrong.
+                               // Log the remaining ops as failed for recovery...
+                               foreach ( $performOpsBatch as $i => $fileOp ) {
+                                       $performOpsBatch[$i]->logFailure( 'attempt_aborted' );
+                               }
+                               continue;
+                       }
+                       $statuses = array();
+                       $opHandles = array();
+                       // Get the backend; all sub-batch ops belong to a single backend
+                       $backend = reset( $performOpsBatch )->getBackend();
+                       // If attemptAsync() returns synchronously, it was either an
+                       // error Status or the backend just doesn't support async ops.
+                       foreach ( $performOpsBatch as $i => $fileOp ) {
+                               if ( !$fileOp->failed() ) { // failed => already has Status
+                                       $subStatus = $fileOp->attemptAsync();
+                                       if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
+                                               $opHandles[$i] = $subStatus->value; // deferred
+                                       } else {
+                                               $statuses[$i] = $subStatus; // done already
+                                       }
+                               }
+                       }
+                       // Try to do all the operations concurrently...
+                       $statuses = $statuses + $backend->executeOpHandlesInternal( $opHandles );
+                       // Marshall and merge all the responses (blocking)...
+                       foreach ( $performOpsBatch as $i => $fileOp ) {
+                               if ( !$fileOp->failed() ) { // failed => already has Status
+                                       $subStatus = $statuses[$i];
+                                       $status->merge( $subStatus );
+                                       if ( $subStatus->isOK() ) {
+                                               $status->success[$i] = true;
+                                               ++$status->successCount;
+                                       } else {
+                                               $status->success[$i] = false;
+                                               ++$status->failCount;
+                                               $aborted = true; // set abort flag; we can't continue
+                                       }
+                               }
+                       }
+               }
+               return $status;
+       }
+}
diff --git a/includes/filebackend/SwiftFileBackend.php b/includes/filebackend/SwiftFileBackend.php
new file mode 100644 (file)
index 0000000..9081e82
--- /dev/null
@@ -0,0 +1,1472 @@
+<?php
+/**
+ * OpenStack Swift based file backend.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Russ Nelson
+ * @author Aaron Schulz
+ */
+
+/**
+ * @brief Class for an OpenStack Swift based file backend.
+ *
+ * This requires the SwiftCloudFiles MediaWiki extension, which includes
+ * the php-cloudfiles library (https://github.com/rackspace/php-cloudfiles).
+ * php-cloudfiles requires the curl, fileinfo, and mb_string PHP extensions.
+ *
+ * Status messages should avoid mentioning the Swift account name.
+ * Likewise, error suppression should be used to avoid path disclosure.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+class SwiftFileBackend extends FileBackendStore {
+       /** @var CF_Authentication */
+       protected $auth; // Swift authentication handler
+       protected $authTTL; // integer seconds
+       protected $swiftAnonUser; // string; username to handle unauthenticated requests
+       protected $swiftUseCDN; // boolean; whether CloudFiles CDN is enabled
+       protected $swiftCDNExpiry; // integer; how long to cache things in the CDN
+       protected $swiftCDNPurgable; // boolean; whether object CDN purging is enabled
+
+       /** @var CF_Connection */
+       protected $conn; // Swift connection handle
+       protected $sessionStarted = 0; // integer UNIX timestamp
+
+       /** @var CloudFilesException */
+       protected $connException;
+       protected $connErrorTime = 0; // UNIX timestamp
+
+       /** @var BagOStuff */
+       protected $srvCache;
+
+       /** @var ProcessCacheLRU */
+       protected $connContainerCache; // container object cache
+
+       /**
+        * @see FileBackendStore::__construct()
+        * Additional $config params include:
+        *   - swiftAuthUrl       : Swift authentication server URL
+        *   - swiftUser          : Swift user used by MediaWiki (account:username)
+        *   - swiftKey           : Swift authentication key for the above user
+        *   - swiftAuthTTL       : Swift authentication TTL (seconds)
+        *   - swiftAnonUser      : Swift user used for end-user requests (account:username).
+        *                          If set, then views of public containers are assumed to go
+        *                          through this user. If not set, then public containers are
+        *                          accessible to unauthenticated requests via ".r:*" in the ACL.
+        *   - swiftUseCDN        : Whether a Cloud Files Content Delivery Network is set up
+        *   - swiftCDNExpiry     : How long (in seconds) to store content in the CDN.
+        *                          If files may likely change, this should probably not exceed
+        *                          a few days. For example, deletions may take this long to apply.
+        *                          If object purging is enabled, however, this is not an issue.
+        *   - swiftCDNPurgable   : Whether object purge requests are allowed by the CDN.
+        *   - shardViaHashLevels : Map of container names to sharding config with:
+        *                             - base   : base of hash characters, 16 or 36
+        *                             - levels : the number of hash levels (and digits)
+        *                             - repeat : hash subdirectories are prefixed with all the
+        *                                        parent hash directory names (e.g. "a/ab/abc")
+        *   - cacheAuthInfo      : Whether to cache authentication tokens in APC/XCache.
+        *                          This is probably insecure in shared hosting environments.
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+               if ( !MWInit::classExists( 'CF_Constants' ) ) {
+                       throw new MWException( 'SwiftCloudFiles extension not installed.' );
+               }
+               // Required settings
+               $this->auth = new CF_Authentication(
+                       $config['swiftUser'],
+                       $config['swiftKey'],
+                       null, // account; unused
+                       $config['swiftAuthUrl']
+               );
+               // Optional settings
+               $this->authTTL = isset( $config['swiftAuthTTL'] )
+                       ? $config['swiftAuthTTL']
+                       : 5 * 60; // some sane number
+               $this->swiftAnonUser = isset( $config['swiftAnonUser'] )
+                       ? $config['swiftAnonUser']
+                       : '';
+               $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
+                       ? $config['shardViaHashLevels']
+                       : '';
+               $this->swiftUseCDN = isset( $config['swiftUseCDN'] )
+                       ? $config['swiftUseCDN']
+                       : false;
+               $this->swiftCDNExpiry = isset( $config['swiftCDNExpiry'] )
+                       ? $config['swiftCDNExpiry']
+                       : 12*3600; // 12 hours is safe (tokens last 24 hours per http://docs.openstack.org)
+               $this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
+                       ? $config['swiftCDNPurgable']
+                       : true;
+               // Cache container information to mask latency
+               $this->memCache = wfGetMainCache();
+               // Process cache for container info
+               $this->connContainerCache = new ProcessCacheLRU( 300 );
+               // Cache auth token information to avoid RTTs
+               if ( !empty( $config['cacheAuthInfo'] ) ) {
+                       try { // look for APC, XCache, WinCache, ect...
+                               $this->srvCache = ObjectCache::newAccelerator( array() );
+                       } catch ( Exception $e ) {}
+               }
+               $this->srvCache = $this->srvCache ? $this->srvCache : new EmptyBagOStuff();
+       }
+
+       /**
+        * @see FileBackendStore::resolveContainerPath()
+        * @return null
+        */
+       protected function resolveContainerPath( $container, $relStoragePath ) {
+               if ( !mb_check_encoding( $relStoragePath, 'UTF-8' ) ) { // mb_string required by CF
+                       return null; // not UTF-8, makes it hard to use CF and the swift HTTP API
+               } elseif ( strlen( urlencode( $relStoragePath ) ) > 1024 ) {
+                       return null; // too long for Swift
+               }
+               return $relStoragePath;
+       }
+
+       /**
+        * @see FileBackendStore::isPathUsableInternal()
+        * @return bool
+        */
+       public function isPathUsableInternal( $storagePath ) {
+               list( $container, $rel ) = $this->resolveStoragePathReal( $storagePath );
+               if ( $rel === null ) {
+                       return false; // invalid
+               }
+
+               try {
+                       $this->getContainer( $container );
+                       return true; // container exists
+               } catch ( NoSuchContainerException $e ) {
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__, array( 'path' => $storagePath ) );
+               }
+
+               return false;
+       }
+
+       /**
+        * @see FileBackendStore::doCreateInternal()
+        * @return Status
+        */
+       protected function doCreateInternal( array $params ) {
+               $status = Status::newGood();
+
+               list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
+               if ( $dstRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               // (a) Check the destination container and object
+               try {
+                       $dContObj = $this->getContainer( $dstCont );
+                       if ( empty( $params['overwrite'] ) &&
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
+                       {
+                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+                               return $status;
+                       }
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-create', $params['dst'] );
+                       return $status;
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+                       return $status;
+               }
+
+               // (b) Get a SHA-1 hash of the object
+               $sha1Hash = wfBaseConvert( sha1( $params['content'] ), 16, 36, 31 );
+
+               // (c) Actually create the object
+               try {
+                       // Create a fresh CF_Object with no fields preloaded.
+                       // We don't want to preserve headers, metadata, and such.
+                       $obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
+                       // Note: metadata keys stored as [Upper case char][[Lower case char]...]
+                       $obj->metadata = array( 'Sha1base36' => $sha1Hash );
+                       // Manually set the ETag (https://github.com/rackspace/php-cloudfiles/issues/59).
+                       // The MD5 here will be checked within Swift against its own MD5.
+                       $obj->set_etag( md5( $params['content'] ) );
+                       // Use the same content type as StreamFile for security
+                       $obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
+                       if ( !strlen( $obj->content_type ) ) { // special case
+                               $obj->content_type = 'unknown/unknown';
+                       }
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               $handle = $obj->write_async( $params['content'] );
+                               $status->value = new SwiftFileOpHandle( $this, $params, 'Create', $handle );
+                               $status->value->affectedObjects[] = $obj;
+                       } else { // actually write the object in Swift
+                               $obj->write( $params['content'] );
+                               $this->purgeCDNCache( array( $obj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( BadContentTypeException $e ) {
+                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseCreate( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( BadContentTypeException $e ) {
+                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doStoreInternal()
+        * @return Status
+        */
+       protected function doStoreInternal( array $params ) {
+               $status = Status::newGood();
+
+               list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
+               if ( $dstRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               // (a) Check the destination container and object
+               try {
+                       $dContObj = $this->getContainer( $dstCont );
+                       if ( empty( $params['overwrite'] ) &&
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
+                       {
+                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+                               return $status;
+                       }
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       return $status;
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+                       return $status;
+               }
+
+               // (b) Get a SHA-1 hash of the object
+               $sha1Hash = sha1_file( $params['src'] );
+               if ( $sha1Hash === false ) { // source doesn't exist?
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       return $status;
+               }
+               $sha1Hash = wfBaseConvert( $sha1Hash, 16, 36, 31 );
+
+               // (c) Actually store the object
+               try {
+                       // Create a fresh CF_Object with no fields preloaded.
+                       // We don't want to preserve headers, metadata, and such.
+                       $obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
+                       // Note: metadata keys stored as [Upper case char][[Lower case char]...]
+                       $obj->metadata = array( 'Sha1base36' => $sha1Hash );
+                       // The MD5 here will be checked within Swift against its own MD5.
+                       $obj->set_etag( md5_file( $params['src'] ) );
+                       // Use the same content type as StreamFile for security
+                       $obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
+                       if ( !strlen( $obj->content_type ) ) { // special case
+                               $obj->content_type = 'unknown/unknown';
+                       }
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               wfSuppressWarnings();
+                               $fp = fopen( $params['src'], 'rb' );
+                               wfRestoreWarnings();
+                               if ( !$fp ) {
+                                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                               } else {
+                                       $handle = $obj->write_async( $fp, filesize( $params['src'] ), true );
+                                       $status->value = new SwiftFileOpHandle( $this, $params, 'Store', $handle );
+                                       $status->value->resourcesToClose[] = $fp;
+                                       $status->value->affectedObjects[] = $obj;
+                               }
+                       } else { // actually write the object in Swift
+                               $obj->load_from_filename( $params['src'], true ); // calls $obj->write()
+                               $this->purgeCDNCache( array( $obj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( BadContentTypeException $e ) {
+                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+               } catch ( IOException $e ) {
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseStore( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( BadContentTypeException $e ) {
+                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+               } catch ( IOException $e ) {
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doCopyInternal()
+        * @return Status
+        */
+       protected function doCopyInternal( array $params ) {
+               $status = Status::newGood();
+
+               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+               if ( $srcRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+                       return $status;
+               }
+
+               list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
+               if ( $dstRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               // (a) Check the source/destination containers and destination object
+               try {
+                       $sContObj = $this->getContainer( $srcCont );
+                       $dContObj = $this->getContainer( $dstCont );
+                       if ( empty( $params['overwrite'] ) &&
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
+                       {
+                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+                               return $status;
+                       }
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       return $status;
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+                       return $status;
+               }
+
+               // (b) Actually copy the file to the destination
+               try {
+                       $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               $handle = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel );
+                               $status->value = new SwiftFileOpHandle( $this, $params, 'Copy', $handle );
+                               $status->value->affectedObjects[] = $dstObj;
+                       } else { // actually write the object in Swift
+                               $sContObj->copy_object_to( $srcRel, $dContObj, $dstRel );
+                               $this->purgeCDNCache( array( $dstObj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( NoSuchObjectException $e ) { // source object does not exist
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseCopy( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( NoSuchObjectException $e ) { // source object does not exist
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doMoveInternal()
+        * @return Status
+        */
+       protected function doMoveInternal( array $params ) {
+               $status = Status::newGood();
+
+               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+               if ( $srcRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+                       return $status;
+               }
+
+               list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
+               if ( $dstRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               // (a) Check the source/destination containers and destination object
+               try {
+                       $sContObj = $this->getContainer( $srcCont );
+                       $dContObj = $this->getContainer( $dstCont );
+                       if ( empty( $params['overwrite'] ) &&
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
+                       {
+                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+                               return $status;
+                       }
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                       return $status;
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+                       return $status;
+               }
+
+               // (b) Actually move the file to the destination
+               try {
+                       $srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+                       $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               $handle = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel );
+                               $status->value = new SwiftFileOpHandle( $this, $params, 'Move', $handle );
+                               $status->value->affectedObjects[] = $srcObj;
+                               $status->value->affectedObjects[] = $dstObj;
+                       } else { // actually write the object in Swift
+                               $sContObj->move_object_to( $srcRel, $dContObj, $dstRel );
+                               $this->purgeCDNCache( array( $srcObj, $dstObj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( NoSuchObjectException $e ) { // source object does not exist
+                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseMove( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( NoSuchObjectException $e ) { // source object does not exist
+                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doDeleteInternal()
+        * @return Status
+        */
+       protected function doDeleteInternal( array $params ) {
+               $status = Status::newGood();
+
+               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+               if ( $srcRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+                       return $status;
+               }
+
+               try {
+                       $sContObj = $this->getContainer( $srcCont );
+                       $srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               $handle = $sContObj->delete_object_async( $srcRel );
+                               $status->value = new SwiftFileOpHandle( $this, $params, 'Delete', $handle );
+                               $status->value->affectedObjects[] = $srcObj;
+                       } else { // actually write the object in Swift
+                               $sContObj->delete_object( $srcRel );
+                               $this->purgeCDNCache( array( $srcObj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-delete', $params['src'] );
+               } catch ( NoSuchObjectException $e ) {
+                       if ( empty( $params['ignoreMissingSource'] ) ) {
+                               $status->fatal( 'backend-fail-delete', $params['src'] );
+                       }
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseDelete( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-delete', $params['src'] );
+               } catch ( NoSuchObjectException $e ) {
+                       if ( empty( $params['ignoreMissingSource'] ) ) {
+                               $status->fatal( 'backend-fail-delete', $params['src'] );
+                       }
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doPrepareInternal()
+        * @return Status
+        */
+       protected function doPrepareInternal( $fullCont, $dir, array $params ) {
+               $status = Status::newGood();
+
+               // (a) Check if container already exists
+               try {
+                       $contObj = $this->getContainer( $fullCont );
+                       // NoSuchContainerException not thrown: container must exist
+                       return $status; // already exists
+               } catch ( NoSuchContainerException $e ) {
+                       // NoSuchContainerException thrown: container does not exist
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+                       return $status;
+               }
+
+               // (b) Create container as needed
+               try {
+                       $contObj = $this->createContainer( $fullCont );
+                       if ( !empty( $params['noAccess'] ) ) {
+                               // Make container private to end-users...
+                               $status->merge( $this->doSecureInternal( $fullCont, $dir, $params ) );
+                       } else {
+                               // Make container public to end-users...
+                               $status->merge( $this->doPublishInternal( $fullCont, $dir, $params ) );
+                       }
+                       if ( $this->swiftUseCDN ) { // Rackspace style CDN
+                               $contObj->make_public( $this->swiftCDNExpiry );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+                       return $status;
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doSecureInternal()
+        * @return Status
+        */
+       protected function doSecureInternal( $fullCont, $dir, array $params ) {
+               $status = Status::newGood();
+               if ( empty( $params['noAccess'] ) ) {
+                       return $status; // nothing to do
+               }
+
+               // Restrict container from end-users...
+               try {
+                       // doPrepareInternal() should have been called,
+                       // so the Swift container should already exist...
+                       $contObj = $this->getContainer( $fullCont ); // normally a cache hit
+                       // NoSuchContainerException not thrown: container must exist
+
+                       // Make container private to end-users...
+                       $status->merge( $this->setContainerAccess(
+                               $contObj,
+                               array( $this->auth->username ), // read
+                               array( $this->auth->username ) // write
+                       ) );
+                       if ( $this->swiftUseCDN && $contObj->is_public() ) { // Rackspace style CDN
+                               $contObj->make_private();
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doPublishInternal()
+        * @return Status
+        */
+       protected function doPublishInternal( $fullCont, $dir, array $params ) {
+               $status = Status::newGood();
+
+               // Unrestrict container from end-users...
+               try {
+                       // doPrepareInternal() should have been called,
+                       // so the Swift container should already exist...
+                       $contObj = $this->getContainer( $fullCont ); // normally a cache hit
+                       // NoSuchContainerException not thrown: container must exist
+
+                       // Make container public to end-users...
+                       if ( $this->swiftAnonUser != '' ) {
+                               $status->merge( $this->setContainerAccess(
+                                       $contObj,
+                                       array( $this->auth->username, $this->swiftAnonUser ), // read
+                                       array( $this->auth->username, $this->swiftAnonUser ) // write
+                               ) );
+                       } else {
+                               $status->merge( $this->setContainerAccess(
+                                       $contObj,
+                                       array( $this->auth->username, '.r:*' ), // read
+                                       array( $this->auth->username ) // write
+                               ) );
+                       }
+                       if ( $this->swiftUseCDN && !$contObj->is_public() ) { // Rackspace style CDN
+                               $contObj->make_public();
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doCleanInternal()
+        * @return Status
+        */
+       protected function doCleanInternal( $fullCont, $dir, array $params ) {
+               $status = Status::newGood();
+
+               // Only containers themselves can be removed, all else is virtual
+               if ( $dir != '' ) {
+                       return $status; // nothing to do
+               }
+
+               // (a) Check the container
+               try {
+                       $contObj = $this->getContainer( $fullCont, true );
+               } catch ( NoSuchContainerException $e ) {
+                       return $status; // ok, nothing to do
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+                       return $status;
+               }
+
+               // (b) Delete the container if empty
+               if ( $contObj->object_count == 0 ) {
+                       try {
+                               $this->deleteContainer( $fullCont );
+                       } catch ( NoSuchContainerException $e ) {
+                               return $status; // race?
+                       } catch ( NonEmptyContainerException $e ) {
+                               return $status; // race? consistency delay?
+                       } catch ( CloudFilesException $e ) { // some other exception?
+                               $this->handleException( $e, $status, __METHOD__, $params );
+                               return $status;
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::doFileExists()
+        * @return array|bool|null
+        */
+       protected function doGetFileStat( array $params ) {
+               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+               if ( $srcRel === null ) {
+                       return false; // invalid storage path
+               }
+
+               $stat = false;
+               try {
+                       $contObj = $this->getContainer( $srcCont );
+                       $srcObj = $contObj->get_object( $srcRel, $this->headersFromParams( $params ) );
+                       $this->addMissingMetadata( $srcObj, $params['src'] );
+                       $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->metadata['Sha1base36']
+                       );
+               } catch ( NoSuchContainerException $e ) {
+               } catch ( NoSuchObjectException $e ) {
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $stat = null;
+                       $this->handleException( $e, null, __METHOD__, $params );
+               }
+
+               return $stat;
+       }
+
+       /**
+        * Fill in any missing object metadata and save it to Swift
+        *
+        * @param $obj CF_Object
+        * @param $path string Storage path to object
+        * @return bool Success
+        * @throws Exception cloudfiles exceptions
+        */
+       protected function addMissingMetadata( CF_Object $obj, $path ) {
+               if ( isset( $obj->metadata['Sha1base36'] ) ) {
+                       return true; // nothing to do
+               }
+               wfProfileIn( __METHOD__ );
+               $status = Status::newGood();
+               $scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
+               if ( $status->isOK() ) {
+                       # Do not stat the file in getLocalCopy() to avoid infinite loops
+                       $tmpFile = $this->getLocalCopy( array( 'src' => $path, 'latest' => 1, 'nostat' => 1 ) );
+                       if ( $tmpFile ) {
+                               $hash = $tmpFile->getSha1Base36();
+                               if ( $hash !== false ) {
+                                       $obj->metadata['Sha1base36'] = $hash;
+                                       $obj->sync_metadata(); // save to Swift
+                                       wfProfileOut( __METHOD__ );
+                                       return true; // success
+                               }
+                       }
+               }
+               $obj->metadata['Sha1base36'] = false;
+               wfProfileOut( __METHOD__ );
+               return false; // failed
+       }
+
+       /**
+        * @see FileBackend::getFileContents()
+        * @return bool|null|string
+        */
+       public function getFileContents( array $params ) {
+               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+               if ( $srcRel === null ) {
+                       return false; // invalid storage path
+               }
+
+               if ( !$this->fileExists( $params ) ) {
+                       return null;
+               }
+
+               $data = false;
+               try {
+                       $sContObj = $this->getContainer( $srcCont );
+                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+                       $data = $obj->read( $this->headersFromParams( $params ) );
+               } catch ( NoSuchContainerException $e ) {
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__, $params );
+               }
+
+               return $data;
+       }
+
+       /**
+        * @see FileBackendStore::doDirectoryExists()
+        * @return bool|null
+        */
+       protected function doDirectoryExists( $fullCont, $dir, array $params ) {
+               try {
+                       $container = $this->getContainer( $fullCont );
+                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
+                       return ( count( $container->list_objects( 1, null, $prefix ) ) > 0 );
+               } catch ( NoSuchContainerException $e ) {
+                       return false;
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__,
+                               array( 'cont' => $fullCont, 'dir' => $dir ) );
+               }
+
+               return null; // error
+       }
+
+       /**
+        * @see FileBackendStore::getDirectoryListInternal()
+        * @return SwiftFileBackendDirList
+        */
+       public function getDirectoryListInternal( $fullCont, $dir, array $params ) {
+               return new SwiftFileBackendDirList( $this, $fullCont, $dir, $params );
+       }
+
+       /**
+        * @see FileBackendStore::getFileListInternal()
+        * @return SwiftFileBackendFileList
+        */
+       public function getFileListInternal( $fullCont, $dir, array $params ) {
+               return new SwiftFileBackendFileList( $this, $fullCont, $dir, $params );
+       }
+
+       /**
+        * Do not call this function outside of SwiftFileBackendFileList
+        *
+        * @param $fullCont string Resolved container name
+        * @param $dir string Resolved storage directory with no trailing slash
+        * @param $after string|null Storage path of file to list items after
+        * @param $limit integer Max number of items to list
+        * @param $params Array Includes flag for 'topOnly'
+        * @return Array List of relative paths of dirs directly under $dir
+        */
+       public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
+               $dirs = array();
+               if ( $after === INF ) {
+                       return $dirs; // nothing more
+               }
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               try {
+                       $container = $this->getContainer( $fullCont );
+                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
+                       // Non-recursive: only list dirs right under $dir
+                       if ( !empty( $params['topOnly'] ) ) {
+                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+                               foreach ( $objects as $object ) { // files and dirs
+                                       if ( substr( $object, -1 ) === '/' ) {
+                                               $dirs[] = $object; // directories end in '/'
+                                       }
+                               }
+                       // Recursive: list all dirs under $dir and its subdirs
+                       } else {
+                               // Get directory from last item of prior page
+                               $lastDir = $this->getParentDir( $after ); // must be first page
+                               $objects = $container->list_objects( $limit, $after, $prefix );
+                               foreach ( $objects as $object ) { // files
+                                       $objectDir = $this->getParentDir( $object ); // directory of object
+                                       if ( $objectDir !== false ) { // file has a parent dir
+                                               // Swift stores paths in UTF-8, using binary sorting.
+                                               // See function "create_container_table" in common/db.py.
+                                               // If a directory is not "greater" than the last one,
+                                               // then it was already listed by the calling iterator.
+                                               if ( strcmp( $objectDir, $lastDir ) > 0 ) {
+                                                       $pDir = $objectDir;
+                                                       do { // add dir and all its parent dirs
+                                                               $dirs[] = "{$pDir}/";
+                                                               $pDir = $this->getParentDir( $pDir );
+                                                       } while ( $pDir !== false // sanity
+                                                               && strcmp( $pDir, $lastDir ) > 0 // not done already
+                                                               && strlen( $pDir ) > strlen( $dir ) // within $dir
+                                                       );
+                                               }
+                                               $lastDir = $objectDir;
+                                       }
+                               }
+                       }
+                       if ( count( $objects ) < $limit ) {
+                               $after = INF; // avoid a second RTT
+                       } else {
+                               $after = end( $objects ); // update last item
+                       }
+               } catch ( NoSuchContainerException $e ) {
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__,
+                               array( 'cont' => $fullCont, 'dir' => $dir ) );
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               return $dirs;
+       }
+
+       protected function getParentDir( $path ) {
+               return ( strpos( $path, '/' ) !== false ) ? dirname( $path ) : false;
+       }
+
+       /**
+        * Do not call this function outside of SwiftFileBackendFileList
+        *
+        * @param $fullCont string Resolved container name
+        * @param $dir string Resolved storage directory with no trailing slash
+        * @param $after string|null Storage path of file to list items after
+        * @param $limit integer Max number of items to list
+        * @param $params Array Includes flag for 'topOnly'
+        * @return Array List of relative paths of files under $dir
+        */
+       public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
+               $files = array();
+               if ( $after === INF ) {
+                       return $files; // nothing more
+               }
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               try {
+                       $container = $this->getContainer( $fullCont );
+                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
+                       // Non-recursive: only list files right under $dir
+                       if ( !empty( $params['topOnly'] ) ) { // files and dirs
+                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+                               foreach ( $objects as $object ) {
+                                       if ( substr( $object, -1 ) !== '/' ) {
+                                               $files[] = $object; // directories end in '/'
+                                       }
+                               }
+                       // Recursive: list all files under $dir and its subdirs
+                       } else { // files
+                               $objects = $container->list_objects( $limit, $after, $prefix );
+                               $files = $objects;
+                       }
+                       if ( count( $objects ) < $limit ) {
+                               $after = INF; // avoid a second RTT
+                       } else {
+                               $after = end( $objects ); // update last item
+                       }
+               } catch ( NoSuchContainerException $e ) {
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__,
+                               array( 'cont' => $fullCont, 'dir' => $dir ) );
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               return $files;
+       }
+
+       /**
+        * @see FileBackendStore::doGetFileSha1base36()
+        * @return bool
+        */
+       protected function doGetFileSha1base36( array $params ) {
+               $stat = $this->getFileStat( $params );
+               if ( $stat ) {
+                       return $stat['sha1'];
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doStreamFile()
+        * @return Status
+        */
+       protected function doStreamFile( array $params ) {
+               $status = Status::newGood();
+
+               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+               if ( $srcRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+               }
+
+               try {
+                       $cont = $this->getContainer( $srcCont );
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-stream', $params['src'] );
+                       return $status;
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+                       return $status;
+               }
+
+               try {
+                       $output = fopen( 'php://output', 'wb' );
+                       $obj = new CF_Object( $cont, $srcRel, false, false ); // skip HEAD
+                       $obj->stream( $output, $this->headersFromParams( $params ) );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::getLocalCopy()
+        * @return null|TempFSFile
+        */
+       public function getLocalCopy( array $params ) {
+               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+               if ( $srcRel === null ) {
+                       return null;
+               }
+
+               // Blindly create a tmp file and stream to it, catching any exception if the file does
+               // not exist. Also, doing a stat here will cause infinite loops when filling metadata.
+               $tmpFile = null;
+               try {
+                       $sContObj = $this->getContainer( $srcCont );
+                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+                       // Get source file extension
+                       $ext = FileBackend::extensionFromPath( $srcRel );
+                       // Create a new temporary file...
+                       $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
+                       if ( $tmpFile ) {
+                               $handle = fopen( $tmpFile->getPath(), 'wb' );
+                               if ( $handle ) {
+                                       $obj->stream( $handle, $this->headersFromParams( $params ) );
+                                       fclose( $handle );
+                               } else {
+                                       $tmpFile = null; // couldn't open temp file
+                               }
+                       }
+               } catch ( NoSuchContainerException $e ) {
+                       $tmpFile = null;
+               } catch ( NoSuchObjectException $e ) {
+                       $tmpFile = null;
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $tmpFile = null;
+                       $this->handleException( $e, null, __METHOD__, $params );
+               }
+
+               return $tmpFile;
+       }
+
+       /**
+        * @see FileBackendStore::directoriesAreVirtual()
+        * @return bool
+        */
+       protected function directoriesAreVirtual() {
+               return true;
+       }
+
+       /**
+        * Get headers to send to Swift when reading a file based
+        * on a FileBackend params array, e.g. that of getLocalCopy().
+        * $params is currently only checked for a 'latest' flag.
+        *
+        * @param $params Array
+        * @return Array
+        */
+       protected function headersFromParams( array $params ) {
+               $hdrs = array();
+               if ( !empty( $params['latest'] ) ) {
+                       $hdrs[] = 'X-Newest: true';
+               }
+               return $hdrs;
+       }
+
+       /**
+        * @see FileBackendStore::doExecuteOpHandlesInternal()
+        * @return Array List of corresponding Status objects
+        */
+       protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
+               $statuses = array();
+
+               $cfOps = array(); // list of CF_Async_Op objects
+               foreach ( $fileOpHandles as $index => $fileOpHandle ) {
+                       $cfOps[$index] = $fileOpHandle->cfOp;
+               }
+               $batch = new CF_Async_Op_Batch( $cfOps );
+
+               $cfOps = $batch->execute();
+               foreach ( $cfOps as $index => $cfOp ) {
+                       $status = Status::newGood();
+                       try { // catch exceptions; update status
+                               $function = '_getResponse' . $fileOpHandles[$index]->call;
+                               $this->$function( $cfOp, $status, $fileOpHandles[$index]->params );
+                               $this->purgeCDNCache( $fileOpHandles[$index]->affectedObjects );
+                       } catch ( CloudFilesException $e ) { // some other exception?
+                               $this->handleException( $e, $status,
+                                       __CLASS__ . ":$function", $fileOpHandles[$index]->params );
+                       }
+                       $statuses[$index] = $status;
+               }
+
+               return $statuses;
+       }
+
+       /**
+        * Set read/write permissions for a Swift container.
+        *
+        * $readGrps is a list of the possible criteria for a request to have
+        * access to read a container. Each item is one of the following formats:
+        *   - account:user       : Grants access if the request is by the given user
+        *   - .r:<regex>         : Grants access if the request is from a referrer host that
+        *                          matches the expression and the request is not for a listing.
+        *                          Setting this to '*' effectively makes a container public.
+        *   - .rlistings:<regex> : Grants access if the request is from a referrer host that
+        *                          matches the expression and the request for a listing.
+        *
+        * $writeGrps is a list of the possible criteria for a request to have
+        * access to write to a container. Each item is of the following format:
+        *   - account:user       : Grants access if the request is by the given user
+        *
+        * @see http://swift.openstack.org/misc.html#acls
+        *
+        * In general, we don't allow listings to end-users. It's not useful, isn't well-defined
+        * (lists are truncated to 10000 item with no way to page), and is just a performance risk.
+        *
+        * @param $contObj CF_Container Swift container
+        * @param $readGrps Array List of read access routes
+        * @param $writeGrps Array List of write access routes
+        * @return Status
+        */
+       protected function setContainerAccess(
+               CF_Container $contObj, array $readGrps, array $writeGrps
+       ) {
+               $creds = $contObj->cfs_auth->export_credentials();
+
+               $url = $creds['storage_url'] . '/' . rawurlencode( $contObj->name );
+
+               // Note: 10 second timeout consistent with php-cloudfiles
+               $req = MWHttpRequest::factory( $url, array( 'method' => 'POST', 'timeout' => 10 ) );
+               $req->setHeader( 'X-Auth-Token', $creds['auth_token'] );
+               $req->setHeader( 'X-Container-Read', implode( ',', $readGrps ) );
+               $req->setHeader( 'X-Container-Write', implode( ',', $writeGrps ) );
+
+               return $req->execute(); // should return 204
+       }
+
+       /**
+        * Purge the CDN cache of affected objects if CDN caching is enabled.
+        * This is for Rackspace/Akamai CDNs.
+        *
+        * @param $objects Array List of CF_Object items
+        * @return void
+        */
+       public function purgeCDNCache( array $objects ) {
+               if ( $this->swiftUseCDN && $this->swiftCDNPurgable ) {
+                       foreach ( $objects as $object ) {
+                               try {
+                                       $object->purge_from_cdn();
+                               } catch ( CDNNotEnabledException $e ) {
+                                       // CDN not enabled; nothing to see here
+                               } catch ( CloudFilesException $e ) {
+                                       $this->handleException( $e, null, __METHOD__,
+                                               array( 'cont' => $object->container->name, 'obj' => $object->name ) );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Get an authenticated connection handle to the Swift proxy
+        *
+        * @return CF_Connection|bool False on failure
+        * @throws CloudFilesException
+        */
+       protected function getConnection() {
+               if ( $this->connException instanceof CloudFilesException ) {
+                       if ( ( time() - $this->connErrorTime ) < 60 ) {
+                               throw $this->connException; // failed last attempt; don't bother
+                       } else { // actually retry this time
+                               $this->connException = null;
+                               $this->connErrorTime = 0;
+                       }
+               }
+               // Session keys expire after a while, so we renew them periodically
+               $reAuth = ( ( time() - $this->sessionStarted ) > $this->authTTL );
+               // Authenticate with proxy and get a session key...
+               if ( !$this->conn || $reAuth ) {
+                       $this->sessionStarted = 0;
+                       $this->connContainerCache->clear();
+                       $cacheKey = $this->getCredsCacheKey( $this->auth->username );
+                       $creds = $this->srvCache->get( $cacheKey ); // credentials
+                       if ( is_array( $creds ) ) { // cache hit
+                               $this->auth->load_cached_credentials(
+                                       $creds['auth_token'], $creds['storage_url'], $creds['cdnm_url'] );
+                               $this->sessionStarted = time() - ceil( $this->authTTL/2 ); // skew for worst case
+                       } else { // cache miss
+                               try {
+                                       $this->auth->authenticate();
+                                       $creds = $this->auth->export_credentials();
+                                       $this->srvCache->add( $cacheKey, $creds, ceil( $this->authTTL/2 ) ); // cache
+                                       $this->sessionStarted = time();
+                               } catch ( CloudFilesException $e ) {
+                                       $this->connException = $e; // don't keep re-trying
+                                       $this->connErrorTime = time();
+                                       throw $e; // throw it back
+                               }
+                       }
+                       if ( $this->conn ) { // re-authorizing?
+                               $this->conn->close(); // close active cURL handles in CF_Http object
+                       }
+                       $this->conn = new CF_Connection( $this->auth );
+               }
+               return $this->conn;
+       }
+
+       /**
+        * Get the cache key for a container
+        *
+        * @param $username string
+        * @return string
+        */
+       private function getCredsCacheKey( $username ) {
+               return wfMemcKey( 'backend', $this->getName(), 'usercreds', $username );
+       }
+
+       /**
+        * @see FileBackendStore::doClearCache()
+        */
+       protected function doClearCache( array $paths = null ) {
+               $this->connContainerCache->clear(); // clear container object cache
+       }
+
+       /**
+        * Get a Swift container object, possibly from process cache.
+        * Use $reCache if the file count or byte count is needed.
+        *
+        * @param $container string Container name
+        * @param $bypassCache bool Bypass all caches and load from Swift
+        * @return CF_Container
+        * @throws CloudFilesException
+        */
+       protected function getContainer( $container, $bypassCache = false ) {
+               $conn = $this->getConnection(); // Swift proxy connection
+               if ( $bypassCache ) { // purge cache
+                       $this->connContainerCache->clear( $container );
+               } elseif ( !$this->connContainerCache->has( $container, 'obj' ) ) {
+                       $this->primeContainerCache( array( $container ) ); // check persistent cache
+               }
+               if ( !$this->connContainerCache->has( $container, 'obj' ) ) {
+                       $contObj = $conn->get_container( $container );
+                       // NoSuchContainerException not thrown: container must exist
+                       $this->connContainerCache->set( $container, 'obj', $contObj ); // cache it
+                       if ( !$bypassCache ) {
+                               $this->setContainerCache( $container, // update persistent cache
+                                       array( 'bytes' => $contObj->bytes_used, 'count' => $contObj->object_count )
+                               );
+                       }
+               }
+               return $this->connContainerCache->get( $container, 'obj' );
+       }
+
+       /**
+        * Create a Swift container
+        *
+        * @param $container string Container name
+        * @return CF_Container
+        * @throws CloudFilesException
+        */
+       protected function createContainer( $container ) {
+               $conn = $this->getConnection(); // Swift proxy connection
+               $contObj = $conn->create_container( $container );
+               $this->connContainerCache->set( $container, 'obj', $contObj ); // cache
+               return $contObj;
+       }
+
+       /**
+        * Delete a Swift container
+        *
+        * @param $container string Container name
+        * @return void
+        * @throws CloudFilesException
+        */
+       protected function deleteContainer( $container ) {
+               $conn = $this->getConnection(); // Swift proxy connection
+               $this->connContainerCache->clear( $container ); // purge
+               $conn->delete_container( $container );
+       }
+
+       /**
+        * @see FileBackendStore::doPrimeContainerCache()
+        * @return void
+        */
+       protected function doPrimeContainerCache( array $containerInfo ) {
+               try {
+                       $conn = $this->getConnection(); // Swift proxy connection
+                       foreach ( $containerInfo as $container => $info ) {
+                               $contObj = new CF_Container( $conn->cfs_auth, $conn->cfs_http,
+                                       $container, $info['count'], $info['bytes'] );
+                               $this->connContainerCache->set( $container, 'obj', $contObj );
+                       }
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__, array() );
+               }
+       }
+
+       /**
+        * Log an unexpected exception for this backend.
+        * This also sets the Status object to have a fatal error.
+        *
+        * @param $e Exception
+        * @param $status Status|null
+        * @param $func string
+        * @param $params Array
+        * @return void
+        */
+       protected function handleException( Exception $e, $status, $func, array $params ) {
+               if ( $status instanceof Status ) {
+                       if ( $e instanceof AuthenticationException ) {
+                               $status->fatal( 'backend-fail-connect', $this->name );
+                       } else {
+                               $status->fatal( 'backend-fail-internal', $this->name );
+                       }
+               }
+               if ( $e->getMessage() ) {
+                       trigger_error( "$func: " . $e->getMessage(), E_USER_WARNING );
+               }
+               if ( $e instanceof InvalidResponseException ) { // possibly a stale token
+                       $this->srvCache->delete( $this->getCredsCacheKey( $this->auth->username ) );
+               }
+               wfDebugLog( 'SwiftBackend',
+                       get_class( $e ) . " in '{$func}' (given '" . FormatJson::encode( $params ) . "')" .
+                       ( $e->getMessage() ? ": {$e->getMessage()}" : "" )
+               );
+       }
+}
+
+/**
+ * @see FileBackendStoreOpHandle
+ */
+class SwiftFileOpHandle extends FileBackendStoreOpHandle {
+       /** @var CF_Async_Op */
+       public $cfOp;
+       /** @var Array */
+       public $affectedObjects = array();
+
+       public function __construct( $backend, array $params, $call, CF_Async_Op $cfOp ) {
+               $this->backend = $backend;
+               $this->params = $params;
+               $this->call = $call;
+               $this->cfOp = $cfOp;
+       }
+}
+
+/**
+ * SwiftFileBackend helper class to page through listings.
+ * Swift also has a listing limit of 10,000 objects for sanity.
+ * Do not use this class from places outside SwiftFileBackend.
+ *
+ * @ingroup FileBackend
+ */
+abstract class SwiftFileBackendList implements Iterator {
+       /** @var Array */
+       protected $bufferIter = array();
+       protected $bufferAfter = null; // string; list items *after* this path
+       protected $pos = 0; // integer
+       /** @var Array */
+       protected $params = array();
+
+       /** @var SwiftFileBackend */
+       protected $backend;
+       protected $container; // string; container name
+       protected $dir; // string; storage directory
+       protected $suffixStart; // integer
+
+       const PAGE_SIZE = 9000; // file listing buffer size
+
+       /**
+        * @param $backend SwiftFileBackend
+        * @param $fullCont string Resolved container name
+        * @param $dir string Resolved directory relative to container
+        * @param $params Array
+        */
+       public function __construct( SwiftFileBackend $backend, $fullCont, $dir, array $params ) {
+               $this->backend = $backend;
+               $this->container = $fullCont;
+               $this->dir = $dir;
+               if ( substr( $this->dir, -1 ) === '/' ) {
+                       $this->dir = substr( $this->dir, 0, -1 ); // remove trailing slash
+               }
+               if ( $this->dir == '' ) { // whole container
+                       $this->suffixStart = 0;
+               } else { // dir within container
+                       $this->suffixStart = strlen( $this->dir ) + 1; // size of "path/to/dir/"
+               }
+               $this->params = $params;
+       }
+
+       /**
+        * @see Iterator::key()
+        * @return integer
+        */
+       public function key() {
+               return $this->pos;
+       }
+
+       /**
+        * @see Iterator::next()
+        * @return void
+        */
+       public function next() {
+               // Advance to the next file in the page
+               next( $this->bufferIter );
+               ++$this->pos;
+               // Check if there are no files left in this page and
+               // advance to the next page if this page was not empty.
+               if ( !$this->valid() && count( $this->bufferIter ) ) {
+                       $this->bufferIter = $this->pageFromList(
+                               $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
+                       ); // updates $this->bufferAfter
+               }
+       }
+
+       /**
+        * @see Iterator::rewind()
+        * @return void
+        */
+       public function rewind() {
+               $this->pos = 0;
+               $this->bufferAfter = null;
+               $this->bufferIter = $this->pageFromList(
+                       $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
+               ); // updates $this->bufferAfter
+       }
+
+       /**
+        * @see Iterator::valid()
+        * @return bool
+        */
+       public function valid() {
+               if ( $this->bufferIter === null ) {
+                       return false; // some failure?
+               } else {
+                       return ( current( $this->bufferIter ) !== false ); // no paths can have this value
+               }
+       }
+
+       /**
+        * Get the given list portion (page)
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $after string|null
+        * @param $limit integer
+        * @param $params Array
+        * @return Traversable|Array|null Returns null on failure
+        */
+       abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
+}
+
+/**
+ * Iterator for listing directories
+ */
+class SwiftFileBackendDirList extends SwiftFileBackendList {
+       /**
+        * @see Iterator::current()
+        * @return string|bool String (relative path) or false
+        */
+       public function current() {
+               return substr( current( $this->bufferIter ), $this->suffixStart, -1 );
+       }
+
+       /**
+        * @see SwiftFileBackendList::pageFromList()
+        * @return Array|null
+        */
+       protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
+               return $this->backend->getDirListPageInternal( $container, $dir, $after, $limit, $params );
+       }
+}
+
+/**
+ * Iterator for listing regular files
+ */
+class SwiftFileBackendFileList extends SwiftFileBackendList {
+       /**
+        * @see Iterator::current()
+        * @return string|bool String (relative path) or false
+        */
+       public function current() {
+               return substr( current( $this->bufferIter ), $this->suffixStart );
+       }
+
+       /**
+        * @see SwiftFileBackendList::pageFromList()
+        * @return Array|null
+        */
+       protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
+               return $this->backend->getFileListPageInternal( $container, $dir, $after, $limit, $params );
+       }
+}
diff --git a/includes/filebackend/TempFSFile.php b/includes/filebackend/TempFSFile.php
new file mode 100644 (file)
index 0000000..b738898
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Location holder of files stored temporarily
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ */
+
+/**
+ * This class is used to hold the location and do limited manipulation
+ * of files stored temporarily (this will be whatever wfTempDir() returns)
+ *
+ * @ingroup FileBackend
+ */
+class TempFSFile extends FSFile {
+       protected $canDelete = false; // bool; garbage collect the temp file
+
+       /** @var Array of active temp files to purge on shutdown */
+       protected static $instances = array();
+
+       /**
+        * Make a new temporary file on the file system.
+        * Temporary files may be purged when the file object falls out of scope.
+        *
+        * @param $prefix string
+        * @param $extension string
+        * @return TempFSFile|null
+        */
+       public static function factory( $prefix, $extension = '' ) {
+               wfProfileIn( __METHOD__ );
+               $base = wfTempDir() . '/' . $prefix . wfRandomString( 12 );
+               $ext = ( $extension != '' ) ? ".{$extension}" : "";
+               for ( $attempt = 1; true; $attempt++ ) {
+                       $path = "{$base}-{$attempt}{$ext}";
+                       wfSuppressWarnings();
+                       $newFileHandle = fopen( $path, 'x' );
+                       wfRestoreWarnings();
+                       if ( $newFileHandle ) {
+                               fclose( $newFileHandle );
+                               break; // got it
+                       }
+                       if ( $attempt >= 15 ) {
+                               wfProfileOut( __METHOD__ );
+                               return null; // give up
+                       }
+               }
+               $tmpFile = new self( $path );
+               $tmpFile->canDelete = true; // safely instantiated
+               wfProfileOut( __METHOD__ );
+               return $tmpFile;
+       }
+
+       /**
+        * Purge this file off the file system
+        *
+        * @return bool Success
+        */
+       public function purge() {
+               $this->canDelete = false; // done
+               wfSuppressWarnings();
+               $ok = unlink( $this->path );
+               wfRestoreWarnings();
+               return $ok;
+       }
+
+       /**
+        * Clean up the temporary file only after an object goes out of scope
+        *
+        * @param $object Object
+        * @return void
+        */
+       public function bind( $object ) {
+               if ( is_object( $object ) ) {
+                       $object->tempFSFileReferences[] = $this;
+               }
+       }
+
+       /**
+        * Set flag to not clean up after the temporary file
+        *
+        * @return void
+        */
+       public function preserve() {
+               $this->canDelete = false;
+       }
+
+       /**
+        * Set flag clean up after the temporary file
+        *
+        * @return void
+        */
+       public function autocollect() {
+               $this->canDelete = true;
+       }
+
+       /**
+        * Cleans up after the temporary file by deleting it
+        */
+       function __destruct() {
+               if ( $this->canDelete ) {
+                       wfSuppressWarnings();
+                       unlink( $this->path );
+                       wfRestoreWarnings();
+               }
+       }
+}
diff --git a/includes/filebackend/filejournal/DBFileJournal.php b/includes/filebackend/filejournal/DBFileJournal.php
new file mode 100644 (file)
index 0000000..f6268c2
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Version of FileJournal that logs to a DB table.
+ *
+ * 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 FileJournal
+ * @author Aaron Schulz
+ */
+
+/**
+ * Version of FileJournal that logs to a DB table
+ * @since 1.20
+ */
+class DBFileJournal extends FileJournal {
+       /** @var DatabaseBase */
+       protected $dbw;
+
+       protected $wiki = false; // string; wiki DB name
+
+       /**
+        * Construct a new instance from configuration.
+        * $config includes:
+        *     'wiki' : wiki name to use for LoadBalancer
+        *
+        * @param $config Array
+        */
+       protected function __construct( array $config ) {
+               parent::__construct( $config );
+
+               $this->wiki = $config['wiki'];
+       }
+
+       /**
+        * @see FileJournal::logChangeBatch()
+        * @return Status
+        */
+       protected function doLogChangeBatch( array $entries, $batchId ) {
+               $status = Status::newGood();
+
+               try {
+                       $dbw = $this->getMasterDB();
+               } catch ( DBError $e ) {
+                       $status->fatal( 'filejournal-fail-dbconnect', $this->backend );
+                       return $status;
+               }
+
+               $now = wfTimestamp( TS_UNIX );
+
+               $data = array();
+               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 )
+                       );
+               }
+
+               try {
+                       $dbw->insert( 'filejournal', $data, __METHOD__ );
+               } catch ( DBError $e ) {
+                       $status->fatal( 'filejournal-fail-dbquery', $this->backend );
+                       return $status;
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see FileJournal::doGetChangeEntries()
+        * @return Array
+        * @throws DBError
+        */
+       protected function doGetChangeEntries( $start, $limit ) {
+               $dbw = $this->getMasterDB();
+
+               $res = $dbw->select( 'filejournal', '*',
+                       array(
+                               'fj_backend' => $this->backend,
+                               'fj_id >= ' . $dbw->addQuotes( (int)$start ) ), // $start may be 0
+                       __METHOD__,
+                       array_merge( array( 'ORDER BY' => 'fj_id ASC' ),
+                               $limit ? array( 'LIMIT' => $limit ) : array() )
+               );
+
+               $entries = array();
+               foreach ( $res as $row ) {
+                       $item = array();
+                       foreach ( (array)$row as $key => $value ) {
+                               $item[substr( $key, 3 )] = $value; // "fj_op" => "op"
+                       }
+                       $entries[] = $item;
+               }
+
+               return $entries;
+       }
+
+       /**
+        * @see FileJournal::purgeOldLogs()
+        * @return Status
+        * @throws DBError
+        */
+       protected function doPurgeOldLogs() {
+               $status = Status::newGood();
+               if ( $this->ttlDays <= 0 ) {
+                       return $status; // nothing to do
+               }
+
+               $dbw = $this->getMasterDB();
+               $dbCutoff = $dbw->timestamp( time() - 86400 * $this->ttlDays );
+
+               $dbw->delete( 'filejournal',
+                       array( 'fj_timestamp < ' . $dbw->addQuotes( $dbCutoff ) ),
+                       __METHOD__
+               );
+
+               return $status;
+       }
+
+       /**
+        * Get a master connection to the logging DB
+        *
+        * @return DatabaseBase
+        * @throws DBError
+        */
+       protected function getMasterDB() {
+               if ( !$this->dbw ) {
+                       // Get a separate connection in autocommit mode
+                       $lb = wfGetLBFactory()->newMainLB();
+                       $this->dbw = $lb->getConnection( DB_MASTER, array(), $this->wiki );
+                       $this->dbw->clearFlag( DBO_TRX );
+               }
+               return $this->dbw;
+       }
+}
diff --git a/includes/filebackend/filejournal/FileJournal.php b/includes/filebackend/filejournal/FileJournal.php
new file mode 100644 (file)
index 0000000..ce029bb
--- /dev/null
@@ -0,0 +1,196 @@
+<?php
+/**
+ * @defgroup FileJournal File journal
+ * @ingroup FileBackend
+ */
+
+/**
+ * File operation journaling.
+ *
+ * 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 FileJournal
+ * @author Aaron Schulz
+ */
+
+/**
+ * @brief Class for handling file operation journaling.
+ *
+ * Subclasses should avoid throwing exceptions at all costs.
+ *
+ * @ingroup FileJournal
+ * @since 1.20
+ */
+abstract class FileJournal {
+       protected $backend; // string
+       protected $ttlDays; // integer
+
+       /**
+        * Construct a new instance from configuration.
+        * $config includes:
+        *     'ttlDays' : days to keep log entries around (false means "forever")
+        *
+        * @param $config Array
+        */
+       protected function __construct( array $config ) {
+               $this->ttlDays = isset( $config['ttlDays'] ) ? $config['ttlDays'] : false;
+       }
+
+       /**
+        * Create an appropriate FileJournal object from config
+        *
+        * @param $config Array
+        * @param $backend string A registered file backend name
+        * @throws MWException
+        * @return FileJournal
+        */
+       final public static function factory( array $config, $backend ) {
+               $class = $config['class'];
+               $jrn = new $class( $config );
+               if ( !$jrn instanceof self ) {
+                       throw new MWException( "Class given is not an instance of FileJournal." );
+               }
+               $jrn->backend = $backend;
+               return $jrn;
+       }
+
+       /**
+        * Get a statistically unique ID string
+        *
+        * @return string <9 char TS_MW timestamp in base 36><22 random base 36 chars>
+        */
+       final public function getTimestampedUUID() {
+               $s = '';
+               for ( $i = 0; $i < 5; $i++ ) {
+                       $s .= mt_rand( 0, 2147483647 );
+               }
+               $s = wfBaseConvert( sha1( $s ), 16, 36, 31 );
+               return substr( wfBaseConvert( wfTimestamp( TS_MW ), 10, 36, 9 ) . $s, 0, 31 );
+       }
+
+       /**
+        * Log changes made by a batch file operation.
+        * $entries is an array of log entries, each of which contains:
+        *     op      : Basic operation name (create, store, copy, delete)
+        *     path    : The storage path of the file
+        *     newSha1 : The final base 36 SHA-1 of the file
+        * Note that 'false' should be used as the SHA-1 for non-existing files.
+        *
+        * @param $entries Array List of file operations (each an array of parameters)
+        * @param $batchId string UUID string that identifies the operation batch
+        * @return Status
+        */
+       final public function logChangeBatch( array $entries, $batchId ) {
+               if ( !count( $entries ) ) {
+                       return Status::newGood();
+               }
+               return $this->doLogChangeBatch( $entries, $batchId );
+       }
+
+       /**
+        * @see FileJournal::logChangeBatch()
+        *
+        * @param $entries Array List of file operations (each an array of parameters)
+        * @param $batchId string UUID string that identifies the operation batch
+        * @return Status
+        */
+       abstract protected function doLogChangeBatch( array $entries, $batchId );
+
+       /**
+        * Get an array of file change log entries.
+        * A starting change ID and/or limit can be specified.
+        *
+        * The result as a list of associative arrays, each having:
+        *     id         : unique, monotonic, ID for this change
+        *     batch_uuid : UUID for an operation batch
+        *     backend    : the backend name
+        *     op         : primitive operation (create,update,delete,null)
+        *     path       : affected storage path
+        *     new_sha1   : base 36 sha1 of the new file had the operation succeeded
+        *     timestamp  : TS_MW timestamp of the batch change
+
+        * Also, $next is updated to the ID of the next entry.
+        *
+        * @param $start integer Starting change ID or null
+        * @param $limit integer Maximum number of items to return
+        * @param &$next string
+        * @return Array
+        */
+       final public function getChangeEntries( $start = null, $limit = 0, &$next = null ) {
+               $entries = $this->doGetChangeEntries( $start, $limit ? $limit + 1 : 0 );
+               if ( $limit && count( $entries ) > $limit ) {
+                       $last = array_pop( $entries ); // remove the extra entry
+                       $next = $last['id']; // update for next call
+               } else {
+                       $next = null; // end of list
+               }
+               return $entries;
+       }
+
+       /**
+        * @see FileJournal::getChangeEntries()
+        * @return Array
+        */
+       abstract protected function doGetChangeEntries( $start, $limit );
+
+       /**
+        * Purge any old log entries
+        *
+        * @return Status
+        */
+       final public function purgeOldLogs() {
+               return $this->doPurgeOldLogs();
+       }
+
+       /**
+        * @see FileJournal::purgeOldLogs()
+        * @return Status
+        */
+       abstract protected function doPurgeOldLogs();
+}
+
+/**
+ * Simple version of FileJournal that does nothing
+ * @since 1.20
+ */
+class NullFileJournal extends FileJournal {
+       /**
+        * @see FileJournal::logChangeBatch()
+        * @param $entries array
+        * @param $batchId string
+        * @return Status
+        */
+       protected function doLogChangeBatch( array $entries, $batchId ) {
+               return Status::newGood();
+       }
+
+       /**
+        * @see FileJournal::doGetChangeEntries()
+        * @return Array
+        */
+       protected function doGetChangeEntries( $start, $limit ) {
+               return array();
+       }
+
+       /**
+        * @see FileJournal::purgeOldLogs()
+        * @return Status
+        */
+       protected function doPurgeOldLogs() {
+               return Status::newGood();
+       }
+}
diff --git a/includes/filebackend/lockmanager/DBLockManager.php b/includes/filebackend/lockmanager/DBLockManager.php
new file mode 100644 (file)
index 0000000..204ca3b
--- /dev/null
@@ -0,0 +1,374 @@
+<?php
+/**
+ * Version of LockManager based on using DB table locks.
+ *
+ * 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
+ */
+
+/**
+ * Version of LockManager based on using DB table locks.
+ * This is meant for multi-wiki systems that may share files.
+ * All locks are blocking, so it might be useful to set a small
+ * lock-wait timeout via server config to curtail 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 DBs, each on their
+ * own server, all having the filelocks.sql tables (with row-level locking).
+ * A majority of peer DBs must agree for a lock to be acquired.
+ *
+ * Caching is used to avoid hitting servers that are down.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+class DBLockManager extends QuorumLockManager {
+       /** @var Array Map of DB names to server config */
+       protected $dbServers; // (DB name => server config array)
+       /** @var BagOStuff */
+       protected $statusCache;
+
+       protected $lockExpiry; // integer number of seconds
+       protected $safeDelay; // integer number of seconds
+
+       protected $session = 0; // random integer
+       /** @var Array Map Database connections (DB name => Database) */
+       protected $conns = array();
+
+       /**
+        * Construct a new instance from configuration.
+        *
+        * $config paramaters include:
+        *     'dbServers'   : Associative array of DB names to server configuration.
+        *                     Configuration is an associative array that includes:
+        *                     'host'        - DB server name
+        *                     'dbname'      - DB name
+        *                     'type'        - DB type (mysql,postgres,...)
+        *                     'user'        - DB user
+        *                     'password'    - DB user password
+        *                     'tablePrefix' - DB table prefix
+        *                     'flags'       - DB flags (see DatabaseBase)
+        *     'dbsByBucket' : Array of 1-16 consecutive integer keys, starting from 0,
+        *                     each having an odd-numbered list of DB names (peers) as values.
+        *                     Any DB named 'localDBMaster' will automatically use the DB master
+        *                     settings for this wiki (without the need for a dbServers entry).
+        *     'lockExpiry'  : Lock timeout (seconds) for dropped connections. [optional]
+        *                     This tells the DB server how long to wait before assuming
+        *                     connection failure and releasing all the locks for a session.
+        *
+        * @param Array $config
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+
+               $this->dbServers = isset( $config['dbServers'] )
+                       ? $config['dbServers']
+                       : array(); // likely just using 'localDBMaster'
+               // Sanitize srvsByBucket config to prevent PHP errors
+               $this->srvsByBucket = array_filter( $config['dbsByBucket'], 'is_array' );
+               $this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
+
+               if ( isset( $config['lockExpiry'] ) ) {
+                       $this->lockExpiry = $config['lockExpiry'];
+               } else {
+                       $met = ini_get( 'max_execution_time' );
+                       $this->lockExpiry = $met ? $met : 60; // use some sane amount if 0
+               }
+               $this->safeDelay = ( $this->lockExpiry <= 0 )
+                       ? 60 // pick a safe-ish number to match DB timeout default
+                       : $this->lockExpiry; // cover worst case
+
+               foreach ( $this->srvsByBucket as $bucket ) {
+                       if ( count( $bucket ) > 1 ) { // multiple peers
+                               // Tracks peers that couldn't be queried recently to avoid lengthy
+                               // connection timeouts. This is useless if each bucket has one peer.
+                               try {
+                                       $this->statusCache = ObjectCache::newAccelerator( array() );
+                               } catch ( MWException $e ) {
+                                       trigger_error( __CLASS__ .
+                                               " using multiple DB peers without apc, xcache, or wincache." );
+                               }
+                               break;
+                       }
+               }
+
+               $this->session = wfRandomString( 31 );
+       }
+
+       /**
+        * Get a connection to a lock DB and acquire locks on $paths.
+        * This does not use GET_LOCK() per http://bugs.mysql.com/bug.php?id=1118.
+        *
+        * @see QuorumLockManager::getLocksOnServer()
+        * @return Status
+        */
+       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               if ( $type == self::LOCK_EX ) { // writer locks
+                       try {
+                               $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+                               # Build up values for INSERT clause
+                               $data = array();
+                               foreach ( $keys as $key ) {
+                                       $data[] = array( 'fle_key' => $key );
+                               }
+                               # Wait on any existing writers and block new ones if we get in
+                               $db = $this->getConnection( $lockSrv ); // checked in isServerUp()
+                               $db->insert( 'filelocks_exclusive', $data, __METHOD__ );
+                       } catch ( DBError $e ) {
+                               foreach ( $paths as $path ) {
+                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                               }
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see QuorumLockManager::freeLocksOnServer()
+        * @return Status
+        */
+       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+               return Status::newGood(); // not supported
+       }
+
+       /**
+        * @see QuorumLockManager::releaseAllLocks()
+        * @return Status
+        */
+       protected function releaseAllLocks() {
+               $status = Status::newGood();
+
+               foreach ( $this->conns as $lockDb => $db ) {
+                       if ( $db->trxLevel() ) { // in transaction
+                               try {
+                                       $db->rollback( __METHOD__ ); // finish transaction and kill any rows
+                               } catch ( DBError $e ) {
+                                       $status->fatal( 'lockmanager-fail-db-release', $lockDb );
+                               }
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see QuorumLockManager::isServerUp()
+        * @return bool
+        */
+       protected function isServerUp( $lockSrv ) {
+               if ( !$this->cacheCheckFailures( $lockSrv ) ) {
+                       return false; // recent failure to connect
+               }
+               try {
+                       $this->getConnection( $lockSrv );
+               } catch ( DBError $e ) {
+                       $this->cacheRecordFailure( $lockSrv );
+                       return false; // failed to connect
+               }
+               return true;
+       }
+
+       /**
+        * Get (or reuse) a connection to a lock DB
+        *
+        * @param $lockDb string
+        * @return DatabaseBase
+        * @throws DBError
+        */
+       protected function getConnection( $lockDb ) {
+               if ( !isset( $this->conns[$lockDb] ) ) {
+                       $db = null;
+                       if ( $lockDb === 'localDBMaster' ) {
+                               $lb = wfGetLBFactory()->newMainLB();
+                               $db = $lb->getConnection( DB_MASTER );
+                       } elseif ( isset( $this->dbServers[$lockDb] ) ) {
+                               $config = $this->dbServers[$lockDb];
+                               $db = DatabaseBase::factory( $config['type'], $config );
+                       }
+                       if ( !$db ) {
+                               return null; // config error?
+                       }
+                       $this->conns[$lockDb] = $db;
+                       $this->conns[$lockDb]->clearFlag( DBO_TRX );
+                       # If the connection drops, try to avoid letting the DB rollback
+                       # and release the locks before the file operations are finished.
+                       # This won't handle the case of DB server restarts however.
+                       $options = array();
+                       if ( $this->lockExpiry > 0 ) {
+                               $options['connTimeout'] = $this->lockExpiry;
+                       }
+                       $this->conns[$lockDb]->setSessionOptions( $options );
+                       $this->initConnection( $lockDb, $this->conns[$lockDb] );
+               }
+               if ( !$this->conns[$lockDb]->trxLevel() ) {
+                       $this->conns[$lockDb]->begin( __METHOD__ ); // start transaction
+               }
+               return $this->conns[$lockDb];
+       }
+
+       /**
+        * Do additional initialization for new lock DB connection
+        *
+        * @param $lockDb string
+        * @param $db DatabaseBase
+        * @return void
+        * @throws DBError
+        */
+       protected function initConnection( $lockDb, DatabaseBase $db ) {}
+
+       /**
+        * Checks if the DB has not recently had connection/query errors.
+        * This just avoids wasting time on doomed connection attempts.
+        *
+        * @param $lockDb string
+        * @return bool
+        */
+       protected function cacheCheckFailures( $lockDb ) {
+               return ( $this->statusCache && $this->safeDelay > 0 )
+                       ? !$this->statusCache->get( $this->getMissKey( $lockDb ) )
+                       : true;
+       }
+
+       /**
+        * Log a lock request failure to the cache
+        *
+        * @param $lockDb string
+        * @return bool Success
+        */
+       protected function cacheRecordFailure( $lockDb ) {
+               return ( $this->statusCache && $this->safeDelay > 0 )
+                       ? $this->statusCache->set( $this->getMissKey( $lockDb ), 1, $this->safeDelay )
+                       : true;
+       }
+
+       /**
+        * Get a cache key for recent query misses for a DB
+        *
+        * @param $lockDb string
+        * @return string
+        */
+       protected function getMissKey( $lockDb ) {
+               $lockDb = ( $lockDb === 'localDBMaster' ) ? wfWikiID() : $lockDb; // non-relative
+               return 'dblockmanager:downservers:' . str_replace( ' ', '_', $lockDb );
+       }
+
+       /**
+        * Make sure remaining locks get cleared for sanity
+        */
+       function __destruct() {
+               foreach ( $this->conns as $db ) {
+                       if ( $db->trxLevel() ) { // in transaction
+                               try {
+                                       $db->rollback( __METHOD__ ); // finish transaction and kill any rows
+                               } catch ( DBError $e ) {
+                                       // oh well
+                               }
+                       }
+                       $db->close();
+               }
+       }
+}
+
+/**
+ * MySQL version of DBLockManager that supports shared locks.
+ * All locks are non-blocking, which avoids deadlocks.
+ *
+ * @ingroup LockManager
+ */
+class MySqlLockManager extends DBLockManager {
+       /** @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
+       );
+
+       /**
+        * @param $lockDb string
+        * @param $db DatabaseBase
+        */
+       protected function initConnection( $lockDb, DatabaseBase $db ) {
+               # Let this transaction see lock rows from other transactions
+               $db->query( "SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;" );
+       }
+
+       /**
+        * Get a connection to a lock DB and acquire locks on $paths.
+        * This does not use GET_LOCK() per http://bugs.mysql.com/bug.php?id=1118.
+        *
+        * @see DBLockManager::getLocksOnServer()
+        * @return Status
+        */
+       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               $db = $this->getConnection( $lockSrv ); // checked in isServerUp()
+               $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+               # Build up values for INSERT clause
+               $data = array();
+               foreach ( $keys as $key ) {
+                       $data[] = array( 'fls_key' => $key, 'fls_session' => $this->session );
+               }
+               # Block new writers...
+               $db->insert( 'filelocks_shared', $data, __METHOD__, array( 'IGNORE' ) );
+               # Actually do the locking queries...
+               if ( $type == self::LOCK_SH ) { // reader locks
+                       # Bail if there are any existing writers...
+                       $blocked = $db->selectField( 'filelocks_exclusive', '1',
+                               array( 'fle_key' => $keys ),
+                               __METHOD__
+                       );
+                       # Prospective writers that haven't yet updated filelocks_exclusive
+                       # will recheck filelocks_shared after doing so and bail due to our entry.
+               } else { // writer locks
+                       $encSession = $db->addQuotes( $this->session );
+                       # Bail if there are any existing writers...
+                       # The may detect readers, but the safe check for them is below.
+                       # Note: if two writers come at the same time, both bail :)
+                       $blocked = $db->selectField( 'filelocks_shared', '1',
+                               array( 'fls_key' => $keys, "fls_session != $encSession" ),
+                               __METHOD__
+                       );
+                       if ( !$blocked ) {
+                               # Build up values for INSERT clause
+                               $data = array();
+                               foreach ( $keys as $key ) {
+                                       $data[] = array( 'fle_key' => $key );
+                               }
+                               # Block new readers/writers...
+                               $db->insert( 'filelocks_exclusive', $data, __METHOD__ );
+                               # Bail if there are any existing readers...
+                               $blocked = $db->selectField( 'filelocks_shared', '1',
+                                       array( 'fls_key' => $keys, "fls_session != $encSession" ),
+                                       __METHOD__
+                               );
+                       }
+               }
+
+               if ( $blocked ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                       }
+               }
+
+               return $status;
+       }
+}
diff --git a/includes/filebackend/lockmanager/FSLockManager.php b/includes/filebackend/lockmanager/FSLockManager.php
new file mode 100644 (file)
index 0000000..53f3e9f
--- /dev/null
@@ -0,0 +1,255 @@
+<?php
+/**
+ * Simple version of LockManager based on using FS lock files.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * 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
+ */
+
+/**
+ * Simple version of LockManager based on using FS lock files.
+ * All locks are non-blocking, which avoids deadlocks.
+ *
+ * This should work fine for small sites running off one server.
+ * Do not use this with 'lockDirectory' set to an NFS mount unless the
+ * NFS client is at least version 2.6.12. Otherwise, the BSD flock()
+ * locks will be ignored; see http://nfs.sourceforge.net/#section_d.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+class FSLockManager extends LockManager {
+       /** @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
+       );
+
+       protected $lockDir; // global dir for all servers
+
+       /** @var Array Map of (locked key => lock type => lock file handle) */
+       protected $handles = array();
+
+       /**
+        * Construct a new instance from configuration.
+        *
+        * $config includes:
+        *     'lockDirectory' : Directory containing the lock files
+        *
+        * @param array $config
+        */
+       function __construct( array $config ) {
+               parent::__construct( $config );
+
+               $this->lockDir = $config['lockDirectory'];
+       }
+
+       /**
+        * @see LockManager::doLock()
+        * @param $paths array
+        * @param $type int
+        * @return Status
+        */
+       protected function doLock( array $paths, $type ) {
+               $status = Status::newGood();
+
+               $lockedPaths = array(); // files locked in this attempt
+               foreach ( $paths as $path ) {
+                       $status->merge( $this->doSingleLock( $path, $type ) );
+                       if ( $status->isOK() ) {
+                               $lockedPaths[] = $path;
+                       } else {
+                               // Abort and unlock everything
+                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+                               return $status;
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see LockManager::doUnlock()
+        * @param $paths array
+        * @param $type int
+        * @return Status
+        */
+       protected function doUnlock( array $paths, $type ) {
+               $status = Status::newGood();
+
+               foreach ( $paths as $path ) {
+                       $status->merge( $this->doSingleUnlock( $path, $type ) );
+               }
+
+               return $status;
+       }
+
+       /**
+        * Lock a single resource key
+        *
+        * @param $path string
+        * @param $type integer
+        * @return Status
+        */
+       protected function doSingleLock( $path, $type ) {
+               $status = Status::newGood();
+
+               if ( isset( $this->locksHeld[$path][$type] ) ) {
+                       ++$this->locksHeld[$path][$type];
+               } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
+                       $this->locksHeld[$path][$type] = 1;
+               } else {
+                       wfSuppressWarnings();
+                       $handle = fopen( $this->getLockPath( $path ), 'a+' );
+                       wfRestoreWarnings();
+                       if ( !$handle ) { // lock dir missing?
+                               wfMkdirParents( $this->lockDir );
+                               $handle = fopen( $this->getLockPath( $path ), 'a+' ); // try again
+                       }
+                       if ( $handle ) {
+                               // Either a shared or exclusive lock
+                               $lock = ( $type == self::LOCK_SH ) ? LOCK_SH : LOCK_EX;
+                               if ( flock( $handle, $lock | LOCK_NB ) ) {
+                                       // Record this lock as active
+                                       $this->locksHeld[$path][$type] = 1;
+                                       $this->handles[$path][$type] = $handle;
+                               } else {
+                                       fclose( $handle );
+                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                               }
+                       } else {
+                               $status->fatal( 'lockmanager-fail-openlock', $path );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * Unlock a single resource key
+        *
+        * @param $path string
+        * @param $type integer
+        * @return Status
+        */
+       protected function doSingleUnlock( $path, $type ) {
+               $status = Status::newGood();
+
+               if ( !isset( $this->locksHeld[$path] ) ) {
+                       $status->warning( 'lockmanager-notlocked', $path );
+               } elseif ( !isset( $this->locksHeld[$path][$type] ) ) {
+                       $status->warning( 'lockmanager-notlocked', $path );
+               } else {
+                       $handlesToClose = array();
+                       --$this->locksHeld[$path][$type];
+                       if ( $this->locksHeld[$path][$type] <= 0 ) {
+                               unset( $this->locksHeld[$path][$type] );
+                               // If a LOCK_SH comes in while we have a LOCK_EX, we don't
+                               // actually add a handler, so check for handler existence.
+                               if ( isset( $this->handles[$path][$type] ) ) {
+                                       if ( $type === self::LOCK_EX
+                                               && isset( $this->locksHeld[$path][self::LOCK_SH] )
+                                               && !isset( $this->handles[$path][self::LOCK_SH] ) )
+                                       {
+                                               // EX lock came first: move this handle to the SH one
+                                               $this->handles[$path][self::LOCK_SH] = $this->handles[$path][$type];
+                                       } else {
+                                               // Mark this handle to be unlocked and closed
+                                               $handlesToClose[] = $this->handles[$path][$type];
+                                       }
+                                       unset( $this->handles[$path][$type] );
+                               }
+                       }
+                       if ( !count( $this->locksHeld[$path] ) ) {
+                               unset( $this->locksHeld[$path] ); // no locks on this path
+                       }
+                       // Unlock handles to release locks and delete
+                       // any lock files that end up with no locks on them...
+                       if ( wfIsWindows() ) {
+                               // Windows: for any process, including this one,
+                               // calling unlink() on a locked file will fail
+                               $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
+                               $status->merge( $this->pruneKeyLockFiles( $path ) );
+                       } else {
+                               // Unix: unlink() can be used on files currently open by this
+                               // process and we must do so in order to avoid race conditions
+                               $status->merge( $this->pruneKeyLockFiles( $path ) );
+                               $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @param $path string
+        * @param $handlesToClose array
+        * @return Status
+        */
+       private function closeLockHandles( $path, array $handlesToClose ) {
+               $status = Status::newGood();
+               foreach ( $handlesToClose as $handle ) {
+                       if ( !flock( $handle, LOCK_UN ) ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                       }
+                       if ( !fclose( $handle ) ) {
+                               $status->warning( 'lockmanager-fail-closelock', $path );
+                       }
+               }
+               return $status;
+       }
+
+       /**
+        * @param $path string
+        * @return Status
+        */
+       private function pruneKeyLockFiles( $path ) {
+               $status = Status::newGood();
+               if ( !isset( $this->locksHeld[$path] ) ) {
+                       # No locks are held for the lock file anymore
+                       if ( !unlink( $this->getLockPath( $path ) ) ) {
+                               $status->warning( 'lockmanager-fail-deletelock', $path );
+                       }
+                       unset( $this->handles[$path] );
+               }
+               return $status;
+       }
+
+       /**
+        * Get the path to the lock file for a key
+        * @param $path string
+        * @return string
+        */
+       protected function getLockPath( $path ) {
+               $hash = self::sha1Base36( $path );
+               return "{$this->lockDir}/{$hash}.lock";
+       }
+
+       /**
+        * Make sure remaining locks get cleared for sanity
+        */
+       function __destruct() {
+               while ( count( $this->locksHeld ) ) {
+                       foreach ( $this->locksHeld as $path => $locks ) {
+                               $this->doSingleUnlock( $path, self::LOCK_EX );
+                               $this->doSingleUnlock( $path, self::LOCK_SH );
+                       }
+               }
+       }
+}
diff --git a/includes/filebackend/lockmanager/LSLockManager.php b/includes/filebackend/lockmanager/LSLockManager.php
new file mode 100644 (file)
index 0000000..8942818
--- /dev/null
@@ -0,0 +1,218 @@
+<?php
+/**
+ * Version of LockManager based on using lock daemon 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 a lock daemon server.
+ *
+ * Version of LockManager based on using lock daemon 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 LockServerDaemon.php, listening on a designated TCP port.
+ * A majority of peers must agree for a lock to be acquired.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+class LSLockManager 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 Array Map of server names to server config */
+       protected $lockServers; // (server name => server config array)
+
+       /** @var Array Map Server connections (server name => resource) */
+       protected $conns = array();
+
+       protected $connTimeout; // float number of seconds
+       protected $session = ''; // random SHA-1 string
+
+       /**
+        * Construct a new instance from configuration.
+        *
+        * $config paramaters include:
+        *   - lockServers  : Associative array of server names to configuration.
+        *                    Configuration is an associative array that includes:
+        *                      - host    : IP address/hostname
+        *                      - port    : TCP port
+        *                      - authKey : Secret string the lock server uses
+        *   - srvsByBucket : Array of 1-16 consecutive integer keys, starting from 0,
+        *                    each having an odd-numbered list of server names (peers) as values.
+        *   - connTimeout  : Lock server connection attempt timeout. [optional]
+        *
+        * @param Array $config
+        */
+       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
+
+               if ( isset( $config['connTimeout'] ) ) {
+                       $this->connTimeout = $config['connTimeout'];
+               } else {
+                       $this->connTimeout = 3; // use some sane amount
+               }
+
+               $this->session = wfRandomString( 32 ); // 128 bits
+       }
+
+       /**
+        * @see QuorumLockManager::getLocksOnServer()
+        * @return Status
+        */
+       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               // Send out the command and get the response...
+               $type = ( $type == self::LOCK_SH ) ? 'SH' : 'EX';
+               $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+               $response = $this->sendCommand( $lockSrv, 'ACQUIRE', $type, $keys );
+
+               if ( $response !== 'ACQUIRED' ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see QuorumLockManager::freeLocksOnServer()
+        * @return Status
+        */
+       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               // Send out the command and get the response...
+               $type = ( $type == self::LOCK_SH ) ? 'SH' : 'EX';
+               $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+               $response = $this->sendCommand( $lockSrv, 'RELEASE', $type, $keys );
+
+               if ( $response !== 'RELEASED' ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see QuorumLockManager::releaseAllLocks()
+        * @return Status
+        */
+       protected function releaseAllLocks() {
+               $status = Status::newGood();
+
+               foreach ( $this->conns as $lockSrv => $conn ) {
+                       $response = $this->sendCommand( $lockSrv, 'RELEASE_ALL', '', array() );
+                       if ( $response !== 'RELEASED_ALL' ) {
+                               $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see QuorumLockManager::isServerUp()
+        * @return bool
+        */
+       protected function isServerUp( $lockSrv ) {
+               return (bool)$this->getConnection( $lockSrv );
+       }
+
+       /**
+        * Send a command and get back the response
+        *
+        * @param $lockSrv string
+        * @param $action string
+        * @param $type string
+        * @param $values Array
+        * @return string|bool
+        */
+       protected function sendCommand( $lockSrv, $action, $type, $values ) {
+               $conn = $this->getConnection( $lockSrv );
+               if ( !$conn ) {
+                       return false; // no connection
+               }
+               $authKey = $this->lockServers[$lockSrv]['authKey'];
+               // Build of the command as a flat string...
+               $values = implode( '|', $values );
+               $key = sha1( $this->session . $action . $type . $values . $authKey );
+               // Send out the command...
+               if ( fwrite( $conn, "{$this->session}:$key:$action:$type:$values\n" ) === false ) {
+                       return false;
+               }
+               // Get the response...
+               $response = fgets( $conn );
+               if ( $response === false ) {
+                       return false;
+               }
+               return trim( $response );
+       }
+
+       /**
+        * Get (or reuse) a connection to a lock server
+        *
+        * @param $lockSrv string
+        * @return resource
+        */
+       protected function getConnection( $lockSrv ) {
+               if ( !isset( $this->conns[$lockSrv] ) ) {
+                       $cfg = $this->lockServers[$lockSrv];
+                       wfSuppressWarnings();
+                       $errno = $errstr = '';
+                       $conn = fsockopen( $cfg['host'], $cfg['port'], $errno, $errstr, $this->connTimeout );
+                       wfRestoreWarnings();
+                       if ( $conn === false ) {
+                               return null;
+                       }
+                       $sec = floor( $this->connTimeout );
+                       $usec = floor( ( $this->connTimeout - floor( $this->connTimeout ) ) * 1e6 );
+                       stream_set_timeout( $conn, $sec, $usec );
+                       $this->conns[$lockSrv] = $conn;
+               }
+               return $this->conns[$lockSrv];
+       }
+
+       /**
+        * Make sure remaining locks get cleared for sanity
+        */
+       function __destruct() {
+               $this->releaseAllLocks();
+               foreach ( $this->conns as $conn ) {
+                       fclose( $conn );
+               }
+       }
+}
diff --git a/includes/filebackend/lockmanager/LockManager.php b/includes/filebackend/lockmanager/LockManager.php
new file mode 100644 (file)
index 0000000..07853f8
--- /dev/null
@@ -0,0 +1,425 @@
+<?php
+/**
+ * @defgroup LockManager Lock management
+ * @ingroup FileBackend
+ */
+
+/**
+ * Resource locking handling.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * @brief Class for handling resource locking.
+ *
+ * Locks on resource keys can either be shared or exclusive.
+ *
+ * Implementations must keep track of what is locked by this proccess
+ * in-memory and support nested locking calls (using reference counting).
+ * At least LOCK_UW and LOCK_EX must be implemented. LOCK_SH can be a no-op.
+ * Locks should either be non-blocking or have low wait timeouts.
+ *
+ * Subclasses should avoid throwing exceptions at all costs.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+abstract class LockManager {
+       /** @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_EX, // subclasses may use self::LOCK_SH
+               self::LOCK_EX => self::LOCK_EX
+       );
+
+       /** @var Array Map of (resource path => lock type => count) */
+       protected $locksHeld = array();
+
+       /* Lock types; stronger locks have higher values */
+       const LOCK_SH = 1; // shared lock (for reads)
+       const LOCK_UW = 2; // shared lock (for reads used to write elsewhere)
+       const LOCK_EX = 3; // exclusive lock (for writes)
+
+       /**
+        * Construct a new instance from configuration
+        *
+        * @param $config Array
+        */
+       public function __construct( array $config ) {}
+
+       /**
+        * Lock the resources at the given abstract paths
+        *
+        * @param $paths Array List of resource names
+        * @param $type integer LockManager::LOCK_* constant
+        * @return Status
+        */
+       final public function lock( array $paths, $type = self::LOCK_EX ) {
+               wfProfileIn( __METHOD__ );
+               $status = $this->doLock( array_unique( $paths ), $this->lockTypeMap[$type] );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * Unlock the resources at the given abstract paths
+        *
+        * @param $paths Array List of storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @return Status
+        */
+       final public function unlock( array $paths, $type = self::LOCK_EX ) {
+               wfProfileIn( __METHOD__ );
+               $status = $this->doUnlock( array_unique( $paths ), $this->lockTypeMap[$type] );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * Get the base 36 SHA-1 of a string, padded to 31 digits
+        *
+        * @param $path string
+        * @return string
+        */
+       final protected static function sha1Base36( $path ) {
+               return wfBaseConvert( sha1( $path ), 16, 36, 31 );
+       }
+
+       /**
+        * Lock resources with the given keys and lock type
+        *
+        * @param $paths Array List of storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @return string
+        */
+       abstract protected function doLock( array $paths, $type );
+
+       /**
+        * Unlock resources with the given keys and lock type
+        *
+        * @param $paths Array List of storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @return string
+        */
+       abstract protected function doUnlock( array $paths, $type );
+}
+
+/**
+ * Self-releasing locks
+ *
+ * LockManager helper class to handle scoped locks, which
+ * release when an object is destroyed or goes out of scope.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+class ScopedLock {
+       /** @var LockManager */
+       protected $manager;
+       /** @var Status */
+       protected $status;
+       /** @var Array List of resource paths*/
+       protected $paths;
+
+       protected $type; // integer lock type
+
+       /**
+        * @param $manager LockManager
+        * @param $paths Array List of storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @param $status Status
+        */
+       protected function __construct(
+               LockManager $manager, array $paths, $type, Status $status
+       ) {
+               $this->manager = $manager;
+               $this->paths = $paths;
+               $this->status = $status;
+               $this->type = $type;
+       }
+
+       /**
+        * Get a ScopedLock object representing a lock on resource paths.
+        * Any locks are released once this object goes out of scope.
+        * The status object is updated with any errors or warnings.
+        *
+        * @param $manager LockManager
+        * @param $paths Array List of storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @param $status Status
+        * @return ScopedLock|null Returns null on failure
+        */
+       public static function factory(
+               LockManager $manager, array $paths, $type, Status $status
+       ) {
+               $lockStatus = $manager->lock( $paths, $type );
+               $status->merge( $lockStatus );
+               if ( $lockStatus->isOK() ) {
+                       return new self( $manager, $paths, $type, $status );
+               }
+               return null;
+       }
+
+       function __destruct() {
+               $wasOk = $this->status->isOK();
+               $this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
+               if ( $wasOk ) {
+                       // Make sure status is OK, despite any unlockFiles() fatals
+                       $this->status->setResult( true, $this->status->value );
+               }
+       }
+}
+
+/**
+ * Version of LockManager that uses a quorum from peer servers for locks.
+ * The resource space can also be sharded into separate peer groups.
+ *
+ * @ingroup LockManager
+ * @since 1.20
+ */
+abstract class QuorumLockManager extends LockManager {
+       /** @var Array Map of bucket indexes to peer server lists */
+       protected $srvsByBucket = array(); // (bucket index => (lsrv1, lsrv2, ...))
+
+       /**
+        * @see LockManager::doLock()
+        * @param $paths array
+        * @param $type int
+        * @return Status
+        */
+       final protected function doLock( array $paths, $type ) {
+               $status = Status::newGood();
+
+               $pathsToLock = array(); // (bucket => paths)
+               // Get locks that need to be acquired (buckets => locks)...
+               foreach ( $paths as $path ) {
+                       if ( isset( $this->locksHeld[$path][$type] ) ) {
+                               ++$this->locksHeld[$path][$type];
+                       } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
+                               $this->locksHeld[$path][$type] = 1;
+                       } else {
+                               $bucket = $this->getBucketFromKey( $path );
+                               $pathsToLock[$bucket][] = $path;
+                       }
+               }
+
+               $lockedPaths = array(); // files locked in this attempt
+               // Attempt to acquire these locks...
+               foreach ( $pathsToLock as $bucket => $paths ) {
+                       // Try to acquire the locks for this bucket
+                       $status->merge( $this->doLockingRequestBucket( $bucket, $paths, $type ) );
+                       if ( !$status->isOK() ) {
+                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+                               return $status;
+                       }
+                       // Record these locks as active
+                       foreach ( $paths as $path ) {
+                               $this->locksHeld[$path][$type] = 1; // locked
+                       }
+                       // Keep track of what locks were made in this attempt
+                       $lockedPaths = array_merge( $lockedPaths, $paths );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see LockManager::doUnlock()
+        * @param $paths array
+        * @param $type int
+        * @return Status
+        */
+       final protected function doUnlock( array $paths, $type ) {
+               $status = Status::newGood();
+
+               $pathsToUnlock = array();
+               foreach ( $paths as $path ) {
+                       if ( !isset( $this->locksHeld[$path][$type] ) ) {
+                               $status->warning( 'lockmanager-notlocked', $path );
+                       } else {
+                               --$this->locksHeld[$path][$type];
+                               // Reference count the locks held and release locks when zero
+                               if ( $this->locksHeld[$path][$type] <= 0 ) {
+                                       unset( $this->locksHeld[$path][$type] );
+                                       $bucket = $this->getBucketFromKey( $path );
+                                       $pathsToUnlock[$bucket][] = $path;
+                               }
+                               if ( !count( $this->locksHeld[$path] ) ) {
+                                       unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+                               }
+                       }
+               }
+
+               // Remove these specific locks if possible, or at least release
+               // all locks once this process is currently not holding any locks.
+               foreach ( $pathsToUnlock as $bucket => $paths ) {
+                       $status->merge( $this->doUnlockingRequestBucket( $bucket, $paths, $type ) );
+               }
+               if ( !count( $this->locksHeld ) ) {
+                       $status->merge( $this->releaseAllLocks() );
+               }
+
+               return $status;
+       }
+
+       /**
+        * Attempt to acquire locks with the peers for a bucket.
+        * This is all or nothing; if any key is locked then this totally fails.
+        *
+        * @param $bucket integer
+        * @param $paths Array List of resource keys to lock
+        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+        * @return Status
+        */
+       final protected function doLockingRequestBucket( $bucket, array $paths, $type ) {
+               $status = Status::newGood();
+
+               $yesVotes = 0; // locks made on trustable servers
+               $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
+               $quorum = floor( $votesLeft/2 + 1 ); // simple majority
+               // Get votes for each peer, in order, until we have enough...
+               foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
+                       if ( !$this->isServerUp( $lockSrv ) ) {
+                               --$votesLeft;
+                               $status->warning( 'lockmanager-fail-svr-acquire', $lockSrv );
+                               continue; // server down?
+                       }
+                       // Attempt to acquire the lock on this peer
+                       $status->merge( $this->getLocksOnServer( $lockSrv, $paths, $type ) );
+                       if ( !$status->isOK() ) {
+                               return $status; // vetoed; resource locked
+                       }
+                       ++$yesVotes; // success for this peer
+                       if ( $yesVotes >= $quorum ) {
+                               return $status; // lock obtained
+                       }
+                       --$votesLeft;
+                       $votesNeeded = $quorum - $yesVotes;
+                       if ( $votesNeeded > $votesLeft ) {
+                               break; // short-circuit
+                       }
+               }
+               // At this point, we must not have met the quorum
+               $status->setResult( false );
+
+               return $status;
+       }
+
+       /**
+        * Attempt to release locks with the peers for a bucket
+        *
+        * @param $bucket integer
+        * @param $paths Array List of resource keys to lock
+        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+        * @return Status
+        */
+       final protected function doUnlockingRequestBucket( $bucket, array $paths, $type ) {
+               $status = Status::newGood();
+
+               foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
+                       if ( !$this->isServerUp( $lockSrv ) ) {
+                               $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
+                       // Attempt to release the lock on this peer
+                       } else {
+                               $status->merge( $this->freeLocksOnServer( $lockSrv, $paths, $type ) );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * Get the bucket for resource path.
+        * This should avoid throwing any exceptions.
+        *
+        * @param $path string
+        * @return integer
+        */
+       protected function getBucketFromKey( $path ) {
+               $prefix = substr( sha1( $path ), 0, 2 ); // first 2 hex chars (8 bits)
+               return (int)base_convert( $prefix, 16, 10 ) % count( $this->srvsByBucket );
+       }
+
+       /**
+        * Check if a lock server is up
+        *
+        * @param $lockSrv string
+        * @return bool
+        */
+       abstract protected function isServerUp( $lockSrv );
+
+       /**
+        * Get a connection to a lock server and acquire locks on $paths
+        *
+        * @param $lockSrv string
+        * @param $paths array
+        * @param $type integer
+        * @return Status
+        */
+       abstract protected function getLocksOnServer( $lockSrv, array $paths, $type );
+
+       /**
+        * Get a connection to a lock server and release locks on $paths.
+        *
+        * Subclasses must effectively implement this or releaseAllLocks().
+        *
+        * @param $lockSrv string
+        * @param $paths array
+        * @param $type integer
+        * @return Status
+        */
+       abstract protected function freeLocksOnServer( $lockSrv, array $paths, $type );
+
+       /**
+        * Release all locks that this session is holding.
+        *
+        * Subclasses must effectively implement this or freeLocksOnServer().
+        *
+        * @return Status
+        */
+       abstract protected function releaseAllLocks();
+}
+
+/**
+ * Simple version of LockManager that does nothing
+ * @since 1.19
+ */
+class NullLockManager extends LockManager {
+       /**
+        * @see LockManager::doLock()
+        * @param $paths array
+        * @param $type int
+        * @return Status
+        */
+       protected function doLock( array $paths, $type ) {
+               return Status::newGood();
+       }
+
+       /**
+        * @see LockManager::doUnlock()
+        * @param $paths array
+        * @param $type int
+        * @return Status
+        */
+       protected function doUnlock( array $paths, $type ) {
+               return Status::newGood();
+       }
+}
diff --git a/includes/filebackend/lockmanager/LockManagerGroup.php b/includes/filebackend/lockmanager/LockManagerGroup.php
new file mode 100644 (file)
index 0000000..8c8c940
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+/**
+ * Lock manager registration handling.
+ *
+ * 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
+ */
+
+/**
+ * Class to handle file lock manager registration
+ *
+ * @ingroup LockManager
+ * @author Aaron Schulz
+ * @since 1.19
+ */
+class LockManagerGroup {
+       /**
+        * @var LockManagerGroup
+        */
+       protected static $instance = null;
+
+       /** @var Array of (name => ('class' =>, 'config' =>, 'instance' =>)) */
+       protected $managers = array();
+
+       protected function __construct() {}
+
+       /**
+        * @return LockManagerGroup
+        */
+       public static function singleton() {
+               if ( self::$instance == null ) {
+                       self::$instance = new self();
+                       self::$instance->initFromGlobals();
+               }
+               return self::$instance;
+       }
+
+       /**
+        * Destroy the singleton instance, so that a new one will be created next
+        * time singleton() is called.
+        */
+       public static function destroySingleton() {
+               self::$instance = null;
+       }
+
+       /**
+        * Register lock managers from the global variables
+        *
+        * @return void
+        */
+       protected function initFromGlobals() {
+               global $wgLockManagers;
+
+               $this->register( $wgLockManagers );
+       }
+
+       /**
+        * Register an array of file lock manager configurations
+        *
+        * @param $configs Array
+        * @return void
+        * @throws MWException
+        */
+       protected function register( array $configs ) {
+               foreach ( $configs as $config ) {
+                       if ( !isset( $config['name'] ) ) {
+                               throw new MWException( "Cannot register a lock manager with no name." );
+                       }
+                       $name = $config['name'];
+                       if ( !isset( $config['class'] ) ) {
+                               throw new MWException( "Cannot register lock manager `{$name}` with no class." );
+                       }
+                       $class = $config['class'];
+                       unset( $config['class'] ); // lock manager won't need this
+                       $this->managers[$name] = array(
+                               'class'    => $class,
+                               'config'   => $config,
+                               'instance' => null
+                       );
+               }
+       }
+
+       /**
+        * Get the lock manager object with a given name
+        *
+        * @param $name string
+        * @return LockManager
+        * @throws MWException
+        */
+       public function get( $name ) {
+               if ( !isset( $this->managers[$name] ) ) {
+                       throw new MWException( "No lock manager defined with the name `$name`." );
+               }
+               // Lazy-load the actual lock manager instance
+               if ( !isset( $this->managers[$name]['instance'] ) ) {
+                       $class = $this->managers[$name]['class'];
+                       $config = $this->managers[$name]['config'];
+                       $this->managers[$name]['instance'] = new $class( $config );
+               }
+               return $this->managers[$name]['instance'];
+       }
+
+       /**
+        * Get the default lock manager configured for the site.
+        * Returns NullLockManager if no lock manager could be found.
+        *
+        * @return LockManager
+        */
+       public function getDefault() {
+               return isset( $this->managers['default'] )
+                       ? $this->get( 'default' )
+                       : new NullLockManager( array() );
+       }
+
+       /**
+        * Get the default lock manager configured for the site
+        * or at least some other effective configured lock manager.
+        * Throws an exception if no lock manager could be found.
+        *
+        * @return LockManager
+        * @throws MWException
+        */
+       public function getAny() {
+               return isset( $this->managers['default'] )
+                       ? $this->get( 'default' )
+                       : $this->get( 'fsLockManager' );
+       }
+}
diff --git a/includes/filebackend/lockmanager/MemcLockManager.php b/includes/filebackend/lockmanager/MemcLockManager.php
new file mode 100644 (file)
index 0000000..9e81dbf
--- /dev/null
@@ -0,0 +1,319 @@
+<?php
+/**
+ * Version of LockManager based on using memcached 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 memcached servers.
+ *
+ * Version of LockManager based on using memcached 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 memcached.
+ * A majority of peers must agree for a lock to be acquired.
+ *
+ * @ingroup LockManager
+ * @since 1.20
+ */
+class MemcLockManager 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 Array Map server names to MemcachedBagOStuff objects */
+       protected $bagOStuffs = array();
+       /** @var Array */
+       protected $serversUp = array(); // (server name => bool)
+
+       protected $lockExpiry; // integer; maximum time locks can be held
+       protected $session = ''; // string; random SHA-1 UUID
+       protected $wikiId = ''; // string
+
+       /**
+        * 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.
+        *   - 'memcConfig'   : Configuration array for ObjectCache::newFromParams. [optional]
+        *                      If set, this must use one of the memcached classes.
+        *   - 'wikiId'       : Wiki ID string that all resources are relative to. [optional]
+        *
+        * @param Array $config
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+
+               // Sanitize srvsByBucket config to prevent PHP errors
+               $this->srvsByBucket = array_filter( $config['srvsByBucket'], 'is_array' );
+               $this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
+
+               $memcConfig = isset( $config['memcConfig'] )
+                       ? $config['memcConfig']
+                       : array( 'class' => 'MemcachedPhpBagOStuff' );
+
+               foreach ( $config['lockServers'] as $name => $address ) {
+                       $params = array( 'servers' => array( $address ) ) + $memcConfig;
+                       $cache = ObjectCache::newFromParams( $params );
+                       if ( $cache instanceof MemcachedBagOStuff ) {
+                               $this->bagOStuffs[$name] = $cache;
+                       } else {
+                               throw new MWException(
+                                       'Only MemcachedBagOStuff classes are supported by MemcLockManager.' );
+                       }
+               }
+
+               $this->wikiId = isset( $config['wikiId'] ) ? $config['wikiId'] : wfWikiID();
+
+               $met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
+               $this->lockExpiry = $met ? 2*(int)$met : 2*3600;
+
+               $this->session = wfRandomString( 32 );
+       }
+
+       /**
+        * @see QuorumLockManager::getLocksOnServer()
+        * @return Status
+        */
+       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               $memc = $this->getCache( $lockSrv );
+               $keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+               // Lock all of the active lock record keys...
+               if ( !$this->acquireMutexes( $memc, $keys ) ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                       }
+                       return;
+               }
+
+               // Fetch all the existing lock records...
+               $lockRecords = $memc->getMulti( $keys );
+
+               $now = time();
+               // Check if the requested locks conflict with existing ones...
+               foreach ( $paths as $path ) {
+                       $locksKey = $this->recordKeyForPath( $path );
+                       $locksHeld = isset( $lockRecords[$locksKey] )
+                               ? $lockRecords[$locksKey]
+                               : array( self::LOCK_SH => array(), self::LOCK_EX => array() ); // init
+                       foreach ( $locksHeld[self::LOCK_EX] as $session => $expiry ) {
+                               if ( $expiry < $now ) { // stale?
+                                       unset( $locksHeld[self::LOCK_EX][$session] );
+                               } elseif ( $session !== $this->session ) {
+                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                               }
+                       }
+                       if ( $type === self::LOCK_EX ) {
+                               foreach ( $locksHeld[self::LOCK_SH] as $session => $expiry ) {
+                                       if ( $expiry < $now ) { // stale?
+                                               unset( $locksHeld[self::LOCK_SH][$session] );
+                                       } elseif ( $session !== $this->session ) {
+                                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                                       }
+                               }
+                       }
+                       if ( $status->isOK() ) {
+                               // Register the session in the lock record array
+                               $locksHeld[$type][$this->session] = $now + $this->lockExpiry;
+                               // We will update this record if none of the other locks conflict
+                               $lockRecords[$locksKey] = $locksHeld;
+                       }
+               }
+
+               // If there were no lock conflicts, update all the lock records...
+               if ( $status->isOK() ) {
+                       foreach ( $lockRecords as $locksKey => $locksHeld ) {
+                               $memc->set( $locksKey, $locksHeld );
+                               wfDebug( __METHOD__ . ": acquired lock on key $locksKey.\n" );
+                       }
+               }
+
+               // Unlock all of the active lock record keys...
+               $this->releaseMutexes( $memc, $keys );
+
+               return $status;
+       }
+
+       /**
+        * @see QuorumLockManager::freeLocksOnServer()
+        * @return Status
+        */
+       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               $memc = $this->getCache( $lockSrv );
+               $keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+               // Lock all of the active lock record keys...
+               if ( !$this->acquireMutexes( $memc, $keys ) ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                       }
+                       return;
+               }
+
+               // Fetch all the existing lock records...
+               $lockRecords = $memc->getMulti( $keys );
+
+               // Remove the requested locks from all records...
+               foreach ( $paths as $path ) {
+                       $locksKey = $this->recordKeyForPath( $path ); // lock record
+                       if ( !isset( $lockRecords[$locksKey] ) ) {
+                               continue; // nothing to do
+                       }
+                       $locksHeld = $lockRecords[$locksKey];
+                       if ( is_array( $locksHeld ) && isset( $locksHeld[$type] ) ) {
+                               unset( $locksHeld[$type][$this->session] );
+                               $ok = $memc->set( $locksKey, $locksHeld );
+                       } else {
+                               $ok = true;
+                       }
+                       if ( !$ok ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                       }
+                       wfDebug( __METHOD__ . ": released lock on key $locksKey.\n" );
+               }
+
+               // Unlock all of the active lock record keys...
+               $this->releaseMutexes( $memc, $keys );
+
+               return $status;
+       }
+
+       /**
+        * @see QuorumLockManager::releaseAllLocks()
+        * @return Status
+        */
+       protected function releaseAllLocks() {
+               return Status::newGood(); // not supported
+       }
+
+       /**
+        * @see QuorumLockManager::isServerUp()
+        * @return bool
+        */
+       protected function isServerUp( $lockSrv ) {
+               return (bool)$this->getCache( $lockSrv );
+       }
+
+       /**
+        * Get the MemcachedBagOStuff object for a $lockSrv
+        *
+        * @param $lockSrv string Server name
+        * @return MemcachedBagOStuff|null
+        */
+       protected function getCache( $lockSrv ) {
+               $memc = null;
+               if ( isset( $this->bagOStuffs[$lockSrv] ) ) {
+                       $memc = $this->bagOStuffs[$lockSrv];
+                       if ( !isset( $this->serversUp[$lockSrv] ) ) {
+                               $this->serversUp[$lockSrv] = $memc->set( 'MemcLockManager:ping', 1, 1 );
+                               if ( !$this->serversUp[$lockSrv] ) {
+                                       trigger_error( __METHOD__ . ": Could not contact $lockSrv.", E_USER_WARNING );
+                               }
+                       }
+                       if ( !$this->serversUp[$lockSrv] ) {
+                               return null; // server appears to be down
+                       }
+               }
+               return $memc;
+       }
+
+       /**
+        * @param $path string
+        * @return string
+        */
+       protected function recordKeyForPath( $path ) {
+               $hash = LockManager::sha1Base36( $path );
+               list( $db, $prefix ) = wfSplitWikiID( $this->wikiId );
+               return wfForeignMemcKey( $db, $prefix, __CLASS__, 'locks', $hash );
+       }
+
+       /**
+        * @param $memc MemcachedBagOStuff
+        * @param $keys Array List of keys to acquire
+        * @return bool
+        */
+       protected function acquireMutexes( MemcachedBagOStuff $memc, array $keys ) {
+               $lockedKeys = array();
+
+               // Acquire the keys in lexicographical order, to avoid deadlock problems.
+               // If P1 is waiting to acquire a key P2 has, P2 can't also be waiting for a key P1 has.
+               sort( $keys );
+
+               // Try to quickly loop to acquire the keys, but back off after a few rounds.
+               // This reduces memcached spam, especially in the rare case where a server acquires
+               // some lock keys and dies without releasing them. Lock keys expire after a few minutes.
+               $rounds = 0;
+               $start = microtime( true );
+               do {
+                       if ( ( ++$rounds % 4 ) == 0 ) {
+                               usleep( 1000*50 ); // 50 ms
+                       }
+                       foreach ( array_diff( $keys, $lockedKeys ) as $key ) {
+                               if ( $memc->add( "$key:mutex", 1, 180 ) ) { // lock record
+                                       $lockedKeys[] = $key;
+                               } else {
+                                       continue; // acquire in order
+                               }
+                       }
+               } while ( count( $lockedKeys ) < count( $keys ) && ( microtime( true ) - $start ) <= 6 );
+
+               if ( count( $lockedKeys ) != count( $keys ) ) {
+                       $this->releaseMutexes( $lockedKeys ); // failed; release what was locked
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * @param $memc MemcachedBagOStuff
+        * @param $keys Array List of acquired keys
+        * @return void
+        */
+       protected function releaseMutexes( MemcachedBagOStuff $memc, array $keys ) {
+               foreach ( $keys as $key ) {
+                       $memc->delete( "$key:mutex" );
+               }
+       }
+
+       /**
+        * 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 d4eef87..3159077 100644 (file)
@@ -113,10 +113,9 @@ class FileRepo {
                        ? $info['deletedHashLevels']
                        : $this->hashLevels;
                $this->transformVia404 = !empty( $info['transformVia404'] );
-               $this->zones = isset( $info['zones'] )
-                       ? $info['zones']
-                       : array();
+               $this->isPrivate = !empty( $info['isPrivate'] );
                // Give defaults for the basic zones...
+               $this->zones = isset( $info['zones'] ) ? $info['zones'] : array();
                foreach ( array( 'public', 'thumb', 'temp', 'deleted' ) as $zone ) {
                        if ( !isset( $this->zones[$zone]['container'] ) ) {
                                $this->zones[$zone]['container'] = "{$this->name}-{$zone}";
@@ -164,18 +163,6 @@ class FileRepo {
                return $status;
        }
 
-       /**
-        * Take all available measures to prevent web accessibility of new deleted
-        * directories, in case the user has not configured offline storage
-        *
-        * @param $dir string
-        * @return void
-        */
-       protected function initDeletedDir( $dir ) {
-               $this->backend->secure( // prevent web access & dir listings
-                       array( 'dir' => $dir, 'noAccess' => true, 'noListing' => true ) );
-       }
-
        /**
         * Determine if a string is an mwrepo:// URL
         *
@@ -228,6 +215,28 @@ class FileRepo {
                }
        }
 
+       /**
+        * Get the thumb zone URL configured to be handled by scripts like thumb_handler.php.
+        * This is probably only useful for internal requests, such as from a fast frontend server
+        * to a slower backend server.
+        *
+        * Large sites may use a different host name for uploads than for wikis. In any case, the
+        * wiki configuration is needed in order to use thumb.php. To avoid extracting the wiki ID
+        * from the URL path, one can configure thumb_handler.php to recognize a special path on the
+        * same host name as the wiki that is used for viewing thumbnails.
+        *
+        * @param $zone String: one of: public, deleted, temp, thumb
+        * @return String or false
+        */
+       public function getZoneHandlerUrl( $zone ) {
+               if ( isset( $this->zones[$zone]['handlerUrl'] )
+                       && in_array( $zone, array( 'public', 'temp', 'thumb' ) ) )
+               {
+                       return $this->zones[$zone]['handlerUrl'];
+               }
+               return false;
+       }
+
        /**
         * Get the backend storage path corresponding to a virtual URL.
         * Use this function wisely.
@@ -451,6 +460,24 @@ class FileRepo {
                return array();
        }
 
+       /**
+        * Get an array of arrays or iterators of file objects for files that
+        * have the given SHA-1 content hashes.
+        *
+        * @param $hashes array An array of hashes
+        * @return array An Array of arrays or iterators of file objects and the hash as key
+        */
+       public function findBySha1s( array $hashes ) {
+               $result = array();
+               foreach ( $hashes as $hash ) {
+                       $files = $this->findBySha1( $hash );
+                       if ( count( $files ) ) {
+                               $result[$hash] = $files;
+                       }
+               }
+               return $result;
+       }
+
        /**
         * Get the public root URL of the repository
         *
@@ -726,14 +753,10 @@ class FileRepo {
                        $dstPath = "$root/$dstRel";
                        $dstDir  = dirname( $dstPath );
                        // Create destination directories for this triplet
-                       if ( !$backend->prepare( array( 'dir' => $dstDir ) )->isOK() ) {
+                       if ( !$this->initDirectory( $dstDir )->isOK() ) {
                                return $this->newFatal( 'directorycreateerror', $dstDir );
                        }
 
-                       if ( $dstZone == 'deleted' ) {
-                               $this->initDeletedDir( $dstDir );
-                       }
-
                        // Resolve source to a storage path if virtual
                        $srcPath = $this->resolveToStoragePath( $srcPath );
 
@@ -863,12 +886,13 @@ class FileRepo {
                $operations = array();
                foreach ( $pairs as $pair ) {
                        list ( $src, $dst ) = $pair;
+                       $dst = $this->resolveToStoragePath( $dst );
                        $operations[] = array(
                                'op'        => 'store',
                                'src'       => $src,
-                               'dst'       => $this->resolveToStoragePath( $dst )
+                               'dst'       => $dst
                        );
-                       $this->backend->prepare( array( 'dir' => dirname( $dst ) ) );
+                       $status->merge( $this->initDirectory( dirname( $dst ) ) );
                }
                $status->merge( $this->backend->doQuickOperations( $operations ) );
 
@@ -1058,10 +1082,10 @@ class FileRepo {
                        $dstDir = dirname( $dstPath );
                        $archiveDir = dirname( $archivePath );
                        // Abort immediately on directory creation errors since they're likely to be repetitive
-                       if ( !$backend->prepare( array( 'dir' => $dstDir ) )->isOK() ) {
+                       if ( !$this->initDirectory( $dstDir )->isOK() ) {
                                return $this->newFatal( 'directorycreateerror', $dstDir );
                        }
-                       if ( !$backend->prepare( array( 'dir' => $archiveDir ) )->isOK() ) {
+                       if ( !$this->initDirectory($archiveDir )->isOK() ) {
                                return $this->newFatal( 'directorycreateerror', $archiveDir );
                        }
 
@@ -1126,6 +1150,27 @@ class FileRepo {
                return $status;
        }
 
+       /**
+        * Creates a directory with the appropriate zone permissions.
+        * Callers are responsible for doing read-only and "writable repo" checks.
+        *
+        * @param $dir string Virtual URL (or storage path) of directory to clean
+        * @return Status
+        */
+       protected function initDirectory( $dir ) {
+               $path = $this->resolveToStoragePath( $dir );
+               list( $b, $container, $r ) = FileBackend::splitStoragePath( $path );
+
+               $params = array( 'dir' => $path );
+               if ( $this->isPrivate || $container === $this->zones['deleted']['container'] ) {
+                       # Take all available measures to prevent web accessibility of new deleted
+                       # directories, in case the user has not configured offline storage
+                       $params = array( 'noAccess' => true, 'noListing' => true ) + $params;
+               }
+
+               return $this->backend->prepare( $params );
+       }
+
        /**
         * Deletes a directory if empty.
         *
@@ -1231,10 +1276,9 @@ class FileRepo {
                        $archiveDir = dirname( $archivePath ); // does not touch FS
 
                        // Create destination directories
-                       if ( !$backend->prepare( array( 'dir' => $archiveDir ) )->isOK() ) {
+                       if ( !$this->initDirectory( $archiveDir )->isOK() ) {
                                return $this->newFatal( 'directorycreateerror', $archiveDir );
                        }
-                       $this->initDeletedDir( $archiveDir );
 
                        $operations[] = array(
                                'op'            => 'move',
@@ -1343,18 +1387,14 @@ class FileRepo {
        }
 
        /**
-        * Get the sha1 of a file with a given virtual URL/storage path
+        * Get the sha1 (base 36) of a file with a given virtual URL/storage path
         *
         * @param $virtualUrl string
         * @return string|bool
         */
        public function getFileSha1( $virtualUrl ) {
                $path = $this->resolveToStoragePath( $virtualUrl );
-               $tmpFile = $this->backend->getLocalReference( array( 'src' => $path ) );
-               if ( !$tmpFile ) {
-                       return false;
-               }
-               return $tmpFile->getSha1Base36();
+               return $this->backend->getFileSha1Base36( array( 'src' => $path ) );
        }
 
        /**
index 77b9d04..13de9e6 100644 (file)
@@ -320,11 +320,11 @@ class ForeignAPIRepo extends FileRepo {
                        return false;
                }
 
+
                # @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
                $backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
-               $op = array( 'op' => 'create', 'dst' => $localFilename, 'content' => $thumb );
-               if( !$backend->doOperation( $op )->isOK() ) {
-                       wfRestoreWarnings();
+               $params = array( 'dst' => $localFilename, 'content' => $thumb );
+               if( !$backend->quickCreate( $params )->isOK() ) {
                        wfDebug( __METHOD__ . " could not write to thumb path '$localFilename'\n" );
                        return $foreignUrl;
                }
index 2beea43..0954422 100644 (file)
@@ -234,7 +234,9 @@ class LocalRepo extends FileRepo {
                $res = $dbr->select(
                        'image',
                        LocalFile::selectFields(),
-                       array( 'img_sha1' => $hash )
+                       array( 'img_sha1' => $hash ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'img_name' )
                );
                
                $result = array();
@@ -246,6 +248,39 @@ class LocalRepo extends FileRepo {
                return $result;
        }
 
+       /**
+        * Get an array of arrays or iterators of file objects for files that
+        * have the given SHA-1 content hashes.
+        *
+        * Overrides generic implementation in FileRepo for performance reason
+        *
+        * @param $hashes array An array of hashes
+        * @return array An Array of arrays or iterators of file objects and the hash as key
+        */
+       function findBySha1s( array $hashes ) {
+               if( !count( $hashes ) ) {
+                       return array(); //empty parameter
+               }
+
+               $dbr = $this->getSlaveDB();
+               $res = $dbr->select(
+                       'image',
+                       LocalFile::selectFields(),
+                       array( 'img_sha1' => $hashes ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'img_name' )
+               );
+
+               $result = array();
+               foreach ( $res as $row ) {
+                       $file = $this->newFileFromRow( $row );
+                       $result[$file->getSha1()][] = $file;
+               }
+               $res->free();
+
+               return $result;
+       }
+
        /**
         * Get a connection to the slave DB
         * @return DatabaseBase
index 709655a..f9e5759 100644 (file)
@@ -259,6 +259,29 @@ class RepoGroup {
                foreach ( $this->foreignRepos as $repo ) {
                        $result = array_merge( $result, $repo->findBySha1( $hash ) );
                }
+               usort( $result, 'File::compare' );
+               return $result;
+       }
+
+       /**
+        * Find all instances of files with this keys
+        *
+        * @param $hashes Array base 36 SHA-1 hashes
+        * @return Array of array of File objects
+        */
+       function findBySha1s( array $hashes ) {
+               if ( !$this->reposInitialised ) {
+                       $this->initialiseRepos();
+               }
+
+               $result = $this->localRepo->findBySha1s( $hashes );
+               foreach ( $this->foreignRepos as $repo ) {
+                       $result = array_merge_recursive( $result, $repo->findBySha1s( $hashes ) );
+               }
+               //sort the merged (and presorted) sublist of each hash
+               foreach( $result as $hash => $files ) {
+                       usort( $result[$hash], 'File::compare' );
+               }
                return $result;
        }
 
diff --git a/includes/filerepo/backend/FSFile.php b/includes/filerepo/backend/FSFile.php
deleted file mode 100644 (file)
index e07c99d..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-/**
- * Non-directory file on the file system.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- */
-
-/**
- * Class representing a non-directory file on the file system
- *
- * @ingroup FileBackend
- */
-class FSFile {
-       protected $path; // path to file
-
-       /**
-        * Sets up the file object
-        *
-        * @param $path string Path to temporary file on local disk
-        * @throws MWException
-        */
-       public function __construct( $path ) {
-               if ( FileBackend::isStoragePath( $path ) ) {
-                       throw new MWException( __METHOD__ . " given storage path `$path`." );
-               }
-               $this->path = $path;
-       }
-
-       /**
-        * Returns the file system path
-        *
-        * @return String
-        */
-       public function getPath() {
-               return $this->path;
-       }
-
-       /**
-        * Checks if the file exists
-        *
-        * @return bool
-        */
-       public function exists() {
-               return is_file( $this->path );
-       }
-
-       /**
-        * Get the file size in bytes
-        *
-        * @return int|bool
-        */
-       public function getSize() {
-               return filesize( $this->path );
-       }
-
-       /**
-        * Get the file's last-modified timestamp
-        *
-        * @return string|bool TS_MW timestamp or false on failure
-        */
-       public function getTimestamp() {
-               wfSuppressWarnings();
-               $timestamp = filemtime( $this->path );
-               wfRestoreWarnings();
-               if ( $timestamp !== false ) {
-                       $timestamp = wfTimestamp( TS_MW, $timestamp );
-               }
-               return $timestamp;
-       }
-
-       /**
-        * Guess the MIME type from the file contents alone
-        * 
-        * @return string 
-        */
-       public function getMimeType() {
-               return MimeMagic::singleton()->guessMimeType( $this->path, false );
-       }
-
-       /**
-        * Get an associative array containing information about
-        * a file with the given storage path.
-        *
-        * @param $ext Mixed: the file extension, or true to extract it from the filename.
-        *             Set it to false to ignore the extension.
-        *
-        * @return array
-        */
-       public function getProps( $ext = true ) {
-               wfProfileIn( __METHOD__ );
-               wfDebug( __METHOD__.": Getting file info for $this->path\n" );
-
-               $info = self::placeholderProps();
-               $info['fileExists'] = $this->exists();
-
-               if ( $info['fileExists'] ) {
-                       $magic = MimeMagic::singleton();
-
-                       # get the file extension
-                       if ( $ext === true ) {
-                               $ext = self::extensionFromPath( $this->path );
-                       }
-
-                       # mime type according to file contents
-                       $info['file-mime'] = $this->getMimeType();
-                       # logical mime type
-                       $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext );
-
-                       list( $info['major_mime'], $info['minor_mime'] ) = File::splitMime( $info['mime'] );
-                       $info['media_type'] = $magic->getMediaType( $this->path, $info['mime'] );
-
-                       # Get size in bytes
-                       $info['size'] = $this->getSize();
-
-                       # Height, width and metadata
-                       $handler = MediaHandler::getHandler( $info['mime'] );
-                       if ( $handler ) {
-                               $tempImage = (object)array();
-                               $info['metadata'] = $handler->getMetadata( $tempImage, $this->path );
-                               $gis = $handler->getImageSize( $tempImage, $this->path, $info['metadata'] );
-                               if ( is_array( $gis ) ) {
-                                       $info = $this->extractImageSizeInfo( $gis ) + $info;
-                               }
-                       }
-                       $info['sha1'] = $this->getSha1Base36();
-
-                       wfDebug(__METHOD__.": $this->path loaded, {$info['size']} bytes, {$info['mime']}.\n");
-               } else {
-                       wfDebug(__METHOD__.": $this->path NOT FOUND!\n");
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $info;
-       }
-
-       /**
-        * Placeholder file properties to use for files that don't exist
-        *
-        * @return Array
-        */
-       public static function placeholderProps() {
-               $info = array();
-               $info['fileExists'] = false;
-               $info['mime'] = null;
-               $info['media_type'] = MEDIATYPE_UNKNOWN;
-               $info['metadata'] = '';
-               $info['sha1'] = '';
-               $info['width'] = 0;
-               $info['height'] = 0;
-               $info['bits'] = 0;
-               return $info;
-       }
-
-       /**
-        * Exract image size information
-        *
-        * @param $gis array
-        * @return Array
-        */
-       protected function extractImageSizeInfo( array $gis ) {
-               $info = array();
-               # NOTE: $gis[2] contains a code for the image type. This is no longer used.
-               $info['width'] = $gis[0];
-               $info['height'] = $gis[1];
-               if ( isset( $gis['bits'] ) ) {
-                       $info['bits'] = $gis['bits'];
-               } else {
-                       $info['bits'] = 0;
-               }
-               return $info;
-       }
-
-       /**
-        * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case
-        * encoding, zero padded to 31 digits.
-        *
-        * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
-        * fairly neatly.
-        *
-        * @return bool|string False on failure
-        */
-       public function getSha1Base36() {
-               wfProfileIn( __METHOD__ );
-
-               wfSuppressWarnings();
-               $hash = sha1_file( $this->path );
-               wfRestoreWarnings();
-               if ( $hash !== false ) {
-                       $hash = wfBaseConvert( $hash, 16, 36, 31 );
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $hash;
-       }
-
-       /**
-        * Get the final file extension from a file system path
-        * 
-        * @param $path string
-        * @return string
-        */
-       public static function extensionFromPath( $path ) {
-               $i = strrpos( $path, '.' );
-               return strtolower( $i ? substr( $path, $i + 1 ) : '' );
-       }
-
-       /**
-        * Get an associative array containing information about a file in the local filesystem.
-        *
-        * @param $path String: absolute local filesystem path
-        * @param $ext Mixed: the file extension, or true to extract it from the filename.
-        *             Set it to false to ignore the extension.
-        *
-        * @return array
-        */
-       public static function getPropsFromPath( $path, $ext = true ) {
-               $fsFile = new self( $path );
-               return $fsFile->getProps( $ext );
-       }
-
-       /**
-        * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case
-        * encoding, zero padded to 31 digits.
-        *
-        * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
-        * fairly neatly.
-        *
-        * @param $path string
-        *
-        * @return bool|string False on failure
-        */
-       public static function getSha1Base36FromPath( $path ) {
-               $fsFile = new self( $path );
-               return $fsFile->getSha1Base36();
-       }
-}
diff --git a/includes/filerepo/backend/FSFileBackend.php b/includes/filerepo/backend/FSFileBackend.php
deleted file mode 100644 (file)
index 8157916..0000000
+++ /dev/null
@@ -1,926 +0,0 @@
-<?php
-/**
- * File system based backend.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- * @author Aaron Schulz
- */
-
-/**
- * @brief Class for a file system (FS) based file backend.
- *
- * All "containers" each map to a directory under the backend's base directory.
- * For backwards-compatibility, some container paths can be set to custom paths.
- * The wiki ID will not be used in any custom paths, so this should be avoided.
- *
- * Having directories with thousands of files will diminish performance.
- * Sharding can be accomplished by using FileRepo-style hash paths.
- *
- * Status messages should avoid mentioning the internal FS paths.
- * PHP warnings are assumed to be logged rather than output.
- *
- * @ingroup FileBackend
- * @since 1.19
- */
-class FSFileBackend extends FileBackendStore {
-       protected $basePath; // string; directory holding the container directories
-       /** @var Array Map of container names to root paths */
-       protected $containerPaths = array(); // for custom container paths
-       protected $fileMode; // integer; file permission mode
-
-       protected $hadWarningErrors = array();
-
-       /**
-        * @see FileBackendStore::__construct()
-        * Additional $config params include:
-        *    basePath       : File system directory that holds containers.
-        *    containerPaths : Map of container names to custom file system directories.
-        *                     This should only be used for backwards-compatibility.
-        *    fileMode       : Octal UNIX file permissions to use on files stored.
-        */
-       public function __construct( array $config ) {
-               parent::__construct( $config );
-
-               // Remove any possible trailing slash from directories
-               if ( isset( $config['basePath'] ) ) {
-                       $this->basePath = rtrim( $config['basePath'], '/' ); // remove trailing slash
-               } else {
-                       $this->basePath = null; // none; containers must have explicit paths
-               }
-
-               if ( isset( $config['containerPaths'] ) ) {
-                       $this->containerPaths = (array)$config['containerPaths'];
-                       foreach ( $this->containerPaths as &$path ) {
-                               $path = rtrim( $path, '/' );  // remove trailing slash
-                       }
-               }
-
-               $this->fileMode = isset( $config['fileMode'] )
-                       ? $config['fileMode']
-                       : 0644;
-       }
-
-       /**
-        * @see FileBackendStore::resolveContainerPath()
-        * @param $container string
-        * @param $relStoragePath string
-        * @return null|string
-        */
-       protected function resolveContainerPath( $container, $relStoragePath ) {
-               // Check that container has a root directory
-               if ( isset( $this->containerPaths[$container] ) || isset( $this->basePath ) ) {
-                       // Check for sane relative paths (assume the base paths are OK)
-                       if ( $this->isLegalRelPath( $relStoragePath ) ) {
-                               return $relStoragePath;
-                       }
-               }
-               return null;
-       }
-
-       /**
-        * Sanity check a relative file system path for validity
-        *
-        * @param $path string Normalized relative path
-        * @return bool
-        */
-       protected function isLegalRelPath( $path ) {
-               // Check for file names longer than 255 chars
-               if ( preg_match( '![^/]{256}!', $path ) ) { // ext3/NTFS
-                       return false;
-               }
-               if ( wfIsWindows() ) { // NTFS
-                       return !preg_match( '![:*?"<>|]!', $path );
-               } else {
-                       return true;
-               }
-       }
-
-       /**
-        * Given the short (unresolved) and full (resolved) name of
-        * a container, return the file system path of the container.
-        *
-        * @param $shortCont string
-        * @param $fullCont string
-        * @return string|null
-        */
-       protected function containerFSRoot( $shortCont, $fullCont ) {
-               if ( isset( $this->containerPaths[$shortCont] ) ) {
-                       return $this->containerPaths[$shortCont];
-               } elseif ( isset( $this->basePath ) ) {
-                       return "{$this->basePath}/{$fullCont}";
-               }
-               return null; // no container base path defined
-       }
-
-       /**
-        * Get the absolute file system path for a storage path
-        *
-        * @param $storagePath string Storage path
-        * @return string|null
-        */
-       protected function resolveToFSPath( $storagePath ) {
-               list( $fullCont, $relPath ) = $this->resolveStoragePathReal( $storagePath );
-               if ( $relPath === null ) {
-                       return null; // invalid
-               }
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $storagePath );
-               $fsPath = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
-               if ( $relPath != '' ) {
-                       $fsPath .= "/{$relPath}";
-               }
-               return $fsPath;
-       }
-
-       /**
-        * @see FileBackendStore::isPathUsableInternal()
-        * @return bool
-        */
-       public function isPathUsableInternal( $storagePath ) {
-               $fsPath = $this->resolveToFSPath( $storagePath );
-               if ( $fsPath === null ) {
-                       return false; // invalid
-               }
-               $parentDir = dirname( $fsPath );
-
-               if ( file_exists( $fsPath ) ) {
-                       $ok = is_file( $fsPath ) && is_writable( $fsPath );
-               } else {
-                       $ok = is_dir( $parentDir ) && is_writable( $parentDir );
-               }
-
-               return $ok;
-       }
-
-       /**
-        * @see FileBackendStore::doStoreInternal()
-        * @return Status
-        */
-       protected function doStoreInternal( array $params ) {
-               $status = Status::newGood();
-
-               $dest = $this->resolveToFSPath( $params['dst'] );
-               if ( $dest === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
-                       return $status;
-               }
-
-               if ( file_exists( $dest ) ) {
-                       if ( !empty( $params['overwrite'] ) ) {
-                               $ok = unlink( $dest );
-                               if ( !$ok ) {
-                                       $status->fatal( 'backend-fail-delete', $params['dst'] );
-                                       return $status;
-                               }
-                       } else {
-                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
-                               return $status;
-                       }
-               }
-
-               if ( !empty( $params['async'] ) ) { // deferred
-                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
-                               wfEscapeShellArg( $this->cleanPathSlashes( $params['src'] ) ),
-                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
-                       ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Store', $cmd, $dest );
-               } else { // immediate write
-                       $ok = copy( $params['src'], $dest );
-                       // In some cases (at least over NFS), copy() returns true when it fails
-                       if ( !$ok || ( filesize( $params['src'] ) !== filesize( $dest ) ) ) {
-                               if ( $ok ) { // PHP bug
-                                       unlink( $dest ); // remove broken file
-                                       trigger_error( __METHOD__ . ": copy() failed but returned true." );
-                               }
-                               $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
-                               return $status;
-                       }
-                       $this->chmod( $dest );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseStore( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doCopyInternal()
-        * @return Status
-        */
-       protected function doCopyInternal( array $params ) {
-               $status = Status::newGood();
-
-               $source = $this->resolveToFSPath( $params['src'] );
-               if ( $source === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
-                       return $status;
-               }
-
-               $dest = $this->resolveToFSPath( $params['dst'] );
-               if ( $dest === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
-                       return $status;
-               }
-
-               if ( file_exists( $dest ) ) {
-                       if ( !empty( $params['overwrite'] ) ) {
-                               $ok = unlink( $dest );
-                               if ( !$ok ) {
-                                       $status->fatal( 'backend-fail-delete', $params['dst'] );
-                                       return $status;
-                               }
-                       } else {
-                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
-                               return $status;
-                       }
-               }
-
-               if ( !empty( $params['async'] ) ) { // deferred
-                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
-                               wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
-                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
-                       ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
-               } else { // immediate write
-                       $ok = copy( $source, $dest );
-                       // In some cases (at least over NFS), copy() returns true when it fails
-                       if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
-                               if ( $ok ) { // PHP bug
-                                       unlink( $dest ); // remove broken file
-                                       trigger_error( __METHOD__ . ": copy() failed but returned true." );
-                               }
-                               $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                               return $status;
-                       }
-                       $this->chmod( $dest );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseCopy( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doMoveInternal()
-        * @return Status
-        */
-       protected function doMoveInternal( array $params ) {
-               $status = Status::newGood();
-
-               $source = $this->resolveToFSPath( $params['src'] );
-               if ( $source === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
-                       return $status;
-               }
-
-               $dest = $this->resolveToFSPath( $params['dst'] );
-               if ( $dest === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
-                       return $status;
-               }
-
-               if ( file_exists( $dest ) ) {
-                       if ( !empty( $params['overwrite'] ) ) {
-                               // Windows does not support moving over existing files
-                               if ( wfIsWindows() ) {
-                                       $ok = unlink( $dest );
-                                       if ( !$ok ) {
-                                               $status->fatal( 'backend-fail-delete', $params['dst'] );
-                                               return $status;
-                                       }
-                               }
-                       } else {
-                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
-                               return $status;
-                       }
-               }
-
-               if ( !empty( $params['async'] ) ) { // deferred
-                       $cmd = implode( ' ', array( wfIsWindows() ? 'MOVE' : 'mv',
-                               wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
-                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
-                       ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
-               } else { // immediate write
-                       $ok = rename( $source, $dest );
-                       clearstatcache(); // file no longer at source
-                       if ( !$ok ) {
-                               $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-                               return $status;
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseMove( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doDeleteInternal()
-        * @return Status
-        */
-       protected function doDeleteInternal( array $params ) {
-               $status = Status::newGood();
-
-               $source = $this->resolveToFSPath( $params['src'] );
-               if ( $source === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
-                       return $status;
-               }
-
-               if ( !is_file( $source ) ) {
-                       if ( empty( $params['ignoreMissingSource'] ) ) {
-                               $status->fatal( 'backend-fail-delete', $params['src'] );
-                       }
-                       return $status; // do nothing; either OK or bad status
-               }
-
-               if ( !empty( $params['async'] ) ) { // deferred
-                       $cmd = implode( ' ', array( wfIsWindows() ? 'DEL' : 'unlink',
-                               wfEscapeShellArg( $this->cleanPathSlashes( $source ) )
-                       ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd );
-               } else { // immediate write
-                       $ok = unlink( $source );
-                       if ( !$ok ) {
-                               $status->fatal( 'backend-fail-delete', $params['src'] );
-                               return $status;
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseDelete( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-delete', $params['src'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doCreateInternal()
-        * @return Status
-        */
-       protected function doCreateInternal( array $params ) {
-               $status = Status::newGood();
-
-               $dest = $this->resolveToFSPath( $params['dst'] );
-               if ( $dest === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
-                       return $status;
-               }
-
-               if ( file_exists( $dest ) ) {
-                       if ( !empty( $params['overwrite'] ) ) {
-                               $ok = unlink( $dest );
-                               if ( !$ok ) {
-                                       $status->fatal( 'backend-fail-delete', $params['dst'] );
-                                       return $status;
-                               }
-                       } else {
-                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
-                               return $status;
-                       }
-               }
-
-               if ( !empty( $params['async'] ) ) { // deferred
-                       $tempFile = TempFSFile::factory( 'create_', 'tmp' );
-                       if ( !$tempFile ) {
-                               $status->fatal( 'backend-fail-create', $params['dst'] );
-                               return $status;
-                       }
-                       $bytes = file_put_contents( $tempFile->getPath(), $params['content'] );
-                       if ( $bytes === false ) {
-                               $status->fatal( 'backend-fail-create', $params['dst'] );
-                               return $status;
-                       }
-                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
-                               wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
-                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
-                       ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
-                       $tempFile->bind( $status->value );
-               } else { // immediate write
-                       $bytes = file_put_contents( $dest, $params['content'] );
-                       if ( $bytes === false ) {
-                               $status->fatal( 'backend-fail-create', $params['dst'] );
-                               return $status;
-                       }
-                       $this->chmod( $dest );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseCreate( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-create', $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doPrepareInternal()
-        * @return Status
-        */
-       protected function doPrepareInternal( $fullCont, $dirRel, array $params ) {
-               $status = Status::newGood();
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
-               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
-               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
-               if ( !wfMkdirParents( $dir ) ) { // make directory and its parents
-                       $status->fatal( 'directorycreateerror', $params['dir'] );
-               } elseif ( !is_writable( $dir ) ) {
-                       $status->fatal( 'directoryreadonlyerror', $params['dir'] );
-               } elseif ( !is_readable( $dir ) ) {
-                       $status->fatal( 'directorynotreadableerror', $params['dir'] );
-               }
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::doSecureInternal()
-        * @return Status
-        */
-       protected function doSecureInternal( $fullCont, $dirRel, array $params ) {
-               $status = Status::newGood();
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
-               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
-               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
-               // Seed new directories with a blank index.html, to prevent crawling...
-               if ( !empty( $params['noListing'] ) && !file_exists( "{$dir}/index.html" ) ) {
-                       $bytes = file_put_contents( "{$dir}/index.html", '' );
-                       if ( !$bytes ) {
-                               $status->fatal( 'backend-fail-create', $params['dir'] . '/index.html' );
-                               return $status;
-                       }
-               }
-               // Add a .htaccess file to the root of the container...
-               if ( !empty( $params['noAccess'] ) ) {
-                       if ( !file_exists( "{$contRoot}/.htaccess" ) ) {
-                               $bytes = file_put_contents( "{$contRoot}/.htaccess", "Deny from all\n" );
-                               if ( !$bytes ) {
-                                       $storeDir = "mwstore://{$this->name}/{$shortCont}";
-                                       $status->fatal( 'backend-fail-create', "{$storeDir}/.htaccess" );
-                                       return $status;
-                               }
-                       }
-               }
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::doCleanInternal()
-        * @return Status
-        */
-       protected function doCleanInternal( $fullCont, $dirRel, array $params ) {
-               $status = Status::newGood();
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
-               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
-               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
-               wfSuppressWarnings();
-               if ( is_dir( $dir ) ) {
-                       rmdir( $dir ); // remove directory if empty
-               }
-               wfRestoreWarnings();
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::doFileExists()
-        * @return array|bool|null
-        */
-       protected function doGetFileStat( array $params ) {
-               $source = $this->resolveToFSPath( $params['src'] );
-               if ( $source === null ) {
-                       return false; // invalid storage path
-               }
-
-               $this->trapWarnings(); // don't trust 'false' if there were errors
-               $stat = is_file( $source ) ? stat( $source ) : false; // regular files only
-               $hadError = $this->untrapWarnings();
-
-               if ( $stat ) {
-                       return array(
-                               'mtime' => wfTimestamp( TS_MW, $stat['mtime'] ),
-                               'size'  => $stat['size']
-                       );
-               } elseif ( !$hadError ) {
-                       return false; // file does not exist
-               } else {
-                       return null; // failure
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doClearCache()
-        */
-       protected function doClearCache( array $paths = null ) {
-               clearstatcache(); // clear the PHP file stat cache
-       }
-
-       /**
-        * @see FileBackendStore::doDirectoryExists()
-        * @return bool|null
-        */
-       protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
-               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
-               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
-
-               $this->trapWarnings(); // don't trust 'false' if there were errors
-               $exists = is_dir( $dir );
-               $hadError = $this->untrapWarnings();
-
-               return $hadError ? null : $exists;
-       }
-
-       /**
-        * @see FileBackendStore::getDirectoryListInternal()
-        * @return Array|null
-        */
-       public function getDirectoryListInternal( $fullCont, $dirRel, array $params ) {
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
-               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
-               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
-               $exists = is_dir( $dir );
-               if ( !$exists ) {
-                       wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
-                       return array(); // nothing under this dir
-               } elseif ( !is_readable( $dir ) ) {
-                       wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
-                       return null; // bad permissions?
-               }
-               return new FSFileBackendDirList( $dir, $params );
-       }
-
-       /**
-        * @see FileBackendStore::getFileListInternal()
-        * @return array|FSFileBackendFileList|null
-        */
-       public function getFileListInternal( $fullCont, $dirRel, array $params ) {
-               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
-               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
-               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
-               $exists = is_dir( $dir );
-               if ( !$exists ) {
-                       wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
-                       return array(); // nothing under this dir
-               } elseif ( !is_readable( $dir ) ) {
-                       wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
-                       return null; // bad permissions?
-               }
-               return new FSFileBackendFileList( $dir, $params );
-       }
-
-       /**
-        * @see FileBackendStore::getLocalReference()
-        * @return FSFile|null
-        */
-       public function getLocalReference( array $params ) {
-               $source = $this->resolveToFSPath( $params['src'] );
-               if ( $source === null ) {
-                       return null;
-               }
-               return new FSFile( $source );
-       }
-
-       /**
-        * @see FileBackendStore::getLocalCopy()
-        * @return null|TempFSFile
-        */
-       public function getLocalCopy( array $params ) {
-               $source = $this->resolveToFSPath( $params['src'] );
-               if ( $source === null ) {
-                       return null;
-               }
-
-               // Create a new temporary file with the same extension...
-               $ext = FileBackend::extensionFromPath( $params['src'] );
-               $tmpFile = TempFSFile::factory( wfBaseName( $source ) . '_', $ext );
-               if ( !$tmpFile ) {
-                       return null;
-               }
-               $tmpPath = $tmpFile->getPath();
-
-               // Copy the source file over the temp file
-               $ok = copy( $source, $tmpPath );
-               if ( !$ok ) {
-                       return null;
-               }
-
-               $this->chmod( $tmpPath );
-
-               return $tmpFile;
-       }
-
-       /**
-        * @see FileBackendStore::directoriesAreVirtual()
-        * @return bool
-        */
-       protected function directoriesAreVirtual() {
-               return false;
-       }
-
-       /**
-        * @see FileBackendStore::doExecuteOpHandlesInternal()
-        * @return Array List of corresponding Status objects
-        */
-       protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
-               $statuses = array();
-
-               $pipes = array();
-               foreach ( $fileOpHandles as $index => $fileOpHandle ) {
-                       $pipes[$index] = popen( "{$fileOpHandle->cmd} 2>&1", 'r' );
-               }
-
-               $errs = array();
-               foreach ( $pipes as $index => $pipe ) {
-                       // Result will be empty on success in *NIX. On Windows,
-                       // it may be something like "        1 file(s) [copied|moved].".
-                       $errs[$index] = stream_get_contents( $pipe );
-                       fclose( $pipe );
-               }
-
-               foreach ( $fileOpHandles as $index => $fileOpHandle ) {
-                       $status = Status::newGood();
-                       $function = '_getResponse' . $fileOpHandle->call;
-                       $this->$function( $errs[$index], $status, $fileOpHandle->params, $fileOpHandle->cmd );
-                       $statuses[$index] = $status;
-                       if ( $status->isOK() && $fileOpHandle->chmodPath ) {
-                               $this->chmod( $fileOpHandle->chmodPath );
-                       }
-               }
-
-               clearstatcache(); // files changed
-               return $statuses;
-       }
-
-       /**
-        * Chmod a file, suppressing the warnings
-        *
-        * @param $path string Absolute file system path
-        * @return bool Success
-        */
-       protected function chmod( $path ) {
-               wfSuppressWarnings();
-               $ok = chmod( $path, $this->fileMode );
-               wfRestoreWarnings();
-
-               return $ok;
-       }
-
-       /**
-        * Clean up directory separators for the given OS
-        *
-        * @param $path string FS path
-        * @return string
-        */
-       protected function cleanPathSlashes( $path ) {
-               return wfIsWindows() ? strtr( $path, '/', '\\' ) : $path;
-       }
-
-       /**
-        * Listen for E_WARNING errors and track whether any happen
-        *
-        * @return bool
-        */
-       protected function trapWarnings() {
-               $this->hadWarningErrors[] = false; // push to stack
-               set_error_handler( array( $this, 'handleWarning' ), E_WARNING );
-               return false; // invoke normal PHP error handler
-       }
-
-       /**
-        * Stop listening for E_WARNING errors and return true if any happened
-        *
-        * @return bool
-        */
-       protected function untrapWarnings() {
-               restore_error_handler(); // restore previous handler
-               return array_pop( $this->hadWarningErrors ); // pop from stack
-       }
-
-       /**
-        * @return bool
-        */
-       private function handleWarning() {
-               $this->hadWarningErrors[count( $this->hadWarningErrors ) - 1] = true;
-               return true; // suppress from PHP handler
-       }
-}
-
-/**
- * @see FileBackendStoreOpHandle
- */
-class FSFileOpHandle extends FileBackendStoreOpHandle {
-       public $cmd; // string; shell command
-       public $chmodPath; // string; file to chmod
-
-       /**
-        * @param $backend
-        * @param $params array
-        * @param $call
-        * @param $cmd
-        * @param $chmodPath null
-        */
-       public function __construct( $backend, array $params, $call, $cmd, $chmodPath = null ) {
-               $this->backend = $backend;
-               $this->params = $params;
-               $this->call = $call;
-               $this->cmd = $cmd;
-               $this->chmodPath = $chmodPath;
-       }
-}
-
-/**
- * Wrapper around RecursiveDirectoryIterator/DirectoryIterator that
- * catches exception or does any custom behavoir that we may want.
- * Do not use this class from places outside FSFileBackend.
- *
- * @ingroup FileBackend
- */
-abstract class FSFileBackendList implements Iterator {
-       /** @var Iterator */
-       protected $iter;
-       protected $suffixStart; // integer
-       protected $pos = 0; // integer
-       /** @var Array */
-       protected $params = array();
-
-       /**
-        * @param $dir string file system directory
-        * @param $params array
-        */
-       public function __construct( $dir, array $params ) {
-               $dir = realpath( $dir ); // normalize
-               $this->suffixStart = strlen( $dir ) + 1; // size of "path/to/dir/"
-               $this->params = $params;
-
-               try {
-                       $this->iter = $this->initIterator( $dir );
-               } catch ( UnexpectedValueException $e ) {
-                       $this->iter = null; // bad permissions? deleted?
-               }
-       }
-
-       /**
-        * Return an appropriate iterator object to wrap
-        *
-        * @param $dir string file system directory
-        * @return Iterator
-        */
-       protected function initIterator( $dir ) {
-               if ( !empty( $this->params['topOnly'] ) ) { // non-recursive
-                       # Get an iterator that will get direct sub-nodes
-                       return new DirectoryIterator( $dir );
-               } else { // recursive
-                       # Get an iterator that will return leaf nodes (non-directories)
-                       # RecursiveDirectoryIterator extends FilesystemIterator.
-                       # FilesystemIterator::SKIP_DOTS default is inconsistent in PHP 5.3.x.
-                       $flags = FilesystemIterator::CURRENT_AS_SELF | FilesystemIterator::SKIP_DOTS;
-                       return new RecursiveIteratorIterator(
-                               new RecursiveDirectoryIterator( $dir, $flags ),
-                               RecursiveIteratorIterator::CHILD_FIRST // include dirs
-                       );
-               }
-       }
-
-       /**
-        * @see Iterator::key()
-        * @return integer
-        */
-       public function key() {
-               return $this->pos;
-       }
-
-       /**
-        * @see Iterator::current()
-        * @return string|bool String or false
-        */
-       public function current() {
-               return $this->getRelPath( $this->iter->current()->getPathname() );
-       }
-
-       /**
-        * @see Iterator::next()
-        * @return void
-        */
-       public function next() {
-               try {
-                       $this->iter->next();
-                       $this->filterViaNext();
-               } catch ( UnexpectedValueException $e ) {
-                       $this->iter = null;
-               }
-               ++$this->pos;
-       }
-
-       /**
-        * @see Iterator::rewind()
-        * @return void
-        */
-       public function rewind() {
-               $this->pos = 0;
-               try {
-                       $this->iter->rewind();
-                       $this->filterViaNext();
-               } catch ( UnexpectedValueException $e ) {
-                       $this->iter = null;
-               }
-       }
-
-       /**
-        * @see Iterator::valid()
-        * @return bool
-        */
-       public function valid() {
-               return $this->iter && $this->iter->valid();
-       }
-
-       /**
-        * Filter out items by advancing to the next ones
-        */
-       protected function filterViaNext() {}
-
-       /**
-        * Return only the relative path and normalize slashes to FileBackend-style.
-        * Uses the "real path" since the suffix is based upon that.
-        *
-        * @param $path string
-        * @return string
-        */
-       protected function getRelPath( $path ) {
-               return strtr( substr( realpath( $path ), $this->suffixStart ), '\\', '/' );
-       }
-}
-
-class FSFileBackendDirList extends FSFileBackendList {
-       protected function filterViaNext() {
-               while ( $this->iter->valid() ) {
-                       if ( $this->iter->current()->isDot() || !$this->iter->current()->isDir() ) {
-                               $this->iter->next(); // skip non-directories and dot files
-                       } else {
-                               break;
-                       }
-               }
-       }
-}
-
-class FSFileBackendFileList extends FSFileBackendList {
-       protected function filterViaNext() {
-               while ( $this->iter->valid() ) {
-                       if ( !$this->iter->current()->isFile() ) {
-                               $this->iter->next(); // skip non-files and dot files
-                       } else {
-                               break;
-                       }
-               }
-       }
-}
diff --git a/includes/filerepo/backend/FileBackend.php b/includes/filerepo/backend/FileBackend.php
deleted file mode 100644 (file)
index 3cc9021..0000000
+++ /dev/null
@@ -1,1043 +0,0 @@
-<?php
-/**
- * @defgroup FileBackend File backend
- * @ingroup  FileRepo
- *
- * File backend is used to interact with file storage systems,
- * such as the local file system, NFS, or cloud storage systems.
- */
-
-/**
- * Base class for all file backends.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- * @author Aaron Schulz
- */
-
-/**
- * @brief Base class for all file backend classes (including multi-write backends).
- *
- * This class defines the methods as abstract that subclasses must implement.
- * Outside callers can assume that all backends will have these functions.
- *
- * All "storage paths" are of the format "mwstore://<backend>/<container>/<path>".
- * The <path> portion is a relative path that uses UNIX file system (FS) notation,
- * though any particular backend may not actually be using a local filesystem.
- * Therefore, the relative paths are only virtual.
- *
- * Backend contents are stored under wiki-specific container names by default.
- * For legacy reasons, this has no effect for the FS backend class, and per-wiki
- * segregation must be done by setting the container paths appropriately.
- *
- * FS-based backends are somewhat more restrictive due to the existence of real
- * directory files; a regular file cannot have the same name as a directory. Other
- * backends with virtual directories may not have this limitation. Callers should
- * store files in such a way that no files and directories are under the same path.
- *
- * Methods should avoid throwing exceptions at all costs.
- * As a corollary, external dependencies should be kept to a minimum.
- *
- * @ingroup FileBackend
- * @since 1.19
- */
-abstract class FileBackend {
-       protected $name; // string; unique backend name
-       protected $wikiId; // string; unique wiki name
-       protected $readOnly; // string; read-only explanation message
-       protected $parallelize; // string; when to do operations in parallel
-       protected $concurrency; // integer; how many operations can be done in parallel
-
-       /** @var LockManager */
-       protected $lockManager;
-       /** @var FileJournal */
-       protected $fileJournal;
-
-       /**
-        * Create a new backend instance from configuration.
-        * This should only be called from within FileBackendGroup.
-        *
-        * $config includes:
-        *     'name'        : The unique name of this backend.
-        *                     This should consist of alphanumberic, '-', and '_' characters.
-        *                     This name should not be changed after use.
-        *     'wikiId'      : Prefix to container names that is unique to this wiki.
-        *                     It should only consist of alphanumberic, '-', and '_' characters.
-        *     'lockManager' : Registered name of a file lock manager to use.
-        *     'fileJournal' : File journal configuration; see FileJournal::factory().
-        *                     Journals simply log changes to files stored in the backend.
-        *     'readOnly'    : Write operations are disallowed if this is a non-empty string.
-        *                     It should be an explanation for the backend being read-only.
-        *     'parallelize' : When to do file operations in parallel (when possible).
-        *                     Allowed values are "implicit", "explicit" and "off".
-        *     'concurrency' : How many file operations can be done in parallel.
-        *
-        * @param $config Array
-        * @throws MWException
-        */
-       public function __construct( array $config ) {
-               $this->name = $config['name'];
-               if ( !preg_match( '!^[a-zA-Z0-9-_]{1,255}$!', $this->name ) ) {
-                       throw new MWException( "Backend name `{$this->name}` is invalid." );
-               }
-               $this->wikiId = isset( $config['wikiId'] )
-                       ? $config['wikiId']
-                       : wfWikiID(); // e.g. "my_wiki-en_"
-               $this->lockManager = ( $config['lockManager'] instanceof LockManager )
-                       ? $config['lockManager']
-                       : LockManagerGroup::singleton()->get( $config['lockManager'] );
-               $this->fileJournal = isset( $config['fileJournal'] )
-                       ? FileJournal::factory( $config['fileJournal'], $this->name )
-                       : FileJournal::factory( array( 'class' => 'NullFileJournal' ), $this->name );
-               $this->readOnly = isset( $config['readOnly'] )
-                       ? (string)$config['readOnly']
-                       : '';
-               $this->parallelize = isset( $config['parallelize'] )
-                       ? (string)$config['parallelize']
-                       : 'off';
-               $this->concurrency = isset( $config['concurrency'] )
-                       ? (int)$config['concurrency']
-                       : 50;
-       }
-
-       /**
-        * Get the unique backend name.
-        * We may have multiple different backends of the same type.
-        * For example, we can have two Swift backends using different proxies.
-        *
-        * @return string
-        */
-       final public function getName() {
-               return $this->name;
-       }
-
-       /**
-        * Check if this backend is read-only
-        *
-        * @return bool
-        */
-       final public function isReadOnly() {
-               return ( $this->readOnly != '' );
-       }
-
-       /**
-        * Get an explanatory message if this backend is read-only
-        *
-        * @return string|bool Returns false if the backend is not read-only
-        */
-       final public function getReadOnlyReason() {
-               return ( $this->readOnly != '' ) ? $this->readOnly : false;
-       }
-
-       /**
-        * This is the main entry point into the backend for write operations.
-        * Callers supply an ordered list of operations to perform as a transaction.
-        * Files will be locked, the stat cache cleared, and then the operations attempted.
-        * If any serious errors occur, all attempted operations will be rolled back.
-        *
-        * $ops is an array of arrays. The outer array holds a list of operations.
-        * Each inner array is a set of key value pairs that specify an operation.
-        *
-        * Supported operations and their parameters:
-        * a) Create a new file in storage with the contents of a string
-        *     array(
-        *         'op'                  => 'create',
-        *         'dst'                 => <storage path>,
-        *         'content'             => <string of new file contents>,
-        *         'overwrite'           => <boolean>,
-        *         'overwriteSame'       => <boolean>
-        *     )
-        * b) Copy a file system file into storage
-        *     array(
-        *         'op'                  => 'store',
-        *         'src'                 => <file system path>,
-        *         'dst'                 => <storage path>,
-        *         'overwrite'           => <boolean>,
-        *         'overwriteSame'       => <boolean>
-        *     )
-        * c) Copy a file within storage
-        *     array(
-        *         'op'                  => 'copy',
-        *         'src'                 => <storage path>,
-        *         'dst'                 => <storage path>,
-        *         'overwrite'           => <boolean>,
-        *         'overwriteSame'       => <boolean>
-        *     )
-        * d) Move a file within storage
-        *     array(
-        *         'op'                  => 'move',
-        *         'src'                 => <storage path>,
-        *         'dst'                 => <storage path>,
-        *         'overwrite'           => <boolean>,
-        *         'overwriteSame'       => <boolean>
-        *     )
-        * e) Delete a file within storage
-        *     array(
-        *         'op'                  => 'delete',
-        *         'src'                 => <storage path>,
-        *         'ignoreMissingSource' => <boolean>
-        *     )
-        * f) Do nothing (no-op)
-        *     array(
-        *         'op'                  => 'null',
-        *     )
-        *
-        * Boolean flags for operations (operation-specific):
-        * 'ignoreMissingSource' : The operation will simply succeed and do
-        *                         nothing if the source file does not exist.
-        * 'overwrite'           : Any destination file will be overwritten.
-        * 'overwriteSame'       : An error will not be given if a file already
-        *                         exists at the destination that has the same
-        *                         contents as the new contents to be written there.
-        *
-        * $opts is an associative of boolean flags, including:
-        * 'force'               : Operation precondition errors no longer trigger an abort.
-        *                         Any remaining operations are still attempted. Unexpected
-        *                         failures may still cause remaning operations to be aborted.
-        * 'nonLocking'          : No locks are acquired for the operations.
-        *                         This can increase performance for non-critical writes.
-        *                         This has no effect unless the 'force' flag is set.
-        * 'allowStale'          : Don't require the latest available data.
-        *                         This can increase performance for non-critical writes.
-        *                         This has no effect unless the 'force' flag is set.
-        * 'nonJournaled'        : Don't log this operation batch in the file journal.
-        *                         This limits the ability of recovery scripts.
-        * 'parallelize'         : Try to do operations in parallel when possible.
-        *
-        * Remarks on locking:
-        * File system paths given to operations should refer to files that are
-        * already locked or otherwise safe from modification from other processes.
-        * Normally these files will be new temp files, which should be adequate.
-        *
-        * Return value:
-        * This returns a Status, which contains all warnings and fatals that occured
-        * during the operation. The 'failCount', 'successCount', and 'success' members
-        * will reflect each operation attempted. The status will be "OK" unless:
-        *     a) unexpected operation errors occurred (network partitions, disk full...)
-        *     b) significant operation errors occured and 'force' was not set
-        *
-        * @param $ops Array List of operations to execute in order
-        * @param $opts Array Batch operation options
-        * @return Status
-        */
-       final public function doOperations( array $ops, array $opts = array() ) {
-               if ( $this->isReadOnly() ) {
-                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
-               }
-               if ( empty( $opts['force'] ) ) { // sanity
-                       unset( $opts['nonLocking'] );
-                       unset( $opts['allowStale'] );
-               }
-               $opts['concurrency'] = 1; // off
-               if ( $this->parallelize === 'implicit' ) {
-                       if ( !isset( $opts['parallelize'] ) || $opts['parallelize'] ) {
-                               $opts['concurrency'] = $this->concurrency;
-                       }
-               } elseif ( $this->parallelize === 'explicit' ) {
-                       if ( !empty( $opts['parallelize'] ) ) {
-                               $opts['concurrency'] = $this->concurrency;
-                       }
-               }
-               return $this->doOperationsInternal( $ops, $opts );
-       }
-
-       /**
-        * @see FileBackend::doOperations()
-        */
-       abstract protected function doOperationsInternal( array $ops, array $opts );
-
-       /**
-        * Same as doOperations() except it takes a single operation.
-        * If you are doing a batch of operations that should either
-        * all succeed or all fail, then use that function instead.
-        *
-        * @see FileBackend::doOperations()
-        *
-        * @param $op Array Operation
-        * @param $opts Array Operation options
-        * @return Status
-        */
-       final public function doOperation( array $op, array $opts = array() ) {
-               return $this->doOperations( array( $op ), $opts );
-       }
-
-       /**
-        * Performs a single create operation.
-        * This sets $params['op'] to 'create' and passes it to doOperation().
-        *
-        * @see FileBackend::doOperation()
-        *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
-        * @return Status
-        */
-       final public function create( array $params, array $opts = array() ) {
-               return $this->doOperation( array( 'op' => 'create' ) + $params, $opts );
-       }
-
-       /**
-        * Performs a single store operation.
-        * This sets $params['op'] to 'store' and passes it to doOperation().
-        *
-        * @see FileBackend::doOperation()
-        *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
-        * @return Status
-        */
-       final public function store( array $params, array $opts = array() ) {
-               return $this->doOperation( array( 'op' => 'store' ) + $params, $opts );
-       }
-
-       /**
-        * Performs a single copy operation.
-        * This sets $params['op'] to 'copy' and passes it to doOperation().
-        *
-        * @see FileBackend::doOperation()
-        *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
-        * @return Status
-        */
-       final public function copy( array $params, array $opts = array() ) {
-               return $this->doOperation( array( 'op' => 'copy' ) + $params, $opts );
-       }
-
-       /**
-        * Performs a single move operation.
-        * This sets $params['op'] to 'move' and passes it to doOperation().
-        *
-        * @see FileBackend::doOperation()
-        *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
-        * @return Status
-        */
-       final public function move( array $params, array $opts = array() ) {
-               return $this->doOperation( array( 'op' => 'move' ) + $params, $opts );
-       }
-
-       /**
-        * Performs a single delete operation.
-        * This sets $params['op'] to 'delete' and passes it to doOperation().
-        *
-        * @see FileBackend::doOperation()
-        *
-        * @param $params Array Operation parameters
-        * @param $opts Array Operation options
-        * @return Status
-        */
-       final public function delete( array $params, array $opts = array() ) {
-               return $this->doOperation( array( 'op' => 'delete' ) + $params, $opts );
-       }
-
-       /**
-        * Perform a set of independent file operations on some files.
-        *
-        * This does no locking, nor journaling, and possibly no stat calls.
-        * Any destination files that already exist will be overwritten.
-        * This should *only* be used on non-original files, like cache files.
-        *
-        * Supported operations and their parameters:
-        * a) Create a new file in storage with the contents of a string
-        *     array(
-        *         'op'                  => 'create',
-        *         'dst'                 => <storage path>,
-        *         'content'             => <string of new file contents>
-        *     )
-        * b) Copy a file system file into storage
-        *     array(
-        *         'op'                  => 'store',
-        *         'src'                 => <file system path>,
-        *         'dst'                 => <storage path>
-        *     )
-        * c) Copy a file within storage
-        *     array(
-        *         'op'                  => 'copy',
-        *         'src'                 => <storage path>,
-        *         'dst'                 => <storage path>
-        *     )
-        * d) Move a file within storage
-        *     array(
-        *         'op'                  => 'move',
-        *         'src'                 => <storage path>,
-        *         'dst'                 => <storage path>
-        *     )
-        * e) Delete a file within storage
-        *     array(
-        *         'op'                  => 'delete',
-        *         'src'                 => <storage path>,
-        *         'ignoreMissingSource' => <boolean>
-        *     )
-        * f) Do nothing (no-op)
-        *     array(
-        *         'op'                  => 'null',
-        *     )
-        *
-        * Boolean flags for operations (operation-specific):
-        * 'ignoreMissingSource' : The operation will simply succeed and do
-        *                         nothing if the source file does not exist.
-        *
-        * Return value:
-        * This returns a Status, which contains all warnings and fatals that occured
-        * during the operation. The 'failCount', 'successCount', and 'success' members
-        * will reflect each operation attempted for the given files. The status will be
-        * considered "OK" as long as no fatal errors occured.
-        *
-        * @param $ops Array Set of operations to execute
-        * @return Status
-        * @since 1.20
-        */
-       final public function doQuickOperations( array $ops ) {
-               if ( $this->isReadOnly() ) {
-                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
-               }
-               foreach ( $ops as &$op ) {
-                       $op['overwrite'] = true; // avoids RTTs in key/value stores
-               }
-               return $this->doQuickOperationsInternal( $ops );
-       }
-
-       /**
-        * @see FileBackend::doQuickOperations()
-        * @since 1.20
-        */
-       abstract protected function doQuickOperationsInternal( array $ops );
-
-       /**
-        * Same as doQuickOperations() except it takes a single operation.
-        * If you are doing a batch of operations, then use that function instead.
-        *
-        * @see FileBackend::doQuickOperations()
-        *
-        * @param $op Array Operation
-        * @return Status
-        * @since 1.20
-        */
-       final public function doQuickOperation( array $op ) {
-               return $this->doQuickOperations( array( $op ) );
-       }
-
-       /**
-        * Performs a single quick create operation.
-        * This sets $params['op'] to 'create' and passes it to doQuickOperation().
-        *
-        * @see FileBackend::doQuickOperation()
-        *
-        * @param $params Array Operation parameters
-        * @return Status
-        * @since 1.20
-        */
-       final public function quickCreate( array $params ) {
-               return $this->doQuickOperation( array( 'op' => 'create' ) + $params );
-       }
-
-       /**
-        * Performs a single quick store operation.
-        * This sets $params['op'] to 'store' and passes it to doQuickOperation().
-        *
-        * @see FileBackend::doQuickOperation()
-        *
-        * @param $params Array Operation parameters
-        * @return Status
-        * @since 1.20
-        */
-       final public function quickStore( array $params ) {
-               return $this->doQuickOperation( array( 'op' => 'store' ) + $params );
-       }
-
-       /**
-        * Performs a single quick copy operation.
-        * This sets $params['op'] to 'copy' and passes it to doQuickOperation().
-        *
-        * @see FileBackend::doQuickOperation()
-        *
-        * @param $params Array Operation parameters
-        * @return Status
-        * @since 1.20
-        */
-       final public function quickCopy( array $params ) {
-               return $this->doQuickOperation( array( 'op' => 'copy' ) + $params );
-       }
-
-       /**
-        * Performs a single quick move operation.
-        * This sets $params['op'] to 'move' and passes it to doQuickOperation().
-        *
-        * @see FileBackend::doQuickOperation()
-        *
-        * @param $params Array Operation parameters
-        * @return Status
-        * @since 1.20
-        */
-       final public function quickMove( array $params ) {
-               return $this->doQuickOperation( array( 'op' => 'move' ) + $params );
-       }
-
-       /**
-        * Performs a single quick delete operation.
-        * This sets $params['op'] to 'delete' and passes it to doQuickOperation().
-        *
-        * @see FileBackend::doQuickOperation()
-        *
-        * @param $params Array Operation parameters
-        * @return Status
-        * @since 1.20
-        */
-       final public function quickDelete( array $params ) {
-               return $this->doQuickOperation( array( 'op' => 'delete' ) + $params );
-       }
-
-       /**
-        * Concatenate a list of storage files into a single file system file.
-        * The target path should refer to a file that is already locked or
-        * otherwise safe from modification from other processes. Normally,
-        * the file will be a new temp file, which should be adequate.
-        * $params include:
-        *     srcs : ordered source storage paths (e.g. chunk1, chunk2, ...)
-        *     dst  : file system path to 0-byte temp file
-        *
-        * @param $params Array Operation parameters
-        * @return Status
-        */
-       abstract public function concatenate( array $params );
-
-       /**
-        * Prepare a storage directory for usage.
-        * This will create any required containers and parent directories.
-        * Backends using key/value stores only need to create the container.
-        *
-        * $params include:
-        *     dir : storage directory
-        *
-        * @param $params Array
-        * @return Status
-        */
-       final public function prepare( array $params ) {
-               if ( $this->isReadOnly() ) {
-                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
-               }
-               return $this->doPrepare( $params );
-       }
-
-       /**
-        * @see FileBackend::prepare()
-        */
-       abstract protected function doPrepare( array $params );
-
-       /**
-        * Take measures to block web access to a storage directory and
-        * the container it belongs to. FS backends might add .htaccess
-        * files whereas key/value store backends might restrict container
-        * access to the auth user that represents end-users in web request.
-        * This is not guaranteed to actually do anything.
-        *
-        * $params include:
-        *     dir       : storage directory
-        *     noAccess  : try to deny file access
-        *     noListing : try to deny file listing
-        *
-        * @param $params Array
-        * @return Status
-        */
-       final public function secure( array $params ) {
-               if ( $this->isReadOnly() ) {
-                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
-               }
-               $status = $this->doPrepare( $params ); // dir must exist to restrict it
-               if ( $status->isOK() ) {
-                       $status->merge( $this->doSecure( $params ) );
-               }
-               return $status;
-       }
-
-       /**
-        * @see FileBackend::secure()
-        */
-       abstract protected function doSecure( array $params );
-
-       /**
-        * Delete a storage directory if it is empty.
-        * Backends using key/value stores may do nothing unless the directory
-        * is that of an empty container, in which case it should be deleted.
-        *
-        * $params include:
-        *     dir       : storage directory
-        *     recursive : recursively delete empty subdirectories first (@since 1.20)
-        *
-        * @param $params Array
-        * @return Status
-        */
-       final public function clean( array $params ) {
-               if ( $this->isReadOnly() ) {
-                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
-               }
-               return $this->doClean( $params );
-       }
-
-       /**
-        * @see FileBackend::clean()
-        */
-       abstract protected function doClean( array $params );
-
-       /**
-        * Check if a file exists at a storage path in the backend.
-        * This returns false if only a directory exists at the path.
-        *
-        * $params include:
-        *     src    : source storage path
-        *     latest : use the latest available data
-        *
-        * @param $params Array
-        * @return bool|null Returns null on failure
-        */
-       abstract public function fileExists( array $params );
-
-       /**
-        * Get the last-modified timestamp of the file at a storage path.
-        *
-        * $params include:
-        *     src    : source storage path
-        *     latest : use the latest available data
-        *
-        * @param $params Array
-        * @return string|bool TS_MW timestamp or false on failure
-        */
-       abstract public function getFileTimestamp( array $params );
-
-       /**
-        * Get the contents of a file at a storage path in the backend.
-        * This should be avoided for potentially large files.
-        *
-        * $params include:
-        *     src    : source storage path
-        *     latest : use the latest available data
-        *
-        * @param $params Array
-        * @return string|bool Returns false on failure
-        */
-       abstract public function getFileContents( array $params );
-
-       /**
-        * Get the size (bytes) of a file at a storage path in the backend.
-        *
-        * $params include:
-        *     src    : source storage path
-        *     latest : use the latest available data
-        *
-        * @param $params Array
-        * @return integer|bool Returns false on failure
-        */
-       abstract public function getFileSize( array $params );
-
-       /**
-        * Get quick information about a file at a storage path in the backend.
-        * If the file does not exist, then this returns false.
-        * Otherwise, the result is an associative array that includes:
-        *     mtime  : the last-modified timestamp (TS_MW)
-        *     size   : the file size (bytes)
-        * Additional values may be included for internal use only.
-        *
-        * $params include:
-        *     src    : source storage path
-        *     latest : use the latest available data
-        *
-        * @param $params Array
-        * @return Array|bool|null Returns null on failure
-        */
-       abstract public function getFileStat( array $params );
-
-       /**
-        * Get a SHA-1 hash of the file at a storage path in the backend.
-        *
-        * $params include:
-        *     src    : source storage path
-        *     latest : use the latest available data
-        *
-        * @param $params Array
-        * @return string|bool Hash string or false on failure
-        */
-       abstract public function getFileSha1Base36( array $params );
-
-       /**
-        * Get the properties of the file at a storage path in the backend.
-        * Returns FSFile::placeholderProps() on failure.
-        *
-        * $params include:
-        *     src    : source storage path
-        *     latest : use the latest available data
-        *
-        * @param $params Array
-        * @return Array
-        */
-       abstract public function getFileProps( array $params );
-
-       /**
-        * Stream the file at a storage path in the backend.
-        * If the file does not exists, a 404 error will be given.
-        * Appropriate HTTP headers (Status, Content-Type, Content-Length)
-        * must be sent if streaming began, while none should be sent otherwise.
-        * Implementations should flush the output buffer before sending data.
-        *
-        * $params include:
-        *     src     : source storage path
-        *     headers : additional HTTP headers to send on success
-        *     latest  : use the latest available data
-        *
-        * @param $params Array
-        * @return Status
-        */
-       abstract public function streamFile( array $params );
-
-       /**
-        * Returns a file system file, identical to the file at a storage path.
-        * The file returned is either:
-        * a) A local copy of the file at a storage path in the backend.
-        *    The temporary copy will have the same extension as the source.
-        * b) An original of the file at a storage path in the backend.
-        * Temporary files may be purged when the file object falls out of scope.
-        *
-        * Write operations should *never* be done on this file as some backends
-        * may do internal tracking or may be instances of FileBackendMultiWrite.
-        * In that later case, there are copies of the file that must stay in sync.
-        * Additionally, further calls to this function may return the same file.
-        *
-        * $params include:
-        *     src    : source storage path
-        *     latest : use the latest available data
-        *
-        * @param $params Array
-        * @return FSFile|null Returns null on failure
-        */
-       abstract public function getLocalReference( array $params );
-
-       /**
-        * Get a local copy on disk of the file at a storage path in the backend.
-        * The temporary copy will have the same file extension as the source.
-        * Temporary files may be purged when the file object falls out of scope.
-        *
-        * $params include:
-        *     src    : source storage path
-        *     latest : use the latest available data
-        *
-        * @param $params Array
-        * @return TempFSFile|null Returns null on failure
-        */
-       abstract public function getLocalCopy( array $params );
-
-       /**
-        * Check if a directory exists at a given storage path.
-        * Backends using key/value stores will check if the path is a
-        * virtual directory, meaning there are files under the given directory.
-        *
-        * Storage backends with eventual consistency might return stale data.
-        *
-        * $params include:
-        *     dir : storage directory
-        *
-        * @param $params array
-        * @return bool|null Returns null on failure
-        * @since 1.20
-        */
-       abstract public function directoryExists( array $params );
-
-       /**
-        * Get an iterator to list *all* directories under a storage directory.
-        * If the directory is of the form "mwstore://backend/container",
-        * then all directories in the container should be listed.
-        * If the directory is of form "mwstore://backend/container/dir",
-        * then all directories directly under that directory should be listed.
-        * Results should be storage directories relative to the given directory.
-        *
-        * Storage backends with eventual consistency might return stale data.
-        *
-        * $params include:
-        *     dir     : storage directory
-        *     topOnly : only return direct child dirs of the directory
-        *
-        * @param $params array
-        * @return Traversable|Array|null Returns null on failure
-        * @since 1.20
-        */
-       abstract public function getDirectoryList( array $params );
-
-       /**
-        * Same as FileBackend::getDirectoryList() except only lists
-        * directories that are immediately under the given directory.
-        *
-        * Storage backends with eventual consistency might return stale data.
-        *
-        * $params include:
-        *     dir : storage directory
-        *
-        * @param $params array
-        * @return Traversable|Array|null Returns null on failure
-        * @since 1.20
-        */
-       final public function getTopDirectoryList( array $params ) {
-               return $this->getDirectoryList( array( 'topOnly' => true ) + $params );
-       }
-
-       /**
-        * Get an iterator to list *all* stored files under a storage directory.
-        * If the directory is of the form "mwstore://backend/container",
-        * then all files in the container should be listed.
-        * If the directory is of form "mwstore://backend/container/dir",
-        * then all files under that directory should be listed.
-        * Results should be storage paths relative to the given directory.
-        *
-        * Storage backends with eventual consistency might return stale data.
-        *
-        * $params include:
-        *     dir     : storage directory
-        *     topOnly : only return direct child files of the directory (@since 1.20)
-        *
-        * @param $params array
-        * @return Traversable|Array|null Returns null on failure
-        */
-       abstract public function getFileList( array $params );
-
-       /**
-        * Same as FileBackend::getFileList() except only lists
-        * files that are immediately under the given directory.
-        *
-        * Storage backends with eventual consistency might return stale data.
-        *
-        * $params include:
-        *     dir : storage directory
-        *
-        * @param $params array
-        * @return Traversable|Array|null Returns null on failure
-        * @since 1.20
-        */
-       final public function getTopFileList( array $params ) {
-               return $this->getFileList( array( 'topOnly' => true ) + $params );
-       }
-
-       /**
-        * Invalidate any in-process file existence and property cache.
-        * If $paths is given, then only the cache for those files will be cleared.
-        *
-        * @param $paths Array Storage paths (optional)
-        * @return void
-        */
-       public function clearCache( array $paths = null ) {}
-
-       /**
-        * Lock the files at the given storage paths in the backend.
-        * This will either lock all the files or none (on failure).
-        *
-        * Callers should consider using getScopedFileLocks() instead.
-        *
-        * @param $paths Array Storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @return Status
-        */
-       final public function lockFiles( array $paths, $type ) {
-               return $this->lockManager->lock( $paths, $type );
-       }
-
-       /**
-        * Unlock the files at the given storage paths in the backend.
-        *
-        * @param $paths Array Storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @return Status
-        */
-       final public function unlockFiles( array $paths, $type ) {
-               return $this->lockManager->unlock( $paths, $type );
-       }
-
-       /**
-        * Lock the files at the given storage paths in the backend.
-        * This will either lock all the files or none (on failure).
-        * On failure, the status object will be updated with errors.
-        *
-        * Once the return value goes out scope, the locks will be released and
-        * the status updated. Unlock fatals will not change the status "OK" value.
-        *
-        * @param $paths Array Storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @param $status Status Status to update on lock/unlock
-        * @return ScopedLock|null Returns null on failure
-        */
-       final public function getScopedFileLocks( array $paths, $type, Status $status ) {
-               return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
-       }
-
-       /**
-        * Get an array of scoped locks needed for a batch of file operations.
-        *
-        * Normally, FileBackend::doOperations() handles locking, unless
-        * the 'nonLocking' param is passed in. This function is useful if you
-        * want the files to be locked for a broader scope than just when the
-        * files are changing. For example, if you need to update DB metadata,
-        * you may want to keep the files locked until finished.
-        *
-        * @see FileBackend::doOperations()
-        *
-        * @param $ops Array List of file operations to FileBackend::doOperations()
-        * @param $status Status Status to update on lock/unlock
-        * @return Array List of ScopedFileLocks or null values
-        * @since 1.20
-        */
-       abstract public function getScopedLocksForOps( array $ops, Status $status );
-
-       /**
-        * Get the root storage path of this backend.
-        * All container paths are "subdirectories" of this path.
-        *
-        * @return string Storage path
-        * @since 1.20
-        */
-       final public function getRootStoragePath() {
-               return "mwstore://{$this->name}";
-       }
-
-       /**
-        * Get the file journal object for this backend
-        *
-        * @return FileJournal
-        */
-       final public function getJournal() {
-               return $this->fileJournal;
-       }
-
-       /**
-        * Check if a given path is a "mwstore://" path.
-        * This does not do any further validation or any existence checks.
-        *
-        * @param $path string
-        * @return bool
-        */
-       final public static function isStoragePath( $path ) {
-               return ( strpos( $path, 'mwstore://' ) === 0 );
-       }
-
-       /**
-        * Split a storage path into a backend name, a container name,
-        * and a relative file path. The relative path may be the empty string.
-        * This does not do any path normalization or traversal checks.
-        *
-        * @param $storagePath string
-        * @return Array (backend, container, rel object) or (null, null, null)
-        */
-       final public static function splitStoragePath( $storagePath ) {
-               if ( self::isStoragePath( $storagePath ) ) {
-                       // Remove the "mwstore://" prefix and split the path
-                       $parts = explode( '/', substr( $storagePath, 10 ), 3 );
-                       if ( count( $parts ) >= 2 && $parts[0] != '' && $parts[1] != '' ) {
-                               if ( count( $parts ) == 3 ) {
-                                       return $parts; // e.g. "backend/container/path"
-                               } else {
-                                       return array( $parts[0], $parts[1], '' ); // e.g. "backend/container"
-                               }
-                       }
-               }
-               return array( null, null, null );
-       }
-
-       /**
-        * Normalize a storage path by cleaning up directory separators.
-        * Returns null if the path is not of the format of a valid storage path.
-        *
-        * @param $storagePath string
-        * @return string|null
-        */
-       final public static function normalizeStoragePath( $storagePath ) {
-               list( $backend, $container, $relPath ) = self::splitStoragePath( $storagePath );
-               if ( $relPath !== null ) { // must be for this backend
-                       $relPath = self::normalizeContainerPath( $relPath );
-                       if ( $relPath !== null ) {
-                               return ( $relPath != '' )
-                                       ? "mwstore://{$backend}/{$container}/{$relPath}"
-                                       : "mwstore://{$backend}/{$container}";
-                       }
-               }
-               return null;
-       }
-
-       /**
-        * Get the parent storage directory of a storage path.
-        * This returns a path like "mwstore://backend/container",
-        * "mwstore://backend/container/...", or null if there is no parent.
-        *
-        * @param $storagePath string
-        * @return string|null
-        */
-       final public static function parentStoragePath( $storagePath ) {
-               $storagePath = dirname( $storagePath );
-               list( $b, $cont, $rel ) = self::splitStoragePath( $storagePath );
-               return ( $rel === null ) ? null : $storagePath;
-       }
-
-       /**
-        * Get the final extension from a storage or FS path
-        *
-        * @param $path string
-        * @return string
-        */
-       final public static function extensionFromPath( $path ) {
-               $i = strrpos( $path, '.' );
-               return strtolower( $i ? substr( $path, $i + 1 ) : '' );
-       }
-
-       /**
-        * Check if a relative path has no directory traversals
-        *
-        * @param $path string
-        * @return bool
-        * @since 1.20
-        */
-       final public static function isPathTraversalFree( $path ) {
-               return ( self::normalizeContainerPath( $path ) !== null );
-       }
-
-       /**
-        * Validate and normalize a relative storage path.
-        * Null is returned if the path involves directory traversal.
-        * Traversal is insecure for FS backends and broken for others.
-        *
-        * This uses the same traversal protection as Title::secureAndSplit().
-        *
-        * @param $path string Storage path relative to a container
-        * @return string|null
-        */
-       final protected static function normalizeContainerPath( $path ) {
-               // Normalize directory separators
-               $path = strtr( $path, '\\', '/' );
-               // Collapse any consecutive directory separators
-               $path = preg_replace( '![/]{2,}!', '/', $path );
-               // Remove any leading directory separator
-               $path = ltrim( $path, '/' );
-               // Use the same traversal protection as Title::secureAndSplit()
-               if ( strpos( $path, '.' ) !== false ) {
-                       if (
-                               $path === '.' ||
-                               $path === '..' ||
-                               strpos( $path, './' ) === 0 ||
-                               strpos( $path, '../' ) === 0 ||
-                               strpos( $path, '/./' ) !== false ||
-                               strpos( $path, '/../' ) !== false
-                       ) {
-                               return null;
-                       }
-               }
-               return $path;
-       }
-}
diff --git a/includes/filerepo/backend/FileBackendGroup.php b/includes/filerepo/backend/FileBackendGroup.php
deleted file mode 100644 (file)
index 8bbc96d..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-/**
- * File backend registration handling.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle file backend registration
- *
- * @ingroup FileBackend
- * @since 1.19
- */
-class FileBackendGroup {
-       /**
-        * @var FileBackendGroup
-        */
-       protected static $instance = null;
-
-       /** @var Array (name => ('class' => string, 'config' => array, 'instance' => object)) */
-       protected $backends = array();
-
-       protected function __construct() {}
-
-       /**
-        * @return FileBackendGroup
-        */
-       public static function singleton() {
-               if ( self::$instance == null ) {
-                       self::$instance = new self();
-                       self::$instance->initFromGlobals();
-               }
-               return self::$instance;
-       }
-
-       /**
-        * Destroy the singleton instance
-        *
-        * @return void
-        */
-       public static function destroySingleton() {
-               self::$instance = null;
-       }
-
-       /**
-        * Register file backends from the global variables
-        *
-        * @return void
-        */
-       protected function initFromGlobals() {
-               global $wgLocalFileRepo, $wgForeignFileRepos, $wgFileBackends;
-
-               // Register explicitly defined backends
-               $this->register( $wgFileBackends );
-
-               $autoBackends = array();
-               // Automatically create b/c backends for file repos...
-               $repos = array_merge( $wgForeignFileRepos, array( $wgLocalFileRepo ) );
-               foreach ( $repos as $info ) {
-                       $backendName = $info['backend'];
-                       if ( is_object( $backendName ) || isset( $this->backends[$backendName] ) ) {
-                               continue; // already defined (or set to the object for some reason)
-                       }
-                       $repoName = $info['name'];
-                       // Local vars that used to be FSRepo members...
-                       $directory = $info['directory'];
-                       $deletedDir = isset( $info['deletedDir'] )
-                               ? $info['deletedDir']
-                               : false; // deletion disabled
-                       $thumbDir = isset( $info['thumbDir'] )
-                               ? $info['thumbDir']
-                               : "{$directory}/thumb";
-                       $fileMode = isset( $info['fileMode'] )
-                               ? $info['fileMode']
-                               : 0644;
-                       // Get the FS backend configuration
-                       $autoBackends[] = array(
-                               'name'           => $backendName,
-                               'class'          => 'FSFileBackend',
-                               'lockManager'    => 'fsLockManager',
-                               'containerPaths' => array(
-                                       "{$repoName}-public"  => "{$directory}",
-                                       "{$repoName}-thumb"   => $thumbDir,
-                                       "{$repoName}-deleted" => $deletedDir,
-                                       "{$repoName}-temp"    => "{$directory}/temp"
-                               ),
-                               'fileMode'       => $fileMode,
-                       );
-               }
-
-               // Register implicitly defined backends
-               $this->register( $autoBackends );
-       }
-
-       /**
-        * Register an array of file backend configurations
-        *
-        * @param $configs Array
-        * @return void
-        * @throws MWException
-        */
-       protected function register( array $configs ) {
-               foreach ( $configs as $config ) {
-                       if ( !isset( $config['name'] ) ) {
-                               throw new MWException( "Cannot register a backend with no name." );
-                       }
-                       $name = $config['name'];
-                       if ( !isset( $config['class'] ) ) {
-                               throw new MWException( "Cannot register backend `{$name}` with no class." );
-                       }
-                       $class = $config['class'];
-
-                       unset( $config['class'] ); // backend won't need this
-                       $this->backends[$name] = array(
-                               'class'    => $class,
-                               'config'   => $config,
-                               'instance' => null
-                       );
-               }
-       }
-
-       /**
-        * Get the backend object with a given name
-        *
-        * @param $name string
-        * @return FileBackend
-        * @throws MWException
-        */
-       public function get( $name ) {
-               if ( !isset( $this->backends[$name] ) ) {
-                       throw new MWException( "No backend defined with the name `$name`." );
-               }
-               // Lazy-load the actual backend instance
-               if ( !isset( $this->backends[$name]['instance'] ) ) {
-                       $class = $this->backends[$name]['class'];
-                       $config = $this->backends[$name]['config'];
-                       $this->backends[$name]['instance'] = new $class( $config );
-               }
-               return $this->backends[$name]['instance'];
-       }
-
-       /**
-        * Get the config array for a backend object with a given name
-        *
-        * @param $name string
-        * @return Array
-        * @throws MWException
-        */
-       public function config( $name ) {
-               if ( !isset( $this->backends[$name] ) ) {
-                       throw new MWException( "No backend defined with the name `$name`." );
-               }
-               $class = $this->backends[$name]['class'];
-               return array( 'class' => $class ) + $this->backends[$name]['config'];
-       }
-
-       /**
-        * Get an appropriate backend object from a storage path
-        *
-        * @param $storagePath string
-        * @return FileBackend|null Backend or null on failure
-        */
-       public function backendFromPath( $storagePath ) {
-               list( $backend, $c, $p ) = FileBackend::splitStoragePath( $storagePath );
-               if ( $backend !== null && isset( $this->backends[$backend] ) ) {
-                       return $this->get( $backend );
-               }
-               return null;
-       }
-}
diff --git a/includes/filerepo/backend/FileBackendMultiWrite.php b/includes/filerepo/backend/FileBackendMultiWrite.php
deleted file mode 100644 (file)
index efc6053..0000000
+++ /dev/null
@@ -1,525 +0,0 @@
-<?php
-/**
- * Proxy backend that mirrors writes to several internal backends.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- * @author Aaron Schulz
- */
-
-/**
- * @brief Proxy backend that mirrors writes to several internal backends.
- *
- * This class defines a multi-write backend. Multiple backends can be
- * registered to this proxy backend and it will act as a single backend.
- * Use this when all access to those backends is through this proxy backend.
- * At least one of the backends must be declared the "master" backend.
- *
- * Only use this class when transitioning from one storage system to another.
- *
- * Read operations are only done on the 'master' backend for consistency.
- * Write operations are performed on all backends, in the order defined.
- * If an operation fails on one backend it will be rolled back from the others.
- *
- * @ingroup FileBackend
- * @since 1.19
- */
-class FileBackendMultiWrite extends FileBackend {
-       /** @var Array Prioritized list of FileBackendStore objects */
-       protected $backends = array(); // array of (backend index => backends)
-       protected $masterIndex = -1; // integer; index of master backend
-       protected $syncChecks = 0; // integer bitfield
-
-       /* Possible internal backend consistency checks */
-       const CHECK_SIZE = 1;
-       const CHECK_TIME = 2;
-
-       /**
-        * Construct a proxy backend that consists of several internal backends.
-        * Additional $config params include:
-        *     'backends'    : Array of backend config and multi-backend settings.
-        *                     Each value is the config used in the constructor of a
-        *                     FileBackendStore class, but with these additional settings:
-        *                         'class'         : The name of the backend class
-        *                         'isMultiMaster' : This must be set for one backend.
-        *                         'template:      : If given a backend name, this will use
-        *                                           the config of that backend as a template.
-        *                                           Values specified here take precedence.
-        *     'syncChecks'  : Integer bitfield of internal backend sync checks to perform.
-        *                     Possible bits include self::CHECK_SIZE and self::CHECK_TIME.
-        *                     The checks are done before allowing any file operations.
-        * @param $config Array
-        */
-       public function __construct( array $config ) {
-               parent::__construct( $config );
-               $namesUsed = array();
-               // Construct backends here rather than via registration
-               // to keep these backends hidden from outside the proxy.
-               foreach ( $config['backends'] as $index => $config ) {
-                       if ( isset( $config['template'] ) ) {
-                               // Config is just a modified version of a registered backend's.
-                               // This should only be used when that config is used only be this backend.
-                               $config = $config + FileBackendGroup::singleton()->config( $config['template'] );
-                       }
-                       $name = $config['name'];
-                       if ( isset( $namesUsed[$name] ) ) { // don't break FileOp predicates
-                               throw new MWException( "Two or more backends defined with the name $name." );
-                       }
-                       $namesUsed[$name] = 1;
-                       if ( !isset( $config['class'] ) ) {
-                               throw new MWException( 'No class given for a backend config.' );
-                       }
-                       $class = $config['class'];
-                       $this->backends[$index] = new $class( $config );
-                       if ( !empty( $config['isMultiMaster'] ) ) {
-                               if ( $this->masterIndex >= 0 ) {
-                                       throw new MWException( 'More than one master backend defined.' );
-                               }
-                               $this->masterIndex = $index;
-                       }
-               }
-               if ( $this->masterIndex < 0 ) { // need backends and must have a master
-                       throw new MWException( 'No master backend defined.' );
-               }
-               $this->syncChecks = isset( $config['syncChecks'] )
-                       ? $config['syncChecks']
-                       : self::CHECK_SIZE;
-       }
-
-       /**
-        * @see FileBackend::doOperationsInternal()
-        * @return Status
-        */
-       final protected function doOperationsInternal( array $ops, array $opts ) {
-               $status = Status::newGood();
-
-               $performOps = array(); // list of FileOp objects
-               $paths = array(); // storage paths read from or written to
-               // Build up a list of FileOps. The list will have all the ops
-               // for one backend, then all the ops for the next, and so on.
-               // These batches of ops are all part of a continuous array.
-               // Also build up a list of files read/changed...
-               foreach ( $this->backends as $index => $backend ) {
-                       $backendOps = $this->substOpBatchPaths( $ops, $backend );
-                       // Add on the operation batch for this backend
-                       $performOps = array_merge( $performOps,
-                               $backend->getOperationsInternal( $backendOps ) );
-                       if ( $index == 0 ) { // first batch
-                               // Get the files used for these operations. Each backend has a batch of
-                               // the same operations, so we only need to get them from the first batch.
-                               $paths = $backend->getPathsToLockForOpsInternal( $performOps );
-                               // Get the paths under the proxy backend's name
-                               $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
-                               $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
-                       }
-               }
-
-               // Try to lock those files for the scope of this function...
-               if ( empty( $opts['nonLocking'] ) ) {
-                       // Try to lock those files for the scope of this function...
-                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
-                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
-                       if ( !$status->isOK() ) {
-                               return $status; // abort
-                       }
-               }
-
-               // Clear any cache entries (after locks acquired)
-               $this->clearCache();
-
-               // Do a consistency check to see if the backends agree
-               if ( count( $this->backends ) > 1 ) {
-                       $status->merge( $this->consistencyCheck( array_merge( $paths['sh'], $paths['ex'] ) ) );
-                       if ( !$status->isOK() ) {
-                               return $status; // abort
-                       }
-               }
-
-               // Actually attempt the operation batch...
-               $subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
-
-               $success = array();
-               $failCount = 0;
-               $successCount = 0;
-               // Make 'success', 'successCount', and 'failCount' fields reflect
-               // the overall operation, rather than all the batches for each backend.
-               // Do this by only using success values from the master backend's batch.
-               $batchStart = $this->masterIndex * count( $ops );
-               $batchEnd = $batchStart + count( $ops ) - 1;
-               for ( $i = $batchStart; $i <= $batchEnd; $i++ ) {
-                       if ( !isset( $subStatus->success[$i] ) ) {
-                               break; // failed out before trying this op
-                       } elseif ( $subStatus->success[$i] ) {
-                               ++$successCount;
-                       } else {
-                               ++$failCount;
-                       }
-                       $success[] = $subStatus->success[$i];
-               }
-               $subStatus->success = $success;
-               $subStatus->successCount = $successCount;
-               $subStatus->failCount = $failCount;
-
-               // Merge errors into status fields
-               $status->merge( $subStatus );
-               $status->success = $subStatus->success; // not done in merge()
-
-               return $status;
-       }
-
-       /**
-        * Check that a set of files are consistent across all internal backends
-        *
-        * @param $paths Array
-        * @return Status
-        */
-       public function consistencyCheck( array $paths ) {
-               $status = Status::newGood();
-               if ( $this->syncChecks == 0 ) {
-                       return $status; // skip checks
-               }
-
-               $mBackend = $this->backends[$this->masterIndex];
-               foreach ( array_unique( $paths ) as $path ) {
-                       $params = array( 'src' => $path, 'latest' => true );
-                       // Stat the file on the 'master' backend
-                       $mStat = $mBackend->getFileStat( $this->substOpPaths( $params, $mBackend ) );
-                       // Check of all clone backends agree with the master...
-                       foreach ( $this->backends as $index => $cBackend ) {
-                               if ( $index === $this->masterIndex ) {
-                                       continue; // master
-                               }
-                               $cStat = $cBackend->getFileStat( $this->substOpPaths( $params, $cBackend ) );
-                               if ( $mStat ) { // file is in master
-                                       if ( !$cStat ) { // file should exist
-                                               $status->fatal( 'backend-fail-synced', $path );
-                                               continue;
-                                       }
-                                       if ( $this->syncChecks & self::CHECK_SIZE ) {
-                                               if ( $cStat['size'] != $mStat['size'] ) { // wrong size
-                                                       $status->fatal( 'backend-fail-synced', $path );
-                                                       continue;
-                                               }
-                                       }
-                                       if ( $this->syncChecks & self::CHECK_TIME ) {
-                                               $mTs = wfTimestamp( TS_UNIX, $mStat['mtime'] );
-                                               $cTs = wfTimestamp( TS_UNIX, $cStat['mtime'] );
-                                               if ( abs( $mTs - $cTs ) > 30 ) { // outdated file somewhere
-                                                       $status->fatal( 'backend-fail-synced', $path );
-                                                       continue;
-                                               }
-                                       }
-                               } else { // file is not in master
-                                       if ( $cStat ) { // file should not exist
-                                               $status->fatal( 'backend-fail-synced', $path );
-                                       }
-                               }
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * Substitute the backend name in storage path parameters
-        * for a set of operations with that of a given internal backend.
-        *
-        * @param $ops Array List of file operation arrays
-        * @param $backend FileBackendStore
-        * @return Array
-        */
-       protected function substOpBatchPaths( array $ops, FileBackendStore $backend ) {
-               $newOps = array(); // operations
-               foreach ( $ops as $op ) {
-                       $newOp = $op; // operation
-                       foreach ( array( 'src', 'srcs', 'dst', 'dir' ) as $par ) {
-                               if ( isset( $newOp[$par] ) ) { // string or array
-                                       $newOp[$par] = $this->substPaths( $newOp[$par], $backend );
-                               }
-                       }
-                       $newOps[] = $newOp;
-               }
-               return $newOps;
-       }
-
-       /**
-        * Same as substOpBatchPaths() but for a single operation
-        *
-        * @param $ops array File operation array
-        * @param $backend FileBackendStore
-        * @return Array
-        */
-       protected function substOpPaths( array $ops, FileBackendStore $backend ) {
-               $newOps = $this->substOpBatchPaths( array( $ops ), $backend );
-               return $newOps[0];
-       }
-
-       /**
-        * Substitute the backend of storage paths with an internal backend's name
-        *
-        * @param $paths Array|string List of paths or single string path
-        * @param $backend FileBackendStore
-        * @return Array|string
-        */
-       protected function substPaths( $paths, FileBackendStore $backend ) {
-               return preg_replace(
-                       '!^mwstore://' . preg_quote( $this->name ) . '/!',
-                       StringUtils::escapeRegexReplacement( "mwstore://{$backend->getName()}/" ),
-                       $paths // string or array
-               );
-       }
-
-       /**
-        * Substitute the backend of internal storage paths with the proxy backend's name
-        *
-        * @param $paths Array|string List of paths or single string path
-        * @return Array|string
-        */
-       protected function unsubstPaths( $paths ) {
-               return preg_replace(
-                       '!^mwstore://([^/]+)!',
-                       StringUtils::escapeRegexReplacement( "mwstore://{$this->name}" ),
-                       $paths // string or array
-               );
-       }
-
-       /**
-        * @see FileBackend::doQuickOperationsInternal()
-        * @return Status
-        */
-       public function doQuickOperationsInternal( array $ops ) {
-               // Do the operations on the master backend; setting Status fields...
-               $realOps = $this->substOpBatchPaths( $ops, $this->backends[$this->masterIndex] );
-               $status = $this->backends[$this->masterIndex]->doQuickOperations( $realOps );
-               // Propagate the operations to the clone backends...
-               foreach ( $this->backends as $index => $backend ) {
-                       if ( $index !== $this->masterIndex ) { // not done already
-                               $realOps = $this->substOpBatchPaths( $ops, $backend );
-                               $status->merge( $backend->doQuickOperations( $realOps ) );
-                       }
-               }
-               return $status;
-       }
-
-       /**
-        * @see FileBackend::doPrepare()
-        * @return Status
-        */
-       protected function doPrepare( array $params ) {
-               $status = Status::newGood();
-               foreach ( $this->backends as $backend ) {
-                       $realParams = $this->substOpPaths( $params, $backend );
-                       $status->merge( $backend->doPrepare( $realParams ) );
-               }
-               return $status;
-       }
-
-       /**
-        * @see FileBackend::doSecure()
-        * @param $params array
-        * @return Status
-        */
-       protected function doSecure( array $params ) {
-               $status = Status::newGood();
-               foreach ( $this->backends as $backend ) {
-                       $realParams = $this->substOpPaths( $params, $backend );
-                       $status->merge( $backend->doSecure( $realParams ) );
-               }
-               return $status;
-       }
-
-       /**
-        * @see FileBackend::doClean()
-        * @param $params array
-        * @return Status
-        */
-       protected function doClean( array $params ) {
-               $status = Status::newGood();
-               foreach ( $this->backends as $backend ) {
-                       $realParams = $this->substOpPaths( $params, $backend );
-                       $status->merge( $backend->doClean( $realParams ) );
-               }
-               return $status;
-       }
-
-       /**
-        * @see FileBackend::concatenate()
-        * @param $params array
-        * @return Status
-        */
-       public function concatenate( array $params ) {
-               // We are writing to an FS file, so we don't need to do this per-backend
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->concatenate( $realParams );
-       }
-
-       /**
-        * @see FileBackend::fileExists()
-        * @param $params array
-        */
-       public function fileExists( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->fileExists( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getFileTimestamp()
-        * @param $params array
-        * @return bool|string
-        */
-       public function getFileTimestamp( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getFileTimestamp( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getFileSize()
-        * @param $params array
-        * @return bool|int
-        */
-       public function getFileSize( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getFileSize( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getFileStat()
-        * @param $params array
-        * @return Array|bool|null
-        */
-       public function getFileStat( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getFileStat( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getFileContents()
-        * @param $params array
-        * @return bool|string
-        */
-       public function getFileContents( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getFileContents( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getFileSha1Base36()
-        * @param $params array
-        * @return bool|string
-        */
-       public function getFileSha1Base36( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getFileSha1Base36( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getFileProps()
-        * @param $params array
-        * @return Array
-        */
-       public function getFileProps( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getFileProps( $realParams );
-       }
-
-       /**
-        * @see FileBackend::streamFile()
-        * @param $params array
-        * @return \Status
-        */
-       public function streamFile( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->streamFile( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getLocalReference()
-        * @param $params array
-        * @return FSFile|null
-        */
-       public function getLocalReference( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getLocalReference( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getLocalCopy()
-        * @param $params array
-        * @return null|TempFSFile
-        */
-       public function getLocalCopy( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getLocalCopy( $realParams );
-       }
-
-       /**
-        * @see FileBackend::directoryExists()
-        * @param $params array
-        * @return bool|null
-        */
-       public function directoryExists( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->directoryExists( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getSubdirectoryList()
-        * @param $params array
-        * @return Array|null|Traversable
-        */
-       public function getDirectoryList( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getDirectoryList( $realParams );
-       }
-
-       /**
-        * @see FileBackend::getFileList()
-        * @param $params array
-        * @return Array|null|\Traversable
-        */
-       public function getFileList( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getFileList( $realParams );
-       }
-
-       /**
-        * @see FileBackend::clearCache()
-        */
-       public function clearCache( array $paths = null ) {
-               foreach ( $this->backends as $backend ) {
-                       $realPaths = is_array( $paths ) ? $this->substPaths( $paths, $backend ) : null;
-                       $backend->clearCache( $realPaths );
-               }
-       }
-
-       /**
-        * @see FileBackend::getScopedLocksForOps()
-        */
-       public function getScopedLocksForOps( array $ops, Status $status ) {
-               $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $ops );
-               // Get the paths to lock from the master backend
-               $paths = $this->backends[$this->masterIndex]->getPathsToLockForOpsInternal( $fileOps );
-               // Get the paths under the proxy backend's name
-               $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
-               $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
-               return array(
-                       $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
-                       $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
-               );
-       }
-}
diff --git a/includes/filerepo/backend/FileBackendStore.php b/includes/filerepo/backend/FileBackendStore.php
deleted file mode 100644 (file)
index f2860f3..0000000
+++ /dev/null
@@ -1,1748 +0,0 @@
-<?php
-/**
- * Base class for all backends using particular storage medium.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- * @author Aaron Schulz
- */
-
-/**
- * @brief Base class for all backends using particular storage medium.
- *
- * This class defines the methods as abstract that subclasses must implement.
- * Outside callers should *not* use functions with "Internal" in the name.
- *
- * The FileBackend operations are implemented using basic functions
- * such as storeInternal(), copyInternal(), deleteInternal() and the like.
- * This class is also responsible for path resolution and sanitization.
- *
- * @ingroup FileBackend
- * @since 1.19
- */
-abstract class FileBackendStore extends FileBackend {
-       /** @var BagOStuff */
-       protected $memCache;
-
-       /** @var Array Map of paths to small (RAM/disk) cache items */
-       protected $cache = array(); // (storage path => key => value)
-       protected $maxCacheSize = 300; // integer; max paths with entries
-       /** @var Array Map of paths to large (RAM/disk) cache items */
-       protected $expensiveCache = array(); // (storage path => key => value)
-       protected $maxExpensiveCacheSize = 5; // integer; max paths with entries
-
-       /** @var Array Map of container names to sharding settings */
-       protected $shardViaHashLevels = array(); // (container name => config array)
-
-       protected $maxFileSize = 4294967296; // integer bytes (4GiB)
-
-       /**
-        * @see FileBackend::__construct()
-        *
-        * @param $config Array
-        */
-       public function __construct( array $config ) {
-               parent::__construct( $config );
-               $this->memCache = new EmptyBagOStuff(); // disabled by default
-       }
-
-       /**
-        * Get the maximum allowable file size given backend
-        * medium restrictions and basic performance constraints.
-        * Do not call this function from places outside FileBackend and FileOp.
-        *
-        * @return integer Bytes
-        */
-       final public function maxFileSizeInternal() {
-               return $this->maxFileSize;
-       }
-
-       /**
-        * Check if a file can be created at a given storage path.
-        * FS backends should check if the parent directory exists and the file is writable.
-        * Backends using key/value stores should check if the container exists.
-        *
-        * @param $storagePath string
-        * @return bool
-        */
-       abstract public function isPathUsableInternal( $storagePath );
-
-       /**
-        * Create a file in the backend with the given contents.
-        * Do not call this function from places outside FileBackend and FileOp.
-        *
-        * $params include:
-        *     content       : the raw file contents
-        *     dst           : destination storage path
-        *     overwrite     : overwrite any file that exists at the destination
-        *     async         : Status will be returned immediately if supported.
-        *                     If the status is OK, then its value field will be
-        *                     set to a FileBackendStoreOpHandle object.
-        *
-        * @param $params Array
-        * @return Status
-        */
-       final public function createInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               if ( strlen( $params['content'] ) > $this->maxFileSizeInternal() ) {
-                       $status = Status::newFatal( 'backend-fail-maxsize',
-                               $params['dst'], $this->maxFileSizeInternal() );
-               } else {
-                       $status = $this->doCreateInternal( $params );
-                       $this->clearCache( array( $params['dst'] ) );
-                       $this->deleteFileCache( $params['dst'] ); // persistent cache
-               }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::createInternal()
-        */
-       abstract protected function doCreateInternal( array $params );
-
-       /**
-        * Store a file into the backend from a file on disk.
-        * Do not call this function from places outside FileBackend and FileOp.
-        *
-        * $params include:
-        *     src           : source path on disk
-        *     dst           : destination storage path
-        *     overwrite     : overwrite any file that exists at the destination
-        *     async         : Status will be returned immediately if supported.
-        *                     If the status is OK, then its value field will be
-        *                     set to a FileBackendStoreOpHandle object.
-        *
-        * @param $params Array
-        * @return Status
-        */
-       final public function storeInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               if ( filesize( $params['src'] ) > $this->maxFileSizeInternal() ) {
-                       $status = Status::newFatal( 'backend-fail-maxsize',
-                               $params['dst'], $this->maxFileSizeInternal() );
-               } else {
-                       $status = $this->doStoreInternal( $params );
-                       $this->clearCache( array( $params['dst'] ) );
-                       $this->deleteFileCache( $params['dst'] ); // persistent cache
-               }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::storeInternal()
-        */
-       abstract protected function doStoreInternal( array $params );
-
-       /**
-        * Copy a file from one storage path to another in the backend.
-        * Do not call this function from places outside FileBackend and FileOp.
-        *
-        * $params include:
-        *     src           : source storage path
-        *     dst           : destination storage path
-        *     overwrite     : overwrite any file that exists at the destination
-        *     async         : Status will be returned immediately if supported.
-        *                     If the status is OK, then its value field will be
-        *                     set to a FileBackendStoreOpHandle object.
-        *
-        * @param $params Array
-        * @return Status
-        */
-       final public function copyInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = $this->doCopyInternal( $params );
-               $this->clearCache( array( $params['dst'] ) );
-               $this->deleteFileCache( $params['dst'] ); // persistent cache
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::copyInternal()
-        */
-       abstract protected function doCopyInternal( array $params );
-
-       /**
-        * Delete a file at the storage path.
-        * Do not call this function from places outside FileBackend and FileOp.
-        *
-        * $params include:
-        *     src                 : source storage path
-        *     ignoreMissingSource : do nothing if the source file does not exist
-        *     async               : Status will be returned immediately if supported.
-        *                           If the status is OK, then its value field will be
-        *                           set to a FileBackendStoreOpHandle object.
-        *
-        * @param $params Array
-        * @return Status
-        */
-       final public function deleteInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = $this->doDeleteInternal( $params );
-               $this->clearCache( array( $params['src'] ) );
-               $this->deleteFileCache( $params['src'] ); // persistent cache
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::deleteInternal()
-        */
-       abstract protected function doDeleteInternal( array $params );
-
-       /**
-        * Move a file from one storage path to another in the backend.
-        * Do not call this function from places outside FileBackend and FileOp.
-        *
-        * $params include:
-        *     src           : source storage path
-        *     dst           : destination storage path
-        *     overwrite     : overwrite any file that exists at the destination
-        *     async         : Status will be returned immediately if supported.
-        *                     If the status is OK, then its value field will be
-        *                     set to a FileBackendStoreOpHandle object.
-        *
-        * @param $params Array
-        * @return Status
-        */
-       final public function moveInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = $this->doMoveInternal( $params );
-               $this->clearCache( array( $params['src'], $params['dst'] ) );
-               $this->deleteFileCache( $params['src'] ); // persistent cache
-               $this->deleteFileCache( $params['dst'] ); // persistent cache
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::moveInternal()
-        * @return Status
-        */
-       protected function doMoveInternal( array $params ) {
-               unset( $params['async'] ); // two steps, won't work here :)
-               // Copy source to dest
-               $status = $this->copyInternal( $params );
-               if ( $status->isOK() ) {
-                       // Delete source (only fails due to races or medium going down)
-                       $status->merge( $this->deleteInternal( array( 'src' => $params['src'] ) ) );
-                       $status->setResult( true, $status->value ); // ignore delete() errors
-               }
-               return $status;
-       }
-
-       /**
-        * No-op file operation that does nothing.
-        * Do not call this function from places outside FileBackend and FileOp.
-        *
-        * @param $params Array
-        * @return Status
-        */
-       final public function nullInternal( array $params ) {
-               return Status::newGood();
-       }
-
-       /**
-        * @see FileBackend::concatenate()
-        * @return Status
-        */
-       final public function concatenate( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = Status::newGood();
-
-               // Try to lock the source files for the scope of this function
-               $scopeLockS = $this->getScopedFileLocks( $params['srcs'], LockManager::LOCK_UW, $status );
-               if ( $status->isOK() ) {
-                       // Actually do the concatenation
-                       $status->merge( $this->doConcatenate( $params ) );
-               }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::concatenate()
-        * @return Status
-        */
-       protected function doConcatenate( array $params ) {
-               $status = Status::newGood();
-               $tmpPath = $params['dst']; // convenience
-
-               // Check that the specified temp file is valid...
-               wfSuppressWarnings();
-               $ok = ( is_file( $tmpPath ) && !filesize( $tmpPath ) );
-               wfRestoreWarnings();
-               if ( !$ok ) { // not present or not empty
-                       $status->fatal( 'backend-fail-opentemp', $tmpPath );
-                       return $status;
-               }
-
-               // Build up the temp file using the source chunks (in order)...
-               $tmpHandle = fopen( $tmpPath, 'ab' );
-               if ( $tmpHandle === false ) {
-                       $status->fatal( 'backend-fail-opentemp', $tmpPath );
-                       return $status;
-               }
-               foreach ( $params['srcs'] as $virtualSource ) {
-                       // Get a local FS version of the chunk
-                       $tmpFile = $this->getLocalReference( array( 'src' => $virtualSource ) );
-                       if ( !$tmpFile ) {
-                               $status->fatal( 'backend-fail-read', $virtualSource );
-                               return $status;
-                       }
-                       // Get a handle to the local FS version
-                       $sourceHandle = fopen( $tmpFile->getPath(), 'r' );
-                       if ( $sourceHandle === false ) {
-                               fclose( $tmpHandle );
-                               $status->fatal( 'backend-fail-read', $virtualSource );
-                               return $status;
-                       }
-                       // Append chunk to file (pass chunk size to avoid magic quotes)
-                       if ( !stream_copy_to_stream( $sourceHandle, $tmpHandle ) ) {
-                               fclose( $sourceHandle );
-                               fclose( $tmpHandle );
-                               $status->fatal( 'backend-fail-writetemp', $tmpPath );
-                               return $status;
-                       }
-                       fclose( $sourceHandle );
-               }
-               if ( !fclose( $tmpHandle ) ) {
-                       $status->fatal( 'backend-fail-closetemp', $tmpPath );
-                       return $status;
-               }
-
-               clearstatcache(); // temp file changed
-
-               return $status;
-       }
-
-       /**
-        * @see FileBackend::doPrepare()
-        * @return Status
-        */
-       final protected function doPrepare( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-
-               $status = Status::newGood();
-               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
-               if ( $dir === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
-                       return $status; // invalid storage path
-               }
-
-               if ( $shard !== null ) { // confined to a single container/shard
-                       $status->merge( $this->doPrepareInternal( $fullCont, $dir, $params ) );
-               } else { // directory is on several shards
-                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
-                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
-                               $status->merge( $this->doPrepareInternal( "{$fullCont}{$suffix}", $dir, $params ) );
-                       }
-               }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::doPrepare()
-        * @return Status
-        */
-       protected function doPrepareInternal( $container, $dir, array $params ) {
-               return Status::newGood();
-       }
-
-       /**
-        * @see FileBackend::doSecure()
-        * @return Status
-        */
-       final protected function doSecure( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = Status::newGood();
-
-               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
-               if ( $dir === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
-                       return $status; // invalid storage path
-               }
-
-               if ( $shard !== null ) { // confined to a single container/shard
-                       $status->merge( $this->doSecureInternal( $fullCont, $dir, $params ) );
-               } else { // directory is on several shards
-                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
-                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
-                               $status->merge( $this->doSecureInternal( "{$fullCont}{$suffix}", $dir, $params ) );
-                       }
-               }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::doSecure()
-        * @return Status
-        */
-       protected function doSecureInternal( $container, $dir, array $params ) {
-               return Status::newGood();
-       }
-
-       /**
-        * @see FileBackend::doClean()
-        * @return Status
-        */
-       final protected function doClean( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = Status::newGood();
-
-               // Recursive: first delete all empty subdirs recursively
-               if ( !empty( $params['recursive'] ) && !$this->directoriesAreVirtual() ) {
-                       $subDirsRel = $this->getTopDirectoryList( array( 'dir' => $params['dir'] ) );
-                       if ( $subDirsRel !== null ) { // no errors
-                               foreach ( $subDirsRel as $subDirRel ) {
-                                       $subDir = $params['dir'] . "/{$subDirRel}"; // full path
-                                       $status->merge( $this->doClean( array( 'dir' => $subDir ) + $params ) );
-                               }
-                       }
-               }
-
-               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
-               if ( $dir === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
-                       return $status; // invalid storage path
-               }
-
-               // Attempt to lock this directory...
-               $filesLockEx = array( $params['dir'] );
-               $scopedLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
-               if ( !$status->isOK() ) {
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
-                       return $status; // abort
-               }
-
-               if ( $shard !== null ) { // confined to a single container/shard
-                       $status->merge( $this->doCleanInternal( $fullCont, $dir, $params ) );
-                       $this->deleteContainerCache( $fullCont ); // purge cache
-               } else { // directory is on several shards
-                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
-                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
-                               $status->merge( $this->doCleanInternal( "{$fullCont}{$suffix}", $dir, $params ) );
-                               $this->deleteContainerCache( "{$fullCont}{$suffix}" ); // purge cache
-                       }
-               }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::doClean()
-        * @return Status
-        */
-       protected function doCleanInternal( $container, $dir, array $params ) {
-               return Status::newGood();
-       }
-
-       /**
-        * @see FileBackend::fileExists()
-        * @return bool|null
-        */
-       final public function fileExists( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $stat = $this->getFileStat( $params );
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return ( $stat === null ) ? null : (bool)$stat; // null => failure
-       }
-
-       /**
-        * @see FileBackend::getFileTimestamp()
-        * @return bool
-        */
-       final public function getFileTimestamp( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $stat = $this->getFileStat( $params );
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $stat ? $stat['mtime'] : false;
-       }
-
-       /**
-        * @see FileBackend::getFileSize()
-        * @return bool
-        */
-       final public function getFileSize( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $stat = $this->getFileStat( $params );
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $stat ? $stat['size'] : false;
-       }
-
-       /**
-        * @see FileBackend::getFileStat()
-        * @return bool
-        */
-       final public function getFileStat( array $params ) {
-               $path = self::normalizeStoragePath( $params['src'] );
-               if ( $path === null ) {
-                       return false; // invalid storage path
-               }
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $latest = !empty( $params['latest'] ); // use latest data?
-               if ( !isset( $this->cache[$path]['stat'] ) ) {
-                       $this->primeFileCache( array( $path ) ); // check persistent cache
-               }
-               if ( isset( $this->cache[$path]['stat'] ) ) {
-                       // If we want the latest data, check that this cached
-                       // value was in fact fetched with the latest available data.
-                       if ( !$latest || $this->cache[$path]['stat']['latest'] ) {
-                               $this->pingCache( $path ); // LRU
-                               wfProfileOut( __METHOD__ . '-' . $this->name );
-                               wfProfileOut( __METHOD__ );
-                               return $this->cache[$path]['stat'];
-                       }
-               }
-               wfProfileIn( __METHOD__ . '-miss' );
-               wfProfileIn( __METHOD__ . '-miss-' . $this->name );
-               $stat = $this->doGetFileStat( $params );
-               wfProfileOut( __METHOD__ . '-miss-' . $this->name );
-               wfProfileOut( __METHOD__ . '-miss' );
-               if ( is_array( $stat ) ) { // don't cache negatives
-                       $stat['latest'] = $latest;
-                       $this->trimCache(); // limit memory
-                       $this->cache[$path]['stat'] = $stat;
-                       $this->setFileCache( $path, $stat ); // update persistent cache
-                       if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
-                               $this->trimCache(); // limit memory
-                               $this->cache[$path]['sha1'] =
-                                       array( 'hash' => $stat['sha1'], 'latest' => $latest );
-                       }
-               } else {
-                       wfDebug( __METHOD__ . ": File $path does not exist.\n" );
-               }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $stat;
-       }
-
-       /**
-        * @see FileBackendStore::getFileStat()
-        */
-       abstract protected function doGetFileStat( array $params );
-
-       /**
-        * @see FileBackend::getFileContents()
-        * @return bool|string
-        */
-       public function getFileContents( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $tmpFile = $this->getLocalReference( $params );
-               if ( !$tmpFile ) {
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-               wfSuppressWarnings();
-               $data = file_get_contents( $tmpFile->getPath() );
-               wfRestoreWarnings();
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $data;
-       }
-
-       /**
-        * @see FileBackend::getFileSha1Base36()
-        * @return bool|string
-        */
-       final public function getFileSha1Base36( array $params ) {
-               $path = self::normalizeStoragePath( $params['src'] );
-               if ( $path === null ) {
-                       return false; // invalid storage path
-               }
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $latest = !empty( $params['latest'] ); // use latest data?
-               if ( isset( $this->cache[$path]['sha1'] ) ) {
-                       // If we want the latest data, check that this cached
-                       // value was in fact fetched with the latest available data.
-                       if ( !$latest || $this->cache[$path]['sha1']['latest'] ) {
-                               $this->pingCache( $path ); // LRU
-                               wfProfileOut( __METHOD__ . '-' . $this->name );
-                               wfProfileOut( __METHOD__ );
-                               return $this->cache[$path]['sha1']['hash'];
-                       }
-               }
-               wfProfileIn( __METHOD__ . '-miss' );
-               wfProfileIn( __METHOD__ . '-miss-' . $this->name );
-               $hash = $this->doGetFileSha1Base36( $params );
-               wfProfileOut( __METHOD__ . '-miss-' . $this->name );
-               wfProfileOut( __METHOD__ . '-miss' );
-               if ( $hash ) { // don't cache negatives
-                       $this->trimCache(); // limit memory
-                       $this->cache[$path]['sha1'] = array( 'hash' => $hash, 'latest' => $latest );
-               }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $hash;
-       }
-
-       /**
-        * @see FileBackendStore::getFileSha1Base36()
-        * @return bool|string
-        */
-       protected function doGetFileSha1Base36( array $params ) {
-               $fsFile = $this->getLocalReference( $params );
-               if ( !$fsFile ) {
-                       return false;
-               } else {
-                       return $fsFile->getSha1Base36();
-               }
-       }
-
-       /**
-        * @see FileBackend::getFileProps()
-        * @return Array
-        */
-       final public function getFileProps( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $fsFile = $this->getLocalReference( $params );
-               $props = $fsFile ? $fsFile->getProps() : FSFile::placeholderProps();
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $props;
-       }
-
-       /**
-        * @see FileBackend::getLocalReference()
-        * @return TempFSFile|null
-        */
-       public function getLocalReference( array $params ) {
-               $path = self::normalizeStoragePath( $params['src'] );
-               if ( $path === null ) {
-                       return null; // invalid storage path
-               }
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $latest = !empty( $params['latest'] ); // use latest data?
-               if ( isset( $this->expensiveCache[$path]['localRef'] ) ) {
-                       // If we want the latest data, check that this cached
-                       // value was in fact fetched with the latest available data.
-                       if ( !$latest || $this->expensiveCache[$path]['localRef']['latest'] ) {
-                               $this->pingExpensiveCache( $path );
-                               wfProfileOut( __METHOD__ . '-' . $this->name );
-                               wfProfileOut( __METHOD__ );
-                               return $this->expensiveCache[$path]['localRef']['object'];
-                       }
-               }
-               $tmpFile = $this->getLocalCopy( $params );
-               if ( $tmpFile ) { // don't cache negatives
-                       $this->trimExpensiveCache(); // limit memory
-                       $this->expensiveCache[$path]['localRef'] =
-                               array( 'object' => $tmpFile, 'latest' => $latest );
-               }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $tmpFile;
-       }
-
-       /**
-        * @see FileBackend::streamFile()
-        * @return Status
-        */
-       final public function streamFile( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = Status::newGood();
-
-               $info = $this->getFileStat( $params );
-               if ( !$info ) { // let StreamFile handle the 404
-                       $status->fatal( 'backend-fail-notexists', $params['src'] );
-               }
-
-               // Set output buffer and HTTP headers for stream
-               $extraHeaders = isset( $params['headers'] ) ? $params['headers'] : array();
-               $res = StreamFile::prepareForStream( $params['src'], $info, $extraHeaders );
-               if ( $res == StreamFile::NOT_MODIFIED ) {
-                       // do nothing; client cache is up to date
-               } elseif ( $res == StreamFile::READY_STREAM ) {
-                       wfProfileIn( __METHOD__ . '-send' );
-                       wfProfileIn( __METHOD__ . '-send-' . $this->name );
-                       $status = $this->doStreamFile( $params );
-                       wfProfileOut( __METHOD__ . '-send-' . $this->name );
-                       wfProfileOut( __METHOD__ . '-send' );
-               } else {
-                       $status->fatal( 'backend-fail-stream', $params['src'] );
-               }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::streamFile()
-        * @return Status
-        */
-       protected function doStreamFile( array $params ) {
-               $status = Status::newGood();
-
-               $fsFile = $this->getLocalReference( $params );
-               if ( !$fsFile ) {
-                       $status->fatal( 'backend-fail-stream', $params['src'] );
-               } elseif ( !readfile( $fsFile->getPath() ) ) {
-                       $status->fatal( 'backend-fail-stream', $params['src'] );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FileBackend::directoryExists()
-        * @return bool|null
-        */
-       final public function directoryExists( array $params ) {
-               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
-               if ( $dir === null ) {
-                       return false; // invalid storage path
-               }
-               if ( $shard !== null ) { // confined to a single container/shard
-                       return $this->doDirectoryExists( $fullCont, $dir, $params );
-               } else { // directory is on several shards
-                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
-                       $res = false; // response
-                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
-                               $exists = $this->doDirectoryExists( "{$fullCont}{$suffix}", $dir, $params );
-                               if ( $exists ) {
-                                       $res = true;
-                                       break; // found one!
-                               } elseif ( $exists === null ) { // error?
-                                       $res = null; // if we don't find anything, it is indeterminate
-                               }
-                       }
-                       return $res;
-               }
-       }
-
-       /**
-        * @see FileBackendStore::directoryExists()
-        *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
-        * @param $params Array
-        * @return bool|null
-        */
-       abstract protected function doDirectoryExists( $container, $dir, array $params );
-
-       /**
-        * @see FileBackend::getDirectoryList()
-        * @return Traversable|Array|null Returns null on failure
-        */
-       final public function getDirectoryList( array $params ) {
-               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
-               if ( $dir === null ) { // invalid storage path
-                       return null;
-               }
-               if ( $shard !== null ) {
-                       // File listing is confined to a single container/shard
-                       return $this->getDirectoryListInternal( $fullCont, $dir, $params );
-               } else {
-                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       // File listing spans multiple containers/shards
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
-                       return new FileBackendStoreShardDirIterator( $this,
-                               $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
-               }
-       }
-
-       /**
-        * Do not call this function from places outside FileBackend
-        *
-        * @see FileBackendStore::getDirectoryList()
-        *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
-        * @param $params Array
-        * @return Traversable|Array|null Returns null on failure
-        */
-       abstract public function getDirectoryListInternal( $container, $dir, array $params );
-
-       /**
-        * @see FileBackend::getFileList()
-        * @return Traversable|Array|null Returns null on failure
-        */
-       final public function getFileList( array $params ) {
-               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
-               if ( $dir === null ) { // invalid storage path
-                       return null;
-               }
-               if ( $shard !== null ) {
-                       // File listing is confined to a single container/shard
-                       return $this->getFileListInternal( $fullCont, $dir, $params );
-               } else {
-                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
-                       // File listing spans multiple containers/shards
-                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
-                       return new FileBackendStoreShardFileIterator( $this,
-                               $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
-               }
-       }
-
-       /**
-        * Do not call this function from places outside FileBackend
-        *
-        * @see FileBackendStore::getFileList()
-        *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
-        * @param $params Array
-        * @return Traversable|Array|null Returns null on failure
-        */
-       abstract public function getFileListInternal( $container, $dir, array $params );
-
-       /**
-        * Return a list of FileOp objects from a list of operations.
-        * Do not call this function from places outside FileBackend.
-        *
-        * The result must have the same number of items as the input.
-        * An exception is thrown if an unsupported operation is requested.
-        *
-        * @param $ops Array Same format as doOperations()
-        * @return Array List of FileOp objects
-        * @throws MWException
-        */
-       final public function getOperationsInternal( array $ops ) {
-               $supportedOps = array(
-                       'store'       => 'StoreFileOp',
-                       'copy'        => 'CopyFileOp',
-                       'move'        => 'MoveFileOp',
-                       'delete'      => 'DeleteFileOp',
-                       'create'      => 'CreateFileOp',
-                       'null'        => 'NullFileOp'
-               );
-
-               $performOps = array(); // array of FileOp objects
-               // Build up ordered array of FileOps...
-               foreach ( $ops as $operation ) {
-                       $opName = $operation['op'];
-                       if ( isset( $supportedOps[$opName] ) ) {
-                               $class = $supportedOps[$opName];
-                               // Get params for this operation
-                               $params = $operation;
-                               // Append the FileOp class
-                               $performOps[] = new $class( $this, $params );
-                       } else {
-                               throw new MWException( "Operation '$opName' is not supported." );
-                       }
-               }
-
-               return $performOps;
-       }
-
-       /**
-        * Get a list of storage paths to lock for a list of operations
-        * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
-        * each corresponding to a list of storage paths to be locked.
-        *
-        * @param $performOps Array List of FileOp objects
-        * @return Array ('sh' => list of paths, 'ex' => list of paths)
-        */
-       final public function getPathsToLockForOpsInternal( array $performOps ) {
-               // Build up a list of files to lock...
-               $paths = array( 'sh' => array(), 'ex' => array() );
-               foreach ( $performOps as $fileOp ) {
-                       $paths['sh'] = array_merge( $paths['sh'], $fileOp->storagePathsRead() );
-                       $paths['ex'] = array_merge( $paths['ex'], $fileOp->storagePathsChanged() );
-               }
-               // Optimization: if doing an EX lock anyway, don't also set an SH one
-               $paths['sh'] = array_diff( $paths['sh'], $paths['ex'] );
-               // Get a shared lock on the parent directory of each path changed
-               $paths['sh'] = array_merge( $paths['sh'], array_map( 'dirname', $paths['ex'] ) );
-
-               return $paths;
-       }
-
-       /**
-        * @see FileBackend::getScopedLocksForOps()
-        * @return Array
-        */
-       public function getScopedLocksForOps( array $ops, Status $status ) {
-               $paths = $this->getPathsToLockForOpsInternal( $this->getOperationsInternal( $ops ) );
-               return array(
-                       $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
-                       $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
-               );
-       }
-
-       /**
-        * @see FileBackend::doOperationsInternal()
-        * @return Status
-        */
-       protected function doOperationsInternal( array $ops, array $opts ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = Status::newGood();
-
-               // Build up a list of FileOps...
-               $performOps = $this->getOperationsInternal( $ops );
-
-               // Acquire any locks as needed...
-               if ( empty( $opts['nonLocking'] ) ) {
-                       // Build up a list of files to lock...
-                       $paths = $this->getPathsToLockForOpsInternal( $performOps );
-                       // Try to lock those files for the scope of this function...
-                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
-                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
-                       if ( !$status->isOK() ) {
-                               wfProfileOut( __METHOD__ . '-' . $this->name );
-                               wfProfileOut( __METHOD__ );
-                               return $status; // abort
-                       }
-               }
-
-               // Clear any file cache entries (after locks acquired)
-               $this->clearCache();
-
-               // Load from the persistent file and container caches
-               $this->primeFileCache( $performOps );
-               $this->primeContainerCache( $performOps );
-
-               // Actually attempt the operation batch...
-               $subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
-
-               // Merge errors into status fields
-               $status->merge( $subStatus );
-               $status->success = $subStatus->success; // not done in merge()
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * @see FileBackend::doQuickOperationsInternal()
-        * @return Status
-        * @throws MWException
-        */
-       final protected function doQuickOperationsInternal( array $ops ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = Status::newGood();
-
-               $supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'null' );
-               $async = ( $this->parallelize === 'implicit' );
-               $maxConcurrency = $this->concurrency; // throttle
-
-               $statuses = array(); // array of (index => Status)
-               $fileOpHandles = array(); // list of (index => handle) arrays
-               $curFileOpHandles = array(); // current handle batch
-               // Perform the sync-only ops and build up op handles for the async ops...
-               foreach ( $ops as $index => $params ) {
-                       if ( !in_array( $params['op'], $supportedOps ) ) {
-                               wfProfileOut( __METHOD__ . '-' . $this->name );
-                               wfProfileOut( __METHOD__ );
-                               throw new MWException( "Operation '{$params['op']}' is not supported." );
-                       }
-                       $method = $params['op'] . 'Internal'; // e.g. "storeInternal"
-                       $subStatus = $this->$method( array( 'async' => $async ) + $params );
-                       if ( $subStatus->value instanceof FileBackendStoreOpHandle ) { // async
-                               if ( count( $curFileOpHandles ) >= $maxConcurrency ) {
-                                       $fileOpHandles[] = $curFileOpHandles; // push this batch
-                                       $curFileOpHandles = array();
-                               }
-                               $curFileOpHandles[$index] = $subStatus->value; // keep index
-                       } else { // error or completed
-                               $statuses[$index] = $subStatus; // keep index
-                       }
-               }
-               if ( count( $curFileOpHandles ) ) {
-                       $fileOpHandles[] = $curFileOpHandles; // last batch
-               }
-               // Do all the async ops that can be done concurrently...
-               foreach ( $fileOpHandles as $fileHandleBatch ) {
-                       $statuses = $statuses + $this->executeOpHandlesInternal( $fileHandleBatch );
-               }
-               // Marshall and merge all the responses...
-               foreach ( $statuses as $index => $subStatus ) {
-                       $status->merge( $subStatus );
-                       if ( $subStatus->isOK() ) {
-                               $status->success[$index] = true;
-                               ++$status->successCount;
-                       } else {
-                               $status->success[$index] = false;
-                               ++$status->failCount;
-                       }
-               }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * Execute a list of FileBackendStoreOpHandle handles in parallel.
-        * The resulting Status object fields will correspond
-        * to the order in which the handles where given.
-        *
-        * @param $handles Array List of FileBackendStoreOpHandle objects
-        * @return Array Map of Status objects
-        * @throws MWException
-        */
-       final public function executeOpHandlesInternal( array $fileOpHandles ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-               foreach ( $fileOpHandles as $fileOpHandle ) {
-                       if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
-                               throw new MWException( "Given a non-FileBackendStoreOpHandle object." );
-                       } elseif ( $fileOpHandle->backend->getName() !== $this->getName() ) {
-                               throw new MWException( "Given a FileBackendStoreOpHandle for the wrong backend." );
-                       }
-               }
-               $res = $this->doExecuteOpHandlesInternal( $fileOpHandles );
-               foreach ( $fileOpHandles as $fileOpHandle ) {
-                       $fileOpHandle->closeResources();
-               }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-               return $res;
-       }
-
-       /**
-        * @see FileBackendStore::executeOpHandlesInternal()
-        * @return Array List of corresponding Status objects
-        */
-       protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
-               foreach ( $fileOpHandles as $fileOpHandle ) { // OK if empty
-                       throw new MWException( "This backend supports no asynchronous operations." );
-               }
-               return array();
-       }
-
-       /**
-        * @see FileBackend::clearCache()
-        */
-       final public function clearCache( array $paths = null ) {
-               if ( is_array( $paths ) ) {
-                       $paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
-                       $paths = array_filter( $paths, 'strlen' ); // remove nulls
-               }
-               if ( $paths === null ) {
-                       $this->cache = array();
-                       $this->expensiveCache = array();
-               } else {
-                       foreach ( $paths as $path ) {
-                               unset( $this->cache[$path] );
-                               unset( $this->expensiveCache[$path] );
-                       }
-               }
-               $this->doClearCache( $paths );
-       }
-
-       /**
-        * Clears any additional stat caches for storage paths
-        *
-        * @see FileBackend::clearCache()
-        *
-        * @param $paths Array Storage paths (optional)
-        * @return void
-        */
-       protected function doClearCache( array $paths = null ) {}
-
-       /**
-        * Is this a key/value store where directories are just virtual?
-        * Virtual directories exists in so much as files exists that are
-        * prefixed with the directory path followed by a forward slash.
-        *
-        * @return bool
-        */
-       abstract protected function directoriesAreVirtual();
-
-       /**
-        * Move a cache entry to the top (such as when accessed)
-        *
-        * @param $path string Storage path
-        * @return void
-        */
-       protected function pingCache( $path ) {
-               if ( isset( $this->cache[$path] ) ) {
-                       $tmp = $this->cache[$path];
-                       unset( $this->cache[$path] );
-                       $this->cache[$path] = $tmp;
-               }
-       }
-
-       /**
-        * Prune the inexpensive cache if it is too big to add an item
-        *
-        * @return void
-        */
-       protected function trimCache() {
-               if ( count( $this->cache ) >= $this->maxCacheSize ) {
-                       reset( $this->cache );
-                       unset( $this->cache[key( $this->cache )] );
-               }
-       }
-
-       /**
-        * Move a cache entry to the top (such as when accessed)
-        *
-        * @param $path string Storage path
-        * @return void
-        */
-       protected function pingExpensiveCache( $path ) {
-               if ( isset( $this->expensiveCache[$path] ) ) {
-                       $tmp = $this->expensiveCache[$path];
-                       unset( $this->expensiveCache[$path] );
-                       $this->expensiveCache[$path] = $tmp;
-               }
-       }
-
-       /**
-        * Prune the expensive cache if it is too big to add an item
-        *
-        * @return void
-        */
-       protected function trimExpensiveCache() {
-               if ( count( $this->expensiveCache ) >= $this->maxExpensiveCacheSize ) {
-                       reset( $this->expensiveCache );
-                       unset( $this->expensiveCache[key( $this->expensiveCache )] );
-               }
-       }
-
-       /**
-        * Check if a container name is valid.
-        * This checks for for length and illegal characters.
-        *
-        * @param $container string
-        * @return bool
-        */
-       final protected static function isValidContainerName( $container ) {
-               // This accounts for Swift and S3 restrictions while leaving room
-               // for things like '.xxx' (hex shard chars) or '.seg' (segments).
-               // This disallows directory separators or traversal characters.
-               // Note that matching strings URL encode to the same string;
-               // in Swift, the length restriction is *after* URL encoding.
-               return preg_match( '/^[a-z0-9][a-z0-9-_]{0,199}$/i', $container );
-       }
-
-       /**
-        * Splits a storage path into an internal container name,
-        * an internal relative file name, and a container shard suffix.
-        * Any shard suffix is already appended to the internal container name.
-        * This also checks that the storage path is valid and within this backend.
-        *
-        * If the container is sharded but a suffix could not be determined,
-        * this means that the path can only refer to a directory and can only
-        * be scanned by looking in all the container shards.
-        *
-        * @param $storagePath string
-        * @return Array (container, path, container suffix) or (null, null, null) if invalid
-        */
-       final protected function resolveStoragePath( $storagePath ) {
-               list( $backend, $container, $relPath ) = self::splitStoragePath( $storagePath );
-               if ( $backend === $this->name ) { // must be for this backend
-                       $relPath = self::normalizeContainerPath( $relPath );
-                       if ( $relPath !== null ) {
-                               // Get shard for the normalized path if this container is sharded
-                               $cShard = $this->getContainerShard( $container, $relPath );
-                               // Validate and sanitize the relative path (backend-specific)
-                               $relPath = $this->resolveContainerPath( $container, $relPath );
-                               if ( $relPath !== null ) {
-                                       // Prepend any wiki ID prefix to the container name
-                                       $container = $this->fullContainerName( $container );
-                                       if ( self::isValidContainerName( $container ) ) {
-                                               // Validate and sanitize the container name (backend-specific)
-                                               $container = $this->resolveContainerName( "{$container}{$cShard}" );
-                                               if ( $container !== null ) {
-                                                       return array( $container, $relPath, $cShard );
-                                               }
-                                       }
-                               }
-                       }
-               }
-               return array( null, null, null );
-       }
-
-       /**
-        * Like resolveStoragePath() except null values are returned if
-        * the container is sharded and the shard could not be determined.
-        *
-        * @see FileBackendStore::resolveStoragePath()
-        *
-        * @param $storagePath string
-        * @return Array (container, path) or (null, null) if invalid
-        */
-       final protected function resolveStoragePathReal( $storagePath ) {
-               list( $container, $relPath, $cShard ) = $this->resolveStoragePath( $storagePath );
-               if ( $cShard !== null ) {
-                       return array( $container, $relPath );
-               }
-               return array( null, null );
-       }
-
-       /**
-        * Get the container name shard suffix for a given path.
-        * Any empty suffix means the container is not sharded.
-        *
-        * @param $container string Container name
-        * @param $relPath string Storage path relative to the container
-        * @return string|null Returns null if shard could not be determined
-        */
-       final protected function getContainerShard( $container, $relPath ) {
-               list( $levels, $base, $repeat ) = $this->getContainerHashLevels( $container );
-               if ( $levels == 1 || $levels == 2 ) {
-                       // Hash characters are either base 16 or 36
-                       $char = ( $base == 36 ) ? '[0-9a-z]' : '[0-9a-f]';
-                       // Get a regex that represents the shard portion of paths.
-                       // The concatenation of the captures gives us the shard.
-                       if ( $levels === 1 ) { // 16 or 36 shards per container
-                               $hashDirRegex = '(' . $char . ')';
-                       } else { // 256 or 1296 shards per container
-                               if ( $repeat ) { // verbose hash dir format (e.g. "a/ab/abc")
-                                       $hashDirRegex = $char . '/(' . $char . '{2})';
-                               } else { // short hash dir format (e.g. "a/b/c")
-                                       $hashDirRegex = '(' . $char . ')/(' . $char . ')';
-                               }
-                       }
-                       // Allow certain directories to be above the hash dirs so as
-                       // to work with FileRepo (e.g. "archive/a/ab" or "temp/a/ab").
-                       // They must be 2+ chars to avoid any hash directory ambiguity.
-                       $m = array();
-                       if ( preg_match( "!^(?:[^/]{2,}/)*$hashDirRegex(?:/|$)!", $relPath, $m ) ) {
-                               return '.' . implode( '', array_slice( $m, 1 ) );
-                       }
-                       return null; // failed to match
-               }
-               return ''; // no sharding
-       }
-
-       /**
-        * Check if a storage path maps to a single shard.
-        * Container dirs like "a", where the container shards on "x/xy",
-        * can reside on several shards. Such paths are tricky to handle.
-        *
-        * @param $storagePath string Storage path
-        * @return bool
-        */
-       final public function isSingleShardPathInternal( $storagePath ) {
-               list( $c, $r, $shard ) = $this->resolveStoragePath( $storagePath );
-               return ( $shard !== null );
-       }
-
-       /**
-        * Get the sharding config for a container.
-        * If greater than 0, then all file storage paths within
-        * the container are required to be hashed accordingly.
-        *
-        * @param $container string
-        * @return Array (integer levels, integer base, repeat flag) or (0, 0, false)
-        */
-       final protected function getContainerHashLevels( $container ) {
-               if ( isset( $this->shardViaHashLevels[$container] ) ) {
-                       $config = $this->shardViaHashLevels[$container];
-                       $hashLevels = (int)$config['levels'];
-                       if ( $hashLevels == 1 || $hashLevels == 2 ) {
-                               $hashBase = (int)$config['base'];
-                               if ( $hashBase == 16 || $hashBase == 36 ) {
-                                       return array( $hashLevels, $hashBase, $config['repeat'] );
-                               }
-                       }
-               }
-               return array( 0, 0, false ); // no sharding
-       }
-
-       /**
-        * Get a list of full container shard suffixes for a container
-        *
-        * @param $container string
-        * @return Array
-        */
-       final protected function getContainerSuffixes( $container ) {
-               $shards = array();
-               list( $digits, $base ) = $this->getContainerHashLevels( $container );
-               if ( $digits > 0 ) {
-                       $numShards = pow( $base, $digits );
-                       for ( $index = 0; $index < $numShards; $index++ ) {
-                               $shards[] = '.' . wfBaseConvert( $index, 10, $base, $digits );
-                       }
-               }
-               return $shards;
-       }
-
-       /**
-        * Get the full container name, including the wiki ID prefix
-        *
-        * @param $container string
-        * @return string
-        */
-       final protected function fullContainerName( $container ) {
-               if ( $this->wikiId != '' ) {
-                       return "{$this->wikiId}-$container";
-               } else {
-                       return $container;
-               }
-       }
-
-       /**
-        * Resolve a container name, checking if it's allowed by the backend.
-        * This is intended for internal use, such as encoding illegal chars.
-        * Subclasses can override this to be more restrictive.
-        *
-        * @param $container string
-        * @return string|null
-        */
-       protected function resolveContainerName( $container ) {
-               return $container;
-       }
-
-       /**
-        * Resolve a relative storage path, checking if it's allowed by the backend.
-        * This is intended for internal use, such as encoding illegal chars or perhaps
-        * getting absolute paths (e.g. FS based backends). Note that the relative path
-        * may be the empty string (e.g. the path is simply to the container).
-        *
-        * @param $container string Container name
-        * @param $relStoragePath string Storage path relative to the container
-        * @return string|null Path or null if not valid
-        */
-       protected function resolveContainerPath( $container, $relStoragePath ) {
-               return $relStoragePath;
-       }
-
-       /**
-        * Get the cache key for a container
-        *
-        * @param $container string Resolved container name
-        * @return string
-        */
-       private function containerCacheKey( $container ) {
-               return wfMemcKey( 'backend', $this->getName(), 'container', $container );
-       }
-
-       /**
-        * Set the cached info for a container
-        *
-        * @param $container string Resolved container name
-        * @param $val mixed Information to cache
-        */
-       final protected function setContainerCache( $container, $val ) {
-               $this->memCache->add( $this->containerCacheKey( $container ), $val, 14*86400 );
-       }
-
-       /**
-        * Delete the cached info for a container.
-        * The cache key is salted for a while to prevent race conditions.
-        *
-        * @param $container string Resolved container name
-        */
-       final protected function deleteContainerCache( $container ) {
-               if ( !$this->memCache->set( $this->containerCacheKey( $container ), 'PURGED', 300 ) ) {
-                       trigger_error( "Unable to delete stat cache for container $container." );
-               }
-       }
-
-       /**
-        * Do a batch lookup from cache for container stats for all containers
-        * used in a list of container names, storage paths, or FileOp objects.
-        *
-        * @param $items Array
-        * @return void
-        */
-       final protected function primeContainerCache( array $items ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-
-               $paths = array(); // list of storage paths
-               $contNames = array(); // (cache key => resolved container name)
-               // Get all the paths/containers from the items...
-               foreach ( $items as $item ) {
-                       if ( $item instanceof FileOp ) {
-                               $paths = array_merge( $paths, $item->storagePathsRead() );
-                               $paths = array_merge( $paths, $item->storagePathsChanged() );
-                       } elseif ( self::isStoragePath( $item ) ) {
-                               $paths[] = $item;
-                       } elseif ( is_string( $item ) ) { // full container name
-                               $contNames[$this->containerCacheKey( $item )] = $item;
-                       }
-               }
-               // Get all the corresponding cache keys for paths...
-               foreach ( $paths as $path ) {
-                       list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
-                       if ( $fullCont !== null ) { // valid path for this backend
-                               $contNames[$this->containerCacheKey( $fullCont )] = $fullCont;
-                       }
-               }
-
-               $contInfo = array(); // (resolved container name => cache value)
-               // Get all cache entries for these container cache keys...
-               $values = $this->memCache->getMulti( array_keys( $contNames ) );
-               foreach ( $values as $cacheKey => $val ) {
-                       $contInfo[$contNames[$cacheKey]] = $val;
-               }
-
-               // Populate the container process cache for the backend...
-               $this->doPrimeContainerCache( array_filter( $contInfo, 'is_array' ) );
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * Fill the backend-specific process cache given an array of
-        * resolved container names and their corresponding cached info.
-        * Only containers that actually exist should appear in the map.
-        *
-        * @param $containerInfo Array Map of resolved container names to cached info
-        * @return void
-        */
-       protected function doPrimeContainerCache( array $containerInfo ) {}
-
-       /**
-        * Get the cache key for a file path
-        *
-        * @param $path string Storage path
-        * @return string
-        */
-       private function fileCacheKey( $path ) {
-               return wfMemcKey( 'backend', $this->getName(), 'file', sha1( $path ) );
-       }
-
-       /**
-        * Set the cached stat info for a file path
-        *
-        * @param $path string Storage path
-        * @param $val mixed Information to cache
-        */
-       final protected function setFileCache( $path, $val ) {
-               $this->memCache->add( $this->fileCacheKey( $path ), $val, 7*86400 );
-       }
-
-       /**
-        * Delete the cached stat info for a file path.
-        * The cache key is salted for a while to prevent race conditions.
-        *
-        * @param $path string Storage path
-        */
-       final protected function deleteFileCache( $path ) {
-               if ( !$this->memCache->set( $this->fileCacheKey( $path ), 'PURGED', 300 ) ) {
-                       trigger_error( "Unable to delete stat cache for file $path." );
-               }
-       }
-
-       /**
-        * Do a batch lookup from cache for file stats for all paths
-        * used in a list of storage paths or FileOp objects.
-        *
-        * @param $items Array List of storage paths or FileOps
-        * @return void
-        */
-       final protected function primeFileCache( array $items ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-
-               $paths = array(); // list of storage paths
-               $pathNames = array(); // (cache key => storage path)
-               // Get all the paths/containers from the items...
-               foreach ( $items as $item ) {
-                       if ( $item instanceof FileOp ) {
-                               $paths = array_merge( $paths, $item->storagePathsRead() );
-                               $paths = array_merge( $paths, $item->storagePathsChanged() );
-                       } elseif ( self::isStoragePath( $item ) ) {
-                               $paths[] = $item;
-                       }
-               }
-               // Get all the corresponding cache keys for paths...
-               foreach ( $paths as $path ) {
-                       list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
-                       if ( $rel !== null ) { // valid path for this backend
-                               $pathNames[$this->fileCacheKey( $path )] = $path;
-                       }
-               }
-               // Get all cache entries for these container cache keys...
-               $values = $this->memCache->getMulti( array_keys( $pathNames ) );
-               foreach ( $values as $cacheKey => $val ) {
-                       if ( is_array( $val ) ) {
-                               $path = $pathNames[$cacheKey];
-                               $this->trimCache(); // limit memory
-                               $this->cache[$path]['stat'] = $val;
-                               if ( isset( $val['sha1'] ) ) { // some backends store SHA-1 as metadata
-                                       $this->trimCache(); // limit memory
-                                       $this->cache[$path]['sha1'] =
-                                               array( 'hash' => $val['sha1'], 'latest' => $val['latest'] );
-                               }
-                       }
-               }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
-       }
-}
-
-/**
- * FileBackendStore helper class for performing asynchronous file operations.
- *
- * For example, calling FileBackendStore::createInternal() with the "async"
- * param flag may result in a Status that contains this object as a value.
- * This class is largely backend-specific and is mostly just "magic" to be
- * passed to FileBackendStore::executeOpHandlesInternal().
- */
-abstract class FileBackendStoreOpHandle {
-       /** @var Array */
-       public $params = array(); // params to caller functions
-       /** @var FileBackendStore */
-       public $backend;
-       /** @var Array */
-       public $resourcesToClose = array();
-
-       public $call; // string; name that identifies the function called
-
-       /**
-        * Close all open file handles
-        *
-        * @return void
-        */
-       public function closeResources() {
-               array_map( 'fclose', $this->resourcesToClose );
-       }
-}
-
-/**
- * FileBackendStore helper function to handle listings that span container shards.
- * Do not use this class from places outside of FileBackendStore.
- *
- * @ingroup FileBackend
- */
-abstract class FileBackendStoreShardListIterator implements Iterator {
-       /** @var FileBackendStore */
-       protected $backend;
-       /** @var Array */
-       protected $params;
-       /** @var Array */
-       protected $shardSuffixes;
-       protected $container; // string; full container name
-       protected $directory; // string; resolved relative path
-
-       /** @var Traversable */
-       protected $iter;
-       protected $curShard = 0; // integer
-       protected $pos = 0; // integer
-
-       /** @var Array */
-       protected $multiShardPaths = array(); // (rel path => 1)
-
-       /**
-        * @param $backend FileBackendStore
-        * @param $container string Full storage container name
-        * @param $dir string Storage directory relative to container
-        * @param $suffixes Array List of container shard suffixes
-        * @param $params Array
-        */
-       public function __construct(
-               FileBackendStore $backend, $container, $dir, array $suffixes, array $params
-       ) {
-               $this->backend = $backend;
-               $this->container = $container;
-               $this->directory = $dir;
-               $this->shardSuffixes = $suffixes;
-               $this->params = $params;
-       }
-
-       /**
-        * @see Iterator::current()
-        * @return string|bool String or false
-        */
-       public function current() {
-               if ( is_array( $this->iter ) ) {
-                       return current( $this->iter );
-               } else {
-                       return $this->iter->current();
-               }
-       }
-
-       /**
-        * @see Iterator::key()
-        * @return integer
-        */
-       public function key() {
-               return $this->pos;
-       }
-
-       /**
-        * @see Iterator::next()
-        * @return void
-        */
-       public function next() {
-               ++$this->pos;
-               if ( is_array( $this->iter ) ) {
-                       next( $this->iter );
-               } else {
-                       $this->iter->next();
-               }
-               // Filter out items that we already listed
-               $this->filterViaNext();
-               // Find the next non-empty shard if no elements are left
-               $this->nextShardIteratorIfNotValid();
-       }
-
-       /**
-        * @see Iterator::rewind()
-        * @return void
-        */
-       public function rewind() {
-               $this->pos = 0;
-               $this->curShard = 0;
-               $this->setIteratorFromCurrentShard();
-               // Filter out items that we already listed
-               $this->filterViaNext();
-               // Find the next non-empty shard if this one has no elements
-               $this->nextShardIteratorIfNotValid();
-       }
-
-       /**
-        * @see Iterator::valid()
-        * @return bool
-        */
-       public function valid() {
-               if ( $this->iter === null ) {
-                       return false; // some failure?
-               } elseif ( is_array( $this->iter ) ) {
-                       return ( current( $this->iter ) !== false ); // no paths can have this value
-               } else {
-                       return $this->iter->valid();
-               }
-       }
-
-       /**
-        * Filter out duplicate items by advancing to the next ones
-        */
-       protected function filterViaNext() {
-               while ( $this->iter->valid() ) {
-                       $rel = $this->iter->current(); // path relative to given directory
-                       $path = $this->params['dir'] . "/{$rel}"; // full storage path
-                       if ( !$this->backend->isSingleShardPathInternal( $path ) ) {
-                               // Don't keep listing paths that are on multiple shards
-                               if ( isset( $this->multiShardPaths[$rel] ) ) {
-                                       $this->iter->next(); // we already listed this path
-                               } 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() ) {
-                       if ( ++$this->curShard >= count( $this->shardSuffixes ) ) {
-                               break; // no more container shards
-                       }
-                       $this->setIteratorFromCurrentShard();
-               }
-       }
-
-       /**
-        * Set the list iterator to that of the current container shard
-        */
-       protected function setIteratorFromCurrentShard() {
-               $suffix = $this->shardSuffixes[$this->curShard];
-               $this->iter = $this->listFromShard(
-                       "{$this->container}{$suffix}", $this->directory, $this->params );
-       }
-
-       /**
-        * Get the list for a given container shard
-        *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
-        * @param $params Array
-        * @return Traversable|Array|null
-        */
-       abstract protected function listFromShard( $container, $dir, array $params );
-}
-
-/**
- * Iterator for listing directories
- */
-class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator {
-       /**
-        * @param string $container
-        * @param string $dir
-        * @param array $params
-        * @return Array|null|Traversable
-        */
-       protected function listFromShard( $container, $dir, array $params ) {
-               return $this->backend->getDirectoryListInternal( $container, $dir, $params );
-       }
-}
-
-/**
- * Iterator for listing regular files
- */
-class FileBackendStoreShardFileIterator extends FileBackendStoreShardListIterator {
-       /**
-        * @param string $container
-        * @param string $dir
-        * @param array $params
-        * @return Array|null|Traversable
-        */
-       protected function listFromShard( $container, $dir, array $params ) {
-               return $this->backend->getFileListInternal( $container, $dir, $params );
-       }
-}
diff --git a/includes/filerepo/backend/FileOp.php b/includes/filerepo/backend/FileOp.php
deleted file mode 100644 (file)
index ac2496d..0000000
+++ /dev/null
@@ -1,778 +0,0 @@
-<?php
-/**
- * Helper class for representing operations with transaction support.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- * @author Aaron Schulz
- */
-
-/**
- * FileBackend helper class for representing operations.
- * Do not use this class from places outside FileBackend.
- *
- * Methods called from FileOpBatch::attempt() should avoid throwing
- * exceptions at all costs. FileOp objects should be lightweight in order
- * to support large arrays in memory and serialization.
- *
- * @ingroup FileBackend
- * @since 1.19
- */
-abstract class FileOp {
-       /** @var Array */
-       protected $params = array();
-       /** @var FileBackendStore */
-       protected $backend;
-
-       protected $state = self::STATE_NEW; // integer
-       protected $failed = false; // boolean
-       protected $async = false; // boolean
-       protected $useLatest = true; // boolean
-       protected $batchId; // string
-
-       protected $sourceSha1; // string
-       protected $destSameAsSource; // boolean
-
-       /* Object life-cycle */
-       const STATE_NEW = 1;
-       const STATE_CHECKED = 2;
-       const STATE_ATTEMPTED = 3;
-
-       /**
-        * Build a new file operation transaction
-        *
-        * @param $backend FileBackendStore
-        * @param $params Array
-        * @throws MWException
-        */
-       final public function __construct( FileBackendStore $backend, array $params ) {
-               $this->backend = $backend;
-               list( $required, $optional ) = $this->allowedParams();
-               foreach ( $required as $name ) {
-                       if ( isset( $params[$name] ) ) {
-                               $this->params[$name] = $params[$name];
-                       } else {
-                               throw new MWException( "File operation missing parameter '$name'." );
-                       }
-               }
-               foreach ( $optional as $name ) {
-                       if ( isset( $params[$name] ) ) {
-                               $this->params[$name] = $params[$name];
-                       }
-               }
-               $this->params = $params;
-       }
-
-       /**
-        * Set the batch UUID this operation belongs to
-        *
-        * @param $batchId string
-        * @return void
-        */
-       final public function setBatchId( $batchId ) {
-               $this->batchId = $batchId;
-       }
-
-       /**
-        * Whether to allow stale data for file reads and stat checks
-        *
-        * @param $allowStale bool
-        * @return void
-        */
-       final public function allowStaleReads( $allowStale ) {
-               $this->useLatest = !$allowStale;
-       }
-
-       /**
-        * Get the value of the parameter with the given name
-        *
-        * @param $name string
-        * @return mixed Returns null if the parameter is not set
-        */
-       final public function getParam( $name ) {
-               return isset( $this->params[$name] ) ? $this->params[$name] : null;
-       }
-
-       /**
-        * Check if this operation failed precheck() or attempt()
-        *
-        * @return bool
-        */
-       final public function failed() {
-               return $this->failed;
-       }
-
-       /**
-        * Get a new empty predicates array for precheck()
-        *
-        * @return Array
-        */
-       final public static function newPredicates() {
-               return array( 'exists' => array(), 'sha1' => array() );
-       }
-
-       /**
-        * Get a new empty dependency tracking array for paths read/written to
-        *
-        * @return Array
-        */
-       final public static function newDependencies() {
-               return array( 'read' => array(), 'write' => array() );
-       }
-
-       /**
-        * Update a dependency tracking array to account for this operation
-        *
-        * @param $deps Array Prior path reads/writes; format of FileOp::newPredicates()
-        * @return Array
-        */
-       final public function applyDependencies( array $deps ) {
-               $deps['read']  += array_fill_keys( $this->storagePathsRead(), 1 );
-               $deps['write'] += array_fill_keys( $this->storagePathsChanged(), 1 );
-               return $deps;
-       }
-
-       /**
-        * Check if this operation changes files listed in $paths
-        *
-        * @param $paths Array Prior path reads/writes; format of FileOp::newPredicates()
-        * @return boolean
-        */
-       final public function dependsOn( array $deps ) {
-               foreach ( $this->storagePathsChanged() as $path ) {
-                       if ( isset( $deps['read'][$path] ) || isset( $deps['write'][$path] ) ) {
-                               return true; // "output" or "anti" dependency
-                       }
-               }
-               foreach ( $this->storagePathsRead() as $path ) {
-                       if ( isset( $deps['write'][$path] ) ) {
-                               return true; // "flow" dependency
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Get the file journal entries for this file operation
-        *
-        * @param $oPredicates Array Pre-op info about files (format of FileOp::newPredicates)
-        * @param $nPredicates Array Post-op info about files (format of FileOp::newPredicates)
-        * @return Array
-        */
-       final public function getJournalEntries( array $oPredicates, array $nPredicates ) {
-               $nullEntries = array();
-               $updateEntries = array();
-               $deleteEntries = array();
-               $pathsUsed = array_merge( $this->storagePathsRead(), $this->storagePathsChanged() );
-               foreach ( $pathsUsed as $path ) {
-                       $nullEntries[] = array( // assertion for recovery
-                               '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,
-                                       'newSha1' => ''
-                               );
-                       } else { // created/updated
-                               $updateEntries[] = array(
-                                       'op'      => $this->fileExists( $path, $oPredicates ) ? 'update' : 'create',
-                                       'path'    => $path,
-                                       'newSha1' => $nPredicates['sha1'][$path]
-                               );
-                       }
-               }
-               return array_merge( $nullEntries, $updateEntries, $deleteEntries );
-       }
-
-       /**
-        * Check preconditions of the operation without writing anything
-        *
-        * @param $predicates Array
-        * @return Status
-        */
-       final public function precheck( array &$predicates ) {
-               if ( $this->state !== self::STATE_NEW ) {
-                       return Status::newFatal( 'fileop-fail-state', self::STATE_NEW, $this->state );
-               }
-               $this->state = self::STATE_CHECKED;
-               $status = $this->doPrecheck( $predicates );
-               if ( !$status->isOK() ) {
-                       $this->failed = true;
-               }
-               return $status;
-       }
-
-       /**
-        * @return Status
-        */
-       protected function doPrecheck( array &$predicates ) {
-               return Status::newGood();
-       }
-
-       /**
-        * Attempt the operation
-        *
-        * @return Status
-        */
-       final public function attempt() {
-               if ( $this->state !== self::STATE_CHECKED ) {
-                       return Status::newFatal( 'fileop-fail-state', self::STATE_CHECKED, $this->state );
-               } elseif ( $this->failed ) { // failed precheck
-                       return Status::newFatal( 'fileop-fail-attempt-precheck' );
-               }
-               $this->state = self::STATE_ATTEMPTED;
-               $status = $this->doAttempt();
-               if ( !$status->isOK() ) {
-                       $this->failed = true;
-                       $this->logFailure( 'attempt' );
-               }
-               return $status;
-       }
-
-       /**
-        * @return Status
-        */
-       protected function doAttempt() {
-               return Status::newGood();
-       }
-
-       /**
-        * Attempt the operation in the background
-        *
-        * @return Status
-        */
-       final public function attemptAsync() {
-               $this->async = true;
-               $result = $this->attempt();
-               $this->async = false;
-               return $result;
-       }
-
-       /**
-        * Get the file operation parameters
-        *
-        * @return Array (required params list, optional params list)
-        */
-       protected function allowedParams() {
-               return array( array(), array() );
-       }
-
-       /**
-        * Adjust params to FileBackendStore internal file calls
-        *
-        * @param $params Array
-        * @return Array (required params list, optional params list)
-        */
-       protected function setFlags( array $params ) {
-               return array( 'async' => $this->async ) + $params;
-       }
-
-       /**
-        * Get a list of storage paths read from for this operation
-        *
-        * @return Array
-        */
-       final public function storagePathsRead() {
-               return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsRead() );
-       }
-
-       /**
-        * @see FileOp::storagePathsRead()
-        * @return Array
-        */
-       protected function doStoragePathsRead() {
-               return array();
-       }
-
-       /**
-        * Get a list of storage paths written to for this operation
-        *
-        * @return Array
-        */
-       final public function storagePathsChanged() {
-               return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsChanged() );
-       }
-
-       /**
-        * @see FileOp::storagePathsChanged()
-        * @return Array
-        */
-       protected function doStoragePathsChanged() {
-               return array();
-       }
-
-       /**
-        * Check for errors with regards to the destination file already existing.
-        * This also updates the destSameAsSource and sourceSha1 member variables.
-        * A bad status will be returned if there is no chance it can be overwritten.
-        *
-        * @param $predicates Array
-        * @return Status
-        */
-       protected function precheckDestExistence( array $predicates ) {
-               $status = Status::newGood();
-               // Get hash of source file/string and the destination file
-               $this->sourceSha1 = $this->getSourceSha1Base36(); // FS file or data string
-               if ( $this->sourceSha1 === null ) { // file in storage?
-                       $this->sourceSha1 = $this->fileSha1( $this->params['src'], $predicates );
-               }
-               $this->destSameAsSource = false;
-               if ( $this->fileExists( $this->params['dst'], $predicates ) ) {
-                       if ( $this->getParam( 'overwrite' ) ) {
-                               return $status; // OK
-                       } elseif ( $this->getParam( 'overwriteSame' ) ) {
-                               $dhash = $this->fileSha1( $this->params['dst'], $predicates );
-                               // Check if hashes are valid and match each other...
-                               if ( !strlen( $this->sourceSha1 ) || !strlen( $dhash ) ) {
-                                       $status->fatal( 'backend-fail-hashes' );
-                               } elseif ( $this->sourceSha1 !== $dhash ) {
-                                       // Give an error if the files are not identical
-                                       $status->fatal( 'backend-fail-notsame', $this->params['dst'] );
-                               } else {
-                                       $this->destSameAsSource = true; // OK
-                               }
-                               return $status; // do nothing; either OK or bad status
-                       } else {
-                               $status->fatal( 'backend-fail-alreadyexists', $this->params['dst'] );
-                               return $status;
-                       }
-               }
-               return $status;
-       }
-
-       /**
-        * precheckDestExistence() helper function to get the source file SHA-1.
-        * Subclasses should overwride this iff the source is not in storage.
-        *
-        * @return string|bool Returns false on failure
-        */
-       protected function getSourceSha1Base36() {
-               return null; // N/A
-       }
-
-       /**
-        * Check if a file will exist in storage when this operation is attempted
-        *
-        * @param $source string Storage path
-        * @param $predicates Array
-        * @return bool
-        */
-       final protected function fileExists( $source, array $predicates ) {
-               if ( isset( $predicates['exists'][$source] ) ) {
-                       return $predicates['exists'][$source]; // previous op assures this
-               } else {
-                       $params = array( 'src' => $source, 'latest' => $this->useLatest );
-                       return $this->backend->fileExists( $params );
-               }
-       }
-
-       /**
-        * Get the SHA-1 of a file in storage when this operation is attempted
-        *
-        * @param $source string Storage path
-        * @param $predicates Array
-        * @return string|bool False on failure
-        */
-       final protected function fileSha1( $source, array $predicates ) {
-               if ( isset( $predicates['sha1'][$source] ) ) {
-                       return $predicates['sha1'][$source]; // previous op assures this
-               } else {
-                       $params = array( 'src' => $source, 'latest' => $this->useLatest );
-                       return $this->backend->getFileSha1Base36( $params );
-               }
-       }
-
-       /**
-        * Get the backend this operation is for
-        *
-        * @return FileBackendStore
-        */
-       public function getBackend() {
-               return $this->backend;
-       }
-
-       /**
-        * Log a file operation failure and preserve any temp files
-        *
-        * @param $action string
-        * @return void
-        */
-       final public function logFailure( $action ) {
-               $params = $this->params;
-               $params['failedAction'] = $action;
-               try {
-                       wfDebugLog( 'FileOperation', get_class( $this ) .
-                               " failed (batch #{$this->batchId}): " . FormatJson::encode( $params ) );
-               } catch ( Exception $e ) {
-                       // bad config? debug log error?
-               }
-       }
-}
-
-/**
- * Store a file into the backend from a file on the file system.
- * Parameters similar to FileBackendStore::storeInternal(), which include:
- *     src           : source path on file system
- *     dst           : destination storage path
- *     overwrite     : do nothing and pass if an identical file exists at destination
- *     overwriteSame : override any existing file at destination
- */
-class StoreFileOp extends FileOp {
-       /**
-        * @return array
-        */
-       protected function allowedParams() {
-               return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
-       }
-
-       /**
-        * @param $predicates array
-        * @return Status
-        */
-       protected function doPrecheck( array &$predicates ) {
-               $status = Status::newGood();
-               // Check if the source file exists on the file system
-               if ( !is_file( $this->params['src'] ) ) {
-                       $status->fatal( 'backend-fail-notexists', $this->params['src'] );
-                       return $status;
-               // Check if the source file is too big
-               } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
-                       $status->fatal( 'backend-fail-maxsize',
-                               $this->params['dst'], $this->backend->maxFileSizeInternal() );
-                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
-                       return $status;
-               // Check if a file can be placed at the destination
-               } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
-                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
-                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
-                       return $status;
-               }
-               // Check if destination file exists
-               $status->merge( $this->precheckDestExistence( $predicates ) );
-               if ( $status->isOK() ) {
-                       // Update file existence predicates
-                       $predicates['exists'][$this->params['dst']] = true;
-                       $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
-               }
-               return $status; // safe to call attempt()
-       }
-
-       /**
-        * @return Status
-        */
-       protected function doAttempt() {
-               // Store the file at the destination
-               if ( !$this->destSameAsSource ) {
-                       return $this->backend->storeInternal( $this->setFlags( $this->params ) );
-               }
-               return Status::newGood();
-       }
-
-       /**
-        * @return bool|string
-        */
-       protected function getSourceSha1Base36() {
-               wfSuppressWarnings();
-               $hash = sha1_file( $this->params['src'] );
-               wfRestoreWarnings();
-               if ( $hash !== false ) {
-                       $hash = wfBaseConvert( $hash, 16, 36, 31 );
-               }
-               return $hash;
-       }
-
-       protected function doStoragePathsChanged() {
-               return array( $this->params['dst'] );
-       }
-}
-
-/**
- * Create a file in the backend with the given content.
- * Parameters similar to FileBackendStore::createInternal(), which include:
- *     content       : the raw file contents
- *     dst           : destination storage path
- *     overwrite     : do nothing and pass if an identical file exists at destination
- *     overwriteSame : override any existing file at destination
- */
-class CreateFileOp extends FileOp {
-       protected function allowedParams() {
-               return array( array( 'content', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
-       }
-
-       protected function doPrecheck( array &$predicates ) {
-               $status = Status::newGood();
-               // Check if the source data is too big
-               if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
-                       $status->fatal( 'backend-fail-maxsize',
-                               $this->params['dst'], $this->backend->maxFileSizeInternal() );
-                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
-                       return $status;
-               // Check if a file can be placed at the destination
-               } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
-                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
-                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
-                       return $status;
-               }
-               // Check if destination file exists
-               $status->merge( $this->precheckDestExistence( $predicates ) );
-               if ( $status->isOK() ) {
-                       // Update file existence predicates
-                       $predicates['exists'][$this->params['dst']] = true;
-                       $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
-               }
-               return $status; // safe to call attempt()
-       }
-
-       /**
-        * @return Status
-        */
-       protected function doAttempt() {
-               if ( !$this->destSameAsSource ) {
-                       // Create the file at the destination
-                       return $this->backend->createInternal( $this->setFlags( $this->params ) );
-               }
-               return Status::newGood();
-       }
-
-       /**
-        * @return bool|String
-        */
-       protected function getSourceSha1Base36() {
-               return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
-       }
-
-       /**
-        * @return array
-        */
-       protected function doStoragePathsChanged() {
-               return array( $this->params['dst'] );
-       }
-}
-
-/**
- * Copy a file from one storage path to another in the backend.
- * Parameters similar to FileBackendStore::copyInternal(), which include:
- *     src           : source storage path
- *     dst           : destination storage path
- *     overwrite     : do nothing and pass if an identical file exists at destination
- *     overwriteSame : override any existing file at destination
- */
-class CopyFileOp extends FileOp {
-       /**
-        * @return array
-        */
-       protected function allowedParams() {
-               return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
-       }
-
-       /**
-        * @param $predicates array
-        * @return Status
-        */
-       protected function doPrecheck( array &$predicates ) {
-               $status = Status::newGood();
-               // Check if the source file exists
-               if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
-                       $status->fatal( 'backend-fail-notexists', $this->params['src'] );
-                       return $status;
-               // Check if a file can be placed at the destination
-               } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
-                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
-                       $status->fatal( 'backend-fail-copy', $this->params['src'], $this->params['dst'] );
-                       return $status;
-               }
-               // Check if destination file exists
-               $status->merge( $this->precheckDestExistence( $predicates ) );
-               if ( $status->isOK() ) {
-                       // Update file existence predicates
-                       $predicates['exists'][$this->params['dst']] = true;
-                       $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
-               }
-               return $status; // safe to call attempt()
-       }
-
-       /**
-        * @return Status
-        */
-       protected function doAttempt() {
-               // Do nothing if the src/dst paths are the same
-               if ( $this->params['src'] !== $this->params['dst'] ) {
-                       // Copy the file into the destination
-                       if ( !$this->destSameAsSource ) {
-                               return $this->backend->copyInternal( $this->setFlags( $this->params ) );
-                       }
-               }
-               return Status::newGood();
-       }
-
-       /**
-        * @return array
-        */
-       protected function doStoragePathsRead() {
-               return array( $this->params['src'] );
-       }
-
-       /**
-        * @return array
-        */
-       protected function doStoragePathsChanged() {
-               return array( $this->params['dst'] );
-       }
-}
-
-/**
- * Move a file from one storage path to another in the backend.
- * Parameters similar to FileBackendStore::moveInternal(), which include:
- *     src           : source storage path
- *     dst           : destination storage path
- *     overwrite     : do nothing and pass if an identical file exists at destination
- *     overwriteSame : override any existing file at destination
- */
-class MoveFileOp extends FileOp {
-       /**
-        * @return array
-        */
-       protected function allowedParams() {
-               return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
-       }
-
-       /**
-        * @param $predicates array
-        * @return Status
-        */
-       protected function doPrecheck( array &$predicates ) {
-               $status = Status::newGood();
-               // Check if the source file exists
-               if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
-                       $status->fatal( 'backend-fail-notexists', $this->params['src'] );
-                       return $status;
-               // Check if a file can be placed at the destination
-               } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
-                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
-                       $status->fatal( 'backend-fail-move', $this->params['src'], $this->params['dst'] );
-                       return $status;
-               }
-               // Check if destination file exists
-               $status->merge( $this->precheckDestExistence( $predicates ) );
-               if ( $status->isOK() ) {
-                       // Update file existence predicates
-                       $predicates['exists'][$this->params['src']] = false;
-                       $predicates['sha1'][$this->params['src']] = false;
-                       $predicates['exists'][$this->params['dst']] = true;
-                       $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
-               }
-               return $status; // safe to call attempt()
-       }
-
-       /**
-        * @return Status
-        */
-       protected function doAttempt() {
-               // Do nothing if the src/dst paths are the same
-               if ( $this->params['src'] !== $this->params['dst'] ) {
-                       if ( !$this->destSameAsSource ) {
-                               // Move the file into the destination
-                               return $this->backend->moveInternal( $this->setFlags( $this->params ) );
-                       } else {
-                               // Just delete source as the destination needs no changes
-                               $params = array( 'src' => $this->params['src'] );
-                               return $this->backend->deleteInternal( $this->setFlags( $params ) );
-                       }
-               }
-               return Status::newGood();
-       }
-
-       /**
-        * @return array
-        */
-       protected function doStoragePathsRead() {
-               return array( $this->params['src'] );
-       }
-
-       /**
-        * @return array
-        */
-       protected function doStoragePathsChanged() {
-               return array( $this->params['src'], $this->params['dst'] );
-       }
-}
-
-/**
- * Delete a file at the given storage path from the backend.
- * Parameters similar to FileBackendStore::deleteInternal(), which include:
- *     src                 : source storage path
- *     ignoreMissingSource : don't return an error if the file does not exist
- */
-class DeleteFileOp extends FileOp {
-       /**
-        * @return array
-        */
-       protected function allowedParams() {
-               return array( array( 'src' ), array( 'ignoreMissingSource' ) );
-       }
-
-       protected $needsDelete = true;
-
-       /**
-        * @param array $predicates
-        * @return Status
-        */
-       protected function doPrecheck( array &$predicates ) {
-               $status = Status::newGood();
-               // Check if the source file exists
-               if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
-                       if ( !$this->getParam( 'ignoreMissingSource' ) ) {
-                               $status->fatal( 'backend-fail-notexists', $this->params['src'] );
-                               return $status;
-                       }
-                       $this->needsDelete = false;
-               }
-               // Update file existence predicates
-               $predicates['exists'][$this->params['src']] = false;
-               $predicates['sha1'][$this->params['src']] = false;
-               return $status; // safe to call attempt()
-       }
-
-       /**
-        * @return Status
-        */
-       protected function doAttempt() {
-               if ( $this->needsDelete ) {
-                       // Delete the source file
-                       return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
-               }
-               return Status::newGood();
-       }
-
-       /**
-        * @return array
-        */
-       protected function doStoragePathsChanged() {
-               return array( $this->params['src'] );
-       }
-}
-
-/**
- * Placeholder operation that has no params and does nothing
- */
-class NullFileOp extends FileOp {}
diff --git a/includes/filerepo/backend/FileOpBatch.php b/includes/filerepo/backend/FileOpBatch.php
deleted file mode 100644 (file)
index d22a2ec..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-<?php
-/**
- * Helper class for representing batch file operations.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- * @author Aaron Schulz
- */
-
-/**
- * Helper class for representing batch file operations.
- * Do not use this class from places outside FileBackend.
- *
- * Methods should avoid throwing exceptions at all costs.
- *
- * @ingroup FileBackend
- * @since 1.20
- */
-class FileOpBatch {
-       /* Timeout related parameters */
-       const MAX_BATCH_SIZE = 1000; // integer
-
-       /**
-        * Attempt to perform a series of file operations.
-        * Callers are responsible for handling file locking.
-        *
-        * $opts is an array of options, including:
-        * 'force'        : Errors that would normally cause a rollback do not.
-        *                  The remaining operations are still attempted if any fail.
-        * 'allowStale'   : Don't require the latest available data.
-        *                  This can increase performance for non-critical writes.
-        *                  This has no effect unless the 'force' flag is set.
-        * 'nonJournaled' : Don't log this operation batch in the file journal.
-        * 'concurrency'  : Try to do this many operations in parallel when possible.
-        *
-        * The resulting Status will be "OK" unless:
-        *     a) unexpected operation errors occurred (network partitions, disk full...)
-        *     b) significant operation errors occured and 'force' was not set
-        *
-        * @param $performOps Array List of FileOp operations
-        * @param $opts Array Batch operation options
-        * @param $journal FileJournal Journal to log operations to
-        * @return Status
-        */
-       public static function attempt( array $performOps, array $opts, FileJournal $journal ) {
-               wfProfileIn( __METHOD__ );
-               $status = Status::newGood();
-
-               $n = count( $performOps );
-               if ( $n > self::MAX_BATCH_SIZE ) {
-                       $status->fatal( 'backend-fail-batchsize', $n, self::MAX_BATCH_SIZE );
-                       wfProfileOut( __METHOD__ );
-                       return $status;
-               }
-
-               $batchId = $journal->getTimestampedUUID();
-               $allowStale = !empty( $opts['allowStale'] );
-               $ignoreErrors = !empty( $opts['force'] );
-               $journaled = empty( $opts['nonJournaled'] );
-               $maxConcurrency = isset( $opts['concurrency'] ) ? $opts['concurrency'] : 1;
-
-               $entries = array(); // file journal entry list
-               $predicates = FileOp::newPredicates(); // account for previous ops in prechecks
-               $curBatch = array(); // concurrent FileOp sub-batch accumulation
-               $curBatchDeps = FileOp::newDependencies(); // paths used in FileOp sub-batch
-               $pPerformOps = array(); // ordered list of concurrent FileOp sub-batches
-               $lastBackend = null; // last op backend name
-               // Do pre-checks for each operation; abort on failure...
-               foreach ( $performOps as $index => $fileOp ) {
-                       $backendName = $fileOp->getBackend()->getName();
-                       $fileOp->setBatchId( $batchId ); // transaction ID
-                       $fileOp->allowStaleReads( $allowStale ); // consistency level
-                       // Decide if this op can be done concurrently within this sub-batch
-                       // or if a new concurrent sub-batch must be started after this one...
-                       if ( $fileOp->dependsOn( $curBatchDeps )
-                               || count( $curBatch ) >= $maxConcurrency
-                               || ( $backendName !== $lastBackend && count( $curBatch ) )
-                       ) {
-                               $pPerformOps[] = $curBatch; // push this batch
-                               $curBatch = array(); // start a new sub-batch
-                               $curBatchDeps = FileOp::newDependencies();
-                       }
-                       $lastBackend = $backendName;
-                       $curBatch[$index] = $fileOp; // keep index
-                       // Update list of affected paths in this batch
-                       $curBatchDeps = $fileOp->applyDependencies( $curBatchDeps );
-                       // Simulate performing the operation...
-                       $oldPredicates = $predicates;
-                       $subStatus = $fileOp->precheck( $predicates ); // updates $predicates
-                       $status->merge( $subStatus );
-                       if ( $subStatus->isOK() ) {
-                               if ( $journaled ) { // journal log entries
-                                       $entries = array_merge( $entries,
-                                               $fileOp->getJournalEntries( $oldPredicates, $predicates ) );
-                               }
-                       } else { // operation failed?
-                               $status->success[$index] = false;
-                               ++$status->failCount;
-                               if ( !$ignoreErrors ) {
-                                       wfProfileOut( __METHOD__ );
-                                       return $status; // abort
-                               }
-                       }
-               }
-               // Push the last sub-batch
-               if ( count( $curBatch ) ) {
-                       $pPerformOps[] = $curBatch;
-               }
-
-               // Log the operations in the file journal...
-               if ( count( $entries ) ) {
-                       $subStatus = $journal->logChangeBatch( $entries, $batchId );
-                       if ( !$subStatus->isOK() ) {
-                               wfProfileOut( __METHOD__ );
-                               return $subStatus; // abort
-                       }
-               }
-
-               if ( $ignoreErrors ) { // treat precheck() fatals as mere warnings
-                       $status->setResult( true, $status->value );
-               }
-
-               // Attempt each operation (in parallel if allowed and possible)...
-               if ( count( $pPerformOps ) < count( $performOps ) ) {
-                       self::runBatchParallel( $pPerformOps, $status );
-               } else {
-                       self::runBatchSeries( $performOps, $status );
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * Attempt a list of file operations in series.
-        * This will abort remaining ops on failure.
-        *
-        * @param $performOps Array
-        * @param $status Status
-        * @return bool Success
-        */
-       protected static function runBatchSeries( array $performOps, Status $status ) {
-               foreach ( $performOps as $index => $fileOp ) {
-                       if ( $fileOp->failed() ) {
-                               continue; // nothing to do
-                       }
-                       $subStatus = $fileOp->attempt();
-                       $status->merge( $subStatus );
-                       if ( $subStatus->isOK() ) {
-                               $status->success[$index] = true;
-                               ++$status->successCount;
-                       } else {
-                               $status->success[$index] = false;
-                               ++$status->failCount;
-                               // We can't continue (even with $ignoreErrors) as $predicates is wrong.
-                               // Log the remaining ops as failed for recovery...
-                               for ( $i = ($index + 1); $i < count( $performOps ); $i++ ) {
-                                       $performOps[$i]->logFailure( 'attempt_aborted' );
-                               }
-                               return false; // bail out
-                       }
-               }
-               return true;
-       }
-
-       /**
-        * Attempt a list of file operations sub-batches in series.
-        *
-        * The operations *in* each sub-batch will be done in parallel.
-        * The caller is responsible for making sure the operations
-        * within any given sub-batch do not depend on each other.
-        * This will abort remaining ops on failure.
-        *
-        * @param $pPerformOps Array
-        * @param $status Status
-        * @return bool Success
-        */
-       protected static function runBatchParallel( array $pPerformOps, Status $status ) {
-               $aborted = false;
-               foreach ( $pPerformOps as $performOpsBatch ) {
-                       if ( $aborted ) { // check batch op abort flag...
-                               // We can't continue (even with $ignoreErrors) as $predicates is wrong.
-                               // Log the remaining ops as failed for recovery...
-                               foreach ( $performOpsBatch as $i => $fileOp ) {
-                                       $performOpsBatch[$i]->logFailure( 'attempt_aborted' );
-                               }
-                               continue;
-                       }
-                       $statuses = array();
-                       $opHandles = array();
-                       // Get the backend; all sub-batch ops belong to a single backend
-                       $backend = reset( $performOpsBatch )->getBackend();
-                       // If attemptAsync() returns synchronously, it was either an
-                       // error Status or the backend just doesn't support async ops.
-                       foreach ( $performOpsBatch as $i => $fileOp ) {
-                               if ( !$fileOp->failed() ) { // failed => already has Status
-                                       $subStatus = $fileOp->attemptAsync();
-                                       if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
-                                               $opHandles[$i] = $subStatus->value; // deferred
-                                       } else {
-                                               $statuses[$i] = $subStatus; // done already
-                                       }
-                               }
-                       }
-                       // Try to do all the operations concurrently...
-                       $statuses = $statuses + $backend->executeOpHandlesInternal( $opHandles );
-                       // Marshall and merge all the responses (blocking)...
-                       foreach ( $performOpsBatch as $i => $fileOp ) {
-                               if ( !$fileOp->failed() ) { // failed => already has Status
-                                       $subStatus = $statuses[$i];
-                                       $status->merge( $subStatus );
-                                       if ( $subStatus->isOK() ) {
-                                               $status->success[$i] = true;
-                                               ++$status->successCount;
-                                       } else {
-                                               $status->success[$i] = false;
-                                               ++$status->failCount;
-                                               $aborted = true; // set abort flag; we can't continue
-                                       }
-                               }
-                       }
-               }
-               return $status;
-       }
-}
diff --git a/includes/filerepo/backend/SwiftFileBackend.php b/includes/filerepo/backend/SwiftFileBackend.php
deleted file mode 100644 (file)
index 2b10917..0000000
+++ /dev/null
@@ -1,1366 +0,0 @@
-<?php
-/**
- * OpenStack Swift based file backend.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- * @author Russ Nelson
- * @author Aaron Schulz
- */
-
-/**
- * @brief Class for an OpenStack Swift based file backend.
- *
- * This requires the SwiftCloudFiles MediaWiki extension, which includes
- * the php-cloudfiles library (https://github.com/rackspace/php-cloudfiles).
- * php-cloudfiles requires the curl, fileinfo, and mb_string PHP extensions.
- *
- * Status messages should avoid mentioning the Swift account name.
- * Likewise, error suppression should be used to avoid path disclosure.
- *
- * @ingroup FileBackend
- * @since 1.19
- */
-class SwiftFileBackend extends FileBackendStore {
-       /** @var CF_Authentication */
-       protected $auth; // Swift authentication handler
-       protected $authTTL; // integer seconds
-       protected $swiftAnonUser; // string; username to handle unauthenticated requests
-       protected $swiftUseCDN; // boolean; whether CloudFiles CDN is enabled
-       protected $swiftCDNExpiry; // integer; how long to cache things in the CDN
-       protected $swiftCDNPurgable; // boolean; whether object CDN purging is enabled
-
-       protected $maxContCacheSize = 300; // integer; max containers with entries
-
-       /** @var CF_Connection */
-       protected $conn; // Swift connection handle
-       protected $connStarted = 0; // integer UNIX timestamp
-       protected $connContainers = array(); // container object cache
-       protected $connException; // CloudFiles exception
-
-       /**
-        * @see FileBackendStore::__construct()
-        * Additional $config params include:
-        *    swiftAuthUrl       : Swift authentication server URL
-        *    swiftUser          : Swift user used by MediaWiki (account:username)
-        *    swiftKey           : Swift authentication key for the above user
-        *    swiftAuthTTL       : Swift authentication TTL (seconds)
-        *    swiftAnonUser      : Swift user used for end-user requests (account:username)
-        *    swiftUseCDN        : Whether a Cloud Files Content Delivery Network is set up
-        *    swiftCDNExpiry     : How long (in seconds) to store content in the CDN.
-        *                         If files may likely change, this should probably not exceed
-        *                         a few days. For example, deletions may take this long to apply.
-        *                         If object purging is enabled, however, this is not an issue.
-        *    swiftCDNPurgable   : Whether object purge requests are allowed by the CDN.
-        *    shardViaHashLevels : Map of container names to sharding config with:
-        *                         'base'   : base of hash characters, 16 or 36
-        *                         'levels' : the number of hash levels (and digits)
-        *                         'repeat' : hash subdirectories are prefixed with all the
-        *                                    parent hash directory names (e.g. "a/ab/abc")
-        */
-       public function __construct( array $config ) {
-               parent::__construct( $config );
-               if ( !MWInit::classExists( 'CF_Constants' ) ) {
-                       throw new MWException( 'SwiftCloudFiles extension not installed.' );
-               }
-               // Required settings
-               $this->auth = new CF_Authentication(
-                       $config['swiftUser'],
-                       $config['swiftKey'],
-                       null, // account; unused
-                       $config['swiftAuthUrl']
-               );
-               // Optional settings
-               $this->authTTL = isset( $config['swiftAuthTTL'] )
-                       ? $config['swiftAuthTTL']
-                       : 5 * 60; // some sane number
-               $this->swiftAnonUser = isset( $config['swiftAnonUser'] )
-                       ? $config['swiftAnonUser']
-                       : '';
-               $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
-                       ? $config['shardViaHashLevels']
-                       : '';
-               $this->swiftUseCDN = isset( $config['swiftUseCDN'] )
-                       ? $config['swiftUseCDN']
-                       : false;
-               $this->swiftCDNExpiry = isset( $config['swiftCDNExpiry'] )
-                       ? $config['swiftCDNExpiry']
-                       : 3600; // hour
-               $this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
-                       ? $config['swiftCDNPurgable']
-                       : true;
-               // Cache container info to mask latency
-               $this->memCache = wfGetMainCache();
-       }
-
-       /**
-        * @see FileBackendStore::resolveContainerPath()
-        * @return null
-        */
-       protected function resolveContainerPath( $container, $relStoragePath ) {
-               if ( strlen( urlencode( $relStoragePath ) ) > 1024 ) {
-                       return null; // too long for Swift
-               }
-               return $relStoragePath;
-       }
-
-       /**
-        * @see FileBackendStore::isPathUsableInternal()
-        * @return bool
-        */
-       public function isPathUsableInternal( $storagePath ) {
-               list( $container, $rel ) = $this->resolveStoragePathReal( $storagePath );
-               if ( $rel === null ) {
-                       return false; // invalid
-               }
-
-               try {
-                       $this->getContainer( $container );
-                       return true; // container exists
-               } catch ( NoSuchContainerException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__, array( 'path' => $storagePath ) );
-               }
-
-               return false;
-       }
-
-       /**
-        * @see FileBackendStore::doCreateInternal()
-        * @return Status
-        */
-       protected function doCreateInternal( array $params ) {
-               $status = Status::newGood();
-
-               list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
-               if ( $dstRel === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
-                       return $status;
-               }
-
-               // (a) Check the destination container and object
-               try {
-                       $dContObj = $this->getContainer( $dstCont );
-                       if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
-                       {
-                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
-                               return $status;
-                       }
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-create', $params['dst'] );
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-                       return $status;
-               }
-
-               // (b) Get a SHA-1 hash of the object
-               $sha1Hash = wfBaseConvert( sha1( $params['content'] ), 16, 36, 31 );
-
-               // (c) Actually create the object
-               try {
-                       // Create a fresh CF_Object with no fields preloaded.
-                       // We don't want to preserve headers, metadata, and such.
-                       $obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
-                       // Note: metadata keys stored as [Upper case char][[Lower case char]...]
-                       $obj->metadata = array( 'Sha1base36' => $sha1Hash );
-                       // Manually set the ETag (https://github.com/rackspace/php-cloudfiles/issues/59).
-                       // The MD5 here will be checked within Swift against its own MD5.
-                       $obj->set_etag( md5( $params['content'] ) );
-                       // Use the same content type as StreamFile for security
-                       $obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               $handle = $obj->write_async( $params['content'] );
-                               $status->value = new SwiftFileOpHandle( $this, $params, 'Create', $handle );
-                               $status->value->affectedObjects[] = $obj;
-                       } else { // actually write the object in Swift
-                               $obj->write( $params['content'] );
-                               $this->purgeCDNCache( array( $obj ) );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( BadContentTypeException $e ) {
-                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseCreate( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( BadContentTypeException $e ) {
-                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doStoreInternal()
-        * @return Status
-        */
-       protected function doStoreInternal( array $params ) {
-               $status = Status::newGood();
-
-               list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
-               if ( $dstRel === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
-                       return $status;
-               }
-
-               // (a) Check the destination container and object
-               try {
-                       $dContObj = $this->getContainer( $dstCont );
-                       if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
-                       {
-                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
-                               return $status;
-                       }
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-                       return $status;
-               }
-
-               // (b) Get a SHA-1 hash of the object
-               $sha1Hash = sha1_file( $params['src'] );
-               if ( $sha1Hash === false ) { // source doesn't exist?
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                       return $status;
-               }
-               $sha1Hash = wfBaseConvert( $sha1Hash, 16, 36, 31 );
-
-               // (c) Actually store the object
-               try {
-                       // Create a fresh CF_Object with no fields preloaded.
-                       // We don't want to preserve headers, metadata, and such.
-                       $obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
-                       // Note: metadata keys stored as [Upper case char][[Lower case char]...]
-                       $obj->metadata = array( 'Sha1base36' => $sha1Hash );
-                       // The MD5 here will be checked within Swift against its own MD5.
-                       $obj->set_etag( md5_file( $params['src'] ) );
-                       // Use the same content type as StreamFile for security
-                       $obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               wfSuppressWarnings();
-                               $fp = fopen( $params['src'], 'rb' );
-                               wfRestoreWarnings();
-                               if ( !$fp ) {
-                                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                               } else {
-                                       $handle = $obj->write_async( $fp, filesize( $params['src'] ), true );
-                                       $status->value = new SwiftFileOpHandle( $this, $params, 'Store', $handle );
-                                       $status->value->resourcesToClose[] = $fp;
-                                       $status->value->affectedObjects[] = $obj;
-                               }
-                       } else { // actually write the object in Swift
-                               $obj->load_from_filename( $params['src'], true ); // calls $obj->write()
-                               $this->purgeCDNCache( array( $obj ) );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( BadContentTypeException $e ) {
-                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
-               } catch ( IOException $e ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseStore( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( BadContentTypeException $e ) {
-                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
-               } catch ( IOException $e ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doCopyInternal()
-        * @return Status
-        */
-       protected function doCopyInternal( array $params ) {
-               $status = Status::newGood();
-
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
-                       return $status;
-               }
-
-               list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
-               if ( $dstRel === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
-                       return $status;
-               }
-
-               // (a) Check the source/destination containers and destination object
-               try {
-                       $sContObj = $this->getContainer( $srcCont );
-                       $dContObj = $this->getContainer( $dstCont );
-                       if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
-                       {
-                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
-                               return $status;
-                       }
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-                       return $status;
-               }
-
-               // (b) Actually copy the file to the destination
-               try {
-                       $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               $handle = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel );
-                               $status->value = new SwiftFileOpHandle( $this, $params, 'Copy', $handle );
-                               $status->value->affectedObjects[] = $dstObj;
-                       } else { // actually write the object in Swift
-                               $sContObj->copy_object_to( $srcRel, $dContObj, $dstRel );
-                               $this->purgeCDNCache( array( $dstObj ) );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( NoSuchObjectException $e ) { // source object does not exist
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseCopy( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( NoSuchObjectException $e ) { // source object does not exist
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doMoveInternal()
-        * @return Status
-        */
-       protected function doMoveInternal( array $params ) {
-               $status = Status::newGood();
-
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
-                       return $status;
-               }
-
-               list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
-               if ( $dstRel === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
-                       return $status;
-               }
-
-               // (a) Check the source/destination containers and destination object
-               try {
-                       $sContObj = $this->getContainer( $srcCont );
-                       $dContObj = $this->getContainer( $dstCont );
-                       if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
-                       {
-                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
-                               return $status;
-                       }
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-                       return $status;
-               }
-
-               // (b) Actually move the file to the destination
-               try {
-                       $srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                       $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               $handle = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel );
-                               $status->value = new SwiftFileOpHandle( $this, $params, 'Move', $handle );
-                               $status->value->affectedObjects[] = $srcObj;
-                               $status->value->affectedObjects[] = $dstObj;
-                       } else { // actually write the object in Swift
-                               $sContObj->move_object_to( $srcRel, $dContObj, $dstRel );
-                               $this->purgeCDNCache( array( $srcObj, $dstObj ) );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( NoSuchObjectException $e ) { // source object does not exist
-                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseMove( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( NoSuchObjectException $e ) { // source object does not exist
-                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doDeleteInternal()
-        * @return Status
-        */
-       protected function doDeleteInternal( array $params ) {
-               $status = Status::newGood();
-
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
-                       return $status;
-               }
-
-               try {
-                       $sContObj = $this->getContainer( $srcCont );
-                       $srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               $handle = $sContObj->delete_object_async( $srcRel );
-                               $status->value = new SwiftFileOpHandle( $this, $params, 'Delete', $handle );
-                               $status->value->affectedObjects[] = $srcObj;
-                       } else { // actually write the object in Swift
-                               $sContObj->delete_object( $srcRel );
-                               $this->purgeCDNCache( array( $srcObj ) );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-delete', $params['src'] );
-               } catch ( NoSuchObjectException $e ) {
-                       if ( empty( $params['ignoreMissingSource'] ) ) {
-                               $status->fatal( 'backend-fail-delete', $params['src'] );
-                       }
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function _getResponseDelete( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-delete', $params['src'] );
-               } catch ( NoSuchObjectException $e ) {
-                       if ( empty( $params['ignoreMissingSource'] ) ) {
-                               $status->fatal( 'backend-fail-delete', $params['src'] );
-                       }
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doPrepareInternal()
-        * @return Status
-        */
-       protected function doPrepareInternal( $fullCont, $dir, array $params ) {
-               $status = Status::newGood();
-
-               // (a) Check if container already exists
-               try {
-                       $contObj = $this->getContainer( $fullCont );
-                       // NoSuchContainerException not thrown: container must exist
-                       return $status; // already exists
-               } catch ( NoSuchContainerException $e ) {
-                       // NoSuchContainerException thrown: container does not exist
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-                       return $status;
-               }
-
-               // (b) Create container as needed
-               try {
-                       $contObj = $this->createContainer( $fullCont );
-                       // Make container public to end-users...
-                       if ( $this->swiftAnonUser != '' ) {
-                               $status->merge( $this->setContainerAccess(
-                                       $contObj,
-                                       array( $this->auth->username, $this->swiftAnonUser ), // read
-                                       array( $this->auth->username ) // write
-                               ) );
-                       }
-                       if ( $this->swiftUseCDN ) { // Rackspace style CDN
-                               $contObj->make_public( $this->swiftCDNExpiry );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-                       return $status;
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::doSecureInternal()
-        * @return Status
-        */
-       protected function doSecureInternal( $fullCont, $dir, array $params ) {
-               $status = Status::newGood();
-
-               // Restrict container from end-users...
-               try {
-                       // doPrepareInternal() should have been called,
-                       // so the Swift container should already exist...
-                       $contObj = $this->getContainer( $fullCont ); // normally a cache hit
-                       // NoSuchContainerException not thrown: container must exist
-
-                       // Make container private to end-users...
-                       if ( $this->swiftAnonUser != '' && !isset( $contObj->mw_wasSecured ) ) {
-                               $status->merge( $this->setContainerAccess(
-                                       $contObj,
-                                       array( $this->auth->username ), // read
-                                       array( $this->auth->username ) // write
-                               ) );
-                               // @TODO: when php-cloudfiles supports container
-                               // metadata, we can make use of that to avoid RTTs
-                               $contObj->mw_wasSecured = true; // avoid useless RTTs
-                       }
-                       if ( $this->swiftUseCDN && $contObj->is_public() ) { // Rackspace style CDN
-                               $contObj->make_private();
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::doCleanInternal()
-        * @return Status
-        */
-       protected function doCleanInternal( $fullCont, $dir, array $params ) {
-               $status = Status::newGood();
-
-               // Only containers themselves can be removed, all else is virtual
-               if ( $dir != '' ) {
-                       return $status; // nothing to do
-               }
-
-               // (a) Check the container
-               try {
-                       $contObj = $this->getContainer( $fullCont, true );
-               } catch ( NoSuchContainerException $e ) {
-                       return $status; // ok, nothing to do
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-                       return $status;
-               }
-
-               // (b) Delete the container if empty
-               if ( $contObj->object_count == 0 ) {
-                       try {
-                               $this->deleteContainer( $fullCont );
-                       } catch ( NoSuchContainerException $e ) {
-                               return $status; // race?
-                       } catch ( NonEmptyContainerException $e ) {
-                               return $status; // race? consistency delay?
-                       } catch ( CloudFilesException $e ) { // some other exception?
-                               $this->handleException( $e, $status, __METHOD__, $params );
-                               return $status;
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::doFileExists()
-        * @return array|bool|null
-        */
-       protected function doGetFileStat( array $params ) {
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       return false; // invalid storage path
-               }
-
-               $stat = false;
-               try {
-                       $contObj = $this->getContainer( $srcCont );
-                       $srcObj = $contObj->get_object( $srcRel, $this->headersFromParams( $params ) );
-                       $this->addMissingMetadata( $srcObj, $params['src'] );
-                       $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->metadata['Sha1base36']
-                       );
-               } catch ( NoSuchContainerException $e ) {
-               } catch ( NoSuchObjectException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $stat = null;
-                       $this->handleException( $e, null, __METHOD__, $params );
-               }
-
-               return $stat;
-       }
-
-       /**
-        * Fill in any missing object metadata and save it to Swift
-        *
-        * @param $obj CF_Object
-        * @param $path string Storage path to object
-        * @return bool Success
-        * @throws Exception cloudfiles exceptions
-        */
-       protected function addMissingMetadata( CF_Object $obj, $path ) {
-               if ( isset( $obj->metadata['Sha1base36'] ) ) {
-                       return true; // nothing to do
-               }
-               $status = Status::newGood();
-               $scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
-               if ( $status->isOK() ) {
-                       # Do not stat the file in getLocalCopy() to avoid infinite loops
-                       $tmpFile = $this->getLocalCopy( array( 'src' => $path, 'latest' => 1, 'nostat' => 1 ) );
-                       if ( $tmpFile ) {
-                               $hash = $tmpFile->getSha1Base36();
-                               if ( $hash !== false ) {
-                                       $obj->metadata['Sha1base36'] = $hash;
-                                       $obj->sync_metadata(); // save to Swift
-                                       return true; // success
-                               }
-                       }
-               }
-               $obj->metadata['Sha1base36'] = false;
-               return false; // failed
-       }
-
-       /**
-        * @see FileBackend::getFileContents()
-        * @return bool|null|string
-        */
-       public function getFileContents( array $params ) {
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       return false; // invalid storage path
-               }
-
-               if ( !$this->fileExists( $params ) ) {
-                       return null;
-               }
-
-               $data = false;
-               try {
-                       $sContObj = $this->getContainer( $srcCont );
-                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                       $data = $obj->read( $this->headersFromParams( $params ) );
-               } catch ( NoSuchContainerException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__, $params );
-               }
-
-               return $data;
-       }
-
-       /**
-        * @see FileBackendStore::doDirectoryExists()
-        * @return bool|null
-        */
-       protected function doDirectoryExists( $fullCont, $dir, array $params ) {
-               try {
-                       $container = $this->getContainer( $fullCont );
-                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
-                       return ( count( $container->list_objects( 1, null, $prefix ) ) > 0 );
-               } catch ( NoSuchContainerException $e ) {
-                       return false;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__,
-                               array( 'cont' => $fullCont, 'dir' => $dir ) );
-               }
-
-               return null; // error
-       }
-
-       /**
-        * @see FileBackendStore::getDirectoryListInternal()
-        * @return SwiftFileBackendDirList
-        */
-       public function getDirectoryListInternal( $fullCont, $dir, array $params ) {
-               return new SwiftFileBackendDirList( $this, $fullCont, $dir, $params );
-       }
-
-       /**
-        * @see FileBackendStore::getFileListInternal()
-        * @return SwiftFileBackendFileList
-        */
-       public function getFileListInternal( $fullCont, $dir, array $params ) {
-               return new SwiftFileBackendFileList( $this, $fullCont, $dir, $params );
-       }
-
-       /**
-        * Do not call this function outside of SwiftFileBackendFileList
-        *
-        * @param $fullCont string Resolved container name
-        * @param $dir string Resolved storage directory with no trailing slash
-        * @param $after string|null Storage path of file to list items after
-        * @param $limit integer Max number of items to list
-        * @param $params Array Includes flag for 'topOnly'
-        * @return Array List of relative paths of dirs directly under $dir
-        */
-       public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
-               $dirs = array();
-               if ( $after === INF ) {
-                       return $dirs; // nothing more
-               }
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-
-               try {
-                       $container = $this->getContainer( $fullCont );
-                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
-                       // Non-recursive: only list dirs right under $dir
-                       if ( !empty( $params['topOnly'] ) ) {
-                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
-                               foreach ( $objects as $object ) { // files and dirs
-                                       if ( substr( $object, -1 ) === '/' ) {
-                                               $dirs[] = $object; // directories end in '/'
-                                       }
-                               }
-                       // Recursive: list all dirs under $dir and its subdirs
-                       } else {
-                               // Get directory from last item of prior page
-                               $lastDir = $this->getParentDir( $after ); // must be first page
-                               $objects = $container->list_objects( $limit, $after, $prefix );
-                               foreach ( $objects as $object ) { // files
-                                       $objectDir = $this->getParentDir( $object ); // directory of object
-                                       if ( $objectDir !== false ) { // file has a parent dir
-                                               // Swift stores paths in UTF-8, using binary sorting.
-                                               // See function "create_container_table" in common/db.py.
-                                               // If a directory is not "greater" than the last one,
-                                               // then it was already listed by the calling iterator.
-                                               if ( $objectDir > $lastDir ) {
-                                                       $pDir = $objectDir;
-                                                       do { // add dir and all its parent dirs
-                                                               $dirs[] = "{$pDir}/";
-                                                               $pDir = $this->getParentDir( $pDir );
-                                                       } while ( $pDir !== false // sanity
-                                                               && $pDir > $lastDir // not done already
-                                                               && strlen( $pDir ) > strlen( $dir ) // within $dir
-                                                       );
-                                               }
-                                               $lastDir = $objectDir;
-                                       }
-                               }
-                       }
-                       if ( count( $objects ) < $limit ) {
-                               $after = INF; // avoid a second RTT
-                       } else {
-                               $after = end( $objects ); // update last item
-                       }
-               } catch ( NoSuchContainerException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__,
-                               array( 'cont' => $fullCont, 'dir' => $dir ) );
-               }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               return $dirs;
-       }
-
-       protected function getParentDir( $path ) {
-               return ( strpos( $path, '/' ) !== false ) ? dirname( $path ) : false;
-       }
-
-       /**
-        * Do not call this function outside of SwiftFileBackendFileList
-        *
-        * @param $fullCont string Resolved container name
-        * @param $dir string Resolved storage directory with no trailing slash
-        * @param $after string|null Storage path of file to list items after
-        * @param $limit integer Max number of items to list
-        * @param $params Array Includes flag for 'topOnly'
-        * @return Array List of relative paths of files under $dir
-        */
-       public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
-               $files = array();
-               if ( $after === INF ) {
-                       return $files; // nothing more
-               }
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-
-               try {
-                       $container = $this->getContainer( $fullCont );
-                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
-                       // Non-recursive: only list files right under $dir
-                       if ( !empty( $params['topOnly'] ) ) { // files and dirs
-                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
-                               foreach ( $objects as $object ) {
-                                       if ( substr( $object, -1 ) !== '/' ) {
-                                               $files[] = $object; // directories end in '/'
-                                       }
-                               }
-                       // Recursive: list all files under $dir and its subdirs
-                       } else { // files
-                               $objects = $container->list_objects( $limit, $after, $prefix );
-                               $files = $objects;
-                       }
-                       if ( count( $objects ) < $limit ) {
-                               $after = INF; // avoid a second RTT
-                       } else {
-                               $after = end( $objects ); // update last item
-                       }
-               } catch ( NoSuchContainerException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__,
-                               array( 'cont' => $fullCont, 'dir' => $dir ) );
-               }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               return $files;
-       }
-
-       /**
-        * @see FileBackendStore::doGetFileSha1base36()
-        * @return bool
-        */
-       protected function doGetFileSha1base36( array $params ) {
-               $stat = $this->getFileStat( $params );
-               if ( $stat ) {
-                       return $stat['sha1'];
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * @see FileBackendStore::doStreamFile()
-        * @return Status
-        */
-       protected function doStreamFile( array $params ) {
-               $status = Status::newGood();
-
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
-               }
-
-               try {
-                       $cont = $this->getContainer( $srcCont );
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-stream', $params['src'] );
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-                       return $status;
-               }
-
-               try {
-                       $output = fopen( 'php://output', 'wb' );
-                       $obj = new CF_Object( $cont, $srcRel, false, false ); // skip HEAD
-                       $obj->stream( $output, $this->headersFromParams( $params ) );
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FileBackendStore::getLocalCopy()
-        * @return null|TempFSFile
-        */
-       public function getLocalCopy( array $params ) {
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       return null;
-               }
-
-               # Check the recursion guard to avoid loops when filling metadata
-               if ( empty( $params['nostat'] ) && !$this->fileExists( $params ) ) {
-                       return null;
-               }
-
-               $tmpFile = null;
-               try {
-                       $sContObj = $this->getContainer( $srcCont );
-                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                       // Get source file extension
-                       $ext = FileBackend::extensionFromPath( $srcRel );
-                       // Create a new temporary file...
-                       $tmpFile = TempFSFile::factory( wfBaseName( $srcRel ) . '_', $ext );
-                       if ( $tmpFile ) {
-                               $handle = fopen( $tmpFile->getPath(), 'wb' );
-                               if ( $handle ) {
-                                       $obj->stream( $handle, $this->headersFromParams( $params ) );
-                                       fclose( $handle );
-                               } else {
-                                       $tmpFile = null; // couldn't open temp file
-                               }
-                       }
-               } catch ( NoSuchContainerException $e ) {
-                       $tmpFile = null;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $tmpFile = null;
-                       $this->handleException( $e, null, __METHOD__, $params );
-               }
-
-               return $tmpFile;
-       }
-
-       /**
-        * @see FileBackendStore::directoriesAreVirtual()
-        * @return bool
-        */
-       protected function directoriesAreVirtual() {
-               return true;
-       }
-
-       /**
-        * Get headers to send to Swift when reading a file based
-        * on a FileBackend params array, e.g. that of getLocalCopy().
-        * $params is currently only checked for a 'latest' flag.
-        *
-        * @param $params Array
-        * @return Array
-        */
-       protected function headersFromParams( array $params ) {
-               $hdrs = array();
-               if ( !empty( $params['latest'] ) ) {
-                       $hdrs[] = 'X-Newest: true';
-               }
-               return $hdrs;
-       }
-
-       /**
-        * @see FileBackendStore::doExecuteOpHandlesInternal()
-        * @return Array List of corresponding Status objects
-        */
-       protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
-               $statuses = array();
-
-               $cfOps = array(); // list of CF_Async_Op objects
-               foreach ( $fileOpHandles as $index => $fileOpHandle ) {
-                       $cfOps[$index] = $fileOpHandle->cfOp;
-               }
-               $batch = new CF_Async_Op_Batch( $cfOps );
-
-               $cfOps = $batch->execute();
-               foreach ( $cfOps as $index => $cfOp ) {
-                       $status = Status::newGood();
-                       try { // catch exceptions; update status
-                               $function = '_getResponse' . $fileOpHandles[$index]->call;
-                               $this->$function( $cfOp, $status, $fileOpHandles[$index]->params );
-                               $this->purgeCDNCache( $fileOpHandles[$index]->affectedObjects );
-                       } catch ( CloudFilesException $e ) { // some other exception?
-                               $this->handleException( $e, $status,
-                                       __CLASS__ . ":$function", $fileOpHandles[$index]->params );
-                       }
-                       $statuses[$index] = $status;
-               }
-
-               return $statuses;
-       }
-
-       /**
-        * Set read/write permissions for a Swift container
-        *
-        * @param $contObj CF_Container Swift container
-        * @param $readGrps Array Swift users who can read (account:user)
-        * @param $writeGrps Array Swift users who can write (account:user)
-        * @return Status
-        */
-       protected function setContainerAccess(
-               CF_Container $contObj, array $readGrps, array $writeGrps
-       ) {
-               $creds = $contObj->cfs_auth->export_credentials();
-
-               $url = $creds['storage_url'] . '/' . rawurlencode( $contObj->name );
-
-               // Note: 10 second timeout consistent with php-cloudfiles
-               $req = new CurlHttpRequest( $url, array( 'method' => 'POST', 'timeout' => 10 ) );
-               $req->setHeader( 'X-Auth-Token', $creds['auth_token'] );
-               $req->setHeader( 'X-Container-Read', implode( ',', $readGrps ) );
-               $req->setHeader( 'X-Container-Write', implode( ',', $writeGrps ) );
-
-               return $req->execute(); // should return 204
-       }
-
-       /**
-        * Purge the CDN cache of affected objects if CDN caching is enabled.
-        * This is for Rackspace/Akamai CDNs.
-        *
-        * @param $objects Array List of CF_Object items
-        * @return void
-        */
-       public function purgeCDNCache( array $objects ) {
-               if ( $this->swiftUseCDN && $this->swiftCDNPurgable ) {
-                       foreach ( $objects as $object ) {
-                               try {
-                                       $object->purge_from_cdn();
-                               } catch ( CDNNotEnabledException $e ) {
-                                       // CDN not enabled; nothing to see here
-                               } catch ( CloudFilesException $e ) {
-                                       $this->handleException( $e, null, __METHOD__,
-                                               array( 'cont' => $object->container->name, 'obj' => $object->name ) );
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Get a connection to the Swift proxy
-        *
-        * @return CF_Connection|bool False on failure
-        * @throws CloudFilesException
-        */
-       protected function getConnection() {
-               if ( $this->connException instanceof Exception ) {
-                       throw $this->connException; // failed last attempt
-               }
-               // Session keys expire after a while, so we renew them periodically
-               if ( $this->conn && ( time() - $this->connStarted ) > $this->authTTL ) {
-                       $this->conn->close(); // close active cURL connections
-                       $this->conn = null;
-               }
-               // Authenticate with proxy and get a session key...
-               if ( !$this->conn ) {
-                       $this->connStarted = 0;
-                       $this->connContainers = array();
-                       try {
-                               $this->auth->authenticate();
-                               $this->conn = new CF_Connection( $this->auth );
-                               $this->connStarted = time();
-                       } catch ( CloudFilesException $e ) {
-                               $this->connException = $e; // don't keep re-trying
-                               throw $e; // throw it back
-                       }
-               }
-               return $this->conn;
-       }
-
-       /**
-        * @see FileBackendStore::doClearCache()
-        */
-       protected function doClearCache( array $paths = null ) {
-               $this->connContainers = array(); // clear container object cache
-       }
-
-       /**
-        * Get a Swift container object, possibly from process cache.
-        * Use $reCache if the file count or byte count is needed.
-        *
-        * @param $container string Container name
-        * @param $bypassCache bool Bypass all caches and load from Swift
-        * @return CF_Container
-        * @throws CloudFilesException
-        */
-       protected function getContainer( $container, $bypassCache = false ) {
-               $conn = $this->getConnection(); // Swift proxy connection
-               if ( $bypassCache ) { // purge cache
-                       unset( $this->connContainers[$container] );
-               } elseif ( !isset( $this->connContainers[$container] ) ) {
-                       $this->primeContainerCache( array( $container ) ); // check persistent cache
-               }
-               if ( !isset( $this->connContainers[$container] ) ) {
-                       $contObj = $conn->get_container( $container );
-                       // NoSuchContainerException not thrown: container must exist
-                       if ( count( $this->connContainers ) >= $this->maxContCacheSize ) { // trim cache?
-                               reset( $this->connContainers );
-                               unset( $this->connContainers[key( $this->connContainers )] );
-                       }
-                       $this->connContainers[$container] = $contObj; // cache it
-                       if ( !$bypassCache ) {
-                               $this->setContainerCache( $container, // update persistent cache
-                                       array( 'bytes' => $contObj->bytes_used, 'count' => $contObj->object_count )
-                               );
-                       }
-               }
-               return $this->connContainers[$container];
-       }
-
-       /**
-        * Create a Swift container
-        *
-        * @param $container string Container name
-        * @return CF_Container
-        * @throws CloudFilesException
-        */
-       protected function createContainer( $container ) {
-               $conn = $this->getConnection(); // Swift proxy connection
-               $contObj = $conn->create_container( $container );
-               $this->connContainers[$container] = $contObj; // cache it
-               return $contObj;
-       }
-
-       /**
-        * Delete a Swift container
-        *
-        * @param $container string Container name
-        * @return void
-        * @throws CloudFilesException
-        */
-       protected function deleteContainer( $container ) {
-               $conn = $this->getConnection(); // Swift proxy connection
-               unset( $this->connContainers[$container] ); // purge cache
-               $conn->delete_container( $container );
-       }
-
-       /**
-        * @see FileBackendStore::doPrimeContainerCache()
-        * @return void
-        */
-       protected function doPrimeContainerCache( array $containerInfo ) {
-               try {
-                       $conn = $this->getConnection(); // Swift proxy connection
-                       foreach ( $containerInfo as $container => $info ) {
-                               $this->connContainers[$container] = new CF_Container(
-                                       $conn->cfs_auth,
-                                       $conn->cfs_http,
-                                       $container,
-                                       $info['count'],
-                                       $info['bytes']
-                               );
-                       }
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__, array() );
-               }
-       }
-
-       /**
-        * Log an unexpected exception for this backend.
-        * This also sets the Status object to have a fatal error.
-        *
-        * @param $e Exception
-        * @param $status Status|null
-        * @param $func string
-        * @param $params Array
-        * @return void
-        */
-       protected function handleException( Exception $e, $status, $func, array $params ) {
-               if ( $status instanceof Status ) {
-                       if ( $e instanceof AuthenticationException ) {
-                               $status->fatal( 'backend-fail-connect', $this->name );
-                       } else {
-                               $status->fatal( 'backend-fail-internal', $this->name );
-                       }
-               }
-               if ( $e->getMessage() ) {
-                       trigger_error( "$func: " . $e->getMessage(), E_USER_WARNING );
-               }
-               wfDebugLog( 'SwiftBackend',
-                       get_class( $e ) . " in '{$func}' (given '" . FormatJson::encode( $params ) . "')" .
-                       ( $e->getMessage() ? ": {$e->getMessage()}" : "" )
-               );
-       }
-}
-
-/**
- * @see FileBackendStoreOpHandle
- */
-class SwiftFileOpHandle extends FileBackendStoreOpHandle {
-       /** @var CF_Async_Op */
-       public $cfOp;
-       /** @var Array */
-       public $affectedObjects = array();
-
-       public function __construct( $backend, array $params, $call, CF_Async_Op $cfOp ) {
-               $this->backend = $backend;
-               $this->params = $params;
-               $this->call = $call;
-               $this->cfOp = $cfOp;
-       }
-}
-
-/**
- * SwiftFileBackend helper class to page through listings.
- * Swift also has a listing limit of 10,000 objects for sanity.
- * Do not use this class from places outside SwiftFileBackend.
- *
- * @ingroup FileBackend
- */
-abstract class SwiftFileBackendList implements Iterator {
-       /** @var Array */
-       protected $bufferIter = array();
-       protected $bufferAfter = null; // string; list items *after* this path
-       protected $pos = 0; // integer
-       /** @var Array */
-       protected $params = array();
-
-       /** @var SwiftFileBackend */
-       protected $backend;
-       protected $container; // string; container name
-       protected $dir; // string; storage directory
-       protected $suffixStart; // integer
-
-       const PAGE_SIZE = 5000; // file listing buffer size
-
-       /**
-        * @param $backend SwiftFileBackend
-        * @param $fullCont string Resolved container name
-        * @param $dir string Resolved directory relative to container
-        * @param $params Array
-        */
-       public function __construct( SwiftFileBackend $backend, $fullCont, $dir, array $params ) {
-               $this->backend = $backend;
-               $this->container = $fullCont;
-               $this->dir = $dir;
-               if ( substr( $this->dir, -1 ) === '/' ) {
-                       $this->dir = substr( $this->dir, 0, -1 ); // remove trailing slash
-               }
-               if ( $this->dir == '' ) { // whole container
-                       $this->suffixStart = 0;
-               } else { // dir within container
-                       $this->suffixStart = strlen( $this->dir ) + 1; // size of "path/to/dir/"
-               }
-               $this->params = $params;
-       }
-
-       /**
-        * @see Iterator::key()
-        * @return integer
-        */
-       public function key() {
-               return $this->pos;
-       }
-
-       /**
-        * @see Iterator::next()
-        * @return void
-        */
-       public function next() {
-               // Advance to the next file in the page
-               next( $this->bufferIter );
-               ++$this->pos;
-               // Check if there are no files left in this page and
-               // advance to the next page if this page was not empty.
-               if ( !$this->valid() && count( $this->bufferIter ) ) {
-                       $this->bufferIter = $this->pageFromList(
-                               $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
-                       ); // updates $this->bufferAfter
-               }
-       }
-
-       /**
-        * @see Iterator::rewind()
-        * @return void
-        */
-       public function rewind() {
-               $this->pos = 0;
-               $this->bufferAfter = null;
-               $this->bufferIter = $this->pageFromList(
-                       $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
-               ); // updates $this->bufferAfter
-       }
-
-       /**
-        * @see Iterator::valid()
-        * @return bool
-        */
-       public function valid() {
-               if ( $this->bufferIter === null ) {
-                       return false; // some failure?
-               } else {
-                       return ( current( $this->bufferIter ) !== false ); // no paths can have this value
-               }
-       }
-
-       /**
-        * Get the given list portion (page)
-        *
-        * @param $container string Resolved container name
-        * @param $dir string Resolved path relative to container
-        * @param $after string|null
-        * @param $limit integer
-        * @param $params Array
-        * @return Traversable|Array|null Returns null on failure
-        */
-       abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
-}
-
-/**
- * Iterator for listing directories
- */
-class SwiftFileBackendDirList extends SwiftFileBackendList {
-       /**
-        * @see Iterator::current()
-        * @return string|bool String (relative path) or false
-        */
-       public function current() {
-               return substr( current( $this->bufferIter ), $this->suffixStart, -1 );
-       }
-
-       /**
-        * @see SwiftFileBackendList::pageFromList()
-        * @return Array|null
-        */
-       protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
-               return $this->backend->getDirListPageInternal( $container, $dir, $after, $limit, $params );
-       }
-}
-
-/**
- * Iterator for listing regular files
- */
-class SwiftFileBackendFileList extends SwiftFileBackendList {
-       /**
-        * @see Iterator::current()
-        * @return string|bool String (relative path) or false
-        */
-       public function current() {
-               return substr( current( $this->bufferIter ), $this->suffixStart );
-       }
-
-       /**
-        * @see SwiftFileBackendList::pageFromList()
-        * @return Array|null
-        */
-       protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
-               return $this->backend->getFileListPageInternal( $container, $dir, $after, $limit, $params );
-       }
-}
diff --git a/includes/filerepo/backend/TempFSFile.php b/includes/filerepo/backend/TempFSFile.php
deleted file mode 100644 (file)
index ddc640a..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-/**
- * Location holder of files stored temporarily
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileBackend
- */
-
-/**
- * This class is used to hold the location and do limited manipulation
- * of files stored temporarily (this will be whatever wfTempDir() returns)
- *
- * @ingroup FileBackend
- */
-class TempFSFile extends FSFile {
-       protected $canDelete = false; // bool; garbage collect the temp file
-
-       /** @var Array of active temp files to purge on shutdown */
-       protected static $instances = array();
-
-       /**
-        * Make a new temporary file on the file system.
-        * Temporary files may be purged when the file object falls out of scope.
-        * 
-        * @param $prefix string
-        * @param $extension string
-        * @return TempFSFile|null 
-        */
-       public static function factory( $prefix, $extension = '' ) {
-               $base = wfTempDir() . '/' . $prefix . dechex( mt_rand( 0, 99999999 ) );
-               $ext = ( $extension != '' ) ? ".{$extension}" : "";
-               for ( $attempt = 1; true; $attempt++ ) {
-                       $path = "{$base}-{$attempt}{$ext}";
-                       wfSuppressWarnings();
-                       $newFileHandle = fopen( $path, 'x' );
-                       wfRestoreWarnings();
-                       if ( $newFileHandle ) {
-                               fclose( $newFileHandle );
-                               break; // got it
-                       }
-                       if ( $attempt >= 15 ) {
-                               return null; // give up
-                       }
-               }
-               $tmpFile = new self( $path );
-               $tmpFile->canDelete = true; // safely instantiated
-               return $tmpFile;
-       }
-
-       /**
-        * Purge this file off the file system
-        * 
-        * @return bool Success
-        */
-       public function purge() {
-               $this->canDelete = false; // done
-               wfSuppressWarnings();
-               $ok = unlink( $this->path );
-               wfRestoreWarnings();
-               return $ok;
-       }
-
-       /**
-        * Clean up the temporary file only after an object goes out of scope
-        *
-        * @param $object Object
-        * @return void
-        */
-       public function bind( $object ) {
-               if ( is_object( $object ) ) {
-                       $object->tempFSFileReferences[] = $this;
-               }
-       }
-
-       /**
-        * Set flag to not clean up after the temporary file
-        *
-        * @return void
-        */
-       public function preserve() {
-               $this->canDelete = false;
-       }
-
-       /**
-        * Cleans up after the temporary file by deleting it
-        */
-       function __destruct() {
-               if ( $this->canDelete ) {
-                       wfSuppressWarnings();
-                       unlink( $this->path );
-                       wfRestoreWarnings();
-               }
-       }
-}
diff --git a/includes/filerepo/backend/filejournal/DBFileJournal.php b/includes/filerepo/backend/filejournal/DBFileJournal.php
deleted file mode 100644 (file)
index 0a09894..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-<?php
-/**
- * Version of FileJournal that logs to a DB table.
- *
- * 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 FileJournal
- * @author Aaron Schulz
- */
-
-/**
- * Version of FileJournal that logs to a DB table
- * @since 1.20
- */
-class DBFileJournal extends FileJournal {
-       protected $wiki = false; // string; wiki DB name
-
-       /**
-        * Construct a new instance from configuration.
-        * $config includes:
-        *     'wiki' : wiki name to use for LoadBalancer
-        * 
-        * @param $config Array
-        */
-       protected function __construct( array $config ) {
-               parent::__construct( $config );
-
-               $this->wiki = $config['wiki'];
-       }
-
-       /**
-        * @see FileJournal::logChangeBatch()
-        * @return Status
-        */
-       protected function doLogChangeBatch( array $entries, $batchId ) {
-               $status = Status::newGood();
-
-               try {
-                       $dbw = $this->getMasterDB();
-               } catch ( DBError $e ) {
-                       $status->fatal( 'filejournal-fail-dbconnect', $this->backend );
-                       return $status;
-               }
-
-               $now = wfTimestamp( TS_UNIX );
-
-               $data = array();
-               foreach ( $entries as $entry ) {
-                       $data[] = array(
-                               'fj_batch_uuid' => $batchId,
-                               'fj_backend'    => $this->backend,
-                               'fj_op'         => $entry['op'],
-                               'fj_path'       => $entry['path'],
-                               'fj_path_sha1'  => wfBaseConvert( sha1( $entry['path'] ), 16, 36, 31 ),
-                               'fj_new_sha1'   => $entry['newSha1'],
-                               'fj_timestamp'  => $dbw->timestamp( $now )
-                       );
-               }
-
-               try {
-                       $dbw->begin();
-                       $dbw->insert( 'filejournal', $data, __METHOD__ );
-                       $dbw->commit();
-               } catch ( DBError $e ) {
-                       $status->fatal( 'filejournal-fail-dbquery', $this->backend );
-                       return $status;
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see FileJournal::doGetChangeEntries()
-        * @return Array
-        * @throws DBError
-        */
-       protected function doGetChangeEntries( $start, $limit ) {
-               $dbw = $this->getMasterDB();
-
-               $res = $dbw->select( 'filejournal', '*',
-                       array(
-                               'fj_backend' => $this->backend,
-                               'fj_id >= ' . $dbw->addQuotes( (int)$start ) ), // $start may be 0
-                       __METHOD__,
-                       array_merge( array( 'ORDER BY' => 'fj_id ASC' ),
-                               $limit ? array( 'LIMIT' => $limit ) : array() )
-               );
-
-               $entries = array();
-               foreach ( $res as $row ) {
-                       $item = array();
-                       foreach ( (array)$row as $key => $value ) {
-                               $item[substr( $key, 3 )] = $value; // "fj_op" => "op"
-                       }
-                       $entries[] = $item;
-               }
-
-               return $entries;
-       }
-
-       /**
-        * @see FileJournal::purgeOldLogs()
-        * @return Status
-        * @throws DBError
-        */
-       protected function doPurgeOldLogs() {
-               $status = Status::newGood();
-               if ( $this->ttlDays <= 0 ) {
-                       return $status; // nothing to do
-               }
-
-               $dbw = $this->getMasterDB();
-               $dbCutoff = $dbw->timestamp( time() - 86400 * $this->ttlDays );
-
-               $dbw->begin();
-               $dbw->delete( 'filejournal',
-                       array( 'fj_timestamp < ' . $dbw->addQuotes( $dbCutoff ) ),
-                       __METHOD__
-               );
-               $dbw->commit();
-
-               return $status;
-       }
-
-       /**
-        * Get a master connection to the logging DB
-        *
-        * @return DatabaseBase
-        * @throws DBError
-        */
-       protected function getMasterDB() {
-               $lb = wfGetLBFactory()->newMainLB();
-               return $lb->getConnection( DB_MASTER, array(), $this->wiki );
-       }
-}
diff --git a/includes/filerepo/backend/filejournal/FileJournal.php b/includes/filerepo/backend/filejournal/FileJournal.php
deleted file mode 100644 (file)
index 234788b..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-<?php
-/**
- * @defgroup FileJournal File journal
- * @ingroup FileBackend
- */
-
-/**
- * File operation journaling.
- *
- * 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 FileJournal
- * @author Aaron Schulz
- */
-
-/**
- * @brief Class for handling file operation journaling.
- *
- * Subclasses should avoid throwing exceptions at all costs.
- *
- * @ingroup FileJournal
- * @since 1.20
- */
-abstract class FileJournal {
-       protected $backend; // string
-       protected $ttlDays; // integer
-
-       /**
-        * Construct a new instance from configuration.
-        * $config includes:
-        *     'ttlDays' : days to keep log entries around (false means "forever")
-        * 
-        * @param $config Array
-        */
-       protected function __construct( array $config ) {
-               $this->ttlDays = isset( $config['ttlDays'] ) ? $config['ttlDays'] : false;
-       }
-
-       /**
-        * Create an appropriate FileJournal object from config
-        *
-        * @param $config Array
-        * @param $backend string A registered file backend name
-        * @throws MWException
-        * @return FileJournal
-        */
-       final public static function factory( array $config, $backend ) {
-               $class = $config['class'];
-               $jrn = new $class( $config );
-               if ( !$jrn instanceof self ) {
-                       throw new MWException( "Class given is not an instance of FileJournal." );
-               }
-               $jrn->backend = $backend;
-               return $jrn;
-       }
-
-       /**
-        * Get a statistically unique ID string
-        * 
-        * @return string <9 char TS_MW timestamp in base 36><22 random base 36 chars>
-        */
-       final public function getTimestampedUUID() {
-               $s = '';
-               for ( $i = 0; $i < 5; $i++ ) {
-                       $s .= mt_rand( 0, 2147483647 );
-               }
-               $s = wfBaseConvert( sha1( $s ), 16, 36, 31 );
-               return substr( wfBaseConvert( wfTimestamp( TS_MW ), 10, 36, 9 ) . $s, 0, 31 );
-       }
-
-       /**
-        * Log changes made by a batch file operation.
-        * $entries is an array of log entries, each of which contains:
-        *     op      : Basic operation name (create, store, copy, delete)
-        *     path    : The storage path of the file
-        *     newSha1 : The final base 36 SHA-1 of the file
-        * Note that 'false' should be used as the SHA-1 for non-existing files.
-        * 
-        * @param $entries Array List of file operations (each an array of parameters)
-        * @param $batchId string UUID string that identifies the operation batch
-        * @return Status
-        */
-       final public function logChangeBatch( array $entries, $batchId ) {
-               if ( !count( $entries ) ) {
-                       return Status::newGood();
-               }
-               return $this->doLogChangeBatch( $entries, $batchId );
-       }
-
-       /**
-        * @see FileJournal::logChangeBatch()
-        * 
-        * @param $entries Array List of file operations (each an array of parameters)
-        * @param $batchId string UUID string that identifies the operation batch
-        * @return Status
-        */
-       abstract protected function doLogChangeBatch( array $entries, $batchId );
-
-       /**
-        * Get an array of file change log entries.
-        * A starting change ID and/or limit can be specified.
-        *
-        * The result as a list of associative arrays, each having:
-        *     id         : unique, monotonic, ID for this change
-        *     batch_uuid : UUID for an operation batch
-        *     backend    : the backend name
-        *     op         : primitive operation (create,update,delete)
-        *     path       : affected storage path
-        *     path_sha1  : base 36 sha1 of the affected storage path
-        *     timestamp  : TS_MW timestamp of the batch change
-
-        * Also, $next is updated to the ID of the next entry.
-        *
-        * @param $start integer Starting change ID or null
-        * @param $limit integer Maximum number of items to return
-        * @param &$next string
-        * @return Array
-        */
-       final public function getChangeEntries( $start = null, $limit = 0, &$next = null ) {
-               $entries = $this->doGetChangeEntries( $start, $limit ? $limit + 1 : 0 );
-               if ( $limit && count( $entries ) > $limit ) {
-                       $last = array_pop( $entries ); // remove the extra entry
-                       $next = $last['id']; // update for next call
-               } else {
-                       $next = null; // end of list
-               }
-               return $entries;
-       }
-
-       /**
-        * @see FileJournal::getChangeEntries()
-        * @return Array
-        */
-       abstract protected function doGetChangeEntries( $start, $limit );
-
-       /**
-        * Purge any old log entries
-        *
-        * @return Status
-        */
-       final public function purgeOldLogs() {
-               return $this->doPurgeOldLogs();
-       }
-
-       /**
-        * @see FileJournal::purgeOldLogs()
-        * @return Status
-        */
-       abstract protected function doPurgeOldLogs();
-}
-
-/**
- * Simple version of FileJournal that does nothing
- * @since 1.20
- */
-class NullFileJournal extends FileJournal {
-       /**
-        * @see FileJournal::logChangeBatch()
-        * @param $entries array
-        * @param $batchId string
-        * @return Status
-        */
-       protected function doLogChangeBatch( array $entries, $batchId ) {
-               return Status::newGood();
-       }
-
-       /**
-        * @see FileJournal::doGetChangeEntries()
-        * @return Array
-        */
-       protected function doGetChangeEntries( $start, $limit ) {
-               return array();
-       }
-
-       /**
-        * @see FileJournal::purgeOldLogs()
-        * @return Status
-        */
-       protected function doPurgeOldLogs() {
-               return Status::newGood();
-       }
-}
diff --git a/includes/filerepo/backend/lockmanager/DBLockManager.php b/includes/filerepo/backend/lockmanager/DBLockManager.php
deleted file mode 100644 (file)
index c2a5085..0000000
+++ /dev/null
@@ -1,508 +0,0 @@
-<?php
-/**
- * Version of LockManager based on using DB table locks.
- *
- * 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
- */
-
-/**
- * Version of LockManager based on using DB table locks.
- * This is meant for multi-wiki systems that may share files.
- * All locks are blocking, so it might be useful to set a small
- * lock-wait timeout via server config to curtail 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 DBs, each on their
- * own server, all having the filelocks.sql tables (with row-level locking).
- * A majority of peer DBs must agree for a lock to be acquired.
- *
- * Caching is used to avoid hitting servers that are down.
- *
- * @ingroup LockManager
- * @since 1.19
- */
-class DBLockManager extends LockManager {
-       /** @var Array Map of DB names to server config */
-       protected $dbServers; // (DB name => server config array)
-       /** @var Array Map of bucket indexes to peer DB lists */
-       protected $dbsByBucket; // (bucket index => (ldb1, ldb2, ...))
-       /** @var BagOStuff */
-       protected $statusCache;
-
-       protected $lockExpiry; // integer number of seconds
-       protected $safeDelay; // integer number of seconds
-
-       protected $session = 0; // random integer
-       /** @var Array Map Database connections (DB name => Database) */
-       protected $conns = array();
-
-       /**
-        * Construct a new instance from configuration.
-        * 
-        * $config paramaters include:
-        *     'dbServers'   : Associative array of DB names to server configuration.
-        *                     Configuration is an associative array that includes:
-        *                     'host'        - DB server name
-        *                     'dbname'      - DB name
-        *                     'type'        - DB type (mysql,postgres,...)
-        *                     'user'        - DB user
-        *                     'password'    - DB user password
-        *                     'tablePrefix' - DB table prefix
-        *                     'flags'       - DB flags (see DatabaseBase)
-        *     'dbsByBucket' : Array of 1-16 consecutive integer keys, starting from 0,
-        *                     each having an odd-numbered list of DB names (peers) as values.
-        *                     Any DB named 'localDBMaster' will automatically use the DB master
-        *                     settings for this wiki (without the need for a dbServers entry).
-        *     'lockExpiry'  : Lock timeout (seconds) for dropped connections. [optional]
-        *                     This tells the DB server how long to wait before assuming
-        *                     connection failure and releasing all the locks for a session.
-        *
-        * @param Array $config 
-        */
-       public function __construct( array $config ) {
-               parent::__construct( $config );
-
-               $this->dbServers = isset( $config['dbServers'] )
-                       ? $config['dbServers']
-                       : array(); // likely just using 'localDBMaster'
-               // Sanitize dbsByBucket config to prevent PHP errors
-               $this->dbsByBucket = array_filter( $config['dbsByBucket'], 'is_array' );
-               $this->dbsByBucket = array_values( $this->dbsByBucket ); // consecutive
-
-               if ( isset( $config['lockExpiry'] ) ) {
-                       $this->lockExpiry = $config['lockExpiry'];
-               } else {
-                       $met = ini_get( 'max_execution_time' );
-                       $this->lockExpiry = $met ? $met : 60; // use some sane amount if 0
-               }
-               $this->safeDelay = ( $this->lockExpiry <= 0 )
-                       ? 60 // pick a safe-ish number to match DB timeout default
-                       : $this->lockExpiry; // cover worst case
-
-               foreach ( $this->dbsByBucket as $bucket ) {
-                       if ( count( $bucket ) > 1 ) {
-                               // Tracks peers that couldn't be queried recently to avoid lengthy
-                               // connection timeouts. This is useless if each bucket has one peer.
-                               $this->statusCache = wfGetMainCache();
-                               break;
-                       }
-               }
-
-               $this->session = '';
-               for ( $i = 0; $i < 5; $i++ ) {
-                       $this->session .= mt_rand( 0, 2147483647 );
-               }
-               $this->session = wfBaseConvert( sha1( $this->session ), 16, 36, 31 );
-       }
-
-       /**
-        * @see LockManager::doLock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
-       protected function doLock( array $paths, $type ) {
-               $status = Status::newGood();
-
-               $pathsToLock = array();
-               // Get locks that need to be acquired (buckets => locks)...
-               foreach ( $paths as $path ) {
-                       if ( isset( $this->locksHeld[$path][$type] ) ) {
-                               ++$this->locksHeld[$path][$type];
-                       } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
-                               $this->locksHeld[$path][$type] = 1;
-                       } else {
-                               $bucket = $this->getBucketFromKey( $path );
-                               $pathsToLock[$bucket][] = $path;
-                       }
-               }
-
-               $lockedPaths = array(); // files locked in this attempt
-               // Attempt to acquire these locks...
-               foreach ( $pathsToLock as $bucket => $paths ) {
-                       // Try to acquire the locks for this bucket
-                       $res = $this->doLockingQueryAll( $bucket, $paths, $type );
-                       if ( $res === 'cantacquire' ) {
-                               // Resources already locked by another process.
-                               // Abort and unlock everything we just locked.
-                               foreach ( $paths as $path ) {
-                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
-                               }
-                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
-                               return $status;
-                       } elseif ( $res !== true ) {
-                               // Couldn't contact any DBs for this bucket.
-                               // Abort and unlock everything we just locked.
-                               $status->fatal( 'lockmanager-fail-db-bucket', $bucket );
-                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
-                               return $status;
-                       }
-                       // Record these locks as active
-                       foreach ( $paths as $path ) {
-                               $this->locksHeld[$path][$type] = 1; // locked
-                       }
-                       // Keep track of what locks were made in this attempt
-                       $lockedPaths = array_merge( $lockedPaths, $paths );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see LockManager::doUnlock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
-       protected function doUnlock( array $paths, $type ) {
-               $status = Status::newGood();
-
-               foreach ( $paths as $path ) {
-                       if ( !isset( $this->locksHeld[$path] ) ) {
-                               $status->warning( 'lockmanager-notlocked', $path );
-                       } elseif ( !isset( $this->locksHeld[$path][$type] ) ) {
-                               $status->warning( 'lockmanager-notlocked', $path );
-                       } else {
-                               --$this->locksHeld[$path][$type];
-                               if ( $this->locksHeld[$path][$type] <= 0 ) {
-                                       unset( $this->locksHeld[$path][$type] );
-                               }
-                               if ( !count( $this->locksHeld[$path] ) ) {
-                                       unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
-                               }
-                       }
-               }
-
-               // Reference count the locks held and COMMIT when zero
-               if ( !count( $this->locksHeld ) ) {
-                       $status->merge( $this->finishLockTransactions() );
-               }
-
-               return $status;
-       }
-
-       /**
-        * Get a connection to a lock DB and acquire locks on $paths.
-        * This does not use GET_LOCK() per http://bugs.mysql.com/bug.php?id=1118.
-        *
-        * @param $lockDb string
-        * @param $paths Array
-        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
-        * @return bool Resources able to be locked
-        * @throws DBError
-        */
-       protected function doLockingQuery( $lockDb, array $paths, $type ) {
-               if ( $type == self::LOCK_EX ) { // writer locks
-                       $db = $this->getConnection( $lockDb );
-                       if ( !$db ) {
-                               return false; // bad config
-                       }
-                       $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
-                       # Build up values for INSERT clause
-                       $data = array();
-                       foreach ( $keys as $key ) {
-                               $data[] = array( 'fle_key' => $key );
-                       }
-                       # Wait on any existing writers and block new ones if we get in
-                       $db->insert( 'filelocks_exclusive', $data, __METHOD__ );
-               }
-               return true;
-       }
-
-       /**
-        * Attempt to acquire locks with the peers for a bucket.
-        * This should avoid throwing any exceptions.
-        *
-        * @param $bucket integer
-        * @param $paths Array List of resource keys to lock
-        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
-        * @return bool|string One of (true, 'cantacquire', 'dberrors')
-        */
-       protected function doLockingQueryAll( $bucket, array $paths, $type ) {
-               $yesVotes = 0; // locks made on trustable DBs
-               $votesLeft = count( $this->dbsByBucket[$bucket] ); // remaining DBs
-               $quorum = floor( $votesLeft/2 + 1 ); // simple majority
-               // Get votes for each DB, in order, until we have enough...
-               foreach ( $this->dbsByBucket[$bucket] as $lockDb ) {
-                       // Check that DB is not *known* to be down
-                       if ( $this->cacheCheckFailures( $lockDb ) ) {
-                               try {
-                                       // Attempt to acquire the lock on this DB
-                                       if ( !$this->doLockingQuery( $lockDb, $paths, $type ) ) {
-                                               return 'cantacquire'; // vetoed; resource locked
-                                       }
-                                       ++$yesVotes; // success for this peer
-                                       if ( $yesVotes >= $quorum ) {
-                                               return true; // lock obtained
-                                       }
-                               } catch ( DBConnectionError $e ) {
-                                       $this->cacheRecordFailure( $lockDb );
-                               } catch ( DBError $e ) {
-                                       if ( $this->lastErrorIndicatesLocked( $lockDb ) ) {
-                                               return 'cantacquire'; // vetoed; resource locked
-                                       }
-                               }
-                       }
-                       --$votesLeft;
-                       $votesNeeded = $quorum - $yesVotes;
-                       if ( $votesNeeded > $votesLeft ) {
-                               // In "trust cache" mode we don't have to meet the quorum
-                               break; // short-circuit
-                       }
-               }
-               // At this point, we must not have meet the quorum
-               return 'dberrors'; // not enough votes to ensure correctness
-       }
-
-       /**
-        * Get (or reuse) a connection to a lock DB
-        *
-        * @param $lockDb string
-        * @return DatabaseBase
-        * @throws DBError
-        */
-       protected function getConnection( $lockDb ) {
-               if ( !isset( $this->conns[$lockDb] ) ) {
-                       $db = null;
-                       if ( $lockDb === 'localDBMaster' ) {
-                               $lb = wfGetLBFactory()->newMainLB();
-                               $db = $lb->getConnection( DB_MASTER );
-                       } elseif ( isset( $this->dbServers[$lockDb] ) ) {
-                               $config = $this->dbServers[$lockDb];
-                               $db = DatabaseBase::factory( $config['type'], $config );
-                       }
-                       if ( !$db ) {
-                               return null; // config error?
-                       }
-                       $this->conns[$lockDb] = $db;
-                       $this->conns[$lockDb]->clearFlag( DBO_TRX );
-                       # If the connection drops, try to avoid letting the DB rollback
-                       # and release the locks before the file operations are finished.
-                       # This won't handle the case of DB server restarts however.
-                       $options = array();
-                       if ( $this->lockExpiry > 0 ) {
-                               $options['connTimeout'] = $this->lockExpiry;
-                       }
-                       $this->conns[$lockDb]->setSessionOptions( $options );
-                       $this->initConnection( $lockDb, $this->conns[$lockDb] );
-               }
-               if ( !$this->conns[$lockDb]->trxLevel() ) {
-                       $this->conns[$lockDb]->begin( __METHOD__ ); // start transaction
-               }
-               return $this->conns[$lockDb];
-       }
-
-       /**
-        * Do additional initialization for new lock DB connection
-        *
-        * @param $lockDb string
-        * @param $db DatabaseBase
-        * @return void
-        * @throws DBError
-        */
-       protected function initConnection( $lockDb, DatabaseBase $db ) {}
-
-       /**
-        * Commit all changes to lock-active databases.
-        * This should avoid throwing any exceptions.
-        *
-        * @return Status
-        */
-       protected function finishLockTransactions() {
-               $status = Status::newGood();
-               foreach ( $this->conns as $lockDb => $db ) {
-                       if ( $db->trxLevel() ) { // in transaction
-                               try {
-                                       $db->rollback( __METHOD__ ); // finish transaction and kill any rows
-                               } catch ( DBError $e ) {
-                                       $status->fatal( 'lockmanager-fail-db-release', $lockDb );
-                               }
-                       }
-               }
-               return $status;
-       }
-
-       /**
-        * Check if the last DB error for $lockDb indicates
-        * that a requested resource was locked by another process.
-        * This should avoid throwing any exceptions.
-        * 
-        * @param $lockDb string
-        * @return bool
-        */
-       protected function lastErrorIndicatesLocked( $lockDb ) {
-               if ( isset( $this->conns[$lockDb] ) ) { // sanity
-                       $db = $this->conns[$lockDb];
-                       return ( $db->wasDeadlock() || $db->wasLockTimeout() );
-               }
-               return false;
-       }
-
-       /**
-        * Checks if the DB has not recently had connection/query errors.
-        * This just avoids wasting time on doomed connection attempts.
-        * 
-        * @param $lockDb string
-        * @return bool
-        */
-       protected function cacheCheckFailures( $lockDb ) {
-               if ( $this->statusCache && $this->safeDelay > 0 ) {
-                       $path = $this->getMissKey( $lockDb );
-                       $misses = $this->statusCache->get( $path );
-                       return !$misses;
-               }
-               return true;
-       }
-
-       /**
-        * Log a lock request failure to the cache
-        *
-        * @param $lockDb string
-        * @return bool Success
-        */
-       protected function cacheRecordFailure( $lockDb ) {
-               if ( $this->statusCache && $this->safeDelay > 0 ) {
-                       $path = $this->getMissKey( $lockDb );
-                       $misses = $this->statusCache->get( $path );
-                       if ( $misses ) {
-                               return $this->statusCache->incr( $path );
-                       } else {
-                               return $this->statusCache->add( $path, 1, $this->safeDelay );
-                       }
-               }
-               return true;
-       }
-
-       /**
-        * Get a cache key for recent query misses for a DB
-        *
-        * @param $lockDb string
-        * @return string
-        */
-       protected function getMissKey( $lockDb ) {
-               return 'lockmanager:querymisses:' . str_replace( ' ', '_', $lockDb );
-       }
-
-       /**
-        * Get the bucket for resource path.
-        * This should avoid throwing any exceptions.
-        *
-        * @param $path string
-        * @return integer
-        */
-       protected function getBucketFromKey( $path ) {
-               $prefix = substr( sha1( $path ), 0, 2 ); // first 2 hex chars (8 bits)
-               return intval( base_convert( $prefix, 16, 10 ) ) % count( $this->dbsByBucket );
-       }
-
-       /**
-        * Make sure remaining locks get cleared for sanity
-        */
-       function __destruct() {
-               foreach ( $this->conns as $lockDb => $db ) {
-                       if ( $db->trxLevel() ) { // in transaction
-                               try {
-                                       $db->rollback( __METHOD__ ); // finish transaction and kill any rows
-                               } catch ( DBError $e ) {
-                                       // oh well
-                               }
-                       }
-                       $db->close();
-               }
-       }
-}
-
-/**
- * MySQL version of DBLockManager that supports shared locks.
- * All locks are non-blocking, which avoids deadlocks.
- *
- * @ingroup LockManager
- */
-class MySqlLockManager extends DBLockManager {
-       /** @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
-       );
-
-       /**
-        * @param $lockDb string
-        * @param $db DatabaseBase
-        */
-       protected function initConnection( $lockDb, DatabaseBase $db ) {
-               # Let this transaction see lock rows from other transactions
-               $db->query( "SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;" );
-       }
-
-       /**
-        * @param $lockDb string
-        * @param $paths array
-        * @param $type int
-        * @return bool
-        */
-       protected function doLockingQuery( $lockDb, array $paths, $type ) {
-               $db = $this->getConnection( $lockDb );
-               if ( !$db ) {
-                       return false;
-               }
-               $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
-               # Build up values for INSERT clause
-               $data = array();
-               foreach ( $keys as $key ) {
-                       $data[] = array( 'fls_key' => $key, 'fls_session' => $this->session );
-               }
-               # Block new writers...
-               $db->insert( 'filelocks_shared', $data, __METHOD__, array( 'IGNORE' ) );
-               # Actually do the locking queries...
-               if ( $type == self::LOCK_SH ) { // reader locks
-                       # Bail if there are any existing writers...
-                       $blocked = $db->selectField( 'filelocks_exclusive', '1',
-                               array( 'fle_key' => $keys ),
-                               __METHOD__
-                       );
-                       # Prospective writers that haven't yet updated filelocks_exclusive
-                       # will recheck filelocks_shared after doing so and bail due to our entry.
-               } else { // writer locks
-                       $encSession = $db->addQuotes( $this->session );
-                       # Bail if there are any existing writers...
-                       # The may detect readers, but the safe check for them is below.
-                       # Note: if two writers come at the same time, both bail :)
-                       $blocked = $db->selectField( 'filelocks_shared', '1',
-                               array( 'fls_key' => $keys, "fls_session != $encSession" ),
-                               __METHOD__
-                       );
-                       if ( !$blocked ) {
-                               # Build up values for INSERT clause
-                               $data = array();
-                               foreach ( $keys as $key ) {
-                                       $data[] = array( 'fle_key' => $key );
-                               }
-                               # Block new readers/writers...
-                               $db->insert( 'filelocks_exclusive', $data, __METHOD__ );
-                               # Bail if there are any existing readers...
-                               $blocked = $db->selectField( 'filelocks_shared', '1',
-                                       array( 'fls_key' => $keys, "fls_session != $encSession" ),
-                                       __METHOD__
-                               );
-                       }
-               }
-               return !$blocked;
-       }
-}
diff --git a/includes/filerepo/backend/lockmanager/FSLockManager.php b/includes/filerepo/backend/lockmanager/FSLockManager.php
deleted file mode 100644 (file)
index 53f3e9f..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-<?php
-/**
- * Simple version of LockManager based on using FS lock files.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * 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
- */
-
-/**
- * Simple version of LockManager based on using FS lock files.
- * All locks are non-blocking, which avoids deadlocks.
- *
- * This should work fine for small sites running off one server.
- * Do not use this with 'lockDirectory' set to an NFS mount unless the
- * NFS client is at least version 2.6.12. Otherwise, the BSD flock()
- * locks will be ignored; see http://nfs.sourceforge.net/#section_d.
- *
- * @ingroup LockManager
- * @since 1.19
- */
-class FSLockManager extends LockManager {
-       /** @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
-       );
-
-       protected $lockDir; // global dir for all servers
-
-       /** @var Array Map of (locked key => lock type => lock file handle) */
-       protected $handles = array();
-
-       /**
-        * Construct a new instance from configuration.
-        *
-        * $config includes:
-        *     'lockDirectory' : Directory containing the lock files
-        *
-        * @param array $config
-        */
-       function __construct( array $config ) {
-               parent::__construct( $config );
-
-               $this->lockDir = $config['lockDirectory'];
-       }
-
-       /**
-        * @see LockManager::doLock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
-       protected function doLock( array $paths, $type ) {
-               $status = Status::newGood();
-
-               $lockedPaths = array(); // files locked in this attempt
-               foreach ( $paths as $path ) {
-                       $status->merge( $this->doSingleLock( $path, $type ) );
-                       if ( $status->isOK() ) {
-                               $lockedPaths[] = $path;
-                       } else {
-                               // Abort and unlock everything
-                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
-                               return $status;
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see LockManager::doUnlock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
-       protected function doUnlock( array $paths, $type ) {
-               $status = Status::newGood();
-
-               foreach ( $paths as $path ) {
-                       $status->merge( $this->doSingleUnlock( $path, $type ) );
-               }
-
-               return $status;
-       }
-
-       /**
-        * Lock a single resource key
-        *
-        * @param $path string
-        * @param $type integer
-        * @return Status
-        */
-       protected function doSingleLock( $path, $type ) {
-               $status = Status::newGood();
-
-               if ( isset( $this->locksHeld[$path][$type] ) ) {
-                       ++$this->locksHeld[$path][$type];
-               } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
-                       $this->locksHeld[$path][$type] = 1;
-               } else {
-                       wfSuppressWarnings();
-                       $handle = fopen( $this->getLockPath( $path ), 'a+' );
-                       wfRestoreWarnings();
-                       if ( !$handle ) { // lock dir missing?
-                               wfMkdirParents( $this->lockDir );
-                               $handle = fopen( $this->getLockPath( $path ), 'a+' ); // try again
-                       }
-                       if ( $handle ) {
-                               // Either a shared or exclusive lock
-                               $lock = ( $type == self::LOCK_SH ) ? LOCK_SH : LOCK_EX;
-                               if ( flock( $handle, $lock | LOCK_NB ) ) {
-                                       // Record this lock as active
-                                       $this->locksHeld[$path][$type] = 1;
-                                       $this->handles[$path][$type] = $handle;
-                               } else {
-                                       fclose( $handle );
-                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
-                               }
-                       } else {
-                               $status->fatal( 'lockmanager-fail-openlock', $path );
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * Unlock a single resource key
-        *
-        * @param $path string
-        * @param $type integer
-        * @return Status
-        */
-       protected function doSingleUnlock( $path, $type ) {
-               $status = Status::newGood();
-
-               if ( !isset( $this->locksHeld[$path] ) ) {
-                       $status->warning( 'lockmanager-notlocked', $path );
-               } elseif ( !isset( $this->locksHeld[$path][$type] ) ) {
-                       $status->warning( 'lockmanager-notlocked', $path );
-               } else {
-                       $handlesToClose = array();
-                       --$this->locksHeld[$path][$type];
-                       if ( $this->locksHeld[$path][$type] <= 0 ) {
-                               unset( $this->locksHeld[$path][$type] );
-                               // If a LOCK_SH comes in while we have a LOCK_EX, we don't
-                               // actually add a handler, so check for handler existence.
-                               if ( isset( $this->handles[$path][$type] ) ) {
-                                       if ( $type === self::LOCK_EX
-                                               && isset( $this->locksHeld[$path][self::LOCK_SH] )
-                                               && !isset( $this->handles[$path][self::LOCK_SH] ) )
-                                       {
-                                               // EX lock came first: move this handle to the SH one
-                                               $this->handles[$path][self::LOCK_SH] = $this->handles[$path][$type];
-                                       } else {
-                                               // Mark this handle to be unlocked and closed
-                                               $handlesToClose[] = $this->handles[$path][$type];
-                                       }
-                                       unset( $this->handles[$path][$type] );
-                               }
-                       }
-                       if ( !count( $this->locksHeld[$path] ) ) {
-                               unset( $this->locksHeld[$path] ); // no locks on this path
-                       }
-                       // Unlock handles to release locks and delete
-                       // any lock files that end up with no locks on them...
-                       if ( wfIsWindows() ) {
-                               // Windows: for any process, including this one,
-                               // calling unlink() on a locked file will fail
-                               $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
-                               $status->merge( $this->pruneKeyLockFiles( $path ) );
-                       } else {
-                               // Unix: unlink() can be used on files currently open by this
-                               // process and we must do so in order to avoid race conditions
-                               $status->merge( $this->pruneKeyLockFiles( $path ) );
-                               $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
-                       }
-               }
-
-               return $status;
-       }
-
-       /**
-        * @param $path string
-        * @param $handlesToClose array
-        * @return Status
-        */
-       private function closeLockHandles( $path, array $handlesToClose ) {
-               $status = Status::newGood();
-               foreach ( $handlesToClose as $handle ) {
-                       if ( !flock( $handle, LOCK_UN ) ) {
-                               $status->fatal( 'lockmanager-fail-releaselock', $path );
-                       }
-                       if ( !fclose( $handle ) ) {
-                               $status->warning( 'lockmanager-fail-closelock', $path );
-                       }
-               }
-               return $status;
-       }
-
-       /**
-        * @param $path string
-        * @return Status
-        */
-       private function pruneKeyLockFiles( $path ) {
-               $status = Status::newGood();
-               if ( !isset( $this->locksHeld[$path] ) ) {
-                       # No locks are held for the lock file anymore
-                       if ( !unlink( $this->getLockPath( $path ) ) ) {
-                               $status->warning( 'lockmanager-fail-deletelock', $path );
-                       }
-                       unset( $this->handles[$path] );
-               }
-               return $status;
-       }
-
-       /**
-        * Get the path to the lock file for a key
-        * @param $path string
-        * @return string
-        */
-       protected function getLockPath( $path ) {
-               $hash = self::sha1Base36( $path );
-               return "{$this->lockDir}/{$hash}.lock";
-       }
-
-       /**
-        * Make sure remaining locks get cleared for sanity
-        */
-       function __destruct() {
-               while ( count( $this->locksHeld ) ) {
-                       foreach ( $this->locksHeld as $path => $locks ) {
-                               $this->doSingleUnlock( $path, self::LOCK_EX );
-                               $this->doSingleUnlock( $path, self::LOCK_SH );
-                       }
-               }
-       }
-}
diff --git a/includes/filerepo/backend/lockmanager/LSLockManager.php b/includes/filerepo/backend/lockmanager/LSLockManager.php
deleted file mode 100644 (file)
index 7910285..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-<?php
-/**
- * Version of LockManager based on using lock daemon 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 a lock daemon server.
- *
- * Version of LockManager based on using lock daemon 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 LockServerDaemon.php, listening on a designated TCP port.
- * A majority of peers must agree for a lock to be acquired.
- *
- * @ingroup LockManager
- * @since 1.19
- */
-class LSLockManager extends LockManager {
-       /** @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 Array Map of server names to server config */
-       protected $lockServers; // (server name => server config array)
-       /** @var Array Map of bucket indexes to peer server lists */
-       protected $srvsByBucket; // (bucket index => (lsrv1, lsrv2, ...))
-
-       /** @var Array Map Server connections (server name => resource) */
-       protected $conns = array();
-
-       protected $connTimeout; // float number of seconds
-       protected $session = ''; // random SHA-1 string
-
-       /**
-        * Construct a new instance from configuration.
-        * 
-        * $config paramaters include:
-        *     'lockServers'  : Associative array of server names to configuration.
-        *                      Configuration is an associative array that includes:
-        *                      'host'    - IP address/hostname
-        *                      'port'    - TCP port
-        *                      'authKey' - Secret string the lock server uses
-        *     'srvsByBucket' : Array of 1-16 consecutive integer keys, starting from 0,
-        *                      each having an odd-numbered list of server names (peers) as values.
-        *     'connTimeout'  : Lock server connection attempt timeout. [optional]
-        *
-        * @param Array $config 
-        */
-       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
-
-               if ( isset( $config['connTimeout'] ) ) {
-                       $this->connTimeout = $config['connTimeout'];
-               } else {
-                       $this->connTimeout = 3; // use some sane amount
-               }
-
-               $this->session = '';
-               for ( $i = 0; $i < 5; $i++ ) {
-                       $this->session .= mt_rand( 0, 2147483647 );
-               }
-               $this->session = wfBaseConvert( sha1( $this->session ), 16, 36, 31 );
-       }
-
-       /**
-        * @see LockManager::doLock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
-       protected function doLock( array $paths, $type ) {
-               $status = Status::newGood();
-
-               $pathsToLock = array();
-               // Get locks that need to be acquired (buckets => locks)...
-               foreach ( $paths as $path ) {
-                       if ( isset( $this->locksHeld[$path][$type] ) ) {
-                               ++$this->locksHeld[$path][$type];
-                       } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
-                               $this->locksHeld[$path][$type] = 1;
-                       } else {
-                               $bucket = $this->getBucketFromKey( $path );
-                               $pathsToLock[$bucket][] = $path;
-                       }
-               }
-
-               $lockedPaths = array(); // files locked in this attempt
-               // Attempt to acquire these locks...
-               foreach ( $pathsToLock as $bucket => $paths ) {
-                       // Try to acquire the locks for this bucket
-                       $res = $this->doLockingRequestAll( $bucket, $paths, $type );
-                       if ( $res === 'cantacquire' ) {
-                               // Resources already locked by another process.
-                               // Abort and unlock everything we just locked.
-                               foreach ( $paths as $path ) {
-                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
-                               }
-                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
-                               return $status;
-                       } elseif ( $res !== true ) {
-                               // Couldn't contact any servers for this bucket.
-                               // Abort and unlock everything we just locked.
-                               foreach ( $paths as $path ) {
-                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
-                               }
-                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
-                               return $status;
-                       }
-                       // Record these locks as active
-                       foreach ( $paths as $path ) {
-                               $this->locksHeld[$path][$type] = 1; // locked
-                       }
-                       // Keep track of what locks were made in this attempt
-                       $lockedPaths = array_merge( $lockedPaths, $paths );
-               }
-
-               return $status;
-       }
-
-       /**
-        * @see LockManager::doUnlock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
-       protected function doUnlock( array $paths, $type ) {
-               $status = Status::newGood();
-
-               foreach ( $paths as $path ) {
-                       if ( !isset( $this->locksHeld[$path] ) ) {
-                               $status->warning( 'lockmanager-notlocked', $path );
-                       } elseif ( !isset( $this->locksHeld[$path][$type] ) ) {
-                               $status->warning( 'lockmanager-notlocked', $path );
-                       } else {
-                               --$this->locksHeld[$path][$type];
-                               if ( $this->locksHeld[$path][$type] <= 0 ) {
-                                       unset( $this->locksHeld[$path][$type] );
-                               }
-                               if ( !count( $this->locksHeld[$path] ) ) {
-                                       unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
-                               }
-                       }
-               }
-
-               // Reference count the locks held and release locks when zero
-               if ( !count( $this->locksHeld ) ) {
-                       $status->merge( $this->releaseLocks() );
-               }
-
-               return $status;
-       }
-
-       /**
-        * Get a connection to a lock server and acquire locks on $paths
-        *
-        * @param $lockSrv string
-        * @param $paths Array
-        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
-        * @return bool Resources able to be locked
-        */
-       protected function doLockingRequest( $lockSrv, array $paths, $type ) {
-               if ( $type == self::LOCK_SH ) { // reader locks
-                       $type = 'SH';
-               } elseif ( $type == self::LOCK_EX ) { // writer locks
-                       $type = 'EX';
-               } else {
-                       return true; // ok...
-               }
-
-               // Send out the command and get the response...
-               $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
-               $response = $this->sendCommand( $lockSrv, 'ACQUIRE', $type, $keys );
-
-               return ( $response === 'ACQUIRED' );
-       }
-
-       /**
-        * Send a command and get back the response
-        *
-        * @param $lockSrv string
-        * @param $action string
-        * @param $type string
-        * @param $values Array
-        * @return string|bool
-        */
-       protected function sendCommand( $lockSrv, $action, $type, $values ) {
-               $conn = $this->getConnection( $lockSrv );
-               if ( !$conn ) {
-                       return false; // no connection
-               }
-               $authKey = $this->lockServers[$lockSrv]['authKey'];
-               // Build of the command as a flat string...
-               $values = implode( '|', $values );
-               $key = sha1( $this->session . $action . $type . $values . $authKey );
-               // Send out the command...
-               if ( fwrite( $conn, "{$this->session}:$key:$action:$type:$values\n" ) === false ) {
-                       return false;
-               }
-               // Get the response...
-               $response = fgets( $conn );
-               if ( $response === false ) {
-                       return false;
-               }
-               return trim( $response );
-       }
-
-       /**
-        * Attempt to acquire locks with the peers for a bucket
-        *
-        * @param $bucket integer
-        * @param $paths Array List of resource keys to lock
-        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
-        * @return bool|string One of (true, 'cantacquire', 'srverrors')
-        */
-       protected function doLockingRequestAll( $bucket, array $paths, $type ) {
-               $yesVotes = 0; // locks made on trustable servers
-               $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
-               $quorum = floor( $votesLeft/2 + 1 ); // simple majority
-               // Get votes for each peer, in order, until we have enough...
-               foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
-                       // Attempt to acquire the lock on this peer
-                       if ( !$this->doLockingRequest( $lockSrv, $paths, $type ) ) {
-                               return 'cantacquire'; // vetoed; resource locked
-                       }
-                       ++$yesVotes; // success for this peer
-                       if ( $yesVotes >= $quorum ) {
-                               return true; // lock obtained
-                       }
-                       --$votesLeft;
-                       $votesNeeded = $quorum - $yesVotes;
-                       if ( $votesNeeded > $votesLeft ) {
-                               // In "trust cache" mode we don't have to meet the quorum
-                               break; // short-circuit
-                       }
-               }
-               // At this point, we must not have meet the quorum
-               return 'srverrors'; // not enough votes to ensure correctness
-       }
-
-       /**
-        * Get (or reuse) a connection to a lock server
-        *
-        * @param $lockSrv string
-        * @return resource
-        */
-       protected function getConnection( $lockSrv ) {
-               if ( !isset( $this->conns[$lockSrv] ) ) {
-                       $cfg = $this->lockServers[$lockSrv];
-                       wfSuppressWarnings();
-                       $errno = $errstr = '';
-                       $conn = fsockopen( $cfg['host'], $cfg['port'], $errno, $errstr, $this->connTimeout );
-                       wfRestoreWarnings();
-                       if ( $conn === false ) {
-                               return null;
-                       }
-                       $sec = floor( $this->connTimeout );
-                       $usec = floor( ( $this->connTimeout - floor( $this->connTimeout ) ) * 1e6 );
-                       stream_set_timeout( $conn, $sec, $usec );
-                       $this->conns[$lockSrv] = $conn;
-               }
-               return $this->conns[$lockSrv];
-       }
-
-       /**
-        * Release all locks that this session is holding
-        *
-        * @return Status
-        */
-       protected function releaseLocks() {
-               $status = Status::newGood();
-               foreach ( $this->conns as $lockSrv => $conn ) {
-                       $response = $this->sendCommand( $lockSrv, 'RELEASE_ALL', '', array() );
-                       if ( $response !== 'RELEASED_ALL' ) {
-                               $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
-                       }
-               }
-               return $status;
-       }
-
-       /**
-        * Get the bucket for resource path.
-        * This should avoid throwing any exceptions.
-        *
-        * @param $path string
-        * @return integer
-        */
-       protected function getBucketFromKey( $path ) {
-               $prefix = substr( sha1( $path ), 0, 2 ); // first 2 hex chars (8 bits)
-               return intval( base_convert( $prefix, 16, 10 ) ) % count( $this->srvsByBucket );
-       }
-
-       /**
-        * Make sure remaining locks get cleared for sanity
-        */
-       function __destruct() {
-               $this->releaseLocks();
-               foreach ( $this->conns as $conn ) {
-                       fclose( $conn );
-               }
-       }
-}
diff --git a/includes/filerepo/backend/lockmanager/LockManager.php b/includes/filerepo/backend/lockmanager/LockManager.php
deleted file mode 100644 (file)
index e41c777..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-<?php
-/**
- * @defgroup LockManager Lock management
- * @ingroup FileBackend
- */
-
-/**
- * Resource locking handling.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * @brief Class for handling resource locking.
- *
- * Locks on resource keys can either be shared or exclusive.
- *
- * Implementations must keep track of what is locked by this proccess
- * in-memory and support nested locking calls (using reference counting).
- * At least LOCK_UW and LOCK_EX must be implemented. LOCK_SH can be a no-op.
- * Locks should either be non-blocking or have low wait timeouts.
- *
- * Subclasses should avoid throwing exceptions at all costs.
- *
- * @ingroup LockManager
- * @since 1.19
- */
-abstract class LockManager {
-       /** @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_EX, // subclasses may use self::LOCK_SH
-               self::LOCK_EX => self::LOCK_EX
-       );
-
-       /** @var Array Map of (resource path => lock type => count) */
-       protected $locksHeld = array();
-
-       /* Lock types; stronger locks have higher values */
-       const LOCK_SH = 1; // shared lock (for reads)
-       const LOCK_UW = 2; // shared lock (for reads used to write elsewhere)
-       const LOCK_EX = 3; // exclusive lock (for writes)
-
-       /**
-        * Construct a new instance from configuration
-        *
-        * @param $config Array
-        */
-       public function __construct( array $config ) {}
-
-       /**
-        * Lock the resources at the given abstract paths
-        * 
-        * @param $paths Array List of resource names
-        * @param $type integer LockManager::LOCK_* constant
-        * @return Status 
-        */
-       final public function lock( array $paths, $type = self::LOCK_EX ) {
-               wfProfileIn( __METHOD__ );
-               $status = $this->doLock( array_unique( $paths ), $this->lockTypeMap[$type] );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * Unlock the resources at the given abstract paths
-        * 
-        * @param $paths Array List of storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @return Status 
-        */
-       final public function unlock( array $paths, $type = self::LOCK_EX ) {
-               wfProfileIn( __METHOD__ );
-               $status = $this->doUnlock( array_unique( $paths ), $this->lockTypeMap[$type] );
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * Get the base 36 SHA-1 of a string, padded to 31 digits
-        * 
-        * @param $path string
-        * @return string
-        */
-       final protected static function sha1Base36( $path ) {
-               return wfBaseConvert( sha1( $path ), 16, 36, 31 );
-       }
-
-       /**
-        * Lock resources with the given keys and lock type
-        * 
-        * @param $paths Array List of storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @return string
-        */
-       abstract protected function doLock( array $paths, $type );
-
-       /**
-        * Unlock resources with the given keys and lock type
-        * 
-        * @param $paths Array List of storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @return string
-        */
-       abstract protected function doUnlock( array $paths, $type );
-}
-
-/**
- * Self releasing locks
- *
- * LockManager helper class to handle scoped locks, which
- * release when an object is destroyed or goes out of scope.
- *
- * @ingroup LockManager
- * @since 1.19
- */
-class ScopedLock {
-       /** @var LockManager */
-       protected $manager;
-       /** @var Status */
-       protected $status;
-       /** @var Array List of resource paths*/
-       protected $paths;
-
-       protected $type; // integer lock type
-
-       /**
-        * @param $manager LockManager
-        * @param $paths Array List of storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @param $status Status
-        */
-       protected function __construct(
-               LockManager $manager, array $paths, $type, Status $status
-       ) {
-               $this->manager = $manager;
-               $this->paths = $paths;
-               $this->status = $status;
-               $this->type = $type;
-       }
-
-       /**
-        * Get a ScopedLock object representing a lock on resource paths.
-        * Any locks are released once this object goes out of scope.
-        * The status object is updated with any errors or warnings.
-        * 
-        * @param $manager LockManager
-        * @param $paths Array List of storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @param $status Status
-        * @return ScopedLock|null Returns null on failure
-        */
-       public static function factory(
-               LockManager $manager, array $paths, $type, Status $status
-       ) {
-               $lockStatus = $manager->lock( $paths, $type );
-               $status->merge( $lockStatus );
-               if ( $lockStatus->isOK() ) {
-                       return new self( $manager, $paths, $type, $status );
-               }
-               return null;
-       }
-
-       function __destruct() {
-               $wasOk = $this->status->isOK();
-               $this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
-               if ( $wasOk ) {
-                       // Make sure status is OK, despite any unlockFiles() fatals
-                       $this->status->setResult( true, $this->status->value );
-               }
-       }
-}
-
-/**
- * Simple version of LockManager that does nothing
- * @since 1.19
- */
-class NullLockManager extends LockManager {
-       /**
-        * @see LockManager::doLock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
-       protected function doLock( array $paths, $type ) {
-               return Status::newGood();
-       }
-
-       /**
-        * @see LockManager::doUnlock()
-        * @param $paths array
-        * @param $type int
-        * @return Status
-        */
-       protected function doUnlock( array $paths, $type ) {
-               return Status::newGood();
-       }
-}
diff --git a/includes/filerepo/backend/lockmanager/LockManagerGroup.php b/includes/filerepo/backend/lockmanager/LockManagerGroup.php
deleted file mode 100644 (file)
index b830855..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-/**
- * Lock manager registration handling.
- *
- * 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
- */
-
-/**
- * Class to handle file lock manager registration
- * 
- * @ingroup LockManager
- * @author Aaron Schulz
- * @since 1.19
- */
-class LockManagerGroup {
-
-       /**
-        * @var LockManagerGroup
-        */
-       protected static $instance = null;
-
-       /** @var Array of (name => ('class' =>, 'config' =>, 'instance' =>)) */
-       protected $managers = array();
-
-       protected function __construct() {}
-
-       /**
-        * @return LockManagerGroup
-        */
-       public static function singleton() {
-               if ( self::$instance == null ) {
-                       self::$instance = new self();
-                       self::$instance->initFromGlobals();
-               }
-               return self::$instance;
-       }
-
-       /**
-        * Destroy the singleton instance, so that a new one will be created next
-        * time singleton() is called.
-        */
-       public static function destroySingleton() {
-               self::$instance = null;
-       }
-
-       /**
-        * Register lock managers from the global variables
-        * 
-        * @return void
-        */
-       protected function initFromGlobals() {
-               global $wgLockManagers;
-
-               $this->register( $wgLockManagers );
-       }
-
-       /**
-        * Register an array of file lock manager configurations
-        *
-        * @param $configs Array
-        * @return void
-        * @throws MWException
-        */
-       protected function register( array $configs ) {
-               foreach ( $configs as $config ) {
-                       if ( !isset( $config['name'] ) ) {
-                               throw new MWException( "Cannot register a lock manager with no name." );
-                       }
-                       $name = $config['name'];
-                       if ( !isset( $config['class'] ) ) {
-                               throw new MWException( "Cannot register lock manager `{$name}` with no class." );
-                       }
-                       $class = $config['class'];
-                       unset( $config['class'] ); // lock manager won't need this
-                       $this->managers[$name] = array(
-                               'class'    => $class,
-                               'config'   => $config,
-                               'instance' => null
-                       );
-               }
-       }
-
-       /**
-        * Get the lock manager object with a given name
-        *
-        * @param $name string
-        * @return LockManager
-        * @throws MWException
-        */
-       public function get( $name ) {
-               if ( !isset( $this->managers[$name] ) ) {
-                       throw new MWException( "No lock manager defined with the name `$name`." );
-               }
-               // Lazy-load the actual lock manager instance
-               if ( !isset( $this->managers[$name]['instance'] ) ) {
-                       $class = $this->managers[$name]['class'];
-                       $config = $this->managers[$name]['config'];
-                       $this->managers[$name]['instance'] = new $class( $config );
-               }
-               return $this->managers[$name]['instance'];
-       }
-}
index 065679a..dd54455 100644 (file)
@@ -245,6 +245,18 @@ abstract class File {
                }
        }
 
+       /**
+        * Callback for usort() to do file sorts by name
+        *
+        * @param $a File
+        * @param $b File
+        *
+        * @return Integer: result of name comparison
+        */
+       public static function compare( File $a, File $b ) {
+               return strcmp( $a->getName(), $b->getName() );
+       }
+
        /**
         * Return the name of this file
         *
@@ -452,6 +464,39 @@ abstract class File {
                }
        }
 
+       /**
+        * Will the thumbnail be animated if one would expect it to be.
+        *
+        * Currently used to add a warning to the image description page
+        *
+        * @return bool false if the main image is both animated
+        *   and the thumbnail is not. In all other cases must return
+        *   true. If image is not renderable whatsoever, should
+        *   return true.
+        */
+       public function canAnimateThumbIfAppropriate() {
+               $handler = $this->getHandler();
+               if ( !$handler ) {
+                       // We cannot handle image whatsoever, thus
+                       // one would not expect it to be animated
+                       // so true.
+                       return true;
+               } else {
+                       if ( $this->allowInlineDisplay()
+                               && $handler->isAnimatedImage( $this )
+                               && !$handler->canAnimateThumbnail( $this )
+                       ) {
+                               // Image is animated, but thumbnail isn't.
+                               // This is unexpected to the user.
+                               return false;
+                       } else {
+                               // Image is not animated, so one would
+                               // not expect thumb to be
+                               return true;
+                       }
+               }
+       }
+
        /**
         * Get handler-specific metadata
         * Overridden by LocalFile, UnregisteredLocalFile
@@ -792,7 +837,7 @@ abstract class File {
                        return $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
                } else {
                        return new MediaTransformError( 'thumbnail_error',
-                               $params['width'], 0, wfMsg( 'thumbnail-dest-create' ) );
+                               $params['width'], 0, wfMessage( 'thumbnail-dest-create' )->text() );
                }
        }
 
@@ -882,7 +927,9 @@ abstract class File {
                        $tmpThumbPath = $tmpFile->getPath(); // path of 0-byte temp file
 
                        // Actually render the thumbnail...
+                       wfProfileIn( __METHOD__ . '-doTransform' );
                        $thumb = $this->handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $params );
+                       wfProfileOut( __METHOD__ . '-doTransform' );
                        $tmpFile->bind( $thumb ); // keep alive with $thumb
 
                        if ( !$thumb ) { // bad params?
@@ -1606,7 +1653,7 @@ abstract class File {
        }
 
        /**
-        * Get the deletion archive key, <sha1>.<ext>
+        * Get the deletion archive key, "<sha1>.<ext>"
         *
         * @return string
         */
index 2f55ec1..75b9d45 100644 (file)
@@ -633,7 +633,7 @@ class LocalFile extends File {
 
        /**
         * Fix thumbnail files from 1.4 or before, with extreme prejudice
-        * @TODO: do we still care about this? Perhaps a maintenance script
+        * @todo : do we still care about this? Perhaps a maintenance script
         *        can be made instead. Enabling this code results in a serious
         *        RTT regression for wikis without 404 handling.
         */
@@ -1043,7 +1043,7 @@ class LocalFile extends File {
                if ( !$props ) {
                        wfProfileIn( __METHOD__ . '-getProps' );
                        $props = $this->repo->getFileProps( $this->getVirtualUrl() );
-                       wfProfileOut( __METHOD__ . -'getProps' );
+                       wfProfileOut( __METHOD__ . '-getProps' );
                }
 
                if ( $timestamp === false ) {
@@ -1151,7 +1151,7 @@ class LocalFile extends File {
                # Add the log entry
                $log = new LogPage( 'upload' );
                $action = $reupload ? 'overwrite' : 'upload';
-               $log->addEntry( $action, $descTitle, $comment, array(), $user );
+               $logId = $log->addEntry( $action, $descTitle, $comment, array(), $user );
 
                wfProfileIn( __METHOD__ . '-edit' );
                if ( $descTitle->exists() ) {
@@ -1169,6 +1169,8 @@ class LocalFile extends File {
                                wfRunHooks( 'NewRevisionFromEditComplete', array( $wikiPage, $nullRevision, $latest, $user ) );
                                $wikiPage->updateRevisionOn( $dbw, $nullRevision );
                        }
+                       $dbw->update( 'logging', array( 'log_page' => $descTitle->getArticleID() ), array( 'log_id' => $logId ), __METHOD__ );
+
                        # Invalidate the cache for the description page
                        $descTitle->invalidateCache();
                        $descTitle->purgeSquid();
@@ -1176,7 +1178,11 @@ class LocalFile extends File {
                        # New file; create the description page.
                        # There's already a log entry, so don't make a second RC entry
                        # Squid and file cache for the description page are purged by doEdit.
-                       $wikiPage->doEdit( $pageText, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
+                       $status = $wikiPage->doEdit( $pageText, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
+
+                       if ( isset( $status->value['revision'] ) ) {
+                               $dbw->update( 'logging', array( 'log_page' => $status->value['revision']->getPage() ), array( 'log_id' => $logId ), __METHOD__ );
+                       }
                }
                wfProfileOut( __METHOD__ . '-edit' );
 
@@ -1456,7 +1462,7 @@ class LocalFile extends File {
         */
        function getDescriptionText() {
                global $wgParser;
-               $revision = Revision::newFromTitle( $this->title );
+               $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
                if ( !$revision ) return false;
                $text = $revision->getText();
                if ( !$text ) return false;
index 752e214..38b4a82 100644 (file)
@@ -163,7 +163,7 @@ class CliInstaller extends Installer {
        protected function getMessageText( $params ) {
                $msg = array_shift( $params );
 
-               $text = wfMsgExt( $msg, array( 'parseinline' ), $params );
+               $text = wfMessage( $msg, $params )->parse();
 
                $text = preg_replace( '/<a href="(.*?)".*?>(.*?)<\/a>/', '$2 &lt;$1&gt;', $text );
                return html_entity_decode( strip_tags( $text ), ENT_QUOTES );
@@ -187,7 +187,7 @@ class CliInstaller extends Installer {
 
                if ( !$status->isOk() ) {
                        echo "\n";
-                       exit;
+                       exit( 1 );
                }
        }
 
index 2cc539b..de59b2d 100644 (file)
@@ -273,7 +273,7 @@ abstract class DatabaseInstaller {
                        $up = DatabaseUpdater::newForDB( $this->db );
                        $up->doUpdates();
                } catch ( MWException $e ) {
-                       echo "\nAn error occured:\n";
+                       echo "\nAn error occurred:\n";
                        echo $e->getText();
                        $ret = false;
                }
@@ -334,7 +334,7 @@ abstract class DatabaseInstaller {
         * @return String
         */
        public function getReadableName() {
-               return wfMsg( 'config-type-' . $this->getName() );
+               return wfMessage( 'config-type-' . $this->getName() )->text();
        }
 
        /**
@@ -509,7 +509,7 @@ abstract class DatabaseInstaller {
        public function getInstallUserBox() {
                return
                        Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', array(), wfMsg( 'config-db-install-account' ) ) .
+                       Html::element( 'legend', array(), wfMessage( 'config-db-install-account' )->text() ) .
                        $this->getTextBox( '_InstallUser', 'config-db-username', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-username' ) ) .
                        $this->getPasswordBox( '_InstallPassword', 'config-db-password', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-password' ) ) .
                        Html::closeElement( 'fieldset' );
@@ -534,7 +534,7 @@ abstract class DatabaseInstaller {
        public function getWebUserBox( $noCreateMsg = false ) {
                $wrapperStyle = $this->getVar( '_SameAccount' ) ? 'display: none' : '';
                $s = Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', array(), wfMsg( 'config-db-web-account' ) ) .
+                       Html::element( 'legend', array(), wfMessage( 'config-db-web-account' )->text() ) .
                        $this->getCheckBox(
                                '_SameAccount', 'config-db-web-account-same',
                                array( 'class' => 'hideShowRadio', 'rel' => 'dbOtherAccount' )
@@ -544,7 +544,7 @@ abstract class DatabaseInstaller {
                        $this->getPasswordBox( 'wgDBpassword', 'config-db-password' ) .
                        $this->parent->getHelpBox( 'config-db-web-help' );
                if ( $noCreateMsg ) {
-                       $s .= $this->parent->getWarningBox( wfMsgNoTrans( $noCreateMsg ) );
+                       $s .= $this->parent->getWarningBox( wfMessage( $noCreateMsg )->plain() );
                } else {
                        $s .= $this->getCheckBox( '_CreateDBAccount', 'config-db-web-create' );
                }
index 6483c4e..ff0a99e 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Deployment
  */
 
-require_once( dirname(__FILE__) . '/../../maintenance/Maintenance.php' );
+require_once( __DIR__ . '/../../maintenance/Maintenance.php' );
 
 /**
  * Class for handling database updates. Roughly based off of updaters.inc, with
@@ -253,9 +253,9 @@ abstract class DatabaseUpdater {
 
        /**
         * Add a maintenance script to be run after the database updates are complete.
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param $class string Name of a Maintenance subclass
         */
        public function addPostDatabaseUpdateMaintenance( $class ) {
@@ -273,7 +273,7 @@ abstract class DatabaseUpdater {
 
        /**
         * @since 1.17
-        * 
+        *
         * @return array
         */
        public function getPostDatabaseUpdateMaintenance() {
@@ -463,13 +463,20 @@ abstract class DatabaseUpdater {
         * Applies a SQL patch
         * @param $path String Path to the patch file
         * @param $isFullPath Boolean Whether to treat $path as a relative or not
+        * @param $msg String Description of the patch
         */
-       protected function applyPatch( $path, $isFullPath = false ) {
-               if ( $isFullPath ) {
-                       $this->db->sourceFile( $path );
-               } else {
-                       $this->db->sourceFile( $this->db->patchPath( $path ) );
+       protected function applyPatch( $path, $isFullPath = false, $msg = null ) {
+               if ( $msg === null ) {
+                       $msg = "Applying $path patch";
+               }
+
+               if ( !$isFullPath ) {
+                       $path = $this->db->patchPath( $path );
                }
+
+               $this->output( "$msg ..." );
+               $this->db->sourceFile( $path );
+               $this->output( "done.\n" );
        }
 
        /**
@@ -482,9 +489,7 @@ abstract class DatabaseUpdater {
                if ( $this->db->tableExists( $name, __METHOD__ ) ) {
                        $this->output( "...$name table already exists.\n" );
                } else {
-                       $this->output( "Creating $name table..." );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Creating $name table" );
                }
        }
 
@@ -501,9 +506,7 @@ abstract class DatabaseUpdater {
                } elseif ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
                        $this->output( "...have $field field in $table table.\n" );
                } else {
-                       $this->output( "Adding $field field to table $table..." );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
                }
        }
 
@@ -518,9 +521,7 @@ abstract class DatabaseUpdater {
                if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
                        $this->output( "...index $index already set on $table table.\n" );
                } else {
-                       $this->output( "Adding index $index to table $table... " );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
                }
        }
 
@@ -534,9 +535,7 @@ abstract class DatabaseUpdater {
         */
        protected function dropField( $table, $field, $patch, $fullpath = false ) {
                if ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
-                       $this->output( "Table $table contains $field field. Dropping... " );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Table $table contains $field field. Dropping" );
                } else {
                        $this->output( "...$table table does not contain $field field.\n" );
                }
@@ -552,24 +551,35 @@ abstract class DatabaseUpdater {
         */
        protected function dropIndex( $table, $index, $patch, $fullpath = false ) {
                if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
-                       $this->output( "Dropping $index index from table $table... " );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patch, $fullpath, "Dropping $index index from table $table" );
                } else {
                        $this->output( "...$index key doesn't exist.\n" );
                }
        }
 
        /**
+        * If the specified table exists, drop it, or execute the
+        * patch if one is provided.
+        *
+        * Public @since 1.20
+        *
         * @param $table string
-        * @param $patch string
+        * @param $patch string|false
         * @param $fullpath bool
         */
-       protected function dropTable( $table, $patch, $fullpath = false ) {
+       public function dropTable( $table, $patch = false, $fullpath = false ) {
                if ( $this->db->tableExists( $table, __METHOD__ ) ) {
-                       $this->output( "Dropping table $table... " );
-                       $this->applyPatch( $patch, $fullpath );
-                       $this->output( "done.\n" );
+                       $msg = "Dropping table $table";
+
+                       if ( $patch === false ) {
+                               $this->output( "$msg ..." );
+                               $this->db->dropTable( $table, __METHOD__ );
+                               $this->output( "done.\n" );
+                       }
+                       else {
+                               $this->applyPatch( $patch, $fullpath, $msg );
+                       }
+
                } else {
                        $this->output( "...$table doesn't exist.\n" );
                }
@@ -592,10 +602,8 @@ abstract class DatabaseUpdater {
                } elseif( $this->updateRowExists( $updateKey ) ) {
                        $this->output( "...$field in table $table already modified by patch $patch.\n" );
                } else {
-                       $this->output( "Modifying $field field of table $table..." );
-                       $this->applyPatch( $patch, $fullpath );
+                       $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
                        $this->insertUpdateRow( $updateKey );
-                       $this->output( "done.\n" );
                }
        }
 
@@ -688,9 +696,7 @@ abstract class DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Converting tc_time from UNIX epoch to MediaWiki timestamp... " );
-               $this->applyPatch( 'patch-tc-timestamp.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-tc-timestamp.sql', false, "Converting tc_time from UNIX epoch to MediaWiki timestamp" );
        }
 
        /**
index 76df7af..ca9bdf4 100644 (file)
@@ -68,7 +68,7 @@ class Ibm_db2Installer extends DatabaseInstaller {
                        $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
                        $this->getTextBox( 'wgDBport', 'config-db-port', array(), $this->parent->getHelpBox( 'config-db-port' ) ) .
                        Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', array(), wfMsg( 'config-db-wiki-settings' ) ) .
+                       Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
                        $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
                        $this->getTextBox( 'wgDBmwschema', 'config-db-schema', array(), $this->parent->getHelpBox( 'config-db-schema-help' ) ) .
                        Html::closeElement( 'fieldset' ) .
index ac5b271..8849ac0 100644 (file)
@@ -602,6 +602,7 @@ Do not translate: <code>php5-mysql</code>.
 
 Parameters:
 * $1 is comma separated list of database types supported by MediaWiki.',
+       'config-no-fts3' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
        'config-memory-raised' => 'Parameters:
 * $1 is the configured <code>memory_limit</code>.
 * $2 is the value to which <code>memory_limit</code> was raised.',
@@ -620,11 +621,14 @@ Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
        'config-suhosin-max-value-length' => 'Message shown when PHP parameter suhosin.get.max_value_length is between 0 and 1023 (that max value is hard set in MediaWiki software)',
        'config-db-host-oracle' => 'TNS = [[:wikipedia:Transparent Network Substrate|Transparent Network Substrate]] (<== wikipedia link)',
        'config-db-wiki-settings' => 'This is more acurate: "Enter identifying or distinguishing data for this wiki" since a MySQL database can host tables of several wikis.',
+       'config-db-account-oracle-warn' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
        'config-db-account-lock' => "It might be easier to translate ''normal operation'' as \"also after the installation process\"",
        'config-type-mysql' => '{{optional}}',
        'config-type-postgres' => '{{optional}}',
        'config-type-sqlite' => '{{optional}}',
        'config-type-oracle' => '{{optional}}',
+       'config-support-info' => 'Parameters:
+* $1 - a list of DBMSs that MediaWiki supports, composed with other config-type-* and config-support-* messages.',
        'config-support-mysql' => 'Parameters:
 * $1 - a link to the MySQL home page having the anchor text "MySQL".',
        'config-support-postgres' => 'Parameters:
@@ -991,7 +995,7 @@ $messages['am'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Aragonese (Aragonés)
+/** Aragonese (aragonés)
  * @author Juanpabl
  */
 $messages['an'] = array(
@@ -1065,7 +1069,7 @@ $messages['arc'] = array(
        'config-admin-name' => 'ܫܡܐ ܕܝܠܟ:',
        'config-admin-password' => 'ܡܠܬܐ ܕܥܠܠܐ:',
        'config-admin-password-confirm' => 'ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܬܐ ܐܚܪܬܐ:',
-       'config-admin-email' => 'ܦܪܫÜ\93Ü¢ܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
+       'config-admin-email' => 'Ü¡Ü\98ܢܥܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
        'config-profile-private' => 'ܘܝܩܝ ܦܪܨܘܦܝܐ',
        'config-email-settings' => 'ܛܘܝܒ̈ܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 );
@@ -1222,7 +1226,7 @@ $messages['be'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]',
 );
 
-/** Belarusian (TaraÅ¡kievica orthography) (â\80ªÐ\91еларуская (тарашкевіца)‬)
+/** Belarusian (TaraÅ¡kievica orthography) (â\80ªÐ±еларуская (тарашкевіца)‬)
  * @author EugeneZelenko
  * @author Jim-by
  * @author Wizardist
@@ -2910,8 +2914,12 @@ Ovo '''nije preporučeno''' osim ako nemate problema s vašom wiki.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]',
 );
 
-/** Catalan (català) */
+/** Catalan (català)
+ * @author පසිඳු කාවින්ද
+ */
 $messages['ca'] = array(
+       'config-page-language' => 'Llengua',
+       'config-page-name' => 'Nom',
        'mainpagetext' => "'''El programari del MediaWiki s'ha instaŀlat correctament.'''",
        'mainpagedocfooter' => "Consulteu la [//meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar-lo.
 
@@ -3544,7 +3552,7 @@ Až to dokončíte, můžete '''[$2 vstoupit do své wiki]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]',
 );
 
-/** Kashubian (Kaszëbsczi) */
+/** Kashubian (kaszëbsczi) */
 $messages['csb'] = array(
        'mainpagetext' => "'''MediaWiki òsta zainstalowónô.'''",
 );
@@ -3687,7 +3695,7 @@ Sofern ein gemeinschaftlich genutzter Server für das Hosting verwendet wird, mu
 Sofern PHP selbst kompiliert wurde, muss es mit es neu konfiguriert werden, wobei der Datenbankclient zu aktivierten ist. Hierzu kann beispielsweise <code>./configure --with-mysql</code> ausgeführt werden.
 Sofern PHP über die Paketverwaltung einer Debian- oder Ubuntu-Installation installiert wurde, muss das „php5-mysql“-Paket nachinstalliert werden.',
        'config-outdated-sqlite' => "'''Warnung:''' SQLite $1 ist installiert. Allerdings benötigt MediaWiki SQLite $2 oder höher. SQLite wird daher nicht verfügbar sein.",
-       'config-no-fts3' => "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass keine Suchfunktionen zur Verfügung stehen werden.",
+       'config-no-fts3' => "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
        'config-register-globals' => "'''Warnung: Der Parameter <code>[http://php.net/register_globals register_globals]</code> von PHP ist aktiviert.'''
 '''Sie sollte deaktiviert werden, sofern dies möglich ist.'''
 Die MediaWiki-Installation wird zwar laufen, wobei aber der Server für potentielle Sicherheitsprobleme anfällig ist.",
@@ -3887,7 +3895,7 @@ Bitte unten angegebenes Datenverzeichnis sowie den Datenbanknamen überprüfen u
        'config-sqlite-fts3-downgrade' => 'PHP verfügt nicht über FTS3-Unterstützung. Die Tabellen wurden zurückgestuft.',
        'config-can-upgrade' => "Es wurden MediaWiki-Tabellen in dieser Datenbank gefunden.
 Um sie auf MediaWiki $1 zu aktualisieren, bitte auf '''Weiter''' klicken.",
-       'config-upgrade-done' => "Die Aktualisierung ist abgeschlossen.
+       'config-upgrade-done' => "Die Aktualisierung ist nun abgeschlossen.
 
 Das Wiki kann nun [$1 genutzt werden].
 
@@ -4125,7 +4133,7 @@ $3
 Sobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wir wünschen viel Spaß und Erfolg mit dem Wiki.",
        'config-download-localsettings' => 'LocalSettings.php herunterladen',
        'config-help' => 'Hilfe',
-       'config-nofile' => 'Datei „$1“ wurde nicht gefunden. Wurde sie gelöscht?',
+       'config-nofile' => 'Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?',
        'mainpagetext' => "'''MediaWiki wurde erfolgreich installiert.'''",
        'mainpagedocfooter' => 'Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].
 
@@ -4149,10 +4157,53 @@ $messages['de-formal'] = array(
 );
 
 /** Zazaki (Zazaki)
+ * @author Erdemaslancan
  * @author Mirzali
  */
 $messages['diq'] = array(
+       'config-your-language' => 'Zıwanê şıma:',
+       'config-wiki-language' => 'Wiki zıwan:',
+       'config-back' => '← Peyd',
+       'config-continue' => 'Dewam ke',
+       'config-page-language' => 'Zıwan',
+       'config-page-welcome' => 'Şıma xeyr ameyê MediaWiki!',
+       'config-page-dbconnect' => 'Database rê grêdey',
        'config-page-name' => 'Name',
+       'config-page-options' => 'Weçinegi',
+       'config-page-install' => 'Barine',
+       'config-page-readme' => 'Mı bıwane',
+       'config-restart' => 'E, fına dest pekê',
+       'config-sidebar' => "* [//www.mediawiki.org MediaWiki keye]
+* [//www.mediawiki.org/wiki/Help:Contents User's Şınasiye]
+* [//www.mediawiki.org/wiki/Manual:Contents Xizmetkara şınasiye]
+* [//www.mediawiki.org/wiki/Manual:FAQ Peşti]
+----
+* <doclink href=Readme>Mı buwanê</doclink>
+* <doclink href=ReleaseNotes>Notê elekeyıni</doclink>
+* <doclink href=Copying>Telifiye</doclink>
+* <doclink href=UpgradeDoc>Weşkerdış</doclink>",
+       'config-env-php' => 'PHP $1 i biyo saz.',
+       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 dılet',
+       'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+       'config-db-port' => 'Portê database:',
+       'config-type-ibm_db2' => 'IBM DB2',
+       'config-header-mysql' => 'Sazkardışê MySQL',
+       'config-mysql-innodb' => 'InnoDB',
+       'config-mysql-myisam' => 'MyISAM',
+       'config-mysql-binary' => 'Dılet',
+       'config-mysql-utf8' => 'UTF-8',
+       'config-site-name' => 'Namey wiki:',
+       'config-ns-generic' => 'Proce',
+       'config-ns-other' => 'Zewbi (keyfiyo)',
+       'config-ns-other-default' => 'MyWiki',
+       'config-admin-box' => 'Hesabê Administratori',
+       'config-admin-name' => 'Namey şıma:',
+       'config-admin-password' => 'Parola:',
+       'config-admin-password-confirm' => 'Fına parola:',
+       'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
+       'config-license-cc-by' => 'Creative Commons Attribution',
+       'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
+       'config-license-pd' => 'Malê Şari',
        'mainpagetext' => "'''MediaWiki vıst ra ser, vıraziya.'''",
        'mainpagedocfooter' => 'Seba gurenayış u eyarkerdışê Wiki-Softwarey [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.
 
@@ -4163,7 +4214,7 @@ $messages['diq'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]',
 );
 
-/** Lower Sorbian (Dolnoserbski) */
+/** Lower Sorbian (dolnoserbski) */
 $messages['dsb'] = array(
        'mainpagetext' => "'''MediaWiki jo se wuspěšnje instalěrowało.'''",
        'mainpagedocfooter' => "Pomoc pśi wužywanju softwary wiki namakajoš pód [//meta.wikimedia.org/wiki/Help:Contents User's Guide].
@@ -4228,6 +4279,7 @@ $messages['eo'] = array(
  * @author Platonides
  * @author Sanbec
  * @author Translationista
+ * @author Vivaelcelta
  */
 $messages['es'] = array(
        'config-desc' => 'El instalador para MediaWiki',
@@ -4638,7 +4690,7 @@ Wikipedia utilizaba anteriormente la licencia de documentación libre de GNU (GF
 La GFDL es una licencia válida, pero es difícil de entender.
 También es difícil reutilizar el contenido licenciado bajo la GFDL.",
        'config-email-settings' => 'Configuración de correo electrónico',
-       'config-enable-email' => 'Activar el envío de e-mails',
+       'config-enable-email' => 'Activar el envío de correos electrónicos',
        'config-enable-email-help' => 'Si quieres que el correo electrónico funcione, la [http://www.php.net/manual/en/mail.configuration.php configuración PHP de correo electrónico] debe ser la correcta.
 Si no quieres la funcionalidad de correo electrónico, puedes desactivarla aquí.',
        'config-email-user' => 'Habilitar correo electrónico de usuario a usuario',
@@ -4769,8 +4821,25 @@ Cuando lo haya hecho, usted puede '''[$2  entrar en su wiki]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]',
 );
 
-/** Estonian (eesti) */
+/** Estonian (eesti)
+ * @author Avjoska
+ */
 $messages['et'] = array(
+       'config-back' => '← Tagasi',
+       'config-continue' => 'Jätka →',
+       'config-page-language' => 'Keel',
+       'config-page-welcome' => 'Tere tulemast MediaWikisse!',
+       'config-page-name' => 'Nimi',
+       'config-page-options' => 'Seaded',
+       'config-page-install' => 'Paigaldamine',
+       'config-page-complete' => 'Valmis!',
+       'config-db-name' => 'Andmebaasi nimi:',
+       'config-db-username' => 'Andmebaasi kasutajanimi:',
+       'config-db-password' => 'Andmebaasi parool:',
+       'config-admin-email' => 'E-posti aadress:',
+       'config-optional-continue' => 'Küsi minult veel küsimusi.',
+       'config-install-step-done' => 'valmis',
+       'config-install-step-failed' => 'ebaõnnestus',
        'mainpagetext' => "'''MediaWiki tarkvara on edukalt paigaldatud.'''",
        'mainpagedocfooter' => 'Juhiste saamiseks kasutamise ning konfigureerimise kohta vaata palun inglisekeelset [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentatsiooni liidese kohaldamisest]
 ning [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide kasutusjuhendit].',
@@ -4778,6 +4847,7 @@ ning [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide kasutusjuhendit].',
 
 /** Basque (euskara)
  * @author An13sa
+ * @author පසිඳු කාවින්ද
  */
 $messages['eu'] = array(
        'config-desc' => 'MediaWiki instalatzailea',
@@ -4805,7 +4875,12 @@ $messages['eu'] = array(
        'config-sidebar' => '* [//www.mediawiki.org MediaWiki nagusia]
 * [//www.mediawiki.org/wiki/Help:Contents Erabiltzaileentzako Gida]
 * [//www.mediawiki.org/wiki/Manual:Contents Administratzaileentzako Gida]
-* [//www.mediawiki.org/wiki/Manual:FAQ MEG]',
+* [//www.mediawiki.org/wiki/Manual:FAQ MEG]
+----
+* <doclink href=Readme>Irakur nazazu</doclink>
+* <doclink href=ReleaseNotes>Oharren argitalpena</doclink>
+* <doclink href=Copying>Kopiaketa</doclink>
+* <doclink href=UpgradeDoc>Eguneratzea</doclink>',
        'config-env-php' => 'PHP $1 instalatuta dago.',
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] instalatuta dago',
        'config-apc' => '[http://www.php.net/apc APC] instalatuta dago',
@@ -4846,7 +4921,9 @@ $messages['eu'] = array(
        'config-license-pd' => 'Domeinu Askea',
        'config-email-settings' => 'E-posta hobespenak',
        'config-logo' => 'Logo URL:',
+       'config-extensions' => 'Luzapenak',
        'config-install-step-done' => 'egina',
+       'config-help' => 'Laguntza',
        'mainpagetext' => "'''MediaWiki arrakastaz instalatu da.'''",
        'mainpagedocfooter' => 'Ikus [//meta.wikimedia.org/wiki/Help:Contents Erabiltzaile Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.
 
@@ -4920,6 +4997,7 @@ $messages['fa'] = array(
 );
 
 /** Finnish (suomi)
+ * @author Beluga
  * @author Centerlink
  * @author Crt
  * @author Nike
@@ -5070,6 +5148,7 @@ Voit ohittaa jäljellä olevat määritykset ja asentaa wikin juuri nyt.',
        'config-profile-wiki' => 'Perinteinen wiki',
        'config-profile-no-anon' => 'Tunnuksen luonti vaaditaan',
        'config-profile-private' => 'Yksityinen wiki',
+       'config-license' => 'Tekijänoikeus ja lisenssi:',
        'config-license-pd' => 'Public domain',
        'config-email-settings' => 'Sähköpostiasetukset',
        'config-logo' => 'Logon URL-osoite',
@@ -5723,6 +5802,7 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
        'config-mysql-old' => 'MySQL $1 ou ben ples novél est nècèssèro, vos avéd $2.',
        'config-db-port' => 'Pôrt de la bâsa de balyês :',
        'config-db-schema' => 'Plan por MediaWiki',
+       'config-pg-test-error' => "Empossiblo de sè branchiér a la bâsa de donâs '''$1''' : $2",
        'config-sqlite-dir' => 'Dossiér de les balyês SQLite :',
        'config-oracle-def-ts' => "Èspâço de stocâjo (''tablespace'') per dèfôt :",
        'config-oracle-temp-ts' => "Èspâço de stocâjo (''tablespace'') temporèro :",
@@ -5860,8 +5940,14 @@ $messages['fy'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]",
 );
 
-/** Irish (Gaeilge) */
+/** Irish (Gaeilge)
+ * @author පසිඳු කාවින්ද
+ */
 $messages['ga'] = array(
+       'config-page-language' => 'Teanga',
+       'config-page-name' => 'Ainm',
+       'config-admin-password' => "D'fhocal faire:",
+       'config-help' => 'Cuidiú',
        'mainpagetext' => "'''D'éirigh le suiteáil MediaWiki.'''",
        'mainpagedocfooter' => 'Féach ar [//meta.wikimedia.org/wiki/MediaWiki_localisation doiciméid um conas an chomhéadán a athrú]
 agus an [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar úsáideora] chun cabhair úsáide agus fíoraíochta a fháil.',
@@ -5916,7 +6002,7 @@ $messages['gd'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]",
 );
 
-/** Galician (Galego)
+/** Galician (galego)
  * @author Elisardojm
  * @author Toliño
  */
@@ -7213,7 +7299,7 @@ $messages['hr'] = array(
 i [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Vodič za suradnike] za pomoć pri uporabi i podešavanju.',
 );
 
-/** Upper Sorbian (Hornjoserbsce)
+/** Upper Sorbian (hornjoserbsce)
  * @author Michawiki
  */
 $messages['hsb'] = array(
@@ -7313,6 +7399,9 @@ Instalacija móhła so njeporadźić!",
        'config-diff3-bad' => 'GNU diff3 njenamakany.',
        'config-no-uri' => "'''Zmylk:''' Aktualny URI njeda so postajić.
 Instalacija bu přetorhnjena.",
+       'config-no-cli-uri' => "'''Warnowanje''': Žana skriptowa šćežka (--scriptpath) podata, standard so wužiwa: <code>$1</code>.",
+       'config-using-server' => 'Serwerowe mjeno "<nowiki>$1</nowiki>" so wužiwa.',
+       'config-using-uri' => 'Serwerowy URL "<nowiki>$1$2</nowiki>" so wužiwa.',
        'config-db-type' => 'Typ datoweje banki:',
        'config-db-host' => 'Serwer datoweje banki:',
        'config-db-host-oracle' => 'Datowa banka TNS:',
@@ -7540,6 +7629,7 @@ Standardna lisćina sp přeskakuje.",
        'config-install-mainpage-failed' => 'Powěsć njeda so zasunyć: $1',
        'config-download-localsettings' => 'LocalSettings.php sćahnyć',
        'config-help' => 'pomoc',
+       'config-nofile' => 'Dataja "$1" njeje so namakała. Je so zhašała?',
        'mainpagetext' => "'''MediaWiki bu wuspěšnje instalowany.'''",
        'mainpagedocfooter' => 'Prošu hlej [//meta.wikimedia.org/wiki/Help:Contents dokumentaciju] za informacije wo wužiwanju softwary.
 
@@ -8651,6 +8741,7 @@ Post facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
 /** Indonesian (Bahasa Indonesia)
  * @author Farras
  * @author IvanLanin
+ * @author Kenrick95
  * @author Reedy
  */
 $messages['id'] = array(
@@ -9027,7 +9118,7 @@ Konfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [
        'config-license-none' => 'Tidak ada lisensi',
        'config-license-cc-by-sa' => 'Creative Commons Atribusi Berbagi Serupa',
        'config-license-cc-by' => 'Creative Commons Atribusi',
-       'config-license-cc-by-nc-sa' => 'Creative Commons Atribusi Non-Komersial Berbagi Serupa',
+       'config-license-cc-by-nc-sa' => 'Creative Commons Atribusi Nonkomersial Berbagi Serupa',
        'config-license-cc-0' => 'Creative Commons Zero (Domain Publik)',
        'config-license-gfdl' => 'Lisensi Dokumentasi Bebas GNU 1.3 atau versi terbaru',
        'config-license-pd' => 'Domain Umum',
@@ -9218,6 +9309,8 @@ $messages['is'] = array(
 
 /** Italian (italiano)
  * @author Beta16
+ * @author Darth Kule
+ * @author F. Cosoleto
  * @author Karika
  */
 $messages['it'] = array(
@@ -9280,12 +9373,51 @@ Non è possibile installare MediaWiki.",
        'config-env-php' => 'PHP $1 è installato.',
        'config-env-php-toolow' => 'PHP $1 è installato.
 Tuttavia, MediaWiki richiede PHP $2 o superiore.',
+       'config-outdated-sqlite' => "'''Attenzione''': è presente SQLite $1 mentre è richiesta la versione $2, SQLite non sarà disponibile.",
+       'config-no-fts3' => "'''Attenzione''': SQLite è compilato senza il [//sqlite.org/fts3.html modulo FTS3], le funzionalità di ricerca non saranno disponibili su questo backend.",
+       'config-xml-bad' => 'Il modulo XML di PHP è mancante.
+MediaWIki necessita di funzioni presenti in questo modulo e non funzionerà con la configurazione corrente.
+Se si sta eseguendo Mandrake, installare il paccketto php-xml.',
+       'config-pcre' => 'Il modulo per il supporto PCRE sembra essere mancante.
+MediaWiki necessita di questo modulo per funzinare, che fornisce funzioni per le espressioni regolari Perl-compatibili.',
+       'config-pcre-no-utf8' => "'''Errore''': Il modulo PCRE di PHP sembra essere stato compilato senza il supporto PCRE_UTF8, ma MediaWiki lo richiede per funzionare correttamente.",
+       'config-memory-raised' => 'Il valore <code>memory_limit</code> di PHP è $1, aumentato a $2.',
+       'config-memory-bad' => "''Attenzione:''' Il valore di <code>memory_limit</code> di PHP è $1.
+Probabilmente è troppo basso.
+L'installazione potrebbe non riuscire!",
+       'config-ctype' => "'''Errore''': PHP deve essere compilato con il supporto per la [http://www.php.net/manual/en/ctype.installation.php estensione Ctype].",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] è installato',
        'config-apc' => '[http://www.php.net/apc APC] è installato',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] è installato',
+       'config-no-cache' => "'''Attenzione:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache] non sono stati trovati.
+La caching degli oggetti non è attivata.",
        'config-diff3-bad' => 'GNU diff3 non trovato.',
+       'config-imagemagick' => 'Trovato ImageMagick: <code>$1</code>.
+Le miniature delle immagini saranno presenti se gli upload vengono abilitati.',
+       'config-gd' => 'Trovata la GD Graphics Library built-in.
+Le miniature delle immagini saranno presenti se gli upload vengono abilitati.',
+       'config-no-scaling' => 'La GD library o ImageMagick non sono state trovate.
+Le miniature delle immagini saranno disabilitate.',
+       'config-no-uri' => "'''Errore:''' Impossibile determinare l'URI attuale.
+Installazione interrotta.",
+       'config-no-cli-uri' => "'''Attenzione''': --scriptpath non specificato, si utilizza il valore predefinito: <code>$1</code>.",
+       'config-using-server' => 'Nome server in uso "<nowiki>$1</nowiki>".',
+       'config-using-uri' => 'URL del server in uso "<nowiki>$1$2</nowiki>".',
        'config-db-type' => 'Tipo di database:',
+       'config-db-name' => 'Nome del database:',
+       'config-db-password-empty' => 'Inserire una password per il nuovo utente del database: $1.
+Anche se può essere possibile creare utenti senza password, questo non è sicuro.',
+       'config-db-install-help' => "Inserire il nome utente e la password che verranno usate per la connessione al database durante il processo d'installazione.",
+       'config-db-charset' => 'Set di caratteri del database',
+       'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+       'config-charset-mysql4' => 'MySQL 4.0 con compatibilità UTF-8',
+       'config-mysql-old' => 'MySQL $1 o una versione successiva è necessaria, rilevata la $2.',
+       'config-db-port' => 'Porta del database:',
+       'config-db-schema' => 'Schema per MediaWiki:',
+       'config-db-schema-help' => 'Questo schema in genere andrà bene.
+Da cambiare solamente se si è sicuri di averne bisogno.',
        'config-pg-test-error' => "Impossibile connettersi al database '''$1''': $2",
+       'config-sqlite-dir' => 'Directory data di SQLite:',
        'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'Impostazioni MySQL',
        'config-header-postgres' => 'Impostazioni PostgreSQL',
@@ -9293,8 +9425,13 @@ Tuttavia, MediaWiki richiede PHP $2 o superiore.',
        'config-header-oracle' => 'Impostazioni Oracle',
        'config-header-ibm_db2' => 'Impostazioni IBM DB2',
        'config-invalid-db-type' => 'Tipo di database non valido',
+       'config-db-web-create' => "Crea l'account se non esiste già",
+       'config-mysql-engine' => 'Storage engine:',
        'config-mysql-innodb' => 'InnoDB',
+       'config-mysql-myisam' => 'MyISAM',
+       'config-mysql-charset' => 'Set di caratteri del database:',
        'config-mysql-utf8' => 'UTF-8',
+       'config-ibm_db2-low-db-pagesize' => "Il database DB2 in uso ha una tablespace predefinita con un insufficiente pagesize, che dovrebbe essere '''32K''' o maggiore.",
        'config-ns-generic' => 'Progetto',
        'config-ns-site-name' => 'Stesso nome wiki: $1',
        'config-admin-box' => 'Account amministratore',
@@ -9310,6 +9447,14 @@ Specificare un nome utente diverso.',
        'config-admin-password-same' => 'La password non deve essere uguale al nome utente.',
        'config-admin-password-mismatch' => 'Le password inserite non coincidono tra loro.',
        'config-admin-email' => 'Indirizzo e-mail:',
+       'config-admin-error-bademail' => 'È stato inserito un indirizzo email non valido.',
+       'config-subscribe-help' => 'Si tratta di una mailing list a basso traffico dedicata agli annunci di nuove versioni, compresi importanti segnalazioni riguardanti la sicurezza.
+È consigliato iscriversi e aggiornare la proprio installazione di MediaWiki quando una nuova versione viene resa pubblica.',
+       'config-subscribe-noemail' => "Hai provato ad iscriverti alla mailing list dedicata agli annunci delle nuove versioni senza fornire un indirizzo email.
+Inserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing list.",
+       'config-almost-done' => 'Hai quasi finito!
+Adesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.',
+       'config-license' => 'Copyright e licenza:',
        'config-license-cc-by-sa' => 'Creative Commons Attribuzione-Condividi allo stesso modo',
        'config-license-cc-by' => 'Creative Commons Attribuzione',
        'config-license-cc-by-nc-sa' => 'Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo',
@@ -9317,6 +9462,18 @@ Specificare un nome utente diverso.',
        'config-license-gfdl' => 'GNU Free Documentation License 1.3 o versioni successive',
        'config-license-pd' => 'Pubblico dominio',
        'config-email-settings' => 'Impostazioni email',
+       'config-email-auth' => 'Abilita autenticazione via email',
+       'config-upload-deleted' => 'Directory per i file cancellati:',
+       'config-logo' => 'URL del logo:',
+       'config-cc-again' => 'Seleziona di nuovo...',
+       'config-cc-not-chosen' => 'Scegliere quale licenza Creative Commons si desidera e cliccare su "procedi".',
+       'config-advanced-settings' => 'Configurazione avanzata',
+       'config-memcache-badip' => 'È stato inserito un indirizzo IP non valido per Memcached: $1.',
+       'config-extensions' => 'Estensioni',
+       'config-install-user-alreadyexists' => 'L\'utente "$1" è già presente',
+       'config-install-user-create-failed' => 'Creazione dell\'utente "$1" non riuscita: $2',
+       'config-install-user-missing' => 'L\'utente indicato "$1" non esiste.',
+       'config-install-tables-failed' => "'''Errore''': La creazione della tabella non è riuscita: $1",
        'config-install-interwiki-list' => 'Impossibile leggere il file <code>interwiki.list</code>.',
        'config-install-stats' => 'Inizializzazione delle statistiche',
        'config-install-keys' => 'Generazione delle chiavi segrete',
@@ -9326,6 +9483,8 @@ Specificare un nome utente diverso.',
        'config-install-mainpage' => 'Creazione della pagina principale con contenuto predefinito',
        'config-install-mainpage-failed' => 'Impossibile inserire la pagina principale: $1',
        'config-download-localsettings' => 'Scarica LocalSettings.php',
+       'config-help' => 'aiuto',
+       'config-nofile' => 'Il file "$1" non può essere trovato. È stato eliminato?',
        'mainpagetext' => "'''Installazione di MediaWiki completata correttamente.'''",
        'mainpagedocfooter' => "Consultare la [//meta.wikimedia.org/wiki/Aiuto:Sommario Guida utente] per maggiori informazioni sull'uso di questo software wiki.
 
@@ -9369,17 +9528,17 @@ LocalSettings.phpを変更してこの変数を設定して、『{{int:Config-co
 セッションの有効期間は$1に設定されています。
 php.iniの<code>session.gc_maxlifetime</code>を設定することで、この問題を改善できます。
 インストール作業を再起動させてください。',
-       'config-no-session' => 'ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81®ã\83\87ã\83¼ã\82¿ã\81\8cæ\90\8d失しました!
-php.iniを確認し、<code>session.save_path</code>が適切なディレクトリに設定されていることを確かめて下さい。',
+       'config-no-session' => 'ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81®ã\83\87ã\83¼ã\82¿ã\81\8cæ\88失しました!
+php.iniを確認し、<code>session.save_path</code>が適切なディレクトリに設定されていることを確認してください。',
        'config-your-language' => 'あなたの言語:',
-       'config-your-language-help' => 'インストール作業中に利用する言語を選んで下さい。',
+       'config-your-language-help' => 'インストール作業に使用する言語を選択してください。',
        'config-wiki-language' => 'ウィキの言語:',
-       'config-wiki-language-help' => 'ã\81\9dã\81®ã\82¦ã\82£ã\82­ã\81§ä¸»ã\81«æ\9b¸ã\81\8dè¾¼ã\81¾ã\82\8cã\82\8bè¨\80èª\9eã\82\92é\81¸ã\82\93ã\81§ä¸\8bさい。',
+       'config-wiki-language-help' => 'ã\82¦ã\82£ã\82­ã\81§ä¸»ã\81«æ\9b¸ã\81\8dè¾¼ã\81¾ã\82\8cã\82\8bè¨\80èª\9eã\82\92é\81¸æ\8a\9eã\81\97ã\81¦ã\81\8fã\81 さい。',
        'config-back' => '←戻る',
-       'config-continue' => '続行→',
+       'config-continue' => '続行 →',
        'config-page-language' => '言語',
        'config-page-welcome' => 'MediaWikiへようこそ!',
-       'config-page-dbconnect' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81¸接続',
+       'config-page-dbconnect' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«接続',
        'config-page-upgrade' => '既存のインストールを更新',
        'config-page-dbsettings' => 'データベースの設定',
        'config-page-name' => '名前',
@@ -9392,18 +9551,18 @@ php.iniを確認し、<code>session.save_path</code>が適切なディレクト
        'config-page-copying' => 'コピー',
        'config-page-upgradedoc' => 'アップグレード',
        'config-page-existingwiki' => '既存のウィキ',
-       'config-help-restart' => 'å\85¥å\8a\9bã\81\95ã\82\8cã\81\9få\85¨ã\81¦ã\81®ä¿\9då­\98ã\83\87ã\83¼ã\82¿ã\82\92æ¶\88å\8e»ã\81\97、インストール作業を再起動しますか?',
+       'config-help-restart' => 'å\85¥å\8a\9bã\81\97ã\81\9fä¿\9då­\98ã\83\87ã\83¼ã\82¿ã\82\92ã\81\99ã\81¹ã\81¦æ¶\88å\8e»ã\81\97ã\81¦、インストール作業を再起動しますか?',
        'config-restart' => 'はい、再起動します',
        'config-welcome' => '=== 環境の確認 ===
 基本的な確認では、現在の環境がMediaWikiのインストールに適しているかを確認します。
-インストール中に助けが必要になった場合は、この確認結果を提供してさい。',
+インストール中に助けが必要になった場合は、この確認結果を提供してください。',
        'config-copyright' => '=== 著作権および規約 ===
 $1
 
-この作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License)(バージョン2、またはそれ以降のライセンス)の規約にもとづき、このライブラリの再配布や改変をすることができます。
+この作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License)(バージョン2、またはそれ以降のライセンス)の規約に基づき、このライブラリを再配布および改変できます。
 
 この作品は、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。
-詳しくは、GNU一般公衆利用許諾書をご覧さい。
+詳しくは、GNU一般公衆利用許諾書をご覧ください。
 
 あなたはこのプログラムと共に、<doclink href=Copying>GNU一般公衆利用許諾契約書の複製</doclink>を一部受け取ったはずです。もし受け取っていなければ、フリーソフトウェア財団(宛先は the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA)まで請求してください。',
        'config-sidebar' => '* [//www.mediawiki.org MediaWikiのホーム]
@@ -9425,7 +9584,7 @@ MediaWikiのインストールはできません。',
        'config-unicode-using-utf8' => 'Unicode正規化に、Brion Vibberのutf8_normalize.soを使用。',
        'config-unicode-using-intl' => 'Unicode正規化に[http://pecl.php.net/intl intl PECL 拡張機能]を使用。',
        'config-unicode-pure-php-warning' => "'''警告''':Unicode正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]が使用可能ではなく、処理の遅いピュア PHP の実装を代わりに用いています。
-高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode正規化に関するページ]をお読みさい。",
+高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode正規化に関するページ]をお読みください。",
        'config-unicode-update-warning' => "'''警告''':インストールされているバージョンのUnicode正規化ラッパーは、[http://site.icu-project.org/ ICUプロジェクト]のライブラリの古いバージョンを使用しています。
 Unicodeを少しでも利用する可能性があるなら、[//www.mediawiki.org/wiki/Unicode_normalization_considerations アップグレード]する必要があります。",
        'config-no-db' => '適切なデータベースドライバが見つかりませんでした!PHPにデータベースドライバをインストールする必要があります。
@@ -9477,6 +9636,8 @@ MediaWikiにはUTF-8サポートの関数が必要です。",
 画像のサムネイル生成は無効になります。',
        'config-no-uri' => "'''エラー:'''現在のURIを決定できませんでした。
 インストールは中止されました。",
+       'config-using-server' => 'サーバー名「<nowiki>$1</nowiki>」を使用しています。',
+       'config-using-uri' => 'サーバーURL「<nowiki>$1$2</nowiki>」を使用しています。',
        'config-uploads-not-safe' => "'''警告:'''アップロードの既定ディレクトリ<code>$1</code>が、任意のスクリプト実行に関して脆弱性があります。
 MediaWikiはアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化するまえに、[//www.mediawiki.org/wiki/Manual:Security#Upload_security このセキュリティ上の脆弱性を閉じる]ことが強く推奨されます。",
        'config-brokenlibxml' => 'このシステムで使われているPHPとlibxml2のバージョンのこの組み合わせにはバグがあります。具体的には、MediaWikiやその他のウェブアプリケーションでhiddenデータが破損する可能性があります。
@@ -9488,19 +9649,21 @@ PHP5.3.2以降に更新するか、この([//bugs.php.net/bug.php?id=50394 PHP
        'config-suhosin-max-value-length' => 'Suhosin がインストールされており、GETパラメータの長さを $1 バイトに制限しています。MediaWiki の ResourceLoader コンポーネントはこの制限を回避しますが、パフォーマンスは低下します。可能な限り、php.ini で suhosin.get.max_value_length を 1024 以上に設定し、同じ値を LocalSettings.php 中で $wgResourceLoaderMaxQueryLength に設定してください。',
        'config-db-type' => 'データベースの種類:',
        'config-db-host' => 'データベースのホスト:',
-       'config-db-host-help' => 'データベースサーバーが異なったサーバー上にある場合、ホスト名またはIPアドレスをここに入力してください。
+       'config-db-host-help' => '異なるサーバー上にデータベースサーバーがある場合、ホスト名またはIPアドレスをここに入力してください。
 
\82\82ã\81\97ã\80\81å\85±æ\9c\89ã\81\95ã\82\8cã\81\9fã\82¦ã\82§ã\83\96ã\83\9bã\82¹ã\83\86ã\82£ã\83³ã\82°ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\80\81ã\83\9bã\82¹ã\83\86ã\82£ã\83³ã\82°ã\83»ã\83\97ã\83­ã\83\90ã\82¤ã\83\80ã\81¯æ­£ç¢ºã\81ªã\83\9bã\82¹ã\83\88ã\83\8dã\83¼ã\83 を解説しているはずです。
\82\82ã\81\97ã\80\81å\85±æ\9c\89ã\81\95ã\82\8cã\81\9fã\82¦ã\82§ã\83\96ã\83\9bã\82¹ã\83\86ã\82£ã\83³ã\82°ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\80\81ã\83\9bã\82¹ã\83\86ã\82£ã\83³ã\82°ã\83\97ã\83­ã\83\90ã\82¤ã\83\80ã\83¼ã\81¯æ­£ç¢ºã\81ªã\83\9bã\82¹ã\83\88å\90\8dを解説しているはずです。
 
-WindowsでMySQLを使用している場合に、「localhost」は、サーバー名としてはうまく働かないでしょう。もしそのような場合は、ローカルIPアドレスとして「127.0.0.1」を試してみてください。',
+WindowsでMySQLを使用している場合に、「localhost」は、サーバー名としてはうまく働かないでしょう。もしそのような場合は、ローカルIPアドレスとして「127.0.0.1」を試してみてください。
+
+PostgreSQLを使用している場合、UNIXソケットで接続するにはこの欄を空欄のままにしてください。',
        'config-db-host-oracle' => 'データベースTNS:',
        'config-db-host-oracle-help' => '有効な[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ローカル接続名]を入力してください。tnsnames.oraファイルは、このインストールに対して表示されてなければなりません、<br />もしクライアントライブラリ10gもしくはそれ以上を使用している場合、メソッドの名前を[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 簡易接続]で利用できます。',
        'config-db-wiki-settings' => 'このウィキを識別',
        'config-db-name' => 'データベース名:',
-       'config-db-name-help' => 'このウィキを識別する名前を選んで下さい。
-スペースを含めることはできません。
+       'config-db-name-help' => 'このウィキを識別する名前を入力してください。
+空白を含めることはできません。
 
\85±æ\9c\89ã\82¦ã\82§ã\83\96ã\83\9bã\82¹ã\83\88ã\82\92å\88©ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\80\81ã\83\9bã\82¹ã\83\88ã\83»ã\83\97ã\83­ã\83\90ã\82¤ã\83\80ã\83¼ã\81¯ç\89¹å®\9aã\81®å\88©用可能なデータベース名を提供するか、あるいは管理パネルからデータベースを作成できるようにしているでしょう。',
\85±æ\9c\89ã\82¦ã\82§ã\83\96ã\83\9bã\82¹ã\83\88ã\82\92å\88©ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\80\81ã\83\9bã\82¹ã\83\86ã\82£ã\83³ã\82°ã\83\97ã\83­ã\83\90ã\82¤ã\83\80ã\83¼ã\81\8cç\89¹å®\9aã\81®ä½¿用可能なデータベース名を提供するか、あるいは管理パネルからデータベースを作成できるようにしているでしょう。',
        'config-db-name-oracle' => 'データベースのスキーマ:',
        'config-db-install-account' => 'インストールのための利用者アカウント',
        'config-db-username' => 'データベースの利用者名:',
@@ -9513,10 +9676,10 @@ WindowsでMySQLを使用している場合に、「localhost」は、サーバ
        'config-db-account-lock' => 'インストール作業終了後も同じ利用者名とパスワードを使用する',
        'config-db-wiki-account' => 'インストール作業終了後の利用者アカウント',
        'config-db-wiki-help' => '通常のウィキ操作中にデータベースへの接続する時に利用する利用者名とパスワードを入力してください。
-アカウントがないが、インストールのアカウントに十分な権限があれば、このユーザーアカウントは、ウィキを操作するうえで最小限の権限を持った状態で作成されます。',
+アカウントが存在せず、インストールのアカウントに十分な権限がある場合は、この利用者アカウントは、ウィキを操作する上で最小限の権限を持った状態で作成されます。',
        'config-db-prefix' => 'データベーステーブルの接頭辞:',
-       'config-db-prefix-help' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92è¤\87æ\95°ã\81®ã\82¦ã\82£ã\82­é\96\93ã\80\81ã\82\82ã\81\97ã\81\8fã\81¯MediaWikiã\81¨ä»\96ã\81®ã\82¦ã\82§ã\83\96ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81§å\85±æ\9c\89ã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8bå ´å\90\88ã\80\81è¡\9dçª\81ã\82\92é\81¿ã\81\91ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ã\81\99ã\81¹ã\81¦ã\81®ã\83\86ã\83¼ã\83\96ã\83«å\90\8dã\81«æ\8e¥é ­è¾\9eã\82\92ã\81¤ける必要があります。
-スペースは使用できません。
+       'config-db-prefix-help' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92è¤\87æ\95°ã\81®ã\82¦ã\82£ã\82­é\96\93ã\80\81ã\81\82ã\82\8bã\81\84ã\81¯MediaWikiã\81¨ä»\96ã\81®ã\82¦ã\82§ã\83\96ã\82¢ã\83\97ã\83ªã\82±ã\83¼ã\82·ã\83§ã\83³ã\81§å\85±æ\9c\89ã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8bå ´å\90\88ã\80\81è¡\9dçª\81ã\82\92é\81¿ã\81\91ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ã\81\99ã\81¹ã\81¦ã\81®ã\83\86ã\83¼ã\83\96ã\83«å\90\8dã\81«æ\8e¥é ­è¾\9eã\82\92ä»\98ける必要があります。
+空白は使用できません。
 
 このフィールドは、通常は空のままです。',
        'config-db-charset' => 'データベースの文字セット',
@@ -9525,9 +9688,9 @@ WindowsでMySQLを使用している場合に、「localhost」は、サーバ
        'config-charset-mysql4' => 'MySQL 4.0 下位互換UTF-8',
        'config-charset-help' => "'''警告:'''MySQL 4.1+で'''下位互換UTF-8'''を使用し、その後<code>mysqldump</code>でデータベースをバックアップすると、すべての非ASCII文字が破壊され、不可逆的にバップアップが壊れるかもしれません。
 
-'''バイナリー式'''では、MediaWikiは、UTF-8テキストを、データベースのバイナリーフィールドに格納します。
-これは、MySQLのUTF-8形式より効率的で、ユニコード文字の全範囲を利用することが出来るようになります。
-'''UTF-8å½¢å¼\8f'''ã\81§ã\81¯ã\80\81MySQLã\81¯ã\80\81ã\81ªã\82\93ã\81®æ\96\87å­\97é\9b\86å\90\88ã\81\8cã\83\87ã\83¼ã\82¿ã\81®ã\81ªã\81\8bã\81«å\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bã\81\8bã\82\92ç\9f¥ã\82\8a、それに対して適切な提示と変換をするでしょうが、
+'''バイナリー式'''では、MediaWikiは、UTF-8テキストを、データベースのバイナリーフィールドに格納します。
+これは、MySQLのUTF-8形式より効率的で、Unicode文字の全範囲を利用できるようになります。
+'''UTF-8å½¢å¼\8f'''ã\81§ã\81¯ã\80\81MySQLã\81¯ã\80\81ã\83\87ã\83¼ã\82¿å\86\85ã\81§ã\81©ã\81®æ\96\87å­\97é\9b\86å\90\88ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bã\81\8bã\82\92ç\9f¥ã\81£ã\81¦ã\81\84ã\81¦、それに対して適切な提示と変換をするでしょうが、
 [//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できるようにはなりません。",
        'config-mysql-old' => 'MySQLの$1以降が要求されています。あなたの所有のものは$2です。',
        'config-db-port' => 'データベースポート:',
@@ -9535,15 +9698,15 @@ WindowsでMySQLを使用している場合に、「localhost」は、サーバ
        'config-db-schema-help' => '上の図式は常に正確です。
 必要である場合のみ、変更してください。',
        'config-sqlite-dir' => 'SQLiteのデータディレクトリ:',
-       'config-sqlite-dir-help' => 'SQLiteは単一のファイル中に全てのデータを保持しています。
+       'config-sqlite-dir-help' => "SQLiteは単一のファイル内にすべてのデータを保持しています。
 
-あなたが供給するディレクトリーはインストール時にウェブサーバーによって書き込み可能でなければならない
+指定したディレクトリは、インストール時にウェブサーバーが書き込める必要があります
 
\82¦ã\82§ã\83\96ã\82\92é\80\9aã\81\97ã\81¦ã\82¢ã\82¯ã\82»ã\82¹å\8f¯è\83½"ä¸\8då\8f¯è\83½"ã\81§ã\81ªã\81\91ã\82\8cã\81°ã\81ªã\82\89ã\81ªã\81\84ã\80\82ã\81\93ã\82\8cã\81¯ã\81\82ã\81ªã\81\9fã\81®PHPã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\81\82ã\82\8bæ\89\80ã\81«é\85\8dç½®ä¸\8dè\83½ã\81ª理由です。
\81\93ã\81®ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81¯ã\82¦ã\82§ã\83\96ã\81\8bã\82\89ã\82¢ã\82¯ã\82»ã\82¹'''ä¸\8då\8f¯è\83½'''ã\81§ã\81\82ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82ã\81\93ã\82\8cã\81\8cPHPã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81\82ã\82\8bå ´æ\89\80ã\81«é\85\8dç½®ã\81§ã\81\8dã\81ªã\81\84理由です。
 
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81¯å\85±ã\81«<code>.htaccess</code>ã\83\95ã\82¡ã\82¤ã\83«ã\82\92æ\9b¸ã\81\8dè¾¼ã\82\80ã\81\93ã\81¨ã\81§ã\81\97ã\82\87ã\81\86ã\80\82ã\81\97ã\81\8bã\81\97ã\80\81ä¾\8bã\81\88失æ\95\97ã\81\97ã\81¦ã\82\82誰ã\81\8bã\81\8cã\81\82ã\81ªã\81\9fã\81®ç\94\9fã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\82¢ã\82¯ã\82»ã\82¹ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cå\8f¯è\83½ã\81¨ã\81ªã\82\8bã\81§ã\81\97ã\82\87ã\81\86
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81¯å\90\8cæ\99\82ã\81«<code>.htaccess</code>ã\83\95ã\82¡ã\82¤ã\83«ã\81«æ\9b¸ã\81\8dè¾¼ã\81¿ã\81¾ã\81\99ã\80\82ã\81\97ã\81\8bã\81\97ã\80\81ã\81\93ã\82\8cã\81\8c失æ\95\97ã\81\97ã\81¦ã\82\82誰ã\81\8bã\81\8cã\81\82ã\81ªã\81\9fã\81®ç\94\9fã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\82¢ã\82¯ã\82»ã\82¹ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cå\8f¯è\83½ã\81¨ã\81ªã\82\8bã\81§ã\81\97ã\82\87ã\81\86ã\80\82ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81¯ç\94\9fã\81®ã\83\87ã\83¼ã\82¿ï¼\88ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\80\81ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®ã\83\8fã\83\83ã\82·ã\83¥å\80¤ï¼\89ã\81®ä»\96ã\80\81å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fç\89\88ã\80\81ã\81\9dã\81®ä»\96ã\80\81ã\82¦ã\82£ã\82­ä¸\8aã\81®å\88¶é\99\90ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\87ã\83¼ã\82¿ã\82\92å\90«ã\82\93ã\81§ã\81\84ã\81¾ã\81\99
 
-ä¾\8bã\81\88ã\81°<code>/var/lib/mediawiki/yourwiki</code>ã\81®ã\82\88ã\81\86ã\81«ã\80\81å\85¨ã\81\8fé\81\95ã\81\86å ´æ\89\80ã\81«ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92é\85\8dç½®ã\81\99ã\82\8bã\81\93ã\81¨ã\82\92è\80\83ã\81\88ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82',
+ä¾\8bã\81\88ã\81°<code>/var/lib/mediawiki/yourwiki</code>ã\81®ã\82\88ã\81\86ã\81«ã\80\81å\88¥ã\81®å ´æ\89\80ã\81«ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92é\85\8dç½®ã\81\99ã\82\8bã\81\93ã\81¨ã\82\92æ¤\9cè¨\8eã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82",
        'config-oracle-def-ts' => '既定のテーブル領域:',
        'config-oracle-temp-ts' => '一時的なテーブル領域:',
        'config-type-mysql' => 'MySQL',
@@ -9566,28 +9729,28 @@ $1
        'config-header-sqlite' => 'SQLiteの設定',
        'config-header-oracle' => 'Oracleの設定',
        'config-header-ibm_db2' => 'IBM DB2の設定',
-       'config-invalid-db-type' => '不正なデータベースの種類',
+       'config-invalid-db-type' => '無効なデータベースの種類',
        'config-missing-db-name' => '「データベース名」を入力する必要があります',
        'config-missing-db-host' => '「データベースのホスト」を入力する必要があります',
        'config-missing-db-server-oracle' => '「データベースTNS」に値を入力する必要があります',
-       'config-invalid-db-server-oracle' => '不正なデータベースTNS「$1」です。
-アスキー文字(a-z, A-Z)、数字(0-9)およびアンダーバー(_)とドット(.)のみを使用してください。',
-       'config-invalid-db-name' => '無効なデータベース名 "$1"
-アスキー文字(a-z, A-Z)、数字(0-9)、アンダーバー(_)、ハイフン(-)のみを使用してください。',
-       'config-invalid-db-prefix' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®æ\8e¥é ­èª\9e "$1" ã\81\8cç\84¡å\8a¹です。
-アスキー字(a-z, A-Z)、数字(0-9)、下線(_)、ハイフン(-)のみを使用してください。',
+       'config-invalid-db-server-oracle' => '「$1」は無効なデータベース TNS です。
+アスキー英字(a-z、A-Z)、数字(0-9)、アンダーバー(_)、ドット(.)のみを使用してください。',
+       'config-invalid-db-name' => '「$1」は無効なデータベース名です
+アスキー英字(a-z、A-Z)、数字(0-9)、アンダーバー(_)、ハイフン(-)のみを使用してください。',
+       'config-invalid-db-prefix' => 'ã\80\8c$1ã\80\8dã\81¯ç\84¡å\8a¹ã\81ªã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹æ\8e¥é ­èª\9eです。
+アスキー字(a-z, A-Z)、数字(0-9)、下線(_)、ハイフン(-)のみを使用してください。',
        'config-connection-error' => '$1。
 
 以下のホスト名、ユーザ名、パスワードをチェックして、再度試してみてください。',
-       'config-invalid-schema' => 'メディアウィキ"$1"における無効な図式です。
-アスキー文字(a-z, A-Z)、数字(0-9)、下線(_)のみを使用してください。',
+       'config-invalid-schema' => 'メディアウィキ「$1」における無効な図式です。
+アスキー英字(a-z、A-Z)、数字(0-9)、下線(_)のみを使用してください。',
        'config-postgres-old' => 'PostgreSQLの$1あるいはそれ以降が必要で、いまのバージョンは$2です。',
        'config-sqlite-name-help' => 'あなたのウェキと同一性のある名前を選んでください。
 空白およびハイフンは使用しないでください。
 SQLiteのデータファイル名として使用されます。',
-       'config-sqlite-parent-unwritable-group' => 'データディレクトリ<code><nowiki>$1</nowiki></code>を作成できません。親ディレクトリ<code><nowiki>$2</nowiki></code>は、ウェブサーバから書き込みできませんでした。
+       'config-sqlite-parent-unwritable-group' => 'ã\83\87ã\83¼ã\82¿ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ª<code><nowiki>$1</nowiki></code>ã\82\92ä½\9cæ\88\90ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82親ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ª<code><nowiki>$2</nowiki></code>ã\81¯ã\80\81ã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\83¼ã\81\8bã\82\89æ\9b¸ã\81\8dè¾¼ã\81¿ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\81§ã\81\97ã\81\9fã\80\82
 
-インストール機能は、実行しているウェブサーバのユーザーを特定しました。
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«æ©\9fè\83½ã\81¯ã\80\81å®\9fè¡\8cã\81\97ã\81¦ã\81\84ã\82\8bã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\83¼ã\81®ã\83¦ã\83¼ã\82¶ã\83¼ã\82\92ç\89¹å®\9aã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
 続行するには、<code><nowiki>$3</nowiki></code>ディレクトリを書き込み可能にしてください。
 UnixあるいはLinux上では、以下を実行してください:
 
@@ -9598,19 +9761,19 @@ chmod g+w $3</pre>',
        'config-sqlite-parent-unwritable-nogroup' => 'データディレクトリ<code><nowiki>$1</nowiki></code>を作成できません。親ディレクトリ<code><nowiki>$2</nowiki></code>は、ウェブサーバから書き込みできませんでした。
 
 インストール機能は、実行しているウェブサーバのユーザーを特定できませんでした。
-ç¶\9aè¡\8cã\81\99ã\82\8bã\81«ã\81¯ã\80\81<code><nowiki>$3</nowiki></code>ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\82\92ã\80\81ã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ï¼\88ã\81¨ä»\96ã\81®ã\83¦ã\83¼ã\82¶ï¼\81ï¼\89ã\81\8bã\82\89ã\82°ã\83­ã\83¼ã\83\90ã\83«ã\81«æ\9b¸ã\81\8dè¾¼ã\81¿å\87ºæ\9d¥るようにしてください。
+ç¶\9aè¡\8cã\81\99ã\82\8bã\81«ã\81¯ã\80\81<code><nowiki>$3</nowiki></code>ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\82\92ã\80\81ã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ï¼\88ã\81¨ä»\96ã\81®ã\83¦ã\83¼ã\82¶ï¼\81ï¼\89ã\81\8bã\82\89ã\82°ã\83­ã\83¼ã\83\90ã\83«ã\81«æ\9b¸ã\81\8dè¾¼ã\82\81るようにしてください。
 UnixあるいはLinux上では、以下を実行してください:
 
 <pre>cd $2
 mkdir $3
 chmod a+w $3</pre>',
-       'config-sqlite-mkdir-error' => 'ã\83\87ã\83¼ã\82¿ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\83¼"$1"ã\82\92ä½\9cæ\88\90ã\81\97ã\81\9fã\81\93ã\81¨ã\81«ã\82\88ã\82\8bã\82¨ã\83©ã\83¼
-場所をチェックして、再度試してください。',
-       'config-sqlite-dir-unwritable' => 'ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\83¼"$1"ã\82\92æ\9b¸ã\81\8dè¾¼ã\82\80ã\81\93ã\81¨ã\81\8cã\81§ã\81\8dません。
\83\91ã\83¼ã\83\9fã\83\83ã\82·ã\83§ã\83³ã\82\92å¤\89æ\9b´ã\81\99ã\82\8cã\81°ã\80\81ã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\83¼ã\81\8cæ\9b¸ã\81\8dè¾¼ã\81¿å\8f¯è\83½ã\81¨ã\81ªã\82\8aã\81¾ã\81\99ã\80\82å\86\8d度試してください。',
+       'config-sqlite-mkdir-error' => 'ã\83\87ã\83¼ã\82¿ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\80\8c$1ã\80\8dã\81®ä½\9cæ\88\90中ã\81«ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81¾ã\81\97ã\81\9f
+場所を確認してから、再度試してください。',
+       'config-sqlite-dir-unwritable' => 'ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\80\8c$1ã\80\8dã\81«æ\9b¸ã\81\8dè¾¼ã\82\81ません。
\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\83¼ã\81\8cæ\9b¸ã\81\8dè¾¼ã\82\81ã\82\8bã\82\88ã\81\86ã\81«ã\83\91ã\83¼ã\83\9fã\83\83ã\82·ã\83§ã\83³ã\82\92å¤\89æ\9b´ã\81\97ã\81¦ã\81\8bã\82\89ã\80\81度試してください。',
        'config-sqlite-connection-error' => '$1。
 
»¥ä¸\8bã\81®ã\83\87ã\83¼ã\82¿ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\83¼ã\81¨ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ã\83\81ã\82§ã\83\83ã\82¯ã\81\97、再度試してみてください。',
¸\8bè¨\98ã\81®ã\83\87ã\83¼ã\82¿ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81¨ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8dã\82\92確èª\8dã\81\97ã\81¦ã\81\8bã\82\89、再度試してみてください。',
        'config-sqlite-readonly' => 'ファイル<code>$1</code>は書き込み不能です。',
        'config-sqlite-cant-create-db' => 'データベースファイル<code>$1</code>を作成できませんでした。',
        'config-sqlite-fts3-downgrade' => 'PHPはFTS3のサポート、テーブルのダウングレードが無効です。',
@@ -9633,7 +9796,7 @@ chmod a+w $3</pre>',
        'config-db-web-account-same' => 'インストールのために同じアカウントを使用してください',
        'config-db-web-create' => '既に存在していないのであれば、アカウントを作成してください',
        'config-db-web-no-create-privs' => 'あなたがインストールのために定義したアカウントは、アカウント作成のための特権としては不充分です。
-あなたがここで特定したアカウントはすでに存在していなければなりません。',
+あなたがここで指定したアカウントは既に存在している必要があります。',
        'config-mysql-engine' => 'ストレージエンジン:',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
@@ -9641,16 +9804,16 @@ chmod a+w $3</pre>',
 
 '''MyISAM'''は、利用者が1人の場合、あるいは読み込み専用でインストールする場合に、より処理が早くなるでしょう。
 ただし、MyISAMのデータベースは、InnoDBより高頻度で破損する傾向があります。",
-       'config-mysql-charset' => 'データベースの文字セット:',
+       'config-mysql-charset' => 'データベースの文字セット',
        'config-mysql-binary' => 'バイナリ',
        'config-mysql-utf8' => 'UTF-8',
-       'config-mysql-charset-help' => "'''バイナリー式'''では、MediaWikiは、UTF-8テキストを、データベースのバイナリーフィールドに格納します。
-これは、MySQLのUTF-8形式より効率的で、ユニコード文字の全範囲を利用することが出来るようになります。
+       'config-mysql-charset-help' => "'''バイナリー式'''では、MediaWikiは、UTF-8テキストを、データベースのバイナリーフィールドに格納します。
+これは、MySQLのUTF-8形式より効率的で、Unicode文字の全範囲を利用できるようになります。
 
-'''UTF-8å½¢å¼\8f'''ã\81§ã\81¯ã\80\81MySQLã\81¯ã\80\81ã\81ªã\82\93ã\81®æ\96\87å­\97é\9b\86å\90\88ã\81\8cã\83\87ã\83¼ã\82¿ã\81®ã\81ªã\81\8bã\81«å\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bã\81\8bã\82\92ç\9f¥ã\82\8a、それに対して適切な提示と変換をするでしょうが、
+'''UTF-8å½¢å¼\8f'''ã\81§ã\81¯ã\80\81MySQLã\81¯ã\80\81ã\83\87ã\83¼ã\82¿å\86\85ã\81§ã\81©ã\81®æ\96\87å­\97é\9b\86å\90\88ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bã\81\8bã\82\92ç\9f¥ã\81£ã\81¦ã\81\84ã\81¦、それに対して適切な提示と変換をするでしょうが、
 [//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できるようにはなりません。",
        'config-site-name' => 'ウィキの名前:',
-       'config-site-name-help' => 'ã\81\93ã\81®äº\8b象ã\81¯ã\83\96ã\83©ã\82¦ã\82¶ã\81®ã\82¿ã\82¤ã\83\88ã\83«ã\83\90ã\83¼ã\81¨ä»\96ã\81®æ§\98ã\80\85ã\81ªå ´æ\89\80ã\81«ã\81\8aã\81\84ã\81¦å\87ºç\8f¾ã\81\99る。',
+       'config-site-name-help' => 'ã\81\93ã\81®äº\8b象ã\81¯ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81®ã\82¿ã\82¤ã\83\88ã\83«ã\83\90ã\83¼ã\81¨ä»\96ã\81®ã\81\95ã\81¾ã\81\96ã\81¾ã\81ªå ´æ\89\80ã\81«ç\8f¾ã\82\8cる。',
        'config-site-name-blank' => 'サイト名を入力してください。',
        'config-project-namespace' => 'プロジェクト名前空間:',
        'config-ns-generic' => 'プロジェクト',
@@ -9673,15 +9836,15 @@ chmod a+w $3</pre>',
 別のユーザ名を指定してください。',
        'config-admin-password-blank' => '管理者アカウントのパスワードを入力してください。',
        'config-admin-password-same' => 'ユーザ名と同じパスワードは使えません。',
-       'config-admin-password-mismatch' => '入力されたつのパスワードが一致しません。',
+       'config-admin-password-mismatch' => '入力された2つのパスワードが一致しません。',
        'config-admin-email' => 'メールアドレス:',
-       'config-admin-email-help' => '電子メールアドレスを入力してください。他のユーザーからの電子メールの受け取りと、パスワードのリセット、ウォッチリストに登録したページの更新通知に用いられます。',
+       'config-admin-email-help' => 'メールアドレスを入力してください。他の利用者からのメールの受け取り、パスワードのリセット、ウォッチリストに登録したページの更新通知に使用します。空欄のままにすることもできます。',
        'config-admin-error-user' => '"<nowiki>$1</nowiki>"という名前の管理者を作成する際に内部エラーが発生しました。',
        'config-admin-error-password' => '管理者"<nowiki>$1</nowiki>"のパスワードを設定する際に内部エラーが発生しました: <pre>$2</pre>',
        'config-subscribe' => '[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce リリース告知のメーリングリスト]を購読する。',
        'config-subscribe-help' => 'これは、リリースの告知(重要なセキュリティに関する案内を含む)に使われる、低容量のメーリングリストです。
 このメーリングリストを購読して、新しいバージョンが出た場合にMediaWikiを更新してください。',
-       'config-almost-done' => 'ã\81\93ã\82\8cã\81§ã\81»ã\81¨ã\82\93ã\81©ã\81\8açµ\82ã\81\84ã\81§ã\81\99
+       'config-almost-done' => 'ã\81\93ã\82\8cã\81§ã\81»ã\81¼çµ\82ã\82\8fã\82\8aã\81¾ã\81\97ã\81\9f
 残りの設定を飛ばして、今すぐにウィキをインストールできます。',
        'config-optional-continue' => '私にもっと質問してください。',
        'config-optional-skip' => 'もう飽きてしまったので、とにかくウィキをインストールしてください。',
@@ -9693,20 +9856,22 @@ chmod a+w $3</pre>',
        'config-profile-help' => "ウィキは、たくさんの人が可能な限りそのウィキを編集できるとき、最も優れた働きをします。
 MediaWikiでは、最近の更新を確認し、神経質な、もしくは悪意を持った利用者からの損害を差し戻すことが、簡単にできます。
 
-しかし一方で、MediaWikiは、さらに様々な形態でもの利用も優れていると言われています。また、時には、すべての人にウィキ手法の利点を説得させるのは容易ではないかもしれません。
+しかし一方で、MediaWikiは、さらにさまざまな形態での利用も優れていると言われています。また、時には、すべての人にウィキ手法の利点を説得させるのは容易ではないかもしれません。
 そこで、選択肢があります。
 
-'''{{int:config-profile-wiki}}'''ã\81¯ã\80\81ã\83­ã\82°ã\82¤ã\83³ã\82\92ã\81\9bã\81\9aã\81¨ã\82\82ã\80\81誰ã\81§ã\82\82ç·¨é\9b\86ã\81\8cå\8f¯è\83½ã\81ªものです。
+'''{{int:config-profile-wiki}}'''ã\81¯ã\80\81ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\81ªã\81\8fã\81¦ã\82\82ã\80\81誰ã\81§ã\82\82ç·¨é\9b\86ã\81§ã\81\8dã\82\8bものです。
 '''{{int:config-profile-no-anon}}'''なウィキは、各編集に対してより強い説明責任を付与しますが、気軽な投稿を阻害するかもしれません。
 
-'''{{int:config-profile-fishbowl}}'''ã\81®ã\82¦ã\82£ã\82­ã\81¯ã\80\81æ\89¿èª\8dã\81\95ã\82\8cã\81\9få\88©ç\94¨è\80\85ã\81¯ç·¨é\9b\86ã\81§ã\81\8dã\80\81ä¸\80æ\96¹ã\80\81ä¸\80è\88¬ã\81®äººã\81¯ã\83\9aã\83¼ã\82¸ï¼\88ã\81¨ã\81\9dã\81®å±¥æ­´ï¼\89ã\81®é\96²è¦§ã\81\8cå\8f¯è\83½ã\81§す。
-'''{{int:config-profile-private}}'''ã\81¯ã\80\81æ\89¿èª\8dã\81\95ã\82\8cã\81\9få\88©ç\94¨è\80\85ã\81\8cã\83\9aã\83¼ã\82¸ã\82\92é\96²è¦§å\8f¯è\83½ã\81§ã\80\81ã\81\9dã\81®ã\82°ã\83«ã\83¼ã\83\97ã\81\8cç·¨é\9b\86å\8f¯è\83½ã\81§す。
+'''{{int:config-profile-fishbowl}}'''ã\81®ã\82¦ã\82£ã\82­ã\81¯ã\80\81æ\89¿èª\8dã\81\95ã\82\8cã\81\9få\88©ç\94¨è\80\85ã\81\8cç·¨é\9b\86ã\81§ã\81\8dã\80\81ä¸\80æ\96¹ã\80\81ä¸\80è\88¬ã\81®äººã\81¯ã\83\9aã\83¼ã\82¸ï¼\88ã\81¨ã\81\9dã\81®å±¥æ­´ï¼\89ã\82\92é\96²è¦§ã\81§ã\81\8dã\81¾す。
+'''{{int:config-profile-private}}'''ã\81¯ã\80\81æ\89¿èª\8dã\81\95ã\82\8cã\81\9få\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8cã\83\9aã\83¼ã\82¸ã\82\92é\96²è¦§ã\81§ã\81\8dã\80\81ã\81\9dã\81®ã\82°ã\83«ã\83¼ã\83\97ã\81\8cç·¨é\9b\86ã\81§ã\81\8dã\81¾す。
 
-より複雑な利用者権限の設定は、インストール後に設定可能です。詳細は[//www.mediawiki.org/wiki/Manual:User_rights 関連するマニュアル]をご覧ください。",
+より複雑な利用者権限の設定は、インストール後に設定できます。詳細は[//www.mediawiki.org/wiki/Manual:User_rights 関連するマニュアル]をご覧ください。",
        'config-license' => '著作権とライセンス:',
        'config-license-none' => 'ライセンスのフッターを付けない',
        'config-license-cc-by-sa' => 'クリエイティブ・コモンズ 表示-継承',
+       'config-license-cc-by' => 'クリエイティブ・コモンズ 表示',
        'config-license-cc-by-nc-sa' => 'クリエイティブ・コモンズ 表示-非営利-継承',
+       'config-license-gfdl' => 'GNUフリー文書利用許諾契約書1.3以降',
        'config-license-pd' => 'パブリック・ドメイン',
        'config-license-cc-choose' => 'その他のクリエイティブ・コモンズ・ライセンスを選択する',
        'config-license-help' => "多くの公開ウィキでは、すべての寄稿物が[http://freedomdefined.org/Definition フリーライセンス]の元に置かれています。
@@ -9715,41 +9880,42 @@ MediaWikiでは、最近の更新を確認し、神経質な、もしくは悪
 
 ウィキペディアにあるテキストをあなたのウィキで利用し、逆にあなたのウィキにあるテキストをウィキペディアに複製することを許可したい場合には、'''クリエイティブ・コモンズ 表示-継承'''を選択するべきです。
 
-GNUフリー文書利用許諾契約書はウィキペディアが採用していた古いライセンスです。
-今も有効なライセンスではありますが、再利用や解釈を難しくする条項が含まれています。",
-       'config-email-settings' => '電子メールの設定',
-       'config-enable-email' => '電子メール送信の有効',
-       'config-enable-email-help' => "もし、電子メールの作動を欲するならば、[http://www.php.net/manual/en/mail.configuration.php PHP's mail settings]のページが正確に設定されている必要がある。
-もし、電子メールに関するいかなる機能を欲しないのであれば、ここで無効にできます。",
-       'config-email-user' => 'ユーザ間同士の電子メールの許可',
-       'config-email-user-help' => '設定において有効になっている場合、全てのユーザがお互いに電子メールのやりとりを行うことを許可する。',
+ウィキペディアは以前、GNUフリー文書利用許諾契約書(GFDL)を使用していました。
+GFDL は有効なライセンスですが、内容を理解するのは困難です。
+また、GFDL の元に置かれているコンテンツの再利用も困難です。",
+       'config-email-settings' => 'メールの設定',
+       'config-enable-email' => 'メール送信を有効にする',
+       'config-enable-email-help' => 'メールを使用したい場合は、[http://www.php.net/manual/en/mail.configuration.php PHP のメール設定]が正しく設定されている必要があります。
+メールの機能を使用しない場合は、ここで無効にすることができます。',
+       'config-email-user' => '利用者間のメールを有効にする',
+       'config-email-user-help' => '設定において有効になっている場合、すべてのユーザがお互いにメールのやりとりを行うことを許可する。',
        'config-email-usertalk' => 'ユーザのトークページにおける通知を有効にする',
        'config-email-usertalk-help' => '設定で有効にしているならば、ユーザのトークページの変更の通知を受けることをユーザに許可する。',
        'config-email-watchlist' => 'ウォッチリストの通知を有効にする',
-       'config-email-watchlist-help' => '設定で有効にしているならば、閲覧されたページに関する通知を受け取ることをユーザに許可する。',
-       'config-email-auth' => '電子メールの認証を有効にする',
-       'config-email-auth-help' => "ã\81\93ã\81®é\81¸æ\8a\9eè\82¢ã\81\8cæ\9c\89å\8a¹å\8c\96ã\81\95ã\82\8cã\82\8bã\81¨ã\80\81å\88©ç\94¨è\80\85ã\81\8cé\9b»å­\90ã\83¡ã\83¼ã\83«ã\81®アドレスを設定あるいは変更したときに送信されるリンクにより、そのアドレスを確認しなければならなくなります。
+       'config-email-watchlist-help' => '利用者が設定で有効にしている場合、閲覧されたページに関する通知を受け取ることを許可する。',
+       'config-email-auth' => 'メールの認証を有効にする',
+       'config-email-auth-help' => "ã\81\93ã\81®é\81¸æ\8a\9eè\82¢ã\82\92æ\9c\89å\8a¹ã\81«ã\81\99ã\82\8bã\81¨ã\80\81å\88©ç\94¨è\80\85ã\81\8cã\83¡ã\83¼ã\83«アドレスを設定あるいは変更したときに送信されるリンクにより、そのアドレスを確認しなければならなくなります。
 認証済みのアドレスだけが、他の利用者からのメールや、変更通知のメールを受け取ることができます。
 公開ウィキでは、メール機能による潜在的な不正利用の防止のため、この選択肢を設定することが'''推奨'''されます。",
-       'config-email-sender' => '電子メールのアドレスを返す:',
-       'config-email-sender-help' => 'é\80\81ä¿¡ã\83¡ã\83¼ã\83«ã\81®è¿\94ä¿¡ã\82¢ã\83\89ã\83¬ã\82¹ã\81¨ã\81\97ã\81¦å\88©用するメールアドレスを入力してください。
-宛先不明の場合、このアドレスにその通知が送信されます。
-多くのメールサーバーでは、少なくともドメイン名の一部が有効であることが必要になっています。',
+       'config-email-sender' => '返信メールアドレス:',
+       'config-email-sender-help' => 'é\80\81ä¿¡ã\83¡ã\83¼ã\83«ã\81§è¿\94ä¿¡å\85\88ã\81¨ã\81\97ã\81¦ä½¿用するメールアドレスを入力してください。
+このアドレスは、宛先不明の場合の通知の宛先になります。
+多くのメールサーバーでは、少なくともドメイン名部分は有効である必要があります。',
        'config-upload-settings' => '画像およびファイルのアップロード',
        'config-upload-enable' => 'ファイルのアップロードを有効にする',
-       'config-upload-help' => 'ファイルのアップロードは潜在的にあなたのサーバにセキュリティ上の危険をさらします。
+       'config-upload-help' => 'ファイルのアップロードは潜在的にあなたのサーバにセキュリティ上の危険をさらします。
 更なる情報のために、マニュアルの[//www.mediawiki.org/wiki/Manual:Security security section] を読むことをすすめます。
 
\83\95ã\82¡ã\82¤ã\83«ã\81®ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\82\92å\8f¯è\83½ã\81«ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­ã\81®ã\83«ã\83¼ã\83\88ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªä¸\8bã\81®<code>images</code>ã\82µã\83\96ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81®ã\83¢ã\83¼ã\83\89ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\99ã\80\82ã\81\9dã\81\86ã\81\99ã\82\8bã\81\93ã\81¨ã\81«ã\82\88ã\82\8aã\80\81ã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\81¯ã\81\9dã\81\93ã\81«æ\9b¸ã\81\8dè¾¼ã\81¿ã\81\8cå\8f¯è\83½になります。
\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81\8dã\82\8bã\82\88ã\81\86ã\81«ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­ã\81®ã\83«ã\83¼ã\83\88ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªä¸\8bã\81®<code>images</code>ã\82µã\83\96ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81®ã\83¢ã\83¼ã\83\89ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\99ã\80\82ã\81\9dã\81\86ã\81\99ã\82\8bã\81\93ã\81¨ã\81§ã\80\81ã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\83¼ã\81¯ã\81\9dã\81\93ã\81«æ\9b¸ã\81\8dè¾¼ã\82\81ã\82\8bã\82\88ã\81\86になります。
 そして、このオプションを有効にしてください。',
        'config-upload-deleted' => '削除されたファイルのためのディレクトリ:',
        'config-upload-deleted-help' => '削除されるファイルを保存するためのディレクトリを選択してください。
 これがウェブからアクセスできないことが理想です。',
        'config-logo' => 'ロゴのURL:',
-       'config-logo-help' => 'MediaWikiã\81®æ\9cªè¨­å®\9aç\8a¶æ\85\8bã\81®ã\82¹ã\82­ã\83³では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
-適切なサイズの画像をアップロードし、そのURLをここに入力してください。
+       'config-logo-help' => 'MediaWikiã\81®æ\97¢å®\9aã\81®å¤\96è£\85では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
\81©å\88\87ã\81ªã\82µã\82¤ã\82ºã\81®ç\94»å\83\8fã\82\92ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\97ã\81¦ã\80\81ã\81\9dã\81®URLã\82\92ã\81\93ã\81\93ã\81«å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82
 
\82\82ã\81\97ã\83­ã\82´ã\81\8cè¦\81ã\82\89ã\81ªã\81\84ã\81ªã\82\89ã\81°、このボックスを空白のままにしてください。',
\83­ã\82´ã\81\8cä¸\8dè¦\81ã\81®å ´å\90\88ã\81¯、このボックスを空白のままにしてください。',
        'config-instantcommons' => 'InstantCommons機能を有効にする',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons]は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトで見つかった画像や音声、その他のメディアをウィキ上で利用することができるようになる機能です。
 これを有効化するには、MediaWikiはインターネットに接続できなければなりません。
@@ -9783,18 +9949,20 @@ GNUフリー文書利用許諾契約書はウィキペディアが採用して
        'config-install-step-failed' => '失敗した',
        'config-install-extensions' => '拡張機能を含む',
        'config-install-database' => 'データベースの構築',
+       'config-install-schema' => 'スキーマの作成',
+       'config-install-pg-schema-not-exist' => 'PostgreSQL スキーマがありません。',
        'config-install-pg-schema-failed' => 'テーブルの作成に失敗した。
 ユーザ"$1"が図式"$2"に書き込みができるようにしてください。',
        'config-install-pg-commit' => '変更を送信',
        'config-install-user' => 'データベースユーザを作成する',
        'config-install-user-grant-failed' => 'ユーザー「$1」に許可を与えることに失敗しました。:$2',
        'config-install-tables' => 'テーブルの作成',
-       'config-install-tables-exist' => "'''è­¦å\91\8a'''ï¼\9aMediaWikiã\83\86ã\83¼ã\83\96ã\83«ã\81\8cã\80\81ã\81\99ã\81§ã\81«å­\98å\9c¨ã\81\97ã\81¦ã\81\84るようです。
+       'config-install-tables-exist' => "'''è­¦å\91\8a'''ï¼\9aMediaWikiã\83\86ã\83¼ã\83\96ã\83«ã\81¯æ\97¢ã\81«å­\98å\9c¨ã\81\99るようです。
 作成を飛ばします。",
        'config-install-tables-failed' => "'''エラー''':テーブルの作成が、次のエラーにより失敗しました:$1",
        'config-install-interwiki' => '既定のウィキ間テーブルを導入しています',
        'config-install-interwiki-list' => 'ファイル<code>interwiki.list</code>を見つけることができませんでした。',
-       'config-install-interwiki-exists' => "'''警告''':ウィキ間テーブルはすでに登録されているようです。
+       'config-install-interwiki-exists' => "'''警告''':ウィキ間テーブルはに登録されているようです。
 既定のテーブルを無視します。",
        'config-install-keys' => '秘密鍵を生成する',
        'config-install-sysop' => '管理者のユーザーアカウントを作成する',
@@ -9806,9 +9974,9 @@ MediaWikiのインストールに成功しました。
 <code>LocalSettings.php</code>ファイルが生成されました。
 すべての設定がそのファイルに含まれています。
 
-それをダウンロードし、ウィキをインストールした基準ディレクトリー(index.phpと同じディレクトリー)に置く必要があります。ダウンロードは自動的に開始しているはずです。
+それをダウンロードし、ウィキをインストールした基準ディレクトリ(index.phpと同じディレクトリ)に設置する必要があります。ダウンロードは自動的に開始しているはずです。
 
\83\80ã\82¦ã\83³ã\83­ã\83¼ã\83\89ã\81\8cé\96\8bå§\8bã\81\97ã\81¦ã\81\84ã\81ªã\81\84å ´å\90\88ã\80\81ã\81¾ã\81\9fã\83\80ã\82¦ã\83³ã\83­ã\83¼ã\83\89ã\82\92ã\82­ã\83£ã\83³ã\82»ã\83«ã\81\97ã\81\9få ´å\90\88ã\81¯ã\80\81以ä¸\8bのリンクからダウンロードを再開することができます:
\83\80ã\82¦ã\83³ã\83­ã\83¼ã\83\89ã\81\8cé\96\8bå§\8bã\81\97ã\81¦ã\81\84ã\81ªã\81\84å ´å\90\88ã\80\81ã\81¾ã\81\9fã\83\80ã\82¦ã\83³ã\83­ã\83¼ã\83\89ã\82\92ã\82­ã\83£ã\83³ã\82»ã\83«ã\81\97ã\81\9få ´å\90\88ã\81¯ã\80\81ä¸\8bè¨\98のリンクからダウンロードを再開することができます:
 
 $3
 
@@ -9817,7 +9985,7 @@ $3
 それを完了すれば、'''[$2 ウィキに入る]'''ことができます。",
        'config-download-localsettings' => 'LocalSettings.phpをダウンロード',
        'config-help' => 'ヘルプ',
-       'mainpagetext' => "'''MediaWikiが正常にインストールされました。'''",
+       'mainpagetext' => "'''MediaWiki のインストールに成功しました。'''",
        'mainpagedocfooter' => 'ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。
 
 == はじめましょう ==
@@ -9994,33 +10162,60 @@ $messages['kn'] = array(
  * @author 아라
  */
 $messages['ko'] = array(
-       'config-desc' => 'MediaWiki 설치 마법사',
+       'config-desc' => '미디어위키 설치 마법사',
        'config-title' => 'MediaWiki $1 설치',
        'config-information' => '정보',
        'config-localsettings-upgrade' => '<code>LocalSettings.php</code> 파일이 감지되었습니다.
 이 설치를 업그레이드하려면 아래 상자에 <code>$wgUpgradeKey</code>의 값을 입력해주세요.
 LocalSettings.php에 찾으세요.',
-       'config-localsettings-cli-upgrade' => 'LocalSettings.php 파일이 감지되었습니다. 이 설치를 업그레이드하려면 update.php를 대신 실행하세요',
+       'config-localsettings-cli-upgrade' => 'LocalSettings.php 파일이 감지되었습니다.
+이 설치를 업그레이드하려면 update.php를 대신 실행하세요',
        'config-localsettings-key' => '업그레이드 키:',
        'config-localsettings-badkey' => '제공한 키가 잘못되었습니다.',
-       'config-upgrade-key-missing' => 'MediaWiki의 기존 설치가 감지되었습니다.
+       'config-upgrade-key-missing' => '미디어위키의 기존 설치가 감지되었습니다.
 이 설치를 업그레이드하려면 LocalSettings.php의 아래에 다음 줄을 넣으세요:
 
 $1',
+       'config-localsettings-incomplete' => '기존 LocalSettings.php가 완전하지 않은 것 같습니다.
+$1 변수가 설정되어 있지 않습니다.
+이 변수가 설정되도록 LocalSettings.php를 변경하고 "계속"을 클릭하세요.',
+       'config-localsettings-connection-error' => 'LocalSettings.php 또는 AdminSettings.php에 지정한 설정을 사용하여 데이터베이스에 연결할 때 오류가 발생했습니다. 이러한 설정을 수정하고 다시 시도하세요.
+
+$1',
+       'config-session-error' => '세션 시작 오류: $1',
+       'config-session-expired' => '세션 데이터가 만료된 것 같습니다.
+세션은 $1의 작동 시간 동안 구성됩니다.
+php.ini에 있는 <code>session.gc_maxlifetime</code>에서 설정해 이를 증가시킬 수 있습니다.
+설치 과정을 다시 시작합니다.',
+       'config-no-session' => '세션 데이터가 손실되었습니다!
+php.ini를 확인하고 <code>session.save_path</code>가 적절한 디렉토리로 설정되어 있는지 확인하세요.',
+       'config-your-language' => '설치 언어:',
+       'config-your-language-help' => '설치 과정에서 사용할 언어를 선택하세요.',
        'config-wiki-language' => '위키 언어:',
+       'config-wiki-language-help' => '주로 작성될 위키에 대한 언어를 선택하세요.',
        'config-back' => '← 뒤로',
        'config-continue' => '계속 →',
        'config-page-language' => '언어',
+       'config-page-welcome' => '미디어위키에 온 것을 환영합니다!',
        'config-page-dbconnect' => '데이터베이스에 연결',
+       'config-page-upgrade' => '기존 설치 업그레이드',
+       'config-page-dbsettings' => '데이터베이스 설정',
        'config-page-name' => '이름',
+       'config-page-options' => '옵션',
        'config-page-install' => '설치',
        'config-page-complete' => '완료!',
+       'config-page-restart' => '설치 다시 시작',
+       'config-page-readme' => '읽어보기',
+       'config-page-releasenotes' => '배포 노트',
+       'config-page-copying' => '전문',
+       'config-page-upgradedoc' => '업그레이드하기',
+       'config-page-existingwiki' => '기존 위키',
        'config-help-restart' => '당신이 입력한 모든 저장된 데이터를 지우고 설치 과정을 다시 시작하겠습니까?',
        'config-restart' => '예, 다시 시작합니다.',
        'config-welcome' => '=== 사용 환경 검사 ===
 이 환경이 미디어위키 설치에 적합할 지 기본 검사를 실행합니다.
\84¤ì¹\98 ì¤\91 ë\8f\84ì\9b\80ì\9d´ í\95\84ì\9a\94í\95\98ë\8b¤ë©´ ì\9d´ ê²\80ì\82¬ ê²°ê³¼ë¥¼ í\95¨ê»\98 ì \9cê³µí\95´ì£¼ì\85\94야 합니다.',
-       'config-copyright' => "=== ì \80ì\9e\91ê¶\8c ë°\8f ì\82¬용 약관 ===
\84¤ì¹\98 ì¤\91 ë\8f\84ì\9b\80ì\9d´ í\95\84ì\9a\94í\95\98ë\8b¤ë©´ ì\9d´ ê²\80ì\82¬ ê²°ê³¼ë¥¼ í\95¨ê»\98 ì \9cê³µí\95´ì£¼ì\96´야 합니다.',
+       'config-copyright' => "=== ì \80ì\9e\91ê¶\8c ë°\8f ì\9d´용 약관 ===
 
 $1
 
 이 프로그램이 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''.
 자세한 내용은 GNU 일반 공중 사용 허가서를 참고하십시오.
 
-당신은 이 프로그램을 통해 <doclink href=Copying>GNU 일반 공중 사용 허가서 전문</doclink>을 받았습니다; 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [http://www.gnu.org/copyleft/gpl.html 온라인으로 읽어보시기] 바랍니다.",
+당신은 이 프로그램을 통해 <doclink href=Copying>GNU 일반 공중 사용 허가서 전문</doclink>을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [http://www.gnu.org/copyleft/gpl.html 온라인으로 읽어보시기] 바랍니다.",
+       'config-sidebar' => '* [//www.mediawiki.org 미디어위키 홈]
+* [//www.mediawiki.org/wiki/Help:Contents 사용자 가이드]
+* [//www.mediawiki.org/wiki/Manual:Contents 관리자 가이드]
+* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>읽어보기</doclink>
+* <doclink href=ReleaseNotes>배포 노트</doclink>
+* <doclink href=Copying>전문</doclink>
+* <doclink href=UpgradeDoc>업그레이드하기</doclink>',
        'config-env-good' => '환경이 확인되었습니다.
-MediaWiki를 설치할 수 있습니다.',
+미디어위키를 설치할 수 있습니다.',
        'config-env-bad' => '환경이 확인되었습니다.
-MediaWiki를 설치할 수 없습니다.',
+미디어위키를 설치할 수 없습니다.',
        'config-env-php' => 'PHP $1(이)가 설치되었습니다.',
        'config-env-php-toolow' => 'PHP $1(이)가 설치되었습니다.
 하지만 미디어위키는 PHP $2 이상이 필요합니다.',
-       'config-ctype' => "'''심각''': PHP는 [http://www.php.net/manual/en/ctype.installation.php Ctype 확장 기능]에 대해 지원하여 컴파일해야 합니다.",
+       'config-unicode-using-utf8' => '유니코드 정규화에 대해 Brion Vibber의 utf8_normalize.so를 사용합니다.',
+       'config-unicode-using-intl' => '유니코드 정규화에 대해 [http://pecl.php.net/intl intl PECL 확장]을 사용합니다.',
+       'config-unicode-pure-php-warning' => "'''경고''': [http://pecl.php.net/intl intl PECL 확장]은 PHP만으로 구현하는 데에는 느려질 정도로 성능이 떨어지는 유니코드 정규화를 처리할 수 없습니다.
+높은 트래픽의 사이트에서 실행하려면 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 유니코드 정규화]에 대해 약간 참고해야 합니다.",
+       'config-unicode-update-warning' => "'''경고''': 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.
+만약 유니코드를 사용하는 것에 대해 우려가 된다면 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 업그레이드]해야합니다.",
+       'config-no-db' => '적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP에 데이터베이스 드라이버를 설치해야 합니다.
+다음 데이터베이스 유형을 지원합니다 : $1.
+
+호스팅을 공유하고 있다면 적절한 데이터베이스 드라이버를 설치하도록 호스팅 제공 업체에 문의하세요.
+PHP를 직접 컴파일할 경우 데이터베이스 클라이언트를 사용하여 활성화하도록 다시 설정하세요. 예들 들어 <code>./configure --with-mysql</code>을 사용합니다.
+데비안이나 우분트 패키지에서 PHP를 설치했다면 php-mysql 모듈도 설치해야 합니다.',
+       'config-outdated-sqlite' => "'''경고''': SQLite 필요한 최소 $2 버전보다 낮은 $1(이)가 있습니다. SQLite는 사용할 수 없습니다.",
+       'config-no-fts3' => "'''경고''': SQLite는 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일되어, 검색 기능은 백엔드에 사용할 수 없습니다.",
+       'config-register-globals' => "'''경고: PHP의 <code>[http://php.net/register_globals register_globals]</code> 옵션이 활성화되어 있습니다.'''
+'''가능하면 이를 비활성화하십시오.'''
+미디어위키는 작동하지만 서버에 잠재적인 보안 취약점에 노출됩니다.",
+       'config-magic-quotes-runtime' => "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]이 활성합니다!'''
+이 옵션은 데이터를 입력하는 데 예기치 않는 손상이 일어납니다.
+설치할 수 없습니다. 또는 미디어위키가 사용하지 않는 이 옵션을 비활성화하십시오.",
+       'config-magic-quotes-sybase' => "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]이 활성합니다!'''
+이 옵션은 데이터를 입력하는 데 예기치 않는 손상이 일어납니다.
+설치할 수 없습니다. 또는 미디어위키가 사용하지 않는 이 옵션을 비활성화하십시오.",
+       'config-mbstring' => "'''치명: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]이 활성합니다!'''
+이 옵션은 오류가 발생하고 데이터를 입력하는 데 예기치 않는 손상이 일어날 수 있습니다.
+설치할 수 없습니다. 또는 미디어위키가 사용하지 않는 이 옵션을 비활성화하십시오.",
+       'config-ze1' => "'''치명: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]이 활성합니다!'''
+이 옵션은 미디어위키에 끔찍한 버그를 일으킵니다.
+설치할 수 없습니다. 또는 미디어위키가 사용하지 않는 이 옵션을 비활성화하십시오.",
+       'config-safe-mode' => "'''경고:''' [http://www.php.net/features.safe-mode 안전 모드]이 활성합니다!
+이는 특히 파일을 올리거나 <code>math</code>를 지원하는 데 문제가 발생할 수 있습니다.",
+       'config-xml-bad' => 'PHP의 XML 모듈이 없습니다.
+미디어위키는 이 모듈의 기능이 필요하며 이 설정에서는 작동하지 않습니다.
+Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
+       'config-pcre' => 'PCRE 지원 모듈이 없는 것 같습니다.
+미디어위키는 Perl 호환 정규 표현식을 작동시켜야 합니다.',
+       'config-pcre-no-utf8' => "'''치명''': PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.
+미디어위키가 제대로 작동하려면 UTF-8 지원이 필요합니다.",
+       'config-memory-raised' => 'PHP의 <code>memory_limit</code>는 $1이며 $2(으)로 늘리세요.',
+       'config-memory-bad' => "'''경고:''' PHP의 <code>memory_limit</code>는 $1입니다.
+이는 아마도 너무 낮은 것 같습니다.
+설치가 실패할 수 있습니다!",
+       'config-ctype' => "'''치명''': PHP는 [http://www.php.net/manual/en/ctype.installation.php Ctype 확장 기능]에 대해 지원하여 컴파일해야 합니다.",
+       'config-xcache' => '[http://xcache.lighttpd.net/ XCache]가 설치되었습니다',
        'config-apc' => '[http://www.php.net/apc APC]가 설치되었습니다',
+       'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache]가 설치되었습니다',
+       'config-no-cache' => "'''경고:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] 또는 [http://www.iis.net/download/WinCacheForPhp WinCache]를 찾을 수 없습니다.
+개체 캐싱이 활성화되지 않습니다.",
+       'config-mod-security' => "'''경고''': 웹 서버에 [http://modsecurity.org/ mod_security]가 허용되었습니다. 잘못 설정된 경우 미디어위키나 사용자가 임의의 콘텐츠를 게시할 수 있는 다른 소프트웨어에 대한 문제를 일으킬 수 있습니다.
+[http://modsecurity.org/documentation/ mod_security] 문서를 참고하거나 임의의 오류가 발생할 경우 호스트의 지원 요청에 문의하십시오.",
        'config-diff3-bad' => 'GNU diff3를 찾을 수 없습니다.',
        'config-imagemagick' => 'ImageMagick를 찾았습니다: <code>$1</code>.
 올리기를 활성화할 경우 그림 섬네일이 활성화될 것입니다.',
        'config-gd' => '내장된 GD 그래픽 라이브러리를 찾았습니다.
 올리기를 활성화할 경우 그림 섬네일이 활성화될 것입니다.',
-       'config-brokenlibxml' => '시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 MediaWiki나 다른 웹 어플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.
+       'config-no-scaling' => 'GD 라이브러리나 ImageMagick를 찾을 수 없습니다.
+그림 섬네일이 비활성화될 것입니다.',
+       'config-no-uri' => "'''오류:''' 현재 URI를 확인할 수 없습니다.
+설치가 중단되었습니다.",
+       'config-no-cli-uri' => "'''경고''': 기본값을 사용하여 --scriptpath를 지정하지 않았습니다: <code>$1</code>.",
+       'config-using-server' => '"<nowiki>$1</nowiki>"(을)를 서버 이름으로 사용합니다.',
+       'config-using-uri' => '"<nowiki>$1$2</nowiki>"(을)를 서버 URL로 사용합니다.',
+       'config-uploads-not-safe' => "'''경고:''' 올리기에 대한 기본 디렉토리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.
+미디어위키는 보안 위협에 대한 모든 올린 파일을 검사하지만, 이는 올리기를 활성화하기 전에 [//www.mediawiki.org/wiki/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.",
+       'config-no-cli-uploads-check' => "'''경고:''' 올리기에 대한 기본 디렉토리(<code>$1</code>)는 CLI를 설치하는 동안 임의의 스크립트 실행에 대한 취약점에 대해 검사되지 않습니다.",
+       'config-brokenlibxml' => '시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 미디어위키나 다른 웹 어플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.
 PHP 5.2.9 이후와 libxml2 2.7.3 이후로 업그레이드하세요 ([//bugs.php.net/bug.php?id=45996 PHP에 제기한 버그]).
 설치가 중단되었습니다.',
+       'config-using531' => '미디어위키는 <code>__call()</code>을 참고로 매개 변수를 포함하는 버그로 인해 PHP $1(와)과 함께 사용할 수 없습니다.
+문제를 해결하려면 PHP 5.3.2 이상로 업그레이드하거나 PHP 5.3.0으로 다운그레이드를 하세요.
+설치가 중단되었습니다.',
+       'config-suhosin-max-value-length' => 'Suhosin(수호신)이 설치되었고 $1 바이트로 GET 매개 변수 길이를 제한하고 있습니다. 미디어위키의 ResourceLoader 구성 요소는 이 제한을 해결하지만 성능이 저하됩니다. 가능하면 php.ini의 suhosin.get.max_value_length에 1024 이상으로 설정하고 LocalSettings.php의 $wgResourceLoaderMaxQueryLength에 같은 값을 설정해야 합니다.',
        'config-db-type' => '데이터베이스 종류:',
        'config-db-host' => '데이터베이스 호스트:',
        'config-db-host-help' => '데이터베이스 서버가 다른 서버에 있을 경우 여기에 호스트 이름이나 IP 주소를 입력하세요.
@@ -10064,10 +10330,10 @@ PostgreSQL을 사용할 경우 유닉스 소켓을 통해 연결되도록 입력
 이는 공백이 없어야 합니다.
 
 웹 호스팅을 공유해 사용하는 경우 호스팅 제공 업체도 당신에게 제어판을 통해 데이터베이스를 사용하거나 만들 수 있도록 특정 데이터베이스 이름을 제공합니다.',
-       'config-db-name-oracle' => '데이터베이스 스마:',
+       'config-db-name-oracle' => '데이터베이스 스마:',
        'config-db-account-oracle-warn' => '데이터베이스 백엔드로 오라클을 설치하기 위해 지원하는 세 가지 시나리오가 있습니다:
 
\84¤ì¹\98 ê³¼ì \95ì\9d\98 ì\9d¼ë¶\80ë¡\9c ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ê³\84ì \95ì\9d\84 ë§\8cë\93¤ë ¤ë©´ ì\84¤ì¹\98를 ì\9c\84í\95´ ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ê³\84ì \95ì\9c¼ë¡\9c SYSDBA ì\97­í\95 ì\9d\84 ê°\80ì§\84 ê³\84ì \95ì\9d\84 ì \9cê³µí\95\98ê³  ì\9b¹ ì\95¡ì\84¸ì\8a¤ ê³\84ì \95ì\97\90 ë\8c\80í\95´ ì\9b\90í\95\98ë\8a\94 ì\9e\90격 ì¦\9dëª\85ì\9d\84 ì§\80ì \95í\95\98ì\84¸ì\9a\94, ê·¸ë \87ì§\80 ì\95\8aì\9c¼ë©´ ì\88\98ë\8f\99ì\9c¼ë¡\9c ì\9b¹ ì\95¡ì\84¸ì\8a¤ ê³\84ì \95ì\9d\84 ë§\8cë\93¤ ì\88\98 ì\9e\88ì\9c¼ë©° (í\95\84ì\9a\94í\95\9c ê²½ì\9a° ê¶\8cí\95\9c ì\8a¤í\82¤ë§\88 ê°\9c체를 ë§\8cë\93¤ì\96´ì\95¼ í\95©ë\8b\88ë\8b¤) ë\98\90ë\8a\94 ë\8b¤ë¥¸ ê³\84ì \95 ë\91\90 ê°\9c를 ë§\8cë\93¤ê³  ê¶\8cí\95\9cì\9d\84 ê°\80ì§\84 í\95\98ë\82\98ì\9d\98 ì\9b¹ ì\95¡ì\84¸ì\8a¤ë¥¼ 위한 제한된 하나를 제공할 수 있습니다.
\84¤ì¹\98 ê³¼ì \95ì\9d\98 ì\9d¼ë¶\80ë¡\9c ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ê³\84ì \95ì\9d\84 ë§\8cë\93¤ë ¤ë©´ ì\84¤ì¹\98를 ì\9c\84í\95´ ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ê³\84ì \95ì\9c¼ë¡\9c SYSDBA ì\97­í\95 ì\9d\84 ê°\80ì§\84 ê³\84ì \95ì\9d\84 ì \9cê³µí\95\98ê³  ì\9b¹ ì \91ê·¼ ê³\84ì \95ì\97\90 ë\8c\80í\95´ ì\9b\90í\95\98ë\8a\94 ì\9e\90격 ì¦\9dëª\85ì\9d\84 ì§\80ì \95í\95\98ì\84¸ì\9a\94, ê·¸ë \87ì§\80 ì\95\8aì\9c¼ë©´ ì\88\98ë\8f\99ì\9c¼ë¡\9c ì\9b¹ ì \91ê·¼ ê³\84ì \95ì\9d\84 ë§\8cë\93¤ ì\88\98 ì\9e\88ì\9c¼ë©° (í\95\84ì\9a\94í\95\9c ê²½ì\9a° ê¶\8cí\95\9c ì\8a¤í\82¤ë§\88 ê°\9c체를 ë§\8cë\93¤ì\96´ì\95¼ í\95©ë\8b\88ë\8b¤) ë\98\90ë\8a\94 ë\8b¤ë¥¸ ê³\84ì \95 ë\91\90 ê°\9c를 ë§\8cë\93¤ê³  ê¶\8cí\95\9cì\9d\84 ê°\80ì§\84 í\95\98ë\82\98ì\9d\98 ì\9b¹ ì \91ê·¼ì\9d\84 위한 제한된 하나를 제공할 수 있습니다.
 
 필요한 권한을 가진 계정을 만드는 스크립트는 이 설치의 "maintenance/oracle/" 디렉토리에서 찾을 수 있습니다. 제한된 계정을 사용하면 기본 계정으로 모든 관리 기능을 비활성화할 것을 염두해 두십시오.',
        'config-db-install-account' => '설치를 위한 사용자 계정',
@@ -10076,15 +10342,15 @@ PostgreSQL을 사용할 경우 유닉스 소켓을 통해 연결되도록 입력
        'config-db-password-empty' => '새 데이터베이스 사용자의 비밀번호를 입력하세요: $1.
 비밀번호 없이 사용자를 만들 수도 있지만 이는 안전하지 않습니다.',
        'config-db-install-username' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름을 입력하세요.
-이는 MediaWiki 계정의 사용자 이름이 아닌 데이터베이스에 대한 사용자 이름입니다.',
-       'config-db-install-password' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 비밀번호을 입력하세요. 이는 MediaWiki 계정의 비밀번호가 아닌 데이터베이스에 대한 비밀번호입니다.',
+이는 미디어위키 계정의 사용자 이름이 아닌 데이터베이스에 대한 사용자 이름입니다.',
+       'config-db-install-password' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 비밀번호을 입력하세요. 이는 미디어위키 계정의 비밀번호가 아닌 데이터베이스에 대한 비밀번호입니다.',
        'config-db-install-help' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름과 비밀번호를 입력하세요.',
        'config-db-account-lock' => '정상적으로 작동하는 동안 같은 사용자 이름과 비밀번호를 사용함',
        'config-db-wiki-account' => '정상적인 작동을 위한 사용자 계정',
        'config-db-wiki-help' => '정상적인 위키 작업 동안 데이터베이스에 연결하는 데 사용할 사용자 이름과 비밀 번호를 입력하세요.
 계정이 존재하지 않고 설치 계정에 충분한 권한이 있는 경우 이 사용자 계정은 위키를 작동하는 데 필요한 최소 권한으로 만들어집니다.',
        'config-db-prefix' => '데이터베이스 테이블 접두어:',
-       'config-db-prefix-help' => '여러 위키 사이 또는 MediaWiki와 다른 웹 응용 프로그램 사이에서 하나의 데이터베이스를 공유해야 하는 경우, 충돌을 피하기 위해 모든 테이블 이름에 접두어를 추가하도록 선택할 수 있습니다.
+       'config-db-prefix-help' => '여러 위키 사이 또는 미디어위키와 다른 웹 응용 프로그램 사이에서 하나의 데이터베이스를 공유해야 하는 경우, 충돌을 피하기 위해 모든 테이블 이름에 접두어를 추가하도록 선택할 수 있습니다.
 공백을 사용하지 마세요.
 
 이 필드는 일반적으로 비어있습니다.',
@@ -10094,45 +10360,158 @@ PostgreSQL을 사용할 경우 유닉스 소켓을 통해 연결되도록 입력
        'config-charset-mysql4' => 'MySQL 4.0 UTF-8 하위 호환성',
        'config-charset-help' => "'''경고:''' MySQL 4.1에서 '''UTF-8 하위 호환성'''을 사용하고 나서 <code>mysqldump</code>로 데이터베이스에 백업한다면 이는 모든 ASCII가 아닌 문자를 파괴하고 손상한 백업을 되돌릴 수 없습니다!
 
-'''바이너리 모드'''에서는 MediaWiki는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.
+'''바이너리 모드'''에서는 미디어위키는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.
 이는 MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.
 '''UTF-8 모드'''에서는 MySQL은 데이터를 설정하는 어떤 문자열인지를 알 것이며, 표현하고 적절하게 그것을 변환할 수 있지만
-[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 기본 다국어 공간] 상의 문자를 저장하지 못하게 될 수 있습니다.",
+[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 기본 다국어 범위] 상의 문자를 저장하지 못하게 될 수 있습니다.",
+       'config-mysql-old' => 'MySQL $1 이상이 필요하나 $2(이)가 있습니다.',
        'config-db-port' => '데이터베이스 포트:',
-       'config-db-schema' => 'MediaWiki에 대한 스케마:',
-       'config-db-schema-help' => '이 스케마는 보통 괜찮습니다.
-필요로 알고 있을 경우에만 이를 바꿉니다.',
+       'config-db-schema' => '미디어위키에 대한 스키마:',
+       'config-db-schema-help' => '이 스키마는 보통 괜찮습니다.
+필요로 알고 있을 경우에만 이를 바꾸세요.',
+       'config-pg-test-error' => "'''$1''' 데이터베이스에 연결할 수 없습니다: $2",
+       'config-sqlite-dir' => 'SQLite 데이터 디렉토리:',
+       'config-sqlite-dir-help' => 'SQLite는 하나의 파일에 모든 데이터를 저장합니다.
+
+제공하는 디렉토리는 설치하는 동안 웹 서버에 의해 쓸 수 있어야 합니다.
+
+PHP 파일이 있는 곳을 우리가 이를 맡길 수 없는 이유는 웹을 통해 접근할 수 없다는 것입니다.
+
+설치 마법사가 이과 함께 .htaccess 파일을 만들지만 거기서 실패하면 누군가는 원시 데이터베이스에 접근하는 데 실패합니다.
+이는 원시 사용자 데이터(이메일 주소, 암호 해시) 뿐만 아니라 삭제된 개정판과 위키의 다른 제한된 데이터를 포함합니다.
+
+<code>/var/lib/mediawiki/yourwiki</code>와 같이 모두 다른 곳에서 데이터베이스를 넣어보도록 하세요.',
+       'config-oracle-def-ts' => '기본 테이블공간:',
+       'config-oracle-temp-ts' => '임시 테이블공간:',
+       'config-type-oracle' => '오라클',
+       'config-type-ibm_db2' => 'IBM DB2',
+       'config-support-info' => '미디어위키는 다음의 데이터베이스 시스템을 지원합니다:
+
+$1
+
+데이터베이스 시스템이 표시되지 않을 때 아래에 나열된 다음 지원을 활성화하려면 당신은 위의 링크된 지시에 따라 사용해볼 수도 있습니다.',
+       'config-support-mysql' => '* $1은 미디어위키의 기본 대상으로 가장 잘 지원합니다. ([http://www.php.net/manual/en/mysql.installation.php MySQL을 지원하여 PHP를 컴파일하는 방법])',
+       'config-support-postgres' => '* $1은 MySQL의 대안으로 인기있는 오픈 소스 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQL을 지원하여 PHP를 컴파일하는 방법]) 몇가지 사소한 해결하지 못한 버그가 있을 수 있으며, 이를 제작 환경에서 사용하지 않는 것이 좋습니다.',
+       'config-support-sqlite' => '* $1는 매우 잘 지원하는 가벼운 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pdo.installation.php SQLite를 지원하여 PHP를 컴파일하는 방법], PDO 사용)',
+       'config-support-oracle' => '* $1은 상용 엔터프라이스 데이터베이스입니다. ([http://www.php.net/manual/en/oci8.installation.php OCI8을 지원하여 PHP를 컴파일하는 방법])',
+       'config-support-ibm_db2' => '* $1는 상용 엔터프라이즈 데이터베이스입니다.',
        'config-header-mysql' => 'MySQL 설정',
        'config-header-postgres' => 'PostgreSQL 설정',
        'config-header-sqlite' => 'SQLite 설정',
        'config-header-oracle' => '오라클 설정',
        'config-header-ibm_db2' => 'IBM DB2 설정',
+       'config-invalid-db-type' => '잘못된 데이터베이스 종류',
+       'config-missing-db-name' => '"데이터베이스 이름"에 대한 값을 입력해야 합니다',
+       'config-missing-db-host' => '"데이터베이스 호스트"에 대한 값을 입력해야 합니다',
+       'config-missing-db-server-oracle' => '"데이터베이스 TNS"에 대한 값을 입력해야 합니다',
+       'config-invalid-db-server-oracle' => '"$1" 데이터베이스 TNS가 잘못됐습니다.
+ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.',
+       'config-invalid-db-name' => '"$1" 데이터베이스 이름이 잘못되었습니다.
+ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.',
+       'config-invalid-db-prefix' => '"$1" 데이터베이스 접두어가 잘못됐습니다.
+ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.',
        'config-connection-error' => '$1.
 
 호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.',
+       'config-invalid-schema' => '미디어위키 "$1"에 대한 스키마가 잘못됐습니다.
+ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.',
        'config-db-sys-create-oracle' => '설치 마법사는 새 계정을 만들기 위한 SYSDBA 계정만을 지원합니다.',
        'config-db-sys-user-exists-oracle' => '"$1" 사용자 계정이 이미 존재합니다. SYSDBA는 새 계정을 만드는 데에만 사용할 수 있습니다!',
+       'config-postgres-old' => 'PostgreSQL $1 이상이 필요하나 $2(이)가 있습니다.',
+       'config-sqlite-name-help' => '위키를 식별하기 위한 이름을 선택하세요.
+공백이나 하이픈을 사용하지 마십시오.
+이는 SQLite 데이터 파일 이름에 사용됩니다.',
+       'config-sqlite-parent-unwritable-group' => '<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며 <code><nowiki>$2</nowiki></code> 상위 디렉토리에 웹 서버에 의해 쓸 수 없기 때문입니다.
+
+설치 마법사는 웹 서버로 실행중인 사용자를 결정할 수 없습니다.
+계속하려면 이를 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.
+유닉스/리눅스 시스템에서의 수행:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+       'config-sqlite-parent-unwritable-nogroup' => '<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며 <code><nowiki>$2</nowiki></code> 상위 디렉토리에 웹 서버에 의해 쓸 수 없기 때문입니다.
+
+설치 마법사는 웹 서버로 실행중인 사용자를 결정할 수 없습니다.
+계속하려면 이(와 기타!)를 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.
+유닉스/리눅스 시스템에서의 수행:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+       'config-sqlite-mkdir-error' => '"$1" 데이터 디렉토리를 만드는 중 오류났습니다.
+경로를 확인하고 다시 시도하세요.',
+       'config-sqlite-dir-unwritable' => '"$1" 디렉토리에 쓸 수 없습니다.
+웹 서버를 쓸 수 있도록 권한을 바꾸고 다시 시도하세요.',
+       'config-sqlite-connection-error' => '$1.
+
+호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.',
        'config-sqlite-readonly' => '파일 <code>$1</code>은 쓰기가 불가능합니다.',
-       'config-can-upgrade' => "이 데이터베이스에 MediaWiki 테이블이 있습니다.
-MediaWiki $1(으)로 업그레이드하려면 '''계속'''을 클릭하세요.",
-       'config-db-web-account' => '웹 액세스를 위한 데이터베이스 계정',
-       'config-db-web-help' => '위키의 일반적인 작업 중에 데이터베이스 서버에 연결하는 데 사용할 웹 서버에 대한 계정 이름과 비밀번호를 선택합니다.',
-       'config-db-web-account-same' => '설치를 위해 같은 계정을 사용',
-       'config-db-web-create' => '이 계정이 아직 존재하지 않을 경우 계정을 만들기',
+       'config-sqlite-cant-create-db' => '<code>$1</code> 데이터베이스 파일을 만들 수 없습니다.',
+       'config-sqlite-fts3-downgrade' => 'PHP가 FTS3 지원이 없어졌습니다. 테이블을 다운그레이드하세요.',
+       'config-can-upgrade' => "이 데이터베이스에 미디어위키 테이블이 있습니다.
+미디어위키 $1(으)로 업그레이드하려면 '''계속'''을 클릭하세요.",
+       'config-upgrade-done' => "업그레이드가 완료되었습니다.
+
+이제 [$1 위키를 시작]할 수 있습니다.
+
+만약 <code>LocalSettings.php</code> 파일을 다시 만들기를 원하면 아래의 버튼을 클릭하세요.
+이것은 위키에 문제가 있지 않는 한 '''권장하지 않습니다'''.",
+       'config-upgrade-done-no-regenerate' => '업그레이드가 완료되었습니다.
+
+이제 [$1 위키를 시작]할 수 있습니다.',
+       'config-regenerate' => 'LocalSettings.php 다시 만들기 →',
+       'config-show-table-status' => 'SHOW TABLE STATUS 쿼리 실패!',
+       'config-unknown-collation' => "'''경고:''' 데이터베이스가 인식하지 않는 정렬을 사용하고 있습니다.",
+       'config-db-web-account' => '웹 접근을 위한 데이터베이스 계정',
+       'config-db-web-help' => '위키의 일반적인 작업 중에 데이터베이스 서버에 연결하는 데 사용할 웹 서버에 대한 계정 이름과 비밀번호를 선택하세요.',
+       'config-db-web-account-same' => '설치를 위해 같은 계정 사용',
+       'config-db-web-create' => '이 계정이 아직 존재하지 않을 경우 계정 만들기',
        'config-db-web-no-create-privs' => '설치를 위해 지정한 계정은 계정을 만들 수 있는 충분한 권한이 없습니다.
 여기서 지정한 계정은 이미 존재해야 합니다.',
+       'config-mysql-engine' => '스토리지 엔진:',
+       'config-mysql-innodb' => 'InnoDB',
+       'config-mysql-myisam' => 'MyISAM',
+       'config-mysql-myisam-dep' => "'''경고''': 미디어위키와 함께 사용하도록 권장하지 않는 MySQL에 대한 스토리지 엔진으로 MyISAM을 선택하였습니다. 이유는:
+* 이는 테이블이 잠겨있어 동시성을 거의 지원하지 않습니다
+* 이는 다른 엔진보다 손상이 더 자주 발생합니다.
+* 미디어위키 바탕 코드가 항상 정상적으로 MyISAM을 처리하지 않습니다.
+
+MySQL 설치가 InnoDB를 지원한다면 그 선택 대신에 InnoDB를 선택할 것을 매우 권장합니다.
+MySQL 설치가 InnoDB를 지원하지 않는다면 아마도 업그레이드를 해야 할 수도 있습니다.",
+       'config-mysql-engine-help' => "'''InnoDB'''는 동시적인 지원에 좋기 때문에 거의 항상 최고의 옵션입니다.
+
+'''MyISAM'''은 단일 사용자 또는 읽기 전용 설치에 빠를 수 있습니다.
+MyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실될 수 있습니다.",
+       'config-mysql-charset' => '데이터베이스 문자 집합:',
+       'config-mysql-binary' => '바이너리',
        'config-mysql-utf8' => 'UTF-8',
-       'config-ibm_db2-low-db-pagesize' => "당신의 DB2 데이터베이스가 부족한 페이지 크기가 기본 테이블 공간에 있습니다. 페이지 크기는 '''32K''' 이상이어야 합니다.",
-       'config-site-name' => '위키의 이름:',
-       'config-site-name-help' => '이것이 브라우저 제목 표시줄과 다른 여러 곳에 나타날 것입니다.',
+       'config-mysql-charset-help' => "'''바이너리 모드'''에서는 미디어위키는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.
+이는 MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.
+'''UTF-8 모드'''에서는 MySQL은 데이터를 설정하는 어떤 문자열인지를 알 것이며, 표현하고 적절하게 그것을 변환할 수 있지만
+[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 기본 다국어 범위] 상의 문자를 저장하지 못하게 될 수 있습니다.",
+       'config-ibm_db2-low-db-pagesize' => "당신의 DB2 데이터베이스에 부족한 페이지 크기가 기본 테이블 공간에 있습니다. 페이지 크기는 '''32K''' 이상이어야 합니다.",
+       'config-site-name' => '위키 이름:',
+       'config-site-name-help' => '이는 브라우저 제목 표시줄과 다른 여러 곳에 나타날 것입니다.',
        'config-site-name-blank' => '사이트 이름을 입력하세요.',
        'config-project-namespace' => '프로젝트 이름공간:',
        'config-ns-generic' => '프로젝트',
+       'config-ns-site-name' => '위키 이름과 같은 이름: $1',
+       'config-ns-other' => '기타 (지정)',
+       'config-ns-other-default' => '내위키',
+       'config-project-namespace-help' => '위키백과의 예를 따라서, 많은 위키는 "프로젝트 이름공간"에 그들의 콘텐츠 페이지에서 그들의 정책 페이지는 별도로 보관합니다.
+이 이름공간에 있는 모든 페이지의 제목은 여기서 지정할 수 있는 특정 접두어로 시작합니다.
+보통 이 접두어는 위키의 이름에서 파생되지만, 이는 "#" 또는 ":"와 같은 특수 문자를 포함할 수 없습니다.',
+       'config-ns-invalid' => '특정 "<nowiki>$1</nowiki>" 이름공간이 잘못되었습니다.
+다른 프로젝트 이름공간을 지정하세요.',
+       'config-ns-conflict' => '특정 "<nowiki>$1</nowiki>" 이름공간이 기본 미디어위키 이름공간과 충돌합니다.
+다른 프로젝트 이름공간을 지정하세요.',
        'config-admin-box' => '관리자 계정',
        'config-admin-name' => '사용자 이름:',
        'config-admin-password' => '비밀번호:',
        'config-admin-password-confirm' => '비밀번호 확인:',
-       'config-admin-help' => '"í\99\8d길ë\8f\99"ê³¼ ê°\99ì\9d´ ì\97¬ê¸°ì\97\90 ì\9b\90í\95\98ë\8a\94 ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84ì\9d\84 ì\9e\85ë ¥í\95©ë\8b\88ë\8b¤.
+       'config-admin-help' => '"í\99\8d길ë\8f\99"ê³¼ ê°\99ì\9d´ ì\97¬ê¸°ì\97\90 ì\9b\90í\95\98ë\8a\94 ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84ì\9d\84 ì\9e\85ë ¥í\95\98ì\84¸ì\9a\94.
 이는 위키에 로그인하는 데 사용되는 이름입니다.',
        'config-admin-name-blank' => '관리자의 사용자 이름을 입력하세요.',
        'config-admin-name-invalid' => '특정 "<nowiki>$1</nowiki>" 사용자 이름이 잘못되었습니다.
@@ -10145,85 +10524,161 @@ MediaWiki $1(으)로 업그레이드하려면 '''계속'''을 클릭하세요.",
        'config-admin-error-user' => '"<nowiki>$1</nowiki>" 이름의 관리자를 만드는 중 내부 오류가 발생했습니다.',
        'config-admin-error-password' => '"<nowiki>$1</nowiki>" 관리자의 비밀번호를 설정하는 중 내부 오류가 발생했습니다: <pre>$2</pre>',
        'config-admin-error-bademail' => '이메일 주소를 잘못 입력하였습니다.',
-       'config-almost-done' => '거의 다 됐습니다! 이제 남은 설정을 생략하고 지금 위키를 설치할 수 있습니다.',
+       'config-subscribe' => '[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 배포 발표 메일링 리스트]에 가입합니다.',
+       'config-subscribe-help' => '이는 중요한 보안 알림을 포함한 배포 알림에 대해 사용되는 로우 볼륨 메일링 리스트입니다.
+당신이 이를 구독하고 나서 새 버전이 나올 때 미디어위키 설치를 업데이트해야합니다.',
+       'config-subscribe-noemail' => '이메일 주소를 제공하지 않고 배포 발표 메일링 리스트에 가입하려 합니다.
+메일링 리스트에 가입하고자 할 경우 이메일 주소를 제공하세요.',
+       'config-almost-done' => '거의 다 완료했습니다! 이제 남은 설정을 생략하고 지금 바로 위키를 설치할 수 있습니다.',
+       'config-optional-continue' => '더 많은 질문을 물어보세요.',
        'config-optional-skip' => '지겨워요, 그냥 위키를 설치할래요.',
+       'config-profile' => '사용자 권한 프로필:',
        'config-profile-wiki' => '평범한 위키',
        'config-profile-no-anon' => '계정 생성 필요',
        'config-profile-fishbowl' => '승인된 편집자만 이용 가능',
        'config-profile-private' => '비공개 위키',
+       'config-profile-help' => "위키는 당신이 가능한 한 많은 사람들이 편집하도록 할 때 최고로 적합합니다.
+미디어위키에서는 최근 바뀜을 검토하고, 선하거나 악의적인 사용자에 의해 수행되는 모든 손실을 되돌리는 것이 쉽습니다.
+
+그러나 많은 사람들이 미디어위키가 다양한 역할의 유용하지만, 때로는 그것이 위키 방식의 장점을 모두 설득하기 쉽지 않음을 발견했습니다.
+그래서 선택할 수 있습니다.
+
+'''{{int:config-profile-wiki}}'''는 로그인하지 않고도 누구나 편집할 수 있습니다.
+'''{{int:config-profile-no-anon}}'''는 추가적으로 필요한 책임을 제공하지만, 기존의 기여자를 망칠 수도 있습니다.
+
+'''{{int:config-profile-fishbowl}}''' 같은 경우는 승인된 사용자만 편집할 수 있지만, 대중은 역사를 포함하여 페이지를 볼 수 있습니다. '''{{int:config-profile-private}}'''는 승인된 사용자만 같은 그룹에서 편집할 수 있고 볼 수 있습니다.
+
+더 복잡한 사용자 권한을 설정하여 설치한 후 사용할 수 있도록 하려면 [//www.mediawiki.org/wiki/Manual:User_rights 관련 매뉴얼 항목]을 참고하세요.",
        'config-license' => '저작권 및 라이선스:',
+       'config-license-none' => '라이선스 바닥글 없음',
        'config-license-cc-by-sa' => '크리에이티브 커먼즈 저작자표시-동일조건변경허락',
        'config-license-cc-by' => '크리에이티브 커먼즈 저작자표시',
        'config-license-cc-by-nc-sa' => '크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락',
-       'config-license-cc-0' => '크리에이티브 커먼즈 CC0 (퍼블릭 도메인)',
+       'config-license-cc-0' => '크리에이티브 커먼즈 제로 (퍼블릭 도메인)',
        'config-license-gfdl' => 'GNU 자유 문서 사용 허가서 1.3 이상',
        'config-license-pd' => '퍼블릭 도메인',
        'config-license-cc-choose' => '다른 크리에이티브 커먼즈 라이선스 선택',
+       'config-license-help' => '많은 공개 위키는 모든 기여를 [http://freedomdefined.org/Definition 자유 라이선스] 하에 넣습니다.
+이럴 경우 커뮤니티 소유권의 이해를 할 수 있도록 하고 장기적인 기여를 장려합니다.
+이는 일반적으로 개인 또는 회사 위키에 대해서는 필요하지 않습니다.
+
+위키백과의 텍스트를 사용할 수 있도록 하고 위키백과가 위키에서 복사한 텍스트를 사용할 수 있도록 원한다면 크리에이티브 커먼즈 저작자표시-동일조건변경허락으로 선택해야 합니다.
+
+위키백과는 이전에 GNU 자유 문서 사용 허가서를 사용했습니다.
+GFDL은 유효한 라이선스이지만 이는 이해하기 어렵습니다.
+이는 GFDL 하에 라이선스 내용을 재사용하는 것도 어렵습니다.',
        'config-email-settings' => '이메일 설정',
-       'config-enable-email' => 'ë°\9cì\8b  ì\9d´ë©\94ì\9d¼ í\97\88ì\9a©',
-       'config-enable-email-help' => '이메일을 작동하려면 [http://www.php.net/manual/en/mail.configuration.php PHP의 메일 설정]을 올바르게 구성해야 합니다.
+       'config-enable-email' => 'ë°\9cì\8b  ì\9d´ë©\94ì\9d¼ í\99\9cì\84±í\99\94',
+       'config-enable-email-help' => '이메일을 작동하려면 [http://www.php.net/manual/en/mail.configuration.php PHP의 메일 설정]을 올바르게 설정해야 합니다.
 이메일 기능을 사용하지 않으려면 이를 비활성화할 수 있습니다.',
-       'config-email-user' => 'ì\82¬ì\9a©ì\9e\90ì\99\80 ì\82¬ì\9a©ì\9e\90 ê°\84 ì\9d´ë©\94ì\9d¼ í\97\88ì\9a©',
-       'config-email-user-help' => 'í\99\98ê²½ ì\84¤ì \95ì\97\90ì\84\9c í\99\9cì\84±í\99\94í\95\9c ê²½ì\9a° ëª¨ë\93  ì\82¬ì\9a©ì\9e\90ê°\80 ì\9d´ë©\94ì\9d¼ì\9d\84 ì\84\9cë¡\9c ë³´ë\82´ë\8f\84ë¡\9d í\97\88ì\9a©합니다.',
-       'config-email-usertalk' => 'ì\82¬ì\9a©ì\9e\90 í\86 ë¡  ë¬¸ì\84\9c ì\95\8c림 í\97\88ì\9a©',
-       'config-email-usertalk-help' => 'í\99\98ê²½ ì\84¤ì \95ì\97\90ì\84\9c í\99\9cì\84±í\99\94í\95\9c ê²½ì\9a° ì\82¬ì\9a©ì\9e\90ë\8a\94 ì\82¬ì\9a©ì\9e\90 í\86 ë¡  ë¬¸ì\84\9cì\9d\98 ë³\80ê²½ ì\95\8c림ì\9d\84 ë°\9bë\8f\84ë¡\9d í\97\88ì\9a©합니다.',
-       'config-email-watchlist' => '주ì\8b\9c문ì\84\9c ëª©ë¡\9d ì\95\8c림 í\97\88ì\9a©',
-       'config-email-watchlist-help' => 'í\99\98ê²½ ì\84¤ì \95ì\97\90ì\84\9c í\99\9cì\84±í\99\94í\95\9c ê²½ì\9a° ì\82¬ì\9a©ì\9e\90ê°\80 ì£¼ì\8b\9cí\95\9c ë¬¸ì\84\9cì\97\90 ë\8c\80í\95\9c ì\95\8c림ì\9d\84 ë°\9bë\8f\84ë¡\9d í\97\88ì\9a©합니다.',
-       'config-email-auth' => 'ì\9d´ë©\94ì\9d¼ ì\9d¸ì¦\9d í\97\88ì\9a©',
-       'config-email-auth-help' => "이 설정이 활성화되어 있으면 사용자는 이메일 주소를 설정하거나 변경할 때마다 그들에게 보낸 링크를 사용하여 확인해야 합니다.
+       'config-email-user' => 'ì\82¬ì\9a©ì\9e\90ì\99\80 ì\82¬ì\9a©ì\9e\90 ê°\84 ì\9d´ë©\94ì\9d¼ í\99\9cì\84±í\99\94',
+       'config-email-user-help' => 'í\99\98ê²½ ì\84¤ì \95ì\97\90ì\84\9c í\99\9cì\84±í\99\94í\95\9c ê²½ì\9a° ëª¨ë\93  ì\82¬ì\9a©ì\9e\90ê°\80 ì\9d´ë©\94ì\9d¼ì\9d\84 ì\84\9cë¡\9c ë³´ë\82´ë\8f\84ë¡\9d í\99\9cì\84±í\99\94합니다.',
+       'config-email-usertalk' => 'ì\82¬ì\9a©ì\9e\90 í\86 ë¡  ë¬¸ì\84\9c ì\95\8c림 í\99\9cì\84±í\99\94',
+       'config-email-usertalk-help' => 'í\99\98ê²½ ì\84¤ì \95ì\97\90ì\84\9c í\99\9cì\84±í\99\94í\95\9c ê²½ì\9a° ì\82¬ì\9a©ì\9e\90ë\8a\94 ì\82¬ì\9a©ì\9e\90 í\86 ë¡  ë¬¸ì\84\9cì\9d\98 ë³\80ê²½ ì\95\8c림ì\9d\84 ë°\9bë\8f\84ë¡\9d í\99\9cì\84±í\99\94합니다.',
+       'config-email-watchlist' => '주ì\8b\9c문ì\84\9c ëª©ë¡\9d ì\95\8c림 í\99\9cì\84±í\99\94',
+       'config-email-watchlist-help' => 'í\99\98ê²½ ì\84¤ì \95ì\97\90ì\84\9c í\99\9cì\84±í\99\94í\95\9c ê²½ì\9a° ì\82¬ì\9a©ì\9e\90ê°\80 ì£¼ì\8b\9cí\95\9c ë¬¸ì\84\9cì\97\90 ë\8c\80í\95\9c ì\95\8c림ì\9d\84 ë°\9bë\8f\84ë¡\9d í\99\9cì\84±í\99\94합니다.',
+       'config-email-auth' => 'ì\9d´ë©\94ì\9d¼ ì\9d¸ì¦\9d í\99\9cì\84±í\99\94',
+       'config-email-auth-help' => "이 설정이 활성화되어 있으면 사용자는 이메일 주소를 설정하거나 변경할 때마다 그들에게 보낸 링크를 사용하여 이메일 주소를 확인해야 합니다.
 인증된 이메일 주소만 다른 사용자로부터의 이메일이나 변경 알림 이메일을 받을 수 있습니다.
-이메일 기능의 남용 가능성이 있기 때문에 이 옵션을 설정하는 것은 공 위키에서 '''권장'''합니다.",
+이메일 기능의 남용 가능성이 있기 때문에 이 옵션을 설정하는 것은 공 위키에서 '''권장'''합니다.",
        'config-email-sender' => '반송 이메일 주소',
-       'config-email-sender-help' => 'ë°\9cì\8b í\95\9c ì\9d´ë©\94ì\9d¼ì\97\90 ë\8c\80í\95\9c ë°\98ì\86¡ ì£¼ì\86\8cë¡\9c ì\82¬ì\9a©í\95  ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥í\95©ë\8b\88ë\8b¤.
+       'config-email-sender-help' => 'ë°\9cì\8b í\95\9c ì\9d´ë©\94ì\9d¼ì\97\90 ë\8c\80í\95\9c ë°\98ì\86¡ ì£¼ì\86\8cë¡\9c ì\82¬ì\9a©í\95  ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥í\95\98ì\84¸ì\9a\94.
 이는 반송할 때 보내는 주소입니다.
 대부분의 메일 서버는 적어도 도메인 이름 부분은 유효합니다.',
+       'config-upload-settings' => '그림과 파일 올리기',
+       'config-upload-enable' => '파일 올리기 활성화',
+       'config-upload-help' => '파일 올리기는 서버에 잠재적인 보안 위험에 쉽게 노출될 수 있습니다.
+자세한 내용은 매뉴얼의 [//www.mediawiki.org/wiki/Manual:Security 보안 문단]을 읽어보세요.
+
+파일 올리기를 활성화하려면 미디어위키의 루트 디렉토리에 있는 <code>images</code> 하위 디렉토리에서 웹 서버가 기록할 수 있도록 모드를 변경합니다.
+그 다음 이 옵션을 활성화합니다.',
+       'config-upload-deleted' => '삭제된 파일에 대한 디렉토리:',
+       'config-upload-deleted-help' => '삭제된 파일을 보관할 디렉토리를 선택하세요.
+이상적으로 웹에서 접근할 수 없게 해야 합니다.',
        'config-logo' => '로고 URL:',
        'config-logo-help' => '미디어위키 기본 스킨은 사이드바 메뉴 위에 135×160픽셀의 로고를 포함하고 있습니다.
-적당한 크기로 이미지를 올리고 URL을 여기 적어주세요.
+적당한 크기로 이미지를 올리고 URL을 여기에 입력하세요.
+
+로고 사용을 원하지 않으면 이 상자를 비워 두십시오.',
+       'config-instantcommons' => '인스턴트 공용 활성화',
+       'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons 인스턴트 공용]은 [//commons.wikimedia.org/ 위키미디어 공용] 사이트에서 찾을 수 있는 그림, 소리 및 다른 미디어를 위키에서 사용할 수 있도록 하는 기능입니다.
+이렇게 하려면 미디어위키가 인터넷에 접근해야합니다.
 
-로고 사용을 원치 않으면 이 상자를 비워 두십시오.',
+위키미디어 공용 외에 기타 위키를 설정하는 방법에 대한 지침을 포함한 기능에 대한 자세한 내용은 [//mediawiki.org/wiki/Manual:$wgForeignFileRepos 매뉴얼]을 참고하세요.',
        'config-cc-error' => '크리에이티브 커먼즈 라이선스 선택기에 결과가 없습니다.
 수동으로 라이선스 이름을 입력하세요.',
        'config-cc-again' => '다시 선택...',
        'config-cc-not-chosen' => '원하는 크리에이티브 커먼즈 라이선스를 선택하고 "진행"을 클릭하세요.',
        'config-advanced-settings' => '고급 설정',
        'config-cache-options' => '개체 캐싱을 위한 설정:',
-       'config-cache-help' => '개체 캐싱은 자주 사용하는 데이터를 캐싱하여 MediaWiki의 속도를 개선하는 데 사용합니다.
+       'config-cache-help' => '개체 캐싱은 자주 사용하는 데이터를 캐싱하여 미디어위키의 속도를 개선하는 데 사용합니다.
 큰 사이트의 규모에는 이를 많이 사용하도록 권장하고 있으며, 소규모 사이트들도 물론 이익을 볼 수 있습니다.',
        'config-cache-none' => '캐시하지 않음 (기능적으로는 삭제되지 않지만 큰 위키 사이트에 속도에 영향을 받을 수 있습니다)',
        'config-cache-accel' => 'PHP 개체 캐싱 (APC, XCache 또는 WinCache)',
-       'config-cache-memcached' => 'Memcached 사용 (추가적인 설정 및 구성이 필요합니다)',
+       'config-cache-memcached' => 'Memcached 사용 (추가적인 설치와 설정이 필요합니다)',
+       'config-memcached-servers' => 'Memcached 서버:',
+       'config-memcached-help' => 'Memcached의 사용하기 위한 IP 주소 목록입니다.
+한 줄에 하나씩 사용할 포트를 지정해야 합니다. 예를 들어 :
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+       'config-memcache-needservers' => '캐시 종류로 Memcached를 선택했지만 어떠한 서버도 지정하지 않았습니다.',
+       'config-memcache-badip' => 'Memcached에 대해 잘못된 IP 주소를 입력했습니다: $1.',
+       'config-memcache-noport' => 'Memcached 서버에 사용할 포트를 지정하지 않았습니다: $1.
+포트를 모를 경우 기본값은 11211입니다.',
+       'config-memcache-badport' => 'Memcached 포트 번호는 $1(와)과 $2 사이여야 합니다.',
        'config-extensions' => '확장 기능',
        'config-extensions-help' => '위에 나열된 확장 기능이 <code>./extensions</code>에서 발견되었습니다.
 
 이들은 추가적인 설정이 필요할 수 있습니다만 지금 활성화시킬 수 있습니다.',
-       'config-install-alreadydone' => "'''경고:''' 당신은 이미 MediaWiki를 설치하였고 다시 설치하려고 합니다.
+       'config-install-alreadydone' => "'''경고:''' 당신은 이미 미디어위키를 설치하였고 다시 설치하려고 합니다.
 다음 페이지에서 진행하세요.",
-       'config-install-begin' => '"{{int:config-continue}}"을 누르면 MediaWiki의 설치를 시작합니다.
+       'config-install-begin' => '"{{int:config-continue}}"을 누르면 미디어위키의 설치를 시작합니다.
 그래도 변경하는 것을 원한다면 뒤로를 누릅니다.',
+       'config-install-step-done' => '완료',
+       'config-install-step-failed' => '실패',
        'config-install-extensions' => '확장 기능을 포함하는 중',
-       'config-install-database' => '데이터베이스 설정 중',
-       'config-install-pg-commit' => '커밋 바꾸기',
-       'config-install-pg-plpgsql' => 'PL/pgSQL 언어에 대해 확인 중',
-       'config-install-user' => '데이터베이스 사용자 생성 중',
-       'config-install-tables' => '테이블을 생성하는 중',
+       'config-install-database' => '데이터베이스를 설정하는 중',
+       'config-install-schema' => '스키마를 만드는 중',
+       'config-install-pg-schema-not-exist' => 'PostgreSQL 스키마가 존재하지 않습니다.',
+       'config-install-pg-schema-failed' => '테이블을 만드는 데 실패했습니다.
+"$2" 스키마에 쓸 수 있는 "$1" 사용자가 있는지 확인하세요.',
+       'config-install-pg-commit' => '바뀐 사항을 적용하는 중',
+       'config-install-pg-plpgsql' => 'PL/pgSQL 언어에 대해 확인하는 중',
+       'config-pg-no-plpgsql' => '$1 데이터베이스에 PL/pgSQL 언어를 설치해야 합니다',
+       'config-pg-no-create-privs' => '설치를 위한 지정한 계정에 계정을 만드는 데 충분한 권한이 없습니다,',
+       'config-pg-not-in-role' => '웹 사용자에 대해 지정한 계정이 이미 존재합니다.
+설치에 대한 지정한 사용자는 슈퍼 사용자가 아니고, 그것은 웹 사용자의 역할의 구성원이 아니며, 그래서 웹 사용자가 소유한 개체를 만들 수 없습니다.
+
+현재 미디어위키는 테이블을 웹 사용자가 소유해야 합니다. 다른 웹 계정 이름을 지정하거나 "뒤로"를 클릭하고 적절한 권한의 설치할 사용자를 지정하세요.',
+       'config-install-user' => '데이터베이스 사용자를 만드는 중',
+       'config-install-user-alreadyexists' => '"$1" 사용자가 이미 있음',
+       'config-install-user-create-failed' => '"$1" 사용자 만드는 중 실패: $2',
+       'config-install-user-grant-failed' => '"$1" 사용자에 대한 권한 부여 실패: $2',
+       'config-install-user-missing' => '지정한 "$1" 사용자가 존재하지 않습니다.',
+       'config-install-user-missing-create' => '지정된 "$1" 사용자가 존재하지 않습니다.
+이를 만드는 것을 원하면 아래의 "계정 만들기" 확인 상자를 클릭하세요.',
+       'config-install-tables' => '테이블을 만드는 중',
        'config-install-tables-exist' => "'''경고''': 미디어위키 테이블이 이미 있는 것 같습니다.
 테이블 생성을 생략합니다.",
        'config-install-tables-failed' => "'''오류''': 다음 오류와 함께 테이블 생성에 실패했습니다: $1",
-       'config-install-interwiki' => '기본 ì\9d¸í\84°ì\9c\84í\82¤ í\91\9c를 채우는 중',
-       'config-install-interwiki-list' => '<code>interwiki.list</code> 파일을 읽을 수 없습니다.',
-       'config-install-interwiki-exists' => "'''경고''': ì\9d¸í\84°ì\9c\84í\82¤ í\91\9cê°\80 이미 항목을 갖고 있는 것 같습니다.
+       'config-install-interwiki' => '기본 ì\9d¸í\84°ì\9c\84í\82¤ í\85\8cì\9d´ë¸\94ì\9d\84 채우는 중',
+       'config-install-interwiki-list' => '<code>interwiki.list</code> 파일을 불러올 수 없습니다.',
+       'config-install-interwiki-exists' => "'''경고''': ì\9d¸í\84°ì\9c\84í\82¤ í\85\8cì\9d´ë¸\94ì\9d´ 이미 항목을 갖고 있는 것 같습니다.
 기본 목록으로 넘어갑니다.",
+       'config-install-stats' => '통계를 초기화하는 중',
        'config-install-keys' => '보안 키를 만드는 중',
        'config-insecure-keys' => "'''경고:''' 설치 중에 생성한 {{PLURAL:$2|보안 키}} ($1)를 설치하는 동안 완전히 안전하지 {{PLURAL:$2|않습니다}}. 직접 변경을 고려하세요.",
-       'config-install-mainpage' => '기본 콘텐트로 대문을 만드는 중',
-       'config-install-extension-tables' => '활성화된 확장 기능을 위한 표를 만드는 중',
+       'config-install-sysop' => '관리자 사용자 계정을 만드는 중',
+       'config-install-subscribe-fail' => '미디어위키 발표를 구독할 수 없습니다: $1',
+       'config-install-subscribe-notpossible' => 'cURL이 설치되지 않았고 allow_url_fopen를 사용할 수 없습니다.',
+       'config-install-mainpage' => '기본 콘텐츠로 대문을 만드는 중',
+       'config-install-extension-tables' => '활성화된 확장 기능을 위한 테이블을 만드는 중',
        'config-install-mainpage-failed' => '대문을 삽입할 수 없습니다: $1',
        'config-install-done' => "'''축하합니다!'''
-ì\84±ê³µì \81ì\9c¼ë¡\9c MediaWIki를 ì\84¤ì¹\98í\96\88ì\8aµë\8b\88ë\8b¤.
+미ë\94\94ì\96´ì\9c\84í\82¤ê°\80 ì\84±ê³µì \81ì\9c¼ë¡\9c ì\84¤ì¹\98ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.
 
 설치 마법사가 <code>LocalSettings.php</code> 파일을 만들었습니다.
-이는 모든 구성이 포함되어 있습니다.
+이는 모든 설정이 포함되어 있습니다.
 
 이를 다운로드하여 위키 설치의 거점에 넣어야 합니다 (index.php와 같은 디렉토리). 다운로드가 자동으로 시작됩니다.
 
@@ -10231,12 +10686,12 @@ MediaWiki $1(으)로 업그레이드하려면 '''계속'''을 클릭하세요.",
 
 $3
 
-'''참고''': 지금 이렇게 하지 않으면 이 구성 파일을 다운로드하지 않고 설치를 종료할 경우 만들어진 구성 파일은 나중에 사용할 수 없습니다.
+'''참고''': 지금 이렇게 하지 않으면, 이 설정 파일을 다운로드하지 않고 설치를 종료할 경우 만들어진 설정 파일은 나중에 사용할 수 없습니다.
 
-완료되었으면 '''[$2 당신은 위키에 들어갈 수 있습니다]'''.",
+완료되었으면 '''[$2 위키에 들어갈 수 있습니다]'''.",
        'config-download-localsettings' => 'LocalSettings.php 다운로드',
        'config-help' => '도움말',
-       'config-nofile' => '파일 "$1" 찾을 수 없습니다. 이미 삭제되었나요?',
+       'config-nofile' => '파일 "$1"(을)를 찾을 수 없습니다. 이미 삭제되었나요?',
        'mainpagetext' => "'''미디어위키가 성공적으로 설치되었습니다.'''",
        'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents 이곳]에서 위키 프로그램에 대한 정보를 얻을 수 있습니다.
 
@@ -10361,6 +10816,7 @@ Mer künne met heh dä Daatebangke ömjonn: $1.
 Wann De nit om eijene Rääshner bes, moß De Dinge <i lang="en">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.
 Wann de PHP sellver övversaz häs, donn e Zohjangsprjramm för en Daatebangk enbenge, för e Beishpell met: <code  lang="en">./configure --with-mysql</code> op ene <i lang="en">command shell</i>.
 Wann De PHP uss enem <i lang="en">Debian</i> udder <i lang="en">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang="en">php5-mysql</code> op Dinge Räschner bränge.',
+       'config-outdated-sqlite' => '\'\'\'Opjepaß:\'\'\' <i lang="en">SQLite</i> $1 es enschtaleert. Avver MediaWiki bruch <i lang="en">SQLite</i> $2 udder hühter. <i lang="en">SQLite</i> kann dröm nit enjesaz wääde.',
        'config-no-fts3' => "'''Opjepaß:''' De Projramme vum <i lang=\"en\">SQLite</i> sin der ohne et [//sqlite.org/fts3.html FTS3-Modul] övversaz, dröm wääde de Funxjohne för et Söhke fähle.",
        'config-register-globals' => "'''Opjepaß:''' dem PHP singe Schallder <code lang=\"en\">[http://php.net/register_globals register_globals]</code> es enjeschalldt.
 '''Donn dä ußmaache, wann De kann.'''
@@ -10809,6 +11265,7 @@ Wann domet jet nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op
 Wann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De '''[\$2 en Ding Wiki jonn]'''.",
        'config-download-localsettings' => 'Donn di Dattei <code lang="en">LocalSettings.php</code> eronger laade',
        'config-help' => 'Hölp',
+       'config-nofile' => 'De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?',
        'mainpagetext' => "'''MediaWiki es jetz enstalleet.'''",
        'mainpagedocfooter' => 'Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handboch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde muss.
 
@@ -10823,8 +11280,13 @@ Dat es och all op Änglesch:
  * @author George Animal
  */
 $messages['ku-latn'] = array(
+       'config-information' => 'Agahî',
+       'config-your-language' => 'Zimanê te:',
        'config-page-language' => 'Ziman',
        'config-page-name' => 'Nav',
+       'config-page-options' => 'Vebijêrk',
+       'config-ns-generic' => 'Proje',
+       'config-install-step-done' => 'çêbû',
        'mainpagetext' => "'''MediaWiki serketî hate çêkirin.'''",
        'mainpagedocfooter' => 'Alîkarî ji bo bikaranîn û guherandin yê datayê Wîkî tu di bin [//meta.wikimedia.org/wiki/Help:Contents pirtûka alîkarîyê ji bikarhêneran] da dikarê bibînê.
 
@@ -11049,6 +11511,7 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
        'config-install-mainpage-failed' => "D'Haaptsäit konnt net dragesat ginn: $1",
        'config-download-localsettings' => 'LocalSettings.php eroflueden',
        'config-help' => 'Hëllef',
+       'config-nofile' => 'De Fichier "$1" gouf net fonnt. Gouf e geläscht?',
        'mainpagetext' => "'''MediaWiki gouf installéiert.'''",
        'mainpagedocfooter' => "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir den Interface ze personnaliséieren.
 
@@ -14900,18 +15363,19 @@ Depois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
  * @author Giro720
  * @author Gustavo
  * @author Marcionunes
+ * @author 555
  */
 $messages['pt-br'] = array(
        'config-desc' => 'O instalador do MediaWiki',
-       'config-title' => 'Instalação MediaWiki $1',
+       'config-title' => 'Instalação do MediaWiki $1',
        'config-information' => 'Informações',
-       'config-localsettings-upgrade' => "'''Aviso''': Foi detetada a existência de um arquivo <code>LocalSettings.php</code>.
-É possível atualizar o seu software.
-Mova o <code>LocalSettings.php</code> para um lugar seguro e execute o instalador novamente, por favor.",
-       'config-localsettings-cli-upgrade' => 'Foi detectado um arquivo LocalSettings.php.
-Para atualizar esta instalação, por favor, use: --upgrade=yes.',
+       'config-localsettings-upgrade' => 'Foi detectada a existência do arquivo <code>LocalSettings.php</code>.
+Para atualizar esta instalação, insira no box abaixo o valor de <code>$wgUpgradeKey</code>.
+Essa informação pode ser encontrada no arquivo LocalSettings.php',
+       'config-localsettings-cli-upgrade' => 'Foi detectada a existência do arquivo <code>LocalSettings.php</code>.
+Esta instalação deverá ser atualizada através do <code>update.php</code>',
        'config-localsettings-key' => 'Chave de atualização:',
-       'config-localsettings-badkey' => 'A senha inserida está incorreta.',
+       'config-localsettings-badkey' => 'A chave fornecida está incorreta.',
        'config-upgrade-key-missing' => 'Foi detectada uma instalação existente do MediaWiki.
 Para atualizar esta instalação, por favor, coloque a seguinte linha na parte inferior do seu LocalSettings.php:
 
@@ -15064,6 +15528,12 @@ $messages['ro'] = array(
  * @author Joetaras
  */
 $messages['roa-tara'] = array(
+       'config-db-charset' => "'Nzieme de carattere d'u database",
+       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
+       'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+       'config-charset-mysql4' => 'MySQL 4.0 backwards-compatible UTF-8',
+       'config-install-step-done' => 'fatte',
+       'config-install-step-failed' => 'fallite',
        'config-help' => 'ajute',
        'mainpagetext' => "'''MediaUicchi ha state 'nstallete.'''",
        'mainpagedocfooter' => "Vè vide [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer wiki.
@@ -15627,7 +16097,7 @@ $3
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка уведомлений о выходе новых версий MediaWiki].',
 );
 
-/** Rusyn (Русиньскый)
+/** Rusyn (русиньскый)
  * @author Gazeb
  */
 $messages['rue'] = array(
@@ -15736,8 +16206,58 @@ $messages['shi'] = array(
 
 /** Sinhala (සිංහල)
  * @author Singhalawap
+ * @author පසිඳු කාවින්ද
  */
 $messages['si'] = array(
+       'config-information' => 'තොරතුරු',
+       'config-your-language' => 'ඔබේ භාෂාව:',
+       'config-wiki-language' => 'විකි භාෂාව:',
+       'config-back' => '← ආපසු',
+       'config-continue' => 'ඉදිරියට →',
+       'config-page-language' => 'භාෂාව',
+       'config-page-welcome' => 'මාධ්‍යවිකි වෙත පිළිගනිමු!',
+       'config-page-dbsettings' => 'දත්ත සංචිත සැකසුම්',
+       'config-page-name' => 'නම',
+       'config-page-options' => 'විකල්ප',
+       'config-page-install' => 'ස්ථාපනය',
+       'config-page-complete' => 'සම්පූර්ණයි!',
+       'config-page-readme' => 'මාව කියවන්න',
+       'config-page-releasenotes' => 'නිකුතු සටහන්',
+       'config-page-copying' => 'පිටපත් කරමින්',
+       'config-db-name' => 'දත්ත සංචිතයේ නම:',
+       'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+       'config-db-port' => 'දත්ත සංචිතයේ කවුළුව:',
+       'config-type-ibm_db2' => 'IBM DB2',
+       'config-header-mysql' => 'MySQL සැකසුම්',
+       'config-header-postgres' => 'PostgreSQL සැකසුම්',
+       'config-header-sqlite' => 'SQLite සැකසුම්',
+       'config-header-oracle' => 'ඔරකල් සැකසුම්',
+       'config-header-ibm_db2' => 'IBM DB2 සැකසුම්',
+       'config-mysql-innodb' => 'InnoDB',
+       'config-mysql-myisam' => 'MyISAM',
+       'config-mysql-binary' => 'ද්විමය',
+       'config-mysql-utf8' => 'UTF-8',
+       'config-site-name-blank' => 'අඩවි නාමයක් යොදන්න.',
+       'config-project-namespace' => 'ව්‍යාපෘතියේ නාමඅවකාශය:',
+       'config-ns-generic' => 'ව්‍යාපෘතිය',
+       'config-ns-other' => 'වෙනත් (විශේෂණය කරන්න)',
+       'config-ns-other-default' => 'මගේවිකිය',
+       'config-admin-box' => 'පරිපාලක ගිණුම',
+       'config-admin-name' => 'ඔබේ නම:',
+       'config-admin-password' => 'මුරපදය:',
+       'config-admin-password-confirm' => 'මුරපදය නැවතත්:',
+       'config-admin-email' => 'විද්‍යුත්-තැපැල් ලිපිනය:',
+       'config-profile-wiki' => 'සාම්ප්‍රදායික විකිය',
+       'config-profile-no-anon' => 'ගිණුම් තැනීම අවශ්‍යයි',
+       'config-profile-private' => 'පුද්ගලික විකිය',
+       'config-license-pd' => 'පොදු වසම',
+       'config-email-settings' => 'විද්‍යුත්-තැපැල් සැකසුම්',
+       'config-upload-deleted' => 'මැකූ ගොනු සඳහා නාමාවලිය:',
+       'config-extensions' => 'විස්තීර්ණ',
+       'config-install-step-done' => 'සිදුකලා',
+       'config-install-step-failed' => 'අසාර්ථකයි',
+       'config-install-tables' => 'වගු තනමින්',
+       'config-help' => 'උදව්',
        'mainpagetext' => "'''මීඩියාවිකි සාර්ථක ලෙස ස්ථාපනය කරන ලදි.'''",
        'mainpagedocfooter' => 'විකි මෘදුකාංග භාවිතා කිරීම පිළිබඳ තොරතුරු සඳහා  [//meta.wikimedia.org/wiki/Help:Contents පරිශීලකයන් සඳහා නියමුව] හදාරන්න.
 
@@ -16136,6 +16656,8 @@ MediaWiki kräver PHP $2 eller högre.',
        'config-using-uri' => 'Använder server-URL "<nowiki>$1$2</nowiki>".',
        'config-db-wiki-settings' => 'Identifiera denna wiki',
        'config-db-name' => 'Databasnamn:',
+       'config-db-name-oracle' => 'Databasschema:',
+       'config-db-install-account' => 'Användarkonto för installation',
        'config-db-username' => 'Databas-användarnamn:',
        'config-db-password' => 'Databas-lösenord:',
        'config-db-schema' => 'Schema för MediaWiki',
@@ -16155,6 +16677,8 @@ Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bin
 Kontrollera värden, användarnamnet och lösenordet nedan och försök igen',
        'config-invalid-schema' => '"$1" är ett ogiltigt schema för MediaWiki.
 Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).',
+       'config-db-sys-user-exists-oracle' => 'Användarkontot "$1" finns redan. SYSDBA kan endast användas för att skapa ett nytt konto!',
+       'config-postgres-old' => 'PostgreSQL $1 eller senare krävs, du har $2.',
        'config-upgrade-done' => "Uppgraderingen slutfördes.
 
 Du kan nu [$1 börja använda din wiki].
@@ -16168,6 +16692,27 @@ Du kan nu [$1 börja använda din wiki].',
        'config-site-name' => 'Namnet på wikin:',
        'config-site-name-blank' => 'Ange ett sidnamn.',
        'config-ns-generic' => 'Projekt',
+       'config-admin-name' => 'Ditt namn:',
+       'config-admin-password' => 'Lösenord:',
+       'config-admin-password-confirm' => 'Lösenord igen:',
+       'config-admin-help' => 'Skriv in ditt föredragna användarnamn här, t.ex. "Joe Bloggs".
+Detta är namnet du kommer att använda för att logga in på wikin.',
+       'config-admin-name-blank' => 'Ange ett användarnamn för administratörskontot.',
+       'config-admin-name-invalid' => 'Det angivna användarnamnet "<nowiki>$1</nowiki>" är ogiltigt.
+Ange ett annat användarnamn.',
+       'config-admin-password-blank' => 'Ange ett lösenord för administratörskontot.',
+       'config-admin-email' => 'E-postadress:',
+       'config-admin-error-bademail' => 'Du har angivit en felaktigt e-postadress.',
+       'config-optional-continue' => 'Ställ fler frågor till mig.',
+       'config-profile-private' => 'Privat wiki',
+       'config-license' => 'Upphovsrätt och licens:',
+       'config-license-pd' => 'Allmän egendom',
+       'config-email-settings' => 'E-postinställningar',
+       'config-install-step-done' => 'klar',
+       'config-install-step-failed' => 'misslyckades',
+       'config-insecure-keys' => "'''Varning:''' {{PLURAL:$2|En säkerhetsnyckel|Säkerhetsnycklar}} ($1) som generades under installationen är inte helt {{PLURAL:$2|säker|säkra}} . Överväg att ändra {{PLURAL:$2|den|dem}} manuellt.",
+       'config-download-localsettings' => 'Ladda ned LocalSettings.php',
+       'config-help' => 'hjälp',
        'mainpagetext' => "'''MediaWiki har installerats utan problem.'''",
        'mainpagedocfooter' => 'Information om hur wiki-programvaran används finns i [//meta.wikimedia.org/wiki/Help:Contents användarguiden].
 
@@ -16191,7 +16736,7 @@ $messages['sw'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]',
 );
 
-/** Silesian (Å\9alůnski)
+/** Silesian (Å\9blůnski)
  * @author Djpalar
  */
 $messages['szl'] = array(
@@ -16205,16 +16750,99 @@ $messages['szl'] = array(
 );
 
 /** Tamil (தமிழ்)
+ * @author Karthi.dr
  * @author TRYPPN
+ * @author மதனாஹரன்
  */
 $messages['ta'] = array(
+       'config-title' => 'மீடியாவிக்கி $1 நிறுவுதல்',
        'config-information' => 'தகவல்',
+       'config-localsettings-key' => 'தரமுயர்த்தல் குறியீடு:',
+       'config-localsettings-badkey' => 'நீங்கள் தந்த குறியீடு தவறானது.',
        'config-your-language' => 'தங்களது மொழி:',
+       'config-your-language-help' => 'நிறுவல் செயன்முறையின்போது பயன்படுத்துவதற்கு ஒரு மொழியைத் தெரிவு செய்யவும்.',
+       'config-wiki-language' => 'விக்கி மொழி:',
        'config-back' => '← முந்தைய',
        'config-continue' => 'தொடரவும் →',
        'config-page-language' => 'மொழி',
+       'config-page-welcome' => 'மீடியாவிக்கிக்கு வருக !',
+       'config-page-dbconnect' => 'தரவுத் தளத்துடன் தொடர்பு கொள்ளவும்',
+       'config-page-dbsettings' => 'தரவுத் தள அமைப்புகள்',
        'config-page-name' => 'பெயர்',
        'config-page-options' => 'விருப்பத்தேர்வுகள்',
+       'config-page-install' => 'நிறுவு',
+       'config-page-complete' => 'நிறைவு!',
+       'config-page-restart' => 'நிறுவலை மீண்டும் தொடங்கவும்',
+       'config-page-readme' => 'இதைப் படி',
+       'config-page-releasenotes' => 'வெளியீட்டு குறிப்புகள்',
+       'config-page-copying' => 'நகலெடுக்கப்படுகிறது',
+       'config-page-upgradedoc' => 'தரமுயர்த்தப்படுகிறது',
+       'config-page-existingwiki' => 'இருக்கின்ற விக்கி',
+       'config-restart' => 'ஆம், மறுமுறை துவங்கு',
+       'config-sidebar' => '* [//www.mediawiki.org மீடியாவிக்கி முகப்பு]
+* [//www.mediawiki.org/wiki/Help:Contents பயனரின் கையேடு]
+* [//www.mediawiki.org/wiki/Manual:Contents மேலாளரின் கையேடு]
+* [//www.mediawiki.org/wiki/Manual:FAQ அகேகே]
+----
+* <doclink href=Readme>என்னை வாசிக்கவும்</doclink>
+* <doclink href=ReleaseNotes>வெளியீட்டுக் குறிப்புகள்</doclink>
+* <doclink href=Copying>படியெடுத்தல்</doclink>
+* <doclink href=UpgradeDoc>நிகழ்நிலைப்படுத்தல்</doclink>',
+       'config-db-type' => 'தரவுத்தள வகை:',
+       'config-db-wiki-settings' => 'இந்த விக்கியைக் கண்டுபிடி',
+       'config-db-name' => 'தரவுதளப் பெயர்:',
+       'config-db-install-account' => 'நிறுவலுக்கான பயனர் கணக்கு',
+       'config-db-username' => 'தரவுத்தள பயனர்பெயர்:',
+       'config-db-password' => 'தரவுத்தள கடவுச்சொல்:',
+       'config-db-prefix' => 'தரவுத் தள வரிசைப் பட்டியல் முன்னொட்டு:',
+       'config-db-charset' => 'தரவுத் தள வரியுருத் தொகுதி',
+       'config-invalid-db-type' => 'செல்லாத தரவுத்தள வகை',
+       'config-upgrade-done-no-regenerate' => 'தரமுயர்த்தல் முழுமையடைந்தது.
+நீங்கள் தற்போது [$1 உங்கள் விக்கியைப் பயன்படுத்தத் துவங்கலாம்].',
+       'config-db-web-account' => 'வலை அணுகலுக்கான தரவுத் தளக் கணக்கு',
+       'config-mysql-engine' => 'சேமிப்பு இயந்திரம்:',
+       'config-mysql-charset' => 'தரவுத் தள வரியுருத் தொகுதி:',
+       'config-mysql-utf8' => 'UTF-8',
+       'config-site-name' => 'விக்கியின் பெயர்:',
+       'config-site-name-blank' => 'ஒரு தளத்தின் பெயரை உள்ளிடுக.',
+       'config-ns-generic' => 'திட்டம்',
+       'config-ns-other' => 'ஏனையவை (குறிப்பிடவும்)',
+       'config-admin-box' => 'நிருவாகி கணக்கு',
+       'config-admin-name' => 'தங்களது பெயர்:',
+       'config-admin-password' => 'கடவுச்சொல்:',
+       'config-admin-password-confirm' => 'கடவுச்சொல் மறுமுறையும்:',
+       'config-admin-name-blank' => 'நிருவாக அணுக்கம் உள்ள பயனர் பெயரை இடுக.',
+       'config-admin-password-blank' => 'நிருவாகி கணக்குக்கு கடவுச்சொல் ஒன்றை உள்ளிடவும்.',
+       'config-admin-password-same' => 'பயனர் பெயரையே கடவுச்சொல்லாக வைத்துக் கொள்ள முடியாது.',
+       'config-admin-password-mismatch' => 'நீங்கள் பதிந்த கடவுச்சொற்கள் ஒன்றுக்கொன்று பொருந்தவில்லை.',
+       'config-admin-email' => 'மின்னஞ்சல் முகவரி:',
+       'config-admin-error-bademail' => 'நீங்கள் செல்லாத ஒரு மின்னஞ்சல் முகவரியைத் தந்துள்ளீர்கள்.',
+       'config-optional-continue' => 'என்னை இன்னும் அதிகமாக வினவு.',
+       'config-optional-skip' => 'நான் ஏற்கனவே சோர்வடைந்துள்ளேன், விக்கியை மட்டும் உருவாக்கு.',
+       'config-profile' => 'பயனர் உரிமைகள் சுயவிவரம்:',
+       'config-profile-wiki' => 'பாரம்பரிய விக்கி',
+       'config-profile-no-anon' => 'கணக்கு உருவாக்குதல் அவசியம்',
+       'config-profile-private' => 'தனியார் விக்கி',
+       'config-license' => 'பதிப்புரிமை மற்றும் உரிமம்:',
+       'config-license-pd' => 'பொதுக்களம்',
+       'config-email-settings' => 'மின்னஞ்சல் அமைப்புகள்',
+       'config-email-user' => 'பயனர்-பயனர் மின்னஞ்சலைச் செயற்படுத்தவும்',
+       'config-email-usertalk' => 'பயனர் பேச்சுப் பக்க அறிவிப்பைச் செயற்படுத்தவும்',
+       'config-email-watchlist' => 'கவனிப்புப் பட்டியல் அறிவிப்பைச் செயற்படுத்தவும்',
+       'config-upload-settings' => 'படிமம் மற்றும் கோப்பு பதிவேற்றங்கள்',
+       'config-upload-enable' => 'கோப்புப் பதிவேற்றங்களைச் செயற்படுத்தவும்',
+       'config-upload-deleted' => 'அழித்த கோப்புகளுக்கான அடைவு:',
+       'config-logo' => 'அடையாளச் சின்ன உரலி:',
+       'config-extensions' => 'நீட்சிகள்',
+       'config-install-step-done' => 'முடிந்தது',
+       'config-install-step-failed' => 'தோல்வியுற்றது',
+       'config-install-user' => 'தரவுத் தளப் பயனரை உருவாக்குகிறது',
+       'config-install-user-alreadyexists' => 'பயனர் "$1" ஏற்கனவே உள்ளது',
+       'config-install-tables' => 'வரிசைப் பட்டியல்களை உருவாக்குகிறது',
+       'config-install-mainpage' => 'இயல்புநிலை உள்ளடக்கத்துடன் முதற்பக்கத்தை உருவாக்குகிறது',
+       'config-install-extension-tables' => 'செயற்படுத்தப்பட்ட நீட்சிகளுக்கு வரிசைப் பட்டியல்களை உருவாக்குகிறது',
+       'config-download-localsettings' => 'LocalSettings.phpஐத் தரவிறக்கவும்',
+       'config-help' => 'உதவி',
        'mainpagetext' => "'''விக்கி மென்பொருள் வெற்றிகரமாக உள்ளிடப்பட்டது.'''",
        'mainpagedocfooter' => 'விக்கி மென்பொருளைப் பயன்படுத்துவது தொடர்பாக [//meta.wikimedia.org/wiki/Help:Contents பயனர் வழிகாட்டியைப்] பார்க்க.
 
@@ -16610,6 +17238,7 @@ Tiyakin na ang tagagamit na "$1" ay maaaring makasulat sa balangkas na "$2".',
        'config-install-user-alreadyexists' => 'Umiiral na ang tagagamit na "$1"',
        'config-install-user-create-failed' => 'Nabigo ang paglikha ng tagagamit na "$1": $2',
        'config-install-user-grant-failed' => 'Nabigo ang pagbibigay ng pahintulot sa tagagamit na "$1": $2',
+       'config-install-user-missing' => 'Hindi umiiral ang tinukoy na tagagamit na si "$1".',
        'config-install-tables' => 'Nililikha ang mga talahanayan',
        'config-install-tables-exist' => "'''Babala''': Tila umiiral na ang mga talahanayan ng MediaWiki.
 Nilalaktawan ang paglikha.",
@@ -16619,9 +17248,10 @@ Nilalaktawan ang paglikha.",
        'config-install-interwiki-exists' => "'''Babala''': Tila may mga laman na ang talahanayan ng interwiki.
 Nilalaktawan ang likas na nakatakdang talaan.",
        'config-install-stats' => 'Sinisimulan ang estadistika',
-       'config-install-keys' => 'Ginagawa ang lihim na susi',
+       'config-install-keys' => 'Ginagawa ang lihim na mga susi',
        'config-install-sysop' => 'Nililikha ang akawnt ng tagagamit na tagapangasiwa',
-       'config-install-subscribe-fail' => 'Hindi nagawang sumipi mula sa mediawiki-announce',
+       'config-install-subscribe-fail' => 'Hindi nagawang magpasipi mula sa mediawiki-announce: $1',
+       'config-install-subscribe-notpossible' => 'Hindi nakalagak ang cURL at hindi makukuha ang allow_url_fopen',
        'config-install-mainpage' => 'Nililikha ang pangunahing pahina na may likas na nakatakdang nilalaman',
        'config-install-extension-tables' => 'Nililikha ang mga talahanayan para sa pinagaganang mga dugtong',
        'config-install-mainpage-failed' => 'Hindi maisingit ang pangunahing pahina: $1',
@@ -16710,6 +17340,7 @@ $messages['ug-arab'] = array(
 );
 
 /** Ukrainian (українська)
+ * @author AS
  * @author Ahonc
  * @author Alex Khimich
  * @author Diemon.ukr
@@ -16722,6 +17353,13 @@ $messages['uk'] = array(
        'config-localsettings-upgrade' => "'''Увага''': було виявлено файл <code>LocalSettings.php</code>.
 Ваше програмне забезпечення може бути оновлено.
 Будь-ласка, перемістіть файл <code>LocalSettings.php</code> в іншу безпечну директорію, а потім знову запустіть програму установки.",
+       'config-localsettings-cli-upgrade' => 'Виявлено файл LocalSettings.php.
+Щоб оновити наявну установку, запустіть update.php',
+       'config-localsettings-key' => 'Ключ оновлення:',
+       'config-localsettings-badkey' => 'Ви вказали неправильний ключ.',
+       'config-upgrade-key-missing' => 'Виявлено наявну установку MediaWiki.
+Для оновлення цієї установки, будь ласка, вставте такий рядок в кінець вашого LocalSettings.php:
+$1',
        'config-session-error' => 'Помилка початку сесії: $1',
        'config-your-language' => 'Ваша мова:',
        'config-your-language-help' => 'Оберіть мову для використання в процесі установки.',
@@ -16812,12 +17450,36 @@ $messages['uk'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розсилка повідомлень про появу нових версій MediaWiki].',
 );
 
-/** Urdu (اردو) */
+/** Urdu (اردو)
+ * @author පසිඳු කාවින්ද
+ */
 $messages['ur'] = array(
+       'config-information' => 'معلومات',
+       'config-profile-fishbowl' => 'صرف مجاز ایڈیٹرز',
+       'config-license-pd' => 'پبلک ڈومین',
+       'config-email-settings' => 'ای میل کی ترتیبات',
+       'config-email-user-help' => 'تمام صارفین ای میل بھیجنے کیلئے ایک دوسرے اگر وہ یہ ان کی ترجیحات میں فعال ہے کی اجازت دیتے ہیں.',
+       'config-email-usertalk' => 'صارف بات صفحہ کی اطلاع فعال',
+       'config-email-usertalk-help' => 'اگر وہ یہ ان کی ترجیحات میں فعال ہے صارف بات صفحہ تبدیلی پر اطلاعات حاصل کرنے کے لئے صارفین کی اجازت دیں.',
+       'config-email-watchlist' => 'دیکھنی والی فہرست کی اطلاع فعال',
+       'config-email-auth' => 'فعال ای میل کی تصدیق',
+       'config-email-sender' => 'ای میل ایڈریس پر واپس:',
+       'config-upload-deleted' => 'ڈائرکٹری خارج کردہ فائلوں کے لیے:',
+       'config-advanced-settings' => 'اعلی درجے کی ترتیب',
+       'config-cache-options' => 'اعتراض کیش کے لئے ترتیب دینا:',
+       'config-extensions' => 'ملانے',
+       'config-install-step-done' => 'کیا کیا',
+       'config-install-step-failed' => 'میں ناکام رہے',
+       'config-install-extensions' => 'سمیت ملانے',
+       'config-install-database' => 'ڈیٹا بیس کی ترتیب',
+       'config-install-pg-commit' => 'تبدیلیوں کے ارتکاب',
+       'config-install-keys' => 'خفیہ چابیاں پیدا',
+       'config-install-sysop' => 'منتظم کے صارف کے اکاؤنٹ کی تشکیل',
+       'config-install-mainpage' => 'پہلے سے طے شدہ مواد کے ساتھ سب سے کامیاب کی تشکیل',
        'mainpagetext' => "'''میڈیاوکی کو کامیابی سے چالو کردیا گیا ہے۔.'''",
 );
 
-/** Uzbek (Oʻzbek) */
+/** Uzbek (Oʻzbekcha) */
 $messages['uz'] = array(
        'mainpagetext' => "'''MediaWiki muvaffaqiyatli o'rnatildi.'''",
        'mainpagedocfooter' => "Wiki dasturini ishlatish haqida ma'lumot olish uchun  [//meta.wikimedia.org/wiki/Help:Contents Foydalanuvchi qo'llanmasi] sahifasiga murojaat qiling.
@@ -16858,8 +17520,18 @@ $messages['vep'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce počtnimikirjutez]',
 );
 
-/** Vietnamese (Tiếng Việt) */
+/** Vietnamese (Tiếng Việt)
+ * @author පසිඳු කාවින්ද
+ */
 $messages['vi'] = array(
+       'config-information' => 'Thông tin',
+       'config-page-language' => 'Ngôn ngữ',
+       'config-page-name' => 'Tên',
+       'config-page-options' => 'Tùy chọn',
+       'config-ns-generic' => 'Dự án',
+       'config-admin-password' => 'Mật khẩu:',
+       'config-admin-email' => 'Địa chỉ thư điện tử:',
+       'config-help' => 'Trợ giúp',
        'mainpagetext' => "'''MediaWiki đã được cài đặt thành công.'''",
        'mainpagedocfooter' => 'Xin đọc [//meta.wikimedia.org/wiki/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.
 
@@ -16892,9 +17564,11 @@ $messages['vro'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst].',
 );
 
-/** Walloon (walon) */
+/** Walloon (walon)
+ * @author Srtxg
+ */
 $messages['wa'] = array(
-       'mainpagetext' => "'''Li programe Wiki a stî astalé a l' idêye.'''",
+       'mainpagetext' => "'''Li programe MediaWiki a stî astalé a l' idêye.'''",
 );
 
 /** Waray (Winaray)
@@ -16950,11 +17624,16 @@ $messages['xal'] = array(
 
 /** Yiddish (ייִדיש)
  * @author פוילישער
+ * @author පසිඳු කාවින්ද
  */
 $messages['yi'] = array(
        'config-back' => '→ צוריק',
        'config-page-language' => 'שפראַך',
+       'config-page-name' => 'נאָמען',
+       'config-page-options' => 'ברירות',
        'config-admin-name' => 'אײַער נאָמען:',
+       'config-admin-password' => 'פאַסווארט:',
+       'config-admin-email' => 'בליצפּאָסט אַדרעס:',
        'config-help' => 'הילף',
        'mainpagetext' => "'''מעדיעוויקי אינסטאלירט מיט דערפאלג.'''",
        'mainpagedocfooter' => "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.
@@ -17004,6 +17683,7 @@ $messages['zea'] = array(
 /** Simplified Chinese (‪中文(简体)‬)
  * @author Hydra
  * @author Hzy980512
+ * @author Liangent
  * @author PhiLiP
  * @author Xiaomingyan
  * @author 阿pp
        'mainpagedocfooter' => '请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!
 
 == 入门 ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置设置列表]
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki配置设置列表]
 * [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans MediaWiki常见问题]
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]',
 );
 
 /** Traditional Chinese (‪中文(繁體)‬)
  * @author Hzy980512
+ * @author Liangent
  * @author Mark85296341
  */
 $messages['zh-hant'] = array(
 當本步驟完成後,您可以 '''[$2 進入您的wiki]'''。",
        'config-download-localsettings' => '下載LocalSettings.php',
        'config-help' => '說明',
-       'mainpagetext' => "'''已成功安裝 MediaWiki。'''",
-       'mainpagedocfooter' => '請參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以獲得使用此 wiki 軟體的訊息!
+       'mainpagetext' => "'''已成功安裝MediaWiki。'''",
+       'mainpagedocfooter' => '請參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以獲得使用此wiki軟體的訊息!
 
 == 入門 ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置設定清單]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題解答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件清單]',
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki配置設定清單]
+* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki常見問題解答]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki發佈郵件清單]',
 );
 
 /** Chinese (Hong Kong) (‪中文(香港)‬)
index 12a84a1..ac5dbd7 100644 (file)
@@ -308,7 +308,7 @@ abstract class Installer {
 
        /**
         * UI interface for displaying a short message
-        * The parameters are like parameters to wfMsg().
+        * The parameters are like parameters to wfMessage().
         * The messages will be in wikitext format, which will be converted to an
         * output format such as HTML or text before being sent to the user.
         * @param $msg
@@ -339,7 +339,7 @@ abstract class Installer {
 
                // Load the installer's i18n file.
                $wgExtensionMessagesFiles['MediawikiInstaller'] =
-                       dirname( __FILE__ ) . '/Installer.i18n.php';
+                       __DIR__ . '/Installer.i18n.php';
 
                // Having a user with id = 0 safeguards us from DB access via User::loadOptions().
                $wgUser = User::newFromId( 0 );
@@ -558,7 +558,7 @@ abstract class Installer {
         * write your messages. This appears to work well enough. Basic formatting and
         * external links work just fine.
         *
-        * But in case a translator decides to throw in a #ifexist or internal link or
+        * But in case a translator decides to throw in a "#ifexist" or internal link or
         * whatever, this function is guarded to catch the attempted DB access and to present
         * some fallback text.
         *
@@ -645,7 +645,7 @@ abstract class Installer {
                $allNames = array();
 
                foreach ( self::getDBTypes() as $name ) {
-                       $allNames[] = wfMsg( "config-type-$name" );
+                       $allNames[] = wfMessage( "config-type-$name" )->text();
                }
 
                // cache initially available databases to make sure that everything will be displayed correctly
@@ -788,6 +788,10 @@ abstract class Installer {
 
        /**
         * Environment check for the PCRE module.
+        *
+        * @note If this check were to fail, the parser would
+        *   probably throw an exception before the result
+        *   of this check is shown to the user.
         * @return bool
         */
        protected function envCheckPCRE() {
@@ -797,8 +801,13 @@ abstract class Installer {
                }
                wfSuppressWarnings();
                $regexd = preg_replace( '/[\x{0430}-\x{04FF}]/iu', '', '-АБВГД-' );
+               // Need to check for \p support too, as PCRE can be compiled
+               // with utf8 support, but not unicode property support.
+               // check that \p{Zs} (space separators) matches
+               // U+3000 (Ideographic space)
+               $regexprop = preg_replace( '/\p{Zs}/u', '', "-\xE3\x80\x80-" );
                wfRestoreWarnings();
-               if ( $regexd != '--' ) {
+               if ( $regexd != '--' || $regexprop != '--' ) {
                        $this->showError( 'config-pcre-no-utf8' );
                        return false;
                }
@@ -926,7 +935,7 @@ abstract class Installer {
         */
        protected function envCheckPath() {
                global $IP;
-               $IP = dirname( dirname( dirname( __FILE__ ) ) );
+               $IP = dirname( dirname( __DIR__ ) );
                $this->setVar( 'IP', $IP );
 
                $this->showMessage( 'config-using-uri', $this->getVar( 'wgServer' ), $this->getVar( 'wgScriptPath' ) );
@@ -1585,12 +1594,13 @@ abstract class Installer {
                $status = Status::newGood();
                try {
                        $page = WikiPage::factory( Title::newMainPage() );
-                       $page->doEdit( wfMsgForContent( 'mainpagetext' ) . "\n\n" .
-                                                       wfMsgForContent( 'mainpagedocfooter' ),
-                                                       '',
-                                                       EDIT_NEW,
-                                                       false,
-                                                       User::newFromName( 'MediaWiki default' ) );
+                       $page->doEdit( wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
+                                       wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text(),
+                                       '',
+                                       EDIT_NEW,
+                                       false,
+                                       User::newFromName( 'MediaWiki default' )
+                       );
                } catch (MWException $e) {
                        //using raw, because $wgShowExceptionDetails can not be set yet
                        $status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
index 5230c81..f66f15f 100644 (file)
@@ -89,7 +89,7 @@ class MysqlInstaller extends DatabaseInstaller {
                return
                        $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
                        Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', array(), wfMsg( 'config-db-wiki-settings' ) ) .
+                       Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
                        $this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
                        $this->getTextBox( 'wgDBprefix', 'config-db-prefix', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
                        Html::closeElement( 'fieldset' ) .
@@ -351,7 +351,7 @@ class MysqlInstaller extends DatabaseInstaller {
                $s .= Xml::openElement( 'div', array(
                        'id' => 'dbMyisamWarning'
                ));
-               $s .= $this->parent->getWarningBox( wfMsg( 'config-mysql-myisam-dep' ) );
+               $s .= $this->parent->getWarningBox( wfMessage( 'config-mysql-myisam-dep' )->text() );
                $s .= Xml::closeElement( 'div' );
 
                if( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
index e453b01..d93dba6 100644 (file)
@@ -232,9 +232,7 @@ class MysqlUpdater extends DatabaseUpdater {
                if ( in_array( 'binary', $flags ) ) {
                        $this->output( "...$table table has correct $field encoding.\n" );
                } else {
-                       $this->output( "Fixing $field encoding on $table table... " );
-                       $this->applyPatch( $patchFile );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( $patchFile, false, "Fixing $field encoding on $table table" );
                }
        }
 
@@ -271,12 +269,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( 'Creating interwiki table...' );
-               $this->applyPatch( 'patch-interwiki.sql' );
-               $this->output( "done.\n" );
-               $this->output( 'Adding default interwiki definitions...' );
-               $this->applyPatch( "$IP/maintenance/interwiki.sql", true );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-interwiki.sql', false, 'Creating interwiki table' );
+               $this->applyPatch( "$IP/maintenance/interwiki.sql", true, 'Adding default interwiki definitions' );
        }
 
        /**
@@ -292,9 +286,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Updating indexes to 20031107..." );
-               $this->applyPatch( 'patch-indexes.sql', true );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-indexes.sql', true, "Updating indexes to 20031107" );
        }
 
        protected function doOldLinksUpdate() {
@@ -309,10 +301,9 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Fixing ancient broken imagelinks table.\n" );
-               $this->output( "NOTE: you will have to run maintenance/refreshLinks.php after this.\n" );
-               $this->applyPatch( 'patch-fix-il_from.sql' );
-               $this->output( "done.\n" );
+               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." );
+               }
        }
 
        /**
@@ -534,9 +525,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Converting links and brokenlinks tables to pagelinks... " );
-               $this->applyPatch( 'patch-pagelinks.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-pagelinks.sql', false, "Converting links and brokenlinks tables to pagelinks" );
 
                global $wgContLang;
                foreach ( MWNamespace::getCanonicalNamespaces() as $ns => $name ) {
@@ -572,9 +561,7 @@ class MysqlUpdater extends DatabaseUpdater {
                if ( !$duper->clearDupes() ) {
                        $this->output( "WARNING: This next step will probably fail due to unfixed duplicates...\n" );
                }
-               $this->output( "Adding unique index on user_name... " );
-               $this->applyPatch( 'patch-user_nameindex.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-user_nameindex.sql', false, "Adding unique index on user_name" );
        }
 
        protected function doUserGroupsUpdate() {
@@ -587,9 +574,7 @@ class MysqlUpdater extends DatabaseUpdater {
                                $this->db->query( "ALTER TABLE $oldug RENAME TO $newug", __METHOD__ );
                                $this->output( "done.\n" );
 
-                               $this->output( "Re-adding fresh user_groups table... " );
-                               $this->applyPatch( 'patch-user_groups.sql' );
-                               $this->output( "done.\n" );
+                               $this->applyPatch( 'patch-user_groups.sql', false, "Re-adding fresh user_groups table" );
 
                                $this->output( "***\n" );
                                $this->output( "*** WARNING: You will need to manually fix up user permissions in the user_groups\n" );
@@ -601,15 +586,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Adding user_groups table... " );
-               $this->applyPatch( 'patch-user_groups.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-user_groups.sql', false, "Adding user_groups table" );
 
                if ( !$this->db->tableExists( 'user_rights', __METHOD__ ) ) {
                        if ( $this->db->fieldExists( 'user', 'user_rights', __METHOD__ ) ) {
-                               $this->output( "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion..." );
-                               $this->db->applyPatch( 'patch-user_rights.sql' );
-                               $this->output( "done.\n" );
+                               $this->db->applyPatch( 'patch-user_rights.sql', false, "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion" );
                        } else {
                                $this->output( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" );
                                $this->output( "*** You may need to manually configure some sysops by manipulating\n" );
@@ -651,9 +632,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Making wl_notificationtimestamp nullable... " );
-               $this->applyPatch( 'patch-watchlist-null.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-watchlist-null.sql', false, "Making wl_notificationtimestamp nullable" );
        }
 
        /**
@@ -679,8 +658,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Creating templatelinks table...\n" );
-               $this->applyPatch( 'patch-templatelinks.sql' );
+               $this->applyPatch( 'patch-templatelinks.sql', false, "Creating templatelinks table" );
+
                $this->output( "Populating...\n" );
                if ( wfGetLB()->getServerCount() > 1 ) {
                        // Slow, replication-friendly update
@@ -721,8 +700,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        !$this->indexHasField( 'templatelinks', 'tl_namespace', 'tl_from' ) ||
                        !$this->indexHasField( 'imagelinks', 'il_to', 'il_from' ) )
                {
-                       $this->applyPatch( 'patch-backlinkindexes.sql' );
-                       $this->output( "...backlinking indices updated\n" );
+                       $this->applyPatch( 'patch-backlinkindexes.sql', false, "Updating backlinking indices" );
                }
        }
 
@@ -737,9 +715,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Creating page_restrictions table..." );
-               $this->applyPatch( 'patch-page_restrictions.sql' );
-               $this->applyPatch( 'patch-page_restrictions_sortkey.sql' );
+               $this->applyPatch( 'patch-page_restrictions.sql', false, "Creating page_restrictions table (1/2)" );
+               $this->applyPatch( 'patch-page_restrictions_sortkey.sql', false, "Creating page_restrictions table (2/2)" );
                $this->output( "done.\n" );
 
                $this->output( "Migrating old restrictions to new table...\n" );
@@ -749,8 +726,7 @@ class MysqlUpdater extends DatabaseUpdater {
 
        protected function doCategorylinksIndicesUpdate() {
                if ( !$this->indexHasField( 'categorylinks', 'cl_sortkey', 'cl_from' ) ) {
-                       $this->applyPatch( 'patch-categorylinksindex.sql' );
-                       $this->output( "...categorylinks indices updated\n" );
+                       $this->applyPatch( 'patch-categorylinksindex.sql', false, "Updating categorylinks Indices" );
                }
        }
 
@@ -789,18 +765,14 @@ class MysqlUpdater extends DatabaseUpdater {
                } elseif ( $this->db->fieldExists( 'profiling', 'pf_memory', __METHOD__ ) ) {
                        $this->output( "...profiling table has pf_memory field.\n" );
                } else {
-                       $this->output( "Adding pf_memory field to table profiling..." );
-                       $this->applyPatch( 'patch-profiling-memory.sql' );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
                }
        }
 
        protected function doFilearchiveIndicesUpdate() {
                $info = $this->db->indexInfo( 'filearchive', 'fa_user_timestamp', __METHOD__ );
                if ( !$info ) {
-                       $this->output( "Updating filearchive indices..." );
-                       $this->applyPatch( 'patch-filearchive-user-index.sql' );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( 'patch-filearchive-user-index.sql', false, "Updating filearchive indices" );
                }
        }
 
@@ -811,9 +783,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Making pl_namespace, tl_namespace and il_to indices UNIQUE... " );
-               $this->applyPatch( 'patch-pl-tl-il-unique.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
        }
 
        protected function renameEuWikiId() {
@@ -822,9 +792,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Renaming eu_wiki_id -> eu_local_id... " );
-               $this->applyPatch( 'patch-eu_local_id.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-eu_local_id.sql', false, "Renaming eu_wiki_id -> eu_local_id" );
        }
 
        protected function doUpdateMimeMinorField() {
@@ -833,9 +801,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Altering all *_mime_minor fields to 100 bytes in size ... " );
-               $this->applyPatch( 'patch-mime_minor_length.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-mime_minor_length.sql', false, "Altering all *_mime_minor fields to 100 bytes in size" );
        }
 
        protected function doClFieldsUpdate() {
@@ -844,9 +810,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( 'Updating categorylinks (again)...' );
-               $this->applyPatch( 'patch-categorylinks-better-collation2.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-categorylinks-better-collation2.sql', false, 'Updating categorylinks (again)' );
        }
 
        protected function doLangLinksLengthUpdate() {
@@ -855,9 +819,7 @@ class MysqlUpdater extends DatabaseUpdater {
                $row = $this->db->fetchObject( $res );
 
                if ( $row && $row->Type == "varbinary(10)" ) {
-                       $this->output( 'Updating length of ll_lang in langlinks...' );
-                       $this->applyPatch( 'patch-langlinks-ll_lang-20.sql' );
-                       $this->output( "done.\n" );
+                       $this->applyPatch( 'patch-langlinks-ll_lang-20.sql', false, 'Updating length of ll_lang in langlinks' );
                } else {
                        $this->output( "...ll_lang is up-to-date.\n" );
                }
@@ -870,8 +832,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               $this->output( "Making user_last_timestamp nullable... " );
-               $this->applyPatch( 'patch-user-newtalk-timestamp-null.sql' );
-               $this->output( "done.\n" );
+               $this->applyPatch( 'patch-user-newtalk-timestamp-null.sql', false, "Making user_last_timestamp nullable" );
        }
 }
index 863a625..72ec800 100644 (file)
@@ -62,12 +62,12 @@ class OracleInstaller extends DatabaseInstaller {
                return
                        $this->getTextBox( 'wgDBserver', 'config-db-host-oracle', array(), $this->parent->getHelpBox( 'config-db-host-oracle-help' ) ) .
                        Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', array(), wfMsg( 'config-db-wiki-settings' ) ) .
+                       Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
                        $this->getTextBox( 'wgDBprefix', 'config-db-prefix' ) .
                        $this->getTextBox( '_OracleDefTS', 'config-oracle-def-ts' ) .
                        $this->getTextBox( '_OracleTempTS', 'config-oracle-temp-ts', array(), $this->parent->getHelpBox( 'config-db-oracle-help' ) ) .
                        Html::closeElement( 'fieldset' ) .
-                       $this->parent->getWarningBox( wfMsg( 'config-db-account-oracle-warn' ) ).
+                       $this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ).
                        $this->getInstallUserBox().
                        $this->getWebUserBox();
        }
index aa3c334..a741f26 100644 (file)
@@ -55,20 +55,21 @@ class OracleUpdater extends DatabaseUpdater {
 
                        //1.19
                        array( 'addIndex', 'logging',       'i05',      'patch-logging_type_action_index.sql'),
-                       array( 'addTable', 'globaltemplatelinks', 'patch-globaltemplatelinks.sql' ),
-                       array( 'addTable', 'globalnamespaces', 'patch-globalnamespaces.sql' ),
-                       array( 'addTable', 'globalinterwiki', 'patch-globalinterwiki.sql' ),
                        array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1_field.sql' ),
                        array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1_field.sql' ),
                        array( 'doRemoveNotNullEmptyDefaults2' ),
                        array( 'addIndex', 'page', 'i03', 'patch-page_redirect_namespace_len.sql' ),
-                       array( 'modifyField', 'user', 'ug_group', 'patch-ug_group-length-increase.sql' ),
+                       array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase.sql' ),
                        array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-us_chunk_inx_field.sql' ),
                        array( 'addField', 'job', 'job_timestamp', 'patch-job_timestamp_field.sql' ),
                        array( 'addIndex', 'job', 'i02', 'patch-job_timestamp_index.sql' ),
+                       array( 'doPageRestrictionsPKUKFix' ),
+                       array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase.sql' ),
 
                        //1.20
                        array( 'addTable', 'config', 'patch-config.sql' ),
+                       array( 'addIndex', 'ipblocks', 'i05', 'patch-ipblocks_i05_index.sql' ),
+                       array( 'addIndex', 'revision', 'i05', 'patch-revision_i05_index.sql' ),
 
                        // KEEP THIS AT THE BOTTOM!!
                        array( 'doRebuildDuplicateFunction' ),
@@ -82,40 +83,32 @@ class OracleUpdater extends DatabaseUpdater {
         * Oracle inserts NULL, so namespace fields should have a default value
         */
        protected function doNamespaceDefaults() {
-               $this->output( "Altering namespace fields with default value ... " );
                $meta = $this->db->fieldInfo( 'page', 'page_namespace' );
                if ( $meta->defaultValue() != null ) {
-                       $this->output( "defaults seem to present on namespace fields\n" );
                        return;
                }
 
-               $this->applyPatch( 'patch_namespace_defaults.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_namespace_defaults.sql', false, "Altering namespace fields with default value" );
        }
 
        /**
         * Uniform FK names + deferrable state
         */
        protected function doFKRenameDeferr() {
-               $this->output( "Altering foreign keys ... " );
                $meta = $this->db->query( 'SELECT COUNT(*) cnt FROM user_constraints WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\'' );
                $row = $meta->fetchRow();
                if ( $row && $row['cnt'] > 0 ) {
-                       $this->output( "at least one FK is deferrable, considering up to date\n" );
                        return;
                }
 
-               $this->applyPatch( 'patch_fk_rename_deferred.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_fk_rename_deferred.sql', false, "Altering foreign keys ... " );
        }
 
        /**
         * Recreate functions to 17 schema layout
         */
        protected function doFunctions17() {
-               $this->output( "Recreating functions ... " );
-               $this->applyPatch( 'patch_create_17_functions.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_create_17_functions.sql', false, "Recreating functions" );
        }
 
        /**
@@ -123,14 +116,11 @@ class OracleUpdater extends DatabaseUpdater {
         * there are no incremental patches prior to this
         */
        protected function doSchemaUpgrade17() {
-               $this->output( "Updating schema to 17 ... " );
                // check if iwlinks table exists which was added in 1.17
                if ( $this->db->tableExists( 'iwlinks' ) ) {
-                       $this->output( "schema seem to be up to date.\n" );
                        return;
                }
-               $this->applyPatch( 'patch_16_17_schema_changes.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_16_17_schema_changes.sql', false, "Updating schema to 17" );
        }
 
        /**
@@ -159,24 +149,19 @@ class OracleUpdater extends DatabaseUpdater {
         * converted to NULL in Oracle
         */
        protected function doRemoveNotNullEmptyDefaults() {
-               $this->output( "Removing not null empty constraints ... " );
                $meta = $this->db->fieldInfo( 'categorylinks' , 'cl_sortkey_prefix' );
                if ( $meta->isNullable() ) {
-                       $this->output( "constraints seem to be removed\n" );
                        return;
                }
-               $this->applyPatch( 'patch_remove_not_null_empty_defs.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_remove_not_null_empty_defs.sql', false, "Removing not null empty constraints" );
        }
+
        protected function doRemoveNotNullEmptyDefaults2() {
-               $this->output( "Removing not null empty constraints ... " );
                $meta = $this->db->fieldInfo( 'ipblocks' , 'ipb_by_text' );
                if ( $meta->isNullable() ) {
-                       $this->output( "constraints seem to be removed\n" );
                        return;
                }
-               $this->applyPatch( 'patch_remove_not_null_empty_defs2.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_remove_not_null_empty_defs2.sql', false, "Removing not null empty constraints" );
        }
 
        /**
@@ -184,16 +169,29 @@ class OracleUpdater extends DatabaseUpdater {
         * cascading taken in account in the deleting function
         */
        protected function doRecentchangesFK2Cascade() {
-               $this->output( "Altering RECENTCHANGES_FK2 ... " );
-
                $meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \''.strtoupper($this->db->getDBname()).'\' AND constraint_name = \''.$this->db->tablePrefix().'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\'' );
                $row = $meta->fetchRow();
                if ( $row ) {
-                       $this->output( "FK up to date\n" );
                        return;
                }
 
-               $this->applyPatch( 'patch_recentchanges_fk2_cascade.sql', false );
+               $this->applyPatch( 'patch_recentchanges_fk2_cascade.sql', false, "Altering RECENTCHANGES_FK2" );
+       }
+
+       /**
+        * Fixed wrong PK, UK definition
+        */
+       protected function doPageRestrictionsPKUKFix() {
+               $this->output( "Altering PAGE_RESTRICTIONS keys ... " );
+
+               $meta = $this->db->query( 'SELECT column_name FROM all_cons_columns WHERE owner = \''.strtoupper($this->db->getDBname()).'\' AND constraint_name = \'MW_PAGE_RESTRICTIONS_PK\' AND rownum = 1' );
+               $row = $meta->fetchRow();
+               if ( $row['column_name'] == 'PR_ID' ) {
+                       $this->output( "seems to be up to date.\n" );
+                       return;
+               }
+
+               $this->applyPatch( 'patch-page_restrictions_pkuk_fix.sql', false );
                $this->output( "ok\n" );
        }
 
@@ -201,9 +199,7 @@ class OracleUpdater extends DatabaseUpdater {
         * rebuilding of the function that duplicates tables for tests
         */
        protected function doRebuildDuplicateFunction() {
-               $this->output( "Rebuilding duplicate function ... " );
-               $this->applyPatch( 'patch_rebuild_dupfunc.sql', false );
-               $this->output( "ok\n" );
+               $this->applyPatch( 'patch_rebuild_dupfunc.sql', false, "Rebuilding duplicate function" );
        }
 
        /**
index 641f6e3..3ac2b3a 100644 (file)
@@ -60,7 +60,7 @@ class PostgresInstaller extends DatabaseInstaller {
                        $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
                        $this->getTextBox( 'wgDBport', 'config-db-port' ) .
                        Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', array(), wfMsg( 'config-db-wiki-settings' ) ) .
+                       Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
                        $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
                        $this->getTextBox( 'wgDBmwschema', 'config-db-schema', array(), $this->parent->getHelpBox( 'config-db-schema-help' ) ) .
                        Html::closeElement( 'fieldset' ) .
index 43005a8..499a2d6 100644 (file)
@@ -613,11 +613,11 @@ END;
                if ( $this->db->indexExists( $table, $index ) ) {
                        $this->output( "...index '$index' on table '$table' already exists\n" );
                } else {
-                       $this->output( "Creating index '$index' on table '$table'\n" );
                        if ( preg_match( '/^\(/', $type ) ) {
+                               $this->output( "Creating index '$index' on table '$table'\n" );
                                $this->db->query( "CREATE INDEX $index ON $table $type" );
                        } else {
-                               $this->applyPatch( $type, true );
+                               $this->applyPatch( $type, true, "Creating index '$index' on table '$table'" );
                        }
                }
        }
@@ -647,7 +647,6 @@ END;
 
        protected function convertArchive2() {
                if ( $this->db->tableExists( "archive2" ) ) {
-                       $this->output( "Converting 'archive2' back to normal archive table\n" );
                        if ( $this->db->ruleExists( 'archive', 'archive_insert' ) ) {
                                $this->output( "Dropping rule 'archive_insert'\n" );
                                $this->db->query( 'DROP RULE archive_insert ON archive' );
@@ -656,7 +655,7 @@ END;
                                $this->output( "Dropping rule 'archive_delete'\n" );
                                $this->db->query( 'DROP RULE archive_delete ON archive' );
                        }
-                       $this->applyPatch( 'patch-remove-archive2.sql' );
+                       $this->applyPatch( 'patch-remove-archive2.sql', false, "Converting 'archive2' back to normal archive table" );
                } else {
                        $this->output( "...obsolete table 'archive2' does not exist\n" );
                }
@@ -691,14 +690,13 @@ END;
 
        protected function checkPageDeletedTrigger() {
                if ( !$this->db->triggerExists( 'page', 'page_deleted' ) ) {
-                       $this->output( "Adding function and trigger 'page_deleted' to table 'page'\n" );
-                       $this->applyPatch( 'patch-page_deleted.sql' );
+                       $this->applyPatch( 'patch-page_deleted.sql', false, "Adding function and trigger 'page_deleted' to table 'page'" );
                } else {
                        $this->output( "...table 'page' has 'page_deleted' trigger\n" );
                }
        }
 
-       protected function dropIndex( $table, $index ) {
+       protected function dropIndex( $table, $index, $patch = '', $fullpath = false ) {
                if ( $this->db->indexExists( $table, $index ) ) {
                        $this->output( "Dropping obsolete index '$index'\n" );
                        $this->db->query( "DROP INDEX \"". $index ."\"" );
@@ -727,35 +725,30 @@ END;
                if ( $this->fkeyDeltype( 'revision_rev_user_fkey' ) == 'r' ) {
                        $this->output( "...constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" );
                } else {
-                       $this->output( "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT\n" );
-                       $this->applyPatch( 'patch-revision_rev_user_fkey.sql' );
+                       $this->applyPatch( 'patch-revision_rev_user_fkey.sql', false, "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT" );
                }
        }
 
        protected function checkIwlPrefix() {
                if ( $this->db->indexExists( 'iwlinks', 'iwl_prefix' ) ) {
-                       $this->output( "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'...\n" );
-                       $this->applyPatch( 'patch-rename-iwl_prefix.sql' );
+                       $this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'" );
                }
        }
 
        protected function addInterwikiType() {
-               $this->output( "Refreshing add_interwiki()...\n" );
-               $this->applyPatch( 'patch-add_interwiki.sql' );
+               $this->applyPatch( 'patch-add_interwiki.sql', false, "Refreshing add_interwiki()" );
        }
 
        protected function tsearchFixes() {
                # Tweak the page_title tsearch2 trigger to filter out slashes
                # This is create or replace, so harmless to call if not needed
-               $this->output( "Refreshing ts2_page_title()...\n" );
-               $this->applyPatch( 'patch-ts2pagetitle.sql' );
+               $this->applyPatch( 'patch-ts2pagetitle.sql', false, "Refreshing ts2_page_title()" );
 
                # If the server is 8.3 or higher, rewrite the tsearch2 triggers
                # in case they have the old 'default' versions
                # Gather version numbers in case we need them
                if ( $this->db->getServerVersion() >= 8.3 ) {
-                       $this->output( "Rewriting tsearch2 triggers...\n" );
-                       $this->applyPatch( 'patch-tsearch2funcs.sql' );
+                       $this->applyPatch( 'patch-tsearch2funcs.sql', false, "Rewriting tsearch2 triggers" );
                }
        }
 }
index 8146274..9ba9eab 100644 (file)
@@ -101,22 +101,16 @@ class SqliteUpdater extends DatabaseUpdater {
                        $this->output( "...have initial indexes\n" );
                        return;
                }
-               $this->output( "Adding initial indexes..." );
-               $this->applyPatch( 'initial-indexes.sql' );
-               $this->output( "done\n" );
+               $this->applyPatch( 'initial-indexes.sql', false, "Adding initial indexes" );
        }
 
        protected function sqliteSetupSearchindex() {
                $module = DatabaseSqlite::getFulltextSearchModule();
                $fts3tTable = $this->updateRowExists( 'fts3' );
                if ( $fts3tTable &&  !$module ) {
-                       $this->output( '...PHP is missing FTS3 support, downgrading tables...' );
-                       $this->applyPatch( 'searchindex-no-fts.sql' );
-                       $this->output( "done\n" );
+                       $this->applyPatch( 'searchindex-no-fts.sql', false, 'PHP is missing FTS3 support, downgrading tables' );
                } elseif ( !$fts3tTable && $module == 'FTS3' ) {
-                       $this->output( '...adding FTS3 search capabilities...' );
-                       $this->applyPatch( 'searchindex-fts3.sql' );
-                       $this->output( "done\n" );
+                       $this->applyPatch( 'searchindex-fts3.sql', false, "Adding FTS3 search capabilities" );
                } else {
                        $this->output( "...fulltext search table appears to be in order.\n" );
                }
index 4f31195..0d5ea57 100644 (file)
@@ -362,14 +362,14 @@ class WebInstaller extends Installer {
                        $url = $m[1];
                }
                return md5( serialize( array(
-                       'local path' => dirname( dirname( __FILE__ ) ),
+                       'local path' => dirname( __DIR__ ),
                        'url' => $url,
                        'version' => $GLOBALS['wgVersion']
                ) ) );
        }
 
        /**
-        * Show an error message in a box. Parameters are like wfMsg().
+        * Show an error message in a box. Parameters are like wfMessage().
         * @param $msg
         */
        public function showError( $msg /*...*/ ) {
@@ -540,7 +540,7 @@ class WebInstaller extends Installer {
                $s .= $this->getPageListItem( 'Restart', true, $currentPageName );
                $s .= "</ul></div>\n"; // end list pane
                $s .= Html::element( 'h2', array(),
-                               wfMsg( 'config-page-' . strtolower( $currentPageName ) ) );
+                       wfMessage( 'config-page-' . strtolower( $currentPageName ) )->text() );
 
                $this->output->addHTMLNoFlush( $s );
        }
@@ -556,7 +556,7 @@ class WebInstaller extends Installer {
         */
        private function getPageListItem( $pageName, $enabled, $currentPageName ) {
                $s = "<li class=\"config-page-list-item\">";
-               $name = wfMsg( 'config-page-' . strtolower( $pageName ) );
+               $name = wfMessage( 'config-page-' . strtolower( $pageName ) )->text();
 
                if ( $enabled ) {
                        $query = array( 'page' => $pageName );
@@ -609,7 +609,7 @@ class WebInstaller extends Installer {
        /**
         * Get HTML for an error box with an icon.
         *
-        * @param $text String: wikitext, get this with wfMsgNoTrans()
+        * @param $text String: wikitext, get this with wfMessage()->plain()
         *
         * @return string
         */
@@ -620,7 +620,7 @@ class WebInstaller extends Installer {
        /**
         * Get HTML for a warning box with an icon.
         *
-        * @param $text String: wikitext, get this with wfMsgNoTrans()
+        * @param $text String: wikitext, get this with wfMessage()->plain()
         *
         * @return string
         */
@@ -631,7 +631,7 @@ class WebInstaller extends Installer {
        /**
         * Get HTML for an info box with an icon.
         *
-        * @param $text String: wikitext, get this with wfMsgNoTrans()
+        * @param $text String: wikitext, get this with wfMessage()->plain()
         * @param $icon String: icon name, file in skins/common/images
         * @param $class String: additional class name to add to the wrapper div
         *
@@ -640,13 +640,13 @@ class WebInstaller extends Installer {
        public function getInfoBox( $text, $icon = false, $class = false ) {
                $text = $this->parse( $text, true );
                $icon = ( $icon == false ) ? '../skins/common/images/info-32.png' : '../skins/common/images/'.$icon;
-               $alt = wfMsg( 'config-information' );
+               $alt = wfMessage( 'config-information' )->text();
                return Html::infoBox( $text, $icon, $alt, $class, false );
        }
 
        /**
         * Get small text indented help for a preceding form field.
-        * Parameters like wfMsg().
+        * Parameters like wfMessage().
         *
         * @param $msg
         * @return string
@@ -659,14 +659,15 @@ class WebInstaller extends Installer {
                $html = $this->parse( $text, true );
 
                return "<div class=\"mw-help-field-container\">\n" .
-                       "<span class=\"mw-help-field-hint\">" . wfMsgHtml( 'config-help' ) . "</span>\n" .
+                       "<span class=\"mw-help-field-hint\">" . wfMessage( 'config-help' )->escaped() .
+                       "</span>\n" .
                        "<span class=\"mw-help-field-data\">" . $html . "</span>\n" .
                        "</div>\n";
        }
 
        /**
         * Output a help box.
-        * @param $msg String key for wfMsg()
+        * @param $msg String key for wfMessage()
         */
        public function showHelpBox( $msg /*, ... */ ) {
                $args = func_get_args();
@@ -713,7 +714,7 @@ class WebInstaller extends Installer {
                if ( strval( $msg ) == '' ) {
                        $labelText = '&#160;';
                } else {
-                       $labelText = wfMsgHtml( $msg );
+                       $labelText = wfMessage( $msg )->escaped();
                }
 
                $attributes = array( 'class' => 'config-label' );
@@ -893,7 +894,7 @@ class WebInstaller extends Installer {
                if( isset( $params['rawtext'] ) ) {
                        $labelText = $params['rawtext'];
                } else {
-                       $labelText = $this->parse( wfMsg( $params['label'] ) );
+                       $labelText = $this->parse( wfMessage( $params['label'] )->text() );
                }
 
                return
@@ -969,7 +970,7 @@ class WebInstaller extends Installer {
                                Xml::radio( $params['controlName'], $value, $checked, $itemAttribs ) .
                                '&#160;' .
                                Xml::tags( 'label', array( 'for' => $id ), $this->parse(
-                                       wfMsgNoTrans( $params['itemLabelPrefix'] . strtolower( $value ) )
+                                       wfMessage( $params['itemLabelPrefix'] . strtolower( $value ) )->plain()
                                ) ) .
                                "</li>\n";
                }
@@ -1077,7 +1078,7 @@ class WebInstaller extends Installer {
                ) );
                $anchor = Html::rawElement( 'a',
                        array( 'href' => $this->getURL( array( 'localsettings' => 1 ) ) ),
-                       $img . ' ' . wfMsgHtml( 'config-download-localsettings' ) );
+                       $img . ' ' . wfMessage( 'config-download-localsettings' )->escaped() );
                return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
        }
 
index aabc1f3..e440c6b 100644 (file)
@@ -108,7 +108,7 @@ class WebInstallerOutput {
         * @return String
         */
        public function getCSS( $dir ) {
-               $skinDir = dirname( dirname( dirname( __FILE__ ) ) ) . '/skins';
+               $skinDir = dirname( dirname( __DIR__ ) ) . '/skins';
 
                // All these files will be concatenated in sequence and loaded
                // as one file.
@@ -153,7 +153,7 @@ class WebInstallerOutput {
        }
 
        /**
-        * <link> to index.php?css=foobar for the <head>
+        * "<link>" to index.php?css=foobar for the "<head>"
         * @return String
         */
        private function getCssUrl( ) {
@@ -273,7 +273,7 @@ class WebInstallerOutput {
        </div>
        <div class="portal"><div class="body">
 <?php
-       echo $this->parent->parse( wfMsgNoTrans( 'config-sidebar' ), true );
+       echo $this->parent->parse( wfMessage( 'config-sidebar' )->plain(), true );
 ?>
        </div></div>
 </div>
@@ -301,7 +301,7 @@ class WebInstallerOutput {
 
        public function outputTitle() {
                global $wgVersion;
-               echo htmlspecialchars( wfMsg( 'config-title', $wgVersion ) );
+               echo wfMessage( 'config-title', $wgVersion )->escaped();
        }
 
        public function getJQuery() {
index b6e7717..a193afb 100644 (file)
@@ -84,13 +84,13 @@ abstract class WebInstallerPage {
 
                if ( $continue ) {
                        // Fake submit button for enter keypress (bug 26267)
-                       $s .= Xml::submitButton( wfMsg( "config-$continue" ),
+                       $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
                                array( 'name' => "enter-$continue", 'style' =>
                                        'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
                }
 
                if ( $back ) {
-                       $s .= Xml::submitButton( wfMsg( "config-$back" ),
+                       $s .= Xml::submitButton( wfMessage( "config-$back" )->text(),
                                array(
                                        'name' => "submit-$back",
                                        'tabindex' => $this->parent->nextTabIndex()
@@ -98,7 +98,7 @@ abstract class WebInstallerPage {
                }
 
                if ( $continue ) {
-                       $s .= Xml::submitButton( wfMsg( "config-$continue" ),
+                       $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
                                array(
                                        'name' => "submit-$continue",
                                        'tabindex' => $this->parent->nextTabIndex(),
@@ -133,7 +133,7 @@ abstract class WebInstallerPage {
         * @return string
         */
        protected function getFieldsetStart( $legend ) {
-               return "\n<fieldset><legend>" . wfMsgHtml( $legend ) . "</legend>\n";
+               return "\n<fieldset><legend>" . wfMessage( $legend )->escaped() . "</legend>\n";
        }
 
        /**
@@ -232,7 +232,7 @@ class WebInstaller_Language extends WebInstallerPage {
        }
 
        /**
-        * Get a <select> for selecting languages.
+        * Get a "<select>" for selecting languages.
         *
         * @param $name
         * @param $label
@@ -295,8 +295,8 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                        }
                        $this->startForm();
                        $this->addHTML( $this->parent->getInfoBox(
-                               wfMsgNoTrans( 'config-upgrade-key-missing',
-                                       "<pre dir=\"ltr\">\$wgUpgradeKey = '" . $this->getVar( 'wgUpgradeKey' ) . "';</pre>" )
+                               wfMessage( 'config-upgrade-key-missing', "<pre dir=\"ltr\">\$wgUpgradeKey = '" .
+                                       $this->getVar( 'wgUpgradeKey' ) . "';</pre>" )->plain()
                        ) );
                        $this->endForm( 'continue' );
                        return 'output';
@@ -333,7 +333,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
        protected function showKeyForm() {
                $this->startForm();
                $this->addHTML(
-                       $this->parent->getInfoBox( wfMsgNoTrans( 'config-localsettings-upgrade' ) ).
+                       $this->parent->getInfoBox( wfMessage( 'config-localsettings-upgrade' )->plain() ).
                        '<br />' .
                        $this->parent->getTextBox( array(
                                'var' => 'wgUpgradeKey',
@@ -410,13 +410,13 @@ class WebInstaller_Welcome extends WebInstallerPage {
                                return 'continue';
                        }
                }
-               $this->parent->output->addWikiText( wfMsgNoTrans( 'config-welcome' ) );
+               $this->parent->output->addWikiText( wfMessage( 'config-welcome' )->plain() );
                $status = $this->parent->doEnvironmentChecks();
                if ( $status->isGood() ) {
                        $this->parent->output->addHTML( '<span class="success-message">' .
-                               wfMsgHtml( 'config-env-good' ) . '</span>' );
-                       $this->parent->output->addWikiText( wfMsgNoTrans( 'config-copyright',
-                               SpecialVersion::getCopyrightAndAuthorList() ) );
+                               wfMessage( 'config-env-good' )->escaped() . '</span>' );
+                       $this->parent->output->addWikiText( wfMessage( 'config-copyright',
+                               SpecialVersion::getCopyrightAndAuthorList() )->plain() );
                        $this->startForm();
                        $this->endForm();
                } else {
@@ -454,10 +454,10 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                $dbSupport = '';
                foreach( $this->parent->getDBTypes() as $type ) {
                        $link = DatabaseBase::factory( $type )->getSoftwareLink();
-                       $dbSupport .= wfMsgNoTrans( "config-support-$type", $link ) . "\n";
+                       $dbSupport .= wfMessage( "config-support-$type", $link )->plain() . "\n";
                }
                $this->addHTML( $this->parent->getInfoBox(
-                       wfMsg( 'config-support-info', $dbSupport ) ) );
+                       wfMessage( 'config-support-info', trim( $dbSupport ) )->text() ) );
 
                foreach ( $this->parent->getVar( '_CompiledDBs' ) as $type ) {
                        $installer = $this->parent->getDBInstaller( $type );
@@ -476,7 +476,7 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                        $settings .=
                                Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type,
                                                'class' => 'dbWrapper' ) ) .
-                               Html::element( 'h3', array(), wfMsg( 'config-header-' . $type ) ) .
+                               Html::element( 'h3', array(), wfMessage( 'config-header-' . $type )->text() ) .
                                $installer->getConnectForm() .
                                "</div>\n";
                }
@@ -555,7 +555,7 @@ class WebInstaller_Upgrade extends WebInstallerPage {
 
                $this->startForm();
                $this->addHTML( $this->parent->getInfoBox(
-                       wfMsgNoTrans( 'config-can-upgrade', $GLOBALS['wgVersion'] ) ) );
+                       wfMessage( 'config-can-upgrade', $GLOBALS['wgVersion'] )->plain() ) );
                $this->endForm();
        }
 
@@ -570,11 +570,11 @@ class WebInstaller_Upgrade extends WebInstallerPage {
                $this->parent->disableLinkPopups();
                $this->addHTML(
                        $this->parent->getInfoBox(
-                               wfMsgNoTrans( $msg,
+                               wfMessage( $msg,
                                        $this->getVar( 'wgServer' ) .
                                                $this->getVar( 'wgScriptPath' ) . '/index' .
                                                $this->getVar( 'wgScriptExtension' )
-                               ), 'tick-32.png'
+                               )->plain(), 'tick-32.png'
                        )
                );
                $this->parent->restoreLinkPopups();
@@ -635,7 +635,10 @@ class WebInstaller_Name extends WebInstallerPage {
                // Set wgMetaNamespace to something valid before we show the form.
                // $wgMetaNamespace defaults to $wgSiteName which is 'MediaWiki'
                $metaNS = $this->getVar( 'wgMetaNamespace' );
-               $this->setVar( 'wgMetaNamespace', wfMsgForContent( 'config-ns-other-default' ) );
+               $this->setVar(
+                       'wgMetaNamespace',
+                       wfMessage( 'config-ns-other-default' )->inContentLanguage()->text()
+               );
 
                $this->addHTML(
                        $this->parent->getTextBox( array(
@@ -683,7 +686,7 @@ class WebInstaller_Name extends WebInstallerPage {
                                'help' => $this->parent->getHelpBox( 'config-subscribe-help' )
                        ) ) .
                        $this->getFieldSetEnd() .
-                       $this->parent->getInfoBox( wfMsg( 'config-almost-done' ) ) .
+                       $this->parent->getInfoBox( wfMessage( 'config-almost-done' )->text() ) .
                        $this->parent->getRadioSet( array(
                                'var' => '_SkipOptional',
                                'itemLabelPrefix' => 'config-optional-',
@@ -721,7 +724,7 @@ class WebInstaller_Name extends WebInstallerPage {
                        $name = preg_replace( '/__+/', '_', $name );
                        $name = ucfirst( trim( $name, '_' ) );
                } elseif ( $nsType == 'generic' ) {
-                       $name = wfMsg( 'config-ns-generic' );
+                       $name = wfMessage( 'config-ns-generic' )->text();
                } else { // other
                        $name = $this->getVar( 'wgMetaNamespace' );
                }
@@ -833,7 +836,7 @@ class WebInstaller_Options extends WebInstallerPage {
                                'itemLabelPrefix' => 'config-profile-',
                                'values' => array_keys( $this->parent->rightsProfiles ),
                        ) ) .
-                       $this->parent->getInfoBox( wfMsgNoTrans( 'config-profile-help' ) ) .
+                       $this->parent->getInfoBox( wfMessage( 'config-profile-help' )->plain() ) .
 
                        # Licensing
                        $this->parent->getRadioSet( array(
@@ -1046,7 +1049,7 @@ class WebInstaller_Options extends WebInstallerPage {
                                        'href' => $this->getCCPartnerUrl(),
                                        'onclick' => $expandJs,
                                ),
-                               wfMsg( 'config-cc-again' )
+                               wfMessage( 'config-cc-again' )->text()
                        ) .
                        "</p>\n" .
                        "<script type=\"text/javascript\">\n" .
@@ -1092,7 +1095,7 @@ class WebInstaller_Options extends WebInstallerPage {
                        if ( isset( $entry['text'] ) ) {
                                $this->setVar( 'wgRightsText', $entry['text'] );
                        } else {
-                               $this->setVar( 'wgRightsText', wfMsg( 'config-license-' . $code ) );
+                               $this->setVar( 'wgRightsText', wfMessage( 'config-license-' . $code )->text() );
                        }
                        $this->setVar( 'wgRightsUrl', $entry['url'] );
                        $this->setVar( 'wgRightsIcon', $entry['icon'] );
@@ -1165,14 +1168,14 @@ class WebInstaller_Install extends WebInstallerPage {
                        $this->endForm( $continue, $back );
                } else {
                        $this->startForm();
-                       $this->addHTML( $this->parent->getInfoBox( wfMsgNoTrans( 'config-install-begin' ) ) );
+                       $this->addHTML( $this->parent->getInfoBox( wfMessage( 'config-install-begin' )->plain() ) );
                        $this->endForm();
                }
                return true;
        }
 
        public function startStage( $step ) {
-               $this->addHTML( "<li>" . wfMsgHtml( "config-install-$step" ) . wfMsg( 'ellipsis') );
+               $this->addHTML( "<li>" . wfMessage( "config-install-$step" )->escaped() . wfMessage( 'ellipsis')->escaped() );
                if ( $step == 'extension-tables' ) {
                        $this->startLiveBox();
                }
@@ -1187,7 +1190,7 @@ class WebInstaller_Install extends WebInstallerPage {
                        $this->endLiveBox();
                }
                $msg = $status->isOk() ? 'config-install-step-done' : 'config-install-step-failed';
-               $html = wfMsgHtml( 'word-separator' ) . wfMsgHtml( $msg );
+               $html = wfMessage( 'word-separator' )->escaped() . wfMessage( $msg )->escaped();
                if ( !$status->isOk() ) {
                        $html = "<span class=\"error\">$html</span>";
                }
@@ -1219,13 +1222,13 @@ class WebInstaller_Complete extends WebInstallerPage {
                $this->parent->disableLinkPopups();
                $this->addHTML(
                        $this->parent->getInfoBox(
-                               wfMsgNoTrans( 'config-install-done',
+                               wfMessage( 'config-install-done',
                                        $lsUrl,
                                        $this->getVar( 'wgServer' ) .
                                                $this->getVar( 'wgScriptPath' ) . '/index' .
                                                $this->getVar( 'wgScriptExtension' ),
                                        '<downloadlink/>'
-                               ), 'tick-32.png'
+                               )->plain(), 'tick-32.png'
                        )
                );
                $this->parent->restoreLinkPopups();
@@ -1246,7 +1249,7 @@ class WebInstaller_Restart extends WebInstallerPage {
                }
 
                $this->startForm();
-               $s = $this->parent->getWarningBox( wfMsgNoTrans( 'config-help-restart' ) );
+               $s = $this->parent->getWarningBox( wfMessage( 'config-help-restart' )->plain() );
                $this->addHTML( $s );
                $this->endForm( 'restart' );
        }
@@ -1266,9 +1269,9 @@ abstract class WebInstaller_Document extends WebInstallerPage {
        }
 
        public function getFileContents() {
-               $file = dirname( __FILE__ ) . '/../../' . $this->getFileName();
+               $file = __DIR__ . '/../../' . $this->getFileName();
                if( ! file_exists( $file ) ) {
-                       return wfMsgNoTrans( 'config-nofile', $file );
+                       return wfMessage( 'config-nofile', $file )->plain();
                }
                return file_get_contents( $file );
        }
index 4e02258..08af997 100644 (file)
@@ -36,7 +36,7 @@ class DoubleRedirectJob extends Job {
 
        /**
         * Insert jobs into the job queue to fix redirects to the given title
-        * @param $reason String: the reason for the fix, see message double-redirect-fixed-<reason>
+        * @param $reason String: the reason for the fix, see message "double-redirect-fixed-<reason>"
         * @param $redirTitle Title: the title which has changed, redirects pointing to this title are fixed
         * @param $destTitle bool Not used
         */
@@ -89,7 +89,7 @@ class DoubleRedirectJob extends Job {
                        return false;
                }
 
-               $targetRev = Revision::newFromTitle( $this->title );
+               $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
                if ( !$targetRev ) {
                        wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
                        return true;
@@ -141,8 +141,9 @@ class DoubleRedirectJob extends Job {
                $oldUser = $wgUser;
                $wgUser = $this->getUser();
                $article = WikiPage::factory( $this->title );
-               $reason = wfMsgForContent( 'double-redirect-fixed-' . $this->reason,
-                       $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText() );
+               $reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
+                       $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
+               )->inContentLanguage()->text();
                $article->doEdit( $newText, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $this->getUser() );
                $wgUser = $oldUser;
 
@@ -194,7 +195,7 @@ class DoubleRedirectJob extends Job {
         */
        function getUser() {
                if ( !self::$user ) {
-                       self::$user = User::newFromName( wfMsgForContent( 'double-redirect-fixer' ), false );
+                       self::$user = User::newFromName( wfMessage( 'double-redirect-fixer' )->inContentLanguage()->text(), false );
                        # FIXME: newFromName could return false on a badly configured wiki.
                        if ( !self::$user->isLoggedIn() ) {
                                self::$user->addToDatabase();
diff --git a/includes/job/Job.php b/includes/job/Job.php
new file mode 100644 (file)
index 0000000..45f0570
--- /dev/null
@@ -0,0 +1,446 @@
+<?php
+/**
+ * Job queue base code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @defgroup JobQueue JobQueue
+ */
+
+/**
+ * Class to both describe a background job and handle jobs.
+ *
+ * @ingroup JobQueue
+ */
+abstract class Job {
+
+       /**
+        * @var Title
+        */
+       var $title;
+
+       var $command,
+               $params,
+               $id,
+               $removeDuplicates,
+               $error;
+
+       /*-------------------------------------------------------------------------
+        * Abstract functions
+        *------------------------------------------------------------------------*/
+
+       /**
+        * Run the job
+        * @return boolean success
+        */
+       abstract function run();
+
+       /*-------------------------------------------------------------------------
+        * Static functions
+        *------------------------------------------------------------------------*/
+
+       /**
+        * Pop a job of a certain type.  This tries less hard than pop() to
+        * actually find a job; it may be adversely affected by concurrent job
+        * runners.
+        *
+        * @param $type string
+        *
+        * @return Job
+        */
+       static function pop_type( $type ) {
+               wfProfilein( __METHOD__ );
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $dbw->begin( __METHOD__ );
+
+               $row = $dbw->selectRow(
+                       'job',
+                       '*',
+                       array( 'job_cmd' => $type ),
+                       __METHOD__,
+                       array( 'LIMIT' => 1, 'FOR UPDATE' )
+               );
+
+               if ( $row === false ) {
+                       $dbw->commit( __METHOD__ );
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               /* Ensure we "own" this row */
+               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+               $affected = $dbw->affectedRows();
+               $dbw->commit( __METHOD__ );
+
+               if ( $affected == 0 ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               wfIncrStats( 'job-pop' );
+               $namespace = $row->job_namespace;
+               $dbkey = $row->job_title;
+               $title = Title::makeTitleSafe( $namespace, $dbkey );
+               $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ),
+                       $row->job_id );
+
+               $job->removeDuplicates();
+
+               wfProfileOut( __METHOD__ );
+               return $job;
+       }
+
+       /**
+        * Pop a job off the front of the queue
+        *
+        * @param $offset Integer: Number of jobs to skip
+        * @return Job or false if there's no jobs
+        */
+       static function pop( $offset = 0 ) {
+               wfProfileIn( __METHOD__ );
+
+               $dbr = wfGetDB( DB_SLAVE );
+
+               /* Get a job from the slave, start with an offset,
+                       scan full set afterwards, avoid hitting purged rows
+
+                       NB: If random fetch previously was used, offset
+                               will always be ahead of few entries
+               */
+
+               $conditions = self::defaultQueueConditions();
+
+               $offset = intval( $offset );
+               $options = array( 'ORDER BY' => 'job_id', 'USE INDEX' => 'PRIMARY' );
+
+               $row = $dbr->selectRow( 'job', '*',
+                       array_merge( $conditions, array( "job_id >= $offset" ) ),
+                       __METHOD__,
+                       $options
+               );
+
+               // Refetching without offset is needed as some of job IDs could have had delayed commits
+               // and have lower IDs than jobs already executed, blame concurrency :)
+               //
+               if ( $row === false ) {
+                       if ( $offset != 0 ) {
+                               $row = $dbr->selectRow( 'job', '*', $conditions, __METHOD__, $options );
+                       }
+
+                       if ( $row === false ) {
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+               }
+
+               // Try to delete it from the master
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+               $affected = $dbw->affectedRows();
+
+               if ( !$affected ) {
+                       // Failed, someone else beat us to it
+                       // Try getting a random row
+                       $row = $dbw->selectRow( 'job', array( 'minjob' => 'MIN(job_id)',
+                               'maxjob' => 'MAX(job_id)' ), '1=1', __METHOD__ );
+                       if ( $row === false || is_null( $row->minjob ) || is_null( $row->maxjob ) ) {
+                               // No jobs to get
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+                       // Get the random row
+                       $row = $dbw->selectRow( 'job', '*',
+                               'job_id >= ' . mt_rand( $row->minjob, $row->maxjob ), __METHOD__ );
+                       if ( $row === false ) {
+                               // Random job gone before we got the chance to select it
+                               // Give up
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+                       // Delete the random row
+                       $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+                       $affected = $dbw->affectedRows();
+
+                       if ( !$affected ) {
+                               // Random job gone before we exclusively deleted it
+                               // Give up
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+               }
+
+               // If execution got to here, there's a row in $row that has been deleted from the database
+               // by this thread. Hence the concurrent pop was successful.
+               wfIncrStats( 'job-pop' );
+               $namespace = $row->job_namespace;
+               $dbkey = $row->job_title;
+               $title = Title::makeTitleSafe( $namespace, $dbkey );
+
+               if ( is_null( $title ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id );
+
+               // Remove any duplicates it may have later in the queue
+               $job->removeDuplicates();
+
+               wfProfileOut( __METHOD__ );
+               return $job;
+       }
+
+       /**
+        * Create the appropriate object to handle a specific job
+        *
+        * @param $command String: Job command
+        * @param $title Title: Associated title
+        * @param $params Array|bool: Job parameters
+        * @param $id Int: Job identifier
+        * @throws MWException
+        * @return Job
+        */
+       static function factory( $command, Title $title, $params = false, $id = 0 ) {
+               global $wgJobClasses;
+               if( isset( $wgJobClasses[$command] ) ) {
+                       $class = $wgJobClasses[$command];
+                       return new $class( $title, $params, $id );
+               }
+               throw new MWException( "Invalid job command `{$command}`" );
+       }
+
+       /**
+        * @param $params
+        * @return string
+        */
+       static function makeBlob( $params ) {
+               if ( $params !== false ) {
+                       return serialize( $params );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * @param $blob
+        * @return bool|mixed
+        */
+       static function extractBlob( $blob ) {
+               if ( (string)$blob !== '' ) {
+                       return unserialize( $blob );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Batch-insert a group of jobs into the queue.
+        * This will be wrapped in a transaction with a forced commit.
+        *
+        * This may add duplicate at insert time, but they will be
+        * removed later on, when the first one is popped.
+        *
+        * @param $jobs array of Job objects
+        */
+       static function batchInsert( $jobs ) {
+               if ( !count( $jobs ) ) {
+                       return;
+               }
+               $dbw = wfGetDB( DB_MASTER );
+               $rows = array();
+
+               /**
+                * @var $job Job
+                */
+               foreach ( $jobs as $job ) {
+                       $rows[] = $job->insertFields();
+                       if ( count( $rows ) >= 50 ) {
+                               # Do a small transaction to avoid slave lag
+                               $dbw->begin( __METHOD__ );
+                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+                               $dbw->commit( __METHOD__ );
+                               $rows = array();
+                       }
+               }
+               if ( $rows ) { // last chunk
+                       $dbw->begin( __METHOD__ );
+                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+                       $dbw->commit( __METHOD__ );
+               }
+               wfIncrStats( 'job-insert', count( $jobs ) );
+       }
+
+       /**
+        * Insert a group of jobs into the queue.
+        *
+        * Same as batchInsert() but does not commit and can thus
+        * be rolled-back as part of a larger transaction. However,
+        * large batches of jobs can cause slave lag.
+        *
+        * @param $jobs array of Job objects
+        */
+       static function safeBatchInsert( $jobs ) {
+               if ( !count( $jobs ) ) {
+                       return;
+               }
+               $dbw = wfGetDB( DB_MASTER );
+               $rows = array();
+               foreach ( $jobs as $job ) {
+                       $rows[] = $job->insertFields();
+                       if ( count( $rows ) >= 500 ) {
+                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+                               $rows = array();
+                       }
+               }
+               if ( $rows ) { // last chunk
+                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+               }
+               wfIncrStats( 'job-insert', count( $jobs ) );
+       }
+
+
+       /**
+        * SQL conditions to apply on most JobQueue queries
+        *
+        * Whenever we exclude jobs types from the default queue, we want to make
+        * sure that queries to the job queue actually ignore them.
+        *
+        * @return array SQL conditions suitable for Database:: methods
+        */
+       static function defaultQueueConditions( ) {
+               global $wgJobTypesExcludedFromDefaultQueue;
+               $conditions = array();
+               if ( count( $wgJobTypesExcludedFromDefaultQueue ) > 0 ) {
+                       $dbr = wfGetDB( DB_SLAVE );
+                       foreach ( $wgJobTypesExcludedFromDefaultQueue as $cmdType ) {
+                               $conditions[] = "job_cmd != " . $dbr->addQuotes( $cmdType );
+                       }
+               }
+               return $conditions;
+       }
+
+       /*-------------------------------------------------------------------------
+        * Non-static functions
+        *------------------------------------------------------------------------*/
+
+       /**
+        * @param $command
+        * @param $title
+        * @param $params array|bool
+        * @param $id int
+        */
+       function __construct( $command, $title, $params = false, $id = 0 ) {
+               $this->command = $command;
+               $this->title = $title;
+               $this->params = $params;
+               $this->id = $id;
+
+               // A bit of premature generalisation
+               // Oh well, the whole class is premature generalisation really
+               $this->removeDuplicates = true;
+       }
+
+       /**
+        * Insert a single job into the queue.
+        * @return bool true on success
+        */
+       function insert() {
+               $fields = $this->insertFields();
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               if ( $this->removeDuplicates ) {
+                       $res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
+                       if ( $dbw->numRows( $res ) ) {
+                               return true;
+                       }
+               }
+               wfIncrStats( 'job-insert' );
+               return $dbw->insert( 'job', $fields, __METHOD__ );
+       }
+
+       /**
+        * @return array
+        */
+       protected function insertFields() {
+               $dbw = wfGetDB( DB_MASTER );
+               return array(
+                       'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
+                       'job_cmd' => $this->command,
+                       'job_namespace' => $this->title->getNamespace(),
+                       'job_title' => $this->title->getDBkey(),
+                       'job_timestamp' => $dbw->timestamp(),
+                       'job_params' => Job::makeBlob( $this->params )
+               );
+       }
+
+       /**
+        * Remove jobs in the job queue which are duplicates of this job.
+        * This is deadlock-prone and so starts its own transaction.
+        */
+       function removeDuplicates() {
+               if ( !$this->removeDuplicates ) {
+                       return;
+               }
+
+               $fields = $this->insertFields();
+               unset( $fields['job_id'] );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin( __METHOD__ );
+               $dbw->delete( 'job', $fields, __METHOD__ );
+               $affected = $dbw->affectedRows();
+               $dbw->commit( __METHOD__ );
+               if ( $affected ) {
+                       wfIncrStats( 'job-dup-delete', $affected );
+               }
+       }
+
+       /**
+        * @return string
+        */
+       function toString() {
+               $paramString = '';
+               if ( $this->params ) {
+                       foreach ( $this->params as $key => $value ) {
+                               if ( $paramString != '' ) {
+                                       $paramString .= ' ';
+                               }
+                               $paramString .= "$key=$value";
+                       }
+               }
+
+               if ( is_object( $this->title ) ) {
+                       $s = "{$this->command} " . $this->title->getPrefixedDBkey();
+                       if ( $paramString !== '' ) {
+                               $s .= ' ' . $paramString;
+                       }
+                       return $s;
+               } else {
+                       return "{$this->command} $paramString";
+               }
+       }
+
+       protected function setLastError( $error ) {
+               $this->error = $error;
+       }
+
+       function getLastError() {
+               return $this->error;
+       }
+}
diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php
deleted file mode 100644 (file)
index 7b7ec0c..0000000
+++ /dev/null
@@ -1,447 +0,0 @@
-<?php
-/**
- * Job queue base code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @defgroup JobQueue JobQueue
- */
-
-/**
- * Class to both describe a background job and handle jobs.
- *
- * @ingroup JobQueue
- */
-abstract class Job {
-
-       /**
-        * @var Title
-        */
-       var $title;
-
-       var $command,
-               $params,
-               $id,
-               $removeDuplicates,
-               $error;
-
-       /*-------------------------------------------------------------------------
-        * Abstract functions
-        *------------------------------------------------------------------------*/
-
-       /**
-        * Run the job
-        * @return boolean success
-        */
-       abstract function run();
-
-       /*-------------------------------------------------------------------------
-        * Static functions
-        *------------------------------------------------------------------------*/
-
-       /**
-        * Pop a job of a certain type.  This tries less hard than pop() to
-        * actually find a job; it may be adversely affected by concurrent job
-        * runners.
-        *
-        * @param $type string
-        *
-        * @return Job
-        */
-       static function pop_type( $type ) {
-               wfProfilein( __METHOD__ );
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $dbw->begin( __METHOD__ );
-
-               $row = $dbw->selectRow(
-                       'job',
-                       '*',
-                       array( 'job_cmd' => $type ),
-                       __METHOD__,
-                       array( 'LIMIT' => 1, 'FOR UPDATE' )
-               );
-
-               if ( $row === false ) {
-                       $dbw->commit( __METHOD__ );
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               /* Ensure we "own" this row */
-               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-
-               if ( $affected == 0 ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               wfIncrStats( 'job-pop' );
-               $namespace = $row->job_namespace;
-               $dbkey = $row->job_title;
-               $title = Title::makeTitleSafe( $namespace, $dbkey );
-               $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ),
-                       $row->job_id );
-
-               $job->removeDuplicates();
-
-               wfProfileOut( __METHOD__ );
-               return $job;
-       }
-
-       /**
-        * Pop a job off the front of the queue
-        *
-        * @param $offset Integer: Number of jobs to skip
-        * @return Job or false if there's no jobs
-        */
-       static function pop( $offset = 0 ) {
-               wfProfileIn( __METHOD__ );
-
-               $dbr = wfGetDB( DB_SLAVE );
-
-               /* Get a job from the slave, start with an offset,
-                       scan full set afterwards, avoid hitting purged rows
-
-                       NB: If random fetch previously was used, offset
-                               will always be ahead of few entries
-               */
-
-               $conditions = self::defaultQueueConditions();
-
-               $offset = intval( $offset );
-               $options = array( 'ORDER BY' => 'job_id', 'USE INDEX' => 'PRIMARY' );
-
-               $row = $dbr->selectRow( 'job', '*',
-                       array_merge( $conditions, array( "job_id >= $offset" ) ),
-                       __METHOD__,
-                       $options
-               );
-
-               // Refetching without offset is needed as some of job IDs could have had delayed commits
-               // and have lower IDs than jobs already executed, blame concurrency :)
-               //
-               if ( $row === false ) {
-                       if ( $offset != 0 ) {
-                               $row = $dbr->selectRow( 'job', '*', $conditions, __METHOD__, $options );
-                       }
-
-                       if ( $row === false ) {
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-               }
-
-               // Try to delete it from the master
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-
-               if ( !$affected ) {
-                       // Failed, someone else beat us to it
-                       // Try getting a random row
-                       $row = $dbw->selectRow( 'job', array( 'MIN(job_id) as minjob',
-                               'MAX(job_id) as maxjob' ), '1=1', __METHOD__ );
-                       if ( $row === false || is_null( $row->minjob ) || is_null( $row->maxjob ) ) {
-                               // No jobs to get
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       // Get the random row
-                       $row = $dbw->selectRow( 'job', '*',
-                               'job_id >= ' . mt_rand( $row->minjob, $row->maxjob ), __METHOD__ );
-                       if ( $row === false ) {
-                               // Random job gone before we got the chance to select it
-                               // Give up
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       // Delete the random row
-                       $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-                       $affected = $dbw->affectedRows();
-                       $dbw->commit( __METHOD__ );
-
-                       if ( !$affected ) {
-                               // Random job gone before we exclusively deleted it
-                               // Give up
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-               }
-
-               // If execution got to here, there's a row in $row that has been deleted from the database
-               // by this thread. Hence the concurrent pop was successful.
-               wfIncrStats( 'job-pop' );
-               $namespace = $row->job_namespace;
-               $dbkey = $row->job_title;
-               $title = Title::makeTitleSafe( $namespace, $dbkey );
-
-               if ( is_null( $title ) ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id );
-
-               // Remove any duplicates it may have later in the queue
-               $job->removeDuplicates();
-
-               wfProfileOut( __METHOD__ );
-               return $job;
-       }
-
-       /**
-        * Create the appropriate object to handle a specific job
-        *
-        * @param $command String: Job command
-        * @param $title Title: Associated title
-        * @param $params Array: Job parameters
-        * @param $id Int: Job identifier
-        * @return Job
-        */
-       static function factory( $command, Title $title, $params = false, $id = 0 ) {
-               global $wgJobClasses;
-               if( isset( $wgJobClasses[$command] ) ) {
-                       $class = $wgJobClasses[$command];
-                       return new $class( $title, $params, $id );
-               }
-               throw new MWException( "Invalid job command `{$command}`" );
-       }
-
-       /**
-        * @param $params
-        * @return string
-        */
-       static function makeBlob( $params ) {
-               if ( $params !== false ) {
-                       return serialize( $params );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * @param $blob
-        * @return bool|mixed
-        */
-       static function extractBlob( $blob ) {
-               if ( (string)$blob !== '' ) {
-                       return unserialize( $blob );
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Batch-insert a group of jobs into the queue.
-        * This will be wrapped in a transaction with a forced commit.
-        *
-        * This may add duplicate at insert time, but they will be
-        * removed later on, when the first one is popped.
-        *
-        * @param $jobs array of Job objects
-        */
-       static function batchInsert( $jobs ) {
-               if ( !count( $jobs ) ) {
-                       return;
-               }
-               $dbw = wfGetDB( DB_MASTER );
-               $rows = array();
-
-               /**
-                * @var $job Job
-                */
-               foreach ( $jobs as $job ) {
-                       $rows[] = $job->insertFields();
-                       if ( count( $rows ) >= 50 ) {
-                               # Do a small transaction to avoid slave lag
-                               $dbw->begin( __METHOD__ );
-                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-                               $dbw->commit( __METHOD__ );
-                               $rows = array();
-                       }
-               }
-               if ( $rows ) { // last chunk
-                       $dbw->begin( __METHOD__ );
-                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-                       $dbw->commit( __METHOD__ );
-               }
-               wfIncrStats( 'job-insert', count( $jobs ) );
-       }
-
-       /**
-        * Insert a group of jobs into the queue.
-        *
-        * Same as batchInsert() but does not commit and can thus
-        * be rolled-back as part of a larger transaction. However,
-        * large batches of jobs can cause slave lag.
-        *
-        * @param $jobs array of Job objects
-        */
-       static function safeBatchInsert( $jobs ) {
-               if ( !count( $jobs ) ) {
-                       return;
-               }
-               $dbw = wfGetDB( DB_MASTER );
-               $rows = array();
-               foreach ( $jobs as $job ) {
-                       $rows[] = $job->insertFields();
-                       if ( count( $rows ) >= 500 ) {
-                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-                               $rows = array();
-                       }
-               }
-               if ( $rows ) { // last chunk
-                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-               }
-               wfIncrStats( 'job-insert', count( $jobs ) );
-       }
-
-
-       /**
-        * SQL conditions to apply on most JobQueue queries
-        *
-        * Whenever we exclude jobs types from the default queue, we want to make
-        * sure that queries to the job queue actually ignore them.
-        *
-        * @return array SQL conditions suitable for Database:: methods
-        */
-       static function defaultQueueConditions( ) {
-               global $wgJobTypesExcludedFromDefaultQueue;
-               $conditions = array();
-               if ( count( $wgJobTypesExcludedFromDefaultQueue ) > 0 ) {
-                       $dbr = wfGetDB( DB_SLAVE );
-                       foreach ( $wgJobTypesExcludedFromDefaultQueue as $cmdType ) {
-                               $conditions[] = "job_cmd != " . $dbr->addQuotes( $cmdType );
-                       }
-               }
-               return $conditions;
-       }
-
-       /*-------------------------------------------------------------------------
-        * Non-static functions
-        *------------------------------------------------------------------------*/
-
-       /**
-        * @param $command
-        * @param $title
-        * @param $params array
-        * @param int $id
-        */
-       function __construct( $command, $title, $params = false, $id = 0 ) {
-               $this->command = $command;
-               $this->title = $title;
-               $this->params = $params;
-               $this->id = $id;
-
-               // A bit of premature generalisation
-               // Oh well, the whole class is premature generalisation really
-               $this->removeDuplicates = true;
-       }
-
-       /**
-        * Insert a single job into the queue.
-        * @return bool true on success
-        */
-       function insert() {
-               $fields = $this->insertFields();
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               if ( $this->removeDuplicates ) {
-                       $res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
-                       if ( $dbw->numRows( $res ) ) {
-                               return true;
-                       }
-               }
-               wfIncrStats( 'job-insert' );
-               return $dbw->insert( 'job', $fields, __METHOD__ );
-       }
-
-       /**
-        * @return array
-        */
-       protected function insertFields() {
-               $dbw = wfGetDB( DB_MASTER );
-               return array(
-                       'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
-                       'job_cmd' => $this->command,
-                       'job_namespace' => $this->title->getNamespace(),
-                       'job_title' => $this->title->getDBkey(),
-                       'job_timestamp' => $dbw->timestamp(),
-                       'job_params' => Job::makeBlob( $this->params )
-               );
-       }
-
-       /**
-        * Remove jobs in the job queue which are duplicates of this job.
-        * This is deadlock-prone and so starts its own transaction.
-        */
-       function removeDuplicates() {
-               if ( !$this->removeDuplicates ) {
-                       return;
-               }
-
-               $fields = $this->insertFields();
-               unset( $fields['job_id'] );
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-               $dbw->delete( 'job', $fields, __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-               if ( $affected ) {
-                       wfIncrStats( 'job-dup-delete', $affected );
-               }
-       }
-
-       /**
-        * @return string
-        */
-       function toString() {
-               $paramString = '';
-               if ( $this->params ) {
-                       foreach ( $this->params as $key => $value ) {
-                               if ( $paramString != '' ) {
-                                       $paramString .= ' ';
-                               }
-                               $paramString .= "$key=$value";
-                       }
-               }
-
-               if ( is_object( $this->title ) ) {
-                       $s = "{$this->command} " . $this->title->getPrefixedDBkey();
-                       if ( $paramString !== '' ) {
-                               $s .= ' ' . $paramString;
-                       }
-                       return $s;
-               } else {
-                       return "{$this->command} $paramString";
-               }
-       }
-
-       protected function setLastError( $error ) {
-               $this->error = $error;
-       }
-
-       function getLastError() {
-               return $this->error;
-       }
-}
index 7ccf00d..b23951c 100644 (file)
@@ -37,7 +37,6 @@ class RefreshLinksJob extends Job {
         * @return boolean success
         */
        function run() {
-               global $wgParser, $wgContLang;
                wfProfileIn( __METHOD__ );
 
                $linkCache = LinkCache::singleton();
@@ -49,26 +48,41 @@ class RefreshLinksJob extends Job {
                        return false;
                }
 
-               $revision = Revision::newFromTitle( $this->title );
+               # Wait for the DB of the current/next slave DB handle to catch up to the master.
+               # This way, we get the correct page_latest for templates or files that just changed
+               # milliseconds ago, having triggered this job to begin with.
+               if ( isset( $this->params['masterPos'] ) ) {
+                       wfGetLB()->waitFor( $this->params['masterPos'] );
+               }
+
+               $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
                if ( !$revision ) {
-                       $this->error = 'refreshLinks: Article not found "' . $this->title->getPrefixedDBkey() . '"';
+                       $this->error = 'refreshLinks: Article not found "' .
+                               $this->title->getPrefixedDBkey() . '"';
                        wfProfileOut( __METHOD__ );
-                       return false;
+                       return false; // XXX: what if it was just deleted?
                }
 
-               wfProfileIn( __METHOD__.'-parse' );
-               $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
-               $parserOutput = $wgParser->parse( $revision->getText(), $this->title, $options, true, true, $revision->getId() );
-               wfProfileOut( __METHOD__.'-parse' );
-               wfProfileIn( __METHOD__.'-update' );
+               self::runForTitleInternal( $this->title, $revision, __METHOD__ );
 
-               $updates = $parserOutput->getSecondaryDataUpdates( $this->title, false );
-               DataUpdate::runUpdates( $updates );
-
-               wfProfileOut( __METHOD__.'-update' );
                wfProfileOut( __METHOD__ );
                return true;
        }
+
+       public static function runForTitleInternal( Title $title, Revision $revision, $fname ) {
+               global $wgParser, $wgContLang;
+
+               wfProfileIn( $fname . '-parse' );
+               $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+               $parserOutput = $wgParser->parse(
+                       $revision->getText(), $title, $options, true, true, $revision->getId() );
+               wfProfileOut( $fname . '-parse' );
+
+               wfProfileIn( $fname . '-update' );
+               $updates = $parserOutput->getSecondaryDataUpdates( $title, false );
+               DataUpdate::runUpdates( $updates );
+               wfProfileOut( $fname . '-update' );
+       }
 }
 
 /**
@@ -78,6 +92,7 @@ class RefreshLinksJob extends Job {
  * @ingroup JobQueue
  */
 class RefreshLinksJob2 extends Job {
+       const MAX_TITLES_RUN = 10;
 
        function __construct( $title, $params, $id = 0 ) {
                parent::__construct( 'refreshLinks2', $title, $params, $id );
@@ -88,62 +103,100 @@ class RefreshLinksJob2 extends Job {
         * @return boolean success
         */
        function run() {
-               global $wgParser, $wgContLang;
-
                wfProfileIn( __METHOD__ );
 
                $linkCache = LinkCache::singleton();
                $linkCache->clear();
 
-               if( is_null( $this->title ) ) {
+               if ( is_null( $this->title ) ) {
                        $this->error = "refreshLinks2: Invalid title";
                        wfProfileOut( __METHOD__ );
                        return false;
-               }
-               if( !isset($this->params['start']) || !isset($this->params['end']) ) {
+               } elseif ( !isset( $this->params['start'] ) || !isset( $this->params['end'] ) ) {
                        $this->error = "refreshLinks2: Invalid params";
                        wfProfileOut( __METHOD__ );
                        return false;
                }
+
                // Back compat for pre-r94435 jobs
                $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
-               $titles = $this->title->getBacklinkCache()->getLinks( 
-                       $table, $this->params['start'], $this->params['end']);
-               
-               # Not suitable for page load triggered job running!
-               # Gracefully switch to refreshLinks jobs if this happens.
-               if( php_sapi_name() != 'cli' ) {
+
+               // Avoid slave lag when fetching templates
+               if ( isset( $this->params['masterPos'] ) ) {
+                       $masterPos = $this->params['masterPos'];
+               } elseif ( wfGetLB()->getServerCount() > 1  ) {
+                       $masterPos = wfGetLB()->getMasterPos();
+               } else {
+                       $masterPos = false;
+               }
+
+               $titles = $this->title->getBacklinkCache()->getLinks(
+                       $table, $this->params['start'], $this->params['end'] );
+
+               if ( $titles->count() > self::MAX_TITLES_RUN ) {
+                       # We don't want to parse too many pages per job as it can starve other jobs.
+                       # If there are too many pages to parse, break this up into smaller jobs. By passing
+                       # in the master position here we can cut down on the time spent waiting for slaves to
+                       # catch up by the runners handling these jobs since time will have passed between now
+                       # and when they pop these jobs off the queue.
+                       $start = 0; // batch start
+                       $end   = 0; // batch end
+                       $bsize = 0; // batch size
+                       $first = true; // first of batch
+                       $jobs  = array();
+                       foreach ( $titles as $title ) {
+                               $start = $first ? $title->getArticleId() : $start;
+                               $end   = $title->getArticleId();
+                               $first = false;
+                               if ( ++$bsize >= self::MAX_TITLES_RUN ) {
+                                       $jobs[] = new RefreshLinksJob2( $this->title, array(
+                                               'table'     => $table,
+                                               'start'     => $start,
+                                               'end'       => $end,
+                                               'masterPos' => $masterPos
+                                       ) );
+                                       $first = true;
+                                       $start = $end = $bsize = 0;
+                               }
+                       }
+                       if ( $bsize > 0 ) { // group remaining pages into a job
+                               $jobs[] = new RefreshLinksJob2( $this->title, array(
+                                       'table'     => $table,
+                                       'start'     => $start,
+                                       'end'       => $end,
+                                       'masterPos' => $masterPos
+                               ) );
+                       }
+                       Job::batchInsert( $jobs );
+               } elseif ( php_sapi_name() != 'cli' ) {
+                       # Not suitable for page load triggered job running!
+                       # Gracefully switch to refreshLinks jobs if this happens.
                        $jobs = array();
                        foreach ( $titles as $title ) {
-                               $jobs[] = new RefreshLinksJob( $title, '' );
+                               $jobs[] = new RefreshLinksJob( $title, array( 'masterPos' => $masterPos ) );
                        }
                        Job::batchInsert( $jobs );
-
-                       wfProfileOut( __METHOD__ );
-                       return true;
-               }
-               $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
-               # Re-parse each page that transcludes this page and update their tracking links...
-               foreach ( $titles as $title ) {
-                       $revision = Revision::newFromTitle( $title );
-                       if ( !$revision ) {
-                               $this->error = 'refreshLinks: Article not found "' . $title->getPrefixedDBkey() . '"';
-                               wfProfileOut( __METHOD__ );
-                               return false;
+               } else {
+                       # Wait for the DB of the current/next slave DB handle to catch up to the master.
+                       # This way, we get the correct page_latest for templates or files that just changed
+                       # milliseconds ago, having triggered this job to begin with.
+                       if ( $masterPos ) {
+                               wfGetLB()->waitFor( $masterPos );
+                       }
+                       # Re-parse each page that transcludes this page and update their tracking links...
+                       foreach ( $titles as $title ) {
+                               $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
+                               if ( !$revision ) {
+                                       $this->error = 'refreshLinks: Article not found "' .
+                                               $title->getPrefixedDBkey() . '"';
+                                       continue; // skip this page
+                               }
+                               RefreshLinksJob::runForTitleInternal( $title, $revision, __METHOD__ );
+                               wfWaitForSlaves();
                        }
-                       wfProfileIn( __METHOD__.'-parse' );
-                       $parserOutput = $wgParser->parse( $revision->getText(), $title, $options, true, true, $revision->getId() );
-                       wfProfileOut( __METHOD__.'-parse' );
-                       wfProfileIn( __METHOD__.'-update' );
-
-                       $updates = $parserOutput->getSecondaryDataUpdates( $title, false );
-                       DataUpdate::runUpdates( $updates );
-
-                       wfProfileOut( __METHOD__.'-update' );
-                       wfWaitForSlaves();
                }
-               wfProfileOut( __METHOD__ );
 
+               wfProfileOut( __METHOD__ );
                return true;
        }
 }
index 55ccc27..e06f68e 100644 (file)
@@ -82,10 +82,10 @@ class UploadFromUrlJob extends Job {
 
                                if ( $this->params['leaveMessage'] ) {
                                        $this->user->leaveUserMessage(
-                                               wfMsg( 'upload-warning-subj' ),
-                                               wfMsg( 'upload-warning-msg',
+                                               wfMessage( 'upload-warning-subj' )->text(),
+                                               wfMessage( 'upload-warning-msg',
                                                        $key,
-                                                       $this->params['url'] )
+                                                       $this->params['url'] )->text()
                                        );
                                } else {
                                        wfSetupSession( $this->params['sessionId'] );
@@ -119,17 +119,17 @@ class UploadFromUrlJob extends Job {
        protected function leaveMessage( $status ) {
                if ( $this->params['leaveMessage'] ) {
                        if ( $status->isGood() ) {
-                               $this->user->leaveUserMessage( wfMsg( 'upload-success-subj' ),
-                                       wfMsg( 'upload-success-msg',
+                               $this->user->leaveUserMessage( wfMessage( 'upload-success-subj' )->text(),
+                                       wfMessage( 'upload-success-msg',
                                                $this->upload->getTitle()->getText(),
                                                $this->params['url']
-                                       ) );
+                                       )->text() );
                        } else {
-                               $this->user->leaveUserMessage( wfMsg( 'upload-failure-subj' ),
-                                       wfMsg( 'upload-failure-msg',
+                               $this->user->leaveUserMessage( wfMessage( 'upload-failure-subj' )->text(),
+                                       wfMessage( 'upload-failure-msg',
                                                $status->getWikiText(),
                                                $this->params['url']
-                                       ) );
+                                       )->text() );
                        }
                } else {
                        wfSetupSession( $this->params['sessionId'] );
index cae3f12..f67700c 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-require_once dirname( __FILE__ ) . '/Services_JSON.php';
+require_once __DIR__ . '/Services_JSON.php';
 
 /**
  * JSON formatter wrapper class
@@ -41,14 +41,11 @@ class FormatJson {
         * @return string
         */
        public static function encode( $value, $isHtml = false ) {
-               // Some versions of PHP have a broken json_encode, see PHP bug
-               // 46944. Test encoding an affected character (U+20000) to
-               // avoid this.
-               if ( !function_exists( 'json_encode' ) || $isHtml || strtolower( json_encode( "\xf0\xa0\x80\x80" ) ) != '"\ud840\udc00"' ) {
+               if ( !function_exists( 'json_encode' ) || ( $isHtml && version_compare( PHP_VERSION, '5.4.0', '<' ) ) ) {
                        $json = new Services_JSON();
                        return $json->encode( $value, $isHtml );
                } else {
-                       return json_encode( $value );
+                       return json_encode( $value, $isHtml ? JSON_PRETTY_PRINT : 0 );
                }
        }
 
@@ -60,7 +57,7 @@ class FormatJson {
         *
         * @return Mixed: the value encoded in json in appropriate PHP type.
         * Values true, false and null (case-insensitive) are returned as true, false
-        * and &null; respectively. &null; is returned if the json cannot be
+        * and "&null;" respectively. "&null;" is returned if the json cannot be
         * decoded or if the encoded data is deeper than the recursion limit.
         */
        public static function decode( $value, $assoc = false ) {
index e6672b4..4ebbc49 100644 (file)
@@ -268,10 +268,17 @@ class CSSJanus {
         * @return string
         */
        private static function fixBackgroundPosition( $css ) {
-               $css = preg_replace_callback( self::$patterns['bg_horizontal_percentage'],
+               $replaced = preg_replace_callback( self::$patterns['bg_horizontal_percentage'],
                        array( 'self', 'calculateNewBackgroundPosition' ), $css );
-               $css = preg_replace_callback( self::$patterns['bg_horizontal_percentage_x'],
+               if ( $replaced !== null ) {
+                       // Check for null; sometimes preg_replace_callback() returns null here for some weird reason
+                       $css = $replaced;
+               }
+               $replaced = preg_replace_callback( self::$patterns['bg_horizontal_percentage_x'],
                        array( 'self', 'calculateNewBackgroundPosition' ), $css );
+               if ( $replaced !== null ) {
+                       $css = $replaced;
+               }
 
                return $css;
        }
index e9c2bad..fc75cdc 100644 (file)
@@ -152,6 +152,13 @@ class CSSMin {
                                $offset = $match[0][1] + strlen( $match[0][0] ) + $lengthIncrease;
                                continue;
                        }
+
+                       // Guard against double slashes, because "some/remote/../foo.png"
+                       // resolves to "some/remote/foo.png" on (some?) clients (bug 27052).
+                       if ( substr( $remote, -1 ) == '/' ) {
+                               $remote = substr( $remote, 0, -1 );
+                       }
+
                        // Shortcuts
                        $embed = $match['embed'][0];
                        $pre = $match['pre'][0];
@@ -159,10 +166,9 @@ class CSSMin {
                        $query = $match['query'][0];
                        $url = "{$remote}/{$match['file'][0]}";
                        $file = "{$local}/{$match['file'][0]}";
-                       // bug 27052 - Guard against double slashes, because foo//../bar
-                       // apparently resolves to foo/bar on (some?) clients
-                       $url = preg_replace( '#([^:])//+#', '\1/', $url );
+
                        $replacement = false;
+
                        if ( $local !== false && file_exists( $file ) ) {
                                // Add version parameter as a time-stamp in ISO 8601 format,
                                // using Z for the timezone, meaning GMT
diff --git a/includes/libs/GenericArrayObject.php b/includes/libs/GenericArrayObject.php
new file mode 100644 (file)
index 0000000..b4b9d61
--- /dev/null
@@ -0,0 +1,244 @@
+<?php
+
+/**
+ * Extends ArrayObject and does two things:
+ *
+ * Allows for deriving classes to easily intercept additions
+ * and deletions for purposes such as additional indexing.
+ *
+ * Enforces the objects to be of a certain type, so this
+ * can be replied upon, much like if this had true support
+ * for generics, which sadly enough is not possible in PHP.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.20
+ *
+ * @file
+ * @ingroup Diff
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class GenericArrayObject extends ArrayObject {
+
+       /**
+        * Returns the name of an interface/class that the element should implement/extend.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       public abstract function getObjectType();
+
+       /**
+        * @see SiteList::getNewOffset()
+        * @since 1.20
+        * @var integer
+        */
+       protected $indexOffset = 0;
+
+       /**
+        * Finds a new offset for when appending an element.
+        * The base class does this, so it would be better to integrate,
+        * but there does not appear to be any way to do this...
+        *
+        * @since 1.20
+        *
+        * @return integer
+        */
+       protected function getNewOffset() {
+               while ( true ) {
+                       if ( !$this->offsetExists( $this->indexOffset ) ) {
+                               return $this->indexOffset;
+                       }
+
+                       $this->indexOffset++;
+               }
+       }
+
+       /**
+        * Constructor.
+        * @see ArrayObject::__construct
+        *
+        * @since 1.20
+        *
+        * @param null|array $input
+        * @param int $flags
+        * @param string $iterator_class
+        */
+       public function __construct( $input = null, $flags = 0, $iterator_class = 'ArrayIterator' ) {
+               parent::__construct( array(), $flags, $iterator_class );
+
+               if ( !is_null( $input ) ) {
+                       foreach ( $input as $offset => $value ) {
+                               $this->offsetSet( $offset, $value );
+                       }
+               }
+       }
+
+       /**
+        * @see ArrayObject::append
+        *
+        * @since 1.20
+        *
+        * @param mixed $value
+        */
+       public function append( $value ) {
+               $this->setElement( null, $value );
+       }
+
+       /**
+        * @see ArrayObject::offsetSet()
+        *
+        * @since 1.20
+        *
+        * @param mixed $index
+        * @param mixed $value
+        */
+       public function offsetSet( $index, $value ) {
+               $this->setElement( $index, $value );
+       }
+
+       /**
+        * Returns if the provided value has the same type as the elements
+        * that can be added to this ArrayObject.
+        *
+        * @since 1.20
+        *
+        * @param mixed $value
+        *
+        * @return boolean
+        */
+       protected function hasValidType( $value ) {
+               $class = $this->getObjectType();
+               return $value instanceof $class;
+       }
+
+       /**
+        * Method that actually sets the element and holds
+        * all common code needed for set operations, including
+        * type checking and offset resolving.
+        *
+        * If you want to do additional indexing or have code that
+        * otherwise needs to be executed whenever an element is added,
+        * you can overload @see preSetElement.
+        *
+        * @since 1.20
+        *
+        * @param mixed $index
+        * @param mixed $value
+        *
+        * @throws InvalidArgumentException
+        */
+       protected function setElement( $index, $value ) {
+               if ( !$this->hasValidType( $value ) ) {
+                       throw new InvalidArgumentException(
+                               'Can only add ' . $this->getObjectType() . ' implementing objects to ' . get_called_class() . '.'
+                       );
+               }
+
+               if ( is_null( $index ) ) {
+                       $index = $this->getNewOffset();
+               }
+
+               if ( $this->preSetElement( $index, $value ) ) {
+                       parent::offsetSet( $index, $value );
+               }
+       }
+
+       /**
+        * Gets called before a new element is added to the ArrayObject.
+        *
+        * At this point the index is always set (ie not null) and the
+        * value is always of the type returned by @see getObjectType.
+        *
+        * Should return a boolean. When false is returned the element
+        * does not get added to the ArrayObject.
+        *
+        * @since 1.20
+        *
+        * @param integer|string $index
+        * @param mixed $value
+        *
+        * @return boolean
+        */
+       protected function preSetElement( $index, $value ) {
+               return true;
+       }
+
+       /**
+        * @see Serializable::serialize
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       public function serialize() {
+               return serialize( $this->getSerializationData() );
+       }
+
+       /**
+        * Returns an array holding all the data that should go into serialization calls.
+        * This is intended to allow overloading without having to reimplement the
+        * behaviour of this base class.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getSerializationData() {
+               return array(
+                       'data' => $this->getArrayCopy(),
+                       'index' => $this->indexOffset,
+               );
+       }
+
+       /**
+        * @see Serializable::unserialize
+        *
+        * @since 1.20
+        *
+        * @param string $serialization
+        *
+        * @return array
+        */
+       public function unserialize( $serialization ) {
+               $serializationData = unserialize( $serialization );
+
+               foreach ( $serializationData['data'] as $offset => $value ) {
+                       // Just set the element, bypassing checks and offset resolving,
+                       // as these elements have already gone through this.
+                       parent::offsetSet( $offset, $value );
+               }
+
+               $this->indexOffset = $serializationData['index'];
+
+               return $serializationData;
+       }
+
+       /**
+        * Returns if the ArrayObject has no elements.
+        *
+        * @since 1.20
+        *
+        * @return boolean
+        */
+       public function isEmpty() {
+               return $this->count() === 0;
+       }
+
+}
index 04df226..6016641 100644 (file)
  * @file
  */
 
-class LogEventsList {
+class LogEventsList extends ContextSource {
        const NO_ACTION_LINK = 1;
        const NO_EXTRA_USER_LINKS = 2;
        const USE_REVDEL_CHECKBOXES = 4;
 
-       /**
-        * @var Skin
-        */
-       private $skin;
-
-       /**
-        * @var OutputPage
-        */
-       private $out;
        public $flags;
 
        /**
         * @var Array
         */
-       protected $message;
+       protected $mDefaultQuery;
 
        /**
-        * @var Array
+        * Constructor.
+        * The first two parameters used to be $skin and $out, but now only a context
+        * is needed, that's why there's a second unused parameter.
+        *
+        * @param $context IContextSource Context to use; formerly it was Skin object.
+        * @param $unused void Unused; used to be an OutputPage object.
+        * @param $flags int flags; can be a combinaison of self::NO_ACTION_LINK,
+        *        self::NO_EXTRA_USER_LINKS or self::USE_REVDEL_CHECKBOXES.
         */
-       protected $mDefaultQuery;
+       public function __construct( $context, $unused = null, $flags = 0 ) {
+               if ( $context instanceof IContextSource ) {
+                       $this->setContext( $context );
+               } else {
+                       // Old parameters, $context should be a Skin object
+                       $this->setContext( $context->getContext() );
+               }
 
-       public function __construct( $skin, $out, $flags = 0 ) {
-               $this->skin = $skin;
-               $this->out = $out;
                $this->flags = $flags;
-               $this->preCacheMessages();
        }
 
        /**
-        * As we use the same small set of messages in various methods and that
-        * they are called often, we call them once and save them in $this->message
+        * Deprecated alias for getTitle(); do not use.
+        *
+        * @deprecated in 1.20; use getTitle() instead.
+        * @return Title object
         */
-       private function preCacheMessages() {
-               // Precache various messages
-               if( !isset( $this->message ) ) {
-                       $messages = array( 'revertmerge', 'protect_change', 'unblocklink', 'change-blocklink',
-                               'revertmove', 'undeletelink', 'undeleteviewlink', 'revdel-restore', 'hist', 'diff',
-                               'pipe-separator', 'revdel-restore-deleted', 'revdel-restore-visible' );
-                       foreach( $messages as $msg ) {
-                               $this->message[$msg] = wfMsgExt( $msg, array( 'escapenoentities' ) );
-                       }
-               }
+       public function getDisplayTitle() {
+               return $this->getTitle();
        }
 
        /**
@@ -81,12 +75,13 @@ class LogEventsList {
                wfDeprecated( __METHOD__, '1.19' );
                // 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 ) ) {
                        $page = new LogPage( $headerType );
-                       $this->out->setPageTitle( $page->getName()->text() );
-                       $this->out->addHTML( $page->getDescription()->parseAsBlock() );
+                       $out->setPageTitle( $page->getName()->text() );
+                       $out->addHTML( $page->getDescription()->parseAsBlock() );
                } else {
-                       $this->out->addHTML( wfMsgExt('alllogstext',array('parseinline')) );
+                       $out->addHTML( $this->msg( 'alllogstext' )->parse() );
                }
        }
 
@@ -140,15 +135,15 @@ class LogEventsList {
                }
 
                // Submit button
-               $html .= Xml::submitButton( wfMsg( 'allpagessubmit' ) );
+               $html .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() );
 
                // Fieldset
-               $html = Xml::fieldset( wfMsg( 'log' ), $html );
+               $html = Xml::fieldset( $this->msg( 'log' )->text(), $html );
 
                // Form wrapping
                $html = Xml::tags( 'form', array( 'action' => $wgScript, 'method' => 'get' ), $html );
 
-               $this->out->addHTML( $html );
+               $this->getOutput()->addHTML( $html );
        }
 
        /**
@@ -156,9 +151,8 @@ class LogEventsList {
         * @return String: Formatted HTML
         */
        private function getFilterLinks( $filter ) {
-               global $wgLang;
                // show/hide links
-               $messages = array( wfMsgHtml( 'show' ), wfMsgHtml( 'hide' ) );
+               $messages = array( $this->msg( 'show' )->escaped(), $this->msg( 'hide' )->escaped() );
                // Option value -> message mapping
                $links = array();
                $hiddens = ''; // keep track for "go" button
@@ -178,18 +172,16 @@ class LogEventsList {
                                $query
                        );
 
-                       $links[$type] = wfMsgHtml( "log-show-hide-{$type}", $link );
+                       $links[$type] = $this->msg( "log-show-hide-{$type}" )->rawParams( $link )->escaped();
                        $hiddens .= Html::hidden( "hide_{$type}_log", $val ) . "\n";
                }
                // Build links
-               return '<small>'.$wgLang->pipeList( $links ) . '</small>' . $hiddens;
+               return '<small>'.$this->getLanguage()->pipeList( $links ) . '</small>' . $hiddens;
        }
 
        private function getDefaultQuery() {
-               global $wgRequest;
-
                if ( !isset( $this->mDefaultQuery ) ) {
-                       $this->mDefaultQuery = $wgRequest->getQueryValues();
+                       $this->mDefaultQuery = $this->getRequest()->getQueryValues();
                        unset( $this->mDefaultQuery['title'] );
                        unset( $this->mDefaultQuery['dir'] );
                        unset( $this->mDefaultQuery['offset'] );
@@ -201,20 +193,6 @@ class LogEventsList {
                return $this->mDefaultQuery;
        }
 
-       /**
-        * Get the Title object of the page the links should point to.
-        * This is NOT the Title of the page the entries should be restricted to.
-        *
-        * @return Title object
-        */
-       public function getDisplayTitle() {
-               return $this->out->getTitle();
-       }
-
-       public function getContext() {
-               return $this->out->getContext();
-       }
-
        /**
         * @param $queryTypes Array
         * @return String: Formatted HTML
@@ -232,14 +210,12 @@ class LogEventsList {
         * @since 1.19
         */
        public function getTypeSelector() {
-               global $wgUser;
-
                $typesByName = array(); // Temporary array
                // First pass to load the log names
                foreach(  LogPage::validTypes() as $type ) {
                        $page = new LogPage( $type );
                        $restriction = $page->getRestriction();
-                       if ( $wgUser->isAllowed( $restriction ) ) {
+                       if ( $this->getUser()->isAllowed( $restriction ) ) {
                                $typesByName[$type] = $page->getName()->text();
                        }
                }
@@ -266,7 +242,7 @@ class LogEventsList {
         */
        private function getUserInput( $user ) {
                return '<span style="white-space: nowrap">' .
-                       Xml::inputLabel( wfMsg( 'specialloguserlabel' ), 'user', 'mw-log-user', 15, $user ) .
+                       Xml::inputLabel( $this->msg( 'specialloguserlabel' )->text(), 'user', 'mw-log-user', 15, $user ) .
                        '</span>';
        }
 
@@ -276,7 +252,7 @@ class LogEventsList {
         */
        private function getTitleInput( $title ) {
                return '<span style="white-space: nowrap">' .
-                       Xml::inputLabel( wfMsg( 'speciallogtitlelabel' ), 'page', 'mw-log-page', 20, $title ) .
+                       Xml::inputLabel( $this->msg( 'speciallogtitlelabel' )->text(), 'page', 'mw-log-page', 20, $title ) .
                        '</span>';
        }
 
@@ -286,7 +262,7 @@ class LogEventsList {
         */
        private function getTitlePattern( $pattern ) {
                return '<span style="white-space: nowrap">' .
-                       Xml::checkLabel( wfMsg( 'log-title-wildcard' ), 'pattern', 'pattern', $pattern ) .
+                       Xml::checkLabel( $this->msg( 'log-title-wildcard' )->text(), 'pattern', 'pattern', $pattern ) .
                        '</span>';
        }
 
@@ -295,14 +271,13 @@ class LogEventsList {
         * @return string
         */
        private function getExtraInputs( $types ) {
-               global $wgRequest;
-               $offender = $wgRequest->getVal('offender');
+               $offender = $this->getRequest()->getVal( 'offender' );
                $user = User::newFromName( $offender, false );
                if( !$user || ($user->getId() == 0 && !IP::isIPAddress($offender) ) ) {
                        $offender = ''; // Blank field if invalid
                }
                if( count($types) == 1 && $types[0] == 'suppress' ) {
-                       return Xml::inputLabel( wfMsg('revdelete-offender'), 'offender',
+                       return Xml::inputLabel( $this->msg( 'revdelete-offender' )->text(), 'offender',
                                'mw-log-offender', 20, $offender );
                }
                return '';
@@ -329,161 +304,38 @@ class LogEventsList {
        public function logLine( $row ) {
                $entry = DatabaseLogEntry::newFromRow( $row );
                $formatter = LogFormatter::newFromEntry( $entry );
+               $formatter->setContext( $this->getContext() );
                $formatter->setShowUserToolLinks( !( $this->flags & self::NO_EXTRA_USER_LINKS ) );
 
+               $title = $entry->getTarget();
+               $time = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
+                       $entry->getTimestamp(), $this->getUser() ) );
+
                $action = $formatter->getActionText();
-               $comment = $formatter->getComment();
 
-               $classes = array( 'mw-logline-' . $entry->getType() );
-               $title = $entry->getTarget();
-               $time = $this->logTimestamp( $entry );
+               if ( $this->flags & self::NO_ACTION_LINK ) {
+                       $revert = '';
+               } else {
+                       $revert = $formatter->getActionLinks();
+                       if ( $revert != '' ) {
+                               $revert = '<span class="mw-logevent-actionlink">' . $revert . '</span>';
+                       }
+               }
 
-               // Extract extra parameters
-               $paramArray = LogPage::extractParams( $row->log_params );
-               // Add review/revert links and such...
-               $revert = $this->logActionLinks( $row, $title, $paramArray, $comment );
+               $comment = $formatter->getComment();
 
                // Some user can hide log items and have review links
                $del = $this->getShowHideLinks( $row );
-               if( $del != '' ) $del .= ' ';
 
                // Any tags...
                list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'logevent' );
-               $classes = array_merge( $classes, $newClasses );
-
-               return Xml::tags( 'li', array( "class" => implode( ' ', $classes ) ),
-                       $del . "$time $action $comment $revert $tagDisplay" ) . "\n";
-       }
-
-       private function logTimestamp( LogEntry $entry ) {
-               global $wgLang;
-               $time = $wgLang->timeanddate( wfTimestamp( TS_MW, $entry->getTimestamp() ), true );
-               return htmlspecialchars( $time );
-       }
+               $classes = array_merge(
+                       array( 'mw-logline-' . $entry->getType() ),
+                       $newClasses
+               );
 
-       /**
-        * @TODO: split up!
-        *
-        * @param  $row
-        * @param Title $title
-        * @param Array $paramArray
-        * @param  $comment
-        * @return String
-        */
-       private function logActionLinks( $row, $title, $paramArray, &$comment ) {
-               global $wgUser;
-               if( ( $this->flags & self::NO_ACTION_LINK ) // we don't want to see the action
-                       || self::isDeleted( $row, LogPage::DELETED_ACTION ) ) // action is hidden
-               {
-                       return '';
-               }
-               $revert = '';
-               if( self::typeAction( $row, 'move', 'move', 'move' ) && !empty( $paramArray[0] ) ) {
-                       $destTitle = Title::newFromText( $paramArray[0] );
-                       if( $destTitle ) {
-                               $revert = Linker::linkKnown(
-                                       SpecialPage::getTitleFor( 'Movepage' ),
-                                       $this->message['revertmove'],
-                                       array(),
-                                       array(
-                                               'wpOldTitle' => $destTitle->getPrefixedDBkey(),
-                                               'wpNewTitle' => $title->getPrefixedDBkey(),
-                                               'wpReason'   => wfMsgForContent( 'revertmove' ),
-                                               'wpMovetalk' => 0
-                                       )
-                               );
-                               $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
-                       }
-               // Show undelete link
-               } elseif( self::typeAction( $row, array( 'delete', 'suppress' ), 'delete', 'deletedhistory' ) ) {
-                       if( !$wgUser->isAllowed( 'undelete' ) ) {
-                               $viewdeleted = $this->message['undeleteviewlink'];
-                       } else {
-                               $viewdeleted = $this->message['undeletelink'];
-                       }
-                       $revert = Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Undelete' ),
-                               $viewdeleted,
-                               array(),
-                               array( 'target' => $title->getPrefixedDBkey() )
-                        );
-                       $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
-               // Show unblock/change block link
-               } elseif( self::typeAction( $row, array( 'block', 'suppress' ), array( 'block', 'reblock' ), 'block' ) ) {
-                       $revert = Linker::linkKnown(
-                                       SpecialPage::getTitleFor( 'Unblock', $row->log_title ),
-                                       $this->message['unblocklink']
-                               ) .
-                               $this->message['pipe-separator'] .
-                               Linker::linkKnown(
-                                       SpecialPage::getTitleFor( 'Block', $row->log_title ),
-                                       $this->message['change-blocklink']
-                               );
-                               $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
-               // Show change protection link
-               } elseif( self::typeAction( $row, 'protect', array( 'modify', 'protect', 'unprotect' ) ) ) {
-                       $revert .= Linker::link( $title,
-                                       $this->message['hist'],
-                                       array(),
-                                       array(
-                                               'action' => 'history',
-                                               'offset' => $row->log_timestamp
-                                       )
-                               );
-                       if( $wgUser->isAllowed( 'protect' ) ) {
-                               $revert .= $this->message['pipe-separator'] .
-                                       Linker::link( $title,
-                                               $this->message['protect_change'],
-                                               array(),
-                                               array( 'action' => 'protect' ),
-                                               'known' );
-                       }
-                       $revert = ' ' . wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
-               // Show unmerge link
-               } elseif( self::typeAction( $row, 'merge', 'merge', 'mergehistory' ) ) {
-                       $revert = Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'MergeHistory' ),
-                               $this->message['revertmerge'],
-                               array(),
-                               array(
-                                       'target' => $paramArray[0],
-                                       'dest' => $title->getPrefixedDBkey(),
-                                       'mergepoint' => $paramArray[1]
-                               )
-                       );
-                       $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
-               // If an edit was hidden from a page give a review link to the history
-               } elseif( self::typeAction( $row, array( 'delete', 'suppress' ), 'revision', 'deletedhistory' ) ) {
-                       $revert = RevisionDeleter::getLogLinks( $title, $paramArray,
-                                                               $this->message );
-               // Hidden log items, give review link
-               } elseif( self::typeAction( $row, array( 'delete', 'suppress' ), 'event', 'deletedhistory' ) ) {
-                       if( count($paramArray) >= 1 ) {
-                               $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
-                               // $paramArray[1] is a CSV of the IDs
-                               $query = $paramArray[0];
-                               // Link to each hidden object ID, $paramArray[1] is the url param
-                               $revert = Linker::linkKnown(
-                                       $revdel,
-                                       $this->message['revdel-restore'],
-                                       array(),
-                                       array(
-                                               'target' => $title->getPrefixedText(),
-                                               'type' => 'logging',
-                                               'ids' => $query
-                                       )
-                               );
-                               $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
-                       }
-               // Do nothing. The implementation is handled by the hook modifiying the passed-by-ref parameters.
-               } else {
-                       wfRunHooks( 'LogLine', array( $row->log_type, $row->log_action, $title, $paramArray,
-                               &$comment, &$revert, $row->log_timestamp ) );
-               }
-               if( $revert != '' ) {
-                       $revert = '<span class="mw-logevent-actionlink">' . $revert . '</span>';
-               }
-               return $revert;
+               return Html::rawElement( 'li', array( 'class' => $classes ),
+                       "$del $time $action $comment $revert $tagDisplay" ) . "\n";
        }
 
        /**
@@ -491,24 +343,24 @@ class LogEventsList {
         * @return string
         */
        private function getShowHideLinks( $row ) {
-               global $wgUser;
                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 = '';
-               // Don't show useless checkbox to people who cannot hide revisions
-               if( $wgUser->isAllowed( 'deletedhistory' ) ) {
-                       if( $row->log_deleted || $wgUser->isAllowed( 'deleterevision' ) ) {
-                               $canHide = $wgUser->isAllowed( 'deleterevision' );
+               $user = $this->getUser();
+               // Don't show useless checkbox to people who cannot hide log entries
+               if( $user->isAllowed( 'deletedhistory' ) ) {
+                       if( $row->log_deleted || $user->isAllowed( 'deletelogentry' ) ) {
+                               $canHide = $user->isAllowed( 'deletelogentry' );
                                if ( $this->flags & self::USE_REVDEL_CHECKBOXES ) { // Show checkboxes instead of links.
-                                       if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED ) ) { // If event was hidden from sysops
+                                       if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED, $user ) ) { // If event was hidden from sysops
                                                $del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
                                        } else {
                                                $del = Xml::check( 'showhiderevisions', false, array( 'name' => 'ids[' . $row->log_id . ']' ) );
                                        }
                                } else {
-                                       if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED ) ) { // If event was hidden from sysops
+                                       if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED, $user ) ) { // If event was hidden from sysops
                                                $del = Linker::revDeleteLinkDisabled( $canHide );
                                        } else {
                                                $query = array(
@@ -608,8 +460,8 @@ class LogEventsList {
         *   if set to true (default), "No matching items in log" is displayed if loglist is empty
         * - msgKey Array If you want a nice box with a message, set this to the key of the message.
         *   First element is the message key, additional optional elements are parameters for the key
-        *   that are processed with wfMsgExt and option 'parse'
-        * - offset Set to overwrite offset parameter in $wgRequest
+        *   that are processed with wfMessage
+        * - offset Set to overwrite offset parameter in WebRequest
         *   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)
@@ -647,9 +499,9 @@ class LogEventsList {
                }
 
                # Insert list of top 50 (or top $lim) items
-               $loglist = new LogEventsList( $context->getSkin(), $context->getOutput(), $flags );
+               $loglist = new LogEventsList( $context, null, $flags );
                $pager = new LogPager( $loglist, $types, $user, $page, '', $conds );
-               if ( isset( $param['offset'] ) ) { # Tell pager to ignore $wgRequest offset
+               if ( isset( $param['offset'] ) ) { # Tell pager to ignore WebRequest offset
                        $pager->setOffset( $param['offset'] );
                }
                if( $lim > 0 ) $pager->mLimit = $lim;
@@ -660,11 +512,11 @@ class LogEventsList {
                                $s = '<div class="mw-warning-with-logexcerpt">';
 
                                if ( count( $msgKey ) == 1 ) {
-                                       $s .= wfMsgExt( $msgKey[0], array( 'parse' ) );
+                                       $s .= $context->msg( $msgKey[0] )->parseAsBlock();
                                } else { // Process additional arguments
                                        $args = $msgKey;
                                        array_shift( $args );
-                                       $s .= wfMsgExt( $msgKey[0], array( 'parse' ), $args );
+                                       $s .= $context->msg( $msgKey[0], $args )->parseAsBlock();
                                }
                        }
                        $s .= $loglist->beginLogEventsList() .
@@ -673,7 +525,7 @@ class LogEventsList {
                } else {
                        if ( $showIfEmpty ) {
                                $s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
-                                       wfMsgExt( 'logempty', array( 'parseinline' ) ) );
+                                       $context->msg( 'logempty' )->parse() );
                        }
                }
                if( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
@@ -692,7 +544,7 @@ class LogEventsList {
                                $urlParam['type'] = $types[0];
                        $s .= Linker::link(
                                SpecialPage::getTitleFor( 'Log' ),
-                               wfMsgHtml( 'log-fulllog' ),
+                               $context->msg( 'log-fulllog' )->escaped(),
                                array(),
                                $urlParam
                        );
index 1ba6a3b..7586bb6 100644 (file)
@@ -109,24 +109,24 @@ class LogFormatter {
 
        /**
         * Set the visibility restrictions for displaying content.
-        * If set to public, and an item is deleted, then it will be replaced 
+        * If set to public, and an item is deleted, then it will be replaced
         * with a placeholder even if the context user is allowed to view it.
         * @param $audience integer self::FOR_THIS_USER or self::FOR_PUBLIC
         */
        public function setAudience( $audience ) {
                $this->audience = ( $audience == self::FOR_THIS_USER )
-                       ? self::FOR_THIS_USER 
+                       ? self::FOR_THIS_USER
                        : self::FOR_PUBLIC;
        }
 
        /**
         * Check if a log item can be displayed
         * @param $field integer LogPage::DELETED_* constant
-        * @return bool 
+        * @return bool
         */
        protected function canView( $field ) {
                if ( $this->audience == self::FOR_THIS_USER ) {
-                       return LogEventsList::userCanBitfield( 
+                       return LogEventsList::userCanBitfield(
                                $this->entry->getDeleted(), $field, $this->context->getUser() );
                } else {
                        return !$this->entry->isDeleted( $field );
@@ -171,7 +171,7 @@ class LogFormatter {
                        if ( $actionComment == '' ) {
                                $actionComment = $comment;
                        } else {
-                               $actionComment .= wfMsgForContent( 'colon-separator' ) . $comment;
+                               $actionComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
                        }
                }
 
@@ -187,12 +187,10 @@ class LogFormatter {
        public function getIRCActionText() {
                $this->plaintext = true;
                $this->irctext = true;
-               $text = $this->getActionText();
 
                $entry = $this->entry;
                $parameters = $entry->getParameters();
                // @see LogPage::actionText()
-               $msgOpts = array( 'parsemag', 'escape', 'replaceafter', 'content' );
                // Text of title the action is aimed at.
                $target = $entry->getTarget()->getPrefixedText() ;
                $text = null;
@@ -201,11 +199,13 @@ class LogFormatter {
                                switch( $entry->getSubtype() ) {
                                        case 'move':
                                                $movesource =  $parameters['4::target'];
-                                               $text = wfMsgExt( '1movedto2', $msgOpts, $target, $movesource );
+                                               $text = wfMessage( '1movedto2' )
+                                                       ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
                                                break;
                                        case 'move_redir':
                                                $movesource =  $parameters['4::target'];
-                                               $text = wfMsgExt( '1movedto2_redir', $msgOpts, $target, $movesource );
+                                               $text = wfMessage( '1movedto2_redir' )
+                                                       ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
                                                break;
                                        case 'move-noredirect':
                                                break;
@@ -217,10 +217,12 @@ class LogFormatter {
                        case 'delete':
                                switch( $entry->getSubtype() ) {
                                        case 'delete':
-                                               $text = wfMsgExt( 'deletedarticle', $msgOpts, $target );
+                                               $text = wfMessage( 'deletedarticle' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        case 'restore':
-                                               $text = wfMsgExt( 'undeletedarticle', $msgOpts, $target );
+                                               $text = wfMessage( 'undeletedarticle' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        //case 'revision': // Revision deletion
                                        //case 'event': // Log deletion
@@ -234,8 +236,10 @@ class LogFormatter {
                                // Create a diff link to the patrolled revision
                                if ( $entry->getSubtype() === 'patrol' ) {
                                        $diffLink = htmlspecialchars(
-                                               wfMsgForContent( 'patrol-log-diff', $parameters['4::curid'] ) );
-                                       $text = wfMsgForContent( 'patrol-log-line', $diffLink, "[[$target]]", "" );
+                                               wfMessage( 'patrol-log-diff', $parameters['4::curid'] )
+                                                       ->inContentLanguage()->text() );
+                                       $text = wfMessage( 'patrol-log-line', $diffLink, "[[$target]]", "" )
+                                               ->inContentLanguage()->text();
                                } else {
                                        // broken??
                                }
@@ -244,14 +248,17 @@ class LogFormatter {
                        case 'protect':
                                switch( $entry->getSubtype() ) {
                                case 'protect':
-                                       $text = wfMsgExt( 'protectedarticle', $msgOpts, $target . ' ' . $parameters[0] );
-                                               break;
+                                       $text = wfMessage( 'protectedarticle' )
+                                               ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
+                                       break;
                                case 'unprotect':
-                                       $text = wfMsgExt( 'unprotectedarticle', $msgOpts, $target );
-                                               break;
+                                       $text = wfMessage( 'unprotectedarticle' )
+                                               ->rawParams( $target )->inContentLanguage()->escaped();
+                                       break;
                                case 'modify':
-                                       $text = wfMsgExt( 'modifiedarticleprotection', $msgOpts, $target . ' ' . $parameters[0] );
-                                               break;
+                                       $text = wfMessage( 'modifiedarticleprotection' )
+                                               ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
+                                       break;
                                }
                                break;
 
@@ -259,13 +266,16 @@ class LogFormatter {
                                switch( $entry->getSubtype() ) {
                                        case 'newusers':
                                        case 'create':
-                                               $text = wfMsgExt( 'newuserlog-create-entry', $msgOpts /* no params */ );
+                                               $text = wfMessage( 'newuserlog-create-entry' )
+                                                       ->inContentLanguage()->escaped();
                                                break;
                                        case 'create2':
-                                               $text = wfMsgExt( 'newuserlog-create2-entry', $msgOpts, $target );
+                                               $text = wfMessage( 'newuserlog-create2-entry' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        case 'autocreate':
-                                               $text = wfMsgExt( 'newuserlog-autocreate-entry', $msgOpts /* no params */ );
+                                               $text = wfMessage( 'newuserlog-autocreate-entry' )
+                                                       ->inContentLanguage()->escaped();
                                                break;
                                }
                                break;
@@ -273,14 +283,16 @@ class LogFormatter {
                        case 'upload':
                                switch( $entry->getSubtype() ) {
                                        case 'upload':
-                                               $text = wfMsgExt( 'uploadedimage', $msgOpts, $target );
+                                               $text = wfMessage( 'uploadedimage' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                        case 'overwrite':
-                                               $text = wfMsgExt( 'overwroteimage', $msgOpts, $target );
+                                               $text = wfMessage( 'overwroteimage' )
+                                                       ->rawParams( $target )->inContentLanguage()->escaped();
                                                break;
                                }
                                break;
-                       
+
 
                        // case 'suppress' --private log -- aaron  (sign your messages so we know who to blame in a few years :-D)
                        // default:
@@ -341,6 +353,15 @@ class LogFormatter {
                return "logentry-$type-$subtype";
        }
 
+       /**
+        * Returns extra links that comes after the action text, like "revert", etc.
+        *
+        * @return string
+        */
+       public function getActionLinks() {
+               return '';
+       }
+
        /**
         * Extracts the optional extra parameters for use in action messages.
         * The array indexes start from number 3.
@@ -496,9 +517,7 @@ class LogFormatter {
         * @return Message
         */
        protected function msg( $key ) {
-               return wfMessage( $key )
-                       ->inLanguage( $this->context->getLanguage() )
-                       ->title( $this->context->getTitle() );
+               return $this->context->msg( $key );
        }
 
        protected function makeUserLink( User $user ) {
@@ -511,11 +530,9 @@ class LogFormatter {
                        );
 
                        if ( $this->linkFlood ) {
-                               $element .= Linker::userToolLinks(
+                               $element .= Linker::userToolLinksRedContribs(
                                        $user->getId(),
                                        $user->getName(),
-                                       true, // Red if no edits
-                                       0, // Flags
                                        $user->getEditCount()
                                );
                        }
@@ -542,6 +559,41 @@ class LogFormatter {
  * @since 1.19
  */
 class LegacyLogFormatter extends LogFormatter {
+
+       /**
+        * Backward compatibility for extension changing the comment from
+        * the LogLine hook. This will be set by the first call on getComment(),
+        * then it might be modified by the hook when calling getActionLinks(),
+        * so that the modified value will be returned when calling getComment()
+        * a second time.
+        *
+        * @var string|null
+        */
+       private $comment = null;
+
+       /**
+        * Cache for the result of getActionLinks() so that it does not need to
+        * run multiple times depending on the order that getComment() and
+        * getActionLinks() are called.
+        *
+        * @var string|null
+        */
+       private $revert = null;
+
+       public function getComment() {
+               if ( $this->comment === null ) {
+                       $this->comment = parent::getComment();
+               }
+
+               // Make sure we execute the LogLine hook so that we immediately return
+               // the correct value.
+               if ( $this->revert === null ) {
+                       $this->getActionLinks();
+               }
+
+               return $this->comment;
+       }
+
        protected function getActionMessage() {
                $entry = $this->entry;
                $action = LogPage::actionText(
@@ -561,6 +613,97 @@ class LegacyLogFormatter extends LogFormatter {
                return $action;
        }
 
+       public function getActionLinks() {
+               if ( $this->revert !== null ) {
+                       return $this->revert;
+               }
+
+               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
+                       return $this->revert = '';
+               }
+
+               $title = $this->entry->getTarget();
+               $type = $this->entry->getType();
+               $subtype = $this->entry->getSubtype();
+
+               // Show unblock/change block link
+               if ( ( $type == 'block' || $type == 'suppress' ) && ( $subtype == 'block' || $subtype == 'reblock' ) ) {
+                       if ( !$this->context->getUser()->isAllowed( 'block' ) ) {
+                               return '';
+                       }
+
+                       $links = array(
+                               Linker::linkKnown(
+                                       SpecialPage::getTitleFor( 'Unblock', $title->getDBkey() ),
+                                       $this->msg( 'unblocklink' )->escaped()
+                               ),
+                               Linker::linkKnown(
+                                       SpecialPage::getTitleFor( 'Block', $title->getDBkey() ),
+                                       $this->msg( 'change-blocklink' )->escaped()
+                               )
+                       );
+                       return $this->msg( 'parentheses' )->rawParams(
+                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
+               // Show change protection link
+               } elseif ( $type == 'protect' && ( $subtype == 'protect' || $subtype == 'modify' || $subtype == 'unprotect' ) ) {
+                       $links = array(
+                               Linker::link( $title,
+                                       $this->msg( 'hist' )->escaped(),
+                                       array(),
+                                       array(
+                                               'action' => 'history',
+                                               'offset' => $this->entry->getTimestamp()
+                                       )
+                               )
+                       );
+                       if ( $this->context->getUser()->isAllowed( 'protect' ) ) {
+                               $links[] = Linker::linkKnown(
+                                       $title,
+                                       $this->msg( 'protect_change' )->escaped(),
+                                       array(),
+                                       array( 'action' => 'protect' )
+                               );
+                       }
+                       return $this->msg( 'parentheses' )->rawParams(
+                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
+               // Show unmerge link
+               } elseif( $type == 'merge' && $subtype == 'merge' ) {
+                       if ( !$this->context->getUser()->isAllowed( 'mergehistory' ) ) {
+                               return '';
+                       }
+
+                       $params = $this->extractParameters();
+                       $revert = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'MergeHistory' ),
+                               $this->msg( 'revertmerge' )->escaped(),
+                               array(),
+                               array(
+                                       'target' => $params[3],
+                                       'dest' => $title->getPrefixedDBkey(),
+                                       'mergepoint' => $params[4]
+                               )
+                       );
+                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+               }
+
+               // Do nothing. The implementation is handled by the hook modifiying the
+               // passed-by-ref parameters. This also changes the default value so that
+               // getComment() and getActionLinks() do not call them indefinitely.
+               $this->revert = '';
+
+               // This is to populate the $comment member of this instance so that it
+               // can be modified when calling the hook just below.
+               if ( $this->comment === null ) {
+                       $this->getComment();
+               }
+
+               $params = $this->entry->getParameters();
+
+               wfRunHooks( 'LogLine', array( $type, $subtype, $title, $params,
+                       &$this->comment, &$this->revert, $this->entry->getTimestamp() ) );
+
+               return $this->revert;
+       }
 }
 
 /**
@@ -590,6 +733,34 @@ class MoveLogFormatter extends LogFormatter {
                $params[3] = Message::rawParam( $newname );
                return $params;
        }
+
+       public function getActionLinks() {
+               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
+                       || $this->entry->getSubtype() !== 'move'
+                       || !$this->context->getUser()->isAllowed( 'move' ) )
+               {
+                       return '';
+               }
+
+               $params = $this->extractParameters();
+               $destTitle = Title::newFromText( $params[3] );
+               if ( !$destTitle ) {
+                       return '';
+               }
+
+               $revert = Linker::linkKnown(
+                       SpecialPage::getTitleFor( 'Movepage' ),
+                       $this->msg( 'revertmove' )->escaped(),
+                       array(),
+                       array(
+                               'wpOldTitle' => $destTitle->getPrefixedDBkey(),
+                               'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
+                               'wpReason'   => $this->msg( 'revertmove' )->inContentLanguage()->text(),
+                               'wpMovetalk' => 0
+                       )
+               );
+               return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+       }
 }
 
 /**
@@ -659,6 +830,107 @@ class DeleteLogFormatter extends LogFormatter {
                        return (int) $string;
                }
        }
+
+       public function getActionLinks() {
+               $user = $this->context->getUser();
+               if ( !$user->isAllowed( 'deletedhistory' ) || $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
+                       return '';
+               }
+
+               switch ( $this->entry->getSubtype() ) {
+               case 'delete': // Show undelete link
+                       if( $user->isAllowed( 'undelete' ) ) {
+                               $message = 'undeletelink';
+                       } else {
+                               $message = 'undeleteviewlink';
+                       }
+                       $revert = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Undelete' ),
+                               $this->msg( $message )->escaped(),
+                               array(),
+                               array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
+                        );
+                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+
+               case 'revision': // If an edit was hidden from a page give a review link to the history
+                       $params = $this->extractParameters();
+                       if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
+                               return '';
+                       }
+
+                       // Different revision types use different URL params...
+                       $key = $params[3];
+                       // This is a CSV of the IDs
+                       $ids = explode( ',', $params[4] );
+
+                       $links = array();
+
+                       // If there's only one item, we can show a diff link
+                       if ( count( $ids ) == 1 ) {
+                               // Live revision diffs...
+                               if ( $key == 'oldid' || $key == 'revision' ) {
+                                       $links[] = Linker::linkKnown(
+                                               $this->entry->getTarget(),
+                                               $this->msg( 'diff' )->escaped(),
+                                               array(),
+                                               array(
+                                                       'diff' => intval( $ids[0] ),
+                                                       'unhide' => 1
+                                               )
+                                       );
+                               // Deleted revision diffs...
+                               } elseif ( $key == 'artimestamp' || $key == 'archive' ) {
+                                       $links[] = Linker::linkKnown(
+                                               SpecialPage::getTitleFor( 'Undelete' ),
+                                               $this->msg( 'diff' )->escaped(),
+                                               array(),
+                                               array(
+                                                       'target'    => $this->entry->getTarget()->getPrefixedDBKey(),
+                                                       'diff'      => 'prev',
+                                                       'timestamp' => $ids[0]
+                                               )
+                                       );
+                               }
+                       }
+
+                       // View/modify link...
+                       $links[] = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Revisiondelete' ),
+                               $this->msg( 'revdel-restore' )->escaped(),
+                               array(),
+                               array(
+                                       'target' => $this->entry->getTarget()->getPrefixedText(),
+                                       'type' => $key,
+                                       'ids' => implode( ',', $ids ),
+                               )
+                       );
+
+                       return $this->msg( 'parentheses' )->rawParams(
+                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
+
+               case 'event': // Hidden log items, give review link
+                       $params = $this->extractParameters();
+                       if ( !isset( $params[3] ) ) {
+                               return '';
+                       }
+                       // This is a CSV of the IDs
+                       $query = $params[3];
+                       // Link to each hidden object ID, $params[1] is the url param
+                       $revert = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Revisiondelete' ),
+                               $this->msg( 'revdel-restore' )->escaped(),
+                               array(),
+                               array(
+                                       'target' => $this->entry->getTarget()->getPrefixedText(),
+                                       'type' => 'logging',
+                                       'ids' => $query
+                               )
+                       );
+                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+               default:
+                       return '';
+               }
+       }
 }
 
 /**
index 3891f34..d96a5ea 100644 (file)
@@ -133,7 +133,8 @@ class LogPage {
                        if ( $rcComment == '' ) {
                                $rcComment = $this->comment;
                        } else {
-                               $rcComment .= wfMsgForContent( 'colon-separator' ) . $this->comment;
+                               $rcComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() .
+                                       $this->comment;
                        }
                }
 
@@ -152,7 +153,8 @@ class LogPage {
                        if ( $rcComment == '' ) {
                                $rcComment = $this->comment;
                        } else {
-                               $rcComment .= wfMsgForContent( 'colon-separator' ) . $this->comment;
+                               $rcComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() .
+                                       $this->comment;
                        }
                }
 
@@ -197,7 +199,7 @@ class LogPage {
                global $wgLogNames;
 
                if( isset( $wgLogNames[$type] ) ) {
-                       return str_replace( '_', ' ', wfMsg( $wgLogNames[$type] ) );
+                       return str_replace( '_', ' ', wfMessage( $wgLogNames[$type] )->text() );
                } else {
                        // Bogus log types? Perhaps an extension was removed.
                        return $type;
@@ -214,7 +216,7 @@ class LogPage {
         */
        public static function logHeader( $type ) {
                global $wgLogHeaders;
-               return wfMsgExt( $wgLogHeaders[$type], array( 'parseinline' ) );
+               return wfMessage( $wgLogHeaders[$type] )->parse();
        }
 
        /**
@@ -247,17 +249,20 @@ class LogPage {
 
                if( isset( $wgLogActions[$key] ) ) {
                        if( is_null( $title ) ) {
-                               $rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'language' => $langObj ) );
+                               $rv = wfMessage( $wgLogActions[$key] )->inLanguage( $langObj )->escaped();
                        } else {
                                $titleLink = self::getTitleLink( $type, $langObjOrNull, $title, $params );
 
                                if( preg_match( '/^rights\/(rights|autopromote)/', $key ) ) {
-                                       $rightsnone = wfMsgExt( 'rightsnone', array( 'parsemag', 'language' => $langObj ) );
+                                       $rightsnone = wfMessage( 'rightsnone' )->inLanguage( $langObj )->text();
 
                                        if( $skin ) {
+                                               $username = $title->getText();
                                                foreach ( $params as &$param ) {
                                                        $groupArray = array_map( 'trim', explode( ',', $param ) );
-                                                       $groupArray = array_map( array( 'User', 'getGroupMember' ), $groupArray );
+                                                       foreach( $groupArray as &$group ) {
+                                                               $group = User::getGroupMember( $group, $username );
+                                                       }
                                                        $param = $wgLang->listToText( $groupArray );
                                                }
                                        }
@@ -272,7 +277,7 @@ class LogPage {
                                }
 
                                if( count( $params ) == 0 ) {
-                                       $rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'replaceafter', 'language' => $langObj ), $titleLink );
+                                       $rv = wfMessage( $wgLogActions[$key] )->rawParams( $titleLink )->inLanguage( $langObj )->escaped();
                                } else {
                                        $details = '';
                                        array_unshift( $params, $titleLink );
@@ -299,11 +304,11 @@ class LogPage {
 
                                                // Cascading flag...
                                                if( $params[2] ) {
-                                                       $details .= ' [' . wfMsgExt( 'protect-summary-cascade', array( 'parsemag', 'language' => $langObj ) ) . ']';
+                                                       $details .= ' [' . wfMessage( 'protect-summary-cascade' )->inLanguage( $langObj )->text() . ']';
                                                }
                                        }
 
-                                       $rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'replaceafter', 'language' => $langObj ), $params ) . $details;
+                                       $rv = wfMessage( $wgLogActions[$key] )->rawParams( $params )->inLanguage( $langObj )->escaped() . $details;
                                }
                        }
                } else {
@@ -416,8 +421,12 @@ class LogPage {
 
                                        # Use the language name for log titles, rather than Log/X
                                        if( $name == 'Log' ) {
-                                               $titleLink = Linker::link( $title, LogPage::logName( $par ) );
-                                               $titleLink = wfMessage( 'parentheses' )->rawParams( $titleLink )->escaped();
+                                               $logPage = new LogPage( $par );
+                                               $titleLink = Linker::link( $title, $logPage->getName()->escaped() );
+                                               $titleLink = wfMessage( 'parentheses' )
+                                                       ->inLanguage( $lang )
+                                                       ->rawParams( $titleLink )
+                                                       ->escaped();
                                        } else {
                                                $titleLink = Linker::link( $title );
                                        }
@@ -435,7 +444,7 @@ class LogPage {
         * @param $action String: one of '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'move_redir'
         * @param $target Title object
         * @param $comment String: description associated
-        * @param $params Array: parameters passed later to wfMsg.* functions
+        * @param $params Array: parameters passed later to wfMessage function
         * @param $doer User object: the user doing the action
         *
         * @return int log_id of the inserted log entry
@@ -551,7 +560,8 @@ class LogPage {
                        for( $i = 0; $i < count( $flags ); $i++ ) {
                                $flags[$i] = self::formatBlockFlag( $flags[$i], $lang );
                        }
-                       return wfMessage( 'parentheses' )->rawParams( $lang->commaList( $flags ) )->escaped();
+                       return wfMessage( 'parentheses' )->inLanguage( $lang )
+                               ->rawParams( $lang->commaList( $flags ) )->escaped();
                } else {
                        return '';
                }
index 339688d..911fffc 100644 (file)
@@ -33,7 +33,7 @@ class PatrolLog {
         *
         * @param $rc Mixed: change identifier or RecentChange object
         * @param $auto Boolean: was this patrol event automatic?
-        * @param $performer User: user performing the action or null to use $wgUser
+        * @param $user User: user performing the action or null to use $wgUser
         *
         * @return bool
         */
@@ -45,24 +45,20 @@ class PatrolLog {
                        }
                }
 
-               $title = Title::makeTitleSafe( $rc->getAttribute( 'rc_namespace' ), $rc->getAttribute( 'rc_title' ) );
-               if( $title ) {
-                       if ( !$user ) {
-                               global $wgUser;
-                               $user = $wgUser;
-                       }
+               if ( !$user ) {
+                       global $wgUser;
+                       $user = $wgUser;
+               }
 
-                       $entry = new ManualLogEntry( 'patrol', 'patrol' );
-                       $entry->setTarget( $title );
-                       $entry->setParameters( self::buildParams( $rc, $auto ) );
-                       $entry->setPerformer( $user );
-                       $logid = $entry->insert();
-                       if ( !$auto ) {
-                               $entry->publish( $logid, 'udp' );
-                       }
-                       return true;
+               $entry = new ManualLogEntry( 'patrol', 'patrol' );
+               $entry->setTarget( $rc->getTitle() );
+               $entry->setParameters( self::buildParams( $rc, $auto ) );
+               $entry->setPerformer( $user );
+               $logid = $entry->insert();
+               if ( !$auto ) {
+                       $entry->publish( $logid, 'udp' );
                }
-               return false;
+               return true;
        }
 
        /**
index 8cf30ab..8a4b943 100644 (file)
@@ -261,7 +261,7 @@ class BitmapHandler extends ImageHandler {
         * @param $params array Array with scaler params
         * @return ThumbnailImage
         *
-        * @fixme no rotation support
+        * @todo fixme: no rotation support
         */
        protected function getClientScalingThumbnailImage( $image, $params ) {
                return new ThumbnailImage( $image, $image->getURL(),
@@ -274,7 +274,7 @@ class BitmapHandler extends ImageHandler {
         * @param $image File File associated with this thumbnail
         * @param $params array Array with scaler params
         *
-        * @return MediaTransformError Error object if error occured, false (=no error) otherwise
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
         */
        protected function transformImageMagick( $image, $params ) {
                # use ImageMagick
@@ -373,7 +373,7 @@ class BitmapHandler extends ImageHandler {
         * @param $image File File associated with this thumbnail
         * @param $params array Array with scaler params
         *
-        * @return MediaTransformError Error object if error occured, false (=no error) otherwise
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
         */
        protected function transformImageMagickExt( $image, $params ) {
                global $wgSharpenReductionThreshold, $wgSharpenParameter, $wgMaxAnimatedGifArea;
@@ -450,7 +450,7 @@ class BitmapHandler extends ImageHandler {
         * @param $image File File associated with this thumbnail
         * @param $params array Array with scaler params
         *
-        * @return MediaTransformError Error object if error occured, false (=no error) otherwise
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
         */
        protected function transformCustom( $image, $params ) {
                # Use a custom convert command
@@ -477,7 +477,7 @@ class BitmapHandler extends ImageHandler {
        }
 
        /**
-        * Log an error that occured in an external process
+        * Log an error that occurred in an external process
         *
         * @param $retval int
         * @param $err int
@@ -506,7 +506,7 @@ class BitmapHandler extends ImageHandler {
         * @param $image File File associated with this thumbnail
         * @param $params array Array with scaler params
         *
-        * @return MediaTransformError Error object if error occured, false (=no error) otherwise
+        * @return MediaTransformError Error object if error occurred, false (=no error) otherwise
         */
        protected function transformGd( $image, $params ) {
                # Use PHP's builtin GD library functions.
@@ -524,7 +524,7 @@ class BitmapHandler extends ImageHandler {
                if ( !isset( $typemap[$params['mimeType']] ) ) {
                        $err = 'Image type not supported';
                        wfDebug( "$err\n" );
-                       $errMsg = wfMsg( 'thumbnail_image-type' );
+                       $errMsg = wfMessage( 'thumbnail_image-type' )->text();
                        return $this->getMediaTransformError( $params, $errMsg );
                }
                list( $loader, $colorStyle, $saveType ) = $typemap[$params['mimeType']];
@@ -532,14 +532,14 @@ class BitmapHandler extends ImageHandler {
                if ( !function_exists( $loader ) ) {
                        $err = "Incomplete GD library configuration: missing function $loader";
                        wfDebug( "$err\n" );
-                       $errMsg = wfMsg( 'thumbnail_gd-library', $loader );
+                       $errMsg = wfMessage( 'thumbnail_gd-library', $loader )->text();
                        return $this->getMediaTransformError( $params, $errMsg );
                }
 
                if ( !file_exists( $params['srcPath'] ) ) {
                        $err = "File seems to be missing: {$params['srcPath']}";
                        wfDebug( "$err\n" );
-                       $errMsg = wfMsg( 'thumbnail_image-missing', $params['srcPath'] );
+                       $errMsg = wfMessage( 'thumbnail_image-missing', $params['srcPath'] )->text();
                        return $this->getMediaTransformError( $params, $errMsg );
                }
 
index ed38bd1..ea4888a 100644 (file)
@@ -138,7 +138,7 @@ class DjVuHandler extends ImageHandler {
                        $width = isset( $params['width'] ) ? $params['width'] : 0;
                        $height = isset( $params['height'] ) ? $params['height'] : 0;
                        return new MediaTransformError( 'thumbnail_error', $width, $height,
-                               wfMsg( 'djvu_no_xml' ) );
+                               wfMessage( 'djvu_no_xml' )->text() );
                }
 
                if ( !$this->normaliseParams( $image, $params ) ) {
@@ -146,10 +146,14 @@ class DjVuHandler extends ImageHandler {
                }
                $width = $params['width'];
                $height = $params['height'];
-               $srcPath = $image->getLocalRefPath();
                $page = $params['page'];
                if ( $page > $this->pageCount( $image ) ) {
-                       return new MediaTransformError( 'thumbnail_error', $width, $height, wfMsg( 'djvu_page_error' ) );
+                       return new MediaTransformError(
+                               'thumbnail_error',
+                               $width,
+                               $height,
+                               wfMessage( 'djvu_page_error' )->text()
+                       );
                }
 
                if ( $flags & self::TRANSFORM_LATER ) {
@@ -157,9 +161,15 @@ class DjVuHandler extends ImageHandler {
                }
 
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
-                       return new MediaTransformError( 'thumbnail_error', $width, $height, wfMsg( 'thumbnail_dest_directory' ) );
+                       return new MediaTransformError(
+                               'thumbnail_error',
+                               $width,
+                               $height,
+                               wfMessage( 'thumbnail_dest_directory' )->text()
+                       );
                }
 
+               $srcPath = $image->getLocalRefPath();
                # Use a subshell (brackets) to aggregate stderr from both pipeline commands
                # before redirecting it to the overall stdout. This works in both Linux and Windows XP.
                $cmd = '(' . wfEscapeShellArg( $wgDjvuRenderer ) . " -format=ppm -page={$page}" .
index f5dc020..784a601 100644 (file)
@@ -370,6 +370,12 @@ class Exif {
                $this->exifGPStoNumber( 'GPSDestLongitude' );
 
                if ( isset( $this->mFilteredExifData['GPSAltitude'] ) && isset( $this->mFilteredExifData['GPSAltitudeRef'] ) ) {
+
+                       // We know altitude data is a <num>/<denom> from the validation functions ran earlier.
+                       // But multiplying such a string by -1 doesn't work well, so convert.
+                       list( $num, $denom ) = explode( '/', $this->mFilteredExifData['GPSAltitude'] );
+                       $this->mFilteredExifData['GPSAltitude'] = $num / $denom;
+
                        if ( $this->mFilteredExifData['GPSAltitudeRef'] === "\1" ) {
                                $this->mFilteredExifData['GPSAltitude'] *= - 1;
                        }
index 65575ec..34a1f51 100644 (file)
@@ -199,7 +199,8 @@ class ExifBitmapHandler extends BitmapHandler {
         *
         * @param string $data
         * @return int 0, 90, 180 or 270
-        * @fixme orientation can include flipping as well; see if this is an issue!
+        * @todo FIXME orientation can include flipping as well; see if this is an
+        * issue!
         */
        protected function getRotationForExif( $data ) {
                if ( !$data ) {
index c22ea08..35305d1 100644 (file)
@@ -233,7 +233,7 @@ class FormatMetadata {
                                case 'dc-date':
                                case 'DateTimeMetadata':
                                        if ( $val == '0000:00:00 00:00:00' || $val == '    :  :     :  :  ' ) {
-                                               $val = wfMsg( 'exif-unknowndate' );
+                                               $val = wfMessage( 'exif-unknowndate' )->text();
                                        } elseif ( preg_match( '/^(?:\d{4}):(?:\d\d):(?:\d\d) (?:\d\d):(?:\d\d):(?:\d\d)$/D', $val ) ) {
                                                // Full date.
                                                $time = wfTimestamp( TS_MW, $val );
@@ -309,7 +309,7 @@ class FormatMetadata {
                                                'redeye'   => ( $val & bindec( '01000000' ) ) >> 6,
 //                                             'reserved' => ($val & bindec( '10000000' )) >> 7,
                                        );
-       
+                                       $flashMsgs = array();
                                        # We do not need to handle unknown values since all are used.
                                        foreach ( $flashDecode as $subTag => $subValue ) {
                                                # We do not need any message for zeroed values.
@@ -591,7 +591,7 @@ class FormatMetadata {
                                case 'Software':
                                        if ( is_array( $val ) ) {
                                                //if its a software, version array.
-                                               $val = wfMsg( 'exif-software-version-value', $val[0], $val[1] );
+                                               $val = wfMessage( 'exif-software-version-value', $val[0], $val[1] )->text();
                                        } else {
                                                $val = self::msg( $tag, '', $val );
                                        }
@@ -599,8 +599,8 @@ class FormatMetadata {
 
                                case 'ExposureTime':
                                        // Show the pretty fraction as well as decimal version
-                                       $val = wfMsg( 'exif-exposuretime-format',
-                                               self::formatFraction( $val ), self::formatNum( $val ) );
+                                       $val = wfMessage( 'exif-exposuretime-format',
+                                               self::formatFraction( $val ), self::formatNum( $val ) )->text();
                                        break;
                                case 'ISOSpeedRatings':
                                        // If its = 65535 that means its at the
@@ -613,13 +613,13 @@ class FormatMetadata {
                                        }
                                        break;
                                case 'FNumber':
-                                       $val = wfMsg( 'exif-fnumber-format',
-                                               self::formatNum( $val ) );
+                                       $val = wfMessage( 'exif-fnumber-format',
+                                               self::formatNum( $val ) )->text();
                                        break;
 
                                case 'FocalLength': case 'FocalLengthIn35mmFilm':
-                                       $val = wfMsg( 'exif-focallength-format',
-                                               self::formatNum( $val ) );
+                                       $val = wfMessage( 'exif-focallength-format',
+                                               self::formatNum( $val ) )->text();
                                        break;
 
                                case 'MaxApertureValue':
@@ -633,14 +633,14 @@ class FormatMetadata {
                                        if ( is_numeric( $val ) ) {
                                                $fNumber = pow( 2, $val / 2 );
                                                if ( $fNumber !== false ) {
-                                                       $val = wfMsg( 'exif-maxaperturevalue-value',
+                                                       $val = wfMessage( 'exif-maxaperturevalue-value',
                                                                self::formatNum( $val ),
                                                                self::formatNum( $fNumber, 2 )
-                                                       );
+                                                       )->text();
                                                }
                                        }
                                        break;
-                                       
+
                                case 'iimCategory':
                                        switch( strtolower( $val ) ) {
                                                // See pg 29 of IPTC photo
@@ -696,7 +696,7 @@ class FormatMetadata {
                                case 'PixelYDimension':
                                case 'ImageWidth':
                                case 'ImageLength':
-                                       $val = self::formatNum( $val ) . ' ' . wfMsg( 'unit-pixel' );
+                                       $val = self::formatNum( $val ) . ' ' . wfMessage( 'unit-pixel' )->text();
                                        break;
 
                                // Do not transform fields with pure text.
@@ -802,7 +802,7 @@ class FormatMetadata {
                                        break;
 
                                case 'LanguageCode':
-                                       $lang = Language::fetchLanguageName( strtolower( $val ), $wgLang );
+                                       $lang = Language::fetchLanguageName( strtolower( $val ), $wgLang->getCode() );
                                        if ($lang) {
                                                $val = htmlspecialchars( $lang );
                                        } else {
@@ -827,14 +827,14 @@ class FormatMetadata {
        * This turns an array of (for example) authors into a bulleted list.
        *
        * This is public on the basis it might be useful outside of this class.
-       * 
+       *
        * @param $vals Array array of values
        * @param $type String Type of array (either lang, ul, ol).
        * lang = language assoc array with keys being the lang code
        * ul = unordered list, ol = ordered list
        * type can also come from the '_type' member of $vals.
        * @param $noHtml Boolean If to avoid returning anything resembling
-       * html. (Ugly hack for backwards compatibility with old mediawiki). 
+       * html. (Ugly hack for backwards compatibility with old mediawiki).
        * @return String single value (in wiki-syntax).
        */
        public static function flattenArray( $vals, $type = 'ul', $noHtml = false ) {
@@ -876,7 +876,7 @@ class FormatMetadata {
                                // If default is set, save it for later,
                                // as we don't know if it's equal to
                                // one of the lang codes. (In xmp
-                               // you specify the language for a 
+                               // you specify the language for a
                                // default property by having both
                                // a default prop, and one in the language
                                // that are identical)
@@ -939,8 +939,9 @@ class FormatMetadata {
         * @param $lang String lang code of item or false
         * @param $default Boolean if it is default value.
         * @param $noHtml Boolean If to avoid html (for back-compat)
-        * @return language item (Note: despite how this looks,
-        *      this is treated as wikitext not html).
+        * @throws MWException
+        * @return string language item (Note: despite how this looks,
+        * this is treated as wikitext not html).
         */
        private static function langItem( $value, $lang, $default = false, $noHtml = false ) {
                if ( $lang === false && $default === false) {
@@ -957,12 +958,12 @@ class FormatMetadata {
 
                if ( $lang === false ) {
                        if ( $noHtml ) {
-                               return wfMsg( 'metadata-langitem-default',
-                                       $wrappedValue ) . "\n\n";
+                               return wfMessage( 'metadata-langitem-default',
+                                       $wrappedValue )->text() . "\n\n";
                        } /* else */
                        return '<li class="mw-metadata-lang-default">'
-                               . wfMsg( 'metadata-langitem-default',
-                                       $wrappedValue )
+                               . wfMessage( 'metadata-langitem-default',
+                                       $wrappedValue )->text()
                                . "</li>\n";
                }
 
@@ -980,8 +981,8 @@ class FormatMetadata {
                // else we have a language specified
 
                if ( $noHtml ) {
-                       return '*' . wfMsg( 'metadata-langitem',
-                               $wrappedValue, $langName, $lang );
+                       return '*' . wfMessage( 'metadata-langitem',
+                               $wrappedValue, $langName, $lang )->text();
                } /* else: */
 
                $item = '<li class="mw-metadata-lang-code-'
@@ -990,8 +991,8 @@ class FormatMetadata {
                        $item .= ' mw-metadata-lang-default';
                }
                $item .= '" lang="' . $lang . '">';
-               $item .= wfMsg( 'metadata-langitem',
-                       $wrappedValue, $langName, $lang );
+               $item .= wfMessage( 'metadata-langitem',
+                       $wrappedValue, $langName, $lang )->text();
                $item .= "</li>\n";
                return $item;
        }
@@ -1005,24 +1006,22 @@ class FormatMetadata {
         * @param $val String: the value of the tag
         * @param $arg String: an argument to pass ($1)
         * @param $arg2 String: a 2nd argument to pass ($2)
-        * @return string A wfMsg of "exif-$tag-$val" in lower case
+        * @return string A wfMessage of "exif-$tag-$val" in lower case
         */
        static function msg( $tag, $val, $arg = null, $arg2 = null ) {
                global $wgContLang;
 
                if ($val === '')
                        $val = 'value';
-               return wfMsg( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 );
+               return wfMessage( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text();
        }
 
        /**
         * Format a number, convert numbers from fractions into floating point
         * numbers, joins arrays of numbers with commas.
         *
-        * @private
-        *
         * @param $num Mixed: the value to format
-        * @param $round float|int digits to round to or false.
+        * @param $round float|int|bool digits to round to or false.
         * @return mixed A floating point number or whatever we were fed
         */
        static function formatNum( $num, $round = false ) {
@@ -1105,7 +1104,7 @@ class FormatMetadata {
 
        /**
         * Fetch the human readable version of a news code.
-        * A news code is an 8 digit code. The first two 
+        * A news code is an 8 digit code. The first two
         * digits are a general classification, so we just
         * translate that.
         *
@@ -1113,7 +1112,7 @@ class FormatMetadata {
         * a string, not an int.
         *
         * @param $val String: The 8 digit news code.
-        * @return srting The human readable form
+        * @return string The human readable form
         */
        static private function convertNewsCode( $val ) {
                if ( !preg_match( '/^\d{8}$/D', $val ) ) {
@@ -1185,7 +1184,7 @@ class FormatMetadata {
         * Format a coordinate value, convert numbers from floating point
         * into degree minute second representation.
         *
-        * @param $coord Array: degrees, minutes and seconds
+        * @param $coord int degrees, minutes and seconds
         * @param $type String: latitude or longitude (for if its a NWS or E)
         * @return mixed A floating point number or whatever we were fed
         */
@@ -1195,17 +1194,14 @@ class FormatMetadata {
                        $nCoord = -$coord;
                        if ( $type === 'latitude' ) {
                                $ref = 'S';
-                       }
-                       elseif ( $type === 'longitude' ) {
+                       } elseif ( $type === 'longitude' ) {
                                $ref = 'W';
                        }
-               }
-               else {
+               } else {
                        $nCoord = $coord;
                        if ( $type === 'latitude' ) {
                                $ref = 'N';
-                       }
-                       elseif ( $type === 'longitude' ) {
+                       } elseif ( $type === 'longitude' ) {
                                $ref = 'E';
                        }
                }
@@ -1218,7 +1214,7 @@ class FormatMetadata {
                $min = self::formatNum( $min );
                $sec = self::formatNum( $sec );
 
-               return wfMsg( 'exif-coordinate-format', $deg, $min, $sec, $ref, $coord );
+               return wfMessage( 'exif-coordinate-format', $deg, $min, $sec, $ref, $coord )->text();
        }
 
        /**
@@ -1276,7 +1272,7 @@ class FormatMetadata {
                                // Todo: This can potentially be multi-line.
                                // Need to check how that works in XMP.
                                $street = '<span class="extended-address">'
-                                       . htmlspecialchars( 
+                                       . htmlspecialchars(
                                                $vals['CiAdrExtadr'] )
                                        . '</span>';
                        }
@@ -1323,7 +1319,7 @@ class FormatMetadata {
                        }
                        if ( isset( $vals['CiAdrPcode'] ) ) {
                                $postal = '<span class="postal-code">'
-                                       . htmlspecialchars( 
+                                       . htmlspecialchars(
                                                $vals['CiAdrPcode'] )
                                        . '</span>';
                        }
@@ -1339,9 +1335,9 @@ class FormatMetadata {
                                        . htmlspecialchars( $vals['CiUrlWork'] )
                                        . '</span>';
                        }
-                       return wfMsg( 'exif-contact-value', $email, $url,
+                       return wfMessage( 'exif-contact-value', $email, $url,
                                $street, $city, $region, $postal, $country,
-                               $tel );
+                               $tel )->text();
                }
        }
 }
@@ -1354,12 +1350,19 @@ class FormatMetadata {
 **/
 class FormatExif {
        var $meta;
-       function FormatExif ( $meta ) {
+
+       /**
+        * @param $meta array
+        */
+       function FormatExif( $meta ) {
                wfDeprecated(__METHOD__);
                $this->meta = $meta;
        }
 
-       function getFormattedData ( ) {
+       /**
+        * @return array
+        */
+       function getFormattedData() {
                return FormatMetadata::getFormattedData( $this->meta );
        }
 }
index 2ec523d..84b9b8c 100644 (file)
@@ -93,6 +93,17 @@ class GIFHandler extends BitmapHandler {
                return false;
        }
 
+       /**
+        * We cannot animate thumbnails that are bigger than a particular size
+        * @param File $file
+        * @return bool
+        */
+       function canAnimateThumbnail( $file ) {
+               global $wgMaxAnimatedGifArea;
+               $answer = $this->getImageArea( $file ) <= $wgMaxAnimatedGifArea;
+               return $answer;
+       }
+
        function getMetadataType( $image ) {
                return 'parsed-gif';
        }
@@ -142,11 +153,11 @@ class GIFHandler extends BitmapHandler {
                $info[] = $original;
                
                if ( $metadata['looped'] ) {
-                       $info[] = wfMsgExt( 'file-info-gif-looped', 'parseinline' );
+                       $info[] = wfMessage( 'file-info-gif-looped' )->parse();
                }
                
                if ( $metadata['frameCount'] > 1 ) {
-                       $info[] = wfMsgExt( 'file-info-gif-frames', 'parseinline', $metadata['frameCount'] );
+                       $info[] = wfMessage( 'file-info-gif-frames' )->numParams( $metadata['frameCount'] )->parse();
                }
                
                if ( $metadata['duration'] ) {
diff --git a/includes/media/Generic.php b/includes/media/Generic.php
deleted file mode 100644 (file)
index b41ac32..0000000
+++ /dev/null
@@ -1,778 +0,0 @@
-<?php
-/**
- * Media-handling base classes and generic functionality.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Media
- */
-
-/**
- * Base media handler class
- *
- * @ingroup Media
- */
-abstract class MediaHandler {
-       const TRANSFORM_LATER = 1;
-       const METADATA_GOOD = true;
-       const METADATA_BAD = false;
-       const METADATA_COMPATIBLE = 2; // for old but backwards compatible.
-       /**
-        * Instance cache
-        */
-       static $handlers = array();
-
-       /**
-        * Get a MediaHandler for a given MIME type from the instance cache
-        *
-        * @param $type string
-        *
-        * @return MediaHandler
-        */
-       static function getHandler( $type ) {
-               global $wgMediaHandlers;
-               if ( !isset( $wgMediaHandlers[$type] ) ) {
-                       wfDebug( __METHOD__ . ": no handler found for $type.\n");
-                       return false;
-               }
-               $class = $wgMediaHandlers[$type];
-               if ( !isset( self::$handlers[$class] ) ) {
-                       self::$handlers[$class] = new $class;
-                       if ( !self::$handlers[$class]->isEnabled() ) {
-                               self::$handlers[$class] = false;
-                       }
-               }
-               return self::$handlers[$class];
-       }
-
-       /**
-        * Get an associative array mapping magic word IDs to parameter names.
-        * Will be used by the parser to identify parameters.
-        */
-       abstract function getParamMap();
-
-       /**
-        * Validate a thumbnail parameter at parse time.
-        * Return true to accept the parameter, and false to reject it.
-        * If you return false, the parser will do something quiet and forgiving.
-        *
-        * @param $name
-        * @param $value
-        */
-       abstract function validateParam( $name, $value );
-
-       /**
-        * Merge a parameter array into a string appropriate for inclusion in filenames
-        *
-        * @param $params array
-        */
-       abstract function makeParamString( $params );
-
-       /**
-        * Parse a param string made with makeParamString back into an array
-        *
-        * @param $str string
-        */
-       abstract function parseParamString( $str );
-
-       /**
-        * Changes the parameter array as necessary, ready for transformation.
-        * Should be idempotent.
-        * Returns false if the parameters are unacceptable and the transform should fail
-        * @param $image
-        * @param $params
-        */
-       abstract function normaliseParams( $image, &$params );
-
-       /**
-        * Get an image size array like that returned by getimagesize(), or false if it
-        * can't be determined.
-        *
-        * @param $image File: the image object, or false if there isn't one
-        * @param $path String: the filename
-        * @return Array Follow the format of PHP getimagesize() internal function. See http://www.php.net/getimagesize
-        */
-       abstract function getImageSize( $image, $path );
-
-       /**
-        * Get handler-specific metadata which will be saved in the img_metadata field.
-        *
-        * @param $image File: the image object, or false if there isn't one.
-        *   Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
-        * @param $path String: the filename
-        * @return String
-        */
-       function getMetadata( $image, $path ) { return ''; }
-
-       /**
-       * Get metadata version.
-       *
-       * This is not used for validating metadata, this is used for the api when returning
-       * metadata, since api content formats should stay the same over time, and so things
-       * using ForiegnApiRepo can keep backwards compatibility
-       *
-       * All core media handlers share a common version number, and extensions can
-       * use the GetMetadataVersion hook to append to the array (they should append a unique
-       * string so not to get confusing). If there was a media handler named 'foo' with metadata
-       * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
-       * version is 2, the end version string would look like '2;foo=3'.
-       *
-       * @return string version string
-       */
-       static function getMetadataVersion () {
-               $version = Array( '2' ); // core metadata version
-               wfRunHooks('GetMetadataVersion', Array(&$version));
-               return implode( ';', $version);
-        }
-
-       /**
-       * Convert metadata version.
-       *
-       * By default just returns $metadata, but can be used to allow
-       * media handlers to convert between metadata versions.
-       *
-       * @param $metadata Mixed String or Array metadata array (serialized if string)
-       * @param $version Integer target version
-       * @return Array serialized metadata in specified version, or $metadata on fail.
-       */
-       function convertMetadataVersion( $metadata, $version = 1 ) {
-               if ( !is_array( $metadata ) ) {
-
-                       //unserialize to keep return parameter consistent.
-                       wfSuppressWarnings();
-                       $ret = unserialize( $metadata );
-                       wfRestoreWarnings();
-                       return $ret;
-               }
-               return $metadata;
-       }
-
-       /**
-        * Get a string describing the type of metadata, for display purposes.
-        *
-        * @return string
-        */
-       function getMetadataType( $image ) { return false; }
-
-       /**
-        * Check if the metadata string is valid for this handler.
-        * If it returns MediaHandler::METADATA_BAD (or false), Image
-        * will reload the metadata from the file and update the database.
-        * MediaHandler::METADATA_GOOD for if the metadata is a-ok,
-        * MediaHanlder::METADATA_COMPATIBLE if metadata is old but backwards
-        * compatible (which may or may not trigger a metadata reload).
-        * @return bool
-        */
-       function isMetadataValid( $image, $metadata ) {
-               return self::METADATA_GOOD;
-       }
-
-
-       /**
-        * Get a MediaTransformOutput object representing an alternate of the transformed
-        * output which will call an intermediary thumbnail assist script.
-        *
-        * Used when the repository has a thumbnailScriptUrl option configured.
-        *
-        * Return false to fall back to the regular getTransform().
-        * @return bool
-        */
-       function getScriptedTransform( $image, $script, $params ) {
-               return false;
-       }
-
-       /**
-        * Get a MediaTransformOutput object representing the transformed output. Does not
-        * actually do the transform.
-        *
-        * @param $image File: the image object
-        * @param $dstPath String: filesystem destination path
-        * @param $dstUrl String: Destination URL to use in output HTML
-        * @param $params Array: Arbitrary set of parameters validated by $this->validateParam()
-        * @return MediaTransformOutput
-        */
-       final function getTransform( $image, $dstPath, $dstUrl, $params ) {
-               return $this->doTransform( $image, $dstPath, $dstUrl, $params, self::TRANSFORM_LATER );
-       }
-
-       /**
-        * Get a MediaTransformOutput object representing the transformed output. Does the
-        * transform unless $flags contains self::TRANSFORM_LATER.
-        *
-        * @param $image File: the image object
-        * @param $dstPath String: filesystem destination path
-        * @param $dstUrl String: destination URL to use in output HTML
-        * @param $params Array: arbitrary set of parameters validated by $this->validateParam()
-        * @param $flags Integer: a bitfield, may contain self::TRANSFORM_LATER
-        *
-        * @return MediaTransformOutput
-        */
-       abstract function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 );
-
-       /**
-        * Get the thumbnail extension and MIME type for a given source MIME type
-        * @return array thumbnail extension and MIME type
-        */
-       function getThumbType( $ext, $mime, $params = null ) {
-               $magic = MimeMagic::singleton();
-               if ( !$ext || $magic->isMatchingExtension( $ext, $mime ) === false ) {
-                       // The extension is not valid for this mime type and we do
-                       // recognize the mime type
-                       $extensions = $magic->getExtensionsForType( $mime );
-                       if ( $extensions ) {
-                               return array( strtok( $extensions, ' ' ), $mime );
-                       }
-               }
-
-               // The extension is correct (true) or the mime type is unknown to
-               // MediaWiki (null)
-               return array( $ext, $mime );
-       }
-
-       /**
-        * True if the handled types can be transformed
-        * @return bool
-        */
-       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; }
-       /**
-        * True if the type has multi-page capabilities
-        * @return bool
-        */
-       function isMultiPage( $file ) { return false; }
-       /**
-        * Page count for a multi-page document, false if unsupported or unknown
-        * @return bool
-        */
-       function pageCount( $file ) { return false; }
-       /**
-        * The material is vectorized and thus scaling is lossless
-        * @return bool
-        */
-       function isVectorized( $file ) { return false; }
-       /**
-        * False if the handler is disabled for all files
-        * @return bool
-        */
-       function isEnabled() { return true; }
-
-       /**
-        * Get an associative array of page dimensions
-        * Currently "width" and "height" are understood, but this might be
-        * expanded in the future.
-        * Returns false if unknown or if the document is not multi-page.
-        *
-        * @param $image File
-        * @return array
-        */
-       function getPageDimensions( $image, $page ) {
-               $gis = $this->getImageSize( $image, $image->getLocalRefPath() );
-               return array(
-                       'width' => $gis[0],
-                       'height' => $gis[1]
-               );
-       }
-
-       /**
-        * Generic getter for text layer.
-        * Currently overloaded by PDF and DjVu handlers
-        * @return bool
-        */
-       function getPageText( $image, $page ) {
-               return false;
-       }
-
-       /**
-        * Get an array structure that looks like this:
-        *
-        * array(
-        *    'visible' => array(
-        *       'Human-readable name' => 'Human readable value',
-        *       ...
-        *    ),
-        *    'collapsed' => array(
-        *       'Human-readable name' => 'Human readable value',
-        *       ...
-        *    )
-        * )
-        * The UI will format this into a table where the visible fields are always
-        * visible, and the collapsed fields are optionally visible.
-        *
-        * The function should return false if there is no metadata to display.
-        */
-
-       /**
-        * @todo FIXME: I don't really like this interface, it's not very flexible
-        * I think the media handler should generate HTML instead. It can do
-        * all the formatting according to some standard. That makes it possible
-        * to do things like visual indication of grouped and chained streams
-        * in ogg container files.
-        * @return bool
-        */
-       function formatMetadata( $image ) {
-               return false;
-       }
-
-       /** sorts the visible/invisible field.
-        * Split off from ImageHandler::formatMetadata, as used by more than
-        * one type of handler.
-        *
-        * This is used by the media handlers that use the FormatMetadata class
-        *
-        * @param $metadataArray Array metadata array
-        * @return array for use displaying metadata.
-        */
-       function formatMetadataHelper( $metadataArray ) {
-                $result = array(
-                       'visible' => array(),
-                       'collapsed' => array()
-               );
-
-               $formatted = FormatMetadata::getFormattedData( $metadataArray );
-               // Sort fields into visible and collapsed
-               $visibleFields = $this->visibleMetadataFields();
-               foreach ( $formatted as $name => $value ) {
-                       $tag = strtolower( $name );
-                       self::addMeta( $result,
-                               in_array( $tag, $visibleFields ) ? 'visible' : 'collapsed',
-                               'exif',
-                               $tag,
-                               $value
-                       );
-               }
-               return $result;
-       }
-
-       /**
-        * Get a list of metadata items which should be displayed when
-        * the metadata table is collapsed.
-        *
-        * @return array of strings
-        * @access protected
-        */
-       function visibleMetadataFields() {
-               $fields = array();
-               $lines = explode( "\n", wfMsgForContent( 'metadata-fields' ) );
-               foreach( $lines as $line ) {
-                       $matches = array();
-                       if( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
-                               $fields[] = $matches[1];
-                       }
-               }
-               $fields = array_map( 'strtolower', $fields );
-               return $fields;
-       }
-
-
-       /**
-        * This is used to generate an array element for each metadata value
-        * That array is then used to generate the table of metadata values
-        * on the image page
-        *
-        * @param &$array Array An array containing elements for each type of visibility
-        * and each of those elements being an array of metadata items. This function adds
-        * a value to that array.
-        * @param $visibility string ('visible' or 'collapsed') if this value is hidden
-        * by default.
-        * @param $type String type of metadata tag (currently always 'exif')
-        * @param $id String the name of the metadata tag (like 'artist' for example).
-        * its name in the table displayed is the message "$type-$id" (Ex exif-artist ).
-        * @param $value String thingy goes into a wikitext table; it used to be escaped but
-        * that was incompatible with previous practise of customized display
-        * with wikitext formatting via messages such as 'exif-model-value'.
-        * So the escaping is taken back out, but generally this seems a confusing
-        * interface.
-        * @param $param String value to pass to the message for the name of the field
-        * as $1. Currently this parameter doesn't seem to ever be used.
-        *
-        * Note, everything here is passed through the parser later on (!)
-        */
-       protected static function addMeta( &$array, $visibility, $type, $id, $value, $param = false ) {
-               $msg = wfMessage( "$type-$id", $param );
-               if ( $msg->exists() ) {
-                       $name = $msg->text();
-               } else {
-                       // This is for future compatibility when using instant commons.
-                       // So as to not display as ugly a name if a new metadata
-                       // property is defined that we don't know about
-                       // (not a major issue since such a property would be collapsed
-                       // by default).
-                       wfDebug( __METHOD__ . ' Unknown metadata name: ' . $id . "\n" );
-                       $name = wfEscapeWikiText( $id );
-               }
-               $array[$visibility][] = array(
-                       'id' => "$type-$id",
-                       'name' => $name,
-                       'value' => $value
-               );
-       }
-
-       /**
-        * @param $file File
-        * @return string
-        */
-       function getShortDesc( $file ) {
-               global $wgLang;
-               return htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
-       }
-
-       /**
-        * @param $file File
-        * @return string
-        */
-       function getLongDesc( $file ) {
-               global $wgLang;
-               return wfMessage( 'file-info', htmlspecialchars( $wgLang->formatSize( $file->getSize() ) ),
-                       $file->getMimeType() )->parse();
-       }
-
-       /**
-        * @param $file File
-        * @return string
-        */
-       static function getGeneralShortDesc( $file ) {
-               global $wgLang;
-               return $wgLang->formatSize( $file->getSize() );
-       }
-
-       /**
-        * @param $file File
-        * @return string
-        */
-       static function getGeneralLongDesc( $file ) {
-               global $wgLang;
-               return wfMessage( 'file-info', $wgLang->formatSize( $file->getSize() ),
-                       $file->getMimeType() )->parse();
-       }
-
-       /**
-        * Calculate the largest thumbnail width for a given original file size
-        * such that the thumbnail's height is at most $maxHeight.
-        * @param $boxWidth Integer Width of the thumbnail box.
-        * @param $boxHeight Integer Height of the thumbnail box.
-        * @param $maxHeight Integer Maximum height expected for the thumbnail.
-        * @return Integer.
-        */
-       public static function fitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
-               $idealWidth = $boxWidth * $maxHeight / $boxHeight;
-               $roundedUp = ceil( $idealWidth );
-               if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
-                       return floor( $idealWidth );
-               } else {
-                       return $roundedUp;
-               }
-       }
-
-       function getDimensionsString( $file ) {
-               return '';
-       }
-
-       /**
-        * Modify the parser object post-transform
-        */
-       function parserTransformHook( $parser, $file ) {}
-
-       /**
-        * File validation hook called on upload.
-        *
-        * If the file at the given local path is not valid, or its MIME type does not
-        * match the handler class, a Status object should be returned containing
-        * relevant errors.
-        *
-        * @param $fileName string The local path to the file.
-        * @return Status object
-        */
-       function verifyUpload( $fileName ) {
-               return Status::newGood();
-       }
-
-       /**
-        * Check for zero-sized thumbnails. These can be generated when
-        * no disk space is available or some other error occurs
-        *
-        * @param $dstPath string The location of the suspect file
-        * @param $retval int Return value of some shell process, file will be deleted if this is non-zero
-        * @return bool True if removed, false otherwise
-        */
-       function removeBadFile( $dstPath, $retval = 0 ) {
-               if( file_exists( $dstPath ) ) {
-                       $thumbstat = stat( $dstPath );
-                       if( $thumbstat['size'] == 0 || $retval != 0 ) {
-                               $result = unlink( $dstPath );
-
-                               if ( $result ) {
-                                       wfDebugLog( 'thumbnail',
-                                               sprintf( 'Removing bad %d-byte thumbnail "%s". unlink() succeeded',
-                                                       $thumbstat['size'], $dstPath ) );
-                               } else {
-                                       wfDebugLog( 'thumbnail',
-                                               sprintf( 'Removing bad %d-byte thumbnail "%s". unlink() failed',
-                                                       $thumbstat['size'], $dstPath ) );
-                               }
-                               return true;
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Remove files from the purge list
-        * 
-        * @param array $files
-        * @param array $options
-        */
-       public function filterThumbnailPurgeList( &$files, $options ) {
-               // Do nothing
-       }
-}
-
-/**
- * Media handler abstract base class for images
- *
- * @ingroup Media
- */
-abstract class ImageHandler extends MediaHandler {
-
-       /**
-        * @param $file File
-        * @return bool
-        */
-       function canRender( $file ) {
-               return ( $file->getWidth() && $file->getHeight() );
-       }
-
-       function getParamMap() {
-               return array( 'img_width' => 'width' );
-       }
-
-       function validateParam( $name, $value ) {
-               if ( in_array( $name, array( 'width', 'height' ) ) ) {
-                       if ( $value <= 0 ) {
-                               return false;
-                       } else {
-                               return true;
-                       }
-               } else {
-                       return false;
-               }
-       }
-
-       function makeParamString( $params ) {
-               if ( isset( $params['physicalWidth'] ) ) {
-                       $width = $params['physicalWidth'];
-               } elseif ( isset( $params['width'] ) ) {
-                       $width = $params['width'];
-               } else {
-                       throw new MWException( 'No width specified to '.__METHOD__ );
-               }
-               # Removed for ProofreadPage
-               #$width = intval( $width );
-               return "{$width}px";
-       }
-
-       function parseParamString( $str ) {
-               $m = false;
-               if ( preg_match( '/^(\d+)px$/', $str, $m ) ) {
-                       return array( 'width' => $m[1] );
-               } else {
-                       return false;
-               }
-       }
-
-       function getScriptParams( $params ) {
-               return array( 'width' => $params['width'] );
-       }
-
-       /**
-        * @param $image File
-        * @param  $params
-        * @return bool
-        */
-       function normaliseParams( $image, &$params ) {
-               $mimeType = $image->getMimeType();
-
-               if ( !isset( $params['width'] ) ) {
-                       return false;
-               }
-
-               if ( !isset( $params['page'] ) ) {
-                       $params['page'] = 1;
-               } else  {
-                       if ( $params['page'] > $image->pageCount() ) {
-                               $params['page'] = $image->pageCount();
-                       }
-
-                       if ( $params['page'] < 1 ) {
-                               $params['page'] = 1;
-                       }
-               }
-
-               $srcWidth = $image->getWidth( $params['page'] );
-               $srcHeight = $image->getHeight( $params['page'] );
-
-               if ( isset( $params['height'] ) && $params['height'] != -1 ) {
-                       # Height & width were both set
-                       if ( $params['width'] * $srcHeight > $params['height'] * $srcWidth ) {
-                               # Height is the relative smaller dimension, so scale width accordingly
-                               $params['width'] = self::fitBoxWidth( $srcWidth, $srcHeight, $params['height'] );
-
-                               if ( $params['width'] == 0 ) {
-                                       # Very small image, so we need to rely on client side scaling :(
-                                       $params['width'] = 1;
-                               }
-
-                               $params['physicalWidth'] = $params['width'];
-                       } else {
-                               # Height was crap, unset it so that it will be calculated later
-                               unset( $params['height'] );
-                       }
-               }
-
-               if ( !isset( $params['physicalWidth'] ) ) {
-                       # Passed all validations, so set the physicalWidth
-                       $params['physicalWidth'] = $params['width'];
-               }
-
-               # Because thumbs are only referred to by width, the height always needs
-               # to be scaled by the width to keep the thumbnail sizes consistent,
-               # even if it was set inside the if block above
-               $params['physicalHeight'] = File::scaleHeight( $srcWidth, $srcHeight,
-                       $params['physicalWidth'] );
-
-               # Set the height if it was not validated in the if block higher up
-               if ( !isset( $params['height'] ) || $params['height'] == -1 ) {
-                       $params['height'] = $params['physicalHeight'];
-               }
-
-
-               if ( !$this->validateThumbParams( $params['physicalWidth'],
-                               $params['physicalHeight'], $srcWidth, $srcHeight, $mimeType ) ) {
-                       return false;
-               }
-               return true;
-       }
-
-       /**
-        * Validate thumbnail parameters and fill in the correct height
-        *
-        * @param $width Integer: specified width (input/output)
-        * @param $height Integer: height (output only)
-        * @param $srcWidth Integer: width of the source image
-        * @param $srcHeight Integer: height of the source image
-        * @param $mimeType
-        * @return bool False to indicate that an error should be returned to the user.
-        */
-       function validateThumbParams( &$width, &$height, $srcWidth, $srcHeight, $mimeType ) {
-               $width = intval( $width );
-
-               # Sanity check $width
-               if( $width <= 0) {
-                       wfDebug( __METHOD__.": Invalid destination width: $width\n" );
-                       return false;
-               }
-               if ( $srcWidth <= 0 ) {
-                       wfDebug( __METHOD__.": Invalid source width: $srcWidth\n" );
-                       return false;
-               }
-
-               $height = File::scaleHeight( $srcWidth, $srcHeight, $width );
-               if ( $height == 0 ) {
-                       # Force height to be at least 1 pixel
-                       $height = 1;
-               }
-               return true;
-       }
-
-       /**
-        * @param $image File
-        * @param  $script
-        * @param  $params
-        * @return bool|ThumbnailImage
-        */
-       function getScriptedTransform( $image, $script, $params ) {
-               if ( !$this->normaliseParams( $image, $params ) ) {
-                       return false;
-               }
-               $url = $script . '&' . wfArrayToCGI( $this->getScriptParams( $params ) );
-               $page = isset( $params['page'] ) ? $params['page'] : false;
-
-               if( $image->mustRender() || $params['width'] < $image->getWidth() ) {
-                       return new ThumbnailImage( $image, $url, $params['width'], $params['height'], $page );
-               }
-       }
-
-       function getImageSize( $image, $path ) {
-               wfSuppressWarnings();
-               $gis = getimagesize( $path );
-               wfRestoreWarnings();
-               return $gis;
-       }
-
-       function isAnimatedImage( $image ) {
-               return false;
-       }
-
-       /**
-        * @param $file File
-        * @return string
-        */
-       function getShortDesc( $file ) {
-               global $wgLang;
-               $nbytes = htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
-               $widthheight = wfMessage( 'widthheight' )->numParams( $file->getWidth(), $file->getHeight() )->escaped();
-
-               return "$widthheight ($nbytes)";
-       }
-
-       /**
-        * @param $file File
-        * @return string
-        */
-       function getLongDesc( $file ) {
-               global $wgLang;
-               $pages = $file->pageCount();
-               $size = htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
-               if ( $pages === false || $pages <= 1 ) {
-                       $msg = wfMessage( 'file-info-size' )->numParams( $file->getWidth(),
-                               $file->getHeight() )->params( $size,
-                               $file->getMimeType() )->parse();
-               } else {
-                       $msg = wfMessage( 'file-info-size-pages' )->numParams( $file->getWidth(),
-                               $file->getHeight() )->params( $size,
-                               $file->getMimeType() )->numParams( $pages )->parse();
-               }
-               return $msg;
-       }
-
-       /**
-        * @param $file File
-        * @return string
-        */
-       function getDimensionsString( $file ) {
-               $pages = $file->pageCount();
-               if ( $pages > 1 ) {
-                       return wfMessage( 'widthheightpage' )->numParams( $file->getWidth(), $file->getHeight(), $pages )->text();
-               } else {
-                       return wfMessage( 'widthheight' )->numParams( $file->getWidth(), $file->getHeight() )->text();
-               }
-       }
-}
diff --git a/includes/media/ImageHandler.php b/includes/media/ImageHandler.php
new file mode 100644 (file)
index 0000000..65757c9
--- /dev/null
@@ -0,0 +1,251 @@
+<?php
+/**
+ * Media-handling base classes and generic functionality.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Media handler abstract base class for images
+ *
+ * @ingroup Media
+ */
+abstract class ImageHandler extends MediaHandler {
+
+       /**
+        * @param $file File
+        * @return bool
+        */
+       function canRender( $file ) {
+               return ( $file->getWidth() && $file->getHeight() );
+       }
+
+       function getParamMap() {
+               return array( 'img_width' => 'width' );
+       }
+
+       function validateParam( $name, $value ) {
+               if ( in_array( $name, array( 'width', 'height' ) ) ) {
+                       if ( $value <= 0 ) {
+                               return false;
+                       } else {
+                               return true;
+                       }
+               } else {
+                       return false;
+               }
+       }
+
+       function makeParamString( $params ) {
+               if ( isset( $params['physicalWidth'] ) ) {
+                       $width = $params['physicalWidth'];
+               } elseif ( isset( $params['width'] ) ) {
+                       $width = $params['width'];
+               } else {
+                       throw new MWException( 'No width specified to '.__METHOD__ );
+               }
+               # Removed for ProofreadPage
+               #$width = intval( $width );
+               return "{$width}px";
+       }
+
+       function parseParamString( $str ) {
+               $m = false;
+               if ( preg_match( '/^(\d+)px$/', $str, $m ) ) {
+                       return array( 'width' => $m[1] );
+               } else {
+                       return false;
+               }
+       }
+
+       function getScriptParams( $params ) {
+               return array( 'width' => $params['width'] );
+       }
+
+       /**
+        * @param $image File
+        * @param  $params
+        * @return bool
+        */
+       function normaliseParams( $image, &$params ) {
+               $mimeType = $image->getMimeType();
+
+               if ( !isset( $params['width'] ) ) {
+                       return false;
+               }
+
+               if ( !isset( $params['page'] ) ) {
+                       $params['page'] = 1;
+               } else  {
+                       if ( $params['page'] > $image->pageCount() ) {
+                               $params['page'] = $image->pageCount();
+                       }
+
+                       if ( $params['page'] < 1 ) {
+                               $params['page'] = 1;
+                       }
+               }
+
+               $srcWidth = $image->getWidth( $params['page'] );
+               $srcHeight = $image->getHeight( $params['page'] );
+
+               if ( isset( $params['height'] ) && $params['height'] != -1 ) {
+                       # Height & width were both set
+                       if ( $params['width'] * $srcHeight > $params['height'] * $srcWidth ) {
+                               # Height is the relative smaller dimension, so scale width accordingly
+                               $params['width'] = self::fitBoxWidth( $srcWidth, $srcHeight, $params['height'] );
+
+                               if ( $params['width'] == 0 ) {
+                                       # Very small image, so we need to rely on client side scaling :(
+                                       $params['width'] = 1;
+                               }
+
+                               $params['physicalWidth'] = $params['width'];
+                       } else {
+                               # Height was crap, unset it so that it will be calculated later
+                               unset( $params['height'] );
+                       }
+               }
+
+               if ( !isset( $params['physicalWidth'] ) ) {
+                       # Passed all validations, so set the physicalWidth
+                       $params['physicalWidth'] = $params['width'];
+               }
+
+               # Because thumbs are only referred to by width, the height always needs
+               # to be scaled by the width to keep the thumbnail sizes consistent,
+               # even if it was set inside the if block above
+               $params['physicalHeight'] = File::scaleHeight( $srcWidth, $srcHeight,
+                       $params['physicalWidth'] );
+
+               # Set the height if it was not validated in the if block higher up
+               if ( !isset( $params['height'] ) || $params['height'] == -1 ) {
+                       $params['height'] = $params['physicalHeight'];
+               }
+
+
+               if ( !$this->validateThumbParams( $params['physicalWidth'],
+                               $params['physicalHeight'], $srcWidth, $srcHeight, $mimeType ) ) {
+                       return false;
+               }
+               return true;
+       }
+
+       /**
+        * Validate thumbnail parameters and fill in the correct height
+        *
+        * @param $width Integer: specified width (input/output)
+        * @param $height Integer: height (output only)
+        * @param $srcWidth Integer: width of the source image
+        * @param $srcHeight Integer: height of the source image
+        * @param $mimeType
+        * @return bool False to indicate that an error should be returned to the user.
+        */
+       function validateThumbParams( &$width, &$height, $srcWidth, $srcHeight, $mimeType ) {
+               $width = intval( $width );
+
+               # Sanity check $width
+               if( $width <= 0) {
+                       wfDebug( __METHOD__.": Invalid destination width: $width\n" );
+                       return false;
+               }
+               if ( $srcWidth <= 0 ) {
+                       wfDebug( __METHOD__.": Invalid source width: $srcWidth\n" );
+                       return false;
+               }
+
+               $height = File::scaleHeight( $srcWidth, $srcHeight, $width );
+               if ( $height == 0 ) {
+                       # Force height to be at least 1 pixel
+                       $height = 1;
+               }
+               return true;
+       }
+
+       /**
+        * @param $image File
+        * @param  $script
+        * @param  $params
+        * @return bool|ThumbnailImage
+        */
+       function getScriptedTransform( $image, $script, $params ) {
+               if ( !$this->normaliseParams( $image, $params ) ) {
+                       return false;
+               }
+               $url = $script . '&' . wfArrayToCGI( $this->getScriptParams( $params ) );
+               $page = isset( $params['page'] ) ? $params['page'] : false;
+
+               if( $image->mustRender() || $params['width'] < $image->getWidth() ) {
+                       return new ThumbnailImage( $image,
+                               $url, $params['width'], $params['height'], false, $page );
+               }
+       }
+
+       function getImageSize( $image, $path ) {
+               wfSuppressWarnings();
+               $gis = getimagesize( $path );
+               wfRestoreWarnings();
+               return $gis;
+       }
+
+       /**
+        * @param $file File
+        * @return string
+        */
+       function getShortDesc( $file ) {
+               global $wgLang;
+               $nbytes = htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
+               $widthheight = wfMessage( 'widthheight' )->numParams( $file->getWidth(), $file->getHeight() )->escaped();
+
+               return "$widthheight ($nbytes)";
+       }
+
+       /**
+        * @param $file File
+        * @return string
+        */
+       function getLongDesc( $file ) {
+               global $wgLang;
+               $pages = $file->pageCount();
+               $size = htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
+               if ( $pages === false || $pages <= 1 ) {
+                       $msg = wfMessage( 'file-info-size' )->numParams( $file->getWidth(),
+                               $file->getHeight() )->params( $size,
+                               $file->getMimeType() )->parse();
+               } else {
+                       $msg = wfMessage( 'file-info-size-pages' )->numParams( $file->getWidth(),
+                               $file->getHeight() )->params( $size,
+                               $file->getMimeType() )->numParams( $pages )->parse();
+               }
+               return $msg;
+       }
+
+       /**
+        * @param $file File
+        * @return string
+        */
+       function getDimensionsString( $file ) {
+               $pages = $file->pageCount();
+               if ( $pages > 1 ) {
+                       return wfMessage( 'widthheightpage' )->numParams( $file->getWidth(), $file->getHeight(), $pages )->text();
+               } else {
+                       return wfMessage( 'widthheight' )->numParams( $file->getWidth(), $file->getHeight() )->text();
+               }
+       }
+}
diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php
new file mode 100644 (file)
index 0000000..965099f
--- /dev/null
@@ -0,0 +1,560 @@
+<?php
+/**
+ * Media-handling base classes and generic functionality.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Base media handler class
+ *
+ * @ingroup Media
+ */
+abstract class MediaHandler {
+       const TRANSFORM_LATER = 1;
+       const METADATA_GOOD = true;
+       const METADATA_BAD = false;
+       const METADATA_COMPATIBLE = 2; // for old but backwards compatible.
+       /**
+        * Instance cache
+        */
+       static $handlers = array();
+
+       /**
+        * Get a MediaHandler for a given MIME type from the instance cache
+        *
+        * @param $type string
+        *
+        * @return MediaHandler
+        */
+       static function getHandler( $type ) {
+               global $wgMediaHandlers;
+               if ( !isset( $wgMediaHandlers[$type] ) ) {
+                       wfDebug( __METHOD__ . ": no handler found for $type.\n");
+                       return false;
+               }
+               $class = $wgMediaHandlers[$type];
+               if ( !isset( self::$handlers[$class] ) ) {
+                       self::$handlers[$class] = new $class;
+                       if ( !self::$handlers[$class]->isEnabled() ) {
+                               self::$handlers[$class] = false;
+                       }
+               }
+               return self::$handlers[$class];
+       }
+
+       /**
+        * Get an associative array mapping magic word IDs to parameter names.
+        * Will be used by the parser to identify parameters.
+        */
+       abstract function getParamMap();
+
+       /**
+        * Validate a thumbnail parameter at parse time.
+        * Return true to accept the parameter, and false to reject it.
+        * If you return false, the parser will do something quiet and forgiving.
+        *
+        * @param $name
+        * @param $value
+        */
+       abstract function validateParam( $name, $value );
+
+       /**
+        * Merge a parameter array into a string appropriate for inclusion in filenames
+        *
+        * @param $params array
+        */
+       abstract function makeParamString( $params );
+
+       /**
+        * Parse a param string made with makeParamString back into an array
+        *
+        * @param $str string
+        */
+       abstract function parseParamString( $str );
+
+       /**
+        * Changes the parameter array as necessary, ready for transformation.
+        * Should be idempotent.
+        * Returns false if the parameters are unacceptable and the transform should fail
+        * @param $image
+        * @param $params
+        */
+       abstract function normaliseParams( $image, &$params );
+
+       /**
+        * Get an image size array like that returned by getimagesize(), or false if it
+        * can't be determined.
+        *
+        * @param $image File: the image object, or false if there isn't one
+        * @param $path String: the filename
+        * @return Array Follow the format of PHP getimagesize() internal function. See http://www.php.net/getimagesize
+        */
+       abstract function getImageSize( $image, $path );
+
+       /**
+        * Get handler-specific metadata which will be saved in the img_metadata field.
+        *
+        * @param $image File: the image object, or false if there isn't one.
+        *   Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
+        * @param $path String: the filename
+        * @return String
+        */
+       function getMetadata( $image, $path ) { return ''; }
+
+       /**
+       * Get metadata version.
+       *
+       * This is not used for validating metadata, this is used for the api when returning
+       * metadata, since api content formats should stay the same over time, and so things
+       * using ForiegnApiRepo can keep backwards compatibility
+       *
+       * All core media handlers share a common version number, and extensions can
+       * use the GetMetadataVersion hook to append to the array (they should append a unique
+       * string so not to get confusing). If there was a media handler named 'foo' with metadata
+       * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
+       * version is 2, the end version string would look like '2;foo=3'.
+       *
+       * @return string version string
+       */
+       static function getMetadataVersion () {
+               $version = Array( '2' ); // core metadata version
+               wfRunHooks('GetMetadataVersion', Array(&$version));
+               return implode( ';', $version);
+        }
+
+       /**
+       * Convert metadata version.
+       *
+       * By default just returns $metadata, but can be used to allow
+       * media handlers to convert between metadata versions.
+       *
+       * @param $metadata Mixed String or Array metadata array (serialized if string)
+       * @param $version Integer target version
+       * @return Array serialized metadata in specified version, or $metadata on fail.
+       */
+       function convertMetadataVersion( $metadata, $version = 1 ) {
+               if ( !is_array( $metadata ) ) {
+
+                       //unserialize to keep return parameter consistent.
+                       wfSuppressWarnings();
+                       $ret = unserialize( $metadata );
+                       wfRestoreWarnings();
+                       return $ret;
+               }
+               return $metadata;
+       }
+
+       /**
+        * Get a string describing the type of metadata, for display purposes.
+        *
+        * @return string
+        */
+       function getMetadataType( $image ) { return false; }
+
+       /**
+        * Check if the metadata string is valid for this handler.
+        * If it returns MediaHandler::METADATA_BAD (or false), Image
+        * will reload the metadata from the file and update the database.
+        * MediaHandler::METADATA_GOOD for if the metadata is a-ok,
+        * MediaHanlder::METADATA_COMPATIBLE if metadata is old but backwards
+        * compatible (which may or may not trigger a metadata reload).
+        * @return bool
+        */
+       function isMetadataValid( $image, $metadata ) {
+               return self::METADATA_GOOD;
+       }
+
+
+       /**
+        * Get a MediaTransformOutput object representing an alternate of the transformed
+        * output which will call an intermediary thumbnail assist script.
+        *
+        * Used when the repository has a thumbnailScriptUrl option configured.
+        *
+        * Return false to fall back to the regular getTransform().
+        * @return bool
+        */
+       function getScriptedTransform( $image, $script, $params ) {
+               return false;
+       }
+
+       /**
+        * Get a MediaTransformOutput object representing the transformed output. Does not
+        * actually do the transform.
+        *
+        * @param $image File: the image object
+        * @param $dstPath String: filesystem destination path
+        * @param $dstUrl String: Destination URL to use in output HTML
+        * @param $params Array: Arbitrary set of parameters validated by $this->validateParam()
+        * @return MediaTransformOutput
+        */
+       final function getTransform( $image, $dstPath, $dstUrl, $params ) {
+               return $this->doTransform( $image, $dstPath, $dstUrl, $params, self::TRANSFORM_LATER );
+       }
+
+       /**
+        * Get a MediaTransformOutput object representing the transformed output. Does the
+        * transform unless $flags contains self::TRANSFORM_LATER.
+        *
+        * @param $image File: the image object
+        * @param $dstPath String: filesystem destination path
+        * @param $dstUrl String: destination URL to use in output HTML
+        * @param $params Array: arbitrary set of parameters validated by $this->validateParam()
+        * @param $flags Integer: a bitfield, may contain self::TRANSFORM_LATER
+        *
+        * @return MediaTransformOutput
+        */
+       abstract function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 );
+
+       /**
+        * Get the thumbnail extension and MIME type for a given source MIME type
+        * @return array thumbnail extension and MIME type
+        */
+       function getThumbType( $ext, $mime, $params = null ) {
+               $magic = MimeMagic::singleton();
+               if ( !$ext || $magic->isMatchingExtension( $ext, $mime ) === false ) {
+                       // The extension is not valid for this mime type and we do
+                       // recognize the mime type
+                       $extensions = $magic->getExtensionsForType( $mime );
+                       if ( $extensions ) {
+                               return array( strtok( $extensions, ' ' ), $mime );
+                       }
+               }
+
+               // The extension is correct (true) or the mime type is unknown to
+               // MediaWiki (null)
+               return array( $ext, $mime );
+       }
+
+       /**
+        * True if the handled types can be transformed
+        * @return bool
+        */
+       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; }
+       /**
+        * True if the type has multi-page capabilities
+        * @return bool
+        */
+       function isMultiPage( $file ) { return false; }
+       /**
+        * Page count for a multi-page document, false if unsupported or unknown
+        * @return bool
+        */
+       function pageCount( $file ) { return false; }
+       /**
+        * The material is vectorized and thus scaling is lossless
+        * @return bool
+        */
+       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; }
+       /**
+        * 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; }
+       /**
+        * False if the handler is disabled for all files
+        * @return bool
+        */
+       function isEnabled() { return true; }
+
+       /**
+        * Get an associative array of page dimensions
+        * Currently "width" and "height" are understood, but this might be
+        * expanded in the future.
+        * Returns false if unknown or if the document is not multi-page.
+        *
+        * @param $image File
+        * @param $page Unused, left for backcompatibility?
+        * @return array
+        */
+       function getPageDimensions( $image, $page ) {
+               $gis = $this->getImageSize( $image, $image->getLocalRefPath() );
+               return array(
+                       'width' => $gis[0],
+                       'height' => $gis[1]
+               );
+       }
+
+       /**
+        * Generic getter for text layer.
+        * Currently overloaded by PDF and DjVu handlers
+        * @return bool
+        */
+       function getPageText( $image, $page ) {
+               return false;
+       }
+
+       /**
+        * Get an array structure that looks like this:
+        *
+        * array(
+        *    'visible' => array(
+        *       'Human-readable name' => 'Human readable value',
+        *       ...
+        *    ),
+        *    'collapsed' => array(
+        *       'Human-readable name' => 'Human readable value',
+        *       ...
+        *    )
+        * )
+        * The UI will format this into a table where the visible fields are always
+        * visible, and the collapsed fields are optionally visible.
+        *
+        * The function should return false if there is no metadata to display.
+        */
+
+       /**
+        * @todo FIXME: I don't really like this interface, it's not very flexible
+        * I think the media handler should generate HTML instead. It can do
+        * all the formatting according to some standard. That makes it possible
+        * to do things like visual indication of grouped and chained streams
+        * in ogg container files.
+        * @return bool
+        */
+       function formatMetadata( $image ) {
+               return false;
+       }
+
+       /** sorts the visible/invisible field.
+        * Split off from ImageHandler::formatMetadata, as used by more than
+        * one type of handler.
+        *
+        * This is used by the media handlers that use the FormatMetadata class
+        *
+        * @param $metadataArray Array metadata array
+        * @return array for use displaying metadata.
+        */
+       function formatMetadataHelper( $metadataArray ) {
+                $result = array(
+                       'visible' => array(),
+                       'collapsed' => array()
+               );
+
+               $formatted = FormatMetadata::getFormattedData( $metadataArray );
+               // Sort fields into visible and collapsed
+               $visibleFields = $this->visibleMetadataFields();
+               foreach ( $formatted as $name => $value ) {
+                       $tag = strtolower( $name );
+                       self::addMeta( $result,
+                               in_array( $tag, $visibleFields ) ? 'visible' : 'collapsed',
+                               'exif',
+                               $tag,
+                               $value
+                       );
+               }
+               return $result;
+       }
+
+       /**
+        * Get a list of metadata items which should be displayed when
+        * the metadata table is collapsed.
+        *
+        * @return array of strings
+        * @access protected
+        */
+       function visibleMetadataFields() {
+               $fields = array();
+               $lines = explode( "\n", wfMessage( 'metadata-fields' )->inContentLanguage()->text() );
+               foreach( $lines as $line ) {
+                       $matches = array();
+                       if( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
+                               $fields[] = $matches[1];
+                       }
+               }
+               $fields = array_map( 'strtolower', $fields );
+               return $fields;
+       }
+
+
+       /**
+        * This is used to generate an array element for each metadata value
+        * That array is then used to generate the table of metadata values
+        * on the image page
+        *
+        * @param &$array Array An array containing elements for each type of visibility
+        * and each of those elements being an array of metadata items. This function adds
+        * a value to that array.
+        * @param $visibility string ('visible' or 'collapsed') if this value is hidden
+        * by default.
+        * @param $type String type of metadata tag (currently always 'exif')
+        * @param $id String the name of the metadata tag (like 'artist' for example).
+        * its name in the table displayed is the message "$type-$id" (Ex exif-artist ).
+        * @param $value String thingy goes into a wikitext table; it used to be escaped but
+        * that was incompatible with previous practise of customized display
+        * with wikitext formatting via messages such as 'exif-model-value'.
+        * So the escaping is taken back out, but generally this seems a confusing
+        * interface.
+        * @param $param String value to pass to the message for the name of the field
+        * as $1. Currently this parameter doesn't seem to ever be used.
+        *
+        * Note, everything here is passed through the parser later on (!)
+        */
+       protected static function addMeta( &$array, $visibility, $type, $id, $value, $param = false ) {
+               $msg = wfMessage( "$type-$id", $param );
+               if ( $msg->exists() ) {
+                       $name = $msg->text();
+               } else {
+                       // This is for future compatibility when using instant commons.
+                       // So as to not display as ugly a name if a new metadata
+                       // property is defined that we don't know about
+                       // (not a major issue since such a property would be collapsed
+                       // by default).
+                       wfDebug( __METHOD__ . ' Unknown metadata name: ' . $id . "\n" );
+                       $name = wfEscapeWikiText( $id );
+               }
+               $array[$visibility][] = array(
+                       'id' => "$type-$id",
+                       'name' => $name,
+                       'value' => $value
+               );
+       }
+
+       /**
+        * @param $file File
+        * @return string
+        */
+       function getShortDesc( $file ) {
+               global $wgLang;
+               return htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
+       }
+
+       /**
+        * @param $file File
+        * @return string
+        */
+       function getLongDesc( $file ) {
+               global $wgLang;
+               return wfMessage( 'file-info', htmlspecialchars( $wgLang->formatSize( $file->getSize() ) ),
+                       $file->getMimeType() )->parse();
+       }
+
+       /**
+        * @param $file File
+        * @return string
+        */
+       static function getGeneralShortDesc( $file ) {
+               global $wgLang;
+               return $wgLang->formatSize( $file->getSize() );
+       }
+
+       /**
+        * @param $file File
+        * @return string
+        */
+       static function getGeneralLongDesc( $file ) {
+               global $wgLang;
+               return wfMessage( 'file-info', $wgLang->formatSize( $file->getSize() ),
+                       $file->getMimeType() )->parse();
+       }
+
+       /**
+        * Calculate the largest thumbnail width for a given original file size
+        * such that the thumbnail's height is at most $maxHeight.
+        * @param $boxWidth Integer Width of the thumbnail box.
+        * @param $boxHeight Integer Height of the thumbnail box.
+        * @param $maxHeight Integer Maximum height expected for the thumbnail.
+        * @return Integer.
+        */
+       public static function fitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
+               $idealWidth = $boxWidth * $maxHeight / $boxHeight;
+               $roundedUp = ceil( $idealWidth );
+               if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
+                       return floor( $idealWidth );
+               } else {
+                       return $roundedUp;
+               }
+       }
+
+       function getDimensionsString( $file ) {
+               return '';
+       }
+
+       /**
+        * Modify the parser object post-transform
+        */
+       function parserTransformHook( $parser, $file ) {}
+
+       /**
+        * File validation hook called on upload.
+        *
+        * If the file at the given local path is not valid, or its MIME type does not
+        * match the handler class, a Status object should be returned containing
+        * relevant errors.
+        *
+        * @param $fileName string The local path to the file.
+        * @return Status object
+        */
+       function verifyUpload( $fileName ) {
+               return Status::newGood();
+       }
+
+       /**
+        * Check for zero-sized thumbnails. These can be generated when
+        * no disk space is available or some other error occurs
+        *
+        * @param $dstPath string The location of the suspect file
+        * @param $retval int Return value of some shell process, file will be deleted if this is non-zero
+        * @return bool True if removed, false otherwise
+        */
+       function removeBadFile( $dstPath, $retval = 0 ) {
+               if( file_exists( $dstPath ) ) {
+                       $thumbstat = stat( $dstPath );
+                       if( $thumbstat['size'] == 0 || $retval != 0 ) {
+                               $result = unlink( $dstPath );
+
+                               if ( $result ) {
+                                       wfDebugLog( 'thumbnail',
+                                               sprintf( 'Removing bad %d-byte thumbnail "%s". unlink() succeeded',
+                                                       $thumbstat['size'], $dstPath ) );
+                               } else {
+                                       wfDebugLog( 'thumbnail',
+                                               sprintf( 'Removing bad %d-byte thumbnail "%s". unlink() failed',
+                                                       $thumbstat['size'], $dstPath ) );
+                               }
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Remove files from the purge list
+        *
+        * @param array $files
+        * @param array $options
+        */
+       public function filterThumbnailPurgeList( &$files, $options ) {
+               // Do nothing
+       }
+}
index bf08de6..773824c 100644 (file)
@@ -36,21 +36,30 @@ abstract class MediaTransformOutput {
        protected $storagePath = false;
 
        /**
-        * Get the width of the output box
+        * @return integer Width of the output box
         */
        public function getWidth() {
                return $this->width;
        }
 
        /**
-        * Get the height of the output box
+        * @return integer Height of the output box
         */
        public function getHeight() {
                return $this->height;
        }
 
        /**
-        * @return string The thumbnail URL
+        * Get the final extension of the thumbnail.
+        * Returns false for scripted transformations.
+        * @return string|false
+        */
+       public function getExtension() {
+               return $this->path ? FileBackend::extensionFromPath( $this->path ) : false;
+       }
+
+       /**
+        * @return string|false The thumbnail URL
         */
        public function getUrl() {
                return $this->url;
@@ -84,7 +93,7 @@ abstract class MediaTransformOutput {
         *     custom-url-link    Custom URL to link to
         *     custom-title-link  Custom Title object to link to
         *     valign       vertical-align property, if the output is an inline element
-        *     img-class    Class applied to the <img> tag, if there is such a tag
+        *     img-class    Class applied to the "<img>" tag, if there is such a tag
         *
         * For images, desc-link and file-link are implemented as a click-through. For
         * sounds and videos, they may be displayed in other ways.
@@ -106,7 +115,7 @@ abstract class MediaTransformOutput {
         * This will return false if there was an error, the
         * thumbnail is to be handled client-side only, or if
         * transformation was deferred via TRANSFORM_LATER.
-        * 
+        *
         * @return Bool
         */
        public function hasFile() {
@@ -148,7 +157,14 @@ abstract class MediaTransformOutput {
         * @return Bool success
         */
        public function streamFile( $headers = array() ) {
-               return $this->path && StreamFile::stream( $this->getLocalCopyPath(), $headers );
+               if ( !$this->path ) {
+                       return false;
+               } elseif ( FileBackend::isStoragePath( $this->path ) ) {
+                       $be = $this->file->getRepo()->getBackend();
+                       return $be->streamFile( array( 'src' => $this->path, 'headers' => $headers ) )->isOK();
+               } else { // FS-file
+                       return StreamFile::stream( $this->getLocalCopyPath(), $headers );
+               }
        }
 
        /**
@@ -198,25 +214,46 @@ class ThumbnailImage extends MediaTransformOutput {
         * Get a thumbnail object from a file and parameters.
         * If $path is set to null, the output file is treated as a source copy.
         * If $path is set to false, no output file will be created.
-        * 
+        * $parameters should include, as a minimum, (file) 'width' and 'height'.
+        * It may also include a 'page' parameter for multipage files.
+        *
         * @param $file File object
         * @param $url String: URL path to the thumb
-        * @param $width Integer: file's width
-        * @param $height Integer: file's height
         * @param $path String|bool|null: filesystem path to the thumb
-        * @param $page Integer: page number, for multipage files
+        * @param $parameters Array: Associative array of parameters
         * @private
         */
-       function __construct( $file, $url, $width, $height, $path = false, $page = false ) {
+       function __construct( $file, $url, $path = false, $parameters = array() ) {
+               # Previous parameters:
+               #   $file, $url, $width, $height, $path = false, $page = false
+
+               if( is_array( $parameters ) ){
+                       $defaults = array(
+                               'page' => false
+                       );
+                       $actualParams = $parameters + $defaults;
+               } else {
+                       # Using old format, should convert. Later a warning could be added here.
+                       $numArgs = func_num_args();
+                       $actualParams = array(
+                               'width' => $path,
+                               'height' => $parameters,
+                               'page' => ( $numArgs > 5 ) ? func_get_arg( 5 ) : false
+                       );
+                       $path = ( $numArgs > 4 ) ? func_get_arg( 4 ) : false;
+               }
+
                $this->file = $file;
                $this->url = $url;
+               $this->path = $path;
+
                # These should be integers when they get here.
                # If not, there's a bug somewhere.  But let's at
                # least produce valid HTML code regardless.
-               $this->width = round( $width );
-               $this->height = round( $height );
-               $this->path = $path;
-               $this->page = $page;
+               $this->width = round( $actualParams['width'] );
+               $this->height = round( $actualParams['height'] );
+
+               $this->page = $actualParams['page'];
        }
 
        /**
@@ -237,6 +274,9 @@ class ThumbnailImage extends MediaTransformOutput {
         *     custom-url-link    Custom URL to link to
         *     custom-title-link  Custom Title object to link to
         *     custom target-link Value of the target attribute, for custom-target-link
+        *     parser-extlink-*   Attributes added by parser for external links:
+        *          parser-extlink-rel: add rel="nofollow"
+        *          parser-extlink-target: link target, but overridden by custom-target-link
         *
         * For images, desc-link and file-link are implemented as a click-through. For
         * sounds and videos, they may be displayed in other ways.
@@ -259,6 +299,11 @@ class ThumbnailImage extends MediaTransformOutput {
                        }
                        if ( !empty( $options['custom-target-link'] ) ) {
                                $linkAttribs['target'] = $options['custom-target-link'];
+                       } elseif ( !empty( $options['parser-extlink-target'] ) ) {
+                               $linkAttribs['target'] = $options['parser-extlink-target'];
+                       }
+                       if ( !empty( $options['parser-extlink-rel'] ) ) {
+                               $linkAttribs['rel'] = $options['parser-extlink-rel'];
                        }
                } elseif ( !empty( $options['custom-title-link'] ) ) {
                        $title = $options['custom-title-link'];
@@ -342,6 +387,6 @@ class TransformParameterError extends MediaTransformError {
                parent::__construct( 'thumbnail_error',
                        max( isset( $params['width']  ) ? $params['width']  : 0, 120 ),
                        max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
-                       wfMsg( 'thumbnail_invalid_params' ) );
+                       wfMessage( 'thumbnail_invalid_params' )->text() );
        }
 }
index afc7d6a..1b329e5 100644 (file)
@@ -80,6 +80,14 @@ class PNGHandler extends BitmapHandler {
                }
                return false;
        }
+       /**
+        * We do not support making APNG thumbnails, so always false
+        * @param $image File
+        * @return bool false
+        */
+       function canAnimateThumbnail( $image ) {
+               return false;
+       }
        
        function getMetadataType( $image ) {
                return 'parsed-png';
@@ -128,13 +136,13 @@ class PNGHandler extends BitmapHandler {
                $info[] = $original;
                
                if ( $metadata['loopCount'] == 0 ) {
-                       $info[] = wfMsgExt( 'file-info-png-looped', 'parseinline' );
+                       $info[] = wfMessage( 'file-info-png-looped' )->parse();
                } elseif ( $metadata['loopCount'] > 1 ) {
-                       $info[] = wfMsgExt( 'file-info-png-repeat', 'parseinline', $metadata['loopCount'] );
+                       $info[] = wfMessage( 'file-info-png-repeat' )->numParams( $metadata['loopCount'] )->parse();
                }
                
                if ( $metadata['frameCount'] > 0 ) {
-                       $info[] = wfMsgExt( 'file-info-png-frames', 'parseinline', $metadata['frameCount'] );
+                       $info[] = wfMessage( 'file-info-png-frames' )->numParams( $metadata['frameCount'] )->parse();
                }
                
                if ( $metadata['duration'] ) {
index 9c8fc5e..a9d1758 100644 (file)
@@ -63,6 +63,13 @@ class SvgHandler extends ImageHandler {
                return false;
        }
 
+       /**
+        * We do not support making animated svg thumbnails
+        */
+       function canAnimateThumb( $file ) {
+               return false;
+       }
+
        /**
         * @param $image File
         * @param  $params
@@ -108,7 +115,6 @@ class SvgHandler extends ImageHandler {
                $clientHeight = $params['height'];
                $physicalWidth = $params['physicalWidth'];
                $physicalHeight = $params['physicalHeight'];
-               $srcPath = $image->getLocalRefPath();
 
                if ( $flags & self::TRANSFORM_LATER ) {
                        return new ThumbnailImage( $image, $dstUrl, $clientWidth, $clientHeight, $dstPath );
@@ -116,9 +122,10 @@ class SvgHandler extends ImageHandler {
 
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
                        return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight,
-                               wfMsg( 'thumbnail_dest_directory' ) );
+                               wfMessage( 'thumbnail_dest_directory' )->text() );
                }
 
+               $srcPath = $image->getLocalRefPath();
                $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight );
                if( $status === true ) {
                        return new ThumbnailImage( $image, $dstUrl, $clientWidth, $clientHeight, $dstPath );
@@ -214,15 +221,30 @@ class SvgHandler extends ImageHandler {
        }
 
        /**
+        * Subtitle for the image. Different from the base
+        * class so it can be denoted that SVG's have
+        * a "nominal" resolution, and not a fixed one,
+        * as well as so animation can be denoted.
+        *
         * @param $file File
         * @return string
         */
        function getLongDesc( $file ) {
                global $wgLang;
-               return wfMsgExt( 'svg-long-desc', 'parseinline',
-                       $wgLang->formatNum( $file->getWidth() ),
-                       $wgLang->formatNum( $file->getHeight() ),
-                       $wgLang->formatSize( $file->getSize() ) );
+               $size = $wgLang->formatSize( $file->getSize() );
+
+               if ( $this->isAnimatedImage( $file ) ) {
+                       $msg = wfMessage( 'svg-long-desc-animated' );
+               } else {
+                       $msg = wfMessage( 'svg-long-desc' );
+               }
+
+               $msg->numParams(
+                       $file->getWidth(),
+                       $file->getHeight()
+               );
+               $msg->Params( $size );
+               return $msg->parse();
        }
 
        function getMetadata( $file, $filename ) {
@@ -253,11 +275,19 @@ class SvgHandler extends ImageHandler {
        }
 
        function isMetadataValid( $image, $metadata ) {
-               return $this->unpackMetadata( $metadata ) !== false;
+               $meta = $this->unpackMetadata( $metadata );
+               if ( $meta === false ) {
+                       return self::METADATA_BAD;
+               }
+               if ( !isset( $meta['originalWidth'] ) ) {
+                       // Old but compatible
+                       return self::METADATA_COMPATIBLE;
+               }
+               return self::METADATA_GOOD;
        }
 
        function visibleMetadataFields() {
-               $fields = array( 'title', 'description', 'animated' );
+               $fields = array( 'objectname', 'imagedescription' );
                return $fields;
        }
 
@@ -278,8 +308,6 @@ class SvgHandler extends ImageHandler {
                if ( !$metadata ) {
                        return false;
                }
-               unset( $metadata['version'] );
-               unset( $metadata['metadata'] ); /* non-formatted XML */
 
                /* TODO: add a formatter
                $format = new FormatSVG( $metadata );
@@ -290,9 +318,10 @@ class SvgHandler extends ImageHandler {
                $visibleFields = $this->visibleMetadataFields();
 
                // Rename fields to be compatible with exif, so that
-               // the labels for these fields work.
-               $conversion = array( 'width' => 'imagewidth',
-                       'height' => 'imagelength',
+               // the labels for these fields work and reuse existing messages.
+               $conversion = array(
+                       'originalwidth' => 'imagewidth',
+                       'originalheight' => 'imagelength',
                        'description' => 'imagedescription',
                        'title' => 'objectname',
                );
@@ -300,6 +329,9 @@ class SvgHandler extends ImageHandler {
                        $tag = strtolower( $name );
                        if ( isset( $conversion[$tag] ) ) {
                                $tag = $conversion[$tag];
+                       } else {
+                               // Do not output other metadata not in list
+                               continue;
                        }
                        self::addMeta( $result,
                                in_array( $tag, $visibleFields ) ? 'visible' : 'collapsed',
index da7d428..851fe42 100644 (file)
@@ -19,7 +19,7 @@
  *
  * @file
  * @ingroup Media
- * @author Derk-Jan Hartman <hartman _at_ videolan d0t org>
+ * @author "Derk-Jan Hartman <hartman _at_ videolan d0t org>"
  * @author Brion Vibber
  * @copyright Copyright © 2010-2010 Brion Vibber, Derk-Jan Hartman
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
@@ -83,6 +83,12 @@ class SVGReader {
                $this->metadata['width'] = self::DEFAULT_WIDTH;
                $this->metadata['height'] = self::DEFAULT_HEIGHT;
 
+               // The size in the units specified by the SVG file
+               // (for the metadata box)
+               // Per the SVG spec, if unspecified, default to '100%'
+               $this->metadata['originalWidth'] = '100%';
+               $this->metadata['originalHeight'] = '100%';
+
                // Because we cut off the end of the svg making an invalid one. Complicated
                // try catch thing to make sure warnings get restored. Seems like there should
                // be a better way.
@@ -90,6 +96,8 @@ class SVGReader {
                try {
                        $this->read();
                } 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();
                        throw $e;
                }
@@ -139,6 +147,11 @@ class SVGReader {
                                $this->readField( $tag, 'description' );
                        } elseif ( $isSVG && $tag == 'metadata' && $type == XmlReader::ELEMENT ) {
                                $this->readXml( $tag, 'metadata' );
+                       } elseif ( $isSVG && $tag == 'script' ) {
+                               // We normally do not allow scripted svgs.
+                               // However its possible to configure MW to let them
+                               // in, and such files should be considered animated.
+                               $this->metadata['animated'] = true;
                        } elseif ( $tag !== '#text' ) {
                                $this->debug( "Unhandled top-level XML tag $tag" );
 
@@ -219,6 +232,11 @@ class SVGReader {
                                break;
                        } elseif ( $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::ELEMENT ) {
                                switch( $this->reader->localName ) {
+                                       case 'script':
+                                               // Normally we disallow files with
+                                               // <script>, but its possible
+                                               // to configure MW to disable
+                                               // such checks.
                                        case 'animate':
                                        case 'set':
                                        case 'animateMotion':
@@ -255,7 +273,7 @@ class SVGReader {
        /**
         * Parse the attributes of an SVG element
         *
-        * The parser has to be in the start element of <svg>
+        * The parser has to be in the start element of "<svg>"
         */
        private function handleSVGAttribs( ) {
                $defaultWidth = self::DEFAULT_WIDTH;
@@ -278,9 +296,11 @@ class SVGReader {
                }
                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') ) {
                        $height = $this->scaleSVGUnit( $this->reader->getAttribute('height'), $defaultHeight );
+                       $this->metadata['originalHeight'] = $this->reader->getAttribute( 'height' );
                }
 
                if( !isset( $width ) && !isset( $height ) ) {
index adb85df..36660b3 100644 (file)
@@ -213,10 +213,16 @@ class XMPReader {
                unset( $data['xmp-special'] );
 
                // Convert GPSAltitude to negative if below sea level.
-               if ( isset( $data['xmp-exif']['GPSAltitudeRef'] ) ) {
-                       if ( $data['xmp-exif']['GPSAltitudeRef'] == '1'
-                               && isset( $data['xmp-exif']['GPSAltitude'] )
-                       ) {
+               if ( isset( $data['xmp-exif']['GPSAltitudeRef'] )
+                       && isset( $data['xmp-exif']['GPSAltitude'] )
+               ) {
+
+                       // Must convert to a real before multiplying by -1
+                       // XMPValidate guarantees there will always be a '/' in this value.
+                       list( $nom, $denom ) = explode( '/', $data['xmp-exif']['GPSAltitude'] );
+                       $data['xmp-exif']['GPSAltitude'] = $nom / $denom;
+
+                       if ( $data['xmp-exif']['GPSAltitudeRef'] == '1' ) {
                                $data['xmp-exif']['GPSAltitude'] *= -1;
                        }
                        unset( $data['xmp-exif']['GPSAltitudeRef'] );
@@ -461,13 +467,15 @@ class XMPReader {
        * generally means we've finished processing a nested structure.
        * resets some internal variables to indicate that.
        *
-       * Note this means we hit the </closing element> not the </rdf:Seq>.
+       * Note this means we hit the closing element not the "</rdf:Seq>".
        *
-       * For example, when processing:
+       * @par For example, when processing:
+       * @code{,xml}
        * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
        *   </rdf:Seq> </exif:ISOSpeedRatings>
+       * @endcode
        *
-       * This method is called when we hit the </exif:ISOSpeedRatings> tag.
+       * This method is called when we hit the "</exif:ISOSpeedRatings>" tag.
        *
        * @param $elm String namespace . space . tag name.
        */
@@ -523,15 +531,17 @@ class XMPReader {
        * Hit a closing element in MODE_LI (either rdf:Seq, or rdf:Bag )
        * Add information about what type of element this is.
        *
-       * Note we still have to hit the outer </property>
+       * Note we still have to hit the outer "</property>"
        *
-       * For example, when processing:
+       * @par For example, when processing:
+       * @code{,xml}
        * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
        *   </rdf:Seq> </exif:ISOSpeedRatings>
+       * @endcode
        *
-       * This method is called when we hit the </rdf:Seq>.
+       * This method is called when we hit the "</rdf:Seq>".
        * (For comparison, we call endElementModeSimple when we
-       * hit the </rdf:li>)
+       * hit the "</rdf:li>")
        *
        * @param $elm String namespace . ' ' . element name
        */
@@ -1010,7 +1020,7 @@ class XMPReader {
        * Also does some initial set up for the wrapper element
        *
        * @param $parser XMLParser
-       * @param $elm String namespace <space> element
+       * @param $elm String namespace "<space>" element
        * @param $attribs Array attribute name => value
        */
        function startElement( $parser, $elm, $attribs ) {
@@ -1093,11 +1103,13 @@ class XMPReader {
        * Process attributes.
        * Simple values can be stored as either a tag or attribute
        *
-       * Often the initial <rdf:Description> tag just has all the simple
+       * Often the initial "<rdf:Description>" tag just has all the simple
        * properties as attributes.
        *
-       * Example:
+       * @par Example:
+       * @code
        * <rdf:Description rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/" exif:DigitalZoomRatio="0/10">
+       * @endcode
        *
        * @param $attribs Array attribute=>value array.
        */
index bca6985..262665b 100644 (file)
@@ -363,13 +363,15 @@ class DeviceDetection implements IDeviceDetector {
                        $deviceName = 'android';
                        if ( strpos( $userAgent, 'Opera Mini' ) !== false ) {
                                $deviceName = 'operamini';
+                       } elseif ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
+                               $deviceName = 'operamobile';
                        }
-               } else if ( preg_match( '/MSIE 9.0/', $userAgent ) ||
+               } elseif ( preg_match( '/MSIE 9.0/', $userAgent ) ||
                                preg_match( '/MSIE 8.0/', $userAgent ) ) {
                        $deviceName = 'ie';
-               } else if( preg_match( '/MSIE/', $userAgent ) ) {
+               } elseif( preg_match( '/MSIE/', $userAgent ) ) {
                        $deviceName = 'html';
-               } else if ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
+               } elseif ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
                        $deviceName = 'operamobile';
                } elseif ( preg_match( '/iPad.* Safari/', $userAgent ) ) {
                        $deviceName = 'iphone';
@@ -398,10 +400,8 @@ class DeviceDetection implements IDeviceDetector {
                                $deviceName = 'wii';
                        } elseif ( strpos( $userAgent, 'Opera Mini' ) !== false ) {
                                $deviceName = 'operamini';
-                       } elseif ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
-                               $deviceName = 'iphone';
                        } else {
-                               $deviceName = 'webkit';
+                               $deviceName = 'operamobile';
                        }
                } elseif ( preg_match( '/Kindle\/1.0/', $userAgent ) ) {
                        $deviceName = 'kindle';
index 2b400e5..08f85bd 100644 (file)
@@ -190,7 +190,7 @@ class UtfNormal {
         */
        static function loadData() {
                if( !isset( self::$utfCombiningClass ) ) {
-                       require_once( dirname(__FILE__) . '/UtfNormalData.inc' );
+                       require_once( __DIR__ . '/UtfNormalData.inc' );
                }
        }
 
index b9a6a69..1a0de21 100644 (file)
  * @ingroup Cache
  */
 class APCBagOStuff extends BagOStuff {
+       /**
+        * @param $key string
+        * @return mixed
+        */
        public function get( $key ) {
                $val = apc_fetch( $key );
 
                if ( is_string( $val ) ) {
-                       $val = unserialize( $val );
+                       if ( $this->isInteger( $val ) ) {
+                               $val = intval( $val );
+                       } else {
+                               $val = unserialize( $val );
+                       }
                }
 
                return $val;
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime int
+        * @return bool
+        */
        public function set( $key, $value, $exptime = 0 ) {
-               apc_store( $key, serialize( $value ), $exptime );
+               if ( !$this->isInteger( $value ) ) {
+                       $value = serialize( $value );
+               }
+
+               apc_store( $key, $value, $exptime );
 
                return true;
        }
 
+       /**
+        * @param $key string
+        * @param $time int
+        * @return bool
+        */
        public function delete( $key, $time = 0 ) {
                apc_delete( $key );
 
                return true;
        }
 
+       public function incr( $key, $value = 1 ) {
+               return apc_inc( $key, $value );
+       }
+
+       public function decr( $key, $value = 1 ) {
+               return apc_dec( $key, $value );
+       }
+
+       /**
+        * @return Array
+        */
        public function keys() {
                $info = apc_cache_info( 'user' );
                $list = $info['cache_list'];
@@ -61,4 +95,3 @@ class APCBagOStuff extends BagOStuff {
                return $keys;
        }
 }
-
index e6ba042..57029a8 100644 (file)
@@ -153,6 +153,7 @@ abstract class BagOStuff {
        /**
         * @param $key string
         * @param $value mixed
+        * @param $exptime int
         * @return bool success
         */
        public function replace( $key, $value, $exptime = 0 ) {
@@ -163,10 +164,11 @@ abstract class BagOStuff {
        }
 
        /**
+        * Increase stored value of $key by $value while preserving its TTL
         * @param $key String: Key to increase
         * @param $value Integer: Value to add to $key (Default 1)
         * @return null if lock is not possible else $key value increased by $value
-        * @return success
+        * @return integer
         */
        public function incr( $key, $value = 1 ) {
                if ( !$this->lock( $key ) ) {
@@ -185,9 +187,10 @@ abstract class BagOStuff {
        }
 
        /**
+        * Decrease stored value of $key by $value while preserving its TTL
         * @param $key String
         * @param $value Integer
-        * @return bool success
+        * @return integer
         */
        public function decr( $key, $value = 1 ) {
                return $this->incr( $key, - $value );
@@ -215,4 +218,33 @@ abstract class BagOStuff {
                        return $exptime;
                }
        }
+
+       /**
+        * Convert an optionally absolute expiry time to a relative time. If an 
+        * absolute time is specified which is in the past, use a short expiry time.
+        *
+        * @param $exptime integer
+        * @return integer
+        */
+       protected function convertToRelative( $exptime ) {
+               if ( $exptime >= 86400 * 3650 /* 10 years */ ) {
+                       $exptime -= time();
+                       if ( $exptime <= 0 ) {
+                               $exptime = 1;
+                       }
+                       return $exptime;
+               } else {
+                       return $exptime;
+               }
+       }
+
+       /**
+        * Check if a value is an integer
+        *
+        * @param $value mixed
+        * @return bool
+        */
+       protected function isInteger( $value ) {
+               return ( is_int( $value ) || ctype_digit( $value ) );
+       }
 }
index 63ad4de..264aed7 100644 (file)
@@ -35,6 +35,9 @@
 class DBABagOStuff extends BagOStuff {
        var $mHandler, $mFile, $mReader, $mWriter, $mDisabled;
 
+       /**
+        * @param $params array
+        */
        public function __construct( $params ) {
                global $wgDBAhandler;
 
@@ -42,8 +45,7 @@ class DBABagOStuff extends BagOStuff {
                        $params['dir'] = wfTempDir();
                }
 
-               $this->mFile = $params['dir']."/mw-cache-" . wfWikiID();
-               $this->mFile .= '.db';
+               $this->mFile = $params['dir'] . '/mw-cache-' . wfWikiID() . '.db';
                wfDebug( __CLASS__ . ": using cache file {$this->mFile}\n" );
                $this->mHandler = $wgDBAhandler;
        }
@@ -55,7 +57,7 @@ class DBABagOStuff extends BagOStuff {
         *
         * @return string
         */
-       function encode( $value, $expiry ) {
+       protected function encode( $value, $expiry ) {
                # Convert to absolute time
                $expiry = $this->convertExpiry( $expiry );
 
@@ -63,9 +65,10 @@ class DBABagOStuff extends BagOStuff {
        }
 
        /**
+        * @param $blob string
         * @return array list containing value first and expiry second
         */
-       function decode( $blob ) {
+       protected function decode( $blob ) {
                if ( !is_string( $blob ) ) {
                        return array( null, 0 );
                } else {
@@ -76,7 +79,10 @@ class DBABagOStuff extends BagOStuff {
                }
        }
 
-       function getReader() {
+       /**
+        * @return resource
+        */
+       protected function getReader() {
                if ( file_exists( $this->mFile ) ) {
                        $handle = dba_open( $this->mFile, 'rl', $this->mHandler );
                } else {
@@ -90,7 +96,10 @@ class DBABagOStuff extends BagOStuff {
                return $handle;
        }
 
-       function getWriter() {
+       /**
+        * @return resource
+        */
+       protected function getWriter() {
                $handle = dba_open( $this->mFile, 'cl', $this->mHandler );
 
                if ( !$handle ) {
@@ -100,7 +109,11 @@ class DBABagOStuff extends BagOStuff {
                return $handle;
        }
 
-       function get( $key ) {
+       /**
+        * @param $key string
+        * @return mixed|null|string
+        */
+       public function get( $key ) {
                wfProfileIn( __METHOD__ );
                wfDebug( __METHOD__ . "($key)\n" );
 
@@ -129,7 +142,13 @@ class DBABagOStuff extends BagOStuff {
                return $val;
        }
 
-       function set( $key, $value, $exptime = 0 ) {
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime int
+        * @return bool
+        */
+       public function set( $key, $value, $exptime = 0 ) {
                wfProfileIn( __METHOD__ );
                wfDebug( __METHOD__ . "($key)\n" );
 
@@ -148,7 +167,12 @@ class DBABagOStuff extends BagOStuff {
                return $ret;
        }
 
-       function delete( $key, $time = 0 ) {
+       /**
+        * @param $key string
+        * @param $time int
+        * @return bool
+        */
+       public function delete( $key, $time = 0 ) {
                wfProfileIn( __METHOD__ );
                wfDebug( __METHOD__ . "($key)\n" );
 
@@ -165,7 +189,13 @@ class DBABagOStuff extends BagOStuff {
                return $ret;
        }
 
-       function add( $key, $value, $exptime = 0 ) {
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime int
+        * @return bool
+        */
+       public function add( $key, $value, $exptime = 0 ) {
                wfProfileIn( __METHOD__ );
 
                $blob = $this->encode( $value, $exptime );
@@ -183,7 +213,7 @@ class DBABagOStuff extends BagOStuff {
                if ( !$ret ) {
                        list( $value, $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
 
-                       if ( $expiry < time() ) {
+                       if ( $expiry && $expiry < time() ) {
                                # Yes expired, delete and try again
                                dba_delete( $key, $handle );
                                $ret = dba_insert( $key, $blob, $handle );
@@ -197,6 +227,44 @@ class DBABagOStuff extends BagOStuff {
                return $ret;
        }
 
+       /**
+        * @param $key string
+        * @param $step integer
+        * @return integer|bool
+        */
+       public function incr( $key, $step = 1 ) {
+               wfProfileIn( __METHOD__ );
+
+               $handle = $this->getWriter();
+
+               if ( !$handle ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               list( $value, $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
+               if ( !is_null( $value ) ) {
+                       if ( $expiry && $expiry < time() ) {
+                               # Key is expired, delete it
+                               dba_delete( $key, $handle );
+                               wfDebug( __METHOD__ . ": $key expired\n" );
+                               $value = null;
+                       } else {
+                               $value += $step;
+                               $blob = $this->encode( $value, $expiry );
+
+                               $ret = dba_replace( $key, $blob, $handle );
+                               $value = $ret ? $value : null;
+                       }
+               }
+
+               dba_close( $handle );
+
+               wfProfileOut( __METHOD__ );
+
+               return is_null( $value ) ? false : (int)$value;
+       }
+
        function keys() {
                $reader = $this->getReader();
                $k1 = dba_firstkey( $reader );
@@ -216,4 +284,3 @@ class DBABagOStuff extends BagOStuff {
                return $result;
        }
 }
-
index fb31d5c..f86cf15 100644 (file)
@@ -33,6 +33,9 @@ class EhcacheBagOStuff extends BagOStuff {
        
        var $curls = array();
 
+       /**
+        * @param $params array
+        */
        function __construct( $params ) {
                if ( !defined( 'CURLOPT_TIMEOUT_MS' ) ) {
                        throw new MWException( __CLASS__.' requires curl version 7.16.2 or later.' );
@@ -59,6 +62,10 @@ class EhcacheBagOStuff extends BagOStuff {
                );
        }
 
+       /**
+        * @param $key string
+        * @return bool|mixed
+        */
        public function get( $key ) {
                wfProfileIn( __METHOD__ );
                $response = $this->doItemRequest( $key );
@@ -93,6 +100,12 @@ class EhcacheBagOStuff extends BagOStuff {
                return $data;
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $expiry int
+        * @return bool
+        */
        public function set( $key, $value, $expiry = 0 ) {
                wfProfileIn( __METHOD__ );
                $expiry = $this->convertExpiry( $expiry );
@@ -130,6 +143,11 @@ class EhcacheBagOStuff extends BagOStuff {
                return $result;
        }
 
+       /**
+        * @param $key string
+        * @param $time int
+        * @return bool
+        */
        public function delete( $key, $time = 0 ) {
                wfProfileIn( __METHOD__ );
                $response = $this->doItemRequest( $key,
@@ -145,6 +163,10 @@ class EhcacheBagOStuff extends BagOStuff {
                return $result;
        }
 
+       /**
+        * @param $key string
+        * @return string
+        */
        protected function getCacheUrl( $key ) {
                if ( count( $this->servers ) == 1 ) {
                        $server = reset( $this->servers );
@@ -172,6 +194,13 @@ class EhcacheBagOStuff extends BagOStuff {
                return $this->curls[$cacheUrl];
        }
 
+       /**
+        * @param $key string
+        * @param $data
+        * @param $type
+        * @param $ttl
+        * @return int
+        */
        protected function attemptPut( $key, $data, $type, $ttl ) {
                // In initial benchmarking, it was 30 times faster to use CURLOPT_POST 
                // than CURLOPT_UPLOAD with CURLOPT_READFUNCTION. This was because
@@ -196,6 +225,10 @@ class EhcacheBagOStuff extends BagOStuff {
                }
        }
 
+       /**
+        * @param $key string
+        * @return bool
+        */
        protected function createCache( $key ) {
                wfDebug( __METHOD__.": creating cache for $key\n" );
                $response = $this->doCacheRequest( $key, 
@@ -208,21 +241,26 @@ class EhcacheBagOStuff extends BagOStuff {
                        wfDebug( __CLASS__.": failed to create cache for $key\n" );
                        return false;
                }
-               if ( $response['http_code'] == 201 /* created */ 
-                       || $response['http_code'] == 409 /* already there */ ) 
-               {
-                       return true;
-               } else {
-                       return false;
-               }                       
+               return ( $response['http_code'] == 201 /* created */
+                       || $response['http_code'] == 409 /* already there */ );
        }
 
+       /**
+        * @param $key string
+        * @param $curlOptions array
+        * @return array|bool|mixed
+        */
        protected function doCacheRequest( $key, $curlOptions = array() ) {
                $cacheUrl = $this->getCacheUrl( $key );
                $curl = $this->getCurl( $cacheUrl );
                return $this->doRequest( $curl, $cacheUrl, $curlOptions );
        }
 
+       /**
+        * @param $key string
+        * @param $curlOptions array
+        * @return array|bool|mixed
+        */
        protected function doItemRequest( $key, $curlOptions = array() ) {
                $cacheUrl = $this->getCacheUrl( $key );
                $curl = $this->getCurl( $cacheUrl );
@@ -230,6 +268,13 @@ class EhcacheBagOStuff extends BagOStuff {
                return $this->doRequest( $curl, $url, $curlOptions );
        }
 
+       /**
+        * @param $curl
+        * @param $url string
+        * @param $curlOptions array
+        * @return array|bool|mixed
+        * @throws MWException
+        */
        protected function doRequest( $curl, $url, $curlOptions = array() ) {
                if ( array_diff_key( $curlOptions, $this->curlOptions ) ) {
                        // var_dump( array_diff_key( $curlOptions, $this->curlOptions ) );
index abc6bcf..bd28b24 100644 (file)
  * @ingroup Cache
  */
 class EmptyBagOStuff extends BagOStuff {
+
+       /**
+        * @param $key string
+        * @return bool
+        */
        function get( $key ) {
                return false;
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exp int
+        * @return bool
+        */
        function set( $key, $value, $exp = 0 ) {
                return true;
        }
 
+       /**
+        * @param $key string
+        * @param $time int
+        * @return bool
+        */
        function delete( $key, $time = 0 ) {
                return true;
        }
index 26b949f..799f26a 100644 (file)
@@ -34,6 +34,10 @@ class HashBagOStuff extends BagOStuff {
                $this->bag = array();
        }
 
+       /**
+        * @param $key string
+        * @return bool
+        */
        protected function expire( $key ) {
                $et = $this->bag[$key][1];
 
@@ -46,6 +50,10 @@ class HashBagOStuff extends BagOStuff {
                return true;
        }
 
+       /**
+        * @param $key string
+        * @return bool|mixed
+        */
        function get( $key ) {
                if ( !isset( $this->bag[$key] ) ) {
                        return false;
@@ -58,10 +66,22 @@ class HashBagOStuff extends BagOStuff {
                return $this->bag[$key][0];
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime int
+        * @return bool
+        */
        function set( $key, $value, $exptime = 0 ) {
                $this->bag[$key] = array( $value, $this->convertExpiry( $exptime ) );
+               return true;
        }
 
+       /**
+        * @param $key string
+        * @param $time int
+        * @return bool
+        */
        function delete( $key, $time = 0 ) {
                if ( !isset( $this->bag[$key] ) ) {
                        return false;
@@ -72,6 +92,9 @@ class HashBagOStuff extends BagOStuff {
                return true;
        }
 
+       /**
+        * @return array
+        */
        function keys() {
                return array_keys( $this->bag );
        }
index 1312866..813c272 100644 (file)
@@ -50,7 +50,7 @@ class MemcachedBagOStuff extends BagOStuff {
                        $params['timeout'] = $GLOBALS['wgMemCachedTimeout'];
                }
                if ( !isset( $params['connect_timeout'] ) ) {
-                       $params['connect_timeout'] = 0.1;
+                       $params['connect_timeout'] = 0.5;
                }
                return $params;
        }
@@ -86,6 +86,7 @@ class MemcachedBagOStuff extends BagOStuff {
        /**
         * @param $key string
         * @param $value int
+        * @param $exptime int (default 0)
         * @return Mixed
         */
        public function add( $key, $value, $exptime = 0 ) {
@@ -119,6 +120,7 @@ class MemcachedBagOStuff extends BagOStuff {
         * the other control characters for compatibility with libmemcached
         * verify_key. We leave other punctuation alone, to maximise backwards
         * compatibility.
+        * @param $key string
         * @return string
         */
        public function encodeKey( $key ) {
@@ -126,6 +128,10 @@ class MemcachedBagOStuff extends BagOStuff {
                        array( $this, 'encodeKeyCallback' ), $key );
        }
 
+       /**
+        * @param $m array
+        * @return string
+        */
        protected function encodeKeyCallback( $m ) {
                return rawurlencode( $m[0] );
        }
index 9602ffe..536ba6e 100644 (file)
@@ -259,7 +259,7 @@ class MWMemcached {
                $this->_host_dead = array();
 
                $this->_timeout_seconds = 0;
-               $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 100000;
+               $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 500000;
 
                $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
                $this->_connect_attempts = 2;
@@ -330,11 +330,10 @@ class MWMemcached {
                        $this->stats['delete'] = 1;
                }
                $cmd = "delete $key $time\r\n";
-               if( !$this->_safe_fwrite( $sock, $cmd, strlen( $cmd ) ) ) {
-                       $this->_dead_sock( $sock );
+               if( !$this->_fwrite( $sock, $cmd ) ) {
                        return false;
                }
-               $res = trim( fgets( $sock ) );
+               $res = $this->_fgets( $sock );
 
                if ( $this->_debug ) {
                        $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
@@ -439,8 +438,7 @@ class MWMemcached {
                }
 
                $cmd = "get $key\r\n";
-               if ( !$this->_safe_fwrite( $sock, $cmd, strlen( $cmd ) ) ) {
-                       $this->_dead_sock( $sock );
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
                        wfProfileOut( __METHOD__ );
                        return false;
                }
@@ -491,25 +489,23 @@ class MWMemcached {
                        }
                        $key = is_array( $key ) ? $key[1] : $key;
                        if ( !isset( $sock_keys[$sock] ) ) {
-                               $sock_keys[$sock] = array();
+                               $sock_keys[ intval( $sock ) ] = array();
                                $socks[] = $sock;
                        }
-                       $sock_keys[$sock][] = $key;
+                       $sock_keys[ intval( $sock ) ][] = $key;
                }
 
                $gather = array();
                // Send out the requests
                foreach ( $socks as $sock ) {
                        $cmd = 'get';
-                       foreach ( $sock_keys[$sock] as $key ) {
+                       foreach ( $sock_keys[ intval( $sock ) ] as $key ) {
                                $cmd .= ' ' . $key;
                        }
                        $cmd .= "\r\n";
 
-                       if ( $this->_safe_fwrite( $sock, $cmd, strlen( $cmd ) ) ) {
+                       if ( $this->_fwrite( $sock, $cmd ) ) {
                                $gather[] = $sock;
-                       } else {
-                               $this->_dead_sock( $sock );
                        }
                }
 
@@ -572,12 +568,6 @@ class MWMemcached {
         * Passes through $cmd to the memcache server connected by $sock; returns
         * output as an array (null array if no output)
         *
-        * NOTE: due to a possible bug in how PHP reads while using fgets(), each
-        *       line may not be terminated by a \r\n.  More specifically, my testing
-        *       has shown that, on FreeBSD at least, each line is terminated only
-        *       with a \n.  This is with the PHP flag auto_detect_line_endings set
-        *       to falase (the default).
-        *
         * @param $sock Resource: socket to send command on
         * @param $cmd String: command to run
         *
@@ -588,13 +578,13 @@ class MWMemcached {
                        return array();
                }
 
-               if ( !$this->_safe_fwrite( $sock, $cmd, strlen( $cmd ) ) ) {
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
                        return array();
                }
 
                $ret = array();
                while ( true ) {
-                       $res = fgets( $sock );
+                       $res = $this->_fgets( $sock );
                        $ret[] = $res;
                        if ( preg_match( '/^END/', $res ) ) {
                                break;
@@ -731,15 +721,19 @@ class MWMemcached {
                        wfRestoreWarnings();
                }
                if ( !$sock ) {
-                       if ( $this->_debug ) {
-                               $this->_debugprint( "Error connecting to $host: $errstr\n" );
-                       }
+                       $this->_error_log( "Error connecting to $host: $errstr\n" );
+                       $this->_dead_host( $host );
                        return false;
                }
 
                // Initialise timeout
                stream_set_timeout( $sock, $this->_timeout_seconds, $this->_timeout_microseconds );
 
+               // If the connection was persistent, flush the read buffer in case there
+               // was a previous incomplete request on this connection
+               if ( $this->_persistent ) {
+                       $this->_flush_read_buffer( $sock );
+               }
                return true;
        }
 
@@ -786,7 +780,6 @@ class MWMemcached {
                }
 
                if ( $this->_single_sock !== null ) {
-                       $this->_flush_read_buffer( $this->_single_sock );
                        return $this->sock_to_host( $this->_single_sock );
                }
 
@@ -811,7 +804,6 @@ class MWMemcached {
                        $host = $this->_buckets[$hv % $this->_bucketcount];
                        $sock = $this->sock_to_host( $host );
                        if ( is_resource( $sock ) ) {
-                               $this->_flush_read_buffer( $sock );
                                return $sock;
                        }
                        $hv = $this->_hashfunc( $hv . $realkey );
@@ -867,12 +859,11 @@ class MWMemcached {
                } else {
                        $this->stats[$cmd] = 1;
                }
-               if ( !$this->_safe_fwrite( $sock, "$cmd $key $amt\r\n" ) ) {
-                       $this->_dead_sock( $sock );
+               if ( !$this->_fwrite( $sock, "$cmd $key $amt\r\n" ) ) {
                        return null;
                }
 
-               $line = fgets( $sock );
+               $line = $this->_fgets( $sock );
                $match = array();
                if ( !preg_match( '/^(\d+)/', $line, $match ) ) {
                        return null;
@@ -888,59 +879,42 @@ class MWMemcached {
         *
         * @param $sock Resource: socket to read from
         * @param $ret Array: returned values
+        * @return boolean True for success, false for failure
         *
-        * @return bool|int
         * @access private
         */
        function _load_items( $sock, &$ret ) {
                while ( 1 ) {
-                       $decl = fgets( $sock );
-                       if ( $decl == "END\r\n" ) {
+                       $decl = $this->_fgets( $sock );
+                       if( $decl === false ) {
+                               return false;
+                       } elseif ( $decl == "END" ) {
                                return true;
-                       } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+)\r\n$/', $decl, $match ) ) {
+                       } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+)$/', $decl, $match ) ) {
                                list( $rkey, $flags, $len ) = array( $match[1], $match[2], $match[3] );
-                               $bneed = $len + 2;
-                               $offset = 0;
-
-                               while ( $bneed > 0 ) {
-                                       $data = fread( $sock, $bneed );
-                                       $n = strlen( $data );
-                                       if ( $n == 0 ) {
-                                               break;
-                                       }
-                                       $offset += $n;
-                                       $bneed -= $n;
-                                       if ( isset( $ret[$rkey] ) ) {
-                                               $ret[$rkey] .= $data;
-                                       } else {
-                                               $ret[$rkey] = $data;
-                                       }
+                               $data = $this->_fread( $sock, $len + 2 );
+                               if ( $data === false ) {
+                                       return false;
                                }
-
-                               if ( $offset != $len + 2 ) {
-                                       // Something is borked!
-                                       if ( $this->_debug ) {
-                                               $this->_debugprint( sprintf( "Something is borked!  key %s expecting %d got %d length\n", $rkey, $len + 2, $offset ) );
-                                       }
-
-                                       unset( $ret[$rkey] );
-                                       $this->_close_sock( $sock );
+                               if ( substr( $data, -2 ) !== "\r\n" ) {
+                                       $this->_handle_error( $sock, 
+                                               'line ending missing from data block from $1' );
                                        return false;
                                }
+                               $data = substr( $data, 0, -2 );
+                               $ret[$rkey] = $data;
 
                                if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
                                        $ret[$rkey] = gzuncompress( $ret[$rkey] );
                                }
 
-                               $ret[$rkey] = rtrim( $ret[$rkey] );
-
                                if ( $flags & self::SERIALIZED ) {
                                        $ret[$rkey] = unserialize( $ret[$rkey] );
                                }
 
                        } else {
-                               $this->_debugprint( "Error parsing memcached response\n" );
-                               return 0;
+                               $this->_handle_error( $sock, 'Error parsing response from $1' );
+                               return false;
                        }
                }
        }
@@ -1006,12 +980,11 @@ class MWMemcached {
                                $flags |= self::COMPRESSED;
                        }
                }
-               if ( !$this->_safe_fwrite( $sock, "$cmd $key $flags $exp $len\r\n$val\r\n" ) ) {
-                       $this->_dead_sock( $sock );
+               if ( !$this->_fwrite( $sock, "$cmd $key $flags $exp $len\r\n$val\r\n" ) ) {
                        return false;
                }
 
-               $line = trim( fgets( $sock ) );
+               $line = $this->_fgets( $sock );
 
                if ( $this->_debug ) {
                        $this->_debugprint( sprintf( "%s %s (%s)\n", $cmd, $key, $line ) );
@@ -1048,7 +1021,6 @@ class MWMemcached {
                }
 
                if ( !$this->_connect_sock( $sock, $host ) ) {
-                       $this->_dead_host( $host );
                        return null;
                }
 
@@ -1061,51 +1033,130 @@ class MWMemcached {
        }
 
        /**
-        * @param $str string
+        * @param $text string
+        */
+       function _debugprint( $text ) {
+               global $wgDebugLogGroups;
+               if( !isset( $wgDebugLogGroups['memcached'] ) ) {
+                       # Prefix message since it will end up in main debug log file
+                       $text = "memcached: $text";
+               }
+               wfDebugLog( 'memcached', $text );
+       }
+
+       /**
+        * @param $text string
         */
-       function _debugprint( $str ) {
-               print( $str );
+       function _error_log( $text ) {
+               wfDebugLog( 'memcached-serious', "Memcached error: $text" );
        }
 
        /**
-        * Write to a stream, timing out after the correct amount of time
+        * Write to a stream. If there is an error, mark the socket dead.
         *
-        * @return Boolean: false on failure, true on success
+        * @param $sock The socket
+        * @param $buf The string to write
+        * @return bool True on success, false on failure
         */
-       /*
-       function _safe_fwrite( $f, $buf, $len = false ) {
-               stream_set_blocking( $f, 0 );
+       function _fwrite( $sock, $buf ) {
+               $bytesWritten = 0;
+               $bufSize = strlen( $buf );
+               while ( $bytesWritten < $bufSize  ) {
+                       $result = fwrite( $sock, $buf );
+                       $data = stream_get_meta_data( $sock );
+                       if ( $data['timed_out'] ) {
+                               $this->_handle_error( $sock, 'timeout writing to $1' );
+                               return false;
+                       }
+                       // Contrary to the documentation, fwrite() returns zero on error in PHP 5.3.
+                       if ( $result === false || $result === 0 ) {
+                               $this->_handle_error( $sock, 'error writing to $1' );
+                               return false;
+                       }
+                       $bytesWritten += $result;
+               }
 
-               if ( $len === false ) {
-                       wfDebug( "Writing " . strlen( $buf ) . " bytes\n" );
-                       $bytesWritten = fwrite( $f, $buf );
-               } else {
-                       wfDebug( "Writing $len bytes\n" );
-                       $bytesWritten = fwrite( $f, $buf, $len );
+               return true;
+       }
+
+       /**
+        * Handle an I/O error. Mark the socket dead and log an error.
+        */
+       function _handle_error( $sock, $msg ) {
+               $peer = stream_socket_get_name( $sock, true /** remote **/ );
+               if ( strval( $peer ) === '' ) {
+                       $peer = array_search( $sock, $this->_cache_sock );
+                       if ( $peer === false ) {
+                               $peer = '[unknown host]';
+                       }
                }
-               $n = stream_select( $r = null, $w = array( $f ), $e = null, 10, 0 );
-               #   $this->_timeout_seconds, $this->_timeout_microseconds );
+               $msg = str_replace( '$1', $peer, $msg );
+               $this->_error_log( "$msg\n" );
+               $this->_dead_sock( $sock );
+       }
 
-               wfDebug( "stream_select returned $n\n" );
-               stream_set_blocking( $f, 1 );
-               return $n == 1;
-               return $bytesWritten;
-       }*/
+       /**
+        * Read the specified number of bytes from a stream. If there is an error, 
+        * mark the socket dead.
+        *
+        * @param $sock The socket
+        * @param $len The number of bytes to read
+        * @return The string on success, false on failure.
+        */
+       function _fread( $sock, $len ) {
+               $buf = '';
+               while ( $len > 0 ) {
+                       $result = fread( $sock, $len );
+                       $data = stream_get_meta_data( $sock );
+                       if ( $data['timed_out'] ) {
+                               $this->_handle_error( $sock, 'timeout reading from $1' );
+                               return false;
+                       }
+                       if ( $result === false ) {
+                               $this->_handle_error( $sock, 'error reading buffer from $1' );
+                               return false;
+                       }
+                       if ( $result === '' ) {
+                               // This will happen if the remote end of the socket is shut down
+                               $this->_handle_error( $sock, 'unexpected end of file reading from $1' );
+                               return false;
+                       }
+                       $len -= strlen( $result );
+                       $buf .= $result;
+               }
+               return $buf;
+       }
 
        /**
-        * Original behaviour
-        * @param $f
-        * @param $buf
-        * @param $len bool
-        * @return int
+        * Read a line from a stream. If there is an error, mark the socket dead.
+        * The \r\n line ending is stripped from the response.
+        *
+        * @param $sock The socket
+        * @return The string on success, false on failure
         */
-       function _safe_fwrite( $f, $buf, $len = false ) {
-               if ( $len === false ) {
-                       $bytesWritten = fwrite( $f, $buf );
+       function _fgets( $sock ) {
+               $result = fgets( $sock );
+               // fgets() may return a partial line if there is a select timeout after
+               // a successful recv(), so we have to check for a timeout even if we 
+               // got a string response.
+               $data = stream_get_meta_data( $sock );
+               if ( $data['timed_out'] ) {
+                       $this->_handle_error( $sock, 'timeout reading line from $1' );
+                       return false;
+               }
+               if ( $result === false ) {
+                       $this->_handle_error( $sock, 'error reading line from $1' );
+                       return false;
+               }
+               if ( substr( $result, -2 ) === "\r\n" ) {
+                       $result = substr( $result, 0, -2 );
+               } elseif ( substr( $result, -1 ) === "\n" ) {
+                       $result = substr( $result, 0, -1 );
                } else {
-                       $bytesWritten = fwrite( $f, $buf, $len );
+                       $this->_handle_error( $sock, 'line ending missing in response from $1' );
+                       return false;
                }
-               return $bytesWritten;
+               return $result;
        }
 
        /**
@@ -1128,18 +1179,8 @@ class MWMemcached {
        // }}}
 }
 
-// vim: sts=3 sw=3 et
 
 // }}}
 
 class MemCachedClientforWiki extends MWMemcached {
-
-       function _debugprint( $text ) {
-               global $wgDebugLogGroups;
-               if( !isset( $wgDebugLogGroups['memcached'] ) ) {
-                       # Prefix message since it will end up in main debug log file
-                       $text = "memcached: $text";
-               }
-               wfDebugLog( 'memcached', $text );
-       }
 }
index 65d736a..76886eb 100644 (file)
@@ -141,6 +141,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        /**
         * @param $key string
         * @param $value int
+        * @param $exptime int
         * @return Mixed
         */
        public function add( $key, $value, $exptime = 0 ) {
@@ -188,8 +189,9 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * the client, but some day we might find a case where it should be
         * different.
         *
-        * @param $key The key used by the caller, or false if there wasn't one.
-        * @param $result The return value
+        * @param $key string The key used by the caller, or false if there wasn't one.
+        * @param $result Mixed The return value
+        * @return Mixed
         */
        protected function checkResult( $key, $result ) {
                if ( $result !== false ) {
index c562134..a46dc71 100644 (file)
@@ -68,7 +68,7 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
        /**
         * @param $key
         * @param $timeout int
-        * @return
+        * @return bool
         */
        public function lock( $key, $timeout = 0 ) {
                return $this->client->lock( $this->encodeKey( $key ), $timeout );
index fd60e72..e496ddd 100644 (file)
@@ -34,11 +34,12 @@ class MultiWriteBagOStuff extends BagOStuff {
        /**
         * Constructor. Parameters are:
         *
-        *   - caches:   This should have a numbered array of cache parameter 
+        *   - caches:   This should have a numbered array of cache parameter
         *               structures, in the style required by $wgObjectCaches. See
         *               the documentation of $wgObjectCaches for more detail.
         *
         * @param $params array
+        * @throws MWException
         */
        public function __construct( $params ) {
                if ( !isset( $params['caches'] ) ) {
@@ -51,10 +52,17 @@ class MultiWriteBagOStuff extends BagOStuff {
                }
        }
 
+       /**
+        * @param $debug bool
+        */
        public function setDebug( $debug ) {
                $this->doWrite( 'setDebug', $debug );
        }
 
+       /**
+        * @param $key string
+        * @return bool|mixed
+        */
        public function get( $key ) {
                foreach ( $this->caches as $cache ) {
                        $value = $cache->get( $key );
@@ -65,30 +73,68 @@ class MultiWriteBagOStuff extends BagOStuff {
                return false;
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime int
+        * @return bool
+        */
        public function set( $key, $value, $exptime = 0 ) {
                return $this->doWrite( 'set', $key, $value, $exptime );
        }
 
+       /**
+        * @param $key string
+        * @param $time int
+        * @return bool
+        */
        public function delete( $key, $time = 0 ) {
                return $this->doWrite( 'delete', $key, $time );
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime int
+        * @return bool
+        */
        public function add( $key, $value, $exptime = 0 ) {
                return $this->doWrite( 'add', $key, $value, $exptime );
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime int
+        * @return bool
+        */
        public function replace( $key, $value, $exptime = 0 ) {
                return $this->doWrite( 'replace', $key, $value, $exptime );
        }
 
+       /**
+        * @param $key string
+        * @param $value int
+        * @return bool|null
+        */
        public function incr( $key, $value = 1 ) {
                return $this->doWrite( 'incr', $key, $value );
        }
 
+       /**
+        * @param $key string
+        * @param $value int
+        * @return bool
+        */
        public function decr( $key, $value = 1 ) {
                return $this->doWrite( 'decr', $key, $value );
-       }       
+       }
 
+       /**
+        * @param $key string
+        * @param $timeout int
+        * @return bool
+        */
        public function lock( $key, $timeout = 0 ) {
                // Lock only the first cache, to avoid deadlocks
                if ( isset( $this->caches[0] ) ) {
@@ -98,6 +144,10 @@ class MultiWriteBagOStuff extends BagOStuff {
                }
        }
 
+       /**
+        * @param $key string
+        * @return bool
+        */
        public function unlock( $key ) {
                if ( isset( $this->caches[0] ) ) {
                        return $this->caches[0]->unlock( $key );
@@ -106,6 +156,10 @@ class MultiWriteBagOStuff extends BagOStuff {
                }
        }
 
+       /**
+        * @param $method string
+        * @return bool
+        */
        protected function doWrite( $method /*, ... */ ) {
                $ret = true;
                $args = func_get_args();
@@ -120,9 +174,11 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * Delete objects expiring before a certain date. 
+        * Delete objects expiring before a certain date.
         *
         * Succeed if any of the child caches succeed.
+        * @param $date string
+        * @param $progressCallback bool|callback
         * @return bool
         */
        public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
index 2e00e16..9b360f3 100644 (file)
@@ -32,9 +32,9 @@ class ObjectCache {
        /**
         * Get a cached instance of the specified type of cache object.
         *
-        * @param $id
+        * @param $id string
         *
-        * @return object
+        * @return ObjectCache
         */
        static function getInstance( $id ) {
                if ( isset( self::$instances[$id] ) ) {
@@ -56,8 +56,9 @@ class ObjectCache {
        /**
         * Create a new cache object of the specified type.
         *
-        * @param $id
+        * @param $id string
         *
+        * @throws MWException
         * @return ObjectCache
         */
        static function newFromId( $id ) {
@@ -76,6 +77,7 @@ class ObjectCache {
         *
         * @param $params array
         *
+        * @throws MWException
         * @return ObjectCache
         */
        static function newFromParams( $params ) {
@@ -99,6 +101,8 @@ class ObjectCache {
         * be an alias to the configured cache choice for that.
         * If no cache choice is configured (by default $wgMainCacheType is CACHE_NONE),
         * then CACHE_ANYTHING will forward to CACHE_DB.
+        * @param $params array
+        * @return ObjectCache
         */
        static function newAnything( $params ) {
                global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
@@ -114,6 +118,8 @@ class ObjectCache {
        /**
         * Factory function referenced from DefaultSettings.php for CACHE_ACCEL.
         *
+        * @param $params array
+        * @throws MWException
         * @return ObjectCache
         */
        static function newAccelerator( $params ) {
diff --git a/includes/objectcache/ObjectCacheSessionHandler.php b/includes/objectcache/ObjectCacheSessionHandler.php
new file mode 100644 (file)
index 0000000..e6c6881
--- /dev/null
@@ -0,0 +1,138 @@
+<?php
+/*
+ * Session storage in object cache.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+class ObjectCacheSessionHandler {
+       /**
+        * Install a session handler for the current web request
+        */
+       static function install() {
+               session_set_save_handler(
+                       array( __CLASS__, 'open' ),
+                       array( __CLASS__, 'close' ),
+                       array( __CLASS__, 'read' ),
+                       array( __CLASS__, 'write' ),
+                       array( __CLASS__, 'destroy' ),
+                       array( __CLASS__, 'gc' ) );
+
+               // It's necessary to register a shutdown function to call session_write_close(),
+               // because by the time the request shutdown function for the session module is
+               // called, $wgMemc has already been destroyed. Shutdown functions registered
+               // this way are called before object destruction.
+               register_shutdown_function( array( __CLASS__, 'handleShutdown' ) );
+       }
+
+       /**
+        * Get the cache storage object to use for session storage
+        */
+       static function getCache() {
+               global $wgSessionCacheType;
+               return ObjectCache::getInstance( $wgSessionCacheType );
+       }
+
+       /**
+        * Get a cache key for the given session id.
+        *
+        * @param $id String: session id
+        * @return String: cache key
+        */
+       static function getKey( $id ) {
+               return wfMemcKey( 'session', $id );
+       }
+
+       /**
+        * Callback when opening a session.
+        *
+        * @param $save_path String: path used to store session files, unused
+        * @param $session_name String: session name
+        * @return Boolean: success
+        */
+       static function open( $save_path, $session_name ) {
+               return true;
+       }
+
+       /**
+        * Callback when closing a session.
+        * NOP.
+        *
+        * @return Boolean: success
+        */
+       static function close() {
+               return true;
+       }
+
+       /**
+        * Callback when reading session data.
+        *
+        * @param $id String: session id
+        * @return Mixed: session data
+        */
+       static function read( $id ) {
+               $data = self::getCache()->get( self::getKey( $id ) );
+               if( $data === false ) {
+                       return '';
+               }
+               return $data;
+       }
+
+       /**
+        * Callback when writing session data.
+        *
+        * @param $id String: session id
+        * @param $data Mixed: session data
+        * @return Boolean: success
+        */
+       static function write( $id, $data ) {
+               global $wgObjectCacheSessionExpiry;
+               self::getCache()->set( self::getKey( $id ), $data, $wgObjectCacheSessionExpiry );
+               return true;
+       }
+
+       /**
+        * Callback to destroy a session when calling session_destroy().
+        *
+        * @param $id String: session id
+        * @return Boolean: success
+        */
+       static function destroy( $id ) {
+               self::getCache()->delete( self::getKey( $id ) );
+               return true;
+       }
+
+       /**
+        * Callback to execute garbage collection.
+        * NOP: Object caches perform garbage collection implicitly
+        *
+        * @param $maxlifetime Integer: maximum session life time
+        * @return Boolean: success
+        */
+       static function gc( $maxlifetime ) {
+               return true;
+       }
+
+       /**
+        * Shutdown function. See the comment inside ObjectCacheSessionHandler::install 
+        * for rationale.
+        */
+       static function handleShutdown() {
+               session_write_close();
+       }
+}
diff --git a/includes/objectcache/RedisBagOStuff.php b/includes/objectcache/RedisBagOStuff.php
new file mode 100644 (file)
index 0000000..67a3337
--- /dev/null
@@ -0,0 +1,392 @@
+<?php
+
+class RedisBagOStuff extends BagOStuff {
+       protected $connectTimeout, $persistent, $password, $automaticFailover;
+
+       /**
+        * A list of server names, from $params['servers']
+        */
+       protected $servers;
+
+       /**
+        * A cache of Redis objects, representing connections to Redis servers. 
+        * The key is the server name.
+        */
+       protected $conns = array();
+
+       /**
+        * An array listing "dead" servers which have had a connection error in 
+        * the past. Servers are marked dead for a limited period of time, to 
+        * avoid excessive overhead from repeated connection timeouts. The key in
+        * the array is the server name, the value is the UNIX timestamp at which 
+        * the server is resurrected.
+        */
+       protected $deadServers = array();
+
+       /**
+        * Construct a RedisBagOStuff object. Parameters are:
+        *
+        *   - servers: An array of server names. A server name may be a hostname, 
+        *     a hostname/port combination or the absolute path of a UNIX socket.
+        *     If a hostname is specified but no port, the standard port number 
+        *     6379 will be used. Required.
+        *
+        *   - connectTimeout: The timeout for new connections, in seconds. Optional,
+        *     default is 1 second.
+        *
+        *   - persistent: Set this to true to allow connections to persist across
+        *     multiple web requests. False by default.
+        *
+        *   - password: The authentication password, will be sent to Redis in 
+        *     clear text. Optional, if it is unspecified, no AUTH command will be
+        *     sent.
+        *
+        *   - automaticFailover: If this is false, then each key will be mapped to
+        *     a single server, and if that server is down, any requests for that key
+        *     will fail. If this is true, a connection failure will cause the client
+        *     to immediately try the next server in the list (as determined by a 
+        *     consistent hashing algorithm). True by default. This has the 
+        *     potential to create consistency issues if a server is slow enough to 
+        *     flap, for example if it is in swap death.
+        */
+       function __construct( $params ) {
+               if ( !extension_loaded( 'redis' ) ) {
+                       throw new MWException( __CLASS__. ' requires the phpredis extension: ' .
+                               'https://github.com/nicolasff/phpredis' );
+               }
+
+               $this->servers = $params['servers'];
+               $this->connectTimeout = isset( $params['connectTimeout'] ) 
+                       ? $params['connectTimeout'] : 1;
+               $this->persistent = !empty( $params['persistent'] );
+               if ( isset( $params['password'] ) ) {
+                       $this->password = $params['password'];
+               }
+               if ( isset( $params['automaticFailover'] ) ) {
+                       $this->automaticFailover = $params['automaticFailover'];
+               } else {
+                       $this->automaticFailover = true;
+               }
+       }
+
+       public function get( $key ) {
+               wfProfileIn( __METHOD__ );
+               list( $server, $conn ) = $this->getConnection( $key );
+               if ( !$conn ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+               try {
+                       $result = $conn->get( $key );
+               } catch ( RedisException $e ) {
+                       $result = false;
+                       $this->handleException( $server, $e );
+               }
+               $this->logRequest( 'get', $key, $server, $result );
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       public function set( $key, $value, $expiry = 0 ) {
+               wfProfileIn( __METHOD__ );
+               list( $server, $conn ) = $this->getConnection( $key );
+               if ( !$conn ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+               $expiry = $this->convertToRelative( $expiry );
+               try {
+                       if ( !$expiry ) {
+                               // No expiry, that is very different from zero expiry in Redis
+                               $result = $conn->set( $key, $value );
+                       } else {
+                               $result = $conn->setex( $key, $expiry, $value );
+                       }
+               } catch ( RedisException $e ) {
+                       $result = false;
+                       $this->handleException( $server, $e );
+               }
+               
+               $this->logRequest( 'set', $key, $server, $result );
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       public function delete( $key, $time = 0 ) {
+               wfProfileIn( __METHOD__ );
+               list( $server, $conn ) = $this->getConnection( $key );
+               if ( !$conn ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+               try {
+                       $conn->delete( $key );
+                       // Return true even if the key didn't exist
+                       $result = true;
+               } catch ( RedisException $e ) {
+                       $result = false;
+                       $this->handleException( $server, $e );
+               }
+               $this->logRequest( 'delete', $key, $server, $result );
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       public function getMulti( array $keys ) {
+               wfProfileIn( __METHOD__ );
+               $batches = array();
+               $conns = array();
+               foreach ( $keys as $key ) {
+                       list( $server, $conn ) = $this->getConnection( $key );
+                       if ( !$conn ) {
+                               continue;
+                       }
+                       $conns[$server] = $conn;
+                       $batches[$server][] = $key;
+               }
+               $result = array();
+               foreach ( $batches as $server => $batchKeys ) {
+                       $conn = $conns[$server];
+                       try {
+                               $conn->multi( Redis::PIPELINE );
+                               foreach ( $batchKeys as $key ) {
+                                       $conn->get( $key );
+                               }
+                               $batchResult = $conn->exec();
+                               if ( $batchResult === false ) {
+                                       $this->debug( "multi request to $server failed" );
+                                       continue;
+                               }
+                               foreach ( $batchResult as $i => $value ) {
+                                       if ( $value !== false ) {
+                                               $result[$batchKeys[$i]] = $value;
+                                       }
+                               }
+                       } catch ( RedisException $e ) {
+                               $this->handleException( $server, $e );
+                       }
+               }
+
+               $this->debug( "getMulti for " . count( $keys ) . " keys " .
+                       "returned " . count( $result ) . " results" );
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       public function add( $key, $value, $expiry = 0 ) {
+               wfProfileIn( __METHOD__ );
+               list( $server, $conn ) = $this->getConnection( $key );
+               if ( !$conn ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+               $expiry = $this->convertToRelative( $expiry );
+               try {
+                       $result = $conn->setnx( $key, $value );
+                       if ( $result && $expiry ) {
+                               $conn->expire( $key, $expiry );
+                       }
+               } catch ( RedisException $e ) {
+                       $result = false;
+                       $this->handleException( $server, $e );
+               }
+               $this->logRequest( 'add', $key, $server, $result );
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       /**
+        * Non-atomic implementation of replace(). Could perhaps be done atomically 
+        * with WATCH or scripting, but this function is rarely used.
+        */
+       public function replace( $key, $value, $expiry = 0 ) {
+               wfProfileIn( __METHOD__ );
+               list( $server, $conn ) = $this->getConnection( $key );
+               if ( !$conn ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+               if ( !$conn->exists( $key ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               $expiry = $this->convertToRelative( $expiry );
+               try {
+                       if ( !$expiry ) {
+                               $result = $conn->set( $key, $value );
+                       } else {
+                               $result = $conn->setex( $key, $expiry, $value );
+                       }
+               } catch ( RedisException $e ) {
+                       $result = false;
+                       $this->handleException( $server, $e );
+               }
+                       
+               $this->logRequest( 'replace', $key, $server, $result );
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       /**
+        * Non-atomic implementation of incr(). 
+        *
+        * Probably all callers actually want incr() to atomically initialise 
+        * values to zero if they don't exist, as provided by the Redis INCR 
+        * command. But we are constrained by the memcached-like interface to 
+        * return null in that case. Once the key exists, further increments are 
+        * atomic.
+        */
+       public function incr( $key, $value = 1 ) {
+               wfProfileIn( __METHOD__ );
+               list( $server, $conn ) = $this->getConnection( $key );
+               if ( !$conn ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+               if ( !$conn->exists( $key ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return null;
+               }
+               try {
+                       $result = $conn->incrBy( $key, $value );
+               } catch ( RedisException $e ) {
+                       $result = false;
+                       $this->handleException( $server, $e );
+               }
+                       
+               $this->logRequest( 'incr', $key, $server, $result );
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       /**
+        * Get a Redis object with a connection suitable for fetching the specified key
+        */
+       protected function getConnection( $key ) {
+               if ( count( $this->servers ) === 1 ) {
+                       $candidates = $this->servers;
+               } else {
+                       // Use consistent hashing
+                       $hashes = array();
+                       foreach ( $this->servers as $server ) {
+                               $hashes[$server] = md5( $server . '/' . $key );
+                       }
+                       asort( $hashes );
+                       if ( !$this->automaticFailover ) {
+                               reset( $hashes );
+                               $candidates = array( key( $hashes ) );
+                       } else {
+                               $candidates = array_keys( $hashes );
+                       }
+               }
+
+               foreach ( $candidates as $server ) {
+                       $conn = $this->getConnectionToServer( $server );
+                       if ( $conn ) {
+                               return array( $server, $conn );
+                       }
+               }
+               return array( false, false );
+       }
+
+       /**
+        * Get a connection to the server with the specified name. Connections
+        * are cached, and failures are persistent to avoid multiple timeouts.
+        *
+        * @return Redis object, or false on failure
+        */
+       protected function getConnectionToServer( $server ) {
+               if ( isset( $this->deadServers[$server] ) ) {
+                       $now = time();
+                       if ( $now > $this->deadServers[$server] ) {
+                               // Dead time expired
+                               unset( $this->deadServers[$server] );
+                       } else {
+                               // Server is dead
+                               $this->debug( "server $server is marked down for another " .
+                                       ($this->deadServers[$server] - $now ) .
+                                       " seconds, can't get connection" );
+                               return false;
+                       }
+               }
+
+               if ( isset( $this->conns[$server] ) ) {
+                       return $this->conns[$server];
+               }
+
+               if ( substr( $server, 0, 1 ) === '/' ) {
+                       // UNIX domain socket
+                       // These are required by the redis extension to start with a slash, but 
+                       // we still need to set the port to a special value to make it work.
+                       $host = $server;
+                       $port = 0;
+               } else {
+                       // TCP connection
+                       $hostPort = IP::splitHostAndPort( $server );
+                       if ( !$hostPort ) {
+                               throw new MWException( __CLASS__.": invalid configured server \"$server\"" );
+                       }
+                       list( $host, $port ) = $hostPort;
+                       if ( $port === false ) {
+                               $port = 6379;
+                       }
+               }
+               $conn = new Redis;
+               try {
+                       if ( $this->persistent ) {
+                               $this->debug( "opening persistent connection to $host:$port" );
+                               $result = $conn->pconnect( $host, $port, $this->connectTimeout );
+                       } else {
+                               $this->debug( "opening non-persistent connection to $host:$port" );
+                               $result = $conn->connect( $host, $port, $this->connectTimeout );
+                       }
+                       if ( !$result ) {
+                               $this->logError( "could not connect to server $server" );
+                               // Mark server down for 30s to avoid further timeouts
+                               $this->deadServers[$server] = time() + 30;
+                               return false;
+                       }
+                       if ( $this->password !== null ) {
+                               if ( !$conn->auth( $this->password ) ) {
+                                       $this->logError( "authentication error connecting to $server" );
+                               }
+                       }
+               } catch ( RedisException $e ) {
+                       $this->deadServers[$server] = time() + 30;
+                       wfDebugLog( 'redis', "Redis exception: " . $e->getMessage() . "\n" );
+                       return false;
+               }
+
+               $conn->setOption( Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP );
+               $this->conns[$server] = $conn;
+               return $conn;
+       }
+
+       /**
+        * Log a fatal error
+        */
+       protected function logError( $msg ) {
+               wfDebugLog( 'redis', "Redis error: $msg\n" );
+       }
+
+       /**
+        * The redis extension throws an exception in response to various read, write
+        * and protocol errors. Sometimes it also closes the connection, sometimes 
+        * not. The safest response for us is to explicitly destroy the connection 
+        * object and let it be reopened during the next request.
+        */
+       protected function handleException( $server, $e ) {
+               wfDebugLog( 'redis', "Redis exception on server $server: " . $e->getMessage() . "\n" );
+               unset( $this->conns[$server] );
+       }
+
+       /**
+        * Send information about a single request to the debug log
+        */
+       public function logRequest( $method, $key, $server, $result ) {
+               $this->debug( "$method $key on $server: " . 
+                       ( $result === false ? "failure" : "success" ) );
+       }
+}
+
index 209975b..a3d2d89 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup Cache
  */
 class SqlBagOStuff extends BagOStuff {
-
        /**
         * @var LoadBalancer
         */
@@ -43,6 +42,9 @@ class SqlBagOStuff extends BagOStuff {
        var $shards = 1;
        var $tableName = 'objectcache';
 
+       protected $connFailureTime = 0; // UNIX timestamp
+       protected $connFailureError; // exception
+
        /**
         * Constructor. Parameters are:
         *   - server:   A server info structure in the format required by each
@@ -88,6 +90,12 @@ class SqlBagOStuff extends BagOStuff {
         */
        protected function getDB() {
                global $wgDebugDBTransactions;
+
+               # Don't keep timing out trying to connect for each call if the DB is down
+               if ( $this->connFailureError && ( time() - $this->connFailureTime ) < 60 ) {
+                       throw $this->connFailureError;
+               }
+
                if ( !isset( $this->db ) ) {
                        # If server connection info was given, use that
                        if ( $this->serverInfo ) {
@@ -107,7 +115,7 @@ class SqlBagOStuff extends BagOStuff {
                                if ( wfGetDB( DB_MASTER )->getType() == 'mysql' ) {
                                        $this->lb = wfGetLBFactory()->newMainLB();
                                        $this->db = $this->lb->getConnection( DB_MASTER );
-                                       $this->db->clearFlag( DBO_TRX );
+                                       $this->db->clearFlag( DBO_TRX ); // auto-commit mode
                                } else {
                                        $this->db = wfGetDB( DB_MASTER );
                                }
@@ -122,6 +130,7 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Get the table name for a given key
+        * @param $key string
         * @return string
         */
        protected function getTableByKey( $key ) {
@@ -135,6 +144,7 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Get the table name for a given shard index
+        * @param $index int
         * @return string
         */
        protected function getTableByShard( $index ) {
@@ -147,85 +157,103 @@ class SqlBagOStuff extends BagOStuff {
                }
        }
 
+       /**
+        * @param $key string
+        * @return mixed
+        */
        public function get( $key ) {
                $values = $this->getMulti( array( $key ) );
                return $values[$key];
        }
 
+       /**
+        * @param $keys array
+        * @return Array
+        */
        public function getMulti( array $keys ) {
                $values = array(); // array of (key => value)
 
-               $keysByTableName = array();
-               foreach ( $keys as $key ) {
-                       $tableName = $this->getTableByKey( $key );
-                       if ( !isset( $keysByTableName[$tableName] ) ) {
-                               $keysByTableName[$tableName] = array();
+               try {
+                       $db = $this->getDB();
+                       $keysByTableName = array();
+                       foreach ( $keys as $key ) {
+                               $tableName = $this->getTableByKey( $key );
+                               if ( !isset( $keysByTableName[$tableName] ) ) {
+                                       $keysByTableName[$tableName] = array();
+                               }
+                               $keysByTableName[$tableName][] = $key;
                        }
-                       $keysByTableName[$tableName][] = $key;
-               }
 
-               $db = $this->getDB();
-               $this->garbageCollect(); // expire old entries if any
+                       $this->garbageCollect(); // expire old entries if any
 
-               $dataRows = array();
-               foreach ( $keysByTableName as $tableName => $tableKeys ) {
-                       $res = $db->select( $tableName,
-                               array( 'keyname', 'value', 'exptime' ),
-                               array( 'keyname' => $tableKeys ),
-                               __METHOD__ );
-                       foreach ( $res as $row ) {
-                               $dataRows[$row->keyname] = $row;
+                       $dataRows = array();
+                       foreach ( $keysByTableName as $tableName => $tableKeys ) {
+                               $res = $db->select( $tableName,
+                                       array( 'keyname', 'value', 'exptime' ),
+                                       array( 'keyname' => $tableKeys ),
+                                       __METHOD__ );
+                               foreach ( $res as $row ) {
+                                       $dataRows[$row->keyname] = $row;
+                               }
                        }
-               }
 
-               foreach ( $keys as $key ) {
-                       if ( isset( $dataRows[$key] ) ) { // HIT?
-                               $row = $dataRows[$key];
-                               $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
-                               if ( $this->isExpired( $row->exptime ) ) { // MISS
-                                       $this->debug( "get: key has expired, deleting" );
-                                       try {
-                                               $db->begin( __METHOD__ );
-                                               # Put the expiry time in the WHERE condition to avoid deleting a
-                                               # newly-inserted value
-                                               $db->delete( $this->getTableByKey( $key ),
-                                                       array( 'keyname' => $key, 'exptime' => $row->exptime ),
-                                                       __METHOD__ );
-                                               $db->commit( __METHOD__ );
-                                       } catch ( DBQueryError $e ) {
-                                               $this->handleWriteError( $e );
+                       foreach ( $keys as $key ) {
+                               if ( isset( $dataRows[$key] ) ) { // HIT?
+                                       $row = $dataRows[$key];
+                                       $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
+                                       if ( $this->isExpired( $row->exptime ) ) { // MISS
+                                               $this->debug( "get: key has expired, deleting" );
+                                               try {
+                                                       $db->begin( __METHOD__ );
+                                                       # Put the expiry time in the WHERE condition to avoid deleting a
+                                                       # newly-inserted value
+                                                       $db->delete( $this->getTableByKey( $key ),
+                                                               array( 'keyname' => $key, 'exptime' => $row->exptime ),
+                                                               __METHOD__ );
+                                                       $db->commit( __METHOD__ );
+                                               } catch ( DBQueryError $e ) {
+                                                       $this->handleWriteError( $e );
+                                               }
+                                               $values[$key] = false;
+                                       } else { // HIT
+                                               $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
                                        }
+                               } else { // MISS
                                        $values[$key] = false;
-                               } else { // HIT
-                                       $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
+                                       $this->debug( 'get: no matching rows' );
                                }
-                       } else { // MISS
-                               $values[$key] = false;
-                               $this->debug( 'get: no matching rows' );
                        }
-               }
+               } catch ( DBError $e ) {
+                       $this->handleReadError( $e );
+               };
 
                return $values;
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime int
+        * @return bool
+        */
        public function set( $key, $value, $exptime = 0 ) {
-               $db = $this->getDB();
-               $exptime = intval( $exptime );
-
-               if ( $exptime < 0 ) {
-                       $exptime = 0;
-               }
+               try {
+                       $db = $this->getDB();
+                       $exptime = intval( $exptime );
 
-               if ( $exptime == 0 ) {
-                       $encExpiry = $this->getMaxDateTime();
-               } else {
-                       if ( $exptime < 3.16e8 ) { # ~10 years
-                               $exptime += time();
+                       if ( $exptime < 0 ) {
+                               $exptime = 0;
                        }
 
-                       $encExpiry = $db->timestamp( $exptime );
-               }
-               try {
+                       if ( $exptime == 0 ) {
+                               $encExpiry = $this->getMaxDateTime();
+                       } else {
+                               if ( $exptime < 3.16e8 ) { # ~10 years
+                                       $exptime += time();
+                               }
+
+                               $encExpiry = $db->timestamp( $exptime );
+                       }
                        $db->begin( __METHOD__ );
                        // (bug 24425) use a replace if the db supports it instead of
                        // delete/insert to avoid clashes with conflicting keynames
@@ -238,40 +266,46 @@ class SqlBagOStuff extends BagOStuff {
                                        'exptime' => $encExpiry
                                ), __METHOD__ );
                        $db->commit( __METHOD__ );
-               } catch ( DBQueryError $e ) {
+               } catch ( DBError $e ) {
                        $this->handleWriteError( $e );
-
                        return false;
                }
 
                return true;
        }
 
+       /**
+        * @param $key string
+        * @param $time int
+        * @return bool
+        */
        public function delete( $key, $time = 0 ) {
-               $db = $this->getDB();
-
                try {
+                       $db = $this->getDB();
                        $db->begin( __METHOD__ );
                        $db->delete(
                                $this->getTableByKey( $key ),
                                array( 'keyname' => $key ),
                                __METHOD__ );
                        $db->commit( __METHOD__ );
-               } catch ( DBQueryError $e ) {
+               } catch ( DBError $e ) {
                        $this->handleWriteError( $e );
-
                        return false;
                }
 
                return true;
        }
 
+       /**
+        * @param $key string
+        * @param $step int
+        * @return int|null
+        */
        public function incr( $key, $step = 1 ) {
-               $db = $this->getDB();
-               $tableName = $this->getTableByKey( $key );
-               $step = intval( $step );
-
                try {
+                       $db = $this->getDB();
+                       $tableName = $this->getTableByKey( $key );
+                       $step = intval( $step );
                        $db->begin( __METHOD__ );
                        $row = $db->selectRow(
                                $tableName,
@@ -307,34 +341,47 @@ class SqlBagOStuff extends BagOStuff {
                                $newValue = null;
                        }
                        $db->commit( __METHOD__ );
-               } catch ( DBQueryError $e ) {
+               } catch ( DBError $e ) {
                        $this->handleWriteError( $e );
-
                        return null;
                }
 
                return $newValue;
        }
 
+       /**
+        * @return Array
+        */
        public function keys() {
-               $db = $this->getDB();
                $result = array();
 
-               for ( $i = 0; $i < $this->shards; $i++ ) {
-                       $res = $db->select( $this->getTableByShard( $i ),
-                               array( 'keyname' ), false, __METHOD__ );
-                       foreach ( $res as $row ) {
-                               $result[] = $row->keyname;
+               try {
+                       $db = $this->getDB();
+                       for ( $i = 0; $i < $this->shards; $i++ ) {
+                               $res = $db->select( $this->getTableByShard( $i ),
+                                       array( 'keyname' ), false, __METHOD__ );
+                               foreach ( $res as $row ) {
+                                       $result[] = $row->keyname;
+                               }
                        }
+               } catch ( DBError $e ) {
+                       $this->handleReadError( $e );
                }
 
                return $result;
        }
 
+       /**
+        * @param $exptime string
+        * @return bool
+        */
        protected function isExpired( $exptime ) {
                return $exptime != $this->getMaxDateTime() && wfTimestamp( TS_UNIX, $exptime ) < time();
        }
 
+       /**
+        * @return string
+        */
        protected function getMaxDateTime() {
                if ( time() > 0x7fffffff ) {
                        return $this->getDB()->timestamp( 1 << 62 );
@@ -366,15 +413,16 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Delete objects from the database which expire before a certain date.
+        * @param $timestamp string
+        * @param $progressCallback bool|callback
         * @return bool
         */
        public function deleteObjectsExpiringBefore( $timestamp, $progressCallback = false ) {
-               $db = $this->getDB();
-               $dbTimestamp = $db->timestamp( $timestamp );
-               $totalSeconds = false;
-               $baseConds = array( 'exptime < ' . $db->addQuotes( $dbTimestamp ) );
-
                try {
+                       $db = $this->getDB();
+                       $dbTimestamp = $db->timestamp( $timestamp );
+                       $totalSeconds = false;
+                       $baseConds = array( 'exptime < ' . $db->addQuotes( $dbTimestamp ) );
                        for ( $i = 0; $i < $this->shards; $i++ ) {
                                $maxExpTime = false;
                                while ( true ) {
@@ -430,24 +478,28 @@ class SqlBagOStuff extends BagOStuff {
                                        }
                                }
                        }
-               } catch ( DBQueryError $e ) {
+               } catch ( DBError $e ) {
                        $this->handleWriteError( $e );
+                       return false;
                }
+
                return true;
        }
 
        public function deleteAll() {
-               $db = $this->getDB();
-
                try {
+                       $db = $this->getDB();
                        for ( $i = 0; $i < $this->shards; $i++ ) {
                                $db->begin( __METHOD__ );
                                $db->delete( $this->getTableByShard( $i ), '*', __METHOD__ );
                                $db->commit( __METHOD__ );
                        }
-               } catch ( DBQueryError $e ) {
+               } catch ( DBError $e ) {
                        $this->handleWriteError( $e );
+                       return false;
                }
+
+               return true;
        }
 
        /**
@@ -490,23 +542,40 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
-        * Handle a DBQueryError which occurred during a write operation.
-        * Ignore errors which are due to a read-only database, rethrow others.
+        * Handle a DBError which occurred during a read operation.
         */
-       protected function handleWriteError( $exception ) {
-               $db = $this->getDB();
-
-               if ( !$db->wasReadOnlyError() ) {
-                       throw $exception;
+       protected function handleReadError( DBError $exception ) {
+               if ( $exception instanceof DBConnectionError ) {
+                       $this->connFailureTime  = time();
+                       $this->connFailureError = $exception;
                }
-
-               try {
-                       $db->rollback( __METHOD__ );
-               } catch ( DBQueryError $e ) {
+               wfDebugLog( 'SQLBagOStuff', "DBError: {$exception->getMessage()}" );
+               if ( $this->db ) {
+                       wfDebug( __METHOD__ . ": ignoring query error\n" );
+               } else {
+                       wfDebug( __METHOD__ . ": ignoring connection error\n" );
                }
+       }
 
-               wfDebug( __METHOD__ . ": ignoring query error\n" );
-               $db->ignoreErrors( false );
+       /**
+        * Handle a DBQueryError which occurred during a write operation.
+        */
+       protected function handleWriteError( DBError $exception ) {
+               if ( $exception instanceof DBConnectionError ) {
+                       $this->connFailureTime  = time();
+                       $this->connFailureError = $exception;
+               }
+               if ( $this->db && $this->db->wasReadOnlyError() ) {
+                       try {
+                               $this->db->rollback( __METHOD__ );
+                       } catch ( DBError $e ) {}
+               }
+               wfDebugLog( 'SQLBagOStuff', "DBError: {$exception->getMessage()}" );
+               if ( $this->db ) {
+                       wfDebug( __METHOD__ . ": ignoring query error\n" );
+               } else {
+                       wfDebug( __METHOD__ . ": ignoring connection error\n" );
+               }
        }
 
        /**
index 4fd3cf4..21aa39e 100644 (file)
@@ -74,6 +74,9 @@ class WinCacheBagOStuff extends BagOStuff {
                return true;
        }
 
+       /**
+        * @return Array
+        */
        public function keys() {
                $info = wincache_ucache_info();
                $list = $info['ucache_entries'];
index 08f52b7..6c88289 100644 (file)
@@ -38,7 +38,11 @@ class XCacheBagOStuff extends BagOStuff {
                $val = xcache_get( $key );
 
                if ( is_string( $val ) ) {
-                       $val = unserialize( $val );
+                       if ( $this->isInteger( $val ) ) {
+                               $val = intval( $val );
+                       } else {
+                               $val = unserialize( $val );
+                       }
                }
 
                return $val;
@@ -53,7 +57,11 @@ class XCacheBagOStuff extends BagOStuff {
         * @return bool
         */
        public function set( $key, $value, $expire = 0 ) {
-               xcache_set( $key, serialize( $value ), $expire );
+               if ( !$this->isInteger( $value ) ) {
+                       $value = serialize( $value );
+               }
+
+               xcache_set( $key, $value, $expire );
                return true;
        }
 
@@ -68,5 +76,12 @@ class XCacheBagOStuff extends BagOStuff {
                xcache_unset( $key );
                return true;
        }
-}
 
+       public function incr( $key, $value = 1 ) {
+               return xcache_inc( $key, $value );
+       }
+
+       public function decr( $key, $value = 1 ) {
+               return xcache_dec( $key, $value );
+       }
+}
diff --git a/includes/parser/CacheTime.php b/includes/parser/CacheTime.php
new file mode 100644 (file)
index 0000000..e42c464
--- /dev/null
@@ -0,0 +1,127 @@
+<?php
+
+/**
+ * @todo document
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Parser
+ */
+class CacheTime {
+
+       var     $mVersion = Parser::VERSION,  # Compatibility check
+               $mCacheTime = '',             # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
+               $mCacheExpiry = null,         # Seconds after which the object should expire, use 0 for uncachable. Used in ParserCache.
+               $mContainsOldMagic;           # Boolean variable indicating if the input contained variables like {{CURRENTDAY}}
+
+       function getCacheTime()              { return $this->mCacheTime; }
+
+       function containsOldMagic()          { return $this->mContainsOldMagic; }
+       function setContainsOldMagic( $com ) { return wfSetVar( $this->mContainsOldMagic, $com ); }
+
+       /**
+        * setCacheTime() sets the timestamp expressing when the page has been rendered.
+        * This doesn not control expiry, see updateCacheExpiry() for that!
+        * @param $t string
+        * @return string
+        */
+       function setCacheTime( $t )          { return wfSetVar( $this->mCacheTime, $t ); }
+
+       /**
+        * Sets the number of seconds after which this object should expire.
+        * This value is used with the ParserCache.
+        * If called with a value greater than the value provided at any previous call,
+        * the new call has no effect. The value returned by getCacheExpiry is smaller
+        * or equal to the smallest number that was provided as an argument to
+        * updateCacheExpiry().
+        *
+        * @param $seconds number
+        */
+       function updateCacheExpiry( $seconds ) {
+               $seconds = (int)$seconds;
+
+               if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds ) {
+                       $this->mCacheExpiry = $seconds;
+               }
+
+               // hack: set old-style marker for uncacheable entries.
+               if ( $this->mCacheExpiry !== null && $this->mCacheExpiry <= 0 ) {
+                       $this->mCacheTime = -1;
+               }
+       }
+
+       /**
+        * Returns the number of seconds after which this object should expire.
+        * This method is used by ParserCache to determine how long the ParserOutput can be cached.
+        * The timestamp of expiry can be calculated by adding getCacheExpiry() to getCacheTime().
+        * The value returned by getCacheExpiry is smaller or equal to the smallest number
+        * that was provided to a call of updateCacheExpiry(), and smaller or equal to the
+        * value of $wgParserCacheExpireTime.
+        * @return int|mixed|null
+        */
+       function getCacheExpiry() {
+               global $wgParserCacheExpireTime;
+
+               if ( $this->mCacheTime < 0 ) {
+                       return 0;
+               } // old-style marker for "not cachable"
+
+               $expire = $this->mCacheExpiry;
+
+               if ( $expire === null ) {
+                       $expire = $wgParserCacheExpireTime;
+               } else {
+                       $expire = min( $expire, $wgParserCacheExpireTime );
+               }
+
+               if( $this->containsOldMagic() ) { //compatibility hack
+                       $expire = min( $expire, 3600 ); # 1 hour
+               }
+
+               if ( $expire <= 0 ) {
+                       return 0; // not cachable
+               } else {
+                       return $expire;
+               }
+       }
+
+       /**
+        * @return bool
+        */
+       function isCacheable() {
+               return $this->getCacheExpiry() > 0;
+       }
+
+       /**
+        * Return true if this cached output object predates the global or
+        * per-article cache invalidation timestamps, or if it comes from
+        * an incompatible older version.
+        *
+        * @param $touched String: the affected article's last touched timestamp
+        * @return Boolean
+        */
+       public function expired( $touched ) {
+               global $wgCacheEpoch;
+               return !$this->isCacheable() || // parser says it's uncacheable
+                       $this->getCacheTime() < $touched ||
+                       $this->getCacheTime() <= $wgCacheEpoch ||
+                       $this->getCacheTime() < wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) || // expiry period has passed
+                       !isset( $this->mVersion ) ||
+                       version_compare( $this->mVersion, Parser::VERSION, "lt" );
+       }
+
+}
\ No newline at end of file
index 912de41..8917b6d 100644 (file)
@@ -129,7 +129,8 @@ class CoreParserFunctions {
         * @return mixed|string
         */
        static function formatDate( $parser, $date, $defaultPref = null ) {
-               $df = DateFormatter::getInstance();
+               $lang = $parser->getFunctionLang();
+               $df = DateFormatter::getInstance( $lang );
 
                $date = trim( $date );
 
@@ -341,6 +342,7 @@ class CoreParserFunctions {
        static function plural( $parser, $text = '' ) {
                $forms = array_slice( func_get_args(), 2 );
                $text = $parser->getFunctionLang()->parseFormattedNumber( $text );
+               settype( $text, ctype_digit( $text ) ? 'int' : 'float' );
                return $parser->getFunctionLang()->convertPlural( $text, $forms );
        }
 
@@ -565,29 +567,64 @@ class CoreParserFunctions {
        }
 
        /**
-        * Return the number of pages in the given category, or 0 if it's nonexis-
-        * tent.  This is an expensive parser function and can't be called too many
-        * times per page.
+        * Return the number of pages, files or subcats in the given category,
+        * or 0 if it's nonexistent. This is an expensive parser function and
+        * can't be called too many times per page.
         * @return string
         */
-       static function pagesincategory( $parser, $name = '', $raw = null ) {
+       static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
+               static $magicWords = null;
+               if ( is_null( $magicWords ) ) {
+                       $magicWords = new MagicWordArray( array(
+                               'pagesincategory_all',
+                               'pagesincategory_pages',
+                               'pagesincategory_subcats',
+                               'pagesincategory_files'
+                       ) );
+               }
                static $cache = array();
-               $category = Category::newFromName( $name );
 
-               if( !is_object( $category ) ) {
-                       $cache[$name] = 0;
+               // split the given option to its variable
+               if( self::isRaw( $arg1 ) ) {
+                       //{{pagesincategory:|raw[|type]}}
+                       $raw = $arg1;
+                       $type = $magicWords->matchStartToEnd( $arg2 );
+               } else {
+                       //{{pagesincategory:[|type[|raw]]}}
+                       $type = $magicWords->matchStartToEnd( $arg1 );
+                       $raw = $arg2;
+               }
+               if( !$type ) { //backward compatibility
+                       $type = 'pagesincategory_all';
+               }
+
+               $title = Title::makeTitleSafe( NS_CATEGORY, $name );
+               if( !$title ) { # invalid title
                        return self::formatRaw( 0, $raw );
                }
 
-               # Normalize name for cache
-               $name = $category->getName();
+               // Normalize name for cache
+               $name = $title->getDBkey();
 
-               $count = 0;
-               if( isset( $cache[$name] ) ) {
-                       $count = $cache[$name];
-               } elseif( $parser->incrementExpensiveFunctionCount() ) {
-                       $count = $cache[$name] = (int)$category->getPageCount();
+               if( !isset( $cache[$name] ) ) {
+                       $category = Category::newFromTitle( $title );
+
+                       $allCount = $subcatCount = $fileCount = $pagesCount = 0;
+                       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();
+                               $subcatCount = (int)$category->getSubcatCount();
+                               $fileCount = (int)$category->getFileCount();
+                               $pagesCount = $allCount - $subcatCount - $fileCount;
+                       }
+                       $cache[$name]['pagesincategory_all'] = $allCount;
+                       $cache[$name]['pagesincategory_pages'] = $pagesCount;
+                       $cache[$name]['pagesincategory_subcats'] = $subcatCount;
+                       $cache[$name]['pagesincategory_files'] = $fileCount;
                }
+
+               $count = $cache[$name][$type];
                return self::formatRaw( $count, $raw );
        }
 
@@ -624,7 +661,7 @@ class CoreParserFunctions {
                if( isset( $cache[$page] ) ) {
                        $length = $cache[$page];
                } elseif( $parser->incrementExpensiveFunctionCount() ) {
-                       $rev = Revision::newFromTitle( $title );
+                       $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                        $id = $rev ? $rev->getPage() : 0;
                        $length = $cache[$page] = $rev ? $rev->getSize() : 0;
 
@@ -711,7 +748,7 @@ class CoreParserFunctions {
                        $title = SpecialPage::getTitleFor( $page, $subpage );
                        return $title->getPrefixedText();
                } else {
-                       return wfMsgForContent( 'nosuchspecialpage' );
+                       return wfMessage( 'nosuchspecialpage' )->inContentLanguage()->text();
                }
        }
 
@@ -746,48 +783,39 @@ class CoreParserFunctions {
                        return '';
                } else {
                        return( '<span class="error">' .
-                               wfMsgForContent( 'duplicate-defaultsort',
-                                                htmlspecialchars( $old ),
-                                                htmlspecialchars( $text ) ) .
+                               wfMessage( 'duplicate-defaultsort', $old, $text )->inContentLanguage()->escaped() .
                                '</span>' );
                }
        }
 
        // Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}} or {{filepath|300|nowiki}}
+       // or {{filepath|300px}}, {{filepath|200x300px}}, {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}
        public static function filepath( $parser, $name='', $argA='', $argB='' ) {
                $file = wfFindFile( $name );
-               $size = '';
-               $argA_int = intval( $argA );
-               $argB_int = intval( $argB );
-
-               if ( $argB_int > 0 ) {
-                       // {{filepath: | option | size }}
-                       $size = $argB_int;
-                       $option = $argA;
-
-               } elseif ( $argA_int > 0 ) {
-                       // {{filepath: | size [|option] }}
-                       $size = $argA_int;
-                       $option = $argB;
 
+               if( $argA == 'nowiki' ) {
+                       // {{filepath: | option [| size] }}
+                       $isNowiki = true;
+                       $parsedWidthParam = $parser->parseWidthParam( $argB );
                } else {
-                       // {{filepath: [|option] }}
-                       $option = $argA;
+                       // {{filepath: [| size [|option]] }}
+                       $parsedWidthParam = $parser->parseWidthParam( $argA );
+                       $isNowiki = ($argB == 'nowiki');
                }
 
                if ( $file ) {
                        $url = $file->getFullUrl();
 
                        // If a size is requested...
-                       if ( is_integer( $size ) ) {
-                               $mto = $file->transform( array( 'width' => $size ) );
+                       if ( count( $parsedWidthParam ) ) {
+                               $mto = $file->transform( $parsedWidthParam );
                                // ... and we can
                                if ( $mto && !$mto->isError() ) {
                                        // ... change the URL to point to a thumbnail.
                                        $url = wfExpandUrl( $mto->getUrl(), PROTO_RELATIVE );
                                }
                        }
-                       if ( $option == 'nowiki' ) {
+                       if ( $isNowiki ) {
                                return array( $url, 'nowiki' => true );
                        }
                        return $url;
@@ -815,7 +843,7 @@ class CoreParserFunctions {
                $stripList = $parser->getStripList();
                if ( !in_array( $tagName, $stripList ) ) {
                        return '<span class="error">' .
-                               wfMsgForContent( 'unknown_extension_tag', $tagName ) .
+                               wfMessage( 'unknown_extension_tag', $tagName )->inContentLanguage()->text() .
                                '</span>';
                }
 
index 1638fb0..2917b4a 100644 (file)
  * @todo preferences, OutputPage
  * @ingroup Parser
  */
-class DateFormatter
-{
+class DateFormatter {
        var $mSource, $mTarget;
        var $monthNames = '', $rxDM, $rxMD, $rxDMY, $rxYDM, $rxMDY, $rxYMD;
 
        var $regexes, $pDays, $pMonths, $pYears;
        var $rules, $xMonths, $preferences;
 
+       protected $lang;
+
        const ALL = -1;
        const NONE = 0;
        const MDY = 1;
@@ -48,15 +49,15 @@ class DateFormatter
        const LAST = 8;
 
        /**
-        * @todo document
+        * @param $lang Language In which language to format the date
         */
-       function __construct() {
-               global $wgContLang;
+       function __construct( Language $lang ) {
+               $this->lang = $lang;
 
                $this->monthNames = $this->getMonthRegex();
                for ( $i=1; $i<=12; $i++ ) {
-                       $this->xMonths[$wgContLang->lc( $wgContLang->getMonthName( $i ) )] = $i;
-                       $this->xMonths[$wgContLang->lc( $wgContLang->getMonthAbbreviation( $i ) )] = $i;
+                       $this->xMonths[$this->lang->lc( $this->lang->getMonthName( $i ) )] = $i;
+                       $this->xMonths[$this->lang->lc( $this->lang->getMonthAbbreviation( $i ) )] = $i;
                }
 
                $this->regexTrail = '(?![a-z])/iu';
@@ -119,16 +120,20 @@ class DateFormatter
        /**
         * Get a DateFormatter object
         *
+        * @param $lang Language|string|null In which language to format the date
+        *              Defaults to the site content language
         * @return DateFormatter object
         */
-       public static function &getInstance() {
-               global $wgMemc;
+       public static function &getInstance( $lang = null ) {
+               global $wgMemc, $wgContLang;
                static $dateFormatter = false;
+               $lang = $lang ? wfGetLangObj( $lang ) : $wgContLang;
+               $key = wfMemcKey( 'dateformatter', $lang->getCode() );
                if ( !$dateFormatter ) {
-                       $dateFormatter = $wgMemc->get( wfMemcKey( 'dateformatter' ) );
+                       $dateFormatter = $wgMemc->get( $key );
                        if ( !$dateFormatter ) {
-                               $dateFormatter = new DateFormatter;
-                               $wgMemc->set( wfMemcKey( 'dateformatter' ), $dateFormatter, 3600 );
+                               $dateFormatter = new DateFormatter( $lang );
+                               $wgMemc->set( $key, $dateFormatter, 3600 );
                        }
                }
                return $dateFormatter;
@@ -141,10 +146,9 @@ class DateFormatter
         * @return mixed|String
         */
        function reformat( $preference, $text, $options = array('linked') ) {
-       
                $linked = in_array( 'linked', $options );
                $match_whole = in_array( 'match-whole', $options );
-               
+
                if ( isset( $this->preferences[$preference] ) ) {
                        $preference = $this->preferences[$preference];
                } else {
@@ -166,19 +170,19 @@ class DateFormatter
                                $this->mTarget = $i;
                        }
                        $regex = $this->regexes[$i];
-                       
+
                        // Horrible hack
                        if (!$linked) {
                                $regex = str_replace( array( '\[\[', '\]\]' ), '', $regex );
                        }
-                       
+
                        if ($match_whole) {
                                // Let's hope this works
                                $regex = preg_replace( '!^/!', '/^', $regex );
                                $regex = str_replace( $this->regexTrail,
                                        '$'.$this->regexTrail, $regex );
                        }
-                       
+
                        // Another horrible hack
                        $this->mLinked = $linked;
                        $text = preg_replace_callback( $regex, array( &$this, 'replace' ), $text );
@@ -204,10 +208,15 @@ class DateFormatter
                                $bits[$key[$p]] = $matches[$p+1];
                        }
                }
-               
+
                return $this->formatDate( $bits, $linked );
        }
-       
+
+       /**
+        * @param $bits array
+        * @param $link bool
+        * @return string
+        */
        function formatDate( $bits, $link = true ) {
                $format = $this->targets[$this->mTarget];
                
@@ -221,13 +230,13 @@ class DateFormatter
                # Construct new date
                $text = '';
                $fail = false;
-               
+
                // Pre-generate y/Y stuff because we need the year for the <span> title.
                if ( !isset( $bits['y'] ) && isset( $bits['Y'] ) )
                        $bits['y'] = $this->makeIsoYear( $bits['Y'] );
                if ( !isset( $bits['Y'] ) && isset( $bits['y'] ) )
                        $bits['Y'] = $this->makeNormalYear( $bits['y'] );
-                       
+
                if ( !isset( $bits['m'] ) ) {
                        $m = $this->makeIsoMonth( $bits['F'] );
                        if ( !$m || $m == '00' ) {
@@ -236,7 +245,7 @@ class DateFormatter
                                $bits['m'] = $m;
                        }
                }
-               
+
                if ( !isset($bits['d']) ) {
                        $bits['d'] = sprintf( '%02d', $bits['j'] );
                }
@@ -266,8 +275,7 @@ class DateFormatter
                                                if ( $m > 12 || $m < 1 ) {
                                                        $fail = true;
                                                } else {
-                                                       global $wgContLang;
-                                                       $text .= $wgContLang->getMonthName( $m );
+                                                       $text .= $this->lang->getMonthName( $m );
                                                }
                                        } else {
                                                $text .= ucfirst( $bits['F'] );
@@ -283,18 +291,18 @@ class DateFormatter
                if ( $fail ) {
                        $text = $matches[0];
                }
-               
+
                $isoBits = array();
                if ( isset($bits['y']) )
                        $isoBits[] = $bits['y'];
                $isoBits[] = $bits['m'];
                $isoBits[] = $bits['d'];
                $isoDate = implode( '-', $isoBits );
-               
+
                // Output is not strictly HTML (it's wikitext), but <span> is whitelisted.
                $text = Html::rawElement( 'span',
                                        array( 'class' => 'mw-formatted-date', 'title' => $isoDate ), $text );
-               
+
                return $text;
        }
 
@@ -303,11 +311,10 @@ class DateFormatter
         * @return string
         */
        function getMonthRegex() {
-               global $wgContLang;
                $names = array();
                for( $i = 1; $i <= 12; $i++ ) {
-                       $names[] = $wgContLang->getMonthName( $i );
-                       $names[] = $wgContLang->getMonthAbbreviation( $i );
+                       $names[] = $this->lang->getMonthName( $i );
+                       $names[] = $this->lang->getMonthAbbreviation( $i );
                }
                return implode( '|', $names );
        }
@@ -318,9 +325,7 @@ class DateFormatter
         * @return string ISO month name
         */
        function makeIsoMonth( $monthName ) {
-               global $wgContLang;
-
-               $n = $this->xMonths[$wgContLang->lc( $monthName )];
+               $n = $this->xMonths[$this->lang->lc( $monthName )];
                return sprintf( '%02d', $n );
        }
 
index def1aee..d9356b4 100644 (file)
@@ -209,6 +209,10 @@ class LinkHolderArray {
         * article length checks (for stub links) to be bundled into a single query.
         *
         * @param $nt Title
+        * @param $text String
+        * @param $query Array [optional]
+        * @param $trail String [optional]
+        * @param $prefix String [optional]
         * @return string
         */
        function makeHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = ''  ) {
@@ -453,7 +457,7 @@ class LinkHolderArray {
                        foreach ( $entries as $index => $entry ) {
                                $pdbk = $entry['pdbk'];
                                // we only deal with new links (in its first query)
-                               if ( !isset( $colours[$pdbk] ) ) {
+                               if ( !isset( $colours[$pdbk] ) || $colours[$pdbk] === 'new' ) {
                                        $title = $entry['title'];
                                        $titleText = $title->getText();
                                        $titlesAttrs[] = array(
@@ -469,7 +473,7 @@ class LinkHolderArray {
                }
 
                // Now do the conversion and explode string to text of titles
-               $titlesAllVariants = $wgContLang->autoConvertToAllVariants( $titlesToBeConverted );
+               $titlesAllVariants = $wgContLang->autoConvertToAllVariants( rtrim( $titlesToBeConverted, "\0" ) );
                $allVariantsName = array_keys( $titlesAllVariants );
                foreach ( $titlesAllVariants as &$titlesVariant ) {
                        $titlesVariant = explode( "\0", $titlesVariant );
@@ -537,7 +541,7 @@ class LinkHolderArray {
                                        $entry =& $this->internals[$ns][$index];
                                        $pdbk = $entry['pdbk'];
 
-                                       if(!isset($colours[$pdbk])){
+                                       if ( !isset( $colours[$pdbk] ) || $colours[$pdbk] === 'new' ) {
                                                // found link in some of the variants, replace the link holder data
                                                $entry['title'] = $variantTitle;
                                                $entry['pdbk'] = $varPdbk;
index 4beb8fd..8e9444a 100644 (file)
  * transformation of that wiki markup it into XHTML output / markup
  * (which in turn the browser understands, and can display).
  *
- * <pre>
- * There are five main entry points into the Parser class:
- * parse()
+ * There are seven main entry points into the Parser class:
+ *
+ * - Parser::parse()
  *     produces HTML output
- * preSaveTransform().
+ * - Parser::preSaveTransform().
  *     produces altered wiki markup.
- * preprocess()
+ * - Parser::preprocess()
  *     removes HTML comments and expands templates
- * cleanSig() / cleanSigInSig()
+ * - Parser::cleanSig() and Parser::cleanSigInSig()
  *     Cleans a signature before saving it to preferences
- * getSection()
+ * - Parser::getSection()
  *     Return the content of a section from an article for section editing
- * replaceSection()
+ * - Parser::replaceSection()
  *     Replaces a section by number inside an article
- * getPreloadText()
+ * - Parser::getPreloadText()
  *     Removes <noinclude> sections, and <includeonly> tags.
  *
  * Globals used:
  *    object: $wgContLang
  *
- * NOT $wgUser or $wgTitle or $wgRequest or $wgLang. Keep them away!
+ * @warning $wgUser or $wgTitle or $wgRequest or $wgLang. Keep them away!
  *
- * settings:
- *  $wgUseDynamicDates*, $wgInterwikiMagic*,
- *  $wgNamespacesWithSubpages, $wgAllowExternalImages*,
- *  $wgLocaltimezone, $wgAllowSpecialInclusion*,
- *  $wgMaxArticleSize*
+ * @par Settings:
+ * $wgLocaltimezone
+ * $wgNamespacesWithSubpages
  *
- *  * only within ParserOptions
- * </pre>
+ * @par Settings only within ParserOptions:
+ * $wgAllowExternalImages
+ * $wgAllowSpecialInclusion
+ * $wgInterwikiMagic
+ * $wgMaxArticleSize
+ * $wgUseDynamicDates
  *
  * @ingroup Parser
  */
@@ -364,6 +366,7 @@ class Parser {
                # No more strip!
                wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
                $text = $this->internalParse( $text );
+               wfRunHooks( 'ParserAfterParse', array( &$this, &$text, &$this->mStripState ) );
 
                $text = $this->mStripState->unstripGeneral( $text );
 
@@ -556,10 +559,11 @@ class Parser {
        }
 
        /**
-        * Process the wikitext for the ?preload= feature. (bug 5210)
+        * Process the wikitext for the "?preload=" feature. (bug 5210)
         *
-        * <noinclude>, <includeonly> etc. are parsed as for template transclusion,
-        * comments, templates, arguments, tags hooks and parser functions are untouched.
+        * "<noinclude>", "<includeonly>" etc. are parsed as for template
+        * transclusion, comments, templates, arguments, tags hooks and parser
+        * functions are untouched.
         *
         * @param $text String
         * @param $title Title
@@ -731,16 +735,22 @@ class Parser {
        /**
         * Get the target language for the content being parsed. This is usually the
         * language that the content is in.
+        *
+        * @since 1.19
+        *
+        * @return Language|null
         */
-       function getTargetLanguage() {
+       public function getTargetLanguage() {
                $target = $this->mOptions->getTargetLanguage();
+
                if ( $target !== null ) {
                        return $target;
                } elseif( $this->mOptions->getInterfaceMessage() ) {
                        return $this->mOptions->getUserLangObj();
                } elseif( is_null( $this->mTitle ) ) {
-                       throw new MWException( __METHOD__.': $this->mTitle is null' );
+                       throw new MWException( __METHOD__ . ': $this->mTitle is null' );
                }
+
                return $this->mTitle->getPageLanguage();
        }
 
@@ -787,11 +797,14 @@ class Parser {
         * in the text with a random marker and returns the next text. The output
         * parameter $matches will be an associative array filled with data in
         * the form:
+        *
+        * @code
         *   'UNIQ-xxxxx' => array(
         *     'element',
         *     'tag content',
         *     array( 'param' => 'x' ),
         *     '<element param="x">tag content</element>' ) )
+        * @endcode
         *
         * @param $elements array list of element names. Comments are always extracted.
         * @param $text string Source text string.
@@ -1121,6 +1134,7 @@ class Parser {
                        $text = $this->replaceVariables( $text );
                }
 
+               wfRunHooks( 'InternalParseBeforeSanitize', array( &$this, &$text, &$this->mStripState ) );
                $text = Sanitizer::removeHTMLtags( $text, array( &$this, 'attributeStripCallback' ), false, array_keys( $this->mTransparentTagHooks ) );
                wfRunHooks( 'InternalParseBeforeLinks', array( &$this, &$text, &$this->mStripState ) );
 
@@ -1216,7 +1230,7 @@ class Parser {
                                throw new MWException( __METHOD__.': unrecognised match type "' .
                                        substr( $m[0], 0, 20 ) . '"' );
                        }
-                       $url = wfMsgForContent( $urlmsg, $id );
+                       $url = wfMessage( $urlmsg, $id )->inContentLanguage()->text();
                        return Linker::makeExternalLink( $url, "{$keyword} {$id}", true, $CssClass );
                } elseif ( isset( $m[5] ) && $m[5] !== '' ) {
                        # ISBN
@@ -1508,6 +1522,9 @@ class Parser {
                wfProfileIn( __METHOD__ );
 
                $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
+               if ( $bits === false ) {
+                       throw new MWException( "PCRE needs to be compiled with --enable-unicode-properties in order for MediaWiki to function" );
+               }
                $s = array_shift( $bits );
 
                $i = 0;
@@ -1670,7 +1687,7 @@ class Parser {
                }
                if ( !$text && $this->mOptions->getEnableImageWhitelist()
                         && preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
-                       $whitelist = explode( "\n", wfMsgForContent( 'external_image_whitelist' ) );
+                       $whitelist = explode( "\n", wfMessage( 'external_image_whitelist' )->inContentLanguage()->text() );
                        foreach ( $whitelist as $entry ) {
                                # Sanitize the regex fragment, make it case-insensitive, ignore blank entries/comments
                                if ( strpos( $entry, '#' ) === 0 || $entry === '' ) {
@@ -1735,7 +1752,7 @@ class Parser {
                if ( $useLinkPrefixExtension ) {
                        # Match the end of a line for a word that's not followed by whitespace,
                        # e.g. in the case of 'The Arab al[[Razi]]', 'al' will be matched
-                       $e2 = wfMsgForContent( 'linkprefix' );
+                       $e2 = wfMessage( 'linkprefix' )->inContentLanguage()->text();
                }
 
                if ( is_null( $this->mTitle ) ) {
@@ -2720,6 +2737,18 @@ class Parser {
                                $subjPage = $this->mTitle->getSubjectPage();
                                $value = wfEscapeWikiText( $subjPage->getPrefixedUrl() );
                                break;
+                       case 'pageid': // requested in bug 23427
+                               $pageid = $this->getTitle()->getArticleId();
+                               if( $pageid == 0 ) {
+                                       # 0 means the page doesn't exist in the database,
+                                       # which means the user is previewing a new page.
+                                       # The vary-revision flag must be set, because the magic word
+                                       # will have a different value once the page is saved.
+                                       $this->mOutput->setFlag( 'vary-revision' );
+                                       wfDebug( __METHOD__ . ": {{PAGEID}} used in a new page, setting vary-revision...\n" );
+                               }
+                               $value = $pageid ? $pageid : null;
+                               break;
                        case 'revisionid':
                                # Let the edit saving system know we should parse the page
                                # *after* a revision ID has been assigned.
@@ -2926,7 +2955,7 @@ class Parser {
         *
         * @param $text String: The text to parse
         * @param $flags Integer: bitwise combination of:
-        *          self::PTD_FOR_INCLUSION    Handle <noinclude>/<includeonly> as if the text is being
+        *          self::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
         *                                     included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
@@ -3057,9 +3086,10 @@ class Parser {
         * @param $max int|null Maximum allowed, when an explicit limit has been
         *       exceeded, provide the values (optional)
         */
-       function limitationWarn( $limitationType, $current = null, $max = null) {
+       function limitationWarn( $limitationType, $current = '', $max = '' ) {
                # does no harm if $current and $max are present but are unnecessary for the message
-               $warning = wfMsgExt( "$limitationType-warning", array( 'parsemag', 'escape' ), $current, $max );
+               $warning = wfMessage( "$limitationType-warning" )->numParams( $current, $max )
+                       ->inContentLanguage()->escaped();
                $this->mOutput->addWarning( $warning );
                $this->addTrackingCategory( "$limitationType-category" );
        }
@@ -3264,7 +3294,8 @@ class Parser {
                                if ( $frame->depth >= $limit ) {
                                        $found = true;
                                        $text = '<span class="error">'
-                                               . wfMsgForContent( 'parser-template-recursion-depth-warning', $limit )
+                                               . wfMessage( 'parser-template-recursion-depth-warning' )
+                                                       ->numParams( $limit )->inContentLanguage()->text()
                                                . '</span>';
                                }
                        }
@@ -3344,7 +3375,9 @@ class Parser {
                        # This has to be done after redirect resolution to avoid infinite loops via redirects
                        if ( !$frame->loopCheck( $title ) ) {
                                $found = true;
-                               $text = '<span class="error">' . wfMsgForContent( 'parser-template-loop-warning', $titleText ) . '</span>';
+                               $text = '<span class="error">'
+                                       . wfMessage( 'parser-template-loop-warning', $titleText )->inContentLanguage()->text()
+                                       . '</span>';
                                wfDebug( __METHOD__.": template loop broken at '$titleText'\n" );
                        }
                        wfProfileOut( __METHOD__ . '-loadtpl' );
@@ -3503,7 +3536,7 @@ class Parser {
         * Static function to get a template
         * Can be overridden via ParserOptions::setTemplateCallback().
         *
-        * @parma $title Title
+        * @param $title  Title
         * @param $parser Parser
         *
         * @return array
@@ -3532,7 +3565,7 @@ class Parser {
                        # Get the revision
                        $rev = $id
                                ? Revision::newFromId( $id )
-                               : Revision::newFromTitle( $title );
+                               : Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                        $rev_id = $rev ? $rev->getId() : 0;
                        # If there is no current revision, there is no page
                        if ( $id === false && !$rev ) {
@@ -3634,13 +3667,13 @@ class Parser {
                global $wgEnableScaryTranscluding;
 
                if ( !$wgEnableScaryTranscluding ) {
-                       return wfMsgForContent('scarytranscludedisabled');
+                       return wfMessage('scarytranscludedisabled')->inContentLanguage()->text();
                }
 
                $url = $title->getFullUrl( "action=$action" );
 
                if ( strlen( $url ) > 255 ) {
-                       return wfMsgForContent( 'scarytranscludetoolong' );
+                       return wfMessage( 'scarytranscludetoolong' )->inContentLanguage()->text();
                }
                return $this->fetchScaryTemplateMaybeFromCache( $url );
        }
@@ -3661,7 +3694,7 @@ class Parser {
 
                $text = Http::get( $url );
                if ( !$text ) {
-                       return wfMsgForContent( 'scarytranscludefailed', $url );
+                       return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text();
                }
 
                $dbw = wfGetDB( DB_MASTER );
@@ -3677,7 +3710,7 @@ class Parser {
         * Triple brace replacement -- used for template arguments
         * @private
         *
-        * @param $peice array
+        * @param $piece array
         * @param $frame PPFrame
         *
         * @return array
@@ -4310,7 +4343,7 @@ class Parser {
        }
 
        /**
-        * Transform wiki markup when saving a page by doing \r\n -> \n
+        * Transform wiki markup when saving a page by doing "\r\n" -> "\n"
         * conversion, substitting signatures, {{subst:}} templates, etc.
         *
         * @param $text String: the text to transform
@@ -4386,7 +4419,7 @@ class Parser {
                $text = $this->replaceVariables( $text );
 
                # This works almost by chance, as the replaceVariables are done before the getUserSig(),
-               # which may corrupt this parser instance via its wfMsgExt( parsemag ) call-
+               # which may corrupt this parser instance via its wfMessage()->text() call-
 
                # Signatures
                $sigText = $this->getUserSig( $user );
@@ -4606,7 +4639,7 @@ class Parser {
        }
 
        /**
-        * Create an HTML-style tag, e.g. <yourtag>special text</yourtag>
+        * Create an HTML-style tag, e.g. "<yourtag>special text</yourtag>"
         * The callback should have the following form:
         *    function myParserHook( $text, $params, $parser, $frame ) { ... }
         *
@@ -4624,7 +4657,7 @@ class Parser {
         * this interface, as it is not documented and injudicious use could smash
         * private variables.**
         *
-        * @param $tag Mixed: the tag to use, e.g. 'hook' for <hook>
+        * @param $tag Mixed: the tag to use, e.g. 'hook' for "<hook>"
         * @param $callback Mixed: the callback function (and object) to use for the tag
         * @return Mixed|null The old value of the mTagHooks array associated with the hook
         */
@@ -4654,7 +4687,7 @@ class Parser {
         * @since 1.10
         * @todo better document or deprecate this
         *
-        * @param $tag Mixed: the tag to use, e.g. 'hook' for <hook>
+        * @param $tag Mixed: the tag to use, e.g. 'hook' for "<hook>"
         * @param $callback Mixed: the callback function (and object) to use for the tag
         * @return Mixed|null The old value of the mTagHooks array associated with the hook
         */
@@ -4762,7 +4795,7 @@ class Parser {
        }
 
        /**
-        * Create a tag function, e.g. <test>some stuff</test>.
+        * Create a tag function, e.g. "<test>some stuff</test>".
         * Unlike tag hooks, tag functions are parsed at preprocessor level.
         * Unlike parser functions, their content is not preprocessed.
         * @return null
@@ -4783,7 +4816,7 @@ class Parser {
 
        /**
         * @todo FIXME: Update documentation. makeLinkObj() is deprecated.
-        * Replace <!--LINK--> link placeholders with actual links, in the buffer
+        * Replace "<!--LINK-->" link placeholders with actual links, in the buffer
         * Placeholders created in Skin::makeLinkObj()
         *
         * @param $text string
@@ -4796,7 +4829,7 @@ class Parser {
        }
 
        /**
-        * Replace <!--LINK--> link placeholders with plain text of links
+        * Replace "<!--LINK-->" link placeholders with plain text of links
         * (not HTML-formatted).
         *
         * @param $text String
@@ -4929,7 +4962,7 @@ class Parser {
                                'vertAlign' => array( 'baseline', 'sub', 'super', 'top', 'text-top', 'middle',
                                        'bottom', 'text-bottom' ),
                                'frame' => array( 'thumbnail', 'manualthumb', 'framed', 'frameless',
-                                       'upright', 'border', 'link', 'alt' ),
+                                       'upright', 'border', 'link', 'alt', 'class' ),
                        );
                        static $internalParamMap;
                        if ( !$internalParamMap ) {
@@ -4979,6 +5012,7 @@ class Parser {
                #  * upright    reduce width for upright images, rounded to full __0 px
                #  * border     draw a 1px border around the image
                #  * alt        Text for HTML alt attribute (defaults to empty)
+               #  * class      Set a class for img node
                #  * link       Set the target of the image link. Can be external, interwiki, or local
                # vertical-align values (no % or length right now):
                #  * baseline
@@ -5022,27 +5056,22 @@ class Parser {
 
                                # Special case; width and height come in one variable together
                                if ( $type === 'handler' && $paramName === 'width' ) {
-                                       $m = array();
-                                       # (bug 13500) In both cases (width/height and width only),
-                                       # permit trailing "px" for backward compatibility.
-                                       if ( preg_match( '/^([0-9]*)x([0-9]*)\s*(?:px)?\s*$/', $value, $m ) ) {
-                                               $width = intval( $m[1] );
-                                               $height = intval( $m[2] );
+                                       $parsedWidthParam = $this->parseWidthParam( $value );
+                                       if( isset( $parsedWidthParam['width'] ) ) {
+                                               $width = $parsedWidthParam['width'];
                                                if ( $handler->validateParam( 'width', $width ) ) {
                                                        $params[$type]['width'] = $width;
                                                        $validated = true;
                                                }
+                                       }
+                                       if( isset( $parsedWidthParam['height'] ) ) {
+                                               $height = $parsedWidthParam['height'];
                                                if ( $handler->validateParam( 'height', $height ) ) {
                                                        $params[$type]['height'] = $height;
                                                        $validated = true;
                                                }
-                                       } elseif ( preg_match( '/^[0-9]*\s*(?:px)?\s*$/', $value ) ) {
-                                               $width = intval( $value );
-                                               if ( $handler->validateParam( 'width', $width ) ) {
-                                                       $params[$type]['width'] = $width;
-                                                       $validated = true;
-                                               }
-                                       } # else no validation -- bug 13436
+                                       }
+                                       # else no validation -- bug 13436
                                } else {
                                        if ( $type === 'handler' ) {
                                                # Validate handler parameter
@@ -5052,6 +5081,7 @@ class Parser {
                                                switch( $paramName ) {
                                                case 'manualthumb':
                                                case 'alt':
+                                               case 'class':
                                                        # @todo FIXME: Possibly check validity here for
                                                        # manualthumb? downstream behavior seems odd with
                                                        # missing manual thumbs.
@@ -5159,7 +5189,7 @@ class Parser {
 
                # Linker does the rest
                $time = isset( $options['time'] ) ? $options['time'] : false;
-               $ret = Linker::makeImageLink2( $title, $file, $params['frame'], $params['handler'],
+               $ret = Linker::makeImageLink( $this, $title, $file, $params['frame'], $params['handler'],
                        $time, $descQuery, $this->mOptions->getThumbSize() );
 
                # Give the handler a chance to modify the parser object
@@ -5268,13 +5298,13 @@ class Parser {
         *
         * @param $text String: Page wikitext
         * @param $section String: a section identifier string of the form:
-        *   <flag1> - <flag2> - ... - <section number>
+        *   "<flag1> - <flag2> - ... - <section number>"
         *
         * Currently the only recognised flag is "T", which means the target section number
         * was derived during a template inclusion parse, in other words this is a template
         * section edit link. If no flags are given, it was an ordinary section edit link.
         * This flag is required to avoid a section numbering mismatch when a section is
-        * enclosed by <includeonly> (bug 6563).
+        * enclosed by "<includeonly>" (bug 6563).
         *
         * The section number 0 pulls the text before the first heading; other numbers will
         * pull the given section along with its lower-level subsections. If the section is
@@ -5761,4 +5791,32 @@ class Parser {
        function isValidHalfParsedText( $data ) {
                return isset( $data['version'] ) && $data['version'] == self::HALF_PARSED_VERSION;
        }
+
+       /**
+        * Parsed a width param of imagelink like 300px or 200x300px
+        *
+        * @param $value String
+        *
+        * @return array
+        * @since 1.20
+        */
+       public function parseWidthParam( $value ) {
+               $parsedWidthParam = array();
+               if( $value === '' ) {
+                       return $parsedWidthParam;
+               }
+               $m = array();
+               # (bug 13500) In both cases (width/height and width only),
+               # permit trailing "px" for backward compatibility.
+               if ( preg_match( '/^([0-9]*)x([0-9]*)\s*(?:px)?\s*$/', $value, $m ) ) {
+                       $width = intval( $m[1] );
+                       $height = intval( $m[2] );
+                       $parsedWidthParam['width'] = $width;
+                       $parsedWidthParam['height'] = $height;
+               } elseif ( preg_match( '/^[0-9]*\s*(?:px)?\s*$/', $value ) ) {
+                       $width = intval( $value );
+                       $parsedWidthParam['width'] = $width;
+               }
+               return $parsedWidthParam;
+       }
 }
index bb99039..6a4ef0c 100644 (file)
@@ -119,8 +119,9 @@ class ParserCache {
         *
         * @todo Document parameter $useOutdated
         *
-        * @param $article Article
-        * @param $popts ParserOptions
+        * @param $article     Article
+        * @param $popts       ParserOptions
+        * @param $useOutdated Boolean (default true)
         * @return bool|mixed|string
         */
        public function getKey( $article, $popts, $useOutdated = true ) {
@@ -157,9 +158,9 @@ class ParserCache {
         * Retrieve the ParserOutput from ParserCache.
         * false if not found or outdated.
         *
-        * @param $article Article
-        * @param $popts ParserOptions
-        * @param $useOutdated
+        * @param $article     Article
+        * @param $popts       ParserOptions
+        * @param $useOutdated Boolean (default false)
         *
         * @return ParserOutput|bool False on failure
         */
index d929f1a..41b4a38 100644 (file)
@@ -1,6 +1,7 @@
 <?php
+
 /**
- * Output of the PHP parser
+ * Output of the PHP parser.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @file
  * @ingroup Parser
  */
-
-/**
- * @todo document
- * @ingroup Parser
- */
-class CacheTime {
-       var     $mVersion = Parser::VERSION,  # Compatibility check
-               $mCacheTime = '',             # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
-               $mCacheExpiry = null,         # Seconds after which the object should expire, use 0 for uncachable. Used in ParserCache.
-               $mContainsOldMagic;           # Boolean variable indicating if the input contained variables like {{CURRENTDAY}}
-
-       function getCacheTime()              { return $this->mCacheTime; }
-
-       function containsOldMagic()          { return $this->mContainsOldMagic; }
-       function setContainsOldMagic( $com ) { return wfSetVar( $this->mContainsOldMagic, $com ); }
-
-       /**
-        * setCacheTime() sets the timestamp expressing when the page has been rendered.
-        * This doesn not control expiry, see updateCacheExpiry() for that!
-        * @param $t string
-        * @return string
-        */
-       function setCacheTime( $t )          { return wfSetVar( $this->mCacheTime, $t ); }
-
-       /**
-        * Sets the number of seconds after which this object should expire.
-        * This value is used with the ParserCache.
-        * If called with a value greater than the value provided at any previous call,
-        * the new call has no effect. The value returned by getCacheExpiry is smaller
-        * or equal to the smallest number that was provided as an argument to
-        * updateCacheExpiry().
-        *
-        * @param $seconds number
-        */
-       function updateCacheExpiry( $seconds ) {
-               $seconds = (int)$seconds;
-
-               if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds ) {
-                       $this->mCacheExpiry = $seconds;
-               }
-
-               // hack: set old-style marker for uncacheable entries.
-               if ( $this->mCacheExpiry !== null && $this->mCacheExpiry <= 0 ) {
-                       $this->mCacheTime = -1;
-               }
-       }
-
-       /**
-        * Returns the number of seconds after which this object should expire.
-        * This method is used by ParserCache to determine how long the ParserOutput can be cached.
-        * The timestamp of expiry can be calculated by adding getCacheExpiry() to getCacheTime().
-        * The value returned by getCacheExpiry is smaller or equal to the smallest number
-        * that was provided to a call of updateCacheExpiry(), and smaller or equal to the
-        * value of $wgParserCacheExpireTime.
-        * @return int|mixed|null
-        */
-       function getCacheExpiry() {
-               global $wgParserCacheExpireTime;
-
-               if ( $this->mCacheTime < 0 ) {
-                       return 0;
-               } // old-style marker for "not cachable"
-
-               $expire = $this->mCacheExpiry;
-
-               if ( $expire === null ) {
-                       $expire = $wgParserCacheExpireTime;
-               } else {
-                       $expire = min( $expire, $wgParserCacheExpireTime );
-               }
-
-               if( $this->containsOldMagic() ) { //compatibility hack
-                       $expire = min( $expire, 3600 ); # 1 hour
-               }
-
-               if ( $expire <= 0 ) {
-                       return 0; // not cachable
-               } else {
-                       return $expire;
-               }
-       }
-
-       /**
-        * @return bool
-        */
-       function isCacheable() {
-               return $this->getCacheExpiry() > 0;
-       }
-
-       /**
-        * Return true if this cached output object predates the global or
-        * per-article cache invalidation timestamps, or if it comes from
-        * an incompatible older version.
-        *
-        * @param $touched String: the affected article's last touched timestamp
-        * @return Boolean
-        */
-       public function expired( $touched ) {
-               global $wgCacheEpoch;
-               return !$this->isCacheable() || // parser says it's uncacheable
-                          $this->getCacheTime() < $touched ||
-                          $this->getCacheTime() <= $wgCacheEpoch ||
-                          $this->getCacheTime() < wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) || // expiry period has passed
-                          !isset( $this->mVersion ) ||
-                          version_compare( $this->mVersion, Parser::VERSION, "lt" );
-       }
-}
-
 class ParserOutput extends CacheTime {
        var $mText,                       # The output text
                $mLanguageLinks,              # List of the full text of language links, in the order they appear
@@ -348,7 +241,7 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * Add some text to the <head>.
+        * Add some text to the "<head>".
         * If $tag is set, the section with that tag will only be included once
         * in a given page.
         */
@@ -469,7 +362,9 @@ class ParserOutput extends CacheTime {
         * Adds an update job to the output. Any update jobs added to the output will eventually bexecuted in order to
         * store any secondary information extracted from the page's content.
         *
-        * @param StorageUpdate $update
+        * @since 1.20
+        *
+        * @param DataUpdate $update
         */
        public function addSecondaryDataUpdate( DataUpdate $update ) {
                $this->mSecondaryDataUpdates[] = $update;
@@ -480,19 +375,21 @@ class ParserOutput extends CacheTime {
         * extracted from the page's content, including a LinksUpdate object for all links stored in
         * this ParserOutput object.
         *
+        * @since 1.20
+        *
         * @param $title Title of the page we're updating. If not given, a title object will be created based on $this->getTitleText()
         * @param $recursive Boolean: queue jobs for recursive updates?
         *
         * @return Array. An array of instances of DataUpdate
         */
        public function getSecondaryDataUpdates( Title $title = null, $recursive = true ) {
-               if ( !$title ) {
+               if ( is_null( $title ) ) {
                        $title = Title::newFromText( $this->getTitleText() );
                }
 
                $linksUpdate = new LinksUpdate( $title, $this, $recursive );
 
-               if ( !$this->mSecondaryDataUpdates ) {
+               if ( $this->mSecondaryDataUpdates === array() ) {
                        return array( $linksUpdate );
                } else {
                        $updates = array_merge( $this->mSecondaryDataUpdates, array( $linksUpdate ) );
@@ -500,4 +397,5 @@ class ParserOutput extends CacheTime {
 
                return $updates;
         }
+
 }
index 19bcbf2..bd13f9a 100644 (file)
@@ -231,7 +231,7 @@ interface PPNode {
        function getName();
 
        /**
-        * Split a <part> node into an associative array containing:
+        * Split a "<part>" node into an associative array containing:
         *    name          PPNode name
         *    index         String index
         *    value         PPNode value
@@ -239,13 +239,13 @@ interface PPNode {
        function splitArg();
 
        /**
-        * Split an <ext> node into an associative array containing name, attr, inner and close
+        * Split an "<ext>" node into an associative array containing name, attr, inner and close
         * All values in the resulting array are PPNodes. Inner and close are optional.
         */
        function splitExt();
 
        /**
-        * Split an <h> node
+        * Split an "<h>" node
         */
        function splitHeading();
 }
index f991df2..e75237b 100644 (file)
@@ -112,7 +112,7 @@ class Preprocessor_DOM implements Preprocessor {
         *
         * @param $text String: the text to parse
         * @param $flags Integer: bitwise combination of:
-        *          Parser::PTD_FOR_INCLUSION    Handle <noinclude>/<includeonly> as if the text is being
+        *          Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
         *                                     included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
@@ -235,6 +235,7 @@ class Preprocessor_DOM implements Preprocessor {
 
                $searchBase = "[{<\n"; #}
                $revText = strrev( $text ); // For fast reverse searches
+               $lengthText = strlen( $text );
 
                $i = 0;                     # Input pointer, starts out pointing to a pseudo-newline before the start
                $accum =& $stack->getAccum();   # Current accumulator
@@ -290,7 +291,7 @@ class Preprocessor_DOM implements Preprocessor {
                                        $accum .= htmlspecialchars( substr( $text, $i, $literalLength ) );
                                        $i += $literalLength;
                                }
-                               if ( $i >= strlen( $text ) ) {
+                               if ( $i >= $lengthText ) {
                                        if ( $currentClosing == "\n" ) {
                                                // Do a past-the-end run to finish off the heading
                                                $curChar = '';
@@ -354,10 +355,10 @@ class Preprocessor_DOM implements Preprocessor {
                                                // Unclosed comment in input, runs to end
                                                $inner = substr( $text, $i );
                                                $accum .= '<comment>' . htmlspecialchars( $inner ) . '</comment>';
-                                               $i = strlen( $text );
+                                               $i = $lengthText;
                                        } else {
                                                // Search backwards for leading whitespace
-                                               $wsStart = $i ? ( $i - strspn( $revText, ' ', strlen( $text ) - $i ) ) : 0;
+                                               $wsStart = $i ? ( $i - strspn( $revText, ' ', $lengthText - $i ) ) : 0;
                                                // Search forwards for trailing whitespace
                                                // $wsEnd will be the position of the last space (or the '>' if there's none)
                                                $wsEnd = $endPos + 2 + strspn( $text, ' ', $endPos + 3 );
@@ -438,7 +439,7 @@ class Preprocessor_DOM implements Preprocessor {
                                        } else {
                                                // No end tag -- let it run out to the end of the text.
                                                $inner = substr( $text, $tagEndPos + 1 );
-                                               $i = strlen( $text );
+                                               $i = $lengthText;
                                                $close = '';
                                        }
                                }
@@ -498,16 +499,16 @@ class Preprocessor_DOM implements Preprocessor {
                                $part = $piece->getCurrentPart();
                                // Search back through the input to see if it has a proper close
                                // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
-                               $wsLength = strspn( $revText, " \t", strlen( $text ) - $i );
+                               $wsLength = strspn( $revText, " \t", $lengthText - $i );
                                $searchStart = $i - $wsLength;
                                if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
                                        // Comment found at line end
                                        // Search for equals signs before the comment
                                        $searchStart = $part->visualEnd;
-                                       $searchStart -= strspn( $revText, " \t", strlen( $text ) - $searchStart );
+                                       $searchStart -= strspn( $revText, " \t", $lengthText - $searchStart );
                                }
                                $count = $piece->count;
-                               $equalsLength = strspn( $revText, '=', strlen( $text ) - $searchStart );
+                               $equalsLength = strspn( $revText, '=', $lengthText - $searchStart );
                                if ( $equalsLength > 0 ) {
                                        if ( $searchStart - $equalsLength == $piece->startPos ) {
                                                // This is just a single string of equals signs on its own line
@@ -1658,10 +1659,10 @@ class PPNode_DOM implements PPNode {
        }
 
        /**
-        * Split a <part> node into an associative array containing:
-        *    name          PPNode name
-        *    index         String index
-        *    value         PPNode value
+        * Split a "<part>" node into an associative array containing:
+        *  - name          PPNode name
+        *  - index         String index
+        *  - value         PPNode value
         *
         * @return array
         */
@@ -1681,7 +1682,7 @@ class PPNode_DOM implements PPNode {
        }
 
        /**
-        * Split an <ext> node into an associative array containing name, attr, inner and close
+        * Split an "<ext>" node into an associative array containing name, attr, inner and close
         * All values in the resulting array are PPNodes. Inner and close are optional.
         *
         * @return array
@@ -1708,7 +1709,7 @@ class PPNode_DOM implements PPNode {
        }
 
        /**
-        * Split a <h> node
+        * Split a "<h>" node
         * @return array
         */
        function splitHeading() {
index f455a1d..4f04c86 100644 (file)
@@ -24,7 +24,7 @@
 /**
  * Differences from DOM schema:
  *   * attribute nodes are children
- *   * <h> nodes that aren't at the top are replaced with <possible-h>
+ *   * "<h>" nodes that aren't at the top are replaced with <possible-h>
  * @ingroup Parser
  */
 class Preprocessor_Hash implements Preprocessor {
@@ -91,7 +91,7 @@ class Preprocessor_Hash implements Preprocessor {
         *
         * @param $text String: the text to parse
         * @param $flags Integer: bitwise combination of:
-        *          Parser::PTD_FOR_INCLUSION    Handle <noinclude>/<includeonly> as if the text is being
+        *          Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
         *                                     included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
@@ -177,6 +177,7 @@ class Preprocessor_Hash implements Preprocessor {
 
                $searchBase = "[{<\n";
                $revText = strrev( $text ); // For fast reverse searches
+               $lengthText = strlen( $text );
 
                $i = 0;                     # Input pointer, starts out pointing to a pseudo-newline before the start
                $accum =& $stack->getAccum();   # Current accumulator
@@ -231,7 +232,7 @@ class Preprocessor_Hash implements Preprocessor {
                                        $accum->addLiteral( substr( $text, $i, $literalLength ) );
                                        $i += $literalLength;
                                }
-                               if ( $i >= strlen( $text ) ) {
+                               if ( $i >= $lengthText ) {
                                        if ( $currentClosing == "\n" ) {
                                                // Do a past-the-end run to finish off the heading
                                                $curChar = '';
@@ -295,10 +296,10 @@ class Preprocessor_Hash implements Preprocessor {
                                                // Unclosed comment in input, runs to end
                                                $inner = substr( $text, $i );
                                                $accum->addNodeWithText( 'comment', $inner );
-                                               $i = strlen( $text );
+                                               $i = $lengthText;
                                        } else {
                                                // Search backwards for leading whitespace
-                                               $wsStart = $i ? ( $i - strspn( $revText, ' ', strlen( $text ) - $i ) ) : 0;
+                                               $wsStart = $i ? ( $i - strspn( $revText, ' ', $lengthText - $i ) ) : 0;
                                                // Search forwards for trailing whitespace
                                                // $wsEnd will be the position of the last space (or the '>' if there's none)
                                                $wsEnd = $endPos + 2 + strspn( $text, ' ', $endPos + 3 );
@@ -383,7 +384,7 @@ class Preprocessor_Hash implements Preprocessor {
                                        } else {
                                                // No end tag -- let it run out to the end of the text.
                                                $inner = substr( $text, $tagEndPos + 1 );
-                                               $i = strlen( $text );
+                                               $i = $lengthText;
                                                $close = null;
                                        }
                                }
@@ -447,16 +448,16 @@ class Preprocessor_Hash implements Preprocessor {
                                $part = $piece->getCurrentPart();
                                // Search back through the input to see if it has a proper close
                                // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
-                               $wsLength = strspn( $revText, " \t", strlen( $text ) - $i );
+                               $wsLength = strspn( $revText, " \t", $lengthText - $i );
                                $searchStart = $i - $wsLength;
                                if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
                                        // Comment found at line end
                                        // Search for equals signs before the comment
                                        $searchStart = $part->visualEnd;
-                                       $searchStart -= strspn( $revText, " \t", strlen( $text ) - $searchStart );
+                                       $searchStart -= strspn( $revText, " \t", $lengthText - $searchStart );
                                }
                                $count = $piece->count;
-                               $equalsLength = strspn( $revText, '=', strlen( $text ) - $searchStart );
+                               $equalsLength = strspn( $revText, '=', $lengthText - $searchStart );
                                if ( $equalsLength > 0 ) {
                                        if ( $searchStart - $equalsLength == $piece->startPos ) {
                                                // This is just a single string of equals signs on its own line
@@ -1574,7 +1575,7 @@ class PPNode_Hash_Tree implements PPNode {
                $children = array();
                for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
                        if ( isset( $child->name ) && $child->name === $name ) {
-                               $children[] = $name;
+                               $children[] = $child;
                        }
                }
                return $children;
@@ -1603,10 +1604,10 @@ class PPNode_Hash_Tree implements PPNode {
        }
 
        /**
-        * Split a <part> node into an associative array containing:
-        *    name          PPNode name
-        *    index         String index
-        *    value         PPNode value
+        * Split a "<part>" node into an associative array containing:
+        *  - name          PPNode name
+        *  - index         String index
+        *  - value         PPNode value
         *
         * @return array
         */
@@ -1638,7 +1639,7 @@ class PPNode_Hash_Tree implements PPNode {
        }
 
        /**
-        * Split an <ext> node into an associative array containing name, attr, inner and close
+        * Split an "<ext>" node into an associative array containing name, attr, inner and close
         * All values in the resulting array are PPNodes. Inner and close are optional.
         *
         * @return array
@@ -1666,7 +1667,7 @@ class PPNode_Hash_Tree implements PPNode {
        }
 
        /**
-        * Split an <h> node
+        * Split an "<h>" node
         *
         * @return array
         */
@@ -1692,7 +1693,7 @@ class PPNode_Hash_Tree implements PPNode {
        }
 
        /**
-        * Split a <template> or <tplarg> node
+        * Split a "<template>" or "<tplarg>" node
         *
         * @return array
         */
index d7b0716..2593b58 100644 (file)
@@ -115,7 +115,9 @@ class Preprocessor_HipHop implements Preprocessor {
                // Check cache.
                global $wgMemc, $wgPreprocessorCacheThreshold;
 
-               $cacheable = ($wgPreprocessorCacheThreshold !== false && strlen( $text ) > $wgPreprocessorCacheThreshold);
+               $lengthText = strlen( $text );
+
+               $cacheable = ($wgPreprocessorCacheThreshold !== false && $lengthText > $wgPreprocessorCacheThreshold);
                if ( $cacheable ) {
                        wfProfileIn( __METHOD__.'-cacheable' );
 
@@ -239,7 +241,7 @@ class Preprocessor_HipHop implements Preprocessor {
                                        $accum->addLiteral( strval( substr( $text, $i, $literalLength ) ) );
                                        $i += $literalLength;
                                }
-                               if ( $i >= strlen( $text ) ) {
+                               if ( $i >= $lengthText ) {
                                        if ( $currentClosing === "\n" ) {
                                                // Do a past-the-end run to finish off the heading
                                                $curChar = '';
@@ -305,12 +307,12 @@ class Preprocessor_HipHop implements Preprocessor {
                                                // Unclosed comment in input, runs to end
                                                $inner = strval( substr( $text, $i ) );
                                                $accum->addNodeWithText( 'comment', $inner );
-                                               $i = strlen( $text );
+                                               $i = $lengthText;
                                        } else {
                                                $endPos = intval( $variantEndPos );
                                                // Search backwards for leading whitespace
                                                if ( $i ) {
-                                                       $wsStart = $i - intval( strspn( $revText, ' ', strlen( $text ) - $i ) );
+                                                       $wsStart = $i - intval( strspn( $revText, ' ', $lengthText - $i ) );
                                                } else {
                                                        $wsStart = 0;
                                                }
@@ -403,7 +405,7 @@ class Preprocessor_HipHop implements Preprocessor {
                                        } else {
                                                // No end tag -- let it run out to the end of the text.
                                                $inner = strval( substr( $text, $tagEndPos + 1 ) );
-                                               $i = strlen( $text );
+                                               $i = $lengthText;
                                                $haveClose = false;
                                        }
                                }
@@ -468,16 +470,16 @@ class Preprocessor_HipHop implements Preprocessor {
                                $part = $piece->getCurrentPart();
                                // Search back through the input to see if it has a proper close
                                // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
-                               $wsLength = intval( strspn( $revText, " \t", strlen( $text ) - $i ) );
+                               $wsLength = intval( strspn( $revText, " \t", $lengthText - $i ) );
                                $searchStart = $i - $wsLength;
                                if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
                                        // Comment found at line end
                                        // Search for equals signs before the comment
                                        $searchStart = intval( $part->visualEnd );
-                                       $searchStart -= intval( strspn( $revText, " \t", strlen( $text ) - $searchStart ) );
+                                       $searchStart -= intval( strspn( $revText, " \t", $lengthText - $searchStart ) );
                                }
                                $count = intval( $piece->count );
-                               $equalsLength = intval( strspn( $revText, '=', strlen( $text ) - $searchStart ) );
+                               $equalsLength = intval( strspn( $revText, '=', $lengthText - $searchStart ) );
                                $isTreeNode = false;
                                $resultAccum = $accum;
                                if ( $equalsLength > 0 ) {
@@ -1758,7 +1760,7 @@ class PPNode_HipHop_Tree implements PPNode {
                $children = array();
                for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
                        if ( isset( $child->name ) && $child->name === $name ) {
-                               $children[] = $name;
+                               $children[] = $child;
                        }
                }
                return $children;
index b08aa14..ad95d5f 100644 (file)
@@ -134,11 +134,14 @@ class StripState {
                $marker = $m[1];
                if ( isset( $this->data[$this->tempType][$marker] ) ) {
                        if ( isset( $this->circularRefGuard[$marker] ) ) {
-                               return '<span class="error">' . wfMsgForContent( 'parser-unstrip-loop-warning' ) . '</span>';
+                               return '<span class="error">'
+                                       . wfMessage( 'parser-unstrip-loop-warning' )->inContentLanguage()->text()
+                                       . '</span>';
                        }
                        if ( $this->recursionLevel >= self::UNSTRIP_RECURSION_LIMIT ) {
                                return '<span class="error">' . 
-                                       wfMsgForContent( 'parser-unstrip-recursion-limit', self::UNSTRIP_RECURSION_LIMIT ) . 
+                                       wfMessage( 'parser-unstrip-recursion-limit' )
+                                               ->numParams( self::UNSTRIP_RECURSION_LIMIT )->inContentLanguage()->text() .
                                        '</span>';
                        }
                        $this->circularRefGuard[$marker] = true;
index b3d7e75..99fe7ed 100644 (file)
@@ -713,23 +713,27 @@ class ResourceLoader {
                                // Styles
                                $styles = array();
                                if ( $context->shouldIncludeStyles() ) {
-                                       // If we are in debug mode without &only= set, we'll want to return an array of URLs
-                                       // See comment near shouldIncludeScripts() for more details
-                                       if ( $context->getDebug() && !$context->getOnly() && $module->supportsURLLoading() ) {
-                                               $styles = $module->getStyleURLsForDebug( $context );
-                                       } else {
-                                               $styles = $module->getStyles( $context );
-                                               // Minify CSS before embedding in mw.loader.implement call
-                                               // (unless in debug mode)
-                                               if ( !$context->getDebug() ) {
-                                                       foreach ( $styles as $media => $style ) {
-                                                               if ( is_string( $style ) ) {
-                                                                       $styles[$media] = $this->filter( 'minify-css', $style );
+                                       // Don't create empty stylesheets like array( '' => '' ) for modules
+                                       // that don't *have* any stylesheets (bug 38024).
+                                       $stylePairs = $module->getStyles( $context );
+                                       if ( count ( $stylePairs ) ) {
+                                               // If we are in debug mode without &only= set, we'll want to return an array of URLs
+                                               // See comment near shouldIncludeScripts() for more details
+                                               if ( $context->getDebug() && !$context->getOnly() && $module->supportsURLLoading() ) {
+                                                       $styles = $module->getStyleURLsForDebug( $context );
+                                               } else {
+                                                       // Minify CSS before embedding in mw.loader.implement call
+                                                       // (unless in debug mode)
+                                                       if ( !$context->getDebug() ) {
+                                                               foreach ( $stylePairs as $media => $style ) {
+                                                                       if ( is_string( $style ) ) {
+                                                                               $stylePairs[$media] = $this->filter( 'minify-css', $style );
+                                                                       }
                                                                }
                                                        }
+                                                       // Combine styles into @media groups as one big string
+                                                       $styles = array( '' => self::makeCombinedStyles( $stylePairs ) );
                                                }
-                                               // Combine styles for all media types
-                                               $styles = array( '' => self::makeCombinedStyles( $styles ) );
                                        }
                                }
 
@@ -748,7 +752,11 @@ class ResourceLoader {
                                                }
                                                break;
                                        case 'styles':
-                                               $out .= $styles['']; // Code above has set $styles['']
+                                               // We no longer seperate into media, they are all concatenated now with
+                                               // custom media type groups into @media .. {} sections.
+                                               // Module returns either an empty array or an array with '' (no media type) as
+                                               // only key.
+                                               $out .= isset( $styles[''] ) ? $styles[''] : '';
                                                break;
                                        case 'messages':
                                                $out .= self::makeMessageSetScript( new XmlJsCode( $messagesBlob ) );
@@ -850,7 +858,7 @@ class ResourceLoader {
 
        /**
         * Combines an associative array mapping media type to CSS into a
-        * single stylesheet with @media blocks.
+        * single stylesheet with "@media" blocks.
         *
         * @param $styles Array: List of CSS strings keyed by media type
         *
index a36aaec..c916c4a 100644 (file)
@@ -29,7 +29,7 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
 
        protected $language;
        /**
-        * Get the grammer forms for the site content language.
+        * Get the grammar forms for the site content language.
         *
         * @return array
         */
@@ -37,6 +37,15 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
                return $this->language->getGrammarForms();
        }
 
+       /**
+        * Get the plural forms for the site content language.
+        *
+        * @return array
+        */
+       protected function getPluralRules() {
+               return $this->language->getPluralRules();
+       }
+
        /**
         * Get the digit transform table for the content language
         * Seperator transform table also required here to convert
@@ -61,17 +70,19 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
         * @return array
         */
        protected function getData() {
-               return array( 'grammarForms' => $this->getSiteLangGrammarForms(),
-                               'digitTransformTable' => $this->getDigitTransformTable()
-                       );
+               return array(
+                       'digitTransformTable' => $this->getDigitTransformTable(),
+                       'grammarForms' => $this->getSiteLangGrammarForms(),
+                       'pluralRules' => $this->getPluralRules(),
+               );
        }
 
        /**
         * @param $context ResourceLoaderContext
-        * @return string: Javascript code
+        * @return string: JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
-               $this->language = Language::factory( $context ->getLanguage() );
+               $this->language = Language::factory( $context->getLanguage() );
                return Xml::encodeJsCall( 'mw.language.setData', array(
                        $this->language->getCode(),
                        $this->getData()
index 035ff09..1e19d0f 100644 (file)
@@ -237,8 +237,8 @@ abstract class ResourceLoaderModule {
 
        /**
         * Where on the HTML page should this module's JS be loaded?
-        * 'top': in the <head>
-        * 'bottom': at the bottom of the <body>
+        *  - 'top': in the "<head>"
+        *  - 'bottom': at the bottom of the "<body>"
         *
         * @return string
         */
index 467a1ac..c86ed1d 100644 (file)
@@ -79,9 +79,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgVersion' => $wgVersion,
                        'wgEnableAPI' => $wgEnableAPI,
                        'wgEnableWriteAPI' => $wgEnableWriteAPI,
-                       'wgDefaultDateFormat' => $wgContLang->getDefaultDateFormat(),
-                       'wgMonthNames' => $wgContLang->getMonthNamesArray(),
-                       'wgMonthNamesShort' => $wgContLang->getMonthAbbreviationsArray(),
                        'wgMainPageTitle' => $mainPage->getPrefixedText(),
                        'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
                        'wgNamespaceIds' => $namespaceIds,
index f35e774..623a269 100644 (file)
@@ -42,7 +42,6 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        /* Abstract Protected Methods */
 
        /**
-        * @abstract
         * @param $context ResourceLoaderContext
         */
        abstract protected function getPages( ResourceLoaderContext $context );
@@ -78,7 +77,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                if ( !$title->isCssJsSubpage() && !$title->isCssOrJsPage() ) {
                        return null;
                }
-               $revision = Revision::newFromTitle( $title );
+               $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                if ( !$revision ) {
                        return null;
                }
@@ -183,7 +182,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        // We're dealing with a subclass that doesn't have a DB
                        return array();
                }
-               
+
                $hash = $context->getHash();
                if ( isset( $this->titleMtimes[$hash] ) ) {
                        return $this->titleMtimes[$hash];
index 95d372c..c59edc2 100644 (file)
@@ -124,69 +124,4 @@ class RevisionDeleter {
 
                return $timestamp;
        }
-
-       /**
-        * Creates utility links for log entries.
-        *
-        * @param $title Title
-        * @param $paramArray Array
-        * @param $messages
-        * @return String
-        */
-       public static function getLogLinks( $title, $paramArray, $messages ) {
-               global $wgLang;
-
-               if ( count( $paramArray ) >= 2 ) {
-                       // Different revision types use different URL params...
-                       $key = $paramArray[0];
-                       // $paramArray[1] is a CSV of the IDs
-                       $Ids = explode( ',', $paramArray[1] );
-
-                       $revert = array();
-
-                       // Diff link for single rev deletions
-                       if ( count( $Ids ) == 1 ) {
-                               // Live revision diffs...
-                               if ( in_array( $key, array( 'oldid', 'revision' ) ) ) {
-                                       $revert[] = Linker::linkKnown(
-                                               $title,
-                                               $messages['diff'],
-                                               array(),
-                                               array(
-                                                       'diff' => intval( $Ids[0] ),
-                                                       'unhide' => 1
-                                               )
-                                       );
-                               // Deleted revision diffs...
-                               } elseif ( in_array( $key, array( 'artimestamp','archive' ) ) ) {
-                                       $revert[] = Linker::linkKnown(
-                                               SpecialPage::getTitleFor( 'Undelete' ),
-                                               $messages['diff'],
-                                               array(),
-                                               array(
-                                                       'target'    => $title->getPrefixedDBKey(),
-                                                       'diff'      => 'prev',
-                                                       'timestamp' => $Ids[0]
-                                               )
-                                       );
-                               }
-                       }
-
-                       // View/modify link...
-                       $revert[] = Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Revisiondelete' ),
-                               $messages['revdel-restore'],
-                               array(),
-                               array(
-                                       'target' => $title->getPrefixedText(),
-                                       'type' => $key,
-                                       'ids' => implode(',', $Ids),
-                               )
-                       );
-
-                       // Pipe links
-                       return wfMsg( 'parentheses', $wgLang->pipeList( $revert ) );
-               }
-               return '';
-       }
 }
index 678c530..b505592 100644 (file)
@@ -315,7 +315,7 @@ class SearchEngine {
                        return $parsed;
                }
 
-               $allkeyword = wfMsgForContent( 'searchall' ) . ":";
+               $allkeyword = wfMessage( 'searchall' )->inContentLanguage()->text() . ":";
                if ( strncmp( $query, $allkeyword, strlen( $allkeyword ) ) == 0 ) {
                        $this->namespaces = null;
                        $parsed = substr( $query, strlen( $allkeyword ) );
@@ -417,7 +417,7 @@ class SearchEngine {
                $formatted = array_map( array( $wgContLang, 'getFormattedNsText' ), $namespaces );
                foreach ( $formatted as $key => $ns ) {
                        if ( empty( $ns ) )
-                               $formatted[$key] = wfMsg( 'blanknamespace' );
+                               $formatted[$key] = wfMessage( 'blanknamespace' )->text();
                }
                return $formatted;
        }
@@ -756,7 +756,8 @@ class SearchResult {
        protected function initFromTitle( $title ) {
                $this->mTitle = $title;
                if ( !is_null( $this->mTitle ) ) {
-                       $this->mRevision = Revision::newFromTitle( $this->mTitle );
+                       $this->mRevision = Revision::newFromTitle(
+                               $this->mTitle, false, Revision::READ_NORMAL );
                        if ( $this->mTitle->getNamespace() === NS_FILE )
                                $this->mImage = wfFindFile( $this->mTitle );
                }
index 1c45dc4..a2db52f 100644 (file)
@@ -124,7 +124,7 @@ class SearchOracle extends SearchEngine {
        /**
         * Return a LIMIT clause to limit results on the query.
         *
-        * @param string
+        * @param $sql string
         *
         * @return String
         */
index 06a4694..aefa6cc 100644 (file)
@@ -40,7 +40,12 @@ class ActiveUsersPager extends UsersPager {
        /**
         * @var Array
         */
-       protected $groups;
+       protected $hideGroups = array();
+
+       /**
+        * @var Array
+        */
+       protected $hideRights = array();
 
        /**
         * @param $context IContextSource
@@ -73,12 +78,11 @@ class ActiveUsersPager extends UsersPager {
 
                $this->opts->fetchValuesFromRequest( $this->getRequest() );
 
-               $this->groups = array();
                if ( $this->opts->getValue( 'hidebots' ) == 1 ) {
-                       $this->groups['bot'] = true;
+                       $this->hideRights[] = 'bot';
                }
                if ( $this->opts->getValue( 'hidesysops' ) == 1 ) {
-                       $this->groups['sysop'] = true;
+                       $this->hideGroups[] = 'sysop';
                }
        }
 
@@ -99,11 +103,11 @@ class ActiveUsersPager extends UsersPager {
 
                $query = array(
                        'tables' => array( 'recentchanges', 'user', 'ipblocks' ),
-                       'fields' => array( 'rc_user_text AS user_name', // inheritance
+                       'fields' => array( 'user_name' => 'rc_user_text', // inheritance
                                'rc_user_text', // for Pager
                                'user_id',
-                               'COUNT(*) AS recentedits',
-                               'MAX(ipb_user) AS blocked'
+                               'recentedits' => 'COUNT(*)',
+                               'blocked' => 'MAX(ipb_user)'
                        ),
                        'options' => array(
                                'GROUP BY' => array( 'rc_user_text', 'user_id' ),
@@ -127,12 +131,30 @@ class ActiveUsersPager extends UsersPager {
                $lang = $this->getLanguage();
 
                $list = array();
-               foreach( self::getGroups( $row->user_id ) as $group ) {
-                       if ( isset( $this->groups[$group] ) ) {
+               $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 );
index 0c03871..fe9d41e 100644 (file)
@@ -146,8 +146,9 @@ class AllmessagesTablePager extends TablePager {
        function buildForm() {
                global $wgScript;
 
-               $languages = Language::fetchLanguageNames( null, 'mw' );
-               ksort( $languages );
+               $attrs = array( 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' );
+               $msg = wfMessage( 'allmessages-language' );
+               $langSelect = Xml::languageSelector( $this->langcode, false, null, $attrs, $msg );
 
                $out  = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-allmessages-form' ) ) .
                        Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) .
@@ -187,18 +188,8 @@ class AllmessagesTablePager extends TablePager {
                                "</td>\n
                        </tr>
                        <tr>\n
-                               <td class=\"mw-label\">" .
-                                       Xml::label( $this->msg( 'allmessages-language' )->text(), 'mw-allmessages-form-lang' ) .
-                               "</td>\n
-                               <td class=\"mw-input\">" .
-                                       Xml::openElement( 'select', array( 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' ) );
-
-               foreach( $languages as $lang => $name ) {
-                       $selected = $lang == $this->langcode;
-                       $out .= Xml::option( $lang . ' - ' . $name, $lang, $selected ) . "\n";
-               }
-               $out .= Xml::closeElement( 'select' ) .
-                               "</td>\n
+                               <td class=\"mw-label\">" . $langSelect[0] . "</td>\n
+                               <td class=\"mw-input\">" . $langSelect[1] . "</td>\n
                        </tr>" .
 
                        '<tr>
index 1203e1f..6e3d49b 100644 (file)
@@ -41,9 +41,9 @@ class AncientPagesPage extends QueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'revision' ),
-                       'fields' => array( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'rev_timestamp AS value' ),
+                       'fields' => array( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'rev_timestamp' ),
                        'conds' => array( 'page_namespace' => MWNamespace::getContentNamespaces(),
                                        'page_is_redirect' => 0,
                                        'page_latest=rev_id' )
index 4d74fe1..b6484ce 100644 (file)
@@ -144,6 +144,7 @@ class SpecialBlock extends FormSpecialPage {
                                'tabindex' => '2',
                                'options' => self::getSuggestedDurations(),
                                'other' => $this->msg( 'ipbother' )->text(),
+                               'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
                        ),
                        'Reason' => array(
                                'type' => 'selectandother',
@@ -271,7 +272,7 @@ class SpecialBlock extends FormSpecialPage {
                        }
 
                        if( $block->mExpiry == 'infinity' ) {
-                               $fields['Expiry']['default'] = 'indefinite';
+                               $fields['Expiry']['default'] = 'infinite';
                        } else {
                                $fields['Expiry']['default'] = wfTimestamp( TS_RFC2822, $block->mExpiry );
                        }
@@ -300,6 +301,8 @@ class SpecialBlock extends FormSpecialPage {
         * @return String
         */
        protected function preText(){
+               $this->getOutput()->addModules( 'mediawiki.special.block' );
+
                $text = $this->msg( 'blockiptext' )->parse();
 
                $otherBlockMessages = array();
@@ -338,6 +341,8 @@ class SpecialBlock extends FormSpecialPage {
         * @return string
         */
        protected function postText(){
+               $links = array();
+
                # Link to the user's contributions, if applicable
                if( $this->target instanceof User ){
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $this->target->getName() );
index 0a3a28f..7143d5b 100644 (file)
@@ -372,7 +372,7 @@ class BlockListPager extends TablePager {
                                'ipb_user',
                                'ipb_by',
                                'ipb_by_text',
-                               'user_name AS by_user_name',
+                               'by_user_name' => 'user_name',
                                'ipb_reason',
                                'ipb_timestamp',
                                'ipb_auto',
index bc07d58..bf7de3f 100644 (file)
@@ -143,7 +143,7 @@ class SpecialBookSources extends SpecialPage {
                $page = $this->msg( 'booksources' )->inContentLanguage()->text();
                $title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language
                if( is_object( $title ) && $title->exists() ) {
-                       $rev = Revision::newFromTitle( $title );
+                       $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                        $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $rev->getText() ) );
                        return true;
                }
index d624430..8119e6d 100644 (file)
@@ -45,9 +45,9 @@ class BrokenRedirectsPage extends QueryPage {
                return array(
                        'tables' => array( 'redirect', 'p1' => 'page',
                                        'p2' => 'page' ),
-                       'fields' => array( 'p1.page_namespace AS namespace',
-                                       'p1.page_title AS title',
-                                       'p1.page_title AS value',
+                       'fields' => array( 'namespace' => 'p1.page_namespace',
+                                       'title' => 'p1.page_title',
+                                       'value' => 'p1.page_title',
                                        'rd_namespace',
                                        'rd_title'
                        ),
index 32eb2e7..b3f6c72 100644 (file)
@@ -56,6 +56,19 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         */
        protected $cacheEnabled = true;
 
+       /**
+        * Gets called after @see SpecialPage::execute.
+        *
+        * @since 1.20
+        *
+        * @param $subPage string|null
+        */
+       protected function afterExecute( $subPage ) {
+               $this->saveCache();
+
+               parent::afterExecute( $subPage );
+       }
+
        /**
         * Sets if the cache should be enabled or not.
         *
@@ -76,21 +89,23 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
         */
        public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
-               $this->cacheHelper = new CacheHelper();
+               if ( !isset( $this->cacheHelper ) ) {
+                       $this->cacheHelper = new CacheHelper();
 
-               $this->cacheHelper->setCacheEnabled( $this->cacheEnabled );
-               $this->cacheHelper->setOnInitializedHandler( array( $this, 'onCacheInitialized' ) );
+                       $this->cacheHelper->setCacheEnabled( $this->cacheEnabled );
+                       $this->cacheHelper->setOnInitializedHandler( array( $this, 'onCacheInitialized' ) );
 
-               $keyArgs = $this->getCacheKey();
+                       $keyArgs = $this->getCacheKey();
 
-               if ( array_key_exists( 'action', $keyArgs ) && $keyArgs['action'] === 'purge' ) {
-                       unset( $keyArgs['action'] );
-               }
+                       if ( array_key_exists( 'action', $keyArgs ) && $keyArgs['action'] === 'purge' ) {
+                               unset( $keyArgs['action'] );
+                       }
 
-               $this->cacheHelper->setCacheKey( $keyArgs );
+                       $this->cacheHelper->setCacheKey( $keyArgs );
 
-               if ( $this->getRequest()->getText( 'action' ) === 'purge' ) {
-                       $this->cacheHelper->rebuildOnDemand();
+                       if ( $this->getRequest()->getText( 'action' ) === 'purge' ) {
+                               $this->cacheHelper->rebuildOnDemand();
+                       }
                }
 
                $this->cacheHelper->startCache( $cacheExpiry, $cacheEnabled );
@@ -137,7 +152,9 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         * @since 1.20
         */
        public function saveCache() {
-               $this->cacheHelper->saveCache();
+               if ( isset( $this->cacheHelper ) ) {
+                       $this->cacheHelper->saveCache();
+               }
        }
 
        /**
index 6d2831c..1232e3f 100644 (file)
@@ -64,7 +64,8 @@ class CategoryPager extends AlphabeticPager {
                $from = str_replace( ' ', '_', $from );
                if( $from !== '' ) {
                        $from = Title::capitalize( $from, NS_CATEGORY );
-                       $this->mOffset = $from;
+                       $this->setOffset( $from );
+                       $this->setIncludeOffset( true );
                }
        }
 
index bd5a443..fc72610 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialChangeEmail extends UnlistedSpecialPage {
+
+       /**
+        * Users password
+        * @var string
+        */
+       protected $mPassword;
+
+       /**
+        * Users new email address
+        * @var string
+        */
+       protected $mNewEmail;
+
        public function __construct() {
                parent::__construct( 'ChangeEmail' );
        }
 
+       /**
+        * @return Bool
+        */
        function isListed() {
                global $wgAuth;
                return $wgAuth->allowPropChange( 'emailaddress' );
@@ -42,11 +58,13 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
        function execute( $par ) {
                global $wgAuth;
 
-               $this->checkReadOnly();
-
                $this->setHeaders();
                $this->outputHeader();
 
+               $out = $this->getOutput();
+               $out->disallowUserJs();
+               $out->addModules( 'mediawiki.special.changeemail' );
+
                if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) {
                        $this->error( 'cannotchangeemail' );
                        return;
@@ -65,9 +83,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                        return;
                }
 
-               $out = $this->getOutput();
-               $out->disallowUserJs();
-               $out->addModules( 'mediawiki.special.changeemail' );
+               $this->checkReadOnly();
 
                $this->mPassword = $request->getVal( 'wpPassword' );
                $this->mNewEmail = $request->getVal( 'wpNewEmail' );
@@ -90,6 +106,9 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $this->showForm();
        }
 
+       /**
+        * @param $type string
+        */
        protected function doReturnTo( $type = 'hard' ) {
                $titleObj = Title::newFromText( $this->getRequest()->getVal( 'returnto' ) );
                if ( !$titleObj instanceof Title ) {
@@ -102,11 +121,15 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                }
        }
 
+       /**
+        * @param $msg string
+        */
        protected function error( $msg ) {
                $this->getOutput()->wrapWikiMsg( "<p class='error'>\n$1\n</p>", $msg );
        }
 
        protected function showForm() {
+               global $wgRequirePasswordforEmailChange;
                $user = $this->getUser();
 
                $oldEmailText = $user->getEmail()
@@ -123,13 +146,20 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                        Html::hidden( 'token', $user->getEditToken() ) . "\n" .
                        Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
                        $this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
-                       Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n" .
-                       $this->pretty( array(
-                               array( 'wpName', 'username', 'text', $user->getName() ),
-                               array( 'wpOldEmail', 'changeemail-oldemail', 'text', $oldEmailText ),
-                               array( 'wpNewEmail', 'changeemail-newemail', 'input', $this->mNewEmail ),
-                               array( 'wpPassword', 'yourpassword', 'password', $this->mPassword ),
-                       ) ) . "\n" .
+                       Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
+               );
+               $items = array(
+                       array( 'wpName', 'username', 'text', $user->getName() ),
+                       array( 'wpOldEmail', 'changeemail-oldemail', 'text', $oldEmailText ),
+                       array( 'wpNewEmail', 'changeemail-newemail', 'input', $this->mNewEmail ),
+               );
+               if ( $wgRequirePasswordforEmailChange ) {
+                       $items[] = array( 'wpPassword', 'yourpassword', 'password', $this->mPassword );
+               }
+
+               $this->getOutput()->addHTML(
+                       $this->pretty( $items ) .
+                       "\n" .
                        "<tr>\n" .
                                "<td></td>\n" .
                                '<td class="mw-input">' .
@@ -143,6 +173,10 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                );
        }
 
+       /**
+        * @param $fields array
+        * @return string
+        */
        protected function pretty( $fields ) {
                $out = '';
                foreach ( $fields as $list ) {
@@ -173,6 +207,9 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
        }
 
        /**
+        * @param $user User
+        * @param $pass string
+        * @param $newaddr string
         * @return bool|string true or string on success, false on failure
         */
        protected function attemptChange( User $user, $pass, $newaddr ) {
@@ -187,7 +224,8 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                        return false;
                }
 
-               if ( !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
+               global $wgRequirePasswordforEmailChange;
+               if ( $wgRequirePasswordforEmailChange && !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
                        $this->error( 'wrongpassword' );
                        return false;
                }
@@ -201,7 +239,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                if ( !$status->isGood() ) {
                        $this->getOutput()->addHTML(
                                '<p class="error">' .
-                               $this->getOutput()->parseInline( $status->getWikiText( $info ) ) .
+                               $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
                                '</p>' );
                        return false;
                }
index 2b88325..41b3b25 100644 (file)
@@ -37,7 +37,9 @@ class SpecialChangePassword extends UnlistedSpecialPage {
        function execute( $par ) {
                global $wgAuth;
 
-               $this->checkReadOnly();
+               $this->setHeaders();
+               $this->outputHeader();
+               $this->getOutput()->disallowUserJs();
 
                $request = $this->getRequest();
                $this->mUserName = trim( $request->getVal( 'wpName' ) );
@@ -46,10 +48,6 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                $this->mRetype = $request->getVal( 'wpRetype' );
                $this->mDomain = $request->getVal( 'wpDomain' );
 
-               $this->setHeaders();
-               $this->outputHeader();
-               $this->getOutput()->disallowUserJs();
-
                $user = $this->getUser();
                if( !$request->wasPosted() && !$user->isLoggedIn() ) {
                        $this->error( $this->msg( 'resetpass-no-info' )->text() );
@@ -61,12 +59,11 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        return;
                }
 
+               $this->checkReadOnly();
+
                if( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
                        try {
-                               if ( isset( $_SESSION['wsDomain'] ) ) {
-                                       $this->mDomain = $_SESSION['wsDomain'];
-                               }
-                               $wgAuth->setDomain( $this->mDomain );
+                               $this->mDomain = $wgAuth->getDomain();
                                if( !$wgAuth->allowPasswordChange() ) {
                                        $this->error( $this->msg( 'resetpass_forbidden' )->text() );
                                        return;
index 9465037..fb94ff7 100644 (file)
@@ -594,6 +594,66 @@ class ContribsPager extends ReverseChronologicalPager {
                return $query;
        }
 
+       /**
+        * This method basically executes the exact same code as the parent class, though with
+        * a hook added, to allow extentions to add additional queries.
+        *
+        * @param $offset String: index offset, inclusive
+        * @param $limit Integer: exact query limit
+        * @param $descending Boolean: query direction, false for ascending, true for descending
+        * @return ResultWrapper
+        */
+       function reallyDoQuery( $offset, $limit, $descending ) {
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $descending );
+               $pager = $this;
+
+               /*
+                * This hook will allow extensions to add in additional queries, so they can get their data
+                * in My Contributions as well. Extensions should append their results to the $data array.
+                *
+                * Extension queries have to implement the navbar requirement as well. They should
+                * - have a column aliased as $pager->getIndexField()
+                * - have LIMIT set
+                * - have a WHERE-clause that compares the $pager->getIndexField()-equivalent column to the offset
+                * - have the ORDER BY specified based upon the details provided by the navbar
+                *
+                * See includes/Pager.php buildQueryInfo() method on how to build LIMIT, WHERE & ORDER BY
+                *
+                * &$data: an array of results of all contribs queries
+                * $pager: the ContribsPager object hooked into
+                * $offset: see phpdoc above
+                * $limit: see phpdoc above
+                * $descending: see phpdoc above
+                */
+               $data = array( $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds ) );
+               wfRunHooks( 'ContribsPager::reallyDoQuery', array( &$data, $pager, $offset, $limit, $descending ) );
+
+               $result = array();
+
+               // loop all results and collect them in an array
+               foreach ( $data as $j => $query ) {
+                       foreach ( $query as $i => $row ) {
+                               // use index column as key, allowing us to easily sort in PHP
+                               $result[$row->{$this->getIndexField()} . "-$i"] = $row;
+                       }
+               }
+
+               // sort results
+               if ( $descending ) {
+                       ksort( $result );
+               } else {
+                       krsort( $result );
+               }
+
+               // enforce limit
+               $result = array_slice( $result, 0, $limit );
+
+               // get rid of array keys
+               $result = array_values( $result );
+
+               return new FakeResultWrapper( $result );
+       }
+
        function getQueryInfo() {
                list( $tables, $index, $userCond, $join_cond ) = $this->getUserCond();
 
@@ -644,13 +704,22 @@ class ContribsPager extends ReverseChronologicalPager {
                $join_conds = array();
                $tables = array( 'revision', 'page', 'user' );
                if ( $this->contribs == 'newbie' ) {
-                       $tables[] = 'user_groups';
                        $max = $this->mDb->selectField( 'user', 'max(user_id)', false, __METHOD__ );
                        $condition[] = 'rev_user >' . (int)( $max - $max / 100 );
-                       $condition[] = 'ug_group IS NULL';
                        $index = 'user_timestamp';
-                       # @todo FIXME: Other groups may have 'bot' rights
-                       $join_conds['user_groups'] = array( 'LEFT JOIN', "ug_user = rev_user AND ug_group = 'bot'" );
+                       # ignore local groups with the bot right
+                       # @todo FIXME: Global groups may have 'bot' rights
+                       $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
+                       if( count( $groupsWithBotPermission ) ) {
+                               $tables[] = 'user_groups';
+                               $condition[] = 'ug_group IS NULL';
+                               $join_conds['user_groups'] = array(
+                                       'LEFT JOIN', array(
+                                               'ug_user = rev_user',
+                                               'ug_group' => $groupsWithBotPermission
+                                       )
+                               );
+                       }
                } else {
                        $uid = User::idFromName( $this->target );
                        if ( $uid ) {
@@ -699,27 +768,24 @@ class ContribsPager extends ReverseChronologicalPager {
        }
 
        function doBatchLookups() {
-               $this->mResult->rewind();
-               $revIds = array();
-               foreach ( $this->mResult as $row ) {
-                       if( $row->rev_parent_id ) {
-                               $revIds[] = $row->rev_parent_id;
-                       }
-               }
-               $this->mParentLens = Revision::getParentLengths( $this->getDatabase(), $revIds );
-               $this->mResult->rewind(); // reset
-
                # Do a link batch query
                $this->mResult->seek( 0 );
+               $revIds = array();
                $batch = new LinkBatch();
                # Give some pointers to make (last) links
                foreach ( $this->mResult as $row ) {
-                       if ( $this->contribs === 'newbie' ) { // multiple users
-                               $batch->add( NS_USER, $row->user_name );
-                               $batch->add( NS_USER_TALK, $row->user_name );
+                       if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
+                               $revIds[] = $row->rev_parent_id;
+                       }
+                       if ( isset( $row->rev_id ) ) {
+                               if ( $this->contribs === 'newbie' ) { // multiple users
+                                       $batch->add( NS_USER, $row->user_name );
+                                       $batch->add( NS_USER_TALK, $row->user_name );
+                               }
+                               $batch->add( $row->page_namespace, $row->page_title );
                        }
-                       $batch->add( $row->page_namespace, $row->page_title );
                }
+               $this->mParentLens = Revision::getParentLengths( $this->getDatabase(), $revIds );
                $batch->execute();
                $this->mResult->seek( 0 );
        }
@@ -753,136 +819,144 @@ class ContribsPager extends ReverseChronologicalPager {
        function formatRow( $row ) {
                wfProfileIn( __METHOD__ );
 
-               $rev = new Revision( $row );
+               $ret = '';
                $classes = array();
 
-               $page = Title::newFromRow( $row );
-               $link = Linker::link(
-                       $page,
-                       htmlspecialchars( $page->getPrefixedText() ),
-                       array(),
-                       $page->isRedirect() ? array( 'redirect' => 'no' ) : array()
-               );
-               # Mark current revisions
-               $topmarktext = '';
-               if ( $row->rev_id == $row->page_latest ) {
-                       $topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>';
-                       # Add rollback link
-                       if ( !$row->page_is_new && $page->quickUserCan( 'rollback' )
-                               && $page->quickUserCan( 'edit' ) )
-                       {
-                               $this->preventClickjacking();
-                               $topmarktext .= ' ' . Linker::generateRollback( $rev );
-                       }
-               }
-               $user = $this->getUser();
-               # Is there a visible previous revision?
-               if ( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) {
-                       $difftext = Linker::linkKnown(
+               /*
+                * There may be more than just revision rows. To make sure that we'll only be processing
+                * revisions here, let's _try_ to build a revision out of our row (without displaying
+                * notices though) and then trying to grab data from the built object. If we succeed,
+                * we're definitely dealing with revision data and we may proceed, if not, we'll leave it
+                * to extensions to subscribe to the hook to parse the row.
+                */
+               wfSuppressWarnings();
+               $rev = new Revision( $row );
+               $validRevision = $rev->getParentId() !== null;
+               wfRestoreWarnings();
+
+               if ( $validRevision ) {
+                       $classes = array();
+
+                       $page = Title::newFromRow( $row );
+                       $link = Linker::link(
                                $page,
-                               $this->messages['diff'],
+                               htmlspecialchars( $page->getPrefixedText() ),
                                array(),
-                               array(
-                                       'diff' => 'prev',
-                                       'oldid' => $row->rev_id
-                               )
+                               $page->isRedirect() ? array( 'redirect' => 'no' ) : array()
                        );
-               } else {
-                       $difftext = $this->messages['diff'];
-               }
-               $histlink = Linker::linkKnown(
-                       $page,
-                       $this->messages['hist'],
-                       array(),
-                       array( 'action' => 'history' )
-               );
-
-               if ( $row->rev_parent_id === null ) {
-                       // For some reason rev_parent_id isn't populated for this row.
-                       // Its rumoured this is true on wikipedia for some revisions (bug 34922).
-                       // Next best thing is to have the total number of bytes.
-                       $chardiff = ' . . ' . Linker::formatRevisionSize( $row->rev_len ) . ' . . ';
-               } else {
-                       $parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0;
-                       $chardiff = ' . . ' . ChangesList::showCharacterDifference(
-                                       $parentLen, $row->rev_len ) . ' . . ';
-               }
-
-               $lang = $this->getLanguage();
-               $comment = $lang->getDirMark() . Linker::revComment( $rev, false, true );
-               $date = $lang->userTimeAndDate( $row->rev_timestamp, $user );
-               if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-                       $d = Linker::linkKnown(
+                       # Mark current revisions
+                       $topmarktext = '';
+                       $user = $this->getUser();
+                       if ( $row->rev_id == $row->page_latest ) {
+                               $topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>';
+                               # Add rollback link
+                               if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user )
+                                       && $page->quickUserCan( 'edit', $user ) )
+                               {
+                                       $this->preventClickjacking();
+                                       $topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
+                               }
+                       }
+                       # Is there a visible previous revision?
+                       if ( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) {
+                               $difftext = Linker::linkKnown(
+                                       $page,
+                                       $this->messages['diff'],
+                                       array(),
+                                       array(
+                                               'diff' => 'prev',
+                                               'oldid' => $row->rev_id
+                                       )
+                               );
+                       } else {
+                               $difftext = $this->messages['diff'];
+                       }
+                       $histlink = Linker::linkKnown(
                                $page,
-                               htmlspecialchars( $date ),
+                               $this->messages['hist'],
                                array(),
-                               array( 'oldid' => intval( $row->rev_id ) )
+                               array( 'action' => 'history' )
                        );
-               } else {
-                       $d = htmlspecialchars( $date );
-               }
-               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-                       $d = '<span class="history-deleted">' . $d . '</span>';
-               }
 
-               # Show user names for /newbies as there may be different users.
-               # Note that we already excluded rows with hidden user names.
-               if ( $this->contribs == 'newbie' ) {
-                       $userlink = ' . . ' . Linker::userLink( $rev->getUser(), $rev->getUserText() );
-                       $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams(
-                               Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' ';
-               } else {
-                       $userlink = '';
-               }
+                       if ( $row->rev_parent_id === null ) {
+                               // For some reason rev_parent_id isn't populated for this row.
+                               // Its rumoured this is true on wikipedia for some revisions (bug 34922).
+                               // Next best thing is to have the total number of bytes.
+                               $chardiff = ' . . ' . Linker::formatRevisionSize( $row->rev_len ) . ' . . ';
+                       } else {
+                               $parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0;
+                               $chardiff = ' . . ' . ChangesList::showCharacterDifference(
+                                               $parentLen, $row->rev_len, $this->getContext() ) . ' . . ';
+                       }
 
-               if ( $rev->getParentId() === 0 ) {
-                       $nflag = ChangesList::flag( 'newpage' );
-               } else {
-                       $nflag = '';
-               }
+                       $lang = $this->getLanguage();
+                       $comment = $lang->getDirMark() . Linker::revComment( $rev, false, true );
+                       $date = $lang->userTimeAndDate( $row->rev_timestamp, $user );
+                       if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+                               $d = Linker::linkKnown(
+                                       $page,
+                                       htmlspecialchars( $date ),
+                                       array(),
+                                       array( 'oldid' => intval( $row->rev_id ) )
+                               );
+                       } else {
+                               $d = htmlspecialchars( $date );
+                       }
+                       if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+                               $d = '<span class="history-deleted">' . $d . '</span>';
+                       }
 
-               if ( $rev->isMinor() ) {
-                       $mflag = ChangesList::flag( 'minor' );
-               } else {
-                       $mflag = '';
-               }
+                       # Show user names for /newbies as there may be different users.
+                       # Note that we already excluded rows with hidden user names.
+                       if ( $this->contribs == 'newbie' ) {
+                               $userlink = ' . . ' . Linker::userLink( $rev->getUser(), $rev->getUserText() );
+                               $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams(
+                                       Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' ';
+                       } else {
+                               $userlink = '';
+                       }
 
-               $del = Linker::getRevDeleteLink( $user, $rev, $page );
-               if ( $del !== '' ) {
-                       $del .= ' ';
-               }
+                       if ( $rev->getParentId() === 0 ) {
+                               $nflag = ChangesList::flag( 'newpage' );
+                       } else {
+                               $nflag = '';
+                       }
 
-               $diffHistLinks = $this->msg( 'parentheses' )->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )->escaped();
-               $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
+                       if ( $rev->isMinor() ) {
+                               $mflag = ChangesList::flag( 'minor' );
+                       } else {
+                               $mflag = '';
+                       }
 
-               # Denote if username is redacted for this edit
-               if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
-                       $ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
-               }
+                       $del = Linker::getRevDeleteLink( $user, $rev, $page );
+                       if ( $del !== '' ) {
+                               $del .= ' ';
+                       }
 
-               # Tags, if any.
-               list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'contributions' );
-               $classes = array_merge( $classes, $newClasses );
-               $ret .= " $tagSummary";
+                       $diffHistLinks = $this->msg( 'parentheses' )->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )->escaped();
+                       $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
+
+                       # Denote if username is redacted for this edit
+                       if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
+                               $ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
+                       }
+
+                       # Tags, if any.
+                       list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'contributions' );
+                       $classes = array_merge( $classes, $newClasses );
+                       $ret .= " $tagSummary";
+               }
 
                // Let extensions add data
-               wfRunHooks( 'ContributionsLineEnding', array( &$this, &$ret, $row ) );
+               wfRunHooks( 'ContributionsLineEnding', array( $this, &$ret, $row, &$classes ) );
 
                $classes = implode( ' ', $classes );
                $ret = "<li class=\"$classes\">$ret</li>\n";
+
                wfProfileOut( __METHOD__ );
                return $ret;
        }
 
-       /**
-        * Get the Database object in use
-        *
-        * @return DatabaseBase
-        */
-       public function getDatabase() {
-               return $this->mDb;
-       }
-
        /**
         * Overwrite Pager function and return a helpful comment
         * @return string
index 75818c9..f4904a5 100644 (file)
@@ -59,9 +59,9 @@ class DeadendPagesPage extends PageQueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'pagelinks' ),
-                       'fields' => array( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_title AS value'
+                       'fields' => array( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_title'
                        ),
                        'conds' => array( 'pl_from IS NULL',
                                        'page_namespace' => MWNamespace::getContentNamespaces(),
index ff2a901..991e7a2 100644 (file)
@@ -94,17 +94,17 @@ class DeletedContribsPager extends IndexPager {
                if ( isset( $this->mNavigationBar ) ) {
                        return $this->mNavigationBar;
                }
-               $lang = $this->getLanguage();
-               $fmtLimit = $lang->formatNum( $this->mLimit );
+
                $linkTexts = array(
-                       'prev' => $this->msg( 'pager-newer-n', $fmtLimit )->escaped(),
-                       'next' => $this->msg( 'pager-older-n', $fmtLimit )->escaped(),
+                       'prev' => $this->msg( 'pager-newer-n' )->numParams( $this->mLimit )->escaped(),
+                       'next' => $this->msg( 'pager-older-n' )->numParams( $this->mLimit )->escaped(),
                        'first' => $this->msg( 'histlast' )->escaped(),
                        'last' => $this->msg( 'histfirst' )->escaped()
                );
 
                $pagingLinks = $this->getPagingLinks( $linkTexts );
                $limitLinks = $this->getLimitLinks();
+               $lang = $this->getLanguage();
                $limits = $lang->pipeList( $limitLinks );
 
                $this->mNavigationBar = "(" . $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) ) . ") " .
index a5ab3e6..48180a7 100644 (file)
@@ -32,21 +32,29 @@ class DisambiguationsPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() { return true; }
-       function isSyndicated() { return false; }
+       function isExpensive() {
+               return true;
+       }
+
+       function isSyndicated() {
+               return false;
+       }
 
        function getPageHeader() {
                return $this->msg( 'disambiguations-text' )->parseAsBlock();
        }
 
-       function getQueryInfo() {
+       /**
+        * @return string|bool False on failure
+        */
+       function getQueryFromLinkBatch() {
                $dbr = wfGetDB( DB_SLAVE );
                $dMsgText = $this->msg( 'disambiguationspage' )->inContentLanguage()->text();
                $linkBatch = new LinkBatch;
 
                # If the text can be treated as a title, use it verbatim.
                # Otherwise, pull the titles from the links table
-               $dp = Title::newFromText($dMsgText);
+               $dp = Title::newFromText( $dMsgText );
                if( $dp ) {
                        if( $dp->getNamespace() != NS_TEMPLATE ) {
                                # @todo FIXME: We assume the disambiguation message is a template but
@@ -71,25 +79,38 @@ class DisambiguationsPage extends QueryPage {
                                }
                }
                $set = $linkBatch->constructSet( 'tl', $dbr );
+
                if( $set === false ) {
                        # We must always return a valid SQL query, but this way
                        # the DB will always quickly return an empty result
                        $set = 'FALSE';
-                       wfDebug("Mediawiki:disambiguationspage message does not link to any templates!\n");
+                       wfDebug( "Mediawiki:disambiguationspage message does not link to any templates!\n" );
                }
+               return $set;
+       }
 
+       function getQueryInfo() {
                // @todo FIXME: What are pagelinks and p2 doing here?
                return array (
-                       'tables' => array( 'templatelinks', 'p1' => 'page', 'pagelinks', 'p2' => 'page' ),
-                       'fields' => array( 'p1.page_namespace AS namespace',
-                                       'p1.page_title AS title',
-                                       'pl_from AS value' ),
-                       'conds' => array( $set,
-                                       'p1.page_id = tl_from',
-                                       'pl_namespace = p1.page_namespace',
-                                       'pl_title = p1.page_title',
-                                       'p2.page_id = pl_from',
-                                       'p2.page_namespace' => MWNamespace::getContentNamespaces() )
+                       'tables' => array(
+                               'templatelinks',
+                               'p1' => 'page',
+                               'pagelinks',
+                               'p2' => 'page'
+                       ),
+                       'fields' => array(
+                               'namespace' => 'p1.page_namespace',
+                               'title' => 'p1.page_title',
+                               'value' => 'pl_from'
+                       ),
+                       'conds' => array(
+                               $this->getQueryFromLinkBatch(),
+                               'p1.page_id = tl_from',
+                               'pl_namespace = p1.page_namespace',
+                               'pl_title = p1.page_title',
+                               'p2.page_id = pl_from',
+                               'p2.page_namespace' => MWNamespace::getContentNamespaces()
+                       )
                );
        }
 
@@ -126,10 +147,14 @@ class DisambiguationsPage extends QueryPage {
                $dp = Title::makeTitle( $result->namespace, $result->title );
 
                $from = Linker::link( $title );
-               $edit = Linker::link( $title, $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
-                       array(), array( 'redirect' => 'no', 'action' => 'edit' ) );
-               $arr  = $this->getLanguage()->getArrow();
-               $to   = Linker::link( $dp );
+               $edit = Linker::link(
+                       $title,
+                       $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
+                       array(),
+                       array( 'redirect' => 'no', 'action' => 'edit' )
+               );
+               $arr = $this->getLanguage()->getArrow();
+               $to = Linker::link( $dp );
 
                return "$from $edit $arr $to";
        }
index 51cb08a..5864ca9 100644 (file)
@@ -47,13 +47,13 @@ class DoubleRedirectsPage extends QueryPage {
                        'tables' => array ( 'ra' => 'redirect',
                                        'rb' => 'redirect', 'pa' => 'page',
                                        'pb' => 'page', 'pc' => 'page' ),
-                       'fields' => array ( 'pa.page_namespace AS namespace',
-                                       'pa.page_title AS title',
-                                       'pa.page_title AS value',
-                                       'pb.page_namespace AS nsb',
-                                       'pb.page_title AS tb',
-                                       'pc.page_namespace AS nsc',
-                                       'pc.page_title AS tc' ),
+                       'fields' => array ( 'namespace' => 'pa.page_namespace',
+                                       'title' => 'pa.page_title',
+                                       'value' => 'pa.page_title',
+                                       'nsb' => 'pb.page_namespace',
+                                       'tb' => 'pb.page_title',
+                                       'nsc' => 'pc.page_namespace',
+                                       'tc' => 'pc.page_title' ),
                        'conds' => array ( 'ra.rd_from = pa.page_id',
                                        'pb.page_namespace = ra.rd_namespace',
                                        'pb.page_title = ra.rd_title',
index 67f6d68..23cd9aa 100644 (file)
@@ -103,7 +103,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                $form = $this->getRawForm();
                                if( $form->show() ){
                                        $out->addHTML( $this->successMessage );
-                                       $out->returnToMain();
+                                       $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
                                }
                                break;
 
@@ -113,7 +113,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                $form = $this->getNormalForm();
                                if( $form->show() ){
                                        $out->addHTML( $this->successMessage );
-                                       $out->returnToMain();
+                                       $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
                                } elseif ( $this->toc !== false ) {
                                        $out->prependHTML( $this->toc );
                                }
@@ -129,21 +129,28 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * @return array
         */
        private function extractTitles( $list ) {
-               $titles = array();
                $list = explode( "\n", trim( $list ) );
                if( !is_array( $list ) ) {
                        return array();
                }
+               $titles = array();
                foreach( $list as $text ) {
                        $text = trim( $text );
                        if( strlen( $text ) > 0 ) {
                                $title = Title::newFromText( $text );
                                if( $title instanceof Title && $title->isWatchable() ) {
-                                       $titles[] = $title->getPrefixedText();
+                                       $titles[] = $title;
                                }
                        }
                }
-               return array_unique( $titles );
+
+               GenderCache::singleton()->doTitlesArray( $titles );
+
+               $list = array();
+               foreach( $titles as $title ) {
+                       $list[] = $title->getPrefixedText();
+               }
+               return array_unique( $list );
        }
 
        public function submitRaw( $data ){
@@ -249,15 +256,22 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        __METHOD__
                );
                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()
                                ) {
-                                       $list[] = $title->getPrefixedText();
+                                       $titles[] = $title;
                                }
                        }
                        $res->free();
+
+                       GenderCache::singleton()->doTitlesArray( $titles );
+
+                       foreach( $titles as $title ) {
+                               $list[] = $title->getPrefixedText();
+                       }
                }
                $this->cleanupWatchlist();
                return $list;
@@ -485,7 +499,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                if ( count( $fields ) > 1 && $count > 30 ) {
                        $this->toc = Linker::tocIndent();
                        $tocLength = 0;
-                       foreach( $fields as $key => $data ) {
+                       foreach( $fields as $data ) {
 
                                # strip out the 'ns' prefix from the section name:
                                $ns = substr( $data['section'], 2 );
@@ -618,12 +632,12 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        // can use messages 'watchlisttools-view', 'watchlisttools-edit', 'watchlisttools-raw'
                        $tools[] = Linker::linkKnown(
                                SpecialPage::getTitleFor( $arr[0], $arr[1] ),
-                               wfMsgHtml( "watchlisttools-{$mode}" )
+                               wfMessage( "watchlisttools-{$mode}" )->escaped()
                        );
                }
                return Html::rawElement( 'span',
                                        array( 'class' => 'mw-watchlist-toollinks' ),
-                                       wfMsg( 'parentheses', $wgLang->pipeList( $tools ) ) );
+                                       wfMessage( 'parentheses', $wgLang->pipeList( $tools ) )->text() );
        }
 }
 
index 2ab02cb..4d875e6 100644 (file)
@@ -33,6 +33,15 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                parent::__construct( 'Emailuser' );
        }
 
+       public function getDescription() {
+               $target = self::getTarget( $this->mTarget );
+               if( !$target instanceof User ) {
+                       return $this->msg( 'emailuser-title-notarget' )->text();
+               }
+
+               return $this->msg( 'emailuser-title-target', $target->getName() )->text();
+       }
+
        protected function getFormFields() {
                return array(
                        'From' => array(
@@ -66,14 +75,14 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                                'label-message' => 'emailsubject',
                                'maxlength' => 200,
                                'size' => 60,
-                               'required' => 1,
+                               'required' => true,
                        ),
                        'Text' => array(
                                'type' => 'textarea',
                                'rows' => 20,
                                'cols' => 80,
                                'label-message' => 'emailmessage',
-                               'required' => 1,
+                               'required' => true,
                        ),
                        'CCMe' => array(
                                'type' => 'check',
@@ -84,13 +93,18 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        }
 
        public function execute( $par ) {
-               $this->setHeaders();
-               $this->outputHeader();
                $out = $this->getOutput();
                $out->addModuleStyles( 'mediawiki.special' );
+
                $this->mTarget = is_null( $par )
                        ? $this->getRequest()->getVal( 'wpTarget', $this->getRequest()->getVal( 'target', '' ) )
                        : $par;
+
+               // This needs to be below assignment of $this->mTarget because
+               // getDescription() needs it to determine the correct page title.
+               $this->setHeaders();
+               $this->outputHeader();
+
                // error out if sending user cannot do this
                $error = self::getPermissionsError( $this->getUser(), $this->getRequest()->getVal( 'wpEditToken' ) );
                switch ( $error ) {
@@ -136,7 +150,6 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        return false;
                }
 
-               $out->setPageTitle( $this->msg( 'emailpage' ) );
                $result = $form->show();
 
                if( $result === true || ( $result instanceof Status && $result->isGood() ) ) {
index b00eec8..b4294b3 100644 (file)
@@ -455,7 +455,7 @@ class SpecialExport extends SpecialPage {
        private function getTemplates( $inputPages, $pageSet ) {
                return $this->getLinks( $inputPages, $pageSet,
                        'templatelinks',
-                       array( 'tl_namespace AS namespace', 'tl_title AS title' ),
+                       array( 'namespace' => 'tl_namespace', 'title' => 'tl_title' ),
                        array( 'page_id=tl_from' )
                );
        }
@@ -497,7 +497,7 @@ class SpecialExport extends SpecialPage {
                for( ; $depth > 0; --$depth ) {
                        $pageSet = $this->getLinks(
                                $inputPages, $pageSet, 'pagelinks',
-                               array( 'pl_namespace AS namespace', 'pl_title AS title' ),
+                               array( 'namespace' => 'pl_namespace', 'title' => 'pl_title' ),
                                array( 'page_id=pl_from' )
                        );
                        $inputPages = array_keys( $pageSet );
@@ -519,7 +519,7 @@ class SpecialExport extends SpecialPage {
                        $inputPages,
                        $pageSet,
                        'imagelinks',
-                       array( NS_FILE . ' AS namespace', 'il_to AS title' ),
+                       array( 'namespace' => NS_FILE, 'title' => 'il_to' ),
                        array( 'page_id=il_from' )
                );
        }
index 5610cc2..7e4bc9c 100644 (file)
@@ -44,10 +44,10 @@ class FewestrevisionsPage extends QueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'revision', 'page' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'COUNT(*) AS value',
-                                       'page_is_redirect AS 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',
index 18d19db..ccf8ba1 100644 (file)
@@ -78,8 +78,8 @@ class FileDuplicateSearchPage extends QueryPage {
                return array(
                        'tables' => array( 'image' ),
                        'fields' => array(
-                               'img_name AS title',
-                               'img_sha1 AS value',
+                               'title' => 'img_name',
+                               'value' => 'img_sha1',
                                'img_user_text',
                                'img_timestamp'
                        ),
@@ -157,10 +157,24 @@ class FileDuplicateSearchPage extends QueryPage {
                                );
                        }
 
+                       $this->doBatchLookups( $dupes );
                        $this->showList( $dupes );
                }
        }
 
+       function doBatchLookups( $list ) {
+               $batch = new LinkBatch();
+               foreach( $list as $file ) {
+                       $batch->addObj( $file->getTitle() );
+                       if( $file->isLocal() ) {
+                               $userName = $file->getUser( 'text' );
+                               $batch->add( NS_USER, $userName );
+                               $batch->add( NS_USER_TALK, $userName );
+                       }
+               }
+               $batch->execute();
+       }
+
        /**
         *
         * @param Skin $skin
@@ -178,7 +192,17 @@ class FileDuplicateSearchPage extends QueryPage {
                );
 
                $userText = $result->getUser( 'text' );
-               $user = Linker::link( Title::makeTitle( NS_USER, $userText ), $userText );
+               if ( $result->isLocal() ) {
+                       $userId = $result->getUser( 'id' );
+                       $user = Linker::userLink( $userId, $userText );
+                       $user .= $this->getContext()->msg( 'word-separator' )->plain();
+                       $user .= '<span style="white-space: nowrap;">';
+                       $user .= Linker::userToolLinks( $userId, $userText );
+                       $user .= '</span>';
+               } else {
+                       $user = htmlspecialchars( $userText );
+               }
+
                $time = $this->getLanguage()->userTimeAndDate( $result->getTimestamp(), $this->getUser() );
 
                return "$plink . . $user . . $time";
index 2ea030e..362fc5c 100644 (file)
@@ -33,6 +33,7 @@ class SpecialImport extends SpecialPage {
 
        private $interwiki = false;
        private $namespace;
+       private $rootpage = '';
        private $frompage = '';
        private $logcomment= false;
        private $history = true;
@@ -100,6 +101,7 @@ class SpecialImport extends SpecialPage {
 
                $this->logcomment = $request->getText( 'log-comment' );
                $this->pageLinkDepth = $wgExportMaxLinkDepth == 0 ? 0 : $request->getIntOrNull( 'pagelink-depth' );
+               $this->rootpage = $request->getText( 'rootpage' );\r
 
                $user = $this->getUser();
                if ( !$user->matchEditToken( $request->getVal( 'editToken' ) ) ) {
@@ -137,12 +139,20 @@ class SpecialImport extends SpecialPage {
                if( !$source->isGood() ) {
                        $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $source->getWikiText() ) );
                } else {
-                       $out->addWikiMsg( "importstart" );
-
                        $importer = new WikiImporter( $source->value );
                        if( !is_null( $this->namespace ) ) {
                                $importer->setTargetNamespace( $this->namespace );
                        }
+                       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() ) ) );
+                                       return;
+                               }
+                       }
+
+                       $out->addWikiMsg( "importstart" );
+
                        $reporter = new ImportReporter( $importer, $isUpload, $this->interwiki , $this->logcomment);
                        $reporter->setContext( $this->getContext() );
                        $exception = false;
@@ -177,11 +187,11 @@ class SpecialImport extends SpecialPage {
                $out = $this->getOutput();
 
                if( $user->isAllowed( 'importupload' ) ) {
-                       $out->addWikiMsg( "importtext" );
                        $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' ) ) .
@@ -203,6 +213,15 @@ class SpecialImport extends SpecialPage {
                                                        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' ) .
+                                       "</td>
+                                       <td class='mw-input'>" .
+                                               Xml::input( 'rootpage', 50, $this->rootpage,
+                                                       array( 'id' => 'mw-interwiki-rootpage', 'type' => 'text' ) ) . ' ' .
+                                       "</td>
+                               </tr>
                                <tr>
                                        <td></td>
                                        <td class='mw-submit'>" .
@@ -300,6 +319,15 @@ class SpecialImport extends SpecialPage {
                                                        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' ) .
+                                       "</td>
+                                       <td class='mw-input'>" .
+                                               Xml::input( 'rootpage', 50, $this->rootpage,
+                                                       array( 'id' => 'mw-interwiki-rootpage', 'type' => 'text' ) ) . ' ' .
+                                       "</td>
+                               </tr>
                                <tr>
                                        <td>
                                        </td>
index 0628269..0810ee7 100644 (file)
@@ -171,9 +171,9 @@ class LinkSearchPage extends QueryPage {
                $like = $dbr->buildLike( $stripped );
                $retval = array (
                        'tables' => array ( 'page', 'externallinks' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'el_index AS value', 'el_to AS url' ),
+                       'fields' => array ( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'el_index', 'url' => 'el_to' ),
                        'conds' => array ( 'page_id = el_from',
                                        "$clause $like" ),
                        'options' => array( 'USE INDEX' => $clause )
index ddab164..cc05522 100644 (file)
@@ -174,20 +174,14 @@ class ImageListPager extends TablePager {
                return 'img_timestamp';
        }
 
-       function getStartBody() {
-               # Do a link batch query for user pages
-               if ( $this->mResult->numRows() ) {
-                       $lb = new LinkBatch;
-                       $this->mResult->seek( 0 );
-                       foreach ( $this->mResult as $row ) {
-                               if ( $row->img_user ) {
-                                       $lb->add( NS_USER, str_replace( ' ', '_', $row->img_user_text ) );
-                               }
-                       }
-                       $lb->execute();
+       function doBatchLookups() {
+               $userIds = array();
+               $this->mResult->seek( 0 );
+               foreach ( $this->mResult as $row ) {
+                       $userIds[] = $row->img_user;
                }
-
-               return parent::getStartBody();
+               # Do a link batch query for names and userpages
+               UserCache::singleton()->doQuery( $userIds, array( 'userpage' ), __METHOD__ );
        }
 
        function formatValue( $field, $value ) {
@@ -217,9 +211,10 @@ class ImageListPager extends TablePager {
                                }
                        case 'img_user_text':
                                if ( $this->mCurrentRow->img_user ) {
+                                       $name = User::whoIs( $this->mCurrentRow->img_user );
                                        $link = Linker::link(
-                                               Title::makeTitle( NS_USER, $value ),
-                                               htmlspecialchars( $value )
+                                               Title::makeTitle( NS_USER, $name ),
+                                               htmlspecialchars( $name )
                                        );
                                } else {
                                        $link = htmlspecialchars( $value );
@@ -254,8 +249,9 @@ class ImageListPager extends TablePager {
                return Html::openElement( 'form',
                                array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' ) ) .
                        Xml::fieldset( $this->msg( 'listfiles' )->text() ) .
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
                        Xml::buildForm( $inputForm, 'table_pager_limit_submit' ) .
-                       $this->getHiddenFields( array( 'limit', 'ilsearch', 'user' ) ) .
+                       $this->getHiddenFields( array( 'limit', 'ilsearch', 'user', 'title' ) ) .
                        Html::closeElement( 'fieldset' ) .
                        Html::closeElement( 'form' ) . "\n";
        }
@@ -290,4 +286,8 @@ class ImageListPager extends TablePager {
                }
                return $queries;
        }
+
+       function getTitle() {
+               return SpecialPage::getTitleFor( 'Listfiles' );
+       }
 }
index f9cf3e6..fe338a0 100644 (file)
@@ -41,14 +41,14 @@ class ListredirectsPage extends QueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'p1' => 'page', 'redirect', 'p2' => 'page' ),
-                       'fields' => array( 'p1.page_namespace AS namespace',
-                                       'p1.page_title AS title',
-                                       'p1.page_title AS value',
+                       'fields' => array( 'namespace' => 'p1.page_namespace',
+                                       'title' => 'p1.page_title',
+                                       'value' => 'p1.page_title',
                                        'rd_namespace',
                                        'rd_title',
                                        'rd_fragment',
                                        'rd_interwiki',
-                                       'p2.page_id AS redirid' ),
+                                       'redirid' => 'p2.page_id' ),
                        'conds' => array( 'p1.page_is_redirect' => 1 ),
                        'join_conds' => array( 'redirect' => array(
                                        'LEFT JOIN', 'rd_from=p1.page_id' ),
index 75be397..923a18d 100644 (file)
  */
 class UsersPager extends AlphabeticPager {
 
-       function __construct( IContextSource $context = null, $par = null ) {
+       /**
+        * @param $context IContextSource
+        * @param $par null|array
+        */
+       function __construct( IContextSource $context = null, $par = null, $including = null ) {
                if ( $context ) {
                        $this->setContext( $context );
                }
@@ -58,6 +62,7 @@ class UsersPager extends AlphabeticPager {
                }
                $this->editsOnly = $request->getBool( 'editsOnly' );
                $this->creationSort = $request->getBool( 'creationSort' );
+               $this->including = $including;
 
                $this->requestedUser = '';
                if ( $un != '' ) {
@@ -69,10 +74,16 @@ class UsersPager extends AlphabeticPager {
                parent::__construct();
        }
 
+       /**
+        * @return string
+        */
        function getIndexField() {
                return $this->creationSort ? 'user_id' : 'user_name';
        }
 
+       /**
+        * @return Array
+        */
        function getQueryInfo() {
                $dbr = wfGetDB( DB_SLAVE );
                $conds = array();
@@ -125,28 +136,29 @@ class UsersPager extends AlphabeticPager {
                return $query;
        }
 
+       /**
+        * @param $row Object
+        * @return String
+        */
        function formatRow( $row ) {
-               if ($row->user_id == 0) #Bug 16487
+               if ( $row->user_id == 0 ) { #Bug 16487
                        return '';
+               }
 
                $userName = $row->user_name;
 
                $ulinks = Linker::userLink( $row->user_id, $userName );
                $ulinks .= Linker::userToolLinks( $row->user_id, $userName );
 
-               $userPage = Title::makeTitle( NS_USER, $row->user_name );
-               $name = Linker::link( $userPage, htmlspecialchars( $userPage->getText() ) );
-
                $lang = $this->getLanguage();
 
+               $groups = '';
                $groups_list = self::getGroups( $row->user_id );
-               if( count( $groups_list ) > 0 ) {
+               if( !$this->including && count( $groups_list ) > 0 ) {
                        $list = array();
                        foreach( $groups_list as $group )
                                $list[] = self::buildGroupLink( $group, $userName );
                        $groups = $lang->commaList( $list );
-               } else {
-                       $groups = '';
                }
 
                $item = $lang->specialList( $ulinks, $groups );
@@ -154,16 +166,15 @@ class UsersPager extends AlphabeticPager {
                        $item = "<span class=\"deleted\">$item</span>";
                }
 
+               $edits = '';
                global $wgEdititis;
-               if ( $wgEdititis ) {
+               if ( !$this->including && $wgEdititis ) {
                        $edits = ' [' . $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped() . ']';
-               } else {
-                       $edits = '';
                }
 
                $created = '';
                # Some rows may be NULL
-               if( $row->creation ) {
+               if( !$this->including && $row->creation ) {
                        $user = $this->getUser();
                        $d = $lang->userDate( $row->creation, $user );
                        $t = $lang->userTime( $row->creation, $user );
@@ -186,9 +197,12 @@ class UsersPager extends AlphabeticPager {
                $this->mResult->rewind();
        }
 
+       /**
+        * @return string
+        */
        function getPageHeader( ) {
                global $wgScript;
-               // @todo Add a PrefixedBaseDBKey
+
                list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
 
                # Form tag
@@ -243,10 +257,12 @@ class UsersPager extends AlphabeticPager {
         */
        function getDefaultQuery() {
                $query = parent::getDefaultQuery();
-               if( $this->requestedGroup != '' )
+               if( $this->requestedGroup != '' ) {
                        $query['group'] = $this->requestedGroup;
-               if( $this->requestedUser != '' )
+               }
+               if( $this->requestedUser != '' ) {
                        $query['username'] = $this->requestedUser;
+               }
                wfRunHooks( 'SpecialListusersDefaultQuery', array( $this, &$query ) );
                return $query;
        }
@@ -285,6 +301,7 @@ class SpecialListUsers extends SpecialPage {
         */
        public function __construct() {
                parent::__construct( 'Listusers' );
+               $this->mIncludable = true;
        }
 
        /**
@@ -296,12 +313,16 @@ class SpecialListUsers extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
 
-               $up = new UsersPager( $this->getContext(), $par );
+               $up = new UsersPager( $this->getContext(), $par, $this->including() );
 
                # getBody() first to check, if empty
                $usersbody = $up->getBody();
 
-               $s = $up->getPageHeader();
+               $s = '';
+               if ( !$this->including() ) {
+                       $s = $up->getPageHeader();
+               }
+
                if( $usersbody ) {
                        $s .= $up->getNavigationBar();
                        $s .= Html::rawElement( 'ul', array(), $usersbody );
index 8eee22d..8ab0976 100644 (file)
@@ -131,7 +131,7 @@ class SpecialLog extends SpecialPage {
 
        private function show( FormOptions $opts, array $extraConds ) {
                # Create a LogPager item to get the results and a LogEventsList item to format them...
-               $loglist = new LogEventsList( $this->getSkin(), $this->getOutput(), LogEventsList::USE_REVDEL_CHECKBOXES );
+               $loglist = new LogEventsList( $this->getContext(), null, LogEventsList::USE_REVDEL_CHECKBOXES );
                $pager = new LogPager( $loglist, $opts->getValue( 'type' ), $opts->getValue( 'user' ),
                        $opts->getValue( 'page' ), $opts->getValue( 'pattern' ), $extraConds, $opts->getValue( 'year' ),
                        $opts->getValue( 'month' ), $opts->getValue( 'tagfilter' ) );
@@ -161,8 +161,8 @@ class SpecialLog extends SpecialPage {
        }
 
        private function getRevisionButton( $formcontents ) {
-               # If the user doesn't have the ability to delete revisions, don't bother showing him/her the button.
-               if ( !$this->getUser()->isAllowed( 'deleterevision' ) ) {
+               # If the user doesn't have the ability to delete log entries, don't bother showing him/her the button.
+               if ( !$this->getUser()->isAllowedAll( 'deletedhistory', 'deletelogentry' ) ) {
                        return $formcontents;
                }
 
index 0c86163..763bbdb 100644 (file)
@@ -50,9 +50,9 @@ class LonelyPagesPage extends PageQueryPage {
                return array (
                        'tables' => array ( 'page', 'pagelinks',
                                        'templatelinks' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_title AS value' ),
+                       'fields' => array ( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_title' ),
                        'conds' => array ( 'pl_namespace IS NULL',
                                        'page_namespace' => MWNamespace::getContentNamespaces(),
                                        'page_is_redirect' => 0,
index 46a35c4..104c653 100644 (file)
@@ -45,9 +45,9 @@ class MIMEsearchPage extends QueryPage {
        public function getQueryInfo() {
                return array(
                        'tables' => array( 'image' ),
-                       'fields' => array( "'" . NS_FILE . "' AS namespace",
-                                       'img_name AS title',
-                                       'img_major_mime AS value',
+                       'fields' => array( 'namespace' => NS_FILE,
+                                       'title' => 'img_name',
+                                       'value' => 'img_major_mime',
                                        'img_size',
                                        'img_width',
                                        'img_height',
index b5fb0dd..1f05749 100644 (file)
@@ -226,8 +226,9 @@ class SpecialMergeHistory extends SpecialPage {
                        $out->addWikiMsg( 'mergehistory-empty' );
                }
 
-               # Show relevant lines from the deletion log:
-               $out->addHTML( '<h2>' . htmlspecialchars( LogPage::logName( 'merge' ) ) . "</h2>\n" );
+               # Show relevant lines from the merge log:
+               $mergeLogPage = new LogPage( 'merge' );
+               $out->addHTML( '<h2>' . $mergeLogPage->getName()->escaped() . "</h2>\n" );
                LogEventsList::showLogExtract( $out, 'merge', $this->mTargetObj );
 
                # When we submit, go by page ID to avoid some nasty but unlikely collisions.
index 6de4840..3f0bafa 100644 (file)
@@ -41,9 +41,9 @@ class MostcategoriesPage extends QueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'categorylinks', 'page' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'COUNT(*) AS value' ),
+                       'fields' => array ( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'COUNT(*)' ),
                        'conds' => array ( 'page_namespace' => MWNamespace::getContentNamespaces() ),
                        'options' => array ( 'HAVING' => 'COUNT(*) > 1',
                                'GROUP BY' => array( 'page_namespace', 'page_title' ) ),
index 7805e53..3d79790 100644 (file)
@@ -41,9 +41,9 @@ class MostimagesPage extends ImageQueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'imagelinks' ),
-                       'fields' => array ( "'" . NS_FILE . "' AS namespace",
-                                       'il_to AS title',
-                                       'COUNT(*) AS value' ),
+                       'fields' => array ( 'namespace' => NS_FILE,
+                                       'title' => 'il_to',
+                                       'value' => 'COUNT(*)' ),
                        'options' => array ( 'GROUP BY' => 'il_to',
                                        'HAVING' => 'COUNT(*) > 1' )
                );
diff --git a/includes/specials/SpecialMostinterwikis.php b/includes/specials/SpecialMostinterwikis.php
new file mode 100644 (file)
index 0000000..894d697
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Implements Special:Mostinterwikis
+ *
+ * Copyright © 2012 Umherirrender
+ *
+ * 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
+ * @author Umherirrender
+ */
+
+/**
+ * A special page that listed pages that have highest interwiki count
+ *
+ * @ingroup SpecialPage
+ */
+class MostinterwikisPage extends QueryPage {
+
+       function __construct( $name = 'Mostinterwikis' ) {
+               parent::__construct( $name );
+       }
+
+       function isExpensive() { return true; }
+       function isSyndicated() { return false; }
+
+       function getQueryInfo() {
+               return array (
+                       'tables' => array (
+                               'langlinks',
+                               'page'
+                       ), 'fields' => array (
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'COUNT(*)'
+                       ), 'conds' => array (
+                               'page_namespace' => MWNamespace::getContentNamespaces()
+                       ), 'options' => array (
+                               'HAVING' => 'COUNT(*) > 1',
+                               'GROUP BY' => array (
+                                       'page_namespace',
+                                       'page_title'
+                               )
+                       ), 'join_conds' => array (
+                               'page' => array (
+                                       'LEFT JOIN',
+                                       'page_id = ll_from'
+                               )
+                       )
+               );
+       }
+
+       /**
+        * Pre-fill the link cache
+        *
+        * @param $db DatabaseBase
+        * @param $res
+        */
+       function preprocessResults( $db, $res ) {
+               # There's no point doing a batch check if we aren't caching results;
+               # the page must exist for it to have been pulled out of the table
+               if ( !$this->isCached() || !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch;
+               foreach ( $res as $row ) {
+                       $batch->add( $row->namespace, $row->title );
+               }
+               $batch->execute();
+
+               // Back to start for display
+               $res->seek( 0 );
+       }
+
+       /**
+        * @param $skin Skin
+        * @param $result
+        * @return string
+        */
+       function formatResult( $skin, $result ) {
+               $title = Title::makeTitleSafe( $result->namespace, $result->title );
+               if ( !$title ) {
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+               }
+
+               if ( $this->isCached() ) {
+                       $link = Linker::link( $title );
+               } else {
+                       $link = Linker::linkKnown( $title );
+               }
+
+               $count = $this->msg( 'ninterwikis' )->numParams( $result->value )->escaped();
+
+               return $this->getLanguage()->specialList( $link, $count );
+       }
+}
index 3c3ab36..89c4350 100644 (file)
@@ -42,9 +42,9 @@ class MostlinkedPage extends QueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'pagelinks', 'page' ),
-                       'fields' => array ( 'pl_namespace AS namespace',
-                                       'pl_title AS title',
-                                       'COUNT(*) AS value',
+                       'fields' => array ( 'namespace' => 'pl_namespace',
+                                       'title' => 'pl_title',
+                                       'value' => 'COUNT(*)',
                                        'page_namespace' ),
                        'options' => array ( 'HAVING' => 'COUNT(*) > 1',
                                'GROUP BY' => array( 'pl_namespace', 'pl_title',
index 7fb9dea..dadef8b 100644 (file)
@@ -40,9 +40,9 @@ class MostlinkedCategoriesPage extends QueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'category' ),
-                       'fields' => array ( 'cat_title AS title',
-                                       NS_CATEGORY . ' AS namespace',
-                                       'cat_pages AS value' ),
+                       'fields' => array ( 'title' => 'cat_title',
+                                       'namespace' => NS_CATEGORY,
+                                       'value' => 'cat_pages' ),
                );
        }
 
@@ -55,6 +55,10 @@ class MostlinkedCategoriesPage extends QueryPage {
         * @param $res DatabaseResult
         */
        function preprocessResults( $db, $res ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
                $batch = new LinkBatch;
                foreach ( $res as $row ) {
                        $batch->add( NS_CATEGORY, $row->title );
@@ -62,10 +66,7 @@ class MostlinkedCategoriesPage extends QueryPage {
                $batch->execute();
 
                // Back to start for display
-               if ( $db->numRows( $res ) > 0 ) {
-                       // If there are no rows we get an error seeking.
-                       $db->dataSeek( $res, 0 );
-               }
+               $res->seek( 0 );
        }
 
        /**
@@ -76,7 +77,12 @@ class MostlinkedCategoriesPage extends QueryPage {
        function formatResult( $skin, $result ) {
                global $wgContLang;
 
-               $nt = Title::makeTitle( NS_CATEGORY, $result->title );
+               $nt = Title::makeTitleSafe( NS_CATEGORY, $result->title );
+               if ( !$nt ) {
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), NS_CATEGORY, $result->title ) );
+               }
+
                $text = $wgContLang->convert( $nt->getText() );
 
                $plink = Linker::link( $nt, htmlspecialchars( $text ) );
index 370ba68..22932e5 100644 (file)
@@ -64,9 +64,9 @@ class MostlinkedTemplatesPage extends QueryPage {
        public function getQueryInfo() {
                return array (
                        'tables' => array ( 'templatelinks' ),
-                       'fields' => array ( 'tl_namespace AS namespace',
-                                       'tl_title AS title',
-                                       'COUNT(*) AS value' ),
+                       'fields' => array ( 'namespace' => 'tl_namespace',
+                                       'title' => 'tl_title',
+                                       'value' => 'COUNT(*)' ),
                        'conds' => array ( 'tl_namespace' => NS_TEMPLATE ),
                        'options' => array( 'GROUP BY' => array( 'tl_namespace', 'tl_title' ) )
                );
@@ -79,13 +79,17 @@ class MostlinkedTemplatesPage extends QueryPage {
         * @param $res ResultWrapper
         */
        public function preprocessResults( $db, $res ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
                $batch = new LinkBatch();
                foreach ( $res as $row ) {
                        $batch->add( $row->namespace, $row->title );
                }
                $batch->execute();
-               if( $db->numRows( $res ) > 0 )
-                       $db->dataSeek( $res, 0 );
+
+               $res->seek( 0 );
        }
 
        /**
@@ -96,7 +100,11 @@ class MostlinkedTemplatesPage extends QueryPage {
         * @return String
         */
        public function formatResult( $skin, $result ) {
-               $title = Title::makeTitle( $result->namespace, $result->title );
+               $title = Title::makeTitleSafe( $result->namespace, $result->title );
+               if ( !$title ) {
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+               }
 
                return $this->getLanguage()->specialList(
                        Linker::link( $title ),
index a512ee6..3ece917 100644 (file)
@@ -358,7 +358,7 @@ class MovePageForm extends UnlistedSpecialPage {
                }
 
                $watchChecked = $user->isLoggedIn() && ($this->watch || $user->getBoolOption( 'watchmoves' )
-                       || $this->oldTitle->userIsWatching());
+                       || $user->isWatched( $this->oldTitle ) );
                # Don't allow watching if user is not logged in
                if( $user->isLoggedIn() ) {
                        $out->addHTML( "
@@ -440,8 +440,9 @@ class MovePageForm extends UnlistedSpecialPage {
 
                        $error = ''; // passed by ref
                        $page = WikiPage::factory( $nt );
-                       if ( !$page->doDeleteArticle( $reason, false, 0, true, $error, $user ) ) {
-                               $this->showForm( array( array( 'cannotdelete', wfEscapeWikiText( $nt->getPrefixedText() ) ) ) );
+                       $deleteStatus = $page->doDeleteArticleReal( $reason, false, 0, true, $error, $user );
+                       if ( !$deleteStatus->isGood() ) {
+                               $this->showForm( $deleteStatus->getErrorsArray() );
                                return;
                        }
                }
@@ -628,8 +629,9 @@ class MovePageForm extends UnlistedSpecialPage {
        }
 
        function showLogFragment( $title ) {
+               $moveLogPage = new LogPage( 'move' );
                $out = $this->getOutput();
-               $out->addHTML( Xml::element( 'h2', null, LogPage::logName( 'move' ) ) );
+               $out->addHTML( Xml::element( 'h2', null, $moveLogPage->getName()->text() ) );
                LogEventsList::showLogExtract( $out, 'move', $title );
        }
 
index 45dbd36..350aac6 100644 (file)
@@ -58,6 +58,9 @@ class NewFilesPager extends ReverseChronologicalPager {
        function __construct( IContextSource $context, $par = null ) {
                $this->like = $context->getRequest()->getText( 'like' );
                $this->showbots = $context->getRequest()->getBool( 'showbots' , 0 );
+               if ( is_numeric( $par ) ) {
+                       $this->setLimit( $par );
+               }
 
                parent::__construct( $context );
        }
@@ -68,15 +71,18 @@ class NewFilesPager extends ReverseChronologicalPager {
                $tables = array( 'image' );
 
                if( !$this->showbots ) {
-                       $tables[] = 'user_groups';
-                       $conds[] = 'ug_group IS NULL';
-                       $jconds['user_groups'] = array(
-                               'LEFT JOIN',
-                               array(
-                                       'ug_group' => User::getGroupsWithPermission( 'bot' ),
-                                       'ug_user = img_user'
-                               )
-                       );
+                       $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
+                       if( count( $groupsWithBotPermission ) ) {
+                               $tables[] = 'user_groups';
+                               $conds[] = 'ug_group IS NULL';
+                               $jconds['user_groups'] = array(
+                                       'LEFT JOIN',
+                                       array(
+                                               'ug_group' => $groupsWithBotPermission,
+                                               'ug_user = img_user'
+                                       )
+                               );
+                       }
                }
 
                if( !$wgMiserMode && $this->like !== null ){
@@ -145,7 +151,7 @@ class NewFilesPager extends ReverseChronologicalPager {
                        ),
                        'limit' => array(
                                'type' => 'hidden',
-                               'default' => $this->getRequest()->getText( 'limit' ),
+                               'default' => $this->mLimit,
                                'name' => 'limit',
                        ),
                        'offset' => array(
index 1798e8f..8e15d55 100644 (file)
@@ -360,8 +360,8 @@ class SpecialNewpages extends IncludableSpecialPage {
                        $classes[] = 'mw-newpages-zero-byte-page';
                }
 
-               # Tags, if any. check for including due to bug 23293
-               if ( !$this->including() ) {
+               # Tags, if any.
+               if( isset( $result->ts_tags ) ) {
                        list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $result->ts_tags, 'newpages' );
                        $classes = array_merge( $classes, $newClasses );
                } else {
@@ -530,7 +530,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                $fields = array(
                        'rc_namespace', 'rc_title', 'rc_cur_id', 'rc_user', 'rc_user_text',
                        'rc_comment', 'rc_timestamp', 'rc_patrolled','rc_id', 'rc_deleted',
-                       'page_len AS length', 'page_latest AS rev_id', 'ts_tags', 'rc_this_oldid',
+                       'length' => 'page_len', 'rev_id' => 'page_latest', 'rc_this_oldid',
                        'page_namespace', 'page_title'
                );
                $join_conds = array( 'page' => array( 'INNER JOIN', 'page_id=rc_cur_id' ) );
@@ -546,13 +546,10 @@ class NewPagesPager extends ReverseChronologicalPager {
                        'join_conds' => $join_conds
                );
 
-               // Empty array for fields, it'll be set by us anyway.
-               $fields = array();
-
                // Modify query for tags
                ChangeTags::modifyDisplayQuery(
                        $info['tables'],
-                       $fields,
+                       $info['fields'],
                        $info['conds'],
                        $info['join_conds'],
                        $info['options'],
index 51520c8..efb5765 100644 (file)
@@ -238,7 +238,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        $user->setNewpassword( $password );
                        $user->saveSettings();
                        $passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password
-                               )->inLanguage( $userLanguage )->plain(); // We'll escape the whole thing later
+                               )->inLanguage( $userLanguage )->text(); // We'll escape the whole thing later
                }
                $passwordBlock = implode( "\n\n", $passwords );
 
index 9f84804..448d179 100644 (file)
@@ -42,9 +42,9 @@ class PopularPagesPage extends QueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array( 'page' ),
-                       'fields' => array( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_counter AS value'),
+                       'fields' => array( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_counter'),
                        'conds' => array( 'page_is_redirect' => 0,
                                        'page_namespace' => MWNamespace::getContentNamespaces() ) );
        }
index b69354c..c6b2bb6 100644 (file)
@@ -39,8 +39,7 @@ class SpecialPreferences extends SpecialPage {
 
                $user = $this->getUser();
                if ( $user->isAnon() ) {
-                       $out->showErrorPage( 'prefsnologin', 'prefsnologintext', array( $this->getTitle()->getPrefixedDBkey() ) );
-                       return;
+                       throw new ErrorPageError( 'prefsnologin', 'prefsnologintext', array( $this->getTitle()->getPrefixedDBkey() ) );
                }
                $this->checkReadOnly();
 
index d8fdbe7..74ed537 100644 (file)
@@ -70,8 +70,8 @@ class SpecialProtectedpages extends SpecialPage {
 
        /**
         * Callback function to output a restriction
-        * @param $row object Protected title
-        * @return string Formatted <li> element
+        * @param Title $row Protected title
+        * @return string Formatted "<li>" element
         */
        public function formatRow( $row ) {
                wfProfileIn( __METHOD__ );
index bb384d4..2bd8b0a 100644 (file)
@@ -396,14 +396,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $fields[] = 'page_latest';
                        $join_conds['page'] = array('LEFT JOIN', 'rc_cur_id=page_id');
                }
-               if ( !$this->including() ) {
-                       // Tag stuff.
-                       // Doesn't work when transcluding. See bug 23293
-                       ChangeTags::modifyDisplayQuery(
-                               $tables, $fields, $conds, $join_conds, $query_options,
-                               $opts['tagfilter']
-                       );
-               }
+               // Tag stuff.
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $fields,
+                       $conds,
+                       $join_conds,
+                       $query_options,
+                       $opts['tagfilter']
+               );
 
                if ( !wfRunHooks( 'SpecialRecentChangesQuery',
                        array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ) ) )
@@ -772,6 +773,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         */
        function makeOptionsLink( $title, $override, $options, $active = false ) {
                $params = $override + $options;
+
+               // Bug 36524: false values have be converted to "0" otherwise
+               // wfArrayToCgi() will omit it them.
+               foreach ( $params as &$value ) {
+                       if ( $value === false ) {
+                               $value = '0';
+                       }
+               }
+               unset( $value );
+
                $text = htmlspecialchars( $title );
                if ( $active ) {
                        $text = '<strong>' . $text . '</strong>';
index 9010e10..862736d 100644 (file)
@@ -110,10 +110,14 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        $join_conds['page'] = array('LEFT JOIN', 'rc_cur_id=page_id');
                        $select[] = 'page_latest';
                }
-               if ( !$this->including() ) { // bug 23293
-                       ChangeTags::modifyDisplayQuery( $tables, $select, $conds, $join_conds,
-                               $query_options, $opts['tagfilter'] );
-               }
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $select,
+                       $conds,
+                       $join_conds,
+                       $query_options,
+                       $opts['tagfilter']
+               );
 
                if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) ) ) {
                        return false;
index 83c7235..089f967 100644 (file)
@@ -66,6 +66,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        'success'               => 'revdelete-success',
                        'failure'               => 'revdelete-failure',
                        'list-class'    => 'RevDel_RevisionList',
+                       'permission'    => 'deleterevision',
                ),
                'archive' => array(
                        'check-label'   => 'revdelete-hide-text',
@@ -73,6 +74,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        'success'               => 'revdelete-success',
                        'failure'               => 'revdelete-failure',
                        'list-class'    => 'RevDel_ArchiveList',
+                       'permission'    => 'deleterevision',
                ),
                'oldimage'=> array(
                        'check-label'   => 'revdelete-hide-image',
@@ -80,6 +82,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        'success'               => 'revdelete-success',
                        'failure'               => 'revdelete-failure',
                        'list-class'    => 'RevDel_FileList',
+                       'permission'    => 'deleterevision',
                ),
                'filearchive' => array(
                        'check-label'   => 'revdelete-hide-image',
@@ -87,6 +90,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        'success'               => 'revdelete-success',
                        'failure'               => 'revdelete-failure',
                        'list-class'    => 'RevDel_ArchivedFileList',
+                       'permission'    => 'deleterevision',
                ),
                'logging' => array(
                        'check-label'   => 'revdelete-hide-name',
@@ -94,6 +98,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        'success'               => 'logdelete-success',
                        'failure'               => 'logdelete-failure',
                        'list-class'    => 'RevDel_LogList',
+                       'permission'    => 'deletelogentry',
                ),
        );
 
@@ -117,7 +122,6 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $output = $this->getOutput();
                $user = $this->getUser();
 
-               $this->mIsAllowed = $user->isAllowed('deleterevision'); // for changes
                $this->setHeaders();
                $this->outputHeader();
                $request = $this->getRequest();
@@ -159,10 +163,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
                # No targets?
                if( !isset( self::$allowedTypes[$this->typeName] ) || count( $this->ids ) == 0 ) {
-                       $output->showErrorPage( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
-                       return;
+                       throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
                }
                $this->typeInfo = self::$allowedTypes[$this->typeName];
+               $this->mIsAllowed = $user->isAllowed( $this->typeInfo['permission'] );
 
                # If we have revisions, get the title from the first one
                # since they should all be from the same page. This allows
@@ -201,12 +205,14 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
                $qc = $this->getLogQueryCond();
                # Show relevant lines from the deletion log
-               $output->addHTML( "<h2>" . htmlspecialchars( LogPage::logName( 'delete' ) ) . "</h2>\n" );
+               $deleteLogPage = new LogPage( 'delete' );
+               $output->addHTML( "<h2>" . $deleteLogPage->getName()->escaped() . "</h2>\n" );
                LogEventsList::showLogExtract( $output, 'delete',
                        $this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
                # Show relevant lines from the suppression log
                if( $user->isAllowed( 'suppressionlog' ) ) {
-                       $output->addHTML( "<h2>" . htmlspecialchars( LogPage::logName( 'suppress' ) ) . "</h2>\n" );
+                       $suppressLogPage = new LogPage( 'suppress' );
+                       $output->addHTML( "<h2>" . $suppressLogPage->getName()->escaped()  . "</h2>\n" );
                        LogEventsList::showLogExtract( $output, 'suppress',
                                $this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
                }
@@ -279,11 +285,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $user = $this->getUser();
                if( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
                        if( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
-                               $this->getOutput()->permissionRequired( 'suppressrevision' );
+                               throw new PermissionsError( 'suppressrevision' );
                        } else {
-                               $this->getOutput()->permissionRequired( 'deletedtext' );
+                               throw new PermissionsError( 'deletedtext' );
                        }
-                       return;
                }
                if ( !$user->matchEditToken( $this->token, $archiveName ) ) {
                        $lang = $this->getLanguage();
@@ -353,8 +358,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $item = $list->current();
                        if ( !$item->canView() ) {
                                if( !$this->submitClicked ) {
-                                       $this->getOutput()->permissionRequired( 'suppressrevision' );
-                                       return;
+                                       throw new PermissionsError( 'suppressrevision' );
                                }
                                $UserAllowed = false;
                        }
@@ -363,8 +367,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                }
 
                if( !$numRevisions ) {
-                       $this->getOutput()->showErrorPage( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
-                       return;
+                       throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
                }
 
                $this->getOutput()->addHTML( "</ul>" );
@@ -521,8 +524,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                }
                # Can the user set this field?
                if( $bitParams[Revision::DELETED_RESTRICTED]==1 && !$this->getUser()->isAllowed('suppressrevision') ) {
-                       $this->getOutput()->permissionRequired( 'suppressrevision' );
-                       return false;
+                       throw new PermissionsError( 'suppressrevision' );
                }
                # If the save went through, go to success message...
                $status = $this->save( $bitParams, $comment, $this->targetObj );
@@ -597,6 +599,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Do the write operations. Simple wrapper for RevDel_*List::setVisibility().
+        * @param $bitfield
+        * @param $reason
+        * @param $title
         * @return
         */
        protected function save( $bitfield, $reason, $title ) {
index 3344436..85365f5 100644 (file)
@@ -667,10 +667,10 @@ class SpecialSearch extends SpecialPage {
                                        return "<li>" .
                                                '<table class="searchResultImage">' .
                                                '<tr>' .
-                                               '<td width="120" align="center" valign="top">' .
+                                               '<td width="120" style="text-align: center; vertical-align: top;">' .
                                                $thumb->toHtml( array( 'desc-link' => true ) ) .
                                                '</td>' .
-                                               '<td valign="top">' .
+                                               '<td style="vertical-align: top;">' .
                                                $link .
                                                $extract .
                                                "<div class='mw-search-result-data'>{$score}{$desc} - {$date}{$related}</div>" .
index ee04574..5a4e8f0 100644 (file)
@@ -40,9 +40,9 @@ class ShortPagesPage extends QueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'page' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_len AS value' ),
+                       'fields' => array ( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_len' ),
                        'conds' => array ( 'page_namespace' =>
                                        MWNamespace::getContentNamespaces(),
                                        'page_is_redirect' => 0 ),
index df720a1..c895dae 100644 (file)
@@ -47,7 +47,7 @@ class SpecialTags extends SpecialPage {
                                Xml::tags( 'th', null, $this->msg( 'tags-hitcount-header' )->parse() )
                        );
                $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'change_tag', array( 'ct_tag', 'count(*) AS hitcount' ),
+               $res = $dbr->select( 'change_tag', array( 'ct_tag', 'hitcount' => 'count(*)' ),
                        array(), __METHOD__, array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' ) );
 
                foreach ( $res as $row ) {
index 3efed74..5865bf6 100644 (file)
@@ -49,9 +49,9 @@ class UncategorizedImagesPage extends ImageQueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array( 'page', 'categorylinks' ),
-                       'fields' => array( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_title AS value' ),
+                       'fields' => array( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_title' ),
                        'conds' => array( 'cl_from IS NULL',
                                        'page_namespace' => NS_FILE,
                                        'page_is_redirect' => 0 ),
index 08a6944..1226a6c 100644 (file)
@@ -46,9 +46,9 @@ class UncategorizedPagesPage extends PageQueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'page', 'categorylinks' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_title AS value' ),
+                       'fields' => array ( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_title' ),
                        // default for page_namespace is all content namespaces (if requestedNamespace is false)
                        // otherwise, page_namespace is requestedNamespace
                        'conds' => array ( 'cl_from IS NULL',
index 79c051a..6dde6b9 100644 (file)
@@ -92,7 +92,7 @@ class PageArchive {
                                array(
                                        'ar_namespace',
                                        'ar_title',
-                                       'COUNT(*) AS count'
+                                       'count' => 'COUNT(*)'
                                ),
                                $condition,
                                __METHOD__,
@@ -120,7 +120,7 @@ class PageArchive {
                        ),
                        array( 'ar_namespace' => $this->title->getNamespace(),
                                   'ar_title' => $this->title->getDBkey() ),
-                       'PageArchive::listRevisions',
+                       __METHOD__,
                        array( 'ORDER BY' => 'ar_timestamp DESC' ) );
                $ret = $dbr->resultObject( $res );
                return $ret;
@@ -308,7 +308,9 @@ class PageArchive {
                $dbr = wfGetDB( DB_SLAVE );
                $n = $dbr->selectField( 'archive', 'COUNT(ar_title)',
                        array( 'ar_namespace' => $this->title->getNamespace(),
-                                  'ar_title' => $this->title->getDBkey() ) );
+                                  'ar_title' => $this->title->getDBkey() ),
+                       __METHOD__
+               );
                return ( $n > 0 );
        }
 
@@ -321,11 +323,14 @@ class PageArchive {
         * @param $comment String
         * @param $fileVersions Array
         * @param $unsuppress Boolean
+        * @param $user User doing the action, or null to use $wgUser
         *
         * @return array(number of file revisions restored, number of image revisions restored, log message)
         * on success, false on failure
         */
-       function undelete( $timestamps, $comment = '', $fileVersions = array(), $unsuppress = false ) {
+       function undelete( $timestamps, $comment = '', $fileVersions = array(), $unsuppress = false, User $user = null ) {
+               global $wgUser;
+
                // If both the set of text revisions and file revisions are empty,
                // restore everything. Otherwise, just restore the requested items.
                $restoreAll = empty( $timestamps ) && empty( $fileVersions );
@@ -354,28 +359,35 @@ class PageArchive {
                }
 
                // Touch the log!
-               global $wgContLang;
-               $log = new LogPage( 'delete' );
 
                if( $textRestored && $filesRestored ) {
-                       $reason = wfMsgExt( 'undeletedrevisions-files', array( 'content', 'parsemag' ),
-                               $wgContLang->formatNum( $textRestored ),
-                               $wgContLang->formatNum( $filesRestored ) );
+                       $reason = wfMessage( 'undeletedrevisions-files' )
+                               ->numParams( $textRestored, $filesRestored )->inContentLanguage()->text();
                } elseif( $textRestored ) {
-                       $reason = wfMsgExt( 'undeletedrevisions', array( 'content', 'parsemag' ),
-                               $wgContLang->formatNum( $textRestored ) );
+                       $reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored )
+                               ->inContentLanguage()->text();
                } elseif( $filesRestored ) {
-                       $reason = wfMsgExt( 'undeletedfiles', array( 'content', 'parsemag' ),
-                               $wgContLang->formatNum( $filesRestored ) );
+                       $reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored )
+                               ->inContentLanguage()->text();
                } else {
                        wfDebug( "Undelete: nothing undeleted...\n" );
                        return false;
                }
 
                if( trim( $comment ) != '' ) {
-                       $reason .= wfMsgForContent( 'colon-separator' ) . $comment;
+                       $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
                }
-               $log->addEntry( 'restore', $this->title, $reason );
+
+               if ( $user === null ) {
+                       $user = $wgUser;
+               }
+
+               $logEntry = new ManualLogEntry( 'delete', 'restore' );
+               $logEntry->setPerformer( $user );
+               $logEntry->setTarget( $this->title );
+               $logEntry->setComment( $reason );
+               $logid = $logEntry->insert();
+               $logEntry->publish( $logid );
 
                return array( $textRestored, $filesRestored, $reason );
        }
@@ -754,8 +766,8 @@ class SpecialUndelete extends SpecialPage {
                                );
                        } else {
                                // The title is no longer valid, show as text
-                               $title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
-                               $item = htmlspecialchars( $title->getPrefixedText() );
+                               $item = Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                                       Linker::getInvalidTitleDescription( $this->getContext(), $row->ar_namespace, $row->ar_title ) );
                        }
                        $revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse();
                        $out->addHTML( "<li>{$item} ({$revs})</li>\n" );
@@ -902,15 +914,16 @@ class SpecialUndelete extends SpecialPage {
                        "<col class='diff-marker' />" .
                        "<col class='diff-content' />" .
                        "<tr>" .
-                               "<td colspan='2' width='50%' align='center' class='diff-otitle'>" .
+                               "<td colspan='2' width='50%' style='text-align: center' class='diff-otitle'>" .
                                $this->diffHeader( $previousRev, 'o' ) .
                                "</td>\n" .
-                               "<td colspan='2' width='50%' align='center' class='diff-ntitle'>" .
+                               "<td colspan='2' width='50%' style='text-align: center' class='diff-ntitle'>" .
                                $this->diffHeader( $currentRev, 'n' ) .
                                "</td>\n" .
                        "</tr>" .
                        $diffEngine->generateDiffBody(
-                               $previousRev->getText(), $currentRev->getText() ) .
+                               $previousRev->getText( Revision::FOR_THIS_USER, $this->getUser() ),
+                               $currentRev->getText( Revision::FOR_THIS_USER, $this->getUser() ) ) .
                        "</table>" .
                        "</div>\n"
                );
@@ -1071,11 +1084,13 @@ class SpecialUndelete extends SpecialPage {
                }
 
                # Show relevant lines from the deletion log:
-               $out->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) . "\n" );
+               $deleteLogPage = new LogPage( 'delete' );
+               $out->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) . "\n" );
                LogEventsList::showLogExtract( $out, 'delete', $this->mTargetObj );
                # Show relevant lines from the suppression log:
+               $suppressLogPage = new LogPage( 'suppress' );
                if( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
-                       $out->addHTML( Xml::element( 'h2', null, LogPage::logName( 'suppress' ) ) . "\n" );
+                       $out->addHTML( Xml::element( 'h2', null, $suppressLogPage->getName()->text() ) . "\n" );
                        LogEventsList::showLogExtract( $out, 'suppress', $this->mTargetObj );
                }
 
@@ -1387,7 +1402,9 @@ class SpecialUndelete extends SpecialPage {
                        $this->mTargetTimestamp,
                        $this->mComment,
                        $this->mFileVersions,
-                       $this->mUnsuppress );
+                       $this->mUnsuppress,
+                       $this->getUser()
+               );
 
                if( is_array( $ok ) ) {
                        if ( $ok[1] ) { // Undeleted file count
index 611a33c..1bd38e1 100644 (file)
@@ -39,9 +39,9 @@ class UnusedCategoriesPage extends QueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'page', 'categorylinks' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_title AS value' ),
+                       'fields' => array ( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_title' ),
                        'conds' => array ( 'cl_from IS NULL',
                                        'page_namespace' => NS_CATEGORY,
                                        'page_is_redirect' => 0 ),
index 9c8ccfa..cdab557 100644 (file)
@@ -47,9 +47,9 @@ class UnusedimagesPage extends ImageQueryPage {
                global $wgCountCategorizedImagesAsUsed;
                $retval = array (
                        'tables' => array ( 'image', 'imagelinks' ),
-                       'fields' => array ( "'" . NS_FILE . "' AS namespace",
-                                       'img_name AS title',
-                                       'img_timestamp AS value',
+                       'fields' => array ( 'namespace' => NS_FILE,
+                                       'title' => 'img_name',
+                                       'value' => 'img_timestamp',
                                        'img_user', 'img_user_text',
                                        'img_description' ),
                        'conds' => array ( 'il_to IS NULL' ),
index 0928e26..06077d1 100644 (file)
@@ -42,9 +42,9 @@ class UnusedtemplatesPage extends QueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'page', 'templatelinks' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_title AS value' ),
+                       'fields' => array ( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_title' ),
                        'conds' => array ( 'page_namespace' => NS_TEMPLATE,
                                        'tl_from IS NULL',
                                        'page_is_redirect' => 0 ),
index 4bd0232..e5a7941 100644 (file)
@@ -41,9 +41,9 @@ class UnwatchedpagesPage extends QueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'page', 'watchlist' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_namespace AS value' ),
+                       'fields' => array ( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_namespace' ),
                        'conds' => array ( 'wl_title IS NULL',
                                        'page_is_redirect' => 0,
                                        "page_namespace != '" . NS_MEDIAWIKI .
index 91631f8..ac54faa 100644 (file)
@@ -235,7 +235,7 @@ class SpecialUpload extends SpecialPage {
                        !$this->mTokenOk && !$this->mCancelUpload &&
                        ( $this->mUpload && $this->mUploadClicked )
                ) {
-                       $form->addPreText( wfMsgExt( 'session_fail_preview', 'parseinline' ) );
+                       $form->addPreText( $this->msg( 'session_fail_preview' )->parse() );
                }
 
                # Give a notice if the user is uploading a file that has been deleted or moved
@@ -255,16 +255,16 @@ class SpecialUpload extends SpecialPage {
 
                # Add text to form
                $form->addPreText( '<div id="uploadtext">' .
-                       wfMsgExt( 'uploadtext', 'parse', array( $this->mDesiredDestName ) ) .
+                       $this->msg( 'uploadtext', array( $this->mDesiredDestName ) )->parseAsBlock() .
                        '</div>' );
                # Add upload error message
                $form->addPreText( $message );
 
                # Add footer to form
-               $uploadFooter = wfMessage( 'uploadfooter' );
+               $uploadFooter = $this->msg( 'uploadfooter' );
                if ( !$uploadFooter->isDisabled() ) {
                        $form->addPostText( '<div id="mw-upload-footer-message">'
-                               . $this->getOutput()->parse( $uploadFooter->plain() ) . "</div>\n" );
+                               . $uploadFooter->parseAsBlock() . "</div>\n" );
                }
 
                return $form;
@@ -280,14 +280,12 @@ class SpecialUpload extends SpecialPage {
                if( $title instanceof Title ) {
                        $count = $title->isDeleted();
                        if ( $count > 0 && $user->isAllowed( 'deletedhistory' ) ) {
-                               $link = wfMsgExt(
-                                       $user->isAllowed( 'delete' ) ? 'thisisdeleted' : 'viewdeleted',
-                                       array( 'parse', 'replaceafter' ),
-                                       Linker::linkKnown(
-                                               SpecialPage::getTitleFor( 'Undelete', $title->getPrefixedText() ),
-                                               wfMsgExt( 'restorelink', array( 'parsemag', 'escape' ), $count )
-                                       )
+                               $restorelink = Linker::linkKnown(
+                                       SpecialPage::getTitleFor( 'Undelete', $title->getPrefixedText() ),
+                                       $this->msg( 'restorelink' )->numParams( $count )->escaped()
                                );
+                               $link = $this->msg( $user->isAllowed( 'delete' ) ? 'thisisdeleted' : 'viewdeleted' )
+                                       ->rawParams( $restorelink )->parseAsBlock();
                                $this->getOutput()->addHTML( "<div id=\"contentSub2\">{$link}</div>" );
                        }
                }
@@ -306,11 +304,11 @@ class SpecialUpload extends SpecialPage {
         */
        protected function showRecoverableUploadError( $message ) {
                $sessionKey = $this->mUpload->stashSession();
-               $message = '<h2>' . wfMsgHtml( 'uploaderror' ) . "</h2>\n" .
+               $message = '<h2>' . $this->msg( 'uploaderror' )->escaped() . "</h2>\n" .
                        '<div class="error">' . $message . "</div>\n";
 
                $form = $this->getUploadForm( $message, $sessionKey );
-               $form->setSubmitText( wfMsg( 'upload-tryagain' ) );
+               $form->setSubmitText( $this->msg( 'upload-tryagain' )->escaped() );
                $this->showUploadForm( $form );
        }
        /**
@@ -335,7 +333,7 @@ class SpecialUpload extends SpecialPage {
 
                $sessionKey = $this->mUpload->stashSession();
 
-               $warningHtml = '<h2>' . wfMsgHtml( 'uploadwarning' ) . "</h2>\n"
+               $warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
                        . '<ul class="warning">';
                foreach( $warnings as $warning => $args ) {
                        if( $warning == 'exists' ) {
@@ -343,8 +341,8 @@ class SpecialUpload extends SpecialPage {
                        } elseif( $warning == 'duplicate' ) {
                                $msg = self::getDupeWarning( $args );
                        } elseif( $warning == 'duplicate-archive' ) {
-                               $msg = "\t<li>" . wfMsgExt( 'file-deleted-duplicate', 'parseinline',
-                                               array( Title::makeTitle( NS_FILE, $args )->getPrefixedText() ) )
+                               $msg = "\t<li>" . $this->msg( 'file-deleted-duplicate',
+                                               Title::makeTitle( NS_FILE, $args )->getPrefixedText() )->parse()
                                        . "</li>\n";
                        } else {
                                if ( $args === true ) {
@@ -352,17 +350,17 @@ class SpecialUpload extends SpecialPage {
                                } elseif ( !is_array( $args ) ) {
                                        $args = array( $args );
                                }
-                               $msg = "\t<li>" . wfMsgExt( $warning, 'parseinline', $args ) . "</li>\n";
+                               $msg = "\t<li>" . $this->msg( $warning, $args )->parse() . "</li>\n";
                        }
                        $warningHtml .= $msg;
                }
                $warningHtml .= "</ul>\n";
-               $warningHtml .= wfMsgExt( 'uploadwarning-text', 'parse' );
+               $warningHtml .= $this->msg( 'uploadwarning-text' )->parseAsBlock();
 
                $form = $this->getUploadForm( $warningHtml, $sessionKey, /* $hideIgnoreWarning */ true );
-               $form->setSubmitText( wfMsg( 'upload-tryagain' ) );
-               $form->addButton( 'wpUploadIgnoreWarning', wfMsg( 'ignorewarning' ) );
-               $form->addButton( 'wpCancelUpload', wfMsg( 'reuploaddesc' ) );
+               $form->setSubmitText( $this->msg( 'upload-tryagain' )->text() );
+               $form->addButton( 'wpUploadIgnoreWarning', $this->msg( 'ignorewarning' )->text() );
+               $form->addButton( 'wpCancelUpload', $this->msg( 'reuploaddesc' )->text() );
 
                $this->showUploadForm( $form );
 
@@ -376,7 +374,7 @@ class SpecialUpload extends SpecialPage {
         * @param $message string HTML string
         */
        protected function showUploadError( $message ) {
-               $message = '<h2>' . wfMsgHtml( 'uploadwarning' ) . "</h2>\n" .
+               $message = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n" .
                        '<div class="error">' . $message . "</div>\n";
                $this->showUploadForm( $this->getUploadForm( $message ) );
        }
@@ -414,8 +412,7 @@ class SpecialUpload extends SpecialPage {
                $permErrors = $this->mUpload->verifyTitlePermissions( $this->getUser() );
                if( $permErrors !== true ) {
                        $code = array_shift( $permErrors[0] );
-                       $this->showRecoverableUploadError( wfMsgExt( $code,
-                                       'parseinline', $permErrors[0] ) );
+                       $this->showRecoverableUploadError( $this->msg( $code, $permErrors[0] )->parse() );
                        return;
                }
 
@@ -469,7 +466,7 @@ class SpecialUpload extends SpecialPage {
                        if ( in_array( $msgName, $wgForceUIMsgAsContentMsg ) ) {
                                $msg[$msgName] = "{{int:$msgName}}";
                        } else {
-                               $msg[$msgName] = wfMsgForContent( $msgName );
+                               $msg[$msgName] = wfMessage( $msgName )->inContentLanguage()->text();
                        }
                }
 
@@ -516,7 +513,7 @@ class SpecialUpload extends SpecialPage {
                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 $local->getTitle()->userIsWatching();
+                       return $this->getUser()->isWatched( $local->getTitle() );
                } else {
                        // New page should get watched if that's our option.
                        return $this->getUser()->getOption( 'watchcreations' );
@@ -536,33 +533,31 @@ class SpecialUpload extends SpecialPage {
 
                        /** Statuses that only require name changing **/
                        case UploadBase::MIN_LENGTH_PARTNAME:
-                               $this->showRecoverableUploadError( wfMsgHtml( 'minlength1' ) );
+                               $this->showRecoverableUploadError( $this->msg( 'minlength1' )->escaped() );
                                break;
                        case UploadBase::ILLEGAL_FILENAME:
-                               $this->showRecoverableUploadError( wfMsgExt( 'illegalfilename',
-                                       'parseinline', $details['filtered'] ) );
+                               $this->showRecoverableUploadError( $this->msg( 'illegalfilename',
+                                       $details['filtered'] )->parse() );
                                break;
                        case UploadBase::FILENAME_TOO_LONG:
-                               $this->showRecoverableUploadError( wfMsgHtml( 'filename-toolong' ) );
+                               $this->showRecoverableUploadError( $this->msg( 'filename-toolong' )->escaped() );
                                break;
                        case UploadBase::FILETYPE_MISSING:
-                               $this->showRecoverableUploadError( wfMsgExt( 'filetype-missing',
-                                       'parseinline' ) );
+                               $this->showRecoverableUploadError( $this->msg( 'filetype-missing' )->parse() );
                                break;
                        case UploadBase::WINDOWS_NONASCII_FILENAME:
-                               $this->showRecoverableUploadError( wfMsgExt( 'windows-nonascii-filename',
-                                       'parseinline' ) );
+                               $this->showRecoverableUploadError( $this->msg( 'windows-nonascii-filename' )->parse() );
                                break;
 
                        /** Statuses that require reuploading **/
                        case UploadBase::EMPTY_FILE:
-                               $this->showUploadError( wfMsgHtml( 'emptyfile' ) );
+                               $this->showUploadError( $this->msg( 'emptyfile' )->escaped() );
                                break;
                        case UploadBase::FILE_TOO_LARGE:
-                               $this->showUploadError( wfMsgHtml( 'largefileserver' ) );
+                               $this->showUploadError( $this->msg( 'largefileserver' )->escaped() );
                                break;
                        case UploadBase::FILETYPE_BADTYPE:
-                               $msg = wfMessage( 'filetype-banned-type' );
+                               $msg = $this->msg( 'filetype-banned-type' );
                                if ( isset( $details['blacklistedExt'] ) ) {
                                        $msg->params( $this->getLanguage()->commaList( $details['blacklistedExt'] ) );
                                } else {
@@ -585,7 +580,7 @@ class SpecialUpload extends SpecialPage {
                        case UploadBase::VERIFICATION_ERROR:
                                unset( $details['status'] );
                                $code = array_shift( $details['details'] );
-                               $this->showUploadError( wfMsgExt( $code, 'parseinline', $details['details'] ) );
+                               $this->showUploadError( $this->msg( $code, $details['details'] )->parse() );
                                break;
                        case UploadBase::HOOK_ABORTED:
                                if ( is_array( $details['error'] ) ) { # allow hooks to return error details in an array
@@ -596,7 +591,7 @@ class SpecialUpload extends SpecialPage {
                                        $args = null;
                                }
 
-                               $this->showUploadError( wfMsgExt( $error, 'parseinline', $args ) );
+                               $this->showUploadError( $this->msg( $error, $args )->parse() );
                                break;
                        default:
                                throw new MWException( __METHOD__ . ": Unknown value `{$details['status']}`" );
@@ -641,37 +636,37 @@ class SpecialUpload extends SpecialPage {
 
                if( $exists['warning'] == 'exists' ) {
                        // Exact match
-                       $warning = wfMsgExt( 'fileexists', 'parseinline', $filename );
+                       $warning = wfMessage( 'fileexists', $filename )->parse();
                } elseif( $exists['warning'] == 'page-exists' ) {
                        // Page exists but file does not
-                       $warning = wfMsgExt( 'filepageexists', 'parseinline', $filename );
+                       $warning = wfMessage( 'filepageexists', $filename )->parse();
                } elseif ( $exists['warning'] == 'exists-normalized' ) {
-                       $warning = wfMsgExt( 'fileexists-extension', 'parseinline', $filename,
-                               $exists['normalizedFile']->getTitle()->getPrefixedText() );
+                       $warning = wfMessage( 'fileexists-extension', $filename,
+                               $exists['normalizedFile']->getTitle()->getPrefixedText() )->parse();
                } elseif ( $exists['warning'] == 'thumb' ) {
                        // Swapped argument order compared with other messages for backwards compatibility
-                       $warning = wfMsgExt( 'fileexists-thumbnail-yes', 'parseinline',
-                               $exists['thumbFile']->getTitle()->getPrefixedText(), $filename );
+                       $warning = wfMessage( 'fileexists-thumbnail-yes', 
+                               $exists['thumbFile']->getTitle()->getPrefixedText(), $filename )->parse();
                } elseif ( $exists['warning'] == 'thumb-name' ) {
                        // Image w/o '180px-' does not exists, but we do not like these filenames
                        $name = $file->getName();
                        $badPart = substr( $name, 0, strpos( $name, '-' ) + 1 );
-                       $warning = wfMsgExt( 'file-thumbnail-no', 'parseinline', $badPart );
+                       $warning = wfMessage( 'file-thumbnail-no', $badPart )->parse();
                } elseif ( $exists['warning'] == 'bad-prefix' ) {
-                       $warning = wfMsgExt( 'filename-bad-prefix', 'parseinline', $exists['prefix'] );
+                       $warning = wfMessage( 'filename-bad-prefix', $exists['prefix'] )->parse();
                } elseif ( $exists['warning'] == 'was-deleted' ) {
                        # If the file existed before and was deleted, warn the user of this
                        $ltitle = SpecialPage::getTitleFor( 'Log' );
                        $llink = Linker::linkKnown(
                                $ltitle,
-                               wfMsgHtml( 'deletionlog' ),
+                               wfMessage( 'deletionlog' )->escaped(),
                                array(),
                                array(
                                        'type' => 'delete',
                                        'page' => $filename
                                )
                        );
-                       $warning = wfMsgExt( 'filewasdeleted', array( 'parse', 'replaceafter' ), $llink );
+                       $warning = wfMessage( 'filewasdeleted' )->rawParams( $llink )->parseAsBlock();
                }
 
                return $warning;
@@ -707,22 +702,18 @@ class SpecialUpload extends SpecialPage {
         * @return string
         */
        public static function getDupeWarning( $dupes ) {
-               global $wgOut;
-               if( $dupes ) {
-                       $msg = '<gallery>';
-                       foreach( $dupes as $file ) {
-                               $title = $file->getTitle();
-                               $msg .= $title->getPrefixedText() .
-                                       '|' . $title->getText() . "\n";
-                       }
-                       $msg .= '</gallery>';
-                       return '<li>' .
-                               wfMsgExt( 'file-exists-duplicate', array( 'parse' ), count( $dupes ) ) .
-                               $wgOut->parse( $msg ) .
-                               "</li>\n";
-               } else {
+               if ( !$dupes ) {
                        return '';
                }
+
+               $gallery = new ImageGallery;
+               $gallery->setShowBytes( false );
+               foreach( $dupes as $file ) {
+                       $gallery->add( $file->getTitle() );
+               }
+               return '<li>' .
+                       wfMessage( 'file-exists-duplicate' )->numParams( count( $dupes ) )->parse() .
+                       $gallery->toHtml() . "</li>\n";
        }
 
 }
@@ -775,7 +766,7 @@ class UploadForm extends HTMLForm {
                parent::__construct( $descriptor, $context, 'upload' );
 
                # Set some form properties
-               $this->setSubmitText( wfMsg( 'uploadbtn' ) );
+               $this->setSubmitText( $this->msg( 'uploadbtn' )->text() );
                $this->setSubmitName( 'wpUpload' );
                # Used message keys: 'accesskey-upload', 'tooltip-upload'
                $this->setSubmitTooltip( 'upload' );
@@ -798,6 +789,8 @@ class UploadForm extends HTMLForm {
         * @return Array: descriptor array
         */
        protected function getSourceSection() {
+               global $wgCopyUploadsFromSpecialUpload;
+
                if ( $this->mSessionKey ) {
                        return array(
                                'SessionKey' => array(
@@ -811,7 +804,9 @@ class UploadForm extends HTMLForm {
                        );
                }
 
-               $canUploadByUrl = UploadFromUrl::isEnabled() && UploadFromUrl::isAllowed( $this->getUser() );
+               $canUploadByUrl = UploadFromUrl::isEnabled()
+                       && UploadFromUrl::isAllowed( $this->getUser() )
+                       && $wgCopyUploadsFromSpecialUpload;
                $radio = $canUploadByUrl;
                $selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
 
@@ -843,10 +838,9 @@ class UploadForm extends HTMLForm {
                        'label-message' => 'sourcefilename',
                        'upload-type' => 'File',
                        'radio' => &$radio,
-                       'help' => wfMsgExt( 'upload-maxfilesize',
-                                       array( 'parseinline', 'escapenoentities' ),
+                       'help' => $this->msg( 'upload-maxfilesize',
                                        $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
-                               ) . ' ' . wfMsgHtml( 'upload_source_file' ),
+                               )->parse() . ' ' . $this->msg( 'upload_source_file' )->escaped(),
                        'checked' => $selectedSourceType == 'file',
                );
                if ( $canUploadByUrl ) {
@@ -858,10 +852,9 @@ class UploadForm extends HTMLForm {
                                'label-message' => 'sourceurl',
                                'upload-type' => 'url',
                                'radio' => &$radio,
-                               'help' => wfMsgExt( 'upload-maxfilesize',
-                                               array( 'parseinline', 'escapenoentities' ),
+                               'help' => $this->msg( 'upload-maxfilesize',
                                                $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
-                                       ) . ' ' . wfMsgHtml( 'upload_source_url' ),
+                                       )->parse() . ' ' . $this->msg( 'upload_source_url' )->escaped(),
                                'checked' => $selectedSourceType == 'url',
                        );
                }
@@ -892,16 +885,16 @@ class UploadForm extends HTMLForm {
                                # Everything not permitted is banned
                                $extensionsList =
                                        '<div id="mw-upload-permitted">' .
-                                       wfMsgExt( 'upload-permitted', 'parse', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) ) .
+                                       $this->msg( 'upload-permitted', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) )->parseAsBlock() .
                                        "</div>\n";
                        } else {
                                # We have to list both preferred and prohibited
                                $extensionsList =
                                        '<div id="mw-upload-preferred">' .
-                                       wfMsgExt( 'upload-preferred', 'parse', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) ) .
+                                               $this->msg( 'upload-preferred', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) )->parseAsBlock() .
                                        "</div>\n" .
                                        '<div id="mw-upload-prohibited">' .
-                                       wfMsgExt( 'upload-prohibited', 'parse', $this->getContext()->getLanguage()->commaList( $wgFileBlacklist ) ) .
+                                               $this->msg( 'upload-prohibited', $this->getContext()->getLanguage()->commaList( $wgFileBlacklist ) )->parseAsBlock() .
                                        "</div>\n";
                        }
                } else {
index 6052d09..1a00d73 100644 (file)
@@ -273,8 +273,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Output HTTP response of raw content
         * Side effect: writes HTTP response to STDOUT.
-        * @param String $content: content
-        * @param String $mimeType: mime type
+        * @param $content String content
+        * @param $contentType String mime type
         * @return bool
         */
        private function outputContents( $content, $contentType ) {
@@ -322,7 +322,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Default action when we don't have a subpage -- just show links to the uploads we have,
         * Also show a button to clear stashed files
-        * @param Status : $status - the result of processRequest
+        * @param $status [optional] Status: the result of processRequest
         * @return bool
         */
        private function showUploads( $status = null ) {
index ded2721..c101897 100644 (file)
@@ -74,7 +74,7 @@ class LoginForm extends SpecialPage {
         * Loader
         */
        function load() {
-               global $wgAuth, $wgHiddenPrefs, $wgEnableEmail, $wgRedirectOnLogin;
+               global $wgAuth, $wgHiddenPrefs, $wgEnableEmail;
 
                if ( $this->mLoaded ) {
                        return;
@@ -93,8 +93,6 @@ class LoginForm extends SpecialPage {
                $this->mRetype = $request->getText( 'wpRetype' );
                $this->mDomain = $request->getText( 'wpDomain' );
                $this->mReason = $request->getText( 'wpReason' );
-               $this->mReturnTo = $request->getVal( 'returnto' );
-               $this->mReturnToQuery = $request->getVal( 'returntoquery' );
                $this->mCookieCheck = $request->getVal( 'wpCookieCheck' );
                $this->mPosted = $request->wasPosted();
                $this->mCreateaccount = $request->getCheck( 'wpCreateaccount' );
@@ -107,11 +105,8 @@ class LoginForm extends SpecialPage {
                $this->mLanguage = $request->getText( 'uselang' );
                $this->mSkipCookieCheck = $request->getCheck( 'wpSkipCookieCheck' );
                $this->mToken = ( $this->mType == 'signup' ) ? $request->getVal( 'wpCreateaccountToken' ) : $request->getVal( 'wpLoginToken' );
-
-               if ( $wgRedirectOnLogin ) {
-                       $this->mReturnTo = $wgRedirectOnLogin;
-                       $this->mReturnToQuery = '';
-               }
+               $this->mReturnTo = $request->getVal( 'returnto', '' );
+               $this->mReturnToQuery = $request->getVal( 'returntoquery', '' );
 
                if( $wgEnableEmail ) {
                        $this->mEmail = $request->getText( 'wpEmail' );
@@ -125,11 +120,7 @@ class LoginForm extends SpecialPage {
                }
 
                if( !$wgAuth->validDomain( $this->mDomain ) ) {
-                       if ( isset( $_SESSION['wsDomain'] ) ) {
-                               $this->mDomain = $_SESSION['wsDomain'];
-                       } else {
-                               $this->mDomain = 'invaliddomain';
-                       }
+                       $this->mDomain = $wgAuth->getDomain();
                }
                $wgAuth->setDomain( $this->mDomain );
 
@@ -210,7 +201,7 @@ class LoginForm extends SpecialPage {
                        $this->mainLoginForm( $this->msg( 'mailerror', $result->getWikiText() )->text() );
                } else {
                        $out->addWikiMsg( 'accmailtext', $u->getName(), $u->getEmail() );
-                       $out->returnToMain( false );
+                       $this->executeReturnTo( 'success' );
                }
        }
 
@@ -269,7 +260,7 @@ class LoginForm extends SpecialPage {
                        # Confirm that the account was created
                        $out->setPageTitle( $this->msg( 'accountcreated' ) );
                        $out->addWikiMsg( 'accountcreatedtext', $u->getName() );
-                       $out->returnToMain( false, $this->getTitle() );
+                       $out->addReturnTo( $this->getTitle() );
                        wfRunHooks( 'AddNewAccount', array( $u, false ) );
                        $u->addNewUserLogEntry( false, $this->mReason );
                }
@@ -278,7 +269,7 @@ class LoginForm extends SpecialPage {
 
        /**
         * @private
-        * @return bool|\User
+        * @return bool|User
         */
        function addNewAccountInternal() {
                global $wgAuth, $wgMemc, $wgAccountCreationThrottle,
@@ -335,6 +326,12 @@ class LoginForm extends SpecialPage {
                        return false;
                }
 
+               # Include checks that will include GlobalBlocking (Bug 38333)
+               $permErrors = $this->getTitle()->getUserPermissionsErrors( 'createaccount', $currentUser, true );
+               if ( count( $permErrors ) ) {
+                               throw new PermissionsError( 'createaccount', $permErrors );
+               }
+
                $ip = $this->getRequest()->getIP();
                if ( $currentUser->isDnsBlacklisted( $ip, true /* check $wgProxyWhitelist */ ) ) {
                        $this->mainLoginForm( $this->msg( 'sorbs_create_account_reason' )->text() . ' ' . $this->msg( 'parentheses', $ip )->escaped() );
@@ -863,16 +860,7 @@ class LoginForm extends SpecialPage {
                if( $injected_html !== '' ) {
                        $this->displaySuccessfulLogin( 'loginsuccess', $injected_html );
                } else {
-                       $titleObj = Title::newFromText( $this->mReturnTo );
-                       if ( !$titleObj instanceof Title ) {
-                               $titleObj = Title::newMainPage();
-                       }
-                       $redirectUrl = $titleObj->getFullURL( $this->mReturnToQuery );
-                       global $wgSecureLogin;
-                       if( $wgSecureLogin && !$this->mStickHTTPS ) {
-                               $redirectUrl = preg_replace( '/^https:/', 'http:', $redirectUrl );
-                       }
-                       $this->getOutput()->redirect( $redirectUrl );
+                       $this->executeReturnTo( 'successredirect' );
                }
        }
 
@@ -914,11 +902,7 @@ class LoginForm extends SpecialPage {
 
                $out->addHTML( $injected_html );
 
-               if ( !empty( $this->mReturnTo ) ) {
-                       $out->returnToMain( null, $this->mReturnTo, $this->mReturnToQuery );
-               } else {
-                       $out->returnToMain( null );
-               }
+               $this->executeReturnTo( 'success' );
        }
 
        /**
@@ -952,7 +936,42 @@ class LoginForm extends SpecialPage {
                        $block->getByName()
                );
 
-               $out->returnToMain( false );
+               $this->executeReturnTo( 'error' );
+       }
+
+       /**
+        * Add a "return to" link or redirect to it.
+        *
+        * @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
+        */
+       private function executeReturnTo( $type ) {
+               global $wgRedirectOnLogin, $wgSecureLogin;
+
+               if ( $type != 'error' && $wgRedirectOnLogin !== null ) {
+                       $returnTo = $wgRedirectOnLogin;
+                       $returnToQuery = array();
+               } else {
+                       $returnTo = $this->mReturnTo;
+                       $returnToQuery = wfCgiToArray( $this->mReturnToQuery );
+               }
+
+               $returnToTitle = Title::newFromText( $returnTo );
+               if ( !$returnToTitle ) {
+                       $returnToTitle = Title::newMainPage();
+               }
+
+               if ( $type == 'successredirect' ) {
+                       $redirectUrl = $returnToTitle->getFullURL( $returnToQuery );
+                       if( $wgSecureLogin && !$this->mStickHTTPS ) {
+                               $redirectUrl = preg_replace( '/^https:/', 'http:', $redirectUrl );
+                       }
+                       $this->getOutput()->redirect( $redirectUrl );
+               } else {
+                       $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery );
+               }
        }
 
        /**
@@ -1002,9 +1021,9 @@ class LoginForm extends SpecialPage {
                        $linkmsg = 'nologin';
                }
 
-               if ( !empty( $this->mReturnTo ) ) {
+               if ( $this->mReturnTo !== '' ) {
                        $returnto = '&returnto=' . wfUrlencode( $this->mReturnTo );
-                       if ( !empty( $this->mReturnToQuery ) ) {
+                       if ( $this->mReturnToQuery !== '' ) {
                                $returnto .= '&returntoquery=' .
                                        wfUrlencode( $this->mReturnToQuery );
                        }
@@ -1194,8 +1213,9 @@ class LoginForm extends SpecialPage {
        function cookieRedirectCheck( $type ) {
                $titleObj = SpecialPage::getTitleFor( 'Userlogin' );
                $query = array( 'wpCookieCheck' => $type );
-               if ( $this->mReturnTo ) {
+               if ( $this->mReturnTo !== '' ) {
                        $query['returnto'] = $this->mReturnTo;
+                       $query['returntoquery'] = $this->mReturnToQuery;
                }
                $check = $titleObj->getFullURL( $query );
 
@@ -1265,18 +1285,24 @@ class LoginForm extends SpecialPage {
                        // no link for currently used language
                        return htmlspecialchars( $text );
                }
-               $attr = array( 'uselang' => $lang );
+               $query = array( 'uselang' => $lang );
                if( $this->mType == 'signup' ) {
-                       $attr['type'] = 'signup';
+                       $query['type'] = 'signup';
                }
-               if( $this->mReturnTo ) {
-                       $attr['returnto'] = $this->mReturnTo;
+               if( $this->mReturnTo !== '' ) {
+                       $query['returnto'] = $this->mReturnTo;
+                       $query['returntoquery'] = $this->mReturnToQuery;
                }
+
+               $attr = array();
+               $targetLanguage = Language::factory( $lang );
+               $attr['lang'] = $attr['hreflang'] = $targetLanguage->getHtmlCode();
+
                return Linker::linkKnown(
                        $this->getTitle(),
                        htmlspecialchars( $text ),
-                       array(),
-                       $attr
+                       $attr,
+                       $query
                );
        }
 }
index 8c244c4..59d983f 100644 (file)
@@ -605,7 +605,8 @@ class UserrightsPage extends SpecialPage {
         * @param $output OutputPage to use
         */
        protected function showLogFragment( $user, $output ) {
-               $output->addHTML( Xml::element( 'h2', null, LogPage::logName( 'rights' ) . "\n" ) );
+               $rightsLogPage = new LogPage( 'rights' );
+               $output->addHTML( Xml::element( 'h2', null, $rightsLogPage->getName()->text() ) );
                LogEventsList::showLogExtract( $output, 'rights', $user->getUserPage() );
        }
 }
index 5a71ccb..fbc2c93 100644 (file)
@@ -80,13 +80,13 @@ class SpecialVersion extends SpecialPage {
         * @return string
         */
        private static function getMediaWikiCredits() {
-               $ret = Xml::element( 'h2', array( 'id' => 'mw-version-license' ), wfMsg( 'version-license' ) );
+               $ret = Xml::element( 'h2', array( 'id' => 'mw-version-license' ), wfMessage( 'version-license' )->text() );
 
                // This text is always left-to-right.
                $ret .= '<div>';
                $ret .= "__NOTOC__
                " . self::getCopyrightAndAuthorList() . "\n
-               " . wfMsg( 'version-license-info' );
+               " . wfMessage( 'version-license-info' )->text();
                $ret .= '</div>';
 
                return str_replace( "\t\t", '', $ret ) . "\n";
@@ -108,11 +108,12 @@ class SpecialVersion extends SpecialPage {
                        'Alexandre Emsenhuber', 'Siebrand Mazeland', 'Chad Horohoe',
                        'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed',
                        'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Antoine Musso',
-                       wfMsg( 'version-poweredby-others' )
+                       'Timo Tijhof',
+                       wfMessage( 'version-poweredby-others' )->text()
                );
 
-               return wfMsg( 'version-poweredby-credits', date( 'Y' ),
-                       $wgLang->listToText( $authorList ) );
+               return wfMessage( 'version-poweredby-credits', date( 'Y' ),
+                       $wgLang->listToText( $authorList ) )->text();
        }
 
        /**
@@ -124,8 +125,8 @@ class SpecialVersion extends SpecialPage {
                $dbr = wfGetDB( DB_SLAVE );
 
                // Put the software in an array of form 'name' => 'version'. All messages should
-               // be loaded here, so feel free to use wfMsg*() in the 'name'. Raw HTML or wikimarkup
-               // can be used.
+               // be loaded here, so feel free to use wfMessage in the 'name'. Raw HTML or
+               // wikimarkup can be used.
                $software = array();
                $software['[https://www.mediawiki.org/ MediaWiki]'] = self::getVersionLinked();
                $software['[http://www.php.net/ PHP]'] = phpversion() . " (" . php_sapi_name() . ")";
@@ -134,11 +135,11 @@ class SpecialVersion extends SpecialPage {
                // Allow a hook to add/remove items.
                wfRunHooks( 'SoftwareInfo', array( &$software ) );
 
-               $out = Xml::element( 'h2', array( 'id' => 'mw-version-software' ), wfMsg( 'version-software' ) ) .
+               $out = Xml::element( 'h2', array( 'id' => 'mw-version-software' ), wfMessage( 'version-software' )->text() ) .
                           Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-software' ) ) .
                                "<tr>
-                                       <th>" . wfMsg( 'version-software-product' ) . "</th>
-                                       <th>" . wfMsg( 'version-software-version' ) . "</th>
+                                       <th>" . wfMessage( 'version-software-product' )->text() . "</th>
+                                       <th>" . wfMessage( 'version-software-version' )->text() . "</th>
                                </tr>\n";
 
                foreach( $software as $name => $version ) {
@@ -165,6 +166,9 @@ class SpecialVersion extends SpecialPage {
                $svnInfo = self::getSvnInfo( $IP );
                if ( !$svnInfo && !$gitInfo ) {
                        $version = $wgVersion;
+               } elseif ( $gitInfo && $flags === 'nodb' ) {
+                       $shortSha1 = substr( $gitInfo, 0, 7 );
+                       $version = "$wgVersion ($shortSha1)";
                } elseif ( $gitInfo ) {
                        $shortSha1 = substr( $gitInfo, 0, 7 );
                        $shortSha1 = wfMessage( 'parentheses' )->params( $shortSha1 )->escaped();
@@ -173,11 +177,11 @@ class SpecialVersion extends SpecialPage {
                        $version = "$wgVersion (r{$svnInfo['checkout-rev']})";
                } else {
                        $version = $wgVersion . ' ' .
-                               wfMsg(
+                               wfMessage(
                                        'version-svn-revision',
                                        isset( $info['directory-rev'] ) ? $info['directory-rev'] : '',
                                        $info['checkout-rev']
-                               );
+                               )->text();
                }
 
                wfProfileOut( __METHOD__ );
@@ -223,11 +227,11 @@ class SpecialVersion extends SpecialPage {
                        return false;
                }
 
-               $linkText = wfMsg(
+               $linkText = wfMessage(
                        'version-svn-revision',
                        isset( $info['directory-rev'] ) ? $info['directory-rev'] : '',
                        $info['checkout-rev']
-               );
+               )->text();
 
                if ( isset( $info['viewvc-url'] ) ) {
                        $version = "$wgVersion [{$info['viewvc-url']} $linkText]";
@@ -273,14 +277,14 @@ class SpecialVersion extends SpecialPage {
        public static function getExtensionTypes() {
                if ( self::$extensionTypes === false ) {
                        self::$extensionTypes = array(
-                               'specialpage' => wfMsg( 'version-specialpages' ),
-                               'parserhook' => wfMsg( 'version-parserhooks' ),
-                               'variable' => wfMsg( 'version-variables' ),
-                               'media' => wfMsg( 'version-mediahandlers' ),
-                               'antispam' => wfMsg( 'version-antispam' ),
-                               'skin' => wfMsg( 'version-skins' ),
-                               'api' => wfMsg( 'version-api' ),
-                               'other' => wfMsg( 'version-other' ),
+                               'specialpage' => wfMessage( 'version-specialpages' )->text(),
+                               'parserhook' => wfMessage( 'version-parserhooks' )->text(),
+                               'variable' => wfMessage( 'version-variables' )->text(),
+                               'media' => wfMessage( 'version-mediahandlers' )->text(),
+                               'antispam' => wfMessage( 'version-antispam' )->text(),
+                               'skin' => wfMessage( 'version-skins' )->text(),
+                               'api' => wfMessage( 'version-api' )->text(),
+                               'other' => wfMessage( 'version-other' )->text(),
                        );
 
                        wfRunHooks( 'ExtensionTypes', array( &self::$extensionTypes ) );
@@ -322,7 +326,7 @@ class SpecialVersion extends SpecialPage {
                 */
                wfRunHooks( 'SpecialVersionExtensionTypes', array( &$this, &$extensionTypes ) );
 
-               $out = Xml::element( 'h2', array( 'id' => 'mw-version-ext' ), wfMsg( 'version-extensions' ) ) .
+               $out = Xml::element( 'h2', array( 'id' => 'mw-version-ext' ), $this->msg( 'version-extensions' )->text() ) .
                        Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-ext' ) );
 
                // Make sure the 'other' type is set to an array.
@@ -348,7 +352,7 @@ class SpecialVersion extends SpecialPage {
                $out .= $this->getExtensionCategory( 'other', $extensionTypes['other'] );
 
                if ( count( $wgExtensionFunctions ) ) {
-                       $out .= $this->openExtType( wfMsg( 'version-extension-functions' ), 'extension-functions' );
+                       $out .= $this->openExtType( $this->msg( 'version-extension-functions' )->text(), 'extension-functions' );
                        $out .= '<tr><td colspan="4">' . $this->listToText( $wgExtensionFunctions ) . "</td></tr>\n";
                }
 
@@ -359,13 +363,13 @@ class SpecialVersion extends SpecialPage {
                        for ( $i = 0; $i < $cnt; ++$i ) {
                                $tags[$i] = "&lt;{$tags[$i]}&gt;";
                        }
-                       $out .= $this->openExtType( wfMsg( 'version-parser-extensiontags' ), 'parser-tags' );
+                       $out .= $this->openExtType( $this->msg( 'version-parser-extensiontags' )->text(), 'parser-tags' );
                        $out .= '<tr><td colspan="4">' . $this->listToText( $tags ). "</td></tr>\n";
                }
 
                $fhooks = $wgParser->getFunctionHooks();
                if( count( $fhooks ) ) {
-                       $out .= $this->openExtType( wfMsg( 'version-parser-function-hooks' ), 'parser-function-hooks' );
+                       $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 +448,7 @@ class SpecialVersion extends SpecialPage {
                                # Make subversion text/link.
                                if ( $svnInfo !== false ) {
                                        $directoryRev = isset( $svnInfo['directory-rev'] ) ? $svnInfo['directory-rev'] : null;
-                                       $vcsText = wfMsg( 'version-svn-revision', $directoryRev, $svnInfo['checkout-rev'] );
+                                       $vcsText = $this->msg( 'version-svn-revision', $directoryRev, $svnInfo['checkout-rev'] )->text();
                                        $vcsText = isset( $svnInfo['viewvc-url'] ) ? '[' . $svnInfo['viewvc-url'] . " $vcsText]" : $vcsText;
                                }
                        }
@@ -459,7 +463,7 @@ class SpecialVersion extends SpecialPage {
 
                if ( isset( $extension['version'] ) ) {
                        $versionText = '<span class="mw-version-ext-version">' .
-                               wfMsg( 'version-version', $extension['version'] ) .
+                               $this->msg( 'version-version', $extension['version'] )->text() .
                                '</span>';
                } else {
                        $versionText = '';
@@ -476,9 +480,9 @@ class SpecialVersion extends SpecialPage {
                                $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
-                               $description = wfMsg( $descriptionMsgKey, $descriptionMsg );
+                               $description = $this->msg( $descriptionMsgKey, $descriptionMsg )->text();
                        } else {
-                               $description = wfMsg( $descriptionMsg );
+                               $description = $this->msg( $descriptionMsg )->text();
                        }
                }
 
@@ -511,11 +515,11 @@ class SpecialVersion extends SpecialPage {
                        $myWgHooks = $wgHooks;
                        ksort( $myWgHooks );
 
-                       $ret = Xml::element( 'h2', array( 'id' => 'mw-version-hooks' ), wfMsg( 'version-hooks' ) ) .
+                       $ret = Xml::element( 'h2', array( 'id' => 'mw-version-hooks' ), $this->msg( 'version-hooks' )->text() ) .
                                Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-hooks' ) ) .
                                "<tr>
-                                       <th>" . wfMsg( 'version-hook-name' ) . "</th>
-                                       <th>" . wfMsg( 'version-hook-subscribedby' ) . "</th>
+                                       <th>" . $this->msg( 'version-hook-name' )->text() . "</th>
+                                       <th>" . $this->msg( 'version-hook-subscribedby' )->text() . "</th>
                                </tr>\n";
 
                        foreach ( $myWgHooks as $hook => $hooks ) {
@@ -571,7 +575,7 @@ class SpecialVersion extends SpecialPage {
                $list = array();
                foreach( (array)$authors as $item ) {
                        if( $item == '...' ) {
-                               $list[] = wfMsg( 'version-poweredby-others' );
+                               $list[] = $this->msg( 'version-poweredby-others' )->text();
                        } else {
                                $list[] = $item;
                        }
@@ -755,11 +759,11 @@ class SpecialVersion extends SpecialPage {
                        'version-entrypoints-load-php' => wfScript( 'load' ),
                );
 
-               $out = Html::element( 'h2', array( 'id' => 'mw-version-entrypoints' ), wfMsg( 'version-entrypoints' ) ) .
+               $out = Html::element( 'h2', array( 'id' => 'mw-version-entrypoints' ), $this->msg( 'version-entrypoints' )->text() ) .
                        Html::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'mw-version-entrypoints-table' ) ) .
                        Html::openElement( 'tr' ) .
-                       Html::element( 'th', array(), wfMessage( 'version-entrypoints-header-entrypoint' )->text() ) .
-                       Html::element( 'th', array(), wfMessage( 'version-entrypoints-header-url' )->text() ) .
+                       Html::element( 'th', array(), $this->msg( 'version-entrypoints-header-entrypoint' )->text() ) .
+                       Html::element( 'th', array(), $this->msg( 'version-entrypoints-header-url' )->text() ) .
                        Html::closeElement( 'tr' );
 
                foreach ( $entryPoints as $message => $value ) {
@@ -767,7 +771,7 @@ class SpecialVersion extends SpecialPage {
                        $out .= Html::openElement( 'tr' ) .
                                // ->text() looks like it should be ->parse(), but this function
                                // returns wikitext, not HTML, boo
-                               Html::rawElement( 'td', array(), wfMessage( $message )->text() ) .
+                               Html::rawElement( 'td', array(), $this->msg( $message )->text() ) .
                                Html::rawElement( 'td', array(), Html::rawElement( 'code', array(), "[$url $value]" ) ) .
                                Html::closeElement( 'tr' );
                }
index f497e4e..0b1fb25 100644 (file)
@@ -37,9 +37,9 @@ class WantedCategoriesPage extends WantedQueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'categorylinks', 'page' ),
-                       'fields' => array ( "'" . NS_CATEGORY . "' AS namespace",
-                                       'cl_to AS title',
-                                       'COUNT(*) AS value' ),
+                       'fields' => array ( 'namespace' => NS_CATEGORY,
+                                       'title' => 'cl_to',
+                                       'value' => 'COUNT(*)' ),
                        'conds' => array ( 'page_title IS NULL' ),
                        'options' => array ( 'GROUP BY' => 'cl_to' ),
                        'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
index 2475189..f52f7bb 100644 (file)
@@ -75,9 +75,9 @@ class WantedFilesPage extends WantedQueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'imagelinks', 'image' ),
-                       'fields' => array ( "'" . NS_FILE . "' AS namespace",
-                                       'il_to AS title',
-                                       'COUNT(*) AS value' ),
+                       'fields' => array ( 'namespace' => NS_FILE,
+                                       'title' => 'il_to',
+                                       'value' => 'COUNT(*)' ),
                        'conds' => array ( 'img_name IS NULL' ),
                        'options' => array ( 'GROUP BY' => 'il_to' ),
                        'join_conds' => array ( 'image' =>
index 9f5d52d..7673305 100644 (file)
@@ -60,9 +60,9 @@ class WantedPagesPage extends WantedQueryPage {
                                'pg2' => 'page'
                        ),
                        'fields' => array(
-                               'pl_namespace AS namespace',
-                               'pl_title AS title',
-                               'COUNT(*) AS value'
+                               'namespace' => 'pl_namespace',
+                               'title' => 'pl_title',
+                               'value' => 'COUNT(*)'
                        ),
                        'conds' => array(
                                'pg1.page_namespace IS NULL',
index 2b4364b..f3e3369 100644 (file)
@@ -40,9 +40,9 @@ class WantedTemplatesPage extends WantedQueryPage {
        function getQueryInfo() {
                return array (
                        'tables' => array ( 'templatelinks', 'page' ),
-                       'fields' => array ( 'tl_namespace AS namespace',
-                                       'tl_title AS title',
-                                       'COUNT(*) AS value' ),
+                       'fields' => array ( 'namespace' => 'tl_namespace',
+                                       'title' => 'tl_title',
+                                       'value' => 'COUNT(*)' ),
                        'conds' => array ( 'page_title IS NULL',
                                        'tl_namespace' => NS_TEMPLATE ),
                        'options' => array (
index a81eb5b..5dfc113 100644 (file)
@@ -500,7 +500,7 @@ class SpecialWatchlist extends SpecialPage {
                $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
 
                # Fetch the raw count
-               $res = $dbr->select( 'watchlist', 'COUNT(*) AS count',
+               $res = $dbr->select( 'watchlist', array( 'count' => 'COUNT(*)' ),
                        array( 'wl_user' => $this->getUser()->getId() ), __METHOD__ );
                $row = $dbr->fetchObject( $res );
                $count = $row->count;
index accef8c..2988b04 100644 (file)
@@ -41,10 +41,10 @@ class WithoutInterwikiPage extends PageQueryPage {
        }
 
        function getPageHeader() {
-               global $wgScript, $wgMiserMode;
+               global $wgScript;
 
-               # Do not show useless input form if wiki is running in misermode
-               if( $wgMiserMode ) {
+               # Do not show useless input form if special page is cached
+               if( $this->isCached() ) {
                        return '';
                }
 
@@ -80,9 +80,9 @@ class WithoutInterwikiPage extends PageQueryPage {
        function getQueryInfo() {
                $query = array (
                        'tables' => array ( 'page', 'langlinks' ),
-                       'fields' => array ( 'page_namespace AS namespace',
-                                       'page_title AS title',
-                                       'page_title AS value' ),
+                       'fields' => array ( 'namespace' => 'page_namespace',
+                                       'title' => 'page_title',
+                                       'value' => 'page_title' ),
                        'conds' => array ( 'll_title IS NULL',
                                        'page_namespace' => MWNamespace::getContentNamespaces(),
                                        'page_is_redirect' => 0 ),
index b22c144..98727f1 100644 (file)
@@ -169,9 +169,10 @@ class UsercreateTemplate extends QuickTemplate {
                        <td></td>
                        <td class="mw-input">
                                <?php
-                               global $wgCookieExpiration, $wgLang;
+                               global $wgCookieExpiration;
+                               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
                                echo Xml::checkLabel(
-                                       wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
+                                       wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
                                        'wpRemember',
                                        'wpRemember',
                                        $this->data['remember'],
index 5a2c633..a3f6a38 100644 (file)
@@ -108,9 +108,10 @@ class UserloginTemplate extends QuickTemplate {
                        <td></td>
                        <td class="mw-input">
                                <?php
-                               global $wgCookieExpiration, $wgLang;
+                               global $wgCookieExpiration;
+                               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
                                echo Xml::checkLabel(
-                                       wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
+                                       wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
                                        'wpRemember',
                                        'wpRemember',
                                        $this->data['remember'],
@@ -126,7 +127,7 @@ class UserloginTemplate extends QuickTemplate {
                        <td class="mw-input">
                        <?php
                        echo Xml::checkLabel(
-                               wfMsg( 'securelogin-stick-https' ),
+                               wfMessage( 'securelogin-stick-https' )->text(),
                                'wpStickHTTPS',
                                'wpStickHTTPS',
                                $this->data['stickHTTPS'],
@@ -140,7 +141,7 @@ class UserloginTemplate extends QuickTemplate {
                        <td></td>
                        <td class="mw-submit">
                                <?php
-               echo Html::input( 'wpLoginAttempt', wfMsg( 'login' ), 'submit', array(
+               echo Html::input( 'wpLoginAttempt', wfMessage( 'login' )->text(), 'submit', array(
                        'id' => 'wpLoginAttempt',
                        'tabindex' => '9'
                ) );
@@ -153,10 +154,14 @@ class UserloginTemplate extends QuickTemplate {
                                );
                        } elseif( $this->data['resetlink'] === null ) {
                                echo '&#160;';
-                               echo Html::input( 'wpMailmypassword', wfMsg( 'mailmypassword' ), 'submit', array(
-                                       'id' => 'wpMailmypassword',
-                                       'tabindex' => '10'
-                               ) );
+                               echo Html::input(
+                                       'wpMailmypassword',
+                                       wfMessage( 'mailmypassword' )->text(),
+                                       'submit', array(
+                                               'id' => 'wpMailmypassword',
+                                               'tabindex' => '10'
+                                       )
+                               );
                        }
                } ?>
 
index 479083e..aa333fc 100644 (file)
@@ -16,4 +16,4 @@ quiet: yes
 quote-nbsp: yes
 fix-backslash: no
 fix-uri: no
-new-inline-tags: video,audio,source,track
+new-inline-tags: video,audio,source,track,bdi
index 8eb2781..d40b53d 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 /**
- * @defgroup Upload
+ * @defgroup Upload Upload related
  */
 
 /**
@@ -63,6 +63,10 @@ abstract class UploadBase {
        const WINDOWS_NONASCII_FILENAME = 13;
        const FILENAME_TOO_LONG = 14;
 
+       /**
+        * @param $error int
+        * @return string
+        */
        public function getVerificationErrorCode( $error ) {
                $code_to_status = array(self::EMPTY_FILE => 'empty-file',
                                                                self::FILE_TOO_LARGE => 'file-too-large',
@@ -165,6 +169,7 @@ abstract class UploadBase {
 
        /**
         * Check whether a request if valid for this handler
+        * @param $request
         * @return bool
         */
        public static function isValidRequest( $request ) {
@@ -187,7 +192,7 @@ abstract class UploadBase {
         * @param $tempPath string the temporary path
         * @param $fileSize int the file size
         * @param $removeTempFile bool (false) remove the temporary file?
-        * @return null
+        * @throws MWException
         */
        public function initializePathInfo( $name, $tempPath, $fileSize, $removeTempFile = false ) {
                $this->mDesiredDestName = $name;
@@ -230,7 +235,7 @@ abstract class UploadBase {
 
        /**
         * @param $srcPath String: the source path
-        * @return stringthe real path if it was a virtual URL
+        * @return string the real path if it was a virtual URL
         */
        function getRealPath( $srcPath ) {
                wfProfileIn( __METHOD__ );
@@ -614,6 +619,9 @@ abstract class UploadBase {
         * Really perform the upload. Stores the file in the local repo, watches
         * if necessary and runs the UploadComplete hook.
         *
+        * @param $comment
+        * @param $pageText
+        * @param $watch
         * @param $user User
         *
         * @return Status indicating the whether the upload succeeded.
@@ -758,7 +766,7 @@ abstract class UploadBase {
        /**
         * Return the local file and initializes if necessary.
         *
-        * @return LocalFile
+        * @return LocalFile|null
         */
        public function getLocalFile() {
                if( is_null( $this->mLocalFile ) ) {
@@ -830,6 +838,7 @@ abstract class UploadBase {
         * earlier pseudo-'extensions' to determine type and execute
         * scripts, so the blacklist needs to check them all.
         *
+        * @param $filename string
         * @return array
         */
        public static function splitExtensions( $filename ) {
@@ -1028,6 +1037,10 @@ abstract class UploadBase {
                return false;
        }
 
+       /**
+        * @param $filename string
+        * @return bool
+        */
        protected function detectScriptInSvg( $filename ) {
                $check = new XmlTypeCheck( $filename, array( $this, 'checkSvgScriptCallback' ) );
                return $check->filterMatch;
@@ -1035,6 +1048,8 @@ abstract class UploadBase {
 
        /**
         * @todo Replace this with a whitelist filter!
+        * @param $element string
+        * @param $attribs array
         * @return bool
         */
        public function checkSvgScriptCallback( $element, $attribs ) {
@@ -1134,6 +1149,10 @@ abstract class UploadBase {
                return false; //No scripts detected
        }
 
+       /**
+        * @param $name string
+        * @return string
+        */
        private function stripXmlNamespace( $name ) {
                // 'http://www.w3.org/2000/svg:script' -> 'script'
                $parts = explode( ':', strtolower( $name ) );
@@ -1165,7 +1184,7 @@ abstract class UploadBase {
                        $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>",
                                array( 'virus-badscanner', $wgAntivirus ) );
                        wfProfileOut( __METHOD__ );
-                       return wfMsg( 'virus-unknownscanner' ) . " $wgAntivirus";
+                       return wfMessage( 'virus-unknownscanner' )->text() . " $wgAntivirus";
                }
 
                # look up scanner configuration
@@ -1208,7 +1227,7 @@ abstract class UploadBase {
 
                        if ( $wgAntivirusRequired ) {
                                wfProfileOut( __METHOD__ );
-                               return wfMsg( 'virus-scanfailed', array( $exitCode ) );
+                               return wfMessage( 'virus-scanfailed', array( $exitCode ) )->text();
                        } else {
                                wfProfileOut( __METHOD__ );
                                return null;
@@ -1385,6 +1404,7 @@ abstract class UploadBase {
 
        /**
         * Helper function that checks whether the filename looks like a thumbnail
+        * @param $filename string
         * @return bool
         */
        public static function isThumbName( $filename ) {
@@ -1448,13 +1468,20 @@ abstract class UploadBase {
                return $info;
        }
 
-
+       /**
+        * @param $error array
+        * @return Status
+        */
        public function convertVerifyErrorToStatus( $error ) {
                $code = $error['status'];
                unset( $code['status'] );
                return Status::newFatal( $this->getVerificationErrorCode( $code ), $error );
        }
 
+       /**
+        * @param $forType null|string
+        * @return int
+        */
        public static function getMaxUploadSize( $forType = null ) {
                global $wgMaxUploadSize;
 
index e50c6da..54a68af 100644 (file)
  */
 class UploadFromChunks extends UploadFromFile {
        protected $mOffset, $mChunkIndex, $mFileKey, $mVirtualTempPath;
-       
+
        /**
         * Setup local pointers to stash, repo and user ( similar to UploadFromStash )
-        * 
+        *
         * @param $user User
         * @param $stash UploadStash
         * @param $repo FileRepo
@@ -77,12 +77,12 @@ class UploadFromChunks extends UploadFromFile {
 
                // Output a copy of this first to chunk 0 location:
                $status = $this->outputChunk( $this->mLocalFile->getPath() );
-               
+
                // Update db table to reflect initial "chunk" state 
                $this->updateChunkStatus();
                return $this->mLocalFile;
        }
-       
+
        /**
         * Continue chunk uploading
         */     
@@ -91,7 +91,7 @@ class UploadFromChunks extends UploadFromFile {
                $this->mUpload = $webRequestUpload;
                // Get the chunk status form the db: 
                $this->getChunkStatus();
-               
+
                $metadata = $this->stash->getMetadata( $key );
                $this->initializePathInfo( $name,
                        $this->getRealPath( $metadata['us_path'] ),
@@ -99,7 +99,7 @@ class UploadFromChunks extends UploadFromFile {
                        false
                );
        }
-       
+
        /**
         * Append the final chunk and ready file for parent::performUpload()
         * @return FileRepoStatus
@@ -194,14 +194,14 @@ class UploadFromChunks extends UploadFromFile {
                }
                return $status;
        }
-       
+
        /**
         * Update the chunk db table with the current status: 
         */
        private function updateChunkStatus(){
                wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" . 
                                        $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
-               
+
                $dbw = $this->repo->getMasterDb();
                $dbw->update(
                        'uploadstash',
@@ -214,6 +214,7 @@ class UploadFromChunks extends UploadFromFile {
                        __METHOD__
                );
        }
+
        /**
         * Get the chunk db state and populate update relevant local values
         */
@@ -238,6 +239,7 @@ class UploadFromChunks extends UploadFromFile {
                        $this->mVirtualTempPath = $row->us_path;
                }
        }
+
        /**
         * Get the current Chunk index 
         * @return Integer index of the current chunk
@@ -248,7 +250,7 @@ class UploadFromChunks extends UploadFromFile {
                }
                return 0;
        }
-       
+
        /**
         * Gets the current offset in fromt the stashedupload table 
         * @return Integer current byte offset of the chunk file set 
@@ -259,11 +261,12 @@ class UploadFromChunks extends UploadFromFile {
                }
                return 0;
        }
-       
+
        /**
         * Output the chunk to disk
-        * 
+        *
         * @param $chunkPath string
+        * @throws UploadChunkFileException
         * @return FileRepoStatus
         */
        private function outputChunk( $chunkPath ){
@@ -289,6 +292,7 @@ class UploadFromChunks extends UploadFromFile {
                }
                return $storeStatus;
        }
+
        private function getChunkFileKey( $index = null ){
                if( $index === null ){
                        $index = $this->getChunkIndex();
index fae9974..aa0cc77 100644 (file)
@@ -36,26 +36,25 @@ class UploadFromFile extends UploadBase {
 
        /**
         * @param $request WebRequest
-        * @return null
         */
        function initializeFromRequest( &$request ) {
-               $upload = $request->getUpload( 'wpUploadFile' );                
+               $upload = $request->getUpload( 'wpUploadFile' );
                $desiredDestName = $request->getText( 'wpDestFile' );
-               if( !$desiredDestName )
+               if( !$desiredDestName ) {
                        $desiredDestName = $upload->getName();
-                       
-               return $this->initialize( $desiredDestName, $upload );
+               }
+
+               $this->initialize( $desiredDestName, $upload );
        }
 
        /**
         * Initialize from a filename and a WebRequestUpload
         * @param $name
         * @param $webRequestUpload
-        * @return null
         */
        function initialize( $name, $webRequestUpload ) {
                $this->mUpload = $webRequestUpload;
-               return $this->initializePathInfo( $name, 
+               $this->initializePathInfo( $name,
                        $this->mUpload->getTempName(), $this->mUpload->getSize() );
        }
 
index d5cce14..607965f 100644 (file)
@@ -62,8 +62,6 @@ class UploadFromStash extends UploadBase {
 
                        $this->stash = new UploadStash( $this->repo, $this->user );
                }
-
-               return true;
        }
 
        /**
index c7e482e..c11d719 100644 (file)
@@ -36,11 +36,12 @@ class UploadFromUrl extends UploadBase {
 
        /**
         * Checks if the user is allowed to use the upload-by-URL feature. If the
-        * user is allowed, pass on permissions checking to the parent.
+        * user is not allowed, return the name of the user right as a string. If
+        * the user is allowed, have the parent do further permissions checking.
         *
         * @param $user User
         *
-        * @return bool
+        * @return bool|string
         */
        public static function isAllowed( $user ) {
                if ( !$user->isAllowed( 'upload_by_url' ) ) {
@@ -91,6 +92,7 @@ class UploadFromUrl extends UploadBase {
         * @param $async mixed Whether the download should be performed
         * asynchronous. False for synchronous, async or async-leavemessage for
         * asynchronous download.
+        * @throws MWException
         */
        public function initialize( $name, $url, $async = false ) {
                global $wgAllowAsyncCopyUploads;
@@ -255,6 +257,7 @@ class UploadFromUrl extends UploadBase {
        /**
         * Wrapper around the parent function in order to defer checking protection
         * until we are sure that the file can actually be uploaded
+        * @param $user User
         * @return bool|mixed
         */
        public function verifyTitlePermissions( $user ) {
@@ -267,6 +270,10 @@ class UploadFromUrl extends UploadBase {
        /**
         * Wrapper around the parent function in order to defer uploading to the
         * job queue for asynchronous uploads
+        * @param $comment string
+        * @param $pageText string
+        * @param $watch bool
+        * @param $user User
         * @return Status
         */
        public function performUpload( $comment, $pageText, $watch, $user ) {
@@ -280,11 +287,11 @@ class UploadFromUrl extends UploadBase {
        }
 
        /**
-        * @param  $comment
-        * @param  $pageText
-        * @param  $watch
-        * @param  $user User
-        * @return
+        * @param $comment
+        * @param $pageText
+        * @param $watch
+        * @param $user User
+        * @return String
         */
        protected function insertJob( $comment, $pageText, $watch, $user ) {
                $sessionKey = $this->stashSession();
index 12531c2..aa65ffe 100644 (file)
@@ -68,9 +68,11 @@ class UploadStash {
 
        /**
         * Represents a temporary filestore, with metadata in the database.
-        * Designed to be compatible with the session stashing code in UploadBase (should replace it eventually)
+        * Designed to be compatible with the session stashing code in UploadBase
+        * (should replace it eventually).
         *
         * @param $repo FileRepo
+        * @param $user User (default null)
         */
        public function __construct( FileRepo $repo, $user = null ) {
                // this might change based on wiki's configuration.
@@ -237,10 +239,14 @@ class UploadStash {
                                }
                        }
                        // at this point, $error should contain the single "most important" error, plus any parameters.
-                       throw new UploadStashFileException( "Error storing file in '$path': " . wfMessage( $error )->text() );
+                       $errorMsg = array_shift( $error );
+                       throw new UploadStashFileException( "Error storing file in '$path': " . wfMessage( $errorMsg, $error )->text() );
                }
                $stashPath = $storeStatus->value;
 
+               // we have renamed the file so we have to cleanup once done
+               unlink($path);
+
                // fetch the current user ID
                if ( !$this->isLoggedIn ) {
                        throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
@@ -442,6 +448,7 @@ class UploadStash {
         * Helper function: do the actual database query to fetch file metadata.
         *
         * @param $key String: key
+        * @param $readFromDB: constant (default: DB_SLAVE)
         * @return boolean
         */
        protected function fetchFileMetadata( $key, $readFromDB = DB_SLAVE ) {
@@ -474,7 +481,6 @@ class UploadStash {
        /**
         * Helper function: Initialize the UploadStashFile for a given file.
         *
-        * @param $path String: path to file
         * @param $key String: key under which to store the object
         * @throws UploadStashZeroLengthFileException
         * @return bool
@@ -574,8 +580,8 @@ class UploadStashFile extends UnregisteredLocalFile {
 
        /**
         * Helper function -- given a 'subpage', return the local URL e.g. /wiki/Special:UploadStash/subpage
-        * @param {String} $subPage
-        * @return {String} local URL for this subpage in the Special:UploadStash space.
+        * @param $subPage String
+        * @return String: local URL for this subpage in the Special:UploadStash space.
         */
        private function getSpecialUrl( $subPage ) {
                return SpecialPage::getTitleFor( 'UploadStash', $subPage )->getLocalURL();
index eb5fa39..1b84f8e 100644 (file)
@@ -239,7 +239,6 @@ U+09E21鸡|U+096DE雞|U+09DC4鷄|
 U+09E5A鹚|U+09DBF鶿|U+09DC0鷀|
 U+09E6E鹮|U+04D09䴉|
 U+09F44齄|U+09F47齇|
-U+0E82D|U+068E1棡|
 U+20BB6𠮶|U+055F0嗰|
 U+26216𦈖|U+04308䌈|
 U+28C3E𨰾|U+093B7鎷|
index 41680d1..243f61b 100644 (file)
@@ -9,7 +9,6 @@
 乙太網      以太网
 點陣圖      位图
 常式 例程
-游標 光标
 光碟 光盘
 光碟機      光驱
 全形 全角
index 692c74b..7c3ce10 100644 (file)
@@ -43,7 +43,6 @@ U+065E3旣|U+065E2既|
 U+06607昇|U+05347升|
 U+0672E朮|U+0672F术|
 U+068CA棊|U+068CB棋|
-U+068E1棡|U+0E82D|
 U+069A6榦|U+05E72干|
 U+069D3槓|U+06760杠|
 U+06A11樑|U+06881梁|
index 922b7de..9a9534f 100644 (file)
 細如髮
 繫於一髮
 膚髮
+皮膚
 生華髮
 蒼髮
 被髮佯狂
 棺材裡
 注釋
 月面
+路面
 修杰楷
 修杰麟
 學裡
index 2010878..0e9676d 100644 (file)
--- a/index.php
+++ b/index.php
@@ -41,6 +41,7 @@
 # PHP 4. Setup.php and ObjectCache.php have structures invalid in PHP 5.0 and
 # 5.1, respectively.
 if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
+       // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
        require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
        wfPHPVersionError( 'index.php' );
 }
@@ -51,7 +52,7 @@ if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require ( 'phase3/includes/WebStart.php' );
 } else {
-       require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
+       require ( __DIR__ . '/includes/WebStart.php' );
 }
 
 $mediaWiki = new MediaWiki();
index b531f2a..1edca80 100644 (file)
@@ -32,7 +32,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 
 # Read language names
 global $wgLanguageNames;
-require_once( dirname( __FILE__ ) . '/Names.php' );
+require_once( __DIR__ . '/Names.php' );
 
 if ( function_exists( 'mb_strtoupper' ) ) {
        mb_internal_encoding( 'UTF-8' );
@@ -246,7 +246,11 @@ class Language {
         */
        public static function isValidCode( $code ) {
                return
-                       strcspn( $code, ":/\\\000" ) === strlen( $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
+                       strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
                        && !preg_match( Title::getTitleInvalidRegex(), $code );
        }
 
@@ -262,9 +266,9 @@ class Language {
         */
        public static function isValidBuiltInCode( $code ) {
 
-               if( !is_string($code) ) {
+               if ( !is_string( $code ) ) {
                        $type = gettype( $code );
-                       if( $type === 'object' ) {
+                       if ( $type === 'object' ) {
                                $addmsg = " of class " . get_class( $code );
                        } else {
                                $addmsg = '';
@@ -738,7 +742,7 @@ class Language {
 
                $names = array();
 
-               if( $inLanguage ) {
+               if ( $inLanguage ) {
                        # TODO: also include when $inLanguage is null, when this code is more efficient
                        wfRunHooks( 'LanguageGetTranslatedLanguageNames', array( &$names, $inLanguage ) );
                }
@@ -758,11 +762,11 @@ class Language {
 
                $returnMw = array();
                $coreCodes = array_keys( $mwNames );
-               foreach( $coreCodes as $coreCode ) {
+               foreach ( $coreCodes as $coreCode ) {
                        $returnMw[$coreCode] = $names[$coreCode];
                }
 
-               if( $include === 'mwfile' ) {
+               if ( $include === 'mwfile' ) {
                        $namesMwFile = array();
                        # We do this using a foreach over the codes instead of a directory
                        # loop so that messages files in extensions will work correctly.
@@ -796,7 +800,7 @@ class Language {
         * @return string
         */
        function getMessageFromDB( $msg ) {
-               return wfMsgExt( $msg, array( 'parsemag', 'language' => $this ) );
+               return wfMessage( $msg )->inLanguage( $this )->text();
        }
 
        /**
@@ -1268,7 +1272,7 @@ class Language {
                                        $s .= $num;
                                        $raw = false;
                                } elseif ( $roman ) {
-                                       $s .= self::romanNumeral( $num );
+                                       $s .= Language::romanNumeral( $num );
                                        $roman = false;
                                } elseif ( $hebrewNum ) {
                                        $s .= self::hebrewNumeral( $num );
@@ -1657,7 +1661,7 @@ class Language {
        }
 
        /**
-        * Roman number formatting up to 3000
+        * Roman number formatting up to 10000
         *
         * @param $num int
         *
@@ -1668,11 +1672,11 @@ class Language {
                        array( '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X' ),
                        array( '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', 'C' ),
                        array( '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', 'M' ),
-                       array( '', 'M', 'MM', 'MMM' )
+                       array( '', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM', 'MMMMMM', 'MMMMMMM', 'MMMMMMMM', 'MMMMMMMMM', 'MMMMMMMMMM' )
                );
 
                $num = intval( $num );
-               if ( $num > 3000 || $num <= 0 ) {
+               if ( $num > 10000 || $num <= 0 ) {
                        return $num;
                }
 
@@ -2702,6 +2706,7 @@ class Language {
         *
         * @param $opposite Boolean Get the direction mark opposite to your language
         * @return string
+        * @since 1.20
         */
        function getDirMarkEntity( $opposite = false ) {
                if ( $opposite ) { return $this->isRTL() ? '&lrm;' : '&rlm;'; }
@@ -2860,7 +2865,7 @@ class Language {
          *
          * An example of this function being called:
          * <code>
-         * wfMsg( 'message', $wgLang->formatNum( $num ) )
+         * wfMessage( 'message' )->numParams( $num )->text()
          * </code>
          *
          * See LanguageGu.php for the Gujarati implementation and
@@ -2992,6 +2997,7 @@ class Language {
         * Take a list of strings and build a locale-friendly comma-separated
         * list, using the local comma-separator message.
         * The last two strings are chained with an "and".
+        * NOTE: This function will only work with standard numeric array keys (0, 1, 2…)
         *
         * @param $l Array
         * @return string
@@ -2999,7 +3005,10 @@ class Language {
        function listToText( array $l ) {
                $s = '';
                $m = count( $l ) - 1;
-               if ( $m == 1 ) {
+               
+               if ( $m === 0 ) {
+                       return $l[0];
+               } elseif ( $m === 1 ) {
                        return $l[0] . $this->getMessageFromDB( 'and' ) . $this->getMessageFromDB( 'word-separator' ) . $l[1];
                } else {
                        for ( $i = $m; $i >= 0; $i-- ) {
@@ -3023,10 +3032,7 @@ class Language {
         */
        function commaList( array $list ) {
                return implode(
-                       wfMsgExt(
-                               'comma-separator',
-                               array( 'parsemag', 'escapenoentities', 'language' => $this )
-                       ),
+                       wfMessage( 'comma-separator' )->inLanguage( $this )->escaped(),
                        $list
                );
        }
@@ -3039,10 +3045,7 @@ class Language {
         */
        function semicolonList( array $list ) {
                return implode(
-                       wfMsgExt(
-                               'semicolon-separator',
-                               array( 'parsemag', 'escapenoentities', 'language' => $this )
-                       ),
+                       wfMessage( 'semicolon-separator' )->inLanguage( $this )->escaped(),
                        $list
                );
        }
@@ -3054,10 +3057,7 @@ class Language {
         */
        function pipeList( array $list ) {
                return implode(
-                       wfMsgExt(
-                               'pipe-separator',
-                               array( 'escapenoentities', 'language' => $this )
-                       ),
+                       wfMessage( 'pipe-separator' )->inLanguage( $this )->escaped(),
                        $list
                );
        }
@@ -3082,7 +3082,7 @@ class Language {
        function truncate( $string, $length, $ellipsis = '...', $adjustLength = true ) {
                # Use the localized ellipsis character
                if ( $ellipsis == '...' ) {
-                       $ellipsis = wfMsgExt( 'ellipsis', array( 'escapenoentities', 'language' => $this ) );
+                       $ellipsis = wfMessage( 'ellipsis' )->inLanguage( $this )->escaped();
                }
                # Check if there is no need to truncate
                if ( $length == 0 ) {
@@ -3180,7 +3180,7 @@ class Language {
        function truncateHtml( $text, $length, $ellipsis = '...' ) {
                # Use the localized ellipsis character
                if ( $ellipsis == '...' ) {
-                       $ellipsis = wfMsgExt( 'ellipsis', array( 'escapenoentities', 'language' => $this ) );
+                       $ellipsis = wfMessage( 'ellipsis' )->inLanguage( $this )->escaped();
                }
                # Check if there is clearly no need to truncate
                if ( $length <= 0 ) {
@@ -3409,9 +3409,9 @@ class Language {
                if ( !count( $forms ) ) {
                        return '';
                }
-               $forms = $this->preConvertPlural( $forms, 2 );
-
-               return ( $count == 1 ) ? $forms[0] : $forms[1];
+               $pluralForm = $this->getPluralForm( $count );
+               $pluralForm = min( $pluralForm, count( $forms ) - 1 );
+               return $forms[$pluralForm];
        }
 
        /**
@@ -3907,12 +3907,13 @@ class Language {
        /**
         * Decode an expiry (block, protection, etc) which has come from the DB
         *
-        * @FIXME: why are we returnings DBMS-dependent strings???
+        * @todo FIXME: why are we returnings DBMS-dependent strings???
         *
         * @param $expiry String: Database expiry String
         * @param $format Bool|Int true to process using language functions, or TS_ constant
         *     to return the expiry in a given timestamp
         * @return String
+        * @since 1.18
         */
        public function formatExpiry( $expiry, $format = true ) {
                static $infinity, $infinityMsg;
@@ -4106,7 +4107,7 @@ class Language {
                $dirmark = ( $oppositedm ? $this->getDirMark( true ) : '' ) .
                        $this->getDirMark();
                $details = $details ? $dirmark . $this->getMessageFromDB( 'word-separator' ) .
-                       wfMsgExt( 'parentheses', array( 'escape', 'replaceafter', 'language' => $this ), $details ) : '';
+                       wfMessage( 'parentheses' )->rawParams( $details )->inLanguage( $this )->escaped() : '';
                return $page . $details;
        }
 
@@ -4179,4 +4180,34 @@ class Language {
        public function getConvRuleTitle() {
                return $this->mConverter->getConvRuleTitle();
        }
+
+       /**
+        * Get the compiled plural rules for the language
+        * @since 1.20
+        * @return array Associative array with plural form, and plural rule as key-value pairs
+        */
+       public function getCompiledPluralRules() {
+               return self::$dataCache->getItem( strtolower( $this->mCode ), 'compiledPluralRules' );
+       }
+
+       /**
+        * Get the plural rules for the language
+        * @since 1.20
+        * @return array Associative array with plural form, and plural rule as key-value pairs
+        */
+       public function getPluralRules() {
+               return self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRules' );
+       }
+
+       /**
+        * Find the plural form matching to the given number
+        * It return the form index.
+        * @return int The index of the plural form
+        */
+       private function getPluralForm( $number ) {
+               $pluralRules = $this->getCompiledPluralRules();
+               $form = CLDRPluralRuleEvaluator::evaluateCompiled( $number, $pluralRules );
+               return $form;
+       }
+
 }
index 18d1dbc..8b7d6cb 100644 (file)
  * @maintainers fdcn <fdcn64@gmail.com>, shinjiman <shinjiman@gmail.com>, PhiLiP <philip.npc@gmail.com>
  */
 class LanguageConverter {
+
+       /**
+        * languages supporting variants
+        * @since 1.20
+        * @var array
+        */
+       static public $languagesWithVariants = array(
+               'gan',
+               'iu',
+               'kk',
+               'ku',
+               'shi',
+               'sr',
+               'tg',
+               'uz',
+               'zh',
+       );
+
        var $mMainLanguageCode;
        var $mVariants, $mVariantFallbacks, $mVariantNames;
        var $mTablesLoaded = false;
@@ -277,7 +295,7 @@ class LanguageConverter {
                        // We record these fallback variants, and process
                        // them later.
                        $fallbacks = $this->getVariantFallbacks( $language );
-                       if ( is_string( $fallbacks ) ) {
+                       if ( is_string( $fallbacks ) && $fallbacks !== $this->mMainLanguageCode ) {
                                $fallbackLanguages[] = $fallbacks;
                        } elseif ( is_array( $fallbacks ) ) {
                                $fallbackLanguages =
@@ -669,8 +687,8 @@ class LanguageConverter {
                                                $inner .= '-{';
                                                if ( !$warningDone ) {
                                                        $inner .= '<span class="error">' .
-                                                               wfMsgForContent( 'language-converter-depth-warning',
-                                                                       $this->mMaxDepth ) .
+                                                               wfMessage( 'language-converter-depth-warning' )
+                                                                       ->numParams( $this->mMaxDepth )->inContentLanguage()->text() .
                                                                '</span>';
                                                        $warningDone = true;
                                                }
@@ -1097,7 +1115,6 @@ class LanguageConverter {
 class ConverterRule {
        var $mText; // original text in -{text}-
        var $mConverter; // LanguageConverter object
-       var $mManualCodeError = '<strong class="error">code error!</strong>';
        var $mRuleDisplay = '';
        var $mRuleTitle = false;
        var $mRules = '';// string : the text of the rules
@@ -1473,7 +1490,9 @@ class ConverterRule {
                        }
                }
                if ( $this->mRuleDisplay === false ) {
-                       $this->mRuleDisplay = $this->mManualCodeError;
+                       $this->mRuleDisplay = '<span class="error">'
+                               . wfMessage( 'converter-manual-rule-error' )->inContentLanguage()->escaped()
+                               . '</span>';
                }
 
                $this->generateConvTable();
index 06ef711..8f158a4 100644 (file)
        'arz' => 'مصرى',    # Egyptian Spoken Arabic
        'as' => 'অসমীয়া',   # Assamese
        'ast' => 'asturianu',   # Asturian
-       'av' => 'Ð\90вар',     # Avar
+       'av' => 'авар',     # Avar
        'avk' => 'Kotava', # Kotava
        'ay' => 'Aymar aru',    # Aymara
        'az' => 'azərbaycanca',        # Azerbaijani
-       'ba' => 'Ð\91ашҡортса',   # Bashkir
+       'ba' => 'башҡортса',   # Bashkir
        'bar' => 'Boarisch',    # Bavarian (Austro-Bavarian and South Tyrolean)
-       'bat-smg' => 'Žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
+       'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
        'bcc' => 'بلوچی مکرانی', # Southern Balochi
        'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
        'be' => 'беларуская', #  Belarusian normative
-       'be-tarask' => "\xE2\x80\xAAÐ\91еларуская (тарашкевіца)\xE2\x80\xAC", # Belarusian in Taraskievica orthography
-       'be-x-old' => "\xE2\x80\xAAÐ\91еларуская (тарашкевіца)\xE2\x80\xAC",  # Belarusian in Taraskievica orthography; compat link
+       'be-tarask' => "\xE2\x80\xAAбеларуская (тарашкевіца)\xE2\x80\xAC", # Belarusian in Taraskievica orthography
+       'be-x-old' => "\xE2\x80\xAAбеларуская (тарашкевіца)\xE2\x80\xAC",  # Belarusian in Taraskievica orthography; compat link
        'bg' => 'български',   # Bulgarian
        'bh' => 'भोजपुरी',        # Bihari macro language. Falls back to Bhojpuri (bho). The name actually says "Bhojpuri".
        'bho' => 'भोजपुरी',       # Bhojpuri
        'brh' => 'Bráhuí',    # Brahui
        'bs' => 'bosanski',             # Bosnian
        'bug' => 'ᨅᨔ ᨕᨘᨁᨗ', # Buginese
-       'bxr' => 'Ð\91уряад',        # Buryat (Russia)
+       'bxr' => 'буряад',        # Buryat (Russia)
        'ca' => 'català',      # Catalan
        'cbk-zam' => 'Chavacano de Zamboanga',  # Zamboanga Chavacano
        'cdo' => 'Mìng-dĕ̤ng-ngṳ̄',       # Min Dong
-       'ce' => 'Ð\9dохчийн',       # Chechen
+       'ce' => 'нохчийн',       # Chechen
        'ceb' => 'Cebuano',     # Cebuano
        'ch' => 'Chamoru',              # Chamorro
        'cho' => 'Choctaw',             # Choctaw
        'co' => 'corsu',                # Corsican
        'cps' => 'Capiceño', # Capiznon
        'cr' => 'Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ',                # Cree
-       'crh' => 'Qırımtatarca',   # Crimean Tatar (multiple scripts - defaults to Latin)
-       'crh-latn' => "\xE2\x80\xAAQırımtatarca (Latin)\xE2\x80\xAC",       # Crimean Tatar (Latin)
-       'crh-cyrl' => "\xE2\x80\xAAÐ\9aъырымтатарджа (Кирилл)\xE2\x80\xAC",       # Crimean Tatar (Cyrillic)
+       'crh' => 'qırımtatarca',   # Crimean Tatar (multiple scripts - defaults to Latin)
+       'crh-latn' => "\xE2\x80\xAAqırımtatarca (Latin)\xE2\x80\xAC",       # Crimean Tatar (Latin)
+       'crh-cyrl' => "\xE2\x80\xAAкъырымтатарджа (Кирилл)\xE2\x80\xAC",       # Crimean Tatar (Cyrillic)
        'cs' => 'česky',       # Czech
-       'csb' => 'Kaszëbsczi', # Cassubian
-       'cu' => 'Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ',      # Old Church Slavonic (ancient language)
+       'csb' => 'kaszëbsczi', # Cassubian
+       'cu' => 'словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ',      # Old Church Slavonic (ancient language)
        'cv' => 'Чӑвашла',       # Chuvash
        'cy' => 'Cymraeg',              # Welsh
        'da' => 'dansk',                # Danish
        'de-ch' => 'Schweizer Hochdeutsch',             # Swiss Standard German
        'de-formal' => "\xE2\x80\xAADeutsch (Sie-Form)\xE2\x80\xAC",            # German - formal address ("Sie")
        'diq' => 'Zazaki',              # Zazaki
-       'dsb' => 'Dolnoserbski', # Lower Sorbian
+       'dsb' => 'dolnoserbski', # Lower Sorbian
        'dtp' => 'Dusun Bundu-liwan', # Central Dusun
        'dv' => 'ދިވެހިބަސް',         # Dhivehi
        'dz' => 'ཇོང་ཁ',              # Dzongkha (Bhutan)
        'ee' => 'eʋegbe',      # Éwé
+       'egl' => 'Emiliàn',    # Emilian
        'el' => 'Ελληνικά',     # Greek
        'eml' => 'emiliàn e rumagnòl',        # Emiliano-Romagnolo / Sammarinese
        'en' => 'English',              # English
        'hil' => 'Ilonggo',     # Hiligaynon
        'ho' => 'Hiri Motu',    # Hiri Motu
        'hr' => 'hrvatski',             # Croatian
-       'hsb' => 'Hornjoserbsce',       # Upper Sorbian
+       'hsb' => 'hornjoserbsce',       # Upper Sorbian
        'ht'  => 'Kreyòl ayisyen',             # Haitian Creole French
        'hu' => 'magyar',               # Hungarian
        'hy' => 'Հայերեն',       # Armenian
        'ki' => 'Gĩkũyũ',    # Gikuyu
        'kiu' => 'Kırmancki',  # Kirmanjki
        'kj' => 'Kwanyama',     # Kwanyama
-       'kk' => 'Ò\9aазақша',       # Kazakh (multiple scripts - defaults to Cyrillic)
+       'kk' => 'Ò\9bазақша',       # Kazakh (multiple scripts - defaults to Cyrillic)
        'kk-arab' => "\xE2\x80\xABقازاقشا (تٴوتە)\xE2\x80\xAC",     # Kazakh Arabic
-       'kk-cyrl' => "\xE2\x80\xAAÒ\9aазақша (кирил)\xE2\x80\xAC",     # Kazakh Cyrillic
-       'kk-latn' => "\xE2\x80\xAAQazaqşa (latın)\xE2\x80\xAC",       # Kazakh Latin
+       'kk-cyrl' => "\xE2\x80\xAAÒ\9bазақша (кирил)\xE2\x80\xAC",     # Kazakh Cyrillic
+       'kk-latn' => "\xE2\x80\xAAqazaqşa (latın)\xE2\x80\xAC",       # Kazakh Latin
        'kk-cn' => "\xE2\x80\xABقازاقشا (جۇنگو)\xE2\x80\xAC",       # Kazakh (China)
-       'kk-kz' => "\xE2\x80\xAAÒ\9aазақша (Қазақстан)\xE2\x80\xAC",       # Kazakh (Kazakhstan)
-       'kk-tr' => "\xE2\x80\xAAQazaqşa (Türkïya)\xE2\x80\xAC",      # Kazakh (Turkey)
+       'kk-kz' => "\xE2\x80\xAAÒ\9bазақша (Қазақстан)\xE2\x80\xAC",       # Kazakh (Kazakhstan)
+       'kk-tr' => "\xE2\x80\xAAqazaqşa (Türkïya)\xE2\x80\xAC",      # Kazakh (Turkey)
        'kl' => 'kalaallisut',  # Inuktitut, Greenlandic/Greenlandic/Kalaallisut (kal)
        'km' => 'ភាសាខ្មែរ',  # Khmer, Central
        'kn' => 'ಕನ್ನಡ',      # Kannada
        'ko-kp' => '한국어 (조선)',        # Korean (DPRK)
        'koi' => 'Перем Коми', # Komi-Permyak
        'kr' => 'Kanuri',               # Kanuri, Central
-       'krc' => 'Ð\9aÑ\8aаÑ\80аÑ\87ай-Ð\9cалкъар', # Karachay-Balkar
+       'krc' => 'кÑ\8aаÑ\80аÑ\87ай-малкъар', # Karachay-Balkar
        'kri' => 'Krio', # Krio
        'krj' => 'Kinaray-a', # Kinaray-a
        'ks' => 'कॉशुर / کٲشُر', # Kashmiri (multiple scripts - defaults to Perso-Arabic)
        'ku'  => 'Kurdî',      # Kurdish (multiple scripts - defaults to Latin)
        'ku-latn' => "\xE2\x80\xAAKurdî (latînî)\xE2\x80\xAC",       # Northern Kurdish (Latin script)
        'ku-arab' => "\xE2\x80\xABكوردي (عەرەبی)\xE2\x80\xAC",       # Northern Kurdish (Arabic script) (falls back to ckb)
-       'kv' => 'Ð\9aоми',     # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
+       'kv' => 'коми',     # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
        'kw' => 'kernowek',             # Cornish
        'ky' => 'Кыргызча',     # Kirghiz
        'la' => 'Latina',               # Latin
        'lad' => 'Ladino',      # Ladino
        'lb' => 'Lëtzebuergesch',      # Luxemburguish
-       'lbe' => 'Ð\9bакку',  # Lak
-       'lez' => 'Ð\9bезги',  # Lezgi
+       'lbe' => 'лакку',  # Lak
+       'lez' => 'лезги',  # Lezgi
        'lfn' => 'Lingua Franca Nova',  # Lingua Franca Nova
        'lg' => 'Luganda',              # Ganda
        'li' => 'Limburgs',     # Limburgian
        'lzz' => 'Lazuri',      # Laz
        'mai' => 'मैथिली', # Maithili
        'map-bms' => 'Basa Banyumasan', # Banyumasan
-       'mdf' => 'Ð\9cокшень',              # Moksha
+       'mdf' => 'мокшень',              # Moksha
        'mg' => 'Malagasy',             # Malagasy
        'mh' => 'Ebon',                 # Marshallese
-       'mhr' => 'Ð\9eлÑ\8bк Ð\9cарий', # Eastern Mari
+       'mhr' => 'олÑ\8bк Ð¼арий', # Eastern Mari
        'mi' => 'Māori',       # Maori
        'min' => 'Baso Minangkabau',    # Minangkabau
        'mk' => 'македонски', # Macedonian
        'mn' => 'монгол', # Halh Mongolian (Cyrillic) (ISO 639-3: khk)
        'mo' => 'молдовеняскэ',     # Moldovan, deprecated
        'mr' => 'मराठी',      # Marathi
-       'mrj' => 'Ð\9aырык мары', # Hill Mari
+       'mrj' => 'кырык мары', # Hill Mari
        'ms' => 'Bahasa Melayu',        # Malay
        'mt' => 'Malti',        # Maltese
        'mus' => 'Mvskoke',     # Muskogee/Creek
        'mwl' => 'Mirandés',   # Mirandese
        'my' => 'မြန်မာဘာသာ',               # Burmese
-       'myv' => 'Эрзянь',        # Erzya
+       'myv' => 'эрзянь',        # Erzya
        'mzn' => 'مازِرونی',            # Mazanderani
        'na' => 'Dorerin Naoero',               # Nauruan
        'nah' => 'Nāhuatl',            # Nahuatl, en:Wikipedia writes Nahuatlahtolli, while another form is Náhuatl
        'roa-rup' => 'Armãneashce', # Aromanian (deprecated code, 'rup' exists in ISO 693-3)
        'roa-tara' => 'tarandíne',     # Tarantino
        'ru' => 'русский',       # Russian
-       'rue' => 'Русиньскый',        # Rusyn
+       'rue' => 'русиньскый',        # Rusyn
        'rup' => 'Armãneashce', # Aromanian
        'ruq' => 'Vlăheşte',  # Megleno-Romanian (multiple scripts - defaults to Latin)
        'ruq-cyrl' => 'Влахесте',       # Megleno-Romanian (Cyrillic script)
        'se' => 'sámegiella',  # Northern Sami
        'sei' => 'Cmique Itom', # Seri
        'sg' => 'Sängö',              # Sango/Sangho
-       'sgs' => 'Žemaitėška', # Samogitian
+       'sgs' => 'žemaitėška', # Samogitian
        'sh' => 'srpskohrvatski / српскохрватски', # Serbocroatian
        'shi' => 'Tašlḥiyt/ⵜⴰⵛⵍⵃⵉⵜ',    # Tachelhit (multiple scripts - defaults to Latin)
        'shi-tfng' => 'ⵜⴰⵛⵍⵃⵉⵜ',    # Tachelhit (Tifinagh script)
        'su' => 'Basa Sunda',   # Sundanese
        'sv' => 'svenska',              # Swedish
        'sw' => 'Kiswahili',    # Swahili
-       'szl' => 'Å\9alůnski',   # Silesian
+       'szl' => 'Å\9blůnski',   # Silesian
        'ta' => 'தமிழ்',      # Tamil
        'tcy' => 'ತುಳು', # Tulu
        'te' => 'తెలుగు',   # Telugu
        'tokipona' => 'Toki Pona',      # Toki Pona
        'tpi' => 'Tok Pisin',   # Tok Pisin
        'tr' => 'Türkçe',     # Turkish
+       'tru' => 'Ṫuroyo', # Turoyo
        'ts' => 'Xitsonga',             # Tsonga
        'tt' => 'татарча/tatarça',      # Tatar (multiple scripts - defaults to Cyrillic)
        'tt-cyrl' => 'татарча',  # Tatar (Cyrillic script) (default)
        'tum' => 'chiTumbuka',  # Tumbuka
        'tw' => 'Twi',                  # Twi, (FIXME!)
        'ty' => 'Reo Mā`ohi',  # Tahitian
-       'tyv' => 'Тыва дыл',     # Tyvan
-       'udm' => 'Удмурт',        # Udmurt
+       'tyv' => 'тыва дыл',     # Tyvan
+       'udm' => 'удмурт',        # Udmurt
        'ug' => 'ئۇيغۇرچە / Uyghurche', # Uyghur (multiple scripts - defaults to Arabic)
        'ug-arab' => 'ئۇيغۇرچە', # Uyghur (Arabic script) (default)
        'ug-latn' => 'Uyghurche', # Uyghur (Latin script)
        'uk' => 'українська', # Ukrainian
        'ur' => 'اردو',     # Urdu
-       'uz' => 'Oʻzbekcha',   # Uzbek
+       'uz' => 'oʻzbekcha',   # Uzbek
        've' => 'Tshivenda',            # Venda
        'vec' => 'vèneto',     # Venetian
-       'vep' => 'Vepsän kel’',      # Veps
+       'vep' => 'vepsän kel’',      # Veps
        'vi' => 'Tiếng Việt',       # Vietnamese
        'vls' => 'West-Vlams', # West Flemish
        'vmf' => 'Mainfränkisch', # Upper Franconian, Main-Franconian
        'war' => 'Winaray', # Waray-Waray
        'wo' => 'Wolof',                # Wolof
        'wuu' => '吴语',              # Wu Chinese
-       'xal' => 'Хальмг',                # Kalmyk-Oirat (Kalmuk, Kalmuck, Kalmack, Qalmaq, Kalmytskii Jazyk, Khal:mag, Oirat, Volga Oirat, European Oirat, Western Mongolian)
+       'xal' => 'хальмг',                # Kalmyk-Oirat (Kalmuk, Kalmuck, Kalmack, Qalmaq, Kalmytskii Jazyk, Khal:mag, Oirat, Volga Oirat, European Oirat, Western Mongolian)
        'xh' => 'isiXhosa',             # Xhosan
        'xmf' => 'მარგალური', # Mingrelian
        'yi' => 'ייִדיש', # Yiddish
diff --git a/languages/classes/LanguageAm.php b/languages/classes/LanguageAm.php
deleted file mode 100644 (file)
index 4c39c26..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Amharic (አማርኛ) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Amharic (አማርኛ)
- *
- * @ingroup Language
- */
-class LanguageAm extends Language {
-       /**
-        * Use singular form for zero
-        *
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 2 );
-
-               return ( $count <= 1 ) ? $forms[0] : $forms[1];
-       }
-}
index cc6b85c..553ff07 100644 (file)
  */
 class LanguageAr extends Language {
 
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 6 );
-
-               if ( $count == 0 ) {
-                       $index = 0;
-               } elseif ( $count == 1 ) {
-                       $index = 1;
-               } elseif ( $count == 2 ) {
-                       $index = 2;
-               } elseif ( $count % 100 >= 3 && $count % 100 <= 10 ) {
-                       $index = 3;
-               } elseif ( $count % 100 >= 11 && $count % 100 <= 99 ) {
-                       $index = 4;
-               } else {
-                       $index = 5;
-               }
-               return $forms[$index];
-       }
-
        /**
         * Temporary hack for bug 9413: replace Arabic presentation forms with their
         * standard equivalents.
diff --git a/languages/classes/LanguageBe.php b/languages/classes/LanguageBe.php
deleted file mode 100644 (file)
index b5b5966..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/**
- * Belarusian normative (Беларуская мова) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
- * @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
- * @ingroup Language
- */
-
-/**
- * Belarusian normative (Беларуская мова)
- *
- * This is still the version from Be-x-old, only duplicated for consistency of
- * plural and grammar functions. If there are errors please send a patch.
- *
- * @ingroup Language
- * @see http://be.wikipedia.org/wiki/Talk:LanguageBe.php
- */
-class LanguageBe extends Language {
-
-       /**
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               // @todo FIXME: CLDR defines 4 plural forms instead of 3
-               //        http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
-               $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 2:
-                               case 3:
-                               case 4:  return $forms[1];
-                               default: return $forms[2];
-                       }
-               }
-       }
-}
diff --git a/languages/classes/LanguageBh.php b/languages/classes/LanguageBh.php
deleted file mode 100644 (file)
index 0eaf2ff..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Bihari (भोजपुरी) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Bihari (भोजपुरी)
- *
- * @ingroup Language
- */
-class LanguageBh extends Language {
-       /**
-        * Use singular form for zero
-        *
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 2 );
-
-               return ( $count <= 1 ) ? $forms[0] : $forms[1];
-       }
-}
index 0929641..3da7711 100644 (file)
  */
 class LanguageBs extends Language {
 
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 3 );
-
-               // @todo FIXME: CLDR defines 4 plural forms instead of 3. Plural for decimals is missing.
-               //        http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
-               if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
-                       return $forms[2];
-               } else {
-                       switch ( $count % 10 ) {
-                               case 1:  return $forms[0];
-                               case 2:
-                               case 3:
-                               case 4:  return $forms[1];
-                               default: return $forms[2];
-                       }
-               }
-       }
 
        /**
         * Convert from the nominative form of a noun to some other case
diff --git a/languages/classes/LanguageCs.php b/languages/classes/LanguageCs.php
deleted file mode 100644 (file)
index 49c4756..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-/**
- * Czech (čeština [subst.], český [adj.], česky [adv.]) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Czech (čeština [subst.], český [adj.], česky [adv.])
- *
- * @ingroup Language
- */
-class LanguageCs extends Language {
-
-       /**
-        * Plural transformations
-        * Invoked by putting
-        * {{plural:count|form1|form2-4|form0,5+}} for two forms plurals
-        * {{plural:count|form1|form0,2+}} for single form plurals
-        * in a message
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 3 );
-
-               switch ( $count ) {
-                       case 1:
-                               return $forms[0];
-                       case 2:
-                       case 3:
-                       case 4:
-                               return $forms[1];
-                       default:
-                               return $forms[2];
-               }
-       }
-}
index bfa95cf..2016a43 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  * @ingroup Language
  */
+
 /**
  * Old Church Slavonic (Ѩзыкъ словѣньскъ)
  *
diff --git a/languages/classes/LanguageCy.php b/languages/classes/LanguageCy.php
deleted file mode 100644 (file)
index 9c28279..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/**
- * Welsh (Cymraeg) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Niklas Laxström
- * @ingroup Language
- */
-
-/**
- * Welsh (Cymraeg)
- *
- * @ingroup Language
- */
-class LanguageCy extends Language {
-
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-
-               $forms = $this->preConvertPlural( $forms, 6 );
-               $count = abs( $count );
-               if ( $count >= 0 && $count <= 3 ) {
-                       return $forms[$count];
-               } elseif ( $count == 6 ) {
-                       return $forms[4];
-               } else {
-                       return $forms[5];
-               }
-       }
-}
index b8ed7fc..975157f 100644 (file)
@@ -54,21 +54,4 @@ class LanguageDsb extends Language {
                return $word; # this will return the original value for 'nominatiw' (nominativ) and all undefined case values
        }
 
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 4 );
-
-               switch ( abs( $count ) % 100 ) {
-                       case 1:  return $forms[0]; // singular
-                       case 2:  return $forms[1]; // dual
-                       case 3:
-                       case 4:  return $forms[2]; // plural
-                       default: return $forms[3]; // pluralgen
-               }
-       }
 }
diff --git a/languages/classes/LanguageFr.php b/languages/classes/LanguageFr.php
deleted file mode 100644 (file)
index edbe1fb..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * French (Français) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * French (Français)
- *
- * @ingroup Language
- */
-class LanguageFr extends Language {
-       /**
-        * Use singular form for zero (see bug 7309)
-        *
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 2 );
-
-               return ( $count <= 1 ) ? $forms[0] : $forms[1];
-       }
-}
index cb9fa04..2f58384 100644 (file)
@@ -64,24 +64,4 @@ class LanguageGa extends Language {
                return $word;
        }
 
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-
-               // plural forms per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ga
-               $forms = $this->preConvertPlural( $forms, 3 );
-
-               if ( $count == 1 ) {
-                       $index = 0;
-               } elseif ( $count == 2 ) {
-                       $index = 1;
-               } else {
-                       $index = 2;
-               }
-               return $forms[$index];
-       }
 }
index 4fd41cf..14fe928 100644 (file)
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
-require_once( dirname( __FILE__ ) . '/LanguageZh.php' );
+require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once( __DIR__ . '/LanguageZh.php' );
 
 /**
  * @ingroup Language
@@ -58,7 +58,7 @@ class GanConverter extends LanguageConverter {
        }
 
        function loadDefaultTables() {
-               require( dirname( __FILE__ ) . "/../../includes/ZhConversion.php" );
+               require( __DIR__ . "/../../includes/ZhConversion.php" );
                $this->mTables = array(
                        'gan-hans' => new ReplacementArray( $zh2Hans ),
                        'gan-hant' => new ReplacementArray( $zh2Hant ),
diff --git a/languages/classes/LanguageGd.php b/languages/classes/LanguageGd.php
deleted file mode 100644 (file)
index f042b02..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-/**
- * Scots Gaelic (Gàidhlig) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Raimond Spekking
- * @author Niklas Laxström
- * @ingroup Language
- */
-
-/**
- * Scots Gaelic (Gàidhlig)
- *
- * @ingroup Language
- */
-class LanguageGd extends Language {
-
-       /**
-        * Plural form transformations
-        * Based on this discussion: http://translatewiki.net/wiki/Thread:Support/New_plural_rules_for_Scots_Gaelic_(gd)
-        *
-        * $forms[0] - 1
-        * $forms[1] - 2
-        * $forms[2] - 11
-        * $forms[3] - 12
-        * $forms[4] - 3-10, 13-19
-        * $forms[5] - 0, 20, rest
-        *
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 6 );
-
-               $count = abs( $count );
-               if ( $count == 1 ) {
-                       return $forms[0];
-               } elseif ( $count == 2 ) {
-                       return $forms[1];
-               } elseif ( $count == 11 ) {
-                       return $forms[2];
-               } elseif ( $count == 12 ) {
-                       return $forms[3];
-               } elseif ( ($count >= 3 && $count <= 10) || ($count >= 13 && $count <= 19) ) {
-                       return $forms[4];
-               } else {
-                       return $forms[5];
-               }
-       }
-}
index 22be1de..48c0c05 100644 (file)
@@ -68,23 +68,4 @@ class LanguageHe extends Language {
                return $word;
        }
 
-       /**
-        * Gets a number and uses the suited form of the word.
-        *
-        * @param $count Integer: the number of items
-        * @param $forms Array with 3 items: the three plural forms
-        * @return String: the suited form of word
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 3 );
-
-               if ( $count == 1 ) {
-                       return $forms[0]; // Singular
-               } elseif ( $count == 2 ) {
-                       return $forms[2]; // Dual or plural if dual is not provided (filled in preConvertPlural)
-               } else {
-                       return $forms[1]; // Plural
-               }
-       }
 }
index 090d626..9bac5d7 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( __DIR__ . '/../LanguageConverter.php' );
 
 /**
  * Conversion script between Latin and Syllabics for Inuktitut.
index 7eb0b6c..de0f4ff 100644 (file)
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
-require_once( dirname( __FILE__ ) . '/LanguageKk_cyrl.php' );
+require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once( __DIR__ . '/LanguageKk_cyrl.php' );
 
 define( 'KK_C_UC', 'АӘБВГҒДЕЁЖЗИЙКҚЛМНҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ' ); # Kazakh Cyrillic uppercase
 define( 'KK_C_LC', 'аәбвгғдеёжзийкқлмнңоөпрстуұүфхһцчшщъыіьэюя' ); # Kazakh Cyrillic lowercase
@@ -62,7 +62,7 @@ class KkConverter extends LanguageConverter {
        }
 
        function loadDefaultTables() {
-               // require( dirname(__FILE__)."/../../includes/KkConversion.php" );
+               // require( __DIR__."/../../includes/KkConversion.php" );
                // Placeholder for future implementing. Remove variables declarations
                // after generating KkConversion.php
                $kk2Cyrl = array();
index 18c8564..02ec648 100644 (file)
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
-require_once( dirname( __FILE__ ) . '/LanguageKu_ku.php' );
+require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once( __DIR__ . '/LanguageKu_ku.php' );
 
 /**
  * Kurdish converter routines
index ab34440..27c5d64 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( __DIR__ . '/../LanguageConverter.php' );
 
 /**
  * Conversion script between Latin and Tifinagh for Tachelhit.
index 26d6853..4b799f2 100644 (file)
@@ -21,9 +21,9 @@
  * @ingroup Language
  */
 
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
-require_once( dirname( __FILE__ ) . '/LanguageSr_ec.php' );
-require_once( dirname( __FILE__ ) . '/LanguageSr_el.php' );
+require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once( __DIR__ . '/LanguageSr_ec.php' );
+require_once( __DIR__ . '/LanguageSr_el.php' );
 
 /**
  * There are two levels of conversion for Serbian: the script level
index 90d5761..3ec1476 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+require_once( __DIR__ . '/../LanguageConverter.php' );
 
 /**
  * Converts Tajiki to latin orthography
diff --git a/languages/classes/LanguageUz.php b/languages/classes/LanguageUz.php
new file mode 100644 (file)
index 0000000..bd69e30
--- /dev/null
@@ -0,0 +1,137 @@
+<?php
+/**
+ * Uzbek specific code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Language
+ */
+
+require_once( __DIR__ . '/../LanguageConverter.php' );
+
+/**
+ * @ingroup Language
+ */
+class UzConverter extends LanguageConverter {
+       var $toLatin = array(
+               'а' => 'a', 'А' => 'A',
+               'б' => 'b', 'Б' => 'B',
+               'д' => 'd', 'Д' => 'D',
+               'е' => 'e', 'Е' => 'E',
+               'э' => 'e', 'Э' => 'E',
+               'в' => 'v', 'В' => 'V',
+               'х' => 'x', 'Х' => 'X',
+               'ғ' => 'gʻ', 'Ғ' => 'Gʻ',
+               'г' => 'g', 'Г' => 'G',
+               'ҳ' => 'h', 'Ҳ' => 'H',
+               'ж' => 'j', 'Ж' => 'J',
+               'з' => 'z', 'З' => 'Z',
+               'и' => 'i', 'И' => 'I',
+               'к' => 'k', 'К' => 'K',
+               'л' => 'l', 'Л' => 'L',
+               'м' => 'm', 'М' => 'M',
+               'н' => 'n', 'Н' => 'N',
+               'о' => 'o', 'О' => 'O',
+               'п' => 'p', 'П' => 'P',
+               'р' => 'r', 'Р' => 'R',
+               'с' => 's', 'С' => 'S',
+               'т' => 't', 'Т' => 'T',
+               'у' => 'u', 'У' => 'U',
+               'ф' => 'f', 'Ф' => 'F',
+               'ц' => 'c', 'Ц' => 'C',
+               'ў' => 'oʻ', 'Ў' => 'Oʻ',
+               'ц' => 'ts', 'Ц' => 'Ts', // note: at the beginning of a word and right after a consonant, only "s" is used
+               'қ' => 'q', 'Қ' => 'Q',
+               'ё' => 'yo', 'Ё' => 'Yo',
+               'ю' => 'yu', 'Ю' => 'Yu',
+               'ч' => 'ch', 'Ч' => 'Ch',
+               'ш' => 'sh', 'Ш' => 'Sh',
+               'й' => 'y', 'Й' => 'Y',
+               'я' => 'ya', 'Я' => 'Ya',
+               'ъ' => 'ʼ',
+       );
+
+       var $toCyrillic = array(
+               'a' => 'а', 'A' => 'А',
+               'b' => 'б', 'B' => 'Б',
+               'd' => 'д', 'D' => 'Д',
+               'e' => 'е', 'E' => 'Е',
+               ' e' => ' э', ' E' => ' Э', // "э" is used at the beginning of a word instead of "e"
+               'ye' => 'е', 'Ye' => 'Е',
+               'f' => 'ф', 'F' => 'Ф',
+               'g' => 'г', 'G' => 'Г',
+               'g‘' => 'ғ', 'G‘' => 'Ғ', 'gʻ' => 'ғ', 'Gʻ' => 'Ғ',
+               'h'  => 'ҳ', 'H' => 'Ҳ',
+               'i' => 'и', 'I' => 'И',
+               'k'  => 'к', 'K' => 'К',
+               'l' => 'л', 'L' => 'Л',
+               'm' => 'м', 'M' => 'М',
+               'n' => 'н', 'N' => 'Н',
+               'o' => 'о', 'O' => 'О',
+               'p' => 'п', 'P' => 'П',
+               'r' => 'р', 'R' => 'Р',
+               's' => 'с', 'S' => 'С',
+               't' => 'т', 'T' => 'Т',
+               'u' => 'у', 'U' => 'У',
+               'v' => 'в', 'V' => 'В',
+               'x' => 'х', 'X' => 'Х',
+               'z' => 'з', 'Z' => 'З',
+               'j' => 'ж', 'J' => 'Ж',
+               'o‘' => 'ў', 'O‘' => 'Ў', 'oʻ' => 'ў', 'Oʻ' => 'Ў',
+               'yo‘' => 'йў', 'Yo‘' => 'Йў', 'yoʻ' => 'йў', 'Yoʻ' => 'Йў',
+               'ts' => 'ц', 'Ts' => 'Ц',
+               'q' => 'қ', 'Q' => 'Қ',
+               'yo' => 'ё', 'Yo' => 'Ё',
+               'yu' => 'ю', 'Yu' => 'Ю',
+               'ch' => 'ч', 'Ch' => 'Ч',
+               'sh' => 'ш', 'Sh' => 'Ш',
+               'y' => 'й', 'Y' => 'Й',
+               'ya' => 'я', 'Ya' => 'Я',
+               'ʼ' => 'ъ',
+       );
+
+       function loadDefaultTables() {
+               $this->mTables = array(
+                       'uz-cyrl' => new ReplacementArray( $this->toCyrillic ),
+                       'uz-latn' => new ReplacementArray( $this->toLatin ),
+                       'uz'      => new ReplacementArray()
+               );
+       }
+
+}
+
+/**
+ * Uzbek
+ *
+ * @ingroup Language
+ */
+class LanguageUz extends Language {
+       function __construct() {
+               global $wgHooks;
+               parent::__construct();
+
+               $variants = array( 'uz', 'uz-latn', 'uz-cyrl' );
+               $variantfallbacks = array(
+                       'uz'    => 'uz-latn',
+                       'uz-cyrl' => 'uz',
+                       'uz-latn' => 'uz',
+               );
+
+               $this->mConverter = new UzConverter( $this, 'uz', $variants, $variantfallbacks );
+               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+       }
+}
index 96eea7c..63f90fd 100644 (file)
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
-require_once( dirname( __FILE__ ) . '/LanguageZh_hans.php' );
+require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once( __DIR__ . '/LanguageZh_hans.php' );
 
 /**
  * @ingroup Language
@@ -64,7 +64,7 @@ class ZhConverter extends LanguageConverter {
        }
 
        function loadDefaultTables() {
-               require( dirname( __FILE__ ) . "/../../includes/ZhConversion.php" );
+               require( __DIR__ . "/../../includes/ZhConversion.php" );
                $this->mTables = array(
                        'zh-hans' => new ReplacementArray( $zh2Hans ),
                        'zh-hant' => new ReplacementArray( $zh2Hant ),
diff --git a/languages/data/plurals-mediawiki.xml b/languages/data/plurals-mediawiki.xml
new file mode 100644 (file)
index 0000000..54f23dc
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE supplementalData SYSTEM "../../common/dtd/ldmlSupplemental.dtd">
+<supplementalData>
+       <plurals>
+               <pluralRules locales="he">
+                       <pluralRule count="one">n is 1</pluralRule>
+                       <pluralRule count="two">n is 2</pluralRule>
+               </pluralRules>
+               <pluralRules locales="dsb">
+                       <pluralRule count="one">n mod 100 is 1</pluralRule>
+                       <pluralRule count="two">n mod 100 is 2</pluralRule>
+                       <pluralRule count="few">n mod 100 in 3..4</pluralRule>
+               </pluralRules>
+               <pluralRules locales="cu">
+                       <pluralRule count="one">n mod 10 is 1</pluralRule>
+                       <pluralRule count="two">n mod 10 is 2</pluralRule>
+                       <pluralRule count="few">n mod 10 in 3..4</pluralRule>
+               </pluralRules>
+               <!-- Plural form transformations
+               Based on this discussion: http://translatewiki.net/wiki/Thread:Support/New_plural_rules_for_Scots_Gaelic_(gd)
+               $forms[0] - 1
+               $forms[1] - 2
+               $forms[2] - 11
+               $forms[3] - 12
+               $forms[4] - 3-10, 13-19
+               $forms[5] - 0, 20, rest -->
+               <pluralRules locales="gd">
+                       <pluralRule count="one">n is 1</pluralRule>
+                       <pluralRule count="two">n is 2</pluralRule>
+                       <pluralRule count="elevan">n is 11</pluralRule>
+                       <pluralRule count="twelve">n is 12</pluralRule>
+                       <pluralRule count="few">n in 3..10 or n in 13..19</pluralRule>
+               </pluralRules>
+       </plurals>
+</supplementalData>
diff --git a/languages/data/plurals.xml b/languages/data/plurals.xml
new file mode 100644 (file)
index 0000000..8432df4
--- /dev/null
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE supplementalData SYSTEM "../../common/dtd/ldmlSupplemental.dtd">
+<supplementalData>
+    <version number="$Revision: 6155 $"/>
+    <generation date="$Date: 2011-09-21 23:51:12 +0530 (ബു, 21 സെപ് 2011) $"/>
+    <plurals>
+        <!-- if locale is known to have no plurals, there are no rules -->
+        <pluralRules locales="az bm bo dz fa id ig ii hu ja jv ka kde kea km kn ko lo ms my sah ses sg th to tr vi wo yo zh"/>
+        <pluralRules locales="ar">
+            <pluralRule count="zero">n is 0</pluralRule>
+            <pluralRule count="one">n is 1</pluralRule>
+            <pluralRule count="two">n is 2</pluralRule>
+            <pluralRule count="few">n mod 100 in 3..10</pluralRule>
+            <pluralRule count="many">n mod 100 in 11..99</pluralRule>
+        </pluralRules>
+        <pluralRules locales="asa af bem bez bg bn brx ca cgg chr da de dv ee el en eo es et eu fi fo fur fy gl gsw gu ha haw he is it jmc kaj kcg kk kl ksb ku lb lg mas ml mn mr nah nb nd ne nl nn no nr ny nyn om or pa pap ps pt rof rm rwk saq seh sn so sq ss ssy st sv sw syr ta te teo tig tk tn ts ur wae ve vun xh xog zu">
+            <pluralRule count="one">n is 1</pluralRule>
+        </pluralRules>
+        <pluralRules locales="ak am bh fil tl guw hi ln mg nso ti wa">
+            <pluralRule count="one">n in 0..1</pluralRule>
+        </pluralRules>
+        <pluralRules locales="ff fr kab">
+            <pluralRule count="one">n within 0..2 and n is not 2</pluralRule>
+        </pluralRules>
+        <pluralRules locales="lv">
+            <pluralRule count="zero">n is 0</pluralRule>
+            <pluralRule count="one">n mod 10 is 1 and n mod 100 is not 11</pluralRule>
+        </pluralRules>
+        <pluralRules locales="iu kw naq se sma smi smj smn sms">
+            <pluralRule count="one">n is 1</pluralRule>
+            <pluralRule count="two">n is 2</pluralRule>
+        </pluralRules>
+        <pluralRules locales="ga"> <!-- http://unicode.org/cldr/trac/ticket/3915 -->
+            <pluralRule count="one">n is 1</pluralRule>
+            <pluralRule count="two">n is 2</pluralRule>
+            <pluralRule count="few">n in 3..6</pluralRule>
+            <pluralRule count="many">n in 7..10</pluralRule>
+        </pluralRules>
+        <pluralRules locales="ro mo">
+            <pluralRule count="one">n is 1</pluralRule>
+            <pluralRule count="few">n is 0 OR n is not 1 AND n mod 100 in 1..19</pluralRule>
+        </pluralRules>
+        <pluralRules locales="lt">
+            <pluralRule count="one">n mod 10 is 1 and n mod 100 not in 11..19</pluralRule>
+            <pluralRule count="few">n mod 10 in 2..9 and n mod 100 not in 11..19</pluralRule>
+        </pluralRules>
+        <pluralRules locales="be bs hr ru sh sr uk">
+            <pluralRule count="one">n mod 10 is 1 and n mod 100 is not 11</pluralRule>
+            <pluralRule count="few">n mod 10 in 2..4 and n mod 100 not in 12..14</pluralRule>
+            <pluralRule count="many">n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14</pluralRule>
+            <!-- others are fractions -->
+        </pluralRules>
+        <pluralRules locales="cs sk">
+            <pluralRule count="one">n is 1</pluralRule>
+            <pluralRule count="few">n in 2..4</pluralRule>
+        </pluralRules>
+        <pluralRules locales="pl">
+            <pluralRule count="one">n is 1</pluralRule>
+            <pluralRule count="few">n mod 10 in 2..4 and n mod 100 not in 12..14</pluralRule>
+            <pluralRule count="many">n is not 1 and n mod 10 in 0..1 or n mod 10 in 5..9 or n mod 100 in 12..14</pluralRule>
+            <!-- others are fractions -->
+            <!-- and n mod 100 not in 22..24 from Tamplin -->
+        </pluralRules>
+        <pluralRules locales="sl">
+            <pluralRule count="one">n mod 100 is 1</pluralRule>
+            <pluralRule count="two">n mod 100 is 2</pluralRule>
+            <pluralRule count="few">n mod 100 in 3..4</pluralRule>
+        </pluralRules>
+        <pluralRules locales="mt"> <!-- from Tamplin's data -->
+            <pluralRule count="one">n is 1</pluralRule>
+            <pluralRule count="few">n is 0 or n mod 100 in 2..10</pluralRule>
+            <pluralRule count="many">n mod 100 in 11..19</pluralRule>
+        </pluralRules>
+        <pluralRules locales="mk"> <!-- from Tamplin's data -->
+            <pluralRule count="one">n mod 10 is 1 and n is not 11</pluralRule>
+        </pluralRules>
+        <pluralRules locales="cy"> <!-- from http://www.saltcymru.org/wordpress/?p=99&lang=en -->
+            <pluralRule count="zero">n is 0</pluralRule>
+            <pluralRule count="one">n is 1</pluralRule>
+            <pluralRule count="two">n is 2</pluralRule>
+            <pluralRule count="few">n is 3</pluralRule>
+            <pluralRule count="many">n is 6</pluralRule>
+        </pluralRules>
+        <pluralRules locales="lag">
+            <pluralRule count="zero">n is 0</pluralRule>
+            <pluralRule count="one">n within 0..2 and n is not 0 and n is not 2</pluralRule>
+        </pluralRules>
+        <pluralRules locales="shi">
+            <pluralRule count="one">n within 0..1</pluralRule>
+            <pluralRule count="few">n in 2..10</pluralRule>
+        </pluralRules>
+        <pluralRules locales="br"> <!-- from http://unicode.org/cldr/trac/ticket/2886 -->
+            <pluralRule count="one">n mod 10 is 1 and n mod 100 not in 11,71,91</pluralRule>
+            <pluralRule count="two">n mod 10 is 2 and n mod 100 not in 12,72,92</pluralRule>
+            <pluralRule count="few">n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99</pluralRule>
+            <pluralRule count="many">n mod 1000000 is 0 and n is not 0</pluralRule>
+        </pluralRules>
+        <pluralRules locales="ksh">
+            <pluralRule count="zero">n is 0</pluralRule>
+            <pluralRule count="one">n is 1</pluralRule>
+        </pluralRules>
+        <pluralRules locales="tzm">
+            <pluralRule count="one">n in 0..1 or n in 11..99</pluralRule>
+        </pluralRules>
+        <pluralRules locales="gv">
+            <pluralRule count="one">n mod 10 in 1..2 or n mod 20 is 0</pluralRule>
+        </pluralRules>
+        <pluralRules locales="gd">
+            <pluralRule count="one">n in 1,11</pluralRule>
+            <pluralRule count="two">n in 2,12</pluralRule>
+            <pluralRule count="few">n in 3..10,13..19</pluralRule>
+        </pluralRules>
+    </plurals>
+</supplementalData>
index d177278..c6be096 100644 (file)
@@ -74,9 +74,9 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'language'                => array( '0', '#АБЫЗШӘА:', '#ЯЗЫК:', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'цастәи', 'служебная', 'special' ),
-       'index'                   => array( '1', '__АИНДЕКС__', '__ИНДЕКС__', '__INDEX__' ),
+       'language'                  => array( '0', '#АБЫЗШӘА:', '#ЯЗЫК:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'цастәи', 'служебная', 'special' ),
+       'index'                     => array( '1', '__АИНДЕКС__', '__ИНДЕКС__', '__INDEX__' ),
 );
 
 $messages = array(
index 000c8e7..7803258 100644 (file)
@@ -161,25 +161,25 @@ $messages = array(
 'tog-hidepatrolled' => 'Peusom neuandam teupatroli bak neuubah paléng barô',
 'tog-newpageshidepatrolled' => 'Peusom ôn teupatroli nibak dapeuta ôn barô',
 'tog-extendwatchlist' => 'Peuhah dapeuta keunalön keu peuleumah ban dum neuubah, kon nyang paléng barô mantöng',
-'tog-usenewrc' => 'Nguy neuleumah neuubah paléng barô tingkat lanjut (peureulèë JavaScript)',
+'tog-usenewrc' => 'Nguy neuleumah neuubah barô tingkat lanjut (peureulèë JavaScript)',
 'tog-numberheadings' => 'Bôh numbô nan keudroë',
 'tog-showtoolbar' => 'Peuleumah <em>toolbar</em> (bateuëng alat) andam',
-'tog-editondblclick' => 'Andam ôn deungon duagoe klik',
+'tog-editondblclick' => 'Andam ôn ngon duwa go teugon',
 'tog-editsection' => 'Peujeuet andam bideueng rot hubong [andam]',
 'tog-editsectiononrightclick' => 'Peujeuet andam bideueng ngon teugon blah uneun bak nan bideueng (peureulee JavaScript)',
 'tog-showtoc' => 'Peuleumah dapeuta asoe (keu on-on nyang na leubeh nibak 3 boh aneuk ulee)',
 'tog-rememberpassword' => 'Ingat lôn tamong bak peuramban nyoë (keu paleng trep $1 {{PLURAL:$1|uroë|uroë}})',
-'tog-watchcreations' => 'Tamah on-on nyang lonpeugot u dapeuta kalon',
-'tog-watchdefault' => 'Tamah on-on nyang lon-andam u dapeuta kalon',
-'tog-watchmoves' => 'Tamah on-on nyang lonpeupinah u dapeuta kalon',
-'tog-watchdeletion' => 'Tamah on-on nyang lonsampoh u dapeuta kalon',
+'tog-watchcreations' => 'Tamah halaman nyang lonpeugot u dapeuta keunalon',
+'tog-watchdefault' => 'Tamah halaman nyang lon-andam u dapeuta keunalon',
+'tog-watchmoves' => 'Tamah halaman nyang lonpupinah u dapeuta keunalon',
+'tog-watchdeletion' => 'Tamah halaman nyang lonsampoh u dapeuta keunalon',
 'tog-minordefault' => 'Boh tanda mandum neuandam sibagoe neuandam bacut ngon baku',
 'tog-previewontop' => 'Peuleumah hase yoh goh kutak andam',
 'tog-previewonfirst' => 'Peuleumah hase bak neuandam phon',
 'tog-nocache' => 'Pumate pumeugot beun on peuramban nyoe',
 'tog-enotifwatchlistpages' => "Peu'ek surat-e keu lon meunyo saboh halaman nyang lonkalon meuubah",
 'tog-enotifusertalkpages' => "Peu'ek keu lon surat-e meunyo on marit lon meuubah",
-'tog-enotifminoredits' => "Peu'ek cit surat-e keu lon bak neuandam bacut",
+'tog-enotifminoredits' => "Peu'ek cit surat-e keu lon bak neuubah ubit",
 'tog-enotifrevealaddr' => 'Peuleumah alamat surat-e lon bak neubrithee surat-e',
 'tog-shownumberswatching' => 'Peuleumah jumeulah ureueng kalon',
 'tog-oldsig' => 'Tanda jaroe jinoe:',
@@ -199,11 +199,17 @@ $messages = array(
 'tog-watchlisthideanons' => 'Peusöm andam ureuëng nguy hana taturi nibak dapeuta keunalön',
 'tog-watchlisthidepatrolled' => 'Peusom neuandam teukaway bak dapeuta keunalon',
 'tog-ccmeonemails' => "Peu'ek keu lon seunalen surat-e nyang lonpeu'ek keu ureueng la'en",
+'tog-diffonly' => 'Bek peuleumah asoe halaman di yup beunida neuandam',
+'tog-showhiddencats' => 'Peuleumah kawan teusom',
+'tog-norollbackdiff' => "Bek peudeuh beunida 'oh lheueh geupeuriwang",
 
 'underline-always' => 'Sabe',
 'underline-never' => "H'an tom",
+'underline-default' => 'Penjelajah web bawaan',
 
 # Font style option in Special:Preferences
+'editfont-style' => 'Gaya seunurat komputer bak plok andam',
+'editfont-default' => 'Bawaan penjelajah web',
 'editfont-monospace' => 'Seunurat Monospace',
 'editfont-sansserif' => 'Seunurat Sans-serif',
 'editfont-serif' => 'Seunurat Serif',
@@ -269,10 +275,15 @@ $messages = array(
 'hidden-categories' => '{{PLURAL:$1|Kawan teusom|Kawan teusom}}',
 'hidden-category-category' => 'Kawan teusom',
 'category-subcat-count' => '{{PLURAL:$2|Kawan nyoë  cit na saboh yupkawan nyoë.|Kawan nyoë na {{PLURAL:$1|yupkawan|$1 yupkawan}} nyoë, dari ban dum $2.}}',
+'category-subcat-count-limited' => 'Kawan nyoe na {{PLURAL:$1|aneuk kawan|$1 aneuk kawan}} lagee di yup.',
 'category-article-count' => '{{PLURAL:$2|Kawan nyoë cit na saboh ôn nyoë.|Kawan nyoë na  {{PLURAL:$1|ôn|$1 ôn }}, dari ban dum $2.}}',
+'category-article-count-limited' => 'Kawan nyoe na {{PLURAL:$1|saboh halaman|$1 halaman}} lagee di yup.',
 'category-file-count' => '{{PLURAL:$2|Kawan nyoe cit na beureukaih nyoe sagay.|{{PLURAL:$1|beureukaih|$1 beureukaih}} nyoe na lam kawan nyoe, nibak ban dum $2.}}',
+'category-file-count-limited' => 'Kawan nyoe na {{PLURAL:$1|beureukaih|$1 beureukaih}} lagee di yup.',
 'listingcontinuesabbrev' => 'samb.',
+'index-category' => 'On nyang geuindex',
 'noindex-category' => 'On nyang hana geuindex',
+'broken-file-category' => 'On ngon gamba reuloh',
 
 'about' => 'Bhah',
 'article' => 'Teunuléh',
@@ -323,9 +334,11 @@ $messages = array(
 'searcharticle' => 'Jak u',
 'history' => 'Atra u likot',
 'history_short' => 'Atra u likôt',
+'updatedmarker' => 'geuubah yoh seunaweue keuneulheueh lon phon kon',
 'printableversion' => 'Seunalén citak',
 'permalink' => 'Hubông teutap',
 'print' => 'Rakam',
+'view' => 'Beuet',
 'edit' => 'Andam',
 'create' => 'Peugöt',
 'editthispage' => 'Andam ôn nyoë',
@@ -333,6 +346,7 @@ $messages = array(
 'delete' => 'Sampôh',
 'deletethispage' => 'Sampôh ôn nyoe',
 'undelete_short' => 'Bateuë sampôh {{PLURAL:$1|one edit|$1 edits}}',
+'viewdeleted_short' => 'Eu {{PLURAL:$1|saboh neuandam|$1 neuandam}} nyang geusampoh',
 'protect' => 'Peulindông',
 'protect_change' => 'ubah',
 'protectthispage' => 'Peulindong on nyoe',
@@ -348,17 +362,30 @@ $messages = array(
 'talk' => 'Peugah haba',
 'views' => 'Leumah',
 'toolbox' => 'Plôk alat',
+'userpage' => 'Eu on ureueng nguy',
+'projectpage' => 'Eu ôn buët',
+'imagepage' => 'Eu on beureukaih',
+'mediawikipage' => 'Eu on peusan sistem',
+'templatepage' => 'Eu on seunaleuek',
+'viewhelppage' => 'Eu on beunantu',
+'categorypage' => 'Eu ôn kawan',
+'viewtalkpage' => 'Eu on marit',
 'otherlanguages' => 'Bahsa la’én',
 'redirectedfrom' => '(Geupeupinah nibak $1)',
-'redirectpagesub' => 'Ôn peupinah',
+'redirectpagesub' => 'Ôn peuninah',
 'lastmodifiedat' => 'Ôn nyoë keuneulheuëh geu’ubah bak $2, $1.',
+'viewcount' => 'On nyoe ka geusaweue {{PLURAL:$1|sigo|$sigo}}.<br />',
+'protectedpage' => 'Ôn teupeulindông',
 'jumpto' => 'Langsông u:',
 'jumptonavigation' => 'navigasi',
 'jumptosearch' => 'mita',
+'pool-timeout' => 'Liwat watee preh gunci',
+'pool-queuefull' => 'Seunapat neupreh peunoh',
+'pool-errorunknown' => 'Salah hana meukon',
 
 # 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' => 'Bhah {{SITENAME}}',
-'aboutpage' => 'Project:Bhah Ôn',
+'aboutsite' => 'Bhaih {{SITENAME}}',
+'aboutpage' => 'Project:Bhaih',
 'copyright' => 'Asoë nyang na seusuai ngön $1.',
 'copyrightpage' => '{{ns:project}}:Hak karang',
 'currentevents' => 'Haba barô',
@@ -370,12 +397,16 @@ $messages = array(
 'helppage' => 'Help:Asoë',
 'mainpage' => 'Ôn Keuë',
 'mainpage-description' => 'Ôn Keuë',
+'policy-url' => 'Project:Neuatô',
 'portal' => 'Meusapat',
 'portal-url' => 'Project:Meusapat',
 'privacy' => 'Jaga rahsia',
 'privacypage' => 'Project:Jaga rahsia',
 
 'badaccess' => 'Salah khut/hak tamöng',
+'badaccess-group0' => 'Droeneuh hana geupeuidin keu neupeulaku buet nyang neulakee',
+
+'versionrequired' => 'Peureulee MediaWiki versi $1',
 
 'retrievedfrom' => 'Meurumpok nibak "$1"',
 'youhavenewmessages' => 'Droëneuh   na $1 ($2).',
@@ -487,7 +518,7 @@ Droëneuh geupeusaran keu neutamong sigra, lheuëh nyan neugantoë lageuëm rahs
 'hr_tip' => 'Garéh data',
 
 # Edit pages
-'summary' => 'Reuningkah:',
+'summary' => 'Ehtisa:',
 'subject' => 'Bhah/nan:',
 'minoredit' => 'Nyoë lôn andam bacut',
 'watchthis' => 'Kalön ôn nyoë',
@@ -559,7 +590,7 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'last' => 'akhé',
 'page_first' => 'phôn',
 'page_last' => 'keuneulheuëh',
-'histlegend' => "Piléh duwa teuneugön radiô, lheuëh nyan teugön teuneugön ''peubandéng'' keu peubandéng seunalén. Teugön saboh tanggay keu eu seunalén ôn bak tanggay nyan.<br />(skr) = bida ngön seunalén jinoë, (akhé) = bida ngön seunalén sigohlomjih. '''b''' = andam bacut, '''b''' = andam bot, → = andam bideuëng, ← = reuningkah keudroë",
+'histlegend' => "Piléh duwa teuneugön radiô, lheuëh nyan teugön teuneugön ''peubandéng'' keu peubandéng seunalén. Teugön saboh tanggay keu eu seunalén ôn bak tanggay nyan.<br />(skr) = bida ngön seunalén jinoë, (akhé) = bida ngön seunalén sigohlomjih. '''u''' = andam ubeut, '''b''' = andam bot, → = andam bideuëng, ← = ehtisa keudroë",
 'history-fieldset-title' => 'Jeulajah riwayat away',
 'history-show-deleted' => 'Nyang geusampoh mantong',
 'histfirst' => 'Paléng trép',
@@ -661,6 +692,9 @@ Surat-e droeneuh h'an geupeugah keu ureueng nyan.",
 'nchanges' => '$1 {{PLURAL:$1|neu’ubah|neu’ubah}}',
 'recentchanges' => 'Neuubah barô',
 'recentchanges-legend' => 'Peuniléh neuubah paléng barô',
+'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-label-newpage' => 'Neuandam nyoe jipeugot on baro',
 'recentchanges-label-minor' => 'Nyoe neuandam ubeut',
@@ -1049,7 +1083,7 @@ Hubông teutap keu revisi ôn nyoë',
 'tooltip-compareselectedversions' => 'Ngiëng bida antara duwa curak ôn nyang jipilèh.',
 '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 reuningkah.',
+'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',
 
 # Browsing diffs
index f3413ab..2e2ed5e 100644 (file)
@@ -19,7 +19,7 @@ $messages = array(
 'tog-hidepatrolled' => 'أخف التعديلات المراجعة في أحدث التغييرات',
 'tog-newpageshidepatrolled' => 'أخف الصفحات المراجعة من قائمة الصفحات الجديدة',
 'tog-extendwatchlist' => 'مدد قائمة المراقبة لعرض كل التغييرات، وليس الأحدث فقط',
-'tog-usenewrc' => 'استخدم أحدث التغييرات المحسنة (يتطلب جافاسكربت)',
+'tog-usenewrc' => ')جمّع التعديلات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت',
 'tog-numberheadings' => 'رقم العناوين تلقائيا',
 'tog-showtoolbar' => 'أظهر شريط التحرير (يتطلب جافاسكربت)',
 'tog-editondblclick' => 'عدل الصفحات عند الضغط المزدوج (جافاسكربت)',
@@ -27,17 +27,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'فعل تعديل الأقسام بواسطة كبسة الفأرة اليمين على عناوين الأقسام (جافاسكريبت)',
 'tog-showtoc' => 'اعرض فهرس المحتويات (للصفحات التي تحتوي على أكثر من 3 عناوين)',
 'tog-rememberpassword' => 'تذكر دخولي على هذا المتصفح (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)',
-'tog-watchcreations' => 'أضف الصفحات التي أنشئها إلى قائمة مراقبتي',
-'tog-watchdefault' => 'أضف الصفحات التي أعدلها إلى قائمة مراقبتي',
-'tog-watchmoves' => 'أضف الصفحات التي أنقلها إلى قائمة مراقبتي',
-'tog-watchdeletion' => 'أضف الصفحات التي أحذفها إلى قائمة مراقبتي',
+'tog-watchcreations' => 'أضف الصفحات التي أنشئها والملفات التي أرفعها إلى قائمة مراقبتي.',
+'tog-watchdefault' => 'أضف الصفحات والملفات التي أعدلها إلى قائمة مراقبتي',
+'tog-watchmoves' => 'أضف الصفحات والملفات التي أنقلها إلى قائمة مراقبتي',
+'tog-watchdeletion' => 'أضف الصفحات والملفات التي أحذفها إلى قائمة مراقبتي',
 'tog-minordefault' => 'علم كل التعديلات طفيفة افتراضيا',
 'tog-previewontop' => 'أظهر العرض المسبق قبل صندوق التحرير',
 'tog-previewonfirst' => 'أظهر معاينة مع أول تعديل',
 'tog-nocache' => 'عطّل تخزين المتصفح للصفحة',
-'tog-enotifwatchlistpages' => 'أرسل لي رسالة إلكترونية عندما يتم تغيير صفحة في قائمة مراقبتي',
+'tog-enotifwatchlistpages' => 'أرسل لي رسالة إلكترونية عندما تُغيّر صفحة أو ملف في قائمة مراقبتي',
 'tog-enotifusertalkpages' => 'أرسل لي رسالة إلكترونية عندما تعدل صفحة نقاشي',
-'tog-enotifminoredits' => 'أرسل لي رسالة إلكترونية عن التعديلات الطفيفة للصفحات أيضا',
+'tog-enotifminoredits' => 'أرسل لي رسالة إلكترونية عن التعديلات الطفيفة للصفحات والملفات أيضا',
 'tog-enotifrevealaddr' => 'أظهر عنوان بريدي الإلكتروني في رسائل الإخطار',
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبين',
 'tog-oldsig' => 'التوقيع الحالي:',
@@ -295,19 +295,54 @@ $1',
 'feed-unavailable' => 'التلقيمات غير متوفرة',
 'site-rss-feed' => '$1 تلقيم أر إس إس',
 'site-atom-feed' => '$1 تلقيم أتوم',
+'page-rss-feed' => '"$1" تلقيم أر إس إس',
 'page-atom-feed' => '$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' => "ss'af7a",
 'nstab-user' => 'صفحة مستخدم',
+'nstab-media' => 'صفحة وسيط',
 'nstab-special' => 'صفحة خاصة',
 'nstab-project' => 'صفحة مشروع',
 'nstab-image' => 'milaf (Fichier)',
+'nstab-mediawiki' => 'رسالة',
 'nstab-template' => 'قالب',
+'nstab-help' => 'صفحة مساعدة',
 'nstab-category' => 'تصنيف',
 
+# Main script and global functions
+'nosuchaction' => 'لا يوجد فعل كهذا',
+'nosuchactiontext' => 'الفعل المحدد بواسطة المسار غير صحيح.
+ربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت وصلة غير صحيحة.
+هذا ربما يشير أيضا إلى علة في {{SITENAME}}.',
+'nosuchspecialpage' => 'لا توجد صفحة خاصة بهذا الاسم',
+'nospecialpagetext' => '<strong>لقد طلبت صفحة خاصة غير صحيحة.</strong>
+
+قائمة بالصفحات الخاصة الصحيحة يمكن إيجادها في [[Special:SpecialPages|{{int:specialpages}}]].',
+
 # General errors
+'error' => 'ghalath',
+'databaseerror' => 'خطأ في قاعدة البيانات',
+'dberrortext' => 'حدث خطأ في صيغة استعلام قاعدة البيانات.
+ربما يكون هذا عيب بالبرنامج.
+آخر استعلام طلب من قاعدة البيانات كان:
+<blockquote><tt>$1</tt></blockquote>
+من داخل الدالة "<tt>$2</tt>".
+أرجعت قاعدة البيانات الخطأ "<tt>$3: $4</tt>".',
+'dberrortextcl' => 'حدث خطأ في صيغة استعلام قاعدة البيانات.
+آخر استعلام طلب من قاعدة البيانات كان:
+"$1"
+من داخل الدالة "$2".
+أرجعت قاعدة البيانات الخطأ "$3: $4"',
+'laggedslavemode' => "'''تحذير:''' الصفحة قد لا تحتوي على أحدث التحديثات.",
+'readonly' => 'قاعدة البيانات مغلقة',
+'enterlockreason' => 'أدخل سببا للغلق، متضمنا تقديرا لوقت رفع الغلق',
+'readonlytext' => 'قاعدة البيانات مغلقة حاليا أمام المدخلات الجديدة والتعديلات الأخرى، السبب غالبا ما يكون الصيانة، وستعود قاعدة البيانات للوضع الطبيعي قريبا.
+
+الإداري الذي أغلق قاعدة البيانات أعطى التفسير التالي: $1',
 'missing-article' => 'لم تجد قاعدة البيانات النص الخاص بصفحة كان يجب أن تجدها، واسمها "$1" $2.
 
 عادة ما يحدث هذا عند اتباع فرق قديم أو وصلة تاريخ تؤدي إلى صفحة حذفت.
@@ -315,29 +350,239 @@ $1',
 إذا لم تكن هذه هي الحالة، فالمحتمل أنك وجدت خللا في البرنامج.
 من فضلك أبلغ أحد [[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' => 'faskhan wa9fou flash.
+mahouwech mobarrar',
 'badtitle' => 'عنوان سيء',
 'badtitletext' => 'عنوان الصفحة المطلوب إما غير صحيح أو فارغ، وربما الوصلة بين اللغات أو بين المشاريع خاطئة.
 ومن الممكن وجود رموز لا تصلح للاستخدام في العناوين.',
+'perfcached' => 'البيانات التالية مختزنة وقد لا تكون محدثة. {{PLURAL:$1||نتيجة واحدة|نتيجتان|$1 نتائج|$1 نتيجة}} على الأكثر {{PLURAL:$1||مختزنة|مختزنتان|مختزنة}}.',
+'perfcachedts' => 'البيانات التالية مختزنة وكان آخر تحديث لها في $1. {{PLURAL:$4||نتيجة واحدة|نتيجتان|$4 نتائج|$4 نتيجة}} على الأكثر {{PLURAL:$4||مختزنة|مختزنتان|مختزنة}}.',
+'querypage-no-updates' => 'التحديثات لهذه الصفحة معطلة حاليا.
+البيانات هنا لن يتم تحديثها حاليا.',
+'wrong_wfQuery_params' => 'محددات خاطئة في wfQuery()<br />
+الدالة: $1<br />
+الاستعلام: $2',
 'viewsource' => 'اعرض المصدر',
+'viewsource-title' => 'إظهار مصدر $1',
+'actionthrottled' => 'لا يمكن عمل المزيد من هذا الفعل',
+'actionthrottledtext' => 'كإجراء ضد السبام، أنت ممنوع من إجراء هذا الفعل عدد كبير من المرات في فترة زمنية قصيرة، ولقد تجاوزت هذا الحد.
+من فضلك حاول مرة ثانية خلال عدة دقائق.',
+'protectedpagetext' => 'هذه الصفحة تمت حمايتها لمنع التعديل.',
+'viewsourcetext' => 'يمكنك رؤية ونسخ مصدر هذه الصفحة:',
+'viewyourtext' => "يمكنك رؤية ونسخ مصدر ''' تعديلاتك ''' في هذه الصفحة:",
+'protectedinterface' => 'هذه الصفحة توفر نص الواجهة للبرنامج، وهي مقفلة لمنع التخريب.',
+'editinginterface' => "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.
+سوف تؤثر التغييرات على هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين.
+للترجمات، من فضلك استخدم مشروع ترجمة ميدياويكي [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
+'sqlhidden' => '(استعلام SQL مخفي)',
+'cascadeprotected' => 'تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية "حماية الصفحات المدمجة" {{PLURAL:$1||بها|بهما|بها}}:
+$2',
+'namespaceprotected' => "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
+'customcssprotected' => 'أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.',
+'customjsprotected' => 'أنت لا تمتلك السماح لتعديل صفحة الجافاسكريبت هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.',
+'ns-specialprotected' => 'الصفحات الخاصة لا يمكن تعديلها.',
+'titleprotected' => "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.
+السبب المعطى هو ''$2''.",
+'filereadonlyerror' => 'تعذر تعديل الملف "$1" لأن مستودع الملف "$2" في وضع القراءة فقط. 
+
+المدير الذي قام بغلقه قدم التفسير التالي: "$3".',
+'invalidtitle-knownnamespace' => 'عنوان غير صالح في النطاق «$2» مع نص «$3»',
+'invalidtitle-unknownnamespace' => 'عنوان غير صالح ذو نطاق غير معروف رقم $1 ونص «$2»',
+'exception-nologin' => 'غير مسجل الدخول',
+'exception-nologin-text' => "hedhi ess'af7a wa 2ella el action te7tej mennek bech etloginni il hedha el wiki",
+
+# Virus scanner
+'virus-badscanner' => "ضبط سيء: ماسح فيروسات غير معروف: ''$1''",
+'virus-scanfailed' => 'فشل المسح (كود $1)',
+'virus-unknownscanner' => 'مضاد فيروسات غير معروف:',
 
 # Login and logout pages
+'logouttext' => "'''أنت الآن غير مسجل الدخول.'''
+
+تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو [[Special:UserLogin|الدخول مرة أخرى]] بنفس الاسم أو باسم آخر.
+من الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
+'welcomecreation' => '== مرحبا، $1! ==
+تم إنشاء حسابك.
+لا تنس أن تغير [[Special:Preferences|تفضيلاتك في {{SITENAME}}]].',
 'yourname' => 'اسم المستخدم:',
 'yourpassword' => 'كلمة السر:',
 'yourpasswordagain' => 'أعد كتابة كلمة السر:',
 'remembermypassword' => 'تذكر دخولي على هذا الحاسوب (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)',
+'securelogin-stick-https' => 'ابقَ في اتصال HTTPS بعد الدخول.',
+'yourdomainname' => 'نطاقك:',
+'externaldberror' => 'هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.',
 'login' => 'ادخل',
 'nav-login-createaccount' => 'ادخل / أنشئ حسابا',
 'loginprompt' => 'يجب أن تكون الكوكيز لديك مفعلة لتسجل الدخول إلى {{SITENAME}}.',
 'userlogin' => 'ادخل / أنشئ حسابا',
+'userloginnocreate' => 'دخول',
+'logout' => 'اخرج',
 'userlogout' => 'خروج',
+'notloggedin' => 'غير مسجل الدخول',
 'nologin' => "ألا تمتلك حسابا؟ '''$1'''.",
 'nologinlink' => 'أنشئ حسابا',
 'createaccount' => 'أنشئ حسابا',
 'gotaccount' => "تمتلك حسابا بالفعل؟ '''$1'''.",
 'gotaccountlink' => 'ادخل',
 'userlogin-resetlink' => 'أنسيت بيانات الولوج؟',
+'createaccountmail' => 'بواسطة البريد الإلكتروني',
+'createaccountreason' => 'السبب:',
+'badretype' => 'كلمات السر التي أدخلتها لا تتطابق.',
+'userexists' => 'اسم المستخدم الذي تم إدخاله مستعمل بالفعل.
+الرجاء اختيار اسم مختلف.',
+'loginerror' => 'خطأ في الدخول',
+'createaccounterror' => 'تعذر إنشاء حساب المستخدم: $1',
+'nocookiesnew' => 'تم إنشاء حساب المستخدم، ولكنك لست مسجل الدخول بعد.
+يستخدم {{SITENAME}} كوكيز لتسجيل الدخول.
+لديك الكوكيز معطلة.
+من فضلك فعلها، ثم سجل الدخول باسم المستخدم وكلمة السر الجديدين.',
+'nocookieslogin' => 'يستخدم {{SITENAME}} الكوكيز لتسجيل الدخول.
+الكوكيز معطلة لديك.
+من فضلك فعلها ثم حاول مرة أخرى.',
+'nocookiesfornew' => 'لم يتم إنشاء حساب المستخدم، لأننا لم نستطع تأكيد مصدره. 
+تأكد من أن ملفات تعريف الارتباط (الكوكيز) مفعلة عندك، ثم أعد تحميل الصفحة وحاول مرة أخرى.',
+'noname' => 'لم تحدد اسم مستخدم صحيح.',
+'loginsuccesstitle' => 'تم الدخول بشكل صحيح',
+'loginsuccess' => "'''لقد قمت بتسجيل الدخول ل{{SITENAME}} باسم \"\$1\".'''",
+'nosuchuser' => 'لا يوجد مستخدم بالاسم "$1".
+أسماء المستخدمين حساسة لحالة الحروف.
+تأكد من إملاء الاسم، أو [[Special:UserLogin/signup|قم بإنشاء حساب جديد]].',
+'nosuchusershort' => 'لا يوجد مستخدم باسم $1".
+تأكد من إملاء الاسم.',
+'nouserspecified' => 'يجب عليك تحديد اسم مستخدم.',
+'login-userblocked' => 'هذا المستخدم ممنوع. لا يسمح بالولوج.',
+'wrongpassword' => 'كلمة السر التي أدخلتها غير صحيحة.
+من فضلك حاول مرة أخرى.',
+'wrongpasswordempty' => 'كلمة السر المدخلة كانت فارغة.
+من فضلك حاول مرة أخرى.',
+'passwordtooshort' => 'يجب أن تتكون كلمة السر على الأقل من {{PLURAL:$1|حرف واحد|حرفين|$1 حروف|$1 حرفا|$1 حرف}}.',
+'password-name-match' => 'يجب أن تكون كلمة المرور مختلفة عن اسم المستخدم.',
+'password-login-forbidden' => 'تم منع استخدام اسم المستخدم هذا وكلمة السر.',
 'mailmypassword' => 'أرسل لي كلمة سر جديدة',
+'passwordremindertitle' => 'كلمة سر مؤقتة جديدة ل{{SITENAME}}',
+'passwordremindertext' => 'لقد طلب شخص ما (غالبا أنت، من عنوان الآيبي $1) كلمة سر جديدة ل{{SITENAME}} ($4).
+أنشئت كلمة سر مؤقتة للمستخدم "$2" وجعلت "$3".
+لو أن هذا ما تريده، فعليك أن تقوم بتسجيل الدخول واختيار كلمة سر جديدة الآن.
+سوف تنتهي مدة صلاحية كلمة سرك المؤقتة في غضون {{PLURAL:$5|أقل من يوم واحد|يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}.
+
+إذا كان الذي قام بهذا الطلب شخص آخر أو إذا تذكرت كلمة سرك ولا ترغب  في تغييرها، فبإمكانك أن تتجاهل هذه الرسالة وأن تستمر في استخدام كلمة سرك القديمة.',
+'noemail' => 'لا يوجد عنوان بريد إلكتروني مسجل للمستخدم "$1".',
+'noemailcreate' => 'عليك تقديم عنوان بريد إلكتروني صالح',
+'passwordsent' => 'تم إرسال كلمة سر جديدة إلى عنوان البريد الإلكتروني المسجل للمستخدم "$1".
+من فضلك حاول تسجيل الدخول مرة ثانية بعد استلامها.',
+'blocked-mailpassword' => 'تم منع عنوان الأيبي الخاص بك من التحرير، ولمنع التخريب لا يمكنك أن تستخدم خاصية استرجاع كلمة السر.',
+'eauthentsent' => 'تم إرسال رسالة تأكيد إلكترونية إلى العنوان المسمى.
+حتى ترسل أي رسالة أخرى لذلك الحساب عليك أن تتبع التعليمات الواردة في الرسالة لتأكيد أن هذا الحساب هو لك بالفعل.',
+'throttled-mailpassword' => 'تم بالفعل إرسال تذكير بكلمة السر، في ال{{PLURAL:$1||ساعة الماضية|ساعتين الماضيتين|$1 ساعات الماضية|$1 ساعة الماضية}}.
+لمنع التخريب، سيتم إرسال تذكير واحد كل {{PLURAL:$1||ساعة|ساعتين|$1 ساعات|$1 ساعة}}.',
+'mailerror' => 'خطأ أثناء إرسال البريد: $1',
+'acct_creation_throttle_hit' => 'أنشأ زوار هذه الويكي باستخدام عنوان آيبيك {{PLURAL:$1||حسابا واحدا|حسابين|$1 حسابات|$1 حسابا|$1 حساب}} في اليوم الماضي، وهو الحد الأقصى المسموح به في هذه الفترة الزمنية.
+وكنتيجة لذلك، لن يتمكن الزوار الذين يستخدمون عنوان الأيبي هذا من إنشاء أي حسابات أخرى حاليا.',
+'emailauthenticated' => 'تم تأكيد بريدك الإلكتروني في $2 الساعة $3.',
+'emailnotauthenticated' => 'لم يتم التحقق من بريدك الإلكتروني.
+لن يتم إرسال رسائل لأي من الميزات التالية.',
+'noemailprefs' => 'حدد عنوان بريد إلكتروني في تفضيلاتك لهذه الخصائص لتعمل.',
+'emailconfirmlink' => 'أكد عنوان بريدك الإلكتروني',
+'invalidemailaddress' => 'لا يمكن قبول عنوان البريد الإلكتروني حيث تبدو صيغته خاطئة.
+ضع عنوانا مضبوطا أو أفرغ هذا الحقل.',
+'cannotchangeemail' => 'تغيير عنوان البريد الإلكتروني لهذا الحساب غير ممكن على هذا الويكي',
+'emaildisabled' => 'لا يمكن إرسال رسائل البريد الإلكتروني من هذا الموقع.',
+'accountcreated' => 'تم إنشاء الحساب',
+'accountcreatedtext' => 'تم إنشاء الحساب الخاص ب$1.',
+'createaccount-title' => 'إنشاء حساب في {{SITENAME}}',
+'createaccount-text' => 'شخص ما أنشأ حسابا لعنوان بريدك الإلكتروني في {{SITENAME}} ($4) بالاسم "$2"، كلمة السر "$3".
+ينبغي عليك تسجيل الدخول وتغيير كلمة السر الخاصة بك الآن.
+
+يمكنك تجاهل هذه الرسالة، لو تم إنشاء هذا الحساب بالخطأ.',
+'usernamehasherror' => 'لا يمكن أن يحتوي اسم المستخدم على محارف هاش',
+'login-throttled' => 'لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.
+من فضلك انتظر قبل المحاولة مرة أخرى.',
+'login-abort-generic' => 'لم ينجح ولوجك - إجهاض',
 'loginlanguagelabel' => 'اللغة: $1',
+'suspicious-userlogout' => 'رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.',
+
+# E-mail sending
+'php-mail-error-unknown' => "خطأ غير معروف في وظيفة البريد PHP's mail()",
+'user-mail-no-addy' => 'لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.',
+
+# Change password dialog
+'resetpass' => 'تغيير كلمة السر',
+'resetpass_announce' => 'تم تسجيل دخولك بكلمة سر مؤقتة.
+للدخول بشكل نهائي، يجب عليك ضبط كلمة سر جديدة هنا:',
+'resetpass_header' => 'غير كلمة سر الحساب',
+'oldpassword' => 'كلمة السر القديمة:',
+'newpassword' => 'كلمة السر الجديدة:',
+'retypenew' => 'أعد كتابة كلمة السر الجديدة:',
+'resetpass_submit' => 'ضبط كلمة السر والدخول',
+'resetpass_success' => 'تم تغيير كلمة السر الخاصة بك بنجاح! يتم تسجيل دخولك الآن...',
+'resetpass_forbidden' => 'كلمات السر لا يمكن تغييرها',
+'resetpass-no-info' => 'يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.',
+'resetpass-submit-loggedin' => 'تغيير كلمة السر',
+'resetpass-submit-cancel' => 'ifsa5',
+'resetpass-wrong-oldpass' => 'كلمة سر حالية أو مؤقتة غير صحيحة.
+ربما تكون غيرت كلمة السر الخاصة بك بنجاح أو طلبت كلمة سر مؤقتة جديدة.',
+'resetpass-temp-password' => 'كلمة سر مؤقتة:',
+
+# Special:PasswordReset
+'passwordreset' => 'إعادة ضبط كلمة السر',
+'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتفاصيل حسابك.',
+'passwordreset-legend' => 'إعادة تعيين كلمة السر',
+'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
+'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
+'passwordreset-username' => 'اسم المستخدم:',
+'passwordreset-domain' => 'النطاق:',
+'passwordreset-capture' => 'أأعرض البريد الإلكتروني الناتج؟',
+'passwordreset-capture-help' => 'إذا علّمت هذا الصندوق فسيعرض لك البريد الإلكتروني (الذي يحتوي كلمة سر مؤقتة) وسيرسل أيضا للمستخدم.',
+'passwordreset-email' => 'عنوان البريد الإلكتروني:',
+'passwordreset-emailtitle' => 'تفاصيل حساب {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :
+
+$2
+
+{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}
+من الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .
+إذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.',
+'passwordreset-emailtext-user' => 'احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :
+
+$2
+
+{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}
+من الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .
+إذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.',
+'passwordreset-emailelement' => 'اسم المستخدم: $1
+كلمة السر المؤقتة: $2',
+'passwordreset-emailsent' => 'أرسل بريد إلكتروني تذكيري',
+'passwordreset-emailsent-capture' => 'أرسل بريد إلكتروني تذكيري وهو معروض بالأسفل.',
+'passwordreset-emailerror-capture' => 'ولّد بريد إلكتروني تذكيري وهو معروض بالأسفل لكن فشل إرساله للمستخدم: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'تغيير عنوان البريد الإلكتروني',
+'changeemail-header' => 'تغيير عنوان البريد الإلكتروني للحساب',
+'changeemail-text' => 'أكمل هذا النموذج لتغيير عنوان البريد الإلكتروني. سوف تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.',
+'changeemail-no-info' => 'يجب تسجيل الدخول للوصول إلى هذه الصفحة مباشرة.',
+'changeemail-oldemail' => 'عنوان البريد الإلكتروني الحالي:',
+'changeemail-newemail' => 'عنوان البريد الإلكتروني الجديد:',
+'changeemail-none' => '(لا شيء)',
+'changeemail-submit' => 'غيّر البريد الإلكتروني',
+'changeemail-cancel' => 'ifsa5',
 
 # Edit page toolbar
 'bold_sample' => 'نص غليظ',
@@ -359,31 +604,174 @@ $1',
 
 # Edit pages
 'summary' => 'ملخص:',
+'subject' => 'موضوع/عنوان:',
 'minoredit' => 'هذا تعديل طفيف',
 'watchthis' => 'راقب هذه الصفحة',
 'savearticle' => 'احفظ الصفحة',
 'preview' => 'معاينة',
 'showpreview' => 'أظهر معاينة',
+'showlivepreview' => 'عرض مباشر',
 'showdiff' => 'أظهر التغييرات',
 'anoneditwarning' => "'''تحذير:''' لم تقم بالدخول.
 سيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
+'anonpreviewwarning' => "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
+'missingsummary' => "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.
+إذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
+'missingcommenttext' => 'من فضلك أدخل تعليقا في الأسفل.',
+'missingcommentheader' => "'''تنبيه:''' لم تقم بوضع موضوع/عنوان لهذا التعليق.
+إذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
+'summary-preview' => 'معاينة الملخص:',
+'subject-preview' => 'معاينة للموضوع/العنوان:',
+'blockedtitle' => 'المستخدم ممنوع',
+'blockedtext' => "'''اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.'''
+
+قام بالمنع $1.
+سبب المنع هو: ''$2''.
+
+* بداية المنع: $8
+* انتهاء المنع: $6
+* الممنوع المقصود: $7
+
+يمكنك الاتصال ب$1 أو مع أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.
+لا يمكنك استخدام خاصية 'مراسلة هذا المستخدم' إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.
+عنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.
+من فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
+'autoblockedtext' => 'تم منع عنوان آيبيك تلقائيا لأن مستخدما آخرا ممنوعا بواسطة $1 استخدمه.
+السبب الممنوح هو التالي:
+
+:\'\'$2\'\'
+
+* بداية المنع: $8
+* انتهاء المنع: $6
+* الممنوع المقصود: $7
+
+يمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.
+
+لاحظ أنه لا يمكنك استخدام خاصية "إرسال رسالة لهذا المستخدم" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.
+
+عنوان آيبيك الحالي $3، ورقم المنع #$5.
+من فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.',
+'blockednoreason' => 'لا سبب معطى',
+'whitelistedittext' => 'يجب عليك $1 لتتمكن من تعديل الصفحات.',
+'confirmedittext' => 'يجب عليك تأكيد بريدك الإلكتروني قبل تعديل الصفحات.
+من فضلك اكتب وأكد بريدك الإلكتروني من خلال [[Special:Preferences|تفضيلاتك]].',
+'nosuchsectiontitle' => 'تعذر إيجاد القسم',
+'nosuchsectiontext' => 'لقد حاولت تحرير قسم غير موجود.
+ربما يكون قد تم نقله أو حذفه أثناء مشاهدتك للصفحة.',
+'loginreqtitle' => 'تسجيل الدخول مطلوب',
+'loginreqlink' => 'الولوج',
+'loginreqpagetext' => 'يجب عليك $1 لتشاهد صفحات أخرى.',
+'accmailtitle' => 'تم إرسال كلمة السر.',
+'accmailtext' => "كلمة سر مولدة عشوائيا ل [[User talk:$1|$1]] تم إرسالها إلى $2.
+
+كلمة السر لهذا الحساب الجديد يمكن تغييرها في صفحة ''[[Special:ChangePassword|تغيير كلمة السر]]'' عند تسجيل الدخول.",
 'newarticle' => '(جديد)',
 'newarticletext' => "لقد تبعت وصلة لصفحة لم يتم إنشائها بعد.
 لإنشاء هذه الصفحة ابدأ الكتابة في الصندوق بالأسفل (انظر في [[{{MediaWiki:Helppage}}|صفحة المساعدة]] للمزيد من المعلومات).
 إذا كانت زيارتك لهذه الصفحة بالخطأ، اضغط على زر ''رجوع'' في متصفح الإنترنت لديك.",
+'anontalkpagetext' => "----''هذه صفحة نقاش لمستخدم مجهول لم يقم بإنشاء حساب بعد أو لا يستعمل ذلك الحساب.
+لذا فيجب علينا استعمال رقم الأيبي للتعرف عليه/عليها.
+مثل هذا العنوان يمكن أن يشترك فيه عدة مستخدمين.
+لو كنت مستخدما مجهولا وتشعر بأن تعليقات لا تخصك تم توجيهها إليك، من فضلك [[Special:UserLogin/signup|أنشئ حسابا]] أو [[Special:UserLogin|سجل الدخول]] لتجنب الارتباك المستقبلي مع مستخدمين مجهولين آخرين.''",
 'noarticletext' => 'لا يوجد حاليا أي نص في هذه الصفحة.
 يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى،
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} البحث في السجلات المتعلقة]،
 أو [{{fullurl:{{FULLPAGENAME}}|action=edit}} تعديل هذه الصفحة]</span>.',
 'noarticletext-nopermission' => 'لا يوجد حاليا أي نص في هذه الصفحة.يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى,أو <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} بحث السجلات المتصلة]</span>.',
-'previewnote' => "'''تذكر أن هذه مجرد معاينة للصفحة؛''''
-لم تحفظ تغييراتك إلى الآن",
+'userpage-userdoesnotexist' => 'حساب المستخدم "<nowiki>$1</nowiki>" غير مسجل.
+من فضلك تأكد أنك تريد إنشاء/تعديل هذه الصفحة.',
+'userpage-userdoesnotexist-view' => 'حساب المستخدم "$1" غير مسجل.',
+'blocked-notice-logextract' => 'هذا المستخدم ممنوع حاليا.
+آخر مدخلة في سجل المنع موفرة بالأسفل كمرجع:',
+'clearyourcache' => "'''ملاحظة:''' بعد الحفظ, أنت ربما تحتاج إلى إفراغ كاش متصفحك لرؤية التغييرات.
+* '''فيرفكس / سفاري:''' اضغط ''Shift'' أثناء ضغط ''Reload'', أو اضغط أيا من ''Ctrl-F5'' أو ''Ctrl-R'' (''⌘-R'' على ماك)
+* '''جوجل كروم:''' اضغط ''Ctrl-Shift-R'' (''⌘-Shift-R'' على ماك)
+* '''إنترنت إكسبلورر:''' اضغط ''Ctrl'' أثناء ضغط ''Refresh''، أو اضغط ''Ctrl-F5''
+* '''كنكرر:''' اضغط ''Reload'' أو اضغط ''F5''
+* '''أوبرا:''' أفرغ الكاش في ''Tools → Preferences''",
+'usercssyoucanpreview' => "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة CSS الجديد قبل حفظ الصفحة.",
+'userjsyoucanpreview' => "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة جافاسكربت الجديدة قبل حفظ الصفحة.",
+'usercsspreview' => "'''تذكر أنك تقوم بعرض الأنماط المتراصة (CSS) الخاصة بك فقط
+لم يتم حفظها بعد!'''",
+'userjspreview' => "'''تذكر أنك فقط تجرب/تعاين جافاسكربت.'''
+'''لم يتم الحفظ بعد!'''",
+'sitecsspreview' => "''' تذكر أنك فقط في وضع المعاينة لهذا CSS ''' 
+''' ولم يتم حفظ الصفحة بعد! '''",
+'sitejspreview' => "''' تذكر أنك فقط في وضع المعاينة لكود JavaScript هذا''' 
+''' ولم يتم حفظه بعد! '''",
+'userinvalidcssjstitle' => "'''تحذير:''' لا توجد واجهة  \"\$1\".
+تذكر أن ملفات ال.css و ال.js تستخدم حروف صغيرة في العنوان ، كمثال {{ns:user}}:Foo/vector.css و ليس {{ns:user}}:Foo/Vector.css.",
+'updated' => '(محدثة)',
+'note' => "'''ملاحظة:'''",
+'previewnote' => "'''تذكر أن هذه مجرد معاينة أولية.'''
+لم تحفظ تغييراتك إلى الآن!",
+'continue-editing' => 'أكمل التحرير',
+'previewconflict' => 'هذا العرض يوضح النص الموجود في صندوق التحرير العلوي والذي سيظهر إذا اخترت الحفظ.',
+'session_fail_preview' => "'''عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.
+من فضلك حاول مرة أخرى.
+في حال استمرار المشكلة حاول أن تقوم [[Special:UserLogout|بالخروج]] ومن ثم الولوج مرة أخرى.'''",
+'session_fail_preview_html' => "'''عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.'''
+
+''لأن {{SITENAME}} بها HTML الخام مفعلة، العرض المسبق مخفي كاحتياط ضد هجمات الجافا سكريبت.''
+
+'''إذا كانت هذه محاولة تعديل صادقة، من فضلك حاول مرة أخرى.
+إذا كانت مازالت لا تعمل، حاول [[Special:UserLogout|تسجيل الخروج]] ثم تسجيل الدخول مجددا.'''",
+'token_suffix_mismatch' => "'''تعديلك تم رفضه لأن عميلك أخطأ في علامات الترقيم
+في نص التعديل. تم رفض التعديل لمنع فساد نص المقالة.
+هذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الوب.'''",
+'edit_form_incomplete' => "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
 'editing' => 'تحرير $1',
+'creating' => 'إنشاء «$1»',
 'editingsection' => 'تحرير $1 (قسم)',
+'editingcomment' => 'تعديل $1 (قسم جديد)',
+'editconflict' => 'تضارب في التحرير: $1',
+'explainconflict' => "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.
+صندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.
+والتغييرات التي قمت أنت بها موجودة في الصندوق في أسفل الصفحة.
+يجب أن تقوم بدمج تغييراتك في النص الموجود حاليا.
+'''فقط''' ما هو موجود في الصندوق العلوي هو ما سيتم حفظه عند الضغط على زر \"حفظ الصفحة\".",
+'yourtext' => 'نصك',
+'storedversion' => 'النسخة المخزنة',
+'nonunicodebrowser' => "'''تحذير: متصفحك لا يتوافق مع الترميز الموحد.
+تمت معالجة هذا لكي تتمكن من تحرير الصفحات بأمان: الحروف التي ليست ASCII سوف تظهر في صندوق التحرير كأكواد سداسي عشرية.'''",
+'editingold' => "''' تحذير: أنت تقوم الآن بتحرير نسخة قديمة من هذه الصفحة.
+إذا قمت بحفظها، ستفقد كافة التغييرات التي حدثت بعد هذه النسخة. '''",
+'yourdiff' => 'الفروق',
+'copyrightwarning' => "من فضلك لاحظ أن جميع المساهمات ل {{SITENAME}} خاضعة وصادرة تحت ترخيص $2 (انظر في $1 للمزيد من التفاصيل)
+إذا لم ترد أن تخضع كتابتك للتعديل والتوزيع الحر، لا تضعها هنا<br />.
+كما أنك تتعهد بأنك قمت بكتابة ما هو موجود بنفسك، أو قمت بنسخها من مصدر يخضع ضمن الملكية العامة، أو مصدر حر آخر.
+'''لا ترسل أي عمل ذي حقوق محفوظة بدون الإذن من صاحب الحق'''.",
+'copyrightwarning2' => "من فضلك لاحظ أن جميع المساهمات في {{SITENAME}} يمكن أن تعدل أو تتغير أو تزال من قبل المساهمين الآخرين.
+إذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />
+أنت تقر أيضا أنك كتبت هذا بنفسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتفاصيل).
+'''لا تضف أي عمل ذي حقوق محفوظة بدون تصريح!'''",
+'longpageerror' => "'''خطأ: النص الذي قمت بإدخاله {{PLURAL:$1|واحد كيلوبايت|$1 كيلوبيات}} أطول, وهو أطول من الحد الأقصى {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.'''
+و يتعذر حفظه.",
+'readonlywarning' => "'''تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من حفظ التعديلات التي قمت بها حاليا.
+إذا رغبت بإمكانك أن تنسخ النص الذي تعمل عليه وتحفظه في ملف نصي إلى وقت لاحق.'''
+
+الإداري الذي أغلقها أعطى هذا التفسير: $1",
+'protectedpagewarning' => "'''تحذير: تمت حماية هذه الصفحة حتى يمكن للمستخدمين ذوي الصلاحيات الإدارية فقط تعديلها.'''
+آخر مدخلة سجل موفرة بالأسفل كمرجع:",
+'semiprotectedpagewarning' => "'''ملاحظة:''' تمت حماية هذه الصفحة بحيث يمكن للمستخدمين المسجلين فقط تعديلها.
+آخر مدخلة سجل موفرة بالأسفل كمرجع:",
+'cascadeprotectedwarning' => "'''تحذير:''' تمت حماية هذه الصفحة بحيث يستطيع المستخدمون ذوو الصلاحيات الإدارية فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:\$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
+'titleprotectedwarning' => "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''
+آخر مدخلة سجل موفرة بالأسفل كمرجع:",
 'templatesused' => '{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه الصفحة:',
+'templatesusedpreview' => '{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:',
+'templatesusedsection' => '{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذا القسم:',
 'template-protected' => '(حماية كاملة)',
 'template-semiprotected' => '(حماية جزئية)',
 'hiddencategories' => '{{PLURAL:$1|هذه الصفحة غير موجودة في أي تصنايف مخفية|هذه الصفحة موجودة في تصنيف مخفي واحد|هذه الصفحة موجودة في تصنيفين مخفيين|هذه الصفحة موجودة في $1 تصانيف مخفية|هذه الصفحة موجودة في $1 تصنيفا مخفيا|هذه الصفحة موجودة في $1 تصنيف مخفي}}:',
+'nocreatetitle' => 'تم تحديد إنشاء الصفحات',
+'nocreatetext' => 'قام {{SITENAME}} بتحديد القدرة على إنشاء صفحات جديدة.
+يمكنك العودة وتحرير صفحة موجودة بالفعل، أو [[Special:UserLogin|الدخول أو تسجيل حساب]].',
+'nocreate-loggedin' => 'أنت لا تمتلك الصلاحية لإنشاء صفحات جديدة.',
+'sectioneditnotsupported-title' => 'تعديل الأقسام غير مدعوم',
+'sectioneditnotsupported-text' => 'تعديل الأقسام غير مدعوم في هذه الصفحة',
+'permissionserrors' => 'أخطاء السماحات',
+'permissionserrorstext' => 'لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:',
 'permissionserrorstext-withaction' => 'لا تملك الصلاحيات ل$2، لل{{PLURAL:$1||سبب التالي|سببين التاليين|أسباب التالية}}:',
 'recreate-moveddeleted-warn' => "'''تحذير: أنت تقوم بإعادة إنشاء صفحة سبق حذفها.'''
 
@@ -391,17 +779,55 @@ $1',
 سجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
 'moveddeleted-notice' => 'هذه الصفحة تم حذفها.
 سجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.',
+'log-fulllog' => 'أظهر السجل الكامل',
+'edit-hook-aborted' => 'التعديل تم تركه بواسطة الخطاف.
+لم يعط تفسيرا.',
+'edit-gone-missing' => 'لم يمكن تحديث الصفحة.
+يبدو أنه تم حذفها.',
+'edit-conflict' => 'تضارب تحريري.',
+'edit-no-change' => 'تعديلك تم تجاهله، لأنه لم يحدث أي تعديل للنص.',
+'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
+هي موجودة بالفعل.',
+'defaultmessagetext' => 'نص الرسالة الافتراضي',
 
 # Parser/template warnings
+'expensive-parserfunction-warning' => "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.
+
+ينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
+'expensive-parserfunction-category' => 'صفحات يوجد بها استدعاءات دوال محلل كثيرة ومكلفة',
 'post-expand-template-inclusion-warning' => "'''تحذير:''' حجم تضمين القالب كبير جدا.
 بعض القوالب لن تضمن.",
 'post-expand-template-inclusion-category' => 'الصفحات حيث تم تجاوز حجم تضمين القالب',
 'post-expand-template-argument-warning' => "'''تحذير:''' هذه الصفحة تحتوي على عامل قالب واحد على الأقل له حجم تمدد كبير جدا.
 هذه العوامل تم حذفها.",
 'post-expand-template-argument-category' => 'صفحات تحتوي مدخلات القالب المحذوفة',
+'parser-template-loop-warning' => 'تم كشف حلقة قالب: [[$1]]',
+'parser-template-recursion-depth-warning' => 'تم تجاوز حد عمق فرد القوالب ($1)',
+'language-converter-depth-warning' => 'تم تخطي حد عمق محول اللغة ($1)',
+'node-count-exceeded-category' => 'الصفحات التي حدث فيها تجاوز تعداد العقد',
+'node-count-exceeded-warning' => 'تجاوزت هذه الصفحة تعداد العقد',
+'expansion-depth-exceeded-category' => 'الصفحات التي حدث فيها تجاوز عمق التوسيع',
+'expansion-depth-exceeded-warning' => 'الصفحة تجاوزت عمق التوسيع',
+'parser-unstrip-loop-warning' => 'حلقة معراة تم الكشف عنها',
+'parser-unstrip-recursion-limit' => 'تعدى حد العودية Unstrip  ($1)',
+
+# "Undo" feature
+'undo-success' => 'يمكن استرجاع التعديل.
+من فضلك تحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، وبعد ذلك احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.',
+'undo-failure' => 'لم يمكن استرجاع التعديل بسبب تعديلات متعارضة تمت على الصفحة.',
+'undo-norev' => 'فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.',
+'undo-summary' => 'الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'لا يمكن إنشاء حساب',
+'cantcreateaccount-text' => "إنشاء الحسابات من عنوان الأيبي هذا ('''$1''') تم منعه بواسطة [[User:$3|$3]].
+
+السبب المعطى بواسطة $3 هو ''$2''",
 
 # History pages
 'viewpagelogs' => 'اعرض سجلات هذه الصفحة',
+'nohistory' => 'لا يوجد تاريخ للتعديلات لهذه الصفحة.',
+'currentrev' => 'المراجعة الحالية',
 'currentrev-asof' => 'المراجعة الحالية بتاريخ $1',
 'revisionasof' => 'مراجعة $1',
 'revision-info' => 'مراجعة $1 بواسطة $2',
@@ -409,7 +835,10 @@ $1',
 'nextrevision' => 'مراجعة أحدث ←',
 'currentrevisionlink' => 'المراجعة الحالية',
 'cur' => 'الحالي',
+'next' => 'التالي',
 'last' => 'السابق',
+'page_first' => 'الأولى',
+'page_last' => 'الأخيرة',
 'histlegend' => 'اختيار الفرق: علم على صناديق النسخ للمقارنة واضغط قارن بين النسخ المختارة أو الزر بالأسفل.<br />
 مفتاح: (الحالي) = الفرق مع النسخة الحالية
 (السابق) = الفرق مع النسخة السابقة، ط = تغيير طفيف',
@@ -417,29 +846,165 @@ $1',
 'history-show-deleted' => 'المحذوفة فقط',
 'histfirst' => 'أول',
 'histlast' => 'آخر',
+'historysize' => '({{PLURAL:$1|1 بايت|$1 بايت}})',
+'historyempty' => '(فارغ)',
 
 # Revision feed
+'history-feed-title' => 'تاريخ المراجعة',
+'history-feed-description' => 'تاريخ التعديل لهذه الصفحة في الويكي',
 'history-feed-item-nocomment' => '$1 في $2',
+'history-feed-empty' => 'الصفحة المطلوبة غير موجودة.
+من المحتمل أن تكون هذه الصفحة قد حذفت من الويكي، أو نقلت.
+حاول [[Special:Search|البحث في الويكي]] عن صفحات جديدة ذات صلة.',
 
 # Revision deletion
+'rev-deleted-comment' => '(أزيل ملخص التعديل)',
+'rev-deleted-user' => '(اسم المستخدم تمت إزالته)',
+'rev-deleted-event' => '(فعل السجل تمت إزالته)',
+'rev-deleted-user-contribs' => '[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]',
+'rev-deleted-text-permission' => "'''حُذِفت''' مراجعة هذه الصفحة.
+يمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+'rev-deleted-text-unhide' => "'''حُذِفت''' مراجعة الصفحة هذه.
+يمكن العثور على تفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].
+مازال بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
+'rev-suppressed-text-unhide' => "'''أُخفيت''' مراجعة الصفحة هذه.
+يمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].
+بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
+'rev-deleted-text-view' => "'''حُذِفت''' مراجعة هذه الصفحة.
+يمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+'rev-suppressed-text-view' => "'''أُخفيت''' مراجعة الصفحة هذه.
+يمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
+'rev-deleted-no-diff' => "لا يمكنك رؤية هذا الفرق لأن إحدى المراجعات '''حُذِفت'''.
+يمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+'rev-suppressed-no-diff' => "ليس بإمكانك مشاهدة هذا الفرق لأن إحدى المراجعات '''حذفت'''.",
+'rev-deleted-unhide-diff' => "'''حُذِفت''' إحدى مراجعتي هذا الفرق.
+يمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].
+بإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
+'rev-suppressed-unhide-diff' => "'''أُخفيت''' إحدى مراجعتي هذا الفرق.
+يمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].
+بإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
+'rev-deleted-diff-view' => "'''حُذِفت''' إحدى مراجعتي هذا الفرق.
+يمكنك رؤية الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+'rev-suppressed-diff-view' => "'''أُخفيت''' إحدى مراجعتي هذا الفرق.
+يمكنك رؤية هذا الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
 'rev-delundel' => 'أظهر/أخف',
+'rev-showdeleted' => 'أظهر',
+'revisiondelete' => 'حذف/استرجاع المراجعات',
+'revdelete-nooldid-title' => 'مراجعة هدف غير صحيحة',
+'revdelete-nooldid-text' => 'إما أنك لم تحدد مراجعة (أو مراجعات) معينة هدفا لهذه الوظيفة، أو أن المراجعة المحددة غير موجودة، أو أنك تحاول إخفاء المراجعة الحالية.',
+'revdelete-nologtype-title' => 'لا نوع سجل تم إعطاؤه',
+'revdelete-nologtype-text' => 'أنت لم تحدد نوع سجل لعمل هذا الفعل عليه.',
+'revdelete-nologid-title' => 'مدخلة سجل غير صحيحة',
+'revdelete-nologid-text' => 'أنت إما أنك لم تحدد حدث سجل مستهدف لعمل هذه الوظيفة أو أن المدخلة المحددة غير موجودة.',
+'revdelete-no-file' => 'الملف المحدد غير موجود.',
+'revdelete-show-file-confirm' => 'هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف "<nowiki>$1</nowiki>" بتاريخ $2 الساعة $3؟',
+'revdelete-show-file-submit' => 'نعم',
+'revdelete-selected' => "'''{{PLURAL:$2|المراجعة المختارة|المراجعات المختارة}} ل[[:$1]]:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:'''",
+'revdelete-text' => "'''المراجعات والأحداث المحذوفة ستظل تظهر في تاريخ الصفحة والسجلات،'''
+لكن أجزاء من محتواها لن يكون مسموحا للعامة برؤيتها.",
+'revdelete-confirm' => 'الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.
+من فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].',
+'revdelete-suppress-text' => "الإخفاء ينبغي أن يتم استخدامه '''فقط''' في الحالات التالية:
+* معلومات شخصية غير ملائمة
+*: ''عناوين المنازل وأرقام التليفونات، أرقام الضمان الاجتماعي، إلى آخره.''",
+'revdelete-legend' => 'وضع ضوابط رؤية',
+'revdelete-hide-text' => 'أخف نص المراجعة',
+'revdelete-hide-image' => 'أخف محتوى الملف',
+'revdelete-hide-name' => 'أخف الفعل والهدف',
+'revdelete-hide-comment' => 'أخف تعليق التعديل',
+'revdelete-hide-user' => 'أخف اسم/آيبي المستخدم',
+'revdelete-hide-restricted' => 'أخف البيانات عن الإداريين إضافة إلى الآخرين',
+'revdelete-radio-same' => '(لا تغير)',
+'revdelete-radio-set' => 'نعم',
+'revdelete-radio-unset' => 'لا',
+'revdelete-suppress' => 'أخف البيانات عن مديري النظام والبقية',
+'revdelete-unsuppress' => 'إزالة الضوابط من المراجعات المسترجعة',
+'revdelete-log' => 'السبب:',
+'revdelete-submit' => 'طبق على {{PLURAL:$1||المراجعة المختارة|المراجعتين المختارتين|المراجعات المختارة}}',
+'revdelete-success' => "'''تم تحديث رؤية المراجعات بنجاح.'''",
+'revdelete-failure' => "'''تعذر تحديث رؤية المراجعة:'''
+$1",
+'logdelete-success' => "'''تم ضبط رؤية السجلات بنجاح.'''",
+'logdelete-failure' => "'''تعذر ضبط رؤية السجل:'''
+$1",
 'revdel-restore' => 'تغيير الرؤية',
 'revdel-restore-deleted' => 'مراجعات محذوفة',
 'revdel-restore-visible' => 'مراجعات مرئية',
+'pagehist' => 'تاريخ الصفحة',
+'deletedhist' => 'التاريخ المحذوف',
+'revdelete-hide-current' => 'خطأ عند إحفاء العنصر المؤرخ في $2 $1: هذه هي المراجعة الحالية.
+لا يمكن إخفاؤها.',
+'revdelete-show-no-access' => 'خطأ في إظهار العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك"مقيد".
+ليس لك صلاحية الوصول إليه.',
+'revdelete-modify-no-access' => 'خطأ في تعديل العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك"مقيد".
+ليس لك صلاحية الوصول إليه.',
+'revdelete-modify-missing' => 'خطأ في تعديل العنصر ذا الهوية $1: العنصر مفقود من قاعدة البيانات!',
+'revdelete-no-change' => "'''تحذير:''' العنصر ذو التاريخ $2 $1 لديه أصلا إعدادات الظهور المطلوبة.",
+'revdelete-concurrent-change' => 'خطأ في تعديل العنصر ذي التاريخ $2 $1: تظهر حالته أن شخصا آخر عدله أثناء محاولتك تعديله.
+من فضلك راجع السجلات.',
+'revdelete-only-restricted' => 'خطأ إخفاء العنصر المؤرخ $2, $1: لا تستطيع تنحية العناصر من عرض الإداريين بدون أن تحدد أيضا إحدى خيارات التنحية الأخرى.',
+'revdelete-reason-dropdown' => '* أسباب حذف عامة
+** خرق لحقوق النشر
+** معلومات شخصية غير ملائمة
+**معلومات تشهيرية محتملة',
+'revdelete-otherreason' => 'سبب آخر/إضافي:',
+'revdelete-reasonotherlist' => 'سبب آخر',
+'revdelete-edit-reasonlist' => 'عدل أسباب الحذف',
+'revdelete-offender' => 'مؤلف المراجعة:',
+
+# Suppression log
+'suppressionlog' => 'سجل الإخفاء',
+'suppressionlogtext' => 'بالأسفل قائمة بعمليات الحذف والمنع التي تتضمن محتوى مخفيا عن الإداريين.
+انظر [[Special:BlockList|قائمة منع الآيبي]] لترى عمليات المنع القائمة الآن.',
+
+# History merging
+'mergehistory' => 'دمج تواريخ الصفحة',
+'mergehistory-header' => 'هذه الصفحة تسمح لك بدمج نسخ تاريخ صفحة ما إلى صفحة أخرى.
+تأكد من أن هذا التغيير سيحافظ على استمرار تاريخ الصفحة.',
+'mergehistory-box' => 'دمج مراجعات صفحتين:',
+'mergehistory-from' => 'الصفحة المصدر:',
+'mergehistory-into' => 'الصفحة الهدف:',
+'mergehistory-list' => 'تاريخ التعديل القابل للدمج',
+'mergehistory-merge' => 'المراجعات التالية من [[:$1]] يمكن دمجها إلى [[:$2]].
+استخدم عامود الصناديق لدمج المراجعات التي تم إنشاؤها في وقبل الوقت المحدد.
+لاحظ أن استخدام وصلات التصفح سيعيد ضبط هذا العامود.',
+'mergehistory-go' => 'عرض التعديلات القابلة للدمج',
+'mergehistory-submit' => 'دمج المراجعات',
+'mergehistory-empty' => 'لا مراجعات يمكن دمجها.',
+'mergehistory-success' => '$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح في [[:$2]].',
+'mergehistory-fail' => 'غير قادر على عمل دمج التاريخ، من فضلك أعد التحقق من محددات الصفحة والزمن.',
+'mergehistory-no-source' => 'الصفحة المصدر $1 غير موجودة.',
+'mergehistory-no-destination' => 'الصفحة الهدف $1 غير موجودة.',
+'mergehistory-invalid-source' => 'الصفحة المصدر يجب أن تكون عنوانا صحيحا.',
+'mergehistory-invalid-destination' => 'الصفحة الهدف يجب أن تكون عنوانا صحيحا.',
+'mergehistory-autocomment' => 'دمج [[:$1]] في [[:$2]]',
+'mergehistory-comment' => 'دمج [[:$1]] في [[:$2]]: $3',
+'mergehistory-same-destination' => 'صفحتا المصدر والهدف لا يمكن أن تكونا نفس الشيء',
+'mergehistory-reason' => 'السبب:',
 
 # Merge log
+'mergelog' => 'سجل الدمج',
+'pagemerge-logentry' => 'دمج [[$1]] إلى [[$2]] (المراجعات حتى $3)',
 'revertmerge' => 'إلغاء الدمج',
+'mergelogpagetext' => 'بالأسفل قائمة بأحدث عمليات الدمج لتاريخ صفحة ما إلى أخرى.',
 
 # Diffs
-'history-title' => 'تاريخ مراجعة "$1"',
+'history-title' => ' «$1»: تاريخ المراجعة',
+'difference-title' => '«$1»: الفرق بين المراجعتين',
+'difference-title-multipage' => '«$1» و«$2»: الفرق بين الصفحتين',
+'difference-multipage' => '(الفرق بين الصفحتين)',
 'lineno' => 'سطر $1:',
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
+'showhideselectedversions' => 'أظهر/أخف المراجعات المختارة',
 'editundo' => 'تراجع',
 'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتين أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
+'diff-multi-manyusers' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 
 # Search results
 'searchresults' => 'el resultats',
 'searchresults-title' => 'نتائج البحث عن "$1"',
+'searchresulttext' => 'للمزيد من المعلومات حول البحث في {{SITENAME}}، انظر [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'prevn' => '{{PLURAL:$1|$1}} السابقة',
 'nextn' => '{{PLURAL:$1|$1}} التالية',
 'prevn-title' => '$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة',
index a9930d0..3756dfd 100644 (file)
@@ -48,65 +48,65 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#AANSTUUR', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__GEENIO__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__GEENGALERY__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__DWINGIO__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__IO__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__GEENNUWEAFDELING__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__GEENOPSKRIF__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'HUIDIGEMAAND', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
-       'currentmonthabbrev'      => array( '1', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'HUIDIGEDAG', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'HUIDIGEJAAR', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'HUIDIGETYD', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'HUIDIGEUUR', 'CURRENTHOUR' ),
-       'numberofpages'           => array( '1', 'AANTALBLADSYE', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'AANTALARTIKELS', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'AANTALLêERS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'AANTALAKTIEWEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'AANTALWYSIGINGS', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'AANTALKEERGESIEN', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'BLADSYNAAM', 'PAGENAME' ),
-       'namespace'               => array( '1', 'NAAMSPASIE', 'NAMESPACE' ),
-       'talkspace'               => array( '1', 'BESPREKINGSBLADSY', 'TALKSPACE' ),
-       'fullpagename'            => array( '1', 'VOLBLADSYNAAM', 'FULLPAGENAME' ),
-       'img_thumbnail'           => array( '1', 'duimnael', 'thumbnail', 'thumb' ),
-       'img_right'               => array( '1', 'regs', 'right' ),
-       'img_left'                => array( '1', 'links', 'left' ),
-       'img_none'                => array( '1', 'geen', 'none' ),
-       'img_center'              => array( '1', 'senter', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'omraam', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'raamloos', 'frameless' ),
-       'img_border'              => array( '1', 'raam', 'border' ),
-       'img_top'                 => array( '1', 'bo', 'top' ),
-       'img_text_top'            => array( '1', 'teks-bo', 'text-top' ),
-       'img_middle'              => array( '1', 'middel', 'middle' ),
-       'img_bottom'              => array( '1', 'onder', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'teks-onder', 'text-bottom' ),
-       'img_link'                => array( '1', 'skakel=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'WERFNAAM', 'SITENAME' ),
-       'server'                  => array( '0', 'BEDIENER', 'SERVER' ),
-       'servername'              => array( '0', 'BEDIENERNAAM', 'SERVERNAME' ),
-       'gender'                  => array( '0', 'GESLAG:', 'GENDER:' ),
-       'localweek'               => array( '1', 'HUIDIGEWEEK', 'LOCALWEEK' ),
-       'plural'                  => array( '0', 'MEERVOUD', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'VOLURL', 'FULLURL:' ),
-       'displaytitle'            => array( '1', 'VERTOONTITEL', 'DISPLAYTITLE' ),
-       'currentversion'          => array( '1', 'HUIDIGEWEERGAWE', 'CURRENTVERSION' ),
-       'language'                => array( '0', '#TAAL:', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'spesiaal', 'special' ),
-       'filepath'                => array( '0', 'LêERPAD:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'etiket', 'tag' ),
-       'pagesize'                => array( '1', 'BLADSYGROOTTE', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEKS__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__GEENINDEKS__', '__NOINDEX__' ),
-       'url_path'                => array( '0', 'PAD', 'PATH' ),
+       'redirect'                  => array( '0', '#AANSTUUR', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__GEENIO__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__GEENGALERY__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__DWINGIO__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__IO__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__GEENNUWEAFDELING__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__GEENOPSKRIF__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'HUIDIGEMAAND', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
+       'currentmonthabbrev'        => array( '1', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'HUIDIGEDAG', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'HUIDIGEJAAR', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'HUIDIGETYD', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'HUIDIGEUUR', 'CURRENTHOUR' ),
+       'numberofpages'             => array( '1', 'AANTALBLADSYE', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'AANTALARTIKELS', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'AANTALLêERS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'AANTALAKTIEWEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'AANTALWYSIGINGS', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'AANTALKEERGESIEN', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'BLADSYNAAM', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'NAAMSPASIE', 'NAMESPACE' ),
+       'talkspace'                 => array( '1', 'BESPREKINGSBLADSY', 'TALKSPACE' ),
+       'fullpagename'              => array( '1', 'VOLBLADSYNAAM', 'FULLPAGENAME' ),
+       'img_thumbnail'             => array( '1', 'duimnael', 'thumbnail', 'thumb' ),
+       'img_right'                 => array( '1', 'regs', 'right' ),
+       'img_left'                  => array( '1', 'links', 'left' ),
+       'img_none'                  => array( '1', 'geen', 'none' ),
+       'img_center'                => array( '1', 'senter', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'omraam', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'raamloos', 'frameless' ),
+       'img_border'                => array( '1', 'raam', 'border' ),
+       'img_top'                   => array( '1', 'bo', 'top' ),
+       'img_text_top'              => array( '1', 'teks-bo', 'text-top' ),
+       'img_middle'                => array( '1', 'middel', 'middle' ),
+       'img_bottom'                => array( '1', 'onder', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'teks-onder', 'text-bottom' ),
+       'img_link'                  => array( '1', 'skakel=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'WERFNAAM', 'SITENAME' ),
+       'server'                    => array( '0', 'BEDIENER', 'SERVER' ),
+       'servername'                => array( '0', 'BEDIENERNAAM', 'SERVERNAME' ),
+       'gender'                    => array( '0', 'GESLAG:', 'GENDER:' ),
+       'localweek'                 => array( '1', 'HUIDIGEWEEK', 'LOCALWEEK' ),
+       'plural'                    => array( '0', 'MEERVOUD', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'VOLURL', 'FULLURL:' ),
+       'displaytitle'              => array( '1', 'VERTOONTITEL', 'DISPLAYTITLE' ),
+       'currentversion'            => array( '1', 'HUIDIGEWEERGAWE', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#TAAL:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'spesiaal', 'special' ),
+       'filepath'                  => array( '0', 'LêERPAD:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'etiket', 'tag' ),
+       'pagesize'                  => array( '1', 'BLADSYGROOTTE', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEKS__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__GEENINDEKS__', '__NOINDEX__' ),
+       'url_path'                  => array( '0', 'PAD', 'PATH' ),
 );
 
 $specialPageAliases = array(
@@ -215,7 +215,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Versteek gepatrolleerde wysigings in onlangse wysigingslys',
 'tog-newpageshidepatrolled' => 'Versteek gepatrolleerde wysigings van nuwe bladsy lys',
 'tog-extendwatchlist' => 'Brei dophoulys uit om alle wysigings te wys, nie slegs die nuutste nie',
-'tog-usenewrc' => 'Verbeterde onlangse wysigingslys (benodig JavaScript)',
+'tog-usenewrc' => 'Groepeer wysigings per bladsy in onlangse wysigings en dophoulys (benodig JavaScript)',
 'tog-numberheadings' => 'Nommer opskrifte outomaties',
 'tog-showtoolbar' => 'Wys redigeergereedskap (benodig JavaScript)',
 'tog-editondblclick' => 'Dubbelkliek om blaaie te wysig (benodig JavaScript)',
@@ -223,17 +223,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Wysig afdeling met regskliek op afdeling se titel (JavaScript)',
 'tog-showtoc' => 'Wys inhoudsopgawe (by bladsye met meer as drie opskrifte)',
 'tog-rememberpassword' => 'Onthou dat ek op hierdie rekenaar ingeteken het (vir \'n maksimum van $1 {{PLURAL:$|dag|dae}})',
-'tog-watchcreations' => 'Voeg bladsye wat ek skep by my dophoulys',
-'tog-watchdefault' => 'Lys nuwe en gewysigde bladsye.',
-'tog-watchmoves' => 'Voeg die bladsye wat ek skuif by my dophoulys',
-'tog-watchdeletion' => 'Voeg bladsye wat ek verwyder by my dophoulys',
+'tog-watchcreations' => 'Voeg bladsye wat ek skep en lêers wat ek oplaai by my dophoulys',
+'tog-watchdefault' => 'Voeg bladsye en lêers wat ek wysig by my dophoulys',
+'tog-watchmoves' => 'Voeg bladsye en lêers wat ek skuif by my dophoulys',
+'tog-watchdeletion' => 'Voeg bladsye en lêers wat ek skrap by my dophoulys',
 'tog-minordefault' => 'Merk alle wysigings automaties as klein by verstek.',
 'tog-previewontop' => 'Wys voorskou bo wysigingsboks.',
 'tog-previewonfirst' => 'Wys voorskou met eerste wysiging',
 'tog-nocache' => 'Deaktiveer blaaier se bladsykas',
-'tog-enotifwatchlistpages' => 'Stuur vir my e-pos met bladsyveranderings',
+'tog-enotifwatchlistpages' => "Stuur my e-pos as 'n bladsye of lêer op my dophoulys verander",
 'tog-enotifusertalkpages' => 'Stuur vir my e-pos as my eie besprekingsblad verander word',
-'tog-enotifminoredits' => 'Stuur ook e-pos vir klein bladsywysigings',
+'tog-enotifminoredits' => 'Stuur my ook e-pos vir klein wysigings aan bladsye en lêers',
 'tog-enotifrevealaddr' => 'Stel my e-posadres bloot in kennisgewingspos',
 'tog-shownumberswatching' => 'Wys die aantal gebruikers wat dophou',
 'tog-oldsig' => 'Bestaande handtekening:',
@@ -471,6 +471,10 @@ $1",
 'youhavenewmessages' => 'U het $1 (sien $2).',
 'newmessageslink' => 'nuwe boodskappe',
 'newmessagesdifflink' => 'die laaste wysiging',
+'youhavenewmessagesfromusers' => "U het $1 van {{PLURAL:$3|'n ander gebruiker|$3 gebruikers}} ($2).",
+'youhavenewmessagesmanyusers' => 'U het $1 van baie gebruikers ($2).',
+'newmessageslinkplural' => "{{PLURAL:$1|'n nuwe boodskap|nuwe boodskappe}}",
+'newmessagesdifflinkplural' => 'laaste {{PLURAL:$1|wysiging|wysigings}}',
 'youhavenewmessagesmulti' => 'U het nuwe boodskappe op $1',
 'editsection' => 'wysig',
 'editold' => 'wysig',
@@ -522,12 +526,12 @@ Dit kan ook dui op 'n fout in die sagteware van {{SITENAME}}.",
 # General errors
 'error' => 'Fout',
 'databaseerror' => 'Databasisfout',
-'dberrortext' => 'Sintaksisfout in databasisnavraag.
+'dberrortext' => 'Daar was \'n sintaksisfout in die databasisnavraag.
 Dit kan moontlik dui op \'n fout in die sagteware.
 Die laaste navraag was:
-<blockquote><tt>$1</tt></blockquote>
-vanuit funksie "<tt>$2</tt>".
-Databasis gee foutboodskap "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+vanuit funksie "<code>$2</code>".
+Databasis gee foutboodskap "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Sintaksisfout in databasisnavraag.
 Die laaste navraag was:
 "$1"
@@ -567,6 +571,8 @@ Indien dit nie die geval is nie, het u moontlik 'n fout in die sagteware ontdek.
 'cannotdelete' => 'Die bladsy of lêer "$1" kon nie skrap word nie.
 Iemand anders het dit moontlik reeds geskrap.',
 'cannotdelete-title' => 'Bladsy "$1" kan nie verwyder word nie',
+'delete-hook-aborted' => "Die wysiging is deur 'n hoek gekanselleer.
+Geen verduideliking is verskaf nie.",
 'badtitle' => 'Ongeldige titel',
 'badtitletext' => "Die bladsytitel waarvoor gevra is, is ongeldig, leeg, of
 'n verkeerd geskakelde tussen-taal of tussen-wiki titel.",
@@ -594,8 +600,13 @@ Probeer asseblief weer oor 'n paar minute.",
 'ns-specialprotected' => 'Spesiale bladsye kan nie geredigeer word nie.',
 'titleprotected' => "Hierdie titel is beskerm teen skepping deur [[User:$1|$1]].
 Die rede gegee is ''$2''.",
+'filereadonlyerror' => 'Dit was nie moontlik om die lêer "$1" te wysig nie omdat die lêerstoor "$2" tans lees-alleen is.
+
+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.',
 
 # Virus scanner
 'virus-badscanner' => "Slegte konfigurasie: onbekende virusskandeerder: ''$1''",
@@ -616,6 +627,7 @@ moenie vergeet om u [[Special:Preferences|persoonlike voorkeure vir {{SITENAME}}
 'remembermypassword' => 'Onthou dat ek op hierdie rekenaar ingeteken het (vir \'n maksimum van $1 {{PLURAL:$|dag|dae}})',
 '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 Databasis fout het voorgekom tydens aanmelding of u het nie toestemming om u eksterne rekening op te dateer nie.",
 'login' => 'Teken in',
 'nav-login-createaccount' => 'Teken in',
@@ -856,15 +868,18 @@ U kan [[Special:Search/{{PAGENAME}}|vir die bladsytitel in ander bladsye soek]],
 of [{{fullurl:{{FULLPAGENAME}}|action=edit}} hierdie bladsy wysig]</span>.',
 'noarticletext-nopermission' => 'Daar is tans geen teks in hierdie bladsy nie. U kan vir die bladsytitel [[Special:Search/{{PAGENAME}}|in ander bladsye soek]] of
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} die verwante logboeke deursoek]</span>.',
+'missing-revision' => 'Die weergawe #$1 van die bladsy "{{PAGENAME}} bestaan nie.
+
+Dit word meestal veroorsaak deur die volg van \'n verouderde verwysing na \'n bladsy wat verwyder is.
+Meer gegewens kan moontlik in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.',
 'userpage-userdoesnotexist' => 'U is besig om \'n gebruikersblad wat nie bestaan nie te wysig (gebruiker "<nowiki>$1</nowiki>"). Maak asseblief seker of u die bladsy wil skep/ wysig.',
 'userpage-userdoesnotexist-view' => 'Die gebruiker "$1" is nie geregistreer nie.',
 'blocked-notice-logextract' => 'Hierdie gebruiker is tans geblokkeer.
 Die laaste inskrywing in die blokkeerlogboek word hieronder vertoon:',
 'clearyourcache' => "'''Let wel''': Na die voorkeure gestoor is, moet u blaaier se kasgeheue verfris word om die veranderinge te sien:
-* '''Firefox / Safari:''' hou ''Shift'' en kliek ''Reload'', of druk ''Ctrl-F5'' of ''Ctrl-R'' (''Command-R'' op 'n Mac)
-* '''Google Chrome:''' druk ''Ctrl-Shift-R'' (''Command-Shift-R'' op 'n Mac)
+* '''Firefox / Safari:''' hou ''Shift'' en kliek ''Reload'', of druk ''Ctrl-F5'' of ''Ctrl-R'' (''-R'' op 'n Mac)
+* '''Google Chrome:''' druk ''Ctrl-Shift-R'' (''-Shift-R'' op 'n Mac)
 * '''Internet Explorer:''' hou ''Ctrl'' en kliek ''Refresh'', of druk ''Ctrl-F5''
-* '''Konqueror:''' kliek ''Reload'' of druk ''F5''
 * '''Opera:''' maak die kas skoon by ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Wenk:''' Gebruik die \"{{int:showpreview}}\"-knoppie om u nuwe CSS te toets voor u dit stoor.",
 'userjsyoucanpreview' => "'''Wenk:''' Gebruik die \"{{int:showpreview}}\"-knoppie om u nuwe JS te toets voor u dit stoor.",
@@ -881,6 +896,7 @@ Onthou dat u eie .css- en .js-bladsye met 'n kleinletter begin, byvoorbeeld {{ns
 'note' => "'''Nota:'''",
 '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.',
 'session_fail_preview' => "'''Jammer! Weens verlies aan sessie-inligting is die wysiging nie verwerk nie.
 Probeer asseblief weer. As dit steeds nie werk nie, probeer om [[Special:UserLogout|af te teken]] en dan weer aan te teken.'''",
@@ -974,6 +990,13 @@ Hierdie parameters is uitgelaat.",
 'parser-template-loop-warning' => "Sjablone is in 'n oneindige lus: [[$1]]",
 'parser-template-recursion-depth-warning' => 'Die rekursiediepte vir sjablone is oorskry ($1)',
 'language-converter-depth-warning' => 'Die dieptelimiet vir die taalomskakelaar is oorskrei ($1)',
+'node-count-exceeded-category' => 'Bladsye waar die maksimum aantal nodes oorskry is',
+'node-count-exceeded-warning' => 'Hierdie bladsy oorskry die maksimum aantal nodes',
+'expansion-depth-exceeded-category' => 'Bladsye waar die uitbreidingsdiepte oorskry is',
+'expansion-depth-exceeded-warning' => 'Die bladsy bevat te veel sjablone',
+'parser-unstrip-loop-warning' => '\'n "Unstrip"-lus is bespreur.',
+'parser-unstrip-recursion-limit' => 'Die rekursielimiet ($1) vir "unstrip" is oorskry',
+'converter-manual-rule-error' => "'n Fout is in 'n handmatig toegevoegde taalomskalelingsreël gevind.",
 
 # "Undo" feature
 'undo-success' => 'Die wysiging kan ongedaan gemaak word.
@@ -1030,28 +1053,26 @@ Vir meer besonderhede, raadpleeg die [{{fullurl:{{#Special:Log}}/delete|page={{F
 'rev-deleted-text-unhide' => "Hierdie weergawe van die bladsy is '''verwyder'''.
 Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.
 U kan steeds na [$1 die weergawe kyk] as u wil voortgaan.",
-'rev-suppressed-text-unhide' => "Hierdie weergawe van die blad word '''onderdruk'''.
-Details kan moontlik in die [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek van onderdrukte weergawes] gesien word.
-As administrateur kan u, as u wil, na [$1 die verskille kyk].",
+'rev-suppressed-text-unhide' => "Hierdie weergawe van die bladsy word '''onderdruk'''.
+Details kan in die [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek van onderdrukte weergawes] gevind word.
+As u wil voortgaan kan u steeds [$1 die weergawe sien].",
 'rev-deleted-text-view' => "Hierdie weergawe is '''verwyder'''.
-As administrateur kan u dit wel sien.
-Details kan moontlik in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] aanwesig wees.",
+U dit wel sien. Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
 'rev-suppressed-text-view' => "Hierdie weergawe van die bladsy word '''onderdruk'''.
-As administrateur kan u dit sien.
-Details kan moontlik in die [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek van onderdrukte weergawes] gesien word.",
+U kan dit wel sien. Details kan in die [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek van onderdrukte weergawes] gevind word.",
 'rev-deleted-no-diff' => "U kan nie die verskille sien nie omdat een van die weergawes '''verwyder''' is.
 Details kan moontlik in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] aanwesig wees.",
 'rev-suppressed-no-diff' => "U kan nie hierdie verskil sien nie omdat een van die weergawes '''geskrap''' is.",
-'rev-deleted-unhide-diff' => "Een van die weergawes vir hierdie verskil wat u aangevra het is '''verwyder'''.
-Meer details mag moontlik in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwyderingslogboek] aanwesig wees.
-As administrateur kan u steeds [$1 die verskille sien] as u wil voortgaan.",
-'rev-suppressed-unhide-diff' => "Een van die weergawes vir hierdie verskil wat u aangevra het is '''onderdruk'''.
-Meer details mag moontlik in die [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek] aanwesig wees.
-As administrateur kan u steeds [$1 hierdie weergawe sien] as u wil voortgaan.",
+'rev-deleted-unhide-diff' => "Een van die weergawes vir die verskil wat u aangevra het is '''verwyder'''.
+Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.
+U kan steeds [$1 die verskille sien] as u wil voortgaan.",
+'rev-suppressed-unhide-diff' => "Een van die weergawes vir die verskil wat u aangevra het is '''onderdruk'''.
+Details kan in die [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek] gesien word.
+U kan steeds [$1 hierdie weergawe sien] as u wil voortgaan.",
 'rev-deleted-diff-view' => "Een van die weergawes van die verskil wat u aangevra het is '''verwyder'''.
-As administrateur kan u hierdie verskil sien. Meer details mag moontlik is die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwyderingslogboek] beskikbaar wees.",
+U kan steeds hierdie verskil sien. Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
 'rev-suppressed-diff-view' => "Een van die weergawes vir die verskil wat u aangevra het is '''onderdruk'''.
-As administrateur kan u hierdie verskil sien. Meer details mag moontlik in die [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek] beskikbaar wees.",
+U kan wel hierdie verskil sien. Meer details kan in die [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek] gevind word.",
 'rev-delundel' => 'wys/versteek',
 'rev-showdeleted' => 'wys',
 'revisiondelete' => 'Verwyder/herstel weergawes',
@@ -1117,8 +1138,8 @@ Kontroleer asseblief die logboeke.",
 
 # Suppression log
 'suppressionlog' => 'Verbergingslogboek',
-'suppressionlogtext' => 'Die onderstaande lys bevat verwyderings en blokkades wat vir administrateurs verborge is.
-Kyk na die [[Special:IPBlockList|IP-blokkeerlys]] om die huidige blokkades te sien.',
+'suppressionlogtext' => 'Die onderstaande lys bevat verwyderings en blokkades wat vir administrateurs versteek is.
+Kyk na die [[Special:BlockList|blokkeerlys]] om die huidige blokkades te sien.',
 
 # History merging
 'mergehistory' => 'Geskiedenis van bladsy samesmeltings',
@@ -1162,6 +1183,10 @@ Let op dat die gebruik van navigasieskakels hierdie kolom se waardes sal herstel
 'editundo' => 'maak ongedaan',
 'diff-multi' => '({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur {{PLURAL:$2|een gebruiker|$2 gebruikers}} word nie gewys nie)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)',
+'difference-missing-revision' => "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.
+
+Dit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n bladsy wat verwyder is.
+Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
 
 # Search results
 'searchresults' => 'soekresultate',
@@ -1378,7 +1403,7 @@ Die inligting is vir ander gebruikers sigbaar.',
 'userrights-no-interwiki' => 'U het nie toestemming om gebruikersregte op ander wikis 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-notallowed' => 'U het nie die toestemming om gebruikersregte toe te ken nie.',
+'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',
 
@@ -1431,6 +1456,7 @@ Die inligting is vir ander gebruikers sigbaar.',
 'right-writeapi' => 'Bewerkings m.b.v. die API',
 'right-delete' => 'Vee bladsye uit',
 'right-bigdelete' => 'Skrap bladsye met groot geskiedenisse',
+'right-deletelogentry' => 'Skrap en terugplaas van spesifieke logboekreëls',
 'right-deleterevision' => 'Skrap en ontskrap spesifieke hersienings van bladsye',
 'right-deletedhistory' => 'Wys geskrapte geskiedenis-inskrywings, sonder hul teks',
 'right-deletedtext' => 'Wys verwyderde teks en veranderings tussen geskrapte weergawes',
@@ -1630,21 +1656,21 @@ die lêer is $2.',
 'largefileserver' => 'Hierdie lêer is groter as wat die bediener se opstelling toelaat.',
 'emptyfile' => "Die lêer wat u probeer oplaai het blyk leeg te wees. Dit mag wees omdat u 'n tikfout in die lêernaam gemaak het. Gaan asseblief na en probeer weer.",
 'windows-nonascii-filename' => 'Hierdie wiki ondersteun nie lêername met spesiale karakters nie.',
-'fileexists' => "'n Lêer met die naam bestaan reeds, kyk na '''<tt>[[:$1]]</tt>''' as u nie seker is dat u dit wil wysig nie.
+'fileexists' => "'n Lêer met die naam bestaan reeds, kyk na <strong>[[:$1]]</strong> as u nie seker is dat u dit wil wysig nie.
 [[$1|thumb]]",
-'filepageexists' => "Die beskrywingsbladsy vir hierdie lêer bestaan reeds by '''<tt>[[:$1]]</tt>''', maar daar is nie 'n lêer met hierdie naam nie.
+'filepageexists' => "Die beskrywingsbladsy vir hierdie lêer bestaan reeds by <strong>[[:$1]]</strong>, maar daar is nie 'n lêer met hierdie naam nie.
 Die opsomming wat u verskaf het sal nie op die beskrywingsblad geplaas word nie.
 Wysig asseblief die bladsy handmatig om u beskrywing by te werk.
 [[$1|duimnael]]",
 'fileexists-extension' => "'n Lêer met hierdie naam bestaan al reeds: [[$2|thumb]]
-* Naam van die opgelaaide lêer: '''<tt>[[:$1]]</tt>'''
-* Naam van die bestaande lêer: '''<tt>[[:$2]]</tt>'''
+* Naam van die opgelaaide lêer: <strong>[[:$1]]</strong>
+* Naam van die bestaande lêer: <strong>[[:$2]]</strong>
 Kies asseblief 'n ander naam.",
 'fileexists-thumbnail-yes' => "Die lêer lyk na 'n verkleinde weergawe ''(duimnael)''.
 [[$1|thumb]]
-Kontroleer asseblief die lêer '''<tt>[[:$1]]</tt>'''.
+Kontroleer asseblief die lêer <strong>[[:$1]]</strong>.
 As die gekontroleerde lêer dieselfde beeld van oorspronklike grootte is, is dit nie nodig om 'n ekstra miniatuurafbeelding daarvan op te laai nie.",
-'file-thumbnail-no' => "Die lêernaam begin met '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Die lêernaam begin met <strong>$1</strong>.
 Dit lyk na 'n verkleinde beeld ''(duimnael)''.
 As u hierdie beeld in volle resolusie het, laai dit asseblief op.
 Indien nie, verander asseblief die lêernaam.",
@@ -1706,11 +1732,13 @@ As daar steeds probleme is, kontak 'n [[Special:ListUsers/sysop|administrateur]]
 'upload-too-many-redirects' => 'Die URL bevat te veel aansture',
 'upload-unknown-size' => 'Onbekende grootte',
 'upload-http-error' => "'n HTTP-fout het voorgekom: $1",
+'upload-copy-upload-invalid-domain' => 'Gekopieerde oplaaie word nie vanuit die domein toegelaat nie.',
 
 # File backend
 'backend-fail-stream' => 'Kon nie die lêer $1 uitstroom nie.',
 'backend-fail-backup' => "Kon nie 'n rugsteunkopie van die lêer $1 maak nie.",
 'backend-fail-notexists' => 'Die lêer $1 bestaan nie.',
+'backend-fail-hashes' => 'Kon nie "hashes" vir die lêer vir die vergelyking kry nie.',
 'backend-fail-notsame' => "'n Nie-identiese lêer bestaan al reeds by $1.",
 'backend-fail-invalidpath' => "$1 is nie 'n geldige stoorplek nie.",
 'backend-fail-delete' => 'Die lêer $1 kon nie geskrap word nie.',
@@ -1723,6 +1751,30 @@ As daar steeds probleme is, kontak 'n [[Special:ListUsers/sysop|administrateur]]
 'backend-fail-closetemp' => 'Kon nie tydelike lêer sluit nie.',
 'backend-fail-read' => 'Kon nie lêer $1 lees nie.',
 'backend-fail-create' => 'Kon nie lêer $1 uitskryf nie.',
+'backend-fail-maxsize' => 'Kon nie lêer "$1" uitskryf nie omdat dit groter as {{PLURAL:$2|een greep|$2 grepe}} is.',
+'backend-fail-readonly' => 'Die agterliggende stoorspasie "$1" is lees-alleen. Die rede verskaf is: "\'\'$2\'\'"',
+'backend-fail-synced' => 'Die lêer "$1" is tans in \'n onbestendige toestand in die interne stoorspasie.',
+'backend-fail-connect' => 'Kon nie aan die agterliggende stoorspasie konnekteer nie "$1".',
+'backend-fail-internal' => "'n Onbekende fout het in die agterliggende stoorspasie $1 voorgekom.",
+'backend-fail-contenttype' => 'Kon nie die inhoudstipe van die lêer bepaal om na "$1" te stoor nie.',
+'backend-fail-batchsize' => "Die agterliggende stoorspasie het 'n groep van $1 {{PLURAL:$1|operasie|operasies}} ontvang; die limiet is $2 {{PLURAL:$2|operasie|operasies}}.",
+'backend-fail-usable' => 'Kon nie na die lêer "$1" skryf nie vanweë onvoldoende regte of gidse wat nie bestaan nie.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Kon nie na die joernaal-databasis op die agterliggende stoorspasie "$1" konnekteer nie.',
+'filejournal-fail-dbquery' => 'Kon nie die joernaal-databasis op die agterliggende stoorspasie "$1" bywerk nie.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kon nie "$1" ontgrendel nie omdat dit nie gesluit is nie.',
+'lockmanager-fail-closelock' => 'Kon nie die slotlêer vir "$1" te sluit nie.',
+'lockmanager-fail-deletelock' => 'Kon nie die slotlêer vir "$1" skrap nie.',
+'lockmanager-fail-acquirelock' => 'Kon nie "$1" vergrendel nie.',
+'lockmanager-fail-openlock' => 'Kon nie die slotlêer vir "$1" oopmaak nie.',
+'lockmanager-fail-releaselock' => 'Kon nie "$1" ontgrendel nie.',
+'lockmanager-fail-db-bucket' => 'Dit was nie moontlik om voldoende vergrendel-databasisse in die houer $1 te kontak nie.',
+'lockmanager-fail-db-release' => "Kon nie 'n vergrendeling op databasis $1 ophef nie.",
+'lockmanager-fail-svr-acquire' => "Kon nie 'n vergrendeling op bediener $1 verkry nie.",
+'lockmanager-fail-svr-release' => 'Kon nie vergrandeling op bediener $1 ophef nie.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => "'n Fout het voorgekom met die opening van die lêer vir ZIP toetsing.",
@@ -1747,7 +1799,7 @@ Dit kan nie behoorlik vir sekuriteit nagegaan word nie.",
 'img-auth-nopathinfo' => 'PATH_INFO word vermis.
 U bediener is nie ingestel om hierdie inligting deur te stuur nie.
 Miskien gebruik dit CGI, waartydens img_auth nie ondersteun word nie.
-[https://www.mediawiki.org/wiki/Manual:Image_Authorization Sien regte vir beelde] vir meer inligting.',
+Sien https://www.mediawiki.org/wiki/Manual:Image_Authorization vir meer inligting.',
 'img-auth-notindir' => 'Die aangevraagde pad is nie die ingestelde oplaaigids nie.',
 'img-auth-badtitle' => 'Dit was nie moontlik om \'n geldige bladsynaam van "$1" te maak nie.',
 'img-auth-nologinnWL' => 'U is nie aangeteken en "$1" is nie op die witlys nie.',
@@ -1833,6 +1885,10 @@ Die volgende lys vertoon slegs die eerste {{PLURAL:$1|skakel|$1 skakels}} wat na
 Sien die [$2 lêer se beskrywingsblad] vir meer inligting.',
 'sharedupload-desc-here' => 'Hierdie lêer kom vanaf $1 en kan ook in ander projekte gebruik word.
 Die beskrywing op die [$2 lêer se inligtingsblad] word hieronder weergegee.',
+'sharedupload-desc-edit' => 'Hierdie lêer kom van $1 en kan ook in ander projekte gebruik word.
+Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
+'sharedupload-desc-create' => 'Hierdie lêer kom van $1 en kan ook in ander projekte gebruik word.
+Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 'filepage-nofile' => "Daar bestaan nie 'n lêer met die naam nie.",
 'filepage-nofile-link' => "Daar bestaan nie 'n lêer met die naam nie, maar u kan een [$1 oplaai].",
 'uploadnewversion-linktext' => "Laai 'n nuwe weergawe van hierdie lêer",
@@ -1871,7 +1927,7 @@ Die beskrywing op die [$2 lêer se inligtingsblad] word hieronder weergegee.',
 
 # MIME search
 'mimesearch' => 'MIME-soek',
-'mimesearch-summary' => 'Hierdie bladsy maak dit moontlik om lêers te filtreer volgens hulle MIME-tipe. Invoer: inhoudtipe/subtipe, byvoorbeeld <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Hierdie bladsy maak dit moontlik om lêers te filtreer volgens hulle MIME-tipe. Invoer: inhoudtipe/subtipe, byvoorbeeld <code>image/jpeg</code>.',
 'mimetype' => 'MIME-tipe:',
 'download' => 'laai af',
 
@@ -1917,8 +1973,8 @@ Die beskrywing op die [$2 lêer se inligtingsblad] word hieronder weergegee.',
 
 'disambiguations' => 'Bladsye wat na dubbelsinnigheidsbladsye skakel',
 'disambiguationspage' => 'Template:Dubbelsinnig',
-'disambiguations-text' => "Die volgende bladsye skakel na '''dubbelsinnigheidsbladsye'''.
-Die bladsye moet gewysig word om eerder direk na die regte onderwerpe te skakel.<br />
+'disambiguations-text' => "Die volgende bladsye het ten minste een skakel na 'n '''dubbelsinnigheidsbladsy'''.
+Hulle moet gewysig word om eerder direk na die regte onderwerpe te skakel.<br />
 'n Bladsy word beskou as 'n dubbelsinnigheidsbladsy as dit 'n sjabloon bevat wat geskakel is vanaf [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Dubbele aansture',
@@ -1964,6 +2020,8 @@ Elke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste re
 'wantedpages' => 'Begeerde bladsye',
 'wantedpages-badtitle' => 'Ongeldige bladsynaam in resultate: $1',
 'wantedfiles' => 'Begeerde lêers',
+'wantedfiletext-cat' => 'Die volgende lêers word gebruik, maar bestaan nie. Lêers van eksterne biblioteke kan, ondanks die feit dat hulle wel bestaan, ook hier gelys wees. Hierdie vals positiewes word as <del>deurgehaal aangedui</del>. Bladsye met lêers wat nie bestaan nie word aangegee by [[:$1]].',
+'wantedfiletext-nocat' => 'Die volgende lêers word gebruik, maar bestaan nie. Lêers van eksterne biblioteke kan, ondanks die feit dat hulle wel bestaan, ook hier gelys wees. Hierdie vals positiewes word as <del>deurgehaal aangedui</del>.',
 'wantedtemplates' => 'Begeerde sjablone',
 'mostlinked' => 'Bladsye met meeste skakels daarheen',
 'mostlinkedcategories' => 'Kategorieë met die meeste skakels daarheen',
@@ -2024,6 +2082,7 @@ Dit is dus moontlik dat 'n lêer hier gelys word terwyl dit tog in gebruik is.",
 U kan die resultate vernou deur 'n boekstaaftipe, gebruikersnaam (kas-sensitief) of spesifieke blad (ook kas-sensitief) te kies.",
 'logempty' => 'Geen inskrywings in die logboek voldoen aan die kriteria nie.',
 'log-title-wildcard' => 'Soek bladsye wat met die naam begin',
+'showhideselectedlogentries' => 'Wys/versteek gekose logboekreëls',
 
 # Special:AllPages
 'allpages' => 'Alle bladsye',
@@ -2068,8 +2127,9 @@ Sie ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].',
 'linksearch-pat' => 'Soekpatroon:',
 'linksearch-ns' => 'Naamruimte:',
 'linksearch-ok' => 'Soek',
-'linksearch-text' => 'Patrone soos "*.wikipedia.org" of "*.org" kan gebruik word.<br />
-Ondersteunde protokolle: <tt>$1</tt>',
+'linksearch-text' => 'Patrone soos "*.wikipedia.org" kan gebruik word.<br />
+Benodig ten minste een topvlakdomein, soos byvoorbeeld "*.org".<br />
+Ondersteunde protokolle: <code>$1</code> (moenie hierdie in u soektog gebruik nie)',
 'linksearch-line' => '$1 geskakel vanaf $2',
 'linksearch-error' => 'Patrone kan slegs aan die begin van die rekenaarnaam geplaas word.',
 
@@ -2261,6 +2321,8 @@ Tree asseblief versigtig op.",
 'rollback' => 'Rol veranderinge terug',
 'rollback_short' => 'Rol terug',
 'rollbacklink' => 'Rol terug',
+'rollbacklinkcount' => 'rol {{PLURAL:$1|een wysiging|$1 wysigings}} terug',
+'rollbacklinkcount-morethan' => 'rol meer as {{PLURAL:$1|een wysiging|$1 wysigings}} terug',
 'rollbackfailed' => 'Terugrol onsuksesvol',
 'cantrollback' => 'Kan nie na verandering terug keer nie; die laaste bydraer is die enigste outer van hierdie bladsy.',
 'alreadyrolled' => "Dit is nie moontlik om die laaste wysiging van die bladsy [[:$1]] deur [[User:$2|$2]] ([[User talk:$2|bespreking]]{{int:pipe-separator}}[[Special:Contributions/$2|bydraes]]) ongedaan te maak nie.
@@ -2489,8 +2551,8 @@ Vul 'n spesifieke rede hier onder in (haal byvoorbeeld spesifieke bladsye wat ge
 'ipb-confirm' => 'Bevestig blokkade',
 'badipaddress' => 'Die IP-adres is nie in die regte formaat nie.',
 'blockipsuccesssub' => 'Blokkering het geslaag',
-'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] is geblokkeer.<br />
-Sien die [[Special:BlockList|IP-bloklys]] vir 'n oorsig van blokkerings.",
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] is geblokkeer.<br />
+Sien die [[Special:BlockList|bloklys]] vir onlangse blokkades.',
 'ipb-blockingself' => 'U is besig om uself te blokkeer! Is u seker u wil dit doen?',
 'ipb-confirmhideuser' => 'U staan op die punt om \'n "versteekte gebruiker" te blokkeer. Dit sal die gebruiker se naam vanaf alle lyste en logboeke onderdruk. Is u seker u wil om dit te doen?',
 'ipb-edit-dropdown' => 'Werk lys van redes by',
@@ -2542,8 +2604,9 @@ Die blokkeerlogboek word hieronder ter verwysing weergegee:',
 Die verbergingslogboek word hieronder ter verwysing weergegee:',
 'blocklogentry' => '"[[$1]]" is vir \'n periode van $2 $3 geblok',
 'reblock-logentry' => 'het die instellings vir die blokkade vir [[$1]] gewysig. Dit verval nou op $2 om $3',
-'blocklogtext' => "Hier is 'n lys van onlangse blokkeer en deblokkeer aksies. Outomaties geblokkeerde IP-adresse word nie vertoon nie.
-Sien die [[Special:BlockList|IP-bloklys]] vir geblokkeerde adresse.",
+'blocklogtext' => "Hierdie is 'n lys van onlangse blokkeer- en deblokkeer-aksies.
+Outomaties geblokkeerde IP-adresse word nie vertoon nie.
+Sien die [[Special:BlockList|bloklys]] vir tans geblokkeerde adresse.",
 'unblocklogentry' => 'blokkade van $1 is opgehef:',
 'block-log-flags-anononly' => 'anonieme gebruikers alleenlik',
 'block-log-flags-nocreate' => 'registrasie van gebruikers geblokkeer',
@@ -2789,6 +2852,9 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'import-invalid-interwiki' => 'Kan nie vanaf die gespesifiseerde importeer nie.',
 'import-error-edit' => 'Die bladsy "$1" is nie geïmporteer nie omdat u nie die regte het om dit te wysig nie.',
 'import-error-create' => 'Die bladsy "$1" is nie geïmporteer nie omdat u nie die regte het om dit te skep nie.',
+'import-error-interwiki' => 'Die bladsy "$1" is nie geïmporteer nie omdat sy naam vir eksterne skakeling (interwiki) gereserveer is.',
+'import-error-special' => 'Die bladsy "$1" is nie geïmporteer nie omdat dit aan \'n spesiale naamruimte behoort waarin geen bladsye geplaas kan word nie.',
+'import-error-invalid' => 'Die bladsy "$1" is nie geïmporteer nie omdat die naam ongeldig is.',
 
 # Import log
 'importlogpage' => 'Invoer logboek',
@@ -2802,6 +2868,12 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'javascripttest' => 'JavaScript toetsing',
 'javascripttest-disabled' => 'Die funksie is nie op hierdie wiki geaktiveer nie.',
 'javascripttest-title' => 'Voer toetse uit vir $1',
+'javascripttest-pagetext-noframework' => 'Hierdie bladsy is gereserveer vir die uitvoer van JavaScript-toetse.',
+'javascripttest-pagetext-unknownframework' => 'Onbekende toetsraamwerk "$1".',
+'javascripttest-pagetext-frameworks' => 'Kies een van die volgende toetsraamwerke: $1',
+'javascripttest-pagetext-skins' => "Kies 'n omslag waarmee die toets uitgevoer moet word:",
+'javascripttest-qunit-intro' => 'Sien die [$1 toetsdokumentasie] op mediawiki.org.',
+'javascripttest-qunit-heading' => 'QUnit toetssuite vir MediaWiki JavaScript',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'U gebruikerbladsy',
@@ -2899,19 +2971,15 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
 'spambot_username' => 'MediaWiki opruiming van spam',
 'spam_reverting' => 'Besig met terugrol na die laaste weergawe wat nie skakels na $1 bevat nie',
 'spam_blanking' => "Alle weergawes met 'n skakel na $1 word verwyder",
+'spam_deleting' => 'Alle weergawes bevat verwysings na $1. Bladsy verwyder',
 
 # Info page
 'pageinfo-title' => 'Inligting oor "$1"',
-'pageinfo-header-edits' => 'Wysigings',
-'pageinfo-header-watchlist' => 'Dophoulys',
-'pageinfo-header-views' => 'Kere gewys',
-'pageinfo-subjectpage' => 'Bladsy',
-'pageinfo-talkpage' => 'Besprekingsblad',
-'pageinfo-watchers' => 'Aantal dophouers',
-'pageinfo-edits' => 'Aantal wysigings',
-'pageinfo-authors' => 'Aantal verskillende outeurs',
+'pageinfo-header-edits' => 'Wysigingsgeskiedenis',
 'pageinfo-views' => 'Aantal kere gewys',
-'pageinfo-viewsperedit' => 'Kere gewys per wysiging',
+'pageinfo-watchers' => 'Aantal dophouers',
+'pageinfo-edits' => 'Totale aantal wysigings',
+'pageinfo-authors' => 'Totale aantal verskillende outeurs',
 
 # Skin names
 'skinname-standard' => 'Standaard',
@@ -3633,7 +3701,7 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 * <span class="mw-specialpagecached">Spesiale bladsye met gegewens uit die kas (kan verouderd wees).</span>',
 'specialpages-group-maintenance' => 'Onderhoud verslae',
 'specialpages-group-other' => 'Ander spesiale bladsye',
-'specialpages-group-login' => 'Inteken / aansluit',
+'specialpages-group-login' => 'Meld aan / registreer',
 'specialpages-group-changes' => 'Onlangse wysigings en boekstawings',
 'specialpages-group-media' => 'Media verslae en oplaai',
 'specialpages-group-users' => 'Gebruikers en regte',
@@ -3716,6 +3784,7 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'logentry-delete-event-legacy' => '$1 het die sigbaarheid van logboekreëls van $3 gewysig',
 'logentry-delete-revision-legacy' => '$1 het die sigbaarheid van weergawes van die bladsy $3 gewysig.',
 'logentry-suppress-delete' => '$1 het die bladsy $3 onderdruk',
+'logentry-suppress-event' => "$1 het in die geheim die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
 'logentry-suppress-revision' => "$1 het in die geheim die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van die bladsy $3 gewysig: $4",
 'logentry-suppress-event-legacy' => '$1 het in die geheim die sigbaarheid van logboekreëls van $3 gewysig',
 'logentry-suppress-revision-legacy' => '$1 het in die geheim die sigbaarheid van weergawes van die bladsy $3 gewysig',
@@ -3740,6 +3809,8 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'newuserlog-byemail' => 'wagwoord is per e-pos versend',
 
 # Feedback
+'feedback-bugornote' => 'As u reg is om \'n tegniese probleem in detail te beskryf, [$1 rapporteer \'n fout].
+Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die bladsy "[$3 $2]", saam met u gebruikersnaam en die webblaaier wat u gebruik gevoeg word.',
 'feedback-subject' => 'Onderwerp:',
 'feedback-message' => 'Boodskap:',
 'feedback-cancel' => 'Kanselleer',
@@ -3757,14 +3828,19 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'api-error-badaccess-groups' => 'U word nie toegelaat om lêers te laai op hierdie wiki.',
 'api-error-badtoken' => 'Interne fout: slegte teken.',
 'api-error-copyuploaddisabled' => 'Oplaai via URL is gedeaktiveer op hierdie bediener.',
+'api-error-duplicate' => "Daar {{PLURAL:$1|is al [$2 'n lêer]|is al [$2 lêers]}} met dieselfde inhoud op die wiki.",
+'api-error-duplicate-archive' => "Daar {{PLURAL:$1|was [$2 'n ander lêer]|was [$2 ander lêers]}} op hierdie webtuiste met dieselfde inhoud, maar {{PLURAL:$1|dit is|dit is}} geskrap.",
 'api-error-duplicate-archive-popup-title' => 'Duplikaat {{PLURAL:$1|lêer|lêers}} wat al verwyder is.',
 'api-error-duplicate-popup-title' => 'Duplikaat {{PLURAL:$1|lêer|lêers}}',
 'api-error-empty-file' => 'Die lêer wat u probeer oplaai is leeg.',
 'api-error-emptypage' => 'Die skep van leë nuwe bladsye word nie toegelaat nie.',
 'api-error-fetchfileerror' => 'Interne fout: Iets het verkeerd gegaan met die haal van die lêer.',
+'api-error-fileexists-forbidden' => 'Daar is reeds \'n lêer met die naam "$1" wat nie oorskryf kan word nie.',
+'api-error-fileexists-shared-forbidden' => 'Daar is reeds \'n lêer met die naam "$1" in die gedeelde lêerstoor, en kan nie oorskryf word nie.',
 'api-error-file-too-large' => 'Die lêer wat u probeer oplaai is te groot.',
 'api-error-filename-tooshort' => 'Die lêernaam is te kort.',
 'api-error-filetype-banned' => 'Hierdie tipe lêer is verban en word nie toegelaat nie.',
+'api-error-filetype-banned-type' => 'Die {{PLURAL:$4|lêertipe|lêertipes}} $1 word nie toegelaat nie. Toelaatbare {{PLURAL:$3|lêertipes|lêertipes}} is $2.',
 'api-error-filetype-missing' => "Die lêer het nie 'n uitbreiding nie.",
 'api-error-hookaborted' => "Die wysiging wat jy probeer maak, is deur 'n uitbreiding haak geaborteer.",
 'api-error-http' => "Interne fout: Kan nie 'n verbinding met die bediener maak nie.",
index 0c96ecb..f59821a 100644 (file)
  * @author Paa.kwesi
  */
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Medya',
+       NS_SPECIAL          => 'Spesial',
+       NS_TALK             => 'Nkɔmbɔ',
+       NS_USER             => 'User',
+       NS_USER_TALK        => 'User_nkɔmbɔ',
+       NS_PROJECT_TALK     => '$1_nkɔmbɔ',
+       NS_FILE             => 'Fayl',
+       NS_FILE_TALK        => 'Fayl_nkɔmbɔ',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_nkɔmbɔ',
+       NS_TEMPLATE         => 'Şablon',
+       NS_TEMPLATE_TALK    => 'Şablon_nkɔmbɔ',
+       NS_HELP             => 'Help',
+       NS_HELP_TALK        => 'Help_nkɔmbɔ',
+       NS_CATEGORY         => 'Kategori',
+       NS_CATEGORY_TALK    => 'Kategori_nkɔmbɔ',
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline'             => 'Twa lenk nyina ase:',
index 44d6642..9a1f89d 100644 (file)
@@ -54,16 +54,16 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'currentmonth'            => array( '1', 'MUEJIAKTUAL', 'MUEJIAKTUAL2', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MUEJIAKTUAL1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'EMNIMUEJITAKTUAL', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
-       'currenttime'             => array( '1', 'KOHATASH', 'KOHATANI', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ORATASH', 'ORATANI', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MUEJILOKAL', 'MUAJILOKAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'img_center'              => array( '1', 'qendër', 'qendrore', 'qëndër', 'qëndrore', 'center', 'centre' ),
-       'img_baseline'            => array( '1', 'vijabazë', 'linjabazë', 'baseline' ),
-       'servername'              => array( '0', 'EMNISERVERIT', 'EMRIISERVERIT', 'SERVERNAME' ),
-       'currentweek'             => array( '1', 'JAVAAKTUALE', 'JAVAMOMENTALE', 'CURRENTWEEK' ),
+       'currentmonth'              => array( '1', 'MUEJIAKTUAL', 'MUEJIAKTUAL2', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'MUEJIAKTUAL1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'EMNIMUEJITAKTUAL', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
+       'currenttime'               => array( '1', 'KOHATASH', 'KOHATANI', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ORATASH', 'ORATANI', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MUEJILOKAL', 'MUAJILOKAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'img_center'                => array( '1', 'qendër', 'qendrore', 'qëndër', 'qëndrore', 'center', 'centre' ),
+       'img_baseline'              => array( '1', 'vijabazë', 'linjabazë', 'baseline' ),
+       'servername'                => array( '0', 'EMNISERVERIT', 'EMRIISERVERIT', 'SERVERNAME' ),
+       'currentweek'               => array( '1', 'JAVAAKTUALE', 'JAVAMOMENTALE', 'CURRENTWEEK' ),
 );
 
 $messages = array(
@@ -108,7 +108,6 @@ $messages = array(
 'tog-watchlisthideliu' => "Mshef redaktimet e përdoruesve t'kyçun prej listës së vrojtimit",
 'tog-watchlisthideanons' => 'Mshef redaktimet e anonimëve prej listës së vrojtimit',
 'tog-watchlisthidepatrolled' => 'Mshef redaktimet e mbikëqyruna prej listës së vrojtimit',
-'tog-nolangconversion' => 'Mos lejo konvertimin e variantëve',
 'tog-ccmeonemails' => 'Më ço kopje të mesazheve qi ua dërgoj të tjerëve',
 'tog-diffonly' => 'Mos e trego përmbajtjen e faqes nën ndryshimin',
 'tog-showhiddencats' => 'Trego kategoritë e mshefta',
index 2aa5d28..22468f8 100644 (file)
@@ -1017,17 +1017,17 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'large-file' => 'የፋይል መጠን ከ$1 በላይ እንዳይሆን ይመከራል፤ የዚህ ፋይል መጠን $2 ነው።',
 'largefileserver' => 'ይህ ፋይል ሰርቨሩ ከሚችለው መጠን በላይ ነው።',
 'emptyfile' => 'የላኩት ፋይል ባዶ እንደ ሆነ ይመስላል። ይህ ምናልባት በፋይሉ ስም አንድ ግድፋት ስላለ ይሆናል። እባክዎ ይህን ፋይል በውኑ መላክ እንደ ፈለጉ ያረጋግጡ።',
-'fileexists' => "ይህ ስም ያለው ፋይል አሁን ይኖራል፤ እባክዎ እሱም ለመቀየር እንደፈለጉ እርግጥኛ ካልሆኑ '''<tt>[[:$1]]</tt>''' ይመለከቱ።
-[[$1|thumb]]",
-'filepageexists' => "የዚሁ ፋኡል መግለጫ ገጽ ከዚህ በፊት በ'''<tt>[[:$1]]</tt>''' ተፈጥሯል፤ ነገር ግን ይህ ስም ያለበት ፋይል አሁን አይኖርም። ስለዚህ ያቀረቡት ማጠቃለያ በመግለጫው ገጽ አይታይም። መግለጫዎ በዚያ እንዲታይ በእጅ ማስገባት ይኖርብዎታል።",
-'fileexists-extension' => "ተመሳሳይ ስም ያለበት ፋይል ይኖራል፦[[$2|thumb]]
-* የሚላክ ፋይል ስም፦ '''<tt>[[:$1]]</tt>'''
-* የሚኖር (የቆየው) ፋይል ስም፦ '''<tt>[[:$2]]</tt>'''
-እባክዎ ሌላ ስም ይምረጡ።",
+'fileexists' => 'ይህ ስም ያለው ፋይል አሁን ይኖራል፤ እባክዎ እሱም ለመቀየር እንደፈለጉ እርግጥኛ ካልሆኑ <strong>[[:$1]]</strong> ይመለከቱ።
+[[$1|thumb]]',
+'filepageexists' => 'የዚሁ ፋኡል መግለጫ ገጽ ከዚህ በፊት በ<strong>[[:$1]]</strong> ተፈጥሯል፤ ነገር ግን ይህ ስም ያለበት ፋይል አሁን አይኖርም። ስለዚህ ያቀረቡት ማጠቃለያ በመግለጫው ገጽ አይታይም። መግለጫዎ በዚያ እንዲታይ በእጅ ማስገባት ይኖርብዎታል።',
+'fileexists-extension' => 'ተመሳሳይ ስም ያለበት ፋይል ይኖራል፦[[$2|thumb]]
+* የሚላክ ፋይል ስም፦ <strong>[[:$1]]</strong>
+* የሚኖር (የቆየው) ፋይል ስም፦ <strong>[[:$2]]</strong>
+እባክዎ ሌላ ስም ይምረጡ።',
 'fileexists-thumbnail-yes' => "ፋይሉ የተቀነሰ መጠን ያለበት ስዕል ''(ናሙና)'' እንደ ሆነ ይመስላል። [[$1|thumb]]
-እባክዎ ፋይሉን '''<tt>[[:$1]]</tt>''' ይመለከቱ።
+እባክዎ ፋይሉን <strong>[[:$1]]</strong> ይመለከቱ።
 ያው ፋይል ለዚሁ ፋይል አንድ አይነት በኦሪጂናሉ መጠን ቢሆን ኖሮ፣ ተጨማሪ ናሙና መላክ አያስፈልግም።",
-'file-thumbnail-no' => "የፋይሉ ስም በ'''<tt>$1</tt>''' ይጀመራል። የተቀነሰ መጠን ያለበት ስዕል ''(ናሙና)'' እንደ ሆነ ይመስላል። ይህን ስዕል በሙሉ ማጉላት ካለዎ፣ ይህን ይላኩ፤ አለዚያ እባክዎ የፋይሉን ስም ይቀይሩ።",
+'file-thumbnail-no' => "የፋይሉ ስም በ<strong>$1</strong> ይጀመራል። የተቀነሰ መጠን ያለበት ስዕል ''(ናሙና)'' እንደ ሆነ ይመስላል። ይህን ስዕል በሙሉ ማጉላት ካለዎ፣ ይህን ይላኩ፤ አለዚያ እባክዎ የፋይሉን ስም ይቀይሩ።",
 'fileexists-forbidden' => 'በዚህ ስም የሚኖር ፋይል ገና አለ፤ እባክዎ ተመልሰው ይህን ፋይል በአዲስ ስም ስር ይልኩት። [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'ይህ ስም ያለበት ፋይል አሁን በጋራ ፋይል ምንጭ ይኖራል፤ እባክዎ ተመልሰው ፋይሉን በሌላ ስም ስር ይላኩት። [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'ይህ ፋይል {{PLURAL:$1|የሚከተለው ፋኡል|የሚከተሉት ፋይሎች}} ቅጂ ነው፦',
@@ -2278,6 +2278,7 @@ $3
 'api-error-file-too-large' => 'የላኩት ፋይል በጣም ትልቅ ነበር።',
 'api-error-filename-tooshort' => 'የፋይሉ ስም በጣም ትንሽ ነው።',
 'api-error-filetype-banned' => 'የዚህ ዓይነት ፋይል ተከልክሏል።',
+'api-error-filetype-banned-type' => '$1 ያልተፈቀደ ፋይል አይነት ነው። የተፈቀዱት ፋይል አይነቶች $2 ናቸው።',
 'api-error-filetype-missing' => 'ፋይሉ ቅጥያ ይጎለዋል።',
 'api-error-illegal-filename' => 'የፋይሉ ስም የተፈቀደ አይደለም።',
 'api-error-invalid-file-key' => 'የውስጥ ስህተት: ፍይሉ የጊዜያዊ ማስቀመጫ ውስጥ አልተገኘም።',
index 0818bdc..293616c 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Aragonese (Aragonés)
+/** Aragonese (aragonés)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -47,16 +47,16 @@ $namespaceAliases = array(
 $namespaceGenderAliases = array();
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ENDRECERA', '#REENDRECERA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
-       'namespace'               => array( '1', 'ESPACIODENOMBRES', 'ESPACIODENOMBRE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ESPACIODENOMBRESE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
-       'img_right'               => array( '1', 'dreita', 'derecha', 'dcha', 'der', 'right' ),
-       'img_left'                => array( '1', 'cucha', 'zurda', 'izquierda', 'izda', 'izq', 'left' ),
-       'ns'                      => array( '0', 'EN:', 'EDN:', 'NS:' ),
-       'displaytitle'            => array( '1', 'TÍTOL', 'MOSTRARTÍTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
-       'currentversion'          => array( '1', 'BERSIÓNAUTUAL', 'BERSIONAUTUAL', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
-       'language'                => array( '0', '#LUENGA:', '#IDIOMA:', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'especial', 'espezial', 'special' ),
+       'redirect'                  => array( '0', '#ENDRECERA', '#REENDRECERA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+       'namespace'                 => array( '1', 'ESPACIODENOMBRES', 'ESPACIODENOMBRE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ESPACIODENOMBRESE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
+       'img_right'                 => array( '1', 'dreita', 'derecha', 'dcha', 'der', 'right' ),
+       'img_left'                  => array( '1', 'cucha', 'zurda', 'izquierda', 'izda', 'izq', 'left' ),
+       'ns'                        => array( '0', 'EN:', 'EDN:', 'NS:' ),
+       'displaytitle'              => array( '1', 'TÍTOL', 'MOSTRARTÍTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
+       'currentversion'            => array( '1', 'BERSIÓNAUTUAL', 'BERSIONAUTUAL', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#LUENGA:', '#IDIOMA:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'especial', 'espezial', 'special' ),
 );
 
 $specialPageAliases = array(
@@ -172,7 +172,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Amagar en a lista de seguimiento as edicions feitas por usuarios rechistratos',
 'tog-watchlisthideanons' => 'Amagar en a lista de seguimiento as edicions feitas por usuarios anonimos.',
 'tog-watchlisthidepatrolled' => 'Amagar as edicions patrullatas en a lista de seguimiento',
-'tog-nolangconversion' => 'Desautibar conversión de bariants',
 'tog-ccmeonemails' => 'Recibir copias de os correus que ninvío ta atros usuarios',
 'tog-diffonly' => "No amostrar o conteniu d'a pachina debaixo d'as esferencias",
 'tog-showhiddencats' => 'Amostrar categorías amagatas',
@@ -1452,9 +1451,9 @@ T'a suya conveniencia s'su conveniencia se muestra aquí el registro de supresio
 Ta veyer u mirar fichers cargatas denantes vaiga t'a [[Special:FileList|lista de fichers cargatos]]. As cargas y recargas tamién se rechistran en o [[Special:Log/upload|rechistro de cargas]], y os borraus en o [[Special:Log/delete|rechistro de borraus]].
 
 Ta incluyir un fichero en una pachina, emplegue un vinclo d'una d'istas trazas
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichero.jpg]]</nowiki></tt>''' ta fer servir a version completa d'o fichero,
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichero.png|200px|thumb|left|texto alternativo]]</nowiki></tt>''' ta fer serivr una versión de 200 píxels d'amplaria en una caixa a la marguin cucha con 'texto alternativo' como descripción
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichero.ogg]]</nowiki></tt>''' ta fer un vinclo dreitament ta o fichero sin amostrar-lo.",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichero.jpg]]</nowiki></code>''' ta fer servir a version completa d'o fichero,
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichero.png|200px|thumb|left|texto alternativo]]</nowiki></code>''' ta fer serivr una versión de 200 píxels d'amplaria en una caixa a la marguin cucha con 'texto alternativo' como descripción
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichero.ogg]]</nowiki></code>''' ta fer un vinclo dreitament ta o fichero sin amostrar-lo.",
 'upload-permitted' => 'Tipos de fichero premititos: $1.',
 'upload-preferred' => 'Tipos de fichero preferitos: $1.',
 'upload-prohibited' => 'Tipos de fichero vedatos: $1.',
@@ -1495,20 +1494,20 @@ Ta incluyir un fichero en una pachina, emplegue un vinclo d'una d'istas trazas
 'largefileserver' => "A grandaria d'iste fichero ye mayor d'a que a confeguración d'iste servidor premite.",
 'emptyfile' => 'Parixe que o fichero que se miraba de cargar ye buedo; por favor, comprebe que ixe ye reyalment o fichero que quereba cargar.',
 'windows-nonascii-filename' => 'Iste wiki no admite nombres de fichero con caracters especials.',
-'fileexists' => "Ya bi ha un fichero con ixe nombre.
-Por favor, Por favor mire-se o fichero existent '''<tt>[[:$1]]</tt>''' si no ye seguro de querer sustituyir-lo.
-[[$1|thumb]]",
-'filepageexists' => "A pachina de descripción d'iste fichero ya s'ha creyau en '''<tt>[[:$1]]</tt>''', pero no i hai garra fichero con iste nombre. O resumen que escriba no amaneixerá en a pachina de descripción.
+'fileexists' => 'Ya bi ha un fichero con ixe nombre.
+Por favor, Por favor mire-se o fichero existent <strong>[[:$1]]</strong> si no ye seguro de querer sustituyir-lo.
+[[$1|thumb]]',
+'filepageexists' => "A pachina de descripción d'iste fichero ya s'ha creyau en <strong>[[:$1]]</strong>, pero no i hai garra fichero con iste nombre. O resumen que escriba no amaneixerá en a pachina de descripción.
 Si quiere que o suyo resumen amaneixca aquí, habrá d'editar-lo manualment.
 [[$1|thumb]]",
 'fileexists-extension' => "Ya bi ha un fichero con un nombre pareixiu: [[$2|thumb]]
-* Nombre d'o fichero que ye cargando: '''<tt>[[:$1]]</tt>'''
-* Nombre d'o fichero ya existent: '''<tt>[[:$2]]</tt>'''
+* Nombre d'o fichero que ye cargando: <strong>[[:$1]]</strong>
+* Nombre d'o fichero ya existent: <strong>[[:$2]]</strong>
 Por favor, trigue un nombre diferent.",
 'fileexists-thumbnail-yes' => "Pareix que o fichero ye una imachen chicota ''(miniatura)''. [[$1|thumb]]
-Comprebe por favor o fichero '''<tt>[[:$1]]</tt>'''.
+Comprebe por favor o fichero <strong>[[:$1]]</strong>.
 Si o fichero comprebato ye a mesma imachen en tamanyo orichinal no cal cargar una nueva miniatura.",
-'file-thumbnail-no' => "O nombre d'o fichero prencipia con '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "O nombre d'o fichero prencipia con <strong>$1</strong>.
 Pareix que estase una imachen achiquida ''(thumbnail)''.
 Si tiene ista imachen a toda resolución, cargue-la, si no, por favor, cambee o nombre d'o fichero.",
 'fileexists-forbidden' => 'Ya bi ha un fichero con iste nombre, y no se puet sobrescribir.
@@ -1753,7 +1752,7 @@ Debaixo s'amuestra a descripción d'a suya [$2 pachina de descripción].",
 
 # MIME search
 'mimesearch' => 'Mirar por tipo MIME',
-'mimesearch-summary' => 'Ista pachina premite filtrar fichers seguntes o suyo tipo MIME. Escribir: tipodeconteniu/subtipo, por exemplo <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Ista pachina premite filtrar fichers seguntes o suyo tipo MIME. Escribir: tipodeconteniu/subtipo, por exemplo <code>image/jpeg</code>.',
 'mimetype' => 'Tipo MIME:',
 'download' => 'descargar',
 
@@ -1945,7 +1944,7 @@ Se veigan tamién as [[Special:WantedCategories|categorías requiestas]].",
 'linksearch-ok' => 'Mirar',
 'linksearch-text' => 'Pueden usar-se carácters comodín como "*.wikipedia.org".
 A lo menos aprecisa un dominio de maximo libel, como "*.org".<br />
-Protocolos suportados: <tt>$1</tt> (no los adhiba en a suya busca).',
+Protocolos suportados: <code>$1</code> (no los adhiba en a suya busca).',
 'linksearch-line' => '$1 tiene un vinclo dende $2',
 'linksearch-error' => "Os carácters comodín nomás pueden apareixer en o prencipio d'o nombre d'o sitio.",
 
@@ -2078,7 +2077,7 @@ Contacto con l\'editor:
 correu-e: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Si no visita a pachina, no recibirá mas notificacions de futuros cambios cambios.
+Si no visita a pachina, no recibirá mas notificacions de futuros cambios cambios. 
 Tamién puet cambiar o modo de notificación d\'as pachinas que cosira en a suya lista de seguimiento.
 Atentament,
 O servicio de notificacions d\'o prochecto {{SITENAME}}
@@ -2148,7 +2147,7 @@ Torne t'a pachina anterior, recargue a pachina y torne a prebar alavez.",
 
 # Protect
 'protectlogpage' => 'Rechistro de proteccions de pachinas',
-'protectlogtext' => "Contino s'amuestra una lista de cambios en a protección d'as pachinas.
+'protectlogtext' => "Contino s'amuestra una lista de cambios en a protección d'as pachinas. 
 Se veiga a [[Special:ProtectedPages|lista de pachinas protechitas]] ta conoixer a lista de proteccions de pachinas actualment operacional.",
 'protectedarticle' => "s'ha protechito [[$1]]",
 'modifiedarticleprotection' => 's\'ha cambiato o livel de protección de "[[$1]]"',
@@ -2792,15 +2791,10 @@ Puede veyer-ne, manimenos, o codigo fuent.',
 # Info page
 'pageinfo-title' => 'Información ta «$1»',
 'pageinfo-header-edits' => 'Edicions',
-'pageinfo-header-watchlist' => 'Lista de seguimiento',
-'pageinfo-header-views' => 'Vistas',
-'pageinfo-subjectpage' => 'Pachina',
-'pageinfo-talkpage' => 'Pachina de descusión',
+'pageinfo-views' => 'Numero de vistas',
 'pageinfo-watchers' => "Numero d'usuarios que la cosiran",
 'pageinfo-edits' => "Numero d'edicions",
 'pageinfo-authors' => "Numero d'autors diferents",
-'pageinfo-views' => 'Numero de vistas',
-'pageinfo-viewsperedit' => 'Vistas por edición',
 
 # Skin names
 'skinname-standard' => 'Clasica (Classic)',
@@ -3481,7 +3475,7 @@ Tamién puede fer servir o [[Special:EditWatchlist|editor estándar]].",
 'version-license' => 'Licencia',
 'version-poweredby-credits' => "Iste wiki funciona gracias a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'atros',
-'version-license-info' => "MediaWiki ye software libre, puet redistribuyir-lo y/u modificar-lo baixo os terminos d'a Licencia Publica Cheneral GNU publicada por a Free Software Foundation, ya siga d'a suya versión 2 u (a la suya esleción) qualsiquier versión posterior.
+'version-license-info' => "MediaWiki ye software libre, puet redistribuyir-lo y/u modificar-lo baixo os terminos d'a Licencia Publica Cheneral GNU publicada por a Free Software Foundation, ya siga d'a suya versión 2 u (a la suya esleción) qualsiquier versión posterior. 
 
 MediaWiki se distribuye con l'asperanza d'estar d'utilidat, pero SIN GARRA GUARANCIA; nian a guarancia implicita de COMERCIALIZACIÓN u ADEQUACIÓN TA UNA FINALIDAT DETERMINADA. En trobará más detalles en a Licencia Publica General GNU.
 
@@ -3653,6 +3647,7 @@ Si no, puet usar o siguient formulario. O suyo comentario será adhibiu a la pac
 'api-error-file-too-large' => 'O fichero que ninvió yera masiau gran.',
 'api-error-filename-tooshort' => 'O nombre de fichero ye masiau corto.',
 'api-error-filetype-banned' => 'Iste tipo de fichero ye vedau.',
+'api-error-filetype-banned-type' => "{{PLURAL:$4|Os fichers de tipo $1|Os fichers d'os tipos $1}} no se permiten. {{PLURAL:$3|Nomás s'admeten os fichers d'o tipo|Nomás s'admeten os fichers d'os tipos}} $2.",
 'api-error-filetype-missing' => 'O fichero no tiene extensión de fichero.',
 'api-error-hookaborted' => "A modificación que intentés fer estió cancelada por un gancho d'extensión.",
 'api-error-http' => 'Error interna: No se puede connectar ta o servidor.',
index dab4c9b..6c4919e 100644 (file)
@@ -70,7 +70,6 @@ $messages = array(
 '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-nolangconversion' => 'Ne lǣt missenlicnessa æfter āwendungum',
 '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',
index 86f78d2..b85ee8c 100644 (file)
@@ -15,6 +15,7 @@
  * @author Ali1
  * @author Alnokta
  * @author Antime
+ * @author Avocato
  * @author Bassem JARKAS
  * @author Chaos
  * @author Ciphers
@@ -186,158 +187,166 @@ $namespaceGenderAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#تحويل', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__لافهرس__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__لامعرض__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__لصق_فهرس__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__فهرس__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__لاعنوان__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'شهر_حالي', 'شهر_حالي2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'اسم_الشهر_الحالي_المولد', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'اختصار_الشهر_الحالي', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'يوم_حالي', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'يوم_حالي2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'اسم_اليوم_الحالي', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'عام_حالي', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'وقت_حالي', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ساعة_حالية', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'شهر_محلي', 'شهر_محلي2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'شهر_محلي1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'اسم_الشهر_المحلي', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'اسم_الشهر_المحلي_المولد', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'اختصار_الشهر_المحلي', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'يوم_محلي', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'يوم_محلي2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'اسم_اليوم_المحلي', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'عام_محلي', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'وقت_محلي', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ساعة_محلية', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'عدد_الصفحات', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'عدد_المقالات', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'عدد_الملفات', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'اسم_الصفحة', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'عنوان_الصفحة', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'نطاق', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'عنوان_نطاق', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'نطاق_النقاش', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'عنوان_النقاش', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'نطاق_الموضوع', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'اسم_الصفحة_الكامل', 'اسم_صفحة_كامل', 'اسم_كامل', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'عنوان_الصفحة_الكامل', 'عنوان_صفحة_كامل', 'عنوان_كامل', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'اسم_الصفحة_الفرعي', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'عنوان_الصفحة_الفرعي', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'اسم_الصفحة_الأساسي', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'عنوان_الصفحة_الأساسي', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'اسم_صفحة_النقاش', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'عنوان_صفحة_النقاش', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'اسم_صفحة_الموضوع', 'اسم_صفحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'عنوان_صفحة_الموضوع', 'عنوان_صفحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'رسالة:', 'MSG:' ),
-       'subst'                   => array( '0', 'نسخ:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'تصغير', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'يمين', 'right' ),
-       'img_left'                => array( '1', 'يسار', 'left' ),
-       'img_none'                => array( '1', 'بدون', 'بلا', 'none' ),
-       'img_width'               => array( '1', '$1بك', '$1عن', '$1px' ),
-       'img_center'              => array( '1', 'مركز', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'لاإطار', 'frameless' ),
-       'img_page'                => array( '1', 'صفحة=$1', 'صفحة_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'معدول', 'معدول=$1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'حدود', 'border' ),
-       'img_baseline'            => array( '1', 'خط_أساسي', 'baseline' ),
-       'img_sub'                 => array( '1', 'فرعي', 'sub' ),
-       'img_super'               => array( '1', 'سوبر', 'سب', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'أعلى', 'top' ),
-       'img_text_top'            => array( '1', 'نص_أعلى', 'text-top' ),
-       'img_middle'              => array( '1', 'وسط', 'middle' ),
-       'img_bottom'              => array( '1', 'أسفل', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'نص_أسفل', 'text-bottom' ),
-       'img_link'                => array( '1', 'وصلة=$1', 'رابط=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'بديل=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'محتوى:', 'INT:' ),
-       'sitename'                => array( '1', 'اسم_الموقع', 'SITENAME' ),
-       'ns'                      => array( '0', 'نط:', 'NS:' ),
-       'nse'                     => array( '0', 'نطم:', 'NSE:' ),
-       'localurl'                => array( '0', 'مسار_محلي:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'مسار_المقالة', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'خادم', 'SERVER' ),
-       'servername'              => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'مسار_الهيئة', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'قواعد_اللغة:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'نوع:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__لاتحويل_عنوان__', '__لاتع__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__لاتحويل_محتوى__', '__لاتم__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'أسبوع_حالي', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'يوم_حالي_مأ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'أسبوع_محلي', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'يوم_محلي_مأ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'رقم_المراجعة', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'جمع:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'عنوان_كامل:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'مسار_كامل:', 'FULLURLE:' ),
-       'canonicalurl'            => array( '0', 'عنوان_قاعدة:', 'CANONICALURL:' ),
-       'canonicalurle'           => array( '0', 'مسار_قاعدة:', 'CANONICALURLE:' ),
-       'lcfirst'                 => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'صغير:', 'LC:' ),
-       'uc'                      => array( '0', 'كبير:', 'UC:' ),
-       'raw'                     => array( '0', 'خام:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'أر', 'آر', 'R' ),
-       'newsectionlink'          => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'كود_المسار:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'كود_الأنكور', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'طابع_الوقت_الحالي', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'طابع_الوقت_المحلي', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'علامة_الاتجاه', 'علامة_اتجاه', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#لغة:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'لغة_المحتوى', 'لغة_محتوى', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'صفحات_في_نطاق:', 'صفحات_في_نط:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'عدد_الإداريين', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'صيغة_رقم', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'باد_يسار', 'PADLEFT' ),
-       'padright'                => array( '0', 'باد_يمين', 'PADRIGHT' ),
-       'special'                 => array( '0', 'خاص', 'special' ),
-       'defaultsort'             => array( '1', 'ترتيب_افتراضي:', 'مفتاح_ترتيب_افتراضي:', 'ترتيب_تصنيف_افتراضي:', 'ترتيب_غيابي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'مسار_الملف:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'وسم', 'tag' ),
-       'hiddencat'               => array( '1', '__تصنيف_مخفي__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'صفحات_في_التصنيف', 'صفحات_في_تصنيف', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'حجم_الصفحة', 'PAGESIZE' ),
-       'index'                   => array( '1', '__فهرسة__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__لافهرسة__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'عدد_في_المجموعة', 'عدد_في_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'مسار', 'PATH' ),
-       'url_wiki'                => array( '0', 'ويكي', 'WIKI' ),
-       'url_query'               => array( '0', 'استعلام', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', 'لاخطأ', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', 'لاتستبدل', 'noreplace' ),
+       'redirect'                  => array( '0', '#تحويل', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__لافهرس__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__لامعرض__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__لصق_فهرس__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__فهرس__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__لاعنوان__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'شهر_حالي', 'شهر_حالي2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'اسم_الشهر_الحالي_المولد', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'اختصار_الشهر_الحالي', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'يوم_حالي', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'يوم_حالي2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'اسم_اليوم_الحالي', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'عام_حالي', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'وقت_حالي', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ساعة_حالية', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'شهر_محلي', 'شهر_محلي2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'شهر_محلي1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'اسم_الشهر_المحلي', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'اسم_الشهر_المحلي_المولد', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'اختصار_الشهر_المحلي', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'يوم_محلي', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'يوم_محلي2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'اسم_اليوم_المحلي', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'عام_محلي', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'وقت_محلي', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ساعة_محلية', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'عدد_الصفحات', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'عدد_المقالات', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'عدد_الملفات', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'اسم_الصفحة', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'عنوان_الصفحة', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'نطاق', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'عنوان_نطاق', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'عدد_نطاق', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'نطاق_النقاش', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'عنوان_النقاش', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'نطاق_الموضوع', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'اسم_الصفحة_الكامل', 'اسم_صفحة_كامل', 'اسم_كامل', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'عنوان_الصفحة_الكامل', 'عنوان_صفحة_كامل', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'اسم_الصفحة_الفرعي', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'عنوان_الصفحة_الفرعي', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'اسم_الصفحة_الأساسي', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'عنوان_الصفحة_الأساسي', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'اسم_صفحة_النقاش', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'عنوان_صفحة_النقاش', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'اسم_صفحة_الموضوع', 'اسم_صفحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'عنوان_صفحة_الموضوع', 'عنوان_صفحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'رسالة:', 'MSG:' ),
+       'subst'                     => array( '0', 'نسخ:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'تصغير', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'يمين', 'right' ),
+       'img_left'                  => array( '1', 'يسار', 'left' ),
+       'img_none'                  => array( '1', 'بدون', 'بلا', 'none' ),
+       'img_width'                 => array( '1', '$1بك', '$1عن', '$1px' ),
+       'img_center'                => array( '1', 'مركز', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'لاإطار', 'frameless' ),
+       'img_page'                  => array( '1', 'صفحة=$1', 'صفحة_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'معدول', 'معدول=$1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'حدود', 'border' ),
+       'img_baseline'              => array( '1', 'خط_أساسي', 'baseline' ),
+       'img_sub'                   => array( '1', 'فرعي', 'sub' ),
+       'img_super'                 => array( '1', 'سوبر', 'سب', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'أعلى', 'top' ),
+       'img_text_top'              => array( '1', 'نص_أعلى', 'text-top' ),
+       'img_middle'                => array( '1', 'وسط', 'middle' ),
+       'img_bottom'                => array( '1', 'أسفل', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'نص_أسفل', 'text-bottom' ),
+       'img_link'                  => array( '1', 'وصلة=$1', 'رابط=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'بديل=$1', 'alt=$1' ),
+       'img_class'                 => array( '1', 'رتبة=$1', 'class=$1' ),
+       'int'                       => array( '0', 'محتوى:', 'INT:' ),
+       'sitename'                  => array( '1', 'اسم_الموقع', 'SITENAME' ),
+       'ns'                        => array( '0', 'نط:', 'NS:' ),
+       'nse'                       => array( '0', 'نطم:', 'NSE:' ),
+       'localurl'                  => array( '0', 'مسار_محلي:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'مسار_المقالة', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'رقم_صفحة', 'PAGEID' ),
+       'server'                    => array( '0', 'خادم', 'SERVER' ),
+       'servername'                => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'مسار_الهيئة', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'قواعد_اللغة:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'نوع:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__لاتحويل_عنوان__', '__لاتع__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__لاتحويل_محتوى__', '__لاتم__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'أسبوع_حالي', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'يوم_حالي_مأ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'أسبوع_محلي', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'يوم_محلي_مأ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'رقم_المراجعة', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'جمع:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'عنوان_كامل:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'مسار_كامل:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'عنوان_قاعدة:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'مسار_قاعدة:', 'CANONICALURLE:' ),
+       'lcfirst'                   => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'صغير:', 'LC:' ),
+       'uc'                        => array( '0', 'كبير:', 'UC:' ),
+       'raw'                       => array( '0', 'خام:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'أر', 'آر', 'R' ),
+       'newsectionlink'            => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'كود_المسار:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'كود_الأنكور', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'طابع_الوقت_الحالي', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'طابع_الوقت_المحلي', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'علامة_الاتجاه', 'علامة_اتجاه', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#لغة:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'لغة_المحتوى', 'لغة_محتوى', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'صفحات_في_نطاق:', 'صفحات_في_نط:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'عدد_الإداريين', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'صيغة_رقم', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'باد_يسار', 'PADLEFT' ),
+       'padright'                  => array( '0', 'باد_يمين', 'PADRIGHT' ),
+       'special'                   => array( '0', 'خاص', 'special' ),
+       'speciale'                  => array( '0', 'عنوان_خاص', 'speciale' ),
+       'defaultsort'               => array( '1', 'ترتيب_افتراضي:', 'مفتاح_ترتيب_افتراضي:', 'ترتيب_تصنيف_افتراضي:', 'ترتيب_غيابي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'مسار_الملف:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'وسم', 'tag' ),
+       'hiddencat'                 => array( '1', '__تصنيف_مخفي__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'صفحات_في_التصنيف', 'صفحات_في_تصنيف', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'حجم_الصفحة', 'PAGESIZE' ),
+       'index'                     => array( '1', '__فهرسة__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__لافهرسة__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'عدد_في_المجموعة', 'عدد_في_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'مسار', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ويكي', 'WIKI' ),
+       'url_query'                 => array( '0', 'استعلام', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'لاخطأ', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'لاتستبدل', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', 'كل', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'صفحات', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'تصنيفات_فرعية', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'ملفات', 'files' ),
 );
 
 $specialPageAliases = array(
@@ -387,6 +396,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'بحث_ميم' ),
        'Mostcategories'            => array( 'الأكثر_تصنيفا' ),
        'Mostimages'                => array( 'أكثر_الملفات_وصلا', 'أكثر_الملفات', 'أكثر_الصور' ),
+       'Mostinterwikis'            => array( 'الأكثر_إنترويكي' ),
        'Mostlinked'                => array( 'أكثر_الصفحات_وصلا', 'الأكثر_وصلا' ),
        'Mostlinkedcategories'      => array( 'أكثر_التصنيفات_وصلا', 'أكثر_التصنيفات_استخداما' ),
        'Mostlinkedtemplates'       => array( 'أكثر_القوالب_وصلا', 'أكثر_القوالب_استخداما' ),
@@ -465,31 +475,31 @@ $messages = array(
 'tog-hidepatrolled' => 'أخف التعديلات المراجعة في أحدث التغييرات',
 'tog-newpageshidepatrolled' => 'أخف الصفحات المراجعة من قائمة الصفحات الجديدة',
 'tog-extendwatchlist' => 'مدد قائمة المراقبة لعرض كل التغييرات، وليس الأحدث فقط',
-'tog-usenewrc' => 'استخدÙ\85 Ø£Ø­Ø¯Ø« Ø§Ù\84تغÙ\8aÙ\8aرات Ø§Ù\84Ù\85حسÙ\86ة (يتطلب جافاسكربت)',
-'tog-numberheadings' => 'رقم العناوين تلقائيا',
+'tog-usenewrc' => 'جÙ\85Ù\91ع Ø§Ù\84تعدÙ\8aÙ\84ات Ø­Ø³Ø¨ Ø§Ù\84صÙ\81حة Ù\81Ù\8a Ø£Ø­Ø¯Ø« Ø§Ù\84تغÙ\8aÙ\8aرات Ù\88Ù\82ائÙ\85Ø© Ø§Ù\84Ù\85راÙ\82بة (يتطلب جافاسكربت)',
+'tog-numberheadings' => 'رقم العناوين تلقائياً',
 'tog-showtoolbar' => 'أظهر شريط التحرير (يتطلب جافاسكربت)',
 'tog-editondblclick' => 'عدل الصفحات عند الضغط المزدوج (جافاسكربت)',
 'tog-editsection' => 'مكن تعديل الأقسام عن طريق وصلات [عدل]',
 'tog-editsectiononrightclick' => 'فعل تعديل الأقسام بواسطة كبسة الفأرة اليمين على عناوين الأقسام (جافاسكريبت)',
 'tog-showtoc' => 'اعرض فهرس المحتويات (للصفحات التي تحتوي على أكثر من 3 عناوين)',
-'tog-rememberpassword' => 'تذÙ\83ر Ø¯Ø®Ù\88Ù\84Ù\8a Ø¹Ù\84Ù\89 Ù\87ذا Ø§Ù\84Ù\85تصÙ\81Ø­ (Ø¥Ù\84Ù\89 {{PLURAL:$1||Ù\8aÙ\88Ù\85 Ù\88احد|Ù\8aÙ\88Ù\85Ù\8aÙ\86|$1 Ø£Ù\8aاÙ\85|$1 Ù\8aÙ\88Ù\85Ù\8bا|$1 Ù\8aÙ\88Ù\85}} Ù\83حد Ø£Ù\82صÙ\89)',
-'tog-watchcreations' => 'أضف الصفحات التي أنشئها إلى قائمة مراقبتي',
-'tog-watchdefault' => 'أضف الصفحات التي أعدلها إلى قائمة مراقبتي',
-'tog-watchmoves' => 'أضف الصفحات التي أنقلها إلى قائمة مراقبتي',
-'tog-watchdeletion' => 'أضف الصفحات التي أحذفها إلى قائمة مراقبتي',
+'tog-rememberpassword' => 'تذÙ\83ر Ø¯Ø®Ù\88Ù\84Ù\8a Ø¨Ù\87ذا Ø§Ù\84Ù\85تصÙ\81Ø­ (Ù\84Ù\85دة Ø£Ù\82صاÙ\87ا {{PLURAL:$1||Ù\8aÙ\88Ù\85 Ù\88احد|Ù\8aÙ\88Ù\85اÙ\86|$1 Ø£Ù\8aاÙ\85|$1 Ù\8aÙ\88Ù\85ا|$1 Ù\8aÙ\88Ù\85}})',
+'tog-watchcreations' => 'أضف الصفحات التي أنشئها والملفات التي أرفعها إلى قائمة مراقبتي.',
+'tog-watchdefault' => '!!أضف الصفحات والملفات التي أعدلها إلى قائمة مراقبتي',
+'tog-watchmoves' => 'أضف الصفحات والملفات التي أنقلها إلى قائمة مراقبتي',
+'tog-watchdeletion' => 'أضف الصفحات والملفات التي أحذفها إلى قائمة مراقبتي',
 'tog-minordefault' => 'علم كل التعديلات طفيفة افتراضيا',
 'tog-previewontop' => 'أظهر العرض المسبق قبل صندوق التحرير',
 'tog-previewonfirst' => 'أظهر معاينة مع أول تعديل',
 'tog-nocache' => 'عطّل تخزين المتصفح للصفحة',
-'tog-enotifwatchlistpages' => 'أرسل لي رسالة إلكترونية عندما يتم تغيير صفحة في قائمة مراقبتي',
+'tog-enotifwatchlistpages' => 'أرسل لي رسالة إلكترونية عندما تُغيّر صفحة أو ملف في قائمة مراقبتي',
 'tog-enotifusertalkpages' => 'أرسل لي رسالة إلكترونية عندما تعدل صفحة نقاشي',
-'tog-enotifminoredits' => 'أرسل لي رسالة إلكترونية عن التعديلات الطفيفة للصفحات أيضا',
+'tog-enotifminoredits' => 'أرسل لي رسالة إلكترونية عن التعديلات الطفيفة للصفحات والملفات أيضا',
 'tog-enotifrevealaddr' => 'أظهر عنوان بريدي الإلكتروني في رسائل الإخطار',
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبين',
 'tog-oldsig' => 'التوقيع الحالي:',
 'tog-fancysig' => 'عامل التوقيع كنص ويكي (بدون وصلة أوتوماتيكية)',
-'tog-externaleditor' => 'استخدم محررا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors مزيد من المعلومات.])',
-'tog-externaldiff' => 'استخدم فرقا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات.])',
+'tog-externaleditor' => 'استخدم محرراً خارجياً بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors لمزيد من المعلومات].)',
+'tog-externaldiff' => 'استخدم فرقاً خارجياً بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات].)',
 'tog-showjumplinks' => 'مكن وصلات "اذهب إلى" المساعدة',
 'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تعديل فارغ',
@@ -499,7 +509,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'أخف تعديلات المستخدمين المسجلين من قائمة المراقبة',
 'tog-watchlisthideanons' => 'أخف تعديلات المستخدمين المجهولين من قائمة المراقبة',
 'tog-watchlisthidepatrolled' => 'أخف التعديلات المراجعة من قائمة المراقبة',
-'tog-nolangconversion' => 'عطل تحويل اللهجات',
 'tog-ccmeonemails' => 'أرسل لي نسخا من رسائل البريد الإلكتروني التي أرسلها للمستخدمين الآخرين',
 'tog-diffonly' => 'لا تعرض محتوى الصفحة أسفل الفروقات',
 'tog-showhiddencats' => 'أظهر التصنيفات المخفية',
@@ -591,7 +600,7 @@ $messages = array(
 'about' => 'عن',
 'article' => 'صفحة محتوى',
 'newwindow' => '(تفتح في نافذة جديدة)',
-'cancel' => 'Ø£Ù\84غÙ\90',
+'cancel' => 'Ø¥Ù\84غاء',
 'moredotdotdot' => 'المزيد...',
 'mypage' => 'صفحتي',
 'mytalk' => 'نقاشي',
@@ -602,24 +611,24 @@ $messages = array(
 # Cologne Blue skin
 'qbfind' => 'جد',
 'qbbrowse' => 'تصفح',
-'qbedit' => 'عدل',
+'qbedit' => 'تعدÙ\8aل',
 'qbpageoptions' => 'هذه الصفحة',
 'qbpageinfo' => 'سياق النص',
 'qbmyoptions' => 'صفحاتي',
 'qbspecialpages' => 'الصفحات الخاصة',
-'faq' => 'الأسئلة الأكثر تكرارا',
+'faq' => 'الأسئلة المتكررة',
 'faqpage' => 'Project:أسئلة متكررة',
 
 # Vector skin
 'vector-action-addsection' => 'أضف موضوعا',
-'vector-action-delete' => 'احذÙ\81',
+'vector-action-delete' => 'حذف',
 'vector-action-move' => 'انقل',
 'vector-action-protect' => 'احم',
 'vector-action-undelete' => 'استرجع الحذف',
 'vector-action-unprotect' => 'غير الحماية',
 'vector-simplesearch-preference' => 'مكّن مقترحات البحث المُحسّنة (لواجهة فكتور فقط)',
 'vector-view-create' => 'أنشئ',
-'vector-view-edit' => 'عدل',
+'vector-view-edit' => 'تعدÙ\8aل',
 'vector-view-history' => 'اعرض التاريخ',
 'vector-view-view' => 'اقرأ',
 'vector-view-viewsource' => 'اعرض المصدر',
@@ -632,7 +641,7 @@ $messages = array(
 'tagline' => 'من {{SITENAME}}',
 'help' => 'مساعدة',
 'search' => 'بحث',
-'searchbutton' => 'ابحث',
+'searchbutton' => 'بحث',
 'go' => 'اذهب',
 'searcharticle' => 'اذهب',
 'history' => 'تاريخ الصفحة',
@@ -642,11 +651,11 @@ $messages = array(
 'permalink' => 'وصلة دائمة',
 'print' => 'اطبع',
 'view' => 'عرض',
-'edit' => 'عدل',
+'edit' => 'تعدÙ\8aل',
 'create' => 'أنشئ',
-'editthispage' => 'عدل هذه الصفحة',
+'editthispage' => 'تعدÙ\8aل هذه الصفحة',
 'create-this-page' => 'أنشئ هذه الصفحة',
-'delete' => 'احذÙ\81',
+'delete' => 'حذف',
 'deletethispage' => 'احذف هذه الصفحة',
 'undelete_short' => 'استرجاع {{PLURAL:$1|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديلا}}',
 'viewdeleted_short' => 'عرض {{PLURAL:$1|تعديل محذوف|$1 تعديلات محذوفة}}',
@@ -681,7 +690,7 @@ $messages = array(
 'protectedpage' => 'صفحة محمية',
 'jumpto' => 'اذهب إلى:',
 'jumptonavigation' => 'تصفح',
-'jumptosearch' => 'اÙ\84بحث',
+'jumptosearch' => 'بحث',
 'view-pool-error' => 'عذرا، الخوادم منهكة حاليا.
 يحاول مستخدمون كثر الوصول إلى هذه الصفحة.
 من فضلك انتظر قليلا قبل أن تحاول الوصول إلى هذه الصفحة مجددا.
@@ -723,11 +732,15 @@ $1',
 'youhavenewmessages' => 'توجد لديك $1 ($2).',
 'newmessageslink' => 'رسائل جديدة',
 'newmessagesdifflink' => 'آخر تغيير',
+'youhavenewmessagesfromusers' => 'لديك $1 من {{PLURAL:$3|مستخدم آخر|$3 مستخدمين}} ($2).',
+'youhavenewmessagesmanyusers' => 'لديك $1 من مستخدمين كثر ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|رسالة جديدة|رسائل جديدة}}',
+'newmessagesdifflinkplural' => 'آخر {{PLURAL:$1|تغيير|تغييرات}}',
 'youhavenewmessagesmulti' => 'لديك رسائل جديدة على $1',
-'editsection' => 'عدل',
-'editold' => 'عدل',
+'editsection' => 'تعدÙ\8aل',
+'editold' => 'تعدÙ\8aل',
 'viewsourceold' => 'اعرض المصدر',
-'editlink' => 'عدل',
+'editlink' => 'تعدÙ\8aل',
 'viewsourcelink' => 'اعرض المصدر',
 'editsectionhint' => 'حرر القسم: $1',
 'toc' => 'محتويات',
@@ -737,7 +750,7 @@ $1',
 'collapsible-expand' => 'وسع',
 'thisisdeleted' => 'أأعرض أو أسترجع $1؟',
 'viewdeleted' => 'أأعرض $1؟',
-'restorelink' => '{{PLURAL:$1|$1 تعديل محذوف|تعديلا واحدا محذوفا|تعديلين محذوفين|$1 تعديلات محذوفة|$1 تعديلا محذوفا|$1 تعديلا محذوفا}}',
+'restorelink' => '{{PLURAL:$1|$1 تعديل محذوف|تعديلا واحدا محذوفا|تعديلين محذوفين|$1 تعديلات محذوفة|$1 تعديلا محذوفا|$1 تعديل محذوف}}',
 'feedlinks' => 'التغذية:',
 'feed-invalid' => 'نوع اشتراك التلقيم غير صحيح.',
 'feed-unavailable' => 'التلقيمات غير متوفرة',
@@ -753,7 +766,7 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'صفحة',
-'nstab-user' => 'صفحة مستخدم',
+'nstab-user' => 'صفحة {{GENDER:{{BASEPAGENAME}}|مستخدم|مستخدمة}}',
 'nstab-media' => 'صفحة وسيط',
 'nstab-special' => 'صفحة خاصة',
 'nstab-project' => 'صفحة مشروع',
@@ -776,12 +789,12 @@ $1',
 # General errors
 'error' => 'خطأ',
 'databaseerror' => 'خطأ في قاعدة البيانات',
-'dberrortext' => 'حدث Ø®Ø·Ø£ Ù\81Ù\8a ØµÙ\8aغة Ø§ستعلام قاعدة البيانات.
-ربما يكون هذا عيب بالبرنامج.
-آخر Ø§Ø³ØªØ¹Ù\84اÙ\85 Ø·Ù\84ب Ù\85Ù\86 Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ù\83اÙ\86:
+'dberrortext' => 'حدث Ø®Ø·Ø£ Ù\81Ù\8a ØµÙ\8aغة Ø£ستعلام قاعدة البيانات.
+قد يدل هذا الخطأ على عيب في البرنامج.
+آخر Ø£Ø³ØªØ¹Ù\84اÙ\85 ØªÙ\85 Ø·Ù\84بÙ\87 Ù\85Ù\86 Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ù\83اÙ\86 :
 <blockquote><tt>$1</tt></blockquote>
 من داخل الدالة "<tt>$2</tt>".
£Ø±Ø¬Ø¹Øª Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ø§Ù\84خطأ "<tt>$3: $4</tt>".',
­Ø¯Ø¯Øª Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ø§Ù\84خطأ  "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'حدث خطأ في صيغة استعلام قاعدة البيانات.
 آخر استعلام طلب من قاعدة البيانات كان:
 "$1"
@@ -818,6 +831,8 @@ $1',
 'cannotdelete' => 'تعذر حذف الصفحة أو الملف "$1".
 ربما حذفها شحص آخر.',
 'cannotdelete-title' => 'لا يمكن حذف الصفحة "$1"',
+'delete-hook-aborted' => 'إحباط الحذف من قبل هوك.
+لم يقدم أي توضيح.',
 'badtitle' => 'عنوان سيء',
 'badtitletext' => 'عنوان الصفحة المطلوب إما غير صحيح أو فارغ، وربما الوصلة بين اللغات أو بين المشاريع خاطئة.
 ومن الممكن وجود رموز لا تصلح للاستخدام في العناوين.',
@@ -854,6 +869,8 @@ $2',
 المدير الذي قام بغلقه قدم التفسير التالي: "$3".',
 'invalidtitle-knownnamespace' => 'عنوان غير صالح في النطاق «$2» مع نص «$3»',
 'invalidtitle-unknownnamespace' => 'عنوان غير صالح ذو نطاق غير معروف رقم $1 ونص «$2»',
+'exception-nologin' => 'غير مسجل الدخول',
+'exception-nologin-text' => 'تتطلب هذه الصفحة أو الفعل منك القيام بتسجيل الدخول على هذه الويكي أولا.',
 
 # Virus scanner
 'virus-badscanner' => "ضبط سيء: ماسح فيروسات غير معروف: ''$1''",
@@ -871,24 +888,25 @@ $2',
 'yourname' => 'اسم المستخدم:',
 'yourpassword' => 'كلمة السر:',
 'yourpasswordagain' => 'أعد كتابة كلمة السر:',
-'remembermypassword' => 'تذÙ\83ر Ø¯Ø®Ù\88Ù\84Ù\8a Ø¹Ù\84Ù\89 Ù\87ذا Ø§Ù\84حاسÙ\88ب (Ø¥Ù\84Ù\89 {{PLURAL:$1||Ù\8aÙ\88Ù\85 Ù\88احد|Ù\8aÙ\88Ù\85Ù\8aÙ\86|$1 Ø£Ù\8aاÙ\85|$1 Ù\8aÙ\88Ù\85Ù\8bا|$1 Ù\8aÙ\88Ù\85}} Ù\83حد Ø£Ù\82صÙ\89)',
+'remembermypassword' => 'تذÙ\83ر Ø¯Ø®Ù\88Ù\84Ù\8a Ø¨Ù\87ذا Ø§Ù\84Ù\85تصÙ\81Ø­ (Ù\84Ù\85دة Ø£Ù\82صاÙ\87ا {{PLURAL:$1||Ù\8aÙ\88Ù\85 Ù\88احد|Ù\8aÙ\88Ù\85اÙ\86|$1 Ø£Ù\8aاÙ\85|$1 Ù\8aÙ\88Ù\85ا|$1 Ù\8aÙ\88Ù\85}})',
 'securelogin-stick-https' => 'ابقَ في اتصال HTTPS بعد الدخول.',
 'yourdomainname' => 'نطاقك:',
+'password-change-forbidden' => 'أنت لا يمكنك تغيير كلمات السر على هذا الويكي.',
 'externaldberror' => 'هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.',
-'login' => 'ادخل',
-'nav-login-createaccount' => 'ادخÙ\84 / Ø£Ù\86شئ Ø­Ø³Ø§Ø¨Ø§',
+'login' => 'تسجÙ\8aÙ\84 Ø§Ù\84دخÙ\88ل',
+'nav-login-createaccount' => 'دخÙ\88Ù\84 / Ø¥Ù\86شاء Ø­Ø³Ø§Ø¨',
 'loginprompt' => 'يجب أن تكون الكوكيز لديك مفعلة لتسجل الدخول إلى {{SITENAME}}.',
 'userlogin' => 'دخول / إنشاء حساب',
-'userloginnocreate' => 'دخول',
-'logout' => 'اخرج',
-'userlogout' => 'اخرج',
+'userloginnocreate' => 'تسجÙ\8aÙ\84 Ø§Ù\84دخÙ\88Ù\84',
+'logout' => 'تسجÙ\8aÙ\84 Ø§Ù\84خرÙ\88ج',
+'userlogout' => 'تسجÙ\8aÙ\84 Ø§Ù\84خرÙ\88ج',
 'notloggedin' => 'غير مسجل الدخول',
-'nologin' => "ألا تمتلك حسابا؟ '''$1'''.",
+'nologin' => "ليس لديك حساب؟ '''$1'''.",
 'nologinlink' => 'أنشئ حسابا',
 'createaccount' => 'أنشئ حسابا',
-'gotaccount' => "تمتلك حسابا بالفعل؟ '''$1'''.",
-'gotaccountlink' => 'لُج',
-'userlogin-resetlink' => 'أنسيت بيانات الولوج؟',
+'gotaccount' => "لديك حساب؟ '''$1'''.",
+'gotaccountlink' => 'تسجيل الدخول',
+'userlogin-resetlink' => 'نسيت تفاصيل الدخول؟',
 'createaccountmail' => 'بواسطة البريد الإلكتروني',
 'createaccountreason' => 'السبب:',
 'badretype' => 'كلمات السر التي أدخلتها لا تتطابق.',
@@ -907,7 +925,7 @@ $2',
 تأكد من أن ملفات تعريف الارتباط (الكوكيز) مفعلة عندك، ثم أعد تحميل الصفحة وحاول مرة أخرى.',
 'noname' => 'لم تحدد اسم مستخدم صحيح.',
 'loginsuccesstitle' => 'تم الدخول بشكل صحيح',
-'loginsuccess' => "'''لقد قمت بتسجيل الدخول ل{{SITENAME}} باسم \"\$1\".'''",
+'loginsuccess' => "'''لقد سجلت الدخول ل{{SITENAME}} باسم \"\$1\".'''",
 'nosuchuser' => 'لا يوجد مستخدم بالاسم "$1".
 أسماء المستخدمين حساسة لحالة الحروف.
 تأكد من إملاء الاسم، أو [[Special:UserLogin/signup|قم بإنشاء حساب جديد]].',
@@ -983,7 +1001,7 @@ $2',
 'resetpass_forbidden' => 'كلمات السر لا يمكن تغييرها',
 'resetpass-no-info' => 'يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.',
 'resetpass-submit-loggedin' => 'تغيير كلمة السر',
-'resetpass-submit-cancel' => 'Ø£Ù\84غÙ\90',
+'resetpass-submit-cancel' => 'Ø¥Ù\84غاء',
 'resetpass-wrong-oldpass' => 'كلمة سر حالية أو مؤقتة غير صحيحة.
 ربما تكون غيرت كلمة السر الخاصة بك بنجاح أو طلبت كلمة سر مؤقتة جديدة.',
 'resetpass-temp-password' => 'كلمة سر مؤقتة:',
@@ -1014,7 +1032,7 @@ $2
 {{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}
 من الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .
 إذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.',
-'passwordreset-emailelement' => 'اسم المستخدم: $1
+'passwordreset-emailelement' => 'اسم {{GENDER:$1|المستخدم|المستخدمة}}: $1
 كلمة السر المؤقتة: $2',
 'passwordreset-emailsent' => 'أرسل بريد إلكتروني تذكيري',
 'passwordreset-emailsent-capture' => 'أرسل بريد إلكتروني تذكيري وهو معروض بالأسفل.',
@@ -1028,7 +1046,7 @@ $2
 'changeemail-oldemail' => 'عنوان البريد الإلكتروني الحالي:',
 'changeemail-newemail' => 'عنوان البريد الإلكتروني الجديد:',
 'changeemail-none' => '(لا شيء)',
-'changeemail-submit' => 'تغÙ\8aÙ\8aر البريد الإلكتروني',
+'changeemail-submit' => 'غÙ\8aÙ\91ر البريد الإلكتروني',
 'changeemail-cancel' => 'إلغاء',
 
 # Edit page toolbar
@@ -1055,10 +1073,10 @@ $2
 'minoredit' => 'هذا تعديل طفيف',
 'watchthis' => 'راقب هذه الصفحة',
 'savearticle' => 'احفظ الصفحة',
-'preview' => 'معاينة',
+'preview' => 'عرض مسبق',
 'showpreview' => 'أظهر معاينة',
 'showlivepreview' => 'عرض مباشر',
-'showdiff' => 'أظÙ\87ر التغييرات',
+'showdiff' => 'عرض التغييرات',
 'anoneditwarning' => "'''تحذير:''' لم تقم بالدخول.
 سيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
 'anonpreviewwarning' => "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
@@ -1083,8 +1101,8 @@ $2
 لا يمكنك استخدام خاصية 'مراسلة هذا المستخدم' إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.
 عنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.
 من فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
-'autoblockedtext' => 'تم منع عنوان آيبيك تلقائيا لأن مستخدما آخرا ممنوعا بواسطة $1 استخدمه.
-السبب الممنوح هو التالي:
+'autoblockedtext' => 'مُنِع عنوان آيبيك تلقائيا لأن مستخدما آخرا منعه $1 استخدمه.
+السبب المعطى هو التالي:
 
 :\'\'$2\'\'
 
@@ -1106,7 +1124,7 @@ $2
 'nosuchsectiontext' => 'لقد حاولت تحرير قسم غير موجود.
 ربما يكون قد تم نقله أو حذفه أثناء مشاهدتك للصفحة.',
 'loginreqtitle' => 'تسجيل الدخول مطلوب',
-'loginreqlink' => 'اÙ\84Ù\88Ù\84Ù\88ج',
+'loginreqlink' => 'تسجÙ\8aÙ\84 Ø§Ù\84دخÙ\88Ù\84',
 'loginreqpagetext' => 'يجب عليك $1 لتشاهد صفحات أخرى.',
 'accmailtitle' => 'تم إرسال كلمة السر.',
 'accmailtext' => "كلمة سر مولدة عشوائيا ل [[User talk:$1|$1]] تم إرسالها إلى $2.
@@ -1125,13 +1143,17 @@ $2
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} البحث في السجلات المتعلقة]،
 أو [{{fullurl:{{FULLPAGENAME}}|action=edit}} تعديل هذه الصفحة]</span>.',
 'noarticletext-nopermission' => 'لا يوجد حاليا أي نص في هذه الصفحة.يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى,أو <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} بحث السجلات المتصلة]</span>.',
+'missing-revision' => 'المراجعة #$1 من الصفحة المسماة "{{PAGENAME}}" غير موجودة.
+
+هذا يحدث عادة عن طريق اتباع وصلة تاريخ قديمة لصفحة تم حذفها.
+التفاصيل يمكن إيجادها في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].',
 'userpage-userdoesnotexist' => 'حساب المستخدم "<nowiki>$1</nowiki>" غير مسجل.
 من فضلك تأكد أنك تريد إنشاء/تعديل هذه الصفحة.',
 'userpage-userdoesnotexist-view' => 'حساب المستخدم "$1" غير مسجل.',
 'blocked-notice-logextract' => 'هذا المستخدم ممنوع حاليا.
 آخر مدخلة في سجل المنع موفرة بالأسفل كمرجع:',
-'clearyourcache' => "'''ملاحظة:''' بعد الحفظ, أنت ربما تحتاج إلى إفراغ كاش متصفحك لرؤية التغييرات.
-* '''فيرفكس / سفاري:''' اضغط ''Shift'' أثناء ضغط ''Reload'', أو اضغط أيا من ''Ctrl-F5'' أو ''Ctrl-R'' (''⌘-R'' على ماك)
+'clearyourcache' => "'''ملاحظة:''' بعد الحفظ، قد تحتاج إلى إفراغ كاش متصفحك لرؤية التغييرات.
+* '''فايرفوكس / سفاري:''' اضغط ''Shift'' أثناء ضغط ''Reload''، أو اضغط أيا من ''Ctrl-F5'' أو ''Ctrl-R'' (''⌘-R'' على ماك)
 * '''جوجل كروم:''' اضغط ''Ctrl-Shift-R'' (''⌘-Shift-R'' على ماك)
 * '''إنترنت إكسبلورر:''' اضغط ''Ctrl'' أثناء ضغط ''Refresh''، أو اضغط ''Ctrl-F5''
 * '''كنكرر:''' اضغط ''Reload'' أو اضغط ''F5''
@@ -1221,7 +1243,7 @@ $2
 'permissionserrors' => 'أخطاء السماحات',
 'permissionserrorstext' => 'لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:',
 'permissionserrorstext-withaction' => 'لا تملك الصلاحيات ل$2، لل{{PLURAL:$1||سبب التالي|سببين التاليين|أسباب التالية}}:',
-'recreate-moveddeleted-warn' => "'''تحذير: أنت تقوم بإعادة إنشاء صفحة سبق حذفها.'''
+'recreate-moveddeleted-warn' => "'''تحذير: أنت تعيد إنشاء صفحة سبق حذفها.'''
 
 يجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.
 سجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
@@ -1258,10 +1280,11 @@ $2
 'expansion-depth-exceeded-warning' => 'الصفحة تجاوزت عمق التوسيع',
 'parser-unstrip-loop-warning' => 'حلقة معراة تم الكشف عنها',
 'parser-unstrip-recursion-limit' => 'تعدى حد العودية Unstrip  ($1)',
+'converter-manual-rule-error' => 'خطأ تم اكتشافه في قاعدة تحويل اللغة اليدوية',
 
 # "Undo" feature
 'undo-success' => 'يمكن استرجاع التعديل.
-من فضلك تحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، وبعد ذلك احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.',
+تحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، ثم احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.',
 'undo-failure' => 'لم يمكن استرجاع التعديل بسبب تعديلات متعارضة تمت على الصفحة.',
 'undo-norev' => 'فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.',
 'undo-summary' => 'الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])',
@@ -1445,9 +1468,13 @@ $1",
 'lineno' => 'سطر $1:',
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
 'showhideselectedversions' => 'أظهر/أخف المراجعات المختارة',
-'editundo' => 'تراجع',
+'editundo' => 'رجÙ\88ع',
 'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتين أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
+'difference-missing-revision' => '{{PLURAL:$2|مراجعة واحدة|$2 مراجعات}} لهذا الفرق ($1) {{PLURAL:$2|لم|لم}} يتم إيجادها.
+
+هذا يحدث عادة عن طريق اتباع وصلة فرق قديمة لصفحة تم حذفها.
+التفاصيل يمكن إيجادها في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].',
 
 # Search results
 'searchresults' => 'نتائج البحث',
@@ -1529,11 +1556,11 @@ $1",
 'preferences' => 'تفضيلات',
 'mypreferences' => 'تفضيلاتي',
 'prefs-edits' => 'عدد التعديلات:',
-'prefsnologin' => 'غير مسجل',
+'prefsnologin' => 'غير مسجل الدخول',
 'prefsnologintext' => 'يجب أن تكون <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} مسجل الدخول]</span>  حتى تتمكن من تعديل تفضيلات المستخدم.',
 'changepassword' => 'غير كلمة السر',
 'prefs-skin' => 'واجهة',
-'skin-preview' => 'عاÙ\8aÙ\86',
+'skin-preview' => 'عرض Ù\85سبÙ\82',
 'datedefault' => 'لا تفضيل',
 'prefs-beta' => 'مزايا بيتا',
 'prefs-datetime' => 'وقت وتاريخ',
@@ -1560,7 +1587,7 @@ $1",
 'prefs-edit-boxsize' => 'حجم نافذة التحرير.',
 'rows' => 'صفوف:',
 'columns' => 'أعمدة:',
-'searchresultshead' => 'ابحث',
+'searchresultshead' => 'بحث',
 'resultsperpage' => 'عدد النتائج في الصفحة:',
 'stub-threshold' => 'الحد لتنسيق <a href="#" class="stub">وصلة البذرة</a>:',
 'stub-threshold-disabled' => 'معطل',
@@ -1680,9 +1707,9 @@ $1",
 
 'group-user-member' => '{{GENDER:$1|مستخدم|مستخدمة}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|مستخدم مؤكد تلقائيًا|مستخدمة مؤكدة تلقائيًا}}',
-'group-bot-member' => 'بوت',
+'group-bot-member' => '{{GENDER:$1|بوت}}',
 'group-sysop-member' => '{{GENDER:$1|إداري|إدارية}}',
-'group-bureaucrat-member' => 'بيروقراط',
+'group-bureaucrat-member' => '{{GENDER:$1|بيروقراط}}',
 'group-suppress-member' => '{{GENDER:$1|ناظر|ناظرة}}',
 
 'grouppage-user' => '{{ns:project}}:مستخدمون',
@@ -1717,6 +1744,7 @@ $1",
 'right-writeapi' => 'استخدام API للكتابة',
 'right-delete' => 'حذف الصفحات',
 'right-bigdelete' => 'حذف الصفحات ذات التواريخ الكبيرة',
+'right-deletelogentry' => 'حذف والغاء حذف إدخالات سجل معين',
 'right-deleterevision' => 'حذف واسترجاع مراجعات معينة من الصفحات',
 'right-deletedhistory' => 'رؤية مدخلات التاريخ المحذوفة، بدون نصوصها المصاحبة',
 'right-deletedtext' => 'عرض النص المحذوف والتغييرات بين المراجعات المحذوفة',
@@ -1741,7 +1769,7 @@ $1",
 'right-noratelimit' => 'غير متأثر بحدود المعدل',
 'right-import' => 'استيراد الصفحات من ويكيات أخرى',
 'right-importupload' => 'استيراد الصفحات من ملف مرفوع',
-'right-patrol' => 'اÙ\84تعÙ\84Ù\8aÙ\85 Ø¹Ù\84Ù\89 ØªØ¹Ø¯Ù\8aÙ\84ات Ø§Ù\84آخرÙ\8aÙ\86 Ù\83مراجعة',
+'right-patrol' => 'تعÙ\84Ù\8aÙ\85 ØªØ¹Ø¯Ù\8aÙ\84ات Ø§Ù\84آخرÙ\8aÙ\86 Ø¨Ø¹Ù\84اÙ\85Ø© Ø§Ù\84مراجعة',
 'right-autopatrol' => 'علم تعديلات المستخدم مراجعة تلقائيا',
 'right-patrolmarks' => 'رؤية علامات المراجعة في أحدث التغييرات',
 'right-unwatchedpages' => 'رؤية قائمة بالصفحات غير المراقبة',
@@ -1788,7 +1816,7 @@ $1",
 'action-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
 'action-import' => 'استيراد هذه الصفحة من ويكي آخر',
 'action-importupload' => 'استيراد هذه الصفحة من ملف مرفوع',
-'action-patrol' => 'اÙ\84تعÙ\84Ù\8aÙ\85 Ø¹Ù\84Ù\89 ØªØ¹Ø¯Ù\8aÙ\84ات Ø§Ù\84آخرÙ\8aÙ\86 Ù\83مراجعة',
+'action-patrol' => 'تعÙ\84Ù\8aÙ\85 ØªØ¹Ø¯Ù\8aÙ\84ات Ø§Ù\84آخرÙ\8aÙ\86 Ø¨Ø¹Ù\84اÙ\85Ø© Ø§Ù\84مراجعة',
 'action-autopatrol' => 'جعل تعديلك معلم عليه كمراجع',
 'action-unwatchedpages' => 'رؤية قائمة الصفحات غير المراقبة',
 'action-mergehistory' => 'دمج تاريخ هذه الصفحة',
@@ -1840,7 +1868,7 @@ $1",
 'recentchangeslinked-title' => 'التغييرات المرتبطة ب "$1"',
 'recentchangeslinked-noresult' => 'لم تحدث تعديلات في الصفحات التي لها وصلات هنا خلال الفترة المحددة.',
 'recentchangeslinked-summary' => "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).
-الصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
+الصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''مغلظة'''",
 'recentchangeslinked-page' => 'اسم الصفحة:',
 'recentchangeslinked-to' => 'أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك',
 
@@ -1849,7 +1877,7 @@ $1",
 'uploadbtn' => 'ارفع الملف',
 'reuploaddesc' => 'إلغاء الرفع والرجوع إلى استمارة الرفع',
 'upload-tryagain' => 'أرسل وصف ملف معدل',
-'uploadnologin' => 'لم تقم بتسجيل الدخول',
+'uploadnologin' => 'غير مسجل الدخول',
 'uploadnologintext' => 'يجب أن تكون [[Special:UserLogin|مسجلا الدخول]] لتتمكن من رفع الملفات.',
 'upload_directory_missing' => 'مجلد الرفع ($1) مفقود ولم يمكن إنشاؤه بواسطة خادوم الوب.',
 'upload_directory_read_only' => 'مجلد الرفع ($1) لا يمكن الكتابة عليه بواسطة خادوم الوب.',
@@ -1861,9 +1889,9 @@ $1",
 لرؤية أو البحث في الملفات المرفوعة سابقا، راجع [[Special:FileList|قائمة الملفات المرفوعة]]، عمليات الرفع (وإعادة الرفع) مسجلة في [[Special:Log/upload|سجل الرفع]] وعمليات الحذف في [[Special:Log/delete|سجل الحذف]].
 
 لإدراج صورة في صفحة، استخدم الوصلات في الصيغ التالية:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' لاستخدام النسخة الكاملة لملف
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|نص بديل]]</nowiki></tt>''' لاستخدام صورة عرضها 200 بكسل في صندوق في الجانب الأيسر مع 'نص بديل' كوصف
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' للوصل للملف مباشرة بدون عرض الملف.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' لاستخدام النسخة الكاملة لملف
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|نص بديل]]</nowiki></code>''' لاستخدام صورة عرضها 200 بكسل في صندوق في الجانب الأيسر مع 'نص بديل' كوصف
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' للوصل للملف مباشرة بدون عرض الملف.",
 'upload-permitted' => 'أنواع الملفات المسموحة: $1.',
 'upload-preferred' => 'أنواع الملفات المفضلة: $1.',
 'upload-prohibited' => 'أنواع الملفات الممنوعة: $1.',
@@ -1910,20 +1938,20 @@ $1",
 قد يكون سبب ذلك خطأ في كتابة الاسم.
 من فضلك تأكد من أنك تريد فعلا رفع هذا الملف.',
 'windows-nonascii-filename' => 'هذا ويكي لا يعتمد أسماء الملفات مع الأحرف الخاصة.',
-'fileexists' => "هناك ملف موجود يحمل نفس هذا الاسم الرجاء التأكد من هذا الملف باتباع الوصلة التالية '''<tt>[[:$1]]</tt>''' قبل القيام بتغييره.
-[[$1|thumb]]",
-'filepageexists' => "أنشئت صفحة وصف هذا الملف في '''<tt>[[:$1]]</tt>'''، لكن لا يوجد ملف بهذا الاسم حالياً.
+'fileexists' => 'هناك ملف موجود يحمل نفس هذا الاسم الرجاء التأكد من هذا الملف باتباع الوصلة التالية <strong>[[:$1]]</strong> قبل القيام بتغييره.
+[[$1|thumb]]',
+'filepageexists' => 'أنشئت صفحة وصف هذا الملف في <strong>[[:$1]]</strong>، لكن لا يوجد ملف بهذا الاسم حالياً.
 لن يظهر الملخص الذي تدخله على صفحة الوصف.
 لجعل ملخصك يظهر هناك، ستحتاج إلى تعديله يدوياً.
-[[$1|thumb]]",
-'fileexists-extension' => "يوجد ملف باسم مشابه: [[$2|thumb]]
-* اسم الملف المراد رفعه: '''<tt>[[:$1]]</tt>'''
-* اسم الملف الموجود: '''<tt>[[:$2]]</tt>'''
-من فضلك اختر اسماً مختلفاً.",
+[[$1|thumb]]',
+'fileexists-extension' => 'يوجد ملف باسم مشابه: [[$2|thumb]]
+* اسم الملف المراد رفعه: <strong>[[:$1]]</strong>
+* اسم الملف الموجود: <strong>[[:$2]]</strong>
+من فضلك اختر اسماً مختلفاً.',
 'fileexists-thumbnail-yes' => "يبدو أن الملف مصغرا لحجم أعلى ''(تصغير)''. [[$1|thumb]]
-من فضلك افحص الملف '''<tt>[[:$1]]</tt>'''.
+من فضلك افحص الملف <strong>[[:$1]]</strong>.
 إن كان هو نفس الملف بالحجم الأصلي فلا داعي لرفع تصغير إضافي.",
-'file-thumbnail-no' => "يبدأ الملف ب '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "يبدأ الملف ب <strong>$1</strong>.
 يبدو أن الملف مصغرا لحجم أعلى ''(تصغير)''.
 إذا كانت لديك الصورة في درجة دقة كاملة قم برفعها، أو قم بتغيير اسم الملف من فضلك.",
 'fileexists-forbidden' => 'هناك ملف موجود بهذا الاسم بالفعل، ولا يمكن إعادة الكتابة عليه.
@@ -2035,6 +2063,7 @@ $1',
 'lockmanager-fail-releaselock' => 'تعذر تحرير التأمين لـ "$1"..',
 'lockmanager-fail-db-bucket' => 'تعذر الإتصال بعدد كافي من قواعد تأمين البيانات في الحزمة $1.',
 'lockmanager-fail-db-release' => 'تعذر تحرير الأقفال في  قاعدة البيانات $1.',
+'lockmanager-fail-svr-acquire' => 'لم يمكن فرض أقفال على المخدم $1.',
 'lockmanager-fail-svr-release' => 'تعذر تحرير الأقفال على الخادم $1.',
 
 # ZipDirectoryReader
@@ -2157,6 +2186,7 @@ $1',
 'shared-repo' => 'مستودع مشترك',
 'shared-repo-name-wikimediacommons' => 'ويكيميديا كومنز',
 'filepage.css' => '/* CSS المعروض هنا سيضمن في صفحات وصف الملفات، أيضا على الويكيات الأجنبية */',
+'upload-disallowed-here' => 'لأسف لا يمكنك تعديل هذه الصورة.',
 
 # File reversion
 'filerevert' => 'استرجع $1',
@@ -2174,7 +2204,7 @@ $1',
 'filedelete-intro' => "أنت على وشك حذف الملف '''[[Media:$1|$1]]''' مع كل تاريخه.",
 'filedelete-intro-old' => "أنت تحذف نسخة '''[[Media:$1|$1]]''' بتاريخ [$4 $3، $2].",
 'filedelete-comment' => 'السبب:',
-'filedelete-submit' => 'احذÙ\81',
+'filedelete-submit' => 'حذف',
 'filedelete-success' => "'''$1''' تم حذفه.",
 'filedelete-success-old' => "نسخة '''[[Media:$1|$1]]''' بتاريخ $3، $2 تم حذفها.",
 'filedelete-nofile' => "'''$1''' غير موجود.",
@@ -2191,7 +2221,7 @@ $1',
 # MIME search
 'mimesearch' => 'بحث MIME',
 'mimesearch-summary' => 'تمكنك هذه الصفحة من ترشيح الملفات وفق نوع MIME الخاص بها.
-المدخل: نوع المحتوى/النوع الفرعي، كمثال <tt>image/jpeg</tt>.',
+المدخل: نوع المحتوى/النوع الفرعي، كمثال <code>image/jpeg</code>.',
 'mimetype' => 'نوع الملف:',
 'download' => 'تنزيل',
 
@@ -2238,8 +2268,8 @@ $1',
 
 'disambiguations' => 'الصفحات التي ترتبط بصفحات توضيح',
 'disambiguationspage' => 'Template:توضيح',
-'disambiguations-text' => "اÙ\84صÙ\81حات Ø§Ù\84تاÙ\84Ù\8aØ© ØªØµل إلى '''صفحة توضيح'''.
-ينبغي في المقابل أن تصل إلى الصفحة الملائمة. <br />
+'disambiguations-text' => "اÙ\84صÙ\81حات Ø§Ù\84تاÙ\84Ù\8aØ© ØªØ­ØªÙ\88Ù\8a Ø¹Ù\84Ù\89 Ù\88صÙ\84Ø© Ù\88احدة Ø¹Ù\84Ù\89 Ø§Ù\84Ø£Ù\82ل إلى '''صفحة توضيح'''.
+ربما ينبغي أن تصل إلى صفحة أكثر ملائمة. <br />
 تعامل الصفحة كصفحة توضيح إذا كان بها قالب موجود في [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'تحويلات مزدوجة',
@@ -2252,7 +2282,7 @@ $1',
 
 'brokenredirects' => 'تحويلات مكسورة',
 'brokenredirectstext' => 'التحويلات التالية تصل لصفحات غير موجودة:',
-'brokenredirects-edit' => 'عدل',
+'brokenredirects-edit' => 'تعدÙ\8aل',
 'brokenredirects-delete' => 'حذف',
 
 'withoutinterwiki' => 'صفحات بدون وصلات لغات أخرى',
@@ -2265,6 +2295,7 @@ $1',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|بايت|بايت}}',
 'ncategories' => '$1 {{PLURAL:$1|تصنيف واحد|تصنيفان|تصنيفات|تصنيف|تصنيفا}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '{{PLURAL:$1|لا وصلات|وصلة واحدة|وصلتان|$1 وصلات|$1 وصلة}}',
 'nmembers' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}',
 'nrevisions' => '{{PLURAL:$1|لا مراجعات|مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}',
@@ -2293,6 +2324,7 @@ $1',
 'mostlinkedtemplates' => 'أكثر القوالب وصلا',
 'mostcategories' => 'أكثر الصفحات تصنيفا',
 'mostimages' => 'أكثر الملفات ارتباطا',
+'mostinterwikis' => 'الصفحات التي تحتوي على أغلب وصلات الإنترويكي',
 'mostrevisions' => 'أكثر الصفحات تعديلا',
 'prefixindex' => 'كل الصفحات بالبادئة',
 'prefixindex-namespace' => 'كل الصفحات مع بادئة ($1 مساحة الأسم)',
@@ -2391,10 +2423,10 @@ $1',
 'linksearch' => 'بحث في الوصلات الخارجية',
 'linksearch-pat' => 'نمط البحث:',
 'linksearch-ns' => 'النطاق:',
-'linksearch-ok' => 'ابحث',
+'linksearch-ok' => 'بحث',
 'linksearch-text' => 'Wildcards مثل "*.wikipedia.org" يمكن استخدامها.
 تحتاج على الأقل إلى نطاق ذو مستوى أعلى، كمثال "*.org".<br />
-البروتوكولات المدعومة: <tt>$1</tt> (لا تقم بإضافة أي من هذه إلى بحثك).',
+البروتوكولات المدعومة: <code>$1</code> (لا تقم بإضافة أي من هذه إلى بحثك).',
 'linksearch-line' => '$1 موصولة من $2',
 'linksearch-error' => 'الكروت الخاصة يمكن أن تظهر فقط في بداية اسم المضيف.',
 
@@ -2407,7 +2439,7 @@ $1',
 # Special:ActiveUsers
 'activeusers' => 'قائمة المستخدمين النشطين',
 'activeusers-intro' => 'هذه قائمة بالمستخدمين الذين مارسوا نوعاً من النشاط خلال {{PLURAL:$1||اليوم الماضي|اليومين الماضيين|ال$1 أيام الماضية|ال$1 يوماً ماضياً|ال$1 يوم ماضي}}.',
-'activeusers-count' => '{{PLURAL:$1|Ù\84ا ØªØ¹Ø¯Ù\8aÙ\84ات Ø­Ø¯Ù\8aثة|تعدÙ\8aÙ\84 Ø­Ø¯Ù\8aØ« Ù\88احد|تعدÙ\8aÙ\84اÙ\86 Ø­Ø¯Ù\8aثاÙ\86|$1 ØªØ¹Ø¯Ù\8aÙ\84ات Ø­Ø¯Ù\8aثة|$1 ØªØ¹Ø¯Ù\8aÙ\84اÙ\8b Ø­Ø¯Ù\8aثاÙ\8b|$1 ØªØ¹Ø¯Ù\8aÙ\84 Ø­Ø¯Ù\8aØ«}} Ø®Ù\84اÙ\84 {{PLURAL:$3||اÙ\84Ù\8aÙ\88Ù\85 Ø§Ù\84Ù\85اضÙ\8a|اÙ\84Ù\8aÙ\88Ù\85Ù\8aÙ\86 Ø§Ù\84Ù\85اضÙ\8aÙ\8aÙ\86|$3 Ø£Ù\8aاÙ\85 Ù\85اضÙ\8aØ©|$3 Ù\8aÙ\88Ù\85اÙ\8b Ù\85اضÙ\8aØ©|اÙ\84$1 Ù\8aÙ\88Ù\85 Ù\85اضÙ\8a}}',
+'activeusers-count' => '{{PLURAL:$1|Ù\85ا Ù\85Ù\86 ØªØ¹Ø¯Ù\8aÙ\84ات|تعدÙ\8aÙ\84 Ø­Ø¯Ù\8aØ« Ù\88احد|تعدÙ\8aÙ\84اÙ\86 Ø­Ø¯Ù\8aثاÙ\86|$1 ØªØ¹Ø¯Ù\8aÙ\84ات Ø­Ø¯Ù\8aثة|$1 ØªØ¹Ø¯Ù\8aÙ\84ا Ø­Ø¯Ù\8aثا|$1 ØªØ¹Ø¯Ù\8aÙ\84 Ø­Ø¯Ù\8aØ«}} Ù\85Ù\86Ø° {{PLURAL:$3||Ù\8aÙ\88Ù\85\8aÙ\88Ù\85Ù\8aÙ\86|$3 Ø£Ù\8aاÙ\85|$3 Ù\8aÙ\88Ù\85ا|$1 Ù\8aÙ\88Ù\85}}',
 'activeusers-from' => 'اعرض المستخدمين بدءاً من:',
 'activeusers-hidebots' => 'أخف البوتات',
 'activeusers-hidesysops' => 'أخف الإداريين',
@@ -2440,6 +2472,8 @@ $1',
 'mailnologin' => 'لا يوجد عنوان للإرسال',
 'mailnologintext' => 'يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.',
 'emailuser' => 'إرسال رسالة لهذا المستخدم',
+'emailuser-title-target' => 'راسل بالبريد الإلكتروني هذا  {{GENDER:$1| المستخدم}}',
+'emailuser-title-notarget' => 'مراسلة المستخدم',
 'emailpage' => 'إرسال رسالة للمستخدم',
 'emailpagetext' => 'يمكنك استخدام الاستمارة بالأسفل لإرسال رسالة بريد إلكتروني إلى هذا المستخدم.
 سيظهر عنوان البريد الإلكتروني الذي أدخلته في [[Special:Preferences|تفضيلاتك]] كعنوان المرسل في البريد الإلكتروني، كي يستطيع المتلقي الرد عليك مباشرة.',
@@ -2454,7 +2488,7 @@ $1',
 'emailnotarget' => 'المستلم ليس مستخدمًا موجودًا أو ليس مستخدمًا صحيحًا.',
 'emailtarget' => 'أدخل اسم مستخدم المستلم',
 'emailusername' => 'اسم المستخدم:',
-'emailusernamesubmit' => 'أرسل',
+'emailusernamesubmit' => 'إرسال',
 'email-legend' => 'إرسال بريد إلكتروني إلى مستخدم {{SITENAME}} آخر',
 'emailfrom' => 'من:',
 'emailto' => 'إلى:',
@@ -2477,7 +2511,7 @@ $1',
 'watchlistfor2' => 'ل$1 $2',
 'nowatchlist' => 'لا توجد مدخلات في قائمة مراقبتك.',
 'watchlistanontext' => 'الرجاء $1 لعرض أو تعديل الصفحات في قائمة مراقبتك.',
-'watchnologin' => 'غير مسجل',
+'watchnologin' => 'غير مسجل الدخول',
 'watchnologintext' => 'يجب أن تكون [[Special:UserLogin|مسجل الدخول]] لتعدل قائمة مراقبتك.',
 'addwatch' => 'إضافة إلى قائمة المراقبة',
 'addedwatchtext' => "أضيفت الصفحة  \"[[:\$1]]\" إلى [[Special:Watchlist|قائمة مراقبتك]].
@@ -2553,7 +2587,7 @@ $UNWATCHURL
 'exblank' => 'الصفحة كانت فارغة',
 'delete-confirm' => 'حذف "$1"',
 'delete-legend' => 'حذف',
-'historywarning' => "'''تحذير:''' الصفحة التي توشك على حذفها لها تاريخ فيه {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} تقريباً:",
+'historywarning' => "'''تحذير:''' الصفحة التي توشك على حذفها لها تاريخ فيه {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} تقريبا:",
 'confirmdeletetext' => 'أنت على وشك أن تقوم بحذف صفحة بالإضافة إلى كل تاريخها.
 من فضلك التأكد من عزمك على الحذف، وبأنك مدرك للعواقب، وبأنك تقوم بهذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].',
 'actioncomplete' => 'انتهاء العملية',
@@ -2582,6 +2616,8 @@ $UNWATCHURL
 'rollback' => 'استرجاع التعديلات',
 'rollback_short' => 'استرجع',
 'rollbacklink' => 'استرجع',
+'rollbacklinkcount' => 'استرجع {{PLURAL:$1|لا تعديلات|تعديلا واحدا|تعديلين|$1 تعديلات|$1 تعديل}}',
+'rollbacklinkcount-morethan' => 'استرجاع أكثر من $1 {{PLURAL:$1|تعديل|تعديلات}}',
 'rollbackfailed' => 'لم ينجح الاسترجاع',
 'cantrollback' => 'لم يمكن استرجاع التعديل؛
 آخر مساهم هو المؤلف الوحيد لهذه الصفحة.',
@@ -2658,10 +2694,10 @@ $UNWATCHURL
 'pagesize' => '(بايت)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'اÙ\84تعدÙ\8aÙ\84',
+'restriction-edit' => 'تعديل',
 'restriction-move' => 'النقل',
 'restriction-create' => 'الإنشاء',
-'restriction-upload' => 'اÙ\84رÙ\81ع',
+'restriction-upload' => 'رفع',
 
 # Restriction levels
 'restriction-level-sysop' => 'حماية كاملة',
@@ -2690,7 +2726,7 @@ $UNWATCHURL
 'undeleterevision-missing' => 'مراجعة غير صحيحة أو مفقودة.
 ربما لديك وصلة سيئة، أو ربما المراجعة تم استرجاعها أو إزالتها من الأرشيف.',
 'undelete-nodiff' => 'لم يتم العثور على مراجعة سابقة.',
-'undeletebtn' => 'استرجع',
+'undeletebtn' => 'استرجاع',
 'undeletelink' => 'اعرض/استعد',
 'undeleteviewlink' => 'اعرض',
 'undeletereset' => 'أعد الضبط',
@@ -2708,7 +2744,7 @@ $UNWATCHURL
 'undelete-search-title' => 'البحث في الصفحات المحذوفة',
 'undelete-search-box' => 'ابحث في الصفحات المحذوفة',
 'undelete-search-prefix' => 'عرض الصفحات التي تبدأ بـ:',
-'undelete-search-submit' => 'ابحث',
+'undelete-search-submit' => 'بحث',
 'undelete-no-results' => 'لم يتم العثور على صفحات مطابقة في أرشيف المحذوفات.',
 'undelete-filename-mismatch' => 'لم يمكن استرجاع مراجعة الملف بتاريخ $1: اسم الملف لا يطابق',
 'undelete-bad-store-key' => 'لم يمكن استرجاع مراجعة الملف بتاريخ $1: الملف كان مفقوداً قبل الحذف',
@@ -2733,7 +2769,7 @@ $1',
 
 # Contributions
 'contributions' => 'مساهمات المستخدم',
-'contributions-title' => 'مساهمات المستخدم $1',
+'contributions-title' => 'مساهمات {{GENDER:$1|المستخدم|المستخدمة}} $1',
 'mycontris' => 'مساهماتي',
 'contribsub2' => 'ل$1 ($2)',
 'nocontribs' => 'لم يتم العثور على تغييرات تطابق هذه المحددات.',
@@ -2757,7 +2793,7 @@ $1',
 'sp-contributions-search' => 'بحث عن مساهمات',
 'sp-contributions-username' => 'عنوان أيبي أو اسم مستخدم:',
 'sp-contributions-toponly' => 'أظهر أعلى المراجعات فقط',
-'sp-contributions-submit' => 'ابحث',
+'sp-contributions-submit' => 'بحث',
 
 # What links here
 'whatlinkshere' => 'ماذا يصل هنا',
@@ -2842,7 +2878,7 @@ $1',
 'blocklist-by' => 'حظر المشرف',
 'blocklist-params' => 'معطيات المنع',
 'blocklist-reason' => 'السبب',
-'ipblocklist-submit' => 'ابحث',
+'ipblocklist-submit' => 'بحث',
 'ipblocklist-localblock' => 'المنع المحلي',
 'ipblocklist-otherblocks' => '{{PLURAL:$1||المنع الآخر|المنعان الآخران|المنوعات الأخرى}}',
 'infiniteblock' => 'لا نهائي',
@@ -2858,7 +2894,7 @@ $1',
 'unblocklink' => 'ارفع المنع',
 'change-blocklink' => 'تغيير المنع',
 'contribslink' => 'مساهمات',
-'emaillink' => 'أرسل بريدًا إلكترونيًا',
+'emaillink' => 'أرسل بريدا إلكترونيا',
 'autoblocker' => 'تم منعك تلقائياً لأن الأيبي الخاص بك تم استخدامه مؤخراً بواسطة «[[User:$1|$1]]».
 السبب المعطى لمنع $1 هو: «$2»',
 'blocklogpage' => 'سجل المنع',
@@ -2964,7 +3000,7 @@ $1',
 وفي هذه الحالات، يجب عليك نقل أو دمج محتويات الصفحة يدويا، إذا رغب في ذلك.",
 'movearticle' => 'انقل الصفحة:',
 'moveuserpage-warning' => "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم لن يعاد تسميته.'''",
-'movenologin' => 'غير مسجل',
+'movenologin' => 'غير مسجل الدخول',
 'movenologintext' => 'يجب أن تكون مستخدماً مسجلاً وأن  [[Special:UserLogin|تسجل دخولك]] لكي تنقل صفحة.',
 'movenotallowed' => 'أنت لا تمتلك الصلاحية لنقل الصفحات.',
 'movenotallowedfile' => 'أنت لا تمتلك الصلاحية لنقل الملفات.',
@@ -3089,6 +3125,7 @@ $1',
 'import-interwiki-templates' => 'ضمن كل القوالب',
 'import-interwiki-submit' => 'استيراد',
 'import-interwiki-namespace' => 'النطاق الهدف:',
+'import-interwiki-rootpage' => 'صفحة الجذر الهدف (اختياري) :',
 'import-upload-filename' => 'اسم الملف:',
 'import-comment' => 'تعليق:',
 'importtext' => 'من فضلك صدر الملف من الويكي المصدر باستخدام [[Special:Export|أداة التصدير]].
@@ -3123,6 +3160,9 @@ $1',
 'import-error-interwiki' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها محجوز للربط الخارجي (interwiki).',
 'import-error-special' => 'تعذر أستيراد الصفحة "$1" لأنها تنتمي إلى مساحة إسم خاصة تمنع الصفحات.',
 'import-error-invalid' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها غير صحيح.',
+'import-options-wrong' => 'خطأ {{PLURAL:$2|خيار|خيارات}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'إن عنوان الصفحة الجذر المعطاة هي ذات عنوان غير صالح.',
+'import-rootpage-nosubpage' => 'إن النطاق "$1" لصفحة الجذر لا يسمح بصفحات فرعية.',
 
 # Import log
 'importlogpage' => 'سجل الاستيراد',
@@ -3140,8 +3180,8 @@ $1',
 'javascripttest-pagetext-unknownframework' => 'إطار اختبار غير معروف "$1".',
 'javascripttest-pagetext-frameworks' => 'الرجاء اختيار أحد أطر الاختبارات التالية: $1',
 'javascripttest-pagetext-skins' => 'قم باختيار الواجهة لإجراء الإحتبارات بها:',
-'javascripttest-qunit-intro' => 'راجع [$1 Ù\88Ø«Ù\8aÙ\82Ø© Ø§Ù\84Ø¥ختبار] على mediawiki.org.',
-'javascripttest-qunit-heading' => 'جÙ\86اح Ø£ختبار MediaWiki JavaScript QUnit',
+'javascripttest-qunit-intro' => 'راجع [$1 Ù\88Ø«Ù\8aÙ\82Ø© Ø§Ù\84اختبار] على mediawiki.org.',
+'javascripttest-qunit-heading' => 'جÙ\86اح Ø§ختبار MediaWiki JavaScript QUnit',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'صفحة المستخدم الخاصة بك',
@@ -3153,7 +3193,7 @@ $1',
 'tooltip-pt-mycontris' => 'قائمة مساهماتك',
 'tooltip-pt-login' => 'يفضل أن تسجل الدخول، لكنه ليس إلزاميا.',
 'tooltip-pt-anonlogin' => 'من المفضل أن تقوم بتسجيل الدخول، هذا ليس إلزاميا.',
-'tooltip-pt-logout' => 'خروج',
+'tooltip-pt-logout' => 'تسجÙ\8aÙ\84 Ø§Ù\84خرÙ\88ج',
 'tooltip-ca-talk' => 'نقاش عن صفحة المحتوى',
 'tooltip-ca-edit' => 'يمكنك تعديل هذه الصفحة.
 من فضلك استخدم زر العرض المسبق قبل الحفظ.',
@@ -3256,7 +3296,7 @@ $1',
 'anonymous' => '{{PLURAL:$1|مستخدم مجهول|مستخدمون مجهولون}} ل{{SITENAME}}',
 'siteuser' => 'مستخدم {{SITENAME}} $1',
 'anonuser' => 'مستخدم {{SITENAME}}  المجهول $1',
-'lastmodifiedatby' => 'أجرى آخر تعديل لهذه الصفحة $3 في $2، $1.',
+'lastmodifiedatby' => '{{GENDER:$4|أجرى|أجرت}} $3 آخر تعديل لهذه الصفحة في $2، $1.',
 'othercontribs' => 'بناء على عمل $1.',
 'others' => 'أخرون',
 'siteusers' => '{{PLURAL:$2||مستخدم|مستخدمي}} {{SITENAME}} $1',
@@ -3272,19 +3312,38 @@ $1',
 'spambot_username' => 'تنظيف سبام ميدياويكي',
 'spam_reverting' => 'استرجاع آخر نسخة ليس بها وصلات إلى $1',
 'spam_blanking' => 'كل النسخ احتوت على وصلات ل $1، إفراغ',
+'spam_deleting' => 'جميع النسخ تحوي رابطا إلى $1، يتم الحذف',
 
 # Info page
 'pageinfo-title' => 'المعلومات ل"$1"',
+'pageinfo-header-basic' => 'المعلومات الأساسية',
 'pageinfo-header-edits' => 'التعديلات',
-'pageinfo-header-watchlist' => 'قائمة المراقبة',
-'pageinfo-header-views' => 'مشاهدات',
-'pageinfo-subjectpage' => 'الصفحة',
-'pageinfo-talkpage' => 'صفحة نقاش',
+'pageinfo-header-restrictions' => 'حماية الصفحة',
+'pageinfo-header-properties' => 'خصائص الصفحة',
+'pageinfo-display-title' => 'عرض العنوان',
+'pageinfo-default-sort' => 'مفتاح الترتيب الافتراضي',
+'pageinfo-length' => 'حجم الصفحة (بالبايت)',
+'pageinfo-article-id' => 'معرف الصفحة (ID)',
+'pageinfo-robot-policy' => 'الصفة في محرك البحث',
+'pageinfo-robot-index' => 'قابلة للفهرسة',
+'pageinfo-robot-noindex' => 'غير قابلة للفهرسة',
+'pageinfo-views' => 'عدد المشاهدات',
 'pageinfo-watchers' => 'عدد المراقبين',
+'pageinfo-redirects-name' => 'التوجيهات نحو هذه الصفحة',
+'pageinfo-subpages-name' => 'الصفحات الفرعية لهذه الصفحة',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|إعادة توجيه|إعادة توجيهات}}; $3 {{PLURAL:$3|غير إعادة توجيه|غير إعادة التوجيهات}})',
+'pageinfo-firstuser' => 'منشئ الصفحة',
+'pageinfo-firsttime' => 'تاريخ إنشاء الصفحة',
+'pageinfo-lastuser' => 'آخر محرر',
+'pageinfo-lasttime' => 'تاريخ آخر تعديل',
 'pageinfo-edits' => 'عدد التعديلات',
 'pageinfo-authors' => 'عدد المؤلفين المختلفين',
-'pageinfo-views' => 'عدد المشاهدات',
-'pageinfo-viewsperedit' => 'المشاهدات لكل تعديل',
+'pageinfo-recent-edits' => 'عدد التعديلات الأخيرة (خلال  $1 يوم/أيام)',
+'pageinfo-recent-authors' => 'عدد المؤلفين المختلفين الأخيرين',
+'pageinfo-restriction' => 'حماية الصفحة (<code>$1</code>)',
+'pageinfo-magic-words' => 'السحرية {{PLURAL:$1|الكلمة|الكلمات}} ($1)',
+'pageinfo-hidden-categories' => 'مخفية {{PLURAL:$1|فئة|فئات}} ($1)',
+'pageinfo-templates' => 'متضمنة {{PLURAL:$1|قالب|قوالب}} ($1)',
 
 # Skin names
 'skinname-standard' => 'كلاسيك',
@@ -3298,15 +3357,15 @@ $1',
 'skinname-vector' => 'فكتور',
 
 # Patrolling
-'markaspatrolleddiff' => 'علم كمراجعة',
-'markaspatrolledtext' => 'علم على هذه الصفحة كمراجعة',
-'markedaspatrolled' => 'تÙ\85 Ø§Ù\84تعÙ\84Ù\8aÙ\85 Ù\83مراجعة',
-'markedaspatrolledtext' => 'اÙ\84Ù\85راجعة Ø§Ù\84Ù\85ختارة Ù\85Ù\86 [[:$1]] ØªÙ\85 Ø§Ù\84تعÙ\84Ù\8aÙ\85 Ø¹Ù\84Ù\8aÙ\87ا Ù\83مراجعة.',
+'markaspatrolleddiff' => 'علم بعلامة المراجعة',
+'markaspatrolledtext' => 'علم هذه الصفحة بعلامة المراجعة',
+'markedaspatrolled' => 'عÙ\84Ù\85ت Ø¨Ø¹Ù\84اÙ\85Ø© Ø§Ù\84مراجعة',
+'markedaspatrolledtext' => 'اÙ\84Ù\85راجعة Ø§Ù\84Ù\85ختارة Ù\85Ù\86 [[:$1]] Ø¹Ù\84Ù\85ت Ø¨Ø¹Ù\84اÙ\85Ø© Ø§Ù\84مراجعة.',
 'rcpatroldisabled' => 'مراجعة أحدث التغييرات معطلة',
 'rcpatroldisabledtext' => 'خاصية مراجعة أحدث التغييرات معطلة حاليا',
 'markedaspatrollederror' => 'لا يمكن التعليم بالمراجعة',
 'markedaspatrollederrortext' => 'يجب عليك اختيار المراجعة التي تريد أن تشير أنها مراجعة',
-'markedaspatrollederror-noautopatrol' => 'Ù\85Ù\86 ØºÙ\8aر Ø§Ù\84Ù\85سÙ\85Ù\88Ø­ Ù\84Ù\83 Ø§Ù\84تعÙ\84Ù\8aÙ\85 Ø¹Ù\84Ù\89 ØªØºÙ\8aÙ\8aراتÙ\83 Ø§Ù\84شخصÙ\8aØ© Ù\83مراجعة.',
+'markedaspatrollederror-noautopatrol' => 'Ù\84ا Ù\8aجÙ\88ز Ù\84Ù\83 ØªØ¹Ù\84Ù\8aÙ\85 ØªØºÙ\8aÙ\8aراتÙ\83 Ø§Ù\84شخصÙ\8aØ© Ø¨Ø¹Ù\84اÙ\85Ø© Ø§Ù\84مراجعة.',
 
 # Patrol log
 'patrol-log-page' => 'سجل الخفر',
@@ -3338,6 +3397,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 بكسل, حجم الملف  : $3 ، نوع الملف : $4 ، $5 {{PLURAL:$5| صفحة | صفحات}}',
 'file-nohires' => 'لا توجد دقة أعلى متوفرة.',
 'svg-long-desc' => 'ملف SVG، أبعاده $1 × $2 بكسل، حجم الملف: $3',
+'svg-long-desc-animated' => 'ملف SVG متحرك، بمقاسات  $1  ×  $2  بكسل، حجم الملف: $3',
 'show-big-image' => 'دقة كاملة',
 'show-big-image-preview' => 'حجم هذه المعاينة: $1.',
 'show-big-image-other' => '{{PLURAL:$2||البعد الآخر|البعدان الآخران|الأبعاد الأخرى}}: $1.',
@@ -3347,6 +3407,8 @@ $1',
 'file-info-png-looped' => 'ملفوف',
 'file-info-png-repeat' => 'عرضت {{PLURAL:$1||مرة واحدة|مرتين|$1 مرات|$1 مرة}}',
 'file-info-png-frames' => '{{PLURAL:$1||إطار واحد|إطاران|$1 إطارات|$1 إطارًا|$1 إطار}}',
+'file-no-thumb-animation' => "'' 'ملاحظة: نظراً للقيود التقنية، فإن الصورة المصغرة لهذا الملف ستكون غير متحركة. '''",
+'file-no-thumb-animation-gif' => "'' 'ملاحظة: نظراً للقيود التقنية، فإن الصورة المصغرة لهذا الملف GIF عالي الدقة ستكون غير متحركة. '''",
 
 # Special:NewFiles
 'newimages' => 'معرض الملفات الجديدة',
@@ -3356,15 +3418,16 @@ $1',
 'newimages-label' => 'اسم الملف (أو جزء منه):',
 'showhidebots' => '($1 بوتات)',
 'noimages' => 'لا شيء للعرض.',
-'ilsubmit' => 'ابحث',
+'ilsubmit' => 'بحث',
 'bydate' => 'حسب التاريخ',
 'sp-newimages-showfrom' => 'أظهر الملفات الجديدة بدءا من $2، $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1، $2×$3',
-'seconds-abbrev' => '$1s',
-'minutes-abbrev' => '$1m',
-'hours-abbrev' => '$1h',
+'seconds-abbrev' => '$1ث',
+'minutes-abbrev' => '$1ق',
+'hours-abbrev' => '$1س',
+'days-abbrev' => '$1ي',
 'seconds' => '{{PLURAL:$1||ثانية واحدة|ثانيتين|$1 ثوانٍ|$1 ثانية}}',
 'minutes' => '{{PLURAL:$1||دقيقة واحدة|دقيقتين|$1 دقائق|$1 دقيقة}}',
 'hours' => '{{PLURAL:$1||ساعة واحدة|ساعتين|$1 ساعات|$1 ساعة}}',
@@ -3588,6 +3651,7 @@ $1',
 'exif-compression-2' => 'CCITT المجموعة 3 -1 تعديل طول تشغيل ترميز هوفمان البعدي',
 'exif-compression-3' => 'ترميز فاكس المجموعة 3 CCITT',
 'exif-compression-4' => 'ترميز فاكس المجموعة 4 CCITT',
+'exif-compression-5' => 'إل زد دبليو',
 'exif-compression-6' => 'JPEG (قديم)',
 'exif-compression-7' => 'جيه بي إي جي',
 'exif-compression-8' => 'Deflate (أدوبي)',
@@ -3957,9 +4021,25 @@ $5
 'size-kilobytes' => '$1 كيلوبايت',
 'size-megabytes' => '$1 ميجابايت',
 'size-gigabytes' => '$1 جيجابايت',
+'size-terabytes' => '$1 تيرابايت',
+'size-petabytes' => '$1 بيتابايت',
+'size-exabytes' => '$1 إكسابايت',
+'size-zetabytes' => '$1 زيتابايت',
+'size-yottabytes' => '$1 يوتابايت',
+
+# Bitrate units
+'bitrate-bits' => '$1بيت لكل ثانية',
+'bitrate-kilobits' => '$1كيلوبيت لكل ثانية',
+'bitrate-megabits' => '$1ميجابيت لكل ثانية',
+'bitrate-gigabits' => '$1جيجابيت لكل ثانية',
+'bitrate-terabits' => '$1تيرابيت لكل ثانية',
+'bitrate-petabits' => '$1بيتابيت لكل ثانية',
+'bitrate-exabits' => '$1إكسابيت لكل ثانية',
+'bitrate-zetabits' => '$1زيتابيت لكل ثانية',
+'bitrate-yottabits' => '$1يوتابيت لكل ثانية',
 
 # Live preview
-'livepreview-loading' => 'يُحمّل...',
+'livepreview-loading' => 'جاري التحميل...',
 'livepreview-ready' => 'يُحمّل… جاهز!',
 'livepreview-failed' => 'فشل العرض المباشر!
 حاول تجربة العرض العادي.',
@@ -4070,6 +4150,7 @@ $5
 'version-variables' => 'المتغيرات',
 'version-antispam' => 'منع البريد المزعج',
 'version-skins' => 'واجهات',
+'version-api' => 'إيه بي آي',
 'version-other' => 'أخرى',
 'version-mediahandlers' => 'متحكمات الميديا',
 'version-hooks' => 'الخطاطيف',
@@ -4094,6 +4175,8 @@ $5
 'version-entrypoints' => 'نقطة دخول روابط المواقع',
 'version-entrypoints-header-entrypoint' => 'تقطة دخول',
 'version-entrypoints-header-url' => 'المسار',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسار المقالات]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسار السكريبت]',
 
 # Special:FilePath
 'filepath' => 'مسار ملف',
@@ -4107,7 +4190,7 @@ $5
 'fileduplicatesearch-summary' => 'ابحث عن الملفات المكررة بناء على قيم الهاش.',
 'fileduplicatesearch-legend' => 'بحث عن مكرر',
 'fileduplicatesearch-filename' => 'اسم الملف:',
-'fileduplicatesearch-submit' => 'ابحث',
+'fileduplicatesearch-submit' => 'بحث',
 'fileduplicatesearch-info' => '$1 × $2 بكسل<br />حجم الملف: $3<br />نوع MIME: $4',
 'fileduplicatesearch-result-1' => 'الملف "$1" ليس له تكرار مطابق.',
 'fileduplicatesearch-result-n' => 'الملف "$1" له {{PLURAL:$2|1 تكرار مطابق|$2 تكرار مطابق}}.',
@@ -4121,7 +4204,7 @@ $5
 * <span class="mw-specialpagecached">صفحات خاصة لبيانات مخزنة فقط (قد تكون مهجورة).</span>',
 'specialpages-group-maintenance' => 'تقارير الصيانة',
 'specialpages-group-other' => 'صفحات خاصة أخرى',
-'specialpages-group-login' => 'دخÙ\88Ù\84 / ØªØ³Ø¬Ù\8aÙ\84',
+'specialpages-group-login' => 'دخÙ\88Ù\84 / Ø¥Ù\86شاء Ø­Ø³Ø§Ø¨',
 'specialpages-group-changes' => 'السجلات وأحدث التغييرات',
 'specialpages-group-media' => 'تقارير الميديا وعمليات الرفع',
 'specialpages-group-users' => 'المستخدمون والصلاحيات',
@@ -4156,7 +4239,7 @@ $5
 'tags-display-header' => 'الظهور في قوائم التغييرات',
 'tags-description-header' => 'وصف كامل للمعنى',
 'tags-hitcount-header' => 'تغييرات موسومة',
-'tags-edit' => 'عدل',
+'tags-edit' => 'تعدÙ\8aل',
 'tags-hitcount' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
 
 # Special:ComparePages
@@ -4188,7 +4271,7 @@ $5
 'htmlform-int-toolow' => 'القيمة التي حددتها أقل من الحد الأدنى وهو $1',
 'htmlform-int-toohigh' => 'القيمة التي حددتها أكبر من الحد الأقصى وهو $1',
 'htmlform-required' => 'هذه القيمة مطلوبة',
-'htmlform-submit' => 'أرسل',
+'htmlform-submit' => 'إرسال',
 'htmlform-reset' => 'الرجوع عن التغييرات',
 'htmlform-selectorother-other' => 'أخرى',
 
@@ -4197,9 +4280,9 @@ $5
 'sqlite-no-fts' => '$1 بدون دعم البحث في كامل النص',
 
 # New logging system
-'logentry-delete-delete' => 'حذف $1 صفحة $3',
+'logentry-delete-delete' => '$1 حذف الصفحة $3',
 'logentry-delete-restore' => 'استعاد $1 صفحة $3',
-'logentry-delete-event' => 'غيّر $1 إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4',
+'logentry-delete-event' => '$1 غير خاصية العرض لـ {{PLURAL:$5|مدخل السجل|$5 مدخلات السجل}} في $3: $4',
 'logentry-delete-revision' => 'غيّر $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4',
 'logentry-delete-event-legacy' => 'غيّر $1 إمكانية رؤية أحداث سجل $3',
 'logentry-delete-revision-legacy' => 'غيّر $1 إمكانية رؤية مراجعات صفحة $3',
@@ -4233,7 +4316,7 @@ $5
 بخلاف ذلك، يمكنك أستخدام الطريقة الأسهل أسفله، سيتم إضافة تعليقك للصفحة "[$3 $2]"، بالإضافة إلى اسم المستخدم و نوع المتصفح الذي تستخدمه حاليا.',
 'feedback-subject' => 'الموضوع:',
 'feedback-message' => 'الرسالة:',
-'feedback-cancel' => 'Ø£Ù\84غÙ\90',
+'feedback-cancel' => 'Ø¥Ù\84غاء',
 'feedback-submit' => 'أرسل الملاحظات',
 'feedback-adding' => 'إضافة تعليقات إلى الصفحة...',
 'feedback-error1' => 'خطأ: لا يمكن التعرف عليها من API',
@@ -4255,9 +4338,12 @@ $5
 'api-error-empty-file' => 'كان ملف الذي قمت بإرسال فارغة.',
 'api-error-emptypage' => 'إنشاء صفحات فارغة جديدة، غير مسموح به.',
 'api-error-fetchfileerror' => 'خطأ داخلي: قد حدث خطأ أثناء إحضار الملف.',
+'api-error-fileexists-forbidden' => 'يوجد مسبقا ملف باسم "$1"، ولا يمكن استبداله.',
+'api-error-fileexists-shared-forbidden' => 'يوجد مسبقا ملف باسم "$1" في مستودع الملفات المشتركة، ولا يمكن استبداله.',
 'api-error-file-too-large' => 'الملف الذي أرسلته كان كبيرا جدا.',
 'api-error-filename-tooshort' => 'اسم الملف قصير جدا.',
 'api-error-filetype-banned' => 'نوع الملف هذا ممنوع.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|ليس نوع ملف مسموح به|ليست أنواع ملفات مسموح بها}}. {{PLURAL:$3|نوع الملف المسموح به هو|أنواع الملفات المسموح بها هي}} $2.',
 'api-error-filetype-missing' => 'يفتقد الملفّ ملحق نوعيّته.',
 'api-error-hookaborted' => 'التعديل الذي تحاول أن تقوم به تم إحباطه',
 'api-error-http' => 'خطأ داخلي: تعذر الاتصال بالخادوم.',
index 5dfb27f..e11d902 100644 (file)
@@ -78,30 +78,30 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ܨܘܝܒܐ', '#REDIRECT' ),
-       'numberofpages'           => array( '1', 'ܡܢܝܢܐ_ܕܦܐܬܬ̈ܐ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ܡܢܝܢܐ_ܕܡܠܘܐ̈ܐ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ܡܢܝܢܐ_ܕܠܦܦ̈ܐ', 'NUMBEROFFILES' ),
-       'pagename'                => array( '1', 'ܫܡܐ_ܕܦܐܬܐ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ܟܘܢܝܐ_ܕܦܐܬܐ', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ܚܩܠܐ', 'NAMESPACE' ),
-       'msg'                     => array( '0', 'ܐܓܪܬܐ:', 'MSG:' ),
-       'img_thumbnail'           => array( '1', 'ܙܥܘܪܬܐ', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'ܙܥܘܪܬܐ=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'ܝܡܝܢܐ', 'right' ),
-       'img_left'                => array( '1', 'ܣܡܠܐ', 'left' ),
-       'img_none'                => array( '1', 'ܠܐ_ܡܕܡ', 'none' ),
-       'img_center'              => array( '1', 'ܡܨܥܐ', 'center', 'centre' ),
-       'img_page'                => array( '1', 'ܦܐܬܐ=$1', 'ܦܐܬܐ $1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'ܬܚܘܡܐ', 'border' ),
-       'img_baseline'            => array( '1', 'ܣܪܛܐ_ܫܪܫܝܐ', 'baseline' ),
-       'img_sub'                 => array( '1', 'ܦܪܥܝܐ', 'sub' ),
-       'grammar'                 => array( '0', 'ܬܘܪܨ_ܡܡܠܠܐ:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ܓܢܣܐ:', 'GENDER:' ),
-       'language'                => array( '0', '#ܠܫܢܐ:', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'ܕܝܠܢܝܐ', 'special' ),
-       'url_path'                => array( '0', 'ܫܒܝܠܐ', 'PATH' ),
-       'url_wiki'                => array( '0', 'ܘܝܩܝ', 'WIKI' ),
+       'redirect'                  => array( '0', '#ܨܘܝܒܐ', '#REDIRECT' ),
+       'numberofpages'             => array( '1', 'ܡܢܝܢܐ_ܕܦܐܬܬ̈ܐ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ܡܢܝܢܐ_ܕܡܠܘܐ̈ܐ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ܡܢܝܢܐ_ܕܠܦܦ̈ܐ', 'NUMBEROFFILES' ),
+       'pagename'                  => array( '1', 'ܫܡܐ_ܕܦܐܬܐ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ܟܘܢܝܐ_ܕܦܐܬܐ', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ܚܩܠܐ', 'NAMESPACE' ),
+       'msg'                       => array( '0', 'ܐܓܪܬܐ:', 'MSG:' ),
+       'img_thumbnail'             => array( '1', 'ܙܥܘܪܬܐ', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'ܙܥܘܪܬܐ=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'ܝܡܝܢܐ', 'right' ),
+       'img_left'                  => array( '1', 'ܣܡܠܐ', 'left' ),
+       'img_none'                  => array( '1', 'ܠܐ_ܡܕܡ', 'none' ),
+       'img_center'                => array( '1', 'ܡܨܥܐ', 'center', 'centre' ),
+       'img_page'                  => array( '1', 'ܦܐܬܐ=$1', 'ܦܐܬܐ $1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'ܬܚܘܡܐ', 'border' ),
+       'img_baseline'              => array( '1', 'ܣܪܛܐ_ܫܪܫܝܐ', 'baseline' ),
+       'img_sub'                   => array( '1', 'ܦܪܥܝܐ', 'sub' ),
+       'grammar'                   => array( '0', 'ܬܘܪܨ_ܡܡܠܠܐ:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ܓܢܣܐ:', 'GENDER:' ),
+       'language'                  => array( '0', '#ܠܫܢܐ:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'ܕܝܠܢܝܐ', 'special' ),
+       'url_path'                  => array( '0', 'ܫܒܝܠܐ', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ܘܝܩܝ', 'WIKI' ),
 );
 
 $messages = array(
@@ -112,10 +112,10 @@ $messages = array(
 'tog-editondblclick' => 'ܫܚܠܦ ܦܐܬ̈ܐ ܬܪ ܢܩܪܐ ܙܘܓܢܝܐ (ܣܢܝܩ ܠ JavaScript)',
 'tog-editsection' => 'ܡܫܟܚ ܫܘܚܠܦܐ ܕܦܘܣܩ̈ܐ ܒܐܘܪܚܐ ܕܐܝܨܘܪ̈ܐ  [ܫܚܠܦ]',
 'tog-rememberpassword' => 'ܕܟܘܪ ܥܠܠܬܝ ܥܠ ܡܦܐܬܢܐ ܗܢܐ (ܠܡܬܚܐ ܥܠܝܐ ܕ $1 {{PLURAL:$1|ܝܘܡܐ|ܝܘܡܬ̈ܐ}})',
-'tog-watchcreations' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܕܒܪܐ ܐܢܐ ܠܪ̈ܗܝܬܝ',
-'tog-watchdefault' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܕܫܚܠܦ ܐܢܐ ܠܪ̈ܗܝܬܝ',
-'tog-watchmoves' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܕܫܢܐ ܐܢܐ ܠܪ̈ܗܝܬܝ',
-'tog-watchdeletion' => 'Ü\90Ü\98ܣܦ Ü¦Ü\90ܬܬÌ\88Ü\90 Ü\95ܫܦÜ\90 ܐܢܐ ܠܪ̈ܗܝܬܝ',
+'tog-watchcreations' => 'Ü\90Ü\98ܣܦ Ü¦Ü\90ܬܬÌ\88Ü\90 Ü\95Ü\92ܪÜ\90 Ü\90Ü¢Ü\90 Ü\98ܠܠܦÌ\88Ü\90 Ü\95Ü\90ܣܩ Ü\90Ü¢Ü\90 Ü ÜªÌ\88Ü\97Ü\9dܬÜ\9d',
+'tog-watchdefault' => 'Ü\90Ü\98ܣܦ Ü¦Ü\90ܬܬÌ\88Ü\90 Ü\98ܠܦܦÌ\88Ü\90 Ü\95Ü«Ü\9aܠܦ Ü\90Ü¢Ü\90 Ü ÜªÌ\88Ü\97Ü\9dܬÜ\9d',
+'tog-watchmoves' => 'Ü\90Ü\98ܣܦ Ü¦Ü\90ܬܬÌ\88Ü\90 Ü\98ܠܦܦÌ\88Ü\90 Ü\95Ü«Ü¢Ü\90 Ü\90Ü¢Ü\90 Ü ÜªÌ\88Ü\97Ü\9dܬÜ\9d',
+'tog-watchdeletion' => 'Ü\90Ü\98ܣܦ Ü¦Ü\90ܬܬÌ\88Ü\90 Ü\98ܠܦܦÌ\88Ü\90 Ü\95Ü«Ü\90ܦ ܐܢܐ ܠܪ̈ܗܝܬܝ',
 'tog-watchlisthideown' => 'ܛܫܝ ܫܘܚܠܦ̈ܝ ܡܢ ܪ̈ܗܝܬܐ',
 'tog-watchlisthidebots' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܕܒܘܬ ܡܢ ܪ̈ܗܝܬܐ',
 'tog-watchlisthideminor' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ ܡܢ ܪ̈ܗܝܬܐ',
@@ -208,7 +208,7 @@ $messages = array(
 'qbbrowse' => 'ܡܦܐܬ',
 'qbedit' => 'ܫܚܠܦ',
 'qbpageoptions' => 'ܗܕܐ ܦܐܬܐ',
-'qbmyoptions' => 'Ü\95Ì\88ܦܐ ܕܝܠܝ',
+'qbmyoptions' => 'ܦÜ\90ܬܬÌ\88ܐ ܕܝܠܝ',
 'qbspecialpages' => 'ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ',
 'faq' => 'ܫܘܐܠ̈ܐ ܬܢܝ̈ܐ',
 'faqpage' => 'Project:ܫܘܐܠ̈ܐ ܬܢܝ̈ܐ',
@@ -284,9 +284,9 @@ $messages = array(
 'jumpto' => 'ܫܘܪ ܠ:',
 'jumptonavigation' => 'ܐܠܦܪܘܬܐ',
 'jumptosearch' => 'ܒܨܝܐ',
-'view-pool-error' => 'ܬÜ\98Ü\9dÜ\9aܐ، ܬܫܡܫܬ̈ܐ ܐܢܘܢ ܠܐ̈ܝܐ ܗܫܐܝܬ
-Ü£Ü\93Ü\9d Ü¡Ü¦Ü Ü\9aÜ¢Ì\88Ü\90 Ü¢Ü£Ü\9dÜ¢ Ü Ü\9aÜ\99Ü\9dÜ\90 Ü\95Ü\97Ü¢Ü\90 Ü\95ܦܐ
-ܦÜ\9dÜ£Ü\90 Ü¡Ü¢Ü\9f Ü£Ü\9fÜ\9d Ü©Ü Ü\9dÜ  Ü¡Ü¢ Ü©Ü\95Ü¡ Ü\95ܬܢܣÜ\90 Ü Ü¡Ü\9bÜ\9dÜ\90 Ü Ü\97Ü¢Ü\90 Ü\95ܦܐ ܙܒܢܬܐ ܐܚܪܬܐ.
+'view-pool-error' => 'Ü«Ü\98Ü\92Ü©Ü¢ܐ، ܬܫܡܫܬ̈ܐ ܐܢܘܢ ܠܐ̈ܝܐ ܗܫܐܝܬ
+Ü£Ü\93Ü\9d Ü¡Ü¦Ü Ü\9aÜ¢Ì\88Ü\90 Ü¢Ü£Ü\9dÜ¢ Ü Ü\9aÜ\99Ü\9dÜ\90 Ü\95ܦÜ\90ܬÜ\90 Ü\97Ü\95ܐ
+ܦÜ\9dÜ£Ü\90 Ü¡Ü¢Ü\9f Ü£Ü\9fÜ\9d Ü©Ü Ü\9dÜ  Ü¡Ü¢ Ü©Ü\95Ü¡ Ü\95ܬܢܣÜ\90 Ü Ü¡Ü\9bÜ\9dÜ\90 Ü Ü¦Ü\90ܬÜ\90 Ü\97Ü\95ܐ ܙܒܢܬܐ ܐܚܪܬܐ.
 
 $1',
 'pool-timeout' => 'ܫܠܡ ܥܕܢܐ ܣܒܪܬܐ ܠܚܠܩܐ',
@@ -363,13 +363,15 @@ $1',
 'badtitle' => 'ܟܘܢܝܐ ܠܐ ܛܒܐ',
 'perfcached' => 'ܓܠܝܬ̈ܐ ܗܠܝܢ ܐܣܢܝܢ ܐܢܘܢ ܘܡܬܡܨܝܢܬܐ ܐܝܬܝܗܝ ܕܠܐ ܢܗܘܢ ܚܘ̈ܕܬܐ. ܡܬܚܐ ܥܠܝܐ ܕ {{PLURAL:$1|ܚܕ ܦܠܛܐ|$1 ܦܠܛ̈ܐ}} ܐܝܬ ܒܐܣܢܐ.',
 'perfcachedts' => 'ܓܠܝܬ̈ܐ ܗܠܝܢ ܐܣܢܝܢ ܐܢܘܢ ܘܚܘܕܬܐ ܐܚܪܝܐ ܗܘܐ ܒ $1. ܡܬܚܐ ܥܠܝܐ ܕ {{PLURAL:$4|ܚܕ ܦܠܛܐ|$4 ܦܠܛ̈ܐ}} ܐܝܬ ܒܐܣܢܐ.',
+'querypage-no-updates' => 'ܚܘܕ̈ܬܐ ܕܗܕܐ ܦܐܬܐ ܠܐ ܙܪ̈ܝܙܐ ܐܢܘܢ.
+ܝܕ̈ܥܬܐ ܗܪܟܐ ܠܐ ܡܬܚܕܬܝܢ ܗܫܐ.',
 'viewsource' => 'ܚܙܝ ܡܒܘܥܐ',
 'viewsource-title' => 'ܚܙܝ ܡܒܘܥܐ ܕ $1',
 'actionthrottled' => 'ܠܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗܝ ܠܡܥܒܕ ܝܬܝܪ ܡܢ ܗܢܐ ܥܒܕܐ',
 'viewsourcetext' => 'ܡܨܐ ܐܢܬ ܕܢܚܙܐ ܘܢܣܚܐ ܠܡܒܘ̈ܥܐ ܕܗܕܐ ܦܐܬܐ:',
 'protectedinterface' => 'ܗܕܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ, ܘܐܝܬܝܗܝ ܢܛܪܬܐ ܠܡܘܢܥ ܚܘܒܠܐ.',
-'editinginterface' => "'''Ü\99Ü\98Ü\97ܪÜ\90:''' Ü\90ܢܬ Ü«Ü\9aܠܦܬ Ü\95ܦÜ\90 Ü\95ܡܬܦܠÜ\9a Ü\92Ü\9aÜ\99Ü\9dÜ\90 Ü\9fܬÜ\9dÜ\92Ü\9dÜ\90 Ü\95Ü\9aÜ\98ܪÜ\99ܐ.
\9fÜ  Ü«Ü\98Ü\9aܠܦÜ\90 Ü\92Ü\97Ü¢Ü\90 Ü\95ܦÜ\90 Ü¢Ü\97Ü\98Ü\90 Ü Ü\97 Ü¡Ü¥Ü\92Ü\95Ü¢Ü\98ܬÜ\90 Ü¥Ü  Ü\90Ü£Ü\9fÜ¡Ü\90 Ü\95Ü\95ܦܐ ܕܡܦܠܚܢܐ ܕܡܦܠܚܢ̈ܐ ܐܚܪ̈ܢܐ.
+'editinginterface' => "'''Ü\99Ü\98Ü\97ܪÜ\90:''' Ü\90ܢܬ Ü«Ü\9aܠܦܬ Ü¦Ü\90ܬÜ\90 Ü\95ܡܬܦܠÜ\9aܬ Ü\92Ü\9aÜ\99Ü\9dÜ\90 Ü\9fܬÜ\9dÜ\92Ü\9dÜ\90 Ü\95ܬÜ\9aܪÜ\99ܬܐ.
\9fÜ  Ü«Ü\98Ü\9aܠܦÜ\90 Ü\92ܦÜ\90ܬÜ\90 Ü\97Ü\95Ü\90 Ü¢Ü\97Ü\98Ü\90 Ü Ü\97 Ü¡Ü¥Ü\92Ü\95Ü¢Ü\98ܬÜ\90 Ü¥Ü  Ü\90Ü£Ü\9fÜ¡Ü\90 Ü\95ܦÜ\90ܬܐ ܕܡܦܠܚܢܐ ܕܡܦܠܚܢ̈ܐ ܐܚܪ̈ܢܐ.
 ܠܬܘܪ̈ܓܡܐ، ܐܦܠܚ ܬܪܡܝܬܐ ܕܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
 'sqlhidden' => '(ܒܘܬܬܐ SQL ܛܫܝܐ)',
 'namespaceprotected' => "ܠܝܬ ܠܟ ܦܣܣܐ ܠܫܚܠܦܬܐ ܕܦܐܬܬ̈ܐ ܒܚܩܠܐ ܕ'''$1'''.",
@@ -377,9 +379,9 @@ $1',
 # Login and logout pages
 'logouttext' => "'''ܗܫܐ ܦܠܛܠܟ ܡܢ ܚܘܫܒܢܟ.'''
 
-ܡܨÜ\90 Ü\90ܢܬ Ü\95Ü\90ܬÜ\9aÜ«Ü\9a {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܐ ܐܢܬ ܕ[[Special:UserLogin|ܬܥܘܠ]] ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
+ܡܨÜ\90 Ü\90ܢܬ Ü\90ܦܠÜ\9aܬ {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܐ ܐܢܬ ܕ[[Special:UserLogin|ܬܥܘܠ]] ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
 
\9aÜ\95 Ü\9fÜ¡Ü\90 Ü¡Ü¢ Ü\95Ì\88ܦÜ\90 Ü¡Ü¬Ü\9aÜ\99Ü\9dÜ¢ Ü\90Ü\9dÜ\9f Ü\95Ü\97Ü\98 Ü\90ܢܬ Ü¥Ü Ü\9dÜ Ü\90 Ü¥Ü\95Ü¡Ü\90 Ü\95Ü\90ܣܦܩܬ Ü Ü\95Ì\88ܦÜ\90 Ü Ü\92Ü\9dÜ\9f̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ",
\9aÜ\95 Ü\9fÜ¡Ü\90 Ü¡Ü¢ Ü¦Ü\90ܬܬÌ\88Ü\90 Ü¡Ü¬Ü\9aÜ\99Ü\9dÜ¢ Ü\90Ü\9dÜ\9f Ü\95Ü\97Ü\98 Ü\90ܢܬ Ü¥Ü Ü\9dÜ Ü\90 Ü¥Ü\95Ü¡Ü\90 Ü\95Ü\90ܣܦܩܬ Ü Ü¦Ü\90ܬܬÌ\88Ü\90 Ü Ü\92Ü\9dÜ\9fܬ̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ",
 'welcomecreation' => '== ܒܫܝܢܐ, $1! ==
 ܐܬܒܪܝ ܚܘܫܒܢܟ.
 ܠܐ ܢܫܐ ܐܢܬ ܠܫܚܠܦܬܐ ܕ[[Special:Preferences|ܨܒܝܢܝܘܬ̈ܐ ܒ {{SITENAME}}]].',
@@ -433,8 +435,13 @@ $1',
 'resetpass-temp-password' => 'ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܢܝܬܐ:',
 
 # Special:PasswordReset
+'passwordreset' => 'ܣܘܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
+'passwordreset-legend' => 'ܣܘܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
 'passwordreset-username' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 
+# Special:ChangeEmail
+'changeemail' => 'ܫܚܠܦ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
+
 # Edit page toolbar
 'bold_sample' => 'ܟܬܒܬܐ ܥܒܝܬܐ',
 'bold_tip' => 'ܟܬܒܬܐ ܥܒܝܬܐ',
@@ -445,6 +452,7 @@ $1',
 'extlink_tip' => 'ܐܣܘܪܐ ܒܪܝܐ (ܕܟܘܪ http:// ܩܕܡܝܬܐ)',
 'headline_sample' => 'ܨܚܚܐ ܕܦܪܫܓܢܐ ܪܫܝܐ',
 'nowiki_sample' => 'ܣܢܘܦ ܟܬܒܬܐ ܕܠܐ ܣܕܝܪܘܬܐ ܗܪܟܐ',
+'nowiki_tip' => 'ܒܣܝ ܣܕܝܪܘܬܐ ܕܘܝܩܝ',
 'image_tip' => 'ܠܦܦܐ ܛܡܝܪܐ',
 'media_tip' => 'ܐܣܘܪܐ ܕܠܦܦܐ',
 'sig_tip' => 'ܪܡܝ ܐܝܕܟ ܥܡ ܙܒܢܐ ܘܣܝܩܘܡܐ',
@@ -454,7 +462,7 @@ $1',
 'subject' => 'ܡܠܘܐܐ/ܡܘܢܥܐ ܪܫܝܐ:',
 'minoredit' => 'ܗܢܐ ܗܘ ܫܘܚܠܦܐ ܙܥܘܪܐ',
 'watchthis' => 'ܪܗܝ ܦܐܬܐ ܗܕܐ',
-'savearticle' => 'Ü Ü\92Ü\98Ü\9f Ü\95ܦܐ',
+'savearticle' => 'Ü Ü\92Ü\98Ü\9f Ü¦Ü\90ܬܐ',
 'preview' => 'ܚܝܪܐ ܩܕܡܝܐ',
 'showpreview' => 'ܚܘܝ ܚܝܪܐ ܩܕܡܝܐ',
 'showlivepreview' => 'ܚܝܪܐ ܩܕܡܝܐ ܚܝܐ',
@@ -469,8 +477,8 @@ $1',
 'loginreqlink' => 'ܥܘܠ',
 'accmailtitle' => 'ܡܠܬܐ ܕܥܠܠܐ ܫܕܪܬ',
 'newarticle' => '(ܚܕܬܐ)',
-'newarticletext' => "Ü\90ܬܬ Ü\92ܬܪ Ü\90ܣܪÜ\90 Ü\95Ü\95ܦÜ\90 Ü\95Ü Ü\90 Ü\90ܬܬܣÜ\9dÜ¡ ܥܕܡܫ.
-ܠܣÜ\98Ü\9dÜ¡Ü\90 Ü\95Ü\95ܦÜ\90 Ü\97Ü¢Ü\90, Ü«ÜªÜ\9d Ü Ü\9fܬÜ\92ܬÜ\90 Ü\92ܣܢÜ\95Ü\98Ü©Ü\90 Ü Ü¬Ü\9aܬ (Ü\9aÜ\99Ü\9d [[{{MediaWiki:Helppage}}|Ü\95ܦܐ ܕܥܘܕܪܢܐ]] ܠܐܚܪܢܐ ܝܕ̈ܥܬܐ).
+'newarticletext' => "Ü\90ܬܬ Ü\92ܬܪ Ü\90ܣܪÜ\90 Ü\95ܦÜ\90ܬÜ\90 Ü\95Ü Ü\90 Ü\90ܬܬܣÜ\9dܡܬ ܥܕܡܫ.
+ܠܣÜ\98Ü\9dÜ¡Ü\90 Ü\95ܦÜ\90ܬÜ\90 Ü\97Ü\95Ü\90, Ü«ÜªÜ\9d Ü Ü\9fܬÜ\92ܬÜ\90 Ü\92ܣܢÜ\95Ü\98Ü©Ü\90 Ü Ü¬Ü\9aܬ (Ü\9aÜ\99Ü\9d [[{{MediaWiki:Helppage}}|ܦÜ\90ܬܐ ܕܥܘܕܪܢܐ]] ܠܐܚܪܢܐ ܝܕ̈ܥܬܐ).
 ܐܢ ܐܬܬ ܠܗܪܟܐ ܦܘܕܐܝܬ, ܕܘܫ ܠܦܪܡܝܬܐ ܕ '''ܠܒܣܬܪ back''' ܒܡܦܐܬܢܐ ܕܝܠܟ.",
 'updated' => '(ܐܬܚܕܬ)',
 'note' => "'''ܡܥܝܪܢܘܬܐ:'''",
@@ -483,8 +491,8 @@ $1',
 'editingcomment' => 'ܫܚܠܦܬܐ ܕ $1 (ܡܢܬܐ ܚܕܬܐ)',
 'yourtext' => 'ܟܬܒܬܐ ܕܝܠܟ',
 'storedversion' => 'ܬܢܝܬ̈ܐ ܐܣܝܢ̈ܐ',
-'editingold' => "'''Ü\99Ü\98Ü\97ܪÜ\90: Ü«Ü\9aܠܦ Ü\90ܢܬ Ü¬Ü¢Ü\9dܬÜ\90 Ü¥Ü¬Ü\9dܩܬÜ\90 Ü\95Ü\95ܦÜ\90 Ü\97Ü¢ܐ.'''
\90Ü¢ Ü Ü\92Ü\9f Ü\90ܢܬ Ü\95ܦÜ\90 Ü\97Ü¢ܐ, ܟܠ ܫܘ̈ܚܠܦܐ ܕܐܬܥܒܕܘ ܒܬܪ ܗܕܐ ܬܢܝܬܐ ܢܬܛܠܩܘܢ.",
+'editingold' => "'''Ü\99Ü\98Ü\97ܪÜ\90: Ü«Ü\9aܠܦ Ü\90ܢܬ Ü¬Ü¢Ü\9dܬÜ\90 Ü¥Ü¬Ü\9dܩܬÜ\90 Ü\95ܦÜ\90ܬÜ\90 Ü\97Ü\95ܐ.'''
\90Ü¢ Ü Ü\92Ü\9f Ü\90ܢܬ Ü¦Ü\90ܬÜ\90 Ü\97Ü\95ܐ, ܟܠ ܫܘ̈ܚܠܦܐ ܕܐܬܥܒܕܘ ܒܬܪ ܗܕܐ ܬܢܝܬܐ ܢܬܛܠܩܘܢ.",
 'yourdiff' => 'ܦܪ̈ܝܫܘܝܬܐ',
 'templatesused' => '{{PLURAL:$1|ܩܠܒܐ|ܩܠܒ̈ܐ}} ܒܦܐܬܐ ܗܕܐ:',
 'template-protected' => '(ܢܛܝܪܐ)',
@@ -574,9 +582,9 @@ $1',
 'history-title' => '"$1": ܬܫܥܝܬܐ ܕܬܢܝܬܐ',
 'difference-title' => '«$1»: ܦܘܪܫܐ ܒܝܢܝ ܬܢܝܬ̈ܐ',
 'difference-title-multipage' => '«$1» ܘ«$2»: ܦܘܪܫܐ ܒܝܢܝ ܬܢܝܬ̈ܐ',
-'difference-multipage' => '(ܦÜ\98ܪܫÜ\90 Ü\92Ü\9dÜ¢Ü\9d Ü\95Ì\88ܦܐ)',
+'difference-multipage' => '(ܦÜ\98ܪܫÜ\90 Ü\92Ü\9dÜ¢Ü\9d Ü¦Ü\90ܬܬÌ\88ܐ)',
 'lineno' => 'ܣܪܛܐ $1:',
-'compareselectedversions' => 'ܦÜ\9aÜ\98Ü¡ Ü\92Ü\9dܬ ܬܪܝܢ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ',
+'compareselectedversions' => 'ܦÜ\9aÜ\98Ü¡ Ü\92Ü\9dÜ¢Ü\9d  ܬܪܝܢ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ',
 'showhideselectedversions' => 'ܚܘܝ/ܛܫܝ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ',
 'editundo' => 'ܠܐ ܬܥܒܕ',
 'diff-multi' => '({{PLURAL:$1|ܚܕܐ ܬܢܝܬܐ ܡܨܥܝܬܐ|$1 ܬܢܝܬ̈ܐ ܡܨܥܝܬ̈ܐ}} ܒܝܕ {{PLURAL:$2|ܚܕ ܡܦܠܚܢܐ ܠܐ ܓܠܝܚܬܐ|$2 ܡܦܠܚܢ̈ܐ ܠܐ ܓܠܝܚܬ̈ܐ}})',
@@ -624,7 +632,7 @@ $1',
 'searchall' => 'ܟܠ',
 'showingresults' => "ܚܘܘܝܐ ܠܬܚܬ {{PLURAL:$1|'''1''' ܦܠܛܐ|'''$1''' ܦܠܛ̈ܐ}} ܫܪܐ ܡܢ ܡܢܝܢܐ '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|ܦܠܛܐ '''$1''' ܡܢ '''$3'''|ܦܠܛ̈ܐ '''$1 - $2''' ܡܢ '''$3'''}} ܠ'''$4'''",
-'search-nonefound' => 'ܠܝܬ ܦܠܛ̈ܐ ܐܘܝ ܠܗܢܐ ܒܨܝܐ.',
+'search-nonefound' => 'ܠܝܬ ܦܠܛ̈ܐ ܐܘܝܢ̈ܐ ܠܗܢܐ ܒܨܝܐ.',
 'powersearch' => 'ܒܨܝܐ ܡܬܩܕܡܢܐ',
 'powersearch-legend' => 'ܒܨܝܐ ܡܬܩܕܡܢܐ',
 'powersearch-ns' => 'ܒܨܝ ܒܚܩܠܬ̈ܐ:',
@@ -752,7 +760,7 @@ $1',
 'right-createaccount' => 'ܒܪܝ ܚܘܫܒܢ̈ܐ ܕܡܦܠܚܢܐ ܚܕܬܐ',
 'right-minoredit' => 'ܫܘܕܥ ܥܠ ܫܘܚܠܦ̈ܐ ܐܝܟ ܙܥܘܪܐ',
 'right-move' => 'ܫܢܝ ܦܐܬܬ̈ܐ',
-'right-move-subpages' => 'Ü«Ü¢Ü\9d Ü\95Ì\88ܦÜ\90 Ü¥Ü¡ Ü\95Ì\88ܦܐ ܦܪ̈ܥܝܐ ܕܝܠܗܘܢ',
+'right-move-subpages' => 'Ü«Ü¢Ü\9d Ü¦Ü\90ܬܬÌ\88Ü\90 Ü¥Ü¡ Ü¦Ü\90ܬܬÌ\88ܐ ܦܪ̈ܥܝܐ ܕܝܠܗܘܢ',
 'right-movefile' => 'ܫܢܝ ܠܦܦ̈ܐ',
 'right-upload' => 'ܐܣܩ ܠܦܦ̈ܐ',
 'right-delete' => 'ܫܘܦ ܦܐܬܬ̈ܐ',
@@ -794,14 +802,17 @@ $1',
 'recentchanges' => 'ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
 'recentchanges-legend' => 'ܓܒܝܬ̈ܐ ܕܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
 'recentchanges-summary' => 'ܥܩܒ ܫܘܚܠܦ̈ܐ ܚܕܬ ܡܢ ܟܠ ܕܘܝܩܝ ܒܦܐܬܐ ܗܕܐ.',
-'recentchanges-label-newpage' => 'ܫܘܚܠܦܐ ܗܢܐ ܐܬܬܣܝܡ ܕܦܐ ܚܕܬܐ',
+'recentchanges-feed-description' => 'ܥܩܒ ܫܘܚܠܦ̈ܐ ܚܕܬ ܡܢ ܟܠ ܕܘܝܩܝ ܒܝܕ ܗܕܐ ܬܪܣܝܬܐ.',
+'recentchanges-label-newpage' => 'ܫܘܚܠܦܐ ܗܢܐ ܐܬܬܣܝܡ ܦܐܬܐ ܚܕܬܐ',
 'recentchanges-label-minor' => 'ܗܢܘ ܫܘܚܠܦܐ ܙܥܘܪܐ',
 'recentchanges-label-bot' => 'ܒܘܬ (bot) ܥܒܕ ܗܢܐ ܫܘܚܠܦܐ',
+'rcnotefrom' => "ܠܬܚܬ ܫܘܚܠܦ̈ܐ ܕܡܢ '''$2''' (ܥܕ '''$1''' ܡܬܚܙܝܢ̈ܐ).",
 'rclistfrom' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $1',
 'rcshowhideminor' => '$1 ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ',
 'rcshowhidebots' => '$1 ܒܘܬ̈ܐ (Bots)',
 'rcshowhideliu' => '$1 ܡܦܠܚܢ̈ܐ ܥܠܝܠ̈ܐ',
 'rcshowhideanons' => '$1 ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ',
+'rcshowhidepatr' => '$1 ܫܘܚܠܦ̈ܐ ܬܢܝ̈ܐ',
 'rcshowhidemine' => '$1 ܫܘܚܠܦ̈ܝ',
 'rclinks' => 'ܚܘܝ $1 ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ ܒ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ<br />$3',
 'diff' => 'ܦܘܪܫܐ',
@@ -886,6 +897,7 @@ $1',
 'filehist' => 'ܬܫܥܝܬܐ ܕܠܦܦܐ',
 'filehist-deleteall' => 'ܫܘܦ ܟܠ',
 'filehist-deleteone' => 'ܫܘܦ',
+'filehist-revert' => 'ܐܦܢܝ',
 'filehist-current' => 'ܗܫܝܐ',
 'filehist-datetime' => 'ܣܝܩܘܡܐ/ܙܒܢܐ',
 'filehist-thumb' => 'ܨܘܪܬܐ ܙܥܘܪܬܐ',
@@ -940,6 +952,8 @@ $1',
 # Statistics
 'statistics' => 'ܡܢܝܢܘܬ',
 'statistics-pages' => 'ܦܐܬܬ̈ܐ',
+'statistics-views-peredit' => 'ܚܘܘܝ̈ܐ ܠܟܠ ܫܘܚܠܦܐ',
+'statistics-users' => '[[Special:ListUsers|ܡܦܠܚܢ̈ܐ]] ܡܣܓܠ̈ܐ',
 'statistics-users-active' => 'ܡܦܠܚܢ̈ܐ ܙܪ̄ܝܙܐ',
 
 'disambiguations' => 'ܦܐܬܬ̈ܐ ܐܣܝܪ̈ܬܐ ܒܦܐܬܬ̈ܐ ܕܬܘܚܡܐ ܐܚܪܢܐ',
@@ -955,7 +969,7 @@ $1',
 'brokenredirects-delete' => 'ܫܘܦ',
 
 'withoutinterwiki' => 'ܦܐܬܬ̈ܐ ܕܠܐ ܐܣܘܪ̈ܐ ܕܠܫܢ̈ܐ ܐܚܪ̈ܢܐ',
-'withoutinterwiki-summary' => 'Ü\95Ì\88ܦܐ ܗܠܝܢ ܠܐ ܡܛܝܢ ܠܨ̈ܚܚܐ ܕܠܫܢ̈ܐ ܐܚܪ̈ܢܐ.',
+'withoutinterwiki-summary' => 'ܦÜ\90ܬܬÌ\88ܐ ܗܠܝܢ ܠܐ ܡܛܝܢ ܠܨ̈ܚܚܐ ܕܠܫܢ̈ܐ ܐܚܪ̈ܢܐ.',
 'withoutinterwiki-legend' => 'ܫܪܘܝܐ',
 'withoutinterwiki-submit' => 'ܚܘܝ',
 
@@ -978,16 +992,24 @@ $1',
 'unusedimages' => 'ܠܦܦ̈ܐ ܠܐ ܦܠܝܚ̈ܐ',
 'popularpages' => 'ܦܐܬܬ̈ܐ ܡܫܡܗܬ̈ܐ',
 'wantedcategories' => 'ܣܕܪ̈ܐ ܒܥܝ̈ܐ',
-'wantedpages' => 'ܦܐܬܬ̈ܐ ܒܥܝܬ̈ܐ',
-'wantedfiles' => 'ܠܦܦ̈ܐ ܒܥܝ̈ܐ',
-'wantedtemplates' => 'ܩܠܒ̈ܐ ܒܥܝ̈ܐ',
+'wantedpages' => 'ܦܐܬܬ̈ܐ ܣܢܝܩܬ̈ܐ',
+'wantedfiles' => 'ܠܦܦ̈ܐ ܣܢܝܩ̈ܐ',
+'wantedtemplates' => 'ܩܠܒ̈ܐ ܣܢܝܩ̈ܐ',
+'mostlinked' => 'ܦܐܬܬ̈ܐ ܐܣܝܪ̈ܬܐ ܝܬܝܪ ܡܢ ܟܠ',
+'mostlinkedcategories' => 'ܣܕܪ̈ܐ ܐܣܝܪ̈ܐ ܝܬܝܪ ܡܢ ܟܠ',
+'mostlinkedtemplates' => 'ܩܠܒ̈ܐ ܐܣܝܪ̈ܐ ܝܬܝܪ ܡܢ ܟܠ',
+'mostcategories' => 'ܦܐܬܬ̈ܐ ܣܕܝܪܐ ܝܬܝܪ ܡܢ ܟܠ',
+'mostimages' => 'ܠܦܦ̈ܐ ܐܣܝܪ̈ܐ ܝܬܝܪ ܡܢ ܟܠ',
+'mostrevisions' => 'ܦܐܬܬ̈ܐ ܥܡ ܫܘܚܠܦ̈ܐ ܝܬܝܪ ܡܢ ܟܠ',
 'prefixindex' => 'ܟܠ ܦܐܬܬ̈ܐ ܥܡ ܫܪܘܝܐ',
+'prefixindex-namespace' => 'ܟܠ ܦܐܬܬ̈ܐ ܥܡ ܫܪܘܝܐ ($1 ܚܩܠܐ)',
 'shortpages' => 'ܦܐܬܬ̈ܐ ܟܪ̈ܝܬܐ',
 'longpages' => 'ܦܐܬܬ̈ܐ ܐܪ̈ܝܟܬܐ',
 'deadendpages' => 'ܦܐܬܬ̈ܐ ܥܡ ܚܪܬܐ ܡܝܬܬܐ',
 'protectedpages' => 'ܦܐܬܬ̈ܐ ܢܛܝܪ̈ܬܐ',
 'protectedtitles' => 'ܟܘܢܝ̈ܐ ܢܛܝܪ̈ܐ',
 'protectedtitlestext' => 'ܟܘܢܝ̈ܐ ܗܠܝܢ ܢܛܝܪ̈ܐ ܐܢܘܢ ܠܘܩܒܠ ܒܪܝܐ',
+'protectedtitlesempty' => 'ܠܝܬ ܟܘܢܝ̈ܐ ܢܛܝܪ̈ܐ ܗܫܐܝܬ ܥܡ ܗܠܝܢ ܦܪ̈ܘܫܝܐ',
 'listusers' => 'ܡܟܬܒܘܬܐ ܕܗܕ̈ܡܐ',
 'listusers-editsonly' => 'ܚܘܝ ܡܦܠܚܢ̈ܐ ܥܡ ܫܘܚܠܦ̈ܐ ܒܠܚܘܕ',
 'listusers-creationsort' => 'ܛܟܣ ܐܝܟ ܣܝܩܘܡܐ ܕܒܪܝܐ',
@@ -1015,6 +1037,7 @@ $1',
 'log' => 'ܣܓܠ̈ܐ',
 'all-logs-page' => 'ܟܠ ܣܓܠ̈ܐ ܓܘܢܝ̈ܐ',
 'log-title-wildcard' => 'ܒܨܝ ܥܠ ܟܘܢܝ̈ܐ ܕܫܪܝܢ ܥܡ ܟܬܒܬܐ ܗܕܐ',
+'showhideselectedlogentries' => 'ܚܘܝ/ܛܫܝ ܣܓܠ̈ܐ ܕܥܠܠܐ ܓܒܝ̈ܐ',
 
 # Special:AllPages
 'allpages' => 'ܟܠ ܦܐܬܬ̈ܐ',
@@ -1031,6 +1054,10 @@ $1',
 'allpagessubmit' => 'ܙܠ',
 'allpagesprefix' => 'ܚܘܝ ܦܐܬܬ̈ܐ ܕܫܪܝܢ ܒ:',
 'allpages-bad-ns' => '{{SITENAME}} ܠܝܬ ܠܗ ܚܩܠܐ "$1".',
+'allpages-hide-redirects' => 'ܛܫܝ ܨܘܝܒ̈ܐ',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'ܚܙܝ ܐܚܪܝ ܟܠ',
 
 # Special:Categories
 'categories' => 'ܣܕܪ̈ܐ',
@@ -1045,8 +1072,10 @@ $1',
 
 # Special:LinkSearch
 'linksearch' => 'ܐܣܘܪ̈ܐ ܒܪ̈ܝܐ ܒܨܝܐ',
+'linksearch-pat' => 'ܙܢܐ ܕܒܨܝܐ:',
 'linksearch-ns' => 'ܚܩܠܐ:',
 'linksearch-ok' => 'ܒܨܝ',
+'linksearch-line' => '$1 ܝܨܝܪܐ ܡܢ $2',
 
 # Special:ListUsers
 'listusersfrom' => 'ܚܘܝ ܡܦܠܚܢ̈ܐ ܕܫܪܝܢ ܒ:',
@@ -1064,6 +1093,7 @@ $1',
 
 # Special:Log/newusers
 'newuserlogpage' => 'ܣܓܠܐ ܕܒܪܝܬܐ ܕܡܦܠܚܢܐ',
+'newuserlogpagetext' => 'ܗܢܘ ܣܓܠܐ ܕܒܪܝܐ ܕܡܦܠܚܢ̈ܐ',
 
 # Special:ListGroupRights
 'listgrouprights' => 'ܙܕ̈ܩܐ ܕܟܢܘܫܬܐ ܕܡܦܠܚܢ̈ܐ',
@@ -1084,6 +1114,8 @@ $1',
 'emailpage' => 'ܫܕܪ ܐܓܪܬܐ ܒܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܠܡܦܠܚܢܐ',
 'defemailsubject' => 'ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ  ܡܢ ܡܦܠܚܢܐ "$1"',
 'noemailtitle' => 'ܠܝܬ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
+'emailusername' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
+'emailusernamesubmit' => 'ܫܕܪ',
 'email-legend' => 'ܫܕܪ ܐܓܪܬܐ ܠܡܦܠܚܢܐ ܕ {{SITENAME}} ܐܚܪܢܐ',
 'emailfrom' => 'ܡܢ:',
 'emailto' => 'ܠ:',
@@ -1101,14 +1133,23 @@ $1',
 # Watchlist
 'watchlist' => 'ܪ̈ܗܝܬܝ',
 'mywatchlist' => 'ܪ̈ܗܝܬܝ',
-'watchlistfor2' => 'Ü  $1 $2',
+'watchlistfor2' => 'Ü\95 $1 $2',
 'nowatchlist' => 'ܠܝܬ ܠܟ ܡܕܡ ܒܪ̈ܗܝܬܐ ܕܝܠܟ',
 'watchnologin' => 'ܠܝܬܝܟ ܥܠܝܠܐ',
-'removedwatchtext' => 'ܦܐܬܐ "[[:$1]]" ܐܫܬܩܠܬ ܡܢ [[Special:Watchlist|ܪ̈ܗܝܬܟ]].',
+'watchnologintext' => 'ܐܠܨܐ ܕܬܗܘܐ [[Special:UserLogin|ܥܠܝܠܐ]] ܠܫܚܠܦܬܐ ܕܪ̈ܗܝܬܟ.',
+'addwatch' => 'ܐܘܣܦ ܥܠ ܪ̈ܗܝܬܝ',
+'addedwatchtext' => "ܦܐܬܐ ܕ\"[[:\$1]]\" ܐܬܬܘܣܦܬ ܒ[[Special:Watchlist|ܪ̈ܗܝܬܟ]].
+ܐܝܢܐ ܫܘܚܠܦܐ ܠܦܐܬܐ ܗܕܐ ܒܕܥܬܝܕ ܬܬܓܠܚ ܥܡ ܦܐܬܐ ܕܡܡܠܠܐ ܕܝܠܗ ܬܡܢ, ܘܦܐܬܐ ܬܗܘܐ ܒܣܪܛܐ '''ܚܠܝܡܐ''' ܒܦܐܬܐ ܕ[[Special:RecentChanges|ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ]] ܠܦܫܛܬܐ ܕܫܟܚܬܗ.",
+'removewatch' => 'ܫܩܘܠ ܡܢ ܪ̈ܗܝܬܝ',
+'removedwatchtext' => 'ܦܐܬܐ ܕ "[[:$1]]" ܐܫܬܩܠܬ ܡܢ [[Special:Watchlist|ܪ̈ܗܝܬܟ]].',
 'watch' => 'ܪܗܝ',
 'watchthispage' => 'ܪܗܝ ܗܕܐ ܦܐܬܐ',
 'unwatch' => 'ܠܐ ܪܗܝ',
 'unwatchthispage' => 'ܟܠܝ ܪܗܝܐ',
+'watchnochange' => 'ܐܦܠܐ ܚܕ ܡܢ ܦܐܬܬ̈ܐ ܒܪ̈ܗܝܬܟ ܐܫܬܚܠܦܬ ܒܡܬܚܐ ܕܙܒܢܐ ܓܠܝܚܐ.',
+'watchlist-details' => '{{PLURAL:$1|$1 ܦܐܬܐ|$1 ܦܐܬܬ̈ܐ}} ܒܪ̈ܗܝܬܟ, ܫܒܘܩ ܡܢ ܦܐܬܬ̈ܐ ܕܡܡܠܠܐ.',
+'wlheader-showupdated' => "* ܦܐܬܬ̈ܐ ܕܐܫܬܚܠܦܢ ܡܢ ܒܬܪ ܣܘܥܪܢܟ ܐܚܪܝܐ ܡܬܓܠܚܢ ܒܣܪܛܐ '''ܚܠܝܡܐ'''",
+'wlnote' => "ܠܬܚܬ {{PLURAL:$1|ܫܘܚܠܦܐ ܐܚܪܝܐ| '''$1''' ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ}} {{PLURAL:$2|ܒܫܥܬܐ ܐܚܪܝܬܐ|'''$2''' ܒܫܥܬ̈ܐ ܐܚܪ̈ܝܬܐ}}, ܠܦܘܬ $3, $4.",
 'wlshowlast' => 'ܚܘܝ $1 ܫܥܬ̈ܐ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ $3',
 'watchlist-options' => 'ܨܒܝܢܝܘܬ̈ܐ ܕܪ̈ܗܝܬܐ',
 
@@ -1116,6 +1157,7 @@ $1',
 'watching' => 'ܪܗܝܐ...',
 'unwatching' => 'ܠܐ ܪܗܝܐ...',
 
+'enotif_reset' => 'ܫܘܕܥ ܟܠ ܦܐܬܬ̈ܐ ܐܝܟ ܣܥܝܪ̈ܐ',
 'enotif_newpagetext' => 'ܗܕܐ ܗܝ ܦܐܬܐ ܚܕܬܐ',
 'enotif_impersonal_salutation' => 'ܡܦܠܚܢܐ {{SITENAME}}',
 'changed' => 'ܐܫܬܚܠܦܬ',
@@ -1170,6 +1212,7 @@ $1',
 'protect-edit-reasonlist' => 'ܫܚܠܦ ܥܠܬܐ ܕܢܛܪܐ',
 'protect-expiry-options' => '1 ܫܥܬܐ:1 hour,1 ܝܘܡܐ:1 day,1 ܫܒܘܥܐ:1 week,2 ܫܒܘܥ̈ܐ:2 weeks,1 ܝܪܚܐ:1 month,3 ܝܪ̈ܚܐ:3 months,6 ܝܪ̈ܚܐ:6 months,1 ܫܢܬܐ:1 year,ܠܥܠܡ:infinite',
 'restriction-type' => 'ܦܣܣܐ:',
+'restriction-level' => 'ܫܘܝܐ ܕܣܘܝܟܐ:',
 'minimum-size' => 'ܡܬܚܐ ܬܚܬܝܐ  ܕܥܓܪܐ',
 'maximum-size' => 'ܡܬܚܐ ܥܠܝܐ ܕܥܓܪܐ',
 'pagesize' => '(ܒܐܝܛ)',
@@ -1187,7 +1230,7 @@ $1',
 
 # Undelete
 'undelete' => 'ܚܙܝ ܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ',
-'undeletepage' => 'Ü\9aÜ\99Ü\9d Ü\98Ü\90ܦܢÜ\9d Ü\95Ì\88ܦÜ\90 Ü«Ü\9dܦ̈ܐ',
+'undeletepage' => 'Ü\9aÜ\99Ü\9d Ü\98Ü\90ܦܢÜ\9d Ü¦Ü\90ܬܬÌ\88Ü\90 Ü«Ü\9dܦܬ̈ܐ',
 'viewdeletedpage' => 'ܚܙܝ ܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ',
 'undelete-fieldset-title' => 'ܐܦܢܝ ܬܢܝܬ̈ܐ',
 'undelete-revision' => 'ܫܦ ܬܢܝܬܐ ܕ $1 (ܒܣܝܩܘܡ $4, ܒ $5) ܒܝܕ $3:',
@@ -1256,10 +1299,14 @@ $1',
 'whatlinkshere-filters' => 'ܡܨܦܝܢܝܬ̈ܐ',
 
 # Block/unblock
+'autoblockid' => 'ܚܪܡܐ ܝܬܢܝܐ #$1',
+'block' => 'ܚܪܘܡ ܡܦܠܚܢܐ',
+'unblock' => 'ܫܩܘܠ ܚܪܡܐ ܡܢ ܡܦܠܚܢܐ',
 'blockip' => 'ܚܪܘܡ ܡܦܠܚܢܐ',
 'blockip-title' => 'ܚܪܘܡ ܡܦܠܚܢܐ',
 'blockip-legend' => 'ܚܪܘܡ ܡܦܠܚܢܐ',
 'ipadressorusername' => 'ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ:',
+'ipbexpiry' => 'ܡܬܚܐ ܕܚܪܡܐ:',
 'ipbreason' => 'ܥܠܬܐ:',
 'ipbreasonotherlist' => 'ܥܠܬܐ ܐܚܪܬܐ',
 'ipbsubmit' => 'ܚܪܘܡ ܡܦܠܚܢܐ ܗܢܐ',
@@ -1277,6 +1324,7 @@ $1',
 'unblockip' => 'ܫܩܘܠ ܚܪܡܐ ܡܢ ܡܦܠܚܢܐ',
 'ipusubmit' => 'ܫܩܘܠ ܚܪܡܐ ܗܢܐ',
 'unblocked' => 'ܐܫܬܩܠ ܚܪܡܐ ܡܢ [[User:$1|$1]]',
+'blocklist' => 'ܡܦܠܚܢ̈ܐ ܡܚܪ̈ܡܐ',
 'ipblocklist' => 'ܡܦܠܚܢ̈ܐ ܡܚܪ̈ܡܐ',
 'ipblocklist-legend' => 'ܐܫܟܚ ܡܦܠܚܢܐ ܡܚܪܡܐ',
 'ipblocklist-submit' => 'ܒܨܝ',
@@ -1292,6 +1340,7 @@ $1',
 'blocklogentry' => 'ܚܪܡ [[$1]] ܠܡܬܚܐ ܕ $2 $3',
 'unblocklogentry' => 'ܫܩܠ ܚܪܡܐ ܡܢ $1',
 'block-log-flags-anononly' => 'ܡܦܠܚܢ̈ܐ ܠܐ ܝܕ̈ܝܥܐ ܒܠܚܘܕ',
+'block-log-flags-nocreate' => 'ܒܪܝܬܐ ܕܚܘܫܒ̈ܢܐ ܠܐ ܗܝ ܡܬܩܒܠܢܬܐ',
 'block-log-flags-hiddenname' => 'ܫܡܐ ܕܡܦܠܚܢܐ ܛܘܫܝܐ',
 'ipb_already_blocked' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ',
 'ipb-needreblock' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ
@@ -1311,8 +1360,8 @@ Do you want to change the settings?',
 'movepage-moved' => '\'\'\'"$1" ܐܫܬܢܝܬ ܠ "$2"\'\'\'',
 'movepage-moved-redirect' => 'ܨܘܝܒܐ ܐܬܒܪܝ',
 'movedto' => 'ܐܬܫܢܝ ܠ',
-'move-subpages' => 'Ü«Ü¢Ü\9d Ü\95Ì\88ܦÜ\90 Ü¦ÜªÌ\88Ü¥Ü\9dܐ (ܥܕܡܐ ܠ $1)',
-'move-talk-subpages' => 'Ü«Ü¢Ü\9d Ü\95Ì\88ܦÜ\90 Ü¦ÜªÌ\88Ü¥Ü\9dÜ\90 Ü\95Ü\95ܦܐ ܕܕܘܪܫܐ (ܥܕܡܐ ܠ $1)',
+'move-subpages' => 'Ü«Ü¢Ü\9d Ü¦Ü\90ܬܬÌ\88Ü\90 Ü¦ÜªÌ\88Ü¥Ü\9dܬÌ\88ܐ (ܥܕܡܐ ܠ $1)',
+'move-talk-subpages' => 'Ü«Ü¢Ü\9d Ü¦Ü\90ܬܬÌ\88Ü\90 Ü¦ÜªÌ\88Ü¥Ü\9dܬÌ\88Ü\90 Ü\95ܦÜ\90ܬܐ ܕܕܘܪܫܐ (ܥܕܡܐ ܠ $1)',
 'movelogpage' => 'ܣܓܠܐ ܕܫܘܢܝܐ',
 'movereason' => 'ܥܠܬܐ:',
 'revertmove' => 'ܐܦܢܝ',
@@ -1322,7 +1371,7 @@ Do you want to change the settings?',
 
 # Export
 'export' => 'ܐܦܩ ܦܐܬܬ̈ܐ',
-'exportall' => 'Ü\90ܦܩ Ü\9fÜ  Ü\95Ì\88ܦܐ',
+'exportall' => 'Ü\90ܦܩ Ü\9fÜ  Ü¦Ü\90ܬܬÌ\88ܐ',
 'export-submit' => 'ܐܦܩ',
 'export-addcattext' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܡܢ ܣܕܪܐ:',
 'export-addcat' => 'ܐܘܣܦ',
@@ -1363,7 +1412,8 @@ Do you want to change the settings?',
 'tooltip-pt-userpage' => 'ܦܐܬܐ ܕܡܦܠܚܢܐ ܕܝܠܟ',
 'tooltip-pt-mytalk' => 'ܦܐܬܐ ܕܡܡܠܘܟ',
 'tooltip-pt-preferences' => 'Your preferences',
-'tooltip-pt-login' => 'ܛܒ ܐܢܬ ܕܣܓܠ ܥܠܠܐ، ܐܠܐ ܗܢܐ ܠܘ ܐܠܨܝܐ',
+'tooltip-pt-watchlist' => 'ܡܟܬܒܢܘܬܐ ܕܦܐܬܬ̈ܐ ܕܒܪܗܝܬ ܐܢܬ ܫܘܚܠܦ̈ܐ ܕܬܗܘܐ ܒܗܘܢ',
+'tooltip-pt-login' => 'ܢܠܒܒ ܠܟ ܕܣܓܠ ܐܢܬ ܥܠܠܐ ܕܝܠܟ، ܐܠܐ ܗܢܐ ܠܐ ܐܝܬܝܗܝ ܐܠܨܝܐ',
 'tooltip-pt-logout' => 'ܦܠܛܐ',
 'tooltip-ca-talk' => 'ܡܡܠܠܐ ܥܠ ܚܒܝܫܬܐ ܕܦܐܬܐ',
 'tooltip-ca-addsection' => 'ܫܪܝ ܦܣܘܩܐ ܚܕܬܐ',
@@ -1372,15 +1422,21 @@ Do you want to change the settings?',
 'tooltip-ca-protect' => 'ܢܛܘܪ ܗܕܐ ܦܐܬܐ',
 'tooltip-ca-delete' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
 'tooltip-search' => 'ܒܨܝ ܒܓܘ {{SITENAME}}',
+'tooltip-search-fulltext' => 'ܒܨܝ ܒܓܘ ܦܐܬܬ̈ܐ ܥܠ ܗܢܐ ܟܬܝܒܬܐ',
 'tooltip-p-logo' => 'ܦܐܬܐ ܪܝܫܝܬܐ',
+'tooltip-n-mainpage-description' => 'ܬܪܘܩܬܐ ܕܦܐܬܐ ܪܝܫܝܬܐ',
 'tooltip-n-portal' => 'ܚܕܪ ܬܪܡܝܬܐ، ܡܢܐ ܡܫܟܚ ܐܢܬ ܠܥܒܕܐ، ܐܝܟܐ ܬܚܙܝ ܟܠ ܡܐ ܕܣܢܝܩ ܐܢܬ ܠܗ',
 'tooltip-n-recentchanges' => 'ܡܟܬܒܢܘܬܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܒܓܘ ܘܝܩܝ.',
 'tooltip-n-randompage' => 'ܦܬܘܟ ܡܓܠܬܐ ܚܘܝܚܬܐ',
 'tooltip-n-help' => 'ܕܘܟܐ ܠܥܘܕܪܢܐ',
+'tooltip-feed-atom' => 'ܬܪܣܝܬܐ ܕAtom ܠܗܢܐ ܦܐܬܬܐ',
 'tooltip-t-contributions' => 'ܡܟܬܒܢܘܬܐ ܒܫܘܬܦ̈ܐ ܕܗܢܐ ܡܦܠܚܢܐ',
 'tooltip-t-emailuser' => 'ܫܕܪ ܐܓܪܬܐ ܠܗܢܐ ܡܦܠܚܢܐ',
+'tooltip-t-upload' => 'ܐܣܩ ܠܦܦ̈ܐ',
 'tooltip-t-specialpages' => 'ܡܟܬܒܢܘܬܐ ܒܟܠ ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ',
+'tooltip-ca-nstab-main' => 'ܚܘܝ ܦܐܬܬܐ ܕܚܒ̈ܝܫܬܐ',
 'tooltip-ca-nstab-user' => 'ܚܘܝ ܦܐܬܐ ܕܡܦܠܚܢܐ',
+'tooltip-ca-nstab-image' => 'ܚܘܝ ܦܐܬܐ ܕܠܦܦܐ',
 'tooltip-save' => 'ܠܒܘܟ ܫܘܚܠܦܟ',
 
 # Attribution
@@ -1512,7 +1568,7 @@ $1',
 'table_pager_prev' => 'ܦܐܬܐ ܩܕܝܡܬܐ',
 'table_pager_first' => 'ܦܐܬܐ ܩܕܡܝܬܐ',
 'table_pager_last' => 'ܦܐܬܐ ܐܚܪܝܬܐ',
-'table_pager_limit_label' => 'ܡܕܡ ܠܟܠ ܕܦܐ:',
+'table_pager_limit_label' => 'ܡܕ̈ܡܐ ܠܟܠ ܦܐܬܐ:',
 'table_pager_limit_submit' => 'ܙܠ',
 'table_pager_empty' => 'ܠܝܬ ܦܠܛ̈ܐ',
 
@@ -1524,7 +1580,13 @@ $1',
 # Watchlist editor
 'watchlistedit-normal-title' => 'ܫܚܠܦ ܪ̈ܗܝܬܐ',
 'watchlistedit-normal-legend' => 'ܠܚܝ ܟܘܢܝ̈ܐ ܡܢ ܪ̈ܗܝܬܟ',
+'watchlistedit-normal-explain' => 'ܟܘܢܝ̈ܐ ܒܪ̈ܗܝܬܟ ܡܬܚܘܝܢ ܠܬܚܬ.
+ܠܠܚܝܐ ܕܟܘܢܝܐ, ܫܘܕܥ ܥܠ ܣܢܕܘܩܐ ܕܕܦܢܗ, ܘܕܘܫ "{{int:Watchlistedit-normal-submit}}".
+ܡܨܐ ܐܢܬ ܕ[[Special:EditWatchlist/raw|ܬܫܚܠܦ ܪ̈ܗܝܬܐ ܦܛܝܪ̈ܬܐ]].',
 'watchlistedit-normal-submit' => 'ܠܚܝ ܟܘܢܝܐ',
+'watchlistedit-normal-done' => '{{PLURAL:$1|ܚܕ ܟܘܢܝܐ ܐܬܠܚܝ|$1 ܟܘܢܝ̈ܐ ܐܬܠܚܘܢ}} ܡܢ ܪ̈ܗܝܬܟ:',
+'watchlistedit-raw-title' => 'ܫܚܠܦ ܪ̈ܗܝܬܐ ܦܛܝܪ̈ܬܐ',
+'watchlistedit-raw-legend' => 'ܫܚܠܦ ܪ̈ܗܝܬܐ ܦܛܝܪ̈ܬܐ',
 'watchlistedit-raw-titles' => 'ܟܘܢܝ̈ܐ:',
 'watchlistedit-raw-submit' => 'ܚܕܬ ܪ̈ܗܝܬܐ',
 
@@ -1554,10 +1616,15 @@ $1',
 
 # Special:SpecialPages
 'specialpages' => 'ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ',
+'specialpages-note' => '----
+* ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ ܥܝܕ̈ܝܬܐ.
+* <span class="mw-specialpagerestricted">ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ ܕܩܝܘܡ̈ܐ ܒܠܚܘܕ.</span>',
+'specialpages-group-maintenance' => 'ܬܫܪܪܐ ܕܚܕܬܘܬܐ',
 'specialpages-group-other' => 'ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ ܐܚܪ̈ܢܝܬܐ',
 'specialpages-group-login' => 'ܥܘܠ / ܒܪܝ',
 'specialpages-group-changes' => 'ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܘܣܓܠ̈ܐ',
 'specialpages-group-users' => 'ܡܦܠܚܢ̈ܐ ܘܙܕ̈ܩܐ',
+'specialpages-group-highuse' => 'ܦܐܬܬ̈ܐ ܕܡܬܚܫܚܢܘܬܐ ܥܠܝܬܐ',
 'specialpages-group-pages' => 'ܡܟܬܒܘܬ̈ܐ ܕܦܐܬܬ̈ܐ',
 'specialpages-group-pagetools' => 'ܡܐܢ̈ܐ ܕܦܐܬܐ',
 'specialpages-group-wiki' => 'ܓܠܝܬ̈ܐ ܘܡܐܢ̈ܐ ܕܘܝܩܝ',
@@ -1572,8 +1639,10 @@ $1',
 'tags-hitcount' => '$1 {{PLURAL:$1|ܫܘܚܠܦܐ|ܫܘܚܠܦ̈ܐ}}',
 
 # Special:ComparePages
-'compare-page1' => 'ܕܦܐ 1',
-'compare-page2' => 'ܕܦܐ 2',
+'comparepages' => 'ܦܚܘܡ ܒܝܢܝ ܦܐܬܬ̈ܐ',
+'compare-selector' => 'ܦܚܘܡ ܒܝܢܝ ܬܢܝܬ̈ܐ ܕܦܐܬܬ̈ܐ',
+'compare-page1' => 'ܦܐܬܐ 1',
+'compare-page2' => 'ܦܐܬܐ 2',
 'compare-rev1' => 'ܬܢܝܬܐ 1',
 'compare-rev2' => 'ܬܢܝܬܐ 2',
 'compare-submit' => 'ܦܚܘܡ',
@@ -1584,11 +1653,11 @@ $1',
 'htmlform-selectorother-other' => 'ܐܚܪܢܐ',
 
 # New logging system
-'logentry-delete-delete' => '$1 Ü«Ü¦ Ü\95ܦܐ ܕ $3',
-'logentry-move-move' => '$1 Ü«Ü¢Ü\90 Ü\95ܦܐ ܕ $3 ܠ $4',
-'logentry-move-move-noredirect' => '$1 Ü«Ü¢Ü\90 Ü\95ܦÜ\90 Ü\95 $3 Ü  $4 Ü\95Ü Ü\90 Ü«Ü\92Ü©Ü\90 Ü\95Ü\95ܦܐ ܕܨܘܝܒܐ',
-'logentry-move-move_redir' => '$1 Ü«Ü¢Ü\90 Ü\95ܦÜ\90 Ü\95 $3 Ü  $4 Ü\95Ü\90Ü\9dܬÜ\98Ü\97Ü\9d Ü\97Ü\98Ü\90 Ü\95ܦܐ ܕܨܘܝܒܐ',
-'logentry-move-move_redir-noredirect' => '$1 Ü«Ü¢Ü\90 Ü\95ܦÜ\90 Ü\95 $3 Ü  $4 Ü\95Ü\90Ü\9dܬÜ\98Ü\97Ü\9d Ü\97Ü\98Ü\90 Ü\95ܦÜ\90 Ü\95ܨÜ\98Ü\9dÜ\92Ü\90 Ü\98Ü\95Ü Ü\90 Ü«Ü\92Ü©Ü\90 Ü\95Ü\95ܦܐ ܕܨܘܝܒܐ',
+'logentry-delete-delete' => '$1 Ü«Ü¦ Ü¦Ü\90ܬܐ ܕ $3',
+'logentry-move-move' => '$1 Ü«Ü¢Ü\90 Ü¦Ü\90ܬܐ ܕ $3 ܠ $4',
+'logentry-move-move-noredirect' => '$1 Ü«Ü¢Ü\90 Ü¦Ü\90ܬÜ\90 Ü\95 $3 Ü  $4 Ü\95Ü Ü\90 Ü«Ü\92Ü©Ü\90 Ü¦Ü\90ܬܐ ܕܨܘܝܒܐ',
+'logentry-move-move_redir' => '$1 Ü«Ü¢Ü\90 Ü¦Ü\90ܬÜ\90 Ü\95 $3 Ü  $4 Ü\95Ü\90Ü\9dܬÜ\98Ü\97Ü\9d Ü¦Ü\90ܬܐ ܕܨܘܝܒܐ',
+'logentry-move-move_redir-noredirect' => '$1 Ü«Ü¢Ü\90 Ü¦Ü\90ܬÜ\90 Ü\95 $3 Ü  $4 Ü\95Ü\90Ü\9dܬÜ\98Ü\97Ü\9d Ü¦Ü\90ܬÜ\90 Ü\95ܨÜ\98Ü\9dÜ\92Ü\90 Ü\98Ü\95Ü Ü\90 Ü«Ü\92Ü©Ü\90 Ü¦Ü\90ܬܐ ܕܨܘܝܒܐ',
 'logentry-newusers-newusers' => '$1 ܒܪܐ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ',
 'logentry-newusers-create' => '$1 ܒܪܐ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ',
 'logentry-newusers-create2' => '$1 ܒܪܐ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3',
index 730ae0d..e5397fa 100644 (file)
@@ -57,7 +57,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'khbi tadilat lmostkhdimin lmsjlin mn qaaimat lmoraqaba',
 'tog-watchlisthideanons' => 'khbi taadilat lmostkhdimin lmjholin mn qaaimat lmoraqaba',
 'tog-watchlisthidepatrolled' => 'khbi tadilat lmorajaaa  mn qaaimat lmoraqaba',
-'tog-nolangconversion' => 'attl thwil lahajat',
 'tog-ccmeonemails' => 'sift liya noskha mn rasaail lbarid lelectroni likansiftha lmostkhdimin lkhrin',
 'tog-diffonly' => 'matbiynch mohtawa sfha tht lforoqat',
 'tog-showhiddencats' => 'biyn tsnifat lmkhfiya',
@@ -2129,15 +2128,10 @@ Imken lek ṫċof l-ĝin dyalha.',
 # Info page
 'pageinfo-title' => 'mĝlomaṫ l-"$1"',
 'pageinfo-header-edits' => 'ṫĝdilaṫ',
-'pageinfo-header-watchlist' => "qa'imaṫ l-ṃoṛaqaba",
-'pageinfo-header-views' => 'moċahadaṫ',
-'pageinfo-subjectpage' => 'ṣfḫa',
-'pageinfo-talkpage' => 'ṣfḫṫ n-niqaċ',
+'pageinfo-views' => 'ĝadad l-moċahadaṫ',
 'pageinfo-watchers' => 'ĝadad l-moraqibin',
 'pageinfo-edits' => 'ĝadad ṫ-ṫĝdilaṫ',
 'pageinfo-authors' => "ĝadad l-mo'llifin l-mĥṫalfin",
-'pageinfo-views' => 'ĝadad l-moċahadaṫ',
-'pageinfo-viewsperedit' => 'l-moċahadaĝ l-koll ṫĝdil',
 
 # Patrolling
 'markaspatrolleddiff' => 'marki kamorajaaa',
index 5c322b5..ec11637 100644 (file)
@@ -59,153 +59,153 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#تحويل', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__لافهرس__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__لامعرض__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__لصق_فهرس__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__فهرس__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__لاعنوان__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'شهر_حالى', 'شهر_حالي2', 'شهر_حالي', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'اسم_الشهر_الحالى', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'اسم_الشهر_الحالى_المولد', 'اسم_الشهر_الحالي_المولد', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'اختصار_الشهر_الحالى', 'اختصار_الشهر_الحالي', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'يوم_حالى', 'يوم_حالي', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'يوم_حالى2', 'يوم_حالي2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'اسم_اليوم_الحالى', 'اسم_اليوم_الحالي', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'عام_حالى', 'عام_حالي', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'وقت_حالى', 'وقت_حالي', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ساعة_حالية', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'شهر_محلى', 'شهر_محلي2', 'شهر_محلي', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'شهر_محلى1', 'شهر_محلي1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'اسم_الشهر_المحلى', 'اسم_شهر_محلى', 'اسم_الشهر_المحلي', 'اسم_شهر_محلي', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'اسم_الشهر_المحلى_المولد', 'اسم_شهر_محلى_مولد', 'اسم_الشهر_المحلي_المولد', 'اسم_شهر_محلي_مولد', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'اختصار_الشهر_المحلى', 'اختصار_شهر_محلى', 'اختصار_الشهر_المحلي', 'اختصار_شهر_محلي', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'يوم_محلى', 'يوم_محلي', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'يوم_محلى2', 'يوم_محلي2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'اسم_اليوم_المحلى', 'اسم_يوم_محلى', 'اسم_اليوم_المحلي', 'اسم_يوم_محلي', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'عام_محلى', 'عام_محلي', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'وقت_محلى', 'وقت_محلي', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ساعة_محلية', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'عدد_الصفحات', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'عدد_المقالات', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'عدد_الملفات', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'اسم_الصفحة', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'عنوان_الصفحة', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'نطاق', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'عنوان_نطاق', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'نطاق_النقاش', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'عنوان_النقاش', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'نطاق_الموضوع', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'اسم_الصفحة_الكامل', 'اسم_صفحة_كامل', 'اسم_كامل', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'عنوان_الصفحة_الكامل', 'عنوان_صفحة_كامل', 'عنوان_كامل', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'اسم_الصفحة_الفرعي', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'عنوان_الصفحة_الفرعى', 'عنوان_الصفحة_الفرعي', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'اسم_الصفحة_الأساسى', 'اسم_الصفحة_الأساسي', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'عنوان_الصفحة_الأساسى', 'عنوان_الصفحة_الأساسي', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'اسم_صفحة_النقاش', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'عنوان_صفحة_النقاش', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'اسم_صفحة_الموضوع', 'اسم_صفحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'عنوان_صفحة_الموضوع', 'عنوان_صفحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'رسالة:', 'MSG:' ),
-       'subst'                   => array( '0', 'نسخ:', 'إحلال:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'مصدر:', 'مصدر_قالب:', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'تصغير', 'مصغر', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'يمين', 'right' ),
-       'img_left'                => array( '1', 'يسار', 'left' ),
-       'img_none'                => array( '1', 'بدون', 'بلا', 'none' ),
-       'img_width'               => array( '1', '$1بك', '$1عن', '$1px' ),
-       'img_center'              => array( '1', 'مركز', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'لاإطار', 'frameless' ),
-       'img_page'                => array( '1', 'صفحة=$1', 'صفحة $1', 'صفحة_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'معدول', 'معدول=$1', 'معدول $1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'حد', 'حدود', 'border' ),
-       'img_baseline'            => array( '1', 'خط_أساسى', 'خط_أساسي', 'baseline' ),
-       'img_sub'                 => array( '1', 'فرعى', 'فرعي', 'sub' ),
-       'img_super'               => array( '1', 'سوبر', 'سب', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'أعلى', 'top' ),
-       'img_text_top'            => array( '1', 'نص_أعلى', 'text-top' ),
-       'img_middle'              => array( '1', 'وسط', 'middle' ),
-       'img_bottom'              => array( '1', 'أسفل', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'نص_أسفل', 'text-bottom' ),
-       'img_link'                => array( '1', 'وصلة=$1', 'رابط=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'بديل=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'محتوى:', 'INT:' ),
-       'sitename'                => array( '1', 'اسم_الموقع', 'اسم_موقع', 'SITENAME' ),
-       'ns'                      => array( '0', 'نط:', 'NS:' ),
-       'nse'                     => array( '0', 'نطم:', 'NSE:' ),
-       'localurl'                => array( '0', 'مسار_محلى:', 'مسار_محلي:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'عنوان_المسار_المحلى:', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'خادم', 'SERVER' ),
-       'servername'              => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'مسار_الهيئة', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'قواعد_اللغة:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'نوع:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__لاتحويل_عنوان__', '__لاتع__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__لاتحويل_محتوى__', '__لاتم__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'أسبوع_حالى', 'أسبوع_حالي', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'يوم_حالى_مأ', 'يوم_حالي_مأ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'أسبوع_محلى', 'أسبوع_محلي', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'يوم_محلى_مأ', 'يوم_محلي_مأ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'رقم_المراجعة', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'جمع:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'مسار_كامل:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'عنوان_كامل:', 'مسار_كامل:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'صغير:', 'LC:' ),
-       'uc'                      => array( '0', 'كبير:', 'UC:' ),
-       'raw'                     => array( '0', 'خام:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'أر', 'آر', 'R' ),
-       'newsectionlink'          => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__لا_وصلة_قسم_جديد__', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'كود_المسار:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'كود_الأنكور', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'طابع_الوقت_الحالي', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'طابع_الوقت_المحلى', 'طابع_الوقت_المحلي', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'علامة_الاتجاه', 'علامة_اتجاه', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#لغة:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'لغة_المحتوى', 'لغة_محتوى', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'صفحات_فى_نطاق:', 'صفحات_فى_نط:', 'صفحات_في_نطاق:', 'صفحات_في_نط:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'عدد_الإداريين', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'صيغة_رقم', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'باد_يسار', 'PADLEFT' ),
-       'padright'                => array( '0', 'باد_يمين', 'PADRIGHT' ),
-       'special'                 => array( '0', 'خاص', 'special' ),
-       'defaultsort'             => array( '1', 'ترتيب_قياسى:', 'ترتيب_افتراضى:', 'مفتاح_ترتيب_قياسى:', 'مفتاح_ترتيب_افتراضى:', 'ترتيب_تصنيف_قياسى:', 'ترتيب_تصنيف_افتراضى:', 'ترتيب_قياسي:', 'ترتيب_افتراضي:', 'مفتاح_ترتيب_قياسي:', 'مفتاح_ترتيب_افتراضي:', 'ترتيب_تصنيف_قياسي:', 'ترتيب_تصنيف_افتراضي:', 'ترتيب_غيابي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'مسار_الملف:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'وسم', 'tag' ),
-       'hiddencat'               => array( '1', '__تصنيف_مخفي__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'صفحات_في_التصنيف', 'صفحات_في_تصنيف', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'حجم_الصفحة', 'PAGESIZE' ),
-       'index'                   => array( '1', '__فهرسة__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__لافهرسة__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'عدد_فى_المجموعة', 'عدد_فى_مجموعة', 'عدد_في_المجموعة', 'عدد_في_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'مسار', 'PATH' ),
-       'url_wiki'                => array( '0', 'ويكى', 'ويكي', 'WIKI' ),
-       'url_query'               => array( '0', 'استعلام', 'QUERY' ),
+       'redirect'                  => array( '0', '#تحويل', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__لافهرس__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__لامعرض__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__لصق_فهرس__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__فهرس__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__لاعنوان__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'شهر_حالى', 'شهر_حالي2', 'شهر_حالي', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'اسم_الشهر_الحالى', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'اسم_الشهر_الحالى_المولد', 'اسم_الشهر_الحالي_المولد', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'اختصار_الشهر_الحالى', 'اختصار_الشهر_الحالي', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'يوم_حالى', 'يوم_حالي', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'يوم_حالى2', 'يوم_حالي2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'اسم_اليوم_الحالى', 'اسم_اليوم_الحالي', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'عام_حالى', 'عام_حالي', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'وقت_حالى', 'وقت_حالي', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ساعة_حالية', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'شهر_محلى', 'شهر_محلي2', 'شهر_محلي', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'شهر_محلى1', 'شهر_محلي1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'اسم_الشهر_المحلى', 'اسم_شهر_محلى', 'اسم_الشهر_المحلي', 'اسم_شهر_محلي', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'اسم_الشهر_المحلى_المولد', 'اسم_شهر_محلى_مولد', 'اسم_الشهر_المحلي_المولد', 'اسم_شهر_محلي_مولد', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'اختصار_الشهر_المحلى', 'اختصار_شهر_محلى', 'اختصار_الشهر_المحلي', 'اختصار_شهر_محلي', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'يوم_محلى', 'يوم_محلي', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'يوم_محلى2', 'يوم_محلي2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'اسم_اليوم_المحلى', 'اسم_يوم_محلى', 'اسم_اليوم_المحلي', 'اسم_يوم_محلي', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'عام_محلى', 'عام_محلي', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'وقت_محلى', 'وقت_محلي', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ساعة_محلية', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'عدد_الصفحات', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'عدد_المقالات', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'عدد_الملفات', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'اسم_الصفحة', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'عنوان_الصفحة', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'نطاق', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'عنوان_نطاق', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'نطاق_النقاش', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'عنوان_النقاش', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'نطاق_الموضوع', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'اسم_الصفحة_الكامل', 'اسم_صفحة_كامل', 'اسم_كامل', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'عنوان_الصفحة_الكامل', 'عنوان_صفحة_كامل', 'عنوان_كامل', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'اسم_الصفحة_الفرعي', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'عنوان_الصفحة_الفرعى', 'عنوان_الصفحة_الفرعي', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'اسم_الصفحة_الأساسى', 'اسم_الصفحة_الأساسي', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'عنوان_الصفحة_الأساسى', 'عنوان_الصفحة_الأساسي', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'اسم_صفحة_النقاش', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'عنوان_صفحة_النقاش', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'اسم_صفحة_الموضوع', 'اسم_صفحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'عنوان_صفحة_الموضوع', 'عنوان_صفحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'رسالة:', 'MSG:' ),
+       'subst'                     => array( '0', 'نسخ:', 'إحلال:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'مصدر:', 'مصدر_قالب:', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'تصغير', 'مصغر', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'يمين', 'right' ),
+       'img_left'                  => array( '1', 'يسار', 'left' ),
+       'img_none'                  => array( '1', 'بدون', 'بلا', 'none' ),
+       'img_width'                 => array( '1', '$1بك', '$1عن', '$1px' ),
+       'img_center'                => array( '1', 'مركز', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'لاإطار', 'frameless' ),
+       'img_page'                  => array( '1', 'صفحة=$1', 'صفحة $1', 'صفحة_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'معدول', 'معدول=$1', 'معدول $1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'حد', 'حدود', 'border' ),
+       'img_baseline'              => array( '1', 'خط_أساسى', 'خط_أساسي', 'baseline' ),
+       'img_sub'                   => array( '1', 'فرعى', 'فرعي', 'sub' ),
+       'img_super'                 => array( '1', 'سوبر', 'سب', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'أعلى', 'top' ),
+       'img_text_top'              => array( '1', 'نص_أعلى', 'text-top' ),
+       'img_middle'                => array( '1', 'وسط', 'middle' ),
+       'img_bottom'                => array( '1', 'أسفل', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'نص_أسفل', 'text-bottom' ),
+       'img_link'                  => array( '1', 'وصلة=$1', 'رابط=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'بديل=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'محتوى:', 'INT:' ),
+       'sitename'                  => array( '1', 'اسم_الموقع', 'اسم_موقع', 'SITENAME' ),
+       'ns'                        => array( '0', 'نط:', 'NS:' ),
+       'nse'                       => array( '0', 'نطم:', 'NSE:' ),
+       'localurl'                  => array( '0', 'مسار_محلى:', 'مسار_محلي:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'عنوان_المسار_المحلى:', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'خادم', 'SERVER' ),
+       'servername'                => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'مسار_الهيئة', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'قواعد_اللغة:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'نوع:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__لاتحويل_عنوان__', '__لاتع__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__لاتحويل_محتوى__', '__لاتم__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'أسبوع_حالى', 'أسبوع_حالي', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'يوم_حالى_مأ', 'يوم_حالي_مأ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'أسبوع_محلى', 'أسبوع_محلي', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'يوم_محلى_مأ', 'يوم_محلي_مأ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'رقم_المراجعة', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'جمع:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'مسار_كامل:', 'عنوان_كامل:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'عنوان_كامل:', 'مسار_كامل:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'صغير:', 'LC:' ),
+       'uc'                        => array( '0', 'كبير:', 'UC:' ),
+       'raw'                       => array( '0', 'خام:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'أر', 'آر', 'R' ),
+       'newsectionlink'            => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__لا_وصلة_قسم_جديد__', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'كود_المسار:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'كود_الأنكور', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'طابع_الوقت_الحالي', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'طابع_الوقت_المحلى', 'طابع_الوقت_المحلي', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'علامة_الاتجاه', 'علامة_اتجاه', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#لغة:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'لغة_المحتوى', 'لغة_محتوى', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'صفحات_فى_نطاق:', 'صفحات_فى_نط:', 'صفحات_في_نطاق:', 'صفحات_في_نط:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'عدد_الإداريين', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'صيغة_رقم', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'باد_يسار', 'PADLEFT' ),
+       'padright'                  => array( '0', 'باد_يمين', 'PADRIGHT' ),
+       'special'                   => array( '0', 'خاص', 'special' ),
+       'defaultsort'               => array( '1', 'ترتيب_قياسى:', 'ترتيب_افتراضى:', 'مفتاح_ترتيب_قياسى:', 'مفتاح_ترتيب_افتراضى:', 'ترتيب_تصنيف_قياسى:', 'ترتيب_تصنيف_افتراضى:', 'ترتيب_قياسي:', 'ترتيب_افتراضي:', 'مفتاح_ترتيب_قياسي:', 'مفتاح_ترتيب_افتراضي:', 'ترتيب_تصنيف_قياسي:', 'ترتيب_تصنيف_افتراضي:', 'ترتيب_غيابي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'مسار_الملف:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'وسم', 'tag' ),
+       'hiddencat'                 => array( '1', '__تصنيف_مخفي__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'صفحات_في_التصنيف', 'صفحات_في_تصنيف', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'حجم_الصفحة', 'PAGESIZE' ),
+       'index'                     => array( '1', '__فهرسة__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__لافهرسة__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'عدد_فى_المجموعة', 'عدد_فى_مجموعة', 'عدد_في_المجموعة', 'عدد_في_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'مسار', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ويكى', 'ويكي', 'WIKI' ),
+       'url_query'                 => array( '0', 'استعلام', 'QUERY' ),
 );
 
 $specialPageAliases = array(
@@ -329,7 +329,7 @@ $messages = array(
 'tog-enotifminoredits' => 'ابعتلى ايميل للتعديلات الصغيره للصفحات',
 'tog-enotifrevealaddr' => 'بين الايميل بتاعى فى ايميلات الاعلام',
 'tog-shownumberswatching' => 'بين عدد اليوزرز المراقبين',
-'tog-oldsig' => 'برÙ\88Ù\81Ù\87 Ù\84Ù\84اÙ\85ضا Ø§Ù\84حاÙ\84Ù\8aÙ\87',
+'tog-oldsig' => 'اÙ\84اÙ\85ضا Ø¯Ù\84Ù\88Ù\82تÙ\89:',
 'tog-fancysig' => 'امضا خام (من غير لينك أوتوماتيك)',
 'tog-externaleditor' => 'استعمل محرر خارجى افتراضيا',
 'tog-externaldiff' => 'استعمل فرق خارجى افتراضيا',
@@ -342,7 +342,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'خبى التعديلات بتاعة اليوزرز المتسجل دخولهم دلوقتى من لستة المراقبة',
 'tog-watchlisthideanons' => 'خبى التعديلات بتاعة اليوزرز المجهولين من لستة المراقبة',
 'tog-watchlisthidepatrolled' => 'خبى التعديلات المتراجعه من ليستة المراقبه',
-'tog-nolangconversion' => 'عطل تحويل اللهجات',
 'tog-ccmeonemails' => 'ابعتلى  نسخ من رسايل الايميل اللى بابعتها لليوزرز التانيين',
 'tog-diffonly' => 'ما تبين ش محتوى الصفحة تحت الفروقات',
 'tog-showhiddencats' => 'بين التّصنيفات المستخبية',
@@ -458,7 +457,7 @@ $messages = array(
 'vector-action-move' => 'نقل',
 'vector-action-protect' => 'حمايه',
 'vector-action-undelete' => 'الغى المسح',
-'vector-action-unprotect' => 'اÙ\84غÙ\89 الحمايه',
+'vector-action-unprotect' => 'غÙ\8aر الحمايه',
 'vector-view-create' => 'اعمل',
 'vector-view-edit' => 'تعديل',
 'vector-view-history' => 'استعراض التاريخ',
@@ -492,8 +491,8 @@ $messages = array(
 'protect' => 'حمايه',
 'protect_change' => 'غيّر',
 'protectthispage' => 'احمى الصفحه دى',
-'unprotect' => 'اÙ\84غÙ\89 Ø§Ù\84Ø­Ù\85اÙ\8aØ©',
-'unprotectthispage' => 'Ø´Ù\8aÙ\84 حماية الصفحه دى',
+'unprotect' => 'غÙ\8aر Ø§Ù\84Ø­Ù\85اÙ\8aÙ\87',
+'unprotectthispage' => 'غÙ\8aر حماية الصفحه دى',
 'newpage' => 'صفحه جديده',
 'talkpage' => 'ناقش الصفحه دى',
 'talkpagelinktext' => 'مناقشه',
@@ -526,6 +525,9 @@ $messages = array(
 لو سمحت تستنا شويه قبل ما تحاول تستعرض الصفحه دى من تانى.
 
 $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' => 'عن {{SITENAME}}',
@@ -707,8 +709,8 @@ $2',
 'createaccountmail' => 'بـ الايميل',
 'createaccountreason' => 'السبب:',
 'badretype' => 'كلمتين السر اللى  كتبتهم مش  زى بعضهم',
-'userexists' => 'اسم اليوزر اللى دخلته بيستعمله يوزر غيرك.
¯Ø®Ù\84 Ø§Ø³Ù\85 تانى.',
+'userexists' => 'اسم اليوزر اللى كتبته بيستعمله يوزر غيرك.
§Ù\83تت Ø§Ø³Ù\85 Ù\8aÙ\88زر تانى.',
 'loginerror' => 'غلط فى الدخول',
 'createaccounterror' => 'مش قادر يعمل الحساب: $1',
 'nocookiesnew' => 'اليوزر خلاص اتفتح له حساب، بس انت لسة ما سجلتش دخولك.
@@ -969,12 +971,12 @@ $2',
 'permissionserrorstext-withaction' => 'أنت ما عندكش الصلاحيات علشان $2، لل{{PLURAL:$1|سبب|أسباب}} ده:',
 'recreate-moveddeleted-warn' => "'''تحذير: انت بتعيد انشاء صفحه اتمسحت قبل كده.'''
 لازم تتأكد من ان الاستمرار فى تحرير الصفحه دى ملائم.
-سجلات الحذف و النقل بتوع الصفحه دى معروضه هنا:",
+سجلات المسح  و النقل بتوع الصفحه دى معروضه هنا:",
 'moveddeleted-notice' => 'الصفحة دى اتمسحت. سجل المسح و سجل النقل بتوع الصفحة معروضين تحت علشان ترجعلهم.',
 'log-fulllog' => 'استعراض السجل بالكامل',
 'edit-hook-aborted' => 'الخطاف ساب التعديل من غير مايدى تفسير.',
-'edit-gone-missing' => 'Ù\84Ù\85 Ù\8aÙ\85Ù\83Ù\86 ØªØ­Ø¯Ù\8aØ« Ø§Ù\84صÙ\81حة.
\8aبدÙ\88 Ø£Ù\86Ù\87 ØªÙ\85 Ø­Ø°Ù\81Ù\87ا.',
+'edit-gone-missing' => 'Ù\85Ø´ Ù\85Ù\85Ù\83Ù\86 ØªØ¹Ø¯Ù\8aÙ\84 Ø§Ù\84صÙ\81Ø­Ù\87.
\8aظÙ\87ر Ø§Ù\86Ù\87ا Ø¥ØªÙ\85سحت.',
 'edit-conflict' => 'تضارب تحريرى.',
 'edit-no-change' => 'تعديلك تم تجاهله، لأن ما حصلش أى تعديل للنص.',
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
@@ -1065,7 +1067,7 @@ $2',
 ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].
 كسيسوب ممكن [$1 تشوف الفرق ده] لو إنت عايز تكمل.",
 'rev-deleted-diff-view' => "واحده من نسخ الفرق ده '''اتمسحت'''.
-كسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+كسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
 'rev-suppressed-diff-view' => "واحده من نسخ الفرق ده '''اتخبت'''.
 كسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].",
 'rev-delundel' => 'عرض/تخبيه',
@@ -1171,11 +1173,13 @@ $1",
 
 # Diffs
 'history-title' => 'تاريخ تعديل "$1"',
+'difference-multipage' => '(الفرق بين الصفحتين)',
 'lineno' => 'سطر $1:',
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
 'showhideselectedversions' => 'عرض/تخبية المراجعات المختاره.',
 'editundo' => 'استرجاع',
 'diff-multi' => '({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}}  مش معروضه)',
+'diff-multi-manyusers' => '({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}}  مش معروضه)',
 
 # Search results
 'searchresults' => 'نتايج التدوير',
@@ -1210,6 +1214,7 @@ $1",
 'searchprofile-everything-tooltip' => 'دور فى  كل المحتوى (شامل صفحات النقاش)',
 'searchprofile-advanced-tooltip' => 'دور فى النطاقات المخصصة',
 'search-result-size' => '$1 ({{PLURAL:$2|1 كلمه|$2 كلام}})',
+'search-result-category-size' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوين|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعى واحد|تصنيفين فرعيين|$2 تصنيفات فرعية|$2 تصنيف فرعى|$2 تصنيف فرعى}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفين|$3 ملفات|$3 ملف|$3 ملف}})',
 'search-result-score' => 'الارتباط: $1%',
 'search-redirect' => '(تحويله $1)',
 'search-section' => '(جزء $1)',
@@ -1364,6 +1369,10 @@ $1",
 'prefs-displaywatchlist' => 'اختيارات العرض',
 'prefs-diffs' => 'التغيير',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'عنوان الإيميل صح',
+'email-address-validity-invalid' => 'عنوان الإيميل غلط',
+
 # User rights
 'userrights' => 'إدارة الحقوق بتاعة اليوزر',
 'userrights-lookup-user' => 'إدارة مجموعات اليوزر',
@@ -1447,6 +1456,7 @@ $1",
 'right-hideuser' => 'منع اسم يوزر، و خبيه عن الناس',
 'right-ipblock-exempt' => 'إتفادى عمليات منع الأيبي، المنع الأوتوماتيكى ومنع النطاق.',
 'right-proxyunbannable' => 'إتفادى عمليات المنع الأوتوماتيكية للبروكسيهات',
+'right-unblockself' => 'رفع المنع عن نفسهم',
 'right-protect' => 'تغيير مستويات الحماية وتعديل الصفحات المحمية',
 'right-editprotected' => 'تعديل الصفحات المحمية (من غير الحماية المتضمنة)',
 'right-editinterface' => 'تعديل الواجهة بتاعة اليوزر',
@@ -1570,9 +1580,9 @@ $1",
 لعرض أو البحث ف الملفات المتحملة سابقا، راجع عمليات المسح [[Special:Log/delete|deletion log]] [[Special:FileList|لستة الملفات المتحملة]]، عمليات التحميل  موجودة فى [[Special:Log/upload|سجل التحميل]].
 
 علشان تحط صورة فى صفحة، استخدم الوصلات فى الصيغ التالية:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' علشان استخدام النسخة الكاملة لملف
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|نص بديل]]</nowiki></tt>''' لاستخدام صورة عرضها 200 بكسل فى صندوق فى الجانب الأيسر مع 'نص بديل' كوصف
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' للوصل للملف مباشرة بدون عرض الملف.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' علشان استخدام النسخة الكاملة لملف
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|نص بديل]]</nowiki></code>''' لاستخدام صورة عرضها 200 بكسل فى صندوق فى الجانب الأيسر مع 'نص بديل' كوصف
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' للوصل للملف مباشرة بدون عرض الملف.",
 'upload-permitted' => 'أنواع الملفات المسموحة: $1.',
 'upload-preferred' => 'أنواع الملفات المفضلة: $1.',
 'upload-prohibited' => 'أنواع الملفات الممنوعة: $1.',
@@ -1600,25 +1610,27 @@ $1",
 'filetype-banned-type' => "'''\".\$1\"''' مش نوع ملف مسموح بيه.
 {{PLURAL:\$3|نوع الملف المسموح بيه هو|أنواع الملفات المسموح بيها هي}} \$2.",
 'filetype-missing' => 'الملف مالوش امتدا(مثلا ".jpg").',
+'file-too-large' => 'الملف كان كبير جدا.',
+'filetype-banned' => 'نوع الملف ده ممنوع.',
 'large-file' => 'ينصح ان الملفات ماتكونش أكبر من $1؛ الملف ده حجمه $2.',
 'largefileserver' => 'حجم الملف ده أكبر من المسموح بيه على السيرڨر ده .',
 'emptyfile' => 'الظاهر ان الملف اللى انت حملته طلع فاضي.
 يمكن يكون السبب هوه كتابة الاسم غلط.
 لو سمحت تتاكد من إنك فعلا عايز تحمل الملف دا..',
-'fileexists' => "فيه  ملف موجود بالاسم ده  الرجاء التأكد من الملف ده باتباع الوصلة التالية '''<tt>[[:$1]]</tt>''' قبل ما تغيره.
-[[$1|thumb]]",
-'filepageexists' => "صفحة الوصف بتاعة المف دا خلاص اتعملها انشاء فى '''<tt>[[:$1]]</tt>'''، بس مافيش ملف بالاسم دا دلوقتى.
+'fileexists' => 'فيه  ملف موجود بالاسم ده  الرجاء التأكد من الملف ده باتباع الوصلة التالية <strong>[[:$1]]</strong> قبل ما تغيره.
+[[$1|thumb]]',
+'filepageexists' => 'صفحة الوصف بتاعة المف دا خلاص اتعملها انشاء فى <strong>[[:$1]]</strong>، بس مافيش ملف بالاسم دا دلوقتى.
 الملخص اللى ح تكتبه  مش ح يظهر على صفحة الوصف.
 علشان تخلى الملف يظهر هناك، ح تحتاج تعدله يدوي.
-[[$1|thumb]]",
-'fileexists-extension' => "فى ملف موجود باسم قريب: [[$2|thumb]]
-* اسم الملف اللى انت عايز تحمله: '''<tt>[[:$1]]</tt>'''
-* اسم الملف الموجود: '''<tt>[[:$2]]</tt>'''
-لو سمحت تختار اسم تاني.",
+[[$1|thumb]]',
+'fileexists-extension' => 'فى ملف موجود باسم قريب: [[$2|thumb]]
+* اسم الملف اللى انت عايز تحمله: <strong>[[:$1]]</strong>
+* اسم الملف الموجود: <strong>[[:$2]]</strong>
+لو سمحت تختار اسم تاني.',
 'fileexists-thumbnail-yes' => "الظاهر ان الملف دا عبارة عن صورة متصغرة ''(تصغير)''. [[$1|thumb]]
-لو سمحت تشيك على الملف '''<tt>[[:$1]]</tt>'''.
+لو سمحت تشيك على الملف <strong>[[:$1]]</strong>.
 لو كان الملف هو نفس الصورة بالحجم الاصلي، ف مافيش داعى تحمله مرة تانية",
-'file-thumbnail-no' => "يبدأ الملف ب '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "يبدأ الملف ب <strong>$1</strong>.
 يبدو أن الملف مصتغر لحجم أعلى ''(تصغير)''.
 إذا كان عندك الصورة فى درجة دقة كامله حملها، أو غير اسم الملف من فضلك.",
 'fileexists-forbidden' => 'فى ملف بنفس الاسم موجود, و ماينفعش يتكتب عليه.
@@ -1809,7 +1821,7 @@ PICT # misc.
 'mimesearch' => 'تدوير MIME',
 'mimesearch-summary' => 'الصفحة دى مهمتها فلترة الملفات على حسب نوعها.
 المدخل: نوع المحتوى/النوع الفرعي، يعنى مثلا
-<tt>image/jpeg</tt>.',
+<code>image/jpeg</code>.',
 'mimetype' => 'نوع الملف:',
 'download' => 'تنزيل',
 
@@ -1995,7 +2007,7 @@ PICT # misc.
 'linksearch-ns' => 'النطاق:',
 'linksearch-ok' => 'تدوير',
 'linksearch-text' => 'الكروت الخاصة زى "*.wikipedia.org" ممكن تستعمل.<br />
-البروتوكولات المدعومة: <tt>$1</tt>',
+البروتوكولات المدعومة: <code>$1</code>',
 'linksearch-line' => '$1 موصوله من $2',
 'linksearch-error' => 'الكروت الخاصة ممكن تبان بس  فى بداية اسم المضيف',
 
@@ -2144,7 +2156,7 @@ $UNWATCHURL
 'delete-legend' => 'مسح',
 'historywarning' => "'''تحذير:''' الصفحه اللى ها  تمسحها ليها تاريخ فيه تقريبا $1 {{PLURAL:$1|مراجعة|مراجعة}}:",
 'confirmdeletetext' => 'انت على وشك انك تمسح صفحه أو صوره و كل تاريخها.
-من فضلك  اتأكد انك عايز المسح وبأنك فاهم نتايج  العمليه  دى. عمليات الحذف لازم تتم بناء على [[{{MediaWiki:Policy-url}}|القواعد المتفق عليها]].',
+من فضلك  اتأكد انك عايز المسح وبأنك فاهم نتايج  العمليه  دى. عمليات المسح لازم تتم بناء على [[{{MediaWiki:Policy-url}}|القواعد المتفق عليها]].',
 'actioncomplete' => 'العمليه خلصت',
 'actionfailed' => 'الفعل فشل',
 'deletedtext' => '"$1" اتمسحت.
index b945c5b..2e86ea2 100644 (file)
@@ -30,8 +30,8 @@ $namespaceNames = array(
        NS_PROJECT_TALK     => '$1_বাৰ্তা',
        NS_FILE             => 'চিত্ৰ',
        NS_FILE_TALK        => 'চিত্ৰ_বাৰ্তা',
-       NS_MEDIAWIKI        => 'মà§\87ডিয়াৱিকি',
-       NS_MEDIAWIKI_TALK   => 'মà§\87ডিয়াৱিà¦\95ি_বাৰà§\8dতা',
+       NS_MEDIAWIKI        => 'মিডিয়াৱিকি',
+       NS_MEDIAWIKI_TALK   => 'মিডিয়াৱিà¦\95ি_à¦\86লà§\8bà¦\9aনা',
        NS_TEMPLATE         => 'সাঁচ',
        NS_TEMPLATE_TALK    => 'সাঁচ_বাৰ্তা',
        NS_HELP             => 'সহায়',
@@ -53,6 +53,8 @@ $namespaceAliases = array(
        'चित्र_वार्ता' => NS_FILE_TALK,
        'চিত্র' => NS_FILE,
        'চিত্র বার্তা' => NS_FILE_TALK,
+       'মেডিয়াৱিকি' => NS_MEDIAWIKI,
+       'মেডিয়াৱিকি_বাৰ্তা' => NS_MEDIAWIKI_TALK,
        'MediaWiki বার্তা' => NS_MEDIAWIKI_TALK,
        'साँचा' => NS_TEMPLATE,
        'साँचा_वार्ता' => NS_TEMPLATE_TALK,
@@ -65,35 +67,104 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'সক্ৰিয়_সদস্যসকল' ),
+       'Allmessages'               => array( 'সকলোবোৰ_বাৰ্তা' ),
        'Allpages'                  => array( 'সকলোবোৰ_পৃষ্ঠা' ),
-       'Contributions'             => array( 'অৱদানবোৰ' ),
+       'Ancientpages'              => array( 'পুৰণি_পৃষ্ঠা' ),
+       'Badtitle'                  => array( 'ভুল_শিৰোনাম' ),
+       'Blankpage'                 => array( 'উকা_পৃষ্ঠা' ),
+       'Block'                     => array( 'অৱৰোধ', 'আই_পি_অৱৰোধ', 'সদস্য_অৱৰোধ' ),
+       'Blockme'                   => array( 'মোক_অৱৰোধ_কৰক' ),
+       'Booksources'               => array( 'গ্ৰন্থৰ_উত্স' ),
+       'BrokenRedirects'           => array( 'ভঙা_পূণঃনিৰ্দেশনাসমূহ' ),
+       'Categories'                => array( 'শ্ৰেণীসমূহ' ),
+       'ChangeEmail'               => array( 'ইমেইল_সলনি_কৰক' ),
+       'ChangePassword'            => array( 'গুপ্তশব্দ_সলনি_কৰক', 'গুপ্তশব্দ_সলনি' ),
+       'ComparePages'              => array( 'তুলনা_কৰক' ),
+       'Confirmemail'              => array( 'ইমেইল_নিশ্চিত_কৰক' ),
+       'Contributions'             => array( 'বৰঙনিসমূহ', 'বৰঙনিদাতাসকল', 'বৰঙনি' ),
        'CreateAccount'             => array( 'সদস্যভুক্তি' ),
+       'DeletedContributions'      => array( 'বিলোপ_কৰা_বৰঙনিসমূহ' ),
+       'Disambiguations'           => array( 'দ্ব্যৰ্থতা_দূৰীকৰণসমূহ' ),
+       'DoubleRedirects'           => array( 'দ্বি_পুণঃনিৰ্দেশনাসমূহ' ),
+       'EditWatchlist'             => array( 'লক্ষ্যতালিকা_সম্পাদনা_কৰক' ),
+       'Emailuser'                 => array( 'সদস্যলৈ_ই-মেইল_পঠিয়াওক' ),
+       'Export'                    => array( 'ৰপ্তানি' ),
+       'Fewestrevisions'           => array( 'নূন্যতম_সংস্কৰণসমূহ' ),
+       'FileDuplicateSearch'       => array( 'প্ৰতিলিপি_সনিবিষ্ট_নথি_অনুসন্ধান' ),
+       'Filepath'                  => array( 'ফাইলৰ_পথ' ),
+       'Import'                    => array( 'আমদানি' ),
+       'Invalidateemail'           => array( 'অবৈধ_ই-মেইল' ),
+       'JavaScriptTest'            => array( 'জাভাস্ক্ৰীপ্ত_পৰীক্ষা' ),
+       'BlockList'                 => array( 'অৱৰোধৰ_তালিকা' ),
+       'LinkSearch'                => array( 'সংযোগ_সন্ধান' ),
+       'Listadmins'                => array( 'প্ৰশাসকৰ_তালিকা' ),
+       'Listbots'                  => array( 'বটৰ_তালিকা' ),
        'Listfiles'                 => array( 'চিত্ৰ-তালিকা' ),
        'Listgrouprights'           => array( 'গোটৰ_অধিকাৰসমূহ' ),
+       'Listredirects'             => array( 'পুণঃনিৰ্দেশনাসমূহৰ_তালিকা' ),
        'Listusers'                 => array( 'সদস্য-তালিকা' ),
+       'Lockdb'                    => array( 'তথ্যকোষ_বন্ধ_কৰক' ),
+       'Log'                       => array( 'অভিলেখ', 'অভিলেখসমূহ' ),
        'Lonelypages'               => array( 'অকলশৰীয়া_পৃষ্ঠা' ),
-       'Mycontributions'           => array( 'মোৰ_অৱদান' ),
+       'Longpages'                 => array( 'দীঘলীয়া_পৃষ্ঠাসমূহ' ),
+       'MergeHistory'              => array( 'একত্ৰীকৰণ_ইতিহাস' ),
+       'MIMEsearch'                => array( 'MIME_অনুসন্ধান' ),
+       'Movepage'                  => array( 'পৃষ্ঠা_স্থানান্তৰ' ),
+       'Mycontributions'           => array( 'মোৰ_বৰঙনি' ),
        'Mypage'                    => array( 'মোৰ_পৃষ্ঠা' ),
        'Mytalk'                    => array( 'মোৰ_কথোপকথন' ),
+       'Myuploads'                 => array( 'মোৰ_আপল’ডসমূহ' ),
        'Newimages'                 => array( 'নতুন_চিত্ৰ' ),
+       'Newpages'                  => array( 'পৰৱৰ্তী_পৃষ্ঠা' ),
+       'PasswordReset'             => array( 'গুপ্তশব্দ_ঘূৰাই_আনক' ),
+       'PermanentLink'             => array( 'স্থায়ী_সংযোগ' ),
        'Popularpages'              => array( 'জনপ্ৰিয়_পৃষ্ঠাসমূহ' ),
        'Preferences'               => array( 'পচন্দ' ),
+       'Protectedpages'            => array( 'সুৰক্ষিত_পৃষ্ঠাসমূহ' ),
+       'Protectedtitles'           => array( 'সুৰক্ষিত_শিৰোনামসমূহ' ),
        'Randompage'                => array( 'আকস্মিক' ),
-       'Recentchanges'             => array( 'শেহতীয়া_কাম' ),
-       'Specialpages'              => array( 'বিশেষ_পৃষ্ঠাবোৰ' ),
+       'Randomredirect'            => array( 'আকস্মিক_পুণঃনিৰ্দেশনা' ),
+       'Recentchanges'             => array( 'শেহতীয়া_সালসলনি' ),
+       'Recentchangeslinked'       => array( 'সম্পৰ্কিত_সালসলনিসমূহ' ),
+       'Revisiondelete'            => array( 'সংস্কৰণ_বিলোপ' ),
+       'RevisionMove'              => array( 'সংস্কৰণ_স্থানান্তৰ' ),
+       'Search'                    => array( 'সন্ধান' ),
+       'Shortpages'                => array( 'চমু_পৃষ্ঠা' ),
+       'Specialpages'              => array( 'বিশেষ_পৃষ্ঠাসমূহ' ),
        'Statistics'                => array( 'পৰিসংখ্যা' ),
+       'Tags'                      => array( 'টেগসমূহ' ),
+       'Unblock'                   => array( 'অৱৰোধ_বাৰণ' ),
        'Uncategorizedcategories'   => array( 'অবিন্যস্ত_শ্ৰেণীসমূহ' ),
-       'Uncategorizedimages'       => array( 'à¦\85বিনà§\8dযসà§\8dত_à¦\9aিতà§\8dৰবà§\8bৰ' ),
+       'Uncategorizedimages'       => array( 'à¦\85বিনà§\8dযসà§\8dত_à¦\9aিতà§\8dৰসমà§\82হ' ),
        'Uncategorizedpages'        => array( 'অবিন্যস্ত_পৃষ্ঠাসমূহ' ),
-       'Uncategorizedtemplates'    => array( 'অবিন্যস্ত_সাঁচবোৰ' ),
+       'Uncategorizedtemplates'    => array( 'অবিন্যস্ত_সাঁচসমূহ' ),
+       'Undelete'                  => array( 'বিলোপ_ঘূৰাই_আনক' ),
+       'Unlockdb'                  => array( 'তথ্যকোষ_খোলক' ),
        'Unusedcategories'          => array( 'অব্যৱহৃত_শ্ৰেণীসমূহ' ),
-       'Unusedimages'              => array( 'অব্যৱহৃত_চিত্ৰবোৰ' ),
-       'Upload'                    => array( 'বোজাই' ),
-       'Userlogin'                 => array( 'সদস্যৰ_প্ৰবেশ' ),
+       'Unusedimages'              => array( 'অব্যৱহৃত_চিত্ৰসমূহ' ),
+       'Unusedtemplates'           => array( 'অব্যৱহৃত_সাঁচসমূহ' ),
+       'Unwatchedpages'            => array( 'লক্ষ্য_নৰখা_পৃষ্ঠাসমূহ' ),
+       'Upload'                    => array( 'আপল’ড', 'বোজাই' ),
+       'Userlogin'                 => array( 'সদস্যৰ_প্ৰৱেশ' ),
        'Userlogout'                => array( 'সদস্যৰ_প্ৰস্থান' ),
+       'Userrights'                => array( 'সদস্যৰ_অধিকাৰ', 'প্ৰশাসক_সৃষ্টি', 'বট_সৃষ্টি' ),
+       'Version'                   => array( 'সংস্কৰণ' ),
        'Wantedcategories'          => array( 'আকাংক্ষিত_শ্ৰেণীসমূহ' ),
-       'Wantedpages'               => array( 'আকাংক্ষিত_পৃষ্ঠাসমূহ' ),
+       'Wantedfiles'               => array( 'কাম্য_ফাইলসমূহ' ),
+       'Wantedpages'               => array( 'কাম্য_পৃষ্ঠাসমূহ', 'ভগা_সংযোগসমূহ' ),
+       'Wantedtemplates'           => array( 'কাম্য_সাঁচসমূহ' ),
        'Watchlist'                 => array( 'লক্ষ্যতালিকা' ),
+       'Whatlinkshere'             => array( 'পৃষ্ঠালৈ_থকা_সংযোগসমূহ' ),
+       'Withoutinterwiki'          => array( 'আন্তঃৱিকিবিহীন' ),
+);
+
+$magicWords = array(
+       'redirect'                  => array( '0', 'পুণঃনিৰ্দেশ', '#REDIRECT' ),
+       'special'                   => array( '0', 'বিশেষ', 'special' ),
+       'hiddencat'                 => array( '1', '__গোপন_শ্ৰেণী__', '__HIDDENCAT__' ),
+       'pagesize'                  => array( '1', 'পৃষ্ঠাৰ_আকাৰ', 'PAGESIZE' ),
+       'index'                     => array( '1', '__সূচী__', '__INDEX__' ),
 );
 
 $digitTransformTable = array(
@@ -119,12 +190,12 @@ $messages = array(
 'tog-hidepatrolled' => 'সাম্প্ৰতিক সাল-সলনিত তহলদাৰী সম্পাদনা নেদেখুৱাব',
 'tog-newpageshidepatrolled' => 'নতুন পৃষ্ঠা তালিকাত তহলদাৰী পৃষ্ঠাসমূহ নেদেখুৱাব',
 'tog-extendwatchlist' => 'কেৱল সাম্প্ৰতিকেই নহয, লক্ষ্য-তালিকাৰ সকলো সাল-সলনি বহলাই দেখুৱাওক',
-'tog-usenewrc' => 'বৰà§\8dদà§\8dধিত à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦¸à¦¾à¦²-সলনি à¦¬à§\8dযবহাৰ à¦\95ৰà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dৰিপà§\8dà¦\9fৰ à¦¦à§°à¦\95াৰ)',
+'tog-usenewrc' => 'বৰà§\8dদà§\8dধিত à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦¸à¦¾à¦²-সলনি à¦¬à§\8dযৱহাৰ à¦\95ৰà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dৰিপà§\8dà¦\9fৰ à¦ªà§\8dৰয়à§\8bà¦\9cন)',
 'tog-numberheadings' => 'শীৰ্ষকত স্বয়ংক্ৰিয়ভাৱে ক্ৰমিক নং দিয়ক',
 'tog-showtoolbar' => 'সম্পাদনা দণ্ডিকা দেখুৱাওক (জাভাস্ক্ৰিপ্টৰ দৰকাৰ)',
 'tog-editondblclick' => 'একেলগে দুবাৰ টিপা মাৰিলে পৃষ্ঠা সম্পাদনা কৰক (জাভাস্ক্ৰিপ্টৰ দৰকাৰ)',
 'tog-editsection' => '[সম্পাদনা] সংযোগৰ দ্বাৰা অনুচ্ছেদ সম্পাদনা কৰা সক্ৰিয় কৰক',
-'tog-editsectiononrightclick' => 'অনুচ্ছেদৰ শিৰোনামাত সোঁ-বুটাম টিপা মাৰি সম্পাদনা কৰাটো সক্ৰিয় কৰক (জাভাস্ক্ৰিপ্ট)',
+'tog-editsectiononrightclick' => 'অনুচ্ছেদৰ শিৰোনামাত সোঁ-বুটাম টিপা মাৰি সম্পাদনা কৰাটো সক্ৰিয় কৰক (জাভাস্ক্ৰিপ্টৰ প্ৰয়োজন)',
 'tog-showtoc' => 'শিৰোনামাৰ সূচী দেখুৱাওক (যিবোৰ পৃষ্ঠাত তিনিটাতকৈ বেছি শিৰোনামা আছে)',
 'tog-rememberpassword' => 'মোৰ প্ৰৱেশ এই কম্পিউটাৰত মনত ৰাখক (সৰ্বাধিক $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
 'tog-watchcreations' => 'মই সৃষ্টি সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক',
@@ -137,7 +208,7 @@ $messages = array(
 'tog-nocache' => 'ব্ৰাউজাৰ পৃষ্ঠা কেশ্বিং নিষ্ক্ৰীয় কৰক',
 'tog-enotifwatchlistpages' => 'মোৰ লক্ষ্য-তালিকাত থকা পৃষ্ঠা সলনি হলে মোলৈ ই-মেইল পঠাব',
 'tog-enotifusertalkpages' => 'মোৰ বাৰ্তা পৃষ্ঠা সলনি হলে মোলৈ ই-মেইল পঠাব',
-'tog-enotifminoredits' => 'অগুৰুত্বপূৰ্ণ সম্পাদনা হলেও মোলৈ ই-মেইল পঠাব',
+'tog-enotifminoredits' => "অগুৰুত্বপূৰ্ণ সম্পাদনা হ'লেও মোলৈ ই-মেইল পঠাব",
 'tog-enotifrevealaddr' => 'জাননী ই-মেইল বোৰত মোৰ ই-মেইল ঠিকনা দেখুৱাব',
 'tog-shownumberswatching' => 'লক্ষ্য কৰি থকা সদস্য সমূহৰ সংখ্যা দেখুৱাওক',
 'tog-oldsig' => 'বৰ্তমানৰ স্বাক্ষৰ:',
@@ -156,7 +227,7 @@ $messages = array(
 'tog-ccmeonemails' => 'মই অন্য সদস্যলৈ পঠোৱা ই-মেইলৰ প্ৰতিলিপি এটা মোলৈও পঠাব',
 'tog-diffonly' => 'পার্থক্যৰ তলত পৃষ্ঠাৰ বিষয়বস্তু নেদেখুৱাব',
 'tog-showhiddencats' => 'নিহিত শ্ৰেণী সমূহ দেখুৱাওক',
-'tog-norollbackdiff' => 'ৰà§\8bলবà§\87à¦\95à§\8d à¦\95ৰা à¦ªà¦¾à¦\9aত পাৰ্থক্য নেদেখুৱাব',
+'tog-norollbackdiff' => 'পà§\82ৰà§\8dবৱত à¦\95ৰা à¦ªà¦¾à¦\9bত পাৰ্থক্য নেদেখুৱাব',
 
 'underline-always' => 'সদায়',
 'underline-never' => 'কেতিয়াও নহয়',
@@ -170,14 +241,14 @@ $messages = array(
 'editfont-serif' => 'চেৰিফ ফন্ট',
 
 # Dates
-'sunday' => 'দেওবাৰ',
+'sunday' => 'দà§\87à¦\93à¦\81বাৰ',
 'monday' => 'সোমবাৰ',
 'tuesday' => 'মঙ্গলবাৰ',
 'wednesday' => 'বুধবাৰ',
 'thursday' => 'বৃহস্পতিবাৰ',
 'friday' => 'শুক্ৰবাৰ',
 'saturday' => 'শণিবাৰ',
-'sun' => 'দেও',
+'sun' => 'দেও',
 'mon' => 'সোম',
 'tue' => 'মংগল',
 'wed' => 'বুধ',
@@ -222,13 +293,13 @@ $messages = array(
 'dec' => 'ডিচেম্বৰ:',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|শ্ৰেণী|শ্ৰেণী}}',
+'pagecategories' => '{{PLURAL:$1|শ্ৰেণী|শ্ৰেণীসমূহ}}',
 'category_header' => '"$1" শ্ৰেণীৰ পৃষ্ঠাসমূহ',
 'subcategories' => 'উপশ্ৰেণীসমূহ',
 'category-media-header' => '"$1" শ্ৰেণীৰ মিডিয়া',
 'category-empty' => "''এই শ্ৰেণীত বৰ্তমান কোনো পৃষ্ঠা বা মিডিয়া ফাইল নাই ।''",
 'hidden-categories' => '{{PLURAL:$1|নিহিত শ্ৰেণী|নিহিত শ্ৰেণীসমূহ}}',
-'hidden-category-category' => 'অদৃশ্য শ্ৰেণী সমূহ',
+'hidden-category-category' => 'অদৃশ্য শ্ৰেণীসমূহ',
 'category-subcat-count' => '{{PLURAL:$2|এই শ্ৰেণীত নিম্নলিখিত উপশ্ৰেণীসমূহ আছে। মুঠ $2টা উপশ্ৰেণীৰ ভিতৰত এই শ্ৰেণীত নিম্নলিখিত {{PLURAL:$1|এটা উপশ্ৰেণী|$1 টা উপশ্ৰেণী}} আছে।}}',
 'category-subcat-count-limited' => 'এই শ্ৰেণীত নিম্নলিখিত {{PLURAL:$1|টা উপশ্ৰেণী আছে|$1টা উপশ্ৰেণী আছে}}।',
 'category-article-count' => '{{PLURAL:$2|এই শ্ৰেণীটোত কেৱল তলত দিয়া পৃষ্ঠাহে আছে । মুঠ $2 খনৰ ভিতৰত এই শ্ৰেণীটোত তলৰ {{PLURAL:$1|এখন পৃষ্ঠা আছে|$1 খন পৃষ্ঠা আছে}}।}}',
@@ -241,9 +312,9 @@ $messages = array(
 'broken-file-category' => 'অবৈধ ফাইল সংযোগযুক্ত পৃষ্ঠাবোৰ',
 
 'about' => 'বিষয়ে',
-'article' => 'বিষয়বসà§\8dতà§\81 পৃষ্ঠা',
+'article' => 'সমল পৃষ্ঠা',
 'newwindow' => "(নতুন ৱিণ্ড'ত খোল খায়)",
-'cancel' => 'ৰদ à¦\95ৰা à¦¹à¦\93ক',
+'cancel' => 'বাতিল à¦\95ৰক',
 'moredotdotdot' => 'অধিক...',
 'mypage' => 'মোৰ পৃষ্ঠা',
 'mytalk' => 'মোৰ কথা-বতৰা',
@@ -264,7 +335,7 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'বিষয় যোগ',
-'vector-action-delete' => 'মà¦\9aি à¦ªà§\87লাà¦\93ক',
+'vector-action-delete' => 'বিলà§\8bপ à¦\95ৰক',
 'vector-action-move' => 'স্থানান্তৰ কৰক',
 'vector-action-protect' => 'সুৰক্ষিত কৰক',
 'vector-action-undelete' => 'পুনৰুদ্ধাৰ কৰক',
@@ -280,7 +351,7 @@ $messages = array(
 'variants' => 'বিকল্পসমূহ',
 
 'errorpagetitle' => 'ভুল',
-'returnto' => '$1 লৈ ঘূৰি যাওক ।',
+'returnto' => '$1লৈ ঘূৰি যাওক ।',
 'tagline' => '{{SITENAME}}ৰ পৰা',
 'help' => 'সহায়',
 'search' => 'সন্ধান',
@@ -305,7 +376,7 @@ $messages = array(
 'protect' => 'সুৰক্ষিত কৰক',
 'protect_change' => 'সলাওক',
 'protectthispage' => 'বৰ্তমান পৃষ্ঠাৰ সংৰক্ষণবিধিৰ পৰিবৰ্তন',
-'unprotect' => 'সà¦\82ৰà¦\95à§\8dষণ সলনি কৰক',
+'unprotect' => 'সà§\81ৰà¦\95à§\8dষা সলনি কৰক',
 'unprotectthispage' => 'এই পৃষ্ঠাৰ সুৰক্ষা সলনি কৰক',
 'newpage' => 'নতুন পৃষ্ঠা',
 'talkpage' => 'এই পৃষ্ঠা সম্পৰ্কে কথা-বতৰা',
@@ -316,20 +387,20 @@ $messages = array(
 'articlepage' => 'সমল পৃষ্ঠা চাওক',
 'talk' => 'আলোচনা',
 'views' => 'দৰ্শন',
-'toolbox' => 'সা-সৰঞ্জাম',
+'toolbox' => 'সা-সৰঞ্জাম',
 'userpage' => 'সদস্য পৃষ্ঠা চাওক',
-'projectpage' => 'প্ৰকল্প পৃষ্ঠা',
-'imagepage' => 'ফাà¦\87ল পৃষ্ঠা চাওক',
+'projectpage' => 'প্ৰকল্প পৃষ্ঠা চাওক',
+'imagepage' => 'নথি পৃষ্ঠা চাওক',
 'mediawikipage' => 'বাৰ্তা পৃষ্ঠা চাওক',
 'templatepage' => 'সাঁচ পৃষ্ঠা চাওক',
 'viewhelppage' => 'সহায় পৃষ্ঠা চাওক',
 'categorypage' => 'শ্ৰেণী পৃষ্ঠা চাওক',
-'viewtalkpage' => 'à¦\95থা-বতৰা চাওক',
-'otherlanguages' => 'আন ভাষাত',
-'redirectedfrom' => '($1 ৰ পৰা পুনঃনিৰ্দেশিত)',
+'viewtalkpage' => 'à¦\86লà§\8bà¦\9aনা চাওক',
+'otherlanguages' => 'à¦\86ন à¦­à¦¾à¦·à¦¾à¦¸à¦®à§\82হত',
+'redirectedfrom' => '($1ৰ পৰা পুনঃনিৰ্দেশিত)',
 'redirectpagesub' => 'পুনঃনিৰ্দেশিত পৃষ্ঠা',
 'lastmodifiedat' => 'এই পৃষ্ঠাখন শেষবাৰৰ কাৰণে $1 তাৰিখে $2 বজাত সলনি কৰা হৈছিল।',
-'viewcount' => 'এই পৃষ্ঠাটো {{PLURAL:$1|এবাৰ|$1}} বাৰ চোৱা হৈছে',
+'viewcount' => 'এই পৃষ্ঠাটো {{PLURAL:$1|এবাৰ|$1 বাৰ}} চোৱা হৈছে',
 'protectedpage' => 'সুৰক্ষিত পৃষ্ঠা',
 'jumpto' => 'গম্যাৰ্থে',
 'jumptonavigation' => 'দিকদৰ্শন',
@@ -339,7 +410,7 @@ $messages = array(
 অনুগ্ৰহ কৰি অলপ পাছত এই পৃষ্ঠা চাবলৈ প্ৰয়াস কৰক ।
 
 $1',
-'pool-timeout' => 'লà¦\95ৰ à¦¬à¦¾à¦¬à§\87 à¦\85পà§\87à¦\95à§\8dষা à¦\95ৰি সময় উকলি গৈছে',
+'pool-timeout' => 'বনà§\8dধ à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\85পà§\87à¦\95à§\8dষা à¦\95ৰাৰ সময় উকলি গৈছে',
 'pool-queuefull' => 'পোল কিউ (pool queue) সমূল',
 'pool-errorunknown' => 'অপৰিচিত ত্ৰুটি',
 
@@ -350,7 +421,7 @@ $1',
 'copyrightpage' => '{{ns:project}}:স্বত্ব',
 'currentevents' => 'সাম্প্ৰতিক ঘটনাৱলী',
 'currentevents-url' => 'Project:শেহতীয়া ঘটনাৱলী',
-'disclaimers' => 'à¦\98à§\8bষণা',
+'disclaimers' => 'দায়লà§\81পà§\8dতি',
 'disclaimerpage' => 'Project:সাধাৰণ দায়লুপ্তি',
 'edithelp' => 'সম্পাদনাৰ বাবে সহায়',
 'edithelppage' => 'Help:সম্পাদনা',
@@ -370,12 +441,12 @@ $1',
 'versionrequired' => 'মিডিয়াৱিকিৰ $1 সংকলন থাকিব লাগিব ।',
 'versionrequiredtext' => 'এই পৃষ্ঠাটো ব্যৱহাৰ কৰিবলৈ মিডিয়াৱিকিৰ $1 সংস্কৰণ থাকিব লাগিব । [[Special:Version|সংস্কৰণ পৃষ্ঠা]] চাওক।',
 
-'ok' => 'à¦\85â\80\99à¦\95ে',
-'retrievedfrom' => '"$1" -ৰ পৰা সংকলিত',
+'ok' => 'ঠিà¦\95 à¦\86à¦\9bে',
+'retrievedfrom' => '"$1"ৰ পৰা সংকলিত',
 'youhavenewmessages' => 'আপোনাৰ কাৰণে $1 আছে। ($2)',
-'newmessageslink' => 'নতà§\81ন à¦¬à¦¾à§°à§\8dতা',
+'newmessageslink' => 'নতà§\81ন à¦¸à¦\82বাদ',
 'newmessagesdifflink' => 'শেহতীয়া সাল-সলনি',
-'youhavenewmessagesmulti' => '$1ত à¦\86পà§\8bনাৰ à¦\95াৰণà§\87 à¦¨à¦¤à§\81ন à¦¬à¦¾à§°à§\8dতা আছে',
+'youhavenewmessagesmulti' => '$1ত à¦\86পà§\8bনাৰ à¦\95াৰণà§\87 à¦¨à¦¤à§\81ন à¦¸à¦\82বাদ আছে',
 'editsection' => 'সম্পাদনা কৰক',
 'editold' => 'সম্পাদনা',
 'viewsourceold' => 'উৎস চাওক',
@@ -407,26 +478,26 @@ $1',
 'nstab-media' => 'মিডিয়া পৃষ্ঠা',
 'nstab-special' => 'বিশেষ পৃষ্ঠা',
 'nstab-project' => 'প্ৰকল্প পৃষ্ঠা',
-'nstab-image' => 'à¦\9aিতà§\8dৰ',
-'nstab-mediawiki' => 'বাৰà§\8dতা',
+'nstab-image' => 'নথি',
+'nstab-mediawiki' => 'সà¦\82বাদ',
 'nstab-template' => 'সাঁচ',
 'nstab-help' => 'সাহায্য পৃষ্ঠা',
 'nstab-category' => 'শ্ৰেণী',
 
 # Main script and global functions
 'nosuchaction' => 'এনে কাৰ্য নাই',
-'nosuchactiontext' => "এই ইউআৰএল-এ নিৰ্ধাৰিত কৰা কাৰ্য্য অবৈধ।
+'nosuchactiontext' => "এই ইউআৰএলে নিৰ্ধাৰিত কৰা কাৰ্য অবৈধ।
 আপুনি বোধহয়  ইউআৰএল ভুলকৈ লিখিছে বা এটা ভুল লিঙ্ক অনুকৰণ কৰিছে ।
-হ'বও পাৰে যে {{SITENAME}}-ত ব্যৱহাৰ হোৱা চফ্টৱেৰত ত্ৰুটি আছে ।",
-'nosuchspecialpage' => 'এনেকুৱা কোনো বিশেষ পৃষ্ঠা নাই',
+{{SITENAME}}ত ব্যৱহাৰ হোৱা চফ্টৱেৰত ত্ৰুটি হ'বও পাৰে ।",
+'nosuchspecialpage' => 'এনে ধৰনৰ কোনো বিশেষ পৃষ্ঠা নাই',
 'nospecialpagetext' => '<strong>আপুনি অবৈধ বিশেষ পৃষ্ঠা এটা অনুৰোধ কৰিছে ।</strong>
 
- বৈধ বিশেষ পৃষ্ঠাসমূহৰ তালিকা ইয়াত পাব [[Special:SpecialPages|{{int:specialpages}}]] ।',
+বৈধ বিশেষ পৃষ্ঠাসমূহৰ তালিকা ইয়াত পাব [[Special:SpecialPages|{{int:specialpages}}]] ।',
 
 # General errors
 'error' => 'ভুল',
 'databaseerror' => 'তথ্যকোষৰ ভুল',
-'dberrortext' => 'Database query-ত ভুল আছে।
+'dberrortext' => 'Database query’ত ত্ৰুটি আছে।
 ছফ্টৱেৰত থকা কোনো বাগৰ বাবে এনে হব পাৰে।
 অন্তিমবাৰ চেষ্টা কৰা ডাটাবেচ কুৱেৰীটো আছিল এনেধৰণৰ:
 <blockquote><tt>$1</tt></blockquote>
@@ -448,30 +519,32 @@ $1',
 বিলোপ কৰা কোনো পৃষ্ঠাৰ সংযোগৰ বাবে সাধাৰণতে এনে ঘটে ।
 
 যদি এনে হোৱা নাই তেন্তে আপুনি ছফ্টৱেৰত কিবা সমস্যা পাইছে ।
-অনুগ্ৰহ কৰি এই সম্পৰ্কে ইউ.আৰ.এল. সহ কোনো [[Special:ListUsers/sysop|প্ৰশাসক]] ক জনাওক ।',
+অনুগ্ৰহ কৰি এই সম্পৰ্কে ইউ.আৰ.এল. সহ কোনো [[Special:ListUsers/sysop|প্ৰশাসক]]ক জনাওক ।',
 'missingarticle-rev' => '(সংস্কৰণ#: $1)',
 'missingarticle-diff' => '(তফাৎ: $1, $2)',
 'readonly_lag' => 'তথ্যকোষ স্বয়ংক্ৰিয়ভাৱে বন্ধ হৈছে যাতে দ্বিতীয় শ্ৰেণীৰ তথ্যকোষৰ চাৰ্ভাৰ প্ৰধান তথ্যকোষৰ চাৰ্ভাৰৰ অৱস্থালৈ আহিব পাৰে ।',
 'internalerror' => 'আভ্যন্তৰীণ ক্ৰুটি',
-'internalerror_info' => 'ভিতৰà§\81ৱা ত্ৰুটি: $1',
-'fileappenderrorread' => 'à¦\9cোৰা দিয়াৰ সময়ত "$1" পাঠ্য কৰা নহ\'ল ।',
+'internalerror_info' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ ত্ৰুটি: $1',
+'fileappenderrorread' => 'যোৰা দিয়াৰ সময়ত "$1" পাঠ্য কৰা নহ\'ল ।',
 'fileappenderror' => '"$2"ৰ লগত "$1"ৰ সংযোগ কৰা নহ\'ল ।',
-'filecopyerror' => '"$1" ফাইলটো "$2" লৈ প্ৰতিলিপি কৰিব পৰা নগ’ল।',
-'filerenameerror' => '"$1" ফাইলৰ নাম সলনি কৰি "$2" কৰিব পৰা নগল ।',
-'filedeleteerror' => '"$1" ফাইলতো বিলোপ কৰিব পৰা নগল।',
-'directorycreateerror' => '"$1" à¦¡à¦¾à¦\87ৰà§\87à¦\95à§\8dà¦\9fৰি সৃষ্টি কৰিব পৰা নগ’ল।',
-'filenotfound' => '"$1" নামৰ ফাইলটো বিচাৰি পোৱা নগল।',
+'filecopyerror' => '"$1" ফাইলটো "$2"লৈ প্ৰতিলিপি কৰিব পৰা নগ’ল।',
+'filerenameerror' => '"$1" ফাইলৰ নাম সলনি কৰি "$2" কৰিব পৰা নগল ।',
+'filedeleteerror' => '"$1" ফাইলতো বিলোপ কৰিব পৰা নগল।',
+'directorycreateerror' => '"$1" à¦¨à¦¿à§°à§\8dদà§\87শিà¦\95া সৃষ্টি কৰিব পৰা নগ’ল।',
+'filenotfound' => '"$1" নামৰ ফাইলটো বিচাৰি পোৱা নগল।',
 'fileexistserror' => '"$1" ফাইলটোত লিখিব নোৱাৰি: ফাইলটো আগৰ পৰাই আছে',
 'unexpected' => 'অনাকাংক্ষিত মূল্য: "$1"="$2".',
 'formerror' => 'ভুল: ফৰ্ম খন জমা দিব পৰা নগ’ল',
 'badarticleerror' => 'এই পৃষ্ঠাটোত এই কামটো কৰিব নোৱাৰি ।',
-'cannotdelete' => '"$1" à¦ªà§\83ষà§\8dঠা à¦¬à¦¾ à¦«à¦¾à¦\87ল à¦®à¦\9aা à¦¸à¦®à§\8dভব à¦¨à¦¹à¦¯à¦¼ ।
-সমà§\8dভৱ à¦\86নà§\87 à¦\86à¦\97à§\87à¦\87 à¦®à¦\9aি à¦¥à§\88ছে ।',
+'cannotdelete' => '"$1" à¦ªà§\83ষà§\8dঠা à¦¬à¦¾ à¦¨à¦¥à¦¿à¦\96ন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা à¦\85সমà§\8dভৱ ।
+সমà§\8dভৱ à¦\86নà§\87 à¦\86à¦\97à§\87à¦\87 à¦¬à¦¿à¦²à§\8bপ à¦\95ৰিছে ।',
 'cannotdelete-title' => '"$1" পৃষ্ঠা বিলোপ কৰিব নোৱাৰি',
+'delete-hook-aborted' => 'হুকৰ দ্বাৰা সম্পাদনা প্ৰত্যাখ্যান কৰা হৈছে ।
+ইয়াৰ কোনো ব্যাখ্যা নাই ।',
 'badtitle' => 'অগ্ৰহণীয় শিৰোনামা',
 'badtitletext' => 'আপুনি বিচৰা পৃষ্ঠাটোৰ শিৰোনামা অযোগ্য, খালী বা ভুলকৈ জড়িত আন্তৰ্ভাষিক বা আন্তৰ্ৱিকি শিৰোনামা। ইয়াত এক বা ততোধিক বৰ্ণ আছে যাক শিৰোনামাত ব্যৱহাৰ কৰিব নোৱাৰি।',
-'perfcached' => "তলত দিয়া তথ্যখিনি আগতে জমা কৰি থোৱা (cached) আৰু সাম্প্ৰতিক নহ'ব পাৰে। এই তথ্যখিনিত সৰ্বোচ্চ {{PLURAL:$1|এটা ফলফল|$1টা ফলাফল}} উপলব্ধ।",
-'perfcachedts' => 'তলত দিয়া তথ্য খিনি আগতে জমা কৰি থোৱা (cached) আৰু শেষবাৰৰ কাৰণে $1 ত নবীকৰণ কৰা হৈছিল। সৰ্বাধিক {{PLURAL:$4|এটা ফলাফল|$4 টা ফলাফল}} এই cacheত পাব।',
+'perfcached' => "তলত à¦¦à¦¿à¦¯à¦¼à¦¾ à¦¤à¦¥à§\8dযà¦\96িনি à¦\86à¦\97তà§\87 à¦\9cমা à¦\95ৰি à¦¥à§\8bৱা (cached) à¦\86ৰà§\81 à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦¨à¦¹'ব à¦ªà¦¾à§°à§\87। à¦\8fà¦\87 à¦¤à¦¥à§\8dযà¦\96িনিত à¦¸à§°à§\8dবà§\8bà¦\9aà§\8dà¦\9a {{PLURAL:$1|à¦\8fà¦\9fা à¦«à¦²à¦¾à¦«à¦²|$1à¦\9fা à¦«à¦²à¦¾à¦«à¦²}} à¦\89পলবà§\8dধ।",
+'perfcachedts' => 'তলত দিয়া তথ্য খিনি আগতে জমা কৰি থোৱা (cached) আৰু শেষবাৰৰ কাৰণে $1 ত নবীকৰণ কৰা হৈছিল। সৰ্বাধিক {{PLURAL:$4|এটা ফলাফল|$4 টা ফলাফল}} এই কেশ্বত পাব।',
 'querypage-no-updates' => 'এই পৃষ্ঠাটো নৱীকৰণ কৰা ৰোধ কৰা হৈছে। ইয়াৰ তথ্য এতিয়া সতেজ কৰিব নোৱাৰি।',
 'wrong_wfQuery_params' => 'wfQuery() ৰ কাৰণে ভুল মাপদণ্ড দিয়া হৈছে <br />
 কাৰ্য: $1<br />পৃষ্ঠা: $2',
@@ -489,15 +562,17 @@ $1',
 'cascadeprotected' => 'এই পৃষ্ঠাখন সম্পাদনাৰ পৰা সুৰক্ষিত কাৰণ এই {{PLURAL:$1|পৃষ্ঠা, যিখন|পৃষ্ঠা, যিবোৰ}} "প্ৰপাতাকাৰ" (cascading) বিকল্পৰ সহযোগত সুৰক্ষিত কৰা হৈছে: 
 $2',
 'namespaceprotected' => "আপোনাৰ '''$1''' নামস্থানৰ পৃষ্ঠাসমূহ সম্পাদনা কৰাৰ অধিকাৰ নাই।",
-'customcssprotected' => 'এই পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত চেটিংচ আছে ।',
-'customjsprotected' => 'à¦\8fà¦\87 à¦\9cাভালিপিৰ à¦ªà§\83ষà§\8dঠা à¦¸à¦®à§\8dপাদনা à¦\95ৰাৰ à¦\85ধিà¦\95াৰ à¦\86পà§\8bনাৰ à¦¨à¦¾à¦\87, à¦\95াৰণ à¦\87য়াত à¦\86ন à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à§\8dযà¦\95à§\8dতিà¦\97ত à¦\9aà§\87à¦\9fিà¦\82à¦\9a আছে ।',
+'customcssprotected' => 'এই CSS পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।',
+'customjsprotected' => 'à¦\8fà¦\87 à¦\9cাভালিপিৰ à¦ªà§\83ষà§\8dঠা à¦¸à¦®à§\8dপাদনা à¦\95ৰাৰ à¦\85ধিà¦\95াৰ à¦\86পà§\8bনাৰ à¦¨à¦¾à¦\87, à¦\95াৰণ à¦\87য়াত à¦\86ন à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à§\8dযà¦\95à§\8dতিà¦\97ত à¦ªà¦\9bনà§\8dদসমà§\82হত আছে ।',
 'ns-specialprotected' => 'বিশেষ পৃষ্ঠা সম্পাদিত কৰিব নোৱাৰি।',
-'titleprotected' => "[[User:$1|$1]] à¦¸à¦¦à¦¸à§\8dযà¦\9cনà§\87 à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bণামাৰ লিখনী লিখা ৰোধ কৰিছে ।
+'titleprotected' => "[[User:$1|$1]] à¦¸à¦¦à¦¸à§\8dযà¦\9cনà§\87 à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bনাণমাৰ লিখনী লিখা ৰোধ কৰিছে ।
 ইয়াৰ কাৰণ হৈছে ''$2'' ।",
 'filereadonlyerror' => '"$1" ফাইলটোক পৰিৱৰ্তন কৰিব পৰা নগ\'ল কাৰণ ফাইল ভঁৰাল "$2" কেৱল পঢ়িব পৰা অৱস্থাত আছে।
 যিজন প্ৰশাসকে এইটো বন্ধ কৰিছে তেওঁ দৰ্শোৱা কাৰণ হৈছে: \'\'$3\'\'।',
 'invalidtitle-knownnamespace' => 'নামস্থান "$2" আৰু পাঠ্য "$3" থকা অবৈধ শিৰোনাম',
 'invalidtitle-unknownnamespace' => 'অজ্ঞাত নামস্থান সংখ্যা $1 আৰু পাঠ্য "$2" থকা অবৈধ শিৰোনাম',
+'exception-nologin' => 'প্ৰৱেশ কৰা নাই',
+'exception-nologin-text' => 'এই পৃষ্ঠা অথবা কামৰ বাবে আপুনি প্ৰৱেশ কৰা বাধ্যতামূলক',
 
 # Virus scanner
 'virus-badscanner' => "ভুল কনফিগাৰেচন: অজ্ঞাত ভাইৰাছ স্কেনাৰ: ''$1''",
@@ -509,9 +584,9 @@ $2',
 
 আপুনি বেনামী ভাবেও {{SITENAME}} ব্যৱহাৰ কৰিব পাৰে, অথবা আকৌ সেই একে বা বেলেগ নামেৰে [[Special:UserLogin|প্ৰৱেশ]] কৰিব পাৰে।
 মন কৰিব যে যেতিয়ালৈকে আপোনাৰ ব্ৰাউজাৰৰ অস্থায়ী-স্মৃতি (cache memory) খালী নকৰে, তেতিয়ালৈকে কিছুমান পৃষ্ঠাত আপুনি প্ৰৱেশ কৰা বুলি দেখুৱাই থাকিব পাৰে।",
-'welcomecreation' => '== à¦¸à§\8dবাà¦\97তম, $1! ==
+'welcomecreation' => '== à¦\86দৰিà¦\9bà§\8bà¦\81, $1! ==
 আপোনাৰ সদস্যভুক্তি হৈ গ’ল ।
-[[Special:Preferences|{{SITENAME}}  পচন্দসমূহ]]ত আপোনাৰ পচন্দমতে ব্যক্তিগতকৰণ কৰি লবলৈ নাপাহৰে যেন ।',
+[[Special:Preferences|{{SITENAME}}ৰ পছন্দসমূহ]]ত আপোনাৰ পছন্দমতে ব্যক্তিগতকৰণ কৰি ল’বলৈ নাপাহৰে যেন ।',
 'yourname' => 'সদস্যনাম:',
 'yourpassword' => 'আপোনাৰ গুপ্তশব্দ',
 'yourpasswordagain' => 'গুপ্তশব্দ আকৌ এবাৰ লিখক',
@@ -527,8 +602,8 @@ $2',
 'logout' => 'প্ৰস্থান',
 'userlogout' => 'প্ৰস্থান',
 'notloggedin' => 'প্ৰৱেশ কৰা নাই',
-'nologin' => 'আপোনাৰ একাউণ্ট নাই নেকি? $1',
-'nologinlink' => 'নতà§\81ন à¦¸à¦¦à¦¸à§\8dযভà§\81à¦\95à§\8dতি à¦\95ৰক',
+'nologin' => "ৱিকিপিডিয়াত আপোনাৰ একাউণ্ট নাই নেকি? তেনে '''$1'''।",
+'nologinlink' => 'নতà§\81ন à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦\96à§\8bলক',
 'createaccount' => 'সভ্যভুক্ত হবলৈ',
 'gotaccount' => "আপুনি সদস্য হয়নে? '''$1'''",
 'gotaccountlink' => 'প্ৰৱেশ',
@@ -541,9 +616,9 @@ $2',
 'loginerror' => 'প্ৰৱেশ সমস্যা',
 'createaccounterror' => "একাউন্ট সৃষ্টি কৰা নহ'ল: $1",
 'nocookiesnew' => 'আপোনাৰ সদস্যভুক্তি হৈ গৈছে, কিন্তু আপুনি প্ৰৱেশ কৰা নাই।
-{{SITENAME}} ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।
+{{SITENAME}}ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।
 আপুনি কুকি নিষ্ক্ৰিয় কৰি থৈছে।
-অনুগ্ৰহ কৰি কুকি সক্ৰিয় কৰক, আৰু তাৰ পাছত আপোনাৰ সদস্যনামেৰে প্ৰৱেশ কৰক।',
+অনুগ্ৰহ কৰি কুকি সক্ৰিয় কৰক, আৰু তাৰ পাছত আপোনাৰ সদস্য নামেৰে প্ৰৱেশ কৰক।',
 'nocookieslogin' => '{{SITENAME}} ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।
 আপুনি কুকি নিষ্ক্ৰিয় কৰি থৈছে।
 অনুগ্ৰহ কৰি কুকি সক্ৰিয় কৰক, আৰু তাৰ পাছত চেষ্টা কৰক।',
@@ -551,7 +626,7 @@ $2',
 আপোনাৰ কুকি সক্ৰিয় ৰাখক, এই পৃষ্ঠা ৰি-লোড কৰি পুনৰ চেষ্টা কৰক ।',
 'noname' => 'আপুনি বৈধ সদস্যনাম এটা দিয়া নাই।',
 'loginsuccesstitle' => "প্ৰৱেশ অনুমোদিত হ'ল",
-'loginsuccess' => "''' à¦\86পà§\81নি {{SITENAME}}ত \"\$1\" à¦¨à¦¾à¦®à§\87ৰà§\87 à¦ªà§\8dৰবেশ কৰিলে '''",
+'loginsuccess' => "''' à¦\86পà§\81নি {{SITENAME}}ত \"\$1\" à¦¨à¦¾à¦®à§\87ৰà§\87 à¦ªà§\8dৰৱেশ কৰিলে '''",
 'nosuchuser' => '"$1" নামৰ কোনো সদস্য নাই।
 সদস্য নাম আকাৰ সংবেদনশীল।
 আপোনাৰ বানানতো চাওক, বা  [[Special:UserLogin/signup|নতুন সদস্যভুক্তি কৰক]]।',
@@ -565,18 +640,18 @@ $2',
 'password-name-match' => "আপোনাৰ গুপ্তশব্দ আৰু আপোনাৰ সদস্যনাম বেলেগ হ'ব লাগিব",
 'password-login-forbidden' => 'এই সদস্যনাম আৰু গুপ্তশব্দৰ ব্যৱহাৰ নিষিদ্ধ কৰা হৈছে ।',
 'mailmypassword' => 'ই-মেইলত গুপ্তশব্দ পঠিয়াওক',
-'passwordremindertitle' => '{{SITENAME}} ৰ কাৰণে নতুন অস্থায়ী গুপ্তশব্দ',
+'passwordremindertitle' => '{{SITENAME}}ৰ কাৰণে নতুন অস্থায়ী গুপ্তশব্দ',
 'passwordremindertext' => 'কোনোবাই (হয়তো আপুনি, $1 আই-পি ঠিকনাৰ পৰা)
-{{SITENAME}} ত ব্যৱহাৰ কৰিবলৈ নতুন গুপ্তশব্দ বিছাৰিছে ($4) ।
+{{SITENAME}}ত ব্যৱহাৰ কৰিবলৈ নতুন গুপ্তশব্দৰ বাবে অনুৰোধ কৰিছে ($4) ।
 "$2" সদস্যজনৰ কাৰণে এতিয়া নতুন গুপ্তশব্দ হৈছে "$3" ।
 আপুনি এতিয়া প্ৰৱেশ কৰক আৰু গুপ্তশব্দতো সলনি কৰক।
-à¦\86পà§\8bনাৰ à¦\85সà§\8dথায়à§\80 à¦\97à§\81পà§\8dতশবà§\8dদ {{PLURAL:$5|à¦\8fদিনৰ|$5 à¦¦à¦¿à¦¨à§°}} à¦­à¦¿à¦¤à§°à¦¤ à§°à¦¦ কৰা হ\'ব ।
+à¦\86পà§\8bনাৰ à¦\85সà§\8dথায়à§\80 à¦\97à§\81পà§\8dতশবà§\8dদ {{PLURAL:$5|à¦\8fদিনৰ|$5 à¦¦à¦¿à¦¨à§°}} à¦­à¦¿à¦¤à§°à¦¤ à¦¬à¦¾à¦¤à¦¿à¦² কৰা হ\'ব ।
 
 যদি আপুনি এই অনুৰোধ কৰা নাছিল অথবা যদি আপোনাৰ গুপ্তশব্দতো মনত আছে আৰু তাক সলাব নিবিছাৰে, তেনেহলে আপুনি এই বাৰ্তাতো অৱজ্ঞা কৰিব পাৰে আৰু আপোনাৰ আগৰ গুপ্তশব্দটোকে ব্যৱহাৰ কৰি থাকিব পাৰে।',
 'noemail' => '"$1" সদস্যজনৰ কোনো ই-মেইল ঠিকনা সঞ্চিত কৰা নাই।',
 'noemailcreate' => 'আপুনি এটা সঠিক ই-মেইল ঠিকনা দিব লাগিব',
-'passwordsent' => '"$1" à§° à¦\87-মà§\87à¦\87ল à¦ à¦¿à¦\95নাত à¦¨à¦¤à§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\8fà¦\9fা à¦ªà¦ à§\8bৱা à¦¹à§\88à¦\9bà§\87। à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¸à§\87য়া à¦ªà§\8bৱাৰ à¦ªà¦¾à¦\9bত à¦ªà§\81নৰ à¦ªà§\8dৰবেশ কৰক।',
-'blocked-mailpassword' => 'আপোনাৰ IP ঠিকনাৰ পৰা সম্পাদনা কৰা বাৰণ কৰা হৈছে, এনে অৱস্থাত দুৰ্ব্যৱহাৰ ৰোধ কৰিবলৈ গুপ্তশব্দ পুনঃউদ্ধাৰ কৰা সুবিধাতো বাতিল কৰা হৈছে।',
+'passwordsent' => '"$1" à§° à¦\87-মà§\87à¦\87ল à¦ à¦¿à¦\95নাত à¦¨à¦¤à§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\8fà¦\9fা à¦ªà¦ à§\8bৱা à¦¹à§\88à¦\9bà§\87। à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¸à§\87য়া à¦ªà§\8bৱাৰ à¦ªà¦¾à¦\9bত à¦ªà§\81নৰ à¦ªà§\8dৰৱেশ কৰক।',
+'blocked-mailpassword' => 'আপোনাৰ আইপি ঠিকনাৰ পৰা সম্পাদনা কৰা বাৰণ কৰা হৈছে, এনে অৱস্থাত দুৰ্ব্যৱহাৰ ৰোধ কৰিবলৈ গুপ্তশব্দ পুনঃউদ্ধাৰ কৰা সুবিধাতো বাতিল কৰা হৈছে।',
 'eauthentsent' => 'সঞ্চিত ই-মেইল ঠিকনাত নিশ্চিতকৰণ ই-মেইল এখন পঠোৱা হৈছে।
 আৰু অন্যান্য ই-মেইল পঠোৱাৰ আগতে, আপোনাৰ সদস্যতাৰ নিশ্চিত কৰিবলৈ সেই ই-মেইলত দিয়া নিৰ্দেশনা আপুনি অনু্সৰণ কৰিব লাগিব।',
 'throttled-mailpassword' => 'যোৱা {{PLURAL:$1|এঘণ্টাত|$1 ঘণ্টাত}} গুপ্তশব্দ পুনৰুদ্ধাৰ স্মাৰক পঠিওৱা হৈছে ।
@@ -596,18 +671,18 @@ $2',
 'accountcreated' => "একাউণ্ট সৃষ্টি কৰা হ'ল",
 'accountcreatedtext' => "$1ৰ কাৰণে সদস্য একাউণ্ট সৃষ্টি কৰা হ'ল।",
 'createaccount-title' => '{{SITENAME}}ৰ কাৰণে একাউণ্ট সৃষ্টি কৰক।',
-'createaccount-text' => 'আপোনাৰ ই-মেইল ঠিকনাৰ কাৰণে {{SITENAME}} ($4) ত "$2" নামৰ কোনোবাই, "$3" গুপ্তশব্দ দি সদস্যভুক্তি কৰিছে। অনুগ্ৰহ কৰি আপুনি প্ৰৱেশ কৰক আৰু গুপ্তশব্দটো সলনি কৰক।
+'createaccount-text' => 'আপোনাৰ ই-মেইল ঠিকনাৰ কাৰণে {{SITENAME}} ($4)ত "$2" নামৰ কোনোবাই, "$3" গুপ্তশব্দ দি সদস্যভুক্তি কৰিছে। অনুগ্ৰহ কৰি আপুনি প্ৰৱেশ কৰক আৰু গুপ্তশব্দটো সলনি কৰক।
 
 যদি এইয়া ভুলতে হৈছে, তেনেহলে আপুনি এই বাৰ্তাটো অবজ্ঞা কৰিব পাৰে ।',
-'usernamehasherror' => 'সদসà§\8dযনামত à¦¹à§\87à¦\9aà§\8dâ\80\8c à¦\86à¦\96ৰ থাকিব নোৱাৰে',
+'usernamehasherror' => 'সদসà§\8dযনামত à¦¹à§\87à¦\9aà§\8dâ\80\8c à¦\9aিহà§\8dন থাকিব নোৱাৰে',
 'login-throttled' => 'আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে ।
 অনুগ্ৰহ কৰি কিছু সময় অপেক্ষা কৰি আকৌ প্ৰয়াস কৰক ।',
 'login-abort-generic' => 'আপোনাৰ প্ৰৱেশ অসফল হৈছে- বাতিল কৰা হ’ল',
 'loginlanguagelabel' => 'ভাষা: $1',
-'suspicious-userlogout' => 'à¦\86পà§\8bনাৰ à¦ªà§\8dৰসà§\8dথানৰ à¦\85নà§\81ৰà§\8bধ à¦¬à¦¾à¦¤à¦¿à¦² à¦\95ৰা à¦¹à§\88à¦\9bà§\87 à¦\95াৰণ à¦¹à¦¯à¦¼à¦¤à§\8b à¦\86পà§\8bনাৰ à¦¬à§\8dৰাà¦\89à¦\9cাৰ à¦\85সমà§\8dপà§\82ৰà§\8dণ à¦¨à¦¤à§\81বা à¦ªà§\82বৰà§\8dবতী তথ্য পঠাইছে ।',
+'suspicious-userlogout' => 'à¦\86পà§\8bনাৰ à¦ªà§\8dৰসà§\8dথানৰ à¦\85নà§\81ৰà§\8bধ à¦¬à¦¾à¦¤à¦¿à¦² à¦\95ৰা à¦¹à§\88à¦\9bà§\87 à¦\95াৰণ à¦¹à¦¯à¦¼à¦¤à§\8b à¦\86পà§\8bনাৰ à¦¬à§\8dৰাà¦\89à¦\9cাৰ à¦\85সমà§\8dপà§\82ৰà§\8dণ à¦¨à¦¤à§\81বা à¦ªà§\82ৰà§\8dবৱতী তথ্য পঠাইছে ।',
 
 # E-mail sending
-'php-mail-error-unknown' => 'পি.এইছ.পি মেইল() কাৰ্যত অজ্ঞাত ত্ৰুটি ।',
+'php-mail-error-unknown' => 'পি.এইছ.পি মেইল () কাৰ্যত অজ্ঞাত ত্ৰুটি ।',
 'user-mail-no-addy' => 'ই-মেইল ঠিকনা নোহোৱাকৈয়ে ই-মেইল পঠোৱাৰ চেষ্টা কৰা হৈছে ।',
 
 # Change password dialog
@@ -617,7 +692,7 @@ $2',
 'resetpass_header' => 'গুপ্তশব্দ সলনি কৰক',
 'oldpassword' => 'পুৰণি গুপ্তশব্দ:',
 'newpassword' => 'নতুন গুপ্তশব্দ:',
-'retypenew' => 'নতà§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\86à¦\95à§\8c à¦\9fাà¦\87প à¦\95ৰক',
+'retypenew' => 'নতà§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\86à¦\95à§\8c à¦²à¦¿à¦\96ক',
 'resetpass_submit' => 'গুপ্তশব্দ বহাওক আৰু প্ৰৱেশ কৰক',
 'resetpass_success' => 'আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে, এতিয়া আপুনি প্ৰৱেশ কৰি আছে...',
 'resetpass_forbidden' => 'গুপ্তশব্দ সলনি কৰিব নোৱাৰি',
@@ -639,7 +714,7 @@ $2',
 'passwordreset-capture' => 'ফলাফল ই-মেইলখন চাওক ?',
 'passwordreset-capture-help' => "আপুনি এই ঘৰটো চিহ্নিত কৰিলে এই ই-মেইল (আৰু অস্থায়ী গুপ্তশব্দ) আপুনি দেখা পোৱাৰ লগতে সদস্যজনলৈও পঠোৱা হ'ব।",
 'passwordreset-email' => 'ই-মেইল ঠিকনা:',
-'passwordreset-emailtitle' => '{{SITENAME}} ত একাউণ্টৰ সবিশেষ তথ্য আছে ।',
+'passwordreset-emailtitle' => '{{SITENAME}}ত একাউণ্টৰ সবিশেষ তথ্য আছে ।',
 'passwordreset-emailtext-ip' => 'কোনোবাই (IP ঠিকনা $1 ৰ পৰা সম্ভৱত: আপুনিয়েই) {{SITENAME}} ($4) ৰ বাবে আপোনাৰ একাউণ্টৰ সবিশেষ তথ্য বিচাৰিছিল । ই-পত্ৰ ঠিকনাটোৰ লগত এই সদস্যৰ {{PLURAL:$3|একাউণ্ট|একাউণ্টবোৰ}} জড়িত হৈ আছে ।
 
 $2
@@ -660,7 +735,7 @@ $2
 'changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
 'changeemail-header' => 'একাউণ্টৰ ই-মেইল ঠিকনা সলনি কৰক',
 'changeemail-text' => 'আপোনাৰ ই-মেইল ঠিকনা সলাবলৈ এই প্ৰপত্ৰখন পূৰাওক । এই সালসলনি নিশ্চিত কৰিবলৈ আপোনাৰ গুপ্তশব্দ দিব লাগিব ।',
-'changeemail-no-info' => 'এই পৃষ্ঠা প্ৰত্যক্ষ্ ভাৱে ঢুকি পাবলৈ আপুনি প্ৰৱেশ কৰিব লাগিব ।',
+'changeemail-no-info' => 'এই পৃষ্ঠা প্ৰত্যক্ষ্ ভাৱে ঢুকি পাবলৈ আপুনি প্ৰৱেশ কৰিব লাগিব ।',
 'changeemail-oldemail' => 'বৰ্তমানৰ ই-মেইল ঠিকনা:',
 'changeemail-newemail' => 'নতুন ই-মেইল ঠিকনা:',
 'changeemail-none' => '(নাই)',
@@ -673,9 +748,9 @@ $2
 'italic_sample' => 'হেলনীয়া পাঠ্য',
 'italic_tip' => 'বেঁকা পাঠ্য',
 'link_sample' => 'শিৰোনামা সংযোগ',
-'link_tip' => 'ভিতৰà§\81ৱা সংযোগ',
+'link_tip' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ সংযোগ',
 'extlink_sample' => 'http://www.example.com শীৰ্ষক সংযোগ',
-'extlink_tip' => 'বহিà¦\83সংযোগ (http:// উপসৰ্গ মনত ৰাখিব)',
+'extlink_tip' => 'বাহà§\8dযিà¦\95 সংযোগ (http:// উপসৰ্গ মনত ৰাখিব)',
 'headline_sample' => 'শিৰোনামা পাঠ্য',
 'headline_tip' => 'দ্বিতীয় স্তৰৰ শিৰোনামা',
 'nowiki_sample' => 'নসজোৱা পাঠ্য ইয়াত অন্তৰ্ভুক্ত কৰক',
@@ -719,7 +794,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 আপুনি যেতিয়ালৈ [[Special:Preferences|সদস্য পছন্দ]] পৃষ্ঠাত আপোনাৰ ই-মেইল ঠিকনা নিদিয়ে তেতিয়ালৈ ’সদস্যক ই-মেইল পঠাওক’ সুবিধাতো ব্যৱহাৰ কৰিব নোৱাৰিব, আৰু আপোনাক এয়া কৰিবলৈ ৰোধ কৰা হোৱা নাই ।
 আপোনাৰ এতিয়াৰ আই-পি ঠিকনা হল $3, আৰু আপোনাৰ অবৰোধ ক্ৰমিক হৈছে #$5 ।
 এই বিষয়ে হোৱা আলোচনাত ইয়াৰ সবিশেষ সদৰী কৰে যেন।",
-'autoblockedtext' => "আপোনাৰ আই-পি ঠিকনা নিজে নিজে অৱৰোধিত হৈছে, কাৰণ ইয়াক কোনোবাই ব্যৱহাৰ কৰি থাকোতে $1 ৰ দ্বাৰা অৱৰোধ কৰা হৈছে।
+'autoblockedtext' => "আপোনাৰ আই-পি ঠিকনা নিজে নিজে অৱৰোধিত হৈছে, কাৰণ ইয়াক কোনোবাই ব্যৱহাৰ কৰি থাকোতে $1ৰ দ্বাৰা অৱৰোধ কৰা হৈছে।
 ইয়াৰ বাবে দিয়া কাৰণ হৈছে:
 
 :''$2''
@@ -728,11 +803,11 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 * অৱৰোধ সমাপ্তি: $6
 * অৱৰোধ কৰা হৈছে: $7
 
-à¦\86পà§\81নি à¦\8fà¦\87 à¦\85বৰà§\8bধৰ à¦¬à¦¿à¦·à¦¯à¦¼à§\87 à¦\86লà§\8bà¦\9aনা à¦\95ৰিবলà§\88 $1 à¦¬à¦¾ [[{{MediaWiki:Grouppage-sysop}}|পà§\8dৰবনà§\8dধক]]ৰ লগত সম্পৰ্ক স্থাপন কৰিব পাৰে ।
+à¦\86পà§\81নি à¦\8fà¦\87 à¦\85বৰà§\8bধৰ à¦¬à¦¿à¦·à¦¯à¦¼à§\87 à¦\86লà§\8bà¦\9aনা à¦\95ৰিবলà§\88 $1 à¦¬à¦¾ [[{{MediaWiki:Grouppage-sysop}}|পà§\8dৰশাসক]]ৰ লগত সম্পৰ্ক স্থাপন কৰিব পাৰে ।
 
 আপুনি যেতিয়ালৈ [[Special:Preferences|সদস্য পছন্দ]] পৃষ্ঠাত আপোনাৰ ই-মেইল ঠিকনা নিদিয়ে তেতিয়ালৈ ’সদস্যক ই-মেইল পঠাওক’ সুবিধাতো ব্যৱহাৰ কৰিব নোৱাৰে। আপোনাক এয়া কৰিবলৈ ৰোধ কৰা হোৱা নাই ।
-à¦\85পà§\8bনাৰ à¦\8fতিয়াৰ IP à¦ à¦¿à¦\95না à¦¹à§\88à¦\9bà§\87 $3, à¦\85ৰà§\81 à¦\86পà§\8bনাৰ à¦\85বৰোধ ক্ৰমিক হৈছে $5 ।
-এই বিষয়ে হোৱা আলোচনাত ইয়াক ব্যৱহাৰ কৰিবলৈ অনুৰোধ কৰা হল।",
+à¦\86পà§\8bনাৰ à¦\8fতিয়াৰ à¦\86à¦\87 à¦ªà¦¿ à¦ à¦¿à¦\95না à¦¹à§\88à¦\9bà§\87 $3, à¦\86ৰà§\81 à¦\86পà§\8bনাৰ à¦\85ৱৰোধ ক্ৰমিক হৈছে $5 ।
+এই বিষয়ে হোৱা আলোচনাত ইয়াক ব্যৱহাৰ কৰিবলৈ অনুৰোধ কৰা হল।",
 'blockednoreason' => 'কাৰণ দিয়া নাই',
 'whitelistedittext' => 'সম্পাদনা কৰিবলৈ $1 কৰক ।',
 'confirmedittext' => 'সম্পাদনা কৰাৰ আগতে আপুনি আপোনাৰ ই-মেইল ঠিকনাটো প্ৰমানিত কৰিব লাগিব।
@@ -743,8 +818,8 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'loginreqlink' => 'প্ৰৱেশ',
 'loginreqpagetext' => 'অন্যান্য পৃষ্ঠা চাবলৈ আপুনি $1 কৰিব লাগিব।',
 'accmailtitle' => "গুপ্তশব্দ পঠোৱা হ'ল।",
-'accmailtext' => "[[User talk:$1|$1]]-ৰ কাৰণে যাদৃচ্ছিক ভাৱে উৎপন্ন কৰা গুপ্তশব্দ $2-লৈ পঠোৱা হ'ল । 
-এই নতুন একাউন্টত প্ৰৱেশ কৰি ''[[Special:ChangePassword|change password]]'' পৃষ্ঠাখনত গুপ্তশব্দতো সলনি কৰি ল’ব পাৰিব ।",
+'accmailtext' => "[[User talk:$1|$1]]-ৰ কাৰণে যাদৃচ্ছিক ভাৱে উৎপন্ন কৰা গুপ্তশব্দ $2লৈ পঠোৱা হ'ল । 
+এই নতুন একাউন্টত প্ৰৱেশ কৰি ''[[Special:ChangePassword|গুপ্তশব্দ সলনি কৰক]]'' পৃষ্ঠাখনত গুপ্তশব্দতো সলনি কৰি ল’ব পাৰিব ।",
 'newarticle' => '(নতুন)',
 'newarticletext' => "আপুনি বিচৰা প্ৰবন্ধটো বিচাৰি পোৱা নগ'ল।
 
@@ -773,7 +848,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 * '''Google Chrome:''' ''Ctrl-Shift-R'' টিপক (এপল মেকৰ বাবে ''⌘-Shift-R'' )
 * '''Internet Explorer:''' ''Ctrl'' ধৰি ৰাখি ''Refresh'' ক্লিক কৰক, অথবা ''Ctrl-F5'' টিপক
 * '''Konqueror: ''' ''Reload'' ক্লিক কৰক বা ''F5'' টিপক
-* '''Opera:''' ''Tools→Preferences'' ত গৈ Cache মচি পেলাওক",
+* '''Opera:''' ''Tools→Preferences'' ত গৈ কেচ্‌ মচি পেলাওক",
 'usercssyoucanpreview' => "'''পৰামৰ্শ:''' \"{{int:showpreview}}\" বুটাম ব্যৱহাৰ কৰি সাঁচি ৰখাৰ আগতে আপোনাৰ নতুন CSS পৰীক্ষা কৰক ।",
 'userjsyoucanpreview' => "'''পৰামৰ্শ:''' \"{{int:showpreview}}\" বুটাম ব্যৱহাৰ কৰি সাঁচি ৰখাৰ আগতে আপোনাৰ নতুন জাভালিপি পৰীক্ষা কৰক ।",
 'usercsspreview' => "'''মনত ৰাখিব আপুনি কেৱল আপোনাৰ ব্যৱহাৰকাৰী CSS  প্ৰাকদৰ্শন কৰিছে ।''' 
@@ -796,7 +871,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 তথাপি যদি নহয় [[Special:UserLogout|প্ৰস্থান]] কৰি আকৌ প্ৰৱেশ কৰক ।",
 'session_fail_preview_html' => "'''দুঃখিত! চেচন ডাটা হেৰাই যোৱাৰ কাৰণে আপোনাৰ সম্পাদনা কৃতকাৰ্য্য নহ'ল ।'''
 
-''যিহেতু {{SITENAME}}-ত নগ্ন এইচ-টি-এম-এল (raw HTML) সক্ৰিয় কৰা আছে, জাভাস্ক্ৰিপ্ট (Javasccript) আক্ৰমণৰ বিৰুদ্ধে সতৰ্কতাৰ খাতিৰত খচৰা আঁৰ কৰা হৈছে ।''
+''যিহেতু {{SITENAME}}ত নগ্ন এইচ-টি-এম-এল (raw HTML) সক্ৰিয় কৰা আছে, জাভাস্ক্ৰিপ্ট আক্ৰমণৰ বিৰুদ্ধে সতৰ্কতাৰ স্বাৰ্থত খচৰা আঁৰ কৰা হৈছে ।''
 
 '''এইয়া যদি এটা বৈধ সম্পাদনা আছিল, তেনে আকৌ চেষ্টা কৰক ।'''
 তথাপি যদি নহয় [[Special:UserLogout|প্ৰস্থান]] কৰি আকৌ প্ৰৱেশ কৰক ।",
@@ -806,8 +881,8 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'edit_form_incomplete' => "'''এই সম্পাদনাৰ কিছু অংশ চাৰ্ভাৰলৈ নগ’ল; আপোনাৰ সম্পাদনা ঠিকে আছেনে পৰীক্ষা কৰি পুনৰ চেষ্টা কৰক ।'''",
 'editing' => '$1 সম্পাদনা',
 'creating' => '$1 পৃষ্ঠাখন আপুনি সৃষ্টি কৰি আছে',
-'editingsection' => '$1 (বিভাà¦\97) à¦¸à¦®à§\8dপাদনা à¦\95ৰি à¦¥à¦\95া à¦¹à§\88ছে',
-'editingcomment' => '$1 (নতà§\81ন à¦¬à¦¿à¦­à¦¾à¦\97) à¦¸à¦®à§\8dপাদনা à¦\95ৰি à¦¥à¦\95া à¦¹à§\88ছে',
+'editingsection' => '$1 (à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দ) à¦¸à¦®à§\8dপাদনা à¦\95ৰি à¦\86ছে',
+'editingcomment' => '$1 (নতà§\81ন à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দ) à¦¸à¦®à§\8dপাদনা à¦\95ৰি à¦\86ছে',
 'editconflict' => 'সম্পাদনা দ্বন্দ: $1',
 'explainconflict' => "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পাছত আন কোনোবাই এই পৃষ্ঠাখন সলনি কৰিলে।
 পাঠ্য-স্থানৰ উপৰ ভাগত এই পৃষ্ঠাৰ প্ৰচলিত পাঠ্য দিয়া হৈছে।
@@ -851,8 +926,8 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'template-semiprotected' => '(অৰ্ধ-সুৰক্ষিত)',
 'hiddencategories' => 'এই পৃষ্ঠা {{PLURAL:$1|১-টা নিহিত শ্ৰেণীৰ|$1-টা নিহিত শ্ৰেণীৰ}} সদস্য:',
 'nocreatetitle' => 'পৃষ্ঠা সৃষ্টি সীমিত',
-'nocreatetext' => '{{SITENAME}} ত নতুন পৃষ্ঠা সৃষ্টিৰ ক্ষমতা সীমাবদ্ধ কৰা হৈছে।
-আপুনি ঘূৰি গৈ বৰ্তমানে থকা পৃষ্ঠা এটা সম্পাদনা কৰিব পাৰে, বা [[Special:UserLogin| নতুন সদস্যভৰ্তি হওক/ প্ৰবেশ কৰক]] ।',
+'nocreatetext' => '{{SITENAME}}ত নতুন পৃষ্ঠা সৃষ্টিৰ ক্ষমতা সীমাবদ্ধ কৰা হৈছে।
+আপুনি ঘূৰি গৈ বৰ্তমানে থকা পৃষ্ঠা এটা সম্পাদনা কৰিব পাৰে, বা [[Special:UserLogin|নতুন সদস্যভৰ্তি হওক/ প্ৰবেশ কৰক]] ।',
 'nocreate-loggedin' => 'নতুন পৃষ্ঠা সৃষ্টি কৰিবলৈ আপোনাৰ অনুমতি নাই ।',
 'sectioneditnotsupported-title' => 'অনুচ্ছেদ সম্পাদনাৰ সমৰ্থন নাই',
 'sectioneditnotsupported-text' => 'এই পৃষ্ঠাত অনুচ্ছেদ সম্পাদনাৰ সমৰ্থন নাই',
@@ -864,7 +939,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 এই পৃষ্ঠাটো সম্পাদনা কৰা উচিত হব নে নহয় আপুনি বিবেচনা কৰি চাওক।
 এই পৃষ্ঠাটো বিলোপ আৰু স্থানান্তৰ কৰাৰ অভিলেখ আপোনাৰ সুবিধাৰ্থে ইয়াত দিয়া হৈছে।",
 'moveddeleted-notice' => "এই পৃষ্ঠা বাতিল কৰা হৈছে ।
-পà§\83ষà§\8dঠাà¦\9fিৰ à¦¬à¦¾à¦¤à¦¿à¦² à¦\86ৰà§\81 à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦²'à¦\97 তলত দিয়া হ'ল ।",
+পà§\83ষà§\8dঠাà¦\9fিৰ à¦¬à¦¾à¦¤à¦¿à¦² à¦\86ৰà§\81 à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦\85ভিলà§\87à¦\96 তলত দিয়া হ'ল ।",
 'log-fulllog' => 'সম্পূৰ্ণ অভিলেখ চাওক',
 'edit-hook-aborted' => 'হুকৰ দ্বাৰা সম্পাদনা প্ৰত্যাখ্যান কৰা হৈছে ।
 ইয়াৰ কোনো ব্যাখ্যা নাই ।',
@@ -906,30 +981,30 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 
 # Account creation failure
 'cantcreateaccounttitle' => "একাউন্ট সৃষ্টি কৰা নহ'ব",
-'cantcreateaccount-text' => "IP ঠিকনা ('''$1''') ৰ পৰা একাউণ্ট সৃষ্টিত [[User:$3|$3]] এ বাধা প্ৰদান কৰিছে ।
+'cantcreateaccount-text' => "আই পি ঠিকনা ('''$1''')ৰ পৰা একাউণ্ট সৃষ্টিত [[User:$3|$3]]’য়ে বাধা প্ৰদান কৰিছে ।
 
-$3 à¦\8f à¦\86à¦\97বঢ়à§\8bৱা à¦\87য়াৰ à¦\95াৰণ à¦¹â\80\99ল ''$2''",
+$3 à¦¯à¦¼à§\87 à¦\86à¦\97বঢ়à§\8bৱা à¦\87য়াৰ à¦\95াৰণ à¦¹à§\88à¦\9bà§\87 ''$2''",
 
 # History pages
 'viewpagelogs' => 'এই পৃষ্ঠাৰ অভিলেখ চাওক ।',
 'nohistory' => 'এই পৃষ্ঠাৰ কোনো সম্পাদনাৰ ইতিহাস নাই।',
-'currentrev' => 'শà§\87হতà§\80য়া à¦­à¦¾à¦·à§\8dয',
+'currentrev' => 'শà§\87হতà§\80য়া à¦¸à¦\82সà§\8dà¦\95ৰণ',
 'currentrev-asof' => '$1 অনুযায়ী বৰ্তমান সংস্কৰণ',
-'revisionasof' => '$1 ৰ সংস্কৰণ',
-'revision-info' => '$1-লৈ $2-এ কৰা সংশোধন',
+'revisionasof' => '$1ৰ সংস্কৰণ',
+'revision-info' => '$1-লৈ $2 কৰা সংশোধন',
 'previousrevision' => '← আগৰ সংশোধন',
 'nextrevision' => 'সদ্যসংশোধিত',
 'currentrevisionlink' => 'শেহতীয়া ভাষ্য',
 'cur' => 'বৰ্তমান',
 'next' => 'পৰৱৰ্তী',
-'last' => 'পà§\82ৰà§\8dববৰ্তী',
+'last' => 'পà§\82ৰà§\8dবৱৰ্তী',
 'page_first' => 'প্ৰথম',
 'page_last' => 'অন্তিম',
 'histlegend' => "পাৰ্থক্য বাছনি: পাৰ্থক্য চাবলৈ সংকলনবোৰৰ সম্মুখত থকা ৰেডিঅ' বুটামবোৰ বাচনী কৰি এণ্টাৰ টিপক অথবা একেবাৰে তলত দিয়া বুটামতো ক্লিক কৰক <br />
 লিজেণ্ড: '''({{int:cur}})''' = বৰ্তমানৰ সংকলনৰ লগত পাৰ্থক্য,
 '''({{int:last}})''' = আগৰ সংকলনৰ লগত পাৰ্থক্য, '''{{int:minoreditletter}}'' = অগুৰুত্বপূৰ্ণ সম্পাদনা।",
 'history-fieldset-title' => 'ইতিহাসত অনুসন্ধান কৰক',
-'history-show-deleted' => 'মাথà§\8bà¦\81 à¦®à¦\9aি à¦ªà§\87লà§\8bৱা',
+'history-show-deleted' => 'মাথà§\8bà¦\81 à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা',
 'histfirst' => 'আটাইতকৈ পুৰণি',
 'histlast' => 'শেহতীয়া',
 'historysize' => '({{PLURAL:$1|১ বাইট|$1 বাইট}})',
@@ -946,42 +1021,42 @@ $3 এ আগবঢ়োৱা ইয়াৰ কাৰণ হ’ল ''$2''",
 # Revision deletion
 'rev-deleted-comment' => "(সম্পাদনা সাৰাংশ আঁতৰোৱা হ'ল)",
 'rev-deleted-user' => '(সদস্যনাম আঁতৰোৱা হ’ল)',
-'rev-deleted-event' => "(ল'à¦\97 à¦\95াৰà§\8dয্য আঁতৰোৱা হ'ল)",
+'rev-deleted-event' => "(à¦\85ভিলà§\87à¦\96 à¦\95াৰ্য আঁতৰোৱা হ'ল)",
 'rev-deleted-user-contribs' => "[সদস্যনাম বা আই-পি ঠিকনা আঁতৰোৱা হ'ল - সম্পাদনা বৰঙনিসমূহৰ পৰা আঁৰ কৰা হৈছে]",
 'rev-deleted-text-permission' => "পৃষ্ঠাৰ এই সংশোধনটি '''বিলোপ''' কৰা হ'ল ।
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85বলà§\81পà§\8dতি à¦²'à¦\97ত]",
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85বলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]",
 'rev-deleted-text-unhide' => "পৃষ্ঠাখনৰ এই সংশোধনটো '''বিলোপ''' কৰা হৈছে | 
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦²â\80\99à¦\97]ত
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]
 আপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
 'rev-suppressed-text-unhide' => "পৃষ্ঠাখনৰ এই সংশোধনটো '''নিবাৰণ''' কৰা হৈছে ।
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97ত]।
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦\85ভিলà§\87à¦\96ত]।
 আপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
 'rev-deleted-text-view' => "পৃষ্ঠাৰ এই সংশোধনটো '''বিলোপ''' কৰা হ'ল ।
-à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85বলà§\81পà§\8dতি à¦²â\80\99à¦\97ত]।",
+à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85বলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]।",
 'rev-suppressed-text-view' => "পৃষ্ঠাৰ এই সংশোধনটো '''নিবাৰণ''' কৰা হ’ল।
-à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97ত]।",
+à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦\85ভিলà§\87à¦\96ত]।",
 'rev-deleted-no-diff' => "আপুনি এই পাৰ্থক্য চাব নোৱাৰে কাৰণ এটা সংস্কৰণ '''বিলোপ''' কৰা হৈছে ।
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦²'à¦\97] à¦¤ ।",
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]।",
 'rev-suppressed-no-diff' => "আপুনি এই পাৰ্থক্য চাব নোৱাৰে কাৰণ এটা সংস্কৰণ '''বিলোপ''' কৰা হৈছে ।",
 'rev-deleted-unhide-diff' => "এই পাৰ্থক্যৰ এটা সংস্কৰণ '''বিলোপ''' কৰা হৈছে ।
-বিসà§\8dতাৰিত à¦\95াৰণ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦²â\80\99à¦\97] à¦¤ পাব ।
+বিসà§\8dতাৰিত à¦\95াৰণ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত] পাব ।
 আপুনি মন কৰিলে [$1 এই পাৰ্থক্য চাওক] ।",
 'rev-suppressed-unhide-diff' => "এই পাৰ্থক্যৰ এটা সংশোধন '''নিবাৰণ''' কৰা হৈছে ।
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97ত] ।
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦\85ভিলà§\87à¦\96ত] ।
 আপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে] ।",
 'rev-deleted-diff-view' => "এই পাৰ্থক্যৰ এটা সংশোধন '''বিলোপ''' কৰা হ'ল ।
-à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà¦¾à§°à§\8dথà¦\95à§\8dয à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦²â\80\99à¦\97ত]",
+à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà¦¾à§°à§\8dথà¦\95à§\8dয à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]",
 'rev-suppressed-diff-view' => "এই পাৰ্থক্যৰ এটা সংশোধন '''নিবাৰণ''' কৰা হ’ল ।
-à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà¦¾à§°à§\8dথà¦\95à§\8dয à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97ত] ।",
+à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà¦¾à§°à§\8dথà¦\95à§\8dয à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦\85ভিলà§\87à¦\96ত] ।",
 'rev-delundel' => 'দেখুৱাওক/নেদেখুৱাব',
 'rev-showdeleted' => 'দেখুৱাওক',
-'revisiondelete' => 'সংকলন বিলোপন কৰক / পুণৰ্স্থাপিত কৰক',
+'revisiondelete' => 'সংকলন বিলোপ কৰক / পুণৰ স্থাপন কৰক',
 'revdelete-nooldid-title' => 'লক্ষ্য সংশোধন যুক্তিসংগত নহয়',
 'revdelete-nooldid-text' => 'কামটো কৰাৰ বাবে আপুনি লক্ষ্য সংশোধন নিৰ্বাচন কৰা নাই, নিৰ্বাচিত সংশোধন নাই, অথবা আপুনি বৰ্তমানৰ সংশোধন লুকুৱাব বিচাৰিছে ।',
-'revdelete-nologtype-title' => 'à¦\95à§\8bনà§\8b à¦²â\80\99à¦\97 প্ৰকাৰ দিয়া হোৱা নাই',
-'revdelete-nologtype-text' => 'à¦\8fà¦\87 à¦\95ামà¦\9fà§\8b à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\86পà§\81নি à¦\95à§\8bনà§\8b à¦²â\80\99à¦\97 প্ৰকাৰ নিৰ্বাচন কৰা নাই ।',
-'revdelete-nologid-title' => 'à¦\85যà§\81à¦\95à§\8dতিসà¦\82à¦\97ত à¦²â\80\99à¦\97 ভৰ্তি',
-'revdelete-nologid-text' => 'à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\95à§\8bনà§\8b à¦²â\80\99à¦\97 à¦­à§°à§\8dতি à¦¨à¦¿à§°à§\8dবাà¦\9aন à¦\95ৰা à¦¨à¦¾à¦\87 à¦\85থবা à¦¨à¦¿à§°à§\8dবাà¦\9aিত à¦²â\80\99à¦\97 ভৰ্তিটো নাই ।',
+'revdelete-nologtype-title' => 'à¦\95à§\8bনà§\8b à¦\85ভিলà§\87à¦\96 প্ৰকাৰ দিয়া হোৱা নাই',
+'revdelete-nologtype-text' => 'à¦\8fà¦\87 à¦\95ামà¦\9fà§\8b à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\86পà§\81নি à¦\95à§\8bনà§\8b à¦\85ভিলà§\87à¦\96  প্ৰকাৰ নিৰ্বাচন কৰা নাই ।',
+'revdelete-nologid-title' => 'à¦\85যà§\81à¦\95à§\8dতিসà¦\82à¦\97ত à¦\85ভিলà§\87à¦\96 ভৰ্তি',
+'revdelete-nologid-text' => 'à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\95à§\8bনà§\8b à¦\85ভিলà§\87à¦\96 à¦­à§°à§\8dতি à¦¨à¦¿à§°à§\8dবাà¦\9aন à¦\95ৰা à¦¨à¦¾à¦\87 à¦\85থবা à¦¨à¦¿à§°à§\8dবাà¦\9aিত à¦\85ভিলà§\87à¦\96 ভৰ্তিটো নাই ।',
 'revdelete-no-file' => 'নিৰ্ধাৰিত ফাইলটি নাই ।',
 'revdelete-show-file-confirm' => 'আপুনি "<nowiki>$1</nowiki>"  ফাইলৰ বিলোপ কৰা কৰা সংশোধন $2 তাৰিখৰ পৰা $3 সময়ত চাব বিচাৰিছে নেকি?',
 'revdelete-show-file-submit' => 'হয়',
@@ -1077,7 +1152,7 @@ $1",
 
 # Diffs
 'history-title' => '"$1" ৰ সংশোধনৰ ইতিহাস',
-'difference-title' => '"$1"ৰ à¦¬à¦¿à¦­à¦¿à¦¨à§\8dন à¦¸à¦\82ধà§\8bধনৰ à¦®à¦¾à¦\9cৰ à¦ªà¦¾à§°à§\8dথà¦\95à§\8dযসমà§\82হ',
+'difference-title' => '"$1"ৰ à¦¬à¦¿à¦­à¦¿à¦¨à§\8dন à¦¸à¦\82শà§\8bধনসমà§\82হৰ à¦®à¦¾à¦\9cৰ à¦ªà¦¾à§°à§\8dথà¦\95à§\8dয',
 'difference-title-multipage' => '"$1" আৰু "$2" পৃষ্ঠাৰ মাজৰ পাৰ্থক্যসমূহ',
 'difference-multipage' => '(পৃষ্ঠাসমূহৰ মাজত তফাৎ)',
 'lineno' => '$1 নং শাৰীঃ',
@@ -1355,6 +1430,7 @@ $1",
 'right-writeapi' => 'ৰাইট এ.পি.আই.ৰ ব্যৱহাৰ',
 'right-delete' => 'পৃষ্ঠাসমূহ বিলোপ কৰক',
 'right-bigdelete' => 'অতিৰিক্ত ইতিহাস থকা পৃষ্ঠাসমূহ বিলোপ কৰক',
+'right-deletelogentry' => "নিৰ্দিষ্ট ল'গ ভুক্তি বিলোপ কৰক বা ঘূৰাই অনক।",
 'right-deleterevision' => 'পৃষ্ঠাসমূহৰ নিৰ্দিষ্ট সংশোধনী বিলোপ আৰু পুনৰুদ্ধাৰ কৰক',
 'right-deletedhistory' => 'বিলোপ কৰা ইতিহাসৰ ভৰ্তি সংশ্লিষ্ট লেখা অবিহনে চাওক',
 'right-deletedtext' => 'বিলোপ কৰা লেখা আৰু বিলোপ কৰা সংশোধনসমূহৰ মাজত হোৱা সালসলনি চাওক',
@@ -1492,16 +1568,15 @@ $1",
 'upload_directory_missing' => 'আপলোড ডিৰেক্টৰি ($1)  বিচাৰি পোৱা নগ’ল আৰু ৱেবচাৰ্ভাৰৰ দ্বাৰা তৈয়াৰ কৰিব পৰা নগ’ল ।',
 'upload_directory_read_only' => 'আপল’ড ডিৰেক্টৰি ($1) ৱেবচাৰ্ভাৰৰ দ্বাৰা লিখনযোগ্য নহয় ।',
 'uploaderror' => 'আপল’ডত সমস্যা হৈছে',
-'upload-recreate-warning' => "'''সতৰà§\8dà¦\95বাণà§\80: à¦\8fà¦\87 à¦¨à¦¾à¦®à§° à¦\8fà¦\9fা à¦«à¦¾à¦\87ল à¦¬à¦¿à¦²à§\8bপ à¦¬à¦¾ à¦¸à§\8dথানানà§\8dতত কৰা হৈছে । '''
+'upload-recreate-warning' => "'''সতৰà§\8dà¦\95বাণà§\80: à¦\8fà¦\87 à¦¨à¦¾à¦®à§° à¦\8fà¦\9fা à¦«à¦¾à¦\87ল à¦¬à¦¿à¦²à§\8bপ à¦¬à¦¾ à¦¸à§\8dথানানà§\8dতৰ কৰা হৈছে । '''
 
 এই পৃষ্ঠাৰ অৱলুপ্তি ল’গ আৰু স্থানান্তৰ ল’গ আপোনাৰ সুবিধাৰ্থে তলত দিয়া হ’ল:",
-'uploadtext' => "ফাইল আপল’ড কৰাৰ বাবে তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰক ।
-পূৰ্বে আপল’ড কৰা ফাইল চাবলৈ বা অনুসন্ধান কৰিবলৈ [[Special:FileList|আপল’ড কৰা ফাইলৰ তালিকা]] লৈ যাওক । (পুনঃ)আপল’ড কৰা ফাইলৰ নাম [[Special:Log/upload|আপল’ড ল’গ]] ত ভৰ্তি হয়, বিলোপ কৰা ফাইলৰ নাম [[Special:Log/delete|অৱলুপ্তি ল’গ]] ত পাব ।
+'uploadtext' => "ফাইল আপল’ড কৰাৰ বাবে তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰক। পূৰ্বে আপল’ড কৰা ফাইল চাবলৈ বা অনুসন্ধান কৰিবলৈ [[Special:FileList|আপল’ড কৰা ফাইলৰ তালিকা]] লৈ যাওক । (পুনঃ) আপল’ড কৰা ফাইলৰ নাম [[Special:Log/upload|আপল’ড অভিলেখত]] ভৰ্তি হয়, বিলোপ কৰা ফাইলৰ নাম [[Special:Log/delete|অৱলুপ্তি অভিলেখত]] পাব ।
 
-à¦\95à§\8bনà§\8b à¦ªà§\83ষà§\8dঠাত à¦\9bবি à¦¯à§\8bà¦\97 à¦¦à¦¿à¦¬à¦²à§\88 তলৰ প্ৰপত্ৰসমূহত থকা সংযোগ ব্যৱহাৰ কৰক: 
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''',
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' অথবা
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''",
+à¦\95à§\8bনà§\8b à¦ªà§\83ষà§\8dঠাত à¦\9aিতà§\8dৰ à¦¬à¦¾ à¦«à¦¾à¦\87ল à¦¸à¦¨à§\8dনিবিষà§\8dà¦\9f à¦\95ৰিবৰ à¦¬à¦¾à¦¬à§\87 তলৰ প্ৰপত্ৰসমূহত থকা সংযোগ ব্যৱহাৰ কৰক: 
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''',
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' অথবা
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
 'upload-permitted' => 'অনুমোদিত ফাইল ধৰণ: $1',
 'upload-preferred' => 'বাঞ্ছিত ফাইল ধৰণ: $1',
 'upload-prohibited' => 'বঞ্চিত ফাইল ধৰণ: $1',
@@ -1549,21 +1624,21 @@ $1",
 ফাইলৰ নাম টাইপিঙত ভুলৰ বাবে এনে হ’ব পাৰে ।
 আপুনি সঁচাকৈ এই ফাইল আপল'ড কৰিব বিচাৰিছেনে পৰীক্ষা কৰক ।",
 'windows-nonascii-filename' => 'বিশেষ চিহ্ন থকা ফাইলৰ নাম এই ৱিকিয়ে সমৰ্থন নকৰে ।',
-'fileexists' => "এই নামৰ এটা ফাইল ইতিমধ্যেই আছে । আপুনি ইয়াক সলাব বিচৰাটো নিশ্চিত নহ’লে অনুগ্ৰহ কৰি '''<tt>[[:$1]]</tt>''' পৰীক্ষা কৰি চাওক ।
-[[$1|thumb]]",
-'filepageexists' => "এই ফাইলৰ বিৱৰণী পৃষ্ঠা '''<tt>[[:$1]]</tt>''' ত ইতিমধ্যেই তৈয়াৰ কৰা হৈছে, কিন্তু সদ্যহতে এই নামৰ কোনো ফাইল নাই ।
+'fileexists' => 'এই নামৰ এটা ফাইল ইতিমধ্যেই আছে । আপুনি ইয়াক সলাব বিচৰাটো নিশ্চিত নহ’লে অনুগ্ৰহ কৰি <strong>[[:$1]]</strong> পৰীক্ষা কৰি চাওক ।
+[[$1|thumb]]',
+'filepageexists' => 'এই ফাইলৰ বিৱৰণী পৃষ্ঠা <strong>[[:$1]]</strong> ত ইতিমধ্যেই তৈয়াৰ কৰা হৈছে, কিন্তু সদ্যহতে এই নামৰ কোনো ফাইল নাই ।
 আপুনি দাখিল কৰা সাৰাংশ বিৱৰণী পৃষ্ঠাত দেখা নাযাব ।
 আপোনাৰ সাৰাংশ তাত দেখা পোৱা যাবলৈ ইয়াক আপুনি হাতেৰে সম্পাদনা কৰিব লাগিব ।
-[[$1|thumb]]",
-'fileexists-extension' => "একে নামৰ ফাইল ইতিমধ্যে আছে: [[$2|thumb]] 
-* আপলোড কৰা ফাইলৰ নাম: '''<tt>[[:$1]]</tt>''' 
-* বৰ্তমানে থকা ফাইলৰ নাম: '''<tt>[[:$2]]</tt>''' 
-অনুগ্ৰহ কৰি আন এটা নাম বাছি লওক ।",
+[[$1|thumb]]',
+'fileexists-extension' => 'একে নামৰ ফাইল ইতিমধ্যে আছে: [[$2|thumb]] 
+* আপলোড কৰা ফাইলৰ নাম: <strong>[[:$1]]</strong> 
+* বৰ্তমানে থকা ফাইলৰ নাম: <strong>[[:$2]]</strong> 
+অনুগ্ৰহ কৰি আন এটা নাম বাছি লওক ।',
 'fileexists-thumbnail-yes' => "এই ফাইলটো সম্ভৱত: সংক্ষিপ্ত আকাৰৰ ''(থাম্বনেইল)'' চিত্ৰ ।
 [[$1|thumb]]
-অনুগ্ৰহ কৰি '''<tt>[[:$1]]</tt>''' ফাইলটো পৰীক্ষা কৰি চাওক ।
+অনুগ্ৰহ কৰি <strong>[[:$1]]</strong> ফাইলটো পৰীক্ষা কৰি চাওক ।
 যদি পৰীক্ষা কৰা ফাইলটো একেই চিত্ৰৰ মূল আকাৰ হয় তেন্তে এটা অতিৰিক্ত থাম্বনেইল আপলোড কৰাৰ প্ৰয়োজন নাই ।",
-'file-thumbnail-no' => "এই ফাইলনামটো '''<tt>$1</tt>''' ৰে আৰম্ভ হৈছে ।
+'file-thumbnail-no' => "এই ফাইলনামটো <strong>$1</strong> ৰে আৰম্ভ হৈছে ।
 এইখন সম্ভৱত: সংক্ষিপ্ত আকাৰৰ ''(থাম্বনেইল)'' চিত্ৰ ।
 আপোনাৰ ওচৰত যদি পূৰ্ণ ৰিজ’লিউচনৰ চিত্ৰখন আছে সেইখন আপল’ড কৰক, নাইবা ফাইলৰ নামটো সলাওক ।",
 'fileexists-forbidden' => 'এই নামৰ এটা ফাইল ইতিমধ্যেই আছে আৰু তাৰ ওপৰত লিখা নাযাব ।
@@ -1599,8 +1674,8 @@ $1",
 'upload-description' => 'ফাইলৰ বৰ্ণনা',
 'upload-options' => "আপল'ড বিকল্পসমূহ",
 'watchthisupload' => 'এই ফাইল লক্ষ্য কৰক',
-'filewasdeleted' => 'এই নামৰ এটা ফাইল পূৰ্বতে আপলড কৰি বিলোপ কৰা হৈছে ।
-ইয়াক পুনৰ আপলড কৰাৰ আগেয়ে আপুনি $1 পৰীক্ষা কৰা উচিত ।',
+'filewasdeleted' => 'এই নামৰ এটা ফাইল পূৰ্বতে আপলড কৰি বিলোপ কৰা হৈছে ।
+ইয়াক পুনৰ আপলড কৰাৰ আগেয়ে আপুনি $1 পৰীক্ষা কৰা উচিত ।',
 'filename-bad-prefix' => "আপুনি আপলোড কৰা ফাইলৰ নামটো '''\"\$1\"''' দি আৰম্ভ হৈছে, যিটো ডিজিটেল কেমেৰাই স্বয়ংক্ৰিয়ভাৱে দিয়ে আৰু সি ব্যাখ্যামূলক নহয় ।
 অনুগ্ৰহ কৰি আপোনাৰ ফাইলটোৰ বাবে এটা ব্যাখ্যামূলক নাম বাছি লওক ।",
 'upload-success-subj' => "আপলোড সফল হ'ল",
@@ -1609,7 +1684,7 @@ $1",
 'upload-failure-msg' => '[$2] ৰ পৰা আপুনি কৰা আপল’ডত এটা সমস্যাই দেখা দিছে:
 
 $1',
-'upload-warning-subj' => 'আপলড সতৰ্কীকৰণ',
+'upload-warning-subj' => 'আপলড সতৰ্কীকৰণ',
 'upload-warning-msg' => '[$2] ৰ পৰা আপুনি কৰা আপল’ডত এটা সমস্যাই দেখা দিছে । আপুনি ইয়াক সমাধান কৰিবৰ বাবে [[Special:Upload/stash/$1|আপল’ড প্ৰপত্ৰ]] লৈ ঘূৰি যাব পাৰে ।',
 
 'upload-proto-error' => 'ভুল প্ৰ’ট’ক’ল',
@@ -1665,6 +1740,7 @@ URL টোৰ বৈধতা বিচাৰ কৰি পুনৰ চেষ
 'lockmanager-fail-releaselock' => '"$1" -ৰ বাবে লক মুক্ত কৰিব পৰা নগ\'ল।',
 'lockmanager-fail-db-bucket' => "বাকেট $1 -ত পৰ্যাপ্ত লক ডাটাবেইচসমূহ যোগাযোগ কৰিব পৰা নগ'ল।",
 'lockmanager-fail-db-release' => "$1 তথ্যকোষত তলা মোকোলাই দিব পৰা নগ'ল",
+'lockmanager-fail-svr-acquire' => "$1 চাৰ্ভাৰত তলা মোকোলাই দিব পৰা নগ'ল",
 'lockmanager-fail-svr-release' => "$1 চাৰ্ভাৰত তলা মোকোলাই দিব পৰা নগ'ল",
 
 # ZipDirectoryReader
@@ -1819,7 +1895,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 # MIME search
 'mimesearch' => 'MIME অনুসন্ধান',
 'mimesearch-summary' => 'এই পৃষ্ঠাৰ জৰিয়তে ফাইলসমূহক MIME প্ৰকাৰ অনুসৰি চেকিব পৰা যায় ।
-ইনপুট: contenttype/subtype, যেনে- <tt>image/jpeg</tt> ।',
+ইনপুট: contenttype/subtype, যেনে- <code>image/jpeg</code> ।',
 'mimetype' => 'MIME প্ৰকাৰ:',
 'download' => 'ডাউনল’ড কৰক',
 
@@ -1853,7 +1929,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'statistics-articles' => 'বিষয়বস্তুৰ পৃষ্ঠা',
 'statistics-pages' => 'পৃষ্ঠাসমূহ',
 'statistics-pages-desc' => 'কথা-বতৰা পৃষ্ঠা, পুন:নিৰ্দেশিত পৃষ্ঠা আদি সহ এই ৱিকিৰ সকলো পৃষ্ঠা',
-'statistics-files' => 'আপলড কৰা ফাইলসমূহ',
+'statistics-files' => 'আপলড কৰা ফাইলসমূহ',
 'statistics-edits' => '{{SITENAME}} স্থাপন কৰাৰেপৰা পৃষ্ঠা সম্পাদনাসমূহ',
 'statistics-edits-average' => 'প্ৰতি পৃষ্ঠাৰ গড় সম্পাদনা',
 'statistics-views-total' => 'সৰ্বমুঠ প্ৰদৰ্শন',
@@ -1865,7 +1941,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'statistics-mostpopular' => 'সৰ্বোচ্চ দৰ্শন কৰা পৃষ্ঠাসমূহ',
 
 'disambiguations' => 'দ্ব্যৰ্থতা-দূৰীকৰণ পৃষ্ঠাসমূহলৈ সংযোগ থকা পৃষ্ঠাসমূহ',
-'disambiguationspage' => 'Template:দ্ব্যৰ্থতা-দূৰীকৰণ',
+'disambiguationspage' => 'সাঁচ:দ্ব্যৰ্থতা-দূৰীকৰণ',
 'disambiguations-text' => "তলৰ পৃষ্ঠাখনসমূহত '''দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা'''ৰ লগত সংযোগ আছে ।
 ইয়ে উপযুক্ত পৃষ্ঠাৰ লগত সংযোগ কৰিব পাৰে ।
 [[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাঁচ ব্যৱহাৰ কৰিলে এখন পৃষ্ঠাক দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা হিছাপে গণ্য কৰা হ’ব ।",
@@ -1946,7 +2022,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'newpages-username' => 'সদস্যনাম:',
 'ancientpages' => 'আটাইতকৈ পুৰণি পৃষ্ঠাসমূহ',
 'move' => 'স্থানান্তৰ কৰক',
-'movethispage' => 'এই পৃষ্ঠাটো স্থানান্তৰিত কৰক',
+'movethispage' => 'এই পৃষ্ঠাটো স্থানান্তৰ কৰক',
 'unusedimagestext' => 'তলৰ ফাইলসমূহ আছে কিন্তু কোনো পৃষ্ঠাৰ অন্তৰ্গত নহয় ।
 অনুগ্ৰহ কৰি মন কৰিব যে প্ৰত্যক্ষ URL থকা কোনো পৃষ্ঠা আন ৱেবচাইটৰ লগত সংযোগ হৈ থাকিব পাৰে, সেয়ে সক্ৰিয়ভাৱে ব্যৱহাৰ হৈ থকা সত্ত্বেও ইয়াত তালিকাভুক্ত হ’ব পাৰে ।',
 'unusedcategoriestext' => 'তলৰ শ্ৰেণী পৃষ্ঠাসমূহৰ অস্তিত্ব আছে, কিন্তু আন কোনো পৃষ্ঠা বা শ্ৰেণীৰদ্বাৰা ব্যৱহৃত নহয় ।',
@@ -1992,7 +2068,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'allpagessubmit' => 'যাওক',
 'allpagesprefix' => 'এই উপশব্দৰে আৰম্ভ হোৱা পৃষ্ঠা দেখুৱাওক:',
 'allpagesbadtitle' => 'আপুনি দিয়া পৃষ্ঠাটোৰ শিৰোণামা অবৈধ বা তাত এটা আন্তৰ্ভাষিক বা আন্তৰ্ৱিকি উপসৰ্গ আছে । ইয়াত এক বা ততোধিক বৰ্ণ থাকিব পাৰে যাক শিৰোণামাত ব্যৱহাৰ কৰিব নোৱাৰি ।',
-'allpages-bad-ns' => '{{SITENAME}} ত কোনো "$1" নামস্থান নাই ।',
+'allpages-bad-ns' => '{{SITENAME}}ত কোনো "$1" নামস্থান নাই ।',
 'allpages-hide-redirects' => 'পুনঃনিৰ্দেশ লুকুৱাওক',
 
 # SpecialCachedPage
@@ -2015,20 +2091,20 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'sp-deletedcontributions-contribs' => 'বৰঙণিসমূহ',
 
 # Special:LinkSearch
-'linksearch' => 'বহিà¦\83সংযোগ অনুসন্ধান',
+'linksearch' => 'বাহà§\8dযিà¦\95 সংযোগ অনুসন্ধান',
 'linksearch-pat' => 'অনুসন্ধান আৰ্হি:',
 'linksearch-ns' => 'নামস্থান:',
 'linksearch-ok' => 'অনুসন্ধান',
 'linksearch-text' => 'ৱাইল্ডকাৰ্ডসমূহ যেনে "*.wikipedia.org" ব্যৱহাৰ কৰিব পাৰি।
 অন্তত এটা উচ্চ-স্তৰৰ ডমেইনৰ প্ৰয়োজন, উদাহৰণস্বৰূপ "*.org"। <br />
-সমৰ্থিত প্ৰটোকলসমূহ: <tt>$1</tt> (ইয়াৰ এটাকো নিজৰ সন্ধান যোগ নকৰিব)।',
+সমৰ্থিত প্ৰটোকলসমূহ: <code>$1</code> (ইয়াৰ এটাকো নিজৰ সন্ধান যোগ নকৰিব)।',
 'linksearch-line' => '$2 পৰা $1 সংযোগ কৰা হৈছে',
 'linksearch-error' => "ৱাইল্ডকাৰ্ড কেৱল হ'ষ্টনামৰ আৰম্ভণিতহে দেখা যাব ।",
 
 # Special:ListUsers
 'listusersfrom' => 'ইয়াৰে আৰম্ভ হোৱা ব্যৱহাৰকাৰী সকল দেখুৱাওক:',
 'listusers-submit' => 'দেখুৱাওক',
-'listusers-noresult' => 'ব্যৱহাৰকাৰী বিচাৰি পোৱা নগল',
+'listusers-noresult' => 'ব্যৱহাৰকাৰী বিচাৰি পোৱা নগল',
 'listusers-blocked' => '(বাৰণ কৰা)',
 
 # Special:ActiveUsers
@@ -2102,7 +2178,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'watchlist' => 'মোৰ লক্ষ্য-তালিকা',
 'mywatchlist' => 'মোৰ লক্ষ্য-তালিকা',
 'watchlistfor2' => '$1 ৰ কাৰণে($2)',
-'nowatchlist' => 'à¦\86পà§\8bনাৰ à¦¨à¦¿à§°à§\80à¦\95à§\8dষণ à¦¤à¦¾à¦²à¦¿à¦\95াত à¦\95à§\8bনà§\8b à¦\86à¦\87à¦\9fà§\87ম নাই ।',
+'nowatchlist' => 'à¦\86পà§\8bনাৰ à¦¨à¦¿à§°à§\80à¦\95à§\8dষণ à¦¤à¦¾à¦²à¦¿à¦\95াত à¦\8fà¦\95à§\8b নাই ।',
 'watchlistanontext' => 'আপোনাৰ লক্ষ্য তালিকাত থকা বস্তুবোৰ চাবলৈ বা সম্পাদনা কৰিবলৈ অনুগ্ৰহ কৰি $1 কৰক।',
 'watchnologin' => 'প্ৰৱেশ কৰা নাই',
 'watchnologintext' => 'নিৰীক্ষণ তালিকা পৰিৱৰ্তন কৰিবলৈ আপুনি আগতে [[Special:UserLogin|প্ৰৱেশ]] কৰিব লাগিব ।',
@@ -2160,7 +2236,7 @@ $NEWPAGE
 আপুনি এই পৃষ্ঠাখন নোচোৱালৈকে আন সালসলনিৰ কোনো জাননী দিয়া নহ’ব ।
 আপুনি আপোনাৰ লক্ষ্য-তালিকাৰ পৃষ্ঠাবোৰৰ জাননী ফ্লেগ পূৰ্বৰ অৱস্থালৈও ঘূৰাই নিব পাৰে ।
 
-আপোনাৰ {{SITENAME}} জাননী ব্যৱস্থা
+আপোনাৰ {{SITENAME}} জাননী ব্যৱস্থা
 
 --
 আপোনাৰ ই-মেইল জাননী ছেটিং সলনি কৰিবলৈ এইখন চাওক
@@ -2325,14 +2401,14 @@ $UNWATCHURL
 'undeleteviewlink' => 'দেখুৱাওক',
 'undeletereset' => 'পূৰ্বৰ অৱস্থালৈ লৈ যাওক',
 'undeleteinvert' => 'নিৰ্বাচন ওলোটা কৰক',
-'undeletecomment' => ' কাৰণ:',
+'undeletecomment' => 'কাৰণ:',
 'undeletedrevisions' => '{{PLURAL:$1|১টা সংশোধন|$1টা সংশোধন}} পুনৰুদ্ধাৰ কৰা হৈছে',
-'undeletedrevisions-files' => '{{PLURAL:$1|১টা সংশোধন|$1 টা সংশোধন}} আৰু {{PLURAL:$2|১টা ফাইল|$2 টা ফাইল}} পুনৰুদ্ধাৰ কৰা হ’ল',
-'undeletedfiles' => '{{PLURAL:$1|১à¦\9fা à¦«à¦¾à¦\87ল|$1 à¦\9fা à¦«à¦¾à¦\87ল}} পুনৰুদ্ধাৰ কৰা হ’ল',
+'undeletedrevisions-files' => '{{PLURAL:$1|১টা সংশোধন|$1 টা সংশোধন}} আৰু {{PLURAL:$2|১ খন নথি|$2 খন নথি}} পুনৰুদ্ধাৰ কৰা হ’ল',
+'undeletedfiles' => '{{PLURAL:$1|১à¦\96ন à¦¨à¦¥à¦¿|$1 à¦\96ন à¦¨à¦¥à¦¿}} পুনৰুদ্ধাৰ কৰা হ’ল',
 'cannotundelete' => 'অৱলুপ্তি বিফল হৈছে;
 আন কোনোবাই আগতেই ইয়াক বিলোপ কৰিছে ।',
 'undeletedpage' => "'''$1ক পুনৰুদ্ধাৰ কৰা হৈছে'''
-à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¶à§\87হতà§\80য়া à¦\85ৱলà§\81পà§\8dতি à¦\86ৰà§\81 à¦ªà§\81নৰà§\81দà§\8dধাৰৰ à¦¬à¦¾à¦¬à§\87 [[Special:Log/delete|à¦\85ৱলà§\81পà§\8dতি à¦²â\80\99à¦\97]] চাওক ।",
+à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¶à§\87হতà§\80য়া à¦\85ৱলà§\81পà§\8dতি à¦\86ৰà§\81 à¦ªà§\81নৰà§\81দà§\8dধাৰৰ à¦¬à¦¾à¦¬à§\87 [[Special:Log/delete|à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96]] চাওক ।",
 'undelete-header' => 'শেহতীয়াকৈ বিলোপ কৰা পৃষ্ঠাসমূহৰ বাবে [[Special:Log/delete|অৱলুপ্তি ল’গ]] চাওক ।',
 'undelete-search-title' => 'বিলোপ কৰা পৃষ্ঠা অনুসন্ধান কৰক',
 'undelete-search-box' => 'বিলোপ কৰা পৃষ্ঠা অনুসন্ধান কৰক',
@@ -2340,8 +2416,8 @@ $UNWATCHURL
 'undelete-search-submit' => 'সন্ধান',
 'undelete-no-results' => 'অৱলুপ্তি আৰ্কাইভত কোনো মিল থকা পৃষ্ঠা পোৱা নগ’ল ।',
 'undelete-filename-mismatch' => '$1 সময়-মোহৰ থকা ফাইল সংশোধনটো বিলোপ কৰিব পৰা নাযাব: ফাইলৰ নাম মিলা নাই',
-'undelete-bad-store-key' => '$1 à¦¸à¦®à¦¯à¦¼à¦\9aিহà§\8dনৰ à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা à¦«à¦¾à¦\87ল à¦¸à¦\82শà§\8bধনà§\80 à¦\98à§\82ৰাà¦\87 à¦\86নিব à¦¨à§\8bৱাৰি: à¦¬à¦¿à¦²à§\8bপ à¦\95ৰাৰ à¦\86à¦\97à§\87য়à§\87à¦\87 à¦«à¦¾à¦\87লà¦\9fà§\8b নাছিল ।',
-'undelete-cleanup-error' => 'à¦\85বà§\8dযৱহà§\83ত à¦\86ৰà§\8dà¦\95াà¦\87ভ à¦«à¦¾à¦\87ল "$1" বিলোপ কৰাত সমস্যা হৈছে ।',
+'undelete-bad-store-key' => '$1 à¦¸à¦®à¦¯à¦¼à¦\9aিহà§\8dনৰ à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা à¦¨à¦¥à¦¿ à¦¸à¦\82শà§\8bধনà§\80 à¦\98à§\82ৰাà¦\87 à¦\86নিব à¦¨à§\8bৱাৰি: à¦¬à¦¿à¦²à§\8bপ à¦\95ৰাৰ à¦\86à¦\97à§\87য়à§\87à¦\87 à¦¨à¦¥à¦¿à¦\96ন নাছিল ।',
+'undelete-cleanup-error' => 'à¦\85বà§\8dযৱহà§\83ত à¦\86ৰà§\8dà¦\95াà¦\87ভ à¦¨à¦¥à¦¿ "$1" বিলোপ কৰাত সমস্যা হৈছে ।',
 'undelete-missing-filearchive' => 'ফাইল আৰ্কাইভ ID $1 পুনৰুদ্ধাৰ কৰিব পৰা নগ’ল কাৰণ এইটো তথ্যভঁৰালত নাই ।
 এইটো সম্ভৱত: আগতেই পুনৰুদ্ধাৰ কৰা হৈছে ।',
 'undelete-error' => 'পৃষ্ঠা অবিলোপনত ত্ৰুটি হৈছে',
@@ -2349,7 +2425,7 @@ $UNWATCHURL
 'undelete-error-long' => 'ফাইলটোৰ অৱলুপ্তি বাতিল কৰাত কিছু ত্ৰুটি হৈছে:
 
 $1',
-'undelete-show-file-confirm' => 'à¦\86পà§\81নি "<nowiki>$1</nowiki>"  à¦«à¦¾à¦\87লৰ বিলোপ কৰা কৰা সংশোধন $2 তাৰিখৰ $3 সময়ত চাব বিচাৰিছে নেকি ?',
+'undelete-show-file-confirm' => 'à¦\86পà§\81নি "<nowiki>$1</nowiki>"  à¦¨à¦¥à¦¿à¦\96ন বিলোপ কৰা কৰা সংশোধন $2 তাৰিখৰ $3 সময়ত চাব বিচাৰিছে নেকি ?',
 'undelete-show-file-submit' => 'হয়',
 
 # Namespace form on various pages
@@ -2362,9 +2438,9 @@ $1',
 
 # Contributions
 'contributions' => 'সদস্যৰ বৰঙণিসমূহ',
-'contributions-title' => '$1-ৰ বৰঙণিসমূহ',
+'contributions-title' => '$1ৰ বৰঙণিসমূহ',
 'mycontris' => 'মোৰ বৰঙণিসমূহ',
-'contribsub2' => '$1 ৰ কাৰণে($2)',
+'contribsub2' => '$1 ৰ কাৰণে ($2)',
 'nocontribs' => 'এই গুণসমূহৰ লগত মিল থকা কোনো সালসলনি পোৱা নগ’ল ।',
 'uctop' => '(ওপৰত)',
 'month' => 'এই মাহৰ পৰা (আৰু আগৰ):',
@@ -2380,9 +2456,9 @@ $1',
 'sp-contributions-talk' => 'আলোচনা',
 'sp-contributions-userrights' => 'সদস্যৰ অধিকাৰ ব্যৱস্থাপনা',
 'sp-contributions-blocked-notice' => 'এই সদস্যজনক সদ্যহতে বাৰণ কৰা হৈছে ।
-à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰà§\8dথà§\87 à¦¶à§\87হতà§\80য়া à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦²â\80\99à¦\97 ভৰ্তি তলত দিয়া হ’ল:',
+à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰà§\8dথà§\87 à¦¶à§\87হতà§\80য়া à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦\85ভিলà§\87à¦\96 ভৰ্তি তলত দিয়া হ’ল:',
 'sp-contributions-blocked-notice-anon' => 'এই আই.পি. ঠিকনা সদ্যহতে বাৰণ কৰা হৈছে ।
-à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰà§\8dথà§\87 à¦¶à§\87হতà§\80য়া à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦²â\80\99à¦\97 ভৰ্তি তলত দিয়া হ’ল:',
+à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰà§\8dথà§\87 à¦¶à§\87হতà§\80য়া à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦\85ভিলà§\87à¦\96 ভৰ্তি তলত দিয়া হ’ল:',
 'sp-contributions-search' => 'বৰঙণিসমূহৰ কাৰণে অনুসন্ধান কৰক',
 'sp-contributions-username' => 'আই.পি. ঠিকনা অথবা ব্যৱহাৰকৰ্তাৰ নাম:',
 'sp-contributions-toponly' => 'কেৱল সাম্প্ৰতিক সংস্কৰণৰ অন্তৰ্গত সম্পাদনাসমূহ দেখুৱাওক',
@@ -2390,19 +2466,19 @@ $1',
 
 # What links here
 'whatlinkshere' => 'এই পৃষ্ঠা ব্যৱহাৰ কৰিছে...',
-'whatlinkshere-title' => '"$1"-লৈ সংযোগ কৰা পৃষ্ঠাসমূহ',
+'whatlinkshere-title' => '"$1"লৈ সংযোজিত পৃষ্ঠাসমূহ',
 'whatlinkshere-page' => 'পৃষ্ঠা:',
 'linkshere' => "এই পৃষ্ঠাটো '''[[:$1]]''' ৰ লগত সংযোজিত:",
 'nolinkshere' => "'''[[:$1]]''' ৰ লগত কোনো পৃষ্ঠা সংযোজিত নহয়।",
-'nolinkshere-ns' => 'নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা [[:$1]]-লৈ সংযোগ নাই ।',
+'nolinkshere-ns' => 'নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা [[:$1]]লৈ সংযোগ নাই ।',
 'isredirect' => 'পুনঃনিৰ্দেশনা পৃষ্ঠা',
 'istemplate' => 'অন্তৰ্ভুক্ত কৰক',
-'isimage' => 'ফাà¦\87ল সংযোগ',
+'isimage' => 'নথিৰ সংযোগ',
 'whatlinkshere-prev' => '{{PLURAL:$1|পিছৰ|পিছৰ $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|আগৰ|আগৰ $1}}',
 'whatlinkshere-links' => '← সংযোগকেইটা',
 'whatlinkshere-hideredirs' => '$1 পুননিৰ্দেশনাসমূহ',
-'whatlinkshere-hidetrans' => '$1 ট্ৰেন্সক্লুস্বন-সমূহ',
+'whatlinkshere-hidetrans' => '$1 ট্ৰেন্সক্লুস্বনসমূহ',
 'whatlinkshere-hidelinks' => '$1 টা সংযোগ',
 'whatlinkshere-hideimages' => '$1 চিত্ৰ সংযোগসমূহ',
 'whatlinkshere-filters' => 'ছেকনী',
@@ -2430,12 +2506,12 @@ $1',
 ** একাধিক একাউণ্টৰ অপব্যৱহাৰ
 ** অগ্ৰহণযোগ্য সদস্যনাম',
 'ipb-hardblock' => 'এই আই.পি. ঠিকনাৰ পৰা প্ৰৱেশ কৰা সদস্যসকলক সম্পাদনা কৰাৰ পৰা ৰোধ কৰক',
-'ipbcreateaccount' => 'একাউণ্ট সৃষ্টি ৰোধ কৰক',
+'ipbcreateaccount' => 'à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fি à¦\85বৰà§\8bধ à¦\95ৰà¦\95',
 'ipbemailban' => 'ই-মেইল পঠোৱাৰ পৰা সদস্যক বাৰণ কৰক',
 'ipbenableautoblock' => 'এই সদস্যজনে শেহতীয়াকৈ ব্যৱহাৰ কৰা আৰু ভৱিষ্যতে সম্পাদনাৰ বাবে ব্যৱহাৰ কৰা আই.পি. ঠিকনা স্বয়ংক্ৰিয়ভাৱে বাৰণ কৰক',
 'ipbsubmit' => 'এই সদস্যক বাৰণ কৰক',
 'ipbother' => 'অন্য সময়:',
-'ipboptions' => '২ à¦\98ণà§\8dà¦\9fা:2 hours,১ à¦¦à¦¿à¦¨:1 day,৩ à¦¦à¦¿à¦¨:3 days,১ à¦¸à¦ªà§\8dতাহ:1 week,২ à¦¸à¦ªà§\8dতাহ:2 weeks,১ à¦®à¦¾à¦¹:1 month,৩ à¦®à¦¾à¦¹:3 months,৬ à¦®à¦¾à¦¹:6 months,১ à¦¬à¦\9bৰ:1 year,à¦\85নিৰà§\8dদিস্ট কাল:infinite',
+'ipboptions' => '২ à¦\98ণà§\8dà¦\9fা:2 hours,১ à¦¦à¦¿à¦¨:1 day,৩ à¦¦à¦¿à¦¨:3 days,১ à¦¸à¦ªà§\8dতাহ:1 week,২ à¦¸à¦ªà§\8dতাহ:2 weeks,১ à¦®à¦¾à¦¹:1 month,৩ à¦®à¦¾à¦¹:3 months,৬ à¦®à¦¾à¦¹:6 months,১ à¦¬à¦\9bৰ:1 year,à¦\85নিৰà§\8dদিষ্ট কাল:infinite',
 'ipbotheroption' => 'অন্যান্য',
 'ipbotherreason' => 'অন্য/অতিৰিক্ত কাৰণ:',
 'ipbhidename' => 'সম্পাদনা আৰু তালিকা সমূহৰ পৰা সদস্যনাম আঁৰ দিয়ক',
@@ -2450,14 +2526,14 @@ $1',
 'ipb-blockingself' => 'আপুনি নিজকে বাধাপ্ৰদান কৰিব বিচাৰিছে ! আপুনি নিশ্চিতনে আপুনি এনে কৰিব ?',
 'ipb-confirmhideuser' => 'আপুনি "সদস্য গোপন কৰক" বৈশিষ্ট সক্ৰিয় থকা এজন সদস্যক বাৰণ কৰিবলৈ ওলাইছে । এই কাৰ্যই সকলো তালিকা আৰু ল\'গ ভৰ্তিৰ পৰা তেওঁৰ নাম আঁতৰাই পেলাব । এই কাম কৰিব বুলি আপুনি নিশ্চিতনে ?',
 'ipb-edit-dropdown' => 'প্ৰতিবন্ধকৰ কাৰণসমূহ সম্পাদনা কৰক',
-'ipb-unblock-addr' => '$1-পৰা বাৰণ উঠাই লওক',
+'ipb-unblock-addr' => '$1ৰ পৰা বাৰণ উঠাই লওক',
 'ipb-unblock' => 'সদস্যনাম বা আই.পি. ঠিকনাৰ ওপৰত থকা প্ৰতিবন্ধক আঁতৰ কৰক',
 'ipb-blocklist' => 'বৰ্তমানৰ প্ৰতিবন্ধক চাওক',
-'ipb-blocklist-contribs' => '$1-ৰ বৰঙণিসমূহ',
+'ipb-blocklist-contribs' => '$1ৰ বৰঙণিসমূহ',
 'unblockip' => 'সদস্যৰ প্ৰতিবন্ধক উঠাই লওক',
 'unblockiptext' => 'তলৰ প্ৰপত্ৰখন ব্যৱহাৰ কৰি পূৰ্বে প্ৰতিবন্ধক থকা কোনো আই.পি. ঠিকনা বা সদস্যৰ লিখাৰ অধিকাৰ পুনঃপ্ৰতিষ্ঠা কৰক ।',
 'ipusubmit' => 'এই বাৰণ উঠাই লওক',
-'unblocked' => '[[User:$1|$1]] ৰ প্ৰতিবন্ধক আঁতৰ কৰা হৈছে',
+'unblocked' => '[[User:$1|$1]]ৰ প্ৰতিবন্ধক আঁতৰ কৰা হৈছে',
 'unblocked-range' => '$1ৰ প্ৰতিবন্ধক আঁতৰ কৰা হৈছে',
 'unblocked-id' => '$1 প্ৰতিবন্ধকটো আঁতৰ কৰা হৈছে',
 'blocklist' => 'বাৰণ কৰা সদস্য',
@@ -2494,12 +2570,12 @@ $1',
 $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'blocklogpage' => 'বাৰণ সূচী',
 'blocklog-showlog' => 'এই সদস্যজনক পূৰ্বতে অৱৰোধ কৰা হৈছিল ।
-তথà§\8dযসà§\82তà§\8dৰ à¦¹à¦¿à¦\9bাপà§\87 à¦¤à¦²à¦¤ à¦\85ৱৰà§\8bধ à¦²â\80\99à¦\97 দিয়া হ’ল:',
+পà§\8dৰমাণ à¦¸à§\8dবৰà§\82পà§\87 à¦¤à¦²à¦¤ à¦\85ৱৰà§\8bধৰ à¦\85ভিলà§\87à¦\96 দিয়া হ’ল:',
 'blocklog-showsuppresslog' => 'এই সদস্যজনক পূৰ্বতে অৱৰোধ আৰু গোপন কৰা হৈছিল ।
-তথà§\8dযসà§\82তà§\8dৰ à¦¹à¦¿à¦\9bাপà§\87 à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97 তলত দিয়া হ’ল ।',
+পà§\8dৰà§\8dমাণ à¦¸à§\8dবৰà§\82পà§\87 à¦¨à¦¿à¦¬à¦¾à§°à¦£à§° à¦\85ভিলà§\87à¦\96 তলত দিয়া হ’ল ।',
 'blocklogentry' => '"[[$1]]" ক $2 $3 লৈ সাল-সলনি কৰাৰ পৰা বাৰণ কৰা হৈছে।',
 'reblock-logentry' => '[[$1]]ৰ প্ৰতিবন্ধক ছেটিং ম্যাদ উকলা সময় $2 $3ৰ সৈতে সলনি কৰা হ’ল ।',
-'blocklogtext' => 'à¦\8fà¦\87 à¦²â\80\99à¦\97à¦\96ন অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয়।
+'blocklogtext' => 'à¦\8fà¦\87 à¦\85ভিলà§\87à¦\96 অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয়।
 স্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই।
 সাম্প্ৰতিক কাৰ্যৰত নিষেধ আৰু প্ৰতিবন্ধকৰ বাবে [[Special:BlockList|প্ৰতিবন্ধক তালিকা]] চাওক।',
 'unblocklogentry' => '$1 বাৰণ উঠাই লোৱা হ’ল',
@@ -2512,7 +2588,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'block-log-flags-hiddenname' => 'সদস্যনাম গোপন কৰা হ’ল',
 'range_block_disabled' => 'প্ৰশাসকৰ পৰিসীমা প্ৰতিবন্ধক সৃষ্টি কৰিব পৰা ক্ষমতা নিষ্ক্ৰিয় কৰা হৈছে ।',
 'ipb_expiry_invalid' => 'অবৈধ ম্যাদ উকলা সময়',
-'ipb_expiry_temp' => 'গুপ্ত সদস্যনাম অৱৰোধ স্থায়ী হ;ব লাগিব ।',
+'ipb_expiry_temp' => 'গুপ্ত সদস্যনাম অৱৰোধ স্থায়ী হব লাগিব ।',
 'ipb_hide_invalid' => 'এই বিষয়বস্তু নিবাৰণ কৰিব পৰা নগ’ল; ইয়াত বহুতো সম্পাদনা আছে ।',
 'ipb_already_blocked' => '"$1"ক ইতিমধ্যে অৱৰোধ কৰা হৈছে',
 'ipb-needreblock' => '$1ক ইতিমধ্যে অৱৰোধ কৰা হৈছে । আপুনি ছেটিং সলাব বিচাৰিছে নেকি ?',
@@ -2529,8 +2605,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'proxyblockreason' => 'আপোনাৰ আই.পি. ঠিকনা অৱৰোধ কৰা হৈছে কাৰণ এইটো এটা মুক্ত প্ৰক্সী ।
 অনুগ্ৰহ কৰি আপোনাৰ ইণ্টাৰনেট সেৱা প্ৰদানকাৰী বা কাৰিকৰী সহায়কৰ্তাৰ লগত যোগাযোগ কৰক আৰু এই গুৰুতৰ সুৰক্ষা সমস্যাৰ বিষয়ে জনাওক ।',
 'proxyblocksuccess' => 'সম্পন্ন কৰা হ’ল ।',
-'sorbsreason' => '{{SITENAME}}à¦\8f ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।',
-'sorbs_create_account_reason' => '{{SITENAME}}à¦\8f ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।
+'sorbsreason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।',
+'sorbs_create_account_reason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।
 আপুনি একাউণ্ট সৃষ্টি কৰিব নোৱাৰে',
 'cant-block-while-blocked' => 'নিজেই অৱৰোধিত হৈ থকা অৱস্থাত আপুনি আন সদস্যক অৱৰোধ কৰিব নোৱাৰে ।',
 'cant-see-hidden-user' => 'আপুনি বাৰণ কৰিব বিচৰা সদস্যজনক ইতিমধ্যেই বাৰণ কৰি গোপন কৰা হৈছে ।
@@ -2573,8 +2649,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 ইয়াৰ অৰ্থ এয়ে যে ভুল হলে পৃষ্ঠাখন আগৰ ঠাইতে থাকিব, আৰু আপুনি প্ৰচলিত পৃষ্ঠা এখনক আন পৃষ্ঠা এখনেৰে সলনি কৰিব নোৱাৰে।
 
 '''সতৰ্কবাণী !'''
-জনপ্ৰিয় পৃষ্ঠা এখনৰ বাবে এয়া এক ডাঙৰ আৰু অনাকাংক্ষিত সাল-সলনি হব পাৰে;
-এই কাৰ্য্যৰ পৰিণাম ভালদৰে বিবেচনা কৰি লয় যেন।",
+জনপ্ৰিয় পৃষ্ঠা এখনৰ বাবে এয়া এক ডাঙৰ আৰু অনাকাংক্ষিত সাল-সলনি হব পাৰে;
+এই কাৰ্য পৰিণাম ভালদৰে বিবেচনা কৰি লয় যেন।",
 'movepagetext-noredirectfixer' => "তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰিলে এই পৃষ্ঠাৰ শিৰোনামা সলনি হ'ব, লগতে সমগ্ৰ ইতিহাস নতুন শিৰোনামালৈ স্থানান্তৰ কৰা হ'ব।
 পুৰণা শিৰোনামাটো নতুন শিৰোনামালৈ এটা পুনৰ্নিৰ্দেশনা হৈ ৰ'ব।
 [[Special:DoubleRedirects|দ্বি পুনৰ্নিৰ্দেশনাসমূহ]] বা [[Special:BrokenRedirects|ভঙা পুনৰ্নিৰ্দেশনসমূহ]] পৰীক্ষা কৰিবলৈ নাপাহৰিব।
@@ -2594,32 +2670,32 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'movearticle' => 'পৃষ্ঠা স্থানান্তৰ কৰক:',
 'moveuserpage-warning' => "'''সতৰ্কবাণী:''' আপুনি এখন সদস্যপৃষ্ঠা স্থানান্তৰ কৰিবলৈ বিছাৰিছে । অনুগ্ৰহ কৰি মন কৰক যে কেৱল সদস্যপৃষ্ঠাখনহে স্থানান্তৰ হ’ব আৰু সদস্যজনৰ পুনঃনামাকৰণ নহ’ব ।",
 'movenologin' => 'প্ৰৱেশ কৰা নাই',
-'movenologintext' => 'পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপুনি ভুক্ত সদস্য হৈ [[Special:UserLogin|পৱেশ]] কৰিব লাগিব ।',
+'movenologintext' => 'পà§\83ষà§\8dঠা à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰিবলà§\88 à¦\86পà§\81নি à¦­à§\81à¦\95à§\8dত à¦¸à¦¦à¦¸à§\8dয à¦¹à§\88 [[Special:UserLogin|পà§\8dৰৱà§\87শ]] à¦\95ৰিব à¦²à¦¾à¦\97িব à¥¤',
 'movenotallowed' => 'পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।',
-'movenotallowedfile' => 'ফাà¦\87ল স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।',
+'movenotallowedfile' => 'নথিà¦\96ন স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।',
 'cant-move-user-page' => 'সদস্য পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপুনাৰ অনুমতি নাই (উপ-পৃষ্ঠাৰ বাহিৰে)।',
 'cant-move-to-user-page' => 'সদস্যপৃষ্ঠালৈ কোনো পৃষ্ঠা স্থানান্তৰ কৰাৰ অনুমতি আপোনাৰ নাই (কেৱল সদস্য উপপৃষ্ঠাৰ বাহিৰে ) ।',
 'newtitle' => 'নতুন শিৰোনামালৈ:',
 'move-watch' => 'এই পৃষ্ঠাখন লক্ষ্য কৰক',
 'movepagebtn' => 'পৃষ্ঠাখন স্থানান্তৰ কৰক',
-'pagemovedsub' => 'স্থানান্তৰ সফল হল',
-'movepage-moved' => "'''“$1” ক “$2” লৈ স্থানান্তৰ কৰা হৈছে'''",
+'pagemovedsub' => 'স্থানান্তৰ সফল হল',
+'movepage-moved' => "'''“$1”ক “$2”লৈ স্থানান্তৰ কৰা হৈছে'''",
 'movepage-moved-redirect' => 'এটি পুনৰ্নিদেশনা সৃষ্টি কৰা হৈছে',
 'movepage-moved-noredirect' => 'পুনৰ্নিৰ্দেশনা সৃষ্টি কৰা নিবাৰণ কৰা হৈছে ।',
 'articleexists' => 'সেই নামৰ পৃষ্ঠা এটা আগৰ পৰাই আছে, বা সেই নামতো অযোগ্য।
 বেলেগ নাম এটা বাছি লওক।',
 'cantmove-titleprotected' => 'আপুনি ইয়ালৈ কোনো পৃষ্ঠা স্থানান্তৰ কৰিব নোৱাৰে, কাৰণ এই নতুন শিৰোনামা সৃষ্টিৰ পৰা সুৰক্ষিত ।',
-'talkexists' => "'''পà§\83ষà§\8dঠাà¦\96ন à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦¹à§\88à¦\9bà§\87, à¦\95িনà§\8dতà§\81 à¦\87য়াৰ à¦²à¦\97ত à¦\9cড়িত বাৰ্তা পৃষ্ঠাখন স্থানান্তৰ কৰা নহ'ল, কাৰণ নতুন ঠাইত বাৰ্তা পৃষ্ঠা এখন আগৰ পৰাই আছে।
+'talkexists' => "'''পà§\83ষà§\8dঠাà¦\96ন à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦¹à§\88à¦\9bà§\87, à¦\95িনà§\8dতà§\81 à¦\87য়াৰ à¦²à¦\97ত à¦\9cৰিত বাৰ্তা পৃষ্ঠাখন স্থানান্তৰ কৰা নহ'ল, কাৰণ নতুন ঠাইত বাৰ্তা পৃষ্ঠা এখন আগৰ পৰাই আছে।
 অনুগ্ৰহ কৰি আপুনি নিজৰ হাতেৰে স্থানান্তৰ কৰক ।'''",
-'movedto' => 'লৈ স্থানান্তৰ কৰা হল',
+'movedto' => 'লৈ স্থানান্তৰ কৰা হল',
 'movetalk' => 'সংলগ্ন বাৰ্তা পৃষ্ঠা স্থানান্তৰ কৰক',
-'move-subpages' => 'উপ-পৃষ্ঠাসমূহ স্থানান্তৰ কৰক ($1-লৈ)',
+'move-subpages' => 'উপ-পৃষ্ঠাসমূহ স্থানান্তৰ কৰক ($1লৈ)',
 'move-talk-subpages' => 'আলোচনা পৃষ্ঠাৰ উপ-পৃষ্ঠাসমূহ স্থানান্তৰ কৰক ($1-লৈ)',
 'movepage-page-exists' => '$1 পৃষ্ঠাখন ইতিমধ্যেই আছে আৰু তাৰ ওপৰত স্বয়ংক্ৰিয়ভাৱে লিখিব নোৱাৰি ।',
-'movepage-page-moved' => "$1 পৃষ্ঠাখন $2-লৈ স্থানান্তৰ কৰা হ'ল ।",
-'movepage-page-unmoved' => '$1 পৃষ্ঠাখন $2-লৈ স্থানান্তৰ কৰা সম্ভৱ নহয়',
+'movepage-page-moved' => "$1 পৃষ্ঠাখন $2লৈ স্থানান্তৰ কৰা হ'ল।",
+'movepage-page-unmoved' => '$1 পৃষ্ঠাখন $2লৈ স্থানান্তৰ কৰা সম্ভৱ নহয়',
 'movepage-max-pages' => 'সৰ্বোচ্চ $1 {{PLURAL:$1|পৃষ্ঠা|পৃষ্ঠা}} স্থানান্তৰ কৰা হৈছে আৰু ইয়াতকৈ অধিক স্বয়ংক্ৰিয়ভাৱে স্থানান্তৰ নহ’ব ।',
-'movelogpage' => 'সà§\8dথানানà§\8dতৰন à¦¸à§\82à¦\9aà§\80',
+'movelogpage' => 'সà§\8dথানানà§\8dতৰন à¦\85ভিলà§\87à¦\96',
 'movelogpagetext' => 'সকলো পৃষ্ঠা স্থানান্তৰৰ এখন তালিকা তলত দিয়া হৈছে ।',
 'movesubpage' => '{{PLURAL:$1|খন উপপৃষ্ঠা|খন উপপৃষ্ঠা}}',
 'movesubpagetext' => 'এই পৃষ্ঠাখনৰ তলত দিয়া {{PLURAL:$1|খন উপপৃষ্ঠা|খন উপপৃষ্ঠা}} আছে ।',
@@ -2646,9 +2722,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'fix-double-redirects' => 'প্ৰাথমিক প্ৰৱন্ধলৈ আঙুলিয়াই দিয়া যিকোনো পুনৰ্নিৰ্দেশ নবীকৰণ কৰক',
 'move-leave-redirect' => 'এটা পুনঃনিৰ্দেশনা এৰি যাওক',
 'protectedpagemovewarning' => "'''সতৰ্কবাণী: এই পৃষ্ঠা সুৰক্ষিত কৰা হৈছে; কেৱল প্ৰশাসকৰৰ মৰ্যদাৰ সদস্যইহে ইয়াক স্থানান্তৰ কৰিব পাৰিব ।'''
-à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰ à¦¬à¦¾à¦¬à§\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦²'à¦\97 সংৰক্ষণ তলত দিয়া হ’ল:",
+à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰ à¦¬à¦¾à¦¬à§\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦\85ভিলà§\87à¦\96 সংৰক্ষণ তলত দিয়া হ’ল:",
 'semiprotectedpagemovewarning' => "'''টোকা:''' এই পৃষ্ঠা সুৰক্ষিত কৰা হৈছে; কেৱল পঞ্জীভূত সদস্যইহে ইয়াক স্থানান্তৰ কৰিব পাৰিব ।'''
-à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰ à¦¬à¦¾à¦¬à§\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦²'à¦\97 সংৰক্ষণ তলত দিয়া হ’ল:",
+à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰ à¦¬à¦¾à¦¬à§\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦\85ভিলà§\87à¦\96 সংৰক্ষণ তলত দিয়া হ’ল:",
 'move-over-sharedrepo' => "== ফাইলৰ অস্বিত্ব আছে ==
 [[:$1]] এক উমৈহতীয়া ভঁৰালত আছে । এই শিৰোনামালৈ ফাইল স্থানান্তৰ কৰিলে উমৈহতীয়া ফাইলটোৰ লগত ওপৰা-ওপৰি হ'ব ।",
 'file-exists-sharedrepo' => 'নিৰ্বাচিত ফাইল নামটো ইতিমধ্যে এটা উমৈহতীয়া ভঁৰালত ব্যৱহৃত ।
@@ -2667,20 +2743,20 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'exportcuronly' => 'কেৱল সাম্প্ৰতিক সংশোধনটোহে অন্তৰ্ভুক্ত কৰক, সম্পূৰ্ণ ইতিহাস নহয় ।',
 'exportnohistory' => "----
 '''টোকা:''' কৰ্মদক্ষতা-সম্পৰ্কীয় কাৰণত এই প্ৰপত্ৰৰ মাধ্যমেৰে কোনো পৃষ্ঠাৰ সম্পূৰ্ণ ইতিহাস ৰপ্তানি কৰাটো নিষ্ক্ৰিয় কৰা হৈছে।",
-'exportlistauthors' => 'পà§\8dৰতà§\8dযà§\87à¦\95 à¦ªà§\83ষà§\8dঠাৰ à¦\85ৱদানà¦\95াৰà§\80ৰ সম্পূৰ্ণ তালিকা অন্তৰ্ভুক্ত কৰক',
+'exportlistauthors' => 'পà§\8dৰতà§\8dযà§\87à¦\95 à¦ªà§\83ষà§\8dঠাৰ à¦¬à§°à¦\99নিদাতাৰ সম্পূৰ্ণ তালিকা অন্তৰ্ভুক্ত কৰক',
 'export-submit' => 'ৰপ্তানি কৰক',
 'export-addcattext' => 'এই শ্ৰেণীকেইটাৰ পৰা পৃষ্ঠা যোগ কৰক:',
 'export-addcat' => 'যোগ কৰক',
 'export-addnstext' => 'এই নামস্থানৰ পৰা পৃষ্ঠা যোগ কৰক',
 'export-addns' => 'যোগ কৰক',
-'export-download' => 'ফাà¦\87ল à¦¹à¦¿à¦\9aাবে সংৰক্ষণ কৰক',
+'export-download' => 'নথি à§°à§\82পে সংৰক্ষণ কৰক',
 'export-templates' => 'সাঁচসমূহ অন্তৰ্ভুক্ত কৰক',
 'export-pagelinks' => 'এই স্তৰলৈকে পৃষ্ঠা সংযোগ অন্তৰ্ভুক্ত কৰক:',
 
 # Namespace 8 related
 'allmessages' => 'ব্যৱস্থাৰ বতৰা',
 'allmessagesname' => 'নাম',
-'allmessagesdefault' => "ডিফ'ল্ট বাৰ্তা পাঠ্য",
+'allmessagesdefault' => 'সাধাৰণ বাৰ্তা পাঠ্য',
 'allmessagescurrent' => 'বৰ্তমানৰ বাৰ্তাৰ পাঠ',
 'allmessagestext' => 'মিডিয়াৱিকি নামস্থানত থকা প্ৰণালী বাৰ্তাসমূহৰ তালিকা ইয়াত দিয়া হৈছে ।
 যদি আপুনি মিডিয়াৱিকিৰ স্থানীয়কৰণত আগ্ৰহী, তেন্তে অনুগ্ৰহ কৰি [//www.mediawiki.org/wiki/Localisation মিডিয়াৱিকি স্থানীয়কৰণ] আৰু [//translatewiki.net translatewiki.net] চাওক ।',
@@ -2703,30 +2779,30 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'thumbnail-temp-create' => 'অস্থায়ী থাম্বনেইল নথিপত্ৰ সৃষ্টি কৰিবলে অক্ষম',
 'thumbnail-dest-create' => 'থাম্বনেইলক গন্তব্যত সাঁচিবলে অক্ষম',
 'thumbnail_invalid_params' => 'অবৈধ ক্ষুদ্ৰাকৃতি পাৰামিটাৰ',
-'thumbnail_dest_directory' => 'à¦\97নà§\8dতবà§\8dয à¦¡à¦¿à§°à§\87à¦\95à§\8dà¦\9fৰà§\80 সৃষ্টি কৰিব পৰা নগ’ল',
+'thumbnail_dest_directory' => 'à¦\97নà§\8dতবà§\8dয à¦¨à¦¿à§°à§\8dদà§\87শিà¦\95া সৃষ্টি কৰিব পৰা নগ’ল',
 'thumbnail_image-type' => 'চিত্ৰৰ ধৰণ সমৰ্থিত নহয় ।',
-'thumbnail_gd-library' => 'à¦\85সমà§\8dপà§\82ৰà§\8dণ GD à¦²à¦¾à¦\87বà§\8dৰà§\87ৰà§\80 à¦¸à¦\82ৰà§\82প: à¦¸à¦¨à§\8dধানহিন ফলন $1',
-'thumbnail_image-missing' => 'ফাà¦\87ল সম্ভৱতঃ নাই: $1',
+'thumbnail_gd-library' => 'à¦\85সমà§\8dপà§\82ৰà§\8dণ GD à¦²à¦¾à¦\87বà§\8dৰà§\87ৰà§\80 à¦¸à¦\82ৰà§\82প: à¦¸à¦¨à§\8dধানহà§\80ন ফলন $1',
+'thumbnail_image-missing' => 'নথিà¦\96ন সম্ভৱতঃ নাই: $1',
 
 # Special:Import
 'import' => 'পৃষ্ঠা আমদানি কৰক',
 'importinterwiki' => 'আন্তঃৱিকি আমদানি',
 'import-interwiki-text' => "আমদানি কৰিবলৈ এটা ৱিকি বা পৃষ্ঠাৰ শিৰোনামা নিৰ্বাচন কৰক ।
 সংশোধনৰ তাৰিখ আৰু সম্পাদকৰ নাম সংৰক্ষণ কৰা হ'ব ।
-সà¦\95লà§\8b à¦\86নà§\8dতà¦\83ৱিà¦\95ি à¦\86মদানি [[Special:Log/import|à¦\86মদানি à¦²'à¦\97]]ত লিপিবদ্ধ আছে ।",
+সà¦\95লà§\8b à¦\86নà§\8dতà¦\83ৱিà¦\95ি à¦\86মদানি [[Special:Log/import|à¦\86মদানি à¦\85ভিলà§\87à¦\96]]ত লিপিবদ্ধ আছে ।",
 'import-interwiki-source' => 'উৎস ৱিকি/পৃষ্ঠা:',
-'import-interwiki-history' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦\95লà§\8b à¦¸à¦\82শà§\8bধনৰ à¦\87তিহাস à¦\95পà§\80 কৰক',
+'import-interwiki-history' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦\95লà§\8b à¦¸à¦\82শà§\8bধনৰ à¦\87তিহাস à¦ªà§\8dৰতিলিপি কৰক',
 'import-interwiki-templates' => 'সকলো সাঁচ অন্তৰ্ভুক্ত কৰক',
 'import-interwiki-submit' => 'আমদানি',
 'import-interwiki-namespace' => 'গন্তব্য নামস্থান:',
-'import-upload-filename' => 'ফাà¦\87লনাম:',
+'import-upload-filename' => 'নথিৰ নাম:',
 'import-comment' => 'মন্তব্য:',
 'importtext' => "অনুগ্ৰহ কৰি [[Special:Export|ৰপ্তানি সুবিধা]] ব্যৱহাৰ কৰি উৎস ৱিকিৰ পৰা ফাইলটো ৰপ্তানি কৰক।
 আপোনাৰ কম্পিউটাৰত সাঁচি ৰাখক আৰু ইয়াত আপল'ড কৰক।",
-'importstart' => 'পৃষ্ঠা আমদানি কৰা হৈছে...',
+'importstart' => 'পৃষ্ঠা আমদানি কৰা হৈ হৈছে...',
 'import-revision-count' => '$1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}',
 'importnopages' => 'আমদানি কৰিবলৈ কোনো পৃষ্ঠা নাই ।',
-'imported-log-entries' => "$1 {{PLURAL:$1|à¦\9fা à¦²'à¦\97 à¦­à§°à§\8dতি|à¦\9fা à¦²'à¦\97 ভৰ্তি}} আমদানি কৰা হ'ল ।",
+'imported-log-entries' => "$1 {{PLURAL:$1|à¦\9fা à¦\85ভিলà§\87à¦\96 à¦­à§°à§\8dতি|à¦\9fা à¦\85ভিলà§\87à¦\96 ভৰ্তি}} আমদানি কৰা হ'ল ।",
 'importfailed' => 'আমদানি ব্যৰ্থ হৈছে: <nowiki>$1</nowiki>',
 'importunknownsource' => 'অজ্ঞাত আমদানি উৎসৰ প্ৰকাৰ',
 'importcantopen' => "আমদানি ফাইল খুলিব পৰা নগ'ল",
@@ -2735,12 +2811,12 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'importsuccess' => 'আমদানি সমাপ্ত !',
 'importhistoryconflict' => "পৰস্পৰবিৰোধী ইতিহাস সংশোধনী আছে (এই পৃষ্ঠা আগতেও আমদানি কৰা হ'ব পাৰে)",
 'importnosources' => "কোনো আন্তঃৱিকি আমদানি উৎসৰ সংজ্ঞা দিয়া হোৱা নাই আৰু প্ৰত্যক্ষ ইতিহাস আপল'ড নিষ্ক্ৰিয় কৰা হৈছে ।",
-'importnofile' => "à¦\95à§\8bনà§\8b à¦\86মদানি à¦«à¦¾à¦\87ল আপল'ড কৰা হোৱা নাই ।",
-'importuploaderrorsize' => "à¦\86মদানি à¦«à¦¾à¦\87লৰ à¦\86পল'ড à¦¬à§\8dযৰà§\8dথ হৈছে ।
-à¦\85নà§\81মà§\8bদিত à¦\86পল'ড à¦«à¦¾à¦\87লতà¦\95à§\88 à¦\8fà¦\87 à¦«à¦¾à¦\87লৰ আকাৰ ডাঙৰ ।",
-'importuploaderrorpartial' => "à¦\86মদানি à¦«à¦¾à¦\87লৰ à¦\86পল'ড à¦¬à§\8dযৰà§\8dথ হৈছে ।
-ফাà¦\87লà¦\9fà§\8b কেৱল আংশিকভাৱে আপল'ড কৰা হৈছে ।",
-'importuploaderrortemp' => "à¦\86মদানি à¦«à¦¾à¦\87লৰ à¦\86পল'ড à¦¬à§\8dযৰà§\8dথ হৈছে ।
+'importnofile' => "à¦\95à§\8bনà§\8b à¦\86মদানি à¦¨à¦¥à¦¿ আপল'ড কৰা হোৱা নাই ।",
+'importuploaderrorsize' => "à¦\86মদানি à¦¨à¦¥à¦¿à§° à¦\86পল'ড à¦\85সফল হৈছে ।
+à¦\85নà§\81মà§\8bদিত à¦\86পল'ড à¦¨à¦¥à¦¿à¦¤à¦\95à§\88 à¦\8fà¦\87 à¦¨à¦¥à¦¿ৰ আকাৰ ডাঙৰ ।",
+'importuploaderrorpartial' => "à¦\86মদানি à¦¨à¦¥à¦¿à§° à¦\86পল'ড à¦\85সফল হৈছে ।
+নথিà¦\96ন কেৱল আংশিকভাৱে আপল'ড কৰা হৈছে ।",
+'importuploaderrortemp' => "à¦\86মদানি à¦¨à¦¥à¦¿à§° à¦\86পল'ড à¦¬à¦¿à¦«à¦² হৈছে ।
 এটা অস্থায়ী ফ'ল্ডাৰ হেৰাইছে ।",
 'import-parse-failure' => 'XML আমদানি পাৰ্চ বিফলতা',
 'import-noarticle' => 'আমদানি কৰিবলৈ কোনো পৃষ্ঠা নাই !',
@@ -2757,9 +2833,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'import-error-invalid' => '"$1" পৃষ্ঠাখন আমদানি কৰা নহ\'ল কাৰণ ইয়াৰ নামটো অবৈধ।',
 
 # Import log
-'importlogpage' => "আমদানি ল'গ",
+'importlogpage' => 'আমদানিৰ অভিলেখ',
 'importlogpagetext' => 'আন ৱিকিৰ পৰা সম্পাদনা ইতিহাস সহ প্ৰশাসনীয় পৃষ্ঠা আমদানি ।',
-'import-logentry-upload' => "ফাà¦\87ল আপল'ডৰ মাধ্যমেৰে [[$1]] আমদানি কৰা হ'ল",
+'import-logentry-upload' => "নথি আপল'ডৰ মাধ্যমেৰে [[$1]] আমদানি কৰা হ'ল",
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}',
 'import-logentry-interwiki' => 'আন্তঃৱিকি-স্থানান্তৰিত $1',
 'import-logentry-interwiki-detail' => '$2ৱে কৰা $1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}',
@@ -2784,15 +2860,15 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-pt-watchlist' => 'আপুনি সালসলনিৰ গতিবিধি লক্ষ্য কৰি থকা পৃষ্ঠাসমূহৰ সুচী',
 'tooltip-pt-mycontris' => 'আপোনাৰ বৰঙণিৰ তালিকা',
 'tooltip-pt-login' => "বাধ্যতামূলক নহ'লেও প্ৰৱেশ কৰাটো বাঞ্চনীয়",
-'tooltip-pt-anonlogin' => 'বাধà§\8dযতামà§\82লà¦\95 à¦¨à¦¹â\80\99লà§\87à¦\93 à¦²à¦\97-à¦\87ন কৰাটো বাঞ্চনীয়',
+'tooltip-pt-anonlogin' => 'বাধà§\8dযতামà§\82লà¦\95 à¦¨à¦¹â\80\99লà§\87à¦\93 à¦ªà§\8dৰৱà§\87শ কৰাটো বাঞ্চনীয়',
 'tooltip-pt-logout' => 'প্ৰস্থান',
 'tooltip-ca-talk' => 'সংশ্লিষ্ট প্ৰবন্ধ সম্পৰ্কীয় আলোচনা',
 'tooltip-ca-edit' => 'আপুনি এই পৃষ্ঠাটো সালসলনি কৰিব পাৰে, অনুগ্ৰহ কৰি সালসলনি সাচী থোৱাৰ আগতে খচৰা চাই লব',
 'tooltip-ca-addsection' => 'নতুন অনুচ্ছেদ আৰম্ভ কৰক',
-'tooltip-ca-viewsource' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¸à¦\82ৰক্ষিত কৰা হৈছে, আপুনি ইয়াৰ উৎস চাব পাৰে।',
+'tooltip-ca-viewsource' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¸à§\81ৰক্ষিত কৰা হৈছে, আপুনি ইয়াৰ উৎস চাব পাৰে।',
 'tooltip-ca-history' => 'এই পৃষ্ঠাৰ যোৱা সংস্কৰণসমূহ',
 'tooltip-ca-protect' => 'এই পৃষ্ঠাখন সুৰক্ষিত কৰক',
-'tooltip-ca-unprotect' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦\82ৰà¦\95à§\8dষণ সলনি কৰক',
+'tooltip-ca-unprotect' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à§\81ৰà¦\95à§\8dষা সলনি কৰক',
 'tooltip-ca-delete' => 'এই পৃষ্ঠাখন বিলোপ কৰক',
 'tooltip-ca-undelete' => 'বিলোপ কৰাৰ আগেয়ে কৰা পৃষ্ঠাখনৰ সালসলনিসমূহ পুনঃসংস্থাপন কৰক',
 'tooltip-ca-move' => 'এই পৃষ্ঠাখন স্থানান্তৰিত কৰক',
@@ -2811,8 +2887,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-n-help' => 'সহায়ৰ বাবে ইয়াত ক্লিক কৰক',
 'tooltip-t-whatlinkshere' => 'ইয়ালৈ সংযোজিত সকলো পৃষ্ঠাৰ সুচী',
 'tooltip-t-recentchangeslinked' => 'সংযুক্ত পৃষ্ঠাসমূহৰ শেহতীয়া সালসলনিসমূহ',
-'tooltip-feed-rss' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¬à¦¾à¦¬à§\87 à¦\86ৰ-à¦\8fà¦\9a-à¦\8fà¦\9a à¦«à¦¿à¦¡',
-'tooltip-feed-atom' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¬à¦¾à¦¬à§\87 à¦\8fà¦\9fম à¦«à¦¿à¦¡',
+'tooltip-feed-rss' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¬à¦¾à¦¬à§\87 à¦\86ৰ-à¦\8fà¦\9a-à¦\8fà¦\9a à¦­à§\81à¦\95à§\8dতি',
+'tooltip-feed-atom' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¬à¦¾à¦¬à§\87 à¦\8fà¦\9fম à¦­à§\81à¦\95à§\8dতি',
 'tooltip-t-contributions' => 'এই সদস্যজনৰ অৰিহনাসমূহৰ সূচী চাওক',
 'tooltip-t-emailuser' => 'এই সদস্যজনলৈ ই-মেইল পঠাওক',
 'tooltip-t-upload' => "ফাইল আপল'ডৰ বাবে",
@@ -2824,9 +2900,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-ca-nstab-media' => 'মিডিয়া পৃষ্ঠাখন চাওক',
 'tooltip-ca-nstab-special' => 'এইখন এখন বিশেষ পৃষ্ঠা, আপুনি সম্পাদনা কৰিব নোৱাৰে',
 'tooltip-ca-nstab-project' => 'প্ৰকল্প পৃষ্ঠা চাওক',
-'tooltip-ca-nstab-image' => 'ফাà¦\87ল পৃষ্ঠা চাওক',
+'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-minoredit' => 'ইয়াক অগুৰুত্বপূৰ্ণ সম্পাদনা ৰূপে চিহ্নিত কৰক।',
@@ -2839,7 +2915,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-watchlistedit-raw-submit' => 'লক্ষ্য-তালিকা আপডেট কৰক',
 'tooltip-recreate' => 'বিলোপ কৰা সত্বেও পৃষ্ঠাখন পুনৰ সৃষ্টি কৰক',
 'tooltip-upload' => "আপল'ড আৰম্ভ কৰক",
-'tooltip-rollback' => '"ৰ\'লবà§\87à¦\95"à¦\8f এটা ক্লিকত এই পৃষ্ঠাৰ শেষ অৱদানকাৰীৰ সম্পাদনা বাতিল কৰি ইয়াক পূৰ্বাৱস্থালৈ ঘূৰাই নিব।',
+'tooltip-rollback' => '"পà§\82ৰà§\8dববত" à¦\95ৰিলà§\87 এটা ক্লিকত এই পৃষ্ঠাৰ শেষ অৱদানকাৰীৰ সম্পাদনা বাতিল কৰি ইয়াক পূৰ্বাৱস্থালৈ ঘূৰাই নিব।',
 'tooltip-undo' => '"বাতিল"এ এই সম্পাদনাক পূৰ্বাৱস্থালৈ ঘূৰাই নিব আৰু প্ৰাক্‌দৰ্শনৰ বাবে সম্পাদনাটো খুলিব। ই সম্পাদনা সাৰাংশত কাৰণ এটা লিখিবলৈ সুযোগ দিব।',
 'tooltip-preferences-save' => 'পছন্দসমূহ সাঁচি থওক',
 'tooltip-summary' => 'চমু সাৰাংশ লিখক',
@@ -2852,7 +2928,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'siteuser' => '{{SITENAME}} সদস্য $1',
 'anonuser' => '{{SITENAME}} বেনামী সদস্য $1',
 'lastmodifiedatby' => 'এই পৃষ্ঠাখন শেষবাৰৰ কাৰণে $1 তাৰিখে $2 বজাত $3ৰ দ্বাৰা সলনি কৰা হৈছিল',
-'othercontribs' => '$1 ৰ কাৰ্য্যৰ উপৰত ভিত্তি কৰি',
+'othercontribs' => '$1ৰ কাৰ্যৰ ওপৰত ভিত্তি কৰি',
 'others' => 'অন্যান্য',
 'siteusers' => '{{SITENAME}} {{PLURAL:$2|সদস্য|সদস্যসমূহ}} $1',
 'anonusers' => '{{SITENAME}} বেনামী {{PLURAL:$2|সদস্য|সদস্যসকল}} $1',
@@ -2864,23 +2940,18 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'spamprotectiontext' => 'আপুনি সাঁচিব বিচৰা পাঠখিনিক স্পাম ছেকনীৰ দ্বাৰা বাধা প্ৰদান কৰা হৈছে ।
 সম্ভৱতঃ কোনো ব্লেকলিষ্টেড হোৱা বাহ্যিক সংযোগৰ কাৰণে এনে ঘটিছে ।',
 'spamprotectionmatch' => 'নিম্নলিখিত লিখনীৰ বাবে আমাৰ স্পাম পৰিস্ৰাৱক আৰম্ভ হৈছে: $1',
-'spambot_username' => 'মিডিয়াৱিকি স্পাম পৰিষ্কাৰ কাৰ্য্য',
-'spam_reverting' => '$1 -লে সংযোগ নথকা সৰ্বশেষ পুনৰীক্ষনলে উভতি যোৱা',
-'spam_blanking' => 'সকলো পুনৰীক্ষনৰ $1 -লে সংযোগ আছিল, ৰিক্ত কৰা হৈছে',
+'spambot_username' => 'মিডিয়াৱিকি স্পাম পৰিষ্কাৰ কাৰ্য',
+'spam_reverting' => '$1লৈ সংযোগ নথকা সৰ্বশেষ পুনৰীক্ষনলে উভতাই নিয়া হৈছে',
+'spam_blanking' => 'সকলো পুনৰীক্ষনৰ $1লৈ সংযোগ আছিল, ৰিক্ত কৰা হৈছে',
 'spam_deleting' => 'সকলো পুনৰীক্ষণৰ $1লৈ সংযোগ আছিল, বিলোপ কৰা হৈছে',
 
 # Info page
 'pageinfo-title' => '"$1" ৰ তথ্য',
 'pageinfo-header-edits' => 'সম্পাদনাসমূহ',
-'pageinfo-header-watchlist' => 'লক্ষ্যতালিকা',
-'pageinfo-header-views' => 'দৰ্শন',
-'pageinfo-subjectpage' => 'পৃষ্ঠা',
-'pageinfo-talkpage' => 'আলোচনা পৃষ্ঠা',
+'pageinfo-views' => 'দৰ্শনৰ সংখ্যা',
 'pageinfo-watchers' => 'নিৰীক্ষকৰ সংখ্যা',
 'pageinfo-edits' => 'সম্পাদনাৰ সংখ্যা',
 'pageinfo-authors' => 'মুখ্য লেখকৰ সংখ্যা',
-'pageinfo-views' => 'দৰ্শনৰ সংখ্যা',
-'pageinfo-viewsperedit' => 'প্ৰতি সম্পাদনাৰ দৰ্শন',
 
 # Patrolling
 'markaspatrolleddiff' => 'নিৰীক্ষিত বুলি চিহ্নিত কৰক',
@@ -2891,23 +2962,23 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'rcpatroldisabledtext' => 'শেহতীয়া সালসলনিৰ নিৰীক্ষণ কাৰ্য বৰ্তমান নিষ্ক্ৰিয় হৈ আছে ।',
 'markedaspatrollederror' => 'নিৰীক্ষিত বুলি চিহ্নিত কৰিব নোৱাৰি',
 'markedaspatrollederrortext' => 'নিৰীক্ষণ কৰা বুলি চিহ্নিত কৰিবলৈ আপুনি এটা পুনৰীক্ষণ ধাৰ্য্য কৰিব লাগিব।',
-'markedaspatrollederror-noautopatrol' => 'à¦\86পà§\8bনাà¦\95 à¦¨à¦¿à¦\9cৰ à¦ªà§°à¦¿à§±à§°à§\8dতনসমà§\82হ à¦¨à§\80ৰিক্ষিত বুলি চিহ্নিত কৰাৰ অনুমতি নাই।',
+'markedaspatrollederror-noautopatrol' => 'à¦\86পà§\8bনাà¦\95 à¦¨à¦¿à¦\9cৰ à¦ªà§°à¦¿à§±à§°à§\8dতনসমà§\82হ à¦¨à¦¿ৰিক্ষিত বুলি চিহ্নিত কৰাৰ অনুমতি নাই।',
 
 # Patrol log
-'patrol-log-page' => "নিৰীক্ষণ ল'গ",
-'patrol-log-header' => "এইখন নিৰীক্ষিত সংশোধনসমূহৰ ল'গ ।",
-'log-show-hide-patrol' => "নিৰীক্ষণ ল'গ $1",
+'patrol-log-page' => 'নিৰীক্ষণ অভিলেখ',
+'patrol-log-header' => 'এইখন নিৰীক্ষিত সংশোধনসমূহৰ অভিলেখ ।',
+'log-show-hide-patrol' => 'নিৰীক্ষণ অভিলেখ $1',
 
 # Image deletion
 'deletedrevision' => 'পুৰণি সংশোধনী $1 বিলোপ কৰা হ’ল',
-'filedeleteerror-short' => 'ফাà¦\87ল বিলোপ কৰাত ত্ৰুটি: $1',
-'filedeleteerror-long' => 'à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fà§\8b বিলোপ কৰাত সমস্যা হৈছে :
+'filedeleteerror-short' => 'নথি বিলোপ কৰাত ত্ৰুটি: $1',
+'filedeleteerror-long' => 'à¦\8fà¦\87 à¦¨à¦¥à¦¿à¦\96ন বিলোপ কৰাত সমস্যা হৈছে :
 
 $1',
-'filedelete-missing' => '"$1" à¦«à¦¾à¦\87লà¦\9fà§\8b বিলোপ কৰিব পৰা নাযাব, কিয়নো ইয়াৰ কোনো অস্তিত্ব নাই ।',
+'filedelete-missing' => '"$1" à¦¨à¦¥à¦¿à¦\96ন বিলোপ কৰিব পৰা নাযাব, কিয়নো ইয়াৰ কোনো অস্তিত্ব নাই ।',
 'filedelete-old-unregistered' => 'নিৰ্ধাৰিত ফাইল সংশোধন "$1" তথ্যকোষত নাই ।',
-'filedelete-current-unregistered' => 'নিৰà§\8dধাৰিত à¦«à¦¾à¦\87ল "$1" তথ্যকোষত নাই ।',
-'filedelete-archive-read-only' => 'à¦\86ৰà§\8dà¦\95াà¦\87ভ à¦¡à¦¾à¦\87ৰà§\87à¦\95à¦\9fৰি "$1" ৱেবচাৰ্ভাৰ দ্বাৰা লিখিব নোৱাৰি।',
+'filedelete-current-unregistered' => 'নিৰà§\8dধাৰিত à¦¨à¦¥à¦¿ "$1" তথ্যকোষত নাই ।',
+'filedelete-archive-read-only' => 'à¦\86ৰà§\8dà¦\95াà¦\87ভ à¦¨à¦¿à§°à§\8dদà§\87শিà¦\95া "$1"ত ৱেবচাৰ্ভাৰ দ্বাৰা লিখিব নোৱাৰি।',
 
 # Browsing diffs
 'previousdiff' => 'প্ৰবীণ সম্পাদনা',
@@ -2924,9 +2995,9 @@ $1',
 'file-info-size-pages' => '$1 × $2 পিক্সেলসমূহ, নথিপত্ৰৰ আকাৰ: $3, MIME ধৰণ: $4, $5 {{PLURAL:$5|page|pages}}',
 'file-nohires' => 'ইয়াতকৈ ডাঙৰকৈ দেখুৱাব নোৱাৰি ।',
 'svg-long-desc' => 'SVG ফাইল, সাধাৰণতঃ $1 × $2 পিক্সেল, ফাইল মাত্ৰা: $3',
-'show-big-image' => 'সম্পূৰ্ণ দৃশ্য',
+'show-big-image' => "সম্পূৰ্ণ ৰিজ'লিউশ্যন",
 'show-big-image-preview' => 'এই খচৰাৰ আকাৰ: $1.',
-'show-big-image-other' => 'আন {{PLURAL:$2|ৰিজলিউচন|ৰিজলিউচনসমূহ}}: $1।',
+'show-big-image-other' => "আন {{PLURAL:$2|ৰিজ'লিউশ্যন|ৰিজ'লিউশ্যনসমূহ}}: $1।",
 'show-big-image-size' => '$1 × $2 পিক্সেল',
 'file-info-gif-looped' => 'লুপকৃত',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|ফ্ৰেম|ফ্ৰেম}}',
@@ -2939,7 +3010,7 @@ $1',
 'imagelisttext' => "তলত '''$1''' {{PLURAL:$1|file|files}} সজোঁৱা $2 -ৰ এটা তালিকা দিয়া আছে।",
 'newimages-summary' => "এই বিশেষ পৃষ্ঠাখনত সৰ্বশেষত আপল'ড কৰা ফাইলসমূহ দেখিব ।",
 'newimages-legend' => 'ছেকনী',
-'newimages-label' => 'ফাà¦\87লনাম (বা তাৰ এটা অংশ)',
+'newimages-label' => 'নথিৰ নাম (বা তাৰ এটা অংশ)',
 'showhidebots' => '(বট $1)',
 'noimages' => 'চাবলৈ একো নাই ।',
 'ilsubmit' => 'সন্ধান কৰক',
@@ -2963,7 +3034,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 # Metadata
 'metadata' => 'মেটাডেটা',
 'metadata-help' => 'এই ফাইলত অতিৰিক্ত খবৰ আছে, হয়তো ডিজিটেল কেমেৰা বা স্কেনাৰ ব্যৱহাৰ কৰি সৃষ্টি বা পৰিৱৰ্তন কৰা হৈছে ।
-এই ফাইলটো আচলৰ পৰা পৰিৱৰ্তন  কৰা হৈছে, সেয়েহে পৰিৱৰ্তিত ফাইলটোৰ সৈতে নিমিলিব পাৰে ।',
+এই ফাইলটো আচলৰ পৰা পৰিৱৰ্তন কৰা হৈছে, সেয়েহে পৰিৱৰ্তিত ফাইলটোৰ সৈতে নিমিলিব পাৰে ।',
 'metadata-expand' => 'বহলাই ইয়াৰ বিষয়ে জনাওক',
 'metadata-collapse' => 'বিষয় বৰ্ণনা নেদেখুৱাবলৈ',
 'metadata-fields' => 'এই সূচীত থকা বিষয়বোৰ চিত্ৰৰ পৃষ্ঠাৰ তলত দেখা যাব ।
@@ -2983,28 +3054,28 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 * gpsaltitude',
 
 # EXIF tags
-'exif-imagewidth' => 'বহল',
+'exif-imagewidth' => 'পà§\8dৰসà§\8dথ',
 'exif-imagelength' => 'উচ্চতা',
 'exif-bitspersample' => 'প্ৰতি অংশৰ বিট',
 'exif-compression' => 'সংকোচন আঁচনি',
 'exif-photometricinterpretation' => 'পিক্সেল গঠন',
 'exif-orientation' => 'দিশবিন্যাস',
 'exif-samplesperpixel' => 'উপাদানৰ সংখ্যা',
-'exif-planarconfiguration' => 'ডà§\87à¦\9fা বিন্যাস',
-'exif-ycbcrsubsampling' => 'Y to C -ৰ হাৰৰ উপনমুনা',
+'exif-planarconfiguration' => 'তথà§\8dয বিন্যাস',
+'exif-ycbcrsubsampling' => 'Y to Cৰ হাৰৰ উপনমুনা',
 'exif-ycbcrpositioning' => 'Y আৰু C অৱস্থান',
-'exif-xresolution' => 'আনুভূমিক ৰিজলিউচন',
-'exif-yresolution' => "উলম্ব ৰিজ'লিউচন",
+'exif-xresolution' => "আনুভূমিক ৰিজ'লিউশ্যন",
+'exif-yresolution' => "উলম্বিক ৰিজ'লিউশ্যন",
 'exif-stripoffsets' => 'ছবিৰ ডেটা অৱস্থান',
 'exif-rowsperstrip' => 'প্ৰতি ষ্ট্ৰিপত শাৰীসমূহৰ সংখ্যা',
 'exif-stripbytecounts' => 'প্ৰতি সংকোচিত স্ট্ৰিপ বাইটসমূহ',
-'exif-jpeginterchangeformat' => 'JPEG SOI -লে অফচেট',
+'exif-jpeginterchangeformat' => 'JPEG SOI’লৈ অফচেট',
 'exif-jpeginterchangeformatlength' => 'JPEG তথ্যৰ বাইটসমূহ',
 'exif-whitepoint' => 'বগা বিন্দুৰ বৰ্ণ',
 'exif-primarychromaticities' => 'প্ৰাথমিকতাৰ বৰ্ণসমূহ',
 'exif-ycbcrcoefficients' => 'ৰঙ স্থান পৰিৱৰ্তন সাঁচৰ গুণকসমূহ',
 'exif-referenceblackwhite' => 'কলা আৰু বগা প্ৰসংগ মানসমূহৰ যোৰ',
-'exif-datetime' => 'ফাà¦\87ল সলনিৰ তাৰিখ আৰু সময়',
+'exif-datetime' => 'নথিৰ সলনিৰ তাৰিখ আৰু সময়',
 'exif-imagedescription' => 'চিত্ৰ শিৰোনামা',
 'exif-make' => 'কেমেৰা নিৰ্মাতা',
 'exif-model' => 'কেমেৰা মডেল',
@@ -3031,7 +3102,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-exposureprogram' => 'উন্মুক্ত প্ৰগ্ৰাম',
 'exif-spectralsensitivity' => 'বৰ্ণালীৰ সংবেদ্যতা',
 'exif-isospeedratings' => 'ISO গতিৰ হাৰ',
-'exif-shutterspeedvalue' => 'APEX à¦াটাৰ গতি',
+'exif-shutterspeedvalue' => 'APEX à¦\9aাটাৰ গতি',
 'exif-aperturevalue' => 'APEX বিন্ধা',
 'exif-brightnessvalue' => 'APEX উজ্জ্বলতা',
 'exif-exposurebiasvalue' => 'APEX উন্মুক্ত পক্ষপাত',
@@ -3043,9 +3114,9 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-focallength' => "লেন্‌ছৰ ফ'কেল দৈৰ্ঘ্য",
 'exif-subjectarea' => 'বিষয়বস্তুৰ ক্ষেত্ৰফল',
 'exif-flashenergy' => 'ফ্লেছ শক্তি',
-'exif-focalplanexresolution' => 'X à¦«à§\8bà¦\95াà¦\9a à¦¤à¦²à§° à§°à¦¿à¦\9cà§\8bলà§\8bà¦\9aন',
-'exif-focalplaneyresolution' => 'Y à¦«à§\8bà¦\95াà¦\9a à¦¤à¦²à§° à§°à¦¿à¦\9cà§\8bলà§\8bà¦\9aন',
-'exif-focalplaneresolutionunit' => "ফ'কেল তল ৰিজ'লিউচন একক",
+'exif-focalplanexresolution' => 'X à¦«à§\8bà¦\95াà¦\9a à¦¤à¦²à§° à§°à¦¿à¦\9cলিà¦\89শà§\8dযন',
+'exif-focalplaneyresolution' => 'Y à¦«à§\8bà¦\95াà¦\9a à¦¤à¦²à§° à§°à¦¿à¦\9cলিà¦\89শà§\8dযন',
+'exif-focalplaneresolutionunit' => "ফ'কেল তল ৰিজলিউশ্যন একক",
 'exif-subjectlocation' => 'বিষয়বস্তুৰ স্থান',
 'exif-exposureindex' => 'উন্মুক্ত সূচী',
 'exif-sensingmethod' => 'সংবেদ পদ্ধতি',
@@ -3100,7 +3171,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-worldregioncreated' => "বিশ্বৰ অঞ্চল য'ত ছবিখন তোলা হৈছিল",
 'exif-countrycreated' => 'যি দেশত চিত্ৰখন গ্ৰহণ কৰা হৈছে',
 'exif-countrycodecreated' => "দেশৰ ক'ড য'ত ছবিখন তোলা হৈছিল",
-'exif-provinceorstatecreated' => "পà§\8dৰদà§\87শ à¦\85থবা à§°à¦¾à¦\9cà§\8dয à¦¯'ত à¦\9bবিà¦\9fà§\8b তোলা হৈছিল",
+'exif-provinceorstatecreated' => "পà§\8dৰদà§\87শ à¦\85থবা à§°à¦¾à¦\9cà§\8dয à¦¯'ত à¦\9bবিà¦\96ন তোলা হৈছিল",
 'exif-citycreated' => 'যি চহৰত চিত্ৰখন গ্ৰহণ কৰা হৈছে',
 'exif-sublocationcreated' => "নগৰৰ উপঅৱস্থান য'ত ছবিখন তোলা হৈছিল",
 'exif-worldregiondest' => 'বিশ্বৰ অঞ্চল দেখুওৱা হল',
@@ -3123,7 +3194,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-contact' => 'যোগাযোগৰ তথ্য',
 'exif-writer' => 'লেখক',
 'exif-languagecode' => 'ভাষা',
-'exif-iimversion' => 'IIM à¦¸à¦\82স্কৰণ',
+'exif-iimversion' => 'IIM à¦¸à¦\82ষ্কৰণ',
 'exif-iimcategory' => 'শ্ৰেণী',
 'exif-iimsupplementalcategory' => 'পৰিপূৰ্ণ বিভাগসমূহ',
 'exif-datetimeexpires' => 'পিছত ব্যৱহাৰ নকৰিব',
@@ -3136,33 +3207,33 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-label' => 'লেবেল',
 'exif-datetimemetadata' => 'মেটাডেটাৰ শেষ পৰিৱৰ্তনৰ তাৰিখ',
 'exif-nickname' => 'ছবিৰ খচৰা নাম',
-'exif-rating' => 'ৰà§\87à¦\9fিà¦\82 (out of 5)',
+'exif-rating' => 'মানাà¦\82à¦\95 (৫ৰ à¦­à¦¿à¦¤à§°à¦¤)',
 'exif-rightscertificate' => 'অধিকাৰিত্ব ব্যৱস্থাপনাৰ প্ৰমাণপত্ৰ',
 'exif-copyrighted' => 'স্বত্বাধিকাৰ স্থিতি',
 'exif-copyrightowner' => 'স্বত্বাধিকাৰী',
 'exif-usageterms' => 'ব্যৱহাৰ কৰাৰ চৰ্ত্ত',
-'exif-webstatement' => 'à¦\85নলাà¦\87ন à¦¸à§\8dবতà§\8dবাধিà¦\95াৰ à¦¬à§\8dযà¦\95à§\8dতবà§\8dয',
+'exif-webstatement' => 'অনলাইন স্বত্বাধিকাৰ বক্তব্য',
 'exif-originaldocumentid' => 'মূল ডকুমেণ্টৰ অদ্বিতীয় আই.ডি.',
 'exif-licenseurl' => 'কপিৰাইট অনুজ্ঞাপত্ৰৰ বাবে URL',
 'exif-morepermissionsurl' => 'অতিৰিক্ত অনুজ্ঞাপত্ৰৰ তথ্য',
 'exif-attributionurl' => 'এই কাৰ্যৰ পুনৰ ব্যৱহাৰ কৰিলে অনুগ্ৰহ এই লিংকটো যোগ কৰক',
 'exif-preferredattributionname' => 'এই কাম পুনৰ-ব্যৱহাৰ কৰোতে, অনুগ্ৰহ কৰি কৃতিত্ব দিব',
 'exif-pngfilecomment' => 'পি.এন.জি. ফাইল মন্তব্য',
-'exif-disclaimer' => 'দাবà§\80তà§\8dযাà¦\97',
+'exif-disclaimer' => 'দায়লà§\81পà§\8dতি',
 'exif-contentwarning' => 'বিষয়বস্তু সতৰ্কবাণী',
 'exif-giffilecomment' => 'জি.আই.এফ. ফাইল মন্তব্য',
 'exif-intellectualgenre' => 'আইটেমৰ প্ৰকাৰ',
 'exif-subjectnewscode' => 'বিষয় ক’ড',
 'exif-scenecode' => "IPTC দৃশ্য ক'ড",
 'exif-event' => 'ঘটনা বৰ্ণিত',
-'exif-organisationinimage' => 'সà¦\82à¦\98ঠন বৰ্ণিত',
+'exif-organisationinimage' => 'সà¦\82à¦\97ঠন বৰ্ণিত',
 'exif-personinimage' => 'ব্যক্তি বর্ণিত',
 'exif-originalimageheight' => "ক্ৰ'প কৰাৰ আগত ছবিৰ উচ্চতা",
 'exif-originalimagewidth' => "ক্ৰ'প কৰাৰ আগত ছবিৰ প্ৰস্থতা",
 
 # EXIF attributes
 'exif-compression-1' => 'অসংকুচিত',
-'exif-compression-2' => "CCITT দল ৩ ১-পৰিসৰ পৰিৱৰ্তীত Huffman চলন দৈৰ্ঘ এনক'ডিং",
+'exif-compression-2' => "CCITT দল ৩ ১-পৰিসৰ পৰিৱৰ্তীত Huffman চলন দৈৰ্ঘ্য এনক'ডিং",
 'exif-compression-3' => "CCITT দল ৩ ফেক্স এনক'ডিং",
 'exif-compression-4' => "CCITT দল ৪ ফেক্স এনক'ডিং",
 
@@ -3183,7 +3254,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-planarconfiguration-1' => 'খণ্ড বিন্যাস',
 'exif-planarconfiguration-2' => 'সমতলীয় বিন্যাস',
 
-'exif-colorspace-65535' => 'মানাংকন নহোৱা',
+'exif-colorspace-65535' => 'মানাà¦\82à¦\95ন à¦¨à§\8bহà§\8bৱা',
 
 'exif-componentsconfiguration-0' => 'অস্তিত্ব নাই',
 
@@ -3192,10 +3263,10 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-exposureprogram-2' => 'সাধাৰণ প্ৰ’গ্ৰেম',
 'exif-exposureprogram-3' => 'বিন্ধাৰ প্ৰাথমিকতা',
 'exif-exposureprogram-4' => 'শ্বাটাৰ প্ৰাথমিকতা',
-'exif-exposureprogram-5' => 'সà§\83ষà§\8dà¦\9fিমà§\82লà¦\95 à¦ªà§\8dৰà¦\97à§\8dৰাম (à¦\95à§\8dষà§\87তà§\8dৰৰ à¦\97ভà§\80ৰতাৰ à¦ªà§\8dৰতি à¦ªà¦\95à§\8dষপাতি)',
-'exif-exposureprogram-6' => "à¦\95াৰà§\8dযà§\8dযত à¦ªà§\8dৰ'à¦\97à§\8dৰাম (দà§\8dৰà§\81ত à¦¶à§\8dবাà¦\9fাৰ à¦\97তিৰ à¦ªà§\8dৰতি à¦ªà¦\95à§\8dষপাতি)",
-'exif-exposureprogram-7' => 'পà§\8dৰতিà¦\95à§\83তি à¦\85ৱসà§\8dথা (পà¦\9fভà§\82মি à¦«à¦\95াà¦\9aৰ à¦¬à¦¾à¦¹à¦¿à§° à¦¥à¦\95াà¦\95à§\87 à¦\95à§\8dলà§\8cà¦\9cà¦\86প à¦«à¦\9fà§\8bসমূহ)',
-'exif-exposureprogram-8' => 'লà§\87ণà§\8dডসà§\8dà¦\95à§\87à¦\87প à¦\85ৱসà§\8dথা (পà¦\9fভà§\82মি à¦«à¦\95াà¦\9aত à¦¥à¦\95াà¦\95à§\88 à¦²à§\87ণà§\8dডসà§\8dà¦\95à§\87à¦\87প à¦«à¦\9fà§\8bসমূহৰ বাবে)',
+'exif-exposureprogram-5' => 'সà§\83ষà§\8dà¦\9fিমà§\82লà¦\95 à¦ªà§\8dৰà¦\97à§\8dৰাম (à¦\95à§\8dষà§\87তà§\8dৰৰ à¦\97ভà§\80ৰতাৰ à¦ªà§\8dৰতি à¦ªà¦\95à§\8dষপাতবিশিষà§\8dà¦\9f)',
+'exif-exposureprogram-6' => "à¦\95াৰà§\8dযà§\8dযত à¦ªà§\8dৰ'à¦\97à§\8dৰাম (দà§\8dৰà§\81ত à¦¶à§\8dবাà¦\9fাৰ à¦\97তিৰ à¦ªà§\8dৰতি à¦ªà¦\95à§\8dষপাতবিশিষà§\8dà¦\9f)",
+'exif-exposureprogram-7' => 'পà§\8dৰতিà¦\95à§\83তি à¦\85ৱসà§\8dথা (পà¦\9fভà§\82মি à¦«à¦\95াà¦\9aৰ à¦¬à¦¾à¦¹à¦¿à§° à¦¥à¦\95াà¦\95à§\87 à¦\95à§\8dলà¦\9cà¦\86প à¦\9aিতà§\8dৰসমূহ)',
+'exif-exposureprogram-8' => 'লà§\87ণà§\8dডসà§\8dà¦\95à§\87প à¦\85ৱসà§\8dথা (পà¦\9fভà§\82মি à¦«à¦\95াà¦\9aত à¦¥à¦\95াà¦\95à§\88 à¦²à§\87ণà§\8dডসà§\8dà¦\95à§\87প à¦\9aিতà§\8dৰসমূহৰ বাবে)',
 
 'exif-subjectdistance-value' => '$1 মিটাৰ',
 
@@ -3211,7 +3282,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-lightsource-0' => 'অজ্ঞাত',
 'exif-lightsource-1' => 'দিনৰ পোহৰ',
 'exif-lightsource-2' => 'প্রতিপ্রভ',
-'exif-lightsource-3' => 'à¦\9fাà¦\82ষà§\8dà¦\9fà§\87ন (ভাসà§\8dবৰ পোহৰ)',
+'exif-lightsource-3' => 'à¦\9fাà¦\82ষà§\8dà¦\9fà§\87ন (ভাষà§\8dà¦\95ৰ পোহৰ)',
 'exif-lightsource-4' => 'ফ্লাছ',
 'exif-lightsource-9' => 'ফটফটীয়া বতৰ',
 'exif-lightsource-10' => 'ডাৱৰীয়া বতৰ',
@@ -3250,7 +3321,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 
 'exif-filesource-3' => 'ডিজিটাল স্টিল ক্যামেৰা',
 
-'exif-scenetype-1' => 'à¦\8fà¦\9fা প্ৰত্যক্ষভাৱে তোলা ছবি',
+'exif-scenetype-1' => 'à¦\8fà¦\96ন প্ৰত্যক্ষভাৱে তোলা ছবি',
 
 'exif-customrendered-0' => 'স্বাভাবিক প্রক্রিয়া',
 'exif-customrendered-1' => 'স্বনিৰ্বাচিত প্ৰক্ৰিয়া',
@@ -3263,7 +3334,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-whitebalance-1' => 'হস্তচালিত বগা ভাৰসাম্য',
 
 'exif-scenecapturetype-0' => 'প্ৰামাণিক',
-'exif-scenecapturetype-1' => 'লà§\87ণà§\8dডসà§\8dà¦\95à§\87à¦\87প',
+'exif-scenecapturetype-1' => 'নà§\88সৰà§\8dà¦\97িà¦\95',
 'exif-scenecapturetype-2' => 'প্ৰতিকৃতি',
 'exif-scenecapturetype-3' => 'ৰাতিৰ দৃশ্য',
 
@@ -3287,7 +3358,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 
 'exif-subjectdistancerange-0' => 'অজ্ঞাত',
 'exif-subjectdistancerange-1' => "মেক্ৰ'",
-'exif-subjectdistancerange-2' => 'à¦\89à¦\9aৰৰ দৃষ্টি',
+'exif-subjectdistancerange-2' => 'নিà¦\95à¦\9f দৃষ্টি',
 'exif-subjectdistancerange-3' => 'দূৰ দৃষ্টি',
 
 # Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
@@ -3299,7 +3370,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-gpslongitude-w' => 'পশ্চিম দ্রাঘিমা',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => 'সমà§\81দà§\8dৰপà§\83ষà§\8dঠৰ $1 {{PLURAL:$1|মিà¦\9fাৰ|মিà¦\9fাৰ}} à¦\89পৰত',
+'exif-gpsaltitude-above-sealevel' => 'সমà§\81দà§\8dৰপà§\83ষà§\8dঠৰ $1 {{PLURAL:$1|মিà¦\9fাৰ|মিà¦\9fাৰ}} à¦\93পৰত',
 'exif-gpsaltitude-below-sealevel' => 'সমুদ্ৰপৃষ্ঠৰ $1 {{PLURAL:$1|মিটাৰ|মিটাৰ}} তলত',
 
 'exif-gpsstatus-a' => 'পৰিমাপ চলি আছে',
@@ -3321,7 +3392,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-gpsdop-excellent' => 'অতি উত্তম ($1)',
 'exif-gpsdop-good' => 'ভাল ($1)',
 'exif-gpsdop-moderate' => 'মোটামুটি ($1)',
-'exif-gpsdop-fair' => 'ভাল ($1)',
+'exif-gpsdop-fair' => 'ধà§\81নà§\80য়া ($1)',
 'exif-gpsdop-poor' => 'বেয়া ($1)',
 
 'exif-objectcycle-a' => 'কেৱল পুৱা',
@@ -3335,7 +3406,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-ycbcrpositioning-1' => 'কেন্দ্ৰিত',
 'exif-ycbcrpositioning-2' => 'সমানভাৱে চাইট কৰা',
 
-'exif-dc-contributor' => 'à¦\85ৱদানà¦\95াৰà§\80সমà§\82হ',
+'exif-dc-contributor' => 'বৰà¦\99ণিদাতাসà¦\95ল',
 'exif-dc-coverage' => 'মাধ্যমৰ ব্যৱধানীক অথবা অস্থায়ী অৱকাশ',
 'exif-dc-date' => 'তাৰিখ(সমূহ)',
 'exif-dc-publisher' => 'প্ৰকাশক',
@@ -3392,7 +3463,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'confirmemail_send' => 'এটা নিশ্চিতকৰণ সংকেত মেইল কৰক',
 'confirmemail_sent' => 'নিশ্চিতকৰণ ই-মেইল পঠোৱা হৈছে ।',
 'confirmemail_oncreate' => 'আপোনাৰ ই-মেইল ঠিকনালৈ এটা নিশ্চিতকৰণ সংকেত পঠোৱা হৈছে ।
-লà¦\97à§\8dâ\80\8c-à¦\87ন কৰিবলৈ এই সংকেতৰ আৱশ্যক নাই, কিন্তু ৱিকিৰ যিকোনো ই-মেইল ভিত্তিক সেৱা সক্ৰিয় কৰিবলৈ ইয়াৰ প্ৰয়োজন হ’ব ।',
+পà§\8dৰৱà§\87শ কৰিবলৈ এই সংকেতৰ আৱশ্যক নাই, কিন্তু ৱিকিৰ যিকোনো ই-মেইল ভিত্তিক সেৱা সক্ৰিয় কৰিবলৈ ইয়াৰ প্ৰয়োজন হ’ব ।',
 'confirmemail_sendfailed' => '{{SITENAME}}এ আপোনালৈ নিশ্চিতকৰণ ই-মেইল পঠাব পৰা নাই ।
 অনুগ্ৰহ কৰি আপোনাৰ ই-মেইল ঠিকনা ভুল বৰ্ণ আছে নেকি পৰীক্ষা কৰক ।
 
@@ -3401,7 +3472,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 সম্ভৱতঃ ইয়াৰ ম্যাদ উকলি গৈছে ।',
 'confirmemail_needlogin' => 'আপোনাৰ ই-মেইল ঠিকনা নিশ্চিতকৰণৰ বাবে $1 কৰক ।',
 'confirmemail_success' => 'আপোনাৰ ই-মেইল ঠিকনা নিশ্চিতকৰণ কৰা হৈছে ।
-আপুনি এতিয়া [[Special:UserLogin|log in]] কৰক আৰু ৱিকি উপভোগ কৰক ।',
+আপুনি এতিয়া [[Special:UserLogin|প্ৰৱেশ]] কৰক আৰু ৱিকি উপভোগ কৰক ।',
 'confirmemail_loggedin' => 'আপোনাৰ ই-মেইল ঠিকনা নিশ্চিত কৰা হৈছে ।',
 'confirmemail_error' => 'আপোনাৰ নিশ্চিতকৰণ সংৰক্ষণ কৰাত কিছু সমস্যা হৈছে ।',
 'confirmemail_subject' => '{{SITENAME}} ই-মেইল ঠিকনা নিশ্চিতকৰণ',
@@ -3409,7 +3480,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 এটা একাউণ্ট "$2" পঞ্জীয়ন কৰিছে ।
 
 এই একাউণ্ট আপোনাৰ হয়নে নহয় নিশ্চিত কৰাৰ বাবে আৰু {{SITENAME}}ত ই-মেইল বৈশিষ্টসমূহ সক্ৰিয় কৰাৰ বাবে
-à¦\86পà§\8bনাৰ à¦¬à§\8dৰাà¦\89à¦\9cাৰত à¦\8fà¦\87 à¦¸à¦\82যà§\8bà¦\97à¦\9fà§\8b à¦\96à§\81লক:
+à¦\86পà§\8bনাৰ à¦¬à§\8dৰাà¦\89à¦\9cাৰত à¦\8fà¦\87 à¦¸à¦\82যà§\8bà¦\97à¦\9fà§\8b à¦\96à§\8bলক:
 
 $3
 
@@ -3459,20 +3530,20 @@ $5
 'deletedwhileediting' => "'''সতৰ্কবাণী''': আপুনি সম্পাদনা আৰম্ভ কৰাৰ পিছত পৃষ্ঠাখন বিলোপ কৰা হৈছে !",
 'confirmrecreate' => "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পিছত সদস্য [[User:$1|$1]] ([[User talk:$1|আলোচনা]])য়ে পৃষ্ঠাখন বিলোপ কৰিছে, তাৰ কাৰণ:
 : ''$2''
-à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦ªà§\81নৰà§\8dনিৰà§\8dমাণ কৰিব খোজাটো নিশ্চিত কৰক ।",
-'confirmrecreate-noreason' => 'à¦\86পà§\81নি à¦¸à¦®à§\8dপাদনা à¦\86ৰমà§\8dভ à¦\95ৰাৰ à¦ªà¦¿à¦\9bত à¦¸à¦¦à¦¸à§\8dয [[User:$1|$1]] ([[User talk:$1|à¦\86লà§\8bà¦\9aনা]])য়à§\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰিà¦\9bà§\87 à¥¤ à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦ªà§\81নৰà§\8dনিৰà§\8dমাণ কৰিব খোজাটো অনুগ্ৰহ কৰি নিশ্চিত কৰক ।',
+à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86à¦\95à§\8c à¦¸à§\83ষà§\8dà¦\9fি কৰিব খোজাটো নিশ্চিত কৰক ।",
+'confirmrecreate-noreason' => 'à¦\86পà§\81নি à¦¸à¦®à§\8dপাদনা à¦\86ৰমà§\8dভ à¦\95ৰাৰ à¦ªà¦¿à¦\9bত à¦¸à¦¦à¦¸à§\8dয [[User:$1|$1]] ([[User talk:$1|à¦\86লà§\8bà¦\9aনা]])য়à§\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰিà¦\9bà§\87 à¥¤ à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86à¦\95à§\8c à¦¸à§\83ষà§\8dà¦\9fি কৰিব খোজাটো অনুগ্ৰহ কৰি নিশ্চিত কৰক ।',
 'recreate' => 'পুনৰ সৃষ্টি কৰক',
 
 # action=purge
-'confirm_purge_button' => "অ'কে",
-'confirm-purge-top' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦\95à§\87শà§\8dবà§\87 খালী কৰা হওক ?',
-'confirm-purge-bottom' => "à¦\8fà¦\96ন à¦ªà§\83ষà§\8dঠাà¦\95 à¦¶à§\8bধিত à¦\95ৰিলà§\87 à¦\95à§\87শà§\8dবà§\87 আতৰি যায় আৰু সকলোতকৈ শেহতীয়া সংশোধন প্ৰদৰ্শিত হ'বলৈ বাধ্য কৰে।",
+'confirm_purge_button' => 'ঠিক আছে',
+'confirm-purge-top' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦\95à§\87à¦\9aà§\8dâ\80\8c খালী কৰা হওক ?',
+'confirm-purge-bottom' => "à¦\8fà¦\96ন à¦ªà§\83ষà§\8dঠাà¦\95 à¦¶à§\8bধিত à¦\95ৰিলà§\87 à¦\95à§\87à¦\9aà§\8dâ\80\8c আতৰি যায় আৰু সকলোতকৈ শেহতীয়া সংশোধন প্ৰদৰ্শিত হ'বলৈ বাধ্য কৰে।",
 
 # action=watch/unwatch
-'confirm-watch-button' => 'à¦\85â\80\99à¦\95ে',
-'confirm-watch-top' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86পà§\8bনাৰ à¦²à¦\95à§\8dষà§\8dয-তালিà¦\95াত à¦¯à§\8bà¦\97 à¦\95ৰা à¦¯à¦¾à¦\93à¦\95 ?',
-'confirm-unwatch-button' => 'à¦\85â\80\99à¦\95ে',
-'confirm-unwatch-top' => 'এই পৃষ্ঠাখন আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰ কৰা হওক ?',
+'confirm-watch-button' => 'ঠিà¦\95 à¦\86à¦\9bে',
+'confirm-watch-top' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86পà§\8bনাৰ à¦²à¦\95à§\8dষà§\8dয-তালিà¦\95াত à¦¯à§\8bà¦\97 à¦\95ৰà¦\95',
+'confirm-unwatch-button' => 'ঠিà¦\95 à¦\86à¦\9bে',
+'confirm-unwatch-top' => 'এই পৃষ্ঠাখন আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰাওক',
 
 # Multipage image navigation
 'imgmultipageprev' => '← পূৰ্বৱৰ্তী পৃষ্ঠা',
@@ -3494,37 +3565,37 @@ $5
 
 # Auto-summaries
 'autosumm-blank' => "পৃষ্ঠাখন খালী কৰা হ'ল",
-'autosumm-replace' => 'বিষয়বসà§\8dতà§\81ক "$1"ৰে সলনি কৰা হ\'ল',
+'autosumm-replace' => 'পà§\84ষà§\8dঠাà¦\96নক "$1"ৰে সলনি কৰা হ\'ল',
 'autoredircomment' => "[[$1]]-ক পুনৰ্নিৰ্দেশ কৰা হ'ল",
 'autosumm-new' => '"$1" দি পৃষ্ঠা সৃষ্টি কৰা হ\'ল',
 
 # Live preview
 'livepreview-loading' => "ল'ড হৈ আছে…",
 'livepreview-ready' => "ল'ড হৈ আছে… প্ৰস্তুত!",
-'livepreview-failed' => "à¦\9cà§\80ৱনà§\8dত à¦ªà§\82ৰà§\8dবদৰ্শন ব্যৰ্থ হ'ল!
-সাধাৰণ à¦ªà§\82ৰà§\8dবদৰ্শন চেষ্টা কৰি চাওক।",
+'livepreview-failed' => "à¦\9cà§\80ৱনà§\8dত à¦ªà§\8dৰাà¦\95দৰ্শন ব্যৰ্থ হ'ল!
+সাধাৰণ à¦ªà§\8dৰাà¦\95দৰ্শন চেষ্টা কৰি চাওক।",
 'livepreview-error' => 'সংযোগ কৰিবলে ব্যৰ্থ হল: $1 "$2"।
-সাধাৰণ à¦ªà§\82ৰà§\8dবদৰ্শন চেষ্টা কৰি চাওক।',
+সাধাৰণ à¦ªà§\8dৰাà¦\95দৰ্শন চেষ্টা কৰি চাওক।',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => '$1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} -কে নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুৱা নহবও পাৰে।',
-'lag-warn-high' => 'উচ্চ ডাটাবেইচ চাৰ্ভাৰ পলমৰ বাবে, $1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} -কে নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুৱা নহবও পাৰে।',
+'lag-warn-normal' => '$1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} তকৈ নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুওৱা নহবও পাৰে।',
+'lag-warn-high' => 'উচ্চ ডাটাবেইচ চাৰ্ভাৰ পলমৰ বাবে, $1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} তকৈ নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুওৱা নহবও পাৰে।',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'কথাবতৰা পৃষ্ঠাসমূহ বাদ দি আপোনাৰ লক্ষ্য-তালিকাত {{PLURAL:$1|এটা শিৰোনামা|$1 টা শিৰোনামা}} আছে ।',
 'watchlistedit-noitems' => 'আপোনাৰ লক্ষ্য-তালিকাত এখনো ঘাই পৃষ্ঠা নাই ।',
 'watchlistedit-normal-title' => 'লক্ষ্য-তালিকা সম্পাদন কৰক',
 'watchlistedit-normal-legend' => 'লক্ষ্য-তালিকাৰ পৰা শিৰোনামা আঁতৰাওক',
-'watchlistedit-normal-explain' => 'Titles on your watchlist are shown below.
-To remove a title, check the box next to it, and click "{{int:Watchlistedit-normal-submit}}".
-You can also [[Special:EditWatchlist/raw|edit the raw list]].',
+'watchlistedit-normal-explain' => 'আপোনাৰ নজৰ তালিকাত থকা সূচীবদ্ধ পৃষ্ঠা তলত দেখুওৱা হৈছে।
+পৃষ্ঠা সূচী আৰৰাবলৈ তাৰ আগত দিয়া বাকচত ক্লিক কৰক, আৰু "{{int:Watchlistedit-normal-submit}}"ত ক্লিক কৰক।
+আপুনি [[Special:EditWatchlist/raw|মূল তালিকাখনো]] সম্পাদনা কৰিব পাৰে।',
 'watchlistedit-normal-submit' => 'শিৰোনামা আঁতৰাওক',
 'watchlistedit-normal-done' => "{{PLURAL:$1|এটা শিৰোনামা|$1 টা শিৰোনামা}} আপোনাৰ লক্ষ্যতালিকাৰ পৰা আঁতৰোৱা হ'ল:",
 'watchlistedit-raw-title' => 'অশোধিত অনুসৰণ-তালিকা সম্পাদন কৰক',
 'watchlistedit-raw-legend' => 'অশোধিত অনুসৰণ-তালিকা সম্পাদন কৰক',
-'watchlistedit-raw-explain' => 'আপোনাৰ দৰ্শনতালিকাত থকা শীৰ্ষকসমূহ তলত দেখুৱা হৈছে, আৰু তালিকালে যোগ কৰি অথবা তালিকাৰ পৰা আতৰাই সম্পাদন কৰিব পাৰি;
+'watchlistedit-raw-explain' => 'আপোনাৰ দৰ্শন তালিকাত থকা শীৰ্ষকসমূহ তলত দেখুওৱা হৈছে, আৰু তালিকালৈ যোগ কৰি অথবা তালিকাৰ পৰা আতৰাই সম্পাদন কৰিব পাৰি;
 প্ৰতি শাৰী এটা শীৰ্ষক হিচাপে।
-যেতিয়া সম্পূৰ্ণ হব, "{{int:Watchlistedit-raw-submit}}" -ত ক্লিক কৰিব।
+যেতিয়া সম্পূৰ্ণ হব, "{{int:Watchlistedit-raw-submit}}"ত ক্লিক কৰিব।
 আপুনি লগতে [[Special:EditWatchlist|প্ৰামাণিক সম্পাদকক ব্যৱহাৰ কৰিব পাৰে]]।',
 'watchlistedit-raw-titles' => 'শিৰোনামা:',
 'watchlistedit-raw-submit' => 'লক্ষ্য-তালিকা আপডেট কৰক',
@@ -3542,7 +3613,7 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'অজ্ঞাত এক্সটেনচন টেগ "$1"',
-'duplicate-defaultsort' => '\'\'\'সাৱধান!\'\'\' পূৰ্বনিৰ্ধাৰিত ক্ৰমসূচক "$2"-এ আগৰ ক্ৰমসূচক "$1"-অক বিস্থাপিত কৰিছে।',
+'duplicate-defaultsort' => '\'\'\'সাৱধান!\'\'\' পূৰ্বনিৰ্ধাৰিত ক্ৰমসূচক "$2"-এ আগৰ ক্ৰমসূচক "$1"ক বিস্থাপিত কৰিছে।',
 
 # Special:Version
 'version' => 'সংস্কৰণ',
@@ -3564,10 +3635,10 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'version-license' => 'অনুজ্ঞাপত্ৰ',
 'version-poweredby-credits' => "এই ৱিকি '''[//www.mediawiki.org/ মিডিয়াৱিকিৰ]''' দ্বাৰা প্ৰচলিত , কপিৰাইট © ২০০১-$1 $2.",
 'version-poweredby-others' => 'অন্য',
-'version-license-info' => "মিডিয়াৱিà¦\95ি à¦\8fà¦\9fা à¦¬à¦¿à¦¨à¦¾à¦®à§\82লà§\80য়া à¦\9aফà§\8dà¦\9fৱà§\87ৰ; à¦\86পà§\81নি Free Software Foundation -ৰ à¦¦à§\8dবাৰা à¦ªà§\8dৰà¦\95াশিত GNU General Public License -ৰ à¦\9aà§\81à¦\95à§\8dতিসমà§\82হৰ à¦\85নà§\8dতৰà§\8dà¦\97ত à¦\87য়াà¦\95 à¦ªà§\81নৰ à¦¬à¦¿à¦²à¦¾à¦¬ à¦ªà¦¾à§°à¦¿à¦¬ à¦\85থবা à¦¸à¦²à¦¨à¦¿  à¦\95ৰিব à¦ªà¦¾à§°à¦¿à¦¬; à¦¹à¦¯à¦¼à¦¤à§\8b à¦²à¦¾à¦\87à¦\9aà§\87à¦\9eà§\8dà¦\9aৰ সংস্কৰণ ২ 
-à¦\85থবা (à¦\86পà§\81নাৰ বিকল্পত) যিকোনো পৰৱৰ্তী সংস্কৰণ।
+'version-license-info' => "মিডিয়াৱিà¦\95ি à¦\8fà¦\9fা à¦¬à¦¿à¦¨à¦¾à¦®à§\82লà§\80য়া à¦\9aফà§\8dà¦\9fৱà§\87ৰ; à¦\86পà§\81নি Free Software Foundation -ৰ à¦¦à§\8dবাৰা à¦ªà§\8dৰà¦\95াশিত GNU General Public License -ৰ à¦\9aà§\81à¦\95à§\8dতিসমà§\82হৰ à¦\85নà§\8dতৰà§\8dà¦\97ত à¦\87য়াà¦\95 à¦ªà§\81নৰ à¦¬à¦¿à¦¤à§°à¦£ à¦\95ৰিব à¦ªà¦¾à§°à¦¿à¦¬ à¦\85থবা à¦¸à¦²à¦¨à¦¿ à¦\95ৰিব à¦ªà¦¾à§°à¦¿à¦¬; à¦¹à¦¯à¦¼à¦¤à§\8b à¦\85নà§\81à¦\9cà§\8dà¦\9eাপতà§\8dৰৰ সংস্কৰণ ২ 
+à¦\85থবা (à¦\86পà§\8bনাৰ বিকল্পত) যিকোনো পৰৱৰ্তী সংস্কৰণ।
 
-মিডিয়াৱিà¦\95ি à¦\8fà¦\87à¦\9fà§\8b à¦\86শাত à¦¬à¦¿à¦²à§\8bৱা হৈছে যে ই ব্যৱহাৰযোগ্য হ'ব, কিন্তু কোনো ৱাৰেন্টি নথকাকৈ; ব্যৱসায়ীক অথবা কোনো এটা বিশেষ কাৰণৰ যোগ্যতাৰ বাবে বুজোৱা ৱাৰেন্টি নথকাকৈ। 
+মিডিয়াৱিà¦\95ি à¦\8fà¦\87à¦\9fà§\8b à¦\86শাত à¦¬à¦¿à¦¤à§°à¦£ à¦\95ৰা হৈছে যে ই ব্যৱহাৰযোগ্য হ'ব, কিন্তু কোনো ৱাৰেন্টি নথকাকৈ; ব্যৱসায়ীক অথবা কোনো এটা বিশেষ কাৰণৰ যোগ্যতাৰ বাবে বুজোৱা ৱাৰেন্টি নথকাকৈ। 
 অধিক জানিবলৈ GNU General Public License চাওক।
 
 আপুনি এই প্ৰগ্ৰামৰ সৈতে [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License -ৰ এটা কপি] পাব লাগে; যদি নাই পোৱা, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA অথবা [//www.gnu.org/licenses/old-licenses/gpl-2.0.html ইয়াক অনলাইন পঢ়ক] -লে লিখক।",
@@ -3579,8 +3650,8 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'version-entrypoints-header-url' => 'ইউআৰএল',
 
 # Special:FilePath
-'filepath' => 'ফাà¦\87ল পথ',
-'filepath-page' => 'ফাà¦\87ল:',
+'filepath' => 'নথিৰ পথ',
+'filepath-page' => 'নথি:',
 'filepath-submit' => 'যাওক',
 'filepath-summary' => 'এই বিশেষ পৃষ্ঠায় এটা নথিপত্ৰৰ বাবে সম্পূৰ্ণ পথ ঘুৰাই পঠায়।
 ছবিসমূহক সম্পূৰ্ণ বিভেদনত দেখুৱা হয়, অন্য নথিপত্ৰ ধৰণসমূহ সিহতৰ সংলঘ্ন প্ৰগ্ৰামৰ সৈতে প্ৰত্যক্ষভাৱে আৰম্ভ হয়।',
@@ -3589,12 +3660,12 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'fileduplicatesearch' => 'প্ৰতিলিপি পৃষ্ঠাসমূহ অনুসন্ধান কৰক',
 'fileduplicatesearch-summary' => 'হেছ্‌ মানসমূহৰ উপৰত নিৰ্ভৰ কৰি প্ৰতিলিপিত নথিপত্ৰসমূহৰ বাবে সন্ধান কৰক।',
 'fileduplicatesearch-legend' => 'প্ৰতিলিপিৰ বাবে অনুসন্ধান কৰক',
-'fileduplicatesearch-filename' => 'ফাইলনাম:',
+'fileduplicatesearch-filename' => 'ফাà¦\87লৰ à¦¨à¦¾à¦®:',
 'fileduplicatesearch-submit' => 'সন্ধান কৰক',
 'fileduplicatesearch-info' => '$1 × $2 পিক্সেল<br /> ফাইলৰ মাত্ৰা: $3<br /> MIME প্ৰকাৰ: $4',
-'fileduplicatesearch-result-1' => '"$1" à¦«à¦¾à¦\87লৰ কোনো প্ৰতিলিপি নাই ।',
+'fileduplicatesearch-result-1' => '"$1" à¦¨à¦¥à¦¿ৰ কোনো প্ৰতিলিপি নাই ।',
 'fileduplicatesearch-result-n' => '"$1" ফাইলৰ {{PLURAL:$2|এটা প্ৰতিলিপি|$2টা প্ৰতিলিপি}} আছে ।',
-'fileduplicatesearch-noresults' => 'à¦\95à§\8bনà§\8b "$1" à¦¨à¦¾à¦®à§° à¦«à¦¾à¦\87ল à¦¸à¦¨à§\8dধান à¦ªà§\8bৱা à¦¨à¦\97ল ।',
+'fileduplicatesearch-noresults' => 'à¦\95à§\8bনà§\8b "$1" à¦¨à¦¾à¦®à§° à¦¨à¦¥à¦¿à§° à¦¸à¦¨à§\8dধান à¦ªà§\8bৱা à¦¨à¦\97â\80\99ল ।',
 
 # Special:SpecialPages
 'specialpages' => 'বিশেষ পৃষ্ঠাসমূহ',
@@ -3605,7 +3676,7 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'specialpages-group-maintenance' => 'তত্বাৱধানৰ কাৰ্যবিৱৰণীসমূহ',
 'specialpages-group-other' => 'অন্যান্য বিশেষ পৃষ্ঠাসমূহ',
 'specialpages-group-login' => 'প্ৰৱেশ/সদস্যভুক্তি',
-'specialpages-group-changes' => "সাম্প্ৰতিক সালসলনি আৰু ল'গসমূহ",
+'specialpages-group-changes' => 'সাম্প্ৰতিক সালসলনি আৰু অভিলেখসমূহ',
 'specialpages-group-media' => "মিডিয়া বিৱৰণী আৰু আপল'ডসমূহ",
 'specialpages-group-users' => 'সদস্যবৃন্দ আৰু অধিকাৰসমূহ',
 'specialpages-group-highuse' => 'অধিক ব্যবহৃত পৃষ্ঠাসমূহ',
@@ -3616,13 +3687,13 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'specialpages-group-spam' => 'স্পাম সা-সঁজুলি',
 
 # Special:BlankPage
-'blankpage' => 'à¦\96ালà§\80 পৃষ্ঠা',
+'blankpage' => 'à¦\89à¦\95া পৃষ্ঠা',
 'intentionallyblankpage' => 'এই পৃষ্ঠা ইচ্ছাকৃতভাৱে খালী ৰখা হৈছে ।',
 
 # External image whitelist
 'external_image_whitelist' => " #এই শাৰী যেনেকৈ আছে তেনেকৈয়ে ৰাখক<pre>
 #স্বাভাৱিক অভিব্যক্তি অংশসমূহ (কেৱল সেই অংশ যি // মাজেৰে যায়) তলত দিয়ক
-#ইহঁতক বহিৰ্তম (hotlinked) ছবিসমূহৰ URLসমূহৰ সৈতে মিলাই চোৱা হ'ব
+#ইহঁতক বহিৰ্তম (hotlinked) ছবিসমূহৰ URL সমূহৰ সৈতে মিলাই চোৱা হ'ব
 #যিসমূহ মিল খায় সেইসমূহক ছবি হিচাপে প্ৰদৰ্শন কৰা হব, নহলে কেৱল ছবিখনলৈ এটা সংযোগ দেখুওৱা হ'ব
 # # -ৰ সৈতে আৰম্ভ হোৱা শাৰীসমূহক মন্তব্য বুলি ধৰা হয়
 #ই ফলা-সংবেদ্য
@@ -3630,8 +3701,8 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 #সকলো regex অংশক এই শাৰীৰ ওপৰত দিব। এই শাৰী যেনেকৈ আছে তেনেকৈয়ে ৰাখক</pre>",
 
 # Special:Tags
-'tags' => 'সালসলনি টেগ চাওক',
-'tag-filter' => '[[Special:Tags|Tag]] ছেকনী:',
+'tags' => 'সালসলনি টেগসমূহ চাওক',
+'tag-filter' => '[[Special:Tags|টেগ]] ছেকনী:',
 'tag-filter-submit' => 'সংশোধন',
 'tags-title' => 'টেগসমূহ',
 'tags-intro' => 'ছফ্টৱেৰে সম্পাদনা চিহ্নিত কৰিব পৰা টেগসমূহ আৰু সেইবোৰৰ অৰ্থ এই পৃষ্ঠাত তালিকাভুক্ত কৰা হৈছে ।',
@@ -3662,12 +3733,12 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'dberr-info' => '(তথ্যকোষৰ চাৰ্ভাৰৰ লগত যোগাযোগ কৰিব নোৱাৰি: $1)',
 'dberr-usegoogle' => 'এই পৰিস্থিতিত আপুনি গুগলৰ মাধ্যমেৰে অনুসন্ধান কৰিব পাৰে ।',
 'dberr-outofdate' => "মন কৰক যে, আমাৰ বিষয়বস্তু সম্পৰ্কে তেওঁলোকৰ সূচী পুৰণা হ'ব পাৰে ।",
-'dberr-cachederror' => "à¦\8fà¦\87à¦\96ন à¦\85নà§\81ৰà§\8bধ à¦\95ৰা à¦ªà§\83ষà§\8dঠাৰ à¦\95à§\87শà§\8dবà§\8dâ\80\8cড à¦\95পà§\80, à¦¨à¦¬à§\80à¦\95ৰণ à¦¨à¦\95ৰা হ'ব পাৰে ।",
+'dberr-cachederror' => "à¦\8fà¦\87à¦\96ন à¦\85নà§\81ৰà§\8bধ à¦\95ৰা à¦ªà§\83ষà§\8dঠাৰ à¦\95à§\87à¦\9aà§\8dâ\80\8cড à¦²à¦¿à¦ªà¦¿, à¦¯à¦¿à¦\96ন à¦¨à¦¬à§\80à¦\95ৰণ à¦¨à¦\95ৰাà¦\93 হ'ব পাৰে ।",
 
 # HTML forms
-'htmlform-invalid-input' => 'à¦\86পà§\8bনাৰ à¦\95িà¦\9bà§\81মান à¦\87নপà§\81à¦\9fৰ à¦²à¦\97ত সমস্যা হৈছে',
+'htmlform-invalid-input' => 'à¦\86পà§\8bনাৰ à¦\85নà§\8dতৰà§\8dভà§\81à¦\95à§\8dতিত à¦\95িà¦\9bà§\81মান সমস্যা হৈছে',
 'htmlform-select-badoption' => 'আপুনি ধাৰ্য কৰা মান উপযুক্ত বিকল্প নহয়।',
-'htmlform-int-invalid' => 'à¦\85পà§\81নি à¦§à¦¾à§°à§\8dয à¦\95ৰা à¦®à¦¾à¦¨ à¦\87নà§\8dà¦\9fà§\87à¦\9cাৰ (integer) নহয়।',
+'htmlform-int-invalid' => 'à¦\85পà§\81নি à¦§à¦¾à§°à§\8dয à¦\95ৰা à¦®à¦¾à¦¨ à¦\85à¦\96ণà§\8dড à¦¸à¦\82à¦\96à§\8dযা (integer) নহয়।',
 'htmlform-float-invalid' => 'অপুনি ধাৰ্য কৰা মান সংখ্যা নহয়।',
 'htmlform-int-toolow' => 'আপুনি ধাৰ্য কৰা মান ন্যূনতম $1 তকৈ তলত',
 'htmlform-int-toohigh' => 'আপুনি ধাৰ্য কৰা মান অধিকতম $1 তকৈ ওপৰত',
@@ -3681,14 +3752,14 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'sqlite-no-fts' => '$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন অবিহনে',
 
 # New logging system
-'logentry-delete-delete' => '$1 মচি পেলোৱা হল পৃষ্ঠা $3',
-'logentry-delete-restore' => '$1 পুনৰ সংৰক্ষণ কৰা হল পৃষ্ঠা $3',
+'logentry-delete-delete' => '$1’ৰ দ্বাৰা $3 পৃষ্ঠাখন বিলোপ কৰা হ’ল',
+'logentry-delete-restore' => '$1 পুনৰ সংৰক্ষণ কৰা হল পৃষ্ঠা $3',
 'logentry-delete-event' => '$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা দৃশ্যমানতা',
-'logentry-delete-revision' => 'পৃষ্ঠা $3: $4 -ত {{PLURAL:$5|এটা পুনৰীক্ষন|$5 পুনৰীক্ষনসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা হল দৃশ্যমানতা',
-'logentry-delete-event-legacy' => '$3 -ত লগ ঘটনামসমূহৰ $1 changed দৃশ্যমানতা',
-'logentry-delete-revision-legacy' => 'পৃষ্ঠা $3 -ত পুনৰীক্ষনসমূহৰ $1 changed দৃশ্যমানতা',
+'logentry-delete-revision' => 'পৃষ্ঠা $3: $4ত {{PLURAL:$5|এটা পুনৰীক্ষন|$5 পুনৰীক্ষনসমূহ}}ৰ $1 দৃশ্যমানতা পৰিৱৰ্তন কৰা হ’ল',
+'logentry-delete-event-legacy' => '$3ত অভিলেখ ঘটনামসমূহৰ $1 দৃশ্যমানতা পৰিৱৰ্তন কৰা হ’ল',
+'logentry-delete-revision-legacy' => 'পৃষ্ঠা $3ত পুনৰীক্ষনসমূহৰ $1 দৃশ্যমানতা পৰিৱৰ্তন কৰা হল',
 'logentry-suppress-delete' => '$1 সংকোচিত পৃষ্ঠা $3',
-'logentry-suppress-event' => '$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 গোপন পৰিৱৰ্তন কৰা হল দৃশ্যমানতা',
+'logentry-suppress-event' => '$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 গোপন পৰিৱৰ্তন কৰা হল দৃশ্যমানতা',
 'logentry-suppress-revision' => 'পৃষ্ঠা $3: $4 -ত {{PLURAL:$5|এটা পুনৰীক্ষন|$5 পুনৰীক্ষনসমূহ}} -ৰ $1 গোপন পৰিৱৰ্তনসমূহ দৃশ্যমানতা',
 'logentry-suppress-event-legacy' => '$3 -ত লগ ঘটনাসমূহৰ $1 গোপন পৰিৱৰ্তন কৰা হল দৃশ্যমানতা',
 'logentry-suppress-revision-legacy' => 'পৃষ্ঠা $3 -ত পুনৰীক্ষনসমূহৰ $1 গোপন পৰিৱৰ্তন কৰা হল',
@@ -3700,21 +3771,21 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'revdelete-uname-unhid' => 'সদস্যনাম মুকলি কৰা হৈছে',
 'revdelete-restricted' => 'এই সীমাবদ্ধতা প্ৰশাসকৰ ক্ষেত্ৰত প্ৰযোজ্য',
 'revdelete-unrestricted' => 'প্ৰশাসকৰ সীমাবদ্ধতা বাতিল কৰা হ’ল',
-'logentry-move-move' => 'পৃষ্ঠা $3 -ৰ পৰা $4 -লে $1 স্থানান্তৰ কৰা হল',
-'logentry-move-move-noredirect' => 'পুনৰ্নিৰ্দেশ নেৰাকৈ $1 স্থানান্তৰ কৰা হল পৃষ্ঠা $3 -ৰ পৰা $4',
-'logentry-move-move_redir' => 'পুনৰ্নিৰ্দেশৰে পৃষ্ঠা $3 -ৰ পৰা $4 $1 স্থানান্তৰ কৰা হল',
+'logentry-move-move' => 'পৃষ্ঠা $3ৰ পৰা $4লৈ $1য়ে স্থানান্তৰ কৰিলে',
+'logentry-move-move-noredirect' => '$1য়ে পুনৰ্নিৰ্দেশ নেৰাকৈ পৃষ্ঠা $3ৰ পৰা $4লৈ স্থানান্তৰ কৰিলে',
+'logentry-move-move_redir' => 'পুনৰ্নিৰ্দেশৰে পৃষ্ঠা $3ৰ পৰা $4 $1লৈ স্থানান্তৰ কৰা হ’ল',
 'logentry-move-move_redir-noredirect' => 'পুনৰ্নিৰ্দেশ নেৰাকৈ এটা পুনৰ্নিৰ্দেশৰ ওপৰেৰে পৃষ্ঠা $3 -ৰ পৰা $4 $1 স্থানান্তৰ কৰা হল',
 '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-newusers' => '$1’য়ে এটা ব্যৱহাৰকাৰী একাউণ্ট সৃষ্টি কৰিলে',
+'logentry-newusers-create' => '$1য়ে এটা ব্যৱহাৰকাৰী একাউণ্ট সৃষ্টি কৰিলে',
+'logentry-newusers-create2' => '$1’য়ে এটা ব্যৱহাৰকাৰী একাউণ্ট $3 সৃষ্টি কৰিলে',
+'logentry-newusers-autocreate' => '$1’ৰ একাউণ্ট স্বয়ংক্ৰিয়ভাৱে সৃষ্টি কৰা হৈছিল',
 'newuserlog-byemail' => 'গুপ্তশব্দ ই-মেইল কৰি পঠোৱা হৈছে',
 
 # Feedback
 'feedback-bugornote' => 'যদি আপুনি এটা কাৰিকৰী সমস্যাৰ বিৱৰণ দিবলৈ প্ৰস্তুত, অনুগ্ৰহ কৰি [$1 এটা বাগ ৰিপ\'ৰ্ট কৰক]।
-নহ\'লে আপুনি তলৰ সহজ ফৰ্ম ব্যৱহাৰ কৰিব পাৰিব। আপোনাৰ মন্তব্য আপোনাৰ সদস্যনাম আৰু আপুনি ব্যৱহাৰ কৰা ব্ৰাউজাৰৰ সৈতে "[$3 $2]" -পৃষ্ঠাত যোগ কৰা হ\'ব।',
+নহ\'লে আপুনি তলৰ সহজ ফৰ্ম ব্যৱহাৰ কৰিব পাৰিব। আপোনাৰ মন্তব্য আপোনাৰ সদস্যনাম আৰু আপুনি ব্যৱহাৰ কৰা ব্ৰাউজাৰৰ সৈতে "[$3 $2]" -পৃষ্ঠাত যোগ কৰা হ\'ব।',
 'feedback-subject' => 'বিষয়:',
 'feedback-message' => 'বাৰ্তা:',
 'feedback-cancel' => 'বাতিল কৰক',
@@ -3730,19 +3801,22 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 
 # API errors
 'api-error-badaccess-groups' => "এই ৱিকিত ফাইল আপল'ড কৰিবলৈ আপোনাৰ অনুমতি নাই।",
-'api-error-badtoken' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ à¦¤à§\8dৰà§\81à¦\9fি: à¦¬à§\87য়া টোকেন।',
-'api-error-copyuploaddisabled' => "ইউ আৰ এল-ৰ মাধ্যমেৰে আপল'ড কৰাটো এই চাৰ্ভাৰত নিষ্ক্ৰিয় কৰা হৈছে।",
+'api-error-badtoken' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ à¦¤à§\8dৰà§\81à¦\9fি: à¦­à§\81ল টোকেন।',
+'api-error-copyuploaddisabled' => "ইউ আৰ এলৰ মাধ্যমেৰে আপল'ড কৰাটো এই চাৰ্ভাৰত নিষ্ক্ৰিয় কৰা হৈছে।",
 'api-error-duplicate' => 'এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|[$2 আন এটা ফাইল]|[$2 আন কিছুমান ফাইল]}} ইতিমধ্যেই আছে।',
 'api-error-duplicate-archive' => 'এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|[$2 আন এটা ফাইল]|[$2 আন কিছুমান ফাইল]}} ইতিমধ্যেই আছিল, কিন্তু {{PLURAL:$1|সেইটো|সেইবোৰ}} বিলোপ কৰা হৈছে।',
-'api-error-duplicate-archive-popup-title' => 'পà§\8dৰতিলিপি {{PLURAL:$1|ফাà¦\87ল|ফাà¦\87ল}} à¦¯à§\8bনà¦\95à§\87à¦\87à¦\9fা à¦\87তিমধà§\8dযà§\87 à¦®à¦\9aা হৈছে।',
-'api-error-duplicate-popup-title' => 'প্ৰতিলিপি {{PLURAL:$1|ফাইল|ফাইল}}।',
-'api-error-empty-file' => 'à¦\86পà§\81নি à¦¦à¦¾à¦\96িল à¦\95ৰা à¦«à¦¾à¦\87লà¦\96ন খালী ।',
+'api-error-duplicate-archive-popup-title' => 'পà§\8dৰতিলিপি {{PLURAL:$1|ফাà¦\87ল|ফাà¦\87ল}} à¦¯à¦¿à¦¸à¦®à§\82হ à¦\87তিমধà§\8dযà§\87 à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা হৈছে।',
+'api-error-duplicate-popup-title' => 'প্ৰতিলিপি {{PLURAL:$1|ফাইল|ফাইলসমূহ}}।',
+'api-error-empty-file' => 'à¦\86পà§\81নি à¦¦à¦¾à¦\96িল à¦\95ৰা à¦«à¦¾à¦\87লà¦\9fà§\8b খালী ।',
 'api-error-emptypage' => 'নতুন, খালী পৃষ্ঠা সৃষ্টি কৰিবলৈ অনুমতি নাই।',
 'api-error-fetchfileerror' => 'আভ্যন্তৰীণ ত্ৰুটি: ফাইলটো অনাত কিবা সমস্যা হৈছে।',
+'api-error-fileexists-forbidden' => '"$1" নামৰ এখন নথি আগৰ পৰাই উপলদ্ধ আৰু ইয়াৰ পুনৰ লিখন অসম্ভৱ ।',
+'api-error-fileexists-shared-forbidden' => 'উমৈহতীয়া ফাইল ভঁৰালত "$1" নামৰ ফাইল এটা আছেই, ইয়াৰ ওপৰত লিখিব নোৱাৰি।',
 'api-error-file-too-large' => 'আপুনি দাখিল কৰা ফাইলখন বৰ ডাঙৰ ।',
 'api-error-filename-tooshort' => 'ফাইলৰ নামটো অতি চুটি।',
-'api-error-filetype-banned' => 'এই ধৰণৰ ফাইল নিষেধ ।',
-'api-error-filetype-missing' => 'ফাইলনামটোত এক্সটেন্‌ছন নাই।',
+'api-error-filetype-banned' => 'এই ধৰণৰ ফাইল নিষিদ্ধ।',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|অনুমোদিত ফাইল প্ৰকাৰ নহয়|সমূহ অনুমোদিত ফাইল প্ৰকাৰ নহয়}} । {{PLURAL:$3|অনুমোদিত ফাইল প্ৰকাৰ হ’ল|অনুমোদিত ফাইল প্ৰকাৰসমূহ হ’ল}} $2 ।',
+'api-error-filetype-missing' => 'ফাইল নামটোত এক্সটেন্‌ছন নাই।',
 'api-error-hookaborted' => 'আপুনি কৰিব বিচৰা সালসলনি এটা এক্সটেনচনৰ দ্বাৰা বাতিল কৰা হৈছে।',
 'api-error-http' => "আভ্যন্তৰীণ ত্ৰুটি: চাৰ্ভাৰৰ লগত সংযোগ স্থাপন নহ'ল।",
 'api-error-illegal-filename' => 'ফাইলৰ এই নামটো গ্ৰহণযোগ্য নহয় ।',
@@ -3750,14 +3824,14 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'api-error-invalid-file-key' => "আভ্যন্তৰীণ ত্ৰুটি: অস্থায়ী ভঁৰালত ফাইলটো পোৱা নগ'ল।",
 'api-error-missingparam' => 'আভ্যন্তৰীণ ত্ৰুটি: অনুৰোধত পেৰামিটাৰৰ কিবা সমস্যা ৰৈছে।',
 'api-error-missingresult' => "আভ্যন্তৰীণ ত্ৰুটি: অনুলিপি সফল হৈছেনে নাই তাক নিশ্চিত কৰিব পৰা নগ'ল।",
-'api-error-mustbeloggedin' => "ফাà¦\87ল à¦\86পল'ড à¦\95ৰিবলà§\88 à¦\86পà§\81নি à¦²à¦\97à§\8dâ\80\8c à¦\87নà§\8dâ\80\8c à¦\95ৰিব à¦²à¦¾à¦\97িব।",
+'api-error-mustbeloggedin' => "ফাà¦\87ল à¦\86পল'ড à¦\95ৰাৰ à¦\86à¦\97à§\87য়à§\87 à¦\86পà§\81নি à¦ªà§\8dৰৱà§\87শ à¦\95ৰাà¦\9fà§\8b à¦¬à¦¾à¦§à§\8dযতামà§\82লà¦\95 ।",
 'api-error-mustbeposted' => 'আভ্যন্তৰীণ ত্ৰুটি: এই অনুৰোধত HTTP POST প্ৰয়োজন।',
 'api-error-noimageinfo' => "আপল'ড সফল হৈছে, কিন্তু চাৰ্ভাৰে ফাইলটোৰ সম্পৰ্কে কোনো তথ্য প্ৰদান কৰা নাই।",
 'api-error-nomodule' => "আভ্যন্তৰীণ ত্ৰুটি: কোনো আপল'ড মডিউল ঠিক কৰা হোৱা নাই।",
 'api-error-ok-but-empty' => 'আভ্যন্তৰীণ ত্ৰুটি: চাৰ্ভাৰে কোনো সঁহাৰি জনোৱা নাই।',
 'api-error-overwrite' => 'এতিয়া থকা ফাইলৰ ওপৰত লিখা নিষেধ।',
 'api-error-stashfailed' => 'আভ্যন্তৰীণ ত্ৰুটি: অস্থায়ী ফাইল সাঁচি ৰখাত চাৰ্ভাৰ অসমৰ্থ হৈছে।',
-'api-error-timeout' => 'à¦\85শা কৰা সময়ৰ ভিতৰত চাৰ্ভাৰটোৱে সঁহাৰি নজনালে।',
+'api-error-timeout' => 'à¦\86শা কৰা সময়ৰ ভিতৰত চাৰ্ভাৰটোৱে সঁহাৰি নজনালে।',
 'api-error-unclassified' => 'এক অজ্ঞাত সমস্যাই দেখা দিছে।',
 'api-error-unknown-code' => 'অজ্ঞাত সমস্যা: "$1"।',
 'api-error-unknown-error' => "আভ্যন্তৰীণ ত্ৰুটি: আপোনাৰ ফাইলটো আপল'ড কৰাত কিবা সমস্যা হৈছে।",
index 25c6faf..44d6dee 100644 (file)
@@ -65,7 +65,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Anubrir les ediciones vixilaes nos cambeos recientes',
 'tog-newpageshidepatrolled' => 'Anubrir les páxines vixilaes na llista de páxines nueves',
 'tog-extendwatchlist' => "Espander la llista de vixilancia p'amosar tolos cambeos, non solo los más recientes.",
-'tog-usenewrc' => 'Cambeos recientes ameyoraos (necesita JavaScript)',
+'tog-usenewrc' => 'Agrupar los cambeos por páxina nos cambeos recientes y na llista de vixilancia (necesita JavaScript)',
 'tog-numberheadings' => 'Autonumberar los encabezaos',
 'tog-showtoolbar' => "Amosar la barra de ferramientes d'edición (JavaScript)",
 'tog-editondblclick' => 'Editar páxines con doble clic (necesita JavaScript)',
@@ -73,17 +73,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Activar la edición de seiciones calcando col botón drechu nos títulos de seición (necesita JavaScript)',
 'tog-showtoc' => 'Amosar índiz (pa páxines con más de 3 encabezaos)',
 'tog-rememberpassword' => 'Recordar la mio identificación nesti ordenador (hasta un máximu de $1 {{PLURAL:$1|día|díes}})',
-'tog-watchcreations' => 'Amestar les páxines que creo a la mio llista de vixilancia',
-'tog-watchdefault' => "Amestar les páxines qu'edito a la mio llista de vixilancia",
-'tog-watchmoves' => 'Amestar les páxines que muevo a la mio llista de vixilancia',
-'tog-watchdeletion' => 'Amestar les páxines que desanicio a la mio llista de vixilancia',
+'tog-watchcreations' => 'Amestar les páxines que creo y los ficheros que cargo a la mio llista de vixilancia',
+'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-nocache' => 'Desactivar la caché de páxines del restolador',
-'tog-enotifwatchlistpages' => 'Mandame un corréu cuando camude una páxina de la mio llista de vixilancia',
+'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",
-'tog-enotifminoredits' => 'Mandame tamién un corréu cuando heba ediciones menores de les páxines',
+'tog-enotifminoredits' => 'Mandame tamién un corréu cuando heba ediciones menores de les páxines y ficheros',
 'tog-enotifrevealaddr' => 'Amosar la mio direición de corréu nos correos de notificación',
 'tog-shownumberswatching' => "Amosar el númberu d'usuarios que tán vixilando la páxina",
 'tog-oldsig' => 'Firma esistente:',
@@ -99,7 +99,6 @@ $messages = array(
 'tog-watchlisthideliu' => "Anubrir les ediciones d'usuarios identificaos na llista de vixilancia",
 'tog-watchlisthideanons' => "Anubrir les ediciones d'usuarios anónimos na llista de vixilancia",
 'tog-watchlisthidepatrolled' => 'Anubrir les ediciones vixilaes de la llista de vixilancia',
-'tog-nolangconversion' => 'Desactivar la conversión de variantes',
 'tog-ccmeonemails' => "Mandame copies de los correos qu'unvio a otros usuarios",
 'tog-diffonly' => 'Nun amosar el conteníu de la páxina embaxo de les diferencies',
 'tog-showhiddencats' => 'Amosar categoríes anubríes',
@@ -323,6 +322,10 @@ $1',
 'youhavenewmessages' => 'Tienes $1 ($2).',
 'newmessageslink' => 'mensaxes nuevos',
 'newmessagesdifflink' => 'cambéu postreru',
+'youhavenewmessagesfromusers' => "Tienes $1 {{PLURAL:$3|d'otru usuariu|de $3 usuarios}} ($2).",
+'youhavenewmessagesmanyusers' => 'Tienes $1 de munchos usuarios ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|un mensaxe nuevu|$1 mensaxes nuevos}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|cambéu postreru|cambeos postreros}}',
 'youhavenewmessagesmulti' => 'Tienes mensaxes nuevos en $1',
 'editsection' => 'editar',
 'editold' => 'editar',
@@ -375,11 +378,11 @@ Pues atopar una llista de les páxines especiales válides en [[Special:SpecialP
 'error' => 'Fallu',
 'databaseerror' => 'Fallu na base de datos',
 'dberrortext' => "Hebo un fallu de sintaxis nuna consulta a la base de datos.
-Esti fallu puede ser por un problema del software.
+Esti fallu pue ser por un problema del software.
 La postrer consulta a la base de datos que s'intentó foi:
-<blockquote><tt>$1</tt></blockquote>
-dende la función «<tt>$2</tt>».
-La base datos dio'l fallu «<tt>$3: $4</tt>».",
+<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:
 «$1»
@@ -416,6 +419,8 @@ Por favor informa d'esto a un [[Special:ListUsers/sysop|alministrador]], anotand
 'cannotdelete' => "Nun pudo desaniciase la páxina o'l ficheru «$1».
 Seique daquién yá lo desaniciara.",
 'cannotdelete-title' => 'Nun se pue desaniciar la páxina «$1»',
+'delete-hook-aborted' => 'Desaniciu albortáu pol hook.
+Nun conseñó esplicación.',
 'badtitle' => 'Títulu incorreutu',
 'badtitletext' => 'El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces interllingua o interwiki incorreutos.
 Pue contener ún o más carauteres que nun se puen usar nos títulos.',
@@ -452,6 +457,8 @@ El motivu conseñáu ye «''$2''».",
 L'alministrador que lu bloquió dio esti motivu: «$3».",
 'invalidtitle-knownnamespace' => 'Títulu non válidu col espaciu de nomes «$2» y el testu «$3»',
 'invalidtitle-unknownnamespace' => "Titulu non válidu col númberu $1 d'espaciu de nomes desconocíu y el testu «$2»",
+'exception-nologin' => 'Non identificáu',
+'exception-nologin-text' => "Esta páxina o aición necesita qu'anicies sesión nesta wiki.",
 
 # Virus scanner
 'virus-badscanner' => "Fallu de configuración: Escáner de virus desconocíu: ''$1''",
@@ -472,6 +479,7 @@ Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAM
 'remembermypassword' => "Recordar la mio identificación nesti restolador (un máximu {{PLURAL:$1|d'un día|de $1 díes}})",
 'securelogin-stick-https' => "Siguir coneutáu al HTTPS dempués d'identificase",
 'yourdomainname' => 'El to dominiu:',
+'password-change-forbidden' => 'Nun se pueden camudar les contraseñes nesta wiki.',
 'externaldberror' => "O hebo un fallu d'autenticación de la base de datos o nun tienes permisu p'anovar la to cuenta esterna.",
 'login' => 'Identificase',
 'nav-login-createaccount' => 'Identificase / crear una cuenta',
@@ -741,6 +749,10 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta páxina equí]</span>.',
 'noarticletext-nopermission' => 'Nestos momentos nun hai testu nesta páxina.
 Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos]</span>.',
+'missing-revision' => 'La revisión #$1 de la páxina llamada "{{PAGENAME}}" nun esiste.
+
+De vezu la causa d\'esto ye siguir un enllaz antiguu del historial a una páxina que se desanició.
+Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].',
 'userpage-userdoesnotexist' => "La cuenta d'usuariu «$1» nun ta rexistrada.
 Por favor comprueba si quies crear/editar esta páxina.",
 'userpage-userdoesnotexist-view' => "La cuenta d'usuariu «$1» nun ta rexistrada.",
@@ -750,7 +762,6 @@ La postrer entrada del rexistru de bloqueos úfrese darréu pa referencia:',
 *'''Firefox / Safari:''' Caltén ''Mayús'' mentes calques en ''Recargar'', o calca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' nun Mac)
 * '''Google Chrome:''' Calca ''Ctrl-Mayús-R'' (''⌘-Mayús-R'' nun Mac)
 * '''Internet Explorer:''' Caltén ''Ctrl'' mentes calques ''Refrescar'', o calca ''Ctrl-F5''
-* '''Konqueror:''' Calca en ''Recargar'', o calca ''F5''
 * '''Opera:''' llimpia la caché en ''Ferramientes → Preferencies''",
 'usercssyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to CSS nuevu enantes de guardalu.",
 'userjsyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to JavaScript nuevu enantes de guardalu.",
@@ -868,6 +879,7 @@ Estos parámetros s'omitieron.",
 'expansion-depth-exceeded-warning' => "La páxina pasó la fondura d'espansión",
 'parser-unstrip-loop-warning' => 'Deteutóse un bucle "unstrip"',
 'parser-unstrip-recursion-limit' => 'Superóse\'l llímite de recursión d\'"unstrip" ($1)',
+'converter-manual-rule-error' => 'Detectóse un error na regla de conversión manual de llingua',
 
 # "Undo" feature
 'undo-success' => "La edición se pue esfacer.
@@ -1055,6 +1067,10 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
 'editundo' => 'esfacer',
 'diff-multi' => "({{PLURAL:$1|Nun s'amuesa 1 revisión intermedia|Nun s'amuesen $1 revisiones intermedies}} {{PLURAL:$2|d'un usuariu|de $2 usuarios}} )",
 'diff-multi-manyusers' => "({{PLURAL:$1|Nun s'amuesa una revisión intermedia|Nun s'amuesen $1 revisiones intermedies}} de más de $2 {{PLURAL:$2|usuariu|usuarios}})",
+'difference-missing-revision' => "{{PLURAL:$2|Nun s'alcontró|Nun s'alcontraron}} {{PLURAL:$2|una revisión|$2 revisiones}} d'esta diferencia ($1).
+
+De vezu la causa d'esto ye siguir un enllaz de diferencia antiguu a una páxina que se desanició.
+Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
 
 # Search results
 'searchresults' => 'Resultaos de la gueta',
@@ -1321,6 +1337,7 @@ Esta información sedrá pública.",
 'right-writeapi' => "Usar l'API d'escritura",
 'right-delete' => 'Esborrar páxines',
 'right-bigdelete' => 'Esborrar páxines con historiales grandes',
+'right-deletelogentry' => 'Desaniciar y restaurar entraes del rexistru determinaes',
 'right-deleterevision' => 'Eliminar y restaurar revisiones específiques de les páxines',
 'right-deletedhistory' => 'Ver entraes eliminaes del historial ensin testu asociáu',
 'right-deletedtext' => 'Ver el testu desaniciáu y los cambeos ente versiones desaniciaes',
@@ -1464,9 +1481,9 @@ Equí s'ufre'l rexistru de desaniciu y treslláu d'esta páxina por comodidá:",
 Pa ver o buscar archivos xubíos previamente, vete a la [[Special:FileList|llista d'archivos xubíos]]. Les xubíes tamién queden conseñaos nel [[Special:Log/upload|rexistru de xubíes]], y los esborraos nel [[Special:Log/delete|rexistru d'esborraos]].
 
 P'amiestar un archivu nuna páxina, usa un enllaz con ún de los siguientes formatos:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Archivu.jpg]]</nowiki></tt>''' pa usar la versión completa del archivu
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Archivu.png|200px|thumb|left|testu alternativu]]</nowiki></tt>''' pa usar un renderizáu de 200 píxeles d'anchu nun caxellu al marxe esquierdu con 'testu alternativu' como la so descripción
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Archivu.ogg]]</nowiki></tt>''' pa enllazar direutamente al archivu ensin amosar l'archivu",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Archivu.jpg]]</nowiki></code>''' pa usar la versión completa del archivu
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Archivu.png|200px|thumb|left|testu alternativu]]</nowiki></code>''' pa usar un renderizáu de 200 píxeles d'anchu nun caxellu al marxe esquierdu con 'testu alternativu' como la so descripción
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Archivu.ogg]]</nowiki></code>''' pa enllazar direutamente al archivu ensin amosar l'archivu",
 'upload-permitted' => "Menes d'archivu permitíes: $1.",
 'upload-preferred' => "Menes d'archivu preferíes: $1.",
 'upload-prohibited' => "Menes d'archivu prohibíes: $1.",
@@ -1513,21 +1530,21 @@ esti ficheru tien $2.',
 Esto podría ser pola mor d'un enquivocu nel nome del ficheru.
 Por favor, camienta si daveres quies xubir esti archivu.",
 'windows-nonascii-filename' => 'Esta wiki nun permite nomes de ficheru con caráuteres especiales.',
-'fileexists' => "Yá esiste un ficheru con esti nome, por favor comprueba '''<tt>[[:$1]]</tt>''' si nun tas seguru de querer camudalu.
-[[$1|thumb]]",
-'filepageexists' => "La páxina de descripción d'esti ficheru yá se creó en '''<tt>[[:$1]]</tt>''', pero anguaño nun esiste nengún ficheru con esti nome.
+'fileexists' => 'Yá esiste un ficheru con esti nome, por favor comprueba <strong>[[:$1]]</strong> si nun tas seguru de querer camudalu.
+[[$1|thumb]]',
+'filepageexists' => "La páxina de descripción d'esti ficheru yá se creó en <strong>[[:$1]]</strong>, pero anguaño nun esiste nengún ficheru con esti nome.
 El resume que pongas nun va apaecer na páxina de descripción.
 Pa facer que'l to resume apaeza, vas tener que lu editar manualmente.
 [[$1|thumb]]",
-'fileexists-extension' => "Yá esiste un ficheru con un nome asemeyáu: [[$2|thumb]]
-* Nome del ficheru que se quier xubir: '''<tt>[[:$1]]</tt>'''
-* Nome del ficheru esistente: '''<tt>[[:$2]]</tt>'''
-Por favor escueyi un nome diferente.",
+'fileexists-extension' => 'Yá esiste un ficheru con un nome asemeyáu: [[$2|thumb]]
+* Nome del ficheru que se quier xubir: <strong>[[:$1]]</strong>
+* Nome del ficheru esistente: <strong>[[:$2]]</strong>
+Por favor escueyi un nome diferente.',
 'fileexists-thumbnail-yes' => "El ficheru paez ser una imaxe de tamañu menguáu ''(miniatura)''.
  [[$1|thumb]]
-Por favor comprueba el ficheru '''<tt>[[:$1]]</tt>'''.
+Por favor comprueba el ficheru <strong>[[:$1]]</strong>.
 Si'l ficheru comprobáu tien el mesmu tamañu que la imaxe orixinal, nun ye necesario xubir una miniatura estra.",
-'file-thumbnail-no' => "El ficheru entama con '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "El ficheru entama con <strong>$1</strong>.
 Paez ser una imaxe de tamañu menguáu ''(miniatura)''.
 Si tienes esta imaxe a resolución completa xúbila; si non, por favor camuda'l nome del ficheru.",
 'fileexists-forbidden' => 'Yá esiste un ficheru con esti nome, y nun se pue renomar.
@@ -1643,6 +1660,7 @@ Si'l problema persiste, contauta con un [[Special:ListUsers/sysop|alministrador]
 'lockmanager-fail-releaselock' => 'Nun se pudo lliberar el bloquéu pa "$1".',
 'lockmanager-fail-db-bucket' => 'Nun se pudo contautar con bloqueos de bases de datos bastantes nel conxuntu $1.',
 'lockmanager-fail-db-release' => 'Nun se pudieron lliberar los bloqueos na base de datos $1.',
+'lockmanager-fail-svr-acquire' => 'Nun se pudieron afitar los bloqueos nel sirvidor $1.',
 'lockmanager-fail-svr-release' => 'Nun se pudieron lliberar los bloqueos nel sirvidor $1.',
 
 # ZipDirectoryReader
@@ -1760,6 +1778,7 @@ Seique quieras camudar la descripción de la so [páxina de descripción de fich
 'shared-repo-from' => 'de $1',
 'shared-repo' => 'un repositoriu compartíu',
 'filepage.css' => "/* El CSS allugáu equí s'incluye na páxina de descripción del ficheru, que tamién s'incluye nes wikis clientes foriates */",
+'upload-disallowed-here' => 'Por desgracia nun pues sobrescribir esta imaxe.',
 
 # File reversion
 'filerevert' => 'Revertir $1',
@@ -1793,7 +1812,7 @@ Seique quieras camudar la descripción de la so [páxina de descripción de fich
 
 # MIME search
 'mimesearch' => 'Busca MIME',
-'mimesearch-summary' => "Esta páxina activa'l filtráu d'archivos en función de la so triba MIME. Entrada: contenttype/subtype, p.ex. <tt>image/jpeg</tt>.",
+'mimesearch-summary' => "Esta páxina activa'l filtráu d'archivos en función de la so triba MIME. Entrada: contenttype/subtype, p.ex. <code>image/jpeg</code>.",
 'mimetype' => 'Triba MIME:',
 'download' => 'descargar',
 
@@ -1840,7 +1859,8 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
 
 'disambiguations' => "Páxines qu'enllacen con páxines de dixebra",
 'disambiguationspage' => 'Template:dixebra',
-'disambiguations-text' => "Les siguientes páxines enllacien a una '''páxina de dixebra'''. En cuenta d'ello habríen enllaciar al artículu apropiáu.<br />Una páxina considérase de dixebra si usa una plantía que tea enllaciada dende [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Les siguientes páxines contienen polo menos un enllaz a una '''páxina de dixebra'''. En cuenta d'ello habríen enllaciar a una páxina más apropiada.<br />
+Una páxina tratase como una páxina de dixebra si usa una plantía que tea enllaciada dende [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Redireiciones dobles',
 'doubleredirectstext' => 'Esta páxina llista páxines que redireicionen a otres páxines de redireición.
@@ -1865,6 +1885,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categoría|categoríes}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|enllaz|enllaces}}',
 'nmembers' => '$1 {{PLURAL:$1|miembru|miembros}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisión|revisiones}}',
@@ -1893,6 +1914,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
 'mostlinkedtemplates' => 'Plantíes más enllaciaes',
 'mostcategories' => 'Páxines con más categoríes',
 'mostimages' => 'Archivos más enllaciaos',
+'mostinterwikis' => 'Páxines con más interwikis',
 'mostrevisions' => 'Páxines con más revisiones',
 'prefixindex' => 'Toles páxines col prefixu',
 'prefixindex-namespace' => 'Toles páxines col prefixu (espaciu de nomes $1)',
@@ -1992,7 +2014,7 @@ Ver tamién les [[Special:WantedCategories|categoríes más buscaes]].",
 'linksearch-ok' => 'Guetar',
 'linksearch-text' => 'Se puen usar comodinos como "*.wikipedia.org".
 Necesita polo menos un dominiu de primer nivel, como "*.org".<br />
-Protocolos almitíos: <tt>$1</tt> (nun amiestes dengún d\'estos na to gueta).',
+Protocolos almitíos: <code>$1</code> (nun amiestes dengún d\'estos na to gueta).',
 'linksearch-line' => '$1 enllaciáu dende $2',
 'linksearch-error' => 'Los comodinos namái puen apaecer al entamu del nome del güéspede.',
 
@@ -2040,7 +2062,9 @@ Pue haber [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] toca
 y tener una direición de corréu válida nes tos [[Special:Preferences|preferencies]]
 pa poder unviar correos a otros usuarios.',
 'emailuser' => 'Manda-y un corréu a esti usuariu',
-'emailpage' => "Corréu d'usuariu",
+'emailuser-title-target' => 'Unviar un corréu electrónicu a {{GENDER:$1|esti usuariu|esta usuaria}}',
+'emailuser-title-notarget' => 'Unviar un corréu electrónicu a un usuariu',
+'emailpage' => 'Envigar un corréu electrónicu a un usuariu',
 'emailpagetext' => "Pues usar el formulariu d'embaxo pa unviar un corréu electrónicu a esti usuariu.
 La direición de corréu electrónicu qu'especificasti nes [[Special:Preferences|tos preferencies d'usuariu]] va apaecer como la direición \"Dende\" del corréu, pa que'l que lo recibe seya quien a respondete direutamente a ti.",
 'usermailererror' => "L'operador de corréu devolvió un error:",
@@ -2186,6 +2210,8 @@ obra con precaución.",
 'rollback' => 'Revertir ediciones',
 'rollback_short' => 'Revertir',
 'rollbacklink' => 'revertir',
+'rollbacklinkcount' => 'revertir $1 {{PLURAL:$1|edición|ediciones}}',
+'rollbacklinkcount-morethan' => 'revertir más de $1 {{PLURAL:$1|edición|ediciones}}',
 'rollbackfailed' => 'Falló la reversión',
 'cantrollback' => "Nun se pue revertir la edición; el postrer collaborador ye l'únicu autor d'esta páxina.",
 'alreadyrolled' => 'Nun se pue revertir la postrer edición de [[:$1]] fecha por [[User:$2|$2]] ([[User talk:$2|alderique]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2679,6 +2705,7 @@ Toles aiciones d'importación treswiki queden rexistraes nel [[Special:Log/impor
 'import-interwiki-templates' => 'Incluyir toles plantíes',
 'import-interwiki-submit' => 'Importar',
 'import-interwiki-namespace' => 'Espaciu de nomes de destín:',
+'import-interwiki-rootpage' => 'Páxina raíz de destín (opcional):',
 'import-upload-filename' => 'Nome del ficheru:',
 'import-comment' => 'Comentariu:',
 'importtext' => "Por favor, esporta'l ficheru dende la wiki d'orixe usando la [[Special:Export|ferramienta d'esportación]].
@@ -2711,6 +2738,9 @@ Guárdalu nel ordenador y xúbilu equí.",
 'import-error-interwiki' => "La páxina «$1» nun s'importó porque'l so nome ta acutáu pa enllaces esternos (interwiki).",
 'import-error-special' => "La páxina «$1» nun s'importó porque pertenez a un espaciu de nomes especial que nun permite les páxines.",
 'import-error-invalid' => "La páxina «$1» nun s'importó porque tien un nome inválidu.",
+'import-options-wrong' => '{{PLURAL:$2|Opción enquivocada|Opciones enquivocaes}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'La páxina raíz dada ye un títulu inválidu.',
+'import-rootpage-nosubpage' => 'L\'espaciu de nomes "$1" de la páxina raíz nun permite subpáxines.',
 
 # Import log
 'importlogpage' => "Rexistru d'importaciones",
@@ -2863,16 +2893,34 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 
 # Info page
 'pageinfo-title' => 'Información sobro "$1"',
-'pageinfo-header-edits' => 'Ediciones',
-'pageinfo-header-watchlist' => 'Llista de vixilancia',
-'pageinfo-header-views' => 'Vistes',
-'pageinfo-subjectpage' => 'Páxina',
-'pageinfo-talkpage' => "Páxina d'alderique",
-'pageinfo-watchers' => 'Númberu de vixilantes',
-'pageinfo-edits' => "Númberu d'ediciones",
-'pageinfo-authors' => "Númberu d'autores distintos",
+'pageinfo-header-basic' => 'Información básica',
+'pageinfo-header-edits' => "Historial d'ediciones",
+'pageinfo-header-restrictions' => 'Proteición de páxina',
+'pageinfo-header-properties' => 'Propiedaes de la páxina',
+'pageinfo-display-title' => 'Amosar el títulu',
+'pageinfo-default-sort' => "Clave d'ordenación predeterminada",
+'pageinfo-length' => 'Llonxitú de la páxina (en bytes)',
+'pageinfo-article-id' => 'ID de la páxina',
+'pageinfo-robot-policy' => 'Estáu del motor de gueta',
+'pageinfo-robot-index' => 'Pue ser índiz',
+'pageinfo-robot-noindex' => 'Nun pue ser índiz',
 'pageinfo-views' => 'Númberu de visites',
-'pageinfo-viewsperedit' => 'Visites por edición',
+'pageinfo-watchers' => 'Númberu de vixilantes de la páxina',
+'pageinfo-redirects-name' => 'Redireiciones a esta páxina',
+'pageinfo-subpages-name' => "Subpáxines d'esta páxina",
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redireición|redireiciones}}; $3 {{PLURAL:$3|non-redireición|non-redireiciones}})',
+'pageinfo-firstuser' => 'Creador de la páxina',
+'pageinfo-firsttime' => 'Data de creación de la páxina',
+'pageinfo-lastuser' => 'Caberu editor',
+'pageinfo-lasttime' => 'Data de la cabera edición',
+'pageinfo-edits' => "Númberu total d'ediciones",
+'pageinfo-authors' => "Númberu total d'autores distintos",
+'pageinfo-recent-edits' => "Númberu d'ediciones recientes (nos caberos $1)",
+'pageinfo-recent-authors' => "Númberu d'autores distintos recientes",
+'pageinfo-restriction' => 'Proteición de la páxina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Pallabra máxica|Pallabres máxiques}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría anubrida|Categoríes anubríes}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Plantía incluída|Plantíes incluíes}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Clásicu',
@@ -2923,6 +2971,7 @@ Al executalu pues comprometer el to sistema.",
 'file-info-size-pages' => '$1 × $2 pixels, tamañu del ficheru: $3, triba MIME: $4, $5 {{PLURAL:$5|páxina|páxines}}',
 'file-nohires' => 'Nun ta disponible con mayor resolución.',
 'svg-long-desc' => 'ficheru SVG, $1 × $2 píxels nominales, tamañu de ficheru: $3',
+'svg-long-desc-animated' => 'Ficheru SVG animáu; nominalmente de $1 × $2 pixels; tamañu del ficheru: $3',
 'show-big-image' => 'Resolución completa',
 'show-big-image-preview' => "Tamañu d'esta previsualización: $1.",
 'show-big-image-other' => '{{PLURAL:$2|Otra resolución|Otres resoluciones}}: $1.',
@@ -2932,6 +2981,8 @@ Al executalu pues comprometer el to sistema.",
 'file-info-png-looped' => 'animáu',
 'file-info-png-repeat' => 'reproducíu $1 {{PLURAL:$1|vez|veces}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|cuadru|cuadros}}',
+'file-no-thumb-animation' => "'''Nota: pola mor de llímites téunicos, les miniatures d'esti ficheru nun tan animaes.'''",
+'file-no-thumb-animation-gif' => "'''Nota: pola mor de llímites téunicos, les miniatures d'imaxes GIF d'alta resolución como esta nun tan animaes.'''",
 
 # Special:NewFiles
 'newimages' => "Galería d'imáxenes nueves",
@@ -3605,7 +3656,7 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 * <span class="mw-specialpagecached">Páxines especiales en caché (seique nun tean actualizaes).</span>',
 'specialpages-group-maintenance' => 'Informes de mantenimientu',
 'specialpages-group-other' => 'Otres páxines especiales',
-'specialpages-group-login' => 'Entrar / Crear cuenta',
+'specialpages-group-login' => 'Identificase / crear cuenta',
 'specialpages-group-changes' => 'Cambeos recientes y rexistros',
 'specialpages-group-media' => 'Informes multimedia y xubíes',
 'specialpages-group-users' => 'Usuarios y drechos',
@@ -3739,9 +3790,12 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
 'api-error-empty-file' => "El ficheru qu'unviasti taba baleru.",
 'api-error-emptypage' => 'Nun se permite la creación de páxines nueves baleres.',
 'api-error-fetchfileerror' => 'Fallu internu: daqué nun funcionó al buscar el ficheru.',
+'api-error-fileexists-forbidden' => 'Yá esiste un ficheru col nome «$1» y nun se pue sobrescribir.',
+'api-error-fileexists-shared-forbidden' => 'Yá esiste un ficheru col nome «$1» nel repositoriu de ficheros compartíos, y nun se pue sobrescribir.',
 'api-error-file-too-large' => "El ficheru qu'unviasti yera demasiao grande.",
 'api-error-filename-tooshort' => 'El nome de ficheru ye demasiao curtiu.',
 'api-error-filetype-banned' => 'Esta triba de ficheru ta torgada.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|nun ye una triba de ficheru permitida|nun son tribes de ficheru permitíes}}. {{PLURAL:$3|La triba de ficheru permitida ye|Les tribes de ficheru permitíes son}} $2.',
 'api-error-filetype-missing' => 'Al ficheru falta-y una estensión.',
 'api-error-hookaborted' => 'La conexón con una estensión encaboxó el cambéu que tentasti facer.',
 'api-error-http' => 'Fallu internu: Nun se pudo coneutar col sirvidor.',
index 0cc9e11..15cdabe 100644 (file)
@@ -1147,16 +1147,16 @@ Ta kobura va iyeltak, koe tazukasiki va gluyasiki favel
 'large-file' => 'Lokiewafa da lum ke man iyeltak tir lepinaf dam $1; bat iyeltak tir $2.',
 'largefileserver' => 'Bat iyeltak tir pwertarsaf gu gotune ke zanisiko.',
 'emptyfile' => 'Kalvajan iyeltak nuvelar vlardaf. Lanon golde sutejen iyeltakyolt. Vay ageltal ede va bat iyeltak en djukalvajal !',
-'fileexists' => "Iyeltak dem man bat yolt ixam krulder.
-Vay, ageltal va '''<tt>[[:$1]]</tt>'''.
-Til lanaf da va bat iyeltak djubetal ? [[$1|thumb]]",
-'filepageexists' => "Pimtarabu ke bat iyeltak ixam al zo redur ko '''<tt>[[:$1]]</tt>''', vexe mek iyeltak dem man yolt ixam tir. Vildeks rinon suten moe pimtarabu me awitir. Ede djumel da in batlize co-awir, nubedon co-gobetal.",
-'fileexists-extension' => "Iyeltak dem nuxaf yolt tir : [[$2|thumb]]
-* Yolt ke kalvajayan iyeltak : '''<tt>[[:$1]]</tt>'''
-* Yolt ke tis iyeltak : '''<tt>[[:$2]]</tt>'''
-Va amidaf yolt vay kiblal !",
+'fileexists' => 'Iyeltak dem man bat yolt ixam krulder.
+Vay, ageltal va <strong>[[:$1]]</strong>.
+Til lanaf da va bat iyeltak djubetal ? [[$1|thumb]]',
+'filepageexists' => 'Pimtarabu ke bat iyeltak ixam al zo redur ko <strong>[[:$1]]</strong>, vexe mek iyeltak dem man yolt ixam tir. Vildeks rinon suten moe pimtarabu me awitir. Ede djumel da in batlize co-awir, nubedon co-gobetal.',
+'fileexists-extension' => 'Iyeltak dem nuxaf yolt tir : [[$2|thumb]]
+* Yolt ke kalvajayan iyeltak : <strong>[[:$1]]</strong>
+* Yolt ke tis iyeltak : <strong>[[:$2]]</strong>
+Va amidaf yolt vay kiblal !',
 'fileexists-thumbnail-yes' => "Iyeltak nuvelar da tir lumamafa ewava ''(aluk)''. [[$1|thumb]]
-Vay va '''<tt>[[:$1]]</tt>''' iyeltak stujel.
+Vay va <strong>[[:$1]]</strong> iyeltak stujel.
 Ede stujen iyeltak tir mila lumanhafa ewava, va aptaf aluk me kalvajal !",
 'fileexists-forbidden' => 'Milyoltaf iyeltak ixam krulder nume me zo robetar.
 Ede va man iyeltak soe co-djukalvajal, vay dimpil ise va warzaf yolt favel.
index 18c6564..0ff447d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Azerbaijani (Azərbaycanca)
+/** Azerbaijani (azərbaycanca)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -68,9 +68,9 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#İSTİQAMƏTLƏNDİRMƏ', '#İSTİQAMƏTLƏNDİR', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__MÜNDƏRİCATYOX__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__QALEREYAYOX__', '__NOGALLERY__' ),
+       'redirect'                  => array( '0', '#İSTİQAMƏTLƏNDİRMƏ', '#İSTİQAMƏTLƏNDİR', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__MÜNDƏRİCATYOX__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__QALEREYAYOX__', '__NOGALLERY__' ),
 );
 
 $separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -90,7 +90,7 @@ $messages = array(
 'tog-editsection' => 'Hər bir bölmə üçün [redaktə]ni mümkün et',
 'tog-editsectiononrightclick' => 'Bölmələrin redaktəsini başlıqların üzərində sağ klik etməklə mümkün et (JavaScript)',
 'tog-showtoc' => 'Mündəricat siyahısını göstər (3 başlıqdan artıq olan səhifələrdə)',
-'tog-rememberpassword' => 'Məni bu kompüterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})',
+'tog-rememberpassword' => 'Məni bu kompyuterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})',
 'tog-watchcreations' => 'Yaratdığım səhifələri izlədiyim səhifələrə əlavə et',
 'tog-watchdefault' => 'Redaktə etdiyim səhifələri izlədiyim səhifələrə əlavə et',
 'tog-watchmoves' => 'Adlarını dəyişdiyim səhifələri izlədiyim səhifələrə əlavə et',
@@ -206,7 +206,7 @@ $messages = array(
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
-'about' => 'İzah',
+'about' => 'Haqqında',
 'article' => 'Mündəricat',
 'newwindow' => '(yeni pəncərədə açılır)',
 'cancel' => 'Ləğv et',
@@ -480,7 +480,7 @@ Hesabınız yaradıldı.
 'yourname' => 'İstifadəçi adı',
 'yourpassword' => 'Parol:',
 'yourpasswordagain' => 'Parolu təkrar yazın:',
-'remembermypassword' => 'Məni bu kompüterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})',
+'remembermypassword' => 'Məni bu kompyuterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})',
 'securelogin-stick-https' => 'Daxil olduqdan sonra HTTPS-lə əlaqədə qal',
 'yourdomainname' => 'Sizin domain',
 'externaldberror' => 'Verilənlər bazasının doğruluğunu yoxlamada xəta baş verib və yaxud sizin xarici istifadəçi qeydiyyatını yeniləmək hüququnuz yoxdur.',
@@ -766,8 +766,11 @@ $3 tərəfindən verilən səbəb ''$2''",
 'last' => 'son',
 'page_first' => 'birinci',
 'page_last' => 'sonuncu',
-'histlegend' => "Fərqə bax: müqayisə etmək istədiyiniz versiyaların yanındakı dairələri işarələyin və \"Enter\"ə və ya \"müqayisə et\" düyməsinə basın.<br />
-Açıqlama: '''(hh)''' — hal-hazırkı versiya ilə aradakı fərq, '''(son)''' — əvvəlki versiya ilə aradakı fərq, '''k''' — kiçik redaktə.",
+'histlegend' => "<div id=\"histlegend\"><span style=\"white-space:nowrap;\">Aşağıda sadalanan hər hansı bir versiyası görmək üçün, tarixinin üzərinə tıklayın.</span> <span style=\"white-space:nowrap;\">Daha çox kömək üçün, [[Kömək:Səhifə keçmişi|səhifə keçmişi]] səhifəsinə baxın.</span><br /><span style=\"white-space:nowrap;\">Xarici vasitələr: <!-- [http://toolserver.org/~tparis/articleinfo/index.php?article={{FULLPAGENAMEE}}&lang=tr&wiki=wikipedia Təftiş keçmişinin statistikası] '''·'''</span> <span style=\"white-space:nowrap;\"> -->[http://wikipedia.ramselehof.de/wikiblame.php?lang=tr&article={{FULLPAGENAMEE}} Təftiş keçmişini axtarmaq] '''·'''</span> <span style=\"white-space:nowrap;\">[http://toolserver.org/~daniel/WikiSense/Contributors.php?wikilang=tr&wikifam=.wikipedia.org&grouped=on&page={{FULLPAGENAMEE}} Töhfəsi olanlar] '''·'''</span> <span style=\"white-space:nowrap;\">[http://toolserver.org/~mzmcbride/cgi-bin/watcher.py?db=trwiki_p&titles={{FULLPAGENAMEE}} İzləyənlərin sayı] '''·'''</span> <span style=\"white-space:nowrap;\">[http://stats.grok.se/tr/latest/{{FULLPAGENAMEE}} Səhifəyə baxılma statistikası]</span></div>
+----
+Fərqləri seçmə və göstərmə: müqayisə etmək istədiyiniz versiyaların yanındakı radio qutularına işarə qoyun və daxil etmə düyməsinə (enter+a) və ya \"müqayisə et\" düyməsinə vurun.
+
+Açıqlama: '''(hh)''' = hal-hazırkı versiya ilə olan fərqlər, '''(son)''' = əvvəlki versiya ilə olan fərqlər, '''k''' = kiçik redaktələr.</span>",
 'history-fieldset-title' => 'Tarixçəni nəzərdən keçir',
 'history-show-deleted' => 'Yalnız silinənlər',
 'histfirst' => 'Ən əvvəlki',
@@ -1272,9 +1275,9 @@ Bu səhifənin silinmə və addəyişmə jurnalı aşağıda göstərilmişdir:"
 Əvvəllər yüklənmiş fayllara baxmaq üçün [[Special:FileList|yüklənmiş fayllar siyahısına]] keçin, həmçinin (təkrar) yüklənmiş fayllara [[Special:Log/upload|yükləmə jurnalında]], silinmiş fayllara [[Special:Log/delete|silinmə jurnalında]] baxa bilərsiniz.
 
 Məqaləyə fayl yerləşdirmək üçün aşağıdaki formalardan birini istifadə edin:
-* Faylın tam versiyasını yerləşdirmək üçün: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''';
-* Faylın 200 pikselədək kiçildilmiş versiyasını mətndən solda, altında izahla yerləşdirmək üçün: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|təsvir]]</nowiki></tt>''';
-* Səhifədə faylın özünü göstərmədən ona birbaşa keçid yerləşdirmək üçün: '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''.",
+* Faylın tam versiyasını yerləşdirmək üçün: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''';
+* Faylın 200 pikselədək kiçildilmiş versiyasını mətndən solda, altında izahla yerləşdirmək üçün: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|təsvir]]</nowiki></code>''';
+* Səhifədə faylın özünü göstərmədən ona birbaşa keçid yerləşdirmək üçün: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''.",
 'upload-permitted' => 'İcazə verilən fayl tipləri: $1.',
 'upload-preferred' => 'İcazə verilən fayl tipləri: $1.',
 'upload-prohibited' => 'İcazə verilməyən fayl tipləri: $1.',
@@ -1308,9 +1311,9 @@ Məqaləyə fayl yerləşdirmək üçün aşağıdaki formalardan birini istifad
 'tmp-write-error' => 'Müvəqqəti fayl yazılarkən xəta.',
 'largefileserver' => 'Faylın ölçüsü yol verilən həddi aşır.',
 'emptyfile' => 'Yüklədiyiniz fayl boşdur. Bu faylın adında olan hərf səhvi ilə bağlı ola bilər. Xahiş olunur ki, doğurdan da bu faylı yükləmək istədiyinizi yoxlayasınız.',
-'fileexists' => "Yükləmək istədiyiniz adda fayl mövcuddur.
-Lütfən '''<tt>[[:$1]]</tt>''' keçidini yoxlayın və bu faylı yükləmək istədiyinizdən əmin olun.
-[[$1|thumb]]",
+'fileexists' => 'Yükləmək istədiyiniz adda fayl mövcuddur.
+Lütfən <strong>[[:$1]]</strong> keçidini yoxlayın və bu faylı yükləmək istədiyinizdən əmin olun.
+[[$1|thumb]]',
 'uploadwarning' => 'Yükləmə xəbərdarlığı',
 'savefile' => 'Faylı qeyd et',
 'uploadedimage' => 'yükləndi "[[$1]]"',
@@ -1452,7 +1455,13 @@ $1',
 'filedelete-reason-otherlist' => 'Başqa səbəb',
 'filedelete-reason-dropdown' => '*Əsas silmə səbəbi
 ** Müəllif hüququ pozuntusu
-** Dublikat fayl',
+** Dublikat fayl
+** Keyfiyyətsiz şəkil
+** İstifadəsiz fayl
+** Qeyri-ensiklopedik şəxs
+** Lisenziyasız fayl
+** Azad şəkillə əvəz olundu
+** Müəllif istəyi',
 'filedelete-edit-reasonlist' => 'Silmə səbəblərini redaktə et',
 
 # MIME search
@@ -1654,8 +1663,8 @@ Fərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-help
 'listgrouprights-rights' => 'Hüquqlar',
 'listgrouprights-helppage' => 'Help:Qrup hüquqları',
 'listgrouprights-members' => '(üzvləri)',
-'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
-'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
+'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <code>($2)</code></span>',
+'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <code>($2)</code></span>',
 'listgrouprights-addgroup' => '{{PLURAL:$2|Qrupu}} əlavə et: $1',
 'listgrouprights-removegroup' => '{{PLURAL:$2|Qrupu}} sil: $1',
 'listgrouprights-addgroup-all' => 'Bütün qrupları əlavə et',
@@ -2319,15 +2328,10 @@ Zəhmət olmasa başqa ad seçin.',
 # Info page
 'pageinfo-title' => '"$1" üçün məlumat',
 'pageinfo-header-edits' => 'Redaktələr',
-'pageinfo-header-watchlist' => 'İzləmə siyahısı',
-'pageinfo-header-views' => 'Görünüş',
-'pageinfo-subjectpage' => 'Səhifə',
-'pageinfo-talkpage' => 'Müzakirə səhifəsi',
+'pageinfo-views' => 'Göstərmə səhifəsi',
 'pageinfo-watchers' => 'Baxış sayı',
 'pageinfo-edits' => 'Redaktələrin sayı',
 'pageinfo-authors' => 'Fərqli müəlliflərin sayı',
-'pageinfo-views' => 'Göstərmə səhifəsi',
-'pageinfo-viewsperedit' => 'Redaktə başına göstərmə',
 
 # Skin names
 'skinname-standard' => 'Classic',
index bc72730..77b913b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Bashkir (Ð\91ашҡортса)
+/** Bashkir (башҡортса)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -37,19 +37,20 @@ $namespaceNames = array(
        NS_TEMPLATE_TALK    => 'Ҡалып_буйынса_фекерләшеү',
        NS_HELP             => 'Белешмә',
        NS_HELP_TALK        => 'Белешмә_буйынса_фекерләшеү',
-       NS_CATEGORY         => 'ТөÑ\80көм',
-       NS_CATEGORY_TALK    => 'ТөÑ\80көм_буйынса_фекерләшеү',
+       NS_CATEGORY         => 'Ð\9aаÑ\82егоÑ\80иÑ\8f',
+       NS_CATEGORY_TALK    => 'Ð\9aаÑ\82егоÑ\80иÑ\8f_буйынса_фекерләшеү',
 );
 
 $namespaceAliases = array(
-       'Фекер_алышыу' => NS_TALK,
+       'Фекер_алышыу'                => NS_TALK,
        'Ҡатнашыусы_м-н_фекер_алышыу' => NS_USER_TALK,
-       '$1_б-са_фекер_алышыу' => NS_PROJECT_TALK,
-       'Рәсем_б-са_фекер_алышыу' => NS_FILE_TALK,
+       '$1_б-са_фекер_алышыу'        => NS_PROJECT_TALK,
+       'Рәсем_б-са_фекер_алышыу'     => NS_FILE_TALK,
        'MediaWiki_б-са_фекер_алышыу' => NS_MEDIAWIKI_TALK,
-       'Ҡалып_б-са_фекер_алышыу' => NS_TEMPLATE_TALK,
-       'Белешмә_б-са_фекер_алышыу' => NS_HELP_TALK,
-       'Категория' => NS_CATEGORY,
+       'Ҡалып_б-са_фекер_алышыу'     => NS_TEMPLATE_TALK,
+       'Белешмә_б-са_фекер_алышыу'   => NS_HELP_TALK,
+       'Төркөм'                      => NS_CATEGORY,
+       'Төркөм_буйынса_фекерләшеү'   => NS_CATEGORY_TALK,
        'Категория_б-са_фекер_алышыу' => NS_CATEGORY_TALK,
 );
 
@@ -70,7 +71,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Һуңғы үҙгәртеүҙәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер',
 'tog-newpageshidepatrolled' => 'Яңы биттәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер',
 'tog-extendwatchlist' => 'Барлыҡ үҙгәртеүҙәрҙе үҙ эсенә алған, киңәйтелгән күҙәтеү исемлеге',
-'tog-usenewrc' => 'Һуңғы үҙгәртеүҙәрҙәрҙең сифатлыраҡ исемлеген ҡулланырға (JavaScript кәрәкле)',
+'tog-usenewrc' => 'Һуңғы төҙәтеүҙәр һәм күҙәтеү исемлегендәге үҙгәрештерҙе төркөмдәргә булергә (JavaScript)',
 'tog-numberheadings' => 'Башисемдәрҙе автоматик рәүештә номерландыр',
 'tog-showtoolbar' => 'Мөхәррирләү ваҡытында өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәкле)',
 'tog-editondblclick' => 'Биттәрҙе ике сиртеү менән мөхәррирләргә (JavaScript кәрәкле)',
@@ -78,17 +79,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Бүлектәрҙе исемдәренә сысҡан менән сиртеп үҙгәртергә (JavaScript кәрәкле)',
 'tog-showtoc' => 'Эстәлек күрһәтелһен (3-тән күп башлығы булған биттәрҙә)',
 'tog-rememberpassword' => 'Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп яҙыуым хәтерләнһен',
-'tog-watchcreations' => 'Мин төҙөгән биттәрҙе күҙәтеү исемлегенә яҙырға',
-'tog-watchdefault' => 'Үҙгәрткән биттәрем күҙәтеү исемлегемә өҫтәлһен',
-'tog-watchmoves' => 'Ð\98Ñ\81емен Ò¯Ò\99гÓ\99Ñ\80Ñ\82кÓ\99н Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80ем ÐºÒ¯Ò\99Ó\99Ñ\82еү Ð¸Ñ\81емлегемÓ\99 Ó©Ò«Ñ\82Ó\99лһен',
-'tog-watchdeletion' => 'ЮйÒ\93ан Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80ем ÐºÒ¯Ò\99Ó\99Ñ\82еү Ð¸Ñ\81емлегемÓ\99 Ó©Ò«Ñ\82Ó\99лһен',
+'tog-watchcreations' => 'Мин төҙөгән биттәрҙе һәм күсергән файлдарҙы күҙәтеү исемлегенә өҫтәргә',
+'tog-watchdefault' => 'Мин үҙгәрткән биттәр һәм файлдар аңлатмаһын күҙәтеү исемлегенә өҫтәргә',
+'tog-watchmoves' => 'Ð\9cин Ð¸Ñ\81емен Ò¯Ò\99гÓ\99Ñ\80Ñ\82кÓ\99н Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80Ò\99е Ò»Ó\99м Ñ\84айлдаÑ\80Ò\99Ñ\8b ÐºÒ¯Ò\99Ó\99Ñ\82еү Ð¸Ñ\81емлегенÓ\99 Ó©Ò«Ñ\82Ó\99Ñ\80гÓ\99',
+'tog-watchdeletion' => 'Ð\9cин Ñ\8eйÒ\93ан Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80Ò\99е Ò»Ó\99м Ñ\84айлдаÑ\80Ò\99Ñ\8b ÐºÒ¯Ò\99Ó\99Ñ\82еү Ð¸Ñ\81емлегенÓ\99 Ó©Ò«Ñ\82Ó\99Ñ\80гÓ\99',
 'tog-minordefault' => 'Бөтә үҙгәртеүҙәрҙе, ғәҙәттә, әҙ үҙгәреш тип билдәләргә',
 'tog-previewontop' => 'Алдан байҡау тәҙрәһен мөхәррирләү битенең өҫтөнә ҡуйырға',
 'tog-previewonfirst' => 'Мөхәррирләүгә күскәндә алдан ҡарау күрһәтелһен',
 'tog-nocache' => 'Браузерҙа биттәрҙе кэшлауҙы тыйырға',
-'tog-enotifwatchlistpages' => 'Ð\9aÒ¯Ò\99Ó\99Ñ\82еү Ð¸Ñ\81емлегендÓ\99ге Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80Ò\99ең Ò¯Ò\99гÓ\99Ñ\80еÑ\88Ñ\82Ó\99Ñ\80е Ñ\82Ñ\83Ñ\80аһÑ\8bнда Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ñ\88а Ð±ÐµÐ»Ð´ÐµÑ\80ергә',
+'tog-enotifwatchlistpages' => 'Ð\9aÒ¯Ò\99Ó\99Ñ\82еү Ð¸Ñ\81емлегендÓ\99ге Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80Ò\99ең Ò»Ó\99м Ñ\84айлдаÑ\80Ò\99Ñ\8bÒ£ Ò¯Ò\99гÓ\99Ñ\80еÑ\88Ñ\82Ó\99Ñ\80е Ñ\82Ñ\83Ñ\80аһÑ\8bнда Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ñ\88а Ñ\85Ó\99бÓ\99Ñ\80 Ð¸Ñ\82ергә',
 'tog-enotifusertalkpages' => 'Шәхси фекер алышыу битем үҙгәртелеү тураһында электрон почта аша белдерергә',
-'tog-enotifminoredits' => 'Әҙ генә үҙгәрештәр тураһында электрон почта аша белдерергә',
+'tog-enotifminoredits' => 'Биттәрҙең һәм файлдарҙың аҙ гынә үҙгәрештәре тураһында ла электрон почта аша хәбер итергә',
 'tog-enotifrevealaddr' => 'Белдереү хәбәрҙәрендә почта адресым күрһәтелһен',
 'tog-shownumberswatching' => 'Битте күҙәтеү исемлегенә өҫтәгән ҡулланыусылар һанын күрһәтергә',
 'tog-oldsig' => 'Хәҙерге имза:',
@@ -274,7 +275,7 @@ $messages = array(
 'mediawikipage' => 'Хәбәрҙәр битен ҡарарға',
 'templatepage' => 'Ҡалып битен ҡарарға',
 'viewhelppage' => 'Ярҙам битен ҡарарға',
-'categorypage' => 'ТөÑ\80көм битен ҡарарға',
+'categorypage' => 'Ð\9aаÑ\82егоÑ\80иÑ\8f битен ҡарарға',
 'viewtalkpage' => 'Фекер алышыу битен ҡарарға',
 'otherlanguages' => 'Башҡа телдәрҙә',
 'redirectedfrom' => '($1 битенән йүнәлтелде)',
@@ -303,7 +304,7 @@ $1',
 'currentevents-url' => 'Project:Ағымдағы ваҡиғалар',
 'disclaimers' => 'Яуаплылыҡтан баш тартыу',
 'disclaimerpage' => 'Project:Яуаплылыҡтан баш тартыу',
-'edithelp' => 'Ð\9cÓ©Ñ\85Ó\99Ñ\80иÑ\80лÓ\99ү белешмәһе',
+'edithelp' => 'ТөÒ\99Ó\99Ñ\82еү белешмәһе',
 'edithelppage' => 'Help:Төҙәтеү белешмәһе',
 'helppage' => 'Help:Белешмә',
 'mainpage' => 'Баш бит',
@@ -322,11 +323,14 @@ $1',
 'versionrequiredtext' => 'Был бит менән эшләү өсөн MediaWiki-ның $1 версияһы кәрәк. [[Special:Version|Ҡулланылған версия тураһында мәғлүмәт битен]] ҡара.',
 
 'ok' => 'Тамам',
-'pagetitle' => '{{SITENAME}} проектынан',
 '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' => 'төҙәтеү',
@@ -421,6 +425,8 @@ $1',
 'cannotdelete' => '«$1» исемле битте йәки файлды юйып булмай.
 Уны башҡа ҡулланыусы юйған булыуы мөмкин.',
 'cannotdelete-title' => '"$1" битен юйып булмай',
+'delete-hook-aborted' => 'Үҙгәртеүҙе махсус-процедура кире ҡаҡты.
+Өҫтәмә аңлатма килтерелмәй.',
 'badtitle' => 'Ярамаған исем',
 'badtitletext' => 'Биттең һоратылған исеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики исеме яңылыш күрһәтелгән. Исемдә тыйылған символдар булыуы ла мөмкин.',
 'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.',
@@ -453,6 +459,10 @@ $2',
 'filereadonlyerror' => "«$1» файлын үҙгәртеп булмай, сөнки «$2» һаҡлағысы «уҡыу өсөн генә» тәртибендә.
 
 Был сикләүҙе индергән хаким биргән аңлатма:«''$3''».",
+'invalidtitle-knownnamespace' => '"$2" исем арауығы һәм "$3"  тексты исем өсөн ярамай',
+'invalidtitle-unknownnamespace' => '"$2" тексты һәм "$1" арауыҡ өсөн билдәһеҙ номерлы исем ярамай',
+'exception-nologin' => 'Танылмағанһығыҙ',
+'exception-nologin-text' => 'Был битте ҡарар йәки һоратылған ғәмәлде башҡарыр өсөн системала танылыу кәрәк.',
 
 # Virus scanner
 'virus-badscanner' => "Көйләү хатаһы: Билдәһеҙ вирустар сканеры: ''$1''",
@@ -473,6 +483,7 @@ $2',
 'remembermypassword' => 'Был компьютерҙа паролемде иҫләргә ($1 {{PLURAL:$1|көндән|көндән}} күп түгел)',
 'securelogin-stick-https' => 'Танылғандан һуң HTTPS менән бәйләнеште ҡалдырырға',
 'yourdomainname' => 'Һеҙҙең домен',
+'password-change-forbidden' => 'Был викила паролегеҙҙе үҙгәртә алмайһығыҙ.',
 'externaldberror' => 'Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.',
 'login' => 'Танышыу йәки теркәлеү',
 'nav-login-createaccount' => 'Танышыу йәки теркәлеү',
@@ -634,10 +645,10 @@ $2
 'hr_tip' => 'Горизонталь һыҙыҡ (бик йыш ҡулланмағыҙ)',
 
 # Edit pages
-'summary' => 'Үҙгәртеүҙең ҡыҫҡаса тасуирламаһы:',
+'summary' => 'Үҙгәртеү аңлатмаһы:',
 'subject' => 'Тема/исем:',
 'minoredit' => 'Әҙ генә үҙгәрештәр',
-'watchthis' => 'Ð\91Ñ\8bл Ð±Ð¸Ñ\82Ñ\82е ÐºÒ¯Ò\99Ó\99Ñ\82еүÒ\99Ó\99Ñ\80 Ð¸Ñ\81емлегенÓ\99 Ð¸Ð½Ð´ÐµÑ\80еÑ\80гә',
+'watchthis' => 'Ð\9aÒ¯Ò\99Ó\99Ñ\82еү Ð¸Ñ\81емлегенә',
 'savearticle' => 'Яҙҙырып ҡуйырға',
 'preview' => 'Ҡарап сығыу',
 'showpreview' => 'Ҡарап сығырға',
@@ -708,6 +719,10 @@ $2
 'noarticletext-nopermission' => 'Хәҙерге ваҡытта был биттә текст юҡ.
 Һеҙ башҡа мәҡәләләрҙә [[Special:Search/{{PAGENAME}}|был исемде]] йәки
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдағы яҙмаларҙы] эҙләй алаһығыҙ.</span>',
+'missing-revision' => '"{{PAGENAME}}" исемле биттең $1 номерлы өлгөһө юҡ.
+
+Был хәл, ғәҙәттә, юйылған биткә яһалған һылтанманын ваҡыты үтеүенән барлыҡҡа килә.
+Тулыраҡ мәғлүмәт өсөн ҡарағыҙ: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} юйыу яҙмалары].',
 'userpage-userdoesnotexist' => '«<nowiki>$1</nowiki>» иҫәп яҙыуы юҡ. Һеҙ бындай бит яһарға йәки битте үҙгәртергә теләһәгеҙ яңынан тикшерегеҙ.',
 'userpage-userdoesnotexist-view' => '«$1» исемле иҫәп яҙыуы юҡ.',
 'blocked-notice-logextract' => 'Хәҙергә был ҡатнашыусы ябылған. Һуңғы ҡулланыусы ябыу яҙмаһы:',
@@ -825,6 +840,13 @@ $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' => 'Биттә һалыныу тәрәнлеге сиге үтеп кителгән',
+'parser-unstrip-loop-warning' => 'Ябылмаған pre табылды',
+'parser-unstrip-recursion-limit' => '($1) рекурсия сиге үтеп кителгән',
+'converter-manual-rule-error' => 'Тел әйлендереү ҡағиҙәһендә хата табылды',
 
 # "Undo" feature
 'undo-success' => 'Был үҙгәртеүҙе кире алып була. Зинһар, улар һеҙҙе ҡыҙыҡһындырған үҙгәртеүҙәр булыуынан шикләнмәҫ өсөн версияларҙы сағыштырыуҙы ҡарағыҙ һәм үҙгәртеүҙәрҙе ғәмәлғә керетер өсөн «Битте һаҡларға» төймәһенә баҫығыҙ.',
@@ -1001,6 +1023,8 @@ $1",
 
 # Diffs
 'history-title' => '$1 битенең үҙгәртеү тарихы',
+'difference-title' => '$1 — версиялар араһындағы айырма',
+'difference-title-multipage' => '«$1» һәм «$2» биттәре араһындағы айырма',
 'difference-multipage' => '(Биттәр араһындағы айырма)',
 'lineno' => '$1 юл:',
 'compareselectedversions' => 'Һайланған версияларҙы сағыштырыу',
@@ -1008,6 +1032,10 @@ $1",
 'editundo' => 'кире алыу',
 'diff-multi' => '({{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)',
 'diff-multi-manyusers' => '(Кәмендә {{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)',
+'difference-missing-revision' => '$1 айырмаһының {{PLURAL:$2|бер өлгөһө|$2 өлгөһө}} табылманы.
+
+Был хәл, ғәҙәттә, юйылған биткә яһалған айырма һылтанмаһының ваҡыты үтеүенән барлыҡҡа килә.
+Тулыраҡ мәғлүмәт өсөн ҡарағыҙ: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} юйыу яҙмалары].',
 
 # Search results
 'searchresults' => 'Эҙләү һөҙөмтәләре',
@@ -1278,6 +1306,7 @@ $1",
 'right-writeapi' => 'Яҙҙырыу өсөн API ҡулланыу',
 'right-delete' => 'Биттәрҙе юйырға',
 'right-bigdelete' => 'Тарихы оҙон булған биттәрҙе юйыу',
+'right-deletelogentry' => 'Журналдың билдәле яҙмаларын юйыу һәм тергеҙеү.',
 'right-deleterevision' => 'Биттәрҙең күрһәтелгән өлгөләрен юйыу һәм тергеҙеү',
 'right-deletedhistory' => 'Биттәрҙең юйылған тарих яҙмаларын текстһыҙ ҡарау',
 'right-deletedtext' => 'Биттең юйылған өлгөләре араһындағы юйылған текстты һәм үҙгәртеүҙәрҙе ҡарау',
@@ -1421,9 +1450,9 @@ $1",
 Элек тейәлгән файлдарҙы байҡар өсөн [[Special:FileList|тейәлгән файлдар исемлеген]] ҡарағыҙ. Файл тейәүҙәр шулай уҡ [[Special:Log/upload|тейәү яҙмаларына]], юйыуҙар иһә [[Special:Log/delete|юйыу яҙмаларына]] яҙылып баралар.
 
 Файлды мәҡәләгә өҫтәү өсөн киләһе юлдарҙы ҡуллана алаһығыҙ:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' — файлдың тулы өлгөһөн ҡуйыр өсөн;
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|тасуирлама]]</nowiki></tt>''' — файлдың киңлек буйынса 200 нөктәгә тиклем бәләкәсәйтелгән, һулға тигеҙләнгән һәм аҫтында тасуирламаһы булған өлгөһөн ҡуйыр өсөн;
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' — эстәлеген биттә күрһәтмәйенсә файлға һылтанма ҡуйыу өсөн.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' — файлдың тулы өлгөһөн ҡуйыр өсөн;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|тасуирлама]]</nowiki></code>''' — файлдың киңлек буйынса 200 нөктәгә тиклем бәләкәсәйтелгән, һулға тигеҙләнгән һәм аҫтында тасуирламаһы булған өлгөһөн ҡуйыр өсөн;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' — эстәлеген биттә күрһәтмәйенсә файлға һылтанма ҡуйыу өсөн.",
 'upload-permitted' => 'Рөхсәт ителгән файл типтары: $1.',
 'upload-preferred' => 'Уңайлы файл типтары: $1.',
 'upload-prohibited' => 'Тыйылған файл типтары: $1.',
@@ -1470,21 +1499,21 @@ $1",
 Был файлдың исемен кереткән ваҡытта ебәрелгән хата арҡаһында булыуы мөмкин.
 Зинһар, һеҙ ысынлап та был файлды теләргә теләйһегеҙме икәнен тикшерегеҙ.',
 'windows-nonascii-filename' => 'Был вики махсус символ булған файл исемдәрен терәкләмәй.',
-'fileexists' => "Бындай исемле файл бар инде, зинһар, уны алыштырырға теләүегеҙҙә шикләнһәгеҙ,  '''<tt>[[:$1]]</tt>'''тикшерегеҙ.
-[[$1|thumb]]",
-'filepageexists' => "Был файлдың тасуирламаһы бите булдырылған инде: '''<tt>[[:$1]]</tt>''', әммә бындай исемле файл юҡ.
+'fileexists' => 'Бындай исемле файл бар инде, зинһар, уны алыштырырға теләүегеҙҙә шикләнһәгеҙ,  <strong>[[:$1]]</strong>тикшерегеҙ.
+[[$1|thumb]]',
+'filepageexists' => 'Был файлдың тасуирламаһы бите булдырылған инде: <strong>[[:$1]]</strong>, әммә бындай исемле файл юҡ.
 Керетелгән тасуирлама файлдың тасуирламаһы битендә сыҡмаясаҡ.
 Яңы тасуирлама өҫтәр өсөн, һеҙгә уны ҡул менән үҙгәртергә тура киләсәк.
-[[$1|thumb]]",
-'fileexists-extension' => "Оҡшаш исемле файл бар: [[$2|thumb]]
-* Тейәлгән файлдың исеме: '''<tt>[[:$1]]</tt>'''
-* Булған файлдың исеме: '''<tt>[[:$2]]</tt>'''
-Зинһар, башҡа исем һайлағыҙ.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Оҡшаш исемле файл бар: [[$2|thumb]]
+* Тейәлгән файлдың исеме: <strong>[[:$1]]</strong>
+* Булған файлдың исеме: <strong>[[:$2]]</strong>
+Зинһар, башҡа исем һайлағыҙ.',
 'fileexists-thumbnail-yes' => "Файл бәләкәйтелгән өлгө ''(шартлы рәсем)'' булырға тейеш.
 [[$1|thumb]]
-Зинһар, '''<tt>[[:$1]]</tt>''' файлын тикшерегеҙ.
+Зинһар, <strong>[[:$1]]</strong> файлын тикшерегеҙ.
 Әгәр ул ошо уҡ файлдың төп өлгөһө булһа, уның бәләкәйтелгән өлгөһөн айырым тейәүҙең кәрәге юҡ.",
-'file-thumbnail-no' => "Файлдың исеме '''<tt>$1</tt>''' менән башлана.
+'file-thumbnail-no' => "Файлдың исеме <strong>$1</strong> менән башлана.
 Бәлки, ул рәсемдең бәләкәйтелгән өлгөһөлөр ''(шартлы рәсем)''.
 Әгәр һеҙҙә был рәсемдең ҙур өлгөһө булһа, зинһар, уны керетегеҙ йәки файлдың исемен үҙгәртегеҙ.",
 'fileexists-forbidden' => 'Бындай исемле файл бар инде һәм ул үҙгәртелә алмай.
@@ -1560,11 +1589,14 @@ $1',
 'backend-fail-closetemp' => 'Ваҡытлы файлды ябып булмай.',
 'backend-fail-read' => '«$1» файлын уҡып булмай.',
 'backend-fail-create' => '«$1» файлын яҙып булмай.',
+'backend-fail-maxsize' => '$1 файлын яҙып булманы, сөнки уның күләме {{PLURAL:$2|$2 байттан|$2 байттан}} күп.',
 'backend-fail-readonly' => '$1 һаҡлағысы әлегә уҡыу өсөн генә асыҡ. Сәбәбе: $2',
 'backend-fail-synced' => '$1 файлы эске һаҡлағыста ярашһыҙ хәлдә тора.',
 'backend-fail-connect' => '"$1" һаҡлағысы менән бәйләнеш яһап булманы.',
 'backend-fail-internal' => '$1 һаҡлағысында билдәһеҙ хата килеп сыҡты',
 'backend-fail-contenttype' => 'Файлды $1 адресына һаҡлар өсөн уның эстәлеге төрөн билдәләп булманы.',
+'backend-fail-batchsize' => 'Һаҡлағыс $1 {{PLURAL:$1|файл операцияһынан|файл операцияһынан}} бер блок алды, сикләү һаны: $2 {{PLURAL:$1|операция|операция}}.',
+'backend-fail-usable' => 'Хоҡуҡтар етмәгәнлектән йәки кәрәкле папкалар булмағанлыҡтан $1 файлын яҙып булманы.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => '"$1" мәғлүмәт базаһы журналына тоташып булманы.',
@@ -1579,6 +1611,7 @@ $1',
 'lockmanager-fail-releaselock' => '"$1" асҡысының биген асып булманы.',
 'lockmanager-fail-db-bucket' => '$1 сегментында етәрле күләмдә бикләү базаһы менән бәйләнеп булманы.',
 'lockmanager-fail-db-release' => '$1 мәғлүмәттәр базаһы биген сисеп булманы.',
+'lockmanager-fail-svr-acquire' => '$1 серверындағы биктәрҙе алып булманы.',
 'lockmanager-fail-svr-release' => '$1 серверы биктәрен сисеп булманы.',
 
 # ZipDirectoryReader
@@ -1690,6 +1723,10 @@ $1',
 Тулыраҡ мәғлүмәтте [$2 файл тасуирламаһы битендә] ҡарарға мөмкин.',
 'sharedupload-desc-here' => 'Был файл $1 базаһынан һәм башҡа проекттарҙа ҡулланыла ала.
 [$2 файл тасуирламаһы битенән] тулыраҡ мәғлүмәт түбәндә килтерелгән.',
+'sharedupload-desc-edit' => 'Файл килгән урын: $1. Был файл башҡа сайттарҙа ҡулланылырға мөмкин.
+Тасуиламаһын [$2 кәрәкле биттә] үҙгәртергә була.',
+'sharedupload-desc-create' => 'Файл килгән урын: $1. Был файл башҡа сайттарҙа ҡулланылырға мөмкин.
+Тасуиламаһын [$2 кәрәкле биттә] үҙгәртергә була.',
 'filepage-nofile' => 'Бындай исемле файл юҡ.',
 'filepage-nofile-link' => 'Бындай исемле файл юҡ. Һеҙ уны [$1 тейәй алаһығыҙ].',
 'uploadnewversion-linktext' => 'Был файлдың яңы версияһын тейәргә',
@@ -1729,7 +1766,7 @@ $1',
 # MIME search
 'mimesearch' => 'MIME буйынса эҙләү',
 'mimesearch-summary' => 'Был бит файлдарҙы MIME-төрҙәре аша һайларға мөмкинлек бирә.
-Эҙләү форматы: эстәлек_төрө/икенсе_быуын_төрө, мәҫәлән, <tt>image/jpeg</tt>',
+Эҙләү форматы: эстәлек_төрө/икенсе_быуын_төрө, мәҫәлән, <code>image/jpeg</code>',
 'mimetype' => 'MIME-төр:',
 'download' => 'күсереп яҙырға',
 
@@ -1776,7 +1813,7 @@ $1',
 
 'disambiguations' => 'Күп мәғәнәле төшөнсәләр биттәренә һылтанған биттәр',
 'disambiguationspage' => 'Template:Күп_мәғәнәлелек',
-'disambiguations-text' => "ТүбÓ\99ндÓ\99ге Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80Ò\99Ó\99н '''күп Ð¼Ó\99Ò\93Ó\99нÓ\99ле Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80гÓ\99''' Ò»Ñ\8bлÑ\82анма Ñ\8fһалÒ\93ан.
+'disambiguations-text' => "Ð\9aилÓ\99һе Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80Ò\99Ó\99 ÐºÓ\99мендÓ\99 Ð±ÐµÑ\80 '''күп Ð¼Ó\99Ò\93Ó\99нÓ\99ле Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80гÓ\99''' Ò»Ñ\8bлÑ\82анма Ð±Ð°Ñ\80.
 Бының урынына улар фәҡәт үҙенә кәрәкле мәҡәләгә һылтанырға тейеш.<br />
 Әгәр биттә исеме [[MediaWiki:Disambiguationspage]] битендә күрһәтелгән ҡалып ҡулланылһа, ул күп мәғәнәле тип иҫәпләнә.",
 
@@ -1824,6 +1861,8 @@ $1',
 'wantedpages' => 'Кәрәкле биттәр',
 'wantedpages-badtitle' => 'Һорау һөҙөмтәләрендә дөрөҫ булмаған исем: $1',
 'wantedfiles' => 'Кәрәкле файлдар',
+'wantedfiletext-cat' => 'Киләһе файлдарҙы улар булмаған хәлдә ҡулланырға тырышыла. Тыш һаҡлағыстарҙа булған файлдар был исемлеккә яңылыш эләгеүе мөмкин. Бындай хаталы белдереүҙәр <del>һыҙыҡ</del> менән күрһәтеләсәк. Шулай уҡ, булмаған файлдарҙы алған биттәр киләһе исемлектә күрһәтелгән: [[:$1]]',
+'wantedfiletext-nocat' => 'Киләһе файлдарҙы улар булмаған хәлдә ҡулланырға тырышыла. Тыш һаҡлағыстарҙа булған файлдар был исемлеккә яңылыш эләгеүе мөмкин. Бындай хаталы белдереүҙәр <del>һыҙыҡ</del> менән күрһәтеләсәк.',
 'wantedtemplates' => 'Кәрәкле ҡалыптар',
 'mostlinked' => 'Иң күп һылтанма яһалған биттәр',
 'mostlinkedcategories' => 'Иң күп һылтанма яһалған категориялар',
@@ -1882,6 +1921,7 @@ $1',
 'alllogstext' => '{{SITENAME}} проектының дөйөм яҙмалар журналы исемлеге. Һеҙ һөҙөмтәләрҙе журнал төрө буйынса, ҡатаншыусы исеме буйынса (ҙур/бәләкәй хәрефкә һиҙгер) йәки ҡағылған бит исеме буйынса (шулай уҡ ҙур/бәләкәй хәрефкә һиҙгер) һайлап ала алаһығыҙ.',
 'logempty' => 'Журнал яҙмаларында һайланған юлдар юҡ.',
 'log-title-wildcard' => 'Керетелгән хәрефтәр менән башланған исемдәрҙе табырға',
+'showhideselectedlogentries' => 'Журналдың һайланған яҙмаларын күрһәтергә/йәшерергә.',
 
 # Special:AllPages
 'allpages' => 'Бөтә биттәр',
@@ -1903,6 +1943,8 @@ $1',
 'allpages-hide-redirects' => 'Йүнәлтеүҙәрҙе йәшерергә',
 
 # SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Һеҙ биттең кэшланған өлгөһөн ҡарайһығыҙ. Уның $1 элек яңыртылыуы мөмкин.',
+'cachedspecial-viewing-cached-ts' => 'Һеҙ биттең кэшланған өлгөһөн ҡарайһығыҙ. Уның хәҙерге өлгөнән бик ныҡ айырылыуы мөмкин.',
 'cachedspecial-refresh-now' => 'Һуңғы версияны ҡарарға',
 
 # Special:Categories
@@ -1926,7 +1968,7 @@ $1',
 'linksearch-ok' => 'Эҙләү',
 'linksearch-text' => '<code>*.wikipedia.org</code> һымаҡ төркөм билдәләрен ҡулланырға була.
 Кәмендә, өҫкө кимәл домен кәрәк. Мәҫәлән, <code>*.org</code><br />
-Терәкләнгән протоколдар: <tt>$1</tt> (эҙләүегеҙҙә булғандарҙың береһен дә өҫтәмәгеҙ)',
+Терәкләнгән протоколдар: <code>$1</code> (эҙләүегеҙҙә булғандарҙың береһен дә өҫтәмәгеҙ)',
 'linksearch-line' => '$1 адресына $2 битенән һылтанма яһалған',
 'linksearch-error' => 'Төркөм билдәләре URL адрестың башында ғына ҡулланыла ала.',
 
@@ -2116,6 +2158,8 @@ $UNWATCHURL
 'rollback' => 'Үҙгәртеүҙәрҙе кире ҡайтарырға',
 'rollback_short' => 'Кире ҡайтарырға',
 'rollbacklink' => 'кире алырға',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|төҙәтеүҙе|төҙәтеүҙе}} кире алырға',
+'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|төҙәтеүҙән|төҙәтеүҙән}} күберәк кире алырға',
 'rollbackfailed' => 'Кире ҡайтарырғанда барлыҡҡа килгән хата',
 'cantrollback' => 'Үҙгәртеүҙәрҙе кире алыу мөмкин түгел. Битте һуңғы үҙгәртеүсе ҡатнашыусы уның берҙән-бер авторы булып тора.',
 'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|фекер алышыу]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])  кереткән [[:$1]] һуңғы үҙгәртеүҙәрҙе кире алыу мөмкин түгел; башҡа ҡатнашыусы был битте мөхәррирләгән йәки үҙгәртеүҙәрҙе кире алған инде.
@@ -2766,19 +2810,15 @@ The wiki server cannot provide data in a format your client can read.',
 'spambot_username' => 'Спамдан таҙартыусы',
 'spam_reverting' => '$1 һылтанмаһыҙ һуңғы өлгөгә ҡайтарыу',
 'spam_blanking' => 'Бөтә өлгөләрҙә лә $1 һылтанмаһы бар, таҙартыу',
+'spam_deleting' => 'Бөтә өлгөләрҙә лә $1 һылтанма бар, таҙартыу бара',
 
 # Info page
 'pageinfo-title' => '«$1» буйынса мәғлүмәт',
 'pageinfo-header-edits' => 'Үҙгәртеүҙәр',
-'pageinfo-header-watchlist' => 'Күҙәтеү исемлеге',
-'pageinfo-header-views' => 'Ҡарау',
-'pageinfo-subjectpage' => 'Бит',
-'pageinfo-talkpage' => 'Фекер алышыу бите',
+'pageinfo-views' => 'Ҡарау һаны',
 'pageinfo-watchers' => 'Күҙәтеүселәр һаны',
 'pageinfo-edits' => 'Төҙәтеү һаны',
 'pageinfo-authors' => 'Төрлө авторҙар һаны',
-'pageinfo-views' => 'Ҡарау һаны',
-'pageinfo-viewsperedit' => 'Бер үҙгәртеүгә ҡарау һаны',
 
 # Skin names
 'skinname-standard' => 'Классик',
@@ -3639,9 +3679,12 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'api-error-empty-file' => 'Һеҙ ебәргән файл буш.',
 'api-error-emptypage' => 'Яңы буш биттәр яһау тыйыла.',
 'api-error-fetchfileerror' => 'Эске хата: файлды күсергән ваҡытта хата китте',
+'api-error-fileexists-forbidden' => '«$1» исемле файл бар һәм өҫтөнә яҙып булмай.',
+'api-error-fileexists-shared-forbidden' => '«$1» исемле файл уртаҡ файлдар һаҡлағысында бар һәм өҫтөнә яҙып булмай.',
 'api-error-file-too-large' => 'Һеҙ ебәргән файл үтә ҙур.',
 'api-error-filename-tooshort' => 'Файл исеме бик ҡыҫҡа.',
 'api-error-filetype-banned' => 'Был файл төрө тыйылған.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|тыйылған файл төрө|тыйылған файл төрҙәре}}. Рөхсәт ителгән {{PLURAL:$3|файл төрө|файл төрҙәре}} $2.',
 'api-error-filetype-missing' => 'Был файлдың ҡушымтаһы юҡ',
 'api-error-hookaborted' => 'Һеҙ эшләргә теләгән үҙгәртеүҙәр ҡушымтаны тикшереүсе тарафынан өҙөлдө',
 'api-error-http' => 'Эске хата: серверға бәйләнеп булмай.',
index 16c81f5..c6f313c 100644 (file)
@@ -914,7 +914,7 @@ A [[Special:WhatLinksHere/$2|voiständige Listn]] gibt's aa.",
 'filedelete-intro' => "Du léschst dé Daatei '''„[[Media:$1|$1]]“'''.",
 
 # MIME search
-'mimesearch-summary' => 'Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden. Die Eingabe muss immer den Medien- und Subtyp beinhalten: <tt>image/jpeg</tt> (siehe Bildbeschreibungsseite).',
+'mimesearch-summary' => 'Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden. Die Eingabe muss immer den Medien- und Subtyp beinhalten: <code>image/jpeg</code> (siehe Bildbeschreibungsseite).',
 'download' => 'Owerlooden',
 
 # Unused templates
@@ -1039,7 +1039,7 @@ Links as Naumensraim wern do néd afglistt.",
 'linksearch-pat' => 'Suachmuster:',
 'linksearch-ns' => 'Nåmensraum:',
 'linksearch-ok' => 'Suacher',
-'linksearch-text' => "Dé Speziaalseiten do daméglicht d' Suach noch Seiten, in dénen bstimmte Weblinks enthoiden san. Dodabei kennern Blootzhoiter wia beispüsweis  <tt>*.beispü.at</tt> hergnummer wern. Es muass mindastens a Top-Level-Domain, z. Bsp. „*.org“. auhgeem wern. <br />Unterstytzde Protokói: <tt>$1</tt> (Dé bittscheh bei da Suachauhgob auhgeem.)",
+'linksearch-text' => "Dé Speziaalseiten do daméglicht d' Suach noch Seiten, in dénen bstimmte Weblinks enthoiden san. Dodabei kennern Blootzhoiter wia beispüsweis  <code>*.beispü.at</code> hergnummer wern. Es muass mindastens a Top-Level-Domain, z. Bsp. „*.org“. auhgeem wern. <br />Unterstytzde Protokói: <code>$1</code> (Dé bittscheh bei da Suachauhgob auhgeem.)",
 'linksearch-line' => '$1 is valinkt voh $2',
 
 # Special:ListUsers
@@ -1494,9 +1494,6 @@ Bsuach bittschee de Saiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Loka
 'othercontribs' => 'Basiard auf da Orweid voh $1',
 'creditspage' => 'Seiteninformaziónen',
 
-# Info page
-'pageinfo-subjectpage' => 'Seiten',
-
 # Patrolling
 'markedaspatrollederrortext' => 'Du muasst a Seitenänderrung auswön',
 
index a2cac90..1fd41c0 100644 (file)
@@ -181,7 +181,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'اصلاحات چه وارد بوتگین کاربران چه لیست چارگان پناه کن',
 'tog-watchlisthideanons' => 'اصلاحات ناشناسین کاربرانء چه لیست چارگ پناه کن',
 'tog-watchlisthidepatrolled' => 'ته لیست چارگ اصلاحاتی که گردگ بیتگن پناه کن',
-'tog-nolangconversion' => 'غیر فعال کتن بدل کتن مغایرت آن',
 'tog-ccmeonemails' => 'په من یک کپی چه ایمیل آنی که من په دگه کاربران راه داته دیم دی',
 'tog-diffonly' => 'چیر تفاوت محتوای صفحه ی پیش مدار',
 'tog-showhiddencats' => 'پناه ین دسته یان پیش دار',
@@ -1313,9 +1312,9 @@ $1",
 په دیستن یا گشتن پیشگین آپلودی فایلان برو  [[Special:FileList|لیست فایلان آپلودی]], آپلودان و حذفیات هنچو هستن ته [[Special:Log/upload|آمار آپلود]].
 
 په وارد کتن فایل ته یک صفحه ای، چه لینک ته فرم استفاده کن
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' په استفاده چه نسخه کامل فایل
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' په استفاده چه ۲۰۰ پیکسل پهنات ته یک جعبه ته چپ
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''  په مسیری لینک دهگ په فایل بی پیش دارگ فایل",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' په استفاده چه نسخه کامل فایل
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' په استفاده چه ۲۰۰ پیکسل پهنات ته یک جعبه ته چپ
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''  په مسیری لینک دهگ په فایل بی پیش دارگ فایل",
 'upload-permitted' => 'مجازین نوع فایل:  $1.',
 'upload-preferred' => 'ترجیحی نوع فایل:  $1.',
 'upload-prohibited' => 'غیرمجازین نوع فایل:  $1.',
@@ -1347,19 +1346,19 @@ $1",
 'largefileserver' => 'ای فایل مزنتر چه حدی انت که سرور تنظیم بوتت په اجازه دهگ.',
 'emptyfile' => 'فایلی که شما آپلود کتت هالیک انت. شاید شی په خاطر اشتباه نه نام فایل بیت.
 لطفا کتنرل کنیت که آیا واقعا شما لوٹیت ای فایلء آپلود کنیت.',
-'fileexists' => "یک فایل گون ای نام هستنت،لطفا کنترل کن '''<tt>[[:$1]]</tt>''' اگه شما مطمین نهیت اگه لوٹیت نامی آیء عوض کنیت.
-[[$1|thumb]]",
-'filepageexists' => "صفحه توضیح په ای فایل پیشتر شر بوتت ته '''<tt>[[:$1]]</tt>''', بله هچ فایلی گون ای نام هنو نیست.
+'fileexists' => 'یک فایل گون ای نام هستنت،لطفا کنترل کن <strong>[[:$1]]</strong> اگه شما مطمین نهیت اگه لوٹیت نامی آیء عوض کنیت.
+[[$1|thumb]]',
+'filepageexists' => 'صفحه توضیح په ای فایل پیشتر شر بوتت ته <strong>[[:$1]]</strong>, بله هچ فایلی گون ای نام هنو نیست.
 خلاصه ای که شما وارد کت ته صفحه توضیح ظاهر نه بیت.
-په ظاهر کتن خلاصه ادان شما لازمنت آیء دستی اصلاح کنیت.",
-'fileexists-extension' => "یک فایلی گون یک دابی نام هستن: [[$2|thumb]]
-* نام فایلی که آپلود بیت: '''<tt>[[:$1]]</tt>'''
-* نام هستین فایل:'''<tt>[[:$2]]</tt>'''
-لطفا دگه نامی بزوریت.",
+په ظاهر کتن خلاصه ادان شما لازمنت آیء دستی اصلاح کنیت.',
+'fileexists-extension' => 'یک فایلی گون یک دابی نام هستن: [[$2|thumb]]
+* نام فایلی که آپلود بیت: <strong>[[:$1]]</strong>
+* نام هستین فایل:<strong>[[:$2]]</strong>
+لطفا دگه نامی بزوریت.',
 'fileexists-thumbnail-yes' => "فایل به نظر رسیت که یک عکس هورد بوتگین اندازه انت. ''(پنچی انگشت)''. [[$1|thumb]]
-لطفا فایل کنترل کن '''<tt>[[:$1]]</tt>'''.
+لطفا فایل کنترل کن <strong>[[:$1]]</strong>.
 اگر فایل کنترلی هما عکسنت گون اصلی اندازه لازم نهنت یک پنچ انگشتی گیشین آپلود کنیت.",
-'file-thumbnail-no' => "نام فایل شروع بیت گون '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "نام فایل شروع بیت گون <strong>$1</strong>.
 جاه کیت که یک هور بوتگین اندازه عکس ایت.''(پینچ انگشت)''.
 اگر شما را ای عکس ته وضوح کامل هست ایء آپلود کنیت یا که نام فایل عوض کنیت لطفا",
 'fileexists-forbidden' => 'فایل گو ای نام الان هستنت؛و نه توینت سری نویسگ بیتن.
@@ -1511,7 +1510,7 @@ PICT # misc.
 # MIME search
 'mimesearch' => 'گردگ په مایم',
 'mimesearch-summary' => 'ای صفحه فیلتر کتن فایلان په اساس نوع مایم اش فعال کنت.
-ورودی:متحوانوع/زیرنوع،مثل<tt>image/jpeg</tt>.',
+ورودی:متحوانوع/زیرنوع،مثل<code>image/jpeg</code>.',
 'mimetype' => 'نوع مایم:',
 'download' => 'آیرگیزگ',
 
@@ -1694,7 +1693,7 @@ PICT # misc.
 'linksearch-ns' => 'نام فضا:',
 'linksearch-ok' => 'گردگ',
 'linksearch-text' => 'تقریبانی په داب "*.wikipedia.org" شاید استفاده بیت.<br />
-داشتگین پروتوکل: <tt>$1</tt>',
+داشتگین پروتوکل: <code>$1</code>',
 'linksearch-line' => '$1 لینک بوتت چه $2',
 'linksearch-error' => 'تقریبیان شاید فقط ته اول نام هاست جاه کاینت.',
 
index e2b8e2c..f106772 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Filipinayzd
+ * @author Geopoet
  * @author Kaganer
  * @author Steven*fung
  * @author Urhixidur
@@ -33,59 +34,59 @@ $namespaceNames = array(
 );
 
 $magicWords = array(
-       'currentmonth'            => array( '1', 'BULANNGONYAN', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'NGARANBULANNGONYAN', 'CURRENTMONTHNAME' ),
-       'currentday'              => array( '1', 'ALDAWNGONYAN', 'CURRENTDAY' ),
-       'currentyear'             => array( '1', 'TAONNGONYAN', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'PANAHONNGONYAN', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ORASNGONYAN', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LOKALBULAN', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'NGARANLOKALBULAN', 'LOCALMONTHNAME' ),
-       'localday'                => array( '1', 'LOKALALDAW', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'LOKALALDAW2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NGARANLOKALALDAW', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'LOKALTAON', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LOKALPANAHON', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'LOKALORAS', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NUMEROKANPAHINA', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NUMEROKANARTIKULO', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NUMEROKANDOKUMENTO', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NUMEROKANPARAGAMIT', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'NUMEROKANLIGWAT', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'NGARANKANPAHINA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'KAGNGARANKANPAHINA', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NGARANESPASYO', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'KAGNGARANESPASYO', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'OLAYESPASYO', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'KAGOLAYESPASYO', 'TALKSPACEE' ),
-       'fullpagename'            => array( '1', 'TODONGNGARANKANPAHINA', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'KAGNGARANKANTODONGNGARANKANPAHINA', 'FULLPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NGARANKANPAHINANINOLAY', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'KAGNGARANKANPAHINANINOLAY', 'TALKPAGENAMEE' ),
-       'msg'                     => array( '0', 'MSH', 'MSG:' ),
-       'img_right'               => array( '1', 'too', 'right' ),
-       'img_left'                => array( '1', 'wala', 'left' ),
-       'img_none'                => array( '1', 'mayò', 'none' ),
-       'img_center'              => array( '1', 'sentro', 'tangâ', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'nakakawadro', 'kwadro', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'daing kwadro', 'frameless' ),
-       'img_page'                => array( '1', 'pahina=$1', 'pahina $1', 'page=$1', 'page $1' ),
-       'localurl'                => array( '0', 'LOKALURL', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALURLE', 'LOCALURLE:' ),
-       'currentweek'             => array( '1', 'SEMANANGONYAN', 'CURRENTWEEK' ),
-       'localweek'               => array( '1', 'LOKALSEMANA', 'LOCALWEEK' ),
-       'plural'                  => array( '0', 'DAKOL:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'TODONGURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'TODONGURLE:', 'FULLURLE:' ),
-       'language'                => array( '0', '#TATARAMON', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'TATARAMONKANLAOG', 'TATARAMONLAOG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'numberofadmins'          => array( '1', 'NUMEROKANTAGAMATO', 'NUMBEROFADMINS' ),
-       'padleft'                 => array( '0', 'PADWALA', 'PADLEFT' ),
-       'padright'                => array( '0', 'PADTOO', 'PADRIGHT' ),
-       'filepath'                => array( '0', 'FILEDALAN', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__NAKATAGONGKAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAHINASAKATEGORYA', 'PAHINASAKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'PAHINASOKOL', 'PAGESIZE' ),
+       'currentmonth'              => array( '1', 'BULANNGONYAN', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'NGARANBULANNGONYAN', 'CURRENTMONTHNAME' ),
+       'currentday'                => array( '1', 'ALDAWNGONYAN', 'CURRENTDAY' ),
+       'currentyear'               => array( '1', 'TAONNGONYAN', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'PANAHONNGONYAN', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ORASNGONYAN', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LOKALBULAN', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'NGARANLOKALBULAN', 'LOCALMONTHNAME' ),
+       'localday'                  => array( '1', 'LOKALALDAW', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKALALDAW2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NGARANLOKALALDAW', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'LOKALTAON', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LOKALPANAHON', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'LOKALORAS', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NUMEROKANPAHINA', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NUMEROKANARTIKULO', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NUMEROKANDOKUMENTO', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NUMEROKANPARAGAMIT', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'NUMEROKANLIGWAT', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'NGARANKANPAHINA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'KAGNGARANKANPAHINA', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NGARANESPASYO', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'KAGNGARANESPASYO', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'OLAYESPASYO', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'KAGOLAYESPASYO', 'TALKSPACEE' ),
+       'fullpagename'              => array( '1', 'TODONGNGARANKANPAHINA', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'KAGNGARANKANTODONGNGARANKANPAHINA', 'FULLPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NGARANKANPAHINANINOLAY', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'KAGNGARANKANPAHINANINOLAY', 'TALKPAGENAMEE' ),
+       'msg'                       => array( '0', 'MSH', 'MSG:' ),
+       'img_right'                 => array( '1', 'too', 'right' ),
+       'img_left'                  => array( '1', 'wala', 'left' ),
+       'img_none'                  => array( '1', 'mayò', 'none' ),
+       'img_center'                => array( '1', 'sentro', 'tangâ', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'nakakawadro', 'kwadro', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'daing kwadro', 'frameless' ),
+       'img_page'                  => array( '1', 'pahina=$1', 'pahina $1', 'page=$1', 'page $1' ),
+       'localurl'                  => array( '0', 'LOKALURL', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALURLE', 'LOCALURLE:' ),
+       'currentweek'               => array( '1', 'SEMANANGONYAN', 'CURRENTWEEK' ),
+       'localweek'                 => array( '1', 'LOKALSEMANA', 'LOCALWEEK' ),
+       'plural'                    => array( '0', 'DAKOL:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'TODONGURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'TODONGURLE:', 'FULLURLE:' ),
+       'language'                  => array( '0', '#TATARAMON', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'TATARAMONKANLAOG', 'TATARAMONLAOG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'numberofadmins'            => array( '1', 'NUMEROKANTAGAMATO', 'NUMBEROFADMINS' ),
+       'padleft'                   => array( '0', 'PADWALA', 'PADLEFT' ),
+       'padright'                  => array( '0', 'PADTOO', 'PADRIGHT' ),
+       'filepath'                  => array( '0', 'FILEDALAN', 'FILEPATH:' ),
+       'hiddencat'                 => array( '1', '__NAKATAGONGKAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAHINASAKATEGORYA', 'PAHINASAKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'PAHINASOKOL', 'PAGESIZE' ),
 );
 
 $specialPageAliases = array(
@@ -95,50 +96,63 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Kurítan an mga takód:',
+'tog-underline' => 'Linyahan an kilyawan:',
 'tog-justify' => 'Pantayón an mga talodtód',
 'tog-hideminor' => 'Tagóon an mga saradít na paghirá sa nakakaági pa sanáng pagbabàgo',
-'tog-hidepatrolled' => 'Tagóon an mga saradít na paghirá sa nakakaági pa sanáng pagbabàgo',
-'tog-newpageshidepatrolled' => 'Tagóon an mga pigbabantayán na pahina sa lista nin mga bàgong pahina',
-'tog-extendwatchlist' => 'Palakbangón an taytáy kan babantayan tanganing mahilíng an gabós na angay na pagbàgo',
-'tog-usenewrc' => 'Gamiton an pinauróg na mga nakaaging pagbàgo (kaipohan nin JavaScript)',
-'tog-numberheadings' => 'Tolos na pagbílang sa mga pamayohán',
-'tog-showtoolbar' => 'Ipahilíng an toolbar nin paghirá (JavaScript)',
-'tog-editondblclick' => 'Hirahón sa dobleng paglagatík an mga pahina (JavaScript)',
-'tog-editsection' => 'Togótan an paghirá kan seksyon sa paági kan mga takód na [hirá]',
-'tog-editsectiononrightclick' => 'Togotan an paghirá kan seksyon sa pag-lagatik sa walá sa mga titulo nin seksyon (JavaScript)',
-'tog-showtoc' => 'Ipahilíng an indise kan mga laog (para sa mga pahinang igwang sobra sa 3 pamayohan)',
-'tog-rememberpassword' => 'Giromdomón an mga paglaóg ko sa panlibotlibot na iní (sa nakaaging $1 {{PLURAL:$1|aldaw|mga aldaw}})',
-'tog-watchcreations' => 'Idúgang an mga pahinang ginigíbo ko sa pigbabantayan ko',
-'tog-watchdefault' => 'Idúgang an mga pahinang pighíhirá ko sa pigbabantayan ko',
-'tog-watchmoves' => 'Idúgang an mga pahinang piglilípat ko sa pigbabantayan ko',
-'tog-watchdeletion' => 'Idúgang an mga pahinang pigpapárà ko sa pigbabantayan ko',
-'tog-minordefault' => 'Markahán an gabos na paghirá nin sadit na paghirá',
+'tog-hidepatrolled' => 'Tagóa an patrolyadong mga paghirá sa nakakaági pa sanáng pagbabàgo',
+'tog-newpageshidepatrolled' => 'Tagóa an patrolyadong mga pahina gikan sa listahan kan bàgong pahina',
+'tog-extendwatchlist' => 'Palakbanga an bantay-listahan (watchlist) na maipahiling an gabos na pinagbago, bako sana an pinakahurihang binago',
+'tog-usenewrc' => 'Grupong mga pagbabago sa kada pahina kan pinakahuring mga binago asin bantay-listahan (minakaipo nin JavaScript)',
+'tog-numberheadings' => 'Tolos-bilang na mga pamayohán',
+'tog-showtoolbar' => 'Ihayag an toolbar nin paghirá (minakaipo nin JavaScript)',
+'tog-editondblclick' => 'Liwaton an mga pahina sa dobleng pagpindot (minakaipo nin JavaScript)',
+'tog-editsection' => 'Paganaha an paghihirá kan seksyon sa paági kan [liwaton] na kilyawan',
+'tog-editsectiononrightclick' => 'Paganaha an paghihirá kan seksyon sa paagi kan patoong pagpindot sa mga titulo kan seksyon (minakaipo nin JavaScript)',
+'tog-showtoc' => 'Ihayag an taytayan nin mga laog (para sa mga pahinang igwang sobra sa 3 pamayohan)',
+'tog-rememberpassword' => 'Giromdoma an sakong paglaóg sa kilyaw (browser) na ini (para sa maximum na $1 {{PLURAL:$1|aldaw|mga aldaw}})',
+'tog-watchcreations' => 'Idagdag an mga pahina na ako an nagmukna asin an mga sagunson na ako an nagkarga sa sakong bantay-listahan',
+'tog-watchdefault' => 'Idagdag an mga pahina asin mga sagunson na ako an nagliwat sa sakong bantay-listahan',
+'tog-watchmoves' => 'Idagdag an mga pahina asin mga sagunson na ako an nagbalyo sa sakong bantay-listahan',
+'tog-watchdeletion' => 'Idagdag an mga pahina asin mga sagunson na ako an nagpura sa sakong bantay-listahan',
+'tog-minordefault' => 'Markahán gabos na saradit na pagliwat sa paaging panugmad',
 'tog-previewontop' => 'Ipahilíng an patànaw bàgo an kahon nin paghirá',
 'tog-previewonfirst' => 'Ipahilíng an patànaw sa enot na paghirá',
-'tog-nocache' => 'Pugolon an pag-abáng nin mga pahina',
-'tog-enotifwatchlistpages' => 'E-koreohan ako pag pigribayan an pahinang pigbabantayan ko',
+'tog-nocache' => 'Pundoha an pagsaray nin mga pahina sa kilyaw (browser)',
+'tog-enotifwatchlistpages' => 'E-suratan mo ako kunsoarin an sarong pahina o sagunson na yaon sa sakong bantay-listahan pinagliwat',
 'tog-enotifusertalkpages' => 'E-koreohan ako pag pigribáyan an pahina kan sakóng olay',
-'tog-enotifminoredits' => 'E-koreohan man giraray ako para sa saradit na paghirá kan mga pahina',
-'tog-enotifrevealaddr' => 'Ibunyág an adres kan sakuyang e-koreo sa mga surat na pag-abiso',
-'tog-shownumberswatching' => 'Ipahilíng an bilang kan nagbabantay na mga parágamit',
-'tog-fancysig' => 'Mga bàgong pirma (mayò nin tolos na pantakod)',
-'tog-externaleditor' => 'Gamíton mùna an panluwas na editor',
-'tog-externaldiff' => 'Gamíton mùna an diff na panluwás',
-'tog-showjumplinks' => 'Maka-"luksó sa" mga takód na pangabót',
-'tog-uselivepreview' => 'Gamíton an patànaw na direkto (JavaScript) (Experimental)',
-'tog-forceeditsummary' => 'Ipaarám sakuyà kun malaog sa sumáriong blanko nin paghirá',
-'tog-watchlisthideown' => 'Tagóon an mga saradít na paghirá sa pigbabantayán',
-'tog-watchlisthidebots' => 'Tagóon an mga paghirá kan bot sa pigbabantayán',
-'tog-watchlisthideminor' => 'Tagóon an mga saradít na paghirá sa pigbabantayán',
-'tog-nolangconversion' => 'Pogólon an pagríbay nin mga lain-lain',
-'tog-ccmeonemails' => 'Padarahán ako nin mga kopya kan e-koreo na pigpadara ko sa ibang mga parágamit',
-'tog-diffonly' => 'Dai ipahilíng an mga laog nin pahina sa babâ kan kaib',
-'tog-showhiddencats' => 'Ipahiling an mga nakatagong kategorya',
+'tog-enotifminoredits' => 'E-suratan man ako para sa saraditon na mga pagliwat kan mga pahina asin mga sagunson',
+'tog-enotifrevealaddr' => 'Ibuyágyag an sakong e-koreong address sa pan-abisong mga e-koreo',
+'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á',
+'tog-watchlisthideown' => 'Tagóa an sakong mga pagliwat gikan sa bantay-listahan',
+'tog-watchlisthidebots' => 'Tagóa an bot na mga pagliwat gikan sa bantay-listahan',
+'tog-watchlisthideminor' => 'Tagóa an saradít na mga pagliwat gikan sa bantay-listahan',
+'tog-watchlisthideliu' => 'Tagoon an mga pagbabagong nahimo kan mga nakalaog na paragamit gikan sa bantayang listahan',
+'tog-watchlisthideanons' => 'Tagoon an mga pagbabagong nahimo kan mga bakong bistadong paragamit gikan sa bantayang listahan',
+'tog-watchlisthidepatrolled' => 'Tagoon an mga patrolyadong pagbabago gikan sa bantayang listahan',
+'tog-ccmeonemails' => 'Ipadara sako an mga kopya kan e-koreo na pinadara ko sa ibang mga paragamit',
+'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',
 
 'underline-always' => 'Pirmi',
 'underline-never' => 'Nungka',
-'underline-default' => 'Browser na normal',
+'underline-default' => 'Kilyaw na panugmad',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'Baguhon an estilo nin kalwig sa sinasakupan',
+'editfont-default' => 'Kilyawang tugmad',
+'editfont-monospace' => 'Manarong espasyo nin kalwig',
+'editfont-sansserif' => 'Kalwig na Sans-serif',
+'editfont-serif' => 'Kalwig na Serif',
 
 # Dates
 'sunday' => 'Domingo',
@@ -194,120 +208,140 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorya|Mga kategorya}}',
-'category_header' => 'Mga artikulo sa kategoryang "$1"',
+'category_header' => 'Mga pahina sa kategoryang "$1"',
 'subcategories' => 'Mga sub-kategorya',
 'category-media-header' => 'Media sa kategoryang "$1"',
-'category-empty' => "''Mayò nin laog an kategoryang ini sa ngonyan.''",
+'category-empty' => "''Ining kategorya sa presente mayong laog na mga pahina o media.\"",
 'hidden-categories' => '{{PLURAL:$1|Nakatagong kategorya|Mga nakatagong kategorya}}',
 'hidden-category-category' => 'Mga nakatagong kategorya',
-'category-subcat-count-limited' => 'Igwa nin {{PLURAL:$1|sub-kategorya|$1 mga sub-kategorya}} an artikulong ini.',
-'category-article-count' => '{{PLURAL:$2|An mga minasunod na pahina sana an laog kan kategoryang ini|An mga minasunod na {{PLURAL:$1|pahina|$1 pahina}} an yaon sa kategoryang ini, sa $2 gabos.}}',
-'category-article-count-limited' => 'Yaon sa presenteng kategorya an mga minasunod na {{PLURAL:$1|pahina|$1 pahina}}.',
+'category-subcat-count' => '{{PLURAL:$2|Ining kategorya igwa sana kan minasunod na sub-kategorya.|Ining kategorya igwa kan minasunod {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}',
+'category-subcat-count-limited' => 'Ining kategorya igwa kan minasunod na {{PLURAL:$1|sub-kategorya|$1 mga sub-kategorya}}.',
+'category-article-count' => '{{PLURAL:$2|An mga minasunod na pahina sana an laog kan kategoryang ini|An mga minasunod na {{PLURAL:$1|pahina|$1 mga pahina}} an yaon sa kategoryang ini, gikan sa $2 kagabsan.}}',
+'category-article-count-limited' => 'An minasunod na {{PLURAL:$1|pahina|$1 mga pahina}} yaon sa presenteng kategorya.',
+'category-file-count' => '{{PLURAL:$2|Ining kategorya naglalaman sana kan minasunod na sagunson.|An minasunod {{PLURAL:$1|sagunson iyo|$1 na mga sagunson iyo}} sa kategoryang ini, na ginahi sa $2 sa kabilogan.}}',
+'category-file-count-limited' => 'An minasunod {{PLURAL:$1|na sagunson|$1 na mga sagunson}} yaon sa presenteng kategorya.',
 'listingcontinuesabbrev' => 'sunód',
+'index-category' => 'Hinukdoang mga pahina',
+'noindex-category' => 'Bakong hinukdoang mga pahina',
+'broken-file-category' => 'Mga pahina na igwang nagkaparasa na sagunsong kilyawan',
 
 'about' => 'Manonongod',
 'article' => 'Laog na pahina',
 'newwindow' => '(minabukas sa bàgong bintanà)',
-'cancel' => 'Pondohón',
-'moredotdotdot' => 'Dakol pa...',
+'cancel' => 'Kanselaron',
+'moredotdotdot' => 'Kadagdagan...',
 'mypage' => 'An sakóng pahina',
 'mytalk' => 'An sakóng olay',
-'anontalk' => 'Olay para sa IP na ini',
-'navigation' => 'Paglibotlíbot',
+'anontalk' => 'Olay para kaining IP address',
+'navigation' => 'Nabigasyon',
 'and' => '&#32;asin',
 
 # Cologne Blue skin
-'qbfind' => 'Hanápon',
-'qbbrowse' => 'Maghalungkát',
-'qbedit' => 'Hirahón',
+'qbfind' => 'Maghanap',
+'qbbrowse' => 'Halungkáta',
+'qbedit' => 'Liwata',
 'qbpageoptions' => 'Ining pahina',
 'qbpageinfo' => 'Konteksto',
-'qbmyoptions' => 'Mga pahina ko',
+'qbmyoptions' => 'Sakong mga pahina',
 'qbspecialpages' => 'Espesyal na mga pahina',
-'faq' => 'HD',
-'faqpage' => 'Project:HD',
+'faq' => 'PPK (Pirmihang Pighahapot na mga kahaputan)',
+'faqpage' => 'Project:PPK (Pirmihang Pighahapot na mga Kahaputan)',
 
 # Vector skin
-'vector-action-delete' => 'paráon',
+'vector-action-addsection' => 'Idagdag an topic',
+'vector-action-delete' => 'puráon',
 'vector-action-move' => 'Ibalyó',
-'vector-action-protect' => 'Olangán',
-'vector-view-create' => 'Maggíbo',
+'vector-action-protect' => 'Protektaran',
+'vector-action-undelete' => 'Bawion sa pagkapara',
+'vector-action-unprotect' => 'Ribayan an proteksyon',
+'vector-simplesearch-preference' => 'Paganahon an pinapusog na suhestiyon sa paghahanap (Yanong panhanap sana)',
+'vector-view-create' => 'Magmukna',
 'vector-view-edit' => 'Liwatón',
-'vector-view-history' => 'Hilingón an uusipón',
-'vector-view-view' => 'Basáhon',
+'vector-view-history' => 'Tanawon sa historiya',
+'vector-view-view' => 'Basáha',
 'vector-view-viewsource' => 'Hilingón an ginikánan',
-'actions' => 'Mga paghiro',
-'namespaces' => 'Liang-liang',
+'actions' => 'Mga aksyon',
+'namespaces' => 'Mga espasyong ngaran',
+'variants' => 'Mga pinalaen',
 
 'errorpagetitle' => 'Salâ',
-'returnto' => 'Magbwelta sa $1.',
-'tagline' => 'Halì sa {{SITENAME}}',
-'help' => 'Tabang',
-'search' => 'Hanápon',
-'searchbutton' => 'Hanápon',
-'go' => 'Dumanán',
-'searcharticle' => 'Dumanán',
-'history' => 'Uusipón nin pahina',
-'history_short' => 'Uusipón',
-'updatedmarker' => 'nabàgo poon kan huri kong pagdalaw',
-'printableversion' => 'Naipiprentang bersyon',
-'permalink' => 'Permanenteng takod',
-'print' => 'Iprenta',
-'view' => 'Mga paghilíng',
+'returnto' => 'Magbalik sa $1.',
+'tagline' => 'Gikan sa {{SITENAME}}',
+'help' => 'Katabangan',
+'search' => 'Maghanap',
+'searchbutton' => 'Maghanap',
+'go' => 'Dumani',
+'searcharticle' => 'Lakaw',
+'history' => 'Historiya kan pahina',
+'history_short' => 'Historiya',
+'updatedmarker' => 'dinagdagan poon kan sakong huring pagbisita',
+'printableversion' => 'Puwede maimprintang bersyon',
+'permalink' => 'Permanenteng kilyawan',
+'print' => 'Imprintaron',
+'view' => 'Tanawon',
 'edit' => 'Liwatón',
-'create' => 'Maggíbo',
-'editthispage' => 'Hirahón ining pahina',
-'create-this-page' => 'Gibohon ining pahina',
-'delete' => 'Paraon',
-'deletethispage' => 'Paraon ining pahina',
-'undelete_short' => 'Bawion an pagparà {{PLURAL:$1|paghirá|$1 mga paghirá}}',
-'protect' => 'Protehiran',
-'protect_change' => 'ribáyan an proteksyon',
-'protectthispage' => 'Protehiran ining pahina',
-'unprotect' => 'bawion an pagprotehir',
-'unprotectthispage' => 'Bawion an proteksyon kaining pahina',
-'newpage' => 'Bàgong pahina',
-'talkpage' => 'Pag-olayan ining pahina',
-'talkpagelinktext' => 'Pag-oláyan',
+'create' => 'Muknaon',
+'editthispage' => 'Liwata ining pahina',
+'create-this-page' => 'Muknaon ining pahina',
+'delete' => 'Puraon',
+'deletethispage' => 'Puraon ining pahina',
+'undelete_short' => 'Bawia an pagpurà kan {{PLURAL:$1|sarong pagliwat|$1 mga pagliwat}}',
+'viewdeleted_short' => 'Hilngon {{PLURAL:$1|sarong pinara na pagliwat|$1 mga pinara na pagliwat}}',
+'protect' => 'Protektari',
+'protect_change' => 'Ribayan',
+'protectthispage' => 'Protektaran ining pahina',
+'unprotect' => 'Ribayi an proteksyon',
+'unprotectthispage' => 'Ribayi an proteksyon kaining pahina',
+'newpage' => 'Bàguhong pahina',
+'talkpage' => 'Orolayan ining pahina',
+'talkpagelinktext' => 'Olay',
 'specialpage' => 'Espesyal na Pahina',
-'personaltools' => 'Mga gamit na personal',
-'postcomment' => 'Magkomento',
-'articlepage' => 'Hilingón an pahina kan laog',
-'talk' => 'Orólay',
-'views' => 'Mga hilíng',
-'toolbox' => 'Kagamitan',
-'userpage' => 'Hilingón an pahina kan parágamit',
-'projectpage' => 'Hilingón an pahina kan proyekto',
-'imagepage' => 'Hilingón an pahina kan ladawan',
-'mediawikipage' => 'Hilingón an pahina kan mensahe',
-'templatepage' => 'Hilingón an pahina kan templato',
-'viewhelppage' => 'Hilingón an pahina kan tabang',
-'categorypage' => 'Hilingón an pahina kan kategorya',
-'viewtalkpage' => 'Hilingón an orólay',
-'otherlanguages' => 'Sa ibáng mga tatarámon',
+'personaltools' => 'Personal na mga kagamitan',
+'postcomment' => 'Baguhong seksyon',
+'articlepage' => 'Tanawon an laog kan pahina',
+'talk' => 'Orolayan',
+'views' => 'Mga Tanawon',
+'toolbox' => 'Kagamitang kahon',
+'userpage' => 'Tanawon an pahina kan parágamit',
+'projectpage' => 'Tanawon an pahina kan proyekto',
+'imagepage' => 'Hilngón an pahina nin sagunson (file)',
+'mediawikipage' => 'Tanawon an pahina kan mensahe',
+'templatepage' => 'Tanawon an pahina kan panguyog',
+'viewhelppage' => 'Tanawon an pahina nin katabangan',
+'categorypage' => 'Tanawon an pahina nin kategorya',
+'viewtalkpage' => 'Tanawon an orolayan',
+'otherlanguages' => 'Sa ibang mga lengguwahe',
 'redirectedfrom' => '(Piglikay halì sa $1)',
 'redirectpagesub' => 'Ilikáy an pahina',
 'lastmodifiedat' => 'Huring pigbàgo an pahinang iní $2 kan $1.',
 'viewcount' => 'Binukasán ining pahina nin {{PLURAL:$1|sarong beses|nin $1 beses}}.',
 'protectedpage' => 'Protektadong pahina',
-'jumpto' => 'Maglukso sa:',
-'jumptonavigation' => 'paglibotlíbot',
-'jumptosearch' => 'hanápon',
+'jumpto' => 'Magluksó sa:',
+'jumptonavigation' => 'paglibotlibot',
+'jumptosearch' => 'hanapon',
+'view-pool-error' => 'Sori tabi, an mga server kargado sa oras na ini.
+Grabe kadakol an mga paragamit na pinagprubaran mahiling an pahinang ini.
+Makihalat tabi nin kadikit na panahon bago ka magprubara na makapaglaog sa pahinang ini.
+
+$1',
+'pool-timeout' => 'Timeout naghahalat para makapanugpon',
+'pool-queuefull' => 'An grupong panproseso panoon',
+'pool-errorunknown' => 'Bakong bistadong sala',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Dapít sa {{SITENAME}}',
 'aboutpage' => 'Project:Manonongód',
 'copyright' => 'Makukua an laog sa $1.',
 'copyrightpage' => '{{ns:project}}:Mga derechos nin parásurat',
-'currentevents' => 'Mga panyayári sa ngonyán',
-'currentevents-url' => 'Project:Mga panyayari sa ngonyan',
+'currentevents' => 'Mga pangyayari sa ngunyán',
+'currentevents-url' => 'Project:Mga pangyayari sa ngunyán',
 'disclaimers' => 'Mga pagpabayà',
-'disclaimerpage' => 'Project:Pankagabsán na pagpabayà',
+'disclaimerpage' => 'Project:Pangkagabsán na pagpabayà',
 'edithelp' => 'Paghirá kan pagtabang',
 'edithelppage' => 'Help:Pagliwát',
 'helppage' => 'Help:Mga laóg',
-'mainpage' => 'Pangenot na Pahina',
-'mainpage-description' => 'Pangenot na Pahina',
+'mainpage' => 'Panginot na Pahina',
+'mainpage-description' => 'Panginot na Pahina',
 'policy-url' => 'Project:Palakáw',
 'portal' => 'Portal kan komunidad',
 'portal-url' => 'Project:Portal kan Komunidad',
@@ -316,7 +350,7 @@ $messages = array(
 
 'badaccess' => 'Salang permiso',
 'badaccess-group0' => 'Dai ka tinotogotan na gibohon an aksyon na saimong hinahagad.',
-'badaccess-groups' => 'An aksyon na saimong hinahagad limitado sa mga parágamit sa sarô sa mga grupong $1.',
+'badaccess-groups' => 'An aksyon na saimong pinaghahagad limitado sa mga parágamit na {{PLURAL:$2|an grupo|saro sa mga grupo}}: $1.',
 
 'versionrequired' => 'Kaipuhan an bersyon $1 kan MediaWiki',
 'versionrequiredtext' => 'Kaipuhan an bersyon $1 kan MediaWiki sa paggamit kan pahinang ini. Hilíngón an [[Special:Version|Bersyon kan pahina]].',
@@ -326,6 +360,10 @@ $messages = array(
 'youhavenewmessages' => 'Igwa ka nin $1 ($2).',
 'newmessageslink' => 'mga bàgong mensahe',
 'newmessagesdifflink' => 'huring pagbàgo',
+'youhavenewmessagesfromusers' => 'Ika igwa nin $1 gikan sa {{PLURAL:$3|ibang paragamit|$3 mga paragamit}} ($2).',
+'youhavenewmessagesmanyusers' => 'Ika igwa nin $1 gikan sa kadakol na mga paragamit ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|sarong bagong mensahe|bagong mga mensahe}}',
+'newmessagesdifflinkplural' => 'huring {{PLURAL:$1|kaliwatan|mga kaliwatan}}',
 'youhavenewmessagesmulti' => 'Igwa ka nin mga bàgong mensahe sa $1',
 'editsection' => 'liwatón',
 'editold' => 'Liwatón',
@@ -336,6 +374,8 @@ $messages = array(
 'toc' => 'Mga laóg',
 'showtoc' => 'ipahilíng',
 'hidetoc' => 'tagóon',
+'collapsible-collapse' => 'Pinahalipot',
+'collapsible-expand' => 'Pinahalawig',
 'thisisdeleted' => 'Hilingón o isulít an $1?',
 'viewdeleted' => 'Hilingón an $1?',
 'restorelink' => '{{PLURAL:$1|sarong pinarang paghirá|$1 na pinarang paghirá}}',
@@ -347,13 +387,15 @@ $messages = array(
 'page-rss-feed' => '"$1" Hungit na RSS',
 'page-atom-feed' => '"$1" Hungit na Atomo',
 'feed-atom' => 'Atomo',
-'red-link-title' => '$1 (daí pa naisusurat)',
+'red-link-title' => '$1 (an pahina bako pang eksistido)',
+'sort-descending' => 'Suysoy paibaba',
+'sort-ascending' => 'Suysoy paitaas',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Pahina',
 'nstab-user' => 'Pahina nin paragamít',
 'nstab-media' => 'Pahina kan media',
-'nstab-special' => 'Espesyal',
+'nstab-special' => 'Espesyal na pahina',
 'nstab-project' => 'Pahina kan proyekto',
 'nstab-image' => 'File',
 'nstab-mediawiki' => 'Mensahe',
@@ -363,7 +405,9 @@ $messages = array(
 
 # Main script and global functions
 'nosuchaction' => 'Mayong siring na aksyon',
-'nosuchactiontext' => 'An gibo na pinílì nin URL dai bisto kan wiki',
+'nosuchactiontext' => 'An aksyon na pinanungdan kan kilyawan sarong imbalido.
+Baka napasala ka sa pagsurat kan kilyawan, o nagsunod nin salang kilyawan.
+Ini minapanungod man nin sarong kubol (bug) sa ginagamit na software kan {{SITENAME}}.',
 'nosuchspecialpage' => 'Mayong siring na espesyal na páhina',
 'nospecialpagetext' => '<strong>Dai pwede an pahinang espesyal na pinilî mo.</strong>
 
@@ -372,28 +416,36 @@ Pwede mong mahiling an lista nin mga marhay na pahina sa [[Special:SpecialPages|
 # General errors
 'error' => 'Salâ',
 'databaseerror' => 'Salâ sa base nin datos',
-'dberrortext' => 'May salâ sa hapot na sintaksis kan base nin datos.
-Pwedeng may salâ digdi.
-An huring probar na hapót iyo:
+'dberrortext' => 'May kahaputan sa datos-sarayan sa napasalang sintaks an nangyari.
+Ini puwedeng minapanungod nin sarong kubol na yaon sa kasungatan .
+An pinakahuring pagprubar sa datos-sarayan naghahapot nin:
 <blockquote><tt>$1</tt></blockquote>
-hale sa aksyón "<tt>$2</tt>".
-AnSQL ko nagbalik nin salâ na"<tt>$3: $4</tt>".',
-'dberrortextcl' => 'May salâ sa hapót nin sintaksis kan base nin datos.
-Ini an huring probar na hapót:
+gikan sa laog kan punksyon na "<tt>$2</tt>".
+An pinagbalik na kasalaan sa datos-sarayan "<tt>$3: $4</tt>".',
+'dberrortextcl' => 'Sarong datos-sarayan na may napasalang sintaks an nangyari.
+An pinakahuring pagprubar sa datos-sarayan naghahapot nin:
 "$1"
-sa aksyón na "$2".
-AnSQL ko nagbalik nin salâ na"$3: $4"',
+na hale sa laog kan punksyon na "$2".
+An datos-sarayan nagbalik nin sala na "<tt>$3: $4</tt>".',
 'laggedslavemode' => 'Patanid: An pahina pwedeng dai nin pagbabâgo sa ngonyan.',
 'readonly' => 'Kandado an base nin datos',
 'enterlockreason' => 'Magkaag tabì nin rason sa pagkandado, asin ikalkulo kun nuarin bubukasón an kandado',
 'readonlytext' => 'Sarado mùna an base nin datos sa mga bàgong entrada asin iba pang mga pagribay, pwede gayod sa rutinang pagmantenir kan base nin datos, despues, mabalik na ini sa normal.
 
 Ini an eksplikasyon kan tagamató na nagkandado kaini: $1',
+'missing-article' => 'An datos-sarayan dae nakanagbo nin teksto kan sarong pahina na dapat kuta nang managboan, pinagngaran na "$1" $2.
+
+Ini pirmeng pinagkakausa sa paagi nin pagsusunod nin sarong lumaon na diff o historiyang kasugpunan na yaon sa sarong pahinang pinagpura na.
+
+Kun bako ini an kaso, ika nakanagbo nin sarong kubol sa kasungatan.
+Pakireport tabi ini sa [[Special:ListUsers/sysop|administrador]], na naka-antabay sa kilyawan.',
 'missingarticle-rev' => '(pagbàgo#: $1)',
 'missingarticle-diff' => '(Kaibhán: $1, $2)',
-'readonly_lag' => 'Enseguidang nakandado an base nin datos mientras makaabot an base nin datos na esklabo saiyang amo.',
+'readonly_lag' => 'Tulostulos na pagkandado an base nin datos mantang makaabot an base nin datos na esklabo saiyang amo.',
 'internalerror' => 'Panlaog na salâ',
 'internalerror_info' => 'Panlaog na salâ: $1',
+'fileappenderrorread' => 'Dae nakakabasa nin "$1" habang pinagdadagdag.',
+'fileappenderror' => 'Dae nakakapagdagdag nin "$1" sagkod "$2".',
 'filecopyerror' => 'Dai naarog an mga file na "$1" hasta "$2".',
 'filerenameerror' => 'Dai natàwan nin bàgong ngaran an file na "$1" sa "$2".',
 'filedeleteerror' => 'Dai naparà an file na "$1".',
@@ -403,118 +455,219 @@ Ini an eksplikasyon kan tagamató na nagkandado kaini: $1',
 'unexpected' => 'Dai pighuhunà na balór: "$1"="$2".',
 'formerror' => 'Salâ: dai pwedeng isumitir an porma',
 'badarticleerror' => 'Dai pwedeng gibohon ini sa ining páhina.',
-'cannotdelete' => 'Dai naparà an pahina o file na napilî. (Pwede na naparà na ini kan ibang paragamit.)',
+'cannotdelete' => 'An pahina o an sagunson (file) na "$1" dae tabi napupura.
+Ini puwede nang napura kan iba.',
+'cannotdelete-title' => 'Dae mapura an pahina na "$1"',
+'delete-hook-aborted' => 'An pagpura pinundo kan pangawit.
+Ini dae nagtao nin kapaliwanagan.',
 'badtitle' => 'Salâ an titulo',
 'badtitletext' => 'Dai pwede an hinagad na titulo nin pahina, o mayong laog, o sarong titulong pan-ibang tatarámon o pan-ibang wiki na sala an pagkatakód. Pwedengigwa ining sarô o iba pang mga karakter na dai pwedeng gamiton sa mga titulo.',
-'perfcached' => 'Nakaabang an minasunod na mga datos, asin pwede ser na mga lumâ na. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Nakaabang an nagsusunod na mga datos, asin huring nabâgo sa $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'An minasunod na datos pinagtago asin bakong gayo napapanahon. An maximum na {{PLURAL:$1|sarong resulta na|$1 mga resulta na}} yaon sana sa pinagtago.',
+'perfcachedts' => 'An minasunod na datos pinagtago, asin huring pinagdagdagan kan $1. An maximum na {{PLURAL:$4|sarong result na |$4 mga resulta na }} yaon sana sa pinagtago.',
 'querypage-no-updates' => 'Pigpopogol mùna an mga pagbabàgo sa pahinang ini. Dai mùna mababàgo an mga datos digdi.',
 'wrong_wfQuery_params' => 'Salâ na parámetro sa wfQuery()<br />
 Acción: $1<br />
 Hapót: $2',
 'viewsource' => 'Hilingón an ginikanan',
+'viewsource-title' => 'Hilnga an piggikanan para sa $1',
+'actionthrottled' => 'An aksyon pinagpugulan',
+'actionthrottledtext' => 'Bilang sarong pangontra sa spam, ika limitadong sanang himoon ining aksyon sa kadakulon na beses sa halipot sanang panahon, asin ika nakasobra na sa limitasyong ini.
+Paki-otroha giraray sa nagkapirang minuto sana.',
 'protectedpagetext' => 'An pahinang ini pigsará tangarig pogolon an paghirá.',
 'viewsourcetext' => 'Pwede mong hilingón asin arógon an ginikanan kan pahinang ini:',
+'viewyourtext' => "Saimong mahihiling asin makokopya an gikanan kan '''saimong mga pinagriliwat''' sa pahinang ini:",
 'protectedinterface' => 'An pahinang ini nagtatao nin interface para sa software, asin sarado tangarig mapondo an pag-abuso.',
-'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.",
+'editinginterface' => "'''Warning:''' Ika nagliliwat kan pahina na ginagamit sa pagtao nin pantahaw-olay na teksto para sa software.
+An mga pagbabago kaining pahina makaka-apekto sa hitsura kan pantahaw-olay nin paragamit para sa iba man na paragamit.
+Para sa mga pagdadakit-taramon, pakikonsidera man tabi an paggagamit kan [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], an MediaWiking lokalisasyon kan proyekto.",
 'sqlhidden' => '(nakatagô an hapót nin SQL)',
 'cascadeprotected' => 'Pinoprotehirán ining páhina sa mga paghirá, ta sarô ini sa mga minasunod na {{PLURAL:$1|páhina|mga páhina}} na pinoprotehiran kan opsyón na "katarata" na nakabuká:
 $2',
 'namespaceprotected' => "Mayô kang permisong maghirá kan mga páhina sa '''$1''' ngaran-espacio.",
-'ns-specialprotected' => 'An mga páhinang nasa {{ns:special}} na ngaran-espacio dai pwedeng hirahón.',
+'customcssprotected' => 'Ika mayong permiso sa pagliwat kaining pahinang CSS, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.',
+'customjsprotected' => 'Ika mayong permiso sa pagliwat kaining pahinang JavaScript, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.',
+'ns-specialprotected' => 'An mga pahinang nasa {{ns:special}} na liang-liang dai pwedeng hirahón.',
+'titleprotected' => 'Ining titulo pinagprotektaran poon pagkamukna ni [[User:$1|$1]].
+An rason na pinagtao iyo na "\'\'$2\'\'".',
+'filereadonlyerror' => 'Dae kinayang baguhon an sagunson (file) "$1$ nin huli ta an repositoryo kan sagunson "$2" yaon sa kamugtakan na basahon sana.
+
+An administrador na iyo an nagkandado kaini nagpahayag kaining kapaliwanagan: "$3".',
+'invalidtitle-knownnamespace' => 'Imbalidong titulo na igwang espasyadong ngaran na "$2" asin teksto na "$3"',
+'invalidtitle-unknownnamespace' => 'Imbalidong titulo na igwang nin bakong bistado na bilang kan espasyadong ngaran na $1 asin teksto na "$2"',
+'exception-nologin' => 'Dae ka nakalaog',
+'exception-nologin-text' => 'Ining pahina o aksyon minakaipo saimo na maglaog kaining wiki.',
 
 # Virus scanner
-'virus-badscanner' => "Saláng konfigurasyon: dai aram an virus scanner: ''$1''",
-'virus-unknownscanner' => 'dai aram an antivirus:',
+'virus-badscanner' => "Raot na kasalansanan: Bakong bistadong virus scanner: ''$1''",
+'virus-scanfailed' => 'An paghingipid (scan) nagpalya (Koda $1)',
+'virus-unknownscanner' => 'bakong bistadong antivirus:',
 
 # Login and logout pages
-'logouttext' => "'''Nakaluwas ka na.'''
-
-Pwede mo pang gamiton an {{SITENAME}} na dai nagpapabisto, o pwede ka giraray lumaog
-bilang pareho o ibang parágamit. Giromdomon tabî na an ibang mga páhina pwedeng mahiling pa na garo nakalaog ka pa, hasta limpyarón mo an abang kan ''browser'' mo.",
-'welcomecreation' => "== Maogmang Pagdagos, $1! ==
+'logouttext' => "'''Ika po sa ngunyan nakaluwas na.'''
 
-Nagibo na an ''account'' mo. Giromdomon tabi na ribayán an saimong mga kabôtan sa {{SITENAME}}.",
+Ika makakadagos pa sa paggamit kan {{SITENAME}} na dai nagpapabisto, o ika [[Special:UserLogin|Maglaog giraray]] bilang pareho o bilang ibang paragamit.
+Giromdoma na an ibang mga pahina mapuwedeng padagos na magpapahiling siring baga na kun ika garo yaon man sana sa laog, sagkod na saimong malinigan mo an sarayan sa kilyawan.",
+'welcomecreation' => '== Maogmang Pag-abot, $1! ==
+An saimong panindog (account) naimukna na tabi.
+Dae ka man tabi malingaw na ribayan an saimong [[Special:Preferences|{{SITENAME}} mga kabôtan]].',
 'yourname' => 'Pangaran kan paragamit:',
-'yourpassword' => 'Sekretong panlaog:',
-'yourpasswordagain' => 'Itaták giraray an sekretong panlaog:',
-'remembermypassword' => 'Giromdomon an paglaog ko sa kompyuter na ini(for a maximum of $1 {{PLURAL:$1|day|days}})',
-'yourdomainname' => "An saimong ''domain'':",
-'externaldberror' => "Igwang nin salang panluwas pantunay kan base nin datos o dai ka pigtotogotan na bâgohon an saimong panluwas na ''account''.",
+'yourpassword' => 'Pasa-taramon:',
+'yourpasswordagain' => 'Pakilaog giraray kan sekretong panlaog:',
+'remembermypassword' => 'Giromdoma an sakong paglaog sa kilyaw (browser) na ini (para sa maksimum na $1 {{PLURAL:$1|aldaw|mga aldaw}})',
+'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.',
+'externaldberror' => 'Igwa gayod sala sa arinman kan patunay sa datos-sarayan o ika dae pinagtugutan na bâgohon an saimong panluwas na panindog.',
 'login' => 'Maglaog',
-'nav-login-createaccount' => 'Maglaog / maggibo nin account',
-'loginprompt' => 'Kaipuhan may cookies ka para makalaog sa {{SITENAME}}.',
-'userlogin' => 'Maglaog / maggibo nin account',
+'nav-login-createaccount' => 'Maglaog / magmukna nin panindog',
+'loginprompt' => 'Ika kaipong paganahon an mga cookies tanganing makalaog sa {{SITENAME}}.',
+'userlogin' => 'Maglaog / magmukna nin panindog',
+'userloginnocreate' => 'Maglaog ka',
 'logout' => 'Magluwas',
 'userlogout' => 'Magluwás',
-'notloggedin' => 'Mayò sa laog',
-'nologin' => "Mayò ka pa nin entrada? '''$1'''.",
-'nologinlink' => 'Maggibo nin account',
-'createaccount' => 'Maggibo nin account',
-'gotaccount' => "Igwa ka na nin account? '''$1'''.",
+'notloggedin' => 'Dae ka nakalaog',
+'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',
-'createaccountmail' => 'sa e-koreo',
-'badretype' => 'Dai parehas an pigtaták mong mga sekretong panlaog.',
-'userexists' => 'Piggagamit na kan iba an pangaran. Magpili tabî nin iba.',
-'loginerror' => 'Salâ an paglaog',
-'createaccounterror' => 'Daí maggíbo an account: $1.',
-'nocookiesnew' => 'Nagibo na an account kan parágamit, alagad dai ka pa nakalaog. Naggagamit nin cookies an {{SITENAME}} para magpalaog sa mga parágamit. Nakapondo an cookies mo. Paandaron tabì ini, dangan, maglaog gamit an bàgo mong pangaran asin sekretong panlaog.',
-'nocookieslogin' => 'Naggagamit nin mga cookies an {{SITENAME}} para magpalaog nin mga paragamit. Nakapondo an mga cookies mo. Paandaron tabi ini asin probaran giraray.',
-'noname' => 'Dai ka pa nagkaag nin pwedeng gamiton na pangaran.',
-'loginsuccesstitle' => 'Matriumpo an paglaog',
-'loginsuccess' => "'''Nakalaog ka na sa {{SITENAME}} \"\$1\".'''",
-'nosuchuser' => 'Mayong paragamit sa pangaran na "$1". Reparohon an pigsurat mo, o maggibo nin bàgong account.',
-'nosuchusershort' => 'Mayong paragamit sa nagngangaran na "$1". Reparohon an pigsurat mo.',
-'nouserspecified' => 'Kaipuhan mong kaagan nin pangaran.',
-'wrongpassword' => 'Salâ an pigtaták na sekretong panlaog. Probaran giraray tabì.',
-'wrongpasswordempty' => 'Mayong pigkaag na sekretong panlaog. Probaran giraray tabì.',
-'passwordtooshort' => 'Salâ o halìpoton an saimong sekretong panlaog. Igwa dapat ining dai mababà sa {{PLURAL:$1|1 karakter|$1 karakter}} asin iba man sa pinilì mong pangaran.',
-'mailmypassword' => 'Ipadara sa e-koreo an sekretong panlaog',
-'passwordremindertitle' => 'Panpaísi nin sekretong panlaog halì sa {{SITENAME}}',
-'passwordremindertext' => 'Sarong paragamit (pwedeng ika, halì sa IP na $1)
-an naghagad nin bàgong sekretong panlaog para sa {{SITENAME}} ($4).
-"$3" na an bàgong sekretong panlaog ni "$2".
-Kaipuhan maglaog ka asin ibalyó an saimong sekretong panlaog.
-
-Kun ibang tawo an naghagad kaini o kun nagiromdóman mo na an saimong sekretong panlaog asin habô mo nang ribayan ini, dai mo na pagintiendehon ining mensahe. Ipadagos na an paggamit kan dating sekretong panlaog.',
-'noemail' => 'Mayong e-koreo na nakarehistro sa parágamit na "$1".',
-'passwordsent' => 'Igwang bàgong sekretong panlaog na pigpadará sa e-koreong nakarehistro ki "$1".
-Maglaog tabì giraray pagnakua mo na ini.',
-'blocked-mailpassword' => 'Pigbagatan sa paghirá an saimong IP, asin pigpopogolan na magamit an pagbawi kan sekretong panlaog tangarig maibitaran an pagabuso.',
-'eauthentsent' => 'May ipinadarang e-koreong kompirmasyon sa piniling adres nin e-koreo.
-Bàgo pa magpadara nin iba pang e-koreo sa account na ini, kaipuhan tabing sunodon an mga instruksyon na nasa e-koreo, tangarig makompirmar na talagang saimo ining account.',
-'throttled-mailpassword' => 'May pinadara nang paisi nin sekretong panlaog, sa huring
-$1 na oras. Para pogolan an mga pagabuso, sarong paisi sana an ipapadara sa laog nin
-$1 na oras.',
-'mailerror' => 'Salâ an pagpadará nin e-koreo: $1',
-'acct_creation_throttle_hit' => 'Pasensya, nakagibo ka na nin $1 accounts. Dai ka na makakagibo pa.',
-'emailauthenticated' => "An saimong ''e''-surat pinatunayan sa $1.",
-'emailnotauthenticated' => "Dai pa napatunayan an saimong ''e''-surat. Mayong ipapadarang ''e''-surat para sa ano man na minasunod na gamit.",
-'noemailprefs' => "Magpilî tabî nin ''e''-surat tangarig magandar ining mga gamit.",
-'emailconfirmlink' => "Kompirmaron tabî an saimong ''e''-surat",
-'invalidemailaddress' => "Dai matogotan ining ''e''-surat ta garo salâ an ''format'' kaini. Magkaag tabî nin tamâ o dai pagkaagan.",
-'accountcreated' => "Nagibo na an ''account''.",
-'accountcreatedtext' => "Ginibo na an ''account'' para ki $1.",
-'loginlanguagelabel' => 'Tataramon: $1',
+'userlogin-resetlink' => 'Nakalingaw ka sa panlaog mong detalye?',
+'createaccountmail' => 'Sa paagi nin e-koreo',
+'createaccountreason' => 'Rason:',
+'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â',
+'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.
+Ika igwang mga cookies na dae pinagana.
+Tabi paganaha sinda, dangan maglaog ka sa saimong baguhon na pangaran kan paragamit asin sekretong panlaog.',
+'nocookieslogin' => '{{SITENAME}} naggagamit nin mga cookies para sa maglaog na mga paragamit.
+Ika igwang mga cookies na dae pinagana.
+Tabi paganaha sinda asin otroha giraray.',
+'nocookiesfornew' => 'An panindog kan paragamit dae pinagmukna, nin huli ta dae nyamo kumpirmado an pinaggikanan kaini.
+Pakipaseguro na saimong pinagana an cookies, ikarga giraray ining pahina asin probaran mo otro.',
+'noname' => 'Ika dae tabi nakapagkaag nin sarong balidong pangaran nin paragamit.',
+'loginsuccesstitle' => 'Matrayumpo an saimong paglaog',
+'loginsuccess' => "'''Ika ngunyan nakalaog na sa {{SITENAME}} bilang si \"\$1\".'''",
+'nosuchuser' => 'Dae pang paragamit na ginagamit an pangaran na "$1".
+An mga ngaran nin paragamit sensitibo gayo sa tipahan.
+Pakireparo kan saimong espeling, o [[Special:UserLogin/signup|Magmukna nin bagong panindog]].',
+'nosuchusershort' => 'Mayo po tabing paragamit na an pangaran "$1".
+Paki-tsek an saimong espeling.',
+'nouserspecified' => 'Kaipuhan mong magkaag nin sarong pangaran nin paragamit.',
+'login-userblocked' => 'An paragamit na ini pinagkubkob. An paglaog dae pinagtutugutan.',
+'wrongpassword' => 'Salâ an pigtaták na sekretong panlaog.
+Tabi probaran giraray.',
+'wrongpasswordempty' => 'An sekretong panlaog pinagtatak na blangko.
+Tabi probaran giraray.',
+'passwordtooshort' => 'Mga sekretong panlaog dapat igwa nin {{PLURAL:$1|1 karakter|$1 mga karakter}}.',
+'password-name-match' => 'An saimong sekretong panlaog dapat laen sa saimong paragamit na ngaran.',
+'password-login-forbidden' => 'An paggamit kaining pangaran nin paragamit asin sekretong panlaog pinagbabawal.',
+'mailmypassword' => 'Paki-koreo an bagong sekretong panlaog',
+'passwordremindertitle' => 'Bagong temporaryo na sekretong panlaog para sa {{SITENAME}}',
+'passwordremindertext' => 'May sarong tawo (pwedeng ika gayod, gikan sa IP address na $1) naghagad nin sarong bagong sekretong panlaog para sa {{SITENAME}} ($4). Sarong temporaryong sekretong panlaog para sa paragamit "$2" an pinagmukna asin pinagtuytoy na magin "$3". Kun iyo ini an saimong katuyuhan, kaipuhan mong maglaog asin magpili nin sarong bagong sekretong panlaog ngunyan.
+An saimong temporaryong sekretong panlaog mapapaso sa laog nin {{PLURAL:$5|sarong aldaw|$5 aldaw}}. 
+
+Kun ibang tawo an naghimo kaining kahagadan, o kun saimo nang nagiromdoman an saimong 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.',
+'noemail' => 'Mayo tabing e-koreong address na nakarehistro para sa paragamit na "$1".',
+'noemailcreate' => 'Kaipuhan kang magtao nin sarong balidong address sa e-surat',
+'passwordsent' => 'Sarong baguhon na sekretong panlaog an ipinadara sa e-koreong address na nakarehistro para ki "$1".
+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}}.',
+'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.',
+'emailauthenticated' => 'An saimong e-koreo awtentikado kan $2 sa $3.',
+'emailnotauthenticated' => 'An saimong e-surat dae pa tabi pinagpatunayan. 
+Mayong e-surat an ipapadara para sa arinman kan minasunod na estima.',
+'noemailprefs' => 'Magkaag nin sarong e-koreong address sa saimong mga kabotan para gumana ining mga estima.',
+'emailconfirmlink' => 'Kompirmaron tabî an saimong e-koreong address',
+'invalidemailaddress' => 'An e-koreo dae akseptado habang ini minapahiling na igwa nin imbalidong panugmad.
+Pakilaog sana tabi nin sarong tugmadong koreo o pabayae na mayong laman an suratan.',
+'cannotchangeemail' => 'An panindog na address sa e-surat dati mariribayan sa Wiki na ini.',
+'emaildisabled' => 'Ining sayt dae makakapagpadara nin mga e-surat.',
+'accountcreated' => 'Panindog pinagmukna na',
+'accountcreatedtext' => 'An paragamit na panindog para sa $1 pinagmukna na.',
+'createaccount-title' => 'Panindog na pagmukna para sa {{SITENAME}}',
+'createaccount-text' => 'May tawong nagmukna nin sarong panindog na gamit an saimong address na e-surat sa {{SITENAME}} ($4) na may ngaran na "$2, na may sikretong panlaog na "$3".',
+'usernamehasherror' => 'Paragamit na ngaran dae puwede na igwang simbolikong mga kabtang',
+'login-throttled' => 'Nakapaghimo ka na nin kadakulon na pagprubar sa paglaog dae pa sana nahaloy. Mapuwede lang po na maghalat bago magprubar giraray.',
+'login-abort-generic' => 'An saimong paglaog dae nakadagos - Pinundo',
+'loginlanguagelabel' => 'Lengguwahe: $1',
+'suspicious-userlogout' => 'An hinahagad mong magluwas pinagpundo nin huli ta ini gayod pinagpadara sa paagi nin sarong pasang kilyaw o proksing hilom.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'Bakong bantog na kasalaan sa PHP mail() function.',
+'user-mail-no-addy' => 'Nagprubar na magpadara nin e-koreo na mayo nin e-koreong address.',
 
 # Change password dialog
-'resetpass' => "Ipwesto giraray an sekretong panlaog kan ''account''",
-'resetpass_announce' => "Nakalaog ka na may kodang temporaryong ''e''-sinurat. Para matapos an paglaog, kaipuhan mong magpwesto nin bâgong sekretong panlaog digdi:",
-'resetpass_text' => '<!-- Magdugang nin teksto digdi -->',
-'resetpass_header' => 'Ibalyó an sekretong panlaog',
-'oldpassword' => 'Lumang sekretong panlaog:',
-'newpassword' => 'Bàgong sekretong panlaog:',
+'resetpass' => 'Ribayan an sekretong panlaog',
+'resetpass_announce' => 'Ika nakalaog na na igwang sarong temporaryong koda sa e-koreo.
+Tanganing tapuson an paglalaog, ika kaipong magkaag nin sarong baguhon na sekretong panlaog digdi:',
+'resetpass_text' => '<!-- Magdagdag nin teksto digdi -->',
+'resetpass_header' => 'Ribayan an panindog na sekretong panlaog',
+'oldpassword' => 'Dating sekretong panlaog:',
+'newpassword' => 'Bàguhon na sekretong panlaog:',
 'retypenew' => 'Itaták giraray an bàgong panlaog:',
 'resetpass_submit' => 'Ipwesto an sekretong panlaog dangan maglaog',
 'resetpass_success' => 'Naribayan na an saimong sekretong panlaog! Pigpapadagos ka na...',
-'resetpass_forbidden' => 'Dai pwedeng ribayan an mga sekretong panlaog sa ining wiki',
+'resetpass_forbidden' => 'An mga sekretong panlaog dae puwedeng maribayan',
+'resetpass-no-info' => 'Ika dapat nakalaog na tanganing direktang makagamit kaining pahina.',
 'resetpass-submit-loggedin' => 'Ribayan an sekretong panlaog',
+'resetpass-submit-cancel' => 'I-kansela',
 '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:',
 
+# Special:PasswordReset
+'passwordreset' => 'Pakibago kan sekretong panlaog',
+'passwordreset-text' => 'Kumpletoha ining porma tanganing makaresibe nin pampagiromdom na e-koreo kan detalye nin saimong panindog.',
+'passwordreset-legend' => 'Pakibago kan sekretong panlaog',
+'passwordreset-disabled' => 'An pagbago kan sekretong panlaog pinagpundo sa wiking ini.',
+'passwordreset-pretext' => '{{PLURAL:$1||Pakilaog kan saro sa mga pedaso nin datos sa ibaba}}',
+'passwordreset-username' => 'Paragamit-ngaran:',
+'passwordreset-domain' => 'Kasakupan:',
+'passwordreset-capture' => 'Hilngon an kinaluwasang e-koreo?',
+'passwordreset-capture-help' => 'Kun saimong i-tsek ini box, an e-koreo (na igwang temporaryong sekretong panlaog) ipapahiling saimo siring na ini ipagpapadara sa paragamit.',
+'passwordreset-email' => 'E-koreong address:',
+'passwordreset-emailtitle' => 'Mga detalye kan panindog sa {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'May sarong tawo (pwedeng ika gayod, gikan sa IP address na $1) naghagad nin sarong pagiromdom kan detalye kan saimong panindog para sa {{SITENAME}} ($4). An minasunod na paragamit {{PLURAL:$3|panindog iyo an|mga panindog iyo an}} na asosyado kaining e-koreong address:
+
+$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.',
+'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:
+
+$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.',
+'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',
+
+# Special:ChangeEmail
+'changeemail' => 'Ribayan an e-koreong address',
+'changeemail-header' => 'Ribayan an panindog na e-koreong address',
+'changeemail-text' => 'Kumpletoha ining porma tanganing ribayan an saimong e-koreong address. Kinakaipo mong ilaog an saimong sekretong panlaog tanganing kumpirmaron ining pagribay.',
+'changeemail-no-info' => 'Ika dapat nakalaog na tanganing direktang makagamit kaining pahina.',
+'changeemail-oldemail' => 'Presenteng e-koreong address:',
+'changeemail-newemail' => 'Bagong e-koreong address:',
+'changeemail-none' => 'mayo tabi.',
+'changeemail-submit' => 'Ribayan an e-koreo',
+'changeemail-cancel' => 'Kanselaha',
+
 # Edit page toolbar
 'bold_sample' => 'Tekstong mahìbog',
 'bold_tip' => 'Mahìbog na teksto',
@@ -529,9 +682,9 @@ Matriumpo mo nang nailaog an sekretong panlaog o nakua an bàgong temporaryong s
 'nowiki_sample' => "Isaliot digdi an tekstong dai na-''format''",
 'nowiki_tip' => "Dai pagindiendehon pag-''format'' kan wiki",
 'image_sample' => 'Halimbawa.jpg',
-'image_tip' => 'Nakaturay na file',
+'image_tip' => 'Nakalubog na sagunson',
 'media_sample' => 'Halimbawa.ogg',
-'media_tip' => 'Takod nin file',
+'media_tip' => 'Kilyaw nin sagunson (file)',
 'sig_tip' => 'Pirma mo na may taták nin oras',
 'hr_tip' => 'Pabalagbag na linya (use sparingly)',
 
@@ -546,77 +699,117 @@ Matriumpo mo nang nailaog an sekretong panlaog o nakua an bàgong temporaryong s
 'showlivepreview' => 'Patànaw na direkto',
 'showdiff' => 'Hilingón an mga pagbabàgo',
 'anoneditwarning' => "'''Patanid:''' Dai ka nakalaog. Masusurat an saimong IP sa uusipón kan pagbabàgo kan pahinang ini.",
+'anonpreviewwarning' => 'Dae ka tabi nakalaog. An pagtatagama matala kan saimong IP address sa historya nin pagliwat sa pahinang ini.',
 'missingsummary' => "'''Paisi:''' Dai ka nagkaag nin sumád kan paghirâ. Kun pindotón mo giraray an Itagama, maitatagama an hirá mo na mayô kaini.",
 'missingcommenttext' => 'Paki lâgan nin komento sa ibabâ.',
-'missingcommentheader' => "'''Paisi:''' Dai ka nagkaag nin tema/pamayohan para sa ining komentaryo. Kun pindoton mo giraray an Itagama, maitatagama an hira mo na mayô ini.",
+'missingcommentheader' => "'''Pagiromdom:''' Ika dae tabi nagtao nin sarong panultol (subject)/Pamayong linya (headline) para kaining sinambit mo.
+Kun saimong pinduton an \"{{int:savearticle}}\" giraray, an saimong pigliwat matatagama na mayo kaiyan.",
 'summary-preview' => 'Patànaw nin sumada:',
 'subject-preview' => 'Patânaw nin tema/pamayohan:',
 'blockedtitle' => 'Pigbágat an parágamit',
-'blockedtext' => "'''Pigbagat an pangaran o IP mo.'''
+'blockedtext' => "'''An saimong paragamit na ngaran o IP address pinagkubkob.'''
 
-Si $1 an nagbagat. Ini an itinaong rasón, ''$2''.
+An pagkubkob hinimo ni $1.
+An rason na ipinagtao iyo na ''$2''.
 
-* Pagpoon kan pagbagat: $8
-* Pagpasó kan pagbagat: $6
-* Piniling bagaton: $7
+* Pagpoon kan pagkubkob: $8
+* Pagpasó kan pagkubkob: $6
+* Katuyuhan kan parakubkob: $7
 
-Pwede mong suratan si $1 o an iba pang [[{{MediaWiki:Grouppage-sysop}}|administrador]] para pagoralayan an manonongod sa pagbagat.
-Dai mo pwedeng gamiton an ' e-koreohan an paragamit ' kun mayong tamang e-surat sa  [[Special:Preferences|mga kabòtan kan account]] mo asin dai ka pigbagat sa paggamit kaini.
-$3 an presente mong IP, asin #$5 an ID nin pigbagat. Ikaag tabì an arin man o pareho sain man na hapót.",
-'autoblockedtext' => "Enseguidang pigbagat an IP mo ta ginamit ini kan ibang parágamit, na binagat ni \$1.
-Ini an rasón:
+Ika puwedeng magkontak sa $1 or ibang [[{{MediaWiki:Grouppage-sysop}}|administrador]] tanganing pag-orolayan an pagkubkob.
+Ika dae makakagamit kan 'e-koreo kaining paragamit' na panuytuyan laen lang na may sarong balidong e-koreo address na ipinahayag sa saimong [[Special:Preferences|panindog na mga kabotan]] asin ika dae pinagkubkob para sa paggamit kaini.
+An saimong presenteng IP address iyo $3, asin an kubkob ID iyo #$5.
+Pakibale na lang tabi an gabos na mga detalye sa itaas sa anuman na mga kahaputan na saimong himoon.",
+'autoblockedtext' => 'An saimong IP address awtomatikong pinagkubkob nin huli ta ini pinaggamit kan ibang paragamit, na pinagkubkob ni $1.
+An rason na ipinagtao iyo na:
 
-:''\$2''
+:\'\'$2\'\'
 
-* Pagpoon kan pagbagat: \$8
-* Pagpasó kan pagbagat: \$6
+* Pagpoon kan pagkubkob: $8
+* Pagpasó kan pagkubkob: $6
+* Katuyuhan kan parakubkob: $7
 
-Pwedeng mong suratan si \$1 o an iba pang mga
-[[{{MediaWiki:Grouppage-sysop}}|administrador]] para pagolayan an manonongod sa pagbagat.
+Puwede mong kontakon si $1 o saro sa [[{{MediaWiki:Grouppage-sysop}}|mga administrador]] tanganing pag-orolayan an kubkob.
 
-Giromdomon tabî na pwede mo sanang gamiton an \"''e''-suratan ining parágamit\" na gamit kun igwa kang tamang ''e''-surat na nakarehistro saimong [[Special:Preferences|mga kabôtan nin parágamit]] asin dai ka pigbabagat sa paggamit kaini.
+Patanid tabi dae mo puwedeng gamiton an "e-koreo kaining paragamit" estima laen lang kun ika igwa nin sarong balidong e-koreo address na rehistrado sa saimong [[Special:Preferences|paragamit na mga kabotan]] asin ika dae pinagkubkob para sa paggamit kaini.
 
-\$5 an pigbagat na ID. Ikaag tabî ining ID sa gabos na paghapot mo.",
+An saimong presenteng IP address iyo an $3, asin and Kubkob ID iyo an #$5.
+Pakibale tabi an gabos na mga detalye sa itaas sa arinman na mga kahaputan na saimong himoon.',
 'blockednoreason' => 'mayong itinaong rason',
 'whitelistedittext' => 'Kaipuhan mong $1 tangarig makahirá nin mga páhina.',
 'confirmedittext' => "Kaipuhan mong kompirmaron an saimong ''e''-surat. Ipwesto tabî asin patunayan an saimong ''e''-surat sa [[Special:Preferences|mga kabôtan kan parágamit]].",
-'nosuchsectiontitle' => 'Mayong siring na seksyón',
-'nosuchsectiontext' => 'Mayo man an seksyón an pighihira mo.',
+'nosuchsectiontitle' => 'Dae managboan an seksyon',
+'nosuchsectiontext' => 'Ika nagprubar na liwaton an sarong seksyon na bakong eksistido.
+Ini puwedeng pinagbalyo o pinagpara na habang saimong pinaghihiling an pahina.',
 'loginreqtitle' => 'Kaipuhan Maglaog',
 'loginreqlink' => 'maglaog',
 'loginreqpagetext' => 'Kaipuhan kang $1 tangarig makahilíng nin ibang pahina.',
 'accmailtitle' => 'Napadará na an sekretong panlaog.',
-'accmailtext' => 'An sekretong panlaog ni "$1" naipadará na sa $2.',
+'accmailtext' => "An patsambang pagpuyos kan sekretong panlaog para ki [[User talk:$1|$1]] ipinagpadara na ki $2.
+
+An sekretong panlaog para sa bagong panindog mapuwede tabing maribayan ''[[Special:ChangePassword|Ribayan an sekretong panlaog]]'' na pahina matapos na makalaog.",
 'newarticle' => '(Bàgo)',
 'newarticletext' => 'Sinunod mo an takod sa pahinang mayò pa man.
 Tangarig magibo an pahina, magpoon pagsurat sa kahon sa babâ
 (hilingón an [[{{MediaWiki:Helppage}}|pahina nin tabang]] para sa iba pang impormasyon).
 Kun dai tinuyong nakaabot ka digdi, pindoton sana an back sa browser mo.',
-'anontalkpagetext' => "----''Ini an pahina kan olay kan sarong parágamit na dai bisto na dai pa naggibo nin account o dai naggagamit kaini. Entonces, piggagamit mi an numero nin IP tangarig mabisto siya. Ining IP pwede gamiton kan manlain-lain na mga parágamit. Kun ika sarong paraágamit na dai bisto asin konbensido ka sa pigsasabi ka ining mga komento bakô man dapit saimo,  [[Special:UserLogin|maggibo nin'' account ''o maglaog]] tabì tangarig maibitaran an pagkaribong saimo asin sa ibang mga parágamit na dai bisto.''",
-'noarticletext' => 'Mayò man na teksto sa pahinang iní, pwede mong [[Special:Search/{{PAGENAME}}|hanápon iníng titulo nin pahina]] sa ibáng mga pahina o [{{fullurl:{{FULLPAGENAME}}|action=edit}} hirahón iníng pahina].',
-'clearyourcache' => "'''Pagiromdom:''' Pagkatapos kan pagtagama, pwede ser na kaipuhan mong lawigawan an abang kan ''browser'' para mahiling mo an mga pagbabâgo. '''Mozilla / Firefox / Safari:''' doonan an ''shift'' an ''Shift'' sabay an pagpindot sa ''Reload'', o pindoton an ''Ctrl-Shift-R'' (''Cmd-Shift-R'' sa Apple Mac); '''IE:''' doonan (dai halion an muro) an ''Ctrl'' mientras sabay an pagpindot sa  ''Refresh'', o pindoton an ''Ctrl-F5''; '''Konqueror:''': pindoton sana ''Reload'', o pindoton  an ''F5''; '''Opera''' pwede ser na kaipuhan na halîon an gabos na laog kan abang sa ''Tools→Preferences''.",
-'usercssyoucanpreview' => "'''Tip:''' Gamiton an 'Show preview' para testingon an bâgong CSS bago magtagama.",
-'userjsyoucanpreview' => "'''Tip:''' Gamiton an 'Show preview' para testingon an bâgong JS bago magtagama.",
-'usercsspreview' => "'''Giromdomon tabî na pigpapatânaw sana saimo an CSS nin parágamit, dai pa ini nakatagama!'''",
+'anontalkpagetext' => "----''Ini iyo an pahina kan orolayan para an sarong dae bistadong paragamit na dae pa nakapagmukna nin panindog, o dae pa nakapaggamit kaini.
+Kaya kami kaipong gumamit nin numerikal na IP address sa pagbisto saiya.
+An arog kaining IP address puwedeng maikapagheras sa nagkapirang mga paragamit.
+Kun ika sarong dae pa bistadong paragamit asin mati mo na igwang irelebanteng sambit na pinanungod saimo, tabi paki [[Special:UserLogin/signup|mukna nin panindog]] or [[Special:UserLogin|maglaog ka]] tanganing malikayan an pagkaribong sa pag-iriba kan iba pang mga paragamit.''",
+'noarticletext' => 'Mayo tabi sa presente nin teksto sa pahinang ini.
+Ika mapuwedeng [[Special:Search/{{PAGENAME}}|maghanap para sa titulo kan pahinang ini]] sa iba pang mga pahina,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa magkasurundong mga talaan],
+o [{{fullurl:{{FULLPAGENAME}}|action=edit}} liwaton ining pahina]</span>.',
+'noarticletext-nopermission' => 'Mayo tabi sa presente nin teksto sa pahinang ini.
+Ika mapuwedeng [[Special:Search/{{PAGENAME}}|maghanap para sa titulo kan pahinang ini]] sa iba pang mga pahina,
+o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa magkasurundong mga talaan]</span>.',
+'missing-revision' => 'An rebisyon #$1 kan pahina pinagngaranan na "{{PAGENAME}}" bakong eksistido.
+
+Ini pirmihan na pinagkakausa sa paagi nin pagsusunod nin luwas na petsang historiya nin kasugpunan pasiring sa sarong pahinang pinagpura na.
+An mga detalye matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} pinagpura na talaan].',
+'userpage-userdoesnotexist' => 'Paragamit na panindog "$1" bako tabing rehistrado.
+Paki-tsek kun ika magustong magmukna/magliwat kaining pahina.',
+'userpage-userdoesnotexist-view' => 'Paragamit na panindog "$1" bako tabing rehistrado.',
+'blocked-notice-logextract' => 'Ining paragamit sa presente nakakubkob.
+An pinakahuring entrada kan pagkubkob nakahaya sa ibaba bilang reperensiya:',
+'clearyourcache' => "'''Antabay:''' Matapos maitagama, ika mapuwedeng magsalimbaw sa sarayan kan saimong kilyaw tanganing hilingon an mga naribayan.
+* '''Firefox / Safari:''' Pauntok na duon ''Shift'' habang pig-klik an ''Ikarga otro'', o pinduton an maski arin ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' para sa Mac)
+* '''Google Chrome:''' Pinduton ''Ctrl-Shift-R'' (''⌘-Shift-R'' para sa Mac)
+* '''Internet Explorer:''' Pauntok na duon ''Ctrl'' habang pig-klik an ''Ipresko otro'', o pinduton ''Ctrl-F5''
+* '''Opera:''' Linigan an sarayan sa ''Mga Kagamitan → Mga Kabotan''",
+'usercssyoucanpreview' => "'''Tip:''' Gamita an \"{{int:showpreview}}\" na pindutan tanganing prubaran an saimong baguhong CSS bago ipagtagama.",
+'userjsyoucanpreview' => "'''Tip:''' Gamita an \"{{int:showpreview}}\" na pindutan tanganing prubaran an saimong baguhong JavaScript bago ipagtagama.",
+'usercsspreview' => "'''Giromdoma baya na ika nagtatanaw pa sana kan saimong paragamit sa CSS.'''
+'''Ini dae pa tabi naitatagama!'''",
 'userjspreview' => "'''Giromdomon tabi na pigtetest/pighihiling mo sana an patanaw kan saimong JavaScript nin paragamit, dai pa ini naitagama!'''",
+'sitecsspreview' => "'''Giromdoma baya na ika nagtatanaw pa sana kaining CSS.'''
+'''Ini dae pa tabi naitatagama!'''",
+'sitejspreview' => "'''Giromdoma baya na ika nagtatatanaw pa sana kaining koda sa JavaScript.'''
+'''Ini dae pa tabi naitatagama!'''",
 'userinvalidcssjstitle' => "'''Patanid:''' Mayong ''skin'' na \"\$1\". Giromdomon tabî na an .css asin .js na mga páhina naggagamit nin titulong nakasurat sa sadit na letras, halimbawa {{ns:user}}:Foo/vector.css bakong {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Binàgo)',
 'note' => "'''Paisi:'''",
-'previewnote' => "'''Patànaw sana ini; dai pa naitagama an mga pagbabàgo!'''",
+'previewnote' => "'''Giromdoma na ini sarong patanaw pa sana.'''
+An saimong mga pinagriliwat dae pa tabi naitatagama!",
+'continue-editing' => 'Ipagpadagos an pagliliwat',
 'previewconflict' => 'Mahihilíng sa patànaw na ini an tekstong nasa itaas na lugar nin paghirá arog sa maipapahiling kun ini an itatagama mo.',
 'session_fail_preview' => "'''Despensa! Dai mi naipadagos an paghirá mo huli sa pagkawara nin datos kan sesyon.
 Probaran tabì giraray. Kun dai man giraray magibo, probaran na magluwas dangan maglaog giraray.'''",
-'session_fail_preview_html' => "'''Despensa! Dai mi naipadagos an paghirá mo nin huli sa kawàran kan datos kan sesyon.'''
+'session_fail_preview_html' => "'''Sori po! Dae tabi nyamo maiproseso an saimong pagliwat nin huli sa kawaraan kan datos sa sesyon.'''
 
-''Huli ta ining wiki may HTML na nakaandar, pigtago an patànaw bilang paglikay kontra sa mga atake sa JavaScript.''
+''Nin huli ta {{SITENAME}} igwa nin bakong pang naprosesong HTML pinagpagana, an patanaw ipinagtago bilang pag-ingat kontra sa atake kan JavaScript.''
 
-'''Kun talagang boot mong hirahón ini, probaran giraray. Kun dai pa giraray magibo, magluwas dangan maglaog giraray. '''",
+'''Kun ini sarong lehitimong pagprubar nin pagliwat, paki-otro tabi giraray.'''
+Kun ini dae man giraray guminana, magprubar na [[Special:UserLogout|magluwas]] asin maglaog giraray.",
 'token_suffix_mismatch' => "'''Dai pigtogotan an paghirá mo ta sinabrit kan client mo an punctuation characters.
 Dai pigtogotan ining paghirá tangarig maibitaran na maraot an teksto kan pahina.
 Nanyayari nanggad ini kun naggagamit ka nin bakong maraháy asin dai bistong web-based proxy service.'''",
+'edit_form_incomplete' => "'''An ibang mga parte kan porma nin pagliwat dae nakaabot sa serbidor; paki-dobleng mansay na an saimong mga pinagliwat bilog na yaon pa asin paki-otro giraray.'''",
 'editing' => 'Pigliliwat an $1',
+'creating' => 'Pinagmumukna an $1',
 'editingsection' => 'Pighihira an $1 (seksyon)',
-'editingcomment' => 'Pighihira an $1 (komento)',
+'editingcomment' => 'Pigliliwat an $1 (bagong seksyon)',
 'editconflict' => 'Komplikto sa paghihira: $1',
 'explainconflict' => "May ibang parágamit na nagbàgo kaining pahina kan pagpoon mong paghirá kaini.
 Nahihilíng ang pahina kan teksto sa parteng itaas kan teksto.
@@ -634,35 +827,79 @@ Pigpropromesa mo man samuyà na ika an kagsurat kaini, o kinopya mo ini sa domin
 '''DAI TABÌ MAGSUMITIR NIN MGA GIBONG IPINAPANGALAD NA KOPYAHON NIN MAYONG PERMISO!'''",
 'copyrightwarning2' => "Giromdomon tabì na an gabos na kontribusyon sa {{SITENAME}} pwedeng hirahón, bàgohon o halion kan ibang mga parágamit. Kun habô mong mahirá an saimomg sinurat na mayong pakimàno, pues, dai tabì isumitir iyan digdi.<br />
 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' => "'''SALÀ: $1 na kilobytes na kalabà an pahinang isinumitir mo, na mas halabà sa hanggan nin $2 na kilobytes. Dai pwede ining itagama.'''",
-'readonlywarning' => "'''PATANID: Nakakandado an base nin datos para sa pagmantinir, pues, dai mo mûna pwede na itagama an mga paghirá mo. Pwede mo pa man na arogon dangan ipaskil ang teksto sa sarong dokumento arog kan MS Word asbp. asin itagama ini para sa atyan.'''",
-'protectedpagewarning' => "'''PATANID:  Nakakandado ining pahina tangarig an mga parágamit na may priblehiyo nin ''sysop'' sana an pwedeng maghira kaini.'''",
-'semiprotectedpagewarning' => "'''Paisi:''' An pahinang ini isinara tangarig mga rehistradong parágamit sana an makahira kaini.",
+'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.
+
+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.'''
+An pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
+'semiprotectedpagewarning' => "'''Note:''' Ining pahina pinagprotektaran na tanganing an mga rehistradong mga paragamit sana an mapuwedeng makapagliwat kaini.
+An pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
 'cascadeprotectedwarning' => "'''Patanid:''' Nakakandado an pahinang ini tangarig an mga parágamit na igwang pribilehyo nin sysop sana an pwedeng maghirá kaini, huli ta kabali ini sa mga kataratang protektado na {{PLURAL:$1|pahina|mga pahina}}:",
-'templatesused' => 'Mga templato na piggamit sa pahinang ini:',
-'templatesusedpreview' => 'Mga templato na piggamit sa patànaw na ini:',
-'templatesusedsection' => 'Mga templato na piggamit sa seksyon na ini:',
+'titleprotectedwarning' => "'''Patanid tabi: Ining pahina pinagprotektaran na tanganing [[Special:ListGroupRights|espesipikong karapatan]] minakaipo tanganing magmukna kaini.'''
+An pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
+'templatesused' => '{{PLURAL:$1|Template|Mga Panguyog}} na pinaggamit kaining pahina:',
+'templatesusedpreview' => '{{PLURAL:$1|Template|Mga Panguyog}} na pinaggamit kaining patanaw:',
+'templatesusedsection' => '{{PLURAL:$1|Template|Mga Panguyog}} na pinaggamit kaining seksyon:',
 'template-protected' => '(protektado)',
 'template-semiprotected' => '(semi-protektado)',
+'hiddencategories' => 'Ining pahina sarong miyembro kan {{PLURAL:$1|1 pinagtagong kategorya|$1 pinagtagong mga kategorya}}:',
 'edittools' => '<!-- An teksto digdi mahihiling sa babâ kan mga pormang pighihirá asin pigkakarga. -->',
 'nocreatetitle' => 'Limitado an paggibo nin pahina',
-'nocreatetext' => 'Igwang pagpogol sa paggibo nin bàgong pahina sa site na ini.
-Pwede kang bumalik dangan maghirá nin presenteng pahina, o [[Special:UserLogin|maglaog o magbukas nin account]].',
-'nocreate-loggedin' => 'Mayò ka nin permiso na maggibo nin mga bàgong pahina sa wiki na ini.',
+'nocreatetext' => '{{SITENAME}} pinagpupugol an kakayanan na magmukna nin baguhong mga pahina.
+Ika makakabalik asin magliwat kan eksistidong nang pahina, o [[Special:UserLogin|maglaog ka o magmukna nin sarong panindog]].',
+'nocreate-loggedin' => 'Ika mayo tabi nin permiso tanganing magmukna nin baguhong mga pahina.',
+'sectioneditnotsupported-title' => 'An pagliliwat tabi sa seksyon bakong suportado',
+'sectioneditnotsupported-text' => 'An pagliliwat tabi sa seksyon bakong suportado sa pahinang ini.',
 'permissionserrors' => 'Mga saláng Permiso',
 'permissionserrorstext' => 'Mayò ka nin permiso na gibohon yan, sa minasunod na {{PLURAL:$1|rason|mga rason}}:',
-'recreate-moveddeleted-warn' => "'''Patanid: Piggigíbo mo giraray an pahina na pigparà na dati pa.'''
-
-Dapat mong isipon kun kaipuhan na ipadagos an paghirá kaining pahina.
-An paghalì kan historial para sa pahinang ini yaon digdi para sa saimong kombenyensya:",
+'permissionserrorstext-withaction' => 'Ika mayo tabi nin permiso sa $2, para sa minasunod na {{PLURAL:$1|rason|mga rason}}:',
+'recreate-moveddeleted-warn' => "'''Patanid tabi: Saimong pinagmumukna giraray an sarong pahina na dati nang pinagpura.'''
+
+Saimo tabing ikonsidera kun ini maninigo na ipagpadagos pa an pagliliwat kaining pahina.
+An pagpura asin pagbalyong talaan para sa pahinang ini pinaghaya digde para sa kombenyinsiya:",
+'moveddeleted-notice' => 'Ining pahina pinagpura na.
+An pagpura asin pagbalyong talaan para sa pahina pinaghaya sa ibaba bilang reperensiya.',
+'log-fulllog' => 'Tanawon an bilog na talaan',
+'edit-hook-aborted' => 'An pagliwat pinagpundo sa paagi kan pangawil.
+Ini dae tabi nagtao nin kapaliwanagan.',
+'edit-gone-missing' => 'Dae makakapagdagdag sa pahina.
+Ini minapahiwatig tabi na pinagpura na.',
 'edit-conflict' => 'Igwang iregularidad sa pagliwat.',
+'edit-no-change' => 'An saimong pagliwat pinagbalewala, nin huli ta mayong pagbabago an pinaghimo sa teksto.',
 'edit-already-exists' => 'Dai maggibo an bàgong pahina.
 Igwa na kaini.',
+'defaultmessagetext' => 'Tugmadong mensahe sa teksto',
+
+# Parser/template warnings
+'expensive-parserfunction-warning' => "'''Patanid tabi:''' Ining pahina naglalaman nin grabe kadakulon na ekspensibong programang pambaranga sa punksyon nin mga pag-aapod.
+
+Ini dapat magkaigwa nin menos sanang $2 {{PLURAL:$2|apod|mga apod}}, igwa na {{PLURAL:$1|ngunyan nin $1 apod|ngunyan nin $1 mga apod}}.",
+'expensive-parserfunction-category' => 'Mga pahina na igwa nin grabe kadakulon na mga ekspensibong programang pambaranga sa punksyon nin mga pag-aapod',
+'post-expand-template-inclusion-warning' => "'''Patanid tabi:''' An panguyog (template) igwang sukol na grabe kadakula.
+An ibang mga panguyog dae tabi maipagdadagdag.",
+'post-expand-template-inclusion-category' => 'Mga pahina kun saen an panguyog igwang sukol na sobrado',
+'post-expand-template-argument-warning' => "'''Patanid tabi:''' Ining pahina naglalaman baya nin sarong panguyog na igwang grabe kadakulang kalakbangan sa sukol.
+Ining mga argumento tabi pinagharali na.",
+'post-expand-template-argument-category' => 'Mga pahina na naglalaman kan pinagharaleng mga argumento sa panguyog',
+'parser-template-loop-warning' => 'An kaluktosan kan panguyog namansayan: [[$1]]',
+'parser-template-recursion-depth-warning' => 'An panguyog nin rekursyong panrarom na kasagkodan nagsobra nin ($1)',
+'language-converter-depth-warning' => 'Tagapagbago kan Lengguwaheng panrarom na kasagkodan nagsobra ($1)',
+'node-count-exceeded-category' => 'Mga pahina kun saen an kabilangan nin tagapagsumpay nagsobra',
+'node-count-exceeded-warning' => 'An pahina nagsobra an kabilangan nin tagapagsumpay',
+'expansion-depth-exceeded-category' => 'Mga pahina kun saen an panrarom na kalakbangan nagsobra',
+'expansion-depth-exceeded-warning' => 'An pahina nagsobra sa panrarom na kalakbangan',
+'parser-unstrip-loop-warning' => 'Panul-ot na kaluktusan namansayan',
+'parser-unstrip-recursion-limit' => 'Panul-ot na rekusyong kasagkodan nagsobra ($1)',
+'converter-manual-rule-error' => 'Kasalaan detektado sa manwal na konbersyon kan pinapasunod sa lengguwahe',
 
 # "Undo" feature
 'undo-success' => 'Pwedeng bawion an paghirá. Sosogon tabì an pagkakaiba sa babâ tangarig maberipikár kun ini an boot mong gibohon, dangan itagama an mga pagbabàgo sa babâ tangarig tapuson an pagbawì sa paghirá.',
 'undo-failure' => 'Dai napogol an paghirá ta igwa pang ibang paghirá sa tahaw na nagkokomplikto.',
-'undo-summary' => 'Bawion an pagpakaraháy na $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|Pag-oláyan]])',
+'undo-norev' => 'An pagliwat dae tabi magigibo nin huli ta ini bakong eksistido o pinagpura na.',
+'undo-summary' => 'Dae idagos an rebisyon $1 sa [[Special:Contributions/$2|$2]] ([[User talk:$2|olay]])',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Dai makagibo nin account',
@@ -674,6 +911,7 @@ Igwa na kaini.',
 'viewpagelogs' => 'Hilingón an mga usip para sa pahinang ini',
 'nohistory' => 'Mayong paghirá nin uusipón sa pahinang ini.',
 'currentrev' => 'Sa ngonyan na pagpakarháy',
+'currentrev-asof' => 'Pinakahuring pagbabago kan $1',
 'revisionasof' => 'Pagpakarháy sa $1',
 'revision-info' => 'An pagpakarháy sa $1 ni $2',
 'previousrevision' => '←Lumà pang pagpakarhay',
@@ -688,9 +926,10 @@ Igwa na kaini.',
 Legend: (ngonyan) = kaibhán sa ngonyan na bersyon,
 (huri) = kaibhán sa huring bersyon, S = saradít na paghirá.',
 'history-fieldset-title' => 'Rinsayon an uusipon',
+'history-show-deleted' => 'Pinagpura sana',
 'histfirst' => 'Pinakaenot',
 'histlast' => 'Pinakahúri',
-'historysize' => '($1 bytes)',
+'historysize' => '({{PLURAL:$1|sarong byte|$1 mga bytes}})',
 'historyempty' => '(mayong laog)',
 
 # Revision feed
@@ -702,51 +941,158 @@ Pwedeng pigparà na ini sa wiki, o tinàwan nin bàgong pangaran.
 Probaran tabì an [[Special:Search|pighahanap sa wiki]] para sa mga pahinang dapít.',
 
 # Revision deletion
-'rev-deleted-comment' => '(hinalì an komento)',
+'rev-deleted-comment' => '(pagliwat na sumaryo pinaghale)',
 'rev-deleted-user' => '(hinalì an parágamit)',
-'rev-deleted-event' => '(hinalì an ingreso)',
-'rev-deleted-text-permission' => 'Ining pagpakaraháy nin pahina pighalì na sa mga archibong panpubliko.
-Pwedeng igwang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} historial kan pagparà].',
-'rev-deleted-text-view' => 'Ining pagpakaraháy nin pahina pighalì na sa mga archibong panpubliko.
-Pwede mo ining hilingón bilang sarong tagamató kaining site;
-Pwedeng igwang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} historial kan pagparà].',
+'rev-deleted-event' => '(talaan kan aksyon pinaghale)',
+'rev-deleted-user-contribs' => '[Ngaran nin paragamit o IP address pinaghale - an pigliwat pinagtago gikan sa mga kontribusyon]',
+'rev-deleted-text-permission' => "An pinagbago tabi kaining pahina '''pinagpura'''.
+An mga detalye mananagboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan kan pinagpura].",
+'rev-deleted-text-unhide' => "An pagbabago tabi kaining pahina '''pinagpura'''.
+Mga detaylye puwedeng managboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan nin pagpura].
+Ika mapuwedeng [$1 hilingon ining pagbabago] kun ika nagmawot na magpadagos.",
+'rev-suppressed-text-unhide' => "An pagbabago kaining pahina '''pinaglubog'''.
+Mga detalye mapuwedeng managboan sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} talaan kan paglubog].
+Ika mapuwede pa man [$1 matanaw ining pagbabago] kun mawot na magdagos",
+'rev-deleted-text-view' => "An pagbabago tabi kaining pahina '''pinagpura'''.
+Ika mapuwedeng magtanaw kaini; mga detalye puwedeng managboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan kan pinagpura].",
+'rev-suppressed-text-view' => "An pagbabago kaining pahina '''pinaglubog'''.
+Ika mapuwedeng matanaw ini; mga detalye puwedeng managboan sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} talaan kan pinaglubog].",
+'rev-deleted-no-diff' => "Ika dae makapagtanaw kaining diff nin huli ta saro kan mga pagbabago '''pinagpura'''.
+Mga detalye puwedeng managboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan kan pinuraan].",
+'rev-suppressed-no-diff' => "Ika dae makapagtanaw kaining diff nin huli ta saro sa mga pagbabago '''pinagpura'''.",
+'rev-deleted-unhide-diff' => "Saro sa mga pagbabago kaining diff '''pinagpura'''.
+Mga detalye mapuwedeng managboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan kan pinuraan].
+Ika mapuwede pa [$1 magtanaw kaining diff] kun ika nagmawot na magpadagos.",
+'rev-suppressed-unhide-diff' => "Saro sa mga rebisyon kaining diff '''pinaglubog'''.
+Mga detalye mapuwedeng managboan sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} pinaglubog na talaan].
+Ika mapuwede man na [$1 tanawon ining diff] kun ika mawot na magpadagos.",
+'rev-deleted-diff-view' => "Saro sa mga pinagbago kaining diff '''pinagpura'''.
+Ika makakapagtanaw kaining diff; mga detalye puwedeng mananagboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan kan pinuraan].",
+'rev-suppressed-diff-view' => "Saro sa mga pinagbago kaining diff '''pinaglubog'''.
+Ika puwedeng makakatanaw kaining diff; mga detalye puwedeng mananagboan sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} talaan kan pinaglubog].",
 'rev-delundel' => 'ipahilíng/itagò',
+'rev-showdeleted' => 'ibuyagyag',
 'revisiondelete' => 'Paraon/bawion an mga pagpakaraháy',
-'revdelete-nooldid-title' => 'Mayong tunggit pagpakaraháy',
-'revdelete-nooldid-text' => 'Dai ka nagpili nin target na pagpakarhay o mga pagpakarhay tangarig magamit ini.',
-'revdelete-selected' => "'''{{PLURAL:$2|Selected revision|Selected revisions}} kan [[:$1]]'''",
-'revdelete-text' => "'''An mga pagpakarhay asin mga panyayari na pigparâ mahihiling pa sa historya asin mga historial kan páhina, pero an ibang parte kan mga laog kaini dai na ipapahiling sa publiko.'''
-
-An ibang mga administrador sa ining wiki pwede pang maghiling kan mga nakatagong laog asin pwede pa nindang bawîon an pagparâ kaini sa paggamit kan parehong ''interface'', kun mayô pang mga ibang restriksyón.",
-'revdelete-legend' => 'Ipwesto an mga restriksyón',
+'revdelete-nooldid-title' => 'Imbalidong target nin pagbabago',
+'revdelete-nooldid-text' => 'Ika dae baya naghayag nin sarong target sa pagbabago tanganing gibohon ining punksyon, an ipinaghayag na pagbabago bako tabing eksistido, o ika nagpuprubar tanganing itago an presentend pagbabago.',
+'revdelete-nologtype-title' => 'Mayong tipo nin talaan na ipinagtao',
+'revdelete-nologtype-text' => 'Ika dae tabi nagpapahayag nin sarong tipo nin talaan tanganing gumibo kaining aksyon dagos.',
+'revdelete-nologid-title' => 'Imbalidong entrada sa talaan',
+'revdelete-nologid-text' => 'Ika dae tabi naghayag nin sarong target talaan nin pangyayari tanganing gumibo kaining punksyon o an pinaghayag na entrada dae tabi eksistido.',
+'revdelete-no-file' => 'An sagunson na pinaghayag dae tabi eksistido.',
+'revdelete-show-file-confirm' => 'Segurado ka tabi na gusto mo matanaw sarong pinagpurang pagbabago kan sagunson "<nowiki>$1</nowiki>" poon $2 sa $3?',
+'revdelete-show-file-submit' => 'Iyo tabi',
+'revdelete-selected' => "'''{{PLURAL:$2|Selected revision|Mga piniling pagbabago}} kan [[:$1]]'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Selected log event|Mga piniling talaan kan mga pangyayari}}:'''",
+'revdelete-text' => "'''Pinagpurang mga pagbabago asin mga pangyayari mahihiling pa man sa historiyang pahina asin mga talaan, pero an mga parte kan saindang laman dae puwedeng magamit kan publiko.'''
+An ibang administrador sa {{SITENAME}} puwede pa man makagamit sa pinagtagong laman asin balewalaon an pagpura kaini giraray sa paagi nin kaparehong panlaog-olay, laen lang kun may kadagdagang pangilin an inilapat.",
+'revdelete-confirm' => 'Pakikumpirma tabi na ika tuyong gumibo kaini, na saimong naintindihan an mga konsekuwensiya, asin ta ika pinaghihimo ini na uyon sa [[{{MediaWiki:Policy-url}}|an palisiya]].',
+'revdelete-suppress-text' => "An paglulubog dapat '''sana''' makakagamit sana para sa minasunod na mga kaso:
+*Potensiyal na libeloso an impormasyon
+*Bakong angay an personal na impormasyon
+*: ''mga address kan harong asin mga numero kan telepono, sosyal na seguridad, iba pa.''",
+'revdelete-legend' => 'Ilapat an mga restriksyon sa bisibilidad',
 'revdelete-hide-text' => 'Tagoon an teksto kan pagpakaraháy',
 'revdelete-hide-image' => 'Tagoon an laog kan file',
 'revdelete-hide-name' => 'Tagoon an aksyon asin target',
 'revdelete-hide-comment' => 'Tagoon an komento sa paghirá',
 'revdelete-hide-user' => 'Tagoon an pangaran kan editor/IP',
-'revdelete-hide-restricted' => 'Ibali sa mga restriksyón na ini an mga sysops asin iba pa',
+'revdelete-hide-restricted' => 'Ilubog an mga datos gikan sa mga administrador asin man kan iba',
+'revdelete-radio-same' => '(dae pagribayan)',
+'revdelete-radio-set' => 'Iyo tabi',
+'revdelete-radio-unset' => 'Bako tabi',
 'revdelete-suppress' => 'Dai ipahilíng an mga datos sa mga sysops asin sa mga iba pa',
 'revdelete-unsuppress' => 'Halîon an mga restriksyón sa mga ibinalík na pagpakarhay',
 'revdelete-log' => 'Rason:',
-'revdelete-submit' => 'Ibílang sa piniling pagpakarhay',
-'revdelete-success' => "'''Nakapwesto na an bisibilidad kan pagpakarhay.'''",
+'revdelete-submit' => 'Ipag-aplay sa mga piniling {{PLURAL:$1|pagbabago|mga pagbabago}}',
+'revdelete-success' => "'''Pagbabago sa bisibilidad matrayumpong pinagdagdagan.'''",
+'revdelete-failure' => "'''Pagbabago sa bisibilidad dae tabi nadagdagan:'''
+$1",
 'logdelete-success' => "'''Nakapuesto na an katalâan kan nangyari.'''",
+'logdelete-failure' => "'''Talaan sa bisibilidad dae tabi nailapat:'''
+$1",
+'revdel-restore' => 'ribayan an bisibilidad',
+'revdel-restore-deleted' => 'pinagpurang mga pagbabago',
+'revdel-restore-visible' => 'lantad na mga pagbabago',
+'pagehist' => 'Pahinang historiya',
+'deletedhist' => 'Pinagpurang historiya',
+'revdelete-hide-current' => 'Napasalang pagtatago kan item petsado $2, $1: Iyo ini an presenteng pagbabago.
+Ini dae tabi naitatago.',
+'revdelete-show-no-access' => 'Napasalang paghahayag kan item petsado $2, $1: Ining item markadong "pinagpangilin".
+Ika mayo tabing pangaputan kaini.',
+'revdelete-modify-no-access' => 'Napasalang pagsasangli kan item petsado $2, $1: Ining item markadong "pinagpangilin".
+Ika mayo tabing pangaputan kaini.',
+'revdelete-modify-missing' => 'Napasalang pagsasangli kan item ID $1: Ini nawawara gikan sa datos-sarayan!',
+'revdelete-no-change' => "'''Patanid tabi:''' An item petsado $2, $1 igwa na tabi kan pinaghahagad na mga panuytoy sa bisibilidad.",
+'revdelete-concurrent-change' => 'Napasalang pagsasangli kan item petsado $2, $1: An status nagpapahiling na pinagribayan kan ibang tawo habang ikan nagprubar na sanglian ini.
+Paki-tsek tabi sa mga talaan.',
+'revdelete-only-restricted' => 'Napasalang pagtatago kan item petsado $2, $1: Ika dae tabi makakapaglubog kan mga item na mahiling kan mga administrador na mayo kang piniling saro sa iba pang bisibilidad na mga pagpipilian.',
+'revdelete-reason-dropdown' => '*Pirmihang mga rason sa pagpura
+**Paglapas kan Copyright
+**Bakong angay na personal na impormasyon
+**Potensiyal na libelosong impormasyon',
+'revdelete-otherreason' => 'Iba pa/kadagdagang rason:',
+'revdelete-reasonotherlist' => 'Ibang rason',
+'revdelete-edit-reasonlist' => 'Liwaton an mga rason sa pagpura',
+'revdelete-offender' => 'Awtor kan pagbabago:',
+
+# Suppression log
+'suppressionlog' => 'Talaan kan paglulubog',
+'suppressionlogtext' => 'Sa ibaba yaon an sarong listahan kan mga pinuraan asin mga kinubkob na imbuwelto sa laman na pinagtatago sa mga administrador.
+Hilnga baya an [[Special:BlockList|listahan kan kinubkob]] para sa listahan kan presenteng operasyonal na mga pinagbabawal asin mga pinagkukubkob.',
+
+# History merging
+'mergehistory' => 'Tiriponon an pahina kan mga historiya',
+'mergehistory-header' => 'Ining pahina minatugot saimo na tiriponon an mga pagbabago kan historiya nin sarong pinaggikanang pahina na magin sarong baguhong pahina.
+Himoon mong segurado na ining pagbabago makapagtala nin historikal na kapadagusang pahina.',
+'mergehistory-box' => 'Tiriponon an mga pagbabago sa duwang mga pahina:',
+'mergehistory-from' => 'Gikanang pahina:',
+'mergehistory-into' => 'Destinasyong pahina:',
+'mergehistory-list' => 'Puwedeng maitiripon na historiya kan pagliwat',
+'mergehistory-merge' => 'An mga minasunod na mga rebisyon kan [[:$1]] mapuwedeng pagkasararoon na magin [[:$2]].
+Gamita an radyong pindutan sa kolum tanganing sararoon sana an mga rebisyon na pinagmukna sa asin bago pa man an pinagsambit na oras.
+Tandaan na an paggagamit kan nabigasyong nin mga kasurugponan makakapagliwat kaining kolum.',
+'mergehistory-go' => 'Ipahayag an mapuwedeng matiripon na mga pagliwat',
+'mergehistory-submit' => 'Tiripona an mga pagbabago',
+'mergehistory-empty' => 'Mayong mga pagbabago na puwedeng mapagtiripon.',
+'mergehistory-success' => '$3 {{PLURAL:$3|pagbabago|mga pagbabago}} sa [[:$1]] matrayumpong napagtiripon na magin [[:$2]].',
+'mergehistory-fail' => 'Dae tabi makayanan na makapaghimo nin historiyang pagtiripon, tabi pakihiling giraray an pahina asin parametro kan oras.',
+'mergehistory-no-source' => 'Gikanang pahina $1 bakong eksistido.',
+'mergehistory-no-destination' => 'Destinasyong pahina $1 bakong eksistido.',
+'mergehistory-invalid-source' => 'Gikanang pahina kaipuhan magin saro na balidong titulo.',
+'mergehistory-invalid-destination' => 'Destinasyong pahina kaipuhan magin saro na balidong titulo.',
+'mergehistory-autocomment' => 'Pinagtiripon [[:$1]] na magin [[:$2]]',
+'mergehistory-comment' => 'Pinagtiripon [[:$1]] na magin [[:$2]]: $3',
+'mergehistory-same-destination' => 'Gikanan asin destinasyong mga pahina dae puwedeng magkapareho',
+'mergehistory-reason' => 'Rason:',
 
 # Merge log
+'mergelog' => 'Talaan kan pagtiripon',
+'pagemerge-logentry' => 'pinagtiripon [[$1]] na magin [[$2]] (mga pagbabago sagkod sa $3)',
 'revertmerge' => 'Suwayón',
+'mergelogpagetext' => 'Sa ibaba yaon an sarong listahan kan pinakahuring mga pagtitiripon kan sarong pahinang historiya sagkod sa iba pa.',
 
 # Diffs
-'history-title' => 'Uusipón nin pagpakarháy kan "$1"',
+'history-title' => 'Pagbabagong historiya kan "$1"',
+'difference-title' => 'Pagkalaen sa tahaw nin mga pagbabago kan "$1"',
+'difference-title-multipage' => 'Pagkalaen sa tahaw nin mga pahina sa "$1" asin "$2"',
+'difference-multipage' => '(Pagkalaen sa tahaw kan mga pahina)',
 'lineno' => 'Taytáy $1:',
 'compareselectedversions' => 'Ikomparar an mga piniling bersyon',
+'showhideselectedversions' => 'Ihayag/itago mga piniling pagbabago',
 'editundo' => 'isulít',
-'diff-multi' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} dai ipinahihiling.)',
+'diff-multi' => '({{PLURAL:$1|Saro intermediate na pagbabago|$1 mga intermediate na mga pagbabago}} by {{PLURAL:$2|sarong paragamit|$2 mga paragamit}} dae pinaghahayag)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Sarong intermediate na pagbabago|$1 mga intermediate na mga pagbabago}} na sobra sa $2 {{PLURAL:$2|paragamit|mga paragamit}} dae pinaghahayag)',
+'difference-missing-revision' => '{{PLURAL:$2|sarong rebisyon|$2 mga rebisyon}} kaining diperensiya ($1) {{PLURAL:$2|na iyo an|kaidto na iyo an}} dae nanagboan.
+
+Ini pirmihan na pinagkakausa sa paagi nin pagsusunod nin luwas sa petsang diff na kasugponan pasiring sa sarong pahina na pinagpura na.
+An mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan kan pinagpuraan].',
 
 # Search results
 'searchresults' => 'Resulta kan paghánap',
 'searchresults-title' => 'Hanápon an resulta para sa "$1"',
 'searchresulttext' => 'Para sa iba pang impormasyon manonongod sa paghanap sa {{SITENAME}}, hilingon tabî an [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => "Hinanap mo an '''[[:$1]]'''",
+'searchsubtitle' => 'Ika naghanap para sa \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|gabos na mga pahina na nagpopoon sa "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|gabos na mga pahina na nakatakod sa "$1"]])',
 'searchsubtitleinvalid' => "Hinanap mo an '''$1'''",
 'toomanymatches' => 'Kadakol-dakol na angay an ipigbalik, probaran an ibang kahaputan',
 'titlematches' => 'Angay an título kan artíkulo',
@@ -755,21 +1101,56 @@ An ibang mga administrador sa ining wiki pwede pang maghiling kan mga nakatagong
 'notextmatches' => 'Mayong ángay na teksto nin páhina',
 'prevn' => 'dating {{PLURAL:$1|$1}}',
 'nextn' => 'sunód na {{PLURAL:$1|$1}}',
+'prevn-title' => 'Dati $1 {{PLURAL:$1|resulta|mga resulta}}',
+'nextn-title' => 'Sunod $1  {{PLURAL:$1|resulta|mga resulta}}',
+'shown-title' => 'Ipahiling $1  {{PLURAL:$1|resulta|mga resulta}} sa kada pahina',
 'viewprevnext' => 'Hilingón ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'Opsyon sa paghahanap',
+'searchmenu-exists' => "'''Igwa nin sarong pahina na pinagngaranan na \"[[:\$1]]\" sa wiking ini.'''",
+'searchmenu-new' => "'''Muknaon an pahina \"[[:\$1]]\" sa wiking ini!'''",
 'searchhelp-url' => 'Help:Mga laog',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kilyawon an mga pahina sa paagi kainin enotang panigmit]]',
+'searchprofile-articles' => 'Mga pahina nin laog',
+'searchprofile-project' => 'Mga pahina nin Tabang asin Proyekto',
+'searchprofile-images' => 'Multimidya',
 'searchprofile-everything' => 'Gabós',
+'searchprofile-advanced' => 'Adbansiyado',
 'searchprofile-articles-tooltip' => 'Hanapon sa $1',
+'searchprofile-project-tooltip' => 'Maghanap sa $1',
+'searchprofile-images-tooltip' => 'Maghanap nin mga sagunson',
+'searchprofile-everything-tooltip' => 'Maghanap nin gabos na laog (kabali an mga pahina nin olay)',
+'searchprofile-advanced-tooltip' => 'Maghanap nin pankustombreng espasyong-ngaran',
 'search-result-size' => '$1 ({{PLURAL:$2|1 tatarámon|$2 mga tatarámon}})',
+'search-result-category-size' => '{{PLURAL:$1|1 miyembro|$1 mga miyembro}} ({{PLURAL:$2|1 subkategorya|$2 mga subkategorya}}, {{PLURAL:$3|1 sagunson|$3 mga sagunson}})',
+'search-result-score' => 'Relebansiya: $1%',
+'search-redirect' => '(Panukdong otro $1)',
+'search-section' => '(Seksyon $1)',
 'search-suggest' => 'Boót mo iyó: $1',
+'search-interwiki-caption' => 'Tugang na mga proyekto',
+'search-interwiki-default' => '$1 na mga resulta:',
 'search-interwiki-more' => '(dakol pa)',
 'search-mwsuggest-enabled' => 'igwang mga suhestyon',
 'search-mwsuggest-disabled' => 'mayong suhestyon',
+'search-relatedarticle' => 'Kauyon',
+'mwsuggest-disable' => 'Pundohon an AJAX na mga suhestiyon',
+'searcheverything-enable' => 'Maghanap sa gabos na mga espasyong-ngaran',
+'searchrelated' => 'kauyon',
 'searchall' => 'gabós',
 'showingresults' => "Pigpapahiling sa babâ sagkod sa {{PLURAL:$1|'''1''' resulta|'''$1''' mga resulta}} poon sa #'''$2'''.",
 'showingresultsnum' => "Pigpapahiling sa babâ {{PLURAL:$3|'''1''' resulta|'''$3''' mga resulta}} poon sa #'''$2'''.",
-'nonefound' => "'''Pagiromdom''': An mga prakasong paghanap pirmeng kawsa kan paghanap kan mga tataramon na komún arog kan \"may\" asin \"sa\", huli ta an mga ini dai nakaíndise, o sa pagpili kan sobra sa sarong tataramon (an mga páhina sana na igwá kan gabos na pighahanap na tataramon an maipapahiling sa resulta).",
-'powersearch' => 'Pinaoróg na paghánap',
+'showingresultsheader' => "{{PLURAL:$5|Resulta '''$1''' kan '''$3'''|Mga Resulta '''$1 - $2''' kan '''$3'''}} para sa '''$4'''",
+'nonefound' => "'''Notang Antabay''': An ibang espasyong-ngaran sana an pirmihang pinaghahanap.
+Prubaran na panigmitan an saimong kahaputan nin ''all:'' sa paghanap kan gabos na laog (kabali an mga pahina nin olay, mga templato, etc), o gamiton an pinagmawot na espasyong ngaran bilang enotang panigmit.",
+'search-nonefound' => 'Mayo nin mga resulta na panampok sa kahaputan.',
+'powersearch' => 'Adbansiyadong paghahanap',
+'powersearch-legend' => 'Adbansiyadong paghahanap',
+'powersearch-ns' => 'Maghanap sa mga espasyong-ngaran:',
+'powersearch-redir' => 'Listahan kan mga panukdong otro',
 'powersearch-field' => 'Hanápon an',
+'powersearch-togglelabel' => 'Pamili:',
+'powersearch-toggleall' => 'Gabos',
+'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
@@ -779,103 +1160,292 @@ An ibang mga administrador sa ining wiki pwede pang maghiling kan mga nakatagong
 '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',
 
 # Preferences page
 'preferences' => 'Mga kabòtan',
 'mypreferences' => 'Mga kabòtan ko',
 'prefs-edits' => 'Bilang kan mga hirá:',
 'prefsnologin' => 'Dai nakalaog',
-'prefsnologintext' => 'Ika dapat si [[Special:UserLogin|nakalaog]] para makapwesto nin mga kabôtan nin parágamit.',
+'prefsnologintext' => 'Ika dapat na magin <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} nakalaog na]</span> tanganing tuytuyon an mga kabotan nin paragamit.',
 'changepassword' => 'Ribayan an sekretong panlaog',
 'prefs-skin' => "''Skin''",
 'skin-preview' => 'Tânawon',
 'datedefault' => 'Mayong kabôtan',
+'prefs-beta' => 'Mga posturang yaon sa beta',
 'prefs-datetime' => 'Petsa asin oras',
+'prefs-labs' => 'Mga posturang yaon sa Labs',
+'prefs-user-pages' => 'Paragamit na mga pahina',
 'prefs-personal' => 'Pambisto nin parágamit',
 'prefs-rc' => 'Mga kaaagi pa sanang pagribay',
 'prefs-watchlist' => 'Pigbabantayan',
-'prefs-watchlist-days' => 'Máximong número nin mga aldaw na ipapahiling sa lista nin mga pigbabantayan:',
+'prefs-watchlist-days' => 'Mga aldaw na ipahiling sa batay-listahan:',
+'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|aldaw|mga aldaw}}',
 'prefs-watchlist-edits' => 'Máximong número nin pagbabâgo na ipapahiling sa pinadakulang lista nin pigbabantayan:',
+'prefs-watchlist-edits-max' => 'Maksimum na numero: 1000',
+'prefs-watchlist-token' => 'Token sa Bantay-listahan:',
 'prefs-misc' => 'Lain',
+'prefs-resetpass' => 'Liwaton an sekretong panlaog',
+'prefs-changeemail' => 'Liwaton an e-surat na adres',
+'prefs-setemail' => 'Tuytuyon an e-surat na adres',
+'prefs-email' => 'E-surat na mga pagpipilian',
+'prefs-rendering' => 'Hitsurahon',
 'saveprefs' => 'Itagama',
-'resetprefs' => 'Ipwesto giraray',
+'resetprefs' => 'Linigan an dae naitagamang mga kaliwatan',
+'restoreprefs' => 'Ibalik an gabos na pirmihang mga panuytoy',
 'prefs-editing' => 'Pighihira',
+'prefs-edit-boxsize' => 'Sukol kan bintana sa pagliwat.',
 'rows' => 'Mga hilera:',
 'columns' => 'Mga taytay:',
 'searchresultshead' => 'Hanápon',
 'resultsperpage' => 'Mga tamà kada pahina:',
 'stub-threshold' => 'Kasagkoran kan <a href="#" class="stub">takod kan tambô</a> pigpopormato:',
+'stub-threshold-disabled' => 'Pinagpundo',
 'recentchangesdays' => 'Mga aldáw na ipapahilíng sa mga nakakaági pa sanáng pagbabàgó:',
-'recentchangescount' => 'Bilang nin mga paghirá na ipapahilíng sa mga nakakaági pa sanáng pagbabàgó:',
+'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|aldaw|mga aldaw}}',
+'recentchangescount' => 'Numero kan mga pagliliwat na ipapahiling na pirmihan:',
+'prefs-help-recentchangescount' => 'Kabali kaini an dae pa nahaloy na mga kaliwatan, mga historiyang pahina, asin mga talaan.',
+'prefs-help-watchlist-token' => 'An pagpapano sa parteng ini nin sarong sekretong susi magbubuswang nin RSS feed para sa saimong bantay-listahan.
+Siisay man na nakakaaram kan suri sa parteng ini makakabasa kan saimong bantay-listahan, kaya magpili nin sarong seguradong halaga.
+Uya an halaga sa random na pagbuswang na puwede mong magamit: $1',
 'savedprefs' => 'Itinagama na an mga kabôtan mo.',
-'timezonelegend' => 'Zona nin oras',
-'localtime' => 'Lokal na oras',
-'servertime' => "Oras kan ''server''",
+'timezonelegend' => 'Pan-oras na sona:',
+'localtime' => 'Panlokal na oras:',
+'timezoneuseserverdefault' => 'Gamita an panugmad sa wiki ($1)',
+'timezoneuseoffset' => 'Iba pa (ihayag an pambawi)',
+'timezoneoffset' => 'Bawia¹:',
+'servertime' => 'Oras kan serbidor:',
 'guesstimezone' => "Bugtakan an ''browser''",
+'timezoneregion-africa' => 'Aprika',
+'timezoneregion-america' => 'Amerika',
+'timezoneregion-antarctica' => 'Antartika',
+'timezoneregion-arctic' => 'Arktik',
+'timezoneregion-asia' => 'Asya',
+'timezoneregion-atlantic' => 'Atlantikong Kadagatan',
+'timezoneregion-australia' => 'Australya',
+'timezoneregion-europe' => 'Europa',
+'timezoneregion-indian' => 'Indiyang Kadagatan',
+'timezoneregion-pacific' => 'Pasipikong Kadagatan',
 'allowemail' => "Togotan an mga ''e''-surat halî sa ibang mga parágamit",
-'defaultns' => 'Maghilíng mûna sa ining mga ngaran-espacio:',
+'prefs-searchoptions' => 'Pagpipilian sa Paghahanap',
+'prefs-namespaces' => 'Pangarang mga espasyo',
+'defaultns' => 'Kun laen maghanap sa laog kaining pangarang mga espasyo:',
 'default' => 'pwestong normal',
 'prefs-files' => 'Mga dokumento',
+'prefs-custom-css' => 'Kustombreng CSS',
+'prefs-custom-js' => 'Kustombreng JavaScript',
+'prefs-common-css-js' => 'Pinagheras na CSS/JavaScript para sa gabos na mga kalapatan:',
+'prefs-reset-intro' => 'Ika makakagamit kaining pahina tanganing ilapat giraray an saimong mga kabotan sa panugmad kan sayt.
+Ini dae tabi matitingkog.',
+'prefs-emailconfirm-label' => 'Kumpirmasyon sa E-koreo',
+'prefs-textboxsize' => 'Sukol kan bintana sa pagliliwat',
 'youremail' => 'E-koreo:',
 'username' => 'Pangaran kan parágamit:',
 'uid' => 'ID kan parágamit:',
 'prefs-memberingroups' => 'Miembro kan {{PLURAL:$1|grupo|grupos}}:',
+'prefs-registration' => 'Rehistrasyong oras:',
 'yourrealname' => 'Totoong pangaran:',
 'yourlanguage' => 'Tataramon:',
-'yourvariant' => 'Bariante:',
-'yournick' => 'Gahâ:',
+'yourvariant' => 'Panlaog na lengguwaheng kairibanhan:',
+'prefs-help-variant' => 'Saimong pinagpiling kairibanhan o ortograpiya tanganing ipahiling an laog kaining mga pahina sa wiking ini.',
+'yournick' => 'Panibagong pirma:',
+'prefs-help-signature' => 'Mga komentaryo sa mga pahina nin olay dapat pirmado nin "<nowiki>~~~~</nowiki>" na pagriribayon na magin saimong pirma asin sarong panimbreng oras.',
 'badsig' => 'Dai pwede an bâgong pirmang ini; isúsog an mga HTML na takód.',
-'badsiglength' => 'Halabâon an gahâ; kaipuhan dai mababà sa $1 na mga karakter.',
+'badsiglength' => 'An saimong pirma grabe kahalabaon.
+Ini dapat dae magsobra sa $1 {{PLURAL:$1|karakter|mga karakter}} an laba.',
+'yourgender' => 'Pagkatawo:',
+'gender-unknown' => 'Dae nakasambit',
 'gender-male' => 'Lalaki',
 'gender-female' => 'Babai',
+'prefs-help-gender' => 'Opsyonal: Ginagamit para sa pagkatawong pag-apod sa paagi nin kasungatan.
+Ining impormasyon magigin pampubliko.',
 'email' => 'E-koreo',
 'prefs-help-realname' => 'Opsyonal an totoong pangaran asin kun itatao mo ini, gagamiton ini yangarig an mga sinurat mo maatribuir saimo.',
-'prefs-help-email' => 'Opsyonal an e-koreo, alagad pwede ka na masosog kan iba sa paagi kan saimong pahina o pahina nin olay na dai kinakaipuhan na ipabisto an identidad mo.',
+'prefs-help-email' => 'An e-surat na adres sarong opsyonal, alagad ini kinakaipohan para sa pagtuytoy otro kan sekretong panlaog, kun ika malingaw kan saimong sekretong panlaog.',
+'prefs-help-email-others' => 'Ika kan man pumili na magtugot sa iba na makontak ka sa e-surat sa paagi nin sarong kasugponan na yaon sa saimong pahina nin paragamit o olay.
+An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit makontak saimo.',
 'prefs-help-email-required' => 'Kaipuhan an e-koreo.',
+'prefs-info' => 'Panuntong na impormasyon',
+'prefs-i18n' => 'Internasyonalisasyon',
+'prefs-signature' => 'Pirma',
+'prefs-dateformat' => 'Pampetsang pormat',
+'prefs-timeoffset' => 'Pan-oras na tapal',
+'prefs-advancedrc' => 'Pangenot na mga pagpipilian',
+'prefs-advancedrendering' => 'Abantidong mga pagpipilian',
+'prefs-advancedsearchoptions' => 'Abantidong mga pagpipilian',
+'prefs-advancedwatchlist' => 'Abantidong mga pagpipilian',
+'prefs-displayrc' => 'Ihayag an mga pagpipilian',
+'prefs-displaysearchoptions' => 'Ipahiling ang mga pagpipilian',
+'prefs-displaywatchlist' => 'Ipahiling ang mga pagpipilian',
+'prefs-diffs' => 'Diffs',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'An e-koreo nagpapahiling na balido',
+'email-address-validity-invalid' => 'Magkaag nin sarong balidong e-koreong address',
 
 # User rights
 'userrights' => 'Pagmaneho kan mga derecho nin paragamit',
 'userrights-lookup-user' => 'Magmaného kan mga grupo nin parágamit',
 'userrights-user-editname' => 'Ilaog an pangaran kan parágamit:',
 'editusergroup' => 'Hirahón an mga Grupo kan Parágamit',
-'editinguser' => "Pighihira an parágamit na '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Sinasanglian an paragamit na karapatan kan paragamit '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Hirahón an mga grupo kan parágamit',
 'saveusergroups' => 'Itagama an mga Grupo nin Páragamit',
 'userrights-groupsmember' => 'Myembro kan:',
+'userrights-groupsmember-auto' => 'Implisitong miyembro kan:',
+'userrights-groups-help' => 'Ika puwedeng magbago kan mga grupo na kinabalihan kaining paragamit:
+*An natsekan na kahon minapasabot na an paragamit kabali sa grupong yan.
+*An mayong tsek na kahon minapasabot na an paragamit bakong kabali sa grupong yan.
+* A * minapahiwatig na ika dae puwedeng makapaghale kan grupo kun naidagdag mo na ini, or vice versa.',
 'userrights-reason' => 'Rason:',
+'userrights-no-interwiki' => 'Ika mayo tabing permkso na magliwat sa paragamit na karapatan sa ibang wikis.',
+'userrights-nodatabase' => 'An datos-sarayan $1 bakong eksistido o bakong lokal.',
+'userrights-nologin' => 'Ika kaipuhan na [[Special:UserLogin|maglaog ka]] na igwa nin panindog na administrador bago ka makapagtao nin karapatan sa paragamit.',
+'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',
 
 # Groups
 'group' => 'Grupo:',
+'group-user' => 'Mga Paragamit',
 'group-autoconfirmed' => 'Paragamit na sadiring nagkonpirma',
 'group-bot' => 'Mga bots',
 'group-sysop' => 'Mga sysop',
 'group-bureaucrat' => 'Mga bureaucrat',
+'group-suppress' => 'Mga Tagapagmato',
 'group-all' => '(gabos)',
 
-'group-autoconfirmed-member' => 'Enseguidang nakonpirmar na parágamit',
-'group-sysop-member' => 'Opsys',
-'group-bureaucrat-member' => 'Bureaucrat',
+'group-user-member' => '{{GENDER:$1|paragamit}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|auto-kumpirmadong paragamit}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|administrador}}',
+'group-bureaucrat-member' => '{{GENDER:$1|burokrata}}',
+'group-suppress-member' => '{{GENDER:$1|tagapagmato}}',
 
+'grouppage-user' => '{{ns:project}}:Mga Paragamit',
 'grouppage-autoconfirmed' => '{{ns:project}}:Mga enseguidang nakonpirmar na parágamit',
 'grouppage-bot' => '{{ns:project}}:Mga bot',
 'grouppage-sysop' => '{{ns:project}}:Mga tagamató',
 'grouppage-bureaucrat' => '{{ns:project}}:Mga bureaucrat',
+'grouppage-suppress' => '{{ns:project}}:Tagapagmato',
+
+# Rights
+'right-read' => 'Magbasa kan mga pahina',
+'right-edit' => 'Liwaton an mga pahina',
+'right-createpage' => 'Muknaon an mga pahina (na bakong mga pahina nin orolayan)',
+'right-createtalk' => 'Muknaon an mga pahinang orolayan',
+'right-createaccount' => 'Muknaon an baguhong mga panindog nin paragamit',
+'right-minoredit' => 'Markahan an mga pinagliwat bilang menor',
+'right-move' => 'Ibalyo an mga pahina',
+'right-move-subpages' => 'Ibalyo an mga pahina kaiba an saindang mga sub-pahina',
+'right-move-rootuserpages' => 'Ibalyo an ugat nin mga pahina kan paragamit',
+'right-movefile' => 'Ibalyo an mga sagunson',
+'right-suppressredirect' => 'Dae tabi magmukna nin paotrong direksyon gikan sa ginikanang mga pahina kunsoarin magbabalyo nin mga pahina',
+'right-upload' => 'Ipagkarga an mga sagunson (file)',
+'right-reupload' => 'Patungan an mga eksistidong mga sagunson',
+'right-reupload-own' => 'Patungan an eksistido nang mga pahina na ipinagkarga sa paagi mo',
+'right-reupload-shared' => 'Salambawan an mga sagunson sa lokal na pinagheras nin repositoryo kan media',
+'right-upload_by_url' => 'Ipagkara an mga sagunson sa sarong URL',
+'right-purge' => 'Purgaha an sarayan kan sayt para sa sarong pahina na daeng kaipo an kumpirmasyon',
+'right-autoconfirmed' => 'Liwaton an semi-protektadong mga pahina',
+'right-bot' => 'Pagtrataron bilang awtomatikong proseso',
+'right-nominornewtalk' => 'Dae gayod nagkaigwa nin menor na pagliwat sa mga pahina nin orolayan minasulpang nin bunyaw kan bagong mga mensahe',
+'right-apihighlimits' => 'Gumamit nin harahalangkaw na sagkodan sa mga kahaputan kan API',
+'right-writeapi' => 'Gamit kan pagsurat sa API',
+'right-delete' => 'Puraon an mga pahina',
+'right-bigdelete' => 'Puraon an mga pahina na igwang darakulang mga historiya',
+'right-deletelogentry' => 'Puraon asin dae pagpuran an espesipikong mga entrada sa log',
+'right-deleterevision' => 'Puraon asin dae puraon an espisipikong pagbabago kan mga pahina',
+'right-deletedhistory' => 'Tanawon an pinagpurang mga entradang historiya, na dae kan saindang asosyadong teksto',
+'right-deletedtext' => 'Tanawon an pinagpurang teksto asin mga karibay sa tahaw kan mga pagbabagong pinagpura na',
+'right-browsearchive' => 'Hanapon an pinagpurang mga pahina',
+'right-undelete' => 'Dae puraon an pahina',
+'right-suppressrevision' => 'Hilngon otro asin balikon an mga pagbabagong itinago gikan sa mga administrador',
+'right-suppressionlog' => 'Tanawon an pribadong mga talaan',
+'right-block' => 'Kubkubon an ibang mga paragamit sa pagliliwat',
+'right-blockemail' => 'Kubkubon an paragamit na makapagpadara nin e-koreo',
+'right-hideuser' => 'Kubkubon an pangaran nin paragamit, itago ini sa publiko',
+'right-ipblock-exempt' => 'Sampawan an pangubkob kan IP, awtomatikong-kubkob asin panhalawig na kubkob',
+'right-proxyunbannable' => 'Sampawan an awtomatikong mga kubkob kan mga proksi',
+'right-unblockself' => 'Dae pagkubkubon sinda',
+'right-protect' => 'Ribayan an kurit kan proteksyon asin liwaton an protektadong mga pahina',
+'right-editprotected' => 'Liwaton an protektadong mga pahina (na bakong pinagsasalansan an proteksyon)',
+'right-editinterface' => 'Liwaton an paragamit na olay-panlaog',
+'right-editusercssjs' => 'Liwaton an CSS asin JavaScript na mga sagunson kan ibang mga paragamit',
+'right-editusercss' => 'Liwaton an CSS na mga sagunson kan ibang mga paragamit',
+'right-edituserjs' => 'Liwaton an JavaScript na mga sagunson kan ibang mga paragamit',
+'right-rollback' => 'Hidaling ibalik an mga niliwat kan huring paragamit na nagliwat nin sarong partikular na pahina',
+'right-markbotedits' => 'Markahan an pinagbalik na mga niliwat bilang bot na panliwat',
+'right-noratelimit' => 'Dae magin apektado sa paagi kan rata nin mga sagkodan',
+'right-import' => 'Importaron an mga pahina gikan sa ibang mga wikis',
+'right-importupload' => 'Importaron an mga pahina gikan sa sarong pangarga nin sagunson',
+'right-patrol' => 'Markahan an mga pagliwat kan iba bilang patrolyado',
+'right-autopatrol' => 'Giboha na an saimong sadiring mga pagliwat awtomatikong markado bilang patrolyado',
+'right-patrolmarks' => 'Tanawon an pinakahuring mga pagbabago na markadong patrol',
+'right-unwatchedpages' => 'Tanawon an listahan kan mayong bantay na mga pahina',
+'right-mergehistory' => 'Pagkasararoon an historiya kan mga pahina',
+'right-userrights' => 'Liwaton gabos an karapatan kan mga paragamit',
+'right-userrights-interwiki' => 'Liwaton an karapatan kan mga paragamit kan ibang mga wikis',
+'right-siteadmin' => 'Kandaduhan asin dae pagkandaduhan an datos-sarayan',
+'right-override-export-depth' => 'Eksportaron an mga pahina kabali na an pinagkilyawan na mga pahina sagkod sa rarom na 5',
+'right-sendemail' => 'Magpadara nin e-koreo sa ibang mga paragamit',
+'right-passwordreset' => 'Tanawon an e-koreo kan pagbabago nin sekretong panlaog',
 
 # User rights log
 'rightslog' => 'Usip nin derechos nin paragamit',
 'rightslogtext' => 'Ini an historial kan mga pagbabâgo sa mga derecho nin parágamit.',
 'rightslogentry' => 'Rinibayab an pagkamyembro ni $1 sa $2 sagkod sa $3',
+'rightslogentry-autopromote' => 'dati na awtomatikong pinagpalangkaw gikan sa $2 sagkod $3',
 'rightsnone' => '(mayô)',
 
 # Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'basaha ining pahina',
 'action-edit' => 'liwatón ining pahina',
+'action-createpage' => 'magmukna nin mga pahina',
+'action-createtalk' => 'Magmukna nin mga pahina sa orolayan',
+'action-createaccount' => 'Muknaon ining panindog kan paragamit',
+'action-minoredit' => 'marakahan ining pagliwat bilang menor',
+'action-move' => 'ibalyo ining pahina',
+'action-move-subpages' => 'ibalyo ining pahina, asin kaiba an mga sub-pahina',
+'action-move-rootuserpages' => 'ibalyo an ugat kan mga pahina nin mga paragamit',
+'action-movefile' => 'ibalyo ining sagunson',
+'action-upload' => 'ikarga ining mga sagunson',
+'action-reupload' => 'sampawan ining eksistidong sagunson',
+'action-reupload-shared' => 'salambawan ining sagunson sa pinagheras na repositoryo',
+'action-upload_by_url' => 'ikarga ining sagunson gikan sa URL',
+'action-writeapi' => 'gamita an panurat na API',
+'action-delete' => 'puraon ining pahina',
+'action-deleterevision' => 'puraon ining pagbabago',
+'action-deletedhistory' => 'tanawon an pinagpurang historiya kaining pahina',
+'action-browsearchive' => 'hanapon an pinagpurang mga pahina',
+'action-undelete' => 'dae pagpuraon ining pahina',
+'action-suppressrevision' => 'hilngon otro asin ibalik ining pinagtagong pagbabago',
+'action-suppressionlog' => 'tanawon ining pribadong talaan',
+'action-block' => 'kubkubon ining paragamit gikan sa pagliliwat',
+'action-protect' => 'ribayan an kurit nin proteksyon para sa pahinang ini',
+'action-rollback' => 'hidaling ipagbalik an mga pagliwat kan huring paragamit na pinagliwat an sarong partikular na pahina',
+'action-import' => 'importaron ining pahina gikan sa ibang wiki',
+'action-importupload' => 'importaron ining pahina gikan sa sarong ikinargang sagunson',
+'action-patrol' => 'markahan an pagliwat kan iba bilang patrolyado',
+'action-autopatrol' => 'Giboha na an saimong pagliwat markado bilang patrolyado',
+'action-unwatchedpages' => 'tanawon an listahan kan mayong bantay na mga pahina',
+'action-mergehistory' => 'Pagkasararoon an historiya kaining pahina',
+'action-userrights' => 'liwaton gabos na mga karapatan nin paragamit',
+'action-userrights-interwiki' => 'liwaton an paragamit na mga karapatan kan mga paragamit nin ibang wikis',
+'action-siteadmin' => 'ikandado o dae ikandado an datos-sarayan',
+'action-sendemail' => 'magpadara nin mga e-koreo',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|pagbabâgo|mga pagbabâgo}}',
 'recentchanges' => 'Mga nakakaági pa sanáng pagbabàgo',
+'recentchanges-legend' => 'Pinakahuring mga option kan mga pagbabago',
 'recentchanges-summary' => 'Hanapon an mga pinahuring pagbabâgo sa wiki digdi sa páhinang ini.',
 'recentchanges-feed-description' => 'Hanápon an mga pinakahuring pagbabàgo sa wiki sa hungit na ini.',
-'rcnote' => "Mahihiling sa babâ an {{PLURAL:$1| '''1''' pagbabàgo|'''$1''' pagbabàgo}} sa huring {{PLURAL:$2|na aldaw|'''$2''' na aldaw}}, sa $3.",
+'recentchanges-label-newpage' => 'Ining pagliwat nakapagmukna nin sarong baguhon na pahina',
+'recentchanges-label-minor' => 'Ini saro sanang menor na pagliwat',
+'recentchanges-label-bot' => 'Ining pagliwat pinaghimo bilang sarong bot',
+'recentchanges-label-unpatrolled' => 'Ining pagliwat dae pa tabi pinagpatrolyahan',
+'rcnote' => "Yaon sa ibaba iyo {{PLURAL:$1|an '''1''' pagbabago|an mga huring '''$1''' mga pagbabago}} kan nakaaging huring {{PLURAL:$2|aldaw|'''$2''' mga aldaw}}, poon pa kan $5, $4.",
 'rcnotefrom' => "Mahihiling sa babâ an mga pagbabàgo poon kan '''$2''' (hasta '''$1''' ipinapahiling).",
 'rclistfrom' => 'Ipahilíng an mga pagbabàgo poon sa $1',
 'rcshowhideminor' => '$1 saradit na pagligwat',
@@ -892,10 +1462,14 @@ An ibang mga administrador sa ining wiki pwede pang maghiling kan mga nakatagong
 'minoreditletter' => 's',
 'newpageletter' => 'B',
 'boteditletter' => 'b',
-'number_of_watching_users_pageview' => '[$1 nagbabantay na parágamit]',
+'number_of_watching_users_pageview' => '[$1 naka-antabay sa {{PLURAL:$1|paragamit|mga paragamit}}]',
 'rc_categories' => 'Limitado sa mga kategorya (suhayon nin "|")',
 'rc_categories_any' => 'Dawà arín',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} pagtatapos kan pagbabago',
 'newsectionsummary' => '/* $1 */ bàgong seksyon',
+'rc-enhanced-expand' => 'Magpahiling kan mga detalye (minakaipo nin JavaScript)',
+'rc-enhanced-hide' => 'Itago an mga detalye',
+'rc-old-title' => 'orihinal na pinagmukna bilang "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Mga angay na pagbabàgo',
@@ -903,77 +1477,235 @@ An ibang mga administrador sa ining wiki pwede pang maghiling kan mga nakatagong
 'recentchangeslinked-toolbox' => 'Mga angay na pagbabàgo',
 'recentchangeslinked-title' => 'Mga pagbabàgong angay sa "$1"',
 'recentchangeslinked-noresult' => 'Warang mga pagbabago sa mga pahinang nakatakod sa itinaong pagkalawig.',
-'recentchangeslinked-summary' => "Ini an lista nin mga pagsangli na ginibo pa sana sa mga pahinang nakatakod halì sa sarong espesyal na pahina (o sa mga myembro nin sarong espesyal na kategorya).
-'''Maitom''' an mga pahinang [[Special:Pigbabantayan|pigbabantayan mo]].",
+'recentchangeslinked-summary' => "Ini an listahan kan mga pagbabagong ginibo kan dae pa sana nahaloy sa mga pahina na nakatakod gikan sa sarong pinagsambit na pahina (o sa mga miyembro kan sarong pinagsambit na kategorya).
+An mga pahina na yaon sa [[Special:Watchlist|saimong Bantay-listahan]] na '''tekstong mahibog'''.",
+'recentchangeslinked-page' => 'Pahinang ngaran:',
+'recentchangeslinked-to' => 'Ipahiling an mga pagbabago sa mga pahina na nakatakod sa pinagtaong pahina lugod',
 
 # Upload
 'upload' => 'Isàngat an file',
 'uploadbtn' => 'Ikargá an file',
-'reuploaddesc' => 'Magbalik sa pormulario kan pagkarga.',
+'reuploaddesc' => 'Ikansela an pagkarga asin magbalik sa porma kan pagkakarga',
+'upload-tryagain' => 'Isumite an modipikadong deskripsyon kan sagunson',
 'uploadnologin' => 'Dai nakalaog',
 'uploadnologintext' => "Kaipuhan ika si [[Special:UserLogin|nakadagos]]
 para makakarga nin mga ''file''.",
+'upload_directory_missing' => 'An direktoriyo nin pagkarga ($1) nawawara tabi asin dae maikapagmukna sa paagi kan webserver.',
 'upload_directory_read_only' => 'An directoriong pagkarga na ($1) dai puedeng suratan kan serbidor nin web.',
 'uploaderror' => 'Salâ an pagkarga',
-'uploadtext' => "Gamiton tabî an pormulario sa babâ para magkarga nin mga ''file'', para maghiling o maghanap kan mga ladawan na dating kinarga magduman tabi sa [[Special:FileList|lista nin mga pigkargang ''file'']], an mga kinarga asin mga pinarâ nakalista man sa [[Special:Log/upload|historial nin pagkarga]].
-
-Kun boot mong ikaag an ladawan sa páhina, gamiton tabî an takod arog kan
-'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''',
-'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|alt text]]</nowiki>''' o
-'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>''' para sa direktong pagtakod sa ''file''.",
+'upload-recreate-warning' => "'''Patanid tabi: An sagunson sa pangaran kaini pinagpura o pinagbalyo na tabi.'''
+
+An talaan kan pagkapura asin pagkabalyo para sa pahinang ini yaon digde para sa saimong konbenyensiya:",
+'uploadtext' => "Gamita an porma sa ibaba tanganing makapagkarga nin mga sagunson.
+Para hilngon o hanapon an dati nang pinagkargang mga sagunson, magduman tabi sa [[Special:FileList|listahan kan pinagkargang mga sagunson]], mga pagkarga asin pagkarga otro pinagtala man sa [[Special:Log/upload|talaan nin pagkakarga]], mga pinagpura na yaon sa [[Special:Log/delete|talaan nin pagkapura]].
+
+Sa pagbali nin sarong sagunson sa sarong pahina, gamita tabi an takod kan saro sa mga minasunod na mga porma:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' sa paggamit kan bilog na bersyon kan sagunson
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' sa paggamit kan 200 pixel na lawig kan pagkakua sa sarong kahon na yaon sa parteng wala nin gaygayan na yaon an 'alt text' bilang deskripsyon
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para sa direktang nakakatakod sa sagunson na dae pinagpapahiling na sarong sagunson",
+'upload-permitted' => 'Pinagtutugutang mga tipo nin sagunson: $1',
+'upload-preferred' => 'Pinagpapaurog na mga tipo nin sagunson: $1',
+'upload-prohibited' => 'Pinagbabawal na mga tipo nin sagunson: $1.',
 'uploadlog' => 'historial nin pagkarga',
 'uploadlogpage' => 'Ikarga an usip',
-'uploadlogpagetext' => "Mahihiling sa babâ an lista kan mga pinakahuring ''file'' na kinarga.",
+'uploadlogpagetext' => 'Yaon sa ibaba an sarong listahan kan dae pa sanang nahahaloy na pinagkargang mga sagunson.
+Hilngon tabi an [[Special:NewFiles|galleriya kan mga bagong sagunson]] para sa mas biswal na lantawon.',
 'filename' => 'Pangaran kan dokumento',
 'filedesc' => 'Kagabsan',
 'fileuploadsummary' => 'Kagabsan:',
-'filestatus' => 'Estatutong derechos nin paragamit:',
-'filesource' => 'Ginikanan',
+'filereuploadsummary' => 'Mga pagbabago kan sagunson:',
+'filestatus' => 'Kamugtakan sa karapatan nin panurat:',
+'filesource' => 'Gikanan:',
 'uploadedfiles' => "Mga ''file'' na ikinargá",
 'ignorewarning' => 'Dai pagintiendehon an mga patanid asin itagama pa man an file',
 'ignorewarnings' => 'Paliman-limanon an mga tanid',
 'minlength1' => "An pangaran kan mga ''file'' dapat na dai mababâ sa sarong letra.",
 'illegalfilename' => "An ''filename'' na \"\$1\" igwang mga ''character'' na dai pwede sa mga titulo nin páhina. Tâwan tabî nin bâgong pangaran an ''file'' asin probaran na ikarga giraray.",
+'filename-toolong' => 'Mga pangaran nin sagunson dae dapat maglawig na sobra sa 240 bytes.',
 'badfilename' => "Rinibayan an ''filename'' nin \"\$1\".",
+'filetype-mime-mismatch' => 'An ekstensyon kan sagunson na ".$1" bakong langkap sa detektadong tipo kan MIME nin sagunson ($2).',
 'filetype-badmime' => "Dai pigtotogotan na ikarga an mga ''file'' na MIME na \"\$1\" tipo.",
+'filetype-bad-ie-mime' => 'Dae makakapagkarga kaining sagunson nin huli ta an Internet Explorer minamansay kaini bilang "$1", na bakong pinagtutugutan asin potensyal na delikadong tipo nin sagunson.',
+'filetype-unwanted-type' => "'''\".\$1\"''' bakong aprubadong tipo nin sagunson.
+Pinapaurog an {{PLURAL:\$3|tipo nin sagunson na|tipo nin sagunson an}} \$2.",
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|bakong tinutugutan na tipo nin sagunson|bakong tinutugutan na mga tipo nin mga sagunson}}.
+An pinagtutugutan na {{PLURAL:$3|tipo nin sagunson|mga tipo nin mga sagunson}} $2.',
 'filetype-missing' => "Mayong ekstensyón an ''file'' (arog kan \".jpg\").",
+'empty-file' => 'An sagunson na saimong pinagsumite blangko.',
+'file-too-large' => 'An sagunson na saimong pinagsumite grabe kadakula.',
+'filename-tooshort' => 'An ngaran kan sagunson grabe kahalipot.',
+'filetype-banned' => 'Ining tipo nin sagunson pinagbabawal.',
+'verification-error' => 'Ining sagunson dae nag-agi sa beripikasyon.',
+'hookaborted' => 'An modipikasyon na saimong pinagprubaran na gibohon pinag-untok bilang sarong ekstensyon.',
+'illegal-filename' => 'An ngaran kan sagunson dae pinagtutugot.',
+'overwrite' => 'An pagpatungan an sarong eksistidong sagunson dae pinagtutugot.',
+'unknown-error' => 'May dae aram na kasalaan an nangyari.',
+'tmp-create-error' => 'Dae makapagmukna nin temporaryong sagunson.',
+'tmp-write-error' => 'An kasalaan nagsusurat nin temporaryong sagunson.',
 'large-file' => "Pigrerekomendár na dapat an mga ''file'' bakong mas dakula sa $1; $2 an sokol kaining ''file''.",
 'largefileserver' => "Mas dakula an ''file'' sa pigtotogotan na sokol kan ''server''.",
 'emptyfile' => "Garo mayong laog an ''file'' na kinarga mo. Pwede ser na salâ ining tipo nin ''filename''. Isegurado tabî kun talagang boot mong ikarga ining ''file''.",
-'fileexists' => "Igwa nang ''file'' na may parehong pangaran sa ini, sosogon tabî an '''<tt>[[:$1]]</tt>''' kun dai ka seguradong ribayan ini.
+'windows-nonascii-filename' => 'Ining wiki dae tabi nagsusuporta kan mga pangaran kan sagunson na igwang espesyal na mga karakter.',
+'fileexists' => "Igwa nang ''file'' na may parehong pangaran sa ini, sosogon tabî an <strong>[[:$1]]</strong> kun dai ka seguradong ribayan ini.
 [[$1|thumb]]",
+'filepageexists' => 'An pahinang pandeskripsyon kaining sagunson pinagmukna na tabi sa <strong>[[:$1]]</strong>, alagad mayong sagunson na igwa kaining pangaran sa ngunyan nag-eeksister.
+An sumaryong na saimong ipinaglaog dae minaluwas sa pahina kan deskription.
+Tanganing gibohon na an saimong sumaryo magluwas duman, kaipohan mong manwal na pagliliwat kaini.
+[[$1|thumb]]',
 'fileexists-extension' => "May ''file'' na may parehong pangaran: [[$2|thumb]]
-* Pangaran kan pigkakargang ''file'': '''<tt>[[:$1]]</tt>'''
-* Pangaran kan yaon nang ''file'': '''<tt>[[:$2]]</tt>'''
+* Pangaran kan pigkakargang ''file'': <strong>[[:$1]]</strong>
+* Pangaran kan yaon nang ''file'': <strong>[[:$2]]</strong>
 Magpili tabî nin ibang pangaran.",
 'fileexists-thumbnail-yes' => "An ''file'' garo ladawan kan pinasadit ''(thumbnail)''. [[$1|thumb]]
-Sosogon tabî an ''file'' '''<tt>[[:$1]]</tt>'''.
+Sosogon tabî an ''file'' <strong>[[:$1]]</strong>.
 Kun an sinosog na ''file'' iyo an parehong ladawan na nasa dating sokol, dai na kaipuhan magkarga nin iba pang retratito.",
-'file-thumbnail-no' => "An ''filename'' nagpopoon sa '''<tt>$1</tt>'''. Garo ladawan na pinasadit ini ''(thumbnail)''.
-Kun igwa ka nin ladawan na may resolusyón na maximo ikarga tabî ini, kun dai, bâgohon tabî an pangaran nin ''file''.",
-'fileexists-forbidden' => "Igwa nang ''file'' na may parehong pangaran; bumalik tabi asin ikarga an ''file'' sa bâgong pangaran [[File:$1|thumb|center|$1]]",
-'fileexists-shared-forbidden' => "Igwa nang ''file'' na may parehong pangaran sa repositoryo nin mga bakas na ''file''; bumalik tabî asin ikarga an ''file'' sa bâgong pangaran. [[File:$1|thumb|center|$1]]",
+'file-thumbnail-no' => "An sagunson minapoon sa <strong>$1</strong>.
+Garo baga ini sarong imaheng pinasadit an sukol ''(thumbnail)''.
+Kun igwa ka kaining imahe sa kabilogang resolusyon ikarga ini, kun laen pakiribayi an ngaran kan sagunson.",
+'fileexists-forbidden' => 'May sagunson na sa arog kaining ngaran, asin dae puwedeng mapapatungan.
+Kun gusto mo pang ipagkarga an saimong sagunson, pakibalik lang asin gumamit nin bagong ngaran.
+[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'May sagunson na sa arog kaining ngaran sa repositoryo kan pinagheras na sagunson.
+Kun gusto mo pang ipagkarga an saimong sagunson, pakibalik lang asin gumamit nin bagong ngaran.
+[[File:$1|thumb|center|$1]]',
+'file-exists-duplicate' => 'An sagunson na ini sarong duplikado kan minasunod na {{PLURAL:$1|file|files}}:',
+'file-deleted-duplicate' => 'Sarong sagunson na kapareho kaini ([[:$1]]) na dati nang pinagpura.
+Kaipuhan mong aramon an historiya kan pagpura bago ka man magpadagos sa pagkarga kaini giraray.',
 'uploadwarning' => 'Patanid sa pagkarga',
+'uploadwarning-text' => 'Pakibaguha tabi an deskripsyon kan sagunson sa ibaba asin paki-otroha giraray.',
 'savefile' => "Itagama an ''file''",
 'uploadedimage' => 'Ikinarga "[[$1]]"',
 'overwroteimage' => 'kinarga an bagong bersión kan "[[$1]]"',
 'uploaddisabled' => 'Pigpopondó an mga pagkargá',
-'uploaddisabledtext' => "Pigpopogolan an pagkarga nin mga ''file'' o sa ining wiki.",
+'copyuploaddisabled' => 'An pagkarga sa paagi kan kilyawan pinagpondo.',
+'uploadfromurl-queued' => 'An saimong pagkarga pinagpahalat.',
+'uploaddisabledtext' => 'An pagkarga kan mga sagunson pinagpondo tabi.',
+'php-uploaddisabledtext' => 'An pagkarga kan mga sagunson pinagpundo nguna sa PHP.
+Pakihilnga man tabi an panuytuyan kan pagkarga nin mga sagunson.',
 'uploadscripted' => "Ining ''file'' igwang HTML o kodang eskritura na pwede ser na salang mainterpretar kan ''browser''.",
 'uploadvirus' => "May virus an ''file''! Mga detalye: $1",
-'sourcefilename' => 'Ginikanan kan pangaran kan dokumento',
-'destfilename' => "''Filename'' kan destinasyón",
-'watchthisupload' => 'Bantayan ining pahina',
+'uploadjava' => 'An sagunson yaon sa ZIP an porma na igwang Java .class na sagunson.
+Pagkakarga na mga Java an mga sagunson dae pinagtutugutan, nin huli ta sinda minakausa nin mga restriksyon sa seguridad na lagpason.',
+'upload-source' => 'Gikanang sagunson',
+'sourcefilename' => 'Ginikanan kan pangaran nin sagunson:',
+'sourceurl' => 'Ginikanan kan kilyawan:',
+'destfilename' => 'Destinasyon kan pangaran nin sagunson:',
+'upload-maxfilesize' => 'Pinakahalangkaw na kadakulaan nin sagunson: $1',
+'upload-description' => 'Deskripsyon kan Sagunson',
+'upload-options' => 'Pagpipilian kan pagkukupkop',
+'watchthisupload' => 'Bantayi ining sagunson',
 'filewasdeleted' => "May sarong ''file'' na kapangaran kaini na dating pigkarga tapos pigparâ man sana. Sosogon muna tabî an $1 bago ikarga giraray ini.",
 'filename-bad-prefix' => "An pangaran nin ''file'' na pigkakarga mo nagpopoon sa '''\"\$1\"''', sarong pangaran na dai makapaladawan na normalmente enseguidang pigtatao kan mga kamerang digital. Magpili tabî nin pangaran nin ''file'' na mas makapaladawan.",
 'upload-success-subj' => 'Nakarga na',
+'upload-success-msg' => 'An saimong pagkukupkop na gikan sa [$2] matrayumpo. Ini makukua digde: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Problema sa pangupkop',
+'upload-failure-msg' => 'Nagkaigwa nin problema sa saimong pagkukupkop gikan sa [$2]:
+
+$1',
+'upload-warning-subj' => 'Patanid tabi sa pagkukupkop',
+'upload-warning-msg' => 'Nagkaigwa nin problema sa saimong pagkukupkop gikan sa [$2]. Ika puwedeng magbalik sa [[Special:Upload/stash/$1|upload form]] tanganing korehiran ining problema.',
 
 'upload-proto-error' => 'Salang protocolo',
 'upload-proto-error-text' => 'An pagkargang panharayo kaipuhan nin mga URLs na nagpopoon sa  <code>http://</code> o <code>ftp://</code>.',
 'upload-file-error' => 'Panlaog na salâ',
-'upload-file-error-text' => "May panlaog na salâ kan pagprobar na maggibo nin temporaryong ''file'' sa ''server''.  Apodon tabî an administrador nin sistema.",
+'upload-file-error-text' => 'Sarong internal na kasalaan an nangyari kunsoarin na pinagprubaran na magmukna in sarong temporaryong sagunson sa tagapagsirbe. Pakikontak lang tabi nin sarong [[Special:ListUsers/sysop|administrador]].',
 'upload-misc-error' => 'Dai naaaram na error sa pagkarga',
-'upload-misc-error-text' => 'May salang panyayari na dai aram kan pagkarga.  Sosogon tabî kun tamâ an URL asin probaran giraray.  Kun an problema nagpeperseguir, apodon tabî an sarong administrador nin sistema.',
+'upload-misc-error-text' => 'Sarong dae maiwasan na kasalaan an nangyari kan ika nagkukupkop.
+Paki arama tabi na an kilyawan balido asin nagagamit asin pakiotro giraray.
+Kun an problema yaon pa, pakikontak tabi nin sarong [[Special:ListUsers/sysop|administrador]].',
+'upload-too-many-redirects' => 'An kilyawan nagkaigwa nin kadakol na mga kaliwatan',
+'upload-unknown-size' => 'Dae aram an kadakulaan',
+'upload-http-error' => 'Sarong HTTP na kasalaan an nangyari: $1',
+'upload-copy-upload-invalid-domain' => 'Pangungupkop nin kopya bakong puwede gikan sa kinasakupan kaini.',
+
+# File backend
+'backend-fail-stream' => 'Dae maipakupsit an sagunson $1.',
+'backend-fail-backup' => 'Dae makapagtago nin saro pang kopya an sagunson $1.',
+'backend-fail-notexists' => 'An sagunson na $1 bakong eksistido.',
+'backend-fail-hashes' => 'Dae nakakakua nin kaputol kan sagunson para ipagkumpara.',
+'backend-fail-notsame' => 'Bakong magkakaparehong sagunson yaon na po sa $1.',
+'backend-fail-invalidpath' => '$1 bakong balidong agihan sa pagsasaray.',
+'backend-fail-delete' => 'Dae makakapura kan sagunson $1.',
+'backend-fail-alreadyexists' => 'An sagunson $1 eksistido na po.',
+'backend-fail-store' => 'Dae makakapagsaray nin sagunson an $1 sa $2.',
+'backend-fail-copy' => 'Dae makakakopya nin sagunson $1 pasiring sa $2.',
+'backend-fail-move' => 'Dae makakabalyo nin sagunson $1 pasiring sa $2.',
+'backend-fail-opentemp' => 'Dae makakapagbukas nin temporaryong sagunson.',
+'backend-fail-writetemp' => 'Dae makakapagsurat sa temporaryong sagunson.',
+'backend-fail-closetemp' => 'Dae makakapagsarado nin temporaryong sagunson.',
+'backend-fail-read' => 'Dae makakabasa nin sagunson $1.',
+'backend-fail-create' => 'Dae makakapagsurat nin sagunson $1.',
+'backend-fail-maxsize' => 'Dae makakapagsuat nin sagunson $1 nin huli ta ini grabe kadakula nin {{PLURAL:$2|sarong byte|$2 bytes}}.',
+'backend-fail-readonly' => 'An sarayan na panampad "$1" yaon sa estado na basahon-sana. An rason na pinagtao iyo na: "\'\'$2\'\'"',
+'backend-fail-synced' => 'An sagunson "$1" yaon sa estado na bakong konsistido sa laog kan mga panampad na sarayan',
+'backend-fail-connect' => 'Dae nakakapagsugpon sa panampad na sarayan "$1".',
+'backend-fail-internal' => 'Sarong bakong bistadong kasalaan an nangyari sa panampad na sarayan "$1".',
+'backend-fail-contenttype' => 'Dae makapagdeterminar sa tipo kan laog kan sagunson na magsaray sa "$1".',
+'backend-fail-batchsize' => 'An panampad na sarayan pinagtao nin sarong batch kan sagunson sa $1 {{PLURAL:$1|operasyon|mga operasyon}}; an limit $2 {{PLURAL:$2|operasyon|mga operasyon}}.',
+'backend-fail-usable' => 'Dae makakapagsurat nin sagunson $1 sa dahilan na kulang an permiso o nawawara an mga direktoryo/kaaganan.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Dae makakasugpon sa datos-sarayan kan dyornal para sa panampad na sarayan "$1".',
+'filejournal-fail-dbquery' => 'Dae makakasumpay sa datos-sarayan kan dyornal para sa panampad na sarayan "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Dae makakabukas kan "$1"; dae po ini nakakandado.',
+'lockmanager-fail-closelock' => 'Dae makakasara sa nakakandadong sagunson para sa "$1".',
+'lockmanager-fail-deletelock' => 'Dae makakapura sa nakakandadong sagunson para sa "$1".',
+'lockmanager-fail-acquirelock' => 'Dae makakakua nin kandado para sa "$1".',
+'lockmanager-fail-openlock' => 'Dae makakabukas nin nakakandadong sagunson para sa "$1".',
+'lockmanager-fail-releaselock' => 'Dae makakabuhi sa kandado para sa "$1".',
+'lockmanager-fail-db-bucket' => 'Dae makakakontak awad-awad na kandado kan mga datos-sarayan na yaon sa tipunan na $1.',
+'lockmanager-fail-db-release' => 'Dae makakabuhi nin mga kandado sa datos-sarayan na $1.',
+'lockmanager-fail-svr-acquire' => 'Dae makakakua nin mga kandado sa serbidor na $1.',
+'lockmanager-fail-svr-release' => 'Dae makakabuhi nin mga kandado sa serbidor na $1.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'Sarong kasalaan an nanagboan kunsoarin binubuksan an sagunson para sa ZIP na binansayan.',
+'zip-wrong-format' => 'An sinambit na sagunson bakong yaon sa ZIP an porma.',
+'zip-bad' => 'An sagunson sarong korapto o baya dae nababasang ZIP na sagunson.
+Ini dae nababansayang gayo para sa seguridad.',
+'zip-unsupported' => 'An sagunson yaon sa porma nin ZIP na minagamit kan itsura nin ZIP na bakong suportado kan MediaWiki.
+Ini dae nababansayang gayo para sa seguridad.',
+
+# Special:UploadStash
+'uploadstash' => 'Ikarga an makantidad na tago',
+'uploadstash-summary' => 'An pahinang ini minatao nin agihan pasiring sa mga sagunson na ikinarga na (o baya yaon pa sa proseso nin pagkakarga) alagad dae pa naipublisa sa wiki. An mga sagunson na ini bakong hiling sa kiisay man kundi sa paragamit na nagkarga kan mga ini.',
+'uploadstash-clear' => 'Pinaglinigan na makantidad na mga sagunson',
+'uploadstash-nofiles' => 'Ika mayo nin mahalagang mga sagunson.',
+'uploadstash-badtoken' => 'An paggibo kan aksyon na yan bakong matrayumpo, baka nin huli ta an saimong kredensiyal sa pagliliwat nagpaso na.',
+'uploadstash-errclear' => 'An paglilinig kan mga sagunson bakong matrayumpo.',
+'uploadstash-refresh' => 'Papreskoha otro an listahan kan mga sagunson',
+'invalid-chunk-offset' => 'Imbalidong tagpas na pampahale',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'Paggamit dae pinagtugot',
+'img-auth-nopathinfo' => 'Nawawara an PATH_INFO.
+An saimong serbidor dae naipamugtak tanganing makapasa kaining impormasyon.
+Ini mapuwedeng yaon nakabase sa CGI asin dae makakasuporta sa img_auth.
+Hilnga an https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+'img-auth-notindir' => 'An hinahagad na agihan bakong naka-akma sa pankargang direktoryo.',
+'img-auth-badtitle' => 'Dae nakakapaggibo in sarong balidong titulog gikan sa "$1".',
+'img-auth-nologinnWL' => 'Dae ka nakalaog asin "$1" mayo sa aprubadong listahan.',
+'img-auth-nofile' => 'An sagunson "$1" bakong eksistido.',
+'img-auth-isdir' => 'Ika naghingohang makalaog sa direktoryo "$1".
+Makakalaog ka sana sa sagunson na tinugot.',
+'img-auth-streaming' => 'Nagsusughay na "$1".',
+'img-auth-public' => 'An punksyon kan img_autho.php iyo an magpaluwas nin mga sagunson gikan sa pribadong wiki.
+Ining wiki pinagbago bilang sarong pampublikong wiki.
+Para sa pinakamakusog na seguridad, img_auth.php nganay pinagpundo.',
+'img-auth-noread' => 'An paragamit mayo nin kakusgan na magbasa sa "$1".',
+'img-auth-bad-query-string' => 'An kilyawan igwa nin bakong imbalidong pasurunod na kahaputan.',
+
+# HTTP errors
+'http-invalid-url' => 'Imbalidong kilwayan: $1',
+'http-invalid-scheme' => 'Mga kilyawan na igwang "$1" eskima bako tabing suportado.',
+'http-request-error' => 'HTTP kahagadan nagpalya nin huli sa dae pa aram na kasalaan.',
+'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>
 'upload-curl-error6' => 'Dai naabot an URL',
@@ -981,47 +1713,73 @@ Kun igwa ka nin ladawan na may resolusyón na maximo ikarga tabî ini, kun dai,
 'upload-curl-error28' => 'sobra na an pagkalawig kan pagkarga',
 'upload-curl-error28-text' => 'Sobrang haloy an pagsimbag kan sitio. Susugon tabi na nagaandar an sitio, maghalat nin muna asin iprobar giraray. Tibaad moot mong magprobar sa panahon na bako masiadong okupado.',
 
-'license' => 'Paglilisensya',
-'license-header' => 'Paglilisensya',
+'license' => 'An Paglilisensya:',
+'license-header' => 'Paglisensiya',
 'nolicense' => 'Mayong pigpilî',
 'license-nopreview' => '(Mayong patânaw)',
 'upload_source_url' => ' (sarong tama, na bukas sa publikong URL)',
 'upload_source_file' => " (sarong ''file'' sa kompyuter mo)",
 
 # Special:ListFiles
+'listfiles-summary' => 'Ining espesyal na pahina nagpapahiling kan gabos na pinagkargang mga sagunson.
+Kunsoarin na pinagsara nin paragamit, an mga sagunson sana kun saen an pinagkarga nin paragamit na iyo an pinakahuring bersyon an ipagpapahiling.',
 'listfiles_search_for' => 'Hanápon an pangaran kan retrato:',
 'imgfile' => 'dokumento',
 'listfiles' => 'Lista kan dokumento',
+'listfiles_thumb' => 'Imaheng sadit',
 'listfiles_date' => 'Petsa',
 'listfiles_name' => 'Pangaran',
 'listfiles_user' => 'Parágamit',
 'listfiles_size' => 'Sukol',
 'listfiles_description' => 'Deskripsión',
+'listfiles_count' => 'Mga Bersyon',
 
 # File description page
 'file-anchor-link' => 'File',
 'filehist' => 'Uusipón nin file',
 'filehist-help' => 'Magpindot kan petsa/oras para mahiling an hitsura kan file sa piniling oras.',
 'filehist-deleteall' => 'parâon gabos',
-'filehist-deleteone' => 'parâon ini',
+'filehist-deleteone' => 'puraon',
 'filehist-revert' => 'ibalik',
 'filehist-current' => 'ngonyan',
 'filehist-datetime' => 'Petsa/Oras',
+'filehist-thumb' => 'Imaheng sadit',
+'filehist-thumbtext' => 'Imaheng sadit para sa bersyon kan nakaaging $1',
+'filehist-nothumb' => 'Mayo nin imaheng sadit',
 'filehist-user' => 'Paragamít',
 'filehist-dimensions' => 'Mga dimensyón',
 'filehist-filesize' => 'Sokol nin file',
 'filehist-comment' => 'Komento',
-'imagelinks' => 'Mga takód',
-'linkstoimage' => 'An mga minasunod na pahina nakatakod sa dokumentong ini:',
+'filehist-missing' => 'Nawawarang sagunson',
+'imagelinks' => 'Sagunsong naggagamit',
+'linkstoimage' => 'An minasunod na {{PLURAL:$1|mga takod nin pahina|$1 mga pahinang nakatakod}} kaining sagunson:',
+'linkstoimage-more' => 'Sobra sa $1 {{PLURAL:$1|mga takod nin pahina|$1 mga pahinang nakatakod}} kaining sagunson.
+An minasunod na lista nagpapahiling kan {{PLURAL:$1|enot na pahinang takod|enot na $1 pahinang nakatakod}} kaining sagunson sana.
+Sarong [[Special:WhatLinksHere/$2|bilog na lista]] an maantabayan.',
 'nolinkstoimage' => 'Mayong mga pahinang nakatakod sa dokumentong ini.',
-'sharedupload' => "Ining ''file'' sarong bakas na pagkarga asin pwede ser na gamiton kan ibang mga proyekto.",
+'morelinkstoimage' => 'Hilngon an [[Special:WhatLinksHere/$1|kadagdagang mga takod]] kaining sagunson.',
+'linkstoimage-redirect' => '$1 (sagunson na panukdong otro) $2',
+'duplicatesoffile' => 'An minasunod na {{PLURAL:$1|sagunson sarong duplikado|$1 mga sagunsong duplikado}} kaining sagunson ([[Special:FileDuplicateSearch/$2|kadagdagang mga detalye]]):',
+'sharedupload' => 'Ining sagunson naggikan sa $1 asin mapuwedeng gamiton kan ibang mga proyekto.',
+'sharedupload-desc-there' => 'Ining sagunson naggikan sa $1 asin mapuwedeng gamiton kan ibang mga proyekto.
+Pakihiling tabi sa [$2 sagunsong deskripsyon kan pahina] para sa mga kadagdagang impormasyon.',
+'sharedupload-desc-here' => 'Ining sagunson naggikan sa $1 asin mapuwedeng gamiton kan ibang mga proyekto.
+An deskripsyon na yaon sa [$2 sagunsong deskripsyon kan pahina] ipinapahiling tabi sa ibaba.',
+'sharedupload-desc-edit' => 'Ining sagunson naggikan sa $1 asin mapuwedeng gamiton kan ibang mga proyekto.
+Mapuwede gayod na magusto kang liwaton an deskripsyon na yaon sa [$2 sagunsong deskripsyon kan pahina] kaini.',
+'sharedupload-desc-create' => 'Ining sagunson naggikan sa $1 asin mapuwedeng gamiton kan ibang mga proyekto.
+Mapuwede gayod na ika magustong liwatong an deskripsyon na yaon sa [$2 sagunsong deskripsyon kan pahina] kaini.',
+'filepage-nofile' => 'Mayong sagunson sa arog kaining ngaran an yaon.',
+'filepage-nofile-link' => 'Mayong sagunson sa arog kaining ngaran an yaon, alagad ika puwedeng [$1 magkarga kaini].',
 'uploadnewversion-linktext' => 'Magkarga nin bàgong bersyon kaining file',
+'shared-repo-from' => 'gikan sa $1',
+'shared-repo' => 'sarong pinagheras na repositoryo',
 
 # File reversion
 'filerevert' => 'Ibalik an $1',
 'filerevert-legend' => 'Ibalik an dokumento',
 'filerevert-intro' => "Pigbabalik mo an '''[[Media:$1|$1]]''' sa [$4 version as of $3, $2].",
-'filerevert-comment' => 'Komento:',
+'filerevert-comment' => 'Rason:',
 'filerevert-defaultcomment' => 'Pigbalik sa bersyon sa ngonyan $2, $1',
 'filerevert-submit' => 'Ibalik',
 'filerevert-success' => "'''[[Media:$1|$1]]''' binalik sa [$4 version as of $3, $2].",
@@ -1030,18 +1788,26 @@ Kun igwa ka nin ladawan na may resolusyón na maximo ikarga tabî ini, kun dai,
 # File deletion
 'filedelete' => 'Parâon an $1',
 'filedelete-legend' => 'Parâon an dokumento',
-'filedelete-intro' => "Pigpaparâ mo an '''[[Media:$1|$1]]'''.",
+'filedelete-intro' => "Saimong pagpupuraon an sagunson '''[[Media:$1|$1]]''' kaiba an gabos kaining historiya.",
 'filedelete-intro-old' => "Pigpaparâ mo an bersyon kan '''[[Media:$1|$1]]''' sa ngonyan [$4 $3, $2].",
 'filedelete-comment' => 'Rason:',
 'filedelete-submit' => 'Parâon',
 'filedelete-success' => "An '''$1''' pinarâ na.",
-'filedelete-success-old' => '<span class="plainlinks">An bersyón kan \'\'\'[[Media:$1|$1]]\'\'\' na ngonyan na $3, pigparâ na an $2.</span>',
-'filedelete-nofile' => "Mayo man an '''$1''' sa ining sitio.",
+'filedelete-success-old' => "An bersyon kan '''[[Media:$1|$1]]''' magpoon kan $3, $2 pinagpura na tabi.",
+'filedelete-nofile' => "'''$1''' bakong eksistido.",
 'filedelete-nofile-old' => "Mayong bersyón na nakaarchibo kan '''$1''' na igwang kan mga piniling ''character''.",
+'filedelete-otherreason' => 'An iba pa/kadugangang rason:',
+'filedelete-reason-otherlist' => 'Ibang dahilan',
+'filedelete-reason-dropdown' => '*Kumon na mga rason nin pagpura
+** Copyright na paglapas
+** Duplikadong sagunson',
+'filedelete-edit-reasonlist' => 'Liwaton an mga rason nin pagpura',
+'filedelete-maintenance' => 'Pagpupura asin restorasyon nin mga sagunson temporaryong pinagpupundo sa panahon nin pagpapakarhay.',
+'filedelete-maintenance-title' => 'Dae makapagpura nin sagunson',
 
 # MIME search
 'mimesearch' => 'Paghanap kan MIME',
-'mimesearch-summary' => "An gamit kaining páhina sa pagsasarâ kan mga ''file'' segun sa mga tipo nin MIME. Input: contenttype/subtype, e.g. <tt>image/jpeg</tt>.",
+'mimesearch-summary' => "An gamit kaining páhina sa pagsasarâ kan mga ''file'' segun sa mga tipo nin MIME. Input: contenttype/subtype, e.g. <code>image/jpeg</code>.",
 'mimetype' => 'tipo nin MIME:',
 'download' => 'ideskarga',
 
@@ -1053,38 +1819,62 @@ Kun igwa ka nin ladawan na may resolusyón na maximo ikarga tabî ini, kun dai,
 
 # Unused templates
 'unusedtemplates' => 'Mga templatong dai ginamit',
-'unusedtemplatestext' => 'Piglilista kaining páhina an gabos na mga páhina sa templatong ngaran-espacio na dai nakakaag sa ibang páhina. Giromdomon tabî na sosogon an ibang mga takod sa mga templato bâgo parâon iyan.',
+'unusedtemplatestext' => 'Ining pahina minalista kan gabos na mga pahina sa {{ns:template}} ngarang-espasyo na bakong kabali sa ibang pahina.
+Giromdoma baya na mag-tsek para sa iba pang kasugpon sa mga templato bago mo pagpuraon sinda.',
 'unusedtemplateswlh' => 'ibang mga takod',
 
 # Random page
 'randompage' => 'Arín man na pahina',
-'randompage-nopages' => 'Mayong páhina an ngaran-espacio.',
+'randompage-nopages' => 'Dae tabi nin mga pahina sa minasunod na {{PLURAL:$2|espasyong-ngaran|mga espasyong-ngaran}}: $1.',
 
 # Random redirect
 'randomredirect' => 'Random na pagredirekta',
-'randomredirect-nopages' => 'Mayong paglikay (redirects) didgi sa ngaran-espacio.',
+'randomredirect-nopages' => 'Mayo nin panukdo-liwat sa espasyong-ngaran na "$1".',
 
 # Statistics
 'statistics' => 'Mga Estadistiko',
+'statistics-header-pages' => 'Estadistikong pahina',
+'statistics-header-edits' => 'Estadistiko nin pagliwat',
+'statistics-header-views' => 'Estadistiko nin pagmansay',
 'statistics-header-users' => 'Mga estadistiko nin parágamit',
+'statistics-header-hooks' => 'Iba pang estadistiko',
+'statistics-articles' => 'Laman na mga pahina',
+'statistics-pages' => 'Mga Pahina',
+'statistics-pages-desc' => 'Gabos na mga pahina sa laog kan wiki, kabali an pahina nin orolay, mga panukdo-liwat, ibp.',
+'statistics-files' => 'Pinagkargang mga sagunson',
+'statistics-edits' => 'Mga pagliwat sa pahina magpoon pa na an {{SITENAME}} pinagmukna.',
+'statistics-edits-average' => 'Katahaw kan mga pagliliwat sa kada pahina',
+'statistics-views-total' => 'Mga Kamansayan sa kabilogan',
+'statistics-views-total-desc' => 'Mga kamansayan sa dae pa eksistidong mga pahina asin espesyal na mga pahina bakong kabali',
+'statistics-views-peredit' => 'Mga kamansayan kada pagliwat',
+'statistics-users' => 'Rehistrado [[Special:ListUsers|users]]',
+'statistics-users-active' => 'Mga Aktibong Paragamit',
+'statistics-users-active-desc' => 'Mga paragamit na may ginibong aksyon sa nakaaging {{PLURAL:$1|aldaw|$1 mga aldaw}}',
 'statistics-mostpopular' => 'mga pinaka pighiling na pahina',
 
-'disambiguations' => 'Mga pahinang klaripikasyon',
+'disambiguations' => 'Mga pahinang minatulay pasiring sa pampalinaw na mga pahina',
 'disambiguationspage' => 'Template:clarip',
-'disambiguations-text' => "An mga nasunod na páhina nakatakod sa sarong '''páhina nin klaripikasyon'''.
-Imbis, kaipuhan na nakatakod sinda sa maninigong tema.<br />
-An páhina pigkokonsiderar na páhina nin klaripikasyon kun naggagamit ini nin templatong nakatakod sa [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "An mga minasunod na mga pahina igwang laog nin kisera sarong tulay pasiring sa '''pampalinaw na pahina'''.
+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]].",
 
 'doubleredirects' => 'Dobleng mga redirekta',
-'doubleredirectstext' => 'Piglilista kaining pahina an mga pahinang minalikay sa ibang pahinang paralikay. Kada raya may mga takod sa primero asin segundang likay, buda an destino kan segundong likay, na puro-pirme sarong "tunay " na pahinang destino, na dapat duman nakaturo an primerong likay.',
+'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.
+<del>Pinagpura</del> na mga entrada naresolberan na.',
+'double-redirect-fixed-move' => '[[$1]] pinagbalyo tabi.
+Ini ngunyan minatukdo-liwat pasiring sa [[$2]].',
+'double-redirect-fixed-maintenance' => 'Pinapakarhay na dobleng panukdo-liwat magpoon sa [[$1]] pasiring sa [[$2]].',
+'double-redirect-fixer' => 'Parapakarhay kan panukdo-liwat',
 
 'brokenredirects' => 'Putol na mga paglikay',
-'brokenredirectstext' => 'An nagsusunod naglilikay kan takod sa mga pahinang mayo man:',
+'brokenredirectstext' => 'An mga minasunod na panukdo-liwat nakasugpon pasiring sa busyaw na mga pahina:',
 'brokenredirects-edit' => 'hirahón',
 'brokenredirects-delete' => 'parâon',
 
 'withoutinterwiki' => 'Mga pahinang dai nin mga takod sa ibang tataramon',
 'withoutinterwiki-summary' => 'An mga nagsusunod na páhina dai nakatakód sa mga bersión na ibang tataramón:',
+'withoutinterwiki-legend' => 'Enotang panigmit',
 'withoutinterwiki-submit' => 'Ipahiling',
 
 'fewestrevisions' => 'Mga artikulong may pinakadikit na pagpakarháy',
@@ -1096,57 +1886,84 @@ An páhina pigkokonsiderar na páhina nin klaripikasyon kun naggagamit ini nin t
 'nmembers' => '$1 {{PLURAL:$1|myembro|mga myembro}}',
 'nrevisions' => '$1 {{PLURAL:$1|pagpakarhay|mga pagpakarhay}}',
 'nviews' => '$1 {{PLURAL:$1|hiling|mga hiling}}',
+'nimagelinks' => 'Ginamit sa $1 {{PLURAL:$1|pahina|mga pahina}}',
+'ntransclusions' => 'ginamit sa $1 {{PLURAL:$1|pahina|mga pahina}}',
 'specialpage-empty' => 'Mayong mga resulta para sa report na ini.',
 'lonelypages' => 'Mga solong pahina',
-'lonelypagestext' => 'An mga minasunod na mga páhina dai nakatakod sa ibang mga páhina sa wiki na ini.',
+'lonelypagestext' => 'An minasunod na mga pahina dae nakatakod gikan o balyong-kabali sa laog kan ibang mga phina nin {{SITENAME}}.',
 'uncategorizedpages' => 'Mga dai nakakategoryang páhina',
 'uncategorizedcategories' => 'Mga dai nakakategoryang kategorya',
-'uncategorizedimages' => 'Mga dai nakakategoryang retrato',
+'uncategorizedimages' => 'Mayong kategoryang mga sagunson',
 'uncategorizedtemplates' => 'Mga templatong mayong kategorya',
 'unusedcategories' => 'Dai gamit na mga kategorya',
 'unusedimages' => 'Mga dokumentong dai nagamit',
 'popularpages' => 'Mga popular na páhina',
 'wantedcategories' => 'Mga hinahanap na kategorya',
 'wantedpages' => 'Mga hinahanap na pahina',
+'wantedpages-badtitle' => 'Imbalidong titulo sa resultang kinaag: $1',
+'wantedfiles' => 'Kinakaipong mga sagunson',
+'wantedfiletext-cat' => 'An minasunod na mga sagunson ginagamit alagad bakong eksistido. Mga sagunson na gikan sa luwas kan mga repositoryo mapuwedeng listahon dawa bakong eksistido. An arinman na mga palsong positibo <del>paghahaleon sa agi nin linya</del>. Bilang kadagdagan, an mga pahina na minapadukot nin mga sagunson na bako man eksistido yaon nakalista sa [[:$1]].',
+'wantedfiletext-nocat' => 'An minasunod na mga sagunson ginagamit alagad bakong eksistido. Mga sagunson na gikan sa luwas kan mga repositoryo mapuwedeng listahon dawa eksistido na. An arinman na mga palsong positibo <del>paghahaleon sa agi nin linya</del>.',
+'wantedtemplates' => 'Kinakaipong mga templato',
 'mostlinked' => 'Pinakapigtatakodan na mga pahina',
 'mostlinkedcategories' => 'Pinakapigtatakodan na mga kategorya',
 'mostlinkedtemplates' => 'An mga pinakanatakodan na templato',
 'mostcategories' => 'Mga artikulong may pinaka dakol na kategorya',
-'mostimages' => 'Pinakapigtatakodan na files',
+'mostimages' => 'An pinakapakisugpunan na mga sagunson',
 'mostrevisions' => 'Mga artikulong may pinakadakol na pagpakarháy',
-'prefixindex' => 'Gabós na pahinang igwáng katakód',
+'prefixindex' => 'Gabos na mga pahina na igwa nin enotang panigmit',
+'prefixindex-namespace' => 'Gabos na mga pahina na igwa nin enotang panigmit ($1 espasyong ngaran)',
 'shortpages' => 'Haralìpot na pahina',
 'longpages' => 'Mga halabang pahina',
 'deadendpages' => 'Mga pahinang mayong luwasan',
-'deadendpagestext' => 'An mga nagsusunod na pahina dai nakatakod sa mga ibang pahina sa ining wiki.',
+'deadendpagestext' => 'An mga minasunod na mga phina dae nakatakod sa ibang mga pahina sa {{SITENAME}}.',
 'protectedpages' => 'Mga protektadong pahina',
+'protectedpages-indef' => 'Daeng sagkod na proteksyon sana',
+'protectedpages-cascade' => 'Mga pasurunod na proteksyon sana',
 'protectedpagestext' => 'An mga minasunod na pahina protektado na ibalyó o hirahón',
 'protectedpagesempty' => 'Mayong pang páhina an napoprotehiran kaining mga parametros.',
+'protectedtitles' => 'Protektadong mga titulo',
+'protectedtitlestext' => 'An minasunod na mga titulo pinagprotektaran magpoon na muknaon',
+'protectedtitlesempty' => 'Mayong mga titulo sa presente an protektado kaining mga parametro.',
 'listusers' => 'Lista nin paragamit',
+'listusers-editsonly' => 'Ipahiling sana an mga paragamit na igwang mga pinagliwat',
+'listusers-creationsort' => 'Salansanon sa paagi kan petsa nin pagmukna',
+'usereditcount' => '$1 {{PLURAL:$1|pigliwat|mga pigliwat}}',
+'usercreated' => '{{GENDER:$3|Minukna}} kan $1 sa $2',
 'newpages' => 'Mga bàgong pahina',
 'newpages-username' => 'Pangaran kan parágamit:',
 'ancientpages' => 'Mga pinakalumang pahina',
 'move' => 'Ibalyó',
 'movethispage' => 'Ibalyó ining pahina',
-'unusedimagestext' => "Giromdomon tabî na an mga ibang ''site'' pwedeng nakatakod sa ladawan na may direktong URL, pues pwede ser na nakalista pa digdi a pesar na ini piggagamit pa.",
+'unusedimagestext' => 'An minasunod na mga sagunson eksistido alagad dae nakadukot sa arinman na pahina.
+Pakigiromdom tabi na sa ibang websityo mapuwedeng nakatakod sa sarong sagunson na igwang direktang kilyawan, asin kaya mapuwedeng nakalista digde dawa ngani ini aktibong ginagamit.',
 'unusedcategoriestext' => 'Igwa ining mga pahinang kategoria maski mayo man na iba pang pahina o kategoria an naggagamit kaiyan.',
 'notargettitle' => 'Mayong target',
 'notargettext' => 'Dai ka pa nagpili nin pahina o paragamit na muya mong gibohon an accion na ini.',
+'nopagetitle' => 'Mayo kaiyang target na pahina',
+'nopagetext' => 'An target na pahina na saimong pinagsambit bako tabing eksistido.',
+'pager-newer-n' => '{{PLURAL:$1|baguhon 1|baguhon na $1}}',
+'pager-older-n' => '{{PLURAL:$1|luma na nin 1|luma na nin $1}}',
+'suppress' => 'Tagapagmansay',
+'querypage-disabled' => 'Ining espesyal na pahina pinagpundo nin huli sa kaggibohang mga rason.',
 
 # Book sources
 'booksources' => 'Ginikanang libro',
 'booksources-search-legend' => 'Maghanap nin mga ginikanang libro',
 'booksources-go' => 'Dumanán',
 'booksources-text' => "Mahihiling sa babâ an lista kan mga takod sa ibang ''site'' na nagbenbenta nin mga bâgo asin nagamit nang libro, asin pwede ser na igwa pang mga ibang impormasyon manonongod sa mga librong pighahanap mo:",
+'booksources-invalid-isbn' => 'An pinagtaong ISBN dae minaluwas na balido; paki-tsek tabi nin mga sala sa pagkopya gikan sa orihinal na piggikanan.',
 
 # Special:Log
-'specialloguserlabel' => 'Paragamit:',
-'speciallogtitlelabel' => 'Titulo:',
+'specialloguserlabel' => 'Paragibo:',
+'speciallogtitlelabel' => 'Target (titulo o paragamit):',
 'log' => 'Mga usip',
-'all-logs-page' => 'Gabos na usip',
-'alllogstext' => 'Sinalak na hihilngon kan gabos na historial na igwa sa {{SITENAME}}. Kun boot mong pasaditon an seleksyon magpili tabî nin klase kan historial, ngaran nin parágamit, o páhinang naapektaran.',
+'all-logs-page' => 'Gabos na pampublikong mga talaan',
+'alllogstext' => 'Kumbinadong pagpapahiling kan gabos na yaong mga talaan sa {{SITENAME}}.
+Saimong mapasadit an patanaw sa paagi nin pagpipili nin sarong tipo nin talaan, an ngaran nin paragamit (sensitibo sa pindutan), o an apektadong pahina (sensitibo sa pindutan man).',
 'logempty' => 'Mayong angay na bagay sa historial.',
 'log-title-wildcard' => 'Hanapon an mga titulong napopoon sa tekstong ini',
+'showhideselectedlogentries' => 'Ipahiling/itago an pinagpiling mga entrada sa talaan',
 
 # Special:AllPages
 'allpages' => 'Gabos na pahina',
@@ -1154,6 +1971,7 @@ An páhina pigkokonsiderar na páhina nin klaripikasyon kun naggagamit ini nin t
 'nextpage' => 'Sunod na pahina ($1)',
 'prevpage' => 'Nakaaging pahina ($1)',
 'allpagesfrom' => 'Ipahiling an mga páhina poon sa:',
+'allpagesto' => 'Ipahiling an mga pahina na may tapos na:',
 'allarticles' => 'Gabos na mga artikulo',
 'allinnamespace' => 'Gabos na mga páhina ($1 ngaran-espacio)',
 'allnotinnamespace' => 'Gabos na mga páhina (na wara sa $1 ngaran-espacio)',
@@ -1163,31 +1981,75 @@ An páhina pigkokonsiderar na páhina nin klaripikasyon kun naggagamit ini nin t
 'allpagesprefix' => 'Ipahiling an mga pahinang may prefiho:',
 'allpagesbadtitle' => "Dai pwede an tinaong titulo kan páhina o may prefihong para sa ibang tataramon o ibang wiki. Pwede ser na igwa ining sarô o iba pang mga ''character'' na dai pwedeng gamiton sa mga titulo.",
 'allpages-bad-ns' => 'An {{SITENAME}} mayo man na ngaran-espacio na "$1".',
+'allpages-hide-redirects' => 'Itago an mga panukdong otro',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Ika nakahiling sa sarong pinagsaray na bersyon kaining pahina, na puwedeng minaabot na sa $1 nang haloy.',
+'cachedspecial-viewing-cached-ts' => 'Ika nakahiling sa sarong pinagsaray na bersyon kaining pahina, na mapuwedeng bakong aktuwal na kumpleto talaga.',
+'cachedspecial-refresh-now' => 'Hilngon an pinakahuri.',
 
 # Special:Categories
 'categories' => 'Mga Kategorya',
-'categoriespagetext' => 'Igwa nin laog ang mga minasunod na kategorya.
-[[Special:UnusedCategories|Unused categories]] are not shown here.
-Also see [[Special:WantedCategories|wanted categories]].',
+'categoriespagetext' => 'An minasunod {{PLURAL:$1|kategorya na may laog na|mga kategorya na may laog na}} mga pahina o midya.
+[[Special:UnusedCategories|Dae ginamit na mga kategorya]] dae ipinapahiling digde.
+Asin man hilnga an [[Special:WantedCategories|kinakaipong mga kategorya]].',
+'categoriesfrom' => 'Pahilnga an mga kategorya magpoon sa:',
+'special-categories-sort-count' => 'salansana sa paagi nin bilang',
+'special-categories-sort-abc' => 'salansana sa paagi nin alpabetiko',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'Parâon an mga kontribusyon kan parágamit',
 'deletedcontributions-title' => 'Parâon an mga kontribusyon kan parágamit',
+'sp-deletedcontributions-contribs' => 'mga kontribusyon',
 
 # Special:LinkSearch
-'linksearch' => 'Mga panluwas na takod',
+'linksearch' => 'Panluwas na mga takod sa paghahanap',
+'linksearch-pat' => 'Pangarugan sa paghahanap:',
+'linksearch-ns' => 'Espasyong-ngaran:',
 'linksearch-ok' => 'Hanápon',
+'linksearch-text' => 'Mga pantsambang baraha arog baka kan "*.wikipedia.org" mapuwedeng gamiton.
+Minakaipo kisera sarong halangkaw na mugtak nin kinasakupan, halimbawa "*.org".<br />
+Suportadong mga panundan: <code>$1</code> (dae magdagdag arinman kaini sa saimong paghahanap).',
 'linksearch-line' => '$1 an nakatakod sa $2',
+'linksearch-error' => 'Mga pantsambang baraha mapuwedeng magluwas sana sa poon kan hostname.',
 
 # Special:ListUsers
 'listusersfrom' => 'Ipahiling an mga paragamit poon sa:',
 'listusers-submit' => 'Ipahiling',
 'listusers-noresult' => 'Mayong nakuang parágamit.',
+'listusers-blocked' => '(pinagbarado)',
+
+# 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-from' => 'Ipahiling an mga paragamit magpoon sa:',
+'activeusers-hidebots' => 'Itago an mga panalnga',
+'activeusers-hidesysops' => 'Itago an mga administrador',
+'activeusers-noresult' => 'Mayong mga paragamit na nanagboan.',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Paragamit na talaan nin pagmukna',
+'newuserlogpagetext' => 'Ini an talaan kan mga pagmukna nin paragamit.',
 
 # Special:ListGroupRights
+'listgrouprights' => 'Mga karapatan kan grupo nin paragamit',
+'listgrouprights-summary' => 'An minasunod iyo an listahan kan mga grupo nin paragamit na pinaghunsay kaining wiki, kaiba an saindang asosyadong mga karapatan nin paggamit.
+Puwedeng magkakaigwa nin [[{{MediaWiki:Listgrouprights-helppage}}|kadagdagang impormasyon]] mapanungod sa indibidwal na mga karapatan.',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">Pinagbanhag na Karapatan</span>
+* <span class="listgrouprights-revoked">Pinagbawi na Karapatan</span>',
 'listgrouprights-group' => 'Grupo',
 'listgrouprights-rights' => 'Derechos',
+'listgrouprights-helppage' => 'Help:Pangrupong mga karapatan',
 'listgrouprights-members' => '(lista kan mga kaapíl)',
+'listgrouprights-addgroup' => 'Dagdag {{PLURAL:$2|grupo|mga grupo}}: $1',
+'listgrouprights-removegroup' => 'Halia an {{PLURAL:$2|grupo|mga grupo}}: $1',
+'listgrouprights-addgroup-all' => 'Idagdag an gabos na mga grupo',
+'listgrouprights-removegroup-all' => 'Haleon an gabos na mga grupo',
+'listgrouprights-addgroup-self' => 'Dagdag {{PLURAL:$2|grupo|mga grupo}} tanganing magkaigwa nin panindog: $1',
+'listgrouprights-removegroup-self' => 'Halia {{PLURAL:$2|grupo|mga grupo}} gikan sa sadireng panindog: $1',
+'listgrouprights-addgroup-self-all' => 'Idagdag an gabos na mga grupo tanganing magkaigwa nin sadireng panindog',
+'listgrouprights-removegroup-self-all' => 'Halion an gabos na mga grupo gikan sa sadireng panindog',
 
 # E-mail user
 'mailnologin' => 'Mayong direksyón nin destino',
@@ -1196,55 +2058,74 @@ asin may marhay na ''e''-surat sa saimong [[Special:Preferences|Mga kabôtan]]
 para makapadara nin ''e''-surat sa ibang parágamit.",
 'emailuser' => 'E-koreohan ining paragamit',
 'emailpage' => 'E-suratan an parágamit',
-'emailpagetext' => "Kun ining páragamit nagkaag nin marhay ''e''-surat sa saiyang mga kabôtan, an pormulario sa babâ mapadara nin sarong mensahe.
-An kinaag mong ''e''-surat sa saimong mga kabôtan nin paragamit mahihiling bilang na \"Hali ki\" kan ''e''-surat, para an recipiente pwedeng makasimbag.",
+'emailpagetext' => 'Ika makakagamit kan porma na yaon sa ibaba tanganing magpadara nin e-surat na mensahe sa paragamit na ini.
+An e-surat na adres na saimong ilalaog sa [[Special:Preferences|saimong paragamit kagustuhan]] magluluwas bilang iyo an "Gikan ki" adres kan e-surat, kaya an sinuratan makakapagsimbag direkta mismo saimo.',
 'usermailererror' => 'Error manonongod sa korreong binalik:',
-'defemailsubject' => '{{SITENAME}} e-surat',
+'defemailsubject' => '{{SITENAME}} e-surat gikan sa paragamit "$1"',
+'usermaildisabled' => 'Paragamit na e-surat pinagpundo',
+'usermaildisabledtext' => 'Ika dae makakapagpadara nin e-surat sa ibang mga paragamit kaining wiki',
 'noemailtitle' => "Mayô nin ''e''-surat",
-'noemailtext' => 'Dai nagpili nin tama na direccion nin e-surat an paragamit,
-o habo magresibo nin e-surat sa ibang paragamit.',
-'emailfrom' => 'Poon',
+'noemailtext' => 'Ining paragamit dae nagkaag nin sarong balidong e-surat na adres.',
+'nowikiemailtitle' => 'Mayong e-surat na pinagtutugutan',
+'nowikiemailtext' => 'Ining paragamit nagpili na mayong mareresibeng e-surat gikan sa ibang mga paragamit.',
+'emailnotarget' => 'Bakong eksistido o imbalido an ngaran nin paragamit para sa sinuratan.',
+'emailtarget' => 'Paki-entra an ngaran kan paragamit na sinuratan',
+'emailusername' => 'Ngaran nin Paragamit:',
+'emailusernamesubmit' => 'Isumite',
+'email-legend' => 'Magpadara nin sarong e-surat sa ibang {{SITENAME}} na paragamit',
+'emailfrom' => 'Gikan ki:',
 'emailto' => 'Hasta:',
-'emailsubject' => 'Tema',
-'emailmessage' => 'Mensahe',
+'emailsubject' => 'Subheto:',
+'emailmessage' => 'Mensahe:',
 'emailsend' => 'Ipadara',
 'emailccme' => 'E-suratan ako nin kopya kan mga mensahe ko.',
 'emailccsubject' => 'Kopya kan saimong mensahe sa $1: $2',
 'emailsent' => 'Naipadará na an e-surat',
 'emailsenttext' => 'Naipadará na su e-surat mo.',
+'emailuserfooter' => 'Ining e-surat ipinadara sa paagi nin $1 pasiring ki $2 kan "E-surat na paragamit" na punksyon kan {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Magwawalat nin pansistemang mensahe.',
+'usermessage-editor' => 'Pansistemang mensahero',
 
 # Watchlist
 'watchlist' => 'Pigbabantayan ko',
 'mywatchlist' => 'Babantáyan ko',
+'watchlistfor2' => 'Para ki $1 $2',
 'nowatchlist' => 'Mayo ka man na mga bagay saimong lista nin pigbabantayan.',
 'watchlistanontext' => 'Mag $1 tabi para mahiling o maghira nin mga bagay saimong lista nin mga pigbabantayan.',
 'watchnologin' => 'Mayô sa laog',
 'watchnologintext' => 'Dapat ika si [[Special:UserLogin|nakalaog]] para puede kang magribay kan saimong lista nin mga pigbabantayán.',
+'addwatch' => 'Idagdag sa bantay-listahan',
 'addedwatchtext' => "Ining pahina \"[[:\$1]]\" dinugang sa saimong mga [[Special:Watchlist|Pigbabantayan]].
 An mga pagbabâgo sa páhinang ini asin sa mga páhinang olay na kapadis kaini ililista digdi,
 asin an páhina isusurat nin '''mahîbog''' sa [[Special:RecentChanges|lista nin mga kaaagi pa sanang pagbabâgo]] para madalî ining mahiling.
 
 Kun boot mong halîon an páhina sa pigbabantayan mo sa maabot na panahon, pindoton an \"Pabayaan\" ''side bar''.",
-'removedwatchtext' => 'An pahinang "[[:$1]]" pigtanggal sa saimong pigbabantayan.',
+'removewatch' => 'Halion gikan sa bantay-listahan',
+'removedwatchtext' => 'An pahina "[[:$1]]" pinaghale gikan sa [[Special:Watchlist|saimong bantay-listahan]].',
 'watch' => 'Bantayán',
 'watchthispage' => 'Bantayan ining pahina',
 'unwatch' => 'Dai pagbantayan',
 'unwatchthispage' => 'Pondohon an pagbantay',
 'notanarticle' => 'Bakong páhina nin laog',
+'notvisiblerev' => 'An huring rebisyon kan ibang paragamit pinagpura na',
 'watchnochange' => 'Mayo sa saimong mga pigbabantayan an nahira sa laog nin pinahiling na pagkalawig.',
-'watchlist-details' => '{{PLURAL:$1|$1 pahina|$1 mga pahina}} sa babantáyan mo an daí kabáli an mga olay na pahina.',
+'watchlist-details' => '{{PLURAL:$1|$1 pahina|$1 mga pahina}} sa saimong bantay-listahan, dae binibilang an mga pahina nin orolayan.',
 'wlheader-enotif' => "* Nakaandar an paising ''e''-surat.",
 'wlheader-showupdated' => "* An mga páhinang pigbâgo poon kan huri mong bisita nakasurat nin '''mahîbog'''",
 'watchmethod-recent' => 'Pigsososog an mga kaaagi pa sanang hirá sa mga pigbabantayan na páhina',
 'watchmethod-list' => 'Pigsososog an mga pigbabantayan na páhina para mahiling an mga kaaagi pa sanan paghirá',
 'watchlistcontains' => 'An saimong lista nin pigbabantayan igwang $1 na {{PLURAL:$1|páhina|mga páhina}}.',
 'iteminvalidname' => "May problema sa bagay na '$1', salâ an pangaran...",
-'wlnote' => "Mahihiling sa babâ an {{PLURAL:$1|huring pagriribay|mga huring'''$1''' pagriribay}} sa ultimong {{PLURAL:$2|oras|'''$2''' mga oras}}.",
+'wlnote' => "Sa ibaba an {{PLURAL:$1|huring pagbabago|mga huring '''$1''' pagbabago}} sa nakaaging {{PLURAL:$2|oras|'''$2''' mga oras}}, magpoon pa kan $3, $4.",
 'wlshowlast' => 'Ipahilíng an ultimong $1 na oras $2 na aldaw $3',
+'watchlist-options' => 'Bantay-listahan na mga pagpipilian',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Pigbabantayan...',
 'unwatching' => 'Dai pigbabantayan...',
+'watcherrortext' => 'Sarong kasalaan an nangyari habang binabago an saimong bantay-listahan na panuytoy para sa "$1".',
 
 'enotif_mailer' => '{{SITENAME}} Kartero nin isi',
 'enotif_reset' => 'Markahan an gabos na mga binisitang pahina',
@@ -1256,28 +2137,34 @@ Kun boot mong halîon an páhina sa pigbabantayan mo sa maabot na panahon, pindo
 'enotif_lastvisited' => 'Hilingón an $1 para sa gabos na mga pagbâgo poon kan huring bisita.',
 'enotif_lastdiff' => 'Hilingón an $1 tangarig mahiling an pagbâgong ini.',
 'enotif_anon_editor' => 'dai bistong parágamit $1',
-'enotif_body' => 'Namómòtan na $WATCHINGUSERNAME,
-
+'enotif_body' => 'Namomotang $WATCHINGUSERNAME,
 
-An páhinang {{SITENAME}} na $PAGETITLE binâgo $CHANGEDORCREATED sa $PAGEEDITDATE ni $PAGEEDITOR, hilingón an $PAGETITLE_URL para sa presenteng bersyón.
+An {{SITENAME}} pahina $PAGETITLE pinagmukna $CHANGEDORCREATED kan $PAGEEDITDATE ni $PAGEEDITOR, hilngon sa $PAGETITLE_URL para sa presenteng rebisyon.
 
 $NEWPAGE
 
-Sumáda kan editor: $PAGESUMMARY $PAGEMINOREDIT
+Sumaryo kan paraliwat: $PAGESUMMARY $PAGEMINOREDIT
 
-Apodon an editor:
-\'\'e\'\'-surat: $PAGEEDITOR_EMAIL
+Kontaka an paraliwat:
+e-surat: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Mayô nang iba pang paisi na ipapadara dapit sa iba pang mga pagbabâgo kun dai mo bibisitahon giraray ining páhina. Pwede mo man na ipwesto giraray an mga patanid para sa saimong mga páhinang pigbabantayan duman sa saimong lista nin pigbabantayan.
+Dae na magkakaigwa pa nin ibang pagpapaisi sa kaso na may kadagdagan pang mga pagbabago laen lang kun ika magbisita sa pahinang ini.
+Ika mapuwede man na makapagbago kan bandera nin pagpapaisi para sa gabos mong pinagbabantayan na mga pahina na yaon sa saimong bantay-listahan.
 
-             An maboot na sistema nin paisi kan {{SITENAME}}
+An saimong mainamigong {{SITENAME}} sistema nin pagpapaisi
 
 --
-Para bâgohon an pagpwesto kan saimong mga pigbabantayan, bisitahon an
+Sa pagbabago kan saimong e-surat na pagpapaising panuytoy, magbisita sa
+{{canonicalurl:{{#special:Mga Kagustuhan}}}}
+
+Sa pagbabago kan saimong bantay-listahang panuytoy, magbisita sa
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Komentaryo asin iba pang tabang:
+Sa pagpura ka pahina gikan sa saimong bantay-listahan, magbisita sa
+$UNWATCHURL
+
+Balik-simbag asin kadagdagang asistensiya:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -1287,12 +2174,14 @@ Komentaryo asin iba pang tabang:
 'excontentauthor' => "ini an dating laog: '$1' (asin an unikong kontribuidor si '[[Special:Contributions/$2|$2]]')",
 'exbeforeblank' => "Ini an dating laog bagô blinankohán: '$1'",
 'exblank' => 'mayong laog an páhina',
+'delete-confirm' => 'Puraon "$1"',
 'delete-legend' => 'Paraon',
-'historywarning' => 'Patanid: An pahinang paparaon mo igwa nin uusipón:',
+'historywarning' => "'''Patanid tabi:''' An pahina na saimong pagpupuraon may historiya na igwa nin haros $1 {{PLURAL:$1|rebisyon|mga rebisyon}}:",
 'confirmdeletetext' => 'Paparaon mo sa base nin datos ining pahina kasabay an gabos na mga uusipón kaini.
 Konpirmaron tabì na talagang boot mong gibohon ini, nasasabotan mo an mga resulta, asin an piggigibo mo ini konporme sa
 [[{{MediaWiki:Policy-url}}]].',
 'actioncomplete' => 'Nagibo na',
+'actionfailed' => 'An aksyon nagpalya',
 'deletedtext' => 'Pigparà na an "$1" .
 Hilingón tabì an $2 para mahiling an lista nin mga kaaagi pa sanang pagparà.',
 'dellogpage' => 'Usip nin pagparà',
@@ -1302,39 +2191,58 @@ Hilingón tabì an $2 para mahiling an lista nin mga kaaagi pa sanang pagparà.'
 'deletecomment' => 'Rason:',
 'deleteotherreason' => 'Iba/dugang na rason:',
 'deletereasonotherlist' => 'Ibang rason',
+'deletereason-dropdown' => '*Pirmehang rason nin pagpupura
+** Kahagadan nin Awtor/Parasurat
+** Kalapasan sa Copyright
+** Bandalismo',
+'delete-edit-reasonlist' => 'Pagliwat kan mga rason nin pagpupura',
+'delete-toobig' => 'Ining pahina igwa nin dakulaong historiya sa pagliwat, minasobrang $1 {{PLURAL:$1|rebisyon|mga rebisyon}}.
+An pagpupura kan nasambit na mga pahina dae pinagtutugot tanganing maiwasan an aksidenteng pagka-antala kan {{SITENAME}}.',
+'delete-warning-toobig' => 'Ining pahina igwa nin dakulaong historiya sa pagliwat, minasobrang $1 {{PLURAL:$1|rebisyon|mga rebisyon}}.
+An pagpupura kaini mapuwedeng makapag-antala sa mga operasyon kan datos-sarayan kan {{SITENAME}}; magpadagos tabi na igwang pag-iingat.',
 
 # Rollback
 'rollback' => 'Mga paghihira na pabalík',
 'rollback_short' => 'pabalík',
 'rollbacklink' => 'pabalikón',
+'rollbacklinkcount' => 'ibalik $1 {{PLURAL:$1|pagliwat|mga pagliwat}}',
+'rollbacklinkcount-morethan' => 'ibalik an sobrang $1  {{PLURAL:$1|pagliwat|mga pagliwat}}',
 'rollbackfailed' => 'Prakaso an pagbalík',
 'cantrollback' => 'Dai pwedeng bawîon an hirá; an huring kontribuidor iyo an unikong parásurat kan páhina.',
-'alreadyrolled' => 'Dai pwedeng ibalik an huring hirá kan [[:$1]]
-ni [[User:$2|$2]] ([[User talk:$2|Olay]]); may ibang parágamit na naghirá na o nagbalik na kaini.
+'alreadyrolled' => 'Dae maibalik an huring pagliwat kan [[:$1]] ni [[User:$2|$2]] ([[User talk:$2|olay]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
+may iba na tabing nagliwat o nagbalik kan pahina.
 
-Huring hirá ni [[User:$3|$3]] ([[User talk:$3|Olay]]).',
-'editcomment' => "Ini an nakakaag na komentaryo sa paghirá: \"''\$1''\".",
-'revertpage' => 'Binawî na mga paghirá kan [[Special:Contributions/$2|$2]] ([[User talk:$2|Magtaram]]); pigbalik sa dating bersyón ni [[User:$1|$1]]',
+An huring pagliwat sa pahina ginibo ni [[User:$3|$3]] ([[User talk:$3|olay]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+'editcomment' => "An sumaryo kan pagliwat: \"''\$1''\".",
+'revertpage' => 'Ibinalik na mga pagliwat ni [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) sagkod sa huring rebisyon ni [[User:$1|$1]]',
+'revertpage-nouser' => 'Ibinalik na mga pagliwat ni (ngaran nin paragamit pinaghali) sagkod sa huring rebisyon ni [[User:$1|$1]]',
 'rollback-success' => 'Binawî na mga paghirá ni $1; pigbalik sa dating bersyón ni $2.',
 
 # Edit tokens
+'sessionfailure-title' => 'Nagpalyang sesyon',
 'sessionfailure' => "Garo may problema sa paglaog mo;
 kinanselár ining aksyón bilang sarong paglikay kontra sa ''session hijacking''.
 Pindotón tabî an \"back\" asin ikarga giraray an páhinang ginikanan mo, dangan probarán giraray.",
 
 # Protect
 'protectlogpage' => 'Usip nin pagsagáng',
-'protectlogtext' => 'May lista sa baba nin mga kandado asin panbawi kan kandado kan mga páhina. Hilingon an [[Special:ProtectedPages|lista kan mga pigproprotektarán na mga páhina]] para mahiling an lista kan mga proteksión nin mga páhina sa ngunyan na nakabuká.',
+'protectlogtext' => 'Sa ibaba iyo an sarong listahan kan mga pagbabago sa mga proteksyon kan pahina.
+Hilnga tabi an [[Special:ProtectedPages|listahan kan protektadong mga pahina]] para sa listahan kan presenteng naggaganang mga proteksyon nin pahina.',
 'protectedarticle' => 'protektado "[[$1]]"',
 'modifiedarticleprotection' => 'binago an nibel nin proteksión para sa "[[$1]]"',
-'unprotectedarticle' => 'Warang proteksión an "[[$1]]"',
+'unprotectedarticle' => 'pinaghaleng proteksyon gikan sa "[[$1]]"',
+'movedarticleprotection' => 'pinaglipat an panuytoy kan proteksyon gikan sa "[[$2]]" sagkod "[[$1]]"',
 'protect-title' => 'Pigpupuesta an nibel nin proteksión sa "$1"',
+'protect-title-notallowed' => 'Hilnga na lebel nin proteksyon kan "$1"',
 'prot_1movedto2' => '[[$1]] piglipat sa [[$2]]',
+'protect-badnamespace-title' => 'Dae maprotektaran na espasyong-ngaran',
+'protect-badnamespace-text' => 'Mga pahina kaining espasyong-ngaran dae tabi protektado.',
 'protect-legend' => 'Kompermaron an proteksyon',
 'protectcomment' => 'Rason:',
 'protectexpiry' => 'Mápasó:',
 'protect_expiry_invalid' => 'Dai pwede ining pahanon nin pagpasó.',
 'protect_expiry_old' => 'Nakalihis na an panahon nin pagpasó.',
+'protect-unchain-permissions' => 'Bukasi an kadagdagang pagpipilian kan proteksyon',
 'protect-text' => "Pwede mong hilingón asin bàgohon an tangga nin proteksyon digdi para sa pahina '''$1'''.",
 'protect-locked-blocked' => "Dai mo pwedeng bâgohon an mga tangga kan proteksyon mientras na ika nababágat. Ini an mga presenteng pwesto kan páhina '''$1''':",
 'protect-locked-dblock' => "Dai puedeng ibalyo an mga nibel kan proteksión ta may actibong kandado sa base nin datos.
@@ -1342,14 +2250,27 @@ Ini an mga puesta sa ngunyan kaining páhina '''$1''':",
 'protect-locked-access' => "Mayong permiso an account mo na magbàgo kan tangga nin proteksyon.
 Uya an ngonyan na mga pwesto kan pahinang '''$1''':",
 'protect-cascadeon' => 'Pigproprotektaran ining pahina sa ngonyan ta sabay ini sa mga nasunod na {{PLURAL:$1|pahina, na may|mga pahina, na may}} proteksyong katarata na nakaandar. Pwede mong bàgohon an tangga nin proteksyon kaining pahina, pero mayò ning epekto sa proteksyong katarata.',
-'protect-default' => '(normal)',
+'protect-default' => 'Tuguti an gabos na mga paragamit',
 'protect-fallback' => 'Mangipo kan "$1" na permiso',
-'protect-level-autoconfirmed' => 'Bagáton an mga paragamit na dai nakarehistro',
+'protect-level-autoconfirmed' => 'Kubkubon an baguhan asin bakong rehistradong mga paragamit',
 'protect-level-sysop' => 'Para sa mga sysop sana',
 'protect-summary-cascade' => 'katarata',
 'protect-expiring' => 'mápasó sa $1 (UTC)',
+'protect-expiring-local' => 'mapalso sa $1',
+'protect-expiry-indefinite' => 'daeng sagkodan',
 'protect-cascade' => 'Protektarán an mga pahinang nakaiba sa pahinang ini (proteksyon katarata)',
 'protect-cantedit' => 'Dai mo mariribayan an mga tanggá kan proteksyon kaining pahina huli ta mayò ka nin permiso na ligwatón ini.',
+'protect-othertime' => 'Ibang panahon:',
+'protect-othertime-op' => 'laeng oras',
+'protect-existing-expiry' => 'Eksistidong oras nin pagpalso: $3, $2',
+'protect-otherreason' => 'Laen/kadagdagang rason:',
+'protect-otherreason-op' => 'Laeng rason',
+'protect-dropdown' => '*Pirmehang mga rason nin proteksyon
+** Sobrahon na bandalismo
+** Sobrahon na pag-espam
+** Kontra-produktibong iwalan sa pagliwat
+** Halangkaw na trapiko kan pahina',
+'protect-edit-reasonlist' => 'Liwaton an mga rason nin proteksyon',
 'protect-expiry-options' => '1ng ora:1 hour,1ng aldaw:1 day,1ng semana:1 week,2ng semana:2 weeks,1ng bulan:1 month,3ng bulan:3 months,6 na bulan:6 months,1ng taon:1 year,daing kasagkoran:infinite',
 'restriction-type' => 'Permiso:',
 'restriction-level' => 'Tanggá nin restriksyon:',
@@ -1371,30 +2292,38 @@ Uya an ngonyan na mga pwesto kan pahinang '''$1''':",
 # Undelete
 'undelete' => 'Hilingón ang mga pinarang pahina',
 'undeletepage' => 'Hilingón asin ibalik an mga pinarang pahina',
+'undeletepagetitle' => "'''An minasunod konsistido nin pinagpurang mga rebisyon kan [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Hilingón an mga pinarang pahina',
-'undeletepagetext' => 'An mga minasunod na páhina pigparâ na alagad yaon pa sa archibo asin pwedeng ibalik. Dapat limpiahan an archibo kada periodo.',
-'undeleteextrahelp' => "Kun boot mong ibalik an enterong páhina, dai markahan an gabos na mga kahon asin pindoton an '''''Restore'''''. Para magpili nin ibábalik, markahan an mga kahon na boot mong ibalik, asin pindoton an '''''Restore'''''. An pagpindot kan '''''Reset''''' makakalimpya nin kampo kan mga kommento
-asin an gabos na mga kahon-marka.",
+'undeletepagetext' => 'An minasunod na {{PLURAL:$1|pahina pinagpura na alagad yaon|$1 mga pahina pinagpura na alagad yaraon }} pa man sa arkibo asin puwedeng maipagbalik.
+An arkibo mapupuwedeng peryodikal na paglilinigan.',
+'undelete-fieldset-title' => 'Ibalik an mga rebisyon',
+'undeleteextrahelp' => "Tanganing maibalik an enterong historiya kan pahina, pabayae na an gabos na mga kahon nin tsek dae pagkaagan asin i-klik mo an '''''{{int:undeletebtn}}'''''.
+Tanganing gibohon an piniling restorasyon, i-tsek mo an mga kahon na kinatangudan kan mga rebisyon na ipagbabalik, asin i-klik an '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '$1 {{PLURAL:$1|na pagriribay|na mga pagriribay}} na nakaarchibo',
-'undeletehistory' => "Kun ibabalik mo an páhinang ini, an gabos na mga pagribay mabalik sa historial.
-Kun igwang piggibong sarong bâgong páhinang may parehong pangaran antes ka pagparâ, an presenteng pagribay maluwas sa historial, asin an presenteng pagribay kan tunay na páhina dai enseguidang mariribayan. Giromdomon man tabî na an mga restriksyon sa mga pagriribay nin ''file'' mawawarâ sa pagbalik.",
-'undeleterevdel' => "Dai madadagos an pagbalik kan pagparâ kun an resulta kaini mapaparâ kan pagribay an nasa páhinang pinaka itaas.
-Sa mga kasong ini, dapat halîon an mga marka o dai itâgo an mga pinaka bâgong pigparâ na mga pagribay. Dai ibabalik an mga pagribay kan mga ''file'' na mayo kan permisong hilingon.",
+'undeletehistory' => 'Kun saimong ipagbalik an pahina, an gabos nga mga rebisyon ipagbabalik sa historiya.
+Kun an baguhon na pahina na igwang kaparehas na ngaran naimukna na poon kan puraon, an ipinagbalik na mga rebisyon minaluwas sa nakaagi nang historiya.',
+'undeleterevdel' => 'An dae pagpupura dae paggigibohon kun ini magreresulta sa kaibabawan kan pahina o rebisyon kan sagunson bilang parsiyal na pinagpura.
+Sa arog na mga kaso, kaipuhan mong haleon an tsek o tagoon an pinakabaguhon na pinagpurang rebisyon.',
 'undeletehistorynoadmin' => 'Pigparâ na ining péhina. Mahihiling an rason sa epitome sa babâ, kasabay sa mga detalye kan mga parágamit na naghira kaining páhina bago pigparâ. Sa mga administrador sana maipapahiling an mga pagribay sa mismong tekstong ini.',
-'undelete-revision' => 'Pigparâng pagribay ni $3 kan $1 (sa $2):',
+'undelete-revision' => 'Pinagpurang rebisyon kan $1 (poon kan $4, sa oras na $5) ni $3:',
 'undeleterevision-missing' => 'Dai pwede o nawawarang pagribay. Pwede ser na salâ an takod, o
 binalik an na pagribay o hinalî sa archibo.',
+'undelete-nodiff' => 'Mayo nin dating rebisyon an nanagboan.',
 'undeletebtn' => 'Ibalik',
+'undeletelink' => 'hilngon/ibalik',
+'undeleteviewlink' => 'hilngon',
 'undeletereset' => 'Ipwesto giraray',
-'undeletecomment' => 'Komento:',
-'undeletedrevisions' => '$1 na (mga) pagriribay an binalík',
-'undeletedrevisions-files' => "$1 na (mga) pagribay asin $2 na (mga) binalik na ''file''",
-'undeletedfiles' => "$1 (mga) ''file'' an binalik",
+'undeleteinvert' => 'Baliktada an pinilian',
+'undeletecomment' => 'An rason:',
+'undeletedrevisions' => '{{PLURAL:$1|1 rebisyon|$1 mga rebisyon}} ipinagbalik',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 rebisyon|$1 mga rebisyon}} asin {{PLURAL:$2|1 sagunson|$2 mga sagunson}} ipinagbalik',
+'undeletedfiles' => '{{PLURAL:$1|1 sagunson|$1 mga sagunson}} ipinagbalik',
 'cannotundelete' => 'Naprakaso an pagbalik kan pigparâ; pwede ser an binawi an pagparâ kan páhina kan ibang parágamit.',
 'undeletedpage' => "'''binalik na an $1 '''
 
 Ikonsultar an [[Special:Log/delete|historial nin pagparâ]] para mahiling an lista nin mga kaaaging pagparâ asin pagbalik.",
 'undelete-header' => 'Hilingon an [[Special:Log/delete|historial kan pagparâ]] kan mga kaaagi pa sanang pinarang páhina.',
+'undelete-search-title' => 'Hanapa an pinagpurang mga pahina',
 'undelete-search-box' => 'Hanapón an mga pinarang pahina',
 'undelete-search-prefix' => 'Hilingón an mga pahinang nagpopoon sa:',
 'undelete-search-submit' => 'Hanápon',
@@ -1403,18 +2332,25 @@ Ikonsultar an [[Special:Log/delete|historial nin pagparâ]] para mahiling an lis
 'undelete-bad-store-key' => "Dai pwedeng bawîon an pagparâ nin ''file'' na pagpakarhay na may taták nin oras na $1: nawara an ''file'' bago an pagparâ.",
 'undelete-cleanup-error' => "May salâ pagparâ kan ''file'' na archibong \"\$1\".",
 'undelete-missing-filearchive' => "Dai maibalik an archibo kan ''file'' may na  ID $1 ta mayô ini sa base nin datos. Pwede ser na pigparâ na ini.",
+'undelete-error' => 'Kasalaan sa dae pinagpupurang pahina',
 'undelete-error-short' => "May salâ sa pagbalik kan pigparang ''file'': $1",
 'undelete-error-long' => "May mga salâ na nasabat mientras sa pigbabalik an pigparang ''file'':
 
 $1",
+'undelete-show-file-confirm' => 'Segurado ka na gusto mong hilngon an pinagpurang rebisyon kan sagunson "<nowiki>$1</nowiki>" poon kan $2 oras na $3?',
+'undelete-show-file-submit' => 'Iyo po',
 
 # Namespace form on various pages
 'namespace' => 'Liang-liang:',
 'invert' => 'Pabaliktadón an pinili',
+'tooltip-invert' => 'I-tsek ining kahon tanganing tagoon an mga pagbabago sa mga pahina na yaon sa laog kan pinagpiling espasyong-ngaran (asin an asosyado na espasyong-ngaran kun may tsek)',
+'namespace_association' => 'Asosyado na espasyong-ngaran',
+'tooltip-namespace_association' => 'I-tsek ining kahon tangani man ibali an olay o subheto na espasyong-ngaran na asosyado sa pinagpili na espasyong-ngaran',
 'blanknamespace' => '(Principal)',
 
 # Contributions
 'contributions' => 'Mga kontribusyon kan parágamit',
+'contributions-title' => 'Mga kontribusyon kan paragamit para sa $1',
 'mycontris' => 'Mga ambág ko',
 'contribsub2' => 'Para sa $1 ($2)',
 'nocontribs' => 'Mayong mga pagbabago na nahanap na kapadis sa ining mga criteria.',
@@ -1424,30 +2360,48 @@ $1",
 
 'sp-contributions-newbies' => 'Ipahiling an mga kontribusión kan mga bagong kuenta sana',
 'sp-contributions-newbies-sub' => 'Para sa mga bàgong account',
+'sp-contributions-newbies-title' => 'Mga kontribusyon kan paragamit para sa baguhon an mga panindog',
 'sp-contributions-blocklog' => 'Bagáton an usip',
-'sp-contributions-deleted' => 'Paráon an mga ambág kan paragamít',
-'sp-contributions-talk' => 'Pag-oláyan',
-'sp-contributions-userrights' => 'Pagmaneho kan mga derecho nin paragamit',
+'sp-contributions-deleted' => 'pinagpurang mga kontribusyon kan paragamit',
+'sp-contributions-uploads' => 'mga ikinarga',
+'sp-contributions-logs' => 'mga tinalaan',
+'sp-contributions-talk' => 'olayan',
+'sp-contributions-userrights' => 'manihamento sa mga karapatan kan paragamit',
+'sp-contributions-blocked-notice' => 'Ining paragamit sa presente pinagbarahan.
+An pinakahuring entrada sa talaan nin pagbara nakahaya sa ibaba bilang reperensiya:',
+'sp-contributions-blocked-notice-anon' => 'Ining IP adres sa presente pinagbarahan.
+An pinakahuring entrada sa talaan nin pagbara nakahaya sa ibaba bilang reperensiya:',
 'sp-contributions-search' => 'Maghanap nin mga kontribusyon',
 'sp-contributions-username' => 'IP o ngaran kan parágamit:',
+'sp-contributions-toponly' => 'Minapahiling sana nin mga pagliwat na pinakahurihang mga rebisyon',
 'sp-contributions-submit' => 'Hanápon',
 
 # What links here
 'whatlinkshere' => 'An nakatakód digdí',
-'whatlinkshere-title' => 'Mga pahinang nakatakód sa $1',
+'whatlinkshere-title' => 'Mga pahina na nakasugpon sa "$1"',
 'whatlinkshere-page' => 'Pahina:',
 'linkshere' => "An mga minasunod na pahina nakatakod sa '''[[:$1]]''':",
 'nolinkshere' => "Mayong pahinang nakatakod sa '''[[:$1]]'''.",
 'nolinkshere-ns' => "Mayong pahina na nakatakod sa '''[[:$1]]''' sa piniling ngaran-espacio.",
 'isredirect' => 'ilikay an pahina',
 'istemplate' => 'kabali',
+'isimage' => 'kasugpon nin sagunson',
 'whatlinkshere-prev' => '{{PLURAL:$1|nakaagi|nakaaging $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|sunod|sunod na $1}}',
 'whatlinkshere-links' => '← mga takod',
+'whatlinkshere-hideredirs' => '$1 mga panukdong otro',
+'whatlinkshere-hidetrans' => '$1 kabaling-binalyuhan',
+'whatlinkshere-hidelinks' => '$1 mga kasugpon',
+'whatlinkshere-hideimages' => '$1 mga kasugpon kan imahe',
 'whatlinkshere-filters' => 'Mga pansarà',
 
 # Block/unblock
+'autoblockid' => 'Awtomatikong-kabarahan #$1',
+'block' => 'Barahon an paragamit',
+'unblock' => 'Haleon an bara kan paragamit',
 'blockip' => 'Bagáton an paragamit',
+'blockip-title' => 'Barahon an paragamit',
+'blockip-legend' => 'Kubkuba an paragamit',
 'blockiptext' => 'Gamiton an pormularyo sa babâ para bagaton an pagsurat kan sarong espesipikong IP o ngaran nin parágamit.
 Dapat gibohon sana ini para maibitaran vandalismo, asin kompirmi sa [[{{MediaWiki:Policy-url}}|palakaw]].
 Magkaag nin espisipikong rason (halimbawa, magtao nin ehemplo kan mga páhinang rinaot).',
@@ -1463,6 +2417,7 @@ Magkaag nin espisipikong rason (halimbawa, magtao nin ehemplo kan mga páhinang
 ** Gawî-gawing makatakót/makauyám
 ** Nag-aabuso nin mga lain-lain na ''account''
 ** Dai akong ngaran nin parágamit",
+'ipb-hardblock' => 'Pugulan an yaon sa laog na mga paragamit na magliliwat gikan kaining IP adres',
 'ipbcreateaccount' => 'Pugulon an pagibo nin kuenta.',
 'ipbemailban' => 'Pugolan ining paragamit na magpadara nin e-surat',
 'ipbenableautoblock' => 'Enseguidang bagaton an huring direccion nin  IP na ginamit kaining paragamit, asin kon ano pang ibang IP na proprobaran nindang gamiton',
@@ -1471,37 +2426,62 @@ Magkaag nin espisipikong rason (halimbawa, magtao nin ehemplo kan mga páhinang
 'ipboptions' => '2ng oras:2 hours,1ng aldaw:1 day,3ng aldaw:3 days,1ng semana:1 week,2ng semana:2 weeks,1ng bulan:1 month,3ng bulan:3 months,6 na bulan:6 months,1ng taon:1 year,daing kasagkoran:infinite',
 'ipbotheroption' => 'iba',
 'ipbotherreason' => 'Iba/dugang na rasón:',
-'ipbhidename' => 'Itago an ngaran in paragamit para dai mahiling sa historial nin pagbagat, nakaandar na lista nin binagat asin lista nin paragamit',
+'ipbhidename' => 'Tagoon an ngaran nin paragamit gikan sa mga pagliliwat asin mga listahan',
+'ipbwatchuser' => 'Bantayi ining gamit kan paragamit asin mga pahina nin olayan',
+'ipb-disableusertalk' => 'Pugulan ining paragamit na magliliwat kan saiyang sadireng pahina nin olayan habang ini barado',
+'ipb-change-block' => 'Barahan-otro an paragamit na igwa kaining mga panuytoy',
+'ipb-confirm' => 'Kumpirmaron an pagbara',
 'badipaddress' => 'Dai pwede ining IP',
 'blockipsuccesssub' => 'Nagibo na an pagbagát',
-'blockipsuccesstext' => 'Binagat si [[Special:Contributions/$1|$1]].
-<br />Hilingon an [[Special:BlockList|lista nin mga binagat na IP]] para marepaso an mga binagat.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] pinagbarahan.<br />
+Hilngon an [[Special:BlockList|listahan kan binarahan]] tanganing repasohon an mga binara.',
+'ipb-blockingself' => 'Pagbabarahon mo an sadire mo! Segurado ka daw na saimong kagustuhan an gibohon ini?',
+'ipb-confirmhideuser' => 'Ika magbabara nin sarong paragamit na igwang "tagoon an paragamit" na nakagana. Ini magtatago kan ngaran nin paragamit sa gabos na mga listahan asin mga entrada sa talaan. Segurado ka daw na saimong kagustuhan an gibohon ini?',
 'ipb-edit-dropdown' => 'Hirahón an mga rasón sa pagbabagát',
 'ipb-unblock-addr' => 'Paagihon $1',
 'ipb-unblock' => 'Bawion an pagbagat nin ngaran nin paragamit o direccion nin IP',
 'ipb-blocklist' => 'Hilingon an mga presenteng binagat',
+'ipb-blocklist-contribs' => 'Mga kontribusyon para sa $1',
 'unblockip' => 'Paagihon an parâgamit',
 'unblockiptext' => 'Gamiton an pormulario sa baba para puede giraray suratan an dating binagat na direccion nin IP address o ngaran nin paragamit.',
-'ipusubmit' => 'Bawion an pagbagat kaining direccíón',
+'ipusubmit' => 'Haleon ining bara',
 'unblocked' => 'Binawi na an pagbagat ki [[User:$1|$1]]',
+'unblocked-range' => '$1 pinaghale na an bara',
 'unblocked-id' => 'Hinali na an bagat na $1',
-'ipblocklist' => 'Lista nin mga direksyon nin IP asin ngaran nin paragamit na binagat',
+'blocklist' => 'Pinagbarang na mga paragamit',
+'ipblocklist' => 'Baradong mga paragamit',
 'ipblocklist-legend' => 'Hanapon an sarong binagát na paragamit',
+'blocklist-userblocks' => 'Tagoon an mga bara sa panindog',
+'blocklist-tempblocks' => 'Tagoon an temporaryong mga pambara',
+'blocklist-addressblocks' => 'Tagoon an solong pambara kan IP',
+'blocklist-rangeblocks' => 'Tagoon an mahiwason na mga pambara',
+'blocklist-timestamp' => 'pandukot-oras',
+'blocklist-target' => 'Target',
+'blocklist-expiry' => 'Mapasohon',
+'blocklist-by' => 'Admin sa pagbabara',
+'blocklist-params' => 'Mga parametro nin pagbabara',
+'blocklist-reason' => 'Kausa',
 'ipblocklist-submit' => 'Hanápon',
+'ipblocklist-localblock' => 'Pambara sa lokal',
+'ipblocklist-otherblocks' => 'Ibang {{PLURAL:$1|pambara|mga pambara}}',
 'infiniteblock' => 'daing siring',
-'expiringblock' => 'minapasó $1 $2',
+'expiringblock' => 'mapaso sa $1 sa oras na $2',
 'anononlyblock' => 'anon. sana',
 'noautoblockblock' => 'pigpopondo an enseguidang pagbagat',
 'createaccountblock' => 'binagat an paggibo nin kuenta',
 'emailblock' => 'binagát an e-surat',
+'blocklist-nousertalk' => 'dae makakaliwat kan sadireng pahina nin olayan',
 'ipblocklist-empty' => 'Mayong laog an lista nin mga binagat.',
 'ipblocklist-no-results' => 'Dai nabagat an hinagad na direccion nin IP o ngaran nin paragamit.',
 'blocklink' => 'bagáton',
 'unblocklink' => 'paagihon',
 'change-blocklink' => 'sanglián an pagbagat',
 'contribslink' => 'mga ambág',
+'emaillink' => 'ipadara an e-surat',
 'autoblocker' => 'Enseguidang binagat an saimong direccion nin IP ta kaaaging ginamit ini ni "[[User:$1|$1]]". An rason nin pagbagat ni $1: "$2"',
 'blocklogpage' => 'Usip nin pagbagat',
+'blocklog-showlog' => 'Ining paragamit dati nang pinagbarahan.
+An talaan nin pagbara nakahaya sa ibaba bilang reperensiya:',
 'blocklogentry' => 'binagat na [[$1]] na may oras nin pagpaso na $2 $3',
 'blocklogtext' => 'Ini an historial kan pagbagat asin pagbawi sa pagbagat nin mga paragamit. An mga enseguidang binagat na direccion nin
 IP dai nakalista digdi. Hilingon an [[Special:BlockList|IP lista nin mga binagat]] para sa lista nin mga nakaandar na mga pagpangalad buda mga pagbagat.',
@@ -1631,31 +2611,53 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'importnotext' => 'Mayong laog o mayong teksto',
 'importsuccess' => 'Matriumpo an pagpadara!',
 'importnofile' => "Mayong ipinadarang ''file'' an naikarga.",
+'import-invalid-interwiki' => 'Dae makakapag-importa gikan sa pinagsambit na wiki.',
+'import-error-edit' => 'An pahina "$1" bakong importado nin huli ta ika dae tinutugutan na magliliwat kaini.',
+'import-error-create' => 'An pahina "$1" bakong importado nin huli ta ika dae tinutugutan na magmumukna kaini.',
+'import-error-interwiki' => 'An pahina "$1" bakong importado nin huli ta an ngaran kaini reserbado para sa panluwas na kasugponan (interwiki).',
+'import-error-special' => 'An pahina "$1" bakong importado nin huli ta ini kabali sa espesyal an espasyong-ngaran na dae nagtutugot nin mga pahina.',
+'import-error-invalid' => 'An pahina "$1" bakong importado nin huli ta an ngaran kaini imbalido.',
+'import-options-wrong' => 'Salang {{PLURAL:$2|pagpipilian|mga pagpipilian}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'An pinagtaong ugat na pahina sarong imbalidong titulo.',
+'import-rootpage-nosubpage' => 'Espasyong-ngaran "$1" kan ugat na pahina dae minatugot nin pan-irarom na mga pahina.',
 
 # Import log
 'importlogpage' => 'Usip nin pagpalaog',
+'importlogpagetext' => 'Administratibong mga importadong pahina na igwang historiya nin pagliliwat gikan sa ibang wikis.',
 'import-logentry-upload' => "pigpadara an [[$1]] kan pagkarga nin ''file''",
-'import-logentry-upload-detail' => '$1 mga pagpakarháy',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|rebisyon|mga rebisyon}}',
 'import-logentry-interwiki' => 'na-transwiki an $1',
-'import-logentry-interwiki-detail' => '$1 mga pagpakarháy halì sa $2',
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|rebisyon|mga rebisyon}} gikan sa $2',
+
+# JavaScriptTest
+'javascripttest' => 'Testing sa JavaScript',
+'javascripttest-disabled' => 'Ining punksyon dae pinagpagana sa wiki na ini.',
+'javascripttest-title' => 'Pinapadalagan na $1 na mga pagtesting',
+'javascripttest-pagetext-noframework' => 'An pahinang ini reserbado para sa pagpapadalagan kan mga pagtesting sa JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Bakong bistadong modelo para sa pagtesting kan "$1".',
+'javascripttest-pagetext-frameworks' => 'Pakipili tabi nin saro sa minasunod na mga modelo sa pagtesting: $1',
+'javascripttest-pagetext-skins' => 'Magpili nin sarong kublit tanganing padalaganon an mga pagtesting sa:',
+'javascripttest-qunit-intro' => 'Hilngon [$1 dokumentasyon sa pagtesting] sa mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit kuwarto nin pagtesting',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'An sakóng pahina',
+'tooltip-pt-userpage' => 'An saimong paragamit na pahina',
 'tooltip-pt-anonuserpage' => 'An páhina nin páragamit para sa ip na pighihira mo bilang',
-'tooltip-pt-mytalk' => 'Pahina nin sakóng olay',
+'tooltip-pt-mytalk' => 'An saimong pahina sa olayan',
 'tooltip-pt-anontalk' => 'Mga olay manonongod sa mga hira halî sa ip na ini',
 'tooltip-pt-preferences' => 'Mga kabòtan ko',
 'tooltip-pt-watchlist' => 'Lista nin mga pahina na pigbabantayan an mga pagbabàgo',
-'tooltip-pt-mycontris' => 'Taytáy kan mga kabòtan ko',
+'tooltip-pt-mycontris' => 'Sarong listahan kan saimong mga kontribusyon',
 'tooltip-pt-login' => 'Pigaagda kang maglaog, alagad, bako man ining piriritan.',
 'tooltip-pt-anonlogin' => 'Pig-aagda kang maglaog, alagad, bakô man ining piriritan.',
 'tooltip-pt-logout' => 'Magluwas',
 'tooltip-ca-talk' => 'Olay sa pahina nin laog',
 'tooltip-ca-edit' => 'Pwede mong hirahón ining pahina. Gamiton tabi an patànaw na butones bago an pagtagama.',
-'tooltip-ca-addsection' => 'Magdugang nin komento sa urulay na iní.',
+'tooltip-ca-addsection' => 'Magpoon nin sarong baguhon na seksyon',
 'tooltip-ca-viewsource' => 'Sinagangán ining pahina. Mahihilíng mo an ginikanan.',
 'tooltip-ca-history' => 'Mga nakaaging bersyon kaining pahina',
 'tooltip-ca-protect' => 'Protektahán ining pahina',
+'tooltip-ca-unprotect' => 'Magribay nin proteksyon kaining pahina',
 'tooltip-ca-delete' => 'Paraon an pahinang ini',
 'tooltip-ca-undelete' => 'Bawîon an mga hirá na piggibo sa páhinang ini bâgo ini pigparâ',
 'tooltip-ca-move' => 'Ibalyó an pahinang iní',
@@ -1678,7 +2680,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-feed-atom' => 'Hungit na atomo sa pahinang iní',
 'tooltip-t-contributions' => 'Hilingón an lista kan mga kontribusyon kaining paragamit',
 'tooltip-t-emailuser' => 'Padarahan nin e-koreo an paragamit na ini',
-'tooltip-t-upload' => 'Ikargá an mga ladawan o media files',
+'tooltip-t-upload' => 'Ikarga an mga sagunson',
 'tooltip-t-specialpages' => 'Lista kan gabos na mga espesyal na pahina',
 'tooltip-t-print' => 'Naipiprint na bersyon kaining pahina',
 'tooltip-t-permalink' => 'Permanenteng takod sa bersyon kaining páhina',
@@ -1687,7 +2689,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-ca-nstab-media' => "Hilingón an pahina kan ''media''",
 'tooltip-ca-nstab-special' => 'Pahinang espesyal ini, dai mo ini pwedeng hirahón',
 'tooltip-ca-nstab-project' => 'Hilingón an pahina kan proyekto',
-'tooltip-ca-nstab-image' => 'Hilingón an pahina kan retrato',
+'tooltip-ca-nstab-image' => 'Hilnga an pahina kan sagunson',
 'tooltip-ca-nstab-mediawiki' => "Hilingón an ''system message''",
 'tooltip-ca-nstab-template' => 'Hilingón an templato',
 'tooltip-ca-nstab-help' => 'Hilingón an pahina nin tabang',
@@ -1698,8 +2700,14 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-diff' => 'Ipahilíng an mga pagbabàgong ginibo mo sa teksto.',
 'tooltip-compareselectedversions' => 'Hilingón an mga kaibhán sa duwáng piníling bersyon kainíng pahina.',
 'tooltip-watch' => 'Idugang ining pahina sa pigbabantayan mo',
+'tooltip-watchlistedit-normal-submit' => 'Haleon an mga titulo',
+'tooltip-watchlistedit-raw-submit' => 'Magdugang kan bantay-listahan',
 'tooltip-recreate' => 'Gibohon giraray an páhina maski na naparâ na ini',
 'tooltip-upload' => 'Pônan an pagkarga',
+'tooltip-rollback' => '"Balikon" an mga pinagbagong pagliliwat sa pahinang ini kan pinakahuring kontributor sa paagi nin sarong klik',
+'tooltip-undo' => '"Gibohang ibalik" an mga pinagbagong pagliliwat asin bukasi an porma nin pagliliwat sa modong patanaw. Ini minatugot na magdadagdag nin rason sa sumaryo.',
+'tooltip-preferences-save' => 'Itagama an mga kagustuhan',
+'tooltip-summary' => 'Magkaag nin sarong halipot na sumaryo',
 
 # Stylesheets
 'common.css' => '/** an CSS na pigbugtak digdi maiaaplikar sa gabos na mga skin */',
@@ -1713,22 +2721,37 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'notacceptable' => "Dai pwedeng magtao nin datos an ''wiki server'' sa ''format'' na pwedeng basahon kan kompyuter mo.",
 
 # Attribution
-'anonymous' => '(Mga)paragamit na anónimo kan {{SITENAME}}',
+'anonymous' => 'Bako-bistadong {{PLURAL:$1|paragamit|mga paragamit}} kan {{SITENAME}}',
 'siteuser' => 'Paragamit kan {{SITENAME}} na si $1',
+'anonuser' => '{{SITENAME}} bako-bistadong paragamit $1',
 'lastmodifiedatby' => 'Ining páhina huring binago sa $2, $1 ni $3.',
 'othercontribs' => 'Binase ini sa trabaho ni $1.',
 'others' => 'iba pa',
-'siteusers' => '(Mga)paragamit kan {{SITENAME}} na si $1',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|paragamit|mga paragamit}} $1',
+'anonusers' => '{{SITENAME}} bako-bistadong {{PLURAL:$2|paragamit|mga paragamit}} $1',
 'creditspage' => 'Mga krédito nin páhina',
 'nocredits' => 'Mayong talastas kan kredito para sa ining pahina.',
 
 # Spam protection
 'spamprotectiontitle' => "Proteksyon kan ''spam filter''",
-'spamprotectiontext' => "An páhinang gusto mong itagama pigbagat kan ''spam filter''. Kawsa gayod ini kan sarong takod sa sarong panluwas na 'site'.",
+'spamprotectiontext' => 'An teksto na saimong kinakaipong ipagtagama pinagbarahan kan saraan nin spam.
+Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na panluwas na sityo.',
 'spamprotectionmatch' => "An minasunod na teksto iyo an nagbukas kan ''spam filter'' mi: $1",
 'spambot_username' => 'paglimpya nin spam sa MediaWiki',
 'spam_reverting' => 'Mabalik sa huring bersion na mayong takod sa $1',
 'spam_blanking' => 'An gabos na mga pahirá na may takod sa $1, pigblablanko',
+'spam_deleting' => 'An gabos na mga rebisyon na igwang mga kasugpunan sa $1, pinupura',
+
+# Info page
+'pageinfo-title' => 'Impormasyon para sa "$1"',
+'pageinfo-header-basic' => 'Panuntungang impormasyon',
+'pageinfo-header-edits' => 'Pagliwat na historiya',
+'pageinfo-header-restrictions' => 'Pampahinang proteksyon',
+'pageinfo-header-properties' => 'Pampahinang propriyedades',
+'pageinfo-views' => 'Numero kan mga patanaw',
+'pageinfo-watchers' => 'Numero kan mga parabantay',
+'pageinfo-edits' => 'Numero kan mga pagliliwat',
+'pageinfo-authors' => 'Numero kan bantog na mga awtor',
 
 # Skin names
 'skinname-standard' => 'Klasiko',
@@ -1739,7 +2762,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'markaspatrolleddiff' => 'Markahan bilang pigpapatrolya',
 'markaspatrolledtext' => 'Markahan iníng pahina na pigpapatrolya',
 'markedaspatrolled' => 'Minarkahan na pigpapatrolya',
-'markedaspatrolledtext' => 'Minarkahan bilang pigpapatrolya an piníling pagpakarháy.',
+'markedaspatrolledtext' => 'An pinagpiling rebisyon kan [[:$1]] pinagmarkahan bilang patrolyado.',
 'rcpatroldisabled' => 'Pigpopogólan an mga Pagpatrolya kan mga Nakakaági pa sanáng Pagbabàgo',
 'rcpatroldisabledtext' => 'Pigpopogólan ngùna an Pagpatrolya kan mga Nakakaági pa sanáng Pagbabàgo.',
 'markedaspatrollederror' => 'Dai mamamarkahan bilang pigpapatrolya',
@@ -1748,6 +2771,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 
 # Patrol log
 'patrol-log-page' => 'Laóg kan Pigpapatrolya',
+'patrol-log-header' => 'Ini an sarong talaan kan patrolyadong mga rebisyon.',
+'log-show-hide-patrol' => '$1 talaan sa patrolya',
 
 # Image deletion
 'deletedrevision' => 'Pigparâ an lumang pagribay na $1.',
@@ -1761,45 +2786,101 @@ $1",
 'filedelete-archive-read-only' => 'An direktoryong archibo na "$1" dai nasusuratan kan webserver.',
 
 # Browsing diffs
-'previousdiff' => '← Nakaaging kaibhán',
-'nextdiff' => 'Kaibhán pa→',
+'previousdiff' => '← Lumaong pagliliwat',
+'nextdiff' => 'Baguhong pagliliwat →',
 
 # Media information
-'mediawarning' => "'''Patanid''': May ''malicious code'' sa ''file'' na ini, kun gigibohon ini pwede ser na maraot an saimong ''system''.",
-'imagemaxsize' => 'Limitaran an mga ladawan sa mga páhinang deskripsyon kan ladawan sa:',
+'mediawarning' => "'''Patanid tabi''': Ining tipo nin sagunson mapuwedeng may laog nin malisyosong koda.
+Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
+'imagemaxsize' => "Limit sa sukol kan imahe:<br />''(para sa deskripsyon kan mga pahina nin sagunson)''",
 'thumbsize' => 'Sokol nin retratito:',
-'widthheightpage' => '$1 × $2, $3 mga pahina',
+'widthheightpage' => '$1 x $2, $3 {{PLURAL:$3|pahina|mga pahina}}',
 'file-info' => "sokol kan ''file'': $1, tipo nin MIME: $2",
 'file-info-size' => "$1 × $2 na pixel, sokol kan ''file'': $3, tipo nin MIME: $4",
+'file-info-size-pages' => '$1 × $2 piksel, sukol kan sagunson: $3, MIME na tipo: $4, $5 {{PLURAL:$5|pahina|mga pahina}}',
 'file-nohires' => 'Mayong mas halangkáw na resolusyon.',
 'svg-long-desc' => 'file na SVG, haros $1 × $2 pixels, sokol kan file: $3',
 'show-big-image' => 'Todong resolusyon',
+'show-big-image-preview' => 'Sukol kaining patanaw: $1.',
+'show-big-image-other' => 'Ibang {{PLURAL:$2|resolusyon|mga resoluyon}}: $1.',
+'show-big-image-size' => '$1 × $2 piksel',
+'file-info-gif-looped' => 'pinag-otro',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|prema|mga prema}}',
+'file-info-png-looped' => 'inotrohan',
+'file-info-png-repeat' => 'pinagkawat $1 {{PLURAL:$1|bes|beses}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|prema|mga prema}}',
 
 # Special:NewFiles
 'newimages' => 'Galeria nin mga bàgong file',
 'imagelisttext' => "Mahihiling sa baba an lista nin mga  '''$1''' {{PLURAL:$1|file|files}} na linain $2.",
+'newimages-summary' => 'Ining espesyal na pahina minaphiling kan huring pinagkargang mga sagunson.',
+'newimages-legend' => 'An saraan',
+'newimages-label' => 'Ngaran nin sagunson (o sarong parte kaini):',
 'showhidebots' => '($1 na bots)',
 'noimages' => 'Mayong mahihilíng.',
 'ilsubmit' => 'Hanápon',
 'bydate' => 'sa petsa',
-'sp-newimages-showfrom' => 'Hilingón an mga retratong nagpopoon sa $1',
+'sp-newimages-showfrom' => 'Ipahiling an baguhon na mga sagunson na nagpopoon gikan sa oras na $2, $1',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 segundo|$1 segundos}}',
+'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
+'hours' => '{{PLURAL:$1|$1 oras|$1 oras}}',
+'days' => '{{PLURAL:$1|$1 aldaw|$1 mga aldaw}}',
+'ago' => '$1 nakaagi',
 
 # Bad image list
-'bad_image_list' => 'An husay iyó an minasunód:
+'bad_image_list' => 'An pormat iyo ining minasunod:
 
-An mga nakataytáy saná (mga taytáy na nagpopoón sa *) iyó an kaayon.
-An inot na takód sa taytáy kaipohan na saróng takód sa saróng saláng file.
-Anó man na minasunód na takód sa ginikanan na taytáy iyó an kaayon sa mga paglain, i.e. mga pahina na may file na maluwás sa laog kan taytáy.',
+Listahan kan mga aytem sana (mga linyang nagpopoon sa *) an mga pinagkokonsidera.
+An enot na kasugponan sa sarong linya kaipuhan na sarong sugpon pasiringon sa maraot na sagunson.
+An arinman na nagsurunod na mga kasugponan sa kaparehong linya an mga pinagkokonsidera na magin mga palaen, i.e. mga pahina na kun saen an sagunson mapuwedeng mangyari sa laog kan linya.',
 
 # Metadata
 'metadata' => 'Metadatos',
-'metadata-help' => 'Igwang dugang na impormasyon ining file na pwedeng idinugang hali sa digital camera o scanner na piggamit tangarig magibo ini. Kun namodipikar na file hali sa orihinal nyang kamogtakan, an ibang mga detalye pwedeng dai mahiling sa minodipikar na ladawan.',
+'metadata-help' => 'Ining sagunson may laog na kadagdagang impormasyon, puwedeng pinagdagdag gikan sa kamerang digital o tagakopyang ginamit sa pagmukna o pagpasadit kaini.
+Kun an sagunson pinagbago gikan sa orihinal kaining estado, an ibang mga detalye mapuwedeng dae bilog na minapahiling kan pinagbagong sagunson.',
 'metadata-expand' => 'Ipahilíng an gabós na detalye',
 'metadata-collapse' => 'Itagò an gabós na detalye',
+'metadata-fields' => 'Mga kinaagan kan imaheng metadata na nakalista sa mensaheng ipinagdadagdag sa pahina kan patanaw nin imahe kunsoaring na an lamesa kan metadata pinagpasadit.
+An mga iba pagtatagoon sa paagi nin pirmehan.
+* gibo
+* modelo
+* petsaorasorihinal
+* kinaluwasangoras
+* fnumero
+* isobilismarka
+* pokalkalawigan
+* artista
+* copyright
+* imahedeskripsyon
+* gpspabalagbag
+* gpspalaba
+* gpspalangkaw',
 
 # EXIF tags
 'exif-imagewidth' => 'Lakbáng',
 'exif-imagelength' => 'Langkáw',
+'exif-bitspersample' => 'Panaradit kada komponente',
+'exif-compression' => 'Eskima sa kompresyon',
+'exif-photometricinterpretation' => 'Komposisyon sa piksel',
+'exif-orientation' => 'Oryentasyon',
+'exif-samplesperpixel' => 'Numero kan mga komponente',
+'exif-planarconfiguration' => 'Kahusayan kan datos',
+'exif-ycbcrsubsampling' => 'Pan-irarom na sampol na rasyo kan Y sagkod C',
+'exif-ycbcrpositioning' => 'Y asin C na pagpoposisyon',
+'exif-xresolution' => 'Pahigdang resolusyon',
+'exif-yresolution' => 'Patindog na resolusyon',
+'exif-stripoffsets' => 'Lokasyon kan datos nin imahe',
+'exif-rowsperstrip' => 'Numero kan mga row sa kada ginupit',
+'exif-stripbytecounts' => 'Panadakol sa kada kompresadong ginupit',
+'exif-jpeginterchangeformat' => 'Ipagpantay sa JPEG SOI',
+'exif-jpeginterchangeformatlength' => 'Panadakol kan datos sa JPEG',
+'exif-whitepoint' => 'Puti na puntong kromatiko',
+'exif-primarychromaticities' => 'Kromatisidad kan mga primarisidad',
+'exif-ycbcrcoefficients' => 'Kulay kan espasyong transpormasyon sa matrisang mga koepisiyente',
+'exif-referenceblackwhite' => 'Padis kan itom asin puting bilang sa reperensiya',
+'exif-datetime' => 'Pansagunsong pagbabago sa petsa asin oras',
 'exif-imagedescription' => 'Titulo kan retrato',
 'exif-make' => 'Tagagibo nin kamera',
 'exif-model' => 'Modelo nin kamera',
@@ -1814,94 +2895,402 @@ Anó man na minasunód na takód sa ginikanan na taytáy iyó an kaayon sa mga p
 'exif-contrast' => 'Kontraste',
 'exif-imageuniqueid' => 'Unikong ID kan ladawan',
 'exif-gpstrack' => 'Direksyon kan paghirô',
+'exif-gpsimgdirectionref' => 'Reperensiya para sa direksyon kan imahe',
 'exif-gpsimgdirection' => 'Direksyon kan ladáwan',
+'exif-gpsmapdatum' => 'Heodetikong surbey an datos na pinaggamit',
+'exif-gpsdestlatituderef' => 'Reperensiya para sa panlatitud na destinasyon',
+'exif-gpsdestlatitude' => 'Panlatitud na destinasyon',
+'exif-gpsdestlongituderef' => 'Reperensiya para sa panlongitud na destination',
+'exif-gpsdestlongitude' => 'Panlongitud na destinasyon',
+'exif-gpsdestbearingref' => 'Reperensiya para sa pandireksyon na destinasyon',
+'exif-gpsdestbearing' => 'Pandireksyon na destinasyon',
+'exif-gpsdestdistanceref' => 'Reperensiya para sa pandistansiya na destinasyon',
 'exif-gpsdestdistance' => 'Distansya sa destinasyon',
+'exif-gpsprocessingmethod' => 'Ngaran kan GPS na pamprosesong kapaagihan',
+'exif-gpsareainformation' => 'Ngaran nin lugar kan GPS',
+'exif-gpsdatestamp' => 'Petsa kan GPS',
+'exif-gpsdifferential' => 'Diperensiyal na koreksyon kan GPS',
+'exif-jpegfilecomment' => 'Komentaryo sa JPEG na sagunson',
+'exif-keywords' => 'Mga Susing taramon',
+'exif-worldregioncreated' => 'Rehiyon kan kinaban na pinagkuanan kan litrato',
+'exif-countrycreated' => 'Nasyon na pinagkuanan kan litrato',
+'exif-countrycodecreated' => 'Koda para sa nasyon na pinagkuanan kan litrato',
+'exif-provinceorstatecreated' => 'Probinsiya o estado na pinagkuanan kan litratro',
+'exif-citycreated' => 'Siyudad na pinagkuanan kan litrato',
+'exif-sublocationcreated' => 'Sublokasyon kan siyudad na pinagkuanan kan litrato',
+'exif-worldregiondest' => 'Rehiyon kan kinaban pinapahiling',
+'exif-countrydest' => 'Nasyon ipinapahiling',
+'exif-countrycodedest' => 'Koda para sa nasyon na ipinahiling',
+'exif-provinceorstatedest' => 'Probinsiya o estadong ipinapahiling',
+'exif-citydest' => 'Siyudad ipinahiling',
+'exif-sublocationdest' => '
+Sublokas kan siyudad na ipinahiling',
+'exif-objectname' => 'Halipot na titulo',
+'exif-specialinstructions' => 'Espesyal na mga instruksyon',
+'exif-headline' => 'Pamayuhang-linya',
+'exif-credit' => 'Pautang/Tagapagtao',
+'exif-source' => 'Pinaggikanan',
+'exif-editstatus' => 'Editoryal na kamugtakan kan imahe',
+'exif-urgency' => 'Kahidalian',
+'exif-fixtureidentifier' => 'Ngaran kan agwerto',
+'exif-locationdest' => 'Lokasyon pinagbiklad',
+'exif-locationdestcode' => 'Koda kan lokasyon pinagbiklad',
+'exif-objectcycle' => 'Oras kan aldaw na an midya pinagtuyuhan',
+'exif-contact' => 'Impormasyon kan kontak',
+'exif-writer' => 'Parasurat',
+'exif-languagecode' => 'Lengguwahe',
+'exif-iimversion' => 'IIM bersyon',
+'exif-iimcategory' => 'Kategoriya',
+'exif-iimsupplementalcategory' => 'Pansuplementong mga kategoriya',
+'exif-datetimeexpires' => 'Dae gamiton pagkatapos',
+'exif-datetimereleased' => 'Pinaluwas kan',
+'exif-originaltransmissionref' => 'Orihinal na transmisyon sa koda nin lokasyon',
+'exif-identifier' => 'Tagapagpamidbid',
+'exif-lens' => 'Lenteng pinaggamit',
+'exif-serialnumber' => 'Seryal na numero kan kamera',
+'exif-cameraownername' => 'Kagsadire kan kamera',
+'exif-label' => 'Tatak',
+'exif-datetimemetadata' => 'Petsa kan metadata na huring pinagbago',
+'exif-nickname' => 'Impormal na ngaran kan imahe',
+'exif-rating' => 'Kamarkahan (luwas sa lima)',
+'exif-rightscertificate' => 'Sertipiko kan manihamento nin mga karapatan',
+'exif-copyrighted' => 'Estado sa karapatan nin panurat',
+'exif-copyrightowner' => 'Kagsadire sa karapatan nin panurat',
+'exif-usageterms' => 'Mga Terminong Ginagamit',
+'exif-webstatement' => 'Online na testamento sa karapatan nin panurat',
+'exif-originaldocumentid' => 'Unikong ID kan orihinal na dokumento',
+'exif-licenseurl' => 'Kilyawan para sa lisensiya nin karapatan sa panurat',
+'exif-morepermissionsurl' => 'Alternatibong impormasyon sa paglilisensiya',
+'exif-attributionurl' => 'Kunsoarin gagamiton otro ining gibo, pakisugpon sa',
+'exif-preferredattributionname' => 'Kunsoarin gagamiton otro ining gibo, sabihon tabi an kredito',
+'exif-pngfilecomment' => 'Komentaryo sa PNG na sagunson',
+'exif-disclaimer' => 'Pagpapasimuya',
+'exif-contentwarning' => 'Patanid kan laog',
+'exif-giffilecomment' => 'Komentary sa GIF na sagunson',
+'exif-intellectualgenre' => 'Tipo kan Aytem',
+'exif-subjectnewscode' => 'Koda kan subheto',
+'exif-scenecode' => 'IPTC pan-eksenang koda',
+'exif-event' => 'Panyayaring pinagbiklad',
+'exif-organisationinimage' => 'Organisasyon pinagbiklad',
+'exif-personinimage' => 'Persona pinagbiklad',
+'exif-originalimageheight' => 'Langkaw kan imahe bago ini pinagkrap',
+'exif-originalimagewidth' => 'Lakbang kan imahe bago ini pinagkrap',
+
+# EXIF attributes
+'exif-compression-1' => 'Pinaghalugaan',
+'exif-compression-2' => 'CCITT Grupong 3 1-Dimensyonal na pagbabago ni Huffman nagdadalagan nin halawig na pag-enkod',
+'exif-compression-3' => 'CCITT Grupong 3 pinag-enkod sa fax',
+'exif-compression-4' => 'CCITT Grupong 3 pinag-enkod sa fax',
+
+'exif-copyrighted-true' => 'Nakatagamang karapatan sa panurat',
+'exif-copyrighted-false' => 'Pampublikong Kinasakupan',
 
 'exif-unknowndate' => 'Daí aram an petsa',
 
+'exif-orientation-1' => 'Normalon',
+'exif-orientation-2' => 'Pahigdang pinagbuklat',
+'exif-orientation-3' => 'Pinag-ikot nin 180 grado',
+'exif-orientation-4' => 'Patindog na pinagbuklot',
+'exif-orientation-5' => 'Pinag-ikot nin 90 grade asin patindog na pinagbuklat',
+'exif-orientation-6' => 'Pinag-ikot nin 90 grado sa CCW',
+'exif-orientation-7' => 'Pinag-ikot nin 90 grade CW asin patindog na pinagbuklat',
+'exif-orientation-8' => 'Pinag-ikot nin 90 grado sa CW',
+
+'exif-planarconfiguration-1' => 'Patingi na pormat',
+'exif-planarconfiguration-2' => 'Planar na pormat',
+
+'exif-colorspace-65535' => 'Bakong kalibrado',
+
 'exif-componentsconfiguration-0' => 'mayô man ini',
 
+'exif-exposureprogram-0' => 'Mayong pinagkahulugan',
+'exif-exposureprogram-1' => 'Manwal',
+'exif-exposureprogram-2' => 'Normal na programa',
+'exif-exposureprogram-3' => 'Apertoryong Prayoridad',
+'exif-exposureprogram-4' => 'Panseradong Prayoridad',
+'exif-exposureprogram-5' => 'Pangmuknaon na programa (minapabor sa hararomon na kinasakupan)',
+'exif-exposureprogram-6' => 'Pamprogramang Aksyon (minauyon sa mabilison pampundong buklos)',
+'exif-exposureprogram-7' => 'Modong patindog (para haranihang mga litrato na igwang kalikudan na luwas sa pokus)',
+'exif-exposureprogram-8' => 'Modong pahigda ( para sa pahigdang mga litrato na igwang kalikudan na nakapokus)',
+
 'exif-subjectdistance-value' => '$1 metros',
 
 'exif-meteringmode-0' => 'Dai aram',
+'exif-meteringmode-1' => 'Kagtahawan',
+'exif-meteringmode-2' => 'Sentrong pinaggabatan na kagtahawan',
+'exif-meteringmode-3' => 'Kaghilngan',
+'exif-meteringmode-4' => 'Pandakol na kaghilngan',
+'exif-meteringmode-5' => 'Pangarugan',
+'exif-meteringmode-6' => 'Parsyal',
 'exif-meteringmode-255' => 'Iba pa',
 
+'exif-lightsource-0' => 'Bakong bistado',
+'exif-lightsource-1' => 'Maliwanagong aldaw',
+'exif-lightsource-2' => 'Kalaadan',
+'exif-lightsource-3' => 'Tungsten (mainitong liwanag)',
 'exif-lightsource-4' => 'Kitkilát',
 'exif-lightsource-9' => 'Magayón na panahón',
+'exif-lightsource-10' => 'Mapanginurong panahon',
+'exif-lightsource-11' => 'Lindong',
+'exif-lightsource-12' => 'Pan-agang kalaadan (D 5700 - 7100K)',
+'exif-lightsource-13' => 'Pan-agang mapution na kalaadan (N 4600 - 5400K)',
+'exif-lightsource-14' => 'Malipotong mapution na kalaadan (W 3900 - 4500K)',
+'exif-lightsource-15' => 'Maputiong kalaadan (WW 3200 - 3700K)',
+'exif-lightsource-17' => 'Estandarteng Laad A',
+'exif-lightsource-18' => 'Estandarteng Laad B',
+'exif-lightsource-19' => 'Estandarteng Laad C',
+'exif-lightsource-24' => 'ISO estudyong tungsten',
 'exif-lightsource-255' => 'Mga ibang ginikanan nin ilaw',
 
+# Flash modes
+'exif-flash-fired-0' => 'An flash dae nagsindi',
+'exif-flash-fired-1' => 'An flash nagsindi',
+'exif-flash-return-0' => 'mayong estrobo sa pambalik na punksyon sa deteksyon',
+'exif-flash-return-2' => 'estrobong pambalik liwanag bakong detektado',
+'exif-flash-return-3' => 'estrobong pambalik na liwanag detektado',
+'exif-flash-mode-1' => 'kompulsaryong flash nagsindi',
+'exif-flash-mode-2' => 'kompulsaryong flash pinupugulan',
+'exif-flash-mode-3' => 'automatikong modo',
+'exif-flash-function-1' => 'Mayong naggaganang flash',
+'exif-flash-redeye-1' => 'mapulang-mata modong pambawas',
+
 'exif-focalplaneresolutionunit-2' => 'pulgada',
 
+'exif-sensingmethod-1' => 'Mayong pakahulugan',
+'exif-sensingmethod-2' => 'Tagahimate kan solong pinyero nin pankolor sa erya',
+'exif-sensingmethod-3' => 'Tagahimate kan panduwahang pinyero nin pankolor sa erya',
+'exif-sensingmethod-4' => 'Tagahimate kan pantolohang pinyero nin pankolor sa erya',
+'exif-sensingmethod-5' => 'Tagahimate kan pasurunod na pankolor sa erya',
+'exif-sensingmethod-7' => 'Pantolohang linya na tagahimate',
+'exif-sensingmethod-8' => 'Pankolor na pasurunod kan panlinyang tagahimate',
+
+'exif-filesource-3' => 'Nakauntok na kamerang digital',
+
 'exif-scenetype-1' => 'Direktong naretratong ladawan',
 
+'exif-customrendered-0' => 'Normal na proseso',
+'exif-customrendered-1' => 'Pambagong proseso',
+
+'exif-exposuremode-0' => 'Awto na pamburiyas',
+'exif-exposuremode-1' => 'Manwal na pamburiyas',
+'exif-exposuremode-2' => 'Awto na pankorda',
+
+'exif-whitebalance-0' => 'Awto pambalanse kan puti',
+'exif-whitebalance-1' => 'Manwal na pambalanse kan puti',
+
+'exif-scenecapturetype-0' => 'Estandarte',
+'exif-scenecapturetype-1' => 'Pahigda',
 'exif-scenecapturetype-2' => 'Retrato',
 'exif-scenecapturetype-3' => 'Eksenang banggi',
 
+'exif-gaincontrol-0' => 'Mayo',
+'exif-gaincontrol-1' => 'Hababaong pampalangkaw',
+'exif-gaincontrol-2' => 'Paitaas na pampalangkaw',
+'exif-gaincontrol-3' => 'Hababaong pampababa',
+'exif-gaincontrol-4' => 'Paitaas na pampababa',
+
+'exif-contrast-0' => 'Normal',
+'exif-contrast-1' => 'Malumoy',
+'exif-contrast-2' => 'Matagas',
+
+'exif-saturation-0' => 'Normal',
+'exif-saturation-1' => 'Hababaon na satyurasyon',
+'exif-saturation-2' => 'Halangkawon na satyurasyon',
+
+'exif-sharpness-0' => 'Normal',
+'exif-sharpness-1' => 'Malumoy',
+'exif-sharpness-2' => 'Matagas',
+
+'exif-subjectdistancerange-0' => 'Bakong bisto',
+'exif-subjectdistancerange-1' => 'Makro',
+'exif-subjectdistancerange-2' => 'Haranihon pagtanaw',
+'exif-subjectdistancerange-3' => 'Harayoong pagtanaw',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'Norteng kasalungaan',
+'exif-gpslatitude-s' => 'Sur na kasalungaan',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'Esteng kahalungaan',
+'exif-gpslongitude-w' => 'Westeng kahalungaan',
+
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|metro|metros}} ibabaw sa kaabtangan nin dagat',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|metro|metros}} ibaba sa kaabtangan nin dagat',
+
+'exif-gpsstatus-a' => 'Kasukolan yaon sa progreso',
+'exif-gpsstatus-v' => 'Kasukolan yaon sa panlaog na operabilidad',
+
+'exif-gpsmeasuremode-2' => 'Duwahang dimensyon na kasukolan',
+'exif-gpsmeasuremode-3' => 'Pantolohang dimensyon na kasukolan',
+
 # Pseudotags used for GPSSpeedRef
 'exif-gpsspeed-k' => 'Kilometros kada oras',
 'exif-gpsspeed-m' => 'Milya kada oras',
+'exif-gpsspeed-n' => 'kanukso',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'kilometros',
+'exif-gpsdestdistance-m' => 'Milyas',
+'exif-gpsdestdistance-n' => 'Milya nautikal',
+
+'exif-gpsdop-excellent' => 'Ekselente ($1)',
+'exif-gpsdop-good' => 'Marahayon ($1)',
+'exif-gpsdop-moderate' => 'Moderato ($1)',
+'exif-gpsdop-fair' => 'Marahay-rahay ($1)',
+'exif-gpsdop-poor' => 'Maluyahon ($1)',
+
+'exif-objectcycle-a' => 'Pan-aga sana',
+'exif-objectcycle-p' => 'Panbanggi sana',
+'exif-objectcycle-b' => 'Pareho sa pagka-aga asin pagkabanggi',
 
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Tunay na direksyon',
 'exif-gpsdirection-m' => 'Direksyón nin batobalani',
 
+'exif-ycbcrpositioning-1' => 'Pinagpatahaw',
+'exif-ycbcrpositioning-2' => 'Katampad-sityo',
+
+'exif-dc-contributor' => 'Mga Tagapag-ambag',
+'exif-dc-coverage' => 'Espasyal o temporal tungkos kan midya',
+'exif-dc-date' => 'Petsa (s)',
+'exif-dc-publisher' => 'Publikador',
+'exif-dc-relation' => 'Kaampad na midya',
+'exif-dc-rights' => 'Mga karapatan',
+'exif-dc-source' => 'Ginikanang midya',
+'exif-dc-type' => 'Tipo kan midya',
+
+'exif-rating-rejected' => 'Dinihado',
+
+'exif-isospeedratings-overflow' => 'Halangkawon kesa 65535',
+
+'exif-iimcategory-ace' => 'Mga arte, kultura asin kasalingayan',
+'exif-iimcategory-clj' => 'Krimen asin ley',
+'exif-iimcategory-dis' => 'Mga destroso asin aksidente',
+'exif-iimcategory-fin' => 'Ekonomiya asin negosyo',
+'exif-iimcategory-edu' => 'Edukasyon',
+'exif-iimcategory-evn' => 'Kapalibutan',
+'exif-iimcategory-hth' => 'Salud',
+'exif-iimcategory-hum' => 'Pantawong interes',
+'exif-iimcategory-lab' => 'Trabaho',
+'exif-iimcategory-pol' => 'Mga Pulitika',
+'exif-iimcategory-rel' => 'Relihiyon asin paniniwala',
+'exif-iimcategory-sci' => 'Siyensiya asin teknolohiya',
+'exif-iimcategory-soi' => 'Mga pansosyal na mga isyu',
+'exif-iimcategory-spo' => 'Mga Pakawat',
+'exif-iimcategory-war' => 'Giyera, iriwal asin daeng-kahingaloan',
+'exif-iimcategory-wea' => 'Panahon',
+
+'exif-urgency-normal' => 'Normalon ($1)',
+'exif-urgency-low' => 'Hababaon ($1)',
+'exif-urgency-high' => 'Halangkawon ($1)',
+'exif-urgency-other' => 'Prayoridad na pakahulugan nin paragamit ($1)',
+
 # External editor support
 'edit-externally' => 'Hirahón an file gamit an panluwas na aplikasyon',
-'edit-externally-help' => 'Hilingón an  [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] para sa iba pang mga impormasyon.',
+'edit-externally-help' => '(Hilngon an [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] para sa kadagdagang impormasyon)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'gabos',
 'namespacesall' => 'gabós',
 'monthsall' => 'gabos',
+'limitall' => 'gabos',
 
 # E-mail address confirmation
 'confirmemail' => "Kompirmaron an ''e''-surat",
 'confirmemail_noemail' => "Mayô kang pigkaag na marhay na ''e''-surat sa saimong [[Special:Preferences|mga kabôtan nin parágamit]].",
-'confirmemail_text' => "Kaipuhan an pag-''validate'' kan saimong e-koreo bago ka makagamit nin ''features'' na e-koreo. Pindoton an butones sa babâ tangarig magpadara nin kompirmasyon sa saimong e-koreo. An surat igwang takod na may koda; ikarga an takod sa browser para makompirmar na valido an saimong e-koreo.",
+'confirmemail_text' => '{{SITENAME}} minakaipo na balidaron an saimong e-surat na adres bago mo gagamiton an mga estima kan e-surat.
+Aktibaron an tipahan sa ibaba tanganing ipadara an pankumpirmang surat sa saimong adres.
+An surat igwa nin sarong kasugpunan na kinaagan nin sarong koda;
+ikarga an kasugpunan sa saimong kilyaw tanganing makumpirma na an saimong e-surat na adres balido.',
 'confirmemail_pending' => "May pigpadara nang kompirmasyon sa ''e''-surat mo; kun kagigibo mo pa sana kan saimong ''account'', maghalat ka nin mga dikit na minutos bago ka maghagad giraray nin bâgong ''code''.",
 'confirmemail_send' => 'Magpadará nin kompirmasyon',
 'confirmemail_sent' => "Napadará na an kompirmasyon sa ''e''-surat.",
 'confirmemail_oncreate' => "May pigpadara nang kompirmasyon sa saimong ''e''-surat.
 Dai man kaipuhan ini para makalaog, pero kaipuhan mong itao ini bago
 ka makagamit nin ''features'' na basado sa ''e''-surat sa wiki.",
-'confirmemail_sendfailed' => "Dai napadará an kompirmasyon kan ''e''-surat. Seguradohon tabî kun igwang sala.
+'confirmemail_sendfailed' => '{{SITENAME}} dae nakapadara kan saimong pankumpirmang surat.
+Pakihiling tabi sa saimong e-surat na adress para sa imbalidong mga karakter.
 
-Pigbalik: $1",
+Paradarang surat pinagbalik: $1',
 'confirmemail_invalid' => 'Salâ an kódigo nin konpirmasyon. Puede ser napasó na an kódigo.',
 'confirmemail_needlogin' => "Kaipuhan tabi $1 ikompirmar an saimong ''e''-surat.",
-'confirmemail_success' => "Nakompirmar na an saimong ''e''-surat. Pwede ka nang maglaog asin mag-ogma sa wiki.",
+'confirmemail_success' => 'An saimong e-surat na adres kumpirmado na.
+Puwede ka na ngunyan [[Special:UserLogin|maglaog]] asin maogmang maggamit kan wiki.',
 'confirmemail_loggedin' => "Nakompirmar na an saimong ''e''-surat.",
 'confirmemail_error' => 'May nasalâ sa pagtagama kan saimong kompirmasyon.',
 'confirmemail_subject' => "kompirmasyón {{SITENAME}} kan direksyón nin ''e''-surat",
-'confirmemail_body' => 'May paragamit, pwedeng ika, halì sa IP na $1, na nagrehistro nin account na
-"$2" na igwang e-koreo sa {{SITENAME}}.
+'confirmemail_body' => 'Sarong tawo, mapuwedeng ika, gikan sa IP adres na $1,
+nagrehistro nin sarong panindog "$2" na igwa kaining e-surat na adres sa {{SITENAME}}.
+
+Tanganing kumpirmaron na ining panindog talagang pagsadire mo asin aktibaron an e-surat na mga estima sa {{SITENAME}}, bukasi tabi ining kasugpunan sa saimong kilyaw:
+
+$3
 
-Tangarig makompirmar na talagang saimo ining account asin makagamit nin e-koreo sa {{SITENAME}}, bukasán ining takod sa saimong browser:
+Kun ika *dae* nagrehistro kan panindog, sunuda ining sugpon
+tanganing kanselaron an e-surat na adres na pankumpirma:
+
+$5
+
+Ining pankumpirmang koda mapalso sa $4.',
+'confirmemail_body_changed' => 'Sarong tawo, mapuwedeng ika, gikan sa IP adres na $1,
+nagrehistro nin sarong panindog "$2" na igwa kaining e-surat na adres sa {{SITENAME}}.
+
+Tanganing kumpirmaron na ining panindog talagang pagsadire mo asin aktibaron an e-surat na mga estima sa {{SITENAME}}, bukasi tabi ining kasugpunan sa saimong kilyaw:
+
+$3
+
+Kun an panindog *bakong* saimo, sunuda ining sugpon
+tanganing kanselaron an e-surat na adres na pankumpirma:
+
+$5
+
+Ining pankumpirmang koda mapalso sa $4.',
+'confirmemail_body_set' => 'Sarong tawo, mapuwedeng ika, gikan sa IP adres na $1,
+nagrehistro nin sarong panindog "$2" na igwa kaining e-surat na adres sa {{SITENAME}}.
+
+Tanganing kumpirmaron na ining panindog talagang pagsadire mo asin re-aktibaron an e-surat na mga estima sa {{SITENAME}}, bukasi tabi ining kasugpunan sa saimong kilyaw:
 
 $3
 
-Kun *bakô* ka ini, dai sunodón an takod. Mapaso sa $4 inning koda nin kompirmasyon.',
+Kun an panindog *bakong* saimo, sunuda ining sugpon
+tanganing kanselaron an e-surat na adres na pankumpirma:
+
+$5
+
+Ining pankumpirmang koda mapalso sa $4.',
+'confirmemail_invalidated' => 'An e-surat na adres na pankumpirma kanselado na',
+'invalidateemail' => 'Kanselaron an e-surat na pankumpirmasyon',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[Pigpopogolan an transcluding na Interwiki]',
-'scarytranscludefailed' => '[Nabigô an pagkua kan templato para sa $1; despensa]',
-'scarytranscludetoolong' => '[halabaon an URL; despensa]',
+'scarytranscludefailed' => '[Templatong panakdo nagpalya para sa $1]',
+'scarytranscludetoolong' => '[An kilyawan grabe kahalaba]',
 
 # Delete conflict
-'deletedwhileediting' => 'Patanid: Pigparâ na an pahinang ini antes na nagpoon kan maghirá!',
+'deletedwhileediting' => "'''Patanid tabi''': Ining pahina pinagpura matapos na ika nagpoon na magliliwat!",
 'confirmrecreate' => "Si [[User:$1|$1]] ([[User talk:$1|olay]]) pigparâ ining páhina pagkatapos mong magpoon kan paghira ta:
 : ''$2''
 Ikonpirmar tabi na talagang gusto mong gibohon giraray ining pahina.",
+'confirmrecreate-noreason' => 'Paragamit [[User:$1|$1]] ([[User talk:$1|Olay]]) an nagpura kaining pahina matapos na ika nagpoon na magliliwat. Pakikumpirma tabi na ika boot na muknaon otro ining pahina.',
 'recreate' => 'Gibohón giraray',
 
 # action=purge
 'confirm_purge_button' => 'Sige',
 'confirm-purge-top' => 'Halîon an an aliho kaining páhina?',
+'confirm-purge-bottom' => 'Pagpupurga nin sarong pahina minalinig kan sarayan asin minapuwersa sa pinakahuring rebisyon na magtunga.',
+
+# action=watch/unwatch
+'confirm-watch-button' => 'OK tabi',
+'confirm-watch-top' => 'Idadagdag ining pahina sa saimong bantay-listahan?',
+'confirm-unwatch-button' => 'OK tabi',
+'confirm-unwatch-top' => 'Haleon ining pahina gikan sa saimong bantay-listahan?',
 
 # Multipage image navigation
 'imgmultipageprev' => '← nakaaging pahina',
 'imgmultipagenext' => 'sunod na pahina →',
 'imgmultigo' => 'Dumanán!',
+'imgmultigoto' => 'Magpasiring sa pahina $1',
 
 # Table pager
 'ascending_abbrev' => 'skt',
@@ -1911,14 +3300,15 @@ Ikonpirmar tabi na talagang gusto mong gibohon giraray ining pahina.",
 'table_pager_first' => 'Enot na páhina',
 'table_pager_last' => 'Huring páhina',
 'table_pager_limit' => 'Ipahiling an $1 na aytem kada páhina',
+'table_pager_limit_label' => 'Mga aytem kada pahina:',
 'table_pager_limit_submit' => 'Dumanán',
 'table_pager_empty' => 'Mayong resulta',
 
 # Auto-summaries
-'autosumm-blank' => 'Pighahalî an gabos na laog sa páhina',
+'autosumm-blank' => 'Pinagblangko an pahina',
 'autosumm-replace' => "Pigriribayan an páhina nin '$1'",
 'autoredircomment' => 'Piglilikay sa [[$1]]',
-'autosumm-new' => 'Bâgong páhina: $1',
+'autosumm-new' => 'Pinagmukna an pahina kaining "$1"',
 
 # Live preview
 'livepreview-loading' => 'Pigkakarga…',
@@ -1927,16 +3317,17 @@ Ikonpirmar tabi na talagang gusto mong gibohon giraray ining pahina.",
 'livepreview-error' => 'Dai nakakabit: $1 "$2". Hilingón tabî an normal na patânaw.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'An mga pagbalyó na mas bâgo sa $1 na segundo pwedeng dai pa mahiling sa listang ini.',
-'lag-warn-high' => "Nin huli sa ''high database server lag'', an mga pagbabâgo na mas bâgo sa $1 na segundo pwedeng dai pa ipahiling sa listang ini.",
+'lag-warn-normal' => 'Mga pagliliwat na baguhon pa sana nin $1 {{PLURAL:$1|segundo|segundos}} puwedeng dae maipapahiling sa listahang ini.',
+'lag-warn-high' => 'Nin huli sa halangkawon na kaabalahan sa serbidor kan datos-sarayan, mga pagliliwat na baguhon pa sana nin $1 {{PLURAL:$1|segundo|segundos}} puwedeng dae maipapahiling sa listahang ini.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'An saimong pigbabantayan igwang {{PLURAL:$1|1 titulo|$1 mga titulo}}, apwera kan mga páhina kan olay.',
 'watchlistedit-noitems' => 'Mayong mga titulo an pigbabantayan mo.',
 'watchlistedit-normal-title' => 'Hirahón an pigbabantayan',
 'watchlistedit-normal-legend' => 'Halion an mga titulo sa pigbabantayan',
-'watchlistedit-normal-explain' => 'Mahihiling sa babâ an mga titulo na nasa pigbabantayan mo.
-Tangarig maghalì nin titulo, markahan an kahon sa gilid kaini, dangan pindotón an Tangkasón an mga Titulo. Pwede mo man na [[Special:EditWatchlist/raw|hirahón an bàgong lista]].',
+'watchlistedit-normal-explain' => 'Mga sa saimong bantay-listahan ipinapahiling sa ibaba.
+Sa paghali nin sarong titutlo, -tsek an kahon kasunod kaini, asin i-klik an "{{int:Watchlistedit-normal-submit}}".
+Puwede ka man na [[Special:EditWatchlist/raw|magliwat kan temporaryong listahan]].',
 'watchlistedit-normal-submit' => 'Tangkasón an mga Titulo',
 'watchlistedit-normal-done' => 'Pigtangkas an {{PLURAL:$1|1 an titulo|$1 mga titulo}} sa saimong pigbabantayan:',
 'watchlistedit-raw-title' => 'Hirahón an bàgong pigbabantayan',
@@ -1956,20 +3347,139 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
 'watchlisttools-edit' => 'Hilingón asin ligwatón an pigbabantayan',
 'watchlisttools-raw' => 'Hirahón an bàgong pigbabantayan',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|olay]])',
+
+# Core parser functions
+'unknown_extension_tag' => 'Bakong bistadong ekstensyon nin pagmarka "$1"',
+'duplicate-defaultsort' => '\'\'\'Patanid tabi:\'\'\' An susing panugmad kan salansan na "$2" minasalimbaw sa dating susing panugmad kan salansan na "$1".',
+
 # Special:Version
 'version' => 'Bersyon',
+'version-extensions' => 'Instaladong mga ekstensyon',
+'version-specialpages' => 'Espesyal na mga pahina',
+'version-parserhooks' => 'Mga pangawil kan parser',
+'version-variables' => 'Mga kabalanggayahan',
+'version-antispam' => 'Pan-spam na pangataman',
+'version-skins' => 'Mga kublit',
+'version-other' => 'An iba pa',
+'version-mediahandlers' => 'Mga Midyang Tagakapot',
+'version-hooks' => 'Mga pangawil',
+'version-extension-functions' => 'Mga punksyon kan ekstensyon',
+'version-parser-extensiontags' => 'Mga ekstensyong panmarka kan Parser',
+'version-parser-function-hooks' => 'Mga panpunksyong pangawil kan Parser',
+'version-hook-name' => 'Ngaran kan pangawil',
+'version-hook-subscribedby' => 'Pinaghaguhot ni',
+'version-version' => '(Bersyon na $1)',
+'version-license' => 'Lisensiya',
+'version-poweredby-credits' => "An wiking ini pinagpagana kan '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => '[{{SERVER}}{{SCRIPTPATH}}/CREDITS mga iba pa]',
+'version-license-info' => 'An MediaWiki sarong libreng kasungatan; puwede mong ipanao ini asin/o baguhon ini sa irarom kan termino nin HNU (Heneral na Pampublikong Lisensiya) bilang publisado kan Free Software Foundation; maski sa arin na bersyon 2 kan lisensiya, o (saimong pansadireng pagpipilian) arinman na huring bersyon.
+
+An MediaWiki ipinagpanao sa paglaom na ini magigin kapakinabangan, pero MAYO NIN ANUMAN NA WARANTIYA; mayo dawa ngani nin pinaghuhurot na warantiya kan MERKANTIBILIDAD o KAUYUGAN PARA SA SARONG PARTIKULAR NA KATUYUHAN. Hilngon an HNU (Heneral na Pampublikong Lisensiya) para sa kadagdagang mga detalye.
+
+Ika dapat na nakapagresibe na kan [{{SERVER}}{{SCRIPTPATH}}/COPYING sarong kopya nin HNU Heneral na Pampublikong Lisensiya] na kaiba kaining programa; kun dae, surati an Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o baya [//www.gnu.org/licenses/old-licenses/gpl-2.0.html online ining basahon].',
+'version-software' => 'Instalyadong kasungatan',
+'version-software-product' => 'Produkto',
+'version-software-version' => 'Bersyon',
+'version-entrypoints' => 'Puntong pan-entrada sa mga kilyawan',
+'version-entrypoints-header-entrypoint' => 'Puntong pan-entrada',
+'version-entrypoints-header-url' => 'Kilyawan',
+
+# Special:FilePath
+'filepath' => 'Pansagunsong agihan',
+'filepath-page' => 'Sagunson:',
+'filepath-submit' => 'Magduman',
+'filepath-summary' => 'Ining espesyal na pahina minapabalik kan kumpletong agihan para sa sarong sagunson.
+Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunson pinagpapoon nin direkta kan saindang asosyadong programa.',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Maghanap kan duplikadong mga sagunson',
+'fileduplicatesearch-summary' => 'Maghanap kan duplikadong mga sagunson na pinagbasihan an mga kahalagahan nin hash.',
+'fileduplicatesearch-legend' => 'Maghanap kan sarong duplikado',
+'fileduplicatesearch-filename' => 'Ngaran nin sagunson:',
+'fileduplicatesearch-submit' => 'Maghanap',
+'fileduplicatesearch-info' => '$1 × $2 piksel<br />Sukol nin sagunson: $3<br />MIME tipo: $4',
+'fileduplicatesearch-result-1' => 'An sagunson "$1" mayo nin kaparehong duplikasyon.',
+'fileduplicatesearch-result-n' => 'An sagunson "$1" igwa nin {{PLURAL:$2|1 kaparehong duplikasyon|$2 mga kaparehong duplikasyon}}.',
+'fileduplicatesearch-noresults' => 'Mayong sagunson na pinagngaranan na "$1" an nanagboan.',
 
 # Special:SpecialPages
 'specialpages' => 'Mga espesyal na pahina',
+'specialpages-note' => '----
+* Normal espesyal na mga pahina.
+* <span class="mw-specialpagerestricted">Restriktadong espesyal na mga pahina.</span>',
+'specialpages-group-maintenance' => 'Mga talaan nin pagpangataman',
 'specialpages-group-other' => 'Iba pang mga espesyal na pahina',
-'specialpages-group-login' => 'Maglaóg/ maggíbo',
+'specialpages-group-login' => 'Maglaog / magmukna nin panindog',
 'specialpages-group-changes' => 'Nakakaági pa sanáng mga pagbàgo asín laóg',
+'specialpages-group-media' => 'Mga talaan sa midya asin mga ikinarga',
+'specialpages-group-users' => 'Mga paragamit asin mga karapatan',
+'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-redirects' => 'Panukdo sa espesyal na mga pahina',
+'specialpages-group-spam' => 'Pan-spam na mga kagamitan',
 
 # Special:BlankPage
 'blankpage' => 'Blangkong pahina',
 'intentionallyblankpage' => 'Pigtuyong blangko an pahinang ini',
 
+# External image whitelist
+'external_image_whitelist' => '#Bayai ining linya eksaktong siring man sana kaini<pre>
+#Magkaag nin regular na mga panambitong parasa (idto sanang parte na minauyon sa tahaw kan //) na yaon sa ibaba
+#An mga ini paglalangkapon kaiba an mga kilyawan kan panluwas (hotlinked) na mga imahe
+#Idtong nagkaralangkap ipagpapahiling bilang mga imahe, o baya an sarong sugpon sana pasiring sa imahe an ipagpapahiling
+#Mga linya na nagpopoon sa # pagtatrataron bilang mga komento
+#Ini baya bakong sensitibo sa tipahan
+
+#Ikaag an gabos na parasang regex sa ibabaw kaining linya. Bayai ining linya eksaktong siring man sana kaini.</pre>',
+
 # Special:Tags
+'tags' => 'Balidong mga marka nin kaliwatan',
+'tag-filter' => '[[Special:Tags|Tag]] saraon:',
+'tag-filter-submit' => 'Saraan',
+'tags-title' => 'Mga marka',
+'tags-intro' => 'Ining pahina minalista kan mga marka na an kasungatan mapuwedeng maimarka an pagliwat kaini, asin an saindang mga kahulugan.',
+'tags-tag' => 'Ngarang panmarka',
+'tags-display-header' => 'Kinaluwasan sa listahan nin kaliwatan',
+'tags-description-header' => 'Bilog na deskripsyon nin kahulugan',
+'tags-hitcount-header' => 'Pinagmarkahan na mga kaliwatan',
 'tags-edit' => 'liwatón',
+'tags-hitcount' => '$1 {{PLURAL:$1|kaliwatan|mga kaliwatan}}',
+
+# Special:ComparePages
+'comparepages' => 'Ikumpara an mga pahina',
+'compare-selector' => 'Ikumpara an mga rebisyon nin pahina',
+'compare-page1' => 'Pahina 1',
+'compare-page2' => 'Pahina 2',
+'compare-rev1' => 'Rebisyon 1',
+'compare-rev2' => 'Rebisyon 2',
+'compare-submit' => 'Ikumpara',
+'compare-invalid-title' => 'An titulo na saimong pinagsambit sarong imbalido.',
+'compare-title-not-exists' => 'An titulo na saimong pinagsambit bakong eksistido.',
+'compare-revision-not-exists' => 'An rebisyon na saimong pinagsambit bakong eksistido.',
+
+# Database error messages
+'dberr-header' => 'Ining wiki igwa nin sarong problema',
+'dberr-problems' => 'Sori!
+Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.',
+'dberr-again' => 'Prubaring maghalat tabi nin nagkapirang minutos asin otrohon ikarga.',
+'dberr-info' => '(Dae makakontak sa serbidor kan datos-sarayan: $1)',
+'dberr-usegoogle' => 'Ika puwedeng magprubar na maghanap sa Google nguna.',
+'dberr-outofdate' => 'Pasinon mo tabi na an saindang mga indekso kan satuyang laog puwedeng luwas na sa petsa.',
+'dberr-cachederror' => 'Ini sarong nakasaray na kopya kan pinaghahagad na pahina, asin puwedeng bakong angat sa petsa.',
+
+# HTML forms
+'htmlform-invalid-input' => 'Igwa nin mga problema an iba sa saimong pinaglaog',
+'htmlform-select-badoption' => 'An halaga na saimong pinagsambit bakong saro sa balidong pagpipilian.',
+'htmlform-int-invalid' => 'An halaga na saimong pinagsambit bako na sarong integer.',
+'htmlform-float-invalid' => 'An halaga na saimong pinagsamit bako na sarong numero.',
+'htmlform-int-toolow' => 'An halaga na saimong pinagsambit hababaon sa minimum na $1',
+'htmlform-int-toohigh' => 'An halaga na saimong pinagsambit halangkawon sa maksimum na $1',
+'htmlform-required' => 'Ining halaga pinaghahagad',
+'htmlform-submit' => 'Sumitiron',
+'htmlform-reset' => 'Dae idagos an mga kaliwatan',
 
 );
index abc9f75..69f2853 100644 (file)
@@ -68,14 +68,14 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'img_thumbnail'           => array( '1', 'міні', 'мініяцюра', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'міні=$1', 'мініяцюра=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'справа', 'right' ),
-       'img_left'                => array( '1', 'злева', 'left' ),
-       'img_none'                => array( '1', 'няма', 'none' ),
-       'img_width'               => array( '1', '$1пкс', '$1px' ),
-       'img_center'              => array( '1', 'цэнтр', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'безрамкі', 'framed', 'enframed', 'frame' ),
+       'img_thumbnail'             => array( '1', 'міні', 'мініяцюра', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'міні=$1', 'мініяцюра=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'злева', 'left' ),
+       'img_none'                  => array( '1', 'няма', 'none' ),
+       'img_width'                 => array( '1', '$1пкс', '$1px' ),
+       'img_center'                => array( '1', 'цэнтр', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'безрамкі', 'framed', 'enframed', 'frame' ),
 );
 
 # Per discussion on http://translatewiki.net/wiki/Thread:Support/Customization_of number format
@@ -128,7 +128,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Без паказу правак удзельнікаў з ліку назіранага',
 'tog-watchlisthideanons' => 'Без паказу ананімных правак з ліку назіранага',
 'tog-watchlisthidepatrolled' => 'Без паказу ўхваленых правак у пераліку назіранага',
-'tog-nolangconversion' => 'Выключыць пераўтварэнні варыянтаў',
 'tog-ccmeonemails' => 'Слаць мне копіі маіх лістоў',
 'tog-diffonly' => 'Не паказваць рэшты старонкі пад розніцай',
 'tog-showhiddencats' => 'Паказаць схаваныя катэгорыі',
@@ -1417,9 +1416,9 @@ $1",
 Прагляд або пошук раней укладзенага [[Special:FileList|робіцца тут]]; апроч таго, усе ўкладанні і сціранні адзначаюцца ў журналах [[Special:Log/upload|укладання]] і [[Special:Log/delete|сцірання]], адпаведна.
 
 Каб уставіць файл ў старонку, ужываецца спасылка, зробленая адным з наступных спосабаў:
-* '''<tt><nowiki>[[</nowiki>image<nowiki>:File.jpg]]</nowiki></tt>''' паказвае файл у поўным памеры
-*  '''<tt><nowiki>[[</nowiki>image<nowiki>:File.png|200px|thumb|left|тлумачальны тэкст]]</nowiki></tt>''' паказвае файл, маштабаваны да шырыні 200 кропак, у рамцы, змешчанай злева, і з 'тлумачальным тэкстам' у якасці подпісу
-* '''<tt><nowiki>[[</nowiki>media<nowiki>:File.ogg]]</nowiki></tt>''' не паказвае самога файла, а толькі спасылку на яго",
+* '''<code><nowiki>[[</nowiki>image<nowiki>:File.jpg]]</nowiki></code>''' паказвае файл у поўным памеры
+*  '''<code><nowiki>[[</nowiki>image<nowiki>:File.png|200px|thumb|left|тлумачальны тэкст]]</nowiki></code>''' паказвае файл, маштабаваны да шырыні 200 кропак, у рамцы, змешчанай злева, і з 'тлумачальным тэкстам' у якасці подпісу
+* '''<code><nowiki>[[</nowiki>media<nowiki>:File.ogg]]</nowiki></code>''' не паказвае самога файла, а толькі спасылку на яго",
 'upload-permitted' => 'Дазволеныя тыпы файлаў: $1.',
 'upload-preferred' => 'Больш прыймальныя тыпы файлаў: $1.',
 'upload-prohibited' => 'Забароненыя тыпы файлаў: $1.',
@@ -1461,19 +1460,19 @@ $1",
 'largefileserver' => "Гэты файл большага аб'ёму, чым дазваляе канфігурацыя сервера.",
 'emptyfile' => 'Здаецца, што файл, укладзены вамі, пусты. Магчыма, здарылася памылка ў назве файла? Праверце, ці вы сапраўды хацелі ўкласці менавіта гэты файл.',
 'windows-nonascii-filename' => 'Дадзеная вікі не падтрымлівае імёны файлаў са спецыяльнымі знакамі.',
-'fileexists' => "Ужо існуе файл з такою назвай, праверце '''<tt>[[:$1]]</tt>''', калі не ўпэўнены, што жадаеце мяняць яго змесціва.
-[[$1|thumb]]",
-'filepageexists' => "Для файла з такой назвай існуе старонка апісання '''<tt>[[:$1]]</tt>''', але сам файл зараз не існуе.
+'fileexists' => 'Ужо існуе файл з такою назвай, праверце <strong>[[:$1]]</strong>, калі не ўпэўнены, што жадаеце мяняць яго змесціва.
+[[$1|thumb]]',
+'filepageexists' => "Для файла з такой назвай існуе старонка апісання <strong>[[:$1]]</strong>, але сам файл зараз не існуе.
 Таму вашае апісанне не з'явіцца на адпаведнай старонцы, пакуль вы самастойна яе не паправіце.
 [[$1|thumb]]",
-'fileexists-extension' => "Ужо ёсць файл з падобнай назвай: [[$2|thumb]]
-* Назва ўкладанага файла: '''<tt>[[:$1]]</tt>'''
-* Назва наяўнага файла: '''<tt>[[:$2]]</tt>'''
-Выберыце іншую назву.",
+'fileexists-extension' => 'Ужо ёсць файл з падобнай назвай: [[$2|thumb]]
+* Назва ўкладанага файла: <strong>[[:$1]]</strong>
+* Назва наяўнага файла: <strong>[[:$2]]</strong>
+Выберыце іншую назву.',
 'fileexists-thumbnail-yes' => "Файл падобны на выяву скарочанага памеру ''(драбніца)''. [[$1|thumb]]
-Праверце файл '''<tt>[[:$1]]</tt>'''.
+Праверце файл <strong>[[:$1]]</strong>.
 Калі правераны файл мае змест і памеры, аднолькавыя з гэтым, то дадатковае ўкладанне драбніцы непатрэбнае.",
-'file-thumbnail-no' => "Назва файла пачынаецца з '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Назва файла пачынаецца з <strong>$1</strong>.
 Так можа называцца выява зменшанага памеру ''(драбніца)''.
 Калі гэтая выява сапраўды запісаная ў найлепшым разрозненні, якое ёсць, то ўкладайце яе, а іначай лепей памяняць назву файла.",
 'fileexists-forbidden' => 'Файл з такой назвай ужо ёсць, і нельга запісаць паўзверх яго. Калі вы жадаеце абавязкова ўкласці свой файл, то выберыце новую назву. [[File:$1|thumb|center|$1]]',
@@ -1698,7 +1697,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'Пошук паводле зместу файла',
-'mimesearch-summary' => 'Старонка дазваляе прасейваць файлы ў залежнасці ад іх тыпаў MIME. Фармат уводу: contenttype/subtype, напр., <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Старонка дазваляе прасейваць файлы ў залежнасці ад іх тыпаў MIME. Фармат уводу: contenttype/subtype, напр., <code>image/jpeg</code>.',
 'mimetype' => 'Тып MIME:',
 'download' => 'узяць сабе',
 
@@ -1891,7 +1890,7 @@ $1',
 'linksearch-ok' => 'Знайсці',
 'linksearch-text' => 'Можна выкарыстоўваць падстаноўныя сімвалы, напрыклад, <code>*.wikipedia.org</code>.
 Неабходзен прынамсі дамен верхняга ўзроўня, напрыклад <code>*.org</code><br />
-Пратаколы, якія падтрымліваюцца: <tt>$1</tt> (не дадаваць любы з іх у вашым пошуку)',
+Пратаколы, якія падтрымліваюцца: <code>$1</code> (не дадаваць любы з іх у вашым пошуку)',
 'linksearch-line' => '$1, на які спасылаецца $2',
 'linksearch-error' => 'Узоры можна ставіць толькі ў пачатак адрасу.',
 
@@ -2718,15 +2717,10 @@ $1',
 # Info page
 'pageinfo-title' => 'Інфармацыя для "$1"',
 'pageinfo-header-edits' => 'Змены',
-'pageinfo-header-watchlist' => 'Спіс назіранага',
-'pageinfo-header-views' => 'Прагляды',
-'pageinfo-subjectpage' => 'Старонка',
-'pageinfo-talkpage' => 'Старонка размоў',
+'pageinfo-views' => 'Колькасць праглядаў',
 'pageinfo-watchers' => 'Колькасць назіральнікаў',
 'pageinfo-edits' => 'Колькасць правак:',
 'pageinfo-authors' => 'Колькасць розных аўтараў',
-'pageinfo-views' => 'Колькасць праглядаў',
-'pageinfo-viewsperedit' => 'Колькасць паказаў на 1 праўку',
 
 # Skin names
 'skinname-standard' => 'Класіка',
@@ -3571,6 +3565,7 @@ MediaWiki распаўсюджваецца, спадзеючыся на прыд
 'api-error-file-too-large' => 'Дасланы Вамі файл занадта вялікі.',
 'api-error-filename-tooshort' => 'Імя файла занадта кароткае.',
 'api-error-filetype-banned' => 'Гэты тып файлаў забаронены.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|належыць да недазволенага тыпу файлаў|належаць да недазволеных тыпаў файлаў}}. Пералік дазволеных тыпаў складаецца з {{PLURAL:$3|тыпа|тыпаў}}: $2.',
 'api-error-filetype-missing' => 'У файла няма пашырэння.',
 'api-error-hookaborted' => 'Прапанаванае вамі змяненне было адменена ў апрацоўшчыку пашырэння.',
 'api-error-http' => 'Унутраная памылка: немагчыма далучыцца да сервера.',
index fc00a41..de1217d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Belarusian (TaraÅ¡kievica orthography) (â\80ªÐ\91еларуская (тарашкевіца)‬)
+/** Belarusian (TaraÅ¡kievica orthography) (â\80ªÐ±еларуская (тарашкевіца)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -39,121 +39,121 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#перанакіраваньне', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__БЯЗЬ_ЗЬМЕСТУ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__БЕЗ_ГАЛЕРЭІ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ЗЬМЕСТ_ПРЫМУСАМ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ЗЬМЕСТ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__БЕЗ_РЭДАГАВАНЬНЯ_СЭКЦЫІ__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'БЯГУЧЫ_МЕСЯЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'НАЗВА_БЯГУЧАГА_МЕСЯЦА', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'НАЗВА_БЯГУЧАГА_МЕСЯЦА_Ў_РОДНЫМ_СКЛОНЕ', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'СКАРОЧАНАЯ_НАЗВА_БЯГУЧАГА_МЕСЯЦА', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'БЯГУЧЫ_ДЗЕНЬ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'БЯГУЧЫ_ДЗЕНЬ_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'НАЗВА_БЯГУЧАГА_ДНЯ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'БЯГУЧЫ_ГОД', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'БЯГУЧЫ_ЧАС', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'БЯГУЧАЯ_ГАДЗІНА', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ЛЯКАЛЬНЫ_МЕСЯЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'НАЗВА_ЛЯКАЛЬНАГА_МЕСЯЦА', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'НАЗВА_ЛЯКАЛЬНАГА_МЕСЯЦА_Ў_РОДНЫМ_СКЛОНЕ', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'СКАРОЧАНАЯ_НАЗВА_ЛЯКАЛЬНАГА_МЕСЯЦА', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ЛЯКАЛЬНЫ_ДЗЕНЬ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ЛЯКАЛЬНЫ_ДЗЕНЬ_2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'НАЗВА_ЛЯКАЛЬНАГА_ДНЯ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ЛЯКАЛЬНЫ_ГОД', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ЛЯКАЛЬНЫ_ЧАС', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ЛЯКАЛЬНАЯ_ГАДЗІНА', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'КОЛЬКАСЬЦЬ_СТАРОНАК', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'КОЛЬКАСЬЦЬ_АРТЫКУЛАЎ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'КОЛЬКАСЬЦЬ_ФАЙЛАЎ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'КОЛЬКАСЬЦЬ_УДЗЕЛЬНІКАЎ', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'КОЛЬКАСЬЦЬ_АКТЫЎНЫХ_УДЗЕЛЬНІКАЎ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'КОЛЬКАСЬЦЬ_РЭДАГАВАНЬНЯЎ', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'КОЛЬКАСЬЦЬ_ПРАГЛЯДАЎ', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'НАЗВА_СТАРОНКІ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'НАЗВА_СТАРОНКІ_2', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ПРАСТОРА_НАЗВАЎ', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ПРАСТОРА_НАЗВАЎ_2', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ПРАСТОРА_НАЗВАЎ_АБМЕРКАВАНЬНЯ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ПРАСТОРА_НАЗВАЎ_АБМЕРКАВАНЬНЯ_2', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ПРАСТОРА_НАЗВАЎ_ПРАДМЕТУ', 'ПРАСТОРА_НАЗВАЎ_АРТЫКУЛА', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ПРАСТОРА_НАЗВАЎ_ПРАДМЕТУ_2', 'ПРАСТОРА_НАЗВАЎ_АРТЫКУЛА_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'ПОЎНАЯ_НАЗВА_СТАРОНКІ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ПОЎНАЯ_НАЗВА_СТАРОНКІ_2', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'НАЗВА_ПАДСТАРОНКІ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'НАЗВА_ПАДСТАРОНКІ_2', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'НАЗВА_БАЗАВАЙ_СТАРОНКІ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'НАЗВА_БАЗАВАЙ_СТАРОНКІ_2', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'НАЗВА_СТАРОНКІ_АБМЕРКАВАНЬНЯ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'НАЗВА_СТАРОНКІ_АБМЕРКАВАНЬНЯ_2', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'НАЗВА_СТАРОНКІ_ПРАДМЕТУ', 'НАЗВА_СТАРОНКІ_АРТЫКУЛА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'НАЗВА_СТАРОНКІ_ПРАДМЕТУ_2', 'НАЗВА_СТАРОНКІ_АРТЫКУЛА_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'ПАВЕДАМЛЕНЬНЕ:', 'MSG:' ),
-       'subst'                   => array( '0', 'ПАДСТАНОЎКА:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'ПАВЕДАМЛЕНЬНЕ_БЯЗЬ_ВІКІ:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'значак', 'міні', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'значак=$1', 'міні=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'справа', 'right' ),
-       'img_left'                => array( '1', 'зьлева', 'left' ),
-       'img_none'                => array( '1', 'няма', 'none' ),
-       'img_width'               => array( '1', '$1пкс', '$1px' ),
-       'img_center'              => array( '1', 'цэнтар', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'рамка', 'framed', 'enframed', 'frame' ),
-       'img_page'                => array( '1', 'старонка=$1', 'старонка $1', 'page=$1', 'page $1' ),
-       'img_top'                 => array( '1', 'зьверху', 'top' ),
-       'img_middle'              => array( '1', 'пасярэдзіне', 'middle' ),
-       'img_bottom'              => array( '1', 'зьнізу', 'bottom' ),
-       'img_link'                => array( '1', 'спасылка=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'НАЗВА_САЙТУ', 'SITENAME' ),
-       'ns'                      => array( '0', 'ПН:', 'NS:' ),
-       'localurl'                => array( '0', 'ЛЯКАЛЬНЫ_АДРАС:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ЛЯКАЛЬНЫ_АДРАС_2:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'СЭРВЭР', 'SERVER' ),
-       'servername'              => array( '0', 'НАЗВА_СЭРВЭРА', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ШЛЯХ_ДА_СКРЫПТА', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'ГРАМАТЫКА:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ПОЛ:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__НЕ_КАНВЭРТАВАЦЬ_НАЗВУ__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__НЕ_КАНВЭРТАВАЦЬ_ТЭКСТ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'БЯГУЧЫ_ТЫДЗЕНЬ', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'БЯГУЧЫ_ДЗЕНЬ_ТЫДНЯ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'ЛЯКАЛЬНЫ_ТЫДЗЕНЬ', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ЛЯКАЛЬНЫ_ДЗЕНЬ_ТЫДНЯ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'ID_ВЭРСІІ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ДЗЕНЬ_ВЭРСІІ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ДЗЕНЬ_ВЭРСІІ_2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'МЕСЯЦ_ВЭРСІІ', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ГОД_ВЭРСІІ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'МОМАНТ_ЧАСУ_ВЭРСІІ', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'МНОЖНЫ_ЛІК:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'ПОЎНЫ_АДРАС:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'ПОЎНЫ_АДРАС_2:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'ПЕРШАЯ_ЛІТАРА_МАЛАЯ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ПЕРШАЯ_ЛІТАРА_ВЯЛІКАЯ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'МАЛЫМІ_ЛІТАРАМІ:', 'LC:' ),
-       'uc'                      => array( '0', 'ВЯЛІКІМІ_ЛІТАРАМІ:', 'UC:' ),
-       'raw'                     => array( '0', 'НЕАПРАЦАВАНЫ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ПАКАЗВАЦЬ_НАЗВУ', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'Н', 'R' ),
-       'newsectionlink'          => array( '1', '__СПАСЫЛКА_НА_НОВУЮ_СЭКЦЫЮ__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'БЯГУЧАЯ_ВЭРСІЯ', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'МОМАНТ_ЧАСУ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'ЛЯКАЛЬНЫ_МОМАНТ_ЧАСУ', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'СЫМБАЛЬ_НАПРАМКУ_ПІСЬМА', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#МОВА:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'МОВА_ЗЬМЕСТУ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'КОЛЬКАСЬЦЬ_СТАРОНАК_У_ПРАСТОРЫ_НАЗВАЎ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'КОЛЬКАСЬЦЬ_АДМІНІСТРАТАРАЎ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ФАРМАТАВАЦЬ_ЛІК', 'FORMATNUM' ),
-       'defaultsort'             => array( '1', 'САРТЫРОЎКА_ПА_ЗМОЎЧВАНЬНІ:', 'КЛЮЧ_САРТЫРОЎКІ_ПА_ЗМОЎЧВАНЬНІ:', 'САРТЫРОЎКА_Ў_КАТЭГОРЫІ_ПА_ЗМОЎЧВАНЬНІ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ШЛЯХ_ДА_ФАЙЛА:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'тэг', 'tag' ),
-       'hiddencat'               => array( '1', '__СХАВАЦЬ_КАТЭГОРЫЮ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'КОЛЬКАСЬЦЬ_СТАРОНАК_У_КАТЭГОРЫІ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'ПАМЕР_СТАРОНКІ', 'PAGESIZE' ),
-       'staticredirect'          => array( '1', '__СТАТЫЧНАЕ_ПЕРАНАКІРАВАНЬНЕ__', '__STATICREDIRECT__' ),
+       'redirect'                  => array( '0', '#перанакіраваньне', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__БЯЗЬ_ЗЬМЕСТУ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__БЕЗ_ГАЛЕРЭІ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ЗЬМЕСТ_ПРЫМУСАМ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ЗЬМЕСТ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__БЕЗ_РЭДАГАВАНЬНЯ_СЭКЦЫІ__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'БЯГУЧЫ_МЕСЯЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'НАЗВА_БЯГУЧАГА_МЕСЯЦА', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'НАЗВА_БЯГУЧАГА_МЕСЯЦА_Ў_РОДНЫМ_СКЛОНЕ', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'СКАРОЧАНАЯ_НАЗВА_БЯГУЧАГА_МЕСЯЦА', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'БЯГУЧЫ_ДЗЕНЬ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'БЯГУЧЫ_ДЗЕНЬ_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'НАЗВА_БЯГУЧАГА_ДНЯ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'БЯГУЧЫ_ГОД', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'БЯГУЧЫ_ЧАС', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'БЯГУЧАЯ_ГАДЗІНА', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ЛЯКАЛЬНЫ_МЕСЯЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'НАЗВА_ЛЯКАЛЬНАГА_МЕСЯЦА', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'НАЗВА_ЛЯКАЛЬНАГА_МЕСЯЦА_Ў_РОДНЫМ_СКЛОНЕ', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'СКАРОЧАНАЯ_НАЗВА_ЛЯКАЛЬНАГА_МЕСЯЦА', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ЛЯКАЛЬНЫ_ДЗЕНЬ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ЛЯКАЛЬНЫ_ДЗЕНЬ_2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'НАЗВА_ЛЯКАЛЬНАГА_ДНЯ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ЛЯКАЛЬНЫ_ГОД', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ЛЯКАЛЬНЫ_ЧАС', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ЛЯКАЛЬНАЯ_ГАДЗІНА', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'КОЛЬКАСЬЦЬ_СТАРОНАК', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'КОЛЬКАСЬЦЬ_АРТЫКУЛАЎ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'КОЛЬКАСЬЦЬ_ФАЙЛАЎ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'КОЛЬКАСЬЦЬ_УДЗЕЛЬНІКАЎ', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'КОЛЬКАСЬЦЬ_АКТЫЎНЫХ_УДЗЕЛЬНІКАЎ', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'КОЛЬКАСЬЦЬ_РЭДАГАВАНЬНЯЎ', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'КОЛЬКАСЬЦЬ_ПРАГЛЯДАЎ', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'НАЗВА_СТАРОНКІ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'НАЗВА_СТАРОНКІ_2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ПРАСТОРА_НАЗВАЎ', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ПРАСТОРА_НАЗВАЎ_2', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ПРАСТОРА_НАЗВАЎ_АБМЕРКАВАНЬНЯ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ПРАСТОРА_НАЗВАЎ_АБМЕРКАВАНЬНЯ_2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ПРАСТОРА_НАЗВАЎ_ПРАДМЕТУ', 'ПРАСТОРА_НАЗВАЎ_АРТЫКУЛА', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ПРАСТОРА_НАЗВАЎ_ПРАДМЕТУ_2', 'ПРАСТОРА_НАЗВАЎ_АРТЫКУЛА_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ПОЎНАЯ_НАЗВА_СТАРОНКІ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ПОЎНАЯ_НАЗВА_СТАРОНКІ_2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'НАЗВА_ПАДСТАРОНКІ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'НАЗВА_ПАДСТАРОНКІ_2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'НАЗВА_БАЗАВАЙ_СТАРОНКІ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'НАЗВА_БАЗАВАЙ_СТАРОНКІ_2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'НАЗВА_СТАРОНКІ_АБМЕРКАВАНЬНЯ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'НАЗВА_СТАРОНКІ_АБМЕРКАВАНЬНЯ_2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'НАЗВА_СТАРОНКІ_ПРАДМЕТУ', 'НАЗВА_СТАРОНКІ_АРТЫКУЛА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'НАЗВА_СТАРОНКІ_ПРАДМЕТУ_2', 'НАЗВА_СТАРОНКІ_АРТЫКУЛА_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'ПАВЕДАМЛЕНЬНЕ:', 'MSG:' ),
+       'subst'                     => array( '0', 'ПАДСТАНОЎКА:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'ПАВЕДАМЛЕНЬНЕ_БЯЗЬ_ВІКІ:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'значак', 'міні', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'значак=$1', 'міні=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'зьлева', 'left' ),
+       'img_none'                  => array( '1', 'няма', 'none' ),
+       'img_width'                 => array( '1', '$1пкс', '$1px' ),
+       'img_center'                => array( '1', 'цэнтар', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'рамка', 'framed', 'enframed', 'frame' ),
+       'img_page'                  => array( '1', 'старонка=$1', 'старонка $1', 'page=$1', 'page $1' ),
+       'img_top'                   => array( '1', 'зьверху', 'top' ),
+       'img_middle'                => array( '1', 'пасярэдзіне', 'middle' ),
+       'img_bottom'                => array( '1', 'зьнізу', 'bottom' ),
+       'img_link'                  => array( '1', 'спасылка=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'НАЗВА_САЙТУ', 'SITENAME' ),
+       'ns'                        => array( '0', 'ПН:', 'NS:' ),
+       'localurl'                  => array( '0', 'ЛЯКАЛЬНЫ_АДРАС:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ЛЯКАЛЬНЫ_АДРАС_2:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'СЭРВЭР', 'SERVER' ),
+       'servername'                => array( '0', 'НАЗВА_СЭРВЭРА', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ШЛЯХ_ДА_СКРЫПТА', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'ГРАМАТЫКА:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ПОЛ:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__НЕ_КАНВЭРТАВАЦЬ_НАЗВУ__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__НЕ_КАНВЭРТАВАЦЬ_ТЭКСТ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'БЯГУЧЫ_ТЫДЗЕНЬ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'БЯГУЧЫ_ДЗЕНЬ_ТЫДНЯ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'ЛЯКАЛЬНЫ_ТЫДЗЕНЬ', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ЛЯКАЛЬНЫ_ДЗЕНЬ_ТЫДНЯ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'ID_ВЭРСІІ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ДЗЕНЬ_ВЭРСІІ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ДЗЕНЬ_ВЭРСІІ_2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'МЕСЯЦ_ВЭРСІІ', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ГОД_ВЭРСІІ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'МОМАНТ_ЧАСУ_ВЭРСІІ', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'МНОЖНЫ_ЛІК:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'ПОЎНЫ_АДРАС:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ПОЎНЫ_АДРАС_2:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'ПЕРШАЯ_ЛІТАРА_МАЛАЯ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ПЕРШАЯ_ЛІТАРА_ВЯЛІКАЯ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'МАЛЫМІ_ЛІТАРАМІ:', 'LC:' ),
+       'uc'                        => array( '0', 'ВЯЛІКІМІ_ЛІТАРАМІ:', 'UC:' ),
+       'raw'                       => array( '0', 'НЕАПРАЦАВАНЫ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ПАКАЗВАЦЬ_НАЗВУ', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'Н', 'R' ),
+       'newsectionlink'            => array( '1', '__СПАСЫЛКА_НА_НОВУЮ_СЭКЦЫЮ__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'БЯГУЧАЯ_ВЭРСІЯ', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'МОМАНТ_ЧАСУ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'ЛЯКАЛЬНЫ_МОМАНТ_ЧАСУ', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'СЫМБАЛЬ_НАПРАМКУ_ПІСЬМА', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#МОВА:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'МОВА_ЗЬМЕСТУ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'КОЛЬКАСЬЦЬ_СТАРОНАК_У_ПРАСТОРЫ_НАЗВАЎ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'КОЛЬКАСЬЦЬ_АДМІНІСТРАТАРАЎ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ФАРМАТАВАЦЬ_ЛІК', 'FORMATNUM' ),
+       'defaultsort'               => array( '1', 'САРТЫРОЎКА_ПА_ЗМОЎЧВАНЬНІ:', 'КЛЮЧ_САРТЫРОЎКІ_ПА_ЗМОЎЧВАНЬНІ:', 'САРТЫРОЎКА_Ў_КАТЭГОРЫІ_ПА_ЗМОЎЧВАНЬНІ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ШЛЯХ_ДА_ФАЙЛА:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'тэг', 'tag' ),
+       'hiddencat'                 => array( '1', '__СХАВАЦЬ_КАТЭГОРЫЮ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'КОЛЬКАСЬЦЬ_СТАРОНАК_У_КАТЭГОРЫІ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'ПАМЕР_СТАРОНКІ', 'PAGESIZE' ),
+       'staticredirect'            => array( '1', '__СТАТЫЧНАЕ_ПЕРАНАКІРАВАНЬНЕ__', '__STATICREDIRECT__' ),
 );
 
 $namespaceNames = array(
@@ -261,7 +261,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Хаваць патруляваныя зьмены ў сьпісе апошніх зьменаў',
 'tog-newpageshidepatrolled' => 'Хаваць правераныя старонкі ў сьпісе новых старонак',
 'tog-extendwatchlist' => 'Пашырыць сьпіс назіраньня, каб ён паказваў усе зьмены, а ня толькі апошнія',
-'tog-usenewrc' => 'Ð\92Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c Ñ\83даÑ\81каналенÑ\8b Ñ\81Ñ\8cпÑ\96Ñ\81 Ð°Ð¿Ð¾Ñ\88нÑ\96Ñ\85 Ð·Ñ\8cменаў (патрабуе JavaScript)',
+'tog-usenewrc' => 'Ð\93Ñ\80Ñ\83паваÑ\86Ñ\8c Ð·Ñ\8cменÑ\8b Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\9e Ñ\81Ñ\8cпÑ\96Ñ\81аÑ\85 Ð°Ð¿Ð¾Ñ\88нÑ\96Ñ\85 Ð·Ñ\8cменаÑ\9e Ñ\96 Ð½Ð°Ð·Ñ\96Ñ\80анÑ\8cнÑ\8fў (патрабуе JavaScript)',
 'tog-numberheadings' => 'Аўтаматычная нумарацыя загалоўкаў',
 'tog-showtoolbar' => 'Паказваць панэль інструмэнтаў рэдагаваньня (патрабуе JavaScript)',
 'tog-editondblclick' => 'Рэдагаваць старонкі па падвойным пстрыку (JavaScript)',
@@ -269,17 +269,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Рэдагаваць сэкцыі па правым пстрыку на загалоўку (патрабуе JavaScript)',
 'tog-showtoc' => 'Паказваць зьмест (для старонак з колькасьцю сэкцый болей за 3)',
 'tog-rememberpassword' => 'Запомніць мяне ў гэтым браўзэры (ня больш за $1 {{PLURAL:$1|дзень|дні|дзён}})',
-'tog-watchcreations' => 'Ð\94адаваÑ\86Ñ\8c Ñ\83 Ð¼Ð¾Ð¹ Ñ\81Ñ\8cпÑ\96Ñ\81 Ð½Ð°Ð·Ñ\96Ñ\80анÑ\8cнÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\8f Ð±Ñ\83дÑ\83 Ñ\81Ñ\82ваÑ\80аÑ\86Ñ\8c',
-'tog-watchdefault' => 'Дадаваць у мой сьпіс назіраньня старонкі, якія я буду рэдагаваць',
-'tog-watchmoves' => 'Дадаваць у мой сьпіс назіраньня старонкі, якія я буду пераносіць',
-'tog-watchdeletion' => 'Дадаваць у мой сьпіс назіраньня старонкі, якія я буду выдаляць',
+'tog-watchcreations' => 'Ð\94адаваÑ\86Ñ\8c Ñ\83 Ð¼Ð¾Ð¹ Ñ\81Ñ\8cпÑ\96Ñ\81 Ð½Ð°Ð·Ñ\96Ñ\80анÑ\8cнÑ\8f Ñ\81Ñ\82воÑ\80анÑ\8bÑ\8f Ð¼Ð½Ð¾Ð¹ Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\96 Ð·Ð°Ð³Ñ\80Ñ\83жанÑ\8bÑ\8f Ð¼Ð½Ð¾Ð¹ Ñ\84айлÑ\8b',
+'tog-watchdefault' => 'Дадаваць у мой сьпіс назіраньня старонкі і файлы якія я рэдагаваў',
+'tog-watchmoves' => 'Дадаваць у мой сьпіс назіраньня старонкі і файлы якія я пераносіў',
+'tog-watchdeletion' => 'Дадаваць у мой сьпіс назіраньня старонкі і файлы, якія я выдаляю',
 'tog-minordefault' => 'Па змоўчаньні пазначаць усе зьмены дробнымі',
 'tog-previewontop' => 'Паказваць папярэдні прагляд старонкі над полем рэдагаваньня',
 'tog-previewonfirst' => 'Папярэдні прагляд пры першым рэдагаваньні',
 'tog-nocache' => 'Адключыць кэшаваньне старонак у браўзэры',
-'tog-enotifwatchlistpages' => 'Паведамляць мне праз электронную пошту пра зьмены старонак у маім сьпісе назіраньня',
+'tog-enotifwatchlistpages' => 'Ð\9fаведамлÑ\8fÑ\86Ñ\8c Ð¼Ð½Ðµ Ð¿Ñ\80аз Ñ\8dлекÑ\82Ñ\80оннÑ\83Ñ\8e Ð¿Ð¾Ñ\88Ñ\82Ñ\83 Ð¿Ñ\80а Ð·Ñ\8cменÑ\8b Ñ\81Ñ\82аÑ\80онак Ñ\96 Ñ\84айлаÑ\9e Ñ\83 Ð¼Ð°Ñ\96м Ñ\81Ñ\8cпÑ\96Ñ\81е Ð½Ð°Ð·Ñ\96Ñ\80анÑ\8cнÑ\8f',
 'tog-enotifusertalkpages' => 'Паведамляць праз электронную пошту пра зьмены маёй старонкі гутарак',
-'tog-enotifminoredits' => 'Паведамляць праз электронную пошту таксама пра дробныя зьмены старонак',
+'tog-enotifminoredits' => 'Паведамляць праз электронную пошту таксама пра дробныя зьмены старонак і файлаў',
 'tog-enotifrevealaddr' => 'Не хаваць мой адрас электроннай пошты ў паведамленьнях',
 'tog-shownumberswatching' => 'Паказваць колькасьць назіральнікаў',
 'tog-oldsig' => 'Цяперашні подпіс:',
@@ -295,7 +295,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Хаваць праўкі зарэгістраваных удзельнікаў і ўдзельніц у сьпісе назіраньня',
 'tog-watchlisthideanons' => 'Хаваць праўкі ананімаў у сьпісе назіраньня',
 'tog-watchlisthidepatrolled' => 'Хаваць патруляваныя праўкі ў сьпісе назіраньня',
-'tog-nolangconversion' => 'Выключыць канвэртацыю сыстэмаў пісьма',
 'tog-ccmeonemails' => 'Дасылаць мне копіі лістоў, якія я дасылаю іншым удзельнікам і ўдзельніцам',
 'tog-diffonly' => 'Не паказваць зьмест старонкі пад параўнаньнем зьменаў',
 'tog-showhiddencats' => 'Паказваць схаваныя катэгорыі',
@@ -517,9 +516,13 @@ $1',
 'ok' => 'Добра',
 'pagetitle' => '$1 — {{SITENAME}}',
 'retrievedfrom' => 'Атрымана з «$1»',
-'youhavenewmessages' => 'Ð\92Ñ\8b Ð¼Ð°ÐµÑ\86е $1 ($2).',
+'youhavenewmessages' => 'Ð\92Ñ\8b Ð°Ñ\82Ñ\80Ñ\8bмалÑ\96 $1 ($2).',
 'newmessageslink' => 'новыя паведамленьні',
 'newmessagesdifflink' => 'апошняя зьмена',
+'youhavenewmessagesfromusers' => 'Вы атрымалі $1 ад {{PLURAL:$3|іншага ўдзельніка|$3 удзельнікаў}} ($2).',
+'youhavenewmessagesmanyusers' => 'Вы атрымалі $1 ад некалькіх удзельнікаў ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|новае паведамленьне|новыя паведамленьні}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|апошняя зьмена|апошнія зьмены}}',
 'youhavenewmessagesmulti' => 'Вы атрымалі новыя паведамленьні на $1',
 'editsection' => 'рэдагаваць',
 'editold' => 'рэдагаваць',
@@ -574,9 +577,9 @@ $1',
 'dberrortext' => 'Выяўленая памылка сынтаксісу ў звароце да базы зьвестак.
 Магчыма, гэта памылка праграмнага забесьпячэньня.
 Апошні запыт да базы:
-<blockquote><tt>$1</tt></blockquote>
-адбыўся з функцыі «<tt>$2</tt>».
-База зьвестак вярнула памылку «<tt>$3: $4</tt>».',
+<blockquote><code>$1</code></blockquote>
+адбыўся з функцыі «<code>$2</code>».
+База зьвестак вярнула памылку «<samp>$3: $4</samp>».',
 'dberrortextcl' => 'Выяўлена памылка сынтаксісу ў звароце да базы зьвестак.
 Апошні запыт да базы:
 «$1»
@@ -612,6 +615,8 @@ $1',
 'badarticleerror' => 'Гэтае дзеяньне немагчыма выканаць на гэтай старонцы.',
 'cannotdelete' => 'Немагчыма выдаліць старонку альбо файл «$1». Магчыма, яна ўжо выдаленая кімсьці іншым.',
 'cannotdelete-title' => 'Немагчыма выдаліць старонку «$1»',
+'delete-hook-aborted' => 'Выдаленьне скасаванае працэдурай-перахопнікам.
+Тлумачэньняў не было.',
 'badtitle' => 'Няслушная назва',
 'badtitletext' => 'Запытаная назва старонкі няслушная ці пустая, альбо няслушна ўказаная міжмоўная ці інтэрвікі-назва. Яна можа ўтрымліваць сымбалі, якія нельга ўжываць у назвах.',
 'perfcached' => 'Наступныя зьвесткі кэшаваныя і могуць быць састарэлымі. У кэшы {{PLURAL:$1|даступны|даступныя}} ня больш за $1 {{PLURAL:$1|вынік|вынікі|вынікаў}}.',
@@ -645,6 +650,8 @@ $2',
 Адміністратар, які абмежаваў доступ, пазначыў прычыну: «$3».',
 'invalidtitle-knownnamespace' => 'Няслушная назва ў прасторы «$2»: «$3»',
 'invalidtitle-unknownnamespace' => 'Няслушная назва ў невядомай прасторы $1: «$2»',
+'exception-nologin' => 'Вы не ўвайшлі ў сыстэму',
+'exception-nologin-text' => 'Гэтая старонка ці дзеяньне патрабуе, каб вы ўвайшлі ў сыстэму.',
 
 # Virus scanner
 'virus-badscanner' => "Няслушная канфігурацыя: невядомы антывірусны сканэр: ''$1''",
@@ -665,6 +672,7 @@ $2',
 'remembermypassword' => 'Запомніць мяне на гэтым кампутары (ня больш за $1 {{PLURAL:$1|дзень|дні|дзён}})',
 'securelogin-stick-https' => 'Утрымліваць злучэньне праз HTTPS пасьля ўваходу ў сыстэму',
 'yourdomainname' => 'Ваш дамэн:',
+'password-change-forbidden' => 'Вы ня можаце зьмяняць паролі ў гэтай вікі.',
 'externaldberror' => 'Адбылася памылка аўтэнтыфікацыі з дапамогай вонкавай базы зьвестак, ці Вам не дазволена абнаўляць свой рахунак.',
 'login' => 'Увайсьці',
 'nav-login-createaccount' => 'Уваход / стварэньне рахунку',
@@ -906,6 +914,10 @@ $2
 альбо [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} рэдагаваць гэтую старонку]</span>.',
 'noarticletext-nopermission' => 'Цяпер на гэтай старонцы тэкст адсутнічае.
 Вы можаце [[Special:Search/{{PAGENAME}}|пашукаць назву гэтай старонкі]] на іншых старонках, альбо <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пашукаць зьвязаныя запісы ў журналах]</span>.',
+'missing-revision' => 'Вэрсія старонкі №$1 з назвай «{{PAGENAME}}» не існуе.
+
+Звычайна гэта здараецца з-за перахода па састарэлай спасылцы на старонку, якая была выдаленая.
+Падрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].',
 'userpage-userdoesnotexist' => 'Рахунак удзельніка «<nowiki>$1</nowiki>» не зарэгістраваны. Калі ласка, удакладніце, ці жадаеце Вы стварыць/рэдагаваць гэтую старонку.',
 'userpage-userdoesnotexist-view' => 'Рахунак «$1» ня створаны.',
 'blocked-notice-logextract' => 'Гэты ўдзельнік у дадзены момант заблякаваны.
@@ -914,7 +926,6 @@ $2
 * '''Firefox / Safari:''' Трымайце ''Shift'' і націсьніце ''Reload'', ці націсьніце ''Ctrl-F5'' ці ''Ctrl-R'' (''⌘-R'' на Mac)
 * '''Google Chrome:''' Націсьніце ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)
 * '''Internet Explorer:''' Трымайце ''Ctrl'' і націсьніце ''Refresh'', ці націсьніце ''Ctrl-F5''
-* '''Konqueror:''' Націсьніце кнопку ''Reload'' ці ''F5''
 * '''Opera:''' Ачысьціце кэш праз ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Падказка:''' выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы код CSS перад тым як яго запісаць.",
 'userjsyoucanpreview' => "'''Падказка:''' выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы код JavaScript перад тым, як яго запісаць.",
@@ -1032,6 +1043,7 @@ $2
 'expansion-depth-exceeded-warning' => 'Старонка перавысіла дазволеную глыбіню ўключэньняў',
 'parser-unstrip-loop-warning' => 'Вызначаная незачыненая пятля',
 'parser-unstrip-recursion-limit' => 'Перавышанае абмежаваньне глыбіні рэкурсіі ($1)',
+'converter-manual-rule-error' => 'Знойдзеная памылка ў ручным правіле моўнага канвэртара',
 
 # "Undo" feature
 'undo-success' => 'Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.',
@@ -1218,6 +1230,10 @@ $1",
 'editundo' => 'скасаваць',
 'diff-multi' => '($1 {{PLURAL:$1|прамежная вэрсія|прамежныя вэрсіі|прамежных вэрсіяў}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказаная|не паказаныя|не паказаныя}})',
 'diff-multi-manyusers' => '($1 {{PLURAL:$1|прамежная вэрсія|прамежныя вэрсіі|прамежных вэрсіяў}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказаная|не паказаныя|не паказаныя}})',
+'difference-missing-revision' => '{{PLURAL:$2|Адна вэрсія|$2 вэрсіі}} з гэтымі адрозьненьнямі ($1) {{PLURAL:$2|не была|не былі}} знойдзеныя.
+
+Звычайна гэта здараецца з-за перахода па састарэлай спасылцы на старонку, якая была выдаленая.
+Падрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].',
 
 # Search results
 'searchresults' => 'Вынікі пошуку',
@@ -1485,6 +1501,7 @@ $1",
 'right-writeapi' => 'выкарыстаньне API для запісаў',
 'right-delete' => 'выдаленьне старонак',
 'right-bigdelete' => 'Выдаленьне старонак зь вялікімі гісторыямі',
+'right-deletelogentry' => 'Выдаленьне і аднаўленьне асобных запісаў журналу',
 'right-deleterevision' => 'выдаленьне і аднаўленьне асобных вэрсіяў старонак',
 'right-deletedhistory' => 'прагляд выдаленай гісторыі старонак без доступу да выдаленага тэксту',
 'right-deletedtext' => 'прагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак',
@@ -1629,9 +1646,9 @@ $1",
 Каб паглядзець ці адшукаць раней загружаныя файлы, глядзіце [[Special:FileList|сьпіс загружаных файлаў]], загрузкі таксама запісваюцца ў [[Special:Log/upload|журнал загрузак]], а выдаленьні — у [[Special:Log/delete|журнал выдаленьняў]].
 
 Каб улучыць файл у старонку, ужывайце адзін з наступных варыянтаў:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' для поўнай вэрсіі файла
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Подпіс да выявы]]</nowiki></tt>''' для выявы шырынёй 200 піксэляў у рамцы і тэкстам «Подпіс да выявы» ў якасьці подпісу
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' для простай спасылкі на файл безь яго адлюстраваньня.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' для поўнай вэрсіі файла
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Подпіс да выявы]]</nowiki></code>''' для выявы шырынёй 200 піксэляў у рамцы і тэкстам «Подпіс да выявы» ў якасьці подпісу
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' для простай спасылкі на файл безь яго адлюстраваньня.",
 'upload-permitted' => 'Дазволеныя тыпы файлаў: $1.',
 'upload-preferred' => 'Пажаданыя тыпы файлаў: $1.',
 'upload-prohibited' => 'Забароненыя тыпы файлаў: $1.',
@@ -1676,21 +1693,21 @@ $1",
 'emptyfile' => 'Загружаны файл, здаецца, пусты. Магчыма гэты адбылося з-за памылкі ў назьве файла.
 Удакладніце, ці Вы сапраўды жадаеце загрузіць гэты файл.',
 'windows-nonascii-filename' => '{{SITENAME}} не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.',
-'fileexists' => "Файл з такой назвай ужо існуе.
-Калі ласка, праверце '''<tt>[[:$1]]</tt>''', калі Вы ня ўпэўненыя, што жадаеце яго замяніць.
-[[$1|thumb]]",
-'filepageexists' => "Старонка апісаньня для гэтага файла ўжо існуе як '''<tt>[[:$1]]</tt>''', але файла з такой назвай няма.
+'fileexists' => 'Файл з такой назвай ужо існуе.
+Калі ласка, праверце <strong>[[:$1]]</strong>, калі Вы ня ўпэўненыя, што жадаеце яго замяніць.
+[[$1|thumb]]',
+'filepageexists' => 'Старонка апісаньня для гэтага файла ўжо існуе як <strong>[[:$1]]</strong>, але файла з такой назвай няма.
 Апісаньне якое Вы дадалі ня зьявіцца на старонцы апісаньня.
 Каб яно там зьявілася, Вам трэба рэдагаваць яе самастойна.
-[[$1|thumb]]",
-'fileexists-extension' => "Файл з падобнай назвай ужо існуе: [[$2|thumb]]
-* Назва загружанага файла: '''<tt>[[:$1]]</tt>'''
-* Назва існуючага файла: '''<tt>[[:$2]]</tt>'''
-Калі ласка, выбярыце іншую назву.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Файл з падобнай назвай ужо існуе: [[$2|thumb]]
+* Назва загружанага файла: <strong>[[:$1]]</strong>
+* Назва існуючага файла: <strong>[[:$2]]</strong>
+Калі ласка, выбярыце іншую назву.',
 'fileexists-thumbnail-yes' => "Верагодна файл зьяўляецца паменшанай копіяй ''(мініятурай)''. [[$1|thumb]]
-Калі ласка, праверце файл '''<tt>[[:$1]]</tt>'''.
+Калі ласка, праверце файл <strong>[[:$1]]</strong>.
 Калі правераны файл зьяўляецца той жа выявай, то загрузка мініятуры ня мае сэнсу.",
-'file-thumbnail-no' => "Назва файла пачынаецца з '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Назва файла пачынаецца з <strong>$1</strong>.
 Верагодна гэта паменшаная копія выявы ''(мініятура)''.
 Калі Вы маеце гэтую выяву ў поўным памеры, загрузіце яе, альбо зьмяніце назву файла.",
 'fileexists-forbidden' => 'Файл з такой назвай ужо існуе і ня можа быць перапісаны.
@@ -1786,6 +1803,7 @@ $1',
 'lockmanager-fail-releaselock' => 'Немагчыма зьняць блякаваньне для «$1».',
 'lockmanager-fail-db-bucket' => 'Немагчыма скантактавацца з дастатковай колькасьцю базаў блякавньняў на ўчастку $1.',
 'lockmanager-fail-db-release' => 'Немагчыма зьняць блякаваньні для базы зьвестак $1.',
+'lockmanager-fail-svr-acquire' => 'Немагчыма запытаць блякаваньні на сэрвэры $1.',
 'lockmanager-fail-svr-release' => 'Немагчыма зьняць блякаваньні для сэрвэра $1.',
 
 # ZipDirectoryReader
@@ -1906,6 +1924,7 @@ $1',
 'shared-repo-from' => '$1',
 'shared-repo' => 'агульнага сховішча',
 'shared-repo-name-wikimediacommons' => 'Вікісховішча',
+'upload-disallowed-here' => 'На жаль Вы ня можаце перазапісаць гэтую выяву.',
 
 # File reversion
 'filerevert' => 'Вярнуць $1',
@@ -1940,7 +1959,7 @@ $1',
 # MIME search
 'mimesearch' => 'Пошук па MIME',
 'mimesearch-summary' => 'Гэта старонка дазваляе адбор файлаў па іх MIME-тыпе.
-Фармат уводу: тып_зьместу/падтып, напрыклад, <tt>image/jpeg</tt>.',
+Фармат уводу: тып_зьместу/падтып, напрыклад, <code>image/jpeg</code>.',
 'mimetype' => 'Тып MIME:',
 'download' => 'загрузіць',
 
@@ -2013,6 +2032,7 @@ $1',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|байт|байты|байтаў}}',
 'ncategories' => '$1 {{PLURAL:$1|катэгорыя|катэгорыі|катэгорыяў}}',
+'ninterwikis' => '$1 {{PLURAL:$1|інтэрвікі|інтэрвікі}}',
 'nlinks' => '$1 {{PLURAL:$1|спасылка|спасылкі|спасылак}}',
 'nmembers' => '$1 {{PLURAL:$1|элемэнт|элемэнты|элемэнтаў}}',
 'nrevisions' => '$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}',
@@ -2041,6 +2061,7 @@ $1',
 'mostlinkedtemplates' => 'Шаблёны, якія найчасьцей выкарыстоўваюцца',
 'mostcategories' => 'Старонкі з найбольшай колькасьцю катэгорыяў',
 'mostimages' => 'Файлы, на якія найчасьцей спасылаюцца',
+'mostinterwikis' => 'Старонкі з найбольшай колькасьцю інтэрвікі',
 'mostrevisions' => 'Старонкі з найбольшай колькасьцю рэдагаваньняў',
 'prefixindex' => 'Усе старонкі з пачаткам назваў',
 'prefixindex-namespace' => 'Усе старонкі з прэфіксам (прастора назваў $1)',
@@ -2141,7 +2162,7 @@ $1',
 'linksearch-ok' => 'Шукаць',
 'linksearch-text' => 'Можна ўжываць сымбалі падстаноўкі, напрыклад, «*.wikipedia.org».<br />
 Неабходны дамэн першага ўзроўню, напрыклад, «*.org».<br />
-Пратаколы, якія падтрымліваюцца: <tt>$1</tt> (не дадавайце іх у Ваш пошук).',
+Пратаколы, якія падтрымліваюцца: <code>$1</code> (не дадавайце іх у Ваш пошук).',
 'linksearch-line' => 'Спасылка на $1 з $2',
 'linksearch-error' => 'Сымбалі падстаноўкі могуць ужывацца толькі ў пачатку адрасоў.',
 
@@ -2187,6 +2208,8 @@ $1',
 'mailnologin' => 'Няма адрасу атрымальніка',
 'mailnologintext' => 'Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.',
 'emailuser' => 'Даслаць ліст',
+'emailuser-title-target' => 'Адправіць гэта па электроннай пошце  {{GENDER:$1|гэтаму ўдзельніку|гэтай удзельніцы}}',
+'emailuser-title-notarget' => 'Даслаць ліст ўдзельніку ці ўдзельніцы па электроннай пошце',
 'emailpage' => 'Даслаць ліст ўдзельніку ці ўдзельніцы па электроннай пошце',
 'emailpagetext' => 'Вы можаце выкарыстоўваць форму ніжэй, каб даслаць гэтаму ўдзельніку ліст па электроннай пошце.
 Адрас электроннай пошты, які Вы пазначалі ў [[Special:Preferences|сваіх наладах]], будзе пазначаны ў полі ліста «Ад», і ўдзельнік зможа даслаць на гэты адрас адказ.',
@@ -2332,6 +2355,8 @@ $UNWATCHURL
 'rollback' => 'Адкаціць рэдагаваньні',
 'rollback_short' => 'Адкат',
 'rollbacklink' => 'адкат',
+'rollbacklinkcount' => 'адкаціць $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}',
+'rollbacklinkcount-morethan' => 'адкаціць больш за $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}',
 'rollbackfailed' => 'Памылка адкату',
 'cantrollback' => 'Немагчыма адкаціць зьмену; апошні рэдактар — адзіны аўтар гэтай старонкі.',
 'alreadyrolled' => 'Немагчыма адкаціць апошнюю зьмену [[:$1]], якую {{GENDER:$2|зрабіў|зрабіла}} [[User:$2|$2]] ([[User talk:$2|гутаркі]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); нехта іншы ўжо зьмяніў старонку альбо адкаціў зьмены.
@@ -2827,6 +2852,7 @@ $1',
 'import-interwiki-templates' => 'Уключыць усе шаблёны',
 'import-interwiki-submit' => 'Імпартаваць',
 'import-interwiki-namespace' => 'Мэтавая прастора назваў:',
+'import-interwiki-rootpage' => 'Мэтавая карнявая старонка (неабавязкова):',
 'import-upload-filename' => 'Назва файла:',
 'import-comment' => 'Камэнтар:',
 'importtext' => 'Калі ласка, экспартуйце файл з крынічнай вікі з дапамогай [[Special:Export|прылады экспарту]].
@@ -2862,6 +2888,9 @@ $1',
 'import-error-interwiki' => 'Старонка «$1» не была імпартаваная, таму што гэтая назва зарэзэрваваная для інтэрвікі.',
 'import-error-special' => 'Старонка «$1» не была імпартаваная, таму што яна належыць да спэцыяльнай прасторы назваў, старонкі ў якой не дазволеныя.',
 'import-error-invalid' => 'Старонка «$1» не была імпартаваная з-за няслушнасьці назвы.',
+'import-options-wrong' => '{{PLURAL:$2|Няслушная налада|Няслушныя налады}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Пазначаная назва карнявой старонкі няслушная.',
+'import-rootpage-nosubpage' => 'Падстаронкі ў прасторы назваў «$1» карнявой старонкі не дазволеныя.',
 
 # Import log
 'importlogpage' => 'Журнал імпартаваньняў',
@@ -2980,16 +3009,34 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Інфармацыя пра «$1»',
+'pageinfo-header-basic' => 'Асноўныя зьвесткі',
 'pageinfo-header-edits' => 'Рэдагаваньні',
-'pageinfo-header-watchlist' => 'Сьпіс назіраньня',
-'pageinfo-header-views' => 'Прагляды',
-'pageinfo-subjectpage' => 'Старонка',
-'pageinfo-talkpage' => 'Старонка абмеркаваньня',
+'pageinfo-header-restrictions' => 'Абарона старонкі',
+'pageinfo-header-properties' => 'Уласьцівасьці старонкі',
+'pageinfo-display-title' => 'Загаловак для адлюстраваньня',
+'pageinfo-default-sort' => 'Перадвызначаны ключ сартаваньня',
+'pageinfo-length' => 'Памер старонкі (у байтах)',
+'pageinfo-article-id' => 'Ідэнтыфікатар старонкі',
+'pageinfo-robot-policy' => 'Індэксацыя пашукавікамі',
+'pageinfo-robot-index' => 'Індэксуецца',
+'pageinfo-robot-noindex' => 'Не індэксуецца',
+'pageinfo-views' => 'Колькасьць праглядаў',
 'pageinfo-watchers' => 'Колькасьць назіральнікаў і назіральніц',
+'pageinfo-redirects-name' => 'Перанакіраваньняў на гэтую старонку',
+'pageinfo-subpages-name' => 'Колькасьць падстаронак',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|перанакіраваньне|перанакіраваньні|перанакіраваньняў}}; $3 {{PLURAL:$3|звычайная|звычайныя|звычайных}})',
+'pageinfo-firstuser' => 'Стваральнік старонкі',
+'pageinfo-firsttime' => 'Дата стварэньня',
+'pageinfo-lastuser' => 'Апошні рэдактар',
+'pageinfo-lasttime' => 'Дата апошняга рэдагаваньня',
 'pageinfo-edits' => 'Колькасьць рэдагаваньняў',
 'pageinfo-authors' => 'Колькасьць аўтараў',
-'pageinfo-views' => 'Колькасьць праглядаў',
-'pageinfo-viewsperedit' => 'Колькасьць праглядаў на рэдагаваньне',
+'pageinfo-recent-edits' => 'Колькасьць апошніх рэдагаваньняў (за $1)',
+'pageinfo-recent-authors' => 'Колькасьць апошніх аўтараў',
+'pageinfo-restriction' => 'Стан аховы (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Магічнае слова|Магічныя словы}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Схаваная катэгорыя|Схаваныя катэгорыі}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Шаблён|Шаблёны}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Клясычнае',
@@ -3042,7 +3089,8 @@ $1',
 'file-info-size' => '$1 × $2 {{PLURAL:$2|піксэль|піксэлі|піксэляў}}, памер файла: $3, тып MIME: $4',
 'file-info-size-pages' => '$1 × $2 піксэлаў, памер файла: $3, MIME-тып: $4, $5 {{PLURAL:$5|старонка|старонкі|старонак}}',
 'file-nohires' => 'Няма вэрсіі зь лепшым разрозьненьнем.',
-'svg-long-desc' => 'SVG-файл, намінальна $1 × $2 {{PLURAL:$2|піксэль|піксэлі|піксэляў}}, памер файла: $3.',
+'svg-long-desc' => 'SVG-файл, намінальна $1 × $2 {{PLURAL:$2|піксэл|піксэлы|піксэлаў}}, памер файла: $3.',
+'svg-long-desc-animated' => 'Анімаваны SVG-файл, намінальна $1 × $2 {{PLURAL:$2|піксэл|піксэлы|піксэлаў}}, памер файла: $3',
 'show-big-image' => 'Найлепшае разрозьненьне',
 'show-big-image-preview' => 'Памер прагляду: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Іншае разрозьненьне|Іншыя разрозьненьні}}: $1.',
@@ -3052,6 +3100,8 @@ $1',
 'file-info-png-looped' => 'паўтараючыся',
 'file-info-png-repeat' => 'паўтораны $1 {{PLURAL:$1|раз|разы|разоў}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|кадар|кадры|кадраў}}',
+'file-no-thumb-animation' => "'''Заўвага: з-за тэхнічных абмежаваньняў мініятуры гэтага файла ня будуць анімаваныя.'''",
+'file-no-thumb-animation-gif' => "'''Заўвага: з-за тэхнічных абмежаваньняў мініятуры GIF-выяваў высокага разрозьненьня ствараюцца без анімацыі.'''",
 
 # Special:NewFiles
 'newimages' => 'Галерэя новых файлаў',
@@ -3857,9 +3907,12 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'api-error-empty-file' => 'Дасланы Вамі файл быў пусты.',
 'api-error-emptypage' => 'Стварэньне новых пустых старонак забаронена.',
 'api-error-fetchfileerror' => 'Унутраная памылка: падчас атрыманьня файла штосьці здарылася.',
+'api-error-fileexists-forbidden' => 'Файл з назвай «$1» ужо існуе і ня можа быць перазапісаны.',
+'api-error-fileexists-shared-forbidden' => 'Файл з назвай «$1» ужо існуе ў супольным сховішчы файлаў і ня можа быць перазапісаны.',
 'api-error-file-too-large' => 'Дасланы Вамі файл занадта вялікі.',
 'api-error-filename-tooshort' => 'Назва файла занадта кароткая.',
 'api-error-filetype-banned' => 'Гэты тып файла забаронены.',
+'api-error-filetype-banned-type' => '$1 — {{PLURAL:$4|забаронены тып файлаў|забароненыя тыпы файлаў}}. {{PLURAL:$3|Дазволены тып файлаў|Дазволеныя тыпы файлаў}}: $2.',
 'api-error-filetype-missing' => 'У файла няма пашырэньня.',
 'api-error-hookaborted' => 'Прапанаваная Вамі зьмена была адхіленая апрацоўшчыкам пашырэньня.',
 'api-error-http' => 'Унутраная памылка: немагчыма далучыцца да сэрвэра.',
index 2c994a4..79348e7 100644 (file)
@@ -11,6 +11,7 @@
  * @author Borislav
  * @author DCLXVI
  * @author Daggerstab
+ * @author Dimi z
  * @author Kaganer
  * @author Spiritia
  * @author Stanqo
@@ -57,86 +58,86 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#пренасочване', '#виж', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__БЕЗСЪДЪРЖАНИЕ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__БЕЗГАЛЕРИЯ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__СЪССЪДЪРЖАНИЕ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__СЪДЪРЖАНИЕ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__БЕЗ_РЕДАКТИРАНЕ_НА_РАЗДЕЛИ__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'ТЕКУЩМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ТЕКУЩМЕСЕЦ1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'ТЕКУЩМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'ТЕКУЩМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ТЕКУЩМЕСЕЦСЪКР', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ТЕКУЩДЕН', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ТЕКУЩДЕН2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ТЕКУЩДЕНИМЕ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ТЕКУЩАГОДИНА', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ТЕКУЩОВРЕМЕ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ТЕКУЩЧАС', 'CURRENTHOUR' ),
-       'numberofpages'           => array( '1', 'БРОЙСТРАНИЦИ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'БРОЙСТАТИИ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'БРОЙФАЙЛОВЕ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'БРОЙПОТРЕБИТЕЛИ', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'БРОЙАКТИВНИПОТРЕБИТЕЛИ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'БРОЙРЕДАКЦИИ', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'БРОЙПРЕГЛЕДИ', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'СТРАНИЦА', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'СТРАНИЦАИ', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ИМЕННОПРОСТРАНСТВО', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ИМЕННОПРОСТРАНСТВОИ', 'NAMESPACEE' ),
-       'fullpagename'            => array( '1', 'ПЪЛНОИМЕ_СТРАНИЦА', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ПЪЛНОИМЕ_СТРАНИЦАИ', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ИМЕ_ПОДСТРАНИЦА', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ИМЕ_ПОДСТРАНИЦАИ', 'SUBPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ИМЕ_БЕСЕДА', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'ИМЕ_БЕСЕДАИ', 'TALKPAGENAMEE' ),
-       'msg'                     => array( '0', 'СЪОБЩ:', 'MSG:' ),
-       'subst'                   => array( '0', 'ЗАМЕСТ:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'СЪОБЩБУ:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'мини', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'вдясно', 'дясно', 'д', 'right' ),
-       'img_left'                => array( '1', 'вляво', 'ляво', 'л', 'left' ),
-       'img_none'                => array( '1', 'н', 'none' ),
-       'img_width'               => array( '1', '$1пкс', '$1п', '$1px' ),
-       'img_center'              => array( '1', 'център', 'центр', 'ц', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'рамка', 'врамка', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'безрамка', 'frameless' ),
-       'img_border'              => array( '1', 'ръб', 'контур', 'border' ),
-       'int'                     => array( '0', 'ВЪТР:', 'INT:' ),
-       'sitename'                => array( '1', 'ИМЕНАСАЙТА', 'SITENAME' ),
-       'ns'                      => array( '0', 'ИП:', 'NS:' ),
-       'localurl'                => array( '0', 'ЛОКАЛЕНАДРЕС:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ЛОКАЛЕНАДРЕСИ:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'СЪРВЪР', 'SERVER' ),
-       'servername'              => array( '0', 'ИМЕНАСЪРВЪРА', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ПЪТДОСКРИПТА', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'ГРАМАТИКА:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ПОЛ:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'ТЕКУЩАСЕДМИЦА', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ТЕКУЩ_ДЕН_ОТ_СЕДМИЦАТА', 'CURRENTDOW' ),
-       'revisionid'              => array( '1', 'ИД_НА_ВЕРСИЯТА', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ДЕН_НА_ВЕРСИЯТА', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ДЕН_НА_ВЕРСИЯТА2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'МЕСЕЦ_НА_ВЕРСИЯТА', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ГОДИНА_НА_ВЕРСИЯТА', 'REVISIONYEAR' ),
-       'plural'                  => array( '0', 'МН_ЧИСЛО:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'ПЪЛЕН_АДРЕС:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'ПЪЛЕН_АДРЕСИ:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'МБПЪРВА:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ГБПЪРВА:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'МБ:', 'LC:' ),
-       'uc'                      => array( '0', 'ГБ:', 'UC:' ),
-       'raw'                     => array( '0', 'НЕОБРАБ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ПОКАЗВ_ЗАГЛАВИЕ', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__ВРЪЗКА_ЗА_НОВ_РАЗДЕЛ__', '__NEWSECTIONLINK__' ),
-       'language'                => array( '0', '#ЕЗИК:', '#LANGUAGE:' ),
-       'numberofadmins'          => array( '1', 'БРОЙАДМИНИСТРАТОРИ', 'NUMBEROFADMINS' ),
-       'defaultsort'             => array( '1', 'СОРТКАТ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'hiddencat'               => array( '1', '__СКРИТАКАТЕГОРИЯ__', '__HIDDENCAT__' ),
-       'index'                   => array( '1', '__ИНДЕКСИРАНЕ__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__БЕЗИНДЕКСИРАНЕ__', '__NOINDEX__' ),
+       'redirect'                  => array( '0', '#пренасочване', '#виж', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__БЕЗСЪДЪРЖАНИЕ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__БЕЗГАЛЕРИЯ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__СЪССЪДЪРЖАНИЕ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__СЪДЪРЖАНИЕ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__БЕЗ_РЕДАКТИРАНЕ_НА_РАЗДЕЛИ__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'ТЕКУЩМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ТЕКУЩМЕСЕЦ1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'ТЕКУЩМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ТЕКУЩМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ТЕКУЩМЕСЕЦСЪКР', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ТЕКУЩДЕН', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ТЕКУЩДЕН2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ТЕКУЩДЕНИМЕ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ТЕКУЩАГОДИНА', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ТЕКУЩОВРЕМЕ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ТЕКУЩЧАС', 'CURRENTHOUR' ),
+       'numberofpages'             => array( '1', 'БРОЙСТРАНИЦИ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'БРОЙСТАТИИ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'БРОЙФАЙЛОВЕ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'БРОЙПОТРЕБИТЕЛИ', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'БРОЙАКТИВНИПОТРЕБИТЕЛИ', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'БРОЙРЕДАКЦИИ', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'БРОЙПРЕГЛЕДИ', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'СТРАНИЦА', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'СТРАНИЦАИ', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ИМЕННОПРОСТРАНСТВО', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ИМЕННОПРОСТРАНСТВОИ', 'NAMESPACEE' ),
+       'fullpagename'              => array( '1', 'ПЪЛНОИМЕ_СТРАНИЦА', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ПЪЛНОИМЕ_СТРАНИЦАИ', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ИМЕ_ПОДСТРАНИЦА', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ИМЕ_ПОДСТРАНИЦАИ', 'SUBPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ИМЕ_БЕСЕДА', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ИМЕ_БЕСЕДАИ', 'TALKPAGENAMEE' ),
+       'msg'                       => array( '0', 'СЪОБЩ:', 'MSG:' ),
+       'subst'                     => array( '0', 'ЗАМЕСТ:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'СЪОБЩБУ:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'мини', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'вдясно', 'дясно', 'д', 'right' ),
+       'img_left'                  => array( '1', 'вляво', 'ляво', 'л', 'left' ),
+       'img_none'                  => array( '1', 'н', 'none' ),
+       'img_width'                 => array( '1', '$1пкс', '$1п', '$1px' ),
+       'img_center'                => array( '1', 'център', 'центр', 'ц', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'рамка', 'врамка', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'безрамка', 'frameless' ),
+       'img_border'                => array( '1', 'ръб', 'контур', 'border' ),
+       'int'                       => array( '0', 'ВЪТР:', 'INT:' ),
+       'sitename'                  => array( '1', 'ИМЕНАСАЙТА', 'SITENAME' ),
+       'ns'                        => array( '0', 'ИП:', 'NS:' ),
+       'localurl'                  => array( '0', 'ЛОКАЛЕНАДРЕС:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ЛОКАЛЕНАДРЕСИ:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'СЪРВЪР', 'SERVER' ),
+       'servername'                => array( '0', 'ИМЕНАСЪРВЪРА', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ПЪТДОСКРИПТА', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'ГРАМАТИКА:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ПОЛ:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'ТЕКУЩАСЕДМИЦА', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ТЕКУЩ_ДЕН_ОТ_СЕДМИЦАТА', 'CURRENTDOW' ),
+       'revisionid'                => array( '1', 'ИД_НА_ВЕРСИЯТА', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ДЕН_НА_ВЕРСИЯТА', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ДЕН_НА_ВЕРСИЯТА2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'МЕСЕЦ_НА_ВЕРСИЯТА', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ГОДИНА_НА_ВЕРСИЯТА', 'REVISIONYEAR' ),
+       'plural'                    => array( '0', 'МН_ЧИСЛО:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'ПЪЛЕН_АДРЕС:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ПЪЛЕН_АДРЕСИ:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'МБПЪРВА:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ГБПЪРВА:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'МБ:', 'LC:' ),
+       'uc'                        => array( '0', 'ГБ:', 'UC:' ),
+       'raw'                       => array( '0', 'НЕОБРАБ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ПОКАЗВ_ЗАГЛАВИЕ', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__ВРЪЗКА_ЗА_НОВ_РАЗДЕЛ__', '__NEWSECTIONLINK__' ),
+       'language'                  => array( '0', '#ЕЗИК:', '#LANGUAGE:' ),
+       'numberofadmins'            => array( '1', 'БРОЙАДМИНИСТРАТОРИ', 'NUMBEROFADMINS' ),
+       'defaultsort'               => array( '1', 'СОРТКАТ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'hiddencat'                 => array( '1', '__СКРИТАКАТЕГОРИЯ__', '__HIDDENCAT__' ),
+       'index'                     => array( '1', '__ИНДЕКСИРАНЕ__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__БЕЗИНДЕКСИРАНЕ__', '__NOINDEX__' ),
 );
 
 $specialPageAliases = array(
@@ -243,7 +244,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Скриване на патрулираните редакции от списъка с последните промени',
 'tog-newpageshidepatrolled' => 'Скриване на патрулираните редакции от списъка на новите страници',
 'tog-extendwatchlist' => 'Разширяване на списъка, така че да показва всички промени, не само най-скорошните',
-'tog-usenewrc' => 'Ð\9fодобÑ\80Ñ\8fване Ð½Ð° Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ñ\80омени (изисква Джаваскрипт)',
+'tog-usenewrc' => 'Ð\93Ñ\80Ñ\83пиÑ\80ане Ð½Ð° Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ñ\80омени Ð¸ Ñ\81пиÑ\81Ñ\8aка Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и (изисква Джаваскрипт)',
 'tog-numberheadings' => 'Номериране на заглавията',
 'tog-showtoolbar' => 'Помощна лента за редактиране (изисква Джаваскрипт)',
 'tog-editondblclick' => 'Редактиране при двойно щракване (изисква Джаваскрипт)',
@@ -251,17 +252,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Възможност за редактиране на раздел при щракване с десния бутон върху заглавие на раздел (изисква Джаваскрипт)',
 'tog-showtoc' => 'Показване на съдържание (за страници с повече от три раздела)',
 'tog-rememberpassword' => 'Запомяне на паролата ми в този браузър (за не повече от $1 {{PLURAL:$1|ден|дни}})',
-'tog-watchcreations' => 'Добавяне на създадените от мен страници към списъка ми за наблюдение',
-'tog-watchdefault' => 'Ð\94обавÑ\8fне Ð½Ð° Ñ\80едакÑ\82иÑ\80аниÑ\82е Ð¾Ñ\82 Ð¼ÐµÐ½ Ñ\81Ñ\82Ñ\80аниÑ\86и ÐºÑ\8aм списъка ми за наблюдение',
-'tog-watchmoves' => 'Добавяне на преместените от мен страници към списъка ми за наблюдение',
-'tog-watchdeletion' => 'Добавяне на изтритите от мен страници към списъка ми за наблюдение',
+'tog-watchcreations' => 'Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\8aздадениÑ\82е Ð¾Ñ\82 Ð¼ÐµÐ½ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸ ÐºÐ°Ñ\87ениÑ\82е Ð¾Ñ\82 Ð¼ÐµÐ½ Ñ\84айлове ÐºÑ\8aм Ñ\81пиÑ\81Ñ\8aка Ð¼Ð¸ Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение',
+'tog-watchdefault' => 'Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\80едакÑ\82иÑ\80ам, Ð² списъка ми за наблюдение',
+'tog-watchmoves' => 'Ð\94обавÑ\8fне Ð½Ð° Ð¿Ñ\80емеÑ\81Ñ\82ениÑ\82е Ð¾Ñ\82 Ð¼ÐµÐ½ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸ Ñ\84айлове ÐºÑ\8aм Ñ\81пиÑ\81Ñ\8aка Ð¼Ð¸ Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение',
+'tog-watchdeletion' => 'Ð\94обавÑ\8fне Ð½Ð° Ð¸Ð·Ñ\82Ñ\80иÑ\82иÑ\82е Ð¾Ñ\82 Ð¼ÐµÐ½ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸ Ñ\84айлове ÐºÑ\8aм Ñ\81пиÑ\81Ñ\8aка Ð¼Ð¸ Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение',
 'tog-minordefault' => 'Отбелязване на всички промени като малки по подразбиране',
 'tog-previewontop' => 'Показване на предварителния преглед преди текстовата кутия',
 'tog-previewonfirst' => 'Показване на предварителен преглед при първа редакция',
 'tog-nocache' => 'Спиране на складирането на страниците от браузъра',
-'tog-enotifwatchlistpages' => 'Уведомяване по е-пощата при промяна на страница от списъка ми за наблюдение',
+'tog-enotifwatchlistpages' => 'УведомÑ\8fване Ð¿Ð¾ Ðµ-поÑ\89аÑ\82а Ð¿Ñ\80и Ð¿Ñ\80омÑ\8fна Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð»Ð¸ Ñ\84айл Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð¼Ð¸ Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение',
 'tog-enotifusertalkpages' => 'Уведомяване по е-пощата при промяна на беседата ми',
-'tog-enotifminoredits' => 'Уведомяване по е-пощата даже при малки промени',
+'tog-enotifminoredits' => 'Уведомяване по е-пощата даже при малки промени на страници или файлове',
 'tog-enotifrevealaddr' => 'Показване на електронния ми адрес в известяващите писма',
 'tog-shownumberswatching' => 'Показване на броя на потребителите, наблюдаващи дадена страница',
 'tog-oldsig' => 'Текущ подпис:',
@@ -279,7 +280,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Скриване на редакциите от влезли потребители от списъка за наблюдение',
 'tog-watchlisthideanons' => 'Скриване на редакциите от анонимни потребители в списъка за наблюдение',
 'tog-watchlisthidepatrolled' => 'Скриване на патрулираните редакции от списъка за наблюдение',
-'tog-nolangconversion' => 'Без преобразувания при различни езикови варианти',
 'tog-ccmeonemails' => 'Получаване на копия на писмата, които пращам на другите потребители',
 'tog-diffonly' => 'Без показване на съдържанието на страницата при преглед на разлики',
 'tog-showhiddencats' => 'Показване на скритите категории',
@@ -503,6 +503,7 @@ $1',
 'youhavenewmessages' => 'Имате $1 ($2).',
 'newmessageslink' => 'нови съобщения',
 'newmessagesdifflink' => 'разлика с предишната версия',
+'newmessageslinkplural' => '{{PLURAL:$1|ново съобщение|нови съобщения}}',
 'youhavenewmessagesmulti' => 'Имате нови съобщения в $1',
 'editsection' => 'редактиране',
 'editold' => 'редактиране',
@@ -646,6 +647,7 @@ $2',
 'remembermypassword' => 'Запомняне на паролата на този компютър (най-много за $1 {{PLURAL:$1|ден|дни}})',
 'securelogin-stick-https' => 'Запазване на връзката през HTTPS след влизане',
 'yourdomainname' => 'Домейн:',
+'password-change-forbidden' => 'Не можете да променяте пароли в това уики.',
 'externaldberror' => 'Или е станала грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.',
 'login' => 'Влизане',
 'nav-login-createaccount' => 'Регистриране или влизане',
@@ -713,6 +715,7 @@ $2',
 'emailconfirmlink' => 'Потвърждаване на адреса за електронна поща',
 'invalidemailaddress' => 'Въведеният адрес не може да бъде приет, тъй като не съответства на формата на адрес за електронна поща. Въведете коректен адрес или оставете полето празно.',
 'cannotchangeemail' => 'Адресите за електронна поща на сметките не могат да бъдат променяни в това уики.',
+'emaildisabled' => 'Този сайт не може да изпраща е-поща.',
 'accountcreated' => 'Потребителската сметка беше създадена',
 'accountcreatedtext' => 'Потребителската сметка за $1 беше създадена.',
 'createaccount-title' => 'Създаване на сметка за {{SITENAME}}',
@@ -890,11 +893,10 @@ $2
 'userpage-userdoesnotexist-view' => 'Не е регистрирана потребителска сметка на име „$1“.',
 'blocked-notice-logextract' => 'В момента този потребител е блокиран.
 По-долу за справка е показан последният запис от Дневника на блокиранията:',
-'clearyourcache' => "'''Забележка:''' За да се видят промените след съхранението е необходимо кешът на браузъра да бъде изтрит:
-* '''Firefox / Safari:''' Ð½Ð°Ñ\82иÑ\81неÑ\82е Ð±Ñ\83Ñ\82она ''Shift'' Ð¸ Ñ\89Ñ\80акнеÑ\82е Ð²Ñ\8aÑ\80Ñ\85Ñ\83 ''Ð\9fÑ\80езаÑ\80еждане'' (''Reload''), Ð¸Ð»Ð¸ Ð¸Ð·Ð±ÐµÑ\80еÑ\82е клавишната комбинация ''Ctrl-Shift-R'' (''⌘-Shift-R'' за Mac);
+'clearyourcache' => "'''Забележка:''' За да се видят промените, необходимо е след съхраняване на страницата, кешът на браузъра да бъде изтрит.
+* '''Firefox / Safari:''' Ð\97адÑ\8aÑ\80жа Ñ\81е ÐºÐ»Ð°Ð²Ð¸Ñ\88 ''Shift'' Ð¸ Ñ\81е Ñ\89Ñ\80аква Ð²Ñ\8aÑ\80Ñ\85Ñ\83 ''Ð\9fÑ\80езаÑ\80еждане'' (''Reload'') Ð¸Ð»Ð¸ Ñ\87Ñ\80ез клавишната комбинация ''Ctrl-Shift-R'' (''⌘-Shift-R'' за Mac);
 * '''Google Chrome:''' клавишна комбинация ''Ctrl-Shift-R'' (''⌘-Shift-R'' за Mac)
-* '''Internet Explorer:''' натиснете ''Ctrl'' и щракнете върху ''Refresh'', или клавишната комбинация ''CTRL-F5'';
-* '''Konqueror:''' щракнете върху ''Презареждане'' или натиснете ''F5'';
+* '''Internet Explorer:''' Задържа се клавиш ''Ctrl'' и се щраква върху ''Refresh'' или чрез клавишната комбинация ''CTRL-F5'';
 * '''Opera:''' кешът се изчиства през менюто ''Tools → Preferences''.",
 'usercssyoucanpreview' => "'''Съвет:''' Използвайте бутона „{{int:showpreview}}“, за да изпробвате новия код на CSS преди съхранението.",
 'userjsyoucanpreview' => "'''Съвет:''' Използвайте бутона „{{int:showpreview}}“, за да изпробвате новия код на Джаваскрипт преди съхранението.",
@@ -986,6 +988,7 @@ $2
 'edit-no-change' => 'Вашата редакция беше игнорирана, тъй като не съдържа промени по текста.',
 'edit-already-exists' => 'Не можа да се създаде нова страница.
 Такава вече съществува.',
+'defaultmessagetext' => 'Текст на съобщението по подразбиране',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Внимание: Тази страница прекалено много пъти използва ресурсоемки парсерни функции.
@@ -1176,6 +1179,7 @@ $1",
 # Diffs
 'history-title' => 'Преглед на историята на „$1“',
 'difference-title' => 'Разлика между версии на „$1“',
+'difference-title-multipage' => 'Разлики между страниците „$1“ и „$2“',
 'difference-multipage' => '(Разлики между страниците)',
 'lineno' => 'Ред $1:',
 'compareselectedversions' => 'Сравнение на избраните версии',
@@ -1595,9 +1599,9 @@ $1",
 За преглеждане и търсене на вече качените файлове, може да се използва [[Special:FileList|списъка с качени файлове]]. Качванията се записват в [[Special:Log/upload|дневника на качванията]], а изтриванията &mdash; в [[Special:Log/delete|дневник на изтриванията]].
 
 За включване на файл в страница, може да се използва една от следния синтаксис: 
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' за използване пълната версия на файла
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' за определяне на широчина от 200 пиксела, ляво позициониране и 'alt text' за описание
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' за директна препратка, без файлът да бъде показван",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' за използване пълната версия на файла
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' за определяне на широчина от 200 пиксела, ляво позициониране и 'alt text' за описание
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' за директна препратка, без файлът да бъде показван",
 'upload-permitted' => 'Разрешени файлови формати: $1.',
 'upload-preferred' => 'Предпочитани файлови формати: $1.',
 'upload-prohibited' => 'Непозволени файлови формати: $1.',
@@ -1638,18 +1642,18 @@ $1",
 'largefileserver' => 'Файлът е по-голям от допустимия от сървъра размер.',
 'emptyfile' => 'Каченият от вас файл е празен. Това може да е предизвикано от грешка в името на файла. Уверете се дали наистина желаете да го качите.',
 'windows-nonascii-filename' => 'Уикито не поддържа имена на файлове със специални знаци.',
-'fileexists' => "Вече съществува файл с това име! Прегледайте '''<tt>[[:$1]]</tt>''', ако не сте сигурни, че желаете да го промените.
-[[$1|thumb]]",
-'filepageexists' => "Описателната страница за този файл вече е създадена на '''<tt>[[:$1]]</tt>''', въпреки че файл с това име в момента не съществува. Въведеното от вас резюме няма да се появи на описателната страница. За целта, страницата трябва да бъде редактирана ръчно.
-[[$1|thumb]]",
-'fileexists-extension' => "Съществува файл със сходно име: [[$2|thumb]]
-* Име на файла за качване: '''<tt>[[:$1]]</tt>'''
-* Име на съществуващия файл: '''<tt>[[:$2]]</tt>'''
-Моля, изберете друго име на файла за качване.",
+'fileexists' => 'Вече съществува файл с това име! Прегледайте <strong>[[:$1]]</strong>, ако не сте сигурни, че желаете да го промените.
+[[$1|thumb]]',
+'filepageexists' => 'Описателната страница за този файл вече е създадена на <strong>[[:$1]]</strong>, въпреки че файл с това име в момента не съществува. Въведеното от вас резюме няма да се появи на описателната страница. За целта, страницата трябва да бъде редактирана ръчно.
+[[$1|thumb]]',
+'fileexists-extension' => 'Съществува файл със сходно име: [[$2|thumb]]
+* Име на файла за качване: <strong>[[:$1]]</strong>
+* Име на съществуващия файл: <strong>[[:$2]]</strong>
+Моля, изберете друго име на файла за качване.',
 'fileexists-thumbnail-yes' => "Изглежда, че файлът е картинка с намален размер ''(миникартинка)''. [[$1|thumb]]
-Проверете файла '''<tt>[[:$1]]</tt>'''.
+Проверете файла <strong>[[:$1]]</strong>.
 Ако съществуващият файл представлява оригиналната версия на картинката, няма нужда да се качва неин умален вариант.",
-'file-thumbnail-no' => "Файловото име започва с '''<tt>$1</tt>'''. Изглежда, че е картинка с намален размер ''(миникартинка)''.
+'file-thumbnail-no' => "Файловото име започва с <strong>$1</strong>. Изглежда, че е картинка с намален размер ''(миникартинка)''.
 Ако разполагате с версия в пълна разделителна способност, качете нея. В противен случай сменете името на този файл.",
 'fileexists-forbidden' => 'Вече съществува файл с това име, който не може да бъде презаписан!
 Ако желаете да качите вашия файл, върнете се и го качете с ново име. [[File:$1|thumb|center|$1]]',
@@ -1851,7 +1855,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'MIME-търсене',
-'mimesearch-summary' => 'На тази страница можете да филтрирате файловете по техния MIME-тип. Заявката трябва да се състои от медиен тип и подтип, разделени с наклонена черта (слеш), напр. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'На тази страница можете да филтрирате файловете по техния MIME-тип. Заявката трябва да се състои от медиен тип и подтип, разделени с наклонена черта (слеш), напр. <code>image/jpeg</code>.',
 'mimetype' => 'MIME-тип:',
 'download' => 'сваляне',
 
@@ -1922,6 +1926,7 @@ $1',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|байт|байта}}',
 'ncategories' => '$1 {{PLURAL:$1|категория|категории}}',
+'ninterwikis' => '$1 {{PLURAL:$1|междууики|междууикита}}',
 'nlinks' => '$1 {{PLURAL:$1|препратка|препратки}}',
 'nmembers' => '$1 {{PLURAL:$1|член|члена}}',
 'nrevisions' => '$1 {{PLURAL:$1|версия|версии}}',
@@ -1948,6 +1953,7 @@ $1',
 'mostlinkedtemplates' => 'Най-препращани шаблони',
 'mostcategories' => 'Страници с най-много категории',
 'mostimages' => 'Най-препращани картинки',
+'mostinterwikis' => 'Страници с най-много междууикита',
 'mostrevisions' => 'Страници с най-много версии',
 'prefixindex' => 'Всички страници с представка',
 'prefixindex-namespace' => 'Всички страници с представка (именно пространство $1)',
@@ -2039,7 +2045,7 @@ $1',
 'linksearch-pat' => 'Търсене по:',
 'linksearch-ns' => 'Именно пространство:',
 'linksearch-ok' => 'Търсене',
-'linksearch-text' => 'Възможна е употребата на заместващи знаци като: „*.wikipedia.org“.<br />Поддържани протоколи: <tt>$1</tt>',
+'linksearch-text' => 'Възможна е употребата на заместващи знаци като: „*.wikipedia.org“.<br />Поддържани протоколи: <code>$1</code>',
 'linksearch-line' => '$1 с препратка от $2',
 'linksearch-error' => 'Заместващите знаци могат да стоят само в началото на името на хоста.',
 
@@ -2496,7 +2502,7 @@ $1',
 За справка по-долу е дадено извлечение от дневника на прикриванията:',
 'blocklogentry' => 'блокира [[$1]] със срок на изтичане $2 $3',
 'reblock-logentry' => 'промени параметрите на блокирането на [[$1]] със срок на изтричане $2 $3',
-'blocklogtext' => 'Тази страница съдържа дневник на блокиранията и отблокиранията, извършени от този потребител.
+'blocklogtext' => 'Тази страница съдържа дневник на блокиранията и отблокиранията.
 Автоматично блокираните IP-адреси не са показани.
 Вижте [[Special:BlockList|списъка на блокираните IP-адреси]] за текущото състояние на блокиранията.',
 'unblocklogentry' => 'отблокира $1',
@@ -2651,6 +2657,7 @@ $1',
 'exportcuronly' => 'Включване само на текущата версия, а не на цялата история',
 'exportnohistory' => "----
 '''Важно:''' Изнасянето на пълната история на страниците е забранено, защото много забавя уикито.",
+'exportlistauthors' => 'Добавяне на пълен списък на редакторите за всяка страница',
 'export-submit' => 'Изнасяне',
 'export-addcattext' => 'Добавяне на страници от категория:',
 'export-addcat' => 'Добавяне',
@@ -2731,6 +2738,7 @@ $1',
 'import-error-interwiki' => 'Страницата „$1“ не беше внесена, тъй като името ѝ е запазено за външно свързване (междууики).',
 'import-error-special' => 'Страницата „$1“ не беше внесена, тъй като принадлежи към специално именно пространство, което не позволява страници.',
 'import-error-invalid' => 'Страницата „$1“ не беше внесена, тъй като името ѝ е невалидно.',
+'import-rootpage-nosubpage' => 'Именното пространство „$1“ на основната страница не позволява създаването на подстраници.',
 
 # Import log
 'importlogpage' => 'Дневник на внасянията',
@@ -2741,7 +2749,7 @@ $1',
 'import-logentry-interwiki-detail' => '{{PLURAL:$1|една версия|$1 версии}} на $2 бяха внесени',
 
 # JavaScriptTest
-'javascripttest-disabled' => 'Тази функция е изключена.',
+'javascripttest-disabled' => 'Тази функционалност не е активирана в това уики.',
 'javascripttest-pagetext-noframework' => 'Тази страница е запазена за изпълнение на Джаваскрипт тестове.',
 'javascripttest-qunit-intro' => 'Вижте [$1 тестовата документация] на mediawiki.org.',
 
@@ -2847,16 +2855,16 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Информация за "$1"',
+'pageinfo-header-basic' => 'Основна информация',
 'pageinfo-header-edits' => 'Редакции',
-'pageinfo-header-watchlist' => 'Списък за наблюдение',
-'pageinfo-header-views' => 'Прегледи',
-'pageinfo-subjectpage' => 'Страница',
-'pageinfo-talkpage' => 'Дискусионна страница',
+'pageinfo-views' => 'Брой прегледи',
 'pageinfo-watchers' => 'Брой наблюдабащи',
-'pageinfo-edits' => 'Брой редакции',
+'pageinfo-subpages-name' => 'Подстраници на тази страница',
+'pageinfo-lastuser' => 'Последeн редактор',
+'pageinfo-lasttime' => 'Дата на последнoто редактиране',
+'pageinfo-edits' => 'Общ брой редакции',
 'pageinfo-authors' => 'Брой на отделни автори',
-'pageinfo-views' => 'Брой прегледи',
-'pageinfo-viewsperedit' => 'Прегледи на редакция',
+'pageinfo-magic-words' => 'Вълшебни думички ($1)',
 
 # Skin names
 'skinname-standard' => 'Класика',
@@ -3640,9 +3648,12 @@ MediaWiki се разпространява с надеждата, че ще б
 'api-error-empty-file' => 'Заявеният за качване файл беше празен.',
 'api-error-emptypage' => 'Създаването на нови, празени страници, не е разрешено.',
 'api-error-fetchfileerror' => 'Вътрешна грешка: Нещо се обърка при извличане на файла.',
+'api-error-fileexists-forbidden' => 'Вече съществува файл с име „$1“ и той не може да бъде заменен.',
+'api-error-fileexists-shared-forbidden' => 'В споделеното хранилище вече съществува файл с име „$1“ и той не може да бъде заменен.',
 'api-error-file-too-large' => 'Заявеният за качване файл беше твърде голям.',
 'api-error-filename-tooshort' => 'Името на файла е твърде кратко.',
 'api-error-filetype-banned' => 'Този файлов тип не е позволен за качване.',
+'api-error-filetype-banned-type' => '$1 не {{PLURAL:$4|е позволен файлов формат|са позволени файлови формати}}. {{PLURAL:$3|Позволеният файлов формат е|Позволените файлови формати са}} $2.',
 'api-error-filetype-missing' => 'Липсва разширение на файла.',
 'api-error-hookaborted' => 'Промените, които опитахте да направите, бяха отменени от някое разширение.',
 'api-error-http' => 'Вътрешна грешка: Грешка при свързането със сървъра.',
index f40423a..ef3492e 100644 (file)
@@ -1516,9 +1516,9 @@ Log pahapusan wan pamindahan hagan tungkarran ngini adalah sawagai barikut:",
 Gasan manampaiakan atawa manggagai barakas nang sabalumnya dimuat, puruk [[Special:FileList|daptar barakas]]. Pahunggahan (lagi) jua tacatat dalam [[Special:Log/upload|log pahunggahan]], samantara pahapusan tacatat dalam [[Special:Log/delete|log pahapusan]].
 
 Gasan manampaiakn atawa maumpatakan barakas di dalam suatu tungkaran, puruk tautan lawan salah asa purmat di bawah ngini:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Barakas.jpg]]</nowiki></tt>''' hagan manampaiakan barakas dalam takaran aslinya
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Barakas.png|200px|thumb|left|naskah alternatip]]</nowiki></tt>''' hagan manampaiakan barakas lawan libar 200px dalam sabuah kutak di kiwa tungkaran lawan 'naskah alternatip' sawagai katarangan gambar
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Barakas.ogg]]</nowiki></tt>''' sawagai tautan langsung ka barakas nang dimaksud kada batampaiakan barakas ngitu lung wiki",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Barakas.jpg]]</nowiki></code>''' hagan manampaiakan barakas dalam takaran aslinya
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Barakas.png|200px|thumb|left|naskah alternatip]]</nowiki></code>''' hagan manampaiakan barakas lawan libar 200px dalam sabuah kutak di kiwa tungkaran lawan 'naskah alternatip' sawagai katarangan gambar
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Barakas.ogg]]</nowiki></code>''' sawagai tautan langsung ka barakas nang dimaksud kada batampaiakan barakas ngitu lung wiki",
 'upload-permitted' => 'Macam barakas nang diijinakan: $1.',
 'upload-preferred' => 'Macam barakas nang dikatujui: $1.',
 'upload-prohibited' => 'Macam barakas nang ditangati: $1.',
@@ -1566,21 +1566,21 @@ barakas ngini $2.',
 Ngini pinanya ada salah katik ngaran barakas.
 Muhun pariksa apa bubujuran Pian handak mahunggah barakas ngini.',
 'windows-nonascii-filename' => 'Wiki ngini kada manyukung ngaranbarakas awan karaktir isitimiwa.',
-'fileexists' => "Sabuah barakas bangaran ngin sudah ada, muhun pariksa '''<tt>[[:$1]]</tt>''' amun Pian kada musti amun Pian handak mangganti ngini.
-[[$1|thumb]]",
-'filepageexists' => "Tungkaran diskripsi gasan barakas ngini suda diulah di '''<tt>[[:$1]]</tt>''', tagal kadada barakas bangaran ngini tasadia.
+'fileexists' => 'Sabuah barakas bangaran ngin sudah ada, muhun pariksa <strong>[[:$1]]</strong> amun Pian kada musti amun Pian handak mangganti ngini.
+[[$1|thumb]]',
+'filepageexists' => 'Tungkaran diskripsi gasan barakas ngini suda diulah di <strong>[[:$1]]</strong>, tagal kadada barakas bangaran ngini tasadia.
 Kasimpulan nang Pian masukakan kada ham cungul pada tungkran diskripsi.
 Hagan maulah kasimpulan Pian cungul di sana, Pian musti mambabaknya manual.
-[[$1|thumb]]",
-'fileexists-extension' => "Sabuah barakas bangaran sama sudah tasadia: [[$2|thumb]]
-*Ngaran barakas hunggahan: '''<tt>[[:$1]]</tt>'''
-* Ngaran barakas sudah tasadia: '''<tt>[[:$2]]</tt>'''
-Muhun pilihi sabuah ngaran babida.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Sabuah barakas bangaran sama sudah tasadia: [[$2|thumb]]
+*Ngaran barakas hunggahan: <strong>[[:$1]]</strong>
+* Ngaran barakas sudah tasadia: <strong>[[:$2]]</strong>
+Muhun pilihi sabuah ngaran babida.',
 'fileexists-thumbnail-yes' => "Barakas ngini kajanakannya sabuah pancitraan nang dihalusi takarannya ''(thumbnail)''.
 [[$1|thumb]]
-Muhun pariksa barakas '''<tt>[[:$1]]</tt>'''.
+Muhun pariksa barakas <strong>[[:$1]]</strong>.
 Amun barakas dipariksa sama awan pancitraan takaran aslinya kada parlu mahunggah sabuah tambahan thumbnail.",
-'file-thumbnail-no' => "Ngaran barakas bamula awan '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Ngaran barakas bamula awan <strong>$1</strong>.
 Ngini kajanakannya sabuah pancitraan nang dihalusi takaran ''(thumbnail)''.
 Amun Pian baisi pancitraan ngini barisulusi hibak hunggah nang ngini, amun kada muhun ubah ngaran barakas.",
 'fileexists-forbidden' => 'Sabuah barakas bangaran sama sudah tasadia, wan kada kawa ditindihtulis.
@@ -1820,7 +1820,7 @@ Diskripsi ngini [$2 tungkaran diskripsi barakas] ditampaiakan di bawah.',
 # MIME search
 'mimesearch' => 'Panggagaian MIME',
 'mimesearch-summary' => 'Tungkaran ngini kawa manyaring babarakas bamacam MIME.
-Buati: contenttype/subtype, misal <tt>image/jpeg</tt>.',
+Buati: contenttype/subtype, misal <code>image/jpeg</code>.',
 'mimetype' => 'Macam MIME',
 'download' => 'hunduh',
 
@@ -2020,7 +2020,7 @@ Janaki jua [[Special:WantedCategories|tutumbung nang dihandaki]].',
 'linksearch-ok' => 'Gagai',
 'linksearch-text' => 'Kartu liar nangkaya "*.wikipedia.org" hingkat diguna\'akan.
 Mamarlukan sadikitnya asa ranah tingkat atas, misalnya "*.org".<br />
-Protokol nang didukung: <tt>$1</tt> (jangan tambahakan dalam panggagaian Pian)',
+Protokol nang didukung: <code>$1</code> (jangan tambahakan dalam panggagaian Pian)',
 'linksearch-line' => '$1 ditautakan matan $2',
 'linksearch-error' => 'Kartu-liar mancungul pintang awalan matan ngaranhost.',
 
@@ -2844,15 +2844,10 @@ Ngini pinanya dikaranakan ulih sabuah tautan ka sabuah situs daptar-hirang luar.
 # Info page
 'pageinfo-title' => "Panjalasan gasan ''$1''",
 'pageinfo-header-edits' => 'Babakan',
-'pageinfo-header-watchlist' => 'Paitihan',
-'pageinfo-header-views' => 'Titiringan',
-'pageinfo-subjectpage' => 'Tungkaran',
-'pageinfo-talkpage' => 'Tungkaran pamandiran',
+'pageinfo-views' => 'Rikinan titiringan',
 'pageinfo-watchers' => 'Jumlah papaitih',
 'pageinfo-edits' => 'Rikinan babakan',
 'pageinfo-authors' => 'Rikinan panulis balain',
-'pageinfo-views' => 'Rikinan titiringan',
-'pageinfo-viewsperedit' => 'Titiringan par babakan',
 
 # Patrolling
 'markaspatrolleddiff' => 'Ciri-i sawagai ta-awasi',
@@ -3627,8 +3622,8 @@ Gambar ditampaiakan dalam risulusi hibak, janis barakas lain dimula lawan prugra
 Situs ngini mangalami kangalihan teknik.',
 'dberr-again' => 'Cuba hadangi babarapa manit wan muat-pulang.',
 'dberr-info' => '(Kada kawa tasambung ka server databasis: $1)',
-'dberr-usegoogle' => 'Pian kawa cuba manggagai lung Google wayah samantara ni.',
-'dberr-outofdate' => 'Catat nang sidin indiks matan isi kami pina kawa kadaluarsa.',
+'dberr-usegoogle' => 'Pian kawa mancuba manggagai lung Google wayah pahadangan ngini.',
+'dberr-outofdate' => 'Catat nang sidin indéks matan isi kami pinanya hudah kadaluarsa.',
 'dberr-cachederror' => 'Ngini adalah sabuah rekap timbuluk tungkaran nang dipinta, wan pinanya kada pahanyarnya.',
 
 # HTML forms
index 9bccafe..fd22a46 100644 (file)
@@ -109,7 +109,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'নজরতালিকাতে অ্যাকাউন্টে লগ-ইন করা ব্যবহারকারীদের সম্পাদনা আড়ালে রাখা হোক',
 'tog-watchlisthideanons' => 'নজরতালিকাতে বেনামী ব্যবহারকারীদের সম্পাদনা আড়ালে রাখা হোক',
 'tog-watchlisthidepatrolled' => 'পরীক্ষিত সম্পাদনা গুলো নজরতালিকায় আড়াল করো',
-'tog-nolangconversion' => 'বিকল্প রুপান্তর রোধ করো',
 'tog-ccmeonemails' => 'অন্য ব্যবহারকারীর কাছে আমার পাঠানো ইমেইলের একটি অনুলিপি আমাকে পাঠানো হোক',
 'tog-diffonly' => 'পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক',
 'tog-showhiddencats' => 'লুকায়িত বিষয়শ্রেণীসমূহ দেখাও',
@@ -332,6 +331,10 @@ $1',
 'youhavenewmessages' => 'আপনার $1 ($2) এসেছে৷',
 'newmessageslink' => 'নতুন বার্তা',
 'newmessagesdifflink' => 'সর্বশেষ পরিবর্তন',
+'youhavenewmessagesfromusers' => 'আপনি  {{PLURAL:$3|অন্য ব্যবহারকারী|$3 ব্যবহারকারী}} ($2) থেকে $1পেয়েছেন।',
+'youhavenewmessagesmanyusers' => 'আপনি অনেক ব্যবহারকারী ($2) থেকে $1 পেয়েছেন।',
+'newmessageslinkplural' => '{{PLURAL:$1|একটি নতুন বার্তা|নতুন বার্তা}}',
+'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
 'youhavenewmessagesmulti' => 'আপনার $1টি নতুন বার্তা এসেছে',
 'editsection' => 'সম্পাদনা',
 'editold' => 'সম্পাদনা করুন',
@@ -426,6 +429,8 @@ $1',
 'cannotdelete' => '"$1" পাতা বা ফাইলটি মোছা সম্ভব না।
 সম্ভবত অন্য কেউ আগেই এটিকে মুছে ফেলেছেন।',
 'cannotdelete-title' => '"$1" পৃষ্ঠা মুছে ফেলা যাচ্ছে না।',
+'delete-hook-aborted' => 'হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।
+এর কোন ব্যাখ্যা নাই।',
 'badtitle' => 'শিরোনামটি গ্রহনযোগ্য নয়।',
 'badtitletext' => 'অনুরোধকৃত পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভুল আন্তঃভাষা বা আন্তঃউইকি শিরোনাম সংযোগ ছিল। এটিতে সম্ভবত এমন এক (একাধিক) ক্যারেক্টার আছে, যা (যেগুলি) শিরোনামে ব্যবহারযোগ্য নয়।',
 'perfcached' => 'নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং সম্পূর্ণ হালনাগাদকৃত না-ও হতে পারে। সর্বোচ্চ {{PLURAL:$1|একটি ফলাফল|$1 টি ফলাফল}} ক্যাশে থাকতে পারে।',
@@ -456,6 +461,8 @@ $2',
 একজন প্রশাসক যিনি এটাকে লকড করেছেন তার যৌক্তিকতা দেওয়া হল: "$3"',
 'invalidtitle-knownnamespace' => 'অবৈধ শিরনাম, যেখানে নামস্থান "$2" এবং লেখা হয়েছে "$3"',
 'invalidtitle-unknownnamespace' => 'অবৈধ শিরনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে "$2"',
+'exception-nologin' => 'লগইন করা হয়নি',
+'exception-nologin-text' => 'এই কাজটি করার জন্য উইকিতে লগইন করা প্রয়োজন।',
 
 # Virus scanner
 'virus-badscanner' => "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: ''$1''",
@@ -476,6 +483,7 @@ $2',
 'remembermypassword' => 'একাধিক সেশনের জন্য শব্দচাবি মনে রাখা হোক (সর্বোচ্চ $1 {{PLURAL:$1|দিনের|দিনের}} জন্য)',
 'securelogin-stick-https' => 'লগইনের পর এইচটিটিপিএস-এর সাথে সংযোগকৃত থাকুন',
 'yourdomainname' => 'আপনার ডোমেইন',
+'password-change-forbidden' => 'আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।',
 'externaldberror' => 'হয় কোন বহিঃস্থ যাচাইকরণ ডাটাবেজ ত্রুটি ঘটেছে অথবা আপনার বহিঃস্থ অ্যাকাউন্ট হালনাগাদ করার অনুমতি নেই।',
 'login' => 'প্রবেশ করুন',
 'nav-login-createaccount' => 'প্রবেশ/নতুন অ্যাকাউন্ট',
@@ -1373,9 +1381,9 @@ $1",
 পূর্বে আপলোড করা ফাইল দেখতে বা অনুসন্ধানে [[Special:FileList|পূর্বে আপলোড করা ফাইলের তালিকা]] দেখুন। (পুনঃ)আপলোড করা ফাইল এর নাম  [[Special:Log/upload|আপলোড লগে]] যোগ হয়, অপসারিত ফাইলের নাম [[Special:Log/delete|অপসারণ লগে]] রয়েছে।
 
 কোনো নিবন্ধে ছবি যোগ করতে হলে নিচের উদাহরণ অনুযায়ী সংযোগ দিন:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''',
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' অথবা
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''',
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' অথবা
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
 'upload-permitted' => 'যেসব ফাইলের ধরন অনুমোদিত: $1।',
 'upload-preferred' => 'যেসব ফাইলের ধরন পছন্দনীয়: $1।',
 'upload-prohibited' => 'যেসব ফাইলের ধরন নিষিদ্ধ: $1।',
@@ -1414,15 +1422,15 @@ $1",
 'largefileserver' => 'সার্ভারে যতখানি অনুমোদিত তার চেয়ে এই ফাইলের আকার বড়।',
 'emptyfile' => 'আপনি যে ফাইলটি আপলোড করেছেন, তা খালি মনে হচ্ছে। ফাইলের নামে টাইপিং ত্রুটির কারণে এরকম হতে পারে। অনুগ্রহ করে পরীক্ষা করে দেখুন আপনি আসলেই এই ফাইলটি আপলোড করতে চান কি না।',
 'windows-nonascii-filename' => 'এই উইকি বিশেষ ক্যারেক্টারসমৃদ্ধ ফাইলের নাম সমর্থন করে না।',
-'fileexists' => "এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান। অনুগ্রহ করে '''<tt>[[:$1]]</tt>''' পরীক্ষা করে দেখুন, যদি আপনি এটি পরিবর্তনের ব্যাপারে নিশ্চিত না হন। [[$1|thumb]]",
-'fileexists-extension' => "একই নামের আরেকটি ফাইল আছে: [[$2|thumb]]
-* আপলোড করা ফাইলের নাম: '''<tt>[[:$1]]</tt>'''
-* একই নামে বর্তমান ফাইলের নাম: '''<tt>[[:$2]]</tt>'''
-অনুগ্রহ করে একটি ভিন্ন নাম পছন্দ করুন।",
+'fileexists' => 'এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান। অনুগ্রহ করে <strong>[[:$1]]</strong> পরীক্ষা করে দেখুন, যদি আপনি এটি পরিবর্তনের ব্যাপারে নিশ্চিত না হন। [[$1|thumb]]',
+'fileexists-extension' => 'একই নামের আরেকটি ফাইল আছে: [[$2|thumb]]
+* আপলোড করা ফাইলের নাম: <strong>[[:$1]]</strong>
+* একই নামে বর্তমান ফাইলের নাম: <strong>[[:$2]]</strong>
+অনুগ্রহ করে একটি ভিন্ন নাম পছন্দ করুন।',
 'fileexists-thumbnail-yes' => "ফাইলটি একটি সংক্ষেপিত আকারের ছবি ''(থাম্বনেইল)'' বলে মনে হচ্ছে। [[$1|thumb]]
-অনুগ্রহ করে '''<tt>[[:$1]]</tt>''' ফাইলটি পরীক্ষা করে দেখুন।
+অনুগ্রহ করে <strong>[[:$1]]</strong> ফাইলটি পরীক্ষা করে দেখুন।
 যদি পরীক্ষাকৃত ফাইলটি একই ছবির মূল আকার হয়, তবে একটি অতিরিক্ত থাম্বনেইল আপলোড করার প্রয়োজন নেই।",
-'file-thumbnail-no' => "ফাইলের নামটি '''<tt>$1</tt>''' দিয়ে শুরু হয়েছে।
+'file-thumbnail-no' => "ফাইলের নামটি <strong>$1</strong> দিয়ে শুরু হয়েছে।
 মনে হচ্ছে এটি একটি সংকুচিত আকারের ছবি  ''(থাম্বনেইল)''।
 আপনার কাছে যদি পূর্ণ রেজোলিউশনের ছবিটি থাকে, তবে সেটি আপলোড করুন, নতুবা অনুগ্রহ করে ফাইলের নামটি পরিবর্তন করুন।",
 'fileexists-forbidden' => 'এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান, এবং এটি প্রতিস্থাপনযোগ্য নয়।
@@ -1592,7 +1600,7 @@ $1",
 
 # MIME search
 'mimesearch' => 'MIME অনুসন্ধান',
-'mimesearch-summary' => 'এই পাতার মাধ্যমে MIME-ধরন অনুসারে ফাইলগুলিকে ফিল্টার করা যায়। ইনপুট: contenttype/subtype, যেমন <tt>image/jpeg</tt>।',
+'mimesearch-summary' => 'এই পাতার মাধ্যমে MIME-ধরন অনুসারে ফাইলগুলিকে ফিল্টার করা যায়। ইনপুট: contenttype/subtype, যেমন <code>image/jpeg</code>।',
 'mimetype' => 'MIME ধরন:',
 'download' => 'ডাউনলোড',
 
@@ -2502,13 +2510,9 @@ $1',
 
 # Info page
 'pageinfo-header-edits' => 'সম্পাদনা',
-'pageinfo-header-watchlist' => 'নজরতালিকা',
-'pageinfo-header-views' => 'দৃষ্টিকোণ',
-'pageinfo-subjectpage' => 'পাতা',
-'pageinfo-talkpage' => 'আলাপ পাতা',
+'pageinfo-views' => 'পরিদর্শন সংখ্যা',
 'pageinfo-edits' => 'সম্পাদনা সংখ্যা',
 'pageinfo-authors' => 'সতন্ত্র সম্পাদকের সংখ্যা',
-'pageinfo-views' => 'পরিদর্শন সংখ্যা',
 
 # Patrolling
 'markaspatrolleddiff' => 'পরীক্ষিত বলে চিহ্নিত করুন',
@@ -3265,6 +3269,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'api-error-file-too-large' => 'আপনার জমাদানকৃত ফাইলটি অনেক বড়।',
 'api-error-filename-tooshort' => 'এই ফাইল নামটি খুবই ছোট।',
 'api-error-filetype-banned' => 'এই ধরনের ফাইল নিষিদ্ধ।',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|ফাইল ধরনটি অনুমোদিত নয়|ফাইল ধরনগুলো অনুমোদিত নয়}}। অনুমোদিত {{PLURAL:$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হল $2।',
 'api-error-filetype-missing' => 'এই ফাইলটির কোনো এক্সটেনশন নেই।',
 'api-error-hookaborted' => 'যে পরিবর্তনটি আপনি করার চেষ্টা করেছিলেন তা এক্সটেনশন হুক দ্বারা বাতিলকৃত হয়েছে।',
 'api-error-http' => 'অভ্যন্তরীণ ত্রুটি: সার্ভারে সংযোগ প্রদান করা সম্ভব হচ্ছে না।',
index aeccfb7..65e0217 100644 (file)
@@ -87,7 +87,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'তালাবিত থুৱাসি পাতার মা হমাসি আতাকুরার পতানি গুর',
 'tog-watchlisthideanons' => 'তালাবিত থুৱাসি পাতার মা বেনাঙর আতাকুরার পতানি গুর',
 'tog-watchlisthidepatrolled' => 'পরীক্ষিত অসে পতা অতা তালাবিত থুৱাসি পাতার মা গুর',
-'tog-nolangconversion' => 'সারুকর সিলপা থেপকর',
 'tog-ccmeonemails' => 'আরতারে দিয়াপেঠাউরি ইমেইল মরাঙউ কপি আহান যাকগা',
 'tog-diffonly' => 'ফারাকর তলে পাতাহানর বিষয়বস্তু নাদেখাদি',
 'tog-showhiddencats' => 'আরুমে আসে থাকহানি ফংকর',
@@ -662,8 +661,8 @@ $2',
 মনে থইস .css বারো .js পাতার নাঙ এতা রূহিবৃত্তির মাতুঙে হুরকা আতর ইকার মেয়েকল অরতাহে, যেসাদে {{ns:user}}:Foo/vector.css; কিন্তু এসাদে চিঙনাঙ নাইব: {{ns:user}}:Foo/Vector.css",
 'updated' => '(আপডেট)',
 'note' => "'''নোট:'''",
-'previewnote' => "'''à¦\8fহান à¦¹à§\81দà§\8dদা à¦\86à¦\97à¦\9aাহান;
-ফারাকহান এপাগাউ ইতু করানি নাইসে!'''",
+'previewnote' => "'''à¦\96িয়াল à¦\95র, à¦\8fহান à¦¹à§\81দà§\8dদা à¦\86à¦\97à¦\9aাহান।'''
+ফারাকহান এপাগাউ ইতু করানি নাইসে!",
 'previewconflict' => 'এরে আগচা এহান পতানির লয়াগত আসে ইকা অহান ইতু করানির পিসে চেইতে কিসারে ইতই অহানর অংতা আহান।',
 'session_fail_preview' => "'''ঙাক্করে দিস! সেশন ডাটা অতা মাঙনায় অতা ইতু নাইসে। কৃপা করিয়া বারো হৎনা কর।
 যদি অহানেউ কাম নাইলে, অহান ইলে তর অ্যাকাউন্টহাত্ত [[Special:UserLogout|লগ আউট]] করিয়া বারো লগ ইন কর।",
@@ -709,6 +708,7 @@ $2',
 
 পাতা এহান তি আরাতা হঙকরতেইতানা কিতা খালকরিয়া চা।
 তর সুবিধারকা পাতা এহানর পুসিসি লগ এহানাত দেনা ইল:",
+'moveddeleted-notice' => 'পাতা এহান থেইকরানি অসে।সূত্র হিসাবেতলে পাতা এহানর থেইকরানির লগ দেনা অইল।',
 'log-fulllog' => 'পুরা লগ চা',
 'edit-gone-missing' => 'পাতাহান আপডেট করানি নুৱারলাং।
 পাতাহান পুস পরসেগা সাত।',
@@ -717,6 +717,9 @@ $2',
 পাতাএহান আগেত্তর আসে।',
 
 # Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''সিঙুইস:''' টেমপ্লেটের ইনক্লুড অংতাহান ডাঙর অসে। টেমপ্লেট কতহান তিলকরানি নুওয়ারতে পারে।",
+'post-expand-template-inclusion-category' => 'যেহাত টেমপ্লেটর ইনক্লুড অংতাহান পাতাহানিত্ত লেমসে',
+'post-expand-template-argument-warning' => "' ' ' সিঙুইস: ' ' ' এরে পাতাহাত তিলসে টেম্পলেট এহার যুক্তি আহান লাম হেলসে। অহানে যুক্তি অহান বেলানি অইল।",
 'post-expand-template-argument-category' => 'পতাহাত পুসিসি মডেলর জর থা পরসেগা',
 'parser-template-loop-warning' => 'মডেলর তরিগ দেখরাং: [[$1]]',
 
@@ -776,6 +779,8 @@ $2',
 'revdelete-unsuppress' => 'সীমাবদ্ধতাহানি নেইকরেদে',
 'revdelete-log' => 'কারণ:',
 'revdel-restore' => 'দৃষ্টিপাত সিলকর',
+'revdel-restore-deleted' => 'পুছিসি সংস্করণহান',
+'revdel-restore-visible' => 'দেহাদেনা একরব সংস্করণহান',
 'pagehist' => 'পাতার ইতিহাসহান',
 'deletedhist' => 'ইতিহাসহান পুস',
 'revdelete-otherreason' => 'আর আর কারণ:',
@@ -812,12 +817,12 @@ $2',
 'mergelogpagetext' => 'তলে হাদি এহানর পাতার ইতিহাসর লগে আরাক পাতার ইতিহাস তিলকরিসি অতার লাতঙগ দেনা ইল।',
 
 # Diffs
-'history-title' => '"$1"-র à¦°à¦¿à¦­à¦¿à¦¸à¦¨ ইতিহাসহান',
+'history-title' => '"$1"-র à¦ªà¦¤à¦¾à¦¨à¦¿à¦° ইতিহাসহান',
 'lineno' => 'লাইন $1:',
 'compareselectedversions' => 'বাসাইল সংস্করণহানি তুলনা কর',
 'showhideselectedversions' => 'বাসিসি রিভিশনহানি দেখাদে/গুর',
 'editundo' => 'আলকর',
-'diff-multi' => '({{PLURAL:$1|হমবুকর রিভিসন আহান|$1 হমবুকর রিভিসন হানি}} দেহাদেনা এহাত না মিহিসে।)',
+'diff-multi' => '({{PLURAL:$2|আতাকুরা আগ |$2 গ আতাকুরা}} সম্পাদন অসে {{PLURAL:$1|হমবুকর রিভিসন আহান|$1 হমবুকর রিভিসন হানি}} দেহাদেনা এহাত না মিহিসে।)',
 
 # Search results
 'searchresults' => 'বিসারলে অতার ফলাফল',
@@ -837,6 +842,7 @@ $2',
 'shown-title' => 'হারি পাতাত $1 {{PLURAL:$1|ফলাফল|ফলাফলহানি}} দেহাদে',
 'viewprevnext' => 'চা ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'বিসারানির অপশনহানি',
+'searchmenu-exists' => "'''উইকি এহাত \"[[:\$1]]\" নাঙে পাতা আহান আসে'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" নাঙর পাতাহান এরে উইকিত হঙকর!'''",
 'searchhelp-url' => 'Help:পাংলাক',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|এরে prefix এতাল আসে পাতাহানি]]',
@@ -851,6 +857,7 @@ $2',
 'searchprofile-everything-tooltip' => 'হাব্বি থাকে বিসারা (য়্যারির পাতাতউ)',
 'searchprofile-advanced-tooltip' => 'নিজর লেপকরা নাঙথাকে বিসারা',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ৱাহি|$2 ৱাহিহানি}})',
+'search-result-category-size' => '{{PLURAL: $1 | 1 সদস্য | $1 সদস্যগি}} ({{PLURAL: $2 | 1 উপবিষয়থাকহানি | $2 হান}}, {{PLURAL: $3 | 1 ফাইল | $3 ফাইল}})',
 'search-result-score' => 'মান্নপা $1%',
 'search-redirect' => '(বারোআলথক $1)',
 'search-section' => '(অনুচ্ছেদ $1)',
@@ -865,6 +872,7 @@ $2',
 'searcheverything-enable' => 'হাব্বি নাঙথাকে বিসারা',
 'searchrelated' => 'সাকেই আসে',
 'searchall' => 'হাব্বি',
+'showingresultsheader' => "'''$4''' র কা {{PLURAL:$5|ফলহান '''$3''' র '''$1'''|ফলহানি '''$3''' র মা '''$1 - $2'''}}",
 'nonefound' => "'''নোট''': অকরাতই হুদ্দা কতহান নাঙরফাম বিসারানি অসিল।
 তর বিসারানিহান ''all:'' ব্যবহার করিয়া হারি কন্টেন্টর মা বিসারানিরকা লেপকর (য়্যারির পাতা, মডেল আদি), নাইলে প্রিফিক্স হিসেবে তর হাদাপাসত নাঙলাম ব্যবহার কর।",
 'search-nonefound' => 'তি বিসারার অহানর লগে মান্নাপাতা নাপারাঙ।',
@@ -932,6 +940,8 @@ $2',
 'email' => 'ইমেইল',
 'prefs-help-realname' => 'আয়ৌপা নাংহান নাদলেউ চলের।
 যদি তি দের অতাইলে তর কামর থাকাত দেনাত সুবিধা অইতই।',
+'prefs-help-email' => 'ই-মেইল ঠিকানা ঐচ্ছিক, তবে খন্তাচাবি পাহুরলে নুৱা করে খন্তাচাবি নেনাত এহান দরকার ইতই।',
+'prefs-help-email-others' => 'তি তর পরিচয় না ফঙ করিয়াউ তর আতাকুরার পাতা বারো য়্যারীর পাতাহানর মাতুঙে আরতারে তর লগে যোগাযোগ করানি দেনা পারর।',
 'prefs-advancedediting' => 'উচ্চতর অপশন',
 'prefs-advancedrc' => 'উচ্চতর অপশন',
 'prefs-advancedrendering' => 'উচ্চতর অপশন',
@@ -983,6 +993,10 @@ $2',
 'recentchanges' => 'হাদিএহান পতাসিতা',
 'recentchanges-legend' => 'হাদি এহানর পতানির পছনহানি',
 'recentchanges-feed-description' => 'ফিড এহানর মা পাতা এহার পতানিহানর গজে মিল্লেং দে।',
+'recentchanges-label-newpage' => 'সম্পাদনা এহানে নুৱা পাতা আহান হঙকরল',
+'recentchanges-label-minor' => 'এহান হুরকা সম্পাদনাহান',
+'recentchanges-label-bot' => 'সম্পাদনা এহান বটগই করিসেহানে',
+'recentchanges-label-unpatrolled' => 'সম্পাদনা এহান এবাকাউ পরীক্ষা করিয়া নাচাসি',
 'rcnote' => "গেলগা {{PLURAL:$2|দিনে|'''$2''' দিনে}} অসে {{PLURAL:$1|'''১'''|'''$1'''}}হান সিলপা তলে দেহানি ইল (যেহানর এপাগার খেন্তাম বারো তারিখ $5, $4)।",
 'rcnotefrom' => "তলে গেলগা '''$2''' ত্ত পতাসিতা দেনা অইল ('''$1''' পেয়া)।",
 'rclistfrom' => 'নুৱাতা পতাসিতা $1 পাতাহানাত্ত চিঙকরিয়া',
@@ -1022,9 +1036,9 @@ $2',
 আগেদে কাকরিসি ফাইল বিসারা [[Special:FileList|কাকরিসি ফাইলর লাতঙগ]], [[Special:Log/upload|আরাকমু কাকরিসি]] ফাইলর ইতিহাসহান, [[Special:Log/delete|পুসিসি]] ফাইলর ইতিহাসহান।
 
 পাতাহাত ছবি আগ বরানি মনেইলে, তলর উদাহরণর অসারে ইকর:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' ফাইলর আস্তা ভার্সনহান ব্যবহারর কা
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|সারুক ৱাহি]]</nowiki></tt>''' ২০০ পিক্সল চেপ্টা বাক্সগর বিঙেদে বদাগ দেনা বারো থাকরানির নিঙে 'সারুকে ৱাহি' বরানির কা
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' ফাইল নাদেখাদিয়া চুমেসত মিলাপর কা",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ফাইলর আস্তা ভার্সনহান ব্যবহারর কা
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|সারুক ৱাহি]]</nowiki></code>''' ২০০ পিক্সল চেপ্টা বাক্সগর বিঙেদে বদাগ দেনা বারো থাকরানির নিঙে 'সারুকে ৱাহি' বরানির কা
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' ফাইল নাদেখাদিয়া চুমেসত মিলাপর কা",
 'upload-permitted' => 'যে জাতর ফাইল কাকরানি(আপলোড) করানি থা: $1।',
 'upload-preferred' => 'যে জাতর ফাইল থা: $1।',
 'upload-prohibited' => 'যে জাতর ফাইল থা নেই: $1।',
@@ -1076,6 +1090,7 @@ $2',
 'filehist' => 'ফাইলর ইতিহাস',
 'filehist-help' => 'দিন/সময়-র গজে যাতিলে ঔ খেন্তাম পেয়া হঙিসে ফাইলগ চ পারতেই।',
 'filehist-deleteall' => 'হাব্বি পুস',
+'filehist-revert' => 'আগর অঙতাত আলকরে যাগা',
 'filehist-current' => 'এপাগা',
 'filehist-datetime' => 'দিন/সময়',
 'filehist-thumb' => 'হুরকাকরে ফটকগি',
@@ -1085,10 +1100,11 @@ $2',
 'filehist-filesize' => 'ফাইলর সাইজহান',
 'filehist-comment' => 'মতহান',
 'filehist-missing' => 'ফাইলগ মাঙুইসে',
-'imagelinks' => 'ফাà¦\87লর à¦\9cà§\81রনহানি',
+'imagelinks' => 'ফাà¦\87লর à¦¬à§\8dযবহার',
 'linkstoimage' => 'এরে ফাইলর লগে {{PLURAL:$1|পাতার মিলাপ|$1 পাতাহানির মিলাপ}} আসে:',
 'nolinkstoimage' => 'ফাইল এগর লগে মিলাপ অসে অসাদে কোন পাতা নেই।',
 'sharedupload' => 'ফাইল এগ $1ত্ত আহিসেগ বারো অন্যান্য প্রকল্পতউ ব্যবহৃত ইতে পারে।',
+'sharedupload-desc-here' => 'এরে ফাইলএগ $1 ত্ত বারো আর প্রকল্পত মিহিতে পারে। এহানর [$2 ফাইলর বিবরণ পাতা]-র গজে তলে হবাকরে মুকিয়া মাতানি ইল।',
 'uploadnewversion-linktext' => 'এরে ফাইল এগর নুৱা সংস্করনহান আপলোড কর',
 'shared-repo-from' => '$1 রাঙতো',
 
@@ -1127,6 +1143,7 @@ $2',
 'statistics-pages' => 'পাতাহানি',
 
 'disambiguations' => 'সন্দই চুমকরের পাতাহানি',
+'disambiguationspage' => 'Template:সন্দই চুম',
 
 'doubleredirects' => 'আলথকে যানা দ্বিমাউ মাতের',
 
@@ -1166,6 +1183,7 @@ $2',
 'deadendpages' => 'যে পাতাহানিত্ত কোন মিলাপ নেই',
 'protectedpages' => 'লুকরিসি পাতাহানি',
 'listusers' => 'আতাকুরার লাতংগ',
+'usercreated' => 'লিঙ্গ: $3 হঙিল $1 তারিখে, খেন্তাম: $2',
 'newpages' => 'নুৱা পাতাহানি',
 'newpages-username' => 'আতাকুরা:',
 'ancientpages' => 'পুরানা পাতাহানি',
@@ -1210,6 +1228,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 # Special:LinkSearch
 'linksearch' => 'বারেদের লগে মিলাপ',
+'linksearch-line' => '$2 ত্ত $1 এরে লিংক এহান আহিসেহান',
 
 # Special:ListUsers
 'listusers-submit' => 'দেহাদে',
@@ -1246,6 +1265,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Watchlist
 'watchlist' => 'মর তালাবি',
 'mywatchlist' => 'মর তালাবি',
+'watchlistfor2' => '$1 ($2)-র কা',
 'addedwatchtext' => "\"<nowiki>\$1</nowiki>\" পাতা এহান তর [[Special:Watchlist|আহির-আরুম তালিকা]]-ত তিলকরানি ইল। পিসেদে এরে পাতা এহান বারো পাতা এহানর লগে সাকেই আসে য়্যারী পাতাত অইতই হারি জাতর পতানি এহানাত তিলকরানি অইতই। অতাবাদেউ [[Special:RecentChanges|হাদি এহানর পতানিহানি]]-ত পাতা এহানরে '''গাঢ়করা''' মেয়েকে দেহা দেনা অইতই যাতে তি নুঙিকরে পাতা এহান চিনে পারবেতা।
 
 পিসেদে তি পাতা এহানরে থেইকরানি মনেইলে \"আহির-আরুমেত্ত থেইকরেদে\" ট্যাবগত ক্লিক করিস৷",
@@ -1271,6 +1291,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'confirmdeletetext' => 'তি যে পাতাহান পুসানি লেপুইসত অহানর লগে ইতিহাসহানউ পুসতই।
 তি লেপকর যে তি এহান করতেই বুলিয়া, বারো তি এহানর পিসহান হারপাসত লগে [[{{MediaWiki:Policy-url}}|পলিসিহান]] ইলয়া তি কামএহান করানিত লেপুইসত।',
 'actioncomplete' => 'কামহান লমিল।',
+'actionfailed' => 'অ্যাকশনহান পুরা নাইল',
 'deletedtext' => '"$1" পুসানি অইল।
 চা $2 এহার বারে আগে আসে পুসানির লাতংগ।',
 'dellogpage' => 'পুসিসিতার লাতংগ',
@@ -1328,6 +1349,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Undelete
 'undeletebtn' => 'বারোইতুকর',
 'undeletelink' => 'চা/আলথক কর',
+'undeleteviewlink' => 'দেহাদে',
 
 # Namespace form on various pages
 'namespace' => 'নাঙরথাক:',
@@ -1346,9 +1368,12 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'sp-contributions-newbies' => 'হুদ্দা নুৱা একাউন্টর অবদানহানি দেহাদে',
 'sp-contributions-newbies-sub' => 'নুৱা একাউন্টর কা',
 'sp-contributions-blocklog' => 'থেপকরিসি লগ',
+'sp-contributions-uploads' => 'আপলোডহানি',
+'sp-contributions-logs' => 'লগহানি',
 'sp-contributions-talk' => 'অতারা',
 'sp-contributions-search' => 'অবদানহানি বিসারা',
 'sp-contributions-username' => 'আইপি (IP) ঠিকানা নাইলে আতাকুরার নাঙহান:',
+'sp-contributions-toponly' => 'হুদ্দা অরে সম্পাদনা অহানি দেহাদে যেহানি হাদি এহানর সংস্করণহাত তিলসে।',
 'sp-contributions-submit' => 'বিসারা',
 
 # What links here
@@ -1359,13 +1384,14 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'nolinkshere' => "পাতা '''[[:$1]]'''হানাত কোন মিলাপ নেই।",
 'isredirect' => 'বুলনদের পাতা',
 'istemplate' => 'বরানি',
-'isimage' => 'à¦\9bবি মিলাপ',
+'isimage' => 'ফাà¦\87ল মিলাপ',
 'whatlinkshere-prev' => '{{PLURAL:$1|পিসেদে|পিসেদে $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|থাংনা|থাংনা $1}}',
 'whatlinkshere-links' => '← মিলাপহানি',
 'whatlinkshere-hideredirs' => '$1 হানি আলথকর দিশা দেহার',
 'whatlinkshere-hidetrans' => '$1 ট্রান্সক্লুশন',
 'whatlinkshere-hidelinks' => '$1 মিলাপহানি',
+'whatlinkshere-hideimages' => '$1 ছবি মিলাপ',
 'whatlinkshere-filters' => 'চালুনী',
 
 # Block/unblock
@@ -1399,7 +1425,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'badipaddress' => 'আইপি ঠিকানাহান গ্রহনযোগ্যনাইসে',
 'blockipsuccesssub' => 'থেপকরানিহান চুমিল',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] রে থেপকরিয়া থসি <br />থেপকরানিহান খাল করানি থকিলে,[[Special:BlockList| থেপকরিয়া থসি আইপি ঠিকানার তালিকাহান]] চা।',
-'ipblocklist' => 'থà§\87পà¦\95রিয়া à¦¥à¦¸à¦¿ à¦\86à¦\87পি à¦ à¦¿à¦\95ানা à¦¬à¦¾à¦°à§\8b à¦\86তাà¦\95à§\81রার à¦²à¦¾à¦¤à¦\99গি',
+'ipblocklist' => 'থà§\87পà¦\95রিয়া à¦¥à¦¸à¦¿ à¦\86তাà¦\95à§\81রাগি',
 'blocklink' => 'থেপ কর',
 'unblocklink' => 'ব্লকনাকরি',
 'change-blocklink' => 'ব্লক সিলকর',
@@ -1454,6 +1480,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Namespace 8 related
 'allmessages' => 'সিস্টেমর পৌহানি',
 'allmessagesname' => 'নাং',
+'allmessagesdefault' => 'আদ্যকার টেক্সট',
 'allmessagescurrent' => 'হাদি এহানর ৱাহি',
 'allmessagestext' => 'তলে মিডিয়াউইকির নাঙরথাকে পানা একরের সিস্টেম পৌহানির তালিকাহান দেনা ইল।
 কৃপা করিয়া [//www.mediawiki.org/wiki/Localisation মিডিয়াউইকি অনুবাদর হেইচা পাতাত] বারো [//translatewiki.net translatewiki.net] মিডিয়াউইকি অনুবাদ করানির কা যানা পারর।',
@@ -1535,6 +1562,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'tooltip-rollback' => '"রোলব্যাক" এরে পাতার লমিল পতাকুরার পতানিত ক্লিক আহাত আলথক নেনারকা',
 'tooltip-undo' => '"আলথক" এর পতানিহানরে আগর জাগাত নিতইগা বারো আগচা সহকারে পতানির ফরমহান নিকুলতই।
 এহান পতানির সারাংশত কারণহান তিলকরানির সুযোগ দিতই।',
+'tooltip-summary' => 'হুরকাকরে সারাংশহান মাতেদে',
 
 # Attribution
 'anonymous' => '{{SITENAME}}র বেনাঙর {{PLURAL:$1|আতাকুরা|আতাকুরাগি}}',
@@ -1572,7 +1600,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'metadata-help' => 'ফাইল এগত আরাকউ হেলপা পৌ খানি তিলুইসে, মনে অরতা ডিজিটাল ক্যামেরাগত্ত নাইলে স্ক্যানারহাত্ত হমাসে। যদি ফাইল এগ মুল অংতাত্ত পতিয়া থার অতা ইলে খানি মানি পৌ না তিলুতে পারে।',
 'metadata-expand' => 'আরাকউ সালকরিসি পৌ চা',
 'metadata-collapse' => 'সালকরিসি পৌ ঝিপা',
-'metadata-fields' => 'এরে পৌ এহান তিলসে EXIF মেটাপৌ অতা ছবির পাতাত দেখাদেনা ইতই, যেপাগা হেলপা উপাত্ত সারণি অতা জিপানি ইতই। হের ক্ষেত্রহানি স্বাভাবিক অবস্থাত জিপিয়া থাইতই।
+'metadata-fields' => 'এরে পৌ এহান তিলসে ছবি মেটাপৌ অতা ছবির পাতাত দেখাদেনা ইতই, যেপাগা হেলপা উপাত্ত সারণি অতা জিপানি ইতই। হের ক্ষেত্রহানি স্বাভাবিক অবস্থাত জিপিয়া থাইতই।
 * make
 * model
 * datetimeoriginal
@@ -1641,6 +1669,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchlisttools-edit' => 'তর তালাবির পাতা চা বারো পতা',
 'watchlisttools-raw' => 'পেরকা তালাবির পাতা পতা',
 
+# Core parser functions
+'duplicate-defaultsort' => '\' \' \' সিঙুইস: \' \' \'  ডিফল্ট হাজানির কিহানি "$2" আগর ডিফল্ট হাজানির কিহানিরে "$1" উচিত নাকরের।',
+
 # Special:Version
 'version' => 'সংস্করন',
 'version-specialpages' => 'বিশেষ পাতাহানি',
@@ -1666,6 +1697,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:BlankPage
 'blankpage' => 'হুদালা পাতাহান',
 
+# External image whitelist
+'external_image_whitelist' => '  #লাইন এহান ঠিক যেসাদে আসে<প্রাক> অসাদে থ<pre> #রেগুলার এক্সপ্রেশনর টুমা তলে (হুদ্দা টুমা / / হমবুকে যেহান যারগা) বহা#এহানি এক্সটার্নাল (hotlinked) ছবির URL-র লগে মিল করানি অইতই#যেতা মিলতই, ছবি হিসাবে দেহাদেনা অইতই, নাইলে হুদ্দা ছবির লিংক দেহানি অইতই#যে লাইন হানর পয়লা  # আসে অরে লাইনহানি মন্তব্যহানি হিসাবে ব্যবহার করানি অসে#এহান কেস-অসংবেদী#এহার রেখার গজে regex টুমা বহা। এরে লাইন এহান ঠিক যেসাদে আসে অসাদে থ।</pre>',
+
 # Special:Tags
 'tag-filter' => '[[Special:Tags|ট্যাগ]] সাকানি:',
 'tag-filter-submit' => 'সাকানি',
index 3e4f3ee..71565ae 100644 (file)
@@ -120,43 +120,43 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ADKAS', '#REDIRECT' ),
-       'numberofpages'           => array( '1', 'NIVERABAJENNOU', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NIVERABENNADOU', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NIVERARESTROU', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NIVERAIMPLIJERIEN', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NIVERAIMPLIJERIENOBERIANT', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NIVERAZEGASEDENNOU', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NIVERALENNADENNOU', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'ANVPAJENN', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ANVPAJENNSK', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ESAOUENNANV', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ESAOUENNANVSK', 'NAMESPACEE' ),
-       'fullpagename'            => array( '1', 'ANVPAJENNKLOK', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ANVPAJENNKLOKSK', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ANVISPAJENN', 'SUBPAGENAME' ),
-       'img_right'               => array( '1', 'dehou', 'right' ),
-       'img_left'                => array( '1', 'kleiz', 'left' ),
-       'img_none'                => array( '1', 'netra', 'none' ),
-       'img_center'              => array( '1', 'kreizenn', 'center', 'centre' ),
-       'img_page'                => array( '1', 'pajenn=$1', 'pajenn $1', 'page=$1', 'page $1' ),
-       'img_sub'                 => array( '1', 'is', 'sub' ),
-       'img_top'                 => array( '1', 'krec\'h', 'top' ),
-       'img_middle'              => array( '1', 'kreiz', 'middle' ),
-       'img_bottom'              => array( '1', 'traoñ', 'bottom' ),
-       'img_link'                => array( '1', 'liamm=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'ANVLEC\'HIENN', 'SITENAME' ),
-       'server'                  => array( '0', 'SERVIJER', 'SERVER' ),
-       'servername'              => array( '0', 'ANVSERVIJER', 'SERVERNAME' ),
-       'grammar'                 => array( '0', 'YEZHADUR:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'JENER:', 'GENDER:' ),
-       'plural'                  => array( '0', 'LIESTER:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'URLKLOK:', 'FULLURL:' ),
-       'currentversion'          => array( '1', 'STUMMRED', 'CURRENTVERSION' ),
-       'language'                => array( '0', '#YEZH:', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'dibar', 'special' ),
-       'pagesize'                => array( '1', 'MENTPAJENN', 'PAGESIZE' ),
-       'url_path'                => array( '0', 'HENT', 'PATH' ),
+       'redirect'                  => array( '0', '#ADKAS', '#REDIRECT' ),
+       'numberofpages'             => array( '1', 'NIVERABAJENNOU', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NIVERABENNADOU', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NIVERARESTROU', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NIVERAIMPLIJERIEN', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NIVERAIMPLIJERIENOBERIANT', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NIVERAZEGASEDENNOU', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NIVERALENNADENNOU', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'ANVPAJENN', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ANVPAJENNSK', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ESAOUENNANV', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ESAOUENNANVSK', 'NAMESPACEE' ),
+       'fullpagename'              => array( '1', 'ANVPAJENNKLOK', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ANVPAJENNKLOKSK', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ANVISPAJENN', 'SUBPAGENAME' ),
+       'img_right'                 => array( '1', 'dehou', 'right' ),
+       'img_left'                  => array( '1', 'kleiz', 'left' ),
+       'img_none'                  => array( '1', 'netra', 'none' ),
+       'img_center'                => array( '1', 'kreizenn', 'center', 'centre' ),
+       'img_page'                  => array( '1', 'pajenn=$1', 'pajenn $1', 'page=$1', 'page $1' ),
+       'img_sub'                   => array( '1', 'is', 'sub' ),
+       'img_top'                   => array( '1', 'krec\'h', 'top' ),
+       'img_middle'                => array( '1', 'kreiz', 'middle' ),
+       'img_bottom'                => array( '1', 'traoñ', 'bottom' ),
+       'img_link'                  => array( '1', 'liamm=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'ANVLEC\'HIENN', 'SITENAME' ),
+       'server'                    => array( '0', 'SERVIJER', 'SERVER' ),
+       'servername'                => array( '0', 'ANVSERVIJER', 'SERVERNAME' ),
+       'grammar'                   => array( '0', 'YEZHADUR:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'JENER:', 'GENDER:' ),
+       'plural'                    => array( '0', 'LIESTER:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'URLKLOK:', 'FULLURL:' ),
+       'currentversion'            => array( '1', 'STUMMRED', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#YEZH:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'dibar', 'special' ),
+       'pagesize'                  => array( '1', 'MENTPAJENN', 'PAGESIZE' ),
+       'url_path'                  => array( '0', 'HENT', 'PATH' ),
 );
 
 $bookstoreList = array(
@@ -185,7 +185,7 @@ $messages = array(
 'tog-hidepatrolled' => "Kuzhat ar c'hemmoù evezhiet e-touez ar c'hemmoù diwezhañ",
 'tog-newpageshidepatrolled' => 'Kuzhat ar pajennoù evezhiet diouzh roll ar pajennoù nevez',
 'tog-extendwatchlist' => 'Astenn ar roll evezhiañ a-benn diskouez an holl gemmoù ha neket ar re ziwezhañ hepken.',
-'tog-usenewrc' => "Ober gant ar c'hemmoù nevez gwellaet<br /> (rekis eo JavaScript)",
+'tog-usenewrc' => "Diskouez ar c'hemmoù nevez en ur feson kempennoc'h (rekis eo JavaScript)",
 'tog-numberheadings' => 'Niverenniñ emgefre an titloù',
 'tog-showtoolbar' => 'Diskouez ar varrenn gant ar meuzioù skridaozañ',
 'tog-editondblclick' => 'Daouglikañ evit kemmañ ur bajenn (JavaScript)',
@@ -193,15 +193,15 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Kemmañ ur rann dre glikañ a-zehou<br /> war titl ar rann',
 'tog-showtoc' => 'Diskouez an daolenn<br /> (evit ar pennadoù zo ouzhpenn 3 rann enno)',
 'tog-rememberpassword' => "Derc'hel soñj eus ma ger-tremen war an urzhiataer-mañ (evit $1 devezh{{PLURAL:$1||}} d'ar muiañ)",
-'tog-watchcreations' => 'Evezhiañ ar pajennoù krouet ganin',
-'tog-watchdefault' => 'Evezhiañ ar pennadoù savet pe kemmet ganin',
-'tog-watchmoves' => "Ouzhpennañ da'm roll evezhiañ ar pajennoù adanvet ganin",
-'tog-watchdeletion' => "Ouzhpennañ da'm roll evezhiañ ar pajennoù diverket ganin",
+'tog-watchcreations' => "Ouzhpennañ ar pajennoù krouet ganin da'm roll evezhiañ",
+'tog-watchdefault' => "Ouzhpennañ ar pajennoù kemmet ganin da'm roll evezhiañ",
+'tog-watchmoves' => "Ouzhpennañ ar pajennoù dilec'hiet ganin da'm roll evezhiañ",
+'tog-watchdeletion' => "Ouzhpennañ ar pajennoù diverket ganin da'm roll evezhiañ",
 'tog-minordefault' => "Sellet ouzh ar c'hemmoù degaset ganin<br /> evel kemmoù dister dre ziouer",
 'tog-previewontop' => 'Rakwelet tres ar bajenn a-us ar prenestr skridaozañ',
 'tog-previewonfirst' => 'Rakwelet tres ar bajenn kerkent hag an aozadenn gentañ',
 'tog-nocache' => 'Diweredekaat krubuilh ar pajennoù gant ar merdeer',
-'tog-enotifwatchlistpages' => 'Kas ur postel din pa vez kemmet ur bajenn evezhiet ganin',
+'tog-enotifwatchlistpages' => 'Kas ur postel din pa vez kemmet ur bajenn zo war ma roll evezhiañ',
 'tog-enotifusertalkpages' => 'Kas ur postel din pa vez kemmet ma fajenn gaozeal',
 'tog-enotifminoredits' => 'Kas ur postel din, ha pa vije evit kemenn kemmoù dister',
 'tog-enotifrevealaddr' => "Lakaat ma chomlec'h postel war wel er posteloù kemenn-diwall",
@@ -219,7 +219,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Er roll evezhiañ, kuzhat kemmoù an implijerien kevreet.',
 'tog-watchlisthideanons' => 'Er roll evezhiañ, kuzhat kemmoù an implijerien dianav',
 'tog-watchlisthidepatrolled' => "Kuzhat ar c'hemmoù evezhiet diouzh ar roll evezhiañ",
-'tog-nolangconversion' => 'Diweredekaat amdroadur an adstummoù yezh',
 'tog-ccmeonemails' => 'Kas din un eilskrid eus ar posteloù a gasan da implijerien all',
 'tog-diffonly' => "Arabat diskouez danvez ar pennadoù dindan an diforc'hioù",
 'tog-showhiddencats' => 'Diskouez ar rummadoù kuzhet',
@@ -382,7 +381,7 @@ $messages = array(
 'personaltools' => 'Ostilhoù personel',
 'postcomment' => 'Rann nevez',
 'articlepage' => 'Sellet ouzh ar pennad',
-'talk' => 'Kaozeal',
+'talk' => 'Kaozeadenn',
 'views' => 'Gweladennoù',
 'toolbox' => 'Boest ostilhoù',
 'userpage' => 'Pajenn implijer',
@@ -535,8 +534,11 @@ Kasit keloù d'ur [[Special:ListUsers/sysop|merer]], en ur verkañ dezhañ choml
 'cannotdelete' => 'Dibosupl diverkañ ar bajenn pe ar restr "$1".
 Marteze e o bet diverket gant unan bennak all dija.',
 'cannotdelete-title' => 'N\'haller ket diverkañ ar bajenn "$1"',
+'delete-hook-aborted' => "Nullet ar c'hemmañ gant un astenn.
+Abeg dianav.",
 'badtitle' => 'Titl fall',
-'badtitletext' => "Faziek pe c'houllo eo titl ar bajenn goulennet; pe neuze eo faziek al liamm etreyezhel",
+'badtitletext' => "Faziek pe c'houllo eo titl ar bajenn goulennet; pe neuze eo faziek al liamm etreyezhel pe etrewiki.
+Marteze ez eus ennañ arouezennoù n'haller ket degemer en titloù.",
 'perfcached' => "Krubuilhet eo ar roadennoù da-heul ha marteze n'int ket bet hizivaet. D'ar muiañ e c'haller kaout {{PLURAL:$1|un disoc'h|$1 disoc'h}} er grubuilh.",
 'perfcachedts' => "Krubuilhet eo ar roadennoù da-heul hag hizivaet int bet da ziwezhañ d'an $1. D'ar muiañ e c'haller kaout {{PLURAL:$4|un disoc'h|$4 disoc'h}} er grubuilh.",
 'querypage-no-updates' => 'Diweredekaet eo an hizivaat evit ar bajenn-mañ. Evit poent ne vo ket nevesaet ar roadennoù amañ.',
@@ -566,6 +568,8 @@ Setu amañ perak ''$2''.",
 "\'\'$3\'\'" eo an abeg roet gant ar merour en deus prennet anezhi.',
 'invalidtitle-knownnamespace' => 'Titl direizh gant an esaouenn anv "$2" hag an destenn "$3"',
 'invalidtitle-unknownnamespace' => 'Titl direizh gant an niverenn esaouenn anv $1 hag an destenn "$2" dianav',
+'exception-nologin' => "N'oc'h ket kevreet",
+'exception-nologin-text' => "Ar bajenn-mañ pe an ober-mañ a c'houlenn e vefec'h kevreet er wiki-mañ.",
 
 # Virus scanner
 'virus-badscanner' => "Kefluniadur fall : skanner viruzoù dianav : ''$1''",
@@ -808,7 +812,7 @@ Merkit mat an titouroù-se war kement goulenn savet ganeoc'h.
 'nosuchsectiontext' => "Klasket hoc'h eus kemmañ ur rann n'eus ket anezhi.
 Moarvat ez eo bet dilerc'hiet pe dilamet abaoe ma oa bet lennet ganeoc'h.",
 'loginreqtitle' => 'Anv implijer rekis',
-'loginreqlink' => 'Kevreañ',
+'loginreqlink' => 'kevreañ',
 'loginreqpagetext' => "Ret eo deoc'h $1 evit gwelet pajennoù all.",
 'accmailtitle' => 'Ger-tremen kaset.',
 'accmailtext' => "Kaset ez eus bet ur ger-tremen dargouezhek evit [[User talk:$1|$1]] da $2.
@@ -972,7 +976,7 @@ An abeg roet gant $3 zo ''$2''",
 'nextrevision' => "Stumm war-lerc'h →",
 'currentrevisionlink' => 'Gwelet ar stumm red',
 'cur' => 'red',
-'next' => "War-lerc'h",
+'next' => "war-lerc'h",
 'last' => 'kent',
 'page_first' => 'kentañ',
 'page_last' => 'diwezhañ',
@@ -1129,7 +1133,7 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
 'lineno' => 'Linenn $1:',
 'compareselectedversions' => 'Keñveriañ ar stummoù diuzet',
 'showhideselectedversions' => 'Diskouez/Kuzhat ar stummoù diuzet',
-'editundo' => 'disteuler',
+'editundo' => 'dizober',
 'diff-multi' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant {{PLURAL:$2|un implijer|$2 implijer}} kuzhet.)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant muioc'h eget $2 {{PLURAL:$2|implijer|implijer}} kuzhet.)",
 
@@ -1588,20 +1592,20 @@ S.o [[Special:NewFiles|rann ar skeudennoù nevez]] evit kaout ur sell gwiroc'h",
 'emptyfile' => "Evit doare eo goullo ar restr bet karget ganeoc'h. Moarvat eo abalamour d'an tipo en anv ar restr. Gwiriit mat e fell deoc'h pellgargañ ar restr-mañ.",
 'windows-nonascii-filename' => "N'eo ket skoret anvioù ar restroù enno arouezennoù dibar gant ar wiki-mañ.",
 'fileexists' => "Ur restr all gant an anv-se zo c'hoazh.
-Trugarez da wiriañ '''<tt>[[:$1]]</tt>''' ma n'oc'h ket sur e fell deoc'h kemmañ anezhi.
+Trugarez da wiriañ <strong>[[:$1]]</strong> ma n'oc'h ket sur e fell deoc'h kemmañ anezhi.
 [[$1|thumb]]",
-'filepageexists' => "Amañ '''<tt>[[:$1]]</tt>''' eo bet krouet ar bajenn zeskrivañ evit ar restr-mañ, padal n'eus restr ebet dezhi an anv-se evit c'hoazh.
+'filepageexists' => "Amañ <strong>[[:$1]]</strong> eo bet krouet ar bajenn zeskrivañ evit ar restr-mañ, padal n'eus restr ebet dezhi an anv-se evit c'hoazh.
 An diverradenn skrivet ganeoc'h ne vo ket gwelet war ar bajenn zeskrivañ.
 Mar fell deoc'h e teufe ho tiverradenn war wel eno eo ret deoc'h-c'hwi kemmañ anezhi hoc'h-unan.
 [[$1|thumb]]",
 'fileexists-extension' => "Bez' ez eus dija ur restr gant an anv-se war-bouez nebeut : [[$2|thumb]]
-* Anv ar restr emeur oc'h enporzhiañ : '''<tt>[[:$1]]</tt>'''
-* Anv ar restr zo anezhi dija : '''<tt>[[:$2]]</tt>'''
+* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>
+* Anv ar restr zo anezhi dija : <strong>[[:$2]]</strong>
 Dibabit un anv all mar plij.",
 'fileexists-thumbnail-yes' => "Evit doare ez eus ur skeudenn krennet he ment eus ar restr ''(thumbnail)''. [[$1|thumb]]
-Gwiriit ar restr '''<tt>[[:$1]]</tt>'''.
+Gwiriit ar restr <strong>[[:$1]]</strong>.
 Mard eo an hevelep skeudenn ha hini ar restr orin, ha heñvel he ment, n'eo ket dav pellgargañ ur stumm krennet ouzhpenn.",
-'file-thumbnail-no' => "Kregiñ a ra anv ar restr gant '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Kregiñ a ra anv ar restr gant <strong>$1</strong>.
 Evit doare eo ur skeudenn krennet he ment ''(thumbnail)''.
 Ma'z eus ganeoc'h ur skeudenn uhel he fizhder, pellgargit anezhi; a-hend-all cheñchit anv ar restr.",
 'fileexists-forbidden' => "Ur restr all gant an anv-se zo c'hoazh ha n'hall ket bezan diverket.
@@ -1610,7 +1614,7 @@ Mar fell deoc'h enporzhiañ ho restr memes tra, kit war ho kiz ha grit gant un a
 Mar fell deoc'h enporzhiañ ar restr-mañ da vat, kit war ho kiz hag enporzhiit anezhi adarre dindan un anv all. [[File:$1|thumb|center|$1]]",
 'file-exists-duplicate' => 'Un eil eus ar {{PLURAL:$1|restr|restroù}} da-heul eo ar restr-mañ :',
 'file-deleted-duplicate' => "Diverket ez eus bet c'hoazh ur restr heñvel-poch ouzh ar restr-mañ ([[:$1]]). Gwelloc'h e vefe deoc'h teuler ur sell war istor diverkadenn ar bajenn-se a-raok hec'h enporzhiañ en-dro.",
-'uploadwarning' => 'Diwallit!',
+'uploadwarning' => 'Kemenn diwall en ur ezporzhiañ',
 'uploadwarning-text' => 'Cheñchit deskrivadur ar restr a-is ha klaskit en-dro.',
 'savefile' => 'Enrollañ ar restr',
 'uploadedimage' => '"[[$1]]" enporzhiet',
@@ -1710,6 +1714,7 @@ Ma talc'h ar gudenn, kit e darempred gant [[Special:ListUsers/sysop|merourien ar
 'lockmanager-fail-releaselock' => 'Dibosupl leuskel ar prenn digor evit "$1".',
 'lockmanager-fail-db-bucket' => "Dibosupl mont e darempred gant diazoù roadennoù a-walc'h evit ar c'helornad $1.",
 'lockmanager-fail-db-release' => 'Dibosupl da leuskel ar prennoù digor war an diaz roadennoù $1.',
+'lockmanager-fail-svr-acquire' => 'Dibosupl eo bet tapout ar prennoù war ar servijer $1.',
 'lockmanager-fail-svr-release' => 'Dibosupl da leuskel ar prennoù digor war ar servijer $1.',
 
 # ZipDirectoryReader
@@ -1859,7 +1864,7 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
 
 # MIME search
 'mimesearch' => 'Klask MIME',
-'mimesearch-summary' => 'Aotren a ra ar bajenn-mañ ar silañ restroù evit ar seurt restroù MIME. Enmont : seurt/isseurt, evel <tt>skeudenn/jpeg</tt>.',
+'mimesearch-summary' => 'Aotren a ra ar bajenn-mañ ar silañ restroù evit ar seurt restroù MIME. Enmont : seurt/isseurt, evel <code>skeudenn/jpeg</code>.',
 'mimetype' => 'Seurt MIME :',
 'download' => 'pellgargañ',
 
@@ -1949,7 +1954,7 @@ $1 {{PLURAL:$1|rummad|rummad}}',
 'unusedcategories' => 'Rummadoù dizimplij',
 'unusedimages' => 'Skeudennoù en o-unan',
 'popularpages' => 'Pajennoù sellet ar muiañ',
-'wantedcategories' => 'Rummadoù a vank',
+'wantedcategories' => 'Rummadoù goulennet a vank',
 'wantedpages' => 'Pajennoù goulennet ar muiañ',
 'wantedpages-badtitle' => "Titl direizh er strollad disoc'hoù : $1",
 'wantedfiles' => 'Restroù a vank',
@@ -2042,9 +2047,9 @@ Gallout a rit strishaat ar mod diskwel en ur zibab ar marilh, an anv implijer (d
 
 # Special:Categories
 'categories' => 'Roll ar rummadoù',
-'categoriespagetext' => 'Er {{PLURAL:$1|rummad|rummadoù}}da-heul ez eus pajennoù pe restroù media.
+'categoriespagetext' => 'Er {{PLURAL:$1|rummad|rummadoù}} da-heul ez eus pajennoù pe restroù media.
 Ne ziskouezer ket amañ ar [[Special:UnusedCategories|Rummadoù dizimplij]].
-Gwelet ivez ar [[Special:WantedCategories|rummadoù a vank]].',
+Gwelet ivez ar [[Special:WantedCategories|rummadoù goulennet a vank]].',
 'categoriesfrom' => 'Diskouez ar rummadoù en ur gregiñ gant :',
 'special-categories-sort-count' => 'Urzhiañ dre gont',
 'special-categories-sort-abc' => 'urzh al lizherenneg',
@@ -2061,7 +2066,7 @@ Gwelet ivez ar [[Special:WantedCategories|rummadoù a vank]].',
 'linksearch-ok' => 'Klask',
 'linksearch-text' => 'Gallout a reer implijout arouezennoù "joker" evel, da skouer, "*.wikipedia.org".
 Rekis eo dezho un domani a-us da nebeutañ evel, da skouer, "*.org".<br />
-Protokoloù skoret : <tt>$1</tt> (na lakait hini ebet eus ar re-se en ho klask)',
+Protokoloù skoret : <code>$1</code> (na lakait hini ebet eus ar re-se en ho klask)',
 'linksearch-line' => '$1 gant ul liamm adal $2',
 'linksearch-error' => "N'hall an arouezennoù joker bezañ implijet nemet e deroù anv domani an ostiz.",
 
@@ -2074,7 +2079,7 @@ Protokoloù skoret : <tt>$1</tt> (na lakait hini ebet eus ar re-se en ho klask)'
 # 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|degasadenn}} abaoe an {{PLURAL:$3|deiz}} diwezhañ',
+'activeusers-count' => '$1 {{PLURAL:$1|degasadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ',
 'activeusers-from' => 'Diskouez an implijerien adal :',
 'activeusers-hidebots' => 'Kuzhat ar robotoù',
 'activeusers-hidesysops' => 'Kuzhat ar verourien',
@@ -2153,7 +2158,7 @@ a-benn gellout kemmañ ho roll evezhiañ.",
 'addedwatchtext' => 'Ouzh ho [[Special:Watchlist|rollad evezhiañ]] eo bet ouzhpennet ar bajenn "[[:$1]]".
 Kemmoù da zont ar bajenn-mañ ha re ar bajenn gaozeal stag outi a vo rollet amañ hag e teuio ar bajenn <b>e tev</b> er [[Special:RecentChanges|roll kemmoù diwezhañ]] evit bezañ gwelet aesoc\'h ganeoc\'h.
 
-Evit tennañ ar bajenn-mañ a-ziwar ho rollad evezhiañ. klikit war "Paouez da evezhiañ" er framm merdeiñ.',
+Evit tennañ ar bajenn-mañ a-ziwar ho rollad evezhiañ, klikit war "Paouez da evezhiañ" er framm merdeiñ.',
 'removewatch' => 'Lemel a-ziwar ar roll evezhiañ',
 'removedwatchtext' => 'Lamet eo bet ar bajenn "[[:$1]]" a-ziwar ho [[Special:Watchlist|roll evezhiañ]].',
 'watch' => 'Evezhiañ',
@@ -2162,7 +2167,7 @@ Evit tennañ ar bajenn-mañ a-ziwar ho rollad evezhiañ. klikit war "Paouez da e
 'unwatchthispage' => 'Paouez da evezhiañ',
 'notanarticle' => 'Pennad ebet',
 'notvisiblerev' => 'Stumm diverket',
-'watchnochange' => "Pajenn ebet eus ar re evezhiet ganeoc'h n'eo bet kemmet e-pad ar prantad spisaet",
+'watchnochange' => "N'ez eus elfenn ebet eus ar re evezhiet ganeoc'h a zo bet kemmet e-pad ar prantad spisaet",
 'watchlist-details' => "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 pajenn}} dindan evezh, anez kontañ ar pajennoù kaozeal.",
 'wlheader-enotif' => "* War enaou emañ ar c'has posteloù.",
 'wlheader-showupdated' => "* E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
@@ -2480,11 +2485,8 @@ Roit a-is an abeg resis (o verkañ, da skouer, roll ar pajennoù bet graet gaou
 'ipb-confirm' => 'Kadarnaat ar stankadenn',
 'badipaddress' => "Kamm eo ar chomlec'h IP.",
 'blockipsuccesssub' => 'Stankadenn deuet da benn vat',
-'blockipsuccesstext' => 'Stanket eo bet chomlec\'h IP "$1".
-<br />Gallout a rit sellet ouzh ar [[Special:BlockList|bajenn-mañ]] evit gwelet roll ar chomlec\'hioù IP stanket.
-
-Stanket eo bet [[Special:Contributions/$1|$1]].<br />
-Sellit ouzh [[Special:BlockList|roll ar chomlec\'hioù IP ha kontoù stanket]] evit gwiriañ ar stankadennoù.',
+'blockipsuccesstext' => "Stanket eo bet [[Special:Contributions/$1|$1]].<br />
+Sellit ouzh [[Special:BlockList|roll ar chomlec'hioù IP ha kontoù stanket]] evit gwiriañ ar stankadennoù.",
 'ipb-blockingself' => "Emaoc'h war-nes stankañ ac'hanoc'h hoc'h-unan ! Ha sur oc'h eo se a fell deoc'h ober ?",
 'ipb-confirmhideuser' => 'Emaoc\'h war-nes stankañ un implijer ha gweredekaet hoc\'h eus "kuzhat an implijer". Diverkañ a ra an dra-se anv an implijer en holl rolloù ha monedoù ar marilh.',
 'ipb-edit-dropdown' => 'Kemmañ an abegoù stankañ',
@@ -2529,7 +2531,7 @@ Sellit ouzh [[Special:BlockList|roll ar chomlec\'hioù IP ha kontoù stanket]] e
 'contribslink' => 'degasadennoù',
 'emaillink' => 'Kas ur postel',
 'autoblocker' => 'Emstanket rak implijet eo bet ho chomlec\'h IP gant "[[User:$1|$1]]" nevez zo.
-Setu aze an abeg(où) m\'eo bet stanket $1 : "$2"',
+Setu aze an abeg(où) m\'eo bet stanket $1 : "\'\'$2\'\'"',
 'blocklogpage' => 'Roll ar stankadennoù',
 'blocklog-showlog' => "Stanket eo bet an implijer-mañ c'hoazh. A-is emañ marilh ar stankadennoù, d'ho titouriñ :",
 'blocklog-showsuppresslog' => "Stanket ha kuzhet eo bet an implijer-mañ c'hoazh. A-is emañ marilh ar diverkadennoù, d'ho titouriñ :",
@@ -2700,8 +2702,8 @@ Mard eo se e c'hallit ivez implijout ul liamm a seurt gant [[{{#Special:Export}}
 # Namespace 8 related
 'allmessages' => 'Roll kemennoù ar reizhiad',
 'allmessagesname' => 'Anv',
-'allmessagesdefault' => 'Testenn dre ziouer',
-'allmessagescurrent' => 'Testenn zo bremañ',
+'allmessagesdefault' => 'Kemennadenn dre ziouer',
+'allmessagescurrent' => 'Kemennadenn zo bremañ',
 'allmessagestext' => "Setu roll ar c'hemennadennoù reizhiad a c'haller kaout en esaouennoù anv MediaWiki.
 Kit da welet [//www.mediawiki.org/wiki/Localisation Lec'heladur MediaWiki] ha [//translatewiki.net translatewiki.net] mar fell deoc'h kemer perzh e lec'heladur boutin MediaWiki.",
 'allmessagesnotsupportedDB' => "N'haller ket kaout {{ns:special}}:AllMessages rak diweredekaet eo bet wgUseDatabaseMessages.",
@@ -2915,19 +2917,15 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'spambot_username' => 'Naetaat ar strob gant MediaWiki',
 'spam_reverting' => "Distreiñ d'ar stumm diwezhañ hep liamm davet $1",
 'spam_blanking' => 'Diverkañ an holl stummoù enno liammoù davet $1',
+'spam_deleting' => 'An holl stummoù enno liammoù war-zu $1, o tiverkañ',
 
 # Info page
 'pageinfo-title' => 'Titouroù evit "$1"',
 'pageinfo-header-edits' => 'Kemmoù',
-'pageinfo-header-watchlist' => 'Roll evezhiañ',
-'pageinfo-header-views' => 'Gweladennoù',
-'pageinfo-subjectpage' => 'Pajenn',
-'pageinfo-talkpage' => 'Pajenn gaozeal',
+'pageinfo-views' => 'Niver a weladennoù',
 'pageinfo-watchers' => 'Niver a dud o heuliañ',
 'pageinfo-edits' => 'Niver a gemmoù',
 'pageinfo-authors' => 'Niver a aozerien disheñvel',
-'pageinfo-views' => 'Niver a weladennoù',
-'pageinfo-viewsperedit' => 'Gweladenoù dre gemmoù',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -2968,8 +2966,8 @@ $1',
 'filedelete-archive-read-only' => 'N\'hall ket ar servijer web skrivañ war ar c\'havlec\'h dielloù "$1".',
 
 # Browsing diffs
-'previousdiff' => '← Stumm kent',
-'nextdiff' => "Stumm nevesoc'h →",
+'previousdiff' => '← Kemm kent',
+'nextdiff' => "Kemm nevesoc'h →",
 
 # Media information
 'mediawarning' => "'''Diwallit :''' Kodoù siek a c'hall bezañ er seurt restr-mañ.
@@ -3672,7 +3670,7 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
 * <span class="mw-specialpagecached">Pajennoù dibar krubuilhet hepken (a c\'hellfe bezañ re gozh).</span>',
 'specialpages-group-maintenance' => "Rentaoù-kont trezalc'h",
 'specialpages-group-other' => 'Pajennoù dibar all',
-'specialpages-group-login' => 'Kevreañ / en em enrollañ',
+'specialpages-group-login' => 'Kevreañ / krouiñ ur gont',
 'specialpages-group-changes' => 'Kemmoù diwezhañ ha marilhoù',
 'specialpages-group-media' => 'Danevelloù ar restroù media hag an enporzhiadennoù',
 'specialpages-group-users' => 'An implijerien hag o gwirioù',
@@ -3806,9 +3804,12 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'api-error-empty-file' => "Ar restr hoc'h eus roet a oa goullo.",
 'api-error-emptypage' => "N'eo ket aotreet krouiñ pajennoù goullo.",
 'api-error-fetchfileerror' => 'Fazi diabarzh : aet ez eus un dra bennak a-dreuz en ur glask adtapout ar restr.',
+'api-error-fileexists-forbidden' => 'Bez\' ez eus c\'hoazh eus ur restr anvet "$1" ha n\'hall ket bezañ friket.',
+'api-error-fileexists-shared-forbidden' => "Bez' ez eus c'hoazh eus ur restr anvet \"\$1\" er c'havlec'h kenrannañ restroù ha n'hall ket bezañ friket anezhi.",
 'api-error-file-too-large' => "Ar restr hoc'h eus roet a oa re vras.",
 'api-error-filename-tooshort' => 'Re verr eo anv ar restr.',
 'api-error-filetype-banned' => 'Difennet eo ar seurt restroù',
+'api-error-filetype-banned-type' => "'''N'eo ket $1 {{PLURAL:$4|ur seurt restr aotreet|seurtoù restroù aotreet}}. $2 eo {{PLURAL:$3|ar seurt restroù|ar seurtoù restroù}} degemeret.",
 'api-error-filetype-missing' => "Un astenn a vank d'ar restr.",
 'api-error-hookaborted' => "Ar c'hemm hoc'h eus klasket degas zo bet harzet gant ur c'hrog astenn.",
 'api-error-http' => "Fazi diabarzh : dibosupl kevreañ d'ar servijer.",
index 68c3e0e..d0d6682 100644 (file)
@@ -147,132 +147,132 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#PREUSMJERI', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORSIRANISADRŽAJ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__SADRŽAJ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'TRENUTNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'TRENUTNIMJESEC1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'TRENUTNIMJESECIME', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'TRENUTNIMJESECROD', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'TRENUTNIMJESECSKR', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'TRENUTNIDAN', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'TRENUTNIDAN2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'TRENUTNIDANIME', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'TRENUTNAGODINA', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'TRENUTNOVRIJEME', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'TRENUTNISAT', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LOKALNIMJESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LOKALNIMJESEC1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'LOKALNIMJESECIME', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'LOKALNIMJESECIMEROD', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'LOKALNIMJESECSKR', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'LOKALNIDAN', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'LOKALNIDAN2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'LOKALNAGODINA', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LOKALNOVRIJEME', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'LOKALNISAT', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'BROJSTRANICA', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'BROJČLANAKA', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'BROJPROMJENA', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'STRANICA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'STRANICE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'PROSTORSUBJEKTA', 'PROSTORCLANAKA', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'PROSTORISUBJEKTA', 'PROSTORICLANKA', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'PUNOIMESTRANE', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'PUNOIMESTRANEE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'IMEPODSTRANICE', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'IMENAPODSTRANICE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'IMEBAZNESTRANICE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'IMENABAZNESTRANICE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'IMESTRANICERAZGOVORA', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'IMENASTRANICERAZGOVORA', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'IMESTRANICESUBKJEKTA', 'IMESTRANICECLANKA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'IMENASTRANICESUBJEKTA', 'IMENASTRANICECLANAKA', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'POR:', 'MSG:' ),
-       'subst'                   => array( '0', 'ZAMJENI:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'NVPOR:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'desno', 'd', 'right' ),
-       'img_left'                => array( '1', 'lijevo', 'l', 'left' ),
-       'img_none'                => array( '1', 'n', 'bez', 'none' ),
-       'img_width'               => array( '1', '$1piksel', '$1p', '$1px' ),
-       'img_center'              => array( '1', 'centar', 'c', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'bez_okvira', 'frameless' ),
-       'img_page'                => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'granica', 'border' ),
-       'img_baseline'            => array( '1', 'pocetna_linija', 'baseline' ),
-       'img_sub'                 => array( '1', 'odjeljak', 'sub' ),
-       'img_top'                 => array( '1', 'vrh', 'top' ),
-       'img_text_top'            => array( '1', 'vrh_teksta', 'text-top' ),
-       'img_middle'              => array( '1', 'sredina', 'middle' ),
-       'img_bottom'              => array( '1', 'dugme', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'tekst-dugme', 'text-bottom' ),
-       'sitename'                => array( '1', 'IMESAJTA', 'SITENAME' ),
-       'ns'                      => array( '0', 'IP:', 'NS:' ),
-       'localurl'                => array( '0', 'LOKALNAADRESA:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALNEADRESE:', 'LOCALURLE:' ),
-       'servername'              => array( '0', 'IMESERVERA', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SKRIPTA', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'POL:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__BEZTC__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__BEZCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'TRENUTNASEDMICA', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'TRENUTNIDOV', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'LOKALNASEDMICA', 'LOCALWEEK' ),
-       'revisionid'              => array( '1', 'IDREVIZIJE', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'REVIZIJEDANA', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'REVIZIJEDANA2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'REVIZIJAMJESECA', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'REVIZIJAGODINE', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'REVIZIJAVREMENSKOGPECATA', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'MNOŽINA:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'PUNURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'PUNURLE:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'LCPRVI:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'UCPRVI:', 'UCFIRST:' ),
-       'displaytitle'            => array( '1', 'POKAZINASLOV', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__LINKNOVESEKCIJE__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'SADASNJAVERZIJA', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'DEKODIRAJADRESU', 'URLENCODE:' ),
-       'currenttimestamp'        => array( '1', 'SADASNJIVREMENSKIPECAT', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'LOKALNIVREMENSKIPECAT', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#JEZIK:', '#LANGUAGE:' ),
-       'pagesinnamespace'        => array( '1', 'STRANICEUIMENSKOMPROSTORU:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'BROJADMINISTRATORA', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'NUMERICKIFORMAT', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'JASTUKLIJEVO', 'PADLEFT' ),
-       'padright'                => array( '0', 'JASTUKDESNO', 'PADRIGHT' ),
-       'special'                 => array( '0', 'specijalno', 'special' ),
-       'filepath'                => array( '0', 'STAZADATOTEKE:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'oznaka', 'tag' ),
-       'hiddencat'               => array( '1', '__SAKRIVENAKATEGORIJA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'STRANICEUKATEGORIJI', 'STRANICEUKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'VELICINASTRANICE', 'PAGESIZE' ),
-       'index'                   => array( '1', '__SADRZAJ__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__BEZSADRZAJA__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'BROJUGRUPI', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__STATISTICNOPREUSMJERENJE__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'NIVOZASTITE', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'formatdatuma', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'PUTANJA', 'PATH' ),
-       'url_query'               => array( '0', 'UPIT', 'QUERY' ),
+       'redirect'                  => array( '0', '#PREUSMJERI', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORSIRANISADRŽAJ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__SADRŽAJ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'TRENUTNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'TRENUTNIMJESEC1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'TRENUTNIMJESECIME', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'TRENUTNIMJESECROD', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'TRENUTNIMJESECSKR', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'TRENUTNIDAN', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'TRENUTNIDAN2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'TRENUTNIDANIME', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'TRENUTNAGODINA', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'TRENUTNOVRIJEME', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'TRENUTNISAT', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LOKALNIMJESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LOKALNIMJESEC1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'LOKALNIMJESECIME', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'LOKALNIMJESECIMEROD', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'LOKALNIMJESECSKR', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'LOKALNIDAN', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKALNIDAN2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'LOKALNAGODINA', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LOKALNOVRIJEME', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'LOKALNISAT', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'BROJSTRANICA', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'BROJČLANAKA', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'BROJPROMJENA', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'STRANICA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'STRANICE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'PROSTORSUBJEKTA', 'PROSTORCLANAKA', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'PROSTORISUBJEKTA', 'PROSTORICLANKA', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'PUNOIMESTRANE', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'PUNOIMESTRANEE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'IMEPODSTRANICE', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'IMENAPODSTRANICE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'IMEBAZNESTRANICE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'IMENABAZNESTRANICE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'IMESTRANICERAZGOVORA', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'IMENASTRANICERAZGOVORA', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'IMESTRANICESUBKJEKTA', 'IMESTRANICECLANKA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'IMENASTRANICESUBJEKTA', 'IMENASTRANICECLANAKA', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'POR:', 'MSG:' ),
+       'subst'                     => array( '0', 'ZAMJENI:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'NVPOR:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'desno', 'd', 'right' ),
+       'img_left'                  => array( '1', 'lijevo', 'l', 'left' ),
+       'img_none'                  => array( '1', 'n', 'bez', 'none' ),
+       'img_width'                 => array( '1', '$1piksel', '$1p', '$1px' ),
+       'img_center'                => array( '1', 'centar', 'c', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'bez_okvira', 'frameless' ),
+       'img_page'                  => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'granica', 'border' ),
+       'img_baseline'              => array( '1', 'pocetna_linija', 'baseline' ),
+       'img_sub'                   => array( '1', 'odjeljak', 'sub' ),
+       'img_top'                   => array( '1', 'vrh', 'top' ),
+       'img_text_top'              => array( '1', 'vrh_teksta', 'text-top' ),
+       'img_middle'                => array( '1', 'sredina', 'middle' ),
+       'img_bottom'                => array( '1', 'dugme', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'tekst-dugme', 'text-bottom' ),
+       'sitename'                  => array( '1', 'IMESAJTA', 'SITENAME' ),
+       'ns'                        => array( '0', 'IP:', 'NS:' ),
+       'localurl'                  => array( '0', 'LOKALNAADRESA:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALNEADRESE:', 'LOCALURLE:' ),
+       'servername'                => array( '0', 'IMESERVERA', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SKRIPTA', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'POL:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__BEZTC__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__BEZCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'TRENUTNASEDMICA', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'TRENUTNIDOV', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'LOKALNASEDMICA', 'LOCALWEEK' ),
+       'revisionid'                => array( '1', 'IDREVIZIJE', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'REVIZIJEDANA', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'REVIZIJEDANA2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'REVIZIJAMJESECA', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'REVIZIJAGODINE', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'REVIZIJAVREMENSKOGPECATA', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'MNOŽINA:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'PUNURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'PUNURLE:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'LCPRVI:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'UCPRVI:', 'UCFIRST:' ),
+       'displaytitle'              => array( '1', 'POKAZINASLOV', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__LINKNOVESEKCIJE__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'SADASNJAVERZIJA', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'DEKODIRAJADRESU', 'URLENCODE:' ),
+       'currenttimestamp'          => array( '1', 'SADASNJIVREMENSKIPECAT', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'LOKALNIVREMENSKIPECAT', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#JEZIK:', '#LANGUAGE:' ),
+       'pagesinnamespace'          => array( '1', 'STRANICEUIMENSKOMPROSTORU:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'BROJADMINISTRATORA', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'NUMERICKIFORMAT', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'JASTUKLIJEVO', 'PADLEFT' ),
+       'padright'                  => array( '0', 'JASTUKDESNO', 'PADRIGHT' ),
+       'special'                   => array( '0', 'specijalno', 'special' ),
+       'filepath'                  => array( '0', 'STAZADATOTEKE:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'oznaka', 'tag' ),
+       'hiddencat'                 => array( '1', '__SAKRIVENAKATEGORIJA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'STRANICEUKATEGORIJI', 'STRANICEUKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'VELICINASTRANICE', 'PAGESIZE' ),
+       'index'                     => array( '1', '__SADRZAJ__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__BEZSADRZAJA__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'BROJUGRUPI', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__STATISTICNOPREUSMJERENJE__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVOZASTITE', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'formatdatuma', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'PUTANJA', 'PATH' ),
+       'url_query'                 => array( '0', 'UPIT', 'QUERY' ),
 );
 
 $fallback8bitEncoding = "iso-8859-2";
@@ -321,7 +321,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Sakrij promjene prijavljenih korisnika sa liste praćenja',
 'tog-watchlisthideanons' => 'Sakrij promjene anonimnih korisnika sa liste praćenja',
 'tog-watchlisthidepatrolled' => 'Sakrij patrolirane izmjene sa spiska praćenja',
-'tog-nolangconversion' => 'Onemogući konverziju varijanti',
 'tog-ccmeonemails' => 'Pošalji mi kopije emailova koje pošaljem drugim korisnicima',
 'tog-diffonly' => 'Ne prikazuj sadržaj stranice ispod prikaza razlika',
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
@@ -1669,9 +1668,9 @@ Zapisnik brisanja i pomjeranja za ovu stranicu je dostupan ovdje na uvid:",
 Da bi ste vidjeli ili pretražili ranije postavljene datoteke, pogledajte [[Special:FileList|spisak postavljenih datoteka]], ponovna postavljanja su također zapisana u [[Special:Log/upload|zapisnik postavljanja]], a brisanja u [[Special:Log/delete|zapisnik brisanja]].
 
 Da bi ste prikazali datoteku na stranici, koristite link na jedan od slijedećih načina:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></tt>''' da upotrijebite potpunu veziju datoteke
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|thumb|lijevo|opis slike]]</nowiki></tt>''' da upotrijebite smanjeni prikaz širine 200 piksela unutar okvira, s lijevim poravnanjem i ''opisom slike''.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></tt>''' za direkno povezivanje datoteke bez njenog prikazivanja",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' da upotrijebite potpunu veziju datoteke
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|thumb|lijevo|opis slike]]</nowiki></code>''' da upotrijebite smanjeni prikaz širine 200 piksela unutar okvira, s lijevim poravnanjem i ''opisom slike''.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' za direkno povezivanje datoteke bez njenog prikazivanja",
 'upload-permitted' => 'Podržane vrste datoteka: $1.',
 'upload-preferred' => 'Preferirane vrste datoteka: $1.',
 'upload-prohibited' => 'Zabranjene vrste datoteka: $1.',
@@ -1716,21 +1715,21 @@ Ova datoteka je velika $2.',
 'largefileserver' => 'Ova datoteka je veća nego što server dopušta.',
 'emptyfile' => 'Datoteka koju ste poslali je prazna. Ovo je moguće zbog greške u imenu datoteke. Molimo Vas da provjerite da li stvarno želite da pošaljete ovu datoteku.',
 'windows-nonascii-filename' => 'Ova wiki ne podržava imena datoteka sa posebnim znacima.',
-'fileexists' => "Datoteka sa ovim imenom već postoji.
-Molimo Vas da provjerite '''<tt>[[:$1]]</tt>''' ako niste sigurni da li želite da je promjenite.
-[[$1|thumb]]",
-'filepageexists' => "Opis stranice za ovu datoteku je već napravljen ovdje '''<tt>[[:$1]]</tt>''', ali datoteka sa ovim nazivom trenutno ne postoji.
+'fileexists' => 'Datoteka sa ovim imenom već postoji.
+Molimo Vas da provjerite <strong>[[:$1]]</strong> ako niste sigurni da li želite da je promjenite.
+[[$1|thumb]]',
+'filepageexists' => 'Opis stranice za ovu datoteku je već napravljen ovdje <strong>[[:$1]]</strong>, ali datoteka sa ovim nazivom trenutno ne postoji.
 Sažetak koji ste naveli neće se pojaviti na stranici opisa.
 Da bi se Vaš opis ovdje našao, potrebno je da ga ručno uredite.
-[[$1|thumb]]",
-'fileexists-extension' => "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]
-* Naziv datoteke koja se postavlja: '''<tt>[[:$1]]</tt>'''
-* Naziv postojeće datoteke: '''<tt>[[:$2]]</tt>'''
-Molimo Vas da izaberete drugačiji naziv.",
-'fileexists-thumbnail-yes' => "Izgleda da je datoteka slika smanjene veličine ''(\"thumbnail\")''. [[\$1|thumb]]
-Molimo provjerite datoteku '''<tt>[[:\$1]]</tt>'''.
-Ako je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.",
-'file-thumbnail-no' => "Naziv datoteke počinje sa '''<tt>\$1</tt>'''.
+[[$1|thumb]]',
+'fileexists-extension' => 'Datoteka sa sličnim nazivom postoji: [[$2|thumb]]
+* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>
+* Naziv postojeće datoteke: <strong>[[:$2]]</strong>
+Molimo Vas da izaberete drugačiji naziv.',
+'fileexists-thumbnail-yes' => 'Izgleda da je datoteka slika smanjene veličine \'\'("thumbnail")\'\'. [[$1|thumb]]
+Molimo provjerite datoteku <strong>[[:$1]]</strong>.
+Ako je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.',
+'file-thumbnail-no' => "Naziv datoteke počinje sa <strong>\$1</strong>.
 Izgleda da se radi o smanjenoj slici ''(\"thumbnail\")''.
 Ako imate ovu sliku u punoj rezoluciji, postavite nju; ili promijenite naslov ove datoteke.",
 'fileexists-forbidden' => 'Datoteka sa ovim imenom već postoji i ne može biti prepisana.
@@ -1963,7 +1962,7 @@ Opis sa njene [$2 stranice opisa datoteke] je prikazan ispod.',
 # MIME search
 'mimesearch' => 'MIME pretraga',
 'mimesearch-summary' => 'Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.
-Ulazni podaci: vrstasadržaja/subvrsta, npr. <tt>image/jpeg</tt>.',
+Ulazni podaci: vrstasadržaja/subvrsta, npr. <code>image/jpeg</code>.',
 'mimetype' => 'MIME tip:',
 'download' => 'učitaj',
 
@@ -2158,7 +2157,7 @@ Vidi također [[Special:WantedCategories|zatražene kategorije]].',
 'linksearch-ok' => 'Traži',
 'linksearch-text' => 'Mogu se koristiti općeniti izrazi poput "*.wikipedia.org"
 Potrebna je najmanje osnovna domena, naprimjer "*.org."<br />
-Podržani protokoli: <tt>$1</tt> (ne dodavajte bilo koji od ovih u vašu pretragu).',
+Podržani protokoli: <code>$1</code> (ne dodavajte bilo koji od ovih u vašu pretragu).',
 'linksearch-line' => '$1 je povezan od $2',
 'linksearch-error' => 'Džokeri se mogu pojavljivati samo na početku naziva servera.',
 
@@ -3023,15 +3022,10 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 # Info page
 'pageinfo-title' => 'Informacije za "$1"',
 'pageinfo-header-edits' => 'Izmjene',
-'pageinfo-header-watchlist' => 'Praćeni članci',
-'pageinfo-header-views' => 'Pregledi',
-'pageinfo-subjectpage' => 'Stranica',
-'pageinfo-talkpage' => 'Stranica za razgovor',
+'pageinfo-views' => 'Broj pogleda',
 'pageinfo-watchers' => 'Broj onih koji pregledaju',
 'pageinfo-edits' => 'Broj izmjena',
 'pageinfo-authors' => 'Broj različitih autora',
-'pageinfo-views' => 'Broj pogleda',
-'pageinfo-viewsperedit' => 'Pogleda po izmjeni',
 
 # Skin names
 'skinname-standard' => 'Klasično',
@@ -3942,6 +3936,7 @@ Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan
 'api-error-file-too-large' => 'Datoteka koju ste poslali je bila prevelika.',
 'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
 'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'api-error-filetype-banned-type' => '$1 nije dopuštena vrsta datoteke. {{PLURAL:$3|Dopuštena vrsta datoteke je|Dopuštene vrste datoteka su}} $2.',
 'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
 'api-error-hookaborted' => 'Izmjena koji ste pokušali načiniti je obustavljena preko kuke proširenja.',
 'api-error-http' => 'Unutrašnja greška: ne može se spojiti na server.',
index ee2dbb1..97ed470 100644 (file)
@@ -8,12 +8,14 @@
  * @file
  *
  * @author Aleator
+ * @author Arnaugir
  * @author Avm99963
  * @author BroOk
  * @author Cedric31
  * @author Davidpar
  * @author El libre
  * @author Gemmaa
+ * @author Grondin
  * @author Iradigalesc
  * @author Jordi Roqué
  * @author Juanpabl
@@ -82,20 +84,20 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'numberofarticles'        => array( '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'NOMBRED\'EDICIONS', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'NOMDELAPLANA', 'PAGENAME' ),
-       'img_right'               => array( '1', 'dreta', 'right' ),
-       'img_left'                => array( '1', 'esquerra', 'left' ),
-       'img_border'              => array( '1', 'vora', 'border' ),
-       'img_link'                => array( '1', 'enllaç=$1', 'link=$1' ),
-       'displaytitle'            => array( '1', 'TÍTOL', 'DISPLAYTITLE' ),
-       'language'                => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'especial', 'special' ),
-       'defaultsort'             => array( '1', 'ORDENA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'pagesize'                => array( '1', 'MIDADELAPLANA', 'PAGESIZE' ),
+       'numberofarticles'          => array( '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'NOMBRED\'EDICIONS', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'NOMDELAPLANA', 'PAGENAME' ),
+       'img_right'                 => array( '1', 'dreta', 'right' ),
+       'img_left'                  => array( '1', 'esquerra', 'left' ),
+       'img_border'                => array( '1', 'vora', 'border' ),
+       'img_link'                  => array( '1', 'enllaç=$1', 'link=$1' ),
+       'displaytitle'              => array( '1', 'TÍTOL', 'DISPLAYTITLE' ),
+       'language'                  => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'especial', 'special' ),
+       'defaultsort'               => array( '1', 'ORDENA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'pagesize'                  => array( '1', 'MIDADELAPLANA', 'PAGESIZE' ),
 );
 
 $specialPageAliases = array(
@@ -199,7 +201,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Amaga edicions patrullades als canvis recents',
 'tog-newpageshidepatrolled' => 'Amaga pàgines patrullades de la llista de pàgines noves',
 'tog-extendwatchlist' => 'Desplega la llista de seguiment per a mostrar tots els canvis afectats, no només els més recents',
-'tog-usenewrc' => 'Usa la presentació millorada dels canvis recents (cal JavaScript)',
+'tog-usenewrc' => 'Utilitza una presentació millorada dels canvis recents (cal JavaScript)',
 'tog-numberheadings' => 'Enumera automàticament els encapçalaments',
 'tog-showtoolbar' => "Mostra la barra d'eines d'edició (cal JavaScript)",
 'tog-editondblclick' => 'Edita les pàgines amb un doble clic (cal JavaScript)',
@@ -207,8 +209,8 @@ $messages = array(
 'tog-editsectiononrightclick' => "Habilita l'edició per seccions en clicar amb el botó dret sobre els títols de les seccions (cal JavaScript)",
 'tog-showtoc' => 'Mostra la taula de continguts (per pàgines amb més de 3 seccions)',
 'tog-rememberpassword' => 'Recorda la sessió al navegador (per un màxim de {{PLURAL:$1|dia|dies}})',
-'tog-watchcreations' => 'Vigila les pàgines que he creat',
-'tog-watchdefault' => 'Afegeix les pàgines que edito a la meua llista de seguiment',
+'tog-watchcreations' => 'Afegeix les pàgines que vagi creant a la llista de seguiment',
+'tog-watchdefault' => 'Afegeix les pàgines que vagi creant a la llista de seguiment',
 'tog-watchmoves' => 'Afegeix les pàgines que reanomeni a la llista de seguiment',
 'tog-watchdeletion' => 'Afegeix les pàgines que elimini a la llista de seguiment',
 'tog-minordefault' => 'Marca totes les contribucions com a edicions menors per defecte',
@@ -233,7 +235,6 @@ $messages = array(
 'tog-watchlisthideliu' => "Amaga a la llista les edicions d'usuaris registrats",
 'tog-watchlisthideanons' => "Amaga a la llista les edicions d'usuaris anònims",
 'tog-watchlisthidepatrolled' => 'Amaga edicions patrullades de la llista de seguiment',
-'tog-nolangconversion' => 'Inhabilita la conversió de variants',
 'tog-ccmeonemails' => "Envia'm còpia dels missatges que enviï als altres usuaris",
 'tog-diffonly' => 'Amaga el contingut de la pàgina davall de la taula de diferències',
 'tog-showhiddencats' => 'Mostra les categories ocultes',
@@ -321,6 +322,7 @@ $messages = array(
 'index-category' => 'Pàgines indexades',
 'noindex-category' => 'Pàgines no indexades',
 'broken-file-category' => 'Pàgines amb enllaços a fitxer trencats',
+'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'about' => 'Quant a',
 'article' => 'Pàgina de contingut',
@@ -390,7 +392,7 @@ $messages = array(
 'unprotect' => 'Desprotecció',
 'unprotectthispage' => 'Desprotegeix aquesta pàgina',
 'newpage' => 'Pàgina nova',
-'talkpage' => 'Discussió de la pàgina',
+'talkpage' => 'Discussió',
 'talkpagelinktext' => 'Discussió',
 'specialpage' => 'Pàgina especial',
 'personaltools' => "Eines de l'usuari",
@@ -457,6 +459,10 @@ $1",
 'youhavenewmessages' => 'Tens $1 ($2).',
 'newmessageslink' => 'nous missatges',
 'newmessagesdifflink' => 'últims canvis',
+'youhavenewmessagesfromusers' => "Tens $1 {{PLURAL:$3|d'un altre usuari|de $3 usuaris}} ($2).",
+'youhavenewmessagesmanyusers' => 'Tens $1 de molts usuaris ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|un nou missatge|nous missatges}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|darrer canvi|darrers canvis}}',
 'youhavenewmessagesmulti' => 'Teniu nous missatges a $1',
 'editsection' => 'modifica',
 'editold' => 'modifica',
@@ -511,9 +517,9 @@ Vegeu la llista de pàgines especials a [[Special:SpecialPages]].',
 'dberrortext' => "S'ha produït un error de sintaxi en una consulta a la base de dades.
 Açò podria indicar un error en el programari.
 La darrera consulta que s'ha intentat fer ha estat:
-<blockquote><tt>$1</tt></blockquote>
-des de la funció «<tt>$2</tt>».
-L'error de retorn ha estat «<tt>$3: $4</tt>».",
+<blockquote><code>$1</code></blockquote>
+des de la funció «<code>$2</code>».
+L'error de retorn ha estat «<samp>$3: $4</samp>».",
 'dberrortextcl' => "S'ha produït un error de sintaxi en una consulta a la base de dades.
 La darrera consulta que s'ha intentat fer ha estat:
 <blockquote><tt>$1</tt></blockquote>
@@ -550,6 +556,8 @@ Aviseu-ho llavors a un [[Special:ListUsers/sysop|administrador]], deixant-li cla
 'cannotdelete' => "No s'ha pogut esborrar la pàgina o fitxer «$1».
 Potser ja ha estat esborrat per algú altre.",
 'cannotdelete-title' => 'No es pot suprimir la pàgina " $1 "',
+'delete-hook-aborted' => 'Un «hook» ha interromput la supressió.
+No ha donat cap explicació.',
 'badtitle' => 'El títol no és correcte',
 'badtitletext' => 'El títol de la pàgina que heu introduït no és correcte, és en blanc o conté un enllaç trencat amb un altre projecte. També podria contenir algun caràcter no acceptat als títols de pàgina.',
 'perfcached' => "Les dades següents es troben a la memòria cau i podrien no estar al dia. Hi ha un màxim {{PLURAL:$1|d'un resultat|de $1 resultats}} disponibles a la memòria cau.",
@@ -580,6 +588,8 @@ Els seus motius han estat: «''$2''».",
 L\'administrador que l\'ha bloquejat ha donat aquesta explicació: "$3".',
 'invalidtitle-knownnamespace' => "El títol amb l'espai de noms «$2» i text «$3» no és vàlid",
 'invalidtitle-unknownnamespace' => 'Títol no vàlid amb espai de noms desconegut de número «$1» i text «$2»',
+'exception-nologin' => 'No has iniciat sessió',
+'exception-nologin-text' => 'Aquesta pàgina o acció requereix que iniciïs sessió a aquest wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Mala configuració: antivirus desconegut: ''$1''",
@@ -601,6 +611,7 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 'remembermypassword' => 'Recorda la contrasenya entre sessions (per un màxim de $1 {{PLURAL:$1|dia|dies}})',
 'securelogin-stick-https' => "Roman connectat via HTTPS desprès d'autenticar-se",
 'yourdomainname' => 'El vostre domini',
+'password-change-forbidden' => 'No podeu canviar les contrasenyes en aquest wiki.',
 'externaldberror' => "Hi ha hagut una fallida en el servidor d'autenticació externa de la base de dades i no teniu permís per a actualitzar el vostre compte d'accès extern.",
 'login' => 'Inici de sessió',
 'nav-login-createaccount' => 'Inicia una sessió / crea un compte',
@@ -834,6 +845,10 @@ Podeu [[Special:Search/{{PAGENAME}}|cercar aquest títol]] en altres pàgines,
 o [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear-la ara]</span>.',
 'noarticletext-nopermission' => 'Actualment no hi ha text en aquesta pàgina.
 Podeu [[Special:Search/{{PAGENAME}}|cercar aquest títol]] en altres pàgines o bé <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar en els registres relacionats]</span>.',
+'missing-revision' => 'La revisió # $1  de la pàgina anomenada "{{PAGENAME}}" no existeix.
+
+Això és normalment provocat per després d\'un enllaç d\'història antiquat a una pàgina que s\'ha suprimit.
+Detalls es poden trobar en el [{{fullurl: {{# especial: registre}} / delete|page = {{FULLPAGENAMEE}}}} registre de supressió].',
 'userpage-userdoesnotexist' => "Atenció: El compte d'usuari «<nowiki>$1</nowiki>» no està registrat. En principi no hauríeu de crear ni editar aquesta pàgina.",
 'userpage-userdoesnotexist-view' => 'El compte d\'usuari "$1" no està registrat.',
 'blocked-notice-logextract' => "En aquests moments aquest compte d'usuari es troba blocat.
@@ -960,6 +975,7 @@ Se n'han omès els arguments.",
 'expansion-depth-exceeded-warning' => "La pàgina ha excedit la profunditat d'expansió",
 'parser-unstrip-loop-warning' => "S'ha detectat un bucle no desmuntable",
 'parser-unstrip-recursion-limit' => "S'ha excedit el límit ($1) de recursivitat no desmuntable",
+'converter-manual-rule-error' => 'Error detectat a la norma de conversió de llengua manual',
 
 # "Undo" feature
 'undo-success' => "Pot desfer-se la modificació. Si us plau, reviseu la comparació de sota per a assegurar-vos que és el que voleu fer; llavors deseu els canvis per a finalitzar la desfeta de l'edició.",
@@ -1146,6 +1162,10 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
 'editundo' => 'desfés',
 'diff-multi' => '({{PLURAL:$1|Hi ha una revisió intermèdia |Hi ha $1 revisions intermèdies}} sense mostrar fetes per {{PLURAL:$2|un usuari|$2 usuaris}})',
 'diff-multi-manyusers' => "({{PLURAL:$1|Hi ha una revisió intermèdia|Hi ha $1 revisions intermèdies}} sense mostrar fetes per més {{PLURAL:$2|d'un usuari|de $2 usuaris}})",
+'difference-missing-revision' => "{{PLURAL:$2|Una revisió|$2 revisions}} d'aquesta diferència ($1) no {{PLURAL:$2|s'ha|s'han}} trobat.
+
+Això passa generalment en seguir un enllaç obsolet de diferències a una pàgina que ha estat esborrada.
+Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
 
 # Search results
 'searchresults' => 'Resultats de la cerca',
@@ -1411,6 +1431,7 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'right-writeapi' => "Fer servir l'escriptura a l'API",
 'right-delete' => 'Esborrar pàgines',
 'right-bigdelete' => 'Esborrar pàgines amb historials grans',
+'right-deletelogentry' => "Suprimeix o desfés la supressió d'entrades de registre específiques",
 'right-deleterevision' => 'Esborrar i restaurar versions específiques de pàgines',
 'right-deletedhistory' => 'Veure els historials esborrats sense consultar-ne el text',
 'right-deletedtext' => 'Veure el text esborrat i els canvis entre revisions esborrades',
@@ -1556,9 +1577,9 @@ A continuació es mostren els registres de supressió i reanomenament d'aquesta
 Per a visualitzar o cercar fitxers que s'hagen carregat prèviament, aneu a la [[Special:FileList|llista de fitxers carregats]]. Les càrregues es registren en el [[Special:Log/upload|registre de càrregues]] i els fitxers esborrats en el [[Special:Log/delete|registre d'esborrats]].
 
 Per a incloure una imatge en una pàgina, feu un enllaç en una de les formes següents:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitxer.jpg]]</nowiki></tt>''' per a usar la versió completa del fitxer;
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitxer.png|200px|thumb|esquerra|text alternatiu]]</nowiki></tt>''' per una presentació de 200 píxels d'amplada en un requadre justificat a l'esquerra amb «text alternatiu» com a descripció;
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fitxer.ogg]]</nowiki></tt>''' per a enllaçar directament amb un fitxer de so.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitxer.jpg]]</nowiki></code>''' per a usar la versió completa del fitxer;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitxer.png|200px|thumb|esquerra|text alternatiu]]</nowiki></code>''' per una presentació de 200 píxels d'amplada en un requadre justificat a l'esquerra amb «text alternatiu» com a descripció;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fitxer.ogg]]</nowiki></code>''' per a enllaçar directament amb un fitxer de so.",
 'upload-permitted' => 'Tipus de fitxer permesos: $1.',
 'upload-preferred' => 'Tipus de fitxer preferits: $1.',
 'upload-prohibited' => 'Tipus de fitxer prohibits: $1.',
@@ -1602,18 +1623,18 @@ Vegeu la [[Special:NewFiles|galeria de nous fitxers]] per a una presentació mé
 Açò por ser degut a un mal caràcter en el nom del fitxer.
 Comproveu si realment voleu carregar aquest fitxer.',
 'windows-nonascii-filename' => 'Aquest wiki no permet noms de fitxer amb caràcters especials.',
-'fileexists' => "Ja hi existeix un fitxer amb aquest nom, si us plau, verifiqueu '''<tt>[[:$1]]</tt>''' si no esteu segurs de voler substituir-lo.
-[[$1|thumb]]",
-'filepageexists' => "La pàgina de descripció d'aquest fitxer ja ha estat creada ('''<tt>[[:$1]]</tt>'''), però de moment no hi ha cap fitxer amb aquest nom. La descripció que heu posat no apareixerà a la pàgina de descripció. Si voleu que hi aparegui haureu d'editar-la manualment.
+'fileexists' => 'Ja hi existeix un fitxer amb aquest nom, si us plau, verifiqueu <strong>[[:$1]]</strong> si no esteu segurs de voler substituir-lo.
+[[$1|thumb]]',
+'filepageexists' => "La pàgina de descripció d'aquest fitxer ja ha estat creada (<strong>[[:$1]]</strong>), però de moment no hi ha cap fitxer amb aquest nom. La descripció que heu posat no apareixerà a la pàgina de descripció. Si voleu que hi aparegui haureu d'editar-la manualment.
 [[$1|thumb]]",
-'fileexists-extension' => "Ja existeix un fitxer amb un nom semblant: [[$2|thumb]]
-* Nom del fitxer que es puja: '''<tt>[[:$1]]</tt>'''
-* Nom del fitxer existent: '''<tt>[[:$2]]</tt>'''
-Si us plau, trieu un nom diferent.",
-'fileexists-thumbnail-yes' => "Aquest fitxer sembla ser una imatge en mida reduïda (<em>miniatura</em>). [[$1|thumb]]
-Comproveu si us plau el fitxer '''<tt>[[:$1]]</tt>'''.
-Si el fitxer és la mateixa imatge a mida original, no cal carregar cap miniatura més.",
-'file-thumbnail-no' => "El nom del fitxer comença per '''<tt>$1</tt>'''.
+'fileexists-extension' => 'Ja existeix un fitxer amb un nom semblant: [[$2|thumb]]
+* Nom del fitxer que es puja: <strong>[[:$1]]</strong>
+* Nom del fitxer existent: <strong>[[:$2]]</strong>
+Si us plau, trieu un nom diferent.',
+'fileexists-thumbnail-yes' => 'Aquest fitxer sembla ser una imatge en mida reduïda (<em>miniatura</em>). [[$1|thumb]]
+Comproveu si us plau el fitxer <strong>[[:$1]]</strong>.
+Si el fitxer és la mateixa imatge a mida original, no cal carregar cap miniatura més.',
+'file-thumbnail-no' => "El nom del fitxer comença per <strong>$1</strong>.
 Sembla ser una imatge de mida reduïda ''(miniatura)''.
 Si teniu la imatge en resolució completa, pugeu-la, sinó mireu de canviar-li el nom, si us plau.",
 'fileexists-forbidden' => 'Ja hi existeix un fitxer amb aquest nom i no es pot sobreescriure.
@@ -1704,6 +1725,7 @@ $1',
 'lockmanager-fail-releaselock' => "No s'ha pogut alliberar el bloqueig de «$1».",
 'lockmanager-fail-db-bucket' => "No s'han pogut contactar un nombre suficient de bases de bloqueig en el cubell $1.",
 'lockmanager-fail-db-release' => "No s'han pogut alliberar els bloquejos a la base de dades $1.",
+'lockmanager-fail-svr-acquire' => "No s'han pogut aconseguir els bloquejos al servidor $1.",
 'lockmanager-fail-svr-release' => "No s'han pogut alliberar els bloquejos al servidor $1.",
 
 # ZipDirectoryReader
@@ -1852,7 +1874,7 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 
 # MIME search
 'mimesearch' => 'Cerca per MIME',
-'mimesearch-summary' => 'Aquesta pàgina habilita el filtratge de fitxers per llur tipus MIME. Contingut: contenttype/subtype, ex. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Aquesta pàgina habilita el filtratge de fitxers per llur tipus MIME. Contingut: contenttype/subtype, ex. <code>image/jpeg</code>.',
 'mimetype' => 'Tipus MIME:',
 'download' => 'baixada',
 
@@ -1898,9 +1920,9 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 
 'disambiguations' => 'Pàgines que enllacen a pàgines de desambiguació',
 'disambiguationspage' => 'Template:Desambiguació',
-'disambiguations-text' => "Les següents pàgines enllacen a una '''pàgina de desambiguació'''.
-Per això, caldria que enllacessin al tema apropiat.<br />
-Una pàgina es tracta com de desambiguació si utilitza una plantilla que està enllaçada a [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Les següents pàgines tenen algun enllaç a una '''pàgina de desambiguació'''.
+És possible que hagin d'enllaçar a una altra pàgina més apropiada.<br />
+Una pàgina es tracta com de desambiguació si utilitza una plantilla que està enllaçada a [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Redireccions dobles',
 'doubleredirectstext' => 'Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.
@@ -1972,7 +1994,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 'listusers-editsonly' => 'Mostra només usuaris amb edicions',
 'listusers-creationsort' => 'Ordena per data de creació',
 'usereditcount' => '$1 {{PLURAL:$1|modificació|modificacions}}',
-'usercreated' => '{{GENDER:$3|Creat}} en  $1  a les$2',
+'usercreated' => '{{GENDER:$3|Creat}}: $1 a les $2',
 'newpages' => 'Pàgines noves',
 'newpages-username' => "Nom d'usuari:",
 'ancientpages' => 'Pàgines més antigues',
@@ -2046,13 +2068,13 @@ Vegeu també [[Special:WantedCategories|les categories soŀlicitades]].",
 'sp-deletedcontributions-contribs' => 'contribucions',
 
 # Special:LinkSearch
-'linksearch' => "Recerca d'enllaços externs",
+'linksearch' => "Cerca d'enllaços externs",
 'linksearch-pat' => 'Patró de cerca:',
 'linksearch-ns' => 'Espai de noms:',
 'linksearch-ok' => 'Cerca',
 'linksearch-text' => 'Podeu fer servir caràcters comodí com "*.wikipedia.org".
 Necessita com a mínim un domini de primer nivell, per exemple "*.org".<br />
-Protocols admesos: <tt> $1 </tt> (no els afegiu en la vostra recerca).',
+Protocols admesos: <code> $1 </code> (no els afegiu en la vostra recerca).',
 'linksearch-line' => '$1 enllaçat a $2',
 'linksearch-error' => "Els caràcters comodí només poden aparèixer a l'inici de l'url.",
 
@@ -2244,6 +2266,8 @@ Vegeu $2 per a un registre dels esborrats més recents.',
 'rollback' => 'Reverteix edicions',
 'rollback_short' => 'Revoca',
 'rollbacklink' => 'Reverteix',
+'rollbacklinkcount' => 'reverteix $1 {{PLURAL:$1|edició|edicions}}',
+'rollbacklinkcount-morethan' => 'reverteix més de $1 {{PLURAL:$1|edició|edicions}}',
 'rollbackfailed' => "No s'ha pogut revocar",
 'cantrollback' => "No s'ha pogut revertir les edicions; el darrer coŀlaborador és l'únic autor de la pàgina.",
 'alreadyrolled' => "No es pot revertir la darrera modificació de [[:$1]]
@@ -2608,7 +2632,7 @@ Tingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una p
 
 Això significa que si reanomeneu per equivocació una pàgina amb el seu nom anterior no ho podreu fer, ja que no es pot sobreescriure una pàgina existent.
  
-'''Avís:''' Això pot ser un canvi dràstic i inesperat per una pàgina popular; si us plau, assegureu-vos que sabeu el que féu abans de continuar.",
+'''Avís:''' Això pot ser un canvi dràstic i inesperat per una pàgina popular; si us plau, assegureu-vos que sabeu el que feu abans de continuar.",
 'movepagetalktext' => "La pàgina de discussió associada, si existeix, serà traslladada automàticament '''tret dels següents casos''':
 * Ja hi existeix una pàgina de discussió no buida amb el nou nom, o si
 * la opció de davall es troba desactivada
@@ -2739,6 +2763,7 @@ Totes les accions d'importació interwiki es conserven al [[Special:Log/import|r
 'import-interwiki-templates' => 'Inclou totes les plantilles',
 'import-interwiki-submit' => 'Importa',
 'import-interwiki-namespace' => 'Espai de noms de destinació:',
+'import-interwiki-rootpage' => 'Pàgina arrel de destí (opcional):',
 'import-upload-filename' => 'Nom de fitxer:',
 'import-comment' => 'Comentari:',
 'importtext' => "Exporteu el fitxer des del wiki d'origen utilitzant l'[[Special:Export|eina d'exportació]].
@@ -2771,6 +2796,9 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
 'import-error-interwiki' => "No s'importa la pàgina «$1» perquè el seu nom està reservat a l'enllaçament extern (interwiki).",
 'import-error-special' => "No s'importa la pàgina «$1» perquè el seu nom pertany a l'espai de noms especial que no permet pàgines.",
 'import-error-invalid' => "No s'importa la pàgina «$1» perquè el seu nom no és vàlid.",
+'import-options-wrong' => '{{PLURAL:$2|Opció equivocada|Opcions equivocades}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'La pàgina arrel donada és un títol no vàlid.',
+'import-rootpage-nosubpage' => 'L\'espai de noms "$1" de la pàgina arrel no permet subpàgines.',
 
 # Import log
 'importlogpage' => "Registre d'importació",
@@ -2891,19 +2919,15 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'spambot_username' => 'Neteja de brossa del MediaWiki',
 'spam_reverting' => 'Es reverteix a la darrera versió que no conté enllaços a $1',
 'spam_blanking' => "Totes les revisions contenien enllaços $1, s'està deixant en blanc",
+'spam_deleting' => "S'estan suprimint totes les revisions que contenien enllaços a $1",
 
 # Info page
 'pageinfo-title' => 'Informació de «$1»',
 'pageinfo-header-edits' => 'Modificacions',
-'pageinfo-header-watchlist' => 'Llista de seguiment',
-'pageinfo-header-views' => 'Visites',
-'pageinfo-subjectpage' => 'Pàgina',
-'pageinfo-talkpage' => 'Pàgina de discussió',
+'pageinfo-views' => 'Número de visites',
 'pageinfo-watchers' => "Número d'usuaris que l'estan vigilant",
 'pageinfo-edits' => "Número d'edicions",
 'pageinfo-authors' => "Número d'autors diferents",
-'pageinfo-views' => 'Número de visites',
-'pageinfo-viewsperedit' => 'Visites per edició',
 
 # Skin names
 'skinname-standard' => 'Clàssic',
@@ -3630,7 +3654,7 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 * <span class="mw-specialpagecached">Pàgines especials en memòria cau (poden ser obsoletes).</span>',
 'specialpages-group-maintenance' => 'Informes de manteniment',
 'specialpages-group-other' => 'Altres pàgines especials',
-'specialpages-group-login' => 'Inici de sessió / Registre',
+'specialpages-group-login' => 'Iniciar sessió / Crear un compte',
 'specialpages-group-changes' => 'Canvis recents i registres',
 'specialpages-group-media' => 'Informes multimèdia i càrregues',
 'specialpages-group-users' => 'Usuaris i drets',
@@ -3764,9 +3788,12 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'api-error-empty-file' => 'El fitxer que heu tramès està buit.',
 'api-error-emptypage' => 'No es permet la creació de pàgines noves en blanc.',
 'api-error-fetchfileerror' => 'Error intern: quelcom no ha funcionat en accedir al fitxer.',
+'api-error-fileexists-forbidden' => "Ja existeix un fitxer amb el nom «$1» i no pot sobreescriure's.",
+'api-error-fileexists-shared-forbidden' => "Ja existeix un fitxer amb el nom «$1» al repositori de fitxers compartits i no pot sobreescriure's.",
 'api-error-file-too-large' => 'El fitxer que heu tramès és massa gran.',
 'api-error-filename-tooshort' => 'El nom del fitxer és massa curt.',
 'api-error-filetype-banned' => 'Aquest tipus de fitxer està prohibit.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|no és un tipus de fitxer permès|no són tipus de fitxer permesos}}. {{PLURAL:$3|El tipus de fitxer permès és|Els tipus de fitxer permesos són}} $2.',
 'api-error-filetype-missing' => 'El nom de fitxer no té extensió.',
 'api-error-hookaborted' => "La modificació que heu intentat fer ha estat canceŀlada per un mòdul d'extensió.",
 'api-error-http' => 'Error intern: no es pot connectar al servidor.',
index 2988190..4f15b3f 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Xqt
  */
 
 $datePreferences = array(
@@ -452,8 +453,8 @@ Siók-mìng: (dāng) = gâe̤ng dék sĭng bēng-buōng bī-piâng, (sèng) = g
 'uploadedfiles' => 'Siông-duòng ùng-giông',
 'ignorewarning' => 'Mò̤ sê̤ṳ gīng-gó̤ bō̤-còng ùng-giông.',
 'ignorewarnings' => 'Mò̤ sê̤ṳ gīng-gó̤',
-'fileexists' => "Ī-gĭng ô siŏh bĭk dè̤ng miàng ùng-giông, nṳ̄ nâ mâ̤ káuk-dêng nṳ̄ sê-ng-sê dŏng-cĭng páh-sáung gāi-biéng ĭ, chiāng giēng-chă '''<tt>[[:$1]]</tt>'''.
-[[$1|thumb]]",
+'fileexists' => 'Ī-gĭng ô siŏh bĭk dè̤ng miàng ùng-giông, nṳ̄ nâ mâ̤ káuk-dêng nṳ̄ sê-ng-sê dŏng-cĭng páh-sáung gāi-biéng ĭ, chiāng giēng-chă <strong>[[:$1]]</strong>.
+[[$1|thumb]]',
 'uploadwarning' => 'Siông-duòng gīng-gó̤',
 'savefile' => 'Bō̤-còng ùng-giông',
 'uploadedimage' => 'siông-duòng "[[$1]]"',
@@ -500,6 +501,8 @@ Siók-mìng: (dāng) = gâe̤ng dék sĭng bēng-buōng bī-piâng, (sèng) = g
 'statistics' => 'Só-gé̤ṳ',
 'statistics-header-users' => 'Ê̤ṳng-hô só-gé̤ṳ',
 
+'disambiguationspage' => 'Template:Gì-ngiê',
+
 'brokenredirects-edit' => 'gāi',
 'brokenredirects-delete' => 'chēng',
 
index cb6fdff..17545b0 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Chechen (Ð\9dохчийн)
+/** Chechen (нохчийн)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -62,150 +62,150 @@ $namespaceAliases = array(
 $namespaceGenderAliases = array();
 
 $magicWords = array(
-       'redirect'                => array( '0', '#дlасахьажайар\'', '\'#хьажайо\'', '\'#REDIRECT', '#перенаправление', '#перенапр', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__БАЦ_ЧУЛАЦАМ__', '__БАЦ_ЧУЛ__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__ЙАЦ_УЧЕ__', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ТlЕДУЬЛЛУ_ЧУЛАЦАМБАР__', '__ТlЕДУЬЛ_ЧУЛ__', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ЧУЛАЦАМ__', '__ЧУЛ__', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__ЦАМЕГ_РЕДАККХА_АГlОН__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__КОЬРТА_ЙОЦАШ__', '__БЕЗ_ЗАГОЛОВКА__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'КАРАРА_БУТТ', 'КАРАРА_БУТТ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'КАРАРА_БУТТ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'КАРАРАЧУ_БЕТТА_ЦlЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'КАРАРАЧУ_БЕТТА_ЦlЕ_МУХ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'КАРАРАЧУ_БЕТТА_ЦlЕ_АБР', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'КАРАРА_ДЕ', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'КАРАРА_ДЕ_2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'КАРАРАЧУ_ДЕ_ЦlЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'КАРАРА_ШО', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'КАРАРА_ХАН', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'КАРАРА_САХЬТ', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'МЕТТИГАН_БУТТ', 'МЕСТНЫЙ_МЕСЯЦ_2', 'МЕСТНЫЙ_МЕСЯЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'МЕТТИГАН_БУТТ_1', 'МЕСТНЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'МЕТТИГАН_БЕТТА_ЦlЕ', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'МЕТТИГАН_БЕТТА_ЦlЕ_МУХ', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_РОД', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'МЕТТИГАН_БЕТТА_ЦlЕ_АБР', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'МЕТТИГАН_ДЕ', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'МЕТТИГАН_ДЕ_2', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'МЕТТИГАН_ДЕ_ЦlЕ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'МЕТТИГАН_ШО', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'МЕТТИГАН_ХАН', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'МЕТТИГАН_САХЬТ', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'АГlОНИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ЯЗЗАМАШИ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ХlУМНИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ДЕКЪАШХОЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'ДУКХАЛЛА_ЖИГАРА_ДЕКЪАШХОЙ', 'КОЛИЧЕСТВО_АКТИВНЫХ_УЧАСТНИКОВ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'НИСДАРШИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'ХЬАЖАРИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'АГlОН_ЦlЕ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'АГlОН_ЦlЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ЦlЕРИ_АНА', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ЦlЕРИ_АНА_2', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ДИЙЦАРШИ_АНА', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ДИЙЦАРШИ_АНА_2', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ЯЗЗАМАШИ_АНА', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ЯЗЗАМАШИ_АНА_2', 'ПРОСТРАНСТВО_СТАТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'ЮЬЗЗИНА_АГlОН_ЦlЕ', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ЮЬЗЗИНА_АГlОН_ЦlЕ_2', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ_2', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'АГlОН_КlЕЛАРА_ЦlЕ', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'АГlОН_КlЕЛАРА_ЦlЕ_2', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ_2', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'АГlОН_ЦlЕРА_БУХ', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'АГlОН_ЦlЕРА_БУХ_2', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ_2', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ДИЙЦАРЕ_АГlОН_ЦlЕ', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'ДИЙЦАРЕ_АГlОН_ЦlЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ_2', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'АГlОН_ЯЗЗАМАН_ЦlЕ', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'АГlОН_ЯЗЗАМАН_ЦlЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'ХААМ:', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
-       'subst'                   => array( '0', 'ХlОТТОР:', 'ХlОТТ:', 'ПОДСТАНОВКА:', 'ПОДСТ:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'ВИКИ_ХААМ_БОЦАШ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'жима', 'жимо', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'жима=$1', 'жимо=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'бакъхьа', 'справа', 'right' ),
-       'img_left'                => array( '1', 'харцхьа', 'слева', 'left' ),
-       'img_none'                => array( '1', 'йоцуш', 'без', 'none' ),
-       'img_width'               => array( '1', '$1цинт', '$1пкс', '$1px' ),
-       'img_center'              => array( '1', 'юккъ', 'центр', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'гурабе', 'обрамить', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'гурабоцаш', 'безрамки', 'frameless' ),
-       'img_page'                => array( '1', 'агlо=$1', 'агlо_$1', 'page_$1', 'страница=$1', 'страница $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'бакъхьалакхо', 'бакъхьалакхо=$1', 'бакъхьалакхо_$1', 'upright_$1', 'сверхусправа', 'сверхусправа=$1', 'сверхусправа $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'доза', 'граница', 'border' ),
-       'img_baseline'            => array( '1', 'бух', 'основание', 'baseline' ),
-       'img_sub'                 => array( '1', 'буха', 'под', 'sub' ),
-       'img_super'               => array( '1', 'тlе', 'над', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'лакхахь', 'сверху', 'top' ),
-       'img_text_top'            => array( '1', 'лакххьара-йоза', 'текст-сверху', 'text-top' ),
-       'img_middle'              => array( '1', 'юккъе', 'посередине', 'middle' ),
-       'img_bottom'              => array( '1', 'бухар', 'снизу', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'бухара-йоза', 'текст-снизу', 'text-bottom' ),
-       'img_link'                => array( '1', 'хьажориг=$1', 'ссылка=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'альт=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'ЧУЬРА:', 'ВНУТР:', 'INT:' ),
-       'sitename'                => array( '1', 'МЕТТИГ_ЦlЕ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
-       'ns'                      => array( '0', 'БО:', 'ПИ:', 'NS:' ),
-       'nse'                     => array( '0', 'БОХЬ:', 'ПИК:', 'NSE:' ),
-       'localurl'                => array( '0', 'ХlОТТАЕЛЛА_МЕТТИГ:', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ХlОТТАЕЛЛА_МЕТТИГ_2:', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'ГlУЛКХДИРИГ', 'СЕРВЕР', 'SERVER' ),
-       'servername'              => array( '0', 'ГlУЛКХДЕЧУЬНА_ЦlЕ', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'НЕКЪ_ОЦ_МЕТТАКЕПА', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'ЙОМАНХАТl', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'ДОЖАР:', 'ПАДЕЖ:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ВУ_ЙУ:', 'GENDER', 'ПОЛ:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__ХИЙЦАР_ДОЦУШ_КОЬРТЕ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ЗАГОЛОВКА__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__ЙОЗА_ХИЙЦАР_ДОЦУШ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ТЕКСТА__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'КАРАРА_КlИР', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'КАРАРА_КlИРАН_ДЕ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'МЕТТИГЕРА_КlИРА', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'МЕТТИГАН_КlИРАН_ДЕ', 'МЕСТНЫЙ_ДЕНЬ_НЕДЕЛИ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'ЦУЬНА_БАШХО', 'ИД_ВЕРСИИ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ДЕ_БАШХО', 'ДЕНЬ_ВЕРСИИ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ДЕ_БАШХО_2', 'ДЕНЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'БЕТТА_БАШХО', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ШО_БАШХО', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'КЪАСТАМ_ХЕНА_БАШХО', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'ДЕКЪАШХОН_БАШХО', 'ВЕРСИЯ_УЧАСНИКА', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'ДУКХАЛЛИН_ТЕРАХЬ:', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'МАЙАРРА_МЕТТИГ:', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'МАЙАРРА_МЕТТИГ_2:', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'ХЬАЛХАР_ЭЛП_ЖИМА:', 'ПЕРВАЯ_БУКВА_МАЛЕНЬКАЯ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ХЬАЛХАР_ЭЛП_ДОККХА:', 'ПЕРВАЯ_БУКВА_БОЛЬШАЯ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'КЕГИЙЧУ_ЭЛПАШЦА:', 'МАЛЕНЬКИМИ_БУКВАМИ:', 'LC:' ),
-       'uc'                      => array( '0', 'ДАККХИЙЧУ_ЭЛПАШЦА:', 'БОЛЬШИМИ_БУКВАМИ:', 'UC:' ),
-       'raw'                     => array( '0', 'ТАЙАНЗА:', 'НЕОБРАБ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ГАЙТА_КОЬРТАМОГl', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'Т', 'Н', 'R' ),
-       'newsectionlink'          => array( '1', '__ХЬАЖОРИГ_ОЦ_КЕРЛАЧУ_ДЕКЪАН__', '__ССЫЛКА_НА_НОВЫЙ_РАЗДЕЛ__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__ЙОЦАШ_ХЬАЖОРИГ_ОЦ_КЕРЛАЧУ_ДЕКЪАН__', '__БЕЗ_ССЫЛКИ_НА_НОВЫЙ_РАЗДЕЛ__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'ЙОЛШЙОЛУ_БАШХО', 'ТЕКУЩАЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ИШАРЙИНА_МЕТТИГ:', 'ЗАКОДИРОВАННЫЙ_АДРЕС:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ИШАРЙАР_МЕТТИГАН', 'КОДИРОВАТЬ_МЕТКУ', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'КЪАСТАМ_ЙОЛУЧУ_ХАННА', 'ОТМЕТКА_ТЕКУЩЕГО_ВРЕМЕНИ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'КЪАСТАМ_МЕТТИГА_ХАННА', 'ОТМЕТКА_МЕСТНОГО_ВРЕМЕНИ', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'ХЬАЖОЧЕ_ХААМ', 'НАПРАВЛЕНИЕ_ПИСЬМА', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#МОТТ', '#ЯЗЫК:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'МОТТ_ЧУЛАЦАМ', 'ЯЗЫК_СОДЕРЖАНИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'АГlОНАШ_ОЦ_ЦlЕРАШКАХЬ:', 'СТРАНИЦ_В_ПРОСТРАНСТВЕ_ИМЁН:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'АДМАНКУЬГАЛХОЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_АДМИНИСТРАТОРОВ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ТЕРАХЬАН_БАРАМХlОТТОР', 'ФОРМАТИРОВАТЬ_ЧИСЛО', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ЙУЗА_ХАРЦЕ', 'ЗАПОЛНИТЬ_СЛЕВА', 'PADLEFT' ),
-       'padright'                => array( '0', 'ЙУЗА_БАКЪЕ', 'ЗАПОЛНИТЬ_СПРАВА', 'PADRIGHT' ),
-       'special'                 => array( '0', 'белхан', 'гlуллакхан', 'служебная', 'special' ),
-       'defaultsort'             => array( '1', 'ЛИСТАР_ЦАХЬЕХОР', 'ДОГlА_ЛИСТАРАН', 'СОРТИРОВКА_ПО_УМОЛЧАНИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ОЦ_ХlУМАНТlЕ_НЕКЪ:', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'къастам', 'къасто', 'къаст', 'метка', 'тег', 'тэг', 'tag' ),
-       'hiddencat'               => array( '1', '__КЪАЙЛАХЙОЛУ_КАДЕГАР__', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'АГlОНАШ_ОЦУ_КАДЕГАРШЧОХЬ', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'АГlОН_БАРАМ', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
-       'index'                   => array( '1', '__МЕТТИГТЕРАХЬ__', '__ИНДЕКС__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__МЕТТИГТЕРАХЬ_ЙОЦАШ__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'ТЕРАХЬ_ОЦ_ТОБАНЦА', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__БУХЕХЬДЕРГ_ДlАСХЬАЖАЙАР__', '__СТАТИЧЕСКОЕ_ПЕРЕНАПРАВЛЕНИЕ__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'ГlАРОЛЛИ_БАРАМ', 'УРОВЕНЬ_ЗАЩИТЫ', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'терахьибарам', 'форматдаты', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'ЙОМА', 'ПУТЬ', 'PATH' ),
-       'url_wiki'                => array( '0', 'ЧЕХКА', 'ВИКИ', 'WIKI' ),
+       'redirect'                  => array( '0', '#дlасахьажайар\'', '\'#хьажайо\'', '\'#REDIRECT', '#перенаправление', '#перенапр', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__БАЦ_ЧУЛАЦАМ__', '__БАЦ_ЧУЛ__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__ЙАЦ_УЧЕ__', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ТlЕДУЬЛЛУ_ЧУЛАЦАМБАР__', '__ТlЕДУЬЛ_ЧУЛ__', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ЧУЛАЦАМ__', '__ЧУЛ__', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__ЦАМЕГ_РЕДАККХА_АГlОН__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__КОЬРТА_ЙОЦАШ__', '__БЕЗ_ЗАГОЛОВКА__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'КАРАРА_БУТТ', 'КАРАРА_БУТТ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'КАРАРА_БУТТ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'КАРАРАЧУ_БЕТТА_ЦlЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'КАРАРАЧУ_БЕТТА_ЦlЕ_МУХ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'КАРАРАЧУ_БЕТТА_ЦlЕ_АБР', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'КАРАРА_ДЕ', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'КАРАРА_ДЕ_2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'КАРАРАЧУ_ДЕ_ЦlЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'КАРАРА_ШО', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'КАРАРА_ХАН', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'КАРАРА_САХЬТ', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'МЕТТИГАН_БУТТ', 'МЕСТНЫЙ_МЕСЯЦ_2', 'МЕСТНЫЙ_МЕСЯЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'МЕТТИГАН_БУТТ_1', 'МЕСТНЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'МЕТТИГАН_БЕТТА_ЦlЕ', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'МЕТТИГАН_БЕТТА_ЦlЕ_МУХ', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_РОД', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'МЕТТИГАН_БЕТТА_ЦlЕ_АБР', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'МЕТТИГАН_ДЕ', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'МЕТТИГАН_ДЕ_2', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'МЕТТИГАН_ДЕ_ЦlЕ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'МЕТТИГАН_ШО', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'МЕТТИГАН_ХАН', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'МЕТТИГАН_САХЬТ', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'АГlОНИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ЯЗЗАМАШИ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ХlУМНИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ДЕКЪАШХОЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'ДУКХАЛЛА_ЖИГАРА_ДЕКЪАШХОЙ', 'КОЛИЧЕСТВО_АКТИВНЫХ_УЧАСТНИКОВ', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'НИСДАРШИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'ХЬАЖАРИЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'АГlОН_ЦlЕ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'АГlОН_ЦlЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ЦlЕРИ_АНА', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ЦlЕРИ_АНА_2', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ДИЙЦАРШИ_АНА', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ДИЙЦАРШИ_АНА_2', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ЯЗЗАМАШИ_АНА', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ЯЗЗАМАШИ_АНА_2', 'ПРОСТРАНСТВО_СТАТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ЮЬЗЗИНА_АГlОН_ЦlЕ', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ЮЬЗЗИНА_АГlОН_ЦlЕ_2', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ_2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'АГlОН_КlЕЛАРА_ЦlЕ', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'АГlОН_КlЕЛАРА_ЦlЕ_2', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ_2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'АГlОН_ЦlЕРА_БУХ', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'АГlОН_ЦlЕРА_БУХ_2', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ_2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ДИЙЦАРЕ_АГlОН_ЦlЕ', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ДИЙЦАРЕ_АГlОН_ЦlЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ_2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'АГlОН_ЯЗЗАМАН_ЦlЕ', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'АГlОН_ЯЗЗАМАН_ЦlЕ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'ХААМ:', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
+       'subst'                     => array( '0', 'ХlОТТОР:', 'ХlОТТ:', 'ПОДСТАНОВКА:', 'ПОДСТ:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'ВИКИ_ХААМ_БОЦАШ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'жима', 'жимо', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'жима=$1', 'жимо=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'бакъхьа', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'харцхьа', 'слева', 'left' ),
+       'img_none'                  => array( '1', 'йоцуш', 'без', 'none' ),
+       'img_width'                 => array( '1', '$1цинт', '$1пкс', '$1px' ),
+       'img_center'                => array( '1', 'юккъ', 'центр', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'гурабе', 'обрамить', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'гурабоцаш', 'безрамки', 'frameless' ),
+       'img_page'                  => array( '1', 'агlо=$1', 'агlо_$1', 'page_$1', 'страница=$1', 'страница $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'бакъхьалакхо', 'бакъхьалакхо=$1', 'бакъхьалакхо_$1', 'upright_$1', 'сверхусправа', 'сверхусправа=$1', 'сверхусправа $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'доза', 'граница', 'border' ),
+       'img_baseline'              => array( '1', 'бух', 'основание', 'baseline' ),
+       'img_sub'                   => array( '1', 'буха', 'под', 'sub' ),
+       'img_super'                 => array( '1', 'тlе', 'над', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'лакхахь', 'сверху', 'top' ),
+       'img_text_top'              => array( '1', 'лакххьара-йоза', 'текст-сверху', 'text-top' ),
+       'img_middle'                => array( '1', 'юккъе', 'посередине', 'middle' ),
+       'img_bottom'                => array( '1', 'бухар', 'снизу', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'бухара-йоза', 'текст-снизу', 'text-bottom' ),
+       'img_link'                  => array( '1', 'хьажориг=$1', 'ссылка=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'альт=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'ЧУЬРА:', 'ВНУТР:', 'INT:' ),
+       'sitename'                  => array( '1', 'МЕТТИГ_ЦlЕ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
+       'ns'                        => array( '0', 'БО:', 'ПИ:', 'NS:' ),
+       'nse'                       => array( '0', 'БОХЬ:', 'ПИК:', 'NSE:' ),
+       'localurl'                  => array( '0', 'ХlОТТАЕЛЛА_МЕТТИГ:', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ХlОТТАЕЛЛА_МЕТТИГ_2:', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'ГlУЛКХДИРИГ', 'СЕРВЕР', 'SERVER' ),
+       'servername'                => array( '0', 'ГlУЛКХДЕЧУЬНА_ЦlЕ', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'НЕКЪ_ОЦ_МЕТТАКЕПА', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'ЙОМАНХАТl', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'ДОЖАР:', 'ПАДЕЖ:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ВУ_ЙУ:', 'GENDER', 'ПОЛ:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__ХИЙЦАР_ДОЦУШ_КОЬРТЕ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ЗАГОЛОВКА__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__ЙОЗА_ХИЙЦАР_ДОЦУШ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ТЕКСТА__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'КАРАРА_КlИР', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'КАРАРА_КlИРАН_ДЕ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'МЕТТИГЕРА_КlИРА', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'МЕТТИГАН_КlИРАН_ДЕ', 'МЕСТНЫЙ_ДЕНЬ_НЕДЕЛИ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'ЦУЬНА_БАШХО', 'ИД_ВЕРСИИ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ДЕ_БАШХО', 'ДЕНЬ_ВЕРСИИ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ДЕ_БАШХО_2', 'ДЕНЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'БЕТТА_БАШХО', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ШО_БАШХО', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'КЪАСТАМ_ХЕНА_БАШХО', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'ДЕКЪАШХОН_БАШХО', 'ВЕРСИЯ_УЧАСНИКА', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'ДУКХАЛЛИН_ТЕРАХЬ:', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'МАЙАРРА_МЕТТИГ:', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'МАЙАРРА_МЕТТИГ_2:', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'ХЬАЛХАР_ЭЛП_ЖИМА:', 'ПЕРВАЯ_БУКВА_МАЛЕНЬКАЯ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ХЬАЛХАР_ЭЛП_ДОККХА:', 'ПЕРВАЯ_БУКВА_БОЛЬШАЯ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'КЕГИЙЧУ_ЭЛПАШЦА:', 'МАЛЕНЬКИМИ_БУКВАМИ:', 'LC:' ),
+       'uc'                        => array( '0', 'ДАККХИЙЧУ_ЭЛПАШЦА:', 'БОЛЬШИМИ_БУКВАМИ:', 'UC:' ),
+       'raw'                       => array( '0', 'ТАЙАНЗА:', 'НЕОБРАБ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ГАЙТА_КОЬРТАМОГl', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'Т', 'Н', 'R' ),
+       'newsectionlink'            => array( '1', '__ХЬАЖОРИГ_ОЦ_КЕРЛАЧУ_ДЕКЪАН__', '__ССЫЛКА_НА_НОВЫЙ_РАЗДЕЛ__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__ЙОЦАШ_ХЬАЖОРИГ_ОЦ_КЕРЛАЧУ_ДЕКЪАН__', '__БЕЗ_ССЫЛКИ_НА_НОВЫЙ_РАЗДЕЛ__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'ЙОЛШЙОЛУ_БАШХО', 'ТЕКУЩАЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ИШАРЙИНА_МЕТТИГ:', 'ЗАКОДИРОВАННЫЙ_АДРЕС:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ИШАРЙАР_МЕТТИГАН', 'КОДИРОВАТЬ_МЕТКУ', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'КЪАСТАМ_ЙОЛУЧУ_ХАННА', 'ОТМЕТКА_ТЕКУЩЕГО_ВРЕМЕНИ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'КЪАСТАМ_МЕТТИГА_ХАННА', 'ОТМЕТКА_МЕСТНОГО_ВРЕМЕНИ', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'ХЬАЖОЧЕ_ХААМ', 'НАПРАВЛЕНИЕ_ПИСЬМА', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#МОТТ', '#ЯЗЫК:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'МОТТ_ЧУЛАЦАМ', 'ЯЗЫК_СОДЕРЖАНИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'АГlОНАШ_ОЦ_ЦlЕРАШКАХЬ:', 'СТРАНИЦ_В_ПРОСТРАНСТВЕ_ИМЁН:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'АДМАНКУЬГАЛХОЙ_ДУКХАЛЛА', 'КОЛИЧЕСТВО_АДМИНИСТРАТОРОВ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ТЕРАХЬАН_БАРАМХlОТТОР', 'ФОРМАТИРОВАТЬ_ЧИСЛО', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ЙУЗА_ХАРЦЕ', 'ЗАПОЛНИТЬ_СЛЕВА', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ЙУЗА_БАКЪЕ', 'ЗАПОЛНИТЬ_СПРАВА', 'PADRIGHT' ),
+       'special'                   => array( '0', 'белхан', 'гlуллакхан', 'служебная', 'special' ),
+       'defaultsort'               => array( '1', 'ЛИСТАР_ЦАХЬЕХОР', 'ДОГlА_ЛИСТАРАН', 'СОРТИРОВКА_ПО_УМОЛЧАНИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ОЦ_ХlУМАНТlЕ_НЕКЪ:', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'къастам', 'къасто', 'къаст', 'метка', 'тег', 'тэг', 'tag' ),
+       'hiddencat'                 => array( '1', '__КЪАЙЛАХЙОЛУ_КАДЕГАР__', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'АГlОНАШ_ОЦУ_КАДЕГАРШЧОХЬ', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'АГlОН_БАРАМ', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
+       'index'                     => array( '1', '__МЕТТИГТЕРАХЬ__', '__ИНДЕКС__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__МЕТТИГТЕРАХЬ_ЙОЦАШ__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'ТЕРАХЬ_ОЦ_ТОБАНЦА', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__БУХЕХЬДЕРГ_ДlАСХЬАЖАЙАР__', '__СТАТИЧЕСКОЕ_ПЕРЕНАПРАВЛЕНИЕ__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'ГlАРОЛЛИ_БАРАМ', 'УРОВЕНЬ_ЗАЩИТЫ', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'терахьибарам', 'форматдаты', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'ЙОМА', 'ПУТЬ', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ЧЕХКА', 'ВИКИ', 'WIKI' ),
 );
 
 $messages = array(
@@ -250,7 +250,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Къайладаха вовзийтина болу декъашхойн нисдарш оцу тергаме могlам чура',
 'tog-watchlisthideanons' => 'Къайладаха къайлаха болу декъашхойн нисдарш оцу тергаме могlам чура',
 'tog-watchlisthidepatrolled' => 'Къайладаха хьаьжина волу нисдарш оцу тергаме могlам чура',
-'tog-nolangconversion' => 'Хаамаш кхуллу гlирс дlабайа',
 'tog-ccmeonemails' => 'Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.',
 'tog-diffonly' => 'Ма гайта агlон чулацам шина башхонца цхьатерра йолуш',
 'tog-showhiddencats' => 'Гайта къайлаха йолу кадегарш',
index cf78ce7..263a0bb 100644 (file)
  * @author Aras Noori
  * @author Arastein
  * @author Asoxor
+ * @author Calak
  * @author Cyrus abdi
+ * @author Diyar se
  * @author Haval
  * @author Marmzok
+ * @author Muhammed taha
  * @author رزگار
  */
 
@@ -132,25 +135,25 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'img_thumbnail'           => array( '1', 'وێنۆک', 'thumbnail', 'thumb' ),
-       'img_right'               => array( '1', 'ڕاست', 'right' ),
-       'img_left'                => array( '1', 'چەپ', 'left' ),
-       'img_width'               => array( '1', '$1پیکسڵ', '$1px' ),
-       'img_center'              => array( '1', 'ناوەڕاست', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'چوارچێوە', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'بێچوارچێوە', 'frameless' ),
-       'img_border'              => array( '1', 'سنوور', 'border' ),
+       'img_thumbnail'             => array( '1', 'وێنۆک', 'thumbnail', 'thumb' ),
+       'img_right'                 => array( '1', 'ڕاست', 'right' ),
+       'img_left'                  => array( '1', 'چەپ', 'left' ),
+       'img_width'                 => array( '1', '$1پیکسڵ', '$1px' ),
+       'img_center'                => array( '1', 'ناوەڕاست', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'چوارچێوە', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'بێچوارچێوە', 'frameless' ),
+       'img_border'                => array( '1', 'سنوور', 'border' ),
 );
 
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ھێڵ ھێنان بەژێر بەستەرەکان:',
 'tog-justify' => 'پەرەگرافەکان پڕاوپر نیشان بدە',
-'tog-hideminor' => 'دەستکارییە بچوکەکان بشارەوە لە دوا گۆڕانکارییەکاندا',
+'tog-hideminor' => 'دەستکارییە بچووکەکان بشارەوە لە دوایین گۆڕانکارییەکاندا',
 'tog-hidepatrolled' => 'لە دوایین گۆڕانکاریەکان، دەستکاریە پارێزراوەکان داشارە',
 'tog-newpageshidepatrolled' => 'لە لیستی لاپەڕە نوێکان، لاپەڕە پارێزراوەکان داشارە',
 'tog-extendwatchlist' => 'لیستی چاودێری درێژبکەرەوە بۆ نیشان دانی ھەموو گۆڕانکارییەکان، نەک تەنھا دوایینەکان.',
-'tog-usenewrc' => 'دوا گۆڕانکارییە پەرە پێدراوەکان بەکار ببە (پێویستی بە جاڤاسکریپتە)',
+'tog-usenewrc' => 'گۆڕانکارییەکان لە دوایین گۆڕانکارییەکان و لیستی چاودێریدا بە پێی پەڕە پۆلێن بکە (پێویستی بە جاڤاسکریپتە)',
 'tog-numberheadings' => 'ژمارەکردنی خۆکاری سەردێڕەکان',
 'tog-showtoolbar' => 'شریتی ئامرازەکانی دەستکاری نیشان بدە (JavaScript پێویستە)',
 'tog-editondblclick' => 'دەستکاریی پەڕە بە دووکلیک لەسەر دەق (JavaScript پێویستە)',
@@ -158,21 +161,21 @@ $messages = array(
 'tog-editsectiononrightclick' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی کلیکی ڕاست کردن لەسەر سەردێڕی بەشەکان (JavaScript پێویستە)',
 'tog-showtoc' => 'پێرستی ناوەرۆک نیشان بدە (بۆ ئەو پەڕانە کە زیاتر لە ٣ سەردێڕیان تێدایە)',
 'tog-rememberpassword' => 'چوونە ژوورەوەم لەسەر ئەم وێبگەڕە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ە)',
-'tog-watchcreations' => 'ئەو پەڕانە کە من دروستم کردوون زیاد بکە بە لیستی چاودێڕییەکەم',
-'tog-watchdefault' => 'ئەو پەڕانە کە من دەستکاریم کردوون زیاد بکە بە لیستی چاودێڕییەکەم',
-'tog-watchmoves' => 'ئەو پەڕانە کە من گواستومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم',
-'tog-watchdeletion' => 'ئەو پەڕانە کە‌ من سڕیومنەتەوە زیاد بکە‌ بە لیستی چاودێڕییەکەم',
+'tog-watchcreations' => 'ئەو پەڕانەی من دروستم کردوون و ئەو پەڕگانە من بارم کردوون زیاد بکە بە لیستی چاودێڕییەکەم',
+'tog-watchdefault' => 'ئەو پەڕانە  و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم',
+'tog-watchmoves' => 'ئەو پەڕانە و ئەو پەڕگانە کە من گواستومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم',
+'tog-watchdeletion' => 'ئەو پەڕانە و ئەو پەڕگانە من سڕیومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم',
 'tog-minordefault' => 'ھەموو دەستکارییەکان بە ورد نیشان بکە لە حاڵەتی دیفاڵت',
 'tog-previewontop' => 'پێشبینین بەرلە چوارچێوەی دەستکاری نیشان بدە‌',
 'tog-previewonfirst' => 'لە یەکەم دەستکاری دا پێشبینین نیشان بدە',
 'tog-nocache' => 'کاشکردنی پەڕەکانی وێبگەڕەکە لەکاربخە',
-'tog-enotifwatchlistpages' => 'ئÛ\95Ú¯Û\95ر Ù¾Û\95Ú\95Û\95Û\8cÛ\95Ú©Û\8c Ù\84Û\95 Ù\84Û\8cستÛ\8c Ú\86اÙ\88دÛ\8eÚ\95Û\8cÛ\8cÛ\95کاÙ\86Ù\85 Ú¯Û\86Ú\95درا Ø¦Û\8cÙ\85Û\95Û\8cÙ\84Ù\85 Ø¨Û\86 Ø¨Ù\86Û\8eرÛ\95',
+'tog-enotifwatchlistpages' => 'ئÛ\8cÙ\85Û\95Û\8cÙ\84Ù\85 Ø¨Û\86 Ø¨Ù\86Û\8eرÛ\95 Ú©Ø§ØªÛ\8eÚ© Ù¾Û\95Ú\95Û\95Û\8cÛ\95Ú© Û\8cاÙ\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95Ú© Ù\84Û\95 Ù\84Û\8cستÛ\8c Ú\86اÙ\88دÛ\8eÚ\95Û\8cÛ\8cÛ\95کاÙ\86Ù\85دا Ú¯Û\86Ú\95درا',
 'tog-enotifusertalkpages' => 'ئەگەر پەڕەی وتووێژەکەم گۆڕدرا ئیمەیلم بۆ بنێرە',
-'tog-enotifminoredits' => 'بۆ گۆڕانکارییە بچووکەکانی پەڕەکانیش ئیمەیلم بۆ بنێرە',
+'tog-enotifminoredits' => 'بۆ گۆڕانکارییە بچووکەکانی پەڕەکان و پەڕگەکانیش ئیمەیلم بۆ بنێرە',
 'tog-enotifrevealaddr' => 'ئەدرەسی ئیمەیلەکەم لە ئیمەیلە ئاگاداریدەرەکان دا نیشان بدە',
 'tog-shownumberswatching' => 'ژمارەی بەکارھێنەرە چاودێڕەکان نیشان بدە',
-'tog-oldsig' => 'واژۆی ئێستا:',
-'tog-fancysig' => 'وەک ویکی‌دەق لەگەڵ واژۆ مامەڵەبکە (بێ بەستەرێکی خۆکار)',
+'tog-oldsig' => 'واژووی ئێستا:',
+'tog-fancysig' => 'وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)',
 'tog-externaleditor' => 'دەستکاریکەری دەرەکی بەکاربێنە لە حاڵەتی دیفاڵتدا (تەنھا بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە لە سەر کۆمپیوتەرەکەت [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
 'tog-externaldiff' => 'لە پرۆگرامێکی دەرەکی بۆ بینینی جیاوازیەکان کەڵک وەرگرە لە دیفاڵتدا (تەنها بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە لە سەر کۆمپیوتەرەکەت. [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
 'tog-showjumplinks' => 'ڕێگە بدە بۆ بەستەرەکانی «{{int:jumpto}}»',
@@ -184,7 +187,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'دەستکارییەکانی ئەو بەکارهێنەرانەی لە ژوورەوەن بشارەوە لە لیستی چاودێری',
 'tog-watchlisthideanons' => 'دەستکارییەکانی بەکارهێنەرانی نەناسراو بشارەوە لە لیستی چاودێری',
 'tog-watchlisthidepatrolled' => 'لە لیستی چاودێریەکان، دەستکاریە پارێزراوەکان داشارە',
-'tog-nolangconversion' => 'لەکارخستنی ئاڵوگۆڕەکانی شێوەزار',
 'tog-ccmeonemails' => 'کۆپییەکانی ئەو ئیمەیلانە کە بۆ بەکارھێنەرانی ترم ناردووە بۆ خۆشم بنێرە',
 'tog-diffonly' => 'ناوەڕۆکی پەڕە لەژێر جیاوازییەکان نیشان مەدە',
 'tog-showhiddencats' => 'ھاوپۆلە شاراوەکان نیشان بدە',
@@ -269,7 +271,10 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|ئەم هاوپۆلە تەنها ئەم پەڕگەی لەخۆ گرتووە.|ئەم‌ {{PLURAL:$1|پەڕگەیە}} کە بەشێکە لە هەموو $2پەڕگەی ئەم هاوپۆلە‌ دەیبینی.}}',
 'category-file-count-limited' => 'ئەم {{PLURAL:$1|پەڕگە|پەڕگانە}} لەم هاوپۆلەدایە.',
 'listingcontinuesabbrev' => '(درێژە)',
+'index-category' => 'پەڕە پێرستەکراوەکان',
 'noindex-category' => 'پەڕە پێرستنەکراوەکان',
+'broken-file-category' => 'ئەو پەڕانەی بەستەری پەڕگەکانیان شکاوە',
+'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'about' => 'سەبارەت',
 'article' => 'بابەت',
@@ -301,7 +306,7 @@ $messages = array(
 'vector-action-undelete' => 'سڕینەوە بگەڕێنەوە',
 'vector-action-unprotect' => 'پاراستنی بگۆڕە',
 'vector-simplesearch-preference' => 'ڕێگە بدە بە پێشنیارەکانی گەڕانی پێشکەوتوو (تەنیا بۆ پێستەی ڤێکتۆر)',
-'vector-view-create' => 'درووستکردن',
+'vector-view-create' => 'دروستکردن',
 'vector-view-edit' => 'دەستکاریی بکە',
 'vector-view-history' => 'مێژووەکەی ببینە',
 'vector-view-view' => 'بیخوێنەوە',
@@ -401,6 +406,8 @@ $1',
 تەماشای [[Special:Version|پەڕەی وەشان]] بکە.',
 
 'ok' => 'باشه‌',
+'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle-view-mainpage' => '{{SITENAME}}',
 'backlinksubtitle' => '→ $1',
 'retrievedfrom' => 'وەرگیراو لە «$1»',
 'youhavenewmessages' => '$1ت ھەیە ($2).',
@@ -428,6 +435,7 @@ $1',
 'site-atom-feed' => 'فیدی Atom بۆ $1',
 'page-rss-feed' => 'فیدی RSS بۆ «$1»',
 'page-atom-feed' => 'فیدی Atom بۆ «$1»',
+'feed-atom' => 'ئەتۆم',
 'red-link-title' => '$1 (پەڕە بوونی نییە)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
@@ -524,6 +532,7 @@ $2',
 'ns-specialprotected' => 'تۆ ناتوانی لاپەڕە تایبەتەکان دەستکاریی بکەی.',
 'titleprotected' => 'ئەم سەرناوە پارێزراوە لە دروستکران لە لایەن [[User:$1|$1]].
 ھۆکاری ئەمە بریتیە لە "\'\'$2\'\'".',
+'exception-nologin' => 'لەژوورەوە نیت',
 
 # Virus scanner
 'virus-badscanner' => "پێکەربەندیی نابەجێ: ڤایرس سکەنێری نەناسراو: ''$1''",
@@ -543,6 +552,7 @@ $2',
 'yourpasswordagain' => 'دیسان تێپەڕوشەکە بنووسەوە:',
 'remembermypassword' => 'چوونە ژوورەوەم لەسەر ئەم کۆمپیوتەرە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ە)',
 'yourdomainname' => 'ناوی دۆمه‌ینی خۆت',
+'password-change-forbidden' => 'ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.',
 'externaldberror' => 'یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.',
 'login' => 'بچۆ ژوورەوە',
 'nav-login-createaccount' => 'بچۆ ژوورەوە / ھەژمار دروست بکە',
@@ -564,10 +574,11 @@ $2',
 'userexists' => 'ئەو ناوەی تۆ داوتە پێشتر بەکارھێنراوە.
 ناوێکی دیکە ھەڵبژێرە.',
 'loginerror' => 'ھەڵەی چوونەژوورەوە',
-'nocookiesnew' => 'هەژماری بەکارهێنەر درووست‌کرا، بەڵام بە سەرکەوتوویی نەچوویتەوە ژوورەوە.
-{{SITENAME}} بۆ چوونەوە ژووری بەکارهێنەر لە شەکرۆکە کەڵک وەر دەگرێت.
-تۆ بەکار‌هێنانی شەکرۆکەت لەکارخستە.
-تکایە شەکرۆکە کارا بکە و بە ناو و وشەی تێپەڕبوونی بەکارهێنەر بچۆ ژوورەوە.',
+'createaccounterror' => 'ناتوانیت هەژماری بەکارهێنەر دروست بکەیت: $1',
+'nocookiesnew' => 'ھەژماری بەکارھێنەر دروست‌کرا، بەڵام بە سەرکەوتوویی نەچوویتەوە ژوورەوە.
+{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر لە شەکرۆکە کەڵک وەردەگرێت.
+تۆ شەکرۆکەکەت لەکارخستووە.
+تکایە شەکرۆکەکە کارا بکە و پاشان بە ناوی بەکارھێنەر و تێپەڕوشە بچۆ ژوورەوە.',
 'nocookieslogin' => '{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.
 ڕێگەت نەداوە بە کووکی‌یەکان.
 ڕێگەیان پێ بدەو و دیسان تێبکۆشە.',
@@ -674,6 +685,7 @@ $2
 # Special:ChangeEmail
 'changeemail' => 'ئەدرەسی ئیمەیڵ بگۆڕە',
 'changeemail-header' => 'ئەدرەسی ئیمەیلی ھەژمار بگۆڕە',
+'changeemail-no-info' => 'بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.',
 'changeemail-oldemail' => 'ئەدرەسی ئیمەیڵی ئێستا:',
 'changeemail-newemail' => 'ئەدرەسی ئیمەیڵی نوێ:',
 'changeemail-none' => '(ھیچ)',
@@ -710,8 +722,8 @@ $2
 'showpreview' => 'پێشبینین نیشانبدە',
 'showlivepreview' => 'پێشبینینی ڕاسته‌وخۆ',
 'showdiff' => 'گۆڕانکارییەکان نیشان بدە',
-'anoneditwarning' => "'''ھۆشیار بە:''' نەچوویتەتە ژوورەوە.
-ئەدرەسی IPی تۆ لە مێژووی دەستکارییەکانی ئەم پەڕەدا تۆماردەکرێت.",
+'anoneditwarning' => "'''ھۆشیار بە:''' نەچوویتە ژوورەوە.
+ناونیشانی IPی تۆ لە مێژووی دەستکارییەکانی ئەم پەڕەیەدا تۆماردەکرێت.",
 'anonpreviewwarning' => '«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»',
 'missingsummary' => "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.
 ئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
@@ -792,14 +804,15 @@ $2
 '''هێشتا پاشەکەوت نەبووه !'''",
 'sitecsspreview' => "'''له‌یادت بێ که‌ ئێسته‌ ته‌نها پێشبینینی ئەم CSS ده‌که‌ی.'''
 '''هێشتا پاشه‌که‌وت نه‌کراوە !'''",
-'sitejspreview' => "'''له‌یادت بێ که‌ ئێسته‌ ته‌نها پێشبینینی ئەم کۆدی جاڤاسکریپتە ده‌که‌ی.'''
-'''هێشتا پاشه‌که‌وت نه‌کراوە !'''",
+'sitejspreview' => "'''لە بیرت نەچێت ئەمە تەنیا پێشبینینی ئەم کۆدەی جاڤاسکریپتە.'''
+'''گۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!'''",
 'userinvalidcssjstitle' => "'''ئاگادارکردنەوە:''' پێست نیە بۆ \"\$1\".
 لەیادت بێ کە لاپەڕەکانی‌ .css و .js لە بابەت بە پیتی بچووک کەڵک وەر ئەگرن. وەک {{ns:user}}:Foo/vector.css نە وەک {{ns:user}}:Foo/Vector.css .",
 'updated' => '(نوێ‌کراوە)',
 'note' => "'''تێبینی:'''",
-'previewnote' => "'''لە بیرت بێت کە ئەمە تەنھا پێشبینینە.'''
+'previewnote' => "'''لە بیرت نەچێت ئەمە تەنیا پێشبینینە.'''
 گۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!",
+'continue-editing' => 'بەردەوام بە لەدەستکاریکردن',
 'previewconflict' => 'ئەم پێشبینینە بە تۆ نیشان ئەدات ئەو دەقەی لە شوێنی دەستکاری سەرەوە داتناوە چۆن بەرچاو ئەکەوێت ئەگەر پاشەکەوتی بکەیت.',
 'session_fail_preview' => "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''
 تکایە دیسان ھەوڵبدەوە.
@@ -881,6 +894,7 @@ $2
 'edit-no-change' => 'دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.',
 'edit-already-exists' => 'توانای درووست‌کردنی لاپەڕەی نوێ نیە.<br />
 ئەوە لەپێش‌دا هەبوو.',
+'defaultmessagetext' => 'دەقی پەیامی هەمیشەیی',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ئاگاداری:''' ئەم لاپەڕە ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەی لەخۆ گرتوو.<br /><br />
@@ -900,7 +914,7 @@ $2
 تکایە چاو لەو هەڵسەنگاندنەی خوارەوە بکە تا دڵنیا بیت ئەمە ئەوەیە کە‌ دەتویست بیکەی و دواتر گۆڕانکارییەکانی خوارەوە پاشەکەوت بکە بۆ تەواوکردنی پووچەڵکردنەوەکە.',
 'undo-failure' => 'لەبەر کێشەی دەست‌تێ‌وەردان، ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەیت.',
 'undo-norev' => 'ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەی لەبەر ئەوەی بوونی نیە یا سڕدراوەتەوە.',
-'undo-summary' => 'پووچەڵکرنەوەی پیاچوونەوەی $1 بەدەستی [[Special:Contributions/$2|$2]] ([[User talk:$2|وتووێژ]])',
+'undo-summary' => 'گەڕاندنەوەی پێداچوونەوەی $1 لە لایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|وتووێژ]])',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'ناتوانرێت هەژمار دروست بکرێت',
@@ -962,7 +976,7 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 ھێشتا دەتوانیت [$1 ئەم جیاوازییە ببینیت] ئەگەر بتەوێ.",
 'rev-delundel' => 'نیشانبدە/بشارەوە',
 'rev-showdeleted' => 'نیشان بدە',
-'revisiondelete' => 'سڕینەوە\\هاوردنەوەی پێداچوونەوەکان',
+'revisiondelete' => 'سڕینەوە/ھێنانەوەی پێداچوونەوەکان',
 'revdelete-nooldid-title' => 'مەبەستی پێداچوونەوەی نادیار',
 'revdelete-nooldid-text' => 'پێداچوەنەوەی مەبەستت ڕاچاو نەکردە بۆ ئەنجامی ئەم فەنکشێنە یان ئەو پێداچوونەوەی ڕاچاوت کردە بوونی نیە، یا خەریکی هەوڵی داشاردنی پێداچوونەوهی ئێستا‌ ئەدەی.',
 'revdelete-nologtype-title' => 'جۆری لۆگ ڕاچاو نەکراوە',
@@ -981,12 +995,12 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 * سووکایەتیکردن بە کەسایەتییەک<br />
 * بڵاوکردنەوەی زانیاریی تاکەکەسی نەگونجاو<br />
 *: '' ناونیشانی ماڵ یا ژمارە تەلەفۆن و وەک ئەمانە.''<br />",
-'revdelete-legend' => 'داÙ\86اÙ\86Û\8c Ø¨Û\95ربÛ\95ستÛ\95کاÙ\86Û\8c Ø¨Û\95رÚ\86اÙ\88کەوتن',
-'revdelete-hide-text' => 'داشاردÙ\86ی دەقی پێداچوونەوە',
+'revdelete-legend' => 'سÙ\86Ù\88Ù\88ردارکردÙ\86Û\8c Ø¯Û\95رکەوتن',
+'revdelete-hide-text' => 'شاردÙ\86Û\95Ù\88Û\95ی دەقی پێداچوونەوە',
 'revdelete-hide-image' => 'ناوەڕۆکی پەڕگە بشارەوە',
 'revdelete-hide-name' => 'داشاردنی مەبەست و کردەوە',
-'revdelete-hide-comment' => 'داشاردÙ\86Û\8c Ù¾Ù\88Ø®تەی دەستکاری',
-'revdelete-hide-user' => 'شاردنەوەی ناوی بەکارهێنەری\\ئای-‌پی دەستکاریکەر',
+'revdelete-hide-comment' => 'شاردÙ\86Û\95Ù\88Û\95Û\8c Ú©Ù\88رتەی دەستکاری',
+'revdelete-hide-user' => 'شاردنەوەی ناوی بەکارھێنەری/ئای-‌پی دەستکاریکەر',
 'revdelete-hide-restricted' => 'بەرگری دراوە لە بەڕێوبەران هەر وەک ئەوانی دیکە',
 'revdelete-radio-same' => '(مەیگۆڕە)',
 'revdelete-radio-set' => 'بەڵێ',
@@ -1021,9 +1035,9 @@ $1",
 ** لادان لە مافی لەبەرگرتنەوە
 ** زانیارە تاکەکەسییە نابەجێیەکان
 ** Potentially libelous information',
-'revdelete-otherreason' => 'هۆکاری دیکە/زیادی:',
+'revdelete-otherreason' => 'ھۆکاری تر/زیاتر:',
 'revdelete-reasonotherlist' => 'هۆکاری دیکە',
-'revdelete-edit-reasonlist' => 'دەستکاری هۆکارەکانی سڕینەوە',
+'revdelete-edit-reasonlist' => 'دەستکاریی ھۆکارەکانی سڕینەوە',
 'revdelete-offender' => 'نووسەری پیاچوونەوە:',
 
 # Suppression log
@@ -1064,13 +1078,13 @@ $1",
 
 # Diffs
 'history-title' => 'مێژووی پیاچوونەوەکانی «$1»',
-'difference-title' => 'جیاوازی نێوان پیاچوونەوەکانی «$1»',
+'difference-title' => 'جیاوازیی نێوان پێداچوونەوەکانی «$1»',
 'difference-title-multipage' => 'جیاوازیی نێوان پەڕەی «$1» و «$2»',
 'difference-multipage' => '(جیاوازی نێوان پەڕەکان)',
 'lineno' => 'ھێڵی  $1:',
 'compareselectedversions' => 'پیاچوونەوە ھەڵبژێردراوەکان ھەڵسەنگێنە',
 'showhideselectedversions' => 'پیاچوونەوە ھەڵبژێردراوەکان نیشانبدە/بشارەوە',
-'editundo' => 'پووچەڵ‌کردنەوە',
+'editundo' => 'گەڕاندنەوە',
 'diff-multi' => '({{PLURAL:$1|پیاچوونەوەیەکی نێوانی|$1 پیاچوونەوەی نێوانی}}ی {{PLURAL:$2|بەکارھێنەرێک|$2 بەکارھێنەر}} نیشان نەدراوە)',
 
 # Search results
@@ -1173,7 +1187,7 @@ $1",
 'prefs-misc' => 'جۆراوجۆر',
 'prefs-resetpass' => 'تێپەڕوشە بگۆڕە',
 'prefs-changeemail' => 'ئەدرەسی ئیمەیل بگۆڕە',
-'prefs-setemail' => 'ئەدرەسێکی ئیمەیل رێکبخە',
+'prefs-setemail' => 'ناونیشانێکی ئیمەیل دیاری بکە',
 'prefs-email' => 'ھەڵبژاردەکانی ئیمەیل',
 'prefs-rendering' => 'ڕواڵەت',
 'saveprefs' => 'پاشەکەوت',
@@ -1233,12 +1247,12 @@ $1",
 'yourrealname' => 'ناوی ڕاستی:',
 'yourlanguage' => 'زمان',
 'yourvariant' => 'شێوەزاری زمانی ناوەرۆک:',
-'yournick' => 'Ù\86ازÙ\86اÙ\88',
+'yournick' => 'Ù\88اÚ\98Ù\88Ù\88Û\8c Ù\86Ù\88Û\8e:',
 'prefs-help-signature' => 'بۆچوونەکان لە لاپەڕەکانی وتووێژدا دەبێ بە "<nowiki>~~~~</nowiki>" دیاری بکرێن، کە دواتر خۆکار دەگۆڕێ بە واژۆکەت و مۆری کاتی.',
 'badsig' => 'ئیمزاكه‌ هه‌ڵه‌یه‌، ته‌ماشای كۆدی HTML بكه‌‌',
 'badsiglength' => 'واژۆکەت زۆر درێژە.
 واژۆ نابێ لە $1 {{PLURAL:$1|نووسە|نووسە}} درێژتر بێت.',
-'yourgender' => 'ڕەگەز:',
+'yourgender' => 'زایەند:',
 'gender-unknown' => 'ئاشکرا نەکراو',
 'gender-male' => 'پیاو',
 'gender-female' => 'ژن',
@@ -1266,7 +1280,7 @@ $1",
 'prefs-diffs' => 'جیاوازییەکان',
 
 # User rights
-'userrights' => 'بەڕێوەبردنی مافەکانی بەکارهێنەران',
+'userrights' => 'بەڕێوەبردنی مافەکانی بەکارھێنەر',
 'userrights-lookup-user' => 'بەڕێوەبردنی گرووپەکانی بەکارهێنەران',
 'userrights-user-editname' => 'ناوی بەکارهێنەرێک بنووسە:',
 'editusergroup' => 'گرووپەکانی بەکارهێنەر بگۆڕە',
@@ -1376,7 +1390,7 @@ $1",
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'خوێندنەوەی ئەم پەڕە',
-'action-edit' => 'دەستکاریی ئەم پەڕە',
+'action-edit' => 'دەستکاریی ئەم پەڕەیە',
 'action-createpage' => 'درووست‌کردنی لاپەڕە',
 'action-createtalk' => 'درووست‌کردنی لەپەڕەکانی وتووێژ',
 'action-createaccount' => 'درووست‌کردنی هەژمارەی ئەم بەکارهێنەرە',
@@ -1416,7 +1430,7 @@ $1",
 'recentchanges-legend' => 'ھەڵبژاردەکانی دوایین گۆڕانکارییەکان',
 'recentchanges-summary' => 'لەم پەڕەدا بە دوای دوایین گۆڕانکارییەکان لەم ویکیەدا بکەوە.',
 'recentchanges-feed-description' => 'دوای دوایین گۆڕانکارییەکانی ئەم ویکیە بکەوە لەم «فید»ەوە.',
-'recentchanges-label-newpage' => 'ئÛ\95Ù\85 Ø¯Û\95ستکارÛ\8cÛ\95 Ù\84اپÛ\95Ú\95Û\95Û\8cÛ\95Ú©Û\8c Ù\86Ù\88Û\8eÛ\8c Ø¯Ø±Ù\88Ù\88ستâ\80\8cکرد',
+'recentchanges-label-newpage' => 'ئÛ\95Ù\85 Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95 Ù\84اپÛ\95Ú\95Û\95Û\8cÛ\95Ú©Û\8c Ù\86Ù\88Û\8eÛ\8c Ø¯Ø±Ù\88ستکرد',
 'recentchanges-label-minor' => 'ئەمە دەستکاریەکی بچووکە',
 'recentchanges-label-bot' => 'ئەم دەستکاریە لە لایەن بۆتەوە پێک هاتووە',
 'recentchanges-label-unpatrolled' => 'ئەم دەستکاریە هێشتا نەڕۆشتەتە ژێر چاودێری',
@@ -1429,7 +1443,7 @@ $1",
 'rcshowhideanons' => 'بەکارھێنەرە نەناسراوەکان $1',
 'rcshowhidepatr' => 'گۆرانکارییە کۆنترۆڵکراوەکان $1',
 'rcshowhidemine' => 'دەستکارییەکانی من $1',
-'rclinks' => 'دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشانبدە<br />$3',
+'rclinks' => 'دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە<br />$3',
 'diff' => 'جیاوازی',
 'hist' => 'مێژوو',
 'hide' => 'بشارەوە',
@@ -1472,9 +1486,9 @@ $1",
 بۆ بینینی و گەڕان لەو پەڕگانەی پێشتر بار کراون، بڕۆ بۆ [[Special:FileList|لیستی پەڕگە بارکراوەکان]]، ھەروەھا [[Special:Log/upload|ڕەشنووسی بارکردنەکان]] و [[Special:Log/delete|ڕەشنووسی سڕینەوەکان]].
 
 بۆ بەکارھێنانی پەڕگەیەک لە پەڕەیەکدا، بەستەرێک بە یەکێک لەم شێوازانەی خوارەوە بە کار بێنە:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' بۆ بەکارهێنانی وەشانی تەواوی پەڕگە
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|دەقی جێگر]]</nowiki></tt>''' بۆ بەکارهێنانی نمایشێکی بە پانتایی ٢٠٠ پیکسەڵ لە چوارچێوەیەک لە لای چەپەوە بە «دەقی جێگر» وەک شرۆڤە
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' بۆ بەستەرپێدان بە پەڕگەکە بێ نیشاندانی خودی پەڕگەکە",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' بۆ بەکارهێنانی وەشانی تەواوی پەڕگە
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|دەقی جێگر]]</nowiki></code>''' بۆ بەکارهێنانی نمایشێکی بە پانتایی ٢٠٠ پیکسەڵ لە چوارچێوەیەک لە لای چەپەوە بە «دەقی جێگر» وەک شرۆڤە
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' بۆ بەستەرپێدان بە پەڕگەکە بێ نیشاندانی خودی پەڕگەکە",
 'upload-permitted' => 'جۆرە پەڕگە ڕێگەپێدراوەکان: $1.',
 'upload-preferred' => 'جۆرە پەڕگانەی بە باشتر دەزانرێن: $1.',
 'upload-prohibited' => 'جۆرە پەڕگانەی قەدەغە کراون: $1.',
@@ -1506,26 +1520,27 @@ $2، ئەو جۆرە {{PLURAL:$3|پەڕگەیە کە ڕێگەی|پەڕگانەی
 'file-too-large' => 'ئەو پەڕگەیە ناردووتە زۆر گەورەیە.',
 'filename-tooshort' => 'ناوی پەڕگە زۆر کورتە.',
 'filetype-banned' => 'ئەم جۆرە پەڕگەیە قەدەغەیە.',
+'unknown-error' => 'ھەڵەیەکی نەزانراو ڕوویداوە.',
 'large-file' => 'پێشنیار دەکرێت قەبارەی پەڕگەکان زیاتر لە $1 نەبێت؛
 قەبارەی ئەم پەڕگە $2.',
 'largefileserver' => 'ئەم پەڕگە گەورەتر لەوەیە کە ڕاژەکار ڕێگەدەدات.',
 'emptyfile' => 'ئەو پەڕگەی بارت‌کرد لەوەدەچێ بەتاڵ و خاڵی بێت.
 شایەد ئەوە جۆرە هەڵەیەک لە ناوی لاپەڕەکە بێت.
 گەر بە ڕاستی دەتەوێ ئەو پەڕگە باربکەی جارێکی‌کە چاوی لێ‌بکەوە.',
-'fileexists' => "پەڕگەیەک هەر بەو ناوە‌ لە پێش‌دا هەیە، تکایە گەر ئەرخەیان نیت بۆ گۆڕینی، چاوێک لە '''<tt>[[:$1]]</tt>''' بکە.
-[[$1|thumb]]",
-'filepageexists' => "پەڕەی ناساندن بۆ ئەم پەڕگە پێشتر لە '''<tt>[[:$1]]</tt>''' درووستکراوە، بەڵام پەڕگەیەک بەو ناوەوە ئێستا نادۆزرێتەوە.
+'fileexists' => 'پەڕگەیەک هەر بەو ناوە‌ لە پێش‌دا هەیە، تکایە گەر ئەرخەیان نیت بۆ گۆڕینی، چاوێک لە <strong>[[:$1]]</strong> بکە.
+[[$1|thumb]]',
+'filepageexists' => 'پەڕەی ناساندن بۆ ئەم پەڕگە پێشتر لە <strong>[[:$1]]</strong> درووستکراوە، بەڵام پەڕگەیەک بەو ناوەوە ئێستا نادۆزرێتەوە.
 ئەو پوختەی کە نووسیوتە لە پەڕەی ناساندن بەرچاو ناکەوێت.
 گەر دەتەوێ پوختەکەت بەرچاو کەوێت دەبێ خۆت دەستی دەستکاری بکەی.
-[[$1|thumb]]",
-'fileexists-extension' => "پەڕگەیەک هەر بەو ناوە هەیە: [[$2|thumb]]
-* ناوی ئەو پەڕگەی باری ئەکەی:'''<tt>[[:$1]]</tt>'''
-* ناوی ئەو پەڕگەی ئێستا هەیە:'''<tt>[[:$2]]</tt>'''
-تکایە ناوێکی دیکە هەڵبژێرە.",
+[[$1|thumb]]',
+'fileexists-extension' => 'پەڕگەیەک هەر بەو ناوە هەیە: [[$2|thumb]]
+* ناوی ئەو پەڕگەی باری ئەکەی:<strong>[[:$1]]</strong>
+* ناوی ئەو پەڕگەی ئێستا هەیە:<strong>[[:$2]]</strong>
+تکایە ناوێکی دیکە هەڵبژێرە.',
 'fileexists-thumbnail-yes' => "لەوە دەچێ ئەم پەڕگە وێنەیەکی بچووک‌کراوە بێت ''(هێما)''. [[$1|thumb]]
-تکایە چاو لە پەڕگەی '''<tt>[[:$1]]</tt>''' بکه.‌
+تکایە چاو لە پەڕگەی <strong>[[:$1]]</strong> بکه.‌
 گەر ئەوەی چاوت لێ‌کرد قەبارەی ڕەسەنی هەر ئەو وێنەیە، پێویست ناکات دیسان هێماکەی باربکەی.",
-'file-thumbnail-no' => "دەستپێکی ناوی ئەم پەڕگە ئەوەیە: '''<tt>$1</tt>'''
+'file-thumbnail-no' => "دەستپێکی ناوی ئەم پەڕگە ئەوەیە: <strong>$1</strong>
 لەوە دەچێ ئەم پەڕگە وێنەیەکی بچووک‌کراوە بێت ''(هێما)''.
 گەر ئەو وێنەت لە قەبارەی ڕەسەنی‌ خۆی‌دا هەیه،‌ تکایە ئەوە بار بکه،‌ دەنا ناوی پەڕگەکە بگۆڕە.",
 'fileexists-forbidden' => 'پەڕگەیەک بەو ناوە لە پێش‌دا هەیە و سەرنووسین ناکرێت.
@@ -1551,10 +1566,10 @@ $2، ئەو جۆرە {{PLURAL:$3|پەڕگەیە کە ڕێگەی|پەڕگانەی
 'sourcefilename' => 'ناوی پەڕگەی سەرچاوە:',
 'sourceurl' => 'URLی سەرچاوە:',
 'destfilename' => 'ناوی مەبەست:',
-'upload-maxfilesize' => 'ئەو پەری قەبارەی فایل: $1',
+'upload-maxfilesize' => 'ئەوپەڕی قەبارەی پەڕگە: $1',
 'upload-description' => 'پێناسەی پەڕگە',
 'upload-options' => 'ھەڵبژاردەکانی  بارکردن',
-'watchthisupload' => 'چاودێریی ئەم پەڕگە بکە',
+'watchthisupload' => 'چاودێریی ئەم پەڕگەیە بکە',
 'filewasdeleted' => 'پەڕگەیەک بەم ناوە لەم دواییانەدا بارکرا و بە خێرایی سڕایەوە.
 باشتر وایە پێش هەوڵی دووبارە بۆ بارکردن سەرنجی $1 بدەی.',
 'filename-bad-prefix' => "دەستپێکی ناوی ئەو پەڕگەی باری دەکەی '''\"\$1\"'''، کە ناوێکی ناسێنەر نیە؛ ئەو جۆرە ناوە زۆربەی کات کامێرا دیجیتاڵەکان خۆکار بەکاری‌دەبەن.
@@ -1584,13 +1599,16 @@ $1',
 'backend-fail-delete' => 'نەکرا پەڕگەی $1 بسڕدرێتەوە.',
 'backend-fail-copy' => 'نەکرا پەڕگەی $1 کۆپی بکرێت بۆ $2.',
 'backend-fail-move' => 'نەکرا پەڕگەی $1 بگوازرێتەوە بۆ $2.',
-'backend-fail-create' => 'Ù\86Û\95کرا Ù¾Û\95Ú\95Ú¯Û\95Û\8c $1 Ø¯Ø±Ù\88ستبکرÛ\8eت.',
+'backend-fail-create' => 'Ù\86Û\95کرا Ù¾Û\95Ú\95Ú¯Û\95Û\8c $1 Ø¨Ù\86Ù\88Ù\88سرÛ\8eت',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'تێپه‌ربوون ره‌تکرایه‌وه‌',
 'img-auth-nofile' => 'فایلی "$1" بوونی نیه‌',
 'img-auth-isdir' => 'هه‌وڵ ده‌ده‌ی بۆ کردنه‌وه‌ی بوخچه‌ی "$1" له‌ کاتێکدا ته‌نیا کردنه‌وه‌ی فایل رێپێدراوه‌',
 
+# HTTP errors
+'http-host-unreachable' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
+
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
 'upload-curl-error6-text' => 'ئەو URL کە ڕاچاوت کردووە توانای دەست‌پێ‌گەیشتنی نییە.
@@ -1600,9 +1618,9 @@ $1',
 تکایە ئەرخەیان بە کە ماڵپەڕ بەردەوامە لە کارکردن، نەختێک ڕاوەستە و دیسان تاقی کەوە.
 لەوانەیە لە کاتێ کە کەمتر سەرقاڵ بێت تاقی بکەیتەوە باشتر بێت.',
 
-'license' => 'ئیجازەنامە:',
-'license-header' => 'ئیجازەنامە',
-'nolicense' => 'هیچ‌کام هەڵنەبژاردراوە',
+'license' => 'مۆڵەتنامە:',
+'license-header' => 'مۆڵەتنامە',
+'nolicense' => 'ھیچ ھەڵنەبژێردراوە',
 'license-nopreview' => '(پێشبینین ئامادەی کەڵک وەرگرتن نییە)',
 'upload_source_url' => ' (URLـی بەکار، بۆ دەست‌پێگەیشتنی  گشتی)',
 'upload_source_file' => ' (پەڕگەیەک لەسەر کۆمپیوتەرەکەت)',
@@ -1684,11 +1702,12 @@ $1',
 **لادان لە مافەکانی بڵاوکردنەوە
 ***پەڕگەی دووبارەکراوە',
 'filedelete-edit-reasonlist' => 'دەستکاری هۆکارەکانی سڕینەوە',
+'filedelete-maintenance-title' => 'ناتوانیت پەڕگە بسڕیتەوە',
 
 # MIME search
 'mimesearch' => 'گەڕانی MIME',
 'mimesearch-summary' => 'ئەم لاپەڕە پاڵێوتنی هەیە بۆ جۆرەکانی MIME.
-ناودراو: جۆرەی ناوەڕۆک\\ژێرجۆرە، وەک <tt>image/jpeg</tt>.',
+ناودراو: جۆرەی ناوەڕۆک\\ژێرجۆرە، وەک <code>image/jpeg</code>.',
 'mimetype' => 'جۆرەی MIME:',
 'download' => 'داگرتن',
 
@@ -1746,7 +1765,7 @@ $1',
 ئێستا ڕەوانکەرە بۆ [[$2]].',
 'double-redirect-fixer' => 'چارەسەرکەری ڕەوانکەر',
 
-'brokenredirects' => 'ڕەوانەکراوە شکاوەکان',
+'brokenredirects' => 'ڕەوانەکەرە شکاوەکان',
 'brokenredirectstext' => 'ئەم ڕەوانەکراوانە بەستەرن بۆ ئەو پەڕانە کە بوونیان نییە:',
 'brokenredirects-edit' => 'دەستکاری',
 'brokenredirects-delete' => 'سڕینەوە',
@@ -1789,8 +1808,9 @@ $1',
 'mostimages' => 'ئەو پەڕگانە زۆرترین بەستەریان پێدراوە',
 'mostrevisions' => 'ئەو پەڕانە زۆرترین پیاچوونەوەیان ھەیە',
 'prefixindex' => 'گشت پەڕەکان بە پێشگرەوە',
+'prefixindex-namespace' => 'هەموو پەڕەکان بەپێشگری (بۆشایی ناوی $1)',
 'shortpages' => 'پەڕە کورتەکان',
-'longpages' => 'پەڕە دڕێژەکان',
+'longpages' => 'پەڕە درێژەکان',
 'deadendpages' => 'پەڕە بنبەستەکان',
 'deadendpagestext' => 'ئەم پەڕانەی خوارەوە پەیوەندییان لەگەڵ پەڕەکانی تری {{SITENAME}} نییە.',
 'protectedpages' => 'پەڕە پارێزراوەکان',
@@ -1857,6 +1877,10 @@ $1',
 'allpagesbadtitle' => 'سەردێڕی لاپەڕە گونجاو نەبوو یان پێشگڕێکی بەینی‌زمانی یان بەینی‌ویکی هەبوو.
 لەوانەیە یەک یان زیاتر پیتی نەگونجاو بۆ سەردێڕی لەخۆ گرتبێ.',
 'allpages-bad-ns' => '{{SITENAME}} ناوبۆشایی نیە "$1".',
+'allpages-hide-redirects' => 'ڕەوانەکراوەکان بشارەوە',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'دواترین پیشانبدە',
 
 # Special:Categories
 'categories' => 'پۆلەكان',
@@ -1865,7 +1889,7 @@ $1',
 [[Special:WantedCategories|پۆلە خوازراوەکان]]یش ببینە.',
 'categoriesfrom' => 'نیشاندانی پۆلەکان بە دستپێکردن لە:',
 'special-categories-sort-count' => 'ڕیز کردن بە پێی ژمارە',
-'special-categories-sort-abc' => 'ڕیز کردن بە پێی ئەلفابێت',
+'special-categories-sort-abc' => 'ڕیزکردن بە پێی ئەلفوبێ',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'بەشدارییە سڕاوەکان',
@@ -1879,7 +1903,7 @@ $1',
 'linksearch-ok' => 'گەڕان',
 'linksearch-text' => 'Wildcardی وەک "*.wikipedia.org" بەکاردێت.
 لانی کەم پێویستی بە پاوانێکی ئاست-بان ھەیە، بۆ نموونە «*.org» .<br />
-پرۆتۆکۆلە پشتیوانی لێکراوەکان: <tt>$1</tt> (ھیچ کام لەمانە بە گەڕانەکەت زێدە مەکە).',
+پرۆتۆکۆلە پشتیوانی لێکراوەکان: <code>$1</code> (ھیچ کام لەمانە بە گەڕانەکەت زێدە مەکە).',
 'linksearch-line' => '$1 بەستەرپێ‌دراو لە $2',
 
 # Special:ListUsers
@@ -1898,8 +1922,8 @@ $1',
 'activeusers-noresult' => 'هیچ بەکارهێنەرێک نەدۆزرایەوە',
 
 # Special:Log/newusers
-'newuserlogpage' => 'لۆگی دروست کردنی بەکارھێنەر',
-'newuserlogpagetext' => 'ئەمە لۆگێکی درووست‌کردنی بەکارهێنەرە.',
+'newuserlogpage' => 'لۆگی دروستکردنی بەکارھێنەر',
+'newuserlogpagetext' => 'ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.',
 
 # Special:ListGroupRights
 'listgrouprights' => 'مافەکانی گرووپە بەکارھێنەرییەکان',
@@ -1924,10 +1948,12 @@ $1',
 'mailnologin' => 'ناونیشان بۆ ناردن نییه‌',
 'mailnologintext' => 'ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.',
 'emailuser' => 'ئیمەیل بنێرە بۆ ئەم بەکارھێنەرە',
+'emailuser-title-notarget' => 'ئیمەیل بۆ بەکارھێنەر',
 'emailpage' => 'ئیمەیل بۆ بەکارھێنەر',
 'emailpagetext' => 'دەتوانی لەم فۆرمەی خوارەوە کەڵک وەربگریت بۆ ناردنی پەیامێکی ئیمەیل بۆ ئەم بەکارھێنەرە.
 ئەو ئەدرەسی ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر‌یتدا]] نووسیوتە، بۆ ئەدرەسی «لەلایەن» (From) لە ئیمەیلدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.',
 'defemailsubject' => 'ئیمەیڵی {{SITENAME}} لە بەکارھێنەر «$1»ەوە',
+'usermaildisabled' => 'ئیمەیڵی بەکارهێنەر لەکاردانیە',
 'noemailtitle' => 'هیچ ناونیشانێکی ئی‌مەیل نییە',
 'noemailtext' => 'ئەم بەکارهێنەرە ناونێشانێکی بڕوا پێکراوی ئی‌مەیلی دانەناوە.',
 'nowikiemailtitle' => 'ڕێگە بۆ ئی‌مەیل نەدراوە',
@@ -1949,10 +1975,11 @@ $1',
 
 # User Messenger
 'usermessage-summary' => 'بەجێھێشتنی پەیامی سیستەم',
+'usermessage-editor' => 'پەیامنێری سیستەم',
 
 # Watchlist
-'watchlist' => 'Ù\84Û\8cستی چاودێرییەکانم',
-'mywatchlist' => 'Ù\84Û\8cستی چاودێرییەکانم',
+'watchlist' => 'Ù¾Û\8eرستی چاودێرییەکانم',
+'mywatchlist' => 'Ù¾Û\8eرستی چاودێرییەکانم',
 'watchlistfor2' => 'بۆ $1 $2',
 'nowatchlist' => 'لە لیستی چاودێڕییەکانتدا ھیچ نیە.',
 'watchlistanontext' => 'تکایە بۆ دیتن و دەستکاری بابەتەکانی لە ناو لیستی چاودێریەکەت‌دا $1.',
@@ -1961,6 +1988,7 @@ $1',
 'addwatch' => 'بیخە سەر لیستی چاودێری',
 'addedwatchtext' => 'پەڕەی «[[:$1]]» خرایە سەر [[Special:Watchlist|لیستی چاودێرییەکەت]].
 گۆڕانکارییەکانی داھاتووی ئەم پەڕە و پەڕەی وتووێژەکەی، لەوێدا ڕیزدەکرێ و پەڕەکە لە [[Special:RecentChanges|لیستی دوایین گۆڕانکارییەکاندا]] ئەستوورکراو دەردەکەوێت بۆ ئەوەی ئاسانتر دەستکەوێت.',
+'removewatch' => 'لەلیستی چاودێری لایبە',
 'removedwatchtext' => 'پەڕەی «[[:$1]]» لە [[Special:Watchlist|لیستی چاودێریەکەت]] لابرا.',
 'watch' => 'چاودێری بکە',
 'watchthispage' => 'چاودێریی ئەم پەڕە بکە',
@@ -2027,7 +2055,7 @@ $UNWATCHURL
 'deletepage' => 'پەڕە بسڕەوە',
 'confirm' => 'پشتدار بکەرەوە',
 'excontent' => 'ناوەرۆک ئەمە بوو: «$1»',
-'excontentauthor' => 'ناوەرۆک ئەمە بوو: «$1» (و تەنھا بەشداربوو  «[[Special:Contributions/$2|$2]]» بوو)',
+'excontentauthor' => 'ناوەرۆک ئەمە بوو: «$1» (و تەنیا بەشداربوو «[[Special:Contributions/$2|$2]]» بوو)',
 'exbeforeblank' => 'ناوەرۆک بەر لە بەتاڵ کردنەوە ئەمە بوو: «$1»',
 'exblank' => 'پەڕە خاڵی بوو',
 'delete-confirm' => 'سڕینەوەی «$1»',
@@ -2068,7 +2096,7 @@ $UNWATCHURL
 
 دوایین دەستکاری ئەم لاپەڕە [[User:$3|$3]] کردوویە ([[User talk:$3|وتووێژ]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "پوختەی دەستکاری \"''\$1''\" بوو.",
-'revertpage' => 'گەڕاندنەوەی دەستکارییەکان لەلایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین دەستکاریی [[User:$1|$1]]',
+'revertpage' => 'گەڕاندنەوەی دەستکارییەکانی [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین دەستکاریی [[User:$1|$1]]',
 'rollback-success' => 'دەستکارییەکانی $1 وەرگێرایەوە؛<br />
 گۆڕدرا بۆ دوایین دەستکاریی $2.',
 
@@ -2084,9 +2112,9 @@ $UNWATCHURL
 'protectedarticle' => '«[[$1]]»ی پاراست',
 'modifiedarticleprotection' => 'ئاستی پاراستنی «[[$1]]»ی گۆڕا',
 'unprotectedarticle' => 'پاراستنی لەسەر «[[$1]]» لابرد',
-'movedarticleprotection' => 'ڕێککارییەکانی پاراستن لە  "[[$2]]" گوازرایەوە بۆ "[[$1]]"',
+'movedarticleprotection' => 'ڕێککارییەکانی پاراستن لە  «[[$2]]» گوازرایەوە بۆ «[[$1]]»',
 'protect-title' => 'گۆڕینی ئاستی پاراستنی "$1"',
-'prot_1movedto2' => '[[$1]] گوازراوەتەوە بۆ [[$2]]',
+'prot_1movedto2' => '[[$1]] گوازرایەوە بۆ [[$2]]',
 'protect-legend' => 'پاراستن تەیید بکە',
 'protectcomment' => 'ھۆکار:',
 'protectexpiry' => 'ھەتا:',
@@ -2175,6 +2203,7 @@ $UNWATCHURL
 
 بۆ دیتنی پێشینەی دوایین سڕینەوەکان و هێنانەوەکان سەرنجی [[Special:Log/delete|لۆگی سڕینەوە]] بدە.",
 'undelete-header' => 'بۆ دیتنی ئەو لاپەڕانەی لەم داییانەدا سڕاونەتەوە چاو لە [[Special:Log/delete|لۆگی سڕینەوە]] بکە.',
+'undelete-search-title' => 'گەڕان بۆ لاپەڕە سڕاوەکان',
 'undelete-search-box' => 'گەڕان بۆ لاپەڕە سڕاوەکان',
 'undelete-search-prefix' => 'نیشان‌دانی ئەو لاپەڕانەی دەستپێکیان ئەمەیە:',
 'undelete-search-submit' => 'گەڕان',
@@ -2192,7 +2221,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'بۆشاییی ناو:',
 'invert' => 'ھەڵبژاردەکان پێچەوانە بکە',
-'namespace_association' => 'بۆشایی ناوی پەیوەندیدار',
+'namespace_association' => 'بۆشاییی ناوی پەیوەندیدار',
 'blanknamespace' => '(سەرەکی)',
 
 # Contributions
@@ -2239,7 +2268,10 @@ $1',
 'whatlinkshere-filters' => 'پاڵێوکەکان',
 
 # Block/unblock
+'block' => 'بەربەستکردنی بەکارهێنەر',
+'unblock' => 'لە بەربەست‌دەرهێنانی بەکارهێنەر',
 'blockip' => 'بەربەستنی بەکارھێنەر',
+'blockip-title' => 'بەربەستکردنی بەکارهێنەر',
 'blockip-legend' => 'بەربەست‌کردنی بەکارهێنەر',
 'blockiptext' => 'لەم فۆرمەی خوارەوە دەتوانی بۆ بەربەست‌کردنی دەست‌پێ‌گەیشتنی نووسین لە ناونیشانێکی ئای‌پی تایبەت یا ناوی بەکارهێنەریەک، کەڵک وەرگریت.
 ئەمە تەنها دەبێ بۆ بەرگری لە خراپکاری بەکاربێت و ڕێکەوتنی هەبێ دەگەڵ [[{{MediaWiki:Policy-url}}|سیاسەتەکان]].
@@ -2281,9 +2313,11 @@ $1',
 'ipusubmit' => 'لابردنی ئەم بەربەستە',
 'unblocked' => '[[User:$1|$1]] لە بەربەست دەرهێنرا',
 'unblocked-id' => 'بەربەستی $1 لابرا',
+'blocklist' => 'بەکارھێنەر بەربەستکراوەکان',
 'ipblocklist' => 'بەکارھێنەر بەربەستنکراوەکان',
 'ipblocklist-legend' => 'دۆزینەوەی بەکارهێنەرێکی بەربەست‌کراو',
 'blocklist-target' => 'مەبەست',
+'blocklist-expiry' => 'ھەتا:',
 'blocklist-reason' => 'ھۆکار',
 'ipblocklist-submit' => 'گەڕان',
 'infiniteblock' => 'بێکۆتایی',
@@ -2299,6 +2333,7 @@ $1',
 'unblocklink' => 'بەربەستن لابە',
 'change-blocklink' => 'بەربەستن بگۆڕە',
 'contribslink' => 'بەشدارییەکان',
+'emaillink' => 'ناردنی ئیمەیل',
 'autoblocker' => 'خۆکار بەربەست‌کراوە لەبەر ئەوەی ناونیشانی ئای‌پی تۆ لەم دواییانەدا لە لایەن "[[User:$1|$1]]" بەکار هاتووە.
 هۆکاری بەربەست‌کرانی $1 ئەمەیە: "$2"',
 'blocklogpage' => 'لۆگی بەربەستن',
@@ -2390,7 +2425,7 @@ $1',
 * ئەو چوارچێوەی خوارەوە لێنەدراو بکەی.
 
 لەو حاڵەتەدا، ئەگەر بتەوێت بیگوازیتەوە ناچار دەبیت بە شێوەی دەستی بیگوازیتەوە یان تێکەڵیان بکەی.",
-'movearticle' => 'ئەم پەڕە بگوازەوە:',
+'movearticle' => 'ئەم پەڕەیە بگوازەوە:',
 'movenologin' => 'نەچوویتەتە ژوورەوە',
 'movenologintext' => 'بۆ گواستنەوەی پەڕەیەک، ئەشێ ببی بە ئەندام و [[Special:UserLogin|لە ژوورەوە]] بیت.',
 'movenotallowed' => 'ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی لاپەڕەکان.',
@@ -2398,11 +2433,11 @@ $1',
 'cant-move-user-page' => 'ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی لاپەڕەکانی بەکارهێنەر (جیاواز لە ژێرلاپەڕەکان).',
 'cant-move-to-user-page' => 'ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی لاپەڕەیەک بۆ لاپەڕەی بەکارهێنەر (غەیری بۆ ژێرلاپەڕەی بەکارهێنەر).',
 'newtitle' => 'بۆ ناوی نوێی:',
-'move-watch' => 'ئەم پەڕە چاودێری بکە',
-'movepagebtn' => 'ئەم پەڕە بگوازەوە',
+'move-watch' => 'چاودێری ئەم پەڕەیە بکە',
+'movepagebtn' => 'ئەم پەڕەیە بگوازەوە',
 'pagemovedsub' => 'گواستنەوە بە سەرکەوتوویی جێبەجێ کرا',
 'movepage-moved' => "'''«$1» گوازرایەوە بۆ «$2»'''",
-'movepage-moved-redirect' => 'ڕەوانکەرێک درووست‌کرا.',
+'movepage-moved-redirect' => 'ڕەوانەکەرێک دروست کرا.',
 'movepage-moved-noredirect' => 'لە دانانی ڕەوانەکەر بەرگری کرا.',
 'articleexists' => 'پەڕەیەک بەم ناوە ھەیە یان ئەو ناوەی تۆ ھەڵتبژاردووە ڕێگەی پێنەدراوە.
 تکایە ناوێکی دیکە ھەڵبژێرە.',
@@ -2411,8 +2446,8 @@ $1',
 تکایە بە دەستی تێکەڵیان بکە.'''",
 'movedto' => 'گواسترایەوە بۆ',
 'movetalk' => 'پەڕەی وتووێژی پەیوەندیدار بگوازەوە',
-'move-subpages' => 'ژێرپەڕەکانی بگۆزەرەوە (بە ئەندازەی $1)',
-'move-talk-subpages' => 'ژێرپەڕەکانی پەڕەی وتووێژی بگۆزەرەوە (ھەتاکوو $1)',
+'move-subpages' => 'ژێرپەڕەکانی بگوازەوە (ھەتا $1 پەڕە)',
+'move-talk-subpages' => 'ژێرپەڕەکانی پەڕەی وتووێژ بگوازەوە (ھەتا $1 پەڕە)',
 'movepage-page-exists' => 'پەڕەی $1 هەیە و ناتوانرێت خۆکار بخرێتە جێی.',
 'movepage-page-moved' => 'پەڕەی $1 گۆزرایەوە بۆ $2.',
 'movepage-page-unmoved' => 'ناکرێ پەڕەی $1 بگوێزرێتەوە بۆ $2.',
@@ -2421,14 +2456,14 @@ $1',
 'movelogpagetext' => 'لە خوارەوەدا لیستی ھەموو پەڕە گواستنەوەکان دەبینن.',
 'movesubpage' => '{{PLURAL:$1|ژێرپەڕە|ژێرپەڕە}}',
 'movesubpagetext' => 'ئەم لاپەڕە $1 {{PLURAL:$1|ژێرلاپەڕەی‌|ژێرلاپەڕەی}} هەیە کە لەخوارە نیشان دراوە.',
-'movenosubpage' => 'ئەم پەڕە ھیچ ژێرپەڕەیەکی نییە.',
+'movenosubpage' => 'ئەم پەڕەیە ھیچ ژێرپەڕەیەکی نییە.',
 'movereason' => 'ھۆکار:',
 'revertmove' => 'پێچەوانەکردنەوە',
 'delete_and_move' => 'بیسڕەوە و بیگوازەوە',
 'delete_and_move_text' => '== پێویستییەکانی سڕینەوە ==
 لاپەڕەی مەبەست "[[:$1]]" لە پێش‌دا هەیە.
 ئایا دەتەوێ ئەوە بسڕیتەوە تا ڕێگە بۆ گواستنەوەی بکەیتەوە؟',
-'delete_and_move_confirm' => 'بÛ\95ÚµÛ\8eØ\8c Ù\84اپÛ\95Ú\95Û\95Ú©Û\95 Ø¨Ø³Ú\95Û\95Ù\88Ù\87',
+'delete_and_move_confirm' => 'بەڵێ، پەڕەکە بسڕەوه',
 'delete_and_move_reason' => 'سڕایەوە بۆ کردنەوەی ڕیگە بۆ گواستنەوە لە «[[$1]]»ەوە',
 'selfmove' => 'سەردێڕەکانی سەرچاوە و مەبەست یەکێکن؛
 ناکرێ لاپەڕەیەک بۆ سەر خۆی‌ بگوازرێتەوە.',
@@ -2438,10 +2473,11 @@ $1',
 'immobile-source-page' => 'ئەمە لاپەڕە بۆ گواستنەوە نابێت.',
 'immobile-target-page' => 'بۆ ئەم سەردێڕی ئامانجە جێگۆڕ ناکرێ.',
 'imagenocrossnamespace' => 'گواستنەوەی پەڕگە بۆ بۆشایی‌نوێکی غەیری پەڕگە گونجاو نیە.',
+'nonfile-cannot-move-to-file' => 'گواستنەوەی پەڕگە بۆ بۆشایی‌نوێکی غەیری پەڕگە گونجاو نیە.',
 'imagetypemismatch' => 'پاشگری ئەو پەڕگە نوێیە هاوتای جۆری پەڕگەکە نیە.',
 'imageinvalidfilename' => 'ناوی پەڕگەی ئامانج گونجاو نیە',
 'fix-double-redirects' => 'نوێ‌کەردنەوەی هەموو ڕەوانکەرەکان وا ئاماژە بە سەردێڕە سەرەکیەکە دەکەن',
-'move-leave-redirect' => 'Ù\84Û\95 Ù¾Ø§Ø´Û\95Ù\88Û\95 Ú\95Û\95Ù\88اÙ\86Ú©Û\95رÛ\8eÚ© Ø¯Ø§Ø¨Ù\86ە',
+'move-leave-redirect' => 'Ù\84Û\95 Ù¾Ø§Ø´Û\95Ù\88Û\95 Ú\95Û\95Ù\88اÙ\86Ú©Û\95رÛ\8eÚ© Ø¨Û\95 Ø¬Û\8e Ø¨Ú¾Û\8eÚµە',
 'protectedpagemovewarning' => "'''ھۆشیار بە: ئەم پەڕە پارێزراوە بۆ ئەوی تەنیا ئەو بەکارھێنەرانە کە مافەکانی بەڕێوەبەرایەتییان ھەیە بتوانن بیگوازنەوە.'''
 دوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
 'semiprotectedpagemovewarning' => "'''ئاگاداری:''' ئەم پەڕە پارێزراوە بۆ ئەوی تەنھا بەکارھێنەرە تۆمارکراوەکان بتوانن بیگوازنەوە.
@@ -2551,7 +2587,7 @@ $1',
 'tooltip-pt-mytalk' => 'پەڕەی وتوبێژی تۆ',
 'tooltip-pt-anontalk' => 'لێدوان لەسەر دەستکارییەکان لەم ئایپی ئەدرەسەوە',
 'tooltip-pt-preferences' => 'بژاردەکانت',
-'tooltip-pt-watchlist' => 'Ù\84Û\8cستÛ\8c Ø¦Û\95Ù\88 Ù¾Û\95Ú\95اÙ\86Û\95 Ú©Û\95 Ú\86اÙ\88دÛ\8eری گۆڕانکارییەکانیانی دەکەی',
+'tooltip-pt-watchlist' => 'Ù¾Û\8eرستÛ\8c Ø¦Û\95Ù\88 Ù¾Û\95Ú\95اÙ\86Û\95 Ú©Û\95 Ú\86اÙ\88دÛ\8eرÛ\8cی گۆڕانکارییەکانیانی دەکەی',
 'tooltip-pt-mycontris' => 'لیستی بەشدارییەکانت',
 'tooltip-pt-login' => 'پێشنیارت پێدەکرێ بچیتە ژوورەوە؛ ھەرچەندە زۆرت لێناکرێ',
 'tooltip-pt-anonlogin' => 'پێشنیار دەکەین بڕۆیتەژوورەوە، ئەگەرچی ئەوە زۆرەملیی نیە',
@@ -2563,6 +2599,7 @@ $1',
 ئەتوانی سەرچاوەکەی ببینیت',
 'tooltip-ca-history' => 'وەشانەکانی پێشووی ئەم پەڕەیە',
 'tooltip-ca-protect' => 'ئەم پەڕەیە بپارێزە',
+'tooltip-ca-unprotect' => 'پاراستنی ئەم پەڕەیە بگۆڕە',
 'tooltip-ca-delete' => 'ئەم پەڕەیە بسڕەوە',
 'tooltip-ca-undelete' => 'هێنانەوەی دەستکاریەکانی پیش سڕینەوە وا لەسەر ئەم لاپەڕە ڕووی‌داوە',
 'tooltip-ca-move' => 'ئەم پەڕەیە بگوازەوە',
@@ -2605,10 +2642,13 @@ $1',
 'tooltip-diff' => 'نیشان دانی گۆڕانکارییەکانت لە دەقەکەدا',
 'tooltip-compareselectedversions' => 'جیاوازییەکانی دوو وەشانە دیاریکراوەی ئەم پەڕە ببینە.',
 'tooltip-watch' => 'ئەم پەڕە بخە سەر لیستی چاودێریت',
+'tooltip-watchlistedit-normal-submit' => 'ناونیشانەکان لاببە',
+'tooltip-watchlistedit-raw-submit' => 'نوێکردنەوەی لیستی چاودێری',
 'tooltip-recreate' => 'درووست‌کردنەوەی لاپەڕە ئەگەرچی سڕاوەتەوە',
 'tooltip-upload' => 'دەستپێکردنی بارکردن',
 'tooltip-rollback' => "''گەڕاندنەوە'' بە یەک کلیک گۆڕانکاری (گۆڕانکارییەکانی) ئەم پەڕە ئەباتەوە بۆ ھی دواین بەشدار",
 'tooltip-undo' => '«پووچکردنەوە» ئەم گۆڕانکارییە دەگەڕێنێتەوە و فۆرمی دەستکاریکردنەکە لە حاڵەتی پێشبینیندا دەکاتەوە. بەم شێوە دەکرێ ھۆکارێک لە پوختەدا بنووسرێت.',
+'tooltip-preferences-save' => 'هەڵبژاردنەکانت بپارێزە',
 'tooltip-summary' => 'پوختەیەکی کورتی تێبخە',
 
 # Metadata
@@ -2636,14 +2676,14 @@ $1',
 
 # Info page
 'pageinfo-title' => 'زانیاری بۆ «$1»',
+'pageinfo-header-basic' => 'زانیاریی سەرەتایی',
 'pageinfo-header-edits' => 'دەستکاریەکان',
-'pageinfo-header-watchlist' => 'لیستی چاودێری',
-'pageinfo-header-views' => 'بینینەکان',
-'pageinfo-subjectpage' => 'پەڕە',
-'pageinfo-talkpage' => 'پەڕەی وتووێژ',
+'pageinfo-display-title' => 'ناونیشان نیشانبدە',
+'pageinfo-article-id' => 'زنجیرەی پەڕە',
+'pageinfo-views' => 'ژمارەی بینینەکان',
 'pageinfo-watchers' => 'ژمارەی چاودێران',
+'pageinfo-firstuser' => 'دروستکەری پەڕە',
 'pageinfo-edits' => 'ژمارەی دەستکارییەکان',
-'pageinfo-views' => 'ژمارەی بینینەکان',
 
 # Skin names
 'skinname-standard' => 'کلاسیک',
@@ -2652,7 +2692,7 @@ $1',
 'skinname-monobook' => 'مۆنۆ',
 'skinname-myskin' => 'پێستی خۆم',
 'skinname-chick' => 'جووچک',
-'skinname-simple' => 'ساده‌',
+'skinname-simple' => 'ساکار',
 'skinname-modern' => 'مۆدێڕن',
 'skinname-vector' => 'ڤێکتۆر',
 
@@ -2692,7 +2732,7 @@ $1',
 'file-info-size' => '$1 × $2 پیکسێل، قەبارەی پەڕگە: $3، جۆری MIME: $4',
 'file-nohires' => 'رەزۆلوشنی سەرتر لەمە لە بەردەست دا نیە.',
 'svg-long-desc' => 'پەڕگەی SVG، بە ناو $1 × $2 پیکسەڵ، قەبارەی پەڕگە: $3',
-'show-big-image' => 'گەورە کردنەوە',
+'show-big-image' => 'گەورەکردنەوە',
 'show-big-image-preview' => 'قەبارەی ئەم پێشبینینە: $1.',
 'show-big-image-other' => '{{PLURAL:$2|ڕەزەلووشنی|ڕەزەلووشنەکانی}} تر: $1.',
 'show-big-image-size' => '$1 لە $2 پیکسەڵ',
@@ -2711,6 +2751,10 @@ $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1، $2 لە $3',
+'seconds-abbrev' => '$1چ',
+'minutes-abbrev' => '$1خ',
+'hours-abbrev' => '$1ک',
+'days-abbrev' => '$1ڕ',
 'seconds' => '{{PLURAL:$1|$1 چرکە|$1 چرکە}}',
 'minutes' => '{{PLURAL:$1|$1 خولەک|$1 خولەک}}',
 'hours' => '{{PLURAL:$1|$1 کاتژمێر|$1 کاتژمێر}}',
@@ -2754,10 +2798,14 @@ $1',
 'exif-imagelength' => 'بەرزی',
 'exif-imagedescription' => 'ناونیشانی وێنە',
 'exif-model' => 'جۆری کامێرا',
+'exif-software' => 'نەرمەواڵەی بەکارهاتوو',
 'exif-artist' => 'نووسەر',
 'exif-colorspace' => 'بۆشایی ره‌نگ',
+'exif-pixelydimension' => 'پانی وێنە',
+'exif-pixelxdimension' => 'بەرزی وێنە',
 'exif-usercomment' => 'بۆچوونەکانی بەکارهێنەر',
 'exif-relatedsoundfile' => 'فایلی ده‌نگی لێکچوو',
+'exif-exposuretime-format' => '$1 چرکە ($2)',
 'exif-lightsource' => 'سەرچاوەی ڕووناکی',
 'exif-flash' => 'فلاش',
 'exif-filesource' => 'سەرچاوەی پەڕگە',
@@ -2771,6 +2819,18 @@ $1',
 'exif-gpstrack' => 'ئاڕاستەی جوڵان',
 'exif-gpsimgdirection' => 'ئاڕاستەی وێنە',
 'exif-gpsdatestamp' => 'ڕێکەوتی GPS',
+'exif-objectname' => 'سەردێری کورت',
+'exif-headline' => 'سەردێر',
+'exif-source' => 'سەرچاوە',
+'exif-contact' => 'زانیاری پەیوەندیکردن',
+'exif-writer' => 'نووسەر',
+'exif-languagecode' => 'زمان',
+'exif-iimversion' => 'وەشانی IIM',
+'exif-iimcategory' => 'پۆل',
+'exif-copyrighted' => 'ڕەوشی مافی لەبەرگرتنەوە',
+
+# Make & model, can be wikified in order to link to the camera and model name
+'exif-subjectnewscode-value' => '$2 ($1)',
 
 # EXIF attributes
 'exif-compression-1' => 'نەپەستێنراو',
@@ -2880,6 +2940,26 @@ $1',
 'exif-gpsspeed-k' => 'کیلۆمەتر هەر کاتژمێر',
 'exif-gpsspeed-m' => 'مایل هەر کاتژمێر',
 
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'کیلۆمەتر',
+'exif-gpsdestdistance-m' => 'میل',
+'exif-gpsdestdistance-n' => 'میکی دەریایی',
+
+'exif-dc-date' => 'ڕۆژ(ەکان)',
+'exif-dc-publisher' => 'بڵاوکار',
+'exif-dc-relation' => 'میدیای پەیوەندیدار',
+'exif-dc-rights' => 'مافەکان',
+'exif-dc-source' => 'سەرچاوەی میدیا',
+'exif-dc-type' => 'جۆری میدیا',
+
+'exif-iimcategory-hth' => 'تەندروستی',
+'exif-iimcategory-pol' => 'سیاسەت',
+'exif-iimcategory-sci' => 'زانست و تەکنۆلۆژیا',
+'exif-iimcategory-soi' => 'بابەتە کۆمەڵایەتییەکان',
+'exif-iimcategory-spo' => 'وەرزشەکان',
+
+'exif-urgency-normal' => 'ئاسایی ($1)',
+
 # External editor support
 'edit-externally' => 'دەستکاریی ئەم پەڕەیە بکە بە بەکارھێنانی پڕۆگرامێکی دەرەکی',
 'edit-externally-help' => '(بۆ زانیاریی زیاتر سەیری [//www.mediawiki.org/wiki/Manual:External_editors  ڕێنماییەکانی دامەزراندن] بکە)',
@@ -3002,6 +3082,7 @@ $5
 'size-megabytes' => '$1 مێگابایت',
 'size-gigabytes' => '$1 گیگابایت',
 'size-terabytes' => '$1 تێرابایت',
+'size-petabytes' => '$1 پێبی‌بایت',
 
 # Live preview
 'livepreview-loading' => 'باركردن‌...',
@@ -3067,10 +3148,12 @@ $5
 'hijri-calendar-m12' => 'زولحەججە',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|وتووێژ]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|لێدوان]])',
+'timezone-utc' => 'بەکاتی جیهانی',
 
 # Core parser functions
 'unknown_extension_tag' => 'تاگی درێژکراوەی نەناسراو "$1"',
+'duplicate-defaultsort' => "'''ئاگاداری''' کلیلی پۆلێنکردنی \"\$2'' چووەتە شوێنی کلیلی پۆلێنکردنی  \"\$1\"",
 
 # Special:Version
 'version' => 'وەشان',
@@ -3187,11 +3270,15 @@ $5
 # New logging system
 'logentry-delete-delete' => '$1 پەڕەی $3ی سڕییەوە',
 'logentry-delete-restore' => '$1 پەڕەی $3ی ھێنایەوە',
+'logentry-delete-revision' => '$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیکی|$5 پێداچوونەوەی}} پەڕەی $3 گۆڕیی: $4',
+'revdelete-content-hid' => 'شاردنەوەی ناوەرۆک',
+'revdelete-uname-hid' => 'ناوی بەکارهێنەری شاراوە',
 'revdelete-restricted' => 'ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران',
 'revdelete-unrestricted' => 'ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران',
 'logentry-move-move' => '$1 پەڕەی $3ی گواستەوە بۆ $4',
-'logentry-move-move-noredirect' => '$1 پەڕەی $3 گواستەوە بۆ $4 بێ بەجێھشتنی ڕەوانەکردنەوەیەک',
-'logentry-move-move_redir-noredirect' => '$1 پەڕەی $3 گواستەوە بۆ $4 لە جێگەی ڕەوانەکەرێک بە بێ بەجێھشتنی ڕەوانەکردنەوەیەک',
+'logentry-move-move-noredirect' => '$1 پەڕەی $3 بەبێ بەجێھشتنی ڕەوانەکەرێک گواستەوە بۆ $4',
+'logentry-move-move_redir' => '$1 پەڕەی $3 گواستەوە بۆ $4 کە پێشتر ڕەوانەکەر بوو',
+'logentry-move-move_redir-noredirect' => '$1 پەڕەی $3 بەبێ بەجێھشتنی ڕەوانەکەرێک گواستەوە بۆ $4 کە پێشتر ڕەوانەکەر بوو',
 'logentry-newusers-newusers' => '$1 ھەژمارێکی بەکارھێنەریی دروستکرد',
 'logentry-newusers-create' => '$1 ھەژمارێکی بەکارھێنەریی دروستکرد',
 'logentry-newusers-create2' => '$1 ھەژمارێکی بەکارھێنەریی دروستکرد $3',
@@ -3202,11 +3289,13 @@ $5
 'feedback-subject' => 'بابەت:',
 'feedback-message' => 'پەیام:',
 'feedback-cancel' => 'ھەڵیوەشێنەوە',
+'feedback-submit' => 'تێبینییەکان بنێرە',
 'feedback-close' => 'ئەنجام درا',
 
 # API errors
 'api-error-filename-tooshort' => 'ناوی پەڕگەکە زۆر کورتە.',
 'api-error-filetype-banned' => 'ئەم جۆرە پەڕگەیە قەدەغەیە.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|جۆرە پەڕگەی ڕێگە پێ‌نەدراوە‌|جۆرە پەڕگە ڕێگە پێ‌نەدراوە‌کانن}}. $2، ئەو جۆرە {{PLURAL:$3|پەڕگەیە کە ڕێگەی|پەڕگانەیە کە ڕێگەیان}} پێ‌دراوە.',
 'api-error-unclassified' => 'ھەڵەیەکی نەزانراو ڕوویداوە.',
 'api-error-unknown-code' => 'ھەڵەی نەزانراو: «$1».',
 'api-error-unknownerror' => 'ھەڵەی نەزانراو: «$1».',
index c3abfdc..92cc193 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Crimean Turkish (Cyrillic script) (â\80ªÐ\9aъырымтатарджа (Кирилл)‬)
+/** Crimean Turkish (Cyrillic script) (â\80ªÐºъырымтатарджа (Кирилл)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -147,7 +147,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Козетюв джедвелимде къайдлы къулланыджылар тарафындан япылгъан денъишмелерни косьтерме',
 'tog-watchlisthideanons' => 'Козетюв джедвелимде къайдсыз (аноним) къулланыджылар тарафындан япылгъан денъишмелерни косьтерме',
 'tog-watchlisthidepatrolled' => 'Козетюв джедвелинде тешкерильген денъишмелерни гизле',
-'tog-nolangconversion' => 'Язув системасы вариантлары денъиштирювни ишлетме',
 'tog-ccmeonemails' => 'Дигер къулланыджыларгъа ёллагъан мектюплеримнинъ копияларыны манъа да ёлла',
 'tog-diffonly' => 'Тенъештирме саифелеринде саифенинъ эсас мундериджесини косьтерме',
 'tog-showhiddencats' => 'Гизли категорияларны косьтер',
@@ -715,7 +714,7 @@ $2 къулланыджысына вакътынджа <code>$3</code> паро
 'copyrightwarning' => "'''Лютфен, дикъкъат:''' {{SITENAME}} сайтына къошулгъан бутюн исселер <i>$2</i> мукъавелеси даиресиндедир (тафсилят ичюн $1 саифесине бакъынъыз).
 Къошкъан иссенъизнинъ башкъа инсанлар тарафындан аджымасызджа денъиштирильмесини я да азат тарзда ве сынъырсызджа башкъа ерлерге дагъытылмасыны истемесенъиз, иссе къошманъыз.<br />
 Айрыджа, мында иссе къошып, бу иссенинъ озюнъиз тарафындан язылгъанына, я да джемааткъа ачыкъ бир менбадан я да башкъа бир азат менбадан копиялангъанына гарантия берген оласынъыз.<br />
-'''<center>МУЭЛЛИФЛИК АКЪКЪЫНЕН КЪОРЧАЛАНГЪАН ИЧ БИР МЕТИННИ МЫНДА РУХСЕТСИЗ КЪОШМАНЪЫЗ!</center>'''",
+'''МУЭЛЛИФЛИК АКЪКЪЫНЕН КЪОРЧАЛАНГЪАН ИЧ БИР МЕТИННИ МЫНДА РУХСЕТСИЗ КЪОШМАНЪЫЗ!'''",
 'copyrightwarning2' => "'''Лютфен, дикъкъат:''' {{SITENAME}} сайтына сиз къошкъан бутюн исселер башкъа бир къулланыджы тарафындан денъиштирилип я да ёкъ этилип олур. Къошкъан иссенъизнинъ башкъа инсанлар тарафындан аджымасызджа денъиштирильмесини я да азат тарзда ве сынъырсызджа башкъа ерлерге дагъытылмасыны истемесенъиз, иссе къошманъыз.<br />
 Айрыджа, мында иссе къошып, бу иссенинъ озюнъиз тарафындан язылгъанына, я да джемааткъа ачыкъ бир менбадан я да башкъа бир азат менбадан копиялангъанына гарантия берген оласынъыз ($1 бакъынъыз).<br />
 '''МУЭЛЛИФЛИК АКЪКЪЫНЕН КЪОРЧАЛАНГЪАН ИЧ БИР МЕТИННИ МЫНДА РУХСЕТСИЗ КЪОШМАНЪЫЗ!'''",
@@ -1095,9 +1094,9 @@ $3 мына бу себепни бильдирди: ''$2''",
 Эвельдже юкленген ресим тапмакъ я да бакъмакъ ичюн [[Special:FileList|юкленген файллар джедвелине]] кечинъиз, бундан гъайры файл юкленюв ве ёкъ этилюв къайдларыны [[Special:Log/upload|юкленюв журналында]] ве [[Special:Log/delete|ёкъ этилюв журналында]] тапып оласынъыз.
 
 Саифеде ресим къулланмакъ ичюн бойле шекилли багълантылар къулланынъыз:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' файлнынъ там версиясыны къулланмакъ ичюн,
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|tarif]]</nowiki></tt>''' бир тариф иле 200 пиксель бир ресим къулланмакъ ичюн,
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' файлгъа вастасыз багъланты ичюн.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' файлнынъ там версиясыны къулланмакъ ичюн,
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|tarif]]</nowiki></code>''' бир тариф иле 200 пиксель бир ресим къулланмакъ ичюн,
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' файлгъа вастасыз багъланты ичюн.",
 'upload-permitted' => 'Изинли файл чешитлери: $1.',
 'upload-preferred' => 'Истенильген файл чешитлери: $1.',
 'upload-prohibited' => 'Ясакълы файл чешитлери: $1.',
@@ -1129,21 +1128,21 @@ $3 мына бу себепни бильдирди: ''$2''",
 'emptyfile' => 'Ихтимал ки, юкленген файл бош.
 Ихтималлы себеп - файл адландырув хатасыдыр.
 Лютфен, тамам бу файлны юклемеге истейджек экенинъизни тешкеринъиз.',
-'fileexists' => "Бу исимде бир файл энди бар.
-Лютфен, эгер сиз денъиштирмектен эмин олмасанъыз башта '''<tt>[[:$1]]</tt>''' файлына козь ташланъыз.
-[[$1|thumb]]",
-'filepageexists' => "Бу файл ичюн тасвир саифеси энди япылгъан ('''<tt>[[:$1]]</tt>'''), лякин бу адда бир файл ёкътыр.
+'fileexists' => 'Бу исимде бир файл энди бар.
+Лютфен, эгер сиз денъиштирмектен эмин олмасанъыз башта <strong>[[:$1]]</strong> файлына козь ташланъыз.
+[[$1|thumb]]',
+'filepageexists' => 'Бу файл ичюн тасвир саифеси энди япылгъан (<strong>[[:$1]]</strong>), лякин бу адда бир файл ёкътыр.
 Язылгъан тасвиринъиз файл саифесинде косьтерильмейджек.
 Тасвиринъиз анда косьтериледжеги ичюн, буны къолнен денъиштирмек керексинъиз.
-[[$1|thumb]]",
-'fileexists-extension' => "Бунъа ошагъан адда бир файл бар: [[$2|thumb]]
-* Юкленген файлнынъ ады: '''<tt>[[:$1]]</tt>'''
-* Мевджут олгъан файлнынъ ады: '''<tt>[[:$2]]</tt>'''
-Лютфен, башкъа бир ад сайлап язынъыз.",
-'fileexists-thumbnail-yes' => "Бельки де бу файл бир уфакълаштырылгъан копиядыр (thumbnail). [[$1|thumb]]
-Лютфен, '''<tt>[[:$1]]</tt>''' файлыны тешкеринъиз.
-Эгер шу файл айны шу ресим олса, онынъ уфакълаштырылгъан копиясыны айры оларакъ юклемек аджети ёкътыр.",
-'file-thumbnail-no' => "Файлнынъ ады '''<tt>$1</tt>'''нен башлана. Бельки де бу ресимнинъ уфакълаштырылгъан бир копиясыдыр ''(thumbnail)''.
+[[$1|thumb]]',
+'fileexists-extension' => 'Бунъа ошагъан адда бир файл бар: [[$2|thumb]]
+* Юкленген файлнынъ ады: <strong>[[:$1]]</strong>
+* Мевджут олгъан файлнынъ ады: <strong>[[:$2]]</strong>
+Лютфен, башкъа бир ад сайлап язынъыз.',
+'fileexists-thumbnail-yes' => 'Бельки де бу файл бир уфакълаштырылгъан копиядыр (thumbnail). [[$1|thumb]]
+Лютфен, <strong>[[:$1]]</strong> файлыны тешкеринъиз.
+Эгер шу файл айны шу ресим олса, онынъ уфакълаштырылгъан копиясыны айры оларакъ юклемек аджети ёкътыр.',
+'file-thumbnail-no' => "Файлнынъ ады <strong>$1</strong>нен башлана. Бельки де бу ресимнинъ уфакълаштырылгъан бир копиясыдыр ''(thumbnail)''.
 Эгер сизде бу ресим там буюклигинде бар олса, лютфен, оны юкленъинъиз я да файлнынъ адыны денъиштиринъиз.",
 'fileexists-forbidden' => 'Бу исимде бир файл энди бар, ве узерине языламай.
 Файлынъызны янъыдан юклемеге истесенъиз, лютфен, кери къайтып янъы бир исим къулланынъыз.
index 84a2ee2..02d032d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Crimean Turkish (Latin script) (‪Qırımtatarca (Latin)‬)
+/** Crimean Turkish (Latin script) (‪qırımtatarca (Latin)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -142,7 +142,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Közetüv cedvelimde qaydlı qullanıcılar tarafından yapılğan deñişmelerni kösterme',
 'tog-watchlisthideanons' => 'Közetüv cedvelimde qaydsız (anonim) qullanıcılar tarafından yapılğan deñişmelerni kösterme',
 'tog-watchlisthidepatrolled' => 'Közetüv cedvelinde teşkerilgen deñişmelerni gizle',
-'tog-nolangconversion' => 'Yazuv sisteması variantları deñiştirüvni işletme',
 'tog-ccmeonemails' => 'Diger qullanıcılarğa yollağan mektüplerimniñ kopiyalarını maña da yolla',
 'tog-diffonly' => 'Teñeştirme saifelerinde saifeniñ esas mündericesini kösterme',
 'tog-showhiddencats' => 'Gizli kategoriyalarnı köster',
@@ -709,10 +708,10 @@ Siziñ deñişmeleriñiz astında kösterildi. Şimdi yapqan deñişmeleriñizni
 'editingold' => "'''DİQQAT: Saifeniñ eski bir versiyasını deñiştireyatasız.
 Saifeni saqlağanıñızdan soñ bu tarihlı versiyadan künümizge qadar olğan deñişmeler yoq olacaq.'''",
 'yourdiff' => 'Farqlar',
-'copyrightwarning' => "'''Lütfen, diqqat:''' {{SITENAME}} saytına qoşulğan bütün isseler <i>$2</i> muqavelesi dairesindedir (tafsilât içün $1 saifesine baqıñız).
+'copyrightwarning' => "'''Lütfen, diqqat:''' {{SITENAME}} saytına qoşulğan bütün isseler $2 muqavelesi dairesindedir (tafsilât içün $1 saifesine baqıñız).
 Qoşqan isseñizniñ başqa insanlar tarafından acımasızca deñiştirilmesini ya da azat tarzda ve sıñırsızca başqa yerlerge dağıtılmasını istemeseñiz, isse qoşmañız.<br />
 Ayrıca, mında isse qoşıp, bu isseniñ özüñiz tarafından yazılğanına, ya da cemaatqa açıq bir menbadan ya da başqa bir azat menbadan kopiyalanğanına garantiya bergen olasıñız.<br />
-'''<center>MÜELLİFLİK AQQINEN QORÇALANĞAN İÇ BİR METİNNİ MINDA RUHSETSİZ QOŞMAÑIZ!</center>'''",
+'''MÜELLİFLİK AQQINEN QORÇALANĞAN İÇ BİR METİNNİ MINDA RUHSETSİZ QOŞMAÑIZ!'''",
 'copyrightwarning2' => "'''Lütfen, diqqat:''' {{SITENAME}} saytına siz qoşqan bütün isseler başqa bir qullanıcı tarafından deñiştirilip ya da yoq etilip olur. Qoşqan isseñizniñ başqa insanlar tarafından acımasızca deñiştirilmesini ya da azat tarzda ve sıñırsızca başqa yerlerge dağıtılmasını istemeseñiz, isse qoşmañız.<br />
 Ayrıca, mında isse qoşıp, bu isseniñ özüñiz tarafından yazılğanına, ya da cemaatqa açıq bir menbadan ya da başqa bir azat menbadan kopiyalanğanına garantiya bergen olasıñız ($1 baqıñız).<br />
 '''MÜELLİFLİK AQQINEN QORÇALANĞAN İÇ BİR METİNNİ MINDA RUHSETSİZ QOŞMAÑIZ!'''",
@@ -1092,9 +1091,9 @@ Eger bildirseñiz, saifelerdeki deñişmelerni kimniñ yapqanını köstermek i
 Evelce yüklengen resim tapmaq ya da baqmaq içün [[Special:FileList|yüklengen fayllar cedveline]] keçiñiz, bundan ğayrı fayl yüklenüv ve yoq etilüv qaydlarını [[Special:Log/upload|yüklenüv jurnalında]] ve [[Special:Log/delete|yoq etilüv jurnalında]] tapıp olasıñız.
 
 Saifede resim qullanmaq içün böyle şekilli bağlantılar qullanıñız:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' faylnıñ tam versiyasını qullanmaq içün,
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|tarif]]</nowiki></tt>''' bir tarif ile 200 piksel bir resim qullanmaq içün,
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' faylğa vastasız bağlantı içün.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' faylnıñ tam versiyasını qullanmaq içün,
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|tarif]]</nowiki></code>''' bir tarif ile 200 piksel bir resim qullanmaq içün,
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' faylğa vastasız bağlantı içün.",
 'upload-permitted' => 'İzinli fayl çeşitleri: $1.',
 'upload-preferred' => 'İstenilgen fayl çeşitleri: $1.',
 'upload-prohibited' => 'Yasaqlı fayl çeşitleri: $1.',
@@ -1125,21 +1124,21 @@ Daa körgezmeli körüniş içün [[Special:NewFiles|yañı fayllar galereyasın
 'largefileserver' => 'Bu faylnıñ uzunlığı serverde izin berilgenden büyükçedir.',
 'emptyfile' => 'İhtimal ki, yüklengen fayl boş. İhtimallı sebep - fayl adlandıruv
 hatasıdır. Lütfen, tamam bu faylnı yüklemege isteycek ekeniñizni teşkeriñiz.',
-'fileexists' => "Bu isimde bir fayl endi bar.
-Lütfen, eger siz deñiştirmekten emin olmasañız başta '''<tt>[[:$1]]</tt>''' faylına köz taşlañız.
-[[$1|thumb]]",
-'filepageexists' => "Bu fayl içün tasvir saifesi endi yapılğan ('''<tt>[[:$1]]</tt>'''), lâkin bu adda bir fayl yoqtır.
+'fileexists' => 'Bu isimde bir fayl endi bar.
+Lütfen, eger siz deñiştirmekten emin olmasañız başta <strong>[[:$1]]</strong> faylına köz taşlañız.
+[[$1|thumb]]',
+'filepageexists' => 'Bu fayl içün tasvir saifesi endi yapılğan (<strong>[[:$1]]</strong>), lâkin bu adda bir fayl yoqtır.
 Yazılğan tasviriñiz fayl saifesinde kösterilmeycek.
 Tasviriñiz anda kösterilecegi içün, bunı qolnen deñiştirmek kereksiñiz.
-[[$1|thumb]]",
-'fileexists-extension' => "Buña oşağan adda bir fayl bar: [[$2|thumb]]
-* Yüklengen faylnıñ adı: '''<tt>[[:$1]]</tt>'''
-* Mevcut olğan faylnıñ adı: '''<tt>[[:$2]]</tt>'''
-Lütfen, başqa bir ad saylap yazıñız.",
-'fileexists-thumbnail-yes' => "Belki de bu fayl bir ufaqlaştırılğan kopiyadır (thumbnail). [[$1|thumb]]
-Lütfen, '''<tt>[[:$1]]</tt>''' faylını teşkeriñiz.
-Eger şu fayl aynı şu resim olsa, onıñ ufaqlaştırılğan kopiyasını ayrı olaraq yüklemek aceti yoqtır.",
-'file-thumbnail-no' => "Faylnıñ adı '''<tt>$1</tt>'''nen başlana. Belki de bu resimniñ ufaqlaştırılğan bir kopiyasıdır ''(thumbnail)''.
+[[$1|thumb]]',
+'fileexists-extension' => 'Buña oşağan adda bir fayl bar: [[$2|thumb]]
+* Yüklengen faylnıñ adı: <strong>[[:$1]]</strong>
+* Mevcut olğan faylnıñ adı: <strong>[[:$2]]</strong>
+Lütfen, başqa bir ad saylap yazıñız.',
+'fileexists-thumbnail-yes' => 'Belki de bu fayl bir ufaqlaştırılğan kopiyadır (thumbnail). [[$1|thumb]]
+Lütfen, <strong>[[:$1]]</strong> faylını teşkeriñiz.
+Eger şu fayl aynı şu resim olsa, onıñ ufaqlaştırılğan kopiyasını ayrı olaraq yüklemek aceti yoqtır.',
+'file-thumbnail-no' => "Faylnıñ adı <strong>$1</strong>nen başlana. Belki de bu resimniñ ufaqlaştırılğan bir kopiyasıdır ''(thumbnail)''.
 Eger sizde bu resim tam büyükliginde bar olsa, lütfen, onı yükleñiñiz ya da faylnıñ adını deñiştiriñiz.",
 'fileexists-forbidden' => 'Bu isimde bir fayl endi bar, ve üzerine yazılamay.
 Faylıñıznı yañıdan yüklemege isteseñiz, lütfen, keri qaytıp yañı bir isim qullanıñız.
index 8b972f7..2276e87 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Chmee2
  * @author Danny B.
  * @author Dontlietome7
  * @author Helix84
@@ -28,6 +29,7 @@
  * @author Tchoř
  * @author Urhixidur
  * @author Utar
+ * @author Vks
  * @author לערי ריינהארט
  */
 
@@ -137,121 +139,121 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#PŘESMĚRUJ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__BEZOBSAHU__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__BEZGALERIE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__VŽDYOBSAH__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__OBSAH__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BEZEDITOVATČÁST__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'AKTUÁLNÍMĚSÍC', 'AKTUÁLNÍMĚSÍC2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'AKTUÁLNÍMĚSÍC1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'AKTUÁLNÍMĚSÍCJMÉNO', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'AKTUÁLNÍMĚSÍCGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'AKTUÁLNÍMĚSÍCZKR', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'AKTUÁLNÍDEN', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'AKTUÁLNÍDEN2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'AKTUÁLNÍDENJMÉNO', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'AKTUÁLNÍROK', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'AKTUÁLNÍČAS', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'AKTUÁLNÍHODINA', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MÍSTNÍMĚSÍC', 'MÍSTNÍMĚSÍC2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'MÍSTNÍMĚSÍC1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'MÍSTNÍMĚSÍCJMÉNO', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'MÍSTNÍMĚSÍCGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'MÍSTNÍMĚSÍCZKR', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'MÍSTNÍDEN', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'MÍSTNÍDEN2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'MÍSTNÍDENJMÉNO', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'MÍSTNÍROK', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'MÍSTNÍČAS', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'MÍSTNÍHODINA', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'POČETSTRAN', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'POČETČLÁNKŮ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'POČETSOUBORŮ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'POČETUŽIVATELŮ', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'POČETAKTIVNÍCHUŽIVATELŮ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'POČETEDITACÍ', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'NÁZEVSTRANY', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NÁZEVSTRANYE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'JMENNÝPROSTOR', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'JMENNÝPROSTORE', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'DISKUSNÍPROSTOR', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'DISKUSNÍPROSTORE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ČLÁNEKPROSTOR', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ČLÁNEKPROSTORE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'PLNÝNÁZEVSTRANY', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'PLNÝNÁZEVSTRANYE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NÁZEVPODSTRANY', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NÁZEVPODSTRANYE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NÁZEVNADSTRANY', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NÁZEVNADSTRANYE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NÁZEVDISKUSE', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NÁZEVDISKUSEE', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NÁZEVČLÁNKU', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NÁZEVČLÁNKUE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'subst'                   => array( '0', 'VLOŽIT:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'VLOŽITNW:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'náhled', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'náhled=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'vpravo', 'right' ),
-       'img_left'                => array( '1', 'vlevo', 'left' ),
-       'img_none'                => array( '1', 'žádné', 'none' ),
-       'img_width'               => array( '1', '$1pixelů', '$1px' ),
-       'img_center'              => array( '1', 'střed', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'rám', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'bezrámu', 'frameless' ),
-       'img_page'                => array( '1', 'strana=$1', 'strana $1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'okraj', 'border' ),
-       'sitename'                => array( '1', 'NÁZEVWEBU', 'SITENAME' ),
-       'ns'                      => array( '0', 'JMENNÝPROSTOR:', 'NS:' ),
-       'localurl'                => array( '0', 'MÍSTNÍURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'MÍSTNÍURLE:', 'LOCALURLE:' ),
-       'servername'              => array( '0', 'NÁZEVSERVERU', 'SERVERNAME' ),
-       'grammar'                 => array( '0', 'SKLOŇUJ:', 'GRAMMAR:' ),
-       'notitleconvert'          => array( '0', '__BEZKONVERZENADPISU__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__BEZKONVERZEOBSAHU__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'AKTUÁLNÍTÝDEN', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'AKTUÁLNÍDENTÝDNE', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'MÍSTNÍTÝDEN', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'MÍSTNÍDENTÝDNE', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDREVIZE', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'DENREVIZE', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'DENREVIZE2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MĚSÍCREVIZE', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ROKREVIZE', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'KÓDČASUREVIZE', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'PLURÁL:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'PLNÉURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'PLNÉURLE:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'PRVNÍMALÉ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'PRVNÍVELKÉ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MALÁ:', 'LC:' ),
-       'uc'                      => array( '0', 'VELKÁ:', 'UC:' ),
-       'displaytitle'            => array( '1', 'ZOBRAZOVANÝNADPIS', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__LINKPŘIDATKOMENTÁŘ__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'VERZESOFTWARE', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ENKÓDOVATURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ENKÓDOVATNADPIS', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'AKTUÁLNÍKÓDČASU', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'MÍSTNÍKÓDČASU', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#JAZYK:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'JAZYKOBSAHU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'STRÁNEKVEJMENNÉMPROSTORU:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'POČETSPRÁVCŮ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMÁTUJČÍSLO', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ZAROVNATVLEVO', 'PADLEFT' ),
-       'padright'                => array( '0', 'ZAROVNATVPRAVO', 'PADRIGHT' ),
-       'special'                 => array( '0', 'speciální', 'special' ),
-       'defaultsort'             => array( '1', 'KLÍČŘAZENÍ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'CESTAKSOUBORU', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'značka', 'tag' ),
-       'hiddencat'               => array( '1', '__SKRÝTKAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'STRÁNEKVKATEGORII', 'STRÁNEKVKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'VELIKOSTSTRÁNKY', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEXOVAT__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__NEINDEXOVAT__', '__NOINDEX__' ),
-       'staticredirect'          => array( '1', '__STATICKÉPŘESMĚROVÁNÍ__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'ÚROVEŇZAMČENÍ', 'PROTECTIONLEVEL' ),
+       'redirect'                  => array( '0', '#PŘESMĚRUJ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__BEZOBSAHU__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__BEZGALERIE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__VŽDYOBSAH__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__OBSAH__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BEZEDITOVATČÁST__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'AKTUÁLNÍMĚSÍC', 'AKTUÁLNÍMĚSÍC2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'AKTUÁLNÍMĚSÍC1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'AKTUÁLNÍMĚSÍCJMÉNO', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'AKTUÁLNÍMĚSÍCGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'AKTUÁLNÍMĚSÍCZKR', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'AKTUÁLNÍDEN', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'AKTUÁLNÍDEN2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'AKTUÁLNÍDENJMÉNO', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'AKTUÁLNÍROK', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'AKTUÁLNÍČAS', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'AKTUÁLNÍHODINA', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MÍSTNÍMĚSÍC', 'MÍSTNÍMĚSÍC2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'MÍSTNÍMĚSÍC1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'MÍSTNÍMĚSÍCJMÉNO', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'MÍSTNÍMĚSÍCGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'MÍSTNÍMĚSÍCZKR', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'MÍSTNÍDEN', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'MÍSTNÍDEN2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'MÍSTNÍDENJMÉNO', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'MÍSTNÍROK', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'MÍSTNÍČAS', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'MÍSTNÍHODINA', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'POČETSTRAN', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'POČETČLÁNKŮ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'POČETSOUBORŮ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'POČETUŽIVATELŮ', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'POČETAKTIVNÍCHUŽIVATELŮ', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'POČETEDITACÍ', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'NÁZEVSTRANY', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NÁZEVSTRANYE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'JMENNÝPROSTOR', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'JMENNÝPROSTORE', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'DISKUSNÍPROSTOR', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'DISKUSNÍPROSTORE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ČLÁNEKPROSTOR', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ČLÁNEKPROSTORE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'PLNÝNÁZEVSTRANY', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'PLNÝNÁZEVSTRANYE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NÁZEVPODSTRANY', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NÁZEVPODSTRANYE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NÁZEVNADSTRANY', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NÁZEVNADSTRANYE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NÁZEVDISKUSE', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NÁZEVDISKUSEE', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NÁZEVČLÁNKU', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NÁZEVČLÁNKUE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'subst'                     => array( '0', 'VLOŽIT:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'VLOŽITNW:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'náhled', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'náhled=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'vpravo', 'right' ),
+       'img_left'                  => array( '1', 'vlevo', 'left' ),
+       'img_none'                  => array( '1', 'žádné', 'none' ),
+       'img_width'                 => array( '1', '$1pixelů', '$1px' ),
+       'img_center'                => array( '1', 'střed', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'rám', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'bezrámu', 'frameless' ),
+       'img_page'                  => array( '1', 'strana=$1', 'strana $1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'okraj', 'border' ),
+       'sitename'                  => array( '1', 'NÁZEVWEBU', 'SITENAME' ),
+       'ns'                        => array( '0', 'JMENNÝPROSTOR:', 'NS:' ),
+       'localurl'                  => array( '0', 'MÍSTNÍURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'MÍSTNÍURLE:', 'LOCALURLE:' ),
+       'servername'                => array( '0', 'NÁZEVSERVERU', 'SERVERNAME' ),
+       'grammar'                   => array( '0', 'SKLOŇUJ:', 'GRAMMAR:' ),
+       'notitleconvert'            => array( '0', '__BEZKONVERZENADPISU__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__BEZKONVERZEOBSAHU__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'AKTUÁLNÍTÝDEN', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'AKTUÁLNÍDENTÝDNE', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'MÍSTNÍTÝDEN', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'MÍSTNÍDENTÝDNE', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDREVIZE', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'DENREVIZE', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'DENREVIZE2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MĚSÍCREVIZE', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ROKREVIZE', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'KÓDČASUREVIZE', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'PLURÁL:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'PLNÉURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'PLNÉURLE:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'PRVNÍMALÉ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'PRVNÍVELKÉ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MALÁ:', 'LC:' ),
+       'uc'                        => array( '0', 'VELKÁ:', 'UC:' ),
+       'displaytitle'              => array( '1', 'ZOBRAZOVANÝNADPIS', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__LINKPŘIDATKOMENTÁŘ__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VERZESOFTWARE', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ENKÓDOVATURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ENKÓDOVATNADPIS', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'AKTUÁLNÍKÓDČASU', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'MÍSTNÍKÓDČASU', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#JAZYK:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'JAZYKOBSAHU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'STRÁNEKVEJMENNÉMPROSTORU:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'POČETSPRÁVCŮ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMÁTUJČÍSLO', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ZAROVNATVLEVO', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ZAROVNATVPRAVO', 'PADRIGHT' ),
+       'special'                   => array( '0', 'speciální', 'special' ),
+       'defaultsort'               => array( '1', 'KLÍČŘAZENÍ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'CESTAKSOUBORU', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'značka', 'tag' ),
+       'hiddencat'                 => array( '1', '__SKRÝTKAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'STRÁNEKVKATEGORII', 'STRÁNEKVKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'VELIKOSTSTRÁNKY', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEXOVAT__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NEINDEXOVAT__', '__NOINDEX__' ),
+       'staticredirect'            => array( '1', '__STATICKÉPŘESMĚROVÁNÍ__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'ÚROVEŇZAMČENÍ', 'PROTECTIONLEVEL' ),
 );
 
 /**
@@ -265,15 +267,16 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktivní_uživatelé', 'Aktivni_uzivatele' ),
-       'Allmessages'               => array( 'Všechny_zprávy' ),
+       'Allmessages'               => array( 'Všechna_hlášení', 'Všechny_zprávy', 'Vsechna_hlaseni', 'Vsechny_zpravy' ),
        'Allpages'                  => array( 'Všechny_stránky', 'Vsechny_stranky' ),
        'Ancientpages'              => array( 'Nejstarší_stránky', 'Staré_stránky', 'Stare_stranky' ),
        'Blankpage'                 => array( 'Prázdná_stránka' ),
-       'Block'                     => array( 'Blokovat_uživatele', 'Blokovat_IP', 'Blokovat_uzivatele' ),
+       'Block'                     => array( 'Blokování', 'Blokovani', 'Blokovat_uživatele', 'Blokovat_IP', 'Blokovat_uzivatele' ),
        'Blockme'                   => array( 'Zablokuj_mě', 'Zablokuj_me' ),
        'Booksources'               => array( 'Zdroje_knih' ),
        'BrokenRedirects'           => array( 'Přerušená_přesměrování', 'Prerusena_presmerovani' ),
        'Categories'                => array( 'Kategorie' ),
+       'ChangeEmail'               => array( 'Změna_emailu', 'Zmena_emailu' ),
        'ChangePassword'            => array( 'Změna_hesla', 'Zmena_hesla', 'Resetovat_heslo' ),
        'Confirmemail'              => array( 'Potvrdit_e-mail' ),
        'Contributions'             => array( 'Příspěvky', 'Prispevky' ),
@@ -312,7 +315,7 @@ $specialPageAliases = array(
        'Movepage'                  => array( 'Přesunout_stránku' ),
        'Mycontributions'           => array( 'Mé_příspěvky', 'Me_prispevky' ),
        'Mypage'                    => array( 'Moje_stránka', 'Moje_stranka' ),
-       'Mytalk'                    => array( 'Moje_diskuse', 'Moje_diskuze' ),
+       'Mytalk'                    => array( 'Moje_diskuse' ),
        'Newimages'                 => array( 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ),
        'Newpages'                  => array( 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ),
        'Popularpages'              => array( 'Nejnavštěvovanější_stránky', 'Nejnavstevovanejsi_stranky' ),
@@ -329,6 +332,7 @@ $specialPageAliases = array(
        'Specialpages'              => array( 'Speciální_stránky', 'Specialni_stranky' ),
        'Statistics'                => array( 'Statistika', 'Statistiky' ),
        'Tags'                      => array( 'Značky', 'Znacky' ),
+       'Unblock'                   => array( 'Odblokování', 'Odblokovani' ),
        'Uncategorizedcategories'   => array( 'Nekategorizované_kategorie', 'Nekategorizovane_kategorie' ),
        'Uncategorizedimages'       => array( 'Nekategorizované_soubory', 'Nekategorizovane_soubory' ),
        'Uncategorizedpages'        => array( 'Nekategorizované_stránky', 'Nekategorizovane_stranky' ),
@@ -361,7 +365,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Skrýt patrolované editace v posledních změnách',
 'tog-newpageshidepatrolled' => 'Skrýt patrolované stránky ze seznamu nových stránek',
 'tog-extendwatchlist' => 'Na seznamu sledovaných stránek zobrazovat všechny změny, ne jen tu poslední',
-'tog-usenewrc' => 'Používat zdokonalené poslední změny (vyžaduje JavaScript)',
+'tog-usenewrc' => 'V posledních změnách a sledovaných stránkách seskupovat změny podle stránek (vyžaduje JavaScript)',
 'tog-numberheadings' => 'Automaticky číslovat nadpisy',
 'tog-showtoolbar' => 'Zobrazit panel nástrojů (vyžaduje JavaScript)',
 'tog-editondblclick' => 'Editovat dvojklikem (JavaScript)',
@@ -369,17 +373,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Zapnout možnost editace části stránky pomocí kliknutí pravým tlačítkem na nadpisy stránky (JavaScript)',
 'tog-showtoc' => 'Zobrazovat obsah (na stránkách s více než třemi nadpisy)',
 'tog-rememberpassword' => 'Zapamatovat si mé přihlášení v tomto prohlížeči (maximálně $1 {{PLURAL:$1|den|dny|dní}})',
-'tog-watchcreations' => 'Přidávat mnou založené stránky ke sledovaným',
-'tog-watchdefault' => 'Přidávat mnou editované stránky ke sledovaným',
-'tog-watchmoves' => 'Přidávat mnou přesouvané stránky mezi sledované',
-'tog-watchdeletion' => 'Přidávat stránky, které smažu, mezi sledované',
+'tog-watchcreations' => 'Přidávat mnou založené stránky a načtené soubory ke sledovaným',
+'tog-watchdefault' => 'Přidávat mnou editované stránky a soubory ke sledovaným',
+'tog-watchmoves' => 'Přidávat mnou přesouvané stránky a soubory mezi sledované',
+'tog-watchdeletion' => 'Přidávat stránky a soubory, které smažu, mezi sledované',
 'tog-minordefault' => 'Označit editaci implicitně jako malá editace',
 'tog-previewontop' => 'Zobrazovat náhled před editačním oknem (ne za ním)',
 'tog-previewonfirst' => 'Zobrazit při první editaci náhled',
 'tog-nocache' => 'Vypnout cachování v prohlížeči',
-'tog-enotifwatchlistpages' => 'Poslat e-mail při změně sledované stránky',
+'tog-enotifwatchlistpages' => 'Poslat e-mail při změně sledované stránky nebo souboru',
 'tog-enotifusertalkpages' => 'Poslat e-mail při změně mé diskusní stránky',
-'tog-enotifminoredits' => 'Poslat e-mail i pro menší editace (které jinak nezpůsobují odeslání e-mailu)',
+'tog-enotifminoredits' => 'Posílat e-maily i při malých editacích stránek a souborů',
 'tog-enotifrevealaddr' => 'Prozradit mou e-mailovou adresu v upozorňujících e-mailech',
 'tog-shownumberswatching' => 'Zobrazovat počet sledujících uživatelů',
 'tog-oldsig' => 'Stávající podpis:',
@@ -395,7 +399,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Na seznamu sledovaných stránek skrýt editace přihlášených uživatelů',
 'tog-watchlisthideanons' => 'Na seznamu sledovaných stránek skrýt editace nepřihlášených uživatelů',
 'tog-watchlisthidepatrolled' => 'Skrýt patrolované editace ve sledovaných stránkách',
-'tog-nolangconversion' => 'Vypnout konverzi variant',
 'tog-ccmeonemails' => 'Zasílat mi kopie e-mailů, které pošlu jiným uživatelům',
 'tog-diffonly' => 'Nezobrazovat obsah stránky pod rozdílem verzí',
 'tog-showhiddencats' => 'Zobrazit skryté kategorie',
@@ -620,6 +623,10 @@ $1',
 'youhavenewmessages' => 'Máte $1 ($2).',
 'newmessageslink' => 'nové zprávy',
 'newmessagesdifflink' => 'rozdíl oproti předchozí verzi',
+'youhavenewmessagesfromusers' => 'Máte $1 od {{PLURAL:$3|jiného uživatele|$3 jiných uživatelů}} ($2).',
+'youhavenewmessagesmanyusers' => 'Máte $1 od mnoha dalších uživatelů ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|novou zprávu|nové zprávy}}',
+'newmessagesdifflinkplural' => 'poslední {{PLURAL:$1|změna|změny}}',
 'youhavenewmessagesmulti' => 'Na $1 máte nové zprávy',
 'editsection' => 'editovat',
 'editold' => 'editovat',
@@ -674,9 +681,9 @@ Zkuste se podívat na [[Special:SpecialPages|seznam všech existujících speci
 'dberrortext' => 'Při dotazu do databáze došlo k syntaktické chybě.
 Příčinou může být chyba v programu.
 Poslední dotaz byl:
-<blockquote><tt>$1</tt></blockquote>
-z funkce „<tt>$2</tt>“.
-Databáze vrátila chybu „<tt>$3: $4</tt>“.',
+<blockquote><code>$1</code></blockquote>
+z funkce „<code>$2</code>“.
+Databáze vrátila chybu „<samp>$3: $4</samp>“.',
 'dberrortextcl' => 'Při dotazu do databáze došlo k syntaktické chybě.
 Poslední dotaz byl:
 „$1“
@@ -712,6 +719,7 @@ Pokud toto není váš případ, možná jste nalezli chybu v software. Prosíme
 'cannotdelete' => 'Nebylo možné smazat stránku nebo soubor „$1“.
 Možná už byl(a) smazán(a) někým jiným.',
 'cannotdelete-title' => 'Stránku „$1“ nelze smazat',
+'delete-hook-aborted' => 'Smazání bylo bez bližšího vysvětlení zrušeno přípojným bodem.',
 'badtitle' => 'Neplatný název',
 'badtitletext' => 'Požadovaný název stránky byl neplatný, prázdný nebo obsahoval nesprávnou předponu mezijazykového či interwiki odkazu. Možná obsahoval znaky, které v názvu nejsou dovoleny.',
 'perfcached' => 'Následující data jsou z cache a nemusí být plně aktuální. Cache může obsahovat maximálně {{PLURAL:$1|jeden výsledek|$1 výsledky|$1 výsledků}}.',
@@ -742,6 +750,8 @@ $2',
 Správce serveru, který úložiště zamkl, poskytl toto zdůvodnění: „''$3''“.",
 'invalidtitle-knownnamespace' => 'Neplatný název se jmenným prostorem „$2“ a textem „$3“',
 'invalidtitle-unknownnamespace' => 'Neplatný název s neznámým číslem jmenného prostoru $1 a textem „$2“',
+'exception-nologin' => 'Nejste přihlášen(a)',
+'exception-nologin-text' => 'Tato stránka nebo akce vyžaduje, abyste byli na této wiki přihlášeni.',
 
 # Virus scanner
 'virus-badscanner' => "Špatná konfigurace: neznámý antivirový program: ''$1''",
@@ -762,6 +772,7 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
 'remembermypassword' => 'Zapamatovat si mé přihlášení na tomto počítači (maximálně $1 {{PLURAL:$1|den|dny|dní}})',
 '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.',
 'externaldberror' => 'Buď nastala chyba externí autentizační databáze, nebo nemáte dovoleno měnit svůj externí účet.',
 'login' => 'Přihlaste se',
 'nav-login-createaccount' => 'Přihlášení / vytvoření účtu',
@@ -1001,6 +1012,10 @@ Pokud jste zde omylem, stiskněte ve svém prohlížeči tlačítko ''Zpět''.",
 Můžete [[Special:Search/{{PAGENAME}}|zkusit tento název vyhledat]] na jiných stránkách, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} prohlédnout si příslušné protokolovací záznamy] nebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} tuto stránku založit]</span>.',
 'noarticletext-nopermission' => 'Tato stránka zatím neobsahuje žádný text.
 Můžete [[Special:Search/{{PAGENAME}}|zkusit tento název vyhledat]] na jiných stránkách nebo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} si prohlédnout příslušné protokolovací záznamy]</span>.',
+'missing-revision' => 'Revize #$1 stránky s názvem „{{PAGENAME}}“ neexistuje.
+
+Toto je obvykle způsobeno tím, že jste následovali zastaralý odkaz historickou verzi stránky, jež byla smazána.
+Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].',
 'userpage-userdoesnotexist' => 'Uživatelský účet „<nowiki>$1</nowiki>“ není zaregistrován. Zkontrolujte zda skutečně chcete vytvořit či editovat tuto stránku.',
 'userpage-userdoesnotexist-view' => 'Uživatelský účet „$1“ není zaregistrován.',
 'blocked-notice-logextract' => 'Tento uživatel je momentálně zablokován.
@@ -1009,7 +1024,6 @@ Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
 * '''Firefox / Safari:''' Při kliknutí na ''Aktualizovat'' držte ''Shift'' nebo stiskněte ''Ctrl-F5'' nebo ''Ctrl-R'' (na Macu ''⌘-R'').
 * '''Google Chrome:''' Stiskněte ''Ctrl-Shift-R'' (na Macu ''⌘-Shift-R'').
 * '''Internet Explorer:''' Při kliknutí na ''Aktualizovat'' držte ''Ctrl'' nebo stiskněte ''Ctrl-F5''.
-* '''Konqueror:''' Klikněte na ''Aktualizovat'' nebo stiskněte ''F5''.
 * '''Opera:''' Smažte obsah cache v menu ''Nástroje → Nastavení''.",
 'usercssyoucanpreview' => "'''Tip:''' Použijte tlačítko „{{int:showpreview}}“ k testování vašeho nového CSS před uložením.",
 'userjsyoucanpreview' => "'''Tip:''' Použijte tlačítko „{{int:showpreview}}“ k testování vašeho nového JavaScriptu před uložením.",
@@ -1095,7 +1109,7 @@ Níže vidíte soupis přesunů a smazání této stránky:",
 'moveddeleted-notice' => 'Tato stránka byla smazána.
 Podrobnosti si můžete prohlédnout v níže zobrazeném seznamu provedených přesunů a smazání této stránky.',
 'log-fulllog' => 'Zobrazit všechny záznamy',
-'edit-hook-aborted' => 'Editace byla zrušena přípojným bodem bez bližšího vysvětlení.',
+'edit-hook-aborted' => 'Editace byla bez bližšího vysvětlení zrušena přípojným bodem.',
 'edit-gone-missing' => 'Stránku se nepodařilo aktualizovat.
 Zřejmě byla smazána.',
 'edit-conflict' => 'Editační konflikt.',
@@ -1107,7 +1121,7 @@ Zřejmě byla smazána.',
 'expensive-parserfunction-warning' => 'Varování: Tato stránka obsahuje příliš mnoho volání výkonnostně náročných funkcí parseru.
 
 Povolený limit je $2, v současné chvíli však {{PLURAL:$1|zde jedno volání je|zde jsou $2 volání|zde je $2 volání}}.',
-'expensive-parserfunction-category' => 'Stránky s příliš vysokým počtem volání funkcí parseru.',
+'expensive-parserfunction-category' => 'Stránky s příliš mnoho voláními náročných funkcí parseru',
 'post-expand-template-inclusion-warning' => 'Varování: Objem vkládaných šablon je příliš velký.
 Některé šablony nebudou vloženy.',
 'post-expand-template-inclusion-category' => 'Stránky překračující povolenou velikost vložených šablon',
@@ -1123,6 +1137,7 @@ Tyto argumenty byly vynechány.',
 'expansion-depth-exceeded-warning' => 'Stránka překročila hloubku expanze',
 'parser-unstrip-loop-warning' => 'Detekováno zacyklení unstrip',
 'parser-unstrip-recursion-limit' => 'Překročen limit rekurze unstrip ($1)',
+'converter-manual-rule-error' => 'Detekována chyba v pravidlech manuální jazykové konverze',
 
 # "Undo" feature
 'undo-success' => 'Editace může být zrušena. Zkontrolujte a pak potvrďte změny zobrazené níže.',
@@ -1309,6 +1324,10 @@ Ujistěte se, že tato změna udrží souvislost a posloupnost verzí v historii
 'editundo' => 'zrušit editaci',
 'diff-multi' => '({{PLURAL:$1|Není zobrazena 1 mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od {{PLURAL:$2|1 uživatele|$2 uživatelů}}.)',
 'diff-multi-manyusers' => '(Není zobrazeno $1 mezilehlých verzí od více než $2 {{PLURAL:$2|uživatele|uživatelů}}.)',
+'difference-missing-revision' => '{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.
+
+Toto je obvykle způsobeno tím, že jste následovali zastaralý odkaz historickou verzi stránky, jež byla smazána.
+Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].',
 
 # Search results
 'searchresults' => 'Výsledky hledání',
@@ -1328,7 +1347,7 @@ Ujistěte se, že tato změna udrží souvislost a posloupnost verzí v historii
 'shown-title' => 'Zobrazit $1 {{PLURAL:$1|výsledek|výsledky|výsledků}} na stránku',
 'viewprevnext' => 'Ukázat ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Možnosti hledání',
-'searchmenu-exists' => "*Stránka '''[[$1]]'''",
+'searchmenu-exists' => "'''Na této wiki existuje stránka nazvaná „[[:$1]]“.'''",
 'searchmenu-new' => "'''Vytvořte na této wiki stránku „[[:$1]]“!'''",
 'searchhelp-url' => 'Help:Obsah',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zobrazit stránky, jejichž název začíná „$1“]]',
@@ -1574,6 +1593,7 @@ Tuto operaci nelze vrátit zpět.',
 'right-writeapi' => 'Používání zapisovacího API',
 'right-delete' => 'Mazání stránek',
 'right-bigdelete' => 'Mazání stránek s dlouhou historií',
+'right-deletelogentry' => 'Mazání a obnovování jednotlivých protokolovacích záznamů',
 'right-deleterevision' => 'Mazání a obnovování konkrétních revizí stránky',
 'right-deletedhistory' => 'Zobrazování smazaných položek v historii bez odpovídajícího textu',
 'right-deletedtext' => 'Prohlížení smazaného textu a rozdílů mezi smazanými verzemi',
@@ -1761,19 +1781,19 @@ Pro vložení obrázku do stránky použijte jeden z následujících způsobů
 'largefileserver' => 'Velikost tohoto souboru překračuje limit nastavený na serveru.',
 'emptyfile' => 'Soubor, který jste vložili, se zdá být prázdný. Mohl to způsobit překlep v názvu souboru. Prosím zkontrolujte, zda jste opravdu chtěli vložit tento soubor.',
 'windows-nonascii-filename' => 'Tato wiki nepodporuje názvy souborů obsahující zvláštní znaky.',
-'fileexists' => "Soubor s tímto jménem již existuje, prosím podívejte se na '''<tt>[[:$1]]</tt>''', pokud nevíte jistě, zda chcete tento soubor nahradit.
-[[$1|thumb]]",
-'filepageexists' => "Popisná stránka pro soubor s tímto jménem již byla na '''<tt>[[:$1]]</tt>''' založena, avšak odpovídající soubor dosud neexistuje.
+'fileexists' => 'Soubor s tímto jménem již existuje, prosím podívejte se na <strong>[[:$1]]</strong>, pokud nevíte jistě, zda chcete tento soubor nahradit.
+[[$1|thumb]]',
+'filepageexists' => 'Popisná stránka pro soubor s tímto jménem již byla na <strong>[[:$1]]</strong> založena, avšak odpovídající soubor dosud neexistuje.
 Shrnutí, které zde uvedete, se na popisné stránce nezobrazí.
-Pokud tam chcete své shrnutí zobrazit, budete muset příslušnou stránku editovat ručně. [[$1|thumb]]",
-'fileexists-extension' => "Již existuje soubor s podobným jménem: [[$2|thumb]]
-* Jméno načítaného souboru: '''<tt>[[:$1]]</tt>'''
-* Jméno existujícího souboru: '''<tt>[[:$2]]</tt>'''
-Vyberte jiné jméno.",
+Pokud tam chcete své shrnutí zobrazit, budete muset příslušnou stránku editovat ručně. [[$1|thumb]]',
+'fileexists-extension' => 'Již existuje soubor s podobným jménem: [[$2|thumb]]
+* Jméno načítaného souboru: <strong>[[:$1]]</strong>
+* Jméno existujícího souboru: <strong>[[:$2]]</strong>
+Vyberte jiné jméno.',
 'fileexists-thumbnail-yes' => "Tento soubor je zřejmě obrázek ve zmenšené velikosti ''(náhled)''. [[$1|thumb]]
-Zkontrolujte soubor '''<tt>[[:$1]]</tt>'''.
+Zkontrolujte soubor <strong>[[:$1]]</strong>.
 Pokud je zmiňovaný soubor větší, ale jinak stejný, není potřeba zvlášť načítat jeho zmenšenou verzi.",
-'file-thumbnail-no' => "Jméno souboru začíná na '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Jméno souboru začíná na <strong>$1</strong>.
 Možná to je obrázek ve zmenšené velikosti ''(náhled)''.
 Načtěte soubor v plném rozlišením, pokud je k dispozici, nebo změňte jméno souboru.",
 'fileexists-forbidden' => 'Soubor s tímto názvem již existuje a není dovoleno ho přepsat.
@@ -1880,6 +1900,7 @@ Kontaktuje prosím [[Special:ListUsers/sysop|správce]].',
 'lockmanager-fail-releaselock' => 'Zámek pro „$1“ nelze uvolnit.',
 'lockmanager-fail-db-bucket' => 'Nelze navázat spojení s dostatečným počtem databází zámků v bloku $1.',
 'lockmanager-fail-db-release' => 'Uzamčení databáze $1 nelze uvolnit.',
+'lockmanager-fail-svr-acquire' => 'Nepodařilo se získat zámek serveru $1.',
 'lockmanager-fail-svr-release' => 'Uzamčení serveru $1 nelze uvolnit.',
 
 # ZipDirectoryReader
@@ -1997,6 +2018,7 @@ Možná spíše chcete upravit [$2 tamější stránku s popisem souboru].',
 'shared-repo-from' => 'z {{grammar:2sg|$1}}',
 'shared-repo' => 'sdíleného úložiště',
 'filepage.css' => '/* Zde uvedené CSS se vkládá na stránky s popisem souboru, včetně cizích klientských wiki */',
+'upload-disallowed-here' => 'Tento soubor bohužel nemůžete přepsat.',
 
 # File reversion
 'filerevert' => 'Vrátit zpět $1',
@@ -2077,7 +2099,9 @@ Vstup: <code>typ obsahu/podtyp</code>, např. <code>image/jpeg</code>.',
 
 'disambiguations' => 'Stránky odkazující na rozcestníky',
 'disambiguationspage' => 'Template:Rozcestník',
-'disambiguations-text' => 'Odkazy na následujících stránkách vedou na rozcestníky (stránky obsahující některou ze šablon uvedených na [[MediaWiki:Disambiguationspage|seznamu rozcestníkových šablon]]) místo na příslušný článek.',
+'disambiguations-text' => "Následující stránky obsahují nejméně jeden odkaz na '''rozcestník'''.
+Asi by místo toho měly odkazovat na konkrétnější stránku.<br />
+Stránka je považována za rozcestník, pokud používá některou ze šablon odkazovaných na [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dvojitá přesměrování',
 'doubleredirectstext' => 'Na této stránce je seznam přesměrování vedoucích na další přesměrování.
@@ -2102,6 +2126,7 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bajt|bajty|bajtů}}',
 '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}}',
 'nrevisions' => '$1 {{PLURAL:$1|revize|revize|revizí}}',
@@ -2130,6 +2155,7 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
 'mostlinkedtemplates' => 'Nejvkládanější šablony',
 'mostcategories' => 'Stránky s nejvyšším počtem kategorií',
 'mostimages' => 'Nejpoužívanější soubory',
+'mostinterwikis' => 'Stránky s nejvyšším počtem mezijazykových odkazů',
 'mostrevisions' => 'Stránky s nejvíce revizemi',
 'prefixindex' => 'Seznam stránek dle začátku názvu',
 'prefixindex-namespace' => 'Seznam stránek dle začátku názvu (jmenný prostor $1)',
@@ -2229,7 +2255,7 @@ Podívejte se také na [[Special:WantedCategories|žádané kategorie]].',
 'linksearch-ok' => 'Hledat',
 'linksearch-text' => 'Lze používat zástupné znaky, např. „*.wikipedia.org“.
 Povinná je přinejmenším doména nejvyššího řádu, např. „*.org“.<br />
-Podporované protokoly: <tt>$1</tt> (nepřidávejte je do hledání).',
+Podporované protokoly: <code>$1</code> (nepřidávejte je do hledání).',
 'linksearch-line' => '$2 odkazuje na $1',
 'linksearch-error' => 'Zástupné znaky lze použít jen na začátku doménového jména.',
 
@@ -2276,6 +2302,8 @@ Podporované protokoly: <tt>$1</tt> (nepřidávejte je do hledání).',
 'mailnologin' => 'Bez odesílací adresy',
 'mailnologintext' => 'Pokud chcete posílat e-maily jiným uživatelům, musíte se [[Special:UserLogin|přihlásit]] a mít platnou e-mailovou adresu ve svém [[Special:Preferences|nastavení]].',
 'emailuser' => 'Poslat e-mail',
+'emailuser-title-target' => 'Poslat e-mail {{GENDER:$1|tomuto uživateli|této uživatelce}}',
+'emailuser-title-notarget' => 'Poslat e-mail uživateli',
 'emailpage' => 'Poslat e-mail',
 'emailpagetext' => 'Pomocí níže zobrazeného formuláře můžete tomuto uživateli poslat zprávu e-mailem.
 E-mailová adresa, kterou máte uvedenu v [[Special:Preferences|nastavení]], se objeví jako adresa odesílatele pošty, aby vám adresát mohl odpovědět přímo.',
@@ -2415,6 +2443,8 @@ Rady a kontakt:
 'rollback' => 'Vrátit zpět editace',
 'rollback_short' => 'Vrátit zpět',
 'rollbacklink' => 'vrácení zpět',
+'rollbacklinkcount' => 'vrácení $1 {{PLURAL:$1|editace|editací}} zpět',
+'rollbacklinkcount-morethan' => 'vrácení více než $1 {{PLURAL:$1|editace|editací}} zpět',
 'rollbackfailed' => 'Nešlo vrátit zpět',
 'cantrollback' => 'Nelze vrátit zpět poslední editaci, neboť poslední přispěvatel je jediným autorem této stránky.',
 'alreadyrolled' => 'Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.
@@ -2486,10 +2516,10 @@ Současné nastavení pro tuto stránku je: '''$1''':",
 'pagesize' => '(bajtů)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'editace',
-'restriction-move' => 'přesunutí',
-'restriction-create' => 'vytvoření',
-'restriction-upload' => 'Nahrávání souborů',
+'restriction-edit' => 'Editace',
+'restriction-move' => 'Přesunutí',
+'restriction-create' => 'Vytvoření',
+'restriction-upload' => 'Načtení souboru',
 
 # Restriction levels
 'restriction-level-sysop' => 'zamčeno',
@@ -2892,6 +2922,7 @@ Pokud si přejete přispívat k lokalizaci softwaru MediaWiki, navštivte [//www
 'import-interwiki-templates' => 'Zahrnout všechny šablony',
 'import-interwiki-submit' => 'Importovat',
 'import-interwiki-namespace' => 'Cílový jmenný prostor:',
+'import-interwiki-rootpage' => 'Cílová kořenová stránka (nepovinné):',
 'import-upload-filename' => 'Jméno souboru:',
 'import-comment' => 'Zdůvodnění:',
 'importtext' => 'Prosím exportujte soubor ze zdrojové wiki pomocí [[Special:Export|exportního nástroje]].
@@ -2924,6 +2955,9 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'import-error-interwiki' => 'Stránka „$1“ se neimportuje, protože její název je vyhrazen pro externí odkazy (interwiki).',
 'import-error-special' => 'Stránka „$1“ se neimportuje, protože patří do speciálního jmenného prostoru, do kterého stránky nepatří.',
 'import-error-invalid' => 'Stránka „$1“ se neimportuje, protože její název je neplatný.',
+'import-options-wrong' => '{{PLURAL:$2|Chybná volba|Chybné volby}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Zadaný název kořenové stránky je neplatný.',
+'import-rootpage-nosubpage' => 'Ve jmenném prostoru „$1“ kořenové stránky nejsou dovoleny podstránky.',
 
 # Import log
 'importlogpage' => 'Kniha importů',
@@ -3073,17 +3107,35 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'spam_deleting' => 'Všechny verze obsahovaly odkazy na $1, smazáno',
 
 # Info page
-'pageinfo-title' => 'Informace o "$1"',
-'pageinfo-header-edits' => 'Editace',
-'pageinfo-header-watchlist' => 'Sledované stránky',
-'pageinfo-header-views' => 'Zobrazení',
-'pageinfo-subjectpage' => 'Stránka',
-'pageinfo-talkpage' => 'Diskusní stránka',
-'pageinfo-watchers' => 'Počet sledujících',
-'pageinfo-edits' => 'Počet editací',
-'pageinfo-authors' => 'Počet různých autorů',
+'pageinfo-title' => 'Informace o stránce „$1“',
+'pageinfo-header-basic' => 'Základní údaje',
+'pageinfo-header-edits' => 'Historie editací',
+'pageinfo-header-restrictions' => 'Zámek stránky',
+'pageinfo-header-properties' => 'Vlastnosti stránky',
+'pageinfo-display-title' => 'Zobrazovaný název',
+'pageinfo-default-sort' => 'Výchozí klíč řazení',
+'pageinfo-length' => 'Velikost stránky (v bajtech)',
+'pageinfo-article-id' => 'ID stránky',
+'pageinfo-robot-policy' => 'Nastavení pro vyhledávače',
+'pageinfo-robot-index' => 'Indexovatelná',
+'pageinfo-robot-noindex' => 'Neindexovatelná',
 'pageinfo-views' => 'Počet zobrazení',
-'pageinfo-viewsperedit' => 'Počet zobrazení na editaci',
+'pageinfo-watchers' => 'Počet sledujících',
+'pageinfo-redirects-name' => 'Přesměrování na tuto stránku',
+'pageinfo-subpages-name' => 'Podstránky této stránky',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|přesměrování}}; $3 {{PLURAL:$3|nepřesměrování}})',
+'pageinfo-firstuser' => 'Zakladatel stránky',
+'pageinfo-firsttime' => 'Datum založení stránky',
+'pageinfo-lastuser' => 'Nejnovější editor',
+'pageinfo-lasttime' => 'Datum nejnovější editace',
+'pageinfo-edits' => 'Celkový počet editací',
+'pageinfo-authors' => 'Celkový počet různých autorů',
+'pageinfo-recent-edits' => 'Počet nedávných ($1) editací',
+'pageinfo-recent-authors' => 'Nedávný počet různých autorů',
+'pageinfo-restriction' => 'Zámek stránky (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Kouzelné slovo|Kouzelná slova}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrytá|Skryté}} kategorie ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Použitá šablona|Použité šablony}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Klasický',
@@ -3137,7 +3189,8 @@ Otevřením souboru můžete ohrozit svůj počítač.",
 'file-info-size' => '$1 × $2 pixelů, velikost souboru: $3, MIME typ: $4',
 'file-info-size-pages' => '$1 × $2 pixelů, velikost souboru: $3, MIME typ: $4, $5 {{PLURAL:$5|stránka|stránky|stránek}}',
 'file-nohires' => 'Větší rozlišení není k dispozici.',
-'svg-long-desc' => 'soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
+'svg-long-desc' => 'Soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
+'svg-long-desc-animated' => 'Animovaný soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
 'show-big-image' => 'Obrázek ve vyšším rozlišení',
 'show-big-image-preview' => 'Velikost tohoto náhledu: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Jiné|Jiná}} rozlišení: $1.',
@@ -3147,6 +3200,8 @@ Otevřením souboru můžete ohrozit svůj počítač.",
 'file-info-png-looped' => 've smyčce',
 'file-info-png-repeat' => 'opakováno $1{{PLURAL:$1|krát|krát}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|snímek|snímky|snímků}}',
+'file-no-thumb-animation' => "'''Poznámka: Kvůli technickým omezením nebudou náhledy tohoto souboru animované.'''",
+'file-no-thumb-animation-gif' => "'''Poznámka: Kvůli technickým omezením nebudou náhledy obrázků GIF ve vysokém rozlišení, jako je tento, animované.'''",
 
 # Special:NewFiles
 'newimages' => 'Galerie nových souborů',
@@ -3867,7 +3922,7 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 * <span class="mw-specialpagecached">Speciální stránky z&nbsp;cache (mohou být zastaralé)</span>',
 'specialpages-group-maintenance' => 'Údržba',
 'specialpages-group-other' => 'Ostatní',
-'specialpages-group-login' => 'Přihlašování / registrace',
+'specialpages-group-login' => 'Přihlášení / vytvoření účtu',
 'specialpages-group-changes' => 'Poslední změny a záznamy',
 'specialpages-group-media' => 'Média',
 'specialpages-group-users' => 'Uživatelé a skupiny',
@@ -4001,9 +4056,12 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 'api-error-empty-file' => 'Načtený soubor je prázdný.',
 'api-error-emptypage' => 'Zakládání prázdných stránek není dovoleno.',
 'api-error-fetchfileerror' => 'Vnitřní chyba: došlo k chybě při stahování souboru.',
+'api-error-fileexists-forbidden' => 'Soubor s názvem „$1“ už existuje a nelze ho přepsat.',
+'api-error-fileexists-shared-forbidden' => 'Soubor s názvem „$1“ už existuje ve sdíleném úložišti a nelze ho přepsat.',
 'api-error-file-too-large' => 'Načtený soubor je příliš velký.',
 'api-error-filename-tooshort' => 'Název souboru je příliš krátký.',
 'api-error-filetype-banned' => 'Tento typ souboru je zakázán.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|je nedovolený formát souborů|jsou nedovolené formáty souborů}}. {{PLURAL:$3|Povolený formát souborů je|Povolené formáty souborů jsou}} $2.',
 'api-error-filetype-missing' => 'Tento soubor nemá příponu.',
 'api-error-hookaborted' => 'Zamýšlená úprava byla zakázána rozšiřujícím modulem.',
 'api-error-http' => 'Vnitřní chyba: nepodařilo se připojit k serveru.',
index eeef532..d6b834d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Kashubian (Kaszëbsczi)
+/** Kashubian (kaszëbsczi)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -79,7 +79,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Zatacë edicëje wlogòwónych brëkòwników na lësce ùzérónych artiklów',
 'tog-watchlisthideanons' => 'Zatacë edicëje anonimòwich brëkòwników na lësce ùzérónych artiklów',
 'tog-watchlisthidepatrolled' => 'Zatacë sprôwdzoné edicëje z lëstë ùzérónych artiklów',
-'tog-nolangconversion' => 'Wëłączë kònwersëjã wariantów',
 'tog-ccmeonemails' => 'Sélôj do mie kòpije e-mailów, chtërné sélóm do jinych brëkòwników',
 'tog-diffonly' => 'Nie wëskrzëniôj zamkłoscë starnë niżi przërónaniô zjinaków',
 'tog-showhiddencats' => 'Wëskrzëni zataconé kategòrëje',
@@ -768,9 +767,9 @@ Starnë z [[Special:Watchlist|lëstë ùzérónëch artiklów]] są '''pògrëbi
 Jeżlë chcesz przezdrzec abò szëkac w dotenczas wladowónëch lopkach, biéj do [[Special:FileList|lësta lopków]]. Kòżdi wladënk je registrowóny w [[Special:Log/upload|registrze wladënkù]], a rëmniãcé w [[Special:Log/delete|registrze rëmaniô]].
 
 Abë dodac lopk do starnë, ùżëjë ùniższegò lënka wedle nôslédnëch mùstrów:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Lopk.jpg]]</nowiki></tt>''' wëskrzëni całi lopk
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Lopk.png|200px|thumb|left|pòdpisënk òbrôzka]]</nowiki></tt>''' wëskrzëni z lewi starnë, przë ùbrzégù, miniaturkã w szérzë 200 pikslów w ramie, z nôdpisã 'pòdpisënk òbrôzka'
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Lopk.ogg]]</nowiki></tt>''' òtemknie prosti lënk do lopka bez wëskrzënianiô sómegò lopka",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Lopk.jpg]]</nowiki></code>''' wëskrzëni całi lopk
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Lopk.png|200px|thumb|left|pòdpisënk òbrôzka]]</nowiki></code>''' wëskrzëni z lewi starnë, przë ùbrzégù, miniaturkã w szérzë 200 pikslów w ramie, z nôdpisã 'pòdpisënk òbrôzka'
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Lopk.ogg]]</nowiki></code>''' òtemknie prosti lënk do lopka bez wëskrzënianiô sómegò lopka",
 'uploadlog' => 'Lësta wladënków',
 'uploadlogpage' => 'Dołączoné',
 'uploadlogpagetext' => 'Hewò je lësta slédno wladowónëch lopków.
index 73eed18..ce92abd 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Church Slavic (Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ)
+/** Church Slavic (словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -61,8 +61,8 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ПРѢНАПРАВЛЄНИѤ', '#REDIRECT' ),
-       'language'                => array( '0', '#ѨꙀꙐКЪ:', '#LANGUAGE:' ),
+       'redirect'                  => array( '0', '#ПРѢНАПРАВЛЄНИѤ', '#REDIRECT' ),
+       'language'                  => array( '0', '#ѨꙀꙐКЪ:', '#LANGUAGE:' ),
 );
 
 $defaultDateFormat = 'mdy';
@@ -544,6 +544,7 @@ $messages = array(
 'statistics-articles' => 'истиньнꙑ члѣни',
 'statistics-pages' => 'страницѧ',
 'statistics-files' => 'положєнꙑ дѣла',
+'statistics-users-active' => 'дѣꙗтєльнꙑ польꙃєватєлє',
 
 'disambiguations' => 'страницѧ ижє съвѧꙁи съ мъногосъмꙑслиꙗ имѫтъ',
 'disambiguationspage' => 'Template:мъногосъмꙑслиѥ',
@@ -733,11 +734,6 @@ $messages = array(
 'tooltip-ca-nstab-special' => 'си нарочьна страница ѥстъ · ѥѩжє иꙁмѣнꙗти нє можєши',
 'tooltip-watch' => 'си страницѧ блюдєниѥ',
 
-# Info page
-'pageinfo-header-watchlist' => 'блюдєниꙗ',
-'pageinfo-subjectpage' => 'страница',
-'pageinfo-talkpage' => 'бєсѣда',
-
 # Media information
 'file-info-size' => '$1 × $2 п҃ѯ · дѣла мѣра : $3 · MIME тѷпъ : $4',
 'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
index 63baaa3..4a3fdf3 100644 (file)
@@ -49,69 +49,69 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ail-cyfeirio', '#ailgyfeirio', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__DIMTAFLENCYNNWYS__', '__DIMRHESTRGYNNWYS__', '__DIMRHG__', '__NOTOC__' ),
-       'noeditsection'           => array( '0', '__DIMADRANGOLYGU__', '__DIMGOLYGUADRAN__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'MISCYFOES', 'MISCYFREDOL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'ENWMISCYFOES', 'ENWMISCYFREDOL', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'GENENWMISCYFOES', 'CURRENTMONTHNAMEGEN' ),
-       'currentday'              => array( '1', 'DYDDIADCYFOES', 'DYDDCYFREDOL', 'CURRENTDAY' ),
-       'currentdayname'          => array( '1', 'ENWDYDDCYFOES', 'ENWDYDDCYFREDOL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'FLWYDDYNCYFOES', 'BLWYDDYNGYFREDOL', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'AMSERCYFOES', 'AMSERCYFREDOL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'AWRGYFREDOL', 'CURRENTHOUR' ),
-       'numberofarticles'        => array( '1', 'NIFEROERTHYGLAU', 'NIFERYRERTHYGLAU', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NIFERYFFEILIAU', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NIFERYDEFNYDDWYR', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'NIFERYGOLYGIADAU', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'ENWTUDALEN', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ENWTUDALENE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'PARTH', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NAMESPACE', 'PARTHE', 'NAMESPACEE' ),
-       'fullpagename'            => array( '1', 'ENWLLAWNTUDALEN', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ENWLLAWNTUDALENE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ENWISDUDALEN', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ENWISDUDALENE', 'SUBPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ENWTUDALENSGWRS', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'ENWTUDALENSGWRSE', 'TALKPAGENAMEE' ),
-       'img_thumbnail'           => array( '1', 'ewin bawd', 'bawd', 'mân-lun', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'mân-lun=$1', 'bawd=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'de', 'right' ),
-       'img_left'                => array( '1', 'chwith', 'left' ),
-       'img_none'                => array( '1', 'dim', 'none' ),
-       'img_center'              => array( '1', 'canol', 'center', 'centre' ),
-       'img_page'                => array( '1', 'tudalen=$1', 'tudalen $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'unionsyth', 'unionsyth=$1', 'unionsyth $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_sub'                 => array( '1', 'is', 'sub' ),
-       'img_super'               => array( '1', 'uwch', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'brig', 'top' ),
-       'img_bottom'              => array( '1', 'gwaelod', 'godre', 'bottom' ),
-       'server'                  => array( '0', 'GWEINYDD', 'SERVER' ),
-       'servername'              => array( '0', 'ENW\'RGWEINYDD', 'SERVERNAME' ),
-       'grammar'                 => array( '0', 'GRAMMAR', 'GRAMADEG', 'GRAMMAR:' ),
-       'currentweek'             => array( '1', 'WYTHNOSGYFREDOL', 'CURRENTWEEK' ),
-       'revisionid'              => array( '1', 'IDYGOLYGIAD', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'DIWRNODYGOLYGIAD', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'DIWRNODYGOLYGIAD2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MISYGOLYGIAD', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'BLWYDDYNYGOLYGIAD', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'STAMPAMSERYGOLYGIAD', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'LLUOSOG:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'URLLLAWN:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLLLAWNE:', 'FULLURLE:' ),
-       'newsectionlink'          => array( '1', '_NEWSECTIONLINK_', '_CYSWLLTADRANNEWYDD_', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'GOLYGIADCYFREDOL', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'STAMPAMSERCYFREDOL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'STAMPAMSERLLEOL', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#IAITH:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'IAITHYCYNNWYS', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'TUDALENNAUYNYPARTH:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'NIFERYGWEINYDDWYR', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FFORMATIORHIF', 'FORMATNUM' ),
-       'special'                 => array( '0', 'arbennig', 'special' ),
-       'hiddencat'               => array( '1', '_HIDDENCAT_', '_CATCUDD_', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'TUDALENNAUYNYCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'MAINTTUD', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#ail-cyfeirio', '#ailgyfeirio', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__DIMTAFLENCYNNWYS__', '__DIMRHESTRGYNNWYS__', '__DIMRHG__', '__NOTOC__' ),
+       'noeditsection'             => array( '0', '__DIMADRANGOLYGU__', '__DIMGOLYGUADRAN__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'MISCYFOES', 'MISCYFREDOL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'ENWMISCYFOES', 'ENWMISCYFREDOL', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'GENENWMISCYFOES', 'CURRENTMONTHNAMEGEN' ),
+       'currentday'                => array( '1', 'DYDDIADCYFOES', 'DYDDCYFREDOL', 'CURRENTDAY' ),
+       'currentdayname'            => array( '1', 'ENWDYDDCYFOES', 'ENWDYDDCYFREDOL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'FLWYDDYNCYFOES', 'BLWYDDYNGYFREDOL', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'AMSERCYFOES', 'AMSERCYFREDOL', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'AWRGYFREDOL', 'CURRENTHOUR' ),
+       'numberofarticles'          => array( '1', 'NIFEROERTHYGLAU', 'NIFERYRERTHYGLAU', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NIFERYFFEILIAU', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NIFERYDEFNYDDWYR', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'NIFERYGOLYGIADAU', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'ENWTUDALEN', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ENWTUDALENE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'PARTH', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NAMESPACE', 'PARTHE', 'NAMESPACEE' ),
+       'fullpagename'              => array( '1', 'ENWLLAWNTUDALEN', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ENWLLAWNTUDALENE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ENWISDUDALEN', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ENWISDUDALENE', 'SUBPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ENWTUDALENSGWRS', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ENWTUDALENSGWRSE', 'TALKPAGENAMEE' ),
+       'img_thumbnail'             => array( '1', 'ewin bawd', 'bawd', 'mân-lun', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'mân-lun=$1', 'bawd=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'de', 'right' ),
+       'img_left'                  => array( '1', 'chwith', 'left' ),
+       'img_none'                  => array( '1', 'dim', 'none' ),
+       'img_center'                => array( '1', 'canol', 'center', 'centre' ),
+       'img_page'                  => array( '1', 'tudalen=$1', 'tudalen $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'unionsyth', 'unionsyth=$1', 'unionsyth $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_sub'                   => array( '1', 'is', 'sub' ),
+       'img_super'                 => array( '1', 'uwch', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'brig', 'top' ),
+       'img_bottom'                => array( '1', 'gwaelod', 'godre', 'bottom' ),
+       'server'                    => array( '0', 'GWEINYDD', 'SERVER' ),
+       'servername'                => array( '0', 'ENW\'RGWEINYDD', 'SERVERNAME' ),
+       'grammar'                   => array( '0', 'GRAMMAR', 'GRAMADEG', 'GRAMMAR:' ),
+       'currentweek'               => array( '1', 'WYTHNOSGYFREDOL', 'CURRENTWEEK' ),
+       'revisionid'                => array( '1', 'IDYGOLYGIAD', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'DIWRNODYGOLYGIAD', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'DIWRNODYGOLYGIAD2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MISYGOLYGIAD', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'BLWYDDYNYGOLYGIAD', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'STAMPAMSERYGOLYGIAD', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'LLUOSOG:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'URLLLAWN:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLLLAWNE:', 'FULLURLE:' ),
+       'newsectionlink'            => array( '1', '_NEWSECTIONLINK_', '_CYSWLLTADRANNEWYDD_', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'GOLYGIADCYFREDOL', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'STAMPAMSERCYFREDOL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'STAMPAMSERLLEOL', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#IAITH:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'IAITHYCYNNWYS', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'TUDALENNAUYNYPARTH:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NIFERYGWEINYDDWYR', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FFORMATIORHIF', 'FORMATNUM' ),
+       'special'                   => array( '0', 'arbennig', 'special' ),
+       'hiddencat'                 => array( '1', '_HIDDENCAT_', '_CATCUDD_', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'TUDALENNAUYNYCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'MAINTTUD', 'PAGESIZE' ),
 );
 
 $linkTrail = "/^([àáâèéêìíîïòóôûŵŷa-z]+)(.*)$/sDu";
@@ -124,7 +124,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr newidiadau diweddar',
 'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag y rhestr dudalennau newydd',
 'tog-extendwatchlist' => "Ehangu'r rhestr wylio i ddangos pob golygiad yn hytrach na'r diweddaraf yn unig",
-'tog-usenewrc' => 'Defnyddio newidiadau diweddar gwell (angen JavaScript)',
+'tog-usenewrc' => "Yn dangos newidiadau i un dudalen gyda'i gilydd - ar 'newidiadau diweddar' a'r 'rhestr wylio' (angen JavaScript)",
 'tog-numberheadings' => "Rhifo penawdau'n awtomatig",
 'tog-showtoolbar' => 'Dangos y bar offer golygu (angen JavaScript)',
 'tog-editondblclick' => 'Golygu tudalennau wrth glicio ddwywaith (angen JavaScript)',
@@ -132,17 +132,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Galluogi golygu adran drwy dde-glicio ar bennawd yr adran (JavaScript)',
 'tog-showtoc' => 'Dangos y daflen gynnwys (ar gyfer tudalennau sydd â mwy na 3 pennawd)',
 'tog-rememberpassword' => "Y porwr hwn i gofio'r manylion mewngofnodi (hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})",
-'tog-watchcreations' => 'Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu creu',
-'tog-watchdefault' => 'Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu golygu',
-'tog-watchmoves' => 'Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu symud',
-'tog-watchdeletion' => 'Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu dileu',
+'tog-watchcreations' => 'Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu creu a ffeiliau wrth i mi eu huwchlwytho.',
+'tog-watchdefault' => 'Ychwanegu tudalennau a ffeiliau at fy rhestr wylio wrth i mi eu golygu',
+'tog-watchmoves' => 'Ychwanegu tudalennau a ffeiliau at fy rhestr wylio wrth i mi eu symud',
+'tog-watchdeletion' => 'Ychwanegu tudalennau a ffeiliau at fy rhestr wylio wrth i mi eu dileu',
 'tog-minordefault' => 'Marcio pob golygiad fel un bach yn ddiofyn',
 'tog-previewontop' => 'Dangos y rhagolwg cyn y blwch golygu',
 'tog-previewonfirst' => 'Dangos rhagolwg ar y golygiad cyntaf',
 'tog-nocache' => 'Analluogi storio tudalennau yng nghelc y porydd',
-'tog-enotifwatchlistpages' => 'Gyrru e-bost ataf pan fo newid i dudalen ar fy rhestr wylio',
+'tog-enotifwatchlistpages' => 'Gyrru e-bost ataf pan fo newid i dudalen neu ffeil ar fy rhestr wylio',
 'tog-enotifusertalkpages' => "Gyrru e-bost ataf fy hunan pan fo newid i'm tudalen sgwrs",
-'tog-enotifminoredits' => 'Gyrru e-bost ataf hefyd ar gyfer golygiadau bychain i dudalennau',
+'tog-enotifminoredits' => 'Gyrru e-bost ataf hefyd ar gyfer golygiadau bychain i dudalennau a ffeiliau',
 'tog-enotifrevealaddr' => 'Datguddio fy nghyfeiriad e-bost mewn e-byst hysbysu',
 'tog-shownumberswatching' => "Dangos y nifer o ddefnyddwyr sy'n gwylio",
 'tog-oldsig' => 'Llofnod cyfredol:',
@@ -380,6 +380,10 @@ $1',
 'youhavenewmessages' => 'Mae gennych chi $1 ($2).',
 'newmessageslink' => 'Neges(eueon) newydd',
 'newmessagesdifflink' => 'y newid diweddaraf',
+'youhavenewmessagesfromusers' => 'Mae gennych $1 oddi wrth {{PLURAL:$3||ddefnyddiwr arall|$2 ddefnyddiwr arall|$3 defnyddiwr arall|$3 defnyddiwr arall|$3 defnyddiwr arall}} ($2).',
+'youhavenewmessagesmanyusers' => 'Mae gennych $1 oddi wrth lu o ddefnyddwyr eraill ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|neges newydd|neges newydd|negeseuon newydd}}',
+'newmessagesdifflinkplural' => 'y {{PLURAL:$1||newid diweddaraf|newidiadau diweddaraf}}',
 'youhavenewmessagesmulti' => 'Mae negeseuon newydd gennych ar $1',
 'editsection' => 'golygu',
 'editold' => 'golygu',
@@ -431,12 +435,12 @@ Mae rhestr o'r tudalennau arbennig dilys i'w gael [[Special:SpecialPages|yma]]."
 # General errors
 'error' => 'Gwall',
 'databaseerror' => 'Gwall databas',
-'dberrortext' => 'Mae gwall cystrawen wedi taro\'r databas.
+'dberrortext' => 'Mae gwall cystrawen ymholi wedi taro\'r gronfa ddata.
 Efallai fod gwall yn y meddalwedd.
-Y gofyniad olaf y trïodd y databas oedd:
-<blockquote><tt>$1</tt></blockquote>
-o\'r ffwythiant "<tt>$2</tt>".
-Rhoddwyd y côd gwall "<tt>$3: $4</tt>".',
+Y gofyniad diwethaf a ofynwyd i\'r gronfa ddata oedd:
+<blockquote><code>$1</code></blockquote>
+o\'r ffwythiant "<code>$2</code>".
+Rhoddwyd y côd gwall "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Mae gwall cystrawen wedi taro\'r databas.
 Y gofyniad olaf y trïodd y databas oedd:
 "$1"
@@ -473,6 +477,8 @@ A fyddech gystal â gwneud adroddiad ar hwn at [[Special:ListUsers/sysop|weinydd
 'cannotdelete' => "Mae'n amhosib dileu'r dudalen neu'r ddelwedd \"\$1\".
 Efallai fod rhywun arall eisoes wedi'i dileu.",
 'cannotdelete-title' => "Ni ellir dileu'r dudalen '$1'",
+'delete-hook-aborted' => 'Terfynwyd y dilead cyn pryd gan fachyn.
+Ni roddodd eglurhad.',
 'badtitle' => 'Teitl gwael',
 'badtitletext' => "Mae'r teitl a ofynnwyd amdano yn annilys, yn wag, neu cysylltu'n anghywir rhwng ieithoedd neu wicïau. Gall fod ynddo un nod neu ragor na ellir eu defnyddio mewn teitlau.",
 'perfcached' => "Mae'r wybodaeth ganlynol yn gopi cadw; mae'n bosib nad y fersiwn diweddaraf ydyw. Cedwir hyd at {{PLURAL:$1||un canlyniad yn unig|ddau ganlyniad|dri canlyniad|$1 chanlyniad|$1 canlyniad}} yn y copi cadw.",
@@ -505,6 +511,8 @@ Rhoddwyd y rheswm hwn - ''$2''.",
 Y rheswm a roddwyd gan y gweinyddwr a roddodd y ffeil dan glo yw "\'\'$3\'\'".',
 'invalidtitle-knownnamespace' => 'Teitl annilys o\'r enw "$3" yn y parth "$2"',
 'invalidtitle-unknownnamespace' => 'Teitl annilys ag iddi\'r rhif parth anhysbys $1 a\'r enw "$2"',
+'exception-nologin' => 'Nid ydych wedi mewngofnodi',
+'exception-nologin-text' => "Rhaid mewngofnodi i'r wici er mwyn gweld y dudalen neu gyflawni'r weithred.",
 
 # Virus scanner
 'virus-badscanner' => "Cyfluniad gwael: sganiwr firysau anhysbys: ''$1''",
@@ -525,6 +533,7 @@ Cofiwch osod y [[Special:Preferences|dewisiadau]] sydd fwyaf hwylus i chi ar {{S
 'remembermypassword' => "Y porwr hwn i gofio'r manylion mewngofnodi (am hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})",
 'securelogin-stick-https' => "Cadw'r cyswllt â HTTPS ar ôl mewngofnodi",
 'yourdomainname' => 'Eich parth',
+'password-change-forbidden' => 'Ni allwch newid cyfrineiriau ar y wici hwn.',
 'externaldberror' => "Naill ai: cafwyd gwall dilysu allanol ar databas neu: ar y llaw arall efallai nad oes hawl gennych chi i ddiwygio'ch cyfrif allanol.",
 'login' => 'Mewngofnodi',
 'nav-login-createaccount' => 'Mewngofnodi',
@@ -754,6 +763,10 @@ Os daethoch yma ar ddamwain, cliciwch botwm '''n&ocirc;l''' y porwr.",
 Gallwch [[Special:Search/{{PAGENAME}}|chwilio am y teitl hwn]] ar dudalennau eraill, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chwilio drwy'r logiau perthnasol], neu [{{fullurl:{{FULLPAGENAME}}|action=edit}} golygu'r dudalen]</span>.",
 'noarticletext-nopermission' => 'Mae\'r dudalen hon yn wag ar hyn o bryd.
 Gallwch [[Special:Search/{{PAGENAME}}|chwilio am y teitl hwn]] ar dudalennau eraill, neu gallwch <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} chwilio drwy\'r logiau perthnasol]</span>.',
+'missing-revision' => 'Nid yw\'r diwygiad #$1 o\'r dudalen "{{PAGENAME}}" ar gael.
+
+Fel arfer, fe ddigwydd hyn wrth ddilyn hen gyswllt i dudalen sydd wedi ei dileu.
+Gallwch weld y manylion yn y [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lòg dileu].',
 'userpage-userdoesnotexist' => 'Nid oes defnyddiwr a\'r enw "<nowiki>$1</nowiki>" yn bod. Gwnewch yn siwr eich bod am greu/golygu\'r dudalen hon.',
 'userpage-userdoesnotexist-view' => 'Nid yw\'r cyfrif defnyddiwr "$1" wedi ei gofrestri.',
 'blocked-notice-logextract' => "Mae'r defnyddiwr hwn wedi ei flocio ar hyn o bryd.
@@ -762,7 +775,6 @@ Dyma'r cofnod lòg diweddaraf, er gwybodaeth:",
 *'''Firefox / Safari:''' Pwyswch ar ''Shift'' tra'n clicio ''Ail-lwytho/Reload'', neu gwasgwch ''Ctrl-F5'' neu ''Ctrl-R'' (''⌘-R'' ar Mac);
 *'''Google Chrome:'''Pwyswch ar Ctrl-Shift-R'' (''⌘-Shift-R'' ar Mac)
 *'''Internet Explorer:''' Pwyswch ar ''Ctrl'' tra'n clicio ''Adnewyddu/Refresh'', neu gwasgwch ''Ctrl-F5''. 
-*'''Konqueror:''' Cliciwch y botwm ''Ail-lwytho/Reload'', neu gwasgwch ''F5''; 
 *'''Opera:''' gwacewch y celc yn llwyr trwy ''Offer → Dewisiadau / Tools→Preferences'';",
 'usercssyoucanpreview' => "'''Tip:''' Defnyddiwch y botwm \"{{int:showpreview}}\" er mwyn profi eich CSS newydd cyn ei gadw.",
 'userjsyoucanpreview' => "'''Tip:''' Defnyddiwch y botwm \"{{int:showpreview}}\" er mwyn profi eich JS newydd cyn ei gadw.",
@@ -876,6 +888,9 @@ Cafodd yr argiau hyn eu hepgor.",
 'node-count-exceeded-warning' => 'Mae nifer y nodau yn y dudalen yn ormod',
 'expansion-depth-exceeded-category' => "Tudalennau â dyfnder ehangu tu hwnt i'r terfyn",
 'expansion-depth-exceeded-warning' => "Mae dyfnder ehangu'r dudalen y tu hwnt i'r terfyn",
+'parser-unstrip-loop-warning' => 'Wedi darganfod dolen dad-blicio (unstrip loop)',
+'parser-unstrip-recursion-limit' => 'Wedi mynd dros ben y terfyn ar ddychweliad dad-blicio (unstrip recursion) ($1)',
+'converter-manual-rule-error' => 'Cafwyd hyd i wall yn y rheol trosi iaith â llaw',
 
 # "Undo" feature
 'undo-success' => "Gellir dadwneud y golygiad. Byddwch gystal â gwirio'r gymhariaeth isod i sicrhau mai dyma sydd arnoch eisiau gwneud, ac yna rhowch y newidiadau ar gadw i gwblhau'r gwaith o ddadwneud y golygiad.",
@@ -1329,6 +1344,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'right-writeapi' => "Defnyddio'r API i ysgrifennu a thrin y tudalennau",
 'right-delete' => 'Dileu tudalennau',
 'right-bigdelete' => 'Dileu tudalennau a hanes llwythog iddynt',
+'right-deletelogentry' => 'Dileu a dad-ddileu cofnodion lòg penodedig',
 'right-deleterevision' => 'Dileu a dad-ddileu golygiadau arbennig o dudalennau',
 'right-deletedhistory' => 'Gweld cofnodion fersiynau sydd wedi eu dileu, heb y testun ynddynt',
 'right-deletedtext' => 'Gweld ysgrifen sydd wedi ei ddileu a newidiadau rhwng fersiynau ar ôl eu dileu',
@@ -1472,9 +1488,9 @@ Dyma'r lòg dileu a symud ar gyfer y dudalen hon, er gwybodaeth:",
 I weld a chwilio am ffeiliau sydd eisoes wedi eu huwchlwytho, ewch at y [[Special:FileList|rhestr o'r ffeiliau sydd wedi eu huwchlwytho]]. I weld cofnodion uwchlwytho a dileu ffeiliau, ewch at y [[Special:Log/upload|lòg uwchlwytho]] neu'r [[Special:Log/delete|lòg dileu]].
 
 I osod ffeil mewn tudalen, defnyddiwch gyswllt wici ar un o'r ffurfiau canlynol:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ffeil.jpg]]</nowiki></tt>''', er mwyn defnyddio fersiwn llawn y ffeil
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ffeil.png|200px|bawd|chwith|testun amgen]]</nowiki></tt>''' a wnaiff dangos llun 200 picsel o led mewn blwch ar yr ochr chwith, a'r testun 'testun amgen' wrth ei odre
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Ffeil.ogg]]</nowiki></tt>''' a fydd yn arwain yn syth at y ffeil heb arddangos y ffeil.",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ffeil.jpg]]</nowiki></code>''', er mwyn defnyddio fersiwn llawn y ffeil
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ffeil.png|200px|bawd|chwith|testun amgen]]</nowiki></code>''' a wnaiff dangos llun 200 picsel o led mewn blwch ar yr ochr chwith, a'r testun 'testun amgen' wrth ei odre
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Ffeil.ogg]]</nowiki></code>''' a fydd yn arwain yn syth at y ffeil heb arddangos y ffeil.",
 'upload-permitted' => 'Mathau o ffeiliau a ganiateir: $1',
 'upload-preferred' => 'Mathau ffeil dewisol: $1.',
 'upload-prohibited' => 'Mathau o ffeiliau a waherddir: $1.',
@@ -1516,20 +1532,20 @@ Gweler [[Special:NewFiles|oriel y ffeiliau newydd]] i fwrw golwg drostynt.",
 'largefileserver' => "Mae'r ffeil yn fwy na'r hyn mae'r gweinydd yn ei ganiatau.",
 'emptyfile' => "Ymddengys fod y ffeil a uwchlwythwyd yn wag. Efallai bod gwall teipio yn enw'r ffeil. Sicrhewch eich bod wir am uwchlwytho'r ffeil.",
 'windows-nonascii-filename' => "Nid yw'r wici hwn yn cynnal enwau ffeiliau sy'n cynnwys nodau arbennig.",
-'fileexists' => "Mae ffeil gyda'r enw hwn eisoes yn bodoli; gwiriwch '''<tt>[[:$1]]</tt>''' os nad ydych yn sicr bod angen ei newid.
+'fileexists' => "Mae ffeil gyda'r enw hwn eisoes yn bodoli; gwiriwch <strong>[[:$1]]</strong> os nad ydych yn sicr bod angen ei newid.
 [[$1|thumb]]",
-'filepageexists' => "Mae tudalen ddisgrifiad ar gyfer y ffeil hon eisoes ar gael ar '''<tt>[[:$1]]</tt>''', ond nid oes ffeil o'r enw hwn ar gael ar hyn o bryd.
+'filepageexists' => "Mae tudalen ddisgrifiad ar gyfer y ffeil hon eisoes ar gael ar <strong>[[:$1]]</strong>, ond nid oes ffeil o'r enw hwn ar gael ar hyn o bryd.
 Ni fydd crynodeb a osodir wrth uwchlwytho yn ymddangos ar y dudalen ddisgrifiad.
 Er mwyn gwneud i'r crynodeb ymddangos yno, bydd raid i chi olygu'r dudalen ddisgrifiad yn unswydd.
 [[$1|thumb]]",
 'fileexists-extension' => "Mae ffeil ag enw tebyg eisoes yn bod: [[$2|thumb]]
-* Enw'r ffeil ar fin ei uwchlwytho: '''<tt>[[:$1]]</tt>'''
-* Enw'r ffeil sydd eisoes yn bod: '''<tt>[[:$2]]</tt>'''
+* Enw'r ffeil ar fin ei uwchlwytho: <strong>[[:$1]]</strong>
+* Enw'r ffeil sydd eisoes yn bod: <strong>[[:$2]]</strong>
 Dewiswch enw arall os gwelwch yn dda.",
 'fileexists-thumbnail-yes' => "Ymddengys bod delwedd wedi ei leihau ''(bawd)'' ar y ffeil. [[$1|thumb]]
-Cymharwch gyda'r ffeil '''<tt>[[:$1]]</tt>'''.
+Cymharwch gyda'r ffeil <strong>[[:$1]]</strong>.
 Os mai'r un un llun ar ei lawn faint sydd ar yr ail ffeil yna does dim angen uwchlwytho llun ychwanegol o faint bawd.",
-'file-thumbnail-no' => "Mae '''<tt>$1</tt>''' ar ddechrau enw'r ffeil.
+'file-thumbnail-no' => "Mae <strong>$1</strong> ar ddechrau enw'r ffeil.
 Mae'n ymddangos felly bod y ddelwedd wedi ei leihau ''(maint bawd)''.
 Os yw'r ddelwedd ar ei lawn faint gallwch barhau i'w uwchlwytho. Os na, newidiwch enw'r ffeil, os gwelwch yn dda.",
 'fileexists-forbidden' => "Mae ffeil gyda'r enw hwn eisoes ar gael, ac ni ellir ei throsysgrifo.
@@ -1629,6 +1645,7 @@ Os yw'r broblem yn parhau, cysylltwch â [[Special:ListUsers/sysop|gweinyddwr]].
 'lockmanager-fail-releaselock' => 'Wedi methu agor y clo ar "$1".',
 'lockmanager-fail-db-bucket' => 'Methwyd cysylltu â digon o gronfeydd data cloi yn y bwced $1.',
 'lockmanager-fail-db-release' => 'Wedi methu agor y cloion ar y gronfa ddata $1.',
+'lockmanager-fail-svr-acquire' => 'Wedi methu sicrhau cloion ar y gweinydd $1.',
 'lockmanager-fail-svr-release' => 'Wedi methu agor y cloion ar y gweinydd $1.',
 
 # ZipDirectoryReader
@@ -1781,8 +1798,8 @@ Mae modd golygu'r disgrifiad ohoni ar ei [$2 thudalen disgrifio] fan honno.",
 
 # MIME search
 'mimesearch' => 'Chwiliad MIME',
-'mimesearch-summary' => "Fe allwch ddefnyddio'r dudalen hon i hidlo'r ffeiliau yn ôl math MIME.
-Mewnbwn: contenttype/subtype, e.e. <tt>image/jpeg</tt>.",
+'mimesearch-summary' => "Fe allwch ddefnyddio'r dudalen hon i hidlo'r ffeiliau yn ôl eu math MIME.
+Mewnbwn: contenttype/subtype, e.e. <code>image/jpeg</code>.",
 'mimetype' => 'Ffurf MIME:',
 'download' => 'islwytho',
 
@@ -1829,7 +1846,7 @@ Cofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
 
 'disambiguations' => "Tudalennau sy'n cysylltu â thudalennau gwahaniaethu",
 'disambiguationspage' => 'Template:Gwahaniaethu',
-'disambiguations-text' => "Mae'r tudalennau canlynol yn cynnwys un neu ragor o gysylltau wici, sydd yn cysylltu â '''thudalennau gwahaniaethu'''. Yn hytrach dylent arwain yn syth at yr erthygl briodol.<br />
+'disambiguations-text' => "Mae'r tudalennau canlynol yn cynnwys un neu ragor o gysylltau, sydd yn arwain at '''dudalennau gwahaniaethu'''. Hwyrach y byddai'n hwylusach petai'r cyswllt yn arwain yn syth at y dudalen briodol.<br />
 Diffinir tudalen yn dudalen gwahaniaethu pan mae'n cynnwys un o'r nodiadau '[[MediaWiki:Disambiguationspage|tudalen gwahaniaethu]]'.",
 
 'doubleredirects' => 'Ailgyfeiriadau dwbl',
@@ -1936,6 +1953,7 @@ Gallwch weld chwiliad mwy penodol trwy ddewis y math o lòg, enw'r defnyddiwr, n
 Sylwer bod llythrennau mawr neu fach o bwys i'r chwiliad.",
 'logempty' => 'Does dim eitemau yn cyfateb yn y lòg.',
 'log-title-wildcard' => "Chwilio am deitlau'n dechrau gyda'r geiriau hyn",
+'showhideselectedlogentries' => 'Dewis dangos neu guddio cofnodion lòg',
 
 # Special:AllPages
 'allpages' => 'Pob tudalen',
@@ -1981,7 +1999,7 @@ Gweler hefyd [[Special:WantedCategories|categorïau sydd eu hangen]].",
 'linksearch-ok' => 'Chwilio',
 'linksearch-text' => 'Gellir defnyddio cardiau gwyllt megis "*.wikipedia.org".
 Mae angen parth lefel-uchaf o leiaf, er enghraifft "*.org".<br />
-Protocoliau sy\'n cael eu cynnal: <tt>$1</tt> (peidiwch ag ychwanegu\'r rhain wrth ysgrifennu\'r ymholiad).',
+Protocoliau sy\'n cael eu cynnal: <code>$1</code> (peidiwch ag ychwanegu\'r rhain wrth ysgrifennu\'r ymholiad).',
 'linksearch-line' => 'Mae cysylltiad i gael i $1 oddi wrth $2',
 'linksearch-error' => "Dim ond ar ddechrau enw'r gwesteiwr y gallwch osod cardiau gwyllt.",
 
@@ -2028,6 +2046,7 @@ Protocoliau sy\'n cael eu cynnal: <tt>$1</tt> (peidiwch ag ychwanegu\'r rhain wr
 a bod cyfeiriad e-bost dilys yn eich [[Special:Preferences|dewisiadau]]
 er mwyn medru anfon e-bost at ddefnyddwyr eraill.',
 'emailuser' => 'Anfon e-bost at y defnyddiwr hwn',
+'emailuser-title-notarget' => 'Anfon e-bost at ddefnyddiwr',
 'emailpage' => 'Anfon e-bost at ddefnyddiwr',
 'emailpagetext' => "Os yw'r cyfeiriad e-bost sydd yn newisiadau'r defnyddiwr hwn yn un dilys, gellir anfon neges ato o'i ysgrifennu ar y ffurflen isod.
 Bydd y cyfeiriad e-bost a osodoch yn eich [[Special:Preferences|dewisiadau chithau]] yn ymddangos ym maes \"Oddi wrth\" yr e-bost, fel bod y defnyddiwr arall yn gallu anfon ateb atoch.",
@@ -2172,7 +2191,9 @@ Gallai dileu tudalen, gyda hanes golygu cymaint â hyn iddi, beri dryswch i weit
 # Rollback
 'rollback' => 'Gwrthdroi golygiadau',
 'rollback_short' => 'Gwrthdroi',
-'rollbacklink' => 'gwrthdroi',
+'rollbacklink' => 'gwrthdröer',
+'rollbacklinkcount' => 'gwrthdröer $1 {{PLURAL:$1||golygiad|olygiad|golygiad|golygiad|golygiad}}',
+'rollbacklinkcount-morethan' => 'gwrthdröer mwy na $1 {{PLURAL:$1||golygiad|olygiad|golygiad|golygiad|golygiad}}',
 'rollbackfailed' => 'Methodd y gwrthdroi',
 'cantrollback' => "Wedi methu gwrthdroi'r golygiad; y cyfrannwr diwethaf oedd unig awdur y dudalen hon.",
 'alreadyrolled' => "Nid yw'n bosib dadwneud y golygiad diwethaf i'r dudalen [[:$1|$1]] gan [[User:$2|$2]] ([[User talk:$2|Sgwrs]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2702,6 +2723,8 @@ Mae ffolder dros dro yn eisiau.',
 'import-error-interwiki' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni wedi ei neilltuo at ddiben cysylltu\'n allanol (rhyngwici).',
 'import-error-special' => 'Ni fewnforiwyd y dudalen "$1" oherwydd ei bod yn perthyn i barth arbennig lle nad oes tudalennau i\'w cael.',
 'import-error-invalid' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni yn annilys.',
+'import-options-wrong' => '{{PLURAL:$2|Dewis|Dewis|Dewisiadau}} annilys: <nowiki>$1</nowiki>',
+'import-rootpage-nosubpage' => 'Nid yw\'r parth "$1", sef parth y wraidd-dudalen, yn caniatau is-dudalennau.',
 
 # Import log
 'importlogpage' => 'Lòg mewnforio',
@@ -2789,7 +2812,7 @@ Mae ffolder dros dro yn eisiau.',
 'tooltip-rollback' => "Yn troi golygiad(au) y defnyddiwr diwethaf i'r dudalen hon yn ôl gydag un clic.",
 'tooltip-undo' => 'Mae "dadwneud" yn troi\'r golygiad hwn yn ôl ac yn dangos rhagolwg o\'r golygiad adferedig.
 Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
-'tooltip-preferences-save' => "Rhoi'r dewisiadau ar gadw",
+'tooltip-preferences-save' => 'Rhodder y dewisiadau ar gadw',
 'tooltip-summary' => 'Rhowch grynodeb byr',
 
 # Metadata
@@ -2813,21 +2836,26 @@ Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
 Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr waharddedig.',
 'spamprotectionmatch' => "Dyma'r testun gyneuodd ein hidlydd amddiffyn rhag sbam: $1",
 'spambot_username' => 'Teclyn clirio sbam MediaWiki',
-'spam_reverting' => "Yn troi nôl i'r diwygiad diweddaraf sydd ddim yn cynnwys cysylltiadau i $1",
-'spam_blanking' => 'Roedd cysylltiadau i $1 gan bob golygiad, yn blancio',
+'spam_reverting' => 'Wedi adfer y diwygiad diweddaraf na sydd yn cynnwys cysylltiadau i $1',
+'spam_blanking' => 'Roedd cysylltiadau i $1 gan bob golygiad, felly gwacawyd y dudalen',
+'spam_deleting' => 'Roedd pob diwygiad yn cynnwys cysylltiadau â $1, felly fe ddilëwyd y dudalen',
 
 # Info page
 'pageinfo-title' => 'Manylion "$1"',
-'pageinfo-header-edits' => 'Golygiadau',
-'pageinfo-header-watchlist' => 'Rhestr wylio',
-'pageinfo-header-views' => 'Ymweliadau',
-'pageinfo-subjectpage' => 'Tudalen',
-'pageinfo-talkpage' => 'Tudalen sgwrs',
-'pageinfo-watchers' => 'Nifer y gwylwyr',
-'pageinfo-edits' => 'Nifer y golygiadau',
-'pageinfo-authors' => 'Nifer yr awduron gwahanol',
+'pageinfo-header-basic' => 'Gwybodaeth sylfaenol',
+'pageinfo-header-edits' => 'Hanes golygu',
+'pageinfo-header-restrictions' => 'Diogelwch y dudalen',
+'pageinfo-header-properties' => "Priodweddau'r dudalen",
+'pageinfo-length' => 'Hyd y dudalen (beitiau)',
+'pageinfo-article-id' => 'ID y dudalen',
 'pageinfo-views' => 'Nifer yr ymweliadau',
-'pageinfo-viewsperedit' => 'Ymweliadau wrth y golygiad',
+'pageinfo-watchers' => 'Nifer gwylwyr y dudalen',
+'pageinfo-firstuser' => 'Y defnyddiwr a ddechreuodd y dudalen',
+'pageinfo-firsttime' => "Dyddiad dechrau'r dudalen",
+'pageinfo-lastuser' => 'Y golygydd diweddaraf',
+'pageinfo-lasttime' => 'Dyddiad y golygiad diweddaraf',
+'pageinfo-edits' => 'Cyfanswm y golygiadau',
+'pageinfo-authors' => 'Cyfanswm yr awduron gwahanol',
 
 # Skin names
 'skinname-standard' => 'Safonol',
@@ -3672,9 +3700,12 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'api-error-empty-file' => "Mae'r ffeil a gyflwynwyd gennych yn wag.",
 'api-error-emptypage' => "Ni chaniateir dechrau tudalen newydd, a honno'n wag.",
 'api-error-fetchfileerror' => "Gwall mewnol: aeth rhywbeth o'i le tra'n cywain y ffeil.",
+'api-error-fileexists-forbidden' => 'Mae ffeil o\'r enw "$1" ar gael yn barod, ac ni ellir ei throsysgrifo.',
+'api-error-fileexists-shared-forbidden' => 'Mae ffeil o\'r enw "$1" eisoes ar gael yn y storfa ffeiliau gyfrannol, ac ni ellir ei throsysgrifo.',
 'api-error-file-too-large' => "Mae'r ffeil a gyflwynwyd gennych yn rhy fawr.",
 'api-error-filename-tooshort' => "Mae enw'r ffeil yn rhy fyr.",
 'api-error-filetype-banned' => "Mae'r math hwn o ffeil wedi ei wahardd.",
+'api-error-filetype-banned-type' => "Ni chaniateir ffeiliau o'r {{PLURAL:$4|math|math|mathau|mathau|mathau|mathau}} $1.  $2 yw'r {{PLURAL:$3|math|math|mathau|mathau|mathau|mathau}} o ffeil a ganiateir.",
 'api-error-filetype-missing' => 'Mae estyniad yn eisiau ar y ffeil.',
 'api-error-hookaborted' => 'Cafodd y darpar newid ei derfynu gan estyniad.',
 'api-error-http' => "Gwall mewnol: ni ellir cysylltu â'r gweinydd.",
index f0f7a76..e039978 100644 (file)
@@ -193,25 +193,25 @@ $messages = array(
 'tog-hidepatrolled' => 'Skjul patruljerede redigeringer i seneste ændringer',
 'tog-newpageshidepatrolled' => 'Skjul patruljerede sider på listen over nye sider',
 'tog-extendwatchlist' => 'Udvid overvågningslisten til at vise alle ændringer og ikke kun den nyeste',
-'tog-usenewrc' => 'Brug forbedret liste over seneste ændringer (kræver JavaScript)',
+'tog-usenewrc' => 'Gruppér ændringerne per side i listen over seneste ændringer og overvågningslisten (kræver JavaScript)',
 'tog-numberheadings' => 'Automatisk nummerering af overskrifter',
 'tog-showtoolbar' => 'Vis værktøjslinje til redigering (JavaScript)',
 'tog-editondblclick' => 'Redigér sider med dobbeltklik (JavaScript)',
 'tog-editsection' => 'Redigér afsnit ved hjælp af [redigér]-henvisninger',
 'tog-editsectiononrightclick' => 'Redigér afsnit ved at højreklikke på deres titler (JavaScript)',
 'tog-showtoc' => 'Vis indholdsfortegnelse (på sider med mere end tre afsnit)',
-'tog-rememberpassword' => 'Husk mit login på denne computer (højst $1 {{PLURAL:$1|dag|dage}})',
-'tog-watchcreations' => 'Tilføj sider jeg opretter til min overvågningsliste',
-'tog-watchdefault' => 'Tilføj sider jeg redigerer til min overvågningsliste',
-'tog-watchmoves' => 'Tilføj sider jeg flytter til min overvågningsliste',
-'tog-watchdeletion' => 'Tilføj sider jeg sletter til min overvågningsliste',
-'tog-minordefault' => 'Markér som standard alle redigering som mindre',
+'tog-rememberpassword' => 'Husk mit login i denne browser (højst $1 {{PLURAL:$1|dag|dage}})',
+'tog-watchcreations' => 'Tilføj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste',
+'tog-watchdefault' => 'Tilføj sider og filer, jeg redigerer, til min overvågningsliste',
+'tog-watchmoves' => 'Tilføj sider og filer, jeg flytter, til min overvågningsliste',
+'tog-watchdeletion' => 'Tilføj sider og filer, jeg sletter, til min overvågningsliste',
+'tog-minordefault' => 'Markér som standard alle redigeringer som mindre redigeringer',
 'tog-previewontop' => 'Vis forhåndsvisning over redigeringsboksen',
 'tog-previewonfirst' => 'Vis forhåndsvisning når du starter med at redigere',
 'tog-nocache' => 'Slå browsercaching af sider fra',
-'tog-enotifwatchlistpages' => 'Send mig en e-mail ved sideændringer',
+'tog-enotifwatchlistpages' => 'Send mig en e-mail ved ændringer til en side eller fil på min overvågningsliste',
 'tog-enotifusertalkpages' => 'Send mig en e-mail når min brugerdiskussionsside ændres',
-'tog-enotifminoredits' => 'Send mig også en e-mail ved mindre ændringer af overvågede sider',
+'tog-enotifminoredits' => 'Send mig også en e-mail ved mindre ændringer af sider og filer på min overvågningsliste',
 'tog-enotifrevealaddr' => 'Vis min e-mail-adresse i mails med besked om ændringer',
 'tog-shownumberswatching' => 'Vis antal brugere, der overvåger',
 'tog-oldsig' => 'Nuværende signatur:',
@@ -227,7 +227,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Skjul indloggede brugeres redigeringer i overvågningslisten',
 'tog-watchlisthideanons' => 'Skjul anonyme brugeres redigeringer i overvågningslisten',
 'tog-watchlisthidepatrolled' => 'Skjul patrujerede ændringer fra overvågningslisten',
-'tog-nolangconversion' => 'Deaktiver konverteringer af sprogvarianter',
 'tog-ccmeonemails' => 'Send mig kopier af e-mails som jeg sender til andre brugere',
 'tog-diffonly' => 'Vis ved versionssammenligninger kun forskelle, ikke hele siden',
 'tog-showhiddencats' => 'Vis skjulte kategorier',
@@ -311,7 +310,7 @@ $messages = array(
 'category-article-count-limited' => 'Kategorien indeholder {{PLURAL:$1|den nedenstående side|de nedenstående $1 sider}}.',
 'category-file-count' => 'Denne kategori indeholder {{PLURAL:$2|kun den nedenstående fil.|{{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}} af i alt $2.}}',
 'category-file-count-limited' => 'Kategorien indeholder {{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}}.',
-'listingcontinuesabbrev' => ' forts.',
+'listingcontinuesabbrev' => 'forts.',
 'index-category' => 'Indekserede sider',
 'noindex-category' => 'Ikke-indekserede sider',
 'broken-file-category' => 'Sider med brudte filhenvisninger',
@@ -349,7 +348,7 @@ $messages = array(
 'vector-view-create' => 'Opret',
 'vector-view-edit' => 'Redigér',
 'vector-view-history' => 'Se historik',
-'vector-view-view' => 'Vis',
+'vector-view-view' => 's',
 'vector-view-viewsource' => 'Se kilden',
 'actions' => 'Handlinger',
 'namespaces' => 'Navnerum',
@@ -371,12 +370,12 @@ $messages = array(
 'print' => 'Udskriv',
 'view' => 'Vis',
 'edit' => 'Redigér',
-'create' => 'opret',
+'create' => 'Opret',
 'editthispage' => 'Redigér side',
-'create-this-page' => 'opret ny side',
+'create-this-page' => 'Opret denne side',
 'delete' => 'Slet',
 'deletethispage' => 'Slet side',
-'undelete_short' => 'Fortryd sletning af {{PLURAL:$1|$1 version|$1 versioner}}',
+'undelete_short' => 'Fortryd sletning af {{PLURAL:$1|én version|$1 versioner}}',
 'viewdeleted_short' => 'Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}',
 'protect' => 'Beskyt',
 'protect_change' => 'ændr',
@@ -404,15 +403,15 @@ $messages = array(
 'otherlanguages' => 'Andre sprog',
 'redirectedfrom' => '(Omdirigeret fra $1)',
 'redirectpagesub' => 'Omdirigering',
-'lastmodifiedat' => 'Denne side blev senest ændret $1 $2.',
-'viewcount' => 'Siden er vist i alt $1 {{PLURAL:$1|gang|gange}}.',
+'lastmodifiedat' => 'Denne side blev senest ændret $1 kl. $2.',
+'viewcount' => 'Siden er vist i {{PLURAL:$1|en gang|$1 gange}}.',
 'protectedpage' => 'Beskyttet side',
 'jumpto' => 'Skift til:',
 'jumptonavigation' => 'Navigation',
 'jumptosearch' => 'Søgning',
 'view-pool-error' => 'Beklager, men serverne er i øjeblikket overbelastede.
-For mange brugere prøver at vise denne side.
-Vent et øjeblik, før du prøver at vise denne side ige.
+For mange brugere prøver at se denne side.
+Vent et øjeblik, før du prøver at besøge denne side igen.
 
 $1',
 'pool-timeout' => 'Timeout mens man venter på låsningen',
@@ -451,6 +450,10 @@ $1',
 'youhavenewmessages' => 'Du har $1 ($2).',
 'newmessageslink' => 'nye beskeder',
 'newmessagesdifflink' => 'ændringer siden sidste visning',
+'youhavenewmessagesfromusers' => 'Du har $1 fra {{PLURAL:$3|en anden bruger| $3 brugere}} ($2).',
+'youhavenewmessagesmanyusers' => 'Du har $1 fra mange brugere ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|en ny besked|nye beskeder}}',
+'newmessagesdifflinkplural' => 'seneste {{PLURAL:$1|ændring|ændringer}}',
 'youhavenewmessagesmulti' => 'Du har nye beskeder på $1',
 'editsection' => 'redigér',
 'editold' => 'redigér',
@@ -504,15 +507,15 @@ En liste over gyldige specialsider findes på [[Special:SpecialPages|{{int:speci
 'dberrortext' => 'Der er opstået en syntaksfejl i en databaseforespørgsel.
 Det kan tyde på en fejl i softwaren.
 Den sidst forsøgte databaseforespørgsel var:
-<blockquote><tt>$1</tt></blockquote>
-fra funktionen "<tt>$2</tt>".
-Databasen returnerede fejlen "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+fra funktionen "<code>$2</code>".
+Databasen returnerede fejlen "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Der er opstået en syntaksfejl i en databaseforespørgsel.
 Den seneste forsøgte databaseforespørgsel var:
 "$1"
 fra funktionen "$2".
 Databasen returnerede fejlen "$3: $4"',
-'laggedslavemode' => 'Bemærk: Den viste side indeholder muligvis ikke de nyeste ændringer.',
+'laggedslavemode' => "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.",
 'readonly' => 'Databasen er skrivebeskyttet',
 'enterlockreason' => 'Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornår skrivebeskyttelsen ophæves igen',
 'readonlytext' => 'Databasen er midlertidigt skrivebeskyttet. Forsøg venligst senere.
@@ -543,11 +546,14 @@ Gør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, o
 'cannotdelete' => 'Kunne ikke slette siden eller filen "$1".
 Den kan være blevet slettet af en anden.',
 'cannotdelete-title' => 'Kan ikke slette siden "$1"',
+'delete-hook-aborted' => 'Sletningen blev afbrudt af en programfunktion.
+Der var ikke nogen forklaring.',
 'badtitle' => 'Forkert titel',
-'badtitletext' => 'Den ønskede sides titel var ikke tilladt, tom eller siden er forkert henvist fra en {{SITENAME}} på et andet sprog.',
+'badtitletext' => 'Den ønskede sides titel var ikke tilladt, tom eller siden er forkert henvist fra en {{SITENAME}} på et andet sprog.
+Den kan indeholde et eller flere tegn, som ikke kan anvendes i titler.',
 'perfcached' => 'Følgende data er gemt i cachen, der muligvis ikke er helt opdateret. Der gemmes højst {{PLURAL:$1|ét resultat|$1 resultater}} i cachen.',
 'perfcachedts' => 'Disse data stammer fra cachen, som senest blev opdateret $1. Der gemmes højst {{PLURAL:$4|ét resultat|$4 resultater}} i cachen.',
-'querypage-no-updates' => "'''Aktualiseringsfunktionen for denne side er pt. deaktiveret. Dataene bliver indtil videre ikke fornyet.'''",
+'querypage-no-updates' => "'''Opdateringer til denne side er deaktiveret for øjeblikket. Dataene bliver indtil videre ikke fornyet.'''",
 'wrong_wfQuery_params' => 'Ugyldig parameter til wfQuery()<br />
 Funktion: $1<br />
 Forespørgsel: $2',
@@ -574,6 +580,8 @@ $2',
 Administratoren, som skrivebeskyttede den, gav følgende begrundelse: "$3".',
 'invalidtitle-knownnamespace' => 'Ugyldig titel med navnerummet "$2" og teksten "$3"',
 'invalidtitle-unknownnamespace' => 'Ugyldig titel med ukendt navnerum nummer $1 og tekst "$2"',
+'exception-nologin' => 'Ikke logget på',
+'exception-nologin-text' => 'Denne side eller handling kræver, at du er logget på denne wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Konfigurationsfejl: ukendt virus-scanner: ''$1''",
@@ -594,12 +602,13 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
 'remembermypassword' => 'Husk mit brugernavn på denne computer (højst $1 {{PLURAL:$1|dag|dage}})',
 'securelogin-stick-https' => 'Behold forbindelsen til HTTPS efter login',
 'yourdomainname' => 'Dit domænenavn',
+'password-change-forbidden' => 'Du kan ikke ændre adgangskoder på denne wiki.',
 'externaldberror' => 'Der er opstået en fejl i en ekstern adgangsdatabase, eller du har ikke rettigheder til at opdatere denne.',
 'login' => 'Log på',
 'nav-login-createaccount' => 'Opret en konto eller log på',
 'loginprompt' => 'Du skal have cookies slået til for at kunne logge på {{SITENAME}}.',
 'userlogin' => 'Opret en konto eller log på',
-'userloginnocreate' => 'Log ind',
+'userloginnocreate' => 'Log ',
 'logout' => 'Log af',
 'userlogout' => 'Log af',
 'notloggedin' => 'Ikke logget på',
@@ -765,7 +774,7 @@ Midlertidig adgangskode: $2',
 'summary' => 'Beskrivelse:',
 'subject' => 'Emne/overskrift:',
 'minoredit' => 'Dette er en mindre ændring.',
-'watchthis' => 'Overvåg denne artikel',
+'watchthis' => 'Overvåg denne side',
 'savearticle' => 'Gem side',
 'preview' => 'Forhåndsvisning',
 'showpreview' => 'Forhåndsvisning',
@@ -837,6 +846,10 @@ eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} oprette siden]</span>.',
 'noarticletext-nopermission' => 'Der er i øjeblikket ikke noget tekst på denne side.
 Du kan [[Special:Search/{{PAGENAME}}|søge efter denne sides titel]] på andre sider,
 eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} se de relaterede loglister]</span>.',
+'missing-revision' => 'Revision #$1 af siden med navnet "{{PAGENAME}}" eksisterer ikke.
+
+Dette skyldes normalt at et forældet historik-link er fulgt til en side der er slettet.
+Detaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletningsloggen].',
 'userpage-userdoesnotexist' => 'Brugerkontoen "<nowiki>$1</nowiki>" findes ikke. Overvej om du ønsker at oprette eller redigere denne side.',
 'userpage-userdoesnotexist-view' => 'Brugerkontoen "$1" er ikke oprettet.',
 'blocked-notice-logextract' => 'Denne bruger er i øjeblikket blokeret.
@@ -950,8 +963,13 @@ Der bør være færre end {{PLURAL:$2|$2 kald}}, lige nu er der {{PLURAL:$1|$1 k
 'parser-template-loop-warning' => 'Skabelonløkke fundet: [[$1]]',
 'parser-template-recursion-depth-warning' => 'En skabelon er rekursivt inkluderet for mange gange ($1)',
 'language-converter-depth-warning' => 'Dybdegrænse for sprogkonvertering overskredet ($1)',
+'node-count-exceeded-category' => 'Sider hvor antal noder er overskredet',
+'node-count-exceeded-warning' => 'Sider der har overskredet antallet af noder',
 'expansion-depth-exceeded-category' => 'Sider, der overskrider ekspansionsdybden',
 'expansion-depth-exceeded-warning' => 'Siden overskred ekspansionsdybden',
+'parser-unstrip-loop-warning' => 'Unstrip-loop opdaget',
+'parser-unstrip-recursion-limit' => 'Unstrip rekursionsgrænse er nået ($1)',
+'converter-manual-rule-error' => 'Fejl opdaget i manuel sprogkonvertingsregel',
 
 # "Undo" feature
 'undo-success' => 'Redigeringen kan fjernes.
@@ -1135,6 +1153,10 @@ Vær opmæksom på at bevare kontinuiteten i sidehistorikken.
 'editundo' => 'fjern redigering',
 'diff-multi' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af {{PLURAL:$2|en bruger|$2 brugere}} ikke vist)',
 'diff-multi-manyusers' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af mere end $2 {{PLURAL:$2|bruger|brugere}} ikke vist)',
+'difference-missing-revision' => '{{PLURAL:$2|En revision|$2 revisioner}} af denne forskel ($1) {{PLURAL:$2|blev|blev}} ikke fundet.
+
+Dette skyldes normalt et forældet diff link til en side der er slettet.
+Detaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletningsloggen].',
 
 # Search results
 'searchresults' => 'Søgeresultater',
@@ -1401,6 +1423,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'right-writeapi' => 'Bruge redigeringsdelen af API',
 'right-delete' => 'Slette sider',
 'right-bigdelete' => 'Slette sider med mange versioner',
+'right-deletelogentry' => 'Slet og gendan specifikke log-poster',
 'right-deleterevision' => 'Slette og gendanne enkelte versioner af sider',
 'right-deletedhistory' => 'Se slettede verioner, uden at vise versionens indhold.',
 'right-deletedtext' => 'Vise slettet tekst og ændringer i slettede revisioner',
@@ -1545,9 +1568,9 @@ Sletnings- og flytnings-loggen for denne side leveres her for nemheds skyld:",
 Gå til [[Special:FileList|listen over filer]] for at se eller søge i eksisterende filer. (Gen-)oplægnigner logges i [[Special:Log/upload|oplægningsloggen]], sletninger i [[Special:Log/delete|sletteloggen]].
 
 Brug en henvisning af en de følgende typer for at bruge en fil på en side:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnavn.jpg<nowiki>]]</nowiki></tt>''' for at bruge den fulde version af et bilede
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnavn.png|200px|thumb|left|Alternativ tekst<nowiki>]]</nowiki></tt>''' for at bruge billedet med en bredde på 200&nbsp;pixel i en ramme til venstre med \"Alternativ tekst\" som beskrivelse
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}:Filnavn.ogg<nowiki>]]</nowiki></tt>''' for at henvise direkte til filen uden at vise den",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}:Filnavn.jpg<nowiki>]]</nowiki></code>''' for at bruge den fulde version af et bilede
+*'''<code><nowiki>[[</nowiki>{{ns:file}}:Filnavn.png|200px|thumb|left|Alternativ tekst<nowiki>]]</nowiki></code>''' for at bruge billedet med en bredde på 200&nbsp;pixel i en ramme til venstre med \"Alternativ tekst\" som beskrivelse
+*'''<code><nowiki>[[</nowiki>{{ns:media}}:Filnavn.ogg<nowiki>]]</nowiki></code>''' for at henvise direkte til filen uden at vise den",
 'upload-permitted' => 'Tilladte filtyper: $1.',
 'upload-preferred' => 'Foretrukne filtyper: $1.',
 'upload-prohibited' => 'Uønskede filtyper: $1.',
@@ -1590,18 +1613,18 @@ Brug en henvisning af en de følgende typer for at bruge en fil på en side:
 'windows-nonascii-filename' => 'Denne wiki understøtter ikke filnavne, der indeholder specialtegn.',
 'fileexists' => 'En fil med det navn findes allerede, tjek venligst [[:$1]] om du er sikker på du vil ændre den.
 [[$1|thumb]]',
-'filepageexists' => "Siden med beskrivelse af denne fil er allerede oprettet på '''<tt>[[:$1]]</tt>''', men der eksisterer ikke en fil med dette navn.
+'filepageexists' => 'Siden med beskrivelse af denne fil er allerede oprettet på <strong>[[:$1]]</strong>, men der eksisterer ikke en fil med dette navn.
 Den beskrivelse du kan angive nedenfor vil derfor ikke blive brugt.
 For at få din beskrivelse vist, skal du selv redigere beskrivelsessiden.
-[[$1|thumb]]",
-'fileexists-extension' => "En fil med lignende navn findes allerede: [[$2|thumb]]
-* Navnet på den valgte fil: '''<tt>[[:$1]]</tt>'''
-* Navnet på den eksisterende fil: '''<tt>[[:$2]]</tt>'''
-Vælg venligst et andet navn.",
+[[$1|thumb]]',
+'fileexists-extension' => 'En fil med lignende navn findes allerede: [[$2|thumb]]
+* Navnet på den valgte fil: <strong>[[:$1]]</strong>
+* Navnet på den eksisterende fil: <strong>[[:$2]]</strong>
+Vælg venligst et andet navn.',
 'fileexists-thumbnail-yes' => "Det ser ud som om filen indeholder et billede i reduceret størrelse ''(thumbnail)''. [[$1|thumb]]
-Kontroller filen '''<tt>[[:$1]]</tt>'''.
+Kontroller filen <strong>[[:$1]]</strong>.
 Hvis det er billedet i original størrelse, er det ikke nødvendigt at uploade et separat forhåndsvisningsbillede.",
-'file-thumbnail-no' => "Filnavnet begynder med '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Filnavnet begynder med <strong>$1</strong>.
 Det tyder på et billede i reduceret format ''(thumbnail)''.
 Hvis du har billedet i fuld størrelse, så brug det i stedet. Ellers bedes du venligst ændre filnavnet.",
 'fileexists-forbidden' => 'En fil med dette navn findes allerede, og den kan ikke overskrives.
@@ -1681,6 +1704,11 @@ Informer venligst en [[Special:ListUsers/sysop|systemadministrator]].',
 'backend-fail-internal' => 'En ukendt fejl opstod i filbackend "$1".',
 'backend-fail-contenttype' => 'Kunne ikke bestemme typen af indhold i filen, der skal gemmes på "$1".',
 'backend-fail-batchsize' => 'Lagringsbackend gav en batch på $1 fil{{PLURAL:$1|operation|operationer}}; grænsen er $2 {{PLURAL:$2|operation|operationer}}.',
+'backend-fail-usable' => 'Kunne ikke skrive til filen "$1" på grund af manglende rettigheder eller manglende mapper/containere.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Kunne ikke tilslutte til journal databasen for lager backenden "$1".',
+'filejournal-fail-dbquery' => 'Kunne ikke opdatere journal databasen for lager backenden "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => 'Kunne ikke låse "$1" op, da den ikke er låst.',
@@ -1691,6 +1719,7 @@ Informer venligst en [[Special:ListUsers/sysop|systemadministrator]].',
 'lockmanager-fail-releaselock' => 'Kunne ikke frigive låsen for "$1".',
 'lockmanager-fail-db-bucket' => 'Kunne ikke kontakte nok låsedatabaser i bøtten $1.',
 'lockmanager-fail-db-release' => 'Kunne ikke frigive lås til databasen $1.',
+'lockmanager-fail-svr-acquire' => 'Kunne ikke hente lås på serveren $1.',
 'lockmanager-fail-svr-release' => 'Kunne ikke frigive låse til serveren $1.',
 
 # ZipDirectoryReader
@@ -1841,7 +1870,7 @@ Måske vil du redigere beskrivelsen på dens [$2 filbeskrivelsesside] der.',
 
 # MIME search
 'mimesearch' => 'Søge efter MIME-type',
-'mimesearch-summary' => 'På denne specialside kan filerne filtreres efter MIME-typen. Indtastningen skal altid indeholde medie- og undertypen: <tt>image/jpeg</tt> (se billedbeskrivelsessiden).',
+'mimesearch-summary' => 'På denne specialside kan filerne filtreres efter MIME-typen. Indtastningen skal altid indeholde medie- og undertypen: <code>image/jpeg</code> (se billedbeskrivelsessiden).',
 'mimetype' => 'MIME-type:',
 'download' => 'DownloadHerunterladen',
 
@@ -1888,7 +1917,9 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
 
 'disambiguations' => 'Sider, der henviser til flertydige titler',
 'disambiguationspage' => 'Template:Flertydig',
-'disambiguations-text' => 'De følgende sider henviser til en flertydig titel. De bør henvise direkte til det passende emne i stedet. En side behandles som en side med en flertydig titel hvis den bruger en skabelon som er henvist til fra [[MediaWiki:Disambiguationspage]].',
+'disambiguations-text' => "De følgende sider henviser til mindst en side med en '''flertydig titel'''.
+De bør henvise direkte til et mere passende emne i stedet.<br />
+En side behandles som en side med en flertydig titel hvis den bruger en skabelon som der er henvist til fra [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dobbelte omdirigeringer',
 'doubleredirectstext' => 'Dette er en liste over sider som omdirigerer til andre omdirigeringssider.
@@ -2040,7 +2071,7 @@ Se også [[Special:WantedCategories|ønskede kategorier]].',
 'linksearch-ok' => 'Søg',
 'linksearch-text' => 'Wildcards som "*.wikipedia.org" kan benyttes.
 Der skal som minimum angives et topniveau-domæne som f. eks. "*.org".<br />
-Understøttede protokoller: <tt>$1</tt> (tilføj ikke protokollerne til din søgning).',
+Understøttede protokoller: <code>$1</code> (tilføj ikke protokollerne til din søgning).',
 'linksearch-line' => '$2 linker til $1',
 'linksearch-error' => 'Wildcards må kun benyttes i starten af hostnavnet.',
 
@@ -2221,13 +2252,15 @@ Bekræft venligst at du virkelig vil gøre dette, at du forstår konsekvenserne,
 ** Overtrædelse af ophavsret
 ** Hærværk',
 'delete-edit-reasonlist' => 'Rediger sletningsårsager',
-'delete-toobig' => 'Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}}. Sletning af sådanne sider er begrænset blevet for at forhindre utilsigtet forstyrrelse af {{SITENAME}}.',
+'delete-toobig' => 'Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}}. Sletning af sådanne sider er begrænset, for at forhindre utilsigtet forstyrrelse af {{SITENAME}}.',
 'delete-warning-toobig' => 'Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}} versioner, slettes den kan det forstyrre driften af {{SITENAME}}, gå forsigtigt frem.',
 
 # Rollback
 'rollback' => 'Fjern redigeringer',
 'rollback_short' => 'Fjern redigering',
 'rollbacklink' => 'rul tilbage',
+'rollbacklinkcount' => 'tilbagefør $1 {{PLURAL:$1|redigering|redigeringer}}',
+'rollbacklinkcount-morethan' => 'tilbagefør mere end $1 {{PLURAL:$1|redigering|redigeringer}}',
 'rollbackfailed' => 'Kunne ikke fjerne redigeringen',
 'cantrollback' => 'Kan ikke fjerne redigering; den sidste bruger er den eneste forfatter.',
 'alreadyrolled' => 'Kan ikke fjerne den seneste redigering af [[:$1]] foretaget af [[User:$2|$2]] ([[User talk:$2|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2734,6 +2767,8 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
 'import-error-interwiki' => 'Siden "$1" importeres ikke, da dens navn er reserveret for eksterne henvisninger (interwiki).',
 'import-error-special' => 'Siden "$1" importeres ikke, da den tilhører et særligt navnerum, der ikke tillader sider.',
 'import-error-invalid' => 'Siden "$1" importeres ikke, da dens navn er ugyldigt.',
+'import-rootpage-invalid' => 'Den rodside der er angivet har en ugyldig titel.',
+'import-rootpage-nosubpage' => 'Navnerummet "$1" tillader ikke undersider af rodsiderne.',
 
 # Import log
 'importlogpage' => 'Importlog',
@@ -2856,19 +2891,15 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'spambot_username' => 'MediaWiki spam-rensning',
 'spam_reverting' => 'Sidste version uden henvisning til $1 gendannet.',
 'spam_blanking' => 'Alle versioner, som indeholdt henvisninger til $1, er renset.',
+'spam_deleting' => 'Alle versioner indeholder henvisninger til $1, sletter',
 
 # Info page
 'pageinfo-title' => 'Information om "$1"',
 'pageinfo-header-edits' => 'Redigeringer',
-'pageinfo-header-watchlist' => 'Overvågningsliste',
-'pageinfo-header-views' => 'Visninger',
-'pageinfo-subjectpage' => 'Side',
-'pageinfo-talkpage' => 'Diskussionsside',
+'pageinfo-views' => 'Antal visninger',
 'pageinfo-watchers' => 'Antal brugere, der overvåger siden',
 'pageinfo-edits' => 'Antal redigeringer',
 'pageinfo-authors' => 'Antal forskellige forfattere',
-'pageinfo-views' => 'Antal visninger',
-'pageinfo-viewsperedit' => 'Visninger per redigering',
 
 # Skin names
 'skinname-standard' => 'Klassik',
@@ -3586,7 +3617,7 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 * <span class="mw-specialpagerestricted">Specialsider med begrænset adgang.</span>',
 'specialpages-group-maintenance' => 'Vedligeholdelsesside',
 'specialpages-group-other' => 'Andre specialsider',
-'specialpages-group-login' => 'Opret bruger / logon',
+'specialpages-group-login' => 'Log på / opret bruger',
 'specialpages-group-changes' => 'Seneste ændringer og loglister',
 'specialpages-group-media' => 'Mediafiler og oplægning',
 'specialpages-group-users' => 'Brugere og rettigheder',
@@ -3720,9 +3751,12 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
 'api-error-empty-file' => 'Den fil du indsendte var tom.',
 'api-error-emptypage' => 'Det er ikke tilladt at oprette nye, tomme sider.',
 'api-error-fetchfileerror' => 'Intern fejl: noget gik galt under hentningen af filen.',
+'api-error-fileexists-forbidden' => 'En fil med navnet "$1" findes allerede, og den kan ikke overskrives.',
+'api-error-fileexists-shared-forbidden' => 'En fil med navnet "$1" eksisterer allerede i det delte filsystem og kan ikke overskrives.',
 'api-error-file-too-large' => 'Den fil du indsendte var for stor.',
 'api-error-filename-tooshort' => 'Filnavnet er for kort.',
 'api-error-filetype-banned' => 'Denne type fil er ikke tilladt.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|er ikke en tilladt filtype|er ikke tilladte filtyper}}. Tilladt {{PLURAL:$3|filtype er|filtyper er}} $2.',
 'api-error-filetype-missing' => 'Filen mangler en filendelse.',
 'api-error-hookaborted' => 'Ændringen, du forsøgte at gøre, blev afbrudt af en udvidelsestilkobling.',
 'api-error-http' => 'Intern fejl: Kan ikke forbinde til serveren.',
index 5060f68..72f9a97 100644 (file)
@@ -157,6 +157,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIME-Typ-Suche' ),
        'Mostcategories'            => array( 'Meistkategorisierte_Seiten' ),
        'Mostimages'                => array( 'Meistbenutzte_Dateien' ),
+       'Mostinterwikis'            => array( 'Meiste_Interwikilinks' ),
        'Mostlinked'                => array( 'Meistverlinkte_Seiten' ),
        'Mostlinkedcategories'      => array( 'Meistbenutzte_Kategorien' ),
        'Mostlinkedtemplates'       => array( 'Meistbenutzte_Vorlagen' ),
@@ -245,150 +246,153 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#WEITERLEITUNG', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__KEIN_INHALTSVERZEICHNIS__', '__KEININHALTSVERZEICHNIS__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__KEINE_GALERIE__', '__KEINEGALERIE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__INHALTSVERZEICHNIS__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__KEINKOPF__', '__KEIN_HEADER__', '__KEIN_KOPF__', '__KEINHEADER__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'JETZIGER_MONAT_1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'JETZIGER_MONATSNAME_KURZ', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'JETZIGER_KALENDERTAG_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'JETZIGE_STUNDE', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LOKALER_MONAT', 'LOKALER_MONAT_2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LOKALER_MONAT_1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'LOKALER_MONATSNAME', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'LOKALER_MONATSNAME_GENITIV', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'LOKALER_MONATSNAME_KURZ', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'LOKALER_KALENDERTAG', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'LOKALER_KALENDERTAG_2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'LOKALER_WOCHENTAG', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'LOKALES_JAHR', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LOKALE_UHRZEIT', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'LOKALE_STUNDE', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'SEITENANZAHL', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'DATEIANZAHL', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'BEARBEITUNGSANZAHL', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'BETRACHTUNGEN', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'SEITENNAME', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'SEITENNAME_URL', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NAMENSRAUM', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NAMENSRAUM_URL', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'DISKUSSIONSNAMENSRAUM', 'DISK_NR', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'DISKUSSIONSNAMENSRAUM_URL', 'DISK_NR_URL', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'HAUPTNAMENSRAUM_URL', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'VOLLER_SEITENNAME', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'VOLLER_SEITENNAME_URL', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'UNTERSEITE', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'UNTERSEITE_URL', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'OBERSEITE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'OBERSEITE_URL', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'DISKUSSIONSSEITE', 'DISK', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'DISKUSSIONSSEITE_URL', 'DISK_URL', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'HAUPTSEITE_URL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'subst'                   => array( '0', 'ERS:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'SICHER_ERS:', 'SICHERERS:', 'SAFESUBST:' ),
-       'img_thumbnail'           => array( '1', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniatur=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'rechts', 'right' ),
-       'img_left'                => array( '1', 'links', 'left' ),
-       'img_none'                => array( '1', 'ohne', 'none' ),
-       'img_center'              => array( '1', 'zentriert', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'gerahmt', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'rahmenlos', 'frameless' ),
-       'img_page'                => array( '1', 'seite=$1', 'seite_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'hochkant', 'hochkant=$1', 'hochkant $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'rand', 'border' ),
-       'img_baseline'            => array( '1', 'grundlinie', 'baseline' ),
-       'img_sub'                 => array( '1', 'tiefgestellt', 'tief', 'sub' ),
-       'img_super'               => array( '1', 'hochgestellt', 'hoch', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'oben', 'top' ),
-       'img_text_top'            => array( '1', 'text-oben', 'text-top' ),
-       'img_middle'              => array( '1', 'mitte', 'middle' ),
-       'img_bottom'              => array( '1', 'unten', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'text-unten', 'text-bottom' ),
-       'img_link'                => array( '1', 'verweis=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'alternativtext=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'NACHRICHT:', 'INT:' ),
-       'sitename'                => array( '1', 'PROJEKTNAME', 'SITENAME' ),
-       'ns'                      => array( '0', 'NR:', 'NS:' ),
-       'nse'                     => array( '0', 'NR_URL:', 'NSE:' ),
-       'localurl'                => array( '0', 'LOKALE_URL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALE_URL_C:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'ARTIKELPFAD', 'ARTICLEPATH' ),
-       'scriptpath'              => array( '0', 'SKRIPTPFAD', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'STILPFAD', 'STYLEPFAD', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GESCHLECHT:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__KEINE_TITELKONVERTIERUNG__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__KEINE_INHALTSKONVERTIERUNG__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'JETZIGE_KALENDERWOCHE', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'JETZIGER_WOCHENTAG_ZAHL', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'LOKALE_KALENDERWOCHE', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'LOKALER_WOCHENTAG_ZAHL', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'REVISIONSID', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'REVISIONSTAG', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'REVISIONSTAG2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'REVISIONSMONAT', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'REVISIONSMONAT1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'REVISIONSJAHR', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'REVISIONSZEITSTEMPEL', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'REVISIONSBENUTZER', 'REVISIONUSER' ),
-       'fullurl'                 => array( '0', 'VOLLSTÄNDIGE_URL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'VOLLSTÄNDIGE_URL_C:', 'FULLURLE:' ),
-       'canonicalurl'            => array( '0', 'KANONISCHE_URL:', 'CANONICALURL:' ),
-       'canonicalurle'           => array( '0', 'KANONISCHE_URL_C:', 'CANONICALURLE:' ),
-       'lcfirst'                 => array( '0', 'INITIAL_KLEIN:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'INITIAL_GROSS:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'KLEIN:', 'LC:' ),
-       'uc'                      => array( '0', 'GROSS:', 'UC:' ),
-       'raw'                     => array( '0', 'ROH:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'SEITENTITEL', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__NEUER_ABSCHNITTSLINK__', '__PLUS_LINK__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__KEIN_NEUER_ABSCHNITTSLINK__', '__KEIN_PLUS_LINK__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'JETZIGE_VERSION', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'URLENKODIERT:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ANKERENKODIERT:', 'SPRUNGMARKEENKODIERT:', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'JETZIGER_ZEITSTEMPEL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'LOKALER_ZEITSTEMPEL', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'TEXTAUSRICHTUNG', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#SPRACHE:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'INHALTSSPRACHE', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'SEITEN_IM_NAMENSRAUM:', 'SEITEN_IN_NR:', 'SEITEN_NR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ADMINANZAHL', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ZAHLENFORMAT', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'FÜLLENLINKS', 'PADLEFT' ),
-       'padright'                => array( '0', 'FÜLLENRECHTS', 'PADRIGHT' ),
-       'special'                 => array( '0', 'spezial', 'special' ),
-       'defaultsort'             => array( '1', 'SORTIERUNG:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'DATEIPFAD:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'markierung', 'tag' ),
-       'hiddencat'               => array( '1', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'SEITEN_IN_KATEGORIE', 'SEITEN_KAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'SEITENGRÖSSE', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDIZIEREN__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__NICHT_INDIZIEREN__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'BENUTZER_IN_GRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__PERMANENTE_WEITERLEITUNG__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'SCHUTZSTATUS', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'DATUMSFORMAT', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'PFAD', 'PATH' ),
-       'url_query'               => array( '0', 'ABFRAGE', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', 'keinfehler', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', 'keineersetzung', 'noreplace' ),
+       'redirect'                  => array( '0', '#WEITERLEITUNG', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__KEIN_INHALTSVERZEICHNIS__', '__KEININHALTSVERZEICHNIS__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__KEINE_GALERIE__', '__KEINEGALERIE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__INHALTSVERZEICHNIS__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__KEINKOPF__', '__KEIN_HEADER__', '__KEIN_KOPF__', '__KEINHEADER__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'JETZIGER_MONAT_1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'JETZIGER_MONATSNAME_KURZ', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'JETZIGER_KALENDERTAG_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'JETZIGE_STUNDE', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LOKALER_MONAT', 'LOKALER_MONAT_2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LOKALER_MONAT_1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'LOKALER_MONATSNAME', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'LOKALER_MONATSNAME_GENITIV', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'LOKALER_MONATSNAME_KURZ', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'LOKALER_KALENDERTAG', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKALER_KALENDERTAG_2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'LOKALER_WOCHENTAG', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'LOKALES_JAHR', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LOKALE_UHRZEIT', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'LOKALE_STUNDE', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'SEITENANZAHL', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'DATEIANZAHL', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'BEARBEITUNGSANZAHL', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'BETRACHTUNGEN', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'SEITENNAME', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'SEITENNAME_URL', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NAMENSRAUM', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NAMENSRAUM_URL', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'NAMENSRAUMNUMMER', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'DISKUSSIONSNAMENSRAUM', 'DISK_NR', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'DISKUSSIONSNAMENSRAUM_URL', 'DISK_NR_URL', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'HAUPTNAMENSRAUM_URL', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'VOLLER_SEITENNAME', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'VOLLER_SEITENNAME_URL', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'UNTERSEITE', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'UNTERSEITE_URL', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'OBERSEITE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'OBERSEITE_URL', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'DISKUSSIONSSEITE', 'DISK', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'DISKUSSIONSSEITE_URL', 'DISK_URL', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'HAUPTSEITE_URL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'subst'                     => array( '0', 'ERS:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'SICHER_ERS:', 'SICHERERS:', 'SAFESUBST:' ),
+       'img_thumbnail'             => array( '1', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniatur=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'rechts', 'right' ),
+       'img_left'                  => array( '1', 'links', 'left' ),
+       'img_none'                  => array( '1', 'ohne', 'none' ),
+       'img_center'                => array( '1', 'zentriert', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'gerahmt', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'rahmenlos', 'frameless' ),
+       'img_page'                  => array( '1', 'seite=$1', 'seite_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'hochkant', 'hochkant=$1', 'hochkant $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'rand', 'border' ),
+       'img_baseline'              => array( '1', 'grundlinie', 'baseline' ),
+       'img_sub'                   => array( '1', 'tiefgestellt', 'tief', 'sub' ),
+       'img_super'                 => array( '1', 'hochgestellt', 'hoch', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'oben', 'top' ),
+       'img_text_top'              => array( '1', 'text-oben', 'text-top' ),
+       'img_middle'                => array( '1', 'mitte', 'middle' ),
+       'img_bottom'                => array( '1', 'unten', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'text-unten', 'text-bottom' ),
+       'img_link'                  => array( '1', 'verweis=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'alternativtext=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'NACHRICHT:', 'INT:' ),
+       'sitename'                  => array( '1', 'PROJEKTNAME', 'SITENAME' ),
+       'ns'                        => array( '0', 'NR:', 'NS:' ),
+       'nse'                       => array( '0', 'NR_URL:', 'NSE:' ),
+       'localurl'                  => array( '0', 'LOKALE_URL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALE_URL_C:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ARTIKELPFAD', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'SEITENID', 'SEITENKENNUNG', 'PAGEID' ),
+       'scriptpath'                => array( '0', 'SKRIPTPFAD', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'STILPFAD', 'STYLEPFAD', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GESCHLECHT:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__KEINE_TITELKONVERTIERUNG__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__KEINE_INHALTSKONVERTIERUNG__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'JETZIGE_KALENDERWOCHE', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'JETZIGER_WOCHENTAG_ZAHL', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'LOKALE_KALENDERWOCHE', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'LOKALER_WOCHENTAG_ZAHL', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'REVISIONSID', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'REVISIONSTAG', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'REVISIONSTAG2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'REVISIONSMONAT', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'REVISIONSMONAT1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'REVISIONSJAHR', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'REVISIONSZEITSTEMPEL', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'REVISIONSBENUTZER', 'REVISIONUSER' ),
+       'fullurl'                   => array( '0', 'VOLLSTÄNDIGE_URL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'VOLLSTÄNDIGE_URL_C:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'KANONISCHE_URL:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'KANONISCHE_URL_C:', 'CANONICALURLE:' ),
+       'lcfirst'                   => array( '0', 'INITIAL_KLEIN:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'INITIAL_GROSS:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'KLEIN:', 'LC:' ),
+       'uc'                        => array( '0', 'GROSS:', 'UC:' ),
+       'raw'                       => array( '0', 'ROH:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'SEITENTITEL', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__NEUER_ABSCHNITTSLINK__', '__PLUS_LINK__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__KEIN_NEUER_ABSCHNITTSLINK__', '__KEIN_PLUS_LINK__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'JETZIGE_VERSION', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'URLENKODIERT:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ANKERENKODIERT:', 'SPRUNGMARKEENKODIERT:', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'JETZIGER_ZEITSTEMPEL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'LOKALER_ZEITSTEMPEL', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'TEXTAUSRICHTUNG', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#SPRACHE:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'INHALTSSPRACHE', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'SEITEN_IM_NAMENSRAUM:', 'SEITEN_IN_NR:', 'SEITEN_NR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ADMINANZAHL', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ZAHLENFORMAT', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'FÜLLENLINKS', 'PADLEFT' ),
+       'padright'                  => array( '0', 'FÜLLENRECHTS', 'PADRIGHT' ),
+       'special'                   => array( '0', 'spezial', 'special' ),
+       'speciale'                  => array( '0', 'speziale', 'speciale' ),
+       'defaultsort'               => array( '1', 'SORTIERUNG:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'DATEIPFAD:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'erweiterung', 'tag' ),
+       'hiddencat'                 => array( '1', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'SEITEN_IN_KATEGORIE', 'SEITEN_KAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'SEITENGRÖSSE', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDIZIEREN__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NICHT_INDIZIEREN__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'BENUTZER_IN_GRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__PERMANENTE_WEITERLEITUNG__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'SCHUTZSTATUS', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'DATUMSFORMAT', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'PFAD', 'PATH' ),
+       'url_query'                 => array( '0', 'ABFRAGE', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'keinfehler', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'keineersetzung', 'noreplace' ),
 );
 
 $imageFiles = array(
@@ -404,7 +408,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden',
 'tog-newpageshidepatrolled' => 'Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden',
 'tog-extendwatchlist' => 'Erweiterte Beobachtungsliste zur Anzeige aller Änderungen',
-'tog-usenewrc' => 'Erweiterte Darstellung der „Letzten Änderungen“ (benötigt JavaScript)',
+'tog-usenewrc' => 'Seitenbezogene Gruppierung bei den „Letzten Änderungen“ und auf der Beobachtungsliste (benötigt JavaScript)',
 'tog-numberheadings' => 'Überschriften automatisch nummerieren',
 'tog-showtoolbar' => 'Bearbeiten-Werkzeugleiste anzeigen (benötigt JavaScript)',
 'tog-editondblclick' => 'Seiten mit Doppelklick bearbeiten (benötigt JavaScript)',
@@ -412,24 +416,24 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Einzelne Abschnitte per Rechtsklick bearbeiten (benötigt JavaScript)',
 'tog-showtoc' => 'Anzeige eines Inhaltsverzeichnisses auf Seiten mit mehr als drei Überschriften',
 'tog-rememberpassword' => 'Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})',
-'tog-watchcreations' => 'Selbst erstellte Seiten automatisch beobachten',
-'tog-watchdefault' => 'Selbst geänderte Seiten automatisch beobachten',
-'tog-watchmoves' => 'Selbst verschobene Seiten automatisch beobachten',
-'tog-watchdeletion' => 'Selbst gelöschte Seiten automatisch beobachten',
+'tog-watchcreations' => 'Selbst erstellte Seiten und hochgeladene Dateien automatisch beobachten',
+'tog-watchdefault' => 'Selbst geänderte Seiten und Dateien automatisch beobachten',
+'tog-watchmoves' => 'Selbst verschobene Seiten und Dateien automatisch beobachten',
+'tog-watchdeletion' => 'Selbst gelöschte Seiten und Dateien automatisch beobachten',
 'tog-minordefault' => 'Eigene Änderungen standardmäßig als geringfügig markieren',
 'tog-previewontop' => 'Vorschau oberhalb des Bearbeitungsfensters anzeigen',
 'tog-previewonfirst' => 'Beim ersten Bearbeiten immer die Vorschau anzeigen',
 'tog-nocache' => 'Seitencache des Browsers deaktivieren',
-'tog-enotifwatchlistpages' => 'Bei Änderungen an beobachteten Seiten E-Mails senden',
+'tog-enotifwatchlistpages' => 'Bei Änderungen an beobachteten Seiten oder Dateien E-Mails senden',
 'tog-enotifusertalkpages' => 'Bei Änderungen an meiner Benutzer-Diskussionsseite E-Mails senden',
-'tog-enotifminoredits' => 'Auch bei kleinen Änderungen an Seiten E-Mails senden',
+'tog-enotifminoredits' => 'Auch bei kleinen Änderungen an Seiten und Dateien E-Mails senden',
 'tog-enotifrevealaddr' => 'Meine E-Mail-Adresse in Benachrichtigungs-E-Mails anzeigen',
 'tog-shownumberswatching' => 'Anzahl der beobachtenden Benutzer anzeigen',
 'tog-oldsig' => 'Vorhandene Signatur:',
 'tog-fancysig' => 'Signatur als Wikitext behandeln (ohne automatische Verlinkung)',
 'tog-externaleditor' => 'Externen Editor standardmäßig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
 'tog-externaldiff' => 'Externes Programm standardmäßig für Versionsunterschiede nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
-'tog-showjumplinks' => '„Wechseln zu“-Links aktivieren',
+'tog-showjumplinks' => '„Wechseln-zu“-Links aktivieren',
 'tog-uselivepreview' => 'Vorschau sofort anzeigen (benötigt JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Warnen, sofern beim Speichern die Zusammenfassung fehlt',
 'tog-watchlisthideown' => 'Eigene Bearbeitungen in der Beobachtungsliste ausblenden',
@@ -438,9 +442,8 @@ $messages = array(
 'tog-watchlisthideliu' => 'Bearbeitungen angemeldeter Benutzer in der Beobachtungsliste ausblenden',
 'tog-watchlisthideanons' => 'Bearbeitungen anonymer Benutzer (IP-Adressen) in der Beobachtungsliste ausblenden',
 'tog-watchlisthidepatrolled' => 'Kontrollierte Änderungen in der Beobachtungsliste ausblenden',
-'tog-nolangconversion' => 'Konvertierung von Sprachvarianten deaktivieren',
 'tog-ccmeonemails' => 'Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende',
-'tog-diffonly' => 'Zeige beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite',
+'tog-diffonly' => 'Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen',
 'tog-showhiddencats' => 'Anzeige versteckter Kategorien',
 'tog-noconvertlink' => 'Konvertierung des Titels deaktivieren',
 'tog-norollbackdiff' => 'Unterschied nach dem Zurücksetzen unterdrücken',
@@ -664,6 +667,10 @@ Siehe die [[Special:Version|Versionsseite]]',
 'youhavenewmessages' => 'Du hast $1 ($2).',
 'newmessageslink' => 'neue Nachrichten',
 'newmessagesdifflink' => 'Letzte Änderung',
+'youhavenewmessagesfromusers' => 'Du hast $1 von {{PLURAL:$3|einem anderen Benutzer|$3 Benutzern}} ($2).',
+'youhavenewmessagesmanyusers' => 'Du hast $1 von vielen Benutzern ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|eine neue Nachricht|neue Nachrichten}}',
+'newmessagesdifflinkplural' => 'letzte {{PLURAL:$1|Änderung|Änderungen}}',
 'youhavenewmessagesmulti' => 'Du hast neue Nachrichten: $1',
 'editsection' => 'Bearbeiten',
 'editold' => 'Bearbeiten',
@@ -718,9 +725,9 @@ Alle verfügbaren Spezialseiten sind in der [[Special:SpecialPages|Liste der Spe
 'dberrortext' => 'Es ist ein Datenbankfehler aufgetreten.
 Der Grund kann ein Programmierfehler sein.
 Die letzte Datenbankabfrage lautete:
-<blockquote><tt>$1</tt></blockquote>
-aus der Funktion „<tt>$2</tt>“.
-Die Datenbank meldete den Fehler „<tt>$3: $4</tt>“.',
+<blockquote><code>$1</code></blockquote>
+aus der Funktion „<code>$2</code>“.
+Die Datenbank meldete den Fehler „<samp>$3: $4</samp>“.',
 'dberrortextcl' => 'Es gab einen Syntaxfehler in der Datenbankabfrage.
 Die letzte Datenbankabfrage lautete: „$1“ aus der Funktion „<tt>$2</tt>“.
 Die Datenbank meldete den Fehler: „<tt>$3: $4</tt>“.',
@@ -754,6 +761,8 @@ Falls dies nicht  zutrifft, hast du eventuell einen Fehler in der Software gefun
 'cannotdelete' => 'Die Seite oder Datei „$1“ kann nicht gelöscht werden.
 Möglicherweise wurde sie bereits von jemand anderem gelöscht.',
 'cannotdelete-title' => 'Seite „$1“ kann nicht gelöscht werden',
+'delete-hook-aborted' => 'Die Löschung wurde von einer Programmerweiterung zu MediaWiki verhindert.
+Es ist hierzu keine Erklärung verfügbar.',
 'badtitle' => 'Ungültiger Titel',
 'badtitletext' => 'Der Titel der angeforderten Seite ist ungültig, leer oder ein ungültiger Sprachlink von einem anderen Wiki.',
 'perfcached' => 'Die folgenden Daten stammen aus dem Cache und sind möglicherweise nicht aktuell. Maximal {{PLURAL:$1|ein Ergebnis ist|$1 Ergebnisse sind}} im Cache verfügbar.',
@@ -775,7 +784,7 @@ Bitte versuche es in ein paar Minuten erneut.',
 'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
 Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche aus.
 Ziehe bitte im Fall von Übersetzungen in Betracht, diese bei [//translatewiki.net/wiki/Main_Page?setlang=de translatewiki.net], der Lokalisierungsplattform für MediaWiki, durchzuführen.",
-'sqlhidden' => '(SQL-Abfrage versteckt)',
+'sqlhidden' => "''Die SQL-Datenbankabfrage ist verborgen.''",
 'cascadeprotected' => 'Diese Seite ist zur Bearbeitung gesperrt. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:
 $2',
 'namespaceprotected' => "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
@@ -789,6 +798,8 @@ Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''„$2“'' eingerich
 Der Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: „$3“.',
 'invalidtitle-knownnamespace' => 'Ungültiger Titel mit Namensraum „$2“ und Text „$3“',
 'invalidtitle-unknownnamespace' => 'Ungültiger Titel mit unbekannter Namensraumnummer $1 und Text „$2“',
+'exception-nologin' => 'Nicht angemeldet',
+'exception-nologin-text' => 'Diese Seite oder Aktion erfordert, dass du auf diesem Wiki angemeldet bist.',
 
 # Virus scanner
 'virus-badscanner' => "Fehlerhafte Konfiguration: unbekannter Virenscanner: ''$1''",
@@ -810,6 +821,7 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] anzupass
 'remembermypassword' => 'Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})',
 '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.',
 'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder du darfst dein externes Benutzerkonto nicht aktualisieren.',
 'login' => 'Anmelden',
 'nav-login-createaccount' => 'Anmelden / Benutzerkonto erstellen',
@@ -1045,6 +1057,10 @@ oder die zugehörigen <span class="plainlinks">[{{fullurl:{{#special:Log}}|page=
 'noarticletext-nopermission' => 'Diese Seite enthält momentan noch keinen Text.
 Du kannst ihren Titel auf anderen Seiten [[Special:Search/{{PAGENAME}}|suchen]]
 oder die zugehörigen <span class="plainlinks">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbücher betrachten].</span>',
+'missing-revision' => 'Die Version $1 der Seite namens „{{PAGENAME}}“ ist nicht vorhanden.
+
+Dieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.
+Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] einsehbar.',
 'userpage-userdoesnotexist' => 'Das Benutzerkonto „<nowiki>$1</nowiki>“ ist nicht vorhanden. Bitte prüfe, ob du diese Seite wirklich erstellen/bearbeiten willst.',
 'userpage-userdoesnotexist-view' => 'Das Benutzerkonto „$1“ ist nicht vorhanden.',
 'blocked-notice-logextract' => '{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist zurzeit gesperrt.
@@ -1053,8 +1069,7 @@ Zur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:',
 * '''Firefox/Safari:''' ''Umschalttaste'' drücken und gleichzeitig ''Aktualisieren'' anklicken oder entweder ''Strg+F5'' oder ''Strg+R'' (''⌘+R'' auf dem Mac) drücken
 * '''Google Chrome:''' ''Umschalttaste+Strg+R'' (''⌘+Umschalttaste+R'' auf dem Mac) drücken
 * '''Internet Explorer:''' ''Strg+F5'' drücken oder ''Strg'' drücken und gleichzeitig ''Aktualisieren'' anklicken
-* '''Opera:''' ''Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen''
-* '''Konqueror:''' ''Aktualisieren'' anklicken oder ''F5'' drücken",
+* '''Opera:''' ''Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen''",
 'usercssyoucanpreview' => "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues CSS vor dem Speichern zu testen.",
 'userjsyoucanpreview' => "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues JavaScript vor dem Speichern zu testen.",
 'usercsspreview' => "'''Beachte, dass du nur eine Vorschau deines Benutzer-CSS betrachtest.'''
@@ -1168,6 +1183,7 @@ Sie darf nicht mehr als $2 {{PLURAL:$2|Aufruf|Aufrufe}} haben, es {{PLURAL:$1|is
 'expansion-depth-exceeded-warning' => 'Die Seite hat die Expansionstiefe überschritten.',
 'parser-unstrip-loop-warning' => 'Zirkelbezug festgestellt',
 'parser-unstrip-recursion-limit' => 'Rekursionsgrenze beim Auflösen überschritten ($1)',
+'converter-manual-rule-error' => 'Bei der manuellen Sprachkonvertierungsregel wurde ein Fehler entdeckt.',
 
 # "Undo" feature
 'undo-success' => 'Die Bearbeitung kann rückgängig gemacht werden.
@@ -1352,6 +1368,10 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
 'editundo' => 'rückgängig machen',
 'diff-multi' => '({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem Benutzer|$2 Benutzern}} {{PLURAL:$1|wird|werden}} nicht angezeigt)',
 'diff-multi-manyusers' => '({{PLURAL:$1|$1 dazwischenliegende Versionen}} von mehr als {{PLURAL:$2|$2 Benutzern}}, die nicht angezeigt werden)',
+'difference-missing-revision' => '{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.
+
+Dieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.
+Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] vorhanden.',
 
 # Search results
 'searchresults' => 'Suchergebnisse',
@@ -1618,6 +1638,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'right-writeapi' => 'Benutzung der writeAPI',
 'right-delete' => 'Seiten löschen',
 'right-bigdelete' => 'Seiten mit großer Versionsgeschichte löschen',
+'right-deletelogentry' => 'Einzelne Logbuch-Einträge löschen und wiederherstellen',
 'right-deleterevision' => 'Einzelne Versionen einer Seite löschen und wiederherstellen',
 'right-deletedhistory' => 'Gelöschte Versionen in der Versionsgeschichte ansehen, ohne zugehörigen Text',
 'right-deletedtext' => 'Gelöschte Texte und Versionsunterschiede zwischen gelöschten Versionen ansehen',
@@ -1631,7 +1652,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'right-ipblock-exempt' => 'Ausnahme von IP-Sperren, automatischen Sperren und Rangesperren',
 'right-proxyunbannable' => 'Ausnahme von automatischen Proxysperren',
 'right-unblockself' => 'Sich selbst entsperren',
-'right-protect' => 'Seitenschutzstatus ändern',
+'right-protect' => 'Seitenschutzstatus ändern und geschützte Seiten bearbeiten',
 'right-editprotected' => 'Geschützte Seiten bearbeiten (ohne Kaskadenschutz)',
 'right-editinterface' => 'Benutzeroberfläche bearbeiten',
 'right-editusercssjs' => 'Fremde CSS- und JavaScript-Dateien bearbeiten',
@@ -1764,9 +1785,9 @@ Es folgt ein Auszug aus dem Lösch- und Verschiebungs-Logbuch dieser Datei.",
 Gehe zu der [[Special:FileList|Liste hochgeladener Dateien]], um vorhandene Dateien zu suchen und anzuzeigen. Siehe auch das [[Special:Log/upload|Datei-]] und [[Special:Log/delete|Lösch-Logbuch]].
 
 Um ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden Form:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.jpg]]</nowiki></tt>''' – für ein Vollbild
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.png|200px|thumb|left|Alternativer Text]]</nowiki></tt>''' – für ein 200px breites Bild innerhalb einer Box, mit „Alternativer Text“ als Bildbeschreibung
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datei.ogg]]</nowiki></tt>''' – für einen direkten Link auf die Datei, ohne Darstellung der Datei",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.jpg]]</nowiki></code>''' – für ein Vollbild
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.png|200px|thumb|left|Alternativer Text]]</nowiki></code>''' – für ein 200px breites Bild innerhalb einer Box, mit „Alternativer Text“ als Bildbeschreibung
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datei.ogg]]</nowiki></code>''' – für einen direkten Link auf die Datei, ohne Darstellung der Datei",
 'upload-permitted' => 'Erlaubte Dateitypen: $1.',
 'upload-preferred' => 'Bevorzugte Dateitypen: $1.',
 'upload-prohibited' => 'Nicht erlaubte Dateitypen: $1.',
@@ -1779,7 +1800,7 @@ Um ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden
 'filereuploadsummary' => 'Dateiänderungen:',
 'filestatus' => 'Copyright-Status:',
 'filesource' => 'Quelle:',
-'uploadedfiles' => 'Hochgeladene Dateien',
+'uploadedfiles' => 'Hochladen',
 'ignorewarning' => 'Warnung ignorieren und Datei speichern',
 'ignorewarnings' => 'Warnungen ignorieren',
 'minlength1' => 'Dateinamen müssen mindestens einen Buchstaben lang sein.',
@@ -1808,20 +1829,20 @@ Um ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden
 'largefileserver' => 'Die Datei ist größer als die vom Server eingestellte Maximalgröße.',
 'emptyfile' => 'Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrolliere, ob du die Datei wirklich hochladen willst.',
 'windows-nonascii-filename' => 'Dieses Wiki unterstützt keine Dateinamen die Sonderzeichen enthalten.',
-'fileexists' => "Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfe '''<tt>[[:$1]]</tt>''', sofern du dir nicht sicher bist, ob du sie ändern möchtest.
-[[$1|thumb]]",
-'filepageexists' => "Eine Beschreibungsseite wurde bereits als '''<tt>[[:$1]]</tt>''' erstellt, es ist aber keine Datei mit diesem Namen vorhanden.
+'fileexists' => 'Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfe <strong>[[:$1]]</strong>, sofern du dir nicht sicher bist, ob du sie ändern möchtest.
+[[$1|thumb]]',
+'filepageexists' => 'Eine Beschreibungsseite wurde bereits als <strong>[[:$1]]</strong> erstellt, es ist aber keine Datei mit diesem Namen vorhanden.
 Die eingegebene Beschreibung wird nicht auf die Beschreibungsseite übernommen.
 Die Beschreibungsseite musst du nach dem Hochladen der Datei noch manuell bearbeiten.
-[[$1|thumb]]",
-'fileexists-extension' => "Eine Datei mit ähnlichem Namen existiert bereits: [[$2|thumb]]
-* Name der hochzuladenden Datei: '''<tt>[[:$1]]</tt>'''
-* Name der vorhandenen Datei: '''<tt>[[:$2]]</tt>'''
-Bitte wähle einen anderen Namen.",
-'fileexists-thumbnail-yes' => "Bei der Datei scheint es sich um ein Bild verringerter Größe ''(thumbnail)'' zu handeln. [[$1|thumb]]
-Bitte prüfe die Datei '''<tt>[[:$1]]</tt>'''.
+[[$1|thumb]]',
+'fileexists-extension' => 'Eine Datei ähnlichen Namens ist bereits vorhanden: [[$2|thumb]]
+* Name der hochzuladenden Datei: <strong>[[:$1]]</strong>
+* Name der vorhandenen Datei: <strong>[[:$2]]</strong>
+Bitte wähle einen anderen Namen.',
+'fileexists-thumbnail-yes' => "Bei der Datei scheint es sich um ein Bild verringerter Größe ''(Miniatur)'' zu handeln. [[$1|thumb]]
+Bitte prüfe die Datei <strong>[[:$1]]</strong>.
 Wenn es sich um das Bild in Originalgröße handelt, so braucht kein separates Vorschaubild hochgeladen zu werden.",
-'file-thumbnail-no' => "Der Dateiname beginnt mit '''<tt>$1</tt>'''. Dies deutet auf ein Bild verringerter Größe ''(thumbnail)'' hin.
+'file-thumbnail-no' => "Der Dateiname beginnt mit <strong>$1</strong>. Dies deutet auf ein Bild verringerter Größe ''(Minitatur)'' hin.
 Bitte prüfe, ob du das Bild in voller Auflösung vorliegen hast und lade dieses unter dem Originalnamen hoch.",
 'fileexists-forbidden' => 'Unter diesem Namen existiert bereits eine Datei und sie kann nicht überschrieben werden. Bitte gehe zurück und lade die Datei unter einem anderen Namen hoch. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Unter diesem Namen existiert bereits eine Datei im zentralen Medienarchiv.
@@ -1931,6 +1952,7 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
 'lockmanager-fail-releaselock' => 'Die Sperre für „$1“ konnte nicht freigegeben werden.',
 'lockmanager-fail-db-bucket' => 'Es konnte mit Sammelabruf $1 keine ausreichende Anzahl an Verbindungen zu Sperrdatenbanken hergestellt werden.',
 'lockmanager-fail-db-release' => 'Die Sperren auf Datenbank $1 konnten nicht freigegeben werden.',
+'lockmanager-fail-svr-acquire' => 'Die Sperren auf Server $1 konnte nicht abgerufen werden.',
 'lockmanager-fail-svr-release' => 'Die Sperren auf Server $1 konnten nicht freigegeben werden.',
 
 # ZipDirectoryReader
@@ -2046,6 +2068,7 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 'shared-repo-from' => 'aus $1',
 'shared-repo' => 'einem gemeinsam genutzten Medienarchiv',
 'filepage.css' => '/* Das folgende CSS wird auf Dateibeschreibungsseiten, auch auf fremden Client-Wikis, geladen. */',
+'upload-disallowed-here' => 'Leider kannst du dieses Bild nicht überschreiben.',
 
 # File reversion
 'filerevert' => 'Zurücksetzen von „$1“',
@@ -2079,7 +2102,7 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 
 # MIME search
 'mimesearch' => 'Suche nach MIME-Typ',
-'mimesearch-summary' => 'Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden. Die Eingabe muss immer den Medien- und Subtyp beinhalten: <tt>image/jpeg</tt> (siehe Dateibeschreibungsseite).',
+'mimesearch-summary' => 'Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden. Die Eingabe muss immer den Medien- und Subtyp beinhalten: <code>image/jpeg</code> (siehe Dateibeschreibungsseite).',
 'mimetype' => 'MIME-Typ:',
 'download' => 'Herunterladen',
 
@@ -2126,10 +2149,9 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 
 'disambiguations' => 'Seiten die auf Begriffsklärungsseiten verlinken',
 'disambiguationspage' => 'Template:Begriffsklärung',
-'disambiguations-text' => 'Die folgenden Seiten verlinken auf eine Seite zur Begriffsklärung. Sie sollten statt dessen auf die eigentlich gemeinte Seite verlinken.
+'disambiguations-text' => "Die folgenden Seiten enthalten mindestens einen Link zur einer '''Begriffsklärungsseite'''. Stattdessen sollten sie möglicherweise auf die eigentlich gemeinte Seite verlinken.
 
-Eine Seite gilt als Begriffsklärungsseite, wenn sie eine der in [[MediaWiki:Disambiguationspage]] aufgeführte(n) Vorlage(n) einbindet.<br />
-Links aus Namensräumen werden hier nicht aufgelistet.',
+Eine Seite gilt als Begriffsklärungsseite, wenn sie mindestens eine der auf der Seite [[MediaWiki:Disambiguationspage|Disambiguationspage]] aufgeführten Vorlagen enthält.",
 
 'doubleredirects' => 'Doppelte Weiterleitungen',
 'doubleredirectstext' => 'Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.
@@ -2152,15 +2174,16 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
 'fewestrevisions' => 'Seiten mit den wenigsten Versionen',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'nbytes' => '$1 {{PLURAL:$1|Byte|Byte}}',
 'ncategories' => '$1 {{PLURAL:$1|Kategorie|Kategorien}}',
+'ninterwikis' => '{{PLURAL:$1|Ein Interwikilink|$1 Interwikilinks}}',
 'nlinks' => '{{PLURAL:$1|1 Link|$1 Links}}',
 'nmembers' => '{{PLURAL:$1|1 Eintrag|$1 Einträge}}',
 'nrevisions' => '{{PLURAL:$1|1 Bearbeitung|$1 Bearbeitungen}}',
 'nviews' => '{{PLURAL:$1|1 Abfrage|$1 Abfragen}}',
 'nimagelinks' => 'Verwendet auf {{PLURAL:$1|einer Seite|$1 Seiten}}',
 'ntransclusions' => 'verwendet auf {{PLURAL:$1|einer Seite|$1 Seiten}}',
-'specialpage-empty' => 'Die Seite enthält aktuell keine Einträge.',
+'specialpage-empty' => 'Es sind aktuell keine zutreffenden Einträge vorhanden.',
 'lonelypages' => 'Verwaiste Seiten',
 'lonelypagestext' => 'Die folgenden Seiten werden nicht eingebunden oder es wird nicht auf sie in {{SITENAME}} verwiesen.',
 'uncategorizedpages' => 'Nicht kategorisierte Seiten',
@@ -2177,11 +2200,12 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
 'wantedfiletext-cat' => 'Die folgenden Dateien werden verwendet, sind jedoch nicht vorhanden. Vorhandene Dateien aus fremden Repositorien können dennoch hier aufgelistet sein und werden <del>durchgestrichen</del> dargestellt. Zusätzlich werden Seiten, die nicht vorhandene Dateien enthalten, in die [[:$1]] eingeordnet.',
 'wantedfiletext-nocat' => 'Die folgenden Dateien werden verwendet, sind jedoch nicht vorhanden. Vorhandene Dateien aus fremden Repositorien können dennoch hier aufgelistet sein und werden <del>durchgestrichen</del> dargestellt.',
 'wantedtemplates' => 'Gewünschte Vorlagen',
-'mostlinked' => 'Meistverlinkte Seiten',
+'mostlinked' => 'Seiten mit den meisten Links',
 'mostlinkedcategories' => 'Meistbenutzte Kategorien',
 'mostlinkedtemplates' => 'Meistbenutzte Vorlagen',
 'mostcategories' => 'Seiten mit den meisten Kategorien',
 'mostimages' => 'Meistbenutzte Dateien',
+'mostinterwikis' => 'Seiten mit den meisten Interwikilinks',
 'mostrevisions' => 'Seiten mit den meisten Versionen',
 'prefixindex' => 'Alle Seiten (mit Präfix)',
 'prefixindex-namespace' => 'Alle Seiten mit Präfix (Namensraum $1)',
@@ -2279,7 +2303,7 @@ Siehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].',
 'linksearch-pat' => 'Suchmuster:',
 'linksearch-ns' => 'Namensraum:',
 'linksearch-ok' => 'Suchen',
-'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <tt>*.beispiel.de</tt> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. „*.org“. angegeben werden. <br />Unterstützte Protokolle: <tt>$1</tt> (Diese bitte nicht bei der Suchanfrage angeben.)',
+'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.de</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. „*.org“. angegeben werden. <br />Unterstützte Protokolle: <code>$1</code> (Diese bitte nicht bei der Suchanfrage angeben.)',
 'linksearch-line' => '$1 ist verlinkt von $2',
 'linksearch-error' => 'Wildcards können nur am Anfang der URL verwendet werden.',
 
@@ -2325,6 +2349,8 @@ Zusätzliche Informationen über einzelne Rechte können [[{{MediaWiki:Listgroup
 'mailnologin' => 'Fehler beim E-Mail-Versand',
 'mailnologintext' => 'Du musst [[Special:UserLogin|angemeldet sein]] und eine bestätigte E-Mail-Adresse in deinen [[Special:Preferences|Einstellungen]] eingetragen haben, um anderen Benutzern E-Mails schicken zu können.',
 'emailuser' => 'E-Mail an diesen Benutzer',
+'emailuser-title-target' => 'E-Mail an {{GENDER:$1|diesen Benutzer|diese Benutzerin}} senden',
+'emailuser-title-notarget' => 'E-Mail an Benutzer',
 'emailpage' => 'E-Mail an Benutzer',
 'emailpagetext' => 'Du kannst dem Benutzer mit dem unten stehenden Formular eine E-Mail senden.
 Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit der Benutzer dir antworten kann.',
@@ -2463,6 +2489,8 @@ Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'rollback' => 'Zurücksetzen der Änderungen',
 'rollback_short' => 'Zurücksetzen',
 'rollbacklink' => 'Zurücksetzen',
+'rollbacklinkcount' => '{{PLURAL:$1|Eine Version|$1 Versionen}} zurücksetzen',
+'rollbacklinkcount-morethan' => 'Mehr als {{PLURAL:$1|eine Version|$1 Versionen}} zurücksetzen',
 'rollbackfailed' => 'Zurücksetzen gescheitert',
 'cantrollback' => 'Die Änderung kann nicht zurückgesetzt werden, da es keine früheren Autoren gibt.',
 'alreadyrolled' => 'Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da in der Zwischenzeit ein anderer Benutzer die Seite geändert hat.
@@ -2540,7 +2568,7 @@ Siehe die [[Special:ProtectedPages|Liste der geschützten Seiten]] für alle akt
 
 # Restriction levels
 'restriction-level-sysop' => 'geschützt (nur Administratoren)',
-'restriction-level-autoconfirmed' => 'geschützt (nur angemeldete, nicht-neue Benutzer)',
+'restriction-level-autoconfirmed' => 'geschützt (nur angemeldete, nicht neue Benutzer)',
 'restriction-level-all' => 'alle',
 
 # Undelete
@@ -2949,6 +2977,7 @@ Alle Transwiki-Import-Aktionen werden im [[Special:Log/import|Import-Logbuch]] p
 'import-interwiki-templates' => 'Alle Vorlagen einschließen',
 'import-interwiki-submit' => 'Import',
 'import-interwiki-namespace' => 'Zielnamensraum:',
+'import-interwiki-rootpage' => 'Zielstammseite (optional):',
 'import-upload-filename' => 'Dateiname:',
 'import-comment' => 'Grund:',
 'importtext' => 'Bitte die Datei über die Spezialseite [[Special:Export|Exportfunktion]] aus dem Quellwiki exportieren.
@@ -2981,6 +3010,9 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'import-error-interwiki' => 'Die Seite „$1“ wurde nicht importiert, da deren Name für externe Links (Interwiki) reserviert ist.',
 'import-error-special' => 'Die Seite „$1“ wurde nicht importiert, da sie zu einem besonderen Namensraum gehört, in dem keine Seiten möglich sind.',
 'import-error-invalid' => 'Seite „$1“ wurde nicht importiert, da deren Name ungültig ist.',
+'import-options-wrong' => 'Falsche {{PLURAL:$2|Option|Optionen}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Der angegebene Stammseitenname ist ungültig.',
+'import-rootpage-nosubpage' => 'Im Namensraum „$1“ der Stammseite sind keine Unterseiten erlaubt.',
 
 # Import log
 'importlogpage' => 'Import-Logbuch',
@@ -3132,16 +3164,35 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 
 # Info page
 'pageinfo-title' => 'Informationen zu „$1“',
-'pageinfo-header-edits' => 'Bearbeitungen',
-'pageinfo-header-watchlist' => 'Beobachtungsliste',
-'pageinfo-header-views' => 'Seitenaufrufe',
-'pageinfo-subjectpage' => 'Seite',
-'pageinfo-talkpage' => 'Diskussionsseite',
-'pageinfo-watchers' => 'Anzahl der Beobachter',
-'pageinfo-edits' => 'Anzahl der Bearbeitungen',
-'pageinfo-authors' => 'Anzahl unterschiedlicher Autoren',
+'pageinfo-header-basic' => 'Basisinformationen',
+'pageinfo-header-edits' => 'Bearbeitungsgeschichte',
+'pageinfo-header-restrictions' => 'Seitenschutz',
+'pageinfo-header-properties' => 'Seiteneigenschaften',
+'pageinfo-display-title' => 'Anzeigetitel',
+'pageinfo-default-sort' => 'Standardsortierkriterium',
+'pageinfo-length' => 'Seitenlänge (in Byte)',
+'pageinfo-article-id' => 'Seitenkennnummer',
+'pageinfo-robot-policy' => 'Suchmaschinenstatus',
+'pageinfo-robot-index' => 'Indizierbar',
+'pageinfo-robot-noindex' => 'Nicht indizierbar',
 'pageinfo-views' => 'Anzahl der Seitenaufrufe',
-'pageinfo-viewsperedit' => 'Seitenaufrufe pro Bearbeitung',
+'pageinfo-watchers' => 'Anzahl der Beobachter der Seite',
+'pageinfo-redirects-name' => 'Weiterleitungen zu dieser Seite',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Unterseiten dieser Seite',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|Weiterleitung|Weiterleitungen}}; $3 {{PLURAL:$3|Unterseite|Unterseiten}})',
+'pageinfo-firstuser' => 'Seitenersteller',
+'pageinfo-firsttime' => 'Datum der Seitenerstellung',
+'pageinfo-lastuser' => 'Letzter Bearbeiter',
+'pageinfo-lasttime' => 'Datum der letzten Bearbeitung',
+'pageinfo-edits' => 'Gesamtzahl der Bearbeitungen',
+'pageinfo-authors' => 'Gesamtzahl unterschiedlicher Autoren',
+'pageinfo-recent-edits' => 'Anzahl der kürzlich erfolgten Bearbeitungen (innerhalb von $1)',
+'pageinfo-recent-authors' => 'Anzahl der unterschiedlichen Autoren',
+'pageinfo-restriction' => 'Seitenschutz (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magisches Wort|Magische Wörter}} ($1)',
+'pageinfo-hidden-categories' => 'Versteckte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
+'pageinfo-templates' => 'Eingebundene {{PLURAL:$1|Vorlage|Vorlagen}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Klassik',
@@ -3196,6 +3247,7 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
 'file-info-size-pages' => '$1 × $2 Pixel, Dateigröße: $3, MIME-Typ: $4, $5 {{PLURAL:$5|Seite| Seiten}}',
 'file-nohires' => 'Keine höhere Auflösung vorhanden.',
 'svg-long-desc' => 'SVG-Datei, Basisgröße: $1 × $2 Pixel, Dateigröße: $3',
+'svg-long-desc-animated' => 'Animierte SVG-Datei, Basisgröße $1 × $2 Pixel, Dateigröße: $3',
 'show-big-image' => 'Volle Auflösung',
 'show-big-image-preview' => 'Größe dieser Vorschau: $1.',
 'show-big-image-other' => 'Weitere {{PLURAL:$2|Auflösung|Auflösungen}}: $1.',
@@ -3205,6 +3257,8 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
 'file-info-png-looped' => 'Endlosschleife',
 'file-info-png-repeat' => '$1-{{PLURAL:$1|mal|mal}} abgespielt',
 'file-info-png-frames' => '$1 {{PLURAL:$1|Bild|Bilder}}',
+'file-no-thumb-animation' => "'''Hinweis: Aufgrund technischer Beschränkungen werden Vorschaubilder dieser Datei nicht animiert.'''",
+'file-no-thumb-animation-gif' => "'''Hinweis: Aufgrund technischer Beschränkungen werden Vorschaubilder hochauflösender GIF-Dateien wie dieser nicht animiert.'''",
 
 # Special:NewFiles
 'newimages' => 'Neue Dateien',
@@ -3784,7 +3838,7 @@ Bitte nutze die reguläre Vorschau.',
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => 'Bearbeitungen der letzten {{PLURAL:$1|Sekunde|$1 Sekunden}} werden in dieser Liste noch nicht angezeigt.',
-'lag-warn-high' => 'Auf Grund hoher Datenbankauslastung werden die Bearbeitungen der letzten {{PLURAL:$1|Sekunde|$1 Sekunden}} in dieser Liste noch nicht angezeigt.',
+'lag-warn-high' => 'Auf Grund hoher Datenbankauslastung werden die Bearbeitungen der letzten {{PLURAL:$1|Sekunde|$1 Sekunden}} noch nicht in dieser Liste angezeigt.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Deine Beobachtungsliste enthält {{PLURAL:$1|einen Eintrag|$1 Einträge}}. Die Diskussionsseiten wurden dabei nicht mitgezählt.',
@@ -3857,8 +3911,8 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'version-software' => 'Installierte Software',
 'version-software-product' => 'Software',
 'version-software-version' => 'Version',
-'version-entrypoints' => 'Eingangspunkt-URLs',
-'version-entrypoints-header-entrypoint' => 'Eingangspunkt',
+'version-entrypoints' => 'URLs der Einstiegspunkte',
+'version-entrypoints-header-entrypoint' => 'Einstiegspunkt',
 'version-entrypoints-header-url' => 'URL',
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikelpfad]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skriptpfad]',
@@ -4022,9 +4076,12 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 'api-error-empty-file' => 'Die hochgeladene Datei war leer.',
 'api-error-emptypage' => 'Es ist nicht erlaubt, neue leere Seiten zu erstellen.',
 'api-error-fetchfileerror' => 'Interner Fehler: Beim Abrufen der Datei ist ein Fehler aufgetreten.',
+'api-error-fileexists-forbidden' => 'Eine Datei namens „$1“ ist bereits vorhanden und kann nicht überschrieben werden.',
+'api-error-fileexists-shared-forbidden' => 'Eine Datei namens „$1“ ist bereits im gemeinsamen Dateirepositorium vorhanden und kann daher nicht überschrieben werden.',
 'api-error-file-too-large' => 'Die hochgeladene Datei war zu groß.',
 'api-error-filename-tooshort' => 'Der Dateiname ist zu kurz.',
 'api-error-filetype-banned' => 'Diese Dateiendung ist gesperrt.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|ist ein nicht zulässiger Dateityp|sind nicht zulässige Dateitypen}}. {{PLURAL:$3|Ein zulässiger Dateityp ist|Zulässige Dateitypen sind}} $2.',
 'api-error-filetype-missing' => 'Die hochzuladende Datei hat keine Dateiendung.',
 'api-error-hookaborted' => 'Die von dir vorgesehene Anpassung kann nicht durchgeführt werden (Unterbrechung durch eine Programmschnittstelle).',
 'api-error-http' => 'Interner Fehler: Es konnte keine Verbindung zum Server hergestellt werden.',
index db27d9a..af3f213 100644 (file)
@@ -11,6 +11,7 @@
  * @author Aspar
  * @author Belekvor
  * @author Erdemaslancan
+ * @author George Animal
  * @author Kaganer
  * @author Mirzali
  * @author Reedy
@@ -23,7 +24,7 @@ $namespaceNames = array(
        NS_SPECIAL          => 'Xısusi',
        NS_TALK             => 'Werênayış',
        NS_USER             => 'Karber',
-       NS_USER_TALK        => 'Karber_mesac',
+       NS_USER_TALK        => 'Karber_werênayış',
        NS_PROJECT_TALK     => '$1_werênayış',
        NS_FILE             => 'Dosya',
        NS_FILE_TALK        => 'Dosya_werênayış',
@@ -31,26 +32,34 @@ $namespaceNames = array(
        NS_MEDIAWIKI_TALK   => 'MediaWiki_werênayış',
        NS_TEMPLATE         => 'Şablon',
        NS_TEMPLATE_TALK    => 'Şablon_werênayış',
-       NS_HELP             => 'Desteg',
-       NS_HELP_TALK        => 'Desteg_werênayış',
-       NS_CATEGORY         => 'Kategori',
-       NS_CATEGORY_TALK    => 'Kategori_werênayış',
+       NS_HELP             => 'Peşti',
+       NS_HELP_TALK        => 'Peşti_werênayış',
+       NS_CATEGORY         => 'Kategoriye',
+       NS_CATEGORY_TALK    => 'Kategoriye_werênayış',
+);
+
+$namespaceAliases = array(
+       'Karber_mesac'       => NS_USER_TALK,
+       'Desteg'             => NS_HELP,
+       'Desteg_werênayış'   => NS_HELP_TALK,
+       'Kategori'           => NS_CATEGORY,
+       'Kategori_werênayış' => NS_CATEGORY_TALK,
 );
 
 $specialPageAliases = array(
-       'Activeusers'               => array( 'KarbereAktivi', 'AktivKarberi' ),
-       'Allmessages'               => array( 'MesaciPero' ),
-       'Allpages'                  => array( 'PeleyPero' ),
-       'Ancientpages'              => array( 'PeleyVereni' ),
+       'Activeusers'               => array( 'KarberêAktivi', 'AktivKarberi' ),
+       'Allmessages'               => array( 'MesaciPêro' ),
+       'Allpages'                  => array( 'PeleyPêro' ),
+       'Ancientpages'              => array( 'PeleyVerêni' ),
        'Badtitle'                  => array( 'SernameyoXırab' ),
        'Blankpage'                 => array( 'PelaVeng', 'VengPela' ),
        'Block'                     => array( 'Bloke', 'BlokeIP', 'BlokeKarber' ),
-       'Blockme'                   => array( 'BlokeMe' ),
+       'Blockme'                   => array( 'BlokêMe' ),
        'Booksources'               => array( 'KıtabeÇıme' ),
-       'BrokenRedirects'           => array( 'HetenayışoXırab' ),
+       'BrokenRedirects'           => array( 'HetênayışoXırab' ),
        'Categories'                => array( 'Kategoriye' ),
-       'ChangeEmail'               => array( 'EpostaBıvurne' ),
-       'ChangePassword'            => array( 'ParolaBıvurne', 'ParolaResetke' ),
+       'ChangeEmail'               => array( 'EpostaBıvurnê' ),
+       'ChangePassword'            => array( 'ParolaBıvurnê', 'ParolaResetke' ),
        'ComparePages'              => array( 'PelaPêverke' ),
        'Confirmemail'              => array( 'EpostayAraştke' ),
        'Contributions'             => array( 'İştiraxi' ),
@@ -102,23 +111,23 @@ $specialPageAliases = array(
        'Protectedpages'            => array( 'PeleyêkeStaryayê' ),
        'Protectedtitles'           => array( 'SernameyêkeStaryayê' ),
        'Randompage'                => array( 'Raştamê', 'PelayakeRaştamê' ),
-       'Randomredirect'            => array( 'HetenayışoRaştmae' ),
+       'Randomredirect'            => array( 'HetenayışoRaştame' ),
        'Recentchanges'             => array( 'VurnayışêPeyêni' ),
        'Recentchangeslinked'       => array( 'GreyêVurnayışêPeyêni' ),
        'Revisiondelete'            => array( 'RevizyoniBesterne' ),
-       'RevisionMove'              => array( 'RevizyoniAhulne' ),
+       'RevisionMove'              => array( 'RewizyoniAhulne' ),
        'Search'                    => array( 'Cıgeyre' ),
        'Shortpages'                => array( 'PeleyêKılmi' ),
        'Specialpages'              => array( 'PeleyXısusi' ),
        'Statistics'                => array( 'İstatistiki' ),
        'Tags'                      => array( 'Etiketi' ),
-       'Unblock'                   => array( 'Bloqihewad' ),
+       'Unblock'                   => array( 'Bloqiwedarne' ),
        'Uncategorizedcategories'   => array( 'KategoriyêkeKategorinêbiyê' ),
        'Uncategorizedimages'       => array( 'DosyeyêkeKategorinêbiyê' ),
        'Uncategorizedpages'        => array( 'PeleyêkeKategorinêbiyê' ),
        'Uncategorizedtemplates'    => array( 'ŞablonêkeKategorinêbiyê' ),
        'Undelete'                  => array( 'Peyserbiya' ),
-       'Unlockdb'                  => array( 'DBKlitiake' ),
+       'Unlockdb'                  => array( 'DBSırmiake' ),
        'Unusedcategories'          => array( 'KategoriyêkeNêkaryayê' ),
        'Unusedimages'              => array( 'DosyeyêkeNêkaryayê' ),
        'Unusedtemplates'           => array( 'ŞablonêkeNêkaryayê' ),
@@ -132,140 +141,167 @@ $specialPageAliases = array(
        'Wantedcategories'          => array( 'KategoriyêkeWazênê' ),
        'Wantedfiles'               => array( 'DosyeyêkeWazênê' ),
        'Wantedpages'               => array( 'PeleyêkeWazênê' ),
-       'Wantedtemplates'           => array( 'ŞablonyêkeWazênê' ),
+       'Wantedtemplates'           => array( 'ŞablonêkeWazênê' ),
        'Watchlist'                 => array( 'Listeyseyri' ),
        'Whatlinkshere'             => array( 'PelarêGre' ),
        'Withoutinterwiki'          => array( 'Bêİnterwiki' ),
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#HETENAYIŞ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__ESTENÇINO__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__GALERİÇINO__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ESTENZARURET__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ESTEN__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__TİMARKERDIŞÇINO__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__SERNAMEÇINO__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'MEWCUDAŞMİ', 'MEWCUDAŞMİ2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MEWCUDAŞMİ1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NAMEYAŞMDAMEWCUD', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'MEWCUDAŞMACI', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'MEWCUDAŞMİKILMKERDIŞ', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'MEWCUDROCE', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'MEWCUDROCE2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NAMEYÊMEWCUDROCE', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'MEWCUDSERRE', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'MEWCUDDEME', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'MEWCUDSEHAT', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'WAREYAŞMİ', 'WAREYAŞMİ2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'WAREYAŞMİ1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'NAMEYÊWAREYAŞMİ', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'NAMEYWAREDÊAŞMİDACI', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'WAREYAŞMİKILMKERDIŞ', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'WAREYROCE', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'WAREYROCE2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NAMEYÊWAREYROCE', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'WAREYSERRE', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'WAREYDEME', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'WAREYSEHAT', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'AMARİYAPELAN', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'AMARİYAWESİQAN', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'AMARİYADOSYAYAN', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'AMARİYAKARBERAN', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'AMARİYAAKTİVKARBERAN', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'AMARİYAVURNAYIŞAN', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'AMARİYAMOCNAYIŞAN', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'NAMEYPELA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NAMEYPELAA', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'CANAME', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'CANAMEE', 'NAMESPACEE' ),
-       'namespacenumber'         => array( '1', 'AMARİYACANAME', 'NAMESPACENUMBER' ),
-       'talkspace'               => array( '1', 'CAYÊWERÊNAYIŞİ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'CAYÊWERÊNAYIŞAN', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'CAYÊMESEL', 'CAYÊWESİQE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'CAYÊMESELAN', 'CAYÊWESİQAN', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'NAMEYPELAPÊRO', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'NAMEYPELAPÊRON', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NAMEYBINPELA', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NAMEYBINPELAA', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NAMEYSERPELA', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NAMEYSERPELAA', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NAMEYPELAWERÊNAYIŞ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NAMEYPELAWERÊNAYIŞAN', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NAMEYPELAMESEL', 'NAMEYPELAWESİQE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NAMEYPELAMESELER', 'NAMEYPELAQESİQER', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'MSC', 'MSG:' ),
-       'subst'                   => array( '0', 'KOPYAKE', 'ATEBERDE', 'SUBST:' ),
-       'safesubst'               => array( '0', 'EMELEYATEBERDE', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'MSJNW:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'resmowerdı', 'werdı', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'resmowerdı=$1', 'erwdı=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'raşt', 'right' ),
-       'img_left'                => array( '1', 'çep', 'left' ),
-       'img_none'                => array( '1', 'çıno', 'none' ),
-       'img_width'               => array( '1', '$1pik', '$1piksel', '$1px' ),
-       'img_center'              => array( '1', 'werte', 'miyan', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'çerçeweyın', 'çerçeweya', 'çerçewe', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'beçerçewe', 'frameless' ),
-       'img_page'                => array( '1', 'pela=$1', 'pela_$1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'sinor', 'border' ),
-       'img_top'                 => array( '1', 'gedug', 'top' ),
-       'img_middle'              => array( '1', 'merkez', 'middle' ),
-       'img_link'                => array( '1', 'gre=$1', 'link=$1' ),
-       'int'                     => array( '0', 'İNT:', 'INT:' ),
-       'scriptpath'              => array( '0', 'RAYASCRIPTİ', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'TERZÊTEWRİ', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMER:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'CİNSİYET:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__SERNAMEVURNAYIŞÇINO__', '__SVÇ__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__ZERREVURNAYIŞÇINO__', '__ZVÇ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'MEVCUDHEFTE', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'MEVCUDWAREYHEFTİ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'WAREYHEFTİ', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'WAREYROCAHEFTİ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'NIMREYREVİZYONİ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ROCAREVİZYONİ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ROCAREVİZYON1', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'AŞMAREVİZYONİ', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'AŞMAREVİZYONİ1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'SERRAREVİZYONİ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'MELUMATÊREVİZYONÊDEMİ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'REVİZYONKARBER', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'ZAFEN:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'GREPÊRO:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'GREYOPÊRON:', 'FULLURLE:' ),
-       'canonicalurl'            => array( '0', 'GREYÊKANONİK:', 'CANONICALURL:' ),
-       'canonicalurle'           => array( '0', 'GREYOKANONİK:', 'CANONICALURLE:' ),
-       'lcfirst'                 => array( '0', 'KHİLK:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'BHİLK:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'KH:', 'LC:' ),
-       'uc'                      => array( '0', 'BH:', 'UC:' ),
-       'raw'                     => array( '0', 'XAM:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'SERNAMEİBIMOCNE', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__GREYÊSERNAMEDÊNEWİ__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__GREYÊSERNAMEDÊNEWİÇINO__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'MEWCUDVERSİYON', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'MEWCUDWAREYSEHAT', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'MALUMATÊWAREYSEHAT', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#ZIWAN', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'ZIWANÊESTİN', 'ZIWESTEN', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PELEYÊKECADÊNAMİDEYÊ', 'PELECN', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'AMARİYAXİZMETKARAN', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'BABETNAYIŞ', 'FORMATNUM' ),
-       'special'                 => array( '0', 'xısusi', 'special' ),
-       'speciale'                => array( '0', 'xısusiye', 'speciale' ),
-       'defaultsort'             => array( '1', 'RATNAYIŞOHESBNAYIŞ', 'QESAYARATNAYIŞOHESBNAYIŞ', 'KATEGORİYARATNAYIŞOHESBNAYIŞ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'RAYADOSYA:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'etiket', 'tag' ),
-       'hiddencat'               => array( '1', '__KATEGORİYANIMITİ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PELEYÊKEKATEGORİDEYÊ', 'KATDÊPELEY', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'EBATÊPELA', 'PAGESIZE' ),
-       'index'                   => array( '1', '__SERSIQ__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__SERSIQÇINYO__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'GRUBDEAMARE', 'AMARİYAGRUBER', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__STATİKHETENAYIŞ__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'SEWİYEYÊSTARE', 'PROTECTIONLEVEL' ),
-       'url_wiki'                => array( '0', 'WİKİ', 'WIKI' ),
+       'redirect'                  => array( '0', '#HETENAYIŞ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__ESTENÇINO__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__GALERİÇINO__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ESTENZARURET__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ESTEN__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__TİMARKERDIŞÇINO__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__SERNAMEÇINO__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'AŞMİYANEWKİ', 'MEWCUDAŞMİ2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'AŞMİYANEWKİ1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NAMEYAŞMDANEWKİ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'AŞMACIYANEWKİ', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'AŞMİYANEWKİKILMKERDIŞ', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ROCENEWKİ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ROCENEWKİ2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NAMEYÊROCENEWKİ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'SERRENEWKİ', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'DEMENEWKİ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'SEHATNEWKİ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'WAREYAŞMİ', 'WAREYAŞMİ2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'WAREYAŞMİ1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'NAMEYÊWAREYAŞMİ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'NAMEYWAREDÊAŞMİDACI', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'WAREYAŞMİKILMKERDIŞ', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'WAREYROCE', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'WAREYROCE2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NAMEYÊWAREYROCE', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'WAREYSERRE', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'WAREYDEME', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'WAREYSEHAT', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'AMARİYAPELAN', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'AMARİYAWESİQAN', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'AMARİYADOSYAYAN', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'AMARİYAKARBERAN', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'AMARİYAAKTİVKARBERAN', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'AMARİYAVURNAYIŞAN', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'AMARİYAMOCNAYIŞAN', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'NAMEYPELA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NAMEYPELAA', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'CANAME', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'CANAMEE', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'AMARİYACANAME', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'CAYÊWERÊNAYIŞİ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'CAYÊWERÊNAYIŞAN', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'CAYÊMESEL', 'CAYÊWESİQE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'CAYÊMESELAN', 'CAYÊWESİQAN', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NAMEYPELAPÊRO', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NAMEYPELAPÊRON', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NAMEYBINPELA', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NAMEYBINPELAA', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NAMEYSERPELA', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NAMEYSERPELAA', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NAMEYPELAWERÊNAYIŞ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NAMEYPELAWERÊNAYIŞAN', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NAMEYPELAMESEL', 'NAMEYPELAWESİQE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NAMEYPELAMESELER', 'NAMEYPELAQESİQER', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'MSC', 'MSG:' ),
+       'subst'                     => array( '0', 'KOPYAKE', 'ATEBERDE', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'EMELEYATEBERDE', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'MSJNW:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'resmoqıckek', 'qıckek', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'resmoqıckek=$1', 'qıckek=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'raşt', 'right' ),
+       'img_left'                  => array( '1', 'çep', 'left' ),
+       'img_none'                  => array( '1', 'çıniyo', 'none' ),
+       'img_width'                 => array( '1', '$1pik', '$1piksel', '$1px' ),
+       'img_center'                => array( '1', 'werte', 'miyan', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'çerçeweya', 'çerçeweniyo', 'çerçewe', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'bêçerçewe', 'frameless' ),
+       'img_page'                  => array( '1', 'pela=$1', 'pela_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'disleg', 'disleg=$1', 'disleg_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'sinor', 'border' ),
+       'img_baseline'              => array( '1', 'Sinorêerdi', 'baseline' ),
+       'img_sub'                   => array( '1', 'bın', 'sub' ),
+       'img_super'                 => array( '1', 'corên', 'cor', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'gedug', 'top' ),
+       'img_text_top'              => array( '1', 'gedug-metin', 'text-top' ),
+       'img_middle'                => array( '1', 'merkez', 'middle' ),
+       'img_bottom'                => array( '1', 'erd', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'erd-metin', 'text-bottom' ),
+       'img_link'                  => array( '1', 'gre=$1', 'link=$1' ),
+       'int'                       => array( '0', 'İNT:', 'INT:' ),
+       'sitename'                  => array( '1', 'NAMEYSİTA', 'SITENAME' ),
+       'ns'                        => array( '0', 'CN', 'NS:' ),
+       'nse'                       => array( '0', 'CNV', 'NSE:' ),
+       'localurl'                  => array( '0', 'LOKALGRE', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALGREV', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'SOPAWESİQAN', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'NIMREYPELA', 'PAGEID' ),
+       'server'                    => array( '0', 'ARDEN', 'SERVER' ),
+       'servername'                => array( '0', 'NAMEYARDEN', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'RAYASCRIPTİ', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'TERZÊTEWRİ', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMER:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'CİNSİYET:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__SERNAMEVURNAYIŞÇINO__', '__SVÇ__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__ZERREVURNAYIŞÇINO__', '__ZVÇ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'MEVCUDHEFTE', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'MEVCUDWAREYHEFTİ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'WAREYHEFTİ', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'WAREYROCAHEFTİ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'NIMREYREVİZYONİ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ROCAREVİZYONİ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ROCAREVİZYON1', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'AŞMAREVİZYONİ', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'AŞMAREVİZYONİ1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'SERRAREVİZYONİ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'MELUMATÊREVİZYONÊDEMİ', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'REVİZYONKARBER', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'ZAFEN:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'GREPÊRO:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'GREYOPÊRON:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'GREYÊKANONİK:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'GREYOKANONİK:', 'CANONICALURLE:' ),
+       'lcfirst'                   => array( '0', 'KHİLK:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'BHİLK:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'KH:', 'LC:' ),
+       'uc'                        => array( '0', 'BH:', 'UC:' ),
+       'raw'                       => array( '0', 'XAM:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'SERNAMİBIMOCNE', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__GREYÊSERNAMEDÊNEWİ__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__GREYÊSERNAMEDÊNEWİÇINO__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VERSİYONÊNEWKİ', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'WAREYSEHATÊNEWKİ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'MALUMATÊWAREYSEHAT', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'HETANIŞANKERDIŞ', 'HETNIŞAN', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#ZIWAN', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'ZIWANÊESTİN', 'ZIWESTEN', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PELEYÊKECADÊNAMİDEYÊ', 'PELECN', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'AMARİYAXİZMETKARAN', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'BABETNAYIŞ', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ÇEPİPIRKE', 'PADLEFT' ),
+       'padright'                  => array( '0', 'RAŞTİPIRKE', 'PADRIGHT' ),
+       'special'                   => array( '0', 'xısusi', 'special' ),
+       'speciale'                  => array( '0', 'xısusiye', 'speciale' ),
+       'defaultsort'               => array( '1', 'RATNAYIŞOHESBNAYIŞ', 'SIRMEYRATNAYIŞOHESBNAYIŞ', 'KATEGORİYARATNAYIŞOHESBNAYIŞ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'RAYADOSYA:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'etiket', 'tag' ),
+       'hiddencat'                 => array( '1', '__KATEGORİYANIMITİ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PELEYÊKEKATEGORİDEYÊ', 'KATDÊPELEY', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'EBATÊPELA', 'PAGESIZE' ),
+       'index'                     => array( '1', '__SERSIQ__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__SERSIQÇINYO__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'GRUBDEAMARE', 'AMARİYAGRUBER', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__STATİKHETENAYIŞ__', '__STATICHETENAYIŞ__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'SEWİYEYÊSTARE', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'demêformati', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'RAY', 'PATH' ),
+       'url_wiki'                  => array( '0', 'WİKİ', 'WIKI' ),
+       'url_query'                 => array( '0', 'PERSİYE', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'xırabinçıniya', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'cewabçıniyo', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', 'pêro', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'peley', 'pages' ),
+       'pagesincategory_files'     => array( '0', 'dosyey', 'files' ),
 );
 
 $messages = array(
@@ -284,20 +320,20 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Qısıman be tıknayışê serrêze ra ebe gocega raşte bıvurne (JavaScript lazımo)',
 'tog-showtoc' => 'Tabloyê tedeesteyan bımocne (de pelanê be hirê sernuşteyan ra vêşêri de)',
 'tog-rememberpassword' => 'Parola mı nê cıgeyraoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}}).',
-'tog-watchcreations' => 'Pelê ke mı afernayê, lista mına seyrkerdışi ke',
-'tog-watchdefault' => 'Pelê ke mı vurnayê, lista mına seyrkerdışi ke',
-'tog-watchmoves' => 'Pelê ke mı kırışnayê, lista mına seyrkerdışi ke',
-'tog-watchdeletion' => 'Pelê ke mı esterıtê, lista mına seyrkerdışi ke',
+'tog-watchcreations' => 'Pelê ke mı afernayê u dosyeyê ke mı bar kerdê lista mına seyrkerdışi ke',
+'tog-watchdefault' => 'Pel u dosyeyê ke mı vurnayê lista mına seyrkerdışi ke',
+'tog-watchmoves' => 'Pel u dosyeyê ke mı kırıştê lista mına seyrkerdışi ke',
+'tog-watchdeletion' => 'Pel u dosyeyê ke mı seterıtê lista mına seyrkerdışi ke',
 'tog-minordefault' => "Vurnayışanê xo pêrune ''vurnayışo qıckek'' nışan bıde",
 '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ıgeyraoği mia xo viri',
-'tog-enotifwatchlistpages' => 'Pela ke ez seyr kenan eke vurnayê mı rê e-poste bırışe',
+'tog-enotifwatchlistpages' => 'Jû 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 de zi mı rê e-poste bırışe',
+'tog-enotifminoredits' => 'Vurnayışanê qıckekanê pelan u dosyeyan de zi mı rê e-poste bırışe',
 'tog-enotifrevealaddr' => 'Adresa e-posteyê mı posteyê xeberan de bımocne',
 'tog-shownumberswatching' => 'Amarê karberanê seyrkerdoğan bımocne',
-'tog-oldsig' => 'İmza mewcude:',
+'tog-oldsig' => 'İmzaya şıma:',
 'tog-fancysig' => 'İmza rê mameley wikimeqaley bıke (bê gıreyo otomatik)',
 'tog-externaleditor' => 'Editorê teberi standard bıxebetne (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
 'tog-externaldiff' => 'Têverşanayışan pê programê teberi vıraze (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
@@ -310,7 +346,6 @@ $messages = array(
 '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-nolangconversion' => 'Varyant çerx kerdışa bıqefılne',
 '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',
@@ -323,7 +358,7 @@ $messages = array(
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Cayê vurnayışi de tipê nuştışi:',
-'editfont-default' => 'Fereziya cıgeyrayoği',
+'editfont-default' => 'Hesıbyayiya rovıteri',
 'editfont-monospace' => 'Tipê nustey sabıtcagırewtoği',
 'editfont-sansserif' => 'Tipê nustey Sans-serifi',
 'editfont-serif' => 'Tipê nustey Serifi',
@@ -381,7 +416,7 @@ $messages = array(
 'dec' => 'Kan',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriy}}',
+'pagecategories' => '{{PLURAL:$1|Kategoriye|Kategoriy}}',
 'category_header' => 'Pelê ke kategoriya "$1" derê',
 'subcategories' => 'Kategoriyê bınêni',
 'category-media-header' => 'Medyawa ke kategoriya "$1" dera',
@@ -404,18 +439,18 @@ $messages = array(
 
 'about' => 'Heqa',
 'article' => 'Wesiqe',
-'newwindow' => '(zerrey pençereyê dê newey de beno a)',
+'newwindow' => '(Teqa da newi de abêno)',
 'cancel' => 'Bıterkne',
 'moredotdotdot' => 'Vêşêri...',
 'mypage' => 'Pela mı',
-'mytalk' => 'Werênayışê mı',
+'mytalk' => 'Werênayışi',
 'anontalk' => 'Pela werênayışê nê IPy',
 'navigation' => 'Pusula',
 'and' => '&#32;u',
 
 # Cologne Blue skin
 'qbfind' => 'Bıvêne',
-'qbbrowse' => 'Çım ra viyarne',
+'qbbrowse' => 'Rovete',
 'qbedit' => 'Bıvurne',
 'qbpageoptions' => 'Ena pele',
 'qbpageinfo' => 'Gıre',
@@ -455,9 +490,9 @@ $messages = array(
 'printableversion' => 'Asayışo çapkerden',
 'permalink' => 'Gıreyo daimi',
 'print' => 'Çap ke',
-'view' => 'Bıvêne',
+'view' => 'Bıvin',
 'edit' => 'Bıvurnên',
-'create' => 'Vırazê',
+'create' => 'Vıraze',
 'editthispage' => 'Ena pele bıvurne',
 'create-this-page' => 'Na pele bınuse',
 'delete' => 'Besterne',
@@ -473,7 +508,7 @@ $messages = array(
 'talkpage' => 'Ena pele sero werêne',
 'talkpagelinktext' => 'Mesac',
 'specialpage' => 'Pela xısusiye',
-'personaltools' => 'Hacetê şexsi',
+'personaltools' => 'Haletê şexsi',
 'postcomment' => 'Qısımo newe',
 'articlepage' => 'Pela zerreki bıvêne',
 'talk' => 'Werênayış',
@@ -507,7 +542,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' => 'Heqa {{SITENAME}} de',
-'aboutpage' => 'Project:Heqa',
+'aboutpage' => 'Project:Heqdê cı',
 'copyright' => 'Zerrek bınê $1 dero.',
 'copyrightpage' => '{{ns:project}}:Heqa telifi',
 'currentevents' => 'Veng u vac',
@@ -541,6 +576,10 @@ $1',
 'youhavenewmessages' => 'To rê estê $1 ($2).',
 'newmessageslink' => 'mesacê newey',
 'newmessagesdifflink' => 'vurnayışo peyên',
+'youhavenewmessagesfromusers' => 'Zey $1 ra {{PLURAL:$3|zewbi karber|$3 karberi}} ($2) esto.',
+'youhavenewmessagesmanyusers' => '$1 ra tay karberi ($2) dı estê.',
+'newmessageslinkplural' => '{{PLURAL:$1|yew mesac|mesacê newey}}',
+'newmessagesdifflinkplural' => 'peyni {{PLURAL:$1|vurnayış|vurnayışi}}',
 'youhavenewmessagesmulti' => '$1 mesaco newe esto',
 'editsection' => 'bıvurne',
 'editsection-brackets' => '[$1]',
@@ -557,7 +596,7 @@ $1',
 'thisisdeleted' => 'Bıvêne ya zi $1 peyser bia?',
 'viewdeleted' => '$1 bıvêne?',
 'restorelink' => '{{PLURAL:$1|yew vurnayışo esterıte|$1 vurnayışê esterıtey}}',
-'feedlinks' => 'Cı resne:',
+'feedlinks' => 'Warikerdış:',
 'feed-invalid' => 'Qeydey cıresnayışê  beğşi nêvêreno.',
 'feed-unavailable' => 'Cıresnayışê şebekey çıniyê',
 'site-rss-feed' => '$1 Cıresnayışê RSSi',
@@ -580,7 +619,7 @@ $1',
 'nstab-mediawiki' => 'Mesac',
 'nstab-template' => 'Şablon',
 'nstab-help' => 'Pela peşti',
-'nstab-category' => 'Kategori',
+'nstab-category' => 'Kategoriye',
 
 # Main script and global functions
 'nosuchaction' => 'Fealiyeto wınasi çıniyo',
@@ -595,11 +634,11 @@ Seba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:spe
 # General errors
 'error' => 'Xırab',
 'databaseerror' => 'Xeta serveri',
-'dberrortext' => 'Rêzê vateyê database de xeta bı.
+'dberrortext' => 'Rêzê vateyê malumati de xeta bı.
 No xeta belka software ra yo.
-"<tt>$2</tt>" ra pers kerdışê peyin:
-<blockquote><tt>$1</tt></blockquote>.
-Database yo ke xeta dayo "<tt>$3: $4</tt>".',
+"<blockquote><tt>$1</tt></blockquote>.
+<tt>$2</tt>" ra pers kerdışê peyin:
+Malumatê yo ke xeta dayo "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'Persê rêzê vateyê database de xeta bı.
 Persê databaseyê peyin:
 "$1"
@@ -634,6 +673,8 @@ Kerem kerê, naye be namey ''URL''i yew [[Special:ListUsers/sysop|karber]]i ra v
 'cannotdelete' => 'Pel  "$1" o ke şıma nişane kerd hewn a neşı.
 Belka yewna ten kerdo hewn a.',
 'cannotdelete-title' => 'şıma  "$1" nê şenê besternê.',
+'delete-hook-aborted' => 'Esterıtışi terefê çengeli ra ibtal bi.
+Qet tesrih beyan nêbi.',
 'badtitle' => 'Sernameo xırabın',
 'badtitletext' => 'Sernamey pela ke şıma waşt, nêvêrd, thalo/vengo ya ki zıwano miyanêno ğelet gırêdae ya ki sernamey wiki.
 Beno ke, tede yew ya zi zêdê işareti estê ke sernaman de nêxebetiyenê.',
@@ -669,6 +710,8 @@ Sebeb: "\'\'$2\'\'".',
 Xızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: "$3".',
 'invalidtitle-knownnamespace' => 'Canemey "$2" u metnê "$3" xırabo',
 'invalidtitle-unknownnamespace' => 'Sernameye nêşınasiya yana amraiya canameyo  $1 u metno "$2" xırab',
+'exception-nologin' => 'Tı cı nêkewtê',
+'exception-nologin-text' => 'Na pele ya zi nê karkerdışi rê nê wiki de cıkewtış icab keno.',
 
 # Virus scanner
 'virus-badscanner' => "Eyaro şaş: no virus-cıgerayox nêzanyeno: ''$1''",
@@ -690,13 +733,14 @@ Hesabê şıma biyo a.
 'remembermypassword' => 'Parola mı nê cıgeyraoği de biya xo viri (heta $1 {{PLURAL:$1|roc|roci}}).',
 '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ê.',
 'externaldberror' => 'Ya database de xeta esta ya zi heqê şıma çino şıma no hesab bıvurni.',
 'login' => 'Cı kewe',
 'nav-login-createaccount' => 'Dekew de / hesab vıraze',
 'loginprompt' => "Cıkewtena {{SITENAME}}i rê gani ''cookies'' akerdey bê.",
 'userlogin' => 'Cı kewe / hesab vıraze',
 'userloginnocreate' => 'Cı kewe',
-'logout' => 'Bıveciyên',
+'logout' => 'Veciyayış',
 'userlogout' => 'Bıveciyên',
 'notloggedin' => 'Hesab akerde niyo',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
@@ -745,8 +789,8 @@ Eke vurnayişê parolayi, şıma nêwaşt ya zi parolayê şıma ameyo şıma vi
 'noemailcreate' => 'Şıma gani yew parolayo meqbul peda bıkeri',
 'passwordsent' => '"$1" No name de yew e-posta erşawiya (ruşya). hesabê xo, şıma wext mesaj gırewt u çax akere.',
 'blocked-mailpassword' => 'Cıkewetışê na keyepel de şıma qedexe biye, ey ra newe yew şifre nêerşawyeno.',
-'eauthentsent' => 'Adreso ke şıma dayo ma, ma yew e-posta erşawıt uca, o e-posta de kodê tesdiq kerdış esto.
-Heta ke şıma o e-posta tesdiq nêkeri ma yewna e-posta şıma ri nêerşaweni.',
+'eauthentsent' => 'Adreso ke şıma dayo ma, ma yew e-posta rışt uca, o e-posta de kodê araşt kerdış esto.
+Heta ke şıma o e-postaaraşt nêkeri ma yewna e-posta şıma ri nêrışêno.',
 'throttled-mailpassword' => 'Parola vir ardış, zerreyê {{PLURAL:$1|yew seet|$1 seet}} de erşawiya.
 Parola her {{PLURAL:$1|yew seete|$1 seete}} de yew rey erşawiyena.',
 'mailerror' => 'Erşawıtışe xetayê e-posta: $1',
@@ -756,7 +800,7 @@ xulasa ney kesê ke IP adresê şıma xebıtneni hini nêeşkeni ney ra zêdêr
 'emailnotauthenticated' => 'No format de nuştışê e-postayi qebul nêbeno.
 Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
 'noemailprefs' => 'Hesab biyo a.',
-'emailconfirmlink' => 'E-postayê xo tesdiq kere',
+'emailconfirmlink' => 'E-postayê xo araşt kerê',
 'invalidemailaddress' => 'No format de nuştışê e-postayi qebul nêbeno. Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
 'cannotchangeemail' => 'E-postay hesabi ena wiki sera nêvurneyêno.',
 'emaildisabled' => 'Na site ra e-posta nêrışêno.',
@@ -795,9 +839,9 @@ Bıne vındere u newe ra dest pê bıkere.',
 'resetpass-temp-password' => 'parolayo muweqet:',
 
 # Special:PasswordReset
-'passwordreset' => 'Parola ancia bınuse',
+'passwordreset' => 'Parola reset ke',
 'passwordreset-text' => 'Nê formi melumatê hesab dê şıma birê şıma viri deye pırkerê.',
-'passwordreset-legend' => 'Parola ancia bınuse',
+'passwordreset-legend' => 'Parola reset ke',
 'passwordreset-disabled' => 'Parola reset kerdış ena viki sera qefılneyayo.',
 'passwordreset-pretext' => '{{PLURAL:$1||Enê cerenan ra jeweri defiye de}}',
 'passwordreset-username' => 'Namey karberi:',
@@ -827,10 +871,10 @@ Parola vêrdiye: $2',
 # Special:ChangeEmail
 'changeemail' => 'E-posta adresa xo bıvurnê',
 'changeemail-header' => 'E-posya adresta hesabdê xo bıvurnê',
-'changeemail-text' => 'Şıma qayılê ke e-postay xo bıvurnê se enê formi pırkerê. Qandê tesdiq kerdışi zi parolay xo şıma de bınusnê',
+'changeemail-text' => 'Şıma qayılê ke e-postay xo bıvurnê se enê formi pırkerê. Qandê araşt kerdışi zi parolay xo şıma de bınusnê',
 'changeemail-no-info' => 'Resayışê ena pela rê Dekewtış icab keno.',
 'changeemail-oldemail' => 'E-postay şımaya newki:',
-'changeemail-newemail' => 'E-postay şımayê newe:',
+'changeemail-newemail' => 'E-posta adresiyo newe:',
 'changeemail-none' => '(Çıno)',
 'changeemail-submit' => 'E-postay xo bıvurne',
 'changeemail-cancel' => 'Bıterkne',
@@ -844,11 +888,11 @@ Parola vêrdiye: $2',
 'link_tip' => 'Gırê dahili',
 'extlink_sample' => 'http://www.example.com titleya gire',
 'extlink_tip' => 'Çımeyo tewer (http:// prefix)',
-'headline_sample' => 'nuşteyo headline',
+'headline_sample' => 'nuştey xeta seri',
 'headline_tip' => 'Ket 2 headline',
 'nowiki_sample' => 'Non-format nuşte itiya ra bıerz',
 'nowiki_tip' => 'Formatê wiki iptal bık',
-'image_sample' => 'resım bıerze cı',
+'image_sample' => 'Misal resim.jpg',
 'image_tip' => 'Dosyaya embedi',
 'media_sample' => 'misal.jpg',
 'media_tip' => 'Gırey dosya',
@@ -858,13 +902,13 @@ Parola vêrdiye: $2',
 # Edit pages
 'summary' => 'Xulasa:',
 'subject' => 'Mewzu/serrêze:',
-'minoredit' => 'Vurnayışo qıckeko',
+'minoredit' => 'Vurnayışo werdı',
 'watchthis' => 'Ena pele seyr ke',
-'savearticle' => 'Ena pele qeyd ke',
+'savearticle' => 'Peler qeyd ke',
 'preview' => 'Verqayt',
-'showpreview' => 'Verqayti bımocne',
-'showlivepreview' => 'Live preview',
-'showdiff' => 'Vurnayışan bımocne',
+'showpreview' => 'Verqayti bıvin',
+'showlivepreview' => 'Verqayto cıwın',
+'showdiff' => 'Vurnayışa bıvin',
 'anoneditwarning' => 'Teme!: Şıma bı hesabê xo nıkewtê cı. Hurêndiya namey şıma dı IP-adresa şıma qeyd bena u asena.',
 'anonpreviewwarning' => "''Ti hama nicikewte. Qeyd kerdiş zerre tarixê pele de adresê IP yê tu keyd keno.''",
 'missingsummary' => "'''DİQET:''' Şıma kılmnuşte nıkerd.
@@ -882,25 +926,25 @@ Sebebê musade nêdayiş: \'\'$2\'\'.
 
 * Dest pê kerdışê musade nêdayiş: $8
 * Qedyayişê musade nêdayiş: $6
-* Muddetê musade nêdayiş: $7
+* Oyo ke cı rê musade nêdeyêno: $7
 
-Eke şıma sebebê musade nêdayiş ri itiraz keni, $1 de ya zi yewna [[{{MediaWiki:Grouppage-sysop}}|xızmkar]] de şıma eşkeni na mesela de qıse bıkeri. [[Special:Preferences|Tercihlerim]] eke şıma na qısme de pey yew e-postayo raşt nêkewte cı, şıma xususiyetê "Karber ri e-posta bışaw" ra n3eeşkeni istifade bıkeri, eke şıma tercihanê xo bıerz zerreyê e-postayê xo şıma hıni eşkeni e-posta bışawi.
-<br />IP adresê şıma yo nıkayın $3, numrayo musade nêdayiş #$5.
-<br />Eke şıma qayile yew xızmkar çiko bıpers, no malumatan not bıkere ney şıma ri lazım beni.',
-'autoblockedtext' => 'IP adresê şıma otomotikmen verniya grewya, çunke yewna ten $1 no numra şuxulnayene u no numra zi verniye gırewte bi.
-Sebeb noyo:
+Eke şıma sebebê musade nêdayiş ri itiraz keni, $1 de ya zi yewna [[{{MediaWiki:Grouppage-sysop}}|xızmetkar]] de şıma eşkeni na mesela de qıse bıkeri. [[Special:Preferences|Tercihê]] eke şıma na qısme de pey yew e-postayo raşt nêkewte cı, şıma xususiyetê "Karber ri e-posta bırışê" ra nêeşkeni istifade bıkeri, eke şıma tercihanê xo bıerz zerreyê e-postayê xo şıma hıni şenê ep-posta bırışê.
+<br />IP adresê şıma yo nıkayın $3, numreya musade nêdayiş #$5.
+<br />Eke şıma qayile yew xızmkar çiko bıpers, no malumatan not bıkere ney şıma rê lazım beni.',
+'autoblockedtext' => 'IP adresê şıma otomotikmen kerda kılit, çıkı $1 verniya nê hesabi grota.
+Sebebê cı zi:
 
 :\'\'$2\'\'
 
-* Dest pê kerdışê musade nêdayiş: $8
-* Qedyayişê musade nêdayiş: $6
-* Qayili bloke bıbo: $7
+* Dest pê kerdışê verni grotışi: $8
+* Qedyayişê verni grotışi: $6
+* Qayile ke bloqe bıbo: $7
 
-Şıma qayile qey weri kewtışê na mesela, pê $1 ya zi [[{{MediaWiki:Grouppage-sysop}}|serkaran ra]] yew de eşkeni irtibat bıkeri.
+Şıma qayile qey weri kewtışê na mesela,  $1 ya na [[{{MediaWiki:Grouppage-sysop}}|serkaran ra]] yewi ra şenê irtibat kewê.
 
-Not, [[Special:Preferences|Tercihê karberi]] eke şıma yew e-postayo raşt nênuşt şıma nêeşkeni na xususiyet ra "karber ri e-posta bışıraw" istifade bıkeri.
+Not, [[Special:Preferences|Tercihê karberi]] eke şıma yew e-postayo raşt nênuşt se şıma nêşenê na xususiyet ra "karber rê e-posta bırışê" istifade bıkeri.
 
-IP numre şıma yo nıkayın $3 u ID şıma yo ke musade nêdaye #$5. Eke şıma yew tehqiqat vırazeni malumatê corınan xo vir ra mekere.',
+IP adresiya şıma yo nıkayên $3 u ID şıma yo ke musade nêdaye #$5. Eke şıma yew tehqiqat vırazeni malumatê corênan xo vira mekerê.',
 'blockednoreason' => 'sebeb nidaniyo',
 'whitelistedittext' => 'Eka ti wazene binusi ti gani  $1.',
 'confirmedittext' => 'Eka ti wazene binusi, adresê xo e-maili confirme bike.
@@ -927,14 +971,19 @@ ya zi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena pele bıvurne]</span>.',
 'noarticletext-nopermission' => 'No pel nıka veng o.
 No sernuşte şıma [[Special:Search/{{PAGENAME}}|pelanê binan de eşkeni bıgeri]]
 ya zi <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} itara eşekeni bıgere].</span>',
+'missing-revision' => 'Rewizyonê name dê pela da #$1 "{{PAGENAME}}" dı çıniyo.
+
+No normal de tarix dê pelanê besterneyan dı ena xırabin asena.
+Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.',
 'userpage-userdoesnotexist' => 'Hesabê karberi "<nowiki>$1</nowiki>" qeyd nêbiyo.
 Kerem ke, tı ke wazenay na pele bafernê/bıvurnê, qontrol ke.',
 'userpage-userdoesnotexist-view' => 'Hesabê karberi "$1" qeyd nêbiyo.',
 'blocked-notice-logextract' => 'No karber/na karbere emanet blokekerdeyo/blokekediya.
 Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'clearyourcache' => "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo.
-*'''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi ''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');,
-*'''IE:''' ''Ctrl-F5'', '''Konqueror:''' tena tuşê pelaya newi ra bar kere cı sernê.",
+*'''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');,
+*'''IE:''' ''Ctrl-F5' piya pıploxnê ke wa newe bo', 
+* '''Operar:'''hacetan ra şı rê →tercihan ra bıvurnen",
 'usercssyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
 'userjsyoucanpreview' => "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
 'usercsspreview' => "'''şıma tena verqaydê dosyayê CSS vineni.''' '''Dosyayê Karberi CSS hema qayd nebiyo!'''",
@@ -976,9 +1025,9 @@ Wexta ke şıma butonê \"{{int:savearticle}}\" tıkna '''teyna''' nuşteyo cori
 'nonunicodebrowser' => "'''DİQET: Browserê şıma u unicode yewbini nêgeni. Qey izin dayişê vurnayişê pelan: Karakteri ke ASCII niyê; zerreyê qutiyê vurnayişi de kodi (cod) şiyes-şiyes aseni.'''",
 'editingold' => "'''DİQET: Şıma pelo revizebiyaye de vurnayiş keni. Eke şıma qayd bıkeri vurnayişi ke pelo revizebiyayiş ra heta ewro biyê, pêroyê ey beni vini.'''",
 'yourdiff' => 'pêverronayiş',
-'copyrightwarning' => "'''Teme''': Ena {{SITENAME}} dı iştirakanê hemi bınê \$2 (qe informasyonê zafyeri: \$1) vêrenê. Eg tı nıwazen ser nuşteyan tı karberan bıhewit ya zi bıcebiri/bıvurni, itiya dı nınusi.<br />
-Tı ma ri soz dano ki tı nuşte xo oricinali nuşt, ya zi tı yew dokumantê umumi ra kopya keno.
-'''İTİYA DI METARİYALÊ \"COPYRIGHT\"İ NINUSİ!.'''",
+'copyrightwarning' => "'''Recayê ikazi:''' Sita da {{SITENAME}} ra iştıraqi pêro umışin da $2 zerredeyo (teferruata rê $1'i bıvinê).
+İştıraqê şıma, şıma kayıl niyê ke yewna merdumi kerpeyina bıvurnê yana yewna caya ra vılakerê se, iştıraq mekewê.<br />
+Fına zi qayılê ke  iştıraq kewê, Şıma qayılê kê şar vaco eno nuşte felani nuşnayo yana resmi meqeman ra zanayışê cı  u malumatê cı esto/ Xoseri cayan ra groti rê şıma qerenti danê. '''Tiya dı, şıma wêrê telifira mısade nêgroto se eserê cı tiya vıla mekerê! '''",
 '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'''",
@@ -1023,7 +1072,7 @@ Hewna kerde aseno.',
 'edit-no-change' => 'Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.',
 'edit-already-exists' => 'Pelo newe nêvıraziyeno.
 Pel ca ra esto.',
-'defaultmessagetext' => 'Normal metnê nuşti',
+'defaultmessagetext' => 'Hesıbyaye metne mesaci',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Hişyari: No pel de fonksiyoni zaf esti.
@@ -1044,6 +1093,7 @@ Taye şabloni zerre pel de nêmociyayeni.',
 'expansion-depth-exceeded-warning' => 'Ravêriya pela xori herayêna',
 'parser-unstrip-loop-warning' => 'Unstrip lete vineya',
 'parser-unstrip-recursion-limit' => 'Sinorê limit dê qayış dê ($1) ravêrya',
+'converter-manual-rule-error' => 'Rehberê zıwan açarnayışi dı xırabin tesbit biya',
 
 # "Undo" feature
 'undo-success' => 'No vurnayiş tepeye geryeno. pêverronayişêyê cêrıni kontrol bıkeri.',
@@ -1221,7 +1271,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 
 # Diffs
 'history-title' => 'Rewizyonê $1:',
-'difference-title' => 'Ferkê revizyonan de "$1"',
+'difference-title' => 'Pela "$1" ferqê çım ra viyarnayışan',
 'difference-title-multipage' => 'Ferkê pelan dê "$1" u "$2"',
 'difference-multipage' => '(Ferqê pelan)',
 'lineno' => 'Rêza $1i:',
@@ -1230,6 +1280,10 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'editundo' => 'peyser bia',
 'diff-multi' => '({{PLURAL:$1|Yew revizyono miyanên|$1 revizyonê miyanêni}} terefê {{PLURAL:$2|yew karberi|$2 karberan}} nêmocno)',
 'diff-multi-manyusers' => '({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)',
+'difference-missing-revision' => 'Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.
+
+No normal de werênayış dê pelanê besterneyan dı ena xırabin asena.
+Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.',
 
 # Search results
 'searchresults' => 'Neticeyê geyrayışi',
@@ -1260,10 +1314,10 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'searchprofile-advanced' => 'Reverşiyoğî',
 'searchprofile-articles-tooltip' => '$1 de bigêre',
 'searchprofile-project-tooltip' => '$1 de bigêre',
-'searchprofile-images-tooltip' => 'Qe doyayî bigêre',
+'searchprofile-images-tooltip' => 'Dosya cı geyr',
 'searchprofile-everything-tooltip' => 'Tedeestey hemine cı geyre (pelanê mınaqeşey zi tey)',
 'searchprofile-advanced-tooltip' => 'qe cayê nimeyî bigêre',
-'search-result-size' => '$1 ({{PLURAL:$2|1 kelime|$2 kelimey}})',
+'search-result-size' => '$1 ({{PLURAL:$2|1 çekuyo|$2 çekuyê}})',
 'search-result-category-size' => '{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 ketegoriyê bini|$2 kategiryanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})',
 'search-result-score' => 'Eleqa: $1%',
 'search-redirect' => '(ber $1)',
@@ -1280,11 +1334,11 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'searchrelated' => 'eleqayî',
 'searchall' => 'têdıne',
 'showingresults' => "Heta {{PLURAL:$1|'''1''' netice|'''$1''' neticeyan}} ke pê #'''$2''' başli beno ey bimocne .",
-'showingresultsnum' => "Heta binê {{PLURAL:$3|'''1''' netice|'''$3''' neticeyan}} ke pê #'''$2''' başli beno ey bimocne .",
+'showingresultsnum' => "'''$2''' netican ra nata  {{PLURAL:$3|'''1''' netice|'''$3''' neticeyê}} cêrde liste biyê.",
 'showingresultsheader' => "{{PLURAL:$5|Neticeyê '''$1''' of '''$3'''|Neticeyanê '''$1 - $2''' of '''$3'''}} qe '''$4'''",
 'nonefound' => "'''Teme''': Teyna tay namecayan cıgeyro beno.
 Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mınaqeşe, templatenan, ucb.) ya zi cıgeyro ser namecay ki tı wazeni.",
-'search-nonefound' => 'Ser ena çekuye de netice çino',
+'search-nonefound' => 'Zey cıgeyrayış de şıma netice nêvineya',
 'powersearch' => 'Cıgeyrayışo hera',
 'powersearch-legend' => 'Cıgeyrayışo hera',
 'powersearch-ns' => 'Cayanê nameyan de cıgeyrayış:',
@@ -1292,13 +1346,13 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'powersearch-field' => 'Seba cı seyr ke',
 'powersearch-togglelabel' => 'Qontrol ke:',
 'powersearch-toggleall' => 'Pêro',
-'powersearch-togglenone' => 'Çıno',
+'powersearch-togglenone' => 'Çıniyo',
 'search-external' => 'Cıgeyrayışê teberi',
 'searchdisabled' => '{{SITENAME}} no keyepel de cıgerayiş muweqqet bıryayo. no benatê de şıma pê Google eşkeni zerreyê {{SITENAME}} de cıgerayiş bıkeri.',
 
 # Quickbar
 'qbsettings' => 'Çûwo pêt',
-'qbsettings-none' => 'Çıno',
+'qbsettings-none' => 'Çıniyo',
 'qbsettings-fixedleft' => 'Rêcaene çhep',
 'qbsettings-fixedright' => 'Rêcaene raşt',
 'qbsettings-floatingleft' => 'rêcaene çhep',
@@ -1307,7 +1361,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 
 # Preferences page
 'preferences' => 'Tercihi',
-'mypreferences' => 'Tercihê mı',
+'mypreferences' => 'Tercihi',
 'prefs-edits' => 'Amarê vurnayışan:',
 'prefsnologin' => 'Şıma cıkewtış nêvıraşto',
 'prefsnologintext' => 'Şıma gani be <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} cikewte]</span> ke tercihanê karberi xo eyar bıkerê.',
@@ -1335,7 +1389,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'prefs-rendering' => 'Asayış',
 'saveprefs' => 'Star ke',
 'resetprefs' => 'Vurnayışê ke qeyd nêbiy, pak ke',
-'restoreprefs' => 'Sazanê standardan pêron newe dere barke',
+'restoreprefs' => 'Sazanê hesıbyaya pêron newe dere barke',
 'prefs-editing' => 'Cay pela nustısi',
 'prefs-edit-boxsize' => 'Ebatê pencereyê vurnayîşî.',
 'rows' => 'Xeti:',
@@ -1346,7 +1400,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'stub-threshold-disabled' => 'Dezge ra vıcyaya',
 'recentchangesdays' => 'Rocê ke vurnayışanê peyênan de bıasê:',
 'recentchangesdays-max' => 'Tewr zaf $1 {{PLURAL:$1|roc|roci}}',
-'recentchangescount' => 'Amarê vurnayışiê ke standard bıasê:',
+'recentchangescount' => 'Amarê vurnayışê ke hesıbyaye deye bımocneyê:',
 'prefs-help-recentchangescount' => 'Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.',
 'prefs-help-watchlist-token' => 'Eke no ca pê kılito dızdeni/miyanki pırr bo, lista şımawa seyrkerdışi rê yew cıresnayışê RSSi vıraziyeno.
 Her kamo ke nê kılitê nê cay zaneno, şeno lista şımawa seyrkerdışi ki bıwano, coke ra yewo sağlem weçine.
@@ -1369,11 +1423,11 @@ Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê:
 'timezoneregion-europe' => 'Ewrope',
 'timezoneregion-indian' => 'Okyanuso Hind',
 'timezoneregion-pacific' => 'Okyanuso Pasifik',
-'allowemail' => 'Karberanê binan ra e-mail qebul bıke',
+'allowemail' => 'Karberê bini wa bışê mı rê e-posta bırışê.',
 'prefs-searchoptions' => 'Tercihê cıgeyrayışi',
 'prefs-namespaces' => 'Caê namey',
 'defaultns' => 'Eke heni, enê cayanê namey de cı geyre (sae ke):',
-'default' => 'default',
+'default' => 'hesıbyaye',
 'prefs-files' => 'Dosyey',
 'prefs-custom-css' => 'CSSê xasi',
 'prefs-custom-js' => 'JSê xasi',
@@ -1398,7 +1452,7 @@ Na game tepeya nêerziyena.',
 'badsig' => 'Îmzayê tu raşt niyo.
 Etiketê HTMLî kontrol bike.',
 'badsiglength' => 'İmzayê şıma zaf dergo.
-$1 gani bınê no {{PLURAL:$1|karakter|karakter}}de bıbo.',
+$1 gani bınê no {{PLURAL:$1|karakter|karakter}} de bıbo.',
 'yourgender' => 'Neri makey:',
 'gender-unknown' => 'Cınsiyet nêvato',
 'gender-male' => 'cıwamêrd',
@@ -1456,22 +1510,22 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 # Groups
 'group' => 'Grup:',
 'group-user' => 'Karberi',
-'group-autoconfirmed' => 'Karberê ke otomatikmen tesdiq biy',
+'group-autoconfirmed' => 'Karberê ke xob xo biyê araşt',
 'group-bot' => 'Boti',
 'group-sysop' => 'İdarekari',
 'group-bureaucrat' => 'Burokrati',
-'group-suppress' => 'Kontroli',
+'group-suppress' => 'Çımpawıteni',
 'group-all' => '(pêro)',
 
 'group-user-member' => '{{GENDER:$1|karber}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|Karbero ke otomotik tesdiq biyo}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|Karberê ke xob xo biyê araşt}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => '{{GENDER:$1|İdarekar}}',
 'group-bureaucrat-member' => '{{GENDER:$1|buroqrat}}',
 'group-suppress-member' => '{{GENDER:$1|Temaşekar}}',
 
 'grouppage-user' => '{{ns:project}}:Karberi',
-'grouppage-autoconfirmed' => '{{ns:project}}: karberê tesdiqbiyaey',
+'grouppage-autoconfirmed' => '{{ns:project}}:Karberê ke xob xo biyê araşt',
 'grouppage-bot' => '{{ns:project}}:Boti',
 'grouppage-sysop' => '{{ns:project}}:İdarekeri',
 'grouppage-bureaucrat' => '{{ns:project}}:Burokrati',
@@ -1494,7 +1548,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-reupload-own' => 'Dosyeyê ke to bar kerdi, inan sero bınuse',
 'right-reupload-shared' => 'Dosyeyê ke ambarê medyao barekerde de, inan mehelli wedare',
 'right-upload_by_url' => 'Yew URL ra dosyan bar bıke',
-'right-purge' => 'Seba yew pela ke tesdiq nêbiya, viria (cache) keypele pak bıke',
+'right-purge' => 'Verde ju pela araşt kerdışi hafızay sita besterne',
 'right-autoconfirmed' => 'Pelanê ke nême kılit biyê, inan bıvurne',
 'right-bot' => 'Zey yew karê xoserkerdey be',
 'right-nominornewtalk' => 'Pelanê werênayışan rê vurnayışê qıckeki çıniyê, qutiya mesacanê newiyan bıgurene',
@@ -1502,6 +1556,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-writeapi' => 'İstıfadey APIyê nuştey',
 'right-delete' => 'Pele bestere',
 'right-bigdelete' => 'Pelanê be tarixanê dergan bestere',
+'right-deletelogentry' => 'besternayış u mebesternayışa re qeyde definayışê xısusi',
 'right-deleterevision' => 'Vurnayışê xısusiyê ke ê pelanê, inan bestere ya peyser bia',
 'right-deletedhistory' => 'Qeydanê tarixanê esterıteyan de qayt ke, bê nuştey inan',
 'right-deletedtext' => 'Mabênê newede vurnayışanê esterıtiyan de qaytê nuştey esterıtey u vurnayışan ke',
@@ -1589,7 +1644,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'recentchanges-summary' => 'Ena pele de wiki sero vurnayışê peyêni teqib ke',
 'recentchanges-feed-description' => 'Ena feed dı vurnayişanê tewr peniyan teqip bık.',
 'recentchanges-label-newpage' => 'Enê vurnayışi pelaya newi vıraşt',
-'recentchanges-label-minor' => 'Eno yew edîto qickek o',
+'recentchanges-label-minor' => 'Eno vurnayışo do qickek o',
 'recentchanges-label-bot' => 'Eno vurnayış terefê yew boti ra vıraziyo',
 'recentchanges-label-unpatrolled' => 'Eno edît patrol nibiyo',
 'rcnote' => "Bıni dı {{PLURAL:$1|is '''1''' vurnayış|peni '''$1''' vurnayışan estê}} {{PLURAL:$2|roc|'''$2''' roci}}, hetani $5, $4.",
@@ -1601,12 +1656,12 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'rcshowhideanons' => 'karberanê anoniman $1',
 'rcshowhidepatr' => '$1 vurnayışê ke dewriya geyrayê',
 'rcshowhidemine' => 'nuştışanê mı $1',
-'rclinks' => 'Peyni rocan de vurnayışa $1  $2 roci dı<br />$3',
+'rclinks' => 'Peyni $2 rocan de vurnayışa $1  bımocne <br />$3',
 'diff' => 'ferq',
 'hist' => 'verên',
 'hide' => 'Bınımne',
 'show' => 'Bımocne',
-'minoreditletter' => 'werdı',
+'minoreditletter' => 'w',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'unpatrolledletter' => '!',
@@ -1648,9 +1703,9 @@ Logê wedariyayiş u berdişi seba ena pele a ti ra xezir kerda:",
 Dosyayê ke vera cû bar biyê eke şima qayîl e ney dosyayan bivînê ya zî bigerî biewnê[[Special:FileList|listeyê dosyayê bar bîyaye]] (tekrar) bar bîyaye [[Special:Log/upload|rocaneyê barkerdişî]] de, hewn a şîyaye zî tîya de [[Special:Log/delete|rocaneyê hewn a kerdişî]] pawiyene.
 
 wexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişuxulne;
-* Qey xebitnayişê dosyayî: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.jpg]]</nowiki></tt>'''
-*Heto çep de zerreyê yew qutî de, qey xebitnayişi 'nuşteyê binîn' û 200 pikseli: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.png|200px|thumb|left|alt metin]]</nowiki></tt>'''
-* Dosya memocın, dosya te direk gırey bıerz: '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosya.ogg]]</nowiki></tt>'''",
+* Qey xebitnayişê dosyayî: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.jpg]]</nowiki></code>'''
+*Heto çep de zerreyê yew qutî de, qey xebitnayişi 'nuşteyê binîn' û 200 pikseli: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.png|200px|thumb|left|alt metin]]</nowiki></code>'''
+* Dosya memocın, dosya te direk gırey bıerz: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosya.ogg]]</nowiki></code>'''",
 'upload-permitted' => 'Tipanê dosyayi ke izin ey estê: $1.',
 'upload-preferred' => 'Tipanê dosyayi ke tercihe ey estê: $1',
 'upload-prohibited' => 'Babetê dosyayanê tometebiyayeyan: $1.',
@@ -1662,7 +1717,7 @@ wexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişux
 'fileuploadsummary' => 'Xulasa:',
 'filereuploadsummary' => 'Vurnayîşê dosyayî:',
 'filestatus' => 'Weziyetê heqê telifiye:',
-'filesource' => 'Çımey:',
+'filesource' => 'Çıme:',
 'uploadedfiles' => 'Dosyayê ke bar biye',
 'ignorewarning' => 'Îkazi kebul meke u dosya reyna bar bike',
 'ignorewarnings' => 'Îkazi kebul meke',
@@ -1692,19 +1747,19 @@ gırdîyê na dosyayi $2.',
 'largefileserver' => 'Ena dosya zaf girde ke server kebul nikeno.',
 'emptyfile' => 'dosya ya ke şıma bar kerda veng asena, nameyê dosyayi şaş nusyaya belka.',
 'windows-nonascii-filename' => 'Na wiki namen de dosyayan de xısusi karaxtera karkerdışa peşti nêdana.',
-'fileexists' => "no name de yew dosya ca ra esta.
-Eke şıma emin niyê bıvurni bıewne na dosya'''<tt>[[:$1]]</tt>'''
-[[$1|thumb]]",
-'filepageexists' => "qey na dosya pelê eşkera kerdışi '''<tt>[[:$1]]</tt>''' na adresi de ca ra vıraziyayo labele no name de yew dosya nêasena.
+'fileexists' => 'no name de yew dosya ca ra esta.
+Eke şıma emin niyê bıvurni bıewne na dosya<strong>[[:$1]]</strong>
+[[$1|thumb]]',
+'filepageexists' => 'qey na dosya pelê eşkera kerdışi <strong>[[:$1]]</strong> na adresi de ca ra vıraziyayo labele no name de yew dosya nêasena.
 kılmnuşteyê şıma nêasena eke şıma qayili bıvini gani şıma pê dest bıvurni
-[[$1|resimo qıc]]",
-'fileexists-extension' => "zey no nameyê dosyayi yewna nameyê dosyayi esta: [[$2|thumb]]
-* dosyaya ke bar biya: '''<tt>[[:$1]]</tt>'''
-* dosyaya ke ca ra esta: '''<tt>[[:$2]]</tt>'''
-kerem kere yewna name bıvıcinê",
+[[$1|resimo qıc]]',
+'fileexists-extension' => 'zey no nameyê dosyayi yewna nameyê dosyayi esta: [[$2|thumb]]
+* dosyaya ke bar biya: <strong>[[:$1]]</strong>
+* dosyaya ke ca ra esta: <strong>[[:$2]]</strong>
+kerem kere yewna name bıvıcinê',
 'fileexists-thumbnail-yes' => "na dosya wina asena ke versiyona yew resmê qıc biyayeya ''(thumbnail)''. [[$1|thumb]]
-kerem kerê '''<tt>[[:$1]]</tt>''' na dosya konrol bıkerê .",
-'file-thumbnail-no' => "nameyê na dosyayi pê ney '''<tt>$1</tt>''' dest keno pê.
+kerem kerê <strong>[[:$1]]</strong> na dosya konrol bıkerê .",
+'file-thumbnail-no' => "nameyê na dosyayi pê ney <strong>$1</strong> dest keno pê.
 na manena ke versiyona yew resmê qıc biyaye ya ''(thumbnail)''",
 'fileexists-forbidden' => 'no name de yew dosya ca ra esta u ser nuştış nêbeno.
 eke şıma qayile dosyaya xo bar keri tepiya agerê u yew nameyo newe bınusi. [[File:$1|thumb|center|$1]]',
@@ -1812,6 +1867,7 @@ Eke problem dewam kerd [[Special:ListUsers/sysop|serkari]] de irtibat kewe.',
 'lockmanager-fail-releaselock' => 'Dosyay kıliti nêvıradeyê "$1".',
 'lockmanager-fail-db-bucket' => 'Kılite malumat da sitıl de $1 irtibat kewtışi re bes nêkeno.',
 'lockmanager-fail-db-release' => 'Malumatê kıliti nêvıradeyê $1.',
+'lockmanager-fail-svr-acquire' => 'Kılitê teqdimkarê $1i nêvêniyenê.',
 'lockmanager-fail-svr-release' => 'Wasterê kıliti nêvıradeyê $1.',
 
 # ZipDirectoryReader
@@ -1871,7 +1927,7 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 
 'license' => 'Lisans:',
 'license-header' => 'Lisans',
-'nolicense' => 'Çik niweçiyeyo',
+'nolicense' => 'Theba nêweçineya',
 'license-nopreview' => '(verqeydî çin o)',
 'upload_source_url' => '(yew URLê raştî, şar rê akerde yo)',
 'upload_source_file' => '(komputerê ti de yew dosya)',
@@ -1886,7 +1942,7 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 'listfiles_name' => 'Name',
 'listfiles_user' => 'Karber',
 'listfiles_size' => 'Gırdiye',
-'listfiles_description' => 'Vatiş/deskripsiyon',
+'listfiles_description' => 'Şınasiyen',
 'listfiles_count' => 'Versiyoni',
 
 # File description page
@@ -1904,7 +1960,7 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 'filehist-user' => 'Karber',
 'filehist-dimensions' => 'Dimensiyoni',
 'filehist-filesize' => 'Ebatê dosyayî',
-'filehist-comment' => 'Vatış',
+'filehist-comment' => 'Mışewre',
 'filehist-missing' => 'Dosya nieseno',
 'imagelinks' => 'Gurenayışê dosya',
 'linkstoimage' => 'Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:',
@@ -1929,10 +1985,11 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'shared-repo' => 'yew embarê repositoryî',
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
 'filepage.css' => '/* CSS placed here is included on the file description page, also included on foreign client wikis */',
+'upload-disallowed-here' => 'Nê asengi sero theba nênusneyêno.',
 
 # File reversion
 'filerevert' => '$1 reyna biyere',
-'filerevert-legend' => 'Dosya reyna biyere',
+'filerevert-legend' => 'Dosya ber weziyet do verên',
 'filerevert-intro' => "Ti ho ena dosyayê '''[[Media:$1|$1]]'''î  [$4 versiyonê $3, $2] rê reyna anî.",
 'filerevert-comment' => 'Sebeb:',
 'filerevert-defaultcomment' => 'Versiyonê $2, $1 rê reyna ard',
@@ -1962,8 +2019,8 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 
 # MIME search
 'mimesearch' => 'MIME bigêre',
-'mimesearch-summary' => 'no pel, no tewır dosyayan MIME kontrol kena. kewteye: tipa zerreyi/tipa bıni, e.g. <tt>resim/jpeg</tt>.',
-'mimetype' => 'Tipê MIME:',
+'mimesearch-summary' => 'no pel, no tewır dosyayan MIME kontrol kena. kewteye: tipa zerreyi/tipa bıni, e.g. <code>resim/jpeg</code>.',
+'mimetype' => 'Babetê NIME',
 'download' => 'bar ke',
 
 # Unwatched pages
@@ -1978,7 +2035,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'unusedtemplateswlh' => 'linkanê binî',
 
 # Random page
-'randompage' => 'Kamci pele ke raşt amê',
+'randompage' => 'Peleya ke raştamê',
 'randompage-nopages' => 'Ena {{PLURAL:$2|cayêname|cayênameyî}} de enê pelan çin o: $1.',
 
 # Random redirect
@@ -2008,7 +2065,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 
 'disambiguations' => 'Pelayê ke maneyo bini rê gırey cı esto',
 'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => 'satıro ewwil de ke peli ca genî; gıreyê pelê ciya-manayi mocneni. İkinci sırada <br />tiya de [[MediaWiki:Disambiguationspage]] gani heme gıreyê şablonê ciya-manayan  re gıre bıdiyo',
+'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.",
 
 'doubleredirects' => 'Hetenayışê dıletıni',
 'doubleredirectstext' => 'no pel pelê ray motışani liste keno.
@@ -2033,6 +2090,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|bayti}}',
 'ncategories' => '$1 {{PLURAL:$1|Kategoriye|Kategoriy}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikiy}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linkî}}',
 'nmembers' => '$1 {{PLURAL:$1|eza|ezayan}}',
 'nrevisions' => '$1 {{PLURAL:$1|revizyon|revizyonî}}',
@@ -2061,6 +2119,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'mostlinkedtemplates' => 'Şablonê ke tewr zafî pela re gıre bîye.',
 'mostcategories' => 'Pelan ke tewr zaf kategorî estê.',
 'mostimages' => 'Dosyayan ke tewr zaf link estê.',
+'mostinterwikis' => 'Pelan ke tewr zaf interwiki biyê.',
 'mostrevisions' => 'Pelan ke tewr zaf revizyonî biyê.',
 'prefixindex' => 'Veroleya peley pêro',
 'prefixindex-namespace' => 'Peleyê Veroleyıni ($1 cay nami)',
@@ -2095,7 +2154,7 @@ Xo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gı
 'nopagetext' => 'pelê hedefi ke şıma nişane kerdo çin o.',
 'pager-newer-n' => '{{PLURAL:$1|newiyer 1|newiyer $1}}',
 'pager-older-n' => '{{PLURAL:$1|Kıhanyer 1|Kıhanyer $1}}',
-'suppress' => 'Kontrol',
+'suppress' => 'Çımpawıten',
 'querypage-disabled' => 'Na pelaya xısusi,sebeb de performansi ra qefılneyê.',
 
 # Book sources
@@ -2107,10 +2166,10 @@ Xo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gı
 'booksources-invalid-isbn' => 'ISBN raşt nêasena bıewnê çımeyê orjinali, raşt kopya biya nê nêbiyaya?',
 
 # Special:Log
-'specialloguserlabel' => 'Weskedar:',
+'specialloguserlabel' => 'Kerdoğ:',
 'speciallogtitlelabel' => 'Menzil (sernuşte yana karber):',
 'log' => 'Qeydi',
-'all-logs-page' => 'Loganê umum yê hemî',
+'all-logs-page' => 'Umumi qeydi pêro',
 'alllogstext' => 'qey {{SITENAME}}i mocnayişê heme rocaneyani.
 tipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyna hessasiyê herfa pil u qıciyi) bıweçine u esayiş qıc kerê.',
 'logempty' => 'qaydi de weina yew malumat çino',
@@ -2127,9 +2186,9 @@ tipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyn
 'allarticles' => 'Peli pêro',
 'allinnamespace' => 'Peli pênro ( $1 cayênameyî)',
 'allnotinnamespace' => 'Pelanê hemî ($1 cayênameyî de niyo)',
-'allpagesprev' => 'Verêni',
+'allpagesprev' => 'Verên',
 'allpagesnext' => 'ver şo',
-'allpagessubmit' => 'Şo',
+'allpagessubmit' => 'Biya',
 'allpagesprefix' => 'herfê ke şıma tiya de nuşti, pê ney herfan pelê ke destpêkenê liste ker:',
 'allpagesbadtitle' => 'pel o ke şıma kewenî cı, nameyê no peli de gıreyê zıwanan u wikiyi re elaqa esto, ê ra cıkewtış qebul niyo. ya zi sernameyan de karakterê qedexeyi tede esto.',
 'allpages-bad-ns' => '{{SITENAME}} keyepel de wina "$1" yew nameyê cayi çino.',
@@ -2150,9 +2209,9 @@ hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
 'special-categories-sort-abc' => 'alfabetik rêz ker',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'Îştirakê karberî wederna',
+'deletedcontributions' => 'İştiraqê karberan de besternayına',
 'deletedcontributions-title' => 'Îştirakê karberî wederna',
-'sp-deletedcontributions-contribs' => 'îştirakî',
+'sp-deletedcontributions-contribs' => 'pêşteni',
 
 # Special:LinkSearch
 'linksearch' => 'Gıreyê teberi cı geyrê',
@@ -2160,7 +2219,7 @@ hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
 'linksearch-ns' => 'Cayênameyî:',
 'linksearch-ok' => 'Cı geyre',
 'linksearch-text' => 'joker ê zey "*.wikipedia.org"i karneno.<br />
-qaydeyê destek biyayeyi: <tt>$1</tt>',
+qaydeyê destek biyayeyi: <code>$1</code>',
 'linksearch-line' => '$1, $2 ra link biya',
 'linksearch-error' => 'jokeri têna nameyê makina ya serekini de aseni/eseni.',
 
@@ -2171,7 +2230,7 @@ qaydeyê destek biyayeyi: <tt>$1</tt>',
 'listusers-blocked' => '(blok biy)',
 
 # Special:ActiveUsers
-'activeusers' => 'Listeyê karberî ke aktiv o.',
+'activeusers' => 'Listey karberan de aktivan',
 'activeusers-intro' => 'Ena yew listeye ke karberanê ke $1 {{PLURAL:$1|roc|rocan}} de îştiraq kerdo înan mocneno.',
 'activeusers-count' => 'ney {{PLURAL:$3|rocê peyin de|$3 rocê peyin de}} $1 {{PLURAL:$1|vuriyayiş|vuriyayiş}}',
 'activeusers-from' => 'karber ê ke pê ney destpêkeni ramocın:',
@@ -2193,8 +2252,8 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'listgrouprights-rights' => 'Heqqî',
 'listgrouprights-helppage' => 'Help:Heqqanê gruban',
 'listgrouprights-members' => '(lista ezayan)',
-'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
-'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
+'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' => 'şıma eşkenî hesabê xo re {{PLURAL:$2|grub|gruban}} têare kerî: $1',
 'listgrouprights-removegroup' => 'şıma eşkenî hesabê xo ra {{PLURAL:$2|grub|gruban}} bıvecî: $1',
 'listgrouprights-addgroup-all' => 'şıma hesabê xo re heme gruban eşkeni têare bıkeri',
@@ -2208,6 +2267,8 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'mailnologin' => 'adresa erşawıtışi/ruşnayişi çina.',
 'mailnologintext' => 'qey karberanê binan re e-posta erşawıtış de gani şıma [[Special:UserLogin|hesab aker]]ê [[Special:Preferences|pelê tercihani]] de gani yew e-postayo meqbul bıbo.',
 'emailuser' => 'Ena karberi rê mesac bırse',
+'emailuser-title-target' => 'Na E-postaya {{GENDER:$1|karberi}}ya',
+'emailuser-title-notarget' => 'E-postaya karberi',
 'emailpage' => 'karberi re e-mail bışaw',
 'emailpagetext' => 'no/na karberi re e-posta erşawıtışi de şıma pê forma cêrıni eşkeni kar bıkerî.
 [[Special:Preferences|tercihanê şıma ye karberi]] de adresa e-posta ya ke şıma dayo, na adres qısmê adresa e-postayi de "From (kam ra)" asena, no sebebi ra gırewtox/e eşkeno/a direk cewab bıdo şıma.',
@@ -2226,12 +2287,12 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'email-legend' => 'karberê {{SITENAME}} binan re e-posta bıerşaw',
 'emailfrom' => 'Rışten:',
 'emailto' => 'Geren:',
-'emailsubject' => 'behs/mesela:',
+'emailsubject' => 'Mersel:',
 'emailmessage' => 'Mesaj',
 'emailsend' => 'bıerşawê/bıruşnê',
 'emailccme' => 'kopyayekê mesaji mı re bıerşaw',
 'emailccsubject' => '$2 kopyaya mesaj a ke şıma erşawıto/a $1:',
-'emailsent' => 'e-mail erşawiya/ruşiya',
+'emailsent' => 'E-posta bırşê',
 'emailsenttext' => 'e-mailê şıma erşawiya/ruşiya',
 'emailuserfooter' => 'na e-posta hetê ıney ra $1 erşawiya $2 no/na karberi/e re. pê fonksiyonê "Karberi/e re e-posta bıerşaw" no {{SITENAME}} keyepeli erşawiya.',
 
@@ -2242,11 +2303,11 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 
 # Watchlist
 'watchlist' => 'lista mına seyr-kerdışi',
-'mywatchlist' => 'Lista mına seyrkerdışi',
+'mywatchlist' => 'Listey seyrkerdışi',
 'watchlistfor2' => 'Qandê $1 ($2)',
 'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
 'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
-'watchnologin' => 'hesab akerde niyo',
+'watchnologin' => 'Şıma de nêkewtê',
 'watchnologintext' => 'qey vurnayişê listeya temaşakerdışi [[Special:UserLogin|gani şıma hesab akeri]].',
 'addwatch' => 'Listeyê seyri deke',
 'addedwatchtext' => 'Ma pele "[[:$1]]" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.
@@ -2254,8 +2315,8 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem
 'removewatch' => 'Listedê mınê seyr kerdışi ra hewad',
 'removedwatchtext' => 'Ena pela "[[:$1]]" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].',
 'watch' => 'bıgê seyr-kerdış',
-'watchthispage' => 'Ena pele seyr ke',
-'unwatch' => 'Endi seyr meke',
+'watchthispage' => 'Peler seyr ke',
+'unwatch' => 'Seyr meke',
 'unwatchthispage' => 'temaşa kerdışê peli vındarn.',
 'notanarticle' => 'mebhesê peli niyo',
 'notvisiblerev' => 'Revizyon esteriyayo',
@@ -2314,7 +2375,7 @@ qey hemkari u pêşniyazi:
 
 # Delete
 'deletepage' => 'Pele bıestere',
-'confirm' => 'Konfirme bike',
+'confirm' => 'Testiq ke',
 'excontent' => "behso kêm: '$1'",
 'excontentauthor' => "behso kêm: '$1' no/na ('[[Special:Contributions/$2|$2]]' karber/e têna paşt dayo/a)",
 'exbeforeblank' => "behsê verê esteriyayişi: '$1'",
@@ -2350,6 +2411,8 @@ bı diqqet dewam kerê.',
 'rollback' => 'vurnayişan tepiya bıger',
 'rollback_short' => 'Peyser bia',
 'rollbacklink' => 'peyser bia',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}} peyd gıroti',
+'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|vurnayış|vuranyışi}} tewr peyd gırot',
 'rollbackfailed' => 'Peyserardış nêbi',
 'cantrollback' => 'karbero peyin têna paşt dayo, no semedi ra vuriyayiş tepiya nêgeriyeni.',
 'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}} hetê [[Special:Contributions/$2|{{int:contribslink}}]]) ra pelê ıney[[:$1]] de vurnayiş biyo u no vurnayiş tepiya nêgeriyeno;
@@ -2381,7 +2444,7 @@ Qey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê ê
 'prot_1movedto2' => 'nameyê [[$1]] peli yo newe: [[$2]]',
 'protect-badnamespace-title' => 'Heruna naman itad starêna',
 'protect-badnamespace-text' => 'Na herunda namide peley nêstarênê.',
-'protect-legend' => 'pawıtışi tesdiq bıker',
+'protect-legend' => 'Pawıtışi araşt ke',
 'protectcomment' => 'Sebeb:',
 'protectexpiry' => 'Qediyeno:',
 'protect_expiry_invalid' => 'Demo qediyayışi raşt niyo.',
@@ -2427,7 +2490,7 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 # Restrictions (nouns)
 'restriction-edit' => 'Bıvurne',
 'restriction-move' => 'Ahûln',
-'restriction-create' => 'Viraze',
+'restriction-create' => 'Vıraze',
 'restriction-upload' => 'Barke',
 
 # Restriction levels
@@ -2484,7 +2547,7 @@ belka cıwa ver hewn a biyo..',
 $1',
 'undelete-show-file-confirm' => '"<nowiki>$1</nowiki>" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?',
 'undelete-show-file-submit' => 'E',
-'undelete-revisionrow' => '$1 $2 $3 $4 . . $5 $6 $7',
+'undelete-revisionrow' => '$1 $2 ($3) $4 . . $5 $6 $7',
 
 # Namespace form on various pages
 'namespace' => 'Cayê namey:',
@@ -2495,9 +2558,9 @@ $1',
 'blanknamespace' => '(Ser)',
 
 # Contributions
-'contributions' => 'İştirakê karberi',
+'contributions' => 'İştiraqê karberi',
 'contributions-title' => '$1 de iştırakê karberi',
-'mycontris' => 'İştırakê mı',
+'mycontris' => 'Pêşteni',
 'contribsub2' => 'Qandê $1 ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
 'uctop' => '(ser)',
@@ -2518,8 +2581,8 @@ qê referansi qeydê vernigrewtışi cêr de eşkera biyo:',
 'sp-contributions-blocked-notice-anon' => 'Eno adresê IPi bloke biyo.
 Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'sp-contributions-search' => 'Ser iştariqi bıgeyr',
-'sp-contributions-username' => 'Adresa IPy ya ki namey karberi:',
-'sp-contributions-toponly' => 'Teyna revizyonanê tewr peniyan bimocne',
+'sp-contributions-username' => 'Adresa IP yana namey karberi:',
+'sp-contributions-toponly' => 'Tenya rewizyonanê tewr peyniyan bimocne',
 'sp-contributions-submit' => 'Cı geyre',
 
 # What links here
@@ -2539,7 +2602,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'whatlinkshere-hidetrans' => 'Açarnayışê $1',
 'whatlinkshere-hidelinks' => '$1 greyan',
 'whatlinkshere-hideimages' => 'gireyê resimî $1',
-'whatlinkshere-filters' => 'Parzumi',
+'whatlinkshere-filters' => 'Avrêci',
 
 # Block/unblock
 'autoblockid' => 'Otomatik vındarnayış #$1',
@@ -2549,8 +2612,8 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'blockip-title' => 'Karberi kılit ke',
 'blockip-legend' => 'Karber blok bike',
 'blockiptext' => 'pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo).',
-'ipadressorusername' => 'Adresê IPî ya zi namayê karberî',
-'ipbexpiry' => 'Çi wext de qediyeno:',
+'ipadressorusername' => 'Adresa IP yana namey karberi:',
+'ipbexpiry' => 'Qedyayış:',
 'ipbreason' => 'Sebeb:',
 'ipbreasonotherlist' => 'Sebebê bini',
 'ipbreason-dropdown' => '*sebebê verni-grewtışi yê pêroyi
@@ -2604,7 +2667,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'blocklist-expiry' => 'Wahdey qedyayışi',
 'blocklist-by' => 'hizmetdarê blokê',
 'blocklist-params' => 'Parametreyê wedernayışi',
-'blocklist-reason' => 'Sebeb:',
+'blocklist-reason' => 'Sebeb',
 'ipblocklist-submit' => 'Cı geyre',
 'ipblocklist-localblock' => 'blokê mehelli',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|blokê|blokê}} bini',
@@ -2620,7 +2683,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'blocklink' => 'kılit ke',
 'unblocklink' => 'ake',
 'change-blocklink' => 'kılit-kerdışi bıvurne',
-'contribslink' => 'iştıraki',
+'contribslink' => 'pêşteni',
 'emaillink' => 'e-poste bırışe',
 'autoblocker' => 'Şıma otomatikmen kılit biy, çıke adresa şımawa \'\'IP\'\'y terefê "[[User:$1|$1]]" gureniyena.
 Sebebê kılit-biyayışê $1\'i: "$2"o',
@@ -2658,7 +2721,7 @@ labele parçeya benateyê na $2 adresibi u ey ra ver-geryayo u şıma eşkeni no
 'proxyblocker' => 'blokarê proxyi',
 'proxyblocker-disabled' => 'Eno fonksiyon nêxebetiyeno.',
 'proxyblockreason' => 'IPadresa şıma yew proxyo akerdeyo u ey ra verniyê ey geriya.',
-'proxyblocksuccess' => 'Kar bi temam.',
+'proxyblocksuccess' => 'Qeyd ke.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'IP adresa şıma, hetê no {{SITENAME}} keyepeli ra  DNSBL de proxy hesibyayo u liste biyo.',
 'sorbs_create_account_reason' => 'IP adresa şıma, hetê no translatewiki.net keyepeli ra DNSBL de proxy hesibyayo u liste biyo.
@@ -2680,7 +2743,7 @@ eke şıma ıney gure keni u şıma xo ra emini, taahhud bıde wexta gure şıma
 'unlockconfirm' => 'Ya, ez wazene database a bikeri.',
 'lockbtn' => 'Database kilit bik',
 'unlockbtn' => 'Database a bik',
-'locknoconfirm' => 'Å\9fıma qutiyê tesdiq kerdıÅ\9fi niÅ\9fane nıkerd',
+'locknoconfirm' => 'Å\9eıma qutiyê araÅ\9ft kerdıÅ\9fi nêweçinê.',
 'lockdbsuccesssub' => 'Database kilit biya',
 'unlockdbsuccesssub' => 'Database a biya',
 'lockdbsuccesstext' => 'database qefıliya.<br />
@@ -2724,14 +2787,14 @@ Ma tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
 Oturse, tı gani peleyê mınaqeşeyê manually beri.",
 'movearticle' => 'Pele bere:',
 'moveuserpage-warning' => "'''Diqet:''' Ti eka yew pelê karberi beni. Diqet bike teyna pel beni feqat ena pele reyna nameyê newi \"nebeno''.",
-'movenologin' => 'Ti ci nikewt',
+'movenologin' => 'Şıma de nêkewtê',
 'movenologintext' => 'qey vurnayişê nameyê peli şıma gani qeyd kerde u cıkewteyê [[Special:UserLogin|sistemi]] bıbiy.',
 'movenotallowed' => 'desturê şıma çino, şıma pelan bıkırışi',
 'movenotallowedfile' => 'desturê şıma çino, şıma pelan bıkırışi',
 'cant-move-user-page' => 'desturê şıma çino, şıma pelanê karberani bıkırışi (bê pelê cerıni).',
 'cant-move-to-user-page' => 'desturê şıma çino, şıma yew peli bıkırışi pelê yew karberi.',
 'newtitle' => 'Nameyê newi:',
-'move-watch' => 'Ena pele seyr ke',
+'move-watch' => 'Peler seyr ke',
 'movepagebtn' => 'Pele bere',
 'pagemovedsub' => 'Berdışi kerd temam',
 'movepage-moved' => '\'\'\'"$1" berd "$2"\'\'\'',
@@ -2807,12 +2870,12 @@ ma vaci: qey pelê "[[{{MediaWiki:Mainpage}}]]i " [[{{#Special:Export}}/{{MediaW
 # Namespace 8 related
 'allmessages' => 'Mesacê sistemi',
 'allmessagesname' => 'Name',
-'allmessagesdefault' => 'nuşteyo orjinal',
+'allmessagesdefault' => 'Hesıbyaye metnê mesaci',
 'allmessagescurrent' => 'nuşte yo ke Karyayo',
 'allmessagestext' => 'na liste, listeya mesajê cayê nameyê wikimedya yo.
 eke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê [//www.mediawiki.org/wiki/Localisation mahalli kerdışê wikimedyayi] u [//translatewiki.net translatewiki.net] ziyaret bıkerê.',
 'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' qefelnaye yo u ey ra '''{{ns:special}}:Allmessages''' karkerdışi re akerde niyo.",
-'allmessages-filter-legend' => 'Filitre',
+'allmessages-filter-legend' => 'Avrêc',
 'allmessages-filter' => 'goreyê xususi kerdışi re filtre bıker',
 'allmessages-filter-unmodified' => 'Nivurnaye',
 'allmessages-filter-all' => 'Pêro',
@@ -2844,10 +2907,11 @@ karê zerredayişê benateyê wikiyani[[Special:Log/import|zerreyê rocaneyê k
 'import-interwiki-source' => 'Çime wîkî/pel:',
 'import-interwiki-history' => 'Qe eno pel, revizyonê tarixê hemî kopya bike',
 'import-interwiki-templates' => 'Şablonê hemî dehil bike',
-'import-interwiki-submit' => 'Import bike',
+'import-interwiki-submit' => 'Azare de',
 'import-interwiki-namespace' => 'Destinasyonê canameyî:',
+'import-interwiki-rootpage' => 'Hedef pelaya reçi (opsiyonel):',
 'import-upload-filename' => 'Nameyê dosyayi:',
-'import-comment' => 'Xulasa:',
+'import-comment' => 'Vatış:',
 'importtext' => 'Kerem ke dosyay, çımeyê wiki ra pê [[Special:Export|kırıştışê teberdayişi]] bıdê teber, Komputerê xo de qeyd kerê u bar kerê tiya.',
 'importstart' => 'Pelan împort kenî',
 'import-revision-count' => '$1 {{PLURAL:$1|revizyon|revizyon}}',
@@ -2874,12 +2938,15 @@ dosyaya emaneti vindbiyo',
 'xml-error-string' => '$1 çizgi de $2 col $3 (bit $4): $5',
 'import-upload' => 'Dosyayê XML bar bike',
 'import-token-mismatch' => "vindibiyayişê ma'lumatê hesabi. kerem kerê newe ra tesel/cereb bıkerê.",
-'import-invalid-interwiki' => 'Eya wîkî ra nieşkenî împort bike.',
+'import-invalid-interwiki' => 'Ena wiki ra azere kerdış nêbeno.',
 'import-error-edit' => 'Pela " $1 " qandê vurnayışi aya nêgêrêna çıkı cı rê icazet nêdeyayo.',
 'import-error-create' => 'Pela " $1 " qandê vıraştışi aya nêabêna çıkı cı rê icazet nêdeyayo.',
 'import-error-interwiki' => 'Pela " $1 " qandê name dayışi aya nêgêrêna çıkı namey cı (interwiki) sero cırê ca abıryayo.',
 'import-error-special' => 'Pela " $1 " qandê vıraştışi aya nêgêrêna çıkı namay cı nameyo do xısusiyo u na pela rê no name nêgêrêno.',
 'import-error-invalid' => 'Pela "$1" nêdebyê de çıkı namey cı çınyo.',
+'import-options-wrong' => '{{PLURAL:$2|Weçenego|Weçenego}} xerpiyaye: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Sernuştey ena pela reçey cı raverde niyo.',
+'import-rootpage-nosubpage' => 'Qan de bınnaman reçe de "$1" re mısade nedano.',
 
 # Import log
 'importlogpage' => 'Logê împortî',
@@ -2907,7 +2974,7 @@ dosyaya emaneti vindbiyo',
 'tooltip-pt-anontalk' => 'vurnayiş ê ke no Ipadresi ra biyo muneqeşa bıker',
 'tooltip-pt-preferences' => 'Tercihê to',
 'tooltip-pt-watchlist' => 'Lista pelanê ke to gırewtê seyrkerdış',
-'tooltip-pt-mycontris' => 'Lista iştırakanê to',
+'tooltip-pt-mycontris' => 'Listey iştıraqa',
 'tooltip-pt-login' => 'Seba cıkewtışi şıma rê dewato; labelê, no zeruri niyo',
 'tooltip-pt-anonlogin' => 'Seba cıkewtışi şıma rê dewato; labelê, no zeruri niyo',
 'tooltip-pt-logout' => 'Bıveciyên',
@@ -2970,7 +3037,7 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 'tooltip-rollback' => '"Peyser biya" be yew tik pela îştirak(an)ê peyên|i(an) peyser ano.',
 'tooltip-undo' => '"Undo" ena vurnayışê newi iptal kena u vurnayışê verni a kena.
 Tı eşkeno yew sebeb bınus.',
-'tooltip-preferences-save' => 'Tercihê mı qeyd ke',
+'tooltip-preferences-save' => 'Terciha qeyd ke',
 'tooltip-summary' => 'Yew xulasaya kilm binuse',
 
 # Metadata
@@ -2999,16 +3066,34 @@ Tı eşkeno yew sebeb bınus.',
 
 # Info page
 'pageinfo-title' => 'Heq tê "$1"\'i',
-'pageinfo-header-edits' => 'Vurnayışi',
-'pageinfo-header-watchlist' => 'Listey temaşi',
-'pageinfo-header-views' => 'Bıvin',
-'pageinfo-subjectpage' => 'Pele',
-'pageinfo-talkpage' => 'Pelay qıse',
-'pageinfo-watchers' => 'Amarina temaşekaran',
-'pageinfo-edits' => 'Amarina vurnayışan',
-'pageinfo-authors' => 'Amarina nuştekaran',
+'pageinfo-header-basic' => 'Seron zanayış',
+'pageinfo-header-edits' => 'Vurnayışi verêni',
+'pageinfo-header-restrictions' => 'Xısusiyetê pela',
+'pageinfo-header-properties' => 'Xısusiyetê pela',
+'pageinfo-display-title' => 'Asenge sernuşte',
+'pageinfo-default-sort' => 'Hesıbyaye mırfeyo kılm',
+'pageinfo-length' => 'Derdeya pela (bayti heta)',
+'pageinfo-article-id' => 'Nımrey pela',
+'pageinfo-robot-policy' => 'Weziyetê motor de cıgeyrayışi',
+'pageinfo-robot-index' => 'İIndeksbiyayen',
+'pageinfo-robot-noindex' => 'İndeksnêbiyayen',
 'pageinfo-views' => 'Amarina mocnayışan',
-'pageinfo-viewsperedit' => 'Vurnayışi sero vurnayışa bımocnêyış',
+'pageinfo-watchers' => 'Amariya pela serykeran',
+'pageinfo-redirects-name' => 'Hetenayışê na pela',
+'pageinfo-subpages-name' => 'Bınpelê na pela',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|hetenayış|hetenayışi}}; $3 {{PLURAL:$3|raykerdışt|raykerdışi}})',
+'pageinfo-firstuser' => 'Pela vıraşter',
+'pageinfo-firsttime' => 'Demê pela vıraştışi',
+'pageinfo-lastuser' => 'Vurnayeno peyên',
+'pageinfo-lasttime' => 'Deme u vurnayışo peyên',
+'pageinfo-edits' => 'Amarina vurnayışan pêro',
+'pageinfo-authors' => 'Amarina nuştekaran pêro',
+'pageinfo-recent-edits' => 'Amariya vurnayışan ($1 ra nata)',
+'pageinfo-recent-authors' => 'Amarina nuştekaran pêro',
+'pageinfo-restriction' => 'Xısusiyetê pela (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne',
+'pageinfo-templates' => '{{PLURAL:$1|Şablon|Şabloni}} ($1) açarneyayê',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -3064,6 +3149,7 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'file-info-size-pages' => '$1 × $2 pikse, dergeya dosyay: $3, MIME tipiya cı: $4, $5 {{PLURAL:$5|pela|pela}}',
 'file-nohires' => 'Rovıleşiyayışo berzêr çıniyo.',
 'svg-long-desc' => 'SVG dosya, nominalin $1 × $2 piksels, ebatê dosya: $3',
+'svg-long-desc-animated' => 'SVG dosya, nominalin $1 × $2 piksela, ebatê dosya: $3',
 'show-big-image' => 'Resolosyonê temami',
 'show-big-image-preview' => "Verqayd dergiya: $1'i.",
 'show-big-image-other' => 'Zewmi{{PLURAL:$2|Vılêşnayış|Vılêşnayışê}}: $1.',
@@ -3073,12 +3159,14 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'file-info-png-looped' => 'atlama biyo',
 'file-info-png-repeat' => '$1 {{PLURAL:$1|hew|hew}} kay biyê',
 'file-info-png-frames' => '$1 {{PLURAL:$1|çerçeve|çerçeveyi}}',
+'file-no-thumb-animation' => "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de animasyoni miyan dı nêbo.'''",
+'file-no-thumb-animation-gif' => "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de  GIF imaci de animasyon do nêbo.'''",
 
 # Special:NewFiles
 'newimages' => 'Galeriya dosyayan dê newan',
 'imagelisttext' => "Cêr de yew listeyê '''$1''' esto {{PLURAL:$1|dosya|dosyayi}} veçiniya $2.",
 'newimages-summary' => 'Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.',
-'newimages-legend' => 'Filtre',
+'newimages-legend' => 'Avrêc',
 'newimages-label' => 'Nameyê dosya ( ya zi parçe ey)',
 'showhidebots' => '(bota $1)',
 'noimages' => 'Çik çini yo.',
@@ -3270,9 +3358,9 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-imageuniqueid' => 'şınasnameyê resmê xususiyi',
 'exif-gpsversionid' => 'revizyonê GPSyi',
 'exif-gpslatituderef' => 'paralelê zıme û veroci',
-'exif-gpslatitude' => 'paralel',
+'exif-gpslatitude' => 'Heralem',
 'exif-gpslongituderef' => 'meridyenê rocvetış û rocawavi',
-'exif-gpslongitude' => 'meridyen',
+'exif-gpslongitude' => 'Lemen',
 'exif-gpsaltituderef' => 'çımeyê berziyi',
 'exif-gpsaltitude' => 'berzî',
 'exif-gpstimestamp' => "Wextê GPSyi (se'eta atomiki)",
@@ -3329,7 +3417,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-writer' => 'Nuştekar',
 'exif-languagecode' => 'Zıwan',
 'exif-iimversion' => 'Verqaydê IIM',
-'exif-iimcategory' => 'Kategori',
+'exif-iimcategory' => 'Kategoriye',
 'exif-iimsupplementalcategory' => 'Oleyê Kategoriyan',
 'exif-datetimeexpires' => 'No peyra mekarênê',
 'exif-datetimereleased' => 'Bıroşe',
@@ -3353,7 +3441,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-attributionurl' => 'No nuşte çı wext karyayo, şıma ra reca gre dekerê de',
 'exif-preferredattributionname' => 'No nuşte çı wext karyayo, Şıma ra reca morkerê',
 'exif-pngfilecomment' => "Vatışê dosyada PNG'i",
-'exif-disclaimer' => 'Reddê mesuliyeti',
+'exif-disclaimer' => 'Redê mesuliyeti',
 'exif-contentwarning' => 'İkazê zerreki',
 'exif-giffilecomment' => "vatena dosya da GIF'i",
 'exif-intellectualgenre' => 'Babeta çêki',
@@ -3391,7 +3479,7 @@ $8',
 'exif-compression-34712' => 'JPEG2000',
 
 'exif-copyrighted-true' => 'Heqê telifiye',
-'exif-copyrighted-false' => 'Malê umumiye',
+'exif-copyrighted-false' => 'Malê Şari',
 
 'exif-photometricinterpretation-2' => 'RGB',
 'exif-photometricinterpretation-6' => 'YCbCr',
@@ -3508,7 +3596,7 @@ $8',
 'exif-scenecapturetype-2' => 'Portre',
 'exif-scenecapturetype-3' => 'şew-antış',
 
-'exif-gaincontrol-0' => 'çino',
+'exif-gaincontrol-0' => 'Ã\87ıniyo',
 'exif-gaincontrol-1' => 'Low gain up',
 'exif-gaincontrol-2' => 'High gain up',
 'exif-gaincontrol-3' => 'Low gain down',
@@ -3576,10 +3664,10 @@ $8',
 'exif-ycbcrpositioning-1' => 'Wertekerdış',
 'exif-ycbcrpositioning-2' => 'Wayırê-site',
 
-'exif-dc-contributor' => 'İştırakdari',
+'exif-dc-contributor' => 'Pêşteni',
 'exif-dc-coverage' => 'Heruna yana wextin grotışa medya',
 'exif-dc-date' => 'Tarix(i)',
-'exif-dc-publisher' => 'Wılakar',
+'exif-dc-publisher' => 'Hesrekar',
 'exif-dc-relation' => 'Medyay cı',
 'exif-dc-rights' => 'Heqi',
 'exif-dc-source' => 'Medyay çımi',
@@ -3625,11 +3713,11 @@ $8',
 'limitall' => 'hemi',
 
 # E-mail address confirmation
-'confirmemail' => 'Adresê emaîlî xo konfirme bike',
+'confirmemail' => 'Adresê e-posta tesdiq ker',
 'confirmemail_noemail' => 'Yew emaîlê tu raştîyê çin o ke [[Special:Preferences|tercihê karberî]] ayar bike.',
-'confirmemail_text' => 'qey şuxulnayişê e-postayê wikiyi gani ewwil e-posyaê şıma tesdiq bıbo.
-adresa şıma re qey erşawıtışê e-postayê tesdiqi, butonê cêrıni bıtıknê.
-e-posta yo ke erşawiyeno tede gıreyê kodê tesdiqi esto, gıreyi bıtıkne akerê u e-postayê xo tesdiq kerê.',
+'confirmemail_text' => 'Qey gurweyayışê e-postayê wikiyi gani veror e-postayê şıma araşt bıbo.
+Adresa şıma re qey erşawıtışê e-postayê araştin, butonê cêrıni pıploxnê.
+E-posta yo ke erşawiyeno tede gıreyê kodê araşti esto, gıreyi pıploxne akerê u e-postayê xo araşt kerê.',
 'confirmemail_pending' => 'Yew codê konfirmasyonî ma ti ra şiravt;
 Eka ti newe hesabê xo viraşt, ti gani yew di dekika vindero u email xo kontrol bike, yani reyna yew hesab meviraz.',
 'confirmemail_send' => 'Yew kodê konfirmasyonî email mina bişirave',
@@ -3651,15 +3739,15 @@ Ti eşkeno [[Special:UserLogin|ci kewt]].',
 'confirmemail_body' => 'Brayo delal, mara ke şıma no IP-adresi ra,
 keyepelê {{SITENAME}}i de pêno $2 e-postayi hesab kerda.
 
-eke raşta no e-posta eyê şımayo şıma gani tesdiq bıkerî, qey tesdiq kerdışi gani karê e-postayê keyepeli {{SITENAME}} aktif bıbo, qey aktif kerdışi gıreyê cêrêni bıtıkne.
+eke raşta no e-posta eyê şımayo şıma gani araşt bıkerî, qey araşt kerdışi gani karê e-postayê keyepeli {{SITENAME}} aktif bıbo, qey aktif kerdışi gıreyê cêrêni bıtıkne.
 
 $3
 
-eke şıma hesab *nê akerdo*, qey ibtalê tesdiqkerdışê adresa e-postayi gıreyê cêrıni bıtıknê:
+eke şıma hesab *nê akerdo*, qey terqnayışê araşt kerdışê adresa e-postayi gıreyê cêrıni pıploxnê:
 
 $5
 
-kodê tesdiqi heta ıney tarixi $4 meqbulo.',
+kodê araşti heta ıney tarixi $4 meqbulo.',
 'confirmemail_body_changed' => 'Yew ten, muhtemelen şıma no IP-adresi $1 ra,
 keyepelê {{SITENAME}}i de pê no $2 e-postayi hesab kerd a.
 
@@ -3735,7 +3823,7 @@ Ma rica keno tesdiq bike ke ti raştî wazeno eno pel bivirazo.",
 # Table pager
 'ascending_abbrev' => 'berz',
 'descending_abbrev' => 'nızm',
-'table_pager_next' => 'Pela badê cû',
+'table_pager_next' => 'Pela peyên',
 'table_pager_prev' => 'Pela verêne',
 'table_pager_first' => 'Pela jûyıne',
 'table_pager_last' => 'Pela peyêne',
@@ -3869,7 +3957,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mesac]])',
-'timezone-utc' => 'ŞWC',
+'timezone-utc' => '[[UTC]]',
 
 # Core parser functions
 'unknown_extension_tag' => 'Etiketê ekstensiyon ê "$1"î nizanyeno',
@@ -3937,16 +4025,16 @@ Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqed
 * <strong class="mw-specialpagerestricted">Peleya xısusiya ke grota verhefıza.</strong>',
 'specialpages-group-maintenance' => 'Raporê pak tepiştîşî',
 'specialpages-group-other' => 'Pelê xasiyê bini',
-'specialpages-group-login' => 'Cıkewtış / Hesab vıraştış',
+'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-pagetools' => 'Hacetê pelan',
+'specialpages-group-pagetools' => 'Haletê pelan',
 'specialpages-group-wiki' => 'Malumatê wiki u haceti',
 'specialpages-group-redirects' => 'Pela xasîyê ke heteneyayê',
-'specialpages-group-spam' => 'hacetê spami',
+'specialpages-group-spam' => 'haletê spami',
 
 # Special:BlankPage
 'blankpage' => 'Pela venge',
@@ -3965,7 +4053,7 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 # Special:Tags
 'tags' => 'Etiketê vurnayîşê raştî',
 'tag-filter' => '[[Special:Tags|Tag]] filitre:',
-'tag-filter-submit' => 'Filitre',
+'tag-filter-submit' => 'Avrêc',
 'tags-title' => 'Etiketan',
 'tags-intro' => 'Eno pel de listeyê eyiketî este ke belki software pê ey edit kenî.',
 'tags-tag' => 'Nameyê etiketi',
@@ -3978,7 +4066,7 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 # Special:ComparePages
 'comparepages' => 'Pela miqeyese ke',
 'compare-selector' => 'Revizyonê pele miqayese bike',
-'compare-page1' => 'Pel 1',
+'compare-page1' => 'Pela 1',
 'compare-page2' => 'Pel 2',
 'compare-rev1' => 'Revizyonê 1i',
 'compare-rev2' => 'Revizyonê 2i',
@@ -4038,7 +4126,7 @@ Ena sita dı newke xırabiya teknik esta.',
 'logentry-move-move_redir' => '$1 pela $3 pela da $4 sera hetenayış ra ahulnê',
 'logentry-move-move_redir-noredirect' => '$1 hetenayışê qeydê pela da  $3 ahulnê $4 sero hetenayış vıraşt',
 'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 ke kontrol',
-'logentry-patrol-patrol-auto' => '$1 Otomatik revizyonê pela da $4  $3 ke kontrol',
+'logentry-patrol-patrol-auto' => "$1 pelay $3'i rewizyon dê $4 ya kontrol ke",
 'logentry-newusers-newusers' => '$1 deye namey karberi vıraziya',
 'logentry-newusers-create' => '$1 deye namey karberi vıraziya',
 'logentry-newusers-create2' => "$1'i $3 rê hesab vıraşt",
@@ -4047,7 +4135,7 @@ Ena sita dı newke xırabiya teknik esta.',
 
 # Feedback
 'feedback-bugornote' => 'Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da "[ $3  $2 ]", namey karber dê xoya piya u wasteriya karfiye.',
-'feedback-subject' => 'Muhtewa:',
+'feedback-subject' => 'Mersel:',
 'feedback-message' => 'Mesac:',
 'feedback-cancel' => 'Bıterkne',
 'feedback-submit' => 'Peyxeberdar Bırşe',
@@ -4071,9 +4159,12 @@ Ena sita dı newke xırabiya teknik esta.',
 'api-error-empty-file' => 'Dosyaya ke şıma rışta venga.',
 'api-error-emptypage' => 'Newi, pelaya veng vıraştışi rê mısade nêdeyêno.',
 'api-error-fetchfileerror' => 'Xırabiya zerrek:Dosya grotış dı tay çi raşt nêşı.',
+'api-error-fileexists-forbidden' => 'Jû dosya be nê nameyê "$1" ra xora esta, u naye sero nêşeno ke bınuşiyo.',
+'api-error-fileexists-shared-forbidden' => 'Jû dosya be nameyê "$1" ra depoyê doyeyanê barekerdeyan de xora esta, u naye sero nêşeno ke bınuşiyo.',
 'api-error-file-too-large' => 'Dosyaye ke şıma rışta zaf gırda.',
 'api-error-filename-tooshort' => 'Namayê dosyayi zaf kilm a.',
 'api-error-filetype-banned' => 'Tipê ena dosya qedexe biya.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|Dosya qebul ne vinena|dosya qebul ne vinena|Ena babeta dosya qebul ne vinena}}. Eke cırê izin deyayo se {{PLURAL:$3|Babatan dosyayan|babeta dosyayan}} de $2 bıvin.',
 'api-error-filetype-missing' => 'Derganiya dosya kemiya',
 'api-error-hookaborted' => 'Vurnayişê tu ke to cerbna pê yew çengal ra terkneya.',
 'api-error-http' => 'Xırabiya zerreki:Wasteriya irtabet bırya.',
index c510f72..1caeafa 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Lower Sorbian (Dolnoserbski)
+/** Lower Sorbian (dolnoserbski)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -162,29 +162,29 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Wótkaze pódšmarnuś:',
 'tog-justify' => 'Tekst do bloka zrownaś',
-'tog-hideminor' => 'Małe změny schowaś',
+'tog-hideminor' => 'Małe změny w aktualnych změnach schowaś',
 'tog-hidepatrolled' => 'Doglědowane změny w aktualnych změnach schowaś',
 'tog-newpageshidepatrolled' => 'Doglědowane boki z lisćiny nowych bokow schowaś',
 'tog-extendwatchlist' => 'Wobglědowańku wócyniś, aby wšě změny pokazał, nic jano nejnowše',
-'tog-usenewrc' => 'Rozšyrjonu lisćinu aktualnych změnow (JavaScript trěbny) wužywaś',
+'tog-usenewrc' => 'Kupkowe změny pó boku w aktualnych změnach a wobglědowanjach (trjeba JavaScript)',
 'tog-numberheadings' => 'Nadpisma awtomatiski numerěrowaś',
-'tog-showtoolbar' => 'Wobźěłańsku lejstwu pokazaś (JavaScript)',
-'tog-editondblclick' => 'Boki z dwójnym kliknjenim wobźěłaś (JavaScript)',
+'tog-showtoolbar' => 'Wobźěłańsku lejstwu pokazaś (pótrjebujo JavaScript)',
+'tog-editondblclick' => 'Boki z dwójnym kliknjenim wobźěłaś (pótrjebujo JavaScript)',
 'tog-editsection' => 'Wobźěłanje wótstawkow pśez wótkaze [wobźěłaś] zmóžniś',
 'tog-editsectiononrightclick' => 'Wobźěłanje wótstawkow pśez kliknjenje z pšaweju tastu myški zmóžniś (JavaScript)',
 'tog-showtoc' => 'Wopśimjeśe pokazaś, jolic ma bok wěcej nježli 3 nadpisma',
 'tog-rememberpassword' => 'Z toś tym wobglědowakom pśizjawjony wóstaś (za maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
-'tog-watchcreations' => 'Boki, kótarež załožyjom, awtomatiski wobglědowaś',
-'tog-watchdefault' => 'Boki, kótarež změnijom, awtomatiski wobglědowaś',
-'tog-watchmoves' => 'Boki, kótarež som pśesunuł, awtomatiski wobglědowaś',
-'tog-watchdeletion' => 'Boki, kótarež som wulašował, awtomatiski wobglědowaś',
+'tog-watchcreations' => 'Boki, kótarež napórajom a dataje, kótarež nagrawam, wobglědowaś',
+'tog-watchdefault' => 'Boki a dataje , kótarež změnijom, wobglědowaś',
+'tog-watchmoves' => 'Boki a dataje, kótarež som pśesunuł, wobglědowaś',
+'tog-watchdeletion' => 'Boki a dataje, kótarež som wulašował, wobglědowaś',
 'tog-minordefault' => 'Wšykne móje změny ako małe markěrowaś',
 'tog-previewontop' => 'Zespominanje wušej wobźěłowańskego póla pokazaś',
 'tog-previewonfirst' => 'Pśi prědnem wobźěłanju pśecej zespominanje pokazaś',
 'tog-nocache' => 'Cache bokow wobglědowaka znjemóžniś',
-'tog-enotifwatchlistpages' => 'E-mail pósłaś, jolic se wobglědowany bok změnja',
+'tog-enotifwatchlistpages' => 'E-mail pósłaś, jolic se wobglědowany bok abo wobglědowana dataja  změnja',
 'tog-enotifusertalkpages' => 'E-mail pósłaś, změnijo-lic se mój diskusijny bok',
-'tog-enotifminoredits' => 'E-mail teke małych změnow dla pósłaś',
+'tog-enotifminoredits' => 'E-mail teke małych změnow bokow a datajow dla pósłaś',
 'tog-enotifrevealaddr' => 'Móju e-mailowu adresu w e-mailowych pówěźeńkach pokazaś',
 'tog-shownumberswatching' => 'Licbu wobglědujucych wužywarjow pokazaś',
 'tog-oldsig' => 'Eksistěrujuca signatura:',
@@ -200,7 +200,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Změny pśizjawjonych wužywarjow z wobglědowańki schowaś',
 'tog-watchlisthideanons' => 'Změny anonymnych wužywarjow z wobglědowańki schowaś',
 'tog-watchlisthidepatrolled' => 'Doglědowane změny we wobglědowańce schowaś',
-'tog-nolangconversion' => 'Konwertěrowanje rěcnych wariantow znjemóžniś',
 'tog-ccmeonemails' => 'Kopije e-mailow dostaś, kótarež drugim wužywarjam pósćelom',
 'tog-diffonly' => 'Pśi pśirownowanju wersijow jano rozdźěle pokazaś',
 'tog-showhiddencats' => 'Schowane kategorije pokazaś',
@@ -423,6 +422,10 @@ $1',
 'youhavenewmessages' => 'Maš $1 ($2).',
 'newmessageslink' => 'nowe powěsći',
 'newmessagesdifflink' => 'slědna změna',
+'youhavenewmessagesfromusers' => 'Maš $1 wót {{PLURAL:$3|drugego wužywarja|$3 wužywarjowu|$3 wužywarjow|$3 wužywarjow}} ($2).',
+'youhavenewmessagesmanyusers' => 'Maš $1 wót wjele wužywarjow ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|nowa powěsć|nowej powěsći|nowe powěsći|nowe powěsći}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|slědna změna|slědnej změnje|slědne změny|slědne změny}}',
 'youhavenewmessagesmulti' => 'Maš nowe powěsći: $1',
 'editsection' => 'wobźěłaś',
 'editold' => 'wobźěłaś',
@@ -477,9 +480,9 @@ Płaśece specialne boki namakaju se pód [[Special:SpecialPages|lisćinu specia
 'dberrortext' => 'Syntaktiska zmólka pśi wótpšašowanju datoweje banki nastata.
 To by mógło zmólki w softwarje byś.
 Slědne wótpšašowanje jo było:
-<blockquote><tt>$1</tt></blockquote>
-z funkcije "<tt>$2</tt>".
-Datowa banka jo zmólku "<tt>$3: $4</tt>" wrośiła.',
+<blockquote><code>$1</code></blockquote>
+z funkcije "<code>$2</code>".
+Datowa banka jo zmólku "<samp>$3: $4</samp>" wrośiła.',
 'dberrortextcl' => 'Syntaktiska zmólka pśi wótpšašowanju datoweje banki nastata.
 Slědne wopytane wótpšašowanje jo było:
 "$1"
@@ -515,6 +518,8 @@ Pšosym daj to a pśisłušny URL [[Special:ListUsers/sysop|administratoroju]] k
 'badarticleerror' => 'Akcija njedajo se na toś tom boku wuwjasć.',
 'cannotdelete' => 'Njejo móžno było bok abo dataju "$1" wulašowaś. Snaź jo to južo něchten drugi cynił.',
 'cannotdelete-title' => 'Bok "$1" njedajo se lašowaś',
+'delete-hook-aborted' => 'Wulašowanje pśez kokulu pśetergnjone.
+Njejo žedno wujasnjenje.',
 'badtitle' => 'Njepłaśecy nadpis',
 'badtitletext' => 'Nadpis pominanego boka jo był njepłaśecy, prozny abo njekorektny nadpis, póchadajucy z mjazyrěcnego abo interwikijowego wótkaza. Snaź wopśimjejo jadno abo wěcej znamuškow, kótarež njejsu w nadpisach dowólone.',
 'perfcached' => 'Toś te daty póchadaju z pufrowaka a mógu snaź njeaktualne byś. Maksimalnje {{PLURAL:$1|jaden wuslědk stoj|$1 wuslědka stojtej|$1 wuslědki stoje|$1 wuslědkow stoj}} w pufrowaku k dispoziciji.',
@@ -544,6 +549,8 @@ Wótpšašanje: $2',
 Administrator, kenž jo jen zastajił, jo toś tu pśicynu pódał: "$3".',
 'invalidtitle-knownnamespace' => 'Njepłaśiwy titel z mjenjowym rumom "$2" a tekstom "$3"',
 'invalidtitle-unknownnamespace' => 'Njepłaśiwy titel z njeznatym mjenjowym rumom $1 a tekstom "$2"',
+'exception-nologin' => 'Njejsy se pśizjawił',
+'exception-nologin-text' => 'Toś ten bok abo toś ta akcija pomina, až sy na toś tom wikiju pśizjawjony.',
 
 # Virus scanner
 'virus-badscanner' => "Špatna konfiguracija: njeznaty wirusowy scanner: ''$1''",
@@ -564,6 +571,7 @@ Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences
 'remembermypassword' => 'Na toś tom licadle pśizjawjony wóstaś (za maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
 'securelogin-stick-https' => 'Pó pśizjawjenju z HTTPS zwězany wóstaś',
 'yourdomainname' => 'Twója domejna',
+'password-change-forbidden' => 'Njamóžoš gronidła w toś tom wikiju změniś.',
 'externaldberror' => 'Abo jo wustupiła eksterna zmólka awtentifikacije datoweje banki, abo njesmějoš swójo eksterne wužywarske konto aktualizěrowaś.',
 'login' => 'Pśizjawiś se',
 'nav-login-createaccount' => 'Pśizjawiś se/Konto załožyś',
@@ -790,6 +798,10 @@ Aby bok napórał, zapiš do kašćika dołojce (glědaj [[{{MediaWiki:Helppage}
 'noarticletext-nopermission' => 'Tuchylu njejo žeden tekst na toś tom boku.
 Móžoš [[Special:Search/{{PAGENAME}}|toś ten bokowy titel]] na drugich bokach pytaś
 abo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} wótpowědne protokole pytaś]</span>.',
+'missing-revision' => 'Wersija #$1 boka z mjenim "{{PAGENAME}}" njeeksistěrujo.
+
+Pśicyna jo zwětšego zestarjony wótkaz w historiji k bokoju, kótaryž jo se wulašował.
+Drobnostki móžoš w  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wulašowanjow] namakaś.',
 'userpage-userdoesnotexist' => 'Wužywarske konto "<nowiki>$1</nowiki>" njejo zregistrěrowane. Pšosym pśeglědaj, lěc coš toś ten bok wopšawdu napóraś/wobźěłaś.',
 'userpage-userdoesnotexist-view' => 'Wužywarske konto "$1" njejo zregistrowane.',
 'blocked-notice-logextract' => 'Toś ten wužywaŕ jo tuchylu blokěrowany.
@@ -798,7 +810,6 @@ Nejnowšy zapisk blokěrowańskego protokola pódawa se dołojce ako referenca:'
 * '''Firefox/Safari:''' Źarź ''Umsch'' tłocony, mjaztym až kliknjoš na ''Znowego'' abo tłoc pak ''Strg-F5'' pak ''Strg-R'' (''⌘-R'' na Makintošu)
 * '''Google Chrome:''' Tłoc na ''Strg-Umsch-R'' ('⌘-Umsch-R'' na Makintošu)
 * '''Internet Explorer:''' Źarź ''Strg'' tłocony, mjaztym až kliknjoš na ''Aktualisieren'' abo tłoc ''Strg-F5''
-* '''Konqueror:''' Klikni na ''Aktualisieren'' abo tłoc ''F5''
 * '''Opera:''' Wuprozni cache w ''Extras → Einstellungen''",
 'usercssyoucanpreview' => "'''Pokazka:''' Wužywaj tłocašk '{{int:showpreview}}', aby swój nowy css testował, nježli až jen składujoš.",
 'userjsyoucanpreview' => "'''Pokazka:''' Wužywaj tłocašk \"{{int:showpreview}}\", aby swój nowy JavaScript testował, nježli až jen składujoš.",
@@ -876,7 +887,7 @@ Pšosym pśespytuj kradosćiwje, lěc jo gódnje z wobźěłowanim boka pokšaco
 Protokol wulašowanjow a pśesunjenjow za toś ten bok so how za informaciju pódawa:",
 'moveddeleted-notice' => 'Toś ten bok jo se wulašował. Protokol wulašowanjow a pśesunjenjow za toś ten bok pódawa se dołojce ako referenca.',
 'log-fulllog' => 'Dopołny protokol se woglědaś',
-'edit-hook-aborted' => 'Wobźěłanje pśez kokulu pśetergnjony.
+'edit-hook-aborted' => 'Wobźěłanje pśez kokulu pśetergnjone.
 Njejo žedno wujasnjenje.',
 'edit-gone-missing' => 'Njejo móžno było bok aktualizěrowaś.
 Zda sem až jo wulašowany.',
@@ -904,6 +915,7 @@ Njesmějo daś wěcej nježli $2 {{PLURAL:$2|wołanja|wołanjowu|wołanjow|woła
 'expansion-depth-exceeded-warning' => 'Bok jo ekspansisku dłymokosć pśekšocył',
 'parser-unstrip-loop-warning' => 'Njeskóńcna kokula namakana',
 'parser-unstrip-recursion-limit' => 'Rekursiska granica pśekšocona ($1)',
+'converter-manual-rule-error' => 'Zmólka w manuelnem pšawidle rěcnego konwertěrowanja namakana',
 
 # "Undo" feature
 'undo-success' => 'Wobźěłanje móžo se wótpóraś. Pšosym pśeglěduj dołojcne pśirownowanje aby se wěsty był, až to wót wěrnosći coš, a pón składuj změny, aby se wobźěłanje doskóńcnje wótpórało.',
@@ -1089,6 +1101,10 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
 'editundo' => 'wótwrośiś',
 'diff-multi' => '({{PLURAL:$1|Jadna mjazywersija|$1 mjazywersiji|$1 mjazywersije|$1 mjazywersijow}} wót {{PLURAL:$2|jadnogo wužywarja|$2 wužywarjowu|$2 wužywarjow|$2 wužywarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Jadna mjazywersija|$1 mjazywersiji|$1 mjazywersije|$1 mjazywersijow}} wót wěcej ako {{PLURAL:$2|jadnogo wužywarja|$2 wužywarjowu|$2 wužywarjow|$2 wužywarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
+'difference-missing-revision' => '{{PLURAL:$2|Jadna wersija|$2 wersiji|$2 wersije|$2 wersijow}} toś togo rozdźěla ($1) {{PLURAL:$2|njejo se namakała|njejstej se namakałej|njejsu namakali|njejo se namakało}}.
+
+Pśicyna jo zwětšego zestarjony diferencny wótkaz k bokoju, kótaryž jo se wulašował.
+Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wulašowanjow] namakaś.',
 
 # Search results
 'searchresults' => 'Wuslědki pytanja',
@@ -1353,6 +1369,7 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
 'right-writeapi' => 'writeAPI wužywaś',
 'right-delete' => 'Boki wulašowaś',
 'right-bigdelete' => 'lašowaś boki, kótarež maju wjelike stawizny',
+'right-deletelogentry' => 'Jadnotliwe protokolowe zapiski wulašowaś a wótnowiś',
 'right-deleterevision' => 'Specifiske boki lašowaś a wótnowiś',
 'right-deletedhistory' => 'Wulašowane wersiji w stawiznach se bśez pśisłušnego teksta wobglědaś',
 'right-deletedtext' => 'Wulašowany tekst a změny mjazy wulašowanymi wersijami se woglědaś',
@@ -1498,9 +1515,9 @@ Protokola wulašowanjow a pśesunjenjow za toś ten bok stej how k twójej dispo
 Źi na [[Special:FileList|lisćinu nagratych datajow]], aby mógł južo nagrate dataje se wobglědaś abo pytaś, nagraśa protokolěruju se w [[Special:Log/upload|protokolu nagraśow]], wulašowanja w [[Special:Log/delete|protokolu wulašowanjow]].
 
 Aby dataju do boka zapśimjeł, wužyj wótkaz slědujuceje formy
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dataja.jpg]]</nowiki></tt>''', aby wužywał połnu wersiju dataje
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dataja.png|200px|thumb|left|alternatiwny tekst]]</nowiki></tt>''', aby wužywał wobraz we wjelikosću 200 pikselow w kašćiku na lěwej kšomje z alternatiwnym tekstom ako wopisanje
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dataja.ogg]]</nowiki></tt>''', aby direktnje na dataju wótkazował, bźez togo až dataja se zwobraznijo.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dataja.jpg]]</nowiki></code>''', aby wužywał połnu wersiju dataje
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dataja.png|200px|thumb|left|alternatiwny tekst]]</nowiki></code>''', aby wužywał wobraz we wjelikosću 200 pikselow w kašćiku na lěwej kšomje z alternatiwnym tekstom ako wopisanje
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dataja.ogg]]</nowiki></code>''', aby direktnje na dataju wótkazował, bźez togo až dataja se zwobraznijo.",
 'upload-permitted' => 'Dowolone datajowe typy: $1.',
 'upload-preferred' => 'Preferěrowane datajowe typy: $1.',
 'upload-prohibited' => 'Njedowolone datajowe typy: $1.',
@@ -1544,20 +1561,20 @@ Glědaj [[Special:NewFiles|galeriju nowych datajow]] za wizuelny pśeglěd.',
 'largefileserver' => 'Dataja jo wětša ako serwer dopušćijo.',
 'emptyfile' => 'Dataja, kótaruž sy nagrał, jo prozna. Pśicyna móžo byś zmólka w mjenju dataje. Kontrolěruj pšosym, lěc coš dataju napšawdu nagraś.',
 'windows-nonascii-filename' => 'Toś ten wiki njepódpěra datajowe mjenja z wósebnymi znamuškami.',
-'fileexists' => "Dataja z toś tym mjenim južo eksistěrujo.
-Tłocyš-lic na \"Dataju składowaś\", ga se dataja pśepišo.
-Pšosym kontrolěruj '''<tt>[[:\$1]]</tt>''', gaž njejsy se kradu wěsty.
-[[\$1|thumb]]",
-'filepageexists' => "Wopisański bok za toś tu dataju bu južo na '''<tt>[[:$1]]</tt>''' napórany, ale dataja z toś tym mjenim tuchylu njeeksistěrujo. Zespominanje, kótarež zapódawaš, njezjawijo se na wopisańskem boku. Aby se twóje zespominanje tam zjawiło, dejš jen manuelnje wobźěłaś.
-[[$1|thumb]]",
-'fileexists-extension' => "Eksistěrujo južo dataja z pódobnym mjenim: [[$2|thumb]]
-* Mě dataje, kótaraž dej se nagraś: '''<tt>[[:$1]]</tt>'''
-* Mě eksistěrujuceje dataje: '''<tt>[[:$2]]</tt>'''
-Pšosym wubjeŕ druge mě.",
+'fileexists' => 'Dataja z toś tym mjenim južo eksistěrujo.
+Tłocyš-lic na "Dataju składowaś", ga se dataja pśepišo.
+Pšosym kontrolěruj <strong>[[:$1]]</strong>, gaž njejsy se kradu wěsty.
+[[$1|thumb]]',
+'filepageexists' => 'Wopisański bok za toś tu dataju bu južo na <strong>[[:$1]]</strong> napórany, ale dataja z toś tym mjenim tuchylu njeeksistěrujo. Zespominanje, kótarež zapódawaš, njezjawijo se na wopisańskem boku. Aby se twóje zespominanje tam zjawiło, dejš jen manuelnje wobźěłaś.
+[[$1|thumb]]',
+'fileexists-extension' => 'Eksistěrujo južo dataja z pódobnym mjenim: [[$2|thumb]]
+* Mě dataje, kótaraž dej se nagraś: <strong>[[:$1]]</strong>
+* Mě eksistěrujuceje dataje: <strong>[[:$2]]</strong>
+Pšosym wubjeŕ druge mě.',
 'fileexists-thumbnail-yes' => "Zazdaśim ma dataja reducěrowanu wjelikosć ''(thumbnail)''. [[$1|thumb]]
-Kontrolěruj pšosym dataju '''<tt>[[:$1]]</tt>'''.
+Kontrolěruj pšosym dataju <strong>[[:$1]]</strong>.
 Jolic skontrolěrowana dataja jo ten samy wobraz w originalnej wjelikosći, pón njejo notne, separatny pśeglědowy wobraz nagraś.",
-'file-thumbnail-no' => "Mě dataje zachopijo z '''<tt>$1</tt>'''. Zda se, až to jo wobraz z reducěrowaneju wjelikosću. ''(thumbnail)''.
+'file-thumbnail-no' => "Mě dataje zachopijo z <strong>$1</strong>. Zda se, až to jo wobraz z reducěrowaneju wjelikosću. ''(thumbnail)''.
 Jolic maš toś ten wobraz w połnem rozeznaśu, nagraj jen, howac změń pšosym mě dataje.",
 'fileexists-forbidden' => 'Dataja z toś tym mjenim južo eksistěrujo a njedajo se pśepisaś. Jolic coš hyšći swóju dataju nagraś, źi pšosym slědk a wuž nowe mě. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Dataja z toś tym mjenim južo eksistěrujo w zgromadnej chowarni. Jolic hyšći coš nagraś swóju dataju, źi pšosym slědk a wužyj nowe mě.
@@ -1661,6 +1678,7 @@ $1',
 'lockmanager-fail-releaselock' => 'Zastajenje za "$1" njedajo se dopušćiś.',
 'lockmanager-fail-db-bucket' => 'W zběrniku $1 njedajo se dosć zastajeńskich datowych bankow kontaktěrowaś',
 'lockmanager-fail-db-release' => 'Zastajenja na datowu banku $1 njedaju se dopušćiś.',
+'lockmanager-fail-svr-acquire' => 'Zastajenja na serwer $1 njedaju se wótwołaś.',
 'lockmanager-fail-svr-release' => 'Zastajenja na serwer $1 njedaju se dopušćiś.',
 
 # ZipDirectoryReader
@@ -1775,6 +1793,7 @@ Snaź coš wopisanje na jeje [$2 boku datajowego wopisanja] wobźěłaś.',
 'uploadnewversion-linktext' => 'Nowu wersiju toś teje dataje nagraś',
 'shared-repo-from' => 'z $1',
 'shared-repo' => 'zgromadny repozitorium',
+'upload-disallowed-here' => 'Bóžko njamóžoš toś ten wobraz pśepisaś.',
 
 # File reversion
 'filerevert' => 'Slědk wześ $1',
@@ -1808,7 +1827,7 @@ Snaź coš wopisanje na jeje [$2 boku datajowego wopisanja] wobźěłaś.',
 
 # MIME search
 'mimesearch' => 'MIME-typ pytaś',
-'mimesearch-summary' => 'Na toś tom specialnem boku mógu se dataje pó MIME-typu filtrowaś. Zapódaśe dej wopśimjeś stawnje typ medija a subtyp: <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Na toś tom specialnem boku mógu se dataje pó MIME-typu filtrowaś. Zapódaśe dej wopśimjeś stawnje typ medija a subtyp: <code>image/jpeg</code>.',
 'mimetype' => 'Typ MIME:',
 'download' => 'Ześěgnuś',
 
@@ -1854,9 +1873,8 @@ Snaź coš wopisanje na jeje [$2 boku datajowego wopisanja] wobźěłaś.',
 
 'disambiguations' => 'Boki, kótarež wótkazuju na boki wěcejzmysłowosći',
 'disambiguationspage' => 'Template:Rozjasnjenje zapśimjeśow',
-'disambiguations-text' => 'Slědujuce boki wótkazuju na bok za rozjasnjenje zapśimjeśow.
-Wótkazujśo lubjej na pótrjefjony bok.<br />
-Bok wobjadnawa se ako bok wujasnjenja zapśimjeśa, gaž wótkazujo na nju [[MediaWiki:Disambiguationspage]].',
+'disambiguations-text' => 'Slědujuce boki wopśimuju nanejmjenjej jaden wótkaz k bokoju rozjasnjenja zapśimjeśow. Wóne by dejali město togo ku gódnjejšemu bokoju wótkazaś.<br />
+Maju bok za  bok rozjasnjenja zapśimjeśow, gaž wužywa pśedłogu, na kótaruž wótkazujo se wót [[MediaWiki:Disambiguationspage]].',
 
 'doubleredirects' => 'Dwójne dalejpósrědnjenja',
 'doubleredirectstext' => 'Toś ten bok nalicujo boki, kótarež dalej pósrědnjaju na druge dalejpósrědnjenja.
@@ -1880,6 +1898,7 @@ Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a tek
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|byta|byty}}',
 'ncategories' => '$1 {{PLURAL:$1|kategorija|kategoriji|kategorije}}',
+'ninterwikis' => '$1 {{PLURAL:$1|mjazyrěcny wótkaz|mjazyrěcnej wótkaza|mjazyrěcne wótkaze|mjazyrěcnych wótkazow}}',
 'nlinks' => '$1 {{PLURAL:$1|wótkaz|wótkaza|wótkaze}}',
 'nmembers' => '$1 {{PLURAL:$1|zapis|zapisa|zapise}}',
 'nrevisions' => '$1 {{PLURAL:$1|wobźěłanje|wobźěłani|wobźěłanja}}',
@@ -1909,6 +1928,7 @@ Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a tek
 'mostlinkedtemplates' => 'Nejcesćej wužywane psedłogi',
 'mostcategories' => 'Boki z nejwěcej kategorijami',
 'mostimages' => 'Nejcesćej wótkazane dataje',
+'mostinterwikis' => 'Boki z nejwěcej mjazyrěcnymi wótkazami',
 'mostrevisions' => 'Boki z nejwěcej wersijami',
 'prefixindex' => 'Wšykne boki z prefiksom',
 'prefixindex-namespace' => 'Wšykne boki z prefiksom (mjenjowy rum $1)',
@@ -2007,7 +2027,7 @@ Glědaj teke [[Special:WantedCategories|póžedane kategorije]].',
 'linksearch-ok' => 'Pytaś',
 'linksearch-text' => 'Jo móžno zastupne znamuška kaž "*.wikipedia.org" wužywaś. 
 Jo nanejmjenjej głowna domena trěbna, na pśikład "*.org"<br />
-Pódpěrane protokole: <tt>$1</tt> (pšosym njepódaj je w swójom pytanju).',
+Pódpěrane protokole: <code>$1</code> (pšosym njepódaj je w swójom pytanju).',
 'linksearch-line' => '$1 wótkazany z $2',
 'linksearch-error' => 'Zasupne znamješko daju se jano na zachopjeńku URL wužywaś.',
 
@@ -2052,6 +2072,8 @@ Pódpěrane protokole: <tt>$1</tt> (pšosym njepódaj je w swójom pytanju).',
 'mailnologin' => 'Njejo móžno e-mailku pósłaś.',
 'mailnologintext' => 'Dejš [[Special:UserLogin|pśizjawjony]] byś a płaśiwu e-mailowu adresu w swójich [[Special:Preferences|nastajenjach]] měś, aby drugim wužywarjam e-mail pósłał.',
 'emailuser' => 'Toś tomu wužywarjeju e-mail pósłaś',
+'emailuser-title-target' => 'E-mail na {{GENDER:$1|toś tomu wužywarjeju|toś tej wužywarce}} pósłaś',
+'emailuser-title-notarget' => 'E-mail wužywarjeju',
 'emailpage' => 'E-mail wužywarjeju',
 'emailpagetext' => 'Móžoš slědujucy formular wužywaś, aby toś tomu wužywarjeju e-mail pósłał.
 E-mailowa adresa, kótaruž sy zapódał w [[Special:Preferences|swójich wužywarskich nastajenjach]], zjawi se ako adresa w pólu "Wót" e-maile, aby dostawaŕ móžo śi direktnje wótegroniś.',
@@ -2192,6 +2214,8 @@ póstupujśo z glědanim.',
 'rollback' => 'Wobźěłanja slědk wześ',
 'rollback_short' => 'anulěrowaś',
 'rollbacklink' => 'anulěrowaś',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|změnu|změnje|změny|změnow}} slědk wześ',
+'rollbacklinkcount-morethan' => 'wěcej ako $1 {{PLURAL:$1|změnu|změnje|změny|změnow}} slědk wześ',
 'rollbackfailed' => 'Slědkwześe njejo se raźiło.',
 'cantrollback' => 'Njejo móžno změnu slědk wześ, slědny pśinosowaŕ jo jadnučki awtor boka.',
 'alreadyrolled' => 'Njejo móžno slědnu změnu w nastawku [[:$1]] wót [[User:$2|$2]] ([[User talk:$2|diskusija]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) slědk wześ; drugi wužywaŕ jo mjaztym bok změnił abo južo slědk stajił .
@@ -2666,6 +2690,7 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
 'import-interwiki-templates' => 'Wše pśedłogi zapśěgnuś',
 'import-interwiki-submit' => 'Importěrowaś',
 'import-interwiki-namespace' => 'Celowy mjenjowy rum:',
+'import-interwiki-rootpage' => 'Celowy kórjenjowy bok (opcionalny):',
 'import-upload-filename' => 'Datajowe mě:',
 'import-comment' => 'Komentar:',
 'importtext' => 'Eksportěruj pšosym dataju ze žredlowego wikija z pomocu [[Special:Export|eksporteje funkcije]]. Składuj ju na swójom licadle a nagraj ju sem.',
@@ -2697,6 +2722,9 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
 'import-error-interwiki' => 'Bok "$1" se njeimportěrujo, dokulaž jogo mě jo za eksterne wótkazowanje (interwiki) wuměnjone.',
 'import-error-special' => 'Bok "$1" se njeimportěrujo, dokulaž słuša k wósebnemu mjenjowemu rumoju, kótaryž njedowólujo boki.',
 'import-error-invalid' => 'Bok "$1" se njeimportěrujo, dokulaž jogo mě jo njepłaśiwe.',
+'import-options-wrong' => '{{PLURAL:$2|Wopacna opcija|Wopacnej opciji|Wopacne opcije|Wopacne opcije}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Pódany kórjenjowy bok jo njepłaśiwy.',
+'import-rootpage-nosubpage' => 'Mjenjowy rum "$1" kórjenjowego boka njedowólujo pódboki.',
 
 # Import log
 'importlogpage' => 'Log-lisćinu importěrowaś',
@@ -2821,16 +2849,35 @@ W zespominanju dajo se pśicyna pódaś.',
 
 # Info page
 'pageinfo-title' => 'Informacije za bok "$1"',
-'pageinfo-header-edits' => 'Změny',
-'pageinfo-header-watchlist' => 'Wobglědowańka',
-'pageinfo-header-views' => 'Zwobraznjenja',
-'pageinfo-subjectpage' => 'Bok',
-'pageinfo-talkpage' => 'Diskusijny bok',
-'pageinfo-watchers' => 'Licba  wobglědowarjow',
-'pageinfo-edits' => 'Licba wobźěłanjow:',
-'pageinfo-authors' => 'Licba wšakich awtorow',
+'pageinfo-header-basic' => 'Zakładne informacije',
+'pageinfo-header-edits' => 'Historiju wobźěłaś',
+'pageinfo-header-restrictions' => 'Šćit boka',
+'pageinfo-header-properties' => 'Kakosći boka',
+'pageinfo-display-title' => 'Zwobraznjeński titel',
+'pageinfo-default-sort' => 'Standardny sortěrowański kluc',
+'pageinfo-length' => 'Dłujkosć boka (w bajtach)',
+'pageinfo-article-id' => 'ID boka',
+'pageinfo-robot-policy' => 'Status pytawy',
+'pageinfo-robot-index' => 'Indeksěrujobny',
+'pageinfo-robot-noindex' => 'Njeindeksěrujobny',
 'pageinfo-views' => 'Licba zwobraznjenjow',
-'pageinfo-viewsperedit' => 'Zwobraznjenja na změnu',
+'pageinfo-watchers' => 'Licba  wobglědowarjow boka',
+'pageinfo-redirects-name' => 'Dalejpósrědnjenja k toś tomu bokoju',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Pódboki toś togo boka',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|dalejpósrědnjenja|dalejpósrědnjeni|dalejpósrědnjenja|dalejpósrědnjenjow}}; $3 {{PLURAL:$3|njedalejpósrědnjenja|njedalejpósrědnjeni|njedalejpósrědnjenja|njedalejpósrědnjenjow}})',
+'pageinfo-firstuser' => 'Awtor boka',
+'pageinfo-firsttime' => 'Datum napóranja boka',
+'pageinfo-lastuser' => 'Slědny wobźěłaŕ',
+'pageinfo-lasttime' => 'Datum slědneje změny',
+'pageinfo-edits' => 'Cełkowna licba změnow:',
+'pageinfo-authors' => 'Cełkowna licba wšakich awtorow',
+'pageinfo-recent-edits' => 'Licba nejnowšych změnow (za zachadnych $1)',
+'pageinfo-recent-authors' => 'Nejnowša licba rozdźělnych awtorow',
+'pageinfo-restriction' => 'Šćit boka (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magiske słowo|Magiskej słowje|Magiske słowa|Magiske słowa}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Zapśěgnjona pśedłoga|Zapśěgnjonej pśedłoze|Zapśěgnjone pśedłogi|Zapśěgnjone pśedłogi}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Klasiski',
@@ -2883,6 +2930,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 pikselow, wjelikosć dataje: $3, MIME-typ: $4, $5 {{PLURAL:$5|bok|boka|boki|bokow}}',
 'file-nohires' => 'Wuše wótgranicowanje njeeksistěrujo.',
 'svg-long-desc' => 'dataja SVG, nominalnje: $1 × $2 piksele, wjelikosć dataje: $3',
+'svg-long-desc-animated' => 'Animěrowana SVG-dataja, zakładnej wótměra $1 × $2 pikselow, datajowa wjelikosć: $3',
 'show-big-image' => 'Połne optiske wótgranicowanje.',
 'show-big-image-preview' => 'Wjelikosć toś togo pśeglěda: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Druge rozeznaśe||Drugej rozeznaśi|Druge rozeznaśa|Druge rozeznaśa}}: $1.',
@@ -2892,6 +2940,8 @@ $1',
 'file-info-png-looped' => 'šlejfa',
 'file-info-png-repeat' => '{{PLURAL:$1|$1 raz|dwójcy|$1 raze|$1 razow}} wótegrata',
 'file-info-png-frames' => '$1 {{PLURAL:$1|wobłuk|wobłuka|wobłuki|wobłukow}}',
+'file-no-thumb-animation' => "'''Glědaj: Techniskich wobgranicowanjow dla pśeglědne wobrazki toś teje dataje se njeaniměruju.'''",
+'file-no-thumb-animation-gif' => "'''Glědaj: Techniskich wobgranicowanjow dla pśeglědne wobrazki wusokego rozeznaśa GIF-wobrazow ako toś togo njebudu se animěrowaś.'''",
 
 # Special:NewFiles
 'newimages' => 'Nowe dataje',
@@ -3554,7 +3604,7 @@ Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwěza
 * <span class="mw-specialpagerestricted">Specialne boki z wobgranicowanym pśistupom.</span>',
 'specialpages-group-maintenance' => 'Wótwardowańske lisćiny',
 'specialpages-group-other' => 'Druge specialne boki',
-'specialpages-group-login' => 'Pśizjawjenje',
+'specialpages-group-login' => 'Pśizjawiś/Konto załožyś',
 'specialpages-group-changes' => 'Slědne změny a protokole',
 'specialpages-group-media' => 'Medije',
 'specialpages-group-users' => 'Wužywarje a pšawa',
@@ -3688,9 +3738,12 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'api-error-empty-file' => 'Dataja, kótaruž sy nagrał, jo prozna była.',
 'api-error-emptypage' => 'Napóranje nowych, proznych bokow njejo dowólone.',
 'api-error-fetchfileerror' => 'Nutśikowna zmólka: Pśii wobstarowanju dataje jo se něco njeraźiło.',
+'api-error-fileexists-forbidden' => 'Dataja z mjenim "$1" južo eksistěrujo, a njedajo se pśepisaś.',
+'api-error-fileexists-shared-forbidden' => 'Dataja z mjenim "$1" južo eksistěrujo w zgromadnem datajowem repozitoriumje a njedajo se pśepisaś.',
 'api-error-file-too-large' => 'Dataja, kótaruž sy nagrał, jo pśewjelika była.',
 'api-error-filename-tooshort' => 'Datajowe mě jo pśekrotke.',
 'api-error-filetype-banned' => 'Toś ten datajowy typ jo zakazany.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|njejo dowólony datajowy typ|njejstej dowólenej datajowej typa|njejsu dowólone datajowe typy|njejsu dowólone datajowe typy}}. {{PLURAL:$3|Dowólony datajowy typ jo|Dowólenej datajowej typa stej|Dowólone datajowe typy su}} $2.',
 'api-error-filetype-missing' => 'Dataja njama datajowu kóńcowku.',
 'api-error-hookaborted' => 'Změna, kótaruž sy wopytał pśewjasć, jo se pśetergnuła pśez rozšyrjenje.',
 'api-error-http' => 'Nutśikowna zmólka: Zwisk ze serwerom njemóžno.',
diff --git a/languages/messages/MessagesEgl.php b/languages/messages/MessagesEgl.php
new file mode 100644 (file)
index 0000000..9b0552e
--- /dev/null
@@ -0,0 +1,692 @@
+<?php
+/** Emiliàn (Emiliàn)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Reder
+ */
+
+$fallback = 'it';
+
+$messages = array(
+# Dates
+'sun' => 'Dum',
+'mon' => 'Lün',
+'tue' => 'Mär',
+'wed' => 'Mer',
+'thu' => 'Giu',
+'fri' => 'Van',
+'sat' => 'Sab',
+'january' => 'Znär',
+'february' => 'Farvär',
+'march' => 'März',
+'april' => 'April',
+'may_long' => "Magg'",
+'june' => 'Giügn',
+'july' => 'Lüi',
+'august' => 'Agust',
+'september' => 'Steimbar',
+'october' => 'Uttubar',
+'november' => 'Nueimbar',
+'december' => 'Dzeimbar',
+'january-gen' => 'Znär',
+'february-gen' => 'Farvär',
+'march-gen' => 'März',
+'april-gen' => 'April',
+'may-gen' => "Magg'",
+'june-gen' => 'Giügn',
+'july-gen' => 'Lüi',
+'august-gen' => 'Agust',
+'september-gen' => 'Steimbar',
+'october-gen' => 'Uttubar',
+'november-gen' => 'Nueimbar',
+'december-gen' => 'Dzeimbar',
+'jan' => 'Znä',
+'feb' => 'Far',
+'mar' => 'Mär',
+'apr' => 'Apr',
+'may' => 'Mag',
+'jun' => 'Giü',
+'jul' => 'Lüi',
+'aug' => 'Agu',
+'sep' => 'Ste',
+'oct' => 'Utt',
+'nov' => 'Nue',
+'dec' => 'Dze',
+
+# Categories related messages
+'hidden-categories' => '{{PLURAL:$1|Categuria nascost|Categuri nascost}}',
+
+'about' => 'Informaziun',
+'cancel' => ' 
+Cancellä',
+'mytalk' => 'Le mé discüssion',
+'navigation' => 'Navigazion',
+'and' => '&#32;e',
+
+# Cologne Blue skin
+'qbfind' => 'Trov',
+'qbedit' => 'Mudifich',
+'qbpageoptions' => "Opzion d'la pàgina",
+'qbmyoptions' => 'Le mé pàgin',
+'qbspecialpages' => 'Pàgin speciäl',
+'faq' => 'Dumand frequeint',
+
+# Vector skin
+'vector-action-delete' => 'Cancellä',
+'vector-action-move' => 'Spusta',
+'vector-action-protect' => "Prutegg'",
+'vector-view-create' => 'Creä',
+'vector-view-edit' => 'Mudifich',
+'vector-view-history' => 'Väda la storia',
+'vector-view-view' => "Legg'",
+'vector-view-viewsource' => 'Vadä la surgìnt',
+'actions' => 'Azion',
+'namespaces' => 'Namespace',
+'variants' => 'Variänt',
+
+'errorpagetitle' => 'Errur',
+'tagline' => 'Da {{SITENAME}}',
+'help' => 'Aiüt',
+'search' => 'Cercä',
+'searchbutton' => 'Cercä',
+'go' => 'Vé',
+'searcharticle' => 'Vé',
+'history' => "Storia d'la pàgina",
+'history_short' => 'Storia',
+'permalink' => 'Link permaneint',
+'print' => 'Stampa',
+'view' => 'Vada',
+'edit' => 'Mudifich',
+'create' => 'Creä',
+'delete' => 'Cancellä',
+'deletethispage' => 'Cancellä custa pàgina ché',
+'undelete_short' => 'Recuperä {{PLURAL:$1|una revision|$1 revision}}',
+'viewdeleted_short' => 'Vadä {{PLURAL:$1|una mudfich cancellät|$1 mudfich cancellät}}',
+'protect' => "Prutegg'",
+'protect_change' => 'Cambia',
+'protectthispage' => "Prutegg' custa pàgina ché",
+'unprotect' => 'Cambiä la prutezion',
+'unprotectthispage' => 'Cambiä la prutezion par custa pàgina ché',
+'newpage' => 'Pàgina növa',
+'talkpage' => 'Pàgina ad discüssion',
+'talkpagelinktext' => 'Discüssion',
+'specialpage' => 'Pàgina speciäl',
+'personaltools' => 'Strümeint parsunäl',
+'postcomment' => 'Sezion növa',
+'articlepage' => 'Vadä la pàgina ad contenüt',
+'talk' => 'Discüssion',
+'views' => 'Visit',
+'toolbox' => 'Strümeint',
+'userpage' => "Vadä la pàgina ad l'uteint",
+'projectpage' => 'Vadä la pàgina dal prugett',
+'imagepage' => 'Vadä la pàgina dal file',
+'mediawikipage' => "Vadä al messagg'",
+'templatepage' => 'Vadä al template',
+'viewhelppage' => "Vadä la pàgina d'aiüt",
+'categorypage' => 'Vadä la categoria',
+'viewtalkpage' => 'Vadä la discüssion',
+'otherlanguages' => 'Ätar leingav',
+'redirectedfrom' => '(Reindirizzameint da <b>$1</b>)',
+'redirectpagesub' => 'Pàgina ad reindirizzameint',
+'lastmodifiedat' => "Ültim mudifich d'la pàgina: $2, $1.",
+'viewcount' => "Custa pàgina ché l'è stata letta {{PLURAL:$1|vüna volta|$1 volte}}.",
+'protectedpage' => 'Pàgina bluccä',
+'jumpto' => 'Andä a',
+'jumptonavigation' => 'navigazion',
+'jumptosearch' => 'cercä',
+'pool-queuefull' => "La cua dal pool l'è piena",
+'pool-errorunknown' => 'Errur mia cugnussü',
+
+# 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' => 'Infurmazion su {{SITENAME}}',
+'aboutpage' => 'Project:Infurmäzion',
+'copyright' => "Contenüt suggètt a licinza d'üs $1.",
+'copyrightpage' => '{{ns:project}}:Copyright',
+'currentevents' => 'Eveint curreint',
+'currentevents-url' => 'Project:Eveint curreint',
+'disclaimers' => 'Informazion legäl',
+'disclaimerpage' => 'Project:Avvartenza generäl',
+'edithelp' => 'Libar di spiegazión',
+'edithelppage' => 'Help:Mudifich',
+'helppage' => "Help:Tütt l'argumeint",
+'mainpage' => 'Prima pàgina',
+'mainpage-description' => 'Pàgina principäl',
+'policy-url' => 'Project:Policy',
+'portal' => "Purtäda d'la cumünitä",
+'portal-url' => "Project:Purtäda d'la cumünitä",
+'privacy' => "Legg' l'informazion parsunäl",
+
+'ok' => 'OK',
+'newmessageslink' => "növ messagg'",
+'editsection' => 'cambi',
+'editold' => 'mudifich',
+'viewsourceold' => 'vadä la surgìnt',
+'editlink' => 'mudifich',
+'viewsourcelink' => 'vadä la surgìnt',
+'editsectionhint' => 'Mudifich la seziòn: $1',
+'toc' => 'Indez',
+'showtoc' => 'mustra',
+'hidetoc' => 'nascond',
+'collapsible-collapse' => 'Comprim',
+'collapsible-expand' => 'Espand',
+'thisisdeleted' => 'Vadä o ripristinä $1?',
+'viewdeleted' => 'Vadä $1?',
+'restorelink' => '{{PLURAL:$1|vüna mudfich cancellät|$1 mudfich cancellät}}',
+'feedlinks' => 'Feed:',
+'feed-invalid' => "La mudalitä ad sottoscrizion dal feed l'è mia valid.",
+'feed-unavailable' => 'I feed al son mia dispunibil',
+'site-rss-feed' => 'Emissiòn RSS ad $1',
+'site-atom-feed' => 'Emission Atom ad $1',
+'page-rss-feed' => 'Emissiòn RSS par $1',
+'page-atom-feed' => 'Emission Atom par $1',
+'red-link-title' => "$1 (la pàgina a l'esist mia)",
+'sort-descending' => 'Ordinamient decrescent',
+'sort-ascending' => 'Ordinamient cresceint',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Pàgina',
+'nstab-user' => 'Pàgina uteint',
+'nstab-media' => 'File multimediäl',
+'nstab-special' => 'Pàgina speciäl',
+'nstab-project' => 'Pàgina ad sërvizi',
+'nstab-image' => 'Immàgin',
+'nstab-mediawiki' => "Messagg'",
+'nstab-template' => 'Mudell',
+'nstab-help' => 'Aiüt',
+'nstab-category' => 'Categuria',
+
+# General errors
+'error' => 'Errur',
+'databaseerror' => 'Errur dal database',
+'readonly' => 'Database bluccä',
+'missingarticle-rev' => '(revision n°: $1)',
+'missingarticle-diff' => '(Diff: $1, $2)',
+'internalerror' => 'Errur interiur',
+'internalerror_info' => 'Errur interiur: $1',
+'viewsource' => 'Vadä la surgìnt',
+'viewsource-title' => 'Vadä la surgìnt ad $1',
+
+# Login and logout pages
+'yourname' => 'Nom uteint:',
+'yourpassword' => 'Password:',
+'yourpasswordagain' => 'Ripett la password:',
+'login' => 'Enträ',
+'nav-login-createaccount' => 'Enträ / Creä un account',
+'userlogin' => 'Enträ / Creä un account',
+'userloginnocreate' => 'Enträ',
+'logout' => 'Üscì',
+'userlogout' => 'Üscì',
+'notloggedin' => 'Si mia enträ',
+'nologinlink' => 'Creä un cunt',
+'createaccount' => 'Creä cunt',
+'gotaccountlink' => 'Enträ',
+'createaccountmail' => 'Via e-mail',
+'createaccountreason' => 'Mutiv:',
+'loginerror' => 'Errur ad enträ',
+'accountcreated' => 'Account creä',
+'loginlanguagelabel' => 'Leingua: $1',
+
+# Change password dialog
+'resetpass' => 'Cambiä la password',
+'oldpassword' => "Vecc' password:",
+'newpassword' => 'Növa password:',
+'resetpass-submit-loggedin' => 'Cambiä la password',
+'resetpass-submit-cancel' => 'Cancellä',
+'resetpass-temp-password' => 'Password tempural:',
+
+# Special:PasswordReset
+'passwordreset' => 'Cambiä la password',
+'passwordreset-legend' => 'Cambiä la password',
+'passwordreset-username' => 'Nom uteint:',
+'passwordreset-domain' => 'Dumini:',
+
+# Edit page toolbar
+'bold_sample' => 'Grassètt',
+'italic_sample' => 'Cursìv',
+'media_tip' => 'Cullegameint al file',
+
+# Edit pages
+'summary' => 'Summari:',
+'savearticle' => 'Sälv la pàgina',
+'preview' => 'Vadä prima',
+'showpreview' => "Vadä l'antepeima",
+'showdiff' => 'Vadä li cambiameint',
+'blockedtitle' => 'Uteint bluccä',
+'newarticle' => '(Növ)',
+'note' => "'''Nota:'''",
+'editing' => 'Mudifich ad $1',
+'editingsection' => 'Mudifich ad $1 (sezion)',
+'editingcomment' => 'Mudifich ad $1 (növ sezion)',
+'editconflict' => 'Conflitt ad mudifich: $1',
+'yourtext' => 'Al tò test',
+'yourdiff' => 'Differeinz',
+'template-protected' => '(prutett)',
+'template-semiprotected' => '(mézz-prutett)',
+'log-fulllog' => 'Vadä al log cumplet',
+'edit-conflict' => 'Conflitt ad mudifich.',
+
+# History pages
+'viewpagelogs' => 'Vadä li log ad custa pàgina ché',
+'currentrev' => 'Ültima version',
+'currentrev-asof' => 'Ültima version dle $1',
+'revisionasof' => 'Version dle $1',
+'revision-info' => 'Version dle $1, avtur: $2',
+'previousrevision' => "← Version piö vecc'",
+'nextrevision' => 'Versiòn piö növ →',
+'currentrevisionlink' => 'Ültima version',
+'cur' => 'curr',
+'next' => 'succ',
+'last' => 'prec',
+'page_first' => 'prima',
+'page_last' => 'ültim',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 al $2',
+
+# Revision deletion
+'rev-delundel' => 'vadä/anscönd',
+'revdelete-radio-set' => 'Sì',
+'revdelete-radio-unset' => 'No',
+'revdelete-reasonotherlist' => 'Ätar ragion',
+
+# Merge log
+'revertmerge' => "Annullä l'ünion",
+
+# Diffs
+'lineno' => 'Riga $1:',
+'editundo' => 'cancellä',
+
+# Search results
+'searchresults' => "Risultät d'la ricerch",
+'searchresults-title' => 'Risultät d\'la ricerch ad "$1"',
+'viewprevnext' => 'Väda ($1 {{int:pipe-separator}} $2) ($3).',
+'searchprofile-articles' => 'Pàgin ad cuntinüt',
+'searchprofile-images' => 'Multimëdi',
+'searchprofile-everything' => 'Tütt',
+'searchprofile-advanced' => 'Avanzät',
+'searchprofile-articles-tooltip' => 'Cercä in $1',
+'searchprofile-project-tooltip' => 'Cercä in $1',
+'searchprofile-images-tooltip' => 'Cercä immàgin',
+'search-result-size' => '$1 ({{PLURAL:$2|1 parola|$2 paroli}})',
+'search-redirect' => '(redirect $1)',
+'search-section' => '(sezion $1)',
+'search-interwiki-caption' => 'Prugett fradel',
+'search-interwiki-default' => 'Risültä da $1:',
+'search-interwiki-more' => '(ätar)',
+'searchall' => 'tütt',
+'powersearch-toggleall' => 'Tütt',
+'powersearch-togglenone' => 'Ansöin',
+
+# Quickbar
+'qbsettings' => 'Quickbar',
+'qbsettings-none' => 'Ansöin',
+'qbsettings-fixedleft' => 'Fiss a sinistar',
+'qbsettings-fixedright' => 'Fiss a destar',
+'qbsettings-floatingleft' => 'Fluttuant a sinistar',
+'qbsettings-floatingright' => 'Fluttuant a destar',
+
+# Preferences page
+'preferences' => 'Prefereinz',
+'mypreferences' => 'Al me prefereinz',
+'prefs-edits' => 'Nümar ad mudifich:',
+'prefsnologin' => 'Si mia enträ',
+'changepassword' => 'Cambiä la password',
+'prefs-skin' => 'Skin',
+'skin-preview' => 'Vadä prima',
+'datedefault' => 'Ansiön prefereinz',
+'prefs-beta' => 'Funzionalitä beta',
+'saveprefs' => 'Salvä',
+'prefs-editing' => 'Mudificä',
+'rows' => 'Righe',
+'searchresultshead' => 'Cercä',
+'timezoneregion-africa' => 'Africa',
+'timezoneregion-america' => 'América',
+'timezoneregion-antarctica' => 'Antartide',
+'timezoneregion-arctic' => 'Artide',
+'timezoneregion-asia' => 'Asia',
+'timezoneregion-atlantic' => 'Ucean Atlantich',
+'timezoneregion-australia' => 'Australia',
+'timezoneregion-europe' => 'Europa',
+'timezoneregion-indian' => 'Ucean Indian',
+'timezoneregion-pacific' => 'Ucean Pacifich',
+'youremail' => 'E-mail:',
+'username' => 'Nom uteint',
+'uid' => 'ID uteint',
+'prefs-memberingroups' => 'Membar {{PLURAL:$1|dal grüpp|dei grüpp}}:',
+'yourrealname' => 'Nom ver:',
+'yourlanguage' => 'Leingua',
+'email' => 'E-mail',
+
+# Groups
+'group' => 'Grüpp:',
+'group-user' => 'Uteint',
+'group-autoconfirmed' => 'Uteint autoconvalidät',
+'group-bot' => 'Bot',
+'group-sysop' => 'Amministradór',
+'group-bureaucrat' => 'Bürocrat',
+'group-suppress' => 'Oversight',
+'group-all' => '(tütt)',
+
+'group-user-member' => '{{GENDER:$1|uteint}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|uteint autoconvalidät}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|amministradór}}',
+'group-bureaucrat-member' => '{{GENDER:$1|bürocrat}}',
+'group-suppress-member' => '{{GENDER:$1|oversight}}',
+
+'grouppage-user' => '{{ns:project}}:Uteint',
+'grouppage-autoconfirmed' => '{{ns:project}}:Uteint autoconvalidät',
+'grouppage-bot' => '{{ns:project}}:Bot',
+'grouppage-sysop' => '{{ns:project}}:Amministradór',
+'grouppage-bureaucrat' => '{{ns:project}}:Bürocrat',
+'grouppage-suppress' => '{{ns:project}}:Oversight',
+
+# Rights
+'right-read' => "Legg' pàgin",
+'right-edit' => 'Mudifich pàgin',
+
+# User rights log
+'rightsnone' => '(ansöin)',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-read' => "legg' custa pàgina ché",
+'action-edit' => 'mudifch custa pàgina ché',
+'action-createpage' => 'creä pàgin',
+'action-move' => 'spustä custa pàgina ché',
+'action-movefile' => 'spustä cust file ché',
+'action-upload' => 'caricä cust file ché',
+'action-delete' => 'cancellä custa pàgina ché',
+
+# Recent changes
+'recentchanges' => 'Ültim cambiameint',
+'rcshowhidebots' => '$1 i bot',
+'rcshowhidemine' => '$1 le mé mudifich',
+'diff' => 'diff',
+'hist' => 'cron',
+'hide' => 'Nascond',
+'show' => 'mustra',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'number_of_watching_users_pageview' => '[usservä da {{PLURAL:$1|vün uteint|$1 uteint}}]',
+'rc_categories_any' => 'Qualsía',
+
+# Upload
+'upload' => 'Cärga un file',
+
+'license' => 'Licinza:',
+'license-header' => 'Licinza',
+'nolicense' => 'Ansöna licinza seleziunä',
+
+# Special:ListFiles
+'listfiles_date' => 'Data',
+'listfiles_name' => 'Nom',
+'listfiles_user' => 'Uteint',
+
+# File description page
+'file-anchor-link' => 'Immàgin',
+'filehist' => 'Storia dal file',
+'filehist-current' => 'curreint',
+'filehist-datetime' => 'Data/Ura',
+'filehist-thumb' => 'Miniadüra',
+'filehist-user' => 'Uteint',
+'filehist-dimensions' => 'Dimension',
+'filehist-comment' => 'Uggett',
+'imagelinks' => 'Cullegameint al file',
+
+# File deletion
+'filedelete-submit' => 'Cancellä',
+
+# Random page
+'randompage' => 'Una pàgina a cäs',
+
+'brokenredirects-edit' => 'cambi',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
+'newpages' => 'Pàgin növ',
+'move' => 'Spusta',
+
+# Book sources
+'booksources-go' => 'Vé',
+
+# Special:AllPages
+'alphaindexline' => 'da $1 a $2',
+'allpagessubmit' => 'Vé',
+
+# Special:ListUsers
+'listusers-submit' => 'Mustra',
+
+# Special:ListGroupRights
+'listgrouprights-group' => 'Grüpp',
+
+# E-mail user
+'emailfrom' => 'Da:',
+'emailto' => 'A:',
+'emailsubject' => 'Uggett:',
+'emailmessage' => "Messagg'",
+
+# Watchlist
+'mywatchlist' => 'Le mé üsservat speciäl',
+'watchlistfor2' => "Dall'uteint $1 $2",
+'watchnologin' => 'Si mia enträ',
+'watch' => 'Vadä',
+'watchthispage' => 'Vadä custa pàgina ché',
+'unwatch' => "N'la vadär piö",
+
+'changed' => 'mudifegat',
+'created' => 'creät',
+
+# Delete
+'delete-confirm' => 'Cancellä "$1"',
+'delete-legend' => 'Cancellä',
+
+# Rollback
+'rollback_short' => 'Turne indré',
+'rollbacklink' => 'Avé indré la mudifech ad prima',
+'rollbackfailed' => 'Si mia riussì a turnä indré',
+
+# Protect
+'pagesize' => '(byte)',
+
+# Restrictions (nouns)
+'restriction-edit' => 'Mudifich',
+'restriction-move' => 'Spusta',
+'restriction-create' => 'Creä',
+'restriction-upload' => 'Caricä',
+
+# Undelete
+'undeletelink' => 'vada/turna indré',
+'undeleteviewlink' => 'vada',
+'undelete-show-file-submit' => 'Sì',
+
+# Namespace form on various pages
+'namespace' => 'Namespace:',
+'blanknamespace' => '(Principäl)',
+
+# Contributions
+'contributions' => "Contribüdi de l'uteint",
+'contributions-title' => 'Contribüdi ed $1',
+'mycontris' => 'Le mé contribüdi',
+'contribsub2' => 'Par $1 ($2)',
+'uctop' => '(ültim par la pàgin)',
+
+'sp-contributions-submit' => 'Cercä',
+
+# What links here
+'whatlinkshere-page' => 'Pàgina:',
+'whatlinkshere-links' => '← cullegameint',
+
+# Block/unblock
+'block' => "Bluccä l'uteint",
+'unblock' => "Sbluccä l'uteint",
+'blockip' => "Bluccä l'uteint",
+'blockip-title' => "Bluccä l'uteint",
+'blockip-legend' => "Bluccä l'uteint",
+'ipbotheroption' => 'ätar',
+'ipb-unblock-addr' => 'Sbluccä $1',
+'unblockip' => "Sbluccä l'uteint",
+'blocklist' => 'Uteint bluccä',
+'ipblocklist-submit' => 'Cercä',
+'ipblocklist-otherblocks' => 'Ätar {{PLURAL:$1|blocc|blocc}}',
+'blocklink' => 'blocc',
+'unblocklink' => 'sblocc',
+'change-blocklink' => 'cambiä al blocc',
+'contribslink' => 'cuntribüti',
+'unblocklogentry' => "l'à sbluccä $1",
+
+# Move page
+'move-page' => 'Spustameint ad $1',
+'move-page-legend' => 'Spustä la pàgina',
+'movearticle' => 'Spustä la pàgina:',
+'movenologin' => 'Si mia enträ',
+'movepagebtn' => 'Spustä la pàgina',
+'movelogpage' => 'Spustameint',
+'revertmove' => 'Turné indré',
+
+# Export
+'export-submit' => 'Esporta',
+
+# Namespace 8 related
+'allmessages-filter-all' => 'Tütt',
+'allmessages-language' => 'Leingua:',
+'allmessages-filter-submit' => 'Vé',
+
+# Thumbnails
+'thumbnail-more' => 'Allargä',
+
+# Special:Import
+'import-upload-filename' => 'Nom dal file:',
+'import-comment' => 'Uggett:',
+'import-upload' => 'Caricä dat XML',
+
+# Tooltip help for the actions
+'tooltip-pt-logout' => 'Üscì',
+'tooltip-ca-move' => 'Spustä custa pàgina ché',
+'tooltip-search' => 'Cercä deintar ad {{SITENAME}}',
+'tooltip-p-logo' => 'Väda la pàgina principäl',
+'tooltip-n-mainpage' => 'Väda la pàgina principäl',
+'tooltip-n-mainpage-description' => 'Väda la pàgina principäl',
+'tooltip-n-randompage' => 'Fa vëd una pàgina a cäs',
+'tooltip-n-help' => 'Pàgin di aiüt',
+'tooltip-t-upload' => 'Cärag file multimediäl',
+'tooltip-ca-nstab-project' => 'Vadä la pàgina dal prugett',
+'tooltip-ca-nstab-image' => ' 
+Vadä la pàgina dal file',
+'tooltip-ca-nstab-template' => 'Väda la template',
+'tooltip-ca-nstab-help' => "Vadä la pàgina d'aiüt",
+'tooltip-ca-nstab-category' => "Vadä la pàgina d'la categoria",
+'tooltip-save' => 'Salvä li tò cambiameint',
+
+# Attribution
+'others' => 'ätar',
+
+# Info page
+'pageinfo-header-edits' => 'Mudifich',
+'pageinfo-views' => 'Nümar ad visit',
+'pageinfo-watchers' => 'Numar ad visitador',
+'pageinfo-edits' => 'Nümar ad mudifich',
+'pageinfo-authors' => 'Nümar ad devers autor',
+
+# Browsing diffs
+'previousdiff' => "← Mudifich piö vecc'",
+'nextdiff' => 'Mudifich piö növa →',
+
+# Media information
+'file-info-gif-looped' => 'ciclich',
+'file-info-png-looped' => 'ciclich',
+
+# Special:NewFiles
+'newimages-legend' => 'Nom dal file',
+'showhidebots' => '($1 i bot)',
+'ilsubmit' => 'Cercä',
+'bydate' => 'par data',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'ago' => '$1 fa',
+
+# Metadata
+'metadata' => 'Metadat',
+
+# EXIF tags
+'exif-exposuretime-format' => '$1 s ($2)',
+'exif-gpsareainformation' => "Nom d'la zona GPS",
+'exif-gpsdatestamp' => 'Data GPS',
+'exif-source' => 'Font',
+'exif-languagecode' => 'Leingva',
+'exif-iimcategory' => 'Categuria',
+'exif-identifier' => 'Identificativ',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'tütt',
+'namespacesall' => 'tütt',
+'monthsall' => 'tütt',
+'limitall' => 'tütt',
+
+# Delete conflict
+'recreate' => 'Creä ad növ',
+
+# action=purge
+'confirm_purge_button' => 'OK',
+
+# action=watch/unwatch
+'confirm-watch-button' => 'OK',
+'confirm-unwatch-button' => 'OK',
+
+# Multipage image navigation
+'imgmultigo' => 'Vé!',
+'imgmultigoto' => "Vé in s'la pàgina $1",
+
+# Table pager
+'ascending_abbrev' => 'cresc',
+'descending_abbrev' => 'decresc',
+'table_pager_first' => 'Prima pàgina',
+'table_pager_last' => 'Ültima pàgina',
+'table_pager_limit_submit' => 'Vé',
+
+# Watchlist editor
+'watchlistedit-raw-titles' => 'Titul:',
+
+# Special:Version
+'version' => 'Version',
+'version-specialpages' => 'Pàgin speciäl',
+'version-other' => 'Ätar',
+'version-version' => '(Version $1)',
+'version-license' => 'Licinza',
+'version-poweredby-others' => 'ätar',
+
+# Special:FilePath
+'filepath-page' => 'Immàgin:',
+'filepath-submit' => 'Vé',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch-filename' => 'Nom dal file:',
+'fileduplicatesearch-submit' => 'Cercä',
+
+# Special:SpecialPages
+'specialpages' => 'Pàgin speciäl',
+
+# Special:Tags
+'tags-edit' => 'mudifich',
+
+# Special:ComparePages
+'compare-page1' => 'Pàgina 1',
+'compare-page2' => 'Pàgina 2',
+'compare-rev1' => 'Revisiòn 1',
+'compare-rev2' => 'Revisiòn 2',
+
+# HTML forms
+'htmlform-reset' => 'Turna indré cul la mudifich',
+'htmlform-selectorother-other' => 'Ätar',
+
+# Feedback
+'feedback-subject' => 'Uggett:',
+'feedback-message' => "Messagg':",
+'feedback-cancel' => 'Cancellä',
+
+);
index f609f4c..385ae47 100644 (file)
@@ -11,6 +11,7 @@
  * @author Assassingr
  * @author Azimout
  * @author Badseed
+ * @author Chomwitt
  * @author Consta
  * @author Crazymadlover
  * @author Dada
@@ -211,143 +212,143 @@ $dateFormats = array(
 
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ΑΝΑΚΑΤΕΥΘΥΝΣΗ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__ΧΩΡΙΣΠΠ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__ΧΩΡΙΣΠΙΝΑΚΟΘΗΚΗ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ΜΕΠΠ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ΠΠ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__ΧΩΡΙΣΕΠΕΞΕΝΟΤ__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__ΧΩΡΙΣΚΕΦΑΛΙΔΑ__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣ1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣΟΝΟΜΑ', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣΓΕΝΙΚΗ', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣΣΥΝΤ', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑ2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑΟΝΟΜΑ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ΤΡΕΧΟΝΕΤΟΣ', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ΤΡΕΧΩΝΧΡΟΝΟΣ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ΤΡΕΧΟΥΣΑΩΡΑ', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣ', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣ1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣΟΝΟΜΑ', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣΓΕΝΙΚΗ', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣΣΥΝΤ', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ΤΟΠΙΚΗΜΕΡΑ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ΤΟΠΙΚΗΜΕΡΑ2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'ΤΟΠΙΚΗΜΕΡΑΟΝΟΜΑ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ΤΟΠΙΚΟΕΤΟΣ', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ΤΟΠΙΚΟΣΧΡΟΝΟΣ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ΤΟΠΙΚΗΩΡΑ', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ΑΡΙΘΜΟΣΣΕΛΙΔΩΝ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ΑΡΙΘΜΟΣΑΡΘΡΩΝ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ΑΡΙΘΜΟΣΑΡΧΕΙΩΝ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ΑΡΙΘΜΟΣΧΡΗΣΤΩΝ', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'ΕΝΕΡΓΟΙΧΡΗΣΤΕΣ', 'ΑΡΙΘΜΟΣΕΝΕΡΓΩΝΧΡΗΣΤΩΝ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'ΑΡΙΘΜΟΣΕΠΕΞΕΡΓΑΣΙΩΝ', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'ΑΡΙΘΜΟΣΕΜΦΑΝΙΣΕΩΝ', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΚ', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ΠΕΡΙΟΧΗ', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ΠΕΡΙΟΧΗΚ', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩΝ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩΝΚ', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ΠΕΡΙΟΧΗΘΕΜΑΤΩΝ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ΠΕΡΙΟΧΗΘΕΜΑΤΩΝΚ', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'ΠΛΗΡΕΣΟΝΟΜΑΣΕΛΙΔΑΣ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ΠΛΗΡΕΣΟΝΟΜΑΣΕΛΙΔΑΣΚ', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ΟΝΟΜΑΥΠΟΣΕΛΙΔΑΣ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ΟΝΟΜΑΥΠΟΣΕΛΙΔΑΣΚ', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'ΒΑΣΗΟΝΟΜΑΤΟΣΣΕΛΙΔΑΣ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'ΒΑΣΗΟΝΟΜΑΤΟΣΣΕΛΙΔΑΣΚ', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΣΥΖΗΤΗΣΕΩΝ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΣΥΖΗΤΗΣΕΩΝΚ', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΘΕΜΑΤΟΣ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΘΕΜΑΤΟΣΚ', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'ΚΕΙΜΕΝΟ:', 'MSG:' ),
-       'subst'                   => array( '0', 'ΑΛΛΑΓΗ:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'ΑΠΛΟΚΕΙΜΕΝΟ:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'μικρογραφία', 'μινιατούρα', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'μικρογραφία=$1', 'μινιατούρα=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'δεξιά', 'right' ),
-       'img_left'                => array( '1', 'αριστερά', 'left' ),
-       'img_none'                => array( '1', 'καθόλου', 'none' ),
-       'img_width'               => array( '1', '$1εσ', '$1px' ),
-       'img_center'              => array( '1', 'κέντρο', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'με-πλαίσιο', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'χωρίς-πλαίσιο', 'frameless' ),
-       'img_page'                => array( '1', 'σελίδα=$1', 'σελίδα $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'κατακόρυφα', 'κατακόρυφα=$1', 'κατακόρυφα $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'πλαίσιο', 'border' ),
-       'img_baseline'            => array( '1', 'γραμμήβάσης', 'baseline' ),
-       'img_sub'                 => array( '1', 'δείκτης', 'sub' ),
-       'img_super'               => array( '1', 'εκθέτης', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'άνω', 'top' ),
-       'img_text_top'            => array( '1', 'πάνω-από-το-κείμενο', 'text-top' ),
-       'img_middle'              => array( '1', 'μέσο', 'middle' ),
-       'img_bottom'              => array( '1', 'κάτω', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'κάτω-από-το-κείμενο', 'text-bottom' ),
-       'img_link'                => array( '1', 'σύνδεσμος=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'εναλλ.=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'ΕΣΩΤ:', 'INT:' ),
-       'sitename'                => array( '1', 'ΙΣΤΟΧΩΡΟΣ', 'SITENAME' ),
-       'ns'                      => array( '0', 'ΧΟ:', 'NS:' ),
-       'localurl'                => array( '0', 'ΤΟΠΙΚΟURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ΤΟΠΙΚΟURLΚ:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'ΕΞΥΠΗΡΕΤΗΤΗΣ', 'SERVER' ),
-       'servername'              => array( '0', 'ΟΝΟΜΑΕΞΥΠΗΡΕΤΗΤΗ', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ΔΙΑΔΡΟΜΗΠΡΟΓΡΑΜΜΑΤΟΣ', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'ΓΡΑΜΜΑΤΙΚΗ:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ΦΥΛΟ:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__ΧΩΡΙΣΜΕΤΑΤΡΟΠΗΤΙΤΛΟΥ__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__ΧΩΡΙΣΜΕΤΑΤΡΟΠΗΠΕΡΙΧΟΜΕΝΟΥ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'ΤΡΕΧΟΥΣΑΕΒΔΟΜΑΔΑ', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑΕΒΔΟΜΑΔΑΣ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'ΤΟΠΙΚΗΕΒΔΟΜΑΔΑ', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ΤΟΠΙΚΗΜΕΡΑΕΒΔΟΜΑΔΑΣ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'ΚΩΔΙΚΟΣΑΛΛΑΓΗΣ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ΜΕΡΑΑΛΛΑΓΗΣ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ΜΕΡΑΑΛΛΑΓΗΣ2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'ΜΗΝΑΣΑΛΛΑΓΗΣ', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ΕΤΟΣΑΛΛΑΓΗΣ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'ΧΡΟΝΟΣΗΜΑΝΣΗΑΛΛΑΓΗΣ', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'ΠΛΗΘΥΝΤΙΚΟΣ:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'ΠΛΗΡΕΣURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'ΠΛΗΡΕΣURLΚ:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'ΠΡΩΤΟΠΕΖΟ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ΠΡΩΤΟΚΕΦΑΛΑΙΟ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'ΠΕΖΑ:', 'LC:' ),
-       'uc'                      => array( '0', 'ΚΕΦΑΛΑΙΑ:', 'UC:' ),
-       'raw'                     => array( '0', 'ΓΥΜΝΑ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ΔΕΙΞΕΤΙΤΛΟ', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'Γ', 'R' ),
-       'newsectionlink'          => array( '1', '__ΔΕΣΜΟΣΝΕΑΣΕΝΟΤΗΤΑΣ__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'ΤΡΕΧΟΥΣΑΕΚΔΟΣΗ', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ΚΩΔΙΚΟΠΟΙΗΣΗURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ΚΩΔΙΚΟΠΟΙΗΣΗΑΓΚΥΡΑΣ', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'ΤΡΕΧΟΥΣΑΧΡΟΝΟΣΗΜΑΝΣΗ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'ΤΟΠΙΚΗΧΡΟΝΟΣΗΜΑΝΣΗ', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'ΚΩΔΙΚΟΣΦΟΡΑΣ', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#ΓΛΩΣΣΑ:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'ΓΛΩΣΣΑΠΕΡΙΕΧΟΜΕΝΟΥ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'ΣΕΛΙΔΕΣΣΤΗΝΠΕΡΙΟΧΗΟΝΟΜΑΤΩΝ:', 'ΣΕΛΙΔΕΣΣΤΗΝΠΟ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ΑΡΙΘΜΟΣΔΙΑΧΕΙΡΙΣΤΩΝ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ΜΟΡΦΟΠΟΙΗΣΗΑΡΙΘΜΟΥ', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ΑΡΙΣΤΕΡΟΠΑΡΑΓΕΜΙΣΜΑ', 'PADLEFT' ),
-       'padright'                => array( '0', 'ΔΕΞΙΠΑΡΑΓΕΜΙΣΜΑ', 'PADRIGHT' ),
-       'special'                 => array( '0', 'λειτουργία', 'special' ),
-       'defaultsort'             => array( '1', 'ΠΡΟΚΑΘΟΡΙΣΜΕΝΗΤΑΞΙΝΟΜΗΣΗ:', 'ΚΛΕΙΔΙΠΡΟΚΑΘΟΡΙΣΜΕΝΗΣΤΑΞΙΝΟΜΗΣΗΣ:', 'ΠΡΟΚΑΘΟΡΙΣΜΕΝΗΤΑΞΙΝΟΜΗΣΗΚΑΤΗΓΟΡΙΑΣ:', 'ΠΡΟΚΤΑΞ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ΔΙΑΔΡΟΜΗΑΡΧΕΙΟΥ:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'ετικέτα', 'tag' ),
-       'hiddencat'               => array( '1', '__ΚΡΥΦΗΚΑΤΗΓΟΡΙΑ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'ΣΕΛΙΔΕΣΣΤΗΝΚΑΤΗΓΟΡΙΑ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'ΜΕΓΕΘΟΣΣΕΛΙΔΑΣ', 'PAGESIZE' ),
-       'index'                   => array( '1', '__ΕΥΡΕΤΗΡΙΟ__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__ΧΩΡΙΣΕΥΡΕΤΗΡΙΟ__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'ΟΜΑΔΑΑΡΙΘΜΗΣΗΣ', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__ΣΤΑΤΙΚΗΑΝΑΚΑΤΕΥΘΥΝΣΗ__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'ΕΠΙΠΕΔΟΠΡΟΣΤΑΣΙΑΣ', 'PROTECTIONLEVEL' ),
+       'redirect'                  => array( '0', '#ΑΝΑΚΑΤΕΥΘΥΝΣΗ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__ΧΩΡΙΣΠΠ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__ΧΩΡΙΣΠΙΝΑΚΟΘΗΚΗ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ΜΕΠΠ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ΠΠ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__ΧΩΡΙΣΕΠΕΞΕΝΟΤ__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__ΧΩΡΙΣΚΕΦΑΛΙΔΑ__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣ1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣΟΝΟΜΑ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣΓΕΝΙΚΗ', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ΤΡΕΧΩΝΜΗΝΑΣΣΥΝΤ', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑ2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑΟΝΟΜΑ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ΤΡΕΧΟΝΕΤΟΣ', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ΤΡΕΧΩΝΧΡΟΝΟΣ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ΤΡΕΧΟΥΣΑΩΡΑ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣ', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣ1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣΟΝΟΜΑ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣΓΕΝΙΚΗ', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ΤΟΠΙΚΟΣΜΗΝΑΣΣΥΝΤ', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ΤΟΠΙΚΗΜΕΡΑ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ΤΟΠΙΚΗΜΕΡΑ2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'ΤΟΠΙΚΗΜΕΡΑΟΝΟΜΑ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ΤΟΠΙΚΟΕΤΟΣ', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ΤΟΠΙΚΟΣΧΡΟΝΟΣ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ΤΟΠΙΚΗΩΡΑ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ΑΡΙΘΜΟΣΣΕΛΙΔΩΝ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ΑΡΙΘΜΟΣΑΡΘΡΩΝ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ΑΡΙΘΜΟΣΑΡΧΕΙΩΝ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ΑΡΙΘΜΟΣΧΡΗΣΤΩΝ', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'ΕΝΕΡΓΟΙΧΡΗΣΤΕΣ', 'ΑΡΙΘΜΟΣΕΝΕΡΓΩΝΧΡΗΣΤΩΝ', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'ΑΡΙΘΜΟΣΕΠΕΞΕΡΓΑΣΙΩΝ', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'ΑΡΙΘΜΟΣΕΜΦΑΝΙΣΕΩΝ', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΚ', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ΠΕΡΙΟΧΗ', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ΠΕΡΙΟΧΗΚ', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩΝ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩΝΚ', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ΠΕΡΙΟΧΗΘΕΜΑΤΩΝ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ΠΕΡΙΟΧΗΘΕΜΑΤΩΝΚ', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ΠΛΗΡΕΣΟΝΟΜΑΣΕΛΙΔΑΣ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ΠΛΗΡΕΣΟΝΟΜΑΣΕΛΙΔΑΣΚ', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ΟΝΟΜΑΥΠΟΣΕΛΙΔΑΣ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ΟΝΟΜΑΥΠΟΣΕΛΙΔΑΣΚ', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'ΒΑΣΗΟΝΟΜΑΤΟΣΣΕΛΙΔΑΣ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'ΒΑΣΗΟΝΟΜΑΤΟΣΣΕΛΙΔΑΣΚ', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΣΥΖΗΤΗΣΕΩΝ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΣΥΖΗΤΗΣΕΩΝΚ', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΘΕΜΑΤΟΣ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'ΟΝΟΜΑΣΕΛΙΔΑΣΘΕΜΑΤΟΣΚ', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'ΚΕΙΜΕΝΟ:', 'MSG:' ),
+       'subst'                     => array( '0', 'ΑΛΛΑΓΗ:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'ΑΠΛΟΚΕΙΜΕΝΟ:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'μικρογραφία', 'μινιατούρα', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'μικρογραφία=$1', 'μινιατούρα=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'δεξιά', 'right' ),
+       'img_left'                  => array( '1', 'αριστερά', 'left' ),
+       'img_none'                  => array( '1', 'καθόλου', 'none' ),
+       'img_width'                 => array( '1', '$1εσ', '$1px' ),
+       'img_center'                => array( '1', 'κέντρο', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'με-πλαίσιο', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'χωρίς-πλαίσιο', 'frameless' ),
+       'img_page'                  => array( '1', 'σελίδα=$1', 'σελίδα $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'κατακόρυφα', 'κατακόρυφα=$1', 'κατακόρυφα $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'πλαίσιο', 'border' ),
+       'img_baseline'              => array( '1', 'γραμμήβάσης', 'baseline' ),
+       'img_sub'                   => array( '1', 'δείκτης', 'sub' ),
+       'img_super'                 => array( '1', 'εκθέτης', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'άνω', 'top' ),
+       'img_text_top'              => array( '1', 'πάνω-από-το-κείμενο', 'text-top' ),
+       'img_middle'                => array( '1', 'μέσο', 'middle' ),
+       'img_bottom'                => array( '1', 'κάτω', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'κάτω-από-το-κείμενο', 'text-bottom' ),
+       'img_link'                  => array( '1', 'σύνδεσμος=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'εναλλ.=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'ΕΣΩΤ:', 'INT:' ),
+       'sitename'                  => array( '1', 'ΙΣΤΟΧΩΡΟΣ', 'SITENAME' ),
+       'ns'                        => array( '0', 'ΧΟ:', 'NS:' ),
+       'localurl'                  => array( '0', 'ΤΟΠΙΚΟURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ΤΟΠΙΚΟURLΚ:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'ΕΞΥΠΗΡΕΤΗΤΗΣ', 'SERVER' ),
+       'servername'                => array( '0', 'ΟΝΟΜΑΕΞΥΠΗΡΕΤΗΤΗ', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ΔΙΑΔΡΟΜΗΠΡΟΓΡΑΜΜΑΤΟΣ', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'ΓΡΑΜΜΑΤΙΚΗ:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ΦΥΛΟ:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__ΧΩΡΙΣΜΕΤΑΤΡΟΠΗΤΙΤΛΟΥ__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__ΧΩΡΙΣΜΕΤΑΤΡΟΠΗΠΕΡΙΧΟΜΕΝΟΥ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'ΤΡΕΧΟΥΣΑΕΒΔΟΜΑΔΑ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑΕΒΔΟΜΑΔΑΣ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'ΤΟΠΙΚΗΕΒΔΟΜΑΔΑ', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ΤΟΠΙΚΗΜΕΡΑΕΒΔΟΜΑΔΑΣ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'ΚΩΔΙΚΟΣΑΛΛΑΓΗΣ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ΜΕΡΑΑΛΛΑΓΗΣ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ΜΕΡΑΑΛΛΑΓΗΣ2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'ΜΗΝΑΣΑΛΛΑΓΗΣ', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ΕΤΟΣΑΛΛΑΓΗΣ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'ΧΡΟΝΟΣΗΜΑΝΣΗΑΛΛΑΓΗΣ', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'ΠΛΗΘΥΝΤΙΚΟΣ:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'ΠΛΗΡΕΣURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ΠΛΗΡΕΣURLΚ:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'ΠΡΩΤΟΠΕΖΟ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ΠΡΩΤΟΚΕΦΑΛΑΙΟ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'ΠΕΖΑ:', 'LC:' ),
+       'uc'                        => array( '0', 'ΚΕΦΑΛΑΙΑ:', 'UC:' ),
+       'raw'                       => array( '0', 'ΓΥΜΝΑ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ΔΕΙΞΕΤΙΤΛΟ', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'Γ', 'R' ),
+       'newsectionlink'            => array( '1', '__ΔΕΣΜΟΣΝΕΑΣΕΝΟΤΗΤΑΣ__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'ΤΡΕΧΟΥΣΑΕΚΔΟΣΗ', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ΚΩΔΙΚΟΠΟΙΗΣΗURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ΚΩΔΙΚΟΠΟΙΗΣΗΑΓΚΥΡΑΣ', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'ΤΡΕΧΟΥΣΑΧΡΟΝΟΣΗΜΑΝΣΗ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'ΤΟΠΙΚΗΧΡΟΝΟΣΗΜΑΝΣΗ', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'ΚΩΔΙΚΟΣΦΟΡΑΣ', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#ΓΛΩΣΣΑ:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'ΓΛΩΣΣΑΠΕΡΙΕΧΟΜΕΝΟΥ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'ΣΕΛΙΔΕΣΣΤΗΝΠΕΡΙΟΧΗΟΝΟΜΑΤΩΝ:', 'ΣΕΛΙΔΕΣΣΤΗΝΠΟ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ΑΡΙΘΜΟΣΔΙΑΧΕΙΡΙΣΤΩΝ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ΜΟΡΦΟΠΟΙΗΣΗΑΡΙΘΜΟΥ', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ΑΡΙΣΤΕΡΟΠΑΡΑΓΕΜΙΣΜΑ', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ΔΕΞΙΠΑΡΑΓΕΜΙΣΜΑ', 'PADRIGHT' ),
+       'special'                   => array( '0', 'λειτουργία', 'special' ),
+       'defaultsort'               => array( '1', 'ΠΡΟΚΑΘΟΡΙΣΜΕΝΗΤΑΞΙΝΟΜΗΣΗ:', 'ΚΛΕΙΔΙΠΡΟΚΑΘΟΡΙΣΜΕΝΗΣΤΑΞΙΝΟΜΗΣΗΣ:', 'ΠΡΟΚΑΘΟΡΙΣΜΕΝΗΤΑΞΙΝΟΜΗΣΗΚΑΤΗΓΟΡΙΑΣ:', 'ΠΡΟΚΤΑΞ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ΔΙΑΔΡΟΜΗΑΡΧΕΙΟΥ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'ετικέτα', 'tag' ),
+       'hiddencat'                 => array( '1', '__ΚΡΥΦΗΚΑΤΗΓΟΡΙΑ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'ΣΕΛΙΔΕΣΣΤΗΝΚΑΤΗΓΟΡΙΑ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'ΜΕΓΕΘΟΣΣΕΛΙΔΑΣ', 'PAGESIZE' ),
+       'index'                     => array( '1', '__ΕΥΡΕΤΗΡΙΟ__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__ΧΩΡΙΣΕΥΡΕΤΗΡΙΟ__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'ΟΜΑΔΑΑΡΙΘΜΗΣΗΣ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__ΣΤΑΤΙΚΗΑΝΑΚΑΤΕΥΘΥΝΣΗ__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'ΕΠΙΠΕΔΟΠΡΟΣΤΑΣΙΑΣ', 'PROTECTIONLEVEL' ),
 );
 
 $messages = array(
@@ -366,10 +367,10 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Ενεργοποίηση επεξεργασίας τμήματος με δεξί κλικ στους τίτλους των τμημάτων (JavaScript)',
 'tog-showtoc' => 'Εμφάνιση πίνακα περιεχομένων (για σελίδες με περισσότερες από τρεις κεφαλίδες)',
 'tog-rememberpassword' => 'Διατήρηση της σύνδεσης μου σε αυτόν τον browser (για ένα μέγιστο $1 {{PLURAL:$1|ημέρας|ημερών}})',
-'tog-watchcreations' => 'Πρόσθεσε τις σελίδες που δημιουργώ στη λίστα παρακολούθησής μου',
-'tog-watchdefault' => 'ΠÏ\81οÏ\83θήκη Ï\84Ï\89ν Ï\83ελίδÏ\89ν Ï\80οÏ\85 ÎµÏ\80εξεÏ\81γάζεÏ\83Ï\84ε στη λίστα παρακολούθησης.',
+'tog-watchcreations' => 'Πρόσθεσε τις σελίδες που δημιουργώ και αρχεία που ανεβάζω στη λίστα παρακολούθησής μου',
+'tog-watchdefault' => 'ΠÏ\81οÏ\83θήκη Ï\84Ï\89ν Ï\83ελίδÏ\89ν Ï\80οÏ\85 ÎµÏ\80εξεÏ\81γάζομαι στη λίστα παρακολούθησης.',
 'tog-watchmoves' => 'Πρόσθεσε τις σελίδες που μετακινώ στη λίστα παρακολούθησής μου',
-'tog-watchdeletion' => 'Πρόσθεσε τις σελίδες που διαγράφω στη λίστα παρακολούθησής μου',
+'tog-watchdeletion' => 'Πρόσθεσε τις σελίδες και αρχεία που διαγράφω στη λίστα παρακολούθησής μου',
 'tog-minordefault' => 'Προκαθορίστε να χαρακτηρίζονται όλες οι αλλαγές "μικρής κλίμακας".',
 'tog-previewontop' => 'Εμφάνιση προεπισκόπησης πριν από το πλαίσιο επεξεργασίας και όχι μετά',
 'tog-previewonfirst' => 'Εμφάνιση προεπισκόπησης κατά την πρώτη επεξεργασία',
@@ -392,7 +393,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Απόκρυψη επεξεργασιών συνδεδεμένων χρηστών από τη λίστα παρακολούθησης',
 'tog-watchlisthideanons' => 'Απόκρυψη επεξεργασιών ανωνύμων χρηστών από τη λίστα παρακολούθησης',
 'tog-watchlisthidepatrolled' => 'Απόκρυψη ελεγμένων επεξεργασιών από τη λίστα παρακολούθησης',
-'tog-nolangconversion' => 'Απενεργοποίησε τη μετατροπή μεταβλητών',
 'tog-ccmeonemails' => 'Στείλε μου αντίγραφα των μηνυμάτων ηλεκτρονικού ταχυδρομείου που στέλνω σε άλλους χρήστες',
 'tog-diffonly' => 'Μην εμφανίζεις το περιεχόμενο της σελίδας κάτω από τις διαφορές των εκδόσεων',
 'tog-showhiddencats' => 'Εμφάνιση κρυμμένων κατηγοριών',
@@ -860,7 +860,7 @@ $2',
 'passwordreset' => 'Κωδικός επαναφοράς',
 'passwordreset-text' => 'Συμπληρώστε αυτή τη φόρμα για να λάβετε ένα  e-mail υπενθύμιση του λογαριασμού σας.',
 'passwordreset-legend' => 'Επαναφορά κωδικού πρόσβασης',
-'passwordreset-disabled' => 'Î\97 Î±Î½Î¬ÎºÏ\84ηÏ\83η  ÎºÏ\89δικοÏ\8d Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î­Ï\87οÏ\85ν Î±Ï\80ενεÏ\81γοÏ\80οιηθεί Ï\83ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î²Î¯ÎºÎ¹',
+'passwordreset-disabled' => 'Î\97 ÎµÏ\80αναÏ\86οÏ\81ά ÎºÏ\89δικοÏ\8d Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î­Ï\87ει Î±Ï\80ενεÏ\81γοÏ\80οιηθεί Ï\83ε Î±Ï\85Ï\84Ï\8c Ï\84ο wiki',
 'passwordreset-pretext' => '{{PLURAL:$1||Εισάγεται ένα από τα στοιχεία δεδομένων που βλέπετε παρακάτω}}',
 'passwordreset-username' => 'Όνομα χρήστη:',
 'passwordreset-domain' => 'Domain:',
@@ -894,7 +894,7 @@ $2
 'changeemail-oldemail' => 'Τρέχουσα διεύθυνση ηλεκτρονικού ταχυδρομείου:',
 'changeemail-newemail' => 'Νέα διεύθυνση ηλεκτρονικού ταχυδρομείου:',
 'changeemail-none' => '(κανένα)',
-'changeemail-submit' => 'Î\91λλαγή Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Î¼Î·Î½Ï\8dμαÏ\84οÏ\82',
+'changeemail-submit' => 'Î\91λλαγή Î´Î¹ÎµÏ\8dθÏ\85νÏ\83ηÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85',
 'changeemail-cancel' => 'Ακύρωση',
 
 # Edit page toolbar
@@ -969,7 +969,7 @@ $2
 'nosuchsectiontitle' => 'Δεν υπάρχει τέτοιο τμήμα',
 'nosuchsectiontext' => 'Προσπαθήσατε να επεξεργαστείτε μια ενότητα που δεν υπάρχει. Μπορεί να έχει μετακινηθεί ή διαγραφεί, ενώ βλέπατε τη σελίδα.',
 'loginreqtitle' => 'Απαιτείται η σύνδεση του χρήστη.',
-'loginreqlink' => 'είσοδος',
+'loginreqlink' => 'συνδεθείτε',
 'loginreqpagetext' => 'Πρέπει να $1 για να δείτε άλλες σελίδες.',
 'accmailtitle' => 'Ο κωδικός έχει σταλεί.',
 'accmailtext' => "Ο τυχαία παρηγμένος κωδικός για τον/την [[User talk:$1|$1]] έχει σταλεί στο $2.
@@ -1127,7 +1127,7 @@ $2
 'currentrevisionlink' => 'εμφάνιση της τρέχουσας αναθεώρησης',
 'cur' => 'τρέχουσα',
 'next' => 'επόμενη',
-'last' => 'Ï\84ελεÏ\85Ï\84αία',
+'last' => 'Ï\80Ï\81οηγοÏ\8dμενη',
 'page_first' => 'πρώτη',
 'page_last' => 'τελευταία',
 'histlegend' => "Σύγκριση διαφορών: σημάνετε τα κουτάκια επιλογής των εκδόσεων που θέλετε να συγκρίνετε και πατήστε το πλήκτρο enter ή κάντε κλικ στο κουμπί στην κάτω μεριά.<br />
@@ -1276,7 +1276,7 @@ $1",
 'mergelogpagetext' => 'Παρακάτω είναι μια λίστα με τις πιο πρόσφατες συγχωνεύσεις ιστορικού μιας σελίδας σε άλλο.',
 
 # Diffs
-'history-title' => 'Ιστορικό εκδόσεων για τη σελίδα "$1"',
+'history-title' => '"$1": Ιστορικό εκδόσεων',
 'difference-title' => 'Διαφορά μεταξύ των αναθεωρήσεων του "$1"',
 'difference-title-multipage' => 'Διαφορά μεταξύ των σελίδων "$1" και "$2"',
 'difference-multipage' => '(Διαφορές μεταξύ των σελίδων)',
@@ -1305,8 +1305,8 @@ $1",
 'shown-title' => 'Εμφάνιση $1 {{PLURAL:$1|αποτελέσματος|αποτελεσμάτων}} ανά σελίδα',
 'viewprevnext' => 'Εμφάνιση ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Επιλογές αναζήτησης',
-'searchmenu-exists' => "'''Υπάρχει μια σελίδα που ονομάζεται \"[[:\$1]]\" σε αυτό το βίκι'''",
-'searchmenu-new' => "'''Δημιουργήστε τη σελίδα \"[[:\$1]]\" σε αυτό το βίκι!'''",
+'searchmenu-exists' => "'''Υπάρχει μια σελίδα που ονομάζεται \"[[:\$1]]\" σε αυτό το wiki'''",
+'searchmenu-new' => "'''Δημιουργήστε τη σελίδα \"[[:\$1]]\" σε αυτό το wiki!'''",
 'searchhelp-url' => 'Help:Περιεχόμενα',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Πλοηγηθείτε σε σελίδες με αυτό το πρόθεμα]]',
 'searchprofile-articles' => 'Σελίδες περιεχομένων',
@@ -1626,7 +1626,7 @@ $1",
 'action-unwatchedpages' => 'να εμφανίσετε τον κατάλογο μη παρακολουθούμενων σελίδων',
 'action-mergehistory' => 'να συγχωνεύσετε το ιστορικό αυτής της σελίδας',
 'action-userrights' => 'να επεξεργαστείτε όλα τα δικαιώματα χρηστών',
-'action-userrights-interwiki' => 'να ÎµÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Ï\84α Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ηÏ\83Ï\84Ï\8eν Ï\83ε Î¬Î»Î»Î± Î²Î¯ÎºÎ¹',
+'action-userrights-interwiki' => 'εÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Ï\84α Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ηÏ\83Ï\84Ï\8eν Ï\83ε Î¬Î»Î»Î± wiki',
 'action-siteadmin' => 'να κλειδώσετε ή ξεκλειδώσετε τη βάση δεδομένων',
 'action-sendemail' => 'αποστείλετε μηνύματα ηλεκτρονικού ταχυδρομείου',
 
@@ -1693,9 +1693,9 @@ $1",
 'uploadtext' => "Μπορείτε να χρησιμοποιήσετε την παρακάτω φόρμα για να επιφορτώσετε αρχεία. Για να δείτε ήδη επιφορτωμένα αρχεία, πηγαίνετε στη [[Special:FileList|λίστα επιφορτωμένων αρχείων]] ή στο [[Special:Log/upload|ιστορικό επιφορτώσεων]]. Οι διαγραφές έχουν καταγραφεί στη σελίδα [[Special:Log/delete|αρχείο διαγραφών]].
 
 Για να συμπεριληφθεί μια εικόνα σε μια σελίδα, χρησιμοποιήστε συνδέσμους της μορφής:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' (χρήση της πλήρους εκδοχής του αρχείου)
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' (χρήση μίας εκδοχής 200 pixel σε πλάτος σε ένα κουτάκι στο αριστερό περιθώριο με περιγραφή 'alt text')
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' (άμεση σύνδεση με το αρχείο χωρίς εμφάνιση του ίδιου του αρχείου)",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' (χρήση της πλήρους εκδοχής του αρχείου)
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' (χρήση μίας εκδοχής 200 pixel σε πλάτος σε ένα κουτάκι στο αριστερό περιθώριο με περιγραφή 'alt text')
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' (άμεση σύνδεση με το αρχείο χωρίς εμφάνιση του ίδιου του αρχείου)",
 'upload-permitted' => 'Επιτρεπτοί τύποι αρχείων: $1.',
 'upload-preferred' => 'Τύποι αρχείων που προτιμούνται: $1.',
 'upload-prohibited' => 'Απαγορευμένοι τύποι αρχείου: $1.',
@@ -1738,20 +1738,20 @@ $1",
 'largefileserver' => 'Το μέγεθος αυτού του αρχείο είναι μεγαλύτερο από το μέγιστο μέγεθος που ο εξυπηρετητής είναι ρυθμισμένος να επιτρέπει.',
 'emptyfile' => 'Το αρχείο που φορτώσατε φαίνεται να είναι κενό. Αυτό μπορεί να οφείλεται σε λάθος πληκτρολόγησης του ονόματος του αρχείου. Παρακαλούμε ελέγξτε εαν αυτό είναι πραγματικά το αρχείο που θέλετε να φορτώσετε.',
 'windows-nonascii-filename' => 'Αυτό το wiki δεν υποστηρίζει ονόματα αρχείων με ειδικούς χαρακτήρες.',
-'fileexists' => "Υπάρχει ήδη αρχείο με αυτό το όνομα -παρακαλούμε ελέγξτε στο '''<tt>[[:$1]]</tt>'''.
-Είστε βέβαιος (-η) πως θέλετε να αλλάξετε το όνομα του αρχείου; [[$1|thumb]]",
-'filepageexists' => "Η σελίδα περιγραφής για αυτό το αρχείο δημιουργήθηκε ήδη στο '''<tt>[[:$1]]</tt>''', αλλά κανένα αρχείο με αυτό το όνομα δεν υπάρχει αυτή τη στιγμή.
+'fileexists' => 'Υπάρχει ήδη αρχείο με αυτό το όνομα -παρακαλούμε ελέγξτε στο <strong>[[:$1]]</strong>.
+Είστε βέβαιος (-η) πως θέλετε να αλλάξετε το όνομα του αρχείου; [[$1|thumb]]',
+'filepageexists' => 'Η σελίδα περιγραφής για αυτό το αρχείο δημιουργήθηκε ήδη στο <strong>[[:$1]]</strong>, αλλά κανένα αρχείο με αυτό το όνομα δεν υπάρχει αυτή τη στιγμή.
 Η περιγραφἠ που θα εισάγετε δεν θα εμφανιστεί στη σελίδα περιγραφής.
 Για να εμφανιστεί η περιγραφή σας εκεί, θα πρέπει να την επεξεργαστείτε χειροκίνητα.
-[[$1|thumb]]",
-'fileexists-extension' => "Ένα αρχείο με παρόμοιο όνομα υπάρχει: [[$2|thumb]]
-* Όνομα του προς επιφόρτωση αρχείου: '''<tt>[[:$1]]</tt>'''
-* Όνομα υπάρχοντος αρχείου: '''<tt>[[:$2]]</tt>'''
-Παρακαλώ διαλέξτε ένα διαφορετικό όνομα.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Ένα αρχείο με παρόμοιο όνομα υπάρχει: [[$2|thumb]]
+* Όνομα του προς επιφόρτωση αρχείου: <strong>[[:$1]]</strong>
+* Όνομα υπάρχοντος αρχείου: <strong>[[:$2]]</strong>
+Παρακαλώ διαλέξτε ένα διαφορετικό όνομα.',
 'fileexists-thumbnail-yes' => "Το αρχείο φαίνεται ότι είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''. [[$1|thumb]]
-Παρακαλώ ελέγξτε το αρχείο '''<tt>[[:$1]]</tt>'''.
+Παρακαλώ ελέγξτε το αρχείο <strong>[[:$1]]</strong>.
 Αν το ελεγμένο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να επιφορτώσετε μια επιπλέον μικρογραφία.",
-'file-thumbnail-no' => "Το όνομα αρχείου αρχίζει με '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Το όνομα αρχείου αρχίζει με <strong>$1</strong>.
 Φαίνεται πως είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''.
 Αν έχετε αυτή την εικόνα σε πλήρη ανάλυση, επιφορτώστε τη, αλλιώς αλλάξτε παρακαλώ το όνομα του αρχείου.",
 'fileexists-forbidden' => 'Ένα αρχείο με αυτό το όνομα υπάρχει ήδη˙ εάν ακόμη θέλετε να επιφορτώσωτε αυτό το αρχείο παρακαλώ πηγαίνετε πίσω και επιφορτώστε το υπό ένα νέο όνομα. [[File:$1|thumb|center|$1]]',
@@ -1844,6 +1844,10 @@ $1',
 'backend-fail-internal' => 'Παρουσιάστηκε ένα άγνωστο σφάλμα στην αποθήκευση παρασκηνίου "$1".',
 'backend-fail-contenttype' => 'Δεν μπόρεσε να προσδιοριστεί ο τύπος περιεχομένου του αρχείου για την αποθήκευση σε "$1".',
 
+# Lock manager
+'lockmanager-notlocked' => 'Δεν μπορέσατε να  ξεκλειδώσετε το " $1 ". Δεν είναι κλειδωμένο.',
+'lockmanager-fail-closelock' => 'Δεν μπόρεσε να κλείσει το κλειδωμένο αρχείο για " $1 ".',
+
 # ZipDirectoryReader
 'zip-file-open-error' => 'Παρουσιάστηκε σφάλμα κατά το άνοιγμα του αρχείου για ZIP ελέγχους.',
 'zip-wrong-format' => 'Το καθορισμένο αρχείο δεν ήταν  αρχείο ZIP.',
@@ -1990,7 +1994,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'Αναζήτηση MIME',
-'mimesearch-summary' => 'Αυτή η σελίδα ενεργοποιεί το φιλτράρισμα αρχείων σύμφωνα με τον τύπο MIME τους. Είσοδος: contenttype/subtype, π.χ. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Αυτή η σελίδα ενεργοποιεί το φιλτράρισμα αρχείων σύμφωνα με τον τύπο MIME τους. Είσοδος: contenttype/subtype, π.χ. <code>image/jpeg</code>.',
 'mimetype' => 'Τύπος MIME:',
 'download' => 'λήψη',
 
@@ -2036,9 +2040,9 @@ $1',
 
 'disambiguations' => 'Σελίδες με συνδέσμους σε σελίδες αποσαφήνισης',
 'disambiguationspage' => 'Project:Σύνδεσμοι_προς_τις_σελίδες_αποσαφήνισης',
-'disambiguations-text' => "Οι ακόλουθες σελίδες συνδέουν σε μια '''σελίδα αποσαφήνισης'''.
-Αντιθέτως πρέπει να συνδέουν στο κατάλληλο θέμα.<br />
\9cια Ï\83ελίδα Î¼ÎµÏ\84αÏ\87ειÏ\81ίζεται ως σελίδα αποσαφήνισης αν χρησιμοποιεί ένα πρότυπο το οποίο συνδέεται από το [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Οι ακόλουθες σελίδες οδηγούν σε μια '''σελίδα αποσαφήνισης'''.
+Αντιθέτως θα έπρεπε να κατευθύνουν στο κατάλληλο θέμα.<br />
\9cια Ï\83ελίδα Î±Î½Ï\84ιμεÏ\84Ï\89Ï\80ίζεται ως σελίδα αποσαφήνισης αν χρησιμοποιεί ένα πρότυπο το οποίο συνδέεται από το [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Διπλές ανακατευθύνσεις',
 'doubleredirectstext' => 'Αυτή η σελίδα συγκαταλέγει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. Κάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη σελίδα ανακατεύθυνσης, όπως επίσης και την πρώτη αράδα του κειμένου στη δεύτερη σελίδα ανακατεύθυνσης η οποία και είναι, κανονικά, ο πραγματικός προορισμός της ανακατεύθυνσης -εκεί δηλαδή όπου θα έπρεπε να είχατε οδηγηθεί από την αρχή. Τα <del>διεγραμμένα</del> λήμματα έχουν επιλυθεί.',
@@ -2187,7 +2191,7 @@ $1',
 'linksearch-ok' => 'Αναζήτηση',
 'linksearch-text' => 'Χαρακτήρες όπως "*.wikipedia.org" μπορούν να χρησιμοποιηθούν. 
 Χρειάζεται τουλάχιστον ένα domain ανώτατου επιπέδου, για παράδειγμα "*.org".<br />
-Υποστηριζόμενα πρωτόκολλα: <tt> $1 </tt> (μην προσθέτετε οποιαδήποτε από αυτές στην αναζήτησή σας).',
+Υποστηριζόμενα πρωτόκολλα: <code> $1 </code> (μην προσθέτετε οποιαδήποτε από αυτές στην αναζήτησή σας).',
 'linksearch-line' => 'Η $1 συνδεδεμένη από την $2',
 'linksearch-error' => 'Λέξεις-μπαλαντέρ μπορεί να εμφανιστούν μόνο στην αρχή τού ονόματος ιστοτόπου (hostname).',
 
@@ -2249,7 +2253,7 @@ $1',
 'emailtarget' => 'Εισαγάγετε το όνομα χρήστη του παραλήπτη',
 'emailusername' => 'Όνομα χρήστη:',
 'emailusernamesubmit' => 'Υποβολή',
-'email-legend' => 'Αποστολή μηνύματος ηλ. ταχυδρομείου σε έναν άλλο χρήστη του βίκι {{SITENAME}}',
+'email-legend' => 'Αποστολή μηνύματος ηλ. ταχυδρομείου σε έναν άλλο χρήστη του wiki {{SITENAME}}',
 'emailfrom' => 'Από:',
 'emailto' => 'Προς:',
 'emailsubject' => 'Θέμα:',
@@ -2809,7 +2813,7 @@ $1',
 
 # Export
 'export' => 'Εξαγωγή σελίδων',
-'exporttext' => 'Μπορείτε να κάνετε εξαγωγή του κειμένου και του ιστορικού επεξεργασίας μιας συγκεκριμένης σελίδας (ή περισσοτέρων σελίδων που έχουν ομαδοποιηθεί με χρήση XML). Μπορείτε να κάνετε εισαγωγή αυτού σε ένα άλλο βίκι χρησιμοποιώντας MediaWiki μέσω τής [[Special:Import|σελίδας εισαγωγής]].
+'exporttext' => 'Μπορείτε να κάνετε εξαγωγή του κειμένου και του ιστορικού επεξεργασίας μιας συγκεκριμένης σελίδας (ή περισσοτέρων σελίδων που έχουν ομαδοποιηθεί με χρήση XML). Μπορείτε να κάνετε εισαγωγή αυτού σε ένα άλλο wiki χρησιμοποιώντας MediaWiki μέσω τής [[Special:Import|σελίδας εισαγωγής]].
 
 Για την εξαγωγή ολόκληρων άρθρων, συμπληρώστε τους τίτλους στο παρακάτω πλαίσιο (ένα τίτλο σε κάθε σειρά) και επιλέξτε ανάμεσα από το να εξαγάγετε μόνο την τρέχουσα έκδοση (με τις πληροφορίες της πιο πρόσφατης επεξεργασίας) ή εναλλακτικά και τις παλιότερες εκδόσεις (με τις αντίστοιχες καταγραφές στη σελιδα του ιστορικού).
 
@@ -2872,7 +2876,7 @@ $1',
 'import-interwiki-namespace' => 'Προορισμός στην περιοχή ονομάτων:',
 'import-upload-filename' => 'Όνομα αρχείου:',
 'import-comment' => 'Σχόλιο:',
-'importtext' => 'Παρακαλούμε εξάγετε το αρχείο από το πηγαίο βίκι (χρησιμοποιώντας το [[Special:Export|εργαλείο εξαγωγής]]), αποθηκεύστε το στον υπολογιστή σας και μεταφορτώστε το από εκεί.',
+'importtext' => 'Παρακαλούμε εξάγετε το αρχείο από το πηγαίο wiki (χρησιμοποιώντας το [[Special:Export|εργαλείο εξαγωγής]]), αποθηκεύστε το στον υπολογιστή σας και μεταφορτώστε το από εκεί.',
 'importstart' => 'Η εισαγωγή των σελίδων είναι σε εξέλιξη...',
 'import-revision-count' => '$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}}',
 'importnopages' => 'Δεν υπάρχουν σελίδες για εισαγωγή.',
@@ -2898,6 +2902,7 @@ $1',
 'import-invalid-interwiki' => 'Δεν είναι δυνατή η εισαγωγή από το καθορισμένο wiki.',
 'import-error-edit' => 'Η σελίδα "$1" δεν εισήχθηκε επειδή δεν επιτρέπεται να το επεξεργαστείτε.',
 'import-error-create' => 'Η σελίδα "$1" δεν εισήχθηκε επειδή δεν επιτρέπεται να τη δημιουργήσετε.',
+'import-error-interwiki' => 'Η σελίδα " $1 " δεν έχει εισαχθεί, επειδή το όνομα της δεσμευμένο για εξωτερική σύνδεση (interwiki).',
 
 # Import log
 'importlogpage' => 'Αρχείο καταγραφής εισαγωγών',
@@ -3040,15 +3045,10 @@ $1',
 # Info page
 'pageinfo-title' => 'Πληροφορίες για "$1"',
 'pageinfo-header-edits' => 'Επεξεργασίες',
-'pageinfo-header-watchlist' => 'Λίστα παρακολούθησης',
-'pageinfo-header-views' => 'Προβολές',
-'pageinfo-subjectpage' => 'Σελίδα',
-'pageinfo-talkpage' => 'Σελίδα συζήτησης',
+'pageinfo-views' => 'Αριθμός προβολών',
 'pageinfo-watchers' => 'Αριθμός παρατηρητών',
 'pageinfo-edits' => 'Αριθμός επεξεργασιών',
 'pageinfo-authors' => 'Αριθμός ξεχωριστών συγγραφέων',
-'pageinfo-views' => 'Αριθμός προβολών',
-'pageinfo-viewsperedit' => 'Προβολές ανά επεξεργασία',
 
 # Skin names
 'skinname-standard' => 'Κλασσικό',
@@ -3724,7 +3724,7 @@ $5
 'version-hook-subscribedby' => 'Υπογεγραμμένο από',
 'version-version' => '(Έκδοση $1)',
 'version-license' => 'Άδεια χρήσης',
-'version-poweredby-credits' => "Αυτό το βίκι λειτουργεί χάρις στο '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
+'version-poweredby-credits' => "Αυτό το wiki λειτουργεί με στο '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
 'version-poweredby-others' => 'άλλοι',
 'version-license-info' => "Το MediaWiki είναι ελεύθερο λογισμικό. Μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό τους όρους της άδειας GNU General Public License όπως αυτή εκδόθηκε από το Free Software Foundation· είτε της δεύτερης έκδοσης της άδειας, είτε (κατ' επιλογή σας) οποιασδήποτε επόμενης έκδοσης.
 
@@ -3812,7 +3812,7 @@ $5
 'compare-revision-not-exists' => 'Η αναθεώρηση που καθορίσατε δεν υπάρχει.',
 
 # Database error messages
-'dberr-header' => 'Αυτό το βίκι έχει ένα πρόβλημα',
+'dberr-header' => 'Αυτό το wiki έχει ένα πρόβλημα',
 'dberr-problems' => 'Λυπούμαστε! Αυτός ο ιστότοπος αντιμετωπίζει τεχνικές δυσκολίες.',
 'dberr-again' => 'Δοκιμάστε να περιμενένετε λίγα λεπτά και να ανανεώσετε.',
 'dberr-info' => '(Δεν μπορεί να επικοινωνήσει με τον εξυπηρετητή της βάσης δεδομένων: $1)',
@@ -3840,7 +3840,9 @@ $5
 'logentry-delete-delete' => 'Ο/η $1 διέγραψε τη σελίδα $3',
 'logentry-delete-restore' => 'Ο/η $1 αποκατέστησε τη σελίδα $3',
 'logentry-delete-event' => '$1 άλλαξε την ορατότητα σε  {{PLURAL:$5|ένα γεγονός καταγραφής|$5 log events}} στο  $3: $4',
+'logentry-delete-revision-legacy' => '$1 άλλαξε την  ορατότητα των αναθεωρήσεων στη σελίδα $3',
 'logentry-suppress-delete' => 'Ο $1 διέγραψε τη σελίδα $3',
+'logentry-suppress-revision-legacy' => '$1 κρυφά άλλαξαν την  ορατότητα των αναθεωρήσεων στη σελίδα $3',
 'revdelete-content-hid' => 'το περιεχόμενο αποκρύφθηκε',
 'revdelete-summary-hid' => 'Η σύνοψη επεξεργασίας αποκρύφθηκε',
 'revdelete-uname-hid' => 'Το όνομα χρήστη αποκρύφθηκε',
@@ -3891,6 +3893,7 @@ $5
 'api-error-file-too-large' => 'Το αρχείο που υποβάλλατε ήταν πολύ μεγάλο.',
 'api-error-filename-tooshort' => 'Το όνομα αρχείου είναι πολύ μικρό.',
 'api-error-filetype-banned' => 'Αυτός ο τύπος αρχείου έχει απαγορευτεί.',
+'api-error-filetype-banned-type' => '$1 δεν είναι {{PLURAL:$4|επιτρεπόμενος τύπος αρχείου|επιτρεπόμενοι τύποι αρχείων}}.  {{PLURAL:$3|Επιτρεπόμενος τύπος αρχείων|Επιτρεπόμενοι τύποι αρχείων}} είναι $2.',
 'api-error-filetype-missing' => 'Το αρχείο δεν έχει επέκταση.',
 'api-error-hookaborted' => 'Η τροποποίηση που επιχειρήσατε να κάνετε ματαιώθηκε από ένα άγκιστρο της επέκτασης.',
 'api-error-http' => 'Εσωτερικό σφάλμα: δεν είναι δυνατή η σύνδεση με το διακομιστή.',
index b7275f8..515a433 100644 (file)
@@ -200,161 +200,167 @@ $bookstoreList = array(
  * This array can be modified at runtime with the LanguageGetMagic hook
  */
 $magicWords = array(
-#   ID                                 CASE  SYNONYMS
-       'redirect'               => array( 0,    '#REDIRECT'              ),
-       'notoc'                  => array( 0,    '__NOTOC__'              ),
-       'nogallery'              => array( 0,    '__NOGALLERY__'          ),
-       'forcetoc'               => array( 0,    '__FORCETOC__'           ),
-       'toc'                    => array( 0,    '__TOC__'                ),
-       'noeditsection'          => array( 0,    '__NOEDITSECTION__'      ),
-       'noheader'               => array( 0,    '__NOHEADER__'           ),
-       'currentmonth'           => array( 1,    'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'          => array( 1,    'CURRENTMONTH1'          ),
-       'currentmonthname'       => array( 1,    'CURRENTMONTHNAME'       ),
-       'currentmonthnamegen'    => array( 1,    'CURRENTMONTHNAMEGEN'    ),
-       'currentmonthabbrev'     => array( 1,    'CURRENTMONTHABBREV'     ),
-       'currentday'             => array( 1,    'CURRENTDAY'             ),
-       'currentday2'            => array( 1,    'CURRENTDAY2'            ),
-       'currentdayname'         => array( 1,    'CURRENTDAYNAME'         ),
-       'currentyear'            => array( 1,    'CURRENTYEAR'            ),
-       'currenttime'            => array( 1,    'CURRENTTIME'            ),
-       'currenthour'            => array( 1,    'CURRENTHOUR'            ),
-       'localmonth'             => array( 1,    'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'            => array( 1,    'LOCALMONTH1'             ),
-       'localmonthname'         => array( 1,    'LOCALMONTHNAME'         ),
-       'localmonthnamegen'      => array( 1,    'LOCALMONTHNAMEGEN'      ),
-       'localmonthabbrev'       => array( 1,    'LOCALMONTHABBREV'       ),
-       'localday'               => array( 1,    'LOCALDAY'               ),
-       'localday2'              => array( 1,    'LOCALDAY2'              ),
-       'localdayname'           => array( 1,    'LOCALDAYNAME'           ),
-       'localyear'              => array( 1,    'LOCALYEAR'              ),
-       'localtime'              => array( 1,    'LOCALTIME'              ),
-       'localhour'              => array( 1,    'LOCALHOUR'              ),
-       'numberofpages'          => array( 1,    'NUMBEROFPAGES'          ),
-       'numberofarticles'       => array( 1,    'NUMBEROFARTICLES'       ),
-       'numberoffiles'          => array( 1,    'NUMBEROFFILES'          ),
-       'numberofusers'          => array( 1,    'NUMBEROFUSERS'          ),
-       'numberofactiveusers'    => array( 1,    'NUMBEROFACTIVEUSERS'    ),
-       'numberofedits'          => array( 1,    'NUMBEROFEDITS'          ),
-       'numberofviews'          => array( 1,    'NUMBEROFVIEWS'          ),
-       'pagename'               => array( 1,    'PAGENAME'               ),
-       'pagenamee'              => array( 1,    'PAGENAMEE'              ),
-       'namespace'              => array( 1,    'NAMESPACE'              ),
-       'namespacee'             => array( 1,    'NAMESPACEE'             ),
-       'namespacenumber'        => array( 1,    'NAMESPACENUMBER'        ),
-       'talkspace'              => array( 1,    'TALKSPACE'              ),
-       'talkspacee'             => array( 1,    'TALKSPACEE'              ),
-       'subjectspace'           => array( 1,    'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'          => array( 1,    'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'           => array( 1,    'FULLPAGENAME'           ),
-       'fullpagenamee'          => array( 1,    'FULLPAGENAMEE'          ),
-       'subpagename'            => array( 1,    'SUBPAGENAME'            ),
-       'subpagenamee'           => array( 1,    'SUBPAGENAMEE'           ),
-       'basepagename'           => array( 1,    'BASEPAGENAME'           ),
-       'basepagenamee'          => array( 1,    'BASEPAGENAMEE'          ),
-       'talkpagename'           => array( 1,    'TALKPAGENAME'           ),
-       'talkpagenamee'          => array( 1,    'TALKPAGENAMEE'          ),
-       'subjectpagename'        => array( 1,    'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'       => array( 1,    'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                    => array( 0,    'MSG:'                   ),
-       'subst'                  => array( 0,    'SUBST:'                 ),
-       'safesubst'              => array( 0,    'SAFESUBST:'             ),
-       'msgnw'                  => array( 0,    'MSGNW:'                 ),
-       'img_thumbnail'          => array( 1,    'thumbnail', 'thumb'     ),
-       'img_manualthumb'        => array( 1,    'thumbnail=$1', 'thumb=$1' ),
-       'img_right'              => array( 1,    'right'                  ),
-       'img_left'               => array( 1,    'left'                   ),
-       'img_none'               => array( 1,    'none'                   ),
-       'img_width'              => array( 1,    '$1px'                   ),
-       'img_center'             => array( 1,    'center', 'centre'       ),
-       'img_framed'             => array( 1,    'framed', 'enframed', 'frame' ),
-       'img_frameless'          => array( 1,    'frameless'              ),
-       'img_page'               => array( 1,    'page=$1', 'page $1'     ),
-       'img_upright'            => array( 1,    'upright', 'upright=$1', 'upright $1'  ),
-       'img_border'             => array( 1,    'border'                 ),
-       'img_baseline'           => array( 1,    'baseline'               ),
-       'img_sub'                => array( 1,    'sub'                    ),
-       'img_super'              => array( 1,    'super', 'sup'           ),
-       'img_top'                => array( 1,    'top'                    ),
-       'img_text_top'           => array( 1,    'text-top'               ),
-       'img_middle'             => array( 1,    'middle'                 ),
-       'img_bottom'             => array( 1,    'bottom'                 ),
-       'img_text_bottom'        => array( 1,    'text-bottom'            ),
-       'img_link'               => array( 1,    'link=$1'                ),
-       'img_alt'                => array( 1,    'alt=$1'                 ),
-       'int'                    => array( 0,    'INT:'                   ),
-       'sitename'               => array( 1,    'SITENAME'               ),
-       'ns'                     => array( 0,    'NS:'                    ),
-       'nse'                    => array( 0,    'NSE:'                   ),
-       'localurl'               => array( 0,    'LOCALURL:'              ),
-       'localurle'              => array( 0,    'LOCALURLE:'             ),
-       'articlepath'            => array( 0,    'ARTICLEPATH'            ),
-       'server'                 => array( 0,    'SERVER'                 ),
-       'servername'             => array( 0,    'SERVERNAME'             ),
-       'scriptpath'             => array( 0,    'SCRIPTPATH'             ),
-       'stylepath'              => array( 0,    'STYLEPATH'              ),
-       'grammar'                => array( 0,    'GRAMMAR:'               ),
-       'gender'                 => array( 0,    'GENDER:'                ),
-       'notitleconvert'         => array( 0,    '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'       => array( 0,    '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'            => array( 1,    'CURRENTWEEK'            ),
-       'currentdow'             => array( 1,    'CURRENTDOW'             ),
-       'localweek'              => array( 1,    'LOCALWEEK'              ),
-       'localdow'               => array( 1,    'LOCALDOW'               ),
-       'revisionid'             => array( 1,    'REVISIONID'             ),
-       'revisionday'            => array( 1,    'REVISIONDAY'            ),
-       'revisionday2'           => array( 1,    'REVISIONDAY2'           ),
-       'revisionmonth'          => array( 1,    'REVISIONMONTH'          ),
-       'revisionmonth1'         => array( 1,    'REVISIONMONTH1'         ),
-       'revisionyear'           => array( 1,    'REVISIONYEAR'           ),
-       'revisiontimestamp'      => array( 1,    'REVISIONTIMESTAMP'      ),
-       'revisionuser'           => array( 1,    'REVISIONUSER'           ),
-       'plural'                 => array( 0,    'PLURAL:'                ),
-       'fullurl'                => array( 0,    'FULLURL:'               ),
-       'fullurle'               => array( 0,    'FULLURLE:'              ),
-       'canonicalurl'           => array( 0,    'CANONICALURL:'          ),
-       'canonicalurle'          => array( 0,    'CANONICALURLE:'         ),
-       'lcfirst'                => array( 0,    'LCFIRST:'               ),
-       'ucfirst'                => array( 0,    'UCFIRST:'               ),
-       'lc'                     => array( 0,    'LC:'                    ),
-       'uc'                     => array( 0,    'UC:'                    ),
-       'raw'                    => array( 0,    'RAW:'                   ),
-       'displaytitle'           => array( 1,    'DISPLAYTITLE'           ),
-       'rawsuffix'              => array( 1,    'R'                      ),
-       'newsectionlink'         => array( 1,    '__NEWSECTIONLINK__'     ),
-       'nonewsectionlink'       => array( 1,    '__NONEWSECTIONLINK__'   ),
-       'currentversion'         => array( 1,    'CURRENTVERSION'         ),
-       'urlencode'              => array( 0,    'URLENCODE:'             ),
-       'anchorencode'           => array( 0,    'ANCHORENCODE'           ),
-       'currenttimestamp'       => array( 1,    'CURRENTTIMESTAMP'       ),
-       'localtimestamp'         => array( 1,    'LOCALTIMESTAMP'         ),
-       'directionmark'          => array( 1,    'DIRECTIONMARK', 'DIRMARK' ),
-       'language'               => array( 0,    '#LANGUAGE:'             ),
-       'contentlanguage'        => array( 1,    'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'       => array( 1,    'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'         => array( 1,    'NUMBEROFADMINS'         ),
-       'formatnum'              => array( 0,    'FORMATNUM'              ),
-       'padleft'                => array( 0,    'PADLEFT'                ),
-       'padright'               => array( 0,    'PADRIGHT'               ),
-       'special'                => array( 0,    'special',               ),
-       'speciale'               => array( 0,    'speciale',              ),
-       'defaultsort'            => array( 1,    'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'               => array( 0,    'FILEPATH:'              ),
-       'tag'                    => array( 0,    'tag'                    ),
-       'hiddencat'              => array( 1,    '__HIDDENCAT__'          ),
-       'pagesincategory'        => array( 1,    'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'               => array( 1,    'PAGESIZE'               ),
-       'index'                  => array( 1,    '__INDEX__'              ),
-       'noindex'                => array( 1,    '__NOINDEX__'            ),
-       'numberingroup'          => array( 1,    'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'         => array( 1,    '__STATICREDIRECT__'     ),
-       'protectionlevel'        => array( 1,    'PROTECTIONLEVEL'        ),
-       'formatdate'             => array( 0,    'formatdate', 'dateformat' ),
-       'url_path'               => array( 0,    'PATH' ),
-       'url_wiki'               => array( 0,    'WIKI' ),
-       'url_query'              => array( 0,    'QUERY' ),
-       'defaultsort_noerror'    => array( 0,    'noerror' ),
-       'defaultsort_noreplace'  => array( 0,    'noreplace' ),
+#   ID                                  CASE  SYNONYMS
+       'redirect'                => array( 0,    '#REDIRECT' ),
+       'notoc'                   => array( 0,    '__NOTOC__' ),
+       'nogallery'               => array( 0,    '__NOGALLERY__' ),
+       'forcetoc'                => array( 0,    '__FORCETOC__' ),
+       'toc'                     => array( 0,    '__TOC__' ),
+       'noeditsection'           => array( 0,    '__NOEDITSECTION__' ),
+       'noheader'                => array( 0,    '__NOHEADER__' ),
+       'currentmonth'            => array( 1,    'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'           => array( 1,    'CURRENTMONTH1' ),
+       'currentmonthname'        => array( 1,    'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'     => array( 1,    'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'      => array( 1,    'CURRENTMONTHABBREV' ),
+       'currentday'              => array( 1,    'CURRENTDAY' ),
+       'currentday2'             => array( 1,    'CURRENTDAY2' ),
+       'currentdayname'          => array( 1,    'CURRENTDAYNAME' ),
+       'currentyear'             => array( 1,    'CURRENTYEAR' ),
+       'currenttime'             => array( 1,    'CURRENTTIME' ),
+       'currenthour'             => array( 1,    'CURRENTHOUR' ),
+       'localmonth'              => array( 1,    'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'             => array( 1,    'LOCALMONTH1' ),
+       'localmonthname'          => array( 1,    'LOCALMONTHNAME' ),
+       'localmonthnamegen'       => array( 1,    'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'        => array( 1,    'LOCALMONTHABBREV' ),
+       'localday'                => array( 1,    'LOCALDAY' ),
+       'localday2'               => array( 1,    'LOCALDAY2' ),
+       'localdayname'            => array( 1,    'LOCALDAYNAME' ),
+       'localyear'               => array( 1,    'LOCALYEAR' ),
+       'localtime'               => array( 1,    'LOCALTIME' ),
+       'localhour'               => array( 1,    'LOCALHOUR' ),
+       'numberofpages'           => array( 1,    'NUMBEROFPAGES' ),
+       'numberofarticles'        => array( 1,    'NUMBEROFARTICLES' ),
+       'numberoffiles'           => array( 1,    'NUMBEROFFILES' ),
+       'numberofusers'           => array( 1,    'NUMBEROFUSERS' ),
+       'numberofactiveusers'     => array( 1,    'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'           => array( 1,    'NUMBEROFEDITS' ),
+       'numberofviews'           => array( 1,    'NUMBEROFVIEWS' ),
+       'pagename'                => array( 1,    'PAGENAME' ),
+       'pagenamee'               => array( 1,    'PAGENAMEE' ),
+       'namespace'               => array( 1,    'NAMESPACE' ),
+       'namespacee'              => array( 1,    'NAMESPACEE' ),
+       'namespacenumber'         => array( 1,    'NAMESPACENUMBER' ),
+       'talkspace'               => array( 1,    'TALKSPACE' ),
+       'talkspacee'              => array( 1,    'TALKSPACEE' ),
+       'subjectspace'            => array( 1,    'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'           => array( 1,    'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'            => array( 1,    'FULLPAGENAME' ),
+       'fullpagenamee'           => array( 1,    'FULLPAGENAMEE' ),
+       'subpagename'             => array( 1,    'SUBPAGENAME' ),
+       'subpagenamee'            => array( 1,    'SUBPAGENAMEE' ),
+       'basepagename'            => array( 1,    'BASEPAGENAME' ),
+       'basepagenamee'           => array( 1,    'BASEPAGENAMEE' ),
+       'talkpagename'            => array( 1,    'TALKPAGENAME' ),
+       'talkpagenamee'           => array( 1,    'TALKPAGENAMEE' ),
+       'subjectpagename'         => array( 1,    'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'        => array( 1,    'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                     => array( 0,    'MSG:' ),
+       'subst'                   => array( 0,    'SUBST:' ),
+       'safesubst'               => array( 0,    'SAFESUBST:' ),
+       'msgnw'                   => array( 0,    'MSGNW:' ),
+       'img_thumbnail'           => array( 1,    'thumbnail', 'thumb' ),
+       'img_manualthumb'         => array( 1,    'thumbnail=$1', 'thumb=$1' ),
+       'img_right'               => array( 1,    'right' ),
+       'img_left'                => array( 1,    'left' ),
+       'img_none'                => array( 1,    'none' ),
+       'img_width'               => array( 1,    '$1px' ),
+       'img_center'              => array( 1,    'center', 'centre' ),
+       'img_framed'              => array( 1,    'framed', 'enframed', 'frame' ),
+       'img_frameless'           => array( 1,    'frameless' ),
+       'img_page'                => array( 1,    'page=$1', 'page $1' ),
+       'img_upright'             => array( 1,    'upright', 'upright=$1', 'upright $1' ),
+       'img_border'              => array( 1,    'border' ),
+       'img_baseline'            => array( 1,    'baseline' ),
+       'img_sub'                 => array( 1,    'sub' ),
+       'img_super'               => array( 1,    'super', 'sup' ),
+       'img_top'                 => array( 1,    'top' ),
+       'img_text_top'            => array( 1,    'text-top' ),
+       'img_middle'              => array( 1,    'middle' ),
+       'img_bottom'              => array( 1,    'bottom' ),
+       'img_text_bottom'         => array( 1,    'text-bottom' ),
+       'img_link'                => array( 1,    'link=$1' ),
+       'img_alt'                 => array( 1,    'alt=$1' ),
+       'img_class'               => array( 1,    'class=$1' ),
+       'int'                     => array( 0,    'INT:' ),
+       'sitename'                => array( 1,    'SITENAME' ),
+       'ns'                      => array( 0,    'NS:' ),
+       'nse'                     => array( 0,    'NSE:' ),
+       'localurl'                => array( 0,    'LOCALURL:' ),
+       'localurle'               => array( 0,    'LOCALURLE:' ),
+       'articlepath'             => array( 0,    'ARTICLEPATH' ),
+       'pageid'                  => array( 0,    'PAGEID' ),
+       'server'                  => array( 0,    'SERVER' ),
+       'servername'              => array( 0,    'SERVERNAME' ),
+       'scriptpath'              => array( 0,    'SCRIPTPATH' ),
+       'stylepath'               => array( 0,    'STYLEPATH' ),
+       'grammar'                 => array( 0,    'GRAMMAR:' ),
+       'gender'                  => array( 0,    'GENDER:' ),
+       'notitleconvert'          => array( 0,    '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'        => array( 0,    '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'             => array( 1,    'CURRENTWEEK' ),
+       'currentdow'              => array( 1,    'CURRENTDOW' ),
+       'localweek'               => array( 1,    'LOCALWEEK' ),
+       'localdow'                => array( 1,    'LOCALDOW' ),
+       'revisionid'              => array( 1,    'REVISIONID' ),
+       'revisionday'             => array( 1,    'REVISIONDAY' ),
+       'revisionday2'            => array( 1,    'REVISIONDAY2' ),
+       'revisionmonth'           => array( 1,    'REVISIONMONTH' ),
+       'revisionmonth1'          => array( 1,    'REVISIONMONTH1' ),
+       'revisionyear'            => array( 1,    'REVISIONYEAR' ),
+       'revisiontimestamp'       => array( 1,    'REVISIONTIMESTAMP' ),
+       'revisionuser'            => array( 1,    'REVISIONUSER' ),
+       'plural'                  => array( 0,    'PLURAL:' ),
+       'fullurl'                 => array( 0,    'FULLURL:' ),
+       'fullurle'                => array( 0,    'FULLURLE:' ),
+       'canonicalurl'            => array( 0,    'CANONICALURL:' ),
+       'canonicalurle'           => array( 0,    'CANONICALURLE:' ),
+       'lcfirst'                 => array( 0,    'LCFIRST:' ),
+       'ucfirst'                 => array( 0,    'UCFIRST:' ),
+       'lc'                      => array( 0,    'LC:' ),
+       'uc'                      => array( 0,    'UC:' ),
+       'raw'                     => array( 0,    'RAW:' ),
+       'displaytitle'            => array( 1,    'DISPLAYTITLE' ),
+       'rawsuffix'               => array( 1,    'R' ),
+       'newsectionlink'          => array( 1,    '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'        => array( 1,    '__NONEWSECTIONLINK__' ),
+       'currentversion'          => array( 1,    'CURRENTVERSION' ),
+       'urlencode'               => array( 0,    'URLENCODE:' ),
+       'anchorencode'            => array( 0,    'ANCHORENCODE' ),
+       'currenttimestamp'        => array( 1,    'CURRENTTIMESTAMP' ),
+       'localtimestamp'          => array( 1,    'LOCALTIMESTAMP' ),
+       'directionmark'           => array( 1,    'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                => array( 0,    '#LANGUAGE:' ),
+       'contentlanguage'         => array( 1,    'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'        => array( 1,    'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'          => array( 1,    'NUMBEROFADMINS' ),
+       'formatnum'               => array( 0,    'FORMATNUM' ),
+       'padleft'                 => array( 0,    'PADLEFT' ),
+       'padright'                => array( 0,    'PADRIGHT' ),
+       'special'                 => array( 0,    'special' ),
+       'speciale'                => array( 0,    'speciale' ),
+       'defaultsort'             => array( 1,    'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                => array( 0,    'FILEPATH:' ),
+       'tag'                     => array( 0,    'tag' ),
+       'hiddencat'               => array( 1,    '__HIDDENCAT__' ),
+       'pagesincategory'         => array( 1,    'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                => array( 1,    'PAGESIZE' ),
+       'index'                   => array( 1,    '__INDEX__' ),
+       'noindex'                 => array( 1,    '__NOINDEX__' ),
+       'numberingroup'           => array( 1,    'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'          => array( 1,    '__STATICREDIRECT__' ),
+       'protectionlevel'         => array( 1,    'PROTECTIONLEVEL' ),
+       'formatdate'              => array( 0,    'formatdate', 'dateformat' ),
+       'url_path'                => array( 0,    'PATH' ),
+       'url_wiki'                => array( 0,    'WIKI' ),
+       'url_query'               => array( 0,    'QUERY' ),
+       'defaultsort_noerror'     => array( 0,    'noerror' ),
+       'defaultsort_noreplace'   => array( 0,    'noreplace' ),
+       'pagesincategory_all'     => array( 0,    'all' ),
+       'pagesincategory_pages'   => array( 0,    'pages' ),
+       'pagesincategory_subcats' => array( 0,    'subcats' ),
+       'pagesincategory_files'   => array( 0,    'files' ),
 );
 
 /**
@@ -412,6 +418,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIMESearch' ),
        'Mostcategories'            => array( 'MostCategories' ),
        'Mostimages'                => array( 'MostLinkedFiles', 'MostFiles', 'MostImages' ),
+       'Mostinterwikis'            => array( 'MostInterwikis' ),
        'Mostlinked'                => array( 'MostLinkedPages', 'MostLinked' ),
        'Mostlinkedcategories'      => array( 'MostLinkedCategories', 'MostUsedCategories' ),
        'Mostlinkedtemplates'       => array( 'MostLinkedTemplates', 'MostUsedTemplates' ),
@@ -636,7 +643,7 @@ XHTML id names.
 'tog-hidepatrolled'           => 'Hide patrolled edits in recent changes',
 'tog-newpageshidepatrolled'   => 'Hide patrolled pages from new page list',
 'tog-extendwatchlist'         => 'Expand watchlist to show all changes, not just the most recent',
-'tog-usenewrc'                => 'Use enhanced recent changes (requires JavaScript)',
+'tog-usenewrc'                => 'Group changes by page in recent changes and watchlist (requires JavaScript)',
 'tog-numberheadings'          => 'Auto-number headings',
 'tog-showtoolbar'             => 'Show edit toolbar (requires JavaScript)',
 'tog-editondblclick'          => 'Edit pages on double click (requires JavaScript)',
@@ -644,17 +651,17 @@ XHTML id names.
 'tog-editsectiononrightclick' => 'Enable section editing by right clicking on section titles (requires JavaScript)',
 'tog-showtoc'                 => 'Show table of contents (for pages with more than 3 headings)',
 'tog-rememberpassword'        => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations'          => 'Add pages I create to my watchlist',
-'tog-watchdefault'            => 'Add pages I edit to my watchlist',
-'tog-watchmoves'              => 'Add pages I move to my watchlist',
-'tog-watchdeletion'           => 'Add pages I delete to my watchlist',
+'tog-watchcreations'          => 'Add pages I create and files I upload to my watchlist',
+'tog-watchdefault'            => 'Add pages and files I edit to my watchlist',
+'tog-watchmoves'              => 'Add pages and files I move to my watchlist',
+'tog-watchdeletion'           => 'Add pages and files I delete to my watchlist',
 'tog-minordefault'            => 'Mark all edits minor by default',
 'tog-previewontop'            => 'Show preview before edit box',
 'tog-previewonfirst'          => 'Show preview on first edit',
 'tog-nocache'                 => 'Disable browser page caching',
-'tog-enotifwatchlistpages'    => 'E-mail me when a page on my watchlist is changed',
+'tog-enotifwatchlistpages'    => 'E-mail me when a page or file on my watchlist is changed',
 'tog-enotifusertalkpages'     => 'E-mail me when my user talk page is changed',
-'tog-enotifminoredits'        => 'E-mail me also for minor edits of pages',
+'tog-enotifminoredits'        => 'E-mail me also for minor edits of pages and files',
 'tog-enotifrevealaddr'        => 'Reveal my e-mail address in notification e-mails',
 'tog-shownumberswatching'     => 'Show the number of watching users',
 'tog-oldsig'                  => 'Existing signature:',
@@ -670,7 +677,6 @@ XHTML id names.
 'tog-watchlisthideliu'        => 'Hide edits by logged in users from the watchlist',
 'tog-watchlisthideanons'      => 'Hide edits by anonymous users from the watchlist',
 'tog-watchlisthidepatrolled'  => 'Hide patrolled edits from the watchlist',
-'tog-nolangconversion'        => 'Disable variants conversion', # only translate this message to other languages if you have to change it
 'tog-ccmeonemails'            => 'Send me copies of e-mails I send to other users',
 'tog-diffonly'                => 'Do not show page content below diffs',
 'tog-showhiddencats'          => 'Show hidden categories',
@@ -759,7 +765,7 @@ XHTML id names.
 'index-category'                 => 'Indexed pages',
 'noindex-category'               => 'Noindexed pages',
 'broken-file-category'           => 'Pages with broken file links',
-'categoryviewer-pagedlinks'      => '($1) ($2)',
+'categoryviewer-pagedlinks'      => '($1) ($2)', # only translate this message to other languages if you have to change it
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', # only translate this message to other languages if you have to change it
 
@@ -906,6 +912,10 @@ See [[Special:Version|version page]].',
 'youhavenewmessages'           => 'You have $1 ($2).',
 'newmessageslink'              => 'new messages',
 'newmessagesdifflink'          => 'last change',
+'youhavenewmessagesfromusers'  => 'You have $1 from {{PLURAL:$3|another user|$3 users}} ($2).',
+'youhavenewmessagesmanyusers'  => 'You have $1 from many users ($2).',
+'newmessageslinkplural'        => '{{PLURAL:$1|a new message|new messages}}', # don't rely on the value of $1, it's 1 for singular and 2 for "more than one"
+'newmessagesdifflinkplural'    => 'last {{PLURAL:$1|change|changes}}', # don't rely on the value of $1, it's 1 for singular and 2 for "more than one"
 'youhavenewmessagesmulti'      => 'You have new messages on $1',
 'newtalkseparator'             => ',&#32;', # do not translate or duplicate this message to other languages
 'editsection'                  => 'edit',
@@ -963,86 +973,90 @@ This might also indicate a bug in the software used by {{SITENAME}}.',
 A list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error'                => 'Error',
-'databaseerror'        => 'Database error',
-'dberrortext'          => 'A database query syntax error has occurred.
+'error'                         => 'Error',
+'databaseerror'                 => 'Database error',
+'dberrortext'                   => 'A database query syntax error has occurred.
 This may indicate a bug in the software.
 The last attempted database query was:
-<blockquote><tt>$1</tt></blockquote>
-from within function "<tt>$2</tt>".
-Database returned error "<tt>$3: $4</tt>".',
-'dberrortextcl'        => 'A database query syntax error has occurred.
+<blockquote><code>$1</code></blockquote>
+from within function "<code>$2</code>".
+Database returned error "<samp>$3: $4</samp>".',
+'dberrortextcl'                 => 'A database query syntax error has occurred.
 The last attempted database query was:
 "$1"
 from within function "$2".
 Database returned error "$3: $4"',
-'laggedslavemode'      => "'''Warning:''' Page may not contain recent updates.",
-'readonly'             => 'Database locked',
-'enterlockreason'      => 'Enter a reason for the lock, including an estimate of when the lock will be released',
-'readonlytext'         => 'The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.
+'laggedslavemode'               => "'''Warning:''' Page may not contain recent updates.",
+'readonly'                      => 'Database locked',
+'enterlockreason'               => 'Enter a reason for the lock, including an estimate of when the lock will be released',
+'readonlytext'                  => 'The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.
 
 The administrator who locked it offered this explanation: $1',
-'missing-article'      => 'The database did not find the text of a page that it should have found, named "$1" $2.
+'missing-article'               => 'The database did not find the text of a page that it should have found, named "$1" $2.
 
 This is usually caused by following an outdated diff or history link to a page that has been deleted.
 
 If this is not the case, you may have found a bug in the software.
 Please report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.',
-'missingarticle-rev'   => '(revision#: $1)',
-'missingarticle-diff'  => '(Diff: $1, $2)',
-'readonly_lag'         => 'The database has been automatically locked while the slave database servers catch up to the master',
-'internalerror'        => 'Internal error',
-'internalerror_info'   => 'Internal error: $1',
-'fileappenderrorread'  => 'Could not read "$1" during append.',
-'fileappenderror'      => 'Could not append "$1" to "$2".',
-'filecopyerror'        => 'Could not copy file "$1" to "$2".',
-'filerenameerror'      => 'Could not rename file "$1" to "$2".',
-'filedeleteerror'      => 'Could not delete file "$1".',
-'directorycreateerror' => 'Could not create directory "$1".',
-'filenotfound'         => 'Could not find file "$1".',
-'fileexistserror'      => 'Unable to write to file "$1": File exists.',
-'unexpected'           => 'Unexpected value: "$1"="$2".',
-'formerror'            => 'Error: Could not submit form.',
-'badarticleerror'      => 'This action cannot be performed on this page.',
-'cannotdelete'         => 'The page or file "$1" could not be deleted.
+'missingarticle-rev'            => '(revision#: $1)',
+'missingarticle-diff'           => '(Diff: $1, $2)',
+'readonly_lag'                  => 'The database has been automatically locked while the slave database servers catch up to the master',
+'internalerror'                 => 'Internal error',
+'internalerror_info'            => 'Internal error: $1',
+'fileappenderrorread'           => 'Could not read "$1" during append.',
+'fileappenderror'               => 'Could not append "$1" to "$2".',
+'filecopyerror'                 => 'Could not copy file "$1" to "$2".',
+'filerenameerror'               => 'Could not rename file "$1" to "$2".',
+'filedeleteerror'               => 'Could not delete file "$1".',
+'directorycreateerror'          => 'Could not create directory "$1".',
+'filenotfound'                  => 'Could not find file "$1".',
+'fileexistserror'               => 'Unable to write to file "$1": File exists.',
+'unexpected'                    => 'Unexpected value: "$1"="$2".',
+'formerror'                     => 'Error: Could not submit form.',
+'badarticleerror'               => 'This action cannot be performed on this page.',
+'cannotdelete'                  => 'The page or file "$1" could not be deleted.
 It may have already been deleted by someone else.',
-'cannotdelete-title'   => 'Cannot delete page "$1"',
-'badtitle'             => 'Bad title',
-'badtitletext'         => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
+'cannotdelete-title'            => 'Cannot delete page "$1"',
+'delete-hook-aborted'           => 'Deletion aborted by hook.
+It gave no explanation.',
+'badtitle'                      => 'Bad title',
+'badtitletext'                  => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
 It may contain one or more characters which cannot be used in titles.',
-'perfcached'           => 'The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts'         => 'The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
-'querypage-no-updates' => 'Updates for this page are currently disabled.
+'perfcached'                    => 'The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts'                  => 'The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'querypage-no-updates'          => 'Updates for this page are currently disabled.
 Data here will not presently be refreshed.',
-'wrong_wfQuery_params' => 'Incorrect parameters to wfQuery()<br />
+'wrong_wfQuery_params'          => 'Incorrect parameters to wfQuery()<br />
 Function: $1<br />
 Query: $2',
-'viewsource'           => 'View source',
-'viewsource-title'     => 'View source for $1',
-'actionthrottled'      => 'Action throttled',
-'actionthrottledtext'  => 'As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.
+'viewsource'                    => 'View source',
+'viewsource-title'              => 'View source for $1',
+'actionthrottled'               => 'Action throttled',
+'actionthrottledtext'           => 'As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.
 Please try again in a few minutes.',
-'protectedpagetext'    => 'This page has been protected to prevent editing.',
-'viewsourcetext'       => 'You can view and copy the source of this page:',
-'viewyourtext'         => "You can view and copy the source of '''your edits''' to this page:",
-'protectedinterface'   => 'This page provides interface text for the software, and is protected to prevent abuse.',
-'editinginterface'     => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
+'protectedpagetext'             => 'This page has been protected to prevent editing.',
+'viewsourcetext'                => 'You can view and copy the source of this page:',
+'viewyourtext'                  => "You can view and copy the source of '''your edits''' to this page:",
+'protectedinterface'            => 'This page provides interface text for the software, and is protected to prevent abuse.',
+'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'            => '(SQL query hidden)',
-'cascadeprotected'     => 'This page has been protected from editing, because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the "cascading" option turned on:
+'sqlhidden'                     => '(SQL query hidden)',
+'cascadeprotected'              => 'This page has been protected from editing, because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the "cascading" option turned on:
 $2',
-'namespaceprotected'   => "You do not have permission to edit pages in the '''$1''' namespace.",
-'customcssprotected'   => "You do not have permission to edit this CSS page, because it contains another user's personal settings.",
-'customjsprotected'    => "You do not have permission to edit this JavaScript page, because it contains another user's personal settings.",
-'ns-specialprotected'  => 'Special pages cannot be edited.',
-'titleprotected'       => 'This title has been protected from creation by [[User:$1|$1]].
+'namespaceprotected'            => "You do not have permission to edit pages in the '''$1''' namespace.",
+'customcssprotected'            => "You do not have permission to edit this CSS page, because it contains another user's personal settings.",
+'customjsprotected'             => "You do not have permission to edit this JavaScript page, because it contains another user's personal settings.",
+'ns-specialprotected'           => 'Special pages cannot be edited.',
+'titleprotected'                => 'This title has been protected from creation by [[User:$1|$1]].
 The reason given is "\'\'$2\'\'".',
-'filereadonlyerror'    => 'Unable to modify the file "$1" because the file repository "$2" is in read-only mode.
+'filereadonlyerror'             => 'Unable to modify the file "$1" because the file repository "$2" is in read-only mode.
 
 The administrator who locked it offered this explanation: "$3".',
 'invalidtitle-knownnamespace'   => 'Invalid title with namespace "$2" and text "$3"',
 'invalidtitle-unknownnamespace' => 'Invalid title with unknown namespace number $1 and text "$2"',
+'exception-nologin'             => 'Not logged in',
+'exception-nologin-text'        => 'This page or action requires you to be logged in on this wiki.',
 
 # Virus scanner
 'virus-badscanner'     => "Bad configuration: Unknown virus scanner: ''$1''",
@@ -1063,6 +1077,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'remembermypassword'         => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'securelogin-stick-https'    => 'Stay connected to HTTPS after login',
 'yourdomainname'             => 'Your domain:',
+'password-change-forbidden'  => 'You cannot change passwords on this wiki.',
 'externaldberror'            => 'There was either an authentication database error or you are not allowed to update your external account.',
 'login'                      => 'Log in',
 'nav-login-createaccount'    => 'Log in / create account',
@@ -1350,6 +1365,10 @@ or [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.',
 You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
 or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.',
 'noarticletextanon'                => '{{int:noarticletext}}', # do not translate or duplicate this message to other languages
+'missing-revision'                 => 'The revision #$1 of the page named "{{PAGENAME}}" does not exist.
+
+This is usually caused by following an outdated history link to a page that has been deleted.
+Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 'userpage-userdoesnotexist'        => 'User account "$1" is not registered.
 Please check if you want to create/edit this page.',
 'userpage-userdoesnotexist-view'   => 'User account "$1" is not registered.',
@@ -1359,7 +1378,6 @@ The latest block log entry is provided below for reference:',
 * '''Firefox / Safari:''' Hold ''Shift'' while clicking ''Reload'', or press either ''Ctrl-F5'' or ''Ctrl-R'' (''⌘-R'' on a Mac)
 * '''Google Chrome:''' Press ''Ctrl-Shift-R'' (''⌘-Shift-R'' on a Mac)
 * '''Internet Explorer:''' Hold ''Ctrl'' while clicking ''Refresh'', or press ''Ctrl-F5''
-* '''Konqueror:''' Click ''Reload'' or press ''F5''
 * '''Opera:''' Clear the cache in ''Tools → Preferences''",
 'usercssyoucanpreview'             => "'''Tip:''' Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
 'userjsyoucanpreview'              => "'''Tip:''' Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
@@ -1377,7 +1395,7 @@ Custom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css
 'note'                             => "'''Note:'''",
 'previewnote'                      => "'''Remember that this is only a preview.'''
 Your changes have not yet been saved!",
-'continue-editing'                 => "Continue editing",
+'continue-editing'                 => 'Continue editing',
 'previewconflict'                  => 'This preview reflects the text in the upper text editing area as it will appear if you choose to save.',
 'session_fail_preview'             => "'''Sorry! We could not process your edit due to a loss of session data.'''
 Please try again.
@@ -1417,6 +1435,7 @@ You are also promising us that you wrote this yourself, or copied it from a publ
 If you do not want your writing to be edited mercilessly, then do not submit it here.<br />
 You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).
 '''Do not submit copyrighted work without permission!'''",
+'editpage-head-copy-warn'          => '-', # do not translate or duplicate this message to other languages
 'editpage-tos-summary'             => '-', # do not translate or duplicate this message to other languages
 'longpage-hint'                    => '-', # do not translate or duplicate this message to other languages
 'longpageerror'                    => "'''Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''
@@ -1488,6 +1507,7 @@ These arguments have been omitted.",
 'expansion-depth-exceeded-warning'        => 'Page exceeded the expansion depth',
 'parser-unstrip-loop-warning'             => 'Unstrip loop detected',
 'parser-unstrip-recursion-limit'          => 'Unstrip recursion limit exceeded ($1)',
+'converter-manual-rule-error'             => 'Error detected in manual language conversion rule',
 
 # "Undo" feature
 'undo-success' => 'The edit can be undone.
@@ -1663,7 +1683,7 @@ Note that using the navigation links will reset this column.',
 'mergehistory-comment'             => 'Merged [[:$1]] into [[:$2]]: $3',
 'mergehistory-same-destination'    => 'Source and destination pages cannot be the same',
 'mergehistory-reason'              => 'Reason:',
-'mergehistory-revisionrow'         => '$1 ($2) $3 . . $4 $5 $6',
+'mergehistory-revisionrow'         => '$1 ($2) $3 . . $4 $5 $6', # only translate this message to other languages if you have to change it
 
 # Merge log
 'mergelog'           => 'Merge log',
@@ -1672,16 +1692,20 @@ Note that using the navigation links will reset this column.',
 'mergelogpagetext'   => 'Below is a list of the most recent merges of one page history into another.',
 
 # Diffs
-'history-title'              => 'Revision history of "$1"',
-'difference-title'           => 'Difference between revisions of "$1"',
-'difference-title-multipage' => 'Difference between pages "$1" and "$2"',
-'difference-multipage'       => '(Difference between pages)',
-'lineno'                     => 'Line $1:',
-'compareselectedversions'    => 'Compare selected revisions',
-'showhideselectedversions'   => 'Show/hide selected revisions',
-'editundo'                   => 'undo',
-'diff-multi'                 => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
-'diff-multi-manyusers'       => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)',
+'history-title'               => 'Revision history of "$1"',
+'difference-title'            => 'Difference between revisions of "$1"',
+'difference-title-multipage'  => 'Difference between pages "$1" and "$2"',
+'difference-multipage'        => '(Difference between pages)',
+'lineno'                      => 'Line $1:',
+'compareselectedversions'     => 'Compare selected revisions',
+'showhideselectedversions'    => 'Show/hide selected revisions',
+'editundo'                    => 'undo',
+'diff-multi'                  => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
+'diff-multi-manyusers'        => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)',
+'difference-missing-revision' => '{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.
+
+This is usually caused by following an outdated diff link to a page that has been deleted.
+Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 
 # Search results
 'search-summary'                   => '', # do not translate or duplicate this message to other languages
@@ -1980,6 +2004,7 @@ Your e-mail address is not revealed when other users contact you.',
 'right-writeapi'              => 'Use of the write API',
 'right-delete'                => 'Delete pages',
 'right-bigdelete'             => 'Delete pages with large histories',
+'right-deletelogentry'        => 'Delete and undelete specific log entries',
 'right-deleterevision'        => 'Delete and undelete specific revisions of pages',
 'right-deletedhistory'        => 'View deleted history entries, without their associated text',
 'right-deletedtext'           => 'View deleted text and changes between deleted revisions',
@@ -2130,9 +2155,9 @@ The deletion and move log for this page are provided here for convenience:",
 To view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].
 
 To include a file in a page, use a link in one of the following forms:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' to use the full version of the file
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' to use a 200 pixel wide rendition in a box in the left margin with 'alt text' as description
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' for directly linking to the file without displaying the file",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' to use the full version of the file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' to use a 200 pixel wide rendition in a box in the left margin with 'alt text' as description
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' for directly linking to the file without displaying the file",
 'upload-permitted'            => 'Permitted file types: $1.',
 'upload-preferred'            => 'Preferred file types: $1.',
 'upload-prohibited'           => 'Prohibited file types: $1.',
@@ -2171,7 +2196,7 @@ Permitted {{PLURAL:$3|file type is|file types are}} $2.',
 'hookaborted'                 => 'The modification you tried to make was aborted by an extension.',
 'illegal-filename'            => 'The filename is not allowed.',
 'overwrite'                   => 'Overwriting an existing file is not allowed.',
-'unknown-error'               => 'An unknown error occured.',
+'unknown-error'               => 'An unknown error occurred.',
 'tmp-create-error'            => 'Could not create temporary file.',
 'tmp-write-error'             => 'Error writing temporary file.',
 'large-file'                  => 'It is recommended that files are no larger than $1;
@@ -2181,21 +2206,21 @@ this file is $2.',
 This might be due to a typo in the filename.
 Please check whether you really want to upload this file.',
 'windows-nonascii-filename'   => 'This wiki does not support filenames with special characters.',
-'fileexists'                  => "A file with this name exists already, please check '''<tt>[[:$1]]</tt>''' if you are not sure if you want to change it.
+'fileexists'                  => "A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.
 [[$1|thumb]]",
-'filepageexists'              => "The description page for this file has already been created at '''<tt>[[:$1]]</tt>''', but no file with this name currently exists.
+'filepageexists'              => "The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.
 The summary you enter will not appear on the description page.
 To make your summary appear there, you will need to manually edit it.
 [[$1|thumb]]",
 'fileexists-extension'        => "A file with a similar name exists: [[$2|thumb]]
-* Name of the uploading file: '''<tt>[[:$1]]</tt>'''
-* Name of the existing file: '''<tt>[[:$2]]</tt>'''
+* Name of the uploading file: <strong>[[:$1]]</strong>
+* Name of the existing file: <strong>[[:$2]]</strong>
 Please choose a different name.",
 'fileexists-thumbnail-yes'    => "The file seems to be an image of reduced size ''(thumbnail)''.
 [[$1|thumb]]
-Please check the file '''<tt>[[:$1]]</tt>'''.
+Please check the file <strong>[[:$1]]</strong>.
 If the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
-'file-thumbnail-no'           => "The filename begins with '''<tt>$1</tt>'''.
+'file-thumbnail-no'           => "The filename begins with <strong>$1</strong>.
 It seems to be an image of reduced size ''(thumbnail)''.
 If you have this image in full resolution upload this one, otherwise change the filename please.",
 'fileexists-forbidden'        => 'A file with this name already exists, and cannot be overwritten.
@@ -2269,35 +2294,36 @@ Please verify that the URL is valid and accessible and try again.
 If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'upload-too-many-redirects'         => 'The URL contained too many redirects',
 'upload-unknown-size'               => 'Unknown size',
-'upload-http-error'                 => 'An HTTP error occured: $1',
+'upload-http-error'                 => 'An HTTP error occurred: $1',
 'upload-copy-upload-invalid-domain' => 'Copy uploads are not available from this domain.',
 
 # File backend
-'backend-fail-stream'        => 'Could not stream file $1.',
-'backend-fail-backup'        => 'Could not backup file $1.',
+'backend-fail-stream'        => 'Could not stream file "$1".',
+'backend-fail-backup'        => 'Could not backup file "$1".',
 'backend-fail-notexists'     => 'The file $1 does not exist.',
 'backend-fail-hashes'        => 'Could not get file hashes for comparison.',
-'backend-fail-notsame'       => 'A non-identical file already exists at $1.',
-'backend-fail-invalidpath'   => '$1 is not a valid storage path.',
-'backend-fail-delete'        => 'Could not delete file $1.',
-'backend-fail-alreadyexists' => 'The file $1 already exists.',
-'backend-fail-store'         => 'Could not store file $1 at $2.',
-'backend-fail-copy'          => 'Could not copy file $1 to $2.',
-'backend-fail-move'          => 'Could not move file $1 to $2.',
+'backend-fail-notsame'       => 'A non-identical file already exists at "$1".',
+'backend-fail-invalidpath'   => '"$1" is not a valid storage path.',
+'backend-fail-delete'        => 'Could not delete file "$1".',
+'backend-fail-alreadyexists' => 'The file "$1" already exists.',
+'backend-fail-store'         => 'Could not store file "$1" at "$2".',
+'backend-fail-copy'          => 'Could not copy file "$1" to "$2".',
+'backend-fail-move'          => 'Could not move file "$1" to "$2".',
 'backend-fail-opentemp'      => 'Could not open temporary file.',
 'backend-fail-writetemp'     => 'Could not write to temporary file.',
 'backend-fail-closetemp'     => 'Could not close temporary file.',
-'backend-fail-read'          => 'Could not read file $1.',
-'backend-fail-create'        => 'Could not write file $1.',
-'backend-fail-maxsize'       => 'Could not write file $1 because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.',
-'backend-fail-usable'        => 'Could not write file $1 due to insufficient permissions or missing directories/containers.',
+'backend-fail-read'          => 'Could not read file "$1".',
+'backend-fail-create'        => 'Could not write file "$1".',
+'backend-fail-maxsize'       => 'Could not write file "$1" because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.',
 'backend-fail-readonly'      => 'The storage backend "$1" is currently read-only. The reason given is: "\'\'$2\'\'"',
 'backend-fail-synced'        => 'The file "$1" is in an inconsistent state within the internal storage backends',
 'backend-fail-connect'       => 'Could not connect to storage backend "$1".',
 'backend-fail-internal'      => 'An unknown error occurred in storage backend "$1".',
 'backend-fail-contenttype'   => 'Could not determine the content type of the file to store at "$1".',
-'backend-fail-batchsize'     => 'Storage backend given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.',
+'backend-fail-batchsize'     => 'The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.',
+'backend-fail-usable'        => 'Could not write file "$1" due to insufficient permissions or missing directories/containers.',
 
+# File journal errors
 'filejournal-fail-dbconnect' => 'Could not connect to the journal database for storage backend "$1".',
 'filejournal-fail-dbquery'   => 'Could not update the journal database for storage backend "$1".',
 
@@ -2310,6 +2336,7 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'lockmanager-fail-releaselock' => 'Could not release lock for "$1".',
 'lockmanager-fail-db-bucket'   => 'Could not contact enough lock databases in bucket $1.',
 'lockmanager-fail-db-release'  => 'Could not release locks on database $1.',
+'lockmanager-fail-svr-acquire' => 'Could not acquire locks on server $1.',
 'lockmanager-fail-svr-release' => 'Could not release locks on server $1.',
 
 # ZipDirectoryReader
@@ -2433,6 +2460,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'shared-repo'                       => 'a shared repository',
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons', # only translate this message to other languages if you have to change it
 'filepage.css'                      => '/* CSS placed here is included on the file description page, also included on foreign client wikis */', # only translate this message to other languages if you have to change it
+'upload-disallowed-here'            => 'Unfortunately you cannot overwrite this image.',
 
 # File reversion
 'filerevert'                => 'Revert $1',
@@ -2467,7 +2495,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 # MIME search
 'mimesearch'         => 'MIME search',
 'mimesearch-summary' => 'This page enables the filtering of files for their MIME type.
-Input: contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
+Input: contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mimetype'           => 'MIME type:',
 'download'           => 'download',
 
@@ -2521,8 +2549,8 @@ Remember to check for other links to the templates before deleting them.',
 'disambiguations'         => 'Pages linking to disambiguation pages',
 'disambiguations-summary' => '', # do not translate or duplicate this message to other languages
 'disambiguationspage'     => 'Template:disambig',
-'disambiguations-text'    => "The following pages link to a '''disambiguation page'''.
-They should link to the appropriate topic instead.<br />
+'disambiguations-text'    => "The following pages contain at least one link to a '''disambiguation page'''.
+They may have to link to a more appropriate page instead.<br />
 A page is treated as disambiguation page if it uses a template which is linked from [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects'                   => 'Double redirects',
@@ -2552,6 +2580,7 @@ It now redirects to [[$2]].',
 # Miscellaneous special pages
 'nbytes'                          => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories'                     => '$1 {{PLURAL:$1|category|categories}}',
+'ninterwikis'                     => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks'                          => '$1 {{PLURAL:$1|link|links}}',
 'nmembers'                        => '$1 {{PLURAL:$1|member|members}}',
 'nrevisions'                      => '$1 {{PLURAL:$1|revision|revisions}}',
@@ -2597,6 +2626,8 @@ It now redirects to [[$2]].',
 'mostcategories-summary'          => '', # do not translate or duplicate this message to other languages
 'mostimages'                      => 'Most linked-to files',
 'mostimages-summary'              => '', # do not translate or duplicate this message to other languages
+'mostinterwikis'                  => 'Pages with the most interwikis',
+'mostinterwikis-summary'          => '', # do not translate or duplicate this message to other languages
 'mostrevisions'                   => 'Pages with the most revisions',
 'mostrevisions-summary'           => '', # do not translate or duplicate this message to other languages
 'prefixindex'                     => 'All pages with prefix',
@@ -2690,8 +2721,8 @@ It may contain one or more characters which cannot be used in titles.',
 
 # SpecialCachedPage
 'cachedspecial-viewing-cached-ttl' => 'You are viewing a cached version of this page, which can be up to $1 old.',
-'cachedspecial-viewing-cached-ts' => 'You are viewing a cached version of this page, which might not be completely actual.',
-'cachedspecial-refresh-now' => 'View latest.',
+'cachedspecial-viewing-cached-ts'  => 'You are viewing a cached version of this page, which might not be completely actual.',
+'cachedspecial-refresh-now'        => 'View latest.',
 
 # Special:Categories
 'categories'                    => 'Categories',
@@ -2717,7 +2748,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'linksearch-ok'      => 'Search',
 'linksearch-text'    => 'Wildcards such as "*.wikipedia.org" may be used.
 Needs at least a top-level domain, for example "*.org".<br />
-Supported protocols: <tt>$1</tt> (do not add any of these in your search).',
+Supported protocols: <code>$1</code> (do not add any of these in your search).',
 'linksearch-line'    => '$1 is linked from $2',
 'linksearch-error'   => 'Wildcards may appear only at the start of the hostname.',
 
@@ -2751,8 +2782,8 @@ There may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] a
 'listgrouprights-rights'               => 'Rights',
 'listgrouprights-helppage'             => 'Help:Group rights',
 'listgrouprights-members'              => '(list of members)',
-'listgrouprights-right-display'        => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>', # only translate this message to other languages if you have to change it
-'listgrouprights-right-revoked'        => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>', # only translate this message to other languages if you have to change it
+'listgrouprights-right-display'        => '<span class="listgrouprights-granted">$1 <code>($2)</code></span>', # only translate this message to other languages if you have to change it
+'listgrouprights-right-revoked'        => '<span class="listgrouprights-revoked">$1 <code>($2)</code></span>', # only translate this message to other languages if you have to change it
 'listgrouprights-addgroup'             => 'Add {{PLURAL:$2|group|groups}}: $1',
 'listgrouprights-removegroup'          => 'Remove {{PLURAL:$2|group|groups}}: $1',
 'listgrouprights-addgroup-all'         => 'Add all groups',
@@ -2766,6 +2797,8 @@ There may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] a
 'mailnologin'          => 'No send address',
 'mailnologintext'      => 'You must be [[Special:UserLogin|logged in]] and have a valid e-mail address in your [[Special:Preferences|preferences]] to send e-mail to other users.',
 'emailuser'            => 'E-mail this user',
+'emailuser-title-target' => 'E-mail this {{GENDER:$1|user}}',
+'emailuser-title-notarget' => 'E-mail user',
 'emailuser-summary'    => '', # do not translate or duplicate this message to other languages
 'emailpage'            => 'E-mail user',
 'emailpagetext'        => 'You can use the form below to send an e-mail message to this user.
@@ -2912,20 +2945,22 @@ Deleting it may disrupt database operations of {{SITENAME}};
 proceed with caution.',
 
 # Rollback
-'rollback'          => 'Roll back edits',
-'rollback_short'    => 'Rollback',
-'rollbacklink'      => 'rollback',
-'rollbackfailed'    => 'Rollback failed',
-'cantrollback'      => 'Cannot revert edit;
+'rollback'                   => 'Roll back edits',
+'rollback_short'             => 'Rollback',
+'rollbacklink'               => 'rollback',
+'rollbacklinkcount'          => 'rollback $1 {{PLURAL:$1|edit|edits}}',
+'rollbacklinkcount-morethan' => 'rollback more than $1 {{PLURAL:$1|edit|edits}}',
+'rollbackfailed'             => 'Rollback failed',
+'cantrollback'               => 'Cannot revert edit;
 last contributor is only author of this page.',
-'alreadyrolled'     => 'Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
+'alreadyrolled'              => 'Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
 someone else has edited or rolled back the page already.
 
 The last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
-'editcomment'       => "The edit summary was: \"''\$1''\".",
-'revertpage'        => 'Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]',
-'revertpage-nouser' => 'Reverted edits by (username removed) to last revision by [[User:$1|$1]]',
-'rollback-success'  => 'Reverted edits by $1;
+'editcomment'                => "The edit summary was: \"''\$1''\".",
+'revertpage'                 => 'Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]',
+'revertpage-nouser'          => 'Reverted edits by (username removed) to last revision by [[User:$1|$1]]',
+'rollback-success'           => 'Reverted edits by $1;
 changed back to last revision by $2.',
 
 # Edit tokens
@@ -3056,7 +3091,7 @@ It may have already been undeleted.',
 $1',
 'undelete-show-file-confirm'   => 'Are you sure you want to view the deleted revision of the file "<nowiki>$1</nowiki>" from $2 at $3?',
 'undelete-show-file-submit'    => 'Yes',
-'undelete-revisionrow'        => "$1 $2 $3 $4 . . $5 $6 $7",
+'undelete-revisionrow'         => '$1 $2 ($3) $4 . . $5 $6 $7', # only translate this message to other languages if you have to change it
 
 # Namespace form on various pages
 'namespace'                     => 'Namespace:',
@@ -3194,8 +3229,8 @@ See the [[Special:BlockList|block list]] to review blocks.',
 'expiringblock'                   => 'expires on $1 at $2',
 'anononlyblock'                   => 'anon. only',
 'noautoblockblock'                => 'autoblock disabled',
-'createaccountblock'              => 'account creation blocked',
-'emailblock'                      => 'e-mail blocked',
+'createaccountblock'              => 'account creation disabled',
+'emailblock'                      => 'e-mail disabled',
 'blocklist-nousertalk'            => 'cannot edit own talk page',
 'ipblocklist-empty'               => 'The block list is empty.',
 'ipblocklist-no-results'          => 'The requested IP address or username is not blocked.',
@@ -3220,7 +3255,7 @@ See the [[Special:BlockList|block list]] for the list of currently operational b
 'block-log-flags-anononly'        => 'anonymous users only',
 'block-log-flags-nocreate'        => 'account creation disabled',
 'block-log-flags-noautoblock'     => 'autoblock disabled',
-'block-log-flags-noemail'         => 'e-mail blocked',
+'block-log-flags-noemail'         => 'e-mail disabled',
 'block-log-flags-nousertalk'      => 'cannot edit own talk page',
 'block-log-flags-angry-autoblock' => 'enhanced autoblock enabled',
 'block-log-flags-hiddenname'      => 'username hidden',
@@ -3252,6 +3287,7 @@ You cannot create an account',
 Since you do not have the hideuser right, you cannot see or edit the user's block.",
 'ipbblocked'                      => 'You cannot block or unblock other users, because you are yourself blocked',
 'ipbnounblockself'                => 'You are not allowed to unblock yourself',
+'ipb-default-expiry'              => '', # do not translate or duplicate this message to other languages
 
 # Developer tools
 'lockdb'              => 'Lock database',
@@ -3436,6 +3472,7 @@ All transwiki import actions are logged at the [[Special:Log/import|import log]]
 'import-interwiki-templates' => 'Include all templates',
 'import-interwiki-submit'    => 'Import',
 'import-interwiki-namespace' => 'Destination namespace:',
+'import-interwiki-rootpage'  => 'Destination root page (optional):',
 'import-upload-filename'     => 'Filename:',
 'import-comment'             => 'Comment:',
 'importtext'                 => 'Please export the file from the source wiki using the [[Special:Export|export utility]].
@@ -3472,6 +3509,9 @@ Please try again.',
 'import-error-interwiki'     => 'Page "$1" is not imported because its name is reserved for external linking (interwiki).',
 'import-error-special'       => 'Page "$1" is not imported because it belongs to a special namespace that does not allow pages.',
 'import-error-invalid'       => 'Page "$1" is not imported because its name is invalid.',
+'import-options-wrong'       => 'Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid'    => 'Given root page is an invalid title.',
+'import-rootpage-nosubpage'  => 'Namespace "$1" of the root page does not allow subpages.',
 
 # Import log
 'importlogpage'                    => 'Import log',
@@ -3695,17 +3735,38 @@ This is probably caused by a link to a blacklisted external site.',
 'spam_deleting'       => 'All revisions contained links to $1, deleting',
 
 # Info page
-'pageinfo-title'            => 'Information for "$1"',
-'pageinfo-header-edits'     => 'Edits',
-'pageinfo-header-watchlist' => 'Watchlist',
-'pageinfo-header-views'     => 'Views',
-'pageinfo-subjectpage'      => 'Page',
-'pageinfo-talkpage'         => 'Talk page',
-'pageinfo-watchers'         => 'Number of watchers',
-'pageinfo-edits'            => 'Number of edits',
-'pageinfo-authors'          => 'Number of distinct authors',
-'pageinfo-views'            => 'Number of views',
-'pageinfo-viewsperedit'     => 'Views per edit',
+'pageinfo-header'              => '-', # do not translate or duplicate this message to other languages
+'pageinfo-title'               => 'Information for "$1"',
+'pageinfo-header-basic'        => 'Basic information',
+'pageinfo-header-edits'        => 'Edit history',
+'pageinfo-header-restrictions' => 'Page protection',
+'pageinfo-header-properties'   => 'Page properties',
+'pageinfo-display-title'       => 'Display title',
+'pageinfo-default-sort'        => 'Default sort key',
+'pageinfo-length'              => 'Page length (in bytes)',
+'pageinfo-article-id'          => 'Page ID',
+'pageinfo-robot-policy'        => 'Search engine status',
+'pageinfo-robot-index'         => 'Indexable',
+'pageinfo-robot-noindex'       => 'Not indexable',
+'pageinfo-views'               => 'Number of views',
+'pageinfo-watchers'            => 'Number of page watchers',
+'pageinfo-redirects-name'      => 'Redirects to this page',
+'pageinfo-redirects-value'     => '$1',
+'pageinfo-subpages-name'       => 'Subpages of this page',
+'pageinfo-subpages-value'      => '$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})',
+'pageinfo-firstuser'           => 'Page creator',
+'pageinfo-firsttime'           => 'Date of page creation',
+'pageinfo-lastuser'            => 'Latest editor',
+'pageinfo-lasttime'            => 'Date of latest edit',
+'pageinfo-edits'               => 'Total number of edits',
+'pageinfo-authors'             => 'Total number of distinct authors',
+'pageinfo-recent-edits'        => 'Recent number of edits (within past $1)',
+'pageinfo-recent-authors'      => 'Recent number of distinct authors',
+'pageinfo-restriction'         => 'Page protection (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words'         => 'Magic {{PLURAL:$1|word|words}} ($1)',
+'pageinfo-hidden-categories'   => 'Hidden {{PLURAL:$1|category|categories}} ($1)',
+'pageinfo-templates'           => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
+'pageinfo-footer'              => '-', # do not translate or duplicate this message to other languages
 
 # Skin names
 'skinname-standard'    => 'Classic', # only translate this message to other languages if you have to change it
@@ -3762,6 +3823,7 @@ By executing it, your system may be compromised.",
 'file-info-size-pages'   => '$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}',
 'file-nohires'           => 'No higher resolution available.',
 'svg-long-desc'          => 'SVG file, nominally $1 × $2 pixels, file size: $3',
+'svg-long-desc-animated' => 'Animated SVG file, nominally $1 × $2 pixels, file size: $3',
 'show-big-image'         => 'Full resolution',
 'show-big-image-preview' => 'Size of this preview: $1.',
 'show-big-image-other'   => 'Other {{PLURAL:$2|resolution|resolutions}}: $1.',
@@ -3771,6 +3833,8 @@ By executing it, your system may be compromised.",
 'file-info-png-looped'   => 'looped',
 'file-info-png-repeat'   => 'played $1 {{PLURAL:$1|time|times}}',
 'file-info-png-frames'   => '$1 {{PLURAL:$1|frame|frames}}',
+'file-no-thumb-animation'=> '\'\'\'Note: Due to technical limitations, thumbnails of this file will not be animated.\'\'\'',
+'file-no-thumb-animation-gif' => '\'\'\'Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.\'\'\'',
 
 # Special:NewFiles
 'newimages'             => 'Gallery of new files',
@@ -4612,44 +4676,44 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
 'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
 
 # Special:Version
-'version'                       => 'Version',
-'version-summary'               => '', # do not translate or duplicate this message to other languages
-'version-extensions'            => 'Installed extensions',
-'version-specialpages'          => 'Special pages',
-'version-parserhooks'           => 'Parser hooks',
-'version-variables'             => 'Variables',
-'version-antispam'              => 'Spam prevention',
-'version-skins'                 => 'Skins',
-'version-api'                   => 'API', # only translate this message to other languages if you have to change it
-'version-other'                 => 'Other',
-'version-mediahandlers'         => 'Media handlers',
-'version-hooks'                 => 'Hooks',
-'version-extension-functions'   => 'Extension functions',
-'version-parser-extensiontags'  => 'Parser extension tags',
-'version-parser-function-hooks' => 'Parser function hooks',
-'version-hook-name'             => 'Hook name',
-'version-hook-subscribedby'     => 'Subscribed by',
-'version-version'               => '(Version $1)',
-'version-svn-revision'          => '(r$2)', # only translate this message to other languages if you have to change it
-'version-license'               => 'License',
-'version-poweredby-credits'     => "This wiki is powered by '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
-'version-poweredby-others'      => 'others',
-'version-license-info'          => 'MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+'version'                               => 'Version',
+'version-summary'                       => '', # do not translate or duplicate this message to other languages
+'version-extensions'                    => 'Installed extensions',
+'version-specialpages'                  => 'Special pages',
+'version-parserhooks'                   => 'Parser hooks',
+'version-variables'                     => 'Variables',
+'version-antispam'                      => 'Spam prevention',
+'version-skins'                         => 'Skins',
+'version-api'                           => 'API', # only translate this message to other languages if you have to change it
+'version-other'                         => 'Other',
+'version-mediahandlers'                 => 'Media handlers',
+'version-hooks'                         => 'Hooks',
+'version-extension-functions'           => 'Extension functions',
+'version-parser-extensiontags'          => 'Parser extension tags',
+'version-parser-function-hooks'         => 'Parser function hooks',
+'version-hook-name'                     => 'Hook name',
+'version-hook-subscribedby'             => 'Subscribed by',
+'version-version'                       => '(Version $1)',
+'version-svn-revision'                  => '(r$2)', # only translate this message to other languages if you have to change it
+'version-license'                       => 'License',
+'version-poweredby-credits'             => "This wiki is powered by '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others'              => '[{{SERVER}}{{SCRIPTPATH}}/CREDITS others]',
+'version-license-info'                  => 'MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
 MediaWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 
 You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].',
-'version-software'              => 'Installed software',
-'version-software-product'      => 'Product',
-'version-software-version'      => 'Version',
-'version-entrypoints'           => 'Entry point URLs',
+'version-software'                      => 'Installed software',
+'version-software-product'              => 'Product',
+'version-software-version'              => 'Version',
+'version-entrypoints'                   => 'Entry point URLs',
 'version-entrypoints-header-entrypoint' => 'Entry point',
-'version-entrypoints-header-url' => 'URL',
-'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
-'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
-'version-entrypoints-index-php' => '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
-'version-entrypoints-api-php'   => '[https://www.mediawiki.org/wiki/Manual:api.php api.php]',
-'version-entrypoints-load-php'  => '[https://www.mediawiki.org/wiki/Manual:load.php load.php]',
+'version-entrypoints-header-url'        => 'URL',
+'version-entrypoints-articlepath'       => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]', # only translate this message to other languages if you have to change it
+'version-entrypoints-scriptpath'        => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]', # only translate this message to other languages if you have to change it
+'version-entrypoints-index-php'         => '[https://www.mediawiki.org/wiki/Manual:index.php index.php]', # do not translate or duplicate this message to other languages
+'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',
@@ -4677,7 +4741,7 @@ Images are shown in full resolution, other file types are started with their ass
 * <span class="mw-specialpagerestricted">Restricted special pages.</span>',
 'specialpages-group-maintenance' => 'Maintenance reports',
 'specialpages-group-other'       => 'Other special pages',
-'specialpages-group-login'       => 'Login / sign up',
+'specialpages-group-login'       => 'Login / create account',
 'specialpages-group-changes'     => 'Recent changes and logs',
 'specialpages-group-media'       => 'Media reports and uploads',
 'specialpages-group-users'       => 'Users and rights',
@@ -4837,9 +4901,12 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'api-error-empty-file'                    => 'The file you submitted was empty.',
 'api-error-emptypage'                     => 'Creating new, empty pages is not allowed.',
 'api-error-fetchfileerror'                => 'Internal error: Something went wrong while fetching the file.',
+'api-error-fileexists-forbidden'          => 'A file with name "$1" already exists, and cannot be overwritten.',
+'api-error-fileexists-shared-forbidden'   => 'A file with name "$1" already exists in the shared file repository, and cannot be overwritten.',
 'api-error-file-too-large'                => 'The file you submitted was too large.',
 'api-error-filename-tooshort'             => 'The filename is too short.',
 'api-error-filetype-banned'               => 'This type of file is banned.',
+'api-error-filetype-banned-type'          => '$1 {{PLURAL:$4|is not a permitted file type|are not permitted file types}}. Permitted {{PLURAL:$3|file type is|file types are}} $2.',
 'api-error-filetype-missing'              => 'The filename is missing an extension.',
 'api-error-hookaborted'                   => 'The modification you tried to make was aborted by an extension.',
 'api-error-http'                          => 'Internal error: Unable to connect to server.',
index 1f7eea9..f838269 100644 (file)
@@ -175,129 +175,129 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ALIDIREKTU', '#ALIDIREKTI', '#AL', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__NI__', '__NEINDEKSO__', '__NT__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__NG__', '__SENBILDARO__', '__SB__', '__SG__', '__SENGALERIO__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FI__', '__FORTUINDEKSON__', '__FT__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__I__', '__T__', '__INDEKSO__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__SRS__', '__NES__', '__SENREDAKTISEKCIOJN__', '__SENREDAKTISEKCION__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__SENTITOLO__', '__NH__', '__ST__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'NUNAMONATO', 'NUNAMONATO2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'NUNAMONATO1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NUNAMONATNOMO', 'NUNAMONATONOMO', 'NUNAMONATANOMO', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'NUNAMONATNOMOGEN', 'NUNAMONATONOMOGEN', 'NUNAMONATANOMOGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'NUNAMONATNOMOMAL', 'NUNAMONATONOMOMAL', 'NUNAMONATANOMOMAL', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'NUNATAGO', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'NUNATAGO2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NUNATAGNOMO', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'NUNAJARO', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'NUNATEMPO', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'NUNAHORO', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LOKAMONATO', 'LOKAMONATO2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LOKAMONATO1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'LOKAMONATNOMO', 'LOKAMONATONOMO', 'LOKAMONATANOMO', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'LOKAMONATNOMOGEN', 'LOKAMONATONOMOGEN', 'LOKAMONATANOMOGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'LOKAMONATNOMOMAL', 'LOKAMONATONOMOMAL', 'LOKAMONATANOMOMAL', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'LOKATAGO', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'LOKATAGO2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'LOKATAGNOMO', 'LOKATAGONOMO', 'LOKATAGANOMO', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'LOKAJARO', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LOKATEMPO', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'LOKAHORO', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NOMBRODEPAĜOJ', 'NOMBRODEPAGXOJ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NOMBRODEARTIKOLOJ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NOMBRODEDOSIEROJ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NOMBRODEUZANTOJ', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NOMBRODEAKTIVAJUZANTOJ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NOMBRODEREDAKTOJ', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NOMBRODEVIZITOJ', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'PAĜONOMO', 'PAGXONOMO', 'PAĜNOMO', 'PAGXNOMO', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'PAĜONOMOO', 'PAGXONOMOO', 'PAĜNOMOO', 'PAGXNOMOO', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NOMSPACO', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NOMSPACOO', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'DISKUTNOMSPACO', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'DISKUTNOMSPACOO', 'TALKSPACEE' ),
-       'fullpagename'            => array( '1', 'TUTAPAĜONOMO', 'TUTAPAGXONOMO', 'TUTAPAĜNOMO', 'TUTAPAGXNOMO', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'TUTAPAĜONOMOO', 'TUTAPAGXONOMOO', 'TUTAPAĜNOMOO', 'TUTAPAGXNOMOO', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'SUBPAĜONOMO', 'SUBPAGXONOMO', 'SUBPAĜNOMO', 'SUBPAGXNOMO', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'SUBPAĜONOMOO', 'SUBPAGXONOMOO', 'SUBPAĜNOMOO', 'SUBPAGXNOMOO', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'PATRAPAĜONOMO', 'PATRAPAGXONOMO', 'PATRAPAĜNOMO', 'PATRAPAGXNOMO', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'PATRAPAĜONOMOO', 'PATRAPAGXONOMOO', 'PATRAPAĜNOMOO', 'PATRAPAGXNOMOO', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'DISKUTPAĜONOMO', 'DISKUTPAGXONOMO', 'DISKUTPAĜNOMO', 'DISKUTPAGXNOMO', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'DISKUTPAĜONOMOO', 'DISKUTPAGXONOMOO', 'DISKUTPAĜNOMOO', 'DISKUTPAGXNOMOO', 'TALKPAGENAMEE' ),
-       'msg'                     => array( '0', 'MSĜ:', 'MSGX:', 'MSG:' ),
-       'subst'                   => array( '0', 'ANSTAT:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'SEKURANSTAT:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'NVMSĜ:', 'NVMSGX:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'eta', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'eta=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'dekstra', 'dekstre', 'right' ),
-       'img_left'                => array( '1', 'maldekstra', 'maldekstre', 'left' ),
-       'img_none'                => array( '1', 'nenio', 'neniu', 'none' ),
-       'img_width'               => array( '1', '$1ra', '$1px' ),
-       'img_center'              => array( '1', 'centra', 'meza', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'kadro', 'enkadrita', 'enkadrite', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'senkadra', 'frameless' ),
-       'img_page'                => array( '1', 'paĝo=$1', 'paĝo $1', 'pagxo=$1', 'pagxo_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'altdekstre', 'altdekstre=$1', 'altdekstre_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'kadra', 'kadrita', 'kadrigita', 'kadrite', 'kadrigite', 'border' ),
-       'img_sub'                 => array( '1', 'sube', 'malsupre', 'sub' ),
-       'img_super'               => array( '1', 'supre', 'malsube', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'alte', 'top' ),
-       'img_text_top'            => array( '1', 'tekst-alte', 'text-top' ),
-       'img_middle'              => array( '1', 'meze', 'middle' ),
-       'img_bottom'              => array( '1', 'malalte', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'suba-teksto', 'text-bottom' ),
-       'img_link'                => array( '1', 'ligilo=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'alternative=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'ENE:', 'INT:' ),
-       'sitename'                => array( '1', 'TTT-NOMO', 'RETPAĜNOMO', 'RETPAGXNOMO', 'RETEJNOMO', 'SITENAME' ),
-       'nse'                     => array( '0', 'NSS:', 'NSO:', 'NSE:' ),
-       'localurl'                => array( '0', 'LOKATTT:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKATTTT:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'ARTIKOLAPADO', 'ARTIKOLAVOJO', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'SERVILO', 'SERVER' ),
-       'servername'              => array( '0', 'NOMODESERVILO', 'SERVILANOMO', 'SERVILONOMO', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SKRIPTO-VOJO', 'SKRIPTOVOJO', 'SKRIPTVOJO', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'STILO-VOJO', 'STILOVOJO', 'STILVOJO', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMATIKO:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'SEKSO:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__NEKONVERTUTITOLON__', '__NKT__', '__NTC__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__NEKONVERTUENHAVON__', '__NKH__', '__NCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'NUNASEMAJNO', 'CURRENTWEEK' ),
-       'localweek'               => array( '1', 'LOKASEMAJNO', 'LOCALWEEK' ),
-       'revisionyear'            => array( '1', 'JARODEREVIZIO', 'REVISIONYEAR' ),
-       'plural'                  => array( '0', 'PLURALA:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'PLENALIGILO:', 'PLENLIG:', 'TUTATTT:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'PLENALIGILOO:', 'PLENLIGG:', 'TUTATTTT:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'MALMAJUSKLEUNUA:', 'MINUSKLEUNUA:', 'MMU:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'MAJUSKLEUNUA:', 'MALMINUSKLEUNUA:', 'MU:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MALMAJUSKLE:', 'MINUSKLE:', 'LC:' ),
-       'uc'                      => array( '0', 'MAJUSKLE:', 'MALMINUSKLE:', 'UC:' ),
-       'displaytitle'            => array( '1', 'MONTRUTITOLON:', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__LIGILOALNOVASEKCIO__', '__NSL__', '__LNS__', '__LANS__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__SENLIGILOALNOVASEKCIO__', '__NNSL__', '__SLNS__', '__SLANS__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'NUNAVERSIO', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'NUNATEMPINDIKO', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'LOKATEMPINDIKO', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#LINGVO:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'ENHAVA-LINGVO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PAĜOJENNOMSPACO', 'PAGXOJENNOMSPACO', 'PAĜOJENS', 'PAGXOJENNS', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'NOMBRODEADMINOJ', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'speciala', 'special' ),
-       'defaultsort'             => array( '1', 'DEFAŬLTORDIGO:', 'DEFAUXLTORDIGO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'DOSIERO-VORO', 'DOSIERVOJO', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'marko', 'etikedo', 'tag' ),
-       'hiddencat'               => array( '1', '__KK__', '__KAŜITAKATEGORIO__', '__KASXITAKATEGORIO__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAĜOJENKATEGORIO', 'PAGXOJENKATEGORIO', 'PAĜOJENKAT', 'PAGXOJENKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'PAĜOPEZO', 'PAGXOPEZO', 'PEZODEPAĜO', 'PEZODEPAGXO', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEKSU__', '__INDEKSI__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__NEINDEKSU__', '__NIU__', '__NOINDEX__' ),
-       'staticredirect'          => array( '1', '__STATIKAALIDIREKTO__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'PROTEKTONIVELO', 'PROTECTIONLEVEL' ),
-       'url_path'                => array( '0', 'VOJO', 'PATH' ),
-       'url_wiki'                => array( '0', 'VIKIO', 'WIKI' ),
-       'url_query'               => array( '0', 'INFORMPETO', 'QUERY' ),
+       'redirect'                  => array( '0', '#ALIDIREKTU', '#ALIDIREKTI', '#AL', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__NI__', '__NEINDEKSO__', '__NT__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__NG__', '__SENBILDARO__', '__SB__', '__SG__', '__SENGALERIO__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FI__', '__FORTUINDEKSON__', '__FT__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__I__', '__T__', '__INDEKSO__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__SRS__', '__NES__', '__SENREDAKTISEKCIOJN__', '__SENREDAKTISEKCION__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__SENTITOLO__', '__NH__', '__ST__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'NUNAMONATO', 'NUNAMONATO2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'NUNAMONATO1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NUNAMONATNOMO', 'NUNAMONATONOMO', 'NUNAMONATANOMO', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'NUNAMONATNOMOGEN', 'NUNAMONATONOMOGEN', 'NUNAMONATANOMOGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'NUNAMONATNOMOMAL', 'NUNAMONATONOMOMAL', 'NUNAMONATANOMOMAL', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'NUNATAGO', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'NUNATAGO2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NUNATAGNOMO', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'NUNAJARO', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'NUNATEMPO', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'NUNAHORO', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LOKAMONATO', 'LOKAMONATO2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LOKAMONATO1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'LOKAMONATNOMO', 'LOKAMONATONOMO', 'LOKAMONATANOMO', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'LOKAMONATNOMOGEN', 'LOKAMONATONOMOGEN', 'LOKAMONATANOMOGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'LOKAMONATNOMOMAL', 'LOKAMONATONOMOMAL', 'LOKAMONATANOMOMAL', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'LOKATAGO', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKATAGO2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'LOKATAGNOMO', 'LOKATAGONOMO', 'LOKATAGANOMO', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'LOKAJARO', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LOKATEMPO', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'LOKAHORO', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NOMBRODEPAĜOJ', 'NOMBRODEPAGXOJ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NOMBRODEARTIKOLOJ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NOMBRODEDOSIEROJ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NOMBRODEUZANTOJ', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NOMBRODEAKTIVAJUZANTOJ', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NOMBRODEREDAKTOJ', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NOMBRODEVIZITOJ', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'PAĜONOMO', 'PAGXONOMO', 'PAĜNOMO', 'PAGXNOMO', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'PAĜONOMOO', 'PAGXONOMOO', 'PAĜNOMOO', 'PAGXNOMOO', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NOMSPACO', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NOMSPACOO', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'DISKUTNOMSPACO', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'DISKUTNOMSPACOO', 'TALKSPACEE' ),
+       'fullpagename'              => array( '1', 'TUTAPAĜONOMO', 'TUTAPAGXONOMO', 'TUTAPAĜNOMO', 'TUTAPAGXNOMO', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'TUTAPAĜONOMOO', 'TUTAPAGXONOMOO', 'TUTAPAĜNOMOO', 'TUTAPAGXNOMOO', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'SUBPAĜONOMO', 'SUBPAGXONOMO', 'SUBPAĜNOMO', 'SUBPAGXNOMO', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'SUBPAĜONOMOO', 'SUBPAGXONOMOO', 'SUBPAĜNOMOO', 'SUBPAGXNOMOO', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'PATRAPAĜONOMO', 'PATRAPAGXONOMO', 'PATRAPAĜNOMO', 'PATRAPAGXNOMO', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'PATRAPAĜONOMOO', 'PATRAPAGXONOMOO', 'PATRAPAĜNOMOO', 'PATRAPAGXNOMOO', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'DISKUTPAĜONOMO', 'DISKUTPAGXONOMO', 'DISKUTPAĜNOMO', 'DISKUTPAGXNOMO', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'DISKUTPAĜONOMOO', 'DISKUTPAGXONOMOO', 'DISKUTPAĜNOMOO', 'DISKUTPAGXNOMOO', 'TALKPAGENAMEE' ),
+       'msg'                       => array( '0', 'MSĜ:', 'MSGX:', 'MSG:' ),
+       'subst'                     => array( '0', 'ANSTAT:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'SEKURANSTAT:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'NVMSĜ:', 'NVMSGX:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'eta', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'eta=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'dekstra', 'dekstre', 'right' ),
+       'img_left'                  => array( '1', 'maldekstra', 'maldekstre', 'left' ),
+       'img_none'                  => array( '1', 'nenio', 'neniu', 'none' ),
+       'img_width'                 => array( '1', '$1ra', '$1px' ),
+       'img_center'                => array( '1', 'centra', 'meza', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'kadro', 'enkadrita', 'enkadrite', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'senkadra', 'frameless' ),
+       'img_page'                  => array( '1', 'paĝo=$1', 'paĝo $1', 'pagxo=$1', 'pagxo_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'altdekstre', 'altdekstre=$1', 'altdekstre_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'kadra', 'kadrita', 'kadrigita', 'kadrite', 'kadrigite', 'border' ),
+       'img_sub'                   => array( '1', 'sube', 'malsupre', 'sub' ),
+       'img_super'                 => array( '1', 'supre', 'malsube', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'alte', 'top' ),
+       'img_text_top'              => array( '1', 'tekst-alte', 'text-top' ),
+       'img_middle'                => array( '1', 'meze', 'middle' ),
+       'img_bottom'                => array( '1', 'malalte', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'suba-teksto', 'text-bottom' ),
+       'img_link'                  => array( '1', 'ligilo=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'alternative=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'ENE:', 'INT:' ),
+       'sitename'                  => array( '1', 'TTT-NOMO', 'RETPAĜNOMO', 'RETPAGXNOMO', 'RETEJNOMO', 'SITENAME' ),
+       'nse'                       => array( '0', 'NSS:', 'NSO:', 'NSE:' ),
+       'localurl'                  => array( '0', 'LOKATTT:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKATTTT:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ARTIKOLAPADO', 'ARTIKOLAVOJO', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'SERVILO', 'SERVER' ),
+       'servername'                => array( '0', 'NOMODESERVILO', 'SERVILANOMO', 'SERVILONOMO', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SKRIPTO-VOJO', 'SKRIPTOVOJO', 'SKRIPTVOJO', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'STILO-VOJO', 'STILOVOJO', 'STILVOJO', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMATIKO:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'SEKSO:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__NEKONVERTUTITOLON__', '__NKT__', '__NTC__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__NEKONVERTUENHAVON__', '__NKH__', '__NCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'NUNASEMAJNO', 'CURRENTWEEK' ),
+       'localweek'                 => array( '1', 'LOKASEMAJNO', 'LOCALWEEK' ),
+       'revisionyear'              => array( '1', 'JARODEREVIZIO', 'REVISIONYEAR' ),
+       'plural'                    => array( '0', 'PLURALA:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'PLENALIGILO:', 'PLENLIG:', 'TUTATTT:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'PLENALIGILOO:', 'PLENLIGG:', 'TUTATTTT:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'MALMAJUSKLEUNUA:', 'MINUSKLEUNUA:', 'MMU:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'MAJUSKLEUNUA:', 'MALMINUSKLEUNUA:', 'MU:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MALMAJUSKLE:', 'MINUSKLE:', 'LC:' ),
+       'uc'                        => array( '0', 'MAJUSKLE:', 'MALMINUSKLE:', 'UC:' ),
+       'displaytitle'              => array( '1', 'MONTRUTITOLON:', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__LIGILOALNOVASEKCIO__', '__NSL__', '__LNS__', '__LANS__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__SENLIGILOALNOVASEKCIO__', '__NNSL__', '__SLNS__', '__SLANS__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'NUNAVERSIO', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'NUNATEMPINDIKO', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'LOKATEMPINDIKO', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#LINGVO:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'ENHAVA-LINGVO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PAĜOJENNOMSPACO', 'PAGXOJENNOMSPACO', 'PAĜOJENS', 'PAGXOJENNS', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NOMBRODEADMINOJ', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'speciala', 'special' ),
+       'defaultsort'               => array( '1', 'DEFAŬLTORDIGO:', 'DEFAUXLTORDIGO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'DOSIERO-VORO', 'DOSIERVOJO', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'marko', 'etikedo', 'tag' ),
+       'hiddencat'                 => array( '1', '__KK__', '__KAŜITAKATEGORIO__', '__KASXITAKATEGORIO__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAĜOJENKATEGORIO', 'PAGXOJENKATEGORIO', 'PAĜOJENKAT', 'PAGXOJENKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'PAĜOPEZO', 'PAGXOPEZO', 'PEZODEPAĜO', 'PEZODEPAGXO', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEKSU__', '__INDEKSI__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NEINDEKSU__', '__NIU__', '__NOINDEX__' ),
+       'staticredirect'            => array( '1', '__STATIKAALIDIREKTO__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'PROTEKTONIVELO', 'PROTECTIONLEVEL' ),
+       'url_path'                  => array( '0', 'VOJO', 'PATH' ),
+       'url_wiki'                  => array( '0', 'VIKIO', 'WIKI' ),
+       'url_query'                 => array( '0', 'INFORMPETO', 'QUERY' ),
 );
 
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -318,7 +318,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Kaŝi patrolitajn redaktojn en lastaj ŝanĝoj',
 'tog-newpageshidepatrolled' => 'Kaŝi patrolitajn paĝojn de listo de novaj paĝoj',
 'tog-extendwatchlist' => 'Etendi la atentaron por montri ĉiujn ŝanĝojn, ne nur la plej lastajn',
-'tog-usenewrc' => 'Uzi progresan "Lastaj ŝanĝoj" (bezonas JavaSkripton)',
+'tog-usenewrc' => 'Grupigi ŝanĝoj laŭ paĝo en "Lastaj ŝanĝoj" kaj "Atentaro" (bezonas Ĝavaskripton)',
 'tog-numberheadings' => 'Aŭtomate numerigi sekciojn',
 'tog-showtoolbar' => 'Montri eldonilaron',
 'tog-editondblclick' => 'Redakti per duobla alklako (JavaScript)',
@@ -326,7 +326,7 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Ŝalti sekcian redaktadon per dekstra musklako de sekciaj titoloj (kun JavaScript)',
 'tog-showtoc' => 'Montri enhavliston (por paĝoj kun pli ol 3 sekcioj)',
 'tog-rememberpassword' => 'Memori mian ensalutadon ĉe ĉi tiu retumilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
-'tog-watchcreations' => 'Aldoni de mi kreitajn paĝojn al mia atentaro',
+'tog-watchcreations' => 'Aldoni miajn kreatajn paĝojn al mia atentaro',
 'tog-watchdefault' => 'Aldoni al mia atentaro paĝojn redaktitajn de mi',
 'tog-watchmoves' => 'Aldoni paĝojn, kiujn mi movas, al mia atentaro',
 'tog-watchdeletion' => 'Aldoni paĝojn, kiujn mi forigas, al mia atentaro',
@@ -334,9 +334,9 @@ $messages = array(
 'tog-previewontop' => 'Montri antaŭrigardon antaŭ redaktilo',
 'tog-previewonfirst' => 'Montri antaŭrigardon je unua redakto',
 'tog-nocache' => 'Malŝalti retumilan kaŝmemoron de paĝoj',
-'tog-enotifwatchlistpages' => 'Sendi al mi retmesaĝon kiam tiu paĝo estas ŝanĝita',
+'tog-enotifwatchlistpages' => 'Sendi al mi retmesaĝon kiam tiu paĝo en mia atentaro estas ŝanĝita',
 'tog-enotifusertalkpages' => 'Sendi al mi retmesaĝon kiam mia diskutpaĝo estas ŝanĝita',
-'tog-enotifminoredits' => 'Sendi al mi ankaŭ retmesaĝojn por malgrandaj redaktoj de paĝoj',
+'tog-enotifminoredits' => 'Sendi al mi ankaŭ retmesaĝojn pro malgrandaj redaktoj de paĝoj',
 'tog-enotifrevealaddr' => 'Malkaŝi mian retadreson en informaj retpoŝtaĵoj',
 'tog-shownumberswatching' => 'Montri la nombron da priatentaj uzantoj',
 'tog-oldsig' => 'Ekzistanta subskribo:',
@@ -353,7 +353,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Kaŝi redaktojn de ensalutitaj uzantoj de la atentaro',
 'tog-watchlisthideanons' => 'Kaŝi redaktojn de anonimuloj de la atentaro',
 'tog-watchlisthidepatrolled' => 'Kaŝi patrolitajn redaktojn de la atentaro',
-'tog-nolangconversion' => 'Malŝalti konvertadon de variantoj',
 'tog-ccmeonemails' => 'Sendi al mi kopiojn de retpoŝtaĵoj, kiujn mi sendis al aliaj uzantoj.',
 'tog-diffonly' => 'Ne montri paĝan enhavon sub la ŝanĝoj',
 'tog-showhiddencats' => 'Montri kaŝitajn kategoriojn',
@@ -385,30 +384,30 @@ $messages = array(
 'thu' => 'Ĵaŭ',
 'fri' => 'Ven',
 'sat' => 'Sab',
-'january' => 'Januaro',
-'february' => 'Februaro',
-'march' => 'Marto',
-'april' => 'Aprilo',
-'may_long' => 'Majo',
-'june' => 'Junio',
-'july' => 'Julio',
-'august' => 'Aŭgusto',
-'september' => 'Septembro',
-'october' => 'Oktobro',
-'november' => 'Novembro',
-'december' => 'Decembro',
+'january' => 'januaro',
+'february' => 'februaro',
+'march' => 'marto',
+'april' => 'aprilo',
+'may_long' => 'majo',
+'june' => 'junio',
+'july' => 'julio',
+'august' => 'aŭgusto',
+'september' => 'septembro',
+'october' => 'oktobro',
+'november' => 'novembro',
+'december' => 'decembro',
 'january-gen' => 'januaro',
 'february-gen' => 'februaro',
 'march-gen' => 'marto',
-'april-gen' => 'Aprilo',
-'may-gen' => 'Majo',
-'june-gen' => 'Junio',
-'july-gen' => 'Julio',
-'august-gen' => 'Aŭgusto',
-'september-gen' => 'Septembro',
+'april-gen' => 'aprilo',
+'may-gen' => 'majo',
+'june-gen' => 'junio',
+'july-gen' => 'julio',
+'august-gen' => 'aŭgusto',
+'september-gen' => 'septembro',
 'october-gen' => 'oktobro',
-'november-gen' => 'Novembro',
-'december-gen' => 'Decembro',
+'november-gen' => 'novembro',
+'december-gen' => 'decembro',
 'jan' => 'Jan',
 'feb' => 'Feb',
 'mar' => 'Mar',
@@ -576,6 +575,10 @@ $1',
 'youhavenewmessages' => 'Por vi estas $1 ($2).',
 'newmessageslink' => 'novaj mesaĝoj',
 'newmessagesdifflink' => 'ŝanĝoj kompare kun antaŭlasta versio',
+'youhavenewmessagesfromusers' => 'Riceviĝis $1 de {{PLURAL:$3|alia uzanto|$3 uzantoj}} ($2).',
+'youhavenewmessagesmanyusers' => 'Riceviĝis $1 de multaj uzantoj ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|nova mesaĝo|novaj mesaĝoj}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|lasta ŝanĝo|lastaj ŝanĝoj}}',
 'youhavenewmessagesmulti' => 'Vi havas novajn mesaĝojn ĉe $1',
 'editsection' => 'redakti',
 'editold' => 'redakti',
@@ -627,12 +630,12 @@ Listo de validaj specialaj paĝoj estas trovebla ĉe [[Special:SpecialPages|{{in
 # General errors
 'error' => 'Eraro',
 'databaseerror' => 'Datumbaza eraro',
-'dberrortext' => 'Sintakseraro okazis dum informpeto al la datumaro.
-Ĝi eble indikas cimon en la programaro.
+'dberrortext' => 'Sintakseraro okazis dum informpeto al la datenbazo.
+Ĝi eble indikas misaĵeton en la programaro.
 Jen la plej laste provita informpeto:
-<blockquote><tt>$1</tt></blockquote>
-el la funkcio "<tt>$2</tt>".
-MySQL liveris eraron "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+el la funkcio "<code>$2</code>".
+La datenbazo liveris eraron "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Sintaksa eraro de la datumbaza informmendo okazis.
 La lasta provita datumbaza informmendo estis:
 "$1"
@@ -673,6 +676,8 @@ Bonvolu raporti ĉi tiun al [[Special:ListUsers/sysop|administranto]], notante l
 'cannotdelete' => 'Ne eblis forigi la elektitan paĝon aŭ dosieron "$1".
 Eble ĝi estis jam forigita de iu alia.',
 'cannotdelete-title' => 'Ne eblas forigi paĝon "$1"',
+'delete-hook-aborted' => 'Forigo ĉesigis per hoko.
+Ĝi ne donis eksplikon.',
 'badtitle' => 'Fuŝa titolo',
 'badtitletext' => 'La petita paĝotitolo estis malvalida, malplena, aŭ malĝuste ligita interlingva aŭ intervikia titolo.
 Ĝi eble enhavas unu aŭ pliaj signoj kiu ne povas esti uzata en titoloj.',
@@ -701,8 +706,13 @@ $2',
 'ns-specialprotected' => 'Paĝoj en la {{ns:special}} nomspaco ne povas esti redaktataj.',
 'titleprotected' => "Ĉi titolo estas protektita de kreado de [[User:$1|$1]].
 La kialo donata estis ''$2''.",
+'filereadonlyerror' => 'La dosiero "$1" ne estas modifebla, ĉar la datumbazujo "$2" estas en nurlegebla modo.
+
+La administranto kiu ŝlosis ĝin proponis tiun klarigon: "$3".',
 'invalidtitle-knownnamespace' => 'Nevalida titolo kun nomspaco "$2" kaj teksto "$3"',
 'invalidtitle-unknownnamespace' => 'Nevalida titolo kun nekonata nomspaca numero $1 kaj teksto "$2"',
+'exception-nologin' => 'Ne ensalutita',
+'exception-nologin-text' => 'Vi devas ensaluti ĉi tiun vikion por fari ĉi tiun agon.',
 
 # Virus scanner
 'virus-badscanner' => "Malbona konfiguro: nekonata virusa skanilo: ''$1''",
@@ -723,6 +733,7 @@ Ne forgesu fari viajn [[Special:Preferences|{{SITENAME}}-preferojn]].',
 'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
 '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.',
 'externaldberror' => 'Aŭ estis datenbaza eraro rilate al ekstera aŭtentikigado, aŭ vi ne rajtas ĝisdatigi vian eksteran konton.',
 'login' => 'Ensaluti',
 'nav-login-createaccount' => 'Ensaluti / Krei novan konton',
@@ -970,16 +981,18 @@ aŭ [{{fullurl:{{FULLPAGENAME}}|action=edit}} redakti ĉi tiun paĝon]</span>.',
 'noarticletext-nopermission' => 'Estas neniom da teksto en ĉi tiu paĝo.
 Vi povas [[Special:Search/{{PAGENAME}}|serĉi ĉi tiun paĝan titolon]] en aliaj paĝoj,
 aŭ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serĉi la rilatajn protokolojn]</span>.',
+'missing-revision' => 'La revizio n-ro $1 de la paĝo nomata "{{PAGENAME}}" ne ekzistas.
+
+La kutima kaŭzo estas sekvi malaktualan historio-ligilon al paĝo forviŝita.
+Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forviŝoj].',
 'userpage-userdoesnotexist' => 'Uzantokonto "<nowiki>$1</nowiki>" ne estas registrita. Bonvolu konfirmi se vi volas krei/redakti ĉi tiun paĝon.',
 'userpage-userdoesnotexist-view' => 'Uzanto-konto "$1" ne estas registrita.',
 'blocked-notice-logextract' => 'Ĉi tiu uzanto estas ĉi-momente forbarita.
 La lasta protokolero estas jene montrata por via referenco:',
-'clearyourcache' => "'''Notu:''' Post konservado vi forviŝu la kaŝmemoron de via foliumilo por vidi la ŝanĝojn. 
-* '''Firefox / Safari:''' Premu majuskligan klavon klakante ''Reŝarĝi'', aŭ premu ''Stir-F5'', aŭ premu ''Stir-R'' aŭ ''⌘-R'' kun Makintoŝo
-* '''Google Chrome:''' Premu ''Stir-majuskligklavon'' aŭ ⌘-Majuskligklavo-R'' kun Makintoŝo
+'clearyourcache' => "Notu:''' Post konservado, vi forviŝu la kaŝmemoron de via foliumilo por vidi la ŝanĝojn. 
+* '''Firefox / Safari:''' Premu majuskligan klavon klakante ''Reŝarĝi'', aŭ premu aŭ ''Stir-F5'' aŭ ''Stir-R'' (''⌘-R'' kun Makintoŝo)
+* '''Google Chrome:''' Premu ''Stir-majuskligklavon-R'' (''⌘-Majuskligklavo-R'' kun Makintoŝo)
 * '''Interreta Esplorilo''': Premu ''Stir'' klakante ''Refreŝu'', aŭ premu ''Stir-F5'' 
-* '''Safari:''' ''Cmd-R''
-* '''Konqueror:''' Klaku ''Reŝarĝu'' aŭ premu ''F5''
 * '''Opera:''' Nuligi la kaŝmemoro en ''Iloj → Preferoj''",
 'usercssyoucanpreview' => "'''Konsileto:''' Uzu la butonon \"Antaŭrigardi\" por provi vian novan CSS-kodon antaŭ konservado.",
 'userjsyoucanpreview' => "'''Konsileto:''' Uzu la butonon \"Antaŭrigard\" por provi vian novan JS-kodon antaŭ konservado.",
@@ -1076,6 +1089,7 @@ Verŝajne ĝi estis forigita.',
 'edit-no-change' => 'Via redakto estis ignorita, ĉar neniu ŝanĝo estis farita al la teksto.',
 'edit-already-exists' => 'Ne eblis krei novan paĝon.
 Ĝi jam ekzistas.',
+'defaultmessagetext' => 'Defaŭlta teksto',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Averto: Ĉi tiu paĝo enhavas tro da multekostaj sintaksaj funkcio-vokoj.
@@ -1095,6 +1109,9 @@ Iuj ŝablonoj ne estos inkluzivitaj.',
 'node-count-exceeded-warning' => 'Paĝo preterpasis la nombron da nodoj.',
 'expansion-depth-exceeded-category' => 'Paĝoj en kiuj la ekpansiprofundo estas preterpasita',
 'expansion-depth-exceeded-warning' => 'Paĝo preterpasis la ekpansiprofundon.',
+'parser-unstrip-loop-warning' => 'Cirkloreferencon detektis',
+'parser-unstrip-recursion-limit' => 'Rikurlimiton de analizopoj ($1) superis',
+'converter-manual-rule-error' => 'Eraron detektis en mana lingvokonverta regulo',
 
 # "Undo" feature
 'undo-success' => 'La redakto estas malfarebla.
@@ -1281,6 +1298,10 @@ Certigu ke ĉi tiu ŝanĝo tenos kontinuecon de la historia paĝo.',
 'editundo' => 'malfari',
 'diff-multi' => '({{PLURAL:$1|Unu intermeza versio|$1 intermezaj versioj}} de {{PLURAL:$2|unu uzanto|$2 uzantoj}} ne estas {{PLURAL:$1|montrata|montrataj}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Unu intermeza versio|$1 intermezaj versioj}} de pli ol {{PLURAL:$2|unu uzanto|$2 uzantoj}} ne estas {{PLURAL:$1|montrata|montrataj}}.)',
+'difference-missing-revision' => '{{PLURAL:$2|Unu revizio|$2 revizioj}} de ĉi tiu malsameco ($1) ne {{PLURAL:$2|estis|estis}} trovebla.
+
+La kutima kaŭzo estas sekvi malaktualan malsamo-ligilon al paĝo forviŝita.
+Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forviŝoj].',
 
 # Search results
 'searchresults' => 'Serĉrezultoj',
@@ -1370,6 +1391,7 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 'prefs-beta' => 'Ecoj de Beta',
 'prefs-datetime' => 'Dato kaj horo',
 'prefs-labs' => 'Ecoj el Laboratorio',
+'prefs-user-pages' => 'Uzantopaĝoj',
 'prefs-personal' => 'Uzanta profilo',
 'prefs-rc' => 'Lastaj ŝanĝoj',
 'prefs-watchlist' => 'Atentaro',
@@ -1547,6 +1569,7 @@ Jen hazarde generita valoro por via uzo: $1',
 'right-writeapi' => 'Uzi la API por modifi la vikion',
 'right-delete' => 'Forigi paĝojn',
 'right-bigdelete' => 'Forigi paĝojn kun grandaj historioj',
+'right-deletelogentry' => 'Forigi kaj malforigi specifajn enmetojn en la registro.',
 'right-deleterevision' => 'Forigi kaj malforigi specifajn versiojn de paĝoj',
 'right-deletedhistory' => 'Rigardi listanojn de forigitaj historioj, sen ties asociaj tekstoj',
 'right-deletedtext' => 'Rigardi forigitan tekston kaj ŝanĝojn inter forigitaj revizioj.',
@@ -1737,21 +1760,21 @@ tiu ĉi tiu dosiero pezas $2 bitokojn.',
 'largefileserver' => 'Ĉi tiu dosiero estas pli granda ol permesas la servilaj preferoj.',
 'emptyfile' => 'La dosiero kiun vi alŝutis ŝajnas malplena. Tio povas esti kaŭzita sde tajperaro en la titolo. Bonvolu kontroli ĉu vi vere volas alŝuti tiun dosieron.',
 'windows-nonascii-filename' => 'Ĉi tiu vikio ne subtenas dosiernomoj kun specialaj signoj.',
-'fileexists' => "Dosiero kun tia ĉi nomo jam ekzistas.
-Bonvolu kontroli '''<tt>[[:$1]]</tt>''' krom se vi certas ke vi konscie volas ŝanĝi ĝuste tiun.
-[[$1|thumb]]",
-'filepageexists' => "La priskriba paĝo por ĉi tiu dosiero jam estis kreita ĉe '''<tt>[[:$1]]</tt>''', sed neniu dosiero kun ĉi tiu nomo nune ekzistas.
+'fileexists' => 'Dosiero kun tia ĉi nomo jam ekzistas.
+Bonvolu kontroli <strong>[[:$1]]</strong> krom se vi certas ke vi konscie volas ŝanĝi ĝuste tiun.
+[[$1|thumb]]',
+'filepageexists' => 'La priskriba paĝo por ĉi tiu dosiero jam estis kreita ĉe <strong>[[:$1]]</strong>, sed neniu dosiero kun ĉi tiu nomo nune ekzistas.
 La resumo kiun vi entajpos ne aperos en la priskribo-paĝo.
 Por aperigi vian resumon, vi devos permane redakti ĝin.
-[[$1|thumb]]",
-'fileexists-extension' => "Dosiero kun simila nomo ekzistas: [[$2|thumb]]
-* Nomo de la alŝuta dosiero: '''<tt>[[:$1]]</tt>'''
-* Nomo de la ekzistanta dosiero: '''<tt>[[:$2]]</tt>'''
-Bonvolu elekti malsaman nomon.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Dosiero kun simila nomo ekzistas: [[$2|thumb]]
+* Nomo de la alŝuta dosiero: <strong>[[:$1]]</strong>
+* Nomo de la ekzistanta dosiero: <strong>[[:$2]]</strong>
+Bonvolu elekti malsaman nomon.',
 'fileexists-thumbnail-yes' => "Ĉi tiu dosiero ŝajnas kiel bildo de malkreskigita grandeco ''(bildeto)''. [[$1|thumb]]
-Bonvolu kontroli la dosieron '''<tt>[[:$1]]</tt>'''.
+Bonvolu kontroli la dosieron <strong>[[:$1]]</strong>.
 Se la kontrolita dosiero estas la sama bildo kiel la originala grandeco, ĝi ne nepras alŝuti plian bideton.",
-'file-thumbnail-no' => "La dosiernomo komencas kun '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "La dosiernomo komencas kun <strong>$1</strong>.
 Ĝi ŝajnas kiel bildo de malgrandigita grandeco ''(thumbnail)''.
 Se vi havas ĉi tiun bildon en plena distingivo, alŝutu ĉi tiun, alikaze bonvolu ŝanĝi la dosieran nomon.",
 'fileexists-forbidden' => 'Dosiero kun ĉi tiu nomo jam ekzistas kaj ne povas anstataŭigi ĝin.
@@ -1805,6 +1828,7 @@ Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|sisteman administran
 'upload-too-many-redirects' => 'La URL-o enhavis tro multajn alidirektilojn',
 'upload-unknown-size' => 'Nekonata grandeco',
 'upload-http-error' => 'HTTP-eraro okazis: $1',
+'upload-copy-upload-invalid-domain' => 'Kopio-alŝutoj ne disponiĝas el ĉi tiu domajno.',
 
 # File backend
 'backend-fail-stream' => 'Ne povis fluigi dosieron $1.',
@@ -1823,6 +1847,18 @@ Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|sisteman administran
 'backend-fail-closetemp' => 'Ne povis fermi provizoran dosieron.',
 'backend-fail-read' => 'Ne povas legi dosieron "$1".',
 'backend-fail-create' => 'Ne povas skribi dosieron $1.',
+'backend-fail-maxsize' => 'Ne povis skribi la dosieron "$1," ĉar ĝi estas pli granda ol {{plural: $2|bitoko|$2 bitokoj}}.',
+'backend-fail-readonly' => 'La interna konservujo "$1" nune estas nurlega. La indikata kialo estas: "\'\'$2\'\'"',
+'backend-fail-synced' => 'La dosiero "$1" estas en nekohera stato kun la internaj konservujoj',
+'backend-fail-connect' => 'Ne eblis konekti la internan konservujon "$1".',
+'backend-fail-internal' => 'Nekonata eraro okazis en interna konservujo "$1".',
+'backend-fail-contenttype' => 'Ne eblis determini la enhavo-tipo de la dosiero por konservi ĉe "$1".',
+'backend-fail-batchsize' => 'Interna konservujo estis donita komandaron de $1 {{PLURAL:$1|dosiera operacio|dosieraj operacioj}}; la limo estas $2 {{PLURAL:$2|operacio|operacioj}}.',
+'backend-fail-usable' => 'Ne eblis skribi dosieron "$1" pro malsufiĉaj permesoj aŭ mankantaj dosierujoj.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Ne eblis konekti la protokolan datumbazon por la ekstera konservujo "$1".',
+'filejournal-fail-dbquery' => 'Ne eblis ĝisdatigi la protokolan datumbazon por la ekstera konservujo "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => 'Ne povis malŝlosi "$1"; ĝi ne estas ŝlosita.',
@@ -1833,6 +1869,7 @@ Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|sisteman administran
 'lockmanager-fail-releaselock' => 'Ne povis liberigi ŝlosadon por "$1".',
 'lockmanager-fail-db-bucket' => 'Ne povis kontakti sufiĉajn ŝlos-datumbazojn en ujo $1.',
 'lockmanager-fail-db-release' => 'Ne povis liberigi ŝlosadojn de datumbazao $1.',
+'lockmanager-fail-svr-acquire' => 'Ne povis akiri ŝlosadojn de servilo $1.',
 'lockmanager-fail-svr-release' => 'Ne povis liberigi ŝlosadojn de servilo $1.',
 
 # ZipDirectoryReader
@@ -1940,11 +1977,16 @@ La jena listo montras la {{PLURAL:$1|unua paĝligilo|unuaj $1 paĝligiloj}} al n
 Bonvolu vidi la [$2 dosier-priskriban paĝon] por plua informo.',
 'sharedupload-desc-here' => 'Ĉi tiu dosiero estas de $1 kaj estas uzebla de aliaj projektoj.
 Jen la priskribo en ties [$2 dosier-priskriba paĝo].',
+'sharedupload-desc-edit' => 'Ĉi tiu dosiero estas el $1 kaj estas uzebla en aliaj projektoj.
+Eble vi volas redakti la priskribon ĉe ties [$2 dosier-priskriba paĝo].',
+'sharedupload-desc-create' => 'Ĉi tiu dosiero estas el $1 kaj estas uzebla en aliaj projektoj.
+Eble vi volas redakti la priskribon ĉe ties [$2 dosier-priskriba paĝo].',
 'filepage-nofile' => 'Neniu dosiero de ĉi tiu nomo ekzistas.',
 'filepage-nofile-link' => 'Neniu dosiero de ĉi tiu nomo ekzistas, sed vi povas [$1 alŝuti ĝin].',
 'uploadnewversion-linktext' => 'Alŝuti novan version de ĉi tiu dosiero',
 'shared-repo-from' => 'de $1',
 'shared-repo' => 'komuna dosierujo',
+'upload-disallowed-here' => 'Bedaŭrinde, vi ne povas superskribi ĉi tiun bildon.',
 
 # File reversion
 'filerevert' => 'Restarigi $1',
@@ -1978,7 +2020,7 @@ Jen la priskribo en ties [$2 dosier-priskriba paĝo].',
 
 # MIME search
 'mimesearch' => 'MIME-serĉilo',
-'mimesearch-summary' => 'Ĉi tiu paĝo ebligas la filtradon de dosieroj por ties MIME-tipo. Enigu: enhavo-tipo/subtipo, ekz. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Ĉi tiu paĝo ebligas la filtradon de dosieroj por ties MIME-tipo. Enigu: enhavo-tipo/subtipo, ekz. <code>image/jpeg</code>.',
 'mimetype' => 'MIME-tipo:',
 'download' => 'elŝuti',
 
@@ -2072,6 +2114,8 @@ Paĝo estas traktata kiel apartigilo se ĝi uzas ŝablonon kiu estas ligita de [
 'wantedpages' => 'Dezirataj paĝoj',
 'wantedpages-badtitle' => 'Malvalida titolo en rezulta aro: $1',
 'wantedfiles' => 'Dezirataj dosieroj',
+'wantedfiletext-cat' => 'La jenaj dosieroj estas uzataj sed ne ekzistas. Dosieroj de eksteraj konservujoj eble estos listigita malgraŭ ne ekzistante. Tia malprave pozitivaj rezultoj estos <del>forstrekita</del>. Ankaŭ, paĝoj kiuj enmetas dosierojn kiuj ne ekzistas estas listigita en [[:$1]].',
+'wantedfiletext-nocat' => 'La jenaj dosieroj estas uzataj sed ne ekzistas. Dosieroj de eksteraj dosierujoj eble estas listigitaj malgraŭ eksistado. Tia malprave pozitiva rezulto estos <del>forstrekita</del>.',
 'wantedtemplates' => 'Dezirataj ŝablonoj',
 'mostlinked' => 'Plej ligitaj paĝoj',
 'mostlinkedcategories' => 'Plej ligitaj kategorioj',
@@ -2134,6 +2178,7 @@ komprenata kiel rekomendo aŭ reklamo.',
 Vi povas plistrikti la mendon per selektado de protokola speco, la salutnomo (inkluzivante uskladon) aŭ la efika paĝo (ankaŭ inkluzivas uskladon).',
 'logempty' => 'Neniaj artikoloj en la protokolo.',
 'log-title-wildcard' => 'Serĉi titolojn komencantajn kun ĉi tiu teksto',
+'showhideselectedlogentries' => 'Montri/kaŝi elektitajn protokolerojn',
 
 # Special:AllPages
 'allpages' => 'Ĉiuj paĝoj',
@@ -2154,6 +2199,8 @@ Vi povas plistrikti la mendon per selektado de protokola speco, la salutnomo (in
 'allpages-hide-redirects' => 'Kaŝi alidirektilojn',
 
 # SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Vi vidas version de la paĝo el kaŝmemoro, kiu eble estis aktuala ekde $1.',
+'cachedspecial-viewing-cached-ts' => 'Vi vidas version de la paĝo el kaŝmemoro, kiu eble ne estas la plej aktuala.',
 'cachedspecial-refresh-now' => 'Vidas plej nova.',
 
 # Special:Categories
@@ -2176,7 +2223,7 @@ Vidu ankaŭ [[Special:WantedCategories|Dezirataj kategorioj]].',
 'linksearch-ns' => 'Nomspaco:',
 'linksearch-ok' => 'Serĉi',
 'linksearch-text' => 'Regulesprimoj kiel "*.wikipedia.org" povas esti uzataj. Nepre havi almenaŭ plej altan domajnon, ekz-e "*.org".<br />
-Subtenataj protokoloj: <tt>$1</tt> (ne aldonu ĉi tiujn ajn en via serĉo-mendo).',
+Subtenataj protokoloj: <code>$1</code> (ne aldonu ĉi tiujn ajn en via serĉo-mendo).',
 'linksearch-line' => '$1 ligita de $2',
 'linksearch-error' => 'Regulesprimoj povas aperi nur ĉe la komenco de la retnoda nomo.',
 
@@ -2222,6 +2269,8 @@ Estas [[{{MediaWiki:Listgrouprights-helppage}}|aldona informo]] pri individuaj r
 'mailnologin' => 'Neniu alsendota adreso',
 'mailnologintext' => 'Vi nepre estu [[Special:UserLogin|salutanta]] kaj havanta validan retpoŝtadreson en viaj [[Special:Preferences|preferoj]] por retpoŝti al aliaj uzantoj.',
 'emailuser' => 'Retpoŝti ĉi tiun uzanton',
+'emailuser-title-target' => 'Retpoŝti ĉi tiun {{GENDER:$1|uzanton}}',
+'emailuser-title-notarget' => 'Retpoŝti uzanton',
 'emailpage' => 'Retpoŝti uzanton',
 'emailpagetext' => 'Vi povas uzi la jenan paĝon por sendi retpoŝtan mesaĝon al ĉi tiu uzanto.
 La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel la "De" adreso de la retpoŝto, do la ricevonto eblos respondi rekte al vi.',
@@ -2362,6 +2411,8 @@ Vidu la paĝon $2 por registro de lastatempaj forigoj.',
 'rollback' => 'Restarigi antaŭan redakton',
 'rollback_short' => 'Malfari',
 'rollbacklink' => 'malfari',
+'rollbacklinkcount' => 'nuligi $1 {{PLURAL:$1|redakton|redaktojn}}',
+'rollbacklinkcount-morethan' => 'nuligi pli ol $1 {{PLURAL:$1|redakton|redaktojn}}',
 'rollbackfailed' => 'Malfaro malsukcesis',
 'cantrollback' => 'Ne povas restarigi antaŭan redakton; la redaktinto lasta estas la sola aŭtoro de la paĝo.',
 'alreadyrolled' => 'Ne povas restarigi la lastan redakton de [[:$1]] de la [[User:$2|$2]] ([[User talk:$2|diskuto]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2857,6 +2908,7 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'import-interwiki-templates' => 'Inkluzivi ĉiujn ŝablonojn',
 'import-interwiki-submit' => 'Importi',
 'import-interwiki-namespace' => 'Cela nomspaco:',
+'import-interwiki-rootpage' => 'Ircela radikopaĝo (laŭvola):',
 'import-upload-filename' => 'Dosiernomo:',
 'import-comment' => 'Komento:',
 'importtext' => 'Bonvolu eksporti la dosieron el la fonta vikio per la [[Special:Export|eksportilo]]. Konservu ĝin sur via persona komputilo kaj poste alŝutu ĝin tien ĉi.',
@@ -2885,8 +2937,12 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'import-invalid-interwiki' => 'Ne povas importi de la specifita vikio.',
 'import-error-edit' => 'Paĝo "$1" ne estas importita ĉar vi ne rajtas radakti ĝin.',
 'import-error-create' => 'Paĝo "$1" ne estas importita ĉar vi ne rajtas krei ĝin.',
+'import-error-interwiki' => 'Paĝo "$1" ne estis importita pro sia nomo estas deklarita por ekstera ligado (intervikia).',
 'import-error-special' => 'Paĝo "$1" ne estas importata, ĉar ĝi apartenas al speciala nomspaco, kiu ne permesas paĝojn.',
 'import-error-invalid' => 'Paĝo "$1" ne estas importata, ĉar ĝia nomo estas malvalida.',
+'import-options-wrong' => '{{PLURAL:$2|Erara elekto|Eraraj elektoj}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'La provizita paĝo havas nevalidan titolon.',
+'import-rootpage-nosubpage' => 'La nomspaco "$1" de la radikopaĝo ne permesas subpaĝoj.',
 
 # Import log
 'importlogpage' => 'Protokolo de importaĵoj',
@@ -2900,6 +2956,9 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'javascripttest' => 'Ĝavoskripta testado',
 'javascripttest-disabled' => 'Ĉi tiu funkcio estas malŝaltita en ĉi tiu vikio.',
 'javascripttest-title' => 'Irigante $1 testoj',
+'javascripttest-pagetext-noframework' => 'Ĉi tiu paĝo estas konservita por funkciigi testojn de JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Nekonta test-framo "$1".',
+'javascripttest-pagetext-frameworks' => 'Bonvolu elekti unu el la jenaj test-framoj: $1',
 'javascripttest-pagetext-skins' => 'Elektu kun kio etoso irigi la testojn:',
 'javascripttest-qunit-intro' => 'Vidu [$1 testa dokumentaro] en mediawiki.org.',
 'javascripttest-qunit-heading' => 'Testaro QUnit por JavaScript de MediaWiki',
@@ -3031,19 +3090,21 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'spambot_username' => 'Trudmesaĝa forigo de MediaWiki',
 'spam_reverting' => 'Restarigo de lasta versio ne entenante ligilojn al $1',
 'spam_blanking' => 'Forviŝo de ĉiuj versioj entenantaj ligilojn al $1',
+'spam_deleting' => 'Ĉiuj versioj enhavis ligilojn al $1 - forigante',
 
 # Info page
 'pageinfo-title' => 'Informoj por "$1"',
-'pageinfo-header-edits' => 'Redaktoj',
-'pageinfo-header-watchlist' => 'Atentaro',
-'pageinfo-header-views' => 'Rigardoj',
-'pageinfo-subjectpage' => 'Paĝo',
-'pageinfo-talkpage' => 'Diskuto-paĝo',
-'pageinfo-watchers' => 'Nombro de atentantoj',
-'pageinfo-edits' => 'Nombro de redaktoj',
-'pageinfo-authors' => 'Nombro de distingaj aŭtoroj',
+'pageinfo-header-basic' => 'Baza informo',
+'pageinfo-header-edits' => 'Historio de redaktoj',
+'pageinfo-robot-index' => 'Indeksebla',
+'pageinfo-robot-noindex' => 'Ne indeksebla',
 'pageinfo-views' => 'Nombro de rigardoj',
-'pageinfo-viewsperedit' => 'Po rigardoj por redakto',
+'pageinfo-watchers' => 'Nombro de paĝatentantoj',
+'pageinfo-lastuser' => 'Lasta redaktoro',
+'pageinfo-lasttime' => 'Dato de lasta redakto',
+'pageinfo-edits' => 'Tuta nombro de redaktoj',
+'pageinfo-authors' => 'Tuta nombro de malsamaj aŭtoroj',
+'pageinfo-recent-authors' => 'Lasta nombro de malsamaj aŭtoroj',
 
 # Skin names
 'skinname-standard' => 'Klasiko',
@@ -3134,7 +3195,7 @@ La komenca ligilo de linio devas esti ligilo al malbona bildo.
 Sekvaj ligilo en la sama linio estas konsiderata kiel esceptoj (paĝoj kiel la bildo rajtas esti montrata.)',
 
 # Metadata
-'metadata' => 'Metadatenoj',
+'metadata' => 'Metadatumoj',
 'metadata-help' => 'Ĉi tiu dosiero enhavas plian informon, verŝajne aldonitan de la cifereca fotilo aŭ skanilo uzita por krei aŭ skani ĝin. Se la dosiero estis modifita de sia originala stato, iuj detaloj eble ne konformos al efektiva stato de la modifita bildo.',
 'metadata-expand' => 'Montri etendajn detalojn',
 'metadata-collapse' => 'Kaŝi etendajn detalojn',
@@ -3736,6 +3797,9 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
 'version-software' => 'Instalita programaro',
 'version-software-product' => 'Produkto',
 'version-software-version' => 'Versio',
+'version-entrypoints' => 'Eniropunktaj URL-oj',
+'version-entrypoints-header-entrypoint' => 'Eniropunkto',
+'version-entrypoints-header-url' => 'Retadreso',
 
 # Special:FilePath
 'filepath' => 'Vojo al dosiero',
@@ -3763,7 +3827,7 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 * <span class="mw-specialpagecached">Memorkaŝitaj specialaj paĝoj (eble malaktualaj).</span>',
 'specialpages-group-maintenance' => 'Raportoj pri prizorgado',
 'specialpages-group-other' => 'Aliaj specialaj paĝoj',
-'specialpages-group-login' => 'Ensaluti / Krei novan konton',
+'specialpages-group-login' => 'Ensaluti /  registriĝi',
 'specialpages-group-changes' => 'Lastaj ŝanĝoj kaj protokoloj',
 'specialpages-group-media' => 'Raportoj pri dosieroj kaj alŝutoj',
 'specialpages-group-users' => 'Uzantoj kaj rajtoj',
@@ -3897,9 +3961,12 @@ Aŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la pa
 'api-error-empty-file' => 'La dosiero kiun vi sendis estis malplena.',
 'api-error-emptypage' => 'Kreo de novaj malplenaj paĝoj ne estas permesita.',
 'api-error-fetchfileerror' => 'Interna eraro: io misfunkciis dum la dosiera prenado.',
+'api-error-fileexists-forbidden' => 'Dosiero nomata "$1" jam existas kaj ne estas surskribebla.',
+'api-error-fileexists-shared-forbidden' => 'Dosiero nomata "$1" jam existas en la kunhavata dosier-datumbazo kaj ne estas surskribebla.',
 'api-error-file-too-large' => 'La dosiero kiun vi alŝutis estis tro granda.',
 'api-error-filename-tooshort' => 'La dosiernomo estas tro mallonga.',
 'api-error-filetype-banned' => 'Ĉi tiu tipo de dosiero estas malpermesita.',
+'api-error-filetype-banned-type' => '$1 ne estas {{PLURAL:$4|permesita dosiero-tipo|permesitaj dosiero-tipoj}}. {{PLURAL:$3|Permesita dosiero-tipo|Permesitaj dosiero-tipoj}} estas $2.',
 'api-error-filetype-missing' => 'Mankas sufikso de la dosiero.',
 'api-error-hookaborted' => 'La ŝanĝo kiun vi provis fari estis haltigita de etendaĵa hoko.',
 'api-error-http' => 'Interna eraro: ne eblas konektiĝi al la servilo.',
@@ -3924,4 +3991,15 @@ Aŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la pa
 'api-error-uploaddisabled' => 'Alŝutato estas malebligata en tiu ĉi vikio.',
 'api-error-verification-error' => 'Tiu ĉi dosiero eble estas difektita, aŭ havas la malĝustan dosieran finaĵon.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekundo|sekundoj}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|minutoj}}',
+'duration-hours' => '$1 {{PLURAL:$1|horo|horoj}}',
+'duration-days' => '$1 {{PLURAL:$1|tago|tagoj}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semajno|$1 semajnoj}}',
+'duration-years' => '$1 {{PLURAL:$1|jaro|jaroj}}',
+'duration-decades' => '$1 {{PLURAL:$1|jardeko|jardekoj}}',
+'duration-centuries' => '$1 {{PLURAL:$1|jarcento|jarcentoj}}',
+'duration-millennia' => '$1 {{PLURAL:$1|jarmilo|jarmiloj}}',
+
 );
index c5e3988..c36b38e 100644 (file)
@@ -7,10 +7,12 @@
  * @ingroup Language
  * @file
  *
+ * @author -jem-
  * @author Aleator
  * @author Alhen
  * @author Alpertron
  * @author Alvaro qc
+ * @author Amire80
  * @author Armando-Martin
  * @author Ascánder
  * @author Baiji
  * @author Invadinado
  * @author Jatrobat
  * @author Jens Liebenau
+ * @author Jewbask
  * @author Jurock
  * @author Kaganer
+ * @author Larjona
  * @author Lin linao
  * @author Linterweb
  * @author Locos epraix
@@ -66,6 +70,7 @@
  * @author Richard Wolf VI
  * @author Sanbec
  * @author Savh
+ * @author Shirayuki
  * @author Spacebirdy
  * @author Technorum
  * @author The Evil IP address
@@ -126,7 +131,7 @@ $specialPageAliases = array(
        'ChangeEmail'               => array( 'CambiarEmail', 'CambiarCorreo' ),
        'ChangePassword'            => array( 'Cambiar_contraseña', 'CambiarContraseña', 'ResetearContraseña', 'Resetear_contraseña' ),
        'ComparePages'              => array( 'CompararPáginas' ),
-       'Confirmemail'              => array( 'ConfirmarEmail', 'Confirmar_e-mail' ),
+       'Confirmemail'              => array( 'ConfirmarEmail', 'Confirmar_correo_electrónico' ),
        'Contributions'             => array( 'Contribuciones' ),
        'CreateAccount'             => array( 'Crear_una_cuenta', 'CrearCuenta' ),
        'Deadendpages'              => array( 'PáginasSinSalida', 'Páginas_sin_salida' ),
@@ -140,7 +145,7 @@ $specialPageAliases = array(
        'FileDuplicateSearch'       => array( 'BuscarArchivosDuplicados', 'Buscar_archivos_duplicados' ),
        'Filepath'                  => array( 'RutaDeArchivo', 'Ruta_de_archivo' ),
        'Import'                    => array( 'Importar' ),
-       'Invalidateemail'           => array( 'InvalidarEmail', 'Invalidar_e-mail' ),
+       'Invalidateemail'           => array( 'InvalidarEmail', 'Invalidar_correo_electrónico' ),
        'BlockList'                 => array( 'UsuariosBloqueados', 'Lista_de_usuarios_bloqueados' ),
        'LinkSearch'                => array( 'BúsquedaDeEnlaces', 'Búsqueda_de_enlaces' ),
        'Listadmins'                => array( 'ListaDeAdministradores', 'Lista_de_administradores' ),
@@ -169,6 +174,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'NuevasImágenes', 'Nuevas_imágenes' ),
        'Newpages'                  => array( 'PáginasNuevas', 'Páginas_nuevas' ),
        'PasswordReset'             => array( 'RestablecerContraseña' ),
+       'PermanentLink'             => array( 'EnlacePermanente' ),
        'Popularpages'              => array( 'PáginasMásVisitadas', 'PáginasPopulares', 'Páginas_más_visitadas' ),
        'Preferences'               => array( 'Preferencias' ),
        'Prefixindex'               => array( 'PáginasPorPrefijo', 'Páginas_por_prefijo' ),
@@ -211,125 +217,132 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__NOTDC__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__NOGALERÍA__', '__NOGALERIA__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__TDC__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__NOTÍTULO__', '__NOTITULO__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'MESACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MESACTUAL1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'MESACTUALCOMPLETO', 'NOMBREMESACTUAL', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'MESACTUALGENITIVO', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'MESACTUALABREVIADO', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'DÍAACTUAL', 'DIAACTUAL', 'DÍA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'DÍAACTUAL2', 'DIAACTUAL2', 'DÍA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NOMBREDÍAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'TIEMPOACTUAL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MESLOCAL', 'MESLOCAL2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'MESLOCALCOMPLETO', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'MESLOCALGENITIVO', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'DÍALOCAL', 'DIALOCAL', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'DIALOCAL2', 'DÍALOCAL2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NOMBREDIALOCAL', 'NOMBREDÍALOCAL', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'AÑOLOCAL', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'HORAMINUTOSLOCAL', 'TIEMPOLOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NÚMERODEPÁGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NÚMERODEARTÍCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'NOMBREDEPAGINA', 'NOMBREDEPÁGINA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NOMBREDEPAGINAC', 'NOMBREDEPÁGINAC', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ESPACIODENOMBRE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ESPACIODEDISCUSION', 'ESPACIODEDISCUSIÓN', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÍCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÍCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'NOMBRECOMPLETODEPÁGINA', 'NOMBRECOMPLETODEPAGINA', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÁGINAC', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÁGINA', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÁGINAC', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NOMBREDEPAGINABASE', 'NOMBREDEPÁGINABASE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NOMBREDEPAGINABASEC', 'NOMBREDEPÁGINABASEC', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NOMBREDEPÁGINADEDISCUSIÓN', 'NOMBREDEPAGINADEDISCUSION', 'NOMBREDEPAGINADISCUSION', 'NOMBREDEPÁGINADISCUSIÓN', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NOMBREDEPÁGINADEDISCUSIÓNC', 'NOMBREDEPAGINADEDISCUSIONC', 'NOMBREDEPAGINADISCUSIONC', 'NOMBREDEPÁGINADISCUSIÓNC', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÁGINADETEMA', 'NOMBREDEPÁGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÁGINADEARTÍCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÁGINADETEMAC', 'NOMBREDEPÁGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÁGINADEARTÍCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'MSJ:', 'MSG:' ),
-       'img_thumbnail'           => array( '1', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'derecha', 'dcha', 'der', 'right' ),
-       'img_left'                => array( '1', 'izquierda', 'izda', 'izq', 'left' ),
-       'img_none'                => array( '1', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
-       'img_center'              => array( '1', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'sinmarco', 'sin_enmarcar', 'sinenmarcar', 'frameless' ),
-       'img_page'                => array( '1', 'pagina=$1', 'página=$1', 'pagina_$1', 'página_$1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'borde', 'border' ),
-       'img_link'                => array( '1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'NOMBREDELSITIO', 'SITENAME' ),
-       'ns'                      => array( '0', 'EN:', 'NS:' ),
-       'localurl'                => array( '0', 'URLLOCAL', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URLLOCALC:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'SERVIDOR', 'SERVER' ),
-       'servername'              => array( '0', 'NOMBRESERVIDOR', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'RUTAESTILO', 'RUTADEESTILO', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMATICA:', 'GRAMÁTICA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GÉNERO:', 'GENERO:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__NOCONVERTIRTITULO__', '__NOCONVERTIRTÍTULO__', '__NOCT___', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__NOCONVERTIRCONTENIDO__', '__NOCC___', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'SEMANAACTUAL', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'DDSACTUAL', 'DIADESEMANAACTUAL', 'DÍADESEMANAACTUAL', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'DDSLOCAL', 'DIADESEMANALOCAL', 'DÍADESEMANALOCAL', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDDEREVISION', 'IDREVISION', 'IDDEREVISIÓN', 'IDREVISIÓN', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'DIADEREVISION', 'DIAREVISION', 'DÍADEREVISIÓN', 'DÍAREVISIÓN', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'DIADEREVISION2', 'DIAREVISION2', 'DÍADEREVISIÓN2', 'DÍAREVISIÓN2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
-       'fullurl'                 => array( '0', 'URLCOMPLETA:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLCOMPLETAC:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MINUS:', 'MINÚS:', 'LC:' ),
-       'uc'                      => array( '0', 'MAYUS:', 'MAYÚS:', 'UC:' ),
-       'displaytitle'            => array( '1', 'MOSTRARTÍTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__VINCULARANUEVASECCION__', 'VÍNCULARANUEVASECCIÓN__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__NOVINCULARANUEVASECCION__', 'NOVÍNCULARANUEVASECCIÓN__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'CODIFICARURL:', 'URLENCODE:' ),
-       'currenttimestamp'        => array( '1', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'numberofadmins'          => array( '1', 'NÚMEROADMINIISTRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
-       'special'                 => array( '0', 'especial', 'special' ),
-       'defaultsort'             => array( '1', 'ORDENAR:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÍAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'etiqueta', 'ETIQUETA', 'tag' ),
-       'hiddencat'               => array( '1', '__CATEGORÍAOCULTA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PÁGINASENCATEGORÍA', 'PÁGINASENCAT', 'PAGSENCAT', 'PAGINASENCATEGORIA', 'PAGINASENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'TAMAÑOPÁGINA', 'TAMAÑODEPÁGINA', 'TAMAÑOPAGINA', 'TAMAÑODEPAGINA', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEXAR__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__NOINDEXAR__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÁTICA__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'formatodefecha', 'formatearfecha', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__SIN_TDC__', '__NOTDC__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__SIN_GALERÍA__', '__NOGALERÍA__', '__NOGALERIA__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORZAR_TDC__', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__TDC__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__NO_EDITAR_SECCIÓN__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__SIN_TÍTULO__', '__SINTÍTULO__', '__NOTÍTULO__', '__NOTITULO__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'MESACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'MESACTUAL1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'MESACTUALCOMPLETO', 'NOMBREMESACTUAL', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'MESACTUALGENITIVO', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'MESACTUALABREVIADO', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'DÍAACTUAL', 'DIAACTUAL', 'DÍA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'DÍAACTUAL2', 'DIAACTUAL2', 'DÍA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NOMBREDÍAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'TIEMPOACTUAL', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MESLOCAL', 'MESLOCAL2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'MESLOCALCOMPLETO', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'MESLOCALGENITIVO', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'DÍALOCAL', 'DIALOCAL', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'DIALOCAL2', 'DÍALOCAL2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NOMBREDIALOCAL', 'NOMBREDÍALOCAL', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'AÑOLOCAL', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'HORAMINUTOSLOCAL', 'TIEMPOLOCAL', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NÚMERODEPÁGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NÚMERODEARTÍCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'NOMBREDEPAGINA', 'NOMBREDEPÁGINA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NOMBREDEPAGINAC', 'NOMBREDEPÁGINAC', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ESPACIODENOMBRE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'NÚMERODELESPACIO', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'ESPACIODEDISCUSION', 'ESPACIODEDISCUSIÓN', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÍCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÍCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NOMBRECOMPLETODEPÁGINA', 'NOMBRECOMPLETODEPAGINA', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÁGINAC', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÁGINA', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÁGINAC', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NOMBREDEPAGINABASE', 'NOMBREDEPÁGINABASE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NOMBREDEPAGINABASEC', 'NOMBREDEPÁGINABASEC', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NOMBREDEPÁGINADEDISCUSIÓN', 'NOMBREDEPAGINADEDISCUSION', 'NOMBREDEPAGINADISCUSION', 'NOMBREDEPÁGINADISCUSIÓN', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NOMBREDEPÁGINADEDISCUSIÓNC', 'NOMBREDEPAGINADEDISCUSIONC', 'NOMBREDEPAGINADISCUSIONC', 'NOMBREDEPÁGINADISCUSIÓNC', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÁGINADETEMA', 'NOMBREDEPÁGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÁGINADEARTÍCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÁGINADETEMAC', 'NOMBREDEPÁGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÁGINADEARTÍCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'MSJ:', 'MSG:' ),
+       'subst'                     => array( '0', 'SUST:', 'FIJAR:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'derecha', 'dcha', 'der', 'right' ),
+       'img_left'                  => array( '1', 'izquierda', 'izda', 'izq', 'left' ),
+       'img_none'                  => array( '1', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
+       'img_center'                => array( '1', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'sinmarco', 'sin_enmarcar', 'sinenmarcar', 'frameless' ),
+       'img_page'                  => array( '1', 'pagina=$1', 'página=$1', 'pagina_$1', 'página_$1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'borde', 'border' ),
+       'img_link'                  => array( '1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'NOMBREDELSITIO', 'SITENAME' ),
+       'ns'                        => array( '0', 'EN:', 'NS:' ),
+       'localurl'                  => array( '0', 'URLLOCAL', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URLLOCALC:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'SERVIDOR', 'SERVER' ),
+       'servername'                => array( '0', 'NOMBRESERVIDOR', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'RUTAESTILO', 'RUTADEESTILO', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMATICA:', 'GRAMÁTICA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GÉNERO:', 'GENERO:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__NOCONVERTIRTITULO__', '__NOCONVERTIRTÍTULO__', '__NOCT___', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__NOCONVERTIRCONTENIDO__', '__NOCC___', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'SEMANAACTUAL', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'DDSACTUAL', 'DIADESEMANAACTUAL', 'DÍADESEMANAACTUAL', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'DDSLOCAL', 'DIADESEMANALOCAL', 'DÍADESEMANALOCAL', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDDEREVISION', 'IDREVISION', 'IDDEREVISIÓN', 'IDREVISIÓN', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'DIADEREVISION', 'DIAREVISION', 'DÍADEREVISIÓN', 'DÍAREVISIÓN', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'DIADEREVISION2', 'DIAREVISION2', 'DÍADEREVISIÓN2', 'DÍAREVISIÓN2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
+       'fullurl'                   => array( '0', 'URLCOMPLETA:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLCOMPLETAC:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'URLCANONICA:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'URLCANONICAC:', 'CANONICALURLE:' ),
+       'lcfirst'                   => array( '0', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MINUS:', 'MINÚS:', 'LC:' ),
+       'uc'                        => array( '0', 'MAYUS:', 'MAYÚS:', 'UC:' ),
+       'raw'                       => array( '0', 'SINFORMATO', 'SINPUNTOS', 'RAW:' ),
+       'displaytitle'              => array( '1', 'MOSTRARTÍTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'SF', 'R' ),
+       'newsectionlink'            => array( '1', '__VINCULARANUEVASECCION__', 'VÍNCULARANUEVASECCIÓN__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__NOVINCULARANUEVASECCION__', 'NOVÍNCULARANUEVASECCIÓN__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'CODIFICARURL:', 'URLENCODE:' ),
+       'currenttimestamp'          => array( '1', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PÁGINASENESPACIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NÚMEROADMINIISTRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
+       'special'                   => array( '0', 'especial', 'special' ),
+       'defaultsort'               => array( '1', 'ORDENAR:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÍAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'etiqueta', 'tag' ),
+       'hiddencat'                 => array( '1', '__CATEGORÍAOCULTA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PÁGINASENCATEGORÍA', 'PÁGINASENCAT', 'PAGSENCAT', 'PAGINASENCATEGORIA', 'PAGINASENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'TAMAÑOPÁGINA', 'TAMAÑODEPÁGINA', 'TAMAÑOPAGINA', 'TAMAÑODEPAGINA', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEXAR__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NOINDEXAR__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÁTICA__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'formatodefecha', 'formatearfecha', 'formatdate', 'dateformat' ),
 );
 
 $datePreferences = false;
@@ -351,7 +364,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ocultar ediciones patrulladas en los cambios recientes',
 'tog-newpageshidepatrolled' => 'Ocultar páginas patrulladas de la lista de páginas nuevas',
 'tog-extendwatchlist' => 'Expandir la lista de seguimiento a todos los cambios, no sólo a los más recientes.',
-'tog-usenewrc' => 'Cambios recientes mejorados (requiere JavaScript)',
+'tog-usenewrc' => 'Agrupar los cambios por página en los cambios recientes y en la lista de vigilancia (requiere JavaScript)',
 'tog-numberheadings' => 'Numerar automáticamente los encabezados',
 'tog-showtoolbar' => 'Mostrar la barra de edición (requiere JavaScript)',
 'tog-editondblclick' => 'Editar páginas con doble clic (requiere JavaScript)',
@@ -359,17 +372,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Habilitar la edición de secciones presionando el botón de la derecha en los títulos de secciones (requiere JavaScript)',
 'tog-showtoc' => 'Mostrar el índice (para páginas con más de 3 encabezados)',
 'tog-rememberpassword' => 'Recordar mi nombre de usuario y contraseña entre sesiones en este navegador (por un máximo de $1 {{PLURAL:$1|día|días}})',
-'tog-watchcreations' => 'Vigilar las páginas que yo cree',
-'tog-watchdefault' => 'Vigilar las páginas que yo modifique',
-'tog-watchmoves' => 'Vigilar las páginas que renombre',
-'tog-watchdeletion' => 'Vigilar las páginas que borre',
+'tog-watchcreations' => 'Añadir las páginas que cree y los archivos que cargue a mi lista de vigilancia',
+'tog-watchdefault' => 'Añadir la páginas y archivos que edite a mi lista de vigilancia',
+'tog-watchmoves' => 'Añadir las páginas y archivos que mueva a mi lista de vigilancia',
+'tog-watchdeletion' => 'Añadir la páginas y archivos que borre a mi lista de vigilancia',
 'tog-minordefault' => 'Marcar todas las ediciones como menores de manera predeterminada',
 'tog-previewontop' => 'Mostrar previsualización antes del cuadro de edición',
 'tog-previewonfirst' => 'Mostrar previsualización en la primera edición',
 'tog-nocache' => 'Desactivar la caché de páginas del navegador',
-'tog-enotifwatchlistpages' => 'Enviarme un correo electrónico cuando se modifique una página en mi lista de seguimiento',
+'tog-enotifwatchlistpages' => 'Enviarme un correo electrónico cuando se modifique una página o un archivo de mi lista de seguimiento',
 'tog-enotifusertalkpages' => 'Enviarme un correo electrónico cuando se modifique mi página de discusión',
-'tog-enotifminoredits' => 'Notificarme también los cambios menores de páginas',
+'tog-enotifminoredits' => 'Notificarme también por correo electrónico los cambios menores de las páginas y archivos',
 'tog-enotifrevealaddr' => 'Revelar mi dirección de correo electrónico en los correos de notificación',
 'tog-shownumberswatching' => 'Mostrar el número de usuarios que la vigilan',
 'tog-oldsig' => 'Firma actual:',
@@ -378,14 +391,13 @@ $messages = array(
 'tog-externaldiff' => 'Utilizar diff externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
 'tog-showjumplinks' => 'Habilitar enlaces de accesibilidad «saltar a»',
 'tog-uselivepreview' => 'Usar live preview (JavaScript) (Experimental)',
-'tog-forceeditsummary' => 'Alertar al grabar sin resumen de edición.',
+'tog-forceeditsummary' => 'Avisar cuando grabe la página sin introducir un resumen de edición',
 'tog-watchlisthideown' => 'Ocultar mis ediciones en la lista de seguimiento',
 'tog-watchlisthidebots' => 'Ocultar ediciones de bots en la lista de seguimiento',
 'tog-watchlisthideminor' => 'Ocultar ediciones menores en la lista de seguimiento',
 'tog-watchlisthideliu' => 'Ocultar ediciones de usuarios registrados en la lista de seguimiento',
 'tog-watchlisthideanons' => 'Ocultar ediciones de usuarios anónimos en la lista de seguimiento',
 'tog-watchlisthidepatrolled' => 'Ocultar las ediciones patrulladas en la lista de seguimiento',
-'tog-nolangconversion' => 'Deshabilitar conversión de lenguajes',
 'tog-ccmeonemails' => 'Recibir copias de los correos que envío a otros usuarios',
 'tog-diffonly' => 'No mostrar el contenido de la página bajo las diferencias',
 'tog-showhiddencats' => 'Mostrar categorías escondidas',
@@ -560,7 +572,7 @@ $messages = array(
 'categorypage' => 'Ver página de categoría',
 'viewtalkpage' => 'Ver discusión',
 'otherlanguages' => 'Otros idiomas',
-'redirectedfrom' => '(Redirigido desde $1)',
+'redirectedfrom' => '(Redirigido desde «$1»)',
 'redirectpagesub' => 'Página redirigida',
 'lastmodifiedat' => 'Esta página fue modificada por última vez el $1, a las $2.',
 'viewcount' => 'Esta página ha sido visitada {{PLURAL:$1|una vez|$1 veces}}.',
@@ -598,7 +610,7 @@ $1',
 'privacypage' => 'Project:Política de protección de datos',
 
 'badaccess' => 'Error de permisos',
-'badaccess-group0' => 'No tienes autorización para ejecutar la acción que ha solicitado.',
+'badaccess-group0' => 'No estás autorizado a ejecutar la acción solicitada.',
 'badaccess-groups' => 'La acción que has solicitado está restringida a los usuarios {{PLURAL:$2|del grupo|de uno de estos $2 grupos}}: $1.',
 
 'versionrequired' => 'La versión $1 de MediaWiki es necesaria para utilizar esta página',
@@ -609,6 +621,10 @@ $1',
 'youhavenewmessages' => 'Tienes $1 ($2).',
 'newmessageslink' => 'mensajes nuevos',
 'newmessagesdifflink' => 'última modificación',
+'youhavenewmessagesfromusers' => 'Tienes $1 de {{PLURAL:$3|otro usuario|$3 usuarios}} ($2).',
+'youhavenewmessagesmanyusers' => 'Tienes $1 de muchos usuarios ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|un nuevo mensaje|mensajes nuevos}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|última modificación|últimos cambios}}',
 'youhavenewmessagesmulti' => 'Tienes nuevos mensajes en $1',
 'editsection' => 'editar',
 'editold' => 'editar',
@@ -662,9 +678,9 @@ Puedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:
 'dberrortext' => 'Ha ocurrido un error de sintaxis en una consulta a la base de datos.
 Esto puede indicar un error en el software.
 La última consulta a la base de datos que se intentó fue:
-<blockquote><tt>$1</tt></blockquote>
-dentro de la función «<tt>$2</tt>».
-La base de datos devolvió el error «<tt>$3: $4</tt>».',
+<blockquote><code>$1</code></blockquote>
+dentro de la función "<code>$2</code>".
+La base de datos devolvió el error "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Ha ocurrido un error de sintaxis en una consulta a la base de datos.
 La última consulta a la base de datos que se intentó fue:
 «$1»
@@ -702,6 +718,7 @@ Por favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de
 'cannotdelete' => 'La página o archivo «$1» no se pudo borrar.
 Puede que ya haya sido borrado por alguien más.',
 'cannotdelete-title' => 'No se puede borrar la página «$1»',
+'delete-hook-aborted' => 'La modificación que intentaste hacer fue cancelada por un gancho de extensión. No hay explicación disponible.',
 'badtitle' => 'Título incorrecto',
 'badtitletext' => 'El título de la página solicitada está vacío, no es válido, o es un enlace interidioma o interwiki incorrecto.
 Puede que contenga uno o más caracteres que no se pueden usar en los títulos.',
@@ -733,6 +750,8 @@ El motivo dado fue: "\'\'$2\'\'".',
 El administrador que lo ha bloqueado ofrece esta explicación: "$3".',
 'invalidtitle-knownnamespace' => 'Título no válido con el espacio de nombres "$2" y el texto "$3"',
 'invalidtitle-unknownnamespace' => 'Título no válido con número de espacio de nombres desconocido  $1  y el texto "$2"',
+'exception-nologin' => 'No has iniciado sesión',
+'exception-nologin-text' => 'Esta página o acción requiere que inicies sesión en este wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Error de configuración: Antivirus desconocido: ''$1''",
@@ -754,6 +773,7 @@ No olvides personalizar [[Special:Preferences|tus preferencias]].',
 'remembermypassword' => 'Mantenerme conectado en este navegador (hasta $1 {{PLURAL:$1|día|días}})',
 '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.',
 'externaldberror' => 'Hubo un error de autenticación externa de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.',
 'login' => 'Iniciar sesión',
 'nav-login-createaccount' => 'Iniciar sesión / crear cuenta',
@@ -765,7 +785,7 @@ No olvides personalizar [[Special:Preferences|tus preferencias]].',
 'notloggedin' => 'No has iniciado sesión',
 'nologin' => '¿No tienes una cuenta? $1.',
 'nologinlink' => 'Crear una cuenta',
-'createaccount' => 'Crear cuenta',
+'createaccount' => 'Crear una cuenta',
 'gotaccount' => '¿Ya tienes una cuenta? $1.',
 'gotaccountlink' => 'Entrar',
 'userlogin-resetlink' => '¿Olvidaste tus datos de acceso?',
@@ -841,7 +861,7 @@ Puedes ignorar este mensaje si esta cuenta fue creada por error.',
 'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.',
 
 # E-mail sending
-'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP',
+'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP.',
 'user-mail-no-addy' => 'Se ha intentado enviar correo electrónico sin una dirección de correo electrónico.',
 
 # Change password dialog
@@ -976,10 +996,10 @@ La razón dada es esta:
 
 Puedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.
 
-Ten en cuenta de que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario»  a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.
+Ten en cuenta que no podrás utilizar la herramienta de «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y que el bloqueo no haya inhabilitado esta función.
 
 Tu actual dirección IP es $3, y el identificador del bloqueo es #$5.
-Por favor incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
+Por favor, incluye todos los datos mostrados aquí en cualquier consulta que hagas.",
 'blockednoreason' => 'no se ha especificado el motivo',
 'whitelistedittext' => 'Tienes que $1 para editar artículos.',
 'confirmedittext' => 'Debes confirmar tu dirección electrónica antes de editar páginas. Por favor, establece y valida una dirección electrónica a través de tus [[Special:Preferences|preferencias de usuario]].',
@@ -1005,6 +1025,10 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.',
 'noarticletext-nopermission' => 'Actualmente no hay texto en esta página.
 Puedes [[Special:Search/{{PAGENAME}}|buscar este título de página]] en otras páginas,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros relacionados]</span>.',
+'missing-revision' => 'La revisión #$1 de la página «{{PAGENAME}}» no existe.
+
+Esto suele deberse a seguir un enlace obsoleto hacia el historial de una página que ya ha sido borrada.
+Los detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrado].',
 'userpage-userdoesnotexist' => 'La cuenta de usuario «<nowiki>$1</nowiki>» no está registrada. Por favor comprueba si quieres crear o editar esta página.',
 'userpage-userdoesnotexist-view' => 'La cuenta de usuario «$1» no está registrada.',
 'blocked-notice-logextract' => 'Este usuario está actualmente bloqueado.
@@ -1013,7 +1037,6 @@ La última entrada del registro de bloqueos se proporciona debajo para mayor ref
 * '''Firefox / Safari:''' Mantén presionada ''Mayús'' mientras pulsas el botón ''Actualizar'', o presiona ''Ctrl+F5'' o ''Ctrl+R'' (''⌘+R'' en Mac)
 * '''Google Chrome:''' presiona ''Ctrl+Shift+R'' (''⌘+Mayús+R'' en Mac)
 * '''Internet Explorer:''' mantén presionada ''Ctrl'' mientras pulsas ''Actualizar'', o presiona ''Ctrl+F5''
-* '''Konqueror:''' pulsa ''Recargar'' o presiona ''F5''
 * '''Opera:''' vacía la caché en ''Herramientas → Preferencias''",
 'usercssyoucanpreview' => "'''Consejo:''' Usa el botón «{{int:showpreview}}» para probar el nuevo CSS antes de guardarlo.",
 'userjsyoucanpreview' => "'''Consejo:''' Usa el botón «{{int:showpreview}}» para probar el nuevo JS antes de guardarlo.",
@@ -1092,7 +1115,7 @@ Puede volver atrás y editar una página existente, [[Special:UserLogin|identifi
 'sectioneditnotsupported-text' => 'La edición de sección no es compatible con esta página.',
 'permissionserrors' => 'Errores de permisos',
 'permissionserrorstext' => 'No tienes permiso para hacer eso, por {{PLURAL:$1|el siguiente motivo|los siguientes motivos}}:',
-'permissionserrorstext-withaction' => 'No tienes permiso para $2, por los siguientes {{PLURAL:$1|motivo|motivos}}:',
+'permissionserrorstext-withaction' => 'No tienes permiso para $2, por {{PLURAL:$1|el siguiente motivo|los siguientes motivos}}:',
 'recreate-moveddeleted-warn' => "'''Atención: estás volviendo a crear una página que ha sido borrada anteriormente.'''
 
 Deberías considerar si es apropiado continuar editando esta página.
@@ -1130,6 +1153,7 @@ Ese o esos parámetros han sido omitidos.',
 'expansion-depth-exceeded-warning' => 'Página que ha superado la profundidad de expansión',
 'parser-unstrip-loop-warning' => 'Se ha detectado un bucle "unstrip"',
 'parser-unstrip-recursion-limit' => 'Se ha superado el límite de recursión de "unstrip" ($1)',
+'converter-manual-rule-error' => 'Error detectado en la regla de conversión manual del lenguaje',
 
 # "Undo" feature
 'undo-success' => 'La edición puede deshacerse. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así deshacer la edición.',
@@ -1318,6 +1342,10 @@ Nota que usar los enlaces de navegación borrará las selecciones de esta column
 'editundo' => 'deshacer',
 'diff-multi' => '(No se {{PLURAL:$1|muestra una edición intermedia realizada|muestran $1 ediciones intermedias realizadas}} por {{PLURAL:$2|un usuario|$2 usuarios}})',
 'diff-multi-manyusers' => '(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|un usuario|$2 usuarios}})',
+'difference-missing-revision' => 'No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de esta diferencia ($1).
+
+Esto suele deberse a seguir un enlace obsoleto hacia una página que ya ha sido borrada.
+Los detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrado].',
 
 # Search results
 'searchresults' => 'Resultados de la búsqueda',
@@ -1584,6 +1612,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'right-writeapi' => 'Hacer uso del API para escribir',
 'right-delete' => 'Borrar páginas',
 'right-bigdelete' => 'Borrar páginas con historiales grandes',
+'right-deletelogentry' => 'Borrar y recuperar entradas de registro específicas',
 'right-deleterevision' => 'Borrar y restaurar revisiones específicas de páginas',
 'right-deletedhistory' => 'Ver el historial de páginas borradas, sin el texto asociado',
 'right-deletedtext' => 'Ver texto borrado y cambios entre revisiones borradas',
@@ -1728,9 +1757,9 @@ Para ver o buscar archivos subidos con anterioridad, ve a la [[Special:FileList|
 Los archivos subidos quedarán registrados además en el [[Special:Log/upload|registro de archivos subidos]] y los borrados en el [[Special:Log/delete|registro de borrados]].
 
 Para incluir un archivo en una página, usa un enlace como los mostrados a continuación:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' para usar el fichero en tamaño completo
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto descriptivo]]</nowiki></tt>''' para una versión de 200 píxeles de ancho en una caja en el margen izquierdo con 'texto descriptivo' como descripción
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' para enlazar directamente al fichero sin mostrarlo.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' para usar el fichero en tamaño completo
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto descriptivo]]</nowiki></code>''' para una versión de 200 píxeles de ancho en una caja en el margen izquierdo con 'texto descriptivo' como descripción
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para enlazar directamente al fichero sin mostrarlo.",
 'upload-permitted' => 'Tipos de archivo permitidos: $1.',
 'upload-preferred' => 'Tipos de archivo preferidos: $1.',
 'upload-prohibited' => 'Tipos de archivo prohibidos: $1.',
@@ -1774,19 +1803,19 @@ Mira la [[Special:NewFiles|galería de archivos nuevos]] para una descripción v
 'largefileserver' => 'El tamaño de este archivo es mayor del que este servidor admite por configuración.',
 'emptyfile' => 'El archivo que has intentado subir parece estar vacío; por favor, verifica que realmente se trate del archivo que intentabas subir.',
 'windows-nonascii-filename' => 'Este wiki no admite nombres de archivo con caracteres especiales.',
-'fileexists' => "Ya existe un archivo con este nombre, por favor comprueba '''<tt>[[:$1]]</tt>''' si no estás seguro de querer cambiarlo.
-[[$1|thumb]]",
-'filepageexists' => "La página de descripción de este archivo ya ha sido creada en '''<tt>[[:$1]]</tt>''', pero no existe actualmente ningún fichero con este nombre.
+'fileexists' => 'Ya existe un archivo con este nombre, por favor comprueba <strong>[[:$1]]</strong> si no estás seguro de querer cambiarlo.
+[[$1|thumb]]',
+'filepageexists' => 'La página de descripción de este archivo ya ha sido creada en <strong>[[:$1]]</strong>, pero no existe actualmente ningún fichero con este nombre.
 El resumen que ha ingresado no aparecerá en la página de descripción. Para que el sumario aparezca, deberá editarlo manualmente.
-[[$1|thumb]]",
-'fileexists-extension' => "Existe un archivo con un nombre similar: [[$2|thumb]]
-* Nombre del archivo que se está subiendo: '''<tt>[[:$1]]</tt>'''
-* Nombre del archivo ya existente: '''<tt>[[:$2]]</tt>'''
-Por favor, elige un nombre diferente.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Existe un archivo con un nombre similar: [[$2|thumb]]
+* Nombre del archivo que se está subiendo: <strong>[[:$1]]</strong>
+* Nombre del archivo ya existente: <strong>[[:$2]]</strong>
+Por favor, elige un nombre diferente.',
 'fileexists-thumbnail-yes' => "El archivo parece ser una imagen de tamaño reducido ''(thumbnail)''. [[$1|thumb]]
-Por favor comprueba el archivo '''<tt>[[:$1]]</tt>'''.
+Por favor comprueba el archivo <strong>[[:$1]]</strong>.
 Si el archivo comprobado es la misma imagen a tamaño original no es necesario subir un thumbnail más.",
-'file-thumbnail-no' => "El nombre del archivo comienza con '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "El nombre del archivo comienza con <strong>$1</strong>.
 Parece ser una imagen de tamaño reducido ''(thumbnail)''.
 Si tiene esta imagen a toda resolución súbala, si no, por favor cambie el nombre del archivo.",
 'fileexists-forbidden' => 'Ya existe un archivo con este nombre, y no puede ser grabado encima de otro. Si quiere subir su archivo de todos modos, por favor vuelva atrás y utilice otro nombre. [[File:$1|thumb|center|$1]]',
@@ -1894,6 +1923,7 @@ $1',
 'lockmanager-fail-releaselock' => 'No se pudo liberar el bloqueo de "$1".',
 'lockmanager-fail-db-bucket' => 'No se pudo contactar con las suficientes bases de datos del conjunto $1.',
 'lockmanager-fail-db-release' => 'No se pudieron liberar los bloqueos registrados en la base de datos $1.',
+'lockmanager-fail-svr-acquire' => 'No se pudieron obtener bloqueos en el servidor $1.',
 'lockmanager-fail-svr-release' => 'No se pudieron liberar los bloqueos registrados en el servidor $1.',
 
 # ZipDirectoryReader
@@ -2013,6 +2043,7 @@ Tal vez desee editar la descripción de su [$2 página de descripción del archi
 'shared-repo-from' => 'de $1',
 'shared-repo' => 'un repositorio compartido',
 'filepage.css' => '/* Los estilos CSS colocados aquí se incluirán en las páginas de descripción de archivos, incluso en los wikis externos que incluyan estas páginas */',
+'upload-disallowed-here' => 'Lamentablemente no puedes sobrescribir esta imagen.',
 
 # File reversion
 'filerevert' => 'Revertir $1',
@@ -2047,7 +2078,7 @@ Tal vez desee editar la descripción de su [$2 página de descripción del archi
 # MIME search
 'mimesearch' => 'Búsqueda MIME',
 'mimesearch-summary' => 'Esta página permite el filtrado de ficheros por su tipo MIME.
-Entrada: contenttype/subtype, p. ej. <tt>image/jpeg</tt>.',
+Entrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.',
 'mimetype' => 'Tipo MIME:',
 'download' => 'descargar',
 
@@ -2093,8 +2124,8 @@ Entrada: contenttype/subtype, p. ej. <tt>image/jpeg</tt>.',
 
 'disambiguations' => 'Páginas que enlazan con páginas de desambiguación',
 'disambiguationspage' => 'Template:Desambiguación',
-'disambiguations-text' => "Las siguientes páginas enlazan con una '''página de desambiguación'''.
-En lugar de ello deberían enlazar con  el tema apropiado.<br />
+'disambiguations-text' => "Las siguientes páginas contienen al menos un enlace a una '''página de desambiguación'''.
+En lugar de ello deberían enlazar a una página más apropiada.<br />
 Una página es considerada página de desambiguación si utiliza la plantilla que está enlazada desde [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Redirecciones dobles',
@@ -2120,6 +2151,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categoría|categorías}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|enlace|enlaces}}',
 'nmembers' => '$1 {{PLURAL:$1|artículo|artículos}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisión|revisiones}}',
@@ -2148,6 +2180,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 'mostlinkedtemplates' => 'Plantillas más enlazadas',
 'mostcategories' => 'Páginas con más categorías',
 'mostimages' => 'Imágenes más usadas',
+'mostinterwikis' => 'Páginas con más interwikis',
 'mostrevisions' => 'Artículos con más ediciones',
 'prefixindex' => 'Todas las páginas con prefijo',
 'prefixindex-namespace' => 'Todas las páginas con el prefijo (espacio de nombres $1)',
@@ -2247,7 +2280,7 @@ Véase también las [[Special:WantedCategories|categorías requeridas]].',
 'linksearch-ok' => 'Buscar',
 'linksearch-text' => 'Se pueden usar caracteres comodín como "*.wikipedia.org".
 Es necesario, por lo menos, un dominio de nivel, por ejemplo "*.org".<br />
-Protocolos soportados: <tt>$1</tt> (no añada ninguno de estos en su búsqueda).',
+Protocolos soportados: <code>$1</code> (no añada ninguno de estos en su búsqueda).',
 'linksearch-line' => '$1 enlazado desde $2',
 'linksearch-error' => 'Los comodines sólo pueden aparecer al principio del nombre de sitio.',
 
@@ -2293,6 +2326,8 @@ Puede haber información adicional sobre privilegios individuales en [[{{MediaWi
 'mailnologin' => 'Ninguna dirección de envio',
 'mailnologintext' => 'Debes [[Special:UserLogin|iniciar sesión]] y tener una dirección electrónica válida en tus [[Special:Preferences|preferencias]] para enviar un correo electrónico a otros usuarios.',
 'emailuser' => 'Enviar correo electrónico a este usuario',
+'emailuser-title-target' => 'Enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}',
+'emailuser-title-notarget' => 'Enviar un correo electrónico al usuario',
 'emailpage' => 'Correo electrónico a usuario',
 'emailpagetext' => 'Puedes usar el formulario de abajo para enviar un correo electrónico a este usuario.
 La dirección electrónica que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el remitente para que el destinatario pueda responderte.',
@@ -2433,6 +2468,8 @@ Véase $2 para un registro de los borrados recientes.',
 'rollback' => 'Revertir ediciones',
 'rollback_short' => 'Revertir',
 'rollbacklink' => 'revertir',
+'rollbacklinkcount' => 'revertir $1 {{PLURAL:$1|edición|ediciones}}',
+'rollbacklinkcount-morethan' => 'revertir más de $1 {{PLURAL:$1|edición|ediciones}}',
 'rollbackfailed' => 'No se pudo revertir',
 'cantrollback' => 'No se puede revertir la edición;
 el último colaborador es el único autor de esta página.',
@@ -2798,7 +2835,7 @@ por favor, asegúrate de entender las consecuencias del procedimiento antes de s
 
 En estos casos, deberás trasladar manualmente el contenido de la página de discusión.",
 'movearticle' => 'Renombrar página',
-'moveuserpage-warning' => "'''Aviso:''' estás a punto de mover una página de usuario. Ten en cuenta de que solo la página será trasladada pero el usuario '''no''' será renombrado.",
+'moveuserpage-warning' => "'''Aviso:''' estás a punto de mover una página de usuario. Ten en cuenta que solo será trasladada la página; el usuario '''no''' será renombrado.",
 'movenologin' => 'No has iniciado sesión',
 'movenologintext' => 'Es necesario ser usuario registrado y [[Special:UserLogin|haber iniciado sesión]] para renombrar una página.',
 'movenotallowed' => 'No tienes permiso para mover páginas.',
@@ -2922,6 +2959,7 @@ Todas las importaciones transwiki se registran en el [[Special:Log/import|regist
 'import-interwiki-templates' => 'Incluir todas las plantillas',
 'import-interwiki-submit' => 'Importar',
 'import-interwiki-namespace' => 'Espacio de nombres de destino:',
+'import-interwiki-rootpage' => 'Página raíz del destino (opcional):',
 'import-upload-filename' => 'Nombre de archivo:',
 'import-comment' => 'Comentario:',
 'importtext' => 'Por favor, exporta el archivo desde el wiki de origen usando la [[Special:Export|herramienta de exportación]], guárdalo en tu disco y súbelo aquí.',
@@ -2956,6 +2994,9 @@ No hay un directorio temporal.',
 'import-error-interwiki' => 'La página "$1" no se ha importado porque su nombre está reservado para la vinculación externa (interwikis).',
 'import-error-special' => 'La página "$1" no se ha importado porque pertenece a un espacio de nombres especial que no admite páginas.',
 'import-error-invalid' => 'La página "$1" no se ha importado porque su nombre no es válido.',
+'import-options-wrong' => '{{PLURAL:$2|Opción errónea|Opciones erróneas}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'La página raíz dada es un título inválido.',
+'import-rootpage-nosubpage' => 'El espacio de nombres "$1" de la página raíz no permite subpáginas.',
 
 # Import log
 'importlogpage' => 'Registro de importaciones',
@@ -3109,16 +3150,35 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 
 # Info page
 'pageinfo-title' => 'Información para «$1»',
-'pageinfo-header-edits' => 'Ediciones',
-'pageinfo-header-watchlist' => 'Lista de seguimiento',
-'pageinfo-header-views' => 'Vistas',
-'pageinfo-subjectpage' => 'Página',
-'pageinfo-talkpage' => 'Página de discusión',
-'pageinfo-watchers' => 'Número de usuarios vigilándola',
-'pageinfo-edits' => 'Número de ediciones',
-'pageinfo-authors' => 'Número de autores distintos',
+'pageinfo-header-basic' => 'Información básica',
+'pageinfo-header-edits' => 'Historial de ediciones',
+'pageinfo-header-restrictions' => 'Protección de página',
+'pageinfo-header-properties' => 'Propiedades de página',
+'pageinfo-display-title' => 'Visualizar el título',
+'pageinfo-default-sort' => 'Criterio de ordenación predeterminado',
+'pageinfo-length' => 'Longitud de la página (en bytes)',
+'pageinfo-article-id' => 'Identificador ID de la página',
+'pageinfo-robot-policy' => 'Estado del motor de búsqueda',
+'pageinfo-robot-index' => 'Indexable',
+'pageinfo-robot-noindex' => 'No indexable',
 'pageinfo-views' => 'Número de vistas',
-'pageinfo-viewsperedit' => 'Vistas por edición',
+'pageinfo-watchers' => 'Número de usuarios que vigilan la página',
+'pageinfo-redirects-name' => 'Redirecciones a esta página',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Subpáginas de esta página',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirección|redirecciones}}; $3 {{PLURAL:$3|no-redirección|no-redirecciones}})',
+'pageinfo-firstuser' => 'Creador de la página',
+'pageinfo-firsttime' => 'Fecha de creación de la página',
+'pageinfo-lastuser' => 'Último editor',
+'pageinfo-lasttime' => 'Fecha de la última edición',
+'pageinfo-edits' => 'Número total de ediciones',
+'pageinfo-authors' => 'Número total de autores distintos',
+'pageinfo-recent-edits' => 'Número de ediciones recientes (en los últimos $1)',
+'pageinfo-recent-authors' => 'Número de autores distintos recientes',
+'pageinfo-restriction' => 'Protección de la página (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Palabra mágica|Palabras mágicas}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría oculta|Categorías ocultas}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|plantilla incluida|plantillas incluidas}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Estándar',
@@ -3174,6 +3234,7 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
 'file-info-size-pages' => '$1 × $2 píxeles, tamaño de archivo: $3, tipo MIME: $4, $5 {{PLURAL:$5|página|páginas}}',
 'file-nohires' => 'No disponible a mayor resolución.',
 'svg-long-desc' => 'archivo SVG, nominalmente $1 × $2 píxeles, tamaño de archivo: $3',
+'svg-long-desc-animated' => 'Archivo SVG animado, nominalmente de $1 × $2 píxeles, tamaño del archivo: $3',
 'show-big-image' => 'Resolución original',
 'show-big-image-preview' => 'Tamaño de esta previsualización: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Otra resolución|Otras resoluciones}}: $1.',
@@ -3183,6 +3244,8 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
 'file-info-png-looped' => 'bucleado',
 'file-info-png-repeat' => 'reproducido $1 {{PLURAL:$1|vez|veces}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|marco|marcos}}',
+'file-no-thumb-animation' => "'''Nota: debido a limitaciones técnicas, las miniaturas de este archivo no están animadas.'''",
+'file-no-thumb-animation-gif' => "'''Nota: Debido a limitaciones técnicas, las miniaturas de imágenes GIF de alta resolución como esta no están animadas.'''",
 
 # Special:NewFiles
 'newimages' => 'Galería de imágenes nuevas',
@@ -3293,11 +3356,11 @@ Existen otros campos que se mantendrán ocultos por defecto.
 'exif-meteringmode' => 'Modo de medición',
 'exif-lightsource' => 'Fuente de luz',
 'exif-flash' => 'Flash',
-'exif-focallength' => 'Longitud de la lente focal',
+'exif-focallength' => 'Longitud focal de la lente',
 'exif-subjectarea' => 'Área del sujeto',
 'exif-flashenergy' => 'Energía del flash',
-'exif-focalplanexresolution' => 'Resolución X plano focal',
-'exif-focalplaneyresolution' => 'Resolución Y plano focal',
+'exif-focalplanexresolution' => 'Resolución X del plano focal',
+'exif-focalplaneyresolution' => 'Resolución Y del plano focal',
 'exif-focalplaneresolutionunit' => 'Unidad de resolución del plano focal',
 'exif-subjectlocation' => 'Localización del sujeto',
 'exif-exposureindex' => 'Índice de exposición',
@@ -3334,7 +3397,7 @@ Existen otros campos que se mantendrán ocultos por defecto.
 'exif-gpstrackref' => 'Referencia para la dirección del movimiento',
 'exif-gpstrack' => 'Dirección del movimiento',
 'exif-gpsimgdirectionref' => 'Referencia de la dirección de imágen',
-'exif-gpsimgdirection' => 'Dirección de imágen',
+'exif-gpsimgdirection' => 'Dirección de imagen',
 'exif-gpsmapdatum' => 'Utilizados datos de medición geodésica',
 'exif-gpsdestlatituderef' => 'Referencia para la latitud del destino',
 'exif-gpsdestlatitude' => 'Destino de latitud',
@@ -3419,7 +3482,7 @@ Existen otros campos que se mantendrán ocultos por defecto.
 'exif-compression-3' => 'Codificación de fax CCITT grupo 3',
 'exif-compression-4' => 'Codificación de fax CCITT grupo 4',
 
-'exif-copyrighted-true' => 'Copyrighted',
+'exif-copyrighted-true' => 'Con derechos de autor',
 'exif-copyrighted-false' => 'Dominio público',
 
 'exif-unknowndate' => 'Fecha desconocida',
@@ -3849,7 +3912,7 @@ Las imágenes se muestran en resolución máxima, otros tipos de archivo se inic
 * <span class="mw-specialpagecached">Páginas especiales en caché (podrían ser obsoletas).</span>',
 'specialpages-group-maintenance' => 'Reportes de mantenimiento',
 'specialpages-group-other' => 'Otras páginas especiales',
-'specialpages-group-login' => 'Iniciar sesión / Registrarse',
+'specialpages-group-login' => 'Iniciar sesión / Crear cuenta',
 'specialpages-group-changes' => 'Cambios recientes y registros',
 'specialpages-group-media' => 'Páginas sobre archivos',
 'specialpages-group-users' => 'Usuarios y permisos',
@@ -3985,9 +4048,12 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'api-error-empty-file' => 'El archivo que enviaste estaba vacío.',
 'api-error-emptypage' => 'No se pueden crear páginas nuevas que estén vacías.',
 'api-error-fetchfileerror' => 'Error interno: Algo salió mal mientras se obtenía el archivo.',
+'api-error-fileexists-forbidden' => 'Ya existe el archivo "$1" y no se puede sobreescribir.',
+'api-error-fileexists-shared-forbidden' => 'Ya existe "$1" en el repositorio de archivos compartidos y no se puede sobreescribir.',
 'api-error-file-too-large' => 'El archivo que enviaste era demasiado grande.',
 'api-error-filename-tooshort' => 'El nombre de archivo es demasiado corto.',
 'api-error-filetype-banned' => 'Este tipo de archivo está prohibido.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|no es un tipo de archivo permitido|no son tipos de archivos permitidos}}. {{PLURAL:$3|El tipo de archivo permitido es|Los tipos de archivos permitidos son}} $2.',
 'api-error-filetype-missing' => 'El archivo no tiene extensión de archivo.',
 'api-error-hookaborted' => 'La modificación que intentaste hacer fue cancelada por un gancho de extensión.',
 'api-error-http' => 'Error interno: No se puede conectar al servidor.',
index 2f2e77e..276121a 100644 (file)
@@ -105,6 +105,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Uued_failid' ),
        'Newpages'                  => array( 'Uued_leheküljed' ),
        'PasswordReset'             => array( 'Parooli_lähtestamine' ),
+       'PermanentLink'             => array( 'Püsilink' ),
        'Popularpages'              => array( 'Loetumad_leheküljed' ),
        'Preferences'               => array( 'Eelistused' ),
        'Prefixindex'               => array( 'Kõik_pealkirjad_eesliitega' ),
@@ -158,99 +159,99 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#suuna', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__SISUKORRATA__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__GALERIITA__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__SISUKORDEES__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__SISUKORD__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__ALAOSALINGITA__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'HETKEKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'HETKEKUU1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'HETKEKUUNIMETUS', 'CURRENTMONTHNAME' ),
-       'currentday'              => array( '1', 'HETKEKUUPÄEV', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'HETKEKUUPÄEV2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'HETKENÄDALAPÄEV', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'HETKEAASTA', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'HETKEAEG', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'HETKETUND', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'KOHALIKKUU', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'KOHALIKKUU1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'KOHALIKKUUNIMETUS', 'LOCALMONTHNAME' ),
-       'localday'                => array( '1', 'KOHALIKKUUPÄEV', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'KOHALIKKUUPÄEV2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'KOHALIKNÄDALAPÄEV', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'KOHALIKAASTA', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'KOHALIKAEG', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'KOHALIKTUND', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'LEHEMÄÄR', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ARTIKLIMÄÄR', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'FAILIMÄÄR', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'KASUTAJAMÄÄR', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'TEGUSKASUTAJAMÄÄR', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'REDIGEERIMISMÄÄR', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'VAATAMISTEARV', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'LEHEKÜLJENIMI', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'LEHEKÜLJENIMI1', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NIMERUUM', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NIMERUUM1', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ARUTELUNIMERUUM', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ARUTELUNIMERUUM1', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'SISUNIMERUUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'SISUNIMERUUM1', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'KOGULEHEKÜLJENIMI', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'KOGULEHEKÜLJENIMI1', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ALAMLEHEKÜLJENIMI', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ALAMLEHEKÜLJENIMI1', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NIMERUUMITANIMI', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NIMERUUMITANIMI1', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ARUTELUNIMI', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'ARUTELUNIMI1', 'TALKPAGENAMEE' ),
-       'subst'                   => array( '0', 'ASENDA:', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'pisi', 'pisipilt', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'pisi=$1', 'pisipilt=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'paremal', 'right' ),
-       'img_left'                => array( '1', 'vasakul', 'left' ),
-       'img_none'                => array( '1', 'tühi', 'none' ),
-       'img_center'              => array( '1', 'keskel', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'raam', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'raamita', 'frameless' ),
-       'img_page'                => array( '1', 'lehekülg=$1', 'lehekülg_$1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'ääris', 'border' ),
-       'sitename'                => array( '1', 'KOHANIMI', 'SITENAME' ),
-       'ns'                      => array( '0', 'NR:', 'NS:' ),
-       'nse'                     => array( '0', 'NR1:', 'NSE:' ),
-       'localurl'                => array( '0', 'KOHALIKURL', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'KOHALIKURL1', 'LOCALURLE:' ),
-       'servername'              => array( '0', 'SERVERINIMI', 'SERVERNAME' ),
-       'gender'                  => array( '0', 'SUGU:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'HETKENÄDAL', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'HETKENÄDALAPÄEV1', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'KOHALIKNÄDAL', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'KOHALIKNÄDALAPÄEV1', 'LOCALDOW' ),
-       'fullurl'                 => array( '0', 'KOGUURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'KOGUURL1:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'ESIVT:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ESIST:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'VT:', 'LC:' ),
-       'uc'                      => array( '0', 'ST:', 'UC:' ),
-       'displaytitle'            => array( '1', 'PEALKIRI', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__UUEALAOSALINK__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__UUEALAOSALINGITA__', '__NONEWSECTIONLINK__' ),
-       'currenttimestamp'        => array( '1', 'HETKEAJATEMPEL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'KOHALIKAJATEMPEL', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#KEEL:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'VAIKEKEEL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'LEHEKÜLGINIMERUUMIS', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ÜLEMAMÄÄR', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ARVUVORMINDUS', 'FORMATNUM' ),
-       'defaultsort'             => array( '1', 'JÄRJESTA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'hiddencat'               => array( '1', '__PEIDETUDKAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'LEHEKÜLGIKATEGOORIAS', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'index'                   => array( '1', 'INDEKSIGA', '__INDEX__' ),
-       'noindex'                 => array( '1', 'INDEKSITA', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'KASUTAJAIDRÜHMAS', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'protectionlevel'         => array( '1', 'KAITSETASE', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'kuupäevavormindus', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#suuna', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__SISUKORRATA__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__GALERIITA__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__SISUKORDEES__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__SISUKORD__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__ALAOSALINGITA__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'HETKEKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'HETKEKUU1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'HETKEKUUNIMETUS', 'CURRENTMONTHNAME' ),
+       'currentday'                => array( '1', 'HETKEKUUPÄEV', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'HETKEKUUPÄEV2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'HETKENÄDALAPÄEV', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'HETKEAASTA', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'HETKEAEG', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'HETKETUND', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'KOHALIKKUU', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'KOHALIKKUU1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'KOHALIKKUUNIMETUS', 'LOCALMONTHNAME' ),
+       'localday'                  => array( '1', 'KOHALIKKUUPÄEV', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'KOHALIKKUUPÄEV2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'KOHALIKNÄDALAPÄEV', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'KOHALIKAASTA', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'KOHALIKAEG', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'KOHALIKTUND', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'LEHEMÄÄR', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ARTIKLIMÄÄR', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'FAILIMÄÄR', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'KASUTAJAMÄÄR', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'TEGUSKASUTAJAMÄÄR', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'REDIGEERIMISMÄÄR', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'VAATAMISTEARV', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'LEHEKÜLJENIMI', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'LEHEKÜLJENIMI1', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NIMERUUM', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NIMERUUM1', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ARUTELUNIMERUUM', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ARUTELUNIMERUUM1', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'SISUNIMERUUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'SISUNIMERUUM1', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'KOGULEHEKÜLJENIMI', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'KOGULEHEKÜLJENIMI1', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ALAMLEHEKÜLJENIMI', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ALAMLEHEKÜLJENIMI1', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NIMERUUMITANIMI', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NIMERUUMITANIMI1', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ARUTELUNIMI', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ARUTELUNIMI1', 'TALKPAGENAMEE' ),
+       'subst'                     => array( '0', 'ASENDA:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'pisi', 'pisipilt', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'pisi=$1', 'pisipilt=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'paremal', 'right' ),
+       'img_left'                  => array( '1', 'vasakul', 'left' ),
+       'img_none'                  => array( '1', 'tühi', 'none' ),
+       'img_center'                => array( '1', 'keskel', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'raam', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'raamita', 'frameless' ),
+       'img_page'                  => array( '1', 'lehekülg=$1', 'lehekülg_$1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'ääris', 'border' ),
+       'sitename'                  => array( '1', 'KOHANIMI', 'SITENAME' ),
+       'ns'                        => array( '0', 'NR:', 'NS:' ),
+       'nse'                       => array( '0', 'NR1:', 'NSE:' ),
+       'localurl'                  => array( '0', 'KOHALIKURL', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'KOHALIKURL1', 'LOCALURLE:' ),
+       'servername'                => array( '0', 'SERVERINIMI', 'SERVERNAME' ),
+       'gender'                    => array( '0', 'SUGU:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'HETKENÄDAL', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'HETKENÄDALAPÄEV1', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'KOHALIKNÄDAL', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'KOHALIKNÄDALAPÄEV1', 'LOCALDOW' ),
+       'fullurl'                   => array( '0', 'KOGUURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'KOGUURL1:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'ESIVT:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ESIST:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'VT:', 'LC:' ),
+       'uc'                        => array( '0', 'ST:', 'UC:' ),
+       'displaytitle'              => array( '1', 'PEALKIRI', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__UUEALAOSALINK__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__UUEALAOSALINGITA__', '__NONEWSECTIONLINK__' ),
+       'currenttimestamp'          => array( '1', 'HETKEAJATEMPEL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'KOHALIKAJATEMPEL', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#KEEL:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'VAIKEKEEL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'LEHEKÜLGINIMERUUMIS', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ÜLEMAMÄÄR', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ARVUVORMINDUS', 'FORMATNUM' ),
+       'defaultsort'               => array( '1', 'JÄRJESTA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'hiddencat'                 => array( '1', '__PEIDETUDKAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'LEHEKÜLGIKATEGOORIAS', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'index'                     => array( '1', 'INDEKSIGA', '__INDEX__' ),
+       'noindex'                   => array( '1', 'INDEKSITA', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'KASUTAJAIDRÜHMAS', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'protectionlevel'           => array( '1', 'KAITSETASE', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'kuupäevavormindus', 'formatdate', 'dateformat' ),
 );
 
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -289,31 +290,31 @@ $dateFormats = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Lingid alla kriipsutada',
+'tog-underline' => 'Linkide allakriipsutus:',
 'tog-justify' => 'Lõikude rööpjoondus',
 'tog-hideminor' => 'Peida pisiparandused viimastes muudatustes',
-'tog-hidepatrolled' => 'Peida viimaste muudatuste loetelus jälgimisloendis esitatavad muudatused',
+'tog-hidepatrolled' => 'Peida kontrollitud redaktsioonid viimastes muudatustes',
 'tog-newpageshidepatrolled' => 'Peida uute lehtede loendis kontrollitud leheküljed',
 'tog-extendwatchlist' => 'Laienda jälgimisloendit, et näha kõiki muudatusi, mitte vaid kõige värskemaid',
-'tog-usenewrc' => 'Laiendatud viimased muudatused (nõutav JavaScripti olemasolu)',
+'tog-usenewrc' => 'Rühmita viimased muudatused ja muudatused jälgimisloendis lehekülje järgi (vaja JavaScripti)',
 'tog-numberheadings' => 'Pealkirjade automaatnummerdus',
-'tog-showtoolbar' => 'Redigeerimise tööriistariba näitamine',
-'tog-editondblclick' => 'Artiklite redigeerimine topeltklõpsu peale (JavaScript)',
-'tog-editsection' => '[redigeeri] lingid peatükkide muutmiseks',
-'tog-editsectiononrightclick' => 'Peatükkide redigeerimine paremklõpsuga alampealkirjadel (JavaScript)',
+'tog-showtoolbar' => 'Näita redigeerimise tööriistariba (vaja JavaScripti)',
+'tog-editondblclick' => 'Redigeeri lehekülgi topeltklõpsu peale (vaja JavaScripti)',
+'tog-editsection' => 'Näita alaosade redigeerimise linke',
+'tog-editsectiononrightclick' => 'Alusta alaosa redigeerimist paremklõpsuga alaosa pealkirjal (vaja JavaScripti)',
 'tog-showtoc' => 'Näita sisukorda (lehtedel, millel on rohkem kui 3 pealkirja)',
 'tog-rememberpassword' => 'Parooli meeldejätmine tulevasteks seanssideks (kuni $1 {{PLURAL:$1|päevaks|päevaks}})',
-'tog-watchcreations' => 'Lisa minu loodud lehed jälgimisloendisse',
-'tog-watchdefault' => 'Jälgi uusi ja muudetud artikleid',
-'tog-watchmoves' => 'Lisa minu teisaldatud leheküljed jälgimisloendisse',
-'tog-watchdeletion' => 'Lisa minu kustutatud leheküljed jälgimisloendisse',
+'tog-watchcreations' => 'Lisa jälgimisloendisse minu alustatud leheküljed ja minu üles laaditud failid',
+'tog-watchdefault' => 'Lisa jälgimisloendisse minu muudetud leheküljed ja failid',
+'tog-watchmoves' => 'Lisa jälgimisloendisse minu teisaldatud leheküljed ja failid',
+'tog-watchdeletion' => 'Lisa jälgimisloendisse minu kustutatud leheküljed ja failid',
 'tog-minordefault' => 'Märgi kõik parandused vaikimisi pisiparandusteks',
 'tog-previewontop' => 'Näita eelvaadet toimetamiskasti ees',
 'tog-previewonfirst' => 'Näita eelvaadet esimesel redigeerimisel',
 'tog-nocache' => 'Keela võrgulehitsejal lehekülgede puhverdamine',
-'tog-enotifwatchlistpages' => 'Teata e-posti teel minu jälgitava lehekülje muutmisest',
+'tog-enotifwatchlistpages' => 'Teata e-posti teel minu jälgitava lehekülje või faili muutmisest',
 'tog-enotifusertalkpages' => 'Teata e-posti teel minu arutelulehekülje muutmisest',
-'tog-enotifminoredits' => 'Teata e-posti teel ka pisiparandustest',
+'tog-enotifminoredits' => 'Teata e-posti teel mulle ka pisiparandustest lehekülgedel ja failides',
 'tog-enotifrevealaddr' => 'Näita minu e-posti aadressi teavitus-e-kirjades',
 'tog-shownumberswatching' => 'Näita jälgivate kasutajate hulka',
 'tog-oldsig' => 'Praegune allkiri:',
@@ -321,7 +322,7 @@ $messages = array(
 '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 (nõutav JavaScript) (testimisel)',
+'tog-uselivepreview' => 'Kasuta elavat eelvaadet (vaja JavaScripti) (katseline)',
 'tog-forceeditsummary' => 'Nõua redigeerimisel resümee välja täitmist',
 'tog-watchlisthideown' => 'Peida minu redaktsioonid jälgimisloendist',
 'tog-watchlisthidebots' => 'Peida robotid jälgimisloendist',
@@ -493,14 +494,14 @@ $messages = array(
 'talk' => 'Arutelu',
 'views' => 'vaatamisi',
 'toolbox' => 'Tööriistad',
-'userpage' => 'Kasutajalehekülg',
+'userpage' => 'Vaata kasutajalehekülge',
 'projectpage' => 'Vaata projektilehekülge',
 'imagepage' => 'Vaata faililehekülge',
-'mediawikipage' => 'Vaata sõnumite lehekülge',
-'templatepage' => 'Mallilehekülg',
+'mediawikipage' => 'Vaata sõnumi lehekülge',
+'templatepage' => 'Vaata malli lehekülge',
 'viewhelppage' => 'Vaata abilehekülge',
-'categorypage' => 'Kategoorialehekülg',
-'viewtalkpage' => 'Arutelulehekülg',
+'categorypage' => 'Vaata kategooria lehekülge',
+'viewtalkpage' => 'Vaata arutelulehekülge',
 'otherlanguages' => 'Teistes keeltes',
 'redirectedfrom' => '(Ümber suunatud leheküljelt $1)',
 'redirectpagesub' => 'Ümbersuunamisleht',
@@ -538,7 +539,7 @@ $1',
 'privacypage' => 'Project:Privaatsus',
 
 'badaccess' => 'Õigus puudub',
-'badaccess-group0' => 'Sul ei ole õigust läbi viia toimingut, mida üritasid.',
+'badaccess-group0' => 'Sul pole õigust sooritada toimingut, mida üritasid.',
 'badaccess-groups' => 'Tegevus, mida üritasid, on piiratud kasutajatele {{PLURAL:$2|rühmas|ühes neist rühmadest}}: $1.',
 
 'versionrequired' => 'Nõutav MediaWiki versioon $1',
@@ -547,10 +548,14 @@ Vaata [[Special:Version|versiooni lehekülge]].',
 
 'ok' => 'Sobib',
 'pagetitle' => '$1 – {{SITENAME}}',
-'retrievedfrom' => 'Välja otsitud andmebaasist "$1"',
-'youhavenewmessages' => 'Teile on $1 ($2).',
+'retrievedfrom' => 'Pärit leheküljelt "$1"',
+'youhavenewmessages' => 'Sulle on $1 ($2).',
 'newmessageslink' => 'uusi sõnumeid',
 'newmessagesdifflink' => 'viimane muudatus',
+'youhavenewmessagesfromusers' => 'Sulle on $1 {{PLURAL:$3|ühelt|$3}} kasutajalt ($2).',
+'youhavenewmessagesmanyusers' => 'Sulle on $1 paljudelt kasutajatelt ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|uus sõnum|uusi sõnumeid}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|viimane muudatus|viimased muudatused}}',
 'youhavenewmessagesmulti' => 'Sulle on uusi sõnumeid $1',
 'editsection' => 'redigeeri',
 'editsection-brackets' => '[$1]',
@@ -558,7 +563,7 @@ Vaata [[Special:Version|versiooni lehekülge]].',
 'viewsourceold' => 'vaata lähteteksti',
 'editlink' => 'redigeeri',
 'viewsourcelink' => 'vaata lähteteksti',
-'editsectionhint' => 'Redigeeri alaosa $1',
+'editsectionhint' => 'Redigeeri alaosa "$1"',
 'toc' => 'Sisukord',
 'showtoc' => 'näita',
 'hidetoc' => 'peida',
@@ -575,8 +580,8 @@ Vaata [[Special:Version|versiooni lehekülge]].',
 'page-rss-feed' => '"$1" RSS-toide',
 'page-atom-feed' => '"$1" Atom-toide',
 'red-link-title' => '$1 (pole veel kirjutatud)',
-'sort-descending' => 'Sordi kahanevas järjestuses',
-'sort-ascending' => 'Sordi kasvavas järjestuses',
+'sort-descending' => 'Järjesta kahanevalt',
+'sort-ascending' => 'Järjesta kasvavalt',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Artikkel',
@@ -606,9 +611,9 @@ Käibel olevad erileheküljed on loetletud leheküljel [[Special:SpecialPages|{{
 'dberrortext' => 'Andmebaasipäringus oli süntaksiviga.
 Selle võis tingida tarkvaraviga.
 Viimane andmebaasipäring oli:
-<blockquote><tt>$1</tt></blockquote>
-ja see kutsuti funktsioonist "<tt>$2</tt>".
-Andmebaas tagastas veateate "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+ja see ilmnes funktsiooniga "<code>$2</code>".
+Andmebaas tagastas veateate "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Andmebaasipäringus oli süntaksiviga.
 Viimane andmebaasipäring oli:
 "$1"
@@ -636,7 +641,7 @@ Sellisel juhul tuleks teavitada [[Special:ListUsers/sysop|administraatorit]], ed
 'filecopyerror' => 'Ei saanud faili "$1" kopeerida nimega "$2".',
 'filerenameerror' => 'Ei saanud faili "$1" failiks "$2" ümber nimetada.',
 'filedeleteerror' => 'Faili nimega "$1" ei ole võimalik kustutada.',
-'directorycreateerror' => 'Ei suuda luua kausta "$1".',
+'directorycreateerror' => 'Kataloogi "$1" ei saanud luua.',
 'filenotfound' => 'Faili nimega "$1" ei leitud.',
 'fileexistserror' => 'Kirjutamine faili "$1" ebaõnnestus: fail on juba olemas',
 'unexpected' => 'Ootamatu väärtus: "$1"="$2".',
@@ -663,11 +668,11 @@ Palun proovi mõne minuti pärast uuesti.',
 'viewsourcetext' => 'Saad vaadata ja kopeerida lehekülje lähteteksti:',
 'viewyourtext' => "Saad vaadata ja kopeerida sellel leheküljel tehtud '''enda muudatuste '''lähteteksti:",
 'protectedinterface' => 'Sellel leheküljel on tarkvara kasutajaliidese tekst. Kuritahtliku muutmise vältimiseks on lehekülg lukustatud.',
-'editinginterface' => "'''Hoiatus:''' Te redigeerite tarkvara kasutajaliidese tekstiga lehekülge. Muudatused siin mõjutavad kõikide kasutajate kasutajaliidest. Tõlkijad, palun kaaluge MediaWiki tõlkimisprojekti – [//translatewiki.net/wiki/Main_Page?setlang=et translatewiki.net] kasutamist.",
+'editinginterface' => "'''Hoiatus:''' Redigeerid tarkvara kasutajaliidese tekstiga lehekülge. Muudatused siin mõjutavad kõikide kasutajate kasutajaliidest. Tõlkijad, palun kaaluge MediaWiki lokaliseerimisprojekti [//translatewiki.net/wiki/Main_Page?setlang=et translatewiki.net] kasutamist.",
 'sqlhidden' => '(SQL päring peidetud)',
 'cascadeprotected' => 'See lehekülg on muutmise eest kaitstud, sest see on osa {{PLURAL:$1|järgmisest leheküljest|järgmistest lehekülgedest}}, mis on kaskaadkaitse all:
 $2',
-'namespaceprotected' => "Teil ei ole õigusi redigeerida lehekülgi '''$1''' nimeruumis.",
+'namespaceprotected' => "Sul pole õigust redigeerida lehekülgi nimeruumis '''$1'''.",
 'customcssprotected' => 'Sul pole õigust seda CSS-lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.',
 'customjsprotected' => 'Sul pole õigust seda JavaScripti lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.',
 'ns-specialprotected' => 'Erilehekülgi ei saa redigeerida.',
@@ -677,6 +682,8 @@ $2',
 Administraator lukustas selle järgmisel põhjusel: "$3".',
 'invalidtitle-knownnamespace' => 'Vigane pealkiri nimeruumis "$2" tekstiga "$3"',
 'invalidtitle-unknownnamespace' => 'Vigane pealkiri nimeruuminumbriga $1 ja tekstiga "$2"',
+'exception-nologin' => 'Sisse logimata',
+'exception-nologin-text' => 'Selle lehekülje või toimingu jaoks pead selles vikis olema sisse loginud.',
 
 # Virus scanner
 'virus-badscanner' => "Viga konfiguratsioonis: tundmatu viirusetõrje: ''$1''",
@@ -698,6 +705,7 @@ Sinu konto on loodud.
 'remembermypassword' => 'Jäta parool meelde (kuni $1 {{PLURAL:$1|päevaks|päevaks}})',
 'securelogin-stick-https' => 'Jätka pärast sisselogimist HTTPS-ühenduse kasutamist',
 'yourdomainname' => 'Sinu domeen:',
+'password-change-forbidden' => 'Selles vikis ei saa paroole muuta.',
 'externaldberror' => 'Esines autentimistõrge või sul pole õigust konto andmeid muuta.',
 'login' => 'Logi sisse',
 'nav-login-createaccount' => 'Logi sisse või registreeru kasutajaks',
@@ -735,8 +743,7 @@ Kontrollige kirjapilti või [[Special:UserLogin/signup|looge uus kasutajakonto]]
 'login-userblocked' => 'See kasutaja on blokeeritud. Sisselogimine pole lubatud.',
 'wrongpassword' => 'Vale parool. Proovige uuesti.',
 'wrongpasswordempty' => 'Parool jäi sisestamata. Palun proovi uuesti.',
-'passwordtooshort' => 'Parool on liiga lühike.
-See peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.',
+'passwordtooshort' => 'Parool peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.',
 'password-name-match' => 'Parool peab kasutajanimest erinema.',
 'password-login-forbidden' => 'Selle kasutajanime ja parooli kasutamine on keelatud.',
 'mailmypassword' => 'Saada e-posti teel uus parool',
@@ -760,8 +767,8 @@ Seetõttu ei saa seda IP-aadressi kasutades hetkel rohkem kontosid luua.',
 'emailnotauthenticated' => 'Sinu e-posti aadress <strong>pole veel kinnitatud</strong>. Järgnevate funktsioonidega seotud e-kirju kinnitamata aadressile ei saadeta.',
 'noemailprefs' => 'Järgnevate võimaluste toimimiseks on vaja sisestada e-posti aadress.',
 'emailconfirmlink' => 'Kinnita oma e-posti aadress',
-'invalidemailaddress' => 'E-aadress ei ole aktsepteeritav, sest see on vigaselt kirjutatud.
-Ole hea ja anna õige e-aadress või jäta lahter tühjaks.',
+'invalidemailaddress' => 'E-posti aadress ei ole aktsepteeritav, sest see on vigaselt kirjutatud.
+Ole hea ja sisesta õige e-posti aadress või jäta väli tühjaks.',
 'cannotchangeemail' => 'Selles vikis ei saa konto e-posti aadressi muuta.',
 'emaildisabled' => 'Selle võrgukoha kaudu ei saa e-kirju saata.',
 'accountcreated' => 'Konto loodud',
@@ -935,6 +942,10 @@ Võid [[Special:Search/{{PAGENAME}}|otsida pealkirjaks olevat fraasi]] teistelt
 'noarticletext-nopermission' => 'Sellel leheküljel ei ole teksti.
 Sa võid [[Special:Search/{{PAGENAME}}|otsida lehekülje nime]] teistelt lehekülgedelt
 või <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} otsida lehekülje nime logidest]</span>.',
+'missing-revision' => 'Lehekülje "{{PAGENAME}}" redaktsiooni $1 pole.
+
+Harilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin asunud lehekülg on kustutatud.
+Üksikasjad leiad [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kustutamislogist].',
 'userpage-userdoesnotexist' => 'Kasutajakontot "<nowiki>$1</nowiki>" pole olemas.
 Palun mõtle järele, kas soovid seda lehte luua või muuta.',
 'userpage-userdoesnotexist-view' => 'Kasutajakonto "$1" pole registreeritud.',
@@ -944,7 +955,6 @@ Allpool on toodud viimane blokeerimislogi sissekanne:',
 * '''Firefox / Safari:''' Hoia all ''Shift''-klahvi ja klõpsa ''Laadi uuesti'' või vajuta kas ''Ctrl-F5'' või ''Ctrl-R'' (Macis ''⌘-R'').
 * '''Google Chrome:''' Vajuta ''Ctrl-Shift-R'' (Macis ''⌘-Shift-R'').
 * '''Internet Explorer:''' Hoia all ''Ctrl''-klahvi ja klõpsa ''Värskenda'' või vajuta ''Ctrl-F5''.
-* '''Konqueror:''' Klõpsa ''Reload'' või vajuta ''F5''.
 * '''Opera:''' Tühjenda puhver asukohas ''Seaded → Eelistused''.",
 'usercssyoucanpreview' => "'''Vihje:''' Enne salvestamist kasuta oma uue CSSi proovimiseks nuppu \"{{int:showpreview}}\".",
 'userjsyoucanpreview' => "'''Vihje:''' Enne salvestamist kasuta oma uue JavaScripti proovimiseks nuppu \"{{int:showpreview}}\".",
@@ -987,14 +997,14 @@ Sul tuleb need viimasesse versiooni üle viia.
 Kui klõpsad nupule \"{{int:savearticle}}\", salvestub '''ainult''' ülemises toimetamiskastis olev tekst.",
 'yourtext' => 'Sinu tekst',
 'storedversion' => 'Salvestatud redaktsioon',
-'nonunicodebrowser' => "'''HOIATUS: Sinu brauser ei toeta unikoodi.'''
-Probleemist möödahiilimiseks, selleks et saaksid lehekülgi turvaliselt redigeerida, näidatakse mitte-ASCII sümboleid toimetuskastis kuueteistkümnendsüsteemi koodidena.",
-'editingold' => "'''ETTEVAATUST! Te redigeerite praegu selle lehekülje vana redaktsiooni.
-Kui Te selle salvestate, siis lähevad kõik vahepealsed muudatused kaduma.'''",
+'nonunicodebrowser' => "'''Hoiatus: Sinu brauser ei toeta Unicode'i.'''
+Probleemist möödahiilimiseks, selleks et saaksid lehekülgi turvaliselt redigeerida, näidatakse mitte-ASCII märke toimetuskastis kuueteistkümnendsüsteemi koodidena.",
+'editingold' => "'''Ettevaatust: Redigeerid praegu selle lehekülje vana redaktsiooni.'''
+Kui selle salvestad, lähevad kõik vahepealsed muudatused kaduma.",
 'yourdiff' => 'Erinevused',
-'copyrightwarning' => "Pidage silmas, et kogu teie kaastöö võrgukohale {{SITENAME}} loetakse avaldatuks litsentsi $2 all (vaata ka $1). Kui te ei soovi, et teie kirjutatut halastamatult redigeeritakse ja oma äranägemise järgi kasutatakse, siis ärge seda siia salvestage.<br />
-Te kinnitate ka, et kirjutasite selle ise või võtsite selle kopeerimiskitsenduseta allikast.<br />
-'''ÄRGE SAATKE AUTORIÕIGUSEGA KAITSTUD MATERJALI ILMA LOATA!'''",
+'copyrightwarning' => "Pea silmas, et kogu kaastöö võrgukohale {{SITENAME}} loetakse avaldatuks litsentsi $2 all (üksikasjad leheküljel $1). Kui sa ei soovi, et sinu kirjutatut halastamatult redigeeritakse ja oma äranägemise järgi kasutatakse, siis ära seda siia salvesta.<br />
+Kinnitad ka, et kirjutasid selle ise või võtsid selle allikast, mille materjale ei kaitsta autoriõigusega või muust sarnasest vabast allikast.<br />
+'''Ära salvesta autoriõigusega kaitstud materjali ilma loata!'''",
 'copyrightwarning2' => "Pea silmas, et teised kaastöölised võivad kogu {{GRAMMAR:inessive|{{SITENAME}}}} tehtud kaastööd muuta või eemaldada. Kui sa ei soovi, et su kirjutatut halastamatult redigeeritakse, siis ära seda siia salvesta.<br />
 Sa kinnitad ka, et kirjutasid selle ise või võtsid selle kopeerimiskitsenduseta allikast (vaata ka $1).
 '''Ära saada autoriõigusega kaitstud materjali loata!'''",
@@ -1093,7 +1103,7 @@ Legend: (viim) = erinevused võrreldes viimase redaktsiooniga,
 # Revision feed
 'history-feed-title' => 'Redigeerimiste ajalugu',
 'history-feed-description' => 'Selle lehekülje redigeerimiste ajalugu',
-'history-feed-item-nocomment' => '$1 - $2',
+'history-feed-item-nocomment' => '$1  $2',
 'history-feed-empty' => 'Soovitud lehekülge ei ole olemas.
 See võib olla vikist kustutatud või ümber nimetatud.
 Ürita [[Special:Search|vikist otsida]] teemakohaseid lehekülgi.',
@@ -1132,7 +1142,7 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
 'rev-showdeleted' => 'näita',
 'revisiondelete' => 'Redaktsioonide kustutamine või taastamine',
 'revdelete-nooldid-title' => 'Sellist redaktsiooni pole.',
-'revdelete-nooldid-text' => 'Sa pole valinud redaktsiooni, valitud redaktsioon puudub või Sa püüad peita viimast redaktsiooni.',
+'revdelete-nooldid-text' => 'Sa pole valinud redaktsiooni, valitud redaktsioon puudub või sa püüad peita viimast redaktsiooni.',
 'revdelete-nologtype-title' => 'Logi tüüpi ei antud',
 'revdelete-nologtype-text' => 'Sa ei ole selle toimingu sooritamiseks logi tüüpi täpsustanud.',
 'revdelete-nologid-title' => 'Vigane logikirje',
@@ -1144,7 +1154,7 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
 'logdelete-selected' => "'''Valitud {{PLURAL:$1|logisissekanne|logisissekanded}}:'''",
 'revdelete-text' => "'''Kustutatud redaktsioonid kajastuvad endiselt lehe ajaloos ja logides, kuid osa nende sisust pole tavakasutajatele nähtav.'''
 {{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad varjatud sisu siiski vaadata ning seda vajadusel taastada, kui see pole just täiendavalt ära keelatud.",
-'revdelete-confirm' => 'Kinnita, et Sa tõesti soovid seda teha ning et Sa saad aru tagajärgedest ja et tegevus on kooskõlas [[{{MediaWiki:Policy-url}}|siinse sisekorraga]].',
+'revdelete-confirm' => 'Kinnita, et soovid tõesti seda teha ning et saad aru tagajärgedest ja tegevus on kooskõlas [[{{MediaWiki:Policy-url}}|siinsete kokkulepetega]].',
 'revdelete-suppress-text' => "Andmed tuleks varjata '''ainult''' järgnevatel juhtudel:
 * Sobimatu isiklik teave
 *: ''kodune aadress ja telefoninumber, sotsiaalhoolekandenumber jne''",
@@ -1168,7 +1178,7 @@ $1",
 'logdelete-success' => "'''Logi nähtavus edukalt muudetud.'''",
 'logdelete-failure' => "'''Logi nähtavust ei saanud paika:'''
 $1",
-'revdel-restore' => 'Muuda nähtavust',
+'revdel-restore' => 'muuda nähtavust',
 'revdel-restore-deleted' => 'kustutatud redaktsioonid',
 'revdel-restore-visible' => 'nähtavad redaktsioonid',
 'pagehist' => 'Lehekülje ajalugu',
@@ -1183,7 +1193,7 @@ Sul ei ole sellele ligipääsu.',
 'revdelete-no-change' => "'''Hoiatus:''' Üksusel kuupäevaga $2, kell $1 olid juba soovitud nähtavussätted.",
 'revdelete-concurrent-change' => 'Tõrge üksuse kuupäevaga $2, kell $1 muutmisel: paistab, et keegi teine on selle olekut sel ajal muutnud, kui sina seda muuta üritasid.
 Palun vaata logisid.',
-'revdelete-only-restricted' => 'Ei õnnestu varjata elementi $2, $1 kuupäevaga: Sa ei saa seda elementi administraatorite eest peita, kui Sa ei märgi ka ühte muudest nähtavussätetest.',
+'revdelete-only-restricted' => 'Ei õnnestu varjata üksust seisuga $1, kell $2: Seda üksust ei saa administraatorite eest varjata, valimata seejuures ka ühte muudest nähtavussuvanditest.',
 'revdelete-reason-dropdown' => '*Tavalised kustutamise põhjused
 ** Autoriõiguste rikkumine
 ** Kohatud eraelulised andmed',
@@ -1205,9 +1215,9 @@ Veendu, et selle muudatusega jääb lehekülje redigeerimislugu ajaliselt katkem
 'mergehistory-from' => 'Lehekülje allikas:',
 'mergehistory-into' => 'Sihtlehekülg:',
 'mergehistory-list' => 'Ühendatav redigeerimise ajalugu',
-'mergehistory-merge' => 'Järgmised [[:$1]] redaktsioonid võib liita lehe [[:$2]] muudatuste ajalooga.
-Kasuta raadionuppe valimaks kindlat redaktsioonide vahemikku.
-Navigeerimislinkide kasutamine tühistab redaktsioonide valiku.',
+'mergehistory-merge' => 'Järgmised lehekülje [[:$1]] redaktsioonid saab liita leheküljega [[:$2]].
+Kasuta raadionuppe, et valida ainult redaktsioonid, mis on loodud valitud ajal või varem.
+Pane tähele, et navigeerimislinkide kasutamine lähtestab redaktsioonide valiku.',
 'mergehistory-go' => 'Näita ühendatavaid muudatusi',
 'mergehistory-submit' => 'Ühenda redaktsioonid',
 'mergehistory-empty' => 'Ühendatavaid redaktsioone ei ole.',
@@ -1239,6 +1249,10 @@ Navigeerimislinkide kasutamine tühistab redaktsioonide valiku.',
 'editundo' => 'eemalda',
 'diff-multi' => '({{PLURAL:$1|Ühte|$1}} vahepealset {{PLURAL:$2|ühe|$2}} kasutaja redaktsiooni ei näidata.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ühte|$1}} vahepealset rohkem kui {{PLURAL:$2|ühe|$2}} kasutaja redaktsiooni ei näidata.)',
+'difference-missing-revision' => 'Selle erinevuste vaate {{PLURAL:$2|üht|$2}} redaktsiooni ($1) ei leitud.
+
+Harilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin asunud lehekülg on kustutatud.
+Üksikasjad leiad [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kustutamislogist].',
 
 # Search results
 'searchresults' => 'Otsingu tulemused',
@@ -1288,7 +1302,7 @@ Navigeerimislinkide kasutamine tühistab redaktsioonide valiku.',
 'searcheverything-enable' => 'Otsi kõigist nimeruumidest',
 'searchrelated' => 'seotud',
 'searchall' => 'kõik',
-'showingresults' => "Allpool näitame {{PLURAL:$1|'''ühte''' tulemit|'''$1''' tulemit}} alates tulemist #'''$2'''.",
+'showingresults' => "Allpool näidatakse '''{{PLURAL:$1|ühte|$1}}''' tulemust alates '''$2'''. tulemusest.",
 'showingresultsnum' => "Allpool näitame {{PLURAL:$3|'''ühte''' tulemit|'''$3''' tulemit}} alates tulemist #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|'''$1''' '''$3'''-st vastest|Vasted '''$1–$2''' '''$3'''-st}} päringule '''$4'''",
 'nonefound' => "'''Märkus''': Otsing hõlmab vaikimisi vaid osasid nimeruume.
@@ -1407,8 +1421,8 @@ Toimingut ei saa hiljem tühistada.',
 'prefs-help-signature' => 'Kommentaarile tuleks aruteluleheküljel alla kirjutada märkidega <nowiki>~~~~</nowiki>, mis muutuvad sinu allkirjaks ja ajatempliks.',
 'badsig' => 'Sobimatu allkiri.
 Palun kontrolli HTML koodi.',
-'badsiglength' => 'Sinu signatuur on liiga pikk.
-See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
+'badsiglength' => 'Sinu allkiri on liiga pikk.
+See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'yourgender' => 'Sugu:',
 'gender-unknown' => 'Määramata',
 'gender-male' => 'Mees',
@@ -1487,10 +1501,10 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
 # Rights
 'right-read' => 'Lugeda lehekülgi',
 'right-edit' => 'Redigeerida lehekülje sisu',
-'right-createpage' => 'Luua lehekülgi (mis pole arutelu leheküljed)',
-'right-createtalk' => 'Luua arutelu lehekülgi',
+'right-createpage' => 'Luua lehekülgi (mis pole aruteluleheküljed)',
+'right-createtalk' => 'Luua arutelulehekülgi',
 'right-createaccount' => 'Luua uusi kasutajakontosid',
-'right-minoredit' => 'Märkida muudatusi pisimuudatustena',
+'right-minoredit' => 'Märkida muudatusi pisimuudatusteks',
 'right-move' => 'Teisaldada lehekülgi',
 'right-move-subpages' => 'Teisaldada lehekülgi koos nende alamlehtedega',
 'right-move-rootuserpages' => 'Teisaldada kasutajalehekülgi',
@@ -1509,6 +1523,7 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
 'right-writeapi' => 'Kasutada kirjutamise rakendusliidest',
 'right-delete' => 'Lehekülgi kustutada',
 'right-bigdelete' => 'Pikkade ajalugudega lehekülgi kustutada',
+'right-deletelogentry' => 'Kustutada ja taastada logisissekandeid',
 'right-deleterevision' => 'Kustutada ja taastada lehekülgede teatud redaktsioone',
 'right-deletedhistory' => 'Vaadata kustutatud ajalookirjeid ilma seotud tekstita',
 'right-deletedtext' => 'Vaadata kustutatud teksti ja võrrelda kustutatud redaktsioone',
@@ -1577,7 +1592,7 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
 'action-suppressionlog' => 'seda eralogi vaadata',
 'action-block' => 'selle kasutaja redigeerimisõigust blokeerida',
 'action-protect' => 'selle lehekülje kaitsetasemeid muuta',
-'action-rollback' => 'lehekülge viimati redigeeriund kasutaja muudatusi koheselt tühistada',
+'action-rollback' => 'tühistada otsekohe lehekülge viimati redigeerinud kasutaja muudatusi',
 'action-import' => 'seda lehekülge teisest vikist importida',
 'action-importupload' => 'seda lehekülge faili üleslaadimise abil importida',
 'action-patrol' => 'teiste muudatusi kontrollituks märkida',
@@ -1599,7 +1614,7 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
 'recentchanges-label-minor' => 'See on pisiparandus',
 'recentchanges-label-bot' => 'Selle muudatuse sooritas robot',
 'recentchanges-label-unpatrolled' => 'Seda muudatust ei ole veel kontrollitud',
-'rcnote' => "Allpool on esitatud {{PLURAL:$1|'''1''' muudatus|viimased '''$1''' muudatust}} viimase {{PLURAL:$2|päeva|'''$2''' päeva}} jooksul, seisuga $4, kell $5.",
+'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',
@@ -1620,7 +1635,7 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
 'rc_categories' => 'Ainult kategooriatest (eraldajaks "|")',
 'rc_categories_any' => 'Mistahes',
 'rc-change-size-new' => '$1 {{PLURAL:$1|bait|baiti}} pärast muudatust',
-'newsectionsummary' => '/* $1 */ uus alajaotus',
+'newsectionsummary' => '/* $1 */ uus alaosa',
 'rc-enhanced-expand' => 'Näita üksikasju (nõuab JavaScripti)',
 'rc-enhanced-hide' => 'Peida üksikasjad',
 'rc-old-title' => 'alustatud pealkirja "$1" all',
@@ -1654,9 +1669,9 @@ Et näha või leida eelnevalt üles laaditud faile vaata [[Special:FileList|fail
 Üleslaadimiste ajalugu saab uurida [[Special:Log/upload|üleslaadimislogist]], kustutamiste ajalugu [[Special:Log/delete|kustutamislogist]].
 
 Faili lisamiseks artiklile kasuta linki ühel kujul järgnevatest.
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.jpg]]</nowiki></tt>''', et lisada täissuuruses pilt.
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.png|200px|thumb|left|kirjeldus]]</nowiki></tt>''', et lisada lehekülje vasakusse serva raamiga 200 piksli laiune pisipilt koos pildiallkirjaga (''kirjeldus'').
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fail.ogg]]</nowiki></tt>''', et linkida otse failile ilma seda kuvamata.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.jpg]]</nowiki></code>''', et lisada täissuuruses pilt.
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.png|200px|thumb|left|kirjeldus]]</nowiki></code>''', et lisada lehekülje vasakusse serva raamiga 200 piksli laiune pisipilt koos pildiallkirjaga (''kirjeldus'').
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fail.ogg]]</nowiki></code>''', et linkida otse failile ilma seda kuvamata.",
 'upload-permitted' => 'Lubatud failitüübid: $1.',
 'upload-preferred' => 'Eelistatud failitüübid: $1.',
 'upload-prohibited' => 'Keelatud failitüübid: $1.',
@@ -1696,24 +1711,24 @@ Eelistatud {{PLURAL:\$3|failitüüp on|failitüübid on}} \$2.",
 'tmp-write-error' => 'Viga ajutise faili kirjutamisel.',
 'large-file' => 'On soovitatav, et üleslaaditavad failid ei oleks suuremad kui $1. Selle faili suurus on $2.',
 'largefileserver' => 'Antud fail on suurem lubatud failisuurusest.',
-'emptyfile' => 'Fail, mille Te üles laadisite, paistab olevat tühi.
+'emptyfile' => 'Fail, mille üles laadisid, paistab olevat tühi.
 See võib olla tingitud vigasest failinimest.
-Palun kaalutlege, kas Te tõesti soovite seda faili üles laadida.',
+Palun veendu, et soovid tõesti seda faili üles laadida.',
 'windows-nonascii-filename' => 'Sellel vikil puudub erimärkidega failinimede tugi.',
-'fileexists' => "Sellise nimega fail on juba olemas. Palun vaata lehekülge '''<tt>[[:$1]]</tt>''', kui sa pole kindel, kas soovid seda muuta.
-[[$1|thumb]]",
-'filepageexists' => "Selle faili kirjelduslehekülg '''<tt>[[:$1]]</tt>''' on juba loodud, aga selle nimega faili hetkel pole.
+'fileexists' => 'Sellise nimega fail on juba olemas. Palun vaata lehekülge <strong>[[:$1]]</strong>, kui sa pole kindel, kas soovid seda muuta.
+[[$1|thumb]]',
+'filepageexists' => 'Selle faili kirjelduslehekülg <strong>[[:$1]]</strong> on juba loodud, aga selle nimega faili hetkel pole.
 Sinu sisestatud kokkuvõtet ei kuvata kirjeldusleheküljel.
 Sinu kokkuvõtte kuvamiseks tuleb kirjelduslehekülge eraldi redigeerida.
-[[$1|thumb]]",
-'fileexists-extension' => "Sarnase nimega fail on olemas: [[$2|thumb]]
-* Üleslaetava faili nimi: '''<tt>[[:$1]]</tt>'''
-* Olemasoleva faili nimi: '''<tt>[[:$2]]</tt>'''
-Palun vali teistsugune nimi.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Sarnase nimega fail on olemas: [[$2|thumb]]
+* Üleslaetava faili nimi: <strong>[[:$1]]</strong>
+* Olemasoleva faili nimi: <strong>[[:$2]]</strong>
+Palun vali teistsugune nimi.',
 'fileexists-thumbnail-yes' => "See paistab olevat vähendatud suurusega pilt (''pisipilt''). [[$1|thumb]]
-Palun vaata faili '''<tt>[[:$1]]</tt>'''.
+Palun vaata faili <strong>[[:$1]]</strong>.
 Kui vaadatud fail on sama pilt algupärases suuruses, pole vaja täiendavat pisipilti üles laadida.",
-'file-thumbnail-no' => "Failinimi algab eesliitega '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Failinimi algab eesliitega <strong>$1</strong>.
 See paistab vähendatud suurusega pilt (''pisipilt'') olevat.
 Kui sul on ka selle pildi täislahutusega versioon, laadi palun hoopis see üles, vastasel korral muuda palun faili nime.",
 'fileexists-forbidden' => 'Sellise nimega fail on juba olemas, seda ei saa üle kirjutada.
@@ -1915,16 +1930,17 @@ Võib-olla tahad redigeerida selle faili [$2 sealset kirjelduslehekülge].',
 'uploadnewversion-linktext' => 'Laadi üles selle faili uus versioon',
 'shared-repo-from' => 'varamust $1',
 'shared-repo' => 'jagatud varamu',
+'upload-disallowed-here' => 'Paraku ei saa sa seda pilti üle kirjutada.',
 
 # File reversion
 'filerevert' => 'Taasta $1',
 'filerevert-legend' => 'Faili taastamine',
 'filerevert-intro' => "Sa taastad faili '''[[Media:$1|$1]]''' seisuga [$4 $3, $2] kasutusel olnud versiooni.",
 'filerevert-comment' => 'Põhjus:',
-'filerevert-defaultcomment' => 'Naaseti redaktsiooni juurde, mis loodi $1 kell $2',
+'filerevert-defaultcomment' => 'Ennistati versioon seisuga $1, kell $2',
 'filerevert-submit' => 'Taasta',
 'filerevert-success' => "Faili '''[[Media:$1|$1]]''' seisuga [$4 $3, $2 kasutusel olnud versioon] on taastatud.",
-'filerevert-badversion' => 'Failist ei ole kohalikku versiooni tagatud ajamarkeeringuga.',
+'filerevert-badversion' => 'Ette antud ajatempliga kohalik versioon sellest failist puudub.',
 
 # File deletion
 'filedelete' => 'Kustuta $1',
@@ -1949,7 +1965,7 @@ Võib-olla tahad redigeerida selle faili [$2 sealset kirjelduslehekülge].',
 # MIME search
 'mimesearch' => 'MIME otsing',
 'mimesearch-summary' => 'Selle leheküljega saab faile otsida MIME tüübi järgi.
-Sisesta kujul tüüp/alamtüüp, näiteks <tt>image/jpeg</tt>.',
+Sisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.',
 'mimetype' => 'MIME tüüp:',
 'download' => 'laadi alla',
 
@@ -1993,10 +2009,10 @@ Sisesta kujul tüüp/alamtüüp, näiteks <tt>image/jpeg</tt>.',
 'statistics-users-active-desc' => 'Kasutajad, kes on viimase {{PLURAL:$1|päeva|$1 päeva}} jooksul tegutsenud',
 'statistics-mostpopular' => 'Enim vaadatud leheküljed',
 
-'disambiguations' => 'Leheküljed, mis lingivad täpsustuslehekülgedele',
+'disambiguations' => 'Täpsustuslehekülgedele linkivad leheküljed',
 'disambiguationspage' => 'Template:Täpsustuslehekülg',
-'disambiguations-text' => "Loetletud leheküljed viitavad '''täpsustusleheküljele'''.
-Selle asemel peaks nad olema lingitud sobivasse artiklisse.
+'disambiguations-text' => "Järgmised leheküljed sisaldavad vähemalt üht linki '''täpsustusleheküljele'''.
+Võimalik, et sellised lingid peaks viitama sobivamatele lehekülgedele.
 Lehekülg loetakse täpsustusleheküljeks, kui see kasutab malli, millele viitab sõnum [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Kahekordsed ümbersuunamised',
@@ -2017,11 +2033,12 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'withoutinterwiki-legend' => 'Eesliide',
 'withoutinterwiki-submit' => 'Näita',
 
-'fewestrevisions' => 'Leheküljed, kus on kõige vähem muudatusi tehtud',
+'fewestrevisions' => 'Vähima redaktsioonide arvuga leheküljed',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bait|baiti}}',
 'ncategories' => '$1 {{PLURAL:$1|kategooria|kategooriat}}',
+'ninterwikis' => '{{PLURAL:$1|üks intervikilink|$1 intervikilinki}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linki}}',
 'nmembers' => '$1 {{PLURAL:$1|liige|liiget}}',
 'nrevisions' => '$1 {{PLURAL:$1|redaktsioon|redaktsiooni}}',
@@ -2030,7 +2047,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'ntransclusions' => 'kasutuses {{PLURAL:$1|ühel leheküljel|$1 leheküljel}}',
 'specialpage-empty' => 'Vasteid ei leidu.',
 'lonelypages' => 'Viitamata leheküljed',
-'lonelypagestext' => 'Järgmistele lehekülgedele ei ole linki ühelgi Viki leheküljel, samuti ei ole nad kasutusel teiste lehekülgede osana.',
+'lonelypagestext' => 'Järgmistele lehekülgedele ei lingita ühelgi viki leheküljel, samuti ei ole nad kasutusel teiste lehekülgede osana.',
 'uncategorizedpages' => 'Kategoriseerimata leheküljed',
 'uncategorizedcategories' => 'Kategoriseerimata kategooriad',
 'uncategorizedimages' => 'Kategoriseerimata failid',
@@ -2050,6 +2067,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'mostlinkedtemplates' => 'Kõige viidatumad mallid',
 'mostcategories' => 'Enim kategoriseeritud leheküljed',
 'mostimages' => 'Kõige kasutatumad failid',
+'mostinterwikis' => 'Suurima keelelinkide arvuga leheküljed',
 'mostrevisions' => 'Kõige pikema redigeerimislooga leheküljed',
 'prefixindex' => 'Kõik pealkirjad eesliitega',
 'prefixindex-namespace' => 'Kõik pealkirjad eesliitega (nimeruumis $1)',
@@ -2103,6 +2121,7 @@ Pane tähele, et teised võrgukohad võivad viidata failile otselingiga ja seega
 Valiku kitsendamiseks vali logitüüp, sisesta kasutajanimi (tõstutundlik) või huvipakkuva lehekülje pealkiri (samuti tõstutundlik).',
 'logempty' => 'Logis puuduvad vastavad kirjed.',
 'log-title-wildcard' => 'Selle tekstiga algavad pealkirjad',
+'showhideselectedlogentries' => 'Näita valitud logisissekandeid või peida need',
 
 # Special:AllPages
 'allpages' => 'Kõik leheküljed',
@@ -2149,12 +2168,12 @@ Vaata ka [[Special:WantedCategories|puuduvaid kategooriaid]].',
 'linksearch-ok' => 'Otsi',
 'linksearch-text' => 'Metamärgina võib kasutada tärni, näiteks "*.wikipedia.org".
 Otsingus peab olema vähemalt tipptaseme domeen, näiteks "*.org".<br />
-Toetatud protokollid: <tt>$1</tt> (otsingus ära neid kasuta).',
+Toetatud protokollid: <code>$1</code> (otsingus ära neid kasuta).',
 'linksearch-line' => '$1 on lingitud leheküljelt $2',
 'linksearch-error' => 'Metamärk võib olla ainult internetiaadressi alguses.',
 
 # Special:ListUsers
-'listusersfrom' => 'Näita kasutajaid alustades:',
+'listusersfrom' => 'Näita kasutajaid alates:',
 'listusers-submit' => 'Näita',
 'listusers-noresult' => 'Kasutajat ei leitud.',
 'listusers-blocked' => '(blokeeritud)',
@@ -2195,6 +2214,8 @@ Toetatud protokollid: <tt>$1</tt> (otsingus ära neid kasuta).',
 'mailnologin' => 'Saatja aadress puudub',
 'mailnologintext' => 'Pead olema [[Special:UserLogin|sisse logitud]] ja sul peab [[Special:Preferences|eelistustes]] olema kehtiv e-posti aadress, et saata teistele kasutajatele e-kirju.',
 'emailuser' => 'Saada sellele kasutajale e-kiri',
+'emailuser-title-target' => 'Sellele {{GENDER:$1|kasutajale}} e-kirja saatmine',
+'emailuser-title-notarget' => 'Kasutajale e-kirja saatmine',
 'emailpage' => 'Saada kasutajale e-kiri',
 'emailpagetext' => 'Kui see kasutaja on oma eelistuste lehel sisestanud e-posti aadressi, saad alloleva vormi kaudu talle kirja saata. Et kasutaja saaks vastata, täidetakse kirja saatja väli "Kellelt" e-posti aadressiga, mille oled sisestanud [[Special:Preferences|oma eelistuste lehel]].',
 'usermailererror' => 'Saatmise viga:',
@@ -2340,6 +2361,8 @@ Ettevaatust, selle kustutamine võib esile kutsuda häireid {{GRAMMAR:genitive|{
 'rollback' => 'Tühista muudatused',
 'rollback_short' => 'Tühista',
 'rollbacklink' => 'tühista',
+'rollbacklinkcount' => 'tühista {{PLURAL:$1|üks muudatus|$1 muudatust}}',
+'rollbacklinkcount-morethan' => 'tühista üle {{PLURAL:$1|ühe muudatuse|10 muudatuse}}',
 'rollbackfailed' => 'Muudatuste tühistamine ebaõnnestus',
 'cantrollback' => 'Ei saa muudatusi eemaldada, sest viimane kaastööline on artikli ainus autor.',
 'alreadyrolled' => 'Muudatust, mille tegi lehele [[:$1]] kasutaja [[User:$2|$2]] ([[User talk:$2|arutelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), ei saa tühistada, sest keegi teine on seda lehte vahepeal muutnud.
@@ -2401,9 +2424,9 @@ Sa saad muuta selle lehekülje kaitse staatust, kuid see ei mõjuta kaskaadkaits
 'protect-otherreason-op' => 'Muu põhjus',
 'protect-dropdown' => '*Tavalised kaitsmise põhjused
 ** Liigne vandalism
-** Liigne spämmimine
-** Counter-productive edit warring
-** Kõrge liiklusega lehekülg',
+** Liigne rämpspostitamine
+** Redigeerimissõja pidamine
+** Suure liiklusega lehekülg',
 'protect-edit-reasonlist' => 'Muudatuste eest kaitsmise põhjused',
 'protect-expiry-options' => '1 tund:1 hour,1 päev:1 day,1 nädal:1 week,2 nädalat: 2 weeks,1 kuu:1 month,3 kuud:3 months,6 kuud:6 months,1 aasta:1 year,igavene:infinite',
 'restriction-type' => 'Lubatud:',
@@ -2448,7 +2471,7 @@ Link võib olla kõlbmatu või redaktsioon võib olla taastatud või arhiivist e
 'undeletelink' => 'vaata/taasta',
 'undeleteviewlink' => 'vaata',
 'undeletereset' => 'Tühjenda',
-'undeleteinvert' => 'Pööra valim teistpidi',
+'undeleteinvert' => 'Pööra valik teistpidi',
 'undeletecomment' => 'Põhjus:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} taastatud',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 redaktsioon|$1 redaktsiooni}} ja {{PLURAL:$2|1 fail|$2 faili}} taastatud',
@@ -2459,7 +2482,7 @@ Link võib olla kõlbmatu või redaktsioon võib olla taastatud või arhiivist e
 [[Special:Log/delete|Kustutamise logist]] võib leida loendi viimastest kustutamistest ja taastamistest.",
 'undelete-header' => 'Hiljuti kustutatud leheküljed leiad [[Special:Log/delete|kustutamislogist]].',
 'undelete-search-title' => 'Kustutatud lehekülgede otsimine',
-'undelete-search-box' => 'Otsi kustutatud lehekülgi',
+'undelete-search-box' => 'Kustutatud lehekülgede otsimine',
 'undelete-search-prefix' => 'Näita lehekülgi, mille pealkiri algab nii:',
 'undelete-search-submit' => 'Otsi',
 'undelete-no-results' => 'Kustutatud lehekülgede arhiivist sellist lehekülge ei leidunud.',
@@ -2473,7 +2496,7 @@ Võimalik, et see on juba taastatud.',
 'undelete-error-long' => 'Faili taastamine ebaõnnestus:
 
 $1',
-'undelete-show-file-confirm' => 'Kas oled kindel, et soovid näha kustutatud versiooni failist <nowiki>$1</nowiki>, mis salvestati $2 kell $3?',
+'undelete-show-file-confirm' => 'Kas oled kindel, et soovid näha kustutatud versiooni failist <nowiki>$1</nowiki> seisuga $2, kell $3?',
 'undelete-show-file-submit' => 'Jah',
 
 # Namespace form on various pages
@@ -2545,12 +2568,13 @@ Täida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.',
 'ipbreason' => 'Põhjus:',
 'ipbreasonotherlist' => 'Muul põhjusel',
 'ipbreason-dropdown' => '*Tavalised blokeerimise põhjused
-** Lehtedelt sisu kustutamine
+** Valeandmete lisamine
+** Lehekülgedelt sisu kustutamine
+** Välislinkide rämpspostitus
 ** Sodimine
-** Taunitav käitumine, isiklikud rünnakud
-** Mittesobiv kasutajanimi
-** Spämmi levitamine
-** Vale info levitamine',
+** Hirmutav käitumine/ahistamine
+** Mitme konto väärkasutus
+** Lubamatu kasutajanimi',
 'ipb-hardblock' => 'Keela sellelt IP-aadressilt sisseloginud kasutajatel redigeerida',
 'ipbcreateaccount' => 'Takista konto loomist',
 'ipbemailban' => 'Takista kasutajal e-kirjade saatmine',
@@ -2572,12 +2596,12 @@ Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeerimisnimekirjast]].',
 'ipb-blockingself' => 'Sa blokeerid iseenda! Kas tahad tõesti seda teha?',
 'ipb-confirmhideuser' => 'Avaldasid soovi kasutaja blokeerida ja peita. Kasutaja nimi peidetakse kõigist loenditest ja logisissekannetest. Kas oled kindel, et soovid seda teha?',
 'ipb-edit-dropdown' => 'Muuda blokeeringu põhjuseid',
-'ipb-unblock-addr' => 'Kustuta $1 blokeering',
+'ipb-unblock-addr' => 'Tühista kasutaja $1 blokeering',
 'ipb-unblock' => 'Kasutaja või IP-aadressi vabastamine blokeerimisest',
-'ipb-blocklist' => 'Vaata kehtivaid keelde',
+'ipb-blocklist' => 'Vaata kehtivaid blokeeringuid',
 'ipb-blocklist-contribs' => 'Kasutaja $1 kaastöö',
 'unblockip' => 'Blokeerimise eemaldamine',
-'unblockiptext' => 'Kasutage allpool olevat vormi redigeerimisõiguste taastamiseks varem blokeeritud IP aadressile.',
+'unblockiptext' => 'Kasuta allpool olevat vormi varem blokeeritud IP-aadressi või kasutaja redigeerimisõiguse taastamiseks.',
 'ipusubmit' => 'Eemalda see blokeering',
 'unblocked' => 'Kasutaja [[User:$1|$1]] blokeering on eemaldatud',
 'unblocked-range' => 'Vahemiku $1 blokeering on eemaldatud',
@@ -2772,13 +2796,14 @@ Palun kasuta mõnda teist nime.',
 
 # Export
 'export' => 'Lehekülgede eksport',
-'exporttext' => 'Sa saad siin eksportida kindla lehekülje või nende kogumi, tekstid, koos kogu nende muudatuste ajalooga, XML kujule viiduna. Seda saad sa vajadusel kasutada teksti ülekandmiseks teise vikisse, kasutades selleks MediaWiki [[Special:Import|impordi lehekülge]].
+'exporttext' => 'Saad eksportida kindla leheküljel või lehekülgede kogumi teksti ja redigeerimisloo XML-kujule viiduna.
+Seda saab teise vikisse importida, kasutades selleks MediaWiki [[Special:Import|impordi lehekülge]].
 
-Et eksportida lehekülgi, sisesta nende pealkirjad all olevasse teksti kasti, iga pealkiri ise reale, ning vali kas sa soovid saada leheküljest kõiki selle vanemaid versioone (muudatusi) või soovid sa saada leheküljest vaid hetke versiooni.
+Et eksportida lehekülgi, sisesta nende pealkirjad allolevasse tekstikasti, iga pealkiri ise reale ja vali, kas soovid viimast redaktsiooni ja kõiki vanemaid redaktsioone ühes redigeerimislooga või viimast redaktsiooni ühes andmetega viimase redigeerimise kohta.
 
-Viimasel juhul võid sa näiteks "[[{{MediaWiki:Mainpage}}]]" lehekülje, jaoks kasutada samuti linki kujul:  [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+Viimasel juhul saab kasutada ka linki, näiteks lehekülje "[[{{MediaWiki:Mainpage}}]]" jaoks [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
 'exportall' => 'Ekspordi kõik leheküljed',
-'exportcuronly' => 'Lisa vaid viimane versioon lehest, ning mitte kogu ajalugu',
+'exportcuronly' => 'Lisa vaid viimane redaktsioon, mitte kogu ajalugu',
 'exportnohistory' => "----
 '''Märkus:''' Lehekülgede täieliku ajaloo eksportimine on siin leheküljel jõudluse tagamiseks blokeeritud.",
 'exportlistauthors' => 'Lisa kõigile lehekülgedele kogu kaastööliste nimekiri',
@@ -2833,23 +2858,23 @@ Kõik vikidevahelised toimingud on [[Special:Log/import|impordilogis]].',
 'import-interwiki-templates' => 'Liida kõik mallid',
 'import-interwiki-submit' => 'Impordi',
 'import-interwiki-namespace' => 'Sihtkoha nimeruum:',
+'import-interwiki-rootpage' => 'Sihtkoha juurlehekülg (valikuline):',
 'import-upload-filename' => 'Failinimi:',
 'import-comment' => 'Kommentaar:',
 'importtext' => 'Palun kasuta faili allikvikist eksportimiseks [[Special:Export|ekspordivahendit]].
 Salvesta see oma arvutisse ja laadi siia üles.',
-'importstart' => 'Impordin lehekülgi...',
+'importstart' => 'Lehekülgede importimine...',
 'import-revision-count' => '$1 {{PLURAL:$1|versioon|versiooni}}',
 'importnopages' => 'Ei olnud imporditavaid lehekülgi.',
 'imported-log-entries' => 'Imporditi $1 {{PLURAL:$1|logisissekanne|logisissekannet}}.',
 'importfailed' => 'Importimine ebaõnnestus: <nowiki>$1</nowiki>',
-'importunknownsource' => 'Unknown import source type
-Tundmatu tüüpi algallikas',
+'importunknownsource' => 'Tundmatut tüüpi impordiallikas',
 'importcantopen' => 'Ei saa imporditavat faili avada',
 'importbadinterwiki' => 'Vigane vikidevaheline link',
 'importnotext' => 'Tühi või ilma tekstita',
 'importsuccess' => 'Importimine edukalt lõpetatud!',
 'importhistoryconflict' => 'Konfliktne muudatuste ajalugu (võimalik, et seda lehekülge juba varem imporditud)',
-'importnosources' => 'Ühtegi transwiki impordiallikat ei ole defineeritud ning ajaloo otseimpordi funktsioon on välja lülitatud.',
+'importnosources' => 'Ühtegi vikidevahelist impordiallikat pole määratletud ja otsene ajaloo üleslaadimine on keelatud.',
 'importnofile' => 'Ühtegi imporditavat faili ei laaditud üles.',
 'importuploaderrorsize' => 'Üleslaaditava faili import ebaõnnestus.
 Fail on lubatust suurem.',
@@ -2870,6 +2895,9 @@ Palun ürita uuesti.',
 'import-error-interwiki' => 'Lehekülge "$1" ei impordita, sest selle pealkirja hoitakse välislinkide (interviki) jaoks.',
 'import-error-special' => 'Lehekülge "$1" ei impordita, sest see kuulub erinimeruumi, kus pole leheküljed lubatud.',
 'import-error-invalid' => 'Lehekülge "$1" ei impordita, sest selle pealkiri on vigane.',
+'import-options-wrong' => '{{PLURAL:$2|Vale valik|Valed valikud}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Etteantud juurlehekülje pealkiri on vigane.',
+'import-rootpage-nosubpage' => 'Juurlehekülje nimeruumis "$1" pole alamleheküljed lubatud.',
 
 # Import log
 'importlogpage' => 'Impordilogi',
@@ -2892,9 +2920,9 @@ Palun ürita uuesti.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Sinu kasutajaleht',
-'tooltip-pt-anonuserpage' => 'Selle IP aadressi kasutajaleht',
+'tooltip-pt-anonuserpage' => 'Sinu IP-aadressi kasutajalehekülg',
 'tooltip-pt-mytalk' => 'Minu aruteluleht',
-'tooltip-pt-anontalk' => 'Arutelu sellelt IP aadressilt tehtud muudatuste kohta',
+'tooltip-pt-anontalk' => 'Arutelu sellelt IP-aadressilt tehtud muudatuste kohta',
 'tooltip-pt-preferences' => 'Minu eelistused',
 'tooltip-pt-watchlist' => 'Lehekülgede loend, mida jälgid muudatuste osas',
 'tooltip-pt-mycontris' => 'Sinu kaastööde loend',
@@ -2906,13 +2934,13 @@ Palun ürita uuesti.',
 'tooltip-ca-addsection' => 'Lisa uus alaosa',
 'tooltip-ca-viewsource' => 'See lehekülg on kaitstud.
 Saad vaadata selle lähteteksti.',
-'tooltip-ca-history' => 'Selle lehekülje varasemad versioonid.',
+'tooltip-ca-history' => 'Selle lehekülje varasemad redaktsioonid',
 'tooltip-ca-protect' => 'Kaitse seda lehekülge',
 'tooltip-ca-unprotect' => 'Muuda selle lehekülje kaitset',
 'tooltip-ca-delete' => 'Kustuta see lehekülg',
 'tooltip-ca-undelete' => 'Taasta enne lehekülje kustutamist tehtud muudatused',
 'tooltip-ca-move' => 'Teisalda see lehekülg teise nime alla.',
-'tooltip-ca-watch' => 'Lisa see lehekülg oma jälgimisloendile',
+'tooltip-ca-watch' => 'Lisa see lehekülg oma jälgimisloendisse',
 'tooltip-ca-unwatch' => 'Eemalda see lehekülg oma jälgimisloendist',
 'tooltip-search' => 'Otsi vikist',
 'tooltip-search-go' => 'Siirdutakse täpselt sellist pealkirja kandvale lehele (kui selline on olemas)',
@@ -2934,23 +2962,23 @@ Saad vaadata selle lähteteksti.',
 'tooltip-t-upload' => 'Laadi faile üles',
 'tooltip-t-specialpages' => 'Erilehekülgede loend',
 'tooltip-t-print' => 'Selle lehe trükiversioon',
-'tooltip-t-permalink' => 'Püsilink lehe sellele versioonile',
+'tooltip-t-permalink' => 'Püsilink lehekülje sellele redaktsioonile',
 'tooltip-ca-nstab-main' => 'Näita artiklit',
 'tooltip-ca-nstab-user' => 'Näita kasutaja lehte',
 'tooltip-ca-nstab-media' => 'Näita pildi lehte',
-'tooltip-ca-nstab-special' => 'See on erilehekülg, te ei saa seda redigeerida',
+'tooltip-ca-nstab-special' => 'See on erilehekülg, sa ei saa seda lehekülge ennast redigeerida.',
 'tooltip-ca-nstab-project' => 'Näita projekti lehte',
 'tooltip-ca-nstab-image' => 'Näita pildi lehte',
 'tooltip-ca-nstab-mediawiki' => 'Näita süsteemi sõnumit',
 'tooltip-ca-nstab-template' => 'Näita malli',
 'tooltip-ca-nstab-help' => 'Näita abilehte',
 'tooltip-ca-nstab-category' => 'Näita kategooria lehte',
-'tooltip-minoredit' => 'Märgista see pisiparandusena',
+'tooltip-minoredit' => 'Märgi see pisiparanduseks',
 'tooltip-save' => 'Salvesta muudatused',
 'tooltip-preview' => 'Näita tehtavaid muudatusi. Palun kasutage seda enne salvestamist!',
 'tooltip-diff' => 'Näita tehtavaid muudatusi.',
 'tooltip-compareselectedversions' => 'Näita erinevusi kahe selle lehe valitud versiooni vahel.',
-'tooltip-watch' => 'Lisa see lehekülg oma jälgimisloendile',
+'tooltip-watch' => 'Lisa see lehekülg oma jälgimisloendisse',
 'tooltip-watchlistedit-normal-submit' => 'Eemalda leheküljed',
 'tooltip-watchlistedit-raw-submit' => 'Uuenda jälgimisloendit',
 'tooltip-recreate' => 'Taasta kustutatud lehekülg',
@@ -2976,9 +3004,9 @@ Samuti võimaldab see resümee reale põhjenduse lisamist.',
 'siteuser' => '{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1',
 'anonuser' => '{{GRAMMAR:genitive|{{SITENAME}}}} anonüümne kasutaja $1',
 'lastmodifiedatby' => 'Viimati muutis lehekülge $3 $2 kell $1.',
-'othercontribs' => 'Põhineb kasutajate $1 tööl.',
+'othercontribs' => 'Põhineb järgmiste kasutajate kaastööl: $1.',
 'others' => 'teiste',
-'siteusers' => 'võrgukoha {{SITENAME}} {{PLURAL:$2|kasutaja|kasutajate}} $1',
+'siteusers' => '{{GRAMMAR:genitive|{{SITENAME}}}} {{PLURAL:$2|kasutaja|kasutajad}} $1',
 'anonusers' => '{{GRAMMAR:genitive|{{SITENAME}}}} {{PLURAL:$2|anonüümne kasutaja|anonüümsed kasutajad}} $1',
 'creditspage' => 'Lehekülje toimetajate loend',
 'nocredits' => 'Selle lehekülje toimetajate loend ei ole kättesaadav.',
@@ -2991,19 +3019,38 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
 'spambot_username' => 'MediaWiki spämmieemaldus',
 'spam_reverting' => 'Taastan viimase versiooni, mis ei sisalda linke aadressile $1.',
 'spam_blanking' => 'Kõik versioonid sisaldasid linke veebilehele $1. Lehekülg tühjendatud.',
+'spam_deleting' => 'Kustutatud kõik redaktsioonid, mis viitasid aadressile $1.',
 
 # Info page
 'pageinfo-title' => 'Teave lehekülje "$1" kohta',
-'pageinfo-header-edits' => 'Muudatusi',
-'pageinfo-header-watchlist' => 'Jälgimisloend',
-'pageinfo-header-views' => 'Vaatamisi',
-'pageinfo-subjectpage' => 'Lehekülg',
-'pageinfo-talkpage' => 'Arutelulehekülg',
-'pageinfo-watchers' => 'Jälgijate arv',
-'pageinfo-edits' => 'Redaktsioonide arv',
-'pageinfo-authors' => 'Eri autorite arv',
+'pageinfo-header-basic' => 'Põhiteave',
+'pageinfo-header-edits' => 'Redigeerimislugu',
+'pageinfo-header-restrictions' => 'Lehekülje kaitse',
+'pageinfo-header-properties' => 'Lehekülje atribuudid',
+'pageinfo-display-title' => 'Kuvatav pealkiri',
+'pageinfo-default-sort' => 'Vaikejärjestusvõti',
+'pageinfo-length' => 'Lehekülje pikkus (baitides)',
+'pageinfo-article-id' => 'Lehekülje identifikaator',
+'pageinfo-robot-policy' => 'Otsimootori olek',
+'pageinfo-robot-index' => 'Indekseeritav',
+'pageinfo-robot-noindex' => 'Indekseerimatu',
 'pageinfo-views' => 'Vaatamiste arv',
-'pageinfo-viewsperedit' => 'Vaatamisi redaktsiooni kohta',
+'pageinfo-watchers' => 'Lehekülje jälgijate arv',
+'pageinfo-redirects-name' => 'Ümbersuunamisi sellele leheküljele',
+'pageinfo-subpages-name' => 'Selle lehekülje alamlehekülgi',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ümbersuunamine|ümbersuunamist}}; $3 {{PLURAL:$3|mitteümbersuunamine|mitteümbersuunamist}})',
+'pageinfo-firstuser' => 'Lehekülje alustaja',
+'pageinfo-firsttime' => 'Lehekülje alustusaeg',
+'pageinfo-lastuser' => 'Viimane toimetaja',
+'pageinfo-lasttime' => 'Viimase redigeerimise aeg',
+'pageinfo-edits' => 'Redaktsioonide koguarv',
+'pageinfo-authors' => 'Erinevate autorite koguarv',
+'pageinfo-recent-edits' => 'Viimaste redigeerimiste arv (viimase $1 jooksul)',
+'pageinfo-recent-authors' => 'Erinevate viimaste toimetajate arv',
+'pageinfo-restriction' => 'Lehekülje kaitse (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Võlusõna|Võlusõnad}} ($1)',
+'pageinfo-hidden-categories' => 'Peidetud {{PLURAL:$1|kategooria|kategooriad}} ($1)',
+'pageinfo-templates' => 'Kasutatud {{PLURAL:$1|mall|mallid}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Algeline',
@@ -3057,7 +3104,8 @@ Selle avamine võib su arvutit kahjustada.",
 'file-info-size' => '$1 × $2 pikslit, faili suurus: $3, MIME tüüp: $4',
 'file-info-size-pages' => '$1 × $2 pikslit, faili suurus: $3 , MIME tüüp: $4, $5 {{PLURAL:$5|lehekülg|lehekülge}}',
 'file-nohires' => 'Sellest suuremat pilti pole.',
-'svg-long-desc' => 'SVG fail, algsuurus $1 × $2 pikslit, faili suurus: $3',
+'svg-long-desc' => 'SVG-fail, algsuurus $1 × $2 pikslit, faili suurus: $3',
+'svg-long-desc-animated' => 'Animeeritud SVG-fail,  algsuurus $1 × $2 pikslit, faili suurus: $3',
 'show-big-image' => 'Originaalsuurus',
 'show-big-image-preview' => 'Selle eelvaate suurus: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Teine eraldusvõime|Teised eraldusvõimed}}: $1.',
@@ -3067,6 +3115,8 @@ Selle avamine võib su arvutit kahjustada.",
 'file-info-png-looped' => 'korduv',
 'file-info-png-repeat' => 'mängitud $1 {{PLURAL:$1|korra|korda}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|kaader|kaadrit}}',
+'file-no-thumb-animation' => "'''Märkus: Tehniliste piirangute tõttu on selle faili pisipildid animeerimata.'''",
+'file-no-thumb-animation-gif' => "'''Märkus: Tehniliste piirangute tõttu on nii suure eraldusega GIF-piltide pisipildid animeerimata.'''",
 
 # Special:NewFiles
 'newimages' => 'Uute meediafailide galerii',
@@ -3079,7 +3129,7 @@ Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.
 'noimages' => 'Uusi pilte ei ole.',
 'ilsubmit' => 'Otsi',
 'bydate' => 'kuupäeva järgi',
-'sp-newimages-showfrom' => 'Näita uusi faile alates $2 $1',
+'sp-newimages-showfrom' => 'Näita uusi faile alates kuupäevast $2, kell $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'seconds' => '{{PLURAL:$1|üks sekund|$1 sekundit}}',
@@ -3138,7 +3188,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-stripbytecounts' => 'Baitide hulk kokkusurutud riba kohta',
 'exif-jpeginterchangeformat' => 'Kaugus JPEG SOI-ni',
 'exif-jpeginterchangeformatlength' => 'JPEG-andmete suurus baitides',
-'exif-whitepoint' => 'Valge punkti heledus',
+'exif-whitepoint' => 'Valgepunkti värvsus',
 'exif-primarychromaticities' => 'Põhivärvide värvsus',
 'exif-ycbcrcoefficients' => 'Värviruumi ümberkujundamise maatriksi koefitsiendid',
 'exif-referenceblackwhite' => 'Musta ja valge kontrollväärtused',
@@ -3196,7 +3246,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-sharpness' => 'Teravus',
 'exif-devicesettingdescription' => 'Seadme seadistuste kirjeldus',
 'exif-imageuniqueid' => 'Üksiku pildi ID',
-'exif-gpsversionid' => 'GPS tähise versioon',
+'exif-gpsversionid' => 'GPS-tähise versioon',
 'exif-gpslatituderef' => 'Põhja- või lõunalaius',
 'exif-gpslatitude' => 'Laius',
 'exif-gpslongituderef' => 'Ida- või läänepikkus',
@@ -3325,20 +3375,20 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 
 'exif-lightsource-0' => 'Teadmata',
 'exif-lightsource-1' => 'Päevavalgus',
-'exif-lightsource-2' => 'Helendav',
+'exif-lightsource-2' => 'Fluorestsentsvalgus',
 'exif-lightsource-3' => 'Hõõglambi valgus',
 'exif-lightsource-4' => 'Välk',
 'exif-lightsource-9' => 'Hea ilm',
 'exif-lightsource-10' => 'Pilvine ilm',
 'exif-lightsource-11' => 'Varjus',
-'exif-lightsource-12' => 'Luminofoor päevavalgus (D 5700 - 7100K)',
-'exif-lightsource-13' => 'Luminofoor päevavalgus (N 4600 - 5400K)',
-'exif-lightsource-14' => 'Luminofoor külm valgus (W 3900 - 4500K)',
-'exif-lightsource-15' => 'Luminofoor valge (WW 3200 - 3700K)',
+'exif-lightsource-12' => 'Päevane fluorestsentsvalgus (D 5700 – 7100K)',
+'exif-lightsource-13' => 'Päevavalge fluorestsentsvalgus (N 4600 – 5400K)',
+'exif-lightsource-14' => 'Külmvalge fluorestsentsvalgus (W 3900 – 4500K)',
+'exif-lightsource-15' => 'Valge fluorestsentsvalgus (WW 3200 – 3700K)',
 'exif-lightsource-17' => 'Standardne valgus A',
 'exif-lightsource-18' => 'Standardne valgus B',
 'exif-lightsource-19' => 'Standardne valgus C',
-'exif-lightsource-24' => 'stuudio hõõglambid (ISO)',
+'exif-lightsource-24' => 'Stuudio hõõglamp (ISO)',
 'exif-lightsource-255' => 'Muu valgusallikas',
 
 # Flash modes
@@ -3493,7 +3543,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 
 # E-mail address confirmation
 'confirmemail' => 'E-posti aadressi kinnitamine',
-'confirmemail_noemail' => 'Sul ei ole e-aadress määratud [[Special:Preferences|eelistustes]].',
+'confirmemail_noemail' => 'Sul pole [[Special:Preferences|eelistuste leheküljel]] e-posti aadressi määranud.',
 'confirmemail_text' => 'Enne kui saad e-postiga seotud teenuseid kasutada, pead oma e-posti aadressi õigsust kinnitama. Allpool olevat nuppu klõpsates saadetakse sulle e-posti teel kinnituskood. Aadressi kinnitamiseks klõpsa e-kirjas olevat linki.',
 'confirmemail_pending' => 'Kinnituskood on juba saadetud. Kui tegid konto hiljuti, oota palun mõni minut selle saabumist, enne kui üritad uuesti.',
 'confirmemail_send' => 'Saada kinnituskood',
@@ -3595,7 +3645,7 @@ Palun kinnita, et soovid tõesti selle lehekülje taasluua.",
 'autosumm-new' => "Uus lehekülg: '$1'",
 
 # Live preview
-'livepreview-loading' => 'Laen...',
+'livepreview-loading' => 'Laadimine...',
 'livepreview-ready' => 'Laadimisel... Valmis!',
 'livepreview-failed' => 'Elav eelvaade ebaõnnestus! Proovi normaalset eelvaadet.',
 'livepreview-error' => 'Ühendus ebaõnnestus: $1 "$2".
@@ -3635,14 +3685,14 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|arutelu]])',
 
 # Core parser functions
-'unknown_extension_tag' => 'Tundmatu lisa märgend "$1".',
+'unknown_extension_tag' => 'Tundmatu lisa silt "$1".',
 'duplicate-defaultsort' => '\'\'\'Hoiatus:\'\'\' Järjestamisvõti "$2" tühistab eespool oleva järjestamisvõtme "$1".',
 
 # Special:Version
 'version' => 'Versioon',
 'version-extensions' => 'Paigaldatud lisad',
 'version-specialpages' => 'Erileheküljed',
-'version-parserhooks' => 'Süntaksianalüsaatori lisad (Parser hooks)',
+'version-parserhooks' => 'Parserihaagid',
 'version-variables' => 'Muutujad',
 'version-antispam' => 'Rämpsposti tõkestus',
 'version-skins' => 'Kujundused',
@@ -3696,7 +3746,7 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
 * <span class="mw-specialpagecached">Uuendamata sisuga erileheküljed (ei pruugi enam kasutuses olla)</span>',
 'specialpages-group-maintenance' => 'Hooldusaruanded',
 'specialpages-group-other' => 'Teised erileheküljed',
-'specialpages-group-login' => 'Sisselogimine ja registreerumine',
+'specialpages-group-login' => 'Sisselogimine ja konto loomine',
 'specialpages-group-changes' => 'Viimased muudatused ja logid',
 'specialpages-group-media' => 'Failidega seonduv',
 'specialpages-group-users' => 'Kasutajad ja õigused',
@@ -3830,9 +3880,12 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
 'api-error-empty-file' => 'Üleslaaditav fail on tühi.',
 'api-error-emptypage' => 'Uute tühjade lehekülgede loomine pole lubatud.',
 'api-error-fetchfileerror' => 'Sisemine tõrge: Midagi läks faili kättesaamisel valesti.',
+'api-error-fileexists-forbidden' => 'Fail nimega "$1" on juba olemas ja seda ei saa üle kirjutada.',
+'api-error-fileexists-shared-forbidden' => 'Fail nimega "$1" on jagatud failivaramus juba olemas ja seda ei saa üle kirjutada.',
 'api-error-file-too-large' => 'Üleslaaditav fail on liiga suur.',
 'api-error-filename-tooshort' => 'Failinimi on liiga lühike.',
 'api-error-filetype-banned' => 'Antud failitüüp on keelatud.',
+'api-error-filetype-banned-type' => '$1 pole lubatud {{PLURAL:$4|failitüüp|failitüübid}}.  Lubatud {{PLURAL:$3|failitüüp|failitüübid}} on  $2.',
 'api-error-filetype-missing' => 'Failinime tagant puudub laiend.',
 'api-error-hookaborted' => 'Tarkvaralisa katkestas muudatuse tegemise.',
 'api-error-http' => 'Sisetõrge: Serveriga pole võimalik ühendust luua.',
index d9478bf..fde8589 100644 (file)
@@ -20,6 +20,7 @@
  * @author Urhixidur
  * @author Xabier Armendaritz
  * @author לערי ריינהארט
+ * @author පසිඳු කාවින්ද
  */
 
 $namespaceNames = array(
@@ -103,22 +104,22 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#BIRZUZENDU', '#REDIRECT' ),
-       'currentmonth'            => array( '1', 'ORAINGOHILABETE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'ORAINGOHILABETEIZEN', 'CURRENTMONTHNAME' ),
-       'currentday'              => array( '1', 'ORAINGOEGUN', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ORAINGOEGUN2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ORAINGOEGUNIZEN', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ORAINGOURTE', 'CURRENTYEAR' ),
-       'numberofpages'           => array( '1', 'ORRIALDEKOPURU', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ARTIKULUKOPURU', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'FITXATEGIKOPURU', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'LANKIDEKOPURU', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'ALDAKETAKOPURU', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'ORRIALDEIZEN', 'PAGENAME' ),
-       'img_right'               => array( '1', 'eskuinera', 'right' ),
-       'img_left'                => array( '1', 'ezkerrera', 'left' ),
-       'img_center'              => array( '1', 'erdian', 'center', 'centre' ),
+       'redirect'                  => array( '0', '#BIRZUZENDU', '#REDIRECT' ),
+       'currentmonth'              => array( '1', 'ORAINGOHILABETE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'ORAINGOHILABETEIZEN', 'CURRENTMONTHNAME' ),
+       'currentday'                => array( '1', 'ORAINGOEGUN', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ORAINGOEGUN2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ORAINGOEGUNIZEN', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ORAINGOURTE', 'CURRENTYEAR' ),
+       'numberofpages'             => array( '1', 'ORRIALDEKOPURU', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ARTIKULUKOPURU', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'FITXATEGIKOPURU', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'LANKIDEKOPURU', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'ALDAKETAKOPURU', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'ORRIALDEIZEN', 'PAGENAME' ),
+       'img_right'                 => array( '1', 'eskuinera', 'right' ),
+       'img_left'                  => array( '1', 'ezkerrera', 'left' ),
+       'img_center'                => array( '1', 'erdian', 'center', 'centre' ),
 );
 
 $separatorTransformTable = array( ',' => '.', '.' => ',' ); /* Bug 15717 */
@@ -131,7 +132,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ezkutatu patruilatutako aldaketa azken aldaketetan',
 'tog-newpageshidepatrolled' => 'Ezkutatu patruilatutako orriak, orri-zerrenda berritik',
 'tog-extendwatchlist' => 'Jarraipen-zerrenda zabaldu aldaketa guztiak ikusteko, ez bakarrik azken aldaketak',
-'tog-usenewrc' => 'Hobetutako azken aldaketak (JavaScript behar da)',
+'tog-usenewrc' => 'Azken aldaketetan eta jarraipen-zerrendan aldaketak orrialdearen arabera taldekatu (JavaScript behar da)',
 'tog-numberheadings' => 'Goiburukoak automatikoki zenbakitu',
 'tog-showtoolbar' => 'Aldaketen tresna-barra erakutsi (JavaScript)',
 'tog-editondblclick' => 'Klik bikoitzaren bitartez orrialdeak aldatu (JavaScript)',
@@ -139,17 +140,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Atalen izenburuetan klik eginez atala<br />aldatzea gaitu (JavaScript)',
 'tog-showtoc' => 'Edukien taula erakutsi (3 goiburukotik gorako orrialdeentzako)',
 'tog-rememberpassword' => 'Nire saioa ordenagailu honetan gorde ({{PLURAL:$1|egun baterako| $1 egunerako}} gehienez)',
-'tog-watchcreations' => 'Sortzen ditudan orrialdeak nire segimendu zerrendara gehitu',
-'tog-watchdefault' => 'Aldatzen ditudan orrialdeak nire segimendu zerrendara gehitu',
-'tog-watchmoves' => 'Izena aldatutako orrialdeak segimendu zerrendan erakutsi',
-'tog-watchdeletion' => 'Ezabatzen ditudan orrialdeak nire segimendu zerrendara gehitu',
+'tog-watchcreations' => 'Sortzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu',
+'tog-watchdefault' => 'Aldatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu',
+'tog-watchmoves' => 'Izena aldatutako orrialdeak eta fitxategiak jarraipen-zerrendara gehitu',
+'tog-watchdeletion' => 'Ezabatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu',
 'tog-minordefault' => 'Lehenetsi bezala aldaketa txiki bezala markatu guztiak',
 'tog-previewontop' => 'Aurrebista aldaketa koadroaren aurretik erakutsi',
 'tog-previewonfirst' => 'Lehen aldaketan aurrebista erakutsi',
 'tog-nocache' => 'Orrialdeen katxea ezgaitu',
-'tog-enotifwatchlistpages' => 'Bidal iezadazue e-postako mezua, jarraitzen ari naizen orri bat aldatzen denean',
+'tog-enotifwatchlistpages' => 'Bidal iezadazue e-posta bat, jarraitzen ari naizen orrialde edo fitxategi bat aldatzen denean',
 'tog-enotifusertalkpages' => 'Nire eztabaida orrialdea aldatzen denean e-posta jaso',
-'tog-enotifminoredits' => 'Aldaketa txikiak direnean ere e-posta jaso',
+'tog-enotifminoredits' => 'Orrialde edo fitxategietan aldaketak txikiak direnean ere e-posta jaso',
 'tog-enotifrevealaddr' => 'Jakinarazpen mezuetan nire e-posta helbidea erakutsi',
 'tog-shownumberswatching' => 'Jarraitzen duen erabiltzaile kopurua erakutsi',
 'tog-oldsig' => 'Egungo sinadura:',
@@ -165,7 +166,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ezkutatu izena emana duten lankideen aldaketak, jarraitze-zerrendan',
 'tog-watchlisthideanons' => 'Ezkutatu lankide anonimoen aldaketak, jarraitze-zerrendan',
 'tog-watchlisthidepatrolled' => 'Ezkutatu patruilatutako aldaketak jarraitze-zerrendan',
-'tog-nolangconversion' => 'Aldaeren arteko konbertsioa ezgaitu',
 'tog-ccmeonemails' => 'Beste erabiltzaileei bidaltzen dizkiedan mezuen kopiak niri ere bidali',
 'tog-diffonly' => "''Diff''-ak agertzen direnean, orrialdearen edukiera ezkutatu",
 'tog-showhiddencats' => 'Ikusi kategoria ezkutuak',
@@ -387,6 +387,7 @@ $1',
 'youhavenewmessages' => '$1 dauzkazu ($2).',
 'newmessageslink' => 'Mezu berriak',
 'newmessagesdifflink' => 'azken aldaketa ikusi',
+'newmessagesdifflinkplural' => 'azken {{PLURAL:$1|aldaketa|aldaketak}}',
 'youhavenewmessagesmulti' => 'Mezu berriak dituzu $1(e)n',
 'editsection' => 'aldatu',
 'editold' => 'aldatu',
@@ -436,10 +437,12 @@ Existitzen direnen zerrenda ikus dezakezu  [[Special:SpecialPages|{{int:specialp
 # General errors
 'error' => 'Errorea',
 'databaseerror' => 'Datu-base errorea',
-'dberrortext' => 'Datu-basean kontsulta egiterakoan sintaxi errore bat gertatu da. Baliteke softwareak bug bat izatea. Datu-basean egindako azken kontsulta:
-<blockquote><tt>$1</tt></blockquote>
-funtzio honekin: "<tt>$2</tt>".
-Datu-baseak emandako errore informazioa: "<tt>$3: $4</tt>".',
+'dberrortext' => 'Datu-basean kontsulta egiterakoan sintaxi errore bat gertatu da. 
+Baliteke softwareak bug bat izatea. 
+Datu-basean egindako azken kontsulta:
+<blockquote><code>$1</code></blockquote>
+funtzio honekin: "<code>$2</code>".
+Datu-baseak emandako errorea: "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Datu-basean kontsulta egiterakoan sintaxi errore bat gertatu da.
 Datu-basean egindako azken kontsulta:
 "$1"
@@ -475,15 +478,17 @@ Mesedez, bidali gertakar hau administradore bati, URLaren izena jarriz.',
 'badarticleerror' => 'Ezin da ekintza hau orrialde honetan burutu.',
 'cannotdelete' => 'Ezin izan da "$1" orrialde edo fitxategia ezabatu.
 Baliteke beste norbaitek ezabatu izana.',
+'cannotdelete-title' => 'Ezin da "$1" orrialdea ezabatu',
 'badtitle' => 'Izenburu ezegokia',
 'badtitletext' => 'Eskatutako orrialde izenburua ez da baliozkoa, hutsik dago, edo gaizki lotutako hizkuntzen arteko lotura da. Baliteke izenburuetan erabili ezin den karaktereren bat izatea.',
 'perfcached' => 'Hurrengo datuak katxean gordeta daude eta litekeena da guztiz eguneratuta ez egotea. Gehienez {{PLURAL:$1|emaitza 1 dago|$1 emaitza daude}} eskuragarri katxean.',
-'perfcachedts' => 'Hurrengo datuak katxean daude, $1 eguneratu zen azkenekoz. {{PLURAL:$1|emaitza 1 dago|$1 emaitza daude}} eskuragarri katxean.',
+'perfcachedts' => 'Hurrengo datuak katxean daude, $1 eguneratu zen azkenekoz. {{PLURAL:$4|emaitza 1 dago|$4 emaitza daude}} eskuragarri katxean.',
 'querypage-no-updates' => 'Orrialde honen berritzeak ez dira baimentzen. Hemen dagoen data ez da zuzenean berrituko.',
 'wrong_wfQuery_params' => 'Baliogabeko parametroak eman zaizkio wfQuery() funtzioari<br />
 Funtzioa: $1<br />
 Kontsulta: $2',
 'viewsource' => 'Kodea ikusi',
+'viewsource-title' => '$1-en iturria ikusi',
 'actionthrottled' => 'Ekintzaren gainetik pasa da',
 'actionthrottledtext' => 'Spamaren aurkako neurri gisa ekintza hau denbora tarte laburrean aldi askotan egiteko mugapena duzu, eta muga hori zeharkatu duzu.
 Saia zaitez berriro minutu batzuen buruan, mesedez.',
@@ -634,6 +639,8 @@ Behin-behineko pasahitza: $2',
 'passwordreset-emailsent' => 'Gogorarazteko e-posta bidali da.',
 
 # Special:ChangeEmail
+'changeemail' => 'Aldatu e-mail helbidea',
+'changeemail-oldemail' => 'Egungo e-mail helbidea:',
 'changeemail-newemail' => 'E-posta helbide berria:',
 'changeemail-none' => '(bat ere ez)',
 'changeemail-submit' => 'E-posta aldatu',
@@ -735,12 +742,11 @@ edo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}
 'userpage-userdoesnotexist-view' => '"$1" erabiltzaile-kontua ez dago erregistraturik.',
 'blocked-notice-logextract' => 'Erabiltzaile hau blokeatuta dago une honetan.
 Azken blokeoaren erregistroa ageri da behean, erreferentzia gisa:',
-'clearyourcache' => "'''Oharra:''' Gorde ondoren zure nabigatzailearen katxea ekidin beharko duzu aldaketak ikusteko.
-* '''Firefox / Safari:''' ''Shift'' tekla sakatu birkargatzeko momentuan, edo ''Ctrl-Shift-R'' sakatu (''⌘-R''' Mac baten)
-* '''Google Chrome:''' ''Ctrl-Shift-R'' sakatu (''⌘-R'' Mac batean)
+'clearyourcache' => "'''Oharra:''' Gorde ondoren, zure nabigatzailearen katxea ekidin beharko duzu aldaketak ikusteko.
+* '''Firefox / Safari:''' ''Shift'' tekla sakatu birkargatzeko momentuan, edo ''Ctrl-Shift-R'' edo ''Crtl-F5'' sakatu (''⌘-R''' Mac batean)
+* '''Google Chrome:''' ''Ctrl-Shift-R'' sakatu (''⌘-Shift-R'' Mac batean)
 * '''Internet Explorer:''' ''Ctrl'' tekla sakatu birkargatzeko momentuan, edo ''Ctrl-F5'' sakatu
-* '''Konqueror:''': Birkargatzeko klik egin, edo F5 sakatu, besterik ez
-* '''Opera''' erabiltzaileek ''Tresnak → Hobespenak'' atalera jo eta katxea garbitzeko aukera hautatu",
+* '''Opera''' erabiltzaileek ''Tresnak → Hobespenak'' atalera joan eta katxea garbitzeko aukera hautatu",
 'usercssyoucanpreview' => "'''Laguntza:''' Zure CSS berria gorde aurretik probatzeko \"{{int:showpreview}}\" botoia erabili.",
 'userjsyoucanpreview' => "'''Laguntza:''' Zure JS berria gorde aurretik probatzeko \"{{int:showpreview}}\" botoia erabili.",
 'usercsspreview' => "'''Ez ahaztu zure CSS kodea aurreikusten zabiltzala.'''
@@ -755,6 +761,7 @@ Azken blokeoaren erregistroa ageri da behean, erreferentzia gisa:',
 'note' => "'''Oharra:'''",
 'previewnote' => "'''Gogoratu hau aurrikuspen bat dela.'''
 Zure aldaketak ez dira oraindik gorde!",
+'continue-editing' => 'Aldatzen jarraitu',
 'previewconflict' => 'Aurreikuspenak aldaketen koadroan idatzitako testua erakusten du, gorde ondoren agertuko den bezala.',
 'session_fail_preview' => "'''Sentitzen dugu! Ezin izan da zure aldaketa prozesatu, saioko datu batzuen galera dela-eta. Mesedez, saiatu berriz. Arazoak jarraitzen badu, saiatu saioa amaitu eta berriz hasten.'''",
 'session_fail_preview_html' => "'''Sentitzen dugu! Ezin izan dugu zure aldaketa burutu, saio datu galera bat medio.'''
@@ -766,6 +773,7 @@ Zure aldaketak ez dira oraindik gorde!",
 Aldaketa ezeztatua izan da testuaren galtzea galarazteko.
 Hau batzuetan gertatzen da buggyan oinarritutako web proxy zerbitzua erabiltzean.'''",
 'editing' => '$1 aldatzen',
+'creating' => '$1 sortzen',
 'editingsection' => '$1 aldatzen (atala)',
 'editingcomment' => '$1 aldatzen (atal berria)',
 'editconflict' => 'Aldaketa gatazka: $1',
@@ -906,9 +914,9 @@ Administratzaile bezala ikus dezakezu; xehetasun gehiagorako [{{fullurl:{{#Speci
 'rev-deleted-no-diff' => "Ezin duzu ezberdintasun hau ikusi, berrikuspenetako bat '''ezabatua''' izan delako.
 Xehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] aurki ditzakezu.",
 'rev-suppressed-no-diff' => "Ezin duzu ezberdintasunik ikusi berrikuspenen bat '''ezabatua''' izan delako.",
-'rev-deleted-unhide-diff' => "diff honen bertsioetako bat '''ezabatu''' da.
+'rev-deleted-unhide-diff' => "aldaketa honen bertsioetako bat '''ezabatu''' da.
 Xehetasunak ikusgai daude [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabatze erregistroan].
-Administratzailea zarenez, oraindik [$1 diff hau ikus dezakezu], nahi izanez gero.",
+Oraindik [$1 aldaketa hau ikus dezakezu], nahi izanez gero.",
 'rev-suppressed-unhide-diff' => "diff honen bertsioetako bat '''ezeztatu''' da.
 Xehetasunak ikusgai daude [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ezeztatze erregistroan].
 Administratzailea zarenez, oraindik [$1 diff hau ikus dezakezu], nahi izanez gero.",
@@ -983,7 +991,7 @@ Begira itzazu erregistroak.',
 # Suppression log
 'suppressionlog' => 'Ezabatze loga',
 'suppressionlogtext' => 'Azpian administratzaileek ezkutatutako edukia duten ezabaketa eta blokeoen zerrenda dago.
-Ikusi [[Special:BlockList|IP blokeoen zerrenda]] orain dauden blokeoak ikusi ahal izateko.',
+Ikusi [[Special:BlockList|blokeoen zerrenda]] orain dauden blokeoak eta debekuak ikusi ahal izateko.',
 
 # History merging
 'mergehistory' => 'Orrialdeen historiak bateratu',
@@ -1018,6 +1026,7 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 
 # Diffs
 'history-title' => '"$1" orrialdearen historia berrikuspena',
+'difference-title' => '"$1"-en berrikuspenen arteko aldaketa',
 'difference-multipage' => '(Orrialdeen arteko ezberdintasunak)',
 'lineno' => '$1. lerroa:',
 'compareselectedversions' => 'Hautatutako bertsioak alderatu',
@@ -1121,6 +1130,8 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 'prefs-watchlist-token' => 'Jarraipen zerrendaren tokena:',
 'prefs-misc' => 'Denetarik',
 'prefs-resetpass' => 'Pasahitza aldatu',
+'prefs-changeemail' => 'Aldatu e-mail helbidea',
+'prefs-setemail' => 'E-mail helbide bat ezarri',
 'prefs-email' => 'E-posta aukerak',
 'prefs-rendering' => 'Itxura',
 'saveprefs' => 'Gorde',
@@ -1242,7 +1253,7 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'group-all' => '(guztiak)',
 
 'group-user-member' => '{{GENDER:$1|lankidea}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|baieztatutako erabiltzailea}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|baieztatutako lankidea}}',
 'group-bot-member' => '{{GENDER:$1|bot-a}}',
 'group-sysop-member' => '{{GENDER:$1|administratzailea}}',
 'group-bureaucrat-member' => '{{GENDER:$1|burokrata}}',
@@ -1355,6 +1366,7 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'action-userrights' => 'lankide guztien eskumenak aldatu',
 'action-userrights-interwiki' => 'beste wikietako lankideen lankide-eskumenak aldatu',
 'action-siteadmin' => 'datubasea babestu edo babesa kendu',
+'action-sendemail' => 'E-mailak bidali',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|aldaketa 1|$1 aldaketa}}',
@@ -1415,8 +1427,8 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 Aurretik igotako irudiak ikusi edo bilatzeko [[Special:FileList|igotako fitxategien zerrendara]] jo. Igoerak [[Special:Log/upload|igoera erregistroan]] ikus daitezke eta ezabatutakoak [[Special:Log/delete|ezabaketa erregistroan]] zerrendatzen dira.
 
 Orrialde baten irudi bat txertatzeko, erabili kode hauetako bat:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''',
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' * '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' irudia zuzenean erabiltzeko.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''',
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' irudia zuzenean erabiltzeko.",
 'upload-permitted' => 'Baimendutako fitxategi motak: $1.',
 'upload-preferred' => 'Fitxategi mota hobetsiak: $1.',
 'upload-prohibited' => 'Debekatutako fitxategi motak: $1.',
@@ -1454,20 +1466,20 @@ Baimendutako fitxategi {{PLURAL:$3|mota $2 da|motak $2 dira}}.',
 'large-file' => 'Ez da gomendagarria fitxategiak $1 baino handiagoak izatea; fitxategi honen tamaina: $2.',
 'largefileserver' => 'Fitxategi hau zerbitzariak baimentzen duena baino handiagoa da.',
 'emptyfile' => 'Badirudi igotzen ari zaren fitxategia hutsik dagoela. Mesedez, egiaztatu fitxategi hori dela igo nahi duzuna.',
-'fileexists' => "Badago izen hori daukan fitxategi bat; mesedez, ikusi existitzen den '''<tt>[[:$1]]</tt>''' fitxategia aldatu nahi duzun egiaztatzeko.
-[[$1|thumb]]",
-'filepageexists' => "Fitxategi honen deskribapen orria dagoeneko sortuta dago '''<tt>[[:$1]]</tt>'''-en, baina, ez da existitzen izen hori duen fitxategirik.
+'fileexists' => 'Badago izen hori daukan fitxategi bat; mesedez, ikusi existitzen den <strong>[[:$1]]</strong> fitxategia aldatu nahi duzun egiaztatzeko.
+[[$1|thumb]]',
+'filepageexists' => 'Fitxategi honen deskribapen orria dagoeneko sortuta dago <strong>[[:$1]]</strong>-en, baina, ez da existitzen izen hori duen fitxategirik.
 Idazten duzun laburpena ez da deskribapen orrian agertuko.
 Zure laburpena agertzeko, eskuz aldatu beharko duzu.
-[[$1|thumb]]",
-'fileexists-extension' => "Badago antzeko izena duen fitxategi bat: [[$2|thumb]]
-* Igotako fitxategiaren izena: '''<tt>[[:$1]]</tt>'''
-* Aurretik dagoen fitxategiaren izena: '''<tt>[[:$2]]</tt>'''
-Hautatu beste izen bat.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Badago antzeko izena duen fitxategi bat: [[$2|thumb]]
+* Igotako fitxategiaren izena: <strong>[[:$1]]</strong>
+* Aurretik dagoen fitxategiaren izena: <strong>[[:$2]]</strong>
+Hautatu beste izen bat.',
 'fileexists-thumbnail-yes' => "Badirudi neurri txikiko irudia dela ''(irudi txikia)''. [[$1|thumb]]
-Egiaztatu '''<tt>[[:$1]]</tt>''' fitxategia.
+Egiaztatu <strong>[[:$1]]</strong> fitxategia.
 Egiaztatutako fitxategia eta jatorrizkoa berdinak badira ez dago irudi txikia igo beharrik.",
-'file-thumbnail-no' => "Fitxategiaren izena '''<tt>$1</tt>'''-(r)ekin hasten da.
+'file-thumbnail-no' => "Fitxategiaren izena <strong>$1</strong>-(r)ekin hasten da.
 Badirudi tamaina txikiko irudia ''(thumbnail)'' dela.
 Irudi hau bereizmen handiagoan izango bazenu igo ezazu, bestela, fitxategiaren izena aldatu mesedez.",
 'fileexists-forbidden' => 'Badago izen hori daukan fitxategia, eta ezin da gainidatzi.
@@ -1528,7 +1540,7 @@ $1',
 'img-auth-nopathinfo' => 'PATH_INFO falta da.
 Zure zerbitzaria ez dago informazio hau pasatzeko konfiguratuta.
 CGI-oinarriduna izan daiteke, img_auth onartzen ez duena.
-[https://www.mediawiki.org/wiki/Manual:Image_Authorization Ikusi irudi-baimenak.]',
+Ikusi https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'Eskatutako bidea ez dago kofiguratutako igoera-direktorioan.',
 'img-auth-badtitle' => 'Ezin izan da baleko izenbururik eraiki "$1" izenetik abiatuta',
 'img-auth-nologinnWL' => 'Ez duzu saioa hasi eta "$1" ez dago zerrenda zurian.',
@@ -1634,10 +1646,11 @@ Bere [$2 fitxategiaren deskribapen orrialdea] behean dago.',
 ** Copyright bortxaketa
 ** Bikoiztutako fitxategia',
 'filedelete-edit-reasonlist' => 'Ezabaketa arrazoiak aldatu',
+'filedelete-maintenance-title' => 'Ezin da artxiboa ezabatu',
 
 # MIME search
 'mimesearch' => 'MIME bilaketa',
-'mimesearch-summary' => 'Orrialde honek fitxategiak bere MIME motaren arabera iragaztea ahalbidetzen du. Iragazkia: eduki-mota/azpi-mota, adib. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Orrialde honek fitxategiak bere MIME motaren arabera iragaztea ahalbidetzen du. Iragazkia: eduki-mota/azpi-mota, adib. <code>image/jpeg</code>.',
 'mimetype' => 'MIME mota:',
 'download' => 'jaitsi',
 
@@ -1682,7 +1695,9 @@ Bere [$2 fitxategiaren deskribapen orrialdea] behean dago.',
 
 'disambiguations' => 'Argipen orrietara lotzen duten orriak',
 'disambiguationspage' => 'Template:argipen',
-'disambiguations-text' => "Jarraian azaltzen diren orrialdeek '''argipen orrialde''' baterako lotura dute. Kasu bakoitzean dagokion artikulu zuzenarekin izan beharko lukete lotura.<br />Orrialde bat argipen motakoa dela antzeman ohi da [[MediaWiki:Disambiguationspage]] orrialdean agertzen den txantiloietako bat duenean.",
+'disambiguations-text' => "Jarraian azaltzen diren orrialdeek '''argipen orrialde''' baterako lotura dute. 
+Kasu bakoitzean dagokion artikulu zuzenarekin izan beharko lukete lotura.<br />
+Orrialde bat argipen motakoa dela antzeman ohi da [[MediaWiki:Disambiguationspage]] orrialdean agertzen den txantiloietako bat duenean.",
 
 'doubleredirects' => 'Birzuzenketa bikoitzak',
 'doubleredirectstext' => 'Lerro bakoitzean lehen eta bigarren birzuzenketetarako loturak ikus daitezke, eta baita edukia daukan edo eduki beharko lukeen orrialderako lotura ere. Lehen birzuzenketak azken honetara <del>zuzendu</del> beharko luke.',
@@ -1797,6 +1812,10 @@ Erregistro mota, erabiltzailearen izena edota orrialdearen izena iragaziz bistar
 'allpagesprefix' => 'Aurrizki hau duten orrialdeak bistaratu:',
 'allpagesbadtitle' => 'Orrialdearen izena baliogabekoa da edo interwiki edo hizkuntzen arteko aurrizkia dauka. Izenburuetan erabili ezin daitezkeen karaktere bat edo gehiago izan ditzake.',
 'allpages-bad-ns' => '{{SITENAME}}(e)k ez dauka "$1" izeneko izen-tarterik.',
+'allpages-hide-redirects' => 'Birzuzenketak ezkutatu',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Azkena ikusi.',
 
 # Special:Categories
 'categories' => 'Kategoriak',
@@ -1819,7 +1838,7 @@ Ikus, gainera [[Special:WantedCategories|kategoriarik eskatuenak]].',
 'linksearch-ok' => 'Bilatu',
 'linksearch-text' => '"*.wikipedia.org" bezalako izartxoak erabil daitezke.
 Gutxienez goi mailako domeinua behar du, adibidez "*.org".<br />
-Baimendutako protokoloak: <tt>$1</tt> (zure bilaketan hauek ez gehitu).',
+Baimendutako protokoloak: <code>$1</code> (zure bilaketan hauek ez gehitu).',
 'linksearch-line' => '$1, $2(e)tik lotuta',
 'linksearch-error' => 'Komodinak izenaren hasieran bakarrik agertu beharko lirateke.',
 
@@ -1862,6 +1881,7 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
 'mailnologin' => 'Bidalketa helbiderik ez',
 'mailnologintext' => 'Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].',
 'emailuser' => 'Erabiltzaile honi e-posta bidali',
+'emailuser-title-notarget' => 'Erabiltzaileari e-maila bidali',
 'emailpage' => 'Erabiltzaileari e-posta bidali',
 'emailpagetext' => 'Erabiltzaile honek baliozko e-posta helbide bat ezarri badu bere hobespenetan, beheko formularioa erabiliz mezu bat bidal dakioke.
 [[Special:Preferences|Hobespenetan]] daukazun e-posta helbidea azalduko da mezuaren bidaltzaile bezala eta beraz erantzun ahal izango dizu.',
@@ -2114,6 +2134,7 @@ In such cases, you must uncheck or unhide the newest deleted revision.',
 
 [[Special:Log/delete|Ezabaketa erregistrora]] jo azken ezabaketa eta leheneraketak ikusteko.",
 'undelete-header' => 'Berriki ezabatutako orrialdeak ikusteko [[Special:Log/delete|ezabaketa erregistrora]] jo.',
+'undelete-search-title' => 'Ezabatutako orrialdeak bilatu',
 'undelete-search-box' => 'Ezabatutako orrialdeak bilatu',
 'undelete-search-prefix' => 'Honela hasten diren orrialdeak erakutsi:',
 'undelete-search-submit' => 'Bilatu',
@@ -2214,8 +2235,8 @@ Blokeo erregistroa azken sarrera ematen da azpian erreferentziarako:',
 'ipb-confirm' => 'Blokeoa baieztatu',
 'badipaddress' => 'Baliogabeko IP helbidea',
 'blockipsuccesssub' => 'Blokeoa burutu da',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] erabiltzaileari blokeoa ezarri zaio.<br />
-Ikus [[Special:BlockList|IP blokeoen zerrenda]] blokeoak aztertzeko.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] blokeatua izan da.<br />
+Ikus [[Special:BlockList|blokeoen zerrenda]] blokeoak aztertzeko.',
 'ipb-edit-dropdown' => 'Blokeatzeko arrazoiak aldatu',
 'ipb-unblock-addr' => '$1 lankide edo IP helbideari blokeoa baliogabetu',
 'ipb-unblock' => 'Erabiltzaile izen edo IP helbide bati blokeoa kendu',
@@ -2247,6 +2268,7 @@ Ikus [[Special:BlockList|IP blokeoen zerrenda]] blokeoak aztertzeko.',
 'unblocklink' => 'blokeoa kendu',
 'change-blocklink' => 'blokeoa aldatu',
 'contribslink' => 'ekarpenak',
+'emaillink' => 'E-maila bidali',
 'autoblocker' => '"[[User:$1|$1]]"(e)k berriki erabili duen IP helbidea duzulako autoblokeatu zaizu. $1(e)k emandako arrazoia zera da: "\'\'\'$2\'\'\'"',
 'blocklogpage' => 'Blokeo erregistroa',
 'blocklog-showlog' => 'Lankide hau aurretik blokeatua izan da.
@@ -2255,7 +2277,9 @@ Blokeo erregistroa ematen da azpian erreferentziarako:',
 Erregistroa ematen da azpian erreferentziarako:',
 'blocklogentry' => '"[[$1]]" wikilariari blokeoa ezarri zaio. Blokeoaldia: $2 $3',
 'reblock-logentry' => '[[$1]] wikilariari blokeoaldia aldatu diogu. Blokeoaldi berria: $2 $3',
-'blocklogtext' => 'Erabiltzaileen blokeoen ezarpen eta ezabaketen erregistroa da hau. Ez dira automatikoki blokeatutako IP helbideak zerrendatzen. Ikus [[Special:BlockList|IP blokeoen zerrenda]] aktibo dauden blokeoak aztertzeko.',
+'blocklogtext' => 'Erabiltzaileen blokeoen ezarpen eta ezabaketen erregistroa da hau. 
+Automatikoki blokeatutako IP helbideak ez dira zerrendatzen. 
+Ikus [[Special:BlockList|blokeoen zerrenda]] aktibo dauden blokeoak eta debekuak aztertzeko.',
 'unblocklogentry' => '$1 desblokeatu da',
 'block-log-flags-anononly' => 'erabiltzaile anonimoak bakarrik',
 'block-log-flags-nocreate' => 'kontuak sortzea ezgaituta',
@@ -2362,7 +2386,7 @@ Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
 
 "[[:$1]]" helburua existitzen da. Lekua egiteko ezabatu nahi al duzu?',
 'delete_and_move_confirm' => 'Bai, orrialdea ezabatu',
-'delete_and_move_reason' => 'Lekua egiteko ezabatu da',
+'delete_and_move_reason' => '[[$1]] mugitzeko ezabatu da',
 'selfmove' => 'Helburu izenburua berdina da; ezin da orrialde bat bere gainera mugitu.',
 'immobile-source-namespace' => '"$1" motako orrialdeak ezin dira mugitu',
 'immobile-target-namespace' => 'Orrialdeak ezin dira "$1" motara mugitu',
@@ -2387,6 +2411,7 @@ Azken erregistroko sarrera ematen da azpian erreferentzia gisa:",
 Orrialdeak esportatzeko zehaztu hauen izenburuak beheko koadroan, izenburu bat lerroko, eta aukeratu zein bertsio esportatu nahi dituzun.
 
 Horrez gain, lotura zuzena ere erabil dezakezu; adibidez, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] "[[{{MediaWiki:Mainpage}}]]" orrialdearentzako.',
+'exportall' => 'Orrialde guztiak esportatu',
 'exportcuronly' => 'Oraingo berrikuspena bakarrik hartu, ez historia guztia',
 'exportnohistory' => "----
 '''Oharra:''' Formulario honen bitartez orrialdeen historia osoak esportatzeko aukera ezgaitu egin da, errendimendua dela-eta.",
@@ -2573,12 +2598,9 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
 'spam_blanking' => 'Berrikuspen guztiek $1(e)rako lotura zeukaten, husten',
 
 # Info page
-'pageinfo-header-edits' => 'Aldaketak',
-'pageinfo-header-views' => 'Ikustaldiak',
-'pageinfo-subjectpage' => 'Orrialdea',
-'pageinfo-talkpage' => 'Eztabaida-orria',
-'pageinfo-edits' => 'Aldaketa kopurua',
+'pageinfo-header-edits' => 'Aldaketen historia',
 'pageinfo-views' => 'Bistaratze-kopurua',
+'pageinfo-edits' => 'Aldaketa kopuru totala',
 
 # Skin names
 'skinname-standard' => 'Lehenetsia',
@@ -3074,6 +3096,10 @@ Egiaztapen kode hau $4 iraungiko da.',
 'confirm-purge-top' => 'Orrialde honen katxea ezabatu?',
 'confirm-purge-bottom' => 'Orrialdea purgatzean katxea ezabatzen du eta orrialdearen bertsiorik eguneratuena erakustera behartzen du.',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'Ados',
+'confirm-unwatch-button' => 'Ados',
+
 # Multipage image navigation
 'imgmultipageprev' => '&larr; aurreko orrialdea',
 'imgmultipagenext' => 'hurrengo orrialdea &rarr;',
@@ -3163,6 +3189,7 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'version-software' => 'Instalatutako softwarea',
 'version-software-product' => 'Produktua',
 'version-software-version' => 'Bertsioa',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Fitxategi bidea',
@@ -3188,7 +3215,7 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
 * <strong class="mw-specialpagerestricted">Mugatutako orrialde bereziak.</strong>',
 'specialpages-group-maintenance' => 'Mantentze-oharrak',
 'specialpages-group-other' => 'Beste orrialde berezi batzuk',
-'specialpages-group-login' => 'Sartu / Izena eman',
+'specialpages-group-login' => 'Saioa hasi / kontua sortu',
 'specialpages-group-changes' => 'Aldaketa berriak eta erregistroak',
 'specialpages-group-media' => 'Artxiboen orriak',
 'specialpages-group-users' => 'Erabiltzaileak eta eskumenak',
index 1a18c19..533c28c 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Extremaduran (Estremeñu)
+/** Extremaduran (estremeñu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -60,7 +60,6 @@ $messages = array(
 'tog-watchlisthideliu' => "Açonchal eicionis d'usuárius rustrius ena lista de seguimientu",
 'tog-watchlisthideanons' => "Açonchal eicionis d'usuárius anónimus ena lista de seguimientu",
 'tog-watchlisthidepatrolled' => 'Açonchal eicionis vegilás ena lista de seguimientu',
-'tog-nolangconversion' => 'Desatival conversionis de luenguahis',
 'tog-ccmeonemails' => 'Envialmi copias de los emails que enviu a otrus usuárius',
 'tog-diffonly' => 'Nu muestral el continiu la páhina embahu las defs',
 'tog-showhiddencats' => 'Muestral categorias açonchás',
@@ -1063,18 +1062,18 @@ Vai al [[Special:NewFiles|correol de nuevus archivus]] pa echali una guipaina de
 'large-file' => 'Es recomendabri que los archivus nu seyan mayoris de $1; esti archivu ocupa $2.',
 'largefileserver' => 'Esti archivu es mas grandi que lo premitiu pol el sirviol.',
 'emptyfile' => "El archivu qu'as ententau empuntal paci estal vaciu; pol favol, compreba que realmenti se trata el archivu que querias empuntal.",
-'fileexists' => "Ya desisti un archivu con esi nombri.
-Pol favol, compreba que realmenti quieis chambal el archivu '''<tt>[[:$1]]</tt>'''.
-[[$1|thumb]]",
-'filepageexists' => "Ya desisti un artículu con esi nombri, pol favol, compreba '''<tt>[[:$1]]</tt>''' si nu estás siguru e querel chambalu.",
-'fileexists-extension' => "Ya desisti un archivu con un nombri paiciu: [[$2|thumb]]
-* Nombri el archivu empuntau: '''<tt>[[:$1]]</tt>'''
-* Nombri el archivu ya desistenti: '''<tt>[[:$2]]</tt>'''
-Pol favol, lihi un nombri deferenti.",
+'fileexists' => 'Ya desisti un archivu con esi nombri.
+Pol favol, compreba que realmenti quieis chambal el archivu <strong>[[:$1]]</strong>.
+[[$1|thumb]]',
+'filepageexists' => 'Ya desisti un artículu con esi nombri, pol favol, compreba <strong>[[:$1]]</strong> si nu estás siguru e querel chambalu.',
+'fileexists-extension' => 'Ya desisti un archivu con un nombri paiciu: [[$2|thumb]]
+* Nombri el archivu empuntau: <strong>[[:$1]]</strong>
+* Nombri el archivu ya desistenti: <strong>[[:$2]]</strong>
+Pol favol, lihi un nombri deferenti.',
 'fileexists-thumbnail-yes' => "El archivu paci sel una imahin chiquenina ''(cuairu)''. [[$1|thumb]]
-Pol favol, compreba qu'el archivu '''<tt>[[:$1]]</tt>''' nu es la mesma imahin.
+Pol favol, compreba qu'el archivu <strong>[[:$1]]</strong> nu es la mesma imahin.
 Nel chascu en que huera la mesm imahin (inque seya en grandi) nu es mestel qu'empuntis el tu archivu.",
-'file-thumbnail-no' => "El nombri el archivu esmiença pol '''<tt>$1</tt>'''. Paci sel una imahin pequeña ''(cuairu)''.
+'file-thumbnail-no' => "El nombri el archivu esmiença pol <strong>$1</strong>. Paci sel una imahin pequeña ''(cuairu)''.
 Si tiinis la imahin cola resolución orihinal, empúntala, si nu, pol favol, chamba el nombri del archivu.",
 'fileexists-forbidden' => 'Ya dessisti un archivu con esti nombri, i nu es possibri sobriescribilu.
 Si entovia quieris empuntal el archivu, pol favol, güervi atrás i empuntalu con otru nombri. [[File:$1|thumb|center|$1]]',
@@ -1190,7 +1189,7 @@ Pursa nel entítulu la coluna pa chambal el ordin.',
 
 # MIME search
 'mimesearch' => 'Landeu MIME',
-'mimesearch-summary' => "Esta páhina ativa el filtrau d'archivus en hunción la su crasi MIME. Entrá: contenttype/subtype, p.sab. <tt>image/jpeg</tt>.",
+'mimesearch-summary' => "Esta páhina ativa el filtrau d'archivus en hunción la su crasi MIME. Entrá: contenttype/subtype, p.sab. <code>image/jpeg</code>.",
 'mimetype' => 'Tipu MIME:',
 'download' => 'descargal',
 
index 0d92e6e..54d1c09 100644 (file)
@@ -264,158 +264,158 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#تغییر_مسیر', '#تغییرمسیر', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__بی‌فهرست__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__بی‌نگارخانه__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__بافهرست__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__فهرست__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__بی‌بخش__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__بی‌عنوان__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'ماه', 'ماه‌کنونی', 'ماه_کنونی', 'ماه‌کنونی۲', 'ماه_کنونی۲', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ماه۱', 'ماه‌کنونی۱', 'ماه_کنونی۱', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'نام‌ماه‌اضافه', 'نام_ماه_اضافه', 'نام‌ماه‌کنونی‌اضافه', 'نام_ماه_کنونی_اضافه', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'مخفف‌نام‌ماه', 'مخفف_نام_ماه', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'روز', 'روزکنونی', 'روز_کنونی', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'روز۲', 'روز_۲', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'نام‌روز', 'نام_روز', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'سال', 'سال‌کنونی', 'سال_کنونی', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'زمان‌کنونی', 'زمان_کنونی', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ساعت', 'ساعت‌کنونی', 'ساعت_کنونی', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ماه‌محلی', 'ماه_محلی', 'ماه‌محلی۲', 'ماه_محلی۲', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'ماه‌محلی۱', 'ماه_محلی۱', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'نام‌ماه‌محلی', 'نام_ماه_محلی', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'نام‌ماه‌محلی‌اضافه', 'نام_ماه_محلی_اضافه', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'مخفف‌ماه‌محلی', 'مخفف_ماه_محلی', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'روزمحلی', 'روز_محلی', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'روزمحلی۲', 'روز_محلی_۲', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'نام‌روزمحلی', 'نام_روز_محلی', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'سال‌محلی', 'سال_محلی', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'زمان‌محلی', 'زمان_محلی', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ساعت‌محلی', 'ساعت_محلی', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'تعدادصفحه‌ها', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'تعدادکاربران', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'کاربران‌فعال', 'کاربران_فعال', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'نام‌صفحه', 'نام_صفحه', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'نام‌صفحه‌کد', 'نام_صفحه_کد', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'فضای‌نام', 'فضای_نام', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'فضای‌نام‌کد', 'فضای_نام_کد', 'NAMESPACEE' ),
-       'namespacenumber'         => array( '1', 'شماره_فضای_نام', 'شماره‌فضای‌نام', 'NAMESPACENUMBER' ),
-       'talkspace'               => array( '1', 'فضای‌بحث', 'فضای_بحث', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'فضای‌بحث‌کد', 'فضای_بحث_کد', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'فضای‌موضوع', 'فضای‌مقاله', 'فضای_موضوع', 'فضای_مقاله', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'فضای‌موضوع‌کد', 'فضای‌مقاله‌کد', 'فضای_موضوع_کد', 'فضای_مقاله_کد', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'نام‌کامل‌صفحه', 'نام_کامل_صفحه', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'نام‌کامل‌صفحه‌کد', 'نام_کامل_صفحه_کد', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'نام‌زیرصفحه', 'نام_زیرصفحه', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'نام‌زیرصفحه‌کد', 'نام_زیرصفحه_کد', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'نام‌صفحه‌مبنا', 'نام_صفحه_مبنا', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'نام‌صفحه‌مبناکد', 'نام_صفحه_مبنا_کد', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'نام‌صفحه‌بحث', 'نام_صفحه_بحث', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'نام‌صفحه‌بحث‌کد', 'نام_صفحه_بحث_کد', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'نام‌صفحه‌موضوع', 'نام‌صفحه‌مقاله', 'نام_صفحه_موضوع', 'نام_صفحه_مقاله', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'نام‌صفحه‌موضوع‌کد', 'نام‌صفحه‌مقاله‌کد', 'نام_صفحه_موضوع_کد', 'نام_صفحه_مقاله_کد', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'پیغام:', 'پ:', 'MSG:' ),
-       'subst'                   => array( '0', 'جایگزین:', 'جا:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'جایگزین_امن:', 'جام:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'پیغام‌بی‌بسط:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'بندانگشتی', 'انگشتدان', 'انگشتی', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'بندانگشتی=$1', 'انگشتدان=$1', 'انگشتی=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'راست', 'right' ),
-       'img_left'                => array( '1', 'چپ', 'left' ),
-       'img_none'                => array( '1', 'هیچ', 'none' ),
-       'img_width'               => array( '1', '$1پیکسل', '$1px' ),
-       'img_center'              => array( '1', 'وسط', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'قاب', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'بی‌قاب', 'بیقاب', 'بی_قاب', 'frameless' ),
-       'img_page'                => array( '1', 'صفحه=$1', 'صفحه_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'ایستاده', 'ایستاده=$1', 'ایستاده_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'حاشیه', 'border' ),
-       'img_baseline'            => array( '1', 'همکف', 'baseline' ),
-       'img_sub'                 => array( '1', 'زیر', 'sub' ),
-       'img_super'               => array( '1', 'زبر', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'بالا', 'top' ),
-       'img_text_top'            => array( '1', 'متن-بالا', 'text-top' ),
-       'img_middle'              => array( '1', 'میانه', 'middle' ),
-       'img_bottom'              => array( '1', 'پایین', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'متن-پایین', 'text-bottom' ),
-       'img_link'                => array( '1', 'پیوند=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'جایگزین=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'ترجمه:', 'INT:' ),
-       'sitename'                => array( '1', 'نام‌وبگاه', 'نام_وبگاه', 'SITENAME' ),
-       'ns'                      => array( '0', 'فن:', 'NS:' ),
-       'nse'                     => array( '0', 'فنک:', 'NSE:' ),
-       'localurl'                => array( '0', 'نشانی:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'نشانی‌کد:', 'نشانی_کد:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'مسیرمقاله', 'مسیر_مقاله', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'سرور', 'کارساز', 'SERVER' ),
-       'servername'              => array( '0', 'نام‌کارساز', 'نام_کارساز', 'نام‌سرور', 'نام_سرور', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'مسیرسند', 'مسیر_سند', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'مسیرسبک', 'مسیر_سبک', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'جنسیت:', 'جنس:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__عنوان‌تبدیل‌نشده__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__محتواتبدیل‌نشده__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'هفته', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'روزهفته', 'روز_هفته', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'هفته‌محلی', 'هفته_محلی', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'روزهفته‌محلی', 'روز_هفته_محلی', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'نسخه', 'شماره‌نسخه', 'شماره_نسخه', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'روزنسخه', 'روز_نسخه', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'روزنسخه۲', 'روز_نسخه۲', 'روز_نسخه_۲', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'ماه‌نسخه', 'ماه_نسخه', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'ماه‌نسخه۱', 'ماه_نسخه_۱', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'سال‌نسخه', 'سال_نسخه', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'زمان‌یونیکسی‌نسخه', 'زمان‌نسخه', 'زمان_یونیکسی_نسخه', 'زمان_نسخه', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'کاربرنسخه', 'کاربر_نسخه', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'جمع:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'نشانی‌کامل:', 'نشانی_کامل:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'نشانی‌کامل‌کد:', 'نشانی_کامل_کد:', 'FULLURLE:' ),
-       'canonicalurl'            => array( '0', 'نشانی_استاندارد:', 'نشانی‌استاندارد:', 'CANONICALURL:' ),
-       'lcfirst'                 => array( '0', 'ابتداکوچک:', 'ابتدا_کوچک:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ابتدابزرگ:', 'ابتدا_بزرگ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'ک:', 'LC:' ),
-       'uc'                      => array( '0', 'ب:', 'UC:' ),
-       'raw'                     => array( '0', 'خام:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'عنوان‌ظاهری', 'عنوان_ظاهری', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'ن', 'R' ),
-       'newsectionlink'          => array( '1', '__بخش‌جدید__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__بی‌پیوندبخش__', '__بی‌پیوند‌بخش‌جدید__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'نسخه‌کنونی', 'نسخه_کنونی', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'کدنشانی:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'کدلنگر:', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'زمان‌یونیکسی', 'زمان_یونیکسی', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'زمان‌یونیکسی‌محلی', 'زمان_یونیکسی_محلی', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'علامت‌جهت', 'علامت_جهت', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#زبان:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'زبان‌محتوا', 'زبان_محتوا', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'صفحه‌درفضای‌نام:', 'صفحه_در_فضای_نام:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'تعدادمدیران', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'آرایش‌عدد', 'آرایش_عدد', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'لبه‌چپ', 'لبه_چپ', 'PADLEFT' ),
-       'padright'                => array( '0', 'لبه‌راست', 'لبه_راست', 'PADRIGHT' ),
-       'special'                 => array( '0', 'ویژه', 'special' ),
-       'defaultsort'             => array( '1', 'ترتیب:', 'ترتیب‌پیش‌فرض:', 'ترتیب_پیش_فرض:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'مسیرپرونده:', 'مسیر_پرونده:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'برچسب', 'tag' ),
-       'hiddencat'               => array( '1', '__رده‌پنهان__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'صفحه‌دررده', 'صفحه_در_رده', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'اندازه‌صفحه', 'اندازه_صفحه', 'PAGESIZE' ),
-       'index'                   => array( '1', '__نمایه__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__بی‌نمایه__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'تعداددرگروه', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__تغییرمسیرثابت__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'سطح‌حفاطت', 'سطح_حفاظت', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'آرایش‌تاریخ', 'آرایش_تاریخ', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'مسیر', 'PATH' ),
-       'url_wiki'                => array( '0', 'ویکی', 'WIKI' ),
-       'url_query'               => array( '0', 'دستور', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', 'بدون‌خطا', 'بدون_خطا', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', 'جایگزین‌نکن', 'جایگزین_نکن', 'noreplace' ),
+       'redirect'                  => array( '0', '#تغییر_مسیر', '#تغییرمسیر', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__بی‌فهرست__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__بی‌نگارخانه__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__بافهرست__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__فهرست__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__بی‌بخش__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__بی‌عنوان__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ماه', 'ماه‌کنونی', 'ماه_کنونی', 'ماه‌کنونی۲', 'ماه_کنونی۲', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ماه۱', 'ماه‌کنونی۱', 'ماه_کنونی۱', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'نام‌ماه‌اضافه', 'نام_ماه_اضافه', 'نام‌ماه‌کنونی‌اضافه', 'نام_ماه_کنونی_اضافه', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'مخفف‌نام‌ماه', 'مخفف_نام_ماه', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'روز', 'روزکنونی', 'روز_کنونی', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'روز۲', 'روز_۲', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'نام‌روز', 'نام_روز', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'سال', 'سال‌کنونی', 'سال_کنونی', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'زمان‌کنونی', 'زمان_کنونی', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ساعت', 'ساعت‌کنونی', 'ساعت_کنونی', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ماه‌محلی', 'ماه_محلی', 'ماه‌محلی۲', 'ماه_محلی۲', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'ماه‌محلی۱', 'ماه_محلی۱', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'نام‌ماه‌محلی', 'نام_ماه_محلی', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'نام‌ماه‌محلی‌اضافه', 'نام_ماه_محلی_اضافه', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'مخفف‌ماه‌محلی', 'مخفف_ماه_محلی', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'روزمحلی', 'روز_محلی', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'روزمحلی۲', 'روز_محلی_۲', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'نام‌روزمحلی', 'نام_روز_محلی', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'سال‌محلی', 'سال_محلی', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'زمان‌محلی', 'زمان_محلی', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ساعت‌محلی', 'ساعت_محلی', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'تعدادصفحه‌ها', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'تعدادکاربران', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'کاربران‌فعال', 'کاربران_فعال', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'نام‌صفحه', 'نام_صفحه', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'نام‌صفحه‌کد', 'نام_صفحه_کد', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'فضای‌نام', 'فضای_نام', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'فضای‌نام‌کد', 'فضای_نام_کد', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'شماره_فضای_نام', 'شماره‌فضای‌نام', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'فضای‌بحث', 'فضای_بحث', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'فضای‌بحث‌کد', 'فضای_بحث_کد', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'فضای‌موضوع', 'فضای‌مقاله', 'فضای_موضوع', 'فضای_مقاله', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'فضای‌موضوع‌کد', 'فضای‌مقاله‌کد', 'فضای_موضوع_کد', 'فضای_مقاله_کد', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'نام‌کامل‌صفحه', 'نام_کامل_صفحه', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'نام‌کامل‌صفحه‌کد', 'نام_کامل_صفحه_کد', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'نام‌زیرصفحه', 'نام_زیرصفحه', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'نام‌زیرصفحه‌کد', 'نام_زیرصفحه_کد', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'نام‌صفحه‌مبنا', 'نام_صفحه_مبنا', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'نام‌صفحه‌مبناکد', 'نام_صفحه_مبنا_کد', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'نام‌صفحه‌بحث', 'نام_صفحه_بحث', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'نام‌صفحه‌بحث‌کد', 'نام_صفحه_بحث_کد', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'نام‌صفحه‌موضوع', 'نام‌صفحه‌مقاله', 'نام_صفحه_موضوع', 'نام_صفحه_مقاله', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'نام‌صفحه‌موضوع‌کد', 'نام‌صفحه‌مقاله‌کد', 'نام_صفحه_موضوع_کد', 'نام_صفحه_مقاله_کد', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'پیغام:', 'پ:', 'MSG:' ),
+       'subst'                     => array( '0', 'جایگزین:', 'جا:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'جایگزین_امن:', 'جام:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'پیغام‌بی‌بسط:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'بندانگشتی', 'انگشتدان', 'انگشتی', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'بندانگشتی=$1', 'انگشتدان=$1', 'انگشتی=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'راست', 'right' ),
+       'img_left'                  => array( '1', 'چپ', 'left' ),
+       'img_none'                  => array( '1', 'هیچ', 'none' ),
+       'img_width'                 => array( '1', '$1پیکسل', '$1px' ),
+       'img_center'                => array( '1', 'وسط', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'قاب', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'بی‌قاب', 'بیقاب', 'بی_قاب', 'frameless' ),
+       'img_page'                  => array( '1', 'صفحه=$1', 'صفحه_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'ایستاده', 'ایستاده=$1', 'ایستاده_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'حاشیه', 'border' ),
+       'img_baseline'              => array( '1', 'همکف', 'baseline' ),
+       'img_sub'                   => array( '1', 'زیر', 'sub' ),
+       'img_super'                 => array( '1', 'زبر', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'بالا', 'top' ),
+       'img_text_top'              => array( '1', 'متن-بالا', 'text-top' ),
+       'img_middle'                => array( '1', 'میانه', 'middle' ),
+       'img_bottom'                => array( '1', 'پایین', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'متن-پایین', 'text-bottom' ),
+       'img_link'                  => array( '1', 'پیوند=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'جایگزین=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'ترجمه:', 'INT:' ),
+       'sitename'                  => array( '1', 'نام‌وبگاه', 'نام_وبگاه', 'SITENAME' ),
+       'ns'                        => array( '0', 'فن:', 'NS:' ),
+       'nse'                       => array( '0', 'فنک:', 'NSE:' ),
+       'localurl'                  => array( '0', 'نشانی:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'نشانی‌کد:', 'نشانی_کد:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'مسیرمقاله', 'مسیر_مقاله', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'سرور', 'کارساز', 'SERVER' ),
+       'servername'                => array( '0', 'نام‌کارساز', 'نام_کارساز', 'نام‌سرور', 'نام_سرور', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'مسیرسند', 'مسیر_سند', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'مسیرسبک', 'مسیر_سبک', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'جنسیت:', 'جنس:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__عنوان‌تبدیل‌نشده__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__محتواتبدیل‌نشده__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'هفته', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'روزهفته', 'روز_هفته', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'هفته‌محلی', 'هفته_محلی', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'روزهفته‌محلی', 'روز_هفته_محلی', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'نسخه', 'شماره‌نسخه', 'شماره_نسخه', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'روزنسخه', 'روز_نسخه', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'روزنسخه۲', 'روز_نسخه۲', 'روز_نسخه_۲', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'ماه‌نسخه', 'ماه_نسخه', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'ماه‌نسخه۱', 'ماه_نسخه_۱', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'سال‌نسخه', 'سال_نسخه', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'زمان‌یونیکسی‌نسخه', 'زمان‌نسخه', 'زمان_یونیکسی_نسخه', 'زمان_نسخه', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'کاربرنسخه', 'کاربر_نسخه', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'جمع:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'نشانی‌کامل:', 'نشانی_کامل:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'نشانی‌کامل‌کد:', 'نشانی_کامل_کد:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'نشانی_استاندارد:', 'نشانی‌استاندارد:', 'CANONICALURL:' ),
+       'lcfirst'                   => array( '0', 'ابتداکوچک:', 'ابتدا_کوچک:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ابتدابزرگ:', 'ابتدا_بزرگ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'ک:', 'LC:' ),
+       'uc'                        => array( '0', 'ب:', 'UC:' ),
+       'raw'                       => array( '0', 'خام:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'عنوان‌ظاهری', 'عنوان_ظاهری', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'ن', 'R' ),
+       'newsectionlink'            => array( '1', '__بخش‌جدید__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__بی‌پیوندبخش__', '__بی‌پیوند‌بخش‌جدید__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'نسخه‌کنونی', 'نسخه_کنونی', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'کدنشانی:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'کدلنگر:', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'زمان‌یونیکسی', 'زمان_یونیکسی', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'زمان‌یونیکسی‌محلی', 'زمان_یونیکسی_محلی', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'علامت‌جهت', 'علامت_جهت', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#زبان:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'زبان‌محتوا', 'زبان_محتوا', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'صفحه‌درفضای‌نام:', 'صفحه_در_فضای_نام:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'تعدادمدیران', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'آرایش‌عدد', 'آرایش_عدد', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'لبه‌چپ', 'لبه_چپ', 'PADLEFT' ),
+       'padright'                  => array( '0', 'لبه‌راست', 'لبه_راست', 'PADRIGHT' ),
+       'special'                   => array( '0', 'ویژه', 'special' ),
+       'defaultsort'               => array( '1', 'ترتیب:', 'ترتیب‌پیش‌فرض:', 'ترتیب_پیش_فرض:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'مسیرپرونده:', 'مسیر_پرونده:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'برچسب', 'tag' ),
+       'hiddencat'                 => array( '1', '__رده‌پنهان__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'صفحه‌دررده', 'صفحه_در_رده', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'اندازه‌صفحه', 'اندازه_صفحه', 'PAGESIZE' ),
+       'index'                     => array( '1', '__نمایه__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__بی‌نمایه__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'تعداددرگروه', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__تغییرمسیرثابت__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'سطح‌حفاطت', 'سطح_حفاظت', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'آرایش‌تاریخ', 'آرایش_تاریخ', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'مسیر', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ویکی', 'WIKI' ),
+       'url_query'                 => array( '0', 'دستور', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'بدون‌خطا', 'بدون_خطا', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'جایگزین‌نکن', 'جایگزین_نکن', 'noreplace' ),
 );
 
 # Harakat are intentionally not included in the linkTrail. Their addition should
@@ -438,26 +438,26 @@ $messages = array(
 'tog-hidepatrolled' => 'ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند',
 'tog-newpageshidepatrolled' => 'صفحه‌های نهگبانی‌شده از فهرست صفحه‌های تازه پنهان شوند',
 'tog-extendwatchlist' => 'گسترش فهرست پی‌گیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها',
-'tog-usenewrc' => 'از تغییرات اخیر گسترش‌یافته استفاده شود (نیازمند جاوااسکریپت)',
+'tog-usenewrc' => 'گروه تغییرات بر پایه صفحه در تغییرات اخیر و فهرست پیگیری‌ها (نیازمند جاوااسکریپت)',
 'tog-numberheadings' => 'شماره‌گذاری خودکار عنوان‌ها',
 'tog-showtoolbar' => 'نوار ابزار جعبهٔ ویرایش نمایش یابد (نیازمند جاوااسکریپت)',
 'tog-editondblclick' => 'ویرایش صفحه‌ها با دوکلیک (نیازمند جاوااسکریپت)',
 'tog-editsection' => 'ویرایش بخش‌ها از طریق پیوندهای [ویرایش] فعال باشد',
-'tog-editsectiononrightclick' => 'ویرایش بخش‌ها با کلیک راست روی عناوین قسمت‌ها فعال باشد (نیازمند جاوااسکریپت)',
+'tog-editsectiononrightclick' => 'ویرایش بخش‌ها با کلیک راست روی عنوان‌های بخش‌ها فعال باشد (نیازمند جاوااسکریپت)',
 'tog-showtoc' => 'فهرست مندرجات نمایش یابد (برای صفحه‌های دارای بیش از ۳ عنوان)',
 'tog-rememberpassword' => 'گذرواژهٔ من (حداکثر $1 روز) در این مرورگر به خاطر سپرده شود',
-'tog-watchcreations' => 'صفحه‌هایی که می‌سازم به فهرست پی‌گیری‌هایم افزوده شود',
-'tog-watchdefault' => 'صفحه‌هایی که ویرایش می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
-'tog-watchmoves' => 'صفحه‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
-'tog-watchdeletion' => 'صفحه‌هایی که حذف می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
+'tog-watchcreations' => 'صفحه‌هایی که می‌سازم و پرونده‌هایی را که بارگذاری می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
+'tog-watchdefault' => 'صفحه‌ها و پرونده‌هایی را که ویرایش می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
+'tog-watchmoves' => 'صفحه‌ها و پرونده‌هایی را که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
+'tog-watchdeletion' => 'صفحه‌ها و پرونده‌هایی را که حذف می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
 'tog-minordefault' => 'همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت بخورد',
 'tog-previewontop' => 'پیش‌نمایش قبل از جعبهٔ ویرایش نمایش یابد',
 'tog-previewonfirst' => 'پیش‌نمایش هنگام اولین ویرایش نمایش یابد',
 'tog-nocache' => 'حافظهٔ نهانی مرورگر از کار انداخته شود',
-'tog-enotifwatchlistpages' => 'اگر صفحه‌ای از فهرست پی‌گیری‌هایم ویرایش شد برای من نامه‌ای فرستاده شود',
-'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه‌ای فرستاده شود',
-'tog-enotifminoredits' => 'برای تغییرات جزئی در صفحه‌ها هم به من نامه‌ای فرستاده شود',
-'tog-enotifrevealaddr' => 'Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87Ù\94 Ù\85Ù\86 Ø±Ø§ Ø¯Ø± نامه‌های اطلاع‌رسانی نمایش یابد',
+'tog-enotifwatchlistpages' => 'اگر صفحه یا پرونده‌ای از فهرست پی‌گیری‌هایم ویرایش شد برای من نامه‌ای فرستاده شود',
+'tog-enotifusertalkpages' => 'هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من رایانامه فرستاده شود',
+'tog-enotifminoredits' => 'براÛ\8c ØªØºÛ\8cÛ\8cرات Ø¬Ø²Ø¦Û\8c Ø¯Ø± ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87ا Ù\87Ù\85 Ø¨Ù\87 Ù\85Ù\86 Ù\86اÙ\85Ù\87â\80\8cاÛ\8c Ù\81رستادÙ\87 Ø´Ù\88د',
+'tog-enotifrevealaddr' => 'Ù\86شاÙ\86Û\8c Ø±Ø§Û\8cاÙ\86اÙ\85Ù\87Ù\94 Ù\85Ù\86 Ø¯Ø± Ø±Ø§Û\8cانامه‌های اطلاع‌رسانی نمایش یابد',
 'tog-shownumberswatching' => 'شمار کاربران پی‌گیری‌کننده نمایش یابد',
 'tog-oldsig' => 'امضای کنونی:',
 'tog-fancysig' => 'امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)',
@@ -472,7 +472,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'ویرایش‌های کاربران وارد شده به سامانه در فهرست پی‌گیری‌ها پنهان شود',
 'tog-watchlisthideanons' => 'ویرایش‌های کاربران ناشناس در فهرست پی‌گیری‌های من پنهان شود',
 'tog-watchlisthidepatrolled' => 'ویرایش‌های گشت‌خورده در فهرست پی‌گیری‌ها پنهان شود',
-'tog-nolangconversion' => 'تبدیل گویش‌ها غیرفعال شود',
 'tog-ccmeonemails' => 'رونوشتی از نامه‌ای که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود',
 'tog-diffonly' => 'محتوای صفحه، زیر تفاوت نمایش داده نشود',
 'tog-showhiddencats' => 'رده‌های پنهان نمایش داده شود',
@@ -543,7 +542,7 @@ $messages = array(
 'dec' => 'دسامبر',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|رده‌های صفحه|رده‌های صفحه}}',
+'pagecategories' => '{{PLURAL:$1|رده|رده‌ها}}',
 'category_header' => 'صفحه‌های ردهٔ «$1»',
 'subcategories' => 'زیررده‌ها',
 'category-media-header' => 'پرونده‌های ردهٔ «$1»',
@@ -551,7 +550,7 @@ $messages = array(
 'hidden-categories' => '{{PLURAL:$1|ردهٔ پنهان|رده‌های پنهان}}',
 'hidden-category-category' => 'رده‌های پنهان',
 'category-subcat-count' => '{{PLURAL:$2|این رده تنها حاوی زیرردهٔ زیر است.|{{PLURAL:$1|این زیررده|این $1 زیررده}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 زیررده است.}}',
-'category-subcat-count-limited' => 'این رده شامل {{PLURAL:$1|یک زیررده|$1 زیررده}} زیر می‌باشد.',
+'category-subcat-count-limited' => 'این رده شامل {{PLURAL:$1|یک|$1}} زیرردهٔ زیر است.',
 'category-article-count' => '{{PLURAL:$2|این رده فقط دارای صفحهٔ زیر است.|{{PLURAL:$1|این صفحه|این $1 صفحه}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 صفحه است.}}',
 'category-article-count-limited' => '{{PLURAL:$1|صفحهٔ|$1 صفحهٔ}} زیر در ردهٔ فعلی قرار دارند.',
 'category-file-count' => '{{PLURAL:$2|این رده تنها حاوی پروندهٔ زیر است.|{{PLURAL:$1|این پرونده|این $1 پرونده}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 پرونده است.}}',
@@ -559,7 +558,7 @@ $messages = array(
 'listingcontinuesabbrev' => '(ادامه)',
 'index-category' => 'صفحه‌های نمایه‌شده',
 'noindex-category' => 'صفحه‌های نمایه‌نشده',
-'broken-file-category' => 'صفحه‌های دارای پیوندهای پروندهٔ خراب',
+'broken-file-category' => 'صفحه‌های دارای پیوند خراب به پرونده',
 
 'about' => 'درباره',
 'article' => 'صفحهٔ محتوایی',
@@ -618,7 +617,7 @@ $messages = array(
 'edit' => 'ویرایش',
 'create' => 'ایجاد',
 'editthispage' => 'ویرایش این صفحه',
-'create-this-page' => 'این صفحه را ایجاد کنید',
+'create-this-page' => 'ایجاد این صفحه',
 'delete' => 'حذف',
 'deletethispage' => 'حذف این صفحه',
 'undelete_short' => 'احیای {{PLURAL:$1|یک ویرایش|$1 ویرایش}}',
@@ -675,7 +674,7 @@ $1',
 'disclaimerpage' => 'Project:تکذیب‌نامهٔ عمومی',
 'edithelp' => 'راهنمای ویرایش‌کردن',
 'edithelppage' => 'Help:چگونه صفحه‌ها را ویرایش کنیم',
-'helppage' => 'Help:راهنما',
+'helppage' => 'Help:محتویات',
 'mainpage' => 'صفحهٔ اصلی',
 'mainpage-description' => 'صفحهٔ اصلی',
 'policy-url' => 'Project:سیاست‌ها',
@@ -685,7 +684,7 @@ $1',
 'privacypage' => 'Project:سیاست حفظ اسرار',
 
 'badaccess' => 'خطای دسترسی',
-'badaccess-group0' => 'شما اجازهٔ اجرای عملی که درخواست کرده‌اید را ندارید.',
+'badaccess-group0' => 'شما اجازهٔ اجرای عملی را که درخواست کرده‌اید ندارید.',
 'badaccess-groups' => 'عملی که درخواست کرده‌اید منحصر به کاربران {{PLURAL:$2|این گروه|این گروه‌ها}} است: $1.',
 
 'versionrequired' => 'نسخهٔ $1 از نرم‌افزار مدیاویکی لازم است',
@@ -698,6 +697,10 @@ $1',
 'youhavenewmessages' => '$1 دارید ($2).',
 'newmessageslink' => 'پیام‌های جدید',
 'newmessagesdifflink' => 'آخرین تغییر',
+'youhavenewmessagesfromusers' => 'شما  $1  از  {{PLURAL:$3| کاربر دیگر| $3  کاربر}} دارید ( $2 ).',
+'youhavenewmessagesmanyusers' => 'شما  $1  از تعدادی کاربر دارید ( $2 ).',
+'newmessageslinkplural' => '{{PLURAL:$1|پیام جدید |پیام جدید}}',
+'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|تغییر|تغییرات}} اخیر',
 'youhavenewmessagesmulti' => 'پیام‌های جدیدی در $1 دارید.',
 'editsection' => 'ویرایش',
 'editold' => 'ویرایش',
@@ -754,10 +757,10 @@ $1',
 'dberrortext' => 'اشکال نحوی در درخواست فرستاده شده به پایگاه داده رخ داد.
 دلیل این مشکل می‌تواند ایرادی در نرم‌افزار باشد.
 آخرین درخواست که برای پایگاه داده فرستاد شد این بود:
-<blockquote style="direction:ltr;"><tt>$1</tt></blockquote>
-این درخواست از درون عملگر «<span class="ltr"><tt>$2</tt></span>» فرستاده شد.
+<blockquote style="direction:ltr;"><code>$1</code></blockquote>
+این درخواست از درون عملگر «<span class="ltr"><code>$2</code></span>» فرستاده شد.
 پایگاه داده این خطا را بازگرداند:
-<div class="ltr"><tt>$3: $4</tt></div>',
+<div class="ltr"><samp>$3: $4</samp></div>',
 'dberrortextcl' => 'اشکال نحوی در درخواست فرستاده شده به پایگاه داده رخ داد.
 آخرین درخواستی که برای پایگاه داده فرستاد شد این بود:
 <div class="ltr">$1</div>
@@ -776,7 +779,7 @@ $1',
 
 در غیر این صورت ممکن است اشکالی در نرم‌افزار پیدا کرده باشید.
 لطفاً این مشکل را با ذکر نشانی اینترنتی به یکی از [[Special:ListUsers/sysop|مدیران]] گزارش دهید.',
-'missingarticle-rev' => '(نسخهٔ شماره: $1)',
+'missingarticle-rev' => '(شمارهٔ نسخه: $1)',
 'missingarticle-diff' => '(تفاوت: $1، $2)',
 'readonly_lag' => 'پایگاه داده به طور خودکار قفل شده‌است تا نسخه‌های پشتیبان با نسخهٔ اصلی هماهنگ شوند',
 'internalerror' => 'خطای داخلی',
@@ -786,7 +789,7 @@ $1',
 'filecopyerror' => 'نشد از پروندهٔ «$1» روی «$2» نسخه‌برداری شود.',
 'filerenameerror' => 'نشد پروندهٔ «$1» به «$2» تغییر نام یابد.',
 'filedeleteerror' => 'نشد پروندهٔ «$1» حذف شود.',
-'directorycreateerror' => 'امکان ایجاد پوشه $1 وجود نداشت.',
+'directorycreateerror' => 'نشد مسیر $1 را ایجاد کرد.',
 'filenotfound' => 'پروندهٔ «$1» یافت نشد.',
 'fileexistserror' => 'امکان نوشتن روی پرونده $1 وجود ندارد: پرونده از قبل موجود است.',
 'unexpected' => 'مقدار غیرمنتظره: «$1»=«$2».',
@@ -795,6 +798,8 @@ $1',
 'cannotdelete' => 'امکان حذف صفحه یا تصویر «$1» وجود ندارد.
 ممکن است قبلاً فرد دیگری آن را حذف کرده باشد.',
 'cannotdelete-title' => 'نمی‌توان صفحهٔ «$1» را حذف کرد',
+'delete-hook-aborted' => 'ویرایش توسط قلاب لغو شد.
+توضیحی در این مورد داده نشد.',
 'badtitle' => 'عنوان بد',
 'badtitletext' => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی میان‌زبانی یا میان‌ویکی‌ای با پیوند نادرست بود.
 ممکن است حاوی یک یا چند نویسه باشد که نمی‌توانند در عنوان‌ها استفاده شوند.',
@@ -814,7 +819,7 @@ $1',
 'viewsourcetext' => 'می‌توانید متن مبدأ این صفحه را مشاهده کنید یا از آن نسخه بردارید:',
 'viewyourtext' => "می‌توانید کد مبدأ '''ویرایش‌هایتان''' در این صفحه را ببینید و کپی کنید:",
 'protectedinterface' => 'این صفحه ارائه‌دهندهٔ متنی برای واسط کاربر این نرم‌افزار است و به منظور پیشگیری از خرابکاری قفل شده‌است.',
-'editinginterface' => "'''هشدار:''' صفحه‌ای را که ویرایش می‌کنید شامل  متنی‌است که در واسط کاربر این نرم‌افزار به کار رفته‌است.
+'editinginterface' => "'''هشدار:''' صفحه‌ای را که ویرایش می‌کنید شامل متنی‌است که در واسط کاربر این نرم‌افزار به کار رفته‌است.
 تغییر این صفحه منجر به تغییر ظاهر واسط کاربر این نرم‌افزار برای دیگر کاربران خواهد شد.
 برای ترجمه لطفاً از [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] (پروژهٔ ترجمهٔ مدیاویکی) استفاده کنید.",
 'sqlhidden' => '(دستور اس‌کیوال پنهان شده)',
@@ -831,6 +836,8 @@ $2',
 مدیری که آن را قفل کرده چنین توضیحی را ذکر کرده:  ''$3''.",
 'invalidtitle-knownnamespace' => 'عنوان نامعتبر با فضای نام «$2» و متن «$3»',
 'invalidtitle-unknownnamespace' => 'عنوان نامعتبر با فضای نام ناشناختهٔ شمارهٔ $1 و متن «$2»',
+'exception-nologin' => 'به سامانه وارد نشده‌اید',
+'exception-nologin-text' => 'در این ویکی انجام این عمل نیازمند وارد شدن به سیستم  است.',
 
 # Virus scanner
 'virus-badscanner' => "پیکربندی بد: پویشگر ویروس ناشناخته: ''$1''",
@@ -851,6 +858,7 @@ $2',
 'remembermypassword' => 'گذرواژه را (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) در این رایانه به خاطر بسپار',
 'securelogin-stick-https' => 'پس از ورود به سامانه به HTTPS متصل بمان',
 'yourdomainname' => 'دامنهٔ شما:',
+'password-change-forbidden' => 'شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید.',
 'externaldberror' => 'خطایی در ارتباط با پایگاه داده رخ داده‌است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.',
 'login' => 'ورود به سامانه',
 'nav-login-createaccount' => 'ورود به سامانه / ایجاد حساب کاربری',
@@ -901,7 +909,7 @@ $2',
 'password-login-forbidden' => 'استفاده از این نام کاربری و گذرواژه ممنوع است.',
 'mailmypassword' => 'گذرواژهٔ جدید با رایانامه فرستاده شود',
 'passwordremindertitle' => 'یادآور گذرواژهٔ {{SITENAME}}',
-'passwordremindertext' => 'یک نفر (احتمالاً خود شما، با نشانی آی‌پی $1) گذرواژهٔ جدیدی برای حساب کاربری شما در {{SITENAME}} درخواست کرده‌است ($4). 
+'passwordremindertext' => 'یک نفر (احتمالاً خود شما، با نشانی آی‌پی $1) گذرواژهٔ جدیدی برای حساب کاربری شما در {{SITENAME}} درخواست کرده‌است ($4). 
 یک گذرواژهٔ موقت برای کاربر «$2» ساخته شده و برابر با «$3» قرار داده شده‌است.
 اگر هدفتان همین بوده‌است، اکنون باید وارد سامانه شوید و گذرواژهٔ جدیدی برگزینید.
 گذرواژهٔ موقت شما ظرف {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.
@@ -995,7 +1003,7 @@ $2
 گذرواژهٔ موقت: $2',
 'passwordreset-emailsent' => 'یک نامهٔ یادآور فرستاده شده است.',
 'passwordreset-emailsent-capture' => 'رایانامهٔ یادآور فرستاده شد، که به شرح زیر است.',
-'passwordreset-emailerror-capture' => 'رایانامهٔ یادآور همانطور که در زیر مشاهده می‌فرمایید ایجاد شد ولی ارسال آن به کاربر موفقیت‌آمیز نبود: $1',
+'passwordreset-emailerror-capture' => 'رایانامهٔ یادآور همانطور که در زیر مشاهده می‌فرمایید ایجاد شد ولی ارسال آن به کاربر موفقیت‌آمیز نبود: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'تغییر آدرس پست رایانامه',
@@ -1105,16 +1113,19 @@ $2
 'noarticletext-nopermission' => 'این صفحه هم‌اکنون متنی ندارد.
 شما می‌توانید در دیگر صفحه‌ها [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،
 یا <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span>.',
+'missing-revision' => 'ویرایش #$1 از صفحهٔ "{{PAGENAME}}" موجود نیست.
+
+معمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.
+می‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.',
 'userpage-userdoesnotexist' => 'حساب کاربر «<nowiki>$1</nowiki>» ثبت نشده‌است.
 لطفاً مطمئن شوید که می‌خواهید این صفحه را ایجاد یا ویرایش کنید.',
 'userpage-userdoesnotexist-view' => 'حساب کاربری «$1» ثبت نشده‌است.',
 'blocked-notice-logextract' => 'دسترسی این کاربر در حال حاضر بسته است.
 آخرین مورد سیاهه قطع دسترسی در زیر آمده‌است:',
-'clearyourcache' => "'''نکته:''' پس از ذخیره‌کردن ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.
+'clearyourcache' => "''نکته:''' پس از ذخیره‌کردن ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.
 *'''فایرفاکس / سافاری:'''  کلید ''Shift'' را نگه دارید و روی دکمهٔ ''Reload'' کلیک کنید، یا کلید‌های ''Ctrl-F5'' یا ''Ctrl-R'' را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ''⌘-R'')
 *'''گوگل کروم:'''کلیدهای ''Ctrl+Shift+R'' را با هم فشار دهید. (در رایانه‌های اپل مکینتاش کلید‌های ''⌘-Shift-R'')
-*'''اینترنت اکسپلورر:''' کلید ''Ctrl'' را نگه‌دارید و روی دکمهٔ ''Refresh'' کلیک‌ کنید، یا کلید‌های ''Ctrl-F5'' را با هم فشار دهید
-*'''کانکوئرر:''' روی دکمهٔ ''Reload'' کلیک کنید و یا کلید ''F5'' را فشار دهید
+*'''اینترنت اکسپلورر:''' کلید ''Ctrl'' را نگه‌دارید و روی دکمهٔ ''Refresh'' کلیک کنید، یا کلید‌های ''Ctrl-F5'' را با هم فشار دهید
 *'''اپرا:''' حافظهٔ نهانی مرورگر را از طریق منوی ''Tools &rarr; Preferences'' پاک کنید",
 'usercssyoucanpreview' => "'''نکته:''' پیش از ذخیه‌کردن فایل CSS یا JS خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
 'userjsyoucanpreview' => "'''نکته:''' پیش از ذخیره‌کردن فایل CSS یا JS خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
@@ -1161,7 +1172,7 @@ $2
 'storedversion' => 'نسخهٔ ذخیره شده',
 'nonunicodebrowser' => "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''
 راه حلی به کار گرفته شده تا شما بتوانید صفحه‌ها را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
-'editingold' => "'''هشدار: شما در حال ویرایش نسخه‌ای قدیمی از این صفحه هستید.''
+'editingold' => "'''هشدار: شما در حال ویرایش نسخه‌ای قدیمی از این صفحه هستید.'''
 اگر ذخیره‌اش کنید، هر تغییری که پس از این نسخه انجام شده‌است از بین خواهد رفت.",
 'yourdiff' => 'تفاوت‌ها',
 'copyrightwarning' => "لطفاً توجه داشته باشید که فرض می‌شود کلیهٔ مشارکت‌های شما با {{SITENAME}} تحت «$2» منتشر می‌شوند (برای جزئیات بیشتر به $1 مراجعه کنید).
@@ -1180,7 +1191,7 @@ $2
 مدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
 'protectedpagewarning' => "'''هشدار: این صفحه قفل شده است تا فقط کاربران با امتیاز مدیر بتوانند ویرایشش کنند.'''
 آخرین موارد سیاهه در زیر آمده است:",
-'semiprotectedpagewarning' => "'''توجه:''' این صفحه قفل شده‌است تا تنها کاربران ثبت‌نام‌کرده قادر به ویرایش آن باشند.
+'semiprotectedpagewarning' => "'''توجه:''' این صفحه قفل شده‌است تا تنها کاربران ثبت‌نام‌کرده قادر به ویرایش آن باشند.
 آخرین موارد سیاهه در زیر آمده‌است:",
 'cascadeprotectedwarning' => "'''هشدار:''' این صفحه به علت قرارگرفتن در {{PLURAL:$1|صفحهٔ|صفحه‌های}} آبشاری-محافظت‌شدهٔ زیر قفل شده‌است تا فقط مدیران بتوانند ویرایشش کنند.",
 'titleprotectedwarning' => "'''هشدار: این صفحه به شکلی قفل شده‌است که برای ایجاد آن [[Special:ListGroupRights|اختیارات خاصی]] لازم است.'''
@@ -1232,6 +1243,13 @@ $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' => 'صفحه حداکثر عمق بسط دادن تجاوز کرد',
+'parser-unstrip-loop-warning' => 'حلقه در دستور unstrip پیدا شد',
+'parser-unstrip-recursion-limit' => 'از حداکثر ارجاع در دستور unstrip تجاوز شد ($1)',
+'converter-manual-rule-error' => 'خطا در ساختار کتابچهٔ مبدل زبان',
 
 # "Undo" feature
 'undo-success' => 'این ویرایش را می‌توان خنثی کرد.
@@ -1418,6 +1436,10 @@ $1",
 'editundo' => 'خنثی‌سازی',
 'diff-multi' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
 'diff-multi-manyusers' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
+'difference-missing-revision' => '{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.
+
+معمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.
+می‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.',
 
 # Search results
 'searchresults' => 'نتایج جستجو',
@@ -1690,6 +1712,7 @@ $1",
 'right-writeapi' => 'استفاده از API مربوط به نوشتن',
 'right-delete' => 'حذف صفحه‌ها',
 'right-bigdelete' => 'حذف صفحه‌های دارای تاریخچهٔ بزرگ',
+'right-deletelogentry' => 'حذف و احیای مدخل‌های خاصی از سیاهه',
 'right-deleterevision' => 'حذف و احیای نسخه‌های خاصی از صفحه',
 'right-deletedhistory' => 'مشاهدهٔ موارد حذف‌شده از تاریخچه، بدون دیدن متن آن‌ها',
 'right-deletedtext' => 'مشاهدهٔ متن حذف‌شده و تغییرات بین نسخه‌های حذف‌شده',
@@ -1811,11 +1834,11 @@ $1",
 'recentchangeslinked-feed' => 'تغییرات مرتبط',
 'recentchangeslinked-toolbox' => 'تغییرات مرتبط',
 'recentchangeslinked-title' => 'تغییرات مرتبط با $1',
-'recentchangeslinked-noresult' => 'در بازهٔ زمانی داده‌شده تغییری در صفحه‌های پیوندداده رخ نداده‌است.',
+'recentchangeslinked-noresult' => 'در بازهٔ زمانی داده‌شده تغییری در صفحه‌های پیوندداده رخ نداده‌است.',
 'recentchangeslinked-summary' => "در زیر فهرستی از تغییرات اخیر صفحه‌های پیوند داده شده از این صفحه (یا اعضای رده مورد نظر) را می‌بینید.
 صفحه‌هایی که در [[Special:Watchlist|فهرست پی‌گیری‌هایتان]] باشند به صورت '''پررنگ''' نشان داده می‌شوند.",
 'recentchangeslinked-page' => 'نام صفحه:',
-'recentchangeslinked-to' => 'نمایش تغییرات صفحه‌هایی که به صفحهٔ داده‌شده پیوند دارند',
+'recentchangeslinked-to' => 'نمایش تغییرات صفحه‌هایی که به صفحهٔ داده‌شده پیوند دارند',
 
 # Upload
 'upload' => 'بارگذاری پرونده',
@@ -1834,9 +1857,9 @@ $1",
 برای دیدن پرونده‌هایی که قبلاً بارگذاری شده‌اند به [[Special:FileList|فهرست پرونده‌ها]] بروید. بارگذاری نیز مجدد در [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] و حذف پرونده‌ها در [[Special:Log/delete|deletion log]] ثبت می‌شود.
 
 بعد از این که پرونده‌ای را بارگذاری کردید، به این سه شکل می‌توانید آن را در صفحه‌ها استفاده کنید:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' برای استفاده از نسخه کامل پرونده
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' برای استفاده از یک نسخه ۲۰۰ پیکسلی از پرونده درون یک جعبه در سمت چپ متن که عبارت alt text در آن به عنوان توضیح استفاده شده
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' برای استفاده از نسخه کامل پرونده
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' برای استفاده از یک نسخه ۲۰۰ پیکسلی از پرونده درون یک جعبه در سمت چپ متن که عبارت alt text در آن به عنوان توضیح استفاده شده
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
 'upload-permitted' => 'انواع مجاز پرونده‌ها: $1.',
 'upload-preferred' => 'انواع ترجیح‌داده شده پرونده‌ها: $1.',
 'upload-prohibited' => 'انواع غیرمجاز پرونده‌ها: $1.',
@@ -1884,27 +1907,27 @@ $1",
 این مشکل ممکن است به علت خطای تایپی در نام پرونده باشد.
 لطفاً تأیید کنید که می‌خواهید این پرونده را با همین شرایط بارگذاری کنید.',
 'windows-nonascii-filename' => 'این ویکی از نام پرونده با نویسه‌های خاص پشتیبانی نمی‌کند.',
-'fileexists' => "پرونده‌ای با همین نام از قبل موجود است، اگر مطمئن نیستید که می‌خواهید آن پرونده را تغییر دهید، لطفاً '''<tt>[[:$1]]</tt>''' را بررسی کنید.
-[[$1|thumb]]",
-'filepageexists' => "صفحهٔ توضیح برای این پرونده از قبل در '''<tt>[[:$1]]</tt>''' ایجاد شده‌است، اما پرونده‌ای با این نام وجود ندارد.
+'fileexists' => 'پرونده‌ای با همین نام از قبل موجود است، اگر مطمئن نیستید که می‌خواهید آن پرونده را تغییر دهید، لطفاً <strong>[[:$1]]</strong> را بررسی کنید.
+[[$1|thumb]]',
+'filepageexists' => 'صفحهٔ توضیح برای این پرونده از قبل در <strong>[[:$1]]</strong> ایجاد شده‌است، اما پرونده‌ای با این نام وجود ندارد.
 خلاصه‌ای که وارد می‌کنید در صفحهٔ توضیح نمایش نخواهد یافت.
 برای آن که خلاصه شما نمایش یابد، باید آن را به صورت دستی ویرایش کنید.
-[[$1|thumb]]",
-'fileexists-extension' => "پرونده‌ای با نام مشابه وجود دارد: [[$2|thumb]]
-* نام پرونده‌ای که بارگذاری کردید این بود:'''<tt>[[:$1]]</tt>'''
-* نام پرونده‌ای که از قبل موجود است این است:'''<tt>[[:$2]]</tt>'''
-لطفاً یک نام دیگر انتخاب کنید.",
+[[$1|thumb]]',
+'fileexists-extension' => 'پرونده‌ای با نام مشابه وجود دارد: [[$2|thumb]]
+* نام پرونده‌ای که بارگذاری کردید این بود:<strong>[[:$1]]</strong>
+* نام پرونده‌ای که از قبل موجود است این است:<strong>[[:$2]]</strong>
+لطفاً یک نام دیگر انتخاب کنید.',
 'fileexists-thumbnail-yes' => "به نظر می‌رسد که این پرونده، یک تصویر کوچک شده (''بندانگشتی'' یا ''thumbnail'') باشد.
 [[$1|thumb]]
-لطفاً پروندهٔ '''<tt>[[:$1]]</tt>''' را بررسی کنید.
+لطفاً پروندهٔ <strong>[[:$1]]</strong> را بررسی کنید.
 اگر پرونده‌ای که بررسی کردید، همین تصویر در اندازهٔ اصلی‌اش است، نیازی به بارگذاری یک نسخهٔ بندانگشتی اضافه نیست.",
-'file-thumbnail-no' => "نام پرونده با '''<tt>$1</tt>''' آغاز می‌شود.
+'file-thumbnail-no' => "نام پرونده با <strong>$1</strong> آغاز می‌شود.
 به نظر می‌رسد که این پرونده، یک تصویر ''بندانگشتی'' ''(thumbnail)'' از تصویر بزرگتر اصلی باشد.
 اگر تصویر با اندازهٔ اصلی را دارید، آن را بارگذاری کنید؛ در غیر این صورت، نام پرونده را تغییر دهید.",
 'fileexists-forbidden' => 'در حال حاضر، پرونده‌ای به همین نام وجود دارد، و قابل رونویسی نیست.
 اگر هم‌چنان می‌خواهید که پروندهٔ خود را بارگذاری کنید، لطفاً برگردید و نام دیگری استفاده کنید.
 [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'در حال حاضر، پرونده‌ای با همین نام در انبارهٔ مشترک پرونده‌ها وجود دارد.
+'fileexists-shared-forbidden' => 'در حال حاضر، پرونده‌ای با همین نام در انبارهٔ مشترک پرونده‌ها وجود دارد.
 اگر هنوز می‌خواهید پرونده خود را بار کنید، لطفاً برگردید و پروندهٔ موردنظر خود را با نام دیگری بار کنید.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'به نظر می‌رسد این پرونده نسخه‌ای تکراری از {{PLURAL:$1|پروندهٔ|پرونده‌های}} زیر باشد:',
@@ -2000,6 +2023,7 @@ $1',
 'lockmanager-fail-releaselock' => 'نمی‌توان قفل «$1» را گشود.',
 'lockmanager-fail-db-bucket' => 'امکان ارتباط با تعداد کافی پایگاه داده قفل‌ها در محفظه $1 وجود نداشت.',
 'lockmanager-fail-db-release' => 'بازکردن قفل‌های پایگاه دادهٔ $1 ممکن نیست.',
+'lockmanager-fail-svr-acquire' => 'امکان گرفتن قفل‌های سرور $1 وجود ندارد.',
 'lockmanager-fail-svr-release' => 'امکان باز کردن قفل‌های سرور $1 وجود ندارد.',
 
 # ZipDirectoryReader
@@ -2120,6 +2144,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'shared-repo-from' => 'از $1',
 'shared-repo' => 'یک مخزن مشترک',
 'shared-repo-name-wikimediacommons' => 'ویکی‌انبار',
+'upload-disallowed-here' => 'متاسفانه شما نمی توانید این نگاره را بازنویس کنید.',
 
 # File reversion
 'filerevert' => 'واگردانی $1',
@@ -2154,7 +2179,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 # MIME search
 'mimesearch' => 'جستجوی بر اساس MIME',
 'mimesearch-summary' => 'با کمک این صفحه شما می‌توانید پرونده‌هایی که یک نوع MIME به خصوص دارند را پیدا کنید.
-ورودی: به صورت contenttype/subtype ، نظیر <tt>image/jpeg</tt>.',
+ورودی: به صورت contenttype/subtype ، نظیر <code>image/jpeg</code>.',
 'mimetype' => 'نوع MIME:',
 'download' => 'بارگیری',
 
@@ -2201,8 +2226,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 
 'disambiguations' => 'صفحه‌های دارای پیوند به صفحه‌های ابهام‌زدایی',
 'disambiguationspage' => 'Template:ابهام‌زدایی',
-'disambiguations-text' => "صفحه‌های زیر پیوندی به یک '''صفحهٔ ابهام‌زدایی''' هستند.
-اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا Ø¨اید در عوض به موضوعات مرتبط پیوند داده شوند.<br />
+'disambiguations-text' => "صفحه‌های زیر حاوی حداقل یک پیوند به یک '''صفحهٔ ابهام‌زدایی''' هستند.
+اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا Ø´اید در عوض به موضوعات مرتبط پیوند داده شوند.<br />
 یک صفحه هنگامی صفحهٔ ابهام‌زدایی در نظر گرفته می‌شود که در آن از الگویی که به [[MediaWiki:Disambiguationspage]] پیوند دارد استفاده شده باشد.",
 
 'doubleredirects' => 'تغییرمسیرهای دوتایی',
@@ -2228,6 +2253,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|بایت|بایت}}',
 'ncategories' => '$1 {{PLURAL:$1|رده|رده}}',
+'ninterwikis' => '$1 {{PLURAL:$1|میان‌ویکی|میان‌ویکی}}',
 'nlinks' => '$1 {{PLURAL:$1|پیوند|پیوند}}',
 'nmembers' => '$1 {{PLURAL:$1|عضو|عضو}}',
 'nrevisions' => '$1 {{PLURAL:$1|نسخه|نسخه}}',
@@ -2256,6 +2282,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'mostlinkedtemplates' => 'الگوهایی که بیشتر از همه به آن‌ها پیوند داده شده‌است',
 'mostcategories' => 'صفحه‌های دارای بیشترین رده',
 'mostimages' => 'پرونده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است',
+'mostinterwikis' => 'صفحه‌های دارای بیشترین میان‌ویکی',
 'mostrevisions' => 'صفحه‌های دارای بیشترین نسخه',
 'prefixindex' => 'تمام صفحه‌ها با پیشوند',
 'prefixindex-namespace' => 'همهٔ صفحه‌های دارای پیشوند (فضای‌نام $1)',
@@ -2310,6 +2337,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 می‌توانید با انتخاب نوع سیاهه، نام کاربری (حساس به کوچکی و بزرگی حروف) و صفحه‌های تغییریافته (حساس به بزرگی و کوچکی حروف)، نمایش را محدودتر سازید.',
 'logempty' => 'مورد منطبق با منظور شما در سیاهه یافت نشد.',
 'log-title-wildcard' => 'صفحه‌هایی را جستجو کن که عنوانشان با این عبارت آغاز می‌شود',
+'showhideselectedlogentries' => 'نمایش/نهفتن موارد انتخابی در سیاهه',
 
 # Special:AllPages
 'allpages' => 'همهٔ صفحه‌ها',
@@ -2355,7 +2383,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'linksearch-ok' => 'جستجو',
 'linksearch-text' => 'نشانه‌هایی مانند «‎*.wikipedia.org» را می‌توان استفاده کرد.
 حداقل یک دامنه سطح بالا ، به عنوان مثال "*.org" نیاز دارد.<br />
-پروتکل‌های پشتیبانی‌شده: <tt>$1</tt> (هیچ یک از این موارد را در جستجوی خود نیافزایید)',
+پروتکل‌های پشتیبانی‌شده: <code>$1</code> (هیچ یک از این موارد را در جستجوی خود نیافزایید)',
 'linksearch-line' => '$1 از $2 پیوند دارد',
 'linksearch-error' => 'نشانه‌ها فقط در ابتدای نام میزبان اینترنتی می‌توانند استفاده شوند.',
 
@@ -2401,6 +2429,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'mailnologin' => 'نشانی‌ای از فرستنده موجود نیست',
 'mailnologintext' => 'برای فرستادن رایانامه به کاربران دیگر باید [[Special:UserLogin|به سامانه وارد شوید]] و نشانی رایانامهٔ معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.',
 'emailuser' => 'فرستادن نامه به این کاربر',
+'emailuser-title-target' => 'ایمیل این {{GENDER:$1| کاربر}}',
+'emailuser-title-notarget' => 'رایانامه به کاربر',
 'emailpage' => 'رایانامه به کاربر',
 'emailpagetext' => 'شما می‌توانید از فرم زیر برای ارسال یک رایانامه به این کاربر استفاده کنید.
 نشانی رایانامه‌ای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
@@ -2515,7 +2545,7 @@ $NEWPAGE
 'delete-confirm' => 'حذف «$1»',
 'delete-legend' => 'حذف',
 'historywarning' => "'''هشدار!''' صفحه‌ای که قصد دارید حذف کنید تاریخچه‌ای با حدود $1 {{PLURAL:$1|نسخه|نسخه}} دارد:",
-'confirmdeletetext' => 'شما در حال حذف کردن یک صفحه یا تصویر از پایگاه‌ داده همراه با تمام تاریخچهٔ آن هستید.
+'confirmdeletetext' => 'شما در حال حذف کردن یک صفحه یا تصویر از پایگاه داده‌ها همراه با تمام تاریخچهٔ آن هستید.
 لطفاً این عمل را تأیید کنید و اطمینان حاصل کنید که عواقب این کار را می‌دانید و این عمل را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.',
 'actioncomplete' => 'عمل انجام شد',
 'actionfailed' => 'عمل ناموفق بود',
@@ -2544,6 +2574,8 @@ $NEWPAGE
 'rollback' => 'واگردانی ویرایش‌ها',
 'rollback_short' => 'واگردانی',
 'rollbacklink' => 'واگردانی',
+'rollbacklinkcount' => 'واگردانی $1 ویرایش',
+'rollbacklinkcount-morethan' => 'واگردانی بیش از $1 ویرایش',
 'rollbackfailed' => 'واگردانی نشد',
 'cantrollback' => 'نمی‌توان ویرایش را واگرداند؛
 آخرین مشارکت‌کننده تنها مؤلف این مقاله است.',
@@ -2688,7 +2720,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'فضای نام:',
 'invert' => 'انتخاب برعکس شود',
-'tooltip-invert' => 'این جعبه را علامت بزنید تا تغییرات صفحه‌های داخل فضای نام انتخاب شده (و دیگر فضاهای نام علامت زده شده) پنهان شوند',
+'tooltip-invert' => 'این جعبه را علامت بزنید تا تغییرات صفحه‌های داخل فضای نام انتخاب شده (و دیگر فضاهای نام علامت زده شده) پنهان شوند',
 'namespace_association' => 'فضای نام مرتبط',
 'tooltip-namespace_association' => 'این جعبه را علامت بزنید تا فضای نام بحث یا موضوع مرتبط با فضای نام انتخاب شده هم شامل شود',
 'blanknamespace' => '(اصلی)',
@@ -3051,6 +3083,7 @@ $1',
 'import-interwiki-templates' => 'تمام الگوها را شامل شود',
 'import-interwiki-submit' => 'درون‌ریزی شود',
 'import-interwiki-namespace' => 'فضای نام مقصد:',
+'import-interwiki-rootpage' => 'مقصد صفحه ٔ مبنا (اختیاری):',
 'import-upload-filename' => 'نام پرونده:',
 'import-comment' => 'توضیح:',
 'importtext' => 'لطفاً پرونده را از ویکی منبع با کمک [[Special:Export|ابزار برون‌بری]] دریافت کنید.
@@ -3085,6 +3118,9 @@ $1',
 'import-error-interwiki' => 'صفحه «$1» وارد نشد. چون نام آن برای پیوند خارجی (interwiki) رزرو شده‌است.',
 'import-error-special' => 'صفحه «$1» درون‌ریزی نشد، چرا که متعلق به فضای نام غیرمجاز است.',
 'import-error-invalid' => 'صفحه "$1" به دلیل نامعتبر بودن نامش وارد نمی‌شود.',
+'import-options-wrong' => '{{PLURAL:$2|جزئیات|جزئیات}} اشتباه: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'با توجه به ریشه صفحه عنوان نامعتبر است.',
+'import-rootpage-nosubpage' => 'فضای نام  "$1" صفحهٔ مبنا اجازهٔ زیرصفحه نمی‌دهد.',
 
 # Import log
 'importlogpage' => 'سیاههٔ درون‌ریزی‌ها',
@@ -3135,9 +3171,9 @@ $1',
 'tooltip-p-logo' => 'مشاهدهٔ صفحهٔ اصلی',
 'tooltip-n-mainpage' => 'مشاهدهٔ صفحهٔ اصلی',
 'tooltip-n-mainpage-description' => 'مشاهدهٔ صفحهٔ اصلی',
-'tooltip-n-portal' => 'پیرامون پروژه، آنچه می‌توانید انجام دهید و اینکه چه چیز را کجا پیدا کنید',
+'tooltip-n-portal' => 'پیرامون پروژه، آنچه می‌توانید انجام دهید و اینکه چه چیز را کجا پیدا کنید',
 'tooltip-n-currentevents' => 'یافتن اطلاعات پیش‌زمینه پیرامون رویدادهای کنونی',
-'tooltip-n-recentchanges' => 'فهرستی از تغییرات اخیر در ویکی',
+'tooltip-n-recentchanges' => 'فهرستی از تغییرات اخیر ویکی',
 'tooltip-n-randompage' => 'آوردن یک صفحهٔ تصادفی',
 'tooltip-n-help' => 'مکانی برای دریافتن',
 'tooltip-t-whatlinkshere' => 'فهرست همهٔ صفحه‌هایی که به این صفحه پیوند می‌دهند',
@@ -3202,19 +3238,38 @@ $1',
 'spambot_username' => 'هرزه‌تمیزکارِ مدیاویکی',
 'spam_reverting' => 'واگردانی به آخرین نسخه‌ای که پیوندی به $1 ندارد.',
 'spam_blanking' => 'تمام نسخه‌ها حاوی پیوند به $1 بود، در حال خالی کردن',
+'spam_deleting' => 'تمام نسخه‌ها حاوی پیوند به $1 بود، در حال حذف',
 
 # Info page
 'pageinfo-title' => 'اطلاعات در مورد «$1»',
-'pageinfo-header-edits' => 'ویرایش',
-'pageinfo-header-watchlist' => 'فهرست پی‌گیری‌ها',
-'pageinfo-header-views' => 'بازدیدها',
-'pageinfo-subjectpage' => 'صفحه',
-'pageinfo-talkpage' => 'صفحه بحث',
-'pageinfo-watchers' => 'شمار پی‌گیری‌کنندگان',
-'pageinfo-edits' => 'شمار ویرایش‌ها',
-'pageinfo-authors' => 'شمار نویسندگان یکتا',
+'pageinfo-header-basic' => 'اطلاعات اولیه',
+'pageinfo-header-edits' => 'ویرایش تاریخچه',
+'pageinfo-header-restrictions' => 'حفاظت از صفحه',
+'pageinfo-header-properties' => 'ويژگيهای صفحه',
+'pageinfo-display-title' => 'نمایش عنوان',
+'pageinfo-default-sort' => 'کلید مرتب‌سازی پیش‌فرض',
+'pageinfo-length' => 'حجم صفحه  (بایت)',
+'pageinfo-article-id' => 'شناسهٔ صفحه',
+'pageinfo-robot-policy' => 'وضعیت موتور جستجو',
+'pageinfo-robot-index' => 'فهرست‌پذیر',
+'pageinfo-robot-noindex' => 'عدم فهرست‌پذیری',
 'pageinfo-views' => 'شمار بازدیدها',
-'pageinfo-viewsperedit' => 'تعداد بازدید به ازای هر ویرایش',
+'pageinfo-watchers' => 'شمار پی‌گیری‌کنندگان صفحه',
+'pageinfo-redirects-name' => 'تغییرمسیرها به این صفحه',
+'pageinfo-subpages-name' => 'زیرصفحه‌های این صفحه',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|تغییرمسیر|تغییرمسیر}}; $3 {{PLURAL:$3|غیرتغییرمسیر|غیرتغییرمسیر}})',
+'pageinfo-firstuser' => 'به‌وجود آورندهٔ صفحه',
+'pageinfo-firsttime' => 'زمان ایجاد صفحه',
+'pageinfo-lastuser' => 'آخرین ویرایشگر',
+'pageinfo-lasttime' => 'تاریخ آخرین ویرایش',
+'pageinfo-edits' => 'شمار کلی ویرایش‌ها',
+'pageinfo-authors' => 'تعداد کلی نویسندگان یکتا',
+'pageinfo-recent-edits' => 'شماره ویرایش‌های اخیر (در $1 گذشته)',
+'pageinfo-recent-authors' => 'تعداد نویسندگان یکتای اخیر',
+'pageinfo-restriction' => 'محافظت صفحه ( <code>{{lcfirst:$1}}</code> )',
+'pageinfo-magic-words' => '{{PLURAL:$1|حرف|حروف}} جادویی ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )',
+'pageinfo-templates' => '{{PLURAL:$1|الگو|الگو}} استفاده‌شده ($1)',
 
 # Skin names
 'skinname-standard' => 'کلاسیک',
@@ -3270,6 +3325,7 @@ $1',
 'file-info-size-pages' => '<span style="direction:ltr">$1 × $2</span> نقطه، حجم پرونده: $3، نوع MIME پرونده: $4، $5 صفحه',
 'file-nohires' => 'تفکیک‌پذیری بالاتری در دسترس نیست.',
 'svg-long-desc' => 'پروندهٔ اس‌وی‌جی، با ابعاد <span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3',
+'svg-long-desc-animated' => 'پروندهٔ اس‌وی‌جی متحرک، با ابعاد <span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3',
 'show-big-image' => 'تصویر با تفکیک‌پذیری بالاتر',
 'show-big-image-preview' => 'اندازهٔ این پیش‌نمایش: $1.',
 'show-big-image-other' => '{{PLURAL:$2|کیفیت|کیفیت‌های}} دیگر: $1.',
@@ -3279,6 +3335,8 @@ $1',
 'file-info-png-looped' => 'چرخش‌دار',
 'file-info-png-repeat' => '$1 {{PLURAL:$1|بار|بار}} پخش شد',
 'file-info-png-frames' => '$1 {{PLURAL:$1|قاب|قاب}}',
+'file-no-thumb-animation' => "'''توجه: به علت مسائل فنی پیش‌نمایش پرونده به صورت متحرک نمایش داده نمی‌شود.'''",
+'file-no-thumb-animation-gif' => "'''توجه:به علت مسائل فنی پیش‌نمایش پرونده‌های GIF مانند این پرونده، به صورت متحرک نمایش داده نمی‌شود.'''",
 
 # Special:NewFiles
 'newimages' => 'نگارخانهٔ پرونده‌های جدید',
@@ -3308,7 +3366,7 @@ $1',
 
 # Metadata
 'metadata' => 'متاداده',
-'metadata-help' => 'این پرونده حاوی اطلاعات اضافه‌ای‌است که احتمالاً دوربین دیجیتال یا پویشگری که در ایجاد یا دیجیتالی‌کردن آن به کار رفته آن را افزوده‌است. اگر پرونده از وضعیت ابتدایی‌اش تغییر داده شده باشد آنگاه ممکن است شرح و تفصیلات موجود اطلاعات تصویر را تماماً بازتاب ندهد.',
+'metadata-help' => 'این پرونده حاوی اطلاعات اضافه‌ای‌است که احتمالاً دوربین دیجیتال یا پویشگری که در ایجاد یا دیجیتالی‌کردن آن به کار رفته آن را افزوده‌است. اگر پرونده از وضعیت ابتدایی‌اش تغییر داده شده باشد آنگاه ممکن است شرح و تفصیلات موجود اطلاعات تصویر را تماماً بازتاب ندهد.',
 'metadata-expand' => 'نمایش جزئیات تفصیلی',
 'metadata-collapse' => 'نهفتن جزئیات تفصیلی',
 'metadata-fields' => 'فرادادهٔ تصویر نشان داده شده در این پیغام وقتی جدول فراداده‌های تصویر جمع شده باشد هم نمایش داده می‌شود. بقیهٔ موارد تنها زمانی نشان داده می‌شوند که جدول یاد شده باز شود.
@@ -4140,9 +4198,12 @@ $5
 'api-error-empty-file' => 'پرونده‌ای که شما ارسال کردید خالی بود.',
 'api-error-emptypage' => 'ایجاد صفحه‌های خالی مجاز نیست.',
 'api-error-fetchfileerror' => 'خطای داخلی: در هنگام گرفتن پرونده، یک چیزی درست پیش نرفت.',
+'api-error-fileexists-forbidden' => 'یک پرونده با نام "$1" موجود است و امکان بازنویسی نیست.',
+'api-error-fileexists-shared-forbidden' => 'یک پرونده با نام "$1" در انبار اشتراک پرونده موجود است و امکان بازنویسی نیست.',
 'api-error-file-too-large' => 'پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.',
 'api-error-filename-tooshort' => 'نام پرونده بیش از اندازه کوتاه است.',
 'api-error-filetype-banned' => 'این نوع پرونده ممنوع است.',
+'api-error-filetype-banned-type' => '&lrm;$1 {{PLURAL:$4|یک نوع پرونده غیرمجاز است|انواعی پرونده غیرمجاز هستند}}. {{PLURAL:$3|نوع پرونده مجاز|انواع پرونده مجاز}} از این قرار است: $2 .',
 'api-error-filetype-missing' => 'پرونده فرمت ندارد.',
 'api-error-hookaborted' => 'اصلاحیه‌ای که شما سعی در ایجاد آن بودید توسط افزونه‌ای به دام افتاد.',
 'api-error-http' => 'خطای داخلی: قادر به اتصال به سرور نیست.',
index 17f26f0..b6921e1 100644 (file)
@@ -11,6 +11,7 @@
  * @author Centerlink
  * @author Cimon Avaro
  * @author Crt
+ * @author ElmA
  * @author Harriv
  * @author Jaakonam
  * @author Jack Phoenix
@@ -26,6 +27,7 @@
  * @author Pxos
  * @author Silvonen
  * @author Str4nd
+ * @author Stryn
  * @author Tarmo
  * @author Tofu II
  * @author Veikk0.ma
@@ -101,110 +103,110 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#OHJAUS', '#UUDELLEENOHJAUS', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__EISISLUETT__', '__NOTOC__' ),
-       'forcetoc'                => array( '0', '__SISLUETTPAKOTUS__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__SISÄLLYSLUETTELO__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__EIOSIOMUOKKAUSTA__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__EIOTSIKKOA__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'KULUVAKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'KULUVAKUUNIMI', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'KULUVAKUUNIMIGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'KULUVAKUUNIMILYHYT', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'KULUVAPÄIVÄ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'KULUVAPÄIVÄ2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'KULUVAPÄIVÄNIMI', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'KULUVAVUOSI', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'KULUVAAIKA', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'KULUVATUNTI', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'PAIKALLINENKUU', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'PAIKALLINENKUUNIMI', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'PAIKALLINENKUUNIMIGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'PAIKALLINENKUUNIMILYHYT', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'PAIKALLINENPÄIVÄ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'PAIKALLINENPÄIVÄ2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'PAIKALLINENPÄIVÄNIMI', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'PAIKALLINENVUOSI', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'PAIKALLINENAIKA', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'PAIKALLINENTUNTI', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'SIVUMÄÄRÄ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ARTIKKELIMÄÄRÄ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'TIEDOSTOMÄÄRÄ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'KÄYTTÄJÄMÄÄRÄ', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'MUOKKAUSMÄÄRÄ', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'SIVUHAKUMÄÄRÄ', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'SIVUNIMI', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'SIVUNIMIE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NIMIAVARUUS', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NIMIAVARUUSE', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'KESKUSTELUAVARUUS', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'KESKUSTELUAVARUUSE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'AIHEAVARUUS', 'ARTIKKELIAVARUUS', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'AIHEAVARUUSE', 'ARTIKKELIAVARUUSE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'KOKOSIVUNIMI', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'KOKOSIVUNIMIE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ALASIVUNIMI', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ALASIVUNIMIE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'KANTASIVUNIMI', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'KANTASIVUNIMIE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'KESKUSTELUSIVUNIMI', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'KESKUSTELUSIVUNIMIE', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'AIHESIVUNIMI', 'ARTIKKELISIVUNIMI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'AIHESIVUNIMIE', 'ARTIKKELISIVUNIMIE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'subst'                   => array( '0', 'VASTINE:', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'pienoiskuva', 'pienois', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'pienoiskuva=$1', 'pienois=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'oikea', 'right' ),
-       'img_left'                => array( '1', 'vasen', 'left' ),
-       'img_none'                => array( '1', 'tyhjä', 'none' ),
-       'img_center'              => array( '1', 'keskitetty', 'keski', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'kehys', 'kehystetty', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'kehyksetön', 'frameless' ),
-       'img_page'                => array( '1', 'sivu=$1', 'sivu $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'yläoikea', 'yläoikea=$1', 'yläoikea $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'reunus', 'border' ),
-       'img_baseline'            => array( '1', 'perustaso', 'baseline' ),
-       'img_sub'                 => array( '1', 'alaindeksi', 'sub' ),
-       'img_super'               => array( '1', 'yläindeksi', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'ylös', 'ylhäällä', 'top' ),
-       'img_middle'              => array( '1', 'keskellä', 'middle' ),
-       'img_bottom'              => array( '1', 'alas', 'alhaalla', 'bottom' ),
-       'img_link'                => array( '1', 'linkki=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'SIVUSTONIMI', 'SITENAME' ),
-       'ns'                      => array( '0', 'NA:', 'NS:' ),
-       'localurl'                => array( '0', 'PAIKALLINENOSOITE:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'PAIKALLINENOSOITEE:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'PALVELIN', 'SERVER' ),
-       'servername'              => array( '0', 'PALVELINNIMI', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SKRIPTIPOLKU', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'TAIVUTUS:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'SUKUPUOLI:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'KULUVAVIIKKO', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'KULUVAVIIKONPÄIVÄ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'PAIKALLINENVIIKKO', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'PAIKALLINENVIIKONPÄIVÄ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'VERSIOID', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'VERSIOPÄIVÄ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'VERSIOPÄIVÄ2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'VERSIOKUUKAUSI', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'VERSIOVUOSI', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'VERSIOAIKALEIMA', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'MONIKKO:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'TÄYSIOSOITE:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'TÄYSIOSOITEE:', 'FULLURLE:' ),
-       'displaytitle'            => array( '1', 'NÄKYVÄOTSIKKO', 'DISPLAYTITLE' ),
-       'currentversion'          => array( '1', 'NYKYINENVERSIO', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'KULUVAAIKALEIMA', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'PAIKALLINENAIKALEIMA', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#KIELI:', '#LANGUAGE:' ),
-       'numberofadmins'          => array( '1', 'YLLÄPITÄJÄMÄÄRÄ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'MUOTOILELUKU', 'FORMATNUM' ),
-       'defaultsort'             => array( '1', 'AAKKOSTUS:', 'OLETUSAAKKOSTUS:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'TIEDOSTOPOLKU:', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__PIILOLUOKKA__', '__HIDDENCAT__' ),
-       'pagesize'                => array( '1', 'SIVUKOKO', 'PAGESIZE' ),
-       'noindex'                 => array( '1', '__HAKUKONEKIELTO__', '__NOINDEX__' ),
-       'protectionlevel'         => array( '1', 'SUOJAUSTASO', 'PROTECTIONLEVEL' ),
+       'redirect'                  => array( '0', '#OHJAUS', '#UUDELLEENOHJAUS', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__EISISLUETT__', '__NOTOC__' ),
+       'forcetoc'                  => array( '0', '__SISLUETTPAKOTUS__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__SISÄLLYSLUETTELO__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__EIOSIOMUOKKAUSTA__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__EIOTSIKKOA__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'KULUVAKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'KULUVAKUUNIMI', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'KULUVAKUUNIMIGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'KULUVAKUUNIMILYHYT', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'KULUVAPÄIVÄ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'KULUVAPÄIVÄ2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'KULUVAPÄIVÄNIMI', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'KULUVAVUOSI', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'KULUVAAIKA', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'KULUVATUNTI', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'PAIKALLINENKUU', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'PAIKALLINENKUUNIMI', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'PAIKALLINENKUUNIMIGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'PAIKALLINENKUUNIMILYHYT', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'PAIKALLINENPÄIVÄ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'PAIKALLINENPÄIVÄ2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'PAIKALLINENPÄIVÄNIMI', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'PAIKALLINENVUOSI', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'PAIKALLINENAIKA', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'PAIKALLINENTUNTI', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'SIVUMÄÄRÄ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ARTIKKELIMÄÄRÄ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'TIEDOSTOMÄÄRÄ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'KÄYTTÄJÄMÄÄRÄ', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'MUOKKAUSMÄÄRÄ', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'SIVUHAKUMÄÄRÄ', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'SIVUNIMI', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'SIVUNIMIE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NIMIAVARUUS', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NIMIAVARUUSE', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'KESKUSTELUAVARUUS', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'KESKUSTELUAVARUUSE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'AIHEAVARUUS', 'ARTIKKELIAVARUUS', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'AIHEAVARUUSE', 'ARTIKKELIAVARUUSE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'KOKOSIVUNIMI', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'KOKOSIVUNIMIE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ALASIVUNIMI', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ALASIVUNIMIE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'KANTASIVUNIMI', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'KANTASIVUNIMIE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'KESKUSTELUSIVUNIMI', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'KESKUSTELUSIVUNIMIE', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'AIHESIVUNIMI', 'ARTIKKELISIVUNIMI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'AIHESIVUNIMIE', 'ARTIKKELISIVUNIMIE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'subst'                     => array( '0', 'VASTINE:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'pienoiskuva', 'pienois', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'pienoiskuva=$1', 'pienois=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'oikea', 'right' ),
+       'img_left'                  => array( '1', 'vasen', 'left' ),
+       'img_none'                  => array( '1', 'tyhjä', 'none' ),
+       'img_center'                => array( '1', 'keskitetty', 'keski', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'kehys', 'kehystetty', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'kehyksetön', 'frameless' ),
+       'img_page'                  => array( '1', 'sivu=$1', 'sivu $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'yläoikea', 'yläoikea=$1', 'yläoikea $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'reunus', 'border' ),
+       'img_baseline'              => array( '1', 'perustaso', 'baseline' ),
+       'img_sub'                   => array( '1', 'alaindeksi', 'sub' ),
+       'img_super'                 => array( '1', 'yläindeksi', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'ylös', 'ylhäällä', 'top' ),
+       'img_middle'                => array( '1', 'keskellä', 'middle' ),
+       'img_bottom'                => array( '1', 'alas', 'alhaalla', 'bottom' ),
+       'img_link'                  => array( '1', 'linkki=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'SIVUSTONIMI', 'SITENAME' ),
+       'ns'                        => array( '0', 'NA:', 'NS:' ),
+       'localurl'                  => array( '0', 'PAIKALLINENOSOITE:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'PAIKALLINENOSOITEE:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'PALVELIN', 'SERVER' ),
+       'servername'                => array( '0', 'PALVELINNIMI', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SKRIPTIPOLKU', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'TAIVUTUS:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'SUKUPUOLI:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'KULUVAVIIKKO', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'KULUVAVIIKONPÄIVÄ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'PAIKALLINENVIIKKO', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'PAIKALLINENVIIKONPÄIVÄ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'VERSIOID', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'VERSIOPÄIVÄ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'VERSIOPÄIVÄ2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'VERSIOKUUKAUSI', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'VERSIOVUOSI', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'VERSIOAIKALEIMA', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'MONIKKO:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'TÄYSIOSOITE:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'TÄYSIOSOITEE:', 'FULLURLE:' ),
+       'displaytitle'              => array( '1', 'NÄKYVÄOTSIKKO', 'DISPLAYTITLE' ),
+       'currentversion'            => array( '1', 'NYKYINENVERSIO', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'KULUVAAIKALEIMA', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'PAIKALLINENAIKALEIMA', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#KIELI:', '#LANGUAGE:' ),
+       'numberofadmins'            => array( '1', 'YLLÄPITÄJÄMÄÄRÄ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'MUOTOILELUKU', 'FORMATNUM' ),
+       'defaultsort'               => array( '1', 'AAKKOSTUS:', 'OLETUSAAKKOSTUS:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'TIEDOSTOPOLKU:', 'FILEPATH:' ),
+       'hiddencat'                 => array( '1', '__PIILOLUOKKA__', '__HIDDENCAT__' ),
+       'pagesize'                  => array( '1', 'SIVUKOKO', 'PAGESIZE' ),
+       'noindex'                   => array( '1', '__HAKUKONEKIELTO__', '__NOINDEX__' ),
+       'protectionlevel'           => array( '1', 'SUOJAUSTASO', 'PROTECTIONLEVEL' ),
 );
 
 $specialPageAliases = array(
@@ -324,16 +326,16 @@ $messages = array(
 'tog-editsection' => 'Näytä muokkauslinkit jokaisen osion yläpuolella',
 'tog-editsectiononrightclick' => 'Muokkaa osioita napsauttamalla otsikkoa hiiren oikealla painikkeella (JavaScript)',
 'tog-showtoc' => 'Näytä sisällysluettelo sivuille, joilla yli 3 otsikkoa',
-'tog-rememberpassword' => 'Muista kirjautumisen tässä selaimessa (enintään $1 {{PLURAL:$1|päivä|päivää}})',
-'tog-watchcreations' => 'Lisää luomani sivut tarkkailulistalle',
-'tog-watchdefault' => 'Lisää muokkaamani sivut tarkkailulistalle',
-'tog-watchmoves' => 'Lisää siirtämäni sivut tarkkailulistalle',
-'tog-watchdeletion' => 'Lisää poistamani sivut tarkkailulistalle',
+'tog-rememberpassword' => 'Muista kirjautumiseni tässä selaimessa (enintään $1 {{PLURAL:$1|päivä|päivää}})',
+'tog-watchcreations' => 'Lisää luomani sivut tarkkailulistalleni',
+'tog-watchdefault' => 'Lisää muokkaamani sivut tarkkailulistalleni',
+'tog-watchmoves' => 'Lisää siirtämäni sivut tarkkailulistalleni',
+'tog-watchdeletion' => 'Lisää poistamani sivut tarkkailulistalleni',
 'tog-minordefault' => 'Muutokset ovat oletuksena pieniä',
 'tog-previewontop' => 'Näytä esikatselu muokkauskentän yläpuolella',
 'tog-previewonfirst' => 'Näytä esikatselu heti, kun muokkaus aloitetaan',
 'tog-nocache' => 'Älä tallenna sivuja selaimen välimuistiin',
-'tog-enotifwatchlistpages' => 'Lähetä sähköpostiviesti tarkkailtujen sivujen muutoksista',
+'tog-enotifwatchlistpages' => 'Lähetä sähköpostiviesti tarkkailulistallani olevien sivujen muutoksista',
 'tog-enotifusertalkpages' => 'Lähetä sähköpostiviesti, kun käyttäjäsivun keskustelusivu muuttuu',
 'tog-enotifminoredits' => 'Lähetä sähköpostiviesti myös pienistä muokkauksista',
 'tog-enotifrevealaddr' => 'Näytä sähköpostiosoitteeni muille lähetetyissä ilmoituksissa',
@@ -351,7 +353,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Piilota kirjautuneiden käyttäjien muokkaukset tarkkailulistalta',
 'tog-watchlisthideanons' => 'Piilota anonyymien käyttäjien muokkaukset tarkkailulistalta',
 'tog-watchlisthidepatrolled' => 'Piilota tarkastetut muokkaukset tarkkailulistalta',
-'tog-nolangconversion' => 'Älä tee muunnoksia kielivarianttien välillä',
 'tog-ccmeonemails' => 'Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista',
 'tog-diffonly' => 'Älä näytä sivun sisältöä versioita vertailtaessa',
 'tog-showhiddencats' => 'Näytä piilotetut luokat',
@@ -425,7 +426,7 @@ $messages = array(
 'pagecategories' => '{{PLURAL:$1|Luokka|Luokat}}',
 'category_header' => "Luokan ''$1'' sisältämät sivut",
 'subcategories' => 'Alaluokat',
-'category-media-header' => 'Luokan ”$1” sisältämät tiedostot',
+'category-media-header' => 'Tiedostot, jotka ovat luokassa $1',
 'category-empty' => "''Tässä luokassa ei ole sivuja eikä tiedostoja.''",
 'hidden-categories' => '{{PLURAL:$1|Piilotettu luokka|Piilotetut luokat}}',
 'hidden-category-category' => 'Piilotetut luokat',
@@ -576,6 +577,10 @@ $1',
 'youhavenewmessages' => 'Sinulle on $1 ($2).',
 'newmessageslink' => 'uusia viestejä',
 'newmessagesdifflink' => 'viimeisin muutos',
+'youhavenewmessagesfromusers' => 'Sinulle on $1 {{PLURAL:$3|toiselta käyttäjältä|$3 käyttäjältä}} ($2).',
+'youhavenewmessagesmanyusers' => 'Sinulle on $1 uusia viestejä useilta käyttäjiltä ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|uusi viesti|uusia viestejä}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|viimeinen muutos|viimeiset muutokset}}',
 'youhavenewmessagesmulti' => 'Sinulla on uusia viestejä sivuilla $1',
 'editsection' => 'muokkaa',
 'editold' => 'muokkaa',
@@ -629,10 +634,10 @@ Luettelo toimintosivuista löytyy sivulta [[Special:SpecialPages|{{int:specialpa
 'databaseerror' => 'Tietokantavirhe',
 'dberrortext' => 'Tietokantakyselyssä oli syntaksivirhe.
 Se saattaa johtua ohjelmointivirheestä.
-Viimeinen tietokantakysely, jota yritettiin, oli:
-<blockquote><tt>$1</tt></blockquote>.
-Se tehtiin funktiosta ”<tt>$2</tt>”.
-Tietokanta palautti virheen ”<tt>$3: $4</tt>”.',
+Viimeinen tietokantakysely:
+<blockquote><code>$1</code></blockquote>
+Se tehtiin funktiosta <code>$2</code>.
+Tietokanta palautti virheen <samp>$3: $4</samp>.',
 'dberrortextcl' => 'Tietokantakyselyssä oli syntaksivirhe. Viimeinen tietokantakysely, jota yritettiin, oli: ”$1”. Se tehtiin funktiosta ”$2”. Tietokanta palautti virheen ”$3: $4”.',
 'laggedslavemode' => "'''Varoitus:''' Sivu ei välttämättä sisällä viimeisimpiä muutoksia.",
 'readonly' => 'Tietokanta on lukittu',
@@ -665,6 +670,7 @@ Ilmoita tämän sivun osoite wikin [[Special:ListUsers/sysop|ylläpitäjälle]].
 'cannotdelete' => 'Sivun tai tiedoston ”$1” poisto epäonnistui.
 Joku muu on saattanut poistaa sen.',
 'cannotdelete-title' => 'Sivua $1 ei voi poistaa',
+'delete-hook-aborted' => 'Laajennuskoohdi esti muokkauksen antamatta syytä.',
 'badtitle' => 'Virheellinen otsikko',
 'badtitletext' => 'Pyytämäsi sivuotsikko oli virheellinen, tyhjä tai väärin linkitetty kieltenvälinen tai wikienvälinen linkki.',
 'perfcached' => 'Tiedot ovat välimuistista eivätkä välttämättä ole ajan tasalla. Välimuistissa on enintään {{PLURAL:$1|yksi tulos|$1 tulosta}}.',
@@ -689,12 +695,15 @@ $2',
 'customcssprotected' => 'Sinulla ei ole oikeutta muuttaa tätä CSS-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
 'customjsprotected' => 'Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
 'ns-specialprotected' => 'Toimintosivuja ei voi muokata.',
-'titleprotected' => "Käyttäjä [[User:$1|$1]] on asettanut tämän sivun luontikieltoon: ''$2''.",
+'titleprotected' => "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.
+Syynä on: ''$2''.",
 'filereadonlyerror' => 'Tiedostoa "$1" ei voi muuttaa, koska jaettu mediavarasto "$2" on "vain luku" -tilassa.
 
 Lukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: "$3".',
-'invalidtitle-knownnamespace' => 'Virheellinen nimike nimitilaan "$2" ja teksti "$3"',
-'invalidtitle-unknownnamespace' => 'Virheellinen nimi tuntemattomassa nimitilassa $1 ja tekstissä $2',
+'invalidtitle-knownnamespace' => 'Virheellinen sivunimi, nimiavaruus "$2" ja teksti "$3"',
+'invalidtitle-unknownnamespace' => 'Virheellinen sivunimi, tuntematon nimiavaruus numero $1 ja teksti $2',
+'exception-nologin' => 'Et ole kirjautuneena',
+'exception-nologin-text' => 'Tämä sivu tai toiminto edellyttää sisäänkirjautumista tähän wikiin.',
 
 # Virus scanner
 'virus-badscanner' => "Virheellinen asetus: Tuntematon virustutka: ''$1''",
@@ -715,6 +724,7 @@ Käyttäjätunnuksesi on luotu.
 'remembermypassword' => 'Muista minut (enintään $1 {{PLURAL:$1|päivä|päivää}})',
 '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ä.',
 'externaldberror' => 'Tapahtui virhe ulkoisen autentikointitietokannan käytössä tai sinulla ei ole lupaa päivittää tunnustasi.',
 'login' => 'Kirjaudu sisään',
 'nav-login-createaccount' => 'Kirjaudu sisään tai luo tunnus',
@@ -947,6 +957,10 @@ tai [{{fullurl:{{FULLPAGENAME}}|action=edit}} muokata tätä sivua]</span>.',
 'noarticletext-nopermission' => 'Tällä hetkellä tällä sivulla ei ole tekstiä.
 Voit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta
 tai <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheeseen liittyviä lokeja]</span>',
+'missing-revision' => 'Muutosta #$1 sivulla "{{PAGENAME}}" ei ole olemassa.
+
+Tämä yleensä johtuu vanhentuneesta historialinkistä sivulle, joka on poistettu.
+Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].',
 'userpage-userdoesnotexist' => 'Käyttäjätunnusta <nowiki>$1</nowiki> ei ole rekisteröity. Varmista haluatko muokata tätä sivua.',
 'userpage-userdoesnotexist-view' => 'Käyttäjätunnusta ”$1” ei ole rekisteröity.',
 'blocked-notice-logextract' => 'Tämä käyttäjä on tällä hetkellä estetty.
@@ -1006,7 +1020,7 @@ Alla on viimeisin lokitapahtuma:",
 'semiprotectedpagewarning' => 'Tämä sivu on lukittu siten, että vain rekisteröityneet käyttäjät voivat muokata sitä.
 Alla on viimeisin lokitapahtuma:',
 'cascadeprotectedwarning' => '<strong>Vain ylläpitäjät voivat muokata tätä sivua, koska se on sisällytetty alla {{PLURAL:$1|olevaan laajennetusti suojattuun sivuun|oleviin laajennetusti suojattuihin sivuihin}}</strong>:',
-'titleprotectedwarning' => "'''Tämä sivun luominen on rajoitettu vain osalle käyttäjistä [[Special:ListGroupRights|tietyillä oikeuksilla]].'''
+'titleprotectedwarning' => "'''Varoitus: Tämä sivunimi on suojattu niin, että sivun luomiseen tarvitaan [[Special:ListGroupRights|erityisiä oikeuksia]].'''
 Alla on viimeisin lokitapahtuma:",
 'templatesused' => 'Tällä sivulla {{PLURAL:$1|käytetty malline|käytetyt mallineet}}:',
 'templatesusedpreview' => 'Esikatselussa mukana {{PLURAL:$1|oleva malline|olevat mallineet}}:',
@@ -1054,6 +1068,9 @@ Nämä muuttujat on jätetty käsittelemättä.",
 'node-count-exceeded-warning' => 'Sivu ylitti solmumäärän',
 'expansion-depth-exceeded-category' => 'Sivut, joissa laajentamissyvyys on ylitetty',
 'expansion-depth-exceeded-warning' => 'Sivu ylitti laajentamissyvyyden.',
+'parser-unstrip-loop-warning' => 'Unstrip-silmukka havaittiin',
+'parser-unstrip-recursion-limit' => 'Unstrip-rekursion enimmäissyvyys ($1) ylitettiin',
+'converter-manual-rule-error' => 'Kielivarianttisäännössä on virhe',
 
 # "Undo" feature
 'undo-success' => 'Kumoaminen onnistui. Valitse <em>tallenna</em> toteuttaaksesi muutokset.',
@@ -1140,7 +1157,7 @@ Voit silti nähdä tämän muutoksen. Lisätietoja löytyy [{{fullurl:{{#Special
 'revdelete-no-file' => 'Määritettyä tiedostoa ei ole olemassa.',
 'revdelete-show-file-confirm' => 'Haluatko varmasti nähdä poistetun version tiedostosta <nowiki>$1</nowiki>, joka on tallennettu $2 kello $3?',
 'revdelete-show-file-submit' => 'Kyllä',
-'revdelete-selected' => "'''{{PLURAL:$2|Valittu versio|Valitut versiot}} sivusta '''$1:''''''",
+'revdelete-selected' => "'''{{PLURAL:$2|Valittu versio|Valitut versiot}} sivusta [[:$1]]'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Valittu lokimerkintä|Valitut lokimerkinnät}}:'''",
 'revdelete-text' => "'''Poistetut versiot ja lokitapahtumat näkyvät edelleen sivun historiassa ja lokeissa, mutta osa niiden sisällöstä ei ole julkisesti saatavilla.'''
 Muut ylläpitäjät {{GRAMMAR:inessive|{{SITENAME}}}} voivat silti tarkastella piilotettua sisältöä, ja he voivat palauttaa sen näkyviin tämän käyttöliittymän kautta, ellei tätä ole erikseen rajoitettu.",
@@ -1148,17 +1165,17 @@ Muut ylläpitäjät {{GRAMMAR:inessive|{{SITENAME}}}} voivat silti tarkastella p
 'revdelete-suppress-text' => "Häivytystä pitäisi käyttää '''vain''' seuraavissa tapauksissa:
 * Sopimattomat henkilötiedot
 *: ''kotiosoitteet, puhelinnumerot, sosiaaliturvatunnukset ja muut.''",
-'revdelete-legend' => 'Version rajoitukset',
-'revdelete-hide-text' => 'Piilota version sisältö',
+'revdelete-legend' => 'Aseta version näkyvyyden rajoitukset',
+'revdelete-hide-text' => 'Piilota version tekstisisältö',
 'revdelete-hide-image' => 'Piilota tiedoston sisältö',
 'revdelete-hide-name' => 'Piilota toiminto ja kohde',
 'revdelete-hide-comment' => 'Piilota yhteenveto',
 'revdelete-hide-user' => 'Piilota tekijän tunnus tai IP-osoite',
-'revdelete-hide-restricted' => 'Piilota tiedot ylläpitäjiltä kuten muilta',
+'revdelete-hide-restricted' => 'Häivytä tiedot sekä ylläpitäjien että muiden käyttäjien näkyviltä',
 'revdelete-radio-same' => '(älä muuta)',
 'revdelete-radio-set' => 'Kyllä',
 'revdelete-radio-unset' => 'Ei',
-'revdelete-suppress' => 'Piilota myös ylläpitäjiltä',
+'revdelete-suppress' => 'Häivytä tiedot myös ylläpitäjien näkyviltä samalla kun piilotat ne muilta käyttäjiltä',
 'revdelete-unsuppress' => 'Poista rajoitukset palautetuilta versiolta',
 'revdelete-log' => 'Syy',
 'revdelete-submit' => 'Toteuta {{PLURAL:$1|valittuun versioon|valittuihin versioihin}}',
@@ -1225,7 +1242,7 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
 
 # Diffs
 'history-title' => 'Sivun "$1" muutoshistoria',
-'difference-title' => 'Ero sivun "$1" versioiden välillä',
+'difference-title' => 'Ero sivun ”$1” versioiden välillä',
 'difference-title-multipage' => 'Erot sivujen "$1" ja "$2" välillä',
 'difference-multipage' => '(Sivujen välinen eroavaisuus)',
 'lineno' => 'Rivi $1:',
@@ -1234,6 +1251,10 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
 'editundo' => 'kumoa',
 'diff-multi' => '(Näytettyjen versioiden välissä on {{PLURAL:$1|yksi muokkaus|$1 versiota, jotka ovat {{PLURAL:$2|yhden käyttäjän tekemiä|$2 eri käyttäjän tekemiä}}}}.)',
 'diff-multi-manyusers' => '(Versioiden välissä on {{PLURAL:$1|yksi muu muokkaus|$1 muuta muokkausta, jotka on tehnyt {{PLURAL:$2|yksi käyttäjä|yli $2 eri käyttäjää}}}}.)',
+'difference-missing-revision' => '{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä diffistä ($1) {{PLURAL:$2|ei|ei}} löytynyt.
+
+Tämä johtuu yleensä seuraavasta vanhentuneeesta diffilinkistä sivulle, joka on poistettu.
+Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].',
 
 # Search results
 'searchresults' => 'Hakutulokset',
@@ -1296,7 +1317,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'powersearch-ns' => 'Hae nimiavaruuksista:',
 'powersearch-redir' => 'Luettele ohjaukset',
 'powersearch-field' => 'Etsi',
-'powersearch-togglelabel' => 'Muuta valinta',
+'powersearch-togglelabel' => 'Muuta valintaa',
 'powersearch-toggleall' => 'Valitse kaikki',
 'powersearch-togglenone' => 'Valitse ei mitään',
 'search-external' => 'Ulkoinen haku',
@@ -1478,7 +1499,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 # Rights
 'right-read' => 'Lukea sivuja',
 'right-edit' => 'Muokata sivuja',
-'right-createpage' => 'Luoda sivuja pois lukien keskustelusivut',
+'right-createpage' => 'Luoda sivuja (jotka eivät ole keskustelusivuja)',
 'right-createtalk' => 'Luoda keskustelusivuja',
 'right-createaccount' => 'Luoda uusia käyttäjätunnuksia',
 'right-minoredit' => 'Merkitä muokkauksensa pieniksi',
@@ -1500,6 +1521,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'right-writeapi' => 'Käyttää kirjoitus-APIa',
 'right-delete' => 'Poistaa sivuja',
 'right-bigdelete' => 'Poistaa sivuja, joilla on pitkä historia',
+'right-deletelogentry' => 'Poista ja palauta tiettyjä lokimerkintöjä',
 'right-deleterevision' => 'Poistaa ja palauttaa sivujen versioita',
 'right-deletedhistory' => 'Tarkastella poistettuja versiotietoja ilman niihin liittyvää sisältöä',
 'right-deletedtext' => 'Tarkastella poistettujen sivujen tekstiä ja muutoksia poistettujen versioiden välillä',
@@ -1642,9 +1664,9 @@ Poisto- ja siirtoloki tälle sivulle näkyy alla:",
 'uploadtext' => "Voit tallentaa tiedostoja alla olevalla lomakkeella. [[Special:FileList|Tiedostoluettelo]] sisältää listan tallennetuista tiedostoista. Tallennukset kirjataan myös [[Special:Log/upload|tallennuslokiin]], ja poistot [[Special:Log/delete|poistolokiin]].
 
 Voit käyttää tiedostoja wikisivuilla seuraavilla tavoilla:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.jpg]]</nowiki></tt>''', käyttääksesi tiedoston täyttä versiota.
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.png|200px|thumb|left|Kuvausteksti]]</nowiki></tt>''', käyttääksesi tiedostoa sovitettuna 200 kuvapistettä leveään laatikkoon kuvaustekstillä.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tiedosto.ogg]]</nowiki></tt>''', jos haluat suoran linkin tiedostoon.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.jpg]]</nowiki></code>''', käyttääksesi tiedoston täyttä versiota.
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.png|200px|thumb|left|Kuvausteksti]]</nowiki></code>''', käyttääksesi tiedostoa sovitettuna 200 kuvapistettä leveään laatikkoon kuvaustekstillä.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tiedosto.ogg]]</nowiki></code>''', jos haluat suoran linkin tiedostoon.",
 'upload-permitted' => 'Sallitut tiedostomuodot: $1.',
 'upload-preferred' => 'Suositellut tiedostomuodot: $1.',
 'upload-prohibited' => 'Kielletyt tiedostomuodot: $1.',
@@ -1685,22 +1707,22 @@ Voit käyttää tiedostoja wikisivuilla seuraavilla tavoilla:
 'largefileserver' => 'Tämä tiedosto on suurempi kuin mitä palvelin sallii.',
 'emptyfile' => 'Tiedosto, jota yritit lähettää, näyttää olevan tyhjä. Tarkista, että kirjoitit polun ja nimen oikein ja että se ei ole liian suuri kohdepalvelimelle.',
 'windows-nonascii-filename' => 'Tämä wiki ei tue tiedostonimiä, joissa on erikoismerkkejä.',
-'fileexists' => "Samanniminen tiedosto on jo olemassa.
-Katso tiedoston sivu '''<tt>[[:$1]]</tt>''', jos et ole varma, haluatko muuttaa sitä.
-[[$1|thumb]]",
-'filepageexists' => "Kuvaussivu on jo olemassa tällä nimellä '''<tt>[[:$1]]</tt>''', mutta ei tiedostoa tällä nimellä.
-Kirjoittamasi yhteenveto ei ilmesty kuvaussivulle.
-Muuttaaksesi uuden yhteenvedon kuvaussivulle, sinun täytyy manuaalisesti muokata sitä.
-[[$1|thumb]]",
-'fileexists-extension' => "Tiedosto, jolla on samankaltainen nimi, on jo olemassa: [[$2|thumb]]
-* Tallennetun tiedoston nimi: '''<tt>[[:$1]]</tt>'''
-* Olemassa olevan tiedoston nimi: '''<tt>[[:$2]]</tt>'''
-Valitse toinen tiedostonimi.",
+'fileexists' => 'Samanniminen tiedosto on jo olemassa.
+Katso tiedoston sivu <strong>[[:$1]]</strong>, jos et ole varma, haluatko muuttaa sitä.
+[[$1|thumb]]',
+'filepageexists' => 'Kuvaussivu <strong>[[:$1]]</strong> on ho olemassa, mutta vastaavaa tiedostoa ei ole olemassa.
+Kirjoittamasi yhteenveto ei ilmesty kuvaussivulle,
+ellet lisää sitä muokkaamalla sivua manuaalisesti.
+[[$1|thumb]]',
+'fileexists-extension' => 'Tiedosto, jolla on samankaltainen nimi, on jo olemassa: [[$2|thumb]]
+* Tallennetun tiedoston nimi: <strong>[[:$1]]</strong>
+* Olemassa olevan tiedoston nimi: <strong>[[:$2]]</strong>
+Valitse toinen tiedostonimi.',
 'fileexists-thumbnail-yes' => "Tiedosto näyttäisi olevan pienennetty kuva ''(pienoiskuva)''. [[$1|thumb]]
-Tarkista tiedosto '''<tt>[[:$1]]</tt>'''.
+Tarkista tiedosto <strong>[[:$1]]</strong>.
 Jos yllä oleva tiedosto on alkuperäisversio samasta kuvasta, ei sille tarvitse tallentaa pienoiskuvaa.",
-'file-thumbnail-no' => "Tiedostonimi alkaa merkkijonolla '''<tt>$1</tt>'''. Tiedosto näyttäisi olevan pienennetty kuva ''(pienoiskuva)''.
-Jos sinulla on tämän kuvan alkuperäinen versio, tallenna se. Muussa tapauksessa nimeä tiedosto uudelleen.",
+'file-thumbnail-no' => 'Tiedostonimi alkaa merkkijonolla <strong>$1</strong>. Tiedosto näyttäisi olevan pienennetty kuva.
+Jos sinulla on tämän kuvan alkuperäinen versio, tallenna se. Muussa tapauksessa nimeä tiedosto uudelleen.',
 'fileexists-forbidden' => 'Samanniminen tiedosto on jo olemassa, eikä sitä voi korvata. Tallenna tiedosto jollakin toisella nimellä. Nykyinen tiedosto: [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Samanniminen tiedosto on jo olemassa jaetussa mediavarastossa. Tallenna tiedosto jollakin toisella nimellä. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Tämä tiedosto on kaksoiskappale {{PLURAL:$1|seuraavasta tiedostosta|seuraavista tiedostoista}}:',
@@ -1781,8 +1803,12 @@ $1',
 'backend-fail-read' => 'Tiedostoa $1 ei voitu lukea.',
 'backend-fail-create' => 'Tiedostoa $1 ei voitu luoda.',
 'backend-fail-maxsize' => 'Tiedostoa $1 ei voitu luoda, koska se on suurempi kuin {{PLURAL:$2|yksi tavu|$2 tavua}}.',
+'backend-fail-readonly' => 'Taustajärjestelmä "$1" on tällä hetkellä vain lukutilassa. Syy tähän on: "\'\'$2\'\'"',
+'backend-fail-synced' => 'Tiedoston "$1" tila ei vastaa tiedoston tilaa sisäisissä taustajärjestelmissä.',
 'backend-fail-connect' => 'Varastojärjestelmään "$1" ei saada yhteyttä.',
+'backend-fail-internal' => 'Tuntematon virhe taustajärjestelmässä "$1".',
 'backend-fail-contenttype' => 'Tiedostoa ei voitu tallentaa kohteeseen $1, koska tiedostomuotoa ei voitu määrittää.',
+'backend-fail-batchsize' => 'Taustajärjestelmälle on annettu $1 {{PLURAL:$1|tiedostotoiminto|toimintoa}}; enimmäismäärä on $2 {{PLURAL:$2|tiedostotoiminto|toimintoa}}.',
 'backend-fail-usable' => 'Ei voitu luoda tiedostoa $1, koska käyttöoikeudet eivät riittäneet tai hakemisto puuttuu.',
 
 # Lock manager
@@ -1794,6 +1820,7 @@ $1',
 'lockmanager-fail-releaselock' => 'Tiedoston $1 lukituksen avaaminen epäonnistui.',
 'lockmanager-fail-db-bucket' => 'Ei voitu yhdistää riittävästi tietokantoja kohdassa $1.',
 'lockmanager-fail-db-release' => 'Lukitusten vapauttaminen epäonnistui tietokannassa $1.',
+'lockmanager-fail-svr-acquire' => 'Lukkojen hankkiminen palvelimelta $1 epäonnistui.',
 'lockmanager-fail-svr-release' => 'Lukitusten vapauttaminen epäonnistui palvelimella $1.',
 
 # ZipDirectoryReader
@@ -1943,7 +1970,8 @@ Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
 
 # MIME search
 'mimesearch' => 'MIME-haku',
-'mimesearch-summary' => 'Tällä sivulla voit etsiä tiedostoja niiden MIME-tyypin perusteella. Syöte: sisältötyyppi/alatyyppi, esimerkiksi <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Tällä sivulla voit etsiä tiedostoja niiden MIME-tyypin perusteella.
+Syöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.',
 'mimetype' => 'MIME-tyyppi',
 'download' => 'lataa',
 
@@ -1989,7 +2017,9 @@ Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
 
 'disambiguations' => 'Linkit täsmennyssivuihin',
 'disambiguationspage' => 'Template:Täsmennyssivu',
-'disambiguations-text' => "Seuraavat artikkelit linkittävät ''täsmennyssivuun''. Täsmennyssivun sijaan niiden pitäisi linkittää asianomaiseen aiheeseen.<br />Sivua kohdellaan täsmennyssivuna jos se käyttää mallinetta, johon on linkki sivulta [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Seuraavilla sivuilla on linkkejä ''täsmennyssivuihin''.
+Täsmennyssivun sijaan ne voisivat linkittää suoraan asianomaiseen aiheeseen.<br />
+Sivua kohdellaan täsmennyssivuna, jos se käyttää mallinetta, johon on linkki sivulta [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Kaksinkertaiset ohjaukset',
 'doubleredirectstext' => 'Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.
@@ -2096,6 +2126,7 @@ Huomaa, että muut verkkosivut saattavat viitata tiedostoon suoran URL:n avulla,
 Voit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muutos on kohdistunut. Jälkimmäiset ovat kirjainkokoherkkiä.',
 'logempty' => 'Ei tapahtumia lokissa.',
 'log-title-wildcard' => 'Kohde alkaa merkkijonolla',
+'showhideselectedlogentries' => 'Näytä tai piilota valitut lokimerkinnät',
 
 # Special:AllPages
 'allpages' => 'Kaikki sivut',
@@ -2141,7 +2172,7 @@ Katso myös [[Special:WantedCategories|halutut luokat]].',
 'linksearch-ok' => 'Etsi',
 'linksearch-text' => 'Tähteä (*) voi käyttää jokerimerkkinä, esimerkiksi ”*.wikipedia.org”.
 Vähintään ylätason verkkotunnus, esimerkiksi "*.org", tarvitaan.<br />
-Tuetut protokollat: <tt>$1</tt> (älä lisää näitä hakuusi).',
+Tuetut protokollat: <code>$1</code> (älä lisää näitä hakuusi).',
 'linksearch-line' => '$1 on linkitetty sivulta $2',
 'linksearch-error' => 'Jokerimerkkiä voi käyttää ainoastaan osoitteen alussa.',
 
@@ -2325,6 +2356,8 @@ Sivulla $2 on lista viimeaikaisista poistoista.',
 'rollback' => 'palauta aiempaan versioon',
 'rollback_short' => 'Palautus',
 'rollbacklink' => 'palauta',
+'rollbacklinkcount' => 'palauta {{PLURAL:$1|muokkaus|$1 muokkausta}}',
+'rollbacklinkcount-morethan' => 'palauta yli $1 {{PLURAL:$1|muutos|muutosta}}',
 'rollbackfailed' => 'Palautus epäonnistui',
 'cantrollback' => 'Aiempaan versioon ei voi palauttaa, koska viimeisin kirjoittaja on sivun ainoa tekijä.',
 'alreadyrolled' => 'Käyttäjän [[User:$2|$2]] ([[User talk:$2|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tekemiä muutoksia sivuun [[:$1]] ei voi kumota, koska joku muu on muuttanut sivua.
@@ -2403,16 +2436,18 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 
 # Undelete
 'undelete' => 'Palauta poistettuja sivuja',
-'undeletepage' => 'Poistettujen sivujen selaus',
+'undeletepage' => 'Tarkastele ja palauta poistettuja sivuja',
 'undeletepagetitle' => "'''Poistetut versiot sivusta [[:$1]]'''.",
 'viewdeletedpage' => 'Poistettujen sivujen selaus',
 'undeletepagetext' => '{{PLURAL:$1|Seuraava sivu|Seuraavat sivut}} on poistettu, mutta {{PLURAL:$1|se löytyy|ne löytyvät}} vielä arkistosta, joten {{PLURAL:$1|se on|ne ovat}} palautettavissa. Arkisto saatetaan tyhjentää aika ajoin.',
 'undelete-fieldset-title' => 'Palauta versiot',
-'undeleteextrahelp' => "Palauttaaksesi sivun koko muutoshistorian, jätä kaikki valintalaatikot tyhjiksi ja napsauta '''''{{int:undeletebtn}}'''''.
-Voit palauttaa versiota valikoivasti valitsemalla vain niiden versioiden valintalaatikot, jotka haluat palauttaa.",
+'undeleteextrahelp' => "Palauttaaksesi sivun koko muutoshistorian jätä kaikki valintalaatikot tyhjiksi ja napsauta '''''{{int:undeletebtn}}'''''.
+Voit palauttaa versioita valikoivasti valitsemalla vain niiden versioiden valintalaatikot, jotka haluat palauttaa.",
 'undeleterevisions' => '{{PLURAL:$1|Versio|$1 versiota}} arkistoitu.',
 'undeletehistory' => 'Jos palautat sivun, kaikki versiot lisätään sivun historiaan. Jos uusi sivu samalla nimellä on luotu poistamisen jälkeen, palautetut versiot lisätään sen historiaan.',
-'undeleterevdel' => 'Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain poistettu. Tässä tilanteessa poista uusimman poistettavan version piilotus. Tiedostoversioita, joihin sinulla ei ole katseluoikeutta ei palauteta.',
+'undeleterevdel' => "Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. 
+Tässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus.<br />
+Tiedostoversioita, joihin sinulla ei ole katseluoikeutta (''häivytetyt versiot''), ei palauteta.",
 'undeletehistorynoadmin' => 'Tämä sivu on poistettu. Syy sivun poistamiseen näkyy yhteenvedossa, jossa on myös tiedot, ketkä ovat muokanneet tätä sivua ennen poistamista. Sivujen varsinainen sisältö on vain ylläpitäjien luettavissa.',
 'undelete-revision' => 'Poistettu sivu $1 hetkellä $4 kello $5. Tekijä: $3.',
 'undeleterevision-missing' => 'Virheellinen tai puuttuva versio. Se on saatettu palauttaa tai poistaa arkistosta.',
@@ -2968,19 +3003,15 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'spambot_username' => 'MediaWikin mainospoistaja',
 'spam_reverting' => 'Palautettu viimeisimpään versioon, joka ei sisällä linkkejä kohteeseen $1.',
 'spam_blanking' => 'Kaikki versiot sisälsivät linkkejä kohteeseen $1. Sivu tyhjennetty.',
+'spam_deleting' => 'Sivun poisto: kaikki versiot sisälsivät linkkejä palvelimeen $1',
 
 # Info page
 'pageinfo-title' => 'Tietoja sivusta $1',
 'pageinfo-header-edits' => 'Muokkaukset',
-'pageinfo-header-watchlist' => 'Tarkkailulista',
-'pageinfo-header-views' => 'Näyttökerrat',
-'pageinfo-subjectpage' => 'Sivu',
-'pageinfo-talkpage' => 'Keskustelusivu',
+'pageinfo-views' => 'Katselukertojen määrä',
 'pageinfo-watchers' => 'Tarkkailijoiden lukumäärä',
 'pageinfo-edits' => 'Muokkausten lukumäärä',
 'pageinfo-authors' => 'Eri tekijöiden lukumäärä',
-'pageinfo-views' => 'Katselukertojen määrä',
-'pageinfo-viewsperedit' => 'Katseluita per muokkaus',
 
 # Skin names
 'skinname-standard' => 'Perus',
@@ -3703,7 +3734,7 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 * <span class="mw-specialpagerestricted">Rajoitetut toimintosivut.</span>',
 'specialpages-group-maintenance' => 'Ylläpito',
 'specialpages-group-other' => 'Muut',
-'specialpages-group-login' => 'Kirjautuminen ja tunnusten luonti',
+'specialpages-group-login' => 'Sisäänkirjautuminen ja tunnusten luonti',
 'specialpages-group-changes' => 'Muutokset ja lokit',
 'specialpages-group-media' => 'Media',
 'specialpages-group-users' => 'Käyttäjät',
@@ -3837,9 +3868,12 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'api-error-empty-file' => 'Määrittämäsi tiedosto on tyhjä.',
 'api-error-emptypage' => 'Ei ole sallittua luoda uutta, tyhjää sivua.',
 'api-error-fetchfileerror' => 'Sisäinen virhe: jotakin meni pieleen tiedoston haussa.',
+'api-error-fileexists-forbidden' => 'Tiedosto nimellä "$1" on jo olemassa eikä sitä voi korvata.',
+'api-error-fileexists-shared-forbidden' => 'Tiedosto nimeltä "$1" on jo olemassa yhteisessä tietovarastossa eikä sitä voi korvata.',
 'api-error-file-too-large' => 'Määrittämäsi tiedosto on liian iso.',
 'api-error-filename-tooshort' => 'Tiedoston nimi on liian lyhyt.',
 'api-error-filetype-banned' => 'Tämän tyyppisiä tiedosta ei voi tallentaa.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|ei ole sallittu tiedostomuoto|eivät ole sallittuja tiedostomuotoja}}. {{PLURAL:$3|Sallittu tiedostomuoto on|Sallittuja tiedostomuotoja ovat}} $2.',
 'api-error-filetype-missing' => 'Tiedostolta puuttuu tiedostopääte.',
 'api-error-hookaborted' => 'Laajennuskoodi esti yrittämäsi muutoksen.',
 'api-error-http' => 'Sisäinen virhe: palvelimeen ei saatu yhteyttä.',
index 567e114..a20078a 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Meänkieli (Meänkieli)
+/** meänkieli (meänkieli)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
index 394f985..fbab491 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Faroese (Føroyskt)
+/** Faroese (føroyskt)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -119,7 +119,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Goym 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' => 'Nýt betraðar seinastu broytingar (krevur JavaScript)',
+'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)',
@@ -127,17 +127,17 @@ $messages = array(
 '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-watchcreations' => 'Legg síður, sum eg stovni, í mítt eftirlit',
-'tog-watchdefault' => 'Vaka yvur nýggjum og broyttum greinum',
-'tog-watchmoves' => 'Legg síður afturat, sum eg havi valt afturat mínum eftirkanningarlista.',
-'tog-watchdeletion' => 'Legg síður sum eg sletti afturat mínum vaktarlista',
+'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-nocache' => 'Deaktivera síðu "caching" í brovsaranum',
-'tog-enotifwatchlistpages' => 'Send mær teldupost, tá ein síða á mínum eftirlitslista er broytt',
+'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-enotifminoredits' => 'Send mær eisini teldupost viðvíkjandi smærri broytingum á síðunum',
+'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:',
@@ -376,6 +376,10 @@ Sí [[Special:Version|versjón síða]].',
 'youhavenewmessages' => 'Tú hevur $1 ($2).',
 'newmessageslink' => 'nýggj boð',
 'newmessagesdifflink' => 'seinasta broyting',
+'youhavenewmessagesfromusers' => 'Tú hevur $1 frá {{PLURAL:$3|øðrum brúkara|$3 brúkarum}} ($2).',
+'youhavenewmessagesmanyusers' => 'Tú hevur $1 frá fleiri brúkarum ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|eini nýggj boð|nýggj boð}}',
+'newmessagesdifflinkplural' => 'seinasta {{PLURAL:$1|broyting|broytingar}}',
 'youhavenewmessagesmulti' => 'Tú hevur nýggj boð á $1',
 'editsection' => 'rætta',
 'editold' => 'rætta',
@@ -471,8 +475,8 @@ Møguliga hevur onkur annar longu strikað hana.',
 'cannotdelete-title' => 'Kann ikki strika síðu "$1"',
 'badtitle' => 'Ógyldugt heiti',
 'badtitletext' => 'Umbidna síðan er ógyldugt, tómt ella skeivt tilslóðað heiti millum mál ella wikur.',
-'perfcached' => 'Fylgjandi upplýsingar eru "cached" og eru møguliga ikki dagførdir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Fylgjandi dáta er goymt, og var seinast goymt $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Fylgjandi upplýsingar eru "fangaðir" (cached) og eru møguliga ikki dagførdir. Í mesta lagi {{PLURAL:$1|eitt úrslit er|$1 úrslit eru}} tøk í cache.',
+'perfcachedts' => 'Fylgjandi dáta er "fangað" (cached), og var seinast dagført $1. Í mesta lagi {{PLURAL:$4|eitt úrslit er|$4 úrslit eru}} tøk í cache.',
 'querypage-no-updates' => 'Tað ber í løtuni ikki til at dagføra hesa síðuna.
 Dáta higani verður í løtuni ikki endurnýggjað.',
 'wrong_wfQuery_params' => '↓ Skeiv parametir til wfQuery()<br />
@@ -500,6 +504,8 @@ $2',
 'ns-specialprotected' => 'Serstakar síður kunnu ikki rættast.',
 'titleprotected' => '[[User:$1|$1]] hevur vart hetta heitið frá skapan.
 Givin orsøk er "\'\'$2\'\'".',
+'exception-nologin' => 'Tú ert ikki loggað/ur inn',
+'exception-nologin-text' => 'Henda síða ella tað tú ætlar at gera kremvur at tú ert innritað/ur á hesa wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Konfiguratións villa: Ókendur virus skannari: ''$1''",
@@ -520,6 +526,7 @@ Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}} innstillingar]].'
 'remembermypassword' => 'Minst til logg inn hjá mær á hesum kaganum (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})',
 '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.',
 'externaldberror' => 'Antin var talan um ein atgongd dátubasu feil, ella hevur tú ikki loyvi til at dagføra tína eksternu kontu.',
 'login' => 'Rita inn',
 'nav-login-createaccount' => 'Stovna kontu ella rita inn',
@@ -594,6 +601,7 @@ verður sendur fyri nakað av fylgjandi hentleikum.',
 'invalidemailaddress' => 'T-post bústaðurin kann ikki verða góðtikin, tí hann sær út til at hava ógyldugt format.
 Vinarliga skriva t-post bústað í røttum formati ella lat handa teigin vera tóman.',
 'cannotchangeemail' => 'T-post adressur, sum eru knýttar at brúkarakontum, kunnu ikki broytast á hesi wiki.',
+'emaildisabled' => 'Henda heimasíðan kann ikki senda teldupostar.',
 'accountcreated' => 'Konto upprættað',
 'accountcreatedtext' => 'Brúkarakontan hjá $1 er nú upprættað.',
 'createaccount-title' => 'Upprætta brúkarakonto á {{SITENAME}}',
@@ -732,6 +740,21 @@ Tú kanst seta teg í samband við $1 ella ein annan [[{{MediaWiki:Grouppage-sys
 Tú kanst ikki brúka 'send t-post til henda brúkara' funktiónina, uttan so at ein galdandi t-post adressa er givin í tínum [[Special:Preferences|konto innstillingum]] og um tú ikki ert blivin sperraður frá at brúka hana.
 Tín verandi IP adressa er $3, og sperrings ID er #$5.
 Vinarliga tak allir hesir upplýsingar við í einum hvørjum fyrispurningi ið tí hevur.",
+'autoblockedtext' => 'Tín IP bústaður er blivin sjálvvirkandi sperraður, tí hann varð brúktur av einum øðrum brúkara, sum er blivin sperraður av $1.
+Viðkomandi gav hesa orsøk:
+:\'\'$2\'\'
+
+* Sperring byrjað: $8
+* Sperringin útgongur: $6
+* Intended blockee: $7
+
+Tú kanst seta teg í samband við $1 ella ein av hinum [[{{MediaWiki:Grouppage-sysop}}|administratorunum]] fyri at kjakast um sperringina.
+
+Legg til merkis, at tú kanst ikki brúka "send ein t-post til henda brúkara" funktiónina, uttan so at tú hevur ein gyldugan t-post  bústað skrásettan í tínum 
+[[Special:Preferences|brúkara ynskjum]] og at tú ikki ert blivin sperrað/ur frá at brúka hesa.
+
+IP adressan sum tú brúkar í løtuni er $3, og brúkara ID er #$5.
+Vinarliga tak allar hesar upplýsigarnar við í einum og hvørjum fyrispurningi, ið tú kanst hava.',
 'blockednoreason' => 'Ongin orsøk er givin',
 'whitelistedittext' => 'Tú mást $1 fyri at rætta hesa síðu.',
 'confirmedittext' => 'Tú mást vátta tína teldupost adressu áðrenn tú rættar síður.
@@ -760,6 +783,10 @@ ella [{{fullurl:{{FULLPAGENAME}}|action=edit}} rætta hesa síðu]</span>.',
 'noarticletext-nopermission' => 'Tað er í løtuni ongin tekstur á hesi síðu.
 Tú kanst [[Special:Search/{{PAGENAME}}|leita eftir hesum síðu heiti]] á øðrum siðum, 
 ella <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} síggja viðkomandi logglistar]</span>.',
+'missing-revision' => 'Endurskoðan #$1 av síðuni við heitinum "{{PAGENAME}}" er ikki til.
+
+Hetta skyldast vanliga tað, at tú fylgir einari gamlari søguslóð til eina síðu, sum er blivin slettað. 
+Nærri frágreiðing kanst tú finna í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} strikingar logginum].',
 'userpage-userdoesnotexist' => 'Brúkarakontan "$1" er ikki skrásett.
 Vinarliga umhugsa um tú ynskir at upprætta/rætta hesa síðu.',
 'userpage-userdoesnotexist-view' => 'Brúkarakonto "$1" er ikki skrásett.',
@@ -785,7 +812,9 @@ Tann seinasti sperringar gerðalistin er her niðanfyri fyri ávísing:',
 Tilevnaðar .css og .js síður brúka heiti sum byrja við lítlum bókstavi, t.d.  {{ns:user}}:Foo/vector.css í mun til {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Dagført)',
 'note' => "'''Viðmerking:'''",
-'previewnote' => "'''Minst til at hetta bara er ein forskoðan, sum enn ikki er goymd!'''",
+'previewnote' => "'''Minst til at hetta bara er ein forskoðan.'''
+Tínar broytingar eru ikki goymdar enn!",
+'continue-editing' => 'Halt fram við at rætta',
 'previewconflict' => 'Henda forskoðanin vísir tekstin í erva soleiðis sum hann sær út, um tú velur at goyma.',
 'session_fail_preview' => "'''Orsakað! Vit kundu ikki fullføra tínar broytingar, tí tínar sessións dáta eru horvin.'''
 Vinarliga royn aftur.
@@ -798,6 +827,7 @@ Um tað enn ikki virkar, royn so [[Special:UserLogout|rita út]] og rita so inn
 Um tað enn ikki virkar, royn so at [[Special:UserLogout|rita út]] og rita so inn aftur.",
 'edit_form_incomplete' => "'''Nakrir partar av rættingarskjalinum náddu ikki til servaran; eftirkanna tvær ferðir at tínar rættingar eru til staðar og royn so aftur.'''",
 'editing' => 'Tú rættar $1',
+'creating' => 'Upprætta $1',
 'editingsection' => 'Tú rættar $1 (partur)',
 'editingcomment' => 'Tú rættar $1 (nýtt brot)',
 'editconflict' => 'Rættingar konflikt: $1',
@@ -818,17 +848,24 @@ Við at senda arbeiði títt inn, lovar tú, at tú hevur skrivað tað, ella at
 Um tú ikki ynskir at tín skriving verður broytt miskunnarleyst, so skal tú ikki skriva nakað her.<br />
 Tú lovar okkum eisini, at tú sjálv/ur hevur skrivað hetta, ella at tú hevur avritað tað frá keldu sum er almenn ogn (public domain) ella frá líkandi fríum keldum (sí $1 fyri nærri upplýsingar). 
 '''Tú mást ikki senda tilfar inn, sum er vart av upphavsrætti, uttan so at tú hevur fingið loyvi til tað!'''",
-'longpageerror' => "'''Feilur: Teksturin sum tú hevur sent inn er $1 kilobytes (kB) langur, sum er størri enn mest loyvda sum er $2 kilobytes.'''
+'longpageerror' => "'''Feilur: Teksturin sum tú hevur sent inn er {{PLURAL:$1|eitt kilobyte|$1 kilobytes}} langur, sum er longri enn mest loyvda, sum er  {{PLURAL:$2|eitt kilobyte|$2 kilobytes}}.'''
 Teksturin kann tí ikki verða goymdur.",
 'protectedpagewarning' => "'''Ávaring: Henda síðan er friðað, so at einans brúkarar við umboðsstjóra heimildum kunnu broyta hana.'''
 Tann seinasta logg inn er goymt niðanfyri fyri ávísing:",
 'semiprotectedpagewarning' => "'''Viðmerking:''' Hendan grein er vard soleiðis at bert skrásetir brúkarar kunnu rætta hana.
 Tann seinasta innritanin er víst niðanfyri sum ávísing:",
+'cascadeprotectedwarning' => "'''Ávaring:''' Henda síðan er blivin vard, soleiðis at bert brúkarar við administrator rættindum kunnu rætta hana, tí at hon er við í hesum kaskadu-vardu {{PLURAL:$1|síðu|síðum}}:",
+'titleprotectedwarning' => "'''Ávaring: Henda síða er blivin vard, soleiðis at [[Special:ListGroupRights|serstøk brúkararættindi]] krevjast fyri at upprætta hana.'''
+Tann seinasti posturin í loggfíluni er vístur niðanfyri fyri kelduávísing:",
 'templatesused' => '{{PLURAL:$1|Fyrimynd|Fyrimyndir}} brúktar á hesu síðu:',
 'templatesusedpreview' => '{{PLURAL:$1|Fyrimynd|Fyrimyndir}} brúktar í hesi forskoðan:',
+'templatesusedsection' => '{{PLURAL:$1|Fyrimynd|Fyrimyndir}} brúktar í hesum brotinum:',
 'template-protected' => '(friðað)',
 'template-semiprotected' => '(lutvíst vardar)',
 'hiddencategories' => 'Henda síðan er í {{PLURAL:$1|1 fjaldum bólki|$1 fjaldum bólkum}}:',
+'nocreatetitle' => 'Upprættan av síðu er avmarkað',
+'nocreatetext' => '{{SITENAME}} hevur noktað fyri møguleikanum at upprætta nýggjar síður.
+Tú kanst fara aftur og rætta eina síðu sum longu er til, ella [[Special:UserLogin|rita teg inn ella få tær eina konto]].',
 'nocreate-loggedin' => 'Tú hevur ikki loyvi til at upprætta nýggjar síður.',
 'sectioneditnotsupported-title' => 'Tað ber ikki til at rætta brot',
 'sectioneditnotsupported-text' => 'Tað ber ikki til at rætta brot á hesi síðu.',
@@ -842,6 +879,8 @@ Strikingar og flytingar loggurin (søgan) fyri hesa síðuna eru at finna her fy
 'moveddeleted-notice' => 'Henda síðan er blivin strikað.
 Strikingar og flytingar loggurin (søgan) fyri hesa síðuna eru at finna her niðanfyri.',
 'log-fulllog' => 'Vís allan gerðalistan (loggin)',
+'edit-hook-aborted' => 'Rættingin bleiv avbrotin av einum programmfeili. 
+Ongin frágreiðing finst.',
 'edit-gone-missing' => 'Tað var ikki møguligt at dagføra síðuna.
 Tað sær út til at hon er blivin strikað.',
 'edit-conflict' => 'Rættingar trupulleiki (konflikt).',
@@ -937,14 +976,17 @@ Tú kanst síggja munin; smálutir eru at finna í [{{fullurl:{{#Special:Log}}/s
 'revdelete-hide-name' => 'Fjal handling og mál',
 'revdelete-hide-comment' => 'Fjal rættingar frágreiðing',
 'revdelete-hide-user' => 'Fjal brúkaranavn/IP adressu hjá tí sum rættar',
+'revdelete-radio-same' => '(ikki broyta)',
 'revdelete-radio-set' => 'Ja',
 'revdelete-radio-unset' => 'Nei',
 'revdelete-suppress' => 'Síggj burtur frá data frá administratorum líka væl sum frá øðrum',
+'revdelete-unsuppress' => 'Tak burtur avmarkingar á endurskaptum versjónum',
 'revdelete-log' => 'Orsøk:',
 'revdelete-submit' => 'Fullfør á valdu {{PLURAL:$1|versjón|versjónir}}',
 'revdelete-success' => "'''Versjón sjónligheit er dagført við hepni.'''",
 'revdelete-failure' => "'''Versjóns sjónligheitin kundi ikki dagførast:'''
 $1",
+'logdelete-success' => "'''Sjónligheit broytt við hepni.'''",
 'revdel-restore' => 'broyt sjónligheit',
 'revdel-restore-deleted' => 'strikaðar rættingar',
 'revdel-restore-visible' => 'sjónligar broytingar',
@@ -952,8 +994,12 @@ $1",
 'deletedhist' => 'Strikingar søga',
 'revdelete-hide-current' => 'Tað er hendur ein feilur tá luturin skuldi fjalast, luturin er dagfestur $2, kl. $1: Hetta er nýggjast versjónin.
 Hon kann ikki fjalast.',
+'revdelete-show-no-access' => 'Feilur tá hesin lutur dagfestur $1 klokkan $2 skuldi vísast:Hesin lutur er blivin markeraður sum "avmarkaður".
+Tú hevur ikki atgongd til hann.',
+'revdelete-otherreason' => 'Onnur orsøk',
 'revdelete-reasonotherlist' => 'Onnur orsøk',
 'revdelete-edit-reasonlist' => 'Rætta strikingar orsøkir',
+'revdelete-offender' => 'Høvundurin av hesi endurskoðan:',
 
 # History merging
 'mergehistory-from' => 'Keldusíða:',
@@ -973,7 +1019,9 @@ Hon kann ikki fjalast.',
 'mergelogpagetext' => 'Niðanfyri er ein listi við teimum nýggjastu samanflættingunum av einari síðu søgu til eina aðra.',
 
 # Diffs
-'history-title' => 'Versjónssøgan hjá "$1"',
+'history-title' => 'Eftirlitssøgan hjá "$1"',
+'difference-title' => 'Munurin millum rættingarnar hjá "$1"',
+'difference-title-multipage' => 'Munurin millum síðurnar "$1" og "$2"',
 'difference-multipage' => '(Munur millum síður)',
 'lineno' => 'Linja $1:',
 'compareselectedversions' => 'Bera saman valdar útgávur',
@@ -1066,6 +1114,7 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'prefs-skin' => 'Hamur',
 'skin-preview' => 'Forskoðan',
 'prefs-datetime' => 'Dato og tíð',
+'prefs-user-pages' => 'Brúkarasíður',
 'prefs-personal' => 'Brúkaradáta',
 'prefs-rc' => 'Nýkomnar broytingar og stubbaskoðan',
 'prefs-watchlist' => 'Eftirlit',
@@ -1073,6 +1122,7 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'prefs-watchlist-days-max' => 'Í mesta lagi $1 {{PLURAL:$1|dagur|dagar}}',
 'prefs-watchlist-edits' => 'Tal av rættingum, sum skula vísast í víðkaðum eftirliti:',
 'prefs-watchlist-edits-max' => 'Í mesta lagi: 1000',
+'prefs-watchlist-token' => 'Lykil til eftirlitslistan:',
 'prefs-misc' => 'Ymiskar innstillingar',
 'prefs-resetpass' => 'Broyt loyniorð',
 'prefs-changeemail' => 'Broyt t-post adressu',
@@ -1127,9 +1177,13 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'yourrealname' => 'Títt navn*:',
 'yourlanguage' => 'Mál til brúkaraflatu:',
 'yournick' => 'Nýggj undirskrift:',
+'badsiglength' => 'Tín undirskrift er ov long. 
+Hon má ikki hava meira enn $1 {{PLURAL:$1|tekn|tekn}}',
 'yourgender' => 'Kyn:',
+'gender-unknown' => 'Ikki upplýst',
 'gender-male' => 'Maður',
 'gender-female' => 'Kvinna',
+'prefs-help-gender' => 'Tú avgerð sjálv/ur: Tað verður brúkt til at fáa kynsrættan tekst á nøkrum málum. Henda kunning verður almenn.',
 'email' => 'T-post',
 'prefs-help-realname' => 'Veruligt navn er valfrítt.
 Um tú velur at skriva tað her, so verður tað nýtt til at geva tær æruna fyri títt arbeiði.',
@@ -1138,7 +1192,9 @@ Um tú velur at skriva tað her, so verður tað nýtt til at geva tær æruna f
 Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í samband við teg.',
 'prefs-help-email-required' => 'T-post adressa er kravd.',
 'prefs-info' => 'Grundleggjandi kunning',
+'prefs-i18n' => 'Altjóðagerð',
 'prefs-signature' => 'Undirskrift',
+'prefs-timeoffset' => 'Tíðarmunur',
 'prefs-advancedediting' => 'Víðkaðir møguleikar',
 'prefs-advancedrc' => 'Víðkaðir møguleikar',
 'prefs-advancedrendering' => 'Víðkaðir møguleikar',
@@ -1162,8 +1218,14 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'userrights-editusergroup' => 'Rætta brúkarabólkar',
 'saveusergroups' => 'Goym brúkaraflokk',
 'userrights-groupsmember' => 'Limur í:',
+'userrights-groupsmember-auto' => 'Óbeinleiðis limur í:',
+'userrights-groups-help' => 'Tú kanst broyta bólkalimaskap hjá hesum limi: 
+* Ein krossaður kassi merkir, at hesin brúkari er limur í tí bólkinum. 
+* Ein kassi sum ikki er krossaður (tjekk merktur) merkir, at brúkarin ikki er limur í tí bólkinum. 
+* Ein * merkir, at tú kanst ikki taka bólkin burtur, tá tú fyrst hevur sett hann inn og mótsatt.',
 '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-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',
@@ -1175,6 +1237,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'group-bot' => 'Bottar',
 'group-sysop' => 'Umboðsstjórar',
 'group-bureaucrat' => 'Embætismenn',
+'group-suppress' => 'Yvirlit',
 'group-all' => '(allir)',
 
 'group-user-member' => '{{GENDER:$1|brúkari}}',
@@ -1206,10 +1269,20 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'right-reupload' => 'Yvirskriva verandi fílur',
 'right-reupload-own' => 'Yvirskriva verandi fílur, sum tú hevur lagt upp',
 'right-upload_by_url' => 'Legg fílur upp frá einum URL',
+'right-autoconfirmed' => 'Rætta hálvt-vardar síður (semi-protected)',
 'right-delete' => 'Strika síður',
 'right-bigdelete' => 'Strika síður við nógvum versjónum',
+'right-browsearchive' => 'Leita í strikaðum síðum',
+'right-undelete' => 'Endurstovnað eina síðu',
 'right-block' => 'Nokta øðrum brúkarum at rætta (blokka)',
+'right-blockemail' => 'Nokta einum brúkara at senda teldupost',
 'right-hideuser' => 'Sperra eitt brúkaranavn og goyma tað burtur fyri almenninginum',
+'right-unblockself' => 'Taka burtur sperring av sær sjálvum',
+'right-protect' => 'Broyt verjustøður og rætta vardar síður',
+'right-editprotected' => 'Rætta vardar síður (uttan niðurarvaða verju)',
+'right-editusercssjs' => 'Rætta CSS og JavaScript fílur hjá øðrum brúkarum',
+'right-editusercss' => 'Rætta CSS fílur hjá øðrum brúkarum',
+'right-edituserjs' => 'Rætta JavaScript fílur hjá øðrum brúkarum',
 'right-import' => 'Innflyt síður frá øðrum wikium',
 'right-patrol' => 'Marka broytingar hjá øðrum sum eftirkannaðar',
 'right-unwatchedpages' => 'Sí lista við síðum sum ikki eru eftiransaðar',
@@ -1217,8 +1290,13 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'right-userrights' => 'Rætta øll brúkaraloyvir',
 'right-userrights-interwiki' => 'Broyt brúkara rættindi hjá brúkarum á øðrum wikium',
 'right-sendemail' => 'Send t-post til aðrir brúkarar',
+'right-passwordreset' => 'Sí teldupostar til nullstilling av loyniorði',
 
 # User rights log
+'rightslog' => 'Rættindaloggur',
+'rightslogtext' => 'Hetta er ein loggur sum vísir broytingar í brúkararættindum.',
+'rightslogentry' => 'broyttar bólka limaskap fyri $1 frá $2 til $3',
+'rightslogentry-autopromote' => 'varð sjálvvirkandi fluttur upp frá $2 til $3',
 'rightsnone' => '(ongin)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1230,12 +1308,16 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'action-minoredit' => 'marka hesa rætting sum lítla',
 'action-move' => 'flyt hesa síðu',
 'action-move-subpages' => 'flyt hesa síðu og undirsíður hennara',
+'action-move-rootuserpages' => 'flyt høvuðs brúkarasíður',
 'action-movefile' => 'flyt hesa fílu',
 'action-upload' => 'send hesa fílu upp',
+'action-upload_by_url' => 'legg henda fílin upp frá einari URL-adressu',
 'action-delete' => 'Strika hesa síðu',
 'action-deletedhistory' => 'hygg at strikingar søguni hjá hesi síðu',
 'action-browsearchive' => 'leita eftir strikaðum síðum',
 'action-undelete' => 'endurstovnað hesa síðu',
+'action-block' => 'noktað hesum brúkara at rætta',
+'action-protect' => 'broyt verjustøðuna hjá hesi síðu',
 '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',
@@ -1275,6 +1357,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'newsectionsummary' => '/* $1 */ nýtt innlegg',
 'rc-enhanced-expand' => 'Vís smálutir (krevur JavaScript)',
 'rc-enhanced-hide' => 'Goym smálutir',
+'rc-old-title' => 'upprunaliga stovnað sum "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Viðkomandi broytingar',
@@ -1290,9 +1373,21 @@ Síður á [[Special:Watchlist|tínum eftiransingarlista]] eru skrivaðar við '
 # Upload
 'upload' => 'Legg fílu upp',
 'uploadbtn' => 'Legg fílu upp',
+'reuploaddesc' => 'Angra uppløðu og far aftur til upload formin',
+'upload-tryagain' => 'Goym broytta fílu frágreiðing',
 'uploadnologin' => 'Ikki ritað inn',
 'uploadnologintext' => 'Tú mást hava [[Special:UserLogin|ritað inn]]
 fyri at leggja fílur upp.',
+'upload-recreate-warning' => "'''Ávaring: Ein fíla við hasum navninum er blivin strikað ella flutt.'''
+
+Strikingar og flytingar loggurin (søgan) fyri ta síðuna verður vístur her niðanfyri fyri at gera tað lættari hjá tær:",
+'uploadtext' => "Brúka formularin her niðanfyri tá tú skalt leggja fílur út.
+Fyri at síggja ella leita eftir fílur sum longu eru lagdar út, kanst tú fara til [[Special:FileList|lista við upploadaðum fílum]], (endur)uploads eru eisini goymd í [[Special:Log/upload|upload logginum]], strikingar í [[Special:Log/delete|strikingarlogginum]].
+
+Fyri at taka eina fílu við á eina síðu, brúka so eina leinkju í ein av hesum formunum:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' fyri at brúka fulla versjón av fíluni
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' fyri at brúka eina 200 pixel breiða endurgeving í vinstra bredda við 'alt text' sum frágreiðing
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' fyri at leinkja beinleiðis til fíluna uttan at vísa fíluna",
 'upload-permitted' => 'Loyvd fílu sløg: $1.',
 'upload-preferred' => 'Best umtóktu fílu sløg: $1.',
 'upload-prohibited' => 'Ikki loyvd fílu sløg: $1.',
@@ -1328,6 +1423,9 @@ Vinarliga gev fíluni nýtt navn og royn at senda hana upp (uploada) enn einafer
 'large-file' => 'Tað verður viðmælt, at fílur ikki eru størri enn $1;
 henda fílin er $2.',
 'largefileserver' => 'Henda fílan er størri enn servarin er innstillaður til at loyva.',
+'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',
 'sourcefilename' => 'Kelda fílunavn:',
@@ -1345,6 +1443,7 @@ Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn e
 'upload-unknown-size' => 'Ókend stødd',
 
 # File backend
+'backend-fail-notexists' => 'Fílan $1 er ikki til.',
 '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.',
@@ -1352,26 +1451,55 @@ Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn e
 'backend-fail-writetemp' => 'Kundi ikki skriva til fyribils fílu.',
 'backend-fail-closetemp' => 'Kundi ikki aftur fyribils fílu.',
 'backend-fail-read' => 'Kundi ikki lesa fílu $1.',
-'backend-fail-create' => 'Kundi ikki skapa fílu $1.',
+'backend-fail-create' => 'Kundi ikki skriva fílu $1.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Kundi ikki lata upp "$1"; hon er ikki stongd.',
 'lockmanager-fail-closelock' => 'Kundi ikki lata aftur lás fílu fyri "$1".',
 'lockmanager-fail-deletelock' => 'Kundi ikki sletta lás fílu fyri "$1".',
+'lockmanager-fail-acquirelock' => 'Kundi ikki fáa lás til "$1".',
+'lockmanager-fail-openlock' => 'Kundi ikki læsa upp fíluna til: "$1".',
+'lockmanager-fail-releaselock' => 'Kundi ikki læsa upp læsingina fyri: "$1".',
 
 # img_auth script messages
+'img-auth-accessdenied' => 'Atgongd noktað',
+'img-auth-nologinnWL' => 'Tú ert ikki ritað/ur inn, og "$1" er ikki á hvítalista.',
+'img-auth-nofile' => 'Fílan "$1" er ikki til',
+'img-auth-isdir' => 'Tú roynir at fáa atgongd til mappuna "$1".
+Bert fílu atgongd er loyvd.',
+'img-auth-streaming' => 'Sendir "$1".',
 'img-auth-noread' => 'Brúkarin hevur ikki rættindi til at lesa "$1".',
 'img-auth-bad-query-string' => "URL'urin hevur ein ikki galdandi fyrispurning strong.",
 
 # HTTP errors
 'http-invalid-url' => 'Ógildug URL (internetadressa): $1',
+'http-invalid-scheme' => 'URLar av slagnum "$1" verða ikki stuðlaðir.',
+'http-request-error' => 'HTTP fyrispurningurin riggaði ikki av ókendum orsøkum.',
+'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>
+'upload-curl-error6' => 'URLurin er ikki atkomuligur',
+'upload-curl-error6-text' => "URL'urin sum tú skrivaði er ikki atkomuligur.
+Vinarliga dupult-eftirkannað at URL er rættur og at heimasíðan koyrir.",
+'upload-curl-error28' => 'Tað gekk ov long tíð við uppload',
+'upload-curl-error28-text' => 'Heimasíðan tók ov langa tíð at svara. 
+Vinarliga kanna eftir um síðan koyrir (er online), bíða eina lítla løtu og royn so aftur.
+Tú kanst eisini royna aftur, tá tað ikki eru so nógv í gongd her í senn.',
 
 'license' => 'Lisensur:',
 'license-header' => 'Lisensur',
 'nolicense' => 'Onki valt',
 'license-nopreview' => '(Fyrr ikki tøkt)',
+'upload_source_url' => '(ein galdandi, alment atkomuligan URL)',
+'upload_source_file' => '(ein fíla á tínari teldu)',
 
 # Special:ListFiles
+'listfiles_search_for' => 'Leita eftir miðla navni:',
+'imgfile' => 'fíla',
 'listfiles' => 'Myndalisti',
 'listfiles_thumb' => 'Lítli mynd',
 'listfiles_date' => 'Dagur',
@@ -1400,10 +1528,15 @@ Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn e
 'filehist-missing' => 'Fíla væntar',
 'imagelinks' => 'Nýtsla av fílu',
 'linkstoimage' => 'Fylgjandi {{PLURAL:$1|síða slóðar|$1 síður slóða}} til hesa fílu:',
+'linkstoimage-more' => 'Meira enn $1 {{PLURAL:$1|síða slóðar|síður slóða}} til hesa fílu.
+Hesin listin vísir {{PLURAL:$1|fyrstu síðu slóð|firstu $1 síðu slóðir}} bert til hesa fílu.
+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',
 '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.',
+'shared-repo-from' => 'frá $1',
 
 # File deletion
 'filedelete' => 'Strika $1',
@@ -1494,6 +1627,9 @@ Víðaristilling verður nú gjørd til [[$2]].',
 'deadendpages' => 'Gøtubotnssíður',
 'protectedpages' => 'Friðaðar síður',
 'listusers' => 'Brúkaralisti',
+'listusers-editsonly' => 'Vís bara brúkarar sum hava gjørt rættingar',
+'listusers-creationsort' => 'Bólkað eftir stovningardegnum',
+'usereditcount' => '$1 {{PLURAL:$1|rætting|rættingar}}',
 'usercreated' => '{{GENDER:$3|Upprættað}} hin $1 kl. $2',
 'newpages' => 'Nýggjar síður',
 'newpages-username' => 'Brúkaranavn:',
@@ -1536,6 +1672,11 @@ Tú kanst avmarka sýningina við at velja slag av loggi, brúkaranavn (sum er f
 [[Special:UnusedCategories|Ikki brúktir bólkar]] eru ikki vístar her.
 Sí eisini [[Special:WantedCategories|ynsktir bólkar]].',
 
+# Special:DeletedContributions
+'deletedcontributions' => 'Slettaði brúkaraíkøst',
+'deletedcontributions-title' => 'Slettaði brúkaraíkøst',
+'sp-deletedcontributions-contribs' => 'íkøst',
+
 # Special:LinkSearch
 'linksearch-ns' => 'Navnarúm:',
 'linksearch-ok' => 'Leita',
@@ -1546,24 +1687,49 @@ 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:Log/newusers
 'newuserlogpage' => 'Brúkara logg',
+'newuserlogpagetext' => 'Hetta er ein listi yvir seinast stovnaðu brúkarar.',
 
 # 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.
+Møguliga er [[{{MediaWiki:Listgrouprights-helppage}}|meira kunning]] um einstøk rættindi.',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">Givin rættindi</span>
+* <span class="listgrouprights-revoked">Frátikin rættindi</span>',
+'listgrouprights-group' => 'Bólkur',
+'listgrouprights-rights' => 'Rættindi',
+'listgrouprights-helppage' => 'Help:Bólka rættindi',
 'listgrouprights-members' => '(limalisti)',
+'listgrouprights-removegroup' => 'Tak burtur {{PLURAL:$2|bólk|bólkar}}: $1',
+'listgrouprights-addgroup-all' => 'Legg til allir bólkar',
+'listgrouprights-removegroup-all' => 'Tak burtur allir bólkar',
+'listgrouprights-addgroup-self' => 'Legg {{PLURAL:$2|bólk|bólkar}} til tína egnu konto: $1',
+'listgrouprights-removegroup-self' => 'Tak burtur {{PLURAL:$2|bólk|bólkar}} frá egnari konto: $1',
+'listgrouprights-addgroup-self-all' => 'Legg allir bólkar til egna konto',
+'listgrouprights-removegroup-self-all' => 'Tak burtur allir bólkar frá egnari konto',
 
 # E-mail user
+'mailnologin' => 'Ongin móttakara bústaður',
 'mailnologintext' => 'Tú mást hava [[Special:UserLogin|ritað inn]]
 og hava virkandi teldupostadressu í [[Special:Preferences|innstillingum]] tínum
 fyri at senda teldupost til aðrar brúkarar.',
 'emailuser' => 'Send t-post til brúkara',
 'emailpage' => 'Send t-post til brúkara',
+'emailpagetext' => 'Tú kanst brúka skjalið niðanfyri til at senda ein teldupost til henda brúkaran.
+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',
 'usermaildisabledtext' => 'Tú kanst ikki senda teldupost til aðrir brúkarar á hesi wiki',
 'noemailtitle' => 'Ongin t-post adressa',
 'noemailtext' => 'Hesin brúkarin hevur ikki upplýst eina gylduga t-post-adressu.',
 'nowikiemailtitle' => 'Ongin t-postur er loyvdur',
+'emailusername' => 'Brúkaranavn:',
 'emailfrom' => 'Frá:',
 'emailto' => 'Til:',
 'emailsubject' => 'Evni:',
@@ -1611,7 +1777,10 @@ Vilt tú flyta síðuna undan tínum eftirliti, kanst tú trýsta á \"Strika ef
 'confirm' => 'Vátta',
 'excontent' => "innihald var: '$1'",
 'excontentauthor' => "innihaldið var: '$1' (og einasti rithøvundur var '[[Special:Contributions/$2|$2]]')",
+'exbeforeblank' => 'innihaldið áðrenn síðan varð tømd var: "$1"',
 'exblank' => 'síðan var tóm',
+'delete-confirm' => 'Strikað "$1"',
+'delete-legend' => 'Strikað',
 'historywarning' => "'''Ávaring:''' Síðan, ið tú ert í gongd við at strika, hevur eina søgu við umleið $1 {{PLURAL:$1|broyting|broytingum}}:",
 'confirmdeletetext' => 'Tú ert í gongd við endaliga at strika ein a síðu
 ella mynd saman við allari søgu úr dátugrunninum.
@@ -1623,14 +1792,29 @@ avleiðingarnar og at tú gert tað í tráð við
 'deletedtext' => '"$1" er nú strikað.
 Sí $2 fyri fulla skráseting av strikingum.',
 'dellogpage' => 'Striku logg',
+'dellogpagetext' => 'Niðanfyri síggjast tær nýggjastu strikingarnar.',
 'deletionlog' => 'striku logg',
+'reverted' => 'Aftur til eina eldri verjsón',
 'deletecomment' => 'Orsøk:',
+'deleteotherreason' => 'Onnur orsøk:',
+'deletereasonotherlist' => 'Onnur orsøk',
+'deletereason-dropdown' => '*Vanligar orsøkir til striking
+** Umbøn frá høvunda
+** Brot á upphavsrættin
+** Herverk (Vandalisma)',
+'delete-edit-reasonlist' => 'Rætta orsøkir til striking',
+'delete-toobig' => 'Henda síðan hevur eina langa rættingar søgu, meira enn $1 {{PLURAL:$1|versjón|versjónir}}. 
+Striking av slíkum síðum er avmarkað fyri at forða fyri at onkur av óvart kemur til at forstýra {{SITENAME}}.',
 
 # Rollback
 'rollback' => 'Rulla broytingar aftur',
 'rollback_short' => 'Rulla aftur',
 'rollbacklink' => 'afturrulling',
 'rollbackfailed' => 'Afturrulling miseydnað',
+'revertpage' => 'Tók burtur rættingar hjá [[Special:Contributions/$2|$2]] ([[User talk:$2|kjak]]) til seinastu versjón hjá [[User:$1|$1]]',
+'revertpage-nouser' => 'Tók burtur rættingar hjá (brúkaranavn tikið vekk) til seinastu versjón hjá [[User:$1|$1]]',
+'rollback-success' => 'Tók burtur rættingar hjá $1;
+broytti tað aftur til seinastu versjón hjá $2.',
 
 # Protect
 'protectlogpage' => 'Friðingarbók',
@@ -1903,14 +2087,10 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
 # Info page
 'pageinfo-title' => 'Kunning um "$1"',
 'pageinfo-header-edits' => 'Rættingar',
-'pageinfo-header-watchlist' => 'Eftirlits listi',
-'pageinfo-header-views' => 'Skoðanir',
-'pageinfo-subjectpage' => 'Síða',
-'pageinfo-talkpage' => 'Kjak síða',
+'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-views' => 'Tal av skoðanum',
 
 # Skin names
 'skinname-standard' => 'Standardur',
index 6aefb8e..5b1f34a 100644 (file)
@@ -8,10 +8,14 @@
  * @file
  *
  * @author Agzennay
+ * @author Amqui
  * @author Arkanosis
+ * @author Boniface
+ * @author Brunoperel
  * @author Cedric31
  * @author ChrisPtDe
  * @author Coyau
+ * @author Cquoi
  * @author Crochet.david
  * @author Csisc
  * @author Damouns
@@ -22,6 +26,7 @@
  * @author Dodoïste
  * @author Elfix
  * @author Enzoreg
+ * @author Erkethan
  * @author Esbardu
  * @author Fryed-peach
  * @author Giro720
  * @author Sandji
  * @author Seb35
  * @author Sherbrooke
+ * @author Shirayuki
  * @author Skalman
  * @author The Evil IP address
+ * @author Tititou36
  * @author TouzaxA
  * @author Tpt
  * @author Urhixidur
@@ -129,143 +136,143 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#REDIRECTION', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__AUCUNENTETE__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'HORAIREACTUEL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'HEUREACTUELLE', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'JOUR2LOCAL', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ANNEELOCALE', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'HORAIRELOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'HEURELOCALE', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'NOMPAGE', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NOMPAGEX', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ESPACENOMMAGE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ESPACEDISCUSSION', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NOMPAGEDISCUSSIONX', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NOMPAGESUJET', 'NOMPAGEARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NOMPAGESUJETX', 'NOMPAGEARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'img_thumbnail'           => array( '1', 'vignette', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'vignette=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'droite', 'right' ),
-       'img_left'                => array( '1', 'gauche', 'left' ),
-       'img_none'                => array( '1', 'néant', 'neant', 'none' ),
-       'img_center'              => array( '1', 'centré', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
-       'img_upright'             => array( '1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'bordure', 'border' ),
-       'img_baseline'            => array( '1', 'ligne_de_base', 'base', 'baseline' ),
-       'img_sub'                 => array( '1', 'indice', 'ind', 'sub' ),
-       'img_super'               => array( '1', 'exposant', 'exp', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'haut', 'top' ),
-       'img_text_top'            => array( '1', 'haut-texte', 'haut-txt', 'text-top' ),
-       'img_middle'              => array( '1', 'milieu', 'middle' ),
-       'img_bottom'              => array( '1', 'bas', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'bas-texte', 'bas-txt', 'text-bottom' ),
-       'img_link'                => array( '1', 'lien=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'NOMSITE', 'SITENAME' ),
-       'ns'                      => array( '0', 'ESPACEN:', 'NS:' ),
-       'nse'                     => array( '0', 'ESPACENX:', 'NSE:' ),
-       'localurl'                => array( '0', 'URLLOCALE:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URLLOCALEX:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'CHEMINARTICLE', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'SERVEUR', 'SERVER' ),
-       'servername'              => array( '0', 'NOMSERVEUR', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'CHEMINSCRIPT', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'CHEMINSTYLE', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMMAIRE:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GENRE:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__SANSCONVERSIONTITRE__', '__SANSCT__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__SANSCONVERSIONCONTENU__', '__SANSCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'JDSACTUEL', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'SEMAINELOCALE', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'JDSLOCAL', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDVERSION', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'JOURVERSION', 'JOUR1VERSION', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'JOUR2VERSION', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MOISVERSION', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'MOISVERSION1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'ANNEEVERSION', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'INSTANTVERSION', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'UTILISATEURVERSION', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'PLURIEL:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'URLCOMPLETE:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLCOMPLETEX:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'INITMINUS:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'INITMAJUS:', 'INITCAPIT:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MINUS:', 'LC:' ),
-       'uc'                      => array( '0', 'MAJUS:', 'CAPIT:', 'UC:' ),
-       'raw'                     => array( '0', 'BRUT:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'BRUT', 'B', 'R' ),
-       'newsectionlink'          => array( '1', '__LIENNOUVELLESECTION__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__AUCUNLIENNOUVELLESECTION__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'VERSIONACTUELLE', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ENCODEURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ENCODEANCRE', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'INSTANTACTUEL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'MARQUEDIRECTION', 'MARQUEDIR', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#LANGUE:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'LANGUECONTENU', 'LANGCONTENU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PAGESDANSESPACE:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMATNOMBRE', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'BOURRAGEGAUCHE', 'BOURREGAUCHE', 'PADLEFT' ),
-       'padright'                => array( '0', 'BOURRAGEDROITE', 'BOURREDROITE', 'PADRIGHT' ),
-       'special'                 => array( '0', 'spécial', 'special' ),
-       'defaultsort'             => array( '1', 'CLEFDETRI:', 'CLEDETRI:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'CHEMIN:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'balise', 'tag' ),
-       'hiddencat'               => array( '1', '__CATCACHEE__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAGESDANSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'TAILLEPAGE', 'PAGESIZE' ),
-       'noindex'                 => array( '1', '__AUCUNINDEX__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'NOMBREDANSGROUPE', 'NBDANSGROUPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
-       'url_path'                => array( '0', 'CHEMIN', 'PATH' ),
-       'url_query'               => array( '0', 'QUESTION', 'QUERY' ),
+       'redirect'                  => array( '0', '#REDIRECTION', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__AUCUNENTETE__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'HORAIREACTUEL', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'HEUREACTUELLE', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'JOUR2LOCAL', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ANNEELOCALE', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'HORAIRELOCAL', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'HEURELOCALE', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'NOMPAGE', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NOMPAGEX', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ESPACENOMMAGE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ESPACEDISCUSSION', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NOMPAGEDISCUSSIONX', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NOMPAGESUJET', 'NOMPAGEARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NOMPAGESUJETX', 'NOMPAGEARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'img_thumbnail'             => array( '1', 'vignette', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'vignette=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'droite', 'right' ),
+       'img_left'                  => array( '1', 'gauche', 'left' ),
+       'img_none'                  => array( '1', 'néant', 'neant', 'none' ),
+       'img_center'                => array( '1', 'centré', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
+       'img_upright'               => array( '1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'bordure', 'border' ),
+       'img_baseline'              => array( '1', 'ligne_de_base', 'base', 'baseline' ),
+       'img_sub'                   => array( '1', 'indice', 'ind', 'sub' ),
+       'img_super'                 => array( '1', 'exposant', 'exp', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'haut', 'top' ),
+       'img_text_top'              => array( '1', 'haut-texte', 'haut-txt', 'text-top' ),
+       'img_middle'                => array( '1', 'milieu', 'middle' ),
+       'img_bottom'                => array( '1', 'bas', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'bas-texte', 'bas-txt', 'text-bottom' ),
+       'img_link'                  => array( '1', 'lien=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'NOMSITE', 'SITENAME' ),
+       'ns'                        => array( '0', 'ESPACEN:', 'NS:' ),
+       'nse'                       => array( '0', 'ESPACENX:', 'NSE:' ),
+       'localurl'                  => array( '0', 'URLLOCALE:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URLLOCALEX:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'CHEMINARTICLE', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'SERVEUR', 'SERVER' ),
+       'servername'                => array( '0', 'NOMSERVEUR', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'CHEMINSCRIPT', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'CHEMINSTYLE', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMMAIRE:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GENRE:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__SANSCONVERSIONTITRE__', '__SANSCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__SANSCONVERSIONCONTENU__', '__SANSCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'JDSACTUEL', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'SEMAINELOCALE', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'JDSLOCAL', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDVERSION', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'JOURVERSION', 'JOUR1VERSION', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'JOUR2VERSION', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MOISVERSION', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'MOISVERSION1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'ANNEEVERSION', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'INSTANTVERSION', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'UTILISATEURVERSION', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'PLURIEL:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'URLCOMPLETE:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLCOMPLETEX:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'INITMINUS:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'INITMAJUS:', 'INITCAPIT:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MINUS:', 'LC:' ),
+       'uc'                        => array( '0', 'MAJUS:', 'CAPIT:', 'UC:' ),
+       'raw'                       => array( '0', 'BRUT:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'BRUT', 'B', 'R' ),
+       'newsectionlink'            => array( '1', '__LIENNOUVELLESECTION__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__AUCUNLIENNOUVELLESECTION__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VERSIONACTUELLE', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ENCODEURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ENCODEANCRE', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'INSTANTACTUEL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'MARQUEDIRECTION', 'MARQUEDIR', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#LANGUE:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'LANGUECONTENU', 'LANGCONTENU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PAGESDANSESPACE:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMATNOMBRE', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'BOURRAGEGAUCHE', 'BOURREGAUCHE', 'PADLEFT' ),
+       'padright'                  => array( '0', 'BOURRAGEDROITE', 'BOURREDROITE', 'PADRIGHT' ),
+       'special'                   => array( '0', 'spécial', 'special' ),
+       'defaultsort'               => array( '1', 'CLEFDETRI:', 'CLEDETRI:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'CHEMIN:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'balise', 'tag' ),
+       'hiddencat'                 => array( '1', '__CATCACHEE__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAGESDANSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'TAILLEPAGE', 'PAGESIZE' ),
+       'noindex'                   => array( '1', '__AUCUNINDEX__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'NOMBREDANSGROUPE', 'NBDANSGROUPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
+       'url_path'                  => array( '0', 'CHEMIN', 'PATH' ),
+       'url_query'                 => array( '0', 'QUESTION', 'QUERY' ),
 );
 
 $specialPageAliases = array(
@@ -371,7 +378,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Masquer les modifications surveillées dans les modifications récentes',
 'tog-newpageshidepatrolled' => 'Masquer les pages surveillées parmi les nouvelles pages',
 'tog-extendwatchlist' => 'Étendre la liste de suivi pour afficher toutes les modifications et non seulement les plus récentes',
-'tog-usenewrc' => 'Utiliser les modifications récentes améliorées (nécessite JavaScript)',
+'tog-usenewrc' => 'Grouper les changements dans les modifications récentes et la liste de suivi (nécessite JavaScript)',
 'tog-numberheadings' => 'Numéroter automatiquement les titres de section',
 'tog-showtoolbar' => "Montrer la barre d'outils de modification (nécessite JavaScript)",
 'tog-editondblclick' => 'Modifier des pages sur double-clic (nécessite JavaScript)',
@@ -379,17 +386,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Activer la modification de sections par clic droit sur leurs titres (nécessite JavaScript)',
 'tog-showtoc' => 'Afficher la table des matières (pour les pages ayant plus de 3 sections)',
 'tog-rememberpassword' => 'Se souvenir de mon identification avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
-'tog-watchcreations' => 'Ajouter les pages que je crée à ma liste de suivi',
-'tog-watchdefault' => 'Ajouter les pages que je modifie à ma liste de suivi',
-'tog-watchmoves' => 'Ajouter les pages que je renomme à ma liste de suivi',
-'tog-watchdeletion' => 'Ajouter les pages que je supprime à ma liste de suivi',
+'tog-watchcreations' => 'Ajouter les pages que je crée et les fichiers que j’importe à ma liste de suivi',
+'tog-watchdefault' => 'Ajouter les pages et les fichiers que je modifie à ma liste de suivi',
+'tog-watchmoves' => 'Ajouter les pages et les fichiers que je renomme à ma liste de suivi',
+'tog-watchdeletion' => 'Ajouter les pages et les fichiers que je supprime à ma liste de suivi',
 'tog-minordefault' => 'Marquer mes modifications comme mineures par défaut',
 'tog-previewontop' => 'Afficher la prévisualisation au-dessus de la zone de modification',
 'tog-previewonfirst' => 'Afficher la prévisualisation lors de la première modification',
 'tog-nocache' => 'Désactiver le cache des pages par le navigateur',
-'tog-enotifwatchlistpages' => 'M’avertir par courriel lorsqu’une page de ma liste de suivi est modifiée',
+'tog-enotifwatchlistpages' => 'M’avertir par courriel lorsqu’une page ou un fichier de ma liste de suivi est modifiée',
 'tog-enotifusertalkpages' => 'M’avertir par courriel si ma page de discussion est modifiée',
-'tog-enotifminoredits' => "M'avertir par courriel même en cas de modifications mineures des pages",
+'tog-enotifminoredits' => "M'avertir par courriel même en cas de modifications mineures des pages ou des fichiers",
 'tog-enotifrevealaddr' => 'Afficher mon adresse de courriel dans les courriels de notification',
 'tog-shownumberswatching' => 'Afficher le nombre d’utilisateurs qui suivent cette page',
 'tog-oldsig' => 'Signature existante :',
@@ -405,7 +412,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Masquer les modifications faites par des utilisateurs inscrits dans la liste de suivi',
 'tog-watchlisthideanons' => 'Masquer les modifications anonymes dans la liste de suivi',
 'tog-watchlisthidepatrolled' => 'Masquer les modifications surveillées dans la liste de suivi',
-'tog-nolangconversion' => 'Désactiver la conversion des variantes linguistiques',
 'tog-ccmeonemails' => 'M’envoyer une copie des courriels que j’envoie aux autres utilisateurs',
 'tog-diffonly' => 'Ne pas afficher le contenu des pages sous les diffs',
 'tog-showhiddencats' => 'Afficher les catégories cachées',
@@ -417,11 +423,11 @@ $messages = array(
 'underline-default' => 'Valeur par défaut du navigateur',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Style de police de la zone d’édition :',
-'editfont-default' => 'Celui par défaut du navigateur',
+'editfont-style' => 'Style de police de la zone de modification :',
+'editfont-default' => 'Police du navigateur par défaut',
 'editfont-monospace' => 'Police de chasse fixe',
 'editfont-sansserif' => 'Police sans empattement',
-'editfont-serif' => 'Police avec empattements',
+'editfont-serif' => 'Police avec empattement',
 
 # Dates
 'sunday' => 'dimanche',
@@ -600,7 +606,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' => 'À propos de {{SITENAME}}',
 'aboutpage' => 'Project:À propos',
-'copyright' => 'Contenu disponible sous $1.',
+'copyright' => 'Sous licence $1',
 'copyrightpage' => '{{ns:project}}:Copyrights',
 'currentevents' => 'Actualités',
 'currentevents-url' => 'Project:Actualités',
@@ -629,6 +635,10 @@ $1',
 'youhavenewmessages' => 'Vous avez $1 ($2).',
 'newmessageslink' => 'de nouveaux messages',
 'newmessagesdifflink' => 'dernière modification',
+'youhavenewmessagesfromusers' => "Vous avez  $1  d'{{PLURAL:$3| un autre utilisateur|$3 autres utilisateurs}} ( $2 ).",
+'youhavenewmessagesmanyusers' => 'Vous avez $1 de nombreux utilisateurs ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|un message|nouveaux messages}}',
+'newmessagesdifflinkplural' => 'dernières {{PLURAL:$1|modification|modifications}}',
 'youhavenewmessagesmulti' => 'Vous avez de nouveaux messages sur $1.',
 'editsection' => 'modifier',
 'editold' => 'modifier',
@@ -683,9 +693,9 @@ Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{in
 'dberrortext' => 'Une erreur de syntaxe de la requête dans la base de données est survenue.
 Ceci peut indiquer un bogue dans le logiciel.
 La dernière requête traitée par la base de données était :
-<blockquote><tt>$1</tt></blockquote>
-depuis la fonction « <tt>$2</tt> ».
-La base de données a renvoyé l’erreur « <tt>$3 : $4</tt> ».',
+<blockquote><code>$1</code></blockquote>
+depuis la fonction « <code>$2</code> ».
+La base de données a renvoyé l’erreur « <samp>$3 : $4</samp> ».',
 'dberrortextcl' => 'Une requête dans la base de données comporte une erreur de syntaxe.
 La dernière requête émise était :
 « $1 »
@@ -722,6 +732,8 @@ Veuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oubli
 'cannotdelete' => 'Impossible de supprimer la page ou le fichier « $1 ».
 La suppression a peut-être déjà été effectuée par quelqu’un d’autre.',
 'cannotdelete-title' => 'Impossible de supprimer la page « $1 »',
+'delete-hook-aborted' => "Suppression annulée par une extension.
+Aucune explication n'a été fournie.",
 'badtitle' => 'Mauvais titre',
 'badtitletext' => 'Le titre de la page demandée est invalide, vide, ou il s’agit d’un titre inter-langue ou inter-projet mal lié. Il contient peut-être un ou plusieurs caractères qui ne peuvent pas être utilisés dans les titres.',
 'perfcached' => 'Les données suivantes sont en cache et peuvent ne pas être à jour. Un maximum de {{PLURAL:$1|un résultat|$1 résultats}} est disponible dans le cache.',
@@ -754,6 +766,8 @@ Le motif avancé est « ''$2'' ».",
 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é',
+'exception-nologin-text' => "Cette page ou cette action nécessite d'être connecté sur ce wiki.",
 
 # Virus scanner
 'virus-badscanner' => "Mauvaise configuration : scanneur de virus inconnu : ''$1''",
@@ -775,6 +789,7 @@ N’oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{S
 'remembermypassword' => 'Me reconnecter automatiquement aux prochaines visites avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
 'securelogin-stick-https' => 'Rester connecté en HTTPS après la connexion',
 'yourdomainname' => 'Votre domaine :',
+'password-change-forbidden' => 'Vous ne pouvez pas modifier les mots de passe sur ce wiki.',
 'externaldberror' => 'Une erreur s’est produite avec la base de données d’authentification externe, ou bien vous n’êtes pas autorisé{{GENDER:||e|(e)}} à mettre à jour votre compte externe.',
 'login' => 'Connexion',
 'nav-login-createaccount' => 'Créer un compte ou se connecter',
@@ -928,7 +943,7 @@ Mot de passe temporaire : $2',
 'link_tip' => 'Lien interne',
 'extlink_sample' => 'http://www.example.com titre du lien',
 'extlink_tip' => 'Lien externe (n’oubliez pas le préfixe http://)',
-'headline_sample' => 'Texte de sous-titre',
+'headline_sample' => 'Texte dtitre',
 'headline_tip' => 'Sous-titre niveau 2',
 'nowiki_sample' => 'Entrez le texte non formaté ici',
 'nowiki_tip' => 'Ignorer la syntaxe wiki',
@@ -1012,6 +1027,10 @@ ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer cette page]</span>.',
 'noarticletext-nopermission' => 'Il n’y a pour l’instant aucun texte sur cette page.
 Vous pouvez [[Special:Search/{{PAGENAME}}|faire une recherche sur ce titre]] dans les autres pages,
 ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les journaux associés]</span>.',
+'missing-revision' => "La révision n° $1 de la page intitulée « {{PAGENAME}} » n'existe pas.
+
+Cela survient en général en suivant un lien historique obsolète vers une page qui a été supprimée.
+Vous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
 'userpage-userdoesnotexist' => 'Le compte utilisateur « <nowiki>$1</nowiki> » n’est pas enregistré. Veuillez vérifier que vous voulez créer cette page.',
 'userpage-userdoesnotexist-view' => 'Le compte utilisateur « $1 » n’est pas enregistré.',
 'blocked-notice-logextract' => 'Cet utilisateur est actuellement bloqué.
@@ -1020,7 +1039,6 @@ La dernière entrée du registre des blocages est indiquée ci-dessous à titre
 * '''Firefox / Safari :''' Maintenez la touche ''Maj'' (''Shift'') en cliquant sur le bouton ''Actualiser'' ou pressez ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' sur un Mac) ;
 * '''Google Chrome :''' Appuyez sur ''Ctrl-Maj-R'' (''⌘-Shift-R'' sur un Mac) ;
 * '''Internet Explorer :''' Maintenez la touche ''Ctrl'' en cliquant sur le bouton ''Actualiser'' ou pressez ''Ctrl-F5'' ;
-* '''Konqueror :''' Cliquez sur ''Actualiser'' ou pressez ''F5'' ;
 * '''Opera :''' Videz le cache dans ''Outils → Préférences''.",
 'usercssyoucanpreview' => "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l’enregistrer.",
 'userjsyoucanpreview' => "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de l’enregistrer.",
@@ -1133,6 +1151,7 @@ Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maint
 'expansion-depth-exceeded-warning' => "Page dépassant la profondeur d'expansion",
 'parser-unstrip-loop-warning' => 'Boucle non démontable détectée',
 'parser-unstrip-recursion-limit' => 'Limite de récursion non démontable dépassée ($1)',
+'converter-manual-rule-error' => 'Erreur détectée dans la règle manuelle de conversion de langue',
 
 # "Undo" feature
 'undo-success' => 'Cette modification va être défaite. Veuillez vérifier les modifications ci-dessous, puis publier si c’est bien ce que vous voulez faire.',
@@ -1317,6 +1336,10 @@ Assurez-vous que cette opération conservera la continuité de l’historique de
 'editundo' => 'défaire',
 'diff-multi' => '({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par {{PLURAL:$2|un utilisateur|$2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par plus {{PLURAL:$2|d’un utilisateur|de $2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})',
+'difference-missing-revision' => "{{PLURAL:$2|Une révision|$2 révisions}} de cette différence ($1) {{PLURAL:$2|n'a pas été trouvée|n'ont pas été trouvées}}.
+
+Cela survient en général en suivant un lien de différence obsolète vers une page qui a été supprimée.
+Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
 
 # Search results
 'searchresults' => 'Résultats de la recherche',
@@ -1475,7 +1498,7 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
 'prefs-registration' => 'Date d’inscription :',
 'yourrealname' => 'Nom réel :',
 'yourlanguage' => 'Langue :',
-'yourvariant' => 'Variante de la langue du contenu:',
+'yourvariant' => 'Variante de la langue du contenu :',
 'prefs-help-variant' => 'Votre variante ou orthographe préféré dans lequel afficher les pages de contenu de ce wiki.',
 'yournick' => 'Signature pour les discussions :',
 'prefs-help-signature' => 'Les commentaires sur les pages de discussion doivent être signés avec « <nowiki>~~~~</nowiki> », qui sera converti par votre signature et un horodatage.',
@@ -1583,6 +1606,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'right-writeapi' => 'Utiliser l’API de modification du wiki',
 'right-delete' => 'Supprimer des pages',
 'right-bigdelete' => 'Supprimer des pages ayant un gros historique',
+'right-deletelogentry' => 'Supprimer et restaurer une entrée particulière du journal',
 'right-deleterevision' => 'Supprimer ou restaurer une version particulière d’une page',
 'right-deletedhistory' => 'Voir les entrées des historiques supprimées, mais sans leur texte',
 'right-deletedtext' => 'Voir le texte supprimé et les différences entre les versions supprimées',
@@ -1774,20 +1798,20 @@ Voyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentatio
 Ceci peut être dû à une erreur dans le nom du fichier.
 Veuillez vérifier que vous désirez vraiment importer ce fichier.',
 'windows-nonascii-filename' => 'Ce wiki ne supporte pas les noms de fichiers avec des caractères spéciaux.',
-'fileexists' => "Un fichier existe déjà sous ce nom.
-Merci de vérifier '''<tt>[[:$1]]</tt>''' si vous n’êtes pas certain{{GENDER:||e|}} de vouloir le modifier.
-[[$1|thumb]]",
-'filepageexists' => "La page de description pour ce fichier a déjà été créée ici '''<tt>[[:$1]]</tt>''', mais aucun fichier n’existe actuellement sous ce nom.
+'fileexists' => 'Un fichier existe déjà sous ce nom.
+Merci de vérifier <strong>[[:$1]]</strong> si vous n’êtes pas certain{{GENDER:||e|}} de vouloir le modifier.
+[[$1|thumb]]',
+'filepageexists' => 'La page de description pour ce fichier a déjà été créée ici <strong>[[:$1]]</strong>, mais aucun fichier n’existe actuellement sous ce nom.
 Le résumé que vous allez spécifier n’apparaîtra pas sur la page de description.
-Pour que ce soit le cas, vous devrez modifier manuellement la page. [[$1|thumb]]",
-'fileexists-extension' => "Un fichier existe avec un nom proche : [[$2|thumb]]
-* Nom du fichier à importer : '''<tt>[[:$1]]</tt>'''
-* Nom du fichier existant : '''<tt>[[:$2]]</tt>'''
-Veuillez choisir un autre nom.",
+Pour que ce soit le cas, vous devrez modifier manuellement la page. [[$1|thumb]]',
+'fileexists-extension' => 'Un fichier existe avec un nom proche : [[$2|thumb]]
+* Nom du fichier à importer : <strong>[[:$1]]</strong>
+* Nom du fichier existant : <strong>[[:$2]]</strong>
+Veuillez choisir un autre nom.',
 'fileexists-thumbnail-yes' => "Le fichier semble être une image en taille réduite ''(vignette)''. [[$1|thumb]]
-Veuillez vérifier le fichier '''<tt>[[:$1]]</tt>'''.
+Veuillez vérifier le fichier <strong>[[:$1]]</strong>.
 Si le fichier vérifié est la même image avec la taille initiale, il n’y a pas besoin d’importer une version réduite.",
-'file-thumbnail-no' => "Le nom du fichier commence par '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Le nom du fichier commence par <strong>$1</strong>.
 Il est possible qu’il s’agisse d’une version réduite ''(vignette)''.
 Si vous disposez du fichier en haute résolution, importez-le, sinon veuillez modifier son nom.",
 'fileexists-forbidden' => 'Un fichier avec ce nom existe déjà et ne peut pas être écrasé.
@@ -1897,15 +1921,16 @@ Si le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]
 'lockmanager-fail-releaselock' => 'Impossible de relâcher le verrou pour « $1 ».',
 'lockmanager-fail-db-bucket' => 'Impossible de contacter suffisamment de bases de données de verrouillage dans le godet $1.',
 'lockmanager-fail-db-release' => 'Impossible de relâcher les verrous sur la base de données $1.',
+'lockmanager-fail-svr-acquire' => "Impossible d'acquérir des verrous sur le serveur $1.",
 'lockmanager-fail-svr-release' => 'Impossible de relâcher les verrous sur le serveur $1.',
 
 # ZipDirectoryReader
-'zip-file-open-error' => "Une erreur s'est produite lors de l'ouverture du fichier ZIP pour contrôle.",
-'zip-wrong-format' => "Le fichier spécifié n'est pas un fichier ZIP.",
-'zip-bad' => 'Le fichier est un fichier ZIP corrompu ou illisible.
+'zip-file-open-error' => 'Une erreur s’est produite lors de l’ouverture du fichier ZIP pour contrôle.',
+'zip-wrong-format' => 'Le fichier spécifié n’est pas une archive ZIP.',
+'zip-bad' => 'Le fichier est une archive ZIP corrompue ou illisible.
 Il ne peut pas être correctement vérifié pour la sécurité.',
-'zip-unsupported' => 'Le fichier est un fichier ZIP qui utilise ZIP non supportées par MediaWiki. 
-Il ne peut pas être correctement vérifé pour la sécurité.',
+'zip-unsupported' => 'Le fichier est une archive ZIP qui utilise des caractéristiques non supportées par MediaWiki. 
+Sa sécurité ne peut pas être correctement vérifiée.',
 
 # Special:UploadStash
 'uploadstash' => "Cache d'import",
@@ -1982,7 +2007,7 @@ Quand elle est filtrée par utilisateur, seuls les fichiers dont la version la p
 'filehist-revert' => 'rétablir',
 'filehist-current' => 'actuel',
 'filehist-datetime' => 'Date et heure',
-'filehist-thumb' => 'Miniature',
+'filehist-thumb' => 'Vignette',
 'filehist-thumbtext' => 'Vignette pour la version du $1',
 'filehist-nothumb' => 'Pas de miniature',
 'filehist-user' => 'Utilisateur',
@@ -2002,7 +2027,7 @@ Une [[Special:WhatLinksHere/$2|liste complète]] est disponible.',
 'sharedupload' => 'Ce fichier provient de : $1. Il peut être utilisé par d’autres projets.',
 'sharedupload-desc-there' => 'Ce fichier provient de : $1. Il peut être utilisé par d’autres projets.
 Veuillez consulter [$2 sa page de description] pour plus d’informations.',
-'sharedupload-desc-here' => 'Ce fichier provient de $1. Il peut être utilisé par d’autres projets.
+'sharedupload-desc-here' => 'Ce fichier provient de $1. Il peut être utilisé par d’autres projets.
 Sa description sur sa [$2 page de description] est affichée ci-dessous.',
 'sharedupload-desc-edit' => 'Ce fichier provient de : $1. Il peut être utilisé par d’autres projets.
 Vous voulez peut-être modifier la description sur sa [$2 page de description].',
@@ -2015,6 +2040,7 @@ Vous voulez peut-être modifier la description sur sa [$2 page de description].'
 'shared-repo' => 'un dépôt partagé',
 'shared-repo-name-wikimediacommons' => 'Wikimédia Commons',
 'filepage.css' => '/* Les styles CSS placés ici sont inclus dans la page de description du fichier, également incluse sur les clients wikis étrangers */',
+'upload-disallowed-here' => 'Malheureusement, vous ne peut pas remplacer cette image.',
 
 # File reversion
 'filerevert' => 'Rétablir $1',
@@ -2049,7 +2075,7 @@ Vous voulez peut-être modifier la description sur sa [$2 page de description].'
 # MIME search
 'mimesearch' => 'Recherche par type de contenu MIME',
 'mimesearch-summary' => "Cette page vous permet de lister les fichiers accessibles par ce wiki en fonction de leur type de contenu MIME.
-Entrée : ''typedecontenu''/''sous-type'', par exemple <tt>image/jpeg</tt>.",
+Entrée : ''typedecontenu''/''sous-type'', par exemple <code>image/jpeg</code>.",
 'mimetype' => 'Type MIME :',
 'download' => 'télécharger',
 
@@ -2096,9 +2122,9 @@ N’oubliez pas de vérifier s’il n’y a pas d’autres liens vers les modèl
 
 'disambiguations' => 'Pages ayant des liens vers des pages d’homonymie',
 'disambiguationspage' => 'Template:Homonymie',
-'disambiguations-text' => "Les pages suivantes comportent un lien vers une '''page d’homonymie'''.
-Ces liens ambigus devraient plutôt pointer vers le bon article.<br />
-Une page est considérée comme une page d’homonymie si elle inclut (directement ou récursivement) un des modèles listés sur [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Les pages suivantes comportent au moins un lien vers une '''page d’homonymie'''.
+Elles devraient plutôt pointer vers le bon article.<br />
+Une page est considérée comme une page d’homonymie si elle utilise un modèle lié à [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Doubles redirections',
 'doubleredirectstext' => 'Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.
@@ -2123,6 +2149,7 @@ Les entrées <del>barrées</del> ont été résolues.',
 # Miscellaneous special pages
 'nbytes' => '$1 octet{{PLURAL:$1||s}}',
 'ncategories' => '$1 catégorie{{PLURAL:$1||s}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|page liée|pages liées}}',
 'nmembers' => '$1 membre{{PLURAL:$1||s}}',
 'nrevisions' => '$1 version{{PLURAL:$1||s}}',
@@ -2151,6 +2178,7 @@ Les entrées <del>barrées</del> ont été résolues.',
 'mostlinkedtemplates' => 'Modèles les plus utilisés',
 'mostcategories' => 'Pages utilisant le plus de catégories',
 'mostimages' => 'Fichiers les plus utilisés',
+'mostinterwikis' => "Pages avec le plus d'interwikis",
 'mostrevisions' => 'Pages les plus modifiées',
 'prefixindex' => 'Toutes les pages commençant par…',
 'prefixindex-namespace' => 'Toutes les pages avec préfixe (espace de noms $1)',
@@ -2251,7 +2279,7 @@ Voyez aussi [[Special:WantedCategories|les catégories demandées]].',
 'linksearch-ok' => 'Rechercher',
 'linksearch-text' => 'Des caractères jokers comme « *.wikipedia.org » peuvent être utilisés.
 Ils nécessitent au moins un domaine de niveau supérieur, par exemple « *.org ».<br />
-Protocoles reconnus : <tt>$1</tt> (n’ajoutez aucun de ceux-ci dans votre recherche).',
+Protocoles reconnus : <code>$1</code> (n’ajoutez aucun de ceux-ci dans votre recherche).',
 'linksearch-line' => '$1 est lié depuis $2',
 'linksearch-error' => 'Les caractères jokers ne peuvent être utilisés qu’au début du nom de domaine de l’hôte.',
 
@@ -2297,6 +2325,8 @@ Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuve
 'mailnologin' => 'Pas d’adresse d’expéditeur',
 'mailnologintext' => 'Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d’autres utilisateurs.',
 'emailuser' => 'Lui envoyer un courriel',
+'emailuser-title-target' => 'Envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}',
+'emailuser-title-notarget' => 'Envoyer un courriel à l’utilisateur',
 'emailpage' => 'Envoyer un courriel à l’utilisateur',
 'emailpagetext' => 'Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à cet utilisateur.
 L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.',
@@ -2440,6 +2470,8 @@ veuiller ne procéder qu’avec prudence.',
 'rollback' => 'Révoquer les modifications',
 'rollback_short' => 'Révoquer',
 'rollbacklink' => 'révoquer',
+'rollbacklinkcount' => 'révoquer $1 {{PLURAL:$1|modification|modifications}}',
+'rollbacklinkcount-morethan' => 'révoquer plus de $1 {{PLURAL:$1|modification|modifications}}',
 'rollbackfailed' => 'La révocation a échoué',
 'cantrollback' => 'Impossible de révoquer la modification ;
 le dernier contributeur est le seul auteur de cette page.',
@@ -2651,12 +2683,12 @@ Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont ét
 'ipbreason-dropdown' => '* Motifs de blocage les plus fréquents
 ** Insertion de fausses informations
 ** Suppression injustifiée de contenu des pages
-** Insertion répétée de liens externes publicitaires (spam)
+** Insertion répétée de liens externes publicitaires (pollupostage)
 ** Insertion de contenu sans aucun sens et de déchets dans les pages
 ** Tentative d’intimidation ou harcèlement
 ** Abus d’utilisation de comptes multiples
 ** Nom d’utilisateur inacceptable, injurieux ou diffamant',
-'ipb-hardblock' => 'Empêche les modifications des utilisateurs enregistrés utilisant cette adresse IP',
+'ipb-hardblock' => 'Empêcher les utilisateurs connectés de modifier en utilisant cette adresse IP',
 'ipbcreateaccount' => 'Empêcher la création de compte',
 'ipbemailban' => 'Empêcher l’utilisateur d’envoyer des courriels',
 'ipbenableautoblock' => 'Bloquer automatiquement la dernière adresse IP utilisée par l’utilisateur et toutes ses IPs ultérieures qu’il pourrait essayer',
@@ -2667,7 +2699,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êche cet utilisateur de modifier sa propre page de discussion pendant la durée de son blocage',
+'ipb-disableusertalk' => 'Empêcher cet utilisateur de modifier sa propre page de discussion pendant la durée de son blocage',
 'ipb-change-block' => 'Bloquer à nouveau cet utilisateur avec ces paramètres',
 'ipb-confirm' => 'Confirmer le blocage',
 'badipaddress' => 'Adresse IP incorrecte',
@@ -2933,6 +2965,7 @@ Toutes les actions d’importation inter-wiki sont consignées dans l’[[Specia
 '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-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]].
@@ -2968,6 +3001,9 @@ Un dossier temporaire est manquant.",
 '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-invalid' => 'Page « $1 » n’est pas importée parce que son nom n’est pas valide.',
+'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 log
 'importlogpage' => 'Journal des importations',
@@ -3090,7 +3126,10 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 'simple.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Simple uniquement */',
 'modern.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Moderne uniquement */',
 'vector.js' => '/* Tout code JavaScript placé ici sera chargé pour les utilisateurs de l’habillage Vector */',
+'group-autoconfirmed.js' => '/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */',
+'group-bot.js' => '/* Le JavaScript inclus ici n’affectera que les robots */',
 'group-sysop.js' => '/* Le JavaScript inclus ici n’affectera que les administrateurs */',
+'group-bureaucrat.js' => '/* Le JavaScript inclus ici n’affectera que les bureaucrates */',
 
 # Metadata
 'notacceptable' => 'Ce serveur wiki ne peut pas fournir les données dans un format que votre client soit capable de lire.',
@@ -3118,16 +3157,34 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 
 # Info page
 'pageinfo-title' => 'Informations pour « $1 »',
-'pageinfo-header-edits' => 'Modifications',
-'pageinfo-header-watchlist' => 'Liste de suivi',
-'pageinfo-header-views' => 'Vues',
-'pageinfo-subjectpage' => 'Page',
-'pageinfo-talkpage' => 'Page de discussion',
-'pageinfo-watchers' => 'Nombre de contributeurs ayant la page dans leur liste de suivi',
-'pageinfo-edits' => 'Nombre de modifications',
-'pageinfo-authors' => "Nombre d'auteurs distincts",
+'pageinfo-header-basic' => 'Informations de base',
+'pageinfo-header-edits' => 'Historique des modifications',
+'pageinfo-header-restrictions' => 'Protection de la page',
+'pageinfo-header-properties' => 'Propriétés de la page',
+'pageinfo-display-title' => 'Titre affiché',
+'pageinfo-default-sort' => 'Clé de tri par défaut',
+'pageinfo-length' => 'Taille de la page (en octets)',
+'pageinfo-article-id' => 'Numéro de la page',
+'pageinfo-robot-policy' => 'Statut de moteur de recherche',
+'pageinfo-robot-index' => 'Indexable',
+'pageinfo-robot-noindex' => 'Non indexable',
 'pageinfo-views' => 'Nombre de vues',
-'pageinfo-viewsperedit' => 'Visites par modification',
+'pageinfo-watchers' => 'Nombre de contributeurs ayant la page dans leur liste de suivi',
+'pageinfo-redirects-name' => 'Redirections vers cette page',
+'pageinfo-subpages-name' => 'Sous-pages de cette page',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirection|redirections}}; $3 {{PLURAL:$3|non-redirection|non-redirections}})',
+'pageinfo-firstuser' => 'Créateur de la page',
+'pageinfo-firsttime' => 'Date de création de la page',
+'pageinfo-lastuser' => 'Dernier contributeur',
+'pageinfo-lasttime' => 'Date de la dernière modification',
+'pageinfo-edits' => 'Nombre total de modifications',
+'pageinfo-authors' => "Nombre total d'auteurs distincts",
+'pageinfo-recent-edits' => 'Nombre de modifications récentes (dans les derniers $1)',
+'pageinfo-recent-authors' => "Nombre d'auteurs distincts récents",
+'pageinfo-restriction' => 'Protection de la page (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Mot magique|Mots magiques}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Catégorie cachée|Catégories cachées}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Modèle inclu|Modèles inclus}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -3182,6 +3239,7 @@ Si vous l’exécutez, votre système peut être compromis.",
 'file-info-size-pages' => '$1 × $2 pixels, taille de fichier: $3, type MIME: $4, $5 {{PLURAL:$5|page|pages}}',
 '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',
 'show-big-image' => 'Image en plus haute résolution',
 'show-big-image-preview' => 'Taille de cet aperçu : $1.',
 'show-big-image-other' => '{{PLURAL:$2|Autre résolution|Autres résolutions}} : $1.',
@@ -3191,6 +3249,8 @@ Si vous l’exécutez, votre système peut être compromis.",
 'file-info-png-looped' => 'en boucle',
 'file-info-png-repeat' => 'joué $1 {{PLURAL:$1|fois|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.'''",
 
 # Special:NewFiles
 'newimages' => 'Galerie des nouveaux fichiers',
@@ -3808,11 +3868,59 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l’éditeur normal]].',
 'watchlisttools-edit' => 'Voir et modifier la liste de suivi',
 'watchlisttools-raw' => 'Modifier la liste de suivi en mode brut',
 
+# Iranian month names
+'iranian-calendar-m1' => 'Farvardin',
+'iranian-calendar-m2' => 'Ordibehesht',
+'iranian-calendar-m3' => 'Khordâd',
+'iranian-calendar-m4' => 'Tir',
+'iranian-calendar-m5' => 'Mordâd',
+'iranian-calendar-m6' => 'Shahrivar',
+'iranian-calendar-m7' => 'Mehr',
+'iranian-calendar-m8' => 'Âbân',
+'iranian-calendar-m9' => 'Âzar',
+'iranian-calendar-m10' => 'Dey',
+'iranian-calendar-m11' => 'Bahman',
+'iranian-calendar-m12' => 'Esfand',
+
 # Hijri month names
-'hijri-calendar-m3' => 'Rabi’ al-awwal',
-'hijri-calendar-m4' => 'Rabi’ al-thani',
-'hijri-calendar-m8' => 'Sha’aban',
-'hijri-calendar-m11' => 'Dhu al-Qi’dah',
+'hijri-calendar-m1' => 'Mouharram',
+'hijri-calendar-m2' => 'Safar',
+'hijri-calendar-m3' => 'Rabia al awal',
+'hijri-calendar-m4' => 'Rabia ath-thani',
+'hijri-calendar-m5' => 'Joumada al oula',
+'hijri-calendar-m6' => 'Joumada ath-thania',
+'hijri-calendar-m7' => 'Rajab',
+'hijri-calendar-m8' => 'Chaabane',
+'hijri-calendar-m9' => 'Ramadan',
+'hijri-calendar-m10' => 'Chawwal',
+'hijri-calendar-m11' => 'Dhou al qi’da',
+'hijri-calendar-m12' => 'Dhou al-hijja',
+
+# Hebrew month names
+'hebrew-calendar-m1' => 'Tichri',
+'hebrew-calendar-m2' => 'Hèchvane',
+'hebrew-calendar-m3' => 'Kislev',
+'hebrew-calendar-m4' => 'Téveth',
+'hebrew-calendar-m5' => 'Schébat',
+'hebrew-calendar-m6' => 'Adar',
+'hebrew-calendar-m7' => 'Nissane',
+'hebrew-calendar-m8' => 'Iyar',
+'hebrew-calendar-m9' => 'Sivane',
+'hebrew-calendar-m10' => 'Tamouz',
+'hebrew-calendar-m11' => 'Av',
+'hebrew-calendar-m12' => 'Éloul',
+'hebrew-calendar-m1-gen' => 'Tichri',
+'hebrew-calendar-m2-gen' => 'Hèchvane',
+'hebrew-calendar-m3-gen' => 'Kislev',
+'hebrew-calendar-m4-gen' => 'Téveth',
+'hebrew-calendar-m5-gen' => 'Schébat',
+'hebrew-calendar-m6-gen' => 'Adar',
+'hebrew-calendar-m7-gen' => 'Nissane',
+'hebrew-calendar-m8-gen' => 'Iyar',
+'hebrew-calendar-m9-gen' => 'Sivane',
+'hebrew-calendar-m10-gen' => 'Tamouz',
+'hebrew-calendar-m11-gen' => 'Av',
+'hebrew-calendar-m12-gen' => 'Éloul',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])',
@@ -4015,9 +4123,12 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'api-error-empty-file' => 'Le fichier que vous avez soumis était vide.',
 'api-error-emptypage' => "Création de pages vide n'est pas autorisée.",
 'api-error-fetchfileerror' => 'Erreur interne : Quelque chose s’est mal passé lors de la récupération du fichier.',
+'api-error-fileexists-forbidden' => 'Un fichier nommé "$1" existe déjà, et ne peut pas être écrasé.',
+'api-error-fileexists-shared-forbidden' => 'Un fichier nommé "$1" existe déjà dans le répertoire des fichiers partagés, et ne peut pas être écrasé.',
 'api-error-file-too-large' => 'Le fichier que vous avez soumis était trop grand.',
 'api-error-filename-tooshort' => 'Le nom du fichier est trop court.',
 'api-error-filetype-banned' => 'Ce type de fichier est interdit.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|n’est pas un type de fichier autorisé|ne sont pas des types de fichiers autorisés}}. {{PLURAL:$3|Le type de fichier autorisé est |Les types de fichiers autorisés sont}} $2.',
 'api-error-filetype-missing' => 'L’extension du fichier est manquante.',
 'api-error-hookaborted' => 'La modification que vous avez essayé de faire a été arrêtée par un crochet d’une extension.',
 'api-error-http' => 'Erreur interne : ne peut se connecter au serveur.',
index 0dd57ec..b715fc4 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Franco-Provençal (Arpetan)
+/** Franco-Provençal (arpetan)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -145,149 +145,149 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#REDIRÈCCION', '#REDIRECTION', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__NION_SOMÈRO__', '__NIONA_TRÂBLA__', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__NIONA_GALERIE__', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORCIÉR_LO_SOMÈRO__', '__FORCIÉR_LA_TRÂBLA__', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__SOMÈRO__', '__TRÂBLA__', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__SÈCCION_QUE_PÔT_PAS_ÉTRE_CHANGIÊ__', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__NION_EN_TÉTA__', '__AUCUNENTETE__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'MÊS_D_ORA', 'MÊS_D_ORA_2', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MÊS_D_ORA_1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NOM_DU_MÊS_D_ORA', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'GÈNITIF_DU_NOM_DU_MÊS_D_ORA', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ABRÈV_DU_MÊS_D_ORA', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'JORN_D_ORA', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'JORN_D_ORA_2', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NOM_DU_JORN_D_ORA', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'AN_D_ORA', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'HORÈRO_D_ORA', 'HORAIREACTUEL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'HORA_D_ORA', 'HEUREACTUELLE', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MÊS_LOCAL', 'MÊS_LOCAL_2', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'MÊS_LOCAL_1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'NOM_DU_MÊS_LOCAL', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'GÈNITIF_DU_NOM_DU_MÊS_LOCAL', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ABRÈV_DU_MÊS_LOCAL', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'JORN_LOCAL', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'JORN_LOCAL_2', 'JOUR2LOCAL', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NOM_DU_JORN_LOCAL', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'AN_LOCAL', 'ANNEELOCALE', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'HORÈRO_LOCAL', 'HORAIRELOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'HORA_LOCALA', 'HEURELOCALE', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NOMBRO_DE_PÂGES', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NOMBRO_D_ARTICLLOS', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NOMBRO_DE_FICHIÉRS', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NOMBRO_D_USANCIÉRS', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NOMBRO_D_USANCIÉRS_ACTIFS', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NOMBRO_DE_CHANGEMENTS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NOMBRO_DE_VUES', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'NOM_DE_LA_PÂGE', 'NOMPAGE', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NOM_DE_LA_PÂGE_URL', 'NOMPAGEX', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ÈSPÂÇO_DE_NOMS', 'ESPACENOMMAGE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ÈSPÂÇO_DE_NOMS_URL', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ÈSPÂÇO_DE_DISCUSSION', 'ESPACEDISCUSSION', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ÈSPÂÇO_DE_DISCUSSION_URL', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ÈSPÂÇO_DU_SUJÈT', 'ÈSPÂÇO_DE_L_ARTICLLO', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ÈSPÂÇO_DU_SUJÈT_URL', 'ÈSPÂÇO_DE_L_ARTICLLO_URL', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'NOM_COMPLÈT_DE_LA_PÂGE', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'NOM_COMPLÈT_DE_LA_PÂGE_URL', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NOM_DE_LA_SOT_PÂGE', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NOM_DE_LA_SOT_PÂGE_URL', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NOM_DE_LA_PÂGE_DE_BÂSA', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NOM_DE_LA_PÂGE_DE_BÂSA_URL', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NOM_DE_LA_PÂGE_DE_DISCUSSION', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NOM_DE_LA_PÂGE_DE_DISCUSSION_URL', 'NOMPAGEDISCUSSIONX', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NOM_DE_LA_PÂGE_DU_SUJÈT', 'NOM_DE_LA_PÂGE_DE_L_ARTICLLO', 'NOMPAGESUJET', 'NOMPAGEARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NOM_DE_LA_PÂGE_DU_SUJÈT_URL', 'NOM_DE_LA_PÂGE_DE_L_ARTICLLO_URL', 'NOMPAGESUJETX', 'NOMPAGEARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'MSJ:', 'MSG:' ),
-       'msgnw'                   => array( '0', 'MSJNV:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'figura', 'vignette', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'figura=$1', 'vignette=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'drêta', 'droite', 'right' ),
-       'img_left'                => array( '1', 'gôche', 'gauche', 'left' ),
-       'img_none'                => array( '1', 'vouedo', 'néant', 'neant', 'none' ),
-       'img_center'              => array( '1', 'centrâ', 'centré', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'encâdrâ', 'câdro', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'sen_câdro', 'pas_encâdrâ', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
-       'img_page'                => array( '1', 'pâge=$1', 'pâge $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'drêt', 'drêt=$1', 'drêt $1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'bordura', 'bordure', 'border' ),
-       'img_baseline'            => array( '1', 'legne_de_bâsa', 'ligne_de_base', 'base', 'baseline' ),
-       'img_sub'                 => array( '1', 'segno', 'indice', 'ind', 'sub' ),
-       'img_super'               => array( '1', 'èxposent', 'èxp', 'exposant', 'exp', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'd\'amont', 'haut', 'top' ),
-       'img_text_top'            => array( '1', 'tèxto-d\'amont', 'haut-texte', 'haut-txt', 'text-top' ),
-       'img_middle'              => array( '1', 'entre-mié', 'milieu', 'middle' ),
-       'img_bottom'              => array( '1', 'd\'avâl', 'bas', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'tèxto-d\'avâl', 'bas-texte', 'bas-txt', 'text-bottom' ),
-       'img_link'                => array( '1', 'lim=$1', 'lien=$1', 'link=$1' ),
-       'int'                     => array( '0', 'ENT:', 'INT:' ),
-       'sitename'                => array( '1', 'NOM_DU_SETO', 'NOMSITE', 'SITENAME' ),
-       'ns'                      => array( '0', 'ÈDN:', 'ESPACEN:', 'NS:' ),
-       'nse'                     => array( '0', 'ÈDN_URL:', 'ESPACENX:', 'NSE:' ),
-       'localurl'                => array( '0', 'URL_LOCALA:', 'URLLOCALE:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URL_LOCALA_URL:', 'URLLOCALEX:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'CHEMIN_DE_L_ARTICLLO', 'CHEMINARTICLE', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'SÈRVOR', 'SERVEUR', 'SERVER' ),
-       'servername'              => array( '0', 'NOM_DU_SÈRVOR', 'NOMSERVEUR', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'CHEMIN_DU_SCRIPTE', 'CHEMINSCRIPT', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'CHEMIN_DU_STILO', 'CHEMINSTYLE', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMÈRE:', 'GRAMMAIRE:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GENRO:', 'GENRE:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__SEN_CONVÈRSION_DE_TITRO__', '__SENCDT__', '__SANSCONVERSIONTITRE__', '__SANSCT__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__SEN_CONVÈRSION_DE_CONTEGNU__', '__SENCDC__', '__SANSCONVERSIONCONTENU__', '__SANSCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'SEMANA_D_ORA', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'JDS_D_ORA', 'JDSACTUEL', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'SEMANA_LOCALA', 'SEMAINELOCALE', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'JDS_LOCAL', 'JDSLOCAL', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'NUMERÔ_DE_LA_VÈRSION', 'IDVERSION', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'JORN_DE_LA_VÈRSION', 'JOURVERSION', 'JOUR1VERSION', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'JORN_DE_LA_VÈRSION_2', 'JOUR2VERSION', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MÊS_DE_LA_VÈRSION', 'MOISVERSION', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'MÊS_DE_LA_VÈRSION_1', 'MOISVERSION1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'AN_DE_LA_VÈRSION', 'ANNEEVERSION', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'DÂTA_ET_HORA_DE_LA_VÈRSION', 'INSTANTVERSION', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'USANCIÉR_DE_LA_VÈRSION', 'UTILISATEURVERSION', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'PLURÂL:', 'PLURIEL:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'URL_COMPLÈTA:', 'URLCOMPLETE:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URL_COMPLÈTA_URL:', 'URLCOMPLETEX:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'PREMIÉRE_PETIÔTA_LÈTRA:', 'INITMINUS:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'PREMIÉRE_GRANTA_LÈTRA:', 'INITMAJUS:', 'INITCAPIT:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'PETIÔTA_LÈTRA:', 'MINUS:', 'LC:' ),
-       'uc'                      => array( '0', 'GRANTA_LÈTRA:', 'MAJUS:', 'CAPIT:', 'UC:' ),
-       'raw'                     => array( '0', 'BRUTO:', 'BRUT:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'FÂRE_VÊRE_LO_TITRO', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'B', 'BRUT', 'R' ),
-       'newsectionlink'          => array( '1', '__LIM_DE_NOVÈLA_SÈCCION__', '__LIENNOUVELLESECTION__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__NION_LIM_DE_NOVÈLA_SÈCCION__', '__AUCUNLIENNOUVELLESECTION__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'VÈRSION_D_ORA', 'VERSIONACTUELLE', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'URL_ENCODÂ:', 'ENCODEURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ANCRO_ENCODÂ', 'ENCODEANCRE', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'DÂTA_ET_HORA_D_ORA', 'INSTANTACTUEL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'DÂTA_ET_HORA_LOCALA', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'MÂRCA_DE_DIRÈCCION', 'MARQUEDIRECTION', 'MARQUEDIR', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#LENGOUA:', '#LANGUE:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'LENGOUA_DU_CONTEGNU', 'LANGUECONTENU', 'LANGCONTENU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PÂGES_DENS_L_ÈSPÂÇO_DE_NOMS:', 'PÂGES_DENS_L_ÈDN:', 'PAGESDANSESPACE:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'NOMBRO_D_ADMINS', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMAT_NOMBRO', 'FORMATNOMBRE', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'BORRÂJO_A_GÔCHE', 'BOURRAGEGAUCHE', 'BOURREGAUCHE', 'PADLEFT' ),
-       'padright'                => array( '0', 'BORRÂJO_A_DRÊTA', 'BOURRAGEDROITE', 'BOURREDROITE', 'PADRIGHT' ),
-       'special'                 => array( '0', 'spèciâl', 'spécial', 'special' ),
-       'defaultsort'             => array( '1', 'CLLÂF_DE_TRI:', 'CLEFDETRI:', 'CLEDETRI:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'CHEMIN_D_ACCÈS:', 'CHEMIN:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'balisa', 'balise', 'tag' ),
-       'hiddencat'               => array( '1', '__CATÈGORIE_CACHIÊ__', '__CATCACHEE__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PÂGES_DENS_LA_CATÈGORIE', 'PAGESDANSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'TALYE_DE_LA_PÂGE', 'TAILLEPAGE', 'PAGESIZE' ),
-       'index'                   => array( '1', '__ENDÈXE__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__NION_ENDÈXE__', '__AUCUNINDEX__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'NOMBRO_D_USANCIÉRS_DENS_LA_TROPA', 'NOMBREDANSGROUPE', 'NBDANSGROUPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__REDIRÈCCION_IMOBILA__', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'NIVÉL_DE_PROTÈCCION', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'format_de_dâta', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'CHEMIN', 'PATH' ),
-       'url_wiki'                => array( '0', 'VOUIQUI', 'WIKI' ),
+       'redirect'                  => array( '0', '#REDIRÈCCION', '#REDIRECTION', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__NION_SOMÈRO__', '__NIONA_TRÂBLA__', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__NIONA_GALERIE__', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORCIÉR_LO_SOMÈRO__', '__FORCIÉR_LA_TRÂBLA__', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__SOMÈRO__', '__TRÂBLA__', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__SÈCCION_QUE_PÔT_PAS_ÉTRE_CHANGIÊ__', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__NION_EN_TÉTA__', '__AUCUNENTETE__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'MÊS_D_ORA', 'MÊS_D_ORA_2', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'MÊS_D_ORA_1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NOM_DU_MÊS_D_ORA', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'GÈNITIF_DU_NOM_DU_MÊS_D_ORA', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ABRÈV_DU_MÊS_D_ORA', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'JORN_D_ORA', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'JORN_D_ORA_2', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NOM_DU_JORN_D_ORA', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'AN_D_ORA', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'HORÈRO_D_ORA', 'HORAIREACTUEL', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'HORA_D_ORA', 'HEUREACTUELLE', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MÊS_LOCAL', 'MÊS_LOCAL_2', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'MÊS_LOCAL_1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'NOM_DU_MÊS_LOCAL', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'GÈNITIF_DU_NOM_DU_MÊS_LOCAL', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ABRÈV_DU_MÊS_LOCAL', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'JORN_LOCAL', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'JORN_LOCAL_2', 'JOUR2LOCAL', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NOM_DU_JORN_LOCAL', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'AN_LOCAL', 'ANNEELOCALE', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'HORÈRO_LOCAL', 'HORAIRELOCAL', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'HORA_LOCALA', 'HEURELOCALE', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NOMBRO_DE_PÂGES', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NOMBRO_D_ARTICLLOS', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NOMBRO_DE_FICHIÉRS', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NOMBRO_D_USANCIÉRS', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NOMBRO_D_USANCIÉRS_ACTIFS', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NOMBRO_DE_CHANGEMENTS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NOMBRO_DE_VUES', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'NOM_DE_LA_PÂGE', 'NOMPAGE', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NOM_DE_LA_PÂGE_URL', 'NOMPAGEX', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ÈSPÂÇO_DE_NOMS', 'ESPACENOMMAGE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ÈSPÂÇO_DE_NOMS_URL', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ÈSPÂÇO_DE_DISCUSSION', 'ESPACEDISCUSSION', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ÈSPÂÇO_DE_DISCUSSION_URL', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ÈSPÂÇO_DU_SUJÈT', 'ÈSPÂÇO_DE_L_ARTICLLO', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ÈSPÂÇO_DU_SUJÈT_URL', 'ÈSPÂÇO_DE_L_ARTICLLO_URL', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NOM_COMPLÈT_DE_LA_PÂGE', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NOM_COMPLÈT_DE_LA_PÂGE_URL', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NOM_DE_LA_SOT_PÂGE', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NOM_DE_LA_SOT_PÂGE_URL', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NOM_DE_LA_PÂGE_DE_BÂSA', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NOM_DE_LA_PÂGE_DE_BÂSA_URL', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NOM_DE_LA_PÂGE_DE_DISCUSSION', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NOM_DE_LA_PÂGE_DE_DISCUSSION_URL', 'NOMPAGEDISCUSSIONX', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NOM_DE_LA_PÂGE_DU_SUJÈT', 'NOM_DE_LA_PÂGE_DE_L_ARTICLLO', 'NOMPAGESUJET', 'NOMPAGEARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NOM_DE_LA_PÂGE_DU_SUJÈT_URL', 'NOM_DE_LA_PÂGE_DE_L_ARTICLLO_URL', 'NOMPAGESUJETX', 'NOMPAGEARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'MSJ:', 'MSG:' ),
+       'msgnw'                     => array( '0', 'MSJNV:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'figura', 'vignette', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'figura=$1', 'vignette=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'drêta', 'droite', 'right' ),
+       'img_left'                  => array( '1', 'gôche', 'gauche', 'left' ),
+       'img_none'                  => array( '1', 'vouedo', 'néant', 'neant', 'none' ),
+       'img_center'                => array( '1', 'centrâ', 'centré', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'encâdrâ', 'câdro', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'sen_câdro', 'pas_encâdrâ', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
+       'img_page'                  => array( '1', 'pâge=$1', 'pâge $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'drêt', 'drêt=$1', 'drêt $1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'bordura', 'bordure', 'border' ),
+       'img_baseline'              => array( '1', 'legne_de_bâsa', 'ligne_de_base', 'base', 'baseline' ),
+       'img_sub'                   => array( '1', 'segno', 'indice', 'ind', 'sub' ),
+       'img_super'                 => array( '1', 'èxposent', 'èxp', 'exposant', 'exp', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'd\'amont', 'haut', 'top' ),
+       'img_text_top'              => array( '1', 'tèxto-d\'amont', 'haut-texte', 'haut-txt', 'text-top' ),
+       'img_middle'                => array( '1', 'entre-mié', 'milieu', 'middle' ),
+       'img_bottom'                => array( '1', 'd\'avâl', 'bas', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'tèxto-d\'avâl', 'bas-texte', 'bas-txt', 'text-bottom' ),
+       'img_link'                  => array( '1', 'lim=$1', 'lien=$1', 'link=$1' ),
+       'int'                       => array( '0', 'ENT:', 'INT:' ),
+       'sitename'                  => array( '1', 'NOM_DU_SETO', 'NOMSITE', 'SITENAME' ),
+       'ns'                        => array( '0', 'ÈDN:', 'ESPACEN:', 'NS:' ),
+       'nse'                       => array( '0', 'ÈDN_URL:', 'ESPACENX:', 'NSE:' ),
+       'localurl'                  => array( '0', 'URL_LOCALA:', 'URLLOCALE:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URL_LOCALA_URL:', 'URLLOCALEX:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'CHEMIN_DE_L_ARTICLLO', 'CHEMINARTICLE', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'SÈRVOR', 'SERVEUR', 'SERVER' ),
+       'servername'                => array( '0', 'NOM_DU_SÈRVOR', 'NOMSERVEUR', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'CHEMIN_DU_SCRIPTE', 'CHEMINSCRIPT', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'CHEMIN_DU_STILO', 'CHEMINSTYLE', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMÈRE:', 'GRAMMAIRE:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GENRO:', 'GENRE:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__SEN_CONVÈRSION_DE_TITRO__', '__SENCDT__', '__SANSCONVERSIONTITRE__', '__SANSCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__SEN_CONVÈRSION_DE_CONTEGNU__', '__SENCDC__', '__SANSCONVERSIONCONTENU__', '__SANSCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'SEMANA_D_ORA', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'JDS_D_ORA', 'JDSACTUEL', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'SEMANA_LOCALA', 'SEMAINELOCALE', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'JDS_LOCAL', 'JDSLOCAL', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'NUMERÔ_DE_LA_VÈRSION', 'IDVERSION', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'JORN_DE_LA_VÈRSION', 'JOURVERSION', 'JOUR1VERSION', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'JORN_DE_LA_VÈRSION_2', 'JOUR2VERSION', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MÊS_DE_LA_VÈRSION', 'MOISVERSION', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'MÊS_DE_LA_VÈRSION_1', 'MOISVERSION1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'AN_DE_LA_VÈRSION', 'ANNEEVERSION', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'DÂTA_ET_HORA_DE_LA_VÈRSION', 'INSTANTVERSION', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'USANCIÉR_DE_LA_VÈRSION', 'UTILISATEURVERSION', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'PLURÂL:', 'PLURIEL:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'URL_COMPLÈTA:', 'URLCOMPLETE:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URL_COMPLÈTA_URL:', 'URLCOMPLETEX:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'PREMIÉRE_PETIÔTA_LÈTRA:', 'INITMINUS:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'PREMIÉRE_GRANTA_LÈTRA:', 'INITMAJUS:', 'INITCAPIT:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'PETIÔTA_LÈTRA:', 'MINUS:', 'LC:' ),
+       'uc'                        => array( '0', 'GRANTA_LÈTRA:', 'MAJUS:', 'CAPIT:', 'UC:' ),
+       'raw'                       => array( '0', 'BRUTO:', 'BRUT:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'FÂRE_VÊRE_LO_TITRO', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'B', 'BRUT', 'R' ),
+       'newsectionlink'            => array( '1', '__LIM_DE_NOVÈLA_SÈCCION__', '__LIENNOUVELLESECTION__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__NION_LIM_DE_NOVÈLA_SÈCCION__', '__AUCUNLIENNOUVELLESECTION__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VÈRSION_D_ORA', 'VERSIONACTUELLE', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'URL_ENCODÂ:', 'ENCODEURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ANCRO_ENCODÂ', 'ENCODEANCRE', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'DÂTA_ET_HORA_D_ORA', 'INSTANTACTUEL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'DÂTA_ET_HORA_LOCALA', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'MÂRCA_DE_DIRÈCCION', 'MARQUEDIRECTION', 'MARQUEDIR', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#LENGOUA:', '#LANGUE:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'LENGOUA_DU_CONTEGNU', 'LANGUECONTENU', 'LANGCONTENU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PÂGES_DENS_L_ÈSPÂÇO_DE_NOMS:', 'PÂGES_DENS_L_ÈDN:', 'PAGESDANSESPACE:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NOMBRO_D_ADMINS', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMAT_NOMBRO', 'FORMATNOMBRE', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'BORRÂJO_A_GÔCHE', 'BOURRAGEGAUCHE', 'BOURREGAUCHE', 'PADLEFT' ),
+       'padright'                  => array( '0', 'BORRÂJO_A_DRÊTA', 'BOURRAGEDROITE', 'BOURREDROITE', 'PADRIGHT' ),
+       'special'                   => array( '0', 'spèciâl', 'spécial', 'special' ),
+       'defaultsort'               => array( '1', 'CLLÂF_DE_TRI:', 'CLEFDETRI:', 'CLEDETRI:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'CHEMIN_D_ACCÈS:', 'CHEMIN:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'balisa', 'balise', 'tag' ),
+       'hiddencat'                 => array( '1', '__CATÈGORIE_CACHIÊ__', '__CATCACHEE__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PÂGES_DENS_LA_CATÈGORIE', 'PAGESDANSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'TALYE_DE_LA_PÂGE', 'TAILLEPAGE', 'PAGESIZE' ),
+       'index'                     => array( '1', '__ENDÈXE__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NION_ENDÈXE__', '__AUCUNINDEX__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'NOMBRO_D_USANCIÉRS_DENS_LA_TROPA', 'NOMBREDANSGROUPE', 'NBDANSGROUPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__REDIRÈCCION_IMOBILA__', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVÉL_DE_PROTÈCCION', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'format_de_dâta', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'CHEMIN', 'PATH' ),
+       'url_wiki'                  => array( '0', 'VOUIQUI', 'WIKI' ),
 );
 
 $linkTrail = '/^([a-zàâçéèêîœôû·’æäåāăëēïīòöōùü‘]+)(.*)$/sDu';
@@ -311,62 +311,61 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Solegnér los lims :',
-'tog-justify' => 'Èxplicar los paragrafos',
-'tog-hideminor' => 'Cachiér los petiôts changements des dèrriérs changements',
-'tog-hidepatrolled' => 'Cachiér los changements survelyês des dèrriérs changements',
-'tog-newpageshidepatrolled' => 'Cachiér les pâges survelyês de la lista de les pâges novèles',
+'tog-justify' => 'Justifiar los paragrafos',
+'tog-hideminor' => 'Cachiér los petiôts changements dedens los dèrriérs changements',
+'tog-hidepatrolled' => 'Cachiér los changements survelyês dedens los dèrriérs changements',
+'tog-newpageshidepatrolled' => 'Cachiér les pâges survelyêyes entre-mié la lista de les pâges novèles',
 'tog-extendwatchlist' => 'Ètendre la lista de survelyence por fâre vêre tôs los changements et pas solament los ples novéls',
-'tog-usenewrc' => 'Utilisar los dèrriérs changements mèlyorâs (at fôta de JavaScript)',
-'tog-numberheadings' => 'Numerotar ôtomaticament los titros de sèccions',
-'tog-showtoolbar' => 'Montrar la bârra d’outils d’èdicion (at fôta de JavaScript)',
-'tog-editondblclick' => 'Doblo-clicar pèrmèt de changiér una pâge (at fôta de JavaScript)',
-'tog-editsection' => 'Activar los lims « [changiér] » por changiér una sèccion',
-'tog-editsectiononrightclick' => 'Fâre un clic drêt sur un titro de sèccion pèrmèt de changiér ceta (at fôta de JavaScript)',
+'tog-usenewrc' => 'Rassemblar los changements per pâge dedens los dèrriérs changements et la lista de survelyence (at fôta de JavaScript)',
+'tog-numberheadings' => 'Numerotar ôtomaticament los titros de sèccion',
+'tog-showtoolbar' => 'Fâre vêre la bârra d’outils de changement (at fôta de JavaScript)',
+'tog-editondblclick' => 'Changiér des pâges sur doblo-clic (at fôta de JavaScript)',
+'tog-editsection' => 'Activar lo changement de sèccions avouéc los lims « [changiér] »',
+'tog-editsectiononrightclick' => 'Activar lo changement de sèccions per clic drêt sur lors titros (at fôta de JavaScript)',
 'tog-showtoc' => 'Fâre vêre la trâbla de les matiéres (por les pâges qu’ont més de 3 sèccions)',
-'tog-rememberpassword' => 'Sè rapelar de mon branchement sur ceti navigator (por $1 jorn{{PLURAL:$1||s}} u més)',
-'tog-watchcreations' => 'Apondre les pâges que fé a ma lista de survelyence',
-'tog-watchdefault' => 'Apondre les pâges que chanjo a ma lista de survelyence',
-'tog-watchmoves' => 'Apondre les pâges que renomo a ma lista de survelyence',
-'tog-watchdeletion' => 'Apondre les pâges que suprimo a ma lista de survelyence',
-'tog-minordefault' => 'Marcar per dèfôt mos changements coment petiôts',
-'tog-previewontop' => 'Montrar la prèvisualisacion en-dessus de la bouèta d’èdicion',
-'tog-previewonfirst' => 'Montrar la prèvisualisacion pendent la premiére èdicion',
-'tog-nocache' => 'Dèsactivar lo cache de les pâges per lo navigator',
-'tog-enotifwatchlistpages' => 'M’avèrtir per mèssageria èlèctronica quand una pâge de ma lista de survelyence est changiê',
-'tog-enotifusertalkpages' => 'M’avèrtir per mèssageria èlèctronica quand ma pâge de discussion est changiê',
-'tog-enotifminoredits' => 'M’avèrtir per mèssageria èlèctronica mémo en câs de petiôts changements',
-'tog-enotifrevealaddr' => 'Fâre vêre mon adrèce èlèctronica dens los mèssâjos d’avèrtissement',
-'tog-shownumberswatching' => 'Fâre vêre lo nombro d’usanciérs que siuvont les pâges',
+'tog-rememberpassword' => 'Sè rapelar de mon contresegno sur ceti navigator (por lo més $1 jorn{{PLURAL:$1||s}})',
+'tog-watchcreations' => 'Apondre les pâges que fé et pués los fichiérs que tèlècharjo a ma lista de survelyence',
+'tog-watchdefault' => 'Apondre les pâges et los fichiérs que chanjo a ma lista de survelyence',
+'tog-watchmoves' => 'Apondre les pâges et los fichiérs que renomo a ma lista de survelyence',
+'tog-watchdeletion' => 'Apondre les pâges et los fichiérs que suprimo a ma lista de survelyence',
+'tog-minordefault' => 'Marcar per dèfôt tôs los changements coment petiôts',
+'tog-previewontop' => 'Fâre vêre la prèvisualisacion d’amont la zona de changement',
+'tog-previewonfirst' => 'Fâre vêre la prèvisualisacion pendent lo premiér changement',
+'tog-nocache' => 'Dèsactivar lo cacho de les pâges per lo navigator',
+'tog-enotifwatchlistpages' => 'Mè mandar un mèssâjo quand na pâge ou ben un fichiér de ma lista de survelyence est changiê(ye)',
+'tog-enotifusertalkpages' => 'Mè mandar un mèssâjo quand ma pâge de discussion est changiêye',
+'tog-enotifminoredits' => 'Mè mandar un mèssâjo mémo en câs de petiôts changements de les pâges et des fichiérs',
+'tog-enotifrevealaddr' => 'Fâre vêre mon adrèce èlèctronica dens los mèssâjos de notificacion',
+'tog-shownumberswatching' => 'Fâre vêre 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' => 'Utilisar per dèfôt un èditor de tèxto de defôr (solament por los usanciérs 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' => 'Utilisar per dèfôt un comparator de defôr (solament por los usanciérs 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 « navigacion » et « rechèrche » d’amont la pâge',
-'tog-uselivepreview' => 'Utilisar l’apèrçu vito fêt (at fôta de JavaScript) (èxpèrimentâl)',
-'tog-forceeditsummary' => 'M’avèrtir quand j’é pas spècefiâ de rèsumâ de changement',
-'tog-watchlisthideown' => 'Cachiér mos prôpros changements dens la lista de survelyence',
-'tog-watchlisthidebots' => 'Cachiér los changements fêts per des bots dens la lista de survelyence',
-'tog-watchlisthideminor' => 'Cachiér los petiôts changements dens la lista de survelyence',
-'tog-watchlisthideliu' => 'Cachiér los changements fêts per des usanciérs branchiês dens la lista de survelyence',
-'tog-watchlisthideanons' => 'Cachiér los changements fêts per des usanciérs pas encartâs dens la lista de survelyence',
-'tog-watchlisthidepatrolled' => 'Cachiér los changements survelyês dens la lista de survelyence',
-'tog-nolangconversion' => 'Dèsactivar la convèrsion de les variantes de lengoua',
-'tog-ccmeonemails' => 'Mè mandar una copia des mèssâjos que mando ux ôtros usanciérs',
-'tog-diffonly' => 'Pas montrar lo contegnu de les pâges desot los difs',
-'tog-showhiddencats' => 'Fâre vêre les catègories cachiês',
-'tog-noconvertlink' => 'Dèsactivar la convèrsion des titros',
-'tog-norollbackdiff' => 'Pas montrar lo dif pendent una rèvocacion',
-
-'underline-always' => 'tojorn',
-'underline-never' => 'jamés',
-'underline-default' => 'd’aprés lo navigator',
+'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’avèrtir quand j’é pas spècifiâ de rèsumâ de changement',
+'tog-watchlisthideown' => 'Cachiér mos prôpros changements dedens la lista de survelyence',
+'tog-watchlisthidebots' => 'Cachiér los changements fêts per des robots dedens la lista de survelyence',
+'tog-watchlisthideminor' => 'Cachiér los petiôts changements dedens la lista de survelyence',
+'tog-watchlisthideliu' => 'Cachiér los changements fêts per des utilisators branchiês dedens la lista de survelyence',
+'tog-watchlisthideanons' => 'Cachiér los changements fêts per des utilisators anonimos dedens la lista de survelyence',
+'tog-watchlisthidepatrolled' => 'Cachiér los changements survelyês dedens la lista de survelyence',
+'tog-ccmeonemails' => 'Mè mandar na copia des mèssâjos que mando ux ôtros utilisators',
+'tog-diffonly' => 'Pas fâre vêre lo contegnu de les pâges desot los difs',
+'tog-showhiddencats' => 'Fâre vêre les catègories cachiêyes',
+'tog-noconvertlink' => 'Dèsactivar la convèrsion des titros des lims',
+'tog-norollbackdiff' => 'Pas fâre vêre lo dif pendent na rèvocacion',
+
+'underline-always' => 'Tojorn',
+'underline-never' => 'Jamés',
+'underline-default' => 'Valor du navigator per dèfôt',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Stilo de la police de la bouèta d’èdicion :',
-'editfont-default' => 'Celi du navigator per dèfôt',
-'editfont-monospace' => 'Police monoèspâciê',
+'editfont-style' => 'Stilo de police de la zona de changement :',
+'editfont-default' => 'Police du navigator per dèfôt',
+'editfont-monospace' => 'Police de chace fixa',
 'editfont-sansserif' => 'Police sen empiotament',
-'editfont-serif' => 'Police avouéc empiotaments',
+'editfont-serif' => 'Police avouéc empiotament',
 
 # Dates
 'sunday' => 'demenge',
@@ -422,44 +421,44 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => 'Catègorie{{PLURAL:$1||s}}',
-'category_header' => 'Pâges dens la catègorie « $1 »',
+'category_header' => 'Pâges dedens la catègorie « $1 »',
 'subcategories' => 'Sot-catègories',
-'category-media-header' => 'Fichiérs mèdia dens la catègorie « $1 »',
-'category-empty' => "''Ora, ceta catègorie contint gins de pâge ou ben de fichiér mèdia.''",
-'hidden-categories' => '{{PLURAL:$1|Catègorie cachiê|Catègories cachiês}}',
-'hidden-category-category' => 'Catègories cachiês',
-'category-subcat-count' => 'Ceta catègorie at {{PLURAL:$2|ren que la sot-catègorie|$2 sot-catègories, que {{PLURAL:$1|cela|les $1}}}} ce-desot.',
-'category-subcat-count-limited' => 'Ceta catègorie at {{PLURAL:$1|la sot-catègorie|les $1 sot-catègories}} ce-desot.',
-'category-article-count' => 'Ceta catègorie contint {{PLURAL:$2|ren que la pâge|$2 pâges, que {{PLURAL:$1|cela|les $1}}}} ce-desot.',
-'category-article-count-limited' => '{{PLURAL:$1|Ceta pâge figure|Cetes $1 pâges figuront}} dens la presenta catègorie.',
-'category-file-count' => 'Ceta catègorie contint {{PLURAL:$2|ren que lo fichiér|$2 fichiérs, que {{PLURAL:$1|celi|los $1}}}} ce-desot.',
-'category-file-count-limited' => '{{PLURAL:$1|Ceti fichiér figure|Cetos $1 fichiérs figuront}} dens la presenta catègorie.',
+'category-media-header' => 'Fichiérs mèdia dedens la catègorie « $1 »',
+'category-empty' => "''Ora cela catègorie contint gins de pâge ou de fichiér mèdia.''",
+'hidden-categories' => '{{PLURAL:$1|Catègorie cachiêye|Catègories cachiêyes}}',
+'hidden-category-category' => 'Catègories cachiêyes',
+'category-subcat-count' => 'Cela catègorie-que at {{PLURAL:$2|solament ceta sot-catègorie.|{{PLURAL:$1|ceta sot-catègorie|cetes $1 sot-catègories}}, sur na soma de $2.}}',
+'category-subcat-count-limited' => 'Cela catègorie-que at {{PLURAL:$1|ceta sot-catègorie|cetes $1 sot-catègories}}.',
+'category-article-count' => '{{PLURAL:$2|Cela catègorie-que contint solament ceta pâge.|{{PLURAL:$1|Ceta pâge figure|Cetes $1 pâges figuront}} dedens cela catègorie-que, sur na soma de $2.}}',
+'category-article-count-limited' => '{{PLURAL:$1|Ceta pâge figure|Cetes $1 pâges figuront}} dedens la presenta catègorie.',
+'category-file-count' => '{{PLURAL:$2|Cela catègorie-que contint solament ceti fichiér.|{{PLURAL:$1|Ceti fichiér figure|Cetos $1 fichiérs figuront}} dedens cela catègorie-que, sur na soma de $2.}}',
+'category-file-count-limited' => '{{PLURAL:$1|Ceti fichiér figure|Cetos $1 fichiérs figuront}} dedens la presenta catègorie.',
 'listingcontinuesabbrev' => '(suita)',
-'index-category' => 'Pâges endèxâs',
-'noindex-category' => 'Pâges pas endèxâs',
+'index-category' => 'Pâges endèxâyes',
+'noindex-category' => 'Pâges pas endèxâyes',
 'broken-file-category' => 'Pâges avouéc des lims de fichiérs câssos',
 
 'about' => 'A propôs',
 'article' => 'Pâge de contegnu',
-'newwindow' => '(ôvre una fenétra novèla)',
+'newwindow' => '(ôvre na fenétra novèla)',
 'cancel' => 'Anular',
-'moredotdotdot' => 'Et ples...',
+'moredotdotdot' => 's...',
 'mypage' => 'Ma pâge',
-'mytalk' => 'Pâge de discussion',
-'anontalk' => 'Discussion avouéc cetadrèce IP',
+'mytalk' => 'Ma pâge de discussion',
+'anontalk' => 'Discussion avouéc cetadrèce IP',
 'navigation' => 'Navigacion',
 'and' => '&#32;et',
 
 # Cologne Blue skin
-'qbfind' => 'Rechèrchiér',
-'qbbrowse' => 'Dèfelar',
+'qbfind' => 'Trovar',
+'qbbrowse' => 'Fâre dèfelar',
 'qbedit' => 'Changiér',
-'qbpageoptions' => 'Pâge de chouèx',
-'qbpageinfo' => 'Pâge d’enformacion',
-'qbmyoptions' => 'Mos chouèx',
+'qbpageoptions' => 'Ceta pâge',
+'qbpageinfo' => 'Contèxto',
+'qbmyoptions' => 'Mes pâges',
 'qbspecialpages' => 'Pâges spèciâles',
-'faq' => 'FDQ',
-'faqpage' => 'Project:FDQ',
+'faq' => 'Quèstions sovent posâyes',
+'faqpage' => 'Project:Quèstions sovent posâyes',
 
 # Vector skin
 'vector-action-addsection' => 'Apondre un sujèt',
@@ -468,47 +467,47 @@ $messages = array(
 'vector-action-protect' => 'Protègiér',
 'vector-action-undelete' => 'Refâre',
 'vector-action-unprotect' => 'Changiér la protèccion',
-'vector-simplesearch-preference' => 'Activar los consèlys de rechèrche mèlyorâs (solament por « Vèctor »)',
+'vector-simplesearch-preference' => 'Activar les idês de rechèrche bônâyes (solament por « Vèctor »)',
 'vector-view-create' => 'Fâre',
 'vector-view-edit' => 'Changiér',
 'vector-view-history' => 'Fâre vêre l’historico',
 'vector-view-view' => 'Liére',
-'vector-view-viewsource' => 'Vêre lo tèxto sôrsa',
+'vector-view-viewsource' => 'Fâre vêre lo tèxto sôrsa',
 'actions' => 'Accions',
 'namespaces' => 'Èspâços de noms',
 'variants' => 'Variantes',
 
-'errorpagetitle' => 'Èrror',
+'errorpagetitle' => 'Fôta',
 'returnto' => 'Tornar a la pâge $1.',
-'tagline' => 'De {{SITENAME}}.',
+'tagline' => 'De {{SITENAME}}',
 'help' => 'Éde',
 'search' => 'Rechèrche',
-'searchbutton' => 'Chèrchiér',
+'searchbutton' => 'Rechèrchiér',
 'go' => 'Alar trovar',
 'searcharticle' => 'Liére',
 'history' => 'Historico de la pâge',
 'history_short' => 'Historico',
-'updatedmarker' => 'betâ a jorn dês ma dèrriére visita',
+'updatedmarker' => 'betâye a jorn dês la mina dèrriére visita',
 'printableversion' => 'Vèrsion emprimâbla',
-'permalink' => 'Lim historico',
+'permalink' => 'Lim fixo',
 'print' => 'Emprimar',
 'view' => 'Liére',
 'edit' => 'Changiér',
 'create' => 'Fâre',
 'editthispage' => 'Changiér ceta pâge',
-'create-this-page' => 'Fâre ceta pâge',
+'create-this-page' => 'Fâre cela pâge',
 'delete' => 'Suprimar',
 'deletethispage' => 'Suprimar ceta pâge',
 'undelete_short' => 'Refâre {{PLURAL:$1|yon changement|$1 changements}}',
-'viewdeleted_short' => 'Vêre {{PLURAL:$1|yon changement suprimâ|$1 changements suprimâs}}',
+'viewdeleted_short' => 'Fâre vêre {{PLURAL:$1|yon changement suprimâ|$1 changements suprimâs}}',
 'protect' => 'Protègiér',
 'protect_change' => 'changiér',
 'protectthispage' => 'Protègiér ceta pâge',
 'unprotect' => 'Changiér la protèccion',
 'unprotectthispage' => 'Changiér la protèccion de ceta pâge',
 'newpage' => 'Pâge novèla',
-'talkpage' => 'Pâge de discussion',
-'talkpagelinktext' => 'Discutar',
+'talkpage' => 'Discussion sur ceta pâge',
+'talkpagelinktext' => 'discutar',
 'specialpage' => 'Pâge spèciâla',
 'personaltools' => 'Outils a sè',
 'postcomment' => 'Novèla sèccion',
@@ -516,97 +515,101 @@ $messages = array(
 'talk' => 'Discussion',
 'views' => 'Visualisacions',
 'toolbox' => 'Bouèta d’outils',
-'userpage' => 'Pâge usanciér',
-'projectpage' => 'Pâge du projèt',
+'userpage' => 'Vêde la pâge utilisator',
+'projectpage' => 'Vêde la pâge du projèt',
 'imagepage' => 'Vêde la pâge du fichiér',
 'mediawikipage' => 'Vêde la pâge du mèssâjo',
 'templatepage' => 'Vêde la pâge du modèlo',
 'viewhelppage' => 'Vêde la pâge d’éde',
 'categorypage' => 'Vêde la pâge de catègorie',
-'viewtalkpage' => 'Pâge de discussion',
+'viewtalkpage' => 'Vêde la pâge de discussion',
 'otherlanguages' => 'Ôtres lengoues',
-'redirectedfrom' => '(Redirigiê dês $1)',
+'redirectedfrom' => '(Redirigiêye dês $1)',
 'redirectpagesub' => 'Pâge de redirèccion',
-'lastmodifiedat' => 'Dèrriér changement de ceta pâge lo $1 a $2.<br />',
-'viewcount' => 'Ceta pâge at étâ vua {{PLURAL:$1|yon côp|$1 côps}}.',
-'protectedpage' => 'Pâge protègiê',
+'lastmodifiedat' => 'Dèrriér changement de ceta pâge lo $1 a $2.',
+'viewcount' => 'Ceta pâge est étâye vua {{PLURAL:$1|yon côp|$1 côps}}.',
+'protectedpage' => 'Pâge protègiêye',
 'jumpto' => 'Alar a :',
-'jumptonavigation' => 'Navigacion',
-'jumptosearch' => 'Rechèrche',
-'view-pool-error' => 'Dèsolâ, los sèrvors sont surchargiês por lo moment.
-Trop d’usanciérs chèrchont a arrevar a ceta pâge.
-Volyéd atendre un moment devant que vos tâchiéd de tornar arrevar a ceta pâge.
+'jumptonavigation' => 'navigacion',
+'jumptosearch' => 'rechèrche',
+'view-pool-error' => 'Dèconsolâ, los sèrviors sont lapidâs d’ôvra cetos temps.
+Trop d’utilisators tâchont de vêre ceta pâge.
+Volyéd atendre un moment devant que tornar tâchiér d’arrevar a ceta pâge.
 
 $1',
-'pool-timeout' => 'Dèpassement du dèlê pendent l’atenta du vèrrolyâjo',
-'pool-queuefull' => 'La fela d’ôvra est plêna',
-'pool-errorunknown' => 'Èrror encognua',
+'pool-timeout' => 'Dèlê dèpassâ pendent l’atenta du vèrroly',
+'pool-queuefull' => 'La renche d’ôvra est plêna',
+'pool-errorunknown' => 'Fôta encognua',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'A propôs de {{SITENAME}}',
+'aboutsite' => 'Sur {{SITENAME}}',
 'aboutpage' => 'Project:A propôs',
-'copyright' => 'Lo contegnu est disponiblo desot $1.',
-'copyrightpage' => '{{ns:project}}:Drêt d’ôtor',
+'copyright' => 'Lo contegnu est disponiblo desot licence $1.',
+'copyrightpage' => '{{ns:project}}:Drêts d’ôtor',
 'currentevents' => 'Novèles',
 'currentevents-url' => 'Project:Novèles',
 'disclaimers' => 'Avèrtissements',
 'disclaimerpage' => 'Project:Avèrtissements g·ènèrals',
 'edithelp' => 'Éde',
-'edithelppage' => 'Help:Coment changiér una pâge',
+'edithelppage' => 'Help:Coment changiér na pâge',
 'helppage' => 'Help:Somèro',
 'mainpage' => 'Reçua',
 'mainpage-description' => 'Reçua',
 'policy-url' => 'Project:Règlles de dedens',
 'portal' => 'Comunôtât',
-'portal-url' => 'Project:Reçua',
+'portal-url' => 'Project:Reçua de la comunôtât',
 'privacy' => 'Politica de confidencialitât',
 'privacypage' => 'Project:Politica de confidencialitât',
 
-'badaccess' => 'Èrror de pèrmission',
-'badaccess-group0' => 'Vos avéd pas los drêts sufisents por rèalisar l’accion que vos demandâd.',
-'badaccess-groups' => 'L’accion que vos tâchiéd de rèalisar est accèssibla ren qu’ux usanciérs a {{PLURAL:$2|la tropa|les tropes}} : $1.',
+'badaccess' => 'Fôta de pèrmission',
+'badaccess-group0' => 'Vos avéd pas los drêts sufisents por rèalisar l’accion demandâye.',
+'badaccess-groups' => 'L’accion que vos tâchiéd de rèalisar est accèssibla ren qu’ux utilisators de {{PLURAL:$2|la tropa|les tropes}} : $1.',
 
 'versionrequired' => 'Vèrsion $1 de MediaWiki nècèssèra',
-'versionrequiredtext' => 'La vèrsion $1 de MediaWiki est nècèssèra por utilisar ceta pâge.
+'versionrequiredtext' => 'La vèrsion $1 de MediaWiki est nècèssèra por empleyér ceta pâge.
 Vêde la [[Special:Version|pâge de les vèrsions]].',
 
 'ok' => 'D’acôrd',
-'retrievedfrom' => 'Rècupèrâ de « $1 »',
+'retrievedfrom' => 'Rècupèrâye de « $1 »',
 'youhavenewmessages' => 'Vos avéd de $1 ($2).',
 'newmessageslink' => 'mèssâjos novéls',
 'newmessagesdifflink' => 'dèrriér changement',
-'youhavenewmessagesmulti' => 'Vos avéd de mèssâjos novéls dessus $1.',
+'youhavenewmessagesfromusers' => 'Vos avéd $1 {{PLURAL:$3|d’un ôtro utilisator|de $3 ôtros utilisators}} ($2).',
+'youhavenewmessagesmanyusers' => 'Vos avéd $1 d’un mouél d’utilisators ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|un mèssâjo novél|de mèssâjos novéls}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|dèrriér changement|dèrriérs changements}}',
+'youhavenewmessagesmulti' => 'Vos avéd de mèssâjos novéls sur $1',
 'editsection' => 'changiér',
 'editold' => 'changiér',
-'viewsourceold' => 'vêre lo tèxto sôrsa',
+'viewsourceold' => 'fâre vêre lo tèxto sôrsa',
 'editlink' => 'changiér',
-'viewsourcelink' => 'vêre lo tèxto sôrsa',
+'viewsourcelink' => 'fâre vêre lo tèxto sôrsa',
 'editsectionhint' => 'Changiér la sèccion : $1',
 'toc' => 'Somèro',
 'showtoc' => 'fâre vêre',
 'hidetoc' => 'cachiér',
-'collapsible-collapse' => 'Recllôre',
-'collapsible-expand' => 'Dèvelopar',
+'collapsible-collapse' => 'repleyér',
+'collapsible-expand' => 'dèpleyér',
 'thisisdeleted' => 'Voléd-vos fâre vêre ou ben refâre $1 ?',
 'viewdeleted' => 'Fâre vêre $1 ?',
 'restorelink' => '{{PLURAL:$1|yon changement suprimâ|$1 changements suprimâs}}',
 'feedlinks' => 'Flux :',
-'feed-invalid' => 'Tipo de flux envalido.',
+'feed-invalid' => 'Tipo d’abonement du flux envalido.',
 'feed-unavailable' => 'Los flux de sindicacion sont pas disponiblos',
 'site-rss-feed' => 'Flux RSS de $1',
 'site-atom-feed' => 'Flux Atom de $1',
 'page-rss-feed' => 'Flux RSS de « $1 »',
 'page-atom-feed' => 'Flux Atom de « $1 »',
 'red-link-title' => '$1 (pâge pas ègzistenta)',
-'sort-descending' => 'Triyér per ôrdre dècrèssent',
-'sort-ascending' => 'Triyér per ôrdre crèssent',
+'sort-descending' => 'Betar per ôrdre dèscendent',
+'sort-ascending' => 'Betar per ôrdre montent',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Pâge',
-'nstab-user' => 'Pâge usanciér',
-'nstab-media' => 'Pâge de mèdia',
+'nstab-user' => 'Pâge utilisator',
+'nstab-media' => 'Fichiér mèdia',
 'nstab-special' => 'Pâge spèciâla',
-'nstab-project' => 'Pâge du projèt',
+'nstab-project' => 'Pâge projèt',
 'nstab-image' => 'Fichiér',
 'nstab-mediawiki' => 'Mèssâjo',
 'nstab-template' => 'Modèlo',
@@ -615,45 +618,45 @@ Vêde la [[Special:Version|pâge de les vèrsions]].',
 
 # Main script and global functions
 'nosuchaction' => 'Accion encognua',
-'nosuchactiontext' => 'L’accion spècefiâ dens l’URL est envalida.
-Vos éd pôt-étre mâl-buchiê l’URL ou ben siuvu un lim fôx.
-Pôt asse-ben étre quèstion d’una cofierie dens la programeria utilisâ per {{SITENAME}}.',
+'nosuchactiontext' => 'L’accion spècifiâye dens l’URL est envalida.
+Pôt-étre vos éd mâl-buchiê l’URL ou ben siuvu un lim fôx.
+Pôt asse-ben étre quèstion d’una cofierie dedens la programeria empleyêye per {{SITENAME}}.',
 'nosuchspecialpage' => 'Pâge spèciâla pas ègzistenta',
-'nospecialpagetext' => '<strong>Vos éd demandâ una pâge spèciâla qu’ègziste pas.</strong>
+'nospecialpagetext' => '<strong>Vos éd demandâ na pâge spèciâla qu’ègziste pas.</strong>
 
-Una lista de les pâges spèciâles valides sè trove dessus [[Special:SpecialPages|{{int:specialpages}}]].',
+Na lista de les pâges spèciâles valides sè trove dessus [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Èrror',
-'databaseerror' => 'Èrror de la bâsa de balyês',
-'dberrortext' => 'Una èrror de sintaxa de la requéta dens la bâsa de balyês est arrevâ.
-Cen pôt endicar una cofierie dens la programeria.
-La dèrriére requéta trètâ per la bâsa de balyês ére :
-<blockquote><tt>$1</tt></blockquote>
-dês la fonccion « <tt>$2</tt> ».
-La bâsa de balyês at retornâ l’èrror « <tt>$3 : $4</tt> ».',
-'dberrortextcl' => 'Una èrror de sintaxa de la requéta dens la bâsa de balyês est arrevâ.
-La dèrriére requéta trètâ per la bâsa de balyês ére :
+'error' => 'Fôta',
+'databaseerror' => 'Fôta de la bâsa de donâs',
+'dberrortext' => 'Na fôta de sintaxa de la demanda dens la bâsa de donâs est arrevâye.
+Cen pôt endicar na cofierie dedens la programeria.
+La dèrriére demanda trètâye per la bâsa de donâs ére :
+<blockquote><code>$1</code></blockquote>
+dês la fonccion « <code>$2</code> ».
+La bâsa de donâs at retornâ la fôta « <samp>$3 : $4</samp> ».',
+'dberrortextcl' => 'Na fôta de sintaxa de la demanda dens la bâsa de donâs est arrevâye.
+La dèrriére demanda trètâye per la bâsa de donâs ére :
 « $1 »
 dês la fonccion « $2 ».
-La bâsa de balyês at retornâ l’èrror « $3 : $4 ».',
+La bâsa de donâs at retornâ la fôta « $3 : $4 ».',
 'laggedslavemode' => "'''Atencion :''' cela pâge pôt pas contegnir tôs los dèrriérs changements fêts.",
-'readonly' => 'Bâsa de balyês vèrrolyê',
-'enterlockreason' => 'Balyéd la rêson du vèrrolyâjo et pués una èstimacion de son temps',
-'readonlytext' => 'Ora, la bâsa de balyês est vèrrolyê por d’entrâs novèles et d’ôtros changements, probâblament por pèrmetre la mantegnence de la bâsa de balyês, aprés què tot tornerat a la normala.
+'readonly' => 'Bâsa de donâs vèrrolyêye',
+'enterlockreason' => 'Balyéd la rêson du vèrroly et pués n’èstimacion de la sina durâ',
+'readonlytext' => 'Ora la bâsa de donâs est vèrrolyêye por les entrâs novèles et los ôtros changements, probâblament por pèrmetre la sina mantegnence, dês cen tot tornerat en ôrdre.
 
-L’administrator que l’at vèrrolyê at balyê cetèxplicacion : $1',
-'missing-article' => 'La bâsa de balyês at pas trovâ lo tèxto d’una pâge qu’el arêt diu trovar, avouéc lo titro « $1 » $2.
+L’administrator que l’at vèrrolyê at balyê cetèxplicacion : $1',
+'missing-article' => 'La bâsa de donâs at pas trovâ lo tèxto d’una pâge qu’el arêt diu trovar, avouéc lo titro « $1 » $2.
 
-En g·ènèral, cen arreve en siuvent un lim de vers un dif dèpassâ ou ben de vers l’historico d’una pâge suprimâ.
+En g·ènèral cen arreve en siuvent un lim de vers un dif dèpassâ ou ben de vers l’historico d’una pâge suprimâye.
 
-S’o est pas lo câs, pôt étre quèstion d’una cofierie dens la programeria.
+S’o est pas lo câs, pôt étre quèstion d’una cofierie dedens la programeria.
 La volyéd signalar a un [[Special:ListUsers/sysop|administrator]] sen oubliar de lui endicar l’URL du lim.',
-'missingarticle-rev' => '(numerô de la vèrsion : $1)',
-'missingarticle-diff' => '(Dif : $1, $2)',
-'readonly_lag' => 'La bâsa de balyês at étâ vèrrolyê ôtomaticament pendent que los sèrvors secondèros ratrapont lor retârd sur lo sèrvor principâl.',
-'internalerror' => 'Èrror de dedens',
-'internalerror_info' => 'Èrror de dedens : $1',
+'missingarticle-rev' => '(numerô de vèrsion : $1)',
+'missingarticle-diff' => '(dif : $1, $2)',
+'readonly_lag' => 'La bâsa de donâs est étâye vèrrolyêye ôtomaticament pendent que los sèrviors secondèros ratrapont lor retârd sur lo sèrvior principâl.',
+'internalerror' => 'Fôta de dedens',
+'internalerror_info' => 'Fôta de dedens : $1',
 'fileappenderrorread' => 'Empossiblo de liére « $1 » pendent l’aponsa.',
 'fileappenderror' => 'Empossiblo d’apondre « $1 » a « $2 ».',
 'filecopyerror' => 'Empossiblo de copiyér lo fichiér « $1 » vers « $2 ».',
@@ -661,44 +664,45 @@ La volyéd signalar a un [[Special:ListUsers/sysop|administrator]] sen oubliar d
 'filedeleteerror' => 'Empossiblo de suprimar lo fichiér « $1 ».',
 'directorycreateerror' => 'Empossiblo de fâre lo dossiér « $1 ».',
 'filenotfound' => 'Empossiblo de trovar lo fichiér « $1 ».',
-'fileexistserror' => 'Empossiblo d’ècrire dens lo dossiér « $1 » : lo fichiér ègziste.',
+'fileexistserror' => 'Empossiblo d’ècrire lo fichiér « $1 » : lo fichiér ègziste.',
 'unexpected' => 'Valor emprèvua : « $1 » = « $2 ».',
-'formerror' => 'Èrror : empossiblo de sometre lo formulèro',
-'badarticleerror' => 'Celaccion pôt pas étre fêta sur ceta pâge.',
+'formerror' => 'Fôta : empossiblo de sometre lo formulèro.',
+'badarticleerror' => 'Celaccion pôt pas étre fêta sur ceta pâge.',
 'cannotdelete' => 'Empossiblo de suprimar la pâge ou ben lo fichiér « $1 ».
-La suprèssion at pôt-étre ja étâ fêta per quârqu’un d’ôtro.',
+Pôt-étre la suprèssion est ja étâye fêta per quârqu’un d’ôtro.',
 'cannotdelete-title' => 'Empossiblo de suprimar la pâge « $1 »',
 'badtitle' => 'Crouyo titro',
-'badtitletext' => 'Lo titro de pâge demandâ est fôx, vouedo, ou ben o est un titro entèrlengoua ou entèrvouiqui mâl-liyê.
-Contint sûrement yon ou ben un mouél de caractèros que pôvont pas étre utilisâs dens los titros.',
-'perfcached' => 'Cetes balyês sont en cache et pôvont pas étre a jorn. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Cetes balyês sont en cache, sont vêr pas forciêment a jorn. La dèrriére actualisacion dâte du $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
-'querypage-no-updates' => 'Ora, les mises a jorn por ceta pâge sont dèsactivâs.
-Les balyês ce-desot sont pas betâs a jorn.',
-'wrong_wfQuery_params' => 'Paramètres fôx dessus wfQuery()<br />
+'badtitletext' => 'Lo titro de la pâge demandâye est envalido, vouedo ou ben o est un titro entèrlengoua ou entèrvouiqui mâl-liyê.
+Contint sûrament yon ou ben un mouél de caractèros que pôvont pas étre empleyês dedens los titros.',
+'perfcached' => 'Cetes donâs sont en cacho et pôvont pas étre a jorn. Por lo més {{PLURAL:$1|yon rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
+'perfcachedts' => 'Cetes donâs sont en cacho et sont étâyes betâyes a jorn por lo dèrriér côp a $1. Por lo més {{PLURAL:$1|yon rèsultat est disponiblo|$1 rèsultats sont disponiblos}} dedens lo cacho.',
+'querypage-no-updates' => 'Ora les mises a jorn por ceta pâge sont dèsactivâyes.
+Les donâs ce-desot sont pas betâyes a jorn.',
+'wrong_wfQuery_params' => 'Paramètros fôx dessus wfQuery()<br />
 Fonccion : $1<br />
-Requéta : $2',
-'viewsource' => 'Vêre lo tèxto sôrsa',
-'viewsource-title' => 'Vêre la sôrsa de $1',
-'actionthrottled' => 'Accion limitâ',
-'actionthrottledtext' => 'Por combatre lo spame, la frèquence d’ègzécucion de cela accion est limitâ dens un moment prod côrt, et vos éd dèpassâ ceta limita.
-Volyéd tornar èprovar dens doux-três menutes.',
-'protectedpagetext' => 'Ceta pâge at étâ protègiê por empachiér son changement.',
-'viewsourcetext' => 'Vos pouede vêre et copiyér lo tèxto sôrsa de la pâge :',
-'viewyourtext' => "Vos pouede vêre et copiyér lo contegnu de '''voutros changements''' a ceta pâge :",
-'protectedinterface' => 'Ceta pâge fât de tèxto d’entèrface por la programeria et est protègiê por èvitar los abus.',
-'editinginterface' => "'''Atencion :''' vos éte aprés changiér una pâge utilisâ por fâre lo tèxto d’entèrface por la programeria.
-Los changements sè cognetront, d’aprés lo contèxto, sur totes ou ben quârques pâges visibles per los ôtros usanciérs.
-Por les traduccions, nos vos envitens a utilisar lo seto [//translatewiki.net/wiki/Main_Page?setlang=frp translatewiki.net], lo projèt de localisacion de MediaWiki.",
-'sqlhidden' => '(Requéta SQL cachiê)',
-'cascadeprotected' => 'Ora, cela pâge est protègiê perce qu’el est encllua dens {{PLURAL:$1|ceta pâge|cetes pâges}}, {{PLURAL:$1|qu’at étâ protègiê|qu’ont étâ protègiês}} avouéc lo chouèx « protèccion en cascâda » activâ :
+Demanda : $2',
+'viewsource' => 'Fâre vêre lo tèxto sôrsa',
+'viewsource-title' => 'Vêre lo tèxto sôrsa de $1',
+'actionthrottled' => 'Accion limitâye',
+'actionthrottledtext' => 'Por combatre lo spame, l’usâjo de cel’accion est limitâ a doux-três côps dens un moment prod côrt. S’acomplét que vos éd dèpassâ ceta limita.
+Volyéd tornar èprovar dens un tôrn.',
+'protectedpagetext' => 'Ceta pâge est étâye protègiêye por empachiér son changement.',
+'viewsourcetext' => 'Vos pouede vêre et pués copiyér lo tèxto sôrsa de ceta pâge :',
+'viewyourtext' => "Vos pouede vêre et pués copiyér lo tèxto sôrsa de '''voutros changements''' a ceta pâge :",
+'protectedinterface' => 'Ceta pâge balye de tèxto d’entèrface por la programeria et est vêr protègiêye por èvitar los abus.',
+'editinginterface' => "'''Atencion :''' vos éte aprés changiér na pâge empleyêye por fâre lo tèxto d’entèrface de la programeria.
+Los changements sè cognetront sur totes ou ben doux-três pâges visibles per los ôtros utilisators.
+Por les traduccions, nos vos envitens a empleyér [//translatewiki.net/wiki/Main_Page?setlang=frp translatewiki.net], lo projèt de localisacion de MediaWiki.",
+'sqlhidden' => '(Demanda SQL cachiêye)',
+'cascadeprotected' => 'Cela pâge-que est protègiêye perce qu’el est encllua dedens {{PLURAL:$1|ceta pâge, qu’est étâye protègiêye|cetes pâges, que sont étâyes protègiêyes}} avouéc lo chouèx « protèccion en cascâda » activâ :
 $2',
-'namespaceprotected' => "Vos avéd pas la pèrmission de changiér les pâges de l’èspâço de noms '''« $1 »'''.",
-'customcssprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge CSS, perce que contint les prèferences a un ôtro usanciér.',
-'customjsprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge JavaScript, perce que contint les prèferences a un ôtro usanciér.',
-'ns-specialprotected' => 'Les pâges dens l’èspâço de noms « {{ns:special}} » pôvont pas étre changiês.',
-'titleprotected' => "Cél titro at étâ protègiê a la crèacion per [[User:$1|$1]].
-La rêson balyê est « ''$2'' ».",
+'namespaceprotected' => "Vos avéd pas la pèrmission de changiér les pâges de l’èspâço de noms « '''$1''' ».",
+'customcssprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge CSS, perce que contint la configuracion a sè d’un ôtro utilisator.',
+'customjsprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge JavaScript, perce que contint la configuracion a sè d’un ôtro utilisator.',
+'ns-specialprotected' => 'Les pâges spèciâles pôvont pas étre changiêyes.',
+'titleprotected' => "Cél titro est étâ protègiê a la crèacion per [[User:$1|$1]].
+La rêson balyêye est « ''$2'' ».",
+'exception-nologin' => 'Pas branchiê',
 
 # Virus scanner
 'virus-badscanner' => "Crouye configuracion : scanor de virus encognu : ''$1''",
@@ -706,117 +710,119 @@ La rêson balyê est « ''$2'' ».",
 'virus-unknownscanner' => 'antivirus encognu :',
 
 # Login and logout pages
-'logouttext' => "'''Ora, vos éte dèbranchiê.'''
+'logouttext' => "'''Ora vos éte dèbranchiê{{GENDER:||ye|(ye)}}.'''
 
-Vos pouede continuar a utilisar {{SITENAME}} de façon anonima, ou ben [[Special:UserLogin|vos tornar branchiér]] desot lo mémo nom ou ben un ôtro.
-Notâd que quârques pâges pôvont étre adés montrâs coment se vos érâd tojorn branchiê, tant que vos èfaciéd lo cache de voutron navigator.",
+Vos pouede continuar a empleyér {{SITENAME}} de façon anonima ou ben [[Special:UserLogin|vos tornar branchiér]] desot lo mémo nom ou un ôtro.
+Notâd qu’y at des pâges que pôvont étre oncor fêtes vêre coment se vos érâd adés branchiê{{GENDER:||ye|(ye)}}, tant que vos èfaciéd lo cacho de voutron navigator.",
 'welcomecreation' => '== Benvegnua, $1 ! ==
-Voutron compto usanciér at étâ fêt.
+Voutron compto est étâ fêt.
 Oubliâd pas de pèrsonalisar voutres [[Special:Preferences|prèferences dessus {{SITENAME}}]].',
-'yourname' => 'Nom d’usanciér :',
+'yourname' => 'Nom d’utilisator :',
 'yourpassword' => 'Contresegno :',
 'yourpasswordagain' => 'Confirmâd lo contresegno :',
-'remembermypassword' => 'Sè rapelar de mon branchement sur ceti navigator (por $1 jorn{{PLURAL:$1||s}} u més)',
+'remembermypassword' => 'Sè rapelar de mon contresegno sur ceti navigator (por lo més $1 jorn{{PLURAL:$1||s}})',
 'securelogin-stick-https' => 'Réstar branchiê en HTTPS aprés lo branchement',
 'yourdomainname' => 'Voutron domêno :',
-'externaldberror' => 'Ou ben una èrror est arrevâ avouéc la bâsa de balyês d’ôtenticacion de defôr, ou ben vos éte pas ôtorisâ a betar a jorn voutron compto de defôr.',
+'password-change-forbidden' => 'Vos pouede pas changiér los contresegnos sur ceti vouiqui.',
+'externaldberror' => 'Ou ben na fôta est arrevâye avouéc la bâsa de donâs d’ôtentificacion de defôr ou ben vos éte pas ôtorisâ{{GENDER:||ye|(ye)}} a betar a jorn voutron compto de defôr.',
 'login' => 'Branchement',
-'nav-login-createaccount' => 'Fâre un compto ou sè branchiér',
+'nav-login-createaccount' => 'Sè branchiér / fâre un compto',
 'loginprompt' => "Vos dête activar los tèmouens (''cookies'') por vos branchiér a {{SITENAME}}.",
-'userlogin' => 'Fâre un compto ou sè branchiér',
+'userlogin' => 'Sè branchiér / fâre un compto',
 'userloginnocreate' => 'Sè branchiér',
 'logout' => 'Sè dèbranchiér',
 'userlogout' => 'Dèbranchement',
 'notloggedin' => 'Pas branchiê',
-'nologin' => "Vos avéd pas un compto ? '''$1'''.",
+'nologin' => "Vos avéd p’oncor un compto ? '''$1.'''",
 'nologinlink' => 'Féte un compto',
 'createaccount' => 'Fâre un compto',
-'gotaccount' => "Vos avéd ja un compto ? '''$1'''.",
+'gotaccount' => "Vos avéd ja un compto ? '''$1.'''",
 'gotaccountlink' => 'Branchiéd-vos',
 'userlogin-resetlink' => 'Vos éd oubliâ voutros dètalys de branchement ?',
 'createaccountmail' => 'per mèssageria èlèctronica',
 'createaccountreason' => 'Rêson :',
 'badretype' => 'Los contresegnos que vos éd buchiês sont pas pariérs.',
-'userexists' => 'Lo nom d’usanciér buchiê est ja utilisâ.
+'userexists' => 'Lo nom d’utilisator buchiê est ja empleyê.
 Nen volyéd chouèsir un ôtro.',
-'loginerror' => 'Èrror de branchement',
+'loginerror' => 'Fôta de branchement',
 'createaccounterror' => 'Empossiblo de fâre lo compto : $1',
-'nocookiesnew' => "Lo compto usanciér at étâ fêt, mas vos éte pas branchiê.
-{{SITENAME}} utilise des tèmouens (''cookies'') por lo branchement mas vos los éd dèsactivâs.
+'nocookiesnew' => "Lo compto utilisator est étâ fêt, mas vos éte pas branchiê{{GENDER:||ye|(ye)}}.
+{{SITENAME}} empleye des tèmouens (''cookies'') por lo branchement mas vos los éd dèsactivâs.
 Los volyéd activar et pués vos tornar branchiér avouéc lo mémo nom et lo mémo contresegno.",
-'nocookieslogin' => "{{SITENAME}} utilise des tèmouens (''cookies'') por lo branchement mas vos los éd dèsactivâs.
-Los volyéd activar et pués vos tornar branchiér.",
-'nocookiesfornew' => "Lo compto usanciér at pas étâ fêt, perce que nos ens pas possu confirmar sa sôrsa.
+'nocookieslogin' => "{{SITENAME}} empleye des tèmouens (''cookies'') por lo branchement mas vos los éd dèsactivâs.
+Los volyéd activar et pués tornar èprovar.",
+'nocookiesfornew' => "Lo compto utilisator est pas étâ fêt, perce que nos ens pas possu confirmar la sina sôrsa.
 Controlâd que vos éd activâ los tèmouens (''cookies''), rechargiéd la pâge et pués tornâd èprovar.",
-'noname' => 'Vos éd pas buchiê un nom d’usanciér valido.',
-'loginsuccesstitle' => 'Branchement reussi.',
-'loginsuccess' => "'''Ora, vos éte branchiê a {{SITENAME}} coment « $1 ».'''",
-'nosuchuser' => 'L’usanciér « $1 » ègziste pas.
-Los noms d’usanciér sont sensiblos a la câssa.
-Controlâd l’ortografia, ou ben [[Special:UserLogin/signup|féte un compto novél]].',
-'nosuchusershort' => 'Y at gins de contributor avouéc lo nom « $1 ».
+'noname' => 'Vos éd pas buchiê un nom d’utilisator valido.',
+'loginsuccesstitle' => 'Branchement reussi',
+'loginsuccess' => "'''Ora vos éte branchiê{{GENDER:||ye|(ye)}} a {{SITENAME}} coment « $1 ».'''",
+'nosuchuser' => 'L’utilisator « $1 » ègziste pas.
+Los noms d’utilisator sont sensiblos a la câssa.
+Controlâd l’ortografia ou ben [[Special:UserLogin/signup|féte un compto novél]].',
+'nosuchusershort' => 'Y at gins d’utilisator avouéc lo nom « $1 ».
 Volyéd controlar l’ortografia.',
-'nouserspecified' => 'Vos dête buchiér un nom d’usanciér.',
-'login-userblocked' => 'Ceti usanciér est blocâ. Branchement pas ôtorisâ.',
+'nouserspecified' => 'Vos dête buchiér un nom d’utilisator.',
+'login-userblocked' => 'Cet’utilisator est blocâ. Branchement pas ôtorisâ.',
 'wrongpassword' => 'Lo contresegno est fôx.
 Volyéd tornar èprovar.',
 'wrongpasswordempty' => 'Vos éd pas buchiê de contresegno.
 Volyéd tornar èprovar.',
 'passwordtooshort' => 'Voutron contresegno dêt contegnir u muens $1 caractèro{{PLURAL:$1||s}}.',
-'password-name-match' => 'Voutron contresegno dêt étre difèrent de voutron nom d’usanciér.',
-'password-login-forbidden' => 'L’usâjo de cél nom d’usanciér et de cél contresegno at étâ dèfendu.',
+'password-name-match' => 'Voutron contresegno dêt étre difèrent de voutron nom d’utilisator.',
+'password-login-forbidden' => 'L’usâjo de cél nom d’utilisator et de cél contresegno est étâ dèfendu.',
 'mailmypassword' => 'Recêvre un contresegno novél per mèssageria èlèctronica',
 'passwordremindertitle' => 'Contresegno temporèro novél por {{SITENAME}}',
 'passwordremindertext' => 'Quârqu’un (probâblament vos, avouéc l’adrèce IP $1) at demandâ un contresegno
-novél por {{SITENAME}} ($4). Un contresegno temporèro at étâ fêt por
-l’usanciér « $2 » et est « $3 ». S’o ére voutra entencion, vos vos devréd
+novél por {{SITENAME}} ($4). Un contresegno temporèro est étâ fêt por
+l’utilisator « $2 » et est « $3 ». S’o ére voutra entencion, vos vos devréd
 branchiér et pués chouèsir un contresegno novél.
 Voutron contresegno temporèro èxpirerat dens $5 jorn{{PLURAL:$5||s}}.
 
-Se cela demanda vint pas de vos, ou ben se vos vos rapelâd ora
+Se cela demanda vint pas de vos ou ben se vos vos rapelâd ora
 de voutron contresegno et que vos souhètâd pas més nen changiér, vos
-pouede ignorar ceti mèssâjo et continuar a utilisar voutron viely contresegno.',
-'noemail' => 'Niona adrèce èlèctronica at étâ encartâ por l’usanciér « $1 ».',
-'noemailcreate' => 'Vos dête balyér una adrèce èlèctronica valida',
-'passwordsent' => 'Un contresegno novél at étâ mandâ a l’adrèce èlèctronica a l’usanciér « $1 ».
+pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contresegno.',
+'noemail' => 'Niona adrèce èlèctronica est étâye encartâye por l’utilisator « $1 ».',
+'noemailcreate' => 'Vos dête balyér n’adrèce èlèctronica valida',
+'passwordsent' => 'Un contresegno novél est étâ mandâ a l’adrèce èlèctronica de l’utilisator « $1 ».
 Vos volyéd tornar branchiér aprés l’avêr reçu.',
-'blocked-mailpassword' => 'Voutra adrèce IP est blocâ en ècritura, la fonccion de rapèl du contresegno est vêr dèsactivâ por èvitar los abus.',
-'eauthentsent' => 'Un mèssâjo de confirmacion at étâ mandâ a l’adrèce endicâ.
-Devant qu’un ôtro mèssâjo seye mandâ a ceti compto, vos devréd siuvre les enstruccions du mèssâjo et confirmar que lo compto est franc lo voutro.',
-'throttled-mailpassword' => 'Un mèssâjo de rapèl de voutron contresegno at ja étâ mandâ pendent {{PLURAL:$1|l’hora passâ|les $1 hores passâs}}.
-Por èvitar los abus, solament yon mèssâjo de rapèl serat mandâ per {{PLURAL:$1|hora|entèrvalo de $1 hores}}.',
-'mailerror' => 'Èrror pendent l’èxpèdicion du mèssâjo : $1',
-'acct_creation_throttle_hit' => 'Quârqu’un qu’utilise voutra adrèce IP at fêt {{PLURAL:$1|yon compto|$1 comptos}} pendent les 24 hores passâs, cen qu’est la limita ôtorisâ dens ceti temps.
-Du côp, la crèacion de compto at étâ dèsactivâ temporèrament por cela adrèce IP.',
-'emailauthenticated' => 'Voutra adrèce èlèctronica at étâ ôtenticâ lo $2 a $3.',
-'emailnotauthenticated' => 'Voutra adrèce èlèctronica est p’oncor ôtenticâ.
+'blocked-mailpassword' => 'Voutron adrèce IP est blocâye en ècritura, la fonccion de sovegnence du contresegno est vêr dèsactivâye por èvitar los abus.',
+'eauthentsent' => 'Un mèssâjo de confirmacion est étâ mandâ a l’adrèce endicâye.
+Devant qu’un ôtro mèssâjo seye mandâ a ceti compto, vos devréd siuvre les enstruccions du mèssâjo et pués confirmar que lo compto est franc lo voutro.',
+'throttled-mailpassword' => 'Un mèssâjo de sovegnence de voutron contresegno est ja étâ mandâ pendent {{PLURAL:$1|l’hora passâye|les $1 hores passâyes}}.
+Por èvitar los abus, solament yon mèssâjo de sovegnence serat mandâ per {{PLURAL:$1|hora|entèrvalo de $1 hores}}.',
+'mailerror' => 'Fôta pendent l’èxpèdicion du mèssâjo : $1',
+'acct_creation_throttle_hit' => 'Quârqu’un qu’empleye voutron adrèce IP at fêt {{PLURAL:$1|yon compto|$1 comptos}} pendent les 24 hores passâyes, cen qu’est la limita ôtorisâye dens ceti temps.
+Du côp la crèacion de compto est étâye dèsactivâye temporèrament por cel’adrèce IP.',
+'emailauthenticated' => 'Voutron adrèce èlèctronica est étâye ôtentifiâye lo $2 a $3.',
+'emailnotauthenticated' => 'Voutron adrèce èlèctronica est p’oncor ôtentifiâye.
 Nion mèssâjo serat mandâ por châcuna de cetes fonccions.',
-'noemailprefs' => 'Endicâd una adrèce èlèctronica dens voutres prèferences por utilisar cetes fonccions.',
-'emailconfirmlink' => 'Confirmâd voutra adrèce èlèctronica',
-'invalidemailaddress' => 'Ceta adrèce èlèctronica pôt pas étre accèptâ perce que semble avêr un format fôx.
-Volyéd buchiér una adrèce bien formatâ ou ben lèssiér cél champ vouedo.',
-'cannotchangeemail' => 'Les adrèces èlèctroniques des comptos pôvont pas étre changiês sur ceti vouiqui.',
-'accountcreated' => 'Compto fêt.',
-'accountcreatedtext' => 'Lo compto usanciér por $1 at étâ fêt.',
+'noemailprefs' => 'Spècifiâd n’adrèce èlèctronica dens voutres prèferences por empleyér cetes fonccions.',
+'emailconfirmlink' => 'Confirmâd voutron adrèce èlèctronica',
+'invalidemailaddress' => 'Cet’adrèce èlèctronica pôt pas étre accèptâye perce que semble avêr un format fôx.
+Volyéd buchiér n’adrèce bien formatâye ou ben lèssiér cél champ vouedo.',
+'cannotchangeemail' => 'Les adrèces èlèctroniques des comptos pôvont pas étre changiêyes sur ceti vouiqui.',
+'emaildisabled' => 'Ceti seto pôt pas mandar des mèssâjos.',
+'accountcreated' => 'Compto fêt',
+'accountcreatedtext' => 'Lo compto utilisator por $1 est étâ fêt.',
 'createaccount-title' => 'Crèacion d’un compto por {{SITENAME}}',
-'createaccount-text' => 'Quârqu’un at fêt un compto por voutra adrèce èlèctronica dessus {{SITENAME}} ($4) avouéc lo titro « $2 » et lo contresegno « $3 ».
+'createaccount-text' => 'Quârqu’un at fêt un compto por voutron adrèce èlèctronica dessus {{SITENAME}} ($4) avouéc lo titro « $2 » et lo contresegno « $3 ».
 Vos vos devriâd branchiér et pués changiér dês ora voutron contresegno.
 
-Ignorâd ceti mèssâjo se cél compto at étâ fêt per èrror.',
-'usernamehasherror' => 'Lo nom d’usanciér pôt pas contegnir des caractèros de chaplâjo',
+Ignorâd ceti mèssâjo se cél compto est étâ fêt per fôta.',
+'usernamehasherror' => 'Lo nom d’utilisator pôt pas contegnir des caractèros de chaplâjo',
 'login-throttled' => 'Vos éd tentâ dèrriérement un trop grant nombro de branchements.
 Volyéd atendre devant que tornar èprovar.',
-'login-abort-generic' => 'Voutra tentativa de branchement at pas reussia - Anulâ',
+'login-abort-generic' => 'Voutra tentativa de branchement at pas reussi - Anulâye',
 'loginlanguagelabel' => 'Lengoua : $1',
-'suspicious-userlogout' => "Voutra demanda de dèbranchement at étâ refusâ perce que semble qu’el at étâ mandâ per un navigator câsso ou ben la misa en cache d’un sèrvor mandatèro (''proxy'').",
+'suspicious-userlogout' => 'Voutra demanda de dèbranchement est étâye refusâye perce que semble qu’el est étâye mandâye per un navigator câsso ou ben la misa en cacho d’un proxy.',
 
 # E-mail sending
-'php-mail-error-unknown' => 'Èrror encognua dens la fonccion mail() de PHP.',
-'user-mail-no-addy' => 'Tâchiê de mandar un mèssâjo sen adrèce èlèctronica',
+'php-mail-error-unknown' => 'Fôta encognua dens la fonccion mail() de PHP.',
+'user-mail-no-addy' => 'Tâchiê de mandar un mèssâjo sen adrèce èlèctronica.',
 
 # Change password dialog
 'resetpass' => 'Changiér lo contresegno',
-'resetpass_announce' => 'Vos vos éte branchiê avouéc un contresegno temporèro mandâ per mèssageria èlèctronica.
+'resetpass_announce' => 'Vos vos éte branchiê{{GENDER:||ye|(ye)}} avouéc un contresegno temporèro mandâ per mèssageria èlèctronica.
 Por chavonar lo branchement, vos dête buchiér un contresegno novél ique :',
 'resetpass_text' => '<!-- Apondéd lo tèxto ique -->',
 'resetpass_header' => 'Changiér lo contresegno du compto',
@@ -824,21 +830,21 @@ Por chavonar lo branchement, vos dête buchiér un contresegno novél ique :',
 'newpassword' => 'Contresegno novél :',
 'retypenew' => 'Confirmar lo contresegno novél :',
 'resetpass_submit' => 'Changiér lo contresegno et sè branchiér',
-'resetpass_success' => 'Voutron contresegno at étâ changiê avouéc reusséta !
+'resetpass_success' => 'Voutron contresegno est étâ changiê avouéc reusséta !
 Branchement en cors...',
-'resetpass_forbidden' => 'Los contresegnos pôvont pas étre changiês.',
+'resetpass_forbidden' => 'Los contresegnos pôvont pas étre changiês',
 'resetpass-no-info' => 'Vos dête étre branchiê por avêr accès a cela pâge.',
 'resetpass-submit-loggedin' => 'Changiér lo contresegno',
 'resetpass-submit-cancel' => 'Anular',
-'resetpass-wrong-oldpass' => 'Contresegno temporèro ou ben d’ora fôx.
-Vos éd pôt-étre ja changiê voutron contresegno avouéc reusséta ou ben demandâ un contresegno temporèro novél.',
+'resetpass-wrong-oldpass' => 'Contresegno temporèro ou ben d’ora envalido.
+Pôt-étre vos éd ja changiê voutron contresegno avouéc reusséta ou ben demandâ un contresegno temporèro novél.',
 'resetpass-temp-password' => 'Contresegno temporèro :',
 
 # Special:PasswordReset
-'passwordreset' => 'Tornar inicialisar lo contresegno',
-'passwordreset-text' => 'Rempléd ceti formulèro por recêvre un mèssâjo de rapèl des dètalys de voutron compto.',
+'passwordreset' => 'Remisa a zérô du contresegno',
+'passwordreset-text' => 'Rempléd ceti formulèro por recêvre un mèssâjo de sovegnence des dètalys de voutron compto.',
 'passwordreset-legend' => 'Tornar inicialisar lo contresegno',
-'passwordreset-disabled' => 'La remisa a zérô des contresegnos at étâ dèsactivâ sur ceti vouiqui.',
+'passwordreset-disabled' => 'La remisa a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.',
 'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yon des bocons de balyês ce-desot}}',
 'passwordreset-username' => 'Nom d’usanciér :',
 'passwordreset-domain' => 'Domêno :',
@@ -986,12 +992,11 @@ Volyéd controlar que vos voléd fâre ou ben changiér cela pâge.',
 'userpage-userdoesnotexist-view' => 'Lo compto usanciér « $1 » est pas encartâ.',
 'blocked-notice-logextract' => 'Ceti usanciér est ora blocâ.
 La dèrriére entrâ du jornal des blocâjos est disponibla ce-desot :',
-'clearyourcache' => "'''Nota :''' aprés avêr encartâ, vos devréd forciér lo rechargement complèt du cache de voutron navigator por vêre los changements.
+'clearyourcache' => "'''Nota :''' aprés avêr encartâ, vos devréd forciér lo rechargement complèt du cacho de voutron navigator por vêre los changements.
 * '''Firefox / Safari :''' mantegnéd la toche ''Granta Lètra'' (''Shift'') en cliquent sur lo boton ''Rechargiér'' (''Reload'') ou ben prèssâd ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' sur un Mac)
 * '''Google Chrome :''' prèssâd ''Ctrl-Shift-R'' (''⌘-Shift-R'' sur un Mac)
 * '''Internet Explorer :''' mantegnéd la toche ''Ctrl'' en cliquent sur lo boton ''Rafrèchir'' (''Refresh'') ou ben prèssâd ''Ctrl-F5''
-* '''Konqueror :''' clicâd sur lo boton ''Rechargiér'' ou ben prèssâd ''F5''
-* '''Opera :''' èfaciéd lo cache dens ''Outils → Prèferences''",
+* '''Opera :''' èfaciéd lo cacho dedens ''Outils → Prèferences''",
 'usercssyoucanpreview' => "'''Combina :''' utilisâd lo boton « {{int:showpreview}} » por èprovar voutra fôlye CSS novèla devant que la sôvar.",
 'userjsyoucanpreview' => "'''Combina :''' utilisâd lo boton « {{int:showpreview}} » por èprovar voutra fôlye JS novèla devant que la sôvar.",
 'usercsspreview' => "'''Rapelâd-vos que vos éte solament aprés prèvisualisar voutra prôpra fôlye CSS.'''
@@ -1006,8 +1011,9 @@ La dèrriére entrâ du jornal des blocâjos est disponibla ce-desot :',
 Rapelâd-vos que les pâges a sè avouéc èxtensions .css et .js utilisont des titros en petiôtes lètres, per ègzemplo {{ns:user}}:Foo/vector.css et pas {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Betâ a jorn)',
 'note' => "'''Nota :'''",
-'previewnote' => "'''Rapelâd-vos que ceti tèxto est ren qu’una prèvisualisacion.'''
-'''Il at p’oncor étâ sôvâ !'''",
+'previewnote' => "'''Rapelâd-vos qu’o est ren qu’una prèvisualisacion.'''
+Voutros changements ont p’oncor étâ sôvâ !",
+'continue-editing' => 'Continuar lo changement',
 'previewconflict' => 'Ceta prèvisualisacion montre lo tèxto de la bouèta d’èdicion de d’amont coment aparètrat se vos chouèsésséd de lo sôvar.',
 'session_fail_preview' => "'''Dèsolâ ! Nos povens pas encartar voutron changement a côsa d’una pèrta d’enformacions en rapôrt avouéc voutra sèance.'''
 Volyéd tornar èprovar.
@@ -1048,7 +1054,7 @@ Vos nos assurâd asse-ben que vos éd cen ècrit vos-mémo, ou ben que vos l’
 Se vos voléd pas que voutros ècrits seyont changiês sen gins de rèstriccion, adonc los volyéd pas sometre ique.<br />
 Vos nos assurâd asse-ben que vos éd cen ècrit vos-mémo, ou ben que vos l’éd copiyê d’una sôrsa que vint du domêno publico, ou ben d’una ressôrsa libra (vêde $1 por més de dètalys).
 '''Utilisâd gins d’ôvra desot drêt d’ôtor sen pèrmission èxprèssa !'''",
-'longpageerror' => "'''ÈRROR : lo tèxto que vos éd somês fât $1 Kio, cen que dèpâsse la limita fixâ a $2 Kio.'''
+'longpageerror' => "'''ÈRROR : lo tèxto que vos éd somês fât {{PLURAL:$1|yon Kio|$1 Kio}}, cen que dèpâsse la limita fixâ a {{PLURAL:$2|yon Kio|$2 Kio}}.'''
 Lo tèxto pôt pas étre sôvâ.",
 'readonlywarning' => "'''Atencion : la bâsa de balyês at étâ vèrrolyê por mantegnence, vos porréd vêr pas sôvar voutros changements d’abôrd.'''
 Vos pouede copiyér lo tèxto dens un fichiér tèxto et pués lo sôvar por ples târd.
@@ -1093,6 +1099,7 @@ Semble qu’el èye étâ suprimâ.',
 'edit-no-change' => 'Voutron changement at étâ ignorâ perce que nion changement at étâ fêt u tèxto.',
 'edit-already-exists' => 'La pâge novèla at pas possu étre fêta.
 Ègziste ja.',
+'defaultmessagetext' => 'Mèssâjo per dèfôt',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Atencion : ceta pâge contint trop d’apèls que revegnont chiers de fonccions du parsor.
@@ -1252,7 +1259,7 @@ Volyéd controlar los jornals.',
 # Suppression log
 'suppressionlog' => 'Jornal de les suprèssions',
 'suppressionlogtext' => 'Vê-que la lista de les suprèssions et des blocâjos qu’ont de contegnu cachiê ux administrators.
-Vêde la [[Special:BlockList|lista ux usanciérs et a les adrèces IP blocâs]] por vêre los banissements et los blocâjos que sont ora opèracionèls.',
+Vêde la [[Special:BlockList|lista des blocâjos]] por vêre los banissements et los blocâjos que sont ora opèracionèls.',
 
 # History merging
 'mergehistory' => 'Fusionar los historicos de les pâges',
@@ -1287,6 +1294,8 @@ Notâd bien que l’usâjo des lims de navigacion tornerat inicialisar cela colo
 
 # Diffs
 'history-title' => 'Historico de les vèrsions de « $1 »',
+'difference-title' => 'Difèrences entre les vèrsions de « $1 »',
+'difference-title-multipage' => 'Difèrences entre les pâges « $1 » et « $2 »',
 'difference-multipage' => '(Difèrences entre les pâges)',
 'lineno' => 'Legne $1 :',
 'compareselectedversions' => 'Comparar les vèrsions chouèsies',
@@ -1384,6 +1393,7 @@ Atencion, lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
 'prefs-beta' => 'Fonccionalitâts « Bèta »',
 'prefs-datetime' => 'Dâta et hora',
 'prefs-labs' => 'Fonccionalitâts « Laboratiors »',
+'prefs-user-pages' => 'Pâges utilisator',
 'prefs-personal' => 'Enformacions a sè',
 'prefs-rc' => 'Dèrriérs changements',
 'prefs-watchlist' => 'Lista de survelyence',
@@ -1563,6 +1573,7 @@ Ceta enformacion serat publica.',
 'right-writeapi' => 'Utilisar l’API d’ècritura',
 'right-delete' => 'Suprimar des pâges',
 'right-bigdelete' => 'Suprimar des pâges qu’ont un grant historico',
+'right-deletelogentry' => 'Suprimar et refâre n’entrâ spècifica du jornal',
 'right-deleterevision' => 'Suprimar ou refâre una vèrsion spècefica d’una pâge',
 'right-deletedhistory' => 'Vêre les entrâs des historicos suprimâs mas sen lor tèxto',
 'right-deletedtext' => 'Vêre lo tèxto suprimâ et les difèrences entre les vèrsions suprimâs',
@@ -1758,22 +1769,22 @@ cél fichiér fât $2.',
 Cen pôt étre diu a una èrror dedens lo nom du fichiér.
 Volyéd controlar que vos voléd franc tèlèchargiér cél fichiér.',
 'windows-nonascii-filename' => 'Ceti vouiqui recognêt pas los noms de fichiérs avouéc des caractèros spèciâls.',
-'fileexists' => "Un fichiér avouéc cél nom ègziste ja.
-Volyéd controlar '''<tt>[[:$1]]</tt>'''.
-Éte-vos de sûr de lo volêr changiér ? [[$1|thumb]]",
-'filepageexists' => "La pâge de dèscripcion por cél fichiér at ja étâ fêta ique '''<tt>[[:$1]]</tt>''', mas nion fichiér de cél nom ègziste ora.
+'fileexists' => 'Un fichiér avouéc cél nom ègziste ja.
+Volyéd controlar <strong>[[:$1]]</strong>.
+Éte-vos de sûr de lo volêr changiér ? [[$1|thumb]]',
+'filepageexists' => 'La pâge de dèscripcion por cél fichiér at ja étâ fêta ique <strong>[[:$1]]</strong>, mas nion fichiér de cél nom ègziste ora.
 Lo rèsumâ que vos voléd buchiér aparêtrat pas sur la pâge de dèscripcion.
 Por cen fâre vos devréd changiér la pâge a la man.
-[[$1|thumb]]",
-'fileexists-extension' => "Un fichiér avouéc un nom d’ense ègziste ja : [[$2|thumb]]
-* Nom du fichiér a tèlèchargiér : '''<tt>[[:$1]]</tt>'''
-* Nom du fichiér ègzistent : '''<tt>[[:$2]]</tt>'''
-Volyéd chouèsir un ôtro nom.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Un fichiér avouéc un nom d’ense ègziste ja : [[$2|thumb]]
+* Nom du fichiér a tèlèchargiér : <strong>[[:$1]]</strong>
+* Nom du fichiér ègzistent : <strong>[[:$2]]</strong>
+Volyéd chouèsir un ôtro nom.',
 'fileexists-thumbnail-yes' => "Lo fichiér semble étre una émâge en talye rèduita ''(figura)''.
 [[$1|thumb]]
-Volyéd controlar lo fichiér '''<tt>[[:$1]]</tt>'''.
+Volyéd controlar lo fichiér <strong>[[:$1]]</strong>.
 Se lo fichiér controlâ est la méma émâge avouéc la talye originèla, y at pas fôta de tèlèchargiér una vèrsion rèduita.",
-'file-thumbnail-no' => "Lo nom du fichiér comence per '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Lo nom du fichiér comence per <strong>$1</strong>.
 O est possiblo que seye una vèrsion rèduita ''(figura)''.
 Se vos avéd lo fichiér en rèsolucion ples hôta, tèlèchargiéd-lo, ôtrament volyéd changiér son nom.",
 'fileexists-forbidden' => 'Un fichiér avouéc cél nom ègziste ja et pôt pas étre ècllafâ.
@@ -1864,7 +1875,7 @@ Se lo problèmo continue, veriéd-vos vers un [[Special:ListUsers/sysop|administ
 'backend-fail-writetemp' => 'Empossiblo d’ècrire dedens lo fichiér temporèro.',
 'backend-fail-closetemp' => 'Empossiblo de cllôre lo fichiér temporèro.',
 'backend-fail-read' => 'Empossiblo de liére lo fichiér $1.',
-'backend-fail-create' => 'Empossiblo de fâre lo fichiér $1.',
+'backend-fail-create' => 'Empossiblo d’ècrire lo fichiér $1.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Empossiblo de dèvèrrolyér « $1 » ; el est pas vèrrolyê.',
@@ -1900,7 +1911,7 @@ Pôt pas étre controlâ tot drêt por la sècuritât.',
 'img-auth-nopathinfo' => 'PATH_INFO manquent.
 Voutron sèrvor est pas dèfeni por passar cela enformacion.
 Fonccione pôt-étre en CGI et pués recognêt pas img_auth.
-[https://www.mediawiki.org/wiki/Manual:Image_Authorization Vêde los drêts d’émâge.]',
+Vêde https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'Lo chemin demandâ est pas lo rèpèrtouèro de tèlèchargement configurâ.',
 'img-auth-badtitle' => 'Empossiblo de construire un titro valido dês « $1 ».',
 'img-auth-nologinnWL' => 'Vos éte pas branchiê et pués « $1 » est pas dens la lista blanche.',
@@ -2025,7 +2036,7 @@ La dèscripcion de sa [$2 pâge de dèscripcion] est montrâ ce-desot.',
 # MIME search
 'mimesearch' => 'Rechèrche per tipo de contegnu MIME',
 'mimesearch-summary' => "Ceta pâge vos pèrmèt de listar los fichiérs accèssiblos per ceti vouiqui d’aprés lor tipo de contegnu MIME.
-Entrâ : ''tipo de contegnu''/''sot-tipo'', per ègzemplo <tt>image/jpeg</tt>.",
+Entrâ : ''tipo de contegnu''/''sot-tipo'', per ègzemplo <code>image/jpeg</code>.",
 'mimetype' => 'Tipo MIME :',
 'download' => 'Tèlèchargiér',
 
@@ -2072,9 +2083,9 @@ Oubliâd pas de controlar s’y at pas d’ôtros lims de vers los modèlos deva
 
 'disambiguations' => 'Pâges qu’ont des lims de vers des pâges d’homonimia',
 'disambiguationspage' => 'Template:Homonimia',
-'disambiguations-text' => "Cetes pâges ont un lim de vers una '''pâge d’homonimia'''.
-Devriant pletout pouentar vers una pâge que vat avouéc.<br />
-Una pâge est trètâ coment una pâge d’homonimia s’encllut (tot drêt ou ben rècursivament) yon des modèlos listâs dessus [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Cetes pâges ont u muens yon lim de vers na '''pâge d’homonimia'''.
+Devriant pletout pouentar vers na pâge que vat avouéc.<br />
+Na pâge est trètâye coment na pâge d’homonimia s’empleye un modèlo liyê a [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Redirèccions dobles',
 'doubleredirectstext' => 'Vê-que la lista de les pâges que redirijont vers des pâges que sont lor-mémes des pâges de redirèccion.
@@ -2181,6 +2192,7 @@ Volyéd notar que d’ôtros setos pôvont avêr un lim drêt de vers un fichié
 Vos pouede rètrendre la vua en chouèséssent un tipo de jornal, un nom d’usanciér (sensiblo a la câssa) ou ben una pâge afèctâ (sensibla a la câssa avouéc).',
 'logempty' => 'Nion èlèment d’ense at étâ trovâ dens lo jornal.',
 'log-title-wildcard' => 'Chèrchiér permié los titros que començont per ceti tèxto',
+'showhideselectedlogentries' => 'Fâre vêre / cachiér les entrâs de jornal chouèsies',
 
 # Special:AllPages
 'allpages' => 'Totes les pâges',
@@ -2201,6 +2213,9 @@ Contint sûrement yon ou ben un mouél de caractèros que pôvont pas étre util
 'allpages-bad-ns' => '{{SITENAME}} at gins d’èspâço de noms « $1 ».',
 'allpages-hide-redirects' => 'Cachiér les redirèccions',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Vêre lo ples novél.',
+
 # Special:Categories
 'categories' => 'Catègories',
 'categoriespagetext' => '{{PLURAL:$1|Ceta catègorie contint|Cetes catègories contegnont}} des pâges ou ben des fichiérs mèdia.
@@ -2222,7 +2237,7 @@ Vêde asse-ben les [[Special:WantedCategories|catègories les ples demandâs]].'
 'linksearch-ok' => 'Rechèrchiér',
 'linksearch-text' => 'Des caractèros j·oquères coment « *.wikipedia.org » pôvont étre utilisâs.
 Ils ont fôta d’u muens un domêno de nivél supèrior, per ègzemplo « *.org ».<br />
-Protocolos recognus : <tt>$1</tt> (apondéd gins de cetos dedens voutra rechèrche).',
+Protocolos recognus : <code>$1</code> (apondéd gins de cetos dedens voutra rechèrche).',
 'linksearch-line' => '$1 est liyê dês $2',
 'linksearch-error' => 'Los caractèros j·oquères pôvont étre utilisâs ren qu’u comencement du nom de domêno de l’hôto.',
 
@@ -2415,6 +2430,8 @@ a fâre avouéc prudence.',
 'rollback' => 'Rèvocar los changements',
 'rollback_short' => 'Rèvocar',
 'rollbacklink' => 'rèvocar',
+'rollbacklinkcount' => 'rèvocar $1 changement{{PLURAL:$1||s}}',
+'rollbacklinkcount-morethan' => 'rèvocar més de $1 changement{{PLURAL:$1||s}}',
 'rollbackfailed' => 'La rèvocacion at pas reussia',
 'cantrollback' => 'Empossiblo de rèvocar lo changement ;
 lo dèrriér contributor est lo solèt ôtor de ceta pâge.',
@@ -2650,7 +2667,7 @@ Balyéd ce-desot una rêson justa (per ègzemplo en citent les pâges qu’ont 
 'badipaddress' => 'L’adrèce IP est fôssa.',
 'blockipsuccesssub' => 'Blocâjo reussi',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] at étâ blocâ.<br />
-Vêde la [[Special:BlockList|lista a les adrèces IP blocâs]] por revêre los blocâjos.',
+Vêde la [[Special:BlockList|lista des blocâjos]] por revêre los blocâjos.',
 'ipb-blockingself' => 'Vos éte prèst a vos blocar vos-mémo !  Éte-vos de sûr de lo volêr fâre ?',
 'ipb-confirmhideuser' => 'Vos éte prèst a blocar un usanciér avouéc « cachiér l’usanciér » activâ.  Cen suprime lo nom a l’usanciér dens totes les listes et les entrâs du jornal.  Éte-vos de sûr de lo volêr fâre ?',
 'ipb-edit-dropdown' => 'Changiér les rêsons de blocâjo',
@@ -2705,7 +2722,7 @@ Lo jornal de les suprèssions est disponiblo ce-desot :',
 'reblock-logentry' => 'at changiê los paramètres du blocâjo a [[$1]] avouéc una èxpiracion u $2 $3',
 'blocklogtext' => 'O est lo jornal des blocâjos et des dèblocâjos ux usanciérs.
 Les adrèces IP blocâs ôtomaticament sont pas listâs.
-Vêde la [[Special:BlockList|lista ux usanciérs et a les adrèces IP blocâs]] por vêre los banissements et los blocâjos que sont ora opèracionèls.',
+Vêde la [[Special:BlockList|lista des blocâjos]] por vêre los banissements et los blocâjos que sont ora opèracionèls.',
 'unblocklogentry' => 'at dèblocâ $1',
 'block-log-flags-anononly' => 'solament los usanciérs pas encartâs',
 'block-log-flags-nocreate' => 'crèacion de compto dèfendua',
@@ -2868,6 +2885,7 @@ lo rèsultat pôt adonc étre importâ dens un ôtro vouiqui qu’utilise la pro
 Por èxportar des pâges, buchiéd lors titros dens la bouèta de tèxto ce-desot, yon titro per legne, et pués chouèsésséd se vos voléd ou pas la vèrsion d’ora avouéc totes les vielyes vèrsions, avouéc les legnes de l’historico de la pâge, ou ben simplament la pâge d’ora avouéc des enformacions sur lo dèrriér changement.
 
 Dens cél dèrriér câs, vos pouede asse-ben utilisar un lim, coment [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la pâge « [[{{MediaWiki:Mainpage}}]] ».',
+'exportall' => 'Èxportar totes les pâges',
 'exportcuronly' => 'Èxportar ren que la vèrsion d’ora, sen l’historico complèt',
 'exportnohistory' => "----
 '''Nota :''' l’èxportacion de l’historico complèt de les pâges avouéc ceti formulèro at étâ dèsactivâ por des rêsons de capacitât.",
@@ -2884,7 +2902,7 @@ Dens cél dèrriér câs, vos pouede asse-ben utilisar un lim, coment [[{{#Speci
 # Namespace 8 related
 'allmessages' => 'Mèssâjos sistèmo',
 'allmessagesname' => 'Nom du mèssâjo',
-'allmessagesdefault' => 'Tèxto per dèfôt',
+'allmessagesdefault' => 'Mèssâjo per dèfôt',
 'allmessagescurrent' => 'Tèxto d’ora',
 'allmessagestext' => 'O est la lista des mèssâjos sistèmo disponiblos dens l’èspâço MediaWiki.
 Volyéd visitar la [//www.mediawiki.org/wiki/Localisation localisacion de MediaWiki] et pués [//translatewiki.net translatewiki.net] se vos voléd contribuar a la localisacion g·ènèrica de MediaWiki.',
@@ -2965,6 +2983,13 @@ Volyéd tornar èprovar.',
 'import-logentry-interwiki' => 'at importâ $1 per entèrvouiqui',
 'import-logentry-interwiki-detail' => '$1 vèrsion{{PLURAL:$1||s}} dês $2',
 
+# JavaScriptTest
+'javascripttest' => 'Èprôva de JavaScript',
+'javascripttest-disabled' => 'Cela fonccion-que est pas étâye activâye sur ceti vouiqui.',
+'javascripttest-title' => 'Èprôves de $1 en cors',
+'javascripttest-qunit-intro' => 'Vêde la [$1 documentacion de les èprôves] dessus mediawiki.org.',
+'javascripttest-qunit-heading' => 'Suita d’èprôva QUnit de JavaScript dessus MediaWiki',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Voutra pâge usanciér',
 'tooltip-pt-anonuserpage' => 'La pâge usanciér de l’adrèce IP avouéc laquinta vos contribuâd',
@@ -2996,7 +3021,7 @@ Portant, vos en pouede vêre lo tèxto sôrsa.',
 'tooltip-p-logo' => 'Pâge principâla',
 'tooltip-n-mainpage' => 'Visitar la pâge de reçua du seto',
 'tooltip-n-mainpage-description' => 'Alar a la reçua',
-'tooltip-n-portal' => 'A propôs du projèt',
+'tooltip-n-portal' => 'Sur lo projèt, cen que vos pouede fâre, yô que trovar les chouses',
 'tooltip-n-currentevents' => 'Trovar les enformacions de fond sur les dèrriéres novèles',
 'tooltip-n-recentchanges' => 'Lista des dèrriérs changements sur lo vouiqui',
 'tooltip-n-randompage' => 'Fâre vêre una pâge a l’hasârd',
@@ -3095,19 +3120,15 @@ O est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la l
 'spambot_username' => 'Neteyâjo de spame per MediaWiki',
 'spam_reverting' => 'Rètablissement de la dèrriére vèrsion que contint gins de lim de vers $1',
 'spam_blanking' => 'Totes les vèrsions que contegnont des lims de vers $1 sont blanchies',
+'spam_deleting' => 'Totes les vèrsions que contegnont des lims de vers $1 sont suprimâs',
 
 # Info page
 'pageinfo-title' => 'Enformacions por « $1 »',
-'pageinfo-header-edits' => 'Changements',
-'pageinfo-header-watchlist' => 'Lista de survelyence',
-'pageinfo-header-views' => 'Visualisacions',
-'pageinfo-subjectpage' => 'Pâge',
-'pageinfo-talkpage' => 'Pâge de discussion',
-'pageinfo-watchers' => 'Nombro de contributors qu’ont la pâge dens lor lista de survelyence',
-'pageinfo-edits' => 'Nombro de changements',
-'pageinfo-authors' => 'Nombro d’ôtors difèrents',
+'pageinfo-header-edits' => 'Historico des changements',
 'pageinfo-views' => 'Nombro de visualisacions',
-'pageinfo-viewsperedit' => 'Visualisacions per changement',
+'pageinfo-watchers' => 'Nombro de contributors qu’ont la pâge dedens lor lista de survelyence',
+'pageinfo-edits' => 'Soma totâla de changements',
+'pageinfo-authors' => 'Soma totâla d’ôtors difèrents',
 
 # Skin names
 'skinname-standard' => 'Estandârd',
@@ -3889,6 +3910,9 @@ Vos devriâd avêr reçu un [{{SERVER}}{{SCRIPTPATH}}/COPYING ègzemplèro de la
 'version-software' => 'Programeries enstalâs',
 'version-software-product' => 'Marchandie',
 'version-software-version' => 'Vèrsion',
+'version-entrypoints' => 'URL de pouent d’entrâ',
+'version-entrypoints-header-entrypoint' => 'Pouent d’entrâ',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Chemin d’accès du fichiér',
@@ -3916,7 +3940,7 @@ Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs son
 * <span class="mw-specialpagecached">Pâges spèciâles solament en cache (porriant étre dèpassâs).</span>',
 'specialpages-group-maintenance' => 'Rapôrts de mantegnence',
 'specialpages-group-other' => 'Ôtres pâges spèciâles',
-'specialpages-group-login' => 'Branchement / encartâjo',
+'specialpages-group-login' => 'Sè branchiér / fâre un compto',
 'specialpages-group-changes' => 'Dèrriérs changements et jornals',
 'specialpages-group-media' => 'Rapôrts et tèlèchargements de fichiérs mèdia',
 'specialpages-group-users' => 'Usanciérs et drêts apondus',
@@ -4053,6 +4077,7 @@ Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs son
 'api-error-file-too-large' => 'Lo fichiér que vos éd somês ére trop grant.',
 'api-error-filename-tooshort' => 'Lo nom du fichiér est trop côrt.',
 'api-error-filetype-banned' => 'Cél tipo de fichiér est dèfendu.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|est pas un tipo de fichiér ôtorisâ|sont pas des tipos de fichiérs ôtorisâs}}. {{PLURAL:$3|Lo tipo de fichiér ôtorisâ est|Los tipos de fichiérs ôtorisâs sont}} $2.',
 'api-error-filetype-missing' => 'L’èxtension du fichiér est manquenta.',
 'api-error-hookaborted' => 'Lo changement que vos éd tâchiê de fâre at étâ arrètâ per un grèfon d’una èxtension.',
 'api-error-http' => 'Èrror de dedens : sè pôt pas branchiér u sèrvor.',
@@ -4077,4 +4102,15 @@ Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs son
 'api-error-uploaddisabled' => 'Lo tèlèchargement est dèsactivâ sur ceti vouiqui.',
 'api-error-verification-error' => 'Cél fichiér pôt étre corrompu, ou ben son èxtension est fôssa.',
 
+# Durations
+'duration-seconds' => '$1 second{{PLURAL:$1|a|es}}',
+'duration-minutes' => '$1 menut{{PLURAL:$1|a|es}}',
+'duration-hours' => '$1 hor{{PLURAL:$1|a|es}}',
+'duration-days' => '$1 jorn{{PLURAL:$1||s}}',
+'duration-weeks' => '$1 seman{{PLURAL:$1|a|es}}',
+'duration-years' => '$1 an{{PLURAL:$1||s}}',
+'duration-decades' => '$1 dècèni{{PLURAL:$1|a|es}}',
+'duration-centuries' => '$1 sièclo{{PLURAL:$1||s}}',
+'duration-millennia' => '$1 milènèro{{PLURAL:$1||s}}',
+
 );
index b1cc827..fd91b54 100644 (file)
@@ -25,7 +25,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Latje änringe fersteege',
 'tog-newpageshidepatrolled' => 'Kontroliirde side aw e list "Naie side" fersteege',
 'tog-extendwatchlist' => 'Ütwidede wåchelist tun wisen foon åle änringe',
-'tog-usenewrc' => 'Ütwidede deerstaling foon da "Leeste Änringe" (brükt JavaScript)',
+'tog-usenewrc' => "Ütwidede deerstaling foon da ''Leeste Änringe'' än aw da ''Eefterkiikliste'' (brükt JavaScript)",
 'tog-numberheadings' => 'Ouerschrafte automatisch numeriire',
 'tog-showtoolbar' => 'Beårbe-wärktjüch wise',
 'tog-editondblclick' => 'Side ma dööweltklik beårbe (brükt JavaScript)',
@@ -33,17 +33,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Änkelte stöögne ma ruchts kliken beårbe (brükt JavaScript)',
 'tog-showtoc' => 'Wis en inhåltsferteeknis for side ma mäs ås trii ouerschrafte',
 'tog-rememberpassword' => 'Aw diheere komputer foon duur önjmälde (maksimool for $1 {{PLURAL:$1|däi|deege}})',
-'tog-watchcreations' => 'Seelew måågede side automatisch bekiike',
-'tog-watchdefault' => 'Seelew änrede side automaatisch bekiike',
-'tog-watchmoves' => 'Seelew ferschääwene side automaatisch bekiike',
-'tog-watchdeletion' => 'Seelew wächhåålde side automatisch bekiike',
+'tog-watchcreations' => "Salew maaget sidjen an huuchlooset dateien leewen uun't uug behual",
+'tog-watchdefault' => "Salew feranert sidjen an dateien leewen uun't uug behual",
+'tog-watchmoves' => "Salew fersköwen sidjen an dateien leewen uun't uug behual",
+'tog-watchdeletion' => "Salew stregen sidjen an dateien leewen uun't uug behual",
 'tog-minordefault' => 'Äine änringe gewöönlik ås latj mårkiire',
 'tog-previewontop' => 'Forbekiiken boowen dåt beårbingswaning wise',
 'tog-previewonfirst' => 'Bai dåt jarst beårben åltens dåt forbekiiken wise',
 'tog-nocache' => 'Sidecache foon e browser deaktiwiire',
-'tog-enotifwatchlistpages' => 'Bai änringe önj bekiikede side E-maile siinje',
+'tog-enotifwatchlistpages' => "Sjüür mi en E-Mail, wan sidjen of dateien feranert wurd, diar ik uun't uug behual wal",
 'tog-enotifusertalkpages' => 'Bai änringe tu min brüker-diskusjoonssid E-Maile siinje',
-'tog-enotifminoredits' => 'Uk bai latje änringe tu bekiikede side E-maile siinje',
+'tog-enotifminoredits' => 'Sjüür mi uk bi letj feranrangen faan sidjen an dateien en E-Mail',
 'tog-enotifrevealaddr' => 'Min E-mail-adräs önj tising-E-maile wise',
 'tog-shownumberswatching' => 'Wis di tål foon wåchende brükere',
 'tog-oldsig' => 'Aktuel signatuur:',
@@ -379,6 +379,7 @@ Wan dåt ai di fål as, hääst dü eewäntuäl en fäägel önj e software fün
 'cannotdelete' => 'Jü sid unti dootäi "$1" köö ai straagen wårde.
 Dåt as flicht ål straagen foon huum ouders.',
 'cannotdelete-title' => 'Sidj „$1“ koon ei stregen wurd.',
+'delete-hook-aborted' => 'Det striken as faan en software-feranerang faan MediaWiki ferhanert wurden. Di grünj as ei bekäänd.',
 'badtitle' => 'Ferkiirde tiitel',
 'badtitletext' => 'Di tiitel foon jü anfrååged sid as üngülti, lääsi unti n üngültigen spräklink foon en ouder wiki.',
 'perfcached' => 'Jodiar dooten kem faan a cache an san ferlicht ei muar aktuel. Huuchstens {{PLURAL:$1|ian resultoot as|$1 resultooten san}} uun a cache.',
@@ -393,7 +394,7 @@ Ouffrååch: $2',
 'actionthrottledtext' => 'Dü hääst jüdeer aksjoon tu oofding bane en kort tidrüm ütfjard. Wees sü gödj än täiw en påår minuute än fersäk dåt et dan foon naien.',
 'protectedpagetext' => 'Jüdeer sid as for dåt beårben späred.',
 'viewsourcetext' => 'Dü koost jü kwäle foon jüdeer sid bekiike än kopiire.',
-'viewyourtext' => "Dü könst di code faan '''din feranerang''' faan detheer sidj uunluke an kopiare:",
+'viewyourtext' => "Dü könst di code faan '''din feranrang''' faan detdiar sidj uunluke an kopiare:",
 'protectedinterface' => 'Jüdeer sid önjthålt takst for ju brükerouerfläche foon e software än as späred, am masbrük tu ferhanern.',
 'editinginterface' => "'''Paase üüb:''' Üüb detdiar sidj stäänt tekst, diar faan't MediaWiki software brükt woort. Wan dü diar wat feranerst, feranerst dü di skak faan't Nuurdfresk Wikipedia.
 Wan dü wat auersaat wel, maage det mä [//translatewiki.net/wiki/Main_Page?setlang=frr Translatewiki], det as det MediaWiki lokalisiarangsprojekt.",
@@ -411,6 +412,7 @@ Jü späre wörd döör [[User:$1|$1]] ma grün "$2" inruchted.',
 Di grünj faan di administraator as: „$3“.',
 'invalidtitle-knownnamespace' => 'Ferkiard auerskraft uun di nöömrüm „$2“ an tekst „$3“',
 'invalidtitle-unknownnamespace' => 'Ferkiard auerskraft uun di ünbekäänd nöömrüm „$1“ an tekst „$2“',
+'exception-nologin' => 'Ei uunmeldet',
 
 # Virus scanner
 'virus-badscanner' => "Hiinje konfigurasjoon: ünbekånde fiirusscanner: ''$1''",
@@ -570,14 +572,14 @@ Tidwis paasuurd: $2',
 'passwordreset-emailerror-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei ufsjüürd wurd: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'Feranere det E-Mail-adres',
-'changeemail-header' => 'Feranere det E-Mail-adres',
-'changeemail-text' => 'Fal detheer formulaar hialandaal ütj, am din E-Mail-adres tu feranerin. Diarför skel dü din paaswurd uundu.',
+'changeemail' => 'Feranre det E-Mail-adres',
+'changeemail-header' => 'Feranre det E-Mail-adres',
+'changeemail-text' => 'Fal detdiar formulaar hialandaal ütj, am din E-Mail-adres tu feranrin. Diarför skel dü din paaswurd uundu.',
 'changeemail-no-info' => 'Dü möist önjmälded weese am ju sid diräkt tu tu gripen.',
 'changeemail-oldemail' => 'Aktuel e-mail adres',
 'changeemail-newemail' => 'Nei e-mail adres',
 'changeemail-none' => '(niin)',
-'changeemail-submit' => 'E-mail adres feranere',
+'changeemail-submit' => 'E-mail adres feranre',
 'changeemail-cancel' => 'Ufbreeg',
 
 # Edit page toolbar
@@ -604,10 +606,10 @@ Tidwis paasuurd: $2',
 'minoredit' => 'Bloot kleenihäide wörden feränred',
 'watchthis' => 'Kiike eefter jüdeer sid',
 'savearticle' => 'Sidj seekre',
-'preview' => 'Forlök',
-'showpreview' => 'Forlök wise',
-'showlivepreview' => 'Live-forkiik',
-'showdiff' => 'Änringe wise',
+'preview' => 'Iarst ans luke',
+'showpreview' => 'Iarst ans luke',
+'showlivepreview' => 'Glik uunluke',
+'showdiff' => 'Feranrangen wise',
 'anoneditwarning' => "Dü beårbest jüdeer sid ünönjmälded. Wan dü spikerst, wård din aktuäle IP-adräs önj e fesjoonshistoori aptiikned än as deerma for åltens '''ålgemiin''' sichtboor.",
 'anonpreviewwarning' => "''Dü bast ai önjmälded. Bai t spiikern wårt din IP-adräs önj e fersjoonshistoori awtiikned.''",
 'missingsummary' => "'''Haanewising:\"' Dü heest niinj tuhuupefooting önjjääwen.
@@ -673,12 +675,12 @@ Dü koost dideere tiitel aw da ouder side [[Special:Search/{{PAGENAME}}|säke]],
 'noarticletext-nopermission' => 'Jüdeer sid önjhålt uugenblaklik nuch nån täkst.
 Dü koost dideere tiitel aw da oudre side [[Special:Search/{{PAGENAME}}|säke]],
 unti<span class="plainlinks">önj da deertuhiirende [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logböke säke] </span>.',
-'userpage-userdoesnotexist' => 'Dåt benjüterkonto "<nowiki>$1</nowiki>" as ai deer.
-Wees sü gödj än präif, weer dü jüdeer sid wörklik mååge/beårbe wååt.',
+'userpage-userdoesnotexist' => "Det brükerkonto ''$1'' as ei diar.
+Wel dü detdiar sidj würelk maage/bewerke?",
 'userpage-userdoesnotexist-view' => 'Benjüterkonto "$1" bestoont ai.',
 'blocked-notice-logextract' => 'Dideer benjüter as tutids spärd.
 For informasjoon füliet di leeste üttooch üt dåt benjüterspär-logbök:',
-'clearyourcache' => "'''Beaachte:''' Maage di cache faan dan browser leesag, wan dü a feranerangen sä wel.
+'clearyourcache' => "'''Beaachte:''' Maage di cache faan dan browser leesag, wan dü a feranrangen sä wel.
 * '''Firefox / Safari:''' Hual ''Shift'' bi't aktualisiarin, of trak ''Strg an F5'' of ''Strg an R'' (''⌘an R'' üüb en Mac)
 * '''Google Chrome:''' Trak ''Strg an Shift an R'' (''⌘an Shift an R'' üüb en Mac)
 * '''Internet Explorer:''' Hual ''Strg'' bi't aktualisiarin, of trak ''Strg an F5''
@@ -721,8 +723,8 @@ Wees so gud an kontroliare ales noch ans.",
 'editingcomment' => 'Beårben foon $1 (naien oufsnaas)',
 'editconflict' => 'Beårbingskonflikt: $1',
 'explainconflict' => "Hoker ööders hää detheer sidj feranert, üs dü jüst diarmä uun a gang wiarst.
-Boowen könst dü di aktuel stant sä. Oner stun din fernanerangen.
-Bluas wat '''boowen''' stäänt, woort seekert. Diaram kopiare din feranerangen boowen iin.
+Boowen könst dü di aktuel stant sä. Oner stun din fernanrangen.
+Bluas wat '''boowen''' stäänt, woort seekert. Diaram kopiare din feranrangen boowen iin.
 An do trak „{{int:savearticle}}“.",
 'yourtext' => 'Din täkst',
 'storedversion' => 'Spiikerd färsjoon',
@@ -799,8 +801,8 @@ Deer {{PLURAL:$2|mötj ai mör ås 1 apteel|mönje ai mör ås $1 apteele}} wees
 'parser-unstrip-recursion-limit' => 'Tuföl jinsidjag ferwisangen bi $1',
 
 # "Undo" feature
-'undo-success' => 'Detheer feranerang koon turag nimen wurd. 
-Luke oner, of dü det uk würelk du wel, an do seekre din feranerangen.',
+'undo-success' => 'Detdiar feranrang koon turag nimen wurd. 
+Luke oner, of dü det uk würelk du wel, an do seekre din feranrangen.',
 'undo-failure' => 'Jü änring köö ai tunintemååged wårde, deer di bedrååwede oufsnaas intwasche feränred wörd.',
 'undo-norev' => 'Jü beårbing köö ai tunintemååged wårde, deer jü ai bestoont unti sleeked wörd.',
 'undo-summary' => 'Änring $1 foon [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjoon]]) tunintemååged.',
@@ -926,7 +928,7 @@ Dü heest deeraw nåån tugraawe.',
 'revdelete-modify-missing' => "Bi't bewerkin faan ID $1 as wat skiaf gingen: At waant uun a dootenbeenk!",
 'revdelete-no-change' => "'''Waarskau:''' Di iindrach faan di $1, am a klook $2 hää al jodiar iinstelangen.",
 'revdelete-concurrent-change' => "Bi't bewerkin faan di iindrach di $1, am a klook $2 as wat skiaf gingen: At sjocht so ütj, üs wan hoker ööders det bewerket hää, iar dü det bewerke wulst. Luke iin uun a logbuken.",
-'revdelete-only-restricted' => "Bi't fersteegen faan di iindrach di $1, am a klook $2 as wat skiaf gingen: Dü könst di iindrach ei föör administratooren fersteeg, saner ööder iinstelangen tu feranerin.",
+'revdelete-only-restricted' => "Bi't fersteegen faan di iindrach di $1, am a klook $2 as wat skiaf gingen: Dü könst di iindrach ei föör administratooren fersteeg, saner ööder iinstelangen tu feranrin.",
 'revdelete-reason-dropdown' => "*Grünjer för't striken san miast
 ** Copyright woort ei iinhäälen
 ** Persöönelk informatsjuunen, diar näämen wat uungung",
@@ -1059,9 +1061,9 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 # Preferences page
 'preferences' => 'Önjstalinge',
 'mypreferences' => 'Önjstalinge',
-'prefs-edits' => 'Taal faan feranerangen:',
+'prefs-edits' => 'Taal faan feranrangen:',
 'prefsnologin' => 'Ai önjmälded',
-'prefsnologintext' => 'Dü skel <span class="plainlinks">[{{fullurl:{{#special:UserLogin}}|returnto=$1}} uunmeldet]</span> wees, am din iinstelangen tu feranerin.',
+'prefsnologintext' => 'Dü skel <span class="plainlinks">[{{fullurl:{{#special:UserLogin}}|returnto=$1}} uunmeldet]</span> wees, am din iinstelangen tu feranrin.',
 'changepassword' => 'Pååsuurd änre',
 'prefs-skin' => 'Skak',
 'skin-preview' => 'Forlök',
@@ -1075,12 +1077,12 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'prefs-watchlist' => "Uun't uug behual",
 'prefs-watchlist-days' => "So föl daar uun't uug behual:",
 'prefs-watchlist-days-max' => 'Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}',
-'prefs-watchlist-edits' => 'Ei muar feranerangen üs:',
+'prefs-watchlist-edits' => 'Ei muar feranrangen üs:',
 'prefs-watchlist-edits-max' => 'Ai mör as 1000',
 'prefs-watchlist-token' => "Token för uun't uug behualen:",
 'prefs-misc' => 'Dit än dat',
 'prefs-resetpass' => 'Pååsuurd änre',
-'prefs-changeemail' => 'Feranere det E-Mail-adres',
+'prefs-changeemail' => 'Feranre det E-Mail-adres',
 'prefs-setemail' => 'E-Mail-adres fäästlei:',
 'prefs-email' => 'E-Mail iinstelangen',
 'prefs-rendering' => 'Skak',
@@ -1095,10 +1097,10 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'resultsperpage' => 'So fölsis komt det föör per sidj:',
 'stub-threshold' => 'Formatiarang faan links <a href="#" class="stub">för letj sidjen</a> (uun Byte):',
 'stub-threshold-disabled' => 'Ufsteld',
-'recentchangesdays' => 'Soföl daar skel a „leetst feranerangen“ uunwise:',
+'recentchangesdays' => 'Soföl daar skel a „leetst feranrangen“ uunwise:',
 'recentchangesdays-max' => 'Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}',
-'recentchangescount' => 'Soföl feranerangen skel uunwiset wurd:',
-'prefs-help-recentchangescount' => 'Det san a leetst feranerangen, wersjuunen an logbuken.',
+'recentchangescount' => 'Soföl feranrangen skel uunwiset wurd:',
+'prefs-help-recentchangescount' => 'Det san a leetst feranrangen, wersjuunen an logbuken.',
 'prefs-help-watchlist-token' => "Wan dü detdiar fial mä en hiamelken code ütjfalst, woort en RSS-feed iinracht. Arken mä didiar code koon do sä, wat dü uun't uug behual wel. Diaram skul hi ei so ianfach wees, nem dach didiar: $1",
 'savedprefs' => 'Din iinstelangen san seekert wurden.',
 'timezonelegend' => 'Tidjsoon:',
@@ -1164,9 +1166,9 @@ Do san jo ual iinstelangen wech.',
 'prefs-advancedrendering' => 'Ütwided möölikhäide',
 'prefs-advancedsearchoptions' => 'Ütwided möölikhäide',
 'prefs-advancedwatchlist' => 'Ütwided möölikhäide',
-'prefs-displayrc' => "Mögelkhaiden för't uunwisen",
-'prefs-displaysearchoptions' => "Mögelkhaiden för't uunwisen",
-'prefs-displaywatchlist' => "Mögelkhaiden för't uunwisen",
+'prefs-displayrc' => "Mögelkhaiden för't uunwisin",
+'prefs-displaysearchoptions' => "Mögelkhaiden för't uunwisin",
+'prefs-displaywatchlist' => "Mögelkhaiden för't uunwisin",
 'prefs-diffs' => 'Ferskeel',
 
 # User preference: e-mail validation using jQuery
@@ -1178,45 +1180,45 @@ Do san jo ual iinstelangen wech.',
 'userrights-lookup-user' => 'Brükersköölen bewerke',
 'userrights-user-editname' => 'Brükernööm:',
 'editusergroup' => 'Brükersköölen bewerke',
-'editinguser' => "Brükerrochten faan '''[[User:$1|$1]]''' $2 feranere",
+'editinguser' => "Brükerrochten faan '''[[User:$1|$1]]''' $2 feranre",
 'userrights-editusergroup' => 'Lasmootskap tu brükersköölen bewerke',
 'saveusergroups' => 'Brükersköölen seekre',
 'userrights-groupsmember' => 'Lasmoot faan:',
 'userrights-groupsmember-auto' => 'Faan salew lasmoot faan:',
-'userrights-groups-help' => 'Dü könst feranere, tu hün brükerskööl di brüker hiirt:
+'userrights-groups-help' => 'Dü könst feranre, tu hün brükerskööl di brüker hiirt:
 * En uunkrüsagt kasche ment, di brüker hiirt diartu.
 * En ei uunkrüsagt kasche ment, di brüker hiart ei diartu.
 * En * ment, dat dü det brükerrocht ei weder wechnem könst (of amkiard).',
 'userrights-reason' => 'Grünj:',
-'userrights-no-interwiki' => 'Dü heest ei det rocht, am brükerrochten uun ööder wikis tu feranerin.',
+'userrights-no-interwiki' => 'Dü heest ei det rocht, am brükerrochten uun ööder wikis tu feranrin.',
 'userrights-nodatabase' => 'Det dootenbeenk $1 jaft at ei, tumanst ei lokaal.',
-'userrights-nologin' => 'Dü mutst di mä en administraator-brükerkonto [[Special:UserLogin|uunmelde]], wan dü brükerrochten feranere wel.',
-'userrights-notallowed' => 'Dü heest ei det rocht, am brükerrochten tu feranerin.',
-'userrights-changeable-col' => 'Lasmootskapen, diar dü feranere könst',
-'userrights-unchangeable-col' => 'Lasmootskapen, diar dü ei feranere könst',
+'userrights-nologin' => 'Dü mutst di mä en administraator-brükerkonto [[Special:UserLogin|uunmelde]], wan dü brükerrochten feranre wel.',
+'userrights-notallowed' => 'Dü heest ei det rocht, am brükerrochten tu feranrin.',
+'userrights-changeable-col' => 'Lasmootskapen, diar dü feranre könst',
+'userrights-unchangeable-col' => 'Lasmootskapen, diar dü ei feranre könst',
 
 # Groups
 'group' => 'Skööl:',
-'group-user' => 'Brükere',
-'group-autoconfirmed' => 'Registriirde brükere',
+'group-user' => 'Brükern',
+'group-autoconfirmed' => 'Registriaret brükern',
 'group-bot' => 'Bots',
-'group-sysop' => 'Administratoore',
-'group-bureaucrat' => 'Bürokraate',
+'group-sysop' => 'Administratooren',
+'group-bureaucrat' => 'Bürokraaten',
 'group-suppress' => 'Oversighter',
 'group-all' => '(aaltumaal)',
 
 'group-user-member' => '{{GENDER:$1|brüker}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|gudkäänd brüker}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|registriaret brüker}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => '{{GENDER:$1|administraator}}',
 'group-bureaucrat-member' => '{{GENDER:$1|bürokraat}}',
 'group-suppress-member' => '{{GENDER:$1|oversighter}}',
 
-'grouppage-user' => '{{ns:project}}:Brükere',
-'grouppage-autoconfirmed' => '{{ns:project}}:Registriirde brükere',
+'grouppage-user' => '{{ns:project}}:Brükern',
+'grouppage-autoconfirmed' => '{{ns:project}}:Registriaret brükern',
 'grouppage-bot' => '{{ns:project}}:Bots',
-'grouppage-sysop' => '{{ns:project}}:Administratoore',
-'grouppage-bureaucrat' => '{{ns:project}}:Bürokraate',
+'grouppage-sysop' => '{{ns:project}}:Administratooren',
+'grouppage-bureaucrat' => '{{ns:project}}:Bürokraaten',
 'grouppage-suppress' => '{{ns:project}}:Oversighter',
 
 # Rights
@@ -1225,6 +1227,7 @@ Do san jo ual iinstelangen wech.',
 'right-createpage' => 'Sidjen maage (saner diskusjuunssidjen)',
 'right-createtalk' => 'Diskusjuunssidjen maage',
 'right-createaccount' => 'Brükerkonto iinracht',
+'right-minoredit' => 'Feranrangen üs letj kääntiakne',
 'right-move' => 'Sidjen fersküüw',
 'right-move-subpages' => 'Sidjen mä onersidjen fersküüw',
 'right-move-rootuserpages' => 'Hood-brükersidj fersküüw',
@@ -1238,16 +1241,18 @@ Do san jo ual iinstelangen wech.',
 'right-purge' => 'Sidjen-cache leesag maage saner efterfraagin',
 'right-autoconfirmed' => 'Hualew-seekert sidjen bewerke',
 'right-bot' => 'Automatisiaret bewerke',
-'right-nominornewtalk' => 'Letj feranerangen üüb diskusjuunssidjen wurd ei üs „nei noorachten“ uunwiset.',
+'right-nominornewtalk' => 'Letj feranrangen üüb diskusjuunssidjen wurd ei üs „nei noorachten“ uunwiset.',
 'right-apihighlimits' => 'Huuger taalen für API-uunfraagen brük',
 'right-writeapi' => 'Write-API brük',
 'right-delete' => 'Sidjen strik',
 'right-bigdelete' => 'Sidjen mä föl wersjuunen strik',
 'right-deleterevision' => 'Enkelt wersjuunen faan en sidj strik of turaghaale',
+'right-browsearchive' => 'Sjük stregen sidjen',
 'right-sendemail' => 'E-mails tu oudere brükere schake',
 
 # User rights log
 'rightslog' => 'Ruchte-logbök',
+'rightsnone' => '(-)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'jüdeer sid leese',
@@ -1255,28 +1260,34 @@ Do san jo ual iinstelangen wech.',
 'action-createpage' => 'side mååge',
 'action-createtalk' => 'diskusjoonside mååge',
 'action-createaccount' => 'jüdeer brükerkonto mååge',
+'action-minoredit' => 'detdiar feranrang üs letj kääntiakne',
 'action-move' => 'jüdeer sid ferschüwe',
 'action-move-subpages' => 'jüdeer sid än unerside ferschüwe',
+'action-move-rootuserpages' => 'hood-brükersidj fersküüw',
 'action-movefile' => 'jüdeer sid ferschüwe',
+'action-delete' => 'detdiar sidj strik',
+'action-browsearchive' => 'sjük stregen sidjen',
+'action-undelete' => 'detdiar sidj weder iinstel',
+'action-sendemail' => 'e-mails sjüür',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|änring|änringe}}',
 'recentchanges' => 'Leeste änringe',
 'recentchanges-legend' => 'Wis-opsjoone',
-'recentchanges-summary' => "Üüb detheer sidj könst dü a leetst feranerangen faan '''{{SITENAME}}''' ferfulge.",
+'recentchanges-summary' => "Üüb detdiar sidj könst dü a leetst feranrangen faan't Nuurdfresk Wikipedia ferfulge.",
 'recentchanges-feed-description' => 'Ferfülie ma dåtheer feed da leeste änringe önj {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Nei sidj uunlaanj',
-'recentchanges-label-minor' => 'Letj feranerang',
-'recentchanges-label-bot' => 'Feranerang faan en bot',
-'recentchanges-label-unpatrolled' => 'Detheer feranerang as noch ei efterluket wurden',
+'recentchanges-label-minor' => 'Letj feranrang',
+'recentchanges-label-bot' => 'Feranrang faan en bot',
+'recentchanges-label-unpatrolled' => 'Detdiar feranrang as noch ei efterluket wurden',
 'rcnote' => "Wised {{PLURAL:\$1|wård '''1''' änring|wårde da leeste '''\$''' änringe}} {{PLURAL:\$2|foon e leest däi|foon da leeste '''\$2''' deege}}. Stånd: \$4, am e klook \$5.",
-'rcnotefrom' => "Diar wurd a feranerangen sant '''$2'''uunwiset (ei muar üs '''$1''' feranerangen).",
+'rcnotefrom' => "Diar wurd a feranrangen sant '''$2'''uunwiset (ei muar üs '''$1''' feranrangen).",
 'rclistfrom' => 'Bloot änringe sunt $1 wise.',
 'rcshowhideminor' => 'Latje änringe $1',
 'rcshowhidebots' => 'Bots $1',
 'rcshowhideliu' => 'Önjmäldede brükere $1',
 'rcshowhideanons' => 'Anonymen brüker $1',
-'rcshowhidepatr' => '$1 efterluket feranerangen',
+'rcshowhidepatr' => '$1 efterluket feranrangen',
 'rcshowhidemine' => 'Äine tujeefte $1',
 'rclinks' => 'Wis da leeste $1 änringe foon da leeste $2 deege.<br />$3',
 'diff' => 'ferschääl',
@@ -1285,29 +1296,48 @@ Do san jo ual iinstelangen wech.',
 'show' => 'önjbläne',
 'minoreditletter' => 'L',
 'newpageletter' => 'N',
-'boteditletter' => 'b',
+'boteditletter' => 'B',
 'rc-enhanced-expand' => 'Detaile wise (JavaScript as nüsi)',
 'rc-enhanced-hide' => 'Detaile fersteege',
+'rc-old-title' => 'tuiarst maaget üs „$1“',
 
 # Recent changes linked
-'recentchangeslinked' => 'Änringe bai ferlinkte side',
-'recentchangeslinked-toolbox' => 'Feranerangen bi ferlinkt sidjen',
-'recentchangeslinked-title' => 'Änringe bai side, da foon "$1" ferlinked san',
-'recentchangeslinked-noresult' => 'Uun detdiar tidj san jo ferwiset sidjen ei feranert wurden.',
+'recentchangeslinked' => 'Feranrangen bi ferlinket sidjen',
+'recentchangeslinked-feed' => 'Feranrangen bi ferlinket sidjen',
+'recentchangeslinked-toolbox' => 'Feranrangen bi ferlinket sidjen',
+'recentchangeslinked-title' => 'Feranrangen bi sidjen, diar faan "$1" ferlinket san',
+'recentchangeslinked-noresult' => 'Uun detdiar tidj san jo ferlinket sidjen ei feranert wurden.',
 'recentchangeslinked-summary' => "Jüdeer speetsjoolsid listet da leeste änringe bai da ferlinked side ap (btw. bai kategoriie tu da lasmoote foon jüdeer kategorii). Side aw din [[Special:Watchlist|eefterkiikliste]] san '''fåt''' deerstald.",
 'recentchangeslinked-page' => 'Sid:',
 'recentchangeslinked-to' => 'Wis änringe aw side, da heerjurt ferlinke',
 
 # Upload
 'upload' => 'Huuchschake',
+'uploadbtn' => 'Datei huuchsjüür',
 'uploadnologin' => 'Ai önjmälded',
 'uploadnologintext' => 'Dü möist [[Special:UserLogin|önjmälded weese]], am dat dü dootäie huuchsiinje koost.',
 'upload_directory_missing' => 'Dåt aplees-fertiiknis ($1) breecht än köö ai foon di wäbsärwer mååged wårde.',
 'upload_directory_read_only' => 'Dåt aplees-fertiiknis ($1) koon ai foon e wäbsärver beschraawen wårde.',
 'uploaderror' => 'Aplees-fäägel',
+'uploadlog' => 'datei logbuk',
 'uploadlogpage' => 'Dåtäi-logbök',
 'filedesc' => 'Beskriiwang',
+'fileuploadsummary' => 'Beskriiwang',
+'filesource' => 'Kwel',
+'uploadedfiles' => 'Huuchsjüürd dateien',
 'uploadedimage' => 'heet "[[$1]]" huuchsånd',
+'watchthisupload' => 'Luke efter detdiar datei',
+
+'upload-file-error' => 'Diar as wat skiaf gingen',
+
+# File backend
+'backend-fail-stream' => 'Det datei $1 küd ei auerdraanj wurd.',
+'backend-fail-delete' => 'Det datei $1 küd ei stregen wurd.',
+'backend-fail-store' => 'Det datei $1 küd ei oner $2 seekert wurd.',
+'backend-fail-copy' => 'Det datei $1 küd ei efter $2 kopiaret wurd.',
+'backend-fail-move' => 'Det datei $1 küd ei efter $2 fersköwen wurd.',
+'backend-fail-read' => 'Det datei $1 küd ei leesen wurd.',
+'backend-fail-create' => 'Det datei $1 küd ei seekert wurd.',
 
 'license' => 'Lisens:',
 'license-header' => 'Lisens',
@@ -1340,7 +1370,7 @@ Det beskriiwang faan't [$2 beskriiwangssidj] woort oner uunwiset.",
 'randompage' => 'Tufali sid',
 
 # Statistics
-'statistics' => 'Statistiik',
+'statistics' => 'Statistik',
 
 'disambiguationspage' => 'Template:Muardüüdag artiikel',
 
@@ -1770,11 +1800,15 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 'monthsall' => 'åle',
 'limitall' => 'åle',
 
+# Table pager
+'ascending_abbrev' => 'ap',
+'descending_abbrev' => 'deel',
+
 # Auto-summaries
-'autosumm-blank' => 'Det sidj wurd leesagd.',
-'autosumm-replace' => 'Di iinhual wurd ütjbütjet mä "$1"',
+'autosumm-blank' => 'Det sidj as leesag maaget wurden.',
+'autosumm-replace' => 'Di tekst as ütjbütjet wurden mä "$1"',
 'autoredircomment' => 'Sidj tu [[$1]] widjerfeerd',
-'autosumm-new' => 'Det sidj wurd nei uunlaanj: "$1"',
+'autosumm-new' => 'Det sidj as nei uunlaanj wurden: "$1"',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Eefterkiiklist: änringe',
@@ -1809,6 +1843,17 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 'htmlform-selectorother-other' => 'Oudere',
 
 # New logging system
+'logentry-delete-delete' => '$1 hää det sidj $3 stregen',
+'logentry-delete-restore' => '$1 hää det sidj $3 weder iinsteld',
+'logentry-delete-event' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-delete-revision' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
+'logentry-delete-event-legacy' => '$1 hää det uunlukin feranert faan logbuk iindracher üüb $3',
+'logentry-delete-revision-legacy' => '$1 hää det uunlukin feranert faan wersjuunen faan det sidj $3',
+'logentry-suppress-delete' => '$1 hää det sidj $3 wechtrakt',
+'logentry-suppress-event' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-suppress-revision' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
+'logentry-suppress-event-legacy' => '$1 hää stalswigin det uunlukin fernanert faan logbuk iindracher üüb $3',
+'logentry-suppress-revision-legacy' => '$1 hää stalswigin det uunlukin feranert faan wersjuunen faan det sidj $3',
 'revdelete-uname-hid' => 'brükernoome ferstäägen',
 'revdelete-uname-unhid' => 'brükernoome frijääwen',
 'revdelete-restricted' => 'gränse jüle uk for administratoore',
@@ -1818,4 +1863,15 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 'logentry-move-move_redir' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen.',
 'logentry-move-move_redir-noredirect' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen saner salew en widjerfeerang uuntuleien.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunden}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minüüt|minüüten}}',
+'duration-hours' => '$1 {{PLURAL:$1|stünj|stünjen}}',
+'duration-days' => '$1 {{PLURAL:$1|dai|daar}}',
+'duration-weeks' => '$1 {{PLURAL:$1|weg|wegen}}',
+'duration-years' => '$1 {{PLURAL:$1|juar|juaren}}',
+'duration-decades' => '$1 {{PLURAL:$1|juartjiint|juartjiinten}}',
+'duration-centuries' => '$1 {{PLURAL:$1|juarhunert|juarhunerten}}',
+'duration-millennia' => '$1 {{PLURAL:$1|juardüüsen|juardüüsenen}}',
+
 );
index e4f32ab..2fe2c25 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Friulian (Furlan)
+/** Friulian (furlan)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
index 8e3c271..ee72895 100644 (file)
@@ -182,7 +182,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Bewurkings fan oanmelde brûkers op myn folchlist ferbergje',
 'tog-watchlisthideanons' => 'Bewurkings fa anonyme brûkers op myn folchlist ferbergje',
 'tog-watchlisthidepatrolled' => 'Markearre feroarings op myn folchlist ferskûlje',
-'tog-nolangconversion' => 'Fariantomsetting útskeakelje',
 'tog-ccmeonemails' => "Stjoer my in kopy fan e-mails dy't ik nei oare brûkers stjoer",
 'tog-diffonly' => "Side-ynhâld dy't feroare wurdt net sjen litte",
 'tog-showhiddencats' => 'Ferburgen kategoryen werjaan',
@@ -1259,9 +1258,9 @@ Jo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwi
 Wat oanbean en wat wiske wurdt, wurdt delskreaun yn it [[Special:Log/upload|lochboek]].
 
 Om de triem yn in side op te nimmen, meitsje jo dêr sa'n keppeling:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_foto.jpg]]</nowiki></tt>''', foar grutte ferzje,
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_logo.png|omskriuwing]]</nowiki></tt>''' foar 200 in piksel ferzje, mei 'alternative tekst' as beskriuwing, of
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:jo_lûd.ogg]]</nowiki></tt>''', foar direkt keppeling nei de triem (sûnder byld).",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_foto.jpg]]</nowiki></code>''', foar grutte ferzje,
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:jo_logo.png|omskriuwing]]</nowiki></code>''' foar 200 in piksel ferzje, mei 'alternative tekst' as beskriuwing, of
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:jo_lûd.ogg]]</nowiki></code>''', foar direkt keppeling nei de triem (sûnder byld).",
 'upload-permitted' => 'Talitten triemtypen: $1.',
 'upload-preferred' => 'Oanwiisde triemtypen: $1.',
 'upload-prohibited' => 'Ferbeane triemtypen: $1.',
@@ -1293,20 +1292,20 @@ Jou de triem in oare namme en besykje him dan op\'e nij heech te laden.',
 'emptyfile' => "De triem dy jo heechladen hawwe liket leech te wêzen.
 Dat soe komme kinne fan in typflater yn 'e triemnamme.
 Gean nei oft jo dizze triem wier bedoelden heech te laden.",
-'fileexists' => "Der bestiet al in triem mei dizze namme.
-Kontrolearje '''<tt>[[:$1]]</tt>''' as jo net wis binne oft jo de besteande triem oerskriuwe wolle.
-[[$1|thumb]]",
-'filepageexists' => "De beskriuwingsside foar dizze triem bestiet al op '''<tt>[[:$1]]</tt>''', mar der bestiet gjin triem mei dizze namme.
+'fileexists' => 'Der bestiet al in triem mei dizze namme.
+Kontrolearje <strong>[[:$1]]</strong> as jo net wis binne oft jo de besteande triem oerskriuwe wolle.
+[[$1|thumb]]',
+'filepageexists' => "De beskriuwingsside foar dizze triem bestiet al op <strong>[[:$1]]</strong>, mar der bestiet gjin triem mei dizze namme.
 De gearfetting dy't jo opjûn hawwe sil net op 'e beskriuwingsside ferskine.
 Bewurkje de side mei de hân om de beskriuwing dêr wer te jaan.",
 'fileexists-extension' => "In triem mei deselde namme bestiet al: [[$2|thumb]]
-* Namme fan 'e heechladene triem: '''<tt>[[:$1]]</tt>'''
-* Namme fan 'e besteande triem: '''<tt>[[:$2]]</tt>'''
+* Namme fan 'e heechladene triem: <strong>[[:$1]]</strong>
+* Namme fan 'e besteande triem: <strong>[[:$2]]</strong>
 Kies in oare namme.",
 'fileexists-thumbnail-yes' => "De triem liket in ferlytse ferzje te wêzen ''(miniatuerôfbylding)''. [[$1|thumb]]
-Kontrolearje de triem '''<tt>[[:$1]]</tt>'''.
+Kontrolearje de triem <strong>[[:$1]]</strong>.
 As de kontrolearre triem deselde ôfbylding fan deselde grutte is, dan hoecht net in ekstra miniatuerôfbylding oanbean te wurden.",
-'file-thumbnail-no' => "De triemnamme begjint mei '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "De triemnamme begjint mei <strong>$1</strong>.
 It liket in ferlytse ôfbylding te wêzen ''(miniatuerôfbylding)''.
 As jo dy ôfbylding yn folsleine resolúsje hawwe, bied him dan oan.
 Feroarje oars de triemnamme.",
@@ -1455,7 +1454,7 @@ Der is ek in [[Special:WhatLinksHere/$2|folsleine list]].',
 # MIME search
 'mimesearch' => 'Sykje op MIME-type',
 'mimesearch-summary' => 'Dizze side makket it filterjen mûglik fan triemmen foar it MIME-type.
-Ynfier: contenttype/subtype, bygelyks <tt>image/jpeg</tt>.',
+Ynfier: contenttype/subtype, bygelyks <code>image/jpeg</code>.',
 'mimetype' => 'MIME-type:',
 'download' => 'oanbiede',
 
@@ -1636,7 +1635,7 @@ Sjuch ek [[Special:WantedCategories|net-besteande kategoryen mei ferwizings]].',
 'linksearch-ns' => 'Nammerûmte:',
 'linksearch-ok' => 'Sykje',
 'linksearch-text' => 'Wildcards lykas "*.wikipedia.org" of "*.org" binne tastien.<br />
-Stipe protokollen: <tt>$1</tt>',
+Stipe protokollen: <code>$1</code>',
 'linksearch-line' => '$1 hat in ferwizing yn $2',
 'linksearch-error' => 'Wildcards binne allinne tastien oan it begjin fan in hostnamme.',
 
index 3e333dc..522a976 100644 (file)
  * @author Tameamseo
  * @author Urhixidur
  * @author לערי ריינהארט
+ * @author පසිඳු කාවින්ද
  */
 
 $magicWords = array(
-       'redirect'                => array( '0', '#athsheoladh', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__GANCÁ__', '__NOTOC__' ),
-       'forcetoc'                => array( '0', '__CÁGACHUAIR__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__CÁ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__GANMHÍRATHRÚ__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'MÍLÁITHREACH', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'AINMNAMÍOSALÁITHREAÍ', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'GINAINMNAMÍOSALÁITHREAÍ', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'GIORRÚNAMÍOSALÁITHREAÍ', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'LÁLÁITHREACH', 'CURRENTDAY' ),
-       'currentdayname'          => array( '1', 'AINMANLAELÁITHRIGH', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'BLIAINLÁITHREACH', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'AMLÁITHREACH', 'CURRENTTIME' ),
-       'numberofarticles'        => array( '1', 'LÍONNANALT', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'LÍONNAGCOMHAD', 'NUMBEROFFILES' ),
-       'pagename'                => array( '1', 'AINMANLGH', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'AINMANLGHB', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'AINMSPÁS', 'NAMESPACE' ),
-       'msg'                     => array( '0', 'TCHT:', 'MSG:' ),
-       'subst'                   => array( '0', 'IONAD:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'TCHTFS:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'mionsamhail', 'mion', 'thumbnail', 'thumb' ),
-       'img_right'               => array( '1', 'deas', 'right' ),
-       'img_left'                => array( '1', 'clé', 'left' ),
-       'img_none'                => array( '1', 'faic', 'none' ),
-       'img_center'              => array( '1', 'lár', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'fráma', 'frámaithe', 'framed', 'enframed', 'frame' ),
-       'int'                     => array( '0', 'INMH:', 'INT:' ),
-       'sitename'                => array( '1', 'AINMANTSUÍMH', 'SITENAME' ),
-       'ns'                      => array( '0', 'AS:', 'NS:' ),
-       'localurl'                => array( '0', 'URLÁITIÚIL', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URLÁITIÚILB', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'FREASTALAÍ', 'SERVER' ),
-       'servername'              => array( '0', 'AINMANFHREASTALAÍ', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SCRIPTCHOSÁN', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'GRAMADACH:', 'GRAMMAR:' ),
-       'notitleconvert'          => array( '0', '__GANTIONTÚNADTEIDEAL__', '__GANTT__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__GANTIONTÚNANÁBHAIR__', '__GANTA__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'SEACHTAINLÁITHREACH', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'LÁLÁITHREACHNAS', 'CURRENTDOW' ),
-       'revisionid'              => array( '1', 'IDANLEASAITHE', 'REVISIONID' ),
+       'redirect'                  => array( '0', '#athsheoladh', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__GANCÁ__', '__NOTOC__' ),
+       'forcetoc'                  => array( '0', '__CÁGACHUAIR__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__CÁ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__GANMHÍRATHRÚ__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'MÍLÁITHREACH', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'AINMNAMÍOSALÁITHREAÍ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'GINAINMNAMÍOSALÁITHREAÍ', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'GIORRÚNAMÍOSALÁITHREAÍ', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'LÁLÁITHREACH', 'CURRENTDAY' ),
+       'currentdayname'            => array( '1', 'AINMANLAELÁITHRIGH', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'BLIAINLÁITHREACH', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'AMLÁITHREACH', 'CURRENTTIME' ),
+       'numberofarticles'          => array( '1', 'LÍONNANALT', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'LÍONNAGCOMHAD', 'NUMBEROFFILES' ),
+       'pagename'                  => array( '1', 'AINMANLGH', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'AINMANLGHB', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'AINMSPÁS', 'NAMESPACE' ),
+       'msg'                       => array( '0', 'TCHT:', 'MSG:' ),
+       'subst'                     => array( '0', 'IONAD:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'TCHTFS:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'mionsamhail', 'mion', 'thumbnail', 'thumb' ),
+       'img_right'                 => array( '1', 'deas', 'right' ),
+       'img_left'                  => array( '1', 'clé', 'left' ),
+       'img_none'                  => array( '1', 'faic', 'none' ),
+       'img_center'                => array( '1', 'lár', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'fráma', 'frámaithe', 'framed', 'enframed', 'frame' ),
+       'int'                       => array( '0', 'INMH:', 'INT:' ),
+       'sitename'                  => array( '1', 'AINMANTSUÍMH', 'SITENAME' ),
+       'ns'                        => array( '0', 'AS:', 'NS:' ),
+       'localurl'                  => array( '0', 'URLÁITIÚIL', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URLÁITIÚILB', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'FREASTALAÍ', 'SERVER' ),
+       'servername'                => array( '0', 'AINMANFHREASTALAÍ', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SCRIPTCHOSÁN', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'GRAMADACH:', 'GRAMMAR:' ),
+       'notitleconvert'            => array( '0', '__GANTIONTÚNADTEIDEAL__', '__GANTT__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__GANTIONTÚNANÁBHAIR__', '__GANTA__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'SEACHTAINLÁITHREACH', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'LÁLÁITHREACHNAS', 'CURRENTDOW' ),
+       'revisionid'                => array( '1', 'IDANLEASAITHE', 'REVISIONID' ),
 );
 
 $namespaceNames = array(
@@ -578,6 +579,12 @@ Chun d'iarratas logáil isteach a chríochnú, caithfidh tú focal faire nua a r
 'resetpass-submit-cancel' => 'Cealaigh',
 'resetpass-temp-password' => 'Focal faire sealadach:',
 
+# Special:PasswordReset
+'passwordreset-username' => 'Ainm úsáideora:',
+
+# Special:ChangeEmail
+'changeemail-cancel' => 'Cealaigh',
+
 # Edit page toolbar
 'bold_sample' => 'Cló trom',
 'bold_tip' => 'Cló trom',
@@ -739,6 +746,7 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
 # Revision deletion
 'rev-deleted-user' => '(ainm úsáideora dealaithe)',
 'rev-delundel' => 'taispeáin/folaigh',
+'rev-showdeleted' => 'taispeáin',
 'revisiondelete' => 'Scrios/díscrios leagain',
 'revdelete-show-file-confirm' => 'An bhfuil tú cinnte gur mhaith leat féach ar leasú scriosta don chomhad "<nowiki>$1</nowiki>" ó $2 ag $3?',
 'revdelete-show-file-submit' => 'Tá',
@@ -746,6 +754,7 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
 'logdelete-selected' => "'''{{PLURAL:$1|Teagmhas log roghnaithe|Teagmhais log roghnaithe}}:'''",
 'revdelete-hide-text' => 'Folaigh leagan téacs',
 'revdelete-radio-same' => 'ná hathraigh',
+'revdelete-radio-unset' => 'Ní',
 'revdel-restore' => 'athraigh infheictheacht',
 'pagehist' => 'Stair leathanach',
 'deletedhist' => 'Stair scriosta',
@@ -810,6 +819,7 @@ Bain triail as ''all:'' a chur roimh d'iarratas chun an t-inneachar ar fad (leat
 'powersearch-redir' => 'Liosta athsheoltaí',
 'powersearch-field' => 'Cuardaigh le',
 'powersearch-toggleall' => 'Uile',
+'powersearch-togglenone' => 'Tada',
 'searchdisabled' => "Tá brón orainn! Mhíchumasaíodh an cuardach téacs iomlán go sealadach chun luas an tsuímh a chosaint. Idir an dá linn, is féidir leat an cuardach Google anseo thíos a úsáid - b'fhéidir go bhfuil sé as dáta.",
 
 # Quickbar
@@ -1003,9 +1013,9 @@ Tá na leathanaigh ar do [[Special:Watchlist|liosta faire]] i '''gcló trom'''."
 Chun comhaid atá ann cheana a fheiceáil nó a chuardach téigh chuig an [[Special:FileList|liosta comhad uaslódáilte]]. Gheobhaidh tú liosta de chomhaid uaslódáilte sa [[Special:Log/upload|loga uaslódála]] agus liosta de chomhaid scriosta sa [[Special:Log/delete|loga scriosta]] freisin.
 
 Chun comhad a úsáid ar leathanach, cuir isteach nasc mar seo:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:comhad.jpg]]</nowiki></tt>''' chun leagan iomlán an chomhad a úsáid
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:comhad.png|200px|thumb|left|téacs eile]]</nowiki></tt>''' chun comhad le 200 picteillín ar leithead i mbosca san imeall clé le 'téacs eile' mar tuairisc
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:comhad.ogg]]</nowiki></tt>''' más comhad fuaime atá i gceist",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:comhad.jpg]]</nowiki></code>''' chun leagan iomlán an chomhad a úsáid
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:comhad.png|200px|thumb|left|téacs eile]]</nowiki></code>''' chun comhad le 200 picteillín ar leithead i mbosca san imeall clé le 'téacs eile' mar tuairisc
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:comhad.ogg]]</nowiki></code>''' más comhad fuaime atá i gceist",
 'upload-permitted' => 'Cineálacha comhaid ceadaithe: $1.',
 'uploadlog' => 'Stair uaslódála',
 'uploadlogpage' => 'Stair_uaslódála',
@@ -1255,6 +1265,7 @@ Beidh do seoladh ríomhphoist a d\'iontráil tú i [[Special:Preferences|do chui
 'defemailsubject' => 'Ríomhphost {{GRAMMAR:genitive|{{SITENAME}}}}',
 'noemailtitle' => 'Níl aon seoladh ríomhphoist ann',
 'noemailtext' => 'Níor thug an úsáideoir seo seoladh ríomhphoist bhailí.',
+'emailusername' => 'Ainm úsáideora:',
 'emailfrom' => 'Seoltóir:',
 'emailto' => 'Chuig:',
 'emailsubject' => 'Ábhar:',
@@ -1409,6 +1420,7 @@ Is féidir an leibhéal glasála a athrú, ach ní féidir cur isteach ar an ghl
 'pagesize' => '(bearta)',
 
 # Restrictions (nouns)
+'restriction-edit' => 'Cuir in eagar',
 'restriction-create' => 'Cruthaigh',
 'restriction-upload' => 'Uaslódaigh',
 
@@ -1431,6 +1443,7 @@ Is an téacs as na leagan scriosta seo ar fáil do riarthóirí amháin.',
 'undelete-revision' => 'Leagan scriosta $1 (ó $4, ar $5) le $3:',
 'undeletebtn' => 'Díscrios!',
 'undeletelink' => 'féach/díscrios',
+'undeleteviewlink' => 'Amharc',
 'undeletereset' => 'Athshocraigh',
 'undeleteinvert' => 'Cuir an roghnú bun os cionn',
 'undeletecomment' => 'Tuairisc:',
@@ -1644,6 +1657,9 @@ Sa dara cás, is féidir leat nasc a úsáid, mar shampla [[{{#Special:Export}}/
 'allmessagestext' => 'Is liosta é seo de theachtaireachtaí córais atá le fáil san ainmspás MediaWiki.
 Tabhair cuairt ar [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] agus [//translatewiki.net translatewiki.net] le do thoil más mian leat cur leis an logánú ginearálta MediaWiki.',
 'allmessagesnotsupportedDB' => "Ní féidir an leathanach seo a úsáid dá bharr gur díchumasaíodh '''\$wgUseDatabaseMessages'''.",
+'allmessages-filter-all' => 'Uile',
+'allmessages-language' => 'Teanga:',
+'allmessages-filter-submit' => 'Gabh',
 
 # Thumbnails
 'thumbnail-more' => 'Méadaigh',
@@ -1654,6 +1670,7 @@ Tabhair cuairt ar [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
 'import' => 'Iompórtáil leathanaigh',
 'importinterwiki' => 'Iompórtáil trasna vicithe',
 'import-interwiki-submit' => 'iompórtáil',
+'import-comment' => 'Nóta tráchta:',
 'importtext' => 'Easportáil an comhad ón vici-fhoinse (le húsáid na [[Special:Export|tréithe easportáil]]), sábháil ar do dhíosca é agus uaslódáil anseo é.',
 'import-revision-count' => '{{PLURAL:$1|Leagan amháin|$1 leagain}}',
 'importnopages' => 'Níl aon leathanaigh chun iompórtáil',
@@ -1950,6 +1967,9 @@ Beidh na cinn eile ceilte de réir réamhshocraithe.
 'exif-gpsareainformation' => 'Ainm an cheantair GPS',
 'exif-gpsdatestamp' => 'Dáta GPS',
 'exif-gpsdifferential' => 'Ceartú difreálach GPS',
+'exif-source' => 'Foinse',
+'exif-languagecode' => 'Teanga',
+'exif-iimcategory' => 'Catagóir',
 
 # EXIF attributes
 'exif-compression-1' => 'Neamh-chomhbhrúite',
@@ -2092,6 +2112,7 @@ cúlra i bhfócas)',
 'watchlistall2' => 'an t-iomlán',
 'namespacesall' => 'iad uile',
 'monthsall' => 'gach mí',
+'limitall' => 'iad uile',
 
 # E-mail address confirmation
 'confirmemail' => 'Deimhnigh do ríomhsheoladh',
@@ -2145,6 +2166,7 @@ Rachaidh an cód deimhnithe seo as feidhm ag $4.',
 'table_pager_prev' => 'Leathanach roimhe',
 'table_pager_first' => 'Céad leathanach',
 'table_pager_last' => 'Deireadh leathanach',
+'table_pager_limit_submit' => 'Gabh',
 'table_pager_empty' => 'Folamh',
 
 # Auto-summaries
@@ -2179,6 +2201,7 @@ Rachaidh an cód deimhnithe seo as feidhm ag $4.',
 'version-license' => 'Ceadúnas',
 'version-software' => 'Bogearraí suiteáilte',
 'version-software-version' => 'Leagan',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Cosán comhaid',
@@ -2204,4 +2227,11 @@ Rachaidh an cód deimhnithe seo as feidhm ag $4.',
 # Special:BlankPage
 'blankpage' => 'Leathanach bán',
 
+# HTML forms
+'htmlform-selectorother-other' => 'Eile',
+
+# Feedback
+'feedback-message' => 'Teachtaireacht:',
+'feedback-cancel' => 'Cealaigh',
+
 );
index fd490b0..bb10a36 100644 (file)
@@ -93,7 +93,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#YÖNNENDİRMÄKLER', '#YÖNNENDİR', '#YÖNNENDİRMÄ', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#YÖNNENDİRMÄKLER', '#YÖNNENDİR', '#YÖNNENDİRMÄ', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ),
 );
 
 $messages = array(
index decfa8b..64c800e 100644 (file)
 $fallback = 'gan-hant, zh-hant, zh-hans';
 
 $namespaceNames = array(
-       NS_MEDIA            => 'Media',
-       NS_SPECIAL          => 'Special',
-       NS_TALK             => 'Talk',
-       NS_USER             => 'User',
-       NS_USER_TALK        => 'User_talk',
-       NS_PROJECT_TALK     => '$1_talk',
-       NS_FILE             => 'File',
-       NS_FILE_TALK        => 'File_talk',
-       NS_MEDIAWIKI        => 'MediaWiki',
-       NS_MEDIAWIKI_TALK   => 'MediaWiki_talk',
-       NS_TEMPLATE         => 'Template',
-       NS_TEMPLATE_TALK    => 'Template_talk',
-       NS_HELP             => 'Help',
-       NS_HELP_TALK        => 'Help_talk',
-       NS_CATEGORY         => 'Category',
-       NS_CATEGORY_TALK    => 'Category_talk',
+       NS_MEDIA            => '媒體',
+       NS_SPECIAL          => '特別',
+       NS_TALK             => '談詑',
+       NS_USER             => '用戶',
+       NS_USER_TALK        => '用戶・談詑',
+       NS_PROJECT_TALK     => '$1_談詑',
+       NS_FILE             => '文檔',
+       NS_FILE_TALK        => '文檔・談詑',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki・談詑',
+       NS_TEMPLATE         => '模板',
+       NS_TEMPLATE_TALK    => '模板・談詑',
+       NS_HELP             => '幫助',
+       NS_HELP_TALK        => '幫助・談詑',
+       NS_CATEGORY         => '分類',
+       NS_CATEGORY_TALK    => '分類・談詑',
 );
 
 $messages = array(
index f9ea105..6187ec1 100644 (file)
@@ -74,7 +74,6 @@ $messages = array(
 'tog-watchlisthideliu' => '到监视清单里头弆到登入用户',
 'tog-watchlisthideanons' => '到监视清单里头弆到匿名用户',
 'tog-watchlisthidepatrolled' => '到监视清单里头弆到巡查过𠮶编辑',
-'tog-nolangconversion' => '嫑字转换',
 'tog-ccmeonemails' => '偶发email到人家时也发封副本到偶',
 'tog-diffonly' => '比较两只版本差异𠮶时间伓显示文章𠮶内容',
 'tog-showhiddencats' => '显示弆到𠮶分类',
@@ -941,9 +940,9 @@ $2',
 要眵或要寻先前上传𠮶图像请去[[Special:FileList|图像列表]],上传同删除会记到[[Special:Log/upload|上传日志]]里度。
 
 要系想扻文件到页面,用得正下底𠮶方式链接:
-'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''',
-'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|alt text]]</nowiki></tt>''' 或
-'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' 直接连接到个只文件。",
+'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''',
+'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|alt text]]</nowiki></code>''' 或
+'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' 直接连接到个只文件。",
 'upload-permitted' => '容许𠮶文件类型:$1。',
 'upload-preferred' => '优先𠮶文件类型:$1。',
 'upload-prohibited' => '禁止𠮶文件类型:$1。',
@@ -966,15 +965,15 @@ $2',
 'large-file' => '建议档案𠮶大小伓要超吥$1;本档案大小系$2。',
 'largefileserver' => '个只档案要大过服务器配置容允𠮶大小。',
 'emptyfile' => '倷上传𠮶档案伓存在。个可能系因为档案名按错嘞。请检查倷系否真𠮶要上传个只档案。',
-'fileexists' => "个只档案名已存在。如果倷确定伓正倷系否要改佢,请检查'''<tt>[[:$1]]</tt>'''。 [[$1|thumb]]",
-'fileexists-extension' => "有嘞只飞像𠮶档名: [[$2|thumb]]
-* 上载文档𠮶档名: '''<tt>[[:$1]]</tt>'''
-* 目前档𠮶档名: '''<tt>[[:$2]]</tt>'''
-请拣只伓同𠮶名字。",
+'fileexists' => '个只档案名已存在。如果倷确定伓正倷系否要改佢,请检查<strong>[[:$1]]</strong>。 [[$1|thumb]]',
+'fileexists-extension' => '有嘞只飞像𠮶档名: [[$2|thumb]]
+* 上载文档𠮶档名: <strong>[[:$1]]</strong>
+* 目前档𠮶档名: <strong>[[:$2]]</strong>
+请拣只伓同𠮶名字。',
 'fileexists-thumbnail-yes' => "个只档案好像系一只图像𠮶缩小版''(缩图)''。 [[$1|thumb]]
-请检查清楚个只档案'''<tt>[[:$1]]</tt>'''
+请检查清楚个只档案<strong>[[:$1]]</strong>
 如果检查后𠮶档同原先图像𠮶大小系一样𠮶话,就嫑再上传多一只缩图。",
-'file-thumbnail-no' => "个只档案名系以'''<tt>$1</tt>'''开头。佢好像一只图像𠮶缩小版''(缩图)''。如果倷有个只图像𠮶完整版,伓然请再改过只档名。",
+'file-thumbnail-no' => "个只档案名系以<strong>$1</strong>开头。佢好像一只图像𠮶缩小版''(缩图)''。如果倷有个只图像𠮶完整版,伓然请再改过只档名。",
 'fileexists-forbidden' => '个只档案名已存在;请回头并换过只新𠮶名称来上传个只档案。[[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => '到共用档案库里度有嘞同名𠮶档案;请回头并换过只新𠮶名称来上传个只档案。[[File:$1|thumb|center|$1]]',
 'uploadwarning' => '上传警告',
@@ -1076,7 +1075,7 @@ $2',
 
 # MIME search
 'mimesearch' => 'MIME搜索',
-'mimesearch-summary' => '个只页面启用档案MIME类型筛检程式。输入:内容类型/子类型,像 <tt>image/jpeg</tt>。',
+'mimesearch-summary' => '个只页面启用档案MIME类型筛检程式。输入:内容类型/子类型,像 <code>image/jpeg</code>。',
 'mimetype' => 'MIME 类型:',
 'download' => '下载',
 
index c50da29..bf73fb7 100644 (file)
@@ -96,7 +96,6 @@ $messages = array(
 'tog-watchlisthideliu' => '到監視清單裡頭弆到登入用戶',
 'tog-watchlisthideanons' => '到監視清單裡頭弆到匿名用戶',
 'tog-watchlisthidepatrolled' => '到監視清單裡頭弆到巡查過嗰編輯',
-'tog-nolangconversion' => '嫑字轉換',
 'tog-ccmeonemails' => '我發email到人家時也發封副本到我',
 'tog-diffonly' => '比較兩隻版本差異嗰時間伓顯示文章嗰內容',
 'tog-showhiddencats' => '顯示弆到嗰分類',
@@ -988,15 +987,15 @@ $2',
 'large-file' => '建議檔案嗰大小伓要超吥$1;本檔案大小係$2。',
 'largefileserver' => '箇隻檔案要大過服務器配置容允嗰大小。',
 'emptyfile' => '倷上傳嗰檔案伓存在。箇可能係因為檔案名按錯嘞。請檢查倷係否真嗰要上傳箇隻檔案。',
-'fileexists' => "箇隻檔案名已存在。如果倷確定伓正倷係否要改佢,請檢查'''<tt>[[:$1]]</tt>'''。 [[$1|thumb]]",
-'fileexists-extension' => "有嘞隻飛像嗰檔名: [[$2|thumb]]
-* 上載文檔嗰檔名: '''<tt>[[:$1]]</tt>'''
-* 目前檔嗰檔名: '''<tt>[[:$2]]</tt>'''
-請揀隻伓同嗰名字。",
+'fileexists' => '箇隻檔案名已存在。如果倷確定伓正倷係否要改佢,請檢查<strong>[[:$1]]</strong>。 [[$1|thumb]]',
+'fileexists-extension' => '有嘞隻飛像嗰檔名: [[$2|thumb]]
+* 上載文檔嗰檔名: <strong>[[:$1]]</strong>
+* 目前檔嗰檔名: <strong>[[:$2]]</strong>
+請揀隻伓同嗰名字。',
 'fileexists-thumbnail-yes' => "箇隻檔案好像係一隻圖像嗰縮小版''(縮圖)''。 [[$1|thumb]]
-請檢查清楚箇隻檔案'''<tt>[[:$1]]</tt>'''
+請檢查清楚箇隻檔案<strong>[[:$1]]</strong>
 如果檢查後嗰檔同原先圖像嗰大小係一樣嗰話,就嫑再上傳多一隻縮圖。",
-'file-thumbnail-no' => "箇隻檔案名係以'''<tt>$1</tt>'''開頭。佢好像一隻圖像嗰縮小版''(縮圖)''。如果倷有箇隻圖像嗰完整版,伓然請再改過隻檔名。",
+'file-thumbnail-no' => "箇隻檔案名係以<strong>$1</strong>開頭。佢好像一隻圖像嗰縮小版''(縮圖)''。如果倷有箇隻圖像嗰完整版,伓然請再改過隻檔名。",
 'fileexists-forbidden' => '箇隻檔案名已存在;請回頭並換過隻新嗰名稱來上傳箇隻檔案。[[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => '到共用檔案庫裡度有嘞同名嗰檔案;請回頭並換過隻新嗰名稱來上傳箇隻檔案。[[File:$1|thumb|center|$1]]',
 'uploadwarning' => '上傳警告',
@@ -1098,7 +1097,7 @@ $2',
 
 # MIME search
 'mimesearch' => 'MIME 搜尋',
-'mimesearch-summary' => '箇隻頁面啟用檔案MIME類型篩檢程式。輸入:內容類型/子類型,像 <tt>image/jpeg</tt>。',
+'mimesearch-summary' => '箇隻頁面啟用檔案MIME類型篩檢程式。輸入:內容類型/子類型,像 <code>image/jpeg</code>。',
 'mimetype' => 'MIME 類型:',
 'download' => '下載',
 
index 8d25e60..cf837a4 100644 (file)
@@ -42,7 +42,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Falaich mùthaidhean fo fhaire ann an liosta nam mùthaidhean ùra',
 'tog-newpageshidepatrolled' => 'Falaich duilleagan fo fhaire ann an liosta nan duilleagan ùra',
 'tog-extendwatchlist' => "Leudaich an clàr-faire gus an seall e gach mùthadh 's chan ann an fheadhainn as ùire a-mhàin",
-'tog-usenewrc' => 'Cleachd mùthaidhean ùra leasaichte (feumaidh seo JavaScript)',
+'tog-usenewrc' => "Buidhnich na h-atharraichean a-rèir duilleige sna mùthaidhean ùra agus air a' chlàr-fhaire (feumaidh seo JavaScript)",
 'tog-numberheadings' => 'Cuir àireamhan ri ceann-sgrìobhaidhean leis fhèin',
 'tog-showtoolbar' => 'Seall am bàr-inneil deasachaidh (feumaidh seo JavaScript)',
 'tog-editondblclick' => 'Tòisich air deasachadh duilleige le briogadh dùbailt (feumaidh seo JavaScript)',
@@ -50,17 +50,17 @@ $messages = array(
 'tog-editsectiononrightclick' => "Cuir an comas deasachadh earainn le briogadh deas air tiotal de dh'earrainn (feumaidh seo JavaScript)",
 'tog-showtoc' => 'Seall an clàr-innse (air duilleagan air a bheil barrachd air 3 ceann-sgrìobhaidhean)',
 'tog-rememberpassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|latha|latha|làithean|latha}})",
-'tog-watchcreations' => 'Cuir duilleagan a chruthaicheas mi air mo chlàr-faire',
-'tog-watchdefault' => 'Cuir duilleagan a dheasaicheas mi air mo chlàr-faire',
-'tog-watchmoves' => 'Cuir duilleagan a ghluaiseas mi air mo chlàr-faire',
-'tog-watchdeletion' => 'Cuir duilleagan a sguabas mi às air mo chlàr-faire',
+'tog-watchcreations' => "Cuir duilleagan a chruthaicheas mi air a' chlàr-fhaire agam",
+'tog-watchdefault' => "Cuir duilleagan a dheasaicheas mi air a' chlàr-fhaire agam",
+'tog-watchmoves' => "Cuir duilleagan a ghluaiseas mi air a' chlàr-fhaire agam",
+'tog-watchdeletion' => "Cuir duilleagan a sguabas mi às air a' chlàr-fhaire agam",
 'tog-minordefault' => 'Comharraich gach mùthadh mar mhùthadh beag a ghnàth',
 'tog-previewontop' => "Nochd an ro-shealladh os cionn a' bhogsa deasachaidh",
 'tog-previewonfirst' => "Nochd an ro-shealladh nuair a nithear a' chiad deasachadh",
 'tog-nocache' => 'Cuir à comas tasgadh nan duilleagan',
-'tog-enotifwatchlistpages' => 'Cuir post-dealain thugam nuair a chuirear mùthadh air duilleag a tha air mo chlàr-faire',
+'tog-enotifwatchlistpages' => "Cuir post-dealain thugam nuair a mhùthar duilleag a tha air a' chlàr-fhaire agam",
 'tog-enotifusertalkpages' => 'Cuir post-dealain thugam nuair a mhùthaichear duilleag mo chonaltraidh',
-'tog-enotifminoredits' => 'Cuir post-dealain thugam nuair a chuirear mùthadh beag air duilleagan cuideachd',
+'tog-enotifminoredits' => 'Cuir post-dealain thugam nuair a nithear mùthadh beag air duilleagan cuideachd',
 'tog-enotifrevealaddr' => 'Nochd an seòladh puist-dhealain agam ann am teachdaireachdan fiosrachaidh',
 'tog-shownumberswatching' => "Nochd àireamh nan cleachdaichean a tha a' cumail sùil air",
 'tog-oldsig' => 'An t-earr-sgrìobhadh làithreach:',
@@ -131,18 +131,18 @@ $messages = array(
 'october-gen' => 'dhen Dàmhair',
 'november-gen' => 'dhen t-Samhain',
 'december-gen' => 'dhen Dùbhlachd',
-'jan' => 'faoi',
-'feb' => 'gibl',
-'mar' => 'màrt',
-'apr' => 'gibl',
-'may' => 'cèit',
-'jun' => 'ògmh',
-'jul' => 'iuch',
-'aug' => 'lùna',
-'sep' => 'sult',
-'oct' => 'dàmh',
-'nov' => 'samh',
-'dec' => 'dùbh',
+'jan' => 'Faoi',
+'feb' => 'Gearr',
+'mar' => 'Màrt',
+'apr' => 'Gibl',
+'may' => 'Cèit',
+'jun' => 'Ã\92gmh',
+'jul' => 'Iuch',
+'aug' => 'Lùna',
+'sep' => 'Sult',
+'oct' => 'Dàmh',
+'nov' => 'Samh',
+'dec' => 'Dùbh',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}',
@@ -251,7 +251,7 @@ $messages = array(
 'otherlanguages' => 'Ann an cànain eile',
 'redirectedfrom' => '(Air ath-sheòladh o $1)',
 'redirectpagesub' => 'Ath-sheòl an duilleag',
-'lastmodifiedat' => 'Chaidh an duilleag seo a mhùthadh $1, aig $2 turas mu dheireadh.',
+'lastmodifiedat' => 'Chaidh an duilleag seo a mhùthadh $1 aig $2 turas mu dheireadh.',
 'viewcount' => 'Chaidh inntrigeadh a dhèanam dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turas|$1 turais|$1 turas}}.',
 'protectedpage' => 'Duilleag fo dhìon',
 'jumpto' => 'Gearr leum gu:',
@@ -353,9 +353,9 @@ Gheibh thu liosta nan duilleagan sònraichte 's dligheach aig [[Special:SpecialP
 'dberrortext' => 'Thachair mearachd co-chàraidh rè iarrtas an stòir-dhàta.
 Faodaidh gu bheil seo a\' comharrachadh mearachd sa bhathar-bhog.
 Seo iarrtas an stòir-dhàta mu dheireadh a chaidh feuchainn ris:
-<blockquote><tt>$1</tt></blockquote>
-o bhroinn an fhoincsein "<tt>$2</tt>".
-Thill an stòr-dàta a\' mhearachd "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+o bhroinn an fhoincsein "<code>$2</code>".
+Thill an stòr-dàta a\' mhearachd "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Thachair mearachd co-chàraidh rè iarrtas an stòir-dhàta.
 Seo iarrtas an stòir-dhàta mu dheireadh a chaidh feuchainn ris:
 "$1"
@@ -564,8 +564,38 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
 'passwordreset-pretext' => '{{PLURAL:$1||Cuir a-steach aon dhe na pìosan dàta gu h-ìosal}}',
 'passwordreset-username' => 'Ainm-cleachdaiche:',
 'passwordreset-domain' => 'Àrainn-lìn:',
+'passwordreset-capture' => "A bheil thu airson coimhead air a' phost-d?",
+'passwordreset-capture-help' => 'Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.',
 'passwordreset-email' => 'Seòladh puist-d:',
 'passwordreset-emailtitle' => "Dàta a' chunntais air {{SITENAME}}",
+'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas|an dà chunntas|na cunntasan|na cunntasan|na cunntasan|na cunntasan}} a leanas co-cheangailte ris a' phost-d seo:
+
+$2
+
+Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an dà fhacal-faire|na faclan-faire|na faclan-faire|na faclan-faire|na faclan-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
+'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas agad air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an dà chunntas-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
+
+$2
+
+Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an dà fhacal-faire|na faclan-faire|na faclan-faire|na faclan-faire|na faclan-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
+'passwordreset-emailelement' => 'Ainm-cleachdaiche: $1
+Facal-faire sealach: $2',
+'passwordreset-emailsent' => "Chaidh cuimhneachan a chur air a' phost-d.",
+'passwordreset-emailsent-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal.",
+'passwordreset-emailerror-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Atharraich am post-d',
+'changeemail-header' => "Atharraich cunntas a' phuist-d",
+'changeemail-text' => 'Lìon am foirm seo gus am post-d agad atharrachadh. Feumaidh tu am facal-faire agad a chur a-steach a-rithist gus a dhearbhadh.',
+'changeemail-no-info' => 'Feumaidh tu clàradh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.',
+'changeemail-oldemail' => 'An seòladh puist-d làithreach:',
+'changeemail-newemail' => 'An seòladh puist-d ùr:',
+'changeemail-none' => '(chan eil gin)',
+'changeemail-submit' => 'Atharraich am post-d',
+'changeemail-cancel' => 'Sguir dheth',
 
 # Edit page toolbar
 'bold_sample' => 'Teacs trom',
@@ -595,12 +625,57 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
 'savearticle' => 'Sàbhail an duilleag',
 'preview' => 'Ro-shealladh',
 'showpreview' => 'Seall an ro-shealladh',
+'showlivepreview' => 'Ro-shealladh beò',
 'showdiff' => 'Seall na mùthaidhean',
 'anoneditwarning' => "'''Rabhadh:''' Chan eil thu air logadh a-steach.
 Thèid an seòladh IP agad a chlàrachadh ann an eachdraidh na duilleige seo.",
+'anonpreviewwarning' => "''Chan eil thu air clàradh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.''",
+'missingsummary' => "'''Cuimhnich:''' Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.
+Ma bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
+'missingcommenttext' => 'Cuir a-steach beachd gu h-ìosal.',
+'missingcommentheader' => "'''Cuimhnich:''' Cha dug thu seachad cuspair/ceann airson a' bheachd seo.
+Ma bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
 'summary-preview' => "Ro-shealladh a' ghearr-chunntais:",
+'subject-preview' => "Ro-shealladh air a' chuspair/air a' cheann:",
 'blockedtitle' => 'Tha an cleachdair air a bhacadh',
+'blockedtext' => "''Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.'''
+
+'S e \$1 a chur am bacadh seo ort.
+Thug iad an cèill gun do rinn iad sinn air sgàth an adhbhair seo: ''\$2''.
+
+* Toiseach a' bhacaidh: \$8
+* Deireadh a' bhacaidh: \$6
+* An neach air a bheil am bacadh: \$7
+
+'S urrainn dhut fios a chur gu \$1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.
+Chan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.
+'S e \$3 an seòladh IP làithreach agus agus 's e #\$5 ID a' bhacaidh.
+Thoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+'autoblockedtext' => "''Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le \$1.'''
+Thug iad an cèill gun do rinn iad sinn air sgàth an adhbhair seo: 
+
+:''\$2''.
+
+* Toiseach a' bhacaidh: \$8
+* Deireadh a' bhacaidh: \$6
+* An neach air a bheil am bacadh: \$7
+
+'S urrainn dhut fios a chur gu \$1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.
+
+Dh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.
+
+'S e \$3 an seòladh IP làithreach agus agus 's e #\$5 ID a' bhacaidh.
+Thoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+'blockednoreason' => 'cha deach adhbhar a shònrachadh',
+'whitelistedittext' => 'Feumaidh tu $1 mus urrainn dhut duilleagan a dheasachadh.',
+'confirmedittext' => "Feumaidh tu am post-d agad a dhearbhadh mus urrainn dhut duilleagan a dheasachadh.
+Suidhich is dearbhaich am post-d agad ann an [[Special:Preferences|roghainnean a' chleachdaiche]]",
+'nosuchsectiontitle' => 'Cha ghabh an earrann a lorg',
+'nosuchsectiontext' => "Dh'fheuch thu ri earrann a dheasachadh nach eil ann.
+Dh'fhaoidte gun deach a ghluasad no a sguabadh às fhad 's a bha thu a' coimhead air an duilleag.",
+'loginreqtitle' => 'Feumaidh tu clàradh a-steach',
 'loginreqlink' => 'log a-steach',
+'loginreqpagetext' => 'Feumaidh tu $1 mus urrainn dhut coimhead air duilleagan eile.',
 'accmailtitle' => 'Facal-faire air a chur.',
 'accmailtext' => "Chaidh facal-faire a chruthachadh air thuaiream airson [[User talk:$1|$1]] 's a chur gu $2.
 
@@ -609,6 +684,10 @@ Gabhaidh am facal-faire airson a' chunntais ùir seo atharrachadh air an fo ''[[
 'newarticletext' => "Lean thu ri ceangal gu duilleag nach eil ann fhathast.
 Cuir teacs sa bhogsa gu h-ìosal gus an duilleag seo a chruthachadh (seall air [[{{MediaWiki:Helppage}}|duilleag na cobharach]] airson barrachd fiosrachaidh).
 Mura robh dùil agad ris an duilleag seo a ruigsinn, briog air a' phutan '''air ais''' 'nad bhrabhsair.",
+'anontalkpagetext' => "----''Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.
+Feumaidh sinn an àireamh IP aca a chleachdadh air sgàth sin.
+Faodadh grunn chleachdaichean seòladh IP mar a chleachdadh còmhla.
+Mas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:UserLogin/signup|clàraich thu]] no [[Special:UserLogin|clàraich a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?''",
 'noarticletext' => 'Chan eil teacsa sam bith anns an duilleag seo an-dràsta.
 \'S urrainn dhut [[Special:Search/{{PAGENAME}}|an tiotal seo a lorg]] ann an duilleagan eile,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh],
@@ -616,11 +695,49 @@ no [{{fullurl:{{FULLPAGENAME}}|action=edit}} an duilleag seo a dheasachadh]</spa
 'noarticletext-nopermission' => 'Chan eil teacsa sam bith anns an duilleag seo an-dràsta.
 \'S urrainn dhut [[Special:Search/{{PAGENAME}}|an tiotal seo a lorg]] ann an duilleagan eile,
 no <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span>.',
+'userpage-userdoesnotexist' => 'Chan e cunntas clàraichte a tha ann an "$1".
+Dèan cinnteach gu bheil thu airson an duilleag seo a chruthachadh/dheasachadh.',
+'userpage-userdoesnotexist-view' => 'Cha deach an cunntas cleachdaiche "$1" a chlàradh.',
+'blocked-notice-logextract' => "Tha an cleachdaiche seo air a bhacadh an-dràsta fhèin.
+Chì thu loga a' bhacaidh mu dheireadh gu h-ìosal mar fhiosrachadh dhut:",
+'clearyourcache' => "'''An aire:''' As dèidh dhut sàbhaladh, 's mathaid gum bi agad tasgadan a' bhrabhsair agad a chur air gleus mus fhaic thu na dh'atharraich thu.
+* '''Firefox / Safari:''' Cum 'shìos 'Shift'' is briog air ''Ath-luchdaich' no brùth ''Ctrl-F5'' no ''Ctrl-R'' (''⌘-R'' air Mac)
+* '''Google Chrome:''' Brùth ''Ctrl-Shift-R'' (''⌘-Shift-R'' air Mac)
+* '''Internet Explorer:''' Cum shìos ''Ctrl'' is briog air ''Ath-nuadhaich'' no brùth ''Ctrl-F5''
+* '''Opera:''' Falamhaich an tasgadan ann an ''Innealan → Roghainnean''",
+'usercssyoucanpreview' => "'''Gliocas:''' Cleachd am putan \"{{int:showpreview}}\" airson an CSS agad a chur fo dheuchainn mus sàbhail thu e.",
+'userjsyoucanpreview' => "'''Gliocas:''' Cleachd am putan \"{{int:showpreview}}\" gus an JavaScript ùr agad a chur fo dheuchainn mus sàbhail thu e.",
+'usercsspreview' => "'''Cuimhnich nach e seo ach ro-shealladh air a' CSS chleachdaiche agad.'''
+'''Cha deach a shàbhaladh fhathast!''''",
+'userjspreview' => "'''Cuimhnich nach e seo ach ro-shealladh/deuchainn air a' JavaScript agad.'''
+'''Cha deach a shàbhaladh fhathast!''''",
+'sitecsspreview' => "'''Cuimhnich nach e seo ach ro-shealladh air a' CSS agad.'''
+'''Cha deach a shàbhaladh fhathast!''''",
+'sitejspreview' => "'''Cuimhnich nach e seo ach ro-shealladh air còd a' JavaScript agad.'''
+'''Cha deach a shàbhaladh fhathast!''''",
+'userinvalidcssjstitle' => "'''Rabhadh:''' Chan eil an craiceann \"\$1\" ann.
+Cleachdaidh duilleagan gnàthaichte .css agus .js tiotal ann an litrichean beaga, m.e. {{ns:user}}:Foo/vector.css seach {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Air ùrachadh)',
+'note' => "'''An aire:'''",
 'previewnote' => "'''Cuimhnich nach eil ann ach ro-shealladh.'''
 Cha deach na mùthaidhean agad a shàbhaladh fhathast!",
+'previewconflict' => "Tha an ro-shealladh seo a' sealltainn dhut an teacsa san raon teacsa gu h-àrd mar a nochdas e ma shàbhaileas tu an-dràsta.",
+'session_fail_preview' => "'''Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.'''
+Nach fheuch thu ris a-rithist?
+Mur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
+'session_fail_preview_html' => "'''Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.'''
+
+''A chionn 's gun do chuir {{SITENAME}} HTML amh an comas, tha an ro-shealladh falaichte mar dhìon an aghaidh ionnsaighean JavaScript.''
+
+'''Mas e deasachadh dligheach a tha seo, feuch ris a-rithist.'''
+Mur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
+'token_suffix_mismatch' => "'''Dhiùlt sinn na dheasaich thu a chionn 's gun do chuir an cliant agad na caractaran puingeachaidh tro chèile san tòcan deasachaidh.'''
+Dhiùlt sinn na dheasaich thu air eagal 's gun coirbeadh e teacsa na duilleige.
+Tachraidh seo uaireannan ma chleachdar seirbheis-lìn progsaidh gun urra a tha làn de mhearachdan.",
+'edit_form_incomplete' => "'''Cha do ràinig cuid dhen fhoirm deasachaidh am frithealaichte; dèan cinnteach gu bheil gach deasachadh agad slàn is feuch ris a-rithist.'''",
 'editing' => "A' deasachadh $1",
 'editingsection' => "A' deasachadh $1 (earrann)",
+'editingcomment' => "A' deasachadh $1 (earrann ùr)",
 'editconflict' => 'Còmhstri deasachaidh: $1',
 'explainconflict' => "Tha cuideigin eile air an duilleag seo a mhùthadh on a thòisich thu fhèin air a dheasachadh.
 Tha am bogsa teacsa gu h-àrd a' nochdadh na duilleige mar a tha i an-dràsta.
@@ -629,6 +746,8 @@ Bidh agad ris na mùthaidhean agad fhilleadh a-steach san teacsa làithreach.
 Cha dèid '''ach an teacsa gu h-àrd''' a shàbhaladh nuair a bhriogas tu air \"{{int:savearticle}}\".",
 'yourtext' => 'An teacsa agad',
 'storedversion' => 'Lethbhreac taisgte',
+'nonunicodebrowser' => "'''Rabhadh: Chan eil am brabhsair agad co-chòrdail le Unicode.'''
+Chuir sinn gleus air dòigh dhut a nì cinnteach gun urrainn dhut duilleagan a shàbhaladh gu tèarainte: Nochdaidh caractaran taobh a-muigh ASCII mar chòd sia-dheicheach sa bhogsa deasachaidh.",
 'editingold' => "'''RABHADH: Tha thu a' deasachadh lethbhreac seann-aimsireil na duilleige seo.
 Ma shàbhalas tu seo, thèid gach mùthadh air chall a rinneadh a-mach on mhùthadh seo.'''",
 'yourdiff' => 'Caochlaidhean',
@@ -640,13 +759,33 @@ Tha thu a' toirt geall cuideachd gun do sgrìobh thu fhèin seo no gun do rinn t
 Mur eil thu ag iarraidh an sgrìobhaidh agad a dheasaichear is a sgaoilear le càch, na cuir e.<br />
 Ma dh'fhoilleachas tu rudeigin an seo, bidh tu a' dearbhadh gun do sgrìobh thu fhèin e, no gur ann às an raon phòballach a thàinig e; thoir aire '''nach eil''' sin a' gabhail a-staigh duilleagan-lìn mar as àbhaist (seall $1 airson barrachd fiosrachaidh). <br />
 '''NA CLEACHDAIBH SAOTHAIR FO DHLIGHE-SGRÌOBHAIDH GUN CHEAD!'''",
+'longpageerror' => "'''Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$1 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|}}).'''
+Cha ghabh a shàbhaladh.",
+'readonlywarning' => "'''Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na còraichean-deasachaidh agad a chur gu feum an-dràsta fhèin.'''
+'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.
+
+Seo am mìneachadh a thug an rianaire a ghlais e: $1",
 'protectedpagewarning' => "'''Rabhadh: Chaidh an duilleag seo a dhìon 's chan urrainn ach dhan fheadhainn aig a bheil ùghdarras rianaire a dheasachadh.'''
 Chì thu an clàr mu dheireadh san loga mar fhiosrachadh dhut gu h-ìosal:",
+'semiprotectedpagewarning' => "'''An aire:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach cleachdaichean clàraichte a dheasachadh.
+Seo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
+'cascadeprotectedwarning' => "'''Rabhadh:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha cascade-protected.",
+'titleprotectedwarning' => "'''Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.'''
+Seo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
 'templatesused' => "Tha {{PLURAL:$1|teamplaid|theamplaid||teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
 'templatesusedpreview' => "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh}} san ro-shealladh seo:",
+'templatesusedsection' => "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh}} san earrann seo:",
 'template-protected' => '(air a dhìon)',
 'template-semiprotected' => '(air a leth-dhìon)',
 'hiddencategories' => "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
+'nocreatetitle' => 'Tha cruthachadh dhuilleagan cuingichte',
+'nocreatetext' => "Chuir {{SITENAME}} bacadh air cruthachadh de dhuilleagan ùra.
+'S urrainn dhut tilleadh is duilleag a tha ann mu thràth a dheasachadh no [[Special:UserLogin|clàradh a-steach no cunntas a chruthachadh]].",
+'nocreate-loggedin' => 'Chan eil cead agad duilleagan ùra a chruthachadh.',
+'sectioneditnotsupported-title' => 'Chan eil taic ri deasachadh earrannan',
+'sectioneditnotsupported-text' => 'Chan eil taic ri deasachadh earrannan air an duilleag seo.',
+'permissionserrors' => "Meareachd leis a' chead",
+'permissionserrorstext' => 'Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan|an adhbhair|nan adhbharan|nan adhbharan}} a leanas:',
 'permissionserrorstext-withaction' => 'Chan eil cead agad airson "$2" air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan|an adhbhair|nan adhbharan|nan adhbharan}} a leanas:',
 'recreate-moveddeleted-warn' => "'''Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.'''
 
@@ -654,14 +793,31 @@ Saoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.
 Seo dhut loga an sguabaidh às agus a' ghluasaid mar fhiosrachadh dhut:",
 'moveddeleted-notice' => "Chaidh an duilleag seo a sguabadh às.
 Chì thu loga an sguabaidh às agus a' ghluasaid gu h-ìosal mar fhiosrachadh dhut.",
+'log-fulllog' => 'Seall an loga slàn',
+'edit-hook-aborted' => 'Sguireadh dhen deasachadh ri linn dubhan.
+Cha deach adhbhar a thoirt seachad.',
+'edit-gone-missing' => "Cha b' urrainn dhuinn an duilleag ath-nuadhachadh.
+Tha coltas gun deach a sguabadh às.",
+'edit-conflict' => 'Còmhstri deasachaidh.',
+'edit-no-change' => "Chaidh an obair-dheasachaidh agad a leigeil seachad a chionn 's nach do dh'atharraich thu dad.",
+'edit-already-exists' => "Cha b' urrainn dhuinn an duilleag ùr a chruthachadh.
+Tha e ann mu thràth.",
 
 # Parser/template warnings
+'expensive-parserfunction-warning' => "'''Rabhadh:''' Tha cus expensive parser function calls san duilleag seo.
+
+Bu chòir nas lugha na $2 {{PLURAL:$2|call|calls}} a bhith ann ach tha {{PLURAL:$1|$1 call|$1 calls}} ann.",
+'expensive-parserfunction-category' => 'Duilleagan le cus expensive parser function calls',
 'post-expand-template-inclusion-warning' => "'''Rabhadh:''' Tha meud na teamplaide ro mhòr.
 Cha dèid cuid dhith a ghabhail a-steach.",
 'post-expand-template-inclusion-category' => "Duilleagan far a bheil meud nan teamplaidean a' dol thairis air na tha ceadaichte",
 'post-expand-template-argument-warning' => "'''Rabhadh:''' Tha aon argamaid teamplaid air a' char as lugha air an duilleag seo aig a bheil meud leudachaidh ro mhòr.
 Chaidh na h-argamaidean sinn a leigeil seachad.",
 'post-expand-template-argument-category' => 'Duilleagan air an deach argamaidean teamplaidean fhàgail às',
+'parser-template-loop-warning' => 'Mhothaicheadh do lùb teamplaid: [[$1]]',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'Cha ghabh an cunntas a chruthachadh',
 
 # History pages
 'viewpagelogs' => 'Seall logaichean na duilleige seo',
@@ -682,16 +838,31 @@ Mìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, ''
 'history-show-deleted' => 'Na chaidh sguabadh às a-mhàin',
 'histfirst' => 'As sine',
 'histlast' => 'As ùire',
+'historyempty' => '(falamh)',
 
 # Revision feed
+'history-feed-title' => 'Eachdraidh nam mùthaidhean',
+'history-feed-description' => 'Eachdraidh nam mùthaidhean airson na duilleige seo air an uici',
 'history-feed-item-nocomment' => '$1 $2',
+'history-feed-empty' => "Chan eil an duilleag a dh'iarr thu ann.
+Dh'fhaoidte gun deach a sguabadh às an uici no gun deach ainm ùr a chur air.
+Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 
 # Revision deletion
+'rev-deleted-comment' => '(chaidh gearr-chunntas an deasachaidh a thoirt air falbh)',
+'rev-deleted-user' => '(chaidh an t-ainm-cleachdaiche a thoirt air falbh)',
+'rev-deleted-event' => '(chaidh gnìomh an loga a thoirt air falbh)',
 'rev-delundel' => 'seall/falaich',
+'rev-showdeleted' => 'seall',
+'revdelete-hide-user' => 'Falaich ainm-cleachdaiche/seòladh IP an deasaiche',
 'revdel-restore' => 'mùth follaiseachd',
 'revdel-restore-deleted' => 'mùthaidhean a chaidh a sguabadh às',
 'revdel-restore-visible' => 'mùthaidhean faicsinneach',
 
+# History merging
+'mergehistory-from' => 'An duilleag thùsail:',
+'mergehistory-reason' => 'Adhbhar:',
+
 # Merge log
 'revertmerge' => 'Dì-aontaich',
 
@@ -739,6 +910,7 @@ Mìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, ''
 'search-interwiki-more' => '(barrachd)',
 'search-mwsuggest-enabled' => 'le molaidhean',
 'search-mwsuggest-disabled' => 'gun mholaidhean',
+'search-relatedarticle' => 'Co-cheangailte',
 'searchrelated' => 'co-cheangailte',
 'searchall' => 'a h-uile',
 'showingresults' => "A' nochdadh suas gu $1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
@@ -753,6 +925,9 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'powersearch-redir' => 'Seall ath-sheòlaidhean',
 'powersearch-field' => 'Lorg',
 
+# Quickbar
+'qbsettings-none' => 'Chan eil gin',
+
 # Preferences page
 'preferences' => 'Roghainnean',
 'mypreferences' => 'Mo roghainnean',
@@ -760,22 +935,59 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'prefs-skin' => 'Bian',
 'skin-preview' => 'Ro-shealladh',
 'prefs-beta' => 'Feartan Beta',
+'prefs-datetime' => 'Ceann-là is àm',
 'prefs-labs' => 'Feartan nan deuchainn-lannan',
 'prefs-personal' => "Pròifil a' chleachdaiche",
+'prefs-rc' => 'Mùthaidhean ùra',
+'prefs-watchlist' => 'An clàr-faire',
+'prefs-resetpass' => 'Atharraich am facal-faire',
+'prefs-changeemail' => 'Atharraich am post-d',
+'prefs-setemail' => 'Suidhich seòladh puist-d',
+'prefs-email' => "Roghainnean a' phuist-d",
+'prefs-rendering' => 'Coltas',
 'saveprefs' => 'Sàbhail',
 'resetprefs' => 'Falamhaich atharrachaidhean nach deach a shàbhaladh fhathast',
+'restoreprefs' => 'Aisig na roghainnean bunaiteach uile',
+'prefs-editing' => "A' deasachadh",
+'prefs-edit-boxsize' => 'Meud uinneag an deasachaidh.',
 'rows' => 'Sreathan',
 'columns' => 'Colbhan',
+'searchresultshead' => 'Lorg',
+'stub-threshold-disabled' => 'À comas',
 'savedprefs' => 'Tha na roghainnean agad air an sàbhaladh.',
+'timezonelegend' => 'Roinn-tìde:',
+'localtime' => 'An t-àm ionadail:',
+'servertime' => 'Àm an fhrithealaichte:',
+'timezoneregion-africa' => 'Afraga',
+'timezoneregion-america' => 'Aimeireaga',
+'timezoneregion-antarctica' => 'An Antartaig',
+'timezoneregion-arctic' => 'An Arctaig',
+'timezoneregion-asia' => 'Àisia',
+'timezoneregion-atlantic' => 'An Cuan Siar',
+'timezoneregion-australia' => 'Astràilia',
+'timezoneregion-europe' => 'An Roinn-Eòrpa',
+'timezoneregion-indian' => 'An Cuan Innseanach',
+'timezoneregion-pacific' => 'An Cuan Sèimh',
 'default' => 'an roghainn bhunaiteach',
+'prefs-custom-css' => 'CSS gnàthaichte',
 'youremail' => 'Post-dealain:',
 'username' => 'Ainm-cleachdaiche:',
 'yourrealname' => "An dearbh ainm a th' ort:",
 'yourlanguage' => 'Cànan:',
 'yournick' => 'Earr-sgrìobhadh ùr:',
+'yourgender' => 'Gnè:',
+'gender-unknown' => 'Gun innse',
+'gender-male' => 'Fireann',
+'gender-female' => 'Boireann',
+'email' => 'Post-d:',
 'prefs-help-email' => "Chan leig thu leas post-dealain a chur ann ach bidh feum air ma dhìochuimhnicheas tu am facal-faire agad 's ma dh'iarras tu fear ùr.",
 'prefs-help-email-others' => "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air an duilleag agad.
 Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
+'prefs-advancedediting' => 'Roghainnean adhartach',
+'prefs-advancedrc' => 'Roghainnean adhartach',
+'prefs-advancedrendering' => 'Roghainnean adhartach',
+'prefs-advancedsearchoptions' => 'Roghainnean adhartach',
+'prefs-advancedwatchlist' => 'Roghainnean adhartach',
 
 # User rights
 'userrights-changeable-col' => 'Buidhnean as urrainn dhut atharrachadh',
@@ -783,10 +995,17 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
 # Groups
 'group-sysop' => 'Rianadairean',
 
+'group-user-member' => '{{GENDER:$1|cleachdaiche}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|rianaire}}',
+'group-bureaucrat-member' => '{{GENDER:$1|biùrocrat}}',
+
+'grouppage-user' => '{{ns:project}}:Cleachdaichean',
 'grouppage-sysop' => '{{ns:project}}:Rianadairean',
 
 # User rights log
 'rightslog' => "Loga còraichean a' chleachdaiche",
+'rightsnone' => '(chan eil gin)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'deasaich an duilleag seo',
@@ -835,14 +1054,16 @@ Tha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''tr
 
 # Upload
 'upload' => 'Luchdaich suas faidhle',
+'uploadbtn' => 'Luchdaich suas faidhle',
 'uploadlogpage' => 'Loga an luchdaidh suas',
 'filename' => 'Ainm-faidhle',
 'filedesc' => 'Gearr-chunntas',
+'fileuploadsummary' => 'Gearr-chunntas:',
 'filestatus' => 'Cor dlighe-sgrìobhaidh:',
 'ignorewarning' => 'Leig seachad an rabhadh agus sàbhail am faidhle co-dhiù',
 'badfilename' => 'Ainm ìomhaigh air atharrachadh ri "$1".',
-'fileexists' => "Tha faidhle ann mu thràth air a bheil an t-ainm seo, cuir sùil air '''<tt>[[:$1]]</tt>''' mur eil thu buileach cinntach a bheil thu airson atharrachadh.
-[[$1|thumb]]",
+'fileexists' => 'Tha faidhle ann mu thràth air a bheil an t-ainm seo, cuir sùil air <strong>[[:$1]]</strong> mur eil thu buileach cinntach a bheil thu airson atharrachadh.
+[[$1|thumb]]',
 'savefile' => 'Sàbhail faidhle',
 'uploadedimage' => 'a luchdaich suas "[[$1]]"',
 
index dfd8a3b..83428da 100644 (file)
@@ -163,60 +163,60 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#REDIRECCIÓN', '#REDIRECIONAMENTO', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__SENÍNDICE__', '__SEMTDC__', '__SEMSUMÁRIO__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__SENGALERÍA__', '__SEMGALERIA__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORZAROÍNDICE__', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÁRIO__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ÍNDICE__', '__TDC__', '__SUMÁRIO__', '__SUMARIO__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__SECCIÓNSNONEDITABLES__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NAOEDITARSECAO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '___SENCABECEIRA__', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÍTULO__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'MESACTUAL', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MESACTUAL1', 'MESATUAL1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NOMEDOMESACTUAL', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
-       'currentmonthabbrev'      => array( '1', 'ABREVIATURADOMESACTUAL', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'DÍAACTUAL', 'DIAATUAL', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'DÍAACTUAL2', 'DIAATUAL2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NOMEDODÍAACTUAL', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ANOACTUAL', 'ANOATUAL', 'CURRENTYEAR' ),
-       'currenthour'             => array( '1', 'HORAACTUAL', 'HORAATUAL', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthabbrev'        => array( '1', 'ABREVIATURADOMESLOCAL', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'DÍALOCAL', 'DIALOCAL', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'DÍALOCAL2', 'DIALOCAL2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NOMEDODÍALOCAL', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
-       'localhour'               => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NÚMERODEPÁXINAS', 'NUMERODEPAGINAS', 'NÚMERODEPÁGINAS', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NÚMERODEARTIGOS', 'NUMERODEARTIGOS', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NÚMERODEFICHEIROS', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÁRIOS', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'NÚMERODEEDICIÓNS', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'NOMEDAPÁXINA', 'NOMEDAPAGINA', 'NOMEDAPÁGINA', 'PAGENAME' ),
-       'namespace'               => array( '1', 'ESPAZODENOMES', 'DOMINIO', 'DOMÍNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
-       'fullpagename'            => array( '1', 'NOMECOMPLETODAPÁXINA', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÁGINA', 'FULLPAGENAME' ),
-       'subpagename'             => array( '1', 'NOMEDASUBPÁXINA', 'NOMEDASUBPAGINA', 'NOMEDASUBPÁGINA', 'SUBPAGENAME' ),
-       'basepagename'            => array( '1', 'NOMEDAPÁXINABASE', 'NOMEDAPAGINABASE', 'NOMEDAPÁGINABASE', 'BASEPAGENAME' ),
-       'talkpagename'            => array( '1', 'NOMEDAPÁXINADECONVERSA', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÁGINADEDISCUSSÃO', 'TALKPAGENAME' ),
-       'img_manualthumb'         => array( '1', 'miniatura=$1', 'miniaturadaimagem=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'dereita', 'direita', 'right' ),
-       'img_left'                => array( '1', 'esquerda', 'left' ),
-       'img_none'                => array( '1', 'ningún', 'nenhum', 'none' ),
-       'img_center'              => array( '1', 'centro', 'center', 'centre' ),
-       'img_page'                => array( '1', 'páxina=$1', 'páxina $1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'bordo', 'borda', 'border' ),
-       'grammar'                 => array( '0', 'GRAMÁTICA:', 'GRAMMAR:' ),
-       'displaytitle'            => array( '1', 'AMOSAROTÍTULO', 'EXIBETITULO', 'EXIBETÍTULO', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__LIGAZÓNDANOVASECCIÓN__', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
-       'language'                => array( '0', '#LINGUA:', '#IDIOMA:', '#LANGUAGE:' ),
-       'numberofadmins'          => array( '1', 'NÚMERODEADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'especial', 'special' ),
-       'defaultsort'             => array( '1', 'ORDENAR:', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'tag'                     => array( '0', 'etiqueta', 'tag' ),
-       'hiddencat'               => array( '1', '__CATEGORÍAOCULTA__', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PÁXINASNACATEGORÍA', 'PAGINASNACATEGORIA', 'PÁGINASNACATEGORIA', 'PAGINASNACAT', 'PÁGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'TAMAÑODAPÁXINA', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#REDIRECCIÓN', '#REDIRECIONAMENTO', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__SENÍNDICE__', '__SEMTDC__', '__SEMSUMÁRIO__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__SENGALERÍA__', '__SEMGALERIA__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORZAROÍNDICE__', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÁRIO__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ÍNDICE__', '__TDC__', '__SUMÁRIO__', '__SUMARIO__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__SECCIÓNSNONEDITABLES__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NAOEDITARSECAO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '___SENCABECEIRA__', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÍTULO__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'MESACTUAL', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'MESACTUAL1', 'MESATUAL1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NOMEDOMESACTUAL', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
+       'currentmonthabbrev'        => array( '1', 'ABREVIATURADOMESACTUAL', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'DÍAACTUAL', 'DIAATUAL', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'DÍAACTUAL2', 'DIAATUAL2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NOMEDODÍAACTUAL', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ANOACTUAL', 'ANOATUAL', 'CURRENTYEAR' ),
+       'currenthour'               => array( '1', 'HORAACTUAL', 'HORAATUAL', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
+       'localmonthabbrev'          => array( '1', 'ABREVIATURADOMESLOCAL', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'DÍALOCAL', 'DIALOCAL', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'DÍALOCAL2', 'DIALOCAL2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NOMEDODÍALOCAL', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
+       'localhour'                 => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NÚMERODEPÁXINAS', 'NUMERODEPAGINAS', 'NÚMERODEPÁGINAS', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NÚMERODEARTIGOS', 'NUMERODEARTIGOS', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NÚMERODEFICHEIROS', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÁRIOS', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'NÚMERODEEDICIÓNS', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'NOMEDAPÁXINA', 'NOMEDAPAGINA', 'NOMEDAPÁGINA', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'ESPAZODENOMES', 'DOMINIO', 'DOMÍNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
+       'fullpagename'              => array( '1', 'NOMECOMPLETODAPÁXINA', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÁGINA', 'FULLPAGENAME' ),
+       'subpagename'               => array( '1', 'NOMEDASUBPÁXINA', 'NOMEDASUBPAGINA', 'NOMEDASUBPÁGINA', 'SUBPAGENAME' ),
+       'basepagename'              => array( '1', 'NOMEDAPÁXINABASE', 'NOMEDAPAGINABASE', 'NOMEDAPÁGINABASE', 'BASEPAGENAME' ),
+       'talkpagename'              => array( '1', 'NOMEDAPÁXINADECONVERSA', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÁGINADEDISCUSSÃO', 'TALKPAGENAME' ),
+       'img_manualthumb'           => array( '1', 'miniatura=$1', 'miniaturadaimagem=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'dereita', 'direita', 'right' ),
+       'img_left'                  => array( '1', 'esquerda', 'left' ),
+       'img_none'                  => array( '1', 'ningún', 'nenhum', 'none' ),
+       'img_center'                => array( '1', 'centro', 'center', 'centre' ),
+       'img_page'                  => array( '1', 'páxina=$1', 'páxina $1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'bordo', 'borda', 'border' ),
+       'grammar'                   => array( '0', 'GRAMÁTICA:', 'GRAMMAR:' ),
+       'displaytitle'              => array( '1', 'AMOSAROTÍTULO', 'EXIBETITULO', 'EXIBETÍTULO', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__LIGAZÓNDANOVASECCIÓN__', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
+       'language'                  => array( '0', '#LINGUA:', '#IDIOMA:', '#LANGUAGE:' ),
+       'numberofadmins'            => array( '1', 'NÚMERODEADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'especial', 'special' ),
+       'defaultsort'               => array( '1', 'ORDENAR:', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'tag'                       => array( '0', 'etiqueta', 'tag' ),
+       'hiddencat'                 => array( '1', '__CATEGORÍAOCULTA__', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PÁXINASNACATEGORÍA', 'PAGINASNACATEGORIA', 'PÁGINASNACATEGORIA', 'PAGINASNACAT', 'PÁGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'TAMAÑODAPÁXINA', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
 );
 
 $separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -225,29 +225,29 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Subliñar as ligazóns:',
 'tog-justify' => 'Xustificar os parágrafos',
-'tog-hideminor' => 'Agochar as edicións pequenas na páxina de cambios recentes',
+'tog-hideminor' => 'Agochar as edicións pequenas nos cambios recentes',
 'tog-hidepatrolled' => 'Agochar as edicións patrulladas nos cambios recentes',
 'tog-newpageshidepatrolled' => 'Agochar as páxinas revisadas da lista de páxinas novas',
 'tog-extendwatchlist' => 'Expandir a lista de vixilancia para mostrar todos os cambios e non só os máis recentes',
-'tog-usenewrc' => 'Usar os cambios recentes avanzados (cómpre JavaScript)',
+'tog-usenewrc' => 'Agrupar as modificacións por páxina nos cambios recentes e na lista de vixilancia (cómpre JavaScript)',
 'tog-numberheadings' => 'Numerar automaticamente as cabeceiras',
 'tog-showtoolbar' => 'Mostrar a caixa de ferramentas de edición (cómpre JavaScript)',
 'tog-editondblclick' => 'Editar as páxinas logo de facer dobre clic (cómpre JavaScript)',
 'tog-editsection' => 'Permitir a edición de seccións mediante as ligazóns "[editar]"',
 'tog-editsectiononrightclick' => 'Permitir a edición de seccións premendo co botón dereito nos títulos das seccións (cómpre JavaScript)',
-'tog-showtoc' => 'Mostrar o índice (para páxinas con máis de tres cabeceiras)',
+'tog-showtoc' => 'Mostrar o índice (para as páxinas con máis de tres cabeceiras)',
 'tog-rememberpassword' => 'Lembrar o meu contrasinal neste navegador (ata $1 {{PLURAL:$1|día|días}})',
-'tog-watchcreations' => 'Engadir as páxinas que cree á miña lista de vixilancia',
-'tog-watchdefault' => 'Engadir as páxinas que edite á miña lista de vixilancia',
-'tog-watchmoves' => 'Engadir as páxinas que mova á miña lista de vixilancia',
-'tog-watchdeletion' => 'Engadir as páxinas que borre á miña lista de vixilancia',
+'tog-watchcreations' => 'Engadir as páxinas que cree e os ficheiros que cargue á miña lista de vixilancia',
+'tog-watchdefault' => 'Engadir as páxinas e os ficheiros que edite á miña lista de vixilancia',
+'tog-watchmoves' => 'Engadir as páxinas e os ficheiros que mova á miña lista de vixilancia',
+'tog-watchdeletion' => 'Engadir as páxinas e os ficheiros que borre á miña lista de vixilancia',
 'tog-minordefault' => 'Marcar por omisión todas as edicións como pequenas',
-'tog-previewontop' => 'Mostrar o botón de vista previa antes da caixa de edición e non despois dela',
+'tog-previewontop' => 'Mostrar a vista previa antes da caixa de edición',
 'tog-previewonfirst' => 'Mostrar a vista previa na primeira edición',
 'tog-nocache' => 'Desactivar a memoria caché do navegador',
-'tog-enotifwatchlistpages' => 'Enviádeme unha mensaxe de correo electrónico cando unha páxina da miña lista de vixilancia cambie',
+'tog-enotifwatchlistpages' => 'Enviádeme unha mensaxe de correo electrónico cando unha páxina ou un ficheiro da miña lista de vixilancia sufra un cambio',
 'tog-enotifusertalkpages' => 'Enviádeme unha mensaxe de correo electrónico cando a miña páxina de conversa cambie',
-'tog-enotifminoredits' => 'Enviádeme tamén unha mensaxe de correo electrónico cando se produzan edicións pequenas nas páxinas',
+'tog-enotifminoredits' => 'Enviádeme tamén unha mensaxe de correo electrónico cando se produzan edicións pequenas nas páxinas ou nos ficheiros',
 'tog-enotifrevealaddr' => 'Revelar o meu enderezo de correo electrónico nos correos de notificación',
 'tog-shownumberswatching' => 'Mostrar o número de usuarios que están a vixiar',
 'tog-oldsig' => 'Sinatura actual:',
@@ -263,9 +263,8 @@ $messages = array(
 'tog-watchlisthideliu' => 'Agochar as edicións dos usuarios rexistrados na lista de vixilancia',
 'tog-watchlisthideanons' => 'Agochar as edicións dos usuarios anónimos na lista de vixilancia',
 'tog-watchlisthidepatrolled' => 'Agochar as edicións patrulladas na lista de vixilancia',
-'tog-nolangconversion' => 'Desactivar a conversión de variantes',
-'tog-ccmeonemails' => 'Enviar ao meu enderezo copia das mensaxes que envíe a outros usuarios',
-'tog-diffonly' => 'Non mostrar o contido da páxina debaixo das diferenzas entre edicións (dif)',
+'tog-ccmeonemails' => 'Enviádeme ao meu enderezo unha copia das mensaxes de correo electrónico que envíe a outros usuarios',
+'tog-diffonly' => 'Non mostrar o contido da páxina debaixo das diferenzas entre edicións',
 'tog-showhiddencats' => 'Mostrar as categorías ocultas',
 'tog-noconvertlink' => 'Desactivar a conversión dos títulos de ligazón',
 'tog-norollbackdiff' => 'Omitir as diferenzas despois de levar a cabo unha reversión de edicións',
@@ -487,6 +486,10 @@ $1',
 'youhavenewmessages' => 'Ten $1 ($2).',
 'newmessageslink' => 'mensaxes novas',
 'newmessagesdifflink' => 'diferenzas coa revisión anterior',
+'youhavenewmessagesfromusers' => 'Ten $1 {{PLURAL:$3|doutro usuario|de $3 usuarios}} ($2).',
+'youhavenewmessagesmanyusers' => 'Ten $1 de moitos usuarios ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|unha mensaxe nova|$1 mensaxes novas}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|última modificación|últimas modificacións}}',
 'youhavenewmessagesmulti' => 'Ten mensaxes novas en $1',
 'editsection' => 'editar',
 'editold' => 'editar',
@@ -539,11 +542,11 @@ Pode atopar unha lista coas páxinas especiais válidas en [[Special:SpecialPage
 'error' => 'Erro',
 'databaseerror' => 'Erro na base de datos',
 'dberrortext' => 'Ocorreu un erro de sintaxe na consulta á base de datos.
-Isto pódese deber a un erro no programa.
+Isto pódese deber a un erro no software.
 A última consulta á base de datos foi:
-<blockquote><tt>$1</tt></blockquote>
-desde a función "<tt>$2</tt>".
-A base de datos devolveu o erro "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+desde a función "<code>$2</code>".
+A base de datos devolveu o erro "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Ocorreu un erro de sintaxe na consulta.
 A última consulta á base de datos foi:
 "$1"
@@ -580,6 +583,8 @@ Por favor, comuníquello a un [[Special:ListUsers/sysop|administrador]] tomando
 'cannotdelete' => 'Non se puido borrar a páxina ou imaxe "$1".
 Se cadra, xa a borrou alguén.',
 'cannotdelete-title' => 'Non se pode borrar a páxina "$1"',
+'delete-hook-aborted' => 'O borrado foi abortado polo asociador.
+Este non deu ningunha explicación.',
 'badtitle' => 'Título incorrecto',
 'badtitletext' => 'O título da páxina pedida non era válido, estaba baleiro ou proviña dunha ligazón interlingua ou interwiki incorrecta.
 Pode conter un ou máis caracteres dos que non se poden empregar nos títulos.',
@@ -615,6 +620,8 @@ O motivo achegado é ''$2''.",
 O administrador que bloqueou o repositorio achegou este motivo: "$3".',
 'invalidtitle-knownnamespace' => 'Título inválido co espazo de nomes "$2" e o texto "$3"',
 'invalidtitle-unknownnamespace' => 'Título inválido cun número de espazo de nomes, $1, descoñecido e o texto "$2"',
+'exception-nologin' => 'Non accedeu ao sistema',
+'exception-nologin-text' => 'Esta páxina ou acción necesita que vostede acceda ao sistema neste wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Configuración errónea: escáner de virus descoñecido: ''$1''",
@@ -635,6 +642,7 @@ Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENA
 'remembermypassword' => 'Lembrar o meu contrasinal neste ordenador (ata $1 {{PLURAL:$1|día|días}})',
 '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.',
 'externaldberror' => 'Ou ben se produciu un erro da base de datos na autenticación externa ou ben non se lle permite actualizar a súa conta externa.',
 'login' => 'Acceder ao sistema',
 'nav-login-createaccount' => 'Rexistro',
@@ -893,6 +901,10 @@ ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar a páxina]</span>.',
 'noarticletext-nopermission' => 'Actualmente non hai ningún texto nesta páxina.
 Pode [[Special:Search/{{PAGENAME}}|procurar polo título desta páxina]] noutras páxinas
 ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ollar os rexistros relacionados]</span>.',
+'missing-revision' => 'A revisión nº$1 da páxina chamada "{{PAGENAME}}" non existe.
+
+A miúdo, isto está provocado por seguir unha ligazón de historial obsoleta cara a unha páxina que foi borrada.
+O [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados] contén máis detalles.',
 'userpage-userdoesnotexist' => 'A conta do usuario "<nowiki>$1</nowiki>" non está rexistrada. Comprobe se desexa crear/editar esta páxina.',
 'userpage-userdoesnotexist-view' => 'A conta de usuario "$1" non está rexistrada.',
 'blocked-notice-logextract' => 'Este usuario está bloqueado.
@@ -901,7 +913,6 @@ Velaquí está a última entrada do rexistro de bloqueos, por se quere consultal
 * '''Firefox / Safari:''' Prema ''Maiúsculas'' á vez que en ''Recargar'', ou prema en ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' nos Mac)
 * '''Google Chrome:''' Prema en ''Ctrl-Shift-R'' (''⌘-Shift-R'' nos Mac)
 * '''Internet Explorer:''' Prema ''Ctrl'' ao tempo que fai clic en ''Refrescar'', ou prema en ''Ctrl-F5''
-* '''Konqueror:''' Prema en ''Recargar'' ou prema en ''F5''
 * '''Opera:''' Limpe a súa memoria caché en ''Ferramentas → Preferencias''",
 'usercssyoucanpreview' => "'''Nota:''' Use o botón \"{{int:showpreview}}\" para verificar o novo CSS antes de gardalo.",
 'userjsyoucanpreview' => "'''Nota:''' Use o botón \"{{int:showpreview}}\" para verificar o novo JS antes de gardalo.",
@@ -1022,6 +1033,7 @@ Estes argumentos foron omitidos.",
 'expansion-depth-exceeded-warning' => 'Páxina que supera a profundidade de expansión',
 'parser-unstrip-loop-warning' => 'Detectouse un bucle inamovible',
 'parser-unstrip-recursion-limit' => 'Excedeuse o límite de recursión inamovible ($1)',
+'converter-manual-rule-error' => 'Detectouse un erro na regra manual de conversión da lingua',
 
 # "Undo" feature
 'undo-success' => 'A edición pódese desfacer.
@@ -1208,6 +1220,10 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
 'editundo' => 'desfacer',
 'diff-multi' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} por {{PLURAL:$2|un usuario|$2 usuarios}}.)',
 'diff-multi-manyusers' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} por máis {{PLURAL:$2|dun usuario|de $2 usuarios}}.)',
+'difference-missing-revision' => 'Non se {{PLURAL:$2|atopou revisión ningunha|atoparon $2 revisións}} desta diferenza ($1).
+
+A miúdo, isto está provocado por seguir unha ligazón de diferenzas obsoleta cara a unha páxina que foi borrada.
+O [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados] contén máis detalles.',
 
 # Search results
 'searchresults' => 'Resultados da procura',
@@ -1216,7 +1232,7 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
 'searchsubtitle' => 'A súa busca de "\'\'\'[[:$1]]\'\'\'" ([[Special:Prefixindex/$1|todas as páxinas que comezan por "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|todas as páxinas que ligan con "$1"]])',
 'searchsubtitleinvalid' => "A súa busca de \"'''\$1'''\"",
 'toomanymatches' => 'Devolvéronse demasiadas coincidencias; inténteo cunha consulta diferente',
-'titlematches' => 'O título do artigo coincide',
+'titlematches' => 'O título da páxina coincide',
 'notitlematches' => 'Non coincide ningún título de páxina',
 'textmatches' => 'O texto da páxina coincide',
 'notextmatches' => 'Non se atopou o texto en ningunha páxina',
@@ -1303,13 +1319,13 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
 'prefs-rc' => 'Cambios recentes',
 'prefs-watchlist' => 'Lista de vixilancia',
 'prefs-watchlist-days' => 'Número de días que mostrar na lista de vixilancia:',
-'prefs-watchlist-days-max' => 'Máximo $1 {{PLURAL:$1|día|días}}',
+'prefs-watchlist-days-max' => 'Máximo: $1 {{PLURAL:$1|día|días}}',
 'prefs-watchlist-edits' => 'Número máximo de edicións que mostrar na lista de vixilancia completa:',
 'prefs-watchlist-edits-max' => 'Número máximo: 1000',
 'prefs-watchlist-token' => 'Pase para a lista de vixilancia:',
 'prefs-misc' => 'Preferencias varias',
 'prefs-resetpass' => 'Cambiar o contrasinal',
-'prefs-changeemail' => 'Cambiar o correo electrónico',
+'prefs-changeemail' => 'Cambiar o enderezo de correo electrónico',
 'prefs-setemail' => 'Establecer un enderezo de correo electrónico',
 'prefs-email' => 'Opcións de correo electrónico',
 'prefs-rendering' => 'Aparencia',
@@ -1325,7 +1341,7 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
 'stub-threshold' => 'Límite superior para o formato de <a href="#" class="stub">ligazóns de bosquexo</a> (bytes):',
 'stub-threshold-disabled' => 'Desactivado',
 'recentchangesdays' => 'Número de días a mostrar nos cambios recentes:',
-'recentchangesdays-max' => 'Máximo $1 {{PLURAL:$1|día|días}}',
+'recentchangesdays-max' => 'Máximo: $1 {{PLURAL:$1|día|días}}',
 'recentchangescount' => 'Número de edicións a mostrar por defecto:',
 'prefs-help-recentchangescount' => 'Isto inclúe os cambios recentes, os historiais e mais os rexistros.',
 'prefs-help-watchlist-token' => 'Ao encher este campo cunha clave secreta xerarase unha fonte de novas RSS para a súa lista de vixilancia.
@@ -1476,6 +1492,7 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 'right-writeapi' => 'Usar a API para modificar o wiki',
 'right-delete' => 'Borrar páxinas',
 'right-bigdelete' => 'Borrar páxinas con historiais grandes',
+'right-deletelogentry' => 'Borrar e restaurar entradas de rexistro específicas',
 'right-deleterevision' => 'Borrar e restaurar versións específicas de páxinas',
 'right-deletedhistory' => 'Ver as entradas borradas do historial, sen o seu texto asociado',
 'right-deletedtext' => 'Ver texto borrado e cambios entre revisións eliminadas',
@@ -1620,9 +1637,9 @@ Velaquí están o rexistro de borrados e mais o de traslados desta páxina, por
 Para ver ou procurar imaxes subidas con anterioridade vaia á [[Special:FileList|lista de imaxes]]; os envíos tamén se rexistran no [[Special:Log/upload|rexistro de cargas]] e as eliminacións no [[Special:Log/delete|rexistro de borrados]].
 
 Para incluír un ficheiro nunha páxina, use unha ligazón do seguinte xeito:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' para usar a versión completa do ficheiro
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternativo]]</nowiki></tt>''' para usar unha resolución de 200 píxeles de ancho nunha caixa na marxe esquerda cunha descrición (\"texto alternativo\")
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' para ligar directamente co ficheiro sen que este saia na páxina",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' para usar a versión completa do ficheiro
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternativo]]</nowiki></code>''' para usar unha resolución de 200 píxeles de ancho nunha caixa na marxe esquerda cunha descrición (\"texto alternativo\")
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para ligar directamente co ficheiro sen que este saia na páxina",
 'upload-permitted' => 'Tipos de ficheiro permitidos: $1.',
 'upload-preferred' => 'Tipos de arquivos preferidos: $1.',
 'upload-prohibited' => 'Tipos de arquivos prohibidos: $1.',
@@ -1669,23 +1686,23 @@ Por favor, cambie o nome do ficheiro e intente cargalo de novo.',
 Isto pode deberse a un erro ortográfico no seu nome.
 Por favor, verifique se realmente quere cargar este ficheiro.',
 'windows-nonascii-filename' => 'Este wiki non soporta os nomes de ficheiros con caracteres especiais.',
-'fileexists' => "Xa existe un ficheiro con ese nome. Por favor, comprobe '''<tt>[[:$1]]</tt>''' se non está seguro de querer cambialo.
-[[$1|thumb]]",
-'filepageexists' => "A páxina de descrición deste ficheiro xa foi creada en '''<tt>[[:$1]]</tt>''', pero polo de agora non existe ningún ficheiro con este nome.
+'fileexists' => 'Xa existe un ficheiro con ese nome. Por favor, comprobe <strong>[[:$1]]</strong> se non está seguro de querer cambialo.
+[[$1|thumb]]',
+'filepageexists' => 'A páxina de descrición deste ficheiro xa foi creada en <strong>[[:$1]]</strong>, pero polo de agora non existe ningún ficheiro con este nome.
 O resumo que escribiu non aparecerá na páxina de descrición.
 Para facer que o resumo apareza alí, necesitará editar a páxina manualmente.
-[[$1|miniatura]]",
-'fileexists-extension' => "Xa existe un ficheiro cun nome semellante: [[$2|thumb]]
-* Nome do ficheiro que intenta cargar: '''<tt>[[:$1]]</tt>'''
-* Nome de ficheiro existente: '''<tt>[[:$2]]</tt>'''
-Por favor, escolla un nome diferente.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Xa existe un ficheiro cun nome semellante: [[$2|thumb]]
+* Nome do ficheiro que intenta cargar: <strong>[[:$1]]</strong>
+* Nome de ficheiro existente: <strong>[[:$2]]</strong>
+Por favor, escolla un nome diferente.',
 'fileexists-thumbnail-yes' => "Semella que o ficheiro é unha imaxe de tamaño reducido ''(miniatura)''.
 [[$1|thumb]]
-Por favor, comprobe o ficheiro '''<tt>[[:$1]]</tt>'''.
+Por favor, comprobe o ficheiro <strong>[[:$1]]</strong>.
 Se o ficheiro seleccionado é a mesma imaxe en tamaño orixinal non é preciso enviar unha miniatura adicional.",
-'file-thumbnail-no' => "O nome do ficheiro comeza por '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "O nome do ficheiro comeza por <strong>$1</strong>.
 Parece tratarse dunha imaxe de tamaño reducido ''(miniatura)''.
-Se dispón dunha versión desta imaxe de maior resolución, se non, múdelle o nome ao ficheiro.",
+Se dispón dunha versión desta imaxe de maior resolución cárguea; se non, múdelle o nome ao ficheiro.",
 'fileexists-forbidden' => 'Xa existe un ficheiro co mesmo nome e este non pode ser sobrescrito.
 Se aínda quere cargar o seu ficheiro, por favor, retroceda e use un novo nome. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Xa existe un ficheiro con este nome no repositorio de ficheiros compartidos.
@@ -1795,6 +1812,7 @@ Se o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|admin
 'lockmanager-fail-releaselock' => 'Non se puido liberar o peche de "$1".',
 'lockmanager-fail-db-bucket' => 'Non se puido contactar cos peches de bases de datos suficientes no cubo $1.',
 'lockmanager-fail-db-release' => 'Non se puideron liberar os peches na base de datos $1.',
+'lockmanager-fail-svr-acquire' => 'Non se puideron obter os peches no servidor $1.',
 'lockmanager-fail-svr-release' => 'Non se puideron liberar os peches no servidor $1.',
 
 # ZipDirectoryReader
@@ -1914,9 +1932,10 @@ Poida que queira editar a descrición da [$2 páxina de descrición do ficheiro]
 'shared-repo-from' => 'de $1',
 'shared-repo' => 'repositorio compartido',
 'filepage.css' => '/** O CSS que se coloque aquí será incluído na páxina de descrición do ficheiro, así como nos wikis de clientes estranxeiros */',
+'upload-disallowed-here' => 'Por desgraza, non pode sobrescribir esta imaxe.',
 
 # File reversion
-'filerevert' => 'Desfacer $1',
+'filerevert' => 'Reverter $1',
 'filerevert-legend' => 'Reverter o ficheiro',
 'filerevert-intro' => 'Está a piques de reverter o ficheiro "\'\'\'[[Media:$1|$1]]\'\'\'" ata a [$4 versión do $2 ás $3].',
 'filerevert-comment' => 'Motivo:',
@@ -1948,7 +1967,7 @@ Poida que queira editar a descrición da [$2 páxina de descrición do ficheiro]
 # MIME search
 'mimesearch' => 'Busca MIME',
 'mimesearch-summary' => 'Esta páxina permite filtrar os ficheiros segundo o seu tipo MIME.
-Entrada: tipodecontido/subtipo, p.ex. <tt>image/jpeg</tt>.',
+Entrada: tipodecontido/subtipo, por exemplo <code>image/jpeg</code>.',
 'mimetype' => 'Tipo MIME:',
 'download' => 'descargar',
 
@@ -1995,7 +2014,7 @@ Lembre verificar outras ligazóns cara aos modelos antes de borralos.',
 
 'disambiguations' => 'Páxinas que ligan con páxinas de homónimos',
 'disambiguationspage' => 'Template:Homónimos',
-'disambiguations-text' => "As seguintes páxinas ligan cunha '''páxina de homónimos'''.
+'disambiguations-text' => "As seguintes páxinas conteñen, polo menos, unha ligazón cara a unha '''páxina de homónimos'''.
 No canto de ligar cos homónimos deben apuntar cara á páxina apropiada.<br />
 Unha páxina trátase como páxina de homónimos cando nela se usa un modelo que está ligado desde [[MediaWiki:Disambiguationspage]].",
 
@@ -2017,11 +2036,12 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'withoutinterwiki-legend' => 'Prefixo',
 'withoutinterwiki-submit' => 'Mostrar',
 
-'fewestrevisions' => 'Artigos con menos revisións',
+'fewestrevisions' => 'Páxinas con menos revisións',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categoría|categorías}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|ligazón|ligazóns}}',
 'nmembers' => '$1 {{PLURAL:$1|páxina|páxinas}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisión|revisións}}',
@@ -2048,9 +2068,10 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'mostlinked' => 'Páxinas máis ligadas',
 'mostlinkedcategories' => 'Categorías máis ligadas',
 'mostlinkedtemplates' => 'Modelos máis enlazados',
-'mostcategories' => 'Artigos con máis categorías',
+'mostcategories' => 'Páxinas con máis categorías',
 'mostimages' => 'Ficheiros máis usados',
-'mostrevisions' => 'Artigos con máis revisións',
+'mostinterwikis' => 'Páxinas con máis interwikis',
+'mostrevisions' => 'Páxinas con máis revisións',
 'prefixindex' => 'Todas as páxinas coas iniciais',
 'prefixindex-namespace' => 'Todas as páxinas con prefixo (espazo de nomes $1)',
 'shortpages' => 'Páxinas curtas',
@@ -2072,7 +2093,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'usercreated' => '{{GENDER:$3|Creado|Creada}} o $1 ás $2',
 'newpages' => 'Páxinas novas',
 'newpages-username' => 'Nome de usuario:',
-'ancientpages' => 'Artigos máis antigos',
+'ancientpages' => 'Páxinas máis antigas',
 'move' => 'Mover',
 'movethispage' => 'Mover esta páxina',
 'unusedimagestext' => 'Os seguintes ficheiros existen pero aínda non se incluíron en ningunha páxina.
@@ -2149,7 +2170,7 @@ Olle tamén as [[Special:WantedCategories|categorías requiridas]].',
 'linksearch-ok' => 'Procurar',
 'linksearch-text' => 'Pódense usar caracteres comodín como "*.wikipedia.org".
 Cómpre, polo menos, un dominio de nivel superior, por exemplo "*.org".<br />
-Protocolos soportados: <tt>$1</tt> (non engada ningún destes na súa procura).',
+Protocolos soportados: <code>$1</code> (non engada ningún destes na súa procura).',
 'linksearch-line' => '$1 está ligado desde a páxina "$2"',
 'linksearch-error' => 'Os caracteres comodín só poden aparecer ao principio do nome do servidor.',
 
@@ -2195,6 +2216,8 @@ Se quere máis información acerca dos dereitos individuais, pode atopala [[{{Me
 'mailnologin' => 'Non existe enderezo para o envío',
 'mailnologintext' => 'Debe [[Special:UserLogin|acceder ao sistema]] e ter rexistrado un enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias]] para enviar correos electrónicos a outros usuarios.',
 'emailuser' => 'Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}',
+'emailuser-title-target' => 'Enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}',
+'emailuser-title-notarget' => 'Enviar un correo electrónico a un usuario',
 'emailpage' => 'Enviar un correo electrónico a un usuario',
 'emailpagetext' => 'Pode usar o formulario de embaixo para enviar unha mensaxe de correo electrónico a este usuario.
 O correo electrónico que inseriu [[Special:Preferences|nas súas preferencias]] aparecerá no campo "De:" do correo, polo que o receptor da mensaxe poderalle responder.',
@@ -2247,7 +2270,7 @@ Os cambios futuros nesta páxina e na súa páxina de conversa asociada serán l
 'notvisiblerev' => 'A revisión foi borrada',
 'watchnochange' => 'Ningún dos elementos baixo vixilancia foi editado no período de tempo indicado.',
 'watchlist-details' => 'Hai {{PLURAL:$1|unha páxina|$1 páxinas}} na súa lista de vixilancia, sen contar as de conversa.',
-'wlheader-enotif' => '* Está dispoñible a notificación por correo electrónico.',
+'wlheader-enotif' => '* A notificación por correo electrónico está activada.',
 'wlheader-showupdated' => "* As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''",
 'watchmethod-recent' => 'comprobando as edicións recentes na procura de páxinas vixiadas',
 'watchmethod-list' => 'comprobando as páxinas vixiadas na procura de edicións recentes',
@@ -2342,6 +2365,8 @@ proceda con coidado.',
 'rollback' => 'Reverter as edicións',
 'rollback_short' => 'Reverter',
 'rollbacklink' => 'reverter',
+'rollbacklinkcount' => 'reverter $1 {{PLURAL:$1|edición|edicións}}',
+'rollbacklinkcount-morethan' => 'reverter máis de $1 {{PLURAL:$1|edición|edicións}}',
 'rollbackfailed' => 'Houbo un fallo ao reverter as edicións',
 'cantrollback' => 'Non se pode desfacer a edición; o último colaborador é o único autor desta páxina.',
 'alreadyrolled' => 'Non se pode desfacer a edición en "[[:$1]]" feita por [[User:$2|$2]] ([[User talk:$2|conversa]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); alguén máis editou ou desfixo os cambios desta páxina.
@@ -2582,7 +2607,7 @@ Olle a [[Special:BlockList|lista de bloqueos]] para revisalo.',
 'unblockip' => 'Desbloquear o usuario',
 'unblockiptext' => 'Use o seguinte formulario para dar de novo acceso de escritura a un enderezo IP ou usuario que estea bloqueado.',
 'ipusubmit' => 'Retirar este bloqueo',
-'unblocked' => '"[[User:$1|$1]]" foi desbloqueado',
+'unblocked' => '[[User:$1|$1]] foi {{GENDER:$1|desbloqueado|desbloqueada}}',
 'unblocked-range' => '$1 foi desbloqueado',
 'unblocked-id' => 'O bloqueo $1 foi eliminado',
 'blocklist' => 'Usuarios bloqueados',
@@ -2795,7 +2820,7 @@ No último caso, pode usar tamén unha ligazón, por exemplo [[{{#Special:Export
 'export-pagelinks' => 'Engadir as páxinas ligadas a unha profundidade de:',
 
 # Namespace 8 related
-'allmessages' => 'Todas as mensaxes do sistema',
+'allmessages' => 'Mensaxes do sistema',
 'allmessagesname' => 'Nome',
 'allmessagesdefault' => 'Texto predeterminado',
 'allmessagescurrent' => 'Texto actual',
@@ -2836,6 +2861,7 @@ Todas as accións relacionadas coa importación entre wikis poden verse no [[Spe
 'import-interwiki-templates' => 'Incluír todos os modelos',
 'import-interwiki-submit' => 'Importar',
 'import-interwiki-namespace' => 'Espazo de nomes de destino:',
+'import-interwiki-rootpage' => 'Páxina raíz de destino (opcional):',
 'import-upload-filename' => 'Nome do ficheiro:',
 'import-comment' => 'Comentario:',
 'importtext' => 'Por favor, exporte o ficheiro do wiki de orixe usando a [[Special:Export|ferramenta de exportación]].
@@ -2868,6 +2894,9 @@ Gárdeo no seu disco duro e cárgueo aquí.',
 'import-error-interwiki' => 'Non se pode importar a páxina "$1" porque o seu nome está reservado para unha ligazón externa (interwiki).',
 'import-error-special' => 'Non se pode importar a páxina "$1" porque pertence a un espazo de nomes especial que non o permite.',
 'import-error-invalid' => 'Non se pode importar a páxina "$1" porque o seu nome non é válido.',
+'import-options-wrong' => '{{PLURAL:$2|Opción incorrecta|Opcións incorrectas}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'A páxina raíz dada é un título non válido.',
+'import-rootpage-nosubpage' => 'O espazo de nomes "$1" da páxina raíz non permite as subpáxinas.',
 
 # Import log
 'importlogpage' => 'Rexistro de importacións',
@@ -3020,16 +3049,34 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 
 # Info page
 'pageinfo-title' => 'Información sobre "$1"',
-'pageinfo-header-edits' => 'Edicións',
-'pageinfo-header-watchlist' => 'Lista de vixilancia',
-'pageinfo-header-views' => 'Visitas',
-'pageinfo-subjectpage' => 'Páxina',
-'pageinfo-talkpage' => 'Páxina de conversa',
-'pageinfo-watchers' => 'Número de vixiantes',
-'pageinfo-edits' => 'Número de edicións',
-'pageinfo-authors' => 'Número de autores distintos',
+'pageinfo-header-basic' => 'Información básica',
+'pageinfo-header-edits' => 'Historial de edicións',
+'pageinfo-header-restrictions' => 'Protección da páxina',
+'pageinfo-header-properties' => 'Propiedades da páxina',
+'pageinfo-display-title' => 'Título mostrado',
+'pageinfo-default-sort' => 'Clave de ordenación por defecto',
+'pageinfo-length' => 'Lonxitude da páxina (en bytes)',
+'pageinfo-article-id' => 'ID da páxina',
+'pageinfo-robot-policy' => 'Estado do motor de procuras',
+'pageinfo-robot-index' => 'Indexable',
+'pageinfo-robot-noindex' => 'Non indexable',
 'pageinfo-views' => 'Número de visitas',
-'pageinfo-viewsperedit' => 'Visitas por edición',
+'pageinfo-watchers' => 'Número de vixiantes da páxina',
+'pageinfo-redirects-name' => 'Redireccións cara a esta páxina',
+'pageinfo-subpages-name' => 'Subpáxinas desta páxina',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirección|redireccións}}; $3 {{PLURAL:$3|non-redirección|non-redireccións}})',
+'pageinfo-firstuser' => 'Creador da páxina',
+'pageinfo-firsttime' => 'Data de creación da páxina',
+'pageinfo-lastuser' => 'Último editor',
+'pageinfo-lasttime' => 'Data da última edición',
+'pageinfo-edits' => 'Número total de edicións',
+'pageinfo-authors' => 'Número total de autores distintos',
+'pageinfo-recent-edits' => 'Número de edicións recentes (durante os últimos $1)',
+'pageinfo-recent-authors' => 'Número de autores distintos recentes',
+'pageinfo-restriction' => 'Protección da páxina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Palabra máxica|Palabras máxicas}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría agochada|Categorías agochadas}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Modelo incluído|Modelos incluídos}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Clásica',
@@ -3078,11 +3125,12 @@ O seu sistema pode quedar comprometido se o executa.",
 'imagemaxsize' => "Límite de tamaño das imaxes:<br />''(nas páxinas de descrición de ficheiros)''",
 'thumbsize' => 'Tamaño da miniatura:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|páxina|páxinas}}',
-'file-info' => 'Tamaño do ficheiro: $1, tipo MIME: $2',
-'file-info-size' => '$1 × $2 píxeles, tamaño do ficheiro: $3, tipo MIME: $4',
-'file-info-size-pages' => '$1 × $2 píxeles, tamaño do ficheiro: $3, tipo MIME: $4, $5 {{PLURAL:$5|páxina|páxinas}}',
+'file-info' => 'tamaño do ficheiro: $1; tipo MIME: $2',
+'file-info-size' => '$1 × $2 píxeles; tamaño do ficheiro: $3; tipo MIME: $4',
+'file-info-size-pages' => '$1 × $2 píxeles; tamaño do ficheiro: $3; tipo MIME: $4; $5 {{PLURAL:$5|páxina|páxinas}}',
 'file-nohires' => 'Non se dispón dunha resolución máis grande.',
-'svg-long-desc' => 'ficheiro SVG, nominalmente $1 × $2 píxeles, tamaño do ficheiro: $3',
+'svg-long-desc' => 'ficheiro SVG; resolución de $1 × $2 píxeles; tamaño do ficheiro: $3',
+'svg-long-desc-animated' => 'ficheiro SVG animado; resolución de $1 × $2 píxeles; tamaño do ficheiro: $3',
 'show-big-image' => 'Imaxe na máxima resolución',
 'show-big-image-preview' => 'Tamaño desta vista previa: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Outra resolución|Outras resolucións}}: $1.',
@@ -3092,6 +3140,8 @@ O seu sistema pode quedar comprometido se o executa.",
 'file-info-png-looped' => 'en bucle',
 'file-info-png-repeat' => 'reproducido $1 {{PLURAL:$1|vez|veces}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|fotograma|fotogramas}}',
+'file-no-thumb-animation' => "'''Nota: Debido a algunhas limitacións técnicas, non se ve a animación das miniaturas deste ficheiro.'''",
+'file-no-thumb-animation-gif' => "'''Nota: Debido a algunhas limitacións técnicas, non se ve a animación das miniaturas das imaxes GIF de alta resolución como este ficheiro.'''",
 
 # Special:NewFiles
 'newimages' => 'Galería de imaxes novas',
@@ -3508,7 +3558,7 @@ Os demais agocharanse por omisión.
 
 'exif-isospeedratings-overflow' => 'Superior a 65535',
 
-'exif-iimcategory-ace' => 'Arte, cultura e entretemento',
+'exif-iimcategory-ace' => 'Arte, cultura e lecer',
 'exif-iimcategory-clj' => 'Crime e dereito',
 'exif-iimcategory-dis' => 'Desastres e accidentes',
 'exif-iimcategory-fin' => 'Economía e negocios',
@@ -3616,7 +3666,7 @@ O código de confirmación caduca o $6 ás $7.',
 
 # Delete conflict
 'deletedwhileediting' => "'''Aviso:''' Esta páxina foi borrada despois de que comezase a editala!",
-'confirmrecreate' => "O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) borrou este artigo despois de que vostede comezara a editalo, dando o seguinte motivo:
+'confirmrecreate' => "O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) borrou esta páxina despois de que vostede comezara a editala, dando o seguinte motivo:
 : ''$2''
 Por favor, confirme que realmente quere recrear esta páxina.",
 'confirmrecreate-noreason' => 'O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) borrou esta páxina despois de que vostede comezara a editala. Por favor, confirme que realmente quere recrear esta páxina.',
@@ -3900,9 +3950,12 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
 'api-error-empty-file' => 'O ficheiro que enviou estaba baleiro.',
 'api-error-emptypage' => 'Non está permitida a creación de páxinas novas que estean baleiras.',
 'api-error-fetchfileerror' => 'Erro interno: Houbo un problema ao buscar o ficheiro.',
+'api-error-fileexists-forbidden' => 'Xa existe un ficheiro co nome "$1". Non se pode sobrescribir.',
+'api-error-fileexists-shared-forbidden' => 'Xa existe un ficheiro co nome "$1" no repositorio de ficheiros compartidos. Non se pode sobrescribir.',
 'api-error-file-too-large' => 'O ficheiro que enviou era grande de máis.',
 'api-error-filename-tooshort' => 'O nome do ficheiro é curto de máis.',
 'api-error-filetype-banned' => 'Este tipo de ficheiro está prohibido.',
+'api-error-filetype-banned-type' => '$1 non {{PLURAL:$4|é un tipo de ficheiro permitido|son tipos de ficheiro permitidos}}. {{PLURAL:$3|O tipo de ficheiro permitido é|Os tipos de ficheiro permitidos son}} $2.',
 'api-error-filetype-missing' => 'Fáltalle a extensión ao ficheiro.',
 'api-error-hookaborted' => 'O asociador da extensión cancelou a modificación que intentou realizar.',
 'api-error-http' => 'Erro interno: Non se puido conectar co servidor.',
index a81a230..ea1c5b5 100644 (file)
  * @author Zylbath
  */
 
+$namespaceNames = array(
+       NS_USER             => '𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐍃',
+       NS_USER_TALK        => '𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃_𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰',
+       NS_PROJECT_TALK     => '𐌸𐌹𐍃_$1_𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰',
+       NS_FILE             => '𐍆𐌴𐌹𐌻𐌰',
+       NS_FILE_TALK        => '𐍆𐌴𐌹𐌻𐌹𐌽𐍃_𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰',
+       NS_TEMPLATE         => '𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃',
+       NS_TEMPLATE_TALK    => '𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐌰𐌹𐍃_𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰',
+       NS_HELP             => '𐌷𐌹𐌻𐍀𐌰',
+       NS_HELP_TALK        => '𐌷𐌹𐌻𐍀𐍉𐍃_𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰',
+       NS_CATEGORY         => '𐌷𐌰𐌽𐍃𐌰',
+       NS_CATEGORY_TALK    => '𐌷𐌰𐌽𐍃𐍉𐍃_𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰',
+);
+
+$specialPageAliases = array(
+       'Allpages'                  => array( '𐌰𐌻𐌻𐍃𐍃𐌴𐌹𐌳𐍉𐌽𐍃' ),
+       'Recentchanges'             => array( '𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃' ),
+);
+
 $messages = array(
 'underline-always' => 'Sinteino',
 'underline-never'  => 'Niu',
index 8abcd89..868dd32 100644 (file)
@@ -1148,9 +1148,9 @@ $1",
 'uploadtext' => "Ἔξεστί σοι χρῆσθαι τῷδε τῷ τύπῳ πρὸς ἐπιφόρτισιν ἀρχείων. Τὰ ἤδη ἐπιπεφορτισμένα ἀρχεῖα ἐν τῷ [[Special:FileList|καταλόγῳ ἐπιπεφορτισμένων ἀρχείων]] ή τῷ [[Special:Log/upload|καταλόγῳ ἐπιφορτίσεων]] εἰσί. Αἱ διαγραφαὶ καταγεγραμμέναι ἐν τῷ [[Special:Log/delete|καταλόγῳ διαγραφῶν]] εἰσί.
 
 Ἵνα συμπεριληφθῇ εἰκών τις ἐν δέλτῳ τινί, ἔξεστί σοι χρῆσθαι τοῖς συνδέσμοις:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' (χρῆσις τῆς πλήρους ἐκδόσεως τοῦ ἀρχείου)
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' (χρῆσις ἐκδόσεως τινὸς πλάτους 200 είκονοστοιχείων ἐν τῷ κυτίῳ ἐξ ἀριστερῶν τοῦ ὁρίου, ἔχουσα περιγραφὴν 'alt text')
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' (ἄμεσος σύζευξις μετὰ τοῦ αρχείου μέν, ἄνευ ἐμφανίσεως τοῦ ἀρχείου δέ)",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' (χρῆσις τῆς πλήρους ἐκδόσεως τοῦ ἀρχείου)
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' (χρῆσις ἐκδόσεως τινὸς πλάτους 200 είκονοστοιχείων ἐν τῷ κυτίῳ ἐξ ἀριστερῶν τοῦ ὁρίου, ἔχουσα περιγραφὴν 'alt text')
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' (ἄμεσος σύζευξις μετὰ τοῦ αρχείου μέν, ἄνευ ἐμφανίσεως τοῦ ἀρχείου δέ)",
 'upload-permitted' => 'Ἐπιτρεπόμενοι τύποι ἀρχείων: $1.',
 'upload-preferred' => 'Προκρινόμενοι τύποι ἀρχείων: $1.',
 'upload-prohibited' => 'Ἀπηγορευμένοι τύποι ἀρχείων: $1.',
@@ -1176,12 +1176,12 @@ $1",
 'large-file' => 'Τὸ προτεινόμενον μέγεθος τῶν ἀρχείων οὔκ ἐστι μεγαλύτερον τοῦ $1·
 τοῦδε τοῦ ἀρχείου ἐστὶ $2.',
 'largefileserver' => 'Τόδε τὸ ἀρχεῖον ἐστὶ μεῖζον τοῦ ἐπιτρεπτοῦ ὁρίου βάσει τῆς διαμορφώσεως τῆς ἐξυπηρετητικῆς μηχανῆς.',
-'fileexists' => "Ἀρχεῖόν τι ἔχον τόδε τὸ ὄνομα ἤδη ὑπαρκτὸν ἐστίν· ἔλεγξον τὸ '''<tt>[[:$1]]</tt>''' ἂν μὴ ᾖ βέβαιος περὶ το ἀλλάττειν αὐτό.
-[[$1|thumb]]",
-'fileexists-extension' => "Ἀρχεῖόν τι παρομοίως ὠνομασμένον ὑπάρχει: [[$2|thumb]]
-* Ὄνομα τοῦ πρὸς ἐπιφόρτισιν ἀρχείου: '''<tt>[[:$1]]</tt>'''
-* Ὄνομα ὑπάρχοντος ἀρχείου: '''<tt>[[:$2]]</tt>'''
-Ἐπίλεξον διάφορον ὄνομά τι.",
+'fileexists' => 'Ἀρχεῖόν τι ἔχον τόδε τὸ ὄνομα ἤδη ὑπαρκτὸν ἐστίν· ἔλεγξον τὸ <strong>[[:$1]]</strong> ἂν μὴ ᾖ βέβαιος περὶ το ἀλλάττειν αὐτό.
+[[$1|thumb]]',
+'fileexists-extension' => 'Ἀρχεῖόν τι παρομοίως ὠνομασμένον ὑπάρχει: [[$2|thumb]]
+* Ὄνομα τοῦ πρὸς ἐπιφόρτισιν ἀρχείου: <strong>[[:$1]]</strong>
+* Ὄνομα ὑπάρχοντος ἀρχείου: <strong>[[:$2]]</strong>
+Ἐπίλεξον διάφορον ὄνομά τι.',
 'file-exists-duplicate' => 'Τὸ ἀρχεῖον ἐστὶ διπλότυπον τοῦ/τῶν ἑξῆς {{PLURAL:$1|ἀρχείου|ἀρχείων}}:',
 'uploadwarning' => 'Προμήνυσις ἐπιφορτίσεως',
 'savefile' => 'Σῴζειν ἀρχεῖον',
@@ -1473,7 +1473,7 @@ $1",
 'linksearch-ns' => 'Ὀνοματεῖον:',
 'linksearch-ok' => 'Ζητεῖν',
 'linksearch-text' => 'Ἔξεστί σοι χρῆσθαι ὑποκαταστασίμοις φράσεσιν ὅπως "*.wikipedia.org".<br />
-Ὑποστηριζόμενα πρωτόκολλα: <tt>$1</tt>',
+Ὑποστηριζόμενα πρωτόκολλα: <code>$1</code>',
 'linksearch-line' => '$1 συνδεόμενον τῷ $2',
 
 # Special:ListUsers
@@ -2122,13 +2122,8 @@ $1',
 # Info page
 'pageinfo-title' => 'Πύστις περὶ "$1"',
 'pageinfo-header-edits' => 'Μεταγραφαί',
-'pageinfo-header-watchlist' => 'Τὰ ἐφορώμενα',
-'pageinfo-header-views' => 'Προβολαί',
-'pageinfo-subjectpage' => 'Δέλτος',
-'pageinfo-talkpage' => 'Δέλτος διαλέξεως',
-'pageinfo-edits' => 'Ἀριθμὸς μεταγραφῶν',
 'pageinfo-views' => 'Ἀριθμὸς προβολῶν',
-'pageinfo-viewsperedit' => 'Προβολαὶ ἀνὰ μεταγραφήν',
+'pageinfo-edits' => 'Ἀριθμὸς μεταγραφῶν',
 
 # Patrolling
 'markaspatrolleddiff' => 'Σεσημασμένη ὡς φρουρουμένη',
index 69f8b78..271cb56 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Als-Chlämens
  * @author Als-Holder
+ * @author Geitost
  * @author Hendergassler
  * @author J. 'mach' wust
  * @author Kaganer
@@ -126,7 +127,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'displaytitle'            => array( '1', 'SYTETITEL', 'SEITENTITEL', 'DISPLAYTITLE' ),
+       'displaytitle'              => array( '1', 'SYTETITEL', 'SEITENTITEL', 'DISPLAYTITLE' ),
 );
 
 $linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
@@ -173,7 +174,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Bearbeitige vu aagmäldete Benutzer usblände',
 'tog-watchlisthideanons' => 'Bearbeitige vu anonyme Benutzer (IP-Adresse) usblände',
 'tog-watchlisthidepatrolled' => 'vum Fäldhieter aagluegti Änderige in dr Beobachtigslischt usblände',
-'tog-nolangconversion' => 'Konvertierig vu Sprachvariante abschalte',
 'tog-ccmeonemails' => 'Schick mr Kopie vo de E-Mails, won i andere schick.',
 'tog-diffonly' => 'Numme Versionsunterschiid aazeige, ohni d Syte',
 'tog-showhiddencats' => 'Zeig di versteckte Kategorie',
@@ -1434,7 +1434,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'nchanges' => '$1 {{PLURAL:$1|Änderig|Änderige}}',
 'recentchanges' => 'Letschti Änderige',
 'recentchanges-legend' => 'Optione vu dr Aazeig',
-'recentchanges-summary' => 'Uff däre Syte chönne Si die letschte Änderige in däm Wiki aaluege.',
+'recentchanges-summary' => 'Uf däre Syte chasch di letschte Änderige in däm Wiki aaluege.',
 'recentchanges-feed-description' => 'Di letschten Änderige vo {{SITENAME}} i däm Feed abonniere.',
 'recentchanges-label-newpage' => 'Die Bearbeitig het e neji Syte aagleit',
 'recentchanges-label-minor' => 'Des isch e chleini Änderig',
@@ -1497,7 +1497,7 @@ Weli Dateie uffeglade sin, sihsch im [[Special:Log/upload|Logbuech vu dr uffegla
 Zum e Datei oder e Bild in ere Syte yyzböue, schryybsch eifach:
 * '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:file.jpg]]</nowiki>''' fir di voll Version vu dr Datei
 * '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:file.png|al text]]</nowiki>''' fir e 200 Pixel grossi Version im e Chaschte mit 'alt text' as Bschrybig
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' fir e diräkt Link zuer dr Datei ohni ass si aazeigt wird",
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' fir e diräkt Link zuer dr Datei ohni ass si aazeigt wird",
 'upload-permitted' => 'Dateitype, wu erlaubt sin: $1.',
 'upload-preferred' => 'Dateitype, wu bevorzugt sin: $1.',
 'upload-prohibited' => 'Dateitype, wu nit erlaubt sin: $1.',
@@ -1540,22 +1540,22 @@ Lueg au d [[Special:NewFiles|Galerii vu neije Dateie]] fir e visuälle Iberblick
 'largefileserver' => 'Die Datei isch gresser wie die vum Server yygstellti Maximalgressi.',
 'emptyfile' => 'Di uffeglade Datei isch schyyns läär. Dr Grund cha ne Tippfähler im Dateiname syy. Bitte iberprief, eb du die Datei wirkli wit uffelade.',
 'windows-nonascii-filename' => 'Des Wiki unterstitzt kei Dateinäme mit Sonderzeiche.',
-'fileexists' => "S git scho ne Datei mit däm Name.
-Wänn Du uf \"Datei spichere\" drucksch, no wird die Datei iberschribe.
-Bitte prief '''<tt>[[:\$1]]</tt>''', wänn Der nit sicher bisch.
-[[\$1|thumb]]",
-'filepageexists' => "E Bschryybigssyte isch scho as '''<tt>[[:$1]]</tt>''' aagleit wore, s git aber kei Datei mit däm Name.
+'fileexists' => 'S git scho ne Datei mit däm Name.
+Wänn Du uf "Datei spichere" drucksch, no wird die Datei iberschribe.
+Bitte prief <strong>[[:$1]]</strong>, wänn Der nit sicher bisch.
+[[$1|thumb]]',
+'filepageexists' => 'E Bschryybigssyte isch scho as <strong>[[:$1]]</strong> aagleit wore, s git aber kei Datei mit däm Name.
 Die Zämmefassig, wu Du yygee hesch, wird nit uf d Bschryybigssyte ibernuh.
 Du muesch d Bschryybigssyte noch em Uffelade vu dr Datei no manuäll bearbeite.
-[[$1|thumb]]",
-'fileexists-extension' => "S git scho ne Datei mit eme ähnlige Name: [[$2|thumb]]
-* Name vu Datei, wu soll uffeglade were: '''<tt>[[:$1]]</tt>'''
-* Name vu dr Datei, wu s scho git: '''<tt>[[:$2]]</tt>'''
-Bitte wehl e andre Name.",
+[[$1|thumb]]',
+'fileexists-extension' => 'S git scho ne Datei mit eme ähnlige Name: [[$2|thumb]]
+* Name vu Datei, wu soll uffeglade were: <strong>[[:$1]]</strong>
+* Name vu dr Datei, wu s scho git: <strong>[[:$2]]</strong>
+Bitte wehl e andre Name.',
 'fileexists-thumbnail-yes' => "Die Datei isch schyyns e Bild mit ere verringerte Gressi ''(thumbnail)''. [[$1|thumb]]
-Bitte prief d Datei '''<tt>[[:$1]]</tt>'''.
+Bitte prief d Datei <strong>[[:$1]]</strong>.
 Wänn s Bild in dr Originalgressi isch, no isch s nit netig, ass e extra Vorschaubild uffeglade wird.",
-'file-thumbnail-no' => "Dr Dateiname fangt mit '''<tt>$1</tt>''' aa. Des wyyst uf e Bild mit ere verringerte Gressi ''(thumbnail)'' hi.
+'file-thumbnail-no' => "Dr Dateiname fangt mit <strong>$1</strong> aa. Des wyyst uf e Bild mit ere verringerte Gressi ''(thumbnail)'' hi.
 Bitte prief, eb D s Bild in voller Uflesig vorlige hesch un lad derno des unter em Originalname uffe.",
 'fileexists-forbidden' => 'S git scho ne Datei mit däm Name. Si cha nit iberschribe wäre. Bitte gang zruck un lad die Datei unter eme andere Name uffe. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'S git scho ne Datei mit däm Name im Zentrale Mediearchiv.
@@ -1796,7 +1796,7 @@ Villicht witt d Bschryybig uf dr dertige [$2 Dateibschryybigssyte] bearbeite.',
 
 # MIME search
 'mimesearch' => 'MIME-Suechi',
-'mimesearch-summary' => 'Uf däre Spezialsyte chenne d Dateie noch em MIME-Typ gfilteret wäre. In dr Yygob muess es alliwyl dr Medie- un Subtyp din haa: <tt>image/jpeg</tt> (lueg Bildbschryybigssyte).',
+'mimesearch-summary' => 'Uf däre Spezialsyte chenne d Dateie noch em MIME-Typ gfilteret wäre. In dr Yygob muess es alliwyl dr Medie- un Subtyp din haa: <code>image/jpeg</code> (lueg Bildbschryybigssyte).',
 'mimetype' => 'MIME-Typ:',
 'download' => 'Abelade',
 
@@ -1992,7 +1992,7 @@ Lueg au d Lischt vu dr [[Special:WantedCategories|gwinschte Kategorie]].',
 'linksearch-pat' => 'Suechmuschter:',
 'linksearch-ns' => 'Namensruum:',
 'linksearch-ok' => 'Sueche',
-'linksearch-text' => 'Die Spezialsyte macht d Suechi no Syte megli, wu s bstimmti Weblink din het. Doderby chenne Platzhalter wie zem Byschpel <tt>*.byschpel.de</tt> brucht wäre. S mueß zmindecht ei Top-Level-Domain, z. B. „*.org“. aagee wäre. <br />Unterstitzti Protokoll: <tt>$1</tt> (Die bitte nit bi dr Suechaafrog aagee.)',
+'linksearch-text' => 'Die Spezialsyte macht d Suechi no Syte megli, wu s bstimmti Weblink din het. Doderby chenne Platzhalter wie zem Byschpel <code>*.byschpel.de</code> brucht wäre. S mueß zmindecht ei Top-Level-Domain, z. B. „*.org“. aagee wäre. <br />Unterstitzti Protokoll: <code>$1</code> (Die bitte nit bi dr Suechaafrog aagee.)',
 'linksearch-line' => '$1 isch vo $2 verknüpft',
 'linksearch-error' => 'Platzhalter chönne numme am Aafang verwändet werre.',
 
@@ -2792,15 +2792,10 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 # Info page
 'pageinfo-title' => 'Informatione zue „$1“',
 'pageinfo-header-edits' => 'Bearbeitunge',
-'pageinfo-header-watchlist' => 'Beobachtigslischte',
-'pageinfo-header-views' => 'Ufruef',
-'pageinfo-subjectpage' => 'Syte',
-'pageinfo-talkpage' => 'Diskussionssyte',
+'pageinfo-views' => 'Aazahl Sytenufruef',
 'pageinfo-watchers' => 'Aazahl vu Beobachter',
 'pageinfo-edits' => 'Aazahl Bearbeitige',
 'pageinfo-authors' => 'Aazahl vu unterschidlige Autore',
-'pageinfo-views' => 'Aazahl Sytenufruef',
-'pageinfo-viewsperedit' => 'Sytenufruef pro Bearbeitig',
 
 # Patrolling
 'markaspatrolleddiff' => 'Als patrulyrt markyre',
@@ -3648,6 +3643,7 @@ Sunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit D
 'api-error-file-too-large' => 'D Datei, wu Du ibertrait hesch, isch z groß.',
 'api-error-filename-tooshort' => 'Dr Dateiname isch z churz.',
 'api-error-filetype-banned' => 'Dää Dateityp isch gsperrt.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|isch e Dateiformat, wu nit erlaubt isch|sin Dateitype, wu nit erlaubt sin}}.  Erlaubt {{PLURAL:$3|isch s Dateiformat|sin d Dateiformat}} $2.',
 'api-error-filetype-missing' => 'D Datei het kei Dateinameerwyterig.',
 'api-error-hookaborted' => 'D Änderig, wu Du versuecht hesch, isch wäg eme Erwyterigs-Hooks abbroche wore.',
 'api-error-http' => 'Intärne Fähler: S het kei Verbindig zum Server chenne härgstellt wäre.',
index f6d58d5..473f0c6 100644 (file)
@@ -154,7 +154,7 @@ $messages = array(
 'tog-hidepatrolled' => 'હાલના સલામતી માટે કરવામાં આવેલાં થયેલા ફેરફારો છુપાવો.',
 'tog-newpageshidepatrolled' => 'નવાં પાનાંની યાદીમાંથી દેખરેખ હેઠળનાં પાનાં છુપાવો',
 'tog-extendwatchlist' => 'ધ્યાનસૂચિને વિસ્તૃત કરો જેથી,ફક્ત તાજેતરનાજ નહીં, બધા આનુષાંગિક ફેરફારો જોઇ શકાય',
-'tog-usenewrc' => 'તાજેતરનાં વર્ધિત ફેરફારો (જાવાસ્ક્રીપ્ટ જરૂરી)',
+'tog-usenewrc' => 'તાજેતરનાં વર્ધિત ફેરફારો વાપરો(જાવાસ્ક્રીપ્ટ જરૂરી)',
 'tog-numberheadings' => 'મથાળાંઓને આપો-આપ ક્રમ (ઑટો નંબર) આપો',
 'tog-showtoolbar' => 'ફેરફારો માટેનો ટૂલબાર બતાવો (જાવા સ્ક્રિપ્ટ)',
 'tog-editondblclick' => 'ડબલ ક્લિક દ્વારા ફેરફાર કરો (જાવાસ્ક્રિપ્ટ જરૂરી)',
@@ -162,21 +162,21 @@ $messages = array(
 'tog-editsectiononrightclick' => 'વિભાગના મથાળાં ને રાઇટ ક્લિક દ્વારા ફેરફાર કરવાની રીત અપનાવો. (જાવાસ્ક્રિપ્ટ જરૂરી)',
 'tog-showtoc' => 'અનુક્રમણિકા દર્શાવો (૩થી વધુ પેટા-મથાળા વાળા લેખો માટે)',
 'tog-rememberpassword' => 'આ કમ્પ્યૂટર પર મારી લોગ-ઇન વિગતો યાદ રાખો (મહત્તમ $1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
-'tog-watchcreations' => 'મà«\87àª\82 àª²àª\96à«\87લા àª¨àªµàª¾ àª²à«\87àª\96à«\8b મારી ધ્યાનસૂચિમાં ઉમેરો',
-'tog-watchdefault' => 'હું ફેરફાર કરૂં તે પાના મારી ધ્યાનસૂચિમાં ઉમેરો',
-'tog-watchmoves' => 'હà«\81àª\82 àª\9cà«\87નà«\81àª\82 àª¨àª¾àª® àª¬àª¦àª²à«\81àª\82 àª¤à«\87 àªªàª¾àª¨àª¾ મારી ધ્યાનસૂચિમાં ઉમેરો',
-'tog-watchdeletion' => 'હà«\81àª\82 àª¹àª\9fાવà«\81àª\82 àª¤à«\87 àªªàª¾àª¨àª¾ મારી ધ્યાનસૂચિમાં ઉમેરો',
+'tog-watchcreations' => 'મà«\87àª\82 àª\89મà«\87રà«\87લા àªªàª¾àª¨àª¾àª\82àª\93 àª\85નà«\87 àª\85પલà«\8bડ àª\95રà«\87લ àª«àª¾àª\87લà«\8dસ મારી ધ્યાનસૂચિમાં ઉમેરો',
+'tog-watchdefault' => 'હું ફેરફાર કરૂં તે પાનાં અને ફાઇલ્સ મારી ધ્યાનસૂચિમાં ઉમેરો',
+'tog-watchmoves' => 'હà«\81àª\82 àª\96સà«\87ડà«\81àª\82 àª¤à«\87 àªªàª¾àª¨àª¾àª\82 àª\85નà«\87 àª«àª¾àª\87લà«\8dસ મારી ધ્યાનસૂચિમાં ઉમેરો',
+'tog-watchdeletion' => 'હà«\81àª\82 àª¦à«\82ર àª\95રà«\81àª\82 àª¤à«\87 àªªàª¾àª¨àª¾àª\82 àª\85નà«\87 àª«àª¾àª\87લà«\8dસ મારી ધ્યાનસૂચિમાં ઉમેરો',
 'tog-minordefault' => 'બધા નવા ફેરફારો નાના તરીકે માર્ક કરો.',
 'tog-previewontop' => 'એડીટ બોક્સ પહેલાં પ્રિવ્યુ બતાવો.',
 'tog-previewonfirst' => 'પ્રથમ ફેરફાર વખતે પ્રિવ્યુ બતાવો.',
 'tog-nocache' => 'બ્રાઉઝરનું પેજ કેશિંગ અક્રિય કરો',
-'tog-enotifwatchlistpages' => 'મારà«\80 àª§à«\8dયાનસà«\82àª\9aિમાàª\82નાàª\82 àªªàª¾àª¨àª¾માં ફેરફાર થાય ત્યારે મને ઇ-મેલ મોકલો',
+'tog-enotifwatchlistpages' => 'મારà«\80 àª§à«\8dયાનસà«\82àª\9aિમાàª\82નà«\81àª\82 àªªàª¾àª¨à«\81 àª\85નà«\87 àª«àª¾àª\87લમાં ફેરફાર થાય ત્યારે મને ઇ-મેલ મોકલો',
 'tog-enotifusertalkpages' => 'મારી ચર્ચાનાં પાનામાં ફેરફાર થાય ત્યારે મને ઇ-મેલ મોકલો',
-'tog-enotifminoredits' => 'પાનામાàª\82 àª¨àª¾àª¨àª¾àª\82 àª«à«\87રફાર àª¥àª¾àª¯ àª¤à«\8dયારà«\87 પણ મને ઇ-મેલ મોકલો',
+'tog-enotifminoredits' => 'પાનાàª\82 àª\85નà«\87ફાàª\87લà«\8dસમાàª\82 àª¨àª¾àª¨àª¾àª\82 àª«à«\87રફાર àª¥àª¾àª¯ àª¤à«\8b પણ મને ઇ-મેલ મોકલો',
 'tog-enotifrevealaddr' => 'નોટીફીકેશનના ઇમેલમાં મારૂ ઇમેલ એડ્રેસ બતાવો',
 'tog-shownumberswatching' => 'ધ્યાનમાં રાખતા સભ્યોની સંખ્યા બતાવો',
 'tog-oldsig' => 'હાલના હસ્તાક્ષર',
-'tog-fancysig' => 'સà«\8dવાàª\9aાલિત àª\95ડà«\80 àªµàª\97રનà«\80 (àª\95ાàª\9aà«\80) àª¸àª¹à«\80',
+'tog-fancysig' => 'હસà«\8dતાàª\95à«\8dષરનà«\8b àªµàª¿àª\95િલàª\96ાણ àª¤àª°à«\80àª\95à«\87 àª\89પયà«\8bàª\97 àª\95રà«\8b (સà«\8dવàª\9aાલિત àª\95ડà«\80 àªµàª\97ર)',
 'tog-externaleditor' => 'બીજું એડીટર વાપરો. (ફક્ત એકસપર્ટ માટે, તમારા કમ્પ્યુટરમાં સેટીંગ્સ બદલવા પડશે. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-externaldiff' => 'Use external diff by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => "''આના પર જાવ'' કડીને સક્રીય કરો.",
@@ -188,7 +188,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'લોગ થયેલા સભ્ય દ્વારા કરવામાં આવેલ ફેરફાર ધ્યાનસુચીમાં છુપાવો.',
 'tog-watchlisthideanons' => 'અજાણ્યાસભ્ય દ્વારા થયેલ ફેરફાર મારી ધ્યાનસુચીમાં છુપાવો.',
 'tog-watchlisthidepatrolled' => 'સુરક્ષા કાજે કરવામાં આવેલ ફેરફાર મારી ધ્યાનસુચીમાં છુપાવો.',
-'tog-nolangconversion' => 'Variants conversion અક્ષમ કરો',
 'tog-ccmeonemails' => 'મે અન્યોને મોકલેલા ઇ-મેઇલની નકલ મને મોકલો',
 'tog-diffonly' => 'તફાવતની નીચે લેખ ન બતાવશો.',
 'tog-showhiddencats' => 'છુપી શ્રેણીઓ દર્શાવો',
@@ -419,6 +418,8 @@ $1',
 'youhavenewmessages' => 'તમારા માટે $1 ($2).',
 'newmessageslink' => 'નવીન સંદેશ',
 'newmessagesdifflink' => 'છેલ્લો ફેરફાર',
+'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશ|નવાં સંદેશાઓ}}',
+'newmessagesdifflinkplural' => 'છેલ્લા {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
 'youhavenewmessagesmulti' => '$1 ઉપર તમારા માટે નવો સંદેશ છે.',
 'editsection' => 'ફેરફાર કરો',
 'editsection-brackets' => '[$1]',
@@ -448,7 +449,7 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'લેખ',
-'nstab-user' => 'મારા àªµàª¿àª·à«\87',
+'nstab-user' => 'સભà«\8dય àªªàª¾àª¨à«\81àª\82',
 'nstab-media' => 'મિડીયા પાનું',
 'nstab-special' => 'ખાસ પાનું',
 'nstab-project' => 'પરિયોજનાનું પાનું',
@@ -543,6 +544,7 @@ $2',
 'ns-specialprotected' => 'ખાસ પાનાંમાં ફેરફાર ન થઇ શકે.',
 'titleprotected' => 'આ મથાળું (વિષય) [[User:$1|$1]] બનાવવા માટે સુરક્ષિત કરવામાં આવ્યો છે.
 આ માટેનું કારણ છે-- "\'\'$2\'\'".',
+'exception-nologin' => 'પ્રવેશ કરેલ નથી',
 
 # Virus scanner
 'virus-badscanner' => "ખરાબ રૂપરેખા: અજાણ્યું વાઇરસ સ્કેનર: ''$1''",
@@ -563,6 +565,7 @@ $2',
 'remembermypassword' => 'આ કોમ્યૂટર પર મારી લૉગ ઇન વિગતો ધ્યાનમાં રાખો (વધુમાં વધુ $1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
 'securelogin-stick-https' => 'લોગ-ઈન કર્યા પછી  HTTPS સાથે જોડાયેલા રહો.',
 'yourdomainname' => 'તમારૂં ડોમેઇન:',
+'password-change-forbidden' => 'તમે આ વિકિ માટે પાસવર્ડ્સ બદલી શકતા નથી.',
 'externaldberror' => 'પ્રમાણભૂતતાની ત્રુટી આવી અથવા તમારૂ બહારનુ ખાતું અપડેટ કરવાનો અધિકાર તમને નથી.',
 'login' => 'પ્રવેશ કરો',
 'nav-login-createaccount' => 'પ્રવેશ કરો / નવું ખાતું ખોલો',
@@ -642,6 +645,7 @@ Please log in again after you receive it.
 'invalidemailaddress' => 'આ ઈ-મેલ અયોગ્ય માળખું ધરાવ્હે છે  માટે સ્વીકારી શકાશે નહીં
 કૃપયા યોગ્ય માળખામાં ઇ-મેલ લખો',
 'cannotchangeemail' => 'એકાઉન્ટ ઈ મેલ એડ્રસ આ વીકી પર નહિ બદલી શકાય.',
+'emaildisabled' => 'આ સાઇટ ઇ-મેલ્સ મોકલી શકતી નથી.',
 'accountcreated' => 'ખાતું ખોલવામાં આવ્યું છે',
 'accountcreatedtext' => '$1 માટે સભ્ય ખાતુ બનાવ્યું.',
 'createaccount-title' => '{{SITENAME}} માટે ખાતુ બનાવ્યું',
@@ -841,7 +845,8 @@ $2
 'updated' => '(સંવર્ધીત)',
 'note' => "'''નોંધ:'''",
 'previewnote' => "'''આ ફક્ત પૂર્વાવલોકન છે;'''
-ફેરફારો હજુ સાચવવામાં નથી આવ્યા!",
+તમારા ફેરફારો હજુ સાચવવામાં નથી આવ્યા!",
+'continue-editing' => 'વાંચવાનું ચાલુ રાખો',
 'previewconflict' => 'જો તમે આ પાનું સાચવશો તો આ પ્રિવ્યુમાં દેખાય છે તેવું સચવાશે.',
 'session_fail_preview' => "'''અફસોસ છે! સત્ર માહિતી ખોઇ દેવાને કારણે અમે તમારું કાર્ય સાચવી ન શક્યાં.'''
 કૃપયા ફરી પ્રયત્ન કરો.
@@ -857,6 +862,7 @@ $2
 જ્યારે તમે વેબ આધારિત  અજ્ઞાત પ્રોક્સી વાપરતા હોવ ત્યારે આવું બની શકે છે.",
 'edit_form_incomplete' => "'''ફેરફાર પત્રનો અમુક ભાગ સર્વર સુધી ન પહોંચ્યો; ખાત્રી કરો કે તમે કરેલા ફેરફાર બરાબર છે અને ફરી પ્રયત્ન કરો.'''",
 'editing' => '$1નો ફેરફાર કરી રહ્યા છે',
+'creating' => '$1 બનાવી રહ્યા છો',
 'editingsection' => '$1 (પરિચ્છેદ)નો ફેરફાર કરી રહ્યા છો',
 'editingcomment' => '$1 (પરિચ્છેદ)નો ફેરફાર કરી રહ્યા છો',
 'editconflict' => 'ફેરફારમાં વિસંગતતા: $1',
@@ -868,7 +874,7 @@ $2
 'yourtext' => 'તમારું લખાણ',
 'storedversion' => 'રક્ષિત પુનરાવર્તન',
 'nonunicodebrowser' => "'''ચેતવણી: તમારું બ્રાઉઝર યુનિકોડ ઉકેલવા સક્ષમ નથી.'''
-àª\85હà«\80àª\82 àª¤àª®à«\87 àª¸à«\81રàª\95à«\8dષà«\80ત àª°à«\80તà«\87 àª«à«\87રફરà«\8b àª¨àª¹à«\80àª\82 àª\95રà«\80 àª¶àª\95à«\8b: ASCII àª¸àª¿àªµàª¾àª¯àª¨àª¾ àª\85àª\95à«\8dષરà«\8b àª«à«\87રફાર ચોકઠામાં હેક્સાડેસિમલ સ્વરૂપે દેખાશે.",
+àª\85હà«\80àª\82 àª¤àª®à«\87 àª¸à«\81રàª\95à«\8dષિત àª°à«\80તà«\87 àª«à«\87રફારà«\8b àª¨àª¹à«\80àª\82 àª\95રà«\80 àª¶àª\95à«\8b: ASCII àª¸àª¿àªµàª¾àª¯àª¨àª¾ àª\85àª\95à«\8dષરà«\8b àª¸àª\82પાદન ચોકઠામાં હેક્સાડેસિમલ સ્વરૂપે દેખાશે.",
 'editingold' => "'''ચેતવણી: તમે કાલાતિત ફેરફારો ને બદલી રહ્યાં છો.'''
 જો તમે તેને સાચવશો , વચમાં થયેલ ફેરફારો સાચવી ન શકાય.",
 'yourdiff' => 'ભેદ',
@@ -890,9 +896,9 @@ $2
 તમારા સંદર્ભ માટે તાજેતરની લોગ યાદિ આપી છે:",
 'semiprotectedpagewarning' => "'''નોંધ : આ પાના પર સંરક્ષણ વિકલ્પ સક્રીય છે અને માત્ર પ્રબંધકો જ આમાં ફેરફાર કરી શકે.'''
 તમારા સંદર્ભ માટે તાજેતરની લોગ યાદિ આપી છે:",
-'cascadeprotectedwarning' => "'''àª\9aà«\87તવણà«\80:''' àª\86 àªªàª¾àª¨à«\81àª\82 àª¸àª\82રàª\95à«\8dષà«\80ત àª\9bà«\87.  àªªà«\8dરબàª\82ધન àª\85ધિàª\95ાર àª§àª°àª¾àªµàª¤àª¾ àª¸àª­à«\8dયà«\8bàª\9c àª\86માàª\82 àª«à«\87રફાર àª\95રà«\80 àª¶àª\95à«\87 àª\9bà«\87. àª\86 àªªàª¾àª¨àª¾àª¨à«\87 àª¨à«\80àª\9aà«\87ના àªªàª\97થિયામય àª¸àª\82રàª\95à«\8dષણ{{PLURAL:$1|page|pages}} àª¦à«\8dવારા àª¸à«\81રàª\95à«\8dષà«\80ત છે.",
-'titleprotectedwarning' => "'''ચેતવણી:  આ પાનું સંરક્ષીત છે  આની રચના માટે [[Special:ListGroupRights|specific rights]] ની જરૂર છે.'''
-તà«\87 àª¸àª\82બàª\82ધà«\80 àª¤àª¾àª\9cà«\87તરનà«\80 àª«à«\87રફાર àª¯àª¾àª¦àª¿ તમારા સંદર્ભ માટે આપેલી છે:",
+'cascadeprotectedwarning' => "'''àª\9aà«\87તવણà«\80:''' àª\86 àªªàª¾àª¨à«\81àª\82 àª¸àª\82રàª\95à«\8dષિત àª\9bà«\87. àªªà«\8dરબàª\82ધન àª\85ધિàª\95ાર àª§àª°àª¾àªµàª¤àª¾ àª¸àª­à«\8dયà«\8b àª\9c àª\86માàª\82 àª«à«\87રફાર àª\95રà«\80 àª¶àª\95à«\87 àª\9bà«\87. àª\86 àªªàª¾àª¨à«\81àª\82 àª¨à«\80àª\9aà«\87ના àªªàª\97થિયામય àª¸àª\82રàª\95à«\8dષણ{{PLURAL:$1|પાના|પાનાàª\93}} àª¦à«\8dવારા àª¸à«\81રàª\95à«\8dષિત છે.",
+'titleprotectedwarning' => "'''ચેતવણી: આ પાનું સંરક્ષિત છે આથી આની રચના માટે [[Special:ListGroupRights|વિશેષ અધિકારો]]ની જરૂર છે.'''
+તà«\87 àª¸àª\82બàª\82ધà«\80 àª¤àª¾àª\9cà«\87તરનà«\80 àª«à«\87રફાર àª¯àª¾àª¦à«\80 તમારા સંદર્ભ માટે આપેલી છે:",
 'templatesused' => 'આ પાનામાં વપરાયેલ {{PLURAL:$1|ઢાંચો|ઢાંચાઓ}}:',
 'templatesusedpreview' => 'આ પૂર્વાવલોકનમાં વપરાયેલ {{PLURAL:$1|ઢાંચો|ઢાંચાઓ}}:',
 'templatesusedsection' => 'આ ખંડ માં વપરાયેલા {{PLURAL:$1|ઢાંચો|ઢાંચા}} :',
@@ -923,6 +929,7 @@ $2
 'edit-no-change' => 'તમારા ફેરફારો અવગણાયા, કેમકે અક્ષરકાયામાં કોઈ ફેરફારાના હતો',
 'edit-already-exists' => 'નવું પાનું બનાવી ન શકાયું
 તે પહેલેથી હાજર છે.',
+'defaultmessagetext' => 'મૂળભૂત સંદેશ લખાણ',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ચેતવણી:''' આ પાનું ખૂબ ખર્ચાળ પદચ્છેદ સૂત્ર ધરાવે છે.
@@ -1083,8 +1090,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'દાબ નોંધ',
-'suppressionlogtext' => 'નà«\80àª\9aà«\87 àªªà«\8dરબàª\82ધàª\95à«\8bથà«\80 àª\9bà«\81પાયà«\87લ àª\8fવા àª¹àª\9fાવ àª\85નà«\87 àª°à«\8bàª\95નà«\80 àª¯àª¾àª¦àª¿ આપેલી છે.
-હાલમાં સક્રીય એવા  પ્રતિબંધ અને રોકની યાદિ અહીં [[Special:BlockList|IP block list]]  આપેલ છે.',
+'suppressionlogtext' => 'નà«\80àª\9aà«\87 àªªà«\8dરબàª\82ધàª\95à«\8bથà«\80 àª\9bà«\81પાયà«\87લ àª\8fવા àª¹àª\9fાવ àª\85નà«\87 àª°à«\8bàª\95નà«\80 àª¯àª¾àª¦à«\80 આપેલી છે.
+હાલમાં સક્રીય એવા પ્રતિબંધ અને રોકની યાદિ [[Special:BlockList|અહીં]] આપેલ છે.',
 
 # History merging
 'mergehistory' => 'પાનાનાં ઇતિહાસોનું વિલીનીકરણ',
@@ -1119,6 +1126,8 @@ $1",
 
 # Diffs
 'history-title' => '"$1"ના ફેરફારોનો ઇતિહાસ',
+'difference-title' => '"$1" ની આવૃત્તિઓ વચ્ચેનો તફાવત',
+'difference-title-multipage' => '"$1" અને "$2" પાનાંઓ વચ્ચેનો તફાવત',
 'difference-multipage' => '(પાનાઓ વચ્ચેનો ફેરફાર)',
 'lineno' => 'લીટી $1:',
 'compareselectedversions' => 'પસંદ કરેલા સરખાવો',
@@ -1216,6 +1225,7 @@ $1",
 'prefs-beta' => 'બીટા લક્ષણો',
 'prefs-datetime' => 'તારીખ અને સમય',
 'prefs-labs' => 'પ્રયોગશાળા લક્ષણો',
+'prefs-user-pages' => 'સભ્ય પાનાંઓ',
 'prefs-personal' => 'સભ્ય ઓળખ',
 'prefs-rc' => 'તાજા ફેરફારો',
 'prefs-watchlist' => 'ધ્યાનસૂચિ',
@@ -1240,7 +1250,7 @@ $1",
 'searchresultshead' => 'શોધો',
 'resultsperpage' => 'પ્રતિ પાના પર પરિણામો',
 'stub-threshold' => '<a href="#" class="stub">stub link</a>નાફોર્મમેટિંગ માટે શરૂઆતિ પગથિયું  (બાઈટ્સ):',
-'stub-threshold-disabled' => 'નિષà«\8dàª\95à«\8dરà«\80યાનà«\8dવà«\80ત',
+'stub-threshold-disabled' => 'નિષà«\8dàª\95à«\8dરિય àª\95રà«\87લ',
 'recentchangesdays' => 'તાજા ફેરફારોમાં દેખાડવાના દિવસો',
 'recentchangesdays-max' => 'મહત્તમ  $1 {{PLURAL:$1|દિવસ|દિવસો}}',
 'recentchangescount' => 'સમાન્ય પણે ફલકમાં બતાવવાના ફેરફારોની સંખ્યા',
@@ -1409,7 +1419,7 @@ HTML નાકું ચકાસો',
 'right-ipblock-exempt' => 'IP દ્વારા, સ્વયં ચાલિત રીતે અને સમૂહ રોકને અવગનીને આગળ વધો',
 'right-proxyunbannable' => 'અવેજીના અવયંચાલિત ખંડોને ટાળો',
 'right-unblockself' => 'તેમને જાતે અપ્રતિબંધિત થવા દો',
-'right-protect' => 'સàª\82રàª\95à«\8dષણ àª¸à«\8dતર àª¬àª¦àª²à«\8b àª\85નà«\87 àª¸àª\82રàª\95à«\8dષà«\80ત àªªàª¾àª¨àª¾માં ફેરફાર કરો.',
+'right-protect' => 'સàª\82રàª\95à«\8dષણ àª¸à«\8dતર àª¬àª¦àª²à«\8b àª\85નà«\87 àª¸àª\82રàª\95à«\8dષિત àªªàª¾àª¨àª¾àª\93માં ફેરફાર કરો.',
 'right-editprotected' => 'સંરક્ષિત પાનામાં ફેરફાર કરો (પગથિયામય સુરક્ષા વગર)',
 'right-editinterface' => 'સભ્ય સંભાષણ પટલમાં ફેરફાર કરો',
 'right-editusercssjs' => 'અન્ય સભ્યોની CSS અને JavaScript ફાઇલમાં ફેરફાર કરો',
@@ -1441,7 +1451,7 @@ HTML નાકું ચકાસો',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'આ પાનું વાંચો.',
-'action-edit' => 'àª\86 àªªàª¾àª¨àª¾àª®àª¾àª\82 àª«à«\87રફાર àª\95રવાનà«\80',
+'action-edit' => 'àª\86 àªªàª¾àª¨àª¾àª®àª¾àª\82 àª«à«\87રફાર àª\95રà«\8b',
 'action-createpage' => 'નવો લેખ શરૂ કરો',
 'action-createtalk' => 'ચર્ચાનું પાનું બનાવો',
 'action-createaccount' => ' ખાતું ખોલો',
@@ -1492,7 +1502,7 @@ HTML નાકું ચકાસો',
 'rcshowhideminor' => 'નાના ફેરફારો $1',
 'rcshowhidebots' => 'બૉટો $1',
 'rcshowhideliu' => 'લૉગ ઇન થયેલાં સભ્યો $1',
-'rcshowhideanons' => 'àª\85નામિ સભ્યો $1',
+'rcshowhideanons' => 'àª\85નામà«\80 સભ્યો $1',
 'rcshowhidepatr' => ' $1 ચોકીયાત ફેરફારો',
 'rcshowhidemine' => 'મારા ફેરફારો $1',
 'rclinks' => 'છેલ્લાં $2 દિવસમાં થયેલા છેલ્લાં $1 ફેરફારો દર્શાવો<br />$3',
@@ -1538,9 +1548,9 @@ HTML નાકું ચકાસો',
 પહેલા ચડાવાયેલી ફાઇલ અહીં જુઓ કે શોધો  [[Special:FileList|list of uploaded files]], (પુનઃ) ચડાવેલી ફાઇલ પણ લોગમાં અહીં દર્શાવાઇ છે.  [[Special:Log/upload|upload log]], હટાવાયેલી ફાઇલોની યાદિ  [[Special:Log/delete|deletion log]].
 
 કોઇ ફાઇલને પાનામાં ઉમેરવા માટે, નીચેની કોઇ એક કડી પર ક્લિક કરો:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' ફાઇલની પૂર્ણ આવૃત્તિ વાપરવા 
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' to use a ડાબા હાંસિયા નજીક ચોકઠામાં 200 પિક્સેલ પહોળી ફાઇલ   'alt text' સાથે વર્ણન સહીત ચડાવવા 
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' ફાઇલના દર્શન કર્યા સિવાય સીધી ફાઇલ જોડવા માટે",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ફાઇલની પૂર્ણ આવૃત્તિ વાપરવા 
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' to use a ડાબા હાંસિયા નજીક ચોકઠામાં 200 પિક્સેલ પહોળી ફાઇલ   'alt text' સાથે વર્ણન સહીત ચડાવવા 
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' ફાઇલના દર્શન કર્યા સિવાય સીધી ફાઇલ જોડવા માટે",
 'upload-permitted' => 'રજામંદ ફાઈલ પ્રકારો: $1.',
 'upload-preferred' => 'ઈચ્છીત ફાઈલ પ્રકારો: $1.',
 'upload-prohibited' => 'પ્રતિબંધીત ફાઈલ પ્રકારો: $1.',
@@ -1588,20 +1598,20 @@ HTML નાકું ચકાસો',
 કદાચ તે તેમાં રહેલ લાહિતીના પ્રકારને લીધે હશે.
 કૃપયા ખાત્રી કરો શું તમે ખરેખર આ ફાઇલ ચડાવવા માંગો છો.',
 'windows-nonascii-filename' => 'આ વીકી ફાઇલનામો મા વિશિષ્ટ અક્ષરો સાથે આધાર આપતું નથી.',
-'fileexists' => "આ નામે એક ફાઇલ પહેલેથી અસ્તિત્વમાં છે, કૃપયા  જો તમને ખાત્રી ન હોય તો અથવા બદલવા માંગતા હોય તો  '''<tt>[[:$1]]</tt>''' ચકાસો [[$1|thumb]]",
-'filepageexists' => "આ ફાઇલનું માહિતી પત્રક  '''<tt>[[:$1]]</tt>'''પર પહેલેથી અસ્તિત્વમાં છે, પણ તેનામે કોઇ ફાઇલ અસ્તિત્વમાં નથી.
+'fileexists' => 'આ નામે એક ફાઇલ પહેલેથી અસ્તિત્વમાં છે, કૃપયા  જો તમને ખાત્રી ન હોય તો અથવા બદલવા માંગતા હોય તો  <strong>[[:$1]]</strong> ચકાસો [[$1|thumb]]',
+'filepageexists' => 'આ ફાઇલનું માહિતી પત્રક  <strong>[[:$1]]</strong>પર પહેલેથી અસ્તિત્વમાં છે, પણ તેનામે કોઇ ફાઇલ અસ્તિત્વમાં નથી.
 તમે લખેલ સારાંશએ વર્ણનમાં નહીં દેખાય.
 તમે જો ઇચ્છો કે તમારો સારાંશ આમાં દેખાય તો, તે માટે તમારે જાતે તેમાં ફેરેફાર કરવો પડશે. 
-[[$1|thumb]]",
-'fileexists-extension' => "આ જ નામે ફાઇલ પહેલેથી અસ્તિત્વ માં છે: [[$2|thumb]]
-* ચડાવાતી ફાઇલનું નામ છે: '''<tt>[[:$1]]</tt>'''
-* ઓઅહેલેથી વિહરમાન ફાઇલનું નામ : '''<tt>[[:$2]]</tt>'''
-કૃપયા અન્ય નામ આપો.",
-'fileexists-thumbnail-yes' => "આ ફાઇલ સંકોચેલી ફાઇલનું લઘુ ચિત્ર છે.
+[[$1|thumb]]',
+'fileexists-extension' => 'આ જ નામે ફાઇલ પહેલેથી અસ્તિત્વ માં છે: [[$2|thumb]]
+* ચડાવાતી ફાઇલનું નામ છે: <strong>[[:$1]]</strong>
+* ઓઅહેલેથી વિહરમાન ફાઇલનું નામ : <strong>[[:$2]]</strong>
+કૃપયા અન્ય નામ આપો.',
+'fileexists-thumbnail-yes' => 'આ ફાઇલ સંકોચેલી ફાઇલનું લઘુ ચિત્ર છે.
 [[$1|thumb]]
-કૃપયા ફાઇલ તપાસો  '''<tt>[[:$1]]</tt>'''.
-જો તપાસેલી ફાઇલ તેની મૂળ પ્રતની આકૃતિ હોય તો વધારાની લઘુચિત્ર ચડાવવાની જરૂર નથી.",
-'file-thumbnail-no' => "ફાઇલનું નામ '''<tt>$1</tt>'''થી શરૂ થાય છે.
+કૃપયા ફાઇલ તપાસો  <strong>[[:$1]]</strong>.
+જો તપાસેલી ફાઇલ તેની મૂળ પ્રતની આકૃતિ હોય તો વધારાની લઘુચિત્ર ચડાવવાની જરૂર નથી.',
+'file-thumbnail-no' => "ફાઇલનું નામ <strong>$1</strong>થી શરૂ થાય છે.
 લાગે છે કે આ ઘટાડેલા કદનું ચિત્ર  ''(thumbnail)'' છે..
 જો તમારી સાથે પૂર્ણ ઘનત્વ ધરાવતી ચિત્રની ફાઇલ હોય તો જ આ ફાઇલ ચડાવશો, અન્યથા ફાઇલનું નામ બદલશો.",
 'fileexists-forbidden' => 'આ નામની ફાઇલ પહેલેથી મોજુદ છે અને તેના ઉપર લેખન કરી શકાશે નહી.
@@ -1846,7 +1856,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 # MIME search
 'mimesearch' => 'MIME શોધ',
 'mimesearch-summary' => 'આ પાનાનો ઉપયોગ MIME-પ્રકાર અનુસાર ફીલ્ટર કરવા માટે ઉપયોગ થાય છે.  ફાThis page enables the filtering of files for its MIME-type.
-ઇનપુટ: પ્રકાર, e.g. <tt>image/jpeg</tt>.',
+ઇનપુટ: પ્રકાર, e.g. <code>image/jpeg</code>.',
 'mimetype' => 'MIME પ્રકાર:',
 'download' => 'ડાઉનલોડ',
 
@@ -1871,7 +1881,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'randomredirect-nopages' => 'નામ સ્થળ "$1" માં કોઇ દિશા નિર્દેશન નથી',
 
 # Statistics
-'statistics' => 'àª\86àª\82àª\95ડાàª\95િય àª®àª¾àª¹àª¿àª¤àª¿',
+'statistics' => 'àª\86àª\82àª\95ડાàª\95à«\80ય àª®àª¾àª¹àª¿àª¤à«\80',
 'statistics-header-pages' => 'પાના સંબંધી આંકડાકીય માહિતી',
 'statistics-header-edits' => 'આંકડાકીય માહિતી બદલો',
 'statistics-header-views' => 'આંકડાકીય માહિતી જુઓ',
@@ -1893,9 +1903,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 
 'disambiguations' => 'સંદિગ્ધ શીર્ષકવાળાં પાનાં સાથે જોડાતાં પૃષ્ઠો',
 'disambiguationspage' => 'Template:અસંદિગ્ધ',
-'disambiguations-text' => "નીચેના પાના  '''સંદિગ્ધ વાક્યો વાળા પાના''' સાથે કડી દ્વારા જોડાયેલા છે.
-તà«\87ના àª\95રતા àª¤à«\87નà«\87 àª¯à«\8bàª\97à«\8dય àª¤à«\87 àªµàª¿àª·à«\8dય સાથે જોડાયેલા હોવા જોઇએ.<br />
-àª\86 àªªàª¾àª¨àª¾àª¨à«\87 àª¸àª\82દિàª\97à«\8dધ  àªµàª¾àª\95à«\8dયà«\8b àªµàª¾àª³àª¾ àªªàª¾àª¨àª¾ àª¤à«\8dયારà«\87 àª\95હà«\80 àª¶àª\95ાય àª\9cà«\8dયારà«\87 àª¤à«\87 [[MediaWiki:Disambiguationspage]] àª¨àª¾àª®àª¨àª¾ àª¢àª¾àª\82àª\9aા àª¸àª¾àª¥à«\87 àª\9cà«\8bડાયà«\87લા હોય.",
+'disambiguations-text' => "નà«\80àª\9aà«\87ના àªªàª¾àª¨àª¾  '''સàª\82દિàª\97à«\8dધ àªµàª¾àª\95à«\8dયà«\8b àªµàª¾àª³àª¾ àªªàª¾àª¨àª¾''' àª¸àª¾àª¥à«\87 àª\93àª\9bામાàª\82 àª\93àª\9bà«\80 àª\8fàª\95 àª\95ડà«\80 àª¦à«\8dવારા àª\9cà«\8bડાયà«\87લા àª\9bà«\87.
+તà«\87àª\93 àªµàª§à«\81 àª¯à«\8bàª\97à«\8dય àªªàª¾àª¨àª¾àª\82 સાથે જોડાયેલા હોવા જોઇએ.<br />
+પાનાનà«\87 àª¸àª\82દિàª\97à«\8dધ àªµàª¾àª\95à«\8dયà«\8b àªµàª¾àª³à«\81àª\82 àªªàª¾àª¨à«\81àª\82 àª¤à«\8dયારà«\87 àª\95હà«\80 àª¶àª\95ાય àª\9cà«\8dયારà«\87 àª¤à«\87 [[MediaWiki:Disambiguationspage]] àª¨àª¾àª®àª¨àª¾ àª®àª¾àª³àª\96ા àª¸àª¾àª¥à«\87 àª\9cà«\8bડાયà«\87લà«\81àª\82 હોય.",
 
 'doubleredirects' => 'બમણું દિશાનિર્દેશન',
 'doubleredirectstext' => 'આ પાનું દિશા નિર્દેશિત પાના પર થયેલા દિશા નિર્દેશિત પાનાની યાદિ બતાવે છે.
@@ -1929,10 +1939,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'specialpage-empty' => 'આ પાનું ખાલી છે.',
 'lonelypages' => 'અનાથ પાના',
 'lonelypagestext' => 'નીચે બતાવેલા પાના {{SITENAME}} પર કે થી કડી દ્વારા જોડાયેલ નથી',
-'uncategorizedpages' => 'àª\85વરà«\8dàª\97િકૃત પાનાં',
-'uncategorizedcategories' => 'àª\85વરà«\8dàª\97િકૃત શ્રેણીઓ',
-'uncategorizedimages' => 'àª\85વરà«\8dàª\97િકૃત દસ્તાવેજો',
-'uncategorizedtemplates' => 'àª\85વરà«\8dàª\97િકૃત ઢાંચાઓ',
+'uncategorizedpages' => 'àª\85વરà«\8dàª\97à«\80કૃત પાનાં',
+'uncategorizedcategories' => 'àª\85વરà«\8dàª\97à«\80કૃત શ્રેણીઓ',
+'uncategorizedimages' => 'àª\85વરà«\8dàª\97à«\80કૃત દસ્તાવેજો',
+'uncategorizedtemplates' => 'àª\85વરà«\8dàª\97à«\80કૃત ઢાંચાઓ',
 'unusedcategories' => 'વણ વપરાયેલી શ્રેણીઓ',
 'unusedimages' => 'વણ વપરાયેલાં દસ્તાવેજો',
 'popularpages' => 'પ્રખ્યાત પાના',
@@ -1959,8 +1969,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'protectedpages-indef' => 'ફક્ત અનિશ્ચિત સુરક્ષા ધરાવતા પાના',
 'protectedpages-cascade' => 'માત્ર પગથિયામય સુરક્ષા વાળા પગ',
 'protectedpagestext' => 'નીચેના પાના કોઈ ફેરફાર કે હટાવવા થી સુરકક્ષીત કરાયા છે',
-'protectedpagesempty' => 'àª\86 àªµàª¿àª\95લà«\8dપà«\8b àª¦à«\8dવારા àª\95à«\8bàª\88 àªªàª¾àª¨àª¾ àª¸à«\81રàª\95à«\8dષà«\80ત àª\95રાયા àª¨àª¥à«\80',
-'protectedtitles' => 'સàª\82રàª\95à«\8dષà«\80ત શીર્ષકો',
+'protectedpagesempty' => 'àª\86 àªµàª¿àª\95લà«\8dપà«\8b àª¦à«\8dવારા àª\95à«\8bàª\88 àªªàª¾àª¨àª¾ àª¸à«\81રàª\95à«\8dષિત àª\95રાયા àª¨àª¥à«\80.',
+'protectedtitles' => 'સàª\82રàª\95à«\8dષિત શીર્ષકો',
 'protectedtitlestext' => 'આ શીર્ષકો રચના માટે આરક્ષીત છે',
 'protectedtitlesempty' => 'આ પરિબળો દ્વારા કોઇ પણ શીર્ષકો સચવાયા નથી.',
 'listusers' => 'સભ્યોની યાદી',
@@ -2047,7 +2057,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'linksearch-ok' => 'શોધ',
 'linksearch-text' => '"*.wikipedia.org" જેવા વાઈલ્ડાકાર્ડ અહીં વાપર્યા હોઈ શકે છે.
 ઓછામાં ઓછું ઉચ્ચસ્તરનું ડોમેઇન જરૂરી છે, દા.ત. \'\'*.org".<br />
-માન્ય પ્રોટોકોલ : <tt>$1</tt> (આમાનું એકેય તમારી શોધમાં ના ઉમેરશો).',
+માન્ય પ્રોટોકોલ : <code>$1</code> (આમાનું એકેય તમારી શોધમાં ના ઉમેરશો).',
 'linksearch-line' => '$1 એ $2થી જોડાયેલ છે',
 'linksearch-error' => 'યજમાન નામની શરૂઆતમાં જ વાઈલ્ડકાર્ડ પ્રકટ થશે',
 
@@ -2242,6 +2252,8 @@ Deleting it may disrupt database operations of {{SITENAME}};',
 'rollback' => 'ફેરફારો ઉલટાવો',
 'rollback_short' => 'ઉલટાવો',
 'rollbacklink' => 'પાછું વાળો',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|ફેરફાર પાછો વાળો|ફેરફારો પાછા વાળો}}',
+'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}} કરતાં ઓછું પાછું લાવો',
 'rollbackfailed' => 'ઉલટાવવું નિષ્ફળ',
 'cantrollback' => 'આ ફેરફારો ઉલટાવી નહી શકાય
 છેલ્લો ફેરફાર આ પાના ના રચયિતા દ્વારા જ થયો હતો',
@@ -2325,8 +2337,8 @@ Deleting it may disrupt database operations of {{SITENAME}};',
 'restriction-upload' => 'ફાઇલ ચઢાવો',
 
 # Restriction levels
-'restriction-level-sysop' => 'સંપૂર્ણા સંરક્ષીત',
-'restriction-level-autoconfirmed' => 'àª\85રà«\8dધ àª¸àª\82રàª\95à«\8dષà«\80ત',
+'restriction-level-sysop' => 'સંપૂર્ણ સંરક્ષિત',
+'restriction-level-autoconfirmed' => 'àª\85રà«\8dધ àª¸àª\82રàª\95à«\8dષિત',
 'restriction-level-all' => 'કોઈ પણ સ્તર',
 
 # Undelete
@@ -2407,7 +2419,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'sp-contributions-deleted' => 'સભ્યનું ભૂંસેલું યોગદાન',
 'sp-contributions-uploads' => 'ખાસ યોગદાન / ચડાવેલ ફાઇલ',
 'sp-contributions-logs' => 'લૉગ',
-'sp-contributions-talk' => 'યà«\8bàª\97દાનàª\95રà«\8dતાનà«\80 àª\9aરà«\8dàª\9aા',
+'sp-contributions-talk' => 'ચર્ચા',
 'sp-contributions-userrights' => 'સભ્ય હક્ક પ્રબંધન',
 'sp-contributions-blocked-notice' => 'આ સભ્ય પ્રતિબંધિત છે
 તમારા સંદર્ભ માટે પ્રતિબંધિત સભ્યોની યાદિ આપી છે',
@@ -2476,8 +2488,8 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'ipb-confirm' => 'પ્રતિબંધ પુષ્ટિ',
 'badipaddress' => 'અવૈધ IP સરનામું',
 'blockipsuccesssub' => 'સફળ પ્રતિબંધ મુકાયો',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] પરા રોક લગાવાઈ છે<br />
-રà«\8bàª\95 àª²àª\97ાવà«\87લ àª¸àª­à«\8dયà«\8bનà«\80 àª¯àª¾àª¦àª¿ [[Special:BlockList|IP block list]].',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] પર રોક લગાવાઈ છે.<br />
+સમà«\80àª\95à«\8dષા àª®àª¾àª\9fà«\87 [[Special:BlockList|રà«\8bàª\95 àª²àª\97ાવાયà«\87લ àª¸àª­à«\8dયà«\8bનà«\80 àª¯àª¾àª¦à«\80]] àª\9cà«\81àª\93.',
 'ipb-blockingself' => 'તમે પોતાના પર પ્રતિબંધ મુકવા જાઓ છો! શું તમે સાચેજમાં આ કરવા માગો છો?',
 'ipb-confirmhideuser' => 'તમે "સભ્ય છુપાવો" સક્રિય રાખીને આ સભ્ય પર પ્રતિબંધ મુકવા જઇ રહ્યાં છો. આના કારણે કોઇપણ યાદી કે નોંધમાં સભ્યનું નામ જોઇ નહી શકાય. શું તમે ખરેખર આમ કરવા માંગો છો?',
 'ipb-edit-dropdown' => 'પ્રતિબંધ કારણોમાં ફેરફાર કરો',
@@ -2530,9 +2542,9 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 રોક લગાવાયેલા સભ્યોની યાદિ આ મુજબ છે',
 'blocklogentry' => '[[$1]] પર પ્રતિબંધ $2 $3 સુધી મુકવામાં આવ્યો છે.',
 'reblock-logentry' => '[[$1]] ની પ્રતિબંધ વિકલ્પો બદલ્યા જે નો કલાતિત સમય છે   $2 $3',
-'blocklogtext' => 'àª\86 àª¸àª­à«\8dયà«\8b àªªàª° àª°à«\8bàª\95 àª²àª\97ાવવા àª\85નà«\87 àª¹àª\9fાવવા àª¸àª\82બàª\82ધિત àª¯àª¾àª¦àª¿ છે.
-સà«\8dવયàª\82àª\9aાલિત àª°à«\80તà«\87 àª°à«\8bàª\95 àª²àª\97ાવાયà«\87લ IP àª¸àª°àª¨àª¾àª®àª¾àª¨à«\80 àª¯àª¾àª¦àª¿ અહીં નથી આપી.
-હાલમાàª\82 àªªà«\8dરવરà«\8dતમાન àª°à«\8bàª\95 àª¨à«\80 àª¯àª¾àª¦àª¿ àª\85હà«\80àª\82 àª\9cà«\81àª\93 [[Special:BlockList|IP block list]].',
+'blocklogtext' => 'àª\86 àª¸àª­à«\8dયà«\8b àªªàª° àª°à«\8bàª\95 àª²àª\97ાવવા àª\85નà«\87 àª¹àª\9fાવવા àª¸àª\82બàª\82ધિત àª¯àª¾àª¦à«\80 છે.
+સà«\8dવયàª\82àª\9aાલિત àª°à«\80તà«\87 àª°à«\8bàª\95 àª²àª\97ાવાયà«\87લ IP àª¸àª°àª¨àª¾àª®àª¾àª¨à«\80 àª¯àª¾àª¦à«\80 અહીં નથી આપી.
+હાલમાàª\82 àªªà«\8dરવરà«\8dતમાન àªªà«\8dરતિબàª\82ધ àª\85નà«\87 àª°à«\8bàª\95 àª¨à«\80 [[Special:BlockList|યાદà«\80 àª\85હà«\80àª\82 àª\9cà«\81àª\93]].',
 'unblocklogentry' => '$1 પરનો પ્રતિબંધ ઉઠાવ્યો',
 'block-log-flags-anononly' => 'માત્ર અજ્ઞાત સભ્ય',
 'block-log-flags-nocreate' => 'ખાતું ખોલવા પર પ્રતિબંધ છે',
@@ -2714,8 +2726,8 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'allmessagesname' => 'નામ',
 'allmessagesdefault' => 'મૂળ સંદેશ',
 'allmessagescurrent' => 'વર્તમાન દસ્તાવેજ',
-'allmessagestext' => 'આ મિડિયાવિકિ નામ સ્થળમાં આવેલ પ્રણાલીજનિત સંદેશાની યાદિ આ મુજબ છે.
-àª\95à«\83પયા [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] àª\85નà«\87 [//translatewiki.net translatewiki.net]નà«\80 àª®à«\81લાàª\95ાત àª²à«\8b àª\9cà«\8b àª¤ àª®àª¿àª¡àª¿àª¯àª¾àª¯àª¾àªµàª¿àª\95િના àª¸à«\8dથાનિય àª\95રણમાàª\82 àª®àª¦àª¦àª°à«\82પ àª¥àªµàª¾ àª\87àª\9aà«\8dàª\9bતા àª¹à«\8bવ.',
+'allmessagestext' => 'આ મિડિયાવિકિ નામસ્થળમાં આવેલ પ્રણાલીજનિત સંદેશાની યાદી આ મુજબ છે.
+àª\9cà«\8b àª¤àª®à«\87 àª®àª¿àª¡àª¿àª¯àª¾àª¯àª¾àªµàª¿àª\95િના àª¸à«\8dથાનà«\80યàª\95રણમાàª\82 àª®àª¦àª¦àª°à«\82પ àª¥àªµàª¾ àª\87àª\9aà«\8dàª\9bતા àª¹à«\8bવ àª¤à«\8b àª\95à«\83પયા [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] àª\85નà«\87 [//translatewiki.net translatewiki.net]નà«\80 àª®à«\81લાàª\95ાત àª²à«\8b.',
 'allmessagesnotsupportedDB' => "આ પાનું ન વાપરી શકાશે કેમકે '''\$wgUseDatabaseMessages'''  નિષ્ક્રીય કરાયું છે",
 'allmessages-filter-legend' => 'ચાળણી',
 'allmessages-filter' => 'સ્થાનીયકરણ સ્થિતિ દ્વારા ચાળો',
@@ -2743,11 +2755,11 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 # Special:Import
 'import' => 'પાના આયાત કરો',
 'importinterwiki' => 'ટ્રાંસ વિકિ આયાત',
-'import-interwiki-text' => 'આયાત કરવાના વિકિ અને પાનાનું શીર્ષક પસંદ કરો.
-ફà«\87રફરનà«\80 àª¤àª¾àª°à«\80àª\96 àª\85નà«\87 àª²à«\87àª\96àª\95à«\8b àªµàª¿àª·à«\87 àª¨à«\80 àª®àª¾àª¹àª¿àª¤à«\80 àª¸àª\9aવાશે.
-àª\86àª\82તર àªµàª¿àª\95િ àª\86યાત àª\86દિ [[Special:Log/import|import log]] àª®àª¾àª\82 àª\85àª\82àª\95િત àª¥ાય છે.',
+'import-interwiki-text' => 'આયાત કરવા માટેનાં પાનાનું શીર્ષક અને વિકિ પસંદ કરો.
+ફà«\87રફારનà«\80 àª¤àª¾àª°à«\80àª\96 àª\85નà«\87 àª²à«\87àª\96àª\95à«\8b àªµàª¿àª·à«\87નà«\80 àª®àª¾àª¹àª¿àª¤à«\80 àª\9cà«\87મનà«\80 àª¤à«\87મ àª°àª¾àª\96વામાàª\82 àª\86વશે.
+બધા àª\9c àª\86àª\82તરવિàª\95િ àª\86યાતનà«\80 àª¨à«\8bàª\82ધ [[Special:Log/import|import log]]માàª\82 àª°àª\96ાય છે.',
 'import-interwiki-source' => 'સ્રોત વિકિ/પાનું:',
-'import-interwiki-history' => 'àª\86 àªªàª¾àª¨àª¾ àª¬àª§àª¾ àª\90તિહાસà«\80àª\95 àª«à«\87રફારà«\8bનà«\80 àª¨àª\95લ કરો',
+'import-interwiki-history' => 'àª\86 àªªàª¾àª¨à«\81àª\82 àª¬àª§àª¾ àª«à«\87રફારà«\8bના àª\87તિહાસ àª¸àª¾àª¥à«\87 àª\86યાત કરો',
 'import-interwiki-templates' => 'બધા ઢાંચા શામિલ કરો',
 'import-interwiki-submit' => 'આયાત કરો',
 'import-interwiki-namespace' => 'લક્ષ્ય નામ સ્થળ',
@@ -2798,7 +2810,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 
 # JavaScriptTest
 'javascripttest' => 'જાવા સ્ક્રીપ્ટ પરીક્ષણ',
-'javascripttest-disabled' => 'àª\86 àª¸à«\82તà«\8dર (ફàª\82àª\95શન) àª¨àª¿àª·à«\8dàª\95à«\8dરà«\80ય àª\95રાયà«\8b',
+'javascripttest-disabled' => 'àª\86 àª¸à«\82તà«\8dર (ફàª\82àª\95શન) àª\86 àªµàª¿àª\95િ àªªàª° àª\95ારà«\8dયરત àª\95રાયà«\87લà«\81àª\82 àª¨àª¥à«\80.',
 'javascripttest-title' => '$1 પરીક્ષણ જારી',
 'javascripttest-pagetext-noframework' => 'આ પાનું જાવા સ્ક્રીપ્ટ ચલાવવા આરક્ષિત છે.',
 'javascripttest-pagetext-unknownframework' => 'અજાણ ચકાસણી ફ્રેમવર્ક "$1".',
@@ -2904,15 +2916,10 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 # Info page
 'pageinfo-title' => ' $1 પાના ની માહિતી નૂ મથાડૂ',
 'pageinfo-header-edits' => 'કરેલા ફેરફાર',
-'pageinfo-header-watchlist' => 'ધ્યાનસૂચિ',
-'pageinfo-header-views' => 'દ્રશ્ય',
-'pageinfo-subjectpage' => 'પૃષ્ઠ',
-'pageinfo-talkpage' => 'ચર્ચા પત્ર',
+'pageinfo-views' => 'જોનારાની સંખ્યા',
 'pageinfo-watchers' => 'નીરીક્ષકોની સંખ્યા',
 'pageinfo-edits' => 'સંપાદનોની સંખ્યા',
 'pageinfo-authors' => 'ક્ષેત્રના લેખકોની સંખ્યા',
-'pageinfo-views' => 'જોનારાની સંખ્યા',
-'pageinfo-viewsperedit' => 'પ્રતિ ફેરફાર ના દ્રશ્યો',
 
 # Patrolling
 'markaspatrolleddiff' => 'નિરીક્ષીત અંકિત કરો',
@@ -3196,7 +3203,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'exif-compression-3' => 'CCITT સમૂહ 3 ફેક્સ ઍનકોડિંગ',
 'exif-compression-4' => 'CCITT સમૂહ 3 ફેક્સ ઍનકોડિંગ',
 
-'exif-copyrighted-true' => 'પà«\8dરàª\95શન àª\85ધિàª\95ારથà«\80 àª¸à«\81રàª\95à«\8dષà«\80ત',
+'exif-copyrighted-true' => 'પà«\8dરàª\95ાશન àª\85ધિàª\95ારથà«\80 àª¸à«\81રàª\95à«\8dષિત',
 'exif-copyrighted-false' => 'સાર્વજનિક ડોમેન',
 
 'exif-unknowndate' => 'અજ્ઞાત તારીખ',
@@ -3236,7 +3243,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'exif-meteringmode-4' => 'બિંદુઓ',
 'exif-meteringmode-5' => 'ભાત',
 'exif-meteringmode-6' => 'આશિંક',
-'exif-meteringmode-255' => 'બà«\80àª\9cà«\81àª\82 àª\95àª\88',
+'exif-meteringmode-255' => 'àª\85નà«\8dય',
 
 'exif-lightsource-0' => 'અજાણ્યો',
 'exif-lightsource-1' => 'દિવસ પ્રકાશ',
@@ -3403,7 +3410,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 
 # External editor support
 'edit-externally' => 'બાહ્ય સોફ્ટવેર વાપરીને આ ફાઇલમાં ફેરફાર કરો',
-'edit-externally-help' => '(વધà«\81 àª®àª¾àª¹àª¿àª¤àª¿ àª®àª¾àª\9fà«\87 [//www.mediawiki.org/wiki/Manual:External_editors àª¸à«\87àª\9f-àª\85પ àª¸à«\81ચનાઓ] જુઓ)',
+'edit-externally-help' => '(વધà«\81 àª®àª¾àª¹àª¿àª¤à«\80 àª®àª¾àª\9fà«\87 [//www.mediawiki.org/wiki/Manual:External_editors àª¸à«\87àª\9f-àª\85પ àª¸à«\82ચનાઓ] જુઓ)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'બધા',
@@ -3511,7 +3518,7 @@ $5
 'table_pager_first' => 'પહેલું પાનું',
 'table_pager_last' => 'છેલ્લું પાનું',
 'table_pager_limit' => 'પ્રતિ પાને $1 વસ્તુ બતાવો',
-'table_pager_limit_label' => 'વસà«\8dતિàª\93 àªªà«\8dરતિ àªªàª¾àª¨à«\87',
+'table_pager_limit_label' => 'પà«\8dરતિ àªªàª¾àª¨à«\87 àªµàª¿àª\97તà«\8b:',
 'table_pager_limit_submit' => 'જાઓ',
 'table_pager_empty' => 'કોઇ પરિણામ નથી',
 
@@ -3572,7 +3579,7 @@ $5
 'version-extensions' => 'પ્રસ્થાપિત વિસ્તારકો',
 'version-specialpages' => 'ખાસ પાનાં',
 'version-parserhooks' => 'પદચ્છેદ ખૂંટો',
-'version-variables' => 'સહàª\97à«\81ણàª\95à«\8b',
+'version-variables' => 'àª\9aલ',
 'version-antispam' => 'સ્પેમ સંરક્ષણ',
 'version-skins' => 'ફલક',
 'version-other' => 'અન્ય',
@@ -3595,6 +3602,8 @@ $5
 'version-software' => 'બેસાડેલા સોફ્ટવેર',
 'version-software-product' => 'ઉત્પાદ',
 'version-software-version' => 'આવૃત્તિ',
+'version-entrypoints-header-entrypoint' => 'પ્રવેશ સ્થળ',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'ફાઈલ પથ',
@@ -3759,6 +3768,7 @@ $5
 'api-error-file-too-large' => 'તમે ચડાવેલી ફાઈલ ખૂબ મોટી છે',
 'api-error-filename-tooshort' => 'ફાઇલ નામ ખૂબ ટૂંકું છે',
 'api-error-filetype-banned' => 'આ પ્રકારની ફાઈલ પ્રતિબંધિત છે.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4| માન્ય ફાઇલ પ્રકાર નથી| માન્ય ફાઇલ પ્રકારો નથી }}. માન્ય {{PLURAL:$3|ફાઇલ પ્રકાર છે|ફાઇલ પ્રકારો  છે}} $2.',
 'api-error-filetype-missing' => 'ફાઈલને ઍક્સટેન્શન નથી',
 'api-error-hookaborted' => 'તમે કરેલ ફેરફારો વિસ્તારીત ખૂંટા દ્વારા રોકી દેવાયા.',
 'api-error-http' => 'આંતરીક ક્ષતિ: સર્વસનો સંપર્ક કરવામાં નિષ્ફળતા',
@@ -3784,10 +3794,14 @@ $5
 'api-error-verification-error' => 'ફાઈલ યાતો ખરાબ થઈ ગઈ છે યાતો તેનું ઍક્સટેન્શન (વિસ્તરક) ખોટો છે.',
 
 # Durations
-'duration-seconds' => '$1 {{PLURAL:$1|સેકંડ|સેકંડ}}',
+'duration-seconds' => '$1 {{PLURAL:$1|સેકંડ|સેકંડ}}',
 'duration-minutes' => '$1 {{PLURAL:$1|મિનિટ|મિનિટો}}',
 'duration-hours' => '$1 {{PLURAL:$1|કલાક|કલાકો}}',
 'duration-days' => '$1 {{PLURAL:$1|દિવસ|દિવસો}}',
+'duration-weeks' => '$1 {{PLURAL:$1|અઠવાડિયું|અઠવાડિયા}}',
 'duration-years' => '$1 {{PLURAL:$1|વર્ષ|વર્ષો}}',
+'duration-decades' => '$1 {{PLURAL:$1|દાયકો|દાયકાઓ}}',
+'duration-centuries' => '$1 {{PLURAL:$1|શતાબ્દી|શતાબ્દીઓ}}',
+'duration-millennia' => '$1 {{PLURAL:$1|સહસ્ત્રાબ્દી|સહસ્ત્રાબ્દીઓ}}',
 
 );
index a48bd4f..de9ed56 100644 (file)
@@ -47,7 +47,6 @@ $messages = array(
 '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-nolangconversion' => 'Put-yeu chin-hàng ngî-ngièn chón-von',
 '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.',
 
@@ -797,16 +796,16 @@ Chhai [[Special:Watchlist|ngì-ke kam-sṳ lie̍t-péu]] chûng ke ya̍p fi hié
 'large-file' => 'Kien-ngi tóng-on thai-séu put-nèn chhêu-ko $1; pún tóng-on thai-séu he $2.',
 'largefileserver' => 'Liá-ke tóng-on ke thai-séu fu̍k-chhiùng-hi fûn-phi yún-chún ke thai-séu hàn-yeu thai.',
 'emptyfile' => 'Ngì só song-chhòn ke tóng-on put chhùn-chhai. Liá khó-nèn he chhut-yì tóng-on miàng chho-ngu. Chhiáng kiám-chhà ngì he-feu chṳ̂n yeu song-chhòn chhṳ́ tóng-on.',
-'fileexists' => "Yí-kîn chhùn-chhai siông-thùng miàng-chhṳ̂n ke tóng-on, kó-yèn ngì mò-fap khok-thin ngì he-feu yeu kói-pien kì, chhiáng kiám-chhà '''<tt>[[:$1]]</tt>'''.
-[[$1|thumb]]",
-'fileexists-extension' => "Yit-ke siông-sṳ tóng-miàng ke tóng-on yí-kîn chhùn-chhai: [[$2|thumb]]
-* Song-chhòn tóng-on ke tóng-miàng: '''<tt>[[:$1]]</tt>'''
-* Hien-chhai yû tóng-on ke tóng-miàng: '''<tt>[[:$2]]</tt>'''
-Chhiáng sién-chet yit-ke put-thùng ke miàng-sṳ.",
+'fileexists' => 'Yí-kîn chhùn-chhai siông-thùng miàng-chhṳ̂n ke tóng-on, kó-yèn ngì mò-fap khok-thin ngì he-feu yeu kói-pien kì, chhiáng kiám-chhà <strong>[[:$1]]</strong>.
+[[$1|thumb]]',
+'fileexists-extension' => 'Yit-ke siông-sṳ tóng-miàng ke tóng-on yí-kîn chhùn-chhai: [[$2|thumb]]
+* Song-chhòn tóng-on ke tóng-miàng: <strong>[[:$1]]</strong>
+* Hien-chhai yû tóng-on ke tóng-miàng: <strong>[[:$2]]</strong>
+Chhiáng sién-chet yit-ke put-thùng ke miàng-sṳ.',
 'fileexists-thumbnail-yes' => "Liá-ke tóng-on chhin-chhiong he yit-pu thù-hìn ke suk-thù pán-pún ''(suk-thù)''. [[$1|thumb]]
-Chhiáng kiám-chhà chhîn-chhú ke tóng-on '''<tt>[[:$1]]</tt>'''.
+Chhiáng kiám-chhà chhîn-chhú ke tóng-on <strong>[[:$1]]</strong>.
 Kó-yèn kiám-chhà heu ke tóng-on he khiung-thùng ngièn-pún thù-hiong ke thai-séu he yit-yong, chhiu put-yung song-chhòn tô yit-puk suk-thù.",
-'file-thumbnail-no' => "Ke tóng-on he yî '''<tt>$1</tt>''' khôi-sṳ́.
+'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]]',
@@ -876,7 +875,7 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 
 # MIME search
 'mimesearch' => 'MIME chhà-chhìm',
-'mimesearch-summary' => 'Pún vùn-chông sṳ-yung tóng-on MIME lui-hìn ko-li-hi. Sû-ngi̍p: nui-yùng lui-hìn yì-yi <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Pún vùn-chông sṳ-yung tóng-on MIME lui-hìn ko-li-hi. Sû-ngi̍p: nui-yùng lui-hìn yì-yi <code>image/jpeg</code>.',
 'mimetype' => 'MIME lui-hìn:',
 'download' => 'hâ-chai',
 
index 12237be..45caf62 100644 (file)
@@ -12,6 +12,7 @@
  * @author Kolonahe
  * @author Node ue
  * @author Singularity
+ * @author Xqt
  */
 
 $namespaceNames = array(
@@ -62,27 +63,27 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'currentmonth'            => array( '1', 'KĒIAMAHINA', 'KEIAMAHINA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'KĒIAINOAMAHINA', 'KEIAINOAMAHINA', 'CURRENTMONTHNAME' ),
-       'currentday'              => array( '1', 'KĒIALĀ', 'KEIALA', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'KĒIALĀ2', 'KEIALA2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'KĒIAINOALĀ', 'KEIAINOALA', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'KĒIAMAKAHIKI', 'KEIAMAKAHIKI', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'KĒIAMANAWA', 'KEIAMANAWA', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'KĒIAHOLA', 'KEIAHOLA', 'CURRENTHOUR' ),
-       'numberofpages'           => array( '1', 'HELUʻAOʻAO', 'HELUAOAO', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'HELUMEA', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'HELUWAIHONA', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'HELUMEAHOʻOHANA', 'HELUMEAHOOHANA', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'HELULOLI', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'INOAʻAOʻAO', 'INOAAOAO', 'PAGENAME' ),
-       'img_right'               => array( '1', 'ʻākau', 'ākau', 'akau', 'right' ),
-       'img_left'                => array( '1', 'hema', 'left' ),
-       'img_none'                => array( '1', 'ʻaʻohe', 'aohe', 'none' ),
-       'img_link'                => array( '1', 'loulou=$1', 'link=$1' ),
-       'currentweek'             => array( '1', 'KĒIAPULE', 'KEIAPULE', 'CURRENTWEEK' ),
-       'language'                => array( '0', '#ʻŌLELO', '#ŌLELO', '#OLELO', '#LANGUAGE:' ),
-       'numberofadmins'          => array( '1', 'HELUKAHU', 'NUMBEROFADMINS' ),
+       'currentmonth'              => array( '1', 'KĒIAMAHINA', 'KEIAMAHINA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'KĒIAINOAMAHINA', 'KEIAINOAMAHINA', 'CURRENTMONTHNAME' ),
+       'currentday'                => array( '1', 'KĒIALĀ', 'KEIALA', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'KĒIALĀ2', 'KEIALA2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'KĒIAINOALĀ', 'KEIAINOALA', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'KĒIAMAKAHIKI', 'KEIAMAKAHIKI', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'KĒIAMANAWA', 'KEIAMANAWA', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'KĒIAHOLA', 'KEIAHOLA', 'CURRENTHOUR' ),
+       'numberofpages'             => array( '1', 'HELUʻAOʻAO', 'HELUAOAO', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'HELUMEA', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'HELUWAIHONA', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'HELUMEAHOʻOHANA', 'HELUMEAHOOHANA', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'HELULOLI', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'INOAʻAOʻAO', 'INOAAOAO', 'PAGENAME' ),
+       'img_right'                 => array( '1', 'ʻākau', 'ākau', 'akau', 'right' ),
+       'img_left'                  => array( '1', 'hema', 'left' ),
+       'img_none'                  => array( '1', 'ʻaʻohe', 'aohe', 'none' ),
+       'img_link'                  => array( '1', 'loulou=$1', 'link=$1' ),
+       'currentweek'               => array( '1', 'KĒIAPULE', 'KEIAPULE', 'CURRENTWEEK' ),
+       'language'                  => array( '0', '#ʻŌLELO', '#ŌLELO', '#OLELO', '#LANGUAGE:' ),
+       'numberofadmins'            => array( '1', 'HELUKAHU', 'NUMBEROFADMINS' ),
 );
 
 $messages = array(
@@ -299,7 +300,7 @@ $messages = array(
 'red-link-title' => '$1 (ʻaʻole i kākau ʻia)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'ʻaoʻao',
+'nstab-main' => 'ʻAoʻao',
 'nstab-user' => 'Inoa mea ho‘ohana',
 'nstab-media' => 'Pāpaho',
 'nstab-special' => 'Papa nui',
@@ -589,6 +590,8 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 # Statistics
 'statistics' => 'Papa helu',
 
+'disambiguationspage' => 'Template:Huaʻōlelo puana like',
+
 'brokenredirects-edit' => 'e ho‘ololi',
 'brokenredirects-delete' => 'e kāpae',
 
index 722984f..2c878b1 100644 (file)
@@ -67,158 +67,158 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#הפניה', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__ללא_תוכן_עניינים__', '__ללא_תוכן__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__ללא_גלריה__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__חייב_תוכן_עניינים__', '__חייב_תוכן__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__תוכן_עניינים__', '__תוכן__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__ללא_עריכה__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__ללא_כותרת__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'חודש נוכחי', 'חודש נוכחי 2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'חודש נוכחי 1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'שם חודש נוכחי', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'שם חודש נוכחי קניין', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'קיצור חודש נוכחי', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'יום נוכחי', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'יום נוכחי 2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'שם יום נוכחי', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'שנה נוכחית', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'שעה נוכחית', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'שעות נוכחיות', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'חודש מקומי', 'חודש מקומי 2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'חודש מקומי 1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'שם חודש מקומי', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'שם חודש מקומי קניין', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'קיצור חודש מקומי', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'יום מקומי', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'יום מקומי 2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'שם יום מקומי', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'שנה מקומית', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'שעה מקומית', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'שעות מקומיות', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'מספר דפים כולל', 'מספר דפים', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'מספר ערכים', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'מספר קבצים', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'מספר משתמשים', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'מספר משתמשים פעילים', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'מספר עריכות', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'מספר צפיות', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'שם הדף', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'שם הדף מקודד', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'מרחב השם', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'מרחב השם מקודד', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'מרחב השיחה', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'מרחב השיחה מקודד', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'מרחב הנושא', 'מרחב הערכים', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'מרחב הנושא מקודד', 'מרחב הערכים מקודד', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'שם הדף המלא', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'שם הדף המלא מקודד', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'שם דף המשנה', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'שם דף המשנה מקודד', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'שם דף הבסיס', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'שם דף הבסיס מקודד', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'שם דף השיחה', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'שם דף השיחה מקודד', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'שם דף הנושא', 'שם הערך', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'שם דף הנושא מקודד', 'שם הערך מקודד', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'הכללה:', 'MSG:' ),
-       'subst'                   => array( '0', 'ס:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'ס בטוח:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'הכללת מקור', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'ממוזער', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'ממוזער=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'ימין', 'right' ),
-       'img_left'                => array( '1', 'שמאל', 'left' ),
-       'img_none'                => array( '1', 'ללא', 'none' ),
-       'img_width'               => array( '1', '$1 פיקסלים', '$1px' ),
-       'img_center'              => array( '1', 'מרכז', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'ממוסגר', 'מסגרת', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'לא ממוסגר', 'ללא מסגרת', 'frameless' ),
-       'img_page'                => array( '1', 'דף=$1', 'דף $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'ימין למעלה', 'ימין למעלה=$1', 'ימין למעלה $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'גבולות', 'גבול', 'border' ),
-       'img_baseline'            => array( '1', 'שורת הבסיס', 'baseline' ),
-       'img_sub'                 => array( '1', 'תחתי', 'sub' ),
-       'img_super'               => array( '1', 'עילי', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'למעלה', 'top' ),
-       'img_text_top'            => array( '1', 'בראש הטקסט', 'text-top' ),
-       'img_middle'              => array( '1', 'באמצע', 'middle' ),
-       'img_bottom'              => array( '1', 'למטה', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'בתחתית הטקסט', 'text-bottom' ),
-       'img_link'                => array( '1', 'קישור=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'טקסט=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'הודעה:', 'INT:' ),
-       'sitename'                => array( '1', 'שם האתר', 'SITENAME' ),
-       'ns'                      => array( '0', 'מרחב שם:', 'NS:' ),
-       'nse'                     => array( '0', 'מרחב שם מקודד:', 'NSE:' ),
-       'localurl'                => array( '0', 'כתובת יחסית:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'כתובת יחסית מקודד:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'נתיב הדפים', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'כתובת השרת', 'שרת', 'SERVER' ),
-       'servername'              => array( '0', 'שם השרת', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'נתיב הקבצים', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'נתיב הסגנון', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'דקדוק:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'מגדר:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__ללא_המרת_כותרת__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__ללא_המרת_תוכן__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'שבוע נוכחי', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'מספר יום נוכחי', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'שבוע מקומי', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'מספר יום מקומי', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'מזהה גרסה', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'יום גרסה', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'יום גרסה 2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'חודש גרסה', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'חודש גרסה 1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'שנת גרסה', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'זמן גרסה', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'כותב גרסה', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'רבים:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'כתובת מלאה:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'כתובת מלאה מקודד:', 'FULLURLE:' ),
-       'canonicalurl'            => array( '0', 'כתובת קנונית:', 'CANONICALURL:' ),
-       'canonicalurle'           => array( '0', 'כתובת קנונית מקודד:', 'CANONICALURLE:' ),
-       'lcfirst'                 => array( '0', 'אות ראשונה קטנה:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'אות ראשונה גדולה:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'אותיות קטנות:', 'LC:' ),
-       'uc'                      => array( '0', 'אותיות גדולות:', 'UC:' ),
-       'raw'                     => array( '0', 'ללא עיבוד:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'כותרת תצוגה', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'ללא פסיק', 'R' ),
-       'newsectionlink'          => array( '1', '__יצירת_הערה__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__ללא_יצירת_הערה__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'גרסה נוכחית', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'נתיב מקודד:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'עוגן מקודד:', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'זמן נוכחי', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'זמן מקומי', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'סימן כיווניות', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#שפה:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'שפת תוכן', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'דפים במרחב השם:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'מספר מפעילים', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'עיצוב מספר', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ריפוד משמאל', 'PADLEFT' ),
-       'padright'                => array( '0', 'ריפוד מימין', 'PADRIGHT' ),
-       'special'                 => array( '0', 'מיוחד', 'special' ),
-       'defaultsort'             => array( '1', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'נתיב לקובץ:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'תגית', 'tag' ),
-       'hiddencat'               => array( '1', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'דפים בקטגוריה', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'גודל דף', 'PAGESIZE' ),
-       'index'                   => array( '1', '__לחיפוש__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__לא_לחיפוש__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'מספר בקבוצה', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__הפניה_קבועה__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'רמת הגנה', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'עיצוב תאריך', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'נתיב', 'PATH' ),
-       'url_wiki'                => array( '0', 'ויקי', 'WIKI' ),
-       'url_query'               => array( '0', 'שאילתה', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', 'ללא שגיאה', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', 'ללא החלפה', 'noreplace' ),
+       'redirect'                  => array( '0', '#הפניה', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__ללא_תוכן_עניינים__', '__ללא_תוכן__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__ללא_גלריה__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__חייב_תוכן_עניינים__', '__חייב_תוכן__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__תוכן_עניינים__', '__תוכן__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__ללא_עריכה__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__ללא_כותרת__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'חודש נוכחי', 'חודש נוכחי 2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'חודש נוכחי 1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'שם חודש נוכחי', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'שם חודש נוכחי קניין', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'קיצור חודש נוכחי', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'יום נוכחי', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'יום נוכחי 2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'שם יום נוכחי', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'שנה נוכחית', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'שעה נוכחית', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'שעות נוכחיות', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'חודש מקומי', 'חודש מקומי 2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'חודש מקומי 1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'שם חודש מקומי', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'שם חודש מקומי קניין', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'קיצור חודש מקומי', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'יום מקומי', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'יום מקומי 2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'שם יום מקומי', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'שנה מקומית', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'שעה מקומית', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'שעות מקומיות', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'מספר דפים כולל', 'מספר דפים', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'מספר ערכים', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'מספר קבצים', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'מספר משתמשים', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'מספר משתמשים פעילים', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'מספר עריכות', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'מספר צפיות', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'שם הדף', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'שם הדף מקודד', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'מרחב השם', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'מרחב השם מקודד', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'מרחב השיחה', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'מרחב השיחה מקודד', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'מרחב הנושא', 'מרחב הערכים', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'מרחב הנושא מקודד', 'מרחב הערכים מקודד', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'שם הדף המלא', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'שם הדף המלא מקודד', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'שם דף המשנה', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'שם דף המשנה מקודד', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'שם דף הבסיס', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'שם דף הבסיס מקודד', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'שם דף השיחה', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'שם דף השיחה מקודד', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'שם דף הנושא', 'שם הערך', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'שם דף הנושא מקודד', 'שם הערך מקודד', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'הכללה:', 'MSG:' ),
+       'subst'                     => array( '0', 'ס:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'ס בטוח:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'הכללת מקור', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'ממוזער', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'ממוזער=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'ימין', 'right' ),
+       'img_left'                  => array( '1', 'שמאל', 'left' ),
+       'img_none'                  => array( '1', 'ללא', 'none' ),
+       'img_width'                 => array( '1', '$1 פיקסלים', '$1px' ),
+       'img_center'                => array( '1', 'מרכז', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'ממוסגר', 'מסגרת', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'לא ממוסגר', 'ללא מסגרת', 'frameless' ),
+       'img_page'                  => array( '1', 'דף=$1', 'דף $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'ימין למעלה', 'ימין למעלה=$1', 'ימין למעלה $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'גבולות', 'גבול', 'border' ),
+       'img_baseline'              => array( '1', 'שורת הבסיס', 'baseline' ),
+       'img_sub'                   => array( '1', 'תחתי', 'sub' ),
+       'img_super'                 => array( '1', 'עילי', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'למעלה', 'top' ),
+       'img_text_top'              => array( '1', 'בראש הטקסט', 'text-top' ),
+       'img_middle'                => array( '1', 'באמצע', 'middle' ),
+       'img_bottom'                => array( '1', 'למטה', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'בתחתית הטקסט', 'text-bottom' ),
+       'img_link'                  => array( '1', 'קישור=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'טקסט=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'הודעה:', 'INT:' ),
+       'sitename'                  => array( '1', 'שם האתר', 'SITENAME' ),
+       'ns'                        => array( '0', 'מרחב שם:', 'NS:' ),
+       'nse'                       => array( '0', 'מרחב שם מקודד:', 'NSE:' ),
+       'localurl'                  => array( '0', 'כתובת יחסית:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'כתובת יחסית מקודד:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'נתיב הדפים', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'כתובת השרת', 'שרת', 'SERVER' ),
+       'servername'                => array( '0', 'שם השרת', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'נתיב הקבצים', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'נתיב הסגנון', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'דקדוק:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'מגדר:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__ללא_המרת_כותרת__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__ללא_המרת_תוכן__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'שבוע נוכחי', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'מספר יום נוכחי', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'שבוע מקומי', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'מספר יום מקומי', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'מזהה גרסה', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'יום גרסה', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'יום גרסה 2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'חודש גרסה', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'חודש גרסה 1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'שנת גרסה', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'זמן גרסה', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'כותב גרסה', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'רבים:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'כתובת מלאה:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'כתובת מלאה מקודד:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'כתובת קנונית:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'כתובת קנונית מקודד:', 'CANONICALURLE:' ),
+       'lcfirst'                   => array( '0', 'אות ראשונה קטנה:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'אות ראשונה גדולה:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'אותיות קטנות:', 'LC:' ),
+       'uc'                        => array( '0', 'אותיות גדולות:', 'UC:' ),
+       'raw'                       => array( '0', 'ללא עיבוד:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'כותרת תצוגה', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'ללא פסיק', 'R' ),
+       'newsectionlink'            => array( '1', '__יצירת_הערה__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__ללא_יצירת_הערה__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'גרסה נוכחית', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'נתיב מקודד:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'עוגן מקודד:', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'זמן נוכחי', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'זמן מקומי', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'סימן כיווניות', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#שפה:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'שפת תוכן', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'דפים במרחב השם:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'מספר מפעילים', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'עיצוב מספר', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ריפוד משמאל', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ריפוד מימין', 'PADRIGHT' ),
+       'special'                   => array( '0', 'מיוחד', 'special' ),
+       'defaultsort'               => array( '1', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'נתיב לקובץ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'תגית', 'tag' ),
+       'hiddencat'                 => array( '1', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'דפים בקטגוריה', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'גודל דף', 'PAGESIZE' ),
+       'index'                     => array( '1', '__לחיפוש__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__לא_לחיפוש__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'מספר בקבוצה', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__הפניה_קבועה__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'רמת הגנה', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'עיצוב תאריך', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'נתיב', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ויקי', 'WIKI' ),
+       'url_query'                 => array( '0', 'שאילתה', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'ללא שגיאה', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'ללא החלפה', 'noreplace' ),
 );
 
 $specialPageAliases = array(
@@ -359,7 +359,7 @@ $messages = array(
 'tog-hidepatrolled' => 'הסתרת שינויים בדוקים ברשימת השינויים האחרונים',
 'tog-newpageshidepatrolled' => 'הסתרת דפים בדוקים ברשימת הדפים החדשים',
 'tog-extendwatchlist' => 'הרחבת רשימת המעקב כך שתציג את כל השינויים, לא רק את השינויים האחרונים בכל דף',
-'tog-usenewrc' => 'ש×\99×\9e×\95ש ×\91רש×\99×\9eת ×©×\99× ×\95×\99×\99×\9d ×\90×\97ר×\95× ×\99×\9d ×\9eש×\95פרת (דרוש JavaScript)',
+'tog-usenewrc' => 'ק×\99×\91×\95×¥ ×\94ש×\99× ×\95×\99×\99×\9d ×\9cפ×\99 ×\93×£ ×\91ש×\99× ×\95×\99×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d ×\95×\91רש×\99×\9eת ×\94×\9eעק×\91 (דרוש JavaScript)',
 'tog-numberheadings' => 'מספור כותרות אוטומטי',
 'tog-showtoolbar' => 'הצגת סרגל העריכה (דרוש JavaScript)',
 'tog-editondblclick' => 'עריכת דפים בלחיצה כפולה (דרוש JavaScript)',
@@ -367,17 +367,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'עריכת פסקאות על ידי לחיצה ימנית על כותרות הפסקאות (דרוש JavaScript)',
 'tog-showtoc' => 'הצגת תוכן עניינים (עבור דפים עם יותר מ־3 כותרות)',
 'tog-rememberpassword' => 'שמירת הכניסה שלי בדפדפן זה ({{PLURAL:$1|ליום אחד|ל־$1 ימים|ליומיים}} לכל היותר)',
-'tog-watchcreations' => 'מעקב אחרי דפים שיצרתי',
-'tog-watchdefault' => 'מעקב אחרי דפים שערכתי',
-'tog-watchmoves' => 'מעקב אחרי דפים שהעברתי',
-'tog-watchdeletion' => 'מעקב אחרי דפים שמחקתי',
+'tog-watchcreations' => 'מעקב אחרי דפים שיצרתי וקבצים שהעליתי',
+'tog-watchdefault' => '×\9eעק×\91 ×\90×\97ר×\99 ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×¢×¨×\9bת×\99',
+'tog-watchmoves' => '×\9eעק×\91 ×\90×\97ר×\99 ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\94×¢×\91רת×\99',
+'tog-watchdeletion' => '×\9eעק×\91 ×\90×\97ר×\99 ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\9e×\97קת×\99',
 'tog-minordefault' => 'הגדרת כל פעולת עריכה כמשנית אם לא צוין אחרת',
 'tog-previewontop' => 'הצגת תצוגה מקדימה לפני תיבת העריכה (או: אחריה)',
 'tog-previewonfirst' => 'הצגת תצוגה מקדימה בעריכה ראשונה',
 'tog-nocache' => 'מניעת אחסון הדפים בזיכרון המטמון בדפדפן',
-'tog-enotifwatchlistpages' => 'ש×\9c×\99×\97ת ×\93×\95×\90\9c ×\90×\9c×\99×\9a ×\9b×\90שר × ×¢×©×\94 ×©×\99× ×\95×\99 ×\91×\93פ×\99×\9d ×\91רש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a',
-'tog-enotifusertalkpages' => 'ש×\9c×\99×\97ת ×\93×\95×\90\9c ×\90×\9c×\99×\9a ×\9b×\90שר × ×¢×©×\94 ×©×\99× ×\95×\99 ×\91×\93×£ ×©×\99×\97ת ×\94×\9eשת×\9eש ×©×\9c×\9a',
-'tog-enotifminoredits' => 'ש×\9c×\99×\97ת ×\93×\95×\90\9c ×\90×\9c×\99×\9a ×\92×\9d ×¢×\9c ×¢×¨×\99×\9b×\95ת ×\9eשנ×\99×\95ת ×©×\9c ×\93פים',
+'tog-enotifwatchlistpages' => '×\9cש×\9c×\95×\97 ×\90×\9c×\99×\99 ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\9b×\90שר × ×¢×©×\94 ×©×\99× ×\95×\99 ×\91×\93×£ ×\90×\95 ×\91ק×\95×\91×¥ ×\91רש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\99',
+'tog-enotifusertalkpages' => '×\9cש×\9c×\95×\97 ×\90×\9c×\99×\99 ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\9b×\90שר × ×¢×©×\94 ×©×\99× ×\95×\99 ×\91×\93×£ ×©×\99×\97ת ×\94×\9eשת×\9eש ×©×\9c×\99',
+'tog-enotifminoredits' => '×\9cש×\9c×\95×\97 ×\90×\9c×\99×\99 ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\92×\9d ×¢×\9c ×¢×¨×\99×\9b×\95ת ×\9eשנ×\99×\95ת ×©×\9c ×\93פ×\99×\9d ×\95ק×\91צים',
 'tog-enotifrevealaddr' => 'חשיפת כתובת הדוא"ל שלך בהודעות דוא"ל',
 'tog-shownumberswatching' => 'הצגת מספר המשתמשים העוקבים אחרי הדף',
 'tog-oldsig' => 'החתימה הקיימת:',
@@ -393,8 +393,7 @@ $messages = array(
 'tog-watchlisthideliu' => 'הסתרת עריכות של משתמשים רשומים ברשימת המעקב',
 'tog-watchlisthideanons' => 'הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב',
 'tog-watchlisthidepatrolled' => 'הסתרת עריכות בדוקות ברשימת המעקב',
-'tog-nolangconversion' => 'ביטול המרת גרסאות שפה',
-'tog-ccmeonemails' => 'קבלת העתקים של הודעות דוא"ל הנשלחות ממני למשתמשים אחרים',
+'tog-ccmeonemails' => 'לשלוח אליי העתקים של הודעות דואר אלקטרוני ששלחתי למשתמשים אחרים',
 'tog-diffonly' => 'ביטול הצגת תוכן הדף מתחת להשוואות הגרסאות',
 'tog-showhiddencats' => 'הצגת קטגוריות מוסתרות',
 'tog-noconvertlink' => 'ביטול המרת קישורים לכותרות',
@@ -619,6 +618,10 @@ $1',
 'youhavenewmessages' => 'יש לך $1 ($2).',
 'newmessageslink' => 'הודעות חדשות',
 'newmessagesdifflink' => 'השוואה לגרסה הקודמת',
+'youhavenewmessagesfromusers' => 'יש לך $1 {{PLURAL:$3|ממשתמש אחר|מ־$3 משתמשים}} ($2).',
+'youhavenewmessagesmanyusers' => 'יש לך $1 ממשתמשים רבים ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|הודעה חדשה|הודעות חדשות}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|שינוי אחרון|שינויים אחרונים}}',
 'youhavenewmessagesmulti' => 'יש לך הודעות חדשות ב־$1',
 'editsection' => 'עריכה',
 'editold' => 'עריכה',
@@ -672,10 +675,10 @@ $1',
 'databaseerror' => 'שגיאת בסיס נתונים',
 'dberrortext' => 'אירעה שגיאת תחביר בשאילתה לבסיס הנתונים.
 שגיאה זו עלולה להעיד על באג בתוכנה.
\94ש×\90×\99×\9cת×\94 ×\94×\90×\97ר×\95× ×\94 ×©×\91×\95צע×\94 ×\9c×\91ס×\99ס ×\94נת×\95× ×\99×\9d הייתה:
-<blockquote><tt>$1</tt></blockquote>
-מתוך הפונקציה "<tt>$2</tt>".
-בסיס הנתונים החזיר את השגיאה "<tt>$3: $4</tt>".',
\94ש×\90×\99×\9cת×\94 ×\94×\90×\97ר×\95× ×\94 ×\9c×\91ס×\99ס ×\94נת×\95× ×\99×\9d ×©×\94ת×\95×\9b× ×\94 × ×\99סת×\94 ×\9c×\94ר×\99×¥ הייתה:
+<blockquote lang="en" dir="ltr"><code>$1</code></blockquote>
+מתוך הפונקציה "<code lang="en" dir="ltr">$2</code>".
+בסיס הנתונים החזיר את השגיאה הבאה: "<samp lang="en" dir="ltr">$3: $4</samp>".',
 'dberrortextcl' => 'אירעה שגיאת תחביר בשאילתה לבסיס הנתונים.
 השאילתה האחרונה שבוצעה לבסיס הנתונים הייתה:
 "$1"
@@ -712,6 +715,8 @@ $1',
 'cannotdelete' => 'לא ניתן היה למחוק את הדף או הקובץ "$1".
 ייתכן שהוא נמחק כבר על ידי מישהו אחר.',
 'cannotdelete-title' => 'לא ניתן למחוק את הדף "$1"',
+'delete-hook-aborted' => 'המחיקה הופסקה על־ידי מבנה Hook.
+לא ניתן הסבר.',
 'badtitle' => 'כותרת שגויה',
 'badtitletext' => 'כותרת הדף המבוקש הייתה בלתי־תקינה, ריקה, או קישור שגוי לשפה אחרת או למיזם אחר.
 ייתכן שהיא מכילה תו אחד או יותר שאינו יכול לשמש בכותרות.',
@@ -746,6 +751,8 @@ $2',
 מנהל המערכת שנעל את המאגר סיפק את ההסבר הבא: "\'\'\'$3\'\'\'".',
 'invalidtitle-knownnamespace' => 'כותרת בלתי־תקינה עם מרחב השם "$2" ושם דף "$3"',
 'invalidtitle-unknownnamespace' => 'כותרת בלתי־תקינה עם מרחב שם בלתי־ידוע מספר $1 ושם דף "$2"',
+'exception-nologin' => 'לא בחשבון',
+'exception-nologin-text' => 'כדי לראות את הדף הזה או לבצע את הפעולה הזאת צריך להיכנס לחשבון באתר הוויקי הזה.',
 
 # Virus scanner
 'virus-badscanner' => "הגדרות שגויות: סורק הווירוסים אינו ידוע: ''$1''",
@@ -766,6 +773,7 @@ $2',
 'remembermypassword' => 'שמירת הכניסה שלי בדפדפן הזה (ל{{PLURAL:$1|יום אחד|־$1 ימים|יומיים}} לכל היותר)',
 'securelogin-stick-https' => 'המשך שימוש ב־HTTPS אחרי הכניסה',
 'yourdomainname' => 'המתחם שלך:',
+'password-change-forbidden' => 'אינכם יכולים לשנות סיסמאות באתר זה.',
 'externaldberror' => 'הייתה שגיאה בבסיס הנתונים של ההזדהות, או שאינכם רשאים לעדכן את חשבונכם החיצוני.',
 'login' => 'כניסה לחשבון',
 'nav-login-createaccount' => 'כניסה לחשבון / הרשמה',
@@ -1016,16 +1024,19 @@ $2
 'noarticletext-nopermission' => 'אין כרגע טקסט בדף זה.
 באפשרותכם [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,
 או <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש ביומנים הרלוונטיים].</span>',
+'missing-revision' => 'גרסה #$1 של הדף "{{PAGENAME}}" אינה קיימת.
+
+זה נגרם בדרך כלל על־ידי לחיצה על קישור ישן לגרסה קודמת של דף שנמחק.
+אפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].',
 'userpage-userdoesnotexist' => 'חשבון המשתמש "$1" אינו רשום.
 אנא בדקו אם ברצונכם ליצור/לערוך דף זה.',
 'userpage-userdoesnotexist-view' => 'חשבון המשתמש "$1" אינו רשום.',
 'blocked-notice-logextract' => 'משתמש זה חסום כרגע.
 פעולת יומן החסימות האחרונה מוצגת להלן:',
-'clearyourcache' => "'''הערה:''' לאחר השמירה, עליכם לנקות את זיכרון המטמון (Cache) של הדפדפן כדי להבחין בשינויים.
+'clearyourcache' => "'''הערה:''' לאחר השמירה, עליכם לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
 * '''פיירפוקס / ספארי:''' לחצו על Shift בעת לחיצתכם על '''העלה מחדש''' (Reload), או הקישו על ''Ctrl-F5'' או על ''Ctrl-R'' (או על ''<span dir=\"ltr\">⌘-R</span>'' במחשב מק)
-* '''Google Chrome:''' לחצו על ''Ctrl-Shift-R'' (או על ''<span dir=\"ltr\">⌘-Shift-R</span>'' במק)
+* '''גוגל כרום:''' לחצו על ''Ctrl-Shift-R'' (או על ''<span dir=\"ltr\">⌘-Shift-R</span>'' במק)
 * '''אינטרנט אקספלורר:''' לחצו על Ctrl בעת לחיצתכם על '''רענן''' (Refresh), או הקישו על ''Ctrl-F5''
-* '''Konqueror:''' לחצו על '''טען מחדש''' (Reload) או הקישו על ''F5''
 * '''אופרה''': נקו את המטמון ב־''Tools‏ ← Preferences''",
 'usercssyoucanpreview' => "'''עצה:''' השתמשו בלחצן \"{{int:showpreview}}\" כדי לבחון את גיליון ה־CSS החדש שלכם לפני השמירה.",
 'userjsyoucanpreview' => "'''עצה:''' השתמשו בלחצן \"{{int:showpreview}}\" כדי לבחון את סקריפט ה־JavaScript החדש שלכם לפני השמירה.",
@@ -1142,6 +1153,7 @@ $2
 'expansion-depth-exceeded-warning' => 'עומק ההרחבה בדף גדול מדי',
 'parser-unstrip-loop-warning' => 'נמצאה לולאה בפריסה',
 'parser-unstrip-recursion-limit' => 'עומק הרקורסיה של הפריסה עבר את המגבלה ($1)',
+'converter-manual-rule-error' => 'התגלתה שגיאה בכלל המרת שפה ידני',
 
 # "Undo" feature
 'undo-success' => 'ניתן לבטל את העריכה. אנא בִדקו את השוואת הגרסאות למטה כדי לוודא שזה מה שאתם רוצים לעשות, ואז שמרו את השינויים למטה כדי לבצע את ביטול העריכה.',
@@ -1328,6 +1340,10 @@ $1",
 'editundo' => 'ביטול',
 'diff-multi' => '({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של {{PLURAL:$2|משתמש אחד|$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של יותר {{PLURAL:$2|ממשתמש אחד|מ־$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})',
+'difference-missing-revision' => '{{PLURAL:$2|גרסה אחת|$2 גרסאות}} של ההבדל הזה בין שתי גרסאות ($1) {{PLURAL:$2|לא נמצאה|לא נמצאו}}.
+
+זה נגרם בדרך כלל על־ידי לחיצה על קישור ישן להבדל בין גרסאות של דף שנמחק.
+אפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].',
 
 # Search results
 'searchresults' => 'תוצאות החיפוש',
@@ -1598,7 +1614,8 @@ $1",
 'right-writeapi' => 'שימוש ב־API לשינוי דפים',
 'right-delete' => 'מחיקת דפים',
 'right-bigdelete' => 'מחיקת דפים עם היסטוריית דף ארוכה',
-'right-deleterevision' => 'מחיקת גרסאות מסוימות של דפים',
+'right-deletelogentry' => 'מחיקת ושחזור פעולות מסוימות ביומן',
+'right-deleterevision' => 'מחיקת ושחזור גרסאות מסוימות של דפים',
 'right-deletedhistory' => 'צפייה בגרסאות מחוקות ללא הטקסט השייך להן',
 'right-deletedtext' => 'צפייה בטקסט מחוק ובהבדלים בין גרסאות מחוקות',
 'right-browsearchive' => 'חיפוש דפים מחוקים',
@@ -1742,9 +1759,9 @@ $1",
 כדי לראות או לחפש קבצים שהועלו בעבר אנא פנו ל[[Special:FileList|רשימת הקבצים שהועלו]], וכמו כן, העלאות (כולל העלאות של גרסה חדשה) מוצגות ב[[Special:Log/upload|יומן ההעלאות]], ומחיקות ב[[Special:Log/delete|יומן המחיקות]].
 
 כדי לכלול קובץ בדף, השתמשו בקישור באחת הצורות הבאות:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' לשימוש בגרסה המלאה של הקובץ
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|טקסט תיאור]]</nowiki></tt>''' לשימוש בגרסה מוקטנת ברוחב 200 פיקסלים בתיבה בצד שמאל של הדף, עם 'טקסט תיאור' כתיאור
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' לקישור ישיר לקובץ בלי להציגו",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' לשימוש בגרסה המלאה של הקובץ
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|טקסט תיאור]]</nowiki></code>''' לשימוש בגרסה מוקטנת ברוחב 200 פיקסלים בתיבה בצד שמאל של הדף, עם 'טקסט תיאור' כתיאור
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' לקישור ישיר לקובץ בלי להציגו",
 'upload-permitted' => 'סוגי קבצים מותרים: $1.',
 'upload-preferred' => 'סוגי קבצים מומלצים: $1.',
 'upload-prohibited' => 'סוגי קבצים אסורים: $1.',
@@ -1789,20 +1806,20 @@ $1",
 'largefileserver' => 'גודל הקובץ שהעליתם חורג ממגבלת השרת.',
 'emptyfile' => 'נראה שהקובץ שהעליתם ריק. ייתכן שהסיבה לכך היא שגיאת הקלדה בשם הקובץ. אנא ודאו שזהו הקובץ שברצונכם להעלות.',
 'windows-nonascii-filename' => 'אתר ויקי זה אינו תומך בשמות קבצים עם תווים מיוחדים או תווים שאינם באנגלית.',
-'fileexists' => "קובץ בשם זה כבר קיים, אנא בדקו את '''<tt>[[:$1]]</tt>''' אם אינכם בטוחים שברצונכם להחליף אותו.
-[[$1|thumb]]",
-'filepageexists' => "דף תיאור הקובץ עבור קובץ זה כבר נוצר ב'''<tt>[[:$1]]</tt>''', אך לא קיים קובץ בשם זה.
+'fileexists' => 'קובץ בשם זה כבר קיים, אנא בדקו את <strong>[[:$1]]</strong> אם אינכם בטוחים שברצונכם להחליף אותו.
+[[$1|thumb]]',
+'filepageexists' => 'דף תיאור הקובץ עבור קובץ זה כבר נוצר ב<strong>[[:$1]]</strong>, אך לא קיים קובץ בשם זה.
 תיאור הקובץ שתכתבו לא יופיע בדף תיאור הקובץ.
-כדי לגרום לו להופיע שם, יהיה עליכם לערוך אותו ידנית. [[$1|thumb]]",
-'fileexists-extension' => "קובץ עם שם דומה כבר קיים: [[$2|thumb]]
-* שם הקובץ המועלה: '''<tt>[[:$1]]</tt>'''
-* שם הקובץ הקיים: '''<tt>[[:$2]]</tt>'''
-אנא בחרו שם אחר.",
-'fileexists-thumbnail-yes' => "הקובץ הוא כנראה תמונה מוקטנת (ממוזערת). [[$1|thumb]]
-אנא בדקו את הקובץ '''<tt>[[:$1]]</tt>'''.
-אם הקובץ שבדקתם הוא אותה התמונה בגודל מקורי, אין זה הכרחי להעלות גם תמונה ממוזערת.",
-'file-thumbnail-no' => "שם הקובץ מתחיל עם '''<tt>$1</tt>'''. נראה שזוהי תמונה מוקטנת (ממוזערת).
-אם התמונה בגודל מלא מצויה ברשותכם, אנא העלו אותה ולא את התמונה הממוזערת; אחרת, אנא שנו את שם הקובץ.",
+כדי לגרום לו להופיע שם, יהיה עליכם לערוך אותו ידנית. [[$1|thumb]]',
+'fileexists-extension' => 'קובץ עם שם דומה כבר קיים: [[$2|thumb]]
+* שם הקובץ המועלה: <strong>[[:$1]]</strong>
+* שם הקובץ הקיים: <strong>[[:$2]]</strong>
+אנא בחרו שם אחר.',
+'fileexists-thumbnail-yes' => 'הקובץ הוא כנראה תמונה מוקטנת (ממוזערת). [[$1|thumb]]
+אנא בדקו את הקובץ <strong>[[:$1]]</strong>.
+אם הקובץ שבדקתם הוא אותה התמונה בגודל מקורי, אין זה הכרחי להעלות גם תמונה ממוזערת.',
+'file-thumbnail-no' => 'שם הקובץ מתחיל עם <strong>$1</strong>. נראה שזוהי תמונה מוקטנת (ממוזערת).
+אם התמונה בגודל מלא מצויה ברשותכם, אנא העלו אותה ולא את התמונה הממוזערת; אחרת, אנא שנו את שם הקובץ.',
 'fileexists-forbidden' => 'קובץ בשם זה כבר קיים, ואינכם יכולים להחליף אותו.
 אם אתם עדיין מעוניינים להעלות קובץ זה, אנא חזרו לדף הקודם והעלו את הקובץ תחת שם חדש.
 [[File:$1|thumb|center|$1]]',
@@ -1912,9 +1929,10 @@ $1',
 'lockmanager-fail-acquirelock' => 'לא הייתה אפשרות לקבל נעילה עבור "$1".',
 'lockmanager-fail-openlock' => 'לא הייתה אפשרות לפתוח את קובץ הנעילה עבור "$1".',
 'lockmanager-fail-releaselock' => 'לא הייתה אפשרות לשחרר את הנעילה עבור "$1".',
-'lockmanager-fail-db-bucket' => 'לא הייתה אפשרות לקבל מספיק מסדי נתונים של נעילות בדלי $1',
-'lockmanager-fail-db-release' => 'לא הייתה אפשרות לשחרר נעילות על מסד הנתונים $1',
-'lockmanager-fail-svr-release' => 'לא הייתה אפשרות לשחרר נעילות על השרת $1',
+'lockmanager-fail-db-bucket' => 'לא הייתה אפשרות לקבל מספיק מסדי נתונים של נעילות בדלי $1.',
+'lockmanager-fail-db-release' => 'לא הייתה אפשרות לשחרר נעילות על מסד הנתונים $1.',
+'lockmanager-fail-svr-acquire' => 'לא הייתה אפשרות לבצע נעילות על השרת $1.',
+'lockmanager-fail-svr-release' => 'לא הייתה אפשרות לשחרר נעילות על השרת $1.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'אירעה שגיאה במהלך פתיחת הקובץ לבדיקות ZIP.',
@@ -2032,6 +2050,7 @@ $1',
 'shared-repo' => 'מקום איחסון משותף',
 'shared-repo-name-wikimediacommons' => 'ויקישיתוף',
 'filepage.css' => '/* הסגנונות הנכתבים כאן יוכללו בדף תיאור הקובץ, כולל באתרי ויקי זרים */',
+'upload-disallowed-here' => 'למרבה הצער, אין לך הרשאה להעלות גרסה אחרת של התמונה הזאת.',
 
 # File reversion
 'filerevert' => 'שחזור $1',
@@ -2066,7 +2085,7 @@ $1',
 # MIME search
 'mimesearch' => 'חיפוש MIME',
 'mimesearch-summary' => 'דף זה מאפשר את סינון הקבצים לפי סוג ה־MIME שלהם.
-סוג ה־MIME בנוי בצורה "סוג תוכן/סוג משני", לדוגמה <tt>image/jpeg</tt>.',
+סוג ה־MIME בנוי בצורה "סוג תוכן/סוג משני", לדוגמה <code>image/jpeg</code>.',
 'mimetype' => 'סוג MIME:',
 'download' => 'הורדה',
 
@@ -2100,7 +2119,7 @@ $1',
 'statistics-pages' => 'דפים',
 'statistics-pages-desc' => 'כל הדפים באתר הוויקי, כולל דפי שיחה, הפניות, וכדומה',
 'statistics-files' => 'קבצים שהועלו',
-'statistics-edits' => '×\94ער×\99×\9b×\95ת ×\9e×\90×\96 ×ª×\97×\99×\9cת ×\94פע×\95×\9c×\94 ×©×\9c {{SITENAME}}',
+'statistics-edits' => 'ער×\99×\9b×\95ת ×©×\9c ×\93פ×\99×\9d ×\9e×\90×\96 ×\94תקנת {{SITENAME}}',
 'statistics-edits-average' => 'מספר העריכות הממוצע לדף',
 'statistics-views-total' => 'מספר הצפיות הכולל',
 'statistics-views-total-desc' => 'צפיות בדפים שאינם קיימים ובדפים מיוחדים אינן כלולות',
@@ -2112,9 +2131,9 @@ $1',
 
 'disambiguations' => 'דפים שמקשרים לדפי פירושונים',
 'disambiguationspage' => 'Template:פירושונים',
-'disambiguations-text' => "×\94×\93פ×\99×\9d ×\94×\91×\90×\99×\9d ×\9eקשר×\99×\9d ×\9c'''×\93פ×\99 פירושונים'''.
¢×\9c×\99×\94×\9d ×\9cקשר ×\9c×\93×£ ×\94× ×\95ש×\90 ×\94ר×\9c×\95×\95× ×\98×\99 ×\91×\9eק×\95×\9d ×\96×\90ת.<br />
\94×\93×£ × ×\97ש×\91 ×\9c×\93×£ ×¤×\99ר×\95ש×\95× ×\99×\9d ×\90×\9d ×\94×\95×\90 ×\9eשת×\9eש ×\91ת×\91× ×\99ת ×\94×\9eק×\95שרת ×\9e×\94×\93×£ [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "×\91×\93פ×\99×\9d ×\94×\91×\90×\99×\9d ×\99ש ×\9cפ×\97×\95ת ×§×\99ש×\95ר ×\90×\97×\93 ×\9c'''×\93×£ פירושונים'''.
\99×\99ת×\9b×\9f ×©×¢×\9c×\99×\94×\9d ×\9cקשר ×\91×\9eק×\95×\9d ×\96×\90ת ×\9c×\93×£ ×\9eת×\90×\99×\9d ×\99×\95תר.<br />
+דף נחשב לדף פירושונים אם הוא משתמש בתבנית המקושרת מהדף [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'הפניות כפולות',
 'doubleredirectstext' => 'בדף הזה מופיעה רשימת דפי הפניה שמפנים לדפי הפניה אחרים.
@@ -2139,6 +2158,7 @@ $1',
 # Miscellaneous special pages
 'nbytes' => '{{PLURAL:$1|בית אחד|$1 בתים}}',
 'ncategories' => '{{PLURAL:$1|קטגוריה אחת|$1 קטגוריות}}',
+'ninterwikis' => '{{PLURAL:$1|קישור בינוויקי קחד|$1 קישורי בינוויקי}}',
 'nlinks' => '{{PLURAL:$1|קישור אחד|$1 קישורים}}',
 'nmembers' => '{{PLURAL:$1|דף אחד|$1 דפים}}',
 'nrevisions' => '{{PLURAL:$1|גרסה אחת|$1 גרסאות}}',
@@ -2167,6 +2187,7 @@ $1',
 'mostlinkedtemplates' => 'התבניות המקושרות ביותר',
 'mostcategories' => 'הדפים עם המספר הרב ביותר של קטגוריות',
 'mostimages' => 'הקבצים המקושרים ביותר',
+'mostinterwikis' => 'הדפים עם המספר הרב ביותר של קישורי בינוויקי',
 'mostrevisions' => 'הדפים בעלי מספר העריכות הגבוה ביותר',
 'prefixindex' => 'רשימת הדפים המתחילים ב…',
 'prefixindex-namespace' => 'רשימת הדפים המתחילים ב… (במרחב השם $1)',
@@ -2268,7 +2289,7 @@ $1',
 'linksearch-ok' => 'חיפוש',
 'linksearch-text' => 'ניתן להשתמש בתווים כלליים, לדוגמה <span dir="ltr">"*.wikipedia.org"</span>.
 נדרשת לפחות סיומת אינטרנט (TLD), למשל <span dir="ltr">"*.org"</span>.<br />
-פרוטוקולים נתמכים: <tt dir="ltr">$1</tt> (אין להוסיף אותם בחיפוש).',
+פרוטוקולים נתמכים: <code dir="ltr">$1</code> (אין להוסיף אותם בחיפוש).',
 'linksearch-line' => '$1 מקושר מהדף $2',
 'linksearch-error' => 'תווים כלליים יכולים להופיע רק בתחילת שם השרת.',
 
@@ -2314,6 +2335,8 @@ $1',
 'mailnologin' => 'אין כתובת לשליחה',
 'mailnologintext' => 'עליכם [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר לעצמכם כתובת דואר אלקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] שלכם כדי לשלוח דואר למשתמש אחר.',
 'emailuser' => 'שליחת דואר אלקטרוני למשתמש זה',
+'emailuser-title-target' => 'שליחת דוא"ל {{GENDER:$1|למשתמש זה|למשתמשת זו}}',
+'emailuser-title-notarget' => 'שליחת דוא"ל למשתמש',
 'emailpage' => 'שליחת דואר למשתמש',
 'emailpagetext' => 'ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני למשתמש זה.
 כתובת הדואר האלקטרוני שכתבתם ב[[Special:Preferences|העדפות המשתמש שלכם]] תופיע ככתובת ממנה נשלחה ההודעה, כדי לאפשר תגובה ישירה למכתב.',
@@ -2335,7 +2358,7 @@ $1',
 'emailsubject' => 'נושא:',
 'emailmessage' => 'הודעה:',
 'emailsend' => 'שליחה',
-'emailccme' => '× ×\90 ×\9cש×\9c×\95×\97 ×\9c×\99 ×\91×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×\94עתק ×©×\9c ×\94×\95×\93עת×\99.',
+'emailccme' => 'נא לשלוח לי בדואר אלקטרוני העתק של הודעתי.',
 'emailccsubject' => 'העתק של הודעתך למשתמש $1: $2',
 'emailsent' => 'הדואר נשלח',
 'emailsenttext' => 'הודעת הדואר האלקטרוני שלך נשלחה.',
@@ -2457,10 +2480,12 @@ $UNWATCHURL
 'rollback' => 'שחזור עריכות',
 'rollback_short' => 'שחזור',
 'rollbacklink' => 'שחזור',
+'rollbacklinkcount' => 'שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}',
+'rollbacklinkcount-morethan' => 'שחזור יותר מ{{PLURAL:$1|עריכה אחת|־$1 עריכות}}',
 'rollbackfailed' => 'השחזור נכשל',
 'cantrollback' => 'לא ניתן לשחזר את העריכה;
 התורם האחרון הוא היחיד שכתב בדף זה.',
-'alreadyrolled' => '×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×¢×¨×\99×\9bת ×\94×\93×£ [[:$1]] ×¢×\9c ×\99×\93×\99 [[User:$2|$2]] ([[User talk:$2|ש×\99×\97×\94]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); ×\9e×\99ש×\94×\95 ×\90×\97ר ×\9b×\91ר ×¢×¨×\9a ×\90×\95 ×©×\97×\96ר ×\93×£ ×\96×\94.
+'alreadyrolled' => '×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×\94ער×\99×\9b×\94 ×©×\9c [[User:$2|$2]] ([[User talk:$2|ש×\99×\97×\94]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ×\91×\93×£ [[:$1]]; ×\9e×\99ש×\94×\95 ×\90×\97ר ×\9b×\91ר ×¢×¨×\9a ×\90×\95 ×©×\97×\96ר ×\90ת ×\94×\93×£.
 
 העריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "תקציר העריכה היה: \"'''\$1'''\".",
@@ -2950,6 +2975,7 @@ $1',
 'import-interwiki-templates' => 'ייבוא גם של כל התבניות המוכללות בדף',
 'import-interwiki-submit' => 'ייבוא',
 'import-interwiki-namespace' => 'העתקה למרחב השם:',
+'import-interwiki-rootpage' => 'דף הבסיס של היעד (לא חובה):',
 'import-upload-filename' => 'שם הקובץ:',
 'import-comment' => 'הערה:',
 'importtext' => 'נא לייצא את הקובץ מאתר המקור באמצעות ב[[Special:Export|כלי הייצוא]].
@@ -2983,6 +3009,9 @@ $1',
 'import-error-interwiki' => 'לא ניתן לייבא את הדף "$1" כיוון ששמו שמור לקישור חיצוני (בין־ויקי).',
 'import-error-special' => 'לא ניתן לייבא את הדף "$1" כיוון שהוא שייך למרחב שם מיוחד שלא יכול להכיל דפים.',
 'import-error-invalid' => 'לא ניתן לייבא את הדף "$1" כיוון ששמו אינו תקין.',
+'import-options-wrong' => '{{PLURAL:$2|אפשרות שגויה|אפשרויות שגויות}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'לדף הבסיס שניתן יש כותרת לא תקינה.',
+'import-rootpage-nosubpage' => 'מרחב השם "$1" של דף הבסיס אינו מאפשר דפי־משנה.',
 
 # Import log
 'importlogpage' => 'יומן ייבוא',
@@ -3135,16 +3164,34 @@ $1',
 
 # Info page
 'pageinfo-title' => 'מידע על "$1"',
-'pageinfo-header-edits' => 'עריכות',
-'pageinfo-header-watchlist' => 'רשימת המעקב',
-'pageinfo-header-views' => 'צפיות',
-'pageinfo-subjectpage' => 'דף',
-'pageinfo-talkpage' => 'דף שיחה',
-'pageinfo-watchers' => 'מספר עוקבים',
-'pageinfo-edits' => 'מספר עריכות',
-'pageinfo-authors' => 'מספר כותבים נפרדים',
-'pageinfo-views' => 'מספר צפיות',
-'pageinfo-viewsperedit' => 'צפיות לכל עריכה',
+'pageinfo-header-basic' => 'מידע בסיסי',
+'pageinfo-header-edits' => 'היסטוריית עריכות',
+'pageinfo-header-restrictions' => 'הגנה על הדף',
+'pageinfo-header-properties' => 'מאפייני הדף',
+'pageinfo-display-title' => 'כותרת התצוגה',
+'pageinfo-default-sort' => 'מפתח המיון הרגיל',
+'pageinfo-length' => 'אורך הדף (בבתים)',
+'pageinfo-article-id' => 'מזהה הדף',
+'pageinfo-robot-policy' => 'מצב מנוע חיפוש',
+'pageinfo-robot-index' => 'יכול להיאסף למפתחות חיפוש',
+'pageinfo-robot-noindex' => 'לא יכול להיאסף למפתחות חיפוש',
+'pageinfo-views' => 'מספר הצפיות',
+'pageinfo-watchers' => 'מספר העוקבים אחר הדף',
+'pageinfo-redirects-name' => 'הפניות לדף זה',
+'pageinfo-subpages-name' => 'דפי־משנה של דף זה',
+'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|הפניה אחת|$2 הפניות}}; {{PLURAL:$3|דף רגיל אחד|$3 דפים רגילים}})',
+'pageinfo-firstuser' => 'יוצר הדף',
+'pageinfo-firsttime' => 'תאריך יצירת הדף',
+'pageinfo-lastuser' => 'העורך האחרון',
+'pageinfo-lasttime' => 'תאריך העריכה האחרונה',
+'pageinfo-edits' => 'מספר העריכות הכולל',
+'pageinfo-authors' => 'המספר הכולל של כותבים שונים',
+'pageinfo-recent-edits' => 'מספר העריכות לאחרונה ($1)',
+'pageinfo-recent-authors' => 'מספר הכותבים הייחודיים לאחרונה',
+'pageinfo-restriction' => 'הגנה על הדף (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|מילת קסם|מילות קסם}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|תבנית מוכללת|תבניות מוכללות}} ($1)',
 
 # Skin names
 'skinname-standard' => 'קלאסי',
@@ -3199,6 +3246,7 @@ $1',
 'file-info-size-pages' => '<span dir="ltr">$1 × $2</span> פיקסלים, גודל הקובץ: $3, סוג MIME‏: $4, {{PLURAL:$5|דף אחד|$5 דפים}}',
 'file-nohires' => 'אין גרסה ברזולוציה גבוהה יותר.',
 'svg-long-desc' => 'קובץ SVG, הגודל המקורי: <span dir="ltr">$1 × $2</span> פיקסלים, גודל הקובץ: $3',
+'svg-long-desc-animated' => 'קובץ SVG מונפש, הגודל המקורי: <span dir="ltr">$1 × $2</span> פיקסלים, גודל הקובץ: $3',
 'show-big-image' => 'תמונה ברזולוציה גבוהה יותר',
 'show-big-image-preview' => 'גודל תצוגה זו: $1.',
 'show-big-image-other' => '{{PLURAL:$2|רזולוציה אחרת|רזולוציות אחרות}}: $1.',
@@ -3208,6 +3256,8 @@ $1',
 'file-info-png-looped' => 'בלולאה',
 'file-info-png-repeat' => 'הוצג {{PLURAL:$1|פעם אחת|$1 פעמים|פעמיים}}',
 'file-info-png-frames' => '{{PLURAL:$1|תמונה אחת|$1 תמונות}}',
+'file-no-thumb-animation' => "'''לתשומת לבך: בשל מגבלות טכניות, תמונות ממוזערות של הקובץ הזה לא תהיינה מונפשות.'''",
+'file-no-thumb-animation-gif' => "'''לתשומת לבך: בשל מגבלות טכניות, תמונות ממוזערות של תמונות GIF בעלות רזולוציה גבוהה כמו זאת לא תהיינה מונפשות.'''",
 
 # Special:NewFiles
 'newimages' => 'גלריית קבצים חדשים',
@@ -3896,7 +3946,7 @@ $5
 'version-version' => '(גרסה $1)',
 'version-license' => 'רישיון',
 'version-poweredby-credits' => "אתר הוויקי הזה מופעל על ידי '''[//www.mediawiki.org/ מדיה־ויקי]''', © 2001–$1 $2.",
-'version-poweredby-others' => 'אחרים',
+'version-poweredby-others' => '[{{SERVER}}{{SCRIPTPATH}}/CREDITS אחרים]',
 'version-license-info' => "מדיה־ויקי היא תוכנה חופשית; באפשרותכם להפיץ אותה מחדש ו/או לשנות אותה לפי תנאי הרישיון הציבורי הכללי של גנו המפורסם על ידי המוסד לתוכנה חופשית: גרסה 2 של רישיון זה, או (לפי בחירתכם) כל גרסה מאוחרת יותר.
 
 מדיה־ויקי מופצת בתקווה שהיא תהיה שימושית, אך '''ללא כל הבטחה לאחריות'''; אפילו לא אחריות משתמעת של '''יכולת להיסחר''' או '''התאמה למטרה מסוימת'''. ראו את הרישיון הציבורי הכללי של גנו לפרטים נוספים.
@@ -3934,7 +3984,7 @@ $5
 * <span class="mw-specialpagerestricted">דפים מיוחדים מוגבלים.</span>',
 'specialpages-group-maintenance' => 'דיווחי תחזוקה',
 'specialpages-group-other' => 'דפים מיוחדים אחרים',
-'specialpages-group-login' => 'כניסה / הרשמה לחשבון',
+'specialpages-group-login' => 'כניסה לחשבון / הרשמה',
 'specialpages-group-changes' => 'שינויים אחרונים ויומנים',
 'specialpages-group-media' => 'קובצי מדיה והעלאות',
 'specialpages-group-users' => 'משתמשים והרשאות',
@@ -4068,9 +4118,12 @@ $5
 'api-error-empty-file' => 'הקובץ ששלחתם היה ריק.',
 'api-error-emptypage' => 'יצירת דפים חדשים ריקים אינה אפשרית.',
 'api-error-fetchfileerror' => 'שגיאה פנימית: משהו השתבש בזמן אחזור הקובץ.',
+'api-error-fileexists-forbidden' => 'קובץ בשם "$1" כבר קיים ואי־אפשר לדרוס אותו.',
+'api-error-fileexists-shared-forbidden' => 'קובץ בשם "$1" כבר קיים במאגר הקבצים המשותף ואי־אפשר לדרוס אותו.',
 'api-error-file-too-large' => 'הקובץ ששלחתם היה גדול מדי.',
 'api-error-filename-tooshort' => 'שם הקובץ קצר מדי.',
 'api-error-filetype-banned' => 'סוג קובץ זה חסום.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|הוא סוג קובץ אסור להעלאה|הם סוגי קבצים אסורים להעלאה}}. {{PLURAL:$3|סוג הקובץ המותר הוא|סוגי הקבצים המותרים הם}} $2.',
 'api-error-filetype-missing' => 'חסרה סיומת לשם הקובץ.',
 'api-error-hookaborted' => 'השינוי שניסיתם לעשות נחסם על ידי הרחבה.',
 'api-error-http' => 'שגיאה פנימית: לא ניתן להתחבר לשרת.',
index e9ce52d..3e3ecf9 100644 (file)
@@ -185,7 +185,7 @@ $messages = array(
 'tog-hidepatrolled' => 'हाल में हुए बदलावों में जाँचे हुए बदलाव छिपाएँ',
 'tog-newpageshidepatrolled' => 'नए पृष्ठों की सूची में से जाँचे हुए पृष्ठों को छिपाएँ',
 'tog-extendwatchlist' => 'केवल हालिया ही नहीं, बल्कि सभी परिवर्तनों को दिखाने के लिए ध्यानसूची को विस्तारित करें',
-'tog-usenewrc' => 'परिषà¥\8dà¤\95à¥\83त à¤¹à¤¾à¤²à¤¿à¤¯à¤¾ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤\95ा à¤\89पयà¥\8bà¤\97 à¤\95रà¥\87à¤\82 (à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤\95à¥\80 à¤\86वशà¥\8dयà¤\95ता à¤¹à¥\88)',
+'tog-usenewrc' => 'हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤\94र à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤\95à¥\8b à¤ªà¥\83षà¥\8dठ à¤\85नà¥\81सार à¤¸à¤®à¥\82हà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤¬à¤¾à¤\81à¤\9fà¥\87à¤\82 (à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤\86वशà¥\8dयà¤\95)',
 'tog-numberheadings' => 'शीर्षक स्वयं-क्रमांकित करें',
 'tog-showtoolbar' => 'सम्पादन औज़ारपट्टी दिखाएँ (जावास्क्रिप्ट की आवश्यकता है)',
 'tog-editondblclick' => 'दुगुने क्लिक पर पृष्ठ संपादित करें (जावास्क्रिप्ट की आवश्यकता है)',
@@ -193,15 +193,15 @@ $messages = array(
 'tog-editsectiononrightclick' => 'अनुभाग शीर्षक पर दायाँ क्लिक करने पर अनुभाग सम्पादित करें (जावास्क्रिप्ट की आवश्यकता है)',
 'tog-showtoc' => 'अनुक्रम दर्शायें (जिन पृष्ठों पर तीन से अधिक अनुभाग हों)',
 'tog-rememberpassword' => 'इस ब्राउज़र पर मेरा कूटशब्द  (अधिकतम $1 {{PLURAL:$1|दिन|दिनों}} तक) याद रखें',
-'tog-watchcreations' => 'मेरे द्वारा निर्मित पृष्ठों को मेरी ध्यानसूची में जोड़ें',
-'tog-watchdefault' => 'मेरे द्वारा सम्पादित पृष्ठों को मेरी ध्यानसूची में जोड़ें',
-'tog-watchmoves' => 'मेरे द्वारा स्थानांतरित पृष्ठों को मेरी ध्यानसूची में जोड़ें',
-'tog-watchdeletion' => 'मेरे द्वारा हटाए गए पृष्ठों को मेरी ध्यानसूची में जोड़ें',
+'tog-watchcreations' => 'मà¥\87रà¥\87 à¤¦à¥\8dवारा à¤¨à¤¿à¤°à¥\8dमित à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\94र à¤®à¥\87रà¥\80 à¤\85पलà¥\8bड à¤\95à¥\80 à¤«à¤¼à¤¾à¤\87लà¥\8bà¤\82 à¤\95à¥\8b à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\87à¤\82',
+'tog-watchdefault' => 'मà¥\87रà¥\87 à¤¦à¥\8dवारा à¤¸à¤®à¥\8dपादित à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\94र à¤«à¤¼à¤¾à¤\87लà¥\8bà¤\82 à¤\95à¥\8b à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\87à¤\82',
+'tog-watchmoves' => 'मà¥\87रà¥\87 à¤¦à¥\8dवारा à¤¸à¥\8dथानाà¤\82तरित à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\8fवà¤\82 à¤«à¤¼à¤¾à¤\87लà¥\8bà¤\82 à¤\95à¥\8b à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\87à¤\82',
+'tog-watchdeletion' => 'मà¥\87रà¥\87 à¤¦à¥\8dवारा à¤¹à¤\9fाà¤\8f à¤\97à¤\8f à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\8fवà¤\82 à¤«à¤¼à¤¾à¤\87लà¥\8bà¤\82 à¤\95à¥\8b à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\87à¤\82',
 'tog-minordefault' => 'मेरे सभी सम्पादन छोटे बदलाव हैं',
 'tog-previewontop' => 'सम्पादन बक्से के ऊपर झलक दिखाएँ',
 'tog-previewonfirst' => 'प्रथम सम्पादन के बाद झलक दिखाएँ',
 'tog-nocache' => 'ब्राउज़र पृष्ठ कैशिंग अक्षम करें',
-'tog-enotifwatchlistpages' => 'मेरी ध्यानसूची में दर्ज किसी भी पृष्ठ में परिवर्तन होने पर मुझे ई-मेल करें',
+'tog-enotifwatchlistpages' => 'मà¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¦à¤°à¥\8dà¤\9c à¤\95िसà¥\80 à¤­à¥\80 à¤ªà¥\83षà¥\8dठ à¤\85थवा à¤«à¤¼à¤¾à¤\87ल à¤®à¥\87à¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\8bनà¥\87 à¤ªà¤° à¤®à¥\81à¤\9dà¥\87 à¤\88-मà¥\87ल à¤\95रà¥\87à¤\82',
 'tog-enotifusertalkpages' => 'मेरा वार्ता पृष्ठ परिवर्तित होने पर मुझे ई-मेल करें',
 'tog-enotifminoredits' => 'छोटे परिवर्तनों के लिए भी मुझे ई-मेल भेजें',
 'tog-enotifrevealaddr' => 'अधिसूचना ई-मेल में मेरा ई-मेल पता दर्शाएँ',
@@ -219,7 +219,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'मेरी ध्यानसूची में सत्रारम्भित सदस्यों के सम्पादन न दिखाएँ',
 'tog-watchlisthideanons' => 'आइ॰पी सदस्यों द्वारा किए सम्पादनों को मेरी ध्यानसूची में न दिखाएँ',
 'tog-watchlisthidepatrolled' => 'जाँचे गए सम्पादनों को मेरी ध्यानसूची में न दिखाएँ',
-'tog-nolangconversion' => 'वेरियंट्स के बदलाव बंद करें',
 'tog-ccmeonemails' => 'मेरे द्वारा अन्य सदस्यों को भेजे ई-मेलों की प्रतियाँ मुझे भी भेजें',
 'tog-diffonly' => 'अवतरणों में अन्तर दर्शाते समय पुराने अवतरण न दिखाएँ',
 'tog-showhiddencats' => 'छिपाई हुई श्रेणियाँ दिखाएँ',
@@ -704,7 +703,7 @@ $2',
 'passwordreset-text' => 'अपने खाते के विवरण का एक ई-मेल अनुस्मारक प्राप्त करने के लिए इस फ़ॉर्म को पूरा करें।',
 'passwordreset-legend' => 'कूटशब्द रीसेट करें',
 'passwordreset-disabled' => 'कूटशब्द रीसेट करना इस विकी पर अक्षम है।',
-'passwordreset-pretext' => '{{PLURAL:$1||नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤\8f à¤\97à¤\8f à¤¡à¥\87à¤\9fा à¤\95à¥\87 à¤\9fà¥\81à¤\95ड़à¥\8bà¤\82 में से एक लिखें}}',
+'passwordreset-pretext' => '{{PLURAL:$1||नà¥\80à¤\9aà¥\87 à¤ªà¥\82à¤\9bà¥\87 à¤\97à¤\8f à¤¡à¥\87à¤\9fा में से एक लिखें}}',
 'passwordreset-username' => 'सदस्यनाम:',
 'passwordreset-domain' => 'डोमेन:',
 'passwordreset-capture' => 'परिणामस्वरूप बना ई-मेल देखें?',
@@ -1230,7 +1229,7 @@ $1",
 'preferences' => 'मेरी वरीयताएँ',
 'mypreferences' => 'मेरी वरीयताएँ',
 'prefs-edits' => 'संपादन संख्या:',
-'prefsnologin' => 'लॉग इन नहीं किया है',
+'prefsnologin' => 'लॉग इन नहीं किया है',
 'prefsnologintext' => 'वरीयताएँ बदलने के लिए आपको <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} सत्रारंभ]</span> करना होगा।',
 'changepassword' => 'कूटशब्द बदलें',
 'prefs-skin' => 'त्वचा',
@@ -1552,7 +1551,7 @@ HTML टैग की जाँच करें।',
 'uploadbtn' => 'फ़ाइल अपलोड करें',
 'reuploaddesc' => 'अपलोड रद्द करें और पुनः अपलोड फ़ॉर्म पर जाएँ',
 'upload-tryagain' => 'संशोधित फ़ाइल विवरण भेजें',
-'uploadnologin' => 'à¤\86प à¤²à¥\89à¤\97à¥\8dड à¤\87न à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88à¤\82।',
+'uploadnologin' => 'लà¥\89à¤\97 à¤\87न à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤¹à¥\88',
 'uploadnologintext' => 'फ़ाइलें अपलोड करने के लिये [[Special:UserLogin|लॉग इन]] करना आवश्यक है।',
 'upload_directory_missing' => 'अपलोड डाइरेक्टरी ($1) मौजूद नहीं है, और वेबसर्वर इसका निर्माण नहीं कर पाया।',
 'upload_directory_read_only' => 'अपलोड डाइरेक्टरी ($1) में वेबसर्वर लिख नहीं पा रहा है।',
@@ -1560,13 +1559,13 @@ HTML टैग की जाँच करें।',
 'upload-recreate-warning' => "'''चेतावनी: उस नाम की फ़ाइल हटाई या स्थानान्तरित की जा चुकी है।'''
 
 इस पृष्ठ के हटाने और स्थानान्तरण के लॉग यहाँ सन्दर्भ के लिए दिये हैं:",
-'uploadtext' => "à¥\9eाà¤\87ल à¤\85पलà¥\8bड à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤\8f à¥\9eॉर्म का प्रयोग करें।
-[[Special:FileList|à¤\85पलà¥\8bड à¤\95à¥\80 à¤\97à¤\88 à¥\9eाà¤\87लà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80]] à¤¸à¥\87 à¤\86प à¤ªà¤¹à¤²à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\85पलà¥\8bड à¤\95à¥\80 à¤\97à¤\88 à¥\9eाà¤\87लà¥\8bà¤\82 à¤\95à¥\8b à¤¦à¥\87à¤\96 à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82 à¤\94र à¤\89नमà¥\87à¤\82 à¤\96à¥\8bà¤\9c à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82। à¤¦à¥\8bबारा à¤\85पलà¥\8bड à¤\95à¥\80 à¤\97à¤\88 à¥\9eाà¤\87लà¥\8bà¤\82 à¤\95à¥\8b [[Special:Log/upload|à¤\85पलà¥\8bड à¤¸à¥\82à¤\9aà¥\80]] à¤®à¥\87à¤\82 à¤¦à¥\87à¤\96à¥\87à¤\82, à¤\94र à¤®à¤¿à¤\9fाà¤\88 à¥\9eाइलों के लिए [[Special:Log/delete|हटाने की सूची]] देखें।
+'uploadtext' => "फ़ाà¤\87ल à¤\85पलà¥\8bड à¤\95रनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤\8f à¤«à¤¼ॉर्म का प्रयोग करें।
+[[Special:FileList|à¤\85पलà¥\8bड à¤\95à¥\80 à¤\97à¤\88 à¤«à¤¼à¤¾à¤\87लà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80]] à¤¸à¥\87 à¤\86प à¤ªà¤¹à¤²à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\85पलà¥\8bड à¤\95à¥\80 à¤\97à¤\88 à¤«à¤¼à¤¾à¤\87लà¥\8bà¤\82 à¤\95à¥\8b à¤¦à¥\87à¤\96 à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82 à¤\94र à¤\89नमà¥\87à¤\82 à¤\96à¥\8bà¤\9c à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82। à¤¦à¥\8bबारा à¤\85पलà¥\8bड à¤\95à¥\80 à¤\97à¤\88 à¤«à¤¼à¤¾à¤\87लà¥\8bà¤\82 à¤\95à¥\8b [[Special:Log/upload|à¤\85पलà¥\8bड à¤¸à¥\82à¤\9aà¥\80]] à¤®à¥\87à¤\82 à¤¦à¥\87à¤\96à¥\87à¤\82, à¤\94र à¤®à¤¿à¤\9fाà¤\88 à¤«à¤¼ाइलों के लिए [[Special:Log/delete|हटाने की सूची]] देखें।
 
-à¤\95िसà¥\80 à¤ªà¥\83षà¥\8dठ à¤®à¥\87à¤\82 à¥\9eाइल का प्रयोग करने के लिए नीचे दिए गये उदाहरणों के अनुसार कड़ियाँ बनाएँ।
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' फ़ाइल का पूरा आकार प्रयोग करने के लिये
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' पृष्ठ में बाईं ओर फ़ाइल का 200 पिक्सेल चौड़ा अवतरण \"alt text\" विवरण के साथ एक बक्से में प्रयोग करने के लिये
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' बिना फ़ाइल का प्रयोग किये केवल उसकी कड़ी जोड़ने के लिये",
+à¤\95िसà¥\80 à¤ªà¥\83षà¥\8dठ à¤®à¥\87à¤\82 à¤«à¤¼ाइल का प्रयोग करने के लिए नीचे दिए गये उदाहरणों के अनुसार कड़ियाँ बनाएँ।
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' फ़ाइल का पूरा आकार प्रयोग करने के लिये
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' पृष्ठ में बाईं ओर फ़ाइल का 200 पिक्सेल चौड़ा अवतरण \"alt text\" विवरण के साथ एक बक्से में प्रयोग करने के लिये
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' बिना फ़ाइल का प्रयोग किये केवल उसकी कड़ी जोड़ने के लिये",
 'upload-permitted' => 'अनुमतित फ़ाइल प्रकार: $1।',
 'upload-preferred' => 'पसंदीदा फ़ाइल प्रकार: $1।',
 'upload-prohibited' => 'प्रतिबंधिक फ़ाइल प्रकार: $1।',
@@ -1612,21 +1611,21 @@ HTML टैग की जाँच करें।',
 'largefileserver' => 'इस फ़ाइल का आकार निर्धारित आकार सीमा के पार है।',
 'emptyfile' => 'आपके द्वारा अपलोड की गई फ़ाइल रिक्त है। यह फ़ाइल का नाम लिखने में गलती के चलते हो सकता है। कृपया जाँचें कि क्या आप यही फ़ाइल अपलोड करना चाहते हैं।',
 'windows-nonascii-filename' => 'यह विकि विशेष कैरैक्टरों के साथ फ़ाइल के नामों को स्वीकार नहीं करता।',
-'fileexists' => "इस नाम की फ़ाइल पहले से मौजूद है, यदि यह फ़ाइल बदलने में आप साशंक हैं तो कृपया '''<tt>[[:$1]]</tt>''' देखें। [[$1|thumb]]",
-'filepageexists' => "इस फ़ाइल के लिए विवरण पृष्ठ पहले ही '''<tt>[[:$1]]</tt>''' पर बनाया जा चुका है, पर इस नाम की कोई फ़ाइल अभी उपस्थित नहीं है। 
+'fileexists' => 'इस नाम की फ़ाइल पहले से मौजूद है, यदि यह फ़ाइल बदलने में आप साशंक हैं तो कृपया <strong>[[:$1]]</strong> देखें। [[$1|thumb]]',
+'filepageexists' => 'इस फ़ाइल के लिए विवरण पृष्ठ पहले ही <strong>[[:$1]]</strong> पर बनाया जा चुका है, पर इस नाम की कोई फ़ाइल अभी उपस्थित नहीं है। 
 आप जो विवरण देंगे वह विवरण पृष्ठ पर नहीं दिखेगा। 
 आपको अपने विवरण को वहाँ डालने के लिए उसका हस्त्य सम्पादन करना पड़ेगा।
-[[$1|thumb]]",
-'fileexists-extension' => "इस नाम से मिलते-जुलते नाम की एक फ़ाइल पहले से है: [[$2|thumb]]
-* अपलोड हो रही फ़ाइल का नाम: '''<tt>[[:$1]]</tt>'''
-* मौजूदा फ़ाइल का नाम: '''<tt>[[:$2]]</tt>'''
-कृपया अन्य नाम चुनें।",
-'fileexists-thumbnail-yes' => "यह à¤«à¤¼à¤¾à¤\87ल à¤¬à¥\9cे चित्र का छोटा आकार ''(अंगूठाकार)'' प्रतीत होता है। [[$1|thumb]]
-'''<tt>[[:$1]]</tt>''' फ़ाइल को देखें।
+[[$1|thumb]]',
+'fileexists-extension' => 'इस नाम से मिलते-जुलते नाम की एक फ़ाइल पहले से है: [[$2|thumb]]
+* अपलोड हो रही फ़ाइल का नाम: <strong>[[:$1]]</strong>
+* मौजूदा फ़ाइल का नाम: <strong>[[:$2]]</strong>
+कृपया अन्य नाम चुनें।',
+'fileexists-thumbnail-yes' => "यह à¤«à¤¼à¤¾à¤\87ल à¤¬à¤¡à¤¼े चित्र का छोटा आकार ''(अंगूठाकार)'' प्रतीत होता है। [[$1|thumb]]
+<strong>[[:$1]]</strong> फ़ाइल को देखें।
 अगर जाँची गई फ़ाइल इसी आकार की है तो छोटे आकार की फ़ाइल अपलोड करने की आवश्यकता नहीं है।",
-'file-thumbnail-no' => "à¤\87स à¥\9eाà¤\87ल à¤\95ा à¤¨à¤¾à¤® '''<tt>$1</tt>''' से शुरू हो रहा है।
+'file-thumbnail-no' => "à¤\87स à¤«à¤¼à¤¾à¤\87ल à¤\95ा à¤¨à¤¾à¤® <strong>$1</strong> से शुरू हो रहा है।
 यह आकार घटाई हुई ''(अंगूठाकार)'' हो सकती है।
-à¤\85à¤\97र à¤¯à¤¹ à¤\9aितà¥\8dर à¤\85पनà¥\87 à¤®à¥\82ल à¤\86à¤\95ार à¤®à¥\87à¤\82 à¤¹à¥\88 à¤¤à¥\8b à¤\87सà¥\87 à¤\85पलà¥\8bड à¤\95रà¥\87à¤\82, à¤¨à¤¹à¥\80à¤\82 à¤¤à¥\8b à¥\9eाइल बदलें।",
+à¤\85à¤\97र à¤¯à¤¹ à¤\9aितà¥\8dर à¤\85पनà¥\87 à¤®à¥\82ल à¤\86à¤\95ार à¤®à¥\87à¤\82 à¤¹à¥\88 à¤¤à¥\8b à¤\87सà¥\87 à¤\85पलà¥\8bड à¤\95रà¥\87à¤\82, à¤¨à¤¹à¥\80à¤\82 à¤¤à¥\8b à¤«à¤¼ाइल बदलें।",
 'fileexists-forbidden' => 'इस नाम की फ़ाइल पहले ही मौजूद है, और इसकी जगह और नहीं अपलोड की जा सकती।
 यदि आप इस फ़ाइल को फिर भी अपलोड करना चाहते हैं, तो कृपया वापस जा के इसके लिए कोई अन्य नाम चुनें।
 [[File:$1|thumb|center|$1]]',
@@ -1716,8 +1715,8 @@ $1',
 'backend-fail-writetemp' => 'अस्थायी फ़ाइल पर लिखना संभव नहीं हुआ।',
 'backend-fail-closetemp' => 'अस्थाई फ़ाइल बंद नहीं हो पाई।',
 'backend-fail-read' => 'फ़ाइल $1 पढ़ी नहीं जा सकी।',
-'backend-fail-create' => 'फ़ाà¤\87ल $1 à¤¬à¤¨à¤¾à¤\88 नहीं जा सकी।',
-'backend-fail-maxsize' => 'à¥\9eाà¤\87ल $1 à¤¬à¤¨à¤¾à¤\88 à¤¨à¤¹à¥\80à¤\82 à¤\9cा à¤¸à¤\95à¥\80 à¤\95à¥\8dयà¥\8bà¤\82à¤\95ि à¤¯à¤¹ {{PLURAL:$2|$2 à¤¬à¤¾à¤\88à¤\9f}} à¤¸à¥\87 à¤¬à¥\9cी है।',
+'backend-fail-create' => 'फ़ाà¤\87ल $1 à¤²à¤¿à¤\96à¥\80 नहीं जा सकी।',
+'backend-fail-maxsize' => 'फ़ाà¤\87ल $1 à¤²à¤¿à¤\96à¥\80 à¤¨à¤¹à¥\80à¤\82 à¤\9cा à¤¸à¤\95à¥\80 à¤\95à¥\8dयà¥\8bà¤\82à¤\95ि à¤¯à¤¹ {{PLURAL:$2|$2 à¤¬à¤¾à¤\88à¤\9f}} à¤¸à¥\87 à¤¬à¤¡à¤¼ी है।',
 'backend-fail-readonly' => 'भंडारण बैकेंड "$1" इस समय केवल पढ़ा जा सकता है (रीड-ओन्ली है)। दिया गया कारण था: "$2"',
 'backend-fail-synced' => 'फ़ाइल "$1" आतंरिक भंडारण बैकेंड में असंगत स्थिति में है।',
 'backend-fail-connect' => '"$1" भंडारण बैकेंड से सम्पर्क स्थापित नहीं किया जा सका।',
@@ -1888,7 +1887,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 # MIME search
 'mimesearch' => 'MIME खोज',
 'mimesearch-summary' => 'MIME-प्रकारों के अनुसार फ़ाइलें खोजने के लिये इस पृष्ठ का इस्तेमाल किया जा सकता है।
-इनपुट: फ़ाइल का प्रकार/उपप्रकार, उदा. <tt>image/jpeg</tt>.',
+इनपुट: फ़ाइल का प्रकार/उपप्रकार, उदा. <code>image/jpeg</code>.',
 'mimetype' => 'MIME प्रकार:',
 'download' => 'डाउनलोड',
 
@@ -2086,7 +2085,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'linksearch-ok' => 'खोजें',
 'linksearch-text' => '"*.wikipedia.org" जैसे वाईल्ड-कार्ड्स प्रयोग किये जा सकते हैं।
 कम-से-कम ".org" जैसे किसी top-level डोमेन की आवश्यकता है।<br />
-स्वीकार्य प्रोटोकॉल: <tt>$1</tt> (इनमें से कोई भी अपनी खोज में न जोड़ें)',
+स्वीकार्य प्रोटोकॉल: <code>$1</code> (इनमें से कोई भी अपनी खोज में न जोड़ें)',
 'linksearch-line' => '$2 में से $1 जुडा हुआ हैं',
 'linksearch-error' => 'वाईल्डकार्ड्स होस्टनाम के सिर्फ शुरू में आ सकते हैं।',
 
@@ -2399,9 +2398,9 @@ $2 द्वारा संपादित अन्तिम अवतरण 
 'undeletedfiles' => '{{PLURAL:$1|1 फ़ाईल|$1 फ़ाईलें}} पुनर्स्थापित',
 'cannotundelete' => 'पुनर्स्थापित नहीं कर सकें;
 किसी और ने पहले ही पुनर्स्थापित कर दिया हों।',
-'undeletedpage' => "'''$1 को पुनर्स्थापित कर दिया गया है'''
+'undeletedpage' => "'''$1 को पुनर्स्थापित कर दिया गया है'''
 
-हाल में हटायें गये तथा पुनर्स्थापित किये हुए पन्नोंकी ज़ानकारी के लिये [[Special:Log/delete|हटानेकी सूची]] देखें।",
+हाल में हटाये गये तथा पुनर्स्थापित किये गए पन्नों की जानकारी के लिये [[Special:Log/delete|हटाने की लॉग]] देखें।",
 'undelete-header' => 'हाल में हटाये गये पृष्ठ देखने के लियें [[Special:Log/delete|हटाने की सूची]] देखें।',
 'undelete-search-title' => 'हटाये गये पृष्ठ खोज़ें',
 'undelete-search-box' => 'हटायें गयें पृष्ठ खोजें',
@@ -2669,7 +2668,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 इन मामलोंमे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।",
 'movearticle' => 'पृष्ठ का नाम बदलें',
 'moveuserpage-warning' => 'चाल उपयोगकर्ता चेतावनी पृष्ठ',
-'movenologin' => 'लॉग इन नहीं किया',
+'movenologin' => 'लॉग इन नहीं किया है',
 'movenologintext' => 'लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।',
 'movenotallowed' => 'आपको पृष्ठ स्थानांतरित करने की अनुमति नहीं है।',
 'movenotallowedfile' => 'आपको फ़ाइलें स्थानांतरित करने की अनुमति नहीं है।',
@@ -2920,7 +2919,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 'siteusers' => '{{SITENAME}} {{PLURAL:$2|सदस्य|सदस्य}} $1',
 'anonusers' => '{{SITENAME}} अनाम {{PLURAL:$2|सदस्य|सदस्य}} $1',
 'creditspage' => 'पान श्रेय नामावली',
-'nocredits' => 'à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\95à¥\8dरà¥\87डिà¤\9f à¤\9c़ानà¤\95ारà¥\80 à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88à¤\82।',
+'nocredits' => 'à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\95à¥\8dरà¥\87डिà¤\9f à¤\9cानà¤\95ारà¥\80 à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88।',
 
 # Spam protection
 'spamprotectiontitle' => 'स्पॅम सुरक्षा फिल्टर',
@@ -2934,21 +2933,16 @@ $1 को बाध्य करने का कारण है: "$2"',
 # Info page
 'pageinfo-title' => '"$1" के लिये जानकारी',
 'pageinfo-header-edits' => 'बदलने के लिये',
-'pageinfo-header-watchlist' => 'ध्यानसूची',
-'pageinfo-header-views' => 'दर्शाव',
-'pageinfo-subjectpage' => 'पृष्ठ',
-'pageinfo-talkpage' => 'वार्ता पृष्ठ',
+'pageinfo-views' => 'दर्शाव की संख्या',
 'pageinfo-watchers' => 'पर नजर रखने वालों की संख्या',
 'pageinfo-edits' => 'संपादन की संख्या',
 'pageinfo-authors' => 'अलग लेखकों की संख्या',
-'pageinfo-views' => 'दर्शाव की संख्या',
-'pageinfo-viewsperedit' => 'दर्शाव प्रति संपादन',
 
 # Patrolling
 'markaspatrolleddiff' => 'देख लिया ऐसा मार्क करें',
 'markaspatrolledtext' => 'इस पृष्ठ को देख लिया ऐसा मार्क करें',
 'markedaspatrolled' => 'देख लिया ऐसा मार्क करें',
-'markedaspatrolledtext' => 'चुने हुए अवतरण पर देखा गया का मार्क किया।',
+'markedaspatrolledtext' => '[[:$1]] का चयनित अवतरण जाँचा हुआ चिन्हित किया गया।',
 'rcpatroldisabled' => 'हाल में हुए बदलावों पर नजर रखना बंद कर दिया हैं',
 'rcpatroldisabledtext' => 'हाल में हुए बदलावोंपर नजर रखने की सुविधा बंद कर दी ग‍ईं हैं।',
 'markedaspatrollederror' => 'देख लिया ऐसा मार्क नहीं कर पायें',
@@ -3820,9 +3814,12 @@ $5
 'api-error-empty-file' => 'प्रस्तुत फ़ाइल खाली था।',
 'api-error-emptypage' => 'नए खाली पृष्ठ बनाने की अनुमति नहीं है।',
 'api-error-fetchfileerror' => 'आंतरिक त्रुटि: जब फ़ाइल लाया जा रहा तो कुछ गलत हो गया था।',
+'api-error-fileexists-forbidden' => '"$1" नाम की फ़ाइल पहले से मौजूद है और अधिलेखित नहीं की जा सकती।',
+'api-error-fileexists-shared-forbidden' => '"$1" नाम की फ़ाइल पहले से साझे फ़ाइल भण्डार में मौजूद है, और अधिलेखित नहीं की जा सकती।',
 'api-error-file-too-large' => 'प्रस्तुत फ़ाइल बहुत बड़ी थी।',
 'api-error-filename-tooshort' => 'फ़ाइल का नाम बहुत छोटा है।',
 'api-error-filetype-banned' => 'इस प्रकार की फ़ाइल पर प्रतिबंध लगा दिया है।',
+'api-error-filetype-banned-type' => '$1 फ़ाइल {{PLURAL:$4|प्रकार|प्रकारों}} की अनुमति नहीं है। फ़ाइल प्रकार {{PLURAL:$3|जिसकी|जिनकी}} अनुमति है: $2।',
 'api-error-filetype-missing' => 'फाईल की एक्सटेंशन लापता है.',
 'api-error-hookaborted' => 'आपके द्वारा प्रयासरत संशोधन विस्तार हूक द्वारा निरस्त किया गया।',
 'api-error-http' => 'आंतरिक त्रुटि: सर्वर से कनेक्ट करने में असमर्थ।',
index 80c55df..261937c 100644 (file)
  * @author Abdul Kadir
  * @author AndySingh
  * @author Bihari
+ * @author Brijlal
  * @author Girmitya
  * @author Kaganer
  * @author Malafaya
  * @author Thakurji
  */
 
+$namespaceNames = array(
+       NS_MEDIA            => 'saadhan',
+       NS_SPECIAL          => 'khaas',
+       NS_TALK             => 'baat',
+       NS_USER             => 'sadasya',
+       NS_USER_TALK        => 'sadasya_ke_baat',
+       NS_PROJECT_TALK     => '$1_baat',
+       NS_FILE             => 'file',
+       NS_FILE_TALK        => 'file_ke_baat',
+       NS_MEDIAWIKI_TALK   => 'Mediawiki_ke_baat',
+       NS_TEMPLATE_TALK    => 'Template_ke_baat',
+       NS_HELP             => 'madat',
+       NS_HELP_TALK        => 'madat_ke_baat',
+       NS_CATEGORY         => 'vibhag',
+       NS_CATEGORY_TALK    => 'voibhag_ke_baat',
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Jorr ke niche line khicho:',
@@ -24,7 +42,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Pahraa dewa gais badlao ke nawaa badlao me se lukao',
 'tog-newpageshidepatrolled' => 'Pahraa dewa gais badlao ke nawaa panna me se lukao',
 'tog-extendwatchlist' => 'Dhyaan suchi ke khol ke sab badlao ke dekhao, khaali nawaa waala nai',
-'tog-usenewrc' => 'Sadasya se enhance karaa gais nawaa badlao (reguires Javascript)',
+'tog-usenewrc' => 'Dher jan se badla gais panna, haali ke badlao aur dhyan suchi me (Javascript maange hae)',
 'tog-numberheadings' => 'Sab heading ke apne se number karo',
 'tog-showtoolbar' => 'Badle waala aujaar ke toolbar ke dekhao (JavaScript ke jarurat hai)',
 'tog-editondblclick' => 'Dugnaa click pe panna ke badlo (JavaScript ke jarurat hai)',
@@ -32,17 +50,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Bhaag ke title pe right click kare pe bhaag ke badle ke laabu karo  (JavaScript)',
 'tog-showtoc' => 'Dhyan suchi dekhao (uu panna khatir jon me tiin se jaada heading hai)',
 'tog-rememberpassword' => 'Ii browser me (jaada se jaada $1 {{PLURAL:$1|din|din}}) talak hamaar login ke yaad rakho.',
-'tog-watchcreations' => 'Hamaar banawa waala panna ke hamaar dhyaan suchi me jorro',
-'tog-watchdefault' => 'Ham se badla gae panna ke hamaar dhyaan suchi me jorro',
-'tog-watchmoves' => 'Uu panna jiske naam ham badla hai ke hamaar dhyaan suchi me jorro',
-'tog-watchdeletion' => 'Uu panna jiske ham mitaya hai ke hamaar dhyaan suchi me jorro',
+'tog-watchcreations' => 'Hamaar banawa waala panna aur upload karaa gais file ke hamaar dhyaan suchi me jorro',
+'tog-watchdefault' => 'Ham se badla gais panna aur file ke hamaar dhyaan suchi me jorro',
+'tog-watchmoves' => 'Uu panna aur file jiske naam ham badla hai ke hamaar dhyaan suchi me jorro',
+'tog-watchdeletion' => 'Uu panna, aur file jiske ham mitaya hai ke hamaar dhyaan suchi me jorro',
 'tog-minordefault' => 'Mamuli badlao ke apne se nishaan lagao',
 'tog-previewontop' => 'Badlao waala dabba se pahile ek jhalak dekhao',
 'tog-previewonfirst' => 'Hamaar pahila badlao pe jhalak dekhao',
 'tog-nocache' => 'Browser pe panna ke bachae me rok lagao',
-'tog-enotifwatchlistpages' => 'Jab hamaar dhyaan suchi ke koi panna ke badla jae tab hame E-mail karo',
+'tog-enotifwatchlistpages' => 'Jab hamaar dhyaan suchi ke koi panna, nai to file, ke badla jae tab hame E-mail karo',
 'tog-enotifusertalkpages' => 'Jab hamaar baat waala panna ke badla jae tab hame E-mail karo',
-'tog-enotifminoredits' => 'Panna me mamuli badlao khatir bhi hame E-mail karo',
+'tog-enotifminoredits' => 'Panna aur file me mamuli badlao khatir bhi hame E-mail karo',
 'tog-enotifrevealaddr' => 'Notification E-mail me hamaar E-mail address ke dekhao.',
 'tog-shownumberswatching' => 'Ketna sadasya dekhe hai ke number dekhao',
 'tog-oldsig' => 'Abhi ke signature:',
@@ -58,7 +76,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Logged in sadasya ke badlao ke dhyan suchi se lukao',
 'tog-watchlisthideanons' => 'Bina naam ke sadasya ke badlao ke dhyan suchi se lukao',
 'tog-watchlisthidepatrolled' => 'Pahraa dewa gais badlao ke dhyan suchi me se lukao',
-'tog-nolangconversion' => 'Variants conversion ke disable karo',
 'tog-ccmeonemails' => 'Jon e-mail ham duusra sadasya ke lage bhejtaa hai uske copy hamaar lage bhi bhejo',
 'tog-diffonly' => 'Diff ke niche panna ke content ke nai dekhao',
 'tog-showhiddencats' => 'Lukawal waala vibhag ke dekhao',
@@ -373,6 +390,8 @@ Iske, URL ke likh ke, koi administrator ke report karo.',
 'badarticleerror' => 'Ii chij ke ii panna me nai karaa jae sake hai.',
 'cannotdelete' => '{{PLURAL:$1|Template|Template}} ke ii jhalak me kaam me lawa gais hae:',
 'cannotdelete-title' => 'Panna "$1" ke mitae nai saktaa hae',
+'delete-hook-aborted' => 'Mitae ke kisis ke hook rok diis hae.
+Uu koi kaaran nai dis hae.',
 'badtitle' => 'Kharaab title',
 'badtitletext' => 'Jon panna aap mangta hai uske page title invalid, galat, nai to an incorrectly linked inter-language or inter-wiki title. Isme sait ek yah jaada character hoi jon ki title me nai kaam me lawa jae sake hai.',
 'perfcached' => 'Niche likha data ke cache karaa gais hai aur sait purana hoi. Jaada se jaada {{PLURAL:$1|ek result |$1 results}} cache me hae.',
@@ -402,6 +421,12 @@ $2',
 'ns-specialprotected' => 'Khaas panna ke badla nai jae sake hai.',
 'titleprotected' => "Ii title ke banae se [[User:$1|$1]] rokis hai.
 Iske kaaran hai ''$2''.",
+'filereadonlyerror' => 'File "$1" ke nai badle sakaa hae, kaahe ki ii file repository "$2" me hae aur iske khaali parrha jaae sake hae.
+Jon administrator iske lock karis hae, koi kaaran nai diis hae: "$3"',
+'invalidtitle-knownnamespace' => 'Namespace "$2" aur text "$3" ke kharaab title hae.',
+'invalidtitle-unknownnamespace' => 'Title gaer kaanuni hae aur iske namespace number "$1" aur text "$2" ke nai jaana jaawe hae',
+'exception-nologin' => 'Logged in nai hae',
+'exception-nologin-text' => 'Ii panna nai to aap ke action ke khatir ii wiki me login hoe ke jarurui hae',
 
 # Virus scanner
 'virus-badscanner' => "Kharaab ruup dewa gais hae: virus khoje waala software nawaa hae: ''$1''",
@@ -495,6 +520,7 @@ Ii sab feature khatir koi e-mail nai bheja jaai.',
 'invalidemailaddress' => 'E-mail address ke nai lewa jae sake hai kahe ki iske format kharaab hai.
 Meharbaani kar ke achchha address ke enter karo nai to uu field ke khali kar do.',
 'cannotchangeemail' => 'Ii wiki me account e-mail ke badla nai jaawe sake hae',
+'emaildisabled' => 'Ii site e-mail nai bheje sake hae.',
 'accountcreated' => 'Account banae dewa gais hai',
 'accountcreatedtext' => '$1 khatir user account banae dewa gais hai.',
 'createaccount-title' => '{{SITENAME}} khatir account creation',
@@ -694,7 +720,8 @@ Yaad rakhna ki custom .css aur .js panna owercase title use kare hai, jaise ki {
 'updated' => '(Update kar dewa gais hai)',
 'note' => "'''Dhyan rakkho:'''",
 'previewnote' => "'''Ii khaali ek jhalak dekhae hai'''
-Tumar badlao abhi save nai bhais hai!",
+Tumar badlao abhi bachawa nai gais hai!",
+'continue-editing' => 'Badalte raho',
 'previewconflict' => 'Ii preview uu text dekhae hai jon ki uppar ke text editing area me dekhai agar aap iske save karaa.',
 'session_fail_preview' => "''' Maaf karna! Ham log aap ke badlao ke process nai kare paya hai due to a loss of session data.
 Fir se kosis karna.
@@ -710,6 +737,7 @@ Ii badlao ke reject kar dewa gais hai to prevent corruption of the page text.
 Ii kabhi kabhi hoe hai jab aap ek buggy web-based anonymous proxy service ke use karta hai.'''",
 'edit_form_incomplete' => 'Edit form ke kuchh hissa server ke lage nai pahunche paais hae; fir se check karo ki aap ke badlao form me hae, aur fir se form ke bhejo.',
 'editing' => '$1 badlawa jae hai',
+'creating' => '$1 banaata hae',
 'editingsection' => 'Sampadan $1 (bhaag)',
 'editingcomment' => '$1 ke badla jae hai (nawaa section)',
 'editconflict' => 'Badle me conflict: $1',
@@ -776,6 +804,7 @@ Janae hai ki iske koi mitae dii hai.',
 'edit-no-change' => 'Aap ke badle ke kosis ke ignore kar dewa gais hai, kahe ki text ke badla nai gais hai.',
 'edit-already-exists' => 'Nawaa panna nai banae sakaa hai.
 Ii naam ke panna abhi hai.',
+'defaultmessagetext' => 'Default message text',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Chetauni''': Ii panna me bahut jaada expensive parser function calls hai.
@@ -791,6 +820,12 @@ Ii sab arguments ke omit kar dewa gais hai.',
 'parser-template-loop-warning' => 'Template loop ke pawa gais hai: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Template recursion depth limit se jaada hoe gais hae ($1)',
 'language-converter-depth-warning' => 'Bhasa anuwaad ke gahiraai ijajat se jaada hoe gais hae ($1)',
+'node-count-exceeded-category' => 'Panna jahaan pe node-count bahut jaada hoe gais hae',
+'node-count-exceeded-warning' => 'Panna, node-count se jaada hae',
+'expansion-depth-exceeded-category' => 'Panna jahaan pe expansion depth ke exceed karaa gais hae',
+'expansion-depth-exceeded-warning' => 'Panna expansion depth ke exceed karis hae',
+'parser-unstrip-loop-warning' => 'Unstrip loop ke pawa gai shae',
+'parser-unstrip-recursion-limit' => 'Unstrip recursion limit ke exceed karaa gais hae ($1)',
 
 # "Undo" feature
 'undo-success' => 'Ii badlao ke pahile jaise karaa jaae sake hai.
@@ -935,7 +970,7 @@ Meharbani ka ke logs ke check karo.',
 # Suppression log
 'suppressionlog' => 'Dabae waala log',
 'suppressionlogtext' => 'Niche ke suchi me administrators se lukawa gais deletions au rukawat hae.
-Abhi ke laabu rukawat ke suchi ke khatir [[Special:BlockList|IP block list]] ke dekho.',
+Abhi ke laabu rukawat ke suchi ke khatir [[Special:BlockList|block list]] ke dekho.',
 
 # History merging
 'mergehistory' => 'Panna ke itihass ke jorro',
@@ -970,6 +1005,8 @@ Ii baat ke dhyan me rakhna ki navigation jorr ke kaam me laae se ii column reset
 
 # Diffs
 'history-title' => '"$1" ke sansodhan ke itihaas',
+'difference-title' => '"$1" ke revisions ke biich ke antar',
+'difference-title-multipage' => 'Panna "$1" aur "$2" ke biich ke antar',
 'difference-multipage' => '(Panna ke biich ke antar)',
 'lineno' => 'Rekha $1:',
 'compareselectedversions' => 'Chuna gae version ke compare karo',
@@ -1067,6 +1104,7 @@ Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
 'prefs-beta' => 'Nawaa features',
 'prefs-datetime' => 'Tarik aur time',
 'prefs-labs' => 'Try kare waala features',
+'prefs-user-pages' => 'Sadasya ke panna',
 'prefs-personal' => 'Sadasya ke profile',
 'prefs-rc' => 'Nawaa badlao',
 'prefs-watchlist' => 'Dhyan suchi',
@@ -1387,9 +1425,9 @@ Hian pe mitae waala suchi aur naam badle waala suchi ke aap ke dekhe ke khatir d
 Pahile upload karaa file ke dekhe khatir [[Special:FileList|list of uploaded files]] jao, (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].
 
 To include a file in a page, use a link in one of the following forms:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' to use the full version of the file
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' to use a 200 pixel wide rendition in a box in the left margin with 'alt text' as description
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' for directly linking to the file without displaying the file",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' to use the full version of the file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' to use a 200 pixel wide rendition in a box in the left margin with 'alt text' as description
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' for directly linking to the file without displaying the file",
 'upload-permitted' => 'File types jiske ijajat hai: $1.',
 'upload-preferred' => 'Kon rakam ke file ke mangtaa hai: $1.',
 'upload-prohibited' => 'Ii rakam ke file ke upload nai karaa jaae sake hai: $1.',
@@ -1437,20 +1475,20 @@ ii file hai $2',
 Ii saait file ke naam likhe me typing mistake ke kaaran hoi.
 Meharbaani kar ke ii dekho ki aap such me ii file upload kare mangtaa hai ki nai.',
 'windows-nonascii-filename' => 'Ii wiki me password jisme special characters hae, ke kaam me nai lawa jaae sake hae.',
-'fileexists' => "Ii naam ke file abhi hai, meharbani kar ke check karo '''<tt>[[:$1]]</tt>''' agar jo aap sure nai hai ki aap iske badle mangta hai.
-[[$1|thumb]]",
-'filepageexists' => "Ii file ke description ke '''<tt>[[:$1]]</tt>''' me banae dewa gais rahaa, lekin ii naam ke koi file abhi nai hai.
+'fileexists' => 'Ii naam ke file abhi hai, meharbani kar ke check karo <strong>[[:$1]]</strong> agar jo aap sure nai hai ki aap iske badle mangta hai.
+[[$1|thumb]]',
+'filepageexists' => 'Ii file ke description ke <strong>[[:$1]]</strong> me banae dewa gais rahaa, lekin ii naam ke koi file abhi nai hai.
 Aap jon summary likhtaa hai uu panna ke description me nai dekhai.
 Description ke dekhae ke khatir, aap ke iske manually badle ke parri.
-[[$1|thumb]]",
-'fileexists-extension' => "Ii rakam ke naam ke ek aur file hai: [[$2|thumb]]
-* Uploading file ke naam: '''<tt>[[:$1]]</tt>'''
-* Abhi ke file ke naam: '''<tt>[[:$2]]</tt>'''
-Meharbani kar ke duusra naam chuno.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Ii rakam ke naam ke ek aur file hai: [[$2|thumb]]
+* Uploading file ke naam: <strong>[[:$1]]</strong>
+* Abhi ke file ke naam: <strong>[[:$2]]</strong>
+Meharbani kar ke duusra naam chuno.',
 'fileexists-thumbnail-yes' => "Ii janawe hai ki ii file ek chhota chapa hai ''(thumbnail)''. [[$1|thumb]]
-Meharbani kar ke file ke check karo '''<tt>[[:$1]]</tt>'''.
+Meharbani kar ke file ke check karo <strong>[[:$1]]</strong>.
 Agar jo check karaa gais file wahi chhapa ke original size hai tab ek aur thumbnail ke upload kare ke jaruri nai hai.",
-'file-thumbnail-no' => "File ke naam '''<tt>$1</tt>''' se suruu hoe hai.
+'file-thumbnail-no' => "File ke naam <strong>$1</strong> se suruu hoe hai.
 Ii janawe hai ki ii chhota size ke chapa hai ''(thumbnail)''.
 Agar jo aap ke lage ii chapa full resolution me hai tab uske upload karna, nai to file ke naam badlo.",
 'fileexists-forbidden' => 'Ii naam ke file abhi hai, aur iske badlawa nai jaae sake hai.
@@ -1506,6 +1544,7 @@ Agar jo problem fir nai khatam hoe tab [[Special:ListUsers/sysop|administrator]]
 'upload-too-many-redirects' => 'Ii URL me bahut jaada redirects hae.',
 'upload-unknown-size' => 'Nai pataa ki ketnaa barraa hae',
 'upload-http-error' => 'Ek HTTP galti hoe gais hae: $1',
+'upload-copy-upload-invalid-domain' => 'Ii domain se copy upload nai karaa jaae sake hae.',
 
 # File backend
 'backend-fail-stream' => 'File $1 ke stream nai kare sakaa hae.',
@@ -1523,12 +1562,25 @@ Agar jo problem fir nai khatam hoe tab [[Special:ListUsers/sysop|administrator]]
 'backend-fail-writetemp' => 'Temporary file me nai likhe sakaa hae.',
 'backend-fail-closetemp' => 'Temporary file ke nai band kare sakaa hae.',
 'backend-fail-read' => 'File $1 ke nai parrhe sakaa hae.',
-'backend-fail-create' => 'File $1 ke nai banae sakaa hae.',
+'backend-fail-create' => 'File $1 pe nai likha jaae sake hae.',
+'backend-fail-maxsize' => 'File $1 ke nai likhe sakaa hae kaahe ki ii {{PLURAL:$2|ek byte|$2 byte}} se barraa hae.',
 'backend-fail-readonly' => 'Storage backend "$1" abhi khaali read-only hae. Iske kaaran hae: "$2"',
 'backend-fail-synced' => 'File "$1" internal storage backends me ek inconsistent state me hae',
 'backend-fail-connect' => 'Storage backend "$1" se connect nai kare sakaa hae.',
 'backend-fail-internal' => 'Storage backend "$1" me ek unknown error hoe gais hae.',
 'backend-fail-contenttype' => 'Ii nai pataa lagae sakaa hae ki "$1" me bachae ke khaatir file kon rakam ke hae.',
+'backend-fail-batchsize' => 'Storage backend ke  $1 file {{PLURAL:$1|operation|operations}} ke ek batch ke dewa gais hae ; limit  $2 {{PLURAL:$2|operation|operation}} hae.',
+'backend-fail-usable' => 'File $1 ke nai likhe sakaa hae kaahe ki iske khatir jaruri ijajat nai hae, nai to directories/containers nai hae.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Storage backend "$1" ke khatir journal database se nai jorre sakaa hae.',
+'filejournal-fail-dbquery' => 'Storage backend "$1" ke khatir journal database ke nai badle sakaa hae.',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" ke  nai khole sakaa hae; ii lock nai hae.',
+'lockmanager-fail-closelock' => '"$1" ke khatir lock file ke nai band kare sakaa hae.',
+'lockmanager-fail-deletelock' => '"$1" ke khatir lock file ke nai mitae sakaa hae.',
+'lockmanager-fail-openlock' => '"$1" ke khatir lock file ke nai khola jaae sake hae',
 
 # Special:UploadStash
 'uploadstash' => 'Gupt file ke upload karo',
@@ -1666,7 +1718,7 @@ Iske baare me aur jaankari [$2 file description page] ke niche dekhawa jaae hai.
 # MIME search
 'mimesearch' => 'MIME khojo',
 'mimesearch-summary' => 'Ii panna filtering of files for its MIME-type ke enable kare hai.
-Input: contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
+Input: contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mimetype' => 'MIME ke rakam:',
 'download' => 'download karo',
 
@@ -1835,6 +1887,7 @@ Ketna chij dekhae hae ke aap kamti kare saktaa hae sadasya ke naam (case-sensiti
 'allpagesbadtitle' => 'Dewa gias panna ke title kharaab rahaa nai to inter-language nai to inter-wiki ke prefix hai.
 Is me ek nai to jaada akchhar hai jiske title me nai kaam me lawa jaae sake hai.',
 'allpages-bad-ns' => '{{SITENAME}} me namespace "$1" nai hai.',
+'allpages-hide-redirects' => 'Redirects lukao',
 
 # Special:Categories
 'categories' => 'Vibhag',
@@ -1856,7 +1909,7 @@ Is me ek nai to jaada akchhar hai jiske title me nai kaam me lawa jaae sake hai.
 'linksearch-ns' => 'Namespace:',
 'linksearch-ok' => 'Khojo',
 'linksearch-text' => 'Wildcard jaise ki "*.wikipedia.org" ke kaam me lawa jaae sake hai.<br />
-Support karaa gais protocol: <tt>$1</tt>',
+Support karaa gais protocol: <code>$1</code>',
 'linksearch-line' => '$1, $2 se jurraa hai',
 'linksearch-error' => 'Wildcards khaali hostname ke suruu me hoe ke chaahi.',
 
@@ -2170,6 +2223,7 @@ saait aur koi panna ke pahile jaise kar diis hai.',
 
 Nawaa mitawa gais aur badlao ke ulta karaa gais panna ke dekhe ke khatir [[Special:Log/delete|deletion log]] ke dekho.",
 'undelete-header' => 'Nawaa mitawa gais panna ke dekhe ke khatir [[Special:Log/delete|the deletion log]] ke dekho.',
+'undelete-search-title' => 'Mitawa gais panna ke khojo',
 'undelete-search-box' => 'Mitawa gais panna ke khojo',
 'undelete-search-prefix' => 'Uu panna ke dekhao jon ki isse suruu hoe hai:',
 'undelete-search-submit' => 'Khojo',
@@ -2284,6 +2338,7 @@ Ii rukawat pe fir se bichar kare ke khatir [[Special:BlockList|IP block list]] k
 'ipusubmit' => 'Ii rukawat ke hatao',
 'unblocked' => '[[User:$1|$1]] ke rukawat ke khalaas kar dewa gais hai',
 'unblocked-id' => 'Roko $1 ke khalaas kar dewa gais hai',
+'blocklist' => 'Roka gais sadasya',
 'ipblocklist' => 'Roka gais sadasya',
 'ipblocklist-legend' => 'Ek roka gais sadasya ke khojo',
 'blocklist-userblocks' => 'Roka gais account ke lukao',
@@ -2305,6 +2360,7 @@ Ii rukawat pe fir se bichar kare ke khatir [[Special:BlockList|IP block list]] k
 'unblocklink' => 'rukawat khatam karo',
 'change-blocklink' => 'rukawat ke badlo',
 'contribslink' => 'yogdaan',
+'emaillink' => 'E-mail bhejo',
 'autoblocker' => 'Apne se rokaa gais hai kaahe ki aap ke IP address ke abhi haali "[[User:$1|$1]]" use karis hai.
 $1 ke roke ke kaaran hai: "$2"',
 'blocklogpage' => 'Suchi ke roko',
@@ -2387,6 +2443,17 @@ Aap ke jimewaari hai ki dekho ki links right jagah point kare hai.
 Khayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move '''nai''' hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.
 Iske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.
 
+'''CHETAWANI'''
+Ii ek lokpriye panna ke galti se badal de sake hai;
+meharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
+'movepagetext-noredirectfixer' => "Niche ke form kaam me laae se panna ke naam badal jaai aur iske itihass nawaa naam ke niche hoe jaai.
+Puraana title nawaa title pe redirect hoe jaai.
+Ii jaruri hae ki aap  [[Special:DoubleRedirects|double]] nai to [[Special:BrokenRedirects|broken redirects]] ke check karo.
+Aap ke jimewaari hai ki dekho ki links right jagah point kare hai.
+
+Khayal rakhna ki agar jo nawaa title ke naam ke ek panna hai tab panna move '''nai''' hae saki jab tak ki panna khali nahi hai yah to redirect hai yah to koi pahile ke edit itihaas nahi hai.
+Iske matlab ii hai ki aap ek panna ke naam badal ke wahi naam rakh de sakta hai jon naam pahile rahaa aur agar aap mistake karaa tab abhi ke panna ke overwrite nahi kare saktaa.
+
 '''CHETAWANI'''
 Ii ek lokpriye panna ke galti se badal de sake hai;
 meharbaani kar ke aap aapan karya ke natiija ke baare me socho aage kuch kare se pahile.",
@@ -2649,7 +2716,7 @@ Ii saait ii kaaran se hoi ki panna ke ek jorr koi blacklisted external site se h
 'spam_blanking' => 'Sab badlao jisme $1 se jorr hai, ke mitawa jaawe hai',
 
 # Info page
-'pageinfo-subjectpage' => 'Panna',
+'pageinfo-edits' => 'Etna badlao rahaa',
 
 # Patrolling
 'markaspatrolleddiff' => 'Mark karo ke pahraa dewa jaawe hai',
index 685779d..9da7764 100644 (file)
@@ -13,6 +13,7 @@
  * @author Kguirnela
  * @author Oxyzen
  * @author Tagimata
+ * @author Taylortheturtle
  */
 
 $messages = array(
@@ -1530,6 +1531,7 @@ Pwede mo matan-aw ang iya ginhalinan',
 'tooltip-rollback' => '"Panumbalik" ginabalik ang (mga) na-islan sa sini nga pahina sa pinaka ulihi nga kontributor sa isa lang ka klik',
 'tooltip-undo' => '"Indi pag-obrahon" ginabalik ang gin-islan kag gabukas sa isaln form sa may prebyu mode.
 Gapasugot sa pagdugang sang rason sa kabilugan.',
+'tooltip-summary' => 'Maghatag sing diutay nga eksplikasyon',
 
 # Browsing diffs
 'previousdiff' => '← Mas daan nga na-islan',
index 70c06b3..4a1a6f4 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Croatian (Hrvatski)
+/** Croatian (hrvatski)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -15,6 +15,7 @@
  * @author Dnik
  * @author Ex13
  * @author Excaliboor
+ * @author FriedrickMILBarbarossa
  * @author Herr Mlinka
  * @author Kaganer
  * @author Luka Krstulovic
@@ -150,132 +151,132 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#PREUSMJERI', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__SADRŽAJ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BEZUREĐIVANJAODLOMAKA__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__BEZZAGLAVLJA__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'TRENUTAČNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'TRENUTAČNIMJESEC1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'TRENUTAČNIMJESECIME', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'TRENUTAČNIMJESECIMEGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'TRENUTAČNIMJESECKRAT', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'TRENUTAČNIDAN', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'TRENUTAČNIDAN2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'TRENUTAČNIDANIME', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'TRENUTAČNAGODINA', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'TRENUTAČNOVRIJEME', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'TRENUTAČNISAT', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MJESNIMJESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'MJESNIMJESEC1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'MJESNIMJESECIME', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'MJESNIMJESECIMEGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'MJESNIMJESECKRAT', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'MJESNIDAN', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'MJESNIDAN2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'MJESNIDANIME', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'MJESNAGODINA', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'MJESNOVRIJEME', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'MJESNISAT', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'BROJSTRANICA', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'BROJČLANAKA', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'BROJDATOTEKA', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'BROJSURADNIKA', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'BROJAKTIVNIHSURADNIKA', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'BROJUREĐIVANJA', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'IMESTRANICE', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'IMESTRANICEE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'IMENSKIPROSTORE', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'RAZGOVOR', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'RAZGOVORE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'PROSTORSTRANICE', 'IMPSTRANICE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'PROSTORSTRANICEE', 'IMPSTRANICEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'PUNOIMESTRANICE', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'IMEPODSTRANICE', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'IMEPODSTRANICEE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'IMEOSNOVNESTRANICE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'IMEOSNOVNESTRANICEE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'IMERAZGOVORASTRANICE', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'IMERAZGOVORASTRANICEE', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'IMEGLAVNESTRANICE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'IMEGLAVNESTRANICEE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'subst'                   => array( '0', 'ZAMJENA:', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'minijatura', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'minijatura=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'desno', 'right' ),
-       'img_left'                => array( '1', 'lijevo', 'left' ),
-       'img_none'                => array( '1', 'ništa', 'none' ),
-       'img_center'              => array( '1', 'središte', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'okvir', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'bezokvira', 'frameless' ),
-       'img_page'                => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'uspravno=$1', 'uspravno $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'obrub', 'border' ),
-       'img_baseline'            => array( '1', 'osnovnacrta', 'baseline' ),
-       'img_sub'                 => array( '1', 'potpis', 'ind', 'sub' ),
-       'img_super'               => array( '1', 'natpis', 'eks', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'vrh', 'top' ),
-       'img_text_top'            => array( '1', 'tekst-vrh', 'text-top' ),
-       'img_middle'              => array( '1', 'pola', 'middle' ),
-       'img_bottom'              => array( '1', 'dno', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'tekst-dno', 'text-bottom' ),
-       'sitename'                => array( '1', 'IMEPROJEKTA', 'SITENAME' ),
-       'ns'                      => array( '0', 'IMP:', 'NS:' ),
-       'localurl'                => array( '0', 'MJESNIURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'MJESNIURLE:', 'LOCALURLE:' ),
-       'servername'              => array( '0', 'IMESERVERA', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'PUTANJASKRIPTE', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
-       'notitleconvert'          => array( '0', '__BEZPRETVARANJANASLOVA__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__BEZPRETVARANJASADRŽAJA__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'TRENUTAČNITJEDAN', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'TRENUTAČNIDANTJEDNA', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'MJESNITJEDAN', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'MJESNIDANTJEDNA', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDIZMJENE', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'DANIZMJENE', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'DANIZMJENE2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MJESECIZMJENE', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'GODINAIZMJENE', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'VREMENSKAOZNAKAIZMJENE', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'MNOŽINA:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'PUNIURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'PUNIURLE:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'MSPRVO:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'VSPRVO:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MS:', 'LC:' ),
-       'uc'                      => array( '0', 'VS:', 'UC:' ),
-       'raw'                     => array( '0', 'NEOBRAĐENO:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'POKAŽINASLOV', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'NEO', 'R' ),
-       'newsectionlink'          => array( '1', '__NOVIODLOMAKPOVEZNICA__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'TRENUTAČNAIZMJENA', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'URLKODIRANJE:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'SIDROKODIRANJE', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'TRENUTAČNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'MJESNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#JEZIK:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'JEZIKPROJEKTA', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'STRANICEPOPROSTORU:', 'STRANICEUIMP', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'BROJADMINA', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'OBLIKBROJA', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'POSTAVALIJEVO', 'PADLEFT' ),
-       'padright'                => array( '0', 'POSTAVADESNO', 'PADRIGHT' ),
-       'special'                 => array( '0', 'posebno', 'special' ),
-       'defaultsort'             => array( '1', 'GLAVNIRASPORED:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'PUTANJADATOTEKE:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'oznaka', 'tag' ),
-       'hiddencat'               => array( '1', '__SKRIVENAKAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'STRANICEPOKATEGORIJI', 'STRANICEUKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'VELIČINASTRANICE', 'PAGESIZE' ),
-       'index'                   => array( '1', '__KAZALO__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__BEZKAZALA__', '__NOINDEX__' ),
-       'staticredirect'          => array( '1', '__NEPOMIČNOPREUSMJERAVANJE__', '__STATICREDIRECT__' ),
+       'redirect'                  => array( '0', '#PREUSMJERI', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__SADRŽAJ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BEZUREĐIVANJAODLOMAKA__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__BEZZAGLAVLJA__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'TRENUTAČNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'TRENUTAČNIMJESEC1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'TRENUTAČNIMJESECIME', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'TRENUTAČNIMJESECIMEGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'TRENUTAČNIMJESECKRAT', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'TRENUTAČNIDAN', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'TRENUTAČNIDAN2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'TRENUTAČNIDANIME', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'TRENUTAČNAGODINA', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'TRENUTAČNOVRIJEME', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'TRENUTAČNISAT', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MJESNIMJESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'MJESNIMJESEC1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'MJESNIMJESECIME', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'MJESNIMJESECIMEGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'MJESNIMJESECKRAT', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'MJESNIDAN', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'MJESNIDAN2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'MJESNIDANIME', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'MJESNAGODINA', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'MJESNOVRIJEME', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'MJESNISAT', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'BROJSTRANICA', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'BROJČLANAKA', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'BROJDATOTEKA', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'BROJSURADNIKA', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'BROJAKTIVNIHSURADNIKA', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'BROJUREĐIVANJA', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'IMESTRANICE', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'IMESTRANICEE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'IMENSKIPROSTORE', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'RAZGOVOR', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'RAZGOVORE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'PROSTORSTRANICE', 'IMPSTRANICE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'PROSTORSTRANICEE', 'IMPSTRANICEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'PUNOIMESTRANICE', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'IMEPODSTRANICE', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'IMEPODSTRANICEE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'IMEOSNOVNESTRANICE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'IMEOSNOVNESTRANICEE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'IMERAZGOVORASTRANICE', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'IMERAZGOVORASTRANICEE', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'IMEGLAVNESTRANICE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'IMEGLAVNESTRANICEE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'subst'                     => array( '0', 'ZAMJENA:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'minijatura', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'minijatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'desno', 'right' ),
+       'img_left'                  => array( '1', 'lijevo', 'left' ),
+       'img_none'                  => array( '1', 'ništa', 'none' ),
+       'img_center'                => array( '1', 'središte', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'okvir', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'bezokvira', 'frameless' ),
+       'img_page'                  => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'uspravno=$1', 'uspravno $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'obrub', 'border' ),
+       'img_baseline'              => array( '1', 'osnovnacrta', 'baseline' ),
+       'img_sub'                   => array( '1', 'potpis', 'ind', 'sub' ),
+       'img_super'                 => array( '1', 'natpis', 'eks', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'vrh', 'top' ),
+       'img_text_top'              => array( '1', 'tekst-vrh', 'text-top' ),
+       'img_middle'                => array( '1', 'pola', 'middle' ),
+       'img_bottom'                => array( '1', 'dno', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'tekst-dno', 'text-bottom' ),
+       'sitename'                  => array( '1', 'IMEPROJEKTA', 'SITENAME' ),
+       'ns'                        => array( '0', 'IMP:', 'NS:' ),
+       'localurl'                  => array( '0', 'MJESNIURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'MJESNIURLE:', 'LOCALURLE:' ),
+       'servername'                => array( '0', 'IMESERVERA', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'PUTANJASKRIPTE', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+       'notitleconvert'            => array( '0', '__BEZPRETVARANJANASLOVA__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__BEZPRETVARANJASADRŽAJA__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'TRENUTAČNITJEDAN', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'TRENUTAČNIDANTJEDNA', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'MJESNITJEDAN', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'MJESNIDANTJEDNA', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDIZMJENE', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'DANIZMJENE', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'DANIZMJENE2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MJESECIZMJENE', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'GODINAIZMJENE', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'VREMENSKAOZNAKAIZMJENE', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'MNOŽINA:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'PUNIURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'PUNIURLE:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'MSPRVO:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'VSPRVO:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MS:', 'LC:' ),
+       'uc'                        => array( '0', 'VS:', 'UC:' ),
+       'raw'                       => array( '0', 'NEOBRAĐENO:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'POKAŽINASLOV', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'NEO', 'R' ),
+       'newsectionlink'            => array( '1', '__NOVIODLOMAKPOVEZNICA__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'TRENUTAČNAIZMJENA', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'URLKODIRANJE:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'SIDROKODIRANJE', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'TRENUTAČNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'MJESNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#JEZIK:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'JEZIKPROJEKTA', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'STRANICEPOPROSTORU:', 'STRANICEUIMP', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'BROJADMINA', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'OBLIKBROJA', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'POSTAVALIJEVO', 'PADLEFT' ),
+       'padright'                  => array( '0', 'POSTAVADESNO', 'PADRIGHT' ),
+       'special'                   => array( '0', 'posebno', 'special' ),
+       'defaultsort'               => array( '1', 'GLAVNIRASPORED:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'PUTANJADATOTEKE:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'oznaka', 'tag' ),
+       'hiddencat'                 => array( '1', '__SKRIVENAKAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'STRANICEPOKATEGORIJI', 'STRANICEUKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'VELIČINASTRANICE', 'PAGESIZE' ),
+       'index'                     => array( '1', '__KAZALO__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__BEZKAZALA__', '__NOINDEX__' ),
+       'staticredirect'            => array( '1', '__NEPOMIČNOPREUSMJERAVANJE__', '__STATICREDIRECT__' ),
 );
 
 $datePreferences = array(
@@ -320,7 +321,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Sakrij pregledane izmjene u nedavnim promjenama',
 'tog-newpageshidepatrolled' => 'Sakrij pregledane stranice iz popisa novih stranica',
 'tog-extendwatchlist' => 'Proširi popis praćenih stranica tako da prikaže sve promjene, ne samo najnovije',
-'tog-usenewrc' => 'Koristi poboljšan izgled nedavnih promjena (zahtjeva JavaScripte)',
+'tog-usenewrc' => 'Rabi poboljšan izgled nedavnih promjena (zahtijeva JavaScript)',
 'tog-numberheadings' => 'Automatski označi naslove brojevima',
 'tog-showtoolbar' => 'Prikaži traku s alatima za uređivanje',
 'tog-editondblclick' => 'Dvoklik otvara uređivanje stranice (JavaScript)',
@@ -329,16 +330,16 @@ $messages = array(
 'tog-showtoc' => 'U člancima s više od tri odlomka prikaži tablicu sadržaja.',
 'tog-rememberpassword' => 'Zapamti moju lozinku u ovom pregledniku (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
 'tog-watchcreations' => 'Dodaj članke koje kreiram na moj popis praćenja',
-'tog-watchdefault' => 'Dodaj sve nove i izmijenjene stranice u popis praćenja',
-'tog-watchmoves' => 'Dodaj sve stranice koje premjestim na popis praćenja',
-'tog-watchdeletion' => 'Dodaj sve stranice koje izbrišem na popis praćenja',
+'tog-watchdefault' => 'Dodaj svaku stranicu koju uredim na moj popis praćenja',
+'tog-watchmoves' => 'Dodaj stranice i datoteke koje premjestim na moj popis praćenja',
+'tog-watchdeletion' => 'Dodaj stranice i datoteke koje izbrišem na popis praćenja',
 'tog-minordefault' => 'Normalno označavaj sve moje izmjene kao manje',
 'tog-previewontop' => 'Prikaži kako će stranica izgledati iznad okvira za uređivanje',
 'tog-previewonfirst' => 'Prikaži kako će stranica izgledati čim otvorim uređivanje',
 'tog-nocache' => 'Isključi međuspremnik (cache) stranica u pregledniku',
 'tog-enotifwatchlistpages' => 'Pošalji mi e-mail kod izmjene stranice u popisu praćenja',
 'tog-enotifusertalkpages' => 'Pošalji mi e-mail kod izmjene moje stranice za razgovor',
-'tog-enotifminoredits' => 'Pošalji mi e-mail i kod manjih izmjena',
+'tog-enotifminoredits' => 'Pošalji mi e-mail i kod manjih izmjena stranice',
 'tog-enotifrevealaddr' => 'Prikaži moju e-mail adresu u obavijestima o izmjeni',
 'tog-shownumberswatching' => 'Prikaži broj suradnika koji prate stranicu (u nedavnim izmjenama, popisu praćenja i samim člancima)',
 'tog-oldsig' => 'Pregled postojećeg potpisa:',
@@ -354,7 +355,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Sakrij uređivanja prijavljenih s popisa praćenja',
 'tog-watchlisthideanons' => 'Sakrij uređivanja neprijavljenih s popisa praćenja',
 'tog-watchlisthidepatrolled' => 'Sakrij pregledane izmjene u popisu praćenja',
-'tog-nolangconversion' => 'Isključi pretvaranje pisma (latinica-ćirilica, kineske varijante itd.) ako to wiki podržava',
 'tog-ccmeonemails' => 'Pošalji mi kopiju e-maila kojeg pošaljem drugim suradnicima',
 'tog-diffonly' => 'Ne prikazuj sadržaj stranice prilikom usporedbe inačica',
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
@@ -577,6 +577,10 @@ $1',
 'youhavenewmessages' => 'Imate $1 ($2).',
 'newmessageslink' => 'nove poruke',
 'newmessagesdifflink' => 'zadnja promjena na stranici za razgovor',
+'youhavenewmessagesfromusers' => 'Imate $1 {{PLURAL:$3||od $3 suradnika|od $3 suradnika}} ($2).',
+'youhavenewmessagesmanyusers' => 'Imate $1 od više suradnika ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|novu poruku|$1 nove poruke|$1 novih poruka}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|posljednje uređivanje|$ posljednja uređivanja|$ posljednjih uređivanja}}',
 'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
 'editsection' => 'uredi',
 'editold' => 'uredi',
@@ -628,12 +632,12 @@ Za popis svih posebnih stranica posjetite [[Special:SpecialPages|ovdje]].',
 # General errors
 'error' => 'Pogreška',
 'databaseerror' => 'Pogreška baze podataka',
-'dberrortext' => 'Došlo je do sintaksne pogreške u upitu bazi.
-Možda se radi o grešci u softveru.
-Posljednji pokušaj upita je glasio:
+'dberrortext' => 'Došlo je do sintaksne pogrješke u upitu bazi.
+Možda se radi o pogrješci u softveru.
+Posljednji je pokušaj upita glasio:
 <blockquote><tt>$1</tt></blockquote>
 iz funkcije "<tt>$2</tt>".
-Baza je vratila pogrešku "<tt>$3: $4</tt>".',
+Baza je vratila pogrješku "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'Došlo je do sintaksne pogreške s upitom bazi.
 Posljednji pokušaj upita je glasio:
 "$1"
@@ -669,6 +673,8 @@ Ako to nije slučaj, možda se radi o softverskoj grešci. Molimo da u tom sluč
 'cannotdelete' => 'Ne može se obrisati stranica ili datoteka "$1".
 Moguće je da ju je netko drugi već obrisao.',
 'cannotdelete-title' => 'Brisanje stranice "$1" nije moguće',
+'delete-hook-aborted' => 'Brisanje prekinuto softverskim priključkom (hook).
+Nema obrazloženja ili poruke o pogrješci.',
 'badtitle' => 'Loš naslov',
 'badtitletext' => 'Navedeni naslov stranice nepravilan ili loše formirana interwiki poveznica.',
 'perfcached' => 'Sljedeći podaci su iz međuspremnika i možda nisu najsvježiji. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -694,6 +700,8 @@ $2',
 'customjsprotected' => 'Ne možete uređivati ovu JavaScript stranicu zato što ona sadrži osobne postavke drugog suradnika.',
 'ns-specialprotected' => "Stranice u imenskom prostoru ''{{ns:special}}'' ne mogu se uređivati.",
 'titleprotected' => "Ovaj naslov je od kreiranja zaštitio suradnik [[User:$1|$1]], uz razlog: ''$2''.",
+'exception-nologin' => 'Niste prijavljeni',
+'exception-nologin-text' => 'Ova stranica ili aktivnost zahtijeva da budete prijavljeni na ovom wikiju.',
 
 # Virus scanner
 'virus-badscanner' => "Loša konfiguracija: nepoznati skener za viruse: ''$1''",
@@ -784,6 +792,7 @@ Ne možemo poslati e-mail ni u jednoj od sljedećih naredbi.',
 'invalidemailaddress' => 'Ne mogu prihvatiti e-mail adresu jer nije valjano oblikovana.
 Molim unesite ispravno oblikovanu adresu ili ostavite polje praznim.',
 'cannotchangeemail' => 'Na ovom wikiju ne možete promijeniti adresu e-pošte.',
+'emaildisabled' => 'Slanje e-pošte na ovom projektu nije moguće.',
 'accountcreated' => 'Suradnički račun otvoren',
 'accountcreatedtext' => 'Suradnički račun za $1 je otvoren.',
 'createaccount-title' => 'Otvaranje suradničkog računa za {{SITENAME}}',
@@ -960,10 +969,9 @@ ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.',
 'blocked-notice-logextract' => 'Ovaj suradnik je trenutačno blokiran.
 Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
 'clearyourcache' => "'''Napomena:''' Nakon snimanja možda ćete trebate očistiti međuspremnik svog preglednika kako biste vidjeli promjene.
-* '''Firefox / Safari:''' držite ''Shift'' i kliknite ''Reload'', ili pritisnite bilo ''Ctrl-F5'' ili ''Ctrl-R'' (''Command-R'' na Macu)
+* '''Firefox / Safari:''' držite ''Shift'' i pritisnite ''Reload'', ili pritisnite bilo ''Ctrl-F5'' ili ''Ctrl-R'' (''Command-R'' na Macu)
 * '''Google Chrome:''' pritisnite ''Ctrl-Shift-R'' (''Command-Shift-R'' na Macu)
 * '''Internet Explorer:''' držite ''Ctrl'' i kliknite ''Refresh'', ili pritisnite ''Ctrl-F5''
-* '''Konqueror:''' kliknite ''Reload'' ili pritisnite ''F5''
 * '''Opera:''' očistite međuspremnik u ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Savjet:''' Rabite dugme \"{{int:showpreview}}\" za testiranje svog CSS prije snimanja.",
 'userjsyoucanpreview' => "'''Savjet:''' Rabite dugme \"{{int:showpreview}}\" za testiranje svog novog JavaScripta prije snimanja.",
@@ -976,7 +984,7 @@ Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
 'userinvalidcssjstitle' => "'''Upozorenje:''' Nema sučelja pod imenom \"\$1\". Ne zaboravite da imena stranica s .css and .js kodom počinju malim slovom, npr. {{ns:user}}:Mate/vector.css, a ne {{ns:user}}:Mate/Vector.css.",
 'updated' => '(Ažurirano)',
 'note' => "'''Napomena:'''",
-'previewnote' => "'''Ne zaboravite da je ovo samo pregled kako će stranica izgledati i da stranica još nije snimljena!'''",
+'previewnote' => "'''Ne zaboravite da je ovo samo pregled kako će stranica izgledati. Vaše uređivanje još nije snimljeno!'''",
 'continue-editing' => 'Nastavi uređivati',
 'previewconflict' => 'Ovaj pregled odražava stanje u gornjem polju za unos koje će biti sačuvano
 ako pritisnete "Sačuvaj stranicu".',
@@ -1053,6 +1061,7 @@ Razlog nije ponuđen.',
 'edit-no-change' => 'Vaše uređivanje je zanemareno, jer nikakva promjena sadržaja nije napravljena.',
 'edit-already-exists' => 'Neuspješno stvaranje nove stranice.
 Stranica već postoji.',
+'defaultmessagetext' => 'Prvotni tekst poruke',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Upozorenje: Ova stranica sadrži previše opterećujućih poziva parserskih funkcija
@@ -1067,6 +1076,13 @@ Neki predlošci neće biti uključeni.',
 'parser-template-loop-warning' => 'Otkrivena petlja predloška: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Dubina rekurzije predloška je izvan granice ($1)',
 'language-converter-depth-warning' => 'Prekoračena granica dubine jezičnog pretvarača ($1)',
+'node-count-exceeded-category' => 'Stranice s previše čvorova',
+'node-count-exceeded-warning' => 'Ova stranica ima previše čvorova',
+'expansion-depth-exceeded-category' => 'Stranice s prevelikom dubinom proširenja',
+'expansion-depth-exceeded-warning' => 'Na ovoj stranici dubina proširenja je prevelika',
+'parser-unstrip-loop-warning' => 'Nedopuštena petlja',
+'parser-unstrip-recursion-limit' => 'Dosegnuto je ograničenje rekurzije ($1)',
+'converter-manual-rule-error' => 'Pronađena je pogrješka u pravilu ručnog prijevoda',
 
 # "Undo" feature
 'undo-success' => 'Izmjena je uklonjena (tekst u okviru ispod ne sadrži zadnju izmjenu). Molim sačuvajte stranicu (provjerite sažetak).',
@@ -1208,7 +1224,7 @@ Provjerite evidencije.',
 # Suppression log
 'suppressionlog' => 'Evidencije sakrivanja',
 'suppressionlogtext' => 'Slijedi popis brisanja i blokiranja koji uključuje sadržaj skriven za administratore.
-Vidi [[Special:BlockList|Popis blokiranih IP adresa]] za popis trenutačno aktivnih blokiranih adresa.',
+Vidi [[Special:BlockList|Popis blokiranja]] za popis trenutačno aktivnih blokiranih adresa.',
 
 # History merging
 'mergehistory' => 'Spoji povijesti starih izmjena stranice',
@@ -1243,7 +1259,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
 
 # Diffs
 'history-title' => 'Povijest izmjena stranice "$1"',
-'difference-title' => '$1: Razlika između inačica',
+'difference-title' => 'Razlika između inačica stranice $1',
 'difference-multipage' => '(Razlika između stranica)',
 'lineno' => 'Redak $1:',
 'compareselectedversions' => 'Usporedi odabrane inačice',
@@ -1653,9 +1669,9 @@ Evidencije brisanja i premještanja prikazane su ovdje:",
 Za pregledavanje i pretraživanje već postavljenih datoteka vidi [[Special:FileList|popis postavljenih datoteka]], (ponovljena) postavljanja su također u [[Special:Log/upload|popisu postavljanja]], a brisanja u [[Special:Log/delete|popisu brisanja]].
 
 Da biste na stranicu stavili datoteku, koristite poveznice tipa
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></tt>''' za punu verziju datoteke
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|mini|left|popratni tekst]]</nowiki></tt>''' za datoteku širine 200 px u okviru s 'popratnim tekstom' kao opisom
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></tt>''' za direktno povezivanje na datoteku bez njenog prikazivanja",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' za punu verziju datoteke
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|mini|left|popratni tekst]]</nowiki></code>''' za datoteku širine 200 px u okviru s 'popratnim tekstom' kao opisom
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' za direktno povezivanje na datoteku bez njenog prikazivanja",
 'upload-permitted' => 'Dopušteni tipovi datoteka: $1.',
 'upload-preferred' => 'Poželjni tipovi datoteka: $1.',
 'upload-prohibited' => 'Zabranjeni tipovi datoteka: $1.',
@@ -1697,20 +1713,20 @@ Dopušteni {{PLURAL:$3|tip datoteke je|tipovi datoteke su}} $2.',
 'largefileserver' => 'Veličina ove datoteke veća je od one dopuštene postavkama poslužitelja.',
 'emptyfile' => 'Datoteka koju ste postavili je prazna. Možda se radi o krivo utipkanom imenu datoteke. Provjerite želite li zaista postaviti ovu datoteku.',
 'windows-nonascii-filename' => 'Ovaj wiki ne podržava imena datoteka s posebnim znakovima.',
-'fileexists' => "Datoteka s ovim imenom već postoji, pogledajte '''<tt>[[:$1]]</tt>''' ako niste sigurni želite li je uistinu promijeniti.
-[[$1|thumb]]",
-'filepageexists' => "Opis stranice za ovu datoteku je već napravljen ovdje '''<tt>[[:$1]]</tt>''', ali datoteka sa ovim nazivom trenutno ne postoji.
+'fileexists' => 'Datoteka s ovim imenom već postoji, pogledajte <strong>[[:$1]]</strong> ako niste sigurni želite li je uistinu promijeniti.
+[[$1|thumb]]',
+'filepageexists' => 'Opis stranice za ovu datoteku je već napravljen ovdje <strong>[[:$1]]</strong>, ali datoteka sa ovim nazivom trenutno ne postoji.
 Sažetak koji ste naveli neće se pojaviti na stranici opisa.
 Da bi se Vaš opis ovdje našao, potrebno je da ga ručno uredite.
-[[$1|thumb]]",
-'fileexists-extension' => "Već postoji datoteka sa sličnim imenom: [[$2|thumb]]
-* Ime datoteke koju postavljate: '''<tt>[[:$1]]</tt>'''
-* Ime postojeće datoteke: '''<tt>[[:$2]]</tt>'''
-Molimo da izaberete drugo ime.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Već postoji datoteka sa sličnim imenom: [[$2|thumb]]
+* Ime datoteke koju postavljate: <strong>[[:$1]]</strong>
+* Ime postojeće datoteke: <strong>[[:$2]]</strong>
+Molimo da izaberete drugo ime.',
 'fileexists-thumbnail-yes' => "Datoteka je najvjerojatnije slika u smanjenoj veličini ''(thumbnail)''. [[$1|thumb]]
-Molimo provjerite datoteku '''<tt>[[:$1]]</tt>'''.
+Molimo provjerite datoteku <strong>[[:$1]]</strong>.
 Ukoliko je ta datoteka ista kao i ova koju ste upravo pokušali snimiti, samo u višoj rezoluciji, nije nužno snimanje smanjenje slike ''(thumbnaila)'', prikazivanje smanjene slike iz izvornika radi se softverski.",
-'file-thumbnail-no' => "Ime datoteke počinje s '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Ime datoteke počinje s <strong>$1</strong>.
 Čini se da je to slika smanjene veličine ''(minijatura)''.
 Ukoliko imate ovu sliku u punoj razlučljivosti (rezoluciji) postavite tu sliku, u protivnom, molimo promijenite ime datoteke.",
 'fileexists-forbidden' => 'Datoteka s ovim imenom već postoji i nemože biti presnimljena.
@@ -1763,6 +1779,19 @@ Ako se problem ponovi, javite to [[Special:ListUsers/sysop|administratoru]].',
 'upload-too-many-redirects' => 'URL je sadržavao previše preusmjeravanja',
 'upload-unknown-size' => 'Nepoznata veličina',
 'upload-http-error' => 'HTTP pogreška: $1',
+'upload-copy-upload-invalid-domain' => 'Kopije postavljenih datoteka nisu dostupne s ove domene.',
+
+# File backend
+'backend-fail-stream' => 'Ne mogu prikazati datoteku $1.',
+'backend-fail-backup' => 'Izrada sigurnosne kopije datoteke "$1" nije uspjela.',
+'backend-fail-notexists' => 'Datoteka $1 ne postoji.',
+'backend-fail-hashes' => '"Hash" indeksi datoteka za usporedbu nisu nađeni.',
+'backend-fail-notsame' => 'Na lokaciji $1 već postoji datoteka koja se razlikuje.',
+'backend-fail-invalidpath' => "$1 nije valjana pričuvna putanja (''path'').",
+'backend-fail-delete' => 'Ne mogu obrisati datoteku $1.',
+'backend-fail-opentemp' => 'Ne mogu otvoriti privremenu datoteku.',
+'backend-fail-writetemp' => 'Ne mogu pisati u privremenu datoteku.',
+'backend-fail-closetemp' => 'Ne mogu zatvoriti privremenu datoteku.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Došlo je do pogreške pri otvaranju datoteke za ZIP provjeru.',
@@ -1906,7 +1935,7 @@ Slijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vo
 
 # MIME search
 'mimesearch' => 'MIME tražilica',
-'mimesearch-summary' => 'Ova stranica omogućuje pretraživanje datoteka prema njihovim MIME zaglavljima. Ulazni parametar: tip_datoteke/podtip, npr. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Ova stranica omogućuje pretraživanje datoteka prema njihovim MIME zaglavljima. Ulazni parametar: tip_datoteke/podtip, npr. <code>image/jpeg</code>.',
 'mimetype' => 'MIME tip datoteke:',
 'download' => 'skidanje',
 
@@ -1954,7 +1983,7 @@ Slijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vo
 'disambiguationspage' => 'Template:Razdvojba',
 'disambiguations-text' => "Sljedeće stranice povezuju na '''razdvojbenu stranicu'''.
 Umjesto toga bi trebale povezivati na prikladnu temu.<br />
-Stranica se tretira kao razdvojbena stranica ako koristi predložak na kojega vodi [[MediaWiki:Disambiguationspage]]",
+Stranica se tretira kao razdvojbena stranica ako rabi predložak na kojega vodi [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Dvostruka preusmjeravanja',
 'doubleredirectstext' => 'Ova stranica sadrži popis stranica koje preusmjeravju na druge stranice za preusmjeravanje.
@@ -1980,6 +2009,7 @@ koja obično ukazuje na "pravu" odredišnu stranicu, na koju bi trebalo pokaziva
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bajt|bajta|bajtova}}',
 'ncategories' => '$1 {{PLURAL:$1|kategorija|kategorije|kategorija}}',
+'ninterwikis' => '$1 međuwiki {{PLURAL:$1|poveznica|poveznice|poveznica}}',
 'nlinks' => '$1 {{PLURAL:$1|poveznica|poveznice|poveznica}}',
 'nmembers' => '$1 {{PLURAL:$1|član|članova}}',
 'nrevisions' => '$1 {{PLURAL:$1|inačica|inačice|inačica}}',
@@ -2006,6 +2036,7 @@ koja obično ukazuje na "pravu" odredišnu stranicu, na koju bi trebalo pokaziva
 'mostlinkedtemplates' => 'Predlošci na koje vodi najviše poveznica',
 'mostcategories' => 'Popis članaka po broju kategorija',
 'mostimages' => 'Slike na koje vodi najviše poveznica',
+'mostinterwikis' => 'Stranice s najviše međuwiki poveznica',
 'mostrevisions' => 'Popis članaka po broju uređivanja',
 'prefixindex' => 'Sve stranice prema početku naslova',
 'shortpages' => 'Kratke stranice',
@@ -2075,6 +2106,12 @@ Možete suziti prikaz odabirući tip evidencije, suradničko ime ili stranicu u
 'allpagesprefix' => 'Stranice čiji naslov počinje s:',
 'allpagesbadtitle' => 'Zadana stranica nije valjana, ili je imala međuwiki predmetak. Možda sadrži jedan ili više znakova koji ne mogu biti uporabljeni u nazivu stranice.',
 'allpages-bad-ns' => '{{SITENAME}} nema imenski prostor "$1".',
+'allpages-hide-redirects' => 'Sakrij preusmjeravanja',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Gledate inačicu ove stranice iz privremene memorije, koja može biti stara i do $1.',
+'cachedspecial-viewing-cached-ts' => 'Gledate inačicu ove stranice iz privremene memorije, koja možda nije potpuno aktualna.',
+'cachedspecial-refresh-now' => 'Pogledaj najnoviju.',
 
 # Special:Categories
 'categories' => 'Kategorije',
@@ -2097,7 +2134,7 @@ Također pogledajte [[Special:WantedCategories|tražene kategorije]].',
 'linksearch-ok' => 'Traži',
 'linksearch-text' => 'Možete koristiti džoker znakove poput "*.wikipedia.org".
 Potrebno je navesti osnovnu domenu (TLD), npr. "*.org".<br />
-Podržani su protokoli: <tt>$1</tt> (ne stavljajte ih u vaše pretraživanje).',
+Podržani su protokoli: <code>$1</code> (ne stavljajte ih u vaše pretraživanje).',
 'linksearch-line' => '$1 poveznica s članka $2',
 'linksearch-error' => 'Džoker znakovi se mogu rabiti samo na početku imena poslužitelja.',
 
@@ -2145,6 +2182,7 @@ Dodatne informacije o pojedinim pravim se mogu pronaći [[{{MediaWiki:Listgroupr
 i imati valjanu adresu e-pošte u svojim [[Special:Preferences|postavkama]]
 da bi mogli slati poštu drugim suradnicima.',
 'emailuser' => 'Pošalji e-poštu ovom suradniku',
+'emailuser-title-notarget' => 'Pošalji e-poštu suradniku',
 'emailpage' => 'Pošalji e-poštu suradniku',
 'emailpagetext' => 'Možete koristiti ovaj obrazac za slanje elektroničke pošte ovom suradniku.
 E-mail adresa iz Vaših [[Special:Preferences|postavki]] nalazit će se u "From" polju poruke i primatelj će Vam moći izravno odgovoriti.',
@@ -2266,7 +2304,7 @@ Molim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu
 'actionfailed' => 'Radnja nije uspjela',
 'deletedtext' => '"$1" je izbrisana.
 Vidi $2 za evidenciju nedavnih brisanja.',
-'dellogpage' => 'Evidencija_brisanja',
+'dellogpage' => 'Evidencija brisanja',
 'dellogpagetext' => 'Dolje je popis nedavnih brisanja.
 Sva vremena su prema poslužiteljevom vremenu.',
 'deletionlog' => 'evidencija brisanja',
@@ -2286,6 +2324,8 @@ Sva vremena su prema poslužiteljevom vremenu.',
 'rollback' => 'Ukloni posljednju promjenu',
 'rollback_short' => 'Ukloni',
 'rollbacklink' => 'ukloni',
+'rollbacklinkcount' => 'ukloni $1 {{PLURAL:$1|uređivanje|uređivanja}}',
+'rollbacklinkcount-morethan' => 'ukloni više od $1 {{PLURAL:$1|uređivanje|uređivanja}}',
 'rollbackfailed' => 'Uklanjanje neuspješno',
 'cantrollback' => 'Ne mogu ukloniti posljednju promjenu, postoji samo jedna promjena.',
 'alreadyrolled' => 'Ne mogu ukloniti posljednju promjenu članka [[:$1]] koju je napravio  [[User:$2|$2]] ([[User talk:$2|Razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); netko je već promijenio stranicu ili uklonio promjenu.
@@ -2512,8 +2552,8 @@ vandalizirane).',
 'ipb-confirm' => 'Potvrdi blokiranje',
 'badipaddress' => 'Nevaljana IP adresa.',
 'blockipsuccesssub' => 'Uspješno blokirano',
-'blockipsuccesstext' => 'Suradnik [[Special:Contributions/$1|$1]] je blokiran.<br />
-Pogledaj [[Special:BlockList|popis blokiranih IP adresa]] za pregled.',
+'blockipsuccesstext' => '{{GENDER:$1|Suradnik|Suradnica}} [[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana}}.<br />
+Pogledajte [[Special:BlockList|popis blokiranja]] za pregled blokiranih suradnika.',
 'ipb-blockingself' => 'Blokirat ćete se! Jeste li sigurni da to želite?',
 'ipb-confirmhideuser' => 'Upravo ćete blokirati suradnika koji ima mogućnost "sakrij suradnika" omogućenu. To će sakriti suradničko ime na svim popisima i evidencijama. Jeste li sigurni da želite to učiniti?',
 'ipb-edit-dropdown' => 'Uredi razloge blokiranja',
@@ -2565,7 +2605,9 @@ Evidencija blokiranja je prikazan ispod kao napomena:',
 Zapisnik skrivanja je prikazan ispod kao napomena:',
 'blocklogentry' => 'Blokiran je "[[$1]]" na rok $2 $3',
 'reblock-logentry' => 'promijenjene postavke blokiranja za [[$1]] na rok od $2 $3',
-'blocklogtext' => 'Ovo je evidencija blokiranja i deblokiranja. Na popisu nema automatski blokiranih IP adresa. Za popis trenutačnih zabrana i blokiranja vidi [[Special:BlockList|popis IP blokiranja]].',
+'blocklogtext' => 'Ovo je evidencija blokiranja i deblokiranja.
+Na popisu nema automatski blokiranih IP adresa.
+Za popis trenutačnih zabrana i blokiranja vidi [[Special:BlockList|popis blokiranja]].',
 'unblocklogentry' => 'Deblokiran "$1"',
 'block-log-flags-anononly' => 'samo za neprijavljene suradnike',
 'block-log-flags-nocreate' => 'otvaranje novih suradničkih imena nije moguće',
@@ -2719,6 +2761,7 @@ Molimo odaberite drugo ime.',
 Za izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i označite želite li trenutačnu inačicu zajedno sa svim prijašnjima, ili samo trenutačnu inačicu s informacijom o zadnjoj promjeni.
 
 U potonjem slučaju možete koristiti i poveznicu, npr. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za članak [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Izvezi sve stranice',
 'exportcuronly' => 'Uključi samo trenutačnu inačicu, ne i sve prijašnje',
 'exportnohistory' => "----
 '''Napomena:''' izvoz cjelokupne stranice sa svim prethodnim izmjenama onemogućen je zbog opterećenja poslužitelja.",
@@ -2773,6 +2816,7 @@ Transwiki uvoz stranica je zabilježen u [[Special:Log/import|evidenciji uvoza s
 'import-interwiki-templates' => 'Uključi sve predloške',
 'import-interwiki-submit' => 'Uvezi',
 'import-interwiki-namespace' => 'Odredišni imenski prostor:',
+'import-interwiki-rootpage' => 'Odredišna početna stranica (parametar nije nužan):',
 'import-upload-filename' => 'Ime datoteke:',
 'import-comment' => 'Komentar:',
 'importtext' => 'Molimo izvezite datoteku iz izvorišnog wikija koristeći [[Special:Export|izvozno pomagalo]]. 
@@ -2811,6 +2855,10 @@ Snimite je na svoje računalo i postavite je ovdje.',
 'import-logentry-interwiki' => 'transwiki uvezeno $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|promjena|promjene|promjena}} od $2',
 
+# JavaScriptTest
+'javascripttest' => 'Testiranje JavaScripta',
+'javascripttest-disabled' => 'Ova funkcija nije omogućena na ovom wikiprojektu.',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Moja suradnička stranica',
 'tooltip-pt-anonuserpage' => 'Suradnička stranica za IP adresu pod kojom uređujete',
@@ -2871,6 +2919,8 @@ Snimite je na svoje računalo i postavite je ovdje.',
 'tooltip-diff' => 'Prikaži promjene učinjene u tekstu.',
 'tooltip-compareselectedversions' => 'Prikaži usporedbu izabranih inačica ove stranice.',
 'tooltip-watch' => 'Dodaj na popis praćenja',
+'tooltip-watchlistedit-normal-submit' => 'Ukloni naslove',
+'tooltip-watchlistedit-raw-submit' => 'Osvježi popis praćenja',
 'tooltip-recreate' => 'Vrati stranicu unatoč tome što je obrisana',
 'tooltip-upload' => "Pokreni snimanje (''upload'')",
 'tooltip-rollback' => '"Ukloni" uklanja uređivanja zadnjeg suradnika na ovoj stranici.',
@@ -2909,19 +2959,28 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
 'spambot_username' => 'MediaWiki zaštita od spama',
 'spam_reverting' => 'Vraćam na zadnju inačicu koja ne sadrži poveznice na $1',
 'spam_blanking' => 'Sve inačice sadrže poveznice na $1, brišem cjelokupni sadržaj',
+'spam_deleting' => 'Sve inačice sadržale su poveznice na $1, brišem cjelokupni sadržaj',
 
 # Info page
 'pageinfo-title' => 'Podatci o "$1"',
+'pageinfo-header-basic' => 'Osnovni podaci',
 'pageinfo-header-edits' => 'Uređivanja',
-'pageinfo-header-watchlist' => 'Praćene stranice',
-'pageinfo-header-views' => 'Pregleda',
-'pageinfo-subjectpage' => 'Stranica',
-'pageinfo-talkpage' => 'Stranica za razgovor',
+'pageinfo-header-restrictions' => 'Zaštita stranice',
+'pageinfo-header-properties' => 'Svojstva stranice',
+'pageinfo-display-title' => 'Prikaži naslov',
+'pageinfo-default-sort' => 'Podrazumijevano sortiranje',
+'pageinfo-length' => 'Dužina stranice (u bajtovima)',
+'pageinfo-article-id' => 'ID stranice',
+'pageinfo-robot-policy' => 'Status tražilice',
+'pageinfo-robot-index' => 'Stranicu je moguće indeksirati',
+'pageinfo-views' => 'Broj pregleda',
 'pageinfo-watchers' => 'Broj pratitelja stranice',
+'pageinfo-firstuser' => 'Suradnik koji je stvorio stranicu',
+'pageinfo-firsttime' => 'Datum stvaranja stranice',
+'pageinfo-lastuser' => 'Posljednji urednik stranice',
+'pageinfo-lasttime' => 'Datum zadnjeg uređivanja',
 'pageinfo-edits' => 'Broj uređivanja',
 'pageinfo-authors' => 'Broj različitih autora',
-'pageinfo-views' => 'Broj pregleda',
-'pageinfo-viewsperedit' => 'Pregleda po uređivanju',
 
 # Skin names
 'skinname-standard' => 'Standardna',
@@ -3673,6 +3732,9 @@ Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne lic
 'version-software' => 'Instalirani softver',
 'version-software-product' => 'Proizvod',
 'version-software-version' => 'Verzija',
+'version-entrypoints' => 'URL adresa instalacije',
+'version-entrypoints-header-entrypoint' => 'Početna adresa',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Putanja datoteke',
@@ -3824,14 +3886,15 @@ Inače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će
 
 # API errors
 'api-error-badaccess-groups' => 'Nemate ovlasti za postavljanje datoteka na ovu wiki.',
-'api-error-badtoken' => "''Token'' koji smo koristili za vašu identifikaciju na ovaj poslužitelj nije bio ispravan.",
-'api-error-copyuploaddisabled' => 'Postavljanja datoteka kopiranjem su onemogućena.',
-'api-error-duplicate' => 'Već postoji jedna datoteka na ovoj wiki s istim sadržajem',
+'api-error-badtoken' => 'Interna pogrješka: Token nije ispravan.',
+'api-error-copyuploaddisabled' => 'Postavljanje datoteka putem URL-a nije omogućeno na ovom projektu.',
+'api-error-duplicate' => '{{PLURAL:$1|Postoji [$2 druga datoteka]|Postoje $1 [$2 druge datoteke]|Postoji $1 [$2 drugih datoteka]}} istog sadržaja.',
 'api-error-empty-file' => 'Datoteka koju ste poslali je prazna.',
 'api-error-fetchfileerror' => 'Pojavio se neki problem pri dobivanju podataka o datoteci.',
 'api-error-file-too-large' => 'Datoteka koju ste poslali bila je prevelika.',
 'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
 'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|je nedopušteni tip datoteke|su nedopušteni tipovi datoteke}}. Dopušteni {{PLURAL:$3|tip datoteke je|tipovi datoteke su}} $2.',
 'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
 'api-error-hookaborted' => 'Izmjena koji ste pokušali načiniti je otkazana preko "kuke" proširenja mediawiki softvera.',
 'api-error-http' => 'Interna pogreška: Ne može se povezati na poslužitelj.',
@@ -3854,4 +3917,7 @@ Inače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će
 'api-error-uploaddisabled' => 'Postavljanje datoteka je onemogućeno na ovom wikiprojektu.',
 'api-error-verification-error' => 'Ova datoteka je možda oštećena ili ima pogrešan nastavak.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}',
+
 );
index a0ec89e..b7c2b96 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Upper Sorbian (Hornjoserbsce)
+/** Upper Sorbian (hornjoserbsce)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -160,7 +160,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Dohladawane změny w aktualnych změnach schować',
 'tog-newpageshidepatrolled' => 'Dohladowane strony z lisćiny nowych stronow schować',
 'tog-extendwatchlist' => 'Lisćinu wobkedźbowankow wočinić, zo by wšě změny widźał, nic jenož najnowše',
-'tog-usenewrc' => 'Rozšěrjenu lisćinu aktualnych změnow (trjeba JavaScript) wužiwać',
+'tog-usenewrc' => 'Skupinske změny po stronje w aktualnych změnach a wobkedźbowankach (trjeba JavaScript)',
 'tog-numberheadings' => 'Nadpisma awtomatisce čisłować',
 'tog-showtoolbar' => 'Gratowu lajstu pokazać (wužaduje sej JavaScript)',
 'tog-editondblclick' => 'Strony z dwójnym kliknjenjom wobdźěłować (wužaduje sej JavaScript)',
@@ -168,17 +168,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Wobdźěłowanje jednotliwych wotrězkow přez kliknjenje z prawej tastu na nadpisma wotrězkow zmóžnić (wužaduje sej JavaScript)',
 'tog-showtoc' => 'Zapis wobsaha pokazać (za strony z wjace hač 3 nadpismami)',
 'tog-rememberpassword' => 'Přizjewjenje na tutym wobhladowaku sej spomjatkować (za maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
-'tog-watchcreations' => 'Strony, kotrež wutworjam, swojim wobkedźbowankam přidać',
-'tog-watchdefault' => 'Strony, kotrež wobdźěłuju, swojim wobkedźbowankam přidać',
-'tog-watchmoves' => 'Sam přesunjene strony wobkedźbowankam přidać',
-'tog-watchdeletion' => 'Sam wušmórnjene strony wobkedźbowankam přidać',
+'tog-watchcreations' => 'Strony, kotrež wutworjam a dataje, kotrež nahrawam, swojim wobkedźbowankam přidać',
+'tog-watchdefault' => 'Strony a dataje, kotrež wobdźěłuju, swojim wobkedźbowankam přidać',
+'tog-watchmoves' => 'Sam přesunjene strony a dataje wobkedźbowankam přidać',
+'tog-watchdeletion' => 'Sam wušmórnjene strony a dataje wobkedźbowankam přidać',
 'tog-minordefault' => 'Wšě změny standardnje jako snadne woznamjenić',
 'tog-previewontop' => 'Přehlad před wobdźěłanskim polom pokazać',
 'tog-previewonfirst' => 'Při prěnim wobdźěłanju přehlad pokazać',
 'tog-nocache' => 'Pufrowanje stronow wobhladowaka znjemóžnić',
-'tog-enotifwatchlistpages' => 'E-mejlku pósłać, hdyž so strona z wobkedźbowankow změni',
+'tog-enotifwatchlistpages' => 'E-mejlku pósłać, hdyž so strona abo dataja z wobkedźbowankow změni',
 'tog-enotifusertalkpages' => 'E-mejlku pósłać, hdyž so moja wužiwarska diskusijna strona změni',
-'tog-enotifminoredits' => 'Tež dla snadnych změnow e-mejlki pósłać',
+'tog-enotifminoredits' => 'Tež za snadne změny stronow a datajow e-mejl pósłać',
 'tog-enotifrevealaddr' => 'Moju e-mejlowu adresu w e-mejlowych zdźělenkach wotkryć',
 'tog-shownumberswatching' => 'Ličbu wobkedźbowacych wužiwarjow pokazać',
 'tog-oldsig' => 'Eksistowaca signatura:',
@@ -194,7 +194,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Změny přizjewjenych wužiwarjow z wobkedźbowankow schować',
 'tog-watchlisthideanons' => 'Změny anonymnych wužiwarjow z wobkedźbowankow schować',
 'tog-watchlisthidepatrolled' => 'Dohladowane změny we wobkedźbowankach schować',
-'tog-nolangconversion' => 'Konwertowanje rěčnych wariantow znjemóžnić',
 'tog-ccmeonemails' => 'Mi kopije e-mejlkow pósłać, kotrež druhim wužiwarjam pósćelu',
 'tog-diffonly' => 'Jenož rozdźěle pokazać (nic pak zbytny wobsah)',
 'tog-showhiddencats' => 'Schowane kategorije pokazać',
@@ -325,7 +324,7 @@ $messages = array(
 'returnto' => 'Wróćo k stronje $1.',
 'tagline' => 'z {{GRAMMAR:genitiw|{{SITENAME}}}}',
 'help' => 'Pomoc',
-'search' => 'Pytać',
+'search' => 'pytać',
 'searchbutton' => 'Pytać',
 'go' => 'Pytać',
 'searcharticle' => 'Pytać',
@@ -417,6 +416,10 @@ $1',
 'youhavenewmessages' => 'Maš $1 ($2).',
 'newmessageslink' => 'nowe powěsće',
 'newmessagesdifflink' => 'poslednja změna',
+'youhavenewmessagesfromusers' => 'Maš $1 wot {{PLURAL:$3|druheho wužiwarja|$3 wužiwarjow|$3 wužiwarjow|$3 wužiwarjow}} ($2).',
+'youhavenewmessagesmanyusers' => 'Maš $1 wot wjele wužiwarjow ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|nowa powěsć|nowej powěsći|nowe powěsće|nowe powěsće}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|poslednja změna|poslednjej změnje|poslednje změny|poslednje změny}}',
 'youhavenewmessagesmulti' => 'Maš nowe powěsće: $1',
 'editsection' => 'wobdźěłać',
 'editold' => 'wobdźěłać',
@@ -470,9 +473,9 @@ Płaćiwe specialne strony hodźa so pod [[Special:SpecialPages|lisćinu special
 'databaseerror' => 'Zmylk w datowej bance',
 'dberrortext' => 'Syntaktiski zmylk při wotprašowanju datoweje banki.
 To móhło zmylk w programje być. Poslednje spytane wotprašenje w datowej bance běše:
-<blockquote><tt>$1</tt></blockquote>
-z funkcije "<tt>$2</tt>".
-Datowa banka wróći zmylk "tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+z funkcije "<code>$2</code>".
+Datowa banka wróći zmylk "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Syntaktiski zmylk je we wotprašowanju datoweje banki wustupił.
 Poslednje wotprašenje w datowej bance běše:
 "$1"
@@ -509,6 +512,8 @@ Zdźěl to prošu [[Special:ListUsers/sysop|admininistratorej]] podawajo wotpow
 'cannotdelete' => 'Strona abo dataja "$1" njeje so dała wušmórnyć.
 Móže być, zo je hižo wot někoho druheho wušmórnjena.',
 'cannotdelete-title' => 'Strona "$1" njehodźi so zhašeć',
+'delete-hook-aborted' => 'Zhašenje přez hoku přetorhnjene.
+Njeje žane wujasnjenje podała.',
 'badtitle' => 'Wopačny titul',
 'badtitletext' => 'Požadane mjeno strony běše njepłaćiwy, prózdny abo njekorektny titul z mjezyrěčneho abo interwikijoweho wotkaza. Snano wobsahuje jedne znamješko abo wjacore znamješka, kotrež w titulach dowolene njejsu.',
 'perfcached' => 'Slědowace daty pochadźeja z pufrowaka a njejsu snano cyle aktualne. Maksimalnje {{PLURAL:$1|jedyn wuslědk|$1 wuslědkaj|$1 wuslědki|$1 wuslědkow}} w pufrowaku k dispoziciji {{PLURAL:$1|steji|stejitej|steja|steji}}.',
@@ -540,6 +545,8 @@ Podata přičina je \'\'"$2"\'\'.',
 Administrator, kiž je jón zawrěł, je tule přičinu podał: "$3".',
 'invalidtitle-knownnamespace' => 'Njepłaćiwy titul z mjenowym rumom "$2" a tekstom "$3"',
 'invalidtitle-unknownnamespace' => 'Njepłaćiwy titul z njeznatym mjenowym rumom $1 a tekstom "$2"',
+'exception-nologin' => 'Njejsy přizjewjeny',
+'exception-nologin-text' => 'Tuta strona abo akcija sej wužaduje, zo sy na tutym wikiju přizjewjeny.',
 
 # Virus scanner
 'virus-badscanner' => "Špatna konfiguracija: Njeznaty wirusowy skener: ''$1''",
@@ -560,6 +567,7 @@ Twoje konto bu wutworjene. Njezabudź swoje nastajenja za [[Special:Preferences|
 '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:',
+'password-change-forbidden' => 'Njemóžeš hesła na tutym wikiju změnić.',
 'externaldberror' => 'Běše pak eksterny zmylk awtentifikacije datoweje banki, pak njesměš swoje eksterne konto aktualizować.',
 'login' => 'Přizjewić',
 'nav-login-createaccount' => 'Konto wutworić abo so přizjewić',
@@ -783,6 +791,10 @@ Hesło za tute nowe konto da so na stronje ''[[Special:ChangePassword|hesło zm
 'noarticletext' => 'Tuchwilu tuta strona žadyn tekst njewobsahuje. Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony na druhich stronach pytać]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} wotpowědne protokole pytać] abo [{{fullurl:{{FULLPAGENAME}}|action=edit}} tutu stronu wobdźěłać]</span>.',
 'noarticletext-nopermission' => 'Tuchwilu žadyn tekst na tutej stronje njeje.
 Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony]] na druhich stronach pytać abo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pytaj wotpowědne protokole]</span>.',
+'missing-revision' => 'Wersija #$1 strony z mjenom "{{PAGENAME}}" njeeksistuje.
+
+Přičina je zwjetša zestarjeny wotkaz w stawiznach k stronje, kotraž je so zhašała.
+Podrobnosće móžeš w  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wušmórnjenjow] namakać.',
 'userpage-userdoesnotexist' => 'Wužiwarske konto „$1“ njeje zregistrowane. Prošu pruwuj, hač chceš tutu stronu woprawdźe wutworić/wobdźěłać.',
 'userpage-userdoesnotexist-view' => 'Wužiwarske konto "$1" njeje zregistrowane.',
 'blocked-notice-logextract' => 'Tutón wužiwar je tuchwilu zablokowany. Najnowši protokolowy zapisk so deleka jako referenca podawa:',
@@ -790,7 +802,6 @@ Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony]] na druhich stronach
 * '''Firefox/Safari:''' Tłóč na ''Umsch'' kliknjo na ''Znowa'' abo tłóč ''Strg-F5'' abo ''Strg-R'' (''⌘-R'' na Macintosh);
 * '''Google Chrome:''' Tłóč na ''Strg-Umsch-R'' (''⌘-Umsch-R'' na Mac)
 * '''Internet Explorer:''' Dźěrź ''Strg'' tłóčeny kliknjo na ''Znowa,'' abo tłóč ''Strg-F5''.
-* '''Konqueror: '''Klikń na ''Znowa'' abo tłoč ''F5'';
 * '''Opera:''' Wuprózdń pufrowak w ''Extras → Einstellungen'';",
 'usercssyoucanpreview' => "'''Pokiw:''' Wužij tłóčku '{{int:showpreview}}', zo by swój nowy css do składowanja testował.",
 'userjsyoucanpreview' => "'''Pokiw:''' Wužij tłóčatko \"{{int:showpreview}}\", zo by swój nowy JavaScript do składowanja testował.",
@@ -904,6 +915,7 @@ Dyrbjała mjenje hač $2 {{PLURAL:$2|wołanje|wołanjej|wołanja|wołanjow}} mě
 'expansion-depth-exceeded-warning' => 'Strona je ekspansisku hłubokosć překročił',
 'parser-unstrip-loop-warning' => 'Njeskónčna sekla namakana',
 'parser-unstrip-recursion-limit' => 'Rekursiska hranica překročena ($1)',
+'converter-manual-rule-error' => 'Zmylk w manuelnym prawidle rěčneho konwertowanja namakany',
 
 # "Undo" feature
 'undo-success' => 'Wersija je so wuspěšnje wotstroniła. Prošu přepruwuj deleka w přirunanskim napohledźe, hač twoja změna bu přewzata a klikń potom na „Składować”, zo by změnu składował.',
@@ -1087,6 +1099,10 @@ Zawěsć, zo tuta změna stawiznisku kontinuitu strony wobchowuje.',
 'editundo' => 'cofnyć',
 'diff-multi' => '({{PLURAL:$1|Jedna mjezywersija|$1 mjezywersiji|$1 mjezywersije|$1 mjezywersijow}} wot {{PLURAL:$2|jednoho wužiwarja|$2 wužiwarjow|$2 wužiwarjow|$2 wužiwarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Jedna mjezywersija|$1 mjezywersiji|$1 mjezywersije|$1 mjezywersijow}} wot wjace hač {{PLURAL:$2|jednoho wužiwarja|$2 wužiwarjow|$2 wužiwarjow|$2 wužiwarjow}} {{PLURAL:$1|njepokazana|njepokazanej|njepokazane|njepokazane}})',
+'difference-missing-revision' => '{{PLURAL:$2|Jedna wersija|$2 wersiji|$2 wersije|$2 wersijow}} tutoho rozdźěla ($1) {{PLURAL:$2|njeje so namakała|njejstej so namakałoj|njejsu namakali|njeje so namakało}}.
+
+Přičina je zwjetša zestarjeny diferencny wotkaz k stronje, kotraž je so zhašała.
+Podrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wušmórnjenjow] namakać.',
 
 # Search results
 'searchresults' => 'Pytanske wuslědki',
@@ -1353,6 +1369,7 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'right-writeapi' => 'writeAPI wužiwać',
 'right-delete' => 'Strony zhašeć',
 'right-bigdelete' => 'Strony z dołhimi stawiznami zničić',
+'right-deletelogentry' => 'Jednotliwe protokolowe zapiski zhašeć a wobnowić',
 'right-deleterevision' => 'Jednotliwe wersije wušmórnyć a wobnowić',
 'right-deletedhistory' => 'Wušmórnjene zapiski stawiznow bjez přisłušneho teksta wobhladać',
 'right-deletedtext' => 'Wušmórnjeny tekst a změny mjez wušmórnjenymi wersijemi sej wobhladać',
@@ -1498,9 +1515,9 @@ Protokolej zhašenjow a přesunjenjow za tutu stronu stej tu k dobroćiwemu wuž
 Zo by prjedy nahrate dataje wobhladał abo pytał dźi k [[Special:FileList|lisćinje nahratych datajow]], nahraća so tež w [[Special:Log/upload|protokolu nahraćow]], wušmórnjenja  [[Special:Log/delete|protokolu wušmornjenjow]] protokoluja.
 
 Zo by dataju do strony zapřijał, wužij wotkaz w jednej ze slědowacych formow:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dataja.jpg]]</nowiki></tt>''', zo by połnu wersiju dataje wužiwał
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dataja.png|200px|thumb|left|alternatiwny tekst]]</nowiki></tt>''', zo by wobraz ze šěrokosću 200 pikselow do kašćika na lěwej kromje z alternatiwnym tekstom jako wopisanje wužiwał
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dataja.ogg]]</nowiki></tt>''' zo by direktnje k dataji wotkazał, bjeztoho zo by so dataja zwobrazniła",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dataja.jpg]]</nowiki></code>''', zo by połnu wersiju dataje wužiwał
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dataja.png|200px|thumb|left|alternatiwny tekst]]</nowiki></code>''', zo by wobraz ze šěrokosću 200 pikselow do kašćika na lěwej kromje z alternatiwnym tekstom jako wopisanje wužiwał
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dataja.ogg]]</nowiki></code>''' zo by direktnje k dataji wotkazał, bjeztoho zo by so dataja zwobrazniła",
 'upload-permitted' => 'Dowolene datajowe typy: $1.',
 'upload-preferred' => 'Preferowane datajowe typy: $1.',
 'upload-prohibited' => 'Zakazane datajowe typy: $1.',
@@ -1544,23 +1561,23 @@ Hlej [[Special:NewFiles|galeriju nowych datajow]] za wizuelny přehlad.',
 'largefileserver' => 'Dataja je wjetša hač serwer dowoluje.',
 'emptyfile' => 'Dataja, kotruž sy nahrał, zda so prózdna być. Z přičinu móhł pisanski zmylk w mjenje dataje być. Prošu pruwuj hač chceš ju woprawdźe nahrać.',
 'windows-nonascii-filename' => 'Tutón wiki datajowe mjena ze specialnymi znamješkami njepodpěruje.',
-'fileexists' => "Dataja z tutym mjenom hižo eksistuje.
+'fileexists' => 'Dataja z tutym mjenom hižo eksistuje.
 Jeli kliknješ na „Składować”, so wona přepisuje.
-Prošu pruwuj '''<tt>[[:$1]]</tt>''' jeli njejsy wěsty hač chceš ju změnić.
-[[$1|thumb]]",
-'filepageexists' => "Wopisanska strona za tutu dataju bu hižo pola '''<tt>[[:$1]]</tt>''' wutworjena,
+Prošu pruwuj <strong>[[:$1]]</strong> jeli njejsy wěsty hač chceš ju změnić.
+[[$1|thumb]]',
+'filepageexists' => 'Wopisanska strona za tutu dataju bu hižo pola <strong>[[:$1]]</strong> wutworjena,
 ale tuchwilu dataja z tutym mjenom njeeksistuje.
 Zjeće, kotrež zapodaš, njebudźe so na wopisanskej stronje jewić.
 Zo by so twoje zjeće tam jewiło, dyrbiš ju manuelnje wobdźěłać.
-[[$1|thumb]]",
-'fileexists-extension' => "Dataja z podobnym mjenom hižo eksistuje: [[$2|thumb]]
-* Mjeno dataje, kotruž chceš nahrać: '''<tt>[[:$1]]</tt>'''
-* Mjeno eksistowaceje dataje: '''<tt>[[:$2]]</tt>'''
-Prošu wubjer druhe mjeno.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Dataja z podobnym mjenom hižo eksistuje: [[$2|thumb]]
+* Mjeno dataje, kotruž chceš nahrać: <strong>[[:$1]]</strong>
+* Mjeno eksistowaceje dataje: <strong>[[:$2]]</strong>
+Prošu wubjer druhe mjeno.',
 'fileexists-thumbnail-yes' => "Dataja zda so minaturka ''(thumbnail)'' być. [[$1|thumb]]
-Prošu přepruwuj dataju '''<tt>[[:$1]]</tt>'''.
+Prošu přepruwuj dataju <strong>[[:$1]]</strong>.
 Jeli je to wobraz w originalnej wulkosći, njetrjebaš minaturku nahrać.",
-'file-thumbnail-no' => "Mjeno dataje započina so z '''<tt>$1</tt>'''. Zda so, zo to je wobraz z redukowanej wulkosću ''(thumbnail)'' pokazać.
+'file-thumbnail-no' => "Mjeno dataje započina so z <strong>$1</strong>. Zda so, zo to je wobraz z redukowanej wulkosću ''(thumbnail)'' pokazać.
 Jeli maš tutón wobraz z połnym rozeznaćom, nahraj tutón, hewak změń prošu datajowe mjeno.",
 'fileexists-forbidden' => 'Dataja z tutym mjenom hižo eksistuje a njeda so přepisać. Jeli hišće chceš swoju dataju nahrać, dźi  prošu wróćo a wuž nowe mjeno. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Dataja z tutym mjenom hižo eksistuje w zhromadnej chowarni. Jeli hišće chceš swoju dataju nahrać,  dźi prošu wróćo a wužij nowe mjeno. [[File:$1|thumb|center|$1]]',
@@ -1664,6 +1681,7 @@ $1',
 'lockmanager-fail-releaselock' => 'Zawěra za "$1" njeda so dopušćić.',
 'lockmanager-fail-db-bucket' => 'W zběrniku $1 njeda so dosć zawrjenskich datowych bankow kontaktować',
 'lockmanager-fail-db-release' => 'Zawěry na datowu banku $1 njedadźa so dopušćić',
+'lockmanager-fail-svr-acquire' => 'Zawěry na serwer $1 njehodźa so wotwołać.',
 'lockmanager-fail-svr-release' => 'Zawěry na serwer $1 njedadźa so dopušćić',
 
 # ZipDirectoryReader
@@ -1778,6 +1796,7 @@ Snano chceš wopisanje na jeje [$2 stronje datajoweho wopisanja] wobdźěłać.'
 'uploadnewversion-linktext' => 'nowu wersiju tuteje dataje nahrać',
 'shared-repo-from' => 'z $1',
 'shared-repo' => 'zhromadny repozitorij',
+'upload-disallowed-here' => 'Bohužel njemóžeš tutón wobraz přepisać.',
 
 # File reversion
 'filerevert' => 'Wersiju $1 cofnyć',
@@ -1811,7 +1830,7 @@ Snano chceš wopisanje na jeje [$2 stronje datajoweho wopisanja] wobdźěłać.'
 
 # MIME search
 'mimesearch' => 'Pytanje za typom MIME',
-'mimesearch-summary' => 'Na tutej specialnej stronje hodźa so dataje po typje MIME filtrować. Dyrbiš přeco typ MIME a podtyp zapodać: <tt>image/jpeg</tt> (hlej stronu z wopisanjom wobraza).',
+'mimesearch-summary' => 'Na tutej specialnej stronje hodźa so dataje po typje MIME filtrować. Dyrbiš přeco typ MIME a podtyp zapodać: <code>image/jpeg</code> (hlej stronu z wopisanjom wobraza).',
 'mimetype' => 'Typ MIME:',
 'download' => 'Sćahnyć',
 
@@ -1857,7 +1876,7 @@ Snano chceš wopisanje na jeje [$2 stronje datajoweho wopisanja] wobdźěłać.'
 
 'disambiguations' => 'Strony, kotrež na strony wjacezmyslnosće wotkazuja',
 'disambiguationspage' => 'Template:Wjacezmyslnosć',
-'disambiguations-text' => "Slědowace strony na '''rozjasnjenje wjacezmyslnosće''' wotkazuja. Měli město toho na poprawnu stronu wotkazać.<br />Strona so jako rozjasnjenje wjacezmyslnosće zarjaduje, jeli předłohu wužiwa, na kotruž so wot [[MediaWiki:Disambiguationspage]] wotkazuje.",
+'disambiguations-text' => "Slědowace strony wobsahuja znajmjeńša jedyn wotkaz k stronje '''rozjasnjenja wjacezmyslnosće'''. Měli město toho na poprawnu stronu wotkazać.<br />Maja stronu za stronu rozjasnjenja wjacezmyslnosće, jeli předłohu wužiwa, na kotruž so wot [[MediaWiki:Disambiguationspage]] wotkazuje.",
 
 'doubleredirects' => 'Dwójne daleposrědkowanja',
 'doubleredirectstext' => 'Tuta strona nalistuje strony, kotrež k druhim daleposrědkowanskim stronam dale posrědkuja.
@@ -1881,6 +1900,7 @@ Kóžda rjadka wobsahuje wotkazy k prěnjemu a druhemu daleposrědkowanju kaž t
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}}',
 'ncategories' => '$1 {{PLURAL:$1|jedna kategorija|kategoriji|kategorije|kategorijow}}',
+'ninterwikis' => '$1 {{PLURAL:$1|mjezyrěčny wotkaz|mjezyrěčnej wotkazaj|mjezyrěčne wotkazy|mjezyrěčnych wotkazow}}',
 'nlinks' => '$1 {{PLURAL:$1|wotkaz|wotkazaj|wotkazy|wotkazow}}',
 'nmembers' => '{{PLURAL:$1|$1 čłon|$1 čłonaj|$1 čłony|$1 čłonow}}',
 'nrevisions' => '$1 {{PLURAL:$1|wobdźěłanje|wobdźěłani|wobdźěłanja|wobdźěłanjow}}',
@@ -1909,6 +1929,7 @@ Kóžda rjadka wobsahuje wotkazy k prěnjemu a druhemu daleposrědkowanju kaž t
 'mostlinkedtemplates' => 'Najhusćišo wužiwane předłohi',
 'mostcategories' => 'Strony z najwjace kategorijemi',
 'mostimages' => 'Z najwjace stronami zwjazane dataje',
+'mostinterwikis' => 'Strony z najwjace mjezyrěčnymi wotkazami',
 'mostrevisions' => 'Nastawki z najwjace wersijemi',
 'prefixindex' => 'Wšě strony z prefiksom',
 'prefixindex-namespace' => 'Wšě strony z prefiksom (mjenowy rum $1)',
@@ -2007,7 +2028,7 @@ Hlej tež [[Special:WantedCategories|požadane kategorije]].',
 'linksearch-ok' => 'Pytać',
 'linksearch-text' => 'Zastupniske znamješka kaž "*.wikipedia.org" móža so wužiwać.
 Znajmjeńša hłowna domena je trěbna, na přikład "*.org".<br />
-Podpěrowane protokole: <tt>$1</tt> (prošu njepodaj je w swojim pytanje).',
+Podpěrowane protokole: <code>$1</code> (prošu njepodaj je w swojim pytanje).',
 'linksearch-line' => '$1 je z $2 wotkazany.',
 'linksearch-error' => 'Zastupniske znamjenja dadźa so jenož na spočatku URL wužiwać.',
 
@@ -2052,6 +2073,8 @@ Podpěrowane protokole: <tt>$1</tt> (prošu njepodaj je w swojim pytanje).',
 'mailnologin' => 'Njejsy přizjewjeny.',
 'mailnologintext' => 'Dyrbiš [[Special:UserLogin|přizjewjeny]] być a płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] měć, zo by druhim wužiwarjam mejlki pósłać móhł.',
 'emailuser' => 'Wužiwarjej mejlku pósłać',
+'emailuser-title-target' => 'E-mejl na {{GENDER:$1|tutomu wužiwarjej|tutej wužiwarce}} pósłać',
+'emailuser-title-notarget' => 'Wužiwarjej mejlku pósłać',
 'emailpage' => 'Wužiwarjej mejlku pósłać',
 'emailpagetext' => 'Móžeš slědowacy formular wužiwać, zo by tutomu wužiwarjej e-mejlku pósłał.
 E-mejlowa adresa, kotruž sy w [[Special:Preferences|swojich wužiwarskich nastajenjach]] zapodał, zjewi so jako adresa "Wot" e-mejlki, tak zo přijimowar móže ći direktnje wotmołwić.',
@@ -2112,7 +2135,7 @@ Jeli chceš stronu pozdźišo ze swojich wobkedźbowankow wotstronić, klikń na
 'watchmethod-list' => 'Wobkedźbowanki za aktualnymi změnami přepruwować',
 'watchlistcontains' => 'Maš $1 {{PLURAL:$1|stronu|stronje|strony|stronow}} w swojich wobkedźbowankach.',
 'iteminvalidname' => 'Problem ze zapiskom „$1“, njepłaćiwe mjeno.',
-'wlnote' => "Deleka {{PLURAL:$1|je '''1''' změna|stej poslednjej '''$1''' změnje|su poslednje '''$1''' změny|je poslednich '''$1''' změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje '''$2''' hodźinje|poslednje '''$2''' hodźiny|poslednje '''$2''' hodźin}}, staw : $3, $4.",
+'wlnote' => "Deleka {{PLURAL:$1|je poslednja změna|stej poslednjej '''$1''' změnje|su poslednje '''$1''' změny|je poslednich '''$1''' změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje '''$2''' hodźinje|poslednje '''$2''' hodźiny|poslednje '''$2''' hodźin}}, staw : $3, $4.",
 'wlshowlast' => 'Poslednje $1 hodź. - $2 dnjow - $3 pokazać',
 'watchlist-options' => 'Opcije wobkedźbowankow',
 
@@ -2197,6 +2220,8 @@ Prošu potwjerdź, zo maš wotpohlad to činić, zo rozumiš sćěwki a zo to wo
 'rollback' => 'Změny cofnyć',
 'rollback_short' => 'Cofnyć',
 'rollbacklink' => 'Cofnyć',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|změnu|změnje|změny|změnow}} cofnyć',
+'rollbacklinkcount-morethan' => 'přez $1 {{PLURAL:$1|změnu|změnje|změny|změnow}} cofnyć',
 'rollbackfailed' => 'Cofnjenje njeporadźiło',
 'cantrollback' => 'Njemóžno změnu cofnyć; strona nima druhich awtorow.',
 'alreadyrolled' => 'Njemóžno poslednu změnu [[:$1]] přez wužiwarja [[User:$2|$2]] ([[User talk:$2|Diskusija]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) cofnyć; něchtó druhi je stronu wobdźěłał abo změnu hižo cofnył.
@@ -2662,6 +2687,7 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'import-interwiki-templates' => 'Wšě předłohi zapřijeć',
 'import-interwiki-submit' => 'Importować',
 'import-interwiki-namespace' => 'Cilowy mjenowy rum:',
+'import-interwiki-rootpage' => 'Cilowa korjenjowa strona (opcionalna):',
 'import-upload-filename' => 'Datajowe mjeno:',
 'import-comment' => 'Přičina:',
 'importtext' => 'Prošu eksportuj dataju ze žórłoweho wikija z pomocu funkcije [[Special:Export|Strony eksportować]]. Składuj ju na swojim ličaku a nahraj ju tu.',
@@ -2693,6 +2719,9 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'import-error-interwiki' => 'Strona "$1" so njeimportuje, dokelž jeje mjeno je za eksterne wotkazowanje (interwiki) wuměnjene.',
 'import-error-special' => 'Strona "$1" so njeimportuje, dokelž k wosebitemu mjenowemu rumej słuša, kotryž strony njedowola.',
 'import-error-invalid' => 'Strona "$1" so njeimportuje, dokelž jeje mjeno je njepłaćiwe.',
+'import-options-wrong' => '{{PLURAL:$2|Wopačna opcija|Wopačnej opciji|Wopačne opcije|Wopačne opcije}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Podata korjenjowa strona je njepłaćiwa.',
+'import-rootpage-nosubpage' => 'Mjenowy rum "$1" korjenjoweje strony njedowola podstrony.',
 
 # Import log
 'importlogpage' => 'Protokol importow',
@@ -2816,16 +2845,35 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 
 # Info page
 'pageinfo-title' => 'Informacije za stronu "$1"',
-'pageinfo-header-edits' => 'Změny',
-'pageinfo-header-watchlist' => 'Wobkedźbowanki',
-'pageinfo-header-views' => 'Zwobraznjenja',
-'pageinfo-subjectpage' => 'Strona',
-'pageinfo-talkpage' => 'Diskusijna strona',
-'pageinfo-watchers' => 'Ličba wobkedźbowarjow',
-'pageinfo-edits' => 'Ličba změnow',
-'pageinfo-authors' => 'Ličba rozdźělnych awtorow',
+'pageinfo-header-basic' => 'Zakładne informacije',
+'pageinfo-header-edits' => 'Stawizny wobdźěłać',
+'pageinfo-header-restrictions' => 'Škit strony',
+'pageinfo-header-properties' => 'Kajkosće strony',
+'pageinfo-display-title' => 'Zwobraznjenski titul',
+'pageinfo-default-sort' => 'Standardny sortěrowanski kluč',
+'pageinfo-length' => 'Dołhosć strony (w bajtach)',
+'pageinfo-article-id' => 'ID strony',
+'pageinfo-robot-policy' => 'Status pytawy',
+'pageinfo-robot-index' => 'Indeksujomny',
+'pageinfo-robot-noindex' => 'Njeindeksujomny',
 'pageinfo-views' => 'Ličba zwobraznjenjow',
-'pageinfo-viewsperedit' => 'Zwobraznjenja na změnu',
+'pageinfo-watchers' => 'Ličba wobkedźbowarjow strony',
+'pageinfo-redirects-name' => 'Dalesposrědkowanja k tutej stronje',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Podstrony tuteje strony',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|dalesposrědkowanje|dalesposrědkowani|dalesposrědkowanja|dalesposrědkowanjow}}; $3 {{PLURAL:$3|njedalesposrědkowanje|njedalesposrědkowani|njedalesposrědkowanja|njedalesposrědkowanjow}})',
+'pageinfo-firstuser' => 'Awtor strony',
+'pageinfo-firsttime' => 'Datum wutworjenja strony',
+'pageinfo-lastuser' => 'Posledni wobdźěłar',
+'pageinfo-lasttime' => 'Datum poslednjeje změny',
+'pageinfo-edits' => 'Cyłkowna ličba změnow',
+'pageinfo-authors' => 'Cyłkowna ličba rozdźělnych awtorow',
+'pageinfo-recent-edits' => 'Ličba najnowšich změnow (za zańdźenych $1)',
+'pageinfo-recent-authors' => 'Najnowša ličba rozdźělnych awtorow',
+'pageinfo-restriction' => 'Škit strony (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magiske słowo|Magiskej słowje|Magiske słowa|Magiske słowa}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Zapřijata předłoha|Zapřijatej předłoze|Zapřijate předłohi|Zapřijate předłohi}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Klasiski',
@@ -2879,6 +2927,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 pikselow, wulkosć dataje: $3, MIME-typ: $4, $5 {{PLURAL:$5|strona|stronje|strony|stronow}}',
 'file-nohires' => 'Za tutu dataju žane wyše rozeznaće njeje.',
 'svg-long-desc' => 'SVG-dataja, zakładna wulkosć: $1 × $2 pikselow, datajowa wulkosć: $3',
+'svg-long-desc-animated' => 'Animěrowana SVG-dataja, zakładnej wotměraj $1 × $2 pikselow, datajowa wulkosć: $3',
 'show-big-image' => 'Wersija z wyšim rozeznaćom',
 'show-big-image-preview' => 'Wulkosć tutoho přehlada: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Druhe rozeznaće|Druhej rozeznaći|Druhe rozeznaća|Druhe rozeznaća}}: $1.',
@@ -2888,6 +2937,8 @@ $1',
 'file-info-png-looped' => 'Sekla',
 'file-info-png-repeat' => '{{PLURAL:$1|$1 raz|dwójce|$1 razy|$1 razow}} wotehrata',
 'file-info-png-frames' => '$1 {{PLURAL:$1|wobłuk|wobłukaj|wobłuki|wobłukow}}',
+'file-no-thumb-animation' => "'''Kedźbu: Techniskich wobmjezowanjow dla přehladne wobrazki tuteje dataje so njeaniměruja.'''",
+'file-no-thumb-animation-gif' => "'''Kedźbu: Techniskich wobmjezowanjow dla přehladne wobrazki wysokeho rozeznaća GIF-wobrazow kaž tutoho njebudu so animěrować.'''",
 
 # Special:NewFiles
 'newimages' => 'Nowe dataje',
@@ -3544,7 +3595,7 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
 * <span class="mw-specialpagecached">Specialne strony z pufrowaka (móža zestarjene być).</span>',
 'specialpages-group-maintenance' => 'Hladanske lisćiny',
 'specialpages-group-other' => 'Druhe specialne strony',
-'specialpages-group-login' => 'Přizjewjenje',
+'specialpages-group-login' => 'Přizjewić/Konto załožić',
 'specialpages-group-changes' => 'Poslednje změny a protokole',
 'specialpages-group-media' => 'Medije',
 'specialpages-group-users' => 'Wužiwarjo a prawa',
@@ -3678,9 +3729,12 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
 'api-error-empty-file' => 'Dataja, kotruž sy nahrał, je prózdna.',
 'api-error-emptypage' => 'Wutworjenje nowych, prózdnych stronow njeje dowolene.',
 'api-error-fetchfileerror' => 'Nutřkowny zmylk: při wobstarowanju dataje je so něšto nimokuliło.',
+'api-error-fileexists-forbidden' => 'Dataja z mjenom "$1" hižo eksistuje, a njeda so přepisać.',
+'api-error-fileexists-shared-forbidden' => 'Dataja z mjenom "$1" hižo eksistuje w zhromadnym datajowym repozitoriju a njeda so přepisać.',
 'api-error-file-too-large' => 'Dataja, kotruž sy nahrał, bě přewulka.',
 'api-error-filename-tooshort' => 'Datajowe mjeno překrótko',
 'api-error-filetype-banned' => 'Tutón datajowy typ je zawrjeny.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|dowoleny datajowy typ njeje|dowolenej datajowej typaj njejstej|dowolene datajowe typy njejsu|dowolene datajowe typy njejsu}}. {{PLURAL:$3|Dowoleny datajowy typ je|Dowolenej datajowej typaj stej|Dowolene datajowe typy su|Dowolene datajowe typy su}} $2.',
 'api-error-filetype-missing' => 'Dataja nima datajowu kóncowku.',
 'api-error-hookaborted' => 'Změna, kotruž pospytowaše přewjesć, bu přez rozšěrjensku hoku přetorhnjena.',
 'api-error-http' => 'Nutřkowny zmylk: Zwisk ze serwerom njemóžno.',
index c507c68..6832d26 100644 (file)
@@ -29,6 +29,7 @@
  * @author R-Joe
  * @author Samat
  * @author Sucy
+ * @author TK-999
  * @author Terik
  * @author Tgr
  * @author Xbspiro
@@ -184,128 +185,128 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ÁTIRÁNYÍTÁS', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__NINCSTARTALOMJEGYZÉK__', '__NINCSTJ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__NINCSGALÉRIA__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__LEGYENTARTALOMJEGYZÉK__', '__LEGYENTJ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__TARTALOMJEGYZÉK__', '__TJ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__NINCSSZERKESZTÉS__', '__NINCSSZERK__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'HÓNAP', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'HÓNAP1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'HÓNAPNEVE', 'CURRENTMONTHNAME' ),
-       'currentmonthabbrev'      => array( '1', 'HÓNAPRÖVID', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'MAINAP', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'MAINAP2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'MAINAPNEVE', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ÉV', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'IDŐ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ÓRA', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'HELYIHÓNAP', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'HELYIHÓNAP1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'HELYIHÓNAPNÉV', 'LOCALMONTHNAME' ),
-       'localmonthabbrev'        => array( '1', 'HELYIHÓNAPRÖVIDÍTÉS', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'HELYINAP', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'HELYINAP2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'HELYINAPNEVE', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'HELYIÉV', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'HELYIIDŐ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'HELYIÓRA', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'OLDALAKSZÁMA', 'LAPOKSZÁMA', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'SZÓCIKKEKSZÁMA', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'FÁJLOKSZÁMA', 'KÉPEKSZÁMA', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'SZERKESZTŐKSZÁMA', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'AKTÍVSZERKESZTŐKSZÁMA', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'SZERKESZTÉSEKSZÁMA', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'MEGTEKINTÉSEKSZÁMA', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'OLDALNEVE', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'OLDALNEVEE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NÉVTERE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NÉVTEREE', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'VITATERE', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'VITATEREE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'SZÓCIKKNÉVTERE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'SZÓCIKKNÉVTEREE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'LAPTELJESNEVE', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'LAPTELJESNEVEE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ALLAPNEVE', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ALLAPNEVEE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'ALAPLAPNEVE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'ALAPLAPNEVEE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'VITALAPNEVE', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'VITALAPNEVEE', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'SZÓCIKKNEVE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'SZÓCIKKNEVEE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'ÜZENET:', 'ÜZ:', 'MSG:' ),
-       'subst'                   => array( '0', 'BEILLESZT:', 'BEMÁSOL:', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'bélyegkép', 'bélyeg', 'miniatűr', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'bélyegkép=$1', 'bélyeg=$1', 'miniatűr=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'jobb', 'jobbra', 'right' ),
-       'img_left'                => array( '1', 'bal', 'balra', 'left' ),
-       'img_none'                => array( '1', 'semmi', 'none' ),
-       'img_center'              => array( '1', 'közép', 'középre', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'keretezett', 'keretes', 'keretben', 'kerettel', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'keretnélküli', 'frameless' ),
-       'img_page'                => array( '1', 'oldal=$1', 'oldal $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'fennjobbra', 'fennjobbra=$1', 'fennjobbra $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'keret', 'border' ),
-       'img_baseline'            => array( '1', 'alapvonal', 'baseline' ),
-       'img_sub'                 => array( '1', 'ai', 'alsóindex', 'sub' ),
-       'img_super'               => array( '1', 'fi', 'felsőindex', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'fenn', 'fent', 'top' ),
-       'img_text_top'            => array( '1', 'szöveg-fenn', 'szöveg-fent', 'text-top' ),
-       'img_middle'              => array( '1', 'vközépen', 'vközépre', 'middle' ),
-       'img_bottom'              => array( '1', 'lenn', 'lent', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'szöveg-lenn', 'szöveg-lent', 'text-bottom' ),
-       'sitename'                => array( '1', 'WIKINEVE', 'SITENAME' ),
-       'ns'                      => array( '0', 'NÉVTÉR:', 'NS:' ),
-       'localurl'                => array( '0', 'HELYIURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'HELYIURLE:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'SZERVER', 'KISZOLGÁLÓ', 'SERVER' ),
-       'servername'              => array( '0', 'SZERVERNEVE', 'KISZOLGÁLÓNEVE', 'SERVERNAME' ),
-       'grammar'                 => array( '0', 'NYELVTAN:', 'GRAMMAR:' ),
-       'currentweek'             => array( '1', 'HÉT', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'HÉTNAPJA', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'HELYIHÉT', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'HELYIHÉTNAPJA', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'VÁLTOZATAZON', 'VÁLTOZATAZONOSÍTÓ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'VÁLTOZATNAPJA', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'VÁLTOZATNAPJA2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'VÁLTOZATHÓNAPJA', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'VÁLTOZATÉVE', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'VÁLTOZATIDŐBÉLYEG', 'VÁLTOZATIDEJE', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'VÁLTOZATSZERKESZTŐJE', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'TÖBBESSZÁM:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'TELJESURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'TELJESURLE:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'KISKEZDŐ:', 'KISKEZDŐBETŰ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'NAGYKEZDŐ:', 'NAGYKEZDŐBETŰ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'KISBETŰ:', 'KISBETŰK:', 'KB:', 'KISBETŰS:', 'LC:' ),
-       'uc'                      => array( '0', 'NAGYBETŰ:', 'NAGYBETŰK', 'NB:', 'NAGYBETŰS:', 'UC:' ),
-       'displaytitle'            => array( '1', 'MEGJELENÍTENDŐCÍM', 'CÍM', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__ÚJSZAKASZHIV__', '__ÚJSZAKASZLINK__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__NINCSÚJSZAKASZHIV__', '__NINCSÚJSZAKASZLINK__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'JELENLEGIVÁLTOZAT', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'URLKÓDOLVA:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'HORGONYKÓDOLVA', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'IDŐBÉLYEG', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'HELYIIDŐBÉLYEG', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'IRÁNYJELZŐ', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#NYELV:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'TARTALOMNYELVE', 'TARTNYELVE', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'OLDALAKNÉVTÉRBEN:', 'OLDALAKNBEN:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ADMINOKSZÁMA', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMÁZOTTSZÁM', 'SZÁMFORMÁZÁS', 'SZÁMFORM', 'FORMATNUM' ),
-       'special'                 => array( '0', 'speciális', 'special' ),
-       'defaultsort'             => array( '1', 'RENDEZÉS:', 'KULCS:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ELÉRÉSIÚT:', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__REJTETTKAT__', '__REJTETTKATEGÓRIA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'LAPOKAKATEGÓRIÁBAN', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'LAPMÉRET', 'PAGESIZE' ),
-       'noindex'                 => array( '1', '__NINCSINDEX__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'CSOPORTTAGOK', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__ÁLLANDÓÁTIRÁNYÍTÁS__', '__STATIKUSÁTIRÁNYÍTÁS__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'VÉDELMISZINT', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'dátumformázás', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#ÁTIRÁNYÍTÁS', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__NINCSTARTALOMJEGYZÉK__', '__NINCSTJ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__NINCSGALÉRIA__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__LEGYENTARTALOMJEGYZÉK__', '__LEGYENTJ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__TARTALOMJEGYZÉK__', '__TJ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__NINCSSZERKESZTÉS__', '__NINCSSZERK__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'HÓNAP', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'HÓNAP1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'HÓNAPNEVE', 'CURRENTMONTHNAME' ),
+       'currentmonthabbrev'        => array( '1', 'HÓNAPRÖVID', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'MAINAP', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'MAINAP2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'MAINAPNEVE', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ÉV', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'IDŐ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ÓRA', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'HELYIHÓNAP', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'HELYIHÓNAP1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'HELYIHÓNAPNÉV', 'LOCALMONTHNAME' ),
+       'localmonthabbrev'          => array( '1', 'HELYIHÓNAPRÖVIDÍTÉS', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'HELYINAP', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'HELYINAP2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'HELYINAPNEVE', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'HELYIÉV', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'HELYIIDŐ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'HELYIÓRA', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'OLDALAKSZÁMA', 'LAPOKSZÁMA', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'SZÓCIKKEKSZÁMA', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'FÁJLOKSZÁMA', 'KÉPEKSZÁMA', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'SZERKESZTŐKSZÁMA', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'AKTÍVSZERKESZTŐKSZÁMA', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'SZERKESZTÉSEKSZÁMA', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'MEGTEKINTÉSEKSZÁMA', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'OLDALNEVE', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'OLDALNEVEE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NÉVTERE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NÉVTEREE', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'VITATERE', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'VITATEREE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'SZÓCIKKNÉVTERE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'SZÓCIKKNÉVTEREE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'LAPTELJESNEVE', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'LAPTELJESNEVEE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ALLAPNEVE', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ALLAPNEVEE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'ALAPLAPNEVE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'ALAPLAPNEVEE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'VITALAPNEVE', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'VITALAPNEVEE', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'SZÓCIKKNEVE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'SZÓCIKKNEVEE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'ÜZENET:', 'ÜZ:', 'MSG:' ),
+       'subst'                     => array( '0', 'BEILLESZT:', 'BEMÁSOL:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'bélyegkép', 'bélyeg', 'miniatűr', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'bélyegkép=$1', 'bélyeg=$1', 'miniatűr=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'jobb', 'jobbra', 'right' ),
+       'img_left'                  => array( '1', 'bal', 'balra', 'left' ),
+       'img_none'                  => array( '1', 'semmi', 'none' ),
+       'img_center'                => array( '1', 'közép', 'középre', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'keretezett', 'keretes', 'keretben', 'kerettel', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'keretnélküli', 'frameless' ),
+       'img_page'                  => array( '1', 'oldal=$1', 'oldal $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'fennjobbra', 'fennjobbra=$1', 'fennjobbra $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'keret', 'border' ),
+       'img_baseline'              => array( '1', 'alapvonal', 'baseline' ),
+       'img_sub'                   => array( '1', 'ai', 'alsóindex', 'sub' ),
+       'img_super'                 => array( '1', 'fi', 'felsőindex', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'fenn', 'fent', 'top' ),
+       'img_text_top'              => array( '1', 'szöveg-fenn', 'szöveg-fent', 'text-top' ),
+       'img_middle'                => array( '1', 'vközépen', 'vközépre', 'middle' ),
+       'img_bottom'                => array( '1', 'lenn', 'lent', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'szöveg-lenn', 'szöveg-lent', 'text-bottom' ),
+       'sitename'                  => array( '1', 'WIKINEVE', 'SITENAME' ),
+       'ns'                        => array( '0', 'NÉVTÉR:', 'NS:' ),
+       'localurl'                  => array( '0', 'HELYIURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'HELYIURLE:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'SZERVER', 'KISZOLGÁLÓ', 'SERVER' ),
+       'servername'                => array( '0', 'SZERVERNEVE', 'KISZOLGÁLÓNEVE', 'SERVERNAME' ),
+       'grammar'                   => array( '0', 'NYELVTAN:', 'GRAMMAR:' ),
+       'currentweek'               => array( '1', 'HÉT', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'HÉTNAPJA', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'HELYIHÉT', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'HELYIHÉTNAPJA', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'VÁLTOZATAZON', 'VÁLTOZATAZONOSÍTÓ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'VÁLTOZATNAPJA', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'VÁLTOZATNAPJA2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'VÁLTOZATHÓNAPJA', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'VÁLTOZATÉVE', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'VÁLTOZATIDŐBÉLYEG', 'VÁLTOZATIDEJE', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'VÁLTOZATSZERKESZTŐJE', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'TÖBBESSZÁM:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'TELJESURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'TELJESURLE:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'KISKEZDŐ:', 'KISKEZDŐBETŰ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'NAGYKEZDŐ:', 'NAGYKEZDŐBETŰ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'KISBETŰ:', 'KISBETŰK:', 'KB:', 'KISBETŰS:', 'LC:' ),
+       'uc'                        => array( '0', 'NAGYBETŰ:', 'NAGYBETŰK', 'NB:', 'NAGYBETŰS:', 'UC:' ),
+       'displaytitle'              => array( '1', 'MEGJELENÍTENDŐCÍM', 'CÍM', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__ÚJSZAKASZHIV__', '__ÚJSZAKASZLINK__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__NINCSÚJSZAKASZHIV__', '__NINCSÚJSZAKASZLINK__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'JELENLEGIVÁLTOZAT', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'URLKÓDOLVA:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'HORGONYKÓDOLVA', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'IDŐBÉLYEG', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'HELYIIDŐBÉLYEG', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'IRÁNYJELZŐ', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#NYELV:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'TARTALOMNYELVE', 'TARTNYELVE', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'OLDALAKNÉVTÉRBEN:', 'OLDALAKNBEN:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ADMINOKSZÁMA', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMÁZOTTSZÁM', 'SZÁMFORMÁZÁS', 'SZÁMFORM', 'FORMATNUM' ),
+       'special'                   => array( '0', 'speciális', 'special' ),
+       'defaultsort'               => array( '1', 'RENDEZÉS:', 'KULCS:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ELÉRÉSIÚT:', 'FILEPATH:' ),
+       'hiddencat'                 => array( '1', '__REJTETTKAT__', '__REJTETTKATEGÓRIA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'LAPOKAKATEGÓRIÁBAN', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'LAPMÉRET', 'PAGESIZE' ),
+       'noindex'                   => array( '1', '__NINCSINDEX__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'CSOPORTTAGOK', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__ÁLLANDÓÁTIRÁNYÍTÁS__', '__STATIKUSÁTIRÁNYÍTÁS__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'VÉDELMISZINT', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'dátumformázás', 'formatdate', 'dateformat' ),
 );
 
 $linkTrail = '/^([a-záéíóúöüőűÁÉÍÓÚÖÜŐŰ]+)(.*)$/sDu';
@@ -313,12 +314,12 @@ $linkTrail = '/^([a-záéíóúöüőűÁÉÍÓÚÖÜŐŰ]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Hivatkozások aláhúzása:',
-'tog-justify' => 'Sorkizárt fejezetek',
+'tog-justify' => 'Bekezdések sorkizárása',
 'tog-hideminor' => 'Apró változtatások elrejtése a friss változtatások lapon',
 'tog-hidepatrolled' => 'Az ellenőrzött szerkesztések elrejtése a friss változtatások lapon',
 'tog-newpageshidepatrolled' => 'Ellenőrzött lapok elrejtése az új lapok listájáról',
 'tog-extendwatchlist' => 'A figyelőlistán az összes változtatás látszódjon, ne csak az utolsó',
-'tog-usenewrc' => 'Fejlettebb friss változások listája (JavaScript-alapú)',
+'tog-usenewrc' => 'Fejlettebb friss változások használata (JavaScript-alapú)',
 'tog-numberheadings' => 'Fejezetcímek automatikus számozása',
 'tog-showtoolbar' => 'Szerkesztőeszközsor megjelenítése (JavaScript-alapú)',
 'tog-editondblclick' => 'A lapok szerkesztése dupla kattintásra (JavaScript-alapú)',
@@ -334,9 +335,9 @@ $messages = array(
 'tog-previewontop' => 'Előnézet megjelenítése a szerkesztőablak előtt',
 'tog-previewonfirst' => 'Előnézet első szerkesztésnél',
 'tog-nocache' => 'A lapok gyorstárazásának letiltása a böngészőben',
-'tog-enotifwatchlistpages' => 'Kapjak értesítést e-mailben, ha egy általam figyelt lap megváltozik',
+'tog-enotifwatchlistpages' => 'Kapjak értesítést e-mailben, ha egy általam figyelt lap vagy fájl megváltozik',
 'tog-enotifusertalkpages' => 'Kapjak értesítést e-mailben, ha megváltozik a vitalapom',
-'tog-enotifminoredits' => 'Kapjak értesítést e-mailben a lapok apró változtatásairól',
+'tog-enotifminoredits' => 'Kapjak értesítést e-mailben a lapok és fájlok apró változtatásairól',
 'tog-enotifrevealaddr' => 'Jelenjen meg az e-mail címem a figyelmeztető e-mailekben',
 'tog-shownumberswatching' => 'A lapot figyelő szerkesztők számának megjelenítése',
 'tog-oldsig' => 'A jelenlegi aláírás:',
@@ -352,7 +353,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Bejelentkezett szerkesztők módosításainak elrejtése a figyelőlistáról',
 'tog-watchlisthideanons' => 'Névtelen szerkesztések elrejtése',
 'tog-watchlisthidepatrolled' => 'Az ellenőrzött szerkesztések elrejtése',
-'tog-nolangconversion' => 'Nyelvvariánsok közötti átalakítás letiltása',
 'tog-ccmeonemails' => 'A másoknak küldött e-mailjeimről kapjak én is másolatot',
 'tog-diffonly' => 'Ne mutassa a lap tartalmát lapváltozatok közötti eltérések megtekintésekor',
 'tog-showhiddencats' => 'Rejtett kategóriák megjelenítése',
@@ -382,7 +382,7 @@ $messages = array(
 'tue' => 'kedd',
 'wed' => 'sze',
 'thu' => 'csü',
-'fri' => 'pé',
+'fri' => 'pén',
 'sat' => 'szo',
 'january' => 'január',
 'february' => 'február',
@@ -431,7 +431,7 @@ $messages = array(
 'hidden-category-category' => 'Rejtett kategóriák',
 'category-subcat-count' => "''{{PLURAL:$2|Ennek a kategóriának csak egyetlen alkategóriája van.|Ez a kategória az alábbi {{PLURAL:$1|alkategóriával|$1 alkategóriával}} rendelkezik (összesen $2 alkategóriája van).}}''",
 'category-subcat-count-limited' => 'Ebben a kategóriában {{PLURAL:$1|egy|$1}} alkategória található.',
-'category-article-count' => '{{PLURAL:$2|Csak a következő lap található ebben a kategóriában:|Az összesen $2 lapból a következő $1-t listázza ez a kategóriaoldal, a többi a további oldalakon található.}}',
+'category-article-count' => '{{PLURAL:$2|A kategóriában csak a következő lap található.|A következő $1 lap található a kategóriában, összesen $2 lapból.}}',
 'category-article-count-limited' => 'Ebben a kategóriában a következő {{PLURAL:$1|lap|$1 lap}} található:',
 'category-file-count' => '{{PLURAL:$2|Csak a következő fájl található ebben a kategóriában.|Az összesen $2 fájlból a következő $1-t listázza ez a kategórialap, a többi a további oldalakon található.}}',
 'category-file-count-limited' => 'Ebben a kategóriában {{PLURAL:$1|egy|$1}} fájl található.',
@@ -576,6 +576,9 @@ További információkat a [[Special:Version|verzióinformációs lapon]] talál
 'youhavenewmessages' => 'Új üzenet vár $1! (Az üzenetet $2.)',
 'newmessageslink' => 'a vitalapodon',
 'newmessagesdifflink' => 'külön is megtekintheted',
+'youhavenewmessagesmanyusers' => '$1ed van több szerkesztőtől ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|egy|$1}} új üzenet',
+'newmessagesdifflinkplural' => 'utolsó {{PLURAL:$1|egy|$1}} változtatás',
 'youhavenewmessagesmulti' => 'Új üzenetet vár a(z) $1 wikin',
 'editsection' => 'szerkesztés',
 'editold' => 'szerkesztés',
@@ -630,9 +633,9 @@ Az érvényes speciális lapok listáját a [[Special:SpecialPages|{{int:special
 'databaseerror' => 'Adatbázishiba',
 'dberrortext' => 'Szintaktikai hiba található az adatbázis-lekérdezésben.
 Ezt szoftverhiba okozhatta.
-Az utolsó adatbázis-lekérdezés a(z) „<tt>$2</tt>” függvényből történt, és a következő volt:
-<blockquote><tt>$1</tt></blockquote>
-Az adatbázis ezzel a hibával tért vissza: „<tt>$3: $4</tt>”.',
+Az utolsó adatbázis-lekérdezés a(z) „<code>$2</code>” függvényből történt, és a következő volt:
+<blockquote><code>$1</code></blockquote>
+Az adatbázis ezzel a hibával tért vissza: „<samp>$3: $4</samp>”.',
 'dberrortextcl' => 'Szintaktikai hiba található az adatbázis-lekérdezésben.
 Az utolsó adatbázis-lekérdezés a(z) „$2” függvényből történt, és a következő volt:
 „$1”
@@ -694,6 +697,13 @@ $2',
 'ns-specialprotected' => 'A speciális lapok nem szerkeszthetőek.',
 'titleprotected' => "Ilyen címmel nem lehet szócikket készíteni, [[User:$1|$1]] letiltotta.
 A blokkolás oka: „''$2''”.",
+'filereadonlyerror' => 'A(z) "$1" fájl nem módosítható, mert a(z) "$2" fájltároló csak olvasható módban üzemel.
+
+A lezárást végrehajtó rendszergazda az alábbi indoklást adta meg: "$3".',
+'invalidtitle-knownnamespace' => 'Érvénytelen cím "$2" névtérrel és "$3" szöveggel',
+'invalidtitle-unknownnamespace' => 'Érvénytelen cím az ismeretlen $1 névtérszámmal és "$2" szöveggel',
+'exception-nologin' => 'Nem vagy bejelentkezve.',
+'exception-nologin-text' => 'Ezen lap vagy művelet használatához be kell jelenetkezned erre a wikire.',
 
 # Virus scanner
 'virus-badscanner' => "Hibás beállítás: ismeretlen víruskereső: ''$1''",
@@ -714,6 +724,7 @@ Ne felejtsd el átnézni a [[Special:Preferences|személyes beállításaidat]].
 'remembermypassword' => 'Emlékezzen rám ezen a számítógépen (legfeljebb $1 napig)',
 '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.',
 'externaldberror' => 'Hiba történt a külső adatbázis hitelesítése közben, vagy nem vagy jogosult a külső fiókod frissítésére.',
 'login' => 'Bejelentkezés',
 'nav-login-createaccount' => 'Bejelentkezés / fiók létrehozása',
@@ -955,6 +966,9 @@ Ha úgy látod, hogy az üzenetek, amiket ide kapsz, nem neked szólnak, [[Speci
 vagy [{{fullurl:{{FULLPAGENAME}}|action=edit}} szerkesztheted a lapot].</span>',
 'noarticletext-nopermission' => 'Ez a lap jelenleg nem tartalmaz szöveget.
 [[Special:Search/{{PAGENAME}}|Rákereshetsz a lap címére]] más lapok tartalmában, vagy <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} megtekintheted a kapcsolódó naplófájlokat]</span>.',
+'missing-revision' => 'A(z) "{{PAGENAME}}" nevű oldal #$1 változata nem létezik.
+
+Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.',
 'userpage-userdoesnotexist' => 'Nincs „<nowiki>$1</nowiki>” nevű regisztrált felhasználónk.
 Nézd meg, hogy valóban ezt a lapot szeretnéd-e létrehozni vagy szerkeszteni.',
 'userpage-userdoesnotexist-view' => 'Nincs regisztrálva „$1” szerkesztői azonosító.',
@@ -964,7 +978,6 @@ A blokkolási napló legutóbbi ide vonatkozó bejegyzése a következő:',
 '''Firefox / Safari:''' tartsd lenyomva a Shift gombot és kattints a ''Frissítés'' gombra a címsorban, vagy használd a ''Ctrl–F5'' vagy ''Ctrl–R'' billentyűkombinációt (Mac-en ''Command–R'');
 '''Google Chrome:''' használd a ''Ctrl–Shift–R'' billentyűkombinációt (Mac-en ''Command–Shift–R'');
 '''Internet Explorer:''' tartsd nyomva a ''Ctrl''-t, és kattints a ''Frissítés'' gombra, vagy nyomj ''Ctrl–F5''-öt;
-'''Konqueror: '''kattints a ''Frissítés'' gombra vagy nyomj ''F5''-öt;
 '''Opera:''' ürítsd ki a gyorsítótárat a ''Beállítások / Haladó / Előzmények→Törlés most'' gombbal, majd frissítsd az oldalt.",
 'usercssyoucanpreview' => "'''Tipp:''' mentés előtt használd az „{{int:showpreview}}” gombot az új CSS-ed teszteléséhez.",
 'userjsyoucanpreview' => "'''Tipp:''' mentés előtt használd az „{{int:showpreview}}” gombot az új JavaScipted teszteléséhez.",
@@ -1072,6 +1085,7 @@ Néhány sablon nem fog megjelenni.',
 'parser-template-loop-warning' => 'Végtelen ciklus a következő sablonban: [[$1]]',
 'parser-template-recursion-depth-warning' => 'A sablon rekurzív beillesztésének mélysége átlépte a határérékét ($1)',
 'language-converter-depth-warning' => 'A nyelvátalakító rekurzióinak száma túllépve ($1)',
+'expansion-depth-exceeded-category' => 'Lapok, melyeken a sablonok kibontása meghaladja a megengedett szintet',
 
 # "Undo" feature
 'undo-success' => 'A szerkesztés visszavonható. Kérlek ellenőrizd alább a változásokat, hogy valóban ezt szeretnéd-e tenni, majd kattints a lap mentése gombra a visszavonás véglegesítéséhez.',
@@ -1710,20 +1724,20 @@ ez a fájl $2.',
 Ez valószínűleg azért van, mert hibásan adtad meg a feltöltendő fájl nevét.
 Ellenőrizd, hogy valóban fel akarod-e tölteni ezt a fájlt.',
 'windows-nonascii-filename' => 'A wiki nem támogatja a speciális karaktereket tartalmazó fájlneveket.',
-'fileexists' => "'''<tt>[[:$1]]</tt>''' névvel már létezik egy állomány.
-Ellenőrizd, hogy biztosan felül akarod-e írni! [[$1|thumb]]",
-'filepageexists' => "Ehhez a fájlnévhez már létezik leírás a '''<tt>[[:$1]]</tt>''' lapon, de jelenleg nincs feltöltve ilyen nevű fájl.
+'fileexists' => '<strong>[[:$1]]</strong> névvel már létezik egy állomány.
+Ellenőrizd, hogy biztosan felül akarod-e írni! [[$1|thumb]]',
+'filepageexists' => 'Ehhez a fájlnévhez már létezik leírás a <strong>[[:$1]]</strong> lapon, de jelenleg nincs feltöltve ilyen nevű fájl.
 A leírás, amit ebbe az űrlapba írsz, nem fogja felülírni a már létezőt.
 Ha meg szeretnéd változtatni a leírást, meg kell nyitnod szerkesztésre a lapjot.
-[[$1|thumb]]",
-'fileexists-extension' => "Már van egy hasonló nevű feltöltött fájl: [[$2|thumb]]
-* A feltöltendő fájl neve: '''<tt>[[:$1]]</tt>'''
-* A már létező fájl neve: '''<tt>[[:$2]]</tt>'''
-Kérjük, hogy válassz másik nevet.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Már van egy hasonló nevű feltöltött fájl: [[$2|thumb]]
+* A feltöltendő fájl neve: <strong>[[:$1]]</strong>
+* A már létező fájl neve: <strong>[[:$2]]</strong>
+Kérjük, hogy válassz másik nevet.',
 'fileexists-thumbnail-yes' => "A fájl egy kisméretű képnek ''(bélyegképnek)'' tűnik. [[$1|thumb]]
-Kérjük, hogy ellenőrizd a(z) '''<tt>[[:$1]]</tt>''' fájlt.
+Kérjük, hogy ellenőrizd a(z) <strong>[[:$1]]</strong> fájlt.
 Ha az ellenőrzött fájl ugyanakkora, mint az eredeti méretű kép, akkor nincs szükség bélyegkép feltöltésére.",
-'file-thumbnail-no' => "A fájlnév a(z) '''<tt>$1</tt>''' karakterlánccal kezdődik.
+'file-thumbnail-no' => "A fájlnév a(z) <strong>$1</strong> karakterlánccal kezdődik.
 Úgy tűnik, hogy ez egy kisméretű kép ''(bélyegkép)''.
 Ha rendelkezel a teljesméretű képpel, akkor töltsd fel azt, egyébként kérjük, hogy változtasd meg a fájlnevet.",
 'fileexists-forbidden' => 'Már létezik egy ugyanilyen nevű fájl, és nem lehet felülírni.
@@ -1968,7 +1982,7 @@ A [$2 fájl ottani leírólapjának] másolata alább látható.',
 
 # MIME search
 'mimesearch' => 'Keresés MIME-típus alapján',
-'mimesearch-summary' => 'Ez az oldal engedélyezi a fájlok MIME-típus alapján történő szűrését. Bevitel: tartalomtípus/altípus, pl. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Ez az oldal engedélyezi a fájlok MIME-típus alapján történő szűrését. Bevitel: tartalomtípus/altípus, pl. <code>image/jpeg</code>.',
 'mimetype' => 'MIME-típus:',
 'download' => 'letöltés',
 
@@ -2124,6 +2138,7 @@ további információkat lelhetsz ott az általad keresett könyvekről:',
 A napló típusának, a szerkesztő nevének (kis- és nagybetűérzékeny), vagy az érintett lap kiválasztásával (ez is kis- és nagybetűérzékeny) szűkítheted a találatok listáját.',
 'logempty' => 'Nincs illeszkedő naplóbejegyzés.',
 'log-title-wildcard' => 'Így kezdődő címek keresése',
+'showhideselectedlogentries' => 'Kijelölt napló bejegyzések megjelenítése/elrejtése',
 
 # Special:AllPages
 'allpages' => 'Az összes lap listája',
@@ -2168,7 +2183,7 @@ Lásd még a [[Special:WantedCategories|keresett kategóriák]] listáját.',
 'linksearch-ns' => 'Névtér:',
 'linksearch-ok' => 'keresés',
 'linksearch-text' => 'Helyettesítő karaktereket is lehet használni, például "*.wikipedia.org". Legalább egy felső szintű tartománynak lennie kell, például "*.org"<br />
-Támogatott protokollok: <tt>$1</tt> (ezeket ne írd be a keresésbe).',
+Támogatott protokollok: <code>$1</code> (ezeket ne írd be a keresésbe).',
 'linksearch-line' => '$1 hivatkozva innen: $2',
 'linksearch-error' => 'Helyettesítő karakterek csak a cím elején szerepelhetnek.',
 
@@ -2356,6 +2371,8 @@ A legutóbbi törlések listájához lásd a $2 lapot.',
 'rollback' => 'Szerkesztések visszaállítása',
 'rollback_short' => 'Visszaállítás',
 'rollbacklink' => 'visszaállítás',
+'rollbacklinkcount' => '$1 szerkesztés visszaállítása',
+'rollbacklinkcount-morethan' => 'több mint $1 szerkesztés visszaállítása',
 'rollbackfailed' => 'A visszaállítás nem sikerült',
 'cantrollback' => 'Nem lehet visszaállítani: az utolsó szerkesztést végző felhasználó az egyetlen, aki a lapot szerkesztette.',
 'alreadyrolled' => '[[:$1]] utolsó, [[User:$2|$2]] ([[User talk:$2|vita]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) általi szerkesztését nem lehet visszavonni:
@@ -3038,16 +3055,11 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
 
 # Info page
 'pageinfo-title' => 'Információk a(z) „$1” lapról',
-'pageinfo-header-edits' => 'Szerkesztések',
-'pageinfo-header-watchlist' => 'Figyelőlista',
-'pageinfo-header-views' => 'Megtekintések',
-'pageinfo-subjectpage' => 'Lap',
-'pageinfo-talkpage' => 'Vitalap',
-'pageinfo-watchers' => 'Figyelők száma',
-'pageinfo-edits' => 'Szerkesztések száma',
-'pageinfo-authors' => 'Egyedi szerkesztők száma',
+'pageinfo-header-edits' => 'Szerkesztések története',
 'pageinfo-views' => 'Megtekintések száma',
-'pageinfo-viewsperedit' => 'Megtekintés/szerkesztés',
+'pageinfo-watchers' => 'Figyelők száma',
+'pageinfo-edits' => 'Szerkesztések teljes száma',
+'pageinfo-authors' => 'Egyedi szerkesztők teljes száma',
 
 # Skin names
 'skinname-standard' => 'Klasszikus',
@@ -3905,9 +3917,12 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'api-error-empty-file' => 'Az általad elküldött fájl üres volt.',
 'api-error-emptypage' => 'Új, üres lap létrehozása nem engedélyezett.',
 'api-error-fetchfileerror' => 'Belső hiba: valami baj történt a fájl beolvasása közben.',
+'api-error-fileexists-forbidden' => 'Már létezik „$1” nevű fájl, és nem lehet felülírni.',
+'api-error-fileexists-shared-forbidden' => 'Már létezik „$1” nevű fájl a megosztott fájlok között, és nem lehet felülírni.',
 'api-error-file-too-large' => 'Az általad elküldött fájl túl nagy.',
 'api-error-filename-tooshort' => 'A fájlnév túl rövid.',
 'api-error-filetype-banned' => 'Tiltott fájltípus.',
+'api-error-filetype-banned-type' => '!A következő {{PLURAL:$4|fájltípus nem engedélyezett|fájltípusok nem engedélyezettek}}: $1. Engedélyezett {{PLURAL:$3|típus|típusok}}: $2.',
 'api-error-filetype-missing' => 'Hiányzik a fájl kiterjesztése.',
 'api-error-hookaborted' => 'Az általad kezdeményezett módosítást nem lehet végrehajtani. (Egy bővítmény megakadályozta.)',
 'api-error-http' => 'Belső hiba: nem sikerült kapcsolódni a kiszolgálóhoz.',
index ce350d1..0216dfe 100644 (file)
@@ -15,6 +15,7 @@
  * @author Togaed
  * @author Vacio
  * @author Xelgen
+ * @author Համլետ
  * @author לערי ריינהארט
  */
 
@@ -91,109 +92,109 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ՎԵՐԱՀՂՈՒՄ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__ԱՌԱՆՑ_ԲՈՎ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__ԱՌԱՆՑ_ՍՐԱՀԻ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ՍՏԻՊԵԼ_ԲՈՎ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ԲՈՎ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__ԱՌԱՆՑ_ԲԱԺՆԻ_ԽՄԲԱԳՐՄԱՆ__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'ԸՆԹԱՑԻՔ_ԱՄԻՍԸ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'ԸՆԹԱՑԻՔ_ԱՄՍՎԱ_ԱՆՈՒՆԸ', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'ԸՆԹԱՑԻՔ_ԱՄՍՎԱ_ԱՆՈՒՆԸ_ՍԵՌ', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ԸՆԹԱՑԻՔ_ԱՄՍՎԱ_ԱՆՎԱՆ_ՀԱՊԱՎՈՒՄԸ', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ԸՆԹԱՑԻՔ_ՕՐԸ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ԸՆԹԱՑԻՔ_ՕՐԸ_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ԸՆԹԱՑԻՔ_ՕՐՎԱ_ԱՆՈՒՆԸ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ԸՆԹԱՑԻՔ_ՏԱՐԻՆ', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ԸՆԹԱՑԻՔ_ԺԱՄԱՆԱԿԸ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ԸՆԹԱՑԻՔ_ԺԱՄԸ', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ՏԵՂԱԿԱՆ_ԱՄԻՍԸ', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'ՏԵՂԱԿԱՆ_ԱՄՍՎԱ_ԱՆՈՒՆԸ', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'ՏԵՂԱԿԱՆ_ԱՄՍՎԱ_ԱՆՈՒՆԸ_ՍԵՌ', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ՏԵՂԱԿԱՆ_ԱՄՍՎԱ_ԱՆՎԱՆ_ՀԱՊԱՎՈՒՄԸ', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ՏԵՂԱԿԱՆ_ՕՐԸ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ՏԵՂԱԿԱՆ_ՕՐԸ_2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'ՏԵՂԱԿԱՆ_ՕՐՎԱ_ԱՆՈՒՆԸ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ՏԵՂԱԿԱՆ_ՏԱՐԻՆ', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ՏԵՂԱԿԱՆ_ԺԱՄԱՆԱԿԸ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ՏԵՂԱԿԱՆ_ԺԱՄԸ', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ԷՋԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ՀՈԴՎԱԾՆԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ՖԱՅԼԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ՄԱՍՆԱԿԻՑՆԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFUSERS' ),
-       'pagename'                => array( '1', 'ԷՋԻ_ԱՆՈՒՆԸ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ԷՋԻ_ԱՆՈՒՆԸ_2', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ԱՆՎԱՆԱՏԱՐԱԾՔ', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ԱՆՎԱՆԱՏԱՐԱԾՔ_2', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ՔՆՆԱՐԿՄԱՆ_ՏԱՐԱԾՔԸ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ՔՆՆԱՐԿՄԱՆ_ՏԱՐԱԾՔԸ_2', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ՀՈԴՎԱԾՆԵՐԻ_ՏԱՐԱԾՔԸ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ՀՈԴՎԱԾՆԵՐԻ_ՏԱՐԱԾՔԸ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'ARTICLESPACE', 'ԷՋԻ_ԼՐԻՎ_ԱՆՎԱՆՈՒՄԸ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ԷՋԻ_ԼՐԻՎ_ԱՆՎԱՆՈՒՄԸ_2', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ԵՆԹԱԷՋԻ_ԱՆՎԱՆՈՒՄԸ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ԵՆԹԱԷՋԻ_ԱՆՎԱՆՈՒՄԸ_2', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'ՀԻՄՆԱԿԱՆ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'ՀԻՄՆԱԿԱՆ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ_2', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ՔՆՆԱՐԿՄԱՆ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'ՔՆՆԱՐԿՄԱՆ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ_2', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'ՀՈԴՎԱԾԻ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'ՀՈԴՎԱԾԻ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'ՀՈՂՈՐԴ՝', 'MSG:' ),
-       'msgnw'                   => array( '0', 'ՀՈՂՈՐԴ_ԱՌԱՆՑ_ՎԻՔԻԻ՝', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'մինի', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'մինի=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'աջից', 'right' ),
-       'img_left'                => array( '1', 'ձախից', 'left' ),
-       'img_none'                => array( '1', 'առանց', 'none' ),
-       'img_width'               => array( '1', '$1փքս', '$1px' ),
-       'img_center'              => array( '1', 'կենտրոն', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'շրջափակել', 'framed', 'enframed', 'frame' ),
-       'img_page'                => array( '1', 'էջը=$1', 'էջ $1', 'page=$1', 'page $1' ),
-       'int'                     => array( '0', 'ՆԵՐՔ՝', 'INT:' ),
-       'sitename'                => array( '1', 'ԿԱՅՔԻ_ԱՆՈՒՆԸ', 'SITENAME' ),
-       'ns'                      => array( '0', 'ԱՏ՝', 'NS:' ),
-       'localurl'                => array( '0', 'ՏԵՂԱԿԱՆ_ՀԱՍՑԵՆ՝', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ՏԵՂԱԿԱՆ_ՀԱՍՑԵՆ_2՝', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'ՍԵՐՎԵՐԸ', 'SERVER' ),
-       'servername'              => array( '0', 'ՍԵՐՎԵՐԻ_ԱՆՈՒՆԸ', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ՍՔՐԻՊՏԻ_ՃԱՆԱՊԱՐՀԸ', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'ՀՈԼՈՎ՛', 'GRAMMAR:' ),
-       'notitleconvert'          => array( '0', '__ԱՌԱՆՑ_ՎԵՐՆԱԳՐԻ_ՓՈՓՈԽՄԱՆ__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__ԱՌԱՆՑ_ՊԱՐՈՒՆԱԿՈՒԹՅԱՆ_ՓՈՓՈԽՄԱՆ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'ԸՆԹԱՑԻՔ_ՇԱԲԱԹԸ', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ԸՆԹԱՑԻՔ_ՇԱԲԱԹՎԱ_ՕՐԸ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'ՏԵՂԱԿԱՆ_ՇԱԲԱԹՎԸ', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ՏԵՂԱԿԱՆ_ՇԱԲԱԹՎԱ_ՕՐԸ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ՀԱՄԱՐԸ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ՕՐԸ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ՕՐԸ_2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ԱՄԻՍԸ', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ՏԱՐԻՆ', 'REVISIONYEAR' ),
-       'plural'                  => array( '0', 'ՀՈԳՆԱԿԻ՝', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'ԼՐԻՎ_ՀԱՍՑԵՆ՝', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'ԼՐԻՎ_ՀԱՍՑԵՆ_2՝', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'ՓՈՔՐԱՏԱՌ_ՍԿԶԲՆԱՏԱՌ՝', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ՄԵԾԱՏԱՌ_ՍԿԶԲՆԱՏԱՌ՝', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'ՓՈՔՐԱՏԱՌ՝', 'LC:' ),
-       'uc'                      => array( '0', 'ՄԵԾԱՏԱՌ՝', 'UC:' ),
-       'displaytitle'            => array( '1', 'ՑՈՒՅՑ_ՏԱԼ_ՎԵՐՆԱԳԻՐԸ', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'Չ', 'R' ),
-       'newsectionlink'          => array( '1', '__ՀՂՈՒՄ_ՆՈՐ_ԲԱԺՆԻ_ՎՐԱ__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'ԸՆԹԱՑԻՔ_ՏԱՐԲԵՐԱԿԸ', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ՄՇԱԿՎԱԾ_ՀԱՍՑԵ՛', 'URLENCODE:' ),
-       'currenttimestamp'        => array( '1', 'ԸՆԹԱՑԻՔ_ԺԱՄԱՆԱԿԻ_ԴՐՈՇՄ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'ՏԵՂԱԿԱՆ_ԺԱՄԱՆԱԿԻ_ԴՐՈՇՄ', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'ՆԱՄԱԿԻ_ՈՒՂՂՈՒԹՅՈՒՆԸ', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#ԼԵԶՈՒ՝', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'ՊԱՐՈՒՆԱԿՈՒԹՅԱՆ_ԼԵԶՈՒՆ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'ԷՋԵՐ_ԱՆՎԱՆԱՏԱՐԱԾՔՈՒՄ՝', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ԱԴՄԻՆՆԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ՁԵՎԵԼ_ԹԻՎԸ', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ԼՐԱՑՆԵԼ_ՁԱԽԻՑ', 'PADLEFT' ),
-       'padright'                => array( '0', 'ԼՐԱՑՆԵԼ_ԱՋԻՑ', 'PADRIGHT' ),
-       'special'                 => array( '0', 'սպասարկող', 'special' ),
-       'defaultsort'             => array( '1', 'ԼՌՈՒԹՅԱՄԲ_ԴԱՍԱՎՈՐՈՒՄ՝', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'redirect'                  => array( '0', '#ՎԵՐԱՀՂՈՒՄ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__ԱՌԱՆՑ_ԲՈՎ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__ԱՌԱՆՑ_ՍՐԱՀԻ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ՍՏԻՊԵԼ_ԲՈՎ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ԲՈՎ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__ԱՌԱՆՑ_ԲԱԺՆԻ_ԽՄԲԱԳՐՄԱՆ__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'ԸՆԹԱՑԻՔ_ԱՄԻՍԸ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'ԸՆԹԱՑԻՔ_ԱՄՍՎԱ_ԱՆՈՒՆԸ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ԸՆԹԱՑԻՔ_ԱՄՍՎԱ_ԱՆՈՒՆԸ_ՍԵՌ', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ԸՆԹԱՑԻՔ_ԱՄՍՎԱ_ԱՆՎԱՆ_ՀԱՊԱՎՈՒՄԸ', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ԸՆԹԱՑԻՔ_ՕՐԸ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ԸՆԹԱՑԻՔ_ՕՐԸ_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ԸՆԹԱՑԻՔ_ՕՐՎԱ_ԱՆՈՒՆԸ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ԸՆԹԱՑԻՔ_ՏԱՐԻՆ', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ԸՆԹԱՑԻՔ_ԺԱՄԱՆԱԿԸ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ԸՆԹԱՑԻՔ_ԺԱՄԸ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ՏԵՂԱԿԱՆ_ԱՄԻՍԸ', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'ՏԵՂԱԿԱՆ_ԱՄՍՎԱ_ԱՆՈՒՆԸ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'ՏԵՂԱԿԱՆ_ԱՄՍՎԱ_ԱՆՈՒՆԸ_ՍԵՌ', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ՏԵՂԱԿԱՆ_ԱՄՍՎԱ_ԱՆՎԱՆ_ՀԱՊԱՎՈՒՄԸ', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ՏԵՂԱԿԱՆ_ՕՐԸ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ՏԵՂԱԿԱՆ_ՕՐԸ_2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'ՏԵՂԱԿԱՆ_ՕՐՎԱ_ԱՆՈՒՆԸ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ՏԵՂԱԿԱՆ_ՏԱՐԻՆ', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ՏԵՂԱԿԱՆ_ԺԱՄԱՆԱԿԸ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ՏԵՂԱԿԱՆ_ԺԱՄԸ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ԷՋԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ՀՈԴՎԱԾՆԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ՖԱՅԼԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ՄԱՍՆԱԿԻՑՆԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFUSERS' ),
+       'pagename'                  => array( '1', 'ԷՋԻ_ԱՆՈՒՆԸ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ԷՋԻ_ԱՆՈՒՆԸ_2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ԱՆՎԱՆԱՏԱՐԱԾՔ', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ԱՆՎԱՆԱՏԱՐԱԾՔ_2', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ՔՆՆԱՐԿՄԱՆ_ՏԱՐԱԾՔԸ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ՔՆՆԱՐԿՄԱՆ_ՏԱՐԱԾՔԸ_2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ՀՈԴՎԱԾՆԵՐԻ_ՏԱՐԱԾՔԸ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ՀՈԴՎԱԾՆԵՐԻ_ՏԱՐԱԾՔԸ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ARTICLESPACE', 'ԷՋԻ_ԼՐԻՎ_ԱՆՎԱՆՈՒՄԸ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ԷՋԻ_ԼՐԻՎ_ԱՆՎԱՆՈՒՄԸ_2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ԵՆԹԱԷՋԻ_ԱՆՎԱՆՈՒՄԸ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ԵՆԹԱԷՋԻ_ԱՆՎԱՆՈՒՄԸ_2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'ՀԻՄՆԱԿԱՆ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'ՀԻՄՆԱԿԱՆ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ_2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ՔՆՆԱՐԿՄԱՆ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ՔՆՆԱՐԿՄԱՆ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ_2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'ՀՈԴՎԱԾԻ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'ՀՈԴՎԱԾԻ_ԷՋԻ_ԱՆՎԱՆՈՒՄԸ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'ՀՈՂՈՐԴ՝', 'MSG:' ),
+       'msgnw'                     => array( '0', 'ՀՈՂՈՐԴ_ԱՌԱՆՑ_ՎԻՔԻԻ՝', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'մինի', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'մինի=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'աջից', 'right' ),
+       'img_left'                  => array( '1', 'ձախից', 'left' ),
+       'img_none'                  => array( '1', 'առանց', 'none' ),
+       'img_width'                 => array( '1', '$1փքս', '$1px' ),
+       'img_center'                => array( '1', 'կենտրոն', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'շրջափակել', 'framed', 'enframed', 'frame' ),
+       'img_page'                  => array( '1', 'էջը=$1', 'էջ $1', 'page=$1', 'page $1' ),
+       'int'                       => array( '0', 'ՆԵՐՔ՝', 'INT:' ),
+       'sitename'                  => array( '1', 'ԿԱՅՔԻ_ԱՆՈՒՆԸ', 'SITENAME' ),
+       'ns'                        => array( '0', 'ԱՏ՝', 'NS:' ),
+       'localurl'                  => array( '0', 'ՏԵՂԱԿԱՆ_ՀԱՍՑԵՆ՝', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ՏԵՂԱԿԱՆ_ՀԱՍՑԵՆ_2՝', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'ՍԵՐՎԵՐԸ', 'SERVER' ),
+       'servername'                => array( '0', 'ՍԵՐՎԵՐԻ_ԱՆՈՒՆԸ', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ՍՔՐԻՊՏԻ_ՃԱՆԱՊԱՐՀԸ', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'ՀՈԼՈՎ՛', 'GRAMMAR:' ),
+       'notitleconvert'            => array( '0', '__ԱՌԱՆՑ_ՎԵՐՆԱԳՐԻ_ՓՈՓՈԽՄԱՆ__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__ԱՌԱՆՑ_ՊԱՐՈՒՆԱԿՈՒԹՅԱՆ_ՓՈՓՈԽՄԱՆ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'ԸՆԹԱՑԻՔ_ՇԱԲԱԹԸ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ԸՆԹԱՑԻՔ_ՇԱԲԱԹՎԱ_ՕՐԸ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'ՏԵՂԱԿԱՆ_ՇԱԲԱԹՎԸ', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ՏԵՂԱԿԱՆ_ՇԱԲԱԹՎԱ_ՕՐԸ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ՀԱՄԱՐԸ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ՕՐԸ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ՕՐԸ_2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ԱՄԻՍԸ', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ՏԱՐԲԵՐԱԿԻ_ՏԱՐԻՆ', 'REVISIONYEAR' ),
+       'plural'                    => array( '0', 'ՀՈԳՆԱԿԻ՝', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'ԼՐԻՎ_ՀԱՍՑԵՆ՝', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ԼՐԻՎ_ՀԱՍՑԵՆ_2՝', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'ՓՈՔՐԱՏԱՌ_ՍԿԶԲՆԱՏԱՌ՝', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ՄԵԾԱՏԱՌ_ՍԿԶԲՆԱՏԱՌ՝', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'ՓՈՔՐԱՏԱՌ՝', 'LC:' ),
+       'uc'                        => array( '0', 'ՄԵԾԱՏԱՌ՝', 'UC:' ),
+       'displaytitle'              => array( '1', 'ՑՈՒՅՑ_ՏԱԼ_ՎԵՐՆԱԳԻՐԸ', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'Չ', 'R' ),
+       'newsectionlink'            => array( '1', '__ՀՂՈՒՄ_ՆՈՐ_ԲԱԺՆԻ_ՎՐԱ__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'ԸՆԹԱՑԻՔ_ՏԱՐԲԵՐԱԿԸ', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ՄՇԱԿՎԱԾ_ՀԱՍՑԵ՛', 'URLENCODE:' ),
+       'currenttimestamp'          => array( '1', 'ԸՆԹԱՑԻՔ_ԺԱՄԱՆԱԿԻ_ԴՐՈՇՄ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'ՏԵՂԱԿԱՆ_ԺԱՄԱՆԱԿԻ_ԴՐՈՇՄ', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'ՆԱՄԱԿԻ_ՈՒՂՂՈՒԹՅՈՒՆԸ', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#ԼԵԶՈՒ՝', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'ՊԱՐՈՒՆԱԿՈՒԹՅԱՆ_ԼԵԶՈՒՆ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'ԷՋԵՐ_ԱՆՎԱՆԱՏԱՐԱԾՔՈՒՄ՝', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ԱԴՄԻՆՆԵՐԻ_ՔԱՆԱԿԸ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ՁԵՎԵԼ_ԹԻՎԸ', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ԼՐԱՑՆԵԼ_ՁԱԽԻՑ', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ԼՐԱՑՆԵԼ_ԱՋԻՑ', 'PADRIGHT' ),
+       'special'                   => array( '0', 'սպասարկող', 'special' ),
+       'defaultsort'               => array( '1', 'ԼՌՈՒԹՅԱՄԲ_ԴԱՍԱՎՈՐՈՒՄ՝', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
 );
 
 $specialPageAliases = array(
@@ -299,20 +300,19 @@ $messages = array(
 'tog-enotifminoredits' => 'էլ-փոստով տեղեկացնել էջերի նաև չնչին խմբագրումների մասին',
 'tog-enotifrevealaddr' => 'Ցույց տալ իմ էլ-փոստի հասցեն ծանուցման նամակներում',
 'tog-shownumberswatching' => 'Ցույց տալ էջ հսկող մասնակիցների թիվը',
-'tog-oldsig' => 'Առկա ստորագրության նախադիտում.',
+'tog-oldsig' => 'Ներկայիս ստորագրությունն է․',
 'tog-fancysig' => 'Ստորագրությունը վիքիտեքստի տեսքով (առանց ավտոմատ հղման)',
 'tog-externaleditor' => 'Օգտագործել արտաքին խմբագրիչ ըստ լռության (պահանջում է հատուկ նախընտրություններ ձեր համակարգչում)',
 'tog-externaldiff' => 'Օգտագործել տարբերակների համեմատման արտաքին ծրագիր ըստ լռության (պահանջում է հատուկ նախընտրություններ ձեր համակարգչում)',
 'tog-showjumplinks' => 'Միացնել «անցնել դեպի» օգնական հղումները',
 'tog-uselivepreview' => 'Օգտագործել ուղիղ նախադիտում (JavaScript) (Փորձնական)',
-'tog-forceeditsummary' => 'Նախազգուշացնել փոփոխությունների ամփոփումը դատարկ թողնելու մասին',
+'tog-forceeditsummary' => 'Նախազգուշացնել խմբագրման ամփոփումը դատարկ թողնելու դեպքում',
 'tog-watchlisthideown' => 'Թաքցնել իմ խմբագրումները հսկացանկից',
 'tog-watchlisthidebots' => 'Թաքցնել բոտերի խմբագրումները հսկացանկից',
 'tog-watchlisthideminor' => 'Թաքցնել չնչին խմբագրումները հսկացանկից',
 'tog-watchlisthideliu' => 'Թաքցնել մուտք գործած մասնակիցների խմբագրումները հսկացանկից',
 'tog-watchlisthideanons' => 'Թաքցնել անանուն մասնակիցների խմբագրումները հսկացանկից',
 'tog-watchlisthidepatrolled' => 'Թաքցնել պարեկված խմբագրումները հսկացանկից',
-'tog-nolangconversion' => 'Անջատել գրի համակարգի փոփոխումը',
 'tog-ccmeonemails' => 'Ուղարկել ինձ իմ կողմից մյուս մասնակիցներին ուղարկված նամակների պատճեններ',
 'tog-diffonly' => 'Չցուցադրել էջի պարունակությունը տարբերությունների ներքևից',
 'tog-showhiddencats' => 'Ցուցադրել թաքնված կատեգորիաները',
@@ -717,8 +717,8 @@ $2',
 
 Խնդրում ենք կրկին ներկայանալ համակարգին այն ստանալուց հետո։',
 'blocked-mailpassword' => 'Ձեր IP հասցեից խմբագրումները արգելափակված են, և հետևաբար արգելված է նաև գաղտնաբառի վերականգնումը՝ հետագա չարաշահումների կանխման նպատակով։',
-'eauthentsent' => 'Առաջարկված էլ-հասցեին ուղարկվել է վավերացման նամակ։
\84Õ«Õ¶Õ¹Ö\87 Õ¸Ö\80Ö\87Õ§ Õ¡ÕµÕ¬ Õ¸Ö\82Õ²Õ¥Ö\80Õ»Õ¶Õ¥Ö\80 Õ¯Õ¸Ö\82Õ²Õ¡Ö\80Õ¯Õ¾Õ¥Õ¶ Õ¡ÕµÕ¤ Õ°Õ¡Õ½Ö\81Õ¥Õ«Õ¶, Õ±Õ¥Õ¦ Õ¡Õ¶Õ°Ö\80Õ¡ÕªÕ¥Õ·Õ¿ Õ§ Õ°Õ¥Õ¿Ö\87Õ¥Õ¬ Õ¶Õ¡Õ´Õ¡Õ¯Õ¸Ö\82Õ´ Õ¶Õ¯Õ¡Ö\80Õ¡Õ£Ö\80Õ¾Õ¡Õ® Õ£Õ¸Ö\80Õ®Õ¸Õ²Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¶Õ¥Ö\80Õ«Õ¶Õ\9d Õ°Õ¡Õ·Õ¾Õ« Õ±Õ¥Õ¦ ÕºÕ¡Õ¿Õ¯Õ¡Õ¶Õ¥Õ¬Õ¸Ö\82 Ö\83Õ¡Õ½Õ¿Õ¨ Õ¾Õ¡Õ¾Õ¥Ö\80Õ¡Ö\81Õ¶Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80։',
+'eauthentsent' => 'Նոր էլ-հասցեին ուղարկվել է վավերացման նամակ։
\80Õ¥Õ¿Ö\87Õ¥Õ\9bÖ\84 Õ¶Õ¡Õ´Õ¡Õ¯Õ« Ö\81Õ¸Ö\82Ö\81Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ«Õ¶Õ\9d Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80, Õ¸Ö\80 Õ¡ÕµÕ¤ Õ°Õ¡Õ½Ö\81Õ¥Õ¶ Õ±Õ¥Õ¦ Õ§ ÕºÕ¡Õ¿Õ¯Õ¡Õ¶Õ¸Ö\82Õ´Ö\89 Õ\84Õ«Õ¶Õ¹ Õ¡ÕµÕ¤ Õ¶Õ¸Ö\80 Õ°Õ¡Õ½Ö\81Õ¥Õ«Õ¶ Õ¡ÕµÕ¬ Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö\80 Õ¹Õ¥Õ¶ Õ¯Õ¡Ö\80Õ¸Õ² Õ¸Ö\82Õ²Õ¡Ö\80Õ¯Õ¾Õ¥Õ¬։',
 'throttled-mailpassword' => 'Գաղտնաբառի հիշեցման ուղերձ արդեն ուղարկվել է վերջին {{PLURAL:$1|ժամվա|$1 ժամվա}} ընթացքում։ Չարաշահման կանխարգելման նպատակով թույլատրվում է միայն մեկ գաղտնաբառի հիշեցում ամեն {{PLURAL:$1|ժամվա|$1 ժամվա}} ընթացքում։',
 'mailerror' => 'Փոստի ուղարկման սխալ. $1',
 'acct_creation_throttle_hit' => 'Վերջին օրվա ընթացքում ձեր IP-հասցեից ստեղծվել է {{PLURAL:$1|1 մասնակցի հաշվիվ|$1 մասնակցի հաշվիվ}}, ինչը այս ժամանակաշրջանում առավելագույն թույլատրելի քանակն է։
@@ -739,6 +739,9 @@ $2',
 Խնդրում ենք սպասել որոշ ժամանակ կրկին փորձելուց առաջ։',
 'loginlanguagelabel' => 'Լեզու. $1',
 
+# E-mail sending
+'php-mail-error-unknown' => 'Անհայտ սխալ PHP-ի mail() ֆունկցիայում',
+
 # Change password dialog
 'resetpass' => 'Փոխել գաղտնաբառը',
 'resetpass_announce' => 'Դուք ներկայացել եք էլ-փոստով ստացված ժամանակավոր գաղտնաբառով։ Համակարգ մուտքի համար անհրաժեշտ է նոր գաղտնաբառ ընտրել այստեղ.',
@@ -758,12 +761,15 @@ $2',
 'resetpass-temp-password' => 'Ժամանակավոր գաղտնաբառ.',
 
 # Special:PasswordReset
+'passwordreset-legend' => 'Վերականգնել գաղտնաբառը',
 'passwordreset-username' => 'Մասնակցի անուն.',
 'passwordreset-emailelement' => 'Մասնակցային անուն. $1
 Ժամանակավոր գաղտնաբառ. $2',
 
 # Special:ChangeEmail
 'changeemail' => 'Փոխել էլ. հասցեն',
+'changeemail-submit' => 'Խմբագրել էլ․ հասցեն',
+'changeemail-cancel' => 'Չեղարկել',
 
 # Edit page toolbar
 'bold_sample' => 'Թավատառ տեքստ',
@@ -939,6 +945,7 @@ $2',
 'log-fulllog' => 'Դիտել ամբողջական տեղեկամատյանը',
 'edit-conflict' => 'Խմբագրման ընհարում։',
 'edit-no-change' => 'Ձեր խմբագրումը անտեսվել է, քանի որ ոչ մի փոփոխություն չի կատարվել տեքստի մեջ։',
+'defaultmessagetext' => 'Լռելյան տեքստը',
 
 # "Undo" feature
 'undo-success' => 'Խմբագրումը կարող է հետ շրջվել։ Ստուգեք տարբերակների համեմատությունը ստորև, որպեսզի համոզվեք, որ դա է ձեզ հետաքրքրող փոփոխությունը և մատնահարեք «Հիշել էջը»՝ գործողությունն ավարտելու համար։',
@@ -1044,7 +1051,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 
 # Diffs
 'history-title' => '«$1» էջի փոփոխումների պատմություն',
-'difference-title' => '$1: Խմագրումների տարբերություն',
+'difference-title' => '$1: Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ« Õ¿Õ¡Ö\80Õ¢Õ¥Ö\80Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶',
 'difference-title-multipage' => '$1 և $2: Խմբագրումների տարբերություն',
 'difference-multipage' => '(Էջերի տարերություն)',
 'lineno' => 'Տող  $1.',
@@ -1346,7 +1353,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'upload_directory_read_only' => 'Վեբ-սերվերը չունի գրելու իրավունք բեռնումների թղթապանակում ($1)։',
 'uploaderror' => 'Բեռնման սխալ',
 'uploadtext' => "Նիշք բեռնելու համար օգտագործեք ստորև բերված ձևը։
-Նախկինում բեռնված նիշքերը դիտելու կամ որոնելու համար այցելեք [[Սպասարկող:Պատկերներիցանկը|բեռնված նիշքերի ցանկը]]։ Բեռնումները գրանցվում են [[Սպասարկող:Տեղեկամատյան/upload|բեռնման տեղեկամատյանում]], ջնջումները՝ [[Սպասարկող:Տեղեկամատյան/delete|ջնջման տեղեկամատյանում]]։
+Նախկինում բեռնված նիշքերը դիտելու կամ որոնելու համար այցելեք [[Սպասարկող:Պատկերներիցանկը|բեռնված նիշքերի ցանկ]]։ Բեռնումները գրանցվում են [[Սպասարկող:Տեղեկամատյան/upload|բեռնման տեղեկամատյանում]], ջնջումները՝ [[Սպասարկող:Տեղեկամատյան/delete|ջնջման տեղեկամատյանում]]։
 
 Այս նիշքը որևէ էջում ընդգրկելու համար օգտագործեք հետևյալ հղման ձևերը.
 * '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Նիշք.jpg]]</nowiki>''' - ամբողջական չափի պատկեր տեղադրելու համար,
@@ -1372,16 +1379,16 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'large-file' => 'Խորհուրդ է տրվում չօգտագործել $1 բայթից մեծ նիշքեր. այս նիշքի չափն է՝  $2 բայթ։',
 'largefileserver' => 'Այս նիշքը սպասարկիչի թույլատրած առավելագույն չափից մեծ է։',
 'emptyfile' => 'Ձեր բեռնած նիշքը ըստ երևույթին դատարկ է։ Հնարավոր է սա նիշքի անվանման մեջ տառասխալի հետևանք է։ Խնդրում ենք ստուգել, թե արդյոք իսկապես ուզում եք բեռնել այս նիշքը։',
-'fileexists' => "Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի։ Խնդրում ենք ստուգել '''<tt>[[:$1]]</tt>''', եթե դուք համոզված չեք, որ ուզում եք այն փոխարինել։
-[[$1|thumb]]",
-'fileexists-extension' => "Գոյություն ունի համանման անվանմամբ նիշք՝ [[$2|thumb]]
-* Բեռնված նիշքի անվանում՝ '''<tt>[[:$1]]</tt>'''
-* Գոյություն ունեցող նիշքի անվանում՝ '''<tt>[[:$2]]</tt>'''
-Խնդրում ենք ընտրել մեկ այլ անվանում։",
+'fileexists' => 'Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի։ Խնդրում ենք ստուգել <strong>[[:$1]]</strong>, եթե դուք համոզված չեք, որ ուզում եք այն փոխարինել։
+[[$1|thumb]]',
+'fileexists-extension' => 'Գոյություն ունի համանման անվանմամբ նիշք՝ [[$2|thumb]]
+* Բեռնված նիշքի անվանում՝ <strong>[[:$1]]</strong>
+* Գոյություն ունեցող նիշքի անվանում՝ <strong>[[:$2]]</strong>
+Խնդրում ենք ընտրել մեկ այլ անվանում։',
 'fileexists-thumbnail-yes' => "Նիշքը ըստ երևույթին փոքրացված պատճեն է ''(պատկերիկ)''։ [[$1|thumb]]
-Խնդրում ենք ստուգել '''<tt>[[:$1]]</tt>''' նիշքը։
+Խնդրում ենք ստուգել <strong>[[:$1]]</strong> նիշքը։
 Եթե նշված նիշքը նույն պատկերն է բնօրինակ չափով, ապա հարկովոր չէ բեռնել նրա փոքրացված պատճենը։",
-'file-thumbnail-no' => "Նիշքի անվանման սկիզբն է՝ '''<tt>$1</tt>'''։ 
+'file-thumbnail-no' => "Նիշքի անվանման սկիզբն է՝ <strong>$1</strong>։ 
 Հավանաբար սա փոքրացված պատճեն է ''(պատկերիկ)''։ 
 Եթե դուք այս պատկերը ամբողջական լուծաչափով ունեք, ապա խնդրում ենք բեռնել այն, հակառակ դեպքում՝ խնդրում ենք փոխել նիշքի անվանումը։",
 'fileexists-forbidden' => 'Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի։ Խնդրում ենք հետ վերադառնալ և բեռնել նիշքը նոր անվանմամբ։ [[File:$1|thumb|center|$1]]',
@@ -1482,7 +1489,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 
 # MIME search
 'mimesearch' => 'Որոնել MIME-տեսակով',
-'mimesearch-summary' => 'Այս էջը հնարավորություն է տալիս զտել նիշքերը իրենց MIME-տեսակով։ Գրելաձև. օբյեկտի_տեսակ/ենթատեսակ, օրինակ՝ <tt>image/jpeg</tt>։',
+'mimesearch-summary' => 'Այս էջը հնարավորություն է տալիս զտել նիշքերը իրենց MIME-տեսակով։ Գրելաձև. օբյեկտի_տեսակ/ենթատեսակ, օրինակ՝ <code>image/jpeg</code>։',
 'mimetype' => 'MIME-տեսակ.',
 'download' => 'Ներբեռնել',
 
@@ -1923,8 +1930,8 @@ $1',
 'sp-contributions-deleted' => 'Մասնակցի ջնջված ներդրում',
 'sp-contributions-uploads' => 'Բեռնումներ',
 'sp-contributions-logs' => 'տեղեկամատյաններ',
-'sp-contributions-talk' => 'Քննարկում',
-'sp-contributions-userrights' => 'Õ\84ասնակիցների իրավունքների կառավարում',
+'sp-contributions-talk' => 'քննարկում',
+'sp-contributions-userrights' => 'Õ´ասնակիցների իրավունքների կառավարում',
 'sp-contributions-search' => 'Որոնել ներդրումները',
 'sp-contributions-username' => 'IP-հասե կամ մասնակցի անուն.',
 'sp-contributions-toponly' => 'Ցույց տալ միայն այն խմբագրումները, որոնք վերջին փոփոխություն են',
@@ -2264,15 +2271,10 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 # Info page
 'pageinfo-title' => 'Տեղեկություններ $1-ի վերաբերյալ',
 'pageinfo-header-edits' => 'Խմբագրումներ',
-'pageinfo-header-watchlist' => 'Հսկացանկ',
-'pageinfo-header-views' => 'Դիտումներ',
-'pageinfo-subjectpage' => 'Էջ',
-'pageinfo-talkpage' => 'Քննարկման էջ',
+'pageinfo-views' => 'Դիտումների քանակ',
 'pageinfo-watchers' => 'Դիտողների քանակ',
 'pageinfo-edits' => 'Խմբագրումների քանակ',
 'pageinfo-authors' => 'Տարբեր հեղինակների քանակ',
-'pageinfo-views' => 'Դիտումների քանակ',
-'pageinfo-viewsperedit' => 'Դիտումները ըստ խմբագրումների',
 
 # Skin names
 'skinname-standard' => 'Դասական',
@@ -2499,6 +2501,9 @@ $3
 'watchlisttools-edit' => 'Դիտել և խմբագրել հսկացանկը',
 'watchlisttools-raw' => 'Խմբագրել հում հսկացանկը',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|քննարկում]])',
+
 # Special:Version
 'version' => 'ՄեդիաՎիքի տարբերակը',
 
@@ -2557,7 +2562,7 @@ $3
 'revdelete-summary-hid' => 'անտեսանելի դարձվեց խմբագրման ամփոփումը',
 'revdelete-uname-hid' => 'անտեսանելի դարձվեց մասնակցի անունը',
 'revdelete-content-unhid' => 'տեսանելի դարձվեց բովանդակությունը',
-'revdelete-summary-unhid' => 'տեսնելի դարձվեց խմագրման ամփոփումը',
+'revdelete-summary-unhid' => 'Õ¿Õ¥Õ½Õ¶Õ¥Õ¬Õ« Õ¤Õ¡Ö\80Õ±Õ¾Õ¥Ö\81 Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ´Õ¡Õ¶ Õ¡Õ´Ö\83Õ¸Ö\83Õ¸Ö\82Õ´Õ¨',
 'revdelete-uname-unhid' => 'տեսանելի դարձվեց մասնակցի անունը',
 'logentry-move-move' => '$1 տեղափոխեց էջը «$3»-ից «$4»',
 'logentry-move-move-noredirect' => '$1 տեղափոխեց էջը «$3»-ից «$4» առանց վերահղում թողնելու',
index e1a7633..738b529 100644 (file)
@@ -149,7 +149,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Celar le modificationes patruliate in le modificationes recente',
 'tog-newpageshidepatrolled' => 'Celar le paginas patruliate del lista de nove paginas',
 'tog-extendwatchlist' => 'Displicar le observatorio pro monstrar tote le modificationes, non solmente les plus recente',
-'tog-usenewrc' => 'Usar le modificationes recente meliorate (require JavaScript)',
+'tog-usenewrc' => 'Gruppar modificationes per pagina in modificationes recente e observatorio (require JavaScript)',
 'tog-numberheadings' => 'Numerar titulos automaticamente',
 'tog-showtoolbar' => 'Monstrar instrumentario de modification (require JavaScript)',
 'tog-editondblclick' => 'Duple clic pro modificar un pagina (require JavaScript)',
@@ -157,17 +157,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Activar modification de sectiones con clic-a-dextra super lor titulos (require JavaScript)',
 'tog-showtoc' => 'Monstrar tabula de contento (in paginas con plus de 3 sectiones)',
 'tog-rememberpassword' => 'Memorar mi contrasigno in iste navigator (pro un maximo de $1 {{PLURAL:$1|die|dies}})',
-'tog-watchcreations' => 'Adder le paginas que io crea a mi observatorio',
-'tog-watchdefault' => 'Adder le paginas que io modifica a mi observatorio',
-'tog-watchmoves' => 'Adder le paginas que io renomina a mi observatorio',
-'tog-watchdeletion' => 'Adder le paginas que io dele a mi observatorio',
+'tog-watchcreations' => 'Adder le paginas que io crea e le files que io incarga a mi observatorio',
+'tog-watchdefault' => 'Adder le paginas e files que io modifica a mi observatorio',
+'tog-watchmoves' => 'Adder le paginas e files que io renomina a mi observatorio',
+'tog-watchdeletion' => 'Adder le paginas e files que io dele a mi observatorio',
 'tog-minordefault' => 'Marcar omne modificationes initialmente como minor',
 'tog-previewontop' => 'Monstrar previsualisation ante le quadro de modification',
 'tog-previewonfirst' => 'Monstrar previsualisation al prime modification',
 'tog-nocache' => "Disactivar le ''cache'' de paginas in le navigator",
-'tog-enotifwatchlistpages' => 'Notificar me via e-mail quando un pagina in mi observatorio es modificate',
+'tog-enotifwatchlistpages' => 'Notificar me per e-mail quando un pagina o file in mi observatorio es modificate',
 'tog-enotifusertalkpages' => 'Notificar me via e-mail quando mi pagina de discussion es modificate',
-'tog-enotifminoredits' => 'Notificar me etiam de modificationes minor de paginas',
+'tog-enotifminoredits' => 'Notificar me etiam de modificationes minor de paginas e files',
 'tog-enotifrevealaddr' => 'Revelar mi adresse de e-mail in messages de notification',
 'tog-shownumberswatching' => 'Monstrar le numero de usatores que observa le pagina',
 'tog-oldsig' => 'Signatura existente:',
@@ -183,7 +183,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Celar modificationes de usatores registrate in le observatorio',
 'tog-watchlisthideanons' => 'Celar modificationes de usatores anonyme in le observatorio',
 'tog-watchlisthidepatrolled' => 'Celar le modificationes patruliate in le observatorio',
-'tog-nolangconversion' => 'Disactivar conversion de variantes',
 'tog-ccmeonemails' => 'Inviar me copias del messages de e-mail que io invia a altere usatores',
 'tog-diffonly' => 'Non monstrar le contento del pagina sub le comparation de duo versiones',
 'tog-showhiddencats' => 'Monstrar categorias celate',
@@ -407,6 +406,10 @@ $1',
 'youhavenewmessages' => 'Tu ha $1 ($2).',
 'newmessageslink' => 'nove messages',
 'newmessagesdifflink' => 'ultime modification',
+'youhavenewmessagesfromusers' => 'Tu ha $1 de {{PLURAL:$3|un altere usator|$3 usatores}} ($2).',
+'youhavenewmessagesmanyusers' => 'Tu ha $1 de multe usatores ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|un nove message|$1 nove messages}}',
+'newmessagesdifflinkplural' => 'ultime {{PLURAL:$1|modification|modificationes}}',
 'youhavenewmessagesmulti' => 'Tu ha nove messages in $1',
 'editsection' => 'modificar',
 'editold' => 'modificar',
@@ -461,9 +464,9 @@ Un lista de paginas special valide se trova a [[Special:SpecialPages|{{int:speci
 'dberrortext' => 'Un error de syntaxe occurreva durante un consulta del base de datos.
 Isto pote indicar le presentia de un defecto in le software.
 Le ultime consulta que esseva tentate es:
-<blockquote><tt>$1</tt></blockquote>
-effectuate per le function "<tt>$2</tt>".
-Le base de datos retornava le error "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+effectuate per le function "<code>$2</code>".
+Le base de datos retornava le error "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Un error de syntaxe occurreva durante un consulta del base de datos.
 Le ultime consulta que esseva tentate es:
 "$1"
@@ -501,6 +504,8 @@ Per favor reporta isto a un [[Special:ListUsers/sysop|administrator]], faciente
 'cannotdelete' => 'Le pagina o file "$1" non poteva esser delite.
 Es possibile que un altere persona lo ha ja delite.',
 'cannotdelete-title' => 'Non pote deler le pagina "$1"',
+'delete-hook-aborted' => 'Le deletion ha essite abortate per un extension.
+Nulle explication es disponibile.',
 'badtitle' => 'Titulo invalide',
 'badtitletext' => 'Le titulo de pagina requestate es invalide, vacue, o un titulo interlingual o interwiki incorrectemente ligate.
 Es possibile que illo contine un o plure characteres que non pote esser usate in titulos.',
@@ -531,11 +536,13 @@ $2',
 'ns-specialprotected' => 'Le paginas special non es modificabile.',
 'titleprotected' => "Iste titulo ha essite protegite contra creation per [[User:$1|$1]].
 Le motivo specificate es ''$2''.",
-'filereadonlyerror' => 'Impossibile modificar le file "$1" perque le deposito de files "$2" es in modo de lectura sol.
+'filereadonlyerror' => 'Impossibile modificar le file "$1" perque le repositorio de files "$2" es in modo de lectura sol.
 
 Le administrator qui lo blocava offereva iste explication: "$3".',
 'invalidtitle-knownnamespace' => 'Titulo invalide con spatio de nomines "$2" e texto "$3"',
 'invalidtitle-unknownnamespace' => 'Titulo invalide con spatio de nomines incognite $1 e texto "$2"',
+'exception-nologin' => 'Non identificate',
+'exception-nologin-text' => 'Iste pagina o action necessita que tu aperi session in iste wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Configuration incorrecte: programma antivirus non cognoscite: ''$1''",
@@ -556,6 +563,7 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
 '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',
 'yourdomainname' => 'Tu dominio:',
+'password-change-forbidden' => 'Non es possibile cambiar le contrasigno in iste wiki.',
 'externaldberror' => 'O il occurreva un error in le base de datos de authentication, o tu non ha le autorisation de actualisar tu conto externe.',
 'login' => 'Aperir session',
 'nav-login-createaccount' => 'Aperir session / crear conto',
@@ -799,7 +807,7 @@ Per favor entra e valida tu adresse de e-mail per medio de tu [[Special:Preferen
 'nosuchsectiontitle' => 'Section non trovate',
 'nosuchsectiontext' => 'Tu ha tentate modificar un section que non existe.
 Illo pote haber essite displaciate o delite durante que tu legeva le pagina.',
-'loginreqtitle' => 'Identification requirite',
+'loginreqtitle' => 'Identification necessari',
 'loginreqlink' => 'aperir un session',
 'loginreqpagetext' => 'Tu debe $1 pro poter vider altere paginas.',
 'accmailtitle' => 'Contrasigno inviate.',
@@ -820,6 +828,10 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificar iste pagina]</span>.',
 'noarticletext-nopermission' => 'Al momento il non ha texto in iste pagina.
 Tu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente].</span>',
+'missing-revision' => 'Le version №$1 del pagina nominate "{{PAGENAME}}" non existe.
+
+Isto es generalmente causate per sequer un ligamine de historia obsolete a un pagina que ha essite delite.
+Detalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].',
 'userpage-userdoesnotexist' => 'Le conto de usator "<nowiki>$1</nowiki>" non es registrate. Per favor verifica que tu vole crear/modificar iste pagina.',
 'userpage-userdoesnotexist-view' => 'Le conto de usator "$1" non es registrate.',
 'blocked-notice-logextract' => 'Iste usator es actualmente blocate.
@@ -828,7 +840,6 @@ Le ultime entrata del registro de blocadas es reproducite ci infra pro informati
 * '''Firefox / Safari:''' Tenente ''Shift'' clicca ''Reload (Recargar)'', o preme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sur Mac)
 * '''Google Chrome:''' Preme ''Ctrl-Shift-R'' (''⌘-Shift-R'' sur Mac)
 * '''Internet Explorer:''' Tenente ''Ctrl'' clicca ''Refresh (Refrescar)'', o preme ''Ctrl-F5'' 
-* '''Konqueror:''' Clicca ''Reload (Recargar)'' o preme ''F5''
 * '''Opera:''' Vacua le ''cache'' in ''Tools → Preferences (Utensiles → Preferentias)''",
 'usercssyoucanpreview' => "'''Consilio:''' Usa le button \"{{int:showpreview}}\" pro testar tu nove CSS ante de salveguardar lo.",
 'userjsyoucanpreview' => "'''Consilio:''' Usa le button \"{{int:showpreview}}\" pro testar tu nove JavaScript ante de salveguardar lo.",
@@ -914,10 +925,10 @@ Tu pote retornar e modificar un pagina existente, o [[Special:UserLogin|aperir u
 'permissionserrors' => 'Errores de permissiones',
 'permissionserrorstext' => 'Tu non ha le permission de facer isto, pro le sequente {{PLURAL:$1|motivo|motivos}}:',
 'permissionserrorstext-withaction' => 'Tu non ha le permission de $2, pro le sequente {{PLURAL:$1|motivo|motivos}}:',
-'recreate-moveddeleted-warn' => "'''Attention: Tu es super le puncto de recrear un pagina que esseva anteriormente delite.'''
+'recreate-moveddeleted-warn' => "'''Attention: Tu es sur le puncto de recrear un pagina que esseva anteriormente delite.'''
 
 Tu deberea considerar si il es appropriate continuar a modificar iste pagina.
-Le registro de deletiones e de renominationes pro iste pagina se trova infra pro major commoditate:",
+Ecce le registro de deletiones e de renominationes pro iste pagina:",
 'moveddeleted-notice' => 'Iste pagina ha essite delite.
 In basso se revela le registro de deletiones e de modificationes del pagina pro ulterior informationes.',
 'log-fulllog' => 'Vider le registro complete',
@@ -951,6 +962,7 @@ Iste parametros ha essite omittite.",
 'expansion-depth-exceeded-warning' => 'Le profunditate de expansion in iste pagina excede le limite',
 'parser-unstrip-loop-warning' => 'Bucla de "unstrip" detegite',
 'parser-unstrip-recursion-limit' => 'Limite de recursion de "unstrip" excedite ($1)',
+'converter-manual-rule-error' => 'Error detegite in le regula manual de conversion de lingua',
 
 # "Undo" feature
 'undo-success' => 'Le modification pote esser disfacite.
@@ -1141,6 +1153,10 @@ Nota que le uso del ligamines de navigation causara le perdita de tote cambios i
 'editundo' => 'disfacer',
 'diff-multi' => '({{PLURAL:$1|Un version intermedie|$1 versiones intermedie}} facite per {{PLURAL:$2|un usator|$2 usatores}} non es monstrate)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Un version intermedie|$1 versiones intermedie}} facite per plus de $2 {{PLURAL:$2|usator|usatores}} non es monstrate)',
+'difference-missing-revision' => '{{PLURAL:$2|Un version|$2 versiones}} de iste differentia ($1) non ha essite trovate.
+
+Isto es generalmente causate per sequer un ligamine de diff obsolete a un pagina que ha essite delite.
+Detalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].',
 
 # Search results
 'searchresults' => 'Resultatos del recerca',
@@ -1410,6 +1426,7 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'right-writeapi' => 'Uso del API pro modificar le wiki',
 'right-delete' => 'Deler paginas',
 'right-bigdelete' => 'Deler paginas con historias longe',
+'right-deletelogentry' => 'Deler e restaurar specific entratas del registro',
 'right-deleterevision' => 'Deler e restaurar versiones specific de paginas',
 'right-deletedhistory' => 'Vider entratas de historia delite, sin lor texto associate',
 'right-deletedtext' => 'Vider texto delite e differentias inter versiones delite',
@@ -1466,7 +1483,7 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'action-movefile' => 'renominar iste file',
 'action-upload' => 'incargar iste file',
 'action-reupload' => 'superscriber iste file existente',
-'action-reupload-shared' => 'supplantar iste file in un deposito commun',
+'action-reupload-shared' => 'supplantar iste file in un repositorio commun',
 'action-upload_by_url' => 'incargar iste file ab un adresse URL',
 'action-writeapi' => 'usar le API de scriptura',
 'action-delete' => 'deler iste pagina',
@@ -1554,9 +1571,9 @@ Le registro de deletiones e renominationes pro iste pagina es fornite hic pro ma
 Pro vider o cercar files ja incargate, visita le [[Special:FileList|lista de files incargate]]. In ultra, le (re)incargamentos es registrate in le [[Special:Log/upload|registro de incargamentos]], le deletiones in le [[Special:Log/delete|registro de deletiones]].
 
 Pro includer un file in un pagina, usa un ligamine in un del sequente formas:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' pro usar le version complete del file
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternative]]</nowiki></tt>''' pro usar un rendition a latitude de 200 pixel in un quadro in le margine sinistre con 'texto alternative' qua description
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' pro facer un ligamine directe al file sin monstrar le file",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' pro usar le version complete del file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternative]]</nowiki></code>''' pro usar un rendition a latitude de 200 pixel in un quadro in le margine sinistre con 'texto alternative' qua description
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pro facer un ligamine directe al file sin monstrar le file",
 'upload-permitted' => 'Typos de file permittite: $1.',
 'upload-preferred' => 'Typos de file preferite: $1.',
 'upload-prohibited' => 'Typos de file prohibite: $1.',
@@ -1604,26 +1621,26 @@ iste file occupa $2.',
 Isto pote esser debite a un error in le nomine del file.
 Per favor verifica que tu realmente vole incargar iste file.',
 'windows-nonascii-filename' => 'Iste wiki non supporta nomines de file con characteres special.',
-'fileexists' => "Un file con iste nomine existe ja.
-Per favor verifica '''<tt>[[:$1]]</tt>''' si tu non es secur de voler cambiar lo.
-[[$1|thumb]]",
-'filepageexists' => "Le pagina de description correspondente a iste file ha ja essite create a '''<tt>[[:$1]]</tt>''', ma nulle file con iste nomine existe al momento.
+'fileexists' => 'Un file con iste nomine existe ja.
+Per favor verifica <strong>[[:$1]]</strong> si tu non es secur de voler cambiar lo.
+[[$1|thumb]]',
+'filepageexists' => 'Le pagina de description correspondente a iste file ha ja essite create a <strong>[[:$1]]</strong>, ma nulle file con iste nomine existe al momento.
 Le summario que tu entra non apparera in le pagina de description.
 Si tu vole que illo appare, tu debe inserer lo manualmente.
-[[$1|thumb]]",
-'fileexists-extension' => "Un file con un nomine similar existe ja: [[$2|thumb]]
-* Nomine del file a incargar: '''<tt>[[:$1]]</tt>'''
-* Nomine del file existente: '''<tt>[[:$2]]</tt>'''
-Per favor selige un altere nomine.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Un file con un nomine similar existe ja: [[$2|thumb]]
+* Nomine del file a incargar: <strong>[[:$1]]</strong>
+* Nomine del file existente: <strong>[[:$2]]</strong>
+Per favor selige un altere nomine.',
 'fileexists-thumbnail-yes' => "Iste file pare esser un imagine a grandor reducite ''(miniatura)''. [[$1|thumb]]
-Per favor verifica le file '''<tt>[[:$1]]</tt>'''.
+Per favor verifica le file <strong>[[:$1]]</strong>.
 Si le file verificate es le mesme imagine a grandor original, non es necessari incargar un miniatura additional.",
-'file-thumbnail-no' => "Le nomine del file comencia con '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Le nomine del file comencia con <strong>$1</strong>.
 Illo pare esser un imagine a grandor reducite ''(miniatura)''.
 Si tu possede iste imagine in plen resolution, incarga lo, alteremente cambia le nomine del file per favor.",
 'fileexists-forbidden' => 'Un file con iste nomine existe ja, e non pote esser superscribite.
 Si tu vole ancora incargar iste file, per favor retorna e usa un nove nomine. [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Un file con iste nomine existe ja in le deposito de files commun.
+'fileexists-shared-forbidden' => 'Un file con iste nomine existe ja in le repositorio de files commun.
 Si tu vole totevia incargar iste file, per favor retorna e usa un nove nomine. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Iste file es un duplicato del sequente {{PLURAL:$1|file|files}}:',
 'file-deleted-duplicate' => 'Un file identic a iste file ([[:$1]]) esseva ja delite anteriormente. Tu deberea verificar le registro de deletiones concernente iste file ante de re-incargar lo.',
@@ -1729,6 +1746,7 @@ Si le problema persiste, contacta un [[Special:ListUsers/sysop|administrator]].'
 'lockmanager-fail-releaselock' => 'Non poteva liberar le file de serratura pro "$1".',
 'lockmanager-fail-db-bucket' => 'Non poteva contactar sufficiente bases de datos de serratura in situla $1.',
 'lockmanager-fail-db-release' => 'Non poteva liberar le serraturas sur le base de datos $1.',
+'lockmanager-fail-svr-acquire' => 'Non poteva acquirer le serraturas sur le servitor $1.',
 'lockmanager-fail-svr-release' => 'Non poteva liberar le serraturas sur le servitor $1.',
 
 # ZipDirectoryReader
@@ -1847,7 +1865,8 @@ Tu vole forsan modificar le description in le [$2 pagina de description del file
 'filepage-nofile-link' => 'Nulle file con iste nomine existe, ma tu pote [$1 incargar lo].',
 'uploadnewversion-linktext' => 'Incargar un nove version de iste file',
 'shared-repo-from' => 'ab $1',
-'shared-repo' => 'un deposito pro uso in commun',
+'shared-repo' => 'un repositorio partite',
+'upload-disallowed-here' => 'Infortunatemente tu non pote superscriber iste imagine.',
 
 # File reversion
 'filerevert' => 'Reverter $1',
@@ -1882,7 +1901,7 @@ Tu vole forsan modificar le description in le [$2 pagina de description del file
 # MIME search
 'mimesearch' => 'Recerca de typo MIME',
 'mimesearch-summary' => 'Iste pagina permitte filtrar le files a base de lor typos MIME.
-Syntaxe: typo/subtypo, p.ex. <tt>image/jpeg</tt>.',
+Syntaxe: typo/subtypo, p.ex. <code>image/jpeg</code>.',
 'mimetype' => 'Typo MIME:',
 'download' => 'discargar',
 
@@ -1929,9 +1948,9 @@ Memora verificar que non existe altere ligamines al patronos ante que tu los del
 
 'disambiguations' => 'Paginas con ligamines a paginas de disambiguation',
 'disambiguationspage' => 'Template:Disambiguation',
-'disambiguations-text' => "Le sequente paginas ha ligamines a un '''pagina de disambiguation'''.
-Istes deberea esser reimplaciate con ligamines al topicos appropriate.<br />
-Un pagina se tracta como pagina de disambiguation si illo usa un patrono al qual [[MediaWiki:Disambiguationspage]] ha un ligamine.",
+'disambiguations-text' => "Le sequente paginas contine al minus un ligamine a un '''pagina de disambiguation'''.
+Istes debe forsan ligar directemente al articulo sur le thema in question.<br />
+Un pagina se tracta como pagina de disambiguation si illo usa un patrono que es ligate ab [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Redirectiones duple',
 'doubleredirectstext' => 'Iste pagina lista paginas de redirection verso altere paginas de redirection.
@@ -1956,6 +1975,7 @@ Le entratas <del>cancellate</del> ha essite resolvite.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categoria|categorias}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|ligamine|ligamines}}',
 'nmembers' => '$1 {{PLURAL:$1|membro|membros}}',
 'nrevisions' => '$1 {{PLURAL:$1|version|versiones}}',
@@ -1976,14 +1996,15 @@ Le entratas <del>cancellate</del> ha essite resolvite.',
 'wantedpages' => 'Paginas plus demandate',
 'wantedpages-badtitle' => 'Titulo invalide in le gruppo de resultatos: $1',
 'wantedfiles' => 'Files desirate',
-'wantedfiletext-cat' => 'Le sequente files es usate ma non existe. Le files ab depositos distante pote esser listate malgrado que illos existe. Omne tal false positives essera <del>cancellate</del>. In addition, paginas que incorpora files que non existe es listate in [[:$1]].',
-'wantedfiletext-nocat' => 'Le sequente files es usate ma non existe. Files ab depositos distante pote esser listate malgrado que illos existe. Omne tal false positives essera <del>cancellate</del>.',
+'wantedfiletext-cat' => 'Le sequente files es usate ma non existe. Le files ab repositorios externe pote esser listate malgrado que illos existe. Omne tal false positivos essera <del>cancellate</del>. In addition, paginas que incorpora files que non existe es listate in [[:$1]].',
+'wantedfiletext-nocat' => 'Le sequente files es usate ma non existe. Files ab repositorios externe pote esser listate malgrado que illos existe. Omne tal false positivos essera <del>cancellate</del>.',
 'wantedtemplates' => 'Patronos desirate',
 'mostlinked' => 'Paginas le plus ligate',
 'mostlinkedcategories' => 'Categorias le plus ligate',
 'mostlinkedtemplates' => 'Patronos le plus utilisate',
 'mostcategories' => 'Paginas con le plus categorias',
 'mostimages' => 'Files le plus utilisate',
+'mostinterwikis' => 'Paginas con le plus interwikis',
 'mostrevisions' => 'Paginas le plus modificate',
 'prefixindex' => 'Tote le paginas con prefixo',
 'prefixindex-namespace' => 'Tote le paginas con prefixo (spatio de nomines $1)',
@@ -2085,7 +2106,7 @@ Vide etiam le [[Special:WantedCategories|categorias desirate]].',
 'linksearch-ok' => 'Cercar',
 'linksearch-text' => 'Es possibile usar metacharacteres como in "*.wikipedia.org".
 Necessita al minus un dominio de nivello superior, per exemplo "*.org".<br />
-Protocollos supportate: <tt>$1</tt> (non include alcun de istes in tu recerca).',
+Protocollos supportate: <code>$1</code> (non include alcun de istes in tu recerca).',
 'linksearch-line' => '$1 ligate ab $2',
 'linksearch-error' => 'Le metacharacteres pote apparer solmente al initio del nomine de host.',
 
@@ -2133,6 +2154,8 @@ Il pote haber [[{{MediaWiki:Listgrouprights-helppage}}|informationes additional]
 e haber un adresse de e-mail valide in tu [[Special:Preferences|preferentias]]
 pro inviar e-mail a altere usatores.',
 'emailuser' => 'Inviar e-mail a iste usator',
+'emailuser-title-target' => 'Inviar e-mail a iste {{GENDER:$1|usator|usatrice}}',
+'emailuser-title-notarget' => 'Inviar e-mail al usator',
 'emailpage' => 'Inviar e-mail al usator',
 'emailpagetext' => 'Le formulario infra es pro inviar un message de e-mail a iste usator.
 Le adresse de e-mail que tu indicava in [[Special:Preferences|tu preferentias de usator]] apparera
@@ -2283,6 +2306,8 @@ procede con caution.',
 'rollback' => 'Revocar modificationes',
 'rollback_short' => 'Revocar',
 'rollbacklink' => 'revocar',
+'rollbacklinkcount' => 'revocar $1 {{PLURAL:$1|modification|modificationes}}',
+'rollbacklinkcount-morethan' => 'revocar plus de $1 {{PLURAL:$1|modification|modificationes}}',
 'rollbackfailed' => 'Revocation fallite',
 'cantrollback' => 'Impossibile revocar le modification;
 le ultime contributor es le sol autor de iste pagina.',
@@ -2690,7 +2715,7 @@ Per favor selige un altere nomine.',
 'talkexists' => "'''Le pagina mesme ha essite renominate con successo, ma su pagina de discussion non poteva esser renominate proque il ja existe un con le nove titulo.
 Per favor fusiona los manualmente.'''",
 'movedto' => 'renominate a',
-'movetalk' => 'Renominar etiam su pagina de discussion',
+'movetalk' => 'Renominar le pagina de discussion associate',
 'move-subpages' => 'Renominar le subpaginas (usque a $1)',
 'move-talk-subpages' => 'Renominar le subpaginas del pagina de discussion (usque a $1)',
 'movepage-page-exists' => 'Le pagina $1 existe ja e non pote esser automaticamente superscribite.',
@@ -2726,8 +2751,8 @@ non pote renominar un pagina al mesme titulo.',
 'protectedpagemovewarning' => "'''Attention:''' Iste pagina ha essite protegite de sorta que solmente usatores con privilegios de administrator pote renominar lo. Le ultime entrata del registro es fornite hic infra pro referentia:",
 'semiprotectedpagemovewarning' => "'''Nota:''' Iste pagina ha essite protegite de sorta que solmente usatores registrate pote renominar lo. Le ultime entrata del registro es fornite hic infra pro referentia:",
 'move-over-sharedrepo' => '== File existe ==
-[[:$1]] existe ja in un deposito usate in commun. Si tu renomina le file a iste titulo, illo supplantara le file del deposito.',
-'file-exists-sharedrepo' => 'Le nomine de file seligite es ja in uso in un deposito usate in commun.
+[[:$1]] existe in un repositorio partite. Si le file es renominate a iste titulo, illo supplantara le file partite.',
+'file-exists-sharedrepo' => 'Le nomine de file seligite es ja in uso in un repositorio partite.
 Per favor selige un altere nomine.',
 
 # Export
@@ -2794,6 +2819,7 @@ Tote le actiones de importation transwiki se registra in le [[Special:Log/import
 'import-interwiki-templates' => 'Includer tote le patronos',
 'import-interwiki-submit' => 'Importar',
 'import-interwiki-namespace' => 'Spatio de nomines de destination:',
+'import-interwiki-rootpage' => 'Pagina radice de destination (optional):',
 'import-upload-filename' => 'Nomine del file:',
 'import-comment' => 'Commento:',
 'importtext' => 'Per favor exporta le file del wiki de origine con le [[Special:Export|facilitate de exportation]].
@@ -2821,11 +2847,14 @@ Salveguarda lo in tu computator e incarga lo hic.',
 'import-upload' => 'Incargar datos XML',
 'import-token-mismatch' => 'Perdita del datos del session. Per favor reprova.',
 'import-invalid-interwiki' => 'Non pote importar ab le wiki specificate.',
-'import-error-edit' => 'Le pagina "$1" non es importate proque tu non ha le permission de modificar lo.',
-'import-error-create' => 'Le pagina "$1" non es importate proque tu non ha le permission de crear lo.',
+'import-error-edit' => 'Le pagina "$1" non es importate perque tu non ha le permission de modificar lo.',
+'import-error-create' => 'Le pagina "$1" non es importate perque tu non ha le permission de crear lo.',
 'import-error-interwiki' => 'Le pagina "$1" non es importate perque su nomine es reservate pro ligation externe (interwiki).',
 'import-error-special' => 'Le pagina "$1" non es importate perque illo pertine a un spatio de nomines special que non permitte paginas.',
 'import-error-invalid' => 'Le pagina "$1" non es importate perque su nomine es invalide.',
+'import-options-wrong' => 'Mal {{PLURAL:$2|option|optiones}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Le pagina radice specificate es un titulo invalide.',
+'import-rootpage-nosubpage' => 'Le spatio de nomines "$1" del pagina radice non permitte subpaginas.',
 
 # Import log
 'importlogpage' => 'Registro de importationes',
@@ -2970,16 +2999,34 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 
 # Info page
 'pageinfo-title' => 'Informationes pro "$1"',
-'pageinfo-header-edits' => 'Modificationes',
-'pageinfo-header-watchlist' => 'Observatorio',
-'pageinfo-header-views' => 'Visitas',
-'pageinfo-subjectpage' => 'Pagina',
-'pageinfo-talkpage' => 'Discussion',
-'pageinfo-watchers' => 'Numero de observatores',
-'pageinfo-edits' => 'Numero de modificationes',
-'pageinfo-authors' => 'Numero de autores distincte',
+'pageinfo-header-basic' => 'Information de base',
+'pageinfo-header-edits' => 'Historia de modificationes',
+'pageinfo-header-restrictions' => 'Protection del pagina',
+'pageinfo-header-properties' => 'Proprietates del pagina',
+'pageinfo-display-title' => 'Titulo monstrate',
+'pageinfo-default-sort' => 'Clave de ordination predefinite',
+'pageinfo-length' => 'Dimension del pagina (in bytes)',
+'pageinfo-article-id' => 'ID del pagina',
+'pageinfo-robot-policy' => 'Stato del motor de recerca',
+'pageinfo-robot-index' => 'Indexabile',
+'pageinfo-robot-noindex' => 'Non indexabile',
 'pageinfo-views' => 'Numero de visitas',
-'pageinfo-viewsperedit' => 'Visitas per modification',
+'pageinfo-watchers' => 'Numero de observatores del pagina',
+'pageinfo-redirects-name' => 'Redirectiones verso iste pagina',
+'pageinfo-subpages-name' => 'Subpaginas de iste pagina',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirection|redirectiones}}; $3 {{PLURAL:$3|non-redirection|non-redirectiones}})',
+'pageinfo-firstuser' => 'Creator del pagina',
+'pageinfo-firsttime' => 'Data de creation del pagina',
+'pageinfo-lastuser' => 'Ultime contributor',
+'pageinfo-lasttime' => 'Data del ultime modification',
+'pageinfo-edits' => 'Numero total de modificationes',
+'pageinfo-authors' => 'Numero total de autores distincte',
+'pageinfo-recent-edits' => 'Numero de modificationes recente (intra le ultime $1)',
+'pageinfo-recent-authors' => 'Numero de autores distincte recente',
+'pageinfo-restriction' => 'Protection del pagina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Parola|Parolas}} magic ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria|Categorias}} celate ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Patrono|Patronos}} transcludite ($1)',
 
 # Skin names
 'skinname-standard' => 'Classic',
@@ -3033,6 +3080,7 @@ Le execution de illo pote compromitter le securitate de tu systema.",
 'file-info-size-pages' => '$1 × $2 pixels, dimension del file: $3, typo MIME: $4, $5 {{PLURAL:$5|pagina|paginas}}',
 'file-nohires' => 'Non disponibile in resolution plus alte.',
 'svg-long-desc' => 'File SVG, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
+'svg-long-desc-animated' => 'File SVG animate, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
 'show-big-image' => 'Plen resolution',
 'show-big-image-preview' => ' Dimension de iste previsualisation: $1.',
 'show-big-image-other' => 'Altere {{PLURAL:$2|resolution|resolutiones}}: $1.',
@@ -3042,6 +3090,8 @@ Le execution de illo pote compromitter le securitate de tu systema.",
 'file-info-png-looped' => 'repetente',
 'file-info-png-repeat' => 'repetite $1 {{PLURAL:$1|vice|vices}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|photogramma|photogrammas}}',
+'file-no-thumb-animation' => "'''Note: A causa de limitationes technic, le miniaturas de iste file non essera animate.'''",
+'file-no-thumb-animation-gif' => "'''Nota: A causa de limitationes technic, le miniaturas de imagines GIF in alte resolution como iste non essera animate.'''",
 
 # Special:NewFiles
 'newimages' => 'Galeria de nove files',
@@ -3372,7 +3422,7 @@ Le alteres essera initialmente celate.
 'exif-whitebalance-1' => 'Balancia de blanc manual',
 
 'exif-scenecapturetype-0' => 'Standard',
-'exif-scenecapturetype-1' => 'Panorama',
+'exif-scenecapturetype-1' => 'Paisage',
 'exif-scenecapturetype-2' => 'Portrait',
 'exif-scenecapturetype-3' => 'Scena nocturne',
 
@@ -3846,9 +3896,12 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
 'api-error-empty-file' => 'Le file que tu submitteva es vacue.',
 'api-error-emptypage' => 'Le creation de nove paginas vacue non es permittite.',
 'api-error-fetchfileerror' => 'Error interne: qualcosa errava durante le obtention del file.',
+'api-error-fileexists-forbidden' => 'Un file con le nomine "$1" jam existe, e non pote esser superscribite.',
+'api-error-fileexists-shared-forbidden' => 'Un file con le nomine "$1" jam existe in le repositorio commun de files, e non pote esser superscribite.',
 'api-error-file-too-large' => 'Le file que tu submitteva es troppo grande.',
 'api-error-filename-tooshort' => 'Le nomine del file es troppo curte.',
 'api-error-filetype-banned' => 'Iste typo de file es prohibite.',
+'api-error-filetype-banned-type' => '$1 non es {{PLURAL:$4|un typo|typos}} de file permittite. Le {{PLURAL:$3|typo|typos}} de file permittite es $2.',
 'api-error-filetype-missing' => 'Le nomine del file non ha un extension.',
 'api-error-hookaborted' => 'Le modification que tu ha tentate facer ha essite abortate per un extension.',
 'api-error-http' => 'Error interne: impossibile connecter al servitor.',
index 7394dda..ff96cb3 100644 (file)
@@ -74,144 +74,144 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ALIH', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__TANPADAFTARISI__', '__NIRDASI__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__TANPAGALERI__', '__NIRGAL__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__PAKSADAFTARISI__', '__PAKSADASI__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__DAFTARISI__', '__DASI__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__TANPASUNTINGANBAGIAN__', '__NIRSUBA__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__TANPAKEPALA__', '__NIRLA__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'BULANKINI', 'BULANKINI2', 'BUKIN', 'BUKIN2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'BULANKINI1', 'BUKIN1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NAMABULANKINI', 'NAMBUKIN', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'NAMAJENDERBULANKINI', 'NAMJENBUKIN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'NAMASINGKATBULANKINI', 'BULANINISINGKAT', 'NAMSINGBUKIN', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'HARIKINI', 'HARKIN', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'HARIKINI2', 'HARKIN2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NAMAHARIKINI', 'NAMHARKIN', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'TAHUNKINI', 'TAKIN', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'WAKTUKINI', 'WAKIN', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'JAMKINI', 'JAKIN', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'BULANLOKAL', 'BULANLOKAL2', 'BULOK', 'BULOK2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'BULANLOKAL1', 'BULOK1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'NAMABULANLOKAL', 'NAMBULOK', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'NAMAJENDERBULANLOKAL', 'NAMJENBULOK', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'NAMASINGKATBULANLOKAL', 'NAMSINGBULOK', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'HARILOKAL', 'HALOK', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'HARILOKAL2', 'HALOK2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NAMAHARILOKAL', 'NAMHALOK', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'TAHUNLOKAL', 'TALOK', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'WAKTULOKAL', 'WALOK', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'JAMLOKAL', 'JALOK', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'JUMLAHHALAMAN', 'JUMMAN', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'JUMLAHARTIKEL', 'JUMKEL', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'JUMLAHBERKAS', 'JUMKAS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'JUMLAHPENGGUNA', 'JUMPENG', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'JUMLAHPENGGUNAAKTIF', 'JUMPENGTIF', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'JUMLAHSUNTINGAN', 'JUMTING', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'JUMLAHTAMPILAN', 'JUMTAM', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'NAMAHALAMAN', 'NAMMAN', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NAMAHALAMANE', 'NAMMANE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'RUANGNAMA', 'RUNAM', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'RUANGNAMAE', 'RUNAME', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'RUANGBICARA', 'RUBIR', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'RUANGBICARAE', 'RUBIRE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'RUANGUTAMA', 'RUANGARTIKEL', 'RUTAMA', 'RUTIKEL', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'RUANGUTAMAE', 'RUANGARTIKELE', 'RUTAMAE', 'RUKELE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'NAMAHALAMANLENGKAP', 'NAMALENGKAPHALAMAN', 'NAMMANKAP', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'AMAHALAMANLENGKAPE', 'NAMALENGKAPHALAMANE', 'NAMMANKAPE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NAMASUBHALAMAN', 'NAMAUPAHALAMAN', 'NAMUMAN', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NAMASUBHALAMANE', 'NAMAUPAHALAMANE', 'NAMUMANE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NAMAHALAMANDASAR', 'NAMADASARHALAMAN', 'NAMMANSAR', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NAMAHALAMANDASARE', 'NAMADASARHALAMANE', 'NAMMANSARE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NAMAHALAMANBICARA', 'NAMMANBIR', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NAMAHALAMANBICARAE', 'NAMMANBIRE', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NAMAHALAMANUTAMA', 'NAMAHALAMANARTIKEL', 'NAMMANTAMA', 'NAMMANTIKEL', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NAMAHALAMANUTAMAE', 'NAMAHALAMANARTIKELE', 'NAMMANTAMAE', 'NAMMANTIKELE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'PSN:', 'PESAN:', 'MSG:' ),
-       'subst'                   => array( '0', 'GNT:', 'GANTI:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'TPL:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'jmpl', 'jempol', 'mini', 'miniatur', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'jmpl=$1', 'jempol=$1', 'mini=$1', 'miniatur=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'ka', 'kanan', 'right' ),
-       'img_left'                => array( '1', 'ki', 'kiri', 'left' ),
-       'img_none'                => array( '1', 'nir', 'tanpa', 'none' ),
-       'img_center'              => array( '1', 'pus', 'pusat', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'bing', 'bingkai', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'nirbing', 'tanpabingkai', 'frameless' ),
-       'img_page'                => array( '1', 'hal=$1', 'halaman=$1', 'hal $1', 'halaman $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'lurus', 'lurus=$1', 'lurus $1', 'tegak', 'tegak=$1', 'tegak $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'tepi', 'batas', 'border' ),
-       'img_baseline'            => array( '1', 'gada', 'garis_dasar', 'baseline' ),
-       'img_sub'                 => array( '1', 'upa', 'sub' ),
-       'img_top'                 => array( '1', 'atas', 'top' ),
-       'img_text_top'            => array( '1', 'atek', 'atas-teks', 'text-top' ),
-       'img_middle'              => array( '1', 'tengah', 'middle' ),
-       'img_bottom'              => array( '1', 'bawah', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'batek', 'bawah-teks', 'text-bottom' ),
-       'img_link'                => array( '1', 'pra=$1', 'pranala=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'al=$1', 'alternatif=$1', 'alt=$1' ),
-       'sitename'                => array( '1', 'NAMASITUS', 'NAMSIT', 'SITENAME' ),
-       'ns'                      => array( '0', 'RN:', 'RUNAM:', 'NS:' ),
-       'localurl'                => array( '0', 'URLLOKAL', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URLLOKALE', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'PELADEN', 'SERVER' ),
-       'servername'              => array( '0', 'NAMAPELADEN', 'NAMASERVER', 'NAMPEL', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'LOKASISKRIP', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'TATABAHASA', 'TASA', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'JANTINA', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__TANPAKONVERSIJUDUL__', '__NIRKODUL__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__TANPAKONVERSIISI__', '__NIRKOSI__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'MINGGUKINI', 'MIKIN', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'HARIDALAMMINGGU', 'HADAMI', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'MINGGULOKAL', 'MIKAL', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'HARIDALAMMINGGULOKAL', 'HADAMIKAL', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDREVISI', 'IREV', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'HARIREVISI', 'HAREV', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'HARIREVISI2', 'HAREV2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'BULANREVISI', 'BUREV', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'BULANREVISI1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'TAHUNREVISI', 'TAREV', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'STEMPELWAKTUREVISI', 'REKAMWAKTUREVISI', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'PENGGUNAREVISI', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'JAMAK:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'URLLENGKAP:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLLENGKAPE', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'AKC:', 'AWALKECIL:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ABS:', 'AWALBESAR:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'KC:', 'KECIL:', 'HURUFKECIL:', 'LC:' ),
-       'uc'                      => array( '0', 'BS:', 'BESAR:', 'HURUFBESAR:', 'UC:' ),
-       'raw'                     => array( '0', 'MENTAH:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'JUDULTAMPILAN', 'JUTAM', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'M', 'R' ),
-       'newsectionlink'          => array( '1', '__PRANALABAGIANBARU__', '__PRABABA__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '_TANPAPRANALABAGIANBARU__', '__NIRPRABABA__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'VERSIKINI', 'VERKIN', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'KODEURL:', 'KODU:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'KODEJANGKAR', 'KOJANG', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'STEMPELWAKTUKINI', 'STEMWAKIN', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'STEMPELWAKTULOKAL', 'STEMWAKAL', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'MARKAARAH', 'MARRAH', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#BAHASA:', '#BHS:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'BAHASAISI', 'BHSISI', 'BASI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'HALAMANDIRUANGNAMA:', 'HALDIRN', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'JUMLAHADMIN', 'JUMLAHPENGURUS', 'JUMAD', 'JURUS', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMATANGKA', 'FORANG', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ISIKIRI', 'IKI', 'PADLEFT' ),
-       'padright'                => array( '0', 'ISIKANAN', 'IKA', 'PADRIGHT' ),
-       'special'                 => array( '0', 'istimewa', 'spesial', 'special' ),
-       'defaultsort'             => array( '1', 'URUTANBAKU:', 'UBUR:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'LOKASIBERKAS:', 'LOBER:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'kata_kunci', 'takun', 'tag' ),
-       'hiddencat'               => array( '1', '__KATEGORITERSEMBUNYI__', '__KATSEM__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'HALAMANDIKATEGORI', 'HALDIKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'BESARHALAMAN', 'BESMAN', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEKS__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__TANPAINDEKS__', '__NIRDEKS__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'JUMLAHDIKELOMPOK', 'JULDIPOK', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__PENGALIHANSTATIK__', '__PENGALIHANSTATIS__', '__PETIK__', '__PETIS__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'TINGKATPERLINDUNGAN', 'TIPER', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'formattanggal', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#ALIH', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__TANPADAFTARISI__', '__NIRDASI__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__TANPAGALERI__', '__NIRGAL__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__PAKSADAFTARISI__', '__PAKSADASI__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__DAFTARISI__', '__DASI__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__TANPASUNTINGANBAGIAN__', '__NIRSUBA__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__TANPAKEPALA__', '__NIRLA__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'BULANKINI', 'BULANKINI2', 'BUKIN', 'BUKIN2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'BULANKINI1', 'BUKIN1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NAMABULANKINI', 'NAMBUKIN', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'NAMAJENDERBULANKINI', 'NAMJENBUKIN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'NAMASINGKATBULANKINI', 'BULANINISINGKAT', 'NAMSINGBUKIN', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'HARIKINI', 'HARKIN', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'HARIKINI2', 'HARKIN2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NAMAHARIKINI', 'NAMHARKIN', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'TAHUNKINI', 'TAKIN', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'WAKTUKINI', 'WAKIN', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'JAMKINI', 'JAKIN', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'BULANLOKAL', 'BULANLOKAL2', 'BULOK', 'BULOK2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'BULANLOKAL1', 'BULOK1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'NAMABULANLOKAL', 'NAMBULOK', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'NAMAJENDERBULANLOKAL', 'NAMJENBULOK', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'NAMASINGKATBULANLOKAL', 'NAMSINGBULOK', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'HARILOKAL', 'HALOK', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'HARILOKAL2', 'HALOK2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NAMAHARILOKAL', 'NAMHALOK', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'TAHUNLOKAL', 'TALOK', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'WAKTULOKAL', 'WALOK', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'JAMLOKAL', 'JALOK', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'JUMLAHHALAMAN', 'JUMMAN', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'JUMLAHARTIKEL', 'JUMKEL', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'JUMLAHBERKAS', 'JUMKAS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'JUMLAHPENGGUNA', 'JUMPENG', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'JUMLAHPENGGUNAAKTIF', 'JUMPENGTIF', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'JUMLAHSUNTINGAN', 'JUMTING', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'JUMLAHTAMPILAN', 'JUMTAM', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'NAMAHALAMAN', 'NAMMAN', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NAMAHALAMANE', 'NAMMANE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'RUANGNAMA', 'RUNAM', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'RUANGNAMAE', 'RUNAME', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'RUANGBICARA', 'RUBIR', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'RUANGBICARAE', 'RUBIRE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'RUANGUTAMA', 'RUANGARTIKEL', 'RUTAMA', 'RUTIKEL', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'RUANGUTAMAE', 'RUANGARTIKELE', 'RUTAMAE', 'RUKELE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NAMAHALAMANLENGKAP', 'NAMALENGKAPHALAMAN', 'NAMMANKAP', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'AMAHALAMANLENGKAPE', 'NAMALENGKAPHALAMANE', 'NAMMANKAPE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NAMASUBHALAMAN', 'NAMAUPAHALAMAN', 'NAMUMAN', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NAMASUBHALAMANE', 'NAMAUPAHALAMANE', 'NAMUMANE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NAMAHALAMANDASAR', 'NAMADASARHALAMAN', 'NAMMANSAR', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NAMAHALAMANDASARE', 'NAMADASARHALAMANE', 'NAMMANSARE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NAMAHALAMANBICARA', 'NAMMANBIR', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NAMAHALAMANBICARAE', 'NAMMANBIRE', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NAMAHALAMANUTAMA', 'NAMAHALAMANARTIKEL', 'NAMMANTAMA', 'NAMMANTIKEL', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NAMAHALAMANUTAMAE', 'NAMAHALAMANARTIKELE', 'NAMMANTAMAE', 'NAMMANTIKELE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'PSN:', 'PESAN:', 'MSG:' ),
+       'subst'                     => array( '0', 'GNT:', 'GANTI:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'TPL:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'jmpl', 'jempol', 'mini', 'miniatur', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'jmpl=$1', 'jempol=$1', 'mini=$1', 'miniatur=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'ka', 'kanan', 'right' ),
+       'img_left'                  => array( '1', 'ki', 'kiri', 'left' ),
+       'img_none'                  => array( '1', 'nir', 'tanpa', 'none' ),
+       'img_center'                => array( '1', 'pus', 'pusat', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'bing', 'bingkai', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'nirbing', 'tanpabingkai', 'frameless' ),
+       'img_page'                  => array( '1', 'hal=$1', 'halaman=$1', 'hal $1', 'halaman $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'lurus', 'lurus=$1', 'lurus $1', 'tegak', 'tegak=$1', 'tegak $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'tepi', 'batas', 'border' ),
+       'img_baseline'              => array( '1', 'gada', 'garis_dasar', 'baseline' ),
+       'img_sub'                   => array( '1', 'upa', 'sub' ),
+       'img_top'                   => array( '1', 'atas', 'top' ),
+       'img_text_top'              => array( '1', 'atek', 'atas-teks', 'text-top' ),
+       'img_middle'                => array( '1', 'tengah', 'middle' ),
+       'img_bottom'                => array( '1', 'bawah', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'batek', 'bawah-teks', 'text-bottom' ),
+       'img_link'                  => array( '1', 'pra=$1', 'pranala=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'al=$1', 'alternatif=$1', 'alt=$1' ),
+       'sitename'                  => array( '1', 'NAMASITUS', 'NAMSIT', 'SITENAME' ),
+       'ns'                        => array( '0', 'RN:', 'RUNAM:', 'NS:' ),
+       'localurl'                  => array( '0', 'URLLOKAL', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URLLOKALE', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'PELADEN', 'SERVER' ),
+       'servername'                => array( '0', 'NAMAPELADEN', 'NAMASERVER', 'NAMPEL', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'LOKASISKRIP', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'TATABAHASA', 'TASA', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'JANTINA', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__TANPAKONVERSIJUDUL__', '__NIRKODUL__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__TANPAKONVERSIISI__', '__NIRKOSI__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'MINGGUKINI', 'MIKIN', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'HARIDALAMMINGGU', 'HADAMI', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'MINGGULOKAL', 'MIKAL', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'HARIDALAMMINGGULOKAL', 'HADAMIKAL', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDREVISI', 'IREV', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'HARIREVISI', 'HAREV', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'HARIREVISI2', 'HAREV2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'BULANREVISI', 'BUREV', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'BULANREVISI1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'TAHUNREVISI', 'TAREV', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'STEMPELWAKTUREVISI', 'REKAMWAKTUREVISI', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'PENGGUNAREVISI', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'JAMAK:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'URLLENGKAP:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLLENGKAPE', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'AKC:', 'AWALKECIL:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ABS:', 'AWALBESAR:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'KC:', 'KECIL:', 'HURUFKECIL:', 'LC:' ),
+       'uc'                        => array( '0', 'BS:', 'BESAR:', 'HURUFBESAR:', 'UC:' ),
+       'raw'                       => array( '0', 'MENTAH:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'JUDULTAMPILAN', 'JUTAM', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'M', 'R' ),
+       'newsectionlink'            => array( '1', '__PRANALABAGIANBARU__', '__PRABABA__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '_TANPAPRANALABAGIANBARU__', '__NIRPRABABA__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VERSIKINI', 'VERKIN', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'KODEURL:', 'KODU:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'KODEJANGKAR', 'KOJANG', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'STEMPELWAKTUKINI', 'STEMWAKIN', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'STEMPELWAKTULOKAL', 'STEMWAKAL', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'MARKAARAH', 'MARRAH', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#BAHASA:', '#BHS:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'BAHASAISI', 'BHSISI', 'BASI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'HALAMANDIRUANGNAMA:', 'HALDIRN', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'JUMLAHADMIN', 'JUMLAHPENGURUS', 'JUMAD', 'JURUS', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMATANGKA', 'FORANG', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ISIKIRI', 'IKI', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ISIKANAN', 'IKA', 'PADRIGHT' ),
+       'special'                   => array( '0', 'istimewa', 'spesial', 'special' ),
+       'defaultsort'               => array( '1', 'URUTANBAKU:', 'UBUR:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'LOKASIBERKAS:', 'LOBER:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'kata_kunci', 'takun', 'tag' ),
+       'hiddencat'                 => array( '1', '__KATEGORITERSEMBUNYI__', '__KATSEM__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'HALAMANDIKATEGORI', 'HALDIKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'BESARHALAMAN', 'BESMAN', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEKS__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__TANPAINDEKS__', '__NIRDEKS__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'JUMLAHDIKELOMPOK', 'JULDIPOK', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__PENGALIHANSTATIK__', '__PENGALIHANSTATIS__', '__PETIK__', '__PETIS__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'TINGKATPERLINDUNGAN', 'TIPER', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'formattanggal', 'formatdate', 'dateformat' ),
 );
 
 $specialPageAliases = array(
@@ -377,7 +377,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Sembunyikan suntingan pengguna masuk log di daftar pantauan',
 'tog-watchlisthideanons' => 'Sembunyikan suntingan pengguna anonim di daftar pantauan',
 'tog-watchlisthidepatrolled' => 'Sembunyikan suntingan terpatroli di daftar pantauan',
-'tog-nolangconversion' => 'Matikan konversi varian',
 'tog-ccmeonemails' => 'Kirimkan saya salinan surel yang saya kirimkan ke orang lain',
 'tog-diffonly' => 'Jangan tampilkan isi halaman di bawah perbedaan suntingan',
 'tog-showhiddencats' => 'Tampilkan kategori tersembunyi',
@@ -721,6 +720,8 @@ Alasan yang diberikan adalah ''$2''.",
 Administrator yang terkunci menawarkan penjelasan ini: " $3 ".',
 'invalidtitle-knownnamespace' => 'Judul yang tidak sah dengan ruangnama "$2" dan teks "$3"',
 'invalidtitle-unknownnamespace' => 'Judul yang tidak sah dengan nomor ruang nama tidak diketahui $1 dan teks "$2"',
+'exception-nologin' => 'Belum masuk log',
+'exception-nologin-text' => 'Halaman atau tindakan ini mengharuskan Anda masuk log di wiki ini.',
 
 # Virus scanner
 'virus-badscanner' => "Kesalahan konfigurasi: pemindai virus tidak dikenal: ''$1''",
@@ -741,6 +742,7 @@ Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|p
 'remembermypassword' => 'Ingat kata sandi saya di komputer ini (selama $1 {{PLURAL:$1|hari|hari}})',
 'securelogin-stick-https' => 'Tetap terhubung ke HTTPS setelah masuk',
 'yourdomainname' => 'Domain Anda:',
+'password-change-forbidden' => 'Anda tidak dapat mengubah kata sandi pada wiki ini.',
 'externaldberror' => 'Telah terjadi kesalahan otentikasi basis data eksternal atau Anda tidak diizinkan melakukan kemaskini terhadap akun eksternal Anda.',
 'login' => 'Masuk log',
 'nav-login-createaccount' => 'Masuk log / buat akun',
@@ -981,6 +983,10 @@ Jika Anda adalah seorang pengguna anonim dan merasa mendapatkan komentar-komenta
 Anda dapat [[Special:Search/{{PAGENAME}}|melakukan pencarian untuk judul halaman ini]] di halaman-halaman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log terkait], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} menyunting halaman ini]</span>.',
 'noarticletext-nopermission' => 'Saat ini tidak ada teks di halaman ini.
 Anda dapat [[Special:Search/{{PAGENAME}}|melakukan pencarian untuk judul halaman ini]] di halaman-halaman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log terkait], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} menyunting halaman ini]</span>.',
+'missing-revision' => 'Revisi #$1 halaman berjudul "{{PAGENAME}}" tidak eksks.
+
+Hal ini biasanya disebabkan oleh tautan versi terdahulu menuju halaman yang sudah dihapus.
+Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].',
 'userpage-userdoesnotexist' => 'Akun pengguna "<nowiki>$1</nowiki>" tidak terdaftar.',
 'userpage-userdoesnotexist-view' => 'Pengguna "$1" tidak terdaftar.',
 'blocked-notice-logextract' => 'Pengguna ini sedang diblokir.
@@ -1699,9 +1705,9 @@ Log penghapusan dan pemindahan laman ini adalah sebagai berikut:",
 Untuk menampilkan atau mencari berkas yang sebelumnya dimuat, gunakan [[Special:FileList|daftar berkas]]. Pengunggahan (ulang) juga tercatat dalam [[Special:Log/upload|log pengunggahan]], sementara penghapusan tercatat dalam [[Special:Log/delete|log penghapusan]].
 
 Untuk menampilkan atau menyertakan berkas di dalam suatu halaman, gunakan pranala dengan salah satu format di bawah ini:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></tt>''' untuk menampilkan berkas dalam ukuran aslinya
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|teks alternatif]]</nowiki></tt>''' untuk menampilkan berkas dengan lebar 200px dalam sebuah kotak di kiri halaman dengan 'teks alternatif' sebagai keterangan gambar
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></tt>''' sebagai pranala langsung ke berkas yang dimaksud tanpa menampilkan berkas tersebut melalui wiki",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code>''' untuk menampilkan berkas dalam ukuran aslinya
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|teks alternatif]]</nowiki></code>''' untuk menampilkan berkas dengan lebar 200px dalam sebuah kotak di kiri halaman dengan 'teks alternatif' sebagai keterangan gambar
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' sebagai pranala langsung ke berkas yang dimaksud tanpa menampilkan berkas tersebut melalui wiki",
 'upload-permitted' => 'Jenis berkas yang diperbolehkan: $1.',
 'upload-preferred' => 'Jenis berkas yang disarankan: $1.',
 'upload-prohibited' => 'Jenis berkas yang dilarang: $1.',
@@ -1745,18 +1751,18 @@ Lihat [[Special:NewFiles|galeri berkas baru]] untuk tampilan visual.',
 'largefileserver' => 'Berkas ini lebih besar dari pada yang diizinkan server.',
 'emptyfile' => 'Berkas yang Anda muatkan kelihatannya kosong. Hal ini mungkin disebabkan karena adanya kesalahan ketik pada nama berkas. Silakan pastikan apakah Anda benar-benar ingin memuatkan berkas ini.',
 'windows-nonascii-filename' => 'Wiki ini tidak mendukung nama berkas dengan karakter istimewa.',
-'fileexists' => "Suatu berkas dengan nama tersebut telah ada, harap periksa '''<tt>[[:$1]]</tt>''' jika Anda tidak yakin untuk mengubahnya.
-[[$1|thumb]]",
-'filepageexists' => "Halaman deskripsi untuk berkas ini telah dibuat di '''<tt>[[:$1]]</tt>''', tapi saat ini tak ditemukan berkas dengan nama tersebut. Ringkasan yang Anda masukkan tidak akan tampil pada halaman deskripsi. Untuk memunculkannya, Anda perlu untuk menyuntingnya secara manual.
-[[$1|thumb]]",
-'fileexists-extension' => "Berkas dengan nama serupa telah ada: [[$2|thumb]]
-* Nama berkas yang akan dimuat: '''<tt>[[:$1]]</tt>'''
-* Nama berkas yang telah ada: '''<tt>[[:$2]]</tt>'''
-Mohon gunakan nama yang berbeda.",
+'fileexists' => 'Suatu berkas dengan nama tersebut telah ada, harap periksa <strong>[[:$1]]</strong> jika Anda tidak yakin untuk mengubahnya.
+[[$1|thumb]]',
+'filepageexists' => 'Halaman deskripsi untuk berkas ini telah dibuat di <strong>[[:$1]]</strong>, tapi saat ini tak ditemukan berkas dengan nama tersebut. Ringkasan yang Anda masukkan tidak akan tampil pada halaman deskripsi. Untuk memunculkannya, Anda perlu untuk menyuntingnya secara manual.
+[[$1|thumb]]',
+'fileexists-extension' => 'Berkas dengan nama serupa telah ada: [[$2|thumb]]
+* Nama berkas yang akan dimuat: <strong>[[:$1]]</strong>
+* Nama berkas yang telah ada: <strong>[[:$2]]</strong>
+Mohon gunakan nama yang berbeda.',
 'fileexists-thumbnail-yes' => "Berkas ini tampaknya merupakan gambar yang ukurannya diperkecil ''(miniatur)''. [[$1|thumb]]
-Harap periksa berkas '''<tt>[[:$1]]</tt>''' tersebut.
+Harap periksa berkas <strong>[[:$1]]</strong> tersebut.
 Jika berkas tersebut memang merupakan gambar dalam ukuran aslinya, Anda tidak perlu untuk memuat kembali miniatur lainnya.",
-'file-thumbnail-no' => "Nama berkas dimulai dengan '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Nama berkas dimulai dengan <strong>$1</strong>.
 Tampaknya berkas ini merupakan gambar dengan ukuran diperkecil ''(miniatur)''.
 Jika Anda memiliki versi resolusi penuh dari gambar ini, harap muatkan berkas tersebut. Jika tidak, harap ubah nama berkas ini.",
 'fileexists-forbidden' => 'Suatu berkas dengan nama ini telah ada dan tak dapat ditimpa.
@@ -1999,7 +2005,7 @@ Mungkin Anda ingin menyunting keterangan pada [$2 halaman deskripsi berkas] di s
 
 # MIME search
 'mimesearch' => 'Pencarian MIME',
-'mimesearch-summary' => 'Halaman ini menyediakan fasilitas menyaring berkas berdasarkan tipe MIME nya. Masukkan: contenttype/subtype, misalnya <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Halaman ini menyediakan fasilitas menyaring berkas berdasarkan tipe MIME nya. Masukkan: contenttype/subtype, misalnya <code>image/jpeg</code>.',
 'mimetype' => 'Tipe MIME:',
 'download' => 'unduh',
 
@@ -2200,7 +2206,7 @@ Lihat pula [[Special:WantedCategories|kategori yang diinginkan]].',
 'linksearch-ok' => 'Cari',
 'linksearch-text' => 'Kartu liar seperti "*.wikipedia.org" dapat digunakan.
 Membutuhkan sedikitnya satu ranah tingkat atas, misalnya "*.org".<br />
-Protokol yang didukung: <tt>$1</tt> (jangan tambahkan dalam pencarian Anda)',
+Protokol yang didukung: <code>$1</code> (jangan tambahkan dalam pencarian Anda)',
 'linksearch-line' => '$1 memiliki pranala dari $2',
 'linksearch-error' => "''Wildcards'' hanya dapat digunakan di bagian awal dari nama host.",
 
@@ -2388,6 +2394,8 @@ Menghapus halaman ini dapat menyebabkan masalah dalam operasional basis data {{S
 'rollback' => 'Kembalikan suntingan',
 'rollback_short' => 'Kembalikan',
 'rollbacklink' => 'kembalikan',
+'rollbacklinkcount' => 'kembalikan $1 {{PLURAL:$1|suntingan|suntingan}}',
+'rollbacklinkcount-morethan' => 'kembalikan lebih dari $1 {{PLURAL:$1|suntingan|suntingan}}',
 'rollbackfailed' => 'Pengembalian gagal dilakukan',
 'cantrollback' => 'Tidak dapat mengembalikan suntingan;
 kontributor terakhir adalah satu-satunya penulis halaman ini.',
@@ -3039,15 +3047,10 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
 # Info page
 'pageinfo-title' => 'Informasi untuk "$1"',
 'pageinfo-header-edits' => 'Suntingan',
-'pageinfo-header-watchlist' => 'Daftar pantauan',
-'pageinfo-header-views' => 'Tampilan',
-'pageinfo-subjectpage' => 'Halaman',
-'pageinfo-talkpage' => 'Halaman pembicaraan',
+'pageinfo-views' => 'Jumlah penampilan',
 'pageinfo-watchers' => 'Jumlah pemantau',
 'pageinfo-edits' => 'Jumlah suntingan',
 'pageinfo-authors' => 'Jumlah penulis yang berbeda',
-'pageinfo-views' => 'Jumlah penampilan',
-'pageinfo-viewsperedit' => 'Jumlah penampilan per suntingan',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -3946,6 +3949,7 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
 'api-error-file-too-large' => 'Berkas yang Anda kirim terlalu besar.',
 'api-error-filename-tooshort' => 'Nama berkas terlalu pendek.',
 'api-error-filetype-banned' => 'Jenis berkas ini dilarang.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|adalah ekstensi berkas yang tidak diizinkan|adalah ekstensi berkas yang tidak diizinkan}}. {{PLURAL:$3|Jenis berkas yang diperolehkan adalah|Jenis berkas yang diperolehkan adalah}} $2.',
 'api-error-filetype-missing' => 'Berkas tidak memiliki ekstensi.',
 'api-error-hookaborted' => 'Modifikasi yang Anda coba lakukan dibatalkan oleh suatu kaitan ekstensi.',
 'api-error-http' => 'Kesalahan internal: tidak dapat menghubungkan ke peladen.',
index 00322f5..ec2cba0 100644 (file)
@@ -173,7 +173,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ocultar redactiones de usatores registrat del liste de págines vigilat',
 'tog-watchlisthideanons' => 'Ocultar redactiones de usatores anonim del liste de págines vigilat',
 'tog-watchlisthidepatrolled' => 'Ocultar redactiones vigilat del liste de págines vigilat',
-'tog-nolangconversion' => 'Desvalidar conversion de variantes',
 'tog-ccmeonemails' => 'Inviar me copies de e-mailes que yo invia por altri usatores',
 'tog-diffonly' => 'Ne monstrar li contenete de págine in infra del changes',
 'tog-showhiddencats' => 'Monstrar categories ne visibil',
@@ -612,7 +611,7 @@ Vider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e ba
 'revertmerge' => 'Desfar fusion',
 
 # Diffs
-'history-title' => 'Revision del historie de "$1"',
+'history-title' => 'Historic del revision de "$1"',
 'lineno' => 'Linea $1:',
 'compareselectedversions' => 'Comparar revisiones selectet',
 'editundo' => 'anullar',
@@ -779,9 +778,9 @@ Págines in [[Special:Watchlist|tui liste de págines vigilat]] es '''nigri'''."
 Por vider o serchar files cargat anteriorimen ear por li [[Special:FileList|liste de files cargat]], (re)cargamentes es anc registrat in li [[Special:Log/upload|diarium de cargament]], deletiones in li [[Special:Log/delete|diarium de deletion]].
 
 Por includer un file in un págine, usa un catenun in un de sequent formes:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' por usar li version complet de li file
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' por usar un rendition larg de 200 pixel in un buxe in li márgine levul che 'alt text' quam descrition
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' por ligar inmediatmen por li file sin monstrar li file",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' por usar li version complet de li file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' por usar un rendition larg de 200 pixel in un buxe in li márgine levul che 'alt text' quam descrition
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' por ligar inmediatmen por li file sin monstrar li file",
 'upload-permitted' => 'Tipes de file permisset: $1.',
 'upload-preferred' => 'Tipes de file preferet: $1.',
 'upload-prohibited' => 'Tipes de file prohibit: $1.',
index 282d871..fcc45d6 100644 (file)
@@ -61,16 +61,16 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#KÚFÙ', '#REDIRECT' ),
-       'fullpagename'            => array( '1', 'ÁHÀNÍLÉNKÈIHÜ', 'FULLPAGENAME' ),
-       'msg'                     => array( '0', 'OZI:', 'MSG:' ),
-       'img_right'               => array( '1', 'áká_ịkẹngạ', 'right' ),
-       'img_left'                => array( '1', 'áká_èkpè', 'left' ),
-       'img_top'                 => array( '1', 'élú', 'top' ),
-       'img_middle'              => array( '1', 'ẹtítì', 'middle' ),
-       'img_text_bottom'         => array( '1', 'okpúrù-ede', 'text-bottom' ),
-       'displaytitle'            => array( '1', 'ZIÍSHÍ', 'DISPLAYTITLE' ),
-       'pagesize'                => array( '1', 'ÀSÁIHÜ', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#KÚFÙ', '#REDIRECT' ),
+       'fullpagename'              => array( '1', 'ÁHÀNÍLÉNKÈIHÜ', 'FULLPAGENAME' ),
+       'msg'                       => array( '0', 'OZI:', 'MSG:' ),
+       'img_right'                 => array( '1', 'áká_ịkẹngạ', 'right' ),
+       'img_left'                  => array( '1', 'áká_èkpè', 'left' ),
+       'img_top'                   => array( '1', 'élú', 'top' ),
+       'img_middle'                => array( '1', 'ẹtítì', 'middle' ),
+       'img_text_bottom'           => array( '1', 'okpúrù-ede', 'text-bottom' ),
+       'displaytitle'              => array( '1', 'ZIÍSHÍ', 'DISPLAYTITLE' ),
+       'pagesize'                  => array( '1', 'ÀSÁIHÜ', 'PAGESIZE' ),
 );
 
 $messages = array(
index 348424a..abbcd8c 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Joemaza
  * @author Kaganer
  * @author Lam-ang
  * @author Saluyot
@@ -37,11 +38,11 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Pinag-ugisan ti silpo:',
 'tog-justify' => 'Limpiaen dagiti parapo',
-'tog-hideminor' => 'Ilemmeng dagiti babassit a panag-urnos kadagiti naudi a sinuk-sukatan',
+'tog-hideminor' => 'Ilemmeng dagiti bassit a panagbaliw kadagiti naudi a panagisukat',
 'tog-hidepatrolled' => 'Ilemmeng dagiti napatruliaan nga inurnos kadagiti naudi a sinuk-sukatan',
 'tog-newpageshidepatrolled' => 'Ilemmeng dagiti napatruliaan a panid idiay baro a listaan ti panid',
 'tog-extendwatchlist' => 'Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, tapno saan laeng a dagiti nabiit',
-'tog-usenewrc' => 'Usaren ti napasayaat a kinaudi a sinuk-sukatan (masapul ti JavaScript)',
+'tog-usenewrc' => 'Dagiti grupo panagbaliw babaen ti panid kadagiti kinaudi a panagbaliw ken banbantayan  (masapul ti JavaScript)',
 'tog-numberheadings' => 'Automatiko a pabilangan dagiti paulo',
 'tog-showtoolbar' => 'Ipakita ti ramit ti panag-urnos (masapul ti JavaScript)',
 'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagtakla (masapul ti JavaScript)',
@@ -49,17 +50,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Ikkan ti pakabaelan ti paset  a panag-urnos no agtakla ti kanawan kadagiti paset a titulo (masapul ti JavaScript)',
 'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga addan ti ad-adu ngem dagiti 3 a paulo)',
 'tog-rememberpassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kaadu nga $1 {{PLURAL:$1|aldaw|al-aldaw}})',
-'tog-watchcreations' => 'Inayon dagiti inaramidko a pampanid iti listaan ti bambantayak',
-'tog-watchdefault' => 'Inayon dagiti inurnos ko a pampanid iti listaan ti bambantayak',
-'tog-watchmoves' => 'Inayon dagiti inyalisko a pampanid iti listaan ti bambantayak',
-'tog-watchdeletion' => 'Inayon dagiti inikkatko a pampanid iti listaan ti bambantayak',
+'tog-watchcreations' => 'Agnayon kadagiti panid a pinartuatko ken papeles  nga inpanko idiay listaan ti bambantayak',
+'tog-watchdefault' => 'Agnayon kadagiti panid ken papeles nga inurnosko idiay listaan ti bambantayak',
+'tog-watchmoves' => 'Agnayon kadagiti panid ken papeles nga inyalisko idiay listaan ti bambantayak',
+'tog-watchdeletion' => 'Agnayon kadagiti panid ken papeles nga inikkatko idiay listaan ti bambantayak',
 'tog-minordefault' => 'Markaan amin nga  inurnos a kas sigud a bassit',
 'tog-previewontop' => 'Ipakita ti panag-padas sakbay ti kahon ti inurnos',
 'tog-previewonfirst' => 'Ipakita ti na-ipadas iti umuna nga inurnos',
 'tog-nocache' => 'Ibaldado ti pagcache ti pabasabasam iti daytoy a panid',
-'tog-enotifwatchlistpages' => 'E-suratannak no adda mabaliwan a panid iti listaan dagiti bambantayak a pampanid',
+'tog-enotifwatchlistpages' => 'E-suratannak no mabaliwan ti panid wenno papeles idiay listaan dagiti bambantayak',
 'tog-enotifusertalkpages' => 'E-suratannak no mabaliwan ti panidko a tungtongan ti agar-aramat',
-'tog-enotifminoredits' => 'E-suratannak met kadagiti bassit a panag-urnos ti pampanid',
+'tog-enotifminoredits' => 'E-suratannak pay para kadagiti bassit a panag-urnos kadagiti panid ken papeles',
 'tog-enotifrevealaddr' => 'Iparang ti pagtaengan ti e-surat ko kadagiti pammalagip ti  e-surat',
 'tog-shownumberswatching' => 'Ipakita ti bilang dagiti agbambantay nga agar-aramat',
 'tog-oldsig' => 'Ti adda a pirma:',
@@ -69,7 +70,7 @@ $messages = array(
 'tog-showjumplinks' => 'Ikkan ti pakabaelan  a  "mapan iti"  agpalaka a sumrek kadagiti panagsilpo',
 'tog-uselivepreview' => 'Usaren ti panag-padas tattan (masapul ti JavaScript) (suuten laeng)',
 'tog-forceeditsummary' => 'Pakaammuannak no sumrek ti blanko a pakabuklan ti panag-urnos',
-'tog-watchlisthideown' => 'Ilemmeng idiay listaan ti bambantayan dagiti inurnos ko',
+'tog-watchlisthideown' => 'Ilemmeng idiay listaan ti bambantayan dagiti inurnosko',
 'tog-watchlisthidebots' => 'Ilemmeng idiay listaan ti bambantayan dagiti inurnos ti bot',
 'tog-watchlisthideminor' => 'Ilemmeng idiay listaan ti bambantayan dagiti bassit nga  inurnos',
 'tog-watchlisthideliu' => 'Ilemmeng idiay listaan ti bambantayan dagiti inurnos ti nakastrek nga agar-aramat',
@@ -158,7 +159,7 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a papeles.|Ti sumaganad nga {{PLURAL:$1| a papeles|$1  a pappapeles}} ket adda iti daytoy a kategoria, ti $2 a dagup.}}',
 'category-file-count-limited' => 'Ti sumaganad nga {{PLURAL:$1|a papeles|$1 a pappapeles}} ket adda iti agdama a kategoria.',
 'listingcontinuesabbrev' => 'tuloy.',
-'index-category' => 'Dagiti pagsurutan a panid',
+'index-category' => 'Dagiti naipasurutan a panid',
 'noindex-category' => 'Dagiti saan a pagsurutan a panid',
 'broken-file-category' => 'Dagiti panid a nadadael ti panag-silpo na iti papeles',
 
@@ -185,7 +186,7 @@ $messages = array(
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-addsection' => 'Nayonan ti topiko',
+'vector-action-addsection' => 'Agnayon ti topiko',
 'vector-action-delete' => 'Ikkaten',
 'vector-action-move' => 'Iyalis',
 'vector-action-protect' => 'Salakniban',
@@ -256,7 +257,7 @@ $messages = array(
 'jumpto' => 'Mapan idiay:',
 'jumptonavigation' => 'pagdaliasatan',
 'jumptosearch' => 'biruken',
-'view-pool-error' => 'Pasensian a, dagiti servers ket nadagsenan unay tattan.
+'view-pool-error' => 'Pasensian, dagiti servers ket nadagsenan unay tattan.
 Adu unay nga agar-aramat ti mangkitkita daytoy a panid.
 Pangaasim nga aguray ka met sakbay a padasem ti mangkita daytoy a panid.
 
@@ -338,8 +339,8 @@ $1',
 # Main script and global functions
 'nosuchaction' => 'Awan ti kasta nga aramid',
 'nosuchactiontext' => 'Ti inted nga inaganan ti URL ket imbalido.
-Baka madi ti naimakiniliam nga URL, wenno sinurot mo ti saan nga agpayso a panilpo.
-Baka daytoy ket "kiteb" ti "software" nga ususaren daytoy a/nga {{SITENAME}}.',
+Baka madi ti naimakiniliam nga URL, wenno sinurotmo ti saan nga agpayso a panilpo.
+Baka daytoy ket "kiteb" ti "software" nga ususaren babaen ti {{SITENAME}}.',
 'nosuchspecialpage' => 'Awan ti kasta nga espesial a panid',
 'nospecialpagetext' => '<strong>Nagkiddaw ka ti imbalido nga espesial a panid.</strong>
 
@@ -348,11 +349,11 @@ Masarakan ti listaan dagiti umisu nga espesial a pampanid iti [[Special:SpecialP
 # General errors
 'error' => 'Biddut',
 'databaseerror' => 'Biddut iti database',
-'dberrortext' => 'Adda biddut ti database ti  gramatika na a pinagsapul.
+'dberrortext' => 'Adda biddut ti database ti  gramatika na a panagsapul.
 Adda ngata  kiteb iti software.
-Ti pinaudi a pinagsapul ti database ket:
+Ti kinaudia a panagpadas ti panagsapul ti database ket:
 <blockquote><tt>$1</tt></blockquote>
-naggapu ti uneg ti opisio "<tt>$2</tt>".
+naggapu ti uneg ti pamay-an "<tt>$2</tt>".
 Ti database ket nangipatulod ti biddut "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'Adda biddut ti database ti  gramatika a panagsapul.
 Ti kinaudi a panagsapul ti database ket:
@@ -362,7 +363,7 @@ Ti database ket nangipatulod ti biddut "$3: $4".',
 'laggedslavemode' => 'Ballaag: Mabalin a ti panid ket awan ti nagyan na kadagiti naudi a panagpabaro.',
 'readonly' => 'Nakandadoan ti database',
 'enterlockreason' => 'Mangipan ti rason no apay nga ikandado, agraman no kaano a maluktan ti kandado',
-'readonlytext' => 'Ti database ket naikandado iti baro a panagikabil ken panagbaliw, gapu dagiti kanayon nga pagsimpa, ket no malpas absublin to ti kasla idi.
+'readonlytext' => 'Ti database ket naikandado iti baro a panagikabil ken panagbaliw, gapu dagiti kanayon a pagsimpa, ket no malpas kadawyanto nga agsubli.
 
 Ti administrador a nagkandado ket daytoy ti palawag na: $1',
 'missing-article' => 'Ti database ket saan a nakabiruk ti testo ti panid  a nabirukanna kuman, ti napanaganan ti "$1" $2.
@@ -391,21 +392,23 @@ Panngaasi nga  ibagam kadagiti [[Special:ListUsers/sysop|administrador]], isurat
 'cannotdelete' => 'Ti panid wenno ti papeles "$1" ket saan a maikkat.
 Amangan no addan sabali a nangikkat.',
 'cannotdelete-title' => 'Saan a maikkat ti panid  "$1"',
+'delete-hook-aborted' => 'Inukas ti kawit ti panagborra.
+Awan ti intedna a palawag.',
 'badtitle' => 'Madi a titulo',
-'badtitletext' => 'Ti nakiddaw a titulo ti panid ket imbalido, blanko, wenno saan nga umno a naisilpo a titulo a maki-pagsasao wenno maki-wiki.
+'badtitletext' => 'Ti nakiddaw a titulo ti panid ket imbalido, blanko, wenno maysa a saan nga husto a naisilpo a titulo nga inter-lengguahe wenno inter-wiki a titulo.
 Adda ngata nagyan a maysa wenno ad-adu pay a kababalin a saan a mausar iti titulo.',
 'perfcached' => 'Ti sumaganad a data ket naka-cached ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagant|dagiti $1 a nagbanagan}} ket magun-od idiay cache.',
 'perfcachedts' => 'Ti sumaganad a data ket naka-cached, ken naudi a napabaro idi $1. Ti kaadu a {{PLURAL:$4|iti maysa a nagbanagan |dagiti $4 nagbanagan}} ket magun-od idiay cache.',
 'querypage-no-updates' => 'Dagiti panangpabaro iti daytoy a panid ket agdama a nabaldado. 
 Saan a mipasaradiwa ita dagiti data ditoy.',
 'wrong_wfQuery_params' => 'Kamali a parametro iti wfQuery()<br />
-Opisio: $1<br />
+Pamay-an: $1<br />
 Panagsapul: $2',
 'viewsource' => 'Kitaen ti taudan',
 'viewsource-title' => 'Kitaen ti taudan iti $1',
 'actionthrottled' => 'Napabuntog ti aramid',
-'actionthrottledtext' => 'Para ti pagkontra ti spam, naipatingga ka ti pinagtungpal ti adu unay iti daytoy nga aramid iti nasiket nga oras, ken nalippasamon ti patingga.
-Pangngaasi nga ipadas mo manen no madamdama.',
+'actionthrottledtext' => 'Para ti pagkontra ti spam, naipatinggaka ti panagtungpal ti adu unay iti daytoy nga aramid iti nasiket nga oras, ken nalippasamon ti patingga.
+Pangngaasi nga ipadasmo manen no madamdama.',
 'protectedpagetext' => 'Nasalakniban daytoy a panid tapno mapawilan ti panag-urnos.',
 'viewsourcetext' => 'Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:',
 'viewyourtext' => "Mabalinmo a makita ken tuladen ti taudan dagiti '''inurnosmo''' ditoy a panid:",
@@ -427,6 +430,8 @@ Ti naited a rason ket ''$2''.",
 Ti administrador a nagserra ket nagited iti daytoy a panagilawlawag "\'\'$3\'\'".',
 'invalidtitle-knownnamespace' => 'Imbalido a titulo nga adda ti nagan ti lugar "$2" ken testo "$3"',
 'invalidtitle-unknownnamespace' => 'Imbalido a titulo nga adda di-amammo a nagan ti lugar a numero $1 ken testo "$2"',
+'exception-nologin' => 'Saan a nakastrek',
+'exception-nologin-text' => 'Daytoy a panid wenno aramid ket makasapul kenka ti sumrek iti daytoy a wiki.',
 
 # Virus scanner
 'virus-badscanner' => 'Madi di panaka-aramidna: Di am-ammo a birus a panagskan: "$1"',
@@ -444,7 +449,7 @@ Dimo liplipatan a sukatan dagita kaykayatmo idiay [[Special:Preferences|{{SITENA
 'yourname' => 'Nagan ti agar-aramat:',
 'yourpassword' => 'Kontrasenias:',
 'yourpasswordagain' => 'Uliten ti kontrasenias:',
-'remembermypassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (para iti kaadu iti $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})',
+'remembermypassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (para iti kapaut iti $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})',
 'securelogin-stick-https' => 'Agyan ka a nakasilpo iti HTTPS no nakastrekka',
 'yourdomainname' => 'Ti bukodmo a pagturayan:',
 'externaldberror' => 'Adda biddut idi ti panakapasingked ti database wenno saanmo a mabalin ti agpabaro ti bukodmo a ruar a pakabilangan.',
@@ -691,7 +696,9 @@ Naiyalis ngatan wenno naikkat idi kitkitaen dayta a panid.',
 
 Ti kontrasenias ti baro a pakabilangan ket masukatan idiay ''[[Special:ChangePassword|pagsukatan ti kontrasenias]]'' a panid no sumrekka.",
 'newarticle' => '(Baro)',
-'newarticletext' => "Nasurotmo ti maysa a panilpo ti panid a saan pay a napartuat. Tapno pmapartuat daytoy a panid, rugiamon ti agikur-it wenno agisurat iti pagsuratan a kahon iti baba (kitaen ti [[{{MediaWiki:Helppage}}|panid ti tulong]] para iti ad-adu pay a pakaammo). No met nakadanonka ditoy a dimo inggagara wenno gapu iti biddut, agtakla ka laeng ti '''agsubli'' a buton ti pabasabasam tapno makasublika iti naggapuam a panid.",
+'newarticletext' => "Nasurotmo ti maysa a panilpo ti panid a saan pay a napartuat. 
+Tapno mapartuat daytoy a panid, rugiamon ti agikur-it wenno agisurat iti pagsuratan a kahon dita baba (kitaen ti [[{{MediaWiki:Helppage}}|panid ti tulong]] para iti ad-adu pay a pakaammo). 
+No addaka ditoy babaen ti biddut, itaklam ti '''agsubli'''a buton ti pabasabasam tapno makasublika iti naggapuam a panid.",
 'anontalkpagetext' => "----''Daytoy ti pakitungtungan a panid para iti di am-ammo nga agar-aramat a saan pay a nakaaramid ti pakabilangan, wenno saan na nga us-usaren.
 Dakami ket agusar kami ti numero nga IP a pagtaengan ti panangilasin dagiti lalaki/babai.
 Ti kastoy nga IP a pagtaengan ket us-usaren a bingayan ti adu pay a sabsabali nga agar-aramat.
@@ -734,14 +741,14 @@ Annawid a .css ken .js dagiti titulo ket agususar ti napababa a letra, a kas dag
 Dagiti sinukatam ket saan pay a naidulin!",
 'continue-editing' => 'Agtultuloy nga agurnos',
 'previewconflict' => 'Daytoy a panagpadas ket agiparang ti testo dita ngato a panagurnos a lugar a kasla agparang no kayatmo nga idulin.',
-'session_fail_preview' => "'''Pasensian a! Saanmi a maaramid ti panag-urnos gapu ngamin ta naawanan ti gimong ti data.'''
+'session_fail_preview' => "'''Pasensia! Saanmi a maaramid ti panag-urnos gapu ngamin ta naawanan ti gimong ti data.'''
 Pangngaasi a padasem manen.
 No saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrek ka manen.",
-'session_fail_preview_html' => "'''Pangngaasi! Saanmi a maaramid ti panagurnosmo ngamin ket naawanan ti gimong a datos.'''
+'session_fail_preview_html' => "'''Pasensia! Saanmi a maaramid ti panagurnosmo ngamin ket naawanan ti gimong a datos.'''
 
 ''Gapu ti {{SITENAME}} ket addaa ti nakilaw a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut ti dakes a JavaScript.''
 
-'''No daytoy ket pudno a panagurnos, pangngaasi a padasem manen.'''
+'''No daytoy ket pudno a panag-urnos, pangngaasi a padasem manen.'''
 No saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
 'token_suffix_mismatch' => "'''Ti panag-urnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna ti kuldit ti kababalin idiay pinagpudno ti panag-urnos.'''
 Ti panag-urnos ket saan a naawat tapno mapawilan ti panakadadael ti testo ti panid.
@@ -756,7 +763,7 @@ Mapasamak daytoy no agus-usarka ti saan a nasayaat a naibasta ti sapot a diamamm
 Ti ngato a lugar ti testo ket adda dagiti nagyanna a testo ti panid a kasla agdama a kita na.
 Ti inurnosmo ket maipakita dita babba a lugar ti testo
 Ipatipon mo dagiti sinukatam idiay lugar ti testo.
-'''Iti laeng'' testo dita ngato a lugar ti testo ti maidulin no pesselem ti \"{{int:savearticle}}\".",
+'''Iti laeng''' testo dita ngato a lugar ti testo ti maidulin no pesselem ti \"{{int:savearticle}}\".",
 'yourtext' => 'Ti testom',
 'storedversion' => 'Bersion a naidulin',
 'nonunicodebrowser' => "'''Ballaag: Ti  pabasabasam ket saan a kasla unicode .'''
@@ -779,7 +786,7 @@ No kayatmo i \"cut-n-paste\" mo dagiti testo iti testo a papeles ken idulinmo no
 
 Ti administrador a nangrikep ket saan a nangted ti palawag: \$1",
 'protectedpagewarning' => "'''Ballaag:  Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan ti gundaway nga administrador ti makaurnos ditoy.'''
-Ti nakaudi a naikabil a listaan ket adda dita baba tapno usarena  reperensia:",
+Ti nakaudi a naikabil a listaan ket adda dita baba tapno usaren a  reperensia:",
 'semiprotectedpagewarning' => "'''Pakaammo:'''Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.
 Ti naudi a naikabil a listaan ket adda dita baba tapno usaren a reperensia:",
 'cascadeprotectedwarning' => "'''Ballaag:''' Daytoy a panid ket nasalakniban tapno dagiti laeng administrador nga addaan ti  gundaway ti makaurnos, ngamin ket nairaman kadagiti sumaganad a sariap a nasalakniban
@@ -801,9 +808,9 @@ Mabalinmo ti agsubli ken urnosen ti adda a panid, wenno [[Special:UserLogin|sumr
 'permissionserrors' => 'Dagiti biddut ti pammalubos',
 'permissionserrorstext' => 'Awan ti pammalubosmo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|a rasrason}}:',
 'permissionserrorstext-withaction' => 'Awan ti pammalubosmo nga $2, gapu ti sumaganad {{PLURAL:$1|a rason|rasrason}}:',
-'recreate-moveddeleted-warn' => "''Ballaag: Agparpartuatka manen ti naikkat idi a panid.'''
+'recreate-moveddeleted-warn' => "'''Ballaag: Agparpartuatka manen ti naikkat idi a panid'''
 
-Nasken a siguraduem no maikanatad nga ituloymo a parnuayen manen wenno urnosen daytoy a panid.
+Nasken a siguraduem no maikanatad nga ituloymo nga urnosen daytoy a panid.
 Ti panaka-ikkat ken panka-iyalis a listaan para iti daytoy  a panid ket adda ditoy a pakakitaan:",
 'moveddeleted-notice' => 'Naikkaten daytoy a panid.
 Ti listaan a panaka-ikkat ken panaka-iyalis ti panid ket naikabil dita baba tapno usaren a reperensia.',
@@ -936,7 +943,7 @@ Dagiti sabsabali nga administrador idiay {{SITENAME}} ket mabalin da a serrekan
 * Makapataud a dakes a pakaammo
 * Di maiparbeng a  kabukbukodan a pakaammo
 * : ''dagiti pagtaengan ken numero ti telepono, numero ti sosial a seguridad, ken dadduma pay.''",
-'revdelete-legend' => 'Iplastar dagiti pinagparit ti panagkita',
+'revdelete-legend' => 'Iplastar dagiti panagiparit ti panagkita',
 'revdelete-hide-text' => 'Ilemmeng ti testo ti binaliwan',
 'revdelete-hide-image' => 'Ilemmeng ti linaon ti papeles',
 'revdelete-hide-name' => 'Ilemmeng ti aramid ken puntaan',
@@ -972,9 +979,9 @@ Saan mo a mabalin a serrekan.',
 'revdelete-concurrent-change' => 'Biddut ti panagpabaro daytoy a banag a petsado a $2, $1: Ti panakaikabil na ket mabalin a nasuktanen ti sabsabli idi pinadas mo a pinabaro.',
 'revdelete-only-restricted' => 'Biddut ti panagilemmeng daytoy banag a petsado a $2, $1: Saan mo a maidepdep dagita iti panagkita dagiti adminitrador no saan mo a pilian ti maysa kadagiti pinagpili ti panagkita.',
 'revdelete-reason-dropdown' => '*Dagiti kadawyan a panagikkat
-** Panaglabsing ti karbengan ti pinagipablaak
-** Saan a maibagay a kabukbukodan a pakaammo
-** Makapataud a dakes a pakaammo',
+** Panaglabsing ti karbengan ti panagipablaak
+** Saan a maibagay ti kabukbukodan a pakaammo
+** Makapataud ti dakes a pakaammo',
 'revdelete-otherreason' => 'Sabali/dadduma a rason:',
 'revdelete-reasonotherlist' => 'Sabali a rason',
 'revdelete-edit-reasonlist' => 'Urnosen ti rason ti panagikkat',
@@ -983,7 +990,7 @@ Saan mo a mabalin a serrekan.',
 # Suppression log
 'suppressionlog' => 'Listaan ti nadepdepan',
 'suppressionlogtext' => 'Dita baba ket addaan dagiti listaan ti pinagikkat ken npanagserra a nairaman dagiti linaon a nailemmeng manipud kadagiti administrador.
-Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama nga operasional a pinagparit ken panagserra.',
+Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama nga operasional a panagparit ken panagserra.',
 
 # History merging
 'mergehistory' => 'Pagtiponen dagiti pakasaritaan ti pampanid',
@@ -1030,7 +1037,7 @@ Usaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid id
 # Search results
 'searchresults' => 'Dagiti nagbanagan ti panagbiruk',
 'searchresults-title' => 'Dagiti nabirukan a nagbanagan ti "$1"',
-'searchresulttext' => 'Ti adu pay a pakaammo ti pinagbiruk {{SITENAME}}, kitaem ti [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchresulttext' => 'Ti adu pay a pakaammo ti panagbiruk {{SITENAME}}, kitaem ti [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'Nagbiruk ka  para iti \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|amin a panid a mangrugi iti "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|amin a panid nga agsilpo iti "$1"]])',
 'searchsubtitleinvalid' => "Nagbiruk ka para  iti '''$1'''",
 'toomanymatches' => 'Adu unay ti napasubli  nga agpapada, pangngaasi a padasem ti sabali a panagsapul',
@@ -1054,9 +1061,9 @@ Usaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid id
 'searchprofile-images' => 'Sabsabali a midia',
 'searchprofile-everything' => 'Amin amin',
 'searchprofile-advanced' => 'Napasayaat',
-'searchprofile-articles-tooltip' => 'Agbiruk ka idiay $1',
-'searchprofile-project-tooltip' => 'Agbiruk ka idiay $1',
-'searchprofile-images-tooltip' => 'Agbiruk ka iti papeles',
+'searchprofile-articles-tooltip' => 'Agbirukka idiay $1',
+'searchprofile-project-tooltip' => 'Agbirukka idiay $1',
+'searchprofile-images-tooltip' => 'Agbirukka para iti papeles',
 'searchprofile-everything-tooltip' => 'Birukem amin a linaon (uray dagiti makipatangan a panid)',
 'searchprofile-advanced-tooltip' => 'Agbiruk ka kadagiti naiduma a "nagan ti lugar"',
 'search-result-size' => '$1 ({{PLURAL:$2|iti 1 a balikas|kadagiti $2 a balikas}})',
@@ -1072,7 +1079,7 @@ Usaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid id
 'search-mwsuggest-disabled' => 'awanan ti singasing',
 'search-relatedarticle' => 'Mainaig',
 'mwsuggest-disable' => 'Pagsardengen dagiti AJAX a naibagbaga',
-'searcheverything-enable' => 'Agbiruk ka kadagiti amin a nagan ti lugar',
+'searcheverything-enable' => 'Agbirukka kadagiti amin a nagan ti lugar',
 'searchrelated' => 'mainaig',
 'searchall' => 'amin',
 'showingresults' => "Maiparang iti baba ti agingga {{PLURAL:$1|iti '''1''' a nagbanagan|dagiti '''$1''' a nagbanagan}} a mangrugi iti #'''$2'''.",
@@ -1083,7 +1090,7 @@ Padasem a  pasarunuan ti panagbiruk mo ti ''all:'' tapno birukem amin a nagyan (
 'search-nonefound' => 'Awan ti nagbanagan a kapadpada ti sinapul.',
 'powersearch' => 'Napasayat a panagbiruk',
 'powersearch-legend' => 'Napasayat a panagbiruk',
-'powersearch-ns' => 'Agbiruk ka kadagiti nagan ti lugar:',
+'powersearch-ns' => 'Agbirukka kadagiti nagan ti lugar:',
 'powersearch-redir' => 'Ilista dagiti baw-ing',
 'powersearch-field' => 'Biruken iti',
 'powersearch-togglelabel' => 'Markaan:',
@@ -1200,7 +1207,7 @@ Masapul a nababbaba ngem $1 {{PLURAL:$1| a karakter|kadagiti karakter}} ti kaati
 'gender-unknown' => 'Saan a naibagbaga',
 'gender-male' => 'Lalaki',
 'gender-female' => 'Babai',
-'prefs-help-gender' => 'Makapili: Usaren no lalaki wenno babai a pinagtawag ti "software" .
+'prefs-help-gender' => 'Makapili: Usaren no lalaki wenno babai a panagtawag ti "software" .
 Daytoy a pakaammo ket makita ti publiko.',
 'email' => 'E-surat',
 'prefs-help-realname' => 'Saan a nasken ti pudno a nagan.
@@ -1397,8 +1404,8 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'rcshowhideliu' => '$1 dagiti nakastrek nga agar-aramat',
 'rcshowhideanons' => '$1 dagiti di am-ammo nga agar-aramat',
 'rcshowhidepatr' => '$1 dagiti napatrulian a panag-urnos',
-'rcshowhidemine' => '$1 dagiti inurnos ko',
-'rclinks' => 'Ipakita dagiti naudi a $1 sinukatan iti kallabes a $2 nga al-aldaw<br />$3',
+'rcshowhidemine' => '$1 dagiti inurnosko',
+'rclinks' => 'Ipakita dagiti naudi a $1 sinukatan iti kallabes a $2 nga al-aldaw<br />$3',
 'diff' => 'sabali',
 'hist' => 'saritaan',
 'hide' => 'Ilemmeng',
@@ -1443,9 +1450,9 @@ Ti listaan ti panagikkat ken panagiyalis daytoy a panid ket adda ditoy tapno mak
 Ti panagkita wenno panagbiruk ti napalubos a pinag-ipan ti papeles mapan ka idiay [[Special:FileList|listaan dagiti napag-ipan a papeles]], dagiti pinag-ipan wenno pinag-ipan manen ket nakalista pay idiay [[Special:Log/upload|listaan ti pinag-ipan]], dagiti panagikkat ket idiay [[Special:Log/delete|listaan ti panagikkat]].
 
 Ti panagikabil ti papeles iti panid, usaren ti panilpo a kas dagiti sumaganad a kabuklan:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' ti panag-usar ti dakkel a bersion ti papeles
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' ti agusar ti 200 pixel a kaakaba  a panagparang iti kahon idiay kannigid nga adda 'sabali a testo' ti panagipalpalawag
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' ti dagus a panagsilpo idiay papeles nga awan ti panagparang ti papeles",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ti panag-usar ti dakkel a bersion ti papeles
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' ti agusar ti 200 pixel a kaakaba  a panagparang iti kahon idiay kannigid nga adda 'sabali a testo' ti panagipalpalawag
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' ti dagus a panagsilpo idiay papeles nga awan ti panagparang ti papeles",
 'upload-permitted' => 'Dagiti mapalubosan a kita ti papeles: $1.',
 'upload-preferred' => 'Dagiti mabalbalin a kita ti papeles: $1.',
 'upload-prohibited' => 'Dagiti maiparit a kita ti papeles: $1.',
@@ -1493,21 +1500,21 @@ daytoy a papeles ket $2.',
 Baka daytoy ket gapu ti kamali ti inkabil a nagan ti papeles.
 Pangngaasi ta kitaem no kayatmo latta nga ipapan daytoy a papeles.',
 'windows-nonascii-filename' => 'Daytoy a wiki ket saanna a tapayaen dagiti nagan ti papeles nga adda ti kangrunaan a kababalin',
-'fileexists' => "Adda ti papeles nga agnagan ti kastoy, pangngaasi a kitaemti  '''<tt>[[:$1]]</tt>''' no saanka a sigurado a mangsukat.
-[[$1|thumb]]",
-'filepageexists' => "Ti panangipalpalawag a panid ti daytoy a papeles ket naaramiden idiay '''<tt>[[:$1]]</tt>''', mgem awan ti agnagan ti katoy a papeles.
+'fileexists' => 'Adda ti papeles nga agnagan ti kastoy, pangngaasi a kitaemti  <strong>[[:$1]]</strong> no saanka a sigurado a mangsukat.
+[[$1|thumb]]',
+'filepageexists' => 'Ti panangipalpalawag a panid ti daytoy a papeles ket naaramiden idiay <strong>[[:$1]]</strong>, mgem awan ti agnagan ti katoy a papeles.
 Ti pakabuklan nga inkabilmo ket saan nga agparang idiay panid ti panangipalpalawag.
 Tapno ti pakabuklan ket agparang idiay, masapul  a baliwam idiay.
-[[$1|thumb]]",
-'fileexists-extension' => "Adda papeles nga agnagan ti kastoy: [[$2|thumb]]
-* Nagan ti naipapan a papeles: '''<tt>[[:$1]]</tt>'''
-* Nagan ti adda a papeles: '''<tt>[[:$2]]</tt>'''
-Pangngaasi nga agpili ti sabali a nagan.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Adda papeles nga agnagan ti kastoy: [[$2|thumb]]
+* Nagan ti naipapan a papeles: <strong>[[:$1]]</strong>
+* Nagan ti adda a papeles: <strong>[[:$2]]</strong>
+Pangngaasi nga agpili ti sabali a nagan.',
 'fileexists-thumbnail-yes' => "Daytoy a papeles ket kasla imahen a napabassit ''(thumbnail)''.
 [[$1|thumb]]
-Pangngaasi a kitaem ti papeles a '''<tt>[[:$1]]</tt>'''.
+Pangngaasi a kitaem ti papeles a <strong>[[:$1]]</strong>.
 No ti nakitam a papeles ket isu met laeng dayta dati a kadakkel, saanka a mang-ipan iti sabali pay a napabassit nga imahen.",
-'file-thumbnail-no' => "Ti nagan ti papeles ket mangrugi ti '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Ti nagan ti papeles ket mangrugi ti <strong>$1</strong>.
 Kasla imahen a napabassit ''(thumbnail)''.
 No addaan ka ti dakkel a resolusion daytoy nga imahen ipag-ipan daytoy, no saan ket pangngaasi ta sukatam ti nagan ti papeles.",
 'fileexists-forbidden' => 'Daytoy a nagan ti papeles ket adda dita, ken saan a mabalin a masuratan manen.
@@ -1592,6 +1599,7 @@ No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administr
 'backend-fail-connect' => 'Saan a makaikapet idiay pagidulinan a kalikudan  "$1".',
 'backend-fail-internal' => 'Adda di amammo a biddut ti napasamak idiay pagidulinan a kalikudan "$1".',
 'backend-fail-contenttype' => 'Saan a maammoan ti kita ti linaon ti papeles nga idulin idiay "$1".',
+'backend-fail-batchsize' => 'Nagited ti nagipenpenan ti bunggoy iti $1 a papeles {{PLURAL:$1|nga aramid|nga ar-aramid}}; ti patingga ket $2 {{PLURAL:$2|nga aramid|nga ar-aramid}}.',
 'backend-fail-usable' => 'Saan a masuratan ti papeles $1 gapu ta awan ti makaanay a pammalubos wenno awan dagiti direktorio/pangikabilan.',
 
 # Lock manager
@@ -1599,10 +1607,11 @@ No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administr
 'lockmanager-fail-closelock' => 'Saan a marikepan ti nakandaduan a papeles para iti "$1".',
 'lockmanager-fail-deletelock' => 'Saan a maikkat ti nakandaduan a papeles para iti "$1".',
 'lockmanager-fail-acquirelock' => 'Saan a makaala ti kandado para iti "$1".',
-'lockmanager-fail-openlock' => 'Saan a maluktan ti kandado ti papeles para iti "$1".',
+'lockmanager-fail-openlock' => 'Saan a malukatan ti kandado ti papeles para iti "$1".',
 'lockmanager-fail-releaselock' => 'Saan a maibbatan ti kandado para iti "$1".',
 'lockmanager-fail-db-bucket' => 'Saan a makasilpo ti umanay a kandado kadagiti database idiay timba $1.',
 'lockmanager-fail-db-release' => 'Saan a maibbatan dagiti kandado idiay database $1.',
+'lockmanager-fail-svr-acquire' => 'Saan a makaala kadagiti kandado ti server $1.',
 'lockmanager-fail-svr-release' => 'Saan a maibbatan dagiti kandado idiay server $1.',
 
 # ZipDirectoryReader
@@ -1755,7 +1764,7 @@ Baka kayatmo nga urnosen ti bukodna a deskripsionna idiay [$2 deskripsion ti pap
 # MIME search
 'mimesearch' => 'Pagbiruk ti MIME',
 'mimesearch-summary' => 'Daytoy a panid ket pakabaelan na ti panagsagat ti papeles iti kita da a MIME.
-Ikabil: kita ti nagyan/apo a kita, e.g. <tt>image/jpeg</tt>.',
+Ikabil: kita ti nagyan/apo a kita, e.g. <code>image/jpeg</code>.',
 'mimetype' => 'Kita ti MIME:',
 'download' => 'Ikarga nga agpababa',
 
@@ -1836,7 +1845,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'nviews' => '$1 {{PLURAL:$1|a panangkita|kadagiti panangkita}}',
 'nimagelinks' => 'Inusar idiay $1 {{PLURAL:$1|a panid|a pampanid}}',
 'ntransclusions' => 'inusar idiay $1 {{PLURAL:$1|a panid|a pampanid}}',
-'specialpage-empty' => 'Awan dagiti nagbanagan na daytoy a padamag.',
+'specialpage-empty' => 'Awan dagiti nagbanaganna daytoy a padamag.',
 'lonelypages' => 'Dagiti naulila a panid',
 'lonelypagestext' => 'Dagiti sumaganad a panid ket saan a nakasilpo idiay wenno naipakita kadagiti sabali a panid idiay {{SITENAME}}.',
 'uncategorizedpages' => 'Dagiti saan a nakategoria a panid',
@@ -1957,7 +1966,7 @@ Kitaen met [[Special:WantedCategories|dagiti makidkiddaw a kategoria]].',
 'linksearch-ok' => 'Biruken',
 'linksearch-text' => 'Ti naataap a tarheta a kas "*.wikipedia.org" ket mabalin nga usaren.
 Masapul ti kangatuan a pagturayan, a kaspagarigan "*.org".<br />
-Natapayaen a protokol: <tt>$1</tt> (saanmo nga inayon dagitoy iti panagbirukmo) .',
+Natapayaen a protokol: <code>$1</code> (saanmo nga inayon dagitoy iti panagbirukmo) .',
 'linksearch-line' => 'Ti $1 ket nakasilpo idiay $2',
 'linksearch-error' => 'Ti naatap a tarheta ket agparang laeng iti pinagrugi ti nagan ti agsangaili.',
 
@@ -2473,8 +2482,8 @@ Saanka a makaaramid ti pakabilangan',
 'cant-block-while-blocked' => 'Saanmo a maserraan dagiti sabali nga agar-aramat no naserraan ka met.',
 'cant-see-hidden-user' => 'Ti agar-aramat a kayatmo a serraan ket naserraan ken nailemmeng.
 Ket awan met ti karbengam nga agilemming ti agar-aramat, saan mo a makita wenno mabaliwan ti serra ti agar-aramat.',
-'ipbblocked' => 'Saan mo a mabalin ti agserra wenno agikkat ti serra ti sabali nga agar-aramat, ngamin ket naserraan ka met.',
-'ipbnounblockself' => 'Saan mo a mabalin a lukatan ti serram',
+'ipbblocked' => 'Saanmo a mabalin ti agserra wenno agikkat ti serra ti sabali nga agar-aramat, ngamin ket naserraan ka met.',
+'ipbnounblockself' => 'Saanmo a mabalin a lukatan ti serram',
 
 # Developer tools
 'lockdb' => 'Balunetan ti database',
@@ -2487,7 +2496,7 @@ Pangngaasi ta pasingkedam a daytoy ti kayatmo nga aramiden.',
 'unlockconfirm' => 'Wen, talaga a kayatko a balunetan ti database.',
 'lockbtn' => 'Balunetan ti database',
 'unlockbtn' => 'Lukatan ti database',
-'locknoconfirm' => 'Saan mo nga inkur-it ti kahon ti pasingkedan.',
+'locknoconfirm' => 'Saanmo nga inkur-it ti kahon ti pasingkedan.',
 'lockdbsuccesssub' => 'Balligi ti pannakabalunet ti database',
 'unlockdbsuccesssub' => 'Naikkaten ti balunet ti database',
 'lockdbsuccesstext' => 'Nabalunetan ti database.<br />
@@ -2589,8 +2598,8 @@ Ti kinaudi a naikabil ti listaan ket adda dita baba tapno mausar a reperensia:",
 Ti kinaudi a naikabil ti listaan ket adda iti baba tapno mausar a reperensia:",
 'move-over-sharedrepo' => '== Addaan ti papeles ==
 [[:$1]] addaan idiay pagbingayan a nagikabilan. Ti panagiyalis ti papeles iti titulo nga itoy ket paawanen na ti pagbingayan a papeles.',
-'file-exists-sharedrepo' => 'Ti napilim a nagan ti papeles ket naususaren idiay pagbingayan a nagikabilan.
-Pangngaasi ta agpili ka ti sabali a nagan.',
+'file-exists-sharedrepo' => 'Ti napilim a nagan ti papeles ket naususaren idiay pagbingayan a pagikabilan.
+Pangngaasi nga agpilika ti sabali a nagan.',
 
 # Export
 'export' => 'Agipan dagiti panid',
@@ -2702,7 +2711,7 @@ Pangngaasi ta padasem manen.',
 
 # JavaScriptTest
 'javascripttest' => 'Subsubokan ti JavaScript',
-'javascripttest-disabled' => 'Daytoy nga opisio ket saan pay a napakabaelan iti daytoy a wiki.',
+'javascripttest-disabled' => 'Daytoy a pamay-an ket saan pay a napakabaelan iti daytoy a wiki.',
 'javascripttest-title' => 'Agpatpataray ti $1 a subsubokan',
 'javascripttest-pagetext-noframework' => 'Daytoy a panid ket nailasin para iti panagpataray ti subsubokan a JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Di amamo a pagsubsubokan a tabas "$1".',
@@ -2809,15 +2818,10 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 # Info page
 'pageinfo-title' => 'Pakaammo para iti "$1"',
 'pageinfo-header-edits' => 'Dagiti inurnos',
-'pageinfo-header-watchlist' => 'Listaan ti bambantayan',
-'pageinfo-header-views' => 'Dagiti pangkitaan',
-'pageinfo-subjectpage' => 'Panid',
-'pageinfo-talkpage' => 'Tungtungan a panid',
+'pageinfo-views' => 'Bilang dagiti panagkita',
 'pageinfo-watchers' => 'Bilang dagiti agbuybuya',
 'pageinfo-edits' => 'Bilang dagiti inurnos:',
 'pageinfo-authors' => 'Ti bilang dagiti sabsabali a mannurat',
-'pageinfo-views' => 'Bilang dagiti panagkita',
-'pageinfo-viewsperedit' => 'Mano a panagkita ti tunggal maysa nga urnos',
 
 # Patrolling
 'markaspatrolleddiff' => 'Markaan a kas napatruliaan',
@@ -3167,7 +3171,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-flash-mode-2' => 'kinasigud a pinagiddep ti pinagsilap',
 'exif-flash-mode-3' => 'automatiko',
 'exif-flash-function-1' => 'Awan ti silap nga opisio',
-'exif-flash-redeye-1' => 'wagas a pinagikkat ti pinaglabbaga ti mata',
+'exif-flash-redeye-1' => 'wagas a panagikkat ti panaglabbaga ti mata',
 
 'exif-focalplaneresolutionunit-2' => 'pulgada',
 
@@ -3190,7 +3194,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-exposuremode-1' => 'Manual a panakailatakan',
 'exif-exposuremode-2' => 'Auto bracket',
 
-'exif-whitebalance-0' => 'Automatiko a pinagtimbang ti puraw',
+'exif-whitebalance-0' => 'Automatiko a panagtimbang ti puraw',
 'exif-whitebalance-1' => 'Manual a panagtimbang ti puraw',
 
 'exif-scenecapturetype-0' => 'Pagalagadan',
@@ -3274,7 +3278,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-dc-source' => 'Taudan ti midia',
 'exif-dc-type' => 'Kita ti midia',
 
-'exif-rating-rejected' => 'Saan nga naawat',
+'exif-rating-rejected' => 'Saan a naawat',
 
 'exif-isospeedratings-overflow' => 'Dakdakkel ngem 65535',
 
@@ -3382,8 +3386,8 @@ Daytoy a kodigo a pasingkedan ket agpaso iti $4.',
 'invalidateemail' => 'Ukasen ti pammasingked ti e-surat',
 
 # Scary transclusion
-'scarytranscludedisabled' => '[Nabaldado ti Interwiki pinagiraman]',
-'scarytranscludefailed' => '[Napaay ti pinagala ti templeta ti $1]',
+'scarytranscludedisabled' => '[Nabaldado ti Interwiki panagiraman]',
+'scarytranscludefailed' => '[Napaay ti panagala ti plantilia para iti $1]',
 'scarytranscludetoolong' => '[Atiddog unay ti URL]',
 
 # Delete conflict
@@ -3605,8 +3609,8 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'htmlform-selectorother-other' => 'Sabali',
 
 # SQLite database support
-'sqlite-has-fts' => '$1 adda ti suporta ti napno a teksto ti panagbiruk',
-'sqlite-no-fts' => '$1 awan ti suporta ti napno a teksto ti panagbiruk',
+'sqlite-has-fts' => '$1 adda ti suporta ti napno a testo ti panagbiruk',
+'sqlite-no-fts' => '$1 awan ti suporta ti napno a testo ti panagbiruk',
 
 # New logging system
 'logentry-delete-delete' => 'Inikkat ni $1 ti panid  ti $3',
@@ -3667,9 +3671,12 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 'api-error-empty-file' => 'Ti papeles nga intedmo ket awan ti nagyan na.',
 'api-error-emptypage' => 'Agar-aramid ti baro, dagiti awan ti linaon na a panid ket saan a maipalubos.',
 'api-error-fetchfileerror' => 'Kinauneg a biddut: Addaan ti dakes a napasamak idi agalala ti papeles.',
+'api-error-fileexists-forbidden' => 'Ti papeles nga agnagan ti "$1" ket addan, ken saan a mabalin a masuratan manen.',
+'api-error-fileexists-shared-forbidden' => 'Ti papeles nga agnagan ti "$1" ket adda idiay pagbibingayan a repositorio ti papeles, ken saan a mabalin a masuratan manen.',
 'api-error-file-too-large' => 'Ti papeles nga intedmo ket dakkel unay.',
 'api-error-filename-tooshort' => 'Ti nagan daytoy a papeles ket bassit unay.',
 'api-error-filetype-banned' => 'Ti kita daytoy a papeles ket maiparit.',
+'api-error-filetype-banned-type' => 'Ti $1 {{PLURAL:$4|ket saan a mapalubusan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}. Ti mapalubusan{{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.',
 'api-error-filetype-missing' => 'Ti papeles ket agkurang ti pagpa-atiddog.',
 'api-error-hookaborted' => 'Ti panagbabaro a pinadasmo ket napasardeng iti pangpa-atiddog a kawit.',
 'api-error-http' => 'Kinauneg a biddut: Saan a makaikabit idiay server.',
index 89752bb..26ca3da 100644 (file)
@@ -865,9 +865,9 @@ Videz rezumo plu vidala en la [[Special:NewFiles|galerio di nova arkivi]].',
 'uploadedfiles' => 'Adkargita arkivi',
 'ignorewarning' => 'Ignorar la averto e gardar la arkivo irgakaze.',
 'badfilename' => 'La imajo-nomo chanjesis a "$1".',
-'fileexists' => "Arkivo kun ica nomo ja existas.
-Volutez kontrolar '''<tt>[[:$1]]</tt>''' se vu ne esas certa pri chanjar olu.
-[[$1|thumb]]",
+'fileexists' => 'Arkivo kun ica nomo ja existas.
+Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
+[[$1|thumb]]',
 'uploadwarning' => 'Averto pri la adkargo di arkivo',
 'savefile' => 'Registragar arkivo',
 'uploadedimage' => 'adkargita "[[$1]]"',
index 04a59f1..60f2d71 100644 (file)
@@ -80,54 +80,54 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#tilvísun', '#TILVÍSUN', '#REDIRECT' ),
-       'nogallery'               => array( '0', '__EMSAFN__', '__NOGALLERY__' ),
-       'currentday'              => array( '1', 'NÚDAGUR', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'NÚDAGUR2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NÚDAGNAFN', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'NÚÁR', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'NÚTÍMI', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'NÚKTÍMI', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'STMÁN', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'STMÁNNAFN', 'LOCALMONTHNAME' ),
-       'localmonthabbrev'        => array( '1', 'STMÁNST', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'STDAGUR', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'STDAGUR2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'STDAGNAFN', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'STÁR', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'STTÍMI', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'STKTÍMI', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'FJLSÍÐA', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'FJLGREINA', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'FJLSKJALA', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'FJLNOT', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'FJLBREYT', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'SÍÐUNAFN', 'PAGENAME' ),
-       'namespace'               => array( '1', 'NAFNSVÆÐI', 'NAMESPACE' ),
-       'talkspace'               => array( '1', 'SPJALLSVÆÐI', 'TALKSPACE' ),
-       'fullpagename'            => array( '1', 'FULLTSÍÐUNF', 'FULLPAGENAME' ),
-       'img_manualthumb'         => array( '1', 'þumall', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'hægri', 'right' ),
-       'img_left'                => array( '1', 'vinstri', 'left' ),
-       'img_none'                => array( '1', 'engin', 'none' ),
-       'img_width'               => array( '1', '$1dp', '$1px' ),
-       'img_center'              => array( '1', 'miðja', 'center', 'centre' ),
-       'img_sub'                 => array( '1', 'undir', 'sub' ),
-       'img_super'               => array( '1', 'yfir', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'efst', 'top' ),
-       'img_bottom'              => array( '1', 'neðst', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'texti-neðst', 'text-bottom' ),
-       'ns'                      => array( '0', 'NR:', 'NS:' ),
-       'server'                  => array( '0', 'VEFÞJ', 'SERVER' ),
-       'servername'              => array( '0', 'VEFÞJNF', 'SERVERNAME' ),
-       'grammar'                 => array( '0', 'MÁLFRÆÐI:', 'GRAMMAR:' ),
-       'currentweek'             => array( '1', 'NÚVIKA', 'CURRENTWEEK' ),
-       'localweek'               => array( '1', 'STVIKA', 'LOCALWEEK' ),
-       'plural'                  => array( '0', 'FLTALA:', 'PLURAL:' ),
-       'raw'                     => array( '0', 'HRÁ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'SÝNATITIL', 'DISPLAYTITLE' ),
-       'language'                => array( '0', '#TUNGUMÁL', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'kerfissíða', 'special' ),
+       'redirect'                  => array( '0', '#tilvísun', '#TILVÍSUN', '#REDIRECT' ),
+       'nogallery'                 => array( '0', '__EMSAFN__', '__NOGALLERY__' ),
+       'currentday'                => array( '1', 'NÚDAGUR', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'NÚDAGUR2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NÚDAGNAFN', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'NÚÁR', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'NÚTÍMI', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'NÚKTÍMI', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'STMÁN', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'STMÁNNAFN', 'LOCALMONTHNAME' ),
+       'localmonthabbrev'          => array( '1', 'STMÁNST', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'STDAGUR', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'STDAGUR2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'STDAGNAFN', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'STÁR', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'STTÍMI', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'STKTÍMI', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'FJLSÍÐA', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'FJLGREINA', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'FJLSKJALA', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'FJLNOT', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'FJLBREYT', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'SÍÐUNAFN', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'NAFNSVÆÐI', 'NAMESPACE' ),
+       'talkspace'                 => array( '1', 'SPJALLSVÆÐI', 'TALKSPACE' ),
+       'fullpagename'              => array( '1', 'FULLTSÍÐUNF', 'FULLPAGENAME' ),
+       'img_manualthumb'           => array( '1', 'þumall', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'hægri', 'right' ),
+       'img_left'                  => array( '1', 'vinstri', 'left' ),
+       'img_none'                  => array( '1', 'engin', 'none' ),
+       'img_width'                 => array( '1', '$1dp', '$1px' ),
+       'img_center'                => array( '1', 'miðja', 'center', 'centre' ),
+       'img_sub'                   => array( '1', 'undir', 'sub' ),
+       'img_super'                 => array( '1', 'yfir', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'efst', 'top' ),
+       'img_bottom'                => array( '1', 'neðst', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'texti-neðst', 'text-bottom' ),
+       'ns'                        => array( '0', 'NR:', 'NS:' ),
+       'server'                    => array( '0', 'VEFÞJ', 'SERVER' ),
+       'servername'                => array( '0', 'VEFÞJNF', 'SERVERNAME' ),
+       'grammar'                   => array( '0', 'MÁLFRÆÐI:', 'GRAMMAR:' ),
+       'currentweek'               => array( '1', 'NÚVIKA', 'CURRENTWEEK' ),
+       'localweek'                 => array( '1', 'STVIKA', 'LOCALWEEK' ),
+       'plural'                    => array( '0', 'FLTALA:', 'PLURAL:' ),
+       'raw'                       => array( '0', 'HRÁ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'SÝNATITIL', 'DISPLAYTITLE' ),
+       'language'                  => array( '0', '#TUNGUMÁL', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'kerfissíða', 'special' ),
 );
 
 $specialPageAliases = array(
@@ -148,7 +148,7 @@ $specialPageAliases = array(
        'Contributions'             => array( 'Framlög' ),
        'CreateAccount'             => array( 'Búa_til_aðgang' ),
        'Deadendpages'              => array( 'Botnlangar' ),
-       'DeletedContributions'      => array( 'Edd_framlög' ),
+       'DeletedContributions'      => array( 'Eydd_framlög' ),
        'Disambiguations'           => array( 'Tenglar_í_aðgreiningarsíður' ),
        'DoubleRedirects'           => array( 'Tvöfaldar_tilvísanir' ),
        'EditWatchlist'             => array( 'Breyta_vaktlista' ),
@@ -200,6 +200,7 @@ $specialPageAliases = array(
        'Shortpages'                => array( 'Stuttar_síður' ),
        'Specialpages'              => array( 'Kerfissíður' ),
        'Statistics'                => array( 'Tölfræði' ),
+       'Tags'                      => array( 'Tög' ),
        'Unblock'                   => array( 'Afbönnun' ),
        'Uncategorizedcategories'   => array( 'Óflokkaðir_flokkar' ),
        'Uncategorizedimages'       => array( 'Óflokkaðar_myndir' ),
@@ -217,6 +218,7 @@ $specialPageAliases = array(
        'Userrights'                => array( 'Notandaréttindi' ),
        'Version'                   => array( 'Útgáfa' ),
        'Wantedcategories'          => array( 'Eftirsóttir_flokkar' ),
+       'Wantedfiles'               => array( 'Eftirsóttar_skrár' ),
        'Wantedpages'               => array( 'Eftirsóttar_síður' ),
        'Wantedtemplates'           => array( 'Eftirsótt_snið' ),
        'Watchlist'                 => array( 'Vaktlistinn' ),
@@ -244,15 +246,15 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Virkja hlutabreytingu með því að hægrismella á hlutafyrirsagnir (JavaScript)',
 'tog-showtoc' => 'Sýna efnisyfirlit (fyrir síður með meira en 3 fyrirsagnir)',
 'tog-rememberpassword' => 'Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})',
-'tog-watchcreations' => 'Bæta síðum sem ég bý til á vaktlistann minn',
-'tog-watchdefault' => 'Bæta síðum sem ég breyti á vaktlistann minn',
-'tog-watchmoves' => 'Bæta síðum sem ég færi á vaktlistann minn',
-'tog-watchdeletion' => 'Bæta síðum sem ég eyði á vaktlistann minn',
+'tog-watchcreations' => 'Bæta síðum sem ég bý til og skrám sem ég hleð inn á vaktlistann minn',
+'tog-watchdefault' => 'Bæta síðum og skrám sem ég breyti á vaktlistann minn',
+'tog-watchmoves' => 'Bæta síðum og skrám sem ég færi á vaktlistann minn',
+'tog-watchdeletion' => 'Bæta síðum og skrám sem ég eyði á vaktlistann minn',
 'tog-minordefault' => 'Merkja allar breytingar sem minniháttar sjálfgefið',
 'tog-previewontop' => 'Sýna forskoðun á undan breytingarkassanum',
 'tog-previewonfirst' => 'Sýna forskoðun með fyrstu breytingu',
 'tog-nocache' => 'Slökkva á flýtiminni vafrans',
-'tog-enotifwatchlistpages' => 'Senda mér tölvupóst þegar síðu á vaktlistanum mínu er breytt',
+'tog-enotifwatchlistpages' => 'Senda mér tölvupóst þegar síðu eða skrá á vaktlistanum mínu er breytt',
 'tog-enotifusertalkpages' => 'Senda mér tölvupóst þegar notandaspjallinu mínu er breytt',
 'tog-enotifminoredits' => 'Senda mér einnig tölvupóst vegna minniháttar breytinga á síðum',
 'tog-enotifrevealaddr' => 'Gefa upp netfang mitt í tilkynningarpóstum',
@@ -475,7 +477,7 @@ $1',
 'helppage' => 'Help:Efnisyfirlit',
 'mainpage' => 'Forsíða',
 'mainpage-description' => 'Forsíða',
-'policy-url' => 'Project:Stjórnarstefnur',
+'policy-url' => 'Project:Samþykktir',
 'portal' => 'Samfélagsgátt',
 'portal-url' => 'Project:Samfélagsgátt',
 'privacy' => 'Meðferð persónuupplýsinga',
@@ -617,6 +619,10 @@ $2',
 'filereadonlyerror' => 'Ekki var hægt að breyta skránni "$1" því skráin í skráarsafninu "$2" er engöngu hægt að lesa.
 
 Möppudýrið sem læsti skránni gaf þessa ástæðu: "\'\'$3\'\'".',
+'invalidtitle-knownnamespace' => 'Ógildur titill í nafnrými "$2" og með textann "$3"',
+'invalidtitle-unknownnamespace' => 'Ógildur titill með óþekkt nafnrými númer $1 og texta "$2"',
+'exception-nologin' => 'Óinnskráð(ur)',
+'exception-nologin-text' => 'Þessi síða eða aðgerð krefst þess að þú sért skráður inn á þessum wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Slæm stilling: óþekktur veiruskannari: ''$1''",
@@ -647,7 +653,7 @@ Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}}-stillingunum]] þínum
 'userlogout' => 'Útskrá',
 'notloggedin' => 'Ekki innskráð(ur)',
 'nologin' => "Ekki með aðgang? '''$1'''.",
-'nologinlink' => 'Stofnaðu til aðgangs',
+'nologinlink' => 'Stofnaðu aðgang',
 'createaccount' => 'Nýskrá',
 'gotaccount' => "Nú þegar með notandanafn? '''$1'''.",
 'gotaccountlink' => 'Skráðu þig inn',
@@ -871,7 +877,7 @@ Hlutinn gæti hafa verið fluttur til eða hent á meðan þú varst að skoða
 
 Hægt er að breyta lykilorðinu fyrir aðganginn á ''[[Special:ChangePassword|change password]]'' þegar notandinn hefur skráð sig inn.",
 'newarticle' => '(Ný)',
-'newarticletext' => "Þú hefur fylgt tengli á síðu sem ekki er til.
+'newarticletext' => "Þú hefur fylgt tengli á síðu sem ekki er til ennþá.
 Þú getur búið til síðu með þessu nafni með því að skrifa í formið fyrir neðan
 (meiri upplýsingar í [[{{MediaWiki:Helppage}}|hjálpinni]]).
 Ef þú hefur óvart villst hingað geturðu notað '''til baka'''-hnappinn í vafranum þínum.",
@@ -984,6 +990,7 @@ Svo virðist sem henni hafi verið eytt.',
 'edit-no-change' => 'Breyting þín var hunsuð, því engin breyting var á textanum.',
 'edit-already-exists' => 'Gat ekki skapað nýja síðu.
 Hún er nú þegar til.',
+'defaultmessagetext' => 'Sjálfgefinn skilaboða texti',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Viðvörun:''' Þessi síða inniheldur of mörg vinnslufrek aðgerðar þáttunar köll.
@@ -1242,6 +1249,7 @@ Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
 'prefs-beta' => 'Stillingar á prufustigi',
 'prefs-datetime' => 'Tímasnið og tímabelti',
 'prefs-labs' => 'Stillingar á tilraunastigi',
+'prefs-user-pages' => 'Notendasíður',
 'prefs-personal' => 'Notandaupplýsingar',
 'prefs-rc' => 'Nýlegar breytingar',
 'prefs-watchlist' => 'Vaktlistinn',
@@ -1374,7 +1382,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 # Groups
 'group' => 'Hópur:',
 'group-user' => 'Notendur',
-'group-autoconfirmed' => 'Sjálfkrafa staðfesting notenda',
+'group-autoconfirmed' => 'Sjálfkrafa staðfestir notendur',
 'group-bot' => 'Vélmenni',
 'group-sysop' => 'Stjórnendur',
 'group-bureaucrat' => 'Möppudýr',
@@ -1389,7 +1397,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 'group-suppress-member' => '{{GENDER:$1|Umsjón}}',
 
 'grouppage-user' => '{{ns:project}}:Notendur',
-'grouppage-autoconfirmed' => '{{ns:project}}:Sjálfkrafa staðfesting notenda',
+'grouppage-autoconfirmed' => '{{ns:project}}:Sjálfkrafa staðfestir notendur',
 'grouppage-bot' => '{{ns:project}}:Vélmenni',
 'grouppage-sysop' => '{{ns:project}}:Stjórnendur',
 'grouppage-bureaucrat' => '{{ns:project}}:Möppudýr',
@@ -1420,6 +1428,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 'right-writeapi' => 'Nota API skrifun',
 'right-delete' => 'Eyða síðum',
 'right-bigdelete' => 'Eyða síðum með stórum breytingaskrám',
+'right-deletelogentry' => 'Eyða og endurvekja sérstakar aðgerða færslur',
 'right-deleterevision' => 'Eyða og endurvekja sérstaka breytignar á síðum',
 'right-deletedhistory' => 'Skoða eyddar færslur úr breytingarskrá, án efnis þeirra',
 'right-deletedtext' => 'Sjá eyddan texta og breytingar á milli eyddra útgáfna',
@@ -1564,9 +1573,9 @@ Síðasta færsla skráarinnar úr bönnunarskrá og flutningskrá er sýnd hér
 'uploadtext' => "Notaðu eyðublaðið hér fyrir neðan til að hlaða inn skrám.
 Til að skoða eða leita í áður innhlöðnum skrám ferðu á [[Special:FileList|skráarlistann]], (endur)innhlaðnar skrár eru skráðar í [[Special:Log/upload|innhlaðningarskránni]], eyðingar í [[Special:Log/delete|eyðingaskránni]].
 
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.jpg]]</nowiki></tt>''' til að sýna skránna í fullri upplausn.
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.png|200px|thumb|left|alt-texti]]</nowiki></tt>''' til að nota 200 díla upplausn í kassa, sett til vinstri með 'alt text' sem myndlýsingu.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Skrá.ogg]]</nowiki></tt>''' til að tengja í myndina án þess að sýna hana.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.jpg]]</nowiki></code>''' til að sýna skránna í fullri upplausn.
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.png|200px|thumb|left|alt-texti]]</nowiki></code>''' til að nota 200 díla upplausn í kassa, sett til vinstri með 'alt text' sem myndlýsingu.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Skrá.ogg]]</nowiki></code>''' til að tengja í myndina án þess að sýna hana.",
 'upload-permitted' => 'Heimilaðar skráargerðir: $1.',
 'upload-preferred' => 'Ákjósanlegustu skrárgerðirnar: $1.',
 'upload-prohibited' => 'Óheimiluð skrárgerð: $1.',
@@ -1613,21 +1622,21 @@ Gjörðu svo vel og endurnefndu skrána og hladdu henni inn aftur.',
 Þetta gæti verið vegna ásláttarvillu í skráarnafninu.
 Vinsamlegast athugaðu hvort þú viljir hlaða skránni inn.',
 'windows-nonascii-filename' => 'Þessi wiki styður ekki skráarnöfn með sérstökum stöfum',
-'fileexists' => "Skrá með þessu nafni er þegar til, skoðaðu '''<tt>[[:$1]]</tt>''' ef þú ert óviss um hvort þú viljir breyta henni, ekki verður skrifað yfir gömlu skránna hlaðiru inn nýrri með sama nafni heldur verður núverandi útgáfa geymd í útgáfusögu.
-[[$1|thumb]]",
-'filepageexists' => "Myndasíðan fyrir þessa síðu hefur þegar verið búin til '''<tt>[[:$1]]</tt>''', en engin skrá er til með þessu nafni.
+'fileexists' => 'Skrá með þessu nafni er þegar til, skoðaðu <strong>[[:$1]]</strong> ef þú ert óviss um hvort þú viljir breyta henni, ekki verður skrifað yfir gömlu skránna hlaðiru inn nýrri með sama nafni heldur verður núverandi útgáfa geymd í útgáfusögu.
+[[$1|thumb]]',
+'filepageexists' => 'Myndasíðan fyrir þessa síðu hefur þegar verið búin til <strong>[[:$1]]</strong>, en engin skrá er til með þessu nafni.
 Lýsingin sem þú skrifaðir verður ekki birt á myndasíðunni.
 Til þess að lýsingin geti birst á síðunni, þá þarft þú að breyta síðunni sérstaklega.
-[[$1|thumb]]",
-'fileexists-extension' => "Skrá með svipuðu nafni er til: [[$2|thumb]]
-*Nafn skráarinnar sem hlaða á inn: '''<tt>[[:$1]]</tt>'''
-*Nafn skráarinnar sem er þegar til: '''<tt>[[:$2]]</tt>'''
-Vinsamlegast veldu annað skráarnafn.",
-'fileexists-thumbnail-yes' => "Skráin virðist vera smámynd [[$1|thumb]]
-Vinsamlegast athugaðu skránna '''<tt>[[:$1]]</tt>'''.
-Ef skráin er sama myndin í upprunalegri stærð er ekki þörf á annari smámynd.",
-'file-thumbnail-no' => "Skráin er líklega smámynd, því skráarnafnið byrjar á '''<tt>$1</tt>'''.
-Ef skráin er í fullri upplausn haltu þá áfram að hlaða henni inn, en ef ekki breyttu þá skráarnafninu.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Skrá með svipuðu nafni er til: [[$2|thumb]]
+*Nafn skráarinnar sem hlaða á inn: <strong>[[:$1]]</strong>
+*Nafn skráarinnar sem er þegar til: <strong>[[:$2]]</strong>
+Vinsamlegast veldu annað skráarnafn.',
+'fileexists-thumbnail-yes' => 'Skráin virðist vera smámynd [[$1|thumb]]
+Vinsamlegast athugaðu skránna <strong>[[:$1]]</strong>.
+Ef skráin er sama myndin í upprunalegri stærð er ekki þörf á annari smámynd.',
+'file-thumbnail-no' => 'Skráin er líklega smámynd, því skráarnafnið byrjar á <strong>$1</strong>.
+Ef skráin er í fullri upplausn haltu þá áfram að hlaða henni inn, en ef ekki breyttu þá skráarnafninu.',
 'fileexists-forbidden' => 'Skrá með þessu nafni er þegar til og ekki er hægt að skrifa yfir skránna.
 Ef þú villt hlaða inn skránni þinni engu að síður, farðu þá til baka og veldu annað skráarnafn.
 [[File:$1|thumb|center|$1]]',
@@ -1700,8 +1709,8 @@ Ef vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjó
 'backend-fail-writetemp' => 'Gat ekki skrifað í tímabundna skrá.',
 'backend-fail-closetemp' => 'Mistókst að loka tímabundinni skrá.',
 'backend-fail-read' => 'Mistókst að lesa skrá $1.',
-'backend-fail-create' => 'Mistókst að búa til skrá $1.',
-'backend-fail-maxsize' => 'Mistókst að búa til skránna $1 því hún er stærri en {{PLURAL:$2|eitt bæti|$2 bæti}}.',
+'backend-fail-create' => 'Mistókst að skrifa skrá $1.',
+'backend-fail-maxsize' => 'Mistókst að skrifa skránna $1 því hún er stærri en {{PLURAL:$2|eitt bæti|$2 bæti}}.',
 'backend-fail-readonly' => 'Gagnabankann "$1" er engöngu hægt að lesa í augnablikinu. Ástæðan sem var gefin er: "\'\'$2\'\'"',
 'backend-fail-connect' => 'Mistókst að tengjast gagnabankanum "$1".',
 'backend-fail-internal' => 'Óþekkt villa átti sér stað í gagnabankanum "$1".',
@@ -1850,7 +1859,7 @@ Hentugra væri ef þú gætir breytt lýsingu skráarinnar á [$2 myndasíðu] h
 'mimesearch' => 'MIME-leit',
 'mimesearch-summary' => 'Þessi síða gerir þér kleift að leita eftir skrám eftir MIME-gerð þeirra.
 
-Leitarstrengurinn á að vera á þessu formi: efnistag/myndasnið, t.d. <tt>image/jpeg</tt>.',
+Leitarstrengurinn á að vera á þessu formi: efnistag/myndasnið, t.d. <code>image/jpeg</code>.',
 'mimetype' => 'MIME-tegund:',
 'download' => 'Hlaða niður',
 
@@ -2005,6 +2014,7 @@ Vinsamlegast athugið að aðrar vefsíður gætu tengt beint í skrár héðan,
 Þú getur takmarkað listann með því að velja tegund aðgerðaskráar, notandanafn, eða síðu.',
 'logempty' => 'Engin slík aðgerð fannst.',
 'log-title-wildcard' => 'Leita að titlum sem byrja á þessum texta',
+'showhideselectedlogentries' => 'Sýna/fela valdar aðgerða færslur',
 
 # Special:AllPages
 'allpages' => 'Allar síður',
@@ -2024,6 +2034,10 @@ Vinsamlegast athugið að aðrar vefsíður gætu tengt beint í skrár héðan,
 'allpages-bad-ns' => '{{SITENAME}} hefur ekki nafnrými „$1“.',
 'allpages-hide-redirects' => 'Fela tilvísanir',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Þú ert að skoða útgáfu síðunnar úr skyndiminni, sem getur verið allt að $1 gömul.',
+'cachedspecial-refresh-now' => 'Skoða síðustu',
+
 # Special:Categories
 'categories' => 'Flokkar',
 'categoriespagetext' => 'Eftirfarandi {{PLURAL:$1|flokkur inniheldur|flokkar innihalda}} síður eða skrár.
@@ -2031,7 +2045,7 @@ Vinsamlegast athugið að aðrar vefsíður gætu tengt beint í skrár héðan,
 Sjá einnig [[Special:WantedCategories|eftirsótta flokka]].',
 'categoriesfrom' => 'Sýna flokka frá:',
 'special-categories-sort-count' => 'raða eftir fjölda',
-'special-categories-sort-abc' => 'raða eftir stafrófinu',
+'special-categories-sort-abc' => 'raða í stafrófsröð',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'Eyddar breytingar notanda',
@@ -2045,7 +2059,7 @@ Sjá einnig [[Special:WantedCategories|eftirsótta flokka]].',
 'linksearch-ok' => 'Leita',
 'linksearch-text' => 'Algildistafir eins og "*.wikipedia.org" eru leyfðir.<br />
 Stafurinn þarf í minnsta kosti að innihalda rótarlén, eins og "*.org"
-Studdar samskiptareglur: <tt>$1</tt> (ekki bæta neinum af þessum í leitina)',
+Studdar samskiptareglur: <code>$1</code> (ekki bæta neinum af þessum í leitina)',
 'linksearch-line' => 'Tengt er í $1 á síðunni $2',
 'linksearch-error' => 'Algildistafir mega engöngu birtast í upphafi vefslóðarinnar.',
 
@@ -2162,41 +2176,48 @@ Frekari breytingar á henni eða spallsíðu hennar munu verða sýndar þar, og
 'enotif_newpagetext' => 'Þetta er ný síða.',
 'enotif_impersonal_salutation' => '{{SITENAME}}notandi',
 'changed' => 'breytt',
-'created' => 'búið til',
+'created' => 'búin til',
 'enotif_subject' => '$PAGETITLE á {{SITENAME}} hefur verið $CHANGEDORCREATED af $PAGEEDITOR',
-'enotif_lastvisited' => 'Sjá $1 fyrir allar breytingar síðan þú sóttir síðuna síðast.',
-'enotif_lastdiff' => 'Sjá $1 til að skoða þessa breytingu.',
+'enotif_lastvisited' => 'Heimsóttu eftirfarandi tengil til að sjá allar breytingar síðan 
+þú heimsóttir síðuna síðast:
+  $1',
+'enotif_lastdiff' => 'Einnig getur þú heimsótt eftirfarandi tengil til að skoða þessa breytingu:
+  $1',
 'enotif_anon_editor' => 'ónefndur notandi $1',
 'enotif_body' => 'Kæri $WATCHINGUSERNAME,
 
+Það lítur út fyrir að þú hafir ný skilaboð á {{SITENAME}} $PAGETITLE.
+Hún hefur verið $CHANGEDORCREATED $PAGEEDITDATE af 
+$PAGEEDITOR. Breytingarágripið var:
+
+   $PAGESUMMARY
 
-Síðan $PAGETITLE á {{SITENAME}} hefur verið $CHANGEDORCREATED þann $PAGEEDITDATE eftir $PAGEEDITOR, sjá $PAGETITLE_URL fyrir núverandi útgáfu.
+Þetta er tengill á spjallsíðuna þína:
+
+   $PAGETITLE_URL
 
 $NEWPAGE
 
-Breytingarágrip notandans: $PAGESUMMARY $PAGEMINOREDIT
+Til þess að hafa samband við $PAGEEDITOR, heimsóttu:
 
-Samskipta upplýsingar notandans:
-netfang: $PAGEEDITOR_EMAIL
-wiki: $PAGEEDITOR_WIKI
+   $PAGEEDITOR_WIKI
 
-Engar frekari tilkynningar verða sendar nema þú heimsækir síðuna.
-Þú getur einnig endursett tilkynninga merkingar fyrir allar síður á vaktlistanum.
+Athugaðu að frekari breytingar á $PAGETITLE leiða
+ekki af sér fleiri tilkynningar fyrr en þú hefur heimsótt síðuna.
 
-                        Vingjarnlega {{SITENAME}} tilkynningar kerfið
+Kveðja,
+{{SITENAME}}
 
 --
-Til þess að breyta tilkynningum sem sendast á netfangið, smelltu á
+
+Til þess að breyta stillingum um hvenær þú færð sendar tilkynningar, heimsóttu:
+
 {{canonicalurl:{{#special:Preferences}}}}
 
-Til þess að breyta stillingum vaktlistans, smelltu á
-{{canonicalurl:{{#special:EditWatchlist}}}}
 
-Til þess að eyða síðunni af vaktlistanum, smelltu á
-$UNWATCHURL
+Til þess að hætta að fylgjast með $PAGETITLE, heimsóttu:
 
-Svörun og frekari aðstoð:
-{{canonicalurl:{{MediaWiki:Helppage}}}}',
+$UNWATCHURL',
 
 # Delete
 'deletepage' => 'Eyða',
@@ -2235,6 +2256,8 @@ Eyðing síðunnar gæti truflað vinnslu gangnasafns {{SITENAME}}; haltu áfram
 'rollback' => 'Taka aftur breytingar',
 'rollback_short' => 'Taka aftur',
 'rollbacklink' => 'taka aftur',
+'rollbacklinkcount' => 'taka aftur $1 {{PLURAL:$1|breytingu|breytingar}}',
+'rollbacklinkcount-morethan' => 'taka aftur fleiri en $1 {{PLURAL:$1|breytingu|breytingar}}',
 'rollbackfailed' => 'Mistókst að taka aftur',
 'cantrollback' => 'Ekki hægt að taka aftur breytingu, síðasti höfundur er eini höfundur þessarar síðu.',
 'alreadyrolled' => 'Ekki var hægt að taka síðustu breytingu [[:$1]] eftir [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) til baka;
@@ -2301,7 +2324,7 @@ Núverandi staða síðunnar er '''$1''':",
 ** Breytingarstríð
 ** Síða með margar heimsóknir',
 'protect-edit-reasonlist' => 'Breyta verndarástæðum',
-'protect-expiry-options' => '1 tím:1 hour,1 dag:1 day,1 viku:1 week,2 vikur:2 weeks,1 mánuð:1 month,3 mánuði:3 months,6 mánuði:6 months,1 ár:1 year,aldrei:infinite',
+'protect-expiry-options' => '1 tími:1 hour,1 dag:1 day,1 viku:1 week,2 vikur:2 weeks,1 mánuð:1 month,3 mánuði:3 months,6 mánuði:6 months,1 ár:1 year,aldrei:infinite',
 'restriction-type' => 'Réttindi:',
 'restriction-level' => 'Takmarkaði við:',
 'minimum-size' => 'Lágmarksstærð',
@@ -2423,7 +2446,7 @@ Síðasta færsla vistfangsins úr bönnunarskrá er sýnd hér fyrir neðan til
 'whatlinkshere-links' => '← tenglar',
 'whatlinkshere-hideredirs' => '$1 tilvísanir',
 'whatlinkshere-hidetrans' => '$1 ítengingar',
-'whatlinkshere-hidelinks' => '$1 tenglar',
+'whatlinkshere-hidelinks' => '$1 tengla',
 'whatlinkshere-hideimages' => '$1 myndatenglar',
 'whatlinkshere-filters' => 'Síur',
 
@@ -2466,7 +2489,7 @@ Gefðu nákvæma skýringu að neðan (til dæmis, með því að vísa í þær
 'badipaddress' => 'Ógilt vistfang',
 'blockipsuccesssub' => 'Bann tókst',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] hefur verið bannaður/bönnuð.<br />
-Sjá [[Special:BlockList|bannaðar notendur og vistföng]] fyrir yfirlit yfir núverandi bönn.',
+Sjá [[Special:BlockList|bannaðir notendur og vistföng]] fyrir yfirlit yfir núverandi bönn.',
 'ipb-blockingself' => 'Þú ert í þann mund að banna sjálfan þig! Ertu viss um að þú viljir gera það?',
 'ipb-confirmhideuser' => 'Þú ert í þann mund að banna notenda sem er falinn. Notendanafn hans mun ekki birtast í listum og aðgerðarskrám. Ertu viss um að þú viljir gera það?',
 'ipb-edit-dropdown' => 'Breyta ástæðu fyrir banni',
@@ -2684,7 +2707,7 @@ Ef síðari möguleikinn á við getur þú einnig notað tengil, til dæmis
 # Namespace 8 related
 'allmessages' => 'Meldingar',
 'allmessagesname' => 'Titill',
-'allmessagesdefault' => 'Sjálfgefinn texti',
+'allmessagesdefault' => 'Sjálfgefinn skilaboða texti',
 'allmessagescurrent' => 'Núverandi texti',
 'allmessagestext' => 'Þetta er listi yfir kerfismeldingar í Melding-nafnrýminu.
 Gjörðu svo vel og heimsæktu [//www.mediawiki.org/wiki/Localisation MediaWiki-staðfæringuna] og [//translatewiki.net translatewiki.net] ef þú vilt taka þátt í almennri MediaWiki-staðfæringu.',
@@ -2751,6 +2774,9 @@ Vinsamlegast reyndu aftur.',
 'import-invalid-interwiki' => 'Get ekki flutt inn frá þessum wiki.',
 'import-error-edit' => 'Síðan "$1" var ekki flutt inn því þú hefur ekki réttindi til að breyta henni.',
 'import-error-create' => 'Síðan "$1" var ekki flutt inn því þú hefur ekki réttindi til að stofna hana.',
+'import-error-interwiki' => 'Síðan "$1" var ekki flutt inn því nafn hennar er frátekið fyrir ytri tengla (tungumálatengla).',
+'import-error-special' => 'Síðan "$1" var ekki flutt inn því hún tilheyrir ákveðnu nafnrými sem leyfir ekki síður.',
+'import-error-invalid' => 'Síðan "$1" var ekki flutt inn því nafn hennar er ógilt.',
 
 # Import log
 'importlogpage' => 'Innflutningsskrá',
@@ -2761,6 +2787,8 @@ Vinsamlegast reyndu aftur.',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|breyting|breytingar}} frá $2',
 
 # JavaScriptTest
+'javascripttest' => 'JavaScript prófun',
+'javascripttest-disabled' => 'Þessi möguleiki hefur ekki verið virkjaður á þessum wiki.',
 'javascripttest-pagetext-skins' => 'Veldu þema sem á að keyra prófanirnar á:',
 
 # Tooltip help for the actions
@@ -2864,15 +2892,10 @@ Vinsamlegast reyndu aftur.',
 # Info page
 'pageinfo-title' => 'Upplýsingar um $1',
 'pageinfo-header-edits' => 'Breytingar',
-'pageinfo-header-watchlist' => 'Vaktlistinn',
-'pageinfo-header-views' => 'Flettingar',
-'pageinfo-subjectpage' => 'Síða',
-'pageinfo-talkpage' => 'Spjallsíða',
+'pageinfo-views' => 'Fjöldi innlita',
 'pageinfo-watchers' => 'Fjöldi notenda',
 'pageinfo-edits' => 'Fjöldi breytinga',
 'pageinfo-authors' => 'Fjöldi einstakra höfunda',
-'pageinfo-views' => 'Fjöldi innlita',
-'pageinfo-viewsperedit' => 'Flettingar á hverja breytingu',
 
 # Skin names
 'skinname-standard' => 'Sígilt',
@@ -3648,10 +3671,13 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'api-error-duplicate-archive-popup-title' => 'Eins {{PLURAL:$1|skrá|skrár}} sem {{PLURAL:$1|hefur|hafa}} þegar verið eytt.',
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|Afrituð skrá|Afritaðar skrár}}',
 'api-error-empty-file' => 'Skráin sem þú valdir er tóm.',
+'api-error-emptypage' => 'Stofnun nýrra, tómra síðna er óheimil.',
 'api-error-fetchfileerror' => 'Innri villa: Mistókst að sækja skránna.',
+'api-error-fileexists-forbidden' => 'Skrá með nafninu "$1" er þegar til og ekki er hægt að yfirskrifa hana.',
 'api-error-file-too-large' => 'Skráin sem þú valdir er of stór.',
 'api-error-filename-tooshort' => 'Skráarnafnið er of stutt',
 'api-error-filetype-banned' => 'Þessi gerð skráar er bönnuð.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|er ekki leifileg skráargerð|eru ekki leifilegar skráargerðir}}. {{PLURAL:$3|Leyfileg skráargerð er|Leyfilegar skráargerðir eru}} $2.',
 'api-error-filetype-missing' => 'Skráin hefur enga skráarendingu.',
 'api-error-hookaborted' => 'Hætt var við breytinguna sem þú reyndir að gera með viðbót.',
 'api-error-http' => 'Innri villa: Get ekki tengst vefþjón.',
@@ -3672,6 +3698,7 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'api-error-unknown-code' => 'Óþekkt villa: "$1"',
 'api-error-unknown-error' => 'Innri villa: Eitthvað fór úrskeiðis þegar að skráinni þinni var hlaðið inn.',
 'api-error-unknown-warning' => 'Óþekkt viðvörun: $1',
+'api-error-unknownerror' => 'Óþekkt villa: "$1".',
 'api-error-uploaddisabled' => 'Ekki er leyft að hlaða inn á þessum wiki.',
 'api-error-verification-error' => 'Þessi skrá gæti verið skemmd, eða með vitlausa skráarendingu.',
 
@@ -3684,5 +3711,6 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'duration-years' => '$1 {{PLURAL:$1|ár|ár}}',
 'duration-decades' => '$1 {{PLURAL:$1|áratugur|áratugir}}',
 'duration-centuries' => '$1 {{PLURAL:$1|öld|aldir}}',
+'duration-millennia' => '$1 {{PLURAL:$1|árþúsund}}',
 
 );
index b6a7c2c..a97ec76 100644 (file)
@@ -37,6 +37,7 @@
  * @author Marzedu
  * @author McDutchie
  * @author Melos
+ * @author Minerva Titani
  * @author Nemo bis
  * @author Nick1915
  * @author Ninniuz
@@ -126,7 +127,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'ContributiCancellati' ),
        'Disambiguations'           => array( 'Disambigua' ),
        'DoubleRedirects'           => array( 'RedirectDoppi' ),
-       'EditWatchlist'             => array( 'ModificaListaSeguiti' ),
+       'EditWatchlist'             => array( 'ModificaOsservati', 'ModificaOsservatiSpeciali', 'ModificaListaSeguiti' ),
        'Emailuser'                 => array( 'InviaEMail' ),
        'Export'                    => array( 'Esporta' ),
        'Fewestrevisions'           => array( 'PagineConMenoRevisioni' ),
@@ -204,59 +205,63 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#RINVIA', '#RINVIO', '#RIMANDO', '#REDIRECT' ),
-       'currentmonth'            => array( '1', 'MESECORRENTE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'NOMEMESECORRENTE', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'NOMEMESECORRENTEGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'MESECORRENTEABBREV', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'GIORNOCORRENTE', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'GIORNOCORRENTE2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NOMEGIORNOCORRENTE', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ANNOCORRENTE', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ORARIOATTUALE', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ORACORRENTE', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MESELOCALE', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'NOMEMESELOCALE', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'NOMEMESELOCALEGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'MESELOCALEABBREV', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'GIORNOLOCALE', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'GIORNOLOCALE2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NOMEGIORNOLOCALE', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ANNOLOCALE', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ORARIOLOCALE', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ORALOCALE', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NUMEROPAGINE', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NUMEROARTICOLI', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NUMEROFILE', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NUMEROUTENTI', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NUMEROUTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NUMEROEDIT', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NUMEROVISITE', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'TITOLOPAGINA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'TITOLOPAGINAE', 'PAGENAMEE' ),
-       'subpagename'             => array( '1', 'NOMESOTTOPAGINA', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NOMESOTTOPAGINAE', 'SUBPAGENAMEE' ),
-       'subst'                   => array( '0', 'SOST:', 'SUBST:' ),
-       'img_right'               => array( '1', 'destra', 'right' ),
-       'img_left'                => array( '1', 'sinistra', 'left' ),
-       'img_none'                => array( '1', 'nessuno', 'none' ),
-       'img_center'              => array( '1', 'centro', 'center', 'centre' ),
-       'img_page'                => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'bordo', 'border' ),
-       'sitename'                => array( '1', 'NOMESITO', 'SITENAME' ),
-       'servername'              => array( '0', 'NOMESERVER', 'SERVERNAME' ),
-       'gender'                  => array( '0', 'GENERE:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'SETTIMANACORRENTE', 'CURRENTWEEK' ),
-       'localweek'               => array( '1', 'SETTIMANALOCALE', 'LOCALWEEK' ),
-       'plural'                  => array( '0', 'PLURALE:', 'PLURAL:' ),
-       'language'                => array( '0', '#LINGUA', '#LANGUAGE:' ),
-       'numberofadmins'          => array( '1', 'NUMEROADMIN', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'speciale', 'special' ),
-       'pagesincategory'         => array( '1', 'PAGINEINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'DIMENSIONEPAGINA', 'PESOPAGINA', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDICE__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__NOINDICE__', '__NOINDEX__' ),
-       'protectionlevel'         => array( '1', 'LIVELLOPROTEZIONE', 'PROTECTIONLEVEL' ),
+       'redirect'                  => array( '0', '#RINVIA', '#RINVIO', '#RIMANDO', '#REDIRECT' ),
+       'currentmonth'              => array( '1', 'MESEATTUALE', 'MESECORRENTE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'NOMEMESEATTUALE', 'NOMEMESECORRENTE', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'NOMEMESEATTUALEGEN', 'NOMEMESECORRENTEGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'MESEATTUALEABBREV', 'MESECORRENTEABBREV', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'GIORNOATTUALE', 'GIORNOCORRENTE', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'GIORNOATTUALE2', 'GIORNOCORRENTE2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NOMEGIORNOATTUALE', 'NOMEGIORNOCORRENTE', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ANNOATTUALE', 'ANNOCORRENTE', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ORARIOATTUALE', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ORAATTUALE', 'ORACORRENTE', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MESELOCALE', 'MESELOCALE2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'MESELOCALE1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'NOMEMESELOCALE', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'NOMEMESELOCALEGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'MESELOCALEABBREV', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'GIORNOLOCALE', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'GIORNOLOCALE2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NOMEGIORNOLOCALE', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ANNOLOCALE', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ORARIOLOCALE', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ORALOCALE', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NUMEROPAGINE', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NUMEROVOCI', 'NUMEROARTICOLI', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NUMEROFILE', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NUMEROUTENTI', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NUMEROUTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NUMEROMODIFICHE', 'NUMEROEDIT', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NUMEROVISITE', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'TITOLOPAGINA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'TITOLOPAGINAE', 'PAGENAMEE' ),
+       'subpagename'               => array( '1', 'NOMESOTTOPAGINA', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NOMESOTTOPAGINAE', 'SUBPAGENAMEE' ),
+       'subst'                     => array( '0', 'SOST:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'miniatura', 'min', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniatura=$1', 'min=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'destra', 'right' ),
+       'img_left'                  => array( '1', 'sinistra', 'left' ),
+       'img_none'                  => array( '1', 'nessuno', 'none' ),
+       'img_center'                => array( '1', 'centro', 'center', 'centre' ),
+       'img_page'                  => array( '1', 'pagina=$1', 'pagina_$1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'bordo', 'border' ),
+       'sitename'                  => array( '1', 'NOMESITO', 'SITENAME' ),
+       'servername'                => array( '0', 'NOMESERVER', 'SERVERNAME' ),
+       'gender'                    => array( '0', 'GENERE:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'SETTIMANACORRENTE', 'CURRENTWEEK' ),
+       'localweek'                 => array( '1', 'SETTIMANALOCALE', 'LOCALWEEK' ),
+       'plural'                    => array( '0', 'PLURALE:', 'PLURAL:' ),
+       'language'                  => array( '0', '#LINGUA', '#LANGUAGE:' ),
+       'numberofadmins'            => array( '1', 'NUMEROADMIN', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'speciale', 'special' ),
+       'tag'                       => array( '0', 'etichetta', 'tag' ),
+       'pagesincategory'           => array( '1', 'PAGINEINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'DIMENSIONEPAGINA', 'PESOPAGINA', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDICE__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NOINDICE__', '__NOINDEX__' ),
+       'protectionlevel'           => array( '1', 'LIVELLOPROTEZIONE', 'PROTECTIONLEVEL' ),
 );
 
 $linkTrail = '/^([a-zàéèíîìóòúù]+)(.*)$/sDu';
@@ -269,7 +274,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Nascondi le modifiche verificate nelle ultime modifiche',
 'tog-newpageshidepatrolled' => "Nascondi le pagine verificate dall'elenco delle pagine più recenti",
 'tog-extendwatchlist' => "Mostra tutte le modifiche agli osservati speciali, non solo l'ultima",
-'tog-usenewrc' => 'Utilizza le ultime modifiche avanzate (richiede JavaScript)',
+'tog-usenewrc' => 'Raggruppa le modifiche per pagina nelle ultime modifiche e negli osservati speciali (richiede JavaScript)',
 'tog-numberheadings' => 'Numerazione automatica dei titoli di sezione',
 'tog-showtoolbar' => 'Mostra barra degli strumenti di modifica (richiede JavaScript)',
 'tog-editondblclick' => 'Modifica delle pagine tramite doppio clic (richiede JavaScript)',
@@ -277,17 +282,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Modifica delle sezioni tramite clic destro sul titolo (richiede JavaScript)',
 'tog-showtoc' => "Mostra l'indice per le pagine con più di 3 sezioni",
 'tog-rememberpassword' => 'Ricorda la password su questo browser (per un massimo di $1 {{PLURAL:$1|giorno|giorni}})',
-'tog-watchcreations' => 'Aggiungi le pagine create agli osservati speciali',
-'tog-watchdefault' => 'Aggiungi le pagine modificate agli osservati speciali',
-'tog-watchmoves' => 'Aggiungi le pagine spostate agli osservati speciali',
-'tog-watchdeletion' => 'Aggiungi le pagine cancellate agli osservati speciali',
+'tog-watchcreations' => 'Aggiungi le pagine create e i file caricati agli osservati speciali',
+'tog-watchdefault' => 'Aggiungi le pagine e i file modificati agli osservati speciali',
+'tog-watchmoves' => 'Aggiungi le pagine e i file spostati agli osservati speciali',
+'tog-watchdeletion' => 'Aggiungi le pagine e i file cancellati agli osservati speciali',
 'tog-minordefault' => 'Indica ogni modifica come minore (solo come predefinito)',
 'tog-previewontop' => "Mostra l'anteprima sopra la casella di modifica e non sotto",
 'tog-previewonfirst' => "Mostra l'anteprima per la prima modifica",
-'tog-nocache' => 'Disabilitare la cache delle pagine del browser',
-'tog-enotifwatchlistpages' => 'Segnalami via e-mail le modifiche alle pagine osservate',
+'tog-nocache' => 'Disabilita la cache delle pagine del browser',
+'tog-enotifwatchlistpages' => 'Inviami una email quando viene modificata una pagina o un file presente tra gli osservati speciali',
 'tog-enotifusertalkpages' => 'Segnalami via e-mail le modifiche alla mia pagina di discussione',
-'tog-enotifminoredits' => 'Segnalami via e-mail anche le modifiche minori',
+'tog-enotifminoredits' => 'Inviami una email anche per le modifiche minori di pagine e file',
 'tog-enotifrevealaddr' => 'Rivela il mio indirizzo e-mail nei messaggi di avviso',
 'tog-shownumberswatching' => 'Mostra il numero di utenti che hanno la pagina in osservazione',
 'tog-oldsig' => 'Firma attuale:',
@@ -303,7 +308,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Nascondi le modifiche degli utenti registrati negli osservati speciali',
 'tog-watchlisthideanons' => 'Nascondi le modifiche degli utenti anonimi negli osservati speciali',
 'tog-watchlisthidepatrolled' => 'Nascondi le modifiche verificate negli osservati speciali',
-'tog-nolangconversion' => 'Disattiva la conversione tra varianti linguistiche',
 'tog-ccmeonemails' => 'Inviami una copia dei messaggi spediti agli altri utenti',
 'tog-diffonly' => 'Non visualizzare il contenuto della pagina dopo il confronto tra versioni',
 'tog-showhiddencats' => 'Mostra categorie nascoste',
@@ -526,7 +530,11 @@ $1',
 'retrievedfrom' => 'Estratto da "$1"',
 'youhavenewmessages' => 'Hai $1 ($2).',
 'newmessageslink' => 'nuovi messaggi',
-'newmessagesdifflink' => 'differenza con la revisione precedente',
+'newmessagesdifflink' => 'ultima modifica',
+'youhavenewmessagesfromusers' => 'Hai $1 da {{PLURAL:$3|un altro utente|$3 utenti}} ($2).',
+'youhavenewmessagesmanyusers' => 'Hai $1 da molti utenti ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|un nuovo messaggio|nuovi messaggi}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ultima modifica|ultime modifiche}}',
 'youhavenewmessagesmulti' => 'Hai nuovi messaggi su $1',
 'editsection' => 'modifica',
 'editold' => 'modifica',
@@ -581,9 +589,9 @@ L'elenco delle pagine speciali valide si trova in [[Special:SpecialPages|Elenco
 'dberrortext' => 'Errore di sintassi nella richiesta inoltrata al database.
 Ciò potrebbe indicare la presenza di un bug nel software.
 L\'ultima query inviata al database è stata:
-<blockquote><tt>$1</tt></blockquote>
-richiamata dalla funzione "<tt>$2</tt>".
-Il database ha restituito il seguente errore "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+richiamata dalla funzione "<code>$2</code>".
+Il database ha restituito il seguente errore "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Errore di sintassi nella richiesta inoltrata al database.
 L\'ultima query inviata al database è stata:
 "$1"
@@ -620,6 +628,8 @@ Si prega di segnalare l\'accaduto a un [[Special:ListUsers/sysop|amministratore]
 'cannotdelete' => 'Non è stato possibile cancellare il file "$1".
 Potrebbe essere stato già cancellato da qualcun altro.',
 'cannotdelete-title' => 'Impossibile eliminare la pagina "$1"',
+'delete-hook-aborted' => "La cancellazione è stata annullata dall'hook.
+Non è stata restituita alcuna spiegazione.",
 'badtitle' => 'Titolo non corretto',
 'badtitletext' => 'Il titolo della pagina richiesta è vuoto, errato o con caratteri non ammessi oppure deriva da un errore nei collegamenti tra siti wiki diversi o versioni in lingue diverse dello stesso sito.',
 'perfcached' => "I dati che seguono sono estratti da una copia ''cache'' del database, e potrebbero non essere aggiornati. Un massimo di {{PLURAL:$1|un risultato è disponibile|$1 risultati sono disponibili}} in cache.",
@@ -652,6 +662,8 @@ La motivazione è la seguente: ''$2''.",
 L\'amministratore che lo ha bloccato ha fornito questa motivazione: "$3".',
 'invalidtitle-knownnamespace' => 'Titolo non valido con namespace "$2" e testo "$3"',
 'invalidtitle-unknownnamespace' => 'Titolo non valido con namespace sconosciuto "$1" e testo "$2"',
+'exception-nologin' => 'Accesso non effettuato',
+'exception-nologin-text' => "Questa pagina o azione richiede che tu abbia effettuato l'accesso su questa wiki.",
 
 # Virus scanner
 'virus-badscanner' => "Errore di configurazione: antivirus sconosciuto: ''$1''",
@@ -669,31 +681,32 @@ L'account è stato creato correttamente. Non dimenticare di personalizzare le [[
 'yourname' => 'Nome utente:',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => 'Ripeti la password:',
-'remembermypassword' => 'Ricorda la password su questo computer (per un massimo di $1 {{PLURAL:$1|giorno|giorni}})',
+'remembermypassword' => 'Ricorda la password su questo browser (per un massimo di $1 {{PLURAL:$1|giorno|giorni}})',
 '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.',
 'externaldberror' => 'Si è verificato un errore con il server di autenticazione esterno, oppure non si dispone delle autorizzazioni necessarie per aggiornare il proprio accesso esterno.',
 'login' => 'Entra',
-'nav-login-createaccount' => 'Entra / Registrati',
+'nav-login-createaccount' => 'Entra / registrati',
 'loginprompt' => 'Per accedere a {{SITENAME}} è necessario abilitare i cookie.',
-'userlogin' => 'Entra / Registrati',
+'userlogin' => 'Entra / registrati',
 'userloginnocreate' => 'Entra',
 'logout' => 'Esci',
 'userlogout' => 'esci',
 'notloggedin' => 'Accesso non effettuato',
 'nologin' => "Non hai ancora un accesso? '''$1'''.",
-'nologinlink' => 'Crealo ora',
-'createaccount' => 'Crea un nuovo utente',
+'nologinlink' => 'Registrati',
+'createaccount' => 'Crea un accesso',
 'gotaccount' => "Hai già un accesso? '''$1'''.",
 'gotaccountlink' => 'Entra',
 'userlogin-resetlink' => 'Hai dimenticato i tuoi dati di accesso?',
-'createaccountmail' => 'via e-mail',
+'createaccountmail' => 'Tramite email',
 'createaccountreason' => 'Motivo:',
 'badretype' => 'Le password inserite non coincidono tra loro.',
 'userexists' => 'Il nome utente inserito è già utilizzato.
 Scegliere un nome utente diverso.',
-'loginerror' => "Errore nell'accesso",
-'createaccounterror' => "Impossìbile creare s'account: $1",
+'loginerror' => "Errore durante l'accesso",
+'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.",
 'nocookiesfornew' => "L'account utente non è stato creato, poiché non abbiamo potuto confermare la sua fonte.
@@ -803,8 +816,8 @@ Se non sei stato tu a fare la richiesta, o se ti sei ricordato la password origi
 'passwordreset-emailelement' => 'Nome utente: $1
 Password temporanea: $2',
 'passwordreset-emailsent' => 'È stata inviata una e-mail di promemoria.',
-'passwordreset-emailsent-capture' => "E' stato inviato un e-mail promemoria, il contenuto è riportato di seguito.",
-'passwordreset-emailerror-capture' => "E' stata generata l'e-mail promemoria riportata di seguito. L'invio all'utente non è riuscito: $1",
+'passwordreset-emailsent-capture' => 'È stata inviata una e-mail di promemoria, il contenuto è riportato di seguito.',
+'passwordreset-emailerror-capture' => "È stata generata l'e-mail di promemoria riportata di seguito. L'invio all'utente non è riuscito: $1",
 
 # Special:ChangeEmail
 'changeemail' => "Modifica l'indirizzo e-mail",
@@ -848,8 +861,8 @@ Password temporanea: $2',
 'showlivepreview' => "Funzione ''Live preview''",
 'showdiff' => 'Mostra cambiamenti',
 'anoneditwarning' => "'''Attenzione:''' Accesso non effettuato. Nella cronologia della pagina verrà registrato l'indirizzo IP.",
-'anonpreviewwarning' => "''Non hai eseguito il login. Salvando il tuo indirizzo IP sarà registrato nella cronologia di questa voce.''",
-'missingsummary' => "'''Attenzione:''' non è stato specificato l'oggetto di questa modifica. Premendo di nuovo '''Salva la pagina''' la modifica verrà salvata con l'oggetto vuoto.",
+'anonpreviewwarning' => "''Non è stato eseguito il login. Salvando la pagina, il proprio indirizzo IP sarà registrato nella cronologia.''",
+'missingsummary' => "'''Attenzione:''' non è stato specificato l'oggetto di questa modifica. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata con l'oggetto vuoto.",
 'missingcommenttext' => 'Inserire un commento qui sotto.',
 'missingcommentheader' => "'''Attenzione:''' non è stata specificato l'oggetto/l'intestazione di questo commento. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata senza intestazione.",
 'summary-preview' => "Anteprima dell'oggetto:",
@@ -904,16 +917,19 @@ Se il collegamento è stato aperto per errore, è sufficiente fare clic sul puls
 'anontalkpagetext' => "----''Questa è la pagina di discussione di un utente anonimo, che non ha ancora creato un accesso o comunque non lo usa. Per identificarlo è quindi necessario usare il numero del suo indirizzo IP. Gli indirizzi IP possono però essere condivisi da più utenti. Se sei un utente anonimo e ritieni che i commenti presenti in questa pagina non si riferiscano a te, [[Special:UserLogin/signup|crea un nuovo accesso]] o [[Special:UserLogin|entra con quello che già hai]] per evitare di essere confuso con altri utenti anonimi in futuro.''",
 'noarticletext' => 'In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati] oppure [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificare la pagina ora]</span>.',
 'noarticletext-nopermission' => 'In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati]</span>.',
+'missing-revision' => 'La revisione #$1 della pagina "{{PAGENAME}}" non esiste.
+
+Questo si verifica solitamente seguendo un collegamento a una pagina cancellata, in una cronologia non aggiornata.
+I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].',
 'userpage-userdoesnotexist' => 'L\'account "<nowiki>$1</nowiki>" non corrisponde a un utente registrato. Verificare che si intenda davvero creare o modificare questa pagina.',
 'userpage-userdoesnotexist-view' => 'L\'account utente "$1" non è registrato.',
 'blocked-notice-logextract' => "Questo utente è attualmente bloccato.
 L'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
-'clearyourcache' => "'''Nota:''' dopo aver salvato, potrebbe essere necessario pulire la cache del tuo browser per vedere i cambiamenti. 
-*'''Firefox / Safari''': tieni premuto il tasto delle maiuscole e fai clic su ''Ricarica'', oppure premi ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' su Mac)
-*'''Google Chrome''': premi ''Ctrl-Shift-R'' (''⌘-Shift-R'' su un Mac)
-*'''Internet Explorer''': tieni premuto il tasto ''Ctrl'' mentre clicchi su ''Refresh'', oppure premi ''Ctrl-F5''
-*'''Konqueror''': premi il pulsante ''Ricarica'' o il tasto ''F5''; 
-*'''Opera''': svuota completamente la cache dal menu ''Strumenti → Preferenze''",
+'clearyourcache' => "'''Nota:''' dopo aver salvato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti. 
+*'''Firefox / Safari''': tenere premuto il tasto delle maiuscole e fare clic su ''Ricarica'', oppure premere ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' su Mac)
+*'''Google Chrome''': premere ''Ctrl-Shift-R'' (''⌘-Shift-R'' su un Mac)
+*'''Internet Explorer''': tenere premuto il tasto ''Ctrl'' mentre si fa clic su ''Refresh'', oppure premere ''Ctrl-F5''
+*'''Opera''': svuotare completamente la cache dal menu ''Strumenti → Preferenze''",
 'usercssyoucanpreview' => "'''Suggerimento:''' usa il pulsante 'Visualizza anteprima' per provare il tuo nuovo CSS prima di salvarlo.",
 'userjsyoucanpreview' => "'''Suggerimento:''' usa il pulsante 'Visualizza anteprima' per provare il tuo nuovo JavaScript prima di salvarlo.",
 'usercsspreview' => "'''Questa è solo un'anteprima del proprio CSS personale. Le modifiche non sono ancora state salvate!'''",
@@ -922,7 +938,7 @@ L'ultimo elemento del registro dei blocchi è riportato di seguito per informazi
 'sitejspreview' => "Questa è solo un'anteprima per provare il JavaScript; le modifiche non sono ancora state salvate!'''",
 'userinvalidcssjstitle' => "'''Attenzione:'''  Non esiste alcuna skin con nome \"\$1\". Si noti che le pagine per i .css e .js personalizzati hanno l'iniziale del titolo minuscola, ad esempio {{ns:user}}:Esempio/vector.css e non {{ns:user}}:Esempio/Vector.css.",
 'updated' => '(Aggiornato)',
-'note' => "'''NOTA:'''",
+'note' => "'''Nota:'''",
 'previewnote' => "'''Ricorda che questa è solo un'anteprima.'''
 Le tue modifiche NON sono ancora state salvate!",
 'continue-editing' => 'Continua a modificare',
@@ -936,7 +952,7 @@ Se il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] e
 
 '''Se questo è un legittimo tentativo di modifica, riprovare. Se il problema persiste, si può provare a [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso.'''",
 'token_suffix_mismatch' => "'''La modifica non è stata salvata perché il client ha mostrato di gestire in modo errato i caratteri di punteggiatura nel token associato alla stessa. Per evitare una possibile corruzione del testo della pagina, è stata rifiutata l'intera modifica. Questa situazione può verificarsi, talvolta, quando vengono usati alcuni servizi di proxy anonimi via web che presentano dei bug.'''",
-'edit_form_incomplete' => "' ' Alcune parti del modulo di modifica non hanno raggiunto il server; controllare che le modifiche siano intatte e riprovare. ' '",
+'edit_form_incomplete' => "'''Alcune parti del modulo di modifica non hanno raggiunto il server; controllare che le modifiche siano intatte e riprovare.'''",
 'editing' => 'Modifica di $1',
 'creating' => 'Stai creando $1',
 'editingsection' => 'Modifica di $1 (sezione)',
@@ -963,15 +979,16 @@ Inviando il testo dichiari inoltre, sotto tua responsabilità, che è stato scri
 '''Non inviare materiale protetto da copyright senza autorizzazione!'''",
 'longpageerror' => "'''Errore: il testo inviato è lungo {{PLURAL:$1|1|$1}} kilobyte, che è maggiore della dimensione massima consentita ({{PLURAL:$2|1|$2}} kilobyte).'''
 Il testo non può essere salvato.",
-'readonlywarning' => "'''ATTENZIONE: Il database è stato bloccato per manutenzione, è quindi impossibile salvare le modifiche in questo momento. Per non perderle, è possibile copiare quanto inserito finora nella casella di modifica, incollarlo in un programma di elaborazione testi e salvarlo in attesa dello sblocco del database.'''
+'readonlywarning' => "'''Attenzione: il database è stato bloccato per manutenzione, è quindi impossibile salvare le modifiche in questo momento.'''
+Per non perderle, è possibile copiare quanto inserito finora nella casella di modifica, incollarlo in un programma di elaborazione testi e salvarlo in attesa dello sblocco del database.
 
 L'amministratore che ha bloccato il database ha fornito questa spiegazione: $1",
-'protectedpagewarning' => "'''ATTENZIONE: Questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla.'''
+'protectedpagewarning' => "'''Attenzione: questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla.'''
 L'ultimo elemento del registro è riportato di seguito per informazione:",
 'semiprotectedpagewarning' => "'''Nota:''' Questa pagina è stata bloccata in modo che solo gli utenti registrati possano modificarla.
 L'ultimo elemento del registro è riportato di seguito per informazione:",
 'cascadeprotectedwarning' => "'''Attenzione:''' Questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla. Ciò avviene perché la pagina è inclusa {{PLURAL:\$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":",
-'titleprotectedwarning' => "'''ATTENZIONE:  Questa pagina è stata bloccata in modo che siano necessari [[Special:ListGroupRights|diritti specifici]] per crearla.'''
+'titleprotectedwarning' => "'''Attenzione: questa pagina è stata bloccata in modo che siano necessari [[Special:ListGroupRights|diritti specifici]] per crearla.'''
 L'ultimo elemento del registro è riportato di seguito per informazione:",
 'templatesused' => '{{PLURAL:$1|Template utilizzato|Template utilizzati}} in questa pagina:',
 'templatesusedpreview' => '{{PLURAL:$1|Template utilizzato|Template utilizzati}} in questa anteprima:',
@@ -1023,6 +1040,7 @@ Alcuni template non verranno inclusi.",
 'expansion-depth-exceeded-warning' => 'Questa pagina ha superato la profondità di espansione',
 'parser-unstrip-loop-warning' => 'Rilevato ciclo di Unstrip',
 'parser-unstrip-recursion-limit' => 'Superati i limiti di ricorsione di Unstrip ($1)',
+'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.',
@@ -1151,14 +1169,15 @@ $1",
 'revdelete-only-restricted' => "Errore nel nascondere l'oggetto datato $1, $2: non è possibile nascondere gli oggetti alla vista degli amministratori senza selezionare almeno un'altra delle opzioni di rimozione.",
 'revdelete-reason-dropdown' => '*Motivazioni più comuni per la cancellazione
 ** Violazione di copyright
-** Informazioni personali inappropriate',
+** Informazioni personali inappropriate
+** Informazione potenzialmente diffamatoria',
 'revdelete-otherreason' => 'Altra motivazione o motivazione aggiuntiva:',
 'revdelete-reasonotherlist' => 'Altra motivazione',
 'revdelete-edit-reasonlist' => 'Modifica le motivazioni per la cancellazione',
 'revdelete-offender' => 'Autore della versione:',
 
 # Suppression log
-'suppressionlog' => 'Log delle soppressioni',
+'suppressionlog' => 'Soppressioni',
 'suppressionlogtext' => "Di seguito sono elencate le cancellazioni e i blocchi con del contenuto nascosto agli amministratori.
 Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blocchi attivi al momento.",
 
@@ -1202,6 +1221,10 @@ Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blo
 'editundo' => 'annulla',
 'diff-multi' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di {{PLURAL:$2|un utente|$2 utenti}} non mostrate)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di oltre $2 {{PLURAL:$2|utente|utenti}} non mostrate)',
+'difference-missing-revision' => '{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.
+
+Questo si verifica solitamente seguendo un collegamento obsoleto di un diff a una pagina cancellata.
+I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].',
 
 # Search results
 'searchresults' => 'Risultati della ricerca',
@@ -1288,7 +1311,7 @@ Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blo
 'datedefault' => 'Nessuna preferenza',
 'prefs-beta' => 'Funzionalità beta',
 'prefs-datetime' => 'Data e ora',
-'prefs-labs' => 'Funzionalità dei laboratori',
+'prefs-labs' => 'Funzionalità sperimentali',
 'prefs-user-pages' => 'Pagine utente',
 'prefs-personal' => 'Profilo utente',
 'prefs-rc' => 'Ultime modifiche',
@@ -1297,7 +1320,7 @@ Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blo
 'prefs-watchlist-days-max' => 'Massimo $1 {{PLURAL:$1|giorno|giorni}}',
 'prefs-watchlist-edits' => 'Numero di modifiche da mostrare con le funzioni avanzate:',
 'prefs-watchlist-edits-max' => 'Numero massimo: 1000',
-'prefs-watchlist-token' => 'Token Osservati speciali:',
+'prefs-watchlist-token' => 'Token osservati speciali:',
 'prefs-misc' => 'Varie',
 'prefs-resetpass' => 'Cambia password',
 'prefs-changeemail' => 'Modifica e-mail',
@@ -1465,6 +1488,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'right-writeapi' => "Usa l'API in scrittura",
 'right-delete' => 'Cancella pagine',
 'right-bigdelete' => 'Cancella pagine con cronologie lunghe',
+'right-deletelogentry' => 'Cancella e ripristina voci di registro specifiche',
 'right-deleterevision' => 'Nasconde revisioni specifiche delle pagine',
 'right-deletedhistory' => 'Visualizza le revisioni della cronologia cancellate senza il testo associato',
 'right-deletedtext' => 'Visualizza testo cancellato e modifiche fra revisioni cancellate',
@@ -1478,7 +1502,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'right-ipblock-exempt' => 'Ignora i blocchi degli IP, i blocchi automatici e i blocchi di range di IP',
 'right-proxyunbannable' => 'Scavalca i blocchi sui proxy',
 'right-unblockself' => 'Sblocca se stesso',
-'right-protect' => 'Cambia i livelli di protezione',
+'right-protect' => 'Cambia i livelli di protezione e modifica pagine protette',
 'right-editprotected' => 'Modifica pagine protette',
 'right-editinterface' => "Modifica l'interfaccia utente",
 'right-editusercssjs' => 'Modifica i file CSS e JS di altri utenti',
@@ -1607,9 +1631,9 @@ Ill log delle cancellazioni e degli spostamenti di questa pagina viene qui ripor
 'uploadtext' => "Usare il modulo sottostante per caricare nuovi file. Per visualizzare o ricercare i file già caricati, consultare il [[Special:FileList|log dei file caricati]]. Caricamenti di file e di nuove versioni di file sono registrati nel [[Special:Log/upload|log degli upload]], le cancellazioni nell'[[Special:Log/delete|apposito]].
 
 Per inserire un file all'interno di una pagina, fare un collegamento di questo tipo:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' per usare la versione completa del file
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></tt>''' per usare una versione larga 200 pixel inserita in un box, allineata a sinistra e con 'testo alternativo' come didascalia
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' per generare un collegamento diretto al file senza visualizzarlo",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' per usare la versione completa del file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' per usare una versione larga 200 pixel inserita in un box, allineata a sinistra e con 'testo alternativo' come didascalia
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' per generare un collegamento diretto al file senza visualizzarlo",
 'upload-permitted' => 'Tipi di file consentiti: $1.',
 'upload-preferred' => 'Tipi di file consigliati: $1.',
 'upload-prohibited' => 'Tipi di file non consentiti: $1.',
@@ -1651,19 +1675,19 @@ Consultare la [[Special:NewFiles|galleria dei nuovi file]] per una visione d'ins
 'largefileserver' => 'Il file supera le dimensioni consentite dalla configurazione del server.',
 'emptyfile' => 'Il file appena caricato sembra essere vuoto. Ciò potrebbe essere dovuto ad un errore nel nome del file. Verificare che si intenda realmente caricare questo file.',
 'windows-nonascii-filename' => 'Questo wiki non supporta nomi di file con caratteri speciali.',
-'fileexists' => "Un file con questo nome esiste già.
-Verificare prima '''<tt>[[:$1]]</tt>''' se non si è sicuri di volerlo sovrascrivere.
+'fileexists' => 'Un file con questo nome esiste già.
+Verificare prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.
+[[$1|thumb]]',
+'filepageexists' => "La pagina di descrizione di questo file è già stata creata all'indirizzo <strong>[[:$1]]</strong>, anche se non esiste ancora un file con questo nome. La descrizione dell'oggetto inserita in fase di caricamento non apparirà sulla pagina di descrizione. Per far sì che l'oggetto compaia sulla pagina di descrizione, sarà necessario modificarla manualmente.
 [[$1|thumb]]",
-'filepageexists' => "La pagina di descrizione di questo file è già stata creata all'indirizzo '''<tt>[[:$1]]</tt>''', anche se non esiste ancora un file con questo nome. La descrizione dell'oggetto inserita in fase di caricamento non apparirà sulla pagina di descrizione. Per far sì che l'oggetto compaia sulla pagina di descrizione, sarà necessario modificarla manualmente.
-[[$1|thumb]]",
-'fileexists-extension' => "Un file con nome simile a questo esiste già: [[$2|thumb]]
-* Nome del file caricato: '''<tt>[[:$1]]</tt>'''
-* Nome del file esistente: '''<tt>[[:$2]]</tt>'''
-Scegliere un nome diverso.",
+'fileexists-extension' => 'Un file con nome simile a questo esiste già: [[$2|thumb]]
+* Nome del file caricato: <strong>[[:$1]]</strong>
+* Nome del file esistente: <strong>[[:$2]]</strong>
+Scegliere un nome diverso.',
 'fileexists-thumbnail-yes' => "Il file caricato sembra essere una miniatura ''(thumbnail)''. [[$1|thumb]]
-Verificare, per confronto, il file '''<tt>[[:$1]]</tt>'''.
+Verificare, per confronto, il file <strong>[[:$1]]</strong>.
 Se si tratta della stessa immagine, nelle dimensioni originali, non è necessario caricarne altre miniature.",
-'file-thumbnail-no' => "Il nome del file inizia con '''<tt>$1</tt>'''; sembra quindi essere una miniatura ''(thumbnail)''.
+'file-thumbnail-no' => "Il nome del file inizia con <strong>$1</strong>; sembra quindi essere una miniatura ''(thumbnail)''.
 Se si dispone dell'immagine nella risoluzione originale, si prega di caricarla. In caso contrario, si prega di cambiare il nome del file.",
 'fileexists-forbidden' => 'Un file con questo nome esiste già e non può essere sovrascritto. Tornare indietro e modificare il nome con il quale caricare il file. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => "Un file con questo nome esiste già nell'archivio di risorse multimediali condivise. Se si desidera ancora caricare il file, tornare indietro e modificare il nome con il quale caricare il file. [[File:$1|thumb|center|$1]]",
@@ -1766,6 +1790,7 @@ $1',
 'lockmanager-fail-releaselock' => 'Non riuscito rilascio del blocco per "$1".',
 'lockmanager-fail-db-bucket' => 'Impossibile contattare i necessari database di blocco nel bucket $1.',
 'lockmanager-fail-db-release' => 'Impossibile revocare i blocchi sul database $1.',
+'lockmanager-fail-svr-acquire' => 'Impossibile acquisire blocchi sul server $1.',
 'lockmanager-fail-svr-release' => 'Impossibile revocare i blocchi sul server $1.',
 
 # ZipDirectoryReader
@@ -1883,6 +1908,7 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
 'shared-repo-from' => 'da $1',
 'shared-repo' => 'un archivio condiviso',
 'filepage.css' => '/* Il CSS messo qui viene incluso nella pagina di descrizione del file, inclusa anche su wiki client esterni */',
+'upload-disallowed-here' => 'Impossibile sovrascrivere questa immagine.',
 
 # File reversion
 'filerevert' => 'Ripristina $1',
@@ -1916,7 +1942,7 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
 
 # MIME search
 'mimesearch' => 'Ricerca in base al tipo MIME',
-'mimesearch-summary' => 'Questa pagina consente di filtrare i file in base al tipo MIME. Inserire la stringa di ricerca nella forma tipo/sottotipo, ad es. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Questa pagina consente di filtrare i file in base al tipo MIME. Inserire la stringa di ricerca nella forma tipo/sottotipo, ad es. <code>image/jpeg</code>.',
 'mimetype' => 'Tipo MIME:',
 'download' => 'scarica',
 
@@ -1962,7 +1988,9 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
 
 'disambiguations' => 'Pagine che si collegano a pagine di disambiguazione',
 'disambiguationspage' => 'Template:Disambigua',
-'disambiguations-text' => "Le pagine nella lista che segue contengono dei collegamenti a '''pagine di disambiguazione''' e non all'argomento cui dovrebbero fare riferimento.<br />Vengono considerate pagine di disambiguazione tutte quelle che contengono i template elencati in [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Le pagine nella lista che segue contengono almeno un collegamento a una '''pagina di disambiguazione'''.
+Esse potrebbero dover puntare a una pagina più appropriata.<br />
+Vengono considerate pagine di disambiguazione tutte quelle che contengono i template elencati in [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Redirect doppi',
 'doubleredirectstext' => 'In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.
@@ -1982,11 +2010,12 @@ I redirect <del>cancellati</del> sono stati corretti.',
 'withoutinterwiki-legend' => 'Prefisso',
 'withoutinterwiki-submit' => 'Mostra',
 
-'fewestrevisions' => 'Voci con meno revisioni',
+'fewestrevisions' => 'Pagine con meno revisioni',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
 'ncategories' => '$1 {{PLURAL:$1|categoria|categorie}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|collegamento|collegamenti}}',
 'nmembers' => '$1 {{PLURAL:$1|elemento|elementi}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisione|revisioni}}',
@@ -1997,7 +2026,7 @@ I redirect <del>cancellati</del> sono stati corretti.',
 'lonelypages' => 'Pagine orfane',
 'lonelypagestext' => 'Le pagine indicate di seguito sono prive di collegamenti provenienti da altre pagine di {{SITENAME}} e non sono incluse in nessuna pagina del sito.',
 'uncategorizedpages' => 'Pagine prive di categorie',
-'uncategorizedcategories' => 'Categorie non categorizzate',
+'uncategorizedcategories' => 'Categorie prive di categorie',
 'uncategorizedimages' => 'File privi di categorie',
 'uncategorizedtemplates' => 'Template privi di categorie',
 'unusedcategories' => 'Categorie vuote',
@@ -2013,10 +2042,11 @@ I redirect <del>cancellati</del> sono stati corretti.',
 'mostlinked' => 'Pagine più richiamate',
 'mostlinkedcategories' => 'Categorie più richiamate',
 'mostlinkedtemplates' => 'Template più utilizzati',
-'mostcategories' => 'Voci con più categorie',
+'mostcategories' => 'Pagine con più categorie',
 'mostimages' => 'File più richiamati',
-'mostrevisions' => 'Voci con più revisioni',
-'prefixindex' => 'Indice delle voci per lettere iniziali',
+'mostinterwikis' => 'Pagine con più interwiki',
+'mostrevisions' => 'Pagine con più versioni',
+'prefixindex' => 'Indice delle pagine per lettere iniziali',
 'prefixindex-namespace' => 'Tutte le pagine con il prefisso del namespace $1',
 'shortpages' => 'Pagine più corte',
 'longpages' => 'Pagine più lunghe',
@@ -2115,7 +2145,7 @@ Vedi anche le [[Special:WantedCategories|categorie richieste]].',
 'linksearch-ok' => 'Cerca',
 'linksearch-text' => 'È possibile fare uso di metacaratteri, ad esempio "*.wikipedia.org".<br />
 È necessario almeno un dominio di primo livello, ad esempio "*.org".<br />
-Protocolli supportati: <tt>$1</tt> (non aggiungere nessuno di questi nella tua ricerca).',
+Protocolli supportati: <code>$1</code> (non aggiungere nessuno di questi nella tua ricerca).',
 'linksearch-line' => '$1 presente nella pagina $2',
 'linksearch-error' => "I metacaratteri possono essere usati solo all'inizio dell'indirizzo.",
 
@@ -2126,7 +2156,7 @@ Protocolli supportati: <tt>$1</tt> (non aggiungere nessuno di questi nella tua r
 'listusers-blocked' => '(bloccato)',
 
 # Special:ActiveUsers
-'activeusers' => 'Lista degli utenti attivi',
+'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|modifica|modifiche}} {{PLURAL:$3|nell'ultimo giorno|negli ultimi $3 giorni}}",
 'activeusers-from' => 'Mostra gli utenti a partire da:',
@@ -2161,6 +2191,8 @@ Potrebbero esserci [[{{MediaWiki:Listgrouprights-helppage}}|ulteriori informazio
 'mailnologin' => 'Nessun indirizzo cui inviare il messaggio',
 'mailnologintext' => 'Per inviare messaggi e-mail ad altri utenti è necessario [[Special:UserLogin|accedere al sito]] e aver registrato un indirizzo valido nelle proprie [[Special:Preferences|preferenze]].',
 'emailuser' => "Scrivi all'utente",
+'emailuser-title-target' => 'Invia una e-mail a questo {{GENDER:$1|utente}}',
+'emailuser-title-notarget' => 'Invia una e-mail a un utente',
 'emailpage' => "Invia un messaggio e-mail all'utente",
 'emailpagetext' => 'Usare il modulo sottostante per inviare un messaggio e-mail all\'utente indicato. L\'indirizzo specificato nelle [[Special:Preferences|preferenze]] del mittente apparirà nel campo "Da:" del messaggio per consentire al destinatario di rispondere direttamente.',
 'usermailererror' => "L'oggetto mail ha restituito l'errore:",
@@ -2302,6 +2334,8 @@ Consultare il log delle $2 per un elenco delle pagine cancellate di recente.',
 'rollback' => 'Annulla le modifiche',
 'rollback_short' => 'Rollback',
 'rollbacklink' => 'rollback',
+'rollbacklinkcount' => 'rollback di {{PLURAL:$1|una modifica|$1 modifiche}}',
+'rollbacklinkcount-morethan' => 'rollback di più di {{PLURAL:$1|una modifica|$1 modifiche}}',
 'rollbackfailed' => 'Rollback fallito',
 'cantrollback' => "Impossibile annullare le modifiche; l'utente che le ha effettuate è l'unico ad aver contribuito alla pagina.",
 'alreadyrolled' => 'Non è possibile annullare le modifiche apportate alla pagina [[:$1]] da parte di [[User:$2|$2]] ([[User talk:$2|discussione]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); un altro utente ha già modificato la pagina oppure ha effettuato il rollback.
@@ -2774,6 +2808,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'import-interwiki-templates' => 'Includi tutti i template',
 'import-interwiki-submit' => 'Importa',
 'import-interwiki-namespace' => 'Namespace di destinazione:',
+'import-interwiki-rootpage' => 'Pagina principale di destinazione (opzionale):',
 'import-upload-filename' => 'Nome file:',
 'import-comment' => 'Oggetto:',
 'importtext' => 'Si prega di esportare il file dal sito wiki di origine con la [[Special:Export|funzione di esportazione]], salvarlo sul proprio disco e poi caricarlo qui.',
@@ -2805,6 +2840,9 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'import-error-interwiki' => 'La pagina "$1" non viene importata perché il suo nome è riservato per il collegamento esterno (interwiki).',
 'import-error-special' => 'La pagina "$1" non viene importata perché appartiene a un namespace speciale che non permette pagine.',
 'import-error-invalid' => 'La pagina "$1" non viene importata perché il suo nome non è valido.',
+'import-options-wrong' => '{{PLURAL:$2|Opzione sbagliata|Opzioni sbagliate}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'La pagina principale fornita non è un titolo valido.',
+'import-rootpage-nosubpage' => 'Il namespace "$1" della pagina principale non permette di avere sottopagine.',
 
 # Import log
 'importlogpage' => 'Importazioni',
@@ -2955,16 +2993,34 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Info page
 'pageinfo-title' => 'Informazioni per "$1"',
-'pageinfo-header-edits' => 'Edit',
-'pageinfo-header-watchlist' => 'Osservati speciali',
-'pageinfo-header-views' => 'Visualizzazioni',
-'pageinfo-subjectpage' => 'Pagina',
-'pageinfo-talkpage' => 'Pagina di discussione',
-'pageinfo-watchers' => 'Numero di utenti che hanno la pagina nei loro Osservati Speciali',
-'pageinfo-edits' => 'Numero di edit',
-'pageinfo-authors' => 'Numero di autori diversi',
+'pageinfo-header-basic' => 'Informazioni di base',
+'pageinfo-header-edits' => 'Cronologia delle modifiche',
+'pageinfo-header-restrictions' => 'Protezione della pagina',
+'pageinfo-header-properties' => 'Proprietà della pagina',
+'pageinfo-display-title' => 'Titolo visualizzato',
+'pageinfo-default-sort' => 'Criterio di ordinamento predefinito',
+'pageinfo-length' => 'Lunghezza della pagina (in byte)',
+'pageinfo-article-id' => 'ID della pagina',
+'pageinfo-robot-policy' => 'Stato per i motori di ricerca',
+'pageinfo-robot-index' => 'Indicizzabile',
+'pageinfo-robot-noindex' => 'Non indicizzabile',
 'pageinfo-views' => 'Numero di visualizzazioni',
-'pageinfo-viewsperedit' => 'Visualizzazioni per modifica',
+'pageinfo-watchers' => 'Numero di utenti che hanno la pagina nei loro Osservati Speciali',
+'pageinfo-redirects-name' => 'Redirect a questa pagina',
+'pageinfo-subpages-name' => 'Sottopagine di questa pagina',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirect}}; $3 {{PLURAL:$3|non redirect}})',
+'pageinfo-firstuser' => 'Creatore della pagina',
+'pageinfo-firsttime' => 'Data di creazione della pagina',
+'pageinfo-lastuser' => 'Ultimo contributore',
+'pageinfo-lasttime' => 'Data di ultima modifica',
+'pageinfo-edits' => 'Numero totale di modifiche',
+'pageinfo-authors' => 'Numero totale di autori diversi',
+'pageinfo-recent-edits' => 'Numero di modifiche recenti (negli ultimi $1)',
+'pageinfo-recent-authors' => 'Numero di autori diversi recenti',
+'pageinfo-restriction' => 'Protezione della pagina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Parola magica|Parole magiche}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria nascosta|Categorie nascoste}} ($1)',
+'pageinfo-templates' => 'Template {{PLURAL:$1|incluso|inclusi}}  ($1)',
 
 # Patrolling
 'markaspatrolleddiff' => 'Segna la modifica come verificata',
@@ -3007,6 +3063,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 pixel, dimensione del file: $3, tipo MIME: $4, $5 {{PLURAL:$5|pagina|pagine}}',
 'file-nohires' => 'Non sono disponibili versioni a risoluzione più elevata.',
 'svg-long-desc' => 'file in formato SVG, dimensioni nominali $1 × $2 pixel, dimensione del file: $3',
+'svg-long-desc-animated' => 'file in formato SVG animato, dimensioni nominali $1 × $2 pixel, dimensione del file: $3',
 'show-big-image' => 'Versione ad alta risoluzione',
 'show-big-image-preview' => 'Dimensioni di questa anteprima: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Altra risoluzione|Altre risoluzioni}}: $1.',
@@ -3016,6 +3073,8 @@ $1',
 'file-info-png-looped' => 'ciclico',
 'file-info-png-repeat' => 'ripetuto $1 {{PLURAL:$1|volta|volte}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frame}}',
+'file-no-thumb-animation' => "'''Nota: a causa di limitazioni tecniche, le miniature di questo file non saranno animate.'''",
+'file-no-thumb-animation-gif' => "'''Nota: a causa di limitazioni tecniche, le miniature delle immagini GIF ad alta risoluzione come questa non saranno animate.'''",
 
 # Special:NewFiles
 'newimages' => 'Galleria dei nuovi file',
@@ -3030,6 +3089,10 @@ $1',
 'sp-newimages-showfrom' => 'Mostra i file più recenti a partire dalle ore $2 del $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds-abbrev' => '$1&nbsp;s',
+'minutes-abbrev' => '$1&nbsp;min',
+'hours-abbrev' => '$1&nbsp;h',
+'days-abbrev' => '$1&nbsp;gg.',
 'seconds' => '{{PLURAL:$1|un secondo|$1 secondi}}',
 'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
 'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
@@ -3465,12 +3528,12 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'tutte',
-'namespacesall' => 'Tutti',
+'namespacesall' => 'tutti',
 'monthsall' => 'tutti',
 'limitall' => 'tutti',
 
 # E-mail address confirmation
-'confirmemail' => 'Conferma indirizzo e-mail',
+'confirmemail' => 'Conferma indirizzo email',
 'confirmemail_noemail' => 'Non è stato indicato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]].',
 'confirmemail_text' => "{{SITENAME}} richiede la verifica dell'indirizzo e-mail prima di poter usare le relative funzioni. Premere il pulsante qui sotto per inviare una richiesta di conferma al proprio indirizzo; nel messaggio è presente un collegamento che contiene un codice. Visitare il collegamento con il proprio browser per confermare che l'indirizzo e-mail è valido.",
 'confirmemail_pending' => "Il codice di conferma è già stato spedito via posta elettronica; se l'account è stato
@@ -3585,7 +3648,7 @@ Per favore, conferma che desideri veramente ricreare questa pagina.",
 'size-bytes' => '$1 byte',
 
 # Live preview
-'livepreview-loading' => 'Caricamento in corso',
+'livepreview-loading' => 'Caricamento in corso...',
 'livepreview-ready' => 'Caricamento in corso… Pronto.',
 'livepreview-failed' => "Errore nella funzione Live preview.
 Usare l'anteprima standard.",
@@ -3693,7 +3756,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 * <span class="mw-specialpagecached">Pagine speciali disponibili in versione cache (potrebbero essere obsolete).</span>',
 'specialpages-group-maintenance' => 'Resoconti di manutenzione',
 'specialpages-group-other' => 'Altre pagine speciali',
-'specialpages-group-login' => 'Login / registrazione',
+'specialpages-group-login' => 'Accesso / creazione utenze',
 'specialpages-group-changes' => 'Ultime modifiche e registri',
 'specialpages-group-media' => 'File multimediali - caricamento e resoconti',
 'specialpages-group-users' => 'Utenti e diritti',
@@ -3826,9 +3889,12 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'api-error-empty-file' => 'Il file selezionato era vuoto.',
 'api-error-emptypage' => 'La creazione di nuove pagine vuote non è consentita.',
 'api-error-fetchfileerror' => "Errore interno: c'è stato un problema durante il recupero del documento.",
+'api-error-fileexists-forbidden' => 'Un file di nome "$1" già esiste e non può essere sovrascritto.',
+'api-error-fileexists-shared-forbidden' => 'Un file di nome "$1" già esiste nel repository condiviso e non può essere sovrascritto.',
 'api-error-file-too-large' => 'Il file selezionato era troppo grande.',
 'api-error-filename-tooshort' => 'Il nome del file è troppo breve.',
 'api-error-filetype-banned' => 'Questo tipo di file non è accettato.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|non è un tipo di file consentito|non sono tipi di file consentiti}}. {{PLURAL:$3|Il tipo di file consentito è|I tipi di file consentiti sono}} $2.',
 'api-error-filetype-missing' => "Al file manca l'estensione.",
 'api-error-hookaborted' => "La modifica hai tentato di fare è stata interrotta da un passaggio dell'estensione.",
 'api-error-http' => 'Errore interno: impossibile connettersi al server.',
index 0273ed7..80f5376 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author 2nd-player
  * @author Akaniji
  * @author Alexsh
  * @author Ant176
@@ -118,7 +119,7 @@ $specialPageAliases = array(
        'Blankpage'                 => array( '白紙ページ' ),
        'Block'                     => array( '投稿ブロック', 'ブロック' ),
        'Blockme'                   => array( '自己ブロック' ),
-       'Booksources'               => array( '文献資料' ),
+       'Booksources'               => array( '文献資料', '書籍情報源' ),
        'BrokenRedirects'           => array( '迷子のリダイレクト', '壊れたリダイレクト' ),
        'Categories'                => array( 'カテゴリ', 'カテゴリ一覧' ),
        'ChangeEmail'               => array( 'メールアドレスの変更' ),
@@ -211,154 +212,154 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#転送', '#リダイレクト', '#転送', '#リダイレクト', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__目次非表示__', '__目次非表示__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__ギャラリー非表示__', '__ギャラリー非表示__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__目次強制__', '__目次強制__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__目次__', '__目次__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__節編集非表示__', '__セクション編集非表示__', '__セクション編集非表示__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__見出し非表示__', '__見出し非表示__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', '現在の月', '協定月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', '現在の月1', '協定月1', '協定月1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', '現在の月名', '協定月名', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', '現在の月属格', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', '現在の月省略形', '省略協定月', '協定月省略', '協定月省略形', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', '現在の日', '協定日', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', '現在の日2', '協定日2', '協定日2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', '現在の曜日名', '協定曜日', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', '現在の年', '協定年', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', '現在の時刻', '協定時間', '協定時刻', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', '現在の時', '協定時', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', '地方時の月', '現地月', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', '地方時の月1', '現地月1', '現地月1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', '地方時の月名1', '現地月名', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', '地方時の月属格', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', '地方時の月省略形', '省略現地月', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', '地方時の日', '現地日', 'ローカルデイ', 'LOCALDAY' ),
-       'localday2'               => array( '1', '地方時の日2', '現地日2', '現地日2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', '地方時の曜日名', '現地曜日', 'ローカルデイネーム', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', '地方時の年', '現地年', 'ローカルイヤー', 'LOCALYEAR' ),
-       'localtime'               => array( '1', '地方時の時刻', '現地時間', 'ローカルタイム', 'LOCALTIME' ),
-       'localhour'               => array( '1', '地方時の時', '現地時', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ページ数', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', '記事数', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ファイル数', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', '利用者数', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', '活動利用者数', '有効な利用者数', '有効利用者数', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', '編集回数', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', '閲覧回数', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'ページ名', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ページ名E', 'ページ名E', 'PAGENAMEE' ),
-       'namespace'               => array( '1', '名前空間', 'NAMESPACE' ),
-       'namespacee'              => array( '1', '名前空間E', '名前空間E', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'トーク空間', 'ノート空間', '会話空間', 'トークスペース', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'トーク空間E', 'トーク空間E', 'ノート空間E', '会話空間E', 'ノート空間E', '会話空間E', 'トークスペースE', 'トークスペースE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', '主空間', '標準空間', '記事空間', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', '主空間E', '標準空間E', '標準空間E', '記事空間E', '記事空間E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', '完全なページ名', 'フルページ名', '完全な記事名', '完全記事名', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', '完全なページ名E', 'フルページ名E', 'フルページ名E', '完全なページ名E', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'サブページ名', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'サブページ名E', 'サブページ名E', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', '親ページ名', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', '親ページ名E', '親ページ名E', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'トークページ名', '会話ページ名', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'トークページ名E', '会話ページ名E', '会話ページ名E', 'トークページ名E', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', '主ページ名', '記事ページ名', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', '主ページ名E', '記事ページ名E', '主ページ名E', '記事ページ名E', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'メッセージ:', 'MSG:' ),
-       'subst'                   => array( '0', '展開:', '展開:', 'SUBST:' ),
-       'safesubst'               => array( '0', '安全展開:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'ウィキ無効メッセージ:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'サムネイル', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', '代替画像=$1', 'サムネイル=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', '右', 'right' ),
-       'img_left'                => array( '1', '左', 'left' ),
-       'img_none'                => array( '1', 'なし', '無し', 'none' ),
-       'img_width'               => array( '1', '$1ピクセル', '$1px' ),
-       'img_center'              => array( '1', '中央', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'フレーム', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'フレームなし', 'frameless' ),
-       'img_page'                => array( '1', 'ページ=$1', 'ページ $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', '右上', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', '境界', 'ボーダー', 'border' ),
-       'img_baseline'            => array( '1', '下線', 'ベースライン', 'baseline' ),
-       'img_sub'                 => array( '1', '下付き', 'sub' ),
-       'img_super'               => array( '1', '上付き', 'super', 'sup' ),
-       'img_top'                 => array( '1', '上端', 'top' ),
-       'img_text_top'            => array( '1', '文上端', 'text-top' ),
-       'img_middle'              => array( '1', '中心', 'middle' ),
-       'img_bottom'              => array( '1', '下端', 'bottom' ),
-       'img_text_bottom'         => array( '1', '文下端', 'text-bottom' ),
-       'img_link'                => array( '1', 'リンク=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', '代替文=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'インターフェース:', 'インタ:', 'インターフェース:', 'インタ:', 'INT:' ),
-       'sitename'                => array( '1', 'サイト名', 'サイトネーム', 'SITENAME' ),
-       'ns'                      => array( '0', '名前空間:', '名前空間:', '名空:', '名空:', 'NS:' ),
-       'nse'                     => array( '0', '名前空間E:', 'NSE:' ),
-       'localurl'                => array( '0', 'ローカルURL:', 'ローカルURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ローカルURLE:', 'ローカルURLE:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', '記事パス', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'サーバー', 'サーバ', 'SERVER' ),
-       'servername'              => array( '0', 'サーバー名', 'サーバーネーム', 'サーバ名', 'サーバネーム', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'スクリプトパス', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'スタイルパス', 'STYLEPATH' ),
-       'grammar'                 => array( '0', '文法:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', '性別:', '性別:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__タイトル変換無効__', '__タイトルコンバート拒否__', '__タイトルコンバート拒否__', '__タイトル非表示__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__内容変換無効__', '__内容変換抑制__', '__内容変換抑制__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', '現在の週', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', '現在の曜日番号', 'CURRENTDOW' ),
-       'localweek'               => array( '1', '地方時の週', '現地週', 'ローカルウィーク', 'LOCALWEEK' ),
-       'localdow'                => array( '1', '地方時の曜日番号', 'LOCALDOW' ),
-       'revisionid'              => array( '1', '版のID', 'リビジョンID', '差分ID', 'リビジョンID', '差分ID', 'REVISIONID' ),
-       'revisionday'             => array( '1', '版の日', 'リビジョン日', '差分日', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', '版の日2', 'リビジョン日2', '差分日2', 'リビジョン日2', '差分日2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', '版の月', 'リビジョン月', '差分月', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', '版の月1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', '版の年', 'リビジョン年', '差分年', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', '版のタイムスタンプ', 'リビジョンタイムスタンプ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', '版の利用者', 'リビジョンユーザー', 'リビジョンユーザ', 'リビジョン利用者', '差分利用者', 'REVISIONUSER' ),
-       'plural'                  => array( '0', '複数:', '複数:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', '完全なURL:', 'フルURL:', '完全なURL:', 'フルURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', '完全なURLE:', 'フルURLE:', '完全なURLE:', 'フルURLE:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', '先頭小文字:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', '先頭大文字:', 'UCFIRST:' ),
-       'lc'                      => array( '0', '小文字:', 'LC:' ),
-       'uc'                      => array( '0', '大文字:', 'UC:' ),
-       'raw'                     => array( '0', '生:', 'RAW:' ),
-       'displaytitle'            => array( '1', '表示タイトル:', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', '生', 'R' ),
-       'newsectionlink'          => array( '1', '__新しい節リンク__', '__新しいセクションリンク__', '__新セクションリンク__', '__新しいセクションリンク__', '__新セクションリンク__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__新しい節リンク非表示__', '__新しいセクションリンク非表示__', '__新しいセクションリンク非表示__', '__新セクションリンク非表示__', '__新セクションリンク非表示__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', '現在のバージョン', 'ウィキバージョン', 'MediaWikiバージョン', 'メディアウィキバージョン', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'URLエンコード:', 'URLエンコード:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'アンカー用エンコード', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', '現在のタイムスタンプ', '協定タイムスタンプ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', '地方時のタイムスタンプ', '現地タイムスタンプ', 'ローカルタイムスタンプ', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', '方向印', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#言語:', '#言語:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', '内容言語', '記事言語', 'プロジェクト言語', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', '名前空間内ページ数', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', '管理者数', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', '数整形', 'FORMATNUM' ),
-       'padleft'                 => array( '0', '補充左', 'PADLEFT' ),
-       'padright'                => array( '0', '補充右', 'PADRIGHT' ),
-       'special'                 => array( '0', '特別', 'special' ),
-       'defaultsort'             => array( '1', 'デフォルトソート:', 'デフォルトソート:', 'デフォルトソートキー:', 'デフォルトカテゴリソート:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ファイルパス:', 'ファイルパス:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'タグ', 'tag' ),
-       'hiddencat'               => array( '1', '__カテゴリ非表示__', '__カテ非表示__', '__非表示カテ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'カテゴリ内ページ数', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'ページサイズ', 'PAGESIZE' ),
-       'index'                   => array( '1', '__インデックス__', '__インデックス__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__インデックス拒否__', '__インデックス拒否__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'グループ人数', 'グループ所属人数', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__静的転送__', '__二重転送解消無効__', '__二重転送解消無効__', '__二重転送修正無効__', '__二重転送修正無効__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', '保護レベル', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', '日付整形', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'パス', 'PATH' ),
-       'url_wiki'                => array( '0', 'ウィキ', 'WIKI' ),
-       'url_query'               => array( '0', 'クエリー', 'QUERY' ),
+       'redirect'                  => array( '0', '#転送', '#リダイレクト', '#転送', '#リダイレクト', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__目次非表示__', '__目次非表示__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__ギャラリー非表示__', '__ギャラリー非表示__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__目次強制__', '__目次強制__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__目次__', '__目次__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__節編集非表示__', '__セクション編集非表示__', '__セクション編集非表示__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__見出し非表示__', '__見出し非表示__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', '現在の月', '協定月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', '現在の月1', '協定月1', '協定月1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', '現在の月名', '協定月名', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', '現在の月属格', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', '現在の月省略形', '省略協定月', '協定月省略', '協定月省略形', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', '現在の日', '協定日', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', '現在の日2', '協定日2', '協定日2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', '現在の曜日名', '協定曜日', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', '現在の年', '協定年', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', '現在の時刻', '協定時間', '協定時刻', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', '現在の時', '協定時', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', '地方時の月', '現地月', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', '地方時の月1', '現地月1', '現地月1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', '地方時の月名1', '現地月名', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', '地方時の月属格', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', '地方時の月省略形', '省略現地月', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', '地方時の日', '現地日', 'ローカルデイ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', '地方時の日2', '現地日2', '現地日2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', '地方時の曜日名', '現地曜日', 'ローカルデイネーム', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', '地方時の年', '現地年', 'ローカルイヤー', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', '地方時の時刻', '現地時間', 'ローカルタイム', 'LOCALTIME' ),
+       'localhour'                 => array( '1', '地方時の時', '現地時', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ページ数', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', '記事数', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ファイル数', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', '利用者数', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', '活動利用者数', '有効な利用者数', '有効利用者数', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', '編集回数', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', '閲覧回数', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'ページ名', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ページ名E', 'ページ名E', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', '名前空間', 'NAMESPACE' ),
+       'namespacee'                => array( '1', '名前空間E', '名前空間E', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'トーク空間', 'ノート空間', '会話空間', 'トークスペース', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'トーク空間E', 'トーク空間E', 'ノート空間E', '会話空間E', 'ノート空間E', '会話空間E', 'トークスペースE', 'トークスペースE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', '主空間', '標準空間', '記事空間', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', '主空間E', '標準空間E', '標準空間E', '記事空間E', '記事空間E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', '完全なページ名', 'フルページ名', '完全な記事名', '完全記事名', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', '完全なページ名E', 'フルページ名E', 'フルページ名E', '完全なページ名E', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'サブページ名', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'サブページ名E', 'サブページ名E', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', '親ページ名', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', '親ページ名E', '親ページ名E', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'トークページ名', '会話ページ名', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'トークページ名E', '会話ページ名E', '会話ページ名E', 'トークページ名E', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', '主ページ名', '記事ページ名', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', '主ページ名E', '記事ページ名E', '主ページ名E', '記事ページ名E', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'メッセージ:', 'MSG:' ),
+       'subst'                     => array( '0', '展開:', '展開:', 'SUBST:' ),
+       'safesubst'                 => array( '0', '安全展開:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'ウィキ無効メッセージ:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'サムネイル', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', '代替画像=$1', 'サムネイル=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', '右', 'right' ),
+       'img_left'                  => array( '1', '左', 'left' ),
+       'img_none'                  => array( '1', 'なし', '無し', 'none' ),
+       'img_width'                 => array( '1', '$1ピクセル', '$1px' ),
+       'img_center'                => array( '1', '中央', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'フレーム', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'フレームなし', 'frameless' ),
+       'img_page'                  => array( '1', 'ページ=$1', 'ページ $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', '右上', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', '境界', 'ボーダー', 'border' ),
+       'img_baseline'              => array( '1', '下線', 'ベースライン', 'baseline' ),
+       'img_sub'                   => array( '1', '下付き', 'sub' ),
+       'img_super'                 => array( '1', '上付き', 'super', 'sup' ),
+       'img_top'                   => array( '1', '上端', 'top' ),
+       'img_text_top'              => array( '1', '文上端', 'text-top' ),
+       'img_middle'                => array( '1', '中心', 'middle' ),
+       'img_bottom'                => array( '1', '下端', 'bottom' ),
+       'img_text_bottom'           => array( '1', '文下端', 'text-bottom' ),
+       'img_link'                  => array( '1', 'リンク=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', '代替文=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'インターフェース:', 'インタ:', 'インターフェース:', 'インタ:', 'INT:' ),
+       'sitename'                  => array( '1', 'サイト名', 'サイトネーム', 'SITENAME' ),
+       'ns'                        => array( '0', '名前空間:', '名前空間:', '名空:', '名空:', 'NS:' ),
+       'nse'                       => array( '0', '名前空間E:', 'NSE:' ),
+       'localurl'                  => array( '0', 'ローカルURL:', 'ローカルURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ローカルURLE:', 'ローカルURLE:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', '記事パス', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'サーバー', 'サーバ', 'SERVER' ),
+       'servername'                => array( '0', 'サーバー名', 'サーバーネーム', 'サーバ名', 'サーバネーム', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'スクリプトパス', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'スタイルパス', 'STYLEPATH' ),
+       'grammar'                   => array( '0', '文法:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', '性別:', '性別:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__タイトル変換無効__', '__タイトルコンバート拒否__', '__タイトルコンバート拒否__', '__タイトル非表示__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__内容変換無効__', '__内容変換抑制__', '__内容変換抑制__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', '現在の週', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', '現在の曜日番号', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', '地方時の週', '現地週', 'ローカルウィーク', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', '地方時の曜日番号', 'LOCALDOW' ),
+       'revisionid'                => array( '1', '版のID', 'リビジョンID', '差分ID', 'リビジョンID', '差分ID', 'REVISIONID' ),
+       'revisionday'               => array( '1', '版の日', 'リビジョン日', '差分日', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', '版の日2', 'リビジョン日2', '差分日2', 'リビジョン日2', '差分日2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', '版の月', 'リビジョン月', '差分月', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', '版の月1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', '版の年', 'リビジョン年', '差分年', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', '版のタイムスタンプ', 'リビジョンタイムスタンプ', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', '版の利用者', 'リビジョンユーザー', 'リビジョンユーザ', 'リビジョン利用者', '差分利用者', 'REVISIONUSER' ),
+       'plural'                    => array( '0', '複数:', '複数:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', '完全なURL:', 'フルURL:', '完全なURL:', 'フルURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', '完全なURLE:', 'フルURLE:', '完全なURLE:', 'フルURLE:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', '先頭小文字:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', '先頭大文字:', 'UCFIRST:' ),
+       'lc'                        => array( '0', '小文字:', 'LC:' ),
+       'uc'                        => array( '0', '大文字:', 'UC:' ),
+       'raw'                       => array( '0', '生:', 'RAW:' ),
+       'displaytitle'              => array( '1', '表示タイトル:', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', '生', 'R' ),
+       'newsectionlink'            => array( '1', '__新しい節リンク__', '__新しいセクションリンク__', '__新セクションリンク__', '__新しいセクションリンク__', '__新セクションリンク__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__新しい節リンク非表示__', '__新しいセクションリンク非表示__', '__新しいセクションリンク非表示__', '__新セクションリンク非表示__', '__新セクションリンク非表示__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', '現在のバージョン', 'ウィキバージョン', 'MediaWikiバージョン', 'メディアウィキバージョン', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'URLエンコード:', 'URLエンコード:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'アンカー用エンコード', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', '現在のタイムスタンプ', '協定タイムスタンプ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', '地方時のタイムスタンプ', '現地タイムスタンプ', 'ローカルタイムスタンプ', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', '方向印', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#言語:', '#言語:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', '内容言語', '記事言語', 'プロジェクト言語', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', '名前空間内ページ数', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', '管理者数', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', '数整形', 'FORMATNUM' ),
+       'padleft'                   => array( '0', '補充左', 'PADLEFT' ),
+       'padright'                  => array( '0', '補充右', 'PADRIGHT' ),
+       'special'                   => array( '0', '特別', 'special' ),
+       'defaultsort'               => array( '1', 'デフォルトソート:', 'デフォルトソート:', 'デフォルトソートキー:', 'デフォルトカテゴリソート:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ファイルパス:', 'ファイルパス:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'タグ', 'tag' ),
+       'hiddencat'                 => array( '1', '__カテゴリ非表示__', '__カテ非表示__', '__非表示カテ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'カテゴリ内ページ数', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'ページサイズ', 'PAGESIZE' ),
+       'index'                     => array( '1', '__インデックス__', '__インデックス__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__インデックス拒否__', '__インデックス拒否__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'グループ人数', 'グループ所属人数', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__静的転送__', '__二重転送解消無効__', '__二重転送解消無効__', '__二重転送修正無効__', '__二重転送修正無効__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', '保護レベル', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', '日付整形', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'パス', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ウィキ', 'WIKI' ),
+       'url_query'                 => array( '0', 'クエリー', 'QUERY' ),
 );
 
 $messages = array(
@@ -369,25 +370,25 @@ $messages = array(
 'tog-hidepatrolled' => '最近の更新に巡回済みの編集を表示しない',
 'tog-newpageshidepatrolled' => '新しいページの一覧に巡回済みのページを表示しない',
 'tog-extendwatchlist' => 'ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示',
-'tog-usenewrc' => 'æ\9c\80è¿\91ã\81®æ\9b´æ\96°ã\83\9aã\83¼ã\82¸ã\82\92æ\8b¡å¼µ(JavaScriptが必要)',
-'tog-numberheadings' => 'è\87ªå\8b\95ç\9a\84ã\81«è¦\8bå\87ºã\81\97ã\81«ç\95ªå\8f·ã\82\92振る',
+'tog-usenewrc' => 'æ\9c\80è¿\91ã\81®æ\9b´æ\96°ã\81¨ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81§è¤\87æ\95°ã\81®å¤\89æ\9b´ã\82\92ã\83\9aã\83¼ã\82¸ã\81\94ã\81¨ã\81«ã\81¾ã\81¨ã\82\81ã\82\8b(JavaScriptが必要)',
+'tog-numberheadings' => 'è¦\8bå\87ºã\81\97ã\81«ç\95ªå\8f·ã\82\92è\87ªå\8b\95ç\9a\84ã\81«振る',
 'tog-showtoolbar' => '編集用のツールバーを表示(JavaScriptが必要)',
 'tog-editondblclick' => 'ダブルクリックで編集(JavaScriptが必要)',
 'tog-editsection' => '[編集]リンクから節を編集できるようにする',
 'tog-editsectiononrightclick' => '節見出しの右クリックで節を編集できるようにする(JavaScriptが必要)',
 'tog-showtoc' => '目次を表示(ページに見出しが4つ以上ある場合)',
 'tog-rememberpassword' => 'このブラウザーにログイン情報を記憶(最大 $1 {{PLURAL:$1|日間}})',
-'tog-watchcreations' => '自分が作成したページをウォッチリストに追加',
-'tog-watchdefault' => '自分が編集したページをウォッチリストに追加',
-'tog-watchmoves' => '自分が移動したページをウォッチリストに追加',
-'tog-watchdeletion' => '自分が削除したページをウォッチリストに追加',
+'tog-watchcreations' => 'è\87ªå\88\86ã\81\8cä½\9cæ\88\90ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\97ã\81\9fã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ',
+'tog-watchdefault' => 'è\87ªå\88\86ã\81\8cç·¨é\9b\86ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ',
+'tog-watchmoves' => 'è\87ªå\88\86ã\81\8c移å\8b\95ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ',
+'tog-watchdeletion' => 'è\87ªå\88\86ã\81\8cå\89\8aé\99¤ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ',
 'tog-minordefault' => '細部の編集に既定でチェックを入れる',
 'tog-previewontop' => 'プレビューを編集ボックスの前に配置',
 'tog-previewonfirst' => '編集開始時にもプレビューを表示',
 'tog-nocache' => 'ブラウザーによるページのキャッシュを無効にする',
-'tog-enotifwatchlistpages' => 'ウォッチリストにあるページが更新されたらメールを受け取る',
+'tog-enotifwatchlistpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\82\89ã\83¡ã\83¼ã\83«ã\82\92å\8f\97ã\81\91å\8f\96ã\82\8b',
 'tog-enotifusertalkpages' => '自分のトークページが更新されたらメールを受け取る',
-'tog-enotifminoredits' => '細部の編集でもメールを受け取る',
+'tog-enotifminoredits' => 'ページやファイルへの細部の編集でもメールを受け取る',
 'tog-enotifrevealaddr' => '通知メールで自分のメールアドレスを明示',
 'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示',
 'tog-oldsig' => '既存の署名:',
@@ -403,7 +404,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'ウォッチリストにログイン利用者の編集を表示しない',
 'tog-watchlisthideanons' => 'ウォッチリストに匿名利用者の編集を表示しない',
 'tog-watchlisthidepatrolled' => 'ウォッチリストに巡回済みの編集を表示しない',
-'tog-nolangconversion' => '言語変種変換を無効にする',
 'tog-ccmeonemails' => '他の利用者に送信したメールの控えを自分にも送信',
 'tog-diffonly' => '差分の下にページ内容を表示しない',
 'tog-showhiddencats' => '隠しカテゴリを表示',
@@ -415,7 +415,7 @@ $messages = array(
 'underline-default' => 'ブラウザーの設定を使用',
 
 # Font style option in Special:Preferences
-'editfont-style' => '編集エリアのフォントスタイル:',
+'editfont-style' => '編集エリアのフォント:',
 'editfont-default' => 'ブラウザーの設定を使用',
 'editfont-monospace' => '等幅フォント',
 'editfont-sansserif' => 'Sans Serif フォント',
@@ -552,7 +552,7 @@ $messages = array(
 'create-this-page' => 'このページを作成',
 'delete' => '削除',
 'deletethispage' => 'このページを削除',
-'undelete_short' => '{{PLURAL:$1|$1 ç\89\88}}を復帰',
+'undelete_short' => '{{PLURAL:$1|$1 ç·¨é\9b\86}}を復帰',
 'viewdeleted_short' => '{{PLURAL:$1|削除された $1 編集}}を閲覧',
 'protect' => '保護',
 'protect_change' => '設定変更',
@@ -577,7 +577,7 @@ $messages = array(
 'viewhelppage' => 'ヘルプのページを表示',
 'categorypage' => 'カテゴリのページを表示',
 'viewtalkpage' => '議論を表示',
-'otherlanguages' => '他の言語',
+'otherlanguages' => '他言語版',
 'redirectedfrom' => '($1から転送)',
 'redirectpagesub' => 'リダイレクトページ',
 'lastmodifiedat' => 'このページが最後に更新されたのは $1 $2 です。',
@@ -628,6 +628,10 @@ $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' => '編集',
@@ -651,8 +655,8 @@ $1',
 'page-rss-feed' => '「$1」のRSSフィード',
 'page-atom-feed' => '「$1」のAtomフィード',
 'red-link-title' => '$1(存在しないページ)',
-'sort-descending' => '降順に整列',
-'sort-ascending' => '昇順に整列',
+'sort-descending' => '降順に並べ替え',
+'sort-ascending' => '昇順に並べ替え',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'ページ',
@@ -682,9 +686,9 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'dberrortext' => 'データベースクエリーの構文エラーが発生しました。
 ソフトウェアにバグがある可能性があります。
 最後に実行を試みたクエリー:
-<blockquote><tt>$1</tt></blockquote>
-(関数「<tt>$2</tt>」内)。
-データベースはエラー「<tt>$3:$4</tt>」を返しました。',
+<blockquote><code>$1</code></blockquote>
+(関数「<code>$2</code>」内)。
+データベースはエラー「<samp>$3:$4</samp>」を返しました。',
 'dberrortextcl' => 'データベースクエリーの構文エラーが発生しました。
 最後に実行を試みたクエリー:
 「$1」
@@ -721,6 +725,8 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'cannotdelete' => 'ページまたはファイル「$1」を削除できませんでした。
 他の人が既に削除した可能性があります。',
 'cannotdelete-title' => '「$1」というページを削除できません',
+'delete-hook-aborted' => 'フックによって削除が中止されました。
+理由は不明です。',
 'badtitle' => '正しくないページ名',
 'badtitletext' => '要求されたページ名は、無効、空、正しくない言語間リンク/ウィキ間リンクのページ名、のいずれかです。
 ページ名に使用できない文字が1つ以上含まれている可能性があります。',
@@ -755,6 +761,8 @@ $2',
 'filereadonlyerror' => 'ファイルリポジトリ「$2」が読み取り専用の状態にあるため、ファイル「$1」を変更できません。
 
 読み取り専用に設定した管理者からの説明:「$3」',
+'exception-nologin' => 'ログインしていません',
+'exception-nologin-text' => 'このページまたは操作には、このウィキへのログインが必要です。',
 
 # Virus scanner
 'virus-badscanner' => "環境設定が不適合です:不明なウイルス検知ソフトウェア:''$1''",
@@ -775,6 +783,7 @@ $2',
 'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
 'securelogin-stick-https' => 'ログイン後にHTTPS接続を維持',
 'yourdomainname' => 'ドメイン:',
+'password-change-forbidden' => 'このウィキではパスワードを変更できません。',
 'externaldberror' => '外部の認証データベースでエラーが発生したか、または外部アカウント情報の更新が許可されていません。',
 'login' => 'ログイン',
 'nav-login-createaccount' => 'ログインまたはアカウント作成',
@@ -797,15 +806,16 @@ $2',
 他の名前を選んでください。',
 'loginerror' => 'ログインのエラー',
 'createaccounterror' => 'アカウントを作成できませんでした: $1',
-'nocookiesnew' => 'å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92ä½\9cæ\88\90ã\81\97ましたが、ログインしていません。
+'nocookiesnew' => 'å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81¯ä½\9cæ\88\90ã\81\95ã\82\8cましたが、ログインしていません。
 {{SITENAME}}ではログインにCookieを使用します。
-Cookieを無効にしているようです。
+ご使用のブラウザではCookieが無効になっています。
 Cookieを有効にしてから、新しい利用者名とパスワードでログインしてください。',
 'nocookieslogin' => '{{SITENAME}}ではログインにCookieを使用します。
 Cookieを無効にしているようです。
 Cookieを有効にしてから、もう一度試してください。',
 'nocookiesfornew' => '発信元を確認できなかったため、アカウントは作成されませんでした。
 Cookieを有効にしていることを確認して、このページを再読込してもう一度試してください。',
+'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => '利用者名を正しく指定していません。',
 'loginsuccesstitle' => 'ログイン成功',
 'loginsuccess' => "'''{{SITENAME}}に「$1」としてログインしました。'''",
@@ -877,9 +887,9 @@ Cookieを有効にしていることを確認して、このページを再読
 'resetpass_announce' => 'メールでお送りした仮パスワードでログインしました。
 ログインを完了するには、ここで新しいパスワードを設定する必要があります:',
 'resetpass_text' => '<!-- ここに文を挿入 -->',
-'resetpass_header' => 'ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92変更',
-'oldpassword' => '古いパスワード',
-'newpassword' => '新しいパスワード',
+'resetpass_header' => 'ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®変更',
+'oldpassword' => '古いパスワード:',
+'newpassword' => '新しいパスワード:',
 'retypenew' => '新しいパスワードを再入力:',
 'resetpass_submit' => '再設定してログイン',
 'resetpass_success' => 'パスワードの変更に成功しました!
@@ -974,7 +984,7 @@ $2
 'showlivepreview' => 'ライブプレビュー',
 'showdiff' => '差分を表示',
 'anoneditwarning' => "'''警告:'''ログインしていません。
-このまま投稿した場合、ご使用中のIPアドレスがこのページの編集履歴に記録されます。",
+編集すると、IPアドレスがこのページの編集履歴に記録されます。",
 'anonpreviewwarning' => "''ログインしていません。投稿を保存すると、ご使用中のIPアドレスがこのページの履歴に記録されます。''",
 'missingsummary' => "'''注意:'''要約欄が空欄です。
 「{{int:savearticle}}」をもう一度クリックすると、編集は要約なしで保存されます。",
@@ -1048,7 +1058,6 @@ IP アドレスは複数の利用者で共有されている場合がありま
 * '''Firefox / Safari:''' ''Shift'' を押しながら ''再読み込み'' をクリックする、もしくは ''Ctrl-F5'' か ''Ctrl-R'' を押してください (Macでは ''&#x2318;-R'' )
 * '''Google Chrome:''' ''Ctrl-Shift-R'' を押してください (Macでは ''&#x2318;-Shift-R'' )
 * '''Internet Explorer:''' ''Ctrl'' を押しながら ''最新の情報に更新'' をクリックする、もしくは ''Ctrl-F5'' を押してください
-* '''Konqueror:''' ''再読み込み'' をクリックするか、 ''F5'' を押してください。
 * '''Opera:''' ''ツール → 設定'' からキャッシュをクリアしてください。",
 'usercssyoucanpreview' => "'''ヒント:'''「{{int:showpreview}}」ボタンを使うと、保存前に新しいスタイルシートを試験できます。",
 'userjsyoucanpreview' => "'''ヒント:''' 「{{int:showpreview}}」ボタンを使うと、保存前に新しいスクリプトを試験できます。",
@@ -1067,7 +1076,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'previewnote' => "'''これはプレビューです。'''
 変更箇所はまだ保存されていません!",
 'continue-editing' => '編集を続行',
-'previewconflict' => 'ã\81\93ã\81®ã\83\97ã\83¬ã\83\93ã\83¥ã\83¼ã\81¯ã\80\81ä¸\8aã\81®æ\96\87ç« ç·¨é\9b\86ã\82¨ã\83ªã\82¢ã\81®æ\96\87ç« ã\82\92ä¿\9då­\98ã\81\97ã\81\9få ´å\90\88ã\81«ã\81©ã\81\86è¦\8bã\81\88ã\82\8bã\82\88ã\81\86ã\81«ã\81ªã\82\8bã\81\8bã\82\92示ã\81\99ã\82\82ã\81®です。',
+'previewconflict' => 'ã\81\93ã\82\8cã\81¯ã\80\81ä¸\8aã\81®ç·¨é\9b\86ã\82¨ã\83ªã\82¢ã\81®æ\96\87ç« ã\82\92ä¿\9då­\98ã\81\97ã\81\9få ´å\90\88ã\81«ã\81©ã\81\86表示ã\81\95ã\82\8cã\82\8bã\81\8bã\82\92示ã\81\99ã\83\97ã\83¬ã\83\93ã\83¥ã\83¼です。',
 'session_fail_preview' => "'''申し訳ありません!セッションデータが消失したため編集を処理できませんでした。'''
 もう一度やり直してください。
 それでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直してください。",
@@ -1172,6 +1181,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'expansion-depth-exceeded-warning' => 'ページが展開の深さ制限を超えました',
 'parser-unstrip-loop-warning' => 'Unstrip のループが検出されました',
 'parser-unstrip-recursion-limit' => 'Unstrip の再帰($1)が上限を超えました',
+'converter-manual-rule-error' => '手動の言語変換規則でエラーを検出しました。',
 
 # "Undo" feature
 'undo-success' => 'この編集を取り消せます。
@@ -1220,8 +1230,8 @@ $3が示した理由:''$2''",
 
 # Revision deletion
 'rev-deleted-comment' => '(要約は除去されています)',
-'rev-deleted-user' => '(利用者名は除去されています)',
-'rev-deleted-event' => '(記録は除去されています)',
+'rev-deleted-user' => '(利用者名は除去されています)',
+'rev-deleted-event' => '(記録は除去されています)',
 'rev-deleted-user-contribs' => '[利用者名またはIPアドレスは除去されました - その編集は投稿記録で非表示にされています]',
 'rev-deleted-text-permission' => "この版は'''削除されています'''。
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
@@ -1310,7 +1320,7 @@ $1",
 ** 名誉毀損のおそれ
 ** 非公開個人情報',
 'revdelete-otherreason' => '他の、または追加の理由:',
-'revdelete-reasonotherlist' => '他の理由',
+'revdelete-reasonotherlist' => 'その他の理由',
 'revdelete-edit-reasonlist' => '削除理由を編集',
 'revdelete-offender' => '指定版の投稿者:',
 
@@ -1357,7 +1367,7 @@ $1",
 'difference-multipage' => '(ページ間の差分)',
 'lineno' => '$1行:',
 'compareselectedversions' => '選択した版同士を比較',
-'showhideselectedversions' => '選択した版を表示もしくは非表示',
+'showhideselectedversions' => '選択した版を表示/非表示',
 'editundo' => '取り消し',
 'diff-multi' => '({{PLURAL:$2|$2人の利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
 'diff-multi-manyusers' => '({{PLURAL:$2|$2人を超える利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
@@ -1389,7 +1399,7 @@ $1",
 'searchprofile-images' => 'マルチメディア',
 'searchprofile-everything' => 'すべて',
 'searchprofile-advanced' => '詳細',
-'searchprofile-articles-tooltip' => '$1検索',
+'searchprofile-articles-tooltip' => '$1内を検索',
 'searchprofile-project-tooltip' => '$1内を検索',
 'searchprofile-images-tooltip' => 'ファイルを検索',
 'searchprofile-everything-tooltip' => '全本文ページ(トークページ含む)を検索',
@@ -1586,7 +1596,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 
 # Groups
 'group' => 'グループ:',
-'group-user' => '利用者',
+'group-user' => '登録利用者',
 'group-autoconfirmed' => '自動承認された利用者',
 'group-bot' => 'ボット',
 'group-sysop' => '管理者',
@@ -1594,14 +1604,14 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'group-suppress' => '秘匿者',
 'group-all' => '(全員)',
 
-'group-user-member' => '{{GENDER:$1|利用者}}',
+'group-user-member' => '{{GENDER:$1|登録利用者}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|自動承認された利用者}}',
 'group-bot-member' => '{{GENDER:$1|ボット}}',
 'group-sysop-member' => '{{GENDER:$1|管理者}}',
 'group-bureaucrat-member' => '{{GENDER:$1|ビューロクラット}}',
 'group-suppress-member' => '{{GENDER:$1|秘匿者}}',
 
-'grouppage-user' => '{{ns:project}}:利用者',
+'grouppage-user' => '{{ns:project}}:登録利用者',
 'grouppage-autoconfirmed' => '{{ns:project}}:自動承認された利用者',
 'grouppage-bot' => '{{ns:project}}:ボット',
 'grouppage-sysop' => '{{ns:project}}:管理者',
@@ -1619,26 +1629,27 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-move-subpages' => '下位ページを含めてページを移動',
 'right-move-rootuserpages' => '利用者ページ本体を移動',
 'right-movefile' => 'ファイルの移動',
-'right-suppressredirect' => 'ã\83\9aã\83¼ã\82¸ã\81®ç§»å\8b\95ã\81®é\9a\9bã\81«å\85\83ã\81®ã\83\9aã\83¼ã\82¸å\90\8dã\81\8bã\82\89ã\81®ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\82\92ä½\9cæ\88\90ã\81\97ã\81ªã\81\84',
+'right-suppressredirect' => 'ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\82\92æ®\8bã\81\95ã\81\9aã\81«ã\83\9aã\83¼ã\82¸ã\82\92移å\8b\95',
 'right-upload' => 'ファイルをアップロード',
 'right-reupload' => '既存のファイルに上書き',
 'right-reupload-own' => '自分自身がアップロードした既存のファイルに上書き',
-'right-reupload-shared' => 'å\85±æ\9c\89ã\83¡ã\83\87ã\82£ã\82¢ã\83ªã\83\9dã\82¸ã\83\88ã\83ªä¸\8aã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\83­ã\83¼ã\82«ã\83«ã\81§ã\81®上書き',
-'right-upload_by_url' => 'URLからファイルをアップロード',
+'right-reupload-shared' => 'å\85±æ\9c\89ã\83¡ã\83\87ã\82£ã\82¢ã\83ªã\83\9dã\82¸ã\83\88ã\83ªä¸\8aã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«ã\83­ã\83¼ã\82«ã\83«ã\81§上書き',
+'right-upload_by_url' => 'URL からファイルをアップロード',
 'right-purge' => '確認を省略してサイトのキャッシュを破棄',
 'right-autoconfirmed' => '半保護されたページを編集',
 'right-bot' => '自動処理と認識させる',
-'right-nominornewtalk' => 'è­°è«\96ã\83\9aã\83¼ã\82¸ã\81¸ç´°é\83¨ã\81®ç·¨é\9b\86ã\82\92ã\81\97ã\81\9fã\81¨ã\81\8dã\81«ã\80\81æ\96°ã\81\97ã\81\84ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81®ã\81\8aç\9f¥ã\82\89ã\81\9bã\82\92表示しない',
-'right-apihighlimits' => 'APIè¦\81æ±\82ã\81§ã\82\88ã\82\8aé«\98ã\81\84å\88¶é\99\90å\80¤ã\81®使用',
-'right-writeapi' => 'æ\9b¸ã\81\8dè¾¼ã\81¿APIã\81®使用',
+'right-nominornewtalk' => 'è­°è«\96ã\83\9aã\83¼ã\82¸ã\81®ç´°é\83¨ã\81®ç·¨é\9b\86ã\82\92ã\81\97ã\81\9fé\9a\9bã\81«ã\80\81æ\96°ç\9d\80ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81¨ã\81\97ã\81¦é\80\9aç\9f¥しない',
+'right-apihighlimits' => 'APIè¦\81æ±\82ã\81§ã\82\88ã\82\8aé«\98ã\81\84å\88¶é\99\90å\80¤ã\82\92使用',
+'right-writeapi' => 'æ\9b¸ã\81\8dè¾¼ã\81¿APIã\82\92使用',
 'right-delete' => 'ページの削除',
 'right-bigdelete' => '大きな履歴があるページを削除',
-'right-deleterevision' => 'ページの特定の版の削除と復帰',
+'right-deletelogentry' => '特定の記録項目を削除/復帰',
+'right-deleterevision' => 'ページの特定の版を削除/復帰',
 'right-deletedhistory' => '削除された履歴項目(関連する本文を除く)を閲覧',
 'right-deletedtext' => '削除された本文と削除された版間の差分を閲覧',
 'right-browsearchive' => '削除されたページを検索',
-'right-undelete' => 'ã\83\9aã\83¼ã\82¸ã\81®復帰',
-'right-suppressrevision' => '管ç\90\86è\80\85ã\81\8bã\82\89é\9a ã\81\95ã\82\8cã\81\9fç\89\88ã\81®ç¢ºèª\8dã\81¨復元',
+'right-undelete' => 'ã\83\9aã\83¼ã\82¸ã\82\92復帰',
+'right-suppressrevision' => '管ç\90\86è\80\85ã\81\8bã\82\89é\9a ã\81\95ã\82\8cã\81\9fç\89\88ã\82\92確èª\8d/復元',
 'right-suppressionlog' => '非公開記録を閲覧',
 'right-block' => '他の利用者の編集をブロック',
 'right-blockemail' => '利用者のメール送信をブロック',
@@ -1649,14 +1660,14 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-protect' => '保護レベルを変更し、保護されたページを編集',
 'right-editprotected' => '保護ページ(カスケード保護を除く)を編集',
 'right-editinterface' => 'ユーザーインターフェイスを編集',
-'right-editusercssjs' => 'ä»\96ã\81®å\88©ç\94¨è\80\85ã\81®CSSã\81¨JavaScriptファイルを編集',
+'right-editusercssjs' => 'ä»\96ã\81®å\88©ç\94¨è\80\85ã\81®CSSã\83\95ã\82¡ã\82¤ã\83«/JavaScriptファイルを編集',
 'right-editusercss' => '他の利用者のCSSファイルを編集',
 'right-edituserjs' => '他の利用者のJavaScriptファイルを編集',
-'right-rollback' => 'ç\89¹å®\9aã\83\9aã\83¼ã\82¸ã\82\92æ\9c\80å¾\8cã\81«ç·¨é\9b\86ã\81\97ã\81\9få\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\81®即時巻き戻し',
+'right-rollback' => 'ç\89¹å®\9aã\83\9aã\83¼ã\82¸ã\82\92æ\9c\80å¾\8cã\81«ç·¨é\9b\86ã\81\97ã\81\9få\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\82\92即時巻き戻し',
 'right-markbotedits' => '巻き戻しをボットの編集として扱う',
 'right-noratelimit' => '速度制限を受けない',
-'right-import' => 'ä»\96ã\81®ã\82¦ã\82£ã\82­ã\81\8bã\82\89ã\81®ã\83\9aã\83¼ã\82¸取り込み',
-'right-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81«ã\82\88ã\82\8bã\83\9aã\83¼ã\82¸取り込み',
+'right-import' => 'ä»\96ã\81®ã\82¦ã\82£ã\82­ã\81\8bã\82\89ã\83\9aã\83¼ã\82¸ã\82\92取り込み',
+'right-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\83\9aã\83¼ã\82¸ã\82\92取り込み',
 'right-patrol' => '他人の編集を巡回済みにする',
 'right-autopatrol' => '自分の編集を自動的に巡回済みにする',
 'right-patrolmarks' => '最近の更新で巡回済み印を閲覧',
@@ -1664,7 +1675,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-mergehistory' => 'ページ履歴の統合',
 'right-userrights' => '全利用者権限を編集',
 'right-userrights-interwiki' => '他のウィキの利用者の利用者権限を編集',
-'right-siteadmin' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ロックおよびロック解除',
+'right-siteadmin' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ロックおよびロック解除',
 'right-override-export-depth' => 'リンク先ページを5階層まで含めて書き出す',
 'right-sendemail' => '他の利用者にメールを送信',
 'right-passwordreset' => 'パスワード再設定メールを閲覧',
@@ -1677,44 +1688,44 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'rightsnone' => '(なし)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92閲覧',
-'action-edit' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92編集',
-'action-createpage' => 'ã\83\9aã\83¼ã\82¸ã\82\92作成',
-'action-createtalk' => 'トークページを作成',
-'action-createaccount' => 'ã\81\93ã\81®å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92作成',
+'action-read' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®閲覧',
+'action-edit' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®編集',
+'action-createpage' => 'ã\83\9aã\83¼ã\82¸ã\81®作成',
+'action-createtalk' => '議論ページの作成',
+'action-createaccount' => 'ã\81\93ã\81®å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®作成',
 'action-minoredit' => '細部の編集の印を付ける',
 'action-move' => 'このページの移動',
-'action-move-subpages' => 'このページと下位ページの移動',
+'action-move-subpages' => 'このページとその下位ページの移動',
 'action-move-rootuserpages' => '利用者ページ本体の移動',
 'action-movefile' => 'このファイルの移動',
-'action-upload' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\82\92アップロード',
-'action-reupload' => 'ã\81\93ã\81®æ\97¢å­\98ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«上書き',
-'action-reupload-shared' => 'å\85±æ\9c\89ã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\81«ã\81\82ã\82\8bã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«上書き',
-'action-upload_by_url' => 'URLからこのファイルをアップロード',
-'action-writeapi' => 'æ\9b¸ã\81\8dè¾¼ã\81¿APIã\82\92使用',
-'action-delete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92削除',
-'action-deleterevision' => 'ã\81\93ã\81®ç\89\88ã\82\92削除',
-'action-deletedhistory' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å\89\8aé\99¤å±¥æ­´ã\82\92表示',
+'action-upload' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
+'action-reupload' => 'ã\81\93ã\81®æ\97¢å­\98ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¸ã\81®上書き',
+'action-reupload-shared' => 'å\85±æ\9c\89ã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\81«ã\81\82ã\82\8bã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¸ã\81®上書き',
+'action-upload_by_url' => 'URL からのこのファイルのアップロード',
+'action-writeapi' => 'æ\9b¸ã\81\8dè¾¼ã\81¿APIã\81®使用',
+'action-delete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®削除',
+'action-deleterevision' => 'ã\81\93ã\81®ç\89\88ã\81®削除',
+'action-deletedhistory' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å\89\8aé\99¤å±¥æ­´ã\81®é\96²è¦§',
 'action-browsearchive' => '削除されたページの検索',
-'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92復帰',
+'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®復帰',
 'action-suppressrevision' => '隠された版の確認と復元',
-'action-suppressionlog' => 'この非公開記録の表示',
-'action-block' => 'ã\81\93ã\81®å\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\82\92ã\83\96ã\83­ã\83\83ã\82¯',
-'action-protect' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\82\92変更',
-'action-rollback' => 'ç\89¹å®\9aã\83\9aã\83¼ã\82¸ã\82\92æ\9c\80å¾\8cã\81«ç·¨é\9b\86ã\81\97ã\81\9få\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\82\92即時巻き戻し',
-'action-import' => 'このページを他のウィキから取り込む',
-'action-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«å\8f\96ã\82\8aè¾¼ã\82\80',
+'action-suppressionlog' => 'この非公開記録の閲覧',
+'action-block' => 'この利用者の編集ブロック',
+'action-protect' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\81®変更',
+'action-rollback' => 'ç\89¹å®\9aã\83\9aã\83¼ã\82¸ã\82\92æ\9c\80å¾\8cã\81«ç·¨é\9b\86ã\81\97ã\81\9få\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\81®即時巻き戻し',
+'action-import' => '他のウィキからのこのページの取り込み',
+'action-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81®ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¸ã\81®å\8f\96ã\82\8aè¾¼ã\81¿',
 'action-patrol' => '他の利用者の編集を巡回済みにする',
 'action-autopatrol' => '自分の編集を巡回済みにする',
-'action-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\82\92表示',
-'action-mergehistory' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å±¥æ­´ã\82\92統合',
-'action-userrights' => '全利用者権限の変更',
-'action-userrights-interwiki' => '他のウィキの利用者の利用者権限変更',
-'action-siteadmin' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ロックまたはロック解除',
-'action-sendemail' => 'ã\83¡ã\83¼ã\83«ã\82\92送信',
+'action-unwatchedpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\81\95ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ä¸\80覧ã\81®é\96²è¦§',
+'action-mergehistory' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å±¥æ­´ã\81®統合',
+'action-userrights' => '全利用者権限の編集',
+'action-userrights-interwiki' => '他のウィキの利用者の利用者権限変更',
+'action-siteadmin' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ロックまたはロック解除',
+'action-sendemail' => 'ã\83¡ã\83¼ã\83«ã\81®送信',
 
 # Recent changes
-'nchanges' => '$1{{PLURAL:$1|回の変更}}',
+'nchanges' => '$1 {{PLURAL:$1|回の変更}}',
 'recentchanges' => '最近の更新',
 'recentchanges-legend' => '最近の更新のオプション',
 'recentchanges-summary' => 'このページでは、このウィキでの最近の更新を確認できます。',
@@ -1757,7 +1768,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'recentchangeslinked-title' => '「$1」と関連する変更',
 'recentchangeslinked-noresult' => '指定期間中に指定ページのリンク先に変更はありませんでした。',
 'recentchangeslinked-summary' => "これは、指定したページからリンクされている(または指定したカテゴリに含まれている)ページへの最近の変更の一覧です。
-[[Special:Watchlist|è\87ªå\88\86ã\81®ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88]]ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81¯'''太å­\97'''ã\81§è¡¨ç¤ºã\81\95ã\82\8cã\81¦ã\81\84ます。",
+[[Special:Watchlist|è\87ªå\88\86ã\81®ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88]]ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81¯'''太å­\97'''ã\81«ã\81ªã\82\8aます。",
 'recentchangeslinked-page' => 'ページ名:',
 'recentchangeslinked-to' => '代わりに、指定したページへのリンク元での変更を表示',
 
@@ -1778,9 +1789,9 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 以前にアップロードされたファイルの表示と検索には[[Special:FileList|{{int:listfiles}}]]を使用し、(再)アップロードは[[Special:Log/upload|アップロード記録]]に、削除は[[Special:Log/delete|削除記録]]にも記録されます。
 
 ページにファイルを入れるには、以下の書式のリンクを使用してください:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:<nowiki>File.jpg]]</nowiki></tt>'''とすると、ファイルが完全なままで使用されます
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:<nowiki>File.png|200px|thumb|left|代替文]]</nowiki></tt>'''とすると、200ピクセルの幅に修正された状態で、左寄せの枠内に、「代替文」が説明として使用されます。
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}:<nowiki>File.ogg]]</nowiki></tt>'''とするとファイルを表示せずに直接ファイルへリンクします",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:<nowiki>File.jpg]]</nowiki></code>'''とすると、ファイルが完全なままで使用されます
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:<nowiki>File.png|200px|thumb|left|代替文]]</nowiki></code>'''とすると、200ピクセルの幅に修正された状態で、左寄せの枠内に、「代替文」が説明として使用されます。
+* '''<code><nowiki>[[</nowiki>{{ns:media}}:<nowiki>File.ogg]]</nowiki></code>'''とするとファイルを表示せずに直接ファイルへリンクします",
 'upload-permitted' => '許可されているファイル形式:$1。',
 'upload-preferred' => '推奨されているファイル形式:$1。',
 'upload-prohibited' => '禁止されているファイル形式:$1。',
@@ -1828,21 +1839,21 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 ファイル名の指定が間違っている可能性があります。
 本当にこのファイルをアップロードしたいのか、確認してください。',
 'windows-nonascii-filename' => 'このwikiではファイル名に特殊文字を使用できません。',
-'fileexists' => "この名前のファイルは既に存在します。置き換えていいかどうか確信が持てない場合は、'''<tt>[[:$1]]</tt>'''を確認してください。
-[[$1|thumb]]",
-'filepageexists' => "このファイルのための説明ページは既に'''<tt>[[:$1]]</tt>'''に作成されていますが、現在、ファイルが存在していません。
+'fileexists' => 'この名前のファイルは既に存在します。置き換えていいかどうか確信が持てない場合は、<strong>[[:$1]]</strong>を確認してください。
+[[$1|thumb]]',
+'filepageexists' => 'このファイルのための説明ページは既に<strong>[[:$1]]</strong>に作成されていますが、現在、ファイルが存在していません。
 入力した概要は説明ページに反映されません。
 新しい概要を表示させるには、説明ページを手動で編集する必要があります。
-[[$1|thumb]]",
-'fileexists-extension' => "類似した名前のファイルが既に存在しています:[[$2|thumb]]
-* アップロード中のファイルの名前:'''<tt>[[:$1]]</tt>'''
-* 既存ファイルの名前:'''<tt>[[:$2]]</tt>'''
-違う名前を選択してください。",
+[[$1|thumb]]',
+'fileexists-extension' => '類似した名前のファイルが既に存在しています:[[$2|thumb]]
+* アップロード中のファイルの名前:<strong>[[:$1]]</strong>
+* 既存ファイルの名前:<strong>[[:$2]]</strong>
+違う名前を選択してください。',
 'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの''(サムネイル)''のようです。
 [[$1|thumb]]
-ファイル'''<tt>[[:$1]]</tt>'''を確認してください。
+ファイル<strong>[[:$1]]</strong>を確認してください。
 確認したファイルが同じ画像の元のサイズの版の場合は、サムネイルを別途アップロードする必要はありません。",
-'file-thumbnail-no' => "ファイル名が'''<tt>$1</tt>'''から始まっています。
+'file-thumbnail-no' => "ファイル名が<strong>$1</strong>から始まっています。
 他の画像から縮小されたもの''(サムネイル)''のようです。
 より高精細な画像をお持ちの場合はそれをアップロードしてください。お持ちではない場合はファイル名を変更してください。",
 'fileexists-forbidden' => 'この名前のファイルは既に存在しており、上書きできません。
@@ -2078,6 +2089,7 @@ $1での[$2 ファイル解説ページ]にある説明を編集したほうが
 'shared-repo' => '共有リポジトリ',
 'shared-repo-name-wikimediacommons' => 'ウィキメディア・コモンズ',
 'filepage.css' => '/* ここに記述したCSSはファイル解説ページにて読み込まれます。また外部のクライアントウィキにも影響します */',
+'upload-disallowed-here' => '残念ながらこの画像には上書きできません。',
 
 # File reversion
 'filerevert' => '$1を差し戻す',
@@ -2112,7 +2124,7 @@ $1での[$2 ファイル解説ページ]にある説明を編集したほうが
 # MIME search
 'mimesearch' => 'MIMEタイプ検索',
 'mimesearch-summary' => 'このページでは、ファイルをMIMEタイプで絞り込みます。
-contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</tt>)。',
+contenttype/subtypeの形式で入力してください(例:<code>image/jpeg</code>)。',
 'mimetype' => 'MIMEタイプ:',
 'download' => 'ダウンロード',
 
@@ -2159,9 +2171,9 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 
 'disambiguations' => '曖昧さ回避ページにリンクしているページ',
 'disambiguationspage' => 'Template:曖昧回避',
-'disambiguations-text' => "以ä¸\8bã\81®ã\83\9aã\83¼ã\82¸ã\81¯'''æ\9b\96æ\98§ã\81\95å\9b\9eé\81¿ã\83\9aã\83¼ã\82¸'''ã\81¸ã\83ªã\83³ã\82¯ã\81\97ã\81¦ã\81\84ます。
\81\93ã\82\8cã\82\89ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ã\80\81ã\82\88ã\82\8aé\81©ã\81\97ã\81\9f主é¡\8cã\81®ã\83\9aã\83¼ã\82¸ã\81¸ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\82\8bã\81¹ã\81\8dã\81§す。<br />
-[[MediaWiki:Disambiguationspage]]からリンクされたテンプレートを使用しているページは、曖昧さ回避ページと見なされます。",
+'disambiguations-text' => "以ä¸\8bã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯'''æ\9b\96æ\98§ã\81\95å\9b\9eé\81¿ã\83\9aã\83¼ã\82¸'''ã\81¸ã\81®ã\83ªã\83³ã\82¯ã\81\8c 1 å\80\8b以ä¸\8aã\81\82ã\82\8aます。
\81\93ã\82\8cã\82\89ã\81®ã\83ªã\83³ã\82¯ã\81¯ã\80\81ã\82\88ã\82\8aé\81©å\88\87ã\81ªã\83\9aã\83¼ã\82¸ã\81¸ã\81®ã\83ªã\83³ã\82¯ã\81«å¤\89æ\9b´ã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾す。<br />
+[[MediaWiki:Disambiguationspage]] にリンクがあるテンプレートを使用しているページを、曖昧さ回避ページと見なします。",
 
 'doubleredirects' => '二重転送',
 'doubleredirectstext' => 'これは他のリダイレクトページへのリダイレクトの一覧です。
@@ -2187,7 +2199,8 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 # Miscellaneous special pages
 'nbytes' => '$1バイト',
 'ncategories' => '$1カテゴリ',
-'nlinks' => '$1個のリンク',
+'ninterwikis' => '$1 {{PLURAL:$1|個のウィキ間リンク}}',
+'nlinks' => '$1 {{PLURAL:$1|個のリンク}}',
 'nmembers' => '$1項目',
 'nrevisions' => '$1版',
 'nviews' => '$1回の閲覧',
@@ -2215,6 +2228,7 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 'mostlinkedtemplates' => '使用箇所の多いテンプレート',
 'mostcategories' => 'カテゴリの多いページ',
 'mostimages' => '被リンク数の多いファイル',
+'mostinterwikis' => 'ウィキ間リンクの多いページ',
 'mostrevisions' => '版の多いページ',
 'prefixindex' => '先頭が同じ全ページ',
 'prefixindex-namespace' => '先頭が同じ全ページ($1名前空間)',
@@ -2230,10 +2244,10 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 'protectedtitles' => '作成保護されているページ名',
 'protectedtitlestext' => '以下のページは新規作成が禁止されています',
 'protectedtitlesempty' => 'これらの引数で現在保護されているページはありません。',
-'listusers' => '利用者一覧',
+'listusers' => '利用者一覧',
 'listusers-editsonly' => '投稿記録のある利用者のみを表示',
 'listusers-creationsort' => '作成日順に並べ替え',
-'usereditcount' => '$1{{PLURAL:$1|回の編集}}',
+'usereditcount' => '$1 {{PLURAL:$1|回の編集}}',
 'usercreated' => '$1 $2 に{{GENDER:$3|作成}}',
 'newpages' => '新しいページ',
 'newpages-username' => '利用者名:',
@@ -2255,8 +2269,9 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 # Book sources
 'booksources' => '書籍情報源',
 'booksources-search-legend' => '書籍情報源を検索',
+'booksources-isbn' => 'ISBN:',
 'booksources-go' => '検索',
-'booksources-text' => '以下は、新古本を販売している外部サイトへのリンクの一覧で、検索中の本について、更に詳しい情報が提供されているかもしれません:',
+'booksources-text' => 'お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:',
 'booksources-invalid-isbn' => '指定したISBN番号は有効ではないようです。情報源から写し間違えていないか確認してください。',
 
 # Special:Log
@@ -2268,6 +2283,7 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 記録の種類、実行した利用者(大文字小文字は区別)、影響を受けたページ(大文字小文字は区別)による絞り込みができます。',
 'logempty' => '該当する記録はありません。',
 'log-title-wildcard' => 'この文字列で始まるページ名を検索',
+'showhideselectedlogentries' => '選択した記録の項目を表示/非表示',
 
 # Special:AllPages
 'allpages' => '全ページ',
@@ -2310,11 +2326,11 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 # Special:LinkSearch
 'linksearch' => '外部リンクの検索',
 'linksearch-pat' => '検索パターン:',
-'linksearch-ns' => '名前空間',
+'linksearch-ns' => '名前空間:',
 'linksearch-ok' => '検索',
 'linksearch-text' => '"*.wikipedia.org" のようにワイルドカードを使用できます。
 少なくとも "*.org" のようなトップレベルドメインが必要です。<br />
-対応プロトコル: <tt>$1</tt> (これらを検索に含めないでください)。',
+対応プロトコル: <code>$1</code> (これらを検索に含めないでください)。',
 'linksearch-line' => '$1 が $2 からリンクされています',
 'linksearch-error' => 'ワイルドカードはホスト名の先頭でのみ使用できます。',
 
@@ -2347,6 +2363,8 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 'listgrouprights-rights' => '権限',
 'listgrouprights-helppage' => 'Help:グループ権限',
 'listgrouprights-members' => '(該当者一覧)',
+'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 (<code>$2</code>)</span>',
+'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 (<code>$2</code>)</span>',
 'listgrouprights-addgroup' => '{{PLURAL:$2|グループ}}を追加:$1',
 'listgrouprights-removegroup' => '{{PLURAL:$2|グループ}}を除去:$1',
 'listgrouprights-addgroup-all' => '全グループを追加可能',
@@ -2360,6 +2378,8 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 'mailnologin' => '送信アドレスがありません',
 'mailnologintext' => '他の利用者宛にメールを送信するためには、[[Special:UserLogin|ログイン]]し、[[Special:Preferences|個人設定]]で有効なメールアドレスを設定する必要があります。',
 'emailuser' => 'この利用者にメールを送信',
+'emailuser-title-target' => 'この{{GENDER:$1|利用者}}にメールを送信',
+'emailuser-title-notarget' => '利用者にメールを送信',
 'emailpage' => '利用者にメールを送信',
 'emailpagetext' => '以下のフォームを使用してこの利用者にメールを送信できます。
 「差出人」として、[[Special:Preferences|利用者の個人設定]]で入力したメールアドレスが設定されます。これにより、受信者があなたに直接返信できるようになります。',
@@ -2385,7 +2405,7 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 'emailccsubject' => '$1に送信したメールの控え:$2',
 'emailsent' => 'メールを送信しました',
 'emailsenttext' => 'メールを送信しました。',
-'emailuserfooter' => 'このメールは {{SITENAME}} の「利用者にメール送信」機能が、「$1」から「$2」に送信したものです。',
+'emailuserfooter' => 'このメールは$1から$2へ、{{SITENAME}}の「利用者にメールを送信」機能でお送りしました。',
 
 # User Messenger
 'usermessage-summary' => 'システムメッセージを残す。',
@@ -2395,7 +2415,7 @@ contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</
 'watchlist' => 'ウォッチリスト',
 'mywatchlist' => 'ウォッチリスト',
 'watchlistfor2' => '利用者: $1 $2',
-'nowatchlist' => 'ウォッチリストに項目がありません。',
+'nowatchlist' => 'ウォッチリストには何も項目がありません。',
 'watchlistanontext' => 'ウォッチリストにある項目を閲覧または編集するには、$1してください。',
 'watchnologin' => 'ログインしていません',
 'watchnologintext' => 'ウォッチリストを変更するためには、[[Special:UserLogin|ログイン]]している必要があります。',
@@ -2505,6 +2525,8 @@ $UNWATCHURL
 'rollback' => '編集を巻き戻し',
 'rollback_short' => '巻き戻し',
 'rollbacklink' => '巻き戻し',
+'rollbacklinkcount' => '$1{{PLURAL:$1|編集}}を巻き戻し',
+'rollbacklinkcount-morethan' => '$1{{PLURAL:$1|編集}}以上を巻き戻し',
 'rollbackfailed' => '巻き戻しに失敗しました',
 'cantrollback' => '編集を差し戻せません。
 最後の投稿者が、このページの唯一の作者です。',
@@ -2514,7 +2536,7 @@ $UNWATCHURL
 このページの最後の編集は[[User:$3|$3]]([[User talk:$3|トーク]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])によるものです。',
 'editcomment' => "編集内容の要約:「''$1''」",
 'revertpage' => '[[Special:Contributions/$2|$2]]([[User talk:$2|トーク]])による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
-'revertpage-nouser' => '(利用者名削除)による編集を[[User:$1|$1]]による最新版へ差し戻しました',
+'revertpage-nouser' => '(利用者名削除)による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
 'rollback-success' => '$1による編集を差し戻しました。
 $2による直前の版へ変更されました。',
 
@@ -2531,7 +2553,7 @@ $2による直前の版へ変更されました。',
 'protectedarticle' => '「[[$1]]」を保護しました',
 'modifiedarticleprotection' => '「[[$1]]」の保護レベルを変更しました',
 'unprotectedarticle' => '「[[$1]]」の保護を解除しました',
-'movedarticleprotection' => '保護の設定を「[[$2]]」から「[[$1]]」へ移動しました',
+'movedarticleprotection' => '保護の設定を「[[$2]]」から「[[$1]]」へ移動しました',
 'protect-title' => '「$1」の保護レベルを変更',
 'protect-title-notallowed' => '「$1」の保護レベルを表示',
 'prot_1movedto2' => '[[$1]] を [[$2]] へ移動',
@@ -2609,7 +2631,7 @@ $2による直前の版へ変更されました。',
 'undeletehistorynoadmin' => 'このページは削除されています。
 削除の理由は、削除前にこのページを編集していた利用者の詳細情報と共に、以下に表示されています。
 管理者以外の利用者には、削除された各版の本文への制限がかけられています。',
-'undelete-revision' => 'ページ「$1」の、$3 が $4 $5 に削除した版:',
+'undelete-revision' => '削除されたページ「$1」の $4 $5 時点での $3 による版:',
 'undeleterevision-missing' => '正しくないまたは存在しない版です。
 間違ったリンクをたどったか、この版は既に復帰されたか、もしくは保存版から除去された可能性があります。',
 'undelete-nodiff' => 'これより前の版はありません。',
@@ -2647,7 +2669,7 @@ $1',
 'undelete-show-file-submit' => 'はい',
 
 # Namespace form on various pages
-'namespace' => '名前空間',
+'namespace' => '名前空間:',
 'invert' => '選択したものを除く',
 'tooltip-invert' => '選択した名前空間(チェックされている場合は、関連付けられた名前空間も)のページの変更を非表示にするには、このボックスにチェックを入れる',
 'namespace_association' => '対応付けられた名前空間',
@@ -2664,7 +2686,7 @@ $1',
 'month' => 'これ以前の月:',
 'year' => 'これ以前の年:',
 
-'sp-contributions-newbies' => '新規利用者の投稿のみ表示',
+'sp-contributions-newbies' => '新しい利用者からの投稿のみ表示',
 'sp-contributions-newbies-sub' => '新規利用者のみ',
 'sp-contributions-newbies-title' => '新規利用者の投稿記録',
 'sp-contributions-blocklog' => 'ブロック記録',
@@ -2791,8 +2813,8 @@ $1のブロックの理由は「''$2''」です。",
 参考のため、ブロックの記録を以下に示します:',
 'blocklog-showsuppresslog' => 'この利用者は以前にブロックされ、隠されたことがあります。
 参考のため、秘匿記録を以下に示します:',
-'blocklogentry' => ' が [[$1]] を$2ブロックしました。ブロックの詳細:$3',
-'reblock-logentry' => ' が [[$1]] のブロック設定を$2に変更しました。ブロックの詳細:$3',
+'blocklogentry' => 'が [[$1]] を$2ブロックしました。ブロックの詳細:$3',
+'reblock-logentry' => 'が [[$1]] のブロック設定を$2に変更しました。ブロックの詳細:$3',
 'blocklogtext' => 'このページは利用者のブロックと解除の記録です。
 自動的にブロックされたIPアドレスは表示されていません。
 現時点で有効なブロックは[[Special:BlockList|ブロックの一覧]]をご覧ください。',
@@ -2823,6 +2845,7 @@ $1のブロックの理由は「''$2''」です。",
 'proxyblockreason' => 'ご使用中のIPアドレスは公開プロキシであるため投稿ブロックされています。
 使用中のインターネットサービスプロバイダー、または所属組織の技術担当者に連絡して、これが深刻なセキュリティ問題であることを伝えてください。',
 'proxyblocksuccess' => '完了。',
+'sorbs' => 'DNSBL',
 'sorbsreason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。',
 'sorbs_create_account_reason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。
 アカウント作成はできません',
@@ -2905,8 +2928,8 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 手動で統合してください。'''",
 'movedto' => '移動先:',
 'movetalk' => '付随するトークページも移動',
-'move-subpages' => '下位ページも移動($1ページまで)',
-'move-talk-subpages' => 'トークページの下位ページも移動($1まで)',
+'move-subpages' => '下位ページも移動($1 件まで)',
+'move-talk-subpages' => 'トークページの下位ページも移動($1 件まで)',
 'movepage-page-exists' => 'ページ「$1」は既に存在するため、自動的な上書きはできませんでした。',
 'movepage-page-moved' => 'ページ「$1」は「$2」に移動しました。',
 'movepage-page-unmoved' => 'ページ「$1」は「$2」に移動できませんでした。',
@@ -2914,7 +2937,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'movelogpage' => '移動記録',
 'movelogpagetext' => '以下はすべてのページ移動の一覧です。',
 'movesubpage' => '{{PLURAL:$1|下位ページ}}',
-'movesubpagetext' => 'このページには{{PLURAL:$1|下位ページ}}が以下の $1 件あります。',
+'movesubpagetext' => 'このページには、以下の $1 {{PLURAL:$1|下位ページ}}があります。',
 'movenosubpage' => 'このページに下位ページはありません。',
 'movereason' => '理由:',
 'revertmove' => '差し戻し',
@@ -2930,7 +2953,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'immobile-target-namespace' => '「$1」名前空間にはページを移動できません',
 'immobile-target-namespace-iw' => 'ウィキ間リンクは、ページの移動先には指定できません。',
 'immobile-source-page' => 'このページは移動できません。',
-'immobile-target-page' => '対象ページ名に移動させることはできません。',
+'immobile-target-page' => '移動先ページ名に移動させることができません。',
 'imagenocrossnamespace' => 'ファイルを、ファイル名前空間以外に移動させることはできません',
 'nonfile-cannot-move-to-file' => 'ファイルではないものを、ファイル名前空間に移動させることはできません',
 'imagetypemismatch' => '新しいファイルの拡張子がファイルのタイプと一致していません',
@@ -2977,12 +3000,12 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 MediaWiki 全般のローカライズ(地域化)に貢献したい場合は、[//www.mediawiki.org/wiki/Localisation/ja MediaWiki のローカライズ] や [//translatewiki.net?setlang=ja translatewiki.net] をご覧ください。',
 'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages'''が無効のため、このページを使用できません。",
 'allmessages-filter-legend' => '絞り込み',
-'allmessages-filter' => '変更状態により絞り込む',
+'allmessages-filter' => '変更状態により絞り込む:',
 'allmessages-filter-unmodified' => '変更なし',
 'allmessages-filter-all' => 'すべて',
 'allmessages-filter-modified' => '変更あり',
-'allmessages-prefix' => '名前の先頭部分で絞り込む',
-'allmessages-language' => '言語',
+'allmessages-prefix' => '名前の先頭部分で絞り込む:',
+'allmessages-language' => '言語:',
 'allmessages-filter-submit' => '表示',
 
 # Thumbnails
@@ -3009,7 +3032,8 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'import-interwiki-history' => 'このページのすべての版を複製する',
 'import-interwiki-templates' => 'すべてのテンプレートを含める',
 'import-interwiki-submit' => '取り込み',
-'import-interwiki-namespace' => '目的の名前空間:',
+'import-interwiki-namespace' => '取り込み先の名前空間:',
+'import-interwiki-rootpage' => '取り込み先のルートページ (省略可能):',
 'import-upload-filename' => 'ファイル名:',
 'import-comment' => 'コメント:',
 'importtext' => '元のウィキで[[Special:Export|書き出し機能]]を使用してファイルに書き出してください。
@@ -3046,6 +3070,9 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'import-error-interwiki' => '名前が外部リンク (interwiki) に予約されているため、ページ「$1」を取り込みませんでした。',
 'import-error-special' => 'ページ「$1」は、ページが許可されない特別名前空間に属しているため取り込みません。',
 'import-error-invalid' => '名前が正しくないため、ページ「$1」を取り込みませんでした。',
+'import-options-wrong' => '間違った{{PLURAL:$2|オプション}}です: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => '入力されたルート ページの名前が無効です。',
+'import-rootpage-nosubpage' => 'ルート ページの名前空間「$1」では、下位ページが許可されていません。',
 
 # Import log
 'importlogpage' => '取り込み記録',
@@ -3092,7 +3119,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'tooltip-ca-unwatch' => 'このページをウォッチリストから除去する',
 'tooltip-search' => '{{SITENAME}}内を検索する',
 'tooltip-search-go' => '厳密に一致する名前のページが存在すれば、そのページへ移動する',
-'tooltip-search-fulltext' => '入力した文字列が含まれるページを検索する',
+'tooltip-search-fulltext' => 'この文字列が含まれるページを探す',
 'tooltip-p-logo' => 'メインページに移動する',
 'tooltip-n-mainpage' => 'メインページに移動する',
 'tooltip-n-mainpage-description' => 'メインページに移動する',
@@ -3114,7 +3141,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'tooltip-ca-nstab-main' => '本文を閲覧',
 'tooltip-ca-nstab-user' => '利用者ページを表示',
 'tooltip-ca-nstab-media' => 'メディアページを表示',
-'tooltip-ca-nstab-special' => 'これは特別ページです。編集できません。',
+'tooltip-ca-nstab-special' => 'ã\81\93ã\82\8cã\81¯ç\89¹å\88¥ã\83\9aã\83¼ã\82¸ã\81§ã\81\99ã\80\82ç·¨é\9b\86ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82',
 'tooltip-ca-nstab-project' => 'プロジェクトページを表示',
 'tooltip-ca-nstab-image' => 'ファイルページを表示',
 'tooltip-ca-nstab-mediawiki' => 'システムメッセージを表示',
@@ -3131,13 +3158,13 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'tooltip-watchlistedit-raw-submit' => 'ウォッチリストを更新する',
 'tooltip-recreate' => '削除されていても、ページを再作成する',
 'tooltip-upload' => 'アップロードを開始する',
-'tooltip-rollback' => '「巻き戻し」は、このページの最後の編集者によるこのページへの編集を1クリックで差し戻します',
-'tooltip-undo' => '「取り消し」はこの編集を差し戻し、編集画面をプレビューを付けて開きます。要約欄に取り消しの理由を追加できます。',
+'tooltip-rollback' => '「巻き戻し」は最後の編集者によるこのページの複数の編集を1クリックで差し戻します',
+'tooltip-undo' => '「取り消し」はこの編集を差し戻し、編集画面をプレビュー付きで開きます。要約欄に理由を追加できます。',
 'tooltip-preferences-save' => '設定を保存する',
 'tooltip-summary' => '短い要約を入力してください',
 
 # Stylesheets
-'common.css' => '/* ここに書いたCSSはすべての外装に反映されます */',
+'common.css' => '/* ここに記述したCSSはすべての外装に反映されます */',
 'standard.css' => '/* ここに記述したCSSはスタンダード外装の利用者に影響します */',
 'nostalgia.css' => '/* ここに記述したCSSはノスタルジア外装の利用者に影響します */',
 'cologneblue.css' => '/* ここに記述したCSSはケルンブルー外装の利用者に影響します */',
@@ -3167,9 +3194,9 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'modern.js' => '/* ここにあるすべてのJavaScriptは、モダン外装を使用している利用者に対して読み込まれます */',
 'vector.js' => '/* ここにあるすべてのJavaScriptは、ベクター外装を使用している利用者に対して読み込まれます */',
 'group-autoconfirmed.js' => '/* ここにあるすべてのJavaScriptは、自動承認された利用者に対して読み込まれます */',
-'group-bot.js' => '/* ここにあるすべてのJavaScriptは、ボットのみに対して読み込まれます */',
-'group-sysop.js' => '/* ここにあるすべてのJavaScriptは、管理者のみに対して読み込まれます */',
-'group-bureaucrat.js' => '/* ここにあるすべてのJavaScriptは、ビューロクラットのみに対して読み込まれます */',
+'group-bot.js' => '/* ここにあるすべてのJavaScriptは、ボットのみに読み込まれます */',
+'group-sysop.js' => '/* ここにあるすべてのJavaScriptは、管理者のみに読み込まれます */',
+'group-bureaucrat.js' => '/* ここにあるすべてのJavaScriptは、ビューロクラットのみに読み込まれます */',
 
 # Metadata
 'notacceptable' => 'ウィキサーバーは、ご使用中のクライアントが読める形式では情報を提供できません。',
@@ -3198,16 +3225,33 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 
 # Info page
 'pageinfo-title' => '「$1」の情報',
-'pageinfo-header-edits' => '編集',
-'pageinfo-header-watchlist' => 'ウォッチリスト',
-'pageinfo-header-views' => '表示',
-'pageinfo-subjectpage' => 'ページ',
-'pageinfo-talkpage' => 'トークページ',
-'pageinfo-watchers' => 'ウォッチリストに入れている利用者数',
-'pageinfo-edits' => '編集回数',
-'pageinfo-authors' => '投稿者数',
+'pageinfo-header-basic' => '基本情報',
+'pageinfo-header-edits' => '編集履歴',
+'pageinfo-header-restrictions' => 'ページの保護',
+'pageinfo-header-properties' => 'ページのプロパティ',
+'pageinfo-display-title' => '表示されるページ名',
+'pageinfo-default-sort' => '既定のソートキー',
+'pageinfo-length' => 'ページの長さ (バイト単位)',
+'pageinfo-article-id' => 'ページ ID',
+'pageinfo-robot-policy' => '検索エンジンの状態',
+'pageinfo-robot-index' => 'インデックス可能',
+'pageinfo-robot-noindex' => 'インデックス不可',
 'pageinfo-views' => '閲覧回数',
-'pageinfo-viewsperedit' => '1編集あたりの閲覧回数',
+'pageinfo-watchers' => 'ページをウォッチリストに入れている人数',
+'pageinfo-redirects-name' => 'このページへのリダイレクト',
+'pageinfo-subpages-name' => 'このページの下位ページ数',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|リダイレクト}}、$3 {{PLURAL:$3|非リダイレクト}})',
+'pageinfo-firstuser' => 'ページ作成者',
+'pageinfo-firsttime' => 'ページの作成日時',
+'pageinfo-lastuser' => '最終編集者',
+'pageinfo-lasttime' => '最終編集日時',
+'pageinfo-edits' => '総編集回数',
+'pageinfo-authors' => '総投稿者数',
+'pageinfo-recent-edits' => '最近の編集回数 (過去 $1)',
+'pageinfo-restriction' => 'ページ保護 (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => 'マジック {{PLURAL:$1|ワード}} ($1)',
+'pageinfo-hidden-categories' => '隠し{{PLURAL:$1|カテゴリ}} ($1)',
+'pageinfo-templates' => '参照読み込みされた{{PLURAL:$1|テンプレート}} ($1)',
 
 # Skin names
 'skinname-standard' => 'クラシック',
@@ -3262,7 +3306,8 @@ $1',
 'file-info-size' => '$1 × $2 ピクセル、ファイルサイズ:$3、MIMEタイプ:$4',
 'file-info-size-pages' => '$1 × $2 ピクセル、ファイルサイズ:$3、MIMEタイプ:$4、$5 {{PLURAL:$5|ページ}}',
 'file-nohires' => '高解像度版はありません。',
-'svg-long-desc' => 'SVG ファイル、$1 × $2 ピクセル、ファイルサイズ:$3',
+'svg-long-desc' => 'SVG ファイル、$1 × $2 ピクセル、ファイルサイズ: $3',
+'svg-long-desc-animated' => 'アニメーション SVG ファイル、$1 × $2 ピクセル、ファイルサイズ: $3',
 'show-big-image' => '高解像度での画像',
 'show-big-image-preview' => 'このプレビューのサイズ:$1。',
 'show-big-image-other' => 'その他の{{PLURAL:$2|解像度}}:$1。',
@@ -3272,6 +3317,8 @@ $1',
 'file-info-png-looped' => '繰り返し',
 'file-info-png-repeat' => '$1 {{PLURAL:$1|回再生しました}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|フレーム}}',
+'file-no-thumb-animation' => "'''注意: 技術的な制限により、このファイルのサムネイルはアニメーションされません。'''",
+'file-no-thumb-animation-gif' => "'''注意: 技術的な制限により、この画像のような高解像度の GIF 画像の、サムネイルはアニメーションされません。'''",
 
 # Special:NewFiles
 'newimages' => '新しいファイルのギャラリー',
@@ -3350,6 +3397,11 @@ Variants for Chinese language
 'variantname-ike-latn' => 'イヌクティトゥット語 (ラテン文字)',
 'variantname-iu' => 'イヌクティトゥット語',
 
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'シルハ語 (ティフィナグ文字)',
+'variantname-shi-latn' => 'シルハ語 (ラテン文字)',
+'variantname-shi' => 'シルハ語',
+
 # Metadata
 'metadata' => 'メタデータ',
 'metadata-help' => 'このファイルには、追加情報があります(おそらく、作成やデジタル化する際に使用したデジタルカメラやスキャナーが追加したものです)。
@@ -3775,10 +3827,10 @@ Variants for Chinese language
 # E-mail address confirmation
 'confirmemail' => 'メールアドレスの確認',
 'confirmemail_noemail' => '[[Special:Preferences|個人設定]]で有効なメールアドレスが指定されていません。',
-'confirmemail_text' => '{{SITENAME}}では、メール機能を利用する前にメールアドレスの確認が必要です。
-以ä¸\8bã\81®ã\83\9cã\82¿ã\83³ã\82\92æ\8a¼ã\81\99ã\81¨ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81«ç¢ºèª\8dã\83¡ã\83¼ã\83«ã\81\8cé\80\81ã\82\89ã\82\8cます。
\83¡ã\83¼ã\83«ã\81«ã\81¯ç¢ºèª\8dç\94¨ã\82³ã\83¼ã\83\89ã\82\92å\90«ã\82\80ã\83ªã\83³ã\82¯ã\81\8cæ\9b¸ã\81\8bã\82\8cã\81¦ã\81\84ます。
\81\9dã\81®ã\83ªã\83³ã\82¯ã\82\92ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81§èª­ã\81¿è¾¼ã\82\93ã\81§ã\80\81ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81®æ­£å½\93æ\80§ã\82\92確èª\8dã\81\97てください。',
+'confirmemail_text' => '{{SITENAME}}では、メール機能を使用する前にメールアドレスの検証が必要です。
+以ä¸\8bã\81®ã\83\9cã\82¿ã\83³ã\82\92æ\8a¼ã\81\99ã\81¨ã\80\81ã\81\82ã\81ªã\81\9fã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81«ç¢ºèª\8dç\94¨ã\83¡ã\83¼ã\83«ã\82\92ã\81\8aé\80\81ã\82\8aã\81\97ます。
\81\9dã\81®ã\83¡ã\83¼ã\83«å\86\85ã\81«ã\80\81確èª\8dç\94¨ã\82³ã\83¼ã\83\89ã\82\92å\90«ã\82\80ã\83ªã\83³ã\82¯ã\81\8cã\81\82ã\82\8aます。
\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81\8cæ\9c\89å\8a¹ã\81§ã\81\82ã\82\8bã\81\93ã\81¨ã\82\92確èª\8dã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ã\81\9dã\81®ã\83ªã\83³ã\82¯ã\82\92ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81§é\96\8bã\81\84てください。',
 'confirmemail_pending' => '確認用コードをメールで既にお送りしました。
 アカウントを作成したばかりの場合は、メールが届くまでしばらくお待ちください。届かない場合は新しいコードを再度申請してください。',
 'confirmemail_send' => '確認用コードをメールで送信',
@@ -3797,10 +3849,10 @@ Variants for Chinese language
 'confirmemail_loggedin' => 'メールアドレスは確認されました。',
 'confirmemail_error' => '確認情報を保存する際にエラーが発生しました。',
 'confirmemail_subject' => '{{SITENAME}} メールアドレスの確認',
-'confirmemail_body' => 'だれかが、IPアドレス$1から、
+'confirmemail_body' => '誰か(おそらくあなた)が、IPアドレス$1から、
 このメールアドレスで{{SITENAME}}のアカウント「$2」を登録しました。
 
\81\93ã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81\8cæ\9c¬å½\93ã\81«è\87ªå\88\86ã\81®ã\82\82ã\81®ã\81§ã\81\82ã\82\8bã\81\8b確èª\8dã\81\97ã\81¦ã\80\81
+このアカウントが本当に自分のものか確認して、
 {{SITENAME}}のメール機能を有効にするには、以下のURLをブラウザーで開いてください:
 
 $3
@@ -3871,7 +3923,7 @@ $5
 'comma-separator' => '、',
 'colon-separator' => ':',
 'pipe-separator' => '&#32;|&#32;',
-'word-separator' => '',
+'word-separator' => '&#32;',
 'parentheses' => '($1)',
 
 # Multipage image navigation
@@ -3888,7 +3940,7 @@ $5
 'table_pager_first' => '最初のページ',
 'table_pager_last' => '最後のページ',
 'table_pager_limit' => '1ページに$1項目を表示',
-'table_pager_limit_label' => 'ページあたりの項目数',
+'table_pager_limit_label' => 'ページあたりの項目数:',
 'table_pager_limit_submit' => '実行',
 'table_pager_empty' => '結果なし',
 
@@ -4072,7 +4124,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 * <span class="mw-specialpagerestricted">制限されている特別ページ</span>',
 'specialpages-group-maintenance' => 'メンテナンス報告',
 'specialpages-group-other' => 'その他の特別ページ',
-'specialpages-group-login' => 'ログイン/利用者登録',
+'specialpages-group-login' => 'ログインまたはアカウント作成',
 'specialpages-group-changes' => '最近の更新と記録',
 'specialpages-group-media' => 'メディア情報とアップロード',
 'specialpages-group-users' => '利用者と権限',
@@ -4088,14 +4140,14 @@ MediaWikiは、有用であることを期待して配布されていますが
 'intentionallyblankpage' => 'このページは意図的に白紙にされています。',
 
 # External image whitelist
-'external_image_whitelist' => '  #ã\81\93ã\81®è¡\8cã\81¯ã\81\9dのままにしておいてください<pre>
+'external_image_whitelist' => '  #ã\81\93ã\81®è¡\8cã\81¯ã\81\93のままにしておいてください<pre>
 #この下に正規表現(//の間に入る記述)を置いてください
 #外部の(ホットリンクされている)画像の URL と一致するか検査されます
 #一致する場合は画像として、一致しない場合は画像へのリンクとして表示されます
 #行の頭に # を付けるとコメントとして扱われます
 #大文字と小文字は区別されません
 
-#æ­£è¦\8f表ç\8f¾ã\81¯ã\81\99ã\81¹ã\81¦ã\81\93ã\81®è¡\8cã\81®ä¸\8aã\81«ç½®ã\81\84ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\93ã\81®è¡\8cã\82\92å¤\89æ\9b´ã\81\97ã\81ªã\81\84ã\81§ください</pre>',
+#æ­£è¦\8f表ç\8f¾ã\81¯ã\81\99ã\81¹ã\81¦ã\81\93ã\81®è¡\8cã\81®ä¸\8aã\81«ç½®ã\81\84ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\93ã\81®è¡\8cã\81¯ã\81\93ã\81®ã\81¾ã\81¾ã\81«ã\81\97ã\81¦ã\81\8aã\81\84ã\81¦ください</pre>',
 
 # Special:Tags
 'tags' => '有効な変更タグ',
@@ -4151,13 +4203,13 @@ MediaWikiは、有用であることを期待して配布されていますが
 # New logging system
 'logentry-delete-delete' => '$1 がページ「$3」を削除しました',
 'logentry-delete-restore' => '$1 がページ「$3」を復帰しました',
-'logentry-delete-event' => '$1が$3の{{PLURAL:$5|記録項目| $5 件の記録項目}}の閲覧レベルを変更しました:$4',
-'logentry-delete-revision' => '$1 がページ「$3」の{{PLURAL:$5|版| $5 個の版}}の閲覧レベルを変更しました:$4',
+'logentry-delete-event' => '$1 が$3の{{PLURAL:$5|$5件の記録項目}}の閲覧レベルを変更しました:$4',
+'logentry-delete-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを変更しました:$4',
 'logentry-delete-event-legacy' => '$1 が「$3」の記録項目の閲覧レベルを変更しました',
 'logentry-delete-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを変更しました',
 'logentry-suppress-delete' => '$1 がページ「$3」を隠蔽しました',
-'logentry-suppress-event' => '$1 が「$3」の{{PLURAL:$5|記録項目| $5 件の記録項目}}の閲覧レベルを見えない形で変更しました:$4',
-'logentry-suppress-revision' => '$1 がページ「$3」の{{PLURAL:$5|版| $5 個の版}}の閲覧レベルを見えない形で変更しました:$4',
+'logentry-suppress-event' => '$1 が$3の{{PLURAL:$5|$5件の記録項目}}の閲覧レベルを見えない形で変更しました:$4',
+'logentry-suppress-revision' => '$1 がページ「$3」の{{PLURAL:$5|$5版}}の閲覧レベルを見えない形で変更しました:$4',
 'logentry-suppress-event-legacy' => '$1 が$3で記録項目の閲覧レベルを見えない形で変更しました',
 'logentry-suppress-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを見えない形で変更しました',
 'revdelete-content-hid' => '本文の不可視化',
@@ -4176,8 +4228,8 @@ MediaWikiは、有用であることを期待して配布されていますが
 'logentry-patrol-patrol-auto' => '$1 が自動的にページ「$3」の版 $4 をパトロール済みとしました',
 'logentry-newusers-newusers' => '$1 が利用者アカウントを作成しました',
 'logentry-newusers-create' => '$1 が利用者アカウントを作成しました',
-'logentry-newusers-create2' => '$1 が利用者アカウント「$3」を作成しました',
-'logentry-newusers-autocreate' => 'アカウント「$1」が自動的に作成されました',
+'logentry-newusers-create2' => '$1 が利用者アカウント $3 を作成しました',
+'logentry-newusers-autocreate' => 'アカウント $1 が自動的に作成されました',
 'newuserlog-byemail' => 'パスワードをメールでお送りしました',
 
 # Feedback
@@ -4207,9 +4259,12 @@ MediaWikiは、有用であることを期待して配布されていますが
 'api-error-empty-file' => '送信されたファイルは空でした。',
 'api-error-emptypage' => '内容がないページの新規作成は許可されていません。',
 'api-error-fetchfileerror' => '内部エラー:ファイルの取得中に問題が発生しました。',
+'api-error-fileexists-forbidden' => '「$1」という名前のファイルは存在しており、上書きはできません。',
+'api-error-fileexists-shared-forbidden' => '「$1」という名前のファイルは共有ファイルリポジトリに存在しており、上書きはできません。',
 'api-error-file-too-large' => '送信されたファイルは大きすぎます。',
 'api-error-filename-tooshort' => 'ファイル名が短すぎます。',
 'api-error-filetype-banned' => 'この形式のファイルは禁止されています。',
+'api-error-filetype-banned-type' => '$1{{PLURAL:$4|は許可されていないファイル形式です}}。許可されている{{PLURAL:$3|ファイル形式}}は$2です。',
 'api-error-filetype-missing' => 'ファイルに拡張子がありません。',
 'api-error-hookaborted' => '拡張機能のフックによって、修正が中断されました。',
 'api-error-http' => '内部エラー:サービスへの接続で問題が発生しました。',
index 2f6704b..017297f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Jutish (Jysk)
+/** Jutish (jysk)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -602,7 +602,7 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre 
 'linksearch-pat' => 'Søĝ æfter links til:',
 'linksearch-ns' => 'Navnerum:',
 'linksearch-ok' => 'Søĝ',
-'linksearch-text' => 'Wildkårter søm "*.wikipedia.org" ken benyttes.<br />Understøttede pråtåkoller: <tt>$1</tt>',
+'linksearch-text' => 'Wildkårter søm "*.wikipedia.org" ken benyttes.<br />Understøttede pråtåkoller: <code>$1</code>',
 'linksearch-line' => '$2 linker til $1',
 'linksearch-error' => "Wildkårter må ken benyttes i'n stårt åf håstnavnet.",
 
index 2aa66fb..62ae858 100644 (file)
@@ -11,6 +11,7 @@
  * @author Helix84
  * @author Kaganer
  * @author Meursault2004
+ * @author NoiX180
  * @author Pras
  * @author Rex
  * @author StefanusRA
@@ -54,7 +55,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Delikna suntingan sing wis dipatroli ing kaca owah-owahan',
 'tog-newpageshidepatrolled' => 'Delikna kaca sing wis dipatroli saka daftar kaca anyar',
 'tog-extendwatchlist' => 'Kembangna daftar pangawasan kanggo nuduhaké kabèh pangowahan, ora mung sing paling anyar',
-'tog-usenewrc' => 'Gunakna tampilan pangowahan pungkasan sing wis dikembangake (mbutuhake JavaScript)',
+'tog-usenewrc' => 'Owah-owahané paguyuban miturut kaca nèng owah-owahan anyar lan daptar panto (mbutuhaké JavaScript)',
 'tog-numberheadings' => 'Wènèhana nomer judul secara otomatis',
 'tog-showtoolbar' => 'Tuduhna <em>toolbar</em> (batang piranti) panyuntingan',
 'tog-editondblclick' => 'Sunting kaca nganggo klik ping loro (JavaScript)',
@@ -62,17 +63,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Fungsèkna panyuntingan sub-bagian mawa klik-tengen ing judul bagian (JavaScript)',
 'tog-showtoc' => 'Tuduhna daftar isi (kanggo kaca sing nduwé luwih saka 3 sub-bagian)',
 'tog-rememberpassword' => 'Émut tembung sandi kula ing peramban punika (salebeting $1 {{PLURAL:$1|dinten|dinten}})',
-'tog-watchcreations' => 'Tambahna kaca sing tak-gawé ing daftar pangawasan',
-'tog-watchdefault' => 'Tambahna kaca sing tak-sunting ing daftar pangawasan',
-'tog-watchmoves' => 'Tambahkan kaca sing tak-pindhah ing daftar pangawasan',
-'tog-watchdeletion' => 'Tambahkan kaca sing tak-busak ing daftar pangawasan',
+'tog-watchcreations' => 'Tambahaké kaca sing tak gawé lan berkas sing tak unggah nèng daptar pangawasan',
+'tog-watchdefault' => 'Tambahaké kaca lan berkas sing tak sunting nèng daptar pangawasan',
+'tog-watchmoves' => 'Tambahaké kaca lan berkas sing tak pindhahaké nèng daptar pangawasan',
+'tog-watchdeletion' => 'Tambahaké kaca lan berkas sing tak busak nèng daptar pangawasan',
 'tog-minordefault' => 'Tandhanana kabèh suntingan dadi suntingan cilik secara baku',
 'tog-previewontop' => 'Tuduhna pratayang sadurungé kothak sunting lan ora sawisé',
 'tog-previewonfirst' => 'Tuduhna pratayang ing suntingan kapisan',
 'tog-nocache' => 'Nonaktifaken penyinggahan kaca peramban',
-'tog-enotifwatchlistpages' => 'Kirimana aku layang e-mail yèn ana sawijining kaca sing tak-awasi owah',
+'tog-enotifwatchlistpages' => 'Kirimi kula layang èlèktronik yèn ana kaca utawa berkas nèng daptar pangawasanku sing diowah',
 'tog-enotifusertalkpages' => 'Kirimana aku layang e-mail yèn kaca dhiskusiku owah',
-'tog-enotifminoredits' => 'Kirimana aku layang e-mail uga yèn ana pangowahan cilik',
+'tog-enotifminoredits' => 'Kirimi kula layang èlèktronik uga yèn ana suntingan cilik saka kaca lan berkas',
 'tog-enotifrevealaddr' => 'Kirimana aku layang e-mail ing layang notifikasi',
 'tog-shownumberswatching' => 'Tuduhna cacahé pangawas',
 'tog-oldsig' => 'Tapak asma sing ana:',
@@ -90,7 +91,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ngumpetaké suntingan panganggo sing mlebu log seka daftar pangawasan',
 'tog-watchlisthideanons' => 'Ngumpetaké suntingan panganggo anonim seka daftar pangawasan',
 'tog-watchlisthidepatrolled' => 'Delikna suntingan sing wis dipatroli saka daftar pangawasan',
-'tog-nolangconversion' => 'Patènana konvèrsi varian',
 'tog-ccmeonemails' => 'Kirimana aku salinan layang e-mail sing tak-kirimaké menyang wong liya',
 'tog-diffonly' => 'Aja dituduhaké isi kaca ing ngisor bédané suntingan',
 'tog-showhiddencats' => 'Tuduhna kategori sing didelikaké',
@@ -313,6 +313,10 @@ $1',
 'youhavenewmessages' => 'Panjenengan kagungan $1 ($2).',
 'newmessageslink' => 'warta énggal',
 'newmessagesdifflink' => 'mirsani bédané saka révisi sadurungé',
+'youhavenewmessagesfromusers' => 'Sampéyan nduwé $1 saka  {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).',
+'youhavenewmessagesmanyusers' => 'Sampéyang nduwé $1 saka akèh panganggo ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|layang anyar|layang anyar}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|owahan|owahan}} pungkasan',
 'youhavenewmessagesmulti' => 'Panjenengan olèh pesen-pesen anyar $1',
 'editsection' => 'sunting',
 'editold' => 'sunting',
@@ -336,6 +340,8 @@ $1',
 'page-rss-feed' => "\"\$1\" ''RSS Feed''",
 'page-atom-feed' => "\"\$1\" ''Atom Feed''",
 'red-link-title' => '$1 (kaca durung ana)',
+'sort-descending' => 'Urutaké medhun',
+'sort-ascending' => 'Urutaké munggah',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Artikel',
@@ -395,18 +401,23 @@ Yèn dudu iki panyebabé, panjenengan manawa bisa nemokaké kasalahan (''bug'')
 'badarticleerror' => 'Pratingkah iku ora bisa katindhakaké ing kaca iki.',
 'cannotdelete' => 'Kaca utawa berkas "$1" ora bisa dibusak.
 Manawa wis dibusak déning wong liya.',
+'cannotdelete-title' => 'Ora bisa mbusak kaca "$1"',
+'delete-hook-aborted' => "Pambusakan dibatalaké déning ''hook''.
+Ora ana alesané.",
 'badtitle' => 'Judhulé ora sah',
 'badtitletext' => 'Judhul kaca sing panjenengan ora bisa dituduhaké, kosong, utawa dadi judhul antar-basa utawa judhul antar-wiki. Iku bisa uga ana  sawijining utawa luwih aksara sing ora bisa didadèkaké judhul.',
-'perfcached' => 'Data iki dijupuk saka <em>cache</em> lan mbokmenawa dudu data pungkasan. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Data iki dijupuk saka <em>cache</em>, lan dianyaraké ing pungkasan ing $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Data iki mung dijupuk saka papan singgahan lan mungkin ora kaanyaran. Maksimum {{PLURAL:$1|sak asil|$1 asil}} sumadhiya nèng papan singgahan.',
+'perfcachedts' => 'Data iki mung dijupuk saka papan singgahan lan mungkin dianyari pungkasan $1. Maksimum {{PLURAL:$4|sak asil|$4 asil}} sumadhiya nèng papan singgahan.',
 'querypage-no-updates' => 'Update saka kaca iki lagi dipatèni. Data sing ana ing kéné saiki ora bisa bakal dibalèni unggah manèh.',
 'wrong_wfQuery_params' => 'Parameter salah menyang wfQuery()<br />Fungsi: $1<br />Panyuwunan: $2',
 'viewsource' => 'Tuduhna sumber',
+'viewsource-title' => 'Delok sumberé $1',
 'actionthrottled' => 'Tindakan diwatesi',
 'actionthrottledtext' => 'Minangka sawijining pepesthèn anti-spam, panjenengan diwatesi nglakoni tindhakan iki sing cacahé kakèhan ing wektu cendhak.
 Mangga dicoba manèh ing sawetara menit.',
 'protectedpagetext' => 'Kaca iki dikunci supaya ora disunting.',
 'viewsourcetext' => 'Panjenengan bisa mirsani utawa nulad sumber kaca iki:',
+'viewyourtext' => "Sampéyan bisa ndelok lan nyalin sumber '''suntingan Sampéyan''' nèng kaca iki:",
 'protectedinterface' => 'Kaca iki isiné tèks antarmuka sing dienggo software lan wis dikunci kanggo menghindari kasalahan.',
 'editinginterface' => "'''Pènget:''' Panjenengan nyunting kaca sing dianggo nyedyakaké tèks antarmuka kanggo piranti alus.
 Pangowahan kaca iki bakal awèh pangaruh marang tampilan antarmuka panganggo kanggoné panganggo liya.
@@ -415,9 +426,18 @@ Kanggo terjemahan, mangga nganggo [//translatewiki.net/wiki/Main_Page?setlang=en
 'cascadeprotected' => 'Kaca iki wis direksa saka panyuntingan amerga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} ngisor iki sing wis direksa mawa opsi "runtun" diaktifaké:
 $2',
 'namespaceprotected' => "Panjenengan ora kagungan idin kanggo nyunting kaca ing bilik nama '''$1'''.",
+'customcssprotected' => 'Sampéyan ora dililakaké nyunting kaca CSS iki amarga kaisi pangaturan pribadi saka panganggo liya.',
+'customjsprotected' => 'Sampéyan ora dililakaké nyunting kaca JavaScript iki amarga kaisi pangaturan pribadi saka panganggo liya.',
 'ns-specialprotected' => 'Kaca ing bilik nama astaméwa utawa kusus, ora bisa disunting.',
 'titleprotected' => "Irah-irahan iki direksa ora olèh digawé déning [[User:$1|$1]].
 Alesané yaiku ''$2''.",
+'filereadonlyerror' => 'Ora bisa ngowah berkas "$1" amarga panyimpenan berkas "$2" ana ing mode mung-bisa-diwaca.
+
+Pangurus sing ngopèni kuwi ngawedharaké: "$3".',
+'invalidtitle-knownnamespace' => 'Irah-irahan ora sah mawa bilik jeneng "$2" lan tèks "$3"',
+'invalidtitle-unknownnamespace' => 'Judhul ora sah mawa angka $1 lan tèks "$2" bilik jeneng sing ora dingertèni',
+'exception-nologin' => 'Durung mlebu log',
+'exception-nologin-text' => 'Kaca utawa kelakon iki mbutuhaké mlebu log nèng wiki iki dhisik.',
 
 # Virus scanner
 'virus-badscanner' => "Kasalahan konfigurasi: pamindai virus ora dikenal: ''$1''",
@@ -425,10 +445,11 @@ Alesané yaiku ''$2''.",
 'virus-unknownscanner' => 'Antivirus ora ditepungi:',
 
 # Login and logout pages
-'logouttext' => "'''Panjenengan sampun medal (oncat) saking sistem.'''
+'logouttext' => "'''Sampéyan wis metu log'''
+
+Sampéyan bisa nganggo {{SITENAME}} sacara anonim, utawa bisa [[Special:UserLogin|mlebu log manèh]] kanthi jeneng panganggo sing padha utawa beda.
 
-Panjenengan saged migunakaken {{SITENAME}} kanthi anonim, utawi panjenengan saged [[Special:UserLogin|mlebet malih]] minangka pangangge ingkang sami utawi pangangge sanes.
-Supados dipunmangertosi bilih wonten kaca ingkang nedahaken manawi panjenengan taksih mlebet log ngantos panjenengan mbusak singgahan ing panjelajah web panjenengan.",
+Cathet yèn sapérangan kaca mungkin isih nampilaké tulisan yèn Sampéyan isih nèng njero log, kuwi bisa ilang yèn Sampéyan ngresiki ''cache'' pramban Sampéyan.",
 'welcomecreation' => '== Sugeng rawuh, $1! ==
 
 Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.',
@@ -438,6 +459,7 @@ Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|pr
 'remembermypassword' => 'Émut tembung sandi kula (salebeting $1 {{PLURAL:$1|dinten|dinten}})',
 'securelogin-stick-https' => 'Tetep kahubung dhumateng HTTPS sasampunipun mlebet log',
 'yourdomainname' => 'Dhomain panjenengan',
+'password-change-forbidden' => 'Sampéyan ora bisa ngganti tembung sandhi nèng wiki iki.',
 'externaldberror' => 'Ana kasalahan otèntikasi basis dhata èksternal utawa panjenengan ora pareng nglakoni pemutakhiran marang akun èksternal panjenengan.',
 'login' => 'Mlebu log',
 'nav-login-createaccount' => 'Log mlebu / nggawé rékening (akun)',
@@ -452,11 +474,12 @@ Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|pr
 'createaccount' => 'Nggawé akun anyar',
 'gotaccount' => "Wis kagungan akun? '''$1'''.",
 'gotaccountlink' => 'Mlebu',
+'userlogin-resetlink' => 'Lali rincian mlebu log Sampéyan?',
 'createaccountmail' => 'liwat layang e-mail',
 'createaccountreason' => 'Alesan:',
 'badretype' => 'Sandhi panjenengan ora gathuk',
-'userexists' => 'Asma panganggo sing panjenengan pilih wis kanggo.
-Mangga pilih asma liyané.',
+'userexists' => 'Jeneng panganggo sing dilebokaké lagi dianggo.
+Mangga pilih jeneng liya.',
 'loginerror' => 'Kasalahan mlebu log',
 'createaccounterror' => 'Ora bisa nyipta akun: $1',
 'nocookiesnew' => "Rékening utawa akun panganggo panjenengan wis digawé, nanging panjenengan durung mlebu log. {{SITENAME}} nggunakaké ''cookies'' kanggo  log panganggo. ''Cookies'' ing panjlajah wèb panjengengan dipatèni. Mangga diaktifaké lan mlebu log manèh mawa jeneng panganggo lan tembung sandhi panjenengan.",
@@ -497,6 +520,8 @@ Amarga saka kuwi., tamu kanthi alamat IP iki ora bisa gawé akun manèh kanggo s
 'noemailprefs' => 'Panjenengan kudu milih alamat e-mail supaya bisa nganggo fitur iki.',
 'emailconfirmlink' => 'Ndhedhes (konfirmasi) alamat e-mail panjenengan',
 'invalidemailaddress' => 'Alamat e-mail iki ora bisa ditampa amarga formaté ora bener. Tulung lebokna alamat mawa format sing bener utawa kosongaké waé isèn kasebut.',
+'cannotchangeemail' => 'Alamat layang èlèktronik akun ora bisa diganti nèng wiki iki.',
+'emaildisabled' => 'Situs iki ora bisa ngirim layang èlèktronik.',
 'accountcreated' => 'Akun wis kacipta.',
 'accountcreatedtext' => 'Akun kanggo $1 wis kacipta.',
 'createaccount-title' => 'Gawé rékening kanggo {{SITENAME}}',
@@ -506,9 +531,14 @@ Panjenengan bisa nglirwakaké pesen iki yèn akun utawa rékening iki digawé d
 'usernamehasherror' => 'Jeneng panganggo ora bisa ngandhut tandha pager',
 'login-throttled' => 'Panjenengan wis kakèhan njajal mlebu log.
 Tulung nunggu dhisik sadurungé njajal manèh.',
+'login-abort-generic' => 'Sampéyan ora suksès mlebu log - Dibatalaké',
 'loginlanguagelabel' => 'Basa: $1',
 'suspicious-userlogout' => 'Panjaluk panjenengan supaya metu ditolak amarga katoné panjlajah internt utawa proksi panyinggah.',
 
+# E-mail sending
+'php-mail-error-unknown' => 'Kasalahan ora dingertèni nèng piguna mail() PHP.',
+'user-mail-no-addy' => 'Njajal ngirim layang èlèktronik tanpa alamat layang èlèktronik.',
+
 # Change password dialog
 'resetpass' => 'Ganti tembung sandi',
 'resetpass_announce' => 'Panjenengan wis mlebu log mawa kodhe sementara sing dikirim mawa e-mail. Menawa kersa nglanjutaké, panjenengan kudu milih tembung sandhi anyar ing kéné:',
@@ -528,7 +558,33 @@ Panjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi saunta
 'resetpass-temp-password' => 'Tembung sandi sauntara:',
 
 # Special:PasswordReset
+'passwordreset' => 'Balèni setèl tembung sandhi',
+'passwordreset-text' => 'Ganepi pormulir iki kanggo nampa pangéling layang èlèktronik kanggo rincian akun Sampéyan.',
+'passwordreset-legend' => 'Balèni setèl tembung sandhi',
+'passwordreset-disabled' => 'Piranti kanggo mbalèni nyetèl tembung sandhi dipatèni nèng wiki iki.',
+'passwordreset-pretext' => '{{PLURAL:$1||Lebokaké siji bagéyan data ngisor iki}}',
 'passwordreset-username' => 'Jeneng panganggo:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Delok layang èlèktronik sing diasilaké?',
+'passwordreset-capture-help' => 'Yèn Sampéyan nyentang kothak iki, layang èlèktronik (mawa tembung sandhi sawetara) bakal ditampilaké nèng Sampéyan lan uga dikirim nèng panganggo.',
+'passwordreset-email' => 'Alamat layang èlèktronik:',
+'passwordreset-emailtitle' => 'Rincian akun nèng {{SITENAME}}',
+'passwordreset-emailelement' => 'Jeneng panganggo: $1
+Tembung sandhi sawetara: $2',
+'passwordreset-emailsent' => 'Layang èlèktronik pangèling wis dikirim.',
+'passwordreset-emailsent-capture' => 'Layang èlèktronik pangèling wis dikirim kaya ngisor iki.',
+'passwordreset-emailerror-capture' => 'Layang èlèktronik pangèling ditampilaké nèng ngisor iki, nanging ora kasil dikirim: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Ganti alamat layang èlèktronik',
+'changeemail-header' => 'Ganti alamat layang èlèktronik akun',
+'changeemail-text' => 'Rampungaké pormulir iki kanggo ngganti alamat layang èlèktronik Sampéyan. Sampéyan bakal butuh nglebokaké tembung sandhi Sampéyan kanggo pepesthèn owahan kuwi.',
+'changeemail-no-info' => 'Sampéyan kudu mlebu log kanggo ngaksès kaca iki langsung.',
+'changeemail-oldemail' => 'Alamat layang èlèktronik saiki:',
+'changeemail-newemail' => 'Alamat layang èlèktronik anyar:',
+'changeemail-none' => '(ora ana)',
+'changeemail-submit' => 'Ganti layang èlèktronik',
+'changeemail-cancel' => 'Batal',
 
 # Edit page toolbar
 'bold_sample' => 'Tèks iki bakal dicithak kandel',
@@ -561,9 +617,11 @@ Panjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi saunta
 'showlivepreview' => 'Pratayang langsung',
 'showdiff' => 'Tuduhna pangowahan',
 'anoneditwarning' => 'Panjenengan ora kadaftar mlebu. Alamat IP panjenengan bakal kacathet ing sajarah panyuntingan kaca iki.',
+'anonpreviewwarning' => "''Sampéyan durung mlebu log. Nyimpen bakal nyathet alamat IP Sampéyan nèng riwayat sunting kaca iki.''",
 'missingsummary' => "'''Pènget:''' Panjenengan ora nglebokaké ringkesan panyuntingan. Menawa panjenengan mencèt tombol Simpen manèh, suntingan panjenengan bakal kasimpen tanpa ringkesan panyuntingan.",
 'missingcommenttext' => 'Tulung lebokna komentar ing ngisor iki.',
-'missingcommentheader' => "'''Pènget:''' Panjenengan durung mènèhi subyèk utawa judhul kanggo komentar panjenengan. Menawa panjenengan mencèt Simpan, suntingan panjenengan bakal kasimpen tanpa komentar iku.",
+'missingcommentheader' => "'''Pangéling:''' Sampéyan durung nyadhiyakaké judhul/jejer kanggo tanggepan iki.
+Yèn Sampéyan klik \"{{int:savearticle}}\" manèh, suntingan Sampéyan bakal kasimpen tanpa kuwi.",
 'summary-preview' => 'Pratayang ringkesan:',
 'subject-preview' => 'Pratayang subyèk/judhul:',
 'blockedtitle' => 'Panganggo diblokir',
@@ -615,6 +673,13 @@ Yèn ora sengaja tekan kéné, bisa ngeklik pencètan '''back''' waé ing panjla
 'anontalkpagetext' => "---- ''Iki yaiku kaca dhiskusi sawijining panganggo anonim sing durung kagungan akun utawa ora nganggo akuné, dadi kita keeksa kudu nganggo alamat IP-né kanggo nepangi. Alamat IP kaya mengkéné iki bisa dienggo déning panganggo sing séjé-séjé. Yèn panjenengan pancèn panganggo anonim lan olèh komentar-komentar miring, mangga [[Special:UserLogin/signup|nggawé akun]] utawa [[Special:UserLogin|log mlebu]] supaya ora rancu karo panganggo anonim liyané ing mangsa ngarep.''",
 'noarticletext' => 'Saiki ora ana tèks ing kaca iki. Panjenengan bisa [[Special:Search/{{PAGENAME}}|nglakoni panggolèkan kanggo judhul iki kaca iki]] ing kaca-kaca liyané, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|kaca={{urlencode:{{FULLPAGENAME}}}}}} nggolèki log kagandhèng],
 utawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} nyunting kaca iki]</span>.',
+'noarticletext-nopermission' => 'Saiki ora ana tèks ing kaca iki. 
+Sampéyan bisa [[Special:Search/{{PAGENAME}}|nggolèki judhul kaca iki]] nèng kaca liya, 
+utawa <span class="plainlinks">[{{fullurl:{{#Special:Log}}|kaca={{urlencode:{{FULLPAGENAME}}}}}} nggolèki log sing kaitan].',
+'missing-revision' => 'Benahan #$1 saka kaca ajeneng "{{PAGENAME}}" ora ana.
+
+Iki biasané kasebabaké pranala riwayat sing kedaluwarsa saka kaca kuwi wis dibusak.
+Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].',
 'userpage-userdoesnotexist' => 'Akun utawa rékening panganggo "<nowiki>$1</nowiki>" ora kadaftar.',
 'userpage-userdoesnotexist-view' => 'Panganggo "$1" ora kadhaptar.',
 'blocked-notice-logextract' => 'Panganggo iki saiki lagi diblokir.
@@ -625,10 +690,16 @@ Log pamblokiran pungkasan dituduhaké ing ngisor iki minangka bahan rujukan:',
 'usercsspreview' => "'''Pèngeten yèn panjenengan namung mirsani pratilik CSS panjenengan.''''
 '''Pratilik iku durung kasimpen!'''",
 'userjspreview' => "'''Pèngeten yèn sing panjenengan pirsani namung pratilik JavaScript panjenengan, lan menawa pratilik iku dèrèng kasimpen!'''",
+'sitecsspreview' => "'''Èling yèn Sampéyan mung ndelok pratayang CSS iki.'''
+'''Iki durung disimpen!'''",
+'sitejspreview' => "'''Èling yèn Sampéyan mung ndelok pratayang kodhé JavaScript iki.'''
+'''Iki durung disimpen!'''",
 'userinvalidcssjstitle' => "'''Pènget:''' Kulit \"\$1\" ora ditemokaké. Muga dipèngeti yèn kaca .css lan .js nggunakaké huruf cilik, conto {{ns:user}}:Foo/vector.css lan dudu {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Dianyari)',
 'note' => "'''Cathetan:'''",
-'previewnote' => "'''Mugi dipun-gatosaken bilih punika nembé awujud pratilik kémawon, dèrèng kasimpen!'''",
+'previewnote' => "'''Èling yèn Sampéyan mung ndelok pratayang.'''
+Owahan Sampéyan durung kasimpen!",
+'continue-editing' => 'Banjuraké nyunting',
 'previewconflict' => 'Pratilik iki nuduhaké tèks ing bagian dhuwur kothak suntingan tèks kayadéné bakal katon yèn panjenengan bakal simpen.',
 'session_fail_preview' => "'''Nuwun sèwu, suntingan panjenengan ora bisa diolah amarga dhata sèsi kabusak.
 Coba kirim dhata manèh. Yèn tetep ora bisa, coba log metua lan mlebu log manèh.''''''Amerga wiki iki marengaké panggunan kodhe HTML mentah, mula pratilik didhelikaké minangka pancegahan marang serangan JavaScript.'''
@@ -640,6 +711,7 @@ Yèn isih tetep ora kasil, cobanen metu log lan mlebu manèh.'''",
 
 '''Yèn iki sawijining upaya suntingan sing absah, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
 'token_suffix_mismatch' => "'''Suntingan panjenengan ditulak amerga aplikasi klièn panjenengan ngowahi karakter tandha wewacan ing suntingan. Suntingan iku ditulak kanggo untuk menggak kaluputan ing tèks artikel. Prekara iki kadhangkala dumadi yèn panjenengan ngangem dines layanan proxy anonim adhedhasar situs wèb sing duwé masalah.'''",
+'edit_form_incomplete' => "'''Sebagéyan pormulir suntingan ora tekan nèng sasana; cèk pindho yèn suntingan Sampéyan isih wutuh lan jajal manèh.'''",
 'editing' => 'Nyunting $1',
 'creating' => 'Nggawé $1',
 'editingsection' => 'Nyunting $1 (bagian)',
@@ -659,7 +731,8 @@ Panjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks sing wis
 Menawa panjenengan ora kersa menawa tulisan panjenengan bakal disunting karo disebar, aja didokok ing kéné.<br />
 Panjenengan uga janji menawa apa-apa sing katulis ing kéné, iku karyané panjenengan dhéwé, utawa disalin saka sumber bébas. '''AJA NDOKOK KARYA SING DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
 'copyrightwarning2' => "Mangga digatèkaké yèn kabèh kontribusi marang  {{SITENAME}} bisa disunting, diowahi, utawa dibusak déning penyumbang liyané. Yèn panjenengan ora kersa yèn tulisan panjenengan bisa disunting wong liya, aja ngirim artikel panjenengan ing kéné.<br />Panjenengan uga janji yèn tulisan panjenengan iku kasil karya panjenengan dhéwé, utawa disalin saka sumber umum utawa sumber bébas liyané (mangga delengen $1 kanggo informasi sabanjuré). '''AJA NGIRIM KARYA SING DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
-'longpageerror' => "'''KALUPUTAN: Tèks sing panjenengan kirim gedhéné $1 kilobita, sing tegesé luwih gedhé tinimbang cacah maksimum $2 kilobita. Tèks iki ora bisa disimpen.'''",
+'longpageerror' => "'''Kasalahan: Tèks sing Sampéyan lebokaké dawané {{PLURAL:$1|sak kilobita|$1 kilobita}}, luwih dawa saka maksimal {{PLURAL:$2|sak kilobita|$2 kilobita}}.'''
+Kuwi ora bisa disimpen.",
 'readonlywarning' => "'''PÈNGET: Basis data lagi dikunci amerga ana pangopènan, dadi saiki panjenengan ora bisa nyimpen kasil panyuntingan panjenengan. Panjenengan mbokmenawa prelu mindhahaké kasil panyuntingan panjenengan iki menyang panggonan liya kanggo disimpen bésuk.'''
 
 Pangurus sing ngunci basis data mènèhi katrangan kaya mengkéné: $1",
@@ -680,6 +753,7 @@ Entri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
 'nocreatetitle' => 'Panggawéan kaca anyar diwatesi',
 'nocreatetext' => 'Situs iki ngwatesi kemampuan kanggo nggawé kaca anyar. Panjenengan bisa bali lan nyunting kaca sing wis ana, utawa mangga [[Special:UserLogin|mlebua log utawa ndaftar]]',
 'nocreate-loggedin' => 'Panjenengan ora kagungan idin kanggo nggawé kaca anyar.',
+'sectioneditnotsupported-title' => 'Panyuntingan bagéyan ora kasengkuyungan',
 'sectioneditnotsupported-text' => 'Panyuntingan sapérangan ora disengkuyung ing kaca suntingan iki.',
 'permissionserrors' => 'Kaluputan Idin Aksès',
 'permissionserrorstext' => 'Panjengan ora kagungan idin kanggo nglakoni sing panjenengan gayuh amerga {{PLURAL:$1|alesan|alesan-alesan}} iki:',
@@ -699,6 +773,7 @@ Katoné kaca iki wis dibusak.',
 'edit-no-change' => 'Suntingan panjenengan dilirwakaké amerga panjenengan ora nglakoni pangowahan apa-apa ing tèks.',
 'edit-already-exists' => 'Ora bisa nggawé kaca anyar.
 Amerga wis ana.',
+'defaultmessagetext' => 'Tèks layang gawan',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Pènget: Kaca iki ngandhut kakèhan panggunan fungsi ''parser'' sing larang.
@@ -712,6 +787,12 @@ Sawetara cithakan bakal dilirwakaké.',
 'post-expand-template-argument-category' => 'Kaca-kaca kanthi argumèn cithakan sing dilirwakaké',
 'parser-template-loop-warning' => "Ana ''loop'' cithakan: [[$1]]",
 'parser-template-recursion-depth-warning' => "Wates ''recursion depth'' cithakan wis ngliwati ($1)",
+'language-converter-depth-warning' => 'Wates jeroné pangganti basa wis kapunjulen ($1)',
+'node-count-exceeded-category' => 'Kaca sing itungan-nodéné wis punjul',
+'node-count-exceeded-warning' => 'Kaca munjuli itungan-nodé',
+'expansion-depth-exceeded-category' => 'Kaca sing jeroné èkspansi wis punjul',
+'expansion-depth-exceeded-warning' => 'Kaca munculi jeroné èkspansi',
+'converter-manual-rule-error' => 'Kasalahan kadètèk nèng aturan pangubahan basa manual',
 
 # "Undo" feature
 'undo-success' => 'Suntingan iki bisa dibatalaké. Tulung priksa prabandhingan ing ngisor iki kanggo mesthèkaké yèn prakara iki pancèn sing bener panjenengan pèngin lakoni, banjur simpenen pangowahan iku kanggo ngrampungaké pambatalan suntingan.',
@@ -742,6 +823,7 @@ Alesané miturut $3 yaiku ''$2''",
 'page_last' => 'pungkasan',
 'histlegend' => "Pilihen rong tombol radhio banjur pencèten tombol ''bandhingna'' kanggo mbandhingaké versi. Klik sawijining tanggal kanggo ndeleng versi kaca ing tanggal iku.<br />(skr) = prabédan karo vèrsi saiki, (akir) = prabédan karo vèrsi sadurungé, '''s''' = suntingan sithik, '''b''' = suntingan bot, → = suntingan bagian, ← = ringkesan otomatis",
 'history-fieldset-title' => 'Njlajah sajarah vèrsi sadhurungé',
+'history-show-deleted' => 'Namung sing dibusak',
 'histfirst' => 'Suwé dhéwé',
 'histlast' => 'Anyar dhéwé',
 'historysize' => '($1 {{PLURAL:$1|bita|bita}})',
@@ -754,26 +836,35 @@ Alesané miturut $3 yaiku ''$2''",
 'history-feed-empty' => 'Kaca sing disuwun ora ditemokaké. Mbokmenawa wis dibusak saka wiki, utawa diwènèhi jeneng anyar. Coba [[Special:Search|golèka ing wiki]] kanggo kaca anyar sing rélevan.',
 
 # Revision deletion
-'rev-deleted-comment' => '(komentar dibusak)',
+'rev-deleted-comment' => '(ringkesan suntingan dibusak)',
 'rev-deleted-user' => '(jeneng panganggo dibusak)',
 'rev-deleted-event' => '(isi dibusak)',
+'rev-deleted-user-contribs' => '(jeneng panganggo utawa alamat IP dibusak - suntingan didhelikaké saka kontribusi)',
 'rev-deleted-text-permission' => "Révisi kaca iki wis '''dibusak'''.
 Princèné mbokmanawa kasedyakaké ing  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-'rev-deleted-text-unhide' => "Révisi kaca iki wis '''dibusak''',
-Princèné mbokmanawa ana ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].
-Minangka pangurus panjenengan isih bisa [$1 mirsani révisi iki] yèn panjenengan arep nerusaké.",
-'rev-suppressed-text-unhide' => 'Révisi kaca iki wis "dipenet".
-Princèné mbokmanawa ana ing [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log penetan].
-Minangka pangurus, panjenengan isih bisa [$1 mirsani révisi iki] yèn kersa.',
-'rev-deleted-text-view' => "Révisi kaca iki wis '''dibusak'''.
-Minangka sawijning pangurus, panjenengan bisa mirsani; princèné mbokmanawa kasedyakaké ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-'rev-suppressed-text-view' => 'Révisi kaca iki wis "dipenet".
-Minangka pangurus, panjenengan isih bisa mirsani; princèné mbokmanawa isih ana ing [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log penetan].',
+'rev-deleted-text-unhide' => "Benahan kaca iki wis '''dibusak'''.
+Rincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].
+Sampéyan uga isih bisa [$1 ndelok benahan iki] yèn Sampéyan gelem.",
+'rev-suppressed-text-unhide' => "Benahan kaca iki wis '''dibrèdèl'''.
+Rincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].
+Sampéyan uga isih bisa [$1 ndelok benahan iki] yèn Sampéyan gelem.",
+'rev-deleted-text-view' => "Benahan kaca iki wis '''dibusak'''.
+Sampéyan bisa ndelok iki; rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
+'rev-suppressed-text-view' => "Benahan kaca iki wis '''dibrèdèl'''.
+Sampéyan bisa ndelok iki; rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].",
 'rev-deleted-no-diff' => "Panjenengan ora bisa mirsani prabédan amarga siji saka révisiné wis '''dibusak'''.
 Pricèné mbokmanawa isih ana ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-'rev-deleted-unhide-diff' => "Salah siji révisi ing tampilan prabédan iki wis '''dibusak'''.
-Princèné mbokmanawa ana ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].
-Minangka pangurus, panjenengan isih bisa [$1 mirsani prabédan iki] yèn panjenengan kersa.",
+'rev-suppressed-no-diff' => "Sampéyan ora bisa ndelok prabédan iki amarga sawiji benahan wis '''dibusak'''.",
+'rev-deleted-unhide-diff' => "Sawiji benahan saka prabédan iki wis '''dibusak'''.
+Rincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].
+Sampéyan uga isih bisa [$1 ndelok prabédan iki] yèn Sampéyan gelem.",
+'rev-suppressed-unhide-diff' => "Sawiji benahan saka prabédan iki wis '''dibrèdèl'''.
+Rincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].
+Sampéyan uga isih bisa [$1 ndelok prabédan iki] yèn Sampéyan gelem.",
+'rev-deleted-diff-view' => "Sawiji benahan saka prabédan iki wis '''dibusak'''.
+Sampéyan isih bisa ndelok prabédan iki; rincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
+'rev-suppressed-diff-view' => "Sawiji benahan saka prabédan iki wis '''dibrèdèl'''.
+Sampéyan isih bisa ndelok prabédan iki; rincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].",
 'rev-delundel' => 'tuduhna/delikna',
 'rev-showdeleted' => 'tuduhna',
 'revisiondelete' => 'Busak/batal busak revisi',
@@ -790,6 +881,7 @@ Minangka pangurus, panjenengan isih bisa [$1 mirsani prabédan iki] yèn panjene
 'logdelete-selected' => "'''{{PLURAL:$1|Log kapilih|Log kapilih}} kanggo:'''",
 'revdelete-text' => "'''Revisi lan tindhakan sing wis kabusak bakal tetep muncul ing kaca versi sadurungé lan log, nanging bagéyan isiné ora bisa diaksès déning publik.'''
 Pangurus {{SITENAME}} liyané bakal tetep bisa ngaksès isi sing kadhelikaké iku lan bisa mbatalaké pambusakan ngliwati antarmuka sing padha, kajaba ana pawatesan liya saka operator situs.",
+'revdelete-confirm' => 'Mangga pesthèkaké yèn Sampéyan pancèn kudu nglakoni iki, yèn Sampéyan ngerti akibaté, lan yèn Sampéyan ngakoni iki cocok karo [[{{MediaWiki:Policy-url}}|kawicakan]].',
 'revdelete-suppress-text' => "Pandhelikan révisi '''mung''' bisa dipigunakaké kanggo kasus ing ngisor:
 * Informasi pribadi sing kurang pantes
 *: ''alamat omah lan nomer telepon, nomer kartu idhèntitas, lan sapanunggalané.''",
@@ -807,13 +899,15 @@ Pangurus {{SITENAME}} liyané bakal tetep bisa ngaksès isi sing kadhelikaké ik
 'revdelete-unsuppress' => 'Busak watesan ing revisi sing dibalèkaké',
 'revdelete-log' => 'Alesan:',
 'revdelete-submit' => 'Trapna ing {{PLURAL:$1|révisi|révisi}} kapilih',
-'revdelete-success' => 'Aturan pandhelikan revisi bisa kasil ditrapaké.',
-'revdelete-failure' => "'''Mode tampilan révisi ora bisa disèt:'''
+'revdelete-success' => "'''Kawujudan repisi sukses dianyari.'''",
+'revdelete-failure' => "'''Panampakan rèvisi ora bisa dianyari:'''
 $1",
 'logdelete-success' => 'Aturan pandhelikan tindhakan bisa kasil ditrapaké.',
 'logdelete-failure' => "'''Aturan pandhelikan ora bisa disèt:'''
 $1",
 'revdel-restore' => 'Ngowahi visiblitas (pangatonan)',
+'revdel-restore-deleted' => 'revisi kabusak',
+'revdel-restore-visible' => 'revisi kétok',
 'pagehist' => 'Sajarah kaca',
 'deletedhist' => 'Sajarah sing dibusak',
 'revdelete-hide-current' => 'Gagal ndhelikaké révisi tanggal $2, $1: iki arupa révisi paling anyar.
@@ -826,7 +920,11 @@ Panjenengan ora nduwèni aksès menyang révisi iki.',
 'revdelete-no-change' => "'''Pènget:''' révisi tanggal $1, jam $2 wis nduwèni aturan pandhelikan kasebut.",
 'revdelete-concurrent-change' => 'Gagal ngowahi révisi tanggal $1, jam $2: statusé mbokmanawa wis diowahi déning panganggo liya bebarengan karo panjenengan.
 Mangga priksa cathetan log.',
-'revdelete-only-restricted' => 'Panjenengan ora bisa ndhelikaké révisi-révisi iki saka pangurus tanpa milih uga salah siji opsi pandhelikan liyané.',
+'revdelete-only-restricted' => 'Ora bisa ndhelikaké siji barang mawa tanggal $1 wanci $2: Sampéyan ora bisa ndhelikaké barang kuwi saka pangurus tanpa milih salah sawiji pilihan kanggo ndhelikaké sing liyané.',
+'revdelete-reason-dropdown' => '*Alesan mbusak sing umum
+** Planggaran hak cipta
+** Inpormasi pribadi sing ora patut
+** Inpormasi sing potènsial ngrusak martabat',
 'revdelete-otherreason' => 'Alesan liya/tambahan:',
 'revdelete-reasonotherlist' => 'Alesan liya',
 'revdelete-edit-reasonlist' => 'Sunting alesan pambusakan',
@@ -834,7 +932,8 @@ Mangga priksa cathetan log.',
 
 # Suppression log
 'suppressionlog' => "Log barang-barang sing didelikaké (''oversight'')",
-'suppressionlogtext' => "Ing ngisor iki kapacak daftar pambusakan lan pamblokiran pungkasan sing uga nyangkut isi sing didelikaké saka para opsis. Mangga mirsani [[Special:IPBlockList|daftar pamblokiran IP]] kanggo daftar pambuwangan (''ban'') lan pamblokiran sing saiki lagi operasional.",
+'suppressionlogtext' => 'Ngisor iki daptar apa-apa waé sing wis dibusak lan diblokir kalebu kontèn sing didhelikaké saka para pangurus.
+Delok [[Special:BlockList|daptar blokiran]] sing isiné daptar apa-apa waé sing lagi dilarang lan diblokir.',
 
 # History merging
 'mergehistory' => 'Gabung sejarah kaca',
@@ -867,13 +966,20 @@ Gunakna tombol radio kanggo nggabungaké révisi-révisi sing digawé sadurungé
 'mergelogpagetext' => 'Ing ngisor iki kapacak daftar panggabungan sajarah kaca ing kaca liyané.',
 
 # Diffs
-'history-title' => 'Sajarah revisi saka "$1"',
+'history-title' => 'Riwayat rèvisi saka "$1"',
 'difference-title' => '$1: Bèntenipun revisi',
+'difference-title-multipage' => 'Prabédhan antara kaca "$1" lan "$2"',
+'difference-multipage' => '(Prabédhan antar kaca)',
 'lineno' => 'Larikan $1:',
 'compareselectedversions' => 'Bandhingna vèrsi kapilih',
 'showhideselectedversions' => 'Tampilaké/dhelikaké révisi kapilih',
 'editundo' => 'batalna',
-'diff-multi' => '({{PLURAL:$1|Sawiji|$1}} revisi antara sing ora dituduhaké.)',
+'diff-multi' => '({{PLURAL:$1Siji rèvisi sedhengan|$1 rèvisi sedhengan}} déning {{PLURAL:$2|sak panganggo|$2 panganggo}} ora dituduhaké)',
+'diff-multi-manyusers' => '({{PLURAL:$1Siji rèvisi sedhengan|$1 rèvisi sedhengan}} déning luwih saka $2 {{PLURAL:$2|panganggo|panganggo}} ora dituduhaké)',
+'difference-missing-revision' => '{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.
+
+Iki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.
+Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].',
 
 # Search results
 'searchresults' => 'Kasil panggolèkan',
@@ -908,6 +1014,7 @@ Gunakna tombol radio kanggo nggabungaké révisi-révisi sing digawé sadurungé
 'searchprofile-everything-tooltip' => 'Panggolèkan kabèh isi (klebu kaca-kaca wicara)',
 'searchprofile-advanced-tooltip' => "Panggolèkan ing bilik jeneng biasa (''custom'')",
 'search-result-size' => '$1 ({{PLURAL:$2|1 tembung|$2 tembung}})',
+'search-result-category-size' => '{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})',
 'search-result-score' => 'Relevansi: $1%',
 'search-redirect' => '(pangalihan $1)',
 'search-section' => '(sèksi $1)',
@@ -945,6 +1052,7 @@ Gunakna tombol radio kanggo nggabungaké révisi-révisi sing digawé sadurungé
 'qbsettings-fixedright' => 'Tetep sisih tengen',
 'qbsettings-floatingleft' => 'Ngambang sisih kiwa',
 'qbsettings-floatingright' => 'Ngambang sisih tengen',
+'qbsettings-directionality' => 'Wis pesthi, gumantung saka wujud skrip basané Sampéyan',
 
 # Preferences page
 'preferences' => 'Preferensi (pilihan)',
@@ -956,17 +1064,22 @@ Gunakna tombol radio kanggo nggabungaké révisi-révisi sing digawé sadurungé
 'prefs-skin' => 'Kulit',
 'skin-preview' => 'Pratilik',
 'datedefault' => 'Ora ana préferènsi',
+'prefs-beta' => 'Piranti béta',
 'prefs-datetime' => 'Tanggal lan wektu',
+'prefs-labs' => 'Piranti lab',
+'prefs-user-pages' => 'Kaca panganggo',
 'prefs-personal' => 'Profil panganggo',
 'prefs-rc' => 'Owah-owahan pungkasan',
 'prefs-watchlist' => 'Dhaftar pangawasan',
 'prefs-watchlist-days' => 'Cacahé dina sing dituduhaké ing dhaftar pangawasan:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|dina|dina}}',
 'prefs-watchlist-edits' => 'Cacahé suntingan maksimum sing dituduhaké ing dhaftar pangawasan sing luwih jangkep:',
 'prefs-watchlist-edits-max' => 'Gunggung maksimum: 1000',
 'prefs-watchlist-token' => 'Token pantauan:',
 'prefs-misc' => 'Liya-liya',
 'prefs-resetpass' => 'Ganti tembung sandi',
+'prefs-changeemail' => 'Ganti alamat layang èlèktronik',
+'prefs-setemail' => 'Setèl alamat layang èlèktronik',
 'prefs-email' => 'Opsi layang-e',
 'prefs-rendering' => 'Tampilan',
 'saveprefs' => 'Simpen',
@@ -979,6 +1092,7 @@ Gunakna tombol radio kanggo nggabungaké révisi-révisi sing digawé sadurungé
 'searchresultshead' => 'Panggolèkan',
 'resultsperpage' => 'Cacahing klik saben kaca:',
 'stub-threshold' => 'Ambang wates kanggo format <a href="#" class="stub">pranala rintisan</a>:',
+'stub-threshold-disabled' => 'Dipatèni',
 'recentchangesdays' => 'Cacahé dina sing dituduhaké ing owah-owahan pungkasan:',
 'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dina|dina}})',
 'recentchangescount' => 'Cacahé suntingan sing ditampilaké:',
@@ -989,7 +1103,7 @@ Iki aji acak sing bisa panjenengan gunakaké: $1',
 'savedprefs' => 'Préferènsi Panjenengan wis disimpen',
 'timezonelegend' => 'Zona wektu:',
 'localtime' => 'Wektu saenggon:',
-'timezoneuseserverdefault' => 'Gunakna standar server',
+'timezoneuseserverdefault' => 'Anggo gawan wiki ($1)',
 'timezoneuseoffset' => 'Liya (jelasna prabédan)',
 'timezoneoffset' => 'Prabédan¹:',
 'servertime' => 'Wektu server:',
@@ -1012,6 +1126,7 @@ Iki aji acak sing bisa panjenengan gunakaké: $1',
 'prefs-files' => 'Berkas',
 'prefs-custom-css' => 'CSS pribadi',
 'prefs-custom-js' => 'JS pribadi',
+'prefs-common-css-js' => 'CSS/JS didumaké kanggo kabèh kulit:',
 'prefs-reset-intro' => 'Panjenengan bisa migunakaké kaca iki kanggo mbalèkaké préferensi panjenengan marang setèlan baku situs.
 Pembalikan ora bisa dibatalaké.',
 'prefs-emailconfirm-label' => 'Konfirmasi layang-e:',
@@ -1023,7 +1138,8 @@ Pembalikan ora bisa dibatalaké.',
 'prefs-registration' => 'Wektu régistrasi:',
 'yourrealname' => 'Asma sajatiné :',
 'yourlanguage' => 'Basa sing dianggo:',
-'yourvariant' => 'Varian basa',
+'yourvariant' => 'Werna basa isi:',
+'prefs-help-variant' => 'Varian utawa ortograpi sing Sampéyan pilih kanggo nampilaké kaca kontèn saka wiki iki.',
 'yournick' => 'Asma sesinglon/samaran (kagem tapak asta):',
 'prefs-help-signature' => 'Komentar ing kaca wicara kudu ditapak astani nganggo "<nowiki>~~~~</nowiki>" sing bakal dikonvèrsi dadi tapak asta panjenengan lan tanggal wektu.',
 'badsig' => 'Tapak astanipun klèntu; cèk rambu HTML.',
@@ -1037,8 +1153,9 @@ Aja luwih saka {{PLURAL:$1|karakter|karakter}}.',
 Informasi iki bakal kabuka kanggo publik.',
 'email' => 'Layang élèktronik (E-mail)',
 'prefs-help-realname' => '* <strong>Asma asli</strong> (ora wajib): menawa panjenengan maringi, asma asli panjenengan bakal digunakaké kanggo mènèhi akrédhitasi kanggo kasil karya tulis panjenengan.',
-'prefs-help-email' => 'Layang-e (ora wajib), nanging sawanci-wanci panjenengan lali tembung sandi, bisa dikirimi liwat layang-e kasebut.
-Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng panganggo utawa kaca wicara panjenengan tanpa perlu nuduhaké idhèntitas panjenengan.',
+'prefs-help-email' => 'Alamat layang èlèktronik sipaté mung pilihan, nanging dibutuhaké kanggo nyetèl ulang tembung sandhi yèn Sampéyan lali.',
+'prefs-help-email-others' => 'Sampéyan uga bisa milih kanggo ngidinaké wong liya ngubungi Sampéyan liwat layang èlèktronik sing ana ing kaca panganggo utawa kaca guneman.
+Alamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi Sampéyan.',
 'prefs-help-email-required' => 'Alamat layang-e dibutuhaké.',
 'prefs-info' => 'Informasi dhasar',
 'prefs-i18n' => 'Internasionalisasi',
@@ -1055,15 +1172,20 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'prefs-displaywatchlist' => 'Opsi tampilan',
 'prefs-diffs' => 'Prabédan',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Alamat layang èlèktronik kayané sah',
+'email-address-validity-invalid' => 'Lebokaké alamat layang èlèktronik sing sah',
+
 # User rights
 'userrights' => 'Manajemen hak panganggo',
 'userrights-lookup-user' => 'Ngatur kelompok panganggo',
 'userrights-user-editname' => 'Lebokna jeneng panganggo:',
 'editusergroup' => 'Sunting kelompok panganggo',
-'editinguser' => "Ngowahi hak-hak aksès panganggo saka panganggo '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Ngganti hak panganggo '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Sunting kelompok panganggo',
 'saveusergroups' => 'Simpen kelompok panganggo',
 'userrights-groupsmember' => 'Anggota saka:',
+'userrights-groupsmember-auto' => 'Anggota implisit saka:',
 'userrights-groups-help' => 'Panjenengan bisa ngowahi grup-grup sing ana panganggoné iki.
 * Kothak sing dicenthang tegesé panganggo iki ana sajroné grup iku.
 * Kothak sing ora dicenthang tegesé panganggo iku ora ana ing grup iku.
@@ -1072,7 +1194,7 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'userrights-no-interwiki' => 'Panjenengan ora ana hak kanggo ngowahi hak panganggo ing wiki liyané.',
 'userrights-nodatabase' => 'Basis data $1 ora ana utawa ora lokal.',
 'userrights-nologin' => 'Panjenengan kudu [[Special:UserLogin|mlebu log]] mawa nganggo akun utawa rékening pangurus supaya bisa ngowahi hak panganggo.',
-'userrights-notallowed' => 'Panjenengan ora ndarbèni hak kanggo ngowahi hak panganggo.',
+'userrights-notallowed' => 'Akun Sampéyan ora nduwé idin kanggo nambah utawa nyuda hak-hak panganggo.',
 'userrights-changeable-col' => 'Grup sing bisa panjenengan owahi',
 'userrights-unchangeable-col' => 'Grup sing ora bisa diowahi panjenengan',
 
@@ -1086,12 +1208,12 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'group-suppress' => "Para pangawas (''oversight'')",
 'group-all' => '(kabèh)',
 
-'group-user-member' => 'Panganggo',
-'group-autoconfirmed-member' => 'Panganggo sing otomatis didhedhes (dikonfirmasi)',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Pangurus',
-'group-bureaucrat-member' => 'Birokrat',
-'group-suppress-member' => "Pangawas (''oversight'')",
+'group-user-member' => '{{GENDER:$1|panganggo}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|panganggo dipesthèni otomatis}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|pangurus}}',
+'group-bureaucrat-member' => '{{GENDER:$1|birokrat}}',
+'group-suppress-member' => '{{GENDER:$1|pangawasan}}',
 
 'grouppage-user' => '{{ns:project}}:Para panganggo',
 'grouppage-autoconfirmed' => '{{ns:project}}:Panganggo sing otomatis didhedhes (dikonfirmasi)',
@@ -1125,8 +1247,10 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'right-writeapi' => 'Migunakaké API panulisan',
 'right-delete' => 'Busak kaca-kaca',
 'right-bigdelete' => 'Busak kaca-kaca mawa sajarah panyuntingan sing gedhé',
+'right-deletelogentry' => 'Busak lan batalaké mbusak isi log spésipik',
 'right-deleterevision' => 'Busak lan batal busak révisi tartamtu kaca-kaca',
 'right-deletedhistory' => 'Ndeleng sajarah èntri-èntri kabusak, tanpa bisa ndeleng apa sing dibusak',
+'right-deletedtext' => 'Delok tèks kabusak lan panggantèn antara rèpisi kabusak',
 'right-browsearchive' => 'Golèk kaca-kaca sing wis dibusak',
 'right-undelete' => 'Batal busak sawijining kaca',
 'right-suppressrevision' => 'Ndeleng lan mbalèkaké révisi-révisi sing didelikaké saka para opsis',
@@ -1136,6 +1260,7 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'right-hideuser' => 'Blokir jeneng panganggo, lan delikna saka umum',
 'right-ipblock-exempt' => 'Bypass pamblokiran IP, pamblokiran otomatis lan pamblokiran rangkéan',
 'right-proxyunbannable' => 'Bypass pamblokiran otomatis proxy-proxy',
+'right-unblockself' => 'Bukak blokirané dhéwéké',
 'right-protect' => 'Ganti tingkatan pangreksan lan sunting kaca-kaca sing direksa',
 'right-editprotected' => 'Sunting kaca-kaca sing direksa (tanpa pangreksan runtun)',
 'right-editinterface' => 'Sunting interface (antarmuka) panganggo',
@@ -1157,11 +1282,13 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'right-siteadmin' => 'Kunci lan buka kunci basis data',
 'right-override-export-depth' => "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
 'right-sendemail' => 'Ngirim layang listrik (e-mail) menyang panganggo liya',
+'right-passwordreset' => 'Delok layang èlèktronik panyetèlulangan tembung sandhi',
 
 # User rights log
 'rightslog' => 'Log pangowahan hak aksès',
 'rightslogtext' => 'Ing ngisor iki kapacak log pangowahan marang hak-hak panganggo.',
 'rightslogentry' => 'ngganti kaanggotan kelompok kanggo $1 saka $2 dadi $3',
+'rightslogentry-autopromote' => 'otomatis ditawakaké saka $2 nèng $3',
 'rightsnone' => '(ora ana)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1189,6 +1316,7 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'action-suppressionlog' => 'mirsani log pribadi iki',
 'action-block' => 'blok panganggo iki saka panyuntingan',
 'action-protect' => 'owahi tataran pangreksan kaca iki',
+'action-rollback' => 'gelis mbalèkaké suntingané panganggo pungkasan nèng sawijining saca',
 'action-import' => 'impor kaca iki saka wiki liya',
 'action-importupload' => 'impor kaca iki saka pamunggahan berkas',
 'action-patrol' => 'nandhani suntingan panganggo liya minangka wis kapriksa',
@@ -1198,6 +1326,7 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'action-userrights' => 'ngowahi kabèh hak panganggo',
 'action-userrights-interwiki' => 'ngowahi hak aksès saka panganggo ing wiki liya',
 'action-siteadmin' => 'ngunci utawa mbukak kunci basis data',
+'action-sendemail' => 'kirim layang èlèktronik',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|pangowahan|owah-owahan}}',
@@ -1229,9 +1358,11 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|cacahé sing ngawasi|cacahé sing ngawasi}}]',
 'rc_categories' => 'Watesana nganti kategori (dipisah karo "|")',
 'rc_categories_any' => 'Apa waé',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bita|bita}} sakwisé diowah',
 'newsectionsummary' => '/* $1 */ bagéyan anyar',
 'rc-enhanced-expand' => 'Tuduhaké princèn (merlokaké JavaScript)',
 'rc-enhanced-hide' => 'Dhelikaké princèn',
+'rc-old-title' => 'wigatiné digawé minangka "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Pranala Pilihan',
@@ -1247,18 +1378,22 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'upload' => 'Unggah',
 'uploadbtn' => 'Unggahna berkas',
 'reuploaddesc' => 'Bali ing formulir pamotan',
+'upload-tryagain' => 'Kirim déskripsi berkas sing wis diowah',
 'uploadnologin' => 'Durung mlebu log',
 'uploadnologintext' => 'Panjenengan kudu [[Special:UserLogin|mlebu log]] supaya olèh ngunggahaké gambar utawa berkas liyané.',
 'upload_directory_missing' => 'Direktori pamunggahan ($1) ora ditemokaké lan ora bisa digawé déning server wèb.',
 'upload_directory_read_only' => 'Dirèktori pangunggahan ($1) ora bisa ditulis déning server wèb.',
 'uploaderror' => 'Kaluputan pangunggahan berkas',
+'upload-recreate-warning' => "'''Pèngetan: Berkas mawa jeneng kuwi wis dibusak utawa disingkiraké.'''
+
+Log pambusakan lan panyingkiran saka kaca iki sumadhiya nèng kéné:",
 'uploadtext' => "Anggé formulir ing ngandhap punika kanggé nginggahaké gambar.
 Kanggé mirsani utawi madosi gambar ingkang sampun dipununggah sakdèrèngipun pigunakaken [[Special:FileList|dhaftar berkas sing wis diunggah]], gambar ingkang dipununggah ulang ugi kadhaftar ing [[Special:Log/upload|log pangunggahan]], pambusakan ing [[Special:Log/delete|Log pambusakan]].
 
 Kanggé nyertakaken gambar ing satunggiling kaca, pigunakaken pranala salah setunggal saking format ing ngandhap punika:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></tt>''' kanggé migunakaken versi pepak gambar
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|tèks alt]]</nowiki></tt>''' kanggé migunakaken gambar wiyaripun 200 piksel ing kothak ing sisih kiwa kanthi 'tèks alt' minangka panjelasan
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></tt>''' kanggé nggandhèng langsung dhumateng gambar tanpi nampilaké gambar",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code>''' kanggé migunakaken versi pepak gambar
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|tèks alt]]</nowiki></code>''' kanggé migunakaken gambar wiyaripun 200 piksel ing kothak ing sisih kiwa kanthi 'tèks alt' minangka panjelasan
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' kanggé nggandhèng langsung dhumateng gambar tanpi nampilaké gambar",
 'upload-permitted' => 'Jenis berkas sing diidinaké: $1.',
 'upload-preferred' => 'Jenis berkas sing disaranaké: $1.',
 'upload-prohibited' => 'Jenis berkas sing dilarang: $1.',
@@ -1277,29 +1412,43 @@ Mangga mirsani [[Special:NewFiles|galeri berkas-berkas anyar]] kanggo pratélan
 'ignorewarnings' => 'Lirwakna pèngetan apa waé',
 'minlength1' => 'Jeneng berkas paling ora minimal kudu awujud saaksara.',
 'illegalfilename' => 'Jeneng berkas "$1" ngandhut aksara sing ora diparengaké ana sajroning irah-irahan kaca. Mangga owahana jeneng berkas iku lan cobanen  diunggahaké manèh.',
+'filename-toolong' => 'Jeneng berkas ora olèh luwih dawa saka 240 bita.',
 'badfilename' => 'Berkas wis diowahi dados "$1".',
+'filetype-mime-mismatch' => 'Èkstènsi berkas ".$1" ora cocok karo jinis MIME sing kadètèk saka berkas ($2).',
 'filetype-badmime' => 'Berkas mawa tipe MIME "$1" ora pareng diunggahaké.',
 'filetype-bad-ie-mime' => 'Ora bisa ngunggahaké berkas iki amarga Internet Explorer ndhétèksi minangka "$1", sing ora diidinaké lan minangka tipe berkas sing nduwèni potènsi mbebayani.',
 'filetype-unwanted-type' => "'''\".\$1\"''' klebu jenis berkas sing ora diidinaké.
 Luwih becik {{PLURAL:\$3|jinis berkas|Jinis-jinis berkas}} \$2.",
-'filetype-banned-type' => "'''\".\$1\"''' kalebu jenis berkas sing ora diidinaké.
-{{PLURAL:\$3|Jinis berkas sing|Jinis-jinis berkas sing}} diidinaké yaiku \$2.",
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|dudu jinis berkas sing dililakaké|dudu jinis berkas sing dililakaké}}.
+{{PLURAL:$3|Berkas|Berkas}} sing dililakaké $2.',
 'filetype-missing' => 'Berkas ini ora duwé ekstènsi (contoné ".jpg").',
+'empty-file' => 'Berkas sing Sampéyan kirim kosong.',
+'file-too-large' => 'Berkas sing Sampéyan kirim kagedhèn.',
+'filename-tooshort' => 'Jeneng berkas kacendhèken.',
+'filetype-banned' => 'Jinis berkas iki dilarang.',
+'verification-error' => 'Berkas iki ora lulus pangesahan.',
+'hookaborted' => 'Pangowahan sing Sampéyan coba dibatalaké déning èkstènsi.',
+'illegal-filename' => 'Jeneng berkas ora dililakaké.',
+'overwrite' => 'Nibani berkas sing wis ana ora dililakaké.',
+'unknown-error' => 'Ana masalah sing ora dingertèni.',
+'tmp-create-error' => 'Ora bisa nggawé berkas sawetara.',
+'tmp-write-error' => 'Ora bisa nulis berkas sawetara.',
 'large-file' => 'Ukuran berkas disaranaké supaya ora ngluwihi $1 bita; berkas iki ukurané $2 bita.',
 'largefileserver' => 'Berkas iki luwih gedhé tinimbang sing bisa kaparengaké server.',
 'emptyfile' => 'Berkas sing panjenengan unggahaké katoné kosong. Mbokmenawa iki amerga anané salah ketik ing jeneng berkas. Mangga dipastèkaké apa panjenengan pancèn kersa ngunggahaké berkas iki.',
-'fileexists' => "Sawijining berkas mawa jeneng iku wis ana, mangga dipriksa '''<tt>[[:$1]]</tt>''' yèn panjenengan ora yakin sumedya ngowahiné.
-[[$1|thumb]]",
-'filepageexists' => "Kaca dèskripsi kanggo berkas iki wis digawé ing '''<tt>[[:$1]]</tt>''', nanging saiki iki ora ditemokaké berkas mawa jeneng iku. Ringkesan sing panjenengan lebokaké ora bakal metu ing kaca dèskripsi. Kanggo ngetokaké dèskripsi iki, panjenengan kudu nyunting sacara manual. [[$1|thumb]]",
-'fileexists-extension' => "Berkas mawa jeneng sing padha wis ana: [[$2|thumb]]
-* Jeneng berkas sing bakal diunggahaké: '''<tt>[[:$1]]</tt>'''
-* Jeneng berkas sing wis ana: '''<tt>[[:$2]]</tt>'''
-Mangga milih jeneng liya.",
+'windows-nonascii-filename' => 'Wiki iki ora nyengkuyung jeneng berkas mawa karakter kusus.',
+'fileexists' => 'Sawijining berkas mawa jeneng iku wis ana, mangga dipriksa <strong>[[:$1]]</strong> yèn panjenengan ora yakin sumedya ngowahiné.
+[[$1|thumb]]',
+'filepageexists' => 'Kaca dèskripsi kanggo berkas iki wis digawé ing <strong>[[:$1]]</strong>, nanging saiki iki ora ditemokaké berkas mawa jeneng iku. Ringkesan sing panjenengan lebokaké ora bakal metu ing kaca dèskripsi. Kanggo ngetokaké dèskripsi iki, panjenengan kudu nyunting sacara manual. [[$1|thumb]]',
+'fileexists-extension' => 'Berkas mawa jeneng sing padha wis ana: [[$2|thumb]]
+* Jeneng berkas sing bakal diunggahaké: <strong>[[:$1]]</strong>
+* Jeneng berkas sing wis ana: <strong>[[:$2]]</strong>
+Mangga milih jeneng liya.',
 'fileexists-thumbnail-yes' => "Berkas iki katoné gambar mawa ukuran sing luwih cilik ''(thumbnail)''. [[$1|thumb]]
-Tulung dipriksa berkas '''<tt>[[:$1]]</tt>'''.
+Tulung dipriksa berkas <strong>[[:$1]]</strong>.
 Yèn berkas sing wis dipriksa iku padha, ora perlu panjenengan ngunggahaké vèrsi cilik liyané manèh.",
-'file-thumbnail-no' => "Jeneng berkas diwiwiti kanthi '''<tt>$1</tt>'''. Katoné berkas iki sawijining gambar mawa ukuran sing dicilikaké <em>(thumbnail)</em>.
-Yèn panjenengan kagungan vèrsi mawa résolusi kebak saka gambar iki, mangga diunggahaké. Yèn ora, tulung jeneng berkas diganti.",
+'file-thumbnail-no' => 'Jeneng berkas diwiwiti kanthi <strong>$1</strong>. Katoné berkas iki sawijining gambar mawa ukuran sing dicilikaké <em>(thumbnail)</em>.
+Yèn panjenengan kagungan vèrsi mawa résolusi kebak saka gambar iki, mangga diunggahaké. Yèn ora, tulung jeneng berkas diganti.',
 'fileexists-forbidden' => 'Sawijining berkas mawa jeneng iki wis ana, lan ora bisa ditindhes.
 Yèn panjenengan isih arep ngunggahaké berkas panjenengan, supaya
 mbalik lan gunakna jeneng liya.
@@ -1309,15 +1458,20 @@ Yèn isih ngersakaké ngunggahaké, mangga berkas diunggahaké manèh mawa jenen
 'file-exists-duplicate' => 'Berkas iki duplikat utawa padha karo {{PLURAL:$1|berkas|berkas-berkas}} ing ngisor:',
 'file-deleted-duplicate' => 'Sawijining berkas persis berkas iki ([[:$1]]) wis tau dibusak. Mangga panjenengan priksani sajarah pambusakan berkas kasebut sadurungé nerusaké ngunggahaké berkas kuwi manèh.',
 'uploadwarning' => 'Pèngetan pangunggahan berkas',
+'uploadwarning-text' => 'Mangga owah katrangan berkas nèng ngisor lan coba manèh.',
 'savefile' => 'Simpen berkas',
 'uploadedimage' => 'gambar "[[$1]]" kaunggahaké',
 'overwroteimage' => 'ngunggahaké vèrsi anyar saka "[[$1]]"',
 'uploaddisabled' => 'Nuwun sèwu, fasilitas pangunggahan dipatèni.',
+'copyuploaddisabled' => 'Ngunggah mawa URL dipatèni.',
+'uploadfromurl-queued' => 'Unggahan Sampéyan wis mlebu antrian.',
 'uploaddisabledtext' => 'Pangunggahan berkas ora diidinaké.',
 'php-uploaddisabledtext' => 'Pangunggahan berkas dipatèni ing PHP.
 Mangga priksa panyetèlan pangunggahan berkas.',
 'uploadscripted' => 'Berkas iki ngandhut HTML utawa kode sing bisa diinterpretasi salah déning panjlajah wèb.',
 'uploadvirus' => 'Berkas iki ngamot virus! Détil: $1',
+'uploadjava' => 'Berkas kuwi berkas ZIP sing kaisi berkas .class Java.
+Ngungga berkas Java ora dililakaké amarga bisa nyebabaké ngluwèhaké wates kamanan.',
 'upload-source' => 'Berkas sumber',
 'sourcefilename' => 'Jeneng berkas sumber',
 'sourceurl' => 'URL sumber:',
@@ -1330,6 +1484,8 @@ Mangga priksa panyetèlan pangunggahan berkas.',
 Mangga priksanen $1 sadurungé ngunggahaké berkas iku manèh.',
 'filename-bad-prefix' => "Jeneng berkas sing panjenengan unggahaké, diawali mawa '''\"\$1\"''', sing sawijining jeneng non-dèskriptif sing biasané diwènèhaké sacara otomatis déning kamera digital. Mangga milih jeneng liyané sing luwih dèskriptif kanggo berkas panjenengan.",
 'upload-success-subj' => 'Kasil diamot',
+'upload-success-msg' => 'Unggahan Sampéyan saka [$2] sukses. Kuwi sumadhiya nèng kéné: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Perkara pangunggahan',
 'upload-failure-msg' => 'Ana prakara karo pangunggahan panjenengan seka [$2]:
 $1',
 'upload-warning-subj' => 'Pèngetan pangunggahan berkas',
@@ -1345,12 +1501,87 @@ Mangga kontak [[Special:ListUsers/sysop|pangurus]].',
 'upload-too-many-redirects' => 'URL ngandhut kakèhan pengalihan',
 'upload-unknown-size' => 'Ukuran ora diweruhi',
 'upload-http-error' => 'Ana kasalahan HTTP: $1',
+'upload-copy-upload-invalid-domain' => 'Unggahan salinan ora sumadhiya nèng domain iki.',
+
+# File backend
+'backend-fail-stream' => 'Ora bisa milikaké berkas "$1".',
+'backend-fail-backup' => 'Ora bisa nyadangaké berkas "$1".',
+'backend-fail-notexists' => 'Berkas $1 ora ana.',
+'backend-fail-hashes' => 'Ora bisa ngéntukaké has berkas kanggo mbandingaké.',
+'backend-fail-notsame' => 'Berkas nonidèntik wis ana nèng "$1".',
+'backend-fail-invalidpath' => '"$1" dudu jurusan nyimpen sing sah.',
+'backend-fail-delete' => 'Ora bisa mbusak berkas "$1".',
+'backend-fail-alreadyexists' => 'Berkas "$1" wis ana.',
+'backend-fail-store' => 'Ora bisa nyèlèhaké berkas "$1" nèng "$2".',
+'backend-fail-copy' => 'Ora bisa nyalin berkas "$1" nèng "$2".',
+'backend-fail-move' => 'Ora bisa mindhahaké berkas "$1" nèng "$2".',
+'backend-fail-opentemp' => 'Ora bisa mbukak berkas sawetara.',
+'backend-fail-writetemp' => 'Ora bisa nulis berkas sawetara.',
+'backend-fail-closetemp' => 'Ora bisa nutup berkas sawetara.',
+'backend-fail-read' => 'Ora bisa maca berkas "$1".',
+'backend-fail-create' => 'Ora bisa nulis berkas "$1".',
+'backend-fail-maxsize' => 'Ora bisa nulis berkas "$1" amarga luwih gedhé saka {{PLURAL:$2|sak bita|$2 bita}}.',
+'backend-fail-contenttype' => 'Ora bisa nemtokaké jinisé kontèn saka berkas sing arep disimpen nèng "$1".',
+'backend-fail-usable' => 'Ora bisa nulis berkas "$1" amarga idin durung nyukupi utawa ilang dirèktori/kontaineré.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ora bisa mbukak gembok "$1"; kuwi ora kagembok.',
+'lockmanager-fail-closelock' => 'Ora bisa nutup berkas gembok kanggo "$1".',
+'lockmanager-fail-deletelock' => 'Ora bisa mbusak berkas gembok kanggo "$1".',
+'lockmanager-fail-acquirelock' => 'Ora bisa njaluk gembok kanggo "$1".',
+'lockmanager-fail-openlock' => 'Ora bisa mbukak berkas gembok kanggo "$1".',
+'lockmanager-fail-releaselock' => 'Ora bisa ngetokaké gembok kanggo "$1".',
+'lockmanager-fail-db-bucket' => 'Ora bisa ngubungi cukup basis data gembok nèng èmbèr $1.',
+'lockmanager-fail-db-release' => 'Ora bisa nguculaké gembok neng basis data $1.',
+'lockmanager-fail-svr-acquire' => 'Ora bisa ngentokaké gembok nèng sasana $1.',
+'lockmanager-fail-svr-release' => 'Ora bisa nguculaké gembok neng sasana $1.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'Ana kasalahan nalika mbukak berkas kanggo papriksan ZIP.',
+'zip-wrong-format' => 'Berkas sing diawèhaké dudu berkas ZIP.',
+'zip-bad' => 'Berkas rusak utawa berkas ZIP sing ora bisa diwaca.
+Kuwi ora bisa kapriksa kanthi patut kanggo kamanan.',
+'zip-unsupported' => 'Berkasé kuwi berkas ZIP sing nganggo piranti ZIP sing ora kasengkuyung déning MediaWiki.
+Kuwi ora bisa kapriksa kanthi patut kanggo kamanan.',
+
+# Special:UploadStash
+'uploadstash' => 'Unggah pandhelikan',
+'uploadstash-summary' => 'Kaca iki nyadhiyakaké dalan nèng berkas-berkas sing wis diunggah (utawa lagi diunggah) naning durung diterbitaké nèng wiki. Berkas-berkas iki ora katon kanggo sapa waé nanging namung kanggo panganggo sing ngunggah waé.',
+'uploadstash-clear' => 'Busak berkas kadhelikaké',
+'uploadstash-nofiles' => 'Sampéyan ora nduwé berkas kadhelikaké.',
+'uploadstash-badtoken' => 'Nglakoni iki ora suksès, mungkin amarga hak panyuntingan Sampéyan wis kedaluwarsa. Jajal manèh.',
+'uploadstash-errclear' => 'Ngresiki berkas ora suksès.',
+'uploadstash-refresh' => 'Segeraké daptar berkas',
+'invalid-chunk-offset' => 'Ganti rugi kethoka ora sah',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Aksès ditulak',
+'img-auth-nopathinfo' => 'Kélangan PATH_INFO.
+Sasana Sampéyan durung disetèl kanggo ngliwati inpormasi iki.
+Mungkin amarga abasis-CGI lan ora bisa nyengkuyung img_auth.
+Delok https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+'img-auth-notindir' => 'Alur sing dijaluk dudu dirèktori unggah kakonpigurasi.',
+'img-auth-badtitle' => 'Ora bisa mbangun judhul sah saka "$1".',
+'img-auth-nologinnWL' => 'Sampéyan durung mlebu log lan "$1" ora nèng daptar putih.',
+'img-auth-nofile' => 'Berkas "$1" ora ana.',
+'img-auth-isdir' => 'Sampéyan lagi njajal ngaksès dirèktori "$1".
+Namung aksès berkas sing dililakaké.',
+'img-auth-streaming' => 'Striming "$1".',
+'img-auth-public' => 'Pungsi img_auth.php yakuwi ngetokaké berkas saka wiki pribadi.
+Wiki iki ditata minangka wiki umum.
+Kanggo kamanan paling apik, img_auth.php dipatèni.',
+'img-auth-noread' => 'Panganggo ora nduwé aksès kanggo maca "$1".',
+'img-auth-bad-query-string' => "URL nduwèni ''query string'' sing ora sah.",
 
 # HTTP errors
 'http-invalid-url' => 'URL ora absah: $1',
+'http-invalid-scheme' => 'URL mawa skéma "$1" ora disengkuyung.',
+'http-request-error' => 'Panjalukan HTTP gagal amarga kasalahan sing ora dingertèni.',
+'http-read-error' => 'Kasalahan maca HTTP.',
+'http-timed-out' => 'Panjalukan HTTP kliwat wates wektu.',
+'http-curl-error' => 'Kasalahan nalika njupuk URL: $1',
+'http-host-unreachable' => 'Ora bisa ngranggèh URL.',
+'http-bad-status' => 'Ana masalah nalika njaluk HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL-é ora bisa dihubungi',
@@ -1369,12 +1600,12 @@ Mbok-menawa panjenengan bisa nyoba manèh ing wektu sing luwih longgar.',
 'upload_source_file' => ' (sawijining berkas ing komputeré panjenengan)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Kaca astaméwa utawa kusus iki nuduhaké kabèh berkas sing wis diunggahaké.
-Sacara baku, berkas pungkasan sing diunggahaké dituduhaké ing urutan dhuwur dhéwé.
-Klik sirahé kolom kanggo ngowahi urutan.',
+'listfiles-summary' => 'Kaca astamiwa nudhuhaké kabèk kaca kaunggah.
+Yèn disaring déning panganggo, namung berkas mawa vèrsi paling anyar waé sing bakal katon.',
 'listfiles_search_for' => 'Golèk jeneng gambar:',
 'imgfile' => 'gambar',
 'listfiles' => 'Daftar gambar',
+'listfiles_thumb' => 'Gambar mini',
 'listfiles_date' => 'Tanggal',
 'listfiles_name' => 'Jeneng',
 'listfiles_user' => 'Panganggo',
@@ -1399,19 +1630,24 @@ Klik sirahé kolom kanggo ngowahi urutan.',
 'filehist-filesize' => 'Gedhené berkas',
 'filehist-comment' => 'Komentar',
 'filehist-missing' => 'Berkas ilang',
-'imagelinks' => 'Pranala gambar',
+'imagelinks' => 'Panganggoan berkas',
 'linkstoimage' => 'Kaca-kaca sing kapacak iki duwé {{PLURAL:$1|pranala|$1 pranala}} menyang berkas iki:',
 'linkstoimage-more' => 'Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.
 Dhaftar ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.
 [[Special:WhatLinksHere/$2|dhaftar pepak]] uga ana.',
 'nolinkstoimage' => 'Ora ana kaca sing nyambung menyang berkas iki.',
 'morelinkstoimage' => 'Ndeleng [[Special:WhatLinksHere/$1|luwih akèh pranala]] menyang berkas iki.',
+'linkstoimage-redirect' => '$1 (alihan berkas) $2',
 'duplicatesoffile' => '{{PLURAL:$1|berkas ing ngisor arupa duplikat|$1 berkas ing ngisor arupa duplikat}} saka berkas iki ([[Special:FileDuplicateSearch/$2|luwih rinci]]):',
 'sharedupload' => 'Berkas iki saka $1 lan bisa digunakaké déning proyèk liya.',
 'sharedupload-desc-there' => 'Berkas iki asal saka $1 lan bisa dipigunakaké déning proyèk liya.
 Mangga pirsani [$2 kaca dhèskripsi berkas] kanggo informasi sabanjuré.',
 'sharedupload-desc-here' => 'Berkas iki asal saka $1 lan bisa dipigunakaké déning proyèk liya.
 Dhèskripsi saka [$2 kaca dhèskripsiné] kapacak ing ngisor iki.',
+'sharedupload-desc-edit' => 'Berkas iki saka $1 lan mungkin dianggo nèng proyèk liya.
+Mungkin Sampéyan pingin nyunting katrangan nèng [$2 kaca katrangan berkasé] nèng kono.',
+'sharedupload-desc-create' => 'Berkas iki saka $1 lan mungkin dianggo nèng proyèk liya.
+Mungkin Sampéyan pingin nyunting katrangan nèng [$2 kaca katrangan berkasé] nèng kono.',
 'filepage-nofile' => 'Ora ana berkas nganggo jeneng iki.',
 'filepage-nofile-link' => 'Ora ana berkas nganggo jeneng iki, nanging panjenengan bisa [$1 ngunggahaké].',
 'uploadnewversion-linktext' => 'Unggahna vèrsi sing luwih anyar tinimbang gambar iki',
@@ -1445,10 +1681,12 @@ Dhèskripsi saka [$2 kaca dhèskripsiné] kapacak ing ngisor iki.',
 ** Nglanggar hak cipta
 ** Berkas duplikat',
 'filedelete-edit-reasonlist' => 'Sunting alesan pambusakan',
+'filedelete-maintenance' => 'Pambusakan lan pambalikan berkas kanggo sawetara dipatèni salawas ana pangruwatan.',
+'filedelete-maintenance-title' => 'Ora bisa mbusak berkas',
 
 # MIME search
 'mimesearch' => 'Panggolèkan MIME',
-'mimesearch-summary' => 'Kaca iki nyedyaké fasilitas nyaring berkas miturut tipe MIME-né. Lebokna: contenttype/subtype, contoné <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Kaca iki nyedyaké fasilitas nyaring berkas miturut tipe MIME-né. Lebokna: contenttype/subtype, contoné <code>image/jpeg</code>.',
 'mimetype' => 'Tipe MIME:',
 'download' => 'undhuh',
 
@@ -1486,23 +1724,25 @@ Priksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.',
 'statistics-edits' => 'Gunggung suntingan wiwit {{SITENAME}} diwiwiti',
 'statistics-edits-average' => 'Rata-rata suntingan saben kaca',
 'statistics-views-total' => 'Gunggung panampilan kaca',
+'statistics-views-total-desc' => 'Delokan nèng kaca sing ora ana lan kaca kusus ora kalebu',
 'statistics-views-peredit' => 'Gunggung/cacahing panampilan saben suntingan',
 'statistics-users' => 'Gunggung [[Special:ListUsers|panganggo kadaftar]]',
 'statistics-users-active' => 'Para panganggo aktif',
 'statistics-users-active-desc' => 'Panganggo sing ngayahi aktivitas jroning {{PLURAL:$1|dia|$1 dina}} pungkasan',
 'statistics-mostpopular' => 'Kaca sing paling akèh dideleng',
 
-'disambiguations' => 'Kaca disambiguasi',
+'disambiguations' => 'Kaca sing kaubung nèng kaca disambiguasi',
 'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Kaca-kaca iki ndarbèni pranala menyang sawijining ''kaca disambiguasi''.
-Kaca-kaca iku sajatiné kuduné nyambung menyang topik-topik sing bener.<br />
-Sawijining kaca dianggep minangka kaca disambiguasi yèn kaca iku nganggo cithakan sing nyambung menyang [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Kaca-kaca iki kaisi paling ora sak pranala nuju '''kaca disambiguasi'''.
+Mungkin kuduné diubungaké nèng kaca sing luwih pantes.<br />
+Kaca kaanggep kaca disambiguasi yèn kuwi nganggo templat sing kaubung saka [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Pangalihan dobel',
 'doubleredirectstext' => 'Kaca iki ngandhut daftar kaca sing ngalih ing kaca pangalihan liyané.
 Saben baris ngandhut pranala menyang pangalihan kapisan lan kapindho, sarta tujuan saka pangalihan kapindho, sing biasané kaca tujuan sing "sajatiné", yakuwi pangalihan kapisan kuduné dialihaké menyang kaca tujuan iku.
 Jeneng sing wis <del>dicorèk</del> tegesé wis rampung didandani.',
 'double-redirect-fixed-move' => '[[$1]] wis kapindhahaké, saiki dadi kaca peralihan menyang [[$2]]',
+'double-redirect-fixed-maintenance' => 'Mbenakaké rong pangalihan saka [[$1]] nèng [[$2]].',
 'double-redirect-fixer' => 'Révisi pangalihan',
 
 'brokenredirects' => 'Pangalihan rusak',
@@ -1524,6 +1764,8 @@ Jeneng sing wis <del>dicorèk</del> tegesé wis rampung didandani.',
 'nmembers' => '$1 {{PLURAL:$1|anggota|anggota}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisi|revisi}}',
 'nviews' => 'Wis kaping $1 {{PLURAL:$1|dituduhaké|dituduhaké}}',
+'nimagelinks' => 'Kanggo nèng {{PLURAL:$1|kaca|kaca}}',
+'ntransclusions' => 'kanggo nèng $1 {{PLURAL:$1|kaca|kaca}}',
 'specialpage-empty' => 'Ora ana sing perlu dilaporaké.',
 'lonelypages' => 'Kaca tanpa dijagani',
 'lonelypagestext' => 'Kaca-kaca ing ngisor iki ora ana sing nyambung menyang kaca liyané ing {{SITENAME}}.',
@@ -1538,6 +1780,8 @@ Jeneng sing wis <del>dicorèk</del> tegesé wis rampung didandani.',
 'wantedpages' => 'Kaca sing dipèngini',
 'wantedpages-badtitle' => 'Judhul ora valid ing sèt asil: $1',
 'wantedfiles' => 'Berkas sing diperlokaké',
+'wantedfiletext-cat' => "Berkas iki dianggo nanging ora ana. Berkas saka panyimpenan asing mungkin kadaptar tinimbang ana kasunyatan. Saben ''positip salah'' bakal <del>diorèk</del>. Lan, kaca sing nyartakaké berkas sing ora ana bakal kadaptar nèng [[:$1]].",
+'wantedfiletext-nocat' => "Berkas iki dianggo nanging ora ana. Berkas saka panyimpenan asing mungkin kadaptar tinimbang ana kasunyatan. Saben ''positip salah'' bakal <del>diorèk</del>.",
 'wantedtemplates' => 'Cithakan sing diperlokaké',
 'mostlinked' => 'Kaca sing kerep dhéwé dituju',
 'mostlinkedcategories' => 'Kategori sing kerep dhéwé dienggo',
@@ -1546,6 +1790,7 @@ Jeneng sing wis <del>dicorèk</del> tegesé wis rampung didandani.',
 'mostimages' => 'Berkas sing kerep dhéwé dienggo',
 'mostrevisions' => 'Kaca mawa pangowahan sing akèh dhéwé',
 'prefixindex' => 'Kabèh kaca mawa ater-ater',
+'prefixindex-namespace' => 'Kabèh kaca mawa ater-ater (bilik jeneng $1)',
 'shortpages' => 'Kaca cendhak',
 'longpages' => 'Kaca dawa',
 'deadendpages' => 'Kaca-kaca buntu (tanpa pranala)',
@@ -1562,7 +1807,7 @@ Jeneng sing wis <del>dicorèk</del> tegesé wis rampung didandani.',
 'listusers-editsonly' => 'Tampilaké mung panganggo sing nduwèni kontribusi',
 'listusers-creationsort' => 'Urut miturut tanggal digawé',
 'usereditcount' => '$1 {{PLURAL:$1|suntingan|suntingan}}',
-'usercreated' => 'Digawé tanggal $1 jam $2',
+'usercreated' => '{{GENDER:$3|Digawé}} $1 wanci $2',
 'newpages' => 'Kaca anyar',
 'newpages-username' => 'Asma panganggo:',
 'ancientpages' => 'Kaca-kaca langkung sepuh',
@@ -1578,6 +1823,7 @@ Tulung digatèkaké yèn situs wèb liyané mbok-menawa bisa nyambung ing sawiji
 'pager-newer-n' => '{{PLURAL:$1|1 luwih anyar|$1 luwih anyar}}',
 'pager-older-n' => '{{PLURAL:$1|1 luwih lawas|$1 luwih lawas}}',
 'suppress' => "Pangawas (''oversight'')",
+'querypage-disabled' => 'Kaca kusus iki dipatèni kanggo alesan kinerja.',
 
 # Book sources
 'booksources' => 'Sumber buku',
@@ -1587,14 +1833,15 @@ Tulung digatèkaké yèn situs wèb liyané mbok-menawa bisa nyambung ing sawiji
 'booksources-invalid-isbn' => 'ISBN sing diwènèhaké katonané ora valid; priksa kasalahan penyalinan saka sumber asli.',
 
 # Special:Log
-'specialloguserlabel' => 'Panganggo:',
-'speciallogtitlelabel' => 'Irah-irahan (judhul):',
+'specialloguserlabel' => 'Panampil:',
+'speciallogtitlelabel' => 'Patujon (judhul utawa panganggo) :',
 'log' => 'Log',
 'all-logs-page' => 'Kabèh log publik',
 'alllogstext' => 'Gabungan tampilam kabèh log sing ana ing {{SITENAME}}.
 Panjenengan bisa mbatesi tampilan kanthi milih jinis log, jeneng panganggo (sènsitif aksara gedhé/cilik), utawa kaca sing magepokan (uga sènsitif aksara gedhé/cilik).',
 'logempty' => 'Ora ditemokaké èntri log sing pas.',
 'log-title-wildcard' => 'Golèk irah-irahan utawa judhul sing diawali mawa tèks kasebut',
+'showhideselectedlogentries' => 'Tuduhalé/dhelikaké èntri log kapilih',
 
 # Special:AllPages
 'allpages' => 'Kabèh kaca',
@@ -1612,6 +1859,12 @@ Panjenengan bisa mbatesi tampilan kanthi milih jinis log, jeneng panganggo (sèn
 'allpagesprefix' => 'Kapacak kaca-kaca ingkang mawi ater-ater:',
 'allpagesbadtitle' => 'Irah-irahan (judhul) ingkang dipun-gunaaken boten sah utawi nganggé ater-ater (awalan) antar-basa utawi antar-wiki. Irah-irahan punika saged ugi nganggé setunggal aksara utawi luwih ingkang boten saged kagunaaken dados irah-irahan.',
 'allpages-bad-ns' => '{{SITENAME}} ora duwé bilik nama "$1".',
+'allpages-hide-redirects' => 'Dhelikaké alihan',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Sampéyan lagi ndelok vèrsi cadhangan saka kaca iki, sing bisa dadi lawasé wis $1.',
+'cachedspecial-viewing-cached-ts' => 'Sampéyan lagi ndelok vèrsi cadhangan saka kaca iki, sing bisa dadi ora padha karo kasunyatan.',
+'cachedspecial-refresh-now' => 'Delok sing paling anyar.',
 
 # Special:Categories
 'categories' => 'Daftar kategori',
@@ -1628,11 +1881,11 @@ Deleng uga [[Special:WantedCategories|kategori sing diperlokaké]].',
 'sp-deletedcontributions-contribs' => 'kontribusi',
 
 # Special:LinkSearch
-'linksearch' => 'Pranala jaba',
+'linksearch' => 'Golèkan pranala njaba',
 'linksearch-pat' => 'Pola panggolèkan:',
 'linksearch-ns' => 'Bilik nama:',
 'linksearch-ok' => 'Golèk',
-'linksearch-text' => "''Wildcards'' kaya ta \"*.wikipedia.org\" bisa dienggo.<br />Protokol sing disengkuyung: <tt>\$1</tt>",
+'linksearch-text' => "''Wildcards'' kaya ta \"*.wikipedia.org\" bisa dienggo.<br />Protokol sing disengkuyung: <code>\$1</code>",
 'linksearch-line' => '$1 disambung saka $2',
 'linksearch-error' => "''Wildcards'' namung bisa dienggo ing bagéyan awal saka jeneng host.",
 
@@ -1644,6 +1897,7 @@ Deleng uga [[Special:WantedCategories|kategori sing diperlokaké]].',
 
 # Special:ActiveUsers
 'activeusers' => 'Dhaptar panganggo aktif',
+'activeusers-intro' => 'Iki daptar panganggo sing katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.',
 'activeusers-count' => '$1 {{PLURAL:$1|suntingan|suntingan}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan',
 'activeusers-from' => 'Tampilna panganggo wiwit saka:',
 'activeusers-hidebots' => 'Delikna bot',
@@ -1681,12 +1935,17 @@ Informasi tambahan perkara hak-hak individual bisa ditemokaké ing [[{{MediaWiki
 'emailpagetext' => 'Panjenengan bisa migunakaké formulir ing ngisor kanggo ngirim layang-e marang panganggo iki.
 Alamat layang-e sing panjenengan lebokaké ing [[Special:Preferences|préferèsi panjenengan]] bakal dadi alamat "Saka" jroning layang-e kasebut, mula panampa layang-e bakal bisa mbalesi langsung menyang panjenengan.',
 'usermailererror' => 'Kaluputan obyèk layang:',
-'defemailsubject' => 'Layang e-mail {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} layang èlèktronik saka panganggo "$1"',
 'usermaildisabled' => 'E-mail panganggo dinonaktifaké',
+'usermaildisabledtext' => 'Sampéyan ora bisa ngirim layang èlèktronik nèng panganggo liya nèng wiki iki',
 'noemailtitle' => 'Ora ana alamat layang e-mail',
 'noemailtext' => 'Panganggo iki ora mènèhi alamat layang-e sing absah.',
 'nowikiemailtitle' => 'Layang-e ora diidinaké',
 'nowikiemailtext' => 'Panganggo iki wis milih ora nampa layang-e saka panganggo liya.',
+'emailnotarget' => 'Jeneng panganggo panampa ora ana utawa ora sah.',
+'emailtarget' => 'Lebokaké jeneng panganggo panampa',
+'emailusername' => 'Jeneng panganggo:',
+'emailusernamesubmit' => 'Kirim',
 'email-legend' => 'Ngirim layang-e katujokaké panganggo  {{SITENAME}} liyané',
 'emailfrom' => 'Saka:',
 'emailto' => 'Kanggo:',
@@ -1699,6 +1958,10 @@ Alamat layang-e sing panjenengan lebokaké ing [[Special:Preferences|préferèsi
 'emailsenttext' => 'Layang e-mail panjenengan wis dikirim.',
 'emailuserfooter' => 'Layang-e iki dikirimaké déning $1 marang $2 migunakaké fungsi "Layangpanganggo" ing {{SITENAME}}.',
 
+# User Messenger
+'usermessage-summary' => 'Tinggalaké layang sistem.',
+'usermessage-editor' => 'Pawartaning layang sistem',
+
 # Watchlist
 'watchlist' => 'Daftar artikel pilihan',
 'mywatchlist' => 'Daftar pangawasanku',
@@ -1707,8 +1970,10 @@ Alamat layang-e sing panjenengan lebokaké ing [[Special:Preferences|préferèsi
 'watchlistanontext' => 'Mangga $1 kanggo mirsani utawa nyunting daftar pangawasan panjenengan.',
 'watchnologin' => 'Durung mlebu log',
 'watchnologintext' => 'Panjenengan kudu [[Special:UserLogin|mlebu log]] kanggo ngowahi daftar artikel pilihan.',
+'addwatch' => 'Tambah nèng daptar pangawasan',
 'addedwatchtext' => "Kaca \"[[:\$1]]\" wis ditambahaké menyang [[Special:Watchlist|daftar pangawasan]].
 Owah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhèng, bakal dipacak ing kéné, lan kaca iku bakal dituduhaké '''kandel''' ing [[Special:RecentChanges|daftar owah-owahan iku]] supados luwih gampang katon.",
+'removewatch' => 'Singkiraké saka daptar pangawasan',
 'removedwatchtext' => 'Kaca "[[:$1]]" wis dibusak saka [[Special:Watchlist|daftar pangawasan]].',
 'watch' => 'tutana',
 'watchthispage' => 'Periksa kaca iki',
@@ -1724,13 +1989,14 @@ Owah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhè
 'watchmethod-list' => 'priksa kaca sing diawasi kanggo owah-owahan anyar',
 'watchlistcontains' => 'Daftar pangawasan panjenengan isiné ana $1 {{PLURAL:$1|kaca|kaca}}.',
 'iteminvalidname' => "Ana masalah karo '$1', jenengé ora absah...",
-'wlnote' => "Ing ngisor iki kapacak $1 {{PLURAL:$1|owah-owahan|owah-owahan}} pungkasan ing '''$2''' jam kapungkur.",
+'wlnote' => "Ngisor iki {{PLURAL:$1|owahan pungkasan|'''$1''' owahan pungkasan}} {{PLURAL:$2|jam|'''$2''' jam}} kapungkur, per $3, $4.",
 'wlshowlast' => 'Tuduhna $1 jam $2 dina $3 pungkasan',
 'watchlist-options' => 'Opsi daftar pangawasan',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Ngawasi...',
 'unwatching' => 'Ngilangi pangawasan...',
+'watcherrortext' => 'Ana kasalahan nalika ngganti pangaturan daptar pangawasan Sampéyan kanggo "$1".',
 
 'enotif_mailer' => 'Pangirim Notifikasi {{SITENAME}}',
 'enotif_reset' => 'Tandhanana kabèh kaca sing wis ditiliki',
@@ -1801,6 +2067,8 @@ kudu ngati-ati.',
 'rollback' => 'Mbalèkaké suntingan',
 'rollback_short' => 'Balèkna',
 'rollbacklink' => 'balèaké',
+'rollbacklinkcount' => 'balèkaké $1 {{PLURAL:$1|suntingan|suntingan}}',
+'rollbacklinkcount-morethan' => 'balèkaké luwih saka $1 {{PLURAL:$1|suntingan|suntingan}}',
 'rollbackfailed' => 'Pambalèkan gagal dilakoni',
 'cantrollback' => 'Ora bisa mbalèkaké suntingan; panganggo pungkasan iku siji-sijiné penulis artikel iki.',
 'alreadyrolled' => 'Ora bisa mbalèkaké suntingan pungkasan [[:$1]] déning [[User:$2|$2]] ([[User talk:$2|Wicara]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); wong liya wis nyunting utawa mbalèkaké kaca artikel iku.
@@ -1808,6 +2076,7 @@ kudu ngati-ati.',
 Suntingan pungkasan dilakoni déning [[User:$3|$3]] ([[User talk:$3|Wicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Ringkesan suntingan yaiku: \"''\$1''\".",
 'revertpage' => 'Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dipunwangsulaken dhateng ing vèrsi pungkasan déning [[User:$1|$1]]',
+'revertpage-nouser' => 'Suntingan dibalèkaké déning (jeneng panganggo dibusak) nèng benahan pungkasan déning [[User:$1|$1]]',
 'rollback-success' => 'Suntingan dibalèkaké déning $1;
 diowahi bali menyang vèrsi pungkasan déning $2.',
 
@@ -1817,19 +2086,23 @@ diowahi bali menyang vèrsi pungkasan déning $2.',
 
 # Protect
 'protectlogpage' => 'Log pangreksan',
-'protectlogtext' => 'Ing ngisor iki kapacak log pangreksan lan panjabelan reksa kaca.
-Mangga mirsani [[Special:ProtectedPages|daftar kaca sing direksa]] kanggo daftar pangreksan kaca pungkasan.',
+'protectlogtext' => 'Ngisor iki daptar owahan saka panjagan kaca.
+Delok [[Special:ProtectedPages|daptar kaca sing dijaga]] kanggo daptar panjagan kaca paling anyar.',
 'protectedarticle' => 'ngreksa "[[$1]]"',
 'modifiedarticleprotection' => 'ngowahi tingkat pangreksan "[[$1]]"',
-'unprotectedarticle' => 'ngilangi pangreksan "[[$1]]"',
+'unprotectedarticle' => 'nyingkiraké panjagan saka "[[$1]]"',
 'movedarticleprotection' => 'mindhahaké pangaturan protèksi saka "[[$2]]" menyang "[[$1]]"',
 'protect-title' => 'Ngowahi tingkatan pangreksan kanggo "$1"',
+'protect-title-notallowed' => 'Delok undhaké panjagan saka "$1"',
 'prot_1movedto2' => '$1 dialihaké menyang $2',
+'protect-badnamespace-title' => 'Bilik jeneng sing ora bisa dijagani',
+'protect-badnamespace-text' => 'Kaca nèng bilik jeneng iki ora bisa dijagani.',
 'protect-legend' => 'Konfirmasi pangreksan',
 'protectcomment' => 'Alesan:',
 'protectexpiry' => 'Kadaluwarsa:',
 'protect_expiry_invalid' => 'Wektu kadaluwarsané ora sah.',
 'protect_expiry_old' => 'Wektu kadaluwarsané kuwi ana ing jaman biyèn.',
+'protect-unchain-permissions' => 'Urubaké pilihan panjagan sabanjuré',
 'protect-text' => "Panjenengan bisa mirsani utawa ngganti tingkatan pangreksan kanggo kaca '''$1''' ing kéné.",
 'protect-locked-blocked' => "Panjenengan ora bisa ngganti tingkat pangreksan yèn lagi diblokir.
 Ing ngisor iki kapacak konfigurasi saiki iki kanggo kaca '''$1''':",
@@ -1843,6 +2116,7 @@ Ing ngisor iki kapacak konfigurasi kanggo kaca '''$1''':",
 'protect-level-sysop' => 'Namung opsis (operator sistem)',
 'protect-summary-cascade' => 'runtun',
 'protect-expiring' => 'kadaluwarsa $1 (UTC)',
+'protect-expiring-local' => 'kedaluwarsa $1',
 'protect-expiry-indefinite' => 'salawasé',
 'protect-cascade' => 'Reksanen kabèh kaca sing kalebu ing kaca iki (pangreksan runtun).',
 'protect-cantedit' => 'Panjenengan ora pareng ngowahi tingkatan pangreksan kaca iki amerga panjenengan ora kagungan idin nyunting kaca iki.',
@@ -1913,6 +2187,7 @@ mbokmenawa wis ana wong liya sing luwih dhisik nglakoni pambatalan.',
 
 Delengen [[Special:Log/delete|log pambusakan]] kanggo data pambusakan lan pambalèkan.",
 'undelete-header' => 'Mangga mirsani [[Special:Log/delete|log pambusakan]] kanggo daftar kaca sing lagi waé dibusak.',
+'undelete-search-title' => 'Golèk kaca kabusak',
 'undelete-search-box' => 'Golèk kaca-kaca sing wis dibusak',
 'undelete-search-prefix' => 'Tuduhna kaca sing diwiwiti karo:',
 'undelete-search-submit' => 'Golèk',
@@ -1922,6 +2197,7 @@ Delengen [[Special:Log/delete|log pambusakan]] kanggo data pambusakan lan pambal
 'undelete-cleanup-error' => 'Ana kaluputan nalika mbusak arsip berkas "$1" sing ora dienggo.',
 'undelete-missing-filearchive' => 'Ora bisa mbalèkaké arsip bekas mawa ID $1 amerga ora ana ing basis data.
 Berkas iku mbok-menawa wis dibusak.',
+'undelete-error' => 'Kasalahan mbalèkaké kaca',
 'undelete-error-short' => 'Kaluputan olèhé mbatalaké pambusakan: $1',
 'undelete-error-long' => 'Ana kaluputan nalika mbatalaké pambusakan berkas:
 
@@ -1932,6 +2208,9 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Bilik nama (bilik jeneng):',
 'invert' => 'Balèkna pilihan',
+'tooltip-invert' => 'Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca nèng njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)',
+'namespace_association' => 'Bilik jeneng kakait',
+'tooltip-namespace_association' => 'Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk sing kakait karo bilik jeneng kapilih',
 'blanknamespace' => '(Utama)',
 
 # Contributions
@@ -1949,11 +2228,17 @@ $1',
 'sp-contributions-newbies-title' => 'Kontribusi panganggo anyar',
 'sp-contributions-blocklog' => 'Log pemblokiran',
 'sp-contributions-deleted' => 'kontribusi panganggo sing dibusak',
+'sp-contributions-uploads' => 'unggahan',
 'sp-contributions-logs' => 'log',
 'sp-contributions-talk' => 'wicara',
 'sp-contributions-userrights' => 'pengaturan hak panganggo',
+'sp-contributions-blocked-notice' => 'Panganggo iki lagi diblokir.
+Èntri log blokiran pungkasan sumadhiya nèng ngisor kanggo rujukan:',
+'sp-contributions-blocked-notice-anon' => 'Alamat IP iki lagi diblokir.
+Èntri log blokiran pungkasan sumadhiya nèng ngisor kanggo rujukan:',
 'sp-contributions-search' => 'Golèk kontribusi',
 'sp-contributions-username' => 'Alamat IP utawa jeneng panganggo:',
+'sp-contributions-toponly' => 'Tuduhaké was suntingan saka benahan pungkasan',
 'sp-contributions-submit' => 'Golèk',
 
 # What links here
@@ -1976,6 +2261,9 @@ $1',
 'whatlinkshere-filters' => 'Filter-filter',
 
 # Block/unblock
+'autoblockid' => 'Blokir otomatis #$1',
+'block' => 'Blokir panganggo',
+'unblock' => 'Uculaké blokirané panganggo',
 'blockip' => 'Blokir panganggo',
 'blockip-title' => 'Blokir panganggo',
 'blockip-legend' => 'Blokir panganggo',
@@ -1994,6 +2282,7 @@ Lebokna alesan panjenengan ing ngisor iki (contoné njupuk conto kaca sing wis t
 ** Tumindak intimidasi/nglècèhaké
 ** Nyalahgunakaké sawetara akun utawa rékening
 ** Jeneng panganggo ora layak',
+'ipb-hardblock' => 'Alangi panganggo sing wis mlebu log nyunting saka alamat IP iki',
 'ipbcreateaccount' => 'Penggak nggawé akun utawa rékening',
 'ipbemailban' => 'Penggak panganggo ngirim layang e-mail',
 'ipbenableautoblock' => 'Blokir alamat IP pungkasan sing dienggo déning pengguna iki sacara otomatis, lan kabèh alamat sabanjuré sing dicoba arep dienggo nyunting.',
@@ -2004,11 +2293,15 @@ Lebokna alesan panjenengan ing ngisor iki (contoné njupuk conto kaca sing wis t
 'ipbotherreason' => 'Alesan liya/tambahan',
 'ipbhidename' => 'Delikna jeneng panganggo saka suntingan lan pratélan',
 'ipbwatchuser' => 'Ngawasi kaca panganggo lan kaca-kaca dhiskusi panganggo iki',
+'ipb-disableusertalk' => 'Alangi panganggo iki nyunting kaca gunemané nalika diblokir',
 'ipb-change-block' => 'Blokir manèh panganggo kanthi sèting iki',
+'ipb-confirm' => 'Pesthèkaké blokir',
 'badipaddress' => 'Alamat IP klèntu',
 'blockipsuccesssub' => 'Pemblokiran suksès',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] wis diblokir.<br />
-Pirsani [[Special:BlockList|Daftar blokir IP]] kanggo ninjo ulang pamblokiran.',
+Delok [[Special:BlockList|daptar blokir]] kanggo ninjo blokiran.',
+'ipb-blockingself' => 'Sampéyan arep mblokir Sampéyan dhéwé! Sampéyan yakin arep nglakoni kuwi?',
+'ipb-confirmhideuser' => 'Sampéyan arep mblokir panganggo mawa piranti "dhelikaké panganggo" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh daptar lan èntri log. Sampéyan yakin arep nglakoni kuwi?',
 'ipb-edit-dropdown' => 'Sunting alesan pamblokiran',
 'ipb-unblock-addr' => 'Ilangna blokir $1',
 'ipb-unblock' => 'Ilangna blokir sawijining panganggo utawa alamat IP',
@@ -2018,11 +2311,24 @@ Pirsani [[Special:BlockList|Daftar blokir IP]] kanggo ninjo ulang pamblokiran.',
 'unblockiptext' => 'Nggonen formulir ing ngisor iki kanggo mbalèkaké aksès nulis sawijining alamt IP utawa panganggo sing sadurungé diblokir.',
 'ipusubmit' => 'Ilangna blokir iki',
 'unblocked' => 'Blokir marang [[User:$1|$1]] wis dijabel',
+'unblocked-range' => '$1 ora diblokir manèh',
 'unblocked-id' => 'Blokir $1 wis dijabel',
-'ipblocklist' => 'Daftar alamat-alamat IP lan para panganggo sing diblokir',
+'blocklist' => 'Panganggo diblokir',
+'ipblocklist' => 'Panganggo diblokir',
 'ipblocklist-legend' => 'Golèk panganggo sing diblokir',
+'blocklist-userblocks' => 'Dhelikaké blokiran akun',
+'blocklist-tempblocks' => 'Dhelikaké blokiran sawetara',
+'blocklist-addressblocks' => 'Dhelikaké blokiran IP tunggal',
+'blocklist-rangeblocks' => 'Dhelikaké adohé blokiran',
+'blocklist-timestamp' => 'Cap wektu',
+'blocklist-target' => 'Patujon',
+'blocklist-expiry' => 'Kedaluwarsa',
+'blocklist-by' => 'Pangurus pamblokir',
+'blocklist-params' => 'Paramèter blokiran',
+'blocklist-reason' => 'Alesan',
 'ipblocklist-submit' => 'Golèk',
 'ipblocklist-localblock' => 'Blokade lokal',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|Blokiran|Blokiran}} liya',
 'infiniteblock' => 'salawasé',
 'expiringblock' => 'kadaluwarsa ing $1, $2',
 'anononlyblock' => 'namung anon',
@@ -2036,8 +2342,13 @@ Pirsani [[Special:BlockList|Daftar blokir IP]] kanggo ninjo ulang pamblokiran.',
 'unblocklink' => 'jabel blokir',
 'change-blocklink' => 'owahi blokir',
 'contribslink' => 'sumbangan',
+'emaillink' => 'kirim layang èlèktronik',
 'autoblocker' => 'Panjenengan otomatis dipun-blok amargi nganggé alamat protokol internet (IP) ingkang sami kaliyan "[[User:$1|$1]]". Alesanipun $1 dipun blok inggih punika "\'\'\'$2\'\'\'"',
 'blocklogpage' => 'Log pamblokiran',
+'blocklog-showlog' => 'Panganggo iki wis tau diblokir sakdurungé.
+Log blokiran sumadhiya nèng ngisor kanggo rujukan:',
+'blocklog-showsuppresslog' => 'Panganggo iki wis tau diblokir lan didhelikaké sakdurungé.
+Log brèdèlan sumadhiya nèng ngisor kanggo rujukan:',
 'blocklogentry' => 'mblokir "[[$1]]" dipun watesi wedalipun $2 $3',
 'reblock-logentry' => 'Ngowahi sèting pamblokiran [[$1]] kanthi wektu daluwarsa $2 $3',
 'blocklogtext' => 'Ing ngisor iki kapacak log pamblokiran lan panjabelan blokir panganggo.
@@ -2057,9 +2368,12 @@ Mangga mirsani [[Special:BlockList|daftar alamat IP sing diblokir]] kanggo dafta
 'ipb_hide_invalid' => 'Ora bisa ndhelikaké akun iki; manawa wis kakèhan suntingan.',
 'ipb_already_blocked' => '"$1" wis diblokir',
 'ipb-needreblock' => '$1 wis diblokir. Apa panjenengan sedya ngowahi patrapan blokiran kasebut?',
+'ipb-otherblocks-header' => '{{PLURAL:$1|Blokiran|Blokiran}} liya',
+'unblock-hideuser' => 'Sampéyan ora bisa mbukak blokiran panganggo iki amarga jeneng panganggoné didhelikaké.',
 'ipb_cant_unblock' => 'Kaluputan: Blokir mawa ID $1 ora ditemokaké. Blokir iku mbok-menawa wis dibuka.',
 'ipb_blocked_as_range' => 'Kaluputan: IP $1 ora diblokir sacara langsung lan ora bisa dijabel blokiré. IP $1 diblokir mawa bagéyan saka pamblokiran kelompok IP $2, sing bisa dijabel pamblokirané.',
 'ip_range_invalid' => 'Blok IP ora absah.',
+'ip_range_toolarge' => 'Jangkahé blokiran luwih gedhé saka /$1 ora dililakaké.',
 'blockme' => 'Blokiren aku',
 'proxyblocker' => 'Pamblokir proxy',
 'proxyblocker-disabled' => 'Fungsi iki saiki lagi dipatèni.',
@@ -2069,6 +2383,10 @@ Mangga ngubungi sing nyedyakaké dines internèt panjenengan utawa pitulungan t
 'sorbsreason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL.",
 'sorbs_create_account_reason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL. Panjenengan ora bisa nggawé akun utawa rékening.",
 'cant-block-while-blocked' => 'Panjenengan ora bisa mblokir panganggo liya nalika panjenengan dhéwé pinuju diblokir.',
+'cant-see-hidden-user' => 'Panganggo sing Sampéyan coba blokir wis kablokir lan didhelikaké.
+Amarga Sampéyan ora nduwé hak ndhelikaké panganggo, Sampéyan ora bisa ndelok utawa nyunting blokiran panganggo.',
+'ipbblocked' => 'Sampéyan ora bisa mblokir utawa mbukak blokiran panganggo liya amarga Sampéyan dhéwé diblokir',
+'ipbnounblockself' => 'Sampéyan ora dililakaké mbukak blokirané Sampéyan',
 
 # Developer tools
 'lockdb' => 'Kunci basis data',
@@ -2088,6 +2406,7 @@ Tulung pastèkna yèn iki pancèn sing panjenengan gayuh.',
 'unlockdbsuccesstext' => 'Kunci basis data wis dibuka.',
 'lockfilenotwritable' => 'Berkas kunci basis data ora bisa ditulis. Kanggo ngunci utawa mbuka basis data, berkas iki kudu ditulis déning server wèb.',
 'databasenotlocked' => 'Basis data ora dikunci.',
+'lockedbyandtime' => '(déning {{GENDER:$1|$1}} tanggal $2 wanci $3)',
 
 # Move page
 'move-page' => 'Pindhahna $1',
@@ -2106,6 +2425,7 @@ pastekaké dhisik panjenengan ngerti konsekwènsi saka panggayuh panjenengan sad
 
 Ing kasus-kasus iku, yèn panjenengan gayuh, panjenengan bisa mindhahaké utawa nggabung kaca iku sacara manual.",
 'movearticle' => 'Pindhah kaca',
+'moveuserpage-warning' => "'''Pèngetan:''' Sampéyan arep mindhahaké kaca panganggo. Mangga cathet yèn namung kaca sing bakal dipindhahaké lan panganggo '''ora''' bakal diganti jenengé.",
 'movenologin' => 'Durung mlebu log',
 'movenologintext' => 'Panjenengan kudu dadi panganggo sing wis ndaftar lan wis [[Special:UserLogin|mlebu log]] kanggo mindhah kaca.',
 'movenotallowed' => 'Panjenengan ora pareng ngalihaké kaca.',
@@ -2143,7 +2463,7 @@ Ing kasus-kasus iku, yèn panjenengan gayuh, panjenengan bisa mindhahaké utawa
 Artikel sing dituju, "[[:$1]]", wis ana isiné.
 Apa panjenengan kersa mbusak iku supaya kacané bisa dialihaké?',
 'delete_and_move_confirm' => 'Ya, busak kaca iku.',
-'delete_and_move_reason' => 'Dibusak kanggo antisipasi pangalihan kaca',
+'delete_and_move_reason' => 'Dibusak kanggo jaga-jaga ananing pamindhahan saka "[[$1]]"',
 'selfmove' => 'Pangalihan kaca ora bisa dilakoni amerga irah-irahan utawa judhul sumber lan tujuané padha.',
 'immobile-source-namespace' => 'Ora bisa mindhahaké kaca jroning bilik jeneng "$1"',
 'immobile-target-namespace' => 'Ora bisa mindhahaké kaca menyang bilik jeneng "$1"',
@@ -2151,6 +2471,7 @@ Apa panjenengan kersa mbusak iku supaya kacané bisa dialihaké?',
 'immobile-source-page' => 'Kaca iki ora bisa dipindhahaké.',
 'immobile-target-page' => 'Ora bisa mindhahaké menyang irah-irahan tujuan kasebut.',
 'imagenocrossnamespace' => 'Ora bisa mindhahaké gambar menyang bilik nama non-gambar',
+'nonfile-cannot-move-to-file' => 'Ora bisa mindhahaké non-berkas nèng bilik jeneng berkas',
 'imagetypemismatch' => 'Èkstènsi anyar berkas ora cocog karo jenisé',
 'imageinvalidfilename' => 'Jeneng berkas tujuan ora sah',
 'fix-double-redirects' => 'Dandani kabèh pangalihan gandha sing tumuju marang irah-irahan asli',
@@ -2159,6 +2480,10 @@ Apa panjenengan kersa mbusak iku supaya kacané bisa dialihaké?',
 Cathetan entri pungkasan disadiakaké ing ngisor kanggo referensi:",
 'semiprotectedpagemovewarning' => "'''Cathetan:''' Kaca iki wis direksa saéngga mung panganggo kadhaptar sing bisa mindhahaké.
 Entri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
+'move-over-sharedrepo' => '== Berkas wis ana ==
+[[:$1]] ana ing panyimpenan bebarengan. Mindhahaké berkas mawa judul iki bakal nibani berkas bebarengan.',
+'file-exists-sharedrepo' => 'Jeneng berkas kapilih wis ana kanggo nèng panyimpenan bebarengan.
+Mangga pilih jeneng liya.',
 
 # Export
 'export' => 'Ekspor kaca',
@@ -2167,9 +2492,11 @@ Entri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
 Kanggo ngèkspor kaca-kaca artikel, lebokna irah-irahan utawa judhul sajroning kothak tèks ing ngisor iki, irah-irahan utawa judhul siji per baris, lan pilihen apa panjenengan péngin ngèkspor jangkep karo vèrsi sadurungé, utawa namung vèrsi saiki mawa cathetan panyuntingan pungkasan.
 
 Yèn panjenengan namun péngin ngimpor vèrsi pungkasan, panjenengan uga bisa nganggo pranala kusus, contoné [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] kanggo ngèkspor artikel "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Ngèkspor kabèh kaca',
 'exportcuronly' => 'Namung èkspor révisi saiki, dudu kabèh vèrsi lawas',
 'exportnohistory' => "----
 '''Cathetan:''' Ngèkspor kabèh sajarah suntingan kaca ngliwati formulir iki wis dinon-aktifaké déning alesan kinerja.",
+'exportlistauthors' => 'Lebokaké daptar jangkep kontributor kanggo pendhak kaca',
 'export-submit' => 'Èkspor',
 'export-addcattext' => 'Tambahna kaca saka kategori:',
 'export-addcat' => 'Tambahna',
@@ -2202,6 +2529,8 @@ Mangga pirsani [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] la
 'thumbnail_error' => "Kaluputan nalika nggawé gambar cilik (''thumbnail''): $1",
 'djvu_page_error' => "Kaca DjVu ana ing sajabaning ranggèhan (''range'')",
 'djvu_no_xml' => 'Ora bisa njupuk XML kanggo berkas DjVu',
+'thumbnail-temp-create' => 'Ora bisa nggawé berkas gambar mini sawetara',
+'thumbnail-dest-create' => 'Ora bisa nyimpen bambar mini nèng papan patujon',
 'thumbnail_invalid_params' => "Paramèter gambar cilik (''thumbnail'') ora absah",
 'thumbnail_dest_directory' => 'Ora bisa nggawé dirèktori tujuan',
 'thumbnail_image-type' => 'Tipe gambar ora didhukung',
@@ -2221,11 +2550,12 @@ Kabèh aktivitas impor transwiki bakal dilog ing [[Special:Log/import|log impor]
 'import-interwiki-namespace' => 'Bilik jeneng tujuan:',
 'import-upload-filename' => 'Jeneng berkas:',
 'import-comment' => 'Komentar:',
-'importtext' => "Mangga ngèkspor berkas saka wiki sumber nganggo [[Special:Export|piranti èkspor]].
-Simpenen ing cakram padhet (''harddisk'') panjenengan lan unggahna ing kéné.",
+'importtext' => 'Mangga èkspor berkas saka wiki sumber nganggo [[Special:Export|prangkat èkspor]].
+Simpen nèng komputer Sampéyan lan unggaha nèng kéné.',
 'importstart' => 'Ngimpor kaca...',
 'import-revision-count' => '$1 {{PLURAL:$1|révisi|révisi-révisi}}',
 'importnopages' => 'Ora ana kaca kanggo diimpor.',
+'imported-log-entries' => 'Ngimpor $1 {{PLURAL:$1|èntri log|èntri log}}.',
 'importfailed' => 'Impor gagal: $1',
 'importunknownsource' => 'Sumber impor ora ditepungi',
 'importcantopen' => 'Berkas impor ora bisa dibukak',
@@ -2245,6 +2575,11 @@ Simpenen ing cakram padhet (''harddisk'') panjenengan lan unggahna ing kéné.",
 'import-upload' => 'Ngunggahaké data XML',
 'import-token-mismatch' => 'Kélangan data sèsi. Mangga dijajal manèh.',
 'import-invalid-interwiki' => 'Ora bisa ngimport saka wiki sing kapilih.',
+'import-error-edit' => 'Kaca "$1" ora diimpor amarga Sampéyan ora dililakaké nyunting kuwi.',
+'import-error-create' => 'Kaca "$1" ora diimpor amarga Sampéyan ora dililakaké nggawé kuwi.',
+'import-error-interwiki' => 'Kaca "$1" ora diimpor amarga jenengé dicadhangaké kango pranala njaba (interwiki).',
+'import-error-special' => 'Kaca "$1" ora diimpor amarga kuwi kalebu nèng bilik jeneng kusus sing ora nglilakaké anané kaca.',
+'import-error-invalid' => 'Kaca "$1" ora diimpor amarga jenengé ora sah.',
 
 # Import log
 'importlogpage' => 'Log impor',
@@ -2254,6 +2589,17 @@ Simpenen ing cakram padhet (''harddisk'') panjenengan lan unggahna ing kéné.",
 'import-logentry-interwiki' => 'wis nge-transwiki $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|révisi}} saka $2',
 
+# JavaScriptTest
+'javascripttest' => 'Panjajalan JavaScript',
+'javascripttest-disabled' => 'Fungsi iki durung diurubaké nèng wiki iki.',
+'javascripttest-title' => 'Nglakokaké pangujian $1',
+'javascripttest-pagetext-noframework' => 'Kaca iki disadhiyakaké kanggo nglakokaké panjajalan JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Rangka kerja panjajalan ora dingertèni "$1".',
+'javascripttest-pagetext-frameworks' => 'Mangga pilih sawiji saka rangka kerja panjajalan iki: $1',
+'javascripttest-pagetext-skins' => 'Pilih kulit kanggo nglakokaké panjajalan mawa:',
+'javascripttest-qunit-intro' => 'Delok [dhokumèntasi panjajalan $1] nèng mediawiki.org.',
+'javascripttest-qunit-heading' => 'Rangkéan panjajalan MediaWiki JavaScript QUnit',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Kaca panganggo panjenengan',
 'tooltip-pt-anonuserpage' => 'Kaca panganggo IP panjenengan',
@@ -2271,6 +2617,7 @@ Simpenen ing cakram padhet (''harddisk'') panjenengan lan unggahna ing kéné.",
 'tooltip-ca-viewsource' => 'Kaca iki direksa. Panjenengan namung bisa mirsani sumberé.',
 'tooltip-ca-history' => 'Vèrsi-vèrsi sadurungé saka kaca iki.',
 'tooltip-ca-protect' => 'Reksa kaca iki',
+'tooltip-ca-unprotect' => 'Ganti panjagan kaca iki',
 'tooltip-ca-delete' => 'Busak kaca iki',
 'tooltip-ca-undelete' => 'Balèkna suntingan ing kaca iki sadurungé kaca iki dibusak',
 'tooltip-ca-move' => 'Pindhahen kaca iki',
@@ -2313,10 +2660,14 @@ Simpenen ing cakram padhet (''harddisk'') panjenengan lan unggahna ing kéné.",
 'tooltip-diff' => 'Tuduhna owah-owahan panjenengan ing tèks iki.',
 'tooltip-compareselectedversions' => 'Delengen prabédan antara rong vèrsi kaca iki sing dipilih.',
 'tooltip-watch' => 'Tambahna kaca iki ing daftar pangawasan panjenengan',
+'tooltip-watchlistedit-normal-submit' => 'Singkiraké judhul',
+'tooltip-watchlistedit-raw-submit' => 'Anyari daptar pangawasan',
 'tooltip-recreate' => 'Gawéa kaca iki manèh senadyan tau dibusak',
 'tooltip-upload' => 'Miwiti pangunggahan',
 'tooltip-rollback' => 'Mbalèkaké suntingan-suntingan ing kaca iki menyang kontributor pungkasan nganggo sak klik.',
 'tooltip-undo' => 'Mbalèkaké révisi iki lan mbukak kothak panyuntingan jroning mode pratayang. Wènèhi kasempatan kanggo ngisi alesan ing kothak ringkesan.',
+'tooltip-preferences-save' => 'Simpen préperensi',
+'tooltip-summary' => 'Lebkaké ringkesan cedhèk',
 
 # Metadata
 'notacceptable' => 'Server wiki ora bisa nyedyakaké data sajroning format sing bisa diwaca déning klièn panjenengan.',
@@ -2324,10 +2675,12 @@ Simpenen ing cakram padhet (''harddisk'') panjenengan lan unggahna ing kéné.",
 # Attribution
 'anonymous' => '{{PLURAL:$1|Panganggo|panganggo}} anon ing {{SITENAME}}.',
 'siteuser' => 'Panganggo {{SITENAME}} $1',
+'anonuser' => 'Panganggo anonim {{SITENAME}} $1',
 'lastmodifiedatby' => 'Kaca iki pungkasan diowahi  $2, $1 déning $3.',
 'othercontribs' => 'Adhedhasar karyané $1.',
 'others' => 'liya-liyané',
 'siteusers' => '{{PLURAL:$2|Panganggo|Panganggo-panganggo}} {{SITENAME}} $1',
+'anonusers' => '{{PLURAL:$2|Panganggo|Panganggo}} anonim {{SITENAME}} $1',
 'creditspage' => 'Informasi para panulis kaca',
 'nocredits' => 'Ora ana informasi ngenani para panulis ing kaca iki.',
 
@@ -2339,6 +2692,15 @@ Mbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.',
 'spambot_username' => 'Resik-resik spam MediaWiki',
 'spam_reverting' => 'Mbalèkaké menyang vèrsi pungkasan sing ora ana pranalané menyang $1',
 'spam_blanking' => 'Kabèh révisi sing duwé pranala menyang $1, pangosongan',
+'spam_deleting' => 'Kabèh benahan sing nduwé pranala nèng $1, dibusaki',
+
+# Info page
+'pageinfo-title' => 'Inpormasi kanggo "$1"',
+'pageinfo-header-edits' => 'Suntingan',
+'pageinfo-views' => 'Cacahing delokan',
+'pageinfo-watchers' => 'Cacahing pangawas',
+'pageinfo-edits' => 'Cacahing suntingan',
+'pageinfo-authors' => 'Cacahing beda-beda panganggit',
 
 # Patrolling
 'markaspatrolleddiff' => 'Tandhanana wis dipatroli',
@@ -2372,17 +2734,25 @@ $1',
 'nextdiff' => 'Panyuntingan sing luwih anyar →',
 
 # Media information
-'mediawarning' => "'''Pènget:''' Berkas iki mbokmenawa ngandhut kode sing bebayani, yèn dilakokaké sistém panjenengan bisa kena pangaruh ala.",
+'mediawarning' => "'''Pèngetan''': Jinis berkas iki mungkin isiné kodhé mbebayani.
+Yèn dilakokaké, sistem Sampéyan bisa kaserang.",
 'imagemaxsize' => "Wates ukuran gambar:<br />''(kanggo kaca dhèskripsi berkas)''",
 'thumbsize' => 'Ukuran gambar cilik (thumbnail):',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|kaca|kaca}}',
 'file-info' => 'ukuran berkas: $1, tipe MIME: $2',
 'file-info-size' => '$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4',
+'file-info-size-pages' => '$1 × $2 piksel, gedhéné berkas: $3, jinisé MIME: $4, $5 {{PLURAL:$5|kaca|kaca}}',
 'file-nohires' => 'Ora ana résolusi sing luwih dhuwur.',
 'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3',
 'show-big-image' => 'Résolusi kebak',
+'show-big-image-preview' => 'Gedhéné pratayang iki: $1',
+'show-big-image-other' => '{{PLURAL:$2|Résolusi|Résolusi}} liya: $1.',
+'show-big-image-size' => '$1 × $2 piksel',
 'file-info-gif-looped' => 'mubeng',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|rangka|rangka}}',
+'file-info-png-looped' => 'mubeng',
+'file-info-png-repeat' => 'diputer {{PLURAL:$1|ping|ping}} $1',
+'file-info-png-frames' => '$1 {{PLURAL:$1|rangka|rangka}}',
 
 # Special:NewFiles
 'newimages' => 'Galeri berkas anyar',
@@ -2396,6 +2766,13 @@ $1',
 'bydate' => 'miturut tanggal',
 'sp-newimages-showfrom' => 'Tuduhna gambar anyar wiwit saka $2, $1',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 detik|$1 detik}}',
+'minutes' => '{{PLURAL:$1|$1 menit|$1 menit}}',
+'hours' => '{{PLURAL:$1|$1 jam|$1 jam}}',
+'days' => '{{PLURAL:$1|$1 dina|$1 dina}}',
+'ago' => '$1 kapungkur',
+
 # Bad image list
 'bad_image_list' => "Formaté kaya mengkéné:
 
@@ -2456,8 +2833,8 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 'exif-colorspace' => 'Papan werna',
 'exif-componentsconfiguration' => 'Teges saben komponèn',
 'exif-compressedbitsperpixel' => 'Modhe komprèsi gambar',
-'exif-pixelydimension' => 'Jembar gambar sing sah',
-'exif-pixelxdimension' => 'Dhuwur gambar sing sah',
+'exif-pixelydimension' => 'Jembaré gambar',
+'exif-pixelxdimension' => 'Dhuwuré gambar',
 'exif-usercomment' => 'Komentar panganggo',
 'exif-relatedsoundfile' => 'Berkas audio sing kagandhèng',
 'exif-datetimeoriginal' => 'Tanggal lan wektu nggawé data',
@@ -2471,9 +2848,9 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 'exif-exposureprogram' => 'Program pajanan',
 'exif-spectralsensitivity' => 'Sènsitivitas spèktral',
 'exif-isospeedratings' => 'Rating kacepetan ISO',
-'exif-shutterspeedvalue' => 'Kacepatan rana',
-'exif-aperturevalue' => 'Bukaan',
-'exif-brightnessvalue' => 'Kacerahan',
+'exif-shutterspeedvalue' => 'Cepeté rana APEX',
+'exif-aperturevalue' => 'Bukakan APEX',
+'exif-brightnessvalue' => 'Kapadhangan APEX',
 'exif-exposurebiasvalue' => 'Bias pajanan',
 'exif-maxaperturevalue' => 'Bukaan tanah maksimum',
 'exif-subjectdistance' => 'Jarak subjèk',
@@ -2535,10 +2912,77 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 'exif-gpsareainformation' => 'Jeneng wilayah GPS',
 'exif-gpsdatestamp' => 'Tanggal GPS',
 'exif-gpsdifferential' => 'Korèksi diférènsial GPS',
+'exif-jpegfilecomment' => 'Tanggepan berkas JPEG',
+'exif-keywords' => 'Tembung kunci',
+'exif-worldregioncreated' => 'Dhaèrahing donya ing endi gambar dijupuk',
+'exif-countrycreated' => 'Nagara ing endi gambar dijupuk',
+'exif-countrycodecreated' => 'Kodhe kanggo nagara ing endi gambar dijupuk',
+'exif-provinceorstatecreated' => 'Propinsi utawa nagara bagéyan ing endi gambar dujupuk',
+'exif-citycreated' => 'Kutha ing endi gambar dijupuk',
+'exif-sublocationcreated' => 'Dhaérahing kutha ing endi gambar dijupuk',
+'exif-worldregiondest' => 'Wewengkon dunya katampilaké',
+'exif-countrydest' => 'Nagara katampilaké',
+'exif-countrycodedest' => 'Kodhe nagara katampilaké',
+'exif-provinceorstatedest' => 'Propinsi utawa nagara bagéyan katampilaké',
+'exif-citydest' => 'Kutha katampilaké',
+'exif-sublocationdest' => 'Dhaèrahé kutha katampilaké',
+'exif-objectname' => 'Judhul cendhèk',
+'exif-specialinstructions' => 'Prèntah kusus',
+'exif-headline' => 'Warta utama',
+'exif-credit' => 'Krédit/Panyadhiya',
+'exif-source' => 'Sumber',
+'exif-editstatus' => 'Status kapanyuntingan gambar',
+'exif-urgency' => 'Kawigatèn',
+'exif-fixtureidentifier' => 'Jeneng pikstur',
+'exif-locationdest' => 'Panggon digambaraké',
+'exif-locationdestcode' => 'Kodhe dhaérah kagambaraké',
+'exif-objectcycle' => 'Wektu katujon mèdia kuwi',
+'exif-contact' => 'Inpormasi kontak',
+'exif-writer' => 'Panulis',
+'exif-languagecode' => 'Basa',
+'exif-iimversion' => 'Vèrsi IIM',
+'exif-iimcategory' => 'Katègori',
+'exif-iimsupplementalcategory' => 'Katègori tambahan',
+'exif-datetimeexpires' => 'Aja dianggo sakbaré',
+'exif-datetimereleased' => 'Dimetukaké ing',
+'exif-originaltransmissionref' => 'Kodhe panggon transmisi asli',
+'exif-identifier' => 'Pangenal',
+'exif-lens' => 'Lénsa sing dianggo',
+'exif-serialnumber' => 'Nomer seri kaméra',
+'exif-cameraownername' => 'Sing nduwé kaméra',
+'exif-label' => 'Labèl',
+'exif-datetimemetadata' => 'Tanggal pungkasan metadata diowah',
+'exif-nickname' => 'Jeneng ora resminé gambar',
+'exif-rating' => 'Biji (saka 5)',
+'exif-rightscertificate' => 'Sertipikat pranata hak',
+'exif-copyrighted' => 'Status hak cipta',
+'exif-copyrightowner' => 'Sing ndarbèni hak cipta',
+'exif-usageterms' => 'Katemton panganggoan',
+'exif-webstatement' => 'Pranyatan hak cipta online',
+'exif-originaldocumentid' => 'ID unik dokumèn asli',
+'exif-licenseurl' => 'URL kanggo lisènsi hak cipta',
+'exif-morepermissionsurl' => 'Inpormasi lisènsi alternatip',
+'exif-attributionurl' => 'Nalika nganggo manèh karya iki, mangga ubungaké nèng',
+'exif-preferredattributionname' => 'Nalika nganggo manèh karya iki, mangga awèhi krèdit',
+'exif-pngfilecomment' => 'Tanggepan berkas PNG',
+'exif-disclaimer' => 'Pamaidonan',
+'exif-contentwarning' => 'Pèngetan kontèn',
+'exif-giffilecomment' => 'Tanggepan berkas GIF',
+'exif-intellectualgenre' => 'Jinis barang',
+'exif-subjectnewscode' => 'Aturan jejer',
+'exif-scenecode' => 'Aturan adegan IPTC',
+'exif-event' => 'Kadadéan digambaraké',
+'exif-organisationinimage' => 'Organisasi digambaraké',
+'exif-personinimage' => 'Uwong digambaraké',
+'exif-originalimageheight' => 'Dhuwuré gambar sakdurungé dikethok',
+'exif-originalimagewidth' => 'Jembaré gambar sakdurungé dikethok',
 
 # EXIF attributes
 'exif-compression-1' => 'Ora dikomprèsi',
 
+'exif-copyrighted-true' => 'Mawa hak cipta',
+'exif-copyrighted-false' => 'Domain umum',
+
 'exif-unknowndate' => 'Tanggal ora dingertèni',
 
 'exif-orientation-1' => 'Normal',
@@ -2546,13 +2990,15 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 'exif-orientation-3' => 'Diputer 180°',
 'exif-orientation-4' => 'Baliken sacara vèrtikal',
 'exif-orientation-5' => 'Diputer 90° nglawan arah dom jam dan dibalik sacara vèrtikal',
-'exif-orientation-6' => 'Diputer 90° miturut arah dom jam',
+'exif-orientation-6' => 'Puter 90° lawan arah dom jam',
 'exif-orientation-7' => 'Diputer 90° miturut arah dom jam lan diwalik sacara vèrtikal',
-'exif-orientation-8' => 'Diputer 90° miturut lawan arah dom jam',
+'exif-orientation-8' => 'Puter 90° saarah dom jam',
 
 'exif-planarconfiguration-1' => "format ''chunky'' (kumothak)",
 'exif-planarconfiguration-2' => 'format planar',
 
+'exif-colorspace-65535' => 'Ora dikalibrasi',
+
 'exif-componentsconfiguration-0' => 'ora ana',
 
 'exif-exposureprogram-0' => 'Ora didéfinisi',
@@ -2616,6 +3062,8 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 'exif-sensingmethod-7' => 'Sènsor trilinéar',
 'exif-sensingmethod-8' => 'Sènsor linéar werna urut-urutan',
 
+'exif-filesource-3' => 'Kaméra meneng digital',
+
 'exif-scenetype-1' => 'Gambar foto langsung',
 
 'exif-customrendered-0' => 'Prosès normal',
@@ -2664,6 +3112,10 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 'exif-gpslongitude-e' => 'Bujur wétan',
 'exif-gpslongitude-w' => 'Bujur kulon',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|mèter|mèter}} ndhuwur segara',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|mèter|mèter}} ngisor segara',
+
 'exif-gpsstatus-a' => 'Pangukuran lagi dilakoni',
 'exif-gpsstatus-v' => 'Interoperabilitas pangukuran',
 
@@ -2675,10 +3127,63 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 'exif-gpsspeed-m' => 'Mil per jam',
 'exif-gpsspeed-n' => 'Knot',
 
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Kilomèter',
+'exif-gpsdestdistance-m' => 'Mil',
+'exif-gpsdestdistance-n' => 'Mil segara',
+
+'exif-gpsdop-excellent' => 'Apik banget ($1)',
+'exif-gpsdop-good' => 'Apik ($1)',
+'exif-gpsdop-moderate' => 'Sedhengan ($1)',
+'exif-gpsdop-fair' => 'Cukup ($1)',
+'exif-gpsdop-poor' => 'Èlèk ($1)',
+
+'exif-objectcycle-a' => 'Èsuk thok',
+'exif-objectcycle-p' => 'Mbengi thok',
+'exif-objectcycle-b' => 'Èsuk lan mbengi',
+
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Arah sejati',
 'exif-gpsdirection-m' => 'Arah magnètis',
 
+'exif-ycbcrpositioning-1' => 'Kapusat',
+
+'exif-dc-contributor' => 'Kontributor',
+'exif-dc-coverage' => 'Cakepan latar utawa wektu média',
+'exif-dc-date' => 'Tanggal',
+'exif-dc-publisher' => 'Panyithak',
+'exif-dc-relation' => 'Média kakait',
+'exif-dc-rights' => 'Hak',
+'exif-dc-source' => 'Mèdia sumber',
+'exif-dc-type' => 'Jinisé média',
+
+'exif-rating-rejected' => 'Ditolak',
+
+'exif-isospeedratings-overflow' => 'Luwih saka 65535',
+
+'exif-iimcategory-ace' => 'Seni, budhaya lan dolanan',
+'exif-iimcategory-clj' => 'Kriminal lan ukum',
+'exif-iimcategory-dis' => 'Musibah lan kacilakan',
+'exif-iimcategory-fin' => 'Èkonomi lan bisnis',
+'exif-iimcategory-edu' => 'Pandhidhikan',
+'exif-iimcategory-evn' => 'Lingkungan',
+'exif-iimcategory-hth' => 'Kasehatan',
+'exif-iimcategory-hum' => 'Kasenengan manungsa',
+'exif-iimcategory-lab' => 'Buruh',
+'exif-iimcategory-lif' => 'Gaya urip lan peprèian',
+'exif-iimcategory-pol' => 'Politik',
+'exif-iimcategory-rel' => 'Agama lan kapitayan',
+'exif-iimcategory-sci' => 'Èlmu lan tehnologi',
+'exif-iimcategory-soi' => 'Bab masarakat',
+'exif-iimcategory-spo' => 'Krida',
+'exif-iimcategory-war' => 'Perang, cengkah, rusuh',
+'exif-iimcategory-wea' => 'Mangsa',
+
+'exif-urgency-normal' => 'Sedhengan ($1)',
+'exif-urgency-low' => 'Cendhèk ($1)',
+'exif-urgency-high' => 'Dhuwur ($1)',
+'exif-urgency-other' => 'Prioritas sing ditetepaké panganggo ($1)',
+
 # External editor support
 'edit-externally' => 'Sunting berkas iki mawa aplikasi jaba',
 'edit-externally-help' => '(Deleng [//www.mediawiki.org/wiki/Manual:External_editors instruksi pangaturan] kanggo informasi sabanjuré)',
@@ -2734,6 +3239,7 @@ Konfirmasi iki bakal kadaluwarsa ing $4.',
 'confirmrecreate' => "Panganggo [[User:$1|$1]] ([[User talk:$1|Wicara]]) wis mbusak kaca iki nalika panjenengan miwiti panyuntingan mawa alesan:
 : ''$2''
 Mangga didhedhes (dikonfirmasi) menawa panjenengan kersa nggawé ulang kaca iki.",
+'confirmrecreate-noreason' => 'Panganggo [[User:$1|$1]] ([[User talk:$1|wicara]]) mbusak kaca iki sakbaré Sampéyan lekas nyunting. Mangga pesthèkaké yèn Sampéyan pancen pingin tenan nggawé manèh kaca iki.',
 'recreate' => 'Gawé ulang',
 
 # action=purge
@@ -2741,6 +3247,12 @@ Mangga didhedhes (dikonfirmasi) menawa panjenengan kersa nggawé ulang kaca iki.
 'confirm-purge-top' => "Busak ''cache'' kaca iki?",
 'confirm-purge-bottom' => 'Ngresiki kaca bakal sekaligus mbusak singgahan lan nampilaké vèrsi kaca pungkasan.',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'Oké',
+'confirm-watch-top' => 'Tambahaké kaca iki nènh daptar pangawasan Sampéyan?',
+'confirm-unwatch-button' => 'Oké',
+'confirm-unwatch-top' => 'Singkiraké kaca iki saka daptar pangawasan Sampéyan?',
+
 # Multipage image navigation
 'imgmultipageprev' => '&larr; kaca sadurungé',
 'imgmultipagenext' => 'kaca sabanjuré →',
@@ -2755,6 +3267,7 @@ Mangga didhedhes (dikonfirmasi) menawa panjenengan kersa nggawé ulang kaca iki.
 'table_pager_first' => 'Kaca kapisan',
 'table_pager_last' => 'Kaca pungkasan',
 'table_pager_limit' => 'Tuduhna $1 entri per kaca',
+'table_pager_limit_label' => 'Barang per kaca:',
 'table_pager_limit_submit' => 'Golèk',
 'table_pager_empty' => 'Ora ditemokaké',
 
@@ -2801,6 +3314,9 @@ Panjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan
 'watchlisttools-edit' => 'Tuduhna lan sunting daftar pangawasan',
 'watchlisttools-raw' => 'Sunting daftar pangawasan mentah',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|wicara]])',
+
 # Core parser functions
 'unknown_extension_tag' => 'Tag èkstènsi ora ditepungi "$1"',
 'duplicate-defaultsort' => 'Pènget: Kunci pilih asal (\'\'Default sort key\'\') "$2" nggantèkaké kunci pilih asal sadurungé "$1".',
@@ -2811,6 +3327,8 @@ Panjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan
 'version-specialpages' => 'Kaca astaméwa (kaca kusus)',
 'version-parserhooks' => 'Canthèlan parser',
 'version-variables' => 'Variabel',
+'version-antispam' => 'Pambendhung spam',
+'version-skins' => 'Kulit',
 'version-other' => 'Liyané',
 'version-mediahandlers' => 'Pananganan média',
 'version-hooks' => 'Canthèlan-canthèlan',
@@ -2821,9 +3339,14 @@ Panjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan
 'version-hook-subscribedby' => 'Dilanggani déning',
 'version-version' => '(Vèrsi $1)',
 'version-license' => 'Lisènsi',
+'version-poweredby-credits' => "Wiki iki disengkuyung déning '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
+'version-poweredby-others' => '[{{SERVER}}{{SCRIPTPATH}}/KRÈDIT liyané]',
 'version-software' => "''Software'' wis diinstalasi",
 'version-software-product' => 'Prodhuk',
 'version-software-version' => 'Vèrsi',
+'version-entrypoints' => 'URL tithik lebon',
+'version-entrypoints-header-entrypoint' => 'Tithik lebon',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Lokasi berkas',
@@ -2841,16 +3364,16 @@ Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka lan
 'fileduplicatesearch-info' => '$1 × $2 piksel<br />Ukuran berkas: $3<br />Tipe MIME: $4',
 'fileduplicatesearch-result-1' => 'Berkas "$1" ora duwé duplikat idèntik.',
 'fileduplicatesearch-result-n' => 'Berkas "$1" ora ndarbèni {{PLURAL:$2|1 duplikat idèntik|$2 duplikat idèntik}}.',
+'fileduplicatesearch-noresults' => 'Ora ana berkas mawa jeneng "$1" ditemokaké.',
 
 # Special:SpecialPages
 'specialpages' => 'Kaca istiméwa',
 'specialpages-note' => '----
-Katrangan tampilan:
-* Kaca astamèwa normal
-* <strong class="mw-specialpagerestricted">Kaca astamèwa winates</strong>',
+* Kaca astamiwa biasa.
+* <span class="mw-specialpagerestricted">Kaca astamiwa kawatesan.</span>',
 'specialpages-group-maintenance' => 'Lapuran pangopènan',
 'specialpages-group-other' => 'Kaca-kaca astaméwa liyané',
-'specialpages-group-login' => 'Mlebu log / ndaftar',
+'specialpages-group-login' => 'Mlebu log / nggawé akun',
 'specialpages-group-changes' => 'Owah-owahan pungkasan lan log',
 'specialpages-group-media' => 'Lapuran média lan pangunggahan',
 'specialpages-group-users' => 'Panganggo lan hak-haké',
@@ -2894,6 +3417,10 @@ Katrangan tampilan:
 'compare-page2' => 'Kaca 2',
 'compare-rev1' => 'Révisi 1',
 'compare-rev2' => 'Révisi 2',
+'compare-submit' => 'Bandingaké',
+'compare-invalid-title' => 'Judhul sing Sampéyan awèhaké ora sah.',
+'compare-title-not-exists' => 'Judhul sing Sampéyan jaluk ora ana.',
+'compare-revision-not-exists' => 'Benahan sing Sampéyan jaluk ora ana.',
 
 # Database error messages
 'dberr-header' => 'Wiki iki duwé masalah',
@@ -2911,13 +3438,113 @@ Katrangan tampilan:
 'htmlform-float-invalid' => 'Sing panjenengan lebokaké dudu angka.',
 'htmlform-int-toolow' => 'Aji sing panjenengan lebokaké keciliken ing sangisoré aji minimum $1',
 'htmlform-int-toohigh' => 'Aji sing panjenengan lebokaké kegedhèn ngluwihi aji maksimum $1',
+'htmlform-required' => 'Nilé iki dibutuhaké',
 'htmlform-submit' => 'Kirim',
 'htmlform-reset' => 'Batalna pangowahan',
 'htmlform-selectorother-other' => 'Liya',
 
+# SQLite database support
+'sqlite-has-fts' => '$1 mawa sengkuyungan golèkan tèks jangkep',
+'sqlite-no-fts' => '$1 tanpa sengkuyungan golèkan tèks jangkep',
+
 # New logging system
+'logentry-delete-delete' => '$1 mbusak kaca $3',
+'logentry-delete-restore' => '$1 mbalèkaké kaca $3',
+'logentry-delete-event' => '$1 ngganti patampilan {{PLURAL:$5|sak kadadéan log|$5 kadadéan log}} nèng $3: $4',
+'logentry-delete-revision' => '$1 ngganti patampilan {{PLURAL:$5|sak pambenahan|$5 pambenahan}} nèng kaca $3: $4',
+'logentry-delete-event-legacy' => '$1 ngganti patampilan saka kadadéan log nèng $3',
+'logentry-delete-revision-legacy' => '$1 ngganti patampilan saka pambenahan nèng kaca $3',
+'logentry-suppress-delete' => '$1 neken kaca $3',
+'logentry-suppress-event' => '$1 ndhelik-ndhelik ngganti patampilan saka {{PLURAL:$5|sak kadadéan log|$5 kadadéan log}} nèng $3: $4',
+'logentry-suppress-revision' => '$1 ndhelik-ndhelik ngganti patampilan saka {{PLURAL:$5|sak pambenahan|$5 pambenahan}} nèng kaca $3: $4',
+'logentry-suppress-event-legacy' => '$1 ndhelik-ndhelik ngganti patampilan saka kadadéan log nèng $3',
+'logentry-suppress-revision-legacy' => '$1 ndhelik-ndhelik ngganti patampilan saka pambenahan nèng kaca $3',
+'revdelete-content-hid' => 'kontèn didhelikaké',
+'revdelete-summary-hid' => 'ringkesan suntingan didhelikaké',
+'revdelete-uname-hid' => 'jeneng panganggo didhelikaké',
+'revdelete-content-unhid' => 'kontèn dituduhaké',
+'revdelete-summary-unhid' => 'ringkesan suntingan dituduhaké',
+'revdelete-uname-unhid' => 'jeneng panganggo dituduhaké',
 'revdelete-restricted' => 'rèstriksi ditrapaké marang para opsis',
 'revdelete-unrestricted' => 'rèstriksi marang para opsis dijabel',
+'logentry-move-move' => '$1 mindhahaké kaca $3 nèng $4',
+'logentry-move-move-noredirect' => '$1 mindhahaké kaca $3 nèng $4 tanpa nginggalaké pangalihan',
+'logentry-move-move_redir' => '$1 mindhahaké kaca $3 nèng $4 ngliwati pangalihan',
+'logentry-move-move_redir-noredirect' => '$1 mindhahaké kaca $3 nèng $4 ngliwati pangalihan tanpa nginggalaké pangalihan',
+'logentry-patrol-patrol' => '$1 nandhai benahan $4 saka kaca $3 kaawasi',
+'logentry-patrol-patrol-auto' => '$1 otomatis nandhai benahan $4 saka kaca $3 kaawasai',
+'logentry-newusers-newusers' => '$1 nggawé akun panganggo',
+'logentry-newusers-create' => '$1 nggawé akun panganggo',
+'logentry-newusers-create2' => '$1 nggawé akun panganggo $3',
+'logentry-newusers-autocreate' => 'Akun $1 digawé otomatis',
 'newuserlog-byemail' => 'tembung sandhi wis dikirim liwat e-mail',
 
+# Feedback
+'feedback-bugornote' => 'Yèn Sampéyan siap njelasaké masalah tèhnis kanthi rinci mangga [$1 laporaké bug].
+Utawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal ditambahaké nèng kaca "[$3 $2]", bebarengan karo jeneng panganggo Sampéyan lan pramban sing Sampéyan anggo.',
+'feedback-subject' => 'Jejer:',
+'feedback-message' => 'Layang:',
+'feedback-cancel' => 'Batal',
+'feedback-submit' => 'Kirim Lebon Saran',
+'feedback-adding' => 'Nambahaké lebon saran nèng kaca...',
+'feedback-error1' => 'Kasalahan: Asil ora dikenal saka API',
+'feedback-error2' => 'Kasalahan: Gagal nyunting',
+'feedback-error3' => 'Kasalahan: Ora ana tanggepan saka API',
+'feedback-thanks' => 'Nuwun! Lebon saran Sampéyan wis dipasang nèng kacané "[$2 $1]".',
+'feedback-close' => 'Rampung',
+'feedback-bugcheck' => 'Apik! Pesthèké kuwi dudu sawijining [$1 bug sing dingertèni].',
+'feedback-bugnew' => 'Aku wis mriksa. Kandakaké bug anyar',
+
+# API errors
+'api-error-badaccess-groups' => 'Sampéyan ora dililakaké ngunggah berkas nèng wiki iki.',
+'api-error-badtoken' => 'Kasalahan njero: Token èlèk.',
+'api-error-copyuploaddisabled' => 'Ngunggah saka URL dipatèni nèng sasana iki.',
+'api-error-duplicate' => 'Ana {{PLURAL:$1|[$2 berkas liya]|[$2 pirang-pirang berkas liya]}} sing wis ana nèng situsé saha isiné padha.',
+'api-error-duplicate-archive' => 'Ana {{PLURAL:$1|[$2 berkas liya]|[$2 pirang-pirang berkas liya]}} sing wis ana nèng situsé saha isiné padha, nanging {{PLURAL:$1|kuwi|kuwi kabèh}} wis dibusak.',
+'api-error-duplicate-archive-popup-title' => 'Gandhakaké {{PLURAL:$1berkas sing wis|berkas sing wis}} dibusak.',
+'api-error-duplicate-popup-title' => 'Gandhakaké {{PLURAL:$1berkas|berkas}}.',
+'api-error-empty-file' => 'Berkas sing Sampéyan kirim kosong.',
+'api-error-emptypage' => 'Nggawé kaca kosong anyar ora dilikaké.',
+'api-error-fetchfileerror' => 'Kasalahan njero: Ana sing salah nalika ngètukaké berkas iki.',
+'api-error-fileexists-forbidden' => 'Berkas mawa jeneng "$1" wis ana, lan ora bisa diganti.',
+'api-error-fileexists-shared-forbidden' => 'Berkas mawa jeneng "$1" wis ana nèng gudhang berkas bebarengan, lan ora bisa diganti.',
+'api-error-file-too-large' => 'Berkas sing Sampéyan kirim kagedhèn.',
+'api-error-filename-tooshort' => 'Jeneng berkas kacendhèken.',
+'api-error-filetype-banned' => 'Jinis berkas iki dilarang.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|dudu jinis berkas sing dililakaké|dudu jinis berkas sing dililakaké}}. {{PLURAL:$3|Jinis berkas|Jinis berkas}} sing dililakaké $2.',
+'api-error-filetype-missing' => 'Jeneng berkas ora nduwèni èkstènsi.',
+'api-error-hookaborted' => 'Pangowahan sing Sampéyan coba dibatalaké déning èkstènsi.',
+'api-error-http' => 'Kasalahan njero: Ora bisa ngubungi sasana.',
+'api-error-illegal-filename' => 'Jeneng berkas ora dililakaké.',
+'api-error-internal-error' => 'Kasalahan njero: Ana sing salah saka pamrosèsan unggahan Sampéyan nèng wiki.',
+'api-error-invalid-file-key' => 'Kasalahan njero: Berkas ora ditemokaké nèng panyimpenan sawetara.',
+'api-error-missingparam' => 'Kasalahan njero: Paramètèr panjalukan ilang.',
+'api-error-missingresult' => 'Kasalahan njero: Ora bisa mesthèkaké yèn nyaliné suksès.',
+'api-error-mustbeloggedin' => 'Sampéyan kudu mlebu log kanggo ngunggah berkas.',
+'api-error-mustbeposted' => 'Kasalahan njero: Panjalukan mbutuhaké HTTP POST.',
+'api-error-noimageinfo' => 'Ngunggah suksès. nanging sasana ora ngawèhi awak dhéwé katrangan bab berkas kuwi.',
+'api-error-nomodule' => 'Kasalahan njero: Ora ana modul ngunggah sing dipatrapaké.',
+'api-error-ok-but-empty' => 'Kasalahan njero: Ora ana tanggepan saka sasana.',
+'api-error-overwrite' => 'Nibani berkas sing wis ana ora dililakaké.',
+'api-error-stashfailed' => 'Kasalahan njero: Sasana gagal nyèlèhaké berkas sawetara.',
+'api-error-timeout' => 'Sasana ora nanggepi nèng wektu sing karepaké.',
+'api-error-unclassified' => 'Ana masalah sing ora dingertèni.',
+'api-error-unknown-code' => 'Kasalahan ora dingertèni: "$1".',
+'api-error-unknown-error' => 'Kasalahan njero: Ana sing salah nalika njajal ngunggah berkas Sampéyan.',
+'api-error-unknown-warning' => 'Pèngetan ora dingertèni: "$1".',
+'api-error-unknownerror' => 'Kasalahan ora dingertèni: "$1".',
+'api-error-uploaddisabled' => 'Piranti ngunggah dipatèni nèng wiki iki.',
+'api-error-verification-error' => 'Berkas iki mungkin rusak, utawa nduwéni èkstènsi salah.',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|detik|detik}}',
+'duration-minutes' => '$1 {{PLURAL:$1|menit|menit}}',
+'duration-hours' => '$1 {{PLURAL:$1|jam|jam}}',
+'duration-days' => '$1 {{PLURAL:$1|dina|dina}}',
+'duration-weeks' => '$1 {{PLURAL:$1|minggu|minggu}}',
+'duration-years' => '$1 {{PLURAL:$1|taun|taun}}',
+'duration-decades' => '$1 {{PLURAL:$1|dékade|dékade}}',
+'duration-centuries' => '$1 {{PLURAL:$1|abad|abad}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milénium|milénium}}',
+
 );
index 828abd5..a5bde5a 100644 (file)
@@ -88,8 +88,8 @@ $specialPageAliases = array(
        'Listgrouprights'           => array( 'ჯგუფის_უფლებათა_სია' ),
        'Listredirects'             => array( 'გადამისამართებების_სია' ),
        'Listusers'                 => array( 'მომხმარებელთა_სია' ),
-       'Lonelypages'               => array( 'ობოლიგვერდები' ),
-       'Longpages'                 => array( 'გრძელიგვერდები' ),
+       'Lonelypages'               => array( 'ობოლი_გვერდები' ),
+       'Longpages'                 => array( 'გრძელი_გვერდები' ),
        'Movepage'                  => array( 'გვერდის_გადატანა' ),
        'Mycontributions'           => array( 'ჩემი_წვლილი' ),
        'Mypage'                    => array( 'ჩემი_გვერდი' ),
@@ -101,10 +101,10 @@ $specialPageAliases = array(
        'Preferences'               => array( 'კონფიგურაცია' ),
        'Protectedpages'            => array( 'დაცული_გვერდები' ),
        'Protectedtitles'           => array( 'დაცული_სათაურები' ),
-       'Randompage'                => array( 'შემთხვევით', 'შემთხვევითიგვერდი' ),
+       'Randompage'                => array( 'შემთხვევით', 'შემთხვევითი_გვერდი' ),
        'Recentchanges'             => array( 'ბოლოცვლილებები' ),
        'Search'                    => array( 'ძიება' ),
-       'Shortpages'                => array( 'მოკლეგვერდები' ),
+       'Shortpages'                => array( 'მოკლე_გვერდები' ),
        'Specialpages'              => array( 'განსაკუთრებული_გვერდები' ),
        'Statistics'                => array( 'სტატისტიკა' ),
        'Unblock'                   => array( 'ბლოკის_მოხსნა' ),
@@ -113,36 +113,54 @@ $specialPageAliases = array(
        'Uncategorizedpages'        => array( 'უკატეგორიო_გვერდები' ),
        'Uncategorizedtemplates'    => array( 'უკატეგორიო_თარგები' ),
        'Undelete'                  => array( 'აღდგენა' ),
-       'Unusedcategories'          => array( 'გამოუყკატეგორიები' ),
-       'Unusedimages'              => array( 'გამოუყსურათები' ),
+       'Unusedcategories'          => array( 'á\83\92á\83\90á\83\9bá\83\9dá\83£á\83§á\83\94á\83\9cá\83\94á\83\91á\83\94á\83\9aá\83\98\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\94á\83\91á\83\98' ),
+       'Unusedimages'              => array( 'á\83\92á\83\90á\83\9bá\83\9dá\83£á\83§á\83\94á\83\9cá\83\94á\83\91á\83\94á\83\9aá\83\98\83¡á\83£á\83 á\83\90á\83\97á\83\94á\83\91á\83\98' ),
        'Upload'                    => array( 'ატვირთვა' ),
        'Userlogin'                 => array( 'შესვლა' ),
        'Userlogout'                => array( 'გასვლა' ),
        'Userrights'                => array( 'მომხმარებელთა_უფლებები' ),
        'Version'                   => array( 'ვერსია' ),
-       'Wantedcategories'          => array( 'მოთხოვნილიკატეგორიები' ),
+       'Wantedcategories'          => array( 'მოთხოვნილი_კატეგორიები' ),
        'Wantedfiles'               => array( 'საჭირო_ფაილები' ),
        'Wantedpages'               => array( 'საჭირო_გვერდები' ),
        'Wantedtemplates'           => array( 'საჭირო_თარგები' ),
-       'Watchlist'                 => array( 'კონტროლსია' ),
-       'Withoutinterwiki'          => array( 'ინტერვიკისგარეშე' ),
+       'Watchlist'                 => array( 'á\83\99á\83\9dá\83\9cá\83¢á\83 á\83\9dá\83\9aá\83\98á\83¡_á\83¡á\83\98á\83\90' ),
+       'Withoutinterwiki'          => array( 'ინტერვიკის_გარეშე' ),
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#გადამისამართება', '#REDIRECT' ),
-       'nogallery'               => array( '0', '__უგალერეო__', '__NOGALLERY__' ),
-       'subst'                   => array( '0', 'მიდგმ:', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'მინიატიურა', 'მინი', 'მინიასლი', 'ცეროდენა', 'thumbnail', 'thumb' ),
-       'img_right'               => array( '1', 'მარჯვნივ', 'right' ),
-       'img_left'                => array( '1', 'მარცხნივ', 'left' ),
-       'img_none'                => array( '1', 'არა', 'none' ),
-       'img_width'               => array( '1', '$1პქ', '$1px' ),
-       'img_center'              => array( '1', 'ცენტრი', 'ცენტრში', 'center', 'centre' ),
-       'img_border'              => array( '1', 'საზღვარი', 'border' ),
-       'img_top'                 => array( '1', 'ზედა', 'top' ),
-       'img_middle'              => array( '1', 'შუა', 'middle' ),
-       'img_bottom'              => array( '1', 'ქვედა', 'bottom' ),
-       'special'                 => array( '0', 'სპეციალური', 'special' ),
+       'redirect'                  => array( '0', '#გადამისამართება', '#REDIRECT' ),
+       'nogallery'                 => array( '0', '__უგალერეო__', '__NOGALLERY__' ),
+       'currentmonth'              => array( '1', 'მიმდინარე_თვე', 'მიმდინარე_თვე2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'მიმდინარე_თვე1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'მიმდინარე_თვის_სახელი', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'მიმდინარე_თვის_სახელის_აბრევიატურა', 'CURRENTMONTHNAMEGEN' ),
+       'currentday'                => array( '1', 'მიმდინარე_დღე', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'მიმდინარე_დღე2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'მიმდინარე_დღის_სახელი', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'მიმდინარე_წელი', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'მიმდინარე_დრო', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'მიმდინარე_საათი', 'CURRENTHOUR' ),
+       'pagename'                  => array( '1', 'გვერდის_სახელი', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'სახელთა_სივრცე', 'NAMESPACE' ),
+       'fullpagename'              => array( '1', 'გვერდის_სრული_სახელი', 'FULLPAGENAME' ),
+       'subst'                     => array( '0', 'მიდგმ:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'მინიატიურა', 'მინი', 'მინიასლი', 'ცეროდენა', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'მინიატიურა=$1', 'მინი=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'მარჯვნივ', 'right' ),
+       'img_left'                  => array( '1', 'მარცხნივ', 'left' ),
+       'img_none'                  => array( '1', 'არა', 'none' ),
+       'img_width'                 => array( '1', '$1პქ', '$1px' ),
+       'img_center'                => array( '1', 'ცენტრი', 'ცენტრში', 'center', 'centre' ),
+       'img_page'                  => array( '1', 'გვერდი=$1', 'გვერდი_$1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'საზღვარი', 'border' ),
+       'img_top'                   => array( '1', 'ზედა', 'top' ),
+       'img_middle'                => array( '1', 'შუა', 'middle' ),
+       'img_bottom'                => array( '1', 'ქვედა', 'bottom' ),
+       'img_link'                  => array( '1', 'ბმული=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'ალტ=$1', 'alt=$1' ),
+       'sitename'                  => array( '1', 'საიტის_სახელი', 'SITENAME' ),
+       'special'                   => array( '0', 'სპეციალური', 'special' ),
 );
 
 $linkPrefixExtension = true;
@@ -150,13 +168,13 @@ $linkTrail = '/^([a-zაბგდევზთიკლმნოპჟრსტ
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'á\83®á\83\90á\83\96á\83\98 á\83\92á\83\90á\83£á\83¡á\83\95á\83\98 á\83\91á\83\9bá\83£á\83\9aá\83\94á\83\91á\83¡:',
+'tog-underline' => 'á\83\91á\83\9bá\83£á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83®á\83\90á\83\96á\83\92á\83\90á\83¡á\83\9bá\83\90:',
 'tog-justify' => 'გაასწორე პარაგრაფები',
 'tog-hideminor' => 'დამალე მცირე რედაქტირება ბოლო ცვლილებებში',
 'tog-hidepatrolled' => 'დამალეთ შესწორებული რედაქტირებები ბოლო ცვლილებებში',
 'tog-newpageshidepatrolled' => 'დამალეთ შემოწმებული გვერდები ახალი გვერდების სიიდან',
 'tog-extendwatchlist' => 'გავრცობილი კონტროლის სია ყველა დაკავშირებული ცვლილების ჩვენების ჩათვლით',
-'tog-usenewrc' => 'á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94 á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83£á\83\99á\83\94á\83\97á\83\94á\83¡á\83\98 á\83¡á\83\98á\83\90 (ჯავასკრიპტი)',
+'tog-usenewrc' => 'á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\93á\83\90 á\83\99á\83\9dá\83\9cá\83¢á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83¡á\83\98á\83\98á\83¡ á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\93á\83\90á\83¯á\83\92á\83£á\83¤á\83\94á\83\91á\83\90 (á\83¡á\83\90á\83­á\83\98á\83 á\83\9dá\83\90 ჯავასკრიპტი)',
 'tog-numberheadings' => 'ავტომატურად დანომრე ქვესათაურები',
 'tog-showtoolbar' => 'რედაქტირების ინსტრუმენტების ჩვენება (ჯავასკრიპტი)',
 'tog-editondblclick' => 'გვერდების რედაქტირება ორმაგი დაწკაპუნებით (ჯავასკრიპტი)',
@@ -164,17 +182,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'სექციის რედაქტირების ნებართვა მარჯვენა ღილაკზე დაჭერით<br />სექციის სათაურებზე (ჯავასკრიპტი)',
 'tog-showtoc' => 'აჩვენე სარჩევი (სამ ქვესათაურზე მეტის მქონე გვერდებისთვის)',
 'tog-rememberpassword' => 'დამიმახსოვრე ამ კომპიუტერზე (მაქსიმუმ $1 {{PLURAL:$1|დღე|დღე}})',
-'tog-watchcreations' => 'დაამატე ჩემი კონტროლის სიას ჩემს მიერ შექმნილი გვერდები',
-'tog-watchdefault' => 'დაამატე ჩემი კონტროლის სიას ჩემს მიერ რედაქტირებული გვერდები',
-'tog-watchmoves' => 'ჩასვი გვერდები, რომლებიც მე გადამაქვს, ჩემს კონტროლის სიაში',
-'tog-watchdeletion' => 'ჩასვი გვერდები, რომლებსაც მე ვშლი, ჩემს კონტროლის სიაში',
+'tog-watchcreations' => 'დაამატე ჩემი კონტროლის სიას ჩემს მიერ შექმნილი გვერდები და ატვირთული ფაილები',
+'tog-watchdefault' => 'დაამატე ჩემი კონტროლის სიას ჩემს მიერ რედაქტირებული გვერდები და ფაილები',
+'tog-watchmoves' => 'ჩასვი გვერდები და ფაილები, რომლებიც მე გადამაქვს, ჩემს კონტროლის სიაში',
+'tog-watchdeletion' => 'ჩასვი გვერდები და ფაილები, რომლებსაც მე ვშლი, ჩემს კონტროლის სიაში',
 'tog-minordefault' => 'ყველა რედაქტირების მონიშვნა, როგორც უმნიშვნელო, უპირობოდ',
 'tog-previewontop' => 'წინასწარი გადახედვის ჩვენება რედაქტირების დაფამდე',
 'tog-previewonfirst' => 'წინასწარი ჩვენება პირველივე რედაქტირებაზე',
 'tog-nocache' => 'გათიშეთ ბრაუზერში გვერდების ქეშირება',
-'tog-enotifwatchlistpages' => 'მომწერე ელ. ფოსტით, როცა გვერდი, რომელსაც მე ვაკონტროლებ, შეიცვლება',
+'tog-enotifwatchlistpages' => 'მომწერე ელ. ფოსტით, როცა გვერდი ან ფაილი, რომელსაც მე ვაკონტროლებ, შეიცვლება',
 'tog-enotifusertalkpages' => 'მომწერე თუ ჩემი განხილვის გვერდი შეიცვლება',
-'tog-enotifminoredits' => 'მომწერე ასევე გვერდების მცირე რედაქტირებისას',
+'tog-enotifminoredits' => 'მომწერე ასევე გვერდებისა და ფაილების მცირე რედაქტირებისას',
 'tog-enotifrevealaddr' => 'აჩვენე ჩემი ელ-ფოსტის მისამართი შეტყობინების წერილებში',
 'tog-shownumberswatching' => 'მაკონტროლებელ მომხმარებელთა რიცხვის ჩვენება',
 'tog-oldsig' => 'არსებული ხელმოწერა:',
@@ -190,7 +208,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'დამალეთ დარეგისტრირებულ მოხმარებელთა ცვლილებები ჩემი კონტროლის სიიდან',
 'tog-watchlisthideanons' => 'დამალეთ ანონიმურ მომხმარებელთა შესწორებები ჩემი კონტროლის სიიდან',
 'tog-watchlisthidepatrolled' => 'დამალეთ საკონტროლო სიიდან პატრულირებული რედაქტირებები',
-'tog-nolangconversion' => 'წერილების სისტემის გარდაქმნის გამორთვა',
 'tog-ccmeonemails' => 'გამომიგზავნე ელფოსტების ასლები, რომლებსაც მე სხვა მომხმარებლებს ვუგზავნი',
 'tog-diffonly' => 'დამალე გვერდის შიგთავსი ცვლილების ქვევით',
 'tog-showhiddencats' => 'დამალული კატეგორიების ჩვენება',
@@ -400,7 +417,7 @@ $1',
 'policy-url' => 'Project:პოლიტიკა',
 'portal' => 'საზოგადოების გვერდები',
 'portal-url' => 'Project:საზოგადოების გვერდები',
-'privacy' => 'á\83\90á\83\9cá\83\9dá\83\9cá\83\98á\83\9bურობის პოლიტიკა',
+'privacy' => 'á\83\99á\83\9dá\83\9cá\83¤á\83\98á\83\93á\83\94á\83\9cá\83ªá\83\98á\83\90á\83\9aურობის პოლიტიკა',
 'privacypage' => 'Project:ანონიმურობის პოლიტიკა',
 
 'badaccess' => 'ნებართვის შეცდომა',
@@ -418,6 +435,10 @@ $1',
 'youhavenewmessages' => 'თქვენ გაქვთ $1 ($2).',
 'newmessageslink' => 'ახალი შეტყობინებები',
 'newmessagesdifflink' => 'განსხვავება წინა ვერსიასთან',
+'youhavenewmessagesfromusers' => 'თქვენ გაქვთ $1 {{PLURAL:$3|სხვა მომხმარებლისგან|$3 მომხმარებლებისგან}} ($2).',
+'youhavenewmessagesmanyusers' => 'თქვენ გაქვთ $1 ბევრი მომხმარებლისგან ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ახალი შეტყობინება|ახალი შეტყობინება}}',
+'newmessagesdifflinkplural' => 'ბოლო {{PLURAL:$1|ცვლილება|ცვლილება}}',
 'youhavenewmessagesmulti' => 'თქვენ გაქვთ ახალი შეტყობინება $1-ზე',
 'editsection' => 'რედაქტირება',
 'editsection-brackets' => '[$1]',
@@ -475,9 +496,9 @@ $1',
 'dberrortext' => 'აღმოჩენილია სინტაქსური შეცდომა მონაცემთა ბაზასთან დაკავშირებისას
 შესაძლოა ეს არის შეცდომა პროგრამულ უზრუნველყოფაში,
 ბოლო დაკავშირება მონაცემთა ბაზასან
-<blockquote><tt>$1</tt></blockquote>
-მოხდა ფუნქციიდან <tt>„$2“</tt>.
-მონაცემთა ბაზამ დააბრუნა შეცდომა <tt>„$3: $4“</tt>.',
+<blockquote><code>$1</code></blockquote>
+მოხდა ფუნქციიდან „<code>$2</code>“.
+მონაცემთა ბაზამ დააბრუნა შეცდომა „<samp>$3: $4</samp>“.',
 'dberrortextcl' => 'მონაცემთა ბაზასთან დაკავშირებისას აღმოჩენილია სინტქსური შეცდომა.
 საბოლოო დაკავშირება მოხდა:
 „$1“
@@ -514,6 +535,8 @@ $1',
 'cannotdelete' => 'გვერდის ან ფაილის „$1“ წაშლა შეუძლებელია.
 შესაძლოა, იგი უკვე წაშალა სხვა მომხმარებელმა.',
 'cannotdelete-title' => 'გვერდის „$1“ წაშლა შეუძლებელია',
+'delete-hook-aborted' => 'შესწორება გაუქმებულია გადამჭერით.
+დამატებითი ახსნა არ ჩაწერილა.',
 'badtitle' => 'არასწორი სათაური',
 'badtitletext' => 'მოთხოვნილი გვერდის სათაური იყო არასწორი, ცარიელი, ან წარმოადგენდა შეცდომით გაკეთებულ ბმულს ენათაშორისი ან ინტერ-ვიკი სათაურიდან.',
 'perfcached' => 'შემდეგი მონაცემები აღებულია ქეშიდან და შესაძლოა არ შეიცავდენენ ბოლო ცვლილებებს. ქეშში ინახება მაქსიმუმ $1 {{PLURAL:$1|ჩანაწერი}}.',
@@ -546,6 +569,8 @@ $2',
 ადმინისტრატორი რომელმაც ის დაბლოკა მიუთითა შემდეგი მიზეზი: "$3".',
 'invalidtitle-knownnamespace' => 'დაუშვებელი სათაური სახელთა სივრცე "$2" და ტექსტი "$3"-თან',
 'invalidtitle-unknownnamespace' => 'დაუშვებელი სათაური უცნობი სახელთა სივრცის ნომერი $1 და ტექსტი "$2"-ით',
+'exception-nologin' => 'შესვლა არ განხორციელდა',
+'exception-nologin-text' => 'ამ გვერდის სანახავად ან მოთხოვნილი მოქმედების შესასრულებლად საჭიროა სისტემაში შესვლა.',
 
 # Virus scanner
 'virus-badscanner' => "შეცდომა. ვირუსთა უცნობი სკანერი: ''$1''",
@@ -567,6 +592,7 @@ $2',
 'remembermypassword' => 'დამიმახსოვრე ამ კომპიუტერზე (მაქსიმუმ $1 {{PLURAL:$1|დღე}})',
 'securelogin-stick-https' => 'გააგრძელეთ კავშირი HTTPS-თან შესვლის შემდეგ',
 'yourdomainname' => 'თქვენი დომენი',
+'password-change-forbidden' => 'თქვენ არ შეგიძლიათ ამ ვიკიში პაროლის შეცვლა.',
 'externaldberror' => 'საგარეო მონაცემთა ბაზაში აუტენტიფიკაციის შეცდომაა, ან თქვენ არ გაქვთ საკმარისი უფლებები საგარეო ანგარიშში ცვლილებების შესატანად.',
 'login' => 'შესვლა',
 'nav-login-createaccount' => 'შესვლა / რეგისტრაცია',
@@ -831,11 +857,10 @@ $2
 'userpage-userdoesnotexist-view' => 'მომხმარებელი „$1“ არ არის დარეგისტრირებული.',
 'blocked-notice-logextract' => 'ეს მომხმარებელი უკვე დაიბლოკა.
 დაბლოკვის მიზეზი შემდეგშია:',
-'clearyourcache' => "''შენიშვნა:''' შენახვის შემდეგ შესაძლოა დაგჭირდეთ ბრაუზერის ქეშის გაწმენდა ცვლილებების სანახავად. 
+'clearyourcache' => "'''შენიშვნა:''' შენახვის შემდეგ შესაძლოა დაგჭირდეთ ბრაუზერის ქეშის გაწმენდა ცვლილებების სანახავად. 
 * '''Firefox / Safari:''' დააჭირეთ ''Shift'' ''Reload''-ზე დაწკაპებისას, ან დააჭირეთ ''Ctrl-F5'', ან ''Ctrl-R'' (''⌘-R'' Mac-ზე); 
 * '''Google Chrome:''' დააჭირეთ ''Ctrl-Shift-R'' (''⌘-Shift-R'' Mac-ზე);
 * '''IE:''' დააჭირეთ ''Ctrl'' ''Refresh''-ზე დაწკაპებისას, ან დააჭირეთ ''Ctrl-F5'';
-* '''Konqueror:''' მხოლოდ დააწკაპეთ ''Reload'' ღილაკს, ან დააჭირეთ ''F5'';
 * '''Opera''' გაწმინდეთ კეში ''Tools→Preferences''-დან.",
 'usercssyoucanpreview' => "'''რჩევა:''' შენახვამდე გამოიყენეთ ღილაკი \"{{int:showpreview}}\" თქვენი ახალი CSS ტესტირებისთვის.",
 'userjsyoucanpreview' => "'''რჩევა:''' შენახვამდე გამოიყენეთ ღილაკი \"{{int:showpreview}}\" თქვენი ახალი JS ტესტირებისთვის.",
@@ -1404,6 +1429,7 @@ $1",
 'right-writeapi' => 'API-ს გამოყენება ჩაწერისთვის',
 'right-delete' => 'გვერდების წაშლა',
 'right-bigdelete' => 'გრძელი ისტორიის გვერდების წაშლა',
+'right-deletelogentry' => 'ჟურნალის კონკრეტული ჩანაწერების წაშლა და აღდგენა',
 'right-deleterevision' => 'გვერდის კონკრეტული ვერსიების წაშლა და აღდგენა',
 'right-deletedhistory' => 'წაშლილი გვერდების ხილავა წაშლილ ტექსთან ურთიერთობის გარეშე',
 'right-deletedtext' => 'წაშლილი ტექსტის და განსხვავებების ხილვა.',
@@ -1551,9 +1577,9 @@ $1",
 ადრე ატვირთული ფაილების სანახავად მიმართეთ  [[Special:FileList|ატვირთულ ფაილთა სიას]].ატვირთული ფაილები ასევე ჩაიწერება [[Special:Log/upload|ატვირთვათა ჟურნალში]], ხოლო წაშლილი ფაილები ჩაიწერება [[Special:Log/delete|წაშლათა ჟურნალში]].
 
 ფაილის სტატიაში ჩასაწერად გამოიყენეთ:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' ფაილის სრული ვერსიის ჩასასმელად;
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|описание]]</nowiki></tt>''' 200 პიქსელამდე შემცირებული ვერსიის ჩასასმელად აღწერის მითითების შესაძლებლობით;
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' ბმულის ჩასასმელად, გამოსახულების ჩვენების გარეშე.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ფაილის სრული ვერსიის ჩასასმელად;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|описание]]</nowiki></code>''' 200 პიქსელამდე შემცირებული ვერსიის ჩასასმელად აღწერის მითითების შესაძლებლობით;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' ბმულის ჩასასმელად, გამოსახულების ჩვენების გარეშე.",
 'upload-permitted' => 'მიღებული ფაილის ტიპები: $1.',
 'upload-preferred' => 'სასურველი ფაილის ტიპები: $1.',
 'upload-prohibited' => 'აკრძალული ფაილის ტიპები: $1.',
@@ -1596,22 +1622,22 @@ $1",
 'largefileserver' => 'ეს ფაილი სერვერის მიერ დაშვებულ ზომას აღემატება.',
 'emptyfile' => 'თქვენს მიერ ჩატვირთული ფაილი ცარიელია. შესაძლოა, შეცდომა მოხდა ფაილის სახელის აკრეფის დროს. გთხოვთ შეამოწმოთ ნამდვილად გსურთ თუ არა ამ ფაილის ჩატვირთვა.',
 'windows-nonascii-filename' => 'ამ ვიკის არ გააჩნია სპეციალური სიმბოლოების მქონე ფაილის სახელების მხარდაჭერა.',
-'fileexists' => "ფაილი ამ სახელით უკვე არსებობს, გთხოვთ შეამოწმოთ '''<tt>[[:$1]]</tt>''' თუ არა ხართ დარწმუნებული, რომ მისი შეცვლა ნამდვილად გსურთ.
-[[$1|thumb]]",
-'filepageexists' => "ამ ფაილის აღწერს გვერდი უკვე შექმნილია როგორც '''<tt>[[:$1]]</tt>''', მაგრამ ამ სახელის ფაილი ჯერ არ არსებობს.
+'fileexists' => 'ფაილი ამ სახელით უკვე არსებობს, გთხოვთ შეამოწმოთ <strong>[[:$1]]</strong> თუ არა ხართ დარწმუნებული, რომ მისი შეცვლა ნამდვილად გსურთ.
+[[$1|thumb]]',
+'filepageexists' => 'ამ ფაილის აღწერს გვერდი უკვე შექმნილია როგორც <strong>[[:$1]]</strong>, მაგრამ ამ სახელის ფაილი ჯერ არ არსებობს.
 შეტანილი აღწერა არ გაჩნდება ფაილის აღწერის გვერდზე.
 აღწერის შესაცვლელად თქვენ მოგიწევთ მისი ხელით შესწორება.
-[[$1|thumb]]",
-'fileexists-extension' => "ფაილი მსგავსი სახელით არსებობს: [[$2|thumb]]
-* ასატვირთი ფაილის სახელი: '''<tt>[[:$1]]</tt>'''
-* არსებული ფაილის სახელი: '''<tt>[[:$2]]</tt>'''
-გთხოვთ განსხვავებული სახელი აირჩიოთ.",
-'fileexists-thumbnail-yes' => "სავარაუდოდ ფაილი არის შემცირებული კოპია (მინიატურა). [[$1|thumb]]
-გთხოვთ შეამოწმოთ ფაილი '''<tt>[[:$1]]</tt>'''.
-თუ მოცემული ფაილები ერთი და იგივე გამოსახულებას წარმოადგენენ, შემცირებული ვერსიის ატვირთვა არ ღირს.",
-'file-thumbnail-no' => "ფაილის სახელი იწყება '''<tt>$1</tt>'''-ით.
+[[$1|thumb]]',
+'fileexists-extension' => 'ფაილი მსგავსი სახელით არსებობს: [[$2|thumb]]
+* ასატვირთი ფაილის სახელი: <strong>[[:$1]]</strong>
+* არსებული ფაილის სახელი: <strong>[[:$2]]</strong>
+გთხოვთ განსხვავებული სახელი აირჩიოთ.',
+'fileexists-thumbnail-yes' => 'სავარაუდოდ ფაილი არის შემცირებული კოპია (მინიატურა). [[$1|thumb]]
+გთხოვთ შეამოწმოთ ფაილი <strong>[[:$1]]</strong>.
+თუ მოცემული ფაილები ერთი და იგივე გამოსახულებას წარმოადგენენ, შემცირებული ვერსიის ატვირთვა არ ღირს.',
+'file-thumbnail-no' => 'ფაილის სახელი იწყება <strong>$1</strong>-ით.
 სავარაუდოდ ფაილი არის შემცირებული კოპია (მინიატურა).
-თუ თქვენ გაქვთ მოცემული გამოსახულება სრულ ზომაში, გთხოვთ ატვირთოთ იგი, ან შეასწორეთ ფაილის სახელი.",
+თუ თქვენ გაქვთ მოცემული გამოსახულება სრულ ზომაში, გთხოვთ ატვირთოთ იგი, ან შეასწორეთ ფაილის სახელი.',
 'fileexists-forbidden' => 'ამ სახელის მქონე ფაილი უკვე არსებობს და ვერ გადაიწერება.
 თუ თქვენ მაინც გსურთ მისი ატვირთვა დაბრუნდით უკან და ატვირთეთ სხვა სახელით. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'ფაილი ამ სახელწოდებით უკვე არსებობს ფაილების საერთო საცავში. თუ შეიძლება, უკან დაბრუნდით და ჩატვირთეთ ფაილი სხვა სახელწოდებით. [[File:$1|thumb|center|$1]]',
@@ -1703,6 +1729,7 @@ $1',
 'lockmanager-fail-releaselock' => '"$1"–ის განბლოკვა ვერ მოხერხდა.',
 'lockmanager-fail-db-bucket' => '$1 სეგმენტში ბლოკირებების ბაზების საკმარის რაოდენობასთან დაკავშირება ვერ მოხერხდა.',
 'lockmanager-fail-db-release' => '$1 მონაცემთა ბაზაზე ბლოკის მოხსნა ვერ მოხერხდა.',
+'lockmanager-fail-svr-acquire' => 'ვერ მოხერხდა ბლოკირების მიღება სერვერზე $1.',
 'lockmanager-fail-svr-release' => '$1 სერვერზე ბლოკის მოხსნა ვერ მოხერხდა.',
 
 # ZipDirectoryReader
@@ -1774,7 +1801,7 @@ $1',
 'listfiles_search_for' => 'ძიება სურათის სახელის მიხედვით:',
 'imgfile' => 'ფაილი',
 'listfiles' => 'სურათების სია',
-'listfiles_thumb' => 'მინიატურა',
+'listfiles_thumb' => 'á\83\9bá\83\98á\83\9cá\83\98á\83\90á\83¢á\83\98á\83£á\83 á\83\90',
 'listfiles_date' => 'თარიღი',
 'listfiles_name' => 'სახელი',
 'listfiles_user' => 'მომხმარებელი',
@@ -1791,7 +1818,7 @@ $1',
 'filehist-revert' => 'დააბრუნე',
 'filehist-current' => 'მიმდინარე',
 'filehist-datetime' => 'თარიღი/დრო',
-'filehist-thumb' => 'მინიატურა',
+'filehist-thumb' => 'á\83\9bá\83\98á\83\9cá\83\98á\83\90á\83¢á\83\98á\83£á\83 á\83\90',
 'filehist-thumbtext' => 'მინიატურა $1 ვერსიისთვის',
 'filehist-nothumb' => 'არ არის მინიატურა',
 'filehist-user' => 'მომხმარებელი',
@@ -1823,6 +1850,7 @@ $1',
 'shared-repo-from' => ' $1-დან',
 'shared-repo' => 'საერთო საცავიდან',
 'shared-repo-name-wikimediacommons' => 'ვიკისაწყობი',
+'upload-disallowed-here' => 'სამწუხაროდ, თქვენ არ შეგიძლიათ ამ სურათზე გადაწერა.',
 
 # File reversion
 'filerevert' => 'დააბრუნე $1',
@@ -1856,7 +1884,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'MIME ძიება',
-'mimesearch-summary' => 'ამ გვერდის მეშვეობით ესაძლებელია ფაილების მოძიება მათი MIME-ტიპის მიხედვით. შეტანის ფორმა: შიგთავსის ტიპი/ქვეტიპი, მაგ <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'ამ გვერდის მეშვეობით ესაძლებელია ფაილების მოძიება მათი MIME-ტიპის მიხედვით. შეტანის ფორმა: შიგთავსის ტიპი/ქვეტიპი, მაგ <code>image/jpeg</code>.',
 'mimetype' => 'MIME ტიპი:',
 'download' => 'გადმოტვირთვა',
 
@@ -1903,9 +1931,9 @@ $1',
 
 'disambiguations' => 'გვერდები, რომელთაც აქვთ ბმული მრავალმნიშვნელოვან გვერდებზე',
 'disambiguationspage' => 'Template:მრავალმნიშვნელოვანი',
-'disambiguations-text' => "á\83¨á\83\94á\83\9bá\83\93á\83\94á\83\92á\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98 á\83\93á\83\90á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\94á\83\91á\83\98 á\83\90á\83 á\83\98á\83\90á\83\9c '''á\83\9bá\83 á\83\90á\83\95á\83\90á\83\9aá\83\9bá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\94á\83\9aá\83\9dá\83\91á\83\98á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\97á\83\90á\83\9c'''.
-ამის ნაცვლად იგი უნდა შეესაბამოს კონკრეტულ სტატიას.<br />
\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83\98á\83\97á\83\95á\83\9aá\83\94á\83\91á\83\90 á\83\9bá\83 á\83\90á\83\95á\83\90á\83\9aá\83\9bá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\94á\83\9aá\83\9dá\83\95á\83\9cá\83\90á\83\93, á\83\97á\83£ á\83\9bá\83\90á\83¡á\83\96á\83\94 á\83\92á\83\90á\83\9bá\83\9dá\83§á\83\94á\83\9cá\83\94á\83\91á\83£á\83\9aá\83\98á\83\90 [[MediaWiki:Disambiguationspage|á\83\9bá\83\98á\83\97á\83¡á\83\90á\83\97á\83\98á\83\97á\83\94á\83\91á\83\94á\83\9aá\83\98 á\83\97á\83\90á\83 á\83\92á\83\98]].",
+'disambiguations-text' => "á\83¨á\83\94á\83\9bá\83\93á\83\94á\83\92á\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98 á\83¨á\83\94á\83\98á\83ªá\83\90á\83\95á\83\94á\83\9c á\83¡á\83£á\83\9a á\83\9bá\83ªá\83\98á\83 á\83\94 á\83\94á\83 á\83\97 á\83\91á\83\9bá\83£á\83\9aá\83¡ '''á\83\9bá\83 á\83\90á\83\95á\83\90á\83\9aá\83\9bá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\94á\83\9aá\83\9dá\83\91á\83\98á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94'''.
+ამის ნაცვლად, სავარაუდოდ, ისისნი უნდა მიუთითებდნენ შესაბამის კონკრეტულ სტატიაზე.<br />
\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83\98á\83\97á\83\95á\83\9aá\83\94á\83\91á\83\90 á\83\9bá\83 á\83\90á\83\95á\83\90á\83\9bá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\94á\83\9aá\83\9dá\83\95á\83\9cá\83\90á\83\93, á\83\97á\83£ á\83\9bá\83\90á\83¡á\83¨á\83\98 á\83\92á\83\90á\83\9cá\83\97á\83\90á\83\95á\83¡á\83\94á\83\91á\83£á\83\9aá\83\98á\83\90 á\83\97á\83\90á\83 á\83\92á\83\98, á\83 á\83\9dá\83\9bá\83\9aá\83\98á\83¡ á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98á\83ª á\83\9bá\83\98á\83\97á\83\98á\83\97á\83\94á\83\91á\83£á\83\9aá\83\98á\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'ორმაგი გადამისამართება',
 'doubleredirectstext' => 'ამ გვერდზე ჩამოთვლილია გვერდები, რომლებიც გადამისამართებულია სხვა გადამისამართების გვერდებზე.
@@ -1931,6 +1959,7 @@ $1',
 # Miscellaneous special pages
 'nbytes' => '$1 ბაიტი',
 'ncategories' => '$1 კატეგორია',
+'ninterwikis' => '$1 {{PLURAL:$1|ინტერვიკი|ინტერვიკი}}',
 'nlinks' => '$1 ბმული',
 'nmembers' => '$1 წევრი',
 'nrevisions' => '$1 რედაქტირება',
@@ -1959,6 +1988,7 @@ $1',
 'mostlinkedtemplates' => 'ყველაზე მეტი ბმულების მქონე თარგები',
 'mostcategories' => 'ყველაზე მეტი კატეგორიის მქონე სტატიები',
 'mostimages' => 'ყველაზე მეტი ბმულების მქონე ფაილები',
+'mostinterwikis' => 'ყველაზე მეტი ინტერვიკის მქონე სტატია',
 'mostrevisions' => 'ყველაზე მეტად რედაქტირებული სტატიები',
 'prefixindex' => 'ყველა გვერდი (თავსართით)',
 'prefixindex-namespace' => 'ყველა პრეფიქსიანი გვერდი ($1 სახელთა სივრცე)',
@@ -2060,7 +2090,7 @@ $1',
 'linksearch-ok' => 'ძიება',
 'linksearch-text' => 'შესაძლებელია გამოიყენოთ ქვეხაზოვანი სიმბოლოები, მაგალითად, <code>*.wikipedia.org</code>.
 უკიდურეს შემთხვევაში საჭიროა ზედა დონის დომენი, მაგალითად <code>*.org</code><br />
-მხარდამჭერი პროტოკოლები: <tt>$1</tt> (არ დაამატოს ნებისმიერი მათგანი თქვენ სიაში)',
+მხარდამჭერი პროტოკოლები: <code>$1</code> (არ დაამატოს ნებისმიერი მათგანი თქვენ სიაში)',
 'linksearch-line' => 'ბმულები $1-ზე  $2-დან',
 'linksearch-error' => 'წარმოდგენილი სიმბოლოების გამოყენება შესაძლებელია მხოლოდ მისამართის დასაწყისში.',
 
@@ -2093,8 +2123,8 @@ $1',
 'listgrouprights-rights' => 'უფლებები',
 'listgrouprights-helppage' => 'Help:ჯგუფების უფლებები',
 'listgrouprights-members' => '(წევრების სია)',
-'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
-'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
+'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <code>($2)</code></span>',
+'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <code>($2)</code></span>',
 'listgrouprights-addgroup' => 'შემდეგი {{PLURAL:$2|ჯგუფის|ჯგუფების}} დამატება: $1',
 'listgrouprights-removegroup' => 'შემდეგი {{PLURAL:$2|ჯგუფის|ჯგუფების}} ამოღება: $1',
 'listgrouprights-addgroup-all' => 'ჩაამატეთ ყველა ჯგუფი',
@@ -2108,6 +2138,8 @@ $1',
 'mailnologin' => 'გამგზავნი მისამართი არ არის მითითებული.',
 'mailnologintext' => 'თქვენ უნდა [[Special:UserLogin|წარადგენილი იყოთ სისტემისადმი]] და გქონდეთ წესიერი ელექტრონული ფოსტის მისამართი თქვენს [[Special:Preferences|კონფიგურაციაში]] იმისთვის, რომ გაუგზავნოთ წერილების სხვა მომხმარებლებს.',
 'emailuser' => 'გაუგზავნეთ იმეილი ამ მომხმარებელს',
+'emailuser-title-target' => 'ელ. ფოსტის მიწერა {{GENDER:$1|მომხმარებელთან}}',
+'emailuser-title-notarget' => 'ელ. ფოსტის გაგზავნა მომხმარებელთან',
 'emailpage' => 'ელ. ფოსტა მომხმარებელს',
 'emailpagetext' => 'თუ ამ მომხმარებელმა თავის პარამეტრებში ელ. ფოსტის მოქმედი მისამართი მიუთითა, ქვემოთ მოყვანილი ფორმის შევსებისას შეგიძლიათ მისთვის შეტყობინების გაგზავნა. ელ. ფოსტის მისამართი, რომელიც [[Special:Preferences|თქვენს პარამეტრებში]] მიუთითეთ, დაფიქსირდება „გამომგზავნის“ ველში, რათა ადრესატმა პასუხის გაცემა შეძლოს.',
 'usermailererror' => 'ელ. ფოსტა დაბრუნდა შეცდომის გამო:',
@@ -2253,6 +2285,8 @@ $UNWATCHURL
 'rollback' => 'რცვლილებების გაუქმება',
 'rollback_short' => 'სწრაფი გაუქმება',
 'rollbacklink' => 'სწრაფი გაუქმება',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|ცვლილების|ცვლილების}} გაუქმება',
+'rollbacklinkcount-morethan' => '$1-ზე მეტი {{PLURAL:$1|ცვლილების|ცვლილების}} გაუქმება',
 'rollbackfailed' => 'შეცდომა გაუქმებისას',
 'cantrollback' => 'შეუძლებელია უწინდელი რედაქციის აღდგენა; ის, ვინც უკანასკნელი ცვლილებები შეიტანა, ამ სტატიის ერთადერთი ავტორია.',
 'alreadyrolled' => 'შეუძლებელია ბოლო ცვლილების გაუქმება [[:$1]], გაკეებული [[User:$2|$2]] ([[User talk:$2|განხილვა]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2549,7 +2583,7 @@ $1',
 'ipb_expiry_invalid' => 'მოქმედების მიუღებელი პერიოდი',
 'ipb_expiry_temp' => 'ბლოკირება მომხმარებლის სახელის დამალვით უვადო უნდა იყოს',
 'ipb_hide_invalid' => 'შეუძლებელია მოხემული ანგარიშის დამალვა, სავარაუდოდ მის მიერ განხორციელებულია ძალიან ბევრი შესწორება',
-'ipb_already_blocked' => '"$1" უკვე ბლოკირებულია',
+'ipb_already_blocked' => '„$1“ უკვე ბლოკირებულია',
 'ipb-needreblock' => 'მომხმარებელი $1 უკვე დაიბლოკა. გსურთ დაბლოკვის პარამეტრების შესწორება?',
 'ipb-otherblocks-header' => 'სხვა {{PLURAL:$1|დაბლოკვა|დაბლოკვები}}',
 'unblock-hideuser' => 'თქვენ არ შეგიძლიათ მოხსნათ ბლოკი ამ მომხმარებელს, რადგან მისი მომხმარებლის სახელი დამალულია.',
@@ -2648,12 +2682,12 @@ $1',
 'delete_and_move' => 'წაშლა და გადატანა',
 'delete_and_move_text' => '==საჭიროა წაშლა==
 
-სტატია დასახელებით "[[:$1]]" უკვე არსებობს. გსურთ მისი წაშლა გადატანისთვის ადგილის დასათმობად?',
+სტატია დასახელებით „[[:$1]]“ უკვე არსებობს. გსურთ მისი წაშლა გადატანისთვის ადგილის დასათმობად?',
 'delete_and_move_confirm' => 'დიახ, წაშალეთ ეს გვერდი',
-'delete_and_move_reason' => 'წაშლილია "[[$1]]"-á\83\93á\83\90á\83\9c á\83\92á\83\90á\83\93á\83\90á\83¢á\83\90á\83\9cá\83\98á\83¡á\83\97á\83\95á\83\98á\83¡ á\83\90á\83\93á\83\92á\83\98á\83\9aá\83\98á\83¡ á\83\93á\83\90á\83¡á\83\90á\83\97á\83\9bá\83\9dá\83\91á\83\90á\83\93',
+'delete_and_move_reason' => 'წაშლილია â\80\9e[[$1]]-á\83\93á\83\90á\83\9câ\80\9c á\83\92á\83\90á\83\93á\83\90á\83¢á\83\90á\83\9cá\83\98á\83¡á\83\97á\83\95á\83\98á\83¡ á\83\90á\83\93á\83\92á\83\98á\83\9aá\83\98á\83¡ á\83\93á\83\90á\83¡á\83\90á\83\97á\83\9bá\83\9dá\83\91á\83\90á\83\93',
 'selfmove' => 'წყარო და დანიშნულების სათაურები მსგავსია; შეუძლებელია გვერდის საკუთარ თავზე გადატანა.',
-'immobile-source-namespace' => 'შეუძლებელია სახელის გადარქმევა «$1» სახელთა სივრცეში',
-'immobile-target-namespace' => 'შეუძლებელია გვერდის გადატანა «$1» სახელთა სივრცეში',
+'immobile-source-namespace' => 'შეუძლებელია სახელის გადარქმევა „$1“ სახელთა სივრცეში',
+'immobile-target-namespace' => 'შეუძლებელია გვერდის გადატანა „$1“ სახელთა სივრცეში',
 'immobile-target-namespace-iw' => 'ინტერვიკის ბმული შეუძლებელია გამოყენებული იქნას გადარქმევისთვის.',
 'immobile-source-page' => 'ამ გვეერდის გადატანა შეუძლებელია.',
 'immobile-target-page' => 'შეუძლებელია მოცემულ სახელზე გადატანა.',
@@ -2735,6 +2769,7 @@ $1',
 'import-interwiki-templates' => 'ყველა თარგის ჩართვა',
 'import-interwiki-submit' => 'იმპორტირება',
 'import-interwiki-namespace' => 'სამიზნე სახელთა სივრცე',
+'import-interwiki-rootpage' => 'ძირეული გვერდი (არასავალდებულო):',
 'import-upload-filename' => 'ფაილის სახელი:',
 'import-comment' => 'კომენტარი:',
 'importtext' => 'გთხოვთ, მოახდინოთ გვერდის ექსპორტი თავდაპირველი ვიკიდან, [[Special:Export|შესაბამისი ხელსაწყოს]] გამოყენებით. ფაილი შეინახეთ დისკზე, ხოლო შემდეგ ატვირთეთ აქ.',
@@ -2761,18 +2796,20 @@ $1',
 'import-upload' => 'XML მონაცემების ატვირთვა',
 'import-token-mismatch' => 'სეანსის მონაცემები დაიკარგა. კიდევ ერთხელ სცადეთ!',
 'import-invalid-interwiki' => 'შეუძლებელია იმპორტირება მოცემული ვიკიდან.',
-'import-error-edit' => 'გვერდი "$1" იმპორტირება არ მოხდა, რადგან თქვენ არ გაქვთ მისი რედაქტირების უფლება.',
-'import-error-create' => 'გვერდი "$1" იმპორტირება არ მოხდა, რადგან თქვენ არ გაქვთ მისი შექმნის უფლება.',
-'import-error-interwiki' => 'გვერდი "$1" არ იქნა იმპორტირებული, რადგანაც მისი სახელი დარეგისტრირებულია გარე ბმულებისათვის (interwiki).',
-'import-error-special' => 'გვერდი "$1" არ იქნა იმპორტირებული, რადგანაც ის განეკუთვნება განსაკუთრებულ სახელთა სივრცეს, რომელიც კრძალავს გვერდების შექმნას.',
+'import-error-edit' => 'გვერდი „$1“ იმპორტირება არ მოხდა, რადგან თქვენ არ გაქვთ მისი რედაქტირების უფლება.',
+'import-error-create' => 'გვერდი „$1“ იმპორტირება არ მოხდა, რადგან თქვენ არ გაქვთ მისი შექმნის უფლება.',
+'import-error-interwiki' => 'გვერდი „$1“ არ იქნა იმპორტირებული, რადგანაც მისი სახელი დარეგისტრირებულია გარე ბმულებისათვის (interwiki).',
+'import-error-special' => 'გვერდი „$1“ არ იქნა იმპორტირებული, რადგანაც ის განეკუთვნება განსაკუთრებულ სახელთა სივრცეს, რომელიც კრძალავს გვერდების შექმნას.',
 'import-error-invalid' => 'გვერდი "$1" იმპორტირება არ მოხდა მიუღებელი სახელის გამო.',
+'import-options-wrong' => 'არასწორი {{PLURAL:$2|პარამეტრი|პარამეტრი}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'ძირეული გვერდის მითითებული სახელი არასწორია.',
 
 # Import log
 'importlogpage' => 'იმპორტის ჟურნალი',
 'importlogpagetext' => 'ადმინისტრატორთა მიერ გვერდების იმპორტირება  ცვლილებების ჩათვლით სხვა ვიკიდან.',
-'import-logentry-upload' => '«[[$1]]» — ფაილის იმპორტი',
+'import-logentry-upload' => '„[[$1]]“ — ფაილის იმპორტი',
 'import-logentry-upload-detail' => '$1 ცვლილება',
-'import-logentry-interwiki' => '«$1» — ტრანსვიკი იმპორტი',
+'import-logentry-interwiki' => '„$1“ — ტრანსვიკი იმპორტი',
 'import-logentry-interwiki-detail' => '$1 ცვლილება $2-დან',
 
 # JavaScriptTest
@@ -2780,7 +2817,7 @@ $1',
 'javascripttest-disabled' => 'ეს ფუნქცია ამ ვიკიში არ ჩართულა.',
 'javascripttest-title' => 'მიმდინარეობს $1-ის ტესტირება',
 'javascripttest-pagetext-noframework' => 'ეს გვერდი დარეგისტრირებულია JavaScript-ის ტესტების გასაშვებად.',
-'javascripttest-pagetext-unknownframework' => '"$1"-ის ტესტირების უცნობი გარემო.',
+'javascripttest-pagetext-unknownframework' => '„$1-ის“ ტესტირების უცნობი გარემო.',
 'javascripttest-pagetext-frameworks' => 'გთხოვთ, აირჩიეთ ტესტირების ერთ-ერთი შემდეგი გარემო: $1',
 'javascripttest-pagetext-skins' => 'ტესტების გასაშვებად აირჩიეთ გაფორმების თემა:',
 'javascripttest-qunit-intro' => 'იხილეთ [$1 ტესტირების დოკუმენტები] mediawiki.org-ზე.',
@@ -2901,16 +2938,24 @@ $1',
 
 # Info page
 'pageinfo-title' => 'ინფორმაცია „$1“-თვის',
-'pageinfo-header-edits' => 'რედაქტირებები',
-'pageinfo-header-watchlist' => 'კონტროლის სია',
-'pageinfo-header-views' => 'ხილვა',
-'pageinfo-subjectpage' => 'გვერდი',
-'pageinfo-talkpage' => 'განხილვის გვერდი',
-'pageinfo-watchers' => 'დამკვირვებელთა რაოდენობა',
-'pageinfo-edits' => 'რედაქციების რაოდენობა',
-'pageinfo-authors' => 'განსხვავებულ ავტორთა რაოდენობა',
+'pageinfo-header-basic' => 'საბაზისო ინფორმაცია',
+'pageinfo-header-edits' => 'რედაქტირების ისტორია',
+'pageinfo-header-restrictions' => 'გვერდის დაცვა',
+'pageinfo-header-properties' => 'გვერდის თვისებები',
+'pageinfo-article-id' => 'გვერდის ID',
+'pageinfo-robot-policy' => 'საძიებო სისტემის სტატუსი',
 'pageinfo-views' => 'ხილვების რაოდენობა',
-'pageinfo-viewsperedit' => 'შესწორებათა ხილვა',
+'pageinfo-watchers' => 'გვერდის დამკვირვებელთა რაოდენობა',
+'pageinfo-firstuser' => 'გვერდის შემქნელი',
+'pageinfo-firsttime' => 'გვერდის შექმნის თარიღი',
+'pageinfo-lastuser' => 'ბოლო რედაქტორი',
+'pageinfo-lasttime' => 'ბოლო რედაქტირების თარიღი',
+'pageinfo-edits' => 'რედაქტირებების ჯამური რაოდენობა',
+'pageinfo-authors' => 'განსხვავებულ ავტორთა ჯამური რაოდენობა',
+'pageinfo-restriction' => 'გვერდის დაცვა (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => 'ჯადოსნური {{PLURAL:$1|სიტყვა|სიტყვა}} ($1)',
+'pageinfo-hidden-categories' => 'დამალული {{PLURAL:$1|კატეგორია|კატეგორია}} ($1)',
+'pageinfo-templates' => 'ინტეგრირებულია {{PLURAL:$1|თარგი|თარგი}} ($1)',
 
 # Skin names
 'skinname-standard' => 'კლასიკური',
@@ -2966,6 +3011,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 პიქსელი, ფაილის ზომა: $3, MIME ტიპი: $4, $5 გვერდი',
 'file-nohires' => 'უფრო მაღალი გარჩევადობა არ არის შესაძლებელი.',
 'svg-long-desc' => 'ფაილი SVG, ნომინალურად $1 × $2 პიქსელი, ფაილის ზომა: $3',
+'svg-long-desc-animated' => 'ანიმირებული SVG ფაილი, ნომინალური $1 × $2 პიქსელი, ფაილის ზომა: $3',
 'show-big-image' => 'სრული გარჩევადობა',
 'show-big-image-preview' => 'ზომა წინასწარი გადახედვისას: $1.',
 'show-big-image-other' => 'სხვა {{PLURAL:$2|გაფართოება|გაფართოება}}: $1.',
@@ -3659,13 +3705,13 @@ $5
 'version-extensions' => 'დაყენებული გაფართოებები',
 'version-specialpages' => 'სპეციალური გვერდები',
 'version-parserhooks' => 'სინტაქსური ანალიზატორის ჰუკები',
-'version-variables' => 'смфдуифвуиш',
+'version-variables' => 'ცვალებადი',
 'version-antispam' => 'სპამის პრევენცია',
 'version-skins' => 'იერსახე',
 'version-api' => 'API',
 'version-other' => 'სხვა',
 'version-mediahandlers' => 'მედია დამუშავება',
-'version-hooks' => 'ჰუკებш',
+'version-hooks' => 'ჰუკებ',
 'version-extension-functions' => 'გაფართოებათა ფუნქციები',
 'version-parser-extensiontags' => 'სინტაქსური ანალიზატორის თეგი',
 'version-parser-function-hooks' => 'სინტაქსური ანალიზატორის ჰუკი',
@@ -3807,12 +3853,12 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'revdelete-uname-unhid' => 'მომხმარებლის სახელი გახსნილია',
 'revdelete-restricted' => 'შეზღუდვა ადმინისტრატორთათვის',
 'revdelete-unrestricted' => 'ადმინისტრატორთათვის შეზღუდვები მოხსნილია',
-'logentry-move-move' => '$1 á\83\92á\83\90á\83\93á\83\90á\83\98á\83¢á\83\90á\83\9cá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 $3 â\86\92 $4-á\83\96á\83\94',
-'logentry-move-move-noredirect' => '$1 á\83\92á\83\90á\83\93á\83\90á\83\98á\83¢á\83\90á\83\9cá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 $3 $4-á\83¨á\83\98 გადამისამართების დატოვების გარეშე',
-'logentry-move-move_redir' => '$1 á\83\92á\83\90á\83\93á\83\90á\83\98á\83¢á\83\90á\83\9cá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 $3 $4-á\83¨á\83\98 გადამისამართებაზე',
+'logentry-move-move' => '$1 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 â\80\9e$3â\80\9c á\83\92á\83\90á\83\93á\83\90á\83\98á\83¢á\83\90á\83\9cá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 â\80\9e$4â\80\9c',
+'logentry-move-move-noredirect' => '$1 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 â\80\9e$3â\80\9c á\83\92á\83\90á\83\93á\83\90á\83\98á\83¢á\83\90á\83\9cá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 â\80\9e$4â\80\9c გადამისამართების დატოვების გარეშე',
+'logentry-move-move_redir' => '$1 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 â\80\9e$3â\80\9c á\83\92á\83\90á\83\93á\83\90á\83\98á\83¢á\83\90á\83\9cá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 â\80\9e$4â\80\9c გადამისამართებაზე',
 'logentry-move-move_redir-noredirect' => '$1 გადაიტანა გვერდი $3 $4-ში გადამისამართების დატოვების გარეშე',
-'logentry-patrol-patrol' => '$1 გააკეთა გვერდი $3-ის $4 ვერსიის პატრულირება',
-'logentry-patrol-patrol-auto' => '$1 ავტომატურად გააკეთა გვერდი $3-ის $4 ვერსიის პატრულირება',
+'logentry-patrol-patrol' => '$1 გააკეთა გვერდის „$3“ $4 ვერსიის პატრულირება',
+'logentry-patrol-patrol-auto' => '$1 ავტომატურად გააკეთა გვერდის „$3“ $4 ვერსიის პატრულირება',
 'logentry-newusers-newusers' => '$1 შექმნა მომხმარებლის ანგარიში',
 'logentry-newusers-create' => '$1 შექმნა მომხმარებლის ანგარიში',
 'logentry-newusers-create2' => '$1 შექმნა მომხმარებელ $3 ანგარიში',
@@ -3846,9 +3892,12 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'api-error-empty-file' => 'არჩეული ფაილი ცარიელია.',
 'api-error-emptypage' => 'ახალი, ცარიელი გვერდების შექმნა აკრძალულია.',
 'api-error-fetchfileerror' => 'შიდა შეცდომა: ფაილის მიღებისას მოხდა რაღაც შეცდომა.',
+'api-error-fileexists-forbidden' => 'ფაილი სახელით „$1“ უკვე არსებობს და მისი გადაწერა შეუძლებელია.',
+'api-error-fileexists-shared-forbidden' => 'ფაილი სახელით „$1“ უკვე არსებობს საერთო ფაილების საცავში და გადაწერა შეუძლებელია.',
 'api-error-file-too-large' => 'არჩეული ფაილი ძალიან დიდია.',
 'api-error-filename-tooshort' => 'ფაილის სახელი ზედმეტად მოკლეა',
 'api-error-filetype-banned' => 'ფაილის ეს ტიპი აკრძალულია',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|მიუღებელი ფაილის ტიპია|მიუღებელი ფაილის ტიპებია}}. მისაღებიი ფაილის {{PLURAL:$3|ტიპია|ტიპებია}} $2.',
 'api-error-filetype-missing' => 'ფაილს აკლია გაფართოვება.',
 'api-error-hookaborted' => 'თქვენ მიერ შემოთავაზებული ცვლილება მოინიშნა გაფართოების დოკუმენტაციაში.',
 'api-error-http' => 'აღმოჩენილია შეცდომა სერვერთან დაკავშირებისას.',
index fe97fb1..f96d2ff 100644 (file)
@@ -11,6 +11,7 @@
  * @author Agzennay
  * @author Azwaw
  * @author Mmistmurt
+ * @author MoubarikBelkasim
  * @author Teak
  * @author Urhixidur
  */
@@ -75,7 +76,6 @@ $messages = array(
 'tog-watchlisthideown' => 'Ffer ibeddlen inu seg wumuɣ n uɛessi inu',
 'tog-watchlisthidebots' => 'Ffer ibeddlen n iboṭiyen seg wumuɣ n uɛessi inu',
 'tog-watchlisthideminor' => 'Ffer ibeddlen ifessasen seg wumuɣ n uɛessi inu',
-'tog-nolangconversion' => 'Kkes abeddel n yimeskilen',
 'tog-ccmeonemails' => 'Azen-iyi-d email n wayen uzneɣ i imseqdacen wiyaḍ',
 'tog-diffonly' => 'Ur temliḍ-iyi-d ara ayen yellan seddaw imgerraden',
 
@@ -654,7 +654,7 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 'revertmerge' => 'Fru',
 
 # Diffs
-'history-title' => 'Amazray n allasen n "$1"',
+'history-title' => 'Tiẓṛi tiss sint umezruy n "$1"',
 'lineno' => 'Ajerriḍ $1:',
 'compareselectedversions' => 'Ẓer imgerraden ger tisiwal i textareḍ',
 'editundo' => 'ssefsu',
@@ -866,16 +866,16 @@ Akken ad tessekcmeḍ tugna deg usebter, seqdec azay am wagi
 'large-file' => 'Ilaq tiddi n ufayluwen ur tettili kter n $1; tiddi n ufaylu-agi $2.',
 'largefileserver' => 'Afaylu meqqer aṭṭas, server ur t-yeqbil ara.',
 'emptyfile' => 'Afaylu i tazneḍ d ilem. Waqila tɣelṭeḍ deg isem-is. G leɛnayek ssenqed-it.',
-'fileexists' => "Afaylu s yisem-agi yewǧed yagi, ssenqed '''<tt>[[:$1]]</tt>''' ma telliḍ mačči meḍmun akken a t-tbeddleḍ.
-[[$1|thumb]]",
-'fileexists-extension' => "Afaylu s yisem-agi yewǧed: [[\$2|thumb]]
-* Isem n ufaylu i tazneḍ: '''<tt>[[:\$1]]</tt>'''
-* Isem n ufaylu i yewǧed: '''<tt>[[:\$2]]</tt>'''
-Amgirred i yella kan deg isekkilen imecṭuḥen/imeqqranen deg taseggiwit (am \".jpg\"/\".jPg\"). G leɛnayek ssenqed-it.",
+'fileexists' => 'Afaylu s yisem-agi yewǧed yagi, ssenqed <strong>[[:$1]]</strong> ma telliḍ mačči meḍmun akken a t-tbeddleḍ.
+[[$1|thumb]]',
+'fileexists-extension' => 'Afaylu s yisem-agi yewǧed: [[$2|thumb]]
+* Isem n ufaylu i tazneḍ: <strong>[[:$1]]</strong>
+* Isem n ufaylu i yewǧed: <strong>[[:$2]]</strong>
+Amgirred i yella kan deg isekkilen imecṭuḥen/imeqqranen deg taseggiwit (am ".jpg"/".jPg"). G leɛnayek ssenqed-it.',
 'fileexists-thumbnail-yes' => "Iban-d belli tugna-nni d tugna tamecṭuht n tugna nniḍen ''(thumbnail)''. [[$1|thumb]]
-G leɛnayek ssenqed tugna-agi '''<tt>[[:$1]]</tt>'''.
+G leɛnayek ssenqed tugna-agi <strong>[[:$1]]</strong>.
 Ma llant kif-kif ur tt-taznepd ara.",
-'file-thumbnail-no' => "Isem n tugna yebda s '''<tt>$1</tt>'''. Waqila tugna-nni d tugna tamecṭuht n tugna nniḍen ''(thumbnail)''.
+'file-thumbnail-no' => "Isem n tugna yebda s <strong>$1</strong>. Waqila tugna-nni d tugna tamecṭuht n tugna nniḍen ''(thumbnail)''.
 Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.",
 'fileexists-forbidden' => 'Tugna s yisem kif-kif tewǧed yagi; g leɛnayek uɣal u beddel isem-is. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Tugna s yisem kif-kif tewǧed yagi; g leɛnayek uɣal u beddel isem-is. [[File:$1|thumb|center|$1]]',
@@ -943,7 +943,7 @@ Aglam-is ɣef [$2 asebter n aglam] ye beqqeḍ ddaw-agi.',
 
 # MIME search
 'mimesearch' => 'Anadi n MIME',
-'mimesearch-summary' => 'Asebter-agi yeǧǧa astay n ifayluwen n unaw n MIME ines. Asekcem: ayen yella/anaw azellum, e.g. <tt>tugna/jpeg</tt>.',
+'mimesearch-summary' => 'Asebter-agi yeǧǧa astay n ifayluwen n unaw n MIME ines. Asekcem: ayen yella/anaw azellum, e.g. <code>tugna/jpeg</code>.',
 'mimetype' => 'Anaw n MIME:',
 'download' => 'Ddem-it ɣer uselkim inek',
 
index d68e560..bca56ac 100644 (file)
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'ТехьэпIэхэр щIэтхъэн:',
-'tog-justify' => 'БгъуагъкIэ напэкIуэцIыр зэгъэзэхуэн',
-'tog-hideminor' => 'ГъэпщкIун: кIуэдкIэ зыхэмылэжьыхьа, щIэуэ яхъуэжа тхылъым',
-'tog-hidepatrolled' => 'ГъэпшкIун гъэтэрэзыгъуэ щIэлъыплъахэм я тхылъ гъэтэрэзыгъуэщIэхэр',
-'tog-newpageshidepatrolled' => 'Ð\93Ñ\8aÑ\8dпÑ\88кIÑ\83н Ð½Ð°Ð¿Ñ\8dкIÑ\83Ñ\8dÑ\86I Ñ\89\8dлÑ\8aÑ\8bплÑ\8aаÑ\85Ñ\8dм Ñ\8f Ñ\82Ñ\85Ñ\8bлÑ\8a Ð½Ð°Ð¿Ñ\8dкIÑ\83Ñ\8dÑ\86I-Ñ\89\8dÑ\85Ñ\8dÑ\80',
+'tog-underline' => 'ТехьэпӀэхэр щӀэтхъэн:',
+'tog-justify' => 'БгъуагъкӀэ напэкӀуэцӀыр зэгъэзэхуэн',
+'tog-hideminor' => 'Гъэтэрэзыгъуэ цӀыкӀухэр гъэпшкӀун, щӀэуэ яхъуэжахэм я тхылъым',
+'tog-hidepatrolled' => 'Гъэтэрэзыгъуэ зыщӀэлъыплъахэр гъэпшкӀун, щӀэуэ яхъуэжахэм я тхылъым',
+'tog-newpageshidepatrolled' => 'Ð\9dапÑ\8dкÓ\80Ñ\83Ñ\8dÑ\86Ó\80 Ð·Ñ\8bÑ\89Ó\80Ñ\8dлÑ\8aÑ\8bплÑ\8aаÑ\85Ñ\8dÑ\80 Ð³Ñ\8aÑ\8dпÑ\88кÓ\80Ñ\83н, Ð½Ð°Ð¿Ñ\8dкÓ\80Ñ\83Ñ\8dÑ\86Ó\80 Ñ\89Ó\80Ñ\8dÑ\85Ñ\8dм Ñ\8f Ñ\82Ñ\85Ñ\8bлÑ\8aÑ\8bм',
 'tog-extendwatchlist' => 'ЩӀэлъыплъыгъуэм и тхылъышхуэ, яужырэй къуэдейхэм нэмыщӀу зэхъуэкӀыгъуэ псори хэту',
 'tog-usenewrc' => 'Гъэтэрэзыгъуэ щӀэхэм я тхылъ нэхъыфӀыр къэгъэсэбэпын (JavaScript хуэныкъуэ)',
 'tog-numberheadings' => 'Псалъащхьэхэм автоматику номер ятын',
@@ -143,6 +143,7 @@ $messages = array(
 'listingcontinuesabbrev' => '(кӀэлъыкуэгъуэ)',
 'index-category' => 'Индекс зырат напэкӀуэцӀхэр',
 'noindex-category' => 'НапэкӀуэцӀ индекс зыхуэмыныкуъэхэр',
+'broken-file-category' => 'Файл техьэпӀэхэр здэмылажэ напэкӀуэцӀхэр',
 
 'about' => 'И гугъу',
 'article' => 'Тхыгъэ',
@@ -199,7 +200,7 @@ $messages = array(
 'print' => 'КъыдэгъэкӀын',
 'view' => 'Еплъын',
 'edit' => 'Гъэтэрэзын',
-'create' => 'ЩIын',
+'create' => 'ЩӀын',
 'editthispage' => 'Мы напэкIуэцIыр гъэтэрэзын',
 'create-this-page' => 'Мыбы и напэкӀуэцӀ щӀын',
 'delete' => 'Ихын',
@@ -225,7 +226,7 @@ $messages = array(
 'projectpage' => 'Проэктым и напэкӀуэцӀым еплъын',
 'imagepage' => 'Файлым и напэкIуэцIым еплъын',
 'mediawikipage' => 'Тхыгъэм и напэкIуэцIым еплъын',
-'templatepage' => 'ШаблонÑ\8bм Ð¸ Ð½Ð°Ð¿Ñ\8dкIÑ\83Ñ\8dÑ\86\8bм Ñ\85Ñ\8dплÑ\8aÑ\8dн',
+'templatepage' => 'ЩапÑ\85Ñ\8aÑ\8dм Ð¸ Ð½Ð°Ð¿Ñ\8dкIÑ\83Ñ\8dÑ\86\8bм ÐµÐ¿Ð»Ñ\8aÑ\8bн',
 'viewhelppage' => 'ЩIэупщIэм и напэкIуэцI',
 'categorypage' => 'Категорием и напэкIуэцIым хэплъэн',
 'viewtalkpage' => 'Тепсэлъыхьыгъуэм еплъын',
@@ -302,6 +303,8 @@ $1',
 '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' => 'Тхыгъэ',
@@ -309,9 +312,9 @@ $1',
 'nstab-media' => 'Медиэ напэкӀуэцӀ',
 'nstab-special' => 'Лэжыгъэ напэкӀуэцӀ',
 'nstab-project' => 'Проэктым теухуауэ',
-'nstab-image' => 'Файл',
+'nstab-image' => 'ТеплÑ\8aÑ\8d',
 'nstab-mediawiki' => 'Тхыгъэ',
-'nstab-template' => 'Шаблон',
+'nstab-template' => 'ЩапÑ\85Ñ\8aÑ\8d',
 'nstab-help' => 'ДэIэпыкъуэгъу',
 'nstab-category' => 'Категориэ',
 
@@ -367,6 +370,7 @@ $1',
 'badarticleerror' => 'А лэжьыгъэр мы напэкӀуэцӀым егъэкӀуэкӀыфынукъым.',
 'cannotdelete' => 'НапэкӀуэцӀыр иэ файл «$1»-р ихыфкъым.
 НэмыщӀ гуэрэм ирихагъэнкӀ хъун.',
+'cannotdelete-title' => 'НапэкӀуэцӀ «$1» ипх хъунукъым',
 'badtitle' => 'ЦӀэр хъунукъым',
 'badtitletext' => 'УзщӀэупщӀэ напэкӀуэцӀым и цӀэр тэрэзкъым, нэщӀ, мытэрэзу интервикир иэ бзэ-зэхуэкур щытщ. И цӀэм дэмыгъэ емыкӀуэалъэ хэтынкӀи хъун.',
 'perfcached' => 'Мы Ӏохугъуэхэр кэшым къыхахэ, яужырей зэхъуэкӀыгъуэхэр химыубыдэнкӀи мэхъу. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -377,11 +381,13 @@ $1',
 Функциэ: $1<br />
 ЩӀэлъэуэгъуэ: $2',
 'viewsource' => 'Хэплъэн',
+'viewsource-title' => 'НапэкӀуэцӀ $1 и япэрей тхыгъэ щытыкӀэм ухуоплъэщ',
 'actionthrottled' => 'ЩӀэхыгъэм убыдыгъэ иӀэ',
 'actionthrottledtext' => 'Анти-спамым пэщытыным шъхьэкӀэ, зэманыгъуэ кӀэщӀым уигугъэр куэду и къэгъэсэбэпыныр теубыдауэ щытщ. 
 Дэкъикъэ зытӀущ тегъэкӀи, иджыри зэ щӀыж.',
 'protectedpagetext' => 'Мы напэкӀуэцӀыр и гъэтэрэзыным теубыдауэ щытщ',
 'viewsourcetext' => 'Мы напэкӀуэцӀым и нэхъыщхьэ тхылъыр мыбдежьым уэплъыфыну, и копиэри ипхыфыну:',
+'viewyourtext' => "Мы напэкӀуэцӀым '''уи гъэтэрызыгъуэхэм''' я тхылъым уеплъыфынущ, тхылъым и копиэри пщӀыфынущ:",
 'protectedinterface' => 'Мы напэкӀуэцӀым интерфейс тхылъ хэтщ, программэтыныгъэм еуэ. Хьэуэйн имыӀэн щхьэкӀэ, и гъэтэрэзыныр теубыдауэ щытщ.',
 'editinginterface' => "'''Гу лъытэ:''' Бгъэтэрэз напэкӀуэцӀым интерфэйс тхылъ хэтщ, программэтыгъэм еуэ.
 И зэхъуэкӀыгъуэм интерфэйсым и сурэтым хэуэну адрей цӀыхухэтхэм щхьэкӀэ.
@@ -533,8 +539,8 @@ $2',
 'headline_tip' => 'ТІуанэ щхьэгъэ псалъащхьэ',
 'nowiki_sample' => 'Формациэ мыщӀа тхыгъэр мыбдеж игъэувэ',
 'nowiki_tip' => 'Вики-форматыр Iухын',
-'image_tip' => 'Файл кӀуэцӀылъу',
-'media_tip' => 'ФайлÑ\8bм и техьэпӀэ',
+'image_tip' => 'ТеплÑ\8aÑ\8d кӀуэцӀылъу',
+'media_tip' => 'ТеплÑ\8aÑ\8dм и техьэпӀэ',
 'sig_tip' => 'Уи ӀэпэщӀэдзымрэ зэман щытехуэмрэ',
 'hr_tip' => 'ЩӀэтхъэгъуэ щӀыхь (куэдрэ къэвмыгъэмэбэп)',
 
@@ -613,10 +619,10 @@ $2',
 'blocked-notice-logextract' => 'Мы цӀыхухэтыр иджыпсту теубыдауэ щытщ.
 ИщӀагъымкӀэ теубыдыгъэ тхылъым и яужырей итхэгъуэр гъэлъэгъуа:',
 'clearyourcache' => "'''Къэохугъуэ:'''Итха яуж зэхъуэкӀыгъу хъуар къэнэн щхьэкӀэ, уи браузэрым и кэшыр гъэкъэбзэн хуэй: '''Mozilla / Firefox''': ''Ctrl+Shift+R'', '''IE:''' ''Ctrl+F5'', '''Safari''': ''Cmd+Shift+R'', '''Konqueror''': ''F5'', '''Opera''': ''Tools→Preferences''-мкӀэ уикӀын хуэй.",
-'usercssyoucanpreview' => "'''Ð\94Ñ\8dÓ\80Ñ\8dпÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83 Ð¿Ñ\81алÑ\8aÑ\8d.''' Ð¢ÐµÐºÑ\8aÑ\83зÑ\8d Â«{{int:showpreview}}» Ñ\83и CSS-Ñ\84айлÑ\8bм еплъын щхьэкӀэ итхэным ипэкӀэ.",
-'userjsyoucanpreview' => "'''Ð\94Ñ\8dÓ\80Ñ\8dпÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83 Ð¿Ñ\81алÑ\8aÑ\8d.''' Ð¢ÐµÐºÑ\8aÑ\83зÑ\8d Â«{{int:showpreview}}» Ñ\83и JS-Ñ\84айл щӀэм еплъыным щхьэкӀэ итхэным ипэкӀэ.",
-'usercsspreview' => 'Уигу игъэлъ, мыр иджыри уи CSS-файлым и пыухыкӀа еплъыгъуэкъым , ар иджыри хъумакъым.',
-'userjspreview' => "'''Ð\97Ñ\8bÑ\89Ñ\83мгÑ\8aÑ\8dгÑ\8aÑ\83пÑ\88Ñ\8d, Ð¼Ñ\8bÑ\80 Ñ\8fпÑ\8d-еплÑ\8a ÐºÑ\8aÑ\83Ñ\8dдей Ñ\83и javascript-Ñ\84айлÑ\8bм, иджыри итхауэ щыткъым!'''",
+'usercssyoucanpreview' => "'''Ð\94Ñ\8dÓ\80Ñ\8dпÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83 Ð¿Ñ\81алÑ\8aÑ\8d.''' Ð¢ÐµÐºÑ\8aÑ\83зÑ\8d Â«{{int:showpreview}}» Ñ\83и CSS-Ñ\82еплÑ\8aÑ\8dм еплъын щхьэкӀэ итхэным ипэкӀэ.",
+'userjsyoucanpreview' => "'''Ð\94Ñ\8dÓ\80Ñ\8dпÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83 Ð¿Ñ\81алÑ\8aÑ\8d.''' Ð¢ÐµÐºÑ\8aÑ\83зÑ\8d Â«{{int:showpreview}}» Ñ\83и JS-Ñ\82еплÑ\8aÑ\8d щӀэм еплъыным щхьэкӀэ итхэным ипэкӀэ.",
+'usercsspreview' => "'''Гу лъытэ, мыр япэ-еплъ къуэдейщ уи CSS-теплъэм, иджыри итхауэ щыткъым!'''",
+'userjspreview' => "'''Ð\93Ñ\83 Ð»Ñ\8aÑ\8bÑ\82Ñ\8d, Ð¼Ñ\8bÑ\80 Ñ\8fпÑ\8d-еплÑ\8a ÐºÑ\8aÑ\83Ñ\8dдейÑ\89 Ñ\83и javascript-Ñ\82еплÑ\8aÑ\8dм, иджыри итхауэ щыткъым!'''",
 'sitecsspreview' => "'''Зыщумгъэгъупшэ, мыр япэ-еплъ къуэдеуэ щытщ мы CSS-м.'''
 '''Иджыри итхауэ щыткъым!'''",
 'sitejspreview' => "'''Зыщумгъэгъупшэ, мыр япэ-еплъ къуэдеуэ щытщ мы JavaScript-кодым.'''
@@ -625,6 +631,7 @@ $2',
 'updated' => '(КъэгъэщӀырыщӀащ)',
 'note' => "'''Гулъытыгъуэ:'''",
 'previewnote' => "'''Мыр япэ-еплъ къуэдей, тхылъыр иджыри итхакъым!'''",
+'continue-editing' => 'Гъэтэрэзыгъуэм тегъэзэжьын',
 'previewconflict' => 'Мы япэ-еплъым тхылъыр редакторым и ищхьэ лъэныкъуэм дежь егъэлъыгъуэ зэрщытыным хуэду, иптхэн уигугъэ хъумэ.',
 'session_fail_preview' => "'''Хэукъуэгъуэ къыхэкӀа, серверым у гъэтэрэзыгъуэр къиштэфакъым сессиэм и идентификациэр фӀэкӀуэдри.
 Иджыри зэ щӀыжьи еплъ.
@@ -638,7 +645,9 @@ $2',
 'token_suffix_mismatch' => "'''Уи гъэтэрэзыгъуэр къэштауэ щыткъым, уи программэм тэрэзу дэмыгъэ пыгъэувэхэм зэремылэжьым щхьэкӀэ 
 гъэтэрэзыгъуэ лъэныкъуэгъым. Гъэтэрэзыгъуэр къыкӀимыштар тхыгъэм и тхылъыр къуаншэ мыхъун щхьэкӀэ.
 Апхуэдэ хэукъуэгъуэхэр къызхэкӀыфынур аноним зыщӀ уэб-проксихэм, хэукъуэгъуэ зыхэлъхэм.'''",
+'edit_form_incomplete' => "'''Гъэтэрэзыгъуэ формэм и Ӏыхьэ гуэрэхэр серверым нэсакъым. Хэплъэ, уи гъэтэрэзыгъуэхэр зэӀымхьами, иджыри зэ гъэкӀуэж.'''",
 'editing' => 'Гъэтэрэзын: $1',
+'creating' => 'ЩӀын $1',
 'editingsection' => 'Гъэтэрэзын $1 (секцэр)',
 'editingcomment' => 'Гъэтэрэзыгъуэ $1 (лъэныкъуэгъу/секциэ щӀэ)',
 'editconflict' => 'Редактированием зэпэщӀэуэныгъэ: $1',
@@ -675,9 +684,9 @@ $2',
 'cascadeprotectedwarning' => "'''Гу лъытэ:''' Мы напэкӀуэцӀыр згъэтэрэзыфынухэр «Тхьэмадэхэр» щыщ гупым хэтхэра, {{PLURAL:$1|напэкӀуэцӀ къыкӀэлъыкӀуэм щхьэкӀэ|напэкӀуэцӀ къыкӀэлъыкӀуэхэм щхьэкӀэ}} каскад хъунэныгъэ зэрателъым теухуауэ:",
 'titleprotectedwarning' => "'''Гу лъытэ. Мы напэкӀуэцӀыр зэхъуэкӀыныгъэхэм щхьэкӀэ ятеубыдауэ щытщ, зэзхъуэкӀыфынухэр [[Special:ListGroupRights|абым теухуа пӀалъэ]] зиӀэ цӀыхухэтхэм.''' 
 ИщӀагъымкӀэ тхыдэтхылъым и яужырей тхыгъэр итщ:",
-'templatesused' => '{{PLURAL:$1|Шаблон|Шаблонхэр}} напэкӀуэцӀым и версиэ екӀуэкӀым хэтхэр:',
-'templatesusedpreview' => '{{PLURAL:$1|Шаблон|Шаблонхэр}} напэкӀуэцӀым и япэ-еплъым хэтхэр:',
-'templatesusedsection' => 'Ð\9cÑ\8b Ð»Ñ\8aÑ\8dнÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83м {{PLURAL:$1|Шаблон ÐºÑ\8aагÑ\8aÑ\8dÑ\89Ñ\85Ñ\8cÑ\8dпаÑ\80|Шаблон ÐºÑ\8aагъэщхьэпахэр}}:',
+'templatesused' => 'НапэкӀуэцӀым и версиэ екӀуэкӀым {{PLURAL:$1|щапхъэ|щапхъэ}} хэтхахэр:',
+'templatesusedpreview' => 'НапэкӀуэцӀым и япэ-еплъым {{PLURAL:$1|щапхъэ|щапхъэ}} хэтхахэр:',
+'templatesusedsection' => 'Ð\9cÑ\8b ÐºÑ\8aÑ\83дамÑ\8dм {{PLURAL:$1|Ñ\89апÑ\85Ñ\8aÑ\8d ÐºÑ\8aÑ\8dгÑ\8aÑ\8dÑ\89Ñ\85Ñ\8cÑ\8dпаÑ\80\89апÑ\85Ñ\8aÑ\8d ÐºÑ\8aÑ\8dгъэщхьэпахэр}}:',
 'template-protected' => '(теубыдащ)',
 'template-semiprotected' => '(иныкъуэр теубыдащ)',
 'hiddencategories' => 'Мы напэкӀуэцӀыр зхэхьэр $1 {{PLURAL:$1|1 категориэ зэхуэща|$1 категориэ зэхуэщахэр}}:',
@@ -705,21 +714,28 @@ $2',
 'edit-no-change' => 'Уи гъэтэрэзыгъуэр хахыжащ, тхыгъэм зэхъуэкӀыгъуэ зэрхэмыхьэм щхьэкӀэ.',
 'edit-already-exists' => 'НапэкӀуэцӀыщӀэ щӀыфынукъым.
 ЩыӀэщ апхуэдэ.',
+'defaultmessagetext' => 'КъыхигъэкӀа тхыгъэхэр',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Гу лъытэ. Мы напэкӀуэцӀым ресурсышхуэ хэзылъхьэ функциэ куэд хэлъщ.
 
 Хэлъхьэгъуэ хэтыфынур здынэгъэсар $2 {{PLURAL:$2|хэлъхьэгъу|хэлъхьэгъуэху}}, мыбдежым хуэныкъу щӀын хуэйр {{PLURAL:$1|$1 хэлъхьэгъуэ|$1 хэлъхьэгъу}}.',
 'expensive-parserfunction-category' => 'Ресурсышхуэ хэзылъхьэ функциэ куэду зыхэлъ напэкӀуэцӀхэр',
-'post-expand-template-inclusion-warning' => "'''Ð\93Ñ\83 Ð»Ñ\8aÑ\8bÑ\82Ñ\8d:''' Ñ\88аблон хэтхэм я бжыгъэр зэфӀэкӀыгъуэм къехъу щытщ.
¨Ð°Ð±Ð»Ð¾Ð½Ñ\85Ñ\8dм Ñ\8fÑ\89Ñ\8bÑ\89 Ð³Ñ\83Ñ\8dÑ\80Ñ\8dÑ\85Ñ\8dÑ\80 Ñ\85Ñ\8dгÑ\8aÑ\8dкÓ\80Ñ\8bжаÑ\83Ñ\8d ÐºÑ\8aÑ\8dнÑ\8dнÑ\83Ñ\85Ñ\8dщ.",
-'post-expand-template-inclusion-category' => 'Ð\9dапÑ\8dкÓ\80Ñ\83Ñ\8dÑ\86Ó\80Ñ\85Ñ\8dÑ\80, Ñ\88аблон я хэтхэм я бжыгъэр зэфӀэкӀыгъуэм къехъу щытхэр',
-'post-expand-template-argument-warning' => "'''Гу лъытэ:''' Мы напэкӀуэцӀым шаблоным и зы аргумент хэт, зэгъэзэнщӀэным щхьэкӀэ иныщу щыту.
+'post-expand-template-inclusion-warning' => "'''Ð\93Ñ\83 Ð»Ñ\8aÑ\8bÑ\82Ñ\8d:''' Ñ\89апÑ\85Ñ\8aÑ\8d хэтхэм я бжыгъэр зэфӀэкӀыгъуэм къехъу щытщ.
©Ð°Ð¿Ñ\85Ñ\8aÑ\8dÑ\85Ñ\8dм Ñ\8fÑ\89Ñ\8bÑ\89 Ð³Ñ\83Ñ\8dÑ\80Ñ\8dÑ\85Ñ\8dÑ\80 Ñ\85Ñ\8dмÑ\8bÑ\82Ñ\85аÑ\83Ñ\8d ÐºÑ\8aÑ\8dнÑ\8dнÑ\83щ.",
+'post-expand-template-inclusion-category' => 'Ð\9dапÑ\8dкÓ\80Ñ\83Ñ\8dÑ\86Ó\80Ñ\85Ñ\8dÑ\80, Ñ\89апÑ\85Ñ\8aÑ\8d я хэтхэм я бжыгъэр зэфӀэкӀыгъуэм къехъу щытхэр',
+'post-expand-template-argument-warning' => "'''Гу лъытэ!''' мы напэкӀуэцӀым зы щапхъэ, мынэхъмащӀэу хэтщ, и аргумент зэгъэзэнщӀэныр иныщэу щыту.
 Апхуэдэ аргументхэм гулъытэгъуэ ирамтауэ щытщ.",
-'post-expand-template-argument-category' => 'Шаблонхэм я аргументхэр хэзмыубыда напэкӀуэцӀхэр',
-'parser-template-loop-warning' => 'Ð¥Ñ\8dÑ\83кÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83Ñ\8d ÐºÑ\8aÑ\8bÑ\85Ñ\8dкÓ\80аÑ\89 Ñ\88аблонхэм: [[$1]]',
-'parser-template-recursion-depth-warning' => 'ШаблонÑ\8bм Ð¸ Ñ\80екÑ\83Ñ\80Ñ\81иÑ\8d Ð·Ñ\8dÑ\84Ó\80Ñ\8dкÓ\80Ñ\8bгÑ\8aÑ\83Ñ\8dр къегъэхъуауэ щытщ (1$)',
+'post-expand-template-argument-category' => 'ЩапÑ\85Ñ\8aÑ\8dхэм я аргументхэр хэзмыубыда напэкӀуэцӀхэр',
+'parser-template-loop-warning' => 'Ð¥Ñ\8dÑ\83кÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83Ñ\8d ÐºÑ\8aÑ\8bÑ\85Ñ\8dкÓ\80аÑ\89 Ñ\89апÑ\85Ñ\8aÑ\8dхэм: [[$1]]',
+'parser-template-recursion-depth-warning' => 'ЩапÑ\85Ñ\8aÑ\8d Ñ\80екÑ\83Ñ\80Ñ\81иÑ\8dм Ð¸ ÐºÑ\83Ñ\83агÑ\8aÑ\8bр къегъэхъуауэ щытщ (1$)',
 'language-converter-depth-warning' => 'Бзэ гъэзанщӀэгъуэм и зэфӀэкӀыгъуэр къегъэхъуауэ щытщ (1$)',
+'node-count-exceeded-category' => 'ЗэпхырыкӀыгъуэхэм я бжыгъэр къехъу здэщыт напэкӀуэцӀхэр',
+'node-count-exceeded-warning' => 'НапэкӀуэцӀым зэпхырыкӀыгъуэ хэтым я бжыгъэр къехъу щытщ',
+'expansion-depth-exceeded-category' => 'НапэкӀуэцӀым и зыубгъуэн Ӏувагъыр къехъу щытщ',
+'expansion-depth-exceeded-warning' => 'НапэкӀуэцӀып и зэфӀэгъэкӀыгъуэр къегъэхъуауэ щытщ',
+'parser-unstrip-loop-warning' => 'Зэрыдзэгъуэ зэхуэмыщӀа къыхэкӀащ',
+'parser-unstrip-recursion-limit' => 'Рекурсым и зэфӀэгъэкӀыгъуэр къегъэхъуауэ щытщ ($1)',
 
 # "Undo" feature
 'undo-success' => 'Гъэтэрэзыгъуэр хахыжьыфынущ. Версиэхэм я зэгъэпшыгъуэ егъэкӀуэкӀ, узхуэныкъуэхэрамэ пщӀам еплъи «НапэкӀуэцӀыр итхэн»-ым текъузэ, зэхъуэкӀыгъуэхэр хэхьэным щхьэкӀэ.',
@@ -864,14 +880,44 @@ $1",
 'suppressionlogtext' => 'ИщӀагъымкӀэ гъэлъэгъуауэ щыт яужырей ихыгъуэхэмрэ теубыдэгъуэхэмрэ я тхылъ, тхьэмадэхэм ямгъэлъэгъуа хъыбархэр хэтху.
 Еплъ [[Special:IPBlockList|IP-теубыдыгъуэхэм я тхылъ]], екӀуэкӀ теубыдэгъуэхэр лъагъун щхьэкӀэ.',
 
+# History merging
+'mergehistory' => 'Гъэтэрэзыгъуэхэм я тхыдэ зыуэ зэхэгъэхьа',
+'mergehistory-header' => 'Мы напэкӀуэцӀым деж зы пщӀыфынущ зэщымыщ напэкӀуэцӀытӀым я гъэтэрэзыгъуэ тхыдэр.
+Гу лъытэ, уи гъэтэрэзыгъуэм напэкӀуэцӀым и тхыдэр псоуэ къигъэнэн зэрыхуейм.',
+'mergehistory-box' => 'НапэкӀуэцӀитӀым я гъэтэрэзыгъуэ тхыдэр зы щӀын:',
+'mergehistory-from' => 'Япэреуэ напэкӀуэцӀыр:',
+'mergehistory-into' => 'НапэкӀуэцӀыр псоуэ:',
+'mergehistory-list' => 'Гъэтэрэзыгъуэхэм я тхыдэ зы хъур',
+'mergehistory-go' => 'Гъэтэрэзыгъуэ зы хъухэр гъэлъэгъуэн',
+'mergehistory-submit' => 'Гъэтэрэзыгъуэхэр зы щӀын',
+'mergehistory-empty' => 'Гъэтэрэзыгъуэ зы щӀынхэр къэгъуэтакъым.',
+'mergehistory-success' => '$3 {{PLURAL:$3|гъэтэрэзыгъуэ}} [[:$1]] щыщхэр {{PLURAL:$3|ехьэкӀащ|ехьэкӀахэщ}} [[:$2]].',
+'mergehistory-fail' => 'НапэкӀуэцӀхэм я тхыдэр зы щӀын хъуакъым, напэкӀуэцӀым и щыпхъэхэм еплъщ я зэфӀэкӀыгъуэхэм.',
+'mergehistory-no-source' => 'Япэрей щытыкӀэу напӀэкӀуэцӀ «$1» гъуэтакъым.',
+'mergehistory-invalid-source' => 'КъыхэхыпӀэм псалъащхьэ захуэ иӀэн хуейщ.',
+'mergehistory-invalid-destination' => 'НапэкӀуэцӀ псоуэ щытым псалъащхьэ зауэ иӀэн хуейщ.',
+'mergehistory-autocomment' => 'ЕхьэкӀыгъуэ [[:$1]] къыхэхауэ [[:$2]] гъэкӀуэн',
+'mergehistory-comment' => 'ЕхьэкӀыгъуэ [[:$1]] къыхэхауэ [[:$2]] гъэкӀуэн: $3',
+'mergehistory-same-destination' => 'Япэрейуэ щыт напэкӀуэцӀымрэ напэкӀуэцӀ псоуэ щытымрэ зэщхьэщыкӀын хуейщ',
+'mergehistory-reason' => 'Зытеухуар:',
+
 # Merge log
+'mergelog' => 'Зэхэгъэхьэгъуэхэм я тхылъ',
+'pagemerge-logentry' => 'Зы щӀащ [[$1]]-рэ [[$2]]-рэ (версиэхэр $3 нэгъунэ)',
 'revertmerge' => 'Зыхэдзын',
+'mergelogpagetext' => 'ИщӀагъымкӀэ зэхэгъэхьэгъуэхэм я тхыдэм и тхылъыр напэкӀуэцӀым еуэ гъэлъэгъуащ',
 
 # Diffs
-'history-title' => '$1 - зэхъуэкIыныгъэм и тхыдэ',
+'history-title' => '"$1" и зэхъуэкIыныгъэм и тхыдэр',
+'difference-title' => '"$1" версиэм я зэщхьэщыкӀыгъуэ',
+'difference-title-multipage' => 'НапэкӀуэцӀ "$1"-рэ "$2"-рэ я зэщхьэщыкӀыгъуэхэр',
+'difference-multipage' => '(НапэкӀуэцӀхэм я зэщхьэщыкӀыгъуэр)',
 'lineno' => 'Сатыр $1:',
 'compareselectedversions' => 'Хэха версиэхэр зэгъэпщэн',
+'showhideselectedversions' => 'Гъэлъэгъуэн/гъэпшкӀун версиэ хэхахэр',
 'editundo' => 'щӀегъуэжын',
+'diff-multi' => '({{PLURAL:$1|курыт версиэ $1-м ер гъэлъэгъуакъым|курыт версиэхэр $1-м ер гъэлъэгъуакъым}} {{PLURAL:$2|цӀыхухэт 2$|цӀыхухэтхэм 2$}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|курыт версиэ $1-м ер гъэлъэгъуащ|курыт версиэхэр $1-м ер гъэлъэгъуащ}}, щӀахэщ $2 нэхъыбэу {{PLURAL:$2|цӀыхухэт|цӀыхухэтхэм}})',
 
 # Search results
 'searchresults' => 'Лъыхъуэным къыхэкӀахэр',
@@ -895,12 +941,17 @@ $1",
 'search-interwiki-more' => '(иджыри)',
 'search-mwsuggest-enabled' => 'чэнджэш иӀэу',
 'search-mwsuggest-disabled' => 'чэнджэщыншэу',
-'nonefound' => "'''Гулъытыгъуэ.''' Тэрэзу имытхамэ узхуэныкъуэр, лъыхъуэгъуэр лъэныкъу хъуамкӀи ирегъэкӀуэкӀ. Къэгъэсэбэп ''all:'' пыгъувэгъуэр, зэгъэзэхуэгъуэ иӀэн щхьэкӀэ (хэтхэм я тепсэлъыхьыныгъэр, шаблонхэр, нымыщӀхэр джоуэ хиубыдэным щхьэ), иэ узхуэныкъуэ лъэныкъуэр итхэ.",
+'nonefound' => "'''Гулъытыгъуэ.''' Тэрэзу имытхамэ узхуэныкъуэр, лъыхъуэгъуэр лъэныкъу хъуамкӀи ирегъэкӀуэкӀ. Къэгъэсэбэп ''all:'' пыгъувэгъуэр, зэгъэзэхуэгъуэ иӀэн щхьэкӀэ (хэтхэм я тепсэлъыхьыныгъэр, щапхъэхэр, нымыщӀхэр джоуэ хиубыдэным щхьэ), иэ узхуэныкъуэ лъэныкъуэр итхэ.",
+'search-nonefound' => 'Узлъыхъуэм техуэу щыӀэкъым.',
 'powersearch' => 'Убгъуауэ лъыхъу',
 'powersearch-legend' => 'Убгъуауэ лъыхъу',
 'powersearch-ns' => 'ЦIэзэхэтыгъуэм щылъыхъуэн',
 'powersearch-redir' => 'ЕгъэзэкӀахэри гъэлъэгъуэн',
 'powersearch-field' => 'Лъыхъуэн',
+'powersearch-togglelabel' => 'Къыхэхын:',
+'powersearch-toggleall' => 'Псори',
+'powersearch-togglenone' => 'Зыри/пари',
+'search-external' => 'ХэкӀауэ лъыхъуэн',
 
 # Preferences page
 'preferences' => 'Зэгъэзэхуэпхъэхэр',
index 69e8cb8..d28025d 100644 (file)
@@ -234,7 +234,7 @@ $messages = array(
 'jumptonavigation' => 'رہنمائی',
 'jumptosearch' => 'تلاش',
 'view-pool-error' => 'معذرت: تمام سرورا موجودہ وختہ اِضافی بوجھ شیر.
ہت زیادہ صارفین موجودہ وختہ ھیہ صفحو لاڑینیان 
و زیادہ صارفین موجودہ وختہ ھیہ صفحو لاڑینیان 
 برائے مہربانی! صفحو لوڑیکو بچے دوبارہ کوشش کوریکاری پروشٹی پھوکرو انتظار کورے.
 
 $1',
@@ -715,7 +715,7 @@ HTML tags لوڑے.',",
 'recentchangeslinked-summary' => "ھیہ ھتے تبدیلیان لسٹ شیر کہ ھیتان پھوک مدا پروشٹی ساوزینو بیتی شینی وا ھے صفحان سوم جستہ خور کیہ صفحہ چوکی شینی یا کیہ خاص زمرہ جاتو ممبرانن سوم چوکی شینی<br />
 ساوزیرو [[Special:Watchlist|موڑا صفحہ]] '''بولڈ''' شینی",
 'recentchangeslinked-page' => 'کھوار ویکیپیڈیو منصوبو صفحو لوڑے',
-'recentchangeslinked-to' => 'Ú©Ú¾Ù\84Ù\88Ù\84اÙ\88 Ø¨Û\8cرÙ\88 ØµÙ\81Ø­Ù\88 Ø¨Ø¬Ø§Û\8cا Ú¾Ù\85Ù\88 Ø³Ù\88Ù\85 Ú\86Ù\88Ú©Û\8cرÙ\88 ØµÙ\81Ø­Ù\88 Ù\86Ù\88غ ØªØ¨Ø¯Û\8cÙ\84Û\8cاÙ\86 Ù¾Ø´Ø§Ù\88Û\92',
+'recentchangeslinked-to' => 'کھولاو بیرو صفحو بجایا ھمو سوم چوکیرو صفحو نوغ تبدیلیان پشاوے',
 
 # Upload
 'upload' => 'فائل انځاوے',
index 2037d87..cf9fff0 100644 (file)
 
 $fallback = 'tr';
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Medya',
+       NS_SPECIAL          => 'Xısusi',
+       NS_TALK             => 'Werênayış',
+       NS_USER             => 'Karber',
+       NS_USER_TALK        => 'Karber_werênayış',
+       NS_PROJECT_TALK     => '$1_werênayış',
+       NS_FILE             => 'Dosye',
+       NS_FILE_TALK        => 'Dosya_werênayış',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_werênayış',
+       NS_TEMPLATE         => 'Şablon',
+       NS_TEMPLATE_TALK    => 'Şablon_werênayış',
+       NS_HELP             => 'Peşti',
+       NS_HELP_TALK        => 'Peşti_werênayış',
+       NS_CATEGORY         => 'Kategoriye',
+       NS_CATEGORY_TALK    => 'Kategori_werênayış',
+);
+
+$namespaceAliases = array(
+       // Turkish namespace names.
+       'Medya'              => NS_MEDIA,
+       'Özel'               => NS_SPECIAL,
+       'Tartışma'           => NS_TALK,
+       'Kullanıcı'          => NS_USER,
+       'Kullanıcı_mesaj'    => NS_USER_TALK,
+       '$1_tartışma'        => NS_PROJECT_TALK,
+       'Dosya'              => NS_FILE,
+       'Dosya_tartışma'     => NS_FILE_TALK,
+       'MediaWiki_tartışma' => NS_MEDIAWIKI_TALK,
+       'Şablon'             => NS_TEMPLATE,
+       'Şablon_tartışma'    => NS_TEMPLATE_TALK,
+       'Yardım'             => NS_HELP,
+       'Yardım_tartışma'    => NS_HELP_TALK,
+       'Kategori'           => NS_CATEGORY,
+       'Kategori_tartışma'  => NS_CATEGORY_TALK,
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Bınê girey de xete bonce:',
@@ -29,17 +67,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Qısımu be teqnaena serrêze ra ebe gozaga raste bıvurne (JavaScript lazımo)',
 'tog-showtoc' => 'Tabloê tedeesteu basne (de pelunê be hirê sernustu ra jêdêri de)',
 'tog-rememberpassword' => 'Parola mı nê cıcêraoği de bia ho viri (serba tewr jêde $1 {{PLURAL:$1|roze|rozu}}).',
-'tog-watchcreations' => 'Pelê ke mı afernê, lista mına şêrkerdişi ke',
-'tog-watchdefault' => 'Pelê ke mı vurnê, lista mına şêrkerdişi ke',
-'tog-watchmoves' => 'Pelê ke mı kırısnê, lista mına şêrkerdişi ke',
-'tog-watchdeletion' => 'Pelê ke mı esterıtê, lista mına şêrkerdişi ke',
+'tog-watchcreations' => 'Pelê ke mı afernê u dosyê ke mı bar kerdê lista mına şêrkerdişi ke',
+'tog-watchdefault' => 'Pel u dosyê ke mı vurnê lista mına şêrkerdişi ke',
+'tog-watchmoves' => 'Pel u dosyê ke mı kırısnê lista mına şêrkerdişi ke',
+'tog-watchdeletion' => 'Pel u dosyê ke mı esterıtê, lista mına şêrkerdişi ke',
 'tog-minordefault' => 'Vurnaisunê ho pêrune ‘vurnaiso qızkek’ nisan bıde',
 'tog-previewontop' => 'Verqayti pela nustene ser de basne',
 'tog-previewonfirst' => 'Vurnaiso verên de verqayti tım basne',
 'tog-nocache' => 'Pelunê cıcêraoği mia ho viri',
-'tog-enotifwatchlistpages' => 'Pela ke ez şêr kenune eke vurnê mı rê e-poste bırusne',
+'tog-enotifwatchlistpages' => 'Zu pele ya ki dosyawa ke lista mına şêrkerdişi de vurnê mı rê e-poste bırusne',
 'tog-enotifusertalkpages' => 'Pela mına hurênaişi ke vurnê mı rê e-poste bırusne',
-'tog-enotifminoredits' => 'Vurnaisunê qızkeku de ki mı rê e-poste bırusne',
+'tog-enotifminoredits' => 'Vurnaisunê qızkekunê pelun u dosyu de ki mı rê e-poste bırusne',
 'tog-enotifrevealaddr' => 'Adresa e-postê mı postê xeberu de basne',
 'tog-shownumberswatching' => 'Amorê karberunê şêrkerdoğu basne',
 'tog-oldsig' => 'Verqaytê imza mewcude:',
@@ -560,7 +598,7 @@ Vurnayışê tu hama qeyd nıbiyo!",
 'yourtext' => 'Metnê to',
 'storedversion' => 'Metıno qeydkerde',
 'yourdiff' => 'Ferqi',
-'copyrightwarning' => "Diqet ke, iştırakê ke benê be pela {{SITENAME}}i, pêro bınê $2 de rakerde vêrenê (serba daêna melumati qaytê $1 ke).
+'copyrightwarning' => "Diqet ke, iştıraqê ke benê be pela {{SITENAME}}i, pêro bınê $2 de rakerde vêrenê (serba daêna melumati qaytê $1 ke).
 İştırakunê ho, eke nêwazena wa terefê binu ra bıvuriyê ya ki caunê binu ra vıla bê, o taw ita menuse.<br />
 Zobina ki ebe ita nustene ra sond wena ke nê iştıraki terefê to ra nuşiyê, ya çımê do rakerdey ra ya ki çımê do serbest ra kopya biyê.
 '''Gurêo ke ebe telifheqiye ra sevekiyo bê destur ita darde meke!'''",
@@ -1062,7 +1100,7 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
 'booksources-go' => 'So',
 
 # Special:Log
-'specialloguserlabel' => 'Karber:',
+'specialloguserlabel' => 'Kerdoğ:',
 'speciallogtitlelabel' => 'Sernuste:',
 'log' => 'Qeydi',
 
@@ -1224,7 +1262,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 # Contributions
 'contributions' => 'İştırakê karberi',
 'contributions-title' => '$1 de iştırakê karberi',
-'mycontris' => 'İştırakê mı',
+'mycontris' => 'İştıraqê mı',
 'contribsub2' => 'Serba $1 ($2)',
 'uctop' => '(ser)',
 'month' => 'Asme ra (u ravêr):',
@@ -1237,7 +1275,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 'sp-contributions-talk' => 'hurênais',
 'sp-contributions-search' => 'Ebe iştıraku cı feteliye',
 'sp-contributions-username' => 'IP ya ki karber:',
-'sp-contributions-toponly' => 'Teyna revizyonanê tewr peniyan bimocne',
+'sp-contributions-toponly' => 'Tenya rewizyonanê tewr peyniyan bimocne',
 'sp-contributions-submit' => 'Cı feteliye',
 
 # What links here
index 6b5676e..bf7d354 100644 (file)
@@ -46,10 +46,6 @@ $separatorTransformTable = array(
        ',' => '٬', # &#x066c;
 );
 
-$extraUserToggles = array(
-       'nolangconversion'
-);
-
 $fallback8bitEncoding = 'windows-1256';
 
 $namespaceNames = array(
@@ -184,130 +180,130 @@ $dateFormats = array(
  * This array can be modified at runtime with the LanguageGetMagic hook
  */
 $magicWords = array(
-       'redirect'                => array( '0', '#ايداۋ', '#АЙДАУ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__مازمۇنسىز__', '__مسىز__', '__МАЗМҰНСЫЗ__', '__МСЫЗ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__قويماسىز__', '__قسىز__', '__ҚОЙМАСЫЗ__', '__ҚСЫЗ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__مازمۇنداتقىزۋ__', '__مقىزۋ__', '__МАЗМҰНДАТҚЫЗУ__', '__МҚЫЗУ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__مازمۇنى__', '__مزمن__', '__МАЗМҰНЫ__', '__МЗМН__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__بولىدىموندەمەۋ__', '__بولىموندەتكىزبەۋ__', '__БӨЛІДІМӨНДЕМЕУ__', '__БӨЛІМӨНДЕТКІЗБЕУ__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'اعىمداعىاي', 'АҒЫМДАҒЫАЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'اعىمداعىاياتاۋى', 'АҒЫМДАҒЫАЙАТАУЫ', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'اعىمداعىايىلىكاتاۋى', 'АҒЫМДАҒЫАЙІЛІКАТАУЫ', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'اعىمداعىايجىيىر', 'اعىمداعىايقىسقا', 'АҒЫМДАҒЫАЙЖИЫР', 'АҒЫМДАҒЫАЙҚЫСҚА', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'اعىمداعىكۇن', 'АҒЫМДАҒЫКҮН', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'اعىمداعىكۇن2', 'АҒЫМДАҒЫКҮН2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'اعىمداعىكۇناتاۋى', 'АҒЫМДАҒЫКҮНАТАУЫ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'اعىمداعىجىل', 'АҒЫМДАҒЫЖЫЛ', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'اعىمداعىۋاقىت', 'АҒЫМДАҒЫУАҚЫТ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'اعىمداعىساعات', 'АҒЫМДАҒЫСАҒАТ', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'جەرگىلىكتىاي', 'ЖЕРГІЛІКТІАЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'جەرگىلىكتىاياتاۋى', 'ЖЕРГІЛІКТІАЙАТАУЫ', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'جەرگىلىكتىايىلىكاتاۋى', 'ЖЕРГІЛІКТІАЙІЛІКАТАУЫ', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'جەرگىلىكتىايجىيىر', 'جەرگىلىكتىايقىسقاشا', 'جەرگىلىكتىايقىسقا', 'ЖЕРГІЛІКТІАЙЖИЫР', 'ЖЕРГІЛІКТІАЙҚЫСҚАША', 'ЖЕРГІЛІКТІАЙҚЫСҚА', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'جەرگىلىكتىكۇن', 'ЖЕРГІЛІКТІКҮН', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'جەرگىلىكتىكۇن2', 'ЖЕРГІЛІКТІКҮН2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'جەرگىلىكتىكۇناتاۋى', 'ЖЕРГІЛІКТІКҮНАТАУЫ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'جەرگىلىكتىجىل', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'جەرگىلىكتىۋاقىت', 'ЖЕРГІЛІКТІУАҚЫТ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'جەرگىلىكتىساعات', 'ЖЕРГІЛІКТІСАҒАТ', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'بەتسانى', 'БЕТСАНЫ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ماقالاسانى', 'МАҚАЛАСАНЫ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'فايلسانى', 'ФАЙЛСАНЫ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'قاتىسۋشىسانى', 'ҚАТЫСУШЫСАНЫ', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'وڭدەمەسانى', 'تۇزەتۋسانى', 'ӨҢДЕМЕСАНЫ', 'ТҮЗЕТУСАНЫ', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'بەتاتاۋى', 'БЕТАТАУЫ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'بەتاتاۋى2', 'БЕТАТАУЫ2', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ەسىماياسى', 'ЕСІМАЯСЫ', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ەسىماياسى2', 'ЕСІМАЯСЫ2', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'تالقىلاۋاياسى', 'ТАЛҚЫЛАУАЯСЫ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'تالقىلاۋاياسى2', 'ТАЛҚЫЛАУАЯСЫ2', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'تاقىرىپبەتى', 'ماقالابەتى', 'ТАҚЫРЫПБЕТІ', 'МАҚАЛАБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'تاقىرىپبەتى2', 'ماقالابەتى2', 'ТАҚЫРЫПБЕТІ2', 'МАҚАЛАБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'تولىقبەتاتاۋى', 'ТОЛЫҚБЕТАТАУЫ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'تولىقبەتاتاۋى2', 'ТОЛЫҚБЕТАТАУЫ2', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'بەتشەاتاۋى', 'استىڭعىبەتاتاۋى', 'БЕТШЕАТАУЫ', 'АСТЫҢҒЫБЕТАТАУЫ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'بەتشەاتاۋى2', 'استىڭعىبەتاتاۋى2', 'БЕТШЕАТАУЫ2', 'АСТЫҢҒЫБЕТАТАУЫ2', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'نەگىزگىبەتاتاۋى', 'НЕГІЗГІБЕТАТАУЫ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'نەگىزگىبەتاتاۋى2', 'НЕГІЗГІБЕТАТАУЫ2', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'تالقىلاۋبەتاتاۋى', 'ТАЛҚЫЛАУБЕТАТАУЫ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'تالقىلاۋبەتاتاۋى2', 'ТАЛҚЫЛАУБЕТАТАУЫ2', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'تاقىرىپبەتاتاۋى', 'ماقالابەتاتاۋى', 'ТАҚЫРЫПБЕТАТАУЫ', 'МАҚАЛАБЕТАТАУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'تاقىرىپبەتاتاۋى2', 'ماقالابەتاتاۋى2', 'ТАҚЫРЫПБЕТАТАУЫ2', 'МАҚАЛАБЕТАТАУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'حبر:', 'ХБР:', 'MSG:' ),
-       'subst'                   => array( '0', 'بادەل:', 'БӘДЕЛ:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'ۋىيكىيسىزحبر:', 'УИКИСІЗХБР:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'نوباي', 'нобай', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'نوباي=$1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'وڭعا', 'وڭ', 'оңға', 'оң', 'right' ),
-       'img_left'                => array( '1', 'سولعا', 'سول', 'солға', 'сол', 'left' ),
-       'img_none'                => array( '1', 'ەشقانداي', 'جوق', 'ешқандай', 'жоқ', 'none' ),
-       'img_width'               => array( '1', '$1 نۇكتە', '$1 нүкте', '$1px' ),
-       'img_center'              => array( '1', 'ورتاعا', 'ورتا', 'ортаға', 'орта', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'سۇرمەلى', 'сүрмелі', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'سۇرمەسىز', 'сүрмесіз', 'frameless' ),
-       'img_page'                => array( '1', 'بەت=$1', 'بەت $1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'تىكتى', 'تىكتىك=$1', 'تىكتىك $1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'جىييەكتى', 'жиекті', 'border' ),
-       'img_baseline'            => array( '1', 'تىرەكجول', 'тірекжол', 'baseline' ),
-       'img_sub'                 => array( '1', 'استىلىعى', 'است', 'астылығы', 'аст', 'sub' ),
-       'img_super'               => array( '1', 'ۇستىلىگى', 'ۇست', 'үстілігі', 'үст', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'ۇستىنە', 'үстіне', 'top' ),
-       'img_text_top'            => array( '1', 'ماتىن-ۇستىندە', 'мәтін-үстінде', 'text-top' ),
-       'img_middle'              => array( '1', 'ارالىعىنا', 'аралығына', 'middle' ),
-       'img_bottom'              => array( '1', 'استىنا', 'астына', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'ماتىن-استىندا', 'мәтін-астында', 'text-bottom' ),
-       'int'                     => array( '0', 'ىشكى:', 'ІШКІ:', 'INT:' ),
-       'sitename'                => array( '1', 'توراپاتاۋى', 'ТОРАПАТАУЫ', 'SITENAME' ),
-       'ns'                      => array( '0', 'ەا:', 'ەسىمايا:', 'ЕА:', 'ЕСІМАЯ:', 'NS:' ),
-       'localurl'                => array( '0', 'جەرگىلىكتىجاي:', 'ЖЕРГІЛІКТІЖАЙ:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'جەرگىلىكتىجاي2:', 'ЖЕРГІЛІКТІЖАЙ2:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'سەرۆەر', 'СЕРВЕР', 'SERVER' ),
-       'servername'              => array( '0', 'سەرۆەراتاۋى', 'СЕРВЕРАТАУЫ', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'امىرجولى', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'سەپتىگى:', 'سەپتىك:', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
-       'notitleconvert'          => array( '0', '__تاقىرىپاتىنتۇرلەندىرگىزبەۋ__', '__تاتجوق__', '__اتاۋالماستىرعىزباۋ__', '__ااباۋ__', '__ТАҚЫРЫПАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__ТАТЖОҚ__', '__АТАУАЛМАСТЫРҒЫЗБАУ__', '__ААБАУ__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__ماعلۇماتىنتۇرلەندىرگىزبەۋ__', '__ماتجوق__', '__ماعلۇماتالماستىرعىزباۋ__', '__ماباۋ__', '__МАҒЛҰМАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__МАТЖОҚ__', '__МАҒЛҰМАТАЛМАСТЫРҒЫЗБАУ__', '__МАБАУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'اعىمداعىاپتاسى', 'اعىمداعىاپتا', 'АҒЫМДАҒЫАПТАСЫ', 'АҒЫМДАҒЫАПТА', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'اعىمداعىاپتاكۇنى', 'АҒЫМДАҒЫАПТАКҮНІ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'جەرگىلىكتىاپتاسى', 'جەرگىلىكتىاپتا', 'ЖЕРГІЛІКТІАПТАСЫ', 'ЖЕРГІЛІКТІАПТА', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'جەرگىلىكتىاپتاكۇنى', 'ЖЕРГІЛІКТІАПТАКҮНІ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'تۇزەتۋنومىرٴى', 'نۇسقانومىرٴى', 'ТҮЗЕТУНӨМІРІ', 'НҰСҚАНӨМІРІ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'تۇزەتۋكۇنى', 'نۇسقاكۇنى', 'ТҮЗЕТУКҮНІ', 'НҰСҚАКҮНІ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'تۇزەتۋكۇنى2', 'نۇسقاكۇنى2', 'ТҮЗЕТУКҮНІ2', 'НҰСҚАКҮНІ2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'تۇزەتۋايى', 'نۇسقاايى', 'ТҮЗЕТУАЙЫ', 'НҰСҚААЙЫ', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'تۇزەتۋجىلى', 'نۇسقاجىلى', 'ТҮЗЕТУЖЫЛЫ', 'НҰСҚАЖЫЛЫ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'تۇزەتۋۋاقىتىتاڭباسى', 'نۇسقاۋاقىتتۇيىندەمەسى', 'ТҮЗЕТУУАҚЫТЫТАҢБАСЫ', 'НҰСҚАУАҚЫТТҮЙІНДЕМЕСІ', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'كوپشەتۇرى:', 'كوپشە:', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'تولىقجايى:', 'تولىقجاي:', 'ТОЛЫҚЖАЙЫ:', 'ТОЛЫҚЖАЙ:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'تولىقجايى2:', 'تولىقجاي2:', 'ТОЛЫҚЖАЙЫ2:', 'ТОЛЫҚЖАЙ2:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'كا1:', 'كىشىارىپپەن1:', 'КӘ1:', 'КІШІӘРІППЕН1:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'با1:', 'باسارىپپەن1:', 'БӘ1:', 'БАСӘРІППЕН1:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'كا:', 'كىشىارىپپەن:', 'КӘ:', 'КІШІӘРІППЕН:', 'LC:' ),
-       'uc'                      => array( '0', 'با:', 'باسارىپپەن:', 'БӘ:', 'БАСӘРІППЕН:', 'UC:' ),
-       'raw'                     => array( '0', 'قام:', 'ҚАМ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'كورسەتىلەتىناتاۋ', 'КӨРІНЕТІНТАҚЫРЫАПАТЫ', 'КӨРСЕТІЛЕТІНАТАУ', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'ق', 'Қ', 'R' ),
-       'newsectionlink'          => array( '1', '__جاڭابولىمسىلتەمەسى__', '__ЖАҢАБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'باعدارلامانۇسقاسى', 'БАҒДАРЛАМАНҰСҚАСЫ', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'جايدىمۇقامداۋ:', 'ЖАЙДЫМҰҚАМДАУ:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'جاكىردىمۇقامداۋ', 'ЖӘКІРДІМҰҚАМДАУ', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'اعىمداعىۋاقىتتۇيىندەمەسى', 'اعىمداعىۋاقىتتۇيىن', 'АҒЫМДАҒЫУАҚЫТТҮЙІНДЕМЕСІ', 'АҒЫМДАҒЫУАҚЫТТҮЙІН', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'جەرگىلىكتىۋاقىتتۇيىندەمەسى', 'جەرگىلىكتىۋاقىتتۇيىن', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІНДЕМЕСІ', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІН', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'باعىتبەلگىسى', 'БАҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#تىل:', '#ТІЛ:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'ماعلۇماتتىلى', 'МАҒЛҰМАТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'ەسىمايابەتسانى:', 'ەابەتسانى:', 'ايابەتسانى:', 'ЕСІМАЯБЕТСАНЫ:', 'ЕАБЕТСАНЫ:', 'АЯБЕТСАНЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'اكىمشىسانى', 'ӘКІМШІСАНЫ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'سانپىشىمى', 'САНПІШІМІ', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'سولعاىعىس', 'سولىعىس', 'СОЛҒАЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
-       'padright'                => array( '0', 'وڭعاىعىس', 'وڭىعىس', 'ОҢҒАЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
-       'special'                 => array( '0', 'ارنايى', 'арнайы', 'special' ),
-       'defaultsort'             => array( '1', 'ادەپكىسۇرىپتاۋ:', 'ادەپكىساناتسۇرىپتاۋ:', 'ادەپكىسۇرىپتاۋكىلتى:', 'ادەپكىسۇرىپ:', 'ӘДЕПКІСҰРЫПТАУ:', 'ӘДЕПКІСАНАТСҰРЫПТАУ:', 'ӘДЕПКІСҰРЫПТАУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'فايلمەكەنى:', 'ФАЙЛМЕКЕНІ:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'بەلگى', 'белгі', 'tag' ),
-       'hiddencat'               => array( '1', '__جاسىرىنسانات__', '__ЖАСЫРЫНСАНАТ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'ساناتتاعىبەتتەر', 'САНАТТАҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'بەتمولشەرى', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#ايداۋ', '#АЙДАУ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__مازمۇنسىز__', '__مسىز__', '__МАЗМҰНСЫЗ__', '__МСЫЗ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__قويماسىز__', '__قسىز__', '__ҚОЙМАСЫЗ__', '__ҚСЫЗ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__مازمۇنداتقىزۋ__', '__مقىزۋ__', '__МАЗМҰНДАТҚЫЗУ__', '__МҚЫЗУ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__مازمۇنى__', '__مزمن__', '__МАЗМҰНЫ__', '__МЗМН__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__بولىدىموندەمەۋ__', '__بولىموندەتكىزبەۋ__', '__БӨЛІДІМӨНДЕМЕУ__', '__БӨЛІМӨНДЕТКІЗБЕУ__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'اعىمداعىاي', 'АҒЫМДАҒЫАЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'اعىمداعىاياتاۋى', 'АҒЫМДАҒЫАЙАТАУЫ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'اعىمداعىايىلىكاتاۋى', 'АҒЫМДАҒЫАЙІЛІКАТАУЫ', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'اعىمداعىايجىيىر', 'اعىمداعىايقىسقا', 'АҒЫМДАҒЫАЙЖИЫР', 'АҒЫМДАҒЫАЙҚЫСҚА', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'اعىمداعىكۇن', 'АҒЫМДАҒЫКҮН', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'اعىمداعىكۇن2', 'АҒЫМДАҒЫКҮН2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'اعىمداعىكۇناتاۋى', 'АҒЫМДАҒЫКҮНАТАУЫ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'اعىمداعىجىل', 'АҒЫМДАҒЫЖЫЛ', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'اعىمداعىۋاقىت', 'АҒЫМДАҒЫУАҚЫТ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'اعىمداعىساعات', 'АҒЫМДАҒЫСАҒАТ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'جەرگىلىكتىاي', 'ЖЕРГІЛІКТІАЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'جەرگىلىكتىاياتاۋى', 'ЖЕРГІЛІКТІАЙАТАУЫ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'جەرگىلىكتىايىلىكاتاۋى', 'ЖЕРГІЛІКТІАЙІЛІКАТАУЫ', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'جەرگىلىكتىايجىيىر', 'جەرگىلىكتىايقىسقاشا', 'جەرگىلىكتىايقىسقا', 'ЖЕРГІЛІКТІАЙЖИЫР', 'ЖЕРГІЛІКТІАЙҚЫСҚАША', 'ЖЕРГІЛІКТІАЙҚЫСҚА', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'جەرگىلىكتىكۇن', 'ЖЕРГІЛІКТІКҮН', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'جەرگىلىكتىكۇن2', 'ЖЕРГІЛІКТІКҮН2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'جەرگىلىكتىكۇناتاۋى', 'ЖЕРГІЛІКТІКҮНАТАУЫ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'جەرگىلىكتىجىل', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'جەرگىلىكتىۋاقىت', 'ЖЕРГІЛІКТІУАҚЫТ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'جەرگىلىكتىساعات', 'ЖЕРГІЛІКТІСАҒАТ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'بەتسانى', 'БЕТСАНЫ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ماقالاسانى', 'МАҚАЛАСАНЫ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'فايلسانى', 'ФАЙЛСАНЫ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'قاتىسۋشىسانى', 'ҚАТЫСУШЫСАНЫ', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'وڭدەمەسانى', 'تۇزەتۋسانى', 'ӨҢДЕМЕСАНЫ', 'ТҮЗЕТУСАНЫ', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'بەتاتاۋى', 'БЕТАТАУЫ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'بەتاتاۋى2', 'БЕТАТАУЫ2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ەسىماياسى', 'ЕСІМАЯСЫ', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ەسىماياسى2', 'ЕСІМАЯСЫ2', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'تالقىلاۋاياسى', 'ТАЛҚЫЛАУАЯСЫ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'تالقىلاۋاياسى2', 'ТАЛҚЫЛАУАЯСЫ2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'تاقىرىپبەتى', 'ماقالابەتى', 'ТАҚЫРЫПБЕТІ', 'МАҚАЛАБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'تاقىرىپبەتى2', 'ماقالابەتى2', 'ТАҚЫРЫПБЕТІ2', 'МАҚАЛАБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'تولىقبەتاتاۋى', 'ТОЛЫҚБЕТАТАУЫ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'تولىقبەتاتاۋى2', 'ТОЛЫҚБЕТАТАУЫ2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'بەتشەاتاۋى', 'استىڭعىبەتاتاۋى', 'БЕТШЕАТАУЫ', 'АСТЫҢҒЫБЕТАТАУЫ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'بەتشەاتاۋى2', 'استىڭعىبەتاتاۋى2', 'БЕТШЕАТАУЫ2', 'АСТЫҢҒЫБЕТАТАУЫ2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'نەگىزگىبەتاتاۋى', 'НЕГІЗГІБЕТАТАУЫ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'نەگىزگىبەتاتاۋى2', 'НЕГІЗГІБЕТАТАУЫ2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'تالقىلاۋبەتاتاۋى', 'ТАЛҚЫЛАУБЕТАТАУЫ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'تالقىلاۋبەتاتاۋى2', 'ТАЛҚЫЛАУБЕТАТАУЫ2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'تاقىرىپبەتاتاۋى', 'ماقالابەتاتاۋى', 'ТАҚЫРЫПБЕТАТАУЫ', 'МАҚАЛАБЕТАТАУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'تاقىرىپبەتاتاۋى2', 'ماقالابەتاتاۋى2', 'ТАҚЫРЫПБЕТАТАУЫ2', 'МАҚАЛАБЕТАТАУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'حبر:', 'ХБР:', 'MSG:' ),
+       'subst'                     => array( '0', 'بادەل:', 'БӘДЕЛ:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'ۋىيكىيسىزحبر:', 'УИКИСІЗХБР:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'نوباي', 'нобай', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'نوباي=$1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'وڭعا', 'وڭ', 'оңға', 'оң', 'right' ),
+       'img_left'                  => array( '1', 'سولعا', 'سول', 'солға', 'сол', 'left' ),
+       'img_none'                  => array( '1', 'ەشقانداي', 'جوق', 'ешқандай', 'жоқ', 'none' ),
+       'img_width'                 => array( '1', '$1 نۇكتە', '$1 нүкте', '$1px' ),
+       'img_center'                => array( '1', 'ورتاعا', 'ورتا', 'ортаға', 'орта', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'سۇرمەلى', 'сүрмелі', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'سۇرمەسىز', 'сүрмесіз', 'frameless' ),
+       'img_page'                  => array( '1', 'بەت=$1', 'بەت $1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'تىكتى', 'تىكتىك=$1', 'تىكتىك $1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'جىييەكتى', 'жиекті', 'border' ),
+       'img_baseline'              => array( '1', 'تىرەكجول', 'тірекжол', 'baseline' ),
+       'img_sub'                   => array( '1', 'استىلىعى', 'است', 'астылығы', 'аст', 'sub' ),
+       'img_super'                 => array( '1', 'ۇستىلىگى', 'ۇست', 'үстілігі', 'үст', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'ۇستىنە', 'үстіне', 'top' ),
+       'img_text_top'              => array( '1', 'ماتىن-ۇستىندە', 'мәтін-үстінде', 'text-top' ),
+       'img_middle'                => array( '1', 'ارالىعىنا', 'аралығына', 'middle' ),
+       'img_bottom'                => array( '1', 'استىنا', 'астына', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'ماتىن-استىندا', 'мәтін-астында', 'text-bottom' ),
+       'int'                       => array( '0', 'ىشكى:', 'ІШКІ:', 'INT:' ),
+       'sitename'                  => array( '1', 'توراپاتاۋى', 'ТОРАПАТАУЫ', 'SITENAME' ),
+       'ns'                        => array( '0', 'ەا:', 'ەسىمايا:', 'ЕА:', 'ЕСІМАЯ:', 'NS:' ),
+       'localurl'                  => array( '0', 'جەرگىلىكتىجاي:', 'ЖЕРГІЛІКТІЖАЙ:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'جەرگىلىكتىجاي2:', 'ЖЕРГІЛІКТІЖАЙ2:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'سەرۆەر', 'СЕРВЕР', 'SERVER' ),
+       'servername'                => array( '0', 'سەرۆەراتاۋى', 'СЕРВЕРАТАУЫ', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'امىرجولى', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'سەپتىگى:', 'سەپتىك:', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
+       'notitleconvert'            => array( '0', '__تاقىرىپاتىنتۇرلەندىرگىزبەۋ__', '__تاتجوق__', '__اتاۋالماستىرعىزباۋ__', '__ااباۋ__', '__ТАҚЫРЫПАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__ТАТЖОҚ__', '__АТАУАЛМАСТЫРҒЫЗБАУ__', '__ААБАУ__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__ماعلۇماتىنتۇرلەندىرگىزبەۋ__', '__ماتجوق__', '__ماعلۇماتالماستىرعىزباۋ__', '__ماباۋ__', '__МАҒЛҰМАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__МАТЖОҚ__', '__МАҒЛҰМАТАЛМАСТЫРҒЫЗБАУ__', '__МАБАУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'اعىمداعىاپتاسى', 'اعىمداعىاپتا', 'АҒЫМДАҒЫАПТАСЫ', 'АҒЫМДАҒЫАПТА', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'اعىمداعىاپتاكۇنى', 'АҒЫМДАҒЫАПТАКҮНІ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'جەرگىلىكتىاپتاسى', 'جەرگىلىكتىاپتا', 'ЖЕРГІЛІКТІАПТАСЫ', 'ЖЕРГІЛІКТІАПТА', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'جەرگىلىكتىاپتاكۇنى', 'ЖЕРГІЛІКТІАПТАКҮНІ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'تۇزەتۋنومىرٴى', 'نۇسقانومىرٴى', 'ТҮЗЕТУНӨМІРІ', 'НҰСҚАНӨМІРІ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'تۇزەتۋكۇنى', 'نۇسقاكۇنى', 'ТҮЗЕТУКҮНІ', 'НҰСҚАКҮНІ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'تۇزەتۋكۇنى2', 'نۇسقاكۇنى2', 'ТҮЗЕТУКҮНІ2', 'НҰСҚАКҮНІ2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'تۇزەتۋايى', 'نۇسقاايى', 'ТҮЗЕТУАЙЫ', 'НҰСҚААЙЫ', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'تۇزەتۋجىلى', 'نۇسقاجىلى', 'ТҮЗЕТУЖЫЛЫ', 'НҰСҚАЖЫЛЫ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'تۇزەتۋۋاقىتىتاڭباسى', 'نۇسقاۋاقىتتۇيىندەمەسى', 'ТҮЗЕТУУАҚЫТЫТАҢБАСЫ', 'НҰСҚАУАҚЫТТҮЙІНДЕМЕСІ', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'كوپشەتۇرى:', 'كوپشە:', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'تولىقجايى:', 'تولىقجاي:', 'ТОЛЫҚЖАЙЫ:', 'ТОЛЫҚЖАЙ:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'تولىقجايى2:', 'تولىقجاي2:', 'ТОЛЫҚЖАЙЫ2:', 'ТОЛЫҚЖАЙ2:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'كا1:', 'كىشىارىپپەن1:', 'КӘ1:', 'КІШІӘРІППЕН1:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'با1:', 'باسارىپپەن1:', 'БӘ1:', 'БАСӘРІППЕН1:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'كا:', 'كىشىارىپپەن:', 'КӘ:', 'КІШІӘРІППЕН:', 'LC:' ),
+       'uc'                        => array( '0', 'با:', 'باسارىپپەن:', 'БӘ:', 'БАСӘРІППЕН:', 'UC:' ),
+       'raw'                       => array( '0', 'قام:', 'ҚАМ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'كورسەتىلەتىناتاۋ', 'КӨРІНЕТІНТАҚЫРЫАПАТЫ', 'КӨРСЕТІЛЕТІНАТАУ', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'ق', 'Қ', 'R' ),
+       'newsectionlink'            => array( '1', '__جاڭابولىمسىلتەمەسى__', '__ЖАҢАБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'باعدارلامانۇسقاسى', 'БАҒДАРЛАМАНҰСҚАСЫ', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'جايدىمۇقامداۋ:', 'ЖАЙДЫМҰҚАМДАУ:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'جاكىردىمۇقامداۋ', 'ЖӘКІРДІМҰҚАМДАУ', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'اعىمداعىۋاقىتتۇيىندەمەسى', 'اعىمداعىۋاقىتتۇيىن', 'АҒЫМДАҒЫУАҚЫТТҮЙІНДЕМЕСІ', 'АҒЫМДАҒЫУАҚЫТТҮЙІН', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'جەرگىلىكتىۋاقىتتۇيىندەمەسى', 'جەرگىلىكتىۋاقىتتۇيىن', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІНДЕМЕСІ', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІН', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'باعىتبەلگىسى', 'БАҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#تىل:', '#ТІЛ:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'ماعلۇماتتىلى', 'МАҒЛҰМАТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'ەسىمايابەتسانى:', 'ەابەتسانى:', 'ايابەتسانى:', 'ЕСІМАЯБЕТСАНЫ:', 'ЕАБЕТСАНЫ:', 'АЯБЕТСАНЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'اكىمشىسانى', 'ӘКІМШІСАНЫ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'سانپىشىمى', 'САНПІШІМІ', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'سولعاىعىس', 'سولىعىس', 'СОЛҒАЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
+       'padright'                  => array( '0', 'وڭعاىعىس', 'وڭىعىس', 'ОҢҒАЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
+       'special'                   => array( '0', 'ارنايى', 'арнайы', 'special' ),
+       'defaultsort'               => array( '1', 'ادەپكىسۇرىپتاۋ:', 'ادەپكىساناتسۇرىپتاۋ:', 'ادەپكىسۇرىپتاۋكىلتى:', 'ادەپكىسۇرىپ:', 'ӘДЕПКІСҰРЫПТАУ:', 'ӘДЕПКІСАНАТСҰРЫПТАУ:', 'ӘДЕПКІСҰРЫПТАУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'فايلمەكەنى:', 'ФАЙЛМЕКЕНІ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'بەلگى', 'белгі', 'tag' ),
+       'hiddencat'                 => array( '1', '__جاسىرىنسانات__', '__ЖАСЫРЫНСАНАТ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'ساناتتاعىبەتتەر', 'САНАТТАҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'بەتمولشەرى', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
 );
 
 $specialPageAliases = array(
@@ -432,7 +428,6 @@ $messages = array(
 'tog-watchlisthideown' => 'وڭدەمەلەرىمدى باقىلاۋ تىزىمنەن جاسىر',
 'tog-watchlisthidebots' => 'بوت وڭدەمەلەرىن باقىلاۋ تىزىمنەن جاسىر',
 'tog-watchlisthideminor' => 'شاعىن وڭدەمەلەردى باقىلاۋ تىزىمىندە كورسەتپە',
-'tog-nolangconversion' => 'ٴتىل ٴتۇرى اۋدارىسىن ٴوشىر',
 'tog-ccmeonemails' => 'باسقا قاتىسۋشىعا جىبەرگەن حاتىمنىڭ كوشىرمەسىن ماعان دا جونەلت',
 'tog-diffonly' => 'ايىرما استىندا بەت ماعلۇماتىن كورسەتپە',
 'tog-showhiddencats' => 'جاسىرىن ساناتتاردى كورسەت',
@@ -1372,9 +1367,9 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 الدىندا قوتارىلىپ بەرىلگەن فايلداردى قاراۋ نە ىزدەۋ ٴۇشىن [[Special:FileList|قوتارىپ بەرىلگەن فايلدار تىزىمىنە]] بارىڭىز, تاعى دا قوتارىپ بەرۋى مەن جويۋى [[Special:Log/delete|قوتارىپ بەرۋ جۋرنالىنا]] جازىلىپ الىنادى.
 
 سۋرەتتى بەتكە كىرىستىرۋگە, فايلعا تۋرا سىلتەۋ ٴۇشىن مىنا پىشىندەگى سىلتەمەنى قولدانىڭىز:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|بالاما ٴماتىن]]</nowiki></tt>''' نە
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|بالاما ٴماتىن]]</nowiki></code>''' نە
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''.",
 'upload-permitted' => 'رۇقسات ەتىلگەن فايل تۇرلەرى: $1.',
 'upload-preferred' => 'ۇنامدى فايل تۇرلەرى $1.',
 'upload-prohibited' => 'رۇقسات ەتىلمەگەن فايل تۇرلەرى: $1.',
@@ -1402,19 +1397,19 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 'largefileserver' => 'وسى فايلدىڭ مولشەرى سەرۆەردىڭ قالاۋىنان اسىپ كەتكەن.',
 'emptyfile' => 'قوتارىپ بەرىلگەن فايلىڭىز بوس سىيياقتى. فايل اتاۋى قاتە جازىلعان مۇمكىن.
 بۇل فايلدى قوتارىپ بەرۋى ناقتى تالابىڭىز ەكەنىن تەكسەرىپ شىعىڭىز.',
-'fileexists' => "بىلاي اتالعان فايل الداقاشان بار, ەگەر بۇنى وزگەرتۋگە باتىلىڭىز جوق بولسا '''<tt>[[:$1]]</tt>''' دەگەندى تەكسەرىپ شىعىڭىز.
-[[$1|thumb]]",
-'filepageexists' => "بۇل فايلدىڭ سىيپاتتاما بەتى الداقاشان '''<tt>[[:$1]]</tt>''' دەگەندە جاسالعان, بىراق اعىمدا بىلاي اتالعان ەش فايل جوق.
+'fileexists' => 'بىلاي اتالعان فايل الداقاشان بار, ەگەر بۇنى وزگەرتۋگە باتىلىڭىز جوق بولسا <strong>[[:$1]]</strong> دەگەندى تەكسەرىپ شىعىڭىز.
+[[$1|thumb]]',
+'filepageexists' => 'بۇل فايلدىڭ سىيپاتتاما بەتى الداقاشان <strong>[[:$1]]</strong> دەگەندە جاسالعان, بىراق اعىمدا بىلاي اتالعان ەش فايل جوق.
 ەنگىزگەن قىسقاشا مازمۇنداماڭىز سىيپاتتاماسى بەتىندە كورسەتىلمەيدى.
-قىسقاشا مازمۇنداماڭىز وسى ارادا كورسەتىلۋ ٴۇشىن, بۇنى قولمەن وڭدەمەك بولىڭىز",
-'fileexists-extension' => "ۇقساس اتاۋى بار فايل تابىلدى: [[$2|thumb]]
-* قوتارىپ بەرىلەتىن فايل اتاۋى: '''<tt>[[:$1]]</tt>'''
-* بار بولعان فايل اتاۋى: '''<tt>[[:$2]]</tt>'''
-وزگە اتاۋدى تاڭداڭىز.",
+قىسقاشا مازمۇنداماڭىز وسى ارادا كورسەتىلۋ ٴۇشىن, بۇنى قولمەن وڭدەمەك بولىڭىز',
+'fileexists-extension' => 'ۇقساس اتاۋى بار فايل تابىلدى: [[$2|thumb]]
+* قوتارىپ بەرىلەتىن فايل اتاۋى: <strong>[[:$1]]</strong>
+* بار بولعان فايل اتاۋى: <strong>[[:$2]]</strong>
+وزگە اتاۋدى تاڭداڭىز.',
 'fileexists-thumbnail-yes' => "وسى فايل — مولشەرى كىشىرىتىلگەن سۋرەت ''(نوباي)'' سىيياقتى. [[$1|thumb]]
-بۇل '''<tt>[[:$1]]</tt>''' دەگەن فايلدى سىناپ شىعىڭىز.
+بۇل <strong>[[:$1]]</strong> دەگەن فايلدى سىناپ شىعىڭىز.
 ەگەر سىنالعان فايل تۇپنۇسقالى مولشەرى بار دالمە-ٴدال سۋرەت بولسا, قوسىسمشا نوبايدى قوتارىپ بەرۋ كەرەگى جوق.",
-'file-thumbnail-no' => "فايل اتاۋى '''<tt>$1</tt>''' دەگەنمەن باستالادى.
+'file-thumbnail-no' => "فايل اتاۋى <strong>$1</strong> دەگەنمەن باستالادى.
 بۇل — مولشەرى كىشىرىتىلگەن سۋرەت ''(نوباي)'' سىيياقتى.
 ەگەر بۇل سۋرەتتىڭ تولىق اجىراتىلىمدىعى بولسا, بۇنى قوتارىپ بەرىڭىز, ايتپەسە فايل اتاۋىن وزگەرتىڭىز.",
 'fileexists-forbidden' => 'وسىلاي اتالعان فايل الداقاشان بار;
@@ -1531,7 +1526,7 @@ URL دۇرىس ەكەندىگىن جانە توراپ ىستەپ تۇرعانى
 # MIME search
 'mimesearch' => 'فايلدى MIME تۇرىمەن ىزدەۋ',
 'mimesearch-summary' => 'بۇل بەتتە فايلداردى MIME تۇرىمەن سۇزگىلەۋى قوسىلعان.
-كىرىسى: ماعلۇمات_تۇرى/تۇر_تاراۋى, مىسالى <tt>image/jpeg</tt>.',
+كىرىسى: ماعلۇمات_تۇرى/تۇر_تاراۋى, مىسالى <code>image/jpeg</code>.',
 'mimetype' => 'MIME ٴتۇرى:',
 'download' => 'قوتارىپ الۋ',
 
index fba4e9f..eeafab8 100644 (file)
@@ -9,5 +9,7 @@
  *
  */
 
+$rtl = true;
+
 # Inherit everything for now
 $fallback = 'kk-arab, kk-cyrl';
index 93ff9dd..28dec21 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Kazakh (Cyrillic script) (â\80ªÒ\9aазақша (кирил)‬)
+/** Kazakh (Cyrillic script) (â\80ªÒ\9bазақша (кирил)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -30,10 +30,6 @@ $separatorTransformTable = array(
        '.' => ',',
 );
 
-$extraUserToggles = array(
-       'nolangconversion'
-);
-
 $fallback8bitEncoding = 'windows-1251';
 
 $linkTrail = '/^([a-zäçéğıïñöşüýʺʹа-яёәғіқңөұүһٴابپتجحدرزسشعفقكلمنڭەوۇۋۆىيچھ“»]+)(.*)$/sDu';
@@ -151,130 +147,130 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#АЙДАУ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__МАЗМҰНСЫЗ__', '__МСЫЗ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__ҚОЙМАСЫЗ__', '__ҚСЫЗ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__МАЗМҰНДАТҚЫЗУ__', '__МҚЫЗУ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__МАЗМҰНЫ__', '__МЗМН__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__БӨЛІДІМӨНДЕМЕУ__', '__БӨЛІМӨНДЕТКІЗБЕУ__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'АҒЫМДАҒЫАЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'АҒЫМДАҒЫАЙАТАУЫ', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'АҒЫМДАҒЫАЙІЛІКАТАУЫ', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'АҒЫМДАҒЫАЙЖИЫР', 'АҒЫМДАҒЫАЙҚЫСҚА', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'АҒЫМДАҒЫКҮН', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'АҒЫМДАҒЫКҮН2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'АҒЫМДАҒЫКҮНАТАУЫ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'АҒЫМДАҒЫЖЫЛ', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'АҒЫМДАҒЫУАҚЫТ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'АҒЫМДАҒЫСАҒАТ', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ЖЕРГІЛІКТІАЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'ЖЕРГІЛІКТІАЙАТАУЫ', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'ЖЕРГІЛІКТІАЙІЛІКАТАУЫ', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ЖЕРГІЛІКТІАЙЖИЫР', 'ЖЕРГІЛІКТІАЙҚЫСҚАША', 'ЖЕРГІЛІКТІАЙҚЫСҚА', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ЖЕРГІЛІКТІКҮН', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ЖЕРГІЛІКТІКҮН2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'ЖЕРГІЛІКТІКҮНАТАУЫ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ЖЕРГІЛІКТІУАҚЫТ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ЖЕРГІЛІКТІСАҒАТ', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'БЕТСАНЫ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'МАҚАЛАСАНЫ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ФАЙЛСАНЫ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ҚАТЫСУШЫСАНЫ', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'ӨҢДЕМЕСАНЫ', 'ТҮЗЕТУСАНЫ', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'БЕТАТАУЫ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'БЕТАТАУЫ2', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ЕСІМАЯСЫ', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ЕСІМАЯСЫ2', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ТАЛҚЫЛАУАЯСЫ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ТАЛҚЫЛАУАЯСЫ2', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ТАҚЫРЫПБЕТІ', 'МАҚАЛАБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ТАҚЫРЫПБЕТІ2', 'МАҚАЛАБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'ТОЛЫҚБЕТАТАУЫ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ТОЛЫҚБЕТАТАУЫ2', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'БЕТШЕАТАУЫ', 'АСТЫҢҒЫБЕТАТАУЫ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'БЕТШЕАТАУЫ2', 'АСТЫҢҒЫБЕТАТАУЫ2', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'НЕГІЗГІБЕТАТАУЫ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'НЕГІЗГІБЕТАТАУЫ2', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ТАЛҚЫЛАУБЕТАТАУЫ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'ТАЛҚЫЛАУБЕТАТАУЫ2', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'ТАҚЫРЫПБЕТАТАУЫ', 'МАҚАЛАБЕТАТАУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'ТАҚЫРЫПБЕТАТАУЫ2', 'МАҚАЛАБЕТАТАУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'ХБР:', 'MSG:' ),
-       'subst'                   => array( '0', 'БӘДЕЛ:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'УИКИСІЗХБР:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'нобай', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'оңға', 'оң', 'right' ),
-       'img_left'                => array( '1', 'солға', 'сол', 'left' ),
-       'img_none'                => array( '1', 'ешқандай', 'жоқ', 'none' ),
-       'img_width'               => array( '1', '$1 нүкте', '$1px' ),
-       'img_center'              => array( '1', 'ортаға', 'орта', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'сүрмелі', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'сүрмесіз', 'frameless' ),
-       'img_page'                => array( '1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'жиекті', 'border' ),
-       'img_baseline'            => array( '1', 'тірекжол', 'baseline' ),
-       'img_sub'                 => array( '1', 'астылығы', 'аст', 'sub' ),
-       'img_super'               => array( '1', 'үстілігі', 'үст', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'үстіне', 'top' ),
-       'img_text_top'            => array( '1', 'мәтін-үстінде', 'text-top' ),
-       'img_middle'              => array( '1', 'аралығына', 'middle' ),
-       'img_bottom'              => array( '1', 'астына', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'мәтін-астында', 'text-bottom' ),
-       'int'                     => array( '0', 'ІШКІ:', 'INT:' ),
-       'sitename'                => array( '1', 'ТОРАПАТАУЫ', 'SITENAME' ),
-       'ns'                      => array( '0', 'ЕА:', 'ЕСІМАЯ:', 'NS:' ),
-       'localurl'                => array( '0', 'ЖЕРГІЛІКТІЖАЙ:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ЖЕРГІЛІКТІЖАЙ2:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'СЕРВЕР', 'SERVER' ),
-       'servername'              => array( '0', 'СЕРВЕРАТАУЫ', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
-       'notitleconvert'          => array( '0', '__ТАҚЫРЫПАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__ТАТЖОҚ__', '__АТАУАЛМАСТЫРҒЫЗБАУ__', '__ААБАУ__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__МАҒЛҰМАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__МАТЖОҚ__', '__МАҒЛҰМАТАЛМАСТЫРҒЫЗБАУ__', '__МАБАУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'АҒЫМДАҒЫАПТАСЫ', 'АҒЫМДАҒЫАПТА', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'АҒЫМДАҒЫАПТАКҮНІ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'ЖЕРГІЛІКТІАПТАСЫ', 'ЖЕРГІЛІКТІАПТА', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ЖЕРГІЛІКТІАПТАКҮНІ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'ТҮЗЕТУНӨМІРІ', 'НҰСҚАНӨМІРІ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ТҮЗЕТУКҮНІ', 'НҰСҚАКҮНІ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ТҮЗЕТУКҮНІ2', 'НҰСҚАКҮНІ2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'ТҮЗЕТУАЙЫ', 'НҰСҚААЙЫ', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ТҮЗЕТУЖЫЛЫ', 'НҰСҚАЖЫЛЫ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'ТҮЗЕТУУАҚЫТЫТАҢБАСЫ', 'НҰСҚАУАҚЫТТҮЙІНДЕМЕСІ', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'ТОЛЫҚЖАЙЫ:', 'ТОЛЫҚЖАЙ:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'ТОЛЫҚЖАЙЫ2:', 'ТОЛЫҚЖАЙ2:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'КӘ1:', 'КІШІӘРІППЕН1:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'БӘ1:', 'БАСӘРІППЕН1:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'КӘ:', 'КІШІӘРІППЕН:', 'LC:' ),
-       'uc'                      => array( '0', 'БӘ:', 'БАСӘРІППЕН:', 'UC:' ),
-       'raw'                     => array( '0', 'ҚАМ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'КӨРІНЕТІНТАҚЫРЫАПАТЫ', 'КӨРСЕТІЛЕТІНАТАУ', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'Қ', 'R' ),
-       'newsectionlink'          => array( '1', '__ЖАҢАБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'БАҒДАРЛАМАНҰСҚАСЫ', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ЖАЙДЫМҰҚАМДАУ:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ЖӘКІРДІМҰҚАМДАУ', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'АҒЫМДАҒЫУАҚЫТТҮЙІНДЕМЕСІ', 'АҒЫМДАҒЫУАҚЫТТҮЙІН', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІНДЕМЕСІ', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІН', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'БАҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#ТІЛ:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'МАҒЛҰМАТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'ЕСІМАЯБЕТСАНЫ:', 'ЕАБЕТСАНЫ:', 'АЯБЕТСАНЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ӘКІМШІСАНЫ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'САНПІШІМІ', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'СОЛҒАЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
-       'padright'                => array( '0', 'ОҢҒАЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
-       'special'                 => array( '0', 'арнайы', 'special' ),
-       'defaultsort'             => array( '1', 'ӘДЕПКІСҰРЫПТАУ:', 'ӘДЕПКІСАНАТСҰРЫПТАУ:', 'ӘДЕПКІСҰРЫПТАУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ФАЙЛМЕКЕНІ:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'белгі', 'tag' ),
-       'hiddencat'               => array( '1', '__ЖАСЫРЫНСАНАТ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'САНАТТАҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#АЙДАУ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__МАЗМҰНСЫЗ__', '__МСЫЗ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__ҚОЙМАСЫЗ__', '__ҚСЫЗ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__МАЗМҰНДАТҚЫЗУ__', '__МҚЫЗУ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__МАЗМҰНЫ__', '__МЗМН__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__БӨЛІДІМӨНДЕМЕУ__', '__БӨЛІМӨНДЕТКІЗБЕУ__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'АҒЫМДАҒЫАЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'АҒЫМДАҒЫАЙАТАУЫ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'АҒЫМДАҒЫАЙІЛІКАТАУЫ', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'АҒЫМДАҒЫАЙЖИЫР', 'АҒЫМДАҒЫАЙҚЫСҚА', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'АҒЫМДАҒЫКҮН', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'АҒЫМДАҒЫКҮН2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'АҒЫМДАҒЫКҮНАТАУЫ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'АҒЫМДАҒЫЖЫЛ', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'АҒЫМДАҒЫУАҚЫТ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'АҒЫМДАҒЫСАҒАТ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ЖЕРГІЛІКТІАЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'ЖЕРГІЛІКТІАЙАТАУЫ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'ЖЕРГІЛІКТІАЙІЛІКАТАУЫ', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ЖЕРГІЛІКТІАЙЖИЫР', 'ЖЕРГІЛІКТІАЙҚЫСҚАША', 'ЖЕРГІЛІКТІАЙҚЫСҚА', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ЖЕРГІЛІКТІКҮН', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ЖЕРГІЛІКТІКҮН2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'ЖЕРГІЛІКТІКҮНАТАУЫ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ЖЕРГІЛІКТІУАҚЫТ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ЖЕРГІЛІКТІСАҒАТ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'БЕТСАНЫ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'МАҚАЛАСАНЫ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ФАЙЛСАНЫ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ҚАТЫСУШЫСАНЫ', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'ӨҢДЕМЕСАНЫ', 'ТҮЗЕТУСАНЫ', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'БЕТАТАУЫ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'БЕТАТАУЫ2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ЕСІМАЯСЫ', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ЕСІМАЯСЫ2', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ТАЛҚЫЛАУАЯСЫ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ТАЛҚЫЛАУАЯСЫ2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ТАҚЫРЫПБЕТІ', 'МАҚАЛАБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ТАҚЫРЫПБЕТІ2', 'МАҚАЛАБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ТОЛЫҚБЕТАТАУЫ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ТОЛЫҚБЕТАТАУЫ2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'БЕТШЕАТАУЫ', 'АСТЫҢҒЫБЕТАТАУЫ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'БЕТШЕАТАУЫ2', 'АСТЫҢҒЫБЕТАТАУЫ2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'НЕГІЗГІБЕТАТАУЫ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'НЕГІЗГІБЕТАТАУЫ2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ТАЛҚЫЛАУБЕТАТАУЫ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ТАЛҚЫЛАУБЕТАТАУЫ2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'ТАҚЫРЫПБЕТАТАУЫ', 'МАҚАЛАБЕТАТАУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'ТАҚЫРЫПБЕТАТАУЫ2', 'МАҚАЛАБЕТАТАУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'ХБР:', 'MSG:' ),
+       'subst'                     => array( '0', 'БӘДЕЛ:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'УИКИСІЗХБР:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'нобай', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'оңға', 'оң', 'right' ),
+       'img_left'                  => array( '1', 'солға', 'сол', 'left' ),
+       'img_none'                  => array( '1', 'ешқандай', 'жоқ', 'none' ),
+       'img_width'                 => array( '1', '$1 нүкте', '$1px' ),
+       'img_center'                => array( '1', 'ортаға', 'орта', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'сүрмелі', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'сүрмесіз', 'frameless' ),
+       'img_page'                  => array( '1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'жиекті', 'border' ),
+       'img_baseline'              => array( '1', 'тірекжол', 'baseline' ),
+       'img_sub'                   => array( '1', 'астылығы', 'аст', 'sub' ),
+       'img_super'                 => array( '1', 'үстілігі', 'үст', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'үстіне', 'top' ),
+       'img_text_top'              => array( '1', 'мәтін-үстінде', 'text-top' ),
+       'img_middle'                => array( '1', 'аралығына', 'middle' ),
+       'img_bottom'                => array( '1', 'астына', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'мәтін-астында', 'text-bottom' ),
+       'int'                       => array( '0', 'ІШКІ:', 'INT:' ),
+       'sitename'                  => array( '1', 'ТОРАПАТАУЫ', 'SITENAME' ),
+       'ns'                        => array( '0', 'ЕА:', 'ЕСІМАЯ:', 'NS:' ),
+       'localurl'                  => array( '0', 'ЖЕРГІЛІКТІЖАЙ:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ЖЕРГІЛІКТІЖАЙ2:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'СЕРВЕР', 'SERVER' ),
+       'servername'                => array( '0', 'СЕРВЕРАТАУЫ', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
+       'notitleconvert'            => array( '0', '__ТАҚЫРЫПАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__ТАТЖОҚ__', '__АТАУАЛМАСТЫРҒЫЗБАУ__', '__ААБАУ__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__МАҒЛҰМАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__МАТЖОҚ__', '__МАҒЛҰМАТАЛМАСТЫРҒЫЗБАУ__', '__МАБАУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'АҒЫМДАҒЫАПТАСЫ', 'АҒЫМДАҒЫАПТА', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'АҒЫМДАҒЫАПТАКҮНІ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'ЖЕРГІЛІКТІАПТАСЫ', 'ЖЕРГІЛІКТІАПТА', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ЖЕРГІЛІКТІАПТАКҮНІ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'ТҮЗЕТУНӨМІРІ', 'НҰСҚАНӨМІРІ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ТҮЗЕТУКҮНІ', 'НҰСҚАКҮНІ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ТҮЗЕТУКҮНІ2', 'НҰСҚАКҮНІ2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'ТҮЗЕТУАЙЫ', 'НҰСҚААЙЫ', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ТҮЗЕТУЖЫЛЫ', 'НҰСҚАЖЫЛЫ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'ТҮЗЕТУУАҚЫТЫТАҢБАСЫ', 'НҰСҚАУАҚЫТТҮЙІНДЕМЕСІ', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'ТОЛЫҚЖАЙЫ:', 'ТОЛЫҚЖАЙ:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ТОЛЫҚЖАЙЫ2:', 'ТОЛЫҚЖАЙ2:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'КӘ1:', 'КІШІӘРІППЕН1:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'БӘ1:', 'БАСӘРІППЕН1:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'КӘ:', 'КІШІӘРІППЕН:', 'LC:' ),
+       'uc'                        => array( '0', 'БӘ:', 'БАСӘРІППЕН:', 'UC:' ),
+       'raw'                       => array( '0', 'ҚАМ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'КӨРІНЕТІНТАҚЫРЫАПАТЫ', 'КӨРСЕТІЛЕТІНАТАУ', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'Қ', 'R' ),
+       'newsectionlink'            => array( '1', '__ЖАҢАБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'БАҒДАРЛАМАНҰСҚАСЫ', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ЖАЙДЫМҰҚАМДАУ:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ЖӘКІРДІМҰҚАМДАУ', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'АҒЫМДАҒЫУАҚЫТТҮЙІНДЕМЕСІ', 'АҒЫМДАҒЫУАҚЫТТҮЙІН', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІНДЕМЕСІ', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІН', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'БАҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#ТІЛ:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'МАҒЛҰМАТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'ЕСІМАЯБЕТСАНЫ:', 'ЕАБЕТСАНЫ:', 'АЯБЕТСАНЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ӘКІМШІСАНЫ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'САНПІШІМІ', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'СОЛҒАЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ОҢҒАЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
+       'special'                   => array( '0', 'арнайы', 'special' ),
+       'defaultsort'               => array( '1', 'ӘДЕПКІСҰРЫПТАУ:', 'ӘДЕПКІСАНАТСҰРЫПТАУ:', 'ӘДЕПКІСҰРЫПТАУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ФАЙЛМЕКЕНІ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'белгі', 'tag' ),
+       'hiddencat'                 => array( '1', '__ЖАСЫРЫНСАНАТ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'САНАТТАҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
 );
 
 $specialPageAliases = array(
@@ -403,7 +399,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Бақылау тізіміндегі қатысушылардың өңдеулерін көрсетпеу',
 'tog-watchlisthideanons' => 'Бақылау тізіміндегі жасырын қатысушылардың өңдеулерін көрсетпеу',
 'tog-watchlisthidepatrolled' => 'Бақылау тізімінде тексерілген өңдеулерді көрсетпеу',
-'tog-nolangconversion' => 'Тіл нұсқаларын ауыстырма',
 'tog-ccmeonemails' => 'Басқа қатысушыға жіберген хатымның көшірмесін маған да жөнелт',
 'tog-diffonly' => 'Айырма астында бет мағлұматын көрсетпе',
 'tog-showhiddencats' => 'Жасырын санаттарды көрсету',
@@ -1021,7 +1016,7 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
 Бет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.
 Бұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.'''",
 'editing' => 'Өңделуде: $1',
-'creating' => 'Ð\91астау: $1',
+'creating' => 'Ð\96аңадан Ð±астау: $1',
 'editingsection' => 'Өңделуде: $1 (бөлімі)',
 'editingcomment' => 'Өңделуде: $1 (жаңа бөлім)',
 'editconflict' => 'Өңдемелер қақтығысы: $1',
@@ -1034,7 +1029,8 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
 'storedversion' => 'Сақталған нұсқасы',
 'nonunicodebrowser' => "'''ҚҰЛАҚТАНДЫРУ: Шолғышыңыз Unicode белгілеуіне үйлесімді емес, сондықтан латын емес әріптері бар беттерді өңдеу зіл болу мүмкін.
 Жұмыс істеуге ықтималдық беру үшін, төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі'''.",
-'editingold' => '<div id="editingold" style="background: #FFBDBD; border: 1px solid #BB7979; color: #000000; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;"><center><strong>ҚҰЛАҚТАНДЫРУ: Осы беттің ертерек түзетуін өңдеп жатырсыз. Бұны сақтасаңыз, осы түзетуден кейінгі барлық өзгерістер [[Help:Қайтару|жойылады]].</strong></center></div>',
+'editingold' => "'''ҚҰЛАҚТАНДЫРУ: Осы беттің ертерек түзетуін өңдеп жатырсыз.'''
+Бұны сақтасаңыз, осы түзетуден кейінгі барлық өзгерістер жойылады.",
 'yourdiff' => 'Айырмалар',
 'copyrightwarning' => "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестер $2 (көбірек ақпарат үшін: $1) құжатына сай деп саналады.
 Егер жазуыңыздың еркін өңделуін және ақысыз көпшілікке таратуын қаламасаңыз, мында жарияламауыңыз жөн.<br />
@@ -1460,9 +1456,9 @@ $3 келтірілген себебі: ''$2''",
 'right-suppressredirect' => 'Тиісті атауға бетті жылжытқанда айдағышты жасамау',
 'right-upload' => 'Файлдарды жүктеу',
 'right-reupload' => 'Бар файл үстіне жазу',
-'right-reupload-own' => 'Өзі қотарып берген файл үстіне жазу',
+'right-reupload-own' => 'Өзі жүктеген файл үстіне жазу',
 'right-reupload-shared' => 'Таспа ортақ қоймасындағы файлдарды жергіліктілермен асыру',
-'right-upload_by_url' => 'Файлды URL мекенжайынан қотарып беру',
+'right-upload_by_url' => 'Файлды URL мекенжайдан жүктеу',
 'right-purge' => 'Бетті торап бүркемесінен құптаусыз тазарту',
 'right-autoconfirmed' => 'Жартылай қорғалған беттерді өңдеу',
 'right-bot' => 'Өздіктік үдеріс деп есептелу',
@@ -1492,7 +1488,7 @@ $3 келтірілген себебі: ''$2''",
 'right-markbotedits' => 'Шегіндірлген өңдемелерді боттардікі деп белгілеу',
 'right-noratelimit' => 'Еселік шектелімдері ықпал етпейді',
 'right-import' => 'Басқа уикилерден беттерді сырттан алу',
-'right-importupload' => 'Файл қотарып беруімен беттерді сырттан алу',
+'right-importupload' => 'Файлдарды жүктеу арқылы беттерді сырттан алу',
 'right-patrol' => 'Басқарардың өңдемелерін зерттелді деп белгілеу',
 'right-autopatrol' => 'Өз өңдемелерін зерттелді деп өздіктік белгілеу',
 'right-patrolmarks' => 'Жуықтағы өзгерістердегі зерттеу белгілерін көру',
@@ -1571,10 +1567,10 @@ $3 келтірілген себебі: ''$2''",
 'reuploaddesc' => 'Жүктеу пішініне қайта келу.',
 'upload-tryagain' => 'Файл сипаттамасының өзгерістерін жөнелту',
 'uploadnologin' => 'Кірмегенсіз',
-'uploadnologintext' => 'Файлдарды қотарып беру үшін [[{{#special:Userlogin}}|кіруіңіз]] жөн.',
+'uploadnologintext' => 'Файлдарды жүктеу үшін  [[Special:UserLogin|кіруіңіз]] жөн.',
 'upload_directory_missing' => 'Қотарып бермек қалтасы ($1) жетіспейді және веб-сервер жарата алмайды.',
 'upload_directory_read_only' => 'Қотарып бермек қалтасына ($1) веб-сервер жаза алмайды.',
-'uploaderror' => 'Қотарып беру қатесі',
+'uploaderror' => 'Жүктеу қатесі',
 'uploadtext' => "Төмендегі пішінді файлдарды қотарып беру үшін қолданыңыз.
 Алдында қотарылып берілген файлдарды қарау не іздеу үшін [[{{#special:FileList}}|қотарып берілген файлдар тізіміне]] барыңыз, тағы да қотарып беруі мен жоюы  [[{{#special:Log}}/upload|қотарып беру журналына]] жазылып алынады.
 
@@ -1611,19 +1607,19 @@ $3 келтірілген себебі: ''$2''",
 'largefileserver' => 'Осы файлдың мөлшері сервердің қалауынан асып кеткен.',
 'emptyfile' => 'Қотарып берілген файлыңыз бос сияқты. Файл атауы қате жазылған мүмкін.
 Бұл файлды қотарып беруі нақты талабыңыз екенін тексеріп шығыңыз.',
-'fileexists' => "Осылай аталған файл әлдеқашан бар, егер бұны өзгертуге сеніміңіз жоқ болса '''<tt>[[:$1]]</tt>''' дегенді тексеріп шығыңыз.
-[[$1|thumb]]",
-'filepageexists' => "Бұл файлдың сипаттама беті алдақашан '''<tt>[[:$1]]</tt>''' дегенде жасалған, бірақ ағымда былай аталған еш файл жоқ.
+'fileexists' => 'Осылай аталған файл әлдеқашан бар, егер бұны өзгертуге сеніміңіз жоқ болса <strong>[[:$1]]</strong> дегенді тексеріп шығыңыз.
+[[$1|thumb]]',
+'filepageexists' => 'Бұл файлдың сипаттама беті алдақашан <strong>[[:$1]]</strong> дегенде жасалған, бірақ ағымда былай аталған еш файл жоқ.
 Енгізген қысқаша мазмұндамаңыз сипаттамасы бетінде көрсетілмейді.
-Қысқаша мазмұндамаңыз осы арада көрсетілу үшін, бұны қолмен өңдемек болыңыз",
-'fileexists-extension' => "Ұқсас атауы бар файл табылды: [[$2|thumb]]
-* Қотарып берілетін файл атауы: '''<tt>[[:$1]]</tt>'''
-* Бар болған файл атауы: '''<tt>[[:$2]]</tt>'''
-Өзге атауды таңдаңыз.",
+Қысқаша мазмұндамаңыз осы арада көрсетілу үшін, бұны қолмен өңдемек болыңыз',
+'fileexists-extension' => 'Ұқсас атауы бар файл табылды: [[$2|thumb]]
+* Қотарып берілетін файл атауы: <strong>[[:$1]]</strong>
+* Бар болған файл атауы: <strong>[[:$2]]</strong>
+Өзге атауды таңдаңыз.',
 'fileexists-thumbnail-yes' => "Осы файл — мөлшері кішірітілген сурет ''(нобай)'' сияқты. [[$1|thumb]]
-Бұл '''<tt>[[:$1]]</tt>''' деген файлды сынап шығыңыз.
+Бұл <strong>[[:$1]]</strong> деген файлды сынап шығыңыз.
 Егер сыналған файл түпнұсқалы мөлшері бар дәлме-дәл сурет болса, қосысмша нобайды қотарып беру керегі жоқ.",
-'file-thumbnail-no' => "Файл атауы '''<tt>$1</tt>''' дегенмен басталады.
+'file-thumbnail-no' => "Файл атауы <strong>$1</strong> дегенмен басталады.
 Бұл — мөлшері кішірітілген сурет ''(нобай)'' сияқты.
 Егер бұл суреттің толық ажыратылымдығы болса, бұны қотарып беріңіз, әйтпесе файл атауын өзгертіңіз.",
 'fileexists-forbidden' => 'Осылай аталған файл алдақашан бар;
@@ -1634,7 +1630,7 @@ $3 келтірілген себебі: ''$2''",
 'uploadwarning' => 'Қотарып беру жөнінде құлақтандыру',
 'savefile' => 'Файлды сақтау',
 'uploadedimage' => '«[[$1]]» файлын жүктеді',
-'overwroteimage' => '«[[$1]]» файлынның жаңа нұсқасын қотарып берді',
+'overwroteimage' => '«[[$1]]» деген файлдың жаңа нұсқасын жүктеді',
 'uploaddisabled' => 'Қотарып беру өшірілген',
 'copyuploaddisabled' => 'URL арқылы жүктеу өшірілген.',
 'uploaddisabledtext' => '{{SITENAME}} жобасында файл қотарып беруі өшірілген.',
@@ -1754,9 +1750,9 @@ URL дұрыс екендігін және торап істеп тұрғаны
 # MIME search
 'mimesearch' => 'Файлды MIME түрімен іздеу',
 'mimesearch-summary' => 'Бұл бетте файлдарды MIME түрімен сүзгілеуі қосылған.
-Кірісі: мағлұмат_түрі/түр_тарауы, мысалы <tt>image/jpeg</tt>.',
+Кірісі: мағлұмат_түрі/түр_тарауы, мысалы <code>image/jpeg</code>.',
 'mimetype' => 'MIME түрі:',
-'download' => 'қотарып алу',
+'download' => 'жүктеп алу',
 
 # Unwatched pages
 'unwatchedpages' => 'Бақыланылмаған беттер',
@@ -2128,7 +2124,7 @@ $2 соңғы нұсқасына өзгертті.',
 'restriction-edit' => 'Өңдеуге',
 'restriction-move' => 'Жылжытуға',
 'restriction-create' => 'Бастауға',
-'restriction-upload' => 'Қотарып беруге',
+'restriction-upload' => 'Жүктеу',
 
 # Restriction levels
 'restriction-level-sysop' => 'толықтай қорғалған',
@@ -2474,20 +2470,20 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'importsuccess' => 'Сырттан алу аяқталды!',
 'importhistoryconflict' => 'Тарихында қақтығысты түзету бар (бұл бет алдында сырттан алынған сияқты)',
 'importnosources' => 'Уики-апару үшін сырттан алынатын еш қайнар көзі анықталмаған, және тарихын тікелей қотарып беруі өшірілген.',
-'importnofile' => 'Сырттан алынған файл қотарып берілген жоқ.',
-'importuploaderrorsize' => 'Сырттан алынған файлдың қотарып берілуі сәтсіз өтті. Файл мөлшері қотарып берілуге руқсат етілгеннен асады.',
-'importuploaderrorpartial' => 'Сырттан алынған файлдың қотарып берілуі сәтсіз өтті. Осы файлдың тек бөліктері қотарылып берілді.',
-'importuploaderrortemp' => 'Сырттан алынған файлдың қотарып берілуі сәтсіз өтті. Уақытша қалта табылмады.',
+'importnofile' => 'Сырттан алынған файл жүктелген жоқ.',
+'importuploaderrorsize' => 'Сырттан алынған файлдың жүктелуі сәтсіз өтті. Файл мөлшері рұқсат етілгеннен мөлшерден асады.',
+'importuploaderrorpartial' => 'Сырттан алынған файлдың жүктелуі сәтсіз өтті. Осы файлдың тек бөліктері жүктелді.',
+'importuploaderrortemp' => 'Сырттан алынған файлдың жүктелуі сәтсіз өтті. Уақытша қалта табылмады.',
 'import-parse-failure' => 'Сырттан алынған XML файл құрылымын талдатқанда сәтсіздік болды',
 'import-noarticle' => 'Сырттан алынатын еш бет жоқ!',
 'import-nonewrevisions' => 'Барлық түзетулері алдында сырттан алынған.',
 'xml-error-string' => '$1 нөмір $2 жолда, баған $3 (байт $4): $5',
-'import-upload' => 'XML деректерін қотарып беру',
+'import-upload' => 'XML деректерін жүктеу',
 
 # Import log
 'importlogpage' => 'Сырттан алу журналы',
 'importlogpagetext' => 'Беттерді түзету тарихымен бірге сыртқы уикилерден әкімші ретінде алу.',
-'import-logentry-upload' => '«[[$1]]» дегенді файл қотарып беру арқылы сырттан алды',
+'import-logentry-upload' => '«[[$1]]» дегенді файл жүктеу арқылы сырттан алды',
 'import-logentry-upload-detail' => '$1 түзету',
 'import-logentry-interwiki' => 'уики-апарылған $1',
 'import-logentry-interwiki-detail' => '$2 дегеннен $1 түзету',
@@ -2531,7 +2527,7 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'tooltip-feed-atom' => 'Бұл беттің Atom арнасы',
 'tooltip-t-contributions' => 'Осы қатысушының үлес тізімін қарау',
 'tooltip-t-emailuser' => 'Осы қатысушыға хат жөнелту',
-'tooltip-t-upload' => 'Файлдарды қотарып беру',
+'tooltip-t-upload' => 'Файлдарды жүктеу',
 'tooltip-t-specialpages' => 'Барлық арнайы беттер тізімі',
 'tooltip-t-print' => 'Бұл беттің басып шығарышқа арналған нұсқасы',
 'tooltip-t-permalink' => 'Мына беттің осы нұсқасының тұрақты сілтемесі',
@@ -2552,7 +2548,7 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'tooltip-compareselectedversions' => 'Беттің екі бөлектенген нұсқасы айырмасын қарау.',
 'tooltip-watch' => 'Бұл бетті бақылау тізіміңізге үстеу',
 'tooltip-recreate' => 'Бет жойылғанына қарамастан қайта бастау',
-'tooltip-upload' => 'Қотарып беруді бастау',
+'tooltip-upload' => 'Жүктеуді бастау',
 'tooltip-rollback' => '"Шегіндіру" сілтемесін бір рет басу арқылы соңға редактордың барлық қатар өңдемелерін өшіру',
 'tooltip-summary' => 'Қысқаша сипаттамасын жазыңыз',
 
@@ -2654,7 +2650,7 @@ $1',
 # Special:NewFiles
 'newimages' => 'Жаңа файлдар көрмесі',
 'imagelisttext' => "Төменде $2 сұрыпталған '''$1''' файл тізімі.",
-'newimages-summary' => 'Ð\91ұл Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\96нде Ñ\81оңÒ\93Ñ\8b Ò\9bоÑ\82аÑ\80Ñ\8bп Ð±ÐµÑ\80Ñ\96лген файлдар көрсетіледі',
+'newimages-summary' => 'Ð\91ұл Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\82е Ñ\81оңÒ\93Ñ\8b Ð¶Ò¯ÐºÑ\82елген файлдар көрсетіледі',
 'newimages-legend' => 'Сүзгі',
 'showhidebots' => '(боттарды $1)',
 'noimages' => 'Көретін ештеңе жоқ.',
@@ -3171,7 +3167,7 @@ $5
 'specialpages-group-other' => 'Тағы басқа арнайы беттер',
 'specialpages-group-login' => 'Кіру / тіркелу',
 'specialpages-group-changes' => 'Жуықтағы өзгерістер мен журналдар',
-'specialpages-group-media' => 'Таспа баянаттары және қотарып берілгендер',
+'specialpages-group-media' => 'Таспа баянаттары және жүктелгендер',
 'specialpages-group-users' => 'Қатысушылар және олардың құқықтары',
 'specialpages-group-highuse' => 'Өте көп қолданылған беттер',
 'specialpages-group-pages' => 'Беттер тізімі',
@@ -3185,9 +3181,17 @@ $5
 'intentionallyblankpage' => 'Бұл бет әдейі бос қалдырылған',
 
 # New logging system
+'logentry-delete-delete' => '$1 $3 деген бетті жойды',
 'revdelete-restricted' => 'әкімшілерге тиымдар қолдады',
 'revdelete-unrestricted' => 'әкімшілерден тиымдарды аластады',
+'logentry-move-move' => '$1 $3 бетін $4 бетіне жылжытты',
 'logentry-move-move-noredirect' => '$1 $3 бетін $4 бетіне жылжытты (айдатқыш қалдырылмады)',
+'logentry-move-move_redir' => '$1 $3 бетін $4 деген айдатқыш үстіне жылжытты',
 'logentry-move-move_redir-noredirect' => '$1 $3 бетін $4 деген айдатқыш үстіне жылжытты (айдатқыш қалдырылмады)',
+'logentry-newusers-newusers' => '$1 жаңадан аккаунт тіркеді',
+'logentry-newusers-create' => '$1 жаңадан аккаунт тіркеді',
+'logentry-newusers-create2' => '$1 $3 деген аккаунт тіркеді',
+'logentry-newusers-autocreate' => '$1 аккаунты автоматты түрде тіркелді',
+'newuserlog-byemail' => 'Құпия сөз e-mail арқылы жіберілді',
 
 );
index 3068bda..c2524b7 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Kazakh (Latin script) (‪Qazaqşa (latın)‬)
+/** Kazakh (Latin script) (‪qazaqşa (latın)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -31,10 +31,6 @@ $separatorTransformTable = array(
        '.' => ',',
 );
 
-$extraUserToggles = array(
-       'nolangconversion'
-);
-
 $fallback8bitEncoding = 'windows-1254';
 
 $namespaceNames = array(
@@ -150,129 +146,129 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#AÝDAW', '#АЙДАУ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__MAZMUNSIZ__', '__MSIZ__', '__МАЗМҰНСЫЗ__', '__МСЫЗ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__QOÝMASIZ__', '__QSIZ__', '__ҚОЙМАСЫЗ__', '__ҚСЫЗ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__MAZMUNDATQIZW__', '__MQIZW__', '__МАЗМҰНДАТҚЫЗУ__', '__МҚЫЗУ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__MAZMUNI__', '__MZMN__', '__МАЗМҰНЫ__', '__МЗМН__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BÖLİDİMÖNDEMEW__', '__BÖLİMÖNDETKİZBEW__', '__БӨЛІДІМӨНДЕМЕУ__', '__БӨЛІМӨНДЕТКІЗБЕУ__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'AĞIMDAĞIAÝ', 'АҒЫМДАҒЫАЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'AĞIMDAĞIAÝATAWI', 'АҒЫМДАҒЫАЙАТАУЫ', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'AĞIMDAĞIAÝİLİKATAWI', 'АҒЫМДАҒЫАЙІЛІКАТАУЫ', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'AĞIMDAĞIAÝJÏIR', 'AĞIMDAĞIAÝQISQA', 'АҒЫМДАҒЫАЙЖИЫР', 'АҒЫМДАҒЫАЙҚЫСҚА', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'AĞIMDAĞIKÜN', 'АҒЫМДАҒЫКҮН', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'AĞIMDAĞIKÜN2', 'АҒЫМДАҒЫКҮН2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'AĞIMDAĞIKÜNATAWI', 'АҒЫМДАҒЫКҮНАТАУЫ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'AĞIMDAĞIJIL', 'АҒЫМДАҒЫЖЫЛ', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'AĞIMDAĞIWAQIT', 'АҒЫМДАҒЫУАҚЫТ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'AĞIMDAĞISAĞAT', 'АҒЫМДАҒЫСАҒАТ', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'JERGİLİKTİAÝ', 'ЖЕРГІЛІКТІАЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'JERGİLİKTİAÝATAWI', 'ЖЕРГІЛІКТІАЙАТАУЫ', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'JERGİLİKTİAÝİLİKATAWI', 'ЖЕРГІЛІКТІАЙІЛІКАТАУЫ', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'JERGİLİKTİAÝJÏIR', 'JERGİLİKTİAÝQISQAŞA', 'JERGİLİKTİAÝQISQA', 'ЖЕРГІЛІКТІАЙЖИЫР', 'ЖЕРГІЛІКТІАЙҚЫСҚАША', 'ЖЕРГІЛІКТІАЙҚЫСҚА', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'JERGİLİKTİKÜN', 'ЖЕРГІЛІКТІКҮН', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'JERGİLİKTİKÜN2', 'ЖЕРГІЛІКТІКҮН2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'JERGİLİKTİKÜNATAWI', 'ЖЕРГІЛІКТІКҮНАТАУЫ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'JERGİLİKTİJIL', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'JERGİLİKTİWAQIT', 'ЖЕРГІЛІКТІУАҚЫТ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'JERGİLİKTİSAĞAT', 'ЖЕРГІЛІКТІСАҒАТ', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'BETSANI', 'БЕТСАНЫ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'MAQALASANI', 'МАҚАЛАСАНЫ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'FAÝLSANI', 'ФАЙЛСАНЫ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'QATISWŞISANI', 'ҚАТЫСУШЫСАНЫ', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'ÖÑDEMESANI', 'TÜZETWSANI', 'ӨҢДЕМЕСАНЫ', 'ТҮЗЕТУСАНЫ', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'BETATAWI', 'БЕТАТАУЫ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'BETATAWI2', 'БЕТАТАУЫ2', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ESİMAYASI', 'ЕСІМАЯСЫ', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ESİMAYASI2', 'ЕСІМАЯСЫ2', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'TALQILAWAYASI', 'ТАЛҚЫЛАУАЯСЫ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'TALQILAWAYASI2', 'ТАЛҚЫЛАУАЯСЫ2', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'TAQIRIPBETİ', 'MAQALABETİ', 'ТАҚЫРЫПБЕТІ', 'МАҚАЛАБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'TAQIRIPBETİ2', 'MAQALABETİ2', 'ТАҚЫРЫПБЕТІ2', 'МАҚАЛАБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'TOLIQBETATAWI', 'ТОЛЫҚБЕТАТАУЫ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'TOLIQBETATAWI2', 'ТОЛЫҚБЕТАТАУЫ2', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'BETŞEATAWI', 'ASTIÑĞIBETATAWI', 'БЕТШЕАТАУЫ', 'АСТЫҢҒЫБЕТАТАУЫ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'BETŞEATAWI2', 'ASTIÑĞIBETATAWI2', 'БЕТШЕАТАУЫ2', 'АСТЫҢҒЫБЕТАТАУЫ2', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NEGİZGİBETATAWI', 'НЕГІЗГІБЕТАТАУЫ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NEGİZGİBETATAWI2', 'НЕГІЗГІБЕТАТАУЫ2', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'TALQILAWBETATAWI', 'ТАЛҚЫЛАУБЕТАТАУЫ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'TALQILAWBETATAWI2', 'ТАЛҚЫЛАУБЕТАТАУЫ2', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'TAQIRIPBETATAWI', 'MAQALABETATAWI', 'ТАҚЫРЫПБЕТАТАУЫ', 'МАҚАЛАБЕТАТАУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'TAQIRIPBETATAWI2', 'MAQALABETATAWI2', 'ТАҚЫРЫПБЕТАТАУЫ2', 'МАҚАЛАБЕТАТАУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'XBR:', 'ХБР:', 'MSG:' ),
-       'subst'                   => array( '0', 'BÄDEL:', 'БӘДЕЛ:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'WÏKÏSİZXBR:', 'УИКИСІЗХБР:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'nobaý', 'нобай', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'nobaý=$1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'oñğa', 'oñ', 'оңға', 'оң', 'right' ),
-       'img_left'                => array( '1', 'solğa', 'sol', 'солға', 'сол', 'left' ),
-       'img_none'                => array( '1', 'eşqandaý', 'joq', 'ешқандай', 'жоқ', 'none' ),
-       'img_width'               => array( '1', '$1 nükte', '$1 нүкте', '$1px' ),
-       'img_center'              => array( '1', 'ortağa', 'orta', 'ортаға', 'орта', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'sürmeli', 'сүрмелі', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'sürmesiz', 'сүрмесіз', 'frameless' ),
-       'img_page'                => array( '1', 'bet=$1', 'bet $1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'tikti', 'tiktik=$1', 'tiktik $1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'jïekti', 'жиекті', 'border' ),
-       'img_baseline'            => array( '1', 'tirekjol', 'тірекжол', 'baseline' ),
-       'img_sub'                 => array( '1', 'astılığı', 'ast', 'астылығы', 'аст', 'sub' ),
-       'img_super'               => array( '1', 'üstiligi', 'üst', 'үстілігі', 'үст', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'üstine', 'үстіне', 'top' ),
-       'img_text_top'            => array( '1', 'mätin-üstinde', 'мәтін-үстінде', 'text-top' ),
-       'img_middle'              => array( '1', 'aralığına', 'аралығына', 'middle' ),
-       'img_bottom'              => array( '1', 'astına', 'астына', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'mätin-astında', 'мәтін-астында', 'text-bottom' ),
-       'int'                     => array( '0', 'İŞKİ:', 'ІШКІ:', 'INT:' ),
-       'sitename'                => array( '1', 'TORAPATAWI', 'ТОРАПАТАУЫ', 'SITENAME' ),
-       'ns'                      => array( '0', 'EA:', 'ESİMAYA:', 'ЕА:', 'ЕСІМАЯ:', 'NS:' ),
-       'localurl'                => array( '0', 'JERGİLİKTİJAÝ:', 'ЖЕРГІЛІКТІЖАЙ:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'JERGİLİKTİJAÝ2:', 'ЖЕРГІЛІКТІЖАЙ2:', 'LOCALURLE:' ),
-       'servername'              => array( '0', 'SERVERATAWI', 'СЕРВЕРАТАУЫ', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ÄMİRJOLI', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'SEPTİGİ:', 'SEPTİK:', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
-       'notitleconvert'          => array( '0', '__TAQIRIPATINTÜRLENDİRGİZBEW__', '__TATJOQ__', '__ATAWALMASTIRĞIZBAW__', '__AABAW__', '__ТАҚЫРЫПАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__ТАТЖОҚ__', '__АТАУАЛМАСТЫРҒЫЗБАУ__', '__ААБАУ__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__MAĞLUMATINTÜRLENDİRGİZBEW__', '__MATJOQ__', '__MAĞLUMATALMASTIRĞIZBAW__', '__MABAW__', '__МАҒЛҰМАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__МАТЖОҚ__', '__МАҒЛҰМАТАЛМАСТЫРҒЫЗБАУ__', '__МАБАУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'AĞIMDAĞIAPTASI', 'AĞIMDAĞIAPTA', 'АҒЫМДАҒЫАПТАСЫ', 'АҒЫМДАҒЫАПТА', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'AĞIMDAĞIAPTAKÜNİ', 'АҒЫМДАҒЫАПТАКҮНІ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'JERGİLİKTİAPTASI', 'JERGİLİKTİAPTA', 'ЖЕРГІЛІКТІАПТАСЫ', 'ЖЕРГІЛІКТІАПТА', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'JERGİLİKTİAPTAKÜNİ', 'ЖЕРГІЛІКТІАПТАКҮНІ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'TÜZETWNÖMİRİ', 'NUSQANÖMİRİ', 'ТҮЗЕТУНӨМІРІ', 'НҰСҚАНӨМІРІ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'TÜZETWKÜNİ', 'NUSQAKÜNİ', 'ТҮЗЕТУКҮНІ', 'НҰСҚАКҮНІ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'TÜZETWKÜNİ2', 'NUSQAKÜNİ2', 'ТҮЗЕТУКҮНІ2', 'НҰСҚАКҮНІ2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'TÜZETWAÝI', 'NUSQAAÝI', 'ТҮЗЕТУАЙЫ', 'НҰСҚААЙЫ', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'TÜZETWJILI', 'NUSQAJILI', 'ТҮЗЕТУЖЫЛЫ', 'НҰСҚАЖЫЛЫ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'TÜZETWWAQITITAÑBASI', 'NUSQAWAQITTÜÝİNDEMESİ', 'ТҮЗЕТУУАҚЫТЫТАҢБАСЫ', 'НҰСҚАУАҚЫТТҮЙІНДЕМЕСІ', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'KÖPŞETÜRİ:', 'KÖPŞE:', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'TOLIQJAÝI:', 'TOLIQJAÝ:', 'ТОЛЫҚЖАЙЫ:', 'ТОЛЫҚЖАЙ:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'TOLIQJAÝI2:', 'TOLIQJAÝ2:', 'ТОЛЫҚЖАЙЫ2:', 'ТОЛЫҚЖАЙ2:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'KÄ1:', 'KİŞİÄRİPPEN1:', 'КӘ1:', 'КІШІӘРІППЕН1:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'BÄ1:', 'BASÄRİPPEN1:', 'БӘ1:', 'БАСӘРІППЕН1:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'KÄ:', 'KİŞİÄRİPPEN:', 'КӘ:', 'КІШІӘРІППЕН:', 'LC:' ),
-       'uc'                      => array( '0', 'BÄ:', 'BASÄRİPPEN:', 'БӘ:', 'БАСӘРІППЕН:', 'UC:' ),
-       'raw'                     => array( '0', 'QAM:', 'ҚАМ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'KÖRİNETİNTAQIRIAPATI', 'KÖRSETİLETİNATAW', 'КӨРІНЕТІНТАҚЫРЫАПАТЫ', 'КӨРСЕТІЛЕТІНАТАУ', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'Q', 'Қ', 'R' ),
-       'newsectionlink'          => array( '1', '__JAÑABÖLİMSİLTEMESİ__', '__ЖАҢАБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'BAĞDARLAMANUSQASI', 'БАҒДАРЛАМАНҰСҚАСЫ', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'JAÝDIMUQAMDAW:', 'ЖАЙДЫМҰҚАМДАУ:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'JÄKİRDİMUQAMDAW', 'ЖӘКІРДІМҰҚАМДАУ', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'AĞIMDAĞIWAQITTÜÝİNDEMESİ', 'AĞIMDAĞIWAQITTÜÝİN', 'АҒЫМДАҒЫУАҚЫТТҮЙІНДЕМЕСІ', 'АҒЫМДАҒЫУАҚЫТТҮЙІН', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'JERGİLİKTİWAQITTÜÝİNDEMESİ', 'JERGİLİKTİWAQITTÜÝİN', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІНДЕМЕСІ', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІН', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'BAĞITBELGİSİ', 'БАҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#TİL:', '#ТІЛ:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'MAĞLUMATTİLİ', 'МАҒЛҰМАТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'ESİMAYABETSANI:', 'EABETSANI:', 'AYABETSANI:', 'ЕСІМАЯБЕТСАНЫ:', 'ЕАБЕТСАНЫ:', 'АЯБЕТСАНЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ÄKİMŞİSANI', 'ӘКІМШІСАНЫ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'SANPİŞİMİ', 'САНПІШІМІ', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'SOLĞAIĞIS', 'SOLIĞIS', 'СОЛҒАЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
-       'padright'                => array( '0', 'OÑĞAIĞIS', 'OÑIĞIS', 'ОҢҒАЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
-       'special'                 => array( '0', 'arnaýı', 'арнайы', 'special' ),
-       'defaultsort'             => array( '1', 'ÄDEPKİSURIPTAW:', 'ÄDEPKİSANATSURIPTAW:', 'ÄDEPKİSURIPTAWKİLTİ:', 'ÄDEPKİSURIP:', 'ӘДЕПКІСҰРЫПТАУ:', 'ӘДЕПКІСАНАТСҰРЫПТАУ:', 'ӘДЕПКІСҰРЫПТАУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'FAÝLMEKENİ:', 'ФАЙЛМЕКЕНІ:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'belgi', 'белгі', 'tag' ),
-       'hiddencat'               => array( '1', '__JASIRINSANAT__', '__ЖАСЫРЫНСАНАТ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'SANATTAĞIBETTER', 'САНАТТАҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'BETMÖLŞERİ', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#AÝDAW', '#АЙДАУ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__MAZMUNSIZ__', '__MSIZ__', '__МАЗМҰНСЫЗ__', '__МСЫЗ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__QOÝMASIZ__', '__QSIZ__', '__ҚОЙМАСЫЗ__', '__ҚСЫЗ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__MAZMUNDATQIZW__', '__MQIZW__', '__МАЗМҰНДАТҚЫЗУ__', '__МҚЫЗУ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__MAZMUNI__', '__MZMN__', '__МАЗМҰНЫ__', '__МЗМН__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BÖLİDİMÖNDEMEW__', '__BÖLİMÖNDETKİZBEW__', '__БӨЛІДІМӨНДЕМЕУ__', '__БӨЛІМӨНДЕТКІЗБЕУ__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'AĞIMDAĞIAÝ', 'АҒЫМДАҒЫАЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'AĞIMDAĞIAÝATAWI', 'АҒЫМДАҒЫАЙАТАУЫ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'AĞIMDAĞIAÝİLİKATAWI', 'АҒЫМДАҒЫАЙІЛІКАТАУЫ', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'AĞIMDAĞIAÝJÏIR', 'AĞIMDAĞIAÝQISQA', 'АҒЫМДАҒЫАЙЖИЫР', 'АҒЫМДАҒЫАЙҚЫСҚА', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'AĞIMDAĞIKÜN', 'АҒЫМДАҒЫКҮН', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'AĞIMDAĞIKÜN2', 'АҒЫМДАҒЫКҮН2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'AĞIMDAĞIKÜNATAWI', 'АҒЫМДАҒЫКҮНАТАУЫ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'AĞIMDAĞIJIL', 'АҒЫМДАҒЫЖЫЛ', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'AĞIMDAĞIWAQIT', 'АҒЫМДАҒЫУАҚЫТ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'AĞIMDAĞISAĞAT', 'АҒЫМДАҒЫСАҒАТ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'JERGİLİKTİAÝ', 'ЖЕРГІЛІКТІАЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'JERGİLİKTİAÝATAWI', 'ЖЕРГІЛІКТІАЙАТАУЫ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'JERGİLİKTİAÝİLİKATAWI', 'ЖЕРГІЛІКТІАЙІЛІКАТАУЫ', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'JERGİLİKTİAÝJÏIR', 'JERGİLİKTİAÝQISQAŞA', 'JERGİLİKTİAÝQISQA', 'ЖЕРГІЛІКТІАЙЖИЫР', 'ЖЕРГІЛІКТІАЙҚЫСҚАША', 'ЖЕРГІЛІКТІАЙҚЫСҚА', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'JERGİLİKTİKÜN', 'ЖЕРГІЛІКТІКҮН', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'JERGİLİKTİKÜN2', 'ЖЕРГІЛІКТІКҮН2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'JERGİLİKTİKÜNATAWI', 'ЖЕРГІЛІКТІКҮНАТАУЫ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'JERGİLİKTİJIL', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'JERGİLİKTİWAQIT', 'ЖЕРГІЛІКТІУАҚЫТ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'JERGİLİKTİSAĞAT', 'ЖЕРГІЛІКТІСАҒАТ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'BETSANI', 'БЕТСАНЫ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'MAQALASANI', 'МАҚАЛАСАНЫ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'FAÝLSANI', 'ФАЙЛСАНЫ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'QATISWŞISANI', 'ҚАТЫСУШЫСАНЫ', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'ÖÑDEMESANI', 'TÜZETWSANI', 'ӨҢДЕМЕСАНЫ', 'ТҮЗЕТУСАНЫ', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'BETATAWI', 'БЕТАТАУЫ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'BETATAWI2', 'БЕТАТАУЫ2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ESİMAYASI', 'ЕСІМАЯСЫ', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ESİMAYASI2', 'ЕСІМАЯСЫ2', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'TALQILAWAYASI', 'ТАЛҚЫЛАУАЯСЫ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'TALQILAWAYASI2', 'ТАЛҚЫЛАУАЯСЫ2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'TAQIRIPBETİ', 'MAQALABETİ', 'ТАҚЫРЫПБЕТІ', 'МАҚАЛАБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'TAQIRIPBETİ2', 'MAQALABETİ2', 'ТАҚЫРЫПБЕТІ2', 'МАҚАЛАБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'TOLIQBETATAWI', 'ТОЛЫҚБЕТАТАУЫ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'TOLIQBETATAWI2', 'ТОЛЫҚБЕТАТАУЫ2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'BETŞEATAWI', 'ASTIÑĞIBETATAWI', 'БЕТШЕАТАУЫ', 'АСТЫҢҒЫБЕТАТАУЫ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'BETŞEATAWI2', 'ASTIÑĞIBETATAWI2', 'БЕТШЕАТАУЫ2', 'АСТЫҢҒЫБЕТАТАУЫ2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NEGİZGİBETATAWI', 'НЕГІЗГІБЕТАТАУЫ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NEGİZGİBETATAWI2', 'НЕГІЗГІБЕТАТАУЫ2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'TALQILAWBETATAWI', 'ТАЛҚЫЛАУБЕТАТАУЫ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'TALQILAWBETATAWI2', 'ТАЛҚЫЛАУБЕТАТАУЫ2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'TAQIRIPBETATAWI', 'MAQALABETATAWI', 'ТАҚЫРЫПБЕТАТАУЫ', 'МАҚАЛАБЕТАТАУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'TAQIRIPBETATAWI2', 'MAQALABETATAWI2', 'ТАҚЫРЫПБЕТАТАУЫ2', 'МАҚАЛАБЕТАТАУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'XBR:', 'ХБР:', 'MSG:' ),
+       'subst'                     => array( '0', 'BÄDEL:', 'БӘДЕЛ:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'WÏKÏSİZXBR:', 'УИКИСІЗХБР:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'nobaý', 'нобай', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'nobaý=$1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'oñğa', 'oñ', 'оңға', 'оң', 'right' ),
+       'img_left'                  => array( '1', 'solğa', 'sol', 'солға', 'сол', 'left' ),
+       'img_none'                  => array( '1', 'eşqandaý', 'joq', 'ешқандай', 'жоқ', 'none' ),
+       'img_width'                 => array( '1', '$1 nükte', '$1 нүкте', '$1px' ),
+       'img_center'                => array( '1', 'ortağa', 'orta', 'ортаға', 'орта', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'sürmeli', 'сүрмелі', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'sürmesiz', 'сүрмесіз', 'frameless' ),
+       'img_page'                  => array( '1', 'bet=$1', 'bet $1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'tikti', 'tiktik=$1', 'tiktik $1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'jïekti', 'жиекті', 'border' ),
+       'img_baseline'              => array( '1', 'tirekjol', 'тірекжол', 'baseline' ),
+       'img_sub'                   => array( '1', 'astılığı', 'ast', 'астылығы', 'аст', 'sub' ),
+       'img_super'                 => array( '1', 'üstiligi', 'üst', 'үстілігі', 'үст', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'üstine', 'үстіне', 'top' ),
+       'img_text_top'              => array( '1', 'mätin-üstinde', 'мәтін-үстінде', 'text-top' ),
+       'img_middle'                => array( '1', 'aralığına', 'аралығына', 'middle' ),
+       'img_bottom'                => array( '1', 'astına', 'астына', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'mätin-astında', 'мәтін-астында', 'text-bottom' ),
+       'int'                       => array( '0', 'İŞKİ:', 'ІШКІ:', 'INT:' ),
+       'sitename'                  => array( '1', 'TORAPATAWI', 'ТОРАПАТАУЫ', 'SITENAME' ),
+       'ns'                        => array( '0', 'EA:', 'ESİMAYA:', 'ЕА:', 'ЕСІМАЯ:', 'NS:' ),
+       'localurl'                  => array( '0', 'JERGİLİKTİJAÝ:', 'ЖЕРГІЛІКТІЖАЙ:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'JERGİLİKTİJAÝ2:', 'ЖЕРГІЛІКТІЖАЙ2:', 'LOCALURLE:' ),
+       'servername'                => array( '0', 'SERVERATAWI', 'СЕРВЕРАТАУЫ', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ÄMİRJOLI', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'SEPTİGİ:', 'SEPTİK:', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
+       'notitleconvert'            => array( '0', '__TAQIRIPATINTÜRLENDİRGİZBEW__', '__TATJOQ__', '__ATAWALMASTIRĞIZBAW__', '__AABAW__', '__ТАҚЫРЫПАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__ТАТЖОҚ__', '__АТАУАЛМАСТЫРҒЫЗБАУ__', '__ААБАУ__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__MAĞLUMATINTÜRLENDİRGİZBEW__', '__MATJOQ__', '__MAĞLUMATALMASTIRĞIZBAW__', '__MABAW__', '__МАҒЛҰМАТЫНТҮРЛЕНДІРГІЗБЕУ__', '__МАТЖОҚ__', '__МАҒЛҰМАТАЛМАСТЫРҒЫЗБАУ__', '__МАБАУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'AĞIMDAĞIAPTASI', 'AĞIMDAĞIAPTA', 'АҒЫМДАҒЫАПТАСЫ', 'АҒЫМДАҒЫАПТА', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'AĞIMDAĞIAPTAKÜNİ', 'АҒЫМДАҒЫАПТАКҮНІ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'JERGİLİKTİAPTASI', 'JERGİLİKTİAPTA', 'ЖЕРГІЛІКТІАПТАСЫ', 'ЖЕРГІЛІКТІАПТА', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'JERGİLİKTİAPTAKÜNİ', 'ЖЕРГІЛІКТІАПТАКҮНІ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'TÜZETWNÖMİRİ', 'NUSQANÖMİRİ', 'ТҮЗЕТУНӨМІРІ', 'НҰСҚАНӨМІРІ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'TÜZETWKÜNİ', 'NUSQAKÜNİ', 'ТҮЗЕТУКҮНІ', 'НҰСҚАКҮНІ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'TÜZETWKÜNİ2', 'NUSQAKÜNİ2', 'ТҮЗЕТУКҮНІ2', 'НҰСҚАКҮНІ2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'TÜZETWAÝI', 'NUSQAAÝI', 'ТҮЗЕТУАЙЫ', 'НҰСҚААЙЫ', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'TÜZETWJILI', 'NUSQAJILI', 'ТҮЗЕТУЖЫЛЫ', 'НҰСҚАЖЫЛЫ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'TÜZETWWAQITITAÑBASI', 'NUSQAWAQITTÜÝİNDEMESİ', 'ТҮЗЕТУУАҚЫТЫТАҢБАСЫ', 'НҰСҚАУАҚЫТТҮЙІНДЕМЕСІ', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'KÖPŞETÜRİ:', 'KÖPŞE:', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'TOLIQJAÝI:', 'TOLIQJAÝ:', 'ТОЛЫҚЖАЙЫ:', 'ТОЛЫҚЖАЙ:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'TOLIQJAÝI2:', 'TOLIQJAÝ2:', 'ТОЛЫҚЖАЙЫ2:', 'ТОЛЫҚЖАЙ2:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'KÄ1:', 'KİŞİÄRİPPEN1:', 'КӘ1:', 'КІШІӘРІППЕН1:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'BÄ1:', 'BASÄRİPPEN1:', 'БӘ1:', 'БАСӘРІППЕН1:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'KÄ:', 'KİŞİÄRİPPEN:', 'КӘ:', 'КІШІӘРІППЕН:', 'LC:' ),
+       'uc'                        => array( '0', 'BÄ:', 'BASÄRİPPEN:', 'БӘ:', 'БАСӘРІППЕН:', 'UC:' ),
+       'raw'                       => array( '0', 'QAM:', 'ҚАМ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'KÖRİNETİNTAQIRIAPATI', 'KÖRSETİLETİNATAW', 'КӨРІНЕТІНТАҚЫРЫАПАТЫ', 'КӨРСЕТІЛЕТІНАТАУ', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'Q', 'Қ', 'R' ),
+       'newsectionlink'            => array( '1', '__JAÑABÖLİMSİLTEMESİ__', '__ЖАҢАБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'BAĞDARLAMANUSQASI', 'БАҒДАРЛАМАНҰСҚАСЫ', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'JAÝDIMUQAMDAW:', 'ЖАЙДЫМҰҚАМДАУ:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'JÄKİRDİMUQAMDAW', 'ЖӘКІРДІМҰҚАМДАУ', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'AĞIMDAĞIWAQITTÜÝİNDEMESİ', 'AĞIMDAĞIWAQITTÜÝİN', 'АҒЫМДАҒЫУАҚЫТТҮЙІНДЕМЕСІ', 'АҒЫМДАҒЫУАҚЫТТҮЙІН', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'JERGİLİKTİWAQITTÜÝİNDEMESİ', 'JERGİLİKTİWAQITTÜÝİN', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІНДЕМЕСІ', 'ЖЕРГІЛІКТІУАҚЫТТҮЙІН', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'BAĞITBELGİSİ', 'БАҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#TİL:', '#ТІЛ:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'MAĞLUMATTİLİ', 'МАҒЛҰМАТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'ESİMAYABETSANI:', 'EABETSANI:', 'AYABETSANI:', 'ЕСІМАЯБЕТСАНЫ:', 'ЕАБЕТСАНЫ:', 'АЯБЕТСАНЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ÄKİMŞİSANI', 'ӘКІМШІСАНЫ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'SANPİŞİMİ', 'САНПІШІМІ', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'SOLĞAIĞIS', 'SOLIĞIS', 'СОЛҒАЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
+       'padright'                  => array( '0', 'OÑĞAIĞIS', 'OÑIĞIS', 'ОҢҒАЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
+       'special'                   => array( '0', 'arnaýı', 'арнайы', 'special' ),
+       'defaultsort'               => array( '1', 'ÄDEPKİSURIPTAW:', 'ÄDEPKİSANATSURIPTAW:', 'ÄDEPKİSURIPTAWKİLTİ:', 'ÄDEPKİSURIP:', 'ӘДЕПКІСҰРЫПТАУ:', 'ӘДЕПКІСАНАТСҰРЫПТАУ:', 'ӘДЕПКІСҰРЫПТАУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'FAÝLMEKENİ:', 'ФАЙЛМЕКЕНІ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'belgi', 'белгі', 'tag' ),
+       'hiddencat'                 => array( '1', '__JASIRINSANAT__', '__ЖАСЫРЫНСАНАТ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'SANATTAĞIBETTER', 'САНАТТАҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'BETMÖLŞERİ', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
 );
 
 $specialPageAliases = array(
@@ -395,7 +391,6 @@ $messages = array(
 'tog-watchlisthideown' => 'Öñdemelerimdi baqılaw tizimnen jasır',
 'tog-watchlisthidebots' => 'Bot öñdemelerin baqılaw tizimnen jasır',
 'tog-watchlisthideminor' => 'Şağın öñdemelerdi baqılaw tiziminde körsetpe',
-'tog-nolangconversion' => 'Til türi awdarısın öşir',
 'tog-ccmeonemails' => 'Basqa qatıswşığa jibergen xatımnıñ köşirmesin mağan da jönelt',
 'tog-diffonly' => 'Aýırma astında bet mağlumatın körsetpe',
 'tog-showhiddencats' => 'Jasırın sanattardı körset',
@@ -1365,19 +1360,19 @@ bul faýl mölşeri — $2.',
 'largefileserver' => 'Osı faýldıñ mölşeri serverdiñ qalawınan asıp ketken.',
 'emptyfile' => 'Qotarıp berilgen faýlıñız bos sïyaqtı. Faýl atawı qate jazılğan mümkin.
 Bul faýldı qotarıp berwi naqtı talabıñız ekenin tekserip şığıñız.',
-'fileexists' => "Bılaý atalğan faýl aldaqaşan bar, eger bunı özgertwge batılıñız joq bolsa '''<tt>[[:$1]]</tt>''' degendi tekserip şığıñız.
-[[$1|thumb]]",
-'filepageexists' => "Bul faýldıñ sïpattama beti aldaqaşan '''<tt>[[:$1]]</tt>''' degende jasalğan, biraq ağımda bılaý atalğan eş faýl joq.
+'fileexists' => 'Bılaý atalğan faýl aldaqaşan bar, eger bunı özgertwge batılıñız joq bolsa <strong>[[:$1]]</strong> degendi tekserip şığıñız.
+[[$1|thumb]]',
+'filepageexists' => 'Bul faýldıñ sïpattama beti aldaqaşan <strong>[[:$1]]</strong> degende jasalğan, biraq ağımda bılaý atalğan eş faýl joq.
 Engizgen qısqaşa mazmundamañız sïpattaması betinde körsetilmeýdi.
-Qısqaşa mazmundamañız osı arada körsetilw üşin, bunı qolmen öñdemek bolıñız",
-'fileexists-extension' => "Uqsas atawı bar faýl tabıldı: [[$2|thumb]]
-* Qotarıp beriletin faýl atawı: '''<tt>[[:$1]]</tt>'''
-* Bar bolğan faýl atawı: '''<tt>[[:$2]]</tt>'''
-Özge atawdı tañdañız.",
+Qısqaşa mazmundamañız osı arada körsetilw üşin, bunı qolmen öñdemek bolıñız',
+'fileexists-extension' => 'Uqsas atawı bar faýl tabıldı: [[$2|thumb]]
+* Qotarıp beriletin faýl atawı: <strong>[[:$1]]</strong>
+* Bar bolğan faýl atawı: <strong>[[:$2]]</strong>
+Özge atawdı tañdañız.',
 'fileexists-thumbnail-yes' => "Osı faýl — mölşeri kişiritilgen swret ''(nobaý)'' sïyaqtı. [[$1|thumb]]
-Bul '''<tt>[[:$1]]</tt>''' degen faýldı sınap şığıñız.
+Bul <strong>[[:$1]]</strong> degen faýldı sınap şığıñız.
 Eger sınalğan faýl tüpnusqalı mölşeri bar dälme-däl swret bolsa, qosısmşa nobaýdı qotarıp berw keregi joq.",
-'file-thumbnail-no' => "Faýl atawı '''<tt>$1</tt>''' degenmen bastaladı.
+'file-thumbnail-no' => "Faýl atawı <strong>$1</strong> degenmen bastaladı.
 Bul — mölşeri kişiritilgen swret ''(nobaý)'' sïyaqtı.
 Eger bul swrettiñ tolıq ajıratılımdığı bolsa, bunı qotarıp beriñiz, äýtpese faýl atawın özgertiñiz.",
 'fileexists-forbidden' => 'Osılaý atalğan faýl aldaqaşan bar;
@@ -1494,7 +1489,7 @@ Bağannıñ bas jolın nuqığanda surıptawdıñ rettewi özgertiledi.',
 # MIME search
 'mimesearch' => 'Faýldı MIME türimen izdew',
 'mimesearch-summary' => 'Bul bette faýldardı MIME türimen süzgilewi qosılğan.
-Kirisi: mağlumat_türi/tür_tarawı, mısalı <tt>image/jpeg</tt>.',
+Kirisi: mağlumat_türi/tür_tarawı, mısalı <code>image/jpeg</code>.',
 'mimetype' => 'MIME türi:',
 'download' => 'qotarıp alw',
 
index e7f6e67..c9c09ff 100644 (file)
@@ -189,76 +189,76 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#បញ្ជូនបន្ត', '#ប្ដូរទីតាំងទៅ', '#ប្តូរទីតាំងទៅ', '#ប្ដូរទីតាំង', '#ប្តូរទីតាំង', '#ប្ដូរចំណងជើង', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__លាក់មាតិកា__', '__លាក់បញ្ជីអត្ថបទ__', '__គ្មានមាតិកា__', '__គ្មានបញ្ជីអត្ថបទ__', '__កុំបង្ហាញមាតិកា__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__លាក់វិចិត្រសាល__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__បង្ខំមាតិកា__', '__បង្ខំបញ្ជីអត្ថបទ__', '__បង្ខំអោយបង្ហាញមាតិកា__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__មាតិកា__', '__បញ្ជីអត្ថបទ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__ផ្នែកមិនត្រូវកែប្រែ__', '__មិនមានផ្នែកកែប្រែ__', '__លាក់ផ្នែកកែប្រែ__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__លាក់បឋមកថា__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'ខែនេះ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'ឈ្មោះខែនេះ', 'CURRENTMONTHNAME' ),
-       'currentday'              => array( '1', 'ថ្ងៃនេះ', 'CURRENTDAY' ),
-       'currentdayname'          => array( '1', 'ឈ្មោះថ្ងៃនេះ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ឆ្នាំនេះ', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ពេលនេះ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ម៉ោងនេះ', 'ម៉ោងឥឡូវ', 'CURRENTHOUR' ),
-       'localyear'               => array( '1', 'LOCALDAYNAME', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ពេលវេលាក្នុងតំបន់', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ម៉ោងតំបន់', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ចំនួនទំព័រ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ចំនួនអត្ថបទ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ចំនួនឯកសារ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ចំនួនអ្នកប្រើប្រាស់', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'ចំនួនកំណែប្រែ', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'ឈ្មោះទំព័រ', 'PAGENAME' ),
-       'namespace'               => array( '1', 'លំហឈ្មោះ', 'NAMESPACE' ),
-       'talkspace'               => array( '1', 'លំហឈ្មោះទំព័រពិភាក្សា', 'TALKSPACE' ),
-       'fullpagename'            => array( '1', 'ឈ្មោះទំព័រពេញ', 'FULLPAGENAME' ),
-       'subpagename'             => array( '1', 'ឈ្មោះទំព័ររង', 'SUBPAGENAME' ),
-       'talkpagename'            => array( '1', 'ឈ្មោះទំព័រពិភាក្សា', 'TALKPAGENAME' ),
-       'msg'                     => array( '0', 'សារ:', 'MSG:' ),
-       'msgnw'                   => array( '0', 'សារមិនមែនជាកូដវិគី:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'រូបភាពតូច', 'រូបតូច', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'រូបភាពតូច=$1', 'រូបតូច=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'ស្តាំ', 'ខាងស្តាំ', 'right' ),
-       'img_left'                => array( '1', 'ធ្វេង', 'ខាងធ្វេង', 'left' ),
-       'img_none'                => array( '1', 'ទទេ', 'គ្មាន', 'none' ),
-       'img_width'               => array( '1', '$1ភីកសែល', '$1ភស', '$1px' ),
-       'img_center'              => array( '1', 'កណ្តាល', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'ស៊ុម', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'គ្មានស៊ុម', 'frameless' ),
-       'img_page'                => array( '1', 'ទំព័រ=$1', 'ទំព័រ$1', 'page=$1', 'page $1' ),
-       'img_top'                 => array( '1', 'ផ្នែកលើ', 'ផ្នែកខាងលើ', 'top' ),
-       'img_text_top'            => array( '1', 'ឃ្លានៅផ្នែកខាងលើ', 'ឃ្លាផ្នែកខាងលើ', 'text-top' ),
-       'img_middle'              => array( '1', 'ផ្នែកកណ្តាល', 'middle' ),
-       'img_bottom'              => array( '1', 'បាត', 'ផ្នែកបាត', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'ឃ្លានៅផ្នែកបាត', 'ឃ្លាផ្នែកបាត', 'text-bottom' ),
-       'img_link'                => array( '1', 'តំនភ្ជាប់=$1', 'តំណភ្ជាប់=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'ឈ្មោះវិបសាយ', 'ឈ្មោះគេហទំព័រ', 'SITENAME' ),
-       'ns'                      => array( '0', 'លឈ:', 'NS:' ),
-       'server'                  => array( '0', 'ម៉ាស៊ីនបម្រើសេវា', 'SERVER' ),
-       'servername'              => array( '0', 'ឈ្មោះម៉ាស៊ីនបម្រើសេវា', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ផ្លូវស្រ្គីប', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'វេយ្យាករណ៍:', 'GRAMMAR:' ),
-       'currentweek'             => array( '1', 'សប្ដាហ៍នេះ', 'CURRENTWEEK' ),
-       'plural'                  => array( '0', 'ពហុវចនៈ:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'URLពេញ:', 'FULLURL:' ),
-       'displaytitle'            => array( '1', 'បង្ហាញចំណងជើង', 'បង្ហាញចំនងជើង', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'រ', 'R' ),
-       'newsectionlink'          => array( '1', '__តំនភ្ជាប់ផ្នែកថ្មី__', '__តំណភ្ជាប់ផ្នែកថ្មី__', '__NEWSECTIONLINK__' ),
-       'language'                => array( '0', '#ភាសា:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'កូដភាសា', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'numberofadmins'          => array( '1', 'ចំនួនអ្នកអភិបាល', 'ចំនួនអ្នកថែទាំប្រព័ន្ធ', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'ពិសេស', 'special' ),
-       'filepath'                => array( '0', 'ផ្លូវនៃឯកសារ:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'ប្លាក', 'tag' ),
-       'hiddencat'               => array( '1', '__ចំណាត់ថ្នាក់ក្រុមមិនបានបង្ហាញ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'ចំនួនទំព័រក្នុងចំនាត់ថ្នាក់ក្រុម', 'ចំនួនទំព័រក្នុងចំណាត់ថ្នាក់ក្រុម', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'ទំហំទំព័រ', 'PAGESIZE' ),
-       'index'                   => array( '1', '__លិបិក្រម__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__មិនមានលិបិក្រម__', '__NOINDEX__' ),
-       'staticredirect'          => array( '1', '__ស្ថិតិទំព័របញ្ជូនបន្ត__', '__STATICREDIRECT__' ),
+       'redirect'                  => array( '0', '#បញ្ជូនបន្ត', '#ប្ដូរទីតាំងទៅ', '#ប្តូរទីតាំងទៅ', '#ប្ដូរទីតាំង', '#ប្តូរទីតាំង', '#ប្ដូរចំណងជើង', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__លាក់មាតិកា__', '__លាក់បញ្ជីអត្ថបទ__', '__គ្មានមាតិកា__', '__គ្មានបញ្ជីអត្ថបទ__', '__កុំបង្ហាញមាតិកា__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__លាក់វិចិត្រសាល__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__បង្ខំមាតិកា__', '__បង្ខំបញ្ជីអត្ថបទ__', '__បង្ខំអោយបង្ហាញមាតិកា__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__មាតិកា__', '__បញ្ជីអត្ថបទ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__ផ្នែកមិនត្រូវកែប្រែ__', '__មិនមានផ្នែកកែប្រែ__', '__លាក់ផ្នែកកែប្រែ__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__លាក់បឋមកថា__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ខែនេះ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'ឈ្មោះខែនេះ', 'CURRENTMONTHNAME' ),
+       'currentday'                => array( '1', 'ថ្ងៃនេះ', 'CURRENTDAY' ),
+       'currentdayname'            => array( '1', 'ឈ្មោះថ្ងៃនេះ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ឆ្នាំនេះ', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ពេលនេះ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ម៉ោងនេះ', 'ម៉ោងឥឡូវ', 'CURRENTHOUR' ),
+       'localyear'                 => array( '1', 'LOCALDAYNAME', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ពេលវេលាក្នុងតំបន់', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ម៉ោងតំបន់', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ចំនួនទំព័រ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ចំនួនអត្ថបទ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ចំនួនឯកសារ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ចំនួនអ្នកប្រើប្រាស់', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'ចំនួនកំណែប្រែ', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'ឈ្មោះទំព័រ', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'លំហឈ្មោះ', 'NAMESPACE' ),
+       'talkspace'                 => array( '1', 'លំហឈ្មោះទំព័រពិភាក្សា', 'TALKSPACE' ),
+       'fullpagename'              => array( '1', 'ឈ្មោះទំព័រពេញ', 'FULLPAGENAME' ),
+       'subpagename'               => array( '1', 'ឈ្មោះទំព័ររង', 'SUBPAGENAME' ),
+       'talkpagename'              => array( '1', 'ឈ្មោះទំព័រពិភាក្សា', 'TALKPAGENAME' ),
+       'msg'                       => array( '0', 'សារ:', 'MSG:' ),
+       'msgnw'                     => array( '0', 'សារមិនមែនជាកូដវិគី:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'រូបភាពតូច', 'រូបតូច', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'រូបភាពតូច=$1', 'រូបតូច=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'ស្តាំ', 'ខាងស្តាំ', 'right' ),
+       'img_left'                  => array( '1', 'ធ្វេង', 'ខាងធ្វេង', 'left' ),
+       'img_none'                  => array( '1', 'ទទេ', 'គ្មាន', 'none' ),
+       'img_width'                 => array( '1', '$1ភីកសែល', '$1ភស', '$1px' ),
+       'img_center'                => array( '1', 'កណ្តាល', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'ស៊ុម', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'គ្មានស៊ុម', 'frameless' ),
+       'img_page'                  => array( '1', 'ទំព័រ=$1', 'ទំព័រ$1', 'page=$1', 'page $1' ),
+       'img_top'                   => array( '1', 'ផ្នែកលើ', 'ផ្នែកខាងលើ', 'top' ),
+       'img_text_top'              => array( '1', 'ឃ្លានៅផ្នែកខាងលើ', 'ឃ្លាផ្នែកខាងលើ', 'text-top' ),
+       'img_middle'                => array( '1', 'ផ្នែកកណ្តាល', 'middle' ),
+       'img_bottom'                => array( '1', 'បាត', 'ផ្នែកបាត', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'ឃ្លានៅផ្នែកបាត', 'ឃ្លាផ្នែកបាត', 'text-bottom' ),
+       'img_link'                  => array( '1', 'តំនភ្ជាប់=$1', 'តំណភ្ជាប់=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'ឈ្មោះវិបសាយ', 'ឈ្មោះគេហទំព័រ', 'SITENAME' ),
+       'ns'                        => array( '0', 'លឈ:', 'NS:' ),
+       'server'                    => array( '0', 'ម៉ាស៊ីនបម្រើសេវា', 'SERVER' ),
+       'servername'                => array( '0', 'ឈ្មោះម៉ាស៊ីនបម្រើសេវា', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ផ្លូវស្រ្គីប', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'វេយ្យាករណ៍:', 'GRAMMAR:' ),
+       'currentweek'               => array( '1', 'សប្ដាហ៍នេះ', 'CURRENTWEEK' ),
+       'plural'                    => array( '0', 'ពហុវចនៈ:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'URLពេញ:', 'FULLURL:' ),
+       'displaytitle'              => array( '1', 'បង្ហាញចំណងជើង', 'បង្ហាញចំនងជើង', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'រ', 'R' ),
+       'newsectionlink'            => array( '1', '__តំនភ្ជាប់ផ្នែកថ្មី__', '__តំណភ្ជាប់ផ្នែកថ្មី__', '__NEWSECTIONLINK__' ),
+       'language'                  => array( '0', '#ភាសា:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'កូដភាសា', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'numberofadmins'            => array( '1', 'ចំនួនអ្នកអភិបាល', 'ចំនួនអ្នកថែទាំប្រព័ន្ធ', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'ពិសេស', 'special' ),
+       'filepath'                  => array( '0', 'ផ្លូវនៃឯកសារ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'ប្លាក', 'tag' ),
+       'hiddencat'                 => array( '1', '__ចំណាត់ថ្នាក់ក្រុមមិនបានបង្ហាញ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'ចំនួនទំព័រក្នុងចំនាត់ថ្នាក់ក្រុម', 'ចំនួនទំព័រក្នុងចំណាត់ថ្នាក់ក្រុម', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'ទំហំទំព័រ', 'PAGESIZE' ),
+       'index'                     => array( '1', '__លិបិក្រម__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__មិនមានលិបិក្រម__', '__NOINDEX__' ),
+       'staticredirect'            => array( '1', '__ស្ថិតិទំព័របញ្ជូនបន្ត__', '__STATICREDIRECT__' ),
 );
 
 $messages = array(
@@ -269,7 +269,7 @@ $messages = array(
 'tog-hidepatrolled' => 'លាក់​កំណែប្រែ​ដែល​បាន​ល្បាត នៅ​ក្នុង​បំលាស់ប្ដូរ​ថ្មីៗ',
 'tog-newpageshidepatrolled' => 'លាក់​ទំព័រ​ដែល​បាន​ល្បាត ពី​បញ្ជី​ទំព័រ​ថ្មី',
 'tog-extendwatchlist' => 'ពង្រីក​បញ្ជីតាមដាន​ដើម្បី​បង្ហាញ​គ្រប់​បំលាស់ប្ដូរ មិន​មែន​ត្រឹមតែ​បំលាស់ប្ដូរថ្មី​ៗ​នោះ​ទេ',
-'tog-usenewrc' => 'បង្ហាញបំលាស់ប្ដូរ​ថ្មីៗតាមរបៀបទំនើប (តម្រូវអោយ​មាន JavaScript)',
+'tog-usenewrc' => ' បំលាស់ប្ដូរជាក្រុមតាមទំព័រ ក្នុងបំលាស់ប្តូរថ្មីៗនិងបញ្ជីតាមដាន (តម្រូវឲ្យមាន JavaScript)',
 'tog-numberheadings' => 'បង្ហាញលេខ​ចំណងជើងរង​ដោយស្វ័យប្រវត្តិ',
 'tog-showtoolbar' => 'បង្ហាញ​របារឧបករណ៍កែប្រែ (តម្រូវអោយមាន JavaScript)',
 'tog-editondblclick' => 'កែប្រែទំព័រដោយចុចពីរដង​ជាប់គ្នា (តម្រូវអោយមាន JavaScript)',
@@ -277,17 +277,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'អនុញ្ញាត​កែប្រែ​​ផ្នែកណាមួយ ដោយ​ចុចស្តាំកណ្តុរ​លើ​ចំណងជើង​របស់វា (តម្រូវអោយមាន JavaScript)',
 'tog-showtoc' => 'បង្ហាញ​តារាងមាតិកា (ចំពោះទំព័រ​ដែលមាន​ចំណងជើងរង​លើសពី៣)',
 'tog-rememberpassword' => 'ចងចាំ​ការកត់ឈ្មោះចូលរបស់ខ្ញុំ​លើកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយ៉ាងយូរ$1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
-'tog-watchcreations' => 'បន្ថែម​ទំព័រ​ដែលខ្ញុំបង្កើត​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ',
-'tog-watchdefault' => 'បន្ថែម​ទំព័រ​ដែលខ្ញុំកែប្រែ​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ',
-'tog-watchmoves' => 'បន្ថែម​ទំព័រ​ដែលខ្ញុំប្តូរទីតាំង​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ',
-'tog-watchdeletion' => 'បន្ថែម​ទំព័រ​ដែលខ្ញុំលុបចោល​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ',
+'tog-watchcreations' => 'á\9e\94á\9e\93á\9f\92á\9e\90á\9f\82á\9e\98â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fâ\80\8bá\9e\91á\9f\85â\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86',
+'tog-watchdefault' => 'បន្ថែម​ទំព័រទាំងឡាយ​ដែលខ្ញុំកែប្រែ​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ',
+'tog-watchmoves' => 'á\9e\94á\9e\93á\9f\92á\9e\90á\9f\82á\9e\98â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\91á\9e¸á\9e\8fá\9e¶á\9f\86á\9e\84â\80\8bá\9e\91á\9f\85â\80\8bá\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86',
+'tog-watchdeletion' => 'បន្ថែម​ទំព័រទាំងឡាយ​ដែលខ្ញុំលុបចោល​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ',
 'tog-minordefault' => "ចំណាំ​គ្រប់កំណែប្រែ​របស់ខ្ញុំ​ថាជា​'កំណែប្រែតិចតួច'",
 'tog-previewontop' => 'បង្ហាញ​ការមើលមុន​ពីលើ​ប្រអប់​កែប្រែ',
 'tog-previewonfirst' => 'បង្ហាញ​ការមើលមុន​ចំពោះ​កំណែប្រែ​ដំបូង',
 'tog-nocache' => 'មិនប្រើសតិភ្ជាប់​នៃ​ទំព័រ',
 'tog-enotifwatchlistpages' => 'ផ្ញើអ៊ីមែល​មកខ្ញុំ​កាលបើ​មានបំលាស់ប្ដូរនៃទំព័រ​ណាមួយដែលមានក្នុងបញ្ជីតាមដានរបស់ខ្ញុំ',
 'tog-enotifusertalkpages' => 'ផ្ញើអ៊ីមែល​មកខ្ញុំ​កាលបើ​មានបំលាស់ប្ដូរ​នៅ​ក្នុងទំព័រពិភាក្សា​របស់ខ្ញុំ',
-'tog-enotifminoredits' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\95á\9e\84á\9e\8aá\9f\82á\9e\9aâ\80\8bá\9e\85á\9f\86á\9e\96á\9f\84á\9f\87â\80\8bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\8fá\9e·á\9e\85á\9e\8fá\9e½á\9e\85​',
+'tog-enotifminoredits' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bâ\80\8bá\9e\98á\9e\80á\9e\81á\9f\92á\9e\89á\9e»á\9f\86á\9e\96á\9f\81á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\8fá\9e·á\9e\85á\9e\8fá\9e½á\9e\85â\80\8bá\9e\9bá\9e¾á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e¬á\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9aá\9e\95á\9e\84á\9e\8aá\9f\82á\9e\9a​',
 'tog-enotifrevealaddr' => 'បង្ហាញ​អាសយដ្ឋានអ៊ីមែល​របស់ខ្ញុំ​ក្នុង​​មែល​ក្រើនរំលឹក​នានា',
 'tog-shownumberswatching' => 'បង្ហាញ​ចំនួនអ្នកប្រើប្រាស់​ដែលតាមដាន​ទំព័រនេះ',
 'tog-oldsig' => 'ហត្ថលេខាមានហើយ៖',
@@ -528,6 +528,10 @@ $1',
 'youhavenewmessages' => 'អ្នកមាន $1 ($2)។',
 'newmessageslink' => 'សារថ្មីៗ',
 'newmessagesdifflink' => 'បំលាស់ប្ដូរចុងក្រោយ',
+'youhavenewmessagesfromusers' => 'អ្នកមាន $1 ទទួលបានពី {{PLURAL:$3|អ្នកប្រើប្រាស់ម្នាក់|អុ្នកប្រើប្រាស់ចំនួន $3 នាក់}} ($2)។',
+'youhavenewmessagesmanyusers' => 'អ្នកមាន $1 ទទួលបានពីអ្នកប្រើប្រាស់ជាច្រើន ($2)។',
+'newmessageslinkplural' => '{{PLURAL:$1|សារថ្មីមួយ|សារថ្មី}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}ចុងក្រោយ',
 'youhavenewmessagesmulti' => 'អ្នកមានសារថ្មីៗនៅ $1',
 'editsection' => 'កែប្រែ',
 'editold' => 'កែប្រែ',
@@ -612,8 +616,8 @@ $1',
 'cannotdelete-title' => 'មិនអាចលុបទំព័រ "$1"',
 'badtitle' => 'ចំណងជើង​មិនល្អ',
 'badtitletext' => 'ចំណងជើងទំព័រដែលបានស្នើ គ្មានសុពលភាព, ទទេ, ឬ ចំណងជើងតំណភ្ជាប់អន្តរភាសាឬអន្តរវិគី មិនត្រឹមត្រូវ ។ ប្រហែលជាមានតួអក្សរមួយឬច្រើន ដែលជាតួអក្សរហាមប្រើ​ក្នុង​ចំណងជើង។',
-'perfcached' => 'ទិន្នន័យទាំងនេះត្រូវបានដាក់ទៅសតិភ្ជាប់និងប្រហែលជាមិនទាន់សម័យ ។ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'ទិន្នន័យខាងក្រោមនេះត្រូវបានដាក់ក្នុងសតិភ្ជាប់ និង បានត្រូវបន្ទាន់សម័យចុងក្រោយនៅ $1។ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'ទិន្នន័យទាំងនេះត្រូវបានដាក់ទៅសតិភ្ជាប់និងប្រហែលជាមិនទាន់សម័យ ។ ជាអតិបរមា {{PLURAL:$1|លទ្ធផលមួយ|លទ្ធផលចំនួន $1}} អាចប្រើបាននៅក្នុងសតិភ្ជាប់។',
+'perfcachedts' => 'ទិន្នន័យខាងក្រោមនេះត្រូវបានដាក់ក្នុងសតិភ្ជាប់ និង បានត្រូវបន្ទាន់សម័យចុងក្រោយនៅ $1។ ជាអតិបរមា {{PLURAL:$4|លទ្ធផលមួយ|លទ្ធផលចំនួន $4}} អាចប្រើបាននៅក្នុងសតិភ្ជាប់។',
 'querypage-no-updates' => 'ការបន្ទាន់សម័យសម្រាប់ទំព័រនេះគឺមិនអាចធ្វើទៅរួចទេនាពេលឥឡូវទេ។
 
 ទិន្នន័យនៅទីនេះនឹងមិនត្រូវផ្លាស់ប្ដូរថ្មីនាពេលបច្ចុប្បន្នទេ។',
@@ -640,6 +644,10 @@ $2',
 'ns-specialprotected' => 'ទំព័រពិសេសៗមិនអាចកែប្រែបានទេ។',
 'titleprotected' => "ចំណងជើងនេះត្រូវបានការពារមិនឱ្យបង្កើត​ដោយ [[User:$1|$1]]។
 ហេតុផលលើកឡើងគឺ ''$2''។",
+'filereadonlyerror' => 'មិនអាចកែប្រែឯកសារ "$1" បានទេពីព្រោះថតឯកសារ "$2" ស្ថិតក្នុងម៉ូដសំរាប់តែអានប៉ុណ្ណោះ។
+
+អភិបាលដែលបានចាក់សោរវាបានផ្ដល់សេចក្ដីពន្យល់បែបនេះ៖ "$3"។',
+'exception-nologin-text' => 'ទំព័រឬសកម្មភាពនេះតំរូវអោយអ្នកធ្វើការកត់ឈ្មោះចូលទៅក្នុងវិគីនេះ។',
 
 # Virus scanner
 'virus-badscanner' => "ការ​កំណត់​រចនា​សម្ព័ន្ធ​មិន​ល្អ​៖ កម្មវិធី​ស្កេន​មេរោគមិន​ស្គាល់​៖ ''$1''",
@@ -662,6 +670,7 @@ $2',
 'remembermypassword' => 'ចងចាំកំណត់ឈ្មោះចូលរបស់ខ្ញុំក្នុងកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយូរបំផុត $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
 'securelogin-stick-https' => 'នៅភ្ជាប់ទៅ HTTPS ដដែលបន្ទាប់ពីចុះឈ្មោះចូលហើយក៏ដោយ',
 'yourdomainname' => 'ដូម៉ែនរបស់អ្នក៖',
+'password-change-forbidden' => 'អ្នកមិនអាចផ្លាស់ប្ដូរពាក្យសំងាត់ក្នុងវិគីនេះទេ។',
 'externaldberror' => 'មាន​​បញ្ហាក្នុងការ​បញ្ជាក់​ផ្ទៀង​ផ្ទាត់​​មូលដ្ឋាន​ទិន្នន័យ​ ឬ​អ្នក​មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​បន្ទាន់​សម័យ​គណនី​ខាង​ក្រៅ​របស់​អ្នក​។​
 ​',
 'login' => 'កត់ឈ្មោះចូល',
@@ -750,6 +759,7 @@ $2',
 
 សូមបញ្ចូល​អាសយដ្ឋានមួយ​ដែលមាន​ទម្រង់​ត្រឹមត្រូវ ឬមួយក៏ទុកវាលនោះឱ្យនៅទំនេរ​​។',
 'cannotchangeemail' => 'អាសយដ្ឋានអ៊ីមែលរបស់គណនីមិនអាចប្ដូរបានទេនៅលើវិគីនេះ។',
+'emaildisabled' => 'វិបសៃថ៍នេះមិនអាចផ្ញើអ៊ីមែលបានទេ។',
 'accountcreated' => 'គណនីរបស់លោកអ្នកត្រូវបានបង្កើតហើយ',
 'accountcreatedtext' => 'គណនីឈ្មោះ $1 ត្រូវបានបង្កើតហើយ។',
 'createaccount-title' => 'ការបង្កើតគណនីសម្រាប់{{SITENAME}}',
@@ -802,6 +812,25 @@ $2',
 'passwordreset-capture-help' => 'ប្រសិនបើអ្នកគូសធីកប្រអប់នេះ អ៊ីមែល (ដែលមានពាក្យសំងាត់បណ្ដោះអាសន្ន) មិនត្រូវបានបង្ហាញដូចគ្នានឹងអ៊ីមែលដែលនឹងត្រូវផ្ញើទៅទៅកាន់អ្នកប្រើប្រាស់ដែរ។',
 'passwordreset-email' => 'អាសយដ្ឋានអ៊ីមែល៖',
 'passwordreset-emailtitle' => 'ព័ត៌មានលំអិតពីគណនីនៅលើ {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំសារក្រើនរំលឹកពីព័ត៌មានពិស្ដារ
+អំពីគណនីរបស់អ្នកសំរាប់ {{SITENAME}} ($4)។ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះ
+មានជាប់ទាក់ទិននឹងអាស័យដ្ឋានអ៊ីមែលនេះ៖
+
+$2
+
+{{PLURAL:$3|ពាក្យសំងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសំងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
+យកល្អអ្នកគួរតែកត់ឈ្មោះរួចជ្រើសរើសពាក្យសំងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ 
+ឬប្រសិនបើអ្នកនឹកឃើញពាក្យសំងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
+កុំខ្វល់ជាមួយសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសំងាត់ចាស់របស់អ្នកទៅបានហើយ។',
+'passwordreset-emailtext-user' => 'អ្នកប្រើប្រាស់ $1 នៅក្នុង {{SITENAME}} បានស្នើសុំសារក្រើនរំលឹកអំពីព័ត៌មានពិស្ដាររបស់គណនីរបស់អ្នកនៅក្នុង {{SITENAME}} ($4)។
+ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះមានជាប់ទាក់ទិននឹងអាស័យដ្ឋានអ៊ីមែលនេះ៖
+
+$2
+
+{{PLURAL:$3|ពាក្យសំងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសំងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
+យកល្អអ្នកគួរតែកត់ឈ្មោះរួចជ្រើសរើសពាក្យសំងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ 
+ឬប្រសិនបើអ្នកនឹកឃើញពាក្យសំងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
+កុំខ្វល់ជាមួយសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសំងាត់ចាស់របស់អ្នកទៅបានហើយ។',
 'passwordreset-emailelement' => 'ឈ្មោះអ្នកប្រើប្រាស់៖ $1
 លេខសម្ងាត់បណ្ដោះអាសន្ន៖ $2',
 'passwordreset-emailsent' => 'អីុមែលរំលឹកមួយបានផ្ញើទៅហើយ។',
@@ -930,12 +959,12 @@ $2',
 'userpage-userdoesnotexist-view' => 'គណនីអ្នកប្រើប្រាស់ដែលមានឈ្មោះ "$1"មិនទាន់បានចុះឈ្មោះទេ។',
 'blocked-notice-logextract' => 'អ្នកប្រើប្រាស់នេះត្រូវបានហាមឃាត់ហើយនាពេលនេះ។
 កំណត់ត្រាស្ដីពីការហាមឃាត់ចុងក្រោយមានបង្ហាញដូចខាងក្រោមនេះ៖',
-'clearyourcache' => "!'''សម្គាល់:''' បន្ទាប់ពីបានរក្សាទុករួចហើយ លោកអ្នកគួរតែសំអាត browser's cache របស់លោកអ្នកដើម្បីមើលការផ្លាស់ប្តូរ។ ខាងក្រោមនេះជាវិធីសំអាត browser's cache ចំពោះកម្មវិធីរុករក(Browser)មួយចំនួន។
-* ''' Firefox / Safari:''' សង្កត់ [Shift] ឱ្យជាប់រួចចុចប៊ូតុង ''Reload'' ឬក៏ចុច  ''Ctrl-F5'' ឬ ''Ctrl-R'' (ចំពោះApple Mac វិញ​ចុច ''Command-R'')
-* '''Google Chrome:''' ចុច ''Ctrl-Shift-R'' (''Command-Shift-R'' សំរាប់ Mac)
+'clearyourcache' => "'''សម្គាល់:''' បន្ទាប់ពីបានរក្សាទុករួចហើយ លោកអ្នកគួរតែសំអាត browser's cache របស់លោកអ្នកដើម្បីមើលការផ្លាស់ប្តូរ។ ខាងក្រោមនេះជាវិធីសំអាត browser's cache ចំពោះកម្មវិធីរុករក(Browser)មួយចំនួន។
+* ''' Firefox / Safari:''' សង្កត់ [Shift] ឱ្យជាប់រួចចុចប៊ូតុង ''Reload'' ឬក៏ចុច  ''Ctrl-F5'' ឬ ''Ctrl-R'' ( ''⌘-R'' សំរាប់ Mac)
+* '''Google Chrome:''' ចុច ''Ctrl-Shift-R'' (''-Shift-R'' សំរាប់ Mac)
 * '''IE(Internet Explorer):''' សង្កត់ [Ctrl] ឱ្យជាប់ រួចចុច ''Refresh''ប៊ូតុង ឬក៏ចុច ''Ctrl-F5''​។
 * '''Konqueror:''' ចុចប៊ូតុង  ''Reload'' ឬក៏ចុច ''F5''
-* '''Opera:''' á\9e\9fá\9e¼á\9e\98á\9e\85á\9e»á\9e\85  ''[Tools]â\86\92[Preferences]''â\80\8bá\9f\94",
+* '''Opera:''' á\9e\9fá\9e¼á\9e\98á\9e\9fá\9f\86á\9e¢á\9e¶á\9e\8fcacheá\9e\93á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84  ''[Tools]â\86\92[Preferences]''â\80\8b",
 'usercssyoucanpreview' => "'''គន្លឹះ ៖ ''' សូមប្រើប្រាស់ប៊ូតុង\"{{int:showpreview}}\"ដើម្បី​ធ្វើតេស្ត​សន្លឹក CSS ថ្មីរបស់អ្នក​មុននឹង​រក្សាទុកវា ។",
 'userjsyoucanpreview' => "'''គន្លឹះ ៖ ''' សូមប្រើប្រាស់​ប៊ូតុង \"{{int:showpreview}}\" ដើម្បី​ធ្វើតេស្ត​សន្លឹក JS ថ្មីរបស់អ្នក​មុននឹង​រក្សាទុកវា ។",
 'usercsspreview' => "'''កុំភ្លេចថា​អ្នកគ្រាន់តែ​កំពុងមើលជាមុនសន្លឹក CSS របស់អ្នក។
@@ -949,6 +978,7 @@ $2',
 'updated' => '(បានបន្ទាន់សម័យ)',
 'note' => "'''ចំណាំ៖'''",
 'previewnote' => "'''សូមចាំថានេះគ្រាន់តែជា​ការបង្ហាញការមើលជាមុនប៉ុណ្ណោះ។ បំលាស់ប្ដូរ​របស់អ្នកមិនទាន់បាន​រក្សាទុកទេ!'''",
+'continue-editing' => 'បន្តធ្វើការកែប្រែ',
 'previewconflict' => 'ការមើលមុននេះយោងតាមអត្ថបទក្នុងប្រអប់កែប្រែខាងលើ។ ទំព័រអត្ថបទនឹងបង្ហាញចេញបែបនេះប្រសិនបើអ្នកជ្រើសរើសរក្សាទុក។',
 'session_fail_preview' => "'''សូមអភ័យទោស! យើងមិនអាចរក្សាទុកការកែប្រែរបស់អ្នកបានទេ ដោយសារបាត់ទិន្នន័យវេនការងារ។
 
@@ -963,6 +993,7 @@ $2',
 
 បើនៅតែមិនបានទេ សូមព្យាយាម[[Special:UserLogout|កត់ឈ្មោះចេញ]] រួចកត់ឈ្មោះចូលឡើងវិញ។'''",
 'editing' => 'កំពុងកែប្រែ​ $1',
+'creating' => 'កំពុងបង្កើត $1',
 'editingsection' => "កំពុងកែប្រែ'''$1'''(ផ្នែក)",
 'editingcomment' => 'កែប្រែ $1 (ផ្នែកថ្មី)',
 'editconflict' => 'ភាពឆ្គងនៃកំណែប្រែ៖ $1',
@@ -1031,6 +1062,7 @@ $2',
 'edit-already-exists' => 'មិនអាចបង្កើតទំព័រថ្មីមួយទេ។
 
 ទំព័រនេះមានរួចហើយ។',
+'defaultmessagetext' => 'អត្ថបទសារតាមលំនាំដើម',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ប្រយ័ត្ន៖''' ទំព័រនេះមានប្រើអនុគមន៍ញែកច្រើនពេកហើយ។
@@ -1111,6 +1143,13 @@ $2',
 'rev-deleted-unhide-diff' => "កំណែ​ប្រែ​មួយ​នៃភាព​ខុស​គ្នា​​នេះ​ត្រូវ​បាន'''​លុប'''​។
 ប្រហែល​ជា​មាន​ព័ត៌មាន​លម្អិត​នៅ​ក្នុង​[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} កំណត់​ហេតុ​នៃ​ការ​លុប​]។
 អ្នក​នៅ​តែ​អាច​[$1 មើលភាព​ខុស​គ្នា​​នេះ​]ប្រសិន​បើ​អ្នក​ចង់​។",
+'rev-suppressed-unhide-diff' => "កំណែ​ប្រែ​នៃ​ទំព័រ​នេះ​ត្រូវ​បាន'''ហាម​ឃាត់​'''​។
+ប្រហែល​ជា​មាន​ព័ត៌មាន​លម្អិត​នៅ​ក្នុង​[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} កំណត់​ហេតុ​នៃ​ការហាម​ឃាត់​​]។
+អ្នក​នៅ​តែ​អាច​[$1 មើល​កំណែ​នេះ​]ប្រសិន​បើ​អ្នក​ចង់​។",
+'rev-deleted-diff-view' => "កំណែ​ប្រែ​នៃ​ទំព័រ​នេះ​ត្រូវ​បាន'''​លុប'''​។ 
+អ្នក​អាច​មើល​កំណែប្រែ​​នេះ​បាន​។ ប្រហែល​ជា​មាន​ព័ត៌មាន​លម្អិត​នៅ​ក្នុង​[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} កំណត់​ហេតុ​នៃ​ការ​លុប​]។",
+'rev-suppressed-diff-view' => "កំណែ​ប្រែ​នៃ​ទំព័រ​នេះ​ត្រូវ​បាន'''ហាម​ឃាត់​'''​។
+អ្នក​​អាច​មើល​វា​បាន​។ ប្រហែល​ជា​មាន​ព័ត៌មាន​លម្អិត​នៅ​ក្នុង​[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} កំណត់​ហេតុ​នៃ​ការហាម​ឃាត់​​]។",
 'rev-delundel' => 'បង្ហាញ/លាក់',
 'rev-showdeleted' => 'បង្ហាញ',
 'revisiondelete' => 'លុបចេញ / លែងលុបចេញ កំណែនានា',
@@ -1173,7 +1212,7 @@ $1",
 'suppressionlog' => 'កំណត់​ហេតុ​នៃ​ការ​ហាម​ឃាត់​',
 'suppressionlogtext' => 'ខាងក្រោមនេះជាបញ្ជីការលុបចោលនិងការហាមឃាត់ទាក់ទិននឹងខ្លឹមសារដែលអ្នកអភិបាលបានលាក់។
 
-សូមមើលបំរាមនិងការហាមឃាត់ដែលនៅជាធរមាននាពេលបច្ចុប្បន្ននៅក្នុង[[Special:BlockList|បញ្ជីនៃការហាមឃាត់ IP]]។',
+សូមមើលបំរាមនិងការហាមឃាត់ដែលនៅជាធរមាននាពេលបច្ចុប្បន្ននៅក្នុង[[Special:BlockList|បញ្ជីនៃការហាមឃាត់]]។',
 
 # History merging
 'mergehistory' => 'ច្របាច់ប្រវត្តិទាំងឡាយរបស់ទំព័របញ្ចូលគ្នា',
@@ -1205,13 +1244,20 @@ $1",
 'mergelogpagetext' => 'ខាងក្រោមគឺជាតារាងនៃការច្របាច់បញ្ចូលគ្នាថ្មីៗបំផុតរបស់ប្រវត្តិនៃទំព័រមួយទៅក្នុងប្រវត្តិនៃទំព័រមួយទៀត។',
 
 # Diffs
-'history-title' => 'ប្រវត្តិកំណែប្រែនានានៃ "$1"',
+'history-title' => 'ប្រវត្តិកំណែប្រែរបស់ "$1"',
+'difference-title' => 'ភាពខុសគ្នារវាងកំណែនានារបស់ "$1"',
+'difference-title-multipage' => 'ភាពខុសគ្នារបស់ទំព័រ "$1" និង "$2"',
 'difference-multipage' => '(ភាពខុសគ្នារវាងទំព័រនានា)',
 'lineno' => 'បន្ទាត់ទី$1៖',
 'compareselectedversions' => 'ប្រៀបធៀប​កំណែដែលបាន​ជ្រើសយក',
 'showhideselectedversions' => 'បង្ហាញ​/លាក់​កំណែប្រែ​ដែលបាន​ជ្រើសយក',
 'editundo' => 'មិនធ្វើវិញ',
 'diff-multi' => '({{PLURAL:$1|កំណែប្រែកម្រិតបង្គួរមួយ|កំណែប្រែកម្រិតបង្គួរចំនួន $1}}មិនត្រូវបានបង្ហាញ)',
+'diff-multi-manyusers' => '({{PLURAL:$1|កំណែប្រែកម្រិតបង្គួរមួយ|កំណែប្រែកម្រិតបង្គួរចំនួន $1}}មិនត្រូវបានបង្ហាញ)',
+'difference-missing-revision' => ' {{PLURAL:$2|រកមិនឃើញ|រកមិនឃើញ}}{{PLURAL:$2|កំណែមួយ|កំណែចំនួន $2}} របស់ភាពខុសគ្នានេះ ($1) ទេ។
+
+ជាធម្មតានេះបណ្ដាលមកពីការតាមទៅកាន់តំនភ្ជាប់ភាពខុសគ្នារបស់ទំព័រដែលត្រូវបានលុបចោល។
+ព័ត៌មានលំអិតអាចរកបាននៅក្នុង [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} កំណត់ហេតុនៃការលុបចោល]។',
 
 # Search results
 'searchresults' => 'លទ្ធផលស្វែងរក',
@@ -1302,6 +1348,7 @@ $1",
 'prefs-beta' => 'មុខងារពិសេសថ្មីៗរបស់ស៊េរីបេតា',
 'prefs-datetime' => 'កាលបរិច្ឆេទនិងល្វែងម៉ោង',
 'prefs-labs' => 'មុខងារពិសេសថ្មីៗដែលស្ថិតក្រោមការពិសោធន៍នៅឡើយ',
+'prefs-user-pages' => 'ទំព័រអ្នកប្រើប្រាស់',
 'prefs-personal' => 'ប្រវត្តិរូប',
 'prefs-rc' => 'បំលាស់ប្ដូរថ្មីៗ',
 'prefs-watchlist' => 'បញ្ជីតាមដាន',
@@ -1550,6 +1597,7 @@ $1",
 'action-userrights' => 'កែប្រែសិទ្ធិរបស់អ្នកប្រើប្រាស់ទាំងអស់',
 'action-userrights-interwiki' => 'កែប្រែសិទ្ធិនានារបស់អ្នកប្រើប្រាស់នៅលើវិគីដទៃ',
 'action-siteadmin' => 'ចាក់សោឬដោះសោមូលដ្ឋានទិន្នន័យ',
+'action-sendemail' => 'ផ្ញើអ៊ីមែល',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}',
@@ -1582,9 +1630,11 @@ $1",
 'rc_categories' => 'កម្រិតទីតាំងចំណាត់ថ្នាក់ក្រុម(ខណ្ឌដោយសញ្ញា "|")',
 'rc_categories_any' => 'មួយណាក៏បាន',
 'rc-change-size' => '$1',
+'rc-change-size-new' => '$1 {{PLURAL:$1|បៃ|បៃ}} បន្ទាប់ពីបំលាស់ប្ដូរ',
 'newsectionsummary' => '/* $1 */ ផ្នែកថ្មី',
 'rc-enhanced-expand' => 'បង្ហាញព័ត៌មានលំអិត (តម្រូវអោយមាន JavaScript)',
 'rc-enhanced-hide' => 'លាក់ព័ត៌មានលំអិត',
+'rc-old-title' => 'បង្កើតឡើងដំបូងដោយ "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'បន្លាស់ប្ដូរពាក់ព័ន្ធ',
@@ -1615,9 +1665,9 @@ $1",
 
 
 ដើម្បីដាក់រូបភាពទៅក្នុងទំព័រ សូមប្រើប្រាស់តំណភ្ជាប់ក្នុងទម្រង់ដូចខាងក្រោម៖
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ឈ្មោះឯកសារ.jpg]]</nowiki></tt>'''ដើម្បីប្រើប្រាស់ទម្រង់ពេញលេញនៃឯកសារ
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ឈ្មោះឯកសារ.png|200px|thumb|left|ឃ្លាពិពណ៌នា]]</nowiki></tt>''' ដោយប្រើប្រាស់ទំហំ​២០០ភីកសែលក្នុងប្រអប់នៅ​គេមខាងធ្វេង​ជាមួយនឹង​ឃ្លារៀបរាប់អំពីឯកសារនេះ។
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ឈ្មោះឯកសារ.ogg]]</nowiki></tt>''' ដើម្បីតភ្ជាប់​ដោយផ្ទាល់ទៅឯកសារនេះ​ដោយមិនបង្ហាញឯកសារ។",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ឈ្មោះឯកសារ.jpg]]</nowiki></code>'''ដើម្បីប្រើប្រាស់ទម្រង់ពេញលេញនៃឯកសារ
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ឈ្មោះឯកសារ.png|200px|thumb|left|ឃ្លាពិពណ៌នា]]</nowiki></code>''' ដោយប្រើប្រាស់ទំហំ​២០០ភីកសែលក្នុងប្រអប់នៅ​គេមខាងធ្វេង​ជាមួយនឹង​ឃ្លារៀបរាប់អំពីឯកសារនេះ។
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ឈ្មោះឯកសារ.ogg]]</nowiki></code>''' ដើម្បីតភ្ជាប់​ដោយផ្ទាល់ទៅឯកសារនេះ​ដោយមិនបង្ហាញឯកសារ។",
 'upload-permitted' => 'ប្រភេទឯកសារដែលត្រូវបានអនុញ្ញាត៖ $1 ។',
 'upload-preferred' => 'ប្រភេទឯកសារដែលគួរប្រើប្រាស់៖ $1 ។',
 'upload-prohibited' => 'ប្រភេទឯកសារដែលត្រូវបានហាម៖ $1 ។',
@@ -1666,22 +1716,22 @@ $1",
 
 ចូរពិនិត្យ ថាតើអ្នកពិតជាចង់ដាក់បញ្ចេញឯកសារនេះឬក៏អត់។',
 'windows-nonascii-filename' => 'វិគីនេះមិនស្គាល់ឯកសារដែលមានតួអក្សរពិសេសៗទេ។',
-'fileexists' => "ឯកសារដែលមានឈ្មោះនេះមានរួចហើយ​ ចូរពិនិត្យ '''<tt>[[:$1]]</tt>''' ប្រសិនបើអ្នកមិនច្បាស់ថាតើអ្នកចង់ប្តូរវាឬក៏អត់។ [[$1|thumb]]",
-'filepageexists' => "ទំព័រពណ៌នារបស់ឯកសារនជត្រូវបានបង្កើតរួចម្ដងហើយនៅ '''<tt>[[:$1]]</tt>''' ក៏ប៉ុន្តែឯកសារដែលមានឈ្មោះដូចនេះមិនទាន់មានទេ។
+'fileexists' => 'ឯកសារដែលមានឈ្មោះនេះមានរួចហើយ​ ចូរពិនិត្យ <strong>[[:$1]]</strong> ប្រសិនបើអ្នកមិនច្បាស់ថាតើអ្នកចង់ប្តូរវាឬក៏អត់។ [[$1|thumb]]',
+'filepageexists' => 'ទំព័រពណ៌នារបស់ឯកសារនជត្រូវបានបង្កើតរួចម្ដងហើយនៅ <strong>[[:$1]]</strong> ក៏ប៉ុន្តែឯកសារដែលមានឈ្មោះដូចនេះមិនទាន់មានទេ។
 
 ចំណារពន្យល់របស់អ្នកនឹងមិនត្រូវបានបង្ហាញនៅក្នុងទំព័រពណ៌នាឡើយ។
 
 ដើម្បីបង្ហាញចំណារពន្យល់របស់អ្នក អ្នកត្រូវតែកែប្រែវាដោយផ្ទាល់។
-[[$1|thumb]]",
-'fileexists-extension' => "មាន​ឯកសារ​មួយ​ដែល​មាន​ឈ្មោះស្រដៀង​៖ [[$2|thumb]]
-* ឈ្មោះ​ឯកសារដែលបាន​ផ្ទុកឡើង​ ៖ '''<tt>[[:$1]]</tt>'''
-* ឈ្មោះ​ឯកសារ​ដែល​មានស្រាប់​៖ '''<tt>[[:$2]]</tt>'''
-សូម​ជ្រើសរើសឈ្មោះ​ផ្សេងទៀត។",
+[[$1|thumb]]',
+'fileexists-extension' => 'មាន​ឯកសារ​មួយ​ដែល​មាន​ឈ្មោះស្រដៀង​៖ [[$2|thumb]]
+* ឈ្មោះ​ឯកសារដែលបាន​ផ្ទុកឡើង​ ៖ <strong>[[:$1]]</strong>
+* ឈ្មោះ​ឯកសារ​ដែល​មានស្រាប់​៖ <strong>[[:$2]]</strong>
+សូម​ជ្រើសរើសឈ្មោះ​ផ្សេងទៀត។',
 'fileexists-thumbnail-yes' => "ឯកសារនេះទំនងជារូបភាពដែលបានបង្រួមទំហំ ''(កូនរូបភាព)''។
 [[$1|thumb]]
-សូមពិនិត្យមើលឯកសារ '''<tt>[[:$1]]</tt>'''
+សូមពិនិត្យមើលឯកសារ <strong>[[:$1]]</strong>
 បើសិនជាឯកសារដែលអ្នកបានពិនិត្យខាងលើគឺជារូបភាពតែមួយដែលមានទំហំដើម នោះអ្នកមិនចាំបាច់ផ្ទុកឡើងនូវកូនរូបភាពបន្ថែមទេ។",
-'file-thumbnail-no' => "ឈ្មោះឯកសារផ្ដើមដោយ '''<tt>$1</tt>'''
+'file-thumbnail-no' => "ឈ្មោះឯកសារផ្ដើមដោយ <strong>$1</strong>
 
 វាទំនងជារូបភាពដែលត្រូវបានបង្រួមទំហំ ''(កូនរូបភាព)''។
 
@@ -1761,6 +1811,21 @@ $1',
 'upload-unknown-size' => 'មិនដឹងទំហំ',
 'upload-http-error' => 'មានកំហុសHTTPមួយបានកើតឡើង៖ $1',
 
+# File backend
+'backend-fail-notexists' => 'គ្មានឯកសារ "$1" ទេ។',
+'backend-fail-notsame' => 'ឯកសារដែលមិនដូចគ្នាបេះបិទមួយមានរួចហើយនៅ "$1"។',
+'backend-fail-delete' => 'មិនអាចលុបឯកសារ "$1" បានទេ។',
+'backend-fail-alreadyexists' => 'ឯកសារ "$1" មានរួចហើយ។',
+'backend-fail-store' => 'មិនអាចស្តុកឯកសារ "$1" នៅ "$2" បានទេ។',
+'backend-fail-copy' => 'មិនអាចចំលងឯកសារ "$1" ទៅ "$2" បានទេ។',
+'backend-fail-move' => 'មិនអាចផ្លាស់ប្ដូរទីតាំងឯកសារ "$1" ទៅ "$2"​ បានទេ។',
+'backend-fail-opentemp' => 'មិនអាចបើកឯកសារបណ្ដោះអាសន្ន។',
+'backend-fail-writetemp' => 'មិនអាចសរសេរទៅក្នុងឯកសារបណ្ដោះអាសន្ន។',
+'backend-fail-closetemp' => 'មិនអាចបិទឯកសារបណ្ដោះអាសន្ន។',
+'backend-fail-read' => 'មិនអាចអានឯកសារ "$1" បានទេ។',
+'backend-fail-create' => 'មិនអាចសរសេរឯកសារ "$1" បានទេ។',
+'backend-fail-maxsize' => 'មិនអាចសរសេរឯកសារ "$1" បានទេពីព្រោះវាមានទំហំធំជាង {{PLURAL:$2|មួយបៃ|$2 បៃ}}.',
+
 # Special:UploadStash
 'uploadstash-errclear' => 'ការសំអាតឯកសារមិនបានសំរេច។',
 'uploadstash-refresh' => 'ផ្ទុកបញ្ជីឯកសារឡើងវិញ',
@@ -1879,7 +1944,7 @@ $1',
 # MIME search
 'mimesearch' => 'ស្វែងរក MIME',
 'mimesearch-summary' => 'ទំព័រ​នេះ​អនុញ្ញាត​ឲ្យ​មាន​កា​ដាក់​តម្រង​លើ​ឯកសារ​តាម​ប្រភេទ MIME​ របស់​វា​។
-វាយ​បញ្ចូល​៖ contenttype/subtype, ឧទាហរណ៍​ <tt>រូបភាព​/jpeg</tt> ។',
+វាយ​បញ្ចូល​៖ contenttype/subtype, ឧទាហរណ៍​ <code>រូបភាព​/jpeg</code> ។',
 'mimetype' => 'ប្រភេទ MIME ៖',
 'download' => 'ទាញយក',
 
@@ -2076,7 +2141,7 @@ $1',
 'linksearch-ok' => 'ស្វែងរក',
 'linksearch-text' => 'កូដពិសេសដូចជា "*.wikipedia.org" អាចប្រើបាន។
 តំរូវអោយមានយ៉ាងហោចណាស់អោយមានដូម៉ែនកំរិតលើគេ ឧទាហារណ៍ "*.org"។<br />
-ប្រូតូខូលប្រើបាន៖ <tt>$1</tt> (កុំបន្ថែមវាទាំងនេះទៅក្នុងការស្វែងរករបស់អ្នកអោយសោះ)។',
+ប្រូតូខូលប្រើបាន៖ <code>$1</code> (កុំបន្ថែមវាទាំងនេះទៅក្នុងការស្វែងរករបស់អ្នកអោយសោះ)។',
 'linksearch-line' => '$1បានតភ្ជាប់ពី$2',
 
 # Special:ListUsers
@@ -2120,6 +2185,8 @@ $1',
 'mailnologin' => 'មិនមានអាសយដ្ឋានផ្ញើទេ',
 'mailnologintext' => 'អ្នកត្រូវតែ [[Special:UserLogin|កត់ឈ្មោះចូល]] និង មានអាសយដ្ឋានអ៊ីមែលមានសុពលភាពមួយ ក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]របស់អ្នក ដើម្បីមានសិទ្ធិផ្ញើអ៊ីមែលទៅអ្នកប្រើប្រាស់ដទៃទៀត។',
 'emailuser' => 'ផ្ញើអ៊ីមែល​ទៅកាន់​អ្នក​ប្រើប្រាស់នេះ',
+'emailuser-title-target' => 'ផ្ញើសារទៅកាន់ {{GENDER:$1|អ្នកប្រើប្រាស់}} នេះ',
+'emailuser-title-notarget' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់',
 'emailpage' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់',
 'emailpagetext' => 'អ្នក​អាច​ប្រើសំនុំ​បែប​បទ​ខាង​ក្រោម​ក្នុង​ការ​ផ្ញើ​សារ​ជា​អ៊ីមែល​ទៅ​កាន់​អ្នក​ប្រើប្រាស់​នេះ​។
 អាសយដ្ឋាន​អ៊ីមែល​ដែល​អ្នក​បាន​វាយ​បញ្ចូល​ក្នុង​[[Special:Preferences|ចំណង់ចំណូល​ចិត្ត​]]​របស់​អ្នក នឹង​បង្ហាញ​ជា​អាសយដ្ឋាន​អ៊ីមែល "From" ដូច្នោះ​អ្នក​ទទួល​នឹង​អាច​ឆ្លើយ​តប​ទៅ​អ្នក​វិញ​ដោយ​ផ្ទាល់​។',
@@ -2502,6 +2569,8 @@ $1',
 'ipb-confirm' => 'បញ្ជាក់ទទួលស្គាល់ការហាមឃាត់',
 'badipaddress' => 'អាសយដ្ឋានIPមិនត្រឹមត្រូវ',
 'blockipsuccesssub' => 'ដាក់ការហាមឃាត់បានសំរេច',
+'ipb-blockingself' => 'អ្នករៀបនឹងរាំងខ្ទប់ខ្លួនឯងហើយ! តើអ្នកប្រាកដថាចង់ធ្វើបែបនេះមែនទេ?',
+'ipb-confirmhideuser' => 'អ្នករៀបនឹងរាំងខ្ទប់អ្នកប្រើប្រាស់ម្នាក់ដែលមានប្រើមុខងារ "អ្នកប្រើប្រាស់លាក់មុខ"។ ការធ្វើបែបនេះនឹងលាក់ឈ្មោះរបស់អ្នកប្រើប្រាស់នេះនៅក្នុងបញ្ជីនិងកំណត់ហេតុទាំងអស់។ តើអ្នកប្រាកដថាចង់ធ្វើបែបនេះមែនទេ?',
 'ipb-edit-dropdown' => 'កែប្រែមូលហេតុនៃការហាមឃាត់',
 'ipb-unblock-addr' => 'ដកការហាមឃាត់លើ $1',
 'ipb-unblock' => 'ដកការហាមឃាត់លើអ្នកប្រើប្រាស់ ឬ អាសយដ្ឋាន IP',
@@ -2545,7 +2614,7 @@ $1',
 'blocklog-showlog' => 'អ្នកប្រើប្រាស់នេះត្រូវបានរាំងខ្ទប់មុននេះម្ដងហើយ។
 កំណត់ហេតុស្ដីពីការរាំងខ្ទប់ត្រូវបានផ្ដល់អោយដូចខាងក្រោម៖',
 'blocklogentry' => 'បានហាមឃាត់ [[$1]]​ដោយរយៈពេលផុតកំណត់$2 $3',
-'blocklogtext' => 'នេះជាកំណត់ហេតុនៃការហាមឃាត់និងឈប់ហាមឃាត់អ្នកប្រើប្រាស់។ អាសយដ្ឋានIPដែលត្រូវបានហាមឃាត់ដោយស្វ័យប្រវត្តិមិនត្រូវបានដាក់ក្នុងបញ្ជីនេះទេ។ សូមមើល[[Special:BlockList|បញ្ជីនៃការហាមឃាត់IP]]ចំពោះបញ្ជីនៃហាមឃាត់នាថ្មីៗ។',
+'blocklogtext' => 'នេះជាកំណត់ហេតុនៃការហាមឃាត់និងឈប់ហាមឃាត់អ្នកប្រើប្រាស់។ អាសយដ្ឋានIPដែលត្រូវបានហាមឃាត់ដោយស្វ័យប្រវត្តិមិនត្រូវបានដាក់ក្នុងបញ្ជីនេះទេ។ សូមមើល[[Special:BlockList|បញ្ជីនៃការហាមឃាត់]]ចំពោះបញ្ជីនៃហាមឃាត់នាថ្មីៗ។',
 'unblocklogentry' => 'បានឈប់ហាមឃាត់ $1',
 'block-log-flags-anononly' => 'សម្រាប់​តែ​អ្នកប្រើប្រាស់​អនាមិក​ប៉ុណ្ណោះ',
 'block-log-flags-nocreate' => 'ការបង្កើតគណនីត្រូវបានហាមឃាត់',
@@ -2861,16 +2930,30 @@ $1',
 
 # Info page
 'pageinfo-title' => 'ព័ត៌មានសម្រាប់ "$1"',
-'pageinfo-header-edits' => 'កែប្រែ',
-'pageinfo-header-watchlist' => 'បញ្ជីតាមដាន',
-'pageinfo-header-views' => 'បើកមើល',
-'pageinfo-subjectpage' => 'ទំព័រ',
-'pageinfo-talkpage' => 'ទំព័រពិភាក្សា',
-'pageinfo-watchers' => 'ចំនួនអ្នកតាមដាន',
-'pageinfo-edits' => 'ចំនួនកំណែប្រែ',
-'pageinfo-authors' => 'ចំនួនអ្នកនិពន្ធ',
+'pageinfo-header-basic' => 'ព័ត៌មាន​មូលដ្ឋាន​',
+'pageinfo-header-edits' => 'ប្រវត្តិកែប្រែ',
+'pageinfo-header-restrictions' => 'ការការពារទំព័រ',
+'pageinfo-header-properties' => 'លក្ខណៈសម្បត្តិទំព័រ',
+'pageinfo-display-title' => 'បង្ហាញចំណងជើង',
+'pageinfo-length' => 'ប្រវែងទំព័រ (គិតជាបៃ)',
+'pageinfo-article-id' => 'អត្តលេខទំព័រ',
+'pageinfo-robot-policy' => 'ស្ថានភាពម៉ាស៊ីនស្វែងរក',
 'pageinfo-views' => 'ចំនួនការបើកមើល',
-'pageinfo-viewsperedit' => 'ចំនួនការចូលមើលក្នុងមួយកំណែប្រែ',
+'pageinfo-watchers' => 'ចំនួនអ្នកតាមដានទំព័រ',
+'pageinfo-redirects-name' => 'ចំនួនការបញ្ជូនបន្តមកកាន់ទំព័រនេះ',
+'pageinfo-subpages-name' => 'ទំព័ររងរបស់ទំព័រនេះ',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ទំព័របញ្ជូនបន្ត|ទំព័របញ្ជូនបន្ត}}; $3 {{PLURAL:$3|ទំព័រមិនបញ្ជូនបន្ត|ទំព័រមិនបញ្ជូនបន្ត}})',
+'pageinfo-firstuser' => 'អ្នកបង្កើតទំព័រ',
+'pageinfo-firsttime' => 'កាលបរិច្ឆេទបង្កើតទំព័រ',
+'pageinfo-lastuser' => 'អ្នកកែប្រែចុងក្រោយ',
+'pageinfo-lasttime' => 'កាលបរិច្ឆេទនៃការកែប្រែចុងក្រោយ',
+'pageinfo-edits' => 'ចំនួនកំណែប្រែសរុប',
+'pageinfo-authors' => 'ចំនួនអ្នកនិពន្ធសរុប',
+'pageinfo-recent-edits' => 'ចំនួនការកែប្រែថ្មីៗ (ក្នុងរយៈពេល $1 កន្លងទៅនេះ)',
+'pageinfo-recent-authors' => 'ចំនួនអ្នកនិពន្ធថ្មីៗនេះ',
+'pageinfo-restriction' => 'ការការពារទំព័រ (<code>{{$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|ពាក្យ|ពាក្យ}} វេទមន្ត ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|ចំណាត់ថ្នាក់ក្រុម|ចំណាត់ថ្នាក់ក្រុម}}ដែលបានលាក់ ($1)',
 
 # Skin names
 'skinname-standard' => 'បុរាណ',
@@ -2917,9 +3000,12 @@ $1',
 'widthheightpage' => '$1 × $2, $3{{PLURAL:$3|ទំព័រ|ទំព័រ}}',
 'file-info' => 'ទំហំឯកសារ៖ $1, ប្រភេទ MIME ៖ $2',
 'file-info-size' => '$1 × $2 ភីកសែល ទំហំឯកសារ៖ $3 ប្រភេទ MIME៖ $4',
+'file-info-size-pages' => '$1 × $2 ភិចសែល, ទំហំឯកសារ: $3, ប្រភេទ MIME: $4, $5 {{PLURAL:$5|ទំព័រ|ទំព័រ}}',
 'file-nohires' => 'គ្មានភាពម៉ត់ ដែលខ្ពស់ជាង។',
 'svg-long-desc' => 'ឯកសារប្រភេទSVG  $1 × $2 ភីកសែល ទំហំឯកសារ៖ $3',
+'svg-long-desc-animated' => 'ឯកសារជីវចល SVG, ជាធម្មតា $1 × $2 ភិចសែល, ទំហំឯកសារ: $3',
 'show-big-image' => 'រូបភាពពេញ',
+'show-big-image-preview' => 'ទំហំរបស់ការមើលមុននេះ: $1។',
 'show-big-image-size' => '$1 × $2 ភីកសែ',
 'file-info-gif-looped' => 'រង្វិល',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|ផ្ទាំង|ផ្ទាំង}}',
@@ -3051,6 +3137,33 @@ $1',
 'exif-specialinstructions' => 'ការណែនាំពិសេស',
 'exif-credit' => 'អ្នកផ្ដល់',
 'exif-source' => 'ប្រភព',
+'exif-contact' => 'ព័ត៌មានសំរាប់ធ្វើការទាក់ទង',
+'exif-writer' => 'អ្នកសរសេរ',
+'exif-languagecode' => 'ភាសា​',
+'exif-iimcategory' => 'ចំណាត់ថ្នាក់ក្រុម',
+'exif-iimsupplementalcategory' => 'ចំណាត់ថ្នាក់ក្រុមបំពេញ',
+'exif-datetimeexpires' => 'កុំប្រើបន្ទាប់ពី',
+'exif-datetimereleased' => 'ចេញផ្សាយនៅ',
+'exif-lens' => 'ឡង់ទីដែលបានប្រើ',
+'exif-cameraownername' => 'ម្ចាស់កាមេរ៉ា',
+'exif-label' => 'ផ្លាក',
+'exif-rating' => 'រង្វាយតំលៃ (ធំបំផុត ៥)',
+'exif-rightscertificate' => 'លិខិត្របញ្ជាក់ការគ្រប់គ្រងកម្មសិទ្ធបញ្ញា',
+'exif-copyrighted' => 'ស្ថានភាពកម្មសិទ្ធបញ្ញា',
+'exif-copyrightowner' => 'ម្ចាស់កម្មសិទ្ធិបញ្ញា',
+'exif-usageterms' => 'លក្ខខណ្ឌប្រើប្រាស់',
+'exif-webstatement' => 'សេចក្ដីប្រកាសកម្មសិទ្ធបញ្ញាលើអ៊ីនធើណិត',
+'exif-licenseurl' => 'URL សំរាប់អាជ្ញាបណ្ឌកម្មសិទ្ធបញ្ញា',
+'exif-morepermissionsurl' => 'ព័ត៌មានអាជ្ញាបណ្ឌជំនួស',
+'exif-attributionurl' => 'នៅពេលកែច្នៃស្នាដៃនេះយកទៅប្រើ សូមដាក់តំណភ្ជាប់ទៅ',
+'exif-preferredattributionname' => 'នៅពេលកែច្នៃស្នាដៃនេះយកទៅប្រើ សូមថ្លែងអំណរគុណដល់ម្ចាស់ដើម',
+'exif-pngfilecomment' => 'វិចារលើឯកសារ PNG',
+'exif-disclaimer' => 'ការបដិសេធ',
+'exif-contentwarning' => 'ការព្រមានអំពីខ្លឹមសារ',
+'exif-giffilecomment' => 'វិចារលើឯកសារ GIF',
+'exif-intellectualgenre' => 'ប្រភេទរបស់',
+'exif-originalimageheight' => 'កំពស់របស់រូបភាពមុនពេលកាត់តំរឹម',
+'exif-originalimagewidth' => 'ទទឹងរបស់រូបភាពមុនពេលកាត់តំរឹម',
 
 # EXIF attributes
 'exif-compression-1' => 'លែងបានបង្ហាប់',
@@ -3245,6 +3358,34 @@ $3
 
 $5
 
+កូដដើម្បីទទួលស្គាល់នេះនឹងផុតកំណត់នៅ  $4 ។',
+'confirmemail_body_changed' => 'មាននរណាម្នាក់, ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1,
+បានផ្លាស់ប្ដូរអាស័យដ្ឋានអ៊ីមែលរបស់គណនី "$2" មកកាន់អាស័យដ្ឋាននេះនៅក្នុង {{SITENAME}}។
+
+ដើម្បីបញ្ជាក់ថាគណនីនេះពិតជារបស់អ្នកមែន រួចដំណើរការមុខងារអ៊ីមែលនៅលើ {{SITENAME}} ឡើងវិញ
+សូមបើកតំណភ្ជាប់ខាងក្រោមនេះនៅលើកម្មវិធីរាយរកអ៊ីនធើណិតរបស់អ្នក៖
+
+$3
+
+ប្រសិនបើគណនីនេះ *មិនមែន* ជារបស់អ្នក សូមចុចលើតំណភ្ជាប់ខាងក្រោមនេះ
+ដើម្បីលុបចោលការបញ្ជាក់ទទួលស្គាល់អាស័យដ្ឋានអ៊ីមែល៖
+
+$5
+
+កូដបញ្ជាក់ទទួលស្គាល់នេះនឹងផុតកំណត់នៅ $4។',
+'confirmemail_body_set' => 'នរណាម្នាក់ ប្រហែលជាខ្លួនអ្នកផ្ទាល់ មកពីអាស័យដ្ឋានIP $1,
+បានដាក់ភ្ជាប់អាស័យដ្ឋានអ៊ីមែលរបស់គណនី "$2" ជាមួយនឹងអាស័យដ្ឋានអ៊ីមែលនេះនៅលើ{{SITENAME}}។
+
+ដើម្បីបញ្ជាក់ថានេះពិតជាគណនីផ្ទាល់របស់អ្នកមែន និងដំណើរការមុខងារអ៊ីមែលក្នុង{{SITENAME}}ឡើងវិញ
+សូមបើកតំណភ្ជាប់ខាងក្រោមនេះក្នុងកម្មវិធីរាយរកអ៊ីនធើណិតរបស់អ្នក៖
+
+$3
+
+ប្រសិនបើនេះ*មិនមែន*ជាគណនីរបស់អ្នកទេ សូមចុចតំណភ្ជាប់ខាងក្រោម 
+ដើម្បីបោះបង់ចោលនូវការបញ្ជាក់ទទួលស្គាល់អាសយដ្ឋានអ៊ីមែលនេះ៖
+
+$5
+
 កូដដើម្បីទទួលស្គាល់នេះនឹងផុតកំណត់នៅ  $4 ។',
 'confirmemail_invalidated' => 'ការអះអាងបញ្ជាក់ទទួលស្គាល់អាសយដ្ឋានអ៊ីមែលបានបោះបង់ចោលហើយ',
 'invalidateemail' => 'បោះបង់ចោលការបញ្ជាក់ទទួលស្គាល់អ៊ីមែល',
@@ -3397,7 +3538,7 @@ $5
 * <span class="mw-specialpagecached">ទំព័រពិសេសៗសំរាប់រក្សាទុក។</span>',
 'specialpages-group-maintenance' => 'របាយការណ៍នានាអំពីតំហែទាំ',
 'specialpages-group-other' => 'ទំព័រពិសេសៗផ្សេងៗទៀត',
-'specialpages-group-login' => 'á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b / á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87',
+'specialpages-group-login' => 'á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b / á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\82á\9e\8eá\9e\93á\9e¸',
 'specialpages-group-changes' => 'បំលាស់ប្តូរថ្មីៗនិងកំណត់ហេតុ',
 'specialpages-group-media' => 'របាយការណ៍មេឌានិងការផ្ទុកឯកសារ',
 'specialpages-group-users' => 'អ្នកប្រើប្រាស់និងសិទ្ធិ',
@@ -3458,6 +3599,14 @@ $5
 'htmlform-selectorother-other' => 'ផ្សេងទៀត',
 
 # New logging system
+'logentry-delete-delete' => '$1 បានលុបទំព័រ $3 ចោល',
+'logentry-delete-restore' => '$1 បានស្ដារទំព័រ $3 ឡើងវិញ',
+'revdelete-content-hid' => 'ខ្លឹមសារត្រូវបានលាក់',
+'revdelete-summary-hid' => 'ចំណារពន្យល់ការកែប្រែត្រូវបានលាក់',
+'revdelete-uname-hid' => 'អត្តនាមត្រូវបានលាក់',
+'revdelete-content-unhid' => 'ខ្លឹមសារត្រូវបានបង្ហាញ',
+'revdelete-summary-unhid' => 'ចំណារពន្យល់ការកែប្រែត្រូវបានបង្ហាញ',
+'revdelete-uname-unhid' => 'អត្តនាមត្រូវបានបង្ហាញ',
 'revdelete-restricted' => 'បានអនុវត្តការដាក់កំហិតចំពោះអ្នកអភិបាល',
 'revdelete-unrestricted' => 'បានដកការដាក់កំហិតចេញសម្រាប់អ្នកអភិបាល',
 'logentry-move-move' => '$1 បានប្ដូរទីតាំងទំព័រ $3 ពី $4',
@@ -3470,7 +3619,35 @@ $5
 'logentry-newusers-autocreate' => 'គណនី $1 ត្រូវ បានបង្កើត ដោយស្វ័យប្រវត្តិ',
 'newuserlog-byemail' => 'ពាក្យសំងាត់ត្រូវបានផ្ញើតាមអ៊ីមែល',
 
+# Feedback
+'feedback-subject' => 'កម្មវត្ថុ ៖',
+'feedback-message' => 'សារ​៖',
+'feedback-cancel' => 'បោះបង់​',
+'feedback-submit' => 'ដាក់ស្នើមតិយោបល់',
+'feedback-adding' => 'កំពុងបន្ថែមមតិយោបល់ទៅលើទំព័រ...',
+'feedback-thanks' => 'សូមអរគុណ! មតិយោបល់របស់អ្នកត្រូវបានដាក់ផ្សាយនៅលើទំព័រ "[$2 $1]"។',
+'feedback-close' => 'រួចរាល់',
+
 # API errors
+'api-error-badaccess-groups' => 'អ្នកគ្មានការអនុញ្ញាតអោយផ្ទុកឯកសារឡើងទៅក្នុងវិគីនេះទេ។',
+'api-error-empty-file' => 'ឯកសារដែលអ្នកបានដាក់ស្នើគឺទទេ។',
+'api-error-emptypage' => 'ការអនុញ្ញាតអោយបង្កើតទំព័រថ្មីដែលគ្មានសរសេរអ្វីទេ',
+'api-error-fileexists-forbidden' => 'ឯកសារដែលមានឈ្មោះ "$1" មានរួចហើយ ហើយមិនអាចសរសេរជាន់ពីលើបានទេ។',
+'api-error-fileexists-shared-forbidden' => 'ឯកសារដែលមានឈ្មោះ "$1" មានរួចហើយនៅក្នុងថតឯកសាររួម ហើយមិនអាចសរសេរជាន់ពីលើបានទេ។',
+'api-error-file-too-large' => 'ឯកសារដែលអ្នកបានដាក់ស្នើធំពេកហើយ។',
+'api-error-filename-tooshort' => 'ឈ្មោះឯកសារខ្លីពេកហើយ។',
+'api-error-filetype-banned' => 'ឯកសារប្រភេទនេះត្រូវបានហាមប្រាម។',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|មិនមែនជា​ប្រភេទ​ឯកសារ​ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​ទេ|មិនមែនជា​ប្រភេទ​ឯកសារ​ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​ទេ​}}។
+{{PLURAL:$3|ប្រភេទឯកសារ​|ប្រភេទឯកសារ​}}ដែល​ត្រូវ​បាន​គេ​អនុញ្ញាត​គឺ $2 ។',
+'api-error-filetype-missing' => 'ឈ្មោះឯកសារបាត់កន្ទុយ។',
+'api-error-http' => 'បញ្ហាខាងក្នុង៖ មិនអាចភ្ជាប់ទោកាន់ម៉ាស៊ីនបំរើការ។',
+'api-error-illegal-filename' => 'មិនអនុញ្ញាតអោយប្រើឈ្មោះឯកសារនេះ។',
+'api-error-internal-error' => 'បញ្ហាខាងក្នុង៖ មានបញ្ហាណាមួយកើតឡើងពេលកំពុងដំណើរការផ្ទុកឯកសារអ្នកឡើងទៅក្នុងវិគី។',
+'api-error-missingresult' => 'បញ្ហាខាងក្នុង៖ មិនអាចកំណត់បានថាការថតចំលងបានសំរេចទេ។',
+'api-error-mustbeloggedin' => 'អ្នកត្រូវតែកត់ឈ្មោះចូលដើម្បីផ្ទុកឯកសារឡើង។',
+'api-error-ok-but-empty' => 'បញ្ហាខាងក្នុង៖ គ្មានចំលើយពីម៉ាស៊ីនបំរើការ។',
+'api-error-overwrite' => 'មិនអនុញ្ញាតអោយសរសេរជាន់ពីលើឯកសារដែលមានស្រាប់ហើយ។',
+'api-error-timeout' => 'ម៉ាស៊ីនបំរើការមិនបានឆ្លើយតបក្នុងរយៈពេលដែលយើងរំពឹងទុក។',
 'api-error-unclassified' => 'បញ្ហាមិនស្គាល់មួយបានកើតឡើង។',
 'api-error-unknown-code' => 'បញ្ហាមិនស្គាល់៖ "$1" ។',
 'api-error-unknown-error' => 'បញ្ហាខាងក្នុង៖ មានបញ្ហាមិនស្រួលពេលកំពុងព្យាយាមផ្ទុកឯកសាររបស់អ្នកឡើង។',
@@ -3479,4 +3656,14 @@ $5
 'api-error-uploaddisabled' => 'ការផ្ទុកឡើងត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះទេ។',
 'api-error-verification-error' => 'ឯកសារនេះប្រហែលជាខូច ឯមានកន្ទុយមិនត្រឹមត្រូវ។',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|វិនាទី|វិនាទី}}',
+'duration-minutes' => '$1 {{PLURAL:$1|នាទី|នាទី}}',
+'duration-hours' => '$1 {{PLURAL:$1|ម៉ោង|ម៉ោង}}',
+'duration-days' => '$1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}',
+'duration-weeks' => '$1 {{PLURAL: $1|សប្តាហ៍|សប្តាហ៍}}',
+'duration-years' => '$1 {{PLURAL:$1|ឆ្នាំ|ឆ្នាំ}}',
+'duration-decades' => '$1 {{PLURAL:$1|ទសវត្សរ៍|ទសវត្សរ៍}}',
+'duration-centuries' => '$1 {{PLURAL:$1|សតវត្សរ៍|សតវត្សរ៍}}',
+
 );
index f1c641d..42c52af 100644 (file)
@@ -1103,20 +1103,20 @@ $2',
 'largefileserver' => 'ಈ ಫೈಲು ಸರ್ವರ್‍ನಲ್ಲಿ ಸೇರ್ಪಡೆ ಮಾಡಲು ಶಿಫಾರಿತ ಗಾತ್ರಕ್ಕಿಂತ ದೊಡ್ಡದಾಗಿದೆ.',
 'emptyfile' => 'ನೀವು ಅಪ್ಲೋಡ್ ಮಾಡಿದ ಫೈಲು ಖಾಲಿಯಿದ್ದಂತಿದೆ. ಫೈಲಿನ ಹೆಸರು ಬಹುಶಃ ತಪ್ಪಾಗಿರಬಹುದು.
 ದಯವಿಟ್ಟು ನೀವು ಅಪ್ಲೋಡ್ ಮಾಡಬೇಕೆಂದಿರುವುದು ಇದೇ ಫೈಲು ಎಂದು ಖಾತ್ರಿ ಮಾಡಿ.',
-'fileexists' => "ಈ ಹೆಸರಿನ ಫೈಲ್ ಆಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ.
-ಈ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಇಚ್ಛೆಯಿಲ್ಲದಿದ್ದರೆ, ದಯವಿಟ್ಟು '''<tt>[[:$1]]</tt>''' ಅನ್ನು ಪರೀಕ್ಷಿಸಿ.
-[[$1|thumb]]",
-'filepageexists' => "ಈ ಫೈಲಿಗೆ ಮಾಹಿತಿ ಪುಟವೊಂದು ಆಗಲೆ '''<tt>[[:$1]]</tt>''' ಎಂಬಲ್ಲಿ ಇದೆ, ಆದರೆ ಈ ಹೆಸರಿನಲ್ಲಿ ಯಾವ ಫೈಲೂ ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇಲ್ಲ.
+'fileexists' => 'ಈ ಹೆಸರಿನ ಫೈಲ್ ಆಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ.
+ಈ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಇಚ್ಛೆಯಿಲ್ಲದಿದ್ದರೆ, ದಯವಿಟ್ಟು <strong>[[:$1]]</strong> ಅನ್ನು ಪರೀಕ್ಷಿಸಿ.
+[[$1|thumb]]',
+'filepageexists' => 'ಈ ಫೈಲಿಗೆ ಮಾಹಿತಿ ಪುಟವೊಂದು ಆಗಲೆ <strong>[[:$1]]</strong> ಎಂಬಲ್ಲಿ ಇದೆ, ಆದರೆ ಈ ಹೆಸರಿನಲ್ಲಿ ಯಾವ ಫೈಲೂ ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇಲ್ಲ.
 ನೀವು ನೀಡುವ ಸಾರಾಂಶವು ಮಾಹಿತಿ ಪುಟದಲ್ಲಿ ತೋರುವುದಿಲ್ಲ.
-ಸಾರಾಂಶವು ಅಲ್ಲಿ ತೋರಲು ನೀವು ಆನಂತರ ಕೈಯಾರೆ ಸಂಪಾದನೆ ಮಾಡಬೇಕು",
-'fileexists-extension' => "ಈ ಹೆಸರನ್ನು ಹೋಲುವಂತಹ ಫೈಲೊಂದು ಆಗಲೇ ಇದೆ: [[$2|thumb]]
-* ಅಪ್ಲೋಡ್ ಮಾಡುತ್ತಿರುವ ಫೈಲಿನ ಹೆಸರು: '''<tt>[[:$1]]</tt>'''
-* ಅಸ್ಥಿತ್ವದಲ್ಲಿರುವ ಫೈಲಿನ ಹೆಸರು: '''<tt>[[:$2]]</tt>'''
-ದಯವಿಟ್ಟು ಬೇರೆ ಹೆಸರೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ.",
+ಸಾರಾಂಶವು ಅಲ್ಲಿ ತೋರಲು ನೀವು ಆನಂತರ ಕೈಯಾರೆ ಸಂಪಾದನೆ ಮಾಡಬೇಕು',
+'fileexists-extension' => 'ಈ ಹೆಸರನ್ನು ಹೋಲುವಂತಹ ಫೈಲೊಂದು ಆಗಲೇ ಇದೆ: [[$2|thumb]]
+* ಅಪ್ಲೋಡ್ ಮಾಡುತ್ತಿರುವ ಫೈಲಿನ ಹೆಸರು: <strong>[[:$1]]</strong>
+* ಅಸ್ಥಿತ್ವದಲ್ಲಿರುವ ಫೈಲಿನ ಹೆಸರು: <strong>[[:$2]]</strong>
+ದಯವಿಟ್ಟು ಬೇರೆ ಹೆಸರೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ.',
 'fileexists-thumbnail-yes' => "ಈ ಫೈಲು ಯಾವುದೋ ಚಿತ್ರದ ಕಿರುನೋಟ ''(thumbnail)'' ಇರಬಹುದೆಂದು ಅನಿಸುತ್ತದೆ . [[$1|thumb]]
-ದಯವಿಟ್ಟು '''<tt>[[:$1]]</tt>''' ಫೈಲನ್ನೊಮ್ಮೆ ಪರೀಕ್ಷಿಸಿ.
+ದಯವಿಟ್ಟು <strong>[[:$1]]</strong> ಫೈಲನ್ನೊಮ್ಮೆ ಪರೀಕ್ಷಿಸಿ.
 ನೀವು ಪರೀಕ್ಷಿಸಿದ ಫೈಲು ಆ ಚಿತ್ರದ ಮೂಲ ಗಾತ್ರದ್ದಾಗಿದ್ದಲ್ಲಿ ಈ ಕಿರುನೋಟವನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡುವ ಅಗತ್ಯವಿಲ್ಲ.",
-'file-thumbnail-no' => "ಈ ಫೈಲಿನ ಹೆಸರು '''<tt>$1</tt>''' ಇಂದ ಶುರುವಾಗುತ್ತಿದೆ.
+'file-thumbnail-no' => "ಈ ಫೈಲಿನ ಹೆಸರು <strong>$1</strong> ಇಂದ ಶುರುವಾಗುತ್ತಿದೆ.
 ಈ ಫೈಲು ಯಾವುದೋ ಚಿತ್ರದ ಕಿರುನೋಟ ''(thumbnail)'' ಇರಬಹುದೆಂದು ಅನಿಸುತ್ತದೆ .
 ಮೂಲ ಗಾತ್ರದ ಆ ಚಿತ್ರ ನಿಮ್ಮ ಬಳಿಯಿದ್ದಲ್ಲಿ ಅದನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ, ಇಲ್ಲ ದಯವಿಟ್ಟು ಫೈಲಿನ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಿ.",
 'fileexists-forbidden' => 'ಆ ಹೆಸರಿನಲ್ಲಿ ಫೈಲೊಂದು ಆಗಲೆ ಇದೆ;
index 8b03f1d..210e2c3 100644 (file)
@@ -21,6 +21,7 @@
  * @author IRTC1015
  * @author ITurtle
  * @author Idh0854
+ * @author Jmkim dot com
  * @author Kaganer
  * @author Klutzy
  * @author Kwj2772
@@ -73,8 +74,8 @@ $specialPageAliases = array(
        'Booksources'               => array( '책찾기' ),
        'BrokenRedirects'           => array( '끊긴넘겨주기' ),
        'Categories'                => array( '분류' ),
-       'ChangeEmail'               => array( 'ì\9d´ë©\94ì\9d¼ë³\80ê²½', 'ì\9d´ë©\94ì\9d¼ë°\94꾸기' ),
-       'ChangePassword'            => array( 'ë¹\84ë°\80ë²\88í\98¸ë³\80ê²½', 'ë¹\84ë°\80ë²\88í\98¸ë°\94꾸기', 'ë¹\84ë°\80ë\8b¨ì\96´ë³\80ê²½', 'ë¹\84ë°\80ë\8b¨ì\96´ë°\94꾸기' ),
+       'ChangeEmail'               => array( 'ì\9d´ë©\94ì\9d¼ë°\94꾸기', 'ì\9d´ë©\94ì\9d¼ë³\80ê²½' ),
+       'ChangePassword'            => array( 'ë¹\84ë°\80ë²\88í\98¸ë°\94꾸기', 'ë¹\84ë°\80ë²\88í\98¸ë³\80ê²½', 'ë¹\84ë°\80ë\8b¨ì\96´ë°\94꾸기', 'ë¹\84ë°\80ë\8b¨ì\96´ë³\80ê²½' ),
        'ComparePages'              => array( '문서비교' ),
        'Confirmemail'              => array( '이메일인증' ),
        'Contributions'             => array( '기여', '기여목록', '사용자기여' ),
@@ -108,6 +109,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIME찾기', 'MIME검색' ),
        'Mostcategories'            => array( '많이분류된문서' ),
        'Mostimages'                => array( '많이쓰는파일', '많이쓰는그림' ),
+       'Mostinterwikis'            => array( '인터위키많은문서' ),
        'Mostlinked'                => array( '많이링크된문서' ),
        'Mostlinkedcategories'      => array( '많이쓰는분류' ),
        'Mostlinkedtemplates'       => array( '많이쓰는틀' ),
@@ -119,13 +121,13 @@ $specialPageAliases = array(
        'Myuploads'                 => array( '내가올린파일' ),
        'Newimages'                 => array( '새파일', '새그림' ),
        'Newpages'                  => array( '새문서' ),
-       'PasswordReset'             => array( '비밀번호초기화', '비밀단어초기화' ),
+       'PasswordReset'             => array( 'ë¹\84ë°\80ë²\88í\98¸ì\9e¬ì\84¤ì \95', 'ë¹\84ë°\80ë\8b¨ì\96´ì\9e¬ì\84¤ì \95', 'ë¹\84ë°\80ë²\88í\98¸ì´\88기í\99\94', 'ë¹\84ë°\80ë\8b¨ì\96´ì´\88기í\99\94' ),
        'PermanentLink'             => array( '고유링크', '영구링크' ),
        'Popularpages'              => array( '인기있는문서' ),
        'Preferences'               => array( '환경설정' ),
        'Prefixindex'               => array( '접두어찾기' ),
        'Protectedpages'            => array( '보호된문서' ),
-       'Protectedtitles'           => array( '생성보호된문서' ),
+       'Protectedtitles'           => array( '생성보호된문서', '만들기보호된문서' ),
        'Randompage'                => array( '임의문서' ),
        'Randomredirect'            => array( '임의넘겨주기' ),
        'Recentchanges'             => array( '최근바뀜' ),
@@ -164,159 +166,164 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#넘겨주기', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__목차숨김__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__목차보임__', '__목차표시__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__목차__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__단락편집숨김__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__머릿글숨김__', '__헤더숨김__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', '현재월', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', '현재월1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', '현재월이름', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', '현재월이름소유격', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', '현재월이름약자', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', '현재일', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', '현재일2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', '현재요일', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', '현재년', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', '현재시분', '현재시각', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', '현재시', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', '지역월', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', '지역월1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', '지역월이름', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', '지역월이름소유격', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', '지역월이름약자', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', '지역일', 'LOCALDAY' ),
-       'localday2'               => array( '1', '지역일2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', '지역요일', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', '지역년', 'LOCALYEAR' ),
-       'localtime'               => array( '1', '지역시분', '지역시각', 'LOCALTIME' ),
-       'localhour'               => array( '1', '지역시', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', '모든문서수', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', '문서수', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', '파일수', '그림수', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', '사용자수', '계정수', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', '활동중인사용자수', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', '편집수', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', '조회수', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', '문서이름', 'PAGENAME' ),
-       'pagenamee'               => array( '1', '문서이름E', 'PAGENAMEE' ),
-       'namespace'               => array( '1', '이름공간', 'NAMESPACE' ),
-       'namespacee'              => array( '1', '이름공간E', 'NAMESPACEE' ),
-       'namespacenumber'         => array( '1', '이름공간수', 'NAMESPACENUMBER' ),
-       'talkspace'               => array( '1', '토론이름공간', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', '토론이름공간E', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', '본문서이름공간', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', '본문서이름공간E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', '전체문서이름', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', '전체문서이름E', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', '하위문서이름', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', '하위문서이름E', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', '상위문서이름', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', '상위문서이름E', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', '토론문서이름', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', '토론문서이름E', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', '본문서이름', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', '본문서이름E', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', '메시지:', 'MSG:' ),
-       'subst'                   => array( '0', '풀기:', 'SUBST:' ),
-       'safesubst'               => array( '0', '안전풀기:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', '위키잘못메시지:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', '섬네일', '썸네일', '축소판', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', '섬네일=$1', '썸네일=$1', '축소판=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', '오른쪽', 'right' ),
-       'img_left'                => array( '1', '왼쪽', 'left' ),
-       'img_none'                => array( '1', '없음', 'none' ),
-       'img_width'               => array( '1', '$1픽셀', '$1px' ),
-       'img_center'              => array( '1', '가운데', 'center', 'centre' ),
-       'img_framed'              => array( '1', '프레임', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', '프레임없음', 'frameless' ),
-       'img_page'                => array( '1', '문서=$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', '위오른쪽', '위오른쪽=$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', '테두리', 'border' ),
-       'img_baseline'            => array( '1', '밑줄', 'baseline' ),
-       'img_sub'                 => array( '1', '아래첨자', 'sub' ),
-       'img_super'               => array( '1', '위첨자', 'super', 'sup' ),
-       'img_top'                 => array( '1', '위', 'top' ),
-       'img_text_top'            => array( '1', '글자위', '텍스트위', 'text-top' ),
-       'img_middle'              => array( '1', '중간', 'middle' ),
-       'img_bottom'              => array( '1', '아래', 'bottom' ),
-       'img_text_bottom'         => array( '1', '글자아래', '텍스트아래', 'text-bottom' ),
-       'img_link'                => array( '1', '링크=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', '대체글=$1', 'alt=$1' ),
-       'int'                     => array( '0', '정수:', 'INT:' ),
-       'sitename'                => array( '1', '사이트이름', 'SITENAME' ),
-       'ns'                      => array( '0', '이름:', '이름공간:', 'NS:' ),
-       'nse'                     => array( '0', '이름E:', '이름공간E:', 'NSE:' ),
-       'localurl'                => array( '0', '지역주소:', 'LOCALURL:' ),
-       'localurle'               => array( '0', '지역주소E:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', '항목경로', '기사경로', 'ARTICLEPATH' ),
-       'server'                  => array( '0', '서버', 'SERVER' ),
-       'servername'              => array( '0', '서버이름', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', '스크립트경로', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', '스타일경로', 'STYLEPATH' ),
-       'grammar'                 => array( '0', '문법:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', '성별:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__제목변환없음__', '__제변없음__', '__제목변환안함__', '__제변안함__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__내용변환없음__', '__내변없음__', '__내용변환안함__', '__내변안함__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', '현재주', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', '현재요일숫자', 'CURRENTDOW' ),
-       'localweek'               => array( '1', '지역주', 'LOCALWEEK' ),
-       'localdow'                => array( '1', '지역요일숫자', 'LOCALDOW' ),
-       'revisionid'              => array( '1', '판번호', 'REVISIONID' ),
-       'revisionday'             => array( '1', '판일', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', '판일2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', '판월', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', '판월1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', '판년', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', '판타임스탬프', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', '판사용자', 'REVISIONUSER' ),
-       'plural'                  => array( '0', '복수:', '복수형:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', '전체주소:', 'FULLURL:' ),
-       'fullurle'                => array( '0', '전체주소E:', 'FULLURLE:' ),
-       'canonicalurl'            => array( '0', '표준주소:', 'CANONICALURL:' ),
-       'canonicalurle'           => array( '0', '표준주소E:', 'CANONICALURLE:' ),
-       'lcfirst'                 => array( '0', '첫소문자:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', '첫대문자:', 'UCFIRST:' ),
-       'lc'                      => array( '0', '소문자:', 'LC:' ),
-       'uc'                      => array( '0', '대문자:', 'UC:' ),
-       'raw'                     => array( '0', '원시:', 'RAW:' ),
-       'displaytitle'            => array( '1', '제목보이기', '제목표시', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__새글쓰기__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__새글쓰기숨기기__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', '현재버전', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', '주소인코딩:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', '책갈피인코딩', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', '현재타임스탬프', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', '지역타임스탬프', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', '명령검토', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#언어:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', '기본언어', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', '이름공간문서수', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', '관리자수', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', '수형식', 'FORMATNUM' ),
-       'padleft'                 => array( '0', '대체왼쪽', 'PADLEFT' ),
-       'padright'                => array( '0', '대체오른쪽', 'PADRIGHT' ),
-       'special'                 => array( '0', '특수기능', 'special' ),
-       'speciale'                => array( '0', '특수기능E', '특수기능e', 'speciale' ),
-       'defaultsort'             => array( '1', '기본정렬:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', '파일경로:', '그림경로:', 'FILEPATH:' ),
-       'tag'                     => array( '0', '태그', 'tag' ),
-       'hiddencat'               => array( '1', '__숨은분류__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', '분류문서수', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', '문서크기', 'PAGESIZE' ),
-       'index'                   => array( '1', '__색인__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__색인안함__', '__색인거부__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', '권한별사용자수', '그룹별사용자수', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__넘겨주기고정__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', '보호수준', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', '날짜형식', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', '경로', 'PATH' ),
-       'url_wiki'                => array( '0', '위키', 'WIKI' ),
-       'url_query'               => array( '0', '쿼리', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', '오류없음', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', '바꾸기없음', 'noreplace' ),
+       'redirect'                  => array( '0', '#넘겨주기', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__목차숨김__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__목차보임__', '__목차표시__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__목차__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__단락편집숨김__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__머릿글숨김__', '__헤더숨김__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', '현재월', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', '현재월1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', '현재월이름', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', '현재월이름소유격', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', '현재월이름약자', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', '현재일', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', '현재일2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', '현재요일', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', '현재년', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', '현재시분', '현재시각', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', '현재시', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', '지역월', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', '지역월1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', '지역월이름', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', '지역월이름소유격', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', '지역월이름약자', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', '지역일', 'LOCALDAY' ),
+       'localday2'                 => array( '1', '지역일2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', '지역요일', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', '지역년', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', '지역시분', '지역시각', 'LOCALTIME' ),
+       'localhour'                 => array( '1', '지역시', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', '모든문서수', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', '문서수', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', '파일수', '그림수', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', '사용자수', '계정수', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', '활동중인사용자수', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', '편집수', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', '조회수', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', '문서이름', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', '문서이름E', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', '이름공간', 'NAMESPACE' ),
+       'namespacee'                => array( '1', '이름공간E', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', '이름공간수', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', '토론이름공간', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', '토론이름공간E', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', '본문서이름공간', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', '본문서이름공간E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', '전체문서이름', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', '전체문서이름E', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', '하위문서이름', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', '하위문서이름E', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', '상위문서이름', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', '상위문서이름E', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', '토론문서이름', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', '토론문서이름E', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', '본문서이름', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', '본문서이름E', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', '메시지:', 'MSG:' ),
+       'subst'                     => array( '0', '풀기:', 'SUBST:' ),
+       'safesubst'                 => array( '0', '안전풀기:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', '위키잘못메시지:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', '섬네일', '썸네일', '축소판', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', '섬네일=$1', '썸네일=$1', '축소판=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', '오른쪽', 'right' ),
+       'img_left'                  => array( '1', '왼쪽', 'left' ),
+       'img_none'                  => array( '1', '없음', 'none' ),
+       'img_width'                 => array( '1', '$1픽셀', '$1px' ),
+       'img_center'                => array( '1', '가운데', 'center', 'centre' ),
+       'img_framed'                => array( '1', '프레임', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', '프레임없음', 'frameless' ),
+       'img_page'                  => array( '1', '문서=$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', '위오른쪽', '위오른쪽=$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', '테두리', 'border' ),
+       'img_baseline'              => array( '1', '밑줄', 'baseline' ),
+       'img_sub'                   => array( '1', '아래첨자', 'sub' ),
+       'img_super'                 => array( '1', '위첨자', 'super', 'sup' ),
+       'img_top'                   => array( '1', '위', 'top' ),
+       'img_text_top'              => array( '1', '글자위', '텍스트위', 'text-top' ),
+       'img_middle'                => array( '1', '중간', 'middle' ),
+       'img_bottom'                => array( '1', '아래', 'bottom' ),
+       'img_text_bottom'           => array( '1', '글자아래', '텍스트아래', 'text-bottom' ),
+       'img_link'                  => array( '1', '링크=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', '대체글=$1', 'alt=$1' ),
+       'int'                       => array( '0', '정수:', 'INT:' ),
+       'sitename'                  => array( '1', '사이트이름', 'SITENAME' ),
+       'ns'                        => array( '0', '이름:', '이름공간:', 'NS:' ),
+       'nse'                       => array( '0', '이름E:', '이름공간E:', 'NSE:' ),
+       'localurl'                  => array( '0', '지역주소:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', '지역주소E:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', '항목경로', '기사경로', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', '문서번호', 'PAGEID' ),
+       'server'                    => array( '0', '서버', 'SERVER' ),
+       'servername'                => array( '0', '서버이름', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', '스크립트경로', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', '스타일경로', 'STYLEPATH' ),
+       'grammar'                   => array( '0', '문법:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', '성별:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__제목변환없음__', '__제변없음__', '__제목변환안함__', '__제변안함__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__내용변환없음__', '__내변없음__', '__내용변환안함__', '__내변안함__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', '현재주', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', '현재요일숫자', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', '지역주', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', '지역요일숫자', 'LOCALDOW' ),
+       'revisionid'                => array( '1', '판번호', 'REVISIONID' ),
+       'revisionday'               => array( '1', '판일', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', '판일2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', '판월', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', '판월1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', '판년', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', '판타임스탬프', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', '판사용자', 'REVISIONUSER' ),
+       'plural'                    => array( '0', '복수:', '복수형:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', '전체주소:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', '전체주소E:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', '표준주소:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', '표준주소E:', 'CANONICALURLE:' ),
+       'lcfirst'                   => array( '0', '첫소문자:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', '첫대문자:', 'UCFIRST:' ),
+       'lc'                        => array( '0', '소문자:', 'LC:' ),
+       'uc'                        => array( '0', '대문자:', 'UC:' ),
+       'raw'                       => array( '0', '원본:', 'RAW:' ),
+       'displaytitle'              => array( '1', '제목보이기', '제목표시', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__새글쓰기__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__새글쓰기숨기기__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', '현재버전', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', '주소인코딩:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', '책갈피인코딩', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', '현재타임스탬프', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', '지역타임스탬프', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', '명령검토', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#언어:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', '기본언어', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', '이름공간문서수', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', '관리자수', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', '수형식', 'FORMATNUM' ),
+       'padleft'                   => array( '0', '대체왼쪽', 'PADLEFT' ),
+       'padright'                  => array( '0', '대체오른쪽', 'PADRIGHT' ),
+       'special'                   => array( '0', '특수기능', 'special' ),
+       'speciale'                  => array( '0', '특수기능E', '특수기능e', 'speciale' ),
+       'defaultsort'               => array( '1', '기본정렬:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', '파일경로:', '그림경로:', 'FILEPATH:' ),
+       'tag'                       => array( '0', '태그', 'tag' ),
+       'hiddencat'                 => array( '1', '__숨은분류__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', '분류문서수', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', '문서크기', 'PAGESIZE' ),
+       'index'                     => array( '1', '__색인__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__색인안함__', '__색인거부__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', '권한별사용자수', '그룹별사용자수', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__넘겨주기고정__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', '보호수준', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', '날짜형식', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', '경로', 'PATH' ),
+       'url_wiki'                  => array( '0', '위키', 'WIKI' ),
+       'url_query'                 => array( '0', '쿼리', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', '오류없음', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', '바꾸기없음', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', '모두', 'all' ),
+       'pagesincategory_pages'     => array( '0', '문서', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', '하위분류', 'subcats' ),
+       'pagesincategory_files'     => array( '0', '파일', 'files' ),
 );
 
 $bookstoreList = array(
@@ -339,45 +346,44 @@ $messages = array(
 # User preference toggles
 'tog-underline' => '링크에 밑줄 표시하기:',
 'tog-justify' => '문단 정렬하기',
-'tog-hideminor' => 'ì\82¬ì\86\8cí\95\9c í\8e¸ì§\91ì\9d\84 ìµ\9cê·¼ ë°\94ë\80\9cì\97\90ì\84\9c 숨기기',
-'tog-hidepatrolled' => '최근 바뀜에서 검토ë\90\9c í\8e¸ì§\91ì\9d\84 ì\88¨ê¸°ê¸°',
-'tog-newpageshidepatrolled' => '새 문서 목록에서 검토ë\90\9c ë¬¸ì\84\9c를 ì\88¨ê¸°ê¸°',
+'tog-hideminor' => 'ìµ\9cê·¼ ë°\94ë\80\9cì\97\90ì\84\9c ì\82¬ì\86\8cí\95\9c í\8e¸ì§\91ì\9d\84 숨기기',
+'tog-hidepatrolled' => '최근 바뀜에서 검토í\95\9c í\8e¸ì§\91ì\9d\84 ì\88¨ê¸°ê¸°',
+'tog-newpageshidepatrolled' => '새 문서 목록에서 검토í\95\9c ë¬¸ì\84\9c를 ì\88¨ê¸°ê¸°',
 'tog-extendwatchlist' => '주시문서 목록에서 가장 최근의 편집만이 아닌 모든 편집을 보기',
-'tog-usenewrc' => '향상된 최근 바뀜 (자바스크립트)',
+'tog-usenewrc' => '최근 바뀜 및 주시 문서 목록에서 문서별 그룹 바뀜 (자바스크립트 필요)',
 'tog-numberheadings' => '머릿글 번호 매기기',
-'tog-showtoolbar' => '편집창에 툴바 보이기 (자바스크립트)',
-'tog-editondblclick' => '더블클릭으로 문서 편집하기 (자바스크립트)',
+'tog-showtoolbar' => '편집창에 툴바 보이기 (자바스크립트 필요)',
+'tog-editondblclick' => '더블 클릭으로 문서 편집하기 (자바스크립트 필요)',
 'tog-editsection' => '[편집] 링크로 부분 편집하기',
-'tog-editsectiononrightclick' => '제목을 오른쪽 클릭해서 부분 편집하기 (자바스크립트)',
+'tog-editsectiononrightclick' => '제목을 오른쪽 클릭해서 부분 편집하기 (자바스크립트 필요)',
 'tog-showtoc' => '문서의 차례 보여주기 (머릿글이 4개 이상인 경우)',
 'tog-rememberpassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1일)',
-'tog-watchcreations' => '내가 처음 만드는 문서를 주시문서 목록에 추가',
-'tog-watchdefault' => '내가 편집하는 문서 주시문서 목록에 추가',
-'tog-watchmoves' => '내가 이동하는 문서 주시문서 목록에 추가',
-'tog-watchdeletion' => '내가 삭제하는 문서 주시문서 목록에 추가',
-'tog-minordefault' => '‘사소한 편집’을 기본적으로 선택하기',
-'tog-previewontop' => '편집ì\83\81ì\9e\90 ì\95\9eì\97\90 ë¯¸ë¦¬ë³´ê¸° ë³´ì\9d´ê¸°',
-'tog-previewonfirst' => '처음 편집할 때 미리보기 보기',
+'tog-watchcreations' => '내가 만드는 문서와 내가 올린 파일을 주시문서 목록에 추가',
+'tog-watchdefault' => '내가 편집하는 문서와 파일을 주시문서 목록에 추가',
+'tog-watchmoves' => '내가 이동하는 문서와 파일을 주시문서 목록에 추가',
+'tog-watchdeletion' => '내가 삭제하는 문서와 파일을 주시문서 목록에 추가',
+'tog-minordefault' => '사소한 편집을 기본적으로 선택하기',
+'tog-previewontop' => '편집 ì\83\81ì\9e\90 ì\95\9eì\97\90 ë¯¸ë¦¬ ë³´ê¸° ë³´ê¸°',
+'tog-previewonfirst' => '처음 편집할 때 미리 보기 보기',
 'tog-nocache' => '브라우저의 문서 캐시 끄기',
-'tog-enotifwatchlistpages' => '주시문서 바뀌면 이메일로 알림',
+'tog-enotifwatchlistpages' => '주시문서 목록에 속한 문서나 파일이 바뀌면 이메일로 알림',
 'tog-enotifusertalkpages' => '내 토론 문서가 바뀌면 이메일로 알림',
-'tog-enotifminoredits' => '사소한 편집도 이메일로 알림',
+'tog-enotifminoredits' => '문서나 파일의 사소한 편집도 이메일로 알림',
 'tog-enotifrevealaddr' => '알림 메일에 내 이메일 주소를 밝히기',
 'tog-shownumberswatching' => '주시 사용자 수 보기',
 'tog-oldsig' => '현재 서명:',
 'tog-fancysig' => '서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)',
-'tog-externaleditor' => '외부 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요, [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
-'tog-externaldiff' => '외부 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요, [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
+'tog-externaleditor' => '외부 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
+'tog-externaldiff' => '외부 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
 'tog-showjumplinks' => '접근성을 위한 "이동" 링크 쓰기 (일부 스킨에서만 작동)',
-'tog-uselivepreview' => '실시간 미리 보기 사용하기 (자바스크립트 사용, 시험 중)',
+'tog-uselivepreview' => '실시간 미리 보기 사용하기 (자바스크립트 필요) (시험 기능)',
 'tog-forceeditsummary' => '편집 요약을 쓰지 않았을 때 알려주기',
 'tog-watchlisthideown' => '주시문서 목록에서 내 편집을 숨기기',
 'tog-watchlisthidebots' => '주시문서 목록에서 봇 편집을 숨기기',
 'tog-watchlisthideminor' => '주시문서 목록에서 사소한 편집을 숨기기',
 'tog-watchlisthideliu' => '주시문서 목록에서 로그인한 사용자의 편집을 숨기기',
-'tog-watchlisthideanons' => '주시문서 목록에서 비등록 사용자의 편집을 숨기기',
-'tog-watchlisthidepatrolled' => '주시문서 목록에서 검토된 편집을 숨기기',
-'tog-nolangconversion' => '변형 변환을 비활성화',
+'tog-watchlisthideanons' => '주시문서 목록에서 익명 사용자의 편집을 숨기기',
+'tog-watchlisthidepatrolled' => '주시문서 목록에서 검토한 편집을 숨기기',
 'tog-ccmeonemails' => '이메일을 보낼 때 내 이메일로 복사본을 보내기',
 'tog-diffonly' => '편집 차이를 비교할 때 문서 내용을 보지 않기',
 'tog-showhiddencats' => '숨은 분류 보기',
@@ -449,19 +455,19 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|분류}}',
-'category_header' => '‘$1’ 분류에 속하는 문서',
+'category_header' => '"$1" 분류에 속하는 문서',
 'subcategories' => '하위 분류',
-'category-media-header' => '‘$1’ 분류에 속하는 자료',
+'category-media-header' => '"$1" 분류에 속하는 자료',
 'category-empty' => '이 분류에 속하는 문서나 자료가 없습니다.',
 'hidden-categories' => '{{PLURAL:$1|숨은 분류}}',
 'hidden-category-category' => '숨은 분류',
-'category-subcat-count' => '{{PLURAL:$2|이 분류에는 하위 분류 1 개만이 속해 있습니다.|다음은 이 분류에 속하는 하위 분류 $2 개 가운데 $1 개입니다.}}',
-'category-subcat-count-limited' => '이 분류에 하위분류가 $1개 있습니다.',
-'category-article-count' => '{{PLURAL:$2|이 분류에는 문서 1 개만이 속해 있습니다.|다음은 이 분류에 속하는 문서 $2 개 가운데 $1 개입니다.}}',
-'category-article-count-limited' => '이 분류에 문서가 $1개 있습니다.',
-'category-file-count' => '{{PLURAL:$2|이 분류에는 파일 1 개만이 속해 있습니다.|다음은 이 분류에 속하는 파일 $2 개 가운데 $1 개입니다.}}',
-'category-file-count-limited' => '이 분류에 파일이 $1개 있습니다.',
-'listingcontinuesabbrev' => ' (계속)',
+'category-subcat-count' => '{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 하위 분류 $2개 가운데 $1개입니다.}}',
+'category-subcat-count-limited' => '이 분류에 하위 분류 $1개가 있습니다.',
+'category-article-count' => '{{PLURAL:$2|이 분류에는 문서 1개만이 속해 있습니다.|다음은 이 분류에 속하는 문서 $2개 가운데 $1개입니다.}}',
+'category-article-count-limited' => '이 분류에 문서 $1개가 있습니다.',
+'category-file-count' => '{{PLURAL:$2|이 분류에는 파일 1개만이 속해 있습니다.|다음은 이 분류에 속하는 파일 $2개 가운데 $1개입니다.}}',
+'category-file-count-limited' => '이 분류에 파일 $1개가 있습니다.',
+'listingcontinuesabbrev' => '(계속)',
 'index-category' => '색인된 문서',
 'noindex-category' => '색인에서 제외되는 문서',
 'broken-file-category' => '잘못된 파일 링크가 포함된 문서',
@@ -494,7 +500,7 @@ $messages = array(
 'vector-action-move' => '이동',
 'vector-action-protect' => '보호',
 'vector-action-undelete' => '되살리기',
-'vector-action-unprotect' => 'ë³´í\98¸ ì\84¤ì \95 ë³\80ê²½',
+'vector-action-unprotect' => 'ë³´í\98¸ ì\84¤ì \95 ë°\94꾸기',
 'vector-simplesearch-preference' => '향상된 검색어 제안 사용하기 (벡터 스킨 전용)',
 'vector-view-create' => '만들기',
 'vector-view-edit' => '편집',
@@ -529,10 +535,10 @@ $messages = array(
 'undelete_short' => '편집 $1개 되살리기',
 'viewdeleted_short' => '삭제된 편집 $1개 보기',
 'protect' => '보호',
-'protect_change' => 'ë³´í\98¸ ì\88\98ì¤\80 ë³\80ê²½',
+'protect_change' => 'ë³´í\98¸ ì\88\98ì¤\80 ë°\94꾸기',
 'protectthispage' => '이 문서 보호하기',
-'unprotect' => 'ë³´í\98¸ ì\84¤ì \95 ë³\80ê²½',
-'unprotectthispage' => 'ì\9d´ ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 ë³\80ê²½í\95\98기',
+'unprotect' => 'ë³´í\98¸ ì\84¤ì \95 ë°\94꾸기',
+'unprotectthispage' => 'ì\9d´ ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 ë°\94꾸기',
 'newpage' => '새 문서',
 'talkpage' => '토론 문서',
 'talkpagelinktext' => '토론',
@@ -545,7 +551,7 @@ $messages = array(
 'toolbox' => '도구모음',
 'userpage' => '사용자 문서 보기',
 'projectpage' => '프로젝트 문서 보기',
-'imagepage' => '자료 문서 보기',
+'imagepage' => '파일 문서 보기',
 'mediawikipage' => '메시지 문서 보기',
 'templatepage' => '틀 문서 보기',
 'viewhelppage' => '도움말 문서 보기',
@@ -554,7 +560,7 @@ $messages = array(
 'otherlanguages' => '다른 언어',
 'redirectedfrom' => '($1에서 넘어옴)',
 'redirectpagesub' => '넘겨주기 문서',
-'lastmodifiedat' => '이 문서는 $1 $2 에 마지막으로 바뀌었습니다.',
+'lastmodifiedat' => '이 문서는 $1 $2에 마지막으로 바뀌었습니다.',
 'viewcount' => '이 문서는 $1번 읽혔습니다.',
 'protectedpage' => '보호된 문서',
 'jumpto' => '이동:',
@@ -594,13 +600,18 @@ $1',
 'badaccess-groups' => '요청한 동작은 {{PLURAL:$2|다음|다음 중 하나의}} 권한을 가진 사용자에게만 가능합니다: $1.',
 
 'versionrequired' => '미디어위키 $1 버전 필요',
-'versionrequiredtext' => '이 문서를 사용하려면 $1 버전 미디어위키가 필요합니다. [[Special:Version|설치된 미디어위키 버전]]을 확인해주세요.',
+'versionrequiredtext' => '이 문서를 사용하려면 $1 버전 미디어위키가 필요합니다.
+[[Special:Version|설치된 미디어위키 버전]]을 참고하세요.',
 
 'ok' => '확인',
-'retrievedfrom' => '원본 주소 ‘$1’',
+'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' => '편집',
@@ -615,13 +626,13 @@ $1',
 'collapsible-expand' => '보이기',
 'thisisdeleted' => '$1을 보거나 되살리겠습니까?',
 'viewdeleted' => '$1을 보겠습니까?',
-'restorelink' => '삭제된 편집 $1 개',
+'restorelink' => '삭제된 편집 $1개',
 'feedlinks' => '피드:',
 'feed-invalid' => '잘못된 구독 피드 방식입니다.',
 'feed-unavailable' => '피드 서비스는 제공하지 않습니다',
 'site-rss-feed' => '$1 RSS 피드',
 'site-atom-feed' => '$1 Atom 피드',
-'page-rss-feed' => '‘$1’ RSS 피드',
+'page-rss-feed' => '"$1" RSS 피드',
 'page-atom-feed' => '"$1" Atom 피드',
 'red-link-title' => '$1 (없는 문서)',
 'sort-descending' => '내림차순 정렬',
@@ -644,7 +655,7 @@ $1',
 'nosuchactiontext' => 'URL로 요청한 동작이 잘못되었습니다.
 당신은 URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니다.
 이것은 {{SITENAME}}의 버그일 수도 있습니다.',
-'nosuchspecialpage' => '해당하는 특수기능이 없습니다.',
+'nosuchspecialpage' => '해당하는 특수 문서가 없습니다.',
 'nospecialpagetext' => '<strong>요청한 특수 문서가 존재하지 않습니다.</strong>
 
 특수 문서의 목록은 [[Special:SpecialPages|여기]]에서 볼 수 있습니다.',
@@ -654,50 +665,57 @@ $1',
 'databaseerror' => '데이터베이스 오류',
 'dberrortext' => '데이터베이스 쿼리 구문 오류가 발생했습니다.
 소프트웨어의 버그가 있을 수 있습니다.
-마지막으로 요청한 데이터베이스 쿼리는 "<tt>$2</tt>" 함수에서 쓰인
-<blockquote><tt>$1</tt></blockquote>
+마지막으로 요청한 데이터베이스 쿼리는 "<code>$2</code>" 함수에서 쓰인
+<blockquote><code>$1</code></blockquote>
 입니다.
-데이터베이스는 "<tt>$3: $4</tt>" 오류를 일으켰습니다.',
+데이터베이스는 "<samp>$3: $4</samp>" 오류를 일으켰습니다.',
 'dberrortextcl' => '데이터베이스 쿼리 구문 오류가 발생했습니다.
 마지막으로 요청한 데이터베이스 쿼리는 "$2" 함수에서 쓰인
 "$1"
 입니다.
 데이터베이스는 "$3: $4" 오류를 일으켰습니다.',
-'laggedslavemode' => "'''주의:''' 문서가 최근에 바뀐 내용이 아닐 수도 있습니다.",
+'laggedslavemode' => "'''경고:''' 문서가 최근에 바뀐 내용이 아닐 수도 있습니다.",
 'readonly' => '데이터베이스 잠김',
 'enterlockreason' => '데이터베이스를 잠그는 이유와 예상되는 기간을 적어 주세요.',
 'readonlytext' => '데이터베이스가 잠겨 있어서 문서를 편집할 수 없습니다. 데이터베이스 관리가 끝난 후에는 정상으로 돌아올 것입니다.
 
 관리자가 데이터베이스를 잠글 때 남긴 메시지는 다음과 같습니다: $1',
-'missing-article' => '데이터베이스에서 ‘$1’ 문서$2를 찾지 못했습니다.
+'missing-article' => '데이터베이스에서 "$1" 문서의 $2 텍스트를 찾지 못했습니다.
 
 삭제된 문서의 역사/비교 문서를 보려고 시도할 때 이러한 문제가 발생할 수 있습니다.
 
 또는, 프로그램 버그가 발생했을 수도 있습니다. [[Special:ListUsers/sysop|관리자]]에게 오류가 나는 URL을 알려주세요.',
 'missingarticle-rev' => '(판번호: $1)',
 'missingarticle-diff' => '(차이: $1, $2)',
-'readonly_lag' => '슬레이브 데이터베이스가 마스터 서버의 자료를 ê°±ì\8b í\95\98ë\8a\94 ì¤\91ì\9e\85ë\8b\88ë\8b¤. ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ê°\80 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ì\9e ê²¨ ì\9e\88ì\8aµë\8b\88ë\8b¤.',
+'readonly_lag' => '슬레이브 데이터베이스가 마스터 서버의 자료를 ì\83\88ë¡\9c ê³ ì¹\98ë\8a\94 ì¤\91ì\9e\85ë\8b\88ë\8b¤. ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ê°\80 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ì\9e ê²¨ ì\9e\88ì\8aµë\8b\88ë\8b¤.',
 'internalerror' => '내부 오류',
 'internalerror_info' => '내부 오류: $1',
-'fileappenderrorread' => '‘$1’ 파일을 읽을 수 없습니다. 해당 파일에 내용을 덧붙일 수 없습니다.',
-'fileappenderror' => '‘$1’ 파일을 ‘$2’에 덧붙일 수 없습니다.',
-'filecopyerror' => '‘$1’ 파일을 ‘$2’(으)로 복사할 수 없습니다.',
-'filerenameerror' => '‘$1’ 파일을 ‘$2’(으)로 옮길 수 없습니다.',
-'filedeleteerror' => '‘$1’ 파일을 삭제할 수 없습니다.',
-'directorycreateerror' => '‘$1’ 디렉토리를 만들 수 없습니다.',
-'filenotfound' => '‘$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' => '"$1" 문서나 파일을 삭제할 수 없습니다.
+이미 삭제되었을 수도 있습니다.',
 'cannotdelete-title' => '"$1" 문서를 삭제할 수 없습니다.',
+'delete-hook-aborted' => '훅에 의해 삭제가 중단되었습니다.
+아무런 설명도 주어지지 않았습니다.',
 'badtitle' => '잘못된 제목',
-'badtitletext' => '문서 제목이 잘못되었거나 비어있습니다.',
+'badtitletext' => '문서 제목이 잘못되었거나 비어있습니다. 또는 잘못된 인터위키 제목으로 링크했습니다.
+문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
 'perfcached' => '다음 자료는 캐시된 것이므로 현재 상황을 반영하지 않을 수 있습니다. 캐시에 최대 {{PLURAL:$1|결과 $1개}}가 있습니다.',
-'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 갱신되었습니다.  캐시에 최대 {{PLURAL:$4|$4개의 결과}}가 있습니다.',
-'querypage-no-updates' => '이 문서의 갱신이 현재 비활성화되어 있습니다. 자료가 잠시 갱신되지 않을 것입니다.',
-'wrong_wfQuery_params' => 'wfQuery()에서 잘못된 매개변수 발생<br />함수: $1<br />쿼리: $2',
+'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 새로 고쳐졌습니다.  캐시에 최대 {{PLURAL:$4|결과 $4개}}가 있습니다.',
+'querypage-no-updates' => '이 문서의 새로 고침이 현재 비활성화되어 있습니다.
+자료가 잠시 새로 고치지 않을 것입니다.',
+'wrong_wfQuery_params' => 'wfQuery()에서 잘못된 매개변수 발생<br />
+함수: $1<br />
+쿼리: $2',
 'viewsource' => '내용 보기',
 'viewsource-title' => '$1 문서 내용 보기',
 'actionthrottled' => '동작 중지',
@@ -707,24 +725,28 @@ $1',
 'viewsourcetext' => '문서의 원본을 보거나 복사할 수 있습니다:',
 'viewyourtext' => "당신은 이 문서에 남긴 '''당신의 편집''' 내용을 보거나 복사할 수 있습니다:",
 'protectedinterface' => '이 문서는 소프트웨어 인터페이스에 쓰이는 문서로, 잠겨 있습니다.',
-'editinginterface' => "'''경고''': 소프트웨어에서 사용하는 메시지 문서를 고치고 있습니다. 이것은 모든 사용자에게 영향을 끼칩니다. 번역되지 않은 메시지를 번역하려는 경우에는, [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하면 메시지 번역을 미디어위키에 직접 반영할 수 있습니다.",
+'editinginterface' => "'''경고''': 소프트웨어에서 사용하는 메시지 문서를 고치고 있습니다.
+이는 모든 사용자에게 영향을 끼칩니다.
+번역되지 않은 메시지를 번역하려는 경우에는 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하면 메시지 번역을 미디어위키에 직접 반영할 수 있습니다.",
 'sqlhidden' => '(SQL 쿼리 숨겨짐)',
-'cascadeprotected' => '이 문서는 연쇄보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다. 연쇄 보호된 문서:
+'cascadeprotected' => '이 문서는 연쇄 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다. 연쇄 보호된 문서:
 $2',
-'namespaceprotected' => "'''$1''' 네임스페이스를 편집할 수 있는 권한이 없습니다.",
+'namespaceprotected' => "'''$1''' 이름공간을 편집할 수 있는 권한이 없습니다.",
 'customcssprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 당신은 이 CSS 문서를 편집할 수 없습니다.',
 'customjsprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 당신은 이 자바스크립트 문서를 편집할 수 없습니다.',
-'ns-specialprotected' => '{{ns:special}} ë\84¤ì\9e\84ì\8a¤í\8e\98ì\9d´ì\8a¤ì\9d\98 ë¬¸ì\84\9cë\8a\94 í\8e¸ì§\91í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.',
-'titleprotected' => '[[User:$1|$1]] 사용자가 문서 생성을 금지했습니다.
-이유는 다음과 같습니다. ‘$2’',
-'filereadonlyerror' => '‘$2’ 파일 저장소가 읽기 전용이기 때문에 ‘$1’ 파일을 변경할 수 없습니다.
+'ns-specialprotected' => 'í\8a¹ì\88\98 ë¬¸ì\84\9cë\8a\94 í\8e¸ì§\91í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.',
+'titleprotected' => '[[User:$1|$1]] 사용자가 문서 만들기를 금지했습니다.
+이유는 다음과 같습니다. "$2"',
+'filereadonlyerror' => '"$2" 파일 저장소가 읽기 전용이기 때문에 "$1" 파일을 바꿀 수 없습니다.
 
-저장소 관리자가 파일 저장소를 잠근 이유에 대해 "\'\'$3\'\'"이라는 설명을 남겼습니다.',
-'invalidtitle-knownnamespace' => '제목 오류: 이름공간 "$2"와 텍스트 "$3"',
-'invalidtitle-unknownnamespace' => '제목 오류: 알 수 없는 이름공간 번호 "$1"과, 텍스트 "$2"',
+저장소 관리자가 파일 저장소를 잠근 이유에 대한 설명을 남겼습니다: "$3".',
+'invalidtitle-knownnamespace' => '제목 오류: "$2" 이름공간과 "$3" 텍스트',
+'invalidtitle-unknownnamespace' => '제목 오류: 알 수 없는 $1 이름공간 번호와, "$2" 텍스트',
+'exception-nologin' => '로그인하지 않음',
+'exception-nologin-text' => '이 문서나 행동은 이 위키에 로그인을 해야 합니다.',
 
 # Virus scanner
-'virus-badscanner' => "잘못된 설정: 알 수 없는 바이러스 검사기: ''$1''",
+'virus-badscanner' => "잘못된 설정: 알 수 없는 바이러스 검사기: '''$1'''",
 'virus-scanfailed' => '검사 실패 (코드 $1)',
 'virus-unknownscanner' => '알려지지 않은 백신:',
 
@@ -736,13 +758,14 @@ $2',
 'welcomecreation' => '== $1 님, 환영합니다! ==
 계정이 만들어졌습니다.
 [[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.',
-'yourname' => '계정 이름:',
+'yourname' => '사용자 이름:',
 'yourpassword' => '비밀번호:',
-'yourpasswordagain' => '비밀번호 입력:',
+'yourpasswordagain' => '비밀번호 다시 입력:',
 'remembermypassword' => '이 컴퓨터에서 로그인 상태를 저장하기 (최대 $1일)',
-'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다.',
-'yourdomainname' => '도메인 이름',
-'externaldberror' => '외부 인증 데이터베이스에 오류가 있거나, 외부 계정을 갱신할 권한이 없습니다.',
+'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다',
+'yourdomainname' => '도메인 이름:',
+'password-change-forbidden' => '이 위키에서 비밀번호를 바꿀 수 없습니다.',
+'externaldberror' => '외부 인증 데이터베이스에 오류가 있거나 외부 계정을 새로 고칠 권한이 없습니다.',
 'login' => '로그인',
 'nav-login-createaccount' => '로그인 / 계정 만들기',
 'loginprompt' => '{{SITENAME}}에 로그인하려면 쿠키를 사용할 수 있어야 합니다.',
@@ -756,29 +779,36 @@ $2',
 'createaccount' => '계정 만들기',
 'gotaccount' => "계정이 이미 있다면, '''$1'''.",
 'gotaccountlink' => '로그인하세요',
-'userlogin-resetlink' => '계정 이름이나 비밀번호를 잊으셨나요?',
+'userlogin-resetlink' => '사용자 이름이나 비밀번호를 잊으셨나요?',
 'createaccountmail' => '이메일로 보내기',
 'createaccountreason' => '이유:',
 'badretype' => '입력한 비밀번호가 서로 다릅니다.',
 'userexists' => '입력하신 사용자 이름이 이미 등록되어 있습니다.
\8b¤ë¥¸ ì\9d´ë¦\84ì\9d\84 ì\84 í\83\9dí\95´ì£¼ì\8b­ì\8b\9cì\98¤.',
\8b¤ë¥¸ ì\9d´ë¦\84ì\9d\84 ì\84 í\83\9dí\95\98ì\84¸ì\9a\94.',
 'loginerror' => '로그인 오류',
-'createaccounterror' => '계정을 생성하지 못했습니다: $1',
-'nocookiesnew' => '사용자 계정을 만들었지만, 아직 로그인하지 않았습니다. {{SITENAME}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다. 지금 사용하는 웹 브라우저는 쿠키를 사용하지 않도록 설정되어 있습니다. 로그인하기 전에 웹 브라우저에서 쿠키를 사용하도록 설정해주세요.',
-'nocookieslogin' => '{{SITENAME}}에서는 로그인을 위해 쿠키를 사용합니다. 당신의 웹 브라우저에서 쿠키가 비활성되어 있습니다. 쿠키 사용을 활성화한 다음 로그인해 주세요.',
-'nocookiesfornew' => '요청의 출처를 확인할 수 없기 때문에 사용자 계정이 생성되지 않았습니다.
+'createaccounterror' => '계정을 만들지 못했습니다: $1',
+'nocookiesnew' => '사용자 계정을 만들었지만, 아직 로그인하지 않았습니다.
+{{SITENAME}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다.
+지금 사용하는 웹 브라우저는 쿠키를 사용하지 않도록 설정되어 있습니다.
+로그인하기 전에 웹 브라우저에서 쿠키를 사용하도록 설정해주세요.',
+'nocookieslogin' => '{{SITENAME}}에서는 로그인을 위해 쿠키를 사용합니다.
+당신의 웹 브라우저에서 쿠키가 비활성되어 있습니다.
+쿠키 사용을 활성화한 다음 로그인해 주세요.',
+'nocookiesfornew' => '요청의 출처를 확인할 수 없기 때문에 사용자 계정이 만들어지지 않았습니다.
 쿠키를 허용한 것을 확인한 후에 다시 시도해 보십시오.',
 'noname' => '사용자 이름이 올바르지 않습니다.',
 'loginsuccesstitle' => '로그인 성공',
-'loginsuccess' => "'''{{SITENAME}}에 ‘$1’ 계정으로 로그인했습니다.'''",
+'loginsuccess' => "'''{{SITENAME}}에 \"\$1\" 계정으로 로그인했습니다.'''",
 'nosuchuser' => '"$1" 사용자가 존재하지 않습니다.
 사용자 이름은 대소문자를 구별합니다. 철자가 맞는지 확인해주세요.
 [[Special:UserLogin/signup|새 계정을 만들 수도 있습니다]].',
-'nosuchusershort' => '이름이 ‘$1’인 사용자는 없습니다. 철자가 맞는지 확인해 주세요.',
+'nosuchusershort' => '이름이 "$1"인 사용자는 없습니다.
+철자가 맞는지 확인하세요.',
 'nouserspecified' => '사용자 이름을 입력하지 않았습니다.',
 'login-userblocked' => '이 사용자는 차단되었습니다. 로그인할 수 없습니다.',
-'wrongpassword' => '입력한 비밀번호가 다릅니다. 다시 시도해 주세요.',
-'wrongpasswordempty' => '비밀번호를 쓰지 않았습니다.
+'wrongpassword' => '입력한 비밀번호가 다릅니다.
+다시 시도해 주세요.',
+'wrongpasswordempty' => '비밀번호를 입력하지 않았습니다.
 다시 시도해 주세요.',
 'passwordtooshort' => '비밀번호는 $1 문자 이상이어야 합니다.',
 'password-name-match' => '비밀번호는 사용자 이름과 반드시 달라야 합니다.',
@@ -786,61 +816,69 @@ $2',
 'mailmypassword' => '새 비밀번호를 이메일로 보내기',
 'passwordremindertitle' => '{{SITENAME}}의 새 임시 비밀번호',
 'passwordremindertext' => '$1 IP 주소에서 누군가가 아마 자신이 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.
-‘$2’ 사용자의 임시 비밀번호는 ‘$3’로 설정되었습니다. 이것이 자신이 의도한 바라면 지금 로그인하여 새로운 비밀번호를 만드십시오.
-당신의 임시 비밀번호는 $5일 후에 무효화됩니다.
-
-이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면 이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.',
-'noemail' => '‘$1’ 사용자는 이메일 주소를 등록하지 않았습니다.',
-'noemailcreate' => '바른 이메일 주소를 써야 합니다.',
-'passwordsent' => '‘$1’ 계정의 새로운 비밀번호를 이메일로 보냈습니다. 비밀번호를 받고 다시 로그인해 주세요.',
+"$2" 사용자의 임시 비밀번호는 "$3"로 설정되었습니다. 이것이 자신이 의도한 바라면
+지금 로그인하여 새로운 비밀번호를 만드세요.
+당신의 임시 비밀번호는 $5일 후에 만료됩니다.
+
+이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면
+이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.',
+'noemail' => '"$1" 사용자는 이메일 주소를 등록하지 않았습니다.',
+'noemailcreate' => '바른 이메일 주소를 제공해야 합니다.',
+'passwordsent' => '"$1" 계정의 새로운 비밀번호를 이메일로 보냈습니다.
+비밀번호를 받고 다시 로그인해 주세요.',
 'blocked-mailpassword' => '당신의 IP 주소는 편집을 할 수 없게 차단되어 있어서 악용하지 못하도록 비밀번호 되살리기 기능 사용이 금지됩니다.',
-'eauthentsent' => '확인 이메일을 보냈습니다. 이메일 내용의 지시대로 계정 확인 절차를 실행해 주십시오.',
-'throttled-mailpassword' => '비밀번호 확인 이메일을 이미 최근 $1 시간 안에 보냈습니다. 악용을 방지하기 위해 비밀번호 확인 메일은 $1 시간마다 오직 하나씩만 보낼 수 있습니다.',
+'eauthentsent' => '입력한 이메일로 확인 이메일을 보냈습니다.
+게정에서 다른 이메일로 보내기 전에 이메일 내용의 지시대로 계정 확인 절차를 실행해 주십시오.',
+'throttled-mailpassword' => '비밀번호 확인 이메일을 이미 최근 $1시간 안에 보냈습니다.
+악용을 방지하기 위해 비밀번호 확인 메일은 $1시간마다 오직 하나씩만 보낼 수 있습니다.',
 'mailerror' => '메일 보내기 오류: $1',
-'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 계정을 $1개 생성하여, 계정 생성 한도를 초과하였습니다.
+'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 계정을 $1개 만들어, 계정 만들기 한도를 초과하였습니다.
 따라서 지금은 이 IP 주소로는 더 이상 계정을 만들 수 없습니다.',
 'emailauthenticated' => '당신의 이메일 주소는 $2 $3에 인증되었습니다.',
-'emailnotauthenticated' => '이메일 주소를 인증하지 않았습니다. 이메일 확인 절차를 거치지 않으면 다음 이메일 기능을 사용할 수 없습니다.',
-'noemailprefs' => '이 기능을 사용하기 위해서는 환경설정에서 이메일 주소를 설정해야 합니다.',
+'emailnotauthenticated' => '이메일 주소를 인증하지 않았습니다.
+이메일 확인 절차를 거치지 않으면 다음 이메일 기능을 사용할 수 없습니다.',
+'noemailprefs' => '이 기능을 사용하기 위해서는 사용자 환경 설정에서 이메일 주소를 설정해야 합니다.',
 'emailconfirmlink' => '이메일 주소 확인',
 'invalidemailaddress' => '이메일 주소의 형식이 잘못되어 인식할 수 없습니다.
 정상적인 형식의 이메일을 입력하거나 칸을 비워 주세요.',
 'cannotchangeemail' => '이 위키에서는 계정의 이메일 주소를 바꿀 수 없습니다.',
 'emaildisabled' => '이 사이트에서는 이메일을 보낼 수 없습니다.',
 'accountcreated' => '계정 만들어짐',
-'accountcreatedtext' => '‘$1’ 사용자 계정이 만들어졌습니다.',
+'accountcreatedtext' => '"$1" 사용자 계정이 만들어졌습니다.',
 'createaccount-title' => '{{SITENAME}} 계정 만들기',
-'createaccount-text' => '누군가가 {{SITENAME}} ($4)에서 계정 이름 ‘$2’, 비밀번호 ‘$3’로 당신의 이메일 주소가 등록된 계정을 만들었습니다. 지금 로그인하여 비밀번호를 바꾸십시오.
+'createaccount-text' => '누군가가 {{SITENAME}} ($4)에서 사용자 이름 "$2", 비밀번호 "$3"로 당신의 이메일 주소가 등록된 계정을 만들었습니다. 
+지금 로그인하여 비밀번호를 바꾸십시오.
 
 실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.',
-'usernamehasherror' => '계정 이름에는 해시 문자가 들어가서는 안 됩니다.',
+'usernamehasherror' => '사용자 이름에는 해시 문자가 들어갈 수 없습니다.',
 'login-throttled' => '로그인에 연속으로 실패하였습니다.
 잠시 후에 다시 시도해주세요.',
 'login-abort-generic' => '로그인에 실패했습니다 - 중지됨',
 'loginlanguagelabel' => '언어: $1',
-'suspicious-userlogout' => 'ë¸\8cë\9d¼ì\9a°ì \80ì\9d\98 이상이 있거나 캐싱 프록시에서 로그아웃을 요청했기 때문에 로그아웃이 거부되었습니다.',
+'suspicious-userlogout' => 'ë¸\8cë\9d¼ì\9a°ì \80ì\97\90 이상이 있거나 캐싱 프록시에서 로그아웃을 요청했기 때문에 로그아웃이 거부되었습니다.',
 
 # E-mail sending
 'php-mail-error-unknown' => 'PHP의 mail() 함수에서 알 수 없는 오류가 발생했습니다.',
-'user-mail-no-addy' => '받는 이의 이메일 주소가 없다면 이메일을 보낼 수 없습니다.',
+'user-mail-no-addy' => '받는이의 이메일 주소가 없으면 이메일을 보낼 수 없습니다.',
 
 # Change password dialog
 'resetpass' => '비밀번호 바꾸기',
-'resetpass_announce' => '이메일로 받은 임시 비밀번호로 로그인했습니다. 로그인을 마치려면 새 비밀번호를 여기에서 설정해야 합니다:',
+'resetpass_announce' => '이메일로 받은 임시 비밀번호로 로그인했습니다.
+로그인을 마치려면 새 비밀번호를 여기에서 설정해야 합니다:',
 'resetpass_text' => '<!-- 여기에 텍스트를 추가하세요 -->',
-'resetpass_header' => 'ë¹\84ë°\80ë²\88í\98¸ ë³\80ê²½',
+'resetpass_header' => 'ë¹\84ë°\80ë²\88í\98¸ ë°\94꾸기',
 'oldpassword' => '이전 비밀번호:',
 'newpassword' => '새 비밀번호:',
 'retypenew' => '새 비밀번호 재입력:',
 'resetpass_submit' => '비밀번호를 설정하고 로그인하기',
-'resetpass_success' => '비밀번호를 변경했습니다!
-이제...사용하십시오.',
-'resetpass_forbidden' => '비밀번호 변경 불가',
+'resetpass_success' => '비밀번호를 성공적으로 바꿨습니다!
+이제 로그인을 합니다...',
+'resetpass_forbidden' => '비밀번호를 바꿀 수 없음',
 'resetpass-no-info' => '이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.',
-'resetpass-submit-loggedin' => 'ë¹\84ë°\80ë²\88í\98¸ ë³\80ê²½',
+'resetpass-submit-loggedin' => 'ë¹\84ë°\80ë²\88í\98¸ ë°\94꾸기',
 'resetpass-submit-cancel' => '취소',
 'resetpass-wrong-oldpass' => '비밀번호가 잘못되었거나 현재의 비밀번호와 같습니다.
\8b¹ì\8b ì\9d\80 ì\9d´ë¯¸ ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\84±ê³µì \81ì\9c¼ë¡\9c ë³\80ê²½í\95\98ì\98\80거나 새 임시 비밀번호를 발급받았을 수 있습니다.',
\8b¹ì\8b ì\9d\80 ì\9d´ë¯¸ ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\84±ê³µì \81ì\9c¼ë¡\9c ë°\94꾸ì\97\88거나 새 임시 비밀번호를 발급받았을 수 있습니다.',
 'resetpass-temp-password' => '임시 비밀번호:',
 
 # Special:PasswordReset
@@ -848,40 +886,44 @@ $2',
 'passwordreset-text' => '이메일을 통해 계정 정보를 받을 수 있습니다. 아래의 칸을 채워주세요.',
 'passwordreset-legend' => '비밀번호 재설정',
 'passwordreset-disabled' => '이 위키에서는 비밀번호를 재설정할 수 없습니다.',
-'passwordreset-pretext' => '{{PLURAL:$1||ì\95\84ë\9e\98ì\97\90 í\95\9c ê°\80ì§\80 ì \95보를 ì\9e\85ë ¥í\95´ì£¼ì\8b­ì\8b\9cì\98¤}}',
-'passwordreset-username' => '계정 이름:',
+'passwordreset-pretext' => '{{PLURAL:$1||ì\95\84ë\9e\98ì\97\90 í\95\9c ê°\80ì§\80 ì \95보를 ì\9e\85ë ¥í\95\98ì\84¸ì\9a\94}}',
+'passwordreset-username' => '사용자 이름:',
 'passwordreset-domain' => '도메인:',
 'passwordreset-capture' => '발송 결과 이메일을 보시겠습니까?',
 'passwordreset-capture-help' => '이 상자에 체크하면 이메일이 발송된 즉시 임시 비밀번호가 담긴 이메일을 볼 수 있습니다.',
 'passwordreset-email' => '이메일 주소:',
-'passwordreset-emailtitle' => '{{SITENAME}} 계정 상세 정보',
-'passwordreset-emailtext-ip' => 'IP 주소 $1을 사용하는 누군가(아마도 당신이), {{SITENAME}} ($4)의 비밀번호 찾기를 요청하였습니다. 이 이메일 주소와 연관된 계정의 목록입니다:
+'passwordreset-emailtitle' => '{{SITENAME}} 계정 자세한 정보',
+'passwordreset-emailtext-ip' => 'IP 주소 $1을 사용하는 누군가(아마도 당신이), {{SITENAME}} ($4)의 비밀번호 찾기를 요청하였습니다.
+이 이메일 주소와 연관된 계정의 목록입니다:
 
 $2
 
-이 {{PLURAL:$3|임시 비밀번호}}의 효력은 $5일 후 만료됩니다.
-이 비밀번호로 로그인한 후 비밀번호를 변경하십시오. 만약 당신이 아닌 다른 사람이 요청하였거나, 원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고 이전의 비밀번호를 계속 사용할 수 있습니다.',
-'passwordreset-emailtext-user' => '{{SITENAME}} ($4)의 사용자 $1이 비밀번호 찾기를 요청하였습니다. 이 이메일 주소와 연관된 계정의 목록입니다:
+이 {{PLURAL:$3|임시 비밀번호}}는 $5일 후에 만료됩니다.
+이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,
+원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고 이전의 비밀번호를 계속 사용할 수 있습니다.',
+'passwordreset-emailtext-user' => '{{SITENAME}} ($4)의 사용자 $1이 비밀번호 찾기를 요청하였습니다.
+이 이메일 주소와 연관된 계정의 목록입니다:
 
 $2
 
-이 {{PLURAL:$3|임시 비밀번호}}의 효력은 $5일 후 만료됩니다.
-이 비밀번호로 로그인한 후 비밀번호를 변경하십시오. 만약 당신이 아닌 다른 사람이 요청하였거나, 원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고 이전의 비밀번호를 계속 사용할 수 있습니다.',
-'passwordreset-emailelement' => '계정 이름: $1
+이 {{PLURAL:$3|임시 비밀번호}}는 $5일 후에 만료됩니다.
+이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,
+원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고 이전의 비밀번호를 계속 사용할 수 있습니다.',
+'passwordreset-emailelement' => '사용자 이름: $1
 임시 비밀번호: $2',
 'passwordreset-emailsent' => '비밀번호 찾기 이메일을 보냈습니다.',
-'passwordreset-emailsent-capture' => '비밀번호 찾기 이메일이 발송되었으며, 아래에 표시되어 있습니다.',
-'passwordreset-emailerror-capture' => '비밀번호 찾기 이메일이 생성되어 아래에 표시되었지만 발송하는 데에는 실패했습니다: $1',
+'passwordreset-emailsent-capture' => '비밀번호 찾기 이메일이 발송되었으며, 아래에 나타나 있습니다.',
+'passwordreset-emailerror-capture' => '비밀번호 찾기 이메일이 만들어져 아래에 나타났지만 발송하는 데에는 실패했습니다: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'E-mail 주소 변경',
-'changeemail-header' => 'ê³\84ì \95 ë©\94ì\9d¼ ì£¼ì\86\8c ë³\80ê²½',
-'changeemail-text' => 'ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ë°\94꾸려면 ì\9d´ ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c주ì\8b­ì\8b\9cì\98¤. ë³\80ê²½ ë\82´ì\9a©ì\9d\84 í\99\95ì\9d¸í\95\98기 ì\9c\84í\95´ ë\8b¹ì\8b ì\9d\98 ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\9e\85ë ¥í\95´ì\95¼합니다.',
+'changeemail' => '이메일 주소 바꾸기',
+'changeemail-header' => 'ê³\84ì \95 ë©\94ì\9d¼ ì£¼ì\86\8c ë°\94꾸기',
+'changeemail-text' => 'ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ë°\94꾸려면 ì\9d´ ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9a°ì\84¸ì\9a\94. ë°\94ë\80\9c ë\82´ì\9a©ì\9d\84 í\99\95ì\9d¸í\95\98기 ì\9c\84í\95´ ë\8b¹ì\8b ì\9d\98 ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\9e\85ë ¥í\95´ì\95¼ 합니다.',
 'changeemail-no-info' => '이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.',
-'changeemail-oldemail' => '현재 E-mail 주소 :',
+'changeemail-oldemail' => '현재 이메일 주소 :',
 'changeemail-newemail' => '새 이메일 주소:',
 'changeemail-none' => '(없음)',
-'changeemail-submit' => 'ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c ë³\80ê²½',
+'changeemail-submit' => 'ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c ë°\94꾸기',
 'changeemail-cancel' => '취소',
 
 # Edit page toolbar
@@ -892,7 +934,7 @@ $2
 'link_sample' => '링크 제목',
 'link_tip' => '내부 링크',
 'extlink_sample' => 'http://www.example.com 사이트 이름',
-'extlink_tip' => '외부 사이트 링크 (주소 앞에 http://가 있어야 합니다.)',
+'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다.)',
 'headline_sample' => '제목',
 'headline_tip' => '2단계 문단 제목',
 'nowiki_sample' => '여기에 위키 문법을 사용하지 않을 글을 적어 주세요',
@@ -900,7 +942,7 @@ $2
 'image_tip' => '파일 넣기',
 'media_tip' => '파일 링크하기',
 'sig_tip' => '내 서명과 현재 시각',
-'hr_tip' => '가로(되도록 사용하지 말아 주세요)',
+'hr_tip' => '가로 줄 (되도록 사용하지 말아 주세요)',
 
 # Edit pages
 'summary' => '편집 요약:',
@@ -912,24 +954,28 @@ $2
 'showpreview' => '미리 보기',
 'showlivepreview' => '실시간 미리 보기',
 'showdiff' => '차이 보기',
-'anoneditwarning' => "'''주의''': 로그인하고 있지 않습니다. 당신의 IP 주소가 문서 역사에 남게 됩니다.",
+'anoneditwarning' => "'''경고''': 로그인하고 있지 않습니다.
+당신의 IP 주소가 문서 역사에 남게 됩니다.",
 'anonpreviewwarning' => "'''당신은 지금 로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서 역사에 남게 됩니다.'''",
-'missingsummary' => "'''알림:''' 편집 요약을 적지 않았습니다. 그대로 저장하면 편집 요약 없이 저장됩니다.",
+'missingsummary' => "'''알림:''' 편집 요약을 적지 않았습니다.
+이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
 'missingcommenttext' => '아래에 내용을 채워 넣어 주세요.',
 'missingcommentheader' => "'''알림:''' 글의 제목을 입력하지 않았습니다.
-다시 {{int:savearticle}} 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
+다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
 'summary-preview' => '편집 요약 미리 보기:',
 'subject-preview' => '주제/제목 미리 보기:',
 'blockedtitle' => '차단됨',
 'blockedtext' => "'''당신의 계정 혹은 IP 주소가 차단되었습니다.'''
 
-차단한 사람은 $1이고, 차단한 이유는 다음과 같습니다: $2
+차단한 사람은 $1입니다.
+차단한 이유는 다음과 같습니다: $2
 
 * 차단이 시작된 시간: $8
 * 차단이 끝나는 시간: $6
 * 차단된 사용자: $7
 
-$1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다. [[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.
+$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.
+[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.
 지금 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.
 문의할 때에 이 정보를 같이 알려주세요.",
 'autoblockedtext' => "당신의 IP 주소는 $1이 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다. 차단된 이유는 다음과 같습니다:
@@ -940,7 +986,7 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 * 차단이 끝나는 시간: $6
 * 차단된 사용자: $7
 
-$1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.
+$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.
 
 [[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.
 
@@ -948,59 +994,78 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 문의할 때에 이 정보를 같이 알려주세요.",
 'blockednoreason' => '이유를 입력하지 않음',
 'whitelistedittext' => '문서를 편집하려면 $1해야 합니다.',
-'confirmedittext' => '문서를 고치려면 이메일 인증 절차가 필요합니다. [[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해 주시기 바랍니다.',
-'nosuchsectiontitle' => '칸을 찾을 수 없음',
-'nosuchsectiontext' => '존재하지 않는 칸을 편집하려 했습니다.
-이 문서를 보는 동안 칸이 이동되었거나 삭제되었을 수 있습니다.',
+'confirmedittext' => '문서를 고치려면 이메일 인증 절차가 필요합니다.
+[[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해주시기 바랍니다.',
+'nosuchsectiontitle' => '문단을 찾을 수 없음',
+'nosuchsectiontext' => '존재하지 않는 문단을 편집하려 했습니다.
+이 문서를 보는 동안 문단이 이동되었거나 삭제되었을 수 있습니다.',
 'loginreqtitle' => '로그인 필요',
 'loginreqlink' => '로그인',
 'loginreqpagetext' => '다른 문서를 보기 위해서는 $1해야 합니다.',
 'accmailtitle' => '비밀번호를 보냈습니다.',
 'accmailtext' => '[[User talk:$1|$1]] 사용자의 비밀번호가 임의로 만들어져 $2로 전송되었습니다.
 
\83\88 ë¹\84ë°\80ë²\88í\98¸ë\8a\94 ë¡\9cê·¸ì\9d¸í\95\9c í\9b\84 [[Special:ChangePassword|ë³\80ê²½]]í\95  수 있습니다.',
\83\88 ë¹\84ë°\80ë²\88í\98¸ë\8a\94 ë¡\9cê·¸ì\9d¸í\95\9c í\9b\84 [[Special:ChangePassword|ë¹\84ë°\80ë²\88í\98¸ë¥¼ ë°\94ê¿\80]] 수 있습니다.',
 'newarticle' => '(새 문서)',
-'newarticletext' => "이 문서는 아직 만들어지지 않았습니다. 새 문서를 만들려면 아래의 상자에 문서 내용을 입력하면 됩니다(자세한 내용은 [[{{MediaWiki:Helppage}}|도움말]]을 읽어 주세요).
-만약 잘못 찾아온 문서라면, 웹 브라우저의 '''뒤로''' 버튼을 눌러 주세요.",
+'newarticletext' => "이 문서는 아직 만들어지지 않았습니다.
+새 문서를 만들려면 아래의 상자에 문서 내용을 입력하면 됩니다(자세한 내용은 [[{{MediaWiki:Helppage}}|도움말]]을 읽어 주세요).
+만약 잘못 찾아온 문서라면 웹 브라우저의 '''뒤로''' 버튼을 눌러 주세요.",
 'anontalkpagetext' => '----
-여기는 계정을 만들지 않았거나 사용하고 있지 않은 비등록 사용자를 위한 토론 문서입니다. 비등록 사용자를 구별하기 위해서는 숫자로 된 IP 주소를 사용해야만 합니다. IP 주소는 여러 사용자가 공유할 수 있습니다. 자신과 관계없는 의견이 자신에게 남겨져 있어 불쾌하다고 생각하는 비등록 사용자는 [[Special:UserLogin/signup|계정을 만들고]] [[Special:UserLogin|로그인 하여]] 나중에 다른 비등록 사용자에게 줄 혼란을 줄일 수 있습니다.',
+여기는 계정을 만들지 않았거나 사용하고 있지 않은 익명 사용자를 위한 토론 문서입니다.
+익명 사용자를 구별하기 위해서는 숫자로 된 IP 주소를 사용해야만 합니다.
+IP 주소는 여러 사용자가 공유할 수 있습니다.
+자신과 관계없는 의견이 자신에게 남겨져 있어 불쾌하다고 생각하는 익명 사용자는 [[Special:UserLogin/signup|계정을 만들고]] [[Special:UserLogin|로그인 하여]] 나중에 다른 익명 사용자에게 줄 혼란을 줄일 수 있습니다.',
 'noarticletext' => '이 문서가 존재하지 않습니다.
-이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|검색]]하거나, 이 문서에 관련된 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인하거나, 문서를 직접 [{{fullurl:{{FULLPAGENAME}}|action=edit}} 편집]</span>할 수 있습니다.',
-'noarticletext-nopermission' => '‘{{FULLPAGENAME}}’ 문서가 존재하지 않습니다.
-이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|검색]]하거나, 이 문서에 관련된 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인할 수 있습니다.</span>',
-'userpage-userdoesnotexist' => '‘<nowiki>$1</nowiki>’ 계정은 등록되어 있지 않습니다. 이 문서를 만들거나 편집하려면 계정이 존재 하는지 확인해주세요.',
+이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|찾거나]],
+이 문서에 관련된 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인하거나,
+문서를 직접 [{{fullurl:{{FULLPAGENAME}}|action=edit}} 편집]</span>할 수 있습니다.',
+'noarticletext-nopermission' => '이 문서가 존재하지 않습니다.
+이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|찾거나]],
+이 문서에 관련된 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인할 수 있습니다.</span>',
+'missing-revision' => '"{{PAGENAME}}"이라는 문서의 #$1판이 존재하지 않습니다.
+
+이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 역사 링크로 인해 발생합니다.
+자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.',
+'userpage-userdoesnotexist' => '"$1" 계정은 등록되어 있지 않습니다.
+이 문서를 만들거나 편집하려면 계정이 존재 하는지 확인해주세요.',
 'userpage-userdoesnotexist-view' => '"$1" 사용자 계정은 등록되지 않았습니다.',
 'blocked-notice-logextract' => '이 사용자는 현재 차단되어 있습니다.
 해당 사용자의 최근 차단 기록을 참고하십시오:',
-'clearyourcache' => "'''참고:''' 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 갱신해야 합니다.
+'clearyourcache' => "'''참고:''' 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.
 * '''파이어폭스 / 사파리''': ''Shift'' 키를 누르면서 새로 고침을 클릭하거나, ''Ctrl-F5'' 또는 ''Ctrl-R'' 을 입력 (Mac에서는 ''⌘-R'')
 * '''구글 크롬''': ''Ctrl-Shift-R''키를 입력 (Mac에서는 ''⌘-Shift-R'')
 * '''인터넷 익스플로러''': ''Ctrl'' 키를 누르면서 새로 고침을 클릭하거나, ''Ctrl-F5''를 입력.
-* '''컨커러''': ''새로고침''을 클릭하거나 ''F5''를 입력
-* '''오페라''': 도구→설정에서 캐시를 비움",
-'usercssyoucanpreview' => "'''안내''': CSS 문서를 저장하기 전에 ‘{{int:showpreview}}’ 기능을 통해 작동을 확인해주세요.",
-'userjsyoucanpreview' => "'''안내''': JS 문서를 저장하기 전에 ‘{{int:showpreview}}’ 기능을 통해 작동을 확인해주세요.",
-'usercsspreview' => "'''이것은 사용자 CSS의 미리 보기이며, 아직 저장하지 않았다는 것을 주의해 주세요!'''",
-'userjspreview' => "'''이것은 자바스크립트 미리 보기로, 아직 저장하지 않았다는 것을 주의해 주세요!'''",
+* '''오페라''': ''도구→설정''에서 캐시를 비움",
+'usercssyoucanpreview' => "'''안내''': CSS 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
+'userjsyoucanpreview' => "'''안내''': 자바스크립트 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
+'usercsspreview' => "'''이것은 사용자 CSS의 미리 보기입니다.'''
+'''아직 저장하지 않았다는 것을 기억해두세요!'''",
+'userjspreview' => "'''이것은 자바스크립트 미리 보기입니다'''
+'''아직 저장하지 않았다는 것을 기억해두세요!'''",
 'sitecsspreview' => "'''이것은 이 CSS의 미리 보기일 뿐입니다.'''
-'''아직 저장하지 않았다는 것을 주의해 주세요!'''",
+'''아직 저장하지 않았다는 것을 기억해두세요!'''",
 'sitejspreview' => "'''이것은 이 자바스크립트 코드의 미리 보기일 뿐입니다.'''
-'''아직 저장하지 않았다는 것을 주의해 주세요!'''",
-'userinvalidcssjstitle' => "'''경고''': ‘$1’ 스킨은 없습니다.
+'''아직 저장하지 않았다는 것을 기억해두세요!'''",
+'userinvalidcssjstitle' => "'''경고''': \"\$1\" 스킨은 없습니다.
 .css와 .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
 'updated' => '(바뀜)',
-'note' => "'''주의:'''",
-'previewnote' => "'''이 화면은 미리 보기입니다'''. 편집한 내용은 아직 저장되지 않았습니다!",
+'note' => "'''참고:'''",
+'previewnote' => "'''이 화면은 미리 보기입니다.'''
+편집한 내용은 아직 저장되지 않았습니다!",
 'continue-editing' => '계속 편집하기',
-'previewconflict' => '이 미리 보기는 저장할 때의 모습, 즉 위쪽 편집창의 문서를 반영합니다.',
-'session_fail_preview' => "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.
-다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인해 보십시오.'''",
+'previewconflict' => '이 미리 보기는 저장할 때의 모습으로 위쪽 편집창의 문서를 반영합니다.',
+'session_fail_preview' => "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.'''
+다시 시도하세요.
+다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인하세요.",
 'session_fail_preview_html' => "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.'''
 
 {{SITENAME}}에서 HTML 입력을 허용하기 때문에, 자바스크립트 공격을 막기 위해 미리 보기는 숨겨져 있습니다.
 
-'''다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인을 해 보십시오.'''",
-'token_suffix_mismatch' => "'''저장하려는 내용의 문장 부호가 망가져 있습니다. 문서 보호를 위해 해당 내용을 저장하지 않습니다. 버그가 있는 익명 프록시 서비스 등을 사용할 때 이런 문제가 발생할 수 있습니다.'''",
+'''적합하게 편집을 시도했다면 다시 시도하세요'''
+다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인하세요.",
+'token_suffix_mismatch' => "'''저장하려는 내용의 문장 부호가 망가져 있습니다.'''
+문서 보호를 위해 해당 내용을 저장하지 않습니다.
+버그가 있는 익명 프록시 서비스 등을 사용할 때 이런 문제가 발생할 수 있습니다.",
 'edit_form_incomplete' => "'''편집의 일부 내용이 서버에 전달되지 않았습니다. 당신의 편집이 손상되지 않았는지 확인하고 다시 시도해 주십시오.'''",
 'editing' => '$1 편집하기',
 'creating' => '$1 만들기',
@@ -1013,57 +1078,61 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 \"{{int:savearticle}}\"을 누르면 '''위쪽의 편집 내역만''' 저장됩니다.",
 'yourtext' => '당신의 편집',
 'storedversion' => '현재 문서',
-'nonunicodebrowser' => "'''주의: 당신의 웹 브라우저가 유니코드를 완벽하게 지원하지 않습니다. 몇몇 문자가 16진수 코드로 나타날 수 있습니다.'''",
-'editingold' => "'''경고:
-지금 옛날 버전의 문서를 고치고 있습니다.
-이것을 저장하면 최근에 편집된 부분이 사라질 수 있습니다.'''",
+'nonunicodebrowser' => "'''경고: 당신의 웹 브라우저가 유니코드를 완벽하게 지원하지 않습니다.'''
+아스키가 아닌 문자가 16진수 코드로 나타날 수 있습니다.",
+'editingold' => "'''경고: 지금 이전 버전의 문서를 고치고 있습니다.'''
+이것을 저장하면 최근에 편집된 부분이 사라질 수 있습니다.",
 'yourdiff' => '차이',
-'copyrightwarning' => "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />
+'copyrightwarning' => "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).
+만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />
 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
 '''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
-'copyrightwarning2' => "{{SITENAME}}에서의 모든 기여는 다른 사용자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />
+'copyrightwarning2' => "{{SITENAME}}에서의 모든 기여는 다른 사용자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.
+만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />
 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 내용에 대해서는 $1 문서를 읽어 주세요).
 '''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
 'longpageerror' => "'''오류: 문서의 크기가 {{PLURAL:$1|$1킬로바이트}}로 최대 크기인 {{PLURAL:$2|$2킬로바이트}}보다 큽니다.'''
 저장할 수 없습니다.",
-'readonlywarning' => "'''주의: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.
-편집 내용을 복사 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.'''
+'readonlywarning' => "'''경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.'''
+편집 내용을 복사 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.
 
 잠근 관리자가 남긴 설명은 다음과 같습니다: $1",
 'protectedpagewarning' => "'''경고: 이 문서는 관리자만 편집할 수 있도록 보호되어 있습니다.'''
 이 문서의 최근 기록을 참고하십시오:",
-'semiprotectedpagewarning' => "'''ì\95\88ë\82´:''' 이 문서는 계정을 등록한 사용자만이 편집할 수 있도록 잠겨 있습니다.
+'semiprotectedpagewarning' => "'''참고:''' 이 문서는 계정을 등록한 사용자만이 편집할 수 있도록 잠겨 있습니다.
 이 문서의 최근 기록을 참고하십시오:",
-'cascadeprotectedwarning' => "'''주의''': 이 문서는 잠겨 있어 관리자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
-'titleprotectedwarning' => "'''경고: 이 문서는 잠겨 있어, 문서를 생성하려면 [[Special:ListGroupRights|특정 권한]]이 필요합니다.'''
+'cascadeprotectedwarning' => "'''경고''': 이 문서는 잠겨 있어 관리자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
+'titleprotectedwarning' => "'''경고: 이 문서는 잠겨 있어, 문서를 만드려면 [[Special:ListGroupRights|특정 권한]]이 필요합니다.'''
 아래 문서의 최근 기록을 참고하십시오:",
 'templatesused' => '이 문서에서 사용한 {{PLURAL:$1|틀}}:',
 'templatesusedpreview' => '이 미리 보기에서 사용하고 있는 {{PLURAL:$1|틀}}:',
-'templatesusedsection' => '이 에서 사용하고 있는 {{PLURAL:$1|틀}}:',
+'templatesusedsection' => '이 문단에서 사용하고 있는 {{PLURAL:$1|틀}}:',
 'template-protected' => '(보호됨)',
 'template-semiprotected' => '(준보호됨)',
-'hiddencategories' => '이 문서는 다음 숨은 분류 $1 개에 속해 있습니다:',
+'hiddencategories' => '이 문서는 다음 숨은 분류 $1개에 속해 있습니다:',
 'edittools' => '<!-- 이 문서는 편집 창과 파일 올리기 창에 출력됩니다. -->',
-'nocreatetitle' => '문서 생성 제한',
-'nocreatetext' => '{{SITENAME}}에서 새로운 문서를 생성하는 것은 제한되어 있습니다. 이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들 수 있습니다]].',
+'nocreatetitle' => '문서 만들기 제한',
+'nocreatetext' => '{{SITENAME}}에서 새로운 문서를 만드는 것은 제한되어 있습니다.
+이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들 수 있습니다]].',
 'nocreate-loggedin' => '새 문서를 만들 권한이 없습니다.',
 'sectioneditnotsupported-title' => '부분 편집 지원 안됨',
 'sectioneditnotsupported-text' => '이 문서에서는 문단 편집을 지원하지 않습니다.',
 'permissionserrors' => '권한 오류',
 'permissionserrorstext' => '해당 명령을 수행할 권한이 없습니다. 다음의 {{PLURAL:$1|이유}}를 확인해보세요:',
 'permissionserrorstext-withaction' => '$2 권한이 없습니다. 다음의 {{PLURAL:$1|이유}}를 확인해주세요:',
-'recreate-moveddeleted-warn' => "'''주의: 삭제된 적이 있는 문서를 다시 만들고 있습니다.'''
+'recreate-moveddeleted-warn' => "'''경고: 삭제된 적이 있는 문서를 다시 만들고 있습니다.'''
 
 이 문서를 계속 편집하는 것이 적합한 것인지 확인해주세요.
 편의를 위해 삭제와 이동 기록을 다음과 같이 제공합니다:",
-'moveddeleted-notice' => '이 문서는 삭제되었습니다. 이 문서의 삭제/이동 기록은 다음과 같습니다.',
+'moveddeleted-notice' => '이 문서는 삭제되었습니다.
+이 문서의 삭제 및 이동 기록은 다음과 같습니다.',
 'log-fulllog' => '전체 기록 보기',
 'edit-hook-aborted' => '훅에 의해 편집이 중단되었습니다.
 아무런 설명도 주어지지 않았습니다.',
 'edit-gone-missing' => '문서를 저장하지 못했습니다.
 문서가 삭제된 것 같습니다.',
 'edit-conflict' => '편집 충돌.',
-'edit-no-change' => '문서에 아무런 변화가 없기 때문에, 당신의 편집은 무시되었습니다.',
+'edit-no-change' => '문서에 아무런 변화가 없기 때문에 당신의 편집은 무시되었습니다.',
 'edit-already-exists' => '새 문서를 만들 수 없습니다.
 그 문서는 이미 존재합니다.',
 'defaultmessagetext' => '기본 메세지 내용',
@@ -1073,11 +1142,11 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 
 $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'expensive-parserfunction-category' => '느린 파서 함수 호출을 너무 많이 하는 문서',
-'post-expand-template-inclusion-warning' => '경고: 틀 포함 크기가 너무 큽니다.
-일부 틀은 포함되지 않을 수 있습니다.',
+'post-expand-template-inclusion-warning' => "'''경고:''' 틀 포함 크기가 너무 큽니다.
+일부 틀은 포함되지 않을 수 있습니다.",
 'post-expand-template-inclusion-category' => '사용한 틀의 크기가 지나치게 큰 문서의 목록',
 'post-expand-template-argument-warning' => "'''경고:''' 이 문서는 전개 후 크기가 너무 큰 틀 변수가 하나 이상 포함되어 있습니다.
\9d´ ë³\80ì\88\98ë\93¤ì\9d\80 ì\83\9dë\9eµë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.",
\9d´ ë³\80ì\88\98ë\8a\94 ì\83\9dë\9eµí\96\88ì\8aµë\8b\88ë\8b¤.",
 'post-expand-template-argument-category' => '생략된 틀 변수를 포함한 문서',
 'parser-template-loop-warning' => '재귀적인 틀이 발견되었습니다: [[$1]]',
 'parser-template-recursion-depth-warning' => '틀 반복 횟수 제한을 초과함($1)',
@@ -1086,18 +1155,20 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'node-count-exceeded-warning' => '페이지가 노드 수를 초과하였습니다.',
 'expansion-depth-exceeded-category' => '페이지가 확장 깊이를 초과하였습니다.',
 'expansion-depth-exceeded-warning' => '페이지가 확장 깊이를 초과하였습니다',
-'parser-unstrip-loop-warning' => 'ì\8a¤í\8a¸ë¦½í\95\98ì§\80 ì\95\8aë\8a\94 ë°\98ë³µì\9d´ ê°\90ì§\80ë\90¨',
+'parser-unstrip-loop-warning' => 'ì\8a¤í\8a¸ë¦½í\95\98ì§\80 ì\95\8aë\8a\94 ë°\98ë³µì\9d´ ê°\90ì§\80ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤',
 'parser-unstrip-recursion-limit' => '스트립하지 않는 재귀 한도가 초과됨 ($1)',
+'converter-manual-rule-error' => '언어 변환 규칙을 수동으로 지정하는 도중 오류',
 
 # "Undo" feature
-'undo-success' => '이 편집을 되돌리려면 아래의 변경되는 사항을 확인한 후 저장해주세요.',
+'undo-success' => '편집을 되돌릴 수 있습니다.
+편집 되돌리기를 완료하려면 이 편집을 되돌리려면 아래의 바뀜 사항을 확인한 후 저장해주세요.',
 'undo-failure' => '중간의 다른 편집과 충돌하여 이 편집을 되돌릴 수 없습니다.',
-'undo-norev' => '문서가 없거나 삭제되었기 때문에, 편집을 되돌릴 수 없습니다.',
+'undo-norev' => '문서가 없거나 삭제되었기 때문에 편집을 되돌릴 수 없습니다.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]]) 의 $1판 편집을 되돌림',
 
 # Account creation failure
 'cantcreateaccounttitle' => '계정을 만들 수 없음',
-'cantcreateaccount-text' => "현재 아이피 주소('''$1''')는 [[User:$3|$3]] 사용자에 의해 계정 생성이 차단된 상태입니다.
+'cantcreateaccount-text' => "현재 아이피 주소('''$1''')는 [[User:$3|$3]] 사용자에 의해 계정 만들기가 차단된 상태입니다.
 
 차단 이유는 다음과 같습니다: $2",
 
@@ -1107,7 +1178,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'currentrev' => '최신판',
 'currentrev-asof' => '$1 기준 최신판',
 'revisionasof' => '$1 판',
-'revision-info' => '$2 사용자의 $1 버전',
+'revision-info' => '$2 사용자의 $1 ',
 'previousrevision' => '← 이전 판',
 'nextrevision' => '다음 판 →',
 'currentrevisionlink' => '최신판',
@@ -1117,9 +1188,8 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'page_first' => '처음',
 'page_last' => '마지막',
 'histlegend' => "비교하려는 판을 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />
-설명: '''({{int:cur}})''' = 최신 판과 비교,
-'''({{int:last}})''' = 이전 판과 비교, '''{{int:minoreditletter}}'''= 사소한 편집",
-'history-fieldset-title' => '문서의 변경 내력 찾기',
+설명: '''({{int:cur}})''' = 최신 판과 비교, '''({{int:last}})''' = 이전 판과 비교, '''{{int:minoreditletter}}'''= 사소한 편집",
+'history-fieldset-title' => '문서의 바뀜 내역 찾기',
 'history-show-deleted' => '삭제된 것만',
 'histfirst' => '초기',
 'histlast' => '최신',
@@ -1132,13 +1202,13 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'history-feed-item-nocomment' => '$2에 대한 $1의 편집',
 'history-feed-empty' => '요청한 문서가 존재하지 않습니다.
 해당 문서가 삭제되었거나, 문서 이름이 바뀌었을 수 있습니다.
-[[Special:Search|검색 기능]]을 사용해 관련 문서를 찾아보세요.',
+[[Special:Search|찾기]]를 사용해 관련 문서를 찾아보세요.',
 
 # Revision deletion
 'rev-deleted-comment' => '(편집 요약 삭제됨)',
-'rev-deleted-user' => '(계정 이름 삭제됨)',
-'rev-deleted-event' => '(로그 삭제됨)',
-'rev-deleted-user-contribs' => '[계정 이름/IP 주소 삭제됨 -  기여 목록에서 숨겨짐]',
+'rev-deleted-user' => '(사용자 이름 삭제됨)',
+'rev-deleted-event' => '(기록 동작 삭제됨)',
+'rev-deleted-user-contribs' => '[사용자 이름 또는 IP 주소 삭제됨 -  기여 목록에서 편집이 숨겨짐]',
 'rev-deleted-text-permission' => "해당 편집이 문서 역사에서 '''삭제'''되었습니다.
 자세한 사항은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 볼 수 있습니다.",
 'rev-deleted-text-unhide' => "해당 편집이 문서 역사에서 '''삭제'''되었습니다.
@@ -1148,24 +1218,24 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 자세한 사항은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에서 볼 수 있습니다.
 이 편집을 보기를 원하신다면 [$1 해당 편집]을 볼 수 있습니다.",
 'rev-deleted-text-view' => "이 문서의 편집은 역사에서 '''삭제'''되었습니다.
-삭제된 편집을 볼 수 있으며, [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 자세한 내용을 볼 수 있습니다.",
+삭제된 편집을 볼 수 있으며 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 자세한 내용을 볼 수 있습니다.",
 'rev-suppressed-text-view' => "이 문서의 편집은 역사에서 '''숨겨져''' 있습니다.
-숨겨진 편집을 볼 수 있으며, [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에서 자세한 내용을 볼 수 있습니다.",
+숨겨진 편집을 볼 수 있으며 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에서 자세한 내용을 볼 수 있습니다.",
 'rev-deleted-no-diff' => "특정 판이 문서 역사에서 '''삭제'''되었기 때문에 비교할 수 없습니다.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 자세한 내용을 볼 수 있습니다.",
 'rev-suppressed-no-diff' => "두 판 중 일부가 '''삭제'''되었기 때문에 문서 편집 내용을 비교할 수 없습니다.",
 'rev-deleted-unhide-diff' => "이 비교에 사용된 판 가운데 하나가 '''삭제'''되었습니다.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에 자세한 내용을 찾아볼 수 있습니다.
 계속 작업하고 싶다면 여전히 [$1 비교 보기]를 계속할 수 있습니다.",
-'rev-suppressed-unhide-diff' => "ì\9d´ ë¹\84êµ\90ì\97\90 ì\82¬ì\9a©ë\90\9c í\8c\90 ê°\80ì\9a´ë\8d° í\95\98ë\82\98ê°\80 '''ì\88¨ê¹\80'''ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.
+'rev-suppressed-unhide-diff' => "ì\9d´ ë¹\84êµ\90ì\97\90 ì\82¬ì\9a©ë\90\9c í\8c\90 ê°\80ì\9a´ë\8d° í\95\98ë\82\98ê°\80 '''ì\88¨ê²¨ì ¸''' ì\9e\88ì\8aµë\8b\88ë\8b¤.
 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 숨김 기록]에 자세한 내용이 있을 수 있습니다.
 계속 작업하고 싶다면 [$1 해당 편집]을 볼 수도 있습니다.",
 'rev-deleted-diff-view' => "비교 대상 중 어느 한 판이 '''삭제'''되었습니다.
-삭제된 판과 다른 판의 비교를 할 수 있습니다; ì\9e\90ì\84¸í\95\9c ê²\83ì\9d\80 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ì\82­ì \9c ê¸°ë¡\9d\9d\84 ì°¸ê³ í\95\98ì\8b­ì\8b\9cì\98¤.",
+삭제된 판과 다른 판의 비교를 할 수 있습니다. ì\9e\90ì\84¸í\95\9c ë\82´ì\9a©ì\9d\80 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ì\82­ì \9c ê¸°ë¡\9d\97\90ì\84\9c ì°¾ì\95\84ë³¼ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.",
 'rev-suppressed-diff-view' => "비교하려는 판 중 일부가 '''숨겨져''' 있습니다.
-숨겨진 판과 이 판의 편집 비교가 가능합니다. 자세한 내용은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 해당 숨김 기록]에서 볼 수 있습니다.",
+숨겨진 판과 이 판의 편집 비교를 할 수 있습니다. 자세한 내용은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 해당 숨김 기록]에서 찾아볼 수 있습니다.",
 'rev-delundel' => '보이기/숨기기',
-'rev-showdeleted' => '표시',
+'rev-showdeleted' => '보이기',
 'revisiondelete' => '판 삭제/복구',
 'revdelete-nooldid-title' => '대상 판이 잘못되었습니다.',
 'revdelete-nooldid-text' => '이 기능을 수행할 특정 판을 제시하지 않았거나 해당 판이 없습니다. 또는 현재 판을 숨기려 하고 있을 수도 있습니다.',
@@ -1176,20 +1246,21 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'revdelete-no-file' => '해당 파일이 존재하지 않습니다.',
 'revdelete-show-file-confirm' => '정말 "<nowiki>$1</nowiki>" 파일의 삭제된 $2 $3 버전을 보시겠습니까?',
 'revdelete-show-file-submit' => '예',
-'revdelete-selected' => "'''[[:$1]]의 {{PLURAL:$2|선택ë\90\9c í\8c\90}}:'''",
-'logdelete-selected' => "{{PLURAL:$1}}'''선택한 로그:'''",
+'revdelete-selected' => "'''[[:$1]]의 {{PLURAL:$2|선택í\95\9c í\8c\90}}:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|선택한 기록}}:'''",
 'revdelete-text' => "'''삭제된 판과 기록은 문서 역사와 기록에 계속 나타나지만, 내용은 공개되지 않을 것입니다.'''
 {{SITENAME}}의 다른 관리자는 다른 제한이 설정되어 있지 않는 한, 숨겨진 내용을 볼 수 있고, 같은 도구를 이용해 복구할 수 있습니다.",
 'revdelete-confirm' => '이 작업을 수행하는 것의 결과를 알고 있으며, [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지 확인해주세요.',
 'revdelete-suppress-text' => "숨기기는 '''다음 경우에만''' 사용되어야 합니다:
+* 잠재적인 비방 정보
 * 부적절한 개인 정보
 *: 집 주소, 전화번호, 주민등록번호 등",
 'revdelete-legend' => '보이기 제한을 설정',
 'revdelete-hide-text' => '판의 내용을 숨기기',
 'revdelete-hide-image' => '파일을 숨기기',
-'revdelete-hide-name' => '로그 내용과 대상을 숨기기',
+'revdelete-hide-name' => '기록 내용과 대상을 숨기기',
 'revdelete-hide-comment' => '편집 요약을 숨기기',
-'revdelete-hide-user' => '편집자의 계정 이름/IP를 숨기기',
+'revdelete-hide-user' => '편집자의 사용자 이름/IP를 숨기기',
 'revdelete-hide-restricted' => '관리자도 보지 못하게 숨기기',
 'revdelete-radio-same' => '(바꾸지 않음)',
 'revdelete-radio-set' => '예',
@@ -1198,13 +1269,13 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'revdelete-unsuppress' => '복구된 판에 대한 제한을 해제',
 'revdelete-log' => '이유:',
 'revdelete-submit' => '선택한 {{PLURAL:$1|판}}에 적용',
-'revdelete-success' => "'''í\8c\90ì\9d\98 ë³´ì\9d´ê¸° ì\84¤ì \95ì\9d´ ì\84±ê³µì \81ì\9c¼ë¡\9c ë³\80ê²½ë\90\98었습니다.'''",
+'revdelete-success' => "'''í\8c\90ì\9d\98 ë³´ì\9d´ê¸° ì\84¤ì \95ì\9d\84 ì\84±ê³µì \81ì\9c¼ë¡\9c ë°\94꾸었습니다.'''",
 'revdelete-failure' => "'''특정 판 보기 설정을 바꾸지 못했습니다:'''
 $1",
-'logdelete-success' => "'''로그의 보이기 설정이 성공적으로 변경되었습니다.'''",
-'logdelete-failure' => "'''로그 보이기 설정을 바꾸지 못했습니다:'''
+'logdelete-success' => "'''기록 보이기 설정을 성공적으로 바꾸었습니다.'''",
+'logdelete-failure' => "'''기록 보이기 설정을 바꾸지 못했습니다:'''
 $1",
-'revdel-restore' => 'ë³´ì\9d´ê¸° ì\84¤ì \95 ë³\80ê²½',
+'revdel-restore' => 'ë³´ì\9d´ê¸° ì\84¤ì \95 ë°\94꾸기',
 'revdel-restore-deleted' => '삭제된 판',
 'revdel-restore-visible' => '공개된 판',
 'pagehist' => '문서 역사',
@@ -1217,12 +1288,13 @@ $1",
 여기에 접근할 수 없습니다.',
 'revdelete-modify-missing' => '판 ID $1을 수정하는 중 오류 발생: 데이터베이스에 존재하지 않습니다!',
 'revdelete-no-change' => "'''경고:''' $1 $2에 해당하는 항목은 이미 같은 보이기 설정이 설정되어 있습니다.",
-'revdelete-concurrent-change' => '$1 $2에 수정된 항목을 ê°±ì\8b í\95\98ë©´ì\84\9c ì\98¤ë¥\98 ë°\9cì\83\9d: ì\9d´ë\9f° í\98\84ì\83\81ì\9d\80 ë\8b¹ì\8b ì\9d´ ë¬¸ì\84\9c를 í\8e¸ì§\91í\95\98ê³  ì\9e\88ì\9d\84 ë\95\8c ë\8b¤ë¥¸ ì\82¬ë\9e\8cì\9d´ ë¬¸ì\84\9c를 í\8e¸ì§\91í\96\88기 ë\95\8c문ì\97\90 ë°\9cì\83\9dí\95©ë\8b\88ë\8b¤.
-관련 로그를 확인해 보세요.',
+'revdelete-concurrent-change' => '$1 $2에 수정된 항목을 ì\83\88ë¡\9c ê³ ì¹\98ë©´ì\84\9c ì\98¤ë¥\98 ë°\9cì\83\9d: ì\9d´ë\9f° í\98\84ì\83\81ì\9d\80 ë\8b¹ì\8b ì\9d´ ë¬¸ì\84\9c를 í\8e¸ì§\91í\95\98ê³  ì\9e\88ì\9d\84 ë\95\8c ë\8b¤ë¥¸ ì\82¬ë\9e\8cì\9d´ ë¬¸ì\84\9c를 í\8e¸ì§\91í\96\88기 ë\95\8c문ì\97\90 ë°\9cì\83\9dí\95©ë\8b\88ë\8b¤.
+관련 기록을 확인해 보세요.',
 'revdelete-only-restricted' => '$1 $2 버전 숨기기 오류: 다른 숨기기 설정을 같이 설정하지 않고 관리자가 보지 못하도록 특정 판을 숨길 수 없습니다.',
 'revdelete-reason-dropdown' => '*일반적인 삭제 이유
 ** 저작권 침해
-** 부적절한 개인 정보',
+** 부적절한 개인 정보
+** 잠재적인 비방 정보',
 'revdelete-otherreason' => '다른 이유/부가적인 이유',
 'revdelete-reasonotherlist' => '다른 이유',
 'revdelete-edit-reasonlist' => '삭제 이유 편집',
@@ -1230,8 +1302,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => '숨기기 기록',
-'suppressionlogtext' => '다음은 관리자로부터 숨겨진 내용에 관한 삭제, 차단 기록입니다.
-현재 차단된 사용자 목록을 보시려면 [[Special:BlockList|차단된 사용자 목록]]을 참조하십시오.',
+'suppressionlogtext' => '다음은 관리자로부터 숨겨진 내용에 관한 삭제 차단 기록입니다.
+현재 차단된 사용자 목록을 보려면 [[Special:BlockList|차단된 사용자 목록]]을 참고하세요.',
 
 # History merging
 'mergehistory' => '문서 역사 합치기',
@@ -1247,7 +1319,7 @@ $1",
 'mergehistory-go' => '합칠 수 있는 편집 보기',
 'mergehistory-submit' => '문서 역사 합치기',
 'mergehistory-empty' => '합칠 수 있는 판이 없습니다.',
-'mergehistory-success' => '[[:$1]] 문서의 $3개의 판이 [[:$2]]에 성공적으로 합쳐졌습니다.',
+'mergehistory-success' => '[[:$1]] 문서의 판 $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.',
 'mergehistory-fail' => '문서 역사 합치기 명령을 수행할 수 없습니다. 문서와 시간 변수를 다시 확인하십시오.',
 'mergehistory-no-source' => '원본인 $1 문서가 존재하지 않습니다.',
 'mergehistory-no-destination' => '대상인 $1 문서가 존재하지 않습니다.',
@@ -1259,61 +1331,65 @@ $1",
 'mergehistory-reason' => '이유:',
 
 # Merge log
-'mergelog' => '합병 기록',
-'pagemerge-logentry' => '[[$1]]을 [[$2]]에 병합 ($3판이 위로 옮겨짐)',
+'mergelog' => '병합 기록',
+'pagemerge-logentry' => '사용자가 [[$1]]을 [[$2]]에 병합 ($3판이 위로 옮겨짐)',
 'revertmerge' => '병합 해제',
 'mergelogpagetext' => '다음은 한 문서의 역사를 다른 문서의 역사와 합친 최근 기록입니다.',
 
 # Diffs
-'history-title' => '"$1"  ë¬¸ì\84\9cì\9d\98 ë³\80ê²½ ë\82´ë ¥',
+'history-title' => '"$1"  ë¬¸ì\84\9cì\9d\98 ë°\94ë\80\9c ë\82´ì\97­',
 'difference-title' => '"$1"의 두 판 사이의 차이',
-'difference-title-multipage' => '문서 "$1"과 "$2" 간의 차이',
-'difference-multipage' => '(문서의 차이)',
+'difference-title-multipage' => '문서 "$1"(와)과 "$2" 사이의 차이',
+'difference-multipage' => '(문서 사이의 차이)',
 'lineno' => '$1번째 줄:',
 'compareselectedversions' => '선택한 판을 비교하기',
 'showhideselectedversions' => '선택한 판을 보이기/숨기기',
 'editundo' => '편집 취소',
 'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} 중간의 편집 $1개 숨겨짐)',
 'diff-multi-manyusers' => '({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} 중간의 편집 $1개 숨겨짐)',
+'difference-missing-revision' => '문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 없습니다.
+
+이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 비교 링크로 인해 발생합니다.
+자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.',
 
 # Search results
-'searchresults' => '검색 결과',
-'searchresults-title' => '"$1"에 대한 검색 결과',
+'searchresults' => '찾기 결과',
+'searchresults-title' => '"$1"에 대한 찾기 결과',
 'searchresulttext' => '{{SITENAME}}의 찾기 기능에 대한 자세한 정보는 [[{{MediaWiki:Helppage}}|{{int:help}}]] 문서를 참고해주세요.',
-'searchsubtitle' => "'''[[:$1]]''' 문서를 검색하고 있습니다. ([[Special:Prefixindex/$1|이름이 ‘$1’ 접두어로 시작하는 문서 목록]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|‘$1’ 문서를 가리키는 문서 목록]])",
-'searchsubtitleinvalid' => "검색 단어 '''$1'''",
+'searchsubtitle' => '\'\'\'[[:$1]]\'\'\' 문서를 찾고 있습니다. ([[Special:Prefixindex/$1|이름이 "$1" 접두어로 시작하는 문서 목록]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" 문서를 가리키는 문서 목록]])',
+'searchsubtitleinvalid' => "찾은 단어 '''$1'''",
 'toomanymatches' => '일치하는 결과가 너무 많습니다. 다른 검색어를 입력해주세요.',
 'titlematches' => '문서 제목 일치',
 'notitlematches' => '해당하는 제목 없음',
 'textmatches' => '문서 내용 일치',
 'notextmatches' => '해당하는 문서 없음',
-'prevn' => 'ì\95\9eì\9c¼ë¡\9c $1개',
-'nextn' => 'ë\92¤ë¡\9c $1개',
+'prevn' => 'ì\9d´ì \84 $1개',
+'nextn' => 'ë\8b¤ì\9d\8c $1개',
 'prevn-title' => '이전 결과 $1개',
 'nextn-title' => '다음 결과 $1개',
-'shown-title' => '쪽마다 결과 $1 개씩 보이기',
+'shown-title' => '쪽마다 결과 $1개씩 보이기',
 'viewprevnext' => '보기: ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-legend' => '검색 설정',
+'searchmenu-legend' => '찾기 설정',
 'searchmenu-exists' => "'''이 위키에 \"[[:\$1]]\"의 이름을 가진 문서가 있습니다.'''",
-'searchmenu-new' => "'''ì\9d´ ì\9c\84í\82¤ì\97\90 \"[[:\$1]]\" ë¬¸ì\84\9c를 ë§\8cë\93\9cì\8b­ì\8b\9cì\98¤!'''",
+'searchmenu-new' => "'''ì\9d´ ì\9c\84í\82¤ì\97\90 \"[[:\$1]]\" ë¬¸ì\84\9c를 ë§\8cë\93\9cì\84¸ì\9a\94!'''",
 'searchhelp-url' => 'Help:목차',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|이 접두어로 시작하는 문서 찾기]]',
 'searchprofile-articles' => '일반 문서',
 'searchprofile-project' => '도움말 및 프로젝트 문서',
 'searchprofile-images' => '멀티미디어',
-'searchprofile-everything' => '모든 문서 검색',
-'searchprofile-advanced' => '고급 검색',
+'searchprofile-everything' => '모든 문서 찾기',
+'searchprofile-advanced' => '고급 찾기',
 'searchprofile-articles-tooltip' => '$1에서 찾기',
 'searchprofile-project-tooltip' => '$1에서 찾기',
 'searchprofile-images-tooltip' => '파일 찾기',
 'searchprofile-everything-tooltip' => '토론 문서를 포함한 모든 문서 찾기',
-'searchprofile-advanced-tooltip' => '다음 설정ë\90\9c ì\9d´ë¦\84ê³µê°\84ì\97\90ì\84\9c ì°¾ê¸°',
+'searchprofile-advanced-tooltip' => '다음 설정í\95\9c ì\9d´ë¦\84ê³µê°\84ì\97\90ì\84\9c ì°¾ê¸°',
 'search-result-size' => '$1 ($2 단어)',
 'search-result-category-size' => '문서 {{PLURAL:$1|1|$1}}개, 하위 분류 {{PLURAL:$2|1|$2}}개, 파일 {{PLURAL:$3|1|$3}}',
 'search-result-score' => '유사도: $1%',
 'search-redirect' => '($1에서 넘어옴)',
 'search-section' => '($1 문단)',
-'search-suggest' => '$1 문서를 찾고 계신가요?',
+'search-suggest' => '$1 문서를 찾고 있나요?',
 'search-interwiki-caption' => '자매 프로젝트',
 'search-interwiki-default' => '$1 결과:',
 'search-interwiki-more' => '(더 보기)',
@@ -1326,19 +1402,21 @@ $1",
 'searchall' => '모두',
 'showingresults' => '<strong>$2</strong>번 부터의 <strong>결과 $1개</strong>입니다.',
 'showingresultsnum' => "'''$2'''번 부터의 '''결과 $3개''' 입니다.",
-'showingresultsheader' => "'''$4''' 검색어에 대하여 '''$3'''개의 결과 중 {{PLURAL:$5|'''$1'''개|'''$1 - $2'''번째}}를 보여 주고 있습니다.",
-'nonefound' => "'''참고''': 몇개의 이름공간만 기본 검색 범위입니다. 토론이나 틀 등의 모든 자료를 검색하기 위해서는 접두어로 '''all:''' 어떤 이름공간을 위해서는 접두어로 그 이름공간을 쓸 수 있습니다.",
-'search-nonefound' => '검색 결과가 없습니다.',
-'powersearch' => '찾기',
-'powersearch-legend' => '고급 검색',
+'showingresultsheader' => "'''$4''' 검색어에 대하여 결과 '''$3'''개 중 {{PLURAL:$5|'''$1'''개|'''$1 - $2'''번째}}를 보여 주고 있습니다.",
+'nonefound' => "'''참고''': 몇개의 이름공간만 기본 찾을 범위입니다. 토론이나 틀 등의 모든 자료를 찾하기 위해서는 접두어로 '''all:''' 어떤 이름공간을 위해서는 접두어로 그 이름공간을 쓸 수 있습니다.",
+'search-nonefound' => '찾기 결과가 없습니다.',
+'powersearch' => '고급 찾기',
+'powersearch-legend' => '고급 찾기',
 'powersearch-ns' => '다음의 이름공간에서 찾기:',
 'powersearch-redir' => '넘겨주기 목록',
-'powersearch-field' => '검색',
+'powersearch-field' => '찾기',
 'powersearch-togglelabel' => '확인:',
 'powersearch-toggleall' => '모두 선택',
 'powersearch-togglenone' => '모두 선택하지 않음',
-'search-external' => '외부 검색',
-'searchdisabled' => '{{SITENAME}} 검색 기능이 비활성화되어 있습니다. 기능이 작동하지 않는 동안에는 구글(Google)을 이용해 검색할 수 있습니다. 검색 엔진의 내용은 최근 것이 아닐 수 있다는 점을 주의해주세요.',
+'search-external' => '외부 찾기',
+'searchdisabled' => '{{SITENAME}} 찾기 기능이 비활성화되어 있습니다.
+기능이 작동하지 않는 동안에는 구글(Google)을 이용해 찾을 수 있습니다.
+검색 엔진의 내용은 최신이 아닐 수 있다는 점을 주의해주세요.',
 
 # Quickbar
 'qbsettings' => '빨리가기 맞춤',
@@ -1351,7 +1429,7 @@ $1",
 
 # Preferences page
 'preferences' => '사용자 환경 설정',
-'mypreferences' => '사용자 환경 설정',
+'mypreferences' => '내 사용자 환경 설정',
 'prefs-edits' => '편집 횟수:',
 'prefsnologin' => '로그인하지 않음',
 'prefsnologintext' => '사용자 환경 설정을 바꾸려면 먼저 <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 로그인]</span>해야 합니다.',
@@ -1370,7 +1448,7 @@ $1",
 'prefs-watchlist-days-max' => '최대 $1{{PLURAL:$1|일}}',
 'prefs-watchlist-edits' => '주시문서 목록에서 볼 편집 수:',
 'prefs-watchlist-edits-max' => '최대 개수: 1000',
-'prefs-watchlist-token' => '주시문서 토큰:',
+'prefs-watchlist-token' => '주시문서 목록 토큰:',
 'prefs-misc' => '기타',
 'prefs-resetpass' => '비밀번호 바꾸기',
 'prefs-changeemail' => '이메일 주소 바꾸기',
@@ -1380,19 +1458,19 @@ $1",
 'saveprefs' => '저장',
 'resetprefs' => '저장하지 않은 설정 되돌리기',
 'restoreprefs' => '모두 기본 설정으로 되돌리기',
-'prefs-editing' => '편집상자',
+'prefs-editing' => '편집 상자',
 'prefs-edit-boxsize' => '편집 창의 크기',
 'rows' => '줄 수:',
 'columns' => '열 수:',
 'searchresultshead' => '찾기',
 'resultsperpage' => '쪽마다 보이는 결과 수:',
-'stub-threshold' => '링크를 <a href="#" class="stub">토막글</a> 형식으로 표시할 문서 크기 (바이트 수):',
+'stub-threshold' => '링크를 <a href="#" class="stub">토막글</a> 형식으로 보여줄 문서 크기 (바이트 수):',
 'stub-threshold-disabled' => '비활성화됨',
-'recentchangesdays' => '최근 바뀜에 표시할 날짜 수:',
-'recentchangesdays-max' => '(최대 $1일)',
-'recentchangescount' => '기본으로 표시할 편집 수:',
+'recentchangesdays' => '최근 바뀜에 보여줄 날짜 수:',
+'recentchangesdays-max' => '최대 $1일',
+'recentchangescount' => '기본으로 보여줄 편집 수:',
 'prefs-help-recentchangescount' => '이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.',
-'prefs-help-watchlist-token' => '아래에 비밀 값을 넣으면 주시문서에 대한 RSS 피드가 생성됩니다.
+'prefs-help-watchlist-token' => '아래에 비밀 값을 넣으면 주시문서 목록에 대한 RSS 피드가 만들어집니다.
 비밀 값을 알고 있는 사람이라면 누구나 피드를 읽을 수 있으므로 안전한 값을 입력해주세요.
 임의로 만들어진 다음 값을 사용할 수도 있습니다: $1',
 'savedprefs' => '설정을 저장했습니다.',
@@ -1414,40 +1492,43 @@ $1",
 'timezoneregion-indian' => '인도양',
 'timezoneregion-pacific' => '태평양',
 'allowemail' => '다른 사용자가 보낸 이메일을 받음',
-'prefs-searchoptions' => '검색 설정',
+'prefs-searchoptions' => '찾기 설정',
 'prefs-namespaces' => '이름공간',
-'defaultns' => '다음 이름공간에서 검색하기:',
+'defaultns' => '다음 이름공간에서 기:',
 'default' => '기본값',
 'prefs-files' => '파일',
 'prefs-custom-css' => '사용자 CSS',
 'prefs-custom-js' => '사용자 자바스크립트',
-'prefs-common-css-js' => '모든 스킨에 적용되는 공통 CSS/자바스크립트:',
-'prefs-reset-intro' => '이 사이트의 기본 값으로 환경 설정을 되돌릴 수 있습니다.
+'prefs-common-css-js' => '모든 스킨에 대한 공통 CSS/JavaScript:',
+'prefs-reset-intro' => '이 사이트의 기본값으로 환경 설정을 되돌릴 수 있습니다.
 복구할 수 없습니다.',
 'prefs-emailconfirm-label' => '이메일 인증:',
 'prefs-textboxsize' => '편집창의 크기',
 'youremail' => '이메일:',
-'username' => '계정 이름:',
+'username' => '사용자 이름:',
 'uid' => '사용자 ID:',
 'prefs-memberingroups' => '소속 {{PLURAL:$1|그룹}}:',
 'prefs-registration' => '등록 일시:',
 'yourrealname' => '실명:',
 'yourlanguage' => '언어:',
 'yourvariant' => '언어 변종:',
-'prefs-help-variant' => '위키 내용을 표시할 때 사용할 언어 변종이나 철자 체계를 선택해주세요.',
+'prefs-help-variant' => '위키 내용을  때 사용할 언어 변종이나 철자 체계를 선택해주세요.',
 'yournick' => '새 서명:',
 'prefs-help-signature' => '토론 문서에 글을 쓴 후에는 마지막에 서명을 해야 합니다.  “<nowiki>~~~~</nowiki>” 기호를 추가하면 서명과 글 작성 시각이 자동으로 입력됩니다.',
-'badsig' => '서명이 잘못되었습니다. HTML 태그를 확인해주세요.',
+'badsig' => '서명이 잘못되었습니다.
+HTML 태그를 확인하세요.',
 'badsiglength' => '서명이 너무 깁니다.
 서명은 $1자보다 짧아야 합니다.',
 'yourgender' => '성별:',
 'gender-unknown' => '무응답',
 'gender-male' => '남성',
 'gender-female' => '여성',
-'prefs-help-gender' => '선택 사항: 소프트웨어에서 성별에 따른 언어 문제를 해결하기 위해 사용됩니다. 이 정보는 공개됩니다.',
+'prefs-help-gender' => '선택 사항: 소프트웨어에서 성별에 따른 언어 문제를 해결하기 위해 사용됩니다.
+이 정보는 공개됩니다.',
 'email' => '이메일',
-'prefs-help-realname' => '실명 기입은 자유입니다. 실명을 입력할 경우 문서 기여에 자신의 이름이 들어가게 됩니다.',
-'prefs-help-email' => '이메일 주소 입력은 선택 사항입니다. 다만 비밀번호를 잊었을 때 비밀번호 변경을 위해 필요합니다.',
+'prefs-help-realname' => '실명 기입은 자유입니다.
+실명을 입력할 경우 문서 기여에 자신의 이름이 들어가게 됩니다.',
+'prefs-help-email' => '이메일 주소 입력은 선택 사항입니다. 다만 비밀번호를 잊었을 때 비밀번호 바꾸기를 위해 필요합니다.',
 'prefs-help-email-others' => '당신은 자신의 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.
 이 경우에도 당신의 이메일 주소는 다른 사용자가 연락할 때 공개되지 않습니다.',
 'prefs-help-email-required' => '이메일 주소가 필요합니다.',
@@ -1462,20 +1543,20 @@ $1",
 'prefs-advancedsearchoptions' => '고급 설정',
 'prefs-advancedwatchlist' => '고급 설정',
 'prefs-displayrc' => '보이기 설정',
-'prefs-displaysearchoptions' => '표시 설정',
-'prefs-displaywatchlist' => '표시 설정',
+'prefs-displaysearchoptions' => '보이기 설정',
+'prefs-displaywatchlist' => '보이기 설정',
 'prefs-diffs' => '차이',
 
 # User preference: e-mail validation using jQuery
 'email-address-validity-valid' => '이메일 주소가 유효한 것으로 보입니다.',
-'email-address-validity-invalid' => 'ì\9c í\9a¨í\95\9c ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥í\95´ì£¼ì\8b­ì\8b\9cì\98¤.',
+'email-address-validity-invalid' => 'ì\9c í\9a¨í\95\9c ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥í\95´ì£¼ì\84¸ì\9a\94.',
 
 # User rights
 'userrights' => '사용자 권한 관리',
 'userrights-lookup-user' => '사용자 권한 관리',
-'userrights-user-editname' => '계정 이름:',
+'userrights-user-editname' => '사용자 이름 입력:',
 'editusergroup' => '사용자 그룹 편집',
-'editinguser' => "ì\82¬ì\9a©ì\9e\90 '''[[User:$1|$1]]''' $2ì\9d\98 ê¶\8cí\95\9c ë³\80ê²½",
+'editinguser' => "ì\82¬ì\9a©ì\9e\90 '''[[User:$1|$1]]''' $2ì\9d\98 ê¶\8cí\95\9c ë°\94ê¿\88",
 'userrights-editusergroup' => '사용자 그룹 편집',
 'saveusergroups' => '사용자 권한 저장',
 'userrights-groupsmember' => '현재 권한:',
@@ -1519,21 +1600,21 @@ $1",
 # Rights
 'right-read' => '문서 읽기',
 'right-edit' => '문서 편집',
-'right-createpage' => '문서 생성 (토론 문서 제외)',
-'right-createtalk' => '토론 문서 생성',
+'right-createpage' => '문서 만들기 (토론 문서 제외)',
+'right-createtalk' => '토론 문서 만들기',
 'right-createaccount' => '새 계정 만들기',
 'right-minoredit' => '사소한 편집 사용 가능',
 'right-move' => '문서 이동',
 'right-move-subpages' => '문서와 하위 문서 이동하기',
 'right-move-rootuserpages' => '최상위 사용자 문서 이동',
-'right-movefile' => '파일 옮기기',
-'right-suppressredirect' => '문ì\84\9c ì\9d´ë\8f\99í\95  ë\95\8c ì\98\9bë\82  이름으로 된 넘겨주기를 남기지 않기',
+'right-movefile' => '파일 옮기기',
+'right-suppressredirect' => '문ì\84\9c ì\9d´ë\8f\99í\95  ë\95\8c ì\9d´ì \84 이름으로 된 넘겨주기를 남기지 않기',
 'right-upload' => '파일 올리기',
-'right-reupload' => 'ì\9d´ë¯¸ ì¡´ì\9e¬í\95\98ë\8a\94 í\8c\8cì\9d¼ì\9d\84 ë\8b¤ì\8b\9c ì\97\85ë¡\9cë\93\9c',
+'right-reupload' => 'ì\9d´ë¯¸ ì¡´ì\9e¬í\95\98ë\8a\94 í\8c\8cì\9d¼ì\9d\84 ë\8b¤ì\8b\9c ì\98¬ë¦¬ê¸°',
 'right-reupload-own' => '자신이 이미 올린 파일 덮어쓰기',
 'right-reupload-shared' => '공용의 파일을 무시하고 로컬에서 파일 올리기',
 'right-upload_by_url' => 'URL 주소에서 파일 올리기',
-'right-purge' => '확인 없이 문서의 캐시를 갱신',
+'right-purge' => '확인 없이 문서의 캐시를 새로 고침',
 'right-autoconfirmed' => '준보호된 문서 편집',
 'right-bot' => '봇의 편집으로 취급',
 'right-nominornewtalk' => '토론 문서를 새로 만들때 사소한 편집 사용 불가능',
@@ -1541,10 +1622,11 @@ $1",
 'right-writeapi' => 'API 작성',
 'right-delete' => '문서 삭제',
 'right-bigdelete' => '문서 역사가 긴 문서를 삭제',
+'right-deletelogentry' => '특정 기록 항목을 삭제 및 복구',
 'right-deleterevision' => '문서의 특정 판을 삭제 및 복구',
 'right-deletedhistory' => '삭제된 문서의 내용을 제외한 역사를 보기',
 'right-deletedtext' => '삭제된 문서의 내용과 편집상의 차이를 보기',
-'right-browsearchive' => '삭제된 문서 검색',
+'right-browsearchive' => '삭제된 문서 찾기',
 'right-undelete' => '삭제된 문서 복구',
 'right-suppressrevision' => '관리자도 보지 못하도록 숨겨진 판의 확인 및 복구',
 'right-suppressionlog' => '숨겨진 기록을 보기',
@@ -1554,21 +1636,21 @@ $1",
 'right-ipblock-exempt' => 'IP 차단, 자동 차단, 광역 차단을 무시',
 'right-proxyunbannable' => '프록시 자동 차단을 적용하지 않음',
 'right-unblockself' => '자기 자신을 차단 해제하기',
-'right-protect' => 'ë³´í\98¸ ì\88\98ì¤\80 ë³\80ê²½ 및 보호된 문서 편집',
+'right-protect' => 'ë³´í\98¸ ì\88\98ì¤\80 ë°\94꾸기 및 보호된 문서 편집',
 'right-editprotected' => '보호된 문서 편집 (연쇄적 보호 제외)',
 'right-editinterface' => '사용자 인터페이스를 편집',
-'right-editusercssjs' => '다른 사용자의 CSS와 JS 문서를 편집',
+'right-editusercssjs' => '다른 사용자의 CSS와 자바스크립트 문서를 편집',
 'right-editusercss' => '다른 사용자의 CSS 문서를 편집',
-'right-edituserjs' => '다른 사용자의 JS 문서를 편집',
+'right-edituserjs' => '다른 사용자의 자바스크립트 문서를 편집',
 'right-rollback' => '특정 문서를 편집한 마지막 사용자의 편집을 신속하게 되돌리기',
 'right-markbotedits' => '되돌리기를 봇의 편집으로 취급 가능',
 'right-noratelimit' => '편집이나 다른 행동 속도의 제한을 받지 않음',
 'right-import' => '다른 위키에서 문서 가져오기',
-'right-importupload' => 'í\8c\8cì\9d¼ ì\97\85ë¡\9cë\93\9c를 통해 문서 가져오기',
+'right-importupload' => 'í\8c\8cì\9d¼ ì\98¬ë¦¬ê¸°를 통해 문서 가져오기',
 'right-patrol' => '다른 사용자의 편집을 검토',
 'right-autopatrol' => '자신의 편집을 자동으로 검토',
 'right-patrolmarks' => '최근 바뀜에서 검토 표시를 보기',
-'right-unwatchedpages' => '주시되지 않 문서 목록 보기',
+'right-unwatchedpages' => '주시되지 않 문서 목록 보기',
 'right-mergehistory' => '문서의 역사를 합침',
 'right-userrights' => '모든 사용자의 권한 조정',
 'right-userrights-interwiki' => '다른 위키의 사용자 권한을 조정',
@@ -1580,15 +1662,15 @@ $1",
 # User rights log
 'rightslog' => '사용자 권한 기록',
 'rightslogtext' => '사용자 권한 조정 기록입니다.',
-'rightslogentry' => '$1의 권한을 $2에서 $3(으)로 변경',
-'rightslogentry-autopromote' => 'ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¶\8cí\95\9cì\9d´ ì\9e\90ë\8f\99ì \81ì\9c¼ë¡\9c $2ì\97\90ì\84\9c $3ì\9c¼ë¡\9c ë³\80ê²½ë\90\98었습니다.',
+'rightslogentry' => '사용자가 $1의 권한을 $2에서 $3(으)로 바꿈',
+'rightslogentry-autopromote' => 'ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¶\8cí\95\9cì\9d´ ì\9e\90ë\8f\99ì \81ì\9c¼ë¡\9c $2ì\97\90ì\84\9c $3ì\9c¼ë¡\9c ë°\94ë\80\8c었습니다.',
 'rightsnone' => '(없음)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => '이 문서를 읽기',
 'action-edit' => '문서 편집',
-'action-createpage' => '문서 생성',
-'action-createtalk' => '토론 문서 생성하기',
+'action-createpage' => '문서 만들기',
+'action-createtalk' => '토론 문서 만들기',
 'action-createaccount' => '새 계정 만들기',
 'action-minoredit' => '이 편집을 사소한 편집으로 표시하기',
 'action-move' => '이 문서 옮기기',
@@ -1603,18 +1685,18 @@ $1",
 'action-delete' => '이 문서 삭제하기',
 'action-deleterevision' => '이 판을 삭제',
 'action-deletedhistory' => '이 문서의 삭제된 기여의 역사 보기',
-'action-browsearchive' => '삭제된 문서 검색',
+'action-browsearchive' => '삭제된 문서 찾기',
 'action-undelete' => '이 문서를 복구하기',
 'action-suppressrevision' => '이 숨겨진 판을 검토하고 복구할',
 'action-suppressionlog' => '비공개 기록 보기',
 'action-block' => '이 사용자를 편집하지 못하도록 차단',
-'action-protect' => 'ì\9d´ ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 ë³\80ê²½í\95\98기',
+'action-protect' => 'ì\9d´ ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 ë°\94꾸기',
 'action-rollback' => '특정 문서를 마지막으로 편집한 사용자의 모든 편집을 간편하게 되돌리기',
 'action-import' => '다른 위키에서 이 문서를 가져오기',
 'action-importupload' => '파일 올리기를 통해 문서를 가져올',
 'action-patrol' => '다른 사용자의 편집을 검토된 것으로 표시하기',
 'action-autopatrol' => '자신의 편집을 검토된 것으로 표시할',
-'action-unwatchedpages' => '주시되지 않 문서 목록 보기',
+'action-unwatchedpages' => '주시되지 않 문서 목록 보기',
 'action-mergehistory' => '이 문서의 역사 합치기',
 'action-userrights' => '모든 사용자의 권한을 조정',
 'action-userrights-interwiki' => '다른 위키의 사용자 권한을 조정',
@@ -1630,9 +1712,9 @@ $1",
 'recentchanges-label-newpage' => '새로운 문서',
 'recentchanges-label-minor' => '사소한 편집',
 'recentchanges-label-bot' => '봇의 편집',
-'recentchanges-label-unpatrolled' => '아직 검토ë\90\98ì§\80 ì\95\8aì\9d\80 í\8e¸ì§\91',
-'rcnote' => "다음은 $4 $5 까지의 '''$2'''일동안 바뀐 '''$1'''ê°\9cì\9d\98 ë¬¸ì\84\9cì\9e\85ë\8b\88ë\8b¤.",
-'rcnotefrom' => "다음은 '''$2'''에서부터 바뀐 '''$1'''ê°\9cì\9d\98 ë¬¸ì\84\9cì\9e\85ë\8b\88ë\8b¤.",
+'recentchanges-label-unpatrolled' => '아직 검토í\95\98ì§\80 ì\95\8aì\9d\80 í\8e¸ì§\91',
+'rcnote' => "다음은 $4 $5 까지의 '''$2'''일동안 바뀐 ë¬¸ì\84\9c '''$1'''ê°\9cì\9e\85ë\8b\88ë\8b¤.",
+'rcnotefrom' => "다음은 '''$2'''에서부터 바뀐 ë¬¸ì\84\9c '''$1'''ê°\9cì\9e\85ë\8b\88ë\8b¤.",
 'rclistfrom' => '$1 이래로 바뀐 문서',
 'rcshowhideminor' => '사소한 편집을 $1',
 'rcshowhidebots' => '봇을 $1',
@@ -1640,7 +1722,7 @@ $1",
 'rcshowhideanons' => '익명 사용자를 $1',
 'rcshowhidepatr' => '검토된 편집을 $1',
 'rcshowhidemine' => '내 편집을 $1',
-'rclinks' => 'ìµ\9cê·¼ $2ì\9d¼ê°\84ì\9d\98 $1ê°\9c ë³\80ê²½ 기록 보기<br />$3',
+'rclinks' => 'ìµ\9cê·¼ $2ì\9d¼ê°\84ì\9d\98 $1ê°\9c ë°\94ë\80\9c 기록 보기<br />$3',
 'diff' => '비교',
 'hist' => '역사',
 'hide' => '숨기기',
@@ -1649,19 +1731,19 @@ $1",
 'newpageletter' => '새글',
 'boteditletter' => '봇',
 'number_of_watching_users_pageview' => '[$1명이 주시하고 있음]',
-'rc_categories' => '다음 분류로 제한 (‘|’로 구분)',
+'rc_categories' => '다음 분류로 제한 ("|"로 구분)',
 'rc_categories_any' => '모두',
-'rc-change-size-new' => 'ë³\80ê²½ 후 $1 {{PLURAL:$1|바이트}}',
+'rc-change-size-new' => 'ë°\94ê¾¼ 후 $1 {{PLURAL:$1|바이트}}',
 'newsectionsummary' => '새 주제: /* $1 */',
-'rc-enhanced-expand' => 'ì\84¸ë¶\80 기록 보기 (자바스크립트 필요)',
-'rc-enhanced-hide' => 'ì\84¸ë¶\80기록 숨기기',
+'rc-enhanced-expand' => 'ì\9e\90ì\84¸í\95\9c 기록 보기 (자바스크립트 필요)',
+'rc-enhanced-hide' => 'ì\9e\90ì\84¸í\95\9c 기록 숨기기',
 'rc-old-title' => '처음에  "$1"라는 제목으로 만들어짐',
 
 # Recent changes linked
 'recentchangeslinked' => '가리키는 글의 바뀜',
 'recentchangeslinked-feed' => '가리키는 글의 바뀜',
 'recentchangeslinked-toolbox' => '가리키는 글의 바뀜',
-'recentchangeslinked-title' => '‘$1’ 문서에 관련된 문서 바뀜',
+'recentchangeslinked-title' => '"$1" 문서에 관련된 문서 바뀜',
 'recentchangeslinked-noresult' => '이 문서에서 링크하는 문서 중, 해당 기간에 바뀐 문서가 없습니다.',
 'recentchangeslinked-summary' => "여기를 가리키는 문서(분류일 경우 이 분류에 포함된 문서)에 대한 최근 바뀜이 나와 있습니다.
 [[Special:Watchlist|주시하는 문서]]는 '''굵은''' 글씨로 나타납니다.",
@@ -1675,19 +1757,19 @@ $1",
 'upload-tryagain' => '수정된 파일 설명을 저장',
 'uploadnologin' => '로그인하지 않음',
 'uploadnologintext' => '파일을 올리려면 [[Special:UserLogin|로그인]]해야 합니다.',
-'upload_directory_missing' => '파일 올리기용 디렉터리($1)가 없고 웹 서버가 생성하지 못했습니다.',
+'upload_directory_missing' => '파일 올리기용 디렉터리($1)가 없고 웹 서버가 만들지 못했습니다.',
 'upload_directory_read_only' => '파일 저장 디렉터리($1)에 쓰기 권한이 없습니다.',
 'uploaderror' => '올리기 오류',
 'upload-recreate-warning' => "'''경고: 이 파일로 된 이름이 삭제되었거나 옮겨졌습니다.'''
 
 이 문서의 최근 삭제 기록과 이동 기록을 참고하십시오:",
 'uploadtext' => "파일을 올리기 위해서는 아래의 양식을 채워주세요.
-[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 찾을 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 로그]]에서 볼 수 있습니다.
+[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 찾을 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 기록]]에서 볼 수 있습니다.
 
 문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' 파일의 온전한 모양을 사용하고자 할 때.
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></tt>''' 파일의 넓이를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' 파일을 직접 보여주지 않고 파일로 바로 링크할때.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' 파일의 온전한 모양을 사용하고자 할 때.
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></code>''' 파일의 넓이를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' 파일을 직접 보여주지 않고 파일로 바로 링크할때.",
 'upload-permitted' => '허용하는 파일 확장자: $1',
 'upload-preferred' => '권장하는 파일 확장자: $1',
 'upload-prohibited' => '금지하는 파일 확장자: $1',
@@ -1698,22 +1780,25 @@ $1",
 'filename' => '파일 이름',
 'filedesc' => '파일의 설명',
 'fileuploadsummary' => '요약:',
-'filereuploadsummary' => 'í\8c\8cì\9d¼ ë³\80ê²½에 대한 요약:',
+'filereuploadsummary' => 'í\8c\8cì\9d¼ ë°\94ë\80\9c에 대한 요약:',
 'filestatus' => '저작권 상태:',
 'filesource' => '출처:',
 'uploadedfiles' => '파일 올리기',
-'ignorewarning' => '경고를 무시하고 저장합니다',
+'ignorewarning' => '경고를 무시하고 파일 저장',
 'ignorewarnings' => '모든 경고 무시하기',
 'minlength1' => '파일 이름은 적어도 1글자 이상이어야 합니다.',
-'illegalfilename' => '파일 이름 "$1"에는 문서 제목으로 허용되지 않는 글자가 포함되어 있습니다. 이름을 바꾸어 다시 시도해 주세요.',
+'illegalfilename' => '파일 이름 "$1"에는 문서 제목으로 허용되지 않는 글자가 포함되어 있습니다.
+이름을 바꾸어 다시 시도해 주세요.',
 'filename-toolong' => '파일 이름은 240바이트를 넘을 수 없습니다.',
-'badfilename' => '파일 이름이 ‘$1’(으)로 바뀌었습니다.',
+'badfilename' => '파일 이름이 "$1"로 바뀌었습니다.',
 'filetype-mime-mismatch' => '파일 확장자 ".$1"와 이 파일의 MIME($2)가 일치하지 않습니다.',
-'filetype-badmime' => '‘$1’ MIME을 가진 파일은 올릴 수 없습니다.',
+'filetype-badmime' => '"$1" MIME을 가진 파일은 올릴 수 없습니다.',
 'filetype-bad-ie-mime' => '인터넷 익스플로러가 잠재적으로 위험한 파일 형식으로 판단되어 사용이 금지된 "$1"로 인식할 수 있기 때문에 이 파일을 올릴 수 없습니다.',
-'filetype-unwanted-type' => "'''\".\$1\"''' 확장자는 추천하지 않습니다. 추천하는 {{PLURAL:\$3|파일 확장자}}는 \$2입니다.",
-'filetype-banned-type' => '{{PLURAL:$3$4}}\'\'\'".$1"\'\'\' 형식의 파일은 올릴 수 없습니다. $2 형식만 사용할 수 있습니다.',
-'filetype-missing' => '파일에 확장자(‘.jpg’ 등)가 없습니다.',
+'filetype-unwanted-type' => "'''\".\$1\"''' 확장자는 추천하지 않습니다.
+추천하는 {{PLURAL:\$3|파일 확장자}}는 \$2입니다.",
+'filetype-banned-type' => '{{PLURAL:$3$4}}\'\'\'".$1"\'\'\' 형식의 파일은 올릴 수 없습니다.
+$2 형식만 사용할 수 있습니다.',
+'filetype-missing' => '파일에 확장자(".jpg" 등)가 없습니다.',
 'empty-file' => '당신이 올린 파일이 비어 있습니다.',
 'file-too-large' => '올리려는 파일이 너무 큽니다.',
 'filename-tooshort' => '파일 이름이 너무 짧습니다.',
@@ -1723,49 +1808,53 @@ $1",
 'illegal-filename' => '이 파일 이름은 허용되지 않습니다.',
 'overwrite' => '기존 파일을 덮어쓰는 것은 허용되지 않습니다.',
 'unknown-error' => '알 수 없는 오류가 발생했습니다.',
-'tmp-create-error' => '임시 파일을 생성할 수 없습니다.',
+'tmp-create-error' => '임시 파일을 만들 수 없습니다.',
 'tmp-write-error' => '임시 파일을 작성하는 데 오류가 발생했습니다.',
-'large-file' => '파일 크기는 $1을 넘지 않는 것을 추천합니다. 이 파일의 크기는 $2입니다.',
+'large-file' => '파일 크기는 $1을 넘지 않는 것을 추천합니다.
+이 파일의 크기는 $2입니다.',
 'largefileserver' => '이 파일의 크기가 서버에서 허용된 설정보다 큽니다.',
 'emptyfile' => '올리려는 파일이 빈 파일입니다.
 파일 이름을 잘못 입력했을 수도 있습니다.
 올리려는 파일을 다시 한 번 확인해 주시기 바랍니다.',
 'windows-nonascii-filename' => '이 위키에서는 특수 문자가 포함된 파일 이름을 지원하지 않습니다.',
-'fileexists' => "같은 이름의 파일이 이미 있습니다.
-파일을 바꾸고 싶지 않다면 '''<tt>[[:$1]]</tt>''' 파일을 확인해 주세요.
-[[$1|thumb]]",
-'filepageexists' => "이 파일의 설명 문서가 '''<tt>[[:$1]]</tt>'''에 존재하지만, 이 이름을 가진 파일이 존재하지 않습니다.
+'fileexists' => '같은 이름의 파일이 이미 있습니다. 파일을 바꾸고 싶지 않다면 <strong>[[:$1]]</strong> 파일을 확인해 주세요.
+[[$1|thumb]]',
+'filepageexists' => '이 파일의 설명 문서가 <strong>[[:$1]]</strong>에 존재하지만, 이 이름을 가진 파일이 존재하지 않습니다.
 당신이 입력한 설명은 설명 문서에 반영되지 않을 것입니다.
 당신의 설명을 반영시키려면, 직접 편집하셔야 합니다.
-[[$1|thumb]]",
-'fileexists-extension' => "비슷한 이름의 파일이 존재합니다: [[$2|thumb]]
-* 올리려는 파일 이름: '''<tt>[[:$1]]</tt>'''
-* 존재하는 파일 이름: '''<tt>[[:$2]]</tt>'''
-다른 이름으로 시도해 주세요.",
-'fileexists-thumbnail-yes' => "이 파일은 원본 그림이 아닌, 다른 그림의 크기를 줄인 섬네일 파일인 것 같습니다. [[$1|thumb]]
-'''<tt>[[:$1]]</tt>''' 파일을 확인해주세요.
-해당 파일이 현재 올리려는 파일과 같다면, 더 작은 크기의 그림을 올릴 필요는 없습니다.",
-'file-thumbnail-no' => "파일 이름이 '''<tt>$1</tt>'''으로 시작합니다.
+[[$1|thumb]]',
+'fileexists-extension' => '비슷한 이름의 파일이 존재합니다: [[$2|thumb]]
+* 올리려는 파일 이름: <strong>[[:$1]]</strong>
+* 존재하는 파일 이름: <strong>[[:$2]]</strong>
+다른 이름으로 시도해 주세요.',
+'fileexists-thumbnail-yes' => '이 파일은 원본 그림이 아닌, 다른 그림의 크기를 줄인 섬네일 파일인 것 같습니다.
+[[$1|thumb]]
+<strong>[[:$1]]</strong> 파일을 확인해주세요.
+해당 파일이 현재 올리려는 파일과 같다면, 더 작은 크기의 그림을 올릴 필요는 없습니다.',
+'file-thumbnail-no' => '파일 이름이 <strong>$1</strong>으로 시작합니다.
 이 파일은 원본 그림이 아닌, 다른 그림의 크기를 줄인 섬네일 파일인 것 같습니다.
-더 해상도가 좋은 파일이 있다면 그 파일을 올려주세요. 아니면 올리려는 파일 이름을 바꾸어 주세요.",
+더 해상도가 좋은 파일이 있다면 그 파일을 올려주세요. 아니면 올리려는 파일 이름을 바꾸어 주세요.',
 'fileexists-forbidden' => '같은 이름의 파일이 이미 있고, 덮어쓸 수 없습니다.
-그래도 파일을 올리시려면, 뒤로 돌아가서 다른 이름으로 시도해 주시기 바랍니다. [[File:$1|thumb|center|$1]]',
+그래도 파일을 올리시려면, 뒤로 돌아가서 다른 이름으로 시도해 주시기 바랍니다.
+[[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => '같은 이름의 파일이 이미 위키미디어 공용에 있습니다.
-파일을 업로드하길 원하신다면 뒤로 돌아가서 다른 이름으로 시도해 주시기 바랍니다. [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => '{{PLURAL:$1}}현재 올리고 있는 파일이 아래 파일과 중복됩니다:',
+파일을 업로드하길 원하신다면 뒤로 돌아가서 다른 이름으로 시도해 주시기 바랍니다.
+[[File:$1|thumb|center|$1]]',
+'file-exists-duplicate' => '현재 올리고 있는 {{PLURAL:$1|파일}}이 아래 파일과 중복됩니다:',
 'file-deleted-duplicate' => '이 파일과 같은 파일 ([[:$1]])이 이전에 삭제된 적이 있습니다. 파일을 다시 올리기 전에 문서의 삭제 기록을 확인해 주시기 바랍니다.',
 'uploadwarning' => '올리기 경고',
 'uploadwarning-text' => '아래의 파일 설명을 수정하고 다시 시도해 주세요.',
 'savefile' => '파일 저장',
-'uploadedimage' => '‘[[$1]]’ 파일을 올렸습니다.',
-'overwroteimage' => '‘[[$1]]’ 파일의 새 버전을 올렸습니다.',
+'uploadedimage' => '사용자가 "[[$1]]" 파일을 올렸습니다.',
+'overwroteimage' => '사용자가 "[[$1]]" 파일의 새 판을 올렸습니다.',
 'uploaddisabled' => '올리기 비활성화됨',
 'copyuploaddisabled' => 'URL로 파일 올리기가 비활성화되어 있습니다.',
 'uploadfromurl-queued' => '당신의 올리기 명령이 기록되었습니다.',
 'uploaddisabledtext' => '파일 올리기 기능이 비활성화되어 있습니다.',
 'php-uploaddisabledtext' => 'PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.',
 'uploadscripted' => '이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.',
-'uploadvirus' => '파일이 바이러스를 포함하고 있습니다! 상세 설명: $1',
+'uploadvirus' => '파일이 바이러스를 포함하고 있습니다!
+자세한 설명: $1',
 'uploadjava' => '이 ZIP 파일은 자바의 .class 파일을 포함하고 있습니다.
 보안을 위한 제한을 우회할 수 있기 때문에 자바 파일을 올리는 것이 허용되지 않습니다.',
 'upload-source' => '원본 파일',
@@ -1776,9 +1865,9 @@ $1",
 'upload-description' => '파일의 설명',
 'upload-options' => '올리기 설정',
 'watchthisupload' => '이 파일 주시하기',
-'filewasdeleted' => '같은 이름을 가진 파일이 올라온 적이 있었고, 그 후에 삭제되었습니다. 올리기 전에 $1을 확인해 주시기 바랍니다.',
-'filename-bad-prefix' => '올리려고 하는 파일 이름이 \'\'\'"$1"\'\'\'(으)로 시작합니다.
-"$1"은(는) 디지털 사진기가 자동으로 붙이는 의미없는 이름입니다.
+'filewasdeleted' => '같은 이름을 가진 파일이 올라온 적이 있었고 그 후에 삭제되었습니다.
+올리기 전에 $1을 확인해 주시기 바랍니다.',
+'filename-bad-prefix' => '올리려고 하는 파일 이름이 \'\'\'"$1"\'\'\'(으)로 시작합니다. "$1"은(는) 디지털 사진기가 자동으로 붙이는 의미없는 이름입니다.
 파일에 대해 알기 쉬운 이름을 골라주세요.',
 'filename-prefix-blacklist' => ' #<!-- 이 줄은 그대로 두십시오 --> <pre>
 # 문법은 다음과 같습니다:
@@ -1806,9 +1895,12 @@ $1',
 'upload-proto-error' => '잘못된 프로토콜',
 'upload-proto-error-text' => '파일을 URL로 올리려면 <code>http://</code>이나 <code>ftp://</code>로 시작해야 합니다.',
 'upload-file-error' => '내부 오류',
-'upload-file-error-text' => '서버에 임시 파일을 만드는 과정에서 내부 오류가 발생했습니다. [[Special:ListUsers/sysop|관리자]]에게 연락해주세요.',
+'upload-file-error-text' => '서버에 임시 파일을 만드는 과정에서 내부 오류가 발생했습니다.
+[[Special:ListUsers/sysop|관리자]]에게 연락해주세요.',
 'upload-misc-error' => '알 수 없는 파일 올리기 오류',
-'upload-misc-error-text' => '파일을 올리는 중 알 수 없는 오류가 발생했습니다. URL이 올바르고 접근 가능한지를 확인하고 다시 시도해주세요. 문제가 계속되면 [[Special:ListUsers/sysop|관리자]]에게 연락해주세요.',
+'upload-misc-error-text' => '파일을 올리는 중 알 수 없는 오류가 발생했습니다.
+URL이 올바르고 접근 가능한지를 확인하고 다시 시도해주세요.
+문제가 계속되면 [[Special:ListUsers/sysop|관리자]]에게 연락해주세요.',
 'upload-too-many-redirects' => 'URL이 너무 많은 넘겨주기에 연결되어 있습니다.',
 'upload-unknown-size' => '크기를 알 수 없음',
 'upload-http-error' => 'HTTP 오류 발생: $1',
@@ -1832,27 +1924,28 @@ $1',
 'backend-fail-read' => '$1 파일을 읽을 수 없습니다.',
 'backend-fail-create' => '$1 파일을 저장하지 못했습니다.',
 'backend-fail-maxsize' => '$2{{PLURAL:$2|바이트}}보다 커서 $1 파일을 저장하지 못했습니다.',
-'backend-fail-readonly' => '‘$1’ 저장 백엔드가 읽기 전용입니다. 자세한 이유는 다음과 같습니다: “$2”',
+'backend-fail-readonly' => '"$1" 저장 백엔드가 읽기 전용입니다. 자세한 이유는 다음과 같습니다: "$2"',
 'backend-fail-synced' => '파일 "$1"은 내부 저장 백엔드에 불안정한 상태로 있습니다.',
-'backend-fail-connect' => "'$1' 저장 백엔드에 접속하지 못했습니다.",
+'backend-fail-connect' => '"$1" 저장 백엔드에 접속하지 못했습니다.',
 'backend-fail-internal' => '"$1" 저장 백엔드에 알 수 없는 오류가 발생했습니다.',
 'backend-fail-contenttype' => '"$1"에 저장하기 위한 파일의 내용 유형을 판별하지 못했습니다.',
-'backend-fail-batchsize' => '저장 백엔드에서 $1개의 파일 {{PLURAL:$1|작업}}이 쌓여 있습니다; 한계는 $2개입니다.',
+'backend-fail-batchsize' => '저장 백엔드에서 파일 {{PLURAL:$1|작업}} $1개가 쌓여 있습니다. 한계는 $2개입니다.',
 'backend-fail-usable' => '파일 저장 권한이 없거나 저장 위치가 빠졌기 때문에 $1 파일을 저장할 수 없습니다.',
 
 # File journal errors
-'filejournal-fail-dbconnect' => '저장소 백엔드 ‘$1’에 대한 저널 데이터베이스에 연결할 수 없습니다.',
-'filejournal-fail-dbquery' => '저장소 백엔드 â\80\98$1â\80\99ì\97\90 ë\8c\80í\95\9c ì \80ë\84\90 ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90ì\84\9c ê°±ì\8b í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.',
+'filejournal-fail-dbconnect' => '저장소 백엔드 "$1"에 대한 저널 데이터베이스에 연결할 수 없습니다.',
+'filejournal-fail-dbquery' => '저장소 백엔드 "$1"ì\97\90 ë\8c\80í\95\9c ì \80ë\84\90 ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90ì\84\9c ì\83\88ë¡\9c ê³ ì¹  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.',
 
 # Lock manager
-'lockmanager-notlocked' => '‘$1’ 경로의 잠금을 풀 수 없습니다. 해당 경로는 잠겨 있지 않습니다.',
-'lockmanager-fail-closelock' => '‘$1’에 대한 잠금 파일을 닫지 못했습니다.',
-'lockmanager-fail-deletelock' => '‘$1’에 대한 잠금 파일을 삭제하지 못했습니다.',
-'lockmanager-fail-acquirelock' => '‘$1’에 대한 잠금이 실패했습니다.',
-'lockmanager-fail-openlock' => '‘$1’에 대한 잠금 파일을 열지 못했습니다.',
-'lockmanager-fail-releaselock' => '‘$1’에 대한 잠금을 해제하지 못했습니다.',
+'lockmanager-notlocked' => '"$1" 경로의 잠금을 풀 수 없습니다. 해당 경로는 잠겨 있지 않습니다.',
+'lockmanager-fail-closelock' => '"$1"에 대한 잠금 파일을 닫지 못했습니다.',
+'lockmanager-fail-deletelock' => '"$1"에 대한 잠금 파일을 삭제하지 못했습니다.',
+'lockmanager-fail-acquirelock' => '"$1"에 대한 잠금이 실패했습니다.',
+'lockmanager-fail-openlock' => '"$1"에 대한 잠금 파일을 열지 못했습니다.',
+'lockmanager-fail-releaselock' => '"$1"에 대한 잠금을 해제하지 못했습니다.',
 'lockmanager-fail-db-bucket' => '데이터베이스의 버킷 $1의 잠금을 풀지 못했습니다.',
 'lockmanager-fail-db-release' => '데이터베이스 $1의 잠금을 풀지 못했습니다.',
+'lockmanager-fail-svr-acquire' => '서버 $1의 잠금을 걸지 못했습니다.',
 'lockmanager-fail-svr-release' => '서버 $1의 잠금을 풀지 못했습니다.',
 
 # ZipDirectoryReader
@@ -1865,33 +1958,36 @@ $1',
 
 # Special:UploadStash
 'uploadstash' => '파일 올리기 임시 저장',
-'uploadstash-summary' => '이 페이지는 위키에 등록되지는 않았지만 올리는 과정 중에 있는 파일을 열람할 수 있습니다. 이 파일들은 올린이 외에는 볼 수 없습니다.',
+'uploadstash-summary' => '이 문서는 위키에 등록되지는 않았지만 올리는 과정 중에 있는 파일을 접근할 수 있습니다. 이 파일은 올린이 외에는 볼 수 없습니다.',
 'uploadstash-clear' => '임시 저장한 파일 제거하기',
 'uploadstash-nofiles' => '임시 저장한 파일이 없습니다.',
-'uploadstash-badtoken' => 'ì\9d´ ë\8f\99ì\9e\91ì\9d\84 ì\88\98í\96\89í\95\98ë\8a\94 ë\8d° ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤. í\8e¸ì§\91 í\86 í\81°ì\9d´ ë§\8cë£\8cë\90\98ì\97\88ì\9d\84 ê°\80ë\8a¥ì\84±ì\9d´ ì\9e\88ì\8aµë\8b\88ë\8b¤. ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95´ ë³´ì\8b­ì\8b\9cì\98¤.',
+'uploadstash-badtoken' => 'ì\9d´ ë\8f\99ì\9e\91ì\9d\84 ì\88\98í\96\89í\95\98ë\8a\94 ë\8d° ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤. í\8e¸ì§\91 í\86 í\81°ì\9d´ ë§\8cë£\8cë\90\98ì\97\88ì\9d\84 ê°\80ë\8a¥ì\84±ì\9d´ ì\9e\88ì\8aµë\8b\88ë\8b¤. ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98ì\84¸ì\9a\94.',
 'uploadstash-errclear' => '파일을 제거하는 데 실패했습니다.',
 'uploadstash-refresh' => '파일 목록을 새로고침',
 'invalid-chunk-offset' => '청크 오프셋이 잘못되었습니다.',
 
 # img_auth script messages
 'img-auth-accessdenied' => '접근 거부됨',
-'img-auth-nopathinfo' => '서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.
+'img-auth-nopathinfo' => 'PATH_INFO를 잃었습니다.
+서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.
 이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.
 https://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오.',
-'img-auth-notindir' => 'ì\9a\94ì²­í\95\9c ê²½ë¡\9cê°\80 ì\84¤ì \95í\95\9c ì\97\85ë¡\9cë\93\9c 디렉토리에 없습니다.',
-'img-auth-badtitle' => '"$1"에서 바른 제목을 만들 수 없습니다.',
+'img-auth-notindir' => 'ì\9a\94ì²­í\95\9c ê²½ë¡\9cê°\80 ì\84¤ì \95í\95\9c ì\98¬ë¦¬ê¸° 디렉토리에 없습니다.',
+'img-auth-badtitle' => '"$1"에서 바른 제목을 만들 수 없습니다.',
 'img-auth-nologinnWL' => '당신은 로그인하지 않았으며 "$1" 파일은 화이트리스트에 존재하지 않습니다.',
 'img-auth-nofile' => '"$1" 파일이 없습니다.',
 'img-auth-isdir' => '"$1" 디렉토리에 접근을 시도했습니다.
 파일에만 접근할 수 있습니다.',
-'img-auth-streaming' => '‘$1’ 파일을 전송하는 중입니다.',
-'img-auth-public' => 'img_auth.php는 개인 위키 파일을 외부 사이트로 전송하는 기능입니다. 이 기능은 기본적으로 공개적인 위키에서 사용하도록 설계되어 있으며, 보안적인 문제로 기본적으로 img_auth.php 기능은 비활성화되어 있습니다.',
-'img-auth-noread' => '‘$1’ 파일을 볼 권한이 없습니다.',
+'img-auth-streaming' => '"$1" 파일을 전송하는 중입니다.',
+'img-auth-public' => 'img_auth.php는 개인 위키 파일을 외부 사이트로 전송하는 기능입니다.
+이 기능은 기본적으로 공개적인 위키에서 사용하도록 설계되어 있습니다.
+보안적인 문제로 기본적으로 img_auth.php 기능은 비활성화되어 있습니다.',
+'img-auth-noread' => '"$1" 파일을 볼 권한이 없습니다.',
 'img-auth-bad-query-string' => 'URL에 잘못된 쿼리 문자열이 있습니다.',
 
 # HTTP errors
 'http-invalid-url' => '잘못된 URL: $1',
-'http-invalid-scheme' => '‘$1’로 시작하는 URL은 지원되지 않습니다.',
+'http-invalid-scheme' => '"$1"로 시작하는 URL은 지원되지 않습니다.',
 'http-request-error' => '알 수 없는 오류로 HTTP 요청에 실패했습니다.',
 'http-read-error' => 'HTTP 읽기 오류.',
 'http-timed-out' => 'HTTP 요청 시간 초과.',
@@ -1904,7 +2000,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오
 'upload-curl-error6-text' => 'URL에 접근할 수 없습니다.
 URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'upload-curl-error28' => '업로드 시간 초과',
-'upload-curl-error28-text' => '사이트에서 응답하는 시간이 너무 깁니다. 사이트 접속이 가능한지 확인한 다음 다시 시도해주세요. 해당 사이트에 접속이 많을 경우, 접속이 원활한 시간대에 시도해주세요.',
+'upload-curl-error28-text' => '사이트에서 응답하는 시간이 너무 깁니다.
+사이트 접속이 가능한지 확인한 다음 다시 시도해주세요.
+해당 사이트에 접속이 많을 경우 접속이 원활한 시간대에 시도해주세요.',
 
 'license' => '라이선스:',
 'license-header' => '라이선스',
@@ -1937,7 +2035,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filehist-current' => '최신',
 'filehist-datetime' => '날짜/시간',
 'filehist-thumb' => '섬네일',
-'filehist-thumbtext' => '$1 버전의 파일',
+'filehist-thumbtext' => '$1 의 파일',
 'filehist-nothumb' => '섬네일 없음',
 'filehist-user' => '사용자',
 'filehist-dimensions' => '크기',
@@ -1945,7 +2043,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filehist-comment' => '내용',
 'filehist-missing' => '파일을 찾을 수 없음',
 'imagelinks' => '이 파일을 사용하는 문서',
-'linkstoimage' => '다음 $1ê°\9cì\9d\98 ë¬¸ì\84\9cê°\80 ì\9d´ í\8c\8cì\9d¼ì\9d\84 ì\82¬ì\9a©í\95\98ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤:',
+'linkstoimage' => '다음 ë¬¸ì\84\9c $1ê°\9cê°\80 ì\9d´ í\8c\8cì\9d¼ì\9d\84 ì\82¬ì\9a©í\95\98ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤:',
 'linkstoimage-more' => '$1개 이상의 문서가 이 파일을 가리키고 있습니다.
 다음 목록은 이 파일을 가리키는 처음 $1개 문서만 보여주고 있습니다.
 이 파일을 가리키는 모든 문서를 보려면 [[Special:WhatLinksHere/$2|여기]]를 참고해 주십시오.',
@@ -1968,7 +2066,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'shared-repo-from' => '($1)',
 'shared-repo' => '공용 저장소',
 'shared-repo-name-wikimediacommons' => '위키미디어 공용',
-'filepage.css' => '/* 이 CSS 설정은 파일 설명 페이지에 포함되며, 또한 해외 클라이언트 위키에 포함됩니다 */',
+'filepage.css' => '/* 이 CSS 설정은 파일 설명 문서에 포함되며, 또한 해외 클라이언트 위키에 포함됩니다 */',
+'upload-disallowed-here' => '죄송하지만 이 그림을 덮어 쓸 수 없습니다.',
 
 # File reversion
 'filerevert' => '$1 되돌리기',
@@ -2001,8 +2100,9 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filedelete-maintenance-title' => '파일을 삭제할 수 없습니다',
 
 # MIME search
-'mimesearch' => 'MIME 검색',
-'mimesearch-summary' => 'MIME 타입에 해당하는 파일을 검색합니다. MIME 값을 <tt>image/jpeg</tt> 형태로 입력해주세요.',
+'mimesearch' => 'MIME 찾기',
+'mimesearch-summary' => 'MIME 타입에 해당하는 파일을 찾습니다.
+다음 형태로 입력해주세요: 내용종류/하위종류, 예를 들어 <code>image/jpeg</code>',
 'mimetype' => 'MIME 종류:',
 'download' => '다운로드',
 
@@ -2015,7 +2115,6 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 # Unused templates
 'unusedtemplates' => '사용하지 않는 틀 목록',
 'unusedtemplatestext' => '다른 문서에서 사용하지 않는 {{ns:template}} 이름공간 문서의 목록입니다.
-
 삭제하기 전에 사용 여부를 다시 확인해 주세요.',
 'unusedtemplateswlh' => '다른 링크',
 
@@ -2036,12 +2135,12 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'statistics-header-hooks' => '기타 통계',
 'statistics-articles' => '일반 문서',
 'statistics-pages' => '전체 문서',
-'statistics-pages-desc' => '토론 문서, 넘겨주기 문서 등을 포함.',
+'statistics-pages-desc' => '토론 문서, 넘겨주기 문서 등을 포함하는 모든 문서.',
 'statistics-files' => '올려져 있는 파일',
 'statistics-edits' => '{{SITENAME}} 설치 후 문서의 전체 편집 횟수',
 'statistics-edits-average' => '문서당 평균 편집 횟수',
 'statistics-views-total' => '총 방문 수',
-'statistics-views-total-desc' => '존재하지 않는 문서나 특수 문서에 대한 방문수는 집계ë\90\98ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤.',
+'statistics-views-total-desc' => '존재하지 않는 문서나 특수 문서에 대한 방문수는 집계í\95\98ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤.',
 'statistics-views-peredit' => '편집당 방문 횟수',
 'statistics-users' => '등록된 [[Special:ListUsers|사용자]]',
 'statistics-users-active' => '활동적인 사용자',
@@ -2049,16 +2148,17 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'statistics-mostpopular' => '가장 많이 읽힌 문서',
 
 'disambiguations' => '동음이의 문서를 가리키는 문서 목록',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "ë\8b¤ì\9d\8cì\9d\98 ë¬¸ì\84\9cë\93¤ì\9d\80 '''동음이의 문서'''를 가리키고 있습니다.
-ê·¸ ë§\81í\81¬ë¥¼ ë\8b¤ë¥¸ ì \81ì \88í\95\9c ë¬¸ì\84\9cë¡\9c ì\97°ê²°í\95´ ì£¼ì\96´ì\95¼ í\95©니다.<br />
+'disambiguationspage' => 'Template:disambig',
+'disambiguations-text' => "ë\8b¤ì\9d\8cì\9d\98 ë¬¸ì\84\9cë\8a\94 ì \81ì\96´ë\8f\84 í\95\98ë\82\98 ì\9d´ì\83\81 '''동음이의 문서'''를 가리키고 있습니다.
+ê·¸ ë§\81í\81¬ë\8a\94 ë\8b¤ë¥¸ ì \81ì \88í\95\9c ë¬¸ì\84\9cë¡\9c ì\97°ê²°í\95  í\95\84ì\9a\94ê°\80 ì\9e\88ì\8aµ니다.<br />
 [[MediaWiki:Disambiguationspage]]에서 링크된 틀을 사용하는 문서를 동음이의 문서로 간주합니다.",
 
 'doubleredirects' => '이중 넘겨주기 목록',
 'doubleredirectstext' => '이 문서는 다른 넘겨주기 문서로 넘겨주고 있는 문서의 목록입니다.
 매 줄에는 첫 번째 문서와 두 번째 문서의 링크가 있습니다. 그리고 보통 첫 번째 문서가 넘겨주어야 할 "실제" 문서인 두 번째 넘겨주기의 대상이 있습니다.
-<del>취소선이 그인</del> 부분은 이미 해결되었습니다.',
-'double-redirect-fixed-move' => '[[$1]] 문서를 옮겼습니다. 이 문서는 이제 [[$2]] 문서로 넘겨줍니다.',
+<del>취소선이 그어진</del> 부분은 이미 해결되었습니다.',
+'double-redirect-fixed-move' => '[[$1]] 문서를 옮겼습니다.
+이 문서는 이제 [[$2]] 문서로 넘겨줍니다.',
 'double-redirect-fixed-maintenance' => '[[$1]]에서 [[$2]]로 이중 넘겨주기를 고치는 중',
 'double-redirect-fixer' => '넘겨주기 수리꾼',
 
@@ -2077,12 +2177,13 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 # Miscellaneous special pages
 'nbytes' => '$1 바이트',
 'ncategories' => '분류 $1개',
+'ninterwikis' => '{{PLURAL:$1|인터위키}} $1개',
 'nlinks' => '링크 $1개',
 'nmembers' => '문서 $1개',
 'nrevisions' => '편집 $1개',
 'nviews' => '$1회 읽음',
-'nimagelinks' => '{{PLURAL:$1}}ê°\9c ë¬¸ì\84\9cì\97\90ì\84\9c ì\82¬ì\9a© ì¤\91',
-'ntransclusions' => '{{PLURAL:$1}}ê°\9c ë¬¸ì\84\9cì\97\90ì\84\9c ì\82¬ì\9a© ì¤\91',
+'nimagelinks' => '문ì\84\9c $1ê°\9cì\97\90ì\84\9c ì\82¬ì\9a© ì¤\91',
+'ntransclusions' => '문ì\84\9c $1ê°\9cì\97\90ì\84\9c ì\82¬ì\9a© ì¤\91',
 'specialpage-empty' => '명령에 대한 결과가 없습니다.',
 'lonelypages' => '외톨이 문서 목록',
 'lonelypagestext' => '{{SITENAME}}에서 다른 모든 문서에서 링크되거나 틀로 포함되지 않은 문서의 목록입니다.',
@@ -2105,6 +2206,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'mostlinkedtemplates' => '가장 많이 사용된 틀 목록',
 'mostcategories' => '가장 많이 분류된 문서 목록',
 'mostimages' => '가장 많이 사용된 파일 목록',
+'mostinterwikis' => '가장 많이 인터위키가 달린 문서 목록',
 'mostrevisions' => '가장 많이 편집된 문서 목록',
 'prefixindex' => '접두어에 따른 문서 목록',
 'prefixindex-namespace' => '접두어가 있는 모든 문서 ($1 이름공간)',
@@ -2117,22 +2219,22 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'protectedpages-cascade' => '연쇄적 보호만 보기',
 'protectedpagestext' => '다음의 문서는 이동/편집이 불가능하도록 보호되어 있습니다.',
 'protectedpagesempty' => '보호되어 있는 문서가 없습니다.',
-'protectedtitles' => '생성 보호된 표제어 목록',
-'protectedtitlestext' => 'ë\8b¤ì\9d\8c í\91\9cì \9cì\96´ë\93¤ì\9d\80 ì\83\9dì\84±ì\9d´ 금지되어 있습니다.',
-'protectedtitlesempty' => '해당 조건에 맞는 생성 금지 표제어가 없습니다.',
+'protectedtitles' => '만들기 보호된 표제어 목록',
+'protectedtitlestext' => 'ë\8b¤ì\9d\8c í\91\9cì \9cì\96´ë\8a\94 ë§\8cë\93¤ê¸°ê°\80 금지되어 있습니다.',
+'protectedtitlesempty' => '해당 조건에 맞는 만들기 금지 표제어가 없습니다.',
 'listusers' => '사용자 목록',
 'listusers-editsonly' => '기여가 있는 사용자만 보기',
 'listusers-creationsort' => '계정 등록일 순으로 정렬',
-'usereditcount' => '편집 $1',
-'usercreated' => '$1 $2에 계정 {{GENDER:$3|생성됨}}',
+'usereditcount' => '편집 $1',
+'usercreated' => '$1 $2에 계정 {{GENDER:$3|만들어짐}}',
 'newpages' => '새 문서 목록',
-'newpages-username' => '이름:',
+'newpages-username' => 'ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84:',
 'ancientpages' => '오래된 문서 목록',
 'move' => '이동',
 'movethispage' => '문서 이동하기',
 'unusedimagestext' => '다음은 어떤 문서도 사용하지 않는 파일의 목록입니다.
 다른 사이트에서 URL 접근을 통해 파일을 사용할 수 있기 때문에, 아래 목록에 있는 파일도 실제로 사용 중일 가능성이 있다는 점을 주의해주세요.',
-'unusedcategoriestext' => '사용하지 않는 분류 문서의 목록입니다.',
+'unusedcategoriestext' => '사용하지 않는 분류 문서의 목록입니다.',
 'notargettitle' => '해당하는 문서 없음',
 'notargettext' => '기능을 수행할 대상 문서나 사용자를 지정하지 않았습니다.',
 'nopagetitle' => '해당 문서 없음',
@@ -2147,7 +2249,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'booksources-search-legend' => '책 찾기',
 'booksources-go' => '찾기',
 'booksources-text' => '아래의 목록은 새 책이나 중고 책을 판매하는 외부 사이트로, 원하는 책의 정보를 얻을 수 있습니다:',
-'booksources-invalid-isbn' => '입력한 ISBN이 잘못된 것으로 보입니다; 원본과 대조해 보십시오.',
+'booksources-invalid-isbn' => '입력한 ISBN이 잘못된 것으로 보입니다. 원본과 대조해 보세요.',
 
 # Special:Log
 'specialloguserlabel' => '작업 수행자:',
@@ -2155,9 +2257,9 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'log' => '기록 목록',
 'all-logs-page' => '모든 공개 기록',
 'alllogstext' => '{{SITENAME}}에서의 기록이 모두 나와 있습니다.
-로그 종류, 계정 이름, 문서 이름을 선택해서 볼 수 있습니다. 검색시에는 대소문자를 구별합니다.',
+기록 종류, 사용자 이름, 문서 이름을 선택해서 볼 수 있습니다. (대소문자를 구별합니다.)',
 'logempty' => '일치하는 항목이 없습니다.',
-'log-title-wildcard' => '다음 글로 시작하는 제목 검색',
+'log-title-wildcard' => '다음 글로 시작하는 제목 찾기',
 'showhideselectedlogentries' => '선택한 기록 항목 보이기/숨기기',
 
 # Special:AllPages
@@ -2174,8 +2276,9 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'allpagesnext' => '다음',
 'allpagessubmit' => '표시',
 'allpagesprefix' => '다음으로 시작하는 문서 보기:',
-'allpagesbadtitle' => '문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키를 가지고 있습니다. 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
-'allpages-bad-ns' => '{{SITENAME}}에서는 ‘$1’ 이름공간을 사용하지 않습니다.',
+'allpagesbadtitle' => '문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키를 가지고 있습니다.
+문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
+'allpages-bad-ns' => '{{SITENAME}}에서는 "$1" 이름공간을 사용하지 않습니다.',
 'allpages-hide-redirects' => '넘겨주기 숨기기',
 
 # SpecialCachedPage
@@ -2188,7 +2291,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'categoriespagetext' => '{{PLURAL:$1}}문서나 자료를 담고 있는 분류 목록입니다.
 [[Special:UnusedCategories|사용되지 않는 분류]]는 여기에 보이지 않습니다.
 [[Special:WantedCategories|필요한 분류]]도 참고하세요.',
-'categoriesfrom' => 'ë\8b¤ì\9d\8cì\9c¼ë¡\9c ì\8b\9cì\9e\91í\95\98ë\8a\94 ë¶\84ë¥\98ë\93¤ì\9d\84 보여주기:',
+'categoriesfrom' => 'ë\8b¤ì\9d\8cì\9c¼ë¡\9c ì\8b\9cì\9e\91í\95\98ë\8a\94 ë¶\84ë¥\98를 보여주기:',
 'special-categories-sort-count' => '항목 갯수 순으로 정렬',
 'special-categories-sort-abc' => '알파벳순으로 정렬',
 
@@ -2198,13 +2301,13 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'sp-deletedcontributions-contribs' => '기여',
 
 # Special:LinkSearch
-'linksearch' => '외부 링크 검색',
-'linksearch-pat' => '검색 패턴:',
+'linksearch' => '바깥 링크 찾기',
+'linksearch-pat' => '찾기 패턴:',
 'linksearch-ns' => '이름공간:',
-'linksearch-ok' => '검색',
+'linksearch-ok' => '찾기',
 'linksearch-text' => '"*.wikipedia.org"와 같이 와일드카드를 사용할 수 있습니다.
 적어도 "*.org"와 같이 최상위 도메인을 입력해야 합니다.<br />
-지원하는 프로토콜 목록: <tt>$1</tt> (검색할 때 이것을 추가하지 마세요)',
+지원하는 프로토콜 목록: <code>$1</code> (찾을 때 이것을 추가하지 마세요)',
 'linksearch-line' => '$2에서 $1 을 링크하고 있습니다.',
 'linksearch-error' => '와일드카드는 주소의 처음 부분에만 사용될 수 있습니다.',
 
@@ -2237,19 +2340,21 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'listgrouprights-rights' => '권한',
 'listgrouprights-helppage' => 'Help:사용자 권한 그룹',
 'listgrouprights-members' => '(사용자 목록)',
-'listgrouprights-addgroup' => '{{PLURAL:$2}}권한 부여: $1',
-'listgrouprights-removegroup' => '{{PLURAL:$2}}권한 회수: $1',
+'listgrouprights-addgroup' => '{{PLURAL:$2|권한}} 부여: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|권한}} 회수: $1',
 'listgrouprights-addgroup-all' => '모든 권한을 부여',
 'listgrouprights-removegroup-all' => '모든 권한을 회수',
-'listgrouprights-addgroup-self' => '자신에게 다음 {{PLURAL:$2|권한|권한}}을 부여: $1',
-'listgrouprights-removegroup-self' => '자신에게서 다음 {{PLURAL:$2|권한|권한}}을 해제: $1',
+'listgrouprights-addgroup-self' => '자신에게 다음 {{PLURAL:$2|권한}}을 부여: $1',
+'listgrouprights-removegroup-self' => '자신에게서 다음 {{PLURAL:$2|권한}}을 해제: $1',
 'listgrouprights-addgroup-self-all' => '자신에게 모든 권한을 부여',
 'listgrouprights-removegroup-self-all' => '자신의 계정에서 모든 권한을 해제',
 
 # E-mail user
 'mailnologin' => '보낼 이메일 주소가 없음',
-'mailnologintext' => '다른 사용자에게 이메일을 보내려면, [[Special:UserLogin|로그인]]한 다음 [[Special:Preferences|사용자 환경 설정]]에서 자신의 이메일 주소를 저장해야 합니다.',
+'mailnologintext' => '다른 사용자에게 이메일을 보내려면 [[Special:UserLogin|로그인]]한 다음 [[Special:Preferences|사용자 환경 설정]]에서 자신의 이메일 주소를 저장해야 합니다.',
 'emailuser' => '이메일 보내기',
+'emailuser-title-target' => '이 {{GENDER:$1|사용자}} 이메일',
+'emailuser-title-notarget' => '사용자 이메일',
 'emailpage' => '사용자에게 이메일 보내기',
 'emailpagetext' => '이 사용자가 환경 설정에 올바른 이메일 주소를 적었다면, 아래 양식을 통해 이메일을 보낼 수 있습니다.
 이메일을 받은 사용자가 바로 답장할 수 있도록 하기 위해 당신이 [[Special:Preferences|사용자 환경 설정]]에 적은 이메일 주소가 "발신자" 정보에 들어갑니다. 따라서 수신자가 당신에게 직접 답장을 보낼 수 있습니다.',
@@ -2261,9 +2366,9 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'noemailtext' => '이 사용자는 올바른 이메일 주소를 입력하지 않았습니다.',
 'nowikiemailtitle' => '이메일이 허용되지 않음',
 'nowikiemailtext' => '이 사용자는 다른 사용자로부터의 이메일을 받지 않도록 설정하였습니다.',
-'emailnotarget' => '수신자로 없는 사용자를 지정하였거나 계정 이름이 잘못되었습니다.',
-'emailtarget' => '수신자 계정명 입력',
-'emailusername' => '계정 이름:',
+'emailnotarget' => '받는이로 없는 사용자를 지정하였거나 사용자 이름이 잘못되었습니다.',
+'emailtarget' => '수신자 사용자 이름 입력',
+'emailusername' => '사용자 이름:',
 'emailusernamesubmit' => '확인',
 'email-legend' => '{{SITENAME}}의 다른 사용자에게 이메일을 보내기',
 'emailfrom' => '이메일 발신자:',
@@ -2275,12 +2380,11 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'emailccsubject' => '$1에게 보낸 메일 사본: $2',
 'emailsent' => '이메일 보냄',
 'emailsenttext' => '이메일을 보냈습니다.',
-'emailuserfooter' => '이 이메일은 {{SITENAME}}의 $1 사용자가 $2 사용자에게 "이메일 보내기" 기능을 통해 ì \84ì\86¡ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.',
+'emailuserfooter' => '이 이메일은 {{SITENAME}}의 $1 사용자가 $2 사용자에게 "이메일 보내기" 기능을 통해 ë³´ë\83\88ì\8aµë\8b\88ë\8b¤.',
 
 # User Messenger
 'usermessage-summary' => '시스템 메시지 남기기',
 'usermessage-editor' => '시스템 메신저',
-'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
 'watchlist' => '주시문서 목록',
@@ -2304,13 +2408,13 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'watchnochange' => '주어진 기간 중에 바뀐 주시문서가 없습니다.',
 'watchlist-details' => '토론을 제외하고 문서 $1개를 주시하고 있습니다.',
 'wlheader-enotif' => '* 이메일 알림 기능이 활성화되었습니다.',
-'wlheader-showupdated' => "* ë§\88ì§\80ë§\89ì\9c¼ë¡\9c ë°©ë¬¸í\95\9c ì\9d´í\9b\84ì\97\90 ë°\94ë\80\90 ë¬¸ì\84\9cë\93¤ì\9d\80 '''굵은 글씨'''로 표시됩니다.",
+'wlheader-showupdated' => "* ë§\88ì§\80ë§\89ì\9c¼ë¡\9c ë°©ë¬¸í\95\9c ì\9d´í\9b\84ì\97\90 ë°\94ë\80\90 ë¬¸ì\84\9cë\8a\94 '''굵은 글씨'''로 표시됩니다.",
 'watchmethod-recent' => '주시된 문서를 확인하고자 최근 편집을 확인',
 'watchmethod-list' => '최근 편집을 확인하고자 주시된 문서 확인',
 'watchlistcontains' => '문서 $1개를 주시하고 있습니다.',
-'iteminvalidname' => '"$1" 항목에 문제가 발생했습니다. 이름이 잘못되었습니다...',
+'iteminvalidname' => "'$1' 항목에 문제가 발생했습니다. 이름이 잘못되었습니다...",
 'wlnote' => "다음은 최근 '''$2'''시간 동안 바뀐 문서 '''$1'''개 입니다. ($3 $4 기준)",
-'wlshowlast' => '최근 $1 시간 $2 일 또는 $3 동안에 바뀐 문서',
+'wlshowlast' => '최근 $1시간 $2일 또는 $3 동안에 바뀐 문서',
 'watchlist-options' => '주시문서 목록 설정',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2325,8 +2429,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'changed' => '바꾸',
 'created' => '만들',
 'enotif_subject' => '{{SITENAME}}에서 $PAGEEDITOR 사용자가 $PAGETITLE 문서를 $CHANGEDORCREATED었습니다.',
-'enotif_lastvisited' => 'ë§\88ì§\80ë§\89ì\9c¼ë¡\9c ë°©ë¬¸í\95\9c ë\92¤ ì\83\9d긴 ëª¨ë\93  ë³\80ê²½ ì\82¬í\95­ì\9d\84 ë³´ë ¤ë©´ $1ì\9d\84(를) ë³´ì\8b­ì\8b\9cì\98¤.',
-'enotif_lastdiff' => 'ì\9d´ ë°\94ë\80\90 ë\82´ì\9a©ì\9d\84 ë³´ë ¤ë©´ $1ì\9d\84 ë³´ì\8b­ì\8b\9cì\98¤.',
+'enotif_lastvisited' => 'ë§\88ì§\80ë§\89ì\9c¼ë¡\9c ë°©ë¬¸í\95\9c ë\92¤ ì\83\9d긴 ëª¨ë\93  ë°\94ë\80\9c ì\82¬í\95­ì\9d\84 ë³´ë ¤ë©´ $1ì\9d\84(를) ë³´ì\84¸ì\9a\94.',
+'enotif_lastdiff' => 'ì\9d´ ë°\94ë\80\90 ë\82´ì\9a©ì\9d\84 ë³´ë ¤ë©´ $1ì\9d\84 ë³´ì\84¸ì\9a\94.',
 'enotif_anon_editor' => '익명 사용자 $1',
 'enotif_body' => '$WATCHINGUSERNAME님,
 
@@ -2343,7 +2447,7 @@ $NEWPAGE
 이 문서를 열기 전에는 다른 알림 이메일을 더 이상 보내지 않습니다.
 모든 주시 문서의 알림 딱지를 초기화할 수도 있습니다.
 
-             {{SITENAME}} 알림 시스템
+{{SITENAME}} 알림 시스템
 
 --
 이메일 알림 설정을 바꾸시려면 이곳을 방문해주세요:
@@ -2361,19 +2465,21 @@ $UNWATCHURL
 # Delete
 'deletepage' => '문서 삭제하기',
 'confirm' => '확인',
-'excontent' => '내용: ‘$1’',
-'excontentauthor' => "내용: ‘$1’ (유일한 편집자는 '[[Special:Contributions/$2|$2]]')",
-'exbeforeblank' => '비우기 전의 내용: ‘$1’',
+'excontent' => '내용: "$1"',
+'excontentauthor' => '내용: "$1" (유일한 편집자는 "[[Special:Contributions/$2|$2]]")',
+'exbeforeblank' => '비우기 전의 내용: "$1"',
 'exblank' => '빈 문서',
-'delete-confirm' => '‘$1’ 삭제',
+'delete-confirm' => '"$1" 삭제',
 'delete-legend' => '삭제',
-'historywarning' => "'''주의''': 삭제하려는 문서에 약 $1개의 과거 편집 내역이 있습니다:",
-'confirmdeletetext' => '문서와 문서 역사를 삭제하려고 합니다. 삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.',
+'historywarning' => "'''경고:''' 삭제하려는 문서에 과거 편집 내역 약 $1개가 있습니다:",
+'confirmdeletetext' => '문서와 문서 역사를 삭제하려고 합니다.
+삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.',
 'actioncomplete' => '명령 완료',
 'actionfailed' => '명령 실패',
-'deletedtext' => '‘$1’ 문서를 삭제했습니다. 최근 삭제 기록은 $2에 있습니다.',
+'deletedtext' => '"$1" 문서를 삭제했습니다.
+최근 삭제 기록은 $2에 있습니다.',
 'dellogpage' => '삭제 기록',
-'dellogpagetext' => '아래의 목록은 최근에 삭제된 문서입니다.',
+'dellogpagetext' => '아래의 목록은 최근에 삭제된 문서입니다.',
 'deletionlog' => '삭제 기록',
 'reverted' => '이전 버전으로 되돌렸습니다.',
 'deletecomment' => '이유:',
@@ -2382,9 +2488,10 @@ $UNWATCHURL
 'deletereason-dropdown' => '*일반적인 삭제 이유
 ** 작성자의 요청
 ** 저작권 침해
-** 잘못된 문서',
+** 훼손 행위',
 'delete-edit-reasonlist' => '삭제 이유 편집',
-'delete-toobig' => '이 문서에는 편집 역사가 $1개 있습니다. 편집 역사가 긴 문서를 삭제하면 {{SITENAME}}에 큰 혼란을 줄 수 있기 때문에 삭제할 수 없습니다.',
+'delete-toobig' => '이 문서에는 편집 역사가 $1개 있습니다.
+편집 역사가 긴 문서를 삭제하면 {{SITENAME}}에 큰 혼란을 줄 수 있기 때문에 삭제할 수 없습니다.',
 'delete-warning-toobig' => '이 문서에는 편집 역사가 $1개 있습니다.
 편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.
 주의해 주세요.',
@@ -2393,30 +2500,36 @@ $UNWATCHURL
 'rollback' => '편집 되돌리기',
 'rollback_short' => '되돌리기',
 'rollbacklink' => '되돌리기',
+'rollbacklinkcount' => '되돌리기 편집 $1회',
+'rollbacklinkcount-morethan' => '되돌리기 편집 $1회 이상',
 'rollbackfailed' => '되돌리기 실패',
-'cantrollback' => '편집을 되돌릴 수 없습니다. 문서를 편집한 사용자가 한명뿐입니다.',
-'alreadyrolled' => '[[:$1]]에서 [[User:$2|$2]] ([[User talk:$2|토론]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) 의 편집을 되돌릴 수 없습니다; 누군가가 이미 문서를 고치거나 되돌렸습니다.
+'cantrollback' => '편집을 되돌릴 수 없습니다.
+문서를 편집한 사용자가 한명뿐입니다.',
+'alreadyrolled' => '[[:$1]]에서 [[User:$2|$2]] ([[User talk:$2|토론]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])의 편집을 되돌릴 수 없습니다.
+누군가가 이미 문서를 고치거나 되돌렸습니다.
 
-마지막으로 이 문서를 편집한 사용자는 [[User:$3|$3]] ([[User talk:$3|토론]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) 입니다.',
-'editcomment' => "편집 요약: ''$1''",
+마지막으로 이 문서를 편집한 사용자는 [[User:$3|$3]] ([[User talk:$3|토론]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])입니다.',
+'editcomment' => '편집 요약: "$1"',
 'revertpage' => '[[Special:Contributions/$2|$2]]([[User talk:$2|토론]])의 편집을 [[User:$1|$1]]의 마지막 버전으로 되돌림',
-'revertpage-nouser' => '(계정 이름 삭제됨)의 편집을 [[User:$1|$1]]의 마지막 편집으로 되돌림',
+'revertpage-nouser' => '(사용자 이름 삭제됨)의 편집을 [[User:$1|$1]]의 마지막 편집으로 되돌림',
 'rollback-success' => '$1의 편집을 $2의 마지막 버전으로 되돌렸습니다.',
 
 # Edit tokens
 'sessionfailure-title' => '세션 손실',
-'sessionfailure' => '로그인 세션에 문제가 발생한 것 같습니다. 세션 하이재킹을 막기 위해 동작이 취소되었습니다. 브라우저의 "뒤로" 버튼을 누르고 문서를 새로고침한 후에 다시 시도해 주세요.',
+'sessionfailure' => '로그인 세션에 문제가 발생한 것 같습니다.
+세션 하이재킹을 막기 위해 동작이 취소되었습니다.
+브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.',
 
 # Protect
 'protectlogpage' => '문서 보호 기록',
-'protectlogtext' => 'ì\95\84ë\9e\98ì\9d\98 ëª©ë¡\9dì\9d\80 ë¬¸ì\84\9c ë³´í\98¸ì\97\90 ê´\80í\95\9c ë³\80ê²½ 사항에 대한 기록입니다.
\98\84ì\9e¬ ë³´í\98¸ë\90\9c ë¬¸ì\84\9cì\9d\98 ëª©ë¡\9dì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[Special:ProtectedPages|ë³´í\98¸ë\90\9c ë¬¸ì\84\9c ëª©ë¡\9d]]ì\9d\84 ì°¸ê³ í\95\98ì\8b­ì\8b\9cì\98¤.',
-'protectedarticle' => '‘[[$1]]’ 문서를 보호함',
-'modifiedarticleprotection' => '‘[[$1]]’ 문서의 보호 설정을 변경함',
-'unprotectedarticle' => '‘[[$1]]’ 문서를 보호 해제함',
-'movedarticleprotection' => '문서의 보호 설정을 "[[$2]]"에서 "[[$1]]"으로 옮김',
-'protect-title' => '‘$1’ 보호하기',
-'protect-title-notallowed' => '‘$1’ 문서의 보호 수준 보기',
+'protectlogtext' => 'ì\95\84ë\9e\98ì\9d\98 ëª©ë¡\9dì\9d\80 ë¬¸ì\84\9c ë³´í\98¸ì\97\90 ê´\80í\95\9c ë°\94ë\80\9c 사항에 대한 기록입니다.
\98\84ì\9e¬ ë³´í\98¸ë\90\9c ë¬¸ì\84\9cì\9d\98 ëª©ë¡\9dì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[Special:ProtectedPages|ë³´í\98¸ë\90\9c ë¬¸ì\84\9c ëª©ë¡\9d]]ì\9d\84 ì°¸ê³ í\95\98ì\84¸ì\9a\94.',
+'protectedarticle' => '사용자가 "[[$1]]" 문서를 보호함',
+'modifiedarticleprotection' => '사용자가 "[[$1]]" 문서의 보호 설정을 바꿈',
+'unprotectedarticle' => '사용자가 "[[$1]]" 문서를 보호 해제함',
+'movedarticleprotection' => '사용자가 문서의 보호 설정을 "[[$2]]"에서 "[[$1]]"으로 옮김',
+'protect-title' => '"$1" 보호하기',
+'protect-title-notallowed' => '"$1" 문서의 보호 수준 보기',
 'prot_1movedto2' => '[[$1]] 문서를 [[$2]] 문서로 이동함',
 'protect-badnamespace-title' => '보호할 수 없는 이름공간',
 'protect-badnamespace-text' => '이 이름공간에 있는 문서는 보호할 수 없습니다.',
@@ -2426,14 +2539,17 @@ $UNWATCHURL
 'protect_expiry_invalid' => '보호 기간이 잘못되었습니다.',
 'protect_expiry_old' => '기한을 과거로 입력했습니다.',
 'protect-unchain-permissions' => '다른 보호 설정을 수동으로 설정하기',
-'protect-text' => "'''$1''' 문서의 보호 수준을 보거나 변경할 수 있습니다.",
-'protect-locked-blocked' => "차단된 동안에는 보호 설정을 바꿀 수 없습니다. '''$1''' 문서의 보호 설정은 다음과 같습니다:",
-'protect-locked-dblock' => "데이터베이스가 잠겨 문서 보호 설정을 바꿀 수 없습니다. '''$1''' 문서의 현재 설정은 다음과 같습니다:",
-'protect-locked-access' => "문서 보호 수준을 변경할 권한이 없습니다. '''$1''' 문서의 권한은 다음과 같습니다.",
+'protect-text' => "'''$1''' 문서의 보호 수준을 보거나 바꿀 수 있습니다.",
+'protect-locked-blocked' => "차단된 동안에는 보호 설정을 바꿀 수 없습니다.
+'''$1''' 문서의 보호 설정은 다음과 같습니다:",
+'protect-locked-dblock' => "데이터베이스가 잠겨 문서 보호 설정을 바꿀 수 없습니다.
+'''$1''' 문서의 현재 설정은 다음과 같습니다:",
+'protect-locked-access' => "문서 보호 수준을 바꿀 권한이 없습니다.
+'''$1''' 문서의 권한은 다음과 같습니다.",
 'protect-cascadeon' => '다음 {{PLURAL:$1|문서}}에 연쇄적 보호가 작동하고 있어 그 문서에 속한 이 문서도 현재 보호됩니다.
-사용자께서는 이 문서의 보호 설정을 바꾸실 수 있지만, 연쇄적 보호에는 영향을 주지 않습니다.',
+사용자는 이 문서의 보호 설정을 바꾸실 수 있지만 연쇄적 보호에는 영향을 주지 않습니다.',
 'protect-default' => '모든 사용자에게 허용',
-'protect-fallback' => '‘$1’ 권한 필요',
+'protect-fallback' => '"$1" 권한 필요',
 'protect-level-autoconfirmed' => '등록된 사용자만 가능',
 'protect-level-sysop' => '관리자만 가능',
 'protect-summary-cascade' => '연쇄적',
@@ -2484,9 +2600,10 @@ $UNWATCHURL
 'undeleterevisions' => '판 $1개 보관중',
 'undeletehistory' => '문서를 되살리면 모든 역사가 같이 복구됩니다.
 문서가 삭제된 뒤 같은 이름의 문서가 만들어졌다면, 복구되는 역사는 지금 역사의 과거 부분에 나타날 것입니다.',
-'undeleterevdel' => '복구하려는 문서의 최신판이 삭제되어 있는 경우 문서를 복구시킬 수 없습니다. 이러한 경우, 삭제된 최신판 문서의 체크박스를 선택 해제하거나 숨김을 해제해야 합니다.',
+'undeleterevdel' => '복구하려는 문서의 최신판이 삭제되어 있는 경우 문서를 복구시킬 수 없습니다.
+이러한 경우, 삭제된 최신판 문서의 체크박스를 선택 해제하거나 숨김을 해제해야 합니다.',
 'undeletehistorynoadmin' => '이 문서는 삭제되었습니다.
-삭제된 이유와 삭제되기 전에 이 문서를 편집한 사용자들이 아래에 나와 있습니다.
+삭제된 이유와 삭제되기 전에 이 문서를 편집한 사용자 아래에 나와 있습니다.
 삭제된 문서의 내용을 보려면 관리자 권한이 필요합니다.',
 'undelete-revision' => '삭제된 $1 문서의 $4 $5 버전 (기여자 $3):',
 'undeleterevision-missing' => '해당 판이 잘못되었거나 존재하지 않습니다.
@@ -2503,9 +2620,9 @@ $UNWATCHURL
 'undeletedfiles' => '파일 $1개를 복구했습니다',
 'cannotundelete' => '복구에 실패했습니다.
 다른 사용자가 이미 복구했을 수도 있습니다.',
-'undeletedpage' => "'''$1 문서ê°\80 ë³µêµ¬ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.'''
+'undeletedpage' => "'''$1 문서를 ë³µêµ¬í\96\88ì\8aµë\8b\88ë\8b¤.'''
 
-[[Special:Log/delete|삭제 기록]]에서 최근의 삭제/복구 기록을 볼 수 있습니다.",
+[[Special:Log/delete|삭제 기록]]에서 최근의 삭제와 복구 기록을 볼 수 있습니다.",
 'undelete-header' => '최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.',
 'undelete-search-title' => '삭제된 문서 찾기',
 'undelete-search-box' => '삭제된 문서 찾기',
@@ -2519,7 +2636,7 @@ $UNWATCHURL
 이미 복구되었을 수 있습니다.',
 'undelete-error' => '문서 복구 중 오류',
 'undelete-error-short' => '파일 복구 오류: $1',
-'undelete-error-long' => '파일을 복구하는 중 오류 발생:
+'undelete-error-long' => '파일을 복구하는 중 오류가 발생했습니다:
 
 $1',
 'undelete-show-file-confirm' => '정말 "<nowiki>$1</nowiki>" 파일의 삭제된 $2 $3 버전을 보시겠습니까?',
@@ -2530,7 +2647,7 @@ $1',
 'invert' => '선택 반전',
 'tooltip-invert' => '선택한 이름공간에 있는 문서의 바뀜을 숨기려면 이 상자에 체크해주세요.',
 'namespace_association' => '관련된 이름공간',
-'tooltip-namespace_association' => '선택한 이름공간과 관련된 토론/본문 이름공간을 같이 선택합니다.',
+'tooltip-namespace_association' => '선택한 이름공간과 관련된 토론이나 본문 이름공간을 같이 선택합니다.',
 'blanknamespace' => '(일반)',
 
 # Contributions
@@ -2544,7 +2661,7 @@ $1',
 'year' => '연도:',
 
 'sp-contributions-newbies' => '새 사용자의 기여만 보기',
-'sp-contributions-newbies-sub' => '새 사용자의 기여',
+'sp-contributions-newbies-sub' => '새 사용자의 기여',
 'sp-contributions-newbies-title' => '새 사용자의 기여',
 'sp-contributions-blocklog' => '차단 기록',
 'sp-contributions-deleted' => '삭제된 기여 목록',
@@ -2552,14 +2669,14 @@ $1',
 'sp-contributions-logs' => '기록',
 'sp-contributions-talk' => '토론',
 'sp-contributions-userrights' => '사용자 권한 관리',
-'sp-contributions-blocked-notice' => '이 사용자는 현재 차단되어 있습니다. 해당 사용자의 차단 기록은 다음과 같습니다.',
+'sp-contributions-blocked-notice' => '이 사용자는 현재 차단되어 있습니다.
+해당 사용자의 차단 기록은 다음과 같습니다:',
 'sp-contributions-blocked-notice-anon' => '이 IP 주소는 현재 차단되어 있습니다.
\95\84ë\9e\98ì\9d\98 ìµ\9cê·¼ ì°¨ë\8b¨ ê¸°ë¡\9dì\9d\84 ì°¸ê³ í\95\98ì\8b­ì\8b\9cì\98¤.',
-'sp-contributions-search' => '기여 검색',
-'sp-contributions-username' => 'IP 주소 혹은 계정 이름:',
°¨ë\8b¨ ê¸°ë¡\9dì\9d\80 ë\8b¤ì\9d\8cê³¼ ê°\99ì\8aµë\8b\88ë\8b¤:',
+'sp-contributions-search' => '기여 찾기',
+'sp-contributions-username' => 'IP 주소 또는 사용자 이름:',
 'sp-contributions-toponly' => '최신판만 보기',
 'sp-contributions-submit' => '찾기',
-'sp-contributions-explain' => '',
 
 # What links here
 'whatlinkshere' => '여기를 가리키는 문서',
@@ -2571,8 +2688,8 @@ $1',
 'isredirect' => '넘겨주기 문서',
 'istemplate' => '포함',
 'isimage' => '파일 사용 중',
-'whatlinkshere-prev' => '{{PLURAL:$1|이전|이전 $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|다음|다음 $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|이전|이전 $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|다음|다음 $1}}',
 'whatlinkshere-links' => '← 가리키는 문서 목록',
 'whatlinkshere-hideredirs' => '넘겨주기를 $1',
 'whatlinkshere-hidetrans' => '틀을 $1',
@@ -2590,7 +2707,7 @@ $1',
 'blockiptext' => '차단할 IP 주소나 사용자 이름을 아래에 적어 주세요.
 차단은 문서 훼손을 막기 위해, [[{{MediaWiki:Policy-url}}|정책]]에 의해서만 이루어져야 합니다.
 차단 이유를 같이 적어주세요(예: 특정 문서 훼손).',
-'ipadressorusername' => 'IP 주소 또는 계정 이름:',
+'ipadressorusername' => 'IP 주소 또는 사용자 이름:',
 'ipbexpiry' => '기간:',
 'ipbreason' => '이유:',
 'ipbreasonotherlist' => '다른 이유',
@@ -2601,9 +2718,9 @@ $1',
 ** 장난 편집
 ** 협박성 행동
 ** 다중 계정 악용
-** 부적절한 계정 이름',
+** 부적절한 사용자 이름',
 'ipb-hardblock' => '이 IP를 이용하는 로그인한 사용자가 편집하는 것을 막기',
-'ipbcreateaccount' => '계정 생성을 막기',
+'ipbcreateaccount' => '계정 만들기를 막기',
 'ipbemailban' => '이메일을 보내지 못하도록 막기',
 'ipbenableautoblock' => '이 사용자가 최근에 사용했거나 앞으로 사용하는 IP를 자동으로 막기',
 'ipbsubmit' => '사용자 차단',
@@ -2612,19 +2729,19 @@ $1',
 'ipbotheroption' => '수동으로 지정',
 'ipbotherreason' => '다른 이유/추가적인 이유:',
 'ipbhidename' => '사용자 이름을 편집 역사에서 숨기기',
-'ipbwatchuser' => '이 사용자 문서와 사용자토론 문서를 주시하기',
-'ipb-disableusertalk' => '차단된 동안 자신의 사용자토론 문서를 편집하지 못하도록 막기',
+'ipbwatchuser' => '이 사용자 문서와 사용자 토론 문서를 주시하기',
+'ipb-disableusertalk' => '차단된 동안 자신의 사용자 토론 문서를 편집하지 못하도록 막기',
 'ipb-change-block' => '이 설정으로 이 사용자를 다시 차단합니다',
 'ipb-confirm' => '차단 확인',
 'badipaddress' => '잘못된 IP 주소',
 'blockipsuccesssub' => '차단 완료',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다.<br />
 차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
-'ipb-blockingself' => '자기 자신을 차단하려고 합니다. 정말로 실행할까요?',
-'ipb-confirmhideuser' => '당신은 사용자를 차단하면서 "계정 숨기기" 설정을 선택했습니다. 이로써 모든 기록에서 이 사용자의 계정 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?',
+'ipb-blockingself' => '자기 자신을 차단하려고 합니다! 정말로 실행할까요?',
+'ipb-confirmhideuser' => '당신은 사용자를 차단하면서 "사용자 숨기기" 설정을 선택했습니다. 이로써 모든 기록에서 이 사용자의 사용자 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?',
 'ipb-edit-dropdown' => '차단 이유 목록 편집하기',
 'ipb-unblock-addr' => '$1 차단 해제하기',
-'ipb-unblock' => '사용자/IP 주소 차단 해제하기',
+'ipb-unblock' => '사용자 또는 IP 주소 차단 해제하기',
 'ipb-blocklist' => '현재 차단 기록 보기',
 'ipb-blocklist-contribs' => '$1의 기여',
 'unblockip' => '사용자 차단 해제',
@@ -2638,9 +2755,9 @@ $1',
 'ipblocklist-legend' => '차단 중인 사용자 찾기',
 'blocklist-userblocks' => '계정에 대한 차단 숨기기',
 'blocklist-tempblocks' => '기한이 정해진 차단을 숨기기',
-'blocklist-addressblocks' => 'ë\8b¹일 IP 차단을 숨기기',
+'blocklist-addressblocks' => 'ë\8b¨일 IP 차단을 숨기기',
 'blocklist-rangeblocks' => '광역 차단을 숨기기',
-'blocklist-timestamp' => '날짜/시각',
+'blocklist-timestamp' => '날짜·시각',
 'blocklist-target' => '차단 대상',
 'blocklist-expiry' => '차단 기한',
 'blocklist-by' => '차단한 관리자',
@@ -2648,49 +2765,50 @@ $1',
 'blocklist-reason' => '이유',
 'ipblocklist-submit' => '찾기',
 'ipblocklist-localblock' => '로컬 차단',
-'ipblocklist-otherblocks' => '다른 {{PLURAL:$1|}}차단 기록',
+'ipblocklist-otherblocks' => '다른 {{PLURAL:$1|차단}} 기록',
 'infiniteblock' => '무기한',
 'expiringblock' => '$1 $2에 해제',
 'anononlyblock' => '익명 사용자만',
 'noautoblockblock' => '자동 차단 비활성화됨',
-'createaccountblock' => '계정 생성 금지됨',
+'createaccountblock' => '계정 만들기 금지됨',
 'emailblock' => '이메일 차단됨',
 'blocklist-nousertalk' => '자신의 토론 문서 편집 불가',
 'ipblocklist-empty' => '차단된 사용자가 없습니다.',
 'ipblocklist-no-results' => '당신이 입력한 IP 주소나 사용자는 차단되지 않았습니다.',
 'blocklink' => '차단',
 'unblocklink' => '차단 해제',
-'change-blocklink' => 'ì°¨ë\8b¨ ì\84¤ì \95 ë³\80ê²½',
+'change-blocklink' => 'ì°¨ë\8b¨ ì\84¤ì \95 ë°\94꾸기',
 'contribslink' => '기여',
 'emaillink' => '이메일 보내기',
 'autoblocker' => '당신의 IP 주소는 최근에 "[[User:$1|$1]]" 사용자가 사용하였기 때문에 자동으로 차단되었습니다.
 $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'blocklogpage' => '차단 기록',
-'blocklog-showlog' => '이 사용자는 과거에 차단된 기록이 있습니다. 해당 사용자의 차단 기록은 다음과 같습니다.',
-'blocklog-showsuppresslog' => '이 사용자는 과거에 차단된 적이 있으며, 그 기록이 숨겨져 있습니다. 해당 사용자의 차단 기록은 다음과 같습니다.',
-'blocklogentry' => '[[$1]] 사용자를 $2 차단함 $3',
-'reblock-logentry' => '[[$1]] 사용자의 차단 기간을 $2(으)로 변경 $3',
+'blocklog-showlog' => '이 사용자는 과거에 차단된 기록이 있습니다.
+해당 사용자의 차단 기록은 다음과 같습니다:',
+'blocklog-showsuppresslog' => '이 사용자는 과거에 차단된 적이 있으며, 그 기록이 숨겨져 있습니다.
+해당 사용자의 차단 기록은 다음과 같습니다:',
+'blocklogentry' => '사용자가 [[$1]] 사용자를 $2 차단함 $3',
+'reblock-logentry' => '사용자가 [[$1]] 사용자의 차단 기간을 $2(으)로 바꿈 $3',
 'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다.
 자동으로 차단된 IP 주소는 여기에 나오지 않습니다.
 [[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
-'unblocklogentry' => '$1을 차단 해제했습니다.',
+'unblocklogentry' => '사용자가 $1 사용자를 차단 해제했습니다.',
 'block-log-flags-anononly' => 'IP만 막음',
-'block-log-flags-nocreate' => '계정 생성 막음',
+'block-log-flags-nocreate' => '계정 만들기 금지됨',
 'block-log-flags-noautoblock' => '자동 차단 비활성화됨',
 'block-log-flags-noemail' => '이메일 막음',
 'block-log-flags-nousertalk' => '자신의 토론 문서 편집 불가',
 'block-log-flags-angry-autoblock' => '향상된 자동 차단 활성화됨',
-'block-log-flags-hiddenname' => '계정 이름 숨겨짐',
+'block-log-flags-hiddenname' => '사용자 이름 숨겨짐',
 'range_block_disabled' => 'IP 범위 차단 기능이 비활성화되어 있습니다.',
 'ipb_expiry_invalid' => '차단 기간이 잘못되었습니다.',
 'ipb_expiry_temp' => '사용자 이름을 숨기는 차단은 반드시 무기한이어야 합니다.',
 'ipb_hide_invalid' => '해당 계정은 막을 수 없습니다. 기여량이 너무 많습니다.',
 'ipb_already_blocked' => '"$1" 사용자는 이미 차단됨',
 'ipb-needreblock' => '$1 사용자는 이미 차단되었습니다. 차단 설정을 바꾸시겠습니까?',
-'ipb-otherblocks-header' => '다른 {{PLURAL:$1|}}차단 기록',
-'unblock-hideuser' => '이 계정 이름이 숨겨져 있기 때문에 이 사용자를 차단 해제할 수 없습니다.',
-'ipb_cant_unblock' => '오류: 차단 ID $1이(가) 존재하지 않습니다.
-이미 차단 해제되었을 수 있습니다.',
+'ipb-otherblocks-header' => '다른 {{PLURAL:$1|차단}} 기록',
+'unblock-hideuser' => '이 사용자 이름이 숨겨져 있기 때문에 이 사용자를 차단 해제할 수 없습니다.',
+'ipb_cant_unblock' => '오류: 차단 ID $1이(가) 존재하지 않습니다. 이미 차단 해제되었을 수 있습니다.',
 'ipb_blocked_as_range' => '오류: IP 주소 $1은 직접 차단되지 않았기 때문에 차단 해제할 수 없습니다.
 하지만 $2로 광역 차단되었기 때문에, 광역 차단 해제로 차단을 해제할 수 있습니다.',
 'ip_range_invalid' => 'IP 범위가 잘못되었습니다.',
@@ -2698,54 +2816,58 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'blockme' => '자가 차단',
 'proxyblocker' => '프록시 차단',
 'proxyblocker-disabled' => '이 기능은 비활성되어 있습니다.',
-'proxyblockreason' => '당신의 IP 주소는 공개 프록시로 밝혀져 자동으로 차단됩니다. 만약 인터넷 사용에 문제가 있다면 인터넷 서비스 공급자에게 문의해주세요.',
+'proxyblockreason' => '당신의 IP 주소는 공개 프록시로 밝혀져 자동으로 차단됩니다.
+만약 인터넷 사용에 문제가 있다면 인터넷 서비스 공급자나 기술 지원팀에게 문의해주세요.',
 'proxyblocksuccess' => '완료.',
 'sorbsreason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.',
-'sorbs_create_account_reason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다. 계정을 만들 수 없습니다.',
+'sorbs_create_account_reason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.
+계정을 만들 수 없습니다.',
 'cant-block-while-blocked' => '당신이 차단되어 있는 동안에는 다른 사용자를 차단할 수 없습니다.',
-'cant-see-hidden-user' => '당신이 차단하려 하는 사용자는 이미 차단되었고 계정 숨김 처리되었습니다. 당신이 계정 숨기기 권한을 갖고 있지 않기 때문에, 이 사용자의 차단 기록을 보거나 차단 설정을 변경할 수 없습니다.',
+'cant-see-hidden-user' => '당신이 차단하려 하는 사용자는 이미 차단되었고 숨김 처리되었습니다.
+당신이 사용자 숨기기 권한을 갖고 있지 않기 때문에, 이 사용자의 차단 기록을 보거나 차단 설정을 바꿀 수 없습니다.',
 'ipbblocked' => '당신은 차단되어 있기 때문에 다른 사용자를 차단하거나 차단을 해제할 수 없습니다.',
 'ipbnounblockself' => '당신은 자기 스스로를 차단 해제할 수 없습니다.',
 
 # Developer tools
 'lockdb' => '데이터베이스 잠그기',
 'unlockdb' => '데이터베이스 잠금 해제',
-'lockdbtext' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë¥¼ ì\9e ê·¸ë©´ ëª¨ë\93  ì\82¬ì\9a©ì\9e\90ì\9d\98 í\8e¸ì§\91, í\99\98ê²½ ì\84¤ì \95 ë³\80ê²½, 주시문서 편집 등 데이터베이스를 요구하는 모든 기능이 정지됩니다.
+'lockdbtext' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë¥¼ ì\9e ê·¸ë©´ ëª¨ë\93  ì\82¬ì\9a©ì\9e\90ì\9d\98 í\8e¸ì§\91, í\99\98ê²½ ì\84¤ì \95 ë°\94꾸기, 주시문서 편집 등 데이터베이스를 요구하는 모든 기능이 정지됩니다.
 정말로 잠가야 하는지를 다시 한번 확인해주세요. 관리 작업이 끝난 뒤에는 데이터베이스 잠금을 풀어야 합니다.',
-'unlockdbtext' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë¥¼ ì\9e ê¸\88 í\95´ì \9cí\95\98ë©´ ëª¨ë\93  ì\82¬ì\9a©ì\9e\90ì\9d\98 í\8e¸ì§\91, í\99\98ê²½ ì\84¤ì \95 ë³\80ê²½, 주시문서 편집 등 데이터베이스를 요구하는 모든 기능이 복구됩니다.
+'unlockdbtext' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ë¥¼ ì\9e ê¸\88 í\95´ì \9cí\95\98ë©´ ëª¨ë\93  ì\82¬ì\9a©ì\9e\90ì\9d\98 í\8e¸ì§\91, í\99\98ê²½ ì\84¤ì \95 ë°\94꾸기, 주시문서 편집 등 데이터베이스를 요구하는 모든 기능이 복구됩니다.
 정말로 잠금을 해제하려는지를 다시 한번 확인해주세요.',
 'lockconfirm' => '네, 데이터베이스를 잠급니다.',
 'unlockconfirm' => '네, 데이터베이스를 잠금 해제합니다.',
 'lockbtn' => '데이터베이스 잠그기',
 'unlockbtn' => '데이터베이스 잠금 해제',
-'locknoconfirm' => 'í\99\95ì\9d¸ ì²´í\81¬ë°\95ì\8a¤를 선택하지 않았습니다.',
+'locknoconfirm' => 'í\99\95ì\9d¸ ì\83\81ì\9e\90를 선택하지 않았습니다.',
 'lockdbsuccesssub' => '데이터베이스 잠김',
 'unlockdbsuccesssub' => '데이터베이스 잠금 해제됨',
 'lockdbsuccesstext' => '데이터베이스가 잠겼습니다.<br />
 관리가 끝나면 잊지 말고 [[Special:UnlockDB|잠금을 풀어]] 주세요.',
 'unlockdbsuccesstext' => '데이터베이스 잠금 상태가 해제되었습니다.',
-'lockfilenotwritable' => '데이터베이스 잠금 파일에 쓰기 권한이 없습니다. 데이터베이스를 잠그거나 잠금 해제하려면, 웹 서버에서 이 파일의 쓰기 권한을 설정해야 합니다.',
+'lockfilenotwritable' => '데이터베이스 잠금 파일에 쓰기 권한이 없습니다.
+데이터베이스를 잠그거나 잠금 해제하려면, 웹 서버에서 이 파일의 쓰기 권한을 설정해야 합니다.',
 'databasenotlocked' => '데이터베이스가 잠겨 있지 않습니다.',
 'lockedbyandtime' => '($1이 $2 $3에 잠금)',
 
 # Move page
-'move-page' => '이동 $1',
+'move-page' => '$1 이동',
 'move-page-legend' => '문서 이동하기',
-'movepagetext' => "아래 양식을 채워 문서의 이름을 바꾸고 모든 역사를 새 이름으로 옮길 수 있습니다.
-기존의 문서는 새 문서로 넘겨주는 문서가 됩니다.
-원래 이름을 가리키는 넘겨주기를 자동으로 ê°±ì\8b í\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.
-만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]] 확인해주세요.
\8b¹ì\8b ì\9d\80 ë§\81í\81¬ê°\80 ì\9d\98ë\8f\84í\95\9c ë¬¸ì\84\9c를 ê°\80리í\82¤ê²\8c í\95  ì±\85ì\9e\84ì\9d´ ì\9e\88ì\8aµ니다.
+'movepagetext' => "아래의 양식을 사용해 문서의 이름을 바꾸고 문서의 모든 역사를 새 이름으로 옮길 수 있습니다.
+이전의 제목은 새 제목으로 넘겨줄 것입니다.
+원래 이름을 가리키는 넘겨주기를 자동으로 ì\83\88ë¡\9c ê³ ì¹  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.
+만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]가 있는지 확인해주세요.
\8b¹ì\8b ì\9d\80 ë\84\98겨주기 ë§\81í\81¬ê°\80 ì \9cë\8c\80ë¡\9c í\96¥í\95\98ê³  ì\9e\88ë\8a\94ì§\80 í\99\95ì\9d¸í\95\98ì\97¬ì\95¼ í\95©니다.
 
 만약 문서의 새 이름으로 된 문서가 존재할 때, 그 문서가 비었거나 넘겨주기 문서이고 문서 역사가 없을 때에만 이동합니다. 그렇지 않을 경우에는 이동하지 '''않습니다'''.
 이것은 실수로 이동한 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.
 
-'''주의!'''
\9e\90주 ì\82¬ì\9a©í\95\98ë\8a\94 ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95\98ë©´ ì\9c\84í\97\98í\95\9c ê²°ê³¼ë¥¼ ê°\80ì ¸ì\98¬ 수 있습니다.
-이동하기 전에, 이 문서를 이동해도 문제가 없다는 것을 확인해주세요.",
-'movepagetext-noredirectfixer' => "ì\9d´ ì\96\91ì\8b\9dì\9d\84 ì\9d´ì\9a©í\95´ ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94꾸고 ë¬¸ì\84\9cì\9d\98 ëª¨ë\93  ì\97­ì\82¬ë¥¼ ì\98®ê¸¸ ê²\83ì\9e\85니다.
+'''경고!'''
\9d¸ê¸° ì\9e\88ë\8a\94 ë¬¸ì\84\9cì\9d¼ ê²½ì\9a° ì\8b¬ê°\81í\95\98ê³  ì\98\88ì\83\81í\95\98ì§\80 ëª»í\95\9c ë¬¸ì \9c를 ì´\88ë\9e\98í\95  수 있습니다.
+문서를 이동하기 전에 이러한 행동이 초래할 수 있는 결과에 대해 숙지하시기 바랍니다.",
+'movepagetext-noredirectfixer' => "ì\95\84ë\9e\98ì\9d\98 ì\96\91ì\8b\9dì\9d\84 ì\82¬ì\9a©í\95´ ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94꾸고 ë¬¸ì\84\9cì\9d\98 ëª¨ë\93  ì\97­ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ì\98®ê¸¸ ì\88\98 ì\9e\88ì\8aµ니다.
 이전의 제목은 새 제목으로 넘겨줄 것입니다.
-[[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ë\82\98 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]ê°\80 ì\9e\88ë\8a\94ì§\80 í\99\95ì\9d¸í\95´ì£¼ì\8b­ì\8b\9cì\98¤.
+[[Special:DoubleRedirects|ì\9d´ì¤\91 ë\84\98겨주기]]ë\82\98 [[Special:BrokenRedirects|ë\81\8a긴 ë\84\98겨주기]]ê°\80 ì\9e\88ë\8a\94ì§\80 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.
 당신은 넘겨주기 링크가 제대로 향하고 있는지 확인하여야 합니다.
 
 참고로 새 제목을 가진 문서가 이미 있다면 다음 경우에 해당하지 않으면 이 문서는 옮겨지지 '''않을''' 것입니다.
@@ -2755,7 +2877,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 이는 당신이 실수로 문서를 옮겼을 때 되돌릴 수 있으며 이미 있는 문서를 덮어쓸 수 없음을 의미합니다.
 
 '''경고!'''
-방문 수나 이 문서를 향하는 링크가 많은 문서일 경우 심각한 문제를 초래할 수 있습니다.
+인기 있는 문서일 경우 심각하고 예상하지 못한 문제를 초래할 수 있습니다.
 문서를 이동하기 전에 이러한 행동이 초래할 수 있는 결과에 대해 숙지하시기 바랍니다.",
 'movepagetalktext' => "딸린 토론 문서도 자동으로 이동합니다. 하지만 다음의 경우는 '''이동하지 않습니다''':
 * 이동할 이름으로 된 문서가 이미 있는 경우
@@ -2763,7 +2885,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
 'movearticle' => '문서 이동하기',
-'moveuserpage-warning' => "'''경고:''' 당신은 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 계정 이름이 바뀌지 않는다는 점을 명심해주시기 바랍니다.",
+'moveuserpage-warning' => "'''경고:''' 당신은 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 '''않는다'''는 점을 명심해주시기 바랍니다.",
 'movenologin' => '로그인하지 않음',
 'movenologintext' => '문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.',
 'movenotallowed' => '문서를 이동할 권한이 없습니다.',
@@ -2774,7 +2896,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'move-watch' => '문서 주시하기',
 'movepagebtn' => '이동',
 'pagemovedsub' => '문서 이동함',
-'movepage-moved' => "'''‘$1’ 문서를 ‘$2’ 문서로 이동했습니다.'''",
+'movepage-moved' => '\'\'\'"$1" 문서를 "$2" 문서로 이동했습니다.\'\'\'',
 'movepage-moved-redirect' => '넘겨주기 문서를 만들었습니다.',
 'movepage-moved-noredirect' => '넘겨주기 문서를 남기지 않았습니다.',
 'articleexists' => '문서가 이미 존재하거나 이름이 올바르지 않습니다.
@@ -2785,25 +2907,25 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'movetalk' => '딸린 토론도 함께 이동합니다.',
 'move-subpages' => '하위 문서도 함께 ($1개 이하) 이동합니다.',
 'move-talk-subpages' => '토론 문서의 하위 문서도 ($1개까지) 함께 이동합니다.',
-'movepage-page-exists' => '이동할 수 없습니다. ‘$1’ 문서가 이미 존재합니다.',
-'movepage-page-moved' => '‘$1’ 문서를 ‘$2’ 문서로 이동했습니다.',
-'movepage-page-unmoved' => '‘$1’ 문서를 ‘$2’ 문서로 이동할 수 없습니다.',
+'movepage-page-exists' => '이동할 수 없습니다. "$1" 문서가 이미 존재합니다.',
+'movepage-page-moved' => '"$1" 문서를 "$2" 문서로 이동했습니다.',
+'movepage-page-unmoved' => '"$1" 문서를 "$2" 문서로 이동할 수 없습니다.',
 'movepage-max-pages' => '문서를 최대 $1개 이동했습니다. 나머지 문서는 자동 이동하지 않습니다.',
 'movelogpage' => '이동 기록',
-'movelogpagetext' => 'ì\95\84ë\9e\98ë\8a\94 ì\98®ê²¨ì§\84 문서의 목록입니다.',
-'movesubpage' => '{{PLURAL:$1}}하위 문서',
-'movesubpagetext' => '이 문서에는 다음 $1ê°\9cì\9d\98 í\95\98ì\9c\84 ë¬¸ì\84\9cê°\80 ì\9e\88ì\8aµë\8b\88ë\8b¤.',
+'movelogpagetext' => 'ì\95\84ë\9e\98ë\8a\94 ì\9d´ë\8f\99í\95\9c 문서의 목록입니다.',
+'movesubpage' => '{{PLURAL:$1|하위 문서}}',
+'movesubpagetext' => '이 문서에는 다음 í\95\98ì\9c\84 ë¬¸ì\84\9c $1ê°\9cê°\80 ì\9e\88ì\8aµë\8b\88ë\8b¤.',
 'movenosubpage' => '이 문서에는 하위 문서가 존재하지 않습니다.',
 'movereason' => '이유:',
 'revertmove' => '되돌리기',
 'delete_and_move' => '삭제하고 이동',
 'delete_and_move_text' => '== 삭제 필요 ==
-
-이동하려는 제목으로 된 ‘[[:$1]]’ 문서가 이미 존재합니다.
+이동하려는 제목으로 된 "[[:$1]]" 문서가 이미 존재합니다.
 삭제하고 이동할까요?',
 'delete_and_move_confirm' => '네. 문서를 삭제합니다',
 'delete_and_move_reason' => '"[[$1]]"에서 문서를 이동하기 위해 삭제함',
-'selfmove' => '이동하려는 제목이 원래 제목과 같습니다. 이동할 수 없습니다.',
+'selfmove' => '이동하려는 제목이 원래 제목과 같습니다.
+이동할 수 없습니다.',
 'immobile-source-namespace' => '"$1" 이름공간에 속한 문서는 이동시킬 수 없습니다.',
 'immobile-target-namespace' => '"$1" 이름공간에 속한 문서는 이동시킬 수 없습니다.',
 'immobile-target-namespace-iw' => '인터위키 링크를 넘어 문서를 이동할 수 없습니다.',
@@ -2813,13 +2935,13 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'nonfile-cannot-move-to-file' => '파일이 아닌 문서를 파일 이름공간으로 옮길 수 없습니다.',
 'imagetypemismatch' => '새 파일의 확장자가 원래의 확장자와 일치하지 않습니다.',
 'imageinvalidfilename' => '새 파일 이름이 잘못되었습니다.',
-'fix-double-redirects' => '기존 이름을 가리키는 넘겨주기를 갱신',
+'fix-double-redirects' => '기존 이름을 가리키는 넘겨주기를 새로 고침',
 'move-leave-redirect' => '이동 후 넘겨주기를 남기기',
 'protectedpagemovewarning' => "'''경고:''' 이 문서는 관리자만이 이동할 수 있도록 잠겨 있습니다.
-최근의 기록을 참용으로 제공합니다:",
-'semiprotectedpagemovewarning' => "'''ì\95\8c림:''' 이 문서는 등록된 사용자만이 이동할 수 있도록 잠겨 있습니다.
-ìµ\9cê·¼ ê¸°ë¡\9d ë\82´ì\9a©ì\9d´ ì°¸ì¡°ì\9a©ì\9c¼ë¡\9c ì \9cê³µë\90©ë\8b\88ë\8b¤:",
-'move-over-sharedrepo' => '== í\8c\8cì\9d¼ì\9d´ ì¡´ì\9e¬í\95©ë\8b\88ë\8b¤ ==
+최근의 기록을 참용으로 제공합니다:",
+'semiprotectedpagemovewarning' => "'''참고:''' 이 문서는 등록된 사용자만이 이동할 수 있도록 잠겨 있습니다.
+ìµ\9cê·¼ ê¸°ë¡\9d ë\82´ì\9a©ì\9d\84 ì°¸ê³ ì\9a©ë¡\9c ì \9cê³µí\95©ë\8b\88ë\8b¤:",
+'move-over-sharedrepo' => '== í\8c\8cì\9d¼ì\9d´ ì¡´ì\9e¬í\95¨ ==
 [[:$1]] 파일이 공용 저장소에 있습니다. 이 이름으로 파일을 옮기면 공용의 파일을 덮어쓰게 될 것입니다.',
 'file-exists-sharedrepo' => '당신이 선택한 파일 이름은 공용 저장소에서 사용 중입니다.
 다른 이름을 선택해주세요.',
@@ -2830,11 +2952,11 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 문서를 내보내려면, 내보내려는 문서 제목을 한 줄에 하나씩 입력해주세요. 그리고 문서의 전체 역사가 필요한지, 혹은 현재 버전만이 필요한지를 선택해 주세요.
 
-특정 문서를 내보내려면, 예를 들어 ‘[[{{MediaWiki:Mainpage}}]]’ 문서를 내보내려면 [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] 링크를 사용할 수도 있습니다.',
+특정 문서를 내보내려면, 예를 들어 "[[{{MediaWiki:Mainpage}}]]" 문서를 내보내려면 [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] 링크를 사용할 수도 있습니다.',
 'exportall' => '모든 문서를 내보내기',
 'exportcuronly' => '현재 버전만 포함하고, 전체 역사는 포함하지 않음',
 'exportnohistory' => "----
-'''주ì\9d\98:''' 전체 문서 역사를 내보내는 기능은 성능 문제로 인해 비활성되어 있습니다.",
+'''참고:''' 전체 문서 역사를 내보내는 기능은 성능 문제로 인해 비활성되어 있습니다.",
 'exportlistauthors' => '각각 문서마다 모든 기여자의 목록을 포함',
 'export-submit' => '내보내기',
 'export-addcattext' => '분류에 있는 문서 추가:',
@@ -2850,8 +2972,9 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'allmessagesname' => '이름',
 'allmessagesdefault' => '기본 내용',
 'allmessagescurrent' => '현재 문자열',
-'allmessagestext' => '미디어위키 이름공간에 있는 모든 시스템 메시지의 목록입니다. 미디어위키의 번역 작업에 관심이 있으면 [//www.mediawiki.org/wiki/Localisation 미디어위키 지역화]나 [//translatewiki.net translatewiki.net]에 참가해주세요.',
-'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages'''가 해제되어 있어서 이 문서는 쓸 수 없습니다.",
+'allmessagestext' => '미디어위키 이름공간에 있는 모든 시스템 메시지의 목록입니다.
+미디어위키의 번역 작업에 관심이 있으면 [//www.mediawiki.org/wiki/Localisation 미디어위키 지역화]나 [//translatewiki.net translatewiki.net]에 참가해주세요.',
+'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages'''가 비활성화되어 있어서 이 문서를 사용할 수 없습니다.",
 'allmessages-filter-legend' => '필터',
 'allmessages-filter' => '수정 상태로 거르기:',
 'allmessages-filter-unmodified' => '수정되지 않음',
@@ -2867,18 +2990,18 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'thumbnail_error' => '섬네일을 만드는 중 오류 발생: $1',
 'djvu_page_error' => 'DjVu 페이지 범위 벗어남',
 'djvu_no_xml' => 'DjVu 파일의 XML 정보를 읽을 수 없음',
-'thumbnail-temp-create' => '임시 섬네일 파일을 생성할 수 없습니다.',
+'thumbnail-temp-create' => '임시 섬네일 파일을 만들 수 없습니다.',
 'thumbnail-dest-create' => '대상 경로에 섬네일을 저장할 수 없습니다.',
 'thumbnail_invalid_params' => '섬네일 매개변수가 잘못되었습니다.',
-'thumbnail_dest_directory' => '새 목적 디렉토리를 생성할 수 없습니다.',
+'thumbnail_dest_directory' => '새 목적 디렉토리를 만들 수 없습니다.',
 'thumbnail_image-type' => '해당 파일 형식은 지원하지 않습니다',
-'thumbnail_gd-library' => 'GD 라이브러리 설정이 잘못되었습니다. $1 함수를 찾을 수 없습니다.',
+'thumbnail_gd-library' => 'GD 라이브러리 설정이 잘못되었습니다: $1 함수를 찾을 수 없습니다.',
 'thumbnail_image-missing' => '파일을 찾을 수 없습니다: $1',
 
 # Special:Import
 'import' => '문서 가져오기',
 'importinterwiki' => '다른 위키에서 문서 가져오기',
-'import-interwiki-text' => '문서를 가져올 위키를 선택하고, 문서 제목을 입력해주세요.
+'import-interwiki-text' => '문서를 가져올 위키를 선택하고 문서 제목을 입력해주세요.
 편집 날짜와 편집자의 이름이 보존될 것입니다.
 모든 가져오기는 [[Special:Log/import|가져오기 기록]]에 기록될 것입니다.',
 'import-interwiki-source' => '원본 위키/문서:',
@@ -2886,14 +3009,15 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'import-interwiki-templates' => '모든 틀을 포함하기',
 'import-interwiki-submit' => '가져오기',
 'import-interwiki-namespace' => '새 이름공간:',
+'import-interwiki-rootpage' => '대상 루트 문서 (선택 사항):',
 'import-upload-filename' => '파일 이름:',
 'import-comment' => '이유:',
-'importtext' => 'ì\9b\90본 ì\9c\84í\82¤ì\97\90ì\84\9c [[Special:Export|ë\82´ë³´ë\82´ê¸°]] ê¸°ë\8a¥ì\9d\84 ì\82¬ì\9a©í\95´ í\8c\8cì\9d¼ì\9d\84 ë\82´ë ¤ë°\9bì\9c¼ì\8b­ì\8b\9cì\98¤.
+'importtext' => 'ì\9b\90본 ì\9c\84í\82¤ì\97\90ì\84\9c [[Special:Export|ë\82´ë³´ë\82´ê¸°]] ê¸°ë\8a¥ì\9d\84 ì\82¬ì\9a©í\95´ í\8c\8cì\9d¼ì\9d\84 ë\82´ë ¤ë°\9bì\9c¼ì\84¸ì\9a\94.
 그리고 당신의 컴퓨터에 저장해 둔 후 여기에 올려주세요.',
 'importstart' => '문서를 가져오는 중...',
 'import-revision-count' => '판 $1개',
 'importnopages' => '가져올 문서가 없습니다.',
-'imported-log-entries' => '로그 항목 $1개를 가져왔습니다.',
+'imported-log-entries' => '기록 항목 $1개를 가져왔습니다.',
 'importfailed' => '가져오기 실패: <nowiki>$1</nowiki>',
 'importunknownsource' => '알 수 없는 가져오기 자료 유형',
 'importcantopen' => '파일을 열 수 없습니다.',
@@ -2901,12 +3025,12 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'importnotext' => '내용이 없습니다.',
 'importsuccess' => '가져오기 완료!',
 'importhistoryconflict' => '문서 역사가 충돌하는 판이 있습니다. (이전에 이 문서를 가져온 적이 있을 수도 있습니다)',
-'importnosources' => '문서를 가져올 출처가 정의되지 않았고, 문서 역사 올리기가 비활성화되었습니다.',
-'importnofile' => 'ê°\80ì ¸ì\98¤ê¸°ì\9a© í\8c\8cì\9d¼ì\9d´ ì\97\85ë¡\9cë\93\9cë\90\98지 않았습니다.',
+'importnosources' => '문서를 가져올 출처가 정의되지 않았고 문서 역사 올리기가 비활성화되었습니다.',
+'importnofile' => 'ê°\80ì ¸ì\98¤ê¸°ì\9a© í\8c\8cì\9d¼ì\9d´ ì\98¬ë ¤ì§\80지 않았습니다.',
 'importuploaderrorsize' => '파일 올리기를 통한 가져오기에 실패했습니다.
 파일이 허용된 크기 제한보다 큽니다.',
 'importuploaderrorpartial' => '가져오기 파일을 올리는 데 실패하였습니다.
\8c\8cì\9d¼ì\9d´ ë¶\80ë¶\84ì \81ì\9c¼ë¡\9cë§\8c ì\97\85ë¡\9cë\93\9cë\90\98ì\97\88습니다.',
\8c\8cì\9d¼ì\9d´ ë¶\80ë¶\84ì \81ì\9c¼ë¡\9cë§\8c ì\98¬ë ¤ì¡\8c습니다.',
 'importuploaderrortemp' => '가져오기 파일을 올리는 데 실패했습니다.
 임시 폴더가 존재하지 않습니다.',
 'import-parse-failure' => 'XML 문서 분석 실패',
@@ -2914,18 +3038,22 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'import-nonewrevisions' => '이전에 이미 모든 판을 가져왔습니다.',
 'xml-error-string' => '$3단 $2줄 (바이트 $4)에서 $1: $5',
 'import-upload' => 'XML 데이터 올리기',
-'import-token-mismatch' => '세션 데이터가 손실되었습니다. 다시 시도해주세요.',
+'import-token-mismatch' => '세션 데이터가 손실되었습니다.
+다시 시도하세요.',
 'import-invalid-interwiki' => '해당 위키에서 문서를 가져올 수 없습니다.',
-'import-error-edit' => '현재 문서를 편집할 권한이 없기 때문에 ‘$1’ 문서를 불러올 수 없습니다.',
-'import-error-create' => '현재 문서를 생성할 권한이 없기 때문에 ‘$1’ 문서를 불러올 수 없습니다.',
-'import-error-interwiki' => '문서 "$1"은 제목이 바깥 고리(인터위키)용으로 할당되어 있기 때문에 가져오지 않습니다.',
-'import-error-special' => '문서 "$1"은 특수 문서에 속해 있기 때문에 가져오지 않습니다.',
-'import-error-invalid' => '문서 "$1"은 제목이 잘못되었기 때문에 가져오지 않습니다.',
+'import-error-edit' => '현재 문서를 편집할 권한이 없기 때문에 "$1" 문서를 불러올 수 없습니다.',
+'import-error-create' => '현재 문서를 만들 권한이 없기 때문에 "$1" 문서를 불러올 수 없습니다.',
+'import-error-interwiki' => '"$1" 문서는 제목이 바깥 링크(인터위키)용으로 할당되어 있기 때문에 가져오지 않습니다.',
+'import-error-special' => '"$1" 문서는 특수 문서에 속해 있기 때문에 가져오지 않습니다.',
+'import-error-invalid' => '"$1" 문서는 제목이 잘못되었기 때문에 가져오지 않습니다.',
+'import-options-wrong' => '잘못된 {{PLURAL:$2|선택 사항}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => '주어진 루트 문서는 잘못된 제목입니다.',
+'import-rootpage-nosubpage' => '루트 문서의 "$1" 이름공간은 하위 문서를 허용하지 않습니다.',
 
 # Import log
 'importlogpage' => '가져오기 기록',
 'importlogpagetext' => '다른 위키에서 가져온 문서 기록입니다.',
-'import-logentry-upload' => ' 사용자가 파일 올리기를 통해 [[$1]] 문서를 가져왔습니다.',
+'import-logentry-upload' => '사용자가 파일 올리기를 통해 [[$1]] 문서를 가져왔습니다.',
 'import-logentry-upload-detail' => '판 $1개',
 'import-logentry-interwiki' => '$1 문서를 다른 위키에서 가져왔습니다.',
 'import-logentry-interwiki-detail' => '$2에서 판 $1개를 가져옴',
@@ -2936,9 +3064,9 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'javascripttest-title' => '$1 테스트 실행',
 'javascripttest-pagetext-noframework' => '이 페이지는 자바스크립트 테스트를 실행하기 위한 용도로 할당되어 있습니다.',
 'javascripttest-pagetext-unknownframework' => '실험용 프레임워크 "$1"를 알 수 없습니다.',
-'javascripttest-pagetext-frameworks' => 'ë\8b¤ì\9d\8c ì\8b¤í\97\98ì\9a© í\94\84ë \88ì\9e\84ì\9b\8cí\81¬ ì¤\91 í\95\98ë\82\98를 ì\84 í\83\9dí\95\98ì\8b­ì\8b\9cì\98¤: $1',
-'javascripttest-pagetext-skins' => '실험할 스킨을 고르십시오:',
-'javascripttest-qunit-intro' => 'mediawiki.orgì\9d\98 [$1 í\85\8cì\8a¤í\8a¸ ì\84¤ëª\85ì\84\9c]를 ì°¸ê³ í\95\98ì\8b­ì\8b\9cì\98¤.',
+'javascripttest-pagetext-frameworks' => 'ë\8b¤ì\9d\8c ì\8b¤í\97\98ì\9a© í\94\84ë \88ì\9e\84ì\9b\8cí\81¬ ì¤\91 í\95\98ë\82\98를 ì\84 í\83\9dí\95\98ì\84¸ì\9a\94: $1',
+'javascripttest-pagetext-skins' => '실험할 스킨을 선택하세요:',
+'javascripttest-qunit-intro' => 'mediawiki.orgì\9d\98 [$1 í\85\8cì\8a¤í\8a¸ ì\84¤ëª\85ì\84\9c]를 ì°¸ê³ í\95\98ì\84¸ì\9a\94.',
 'javascripttest-qunit-heading' => '미디어위키 자바스크립트 QUnit 실험군',
 
 # Tooltip help for the actions
@@ -2946,8 +3074,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-pt-anonuserpage' => '현재 사용하는 IP의 사용자 문서',
 'tooltip-pt-mytalk' => '내 토론 문서',
 'tooltip-pt-anontalk' => '현재 사용하는 IP를 위한 사용자 토론 문서',
-'tooltip-pt-preferences' => '사용자 환경 설정',
-'tooltip-pt-watchlist' => '주시문서 목록',
+'tooltip-pt-preferences' => '내 사용자 환경 설정',
+'tooltip-pt-watchlist' => '주시문서에 대한 바뀜 목록',
 'tooltip-pt-mycontris' => '내가 편집한 글',
 'tooltip-pt-login' => '꼭 로그인해야 하는 것은 아니지만, 로그인을 권장합니다.',
 'tooltip-pt-anonlogin' => '꼭 필요한 것은 아니지만, 로그인을 하면 편리한 점이 많습니다.',
@@ -2955,28 +3083,29 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-ca-talk' => '문서의 내용에 대한 토론 문서',
 'tooltip-ca-edit' => '문서를 편집할 수 있습니다. 저장하기 전에 미리보기를 해 주세요.',
 'tooltip-ca-addsection' => '문단 추가하기',
-'tooltip-ca-viewsource' => '문서가 잠겨 있습니다. 문서의 소스만 볼 수 있습니다.',
-'tooltip-ca-history' => '문서의 과거 버전들',
+'tooltip-ca-viewsource' => '문서가 잠겨 있습니다.
+문서의 내용만 볼 수 있습니다.',
+'tooltip-ca-history' => '문서의 과거 판',
 'tooltip-ca-protect' => '문서 보호하기',
-'tooltip-ca-unprotect' => 'ì\9d´ ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 ë³\80ê²½í\95\98기',
+'tooltip-ca-unprotect' => 'ì\9d´ ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 ë°\94꾸기',
 'tooltip-ca-delete' => '문서 삭제하기',
-'tooltip-ca-undelete' => 'ì\82­ì \9cë\90\9c ë¬¸ì\84\9c 복구하기',
+'tooltip-ca-undelete' => 'ì\82­ì \9cë\90\98기 ì \84ì\97\90 ì\9d´ ë¬¸ì\84\9cì\9d\98 ì\99\84ë£\8cí\95\9c í\8e¸ì§\91 복구하기',
 'tooltip-ca-move' => '문서 이동하기',
 'tooltip-ca-watch' => '이 문서를 주시문서 목록에 추가합니다.',
 'tooltip-ca-unwatch' => '이 문서를 주시문서 목록에서 제거합니다.',
 'tooltip-search' => '{{SITENAME}} 찾기',
-'tooltip-search-go' => '이 이름의 문서가 존재하면 그 문서로 바로가기',
+'tooltip-search-go' => '이 이름의 문서가 존재하면 그 문서로 바로 가기',
 'tooltip-search-fulltext' => '이 문자열이 포함된 문서 찾기',
 'tooltip-p-logo' => '대문 방문하기',
 'tooltip-n-mainpage' => '대문으로',
 'tooltip-n-mainpage-description' => '대문으로',
-'tooltip-n-portal' => '프로젝트 소개, 당신이 할 수 있는 것, 사이트맵',
-'tooltip-n-currentevents' => '최근의 소식을 봅니다.',
+'tooltip-n-portal' => '프로젝트 소개, 여러분이 할 수 있는 것, 무언가를 찾는 곳',
+'tooltip-n-currentevents' => '최근의 소식을 봅니다',
 'tooltip-n-recentchanges' => '이 위키에서 최근 바뀐 내용의 목록',
-'tooltip-n-randompage' => '임의 문서로 갑니다.',
+'tooltip-n-randompage' => '임의 문서로 갑니다',
 'tooltip-n-help' => '도움말',
 'tooltip-t-whatlinkshere' => '여기로 연결된 모든 문서의 목록',
-'tooltip-t-recentchangeslinked' => 'ì\97¬ê¸°ë¡\9c ì\97°ê²°ë\90\9c ëª¨ë\93  ë¬¸ì\84\9cì\9d\98 ë³\80ê²½ 내역',
+'tooltip-t-recentchangeslinked' => 'ì\97¬ê¸°ë¡\9c ì\97°ê²°ë\90\9c ëª¨ë\93  ë¬¸ì\84\9cì\9d\98 ë°\94ë\80\9c 내역',
 'tooltip-feed-rss' => '이 문서의 RSS 피드입니다.',
 'tooltip-feed-atom' => '이 문서의 Atom 피드입니다.',
 'tooltip-t-contributions' => '이 사용자의 기여 목록을 봅니다.',
@@ -2984,7 +3113,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-t-upload' => '파일을 올립니다.',
 'tooltip-t-specialpages' => '모든 특수 문서의 목록',
 'tooltip-t-print' => '이 문서의 인쇄용 버전',
-'tooltip-t-permalink' => '이 개정판에 대한 고유링크',
+'tooltip-t-permalink' => '이 판에 대한 고유링크',
 'tooltip-ca-nstab-main' => '문서 내용을 봅니다.',
 'tooltip-ca-nstab-user' => '사용자 문서 내용을 봅니다.',
 'tooltip-ca-nstab-media' => '미디어 문서 내용을 봅니다.',
@@ -2997,17 +3126,16 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-ca-nstab-category' => '분류 문서 내용을 봅니다.',
 'tooltip-minoredit' => '사소한 편집으로 표시하기',
 'tooltip-save' => '편집 내용을 저장하기',
-'tooltip-preview' => '편집 미리 보기. 저장하기 전에 꼭 미리 보기를 해 주세요.',
-'tooltip-diff' => 'ì\9e\90ì\8b ì\9d´ ë³\80ê²½í\95\9c 것 보기',
-'tooltip-compareselectedversions' => '이 문서에서 선택한 두 버전간의 차이를 비교',
+'tooltip-preview' => '편집 미리 보기. 저장하기 전에 꼭 미리 보기를 해 주세요!',
+'tooltip-diff' => 'ì\9e\90ì\8b ì\9d´ ë°\94ê¾¼ 것 보기',
+'tooltip-compareselectedversions' => '이 문서에서 선택한 두 간의 차이를 비교',
 'tooltip-watch' => '이 문서를 주시문서 목록에 추가',
 'tooltip-watchlistedit-normal-submit' => '항목 제거하기',
-'tooltip-watchlistedit-raw-submit' => '주시문서 목록 갱신하기',
+'tooltip-watchlistedit-raw-submit' => '주시문서 목록 새로 고침',
 'tooltip-recreate' => '문서를 편집하는 중 삭제되어도 새로 만들기',
 'tooltip-upload' => '파일 올리기 시작',
 'tooltip-rollback' => '"되돌리기" 기능을 사용하면 이 문서에 대한 마지막 기여자의 편집을 모두 되돌릴 수 있습니다.',
-'tooltip-undo' => '"편집 취소" 기능을 사용하면 이 편집이 되돌려지고, 차이보기 기능이 미리보기 형식으로 나타납니다.
-편집 요약에 이 편집을 왜 되돌리는지에 대한 이유를 쓸 수 있습니다.',
+'tooltip-undo' => '"편집 취소" 기능을 사용하면 이 편집이 되돌려지고, 차이보기 기능이 미리보기 형식으로 나타납니다. 편집 요약에 이 편집을 왜 되돌리는지에 대한 이유를 쓸 수 있습니다.',
 'tooltip-preferences-save' => '환경 설정 저장하기',
 'tooltip-summary' => '짧은 편집 요약을 적어주세요',
 
@@ -3022,7 +3150,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'simple.css' => '/* 이 CSS 설정은 모든 심플 스킨에 적용됩니다 */',
 'modern.css' => '/* 이 CSS 설정은 모든 모던 스킨에 적용됩니다 */',
 'vector.css' => '/* 이 CSS 설정은 모든 벡터 스킨에 적용됩니다 */',
-'print.css' => '/* ì\9d´ CSS ì\84¤ì \95ì\9d\80 ì\9cë ¥/ì\9d¸ì\87\84 화면에 적용됩니다 */',
+'print.css' => '/* ì\9d´ CSS ì\84¤ì \95ì\9d\80 ì\9d¸ì\87\84 ì¶\9cë ¥ 화면에 적용됩니다 */',
 'handheld.css' => '/* 이 CSS 설정은 $wgHandheldStyle에 설정한 스킨을 기반으로 한 휴대 기기에 적용됩니다 */',
 'noscript.css' => '/* 이 CSS 설정은 자바스크립트를 비활성화한 사용자에 적용됩니다 */',
 'group-autoconfirmed.css' => '/* 이 CSS 설정은 자동 인증된 사용자에만 적용됩니다 */',
@@ -3050,39 +3178,58 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'notacceptable' => '클라이언트에서 인식 가능한 출력 포맷이 없습니다.',
 
 # Attribution
-'anonymous' => '{{PLURAL:$1}}{{SITENAME}} 익명 사용자',
+'anonymous' => '{{SITENAME}} 익명 {{PLURAL:$1|사용자}}',
 'siteuser' => '{{SITENAME}} 사용자 $1',
 'anonuser' => '{{SITENAME}} 익명 사용자 $1',
 'lastmodifiedatby' => '이 문서는 $3 사용자가 $1 $2에 마지막으로 바꾸었습니다.',
-'othercontribs' => '$1ì\9d\98 ì\9e\91ì\97\85ì\9d\84 ë°\94í\83\95ì\9c¼ë¡\9c í\95¨.',
+'othercontribs' => '$1ì\9d\98 ì\9e\91ì\97\85ì\9d\84 ë°\94í\83\95ì\9c¼ë¡\9c í\95©ë\8b\88ë\8b¤.',
 'others' => '기타',
-'siteusers' => '{{PLURAL:$2}}{{SITENAME}} 사용자 $1',
-'anonusers' => '{{PLURAL:$2}}{{SITENAME}} 익명 사용자 $1',
-'creditspage' => '문서 기여자',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|사용자}} $1',
+'anonusers' => '{{SITENAME}} 익명 {{PLURAL:$2|사용자}} $1',
+'creditspage' => '문서 기여자',
 'nocredits' => '이 문서에서는 기여자 정보가 없습니다.',
 
 # Spam protection
 'spamprotectiontitle' => '스팸 방지 필터',
 'spamprotectiontext' => '스팸 필터가 문서 저장을 막았습니다.
-외부 사이트로 연결하는 링크 중에 블랙리스트에 포함된 사이트가 있을 것입니다.',
+바깥 사이트로 연결하는 링크 중에 블랙리스트에 포함된 사이트가 있을 것입니다.',
 'spamprotectionmatch' => '문제가 되는 부분은 다음과 같습니다: $1',
 'spambot_username' => 'MediaWiki 스팸 제거',
 'spam_reverting' => '$1을 포함하지 않는 최신 버전으로 되돌림',
-'spam_blanking' => '모든 버전에 $1 링크를 포함하고 있어 문서를 비움',
-'spam_deleting' => '모든 버전에 $1 링크를 포함하고 있어 문서를 삭제함',
+'spam_blanking' => '모든 버전에 $1 링크를 포함하고 있어 차단함',
+'spam_deleting' => '모든 버전에 $1 링크를 포함하고 있어 삭제함',
 
 # Info page
 'pageinfo-title' => '"$1" 문서에 대한 정보',
-'pageinfo-header-edits' => '편집',
-'pageinfo-header-watchlist' => '주시 현황',
-'pageinfo-header-views' => '보기 현황',
-'pageinfo-subjectpage' => '문서',
-'pageinfo-talkpage' => '토론 문서',
-'pageinfo-watchers' => '주시하는 사용자 수',
-'pageinfo-edits' => '편집 수',
-'pageinfo-authors' => '서로 다른 편집자의 수',
+'pageinfo-header-basic' => '기본 정보',
+'pageinfo-header-edits' => '편집 역사',
+'pageinfo-header-restrictions' => '문서 보호',
+'pageinfo-header-properties' => '문서 속성',
+'pageinfo-display-title' => '보여줄 이름',
+'pageinfo-default-sort' => '기본 정렬 키',
+'pageinfo-length' => '문서 길이 (바이트)',
+'pageinfo-article-id' => '문서 ID',
+'pageinfo-robot-policy' => '검색 엔진 통계',
+'pageinfo-robot-index' => '색인 가능',
+'pageinfo-robot-noindex' => '색인 불가능',
 'pageinfo-views' => '읽힌 횟수',
-'pageinfo-viewsperedit' => '읽힌 횟수/편집 수',
+'pageinfo-watchers' => '문서를 주시하는 사용자 수',
+'pageinfo-redirects-name' => '이 문서로 넘겨주기',
+'pageinfo-redirects-value' => '$1개',
+'pageinfo-subpages-name' => '이 문서의 하위 문서',
+'pageinfo-subpages-value' => '$1개 ({{PLURAL:$2|넘겨주기}} $2개, {{PLURAL:$3|넘겨주기 아님}} $3개)',
+'pageinfo-firstuser' => '문서 작성자',
+'pageinfo-firsttime' => '문서 작성 날짜',
+'pageinfo-lastuser' => '최근 편집자',
+'pageinfo-lasttime' => '최근 편집 날짜',
+'pageinfo-edits' => '총 편집 수',
+'pageinfo-authors' => '총 서로 다른 편집자 수',
+'pageinfo-recent-edits' => '최근 편집 수 (지난 $1일 이내)',
+'pageinfo-recent-authors' => '최근 기여자 수',
+'pageinfo-restriction' => '문서 보호 (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '매직 {{PLURAL:$1|워드}} ($1개)',
+'pageinfo-hidden-categories' => '숨은 {{PLURAL:$1|분류}} ($1개)',
+'pageinfo-templates' => '포함한 {{PLURAL:$1|틀}} ($1개)',
 
 # Skin names
 'skinname-standard' => '클래식',
@@ -3112,30 +3259,32 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'log-show-hide-patrol' => '검토 기록을 $1',
 
 # Image deletion
-'deletedrevision' => '예전 버전 $1이(가) 삭제되었습니다.',
+'deletedrevision' => '예전 $1 판이 삭제되었습니다.',
 'filedeleteerror-short' => '파일 삭제 오류: $1',
 'filedeleteerror-long' => '파일을 삭제하는 도중 오류가 발생했습니다:
 
 $1',
-'filedelete-missing' => '‘$1’ 파일을 삭제할 수 없습니다. 파일이 존재하지 않습니다.',
-'filedelete-old-unregistered' => '입력한 파일의 "$1" 버전이 데이터베이스에 존재하지 않습니다.',
+'filedelete-missing' => '"$1" 파일을 삭제할 수 없습니다. 파일이 존재하지 않습니다.',
+'filedelete-old-unregistered' => '입력한 파일의 "$1" 이 데이터베이스에 존재하지 않습니다.',
 'filedelete-current-unregistered' => '"$1" 이라는 이름을 가진 파일이 데이터베이스에 존재하지 않습니다.',
-'filedelete-archive-read-only' => '웹 서버의 파일 저장 위치 ‘$1’에 쓰기 권한이 없습니다.',
+'filedelete-archive-read-only' => '웹 서버의 "$1" 파일 저장 위치에 쓰기 권한이 없습니다.',
 
 # Browsing diffs
 'previousdiff' => '← 이전 편집',
 'nextdiff' => '다음 편집 →',
 
 # Media information
-'mediawarning' => "'''경고''': 이 파일에 악성 코드가 포함되어 있을 수 있습니다. 파일을 실행하면 컴퓨터에 문제가 생길 가능성이 있습니다.",
-'imagemaxsize' => "그림 최대 크기:<br />''(파일 문서에 적용되는 기능)''",
+'mediawarning' => "'''경고''': 이 파일에 악성 코드가 포함되어 있을 수 있습니다.
+파일을 실행하면 컴퓨터에 문제가 생길 가능성이 있습니다.",
+'imagemaxsize' => '그림 최대 크기:<br />(파일 문서에 적용되는 기능)',
 'thumbsize' => '섬네일 크기:',
 'widthheightpage' => '$1 × $2, $3페이지',
 'file-info' => '파일 크기: $1, MIME 종류: $2',
 'file-info-size' => '$1 × $2 픽셀, 파일 크기: $3, MIME 종류: $4',
 'file-info-size-pages' => '$1 × $2 픽셀, 파일 크기: $3, MIME 형식: $4, $5{{PLURAL:$5|쪽}}',
 'file-nohires' => '최대 해상도입니다.',
-'svg-long-desc' => 'SVG 파일, 실제 크기 $1 × $2 픽셀, 파일 크기 $3',
+'svg-long-desc' => 'SVG 파일, 실제 크기 $1 × $2 픽셀, 파일 크기: $3',
+'svg-long-desc-animated' => '애니메이션 SVG 파일, 실제 크기 $1 × $2 픽셀, 파일 크기: $3',
 'show-big-image' => '최대 해상도',
 'show-big-image-preview' => '미리 보기 크기: $1.',
 'show-big-image-other' => '다른 {{PLURAL:$2|해상도}}: $1.',
@@ -3145,6 +3294,8 @@ $1',
 'file-info-png-looped' => '반복됨',
 'file-info-png-repeat' => '$1번 재생됨',
 'file-info-png-frames' => '$1 프레임',
+'file-no-thumb-animation' => "'''참고: 기술적인 제한으로 인해 이 파일의 섬네일은 애니메이션을 지원하지 않습니다.'''",
+'file-no-thumb-animation-gif' => "'''참고: 기술적인 제한으로 인해 고해상도 GIF 그림 섬네일은 애니메이션을 지원하지 않습니다.'''",
 
 # Special:NewFiles
 'newimages' => '새 파일 목록',
@@ -3183,7 +3334,8 @@ Variants for Chinese language
 
 # Metadata
 'metadata' => '메타데이터',
-'metadata-help' => '이 파일은 카메라/스캐너에서 기록한 부가 정보를 가지고 있습니다. 프로그램에서 파일을 편집할 경우, 새로 저장한 그림 파일에 일부 부가 정보가 빠질 수 있습니다.',
+'metadata-help' => '이 파일은 카메라나 스캐너에서 기록한 부가 정보를 가지고 있습니다.
+프로그램에서 파일을 편집할 경우, 새로 저장한 그림 파일에 일부 부가 정보가 빠질 수 있습니다.',
 'metadata-expand' => '자세한 정보 보이기',
 'metadata-collapse' => '자세한 정보 숨기기',
 'metadata-fields' => '파일 메타데이터 표가 접혀 있을 때, 이 메시지에 올라와 있는 다음 속성값만이 기본적으로 보이게 됩니다.
@@ -3224,7 +3376,7 @@ Variants for Chinese language
 'exif-primarychromaticities' => '색도의 우선 색',
 'exif-ycbcrcoefficients' => '색 공간 변환 표 계수',
 'exif-referenceblackwhite' => '흑백 값에 대한 정보',
-'exif-datetime' => 'í\8c\8cì\9d¼ì\9d´ ë³\80ê²½ë\90\9c 날짜와 시간',
+'exif-datetime' => 'í\8c\8cì\9d¼ì\9d´ ë°\94ë\80\90 날짜와 시간',
 'exif-imagedescription' => '그림 제목',
 'exif-make' => '카메라 제조사',
 'exif-model' => '카메라 모델',
@@ -3242,8 +3394,8 @@ Variants for Chinese language
 'exif-relatedsoundfile' => '관련된 오디오 파일',
 'exif-datetimeoriginal' => '날짜와 시간',
 'exif-datetimedigitized' => '날짜와 시간(디지털 데이터)',
-'exif-subsectime' => 'í\8c\8cì\9d¼ì\9d´ ë³\80ê²½ë\90\9c ë\82 ì§\9cì\99\80 ì\8b\9cê°\84 (ì´\88ë\8b¨ì\9c\84 ë¯¸ë§\8c)',
-'exif-subsectimeoriginal' => '파일 생성시 날짜와 시간 (초단위 미만)',
+'exif-subsectime' => 'í\8c\8cì\9d¼ì\9d\84 ì\88\98ì \95í\95\9c ë\82 ì§\9cì\99\80 ì\8b\9cê°\84 (ì´\88ë\8b¨ì\9c\84 ë¯¸ë§\8c)',
+'exif-subsectimeoriginal' => '파일을 만든 날짜와 시간 (초단위 미만)',
 'exif-subsectimedigitized' => '디지털화된 날짜와 시간 (초단위 미만)',
 'exif-exposuretime' => '노출 시간',
 'exif-exposuretime-format' => '$1초 ($2)',
@@ -3332,7 +3484,7 @@ Variants for Chinese language
 'exif-objectname' => '짧은 제목',
 'exif-specialinstructions' => '사진 이용에 대한 특이 사항',
 'exif-headline' => '표제어',
-'exif-credit' => '제공자',
+'exif-credit' => '기여자/제공자',
 'exif-source' => '출처',
 'exif-editstatus' => '그림의 편집/구성',
 'exif-urgency' => '긴급',
@@ -3354,7 +3506,7 @@ Variants for Chinese language
 'exif-serialnumber' => '카메라 일련 번호',
 'exif-cameraownername' => '카메라 소유자',
 'exif-label' => '라벨',
-'exif-datetimemetadata' => '메타데이터 최종 변경일',
+'exif-datetimemetadata' => '메타데이터 최종 수정일',
 'exif-nickname' => '이미지의 비공식적 이름',
 'exif-rating' => '평가 (5점 만점)',
 'exif-rightscertificate' => '권리 관리 인증서',
@@ -3366,12 +3518,12 @@ Variants for Chinese language
 'exif-licenseurl' => '저작권 라이선스의 URL',
 'exif-morepermissionsurl' => '다른 라이선스 정보',
 'exif-attributionurl' => '이 저작물을 이용할 때 링크할 주소',
-'exif-preferredattributionname' => '이 저작물을 이용할 때 표시할 저작자 이름',
+'exif-preferredattributionname' => '이 저작물을 이용할 때 보일 저작자 이름',
 'exif-pngfilecomment' => 'PNG 파일 주석',
 'exif-disclaimer' => '면책 조항',
 'exif-contentwarning' => '콘텐츠 경고',
 'exif-giffilecomment' => 'GIF 파일 주석',
-'exif-intellectualgenre' => '콘텐츠 정보',
+'exif-intellectualgenre' => '항목 종류',
 'exif-subjectnewscode' => '주제 코드',
 'exif-scenecode' => 'IPTC 장면 코드',
 'exif-event' => '묘사된 사건',
@@ -3386,9 +3538,9 @@ Variants for Chinese language
 'exif-compression-3' => 'CCITT 그룹-3 팩스 인코딩',
 'exif-compression-4' => 'CCITT 그룹-4 팩스 인코딩',
 'exif-compression-6' => 'JPEG (오래됨)',
-'exif-compression-8' => 'ì\95\95축 (Adobe)',
+'exif-compression-8' => 'ì\88\98축 (Adobe)',
 'exif-compression-32773' => 'PackBits (매킨토시 RLE)',
-'exif-compression-32946' => 'ì\95\95축 (PKZIP)',
+'exif-compression-32946' => 'ì\88\98축 (PKZIP)',
 
 'exif-copyrighted-true' => '저작권의 보호를 받음',
 'exif-copyrighted-false' => '퍼블릭 도메인',
@@ -3597,7 +3749,7 @@ Variants for Chinese language
 
 # External editor support
 'edit-externally' => '이 파일을 외부 프로그램을 사용해서 편집하기',
-'edit-externally-help' => '(ì\9e\90ì\84¸í\95\9c ì \95ë³´ë\8a\94 [//www.mediawiki.org/wiki/Manual:External_editors ì\84¤ì¹\98 ë°©ë²\95\9d\84 ì°¸ê³ í\95\98ì\8b­ì\8b\9cì\98¤)',
+'edit-externally-help' => '(ì\9e\90ì\84¸í\95\9c ì \95ë³´ë\8a\94 [//www.mediawiki.org/wiki/Manual:External_editors ì\84¤ì¹\98 ë°©ë²\95\9d\84 ì°¸ê³ í\95\98ì\84¸ì\9a\94)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => '모든 기간',
@@ -3612,53 +3764,66 @@ Variants for Chinese language
 아래의 버튼을 누르면 인증 메일을 보냅니다.
 메일에는 인증 코드가 들어있는 링크가 있습니다.
 그 링크를 웹 브라우저로 열면 인증이 완료됩니다.',
-'confirmemail_pending' => '이미 확인 이메일을 보냈습니다. 계정을 최근에 만들었다면 이메일을 보내는 데에 몇 분이 걸릴 수 있으므로 잠시 후에 다시 확인해 주세요.',
+'confirmemail_pending' => '이미 확인 이메일을 보냈습니다.
+계정을 최근에 만들었다면 이메일을 보내는 데에 몇 분이 걸릴 수 있으므로 잠시 후에 다시 확인해 주세요.',
 'confirmemail_send' => '인증 코드를 메일로 보내기',
 'confirmemail_sent' => '인증 이메일을 보냈습니다.',
-'confirmemail_oncreate' => '확인 이메일을 보냈습니다. 이 확인 과정은 로그인하는 데에 필요하지는 않지만, 위키 프로그램에서 제공하는 이메일 기능을 사용하기 위해서 필요합니다.',
+'confirmemail_oncreate' => '확인 이메일을 보냈습니다.
+이 확인 과정은 로그인하는 데에 필요하지는 않지만, 위키 프로그램에서 제공하는 이메일 기능을 사용하기 위해서 필요합니다.',
 'confirmemail_sendfailed' => '{{SITENAME}}에서 인증 이메일을 보낼 수 없습니다.
 이메일 주소를 잘못 입력했는지 확인해주세요.
 
 메일 서버로부터의 응답: $1',
-'confirmemail_invalid' => '인증 코드가 올바르지 않습니다. 인증 코드가 만료되었을 수도 있습니다.',
+'confirmemail_invalid' => '인증 코드가 올바르지 않습니다.
+인증 코드가 만료되었을 수도 있습니다.',
 'confirmemail_needlogin' => '이메일 주소를 인증하려면 $1이 필요합니다.',
-'confirmemail_success' => '이메일 주소가 인증되었습니다. 이제 로그인해서 위키를 사용하세요.',
+'confirmemail_success' => '이메일 주소가 인증되었습니다.
+이제 [[Special:UserLogin|로그인]]해서 위키를 사용하세요.',
 'confirmemail_loggedin' => '이메일 주소가 인증되었습니다.',
 'confirmemail_error' => '당신의 인증을 저장하는 도중 오류가 발생했습니다.',
 'confirmemail_subject' => '{{SITENAME}} 이메일 주소 인증',
-'confirmemail_body' => '$1 아이피 주소를 사용하는 사용자가 {{SITENAME}}의 ‘$2’ 계정에 이메일 인증 신청을 했습니다.
+'confirmemail_body' => '$1 IP 주소를 사용하는 사용자가
+{{SITENAME}}의 "$2" 계정에 이메일 인증 신청을 했습니다.
 
-이 계정이 당신의 계정이라면, 아래 주소를 열어서 이메일 인증을 해 주세요.
+이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면
+아래 주소를 열어서 이메일 인증을 해 주세요:
 
 $3
 
-당신의 계정이 아니라면, 이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요.
+당신의 계정이 아니라면,
+이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:
 
 $5
 
 인증 코드는 $4에 만료됩니다.',
-'confirmemail_body_changed' => '$1 IP 주소를 사용하는 사용자가 {{SITENAME}}의 "$2" 계정의 이메일 주소를 바꾸었습니다.
+'confirmemail_body_changed' => '$1 IP 주소를 사용하는 사용자가
+{{SITENAME}}의 "$2" 계정의 이메일 주소를 바꾸었습니다.
 
-이 계정이 당신의 계정인지 확인하고 {{SITENAME}}의 이메일 기능을 활성화하려면 아래 링크를 클릭하여 이메일 인증을 해 주세요.
+이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을 활성화하려면
+아래 주소를 열어서 이메일 인증을 해 주세요:
 
 $3
 
-이 계정이 당신의 것이 아니라면 다음 링크를 열어 이메일 주소 변경을 취소하십시오.
+당신의 계정이 아니라면,
+이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:
 
 $5
 
 인증 코드는 $4에 만료됩니다.',
-'confirmemail_body_set' => 'IP 주소 $1을 사용하는 누군가가 {{SITENAME}}의 "$2" 계정의 이메일 주소를 지정하였습니다.
+'confirmemail_body_set' => 'IP 주소 $1을 사용하는 사용자가
+{{SITENAME}}의 "$2" 계정의 이메일 주소를 지정하였습니다.
 
-이 계정이 당신의 것이며 {{SITENAME}}에서 이메일 기능을 다시 활성화하려면 이 링크를 열어 주십시오:
+이 계정이 당신의 계정이고 {{SITENAME}}에서 이메일 기능을
+다시 활성화하려면 아래 주소를 열어서 이메일 인증을 해 주세요:
 
 $3
 
-만약 이 계정이 당신의 것이 아니라면 다음 링크를 클릭해 이메일 주소 인증을 취소하십시오:
+당신의 계정이 아니라면,
+이메일 인증 신청을 취소하기 위해 아래의 주소를 열어주세요:
 
 $5
 
\9d´ ì\9d¸ì¦\9d ì½\94ë\93\9cë\8a\94 $4ì\97\90 ë§\8cë£\8cë\90©ë\8b\88ë\8b¤.',
+인증 코드는 $4에 만료됩니다.',
 'confirmemail_invalidated' => '이메일 확인이 취소됨',
 'invalidateemail' => '이메일 확인 취소',
 
@@ -3668,17 +3833,17 @@ $5
 'scarytranscludetoolong' => '[URL이 너무 깁니다]',
 
 # Delete conflict
-'deletedwhileediting' => "'''주의''': 당신이 이 문서를 편집하던 중에 이 문서가 삭제되었습니다.",
+'deletedwhileediting' => "'''경고''': 당신이 이 문서를 편집하던 중에 이 문서가 삭제되었습니다!",
 'confirmrecreate' => '[[User:$1|$1]] 사용자([[User talk:$1|토론]])가 당신이 편집하는 도중에 문서를 삭제했습니다. 삭제 이유는 다음과 같습니다:
 : $2
-문서를 다시 ì\83\9dì\84±í\95´ì\95¼ í\95\98ë\8a\94ì§\80 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.',
-'confirmrecreate-noreason' => '[[User:$1|$1]] ì\82¬ì\9a©ì\9e\90([[User talk:$1|í\86 ë¡ ]])ê°\80 ë\8b¹ì\8b ì\9d\98 í\8e¸ì§\91 ë\8f\84ì¤\91 ë¬¸ì\84\9c를 ì\82­ì \9cí\96\88ì\8aµë\8b\88ë\8b¤. ë¬¸ì\84\9c를 ë\8b¤ì\8b\9c ì\83\9dì\84±í\95´ì\95¼ í\95\98ë\8a\94ì§\80 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.',
+문서를 다시 ë§\8cë\93¤ì\96´ì\95¼ í\95\98ë\8a\94ì§\80 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.',
+'confirmrecreate-noreason' => '[[User:$1|$1]] ì\82¬ì\9a©ì\9e\90([[User talk:$1|í\86 ë¡ ]])ê°\80 ë\8b¹ì\8b ì\9d´ í\8e¸ì§\91í\95\98ë\8a\94 ë\8f\84ì¤\91ì\97\90 ë¬¸ì\84\9c를 ì\82­ì \9cí\96\88ì\8aµë\8b\88ë\8b¤. ë¬¸ì\84\9c를 ë\8b¤ì\8b\9c ë§\8cë\93¤ì\96´ì\95¼ í\95\98ë\8a\94ì§\80 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.',
 'recreate' => '새로 만들기',
 
 # action=purge
 'confirm_purge_button' => '확인',
 'confirm-purge-top' => '문서의 캐시를 지울까요?',
-'confirm-purge-bottom' => '문서를 새로고침하는 것은 캐시를 갱신하고 가장 최근의 버전이 나타나게 할 것입니다.',
+'confirm-purge-bottom' => '문서를 새로 고침하는 것은 캐시를 새로 고치고 가장 최근의 판이 나타나게 할 것입니다.',
 
 # action=watch/unwatch
 'confirm-watch-button' => '확인',
@@ -3689,7 +3854,7 @@ $5
 # Multipage image navigation
 'imgmultipageprev' => '← 이전 페이지',
 'imgmultipagenext' => '다음 페이지 →',
-'imgmultigo' => '이동',
+'imgmultigo' => '이동!',
 'imgmultigoto' => '$1 페이지로 가기',
 
 # Table pager
@@ -3700,45 +3865,47 @@ $5
 'table_pager_first' => '처음 문서',
 'table_pager_last' => '마지막 문서',
 'table_pager_limit' => '문서당 $1개 항목 보이기',
-'table_pager_limit_label' => '페이지당 항목 수:',
+'table_pager_limit_label' => '문서당 항목 수:',
 'table_pager_limit_submit' => '확인',
 'table_pager_empty' => '결과 없음',
 
 # Auto-summaries
 'autosumm-blank' => '문서를 비움',
-'autosumm-replace' => '문서 내용을 ‘$1’으로 바꿈',
+'autosumm-replace' => '문서 내용을 "$1"으로 바꿈',
 'autoredircomment' => '[[$1]] 문서로 넘겨주기',
 'autosumm-new' => '새 문서: $1',
 
 # Live preview
 'livepreview-loading' => '불러오는 중...',
-'livepreview-ready' => '불러 오는 중… 준비!',
-'livepreview-failed' => '실시간 미리 보기 실패! 일반 미리 보기를 이용해주세요.',
+'livepreview-ready' => '불러 오는 중... 준비!',
+'livepreview-failed' => '실시간 미리 보기 실패!
+일반 미리 보기를 이용하세요.',
 'livepreview-error' => '연결에 실패하였습니다: $1 "$2"
-일반 미리보기를 이용하십시오.',
+일반 미리 보기를 이용하세요.',
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => '최근 $1초 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.',
-'lag-warn-high' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ì\84\9cë²\84ì\9d\98 ê³¼ë\8f\84í\95\9c ë¶\80í\95\98 ë\95\8c문ì\97\90 ìµ\9cê·¼ $1ì´\88 ì\95\88ì\97\90 ë³\80ê²½ë\90\9c ë¬¸ì\84\9c ëª©ë¡\9dì\9d\80 í\91\9cì\8b\9cë\90\98지 않을 수 있습니다.',
+'lag-warn-high' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ ì\84\9cë²\84ì\9d\98 ê³¼ë\8f\84í\95\9c ë¶\80í\95\98 ë\95\8c문ì\97\90 ìµ\9cê·¼ $1ì´\88 ì\95\88ì\97\90 ë°\94ë\80\90 ë¬¸ì\84\9c ëª©ë¡\9dì\9d\80 ë³´ì\97¬ì§\80지 않을 수 있습니다.',
 
 # Watchlist editor
 'watchlistedit-numitems' => '토론 문서를 제외하고 문서 $1개를 주시하고 있습니다.',
 'watchlistedit-noitems' => '주시문서 목록이 비어 있습니다.',
 'watchlistedit-normal-title' => '주시문서 목록 편집하기',
-'watchlistedit-normal-legend' => '주시목록에서 문서 제거하기',
-'watchlistedit-normal-explain' => "주시문서 목록에 있는 문서의 제목이 아래에 나열되어 있습니다.
-주시문서 목록에서 제거하려는 문서가 있으면, 각 항목의 체크박스를 선택한 다음 '{{int:Watchlistedit-normal-submit}}'를 클릭해주세요.
-또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.",
+'watchlistedit-normal-legend' => '주ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90ì\84\9c ë¬¸ì\84\9c ì \9cê±°í\95\98기',
+'watchlistedit-normal-explain' => '주시문서 목록에 있는 문서의 제목이 아래에 나열되어 있습니다.
+주시문서 목록에서 제거하려는 문서가 있으면, 각 항목의 체크박스를 선택한 다음 "{{int:Watchlistedit-normal-submit}}"를 클릭해주세요.
+또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.',
 'watchlistedit-normal-submit' => '항목 삭제',
 'watchlistedit-normal-done' => '주시문서 목록에서 다음 {{PLURAL:$1|항목}}을 주시하지 않습니다:',
 'watchlistedit-raw-title' => '주시문서 목록 직접 편집하기',
 'watchlistedit-raw-legend' => '주시문서 목록 직접 편집하기',
-'watchlistedit-raw-explain' => "주시문서 목록의 각 항목이 나와 있습니다. 필요한 항목을 직접 추가하거나 제거할 수 있습니다.
-각 줄마다 하나의 제목을 쓰고, 수정을 마쳤다면 '{{int:Watchlistedit-raw-submit}}'을 누르면 됩니다.
-또는 [[Special:EditWatchlist|일반적인 편집기]]를 쓸 수도 있습니다.",
+'watchlistedit-raw-explain' => '주시문서 목록의 각 항목이 나와 있습니다. 필요한 항목을 직접 추가하거나 제거할 수 있습니다.
+각 줄마다 하나의 제목을 입력하세요.
+수정을 마쳤다면 "{{int:Watchlistedit-raw-submit}}"을 누르면 됩니다.
+또는 [[Special:EditWatchlist|일반적인 편집기]]를 쓸 수도 있습니다.',
 'watchlistedit-raw-titles' => '목록:',
-'watchlistedit-raw-submit' => '주시문서 목록 갱신',
-'watchlistedit-raw-done' => '주시문서 목록을 갱신했습니다.',
+'watchlistedit-raw-submit' => '주시문서 목록 새로 고침',
+'watchlistedit-raw-done' => '주시문서 목록을 새로 고쳤습니다.',
 'watchlistedit-raw-added' => '문서 $1개를 추가했습니다:',
 'watchlistedit-raw-removed' => '문서 $1개를 제거했습니다:',
 
@@ -3773,12 +3940,12 @@ $5
 'version-version' => '(버전 $1)',
 'version-license' => '라이선스',
 'version-poweredby-credits' => "이 위키는 '''[//www.mediawiki.org/ MediaWiki]'''를 기반으로 작동합니다. Copyright © 2001-$1 $2.",
-'version-poweredby-others' => '그 외 다른 개발자',
+'version-poweredby-others' => '[{{SERVER}}{{SCRIPTPATH}}/CREDITS 그 외 다른 개발자]',
 'version-license-info' => "미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.
 
 미디어위키가 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''. 자세한 내용은 GNU 일반 공중 사용 허가서 전문을 참고하십시오.
 
-당신은 이 프로그램을 통해 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 일반 공중 사용 허가서 전문]을 받았습니다; 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 온라인으로 읽어보시기] 바랍니다.",
+당신은 이 프로그램을 통해 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 일반 공중 사용 허가서 전문]을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 온라인으로 읽어보시기] 바랍니다.",
 'version-software' => '설치된 프로그램',
 'version-software-product' => '제품',
 'version-software-version' => '버전',
@@ -3802,8 +3969,8 @@ $5
 'fileduplicatesearch-filename' => '파일 이름:',
 'fileduplicatesearch-submit' => '찾기',
 'fileduplicatesearch-info' => '$1 × $2 픽셀<br />파일 크기: $3<br />MIME 유형: $4',
-'fileduplicatesearch-result-1' => '‘$1’ 파일과 중복된 파일이 없습니다.',
-'fileduplicatesearch-result-n' => '"$1"파일은 중복 파일이 $2개 있습니다.',
+'fileduplicatesearch-result-1' => '"$1" 파일과 중복된 파일이 없습니다.',
+'fileduplicatesearch-result-n' => '"$1" 파일은 중복 파일이 $2개 있습니다.',
 'fileduplicatesearch-noresults' => '"$1"이라는 이름을 가진 파일이 없습니다.',
 
 # Special:SpecialPages
@@ -3813,7 +3980,7 @@ $5
 * <span class="mw-specialpagerestricted">제한된 특수 문서.</span>',
 'specialpages-group-maintenance' => '관리용 목록',
 'specialpages-group-other' => '다른 특수 문서',
-'specialpages-group-login' => 'ë¡\9cê·¸ì\9d¸ / ê°\80ì\9e\85',
+'specialpages-group-login' => 'ë¡\9cê·¸ì\9d¸ / ê³\84ì \95 ë§\8cë\93¤ê¸°',
 'specialpages-group-changes' => '최근 바뀜과 기록',
 'specialpages-group-media' => '파일 관리',
 'specialpages-group-users' => '사용자와 권한',
@@ -3830,8 +3997,8 @@ $5
 
 # External image whitelist
 'external_image_whitelist' => ' #이 줄은 그대로 두십시오<pre>
-#ì \95ê·\9c í\91\9cí\98\84ì\8b\9d(// ì\82¬ì\9d´ì\97\90 ì\9e\88ë\8a\94 ë¶\80ë¶\84\9d\84 ì\95\84ë\9e\98ì\97\90 ì\8d¨ ì£¼ì\8b­ì\8b\9cì\98¤.
-#이 목록은 외부 이미지의 URL과 대조ë\90  ê²\83ì\9e\85ë\8b\88ë\8b¤.
+#ì \95ê·\9c í\91\9cí\98\84ì\8b\9d(// ì\82¬ì\9d´ì\97\90 ì\9e\88ë\8a\94 ë¶\80ë¶\84\9d\84 ì\95\84ë\9e\98ì\97\90 ì\9e\85ë ¥í\95\98ì\84¸ì\9a\94.
+#이 목록은 외부 이미지의 URL과 대조í\95  ê²\83ì\9e\85ë\8b\88ë\8b¤.
 #이 목록과 일치하는 것은 그림이 직접 보여지지만, 그렇지 않은 경우 그림을 가리키는 링크만 보이게 될 것입니다.
 # "#"으로 시작하는 줄은 주석으로 간주됩니다.
 #이 목록은 대소문자를 구별하지 않습니다.
@@ -3845,7 +4012,7 @@ $5
 'tags-title' => '태그',
 'tags-intro' => '이 페이지는 소프트웨어에서 편집에 대해 표시하는 태그와 그 의미를 설명하는 목록입니다.',
 'tags-tag' => '태그 이름',
-'tags-display-header' => 'ë³\80ê²½ 목록의 모양',
+'tags-display-header' => 'ë°\94ë\80\9c 목록의 모양',
 'tags-description-header' => '태그에 대한 설명',
 'tags-hitcount-header' => '태그된 바뀜',
 'tags-edit' => '편집',
@@ -3865,11 +4032,12 @@ $5
 
 # Database error messages
 'dberr-header' => '이 위키에 문제가 있습니다.',
-'dberr-problems' => '죄송합니다. 이 사이트는 기술적인 문제가 있습니다.',
+'dberr-problems' => '죄송합니다!
+이 사이트는 기술적인 문제가 있습니다.',
 'dberr-again' => '잠시 후에 다시 시도해주세요.',
 'dberr-info' => '(데이터베이스에 접속할 수 없습니다: $1)',
 'dberr-usegoogle' => '그 동안 구글을 통해 검색할 수도 있습니다.',
-'dberr-outofdate' => '참고로, 구글의 내용 개요는 오래된 것일 수도 있습니다.',
+'dberr-outofdate' => '참고로 구글의 내용 개요는 오래된 것일 수도 있습니다.',
 'dberr-cachederror' => '다음은 요청한 문서의 캐시된 복사본이며, 최신이 아닐 수도 있습니다.',
 
 # HTML forms
@@ -3881,48 +4049,48 @@ $5
 'htmlform-int-toohigh' => '당신이 입력한 값은 최대값 $1 이상입니다.',
 'htmlform-required' => '이 값은 필수 항목입니다',
 'htmlform-submit' => '저장',
-'htmlform-reset' => 'ë³\80ê²½í\95\9c 것을 되돌리기',
+'htmlform-reset' => 'ë°\94ê¾¼ 것을 되돌리기',
 'htmlform-selectorother-other' => '기타',
 
 # SQLite database support
-'sqlite-has-fts' => '$1 (본문 전체 검색)',
-'sqlite-no-fts' => '$1 (본문은 검색에서 제외)',
+'sqlite-has-fts' => '$1 (본문 전체 찾기)',
+'sqlite-no-fts' => '$1 (본문은 찾기에서 제외)',
 
 # New logging system
 'logentry-delete-delete' => '$1 사용자가 $3 문서를 삭제하였습니다.',
 'logentry-delete-restore' => '$1 사용자가 $3 문서를 복구하였습니다.',
-'logentry-delete-event' => '$1 사용자가 $3의 $5개의 기록에 대해 표시 설정을 바꾸었습니다: $4',
-'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5}}개 편집의 설정을 변경하였습니다: $4',
-'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 표시 설정을 변경하였습니다.',
-'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 표시 설정을 변경하였습니다.',
+'logentry-delete-event' => '$1 사용자가 $3의 기록 $5개에 대해 보이기 설정을 바꾸었습니다: $4',
+'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 바꾸었습니다: $4',
+'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 보이기 설정을 바꾸었습니다.',
+'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 보이기 설정을 바꾸었습니다.',
 'logentry-suppress-delete' => '$1 사용자가 $3 문서를 숨겼습니다.',
-'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 표시 설정을 바꾸었습니다: $4',
-'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 표시 설정을 바꾸었습니다: $4',
-'logentry-suppress-event-legacy' => '$1 사용자가 비공개적으로 $3의 항목에 대한 표시 설정을 바꾸었습니다.',
-'logentry-suppress-revision-legacy' => '$1 사용자가 비공개적으로 $3 문서의 특정 판에 대한 표시 설정을 바꾸었습니다.',
+'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 보이기 설정을 바꾸었습니다: $4',
+'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 보이기 설정을 바꾸었습니다: $4',
+'logentry-suppress-event-legacy' => '$1 사용자가 비공개적으로 $3의 항목에 대한 보이기 설정을 바꾸었습니다.',
+'logentry-suppress-revision-legacy' => '$1 사용자가 비공개적으로 $3 문서의 특정 판에 대한 보이기 설정을 바꾸었습니다.',
 'revdelete-content-hid' => '내용 숨겨짐',
 'revdelete-summary-hid' => '편집 요약 숨겨짐',
-'revdelete-uname-hid' => '계정 이름 숨겨짐',
+'revdelete-uname-hid' => '사용자 이름 숨겨짐',
 'revdelete-content-unhid' => '내용 숨김 해제됨',
 'revdelete-summary-unhid' => '편집 요약 숨김 해제됨',
-'revdelete-uname-unhid' => '계정 이름 숨김 해제됨',
+'revdelete-uname-unhid' => '사용자 이름 숨김 해제됨',
 'revdelete-restricted' => '관리자에게 제한을 적용함',
 'revdelete-unrestricted' => '관리자에 대한 제한을 해제함',
-'logentry-move-move' => '$1 사용자가 $3 문서를 $4로 옮겼습니다.',
-'logentry-move-move-noredirect' => '$1 사용자가 $3 문서를 넘겨주기를 생성하지 않고 $4로 옮겼습니다.',
-'logentry-move-move_redir' => '$1 사용자가 $3 문서를 $4로 옮기면서 넘겨주기를 덮어썼습니다.',
-'logentry-move-move_redir-noredirect' => '$1 사용자가 $3 문서를 $4로 넘겨주기를 남기지 않으면서 옮기면서 옮길 대상에 있던 넘겨주기를 덮어썼습니다..',
+'logentry-move-move' => '$1 사용자가 $3 문서를 $4 문서로 옮겼습니다.',
+'logentry-move-move-noredirect' => '$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 옮겼습니다.',
+'logentry-move-move_redir' => '$1 사용자가 $3 문서를 $4 문서로 옮기면서 넘겨주기를 덮어썼습니다.',
+'logentry-move-move_redir-noredirect' => '$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 옮기면서 옮길 대상에 있던 넘겨주기를 덮어썼습니다.',
 'logentry-patrol-patrol' => '$1 사용자가 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
 'logentry-patrol-patrol-auto' => '$1 사용자가 자동적으로 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
-'logentry-newusers-newusers' => '$1 사용자가 계정을 ì\83\9dì\84±í\96\88ì\8aµë\8b\88ë\8b¤.',
-'logentry-newusers-create' => '$1 사용자가 계정을 ì\83\9dì\84±í\96\88ì\8aµë\8b\88ë\8b¤.',
-'logentry-newusers-create2' => '$1 사용자가 $3 계정을 ì\83\9dì\84±í\96\88ì\8aµë\8b\88ë\8b¤.',
-'logentry-newusers-autocreate' => '$1 계정이 자동적으로 생성되었습니다.',
+'logentry-newusers-newusers' => '$1 사용자가 계정을 ë§\8cë\93¤ì\97\88ì\8aµë\8b\88ë\8b¤.',
+'logentry-newusers-create' => '$1 사용자가 계정을 ë§\8cë\93¤ì\97\88ì\8aµë\8b\88ë\8b¤.',
+'logentry-newusers-create2' => '$1 사용자가 $3 계정을 ë§\8cë\93¤ì\97\88ì\8aµë\8b\88ë\8b¤.',
+'logentry-newusers-autocreate' => '$1 사용자 계정을 자동적으로 만들었습니다.',
 'newuserlog-byemail' => '이메일로 보낸 비밀번호',
 
 # Feedback
 'feedback-bugornote' => '기술적 문제를 구체적으로 설명할 준비가 되었다면 [$1 버그를 신고]해 주세요.
-아니면 아래에 쉬운 양식을 쓸 수 있습니다. 당신의 의견은 계정 이름과 사용 중인 브라우저 정보와 함께 "[$3 $2]"에 남겨질 것입니다.',
+아니면 아래에 쉬운 양식을 쓸 수 있습니다. 당신의 의견은 사용자 이름과 사용 중인 브라우저 정보와 함께 "[$3 $2]"에 남겨질 것입니다.',
 'feedback-subject' => '제목:',
 'feedback-message' => '내용:',
 'feedback-cancel' => '취소',
@@ -3931,7 +4099,7 @@ $5
 'feedback-error1' => '오류: API 실행 결과를 인식할 수 없음',
 'feedback-error2' => '오류: 편집 실패',
 'feedback-error3' => '오류: API가 응답하지 않음',
-'feedback-thanks' => '감사합니다! ‘[$2 $1]’ 문서에 당신의 의견을 남겼습니다.',
+'feedback-thanks' => '감사합니다! "[$2 $1]" 문서에 당신의 의견을 남겼습니다.',
 'feedback-close' => '완료',
 'feedback-bugcheck' => '감사합니다! 혹시 해당 사항이 [$1 기존의 버그 보고서]에 올라와 있는지 확인해주세요.',
 'feedback-bugnew' => '확인했습니다. 새로운 버그 보고서를 작성합니다.',
@@ -3941,15 +4109,18 @@ $5
 'api-error-badtoken' => '내부 오류: 토큰이 잘못되었습니다.',
 'api-error-copyuploaddisabled' => '이 서버에서 URL을 통해 파일 올리기가 비활성화되어 있습니다.',
 'api-error-duplicate' => '이 위키에 내용이 똑같은 {{PLURAL:$1|[$2 다른 파일]}}이 있습니다.',
-'api-error-duplicate-archive' => '같은 내용을 담고 있던 {{PLURAL:$1|[$2 다른 파일]}}이 있었지만 이 {{PLURAL:$1|파일|파일들}}은 삭제되었습니다.',
+'api-error-duplicate-archive' => '같은 내용을 담고 있던 {{PLURAL:$1|[$2 다른 파일]}}이 있었지만 이 {{PLURAL:$1|파일}}은 삭제되었습니다.',
 'api-error-duplicate-archive-popup-title' => '중복된 {{PLURAL:$1|파일}}이 이미 삭제되었습니다.',
-'api-error-duplicate-popup-title' => '중복된 {{PLURAL:$1|파일}}',
+'api-error-duplicate-popup-title' => '중복된 {{PLURAL:$1|파일}}입니다.',
 'api-error-empty-file' => '당신이 올리려는 파일이 비어 있습니다.',
 'api-error-emptypage' => '새 문서로 빈 문서를 만들 수 없습니다.',
 'api-error-fetchfileerror' => '내부 오류: 파일을 불러오는 중 문제가 발생했습니다.',
+'api-error-fileexists-forbidden' => '"$1" 이름으로 된 파일은 이미 존재하고 덮어쓸 수 없습니다.',
+'api-error-fileexists-shared-forbidden' => '"$1" 이름으로 된 파일이 이미 공용 저장소에 존재하며 덮어쓸 수 없습니다.',
 'api-error-file-too-large' => '당신이 올리려는 파일이 너무 큽니다.',
 'api-error-filename-tooshort' => '파일 이름이 너무 짧습니다.',
-'api-error-filetype-banned' => '이런 형식의 파일은 올릴 수 없습니다.',
+'api-error-filetype-banned' => '이런 파일 형식은 올릴 수 없습니다.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|파일 형식은 올릴 수 없습니다}}. $2 {{PLURAL:$3|파일 형식만 사용할 수 있습니다}}.',
 'api-error-filetype-missing' => '파일 이름에 확장자가 없습니다.',
 'api-error-hookaborted' => '당신이 시도한 수정이 확장 기능 훅에 의해 중단되었습니다.',
 'api-error-http' => '내부 오류: 서버에 연결할 수 없습니다.',
@@ -3959,7 +4130,7 @@ $5
 'api-error-missingparam' => '내부 오류: 요청 중 매개변수가 누락되었습니다.',
 'api-error-missingresult' => '내부 오류: 파일의 복제가 성공했는지 판단할 수 없습니다.',
 'api-error-mustbeloggedin' => '파일을 올리기 위해서는 로그인해야 합니다.',
-'api-error-mustbeposted' => '이 소프트웨어에 버그가 있습니다; 올바른 HTTP 전송 방식을 사용하지 않았습니다.',
+'api-error-mustbeposted' => '내부 오류: HTTP POST에 요청이 필요합니다.',
 'api-error-noimageinfo' => '파일 올리기는 성공했지만 서버가 파일에 대해 어떠한 정보도 주지 않았습니다.',
 'api-error-nomodule' => '내부 오류: 올리기 모듈이 설정되지 않았습니다.',
 'api-error-ok-but-empty' => '내부 오류: 서버에서 응답이 없습니다.',
@@ -3967,9 +4138,9 @@ $5
 'api-error-stashfailed' => '내부 오류: 서버가 임시 파일을 저장하지 못했습니다.',
 'api-error-timeout' => '서버가 제 시간 내에 응답하지 않았습니다.',
 'api-error-unclassified' => '알 수 없는 오류가 발생했습니다.',
-'api-error-unknown-code' => '알 수 없는 오류: "$1"',
+'api-error-unknown-code' => '알 수 없는 오류: "$1".',
 'api-error-unknown-error' => '내부 오류: 파일을 올리려 하는 도중에 무엇인가가 잘못되었습니다.',
-'api-error-unknown-warning' => 'ì\9b\90ì\9d¸ ë¶\88ëª\85ì\9d\98 ê²½ê³ : $1',
+'api-error-unknown-warning' => 'ì\95\8c ì\88\98 ì\97\86ë\8a\94 ê²½ê³ : "$1".',
 'api-error-unknownerror' => '알 수 없는 오류: "$1".',
 'api-error-uploaddisabled' => '이 위키에서 파일 올리기가 비활성화되어 있습니다.',
 'api-error-verification-error' => '파일이 손상되었거나 잘못된 확장자를 사용하고 있습니다.',
index 1fd6c5c..d457a15 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Karachay-Balkar (Ð\9aÑ\8aаÑ\80аÑ\87ай-Ð\9cалкъар)
+/** Karachay-Balkar (кÑ\8aаÑ\80аÑ\87ай-малкъар)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -47,7 +47,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Джангы тюрлениулени списогунда тинтилген тюрлениулени кёргюзме',
 'tog-newpageshidepatrolled' => 'Джангы бетлени списогунда тинтилген бетлени кёргюзме',
 'tog-extendwatchlist' => 'Кёзде тургъан тизмени, къуру ахыр тюл, бютеу тюрлениулени кёрюр ючюн кенгерт',
-'tog-usenewrc' => 'Ð\94жангÑ\8b Ñ\82Ñ\8eÑ\80лениÑ\83лени Ð¸Ð³Ð¸Ð»ÐµÐ½Ð½Ð³ÐµÐ½ Ñ\81пиÑ\81огÑ\83н Ñ\85айÑ\8bÑ\80ландÑ\8bÑ\80 (JavaScript керекди)',
+'tog-usenewrc' => 'Ð\90Ñ\85Ñ\8bÑ\80 Ñ\82Ñ\8eÑ\80лениÑ\83леде Ñ\8dм ÐºÑ\91здеги Ñ\82измеде Ð±ÐµÑ\82лени ÐºÑ\8aаÑ\83Ñ\83м Ñ\82Ñ\8eÑ\80лениÑ\83леÑ\80и (JavaScript керекди)',
 'tog-numberheadings' => 'Башлыкъланы (бёлюмлени атлары) автомат номерленсинле',
 'tog-showtoolbar' => 'Тюрлендирген сагъатда, башындагъы инструмент панелни кёргюз (JavaScript)',
 'tog-editondblclick' => 'Эки басыу бла тюрлендириу бет ачылсын (JavaScript)',
@@ -1347,9 +1347,9 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 Алландан джюкленнген файлланы кёрюр неда излер ючюн [[Special:FileList|джюкленнген файлланы списогуна]] къарагъыз, (джангыдан) джюкленнгенле [[Special:Log/upload|джюклеу журналында]], кетерилгенле [[Special:Log/delete|кетериу журналында]] тутуладыла.
 
 Бетге файл салыр ючюн байлмыгъызда тюбюндеги формаларыны бирин хайырланыгъыз;
-* Файлны бютеу ёлчемини салыр ючюн: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''
-* Сол къыйрда бир тёртгюл ичинде, тюбюндеда ангылатыуу бла, 200 пиксел ёлчеми бла хайырландырыргъа излей эсегиз: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|тюбюнде ангылатыу]]</nowiki></tt>'''
-* Файлны кёргюзмей, файлгъа дижбиреиу берирге излей эсегиз: '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''",
+* Файлны бютеу ёлчемини салыр ючюн: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''
+* Сол къыйрда бир тёртгюл ичинде, тюбюндеда ангылатыуу бла, 200 пиксел ёлчеми бла хайырландырыргъа излей эсегиз: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|тюбюнде ангылатыу]]</nowiki></code>'''
+* Файлны кёргюзмей, файлгъа дижбиреиу берирге излей эсегиз: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
 'upload-permitted' => 'Эркинлик берилген файлланы типлери: $1.',
 'upload-preferred' => 'Изленнген файлланы типлери: $1.',
 'upload-prohibited' => 'Джасакъ этилген файлланы типлери: $1.',
@@ -1392,21 +1392,21 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'large-file' => 'Файлланы $1 байтдан уллу болмасы изленеди (бу файлны ёлчеми $2)',
 'largefileserver' => 'Бу файл сервер эркинлик бергенден уллуду.',
 'emptyfile' => 'Джюклеген файлыгъыз бош кёрюнеди. Буну чуруму файлны атыны джазыуда халат болургъа болур. Файлны джюклерге излегенигизден ишексиз болугъуз.',
-'fileexists' => "Быллай атлы файл барды.
-Аны ауушдурурда аккылы эсегиз, алгъын '''<tt>[[:$1]]</tt>''' файлгъа кёз джетдиригиз.
-[[$1|thumb]]",
-'filepageexists' => "Бу файл ючюн ангылатыу бет '''<tt>[[:$1]]</tt>''' адресинде алайсызда барды, алай а бу атлы файл бусагъатда джокъду.
+'fileexists' => 'Быллай атлы файл барды.
+Аны ауушдурурда аккылы эсегиз, алгъын <strong>[[:$1]]</strong> файлгъа кёз джетдиригиз.
+[[$1|thumb]]',
+'filepageexists' => 'Бу файл ючюн ангылатыу бет <strong>[[:$1]]</strong> адресинде алайсызда барды, алай а бу атлы файл бусагъатда джокъду.
 Ангылатыуугъуз файлны ангылатыу бетинде чыгъарыкъ тюлдю.
 Джангы ангылтаыу къошар ючюн, буну къол бла тюрлендирирге керексиз.
-[[$1|thumb]]",
-'fileexists-extension' => "Ушаш аты бла башха файл барды: [[$2|thumb]]
-* Джюкленнген файлны аты: '''<tt>[[:$1]]</tt>'''
-* Бар болгъан файлны аты: '''<tt>[[:$2]]</tt>'''
-Башха ат сайларыгъыгъызны тилейбиз.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Ушаш аты бла башха файл барды: [[$2|thumb]]
+* Джюкленнген файлны аты: <strong>[[:$1]]</strong>
+* Бар болгъан файлны аты: <strong>[[:$2]]</strong>
+Башха ат сайларыгъыгъызны тилейбиз.',
 'fileexists-thumbnail-yes' => "Бу файл, гитче этилген весриягъа (миниатурагъа) ушайды ''(thumbnail)''. [[$1|thumb]]
-Тилейбиз '''<tt>[[:$1]]</tt>''' файлны контроль этигиз .
+Тилейбиз <strong>[[:$1]]</strong> файлны контроль этигиз .
 Контроль этилген файл бла оригинал бир эсе, айры аны гитче этилген версиясын джюклерге керек джокъду.",
-'file-thumbnail-no' => "Бу файлны аты '''<tt>$1</tt>''' бла башланады.
+'file-thumbnail-no' => "Бу файлны аты <strong>$1</strong> бла башланады.
 Бу башха суратны гитче этилген версиясына ушайды ''(thumbnail)''
 Сизде бу суратны толу версиясы бар эсе, аны джюклегиз неда файлны атын тюрлендиригиз.",
 'fileexists-forbidden' => 'Бу ат бла файл барды, эмда аны юсюне джазылылмайды.
@@ -1481,6 +1481,7 @@ URL-адрес тюз болгъанын осмакълагъыз эмда дж
 
 # Special:UploadStash
 'uploadstash' => 'Джашыртын джюклеу',
+'uploadstash-clear' => 'Джашырылгъан файлланы ариула',
 'uploadstash-nofiles' => 'Сизни джашырылгъан файлларыгъыз джокъду',
 'uploadstash-refresh' => 'Файлланы тизмесин джангырт',
 
@@ -1566,6 +1567,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 [[Special:WhatLinksHere/$2|Толу спиосок]] барды.',
 'nolinkstoimage' => 'Бу файлгъа джиберген бет джокъду.',
 'morelinkstoimage' => 'Бу файлгъа [[Special:WhatLinksHere/$1|къалгъан джибериулеге]] къара.',
+'linkstoimage-redirect' => '$1 (файл редирект) $2',
 'duplicatesoffile' => '{{PLURAL:$1|файл|$1 файл}}, бу файлны дубликатыды ([[Special:FileDuplicateSearch/$2|анданда кёб ангылатыу]]):',
 'sharedupload' => 'Бу файл $1денди эм башха проектледе хайырландыргъа боллукъду.',
 'sharedupload-desc-there' => 'Бу файл $1 базадан башха проектледе хайырландырыргъа боллукъду.
@@ -1610,7 +1612,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 
 # MIME search
 'mimesearch' => 'MIME бла излеу',
-'mimesearch-summary' => 'Бу бет, MIME типли файлланы сайларгъа мадар береди. Кириуню форматы: ичиндегини_типи/тюб_тип, сёз ючюн, <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Бу бет, MIME типли файлланы сайларгъа мадар береди. Кириуню форматы: ичиндегини_типи/тюб_тип, сёз ючюн, <code>image/jpeg</code>.',
 'mimetype' => 'MIME-типи:',
 'download' => 'джюкле',
 
@@ -1776,6 +1778,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'allpagesprefix' => 'Былайда джазгъан харифледен башланнган бетлени список эт:',
 'allpagesbadtitle' => 'Кирилген бет аты тиллени арасы байлм неда викилени арасында байлам болгъаны себебли джараусузду. Башлыкълада хайырланыуу джасакъ болгъан бир неда андан аслам символ тутаргъа болур.',
 'allpages-bad-ns' => '{{SITENAME}} сайтда «$1» ат алам джокъду.',
+'allpages-hide-redirects' => 'Башха бетлеге джиберген бетлени (редиректлени) джашыр',
 
 # Special:Categories
 'categories' => 'Категорияла',
@@ -1798,7 +1801,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'linksearch-ok' => 'Таб',
 'linksearch-text' => '<code>*.wikipedia.org</code> кибик символлла хайырландырыргъа боллукъдула.
 Эм азы бла огъары дараджаны домени керекди, юлгюге: <code>*.org</code><br />
-Дагъан болгъан протоколла: <tt>$1</tt> (быладан къайсысында излеуюгюзге къошмагъыз)',
+Дагъан болгъан протоколла: <code>$1</code> (быладан къайсысында излеуюгюзге къошмагъыз)',
 'linksearch-line' => '$1-ге  $2-ден джибериу берилгенди',
 'linksearch-error' => 'Джокерле къуру адреслени аллында хайырланыргъа боллукъдула.',
 
@@ -1831,8 +1834,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'listgrouprights-rights' => 'Хакъла',
 'listgrouprights-helppage' => 'Help:Къауумланы хакълары',
 'listgrouprights-members' => '(къауумну тизмеси)',
-'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
-'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
+'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <code>($2)</code></span>',
+'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <code>($2)</code></span>',
 'listgrouprights-addgroup' => '{{PLURAL:$2|Къауум|Къауум}} къошаргъа боллукъду: $1',
 'listgrouprights-removegroup' => 'бу {{PLURAL:$2|къауумдан|къауумладан}} къыстаргъа боллукъду: $1',
 'listgrouprights-addgroup-all' => 'Бютеу къауумлагъа къошаргъа боллукъду',
@@ -2580,10 +2583,6 @@ MediaWiki локализациясына юлюш къошаргъа излей
 # Info page
 'pageinfo-title' => '«$1» бетни юсюнден информация',
 'pageinfo-header-edits' => 'Тюрлендириуле',
-'pageinfo-header-watchlist' => 'Кёзде тургъан тизме',
-'pageinfo-header-views' => 'Къараула',
-'pageinfo-subjectpage' => 'Бет',
-'pageinfo-talkpage' => 'Сюзюу бет',
 'pageinfo-watchers' => 'Кёргенлени саны',
 'pageinfo-edits' => 'Тюрлендириулени саны',
 'pageinfo-authors' => 'Авторланы саны',
@@ -3444,6 +3443,7 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'api-error-file-too-large' => 'Сиз ийген файл асыры уллуду.',
 'api-error-filename-tooshort' => 'Файлны аты асыры къысхады.',
 'api-error-filetype-banned' => 'Быллай типли файлла джасакъланыбдыла.',
+'api-error-filetype-banned-type' => '$1 — {{PLURAL:$4|джасакъланнган файл типди|джасакъланнган файл типледиле}}. Эркинлик берилген {{PLURAL:$3|файл тип|файл типле}}: $2.',
 'api-error-filetype-missing' => 'Файлны кенгериую джокъду.',
 'api-error-hookaborted' => 'Сиз теджеген тюрлендириуню кенгертиуню сюзюучю джасакълагъанды.',
 'api-error-illegal-filename' => 'Джарамагъан файл ат.',
index 0f2bd3f..87015da 100644 (file)
@@ -197,13 +197,13 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ÖMLEIDE_OP', '#ÖMLEIDE', '#LEIDT_ÖM_OP', '#ÖMLEIDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
-       'nogallery'               => array( '0', '__KEIN_JALLERIE__', '__KEINE_GALERIE__', '__KEINEGALERIE__', '__NOGALLERY__' ),
-       'toc'                     => array( '0', '__ENHALLT__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
-       'img_right'               => array( '1', 'rähß', 'räts', 'rechts', 'right' ),
-       'img_left'                => array( '1', 'lengks', 'lenks', 'links', 'left' ),
-       'language'                => array( '0', '#SHPROOCH:', '#SPROCH:', '#SPRACHE:', '#LANGUAGE:' ),
-       'hiddencat'               => array( '1', '__VERSHTOCHE_SAACHJRUPP__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
+       'redirect'                  => array( '0', '#ÖMLEIDE_OP', '#ÖMLEIDE', '#LEIDT_ÖM_OP', '#ÖMLEIDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
+       'nogallery'                 => array( '0', '__KEIN_JALLERIE__', '__KEINE_GALERIE__', '__KEINEGALERIE__', '__NOGALLERY__' ),
+       'toc'                       => array( '0', '__ENHALLT__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
+       'img_right'                 => array( '1', 'rähß', 'räts', 'rechts', 'right' ),
+       'img_left'                  => array( '1', 'lengks', 'lenks', 'links', 'left' ),
+       'language'                  => array( '0', '#SHPROOCH:', '#SPROCH:', '#SPRACHE:', '#LANGUAGE:' ),
+       'hiddencat'                 => array( '1', '__VERSHTOCHE_SAACHJRUPP__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
 );
 
 $imageFiles = array(
@@ -226,17 +226,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Avschnedde met Räächs-Klicke op de Üvverschrefte ändere (bruch Java_Skripp)',
 'tog-showtoc' => 'Zeich en Enhaldsüvversich bei Sigge met mieh wie drei Üvverschrefte dren',
 'tog-rememberpassword' => 'Op Duur enlogge op dämm Kompjuter un för dää Brauser (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})',
-'tog-watchcreations' => 'Dun de Sigge, die ich neu aanläje, för ming Oppassliss vürschlage',
-'tog-watchdefault' => 'Dun de Sigge för ming Oppassliss vürschlage, die ich aanpacken un änder',
-'tog-watchmoves' => 'Dun ming selfs ömjenante Sigge automatisch för ming Oppassliss vürschlage',
-'tog-watchdeletion' => 'Dun Sigge, die ich fottjeschmesse han, för ming Oppassliss vürschlage',
+'tog-watchcreations' => 'Donn Sigge beim neu Aanlääje automattesch för ming Oppaßlėß vörschlonn',
+'tog-watchdefault' => 'Donn Sigge beim Ändere automattesch för ming Oppaßlėß vörschlonn',
+'tog-watchmoves' => 'Donn Sigge beim Ömnänne automattesch för ming Oppaßlėß vörschlonn',
+'tog-watchdeletion' => 'Donn Sigge beim Fottschmiiße automattesch för ming Oppaßlėß vörschlonn',
 'tog-minordefault' => 'Dun all ming Änderunge jedes Mol als klein Mini-Änderunge vürschlage',
 'tog-previewontop' => 'Zeich de Vör-Aansich üvver däm Feld för dä Tex enzejevve aan.',
 'tog-previewonfirst' => 'Zeich de Vör-Aansich tirek för et eetste Mol beim Bearbeide aan',
 'tog-nocache' => 'Dun et Sigge Zweschespeichere en Dingem Brauser avschalte',
-'tog-enotifwatchlistpages' => 'Scheck en E-Mail, wann en Sigg us ming Oppassliss jeändert wood',
+'tog-enotifwatchlistpages' => 'Scheck mer en <i lang="en">e-mail</i>, wann en Sigg us minge Oppaßlėß verändert woode es',
 'tog-enotifusertalkpages' => 'Scheck mer en E-Mail, wann ming Klaaf Sigg jeändert weed',
-'tog-enotifminoredits' => 'Scheck mer och en E-Mail för de klein Mini-Änderunge',
+'tog-enotifminoredits' => 'Scheck mer och en <i lang="en">e-mail</i> för de klein Mini-Änderonge',
 'tog-enotifrevealaddr' => 'Zeich dä Andere ming E-Mail Adress aan, en de Benohrichtijunge per E-Mail',
 'tog-shownumberswatching' => 'Zeich de Aanzahl Metmaacher, die op die Sigg am oppasse sin',
 'tog-oldsig' => 'Esu&nbsp;süht&nbsp;Ding „Ongerschreff“&nbsp;us:',
@@ -252,7 +252,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Enjeloggte Metmaacher ier Änderunge jedesmol <strong>nit</strong> en minger Oppassliss aanzeije',
 'tog-watchlisthideanons' => 'Namelose Metmaacher ier Änderunge jedesmol <strong>nit</strong> en minger Oppassliss aanzeije',
 'tog-watchlisthidepatrolled' => 'Dun de nohjeloorte Änderunge et eez ens <strong>nit</strong> en minger Oppassliss aanzeije',
-'tog-nolangconversion' => 'Sprochevariante nit ömwandele',
 'tog-ccmeonemails' => 'Scheck mer en Kopie, wann ich en <i lang="en">e-mail</i> an ene andere Metmaacher scheck',
 'tog-diffonly' => 'Zeich beim Versione Verjliche nur de Ungerscheide aan (ävver pack nit noch de janze Sigg dodronger)',
 'tog-showhiddencats' => 'Donn de verstoche Saachjroppe aanzeije',
@@ -341,7 +340,7 @@ $messages = array(
 'noindex-category' => 'Sigge, di de Söhkmaschine nit opnämme sulle',
 'broken-file-category' => 'Sigge met kappodde Lengks op Datteije',
 
-'about' => 'Ã\9cvver',
+'about' => 'Ã\96vver',
 'article' => 'Atikkel',
 'newwindow' => '(Mäht e neu Finster op, wann Dinge Brauser dat kann)',
 'cancel' => 'Stopp! Avbreche!',
@@ -396,7 +395,7 @@ $messages = array(
 'print' => 'Drocke',
 'view' => 'Beloore',
 'edit' => 'Ändere',
-'create' => 'Aanläje',
+'create' => 'Aanlääje',
 'editthispage' => 'De Sigg ändere',
 'create-this-page' => 'Neu aanläje',
 'delete' => 'Fottschmieße',
@@ -493,7 +492,7 @@ $1',
 'thisisdeleted' => '$1 - aanluure oder widder zeröckholle?',
 'viewdeleted' => '$1 aanzeije?',
 'restorelink' => '{{PLURAL:$1|eijn fottjeschmesse Änderung|$1 fottjeschmesse Änderunge|keij fottjeschmesse Änderunge}}',
-'feedlinks' => 'Abonnomang-Kannal (<i lang="en">Feed</i>):',
+'feedlinks' => 'Abonnomangs-Kannal (<i lang="en">Feed</i>):',
 'feed-invalid' => 'Esu en Zoot Abonnomang-Kannal (<i lang="en">Feed</i>) jitt et nit.',
 'feed-unavailable' => 'Mer han kein esu en Abonnomangs-Kannäl (<i lang="en">Feeds</i>) aam Loufe.',
 'site-rss-feed' => 'RSS-Abonnomang-Kannal (Feed) för de „$1“',
@@ -568,6 +567,8 @@ un doht em och de URL vun dä Sigg heh sage.',
 'badarticleerror' => 'Dat jeiht met heh dä Sigg nit ze maache.',
 'cannotdelete' => 'De Sigg oder de Datei „$1“ fottzeschmieße es nit müjjelich. Maach sin, dat ene andere Metmaacher flöcker wor, hät et vürher jedon, un jetz es se ald fott.',
 'cannotdelete-title' => 'Mer künne di Sigg „$1“ nit fott schmiiße.',
+'delete-hook-aborted' => 'Et Fottschmiiße wood affjebroche övver ene sujenannte „Hoke“ en de ẞoffwäer.
+Ene Jrond weße mer nit.',
 'badtitle' => 'Verkihrte Üvverschreff',
 'badtitletext' => 'De Üvverschreff es esu nit en Odenung. Et muss jet dren stonn.
 Et künnt sin, dat ein vun de speziell Zeiche dren steiht,
@@ -577,7 +578,7 @@ dat jeiht ävver nit.
 Muss De repareere.',
 'perfcached' => 'Di Daate heh noh kumme usem Zweschespeicher (cache) un künnte nit mieh janz de allerneuste sin.
 {{PLURAL:$1|Bloß ein Antwoot es|Nit mieh wi $1 Antwoote sin|Kein Antwoot es}} doh faßjehallde un ze han.',
-'perfcachedts' => 'De Daate heenoh kumme usem Zweschespeicher (Cache) un woodte aam $2 öm $3 opjenumme. Se künnte nit janz de allerneuste sin.
+'perfcachedts' => 'De Daate heenoh kumme usem Zweschespeicher (<i lang="en">cache</i>) un woodte aam $2 öm $3 opjenumme. Se künnte nit janz de allerneuste sin.
 {{PLURAL:$4|Bloß ein Antwoot es|Nit mieh wi $4 Antwoote sind|Kein Antwoot es}} doh ze han.',
 'querypage-no-updates' => "'''Heh die Sigg weed nit mieh op ene neue Stand jebraat.'''",
 'wrong_wfQuery_params' => 'Verkihrte Parameter för: <strong><code>wfQuery()</code></strong><br />
@@ -619,6 +620,8 @@ $2',
 Dä Wiki_Köbes dovun hät beim Deeschmaache als Jrond aanjejovve: „$3“',
 'invalidtitle-knownnamespace' => '„$3“ es ene onjöltijje Tittel för em Appachtemang „$2“',
 'invalidtitle-unknownnamespace' => '„$2“ es ene onjöltijje Tittel för e Appachtemang met dä verkehte Nommer $1.',
+'exception-nologin' => 'Nit enjelogg',
+'exception-nologin-text' => 'Heh di Sigg udder heh dä Opdraach jeiht blooß, wann De heh em Wiki enjelogg bes.',
 
 # Virus scanner
 'virus-badscanner' => "Fääler en de Enstellunge: Dat Projramm ''$1'' fö noh Kompjuterwiere ze söke, dat kenne mer nit.",
@@ -634,7 +637,7 @@ Künnt sin, dat De de ein oder ander Sigg immer wigger aanjezeich kriss, wie wan
 Dinge Zojang för heh es do.
 Do bes jetz aanjemeldt.
 Denk dran, Do künnts Der [[Special:Preferences|Ding Enstellunge heh för {{GRAMMAR:Akk|{{SITENAME}}}} zeräächmaache]].',
-'yourname' => 'Metmaacher Name:',
+'yourname' => 'Metmaacher_Naame:',
 'yourpassword' => 'Paßwoot:',
 '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}})',
@@ -646,8 +649,8 @@ Denk dran, Do künnts Der [[Special:Preferences|Ding Enstellunge heh för {{GRAM
 'loginprompt' => 'Öm heh enlogge ze künne, muss De de <i lang="en">Cookies</i> en Dingem Brauser enjeschalt han.',
 'userlogin' => 'Enlogge odder Metmaacher wääde',
 'userloginnocreate' => 'Enlogge',
-'logout' => 'Uslogge',
-'userlogout' => 'Uslogge',
+'logout' => 'Ußlogge',
+'userlogout' => 'Ußlogge',
 'notloggedin' => 'Nit enjelogg',
 'nologin' => "Wann De Dich noch nit aanjemeldt häs, dann dun Dich '''$1'''.",
 'nologinlink' => 'neu aanmelde',
@@ -1118,7 +1121,7 @@ Als Jrund för et Sperre es enjedraare: ''$2''",
 'currentrev' => 'Neuste Version',
 'currentrev-asof' => 'De neuste Version fum $2 öm $3 Uhr',
 'revisionasof' => 'De Version vum $2 öm $3 Uhr',
-'revision-info' => 'Dat heh es de övverhollte Version $3, vum $2 aam $4 öm $5 Uhr afjeshpeichert.',
+'revision-info' => 'Dat heh es de övverhollte Version $3, {{GENDER:$2|vum|vum|vum Metmaacher|vun dä|vum}} $2 aam $4 öm $5 Uhr afjeshpeichert.',
 'previousrevision' => '← De Version dovör zeije',
 'nextrevision' => 'De Version donoh zeije →',
 'currentrevisionlink' => 'De neuste Version',
@@ -1348,7 +1351,7 @@ Appachtemangs-Name.',
 'powersearch-legend' => 'Extra Söhke',
 'powersearch-ns' => 'Söök en de Apachtemangs:',
 'powersearch-redir' => 'Ömleidunge aanzeije',
-'powersearch-field' => 'Söök noh:',
+'powersearch-field' => 'Söhk noh',
 'powersearch-togglelabel' => '&nbsp;',
 'powersearch-toggleall' => 'Övverall Höhksche draan maache',
 'powersearch-togglenone' => 'All Höhksche fott nämme',
@@ -1455,7 +1458,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'prefs-registration' => 'Aanjemeldt zick',
 'prefs-registration-date-time' => 'dem $2 öm $3 Uhr',
 'yourrealname' => 'Dinge richtije Name *',
-'yourlanguage' => 'Die Sproch, die et Wiki kalle soll:',
+'yourlanguage' => 'Di Schprooch, di et Wiki kalle soll:',
 'yourvariant' => 'Der Dijaläk, de Schriefwies, de Zoot Shprooch för der Enhald.',
 'prefs-help-variant' => 'Der Dijaläk udder de Schriefwies udder de Zoot Shprooch, di De för der Enhald.vun Sigge am leevsde häs.',
 'yournick' => 'Ding&nbsp;„Ongerschreff“&nbsp;*',
@@ -1510,8 +1513,8 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'userrights-nodatabase' => 'De Datebank „<strong>$1</strong>“ is nit doh, oder se litt op enem andere ẞööver.',
 'userrights-nologin' => 'Do moss als ene Wiki-Köbes [[Special:UserLogin|enjelog sin]], för dat De Metmaacher ier Rääschte ändere kanns.',
 'userrights-notallowed' => 'Met Dingem Zohjang heh häs De nit dat Rääsch, Rääschde aan Metmaacher ze verdeile udder se fott ze nämme.',
-'userrights-changeable-col' => '{{PLURAL:$1:Di Jropp|Jruppe|kein Jropp doh}}, die De ändere kanns',
-'userrights-unchangeable-col' => '{{PLURAL:$1:Di Jropp|Jruppe|kein Jropp doh}}, die De nit ändere kanns',
+'userrights-changeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De ändere kanns',
+'userrights-unchangeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De nit ändere kanns',
 'userrights-irreversible-marker' => '$1 *',
 
 # Groups
@@ -1526,10 +1529,10 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 
 'group-user-member' => '{{GENDER:$1|Metmaacher|Metmaacherin}}',
 'group-autoconfirmed-member' => 'automattesch beshtääteshte {{GENDER:$1|Metmaacher|Metmaacherėn}}',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Wiki-Köbes',
+'group-bot-member' => '{{GENDER:$1|Bot}}',
+'group-sysop-member' => '{{GENDER:$1|Wiki-Köbes}}',
 'group-bureaucrat-member' => '{{GENDER:$1|Bürrokrad|Bürrokraatėn}}',
-'group-suppress-member' => 'Kontrolletti',
+'group-suppress-member' => '{{GENDER:$1|Kontrolletti}}',
 
 'grouppage-user' => '{{ns:project}}:Metmaacher',
 'grouppage-autoconfirmed' => '{{ns:project}}:Bestätichte Metmaacher',
@@ -1654,7 +1657,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'recentchanges-label-bot' => 'Di Änderung es fun enem Bot jemaat woode',
 'recentchanges-label-unpatrolled' => 'Heh di Änderung es noch nit nohjeloort',
 'rcnote' => '{{PLURAL:$1|Heh es de letzte Änderung us|Heh sin de letzte <strong>$1</strong> Änderunge us|Et jit <strong>kei</strong> Änderunge en}} {{PLURAL:$2|däm letzte Daach|de letzte <strong>$2</strong> Dääsch|dä Zick}} vum <strong>$4</strong> aff <strong>$5</strong> Uhr beß jetz.',
-'rcnotefrom' => 'Hee sin bes <strong>$1</strong> fun de Änderunge zick däm <strong>$3</strong> öm <strong>$4</strong> Uhr opjeliss.',
+'rcnotefrom' => 'Hee {{PLURAL:$1|es ein|sin bes op <strong>$1</strong>|es keine}} fun de Änderunge zick dem <strong>$3</strong> öm <strong>$4</strong> Uhr opjelėß.',
 'rclistfrom' => 'Zeich de Änderunge vum $1 aan',
 'rcshowhideminor' => '$1 klein Mini-Änderunge',
 'rcshowhidebots' => '$1 de Bots ehr Änderunge',
@@ -1724,7 +1727,7 @@ Usführlich met alle Müjjelichkeite fings de dat bei de Hölp.",
 (En de [[Special:NewFiles|Jalleri met neu Dateie]] kriß De ene Övverbleck med Belldsche)',
 'filename' => 'Dä Name vun dä Datei',
 'filedesc' => 'Beschrievungstex un Zosammefassung',
-'fileuploadsummary' => 'Beschrievungstex un Zosammefassung:',
+'fileuploadsummary' => 'Beschrievungstex un Zosammefaßong:',
 'filereuploadsummary' => 'Änderunge aan Dateie:',
 'filestatus' => 'Urhevver Räächsstatus:',
 'filesource' => 'Quell:',
@@ -1763,25 +1766,25 @@ hallde deiht, wat nit erlaub, un müjjelelscherwies ene jefährlesche Dattei-Typ
 'largefileserver' => 'De Datei es ze jroß. Jrößer wie däm ẞööver sing Enstellung erlaub.',
 'emptyfile' => 'Wat De hee jetz huhjelade häs, hät kein Daate dren jehatt. Künnt sin, dat De Dich verdon häs, un dä Name wo verkihrt jeschrevve. Luur ens ov De wirklich <strong>die</strong> Datei hee huhlade wells.',
 'windows-nonascii-filename' => 'Heh dat Wiki löht kein Datteiname met Sönderzeische zoh.',
-'fileexists' => "Et jitt ald en Datei met däm Name.
+'fileexists' => 'Et jitt ald en Datei met däm Name.
 Wann De op „Datei avspeichere“ klicks, weed se ersetz.
-Bes esu jod  un luur Der '''<tt>[[:$1]]</tt>''' aan, wann De nit 100% secher bes.
-[[$1|thumb]]",
-'filepageexists' => "En Sigg övver di Datei met däm Tittel '''<tt>[[:$1]]</tt>''' es ald doh, ävver en Datei met däm Name ham_mer nit. Dinge Tex kütt nit automattesch op di Sigg övver di Dattei. Di Sigg moß De wann nüüdesch noch ens extra ändere.
-[[$1|thumb]]",
-'fileexists-extension' => "Mer han ald en Dattei, di bahl jenou esu heijß: [[$2|thumb]]
-* Huh am laade sim_mer: '''<tt>[[:$1]]</tt>'''
-* Ald om ßörve eß:</td><td>'''<tt>[[:$2]]</tt>'''
-Bes esu joot, un söök Der ene ander Name fö di Datei us.",
-'fileexists-thumbnail-yes' => "Dat süühd uß, wi wann dat hee en Minni-Beldsche em Breefmarrke-Fommaat (''<span lang=\"en\">thumbnail</span>'') wöhr. [[\$1|thumb]]
-Don ens di Dattei '''<tt>[[:\$1]]</tt>''' prööfe.
-Wann dat de Orjinaaljrüß es, do moß keij för dat Beld keij extra Vör-Aansich huhjelade wäde.",
-'file-thumbnail-no' => "Dä Name fö di Datei fängk met '''<tt>\$1</tt>''' aan.
+Bes esu jod  un luur Der <strong>[[:$1]]</strong> aan, wann De nit 100% secher bes.
+[[$1|thumb]]',
+'filepageexists' => 'En Sigg övver di Datei met däm Tittel <strong>[[:$1]]</strong> es ald doh, ävver en Datei met däm Name ham_mer nit. Dinge Tex kütt nit automattesch op di Sigg övver di Dattei. Di Sigg moß De wann nüüdesch noch ens extra ändere.
+[[$1|thumb]]',
+'fileexists-extension' => 'Mer han ald en Dattei, di bahl jenou esu heijß: [[$2|thumb]]
+* Huh am laade sim_mer: <strong>[[:$1]]</strong>
+* Ald om ßörve eß:</td><td><strong>[[:$2]]</strong>
+Bes esu joot, un söök Der ene ander Name fö di Datei us.',
+'fileexists-thumbnail-yes' => 'Dat süühd uß, wi wann dat hee en Minni-Beldsche em Breefmarrke-Fommaat (\'\'<span lang="en">thumbnail</span>\'\') wöhr. [[$1|thumb]]
+Don ens di Dattei <strong>[[:$1]]</strong> prööfe.
+Wann dat de Orjinaaljrüß es, do moß keij för dat Beld keij extra Vör-Aansich huhjelade wäde.',
+'file-thumbnail-no' => 'Dä Name fö di Datei fängk met <strong>$1</strong> aan.
 Dat süühd uß, wi wann dat en Minni-Beldsche em Breefmarrke-Fommaat
-(''<span lang=\"en\">thumbnail</span>'') wöhr. Don ens di Dattei
-'''<tt>\$1</tt>''' prööfe, of de nit e besser opjelööß Beld
+(\'\'<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äß, un don dat met singe Orjinaaljrüß huhlade, wann müjjelesch.
-Söns donn besser ene andere Dateiname ußsöke.",
+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
 unger enem andere Name huh. [[File:$1|thumb|center|$1]]',
@@ -1898,6 +1901,7 @@ Als Jrond es aanjejovve: „$2“',
 'lockmanager-fail-acquirelock' => 'Mer kunnte kein Schpärr för „$1“ krijje.',
 'lockmanager-fail-openlock' => 'Mer kunnte di Schpärdatei för „$1“ nit opmaache.',
 'lockmanager-fail-releaselock' => 'Mer kunnte di Schpärr för „$1“ nit ophävve.',
+'lockmanager-fail-db-bucket' => 'Mer kunnet nit met jenooch  <i lang="en">lock databases in bucket$1</i> en Verbendong opnämme.',
 'lockmanager-fail-db-release' => 'Mer kunnte di Schpärre för de Daatebangk „$1“ nit ophävve.',
 'lockmanager-fail-svr-release' => 'Mer kunnte di Schpärre för dä ẞööver „$1“ nit ophävve.',
 
@@ -1992,7 +1996,7 @@ Wann ene Metmaacher ußjesöhk es, kritt mer bloß die Dateie, di dä Metmaacher
 'filehist-user' => 'Metmaacher',
 'filehist-dimensions' => 'Pixelle Breed×Hühte (Dateiömfang)',
 'filehist-filesize' => 'Dateiömfang',
-'filehist-comment' => 'Aanmerkung',
+'filehist-comment' => 'Aanmärkong',
 'filehist-missing' => 'Di Datei es nit doh',
 'imagelinks' => 'Jebruch',
 'linkstoimage' => 'Heh {{PLURAL:$1|kütt di Sigg|kumme di $1 Sigge|sin keij Sigge}}, die op heh di Dattei linke {{PLURAL:$1|deiht|dun|dun}}:',
@@ -2189,7 +2193,7 @@ Di sin dann <del>dorschjeschtresche</del>.',
 'usereditcount' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|Nix jedonn}}',
 'usercreated' => '{{GENDER:$3|}}Aanjemelldt aam $1 öm $2 Uhr',
 'newpages' => 'Neu Sigge',
-'newpages-username' => 'Metmaacher Name:',
+'newpages-username' => 'Metmaacher_Naame:',
 'ancientpages' => 'Atikele zoteet vun Ahl noh Neu',
 'move' => 'Ömnenne',
 'movethispage' => 'De Sigg ömnenne',
@@ -2263,7 +2267,7 @@ eins vun all däm op eimol.',
 'cachedspecial-refresh-now' => 'De neuste Version.',
 
 # Special:Categories
-'categories' => 'Saachjruppe',
+'categories' => 'Saachjroppe',
 'categoriespagetext' => 'Hee {{PLURAL:$1|es nur en Saachjrupp|sin nur Saachjruppe|es kei Saachjrupp}} jeliss, woh jät dren {{PLURAL:$1|es|es|wöhr}}. Mer han_er eije Leßte för de
 [[Special:UnusedCategories|Saachjruppe met nix dren]], un de
 [[Special:WantedCategories|jewönschte un nit aanjelaate Saachjruppe]].',
@@ -2283,9 +2287,9 @@ eins vun all däm op eimol.',
 'linksearch-ok' => 'Söhke',
 'linksearch-text' => 'Di {{int:nstab-special}} heh mäd_et müjjelesch noh Sigge ze söke, woh beshtemmpte Links op Websigge dren enthallde sin.
 
-Beim Söke künnd_Er Schtäänsche aanjevve för e Schtöcksche fun ennem Name, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit,  zem Beishpöll esu: <tt>http://*.example.com</tt> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <tt>http://*.org</tt
+Beim Söke künnd_Er Schtäänsche aanjevve för e Schtöcksche fun ennem Name, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit,  zem Beishpöll esu: <code>http://*.example.com</code> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <code>http://*.org</code
 
-De Brauserprotokolle, di beim Söke aanjejovve wäde künne, sen: <tt>$1</tt>es',
+De Brauserprotokolle, di beim Söke aanjejovve wäde künne, sen: <code>$1</code>es',
 'linksearch-line' => '„$2“ hät ene Link op $1',
 'linksearch-error' => 'Shternshe kam_mer nor aam Aanfang fum Domain-Name bruche.',
 
@@ -2334,7 +2338,7 @@ Mieh övver de einzel Rääschte fenkt Er op de [[{{MediaWiki:Listgrouprights-he
 Adress en Dinge [[Special:Preferences|ming Enstellunge]] stonn han, öm en E-Mail aan andere Metmaacher ze
 schecke.',
 'emailuser' => 'E-mail aan dä Metmaacher',
-'emailpage' => 'E-mail aan ene Metmaacher',
+'emailpage' => 'Verscheck <i lang="en">e-mail</i> aan ene Metmaacher',
 'emailpagetext' => 'Wann heh dä Metmaacher en Adräß för sing <i lang="en">e-mail</i> aanjejovve hätt en singe Enstellunge,
 un die deit et och, dann kanns De met däm Fomular hee unge en einzel <i lang="en">e-mail</i> aan dä Metmaacher schecke.
 
@@ -2352,7 +2356,7 @@ Alles klor?',
 'nowikiemailtext' => 'Hee dä Metmaacher well kein <i lang="en">e-mail</i> vun ander Metmaachere jescheck krijje.',
 'emailnotarget' => 'Et jitt keine Metmaacher met däm Naame, dämm mer en <i lang="en">e-mail</i> schecke künnt.',
 'emailtarget' => 'Jiff dä Metmaacher aan, dä di <i lang="en">e-mail</i> kritt',
-'emailusername' => 'Metmaacher Name:',
+'emailusername' => 'Metmaacher_Naame:',
 'emailusernamesubmit' => 'Loß Jonn!',
 'email-legend' => 'Scheck en<i lang="en"> e-mail</i> aan ene andere Metmaacher fum Wiki',
 'emailfrom' => 'Vun:',
@@ -2362,7 +2366,7 @@ Alles klor?',
 'emailsend' => 'Avschecke',
 'emailccme' => 'Scheck mer en Kopie vun dä E-Mail.',
 'emailccsubject' => 'En Kopie vun Dinger E-Mail aan $1: $2',
-'emailsent' => 'E-Mail es ungerwähs',
+'emailsent' => 'De <i lang="en">e-mail</i> es ongerwähs',
 'emailsenttext' => 'Ding E-Mail es jetz lossjescheck woode.',
 'emailuserfooter' => 'Hee di e-mail hät dä „$1“ an dä „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailuser}}“ jebruch.',
 
@@ -2556,7 +2560,7 @@ Di Sigg '''„$1“:''' es jetz jrad:",
 # Restrictions (nouns)
 'restriction-edit' => 'et Ändere',
 'restriction-move' => 'et Ömnenne',
-'restriction-create' => 'Aanläje',
+'restriction-create' => 'Aanlääje',
 'restriction-upload' => 'Huhlaade',
 
 # Restriction levels
@@ -2648,7 +2652,7 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Heh di <i lang="en">IP</i>-Address es em Momang jesperrt.
 De neuste Sperr ier Enndraach em Logbooch es:',
 'sp-contributions-search' => 'Söök noh Metmaacher ier Beidräg',
-'sp-contributions-username' => 'Metmaachername odder <i lang="en">IP</i>-Address:',
+'sp-contributions-username' => 'Metmaachername odder IP-Address:',
 'sp-contributions-toponly' => 'Bloß neuste Versione zeije',
 'sp-contributions-submit' => 'Söhke',
 
@@ -2756,7 +2760,7 @@ Wells De dat?',
 'blocklist-nousertalk' => 'de eije Klaafsigg Änndere verbodde',
 'ipblocklist-empty' => 'Do es nix en dä Sperrleß.',
 'ipblocklist-no-results' => 'Dä Metmaacher udder di IP-Adrress es janit jesperrt.',
-'blocklink' => 'Sperre',
+'blocklink' => 'schpärre',
 'unblocklink' => 'widder freijevve',
 'change-blocklink' => 'Sperr ändere',
 'contribslink' => 'Beidräch',
@@ -2962,7 +2966,7 @@ Wenn De jenerell aan [//www.mediawiki.org/wiki/Localisation MediaWiki singe Öve
 'allmessages-filter-all' => 'ejaal',
 'allmessages-filter-modified' => 'heh em Wiki jeändert',
 'allmessages-prefix' => 'Name fängk aan met:',
-'allmessages-language' => 'Shprooch:',
+'allmessages-language' => 'Schprooch:',
 'allmessages-filter-submit' => 'Lohß Jonn!',
 
 # Thumbnails
@@ -3053,7 +3057,7 @@ Bes esu joot, un versök et noch ens.',
 'tooltip-pt-mycontris' => 'en Liss met Dinge eije Beidräch',
 'tooltip-pt-login' => 'Do moß Desch nit Enlogge, kannz_E ävver jähn maache!',
 'tooltip-pt-anonlogin' => 'Wöhr nett wann De enlogge dääts, moß ävver nit.',
-'tooltip-pt-logout' => 'Uslogge',
+'tooltip-pt-logout' => 'Ußlogge',
 'tooltip-ca-talk' => 'Dun die Sigg met däm Klaaf övver heh de Sigg aanzeije',
 'tooltip-ca-edit' => 'De kanns die Sigg heh ändere — für em Avspeichere, donn eetß ens enen Bleck op de Vör-Aansich',
 'tooltip-ca-addsection' => 'Donn heh enne neue Afschnett opmaache.',
@@ -3171,19 +3175,15 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'spambot_username' => 'SPAM fottschmieße',
 'spam_reverting' => 'De letzte Version ohne de Links op „$1“ widder zerröckjehollt.',
 'spam_blanking' => 'All die Versione hatte Links op „$1“, die sin jetz erus jemaht.',
+'spam_deleting' => 'All di Versione met Lenks op „$1“ wääde fott jeschmeße',
 
 # Info page
 'pageinfo-title' => 'Övver di Sigg: „$1“',
 'pageinfo-header-edits' => 'De Änderonge',
-'pageinfo-header-watchlist' => 'De Oppassleß',
-'pageinfo-header-views' => 'De Affroofe',
-'pageinfo-subjectpage' => 'För de Sigg selver',
-'pageinfo-talkpage' => 'För de Klaafsigg',
+'pageinfo-views' => 'De Aanzahl Affroofe',
 'pageinfo-watchers' => 'De Aanzahl Oppaßer',
 'pageinfo-edits' => 'De Aanzahl Änderonge',
 'pageinfo-authors' => 'De Aanzahl ongerscheidlije Schriever',
-'pageinfo-views' => 'De Aanzahl Affroofe',
-'pageinfo-viewsperedit' => 'De Aanzahl Affroofe pro Änderong',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
@@ -3436,7 +3436,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 'exif-objectcycle' => 'De Daachszick, för wann dat Denge zom Verdeile jedaach es',
 'exif-contact' => 'Kuntak',
 'exif-writer' => 'Schriiver',
-'exif-languagecode' => 'Shprooch',
+'exif-languagecode' => 'Schprooch',
 'exif-iimversion' => 'Dem <i lang="en">IIM</i> sing Version',
 'exif-iimcategory' => 'Saachjrupp udder Zoot',
 'exif-iimsupplementalcategory' => 'Extra Saachjroppe udder Zoote',
@@ -3490,6 +3490,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 'exif-copyrighted-true' => 'Häd_en Urhävverrääsch',
 'exif-copyrighted-false' => 'Es en de Allmende (jemeinfrei, <i lang="en">public domain</i>)',
 
+'exif-photometricinterpretation-2' => 'RJB',
 'exif-photometricinterpretation-6' => '<i lang="en">YCbCr</i>',
 
 'exif-unknowndate' => 'Dattum onbikannt',
@@ -3513,6 +3514,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 'exif-colorspace-65535' => 'De Färve sin nit kallibreert',
 
 'exif-componentsconfiguration-0' => 'Jidd_et nit',
+'exif-componentsconfiguration-5' => 'J',
 
 'exif-exposureprogram-0' => 'Nit faßjelaat',
 'exif-exposureprogram-1' => 'Vun Hand',
@@ -3724,7 +3726,7 @@ Dä E-Mail-ẞööver hät jesaat: ''$1''",
 'confirmemail_needlogin' => 'Do muss Dich $1, för de E-Mail Adress ze bestätije.',
 'confirmemail_success' => 'Ding E-Mail Adress es jetz bestätich.
 Jetz künns De och noch enlogge. Vill Spass!',
-'confirmemail_loggedin' => 'Ding E-Mail Adress es jetz bestätich!',
+'confirmemail_loggedin' => 'Ding Addräß fö de <i lang="en">e-mail</i> es jäz beschtäätesch!',
 'confirmemail_error' => 'Beim E-Mail Adress Bestätije es jet donevve jejange, de Bestätijung kunnt nit avjespeichert wääde.',
 'confirmemail_subject' => 'Dun Ding e-mail Adress för {{GRAMMAR:Akkusativ|{{SITENAME}}}} bestäteje.',
 'confirmemail_body' => 'Künnt jod sin, Do wors et selver, vun de IP_Adress $1 hät sich
@@ -3851,6 +3853,17 @@ Wells Do jetz met en neu Version die Sigg widder neu aanläje?',
 'size-megabytes' => '$1 MB',
 'size-gigabytes' => '$1 GB',
 
+# Bitrate units
+'bitrate-bits' => '$1&nbps;bps',
+'bitrate-kilobits' => '$1&nbps;Kbps',
+'bitrate-megabits' => '$1&nbps;Mbps',
+'bitrate-gigabits' => '$1&nbps;Gbps',
+'bitrate-terabits' => '$1&nbps;Tbps',
+'bitrate-petabits' => '$1&nbps;Pbps',
+'bitrate-exabits' => '$1&nbps;Ebps',
+'bitrate-zetabits' => '$1&nbps;Zbps',
+'bitrate-yottabits' => '$1&nbps;Ybps',
+
 # Live preview
 'livepreview-loading' => 'Ben am Lade …',
 'livepreview-ready' => 'Fädesch jelaade.',
@@ -3911,7 +3924,7 @@ De könnts Ding Oppassliss ävver och [[Special:EditWatchlist|övver e Fomulaa m
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Klaafe]])',
-'timezone-utc' => 'UTC',
+'timezone-utc' => '<i lang="en">UTC</i>',
 
 # Core parser functions
 'unknown_extension_tag' => '„<code>$1</code>“ es en zosäzlejje Kennzeichnung, die kenne mer nit.',
@@ -3954,7 +3967,7 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
 # Special:FilePath
 'filepath' => 'Medije-Dateie med ier URL zëije',
 'filepath-page' => 'Dattëij_Name:',
-'filepath-submit' => 'Lohß jonn!',
+'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.",
 
@@ -4007,7 +4020,7 @@ Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
 'tags' => 'De jöltijje Makeerunge för Änderunge',
 'tag-filter' => '[[Special:Tags|Makeerunge]] ußsöke:',
 'tag-filter-submit' => 'Beschränke!',
-'tags-title' => 'Makeerunge',
+'tags-title' => 'Makeeronge',
 'tags-intro' => 'Heh sin alle de Makeerunge opjeliß, die et Wiki för Änderunge verjevve kann, un wat se bedügge.',
 'tags-tag' => 'Dä Makeerung iere Name',
 'tags-display-header' => 'Kennzeiche en de Leßte met Änderunge',
@@ -4114,9 +4127,12 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'api-error-empty-file' => 'En dä huhjelaade Dattei wohr jaa_nix dren.',
 'api-error-emptypage' => 'Neu läddijje Sigge aanzelääje es verbodde.',
 'api-error-fetchfileerror' => 'Fähler: Beim eronger Laade hät jät nit jeflupp.',
+'api-error-fileexists-forbidden' => 'En Dattei mem Name „$1“ es ald doh un mer künne se nit övverschriive.',
+'api-error-fileexists-shared-forbidden' => 'En Dattei mem Name „$1“ es ald en ene jemeinsamme Sammlong, un mer künne se nit övverschriive.',
 'api-error-file-too-large' => 'De huhjelaade Dattei wohr ze jruß.',
 'api-error-filename-tooshort' => 'Der Name för di Dattei es ze koot.',
 'api-error-filetype-banned' => 'Di Zoot Dattei es nit zohjelohße.',
+'api-error-filetype-banned-type' => '{{PLURAL:$4|Dat Dateifommaat|De Dateifommaate|}} $1 wulle mer nit huhjelaade krijje. Älaup {{PLURAL:$3|es|sin_er|}}: $2',
 'api-error-filetype-missing' => 'Dä Dattei iehre Naame hät kein Endong.',
 'api-error-hookaborted' => 'Ding Änderung wood vun enem Zohsazprojramm nit zohjelohße.',
 'api-error-http' => 'Fähler: Mer krijje kein Verbendung mem ẞööver.',
index 78e9481..a17741f 100644 (file)
@@ -13,6 +13,8 @@
  * @author Marmzok
  */
 
+$rtl = true;
+
 $fallback = 'ckb';
 
 $digitTransformTable = array(
index 56760b6..311aad5 100644 (file)
 $namespaceNames = array(
        NS_MEDIA            => 'Medya',
        NS_SPECIAL          => 'Taybet',
-       NS_TALK             => 'Nîqaş',
+       NS_TALK             => 'Gotûbêj',
        NS_USER             => 'Bikarhêner',
-       NS_USER_TALK        => 'Bikarhêner_nîqaş',
-       NS_PROJECT_TALK     => '$1_nîqaş',
+       NS_USER_TALK        => 'Gotûbêja_bikarhêner',
+       NS_PROJECT_TALK     => '$1_gotûbêj',
        NS_FILE             => 'Wêne',
-       NS_FILE_TALK        => 'Wêne_nîqaş',
+       NS_FILE_TALK        => 'Gotûbêja_wêneyî',
        NS_MEDIAWIKI        => 'MediaWiki',
-       NS_MEDIAWIKI_TALK   => 'MediaWiki_nîqaş',
+       NS_MEDIAWIKI_TALK   => 'Gotûbêja_MediaWiki',
        NS_TEMPLATE         => 'Şablon',
-       NS_TEMPLATE_TALK    => 'Şablon_nîqaş',
+       NS_TEMPLATE_TALK    => 'Gotûbêja_şablonê',
        NS_HELP             => 'Alîkarî',
-       NS_HELP_TALK        => 'Alîkarî_nîqaş',
+       NS_HELP_TALK        => 'Gotûbêja_alîkariyê',
        NS_CATEGORY         => 'Kategorî',
-       NS_CATEGORY_TALK    => 'Kategorî_nîqaş',
+       NS_CATEGORY_TALK    => 'Gotûbêja_kategoriyê',
 );
 
+$namespaceAliases = array(
+       'Nîqaş'            => NS_TALK,
+       'Bikarhêner_nîqaş' => NS_USER_TALK,
+       '$1_nîqaş'         => NS_PROJECT_TALK,
+       'Wêne_nîqaş'       => NS_FILE_TALK,
+       'MediaWiki_nîqaş'  => NS_MEDIAWIKI_TALK,
+       'Şablon_nîqaş'     => NS_TEMPLATE_TALK,
+       'Alîkarî_nîqaş'    => NS_HELP_TALK,
+       'Kategorî_nîqaş'   => NS_CATEGORY_TALK,
+);
 
 $specialPageAliases = array(
        'Categories'                => array( 'Dara_kategoriyan' ),
@@ -49,7 +59,8 @@ $specialPageAliases = array(
        'Randompage'                => array( 'Rûpela_tesadufî' ),
        'Randomredirect'            => array( 'Redirecta_tasadufî' ),
        'Recentchanges'             => array( 'Guherandinên_dawî' ),
-       'Search'                    => array( 'Lê_bigere' ),
+       'Search'                    => array( 'Lêgerîn' ),
+       'Shortpages'                => array( 'Rûpelên_kurt' ),
        'Statistics'                => array( 'Statîstîk' ),
        'Uncategorizedcategories'   => array( 'Kategoriyên_bê_kategorî' ),
        'Uncategorizedpages'        => array( 'Rûpelên_bê_kategorî' ),
@@ -59,33 +70,33 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#BERALÎKIRIN', '#REDIRECT' ),
-       'notoc'                   => array( '0', '_NAVEROKTUNE_', '__NOTOC__' ),
-       'nogallery'               => array( '0', '_GALERÎTUNE_', '__NOGALLERY__' ),
-       'toc'                     => array( '0', '_NAVEROK_', '__TOC__' ),
-       'noheader'                => array( '0', '_SERÎTUNE_', '__NOHEADER__' ),
-       'currentmonth1'           => array( '1', 'MEHANIHA1', 'CURRENTMONTH1' ),
-       'currentday'              => array( '1', 'ROJA_NIHA', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ROJA_NIHA2', 'CURRENTDAY2' ),
-       'currenttime'             => array( '1', 'DEMA_NIHA', 'CURRENTTIME' ),
-       'numberofpages'           => array( '1', 'HEJMARA_RÛPELAN', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'HEJMARA_GOTARAN', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'HEJMARA_DOSYEYAN', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'HEJMARA_BIKARHÊNERAN', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'HEJMARA_BIKARHÊNERÊN_ÇALAK', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'HEJMARA_GUHERTINAN', 'NUMBEROFEDITS' ),
-       'subpagename'             => array( '1', 'BINRÛPEL', 'SUBPAGENAME' ),
-       'img_right'               => array( '1', 'rast', 'right' ),
-       'img_left'                => array( '1', 'çep', 'left' ),
-       'img_link'                => array( '1', 'girêdan=$', 'link=$1' ),
-       'sitename'                => array( '1', 'NAVÊ_PROJEYÊ', 'SITENAME' ),
-       'grammar'                 => array( '0', 'RÊZIMAN.', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ZAYEND.', 'GENDER:' ),
-       'plural'                  => array( '0', 'PIRRJIMAR:', 'PLURAL:' ),
-       'currentversion'          => array( '1', 'VERSIYONA_NIHA', 'CURRENTVERSION' ),
-       'language'                => array( '0', '#ZIMAN', '#LANGUAGE:' ),
-       'numberofadmins'          => array( '1', 'HEJMARA_RÊVEBERAN', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'taybet', 'special' ),
+       'redirect'                  => array( '0', '#BERALÎKIRIN', '#REDIRECT' ),
+       'notoc'                     => array( '0', '_NAVEROKTUNE_', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '_GALERÎTUNE_', '__NOGALLERY__' ),
+       'toc'                       => array( '0', '_NAVEROK_', '__TOC__' ),
+       'noheader'                  => array( '0', '_SERÎTUNE_', '__NOHEADER__' ),
+       'currentmonth1'             => array( '1', 'MEHANIHA1', 'CURRENTMONTH1' ),
+       'currentday'                => array( '1', 'ROJA_NIHA', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ROJA_NIHA2', 'CURRENTDAY2' ),
+       'currenttime'               => array( '1', 'DEMA_NIHA', 'CURRENTTIME' ),
+       'numberofpages'             => array( '1', 'HEJMARA_RÛPELAN', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'HEJMARA_GOTARAN', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'HEJMARA_DOSYEYAN', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'HEJMARA_BIKARHÊNERAN', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'HEJMARA_BIKARHÊNERÊN_ÇALAK', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'HEJMARA_GUHERTINAN', 'NUMBEROFEDITS' ),
+       'subpagename'               => array( '1', 'BINRÛPEL', 'SUBPAGENAME' ),
+       'img_right'                 => array( '1', 'rast', 'right' ),
+       'img_left'                  => array( '1', 'çep', 'left' ),
+       'img_link'                  => array( '1', 'girêdan=$', 'link=$1' ),
+       'sitename'                  => array( '1', 'NAVÊ_PROJEYÊ', 'SITENAME' ),
+       'grammar'                   => array( '0', 'RÊZIMAN.', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ZAYEND.', 'GENDER:' ),
+       'plural'                    => array( '0', 'PIRRJIMAR:', 'PLURAL:' ),
+       'currentversion'            => array( '1', 'VERSIYONA_NIHA', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#ZIMAN', '#LANGUAGE:' ),
+       'numberofadmins'            => array( '1', 'HEJMARA_RÊVEBERAN', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'taybet', 'special' ),
 );
 
 $messages = array(
@@ -117,7 +128,7 @@ $messages = array(
 'tog-enotifminoredits' => 'Ji bo guhertinên biçûk jî E-nameyekê ji min re bişîne',
 'tog-enotifrevealaddr' => 'Navnîşana e-nameya min di agahdariyên e-nameyan de nîşan bide',
 'tog-shownumberswatching' => 'Nîşan bide, çiqas bikarhêner dişopînin',
-'tog-oldsig' => 'Pêşdîtina îmzeya heyî',
+'tog-oldsig' => 'Pêşdîtina îmzeya heye:',
 'tog-fancysig' => 'Di îmzeyê de girêdana otomatîk a bikarhêner betal bike',
 'tog-externaleditor' => 'Edîtorekî derve bike "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
 'tog-externaldiff' => 'Birnemijekî derve biguherîne "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
@@ -129,7 +140,6 @@ $messages = array(
 'tog-watchlisthideminor' => 'Guhertinên biçûk ji lîsteya şopandinê veşêre',
 'tog-watchlisthideliu' => 'Guherandinên bikarhênerên qeydkirî ji lîsteya şopandinê veşêre',
 'tog-watchlisthideanons' => 'Guherandinên bikarhênerên neqeydkirî ji lîsteya şopandinê veşêre',
-'tog-nolangconversion' => 'Veguhêztina guhertoyên ziman bisekinîne',
 'tog-ccmeonemails' => 'Kopiyên e-nameyên min ji bikarhênerên din re şandî, ji min re bişîne.',
 'tog-diffonly' => 'Li cem guhertinan, naveroka rûpelê nîşan nede',
 'tog-showhiddencats' => 'Kategoriyên veşartî bibîne',
@@ -173,7 +183,7 @@ $messages = array(
 'february-gen' => 'Reşemî',
 'march-gen' => 'Adar',
 'april-gen' => 'Avrêl',
-'may-gen' => 'Gulan',
+'may-gen' => 'gulan',
 'june-gen' => 'pûşper',
 'july-gen' => 'Tîrmeh',
 'august-gen' => 'Gelawêj',
@@ -185,7 +195,7 @@ $messages = array(
 'feb' => 'reş',
 'mar' => 'adr',
 'apr' => 'avr',
-'may' => 'gul',
+'may' => 'gulan',
 'jun' => 'pûş',
 'jul' => 'tîr',
 'aug' => 'teb',
@@ -427,13 +437,13 @@ Pirs: $2',
 'protectedpagetext' => 'Ev rûpel ji bo nenivîsandinê hatiye parastin.',
 'viewsourcetext' => 'Tu dikarî li çavkaniya vê rûpelê binêrî û wê kopî bikî:',
 'protectedinterface' => "Di vê rûpelê da nivîsandin ji bo interface'î zimanan yê vê software'ê ye. Ew tê parstin ji bo vandalîzm li vê derê çênebe.",
-'editinginterface' => "'''Hişyarî:''' Tu rûpeleke ku di Wîkîpediya de ji bo sîstemê girîng e diguherînî. Guherandinên di vê rûpelê de wê ji aliyê hemû bikarhêneran ve werin dîtin. Ji bo wergerê ji kerema xwe di [//translatewiki.net/wiki/Main_Page?setlang=ku translatewiki.net] de bixebite, projeya MediaWiki.",
+'editinginterface' => "'''Hişyarî:''' Tu rûpeleke ku di Wîkîpediya de ji bo sîstemê girîng e diguherînî. Guherandinên di vê rûpelê de wê ji aliyê hemû bikarhêneran ve werin dîtin. Ji bo wergerê ji kerema xwe di [//translatewiki.net/wiki/Main_Page?setlang=ku-latn translatewiki.net] de bixebite, projeya MediaWiki.",
 'sqlhidden' => '(Jêpirskirina SQL hatiye veşartin)',
 'cascadeprotected' => 'Ev rûpel hatiye parastin ji ber guherandinê, ji ber ku ev rûpela di {{PLURAL:$1|vê rûpelê|van rûpelan da}} tê bikaranîn:
 $2',
 'namespaceprotected' => "Destûra te ji bo guhertina vê rûpelê '''$1''' di valahiya nav de nîne.",
 'ns-specialprotected' => 'Rûpelên taybet {{ns:special}} nikarin werin guherandin.',
-'titleprotected' => "Rûpelek bi vî navî nikare were çêkirin. Ev astengkirin ji [[User:$1|$1]] bi sedema ''$2'' hate çêkirin.",
+'titleprotected' => "Rûpelek bi vî navî nikare bê çêkirin. Ev astengkirin ji [[User:$1|$1]] bi sedema ''$2'' hatiye çêkirin.",
 
 # Virus scanner
 'virus-unknownscanner' => 'Antîvîrusa nenas:',
@@ -529,7 +539,7 @@ Ji bo xelaskirina tomarkirinê, divê tu niha şîfreyeke nû binivîsî:',
 'resetpass_success' => 'Şîfreya te hate guherandin! Niha tu tê qeydkirin...',
 'resetpass_forbidden' => 'Şîfre nikarin werin guhertin',
 'resetpass-submit-loggedin' => 'Şîfre biguherîne',
-'resetpass-submit-cancel' => 'Betalkirin',
+'resetpass-submit-cancel' => 'Betal bike',
 'resetpass-temp-password' => 'Şîfreya niha:',
 
 # Special:PasswordReset
@@ -577,9 +587,9 @@ Ji bo xelaskirina tomarkirinê, divê tu niha şîfreyeke nû binivîsî:',
 'watchthis' => 'Vê gotarê bişopîne',
 'savearticle' => 'Rûpelê tomar bike',
 'preview' => 'Pêşdîtin',
-'showpreview' => 'Pêşdîtin',
+'showpreview' => 'Pêşdîtinê nîşan bide',
 'showlivepreview' => 'Pêşdîtina zindî',
-'showdiff' => 'Guherandinê nîşan bide',
+'showdiff' => 'Guherandinan nîşan bide',
 'anoneditwarning' => "'''Hişyarî:''' Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin.",
 'anonpreviewwarning' => "''Tu ne têketî yî. Tomarkirin wê navnîşana IP'ya te di dîroka guhertinan de nîşan bide.''",
 'missingsummary' => "<span style=\"color:#990000;\">'''Zanibe:'''</span> Te nivîsekî kurt ji bo guherandinê ra nenivîsand. Eger tu niha carekî din li Tomar xê, guherandinê te vê nivîsekî kurt yê were tomarkirin.",
@@ -630,15 +640,20 @@ Zanibe ku tu nikarî e-nameya bişînî heta tu di [[Special:Preferences|tercih
 'newarticletext' => "Ev rûpel hîn tune. Eger tu bixwazî vê rûpelê çêkî, dest bi nivîsandinê bike û piştre qeyd bike. '''Wêrek be''', biceribîne!<br />
 Ji bo alîkariyê binêre: [[{{MediaWiki:Helppage}}|Alîkarî]].<br />
 Heke tu bi şaşîtî hatî, bizîvire rûpela berê.",
-'anontalkpagetext' => "----''Ev rûpela gotûbêjê ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
-'noarticletext' => 'Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].',
-'noarticletext-nopermission' => 'Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].
-Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] an [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].',
+'anontalkpagetext' => "----''Ev rûpela gotûbêjê ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin/signup|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
+'noarticletext' => 'Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigerî]] an jî [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].',
+'noarticletext-nopermission' => 'Ev rûpel niha vala ye. 
+Tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] 
+an <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vê rûpelê biguherînî]</span>.',
 'userpage-userdoesnotexist' => 'Hesabê bikarhêneran "<nowiki>$1</nowiki>" nehatiye qeydkirin. Heke tu bixwazî vê rûpelê çêkî/biguherînî ji kerema xwe lê binêre.',
 'userpage-userdoesnotexist-view' => 'Hesabê bikarhêner  "$1"  nehatiye qeyd kirin.',
 'blocked-notice-logextract' => 'Ev bikarhêner hatiye astengkirin.
 Astengkirina dawî bi referansa li jêr hatiye piştrastkirin:',
-'clearyourcache' => "'''Zanibe:''' Piştî tomarkirinê, tu gireke cache'a browser'î xwe dîsa wînê ji bo dîtina guherandinan. '''Mozilla / Firefor /Safari:''' Kepsa ''Shift'' bigre û li ''Reload'' xe, ya ''Ctrl-Shift-R'' bikepsîne (''Cmd-Shift-R'' li cem Apple Mac); '''IE:''' Kepsa ''Ctrl'' bigre û li ''Reload'' xe, ya li ''Ctrl-F5''; '''Konqueror:''' bes li ''Reload'' xe ya li kepsa ''F5'' xe; bikarhênerên '''Opera''' girekin belkî cache'a xwe tevda di bin ''Tools → Preferences'' da valabikin.",
+'clearyourcache' => "'''Zanibe:''' Piştî tomarkirinê, tu gireke cache'a browser'î xwe dîsa wînê ji bo dîtina guherandinan.
+* '''Firefor / Safari: ''' Kepsa ''Shift'' bigre û li ''Reload'' xe, ya ''Ctrl-Shift-R'' bikepsîne (''Cmd-Shift-R'' li cem Apple Mac)
+* '''IE:''' Kepsa ''Ctrl'' bigre û li ''Reload'' xe, ya li ''Ctrl-F5''
+* '''Konqueror:''' Bes li ''Reload'' xe ya li kepsa ''F5'' xe
+* '''Opera:''' Girekin belkî cache'a xwe tevda di bin ''Tools → Preferences'' da valabikin",
 'usercssyoucanpreview' => "'''Tîp:''' 'Pêşdîtin' bikarwîne ji bo tu bibînê çawa CSS'ê te yê nuh e berî tomarkirinê.",
 'userjsyoucanpreview' => "'''Tîp:''' 'Pêşdîtin' bikarwîne ji bo tu bibînê çawa JS'ê te yê nuh e berî tomarkirinê.",
 'usercsspreview' => "'''Zanibe ku tu bes pêşdîtina CSS dibînî.'''
@@ -671,8 +686,8 @@ Tu soz didî ku te ev bi xwe nivîsand an jî ji çavkaniyekê azad an geliyane
 'protectedpagewarning' => "'''Hişyarî:  Ev rûpel tê parastin. Bi tenê bikarhênerên ku xwediyên mafên \"koordînatoriyê\" ne, dikarin vê rûpelê biguherînin.'''",
 'semiprotectedpagewarning' => "'''Hişyarî:''' Ev rûpel tê parastin, lewma bes bikarhênerên tomarkirî dikarin vê biguherînin.
 Guhertina herî dawî bi referansa li jêr hatiye piştrastkirin:",
-'templatesused' => 'Şablon di van rûpelan de tê bikaranîn',
-'templatesusedpreview' => 'Şablonên ku di vê pêşdîtinê de tên bikaranîn:',
+'templatesused' => '{{PLURAL:$1|Şablona|Şablonên}} ku li ser vê rûpelê {{PLURAL:$1|tê|tên}} bikaranîn:',
+'templatesusedpreview' => '{{PLURAL:$1|Şablona|Şablonên}} di vê pêşdîtinê de {{PLURAL:$1|tê|tên}} bikaranîn:',
 'templatesusedsection' => 'Şablonên ku di vê parçeyê de tên bikaranîn:',
 'template-protected' => '(tê parastin)',
 'template-semiprotected' => '(nîv-parastî)',
@@ -785,7 +800,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'compareselectedversions' => 'Guhertoyan bide ber hev',
 'showhideselectedversions' => 'Revîzyonên bijartî nîşan bide/veşêre',
 'editundo' => 'betal bike',
-'diff-multi' => '({{PLURAL:$1|Guhertoyeke di navbera herduyan de|$1 guhertoyên di navbera herduyan de}} tê(n) dîtin.)',
+'diff-multi' => '({{PLURAL:$1|Guhertoyeke|Guhertoyên {{PLURAL:$2|bikarhêner|bikarhêneran}} di navbera herduyan de}} {{PLURAL:$1|nayê|nayên}} dîtin.)',
 
 # Search results
 'searchresults' => 'Encamên lêgerînê',
@@ -835,7 +850,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'powersearch' => 'Lê bigere',
 'powersearch-legend' => 'Lê bigere',
 'powersearch-ns' => 'Di valahiya navan de lêbigere:',
-'powersearch-redir' => "Lîsteya redirect'an",
+'powersearch-redir' => 'Lîsteya beralîkirinan',
 'powersearch-field' => 'Bigere li',
 'powersearch-togglelabel' => 'Kontrol bike:',
 'powersearch-toggleall' => 'Hemû',
@@ -1048,7 +1063,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'recentchangeslinked-page' => 'Navê rûpelê',
 
 # Upload
-'upload' => 'Wêneyekî barbike',
+'upload' => 'Wêneyekî bar bike',
 'uploadbtn' => 'Wêneyekî bar bike',
 'reuploaddesc' => 'Barkirinê biskîne û dîsa here rûpela barkirinê.',
 'uploadnologin' => 'Xwe tomar nekir',
@@ -1067,7 +1082,7 @@ anjî ji bo file'ên dengî '''<nowiki>[[</nowiki>{{ns:media}}:File.ogg<nowiki>]
 'uploadlog' => 'Têketina barkirinê',
 'uploadlogpage' => 'Têketina barkirinê',
 'filename' => 'Navê pelê',
-'filedesc' => 'Kurte',
+'filedesc' => 'Danasîn',
 'fileuploadsummary' => 'Kurte:',
 'filereuploadsummary' => 'Guhertinên pelê:',
 'filestatus' => 'Rewşa telîfê:',
@@ -1088,16 +1103,16 @@ Format {{PLURAL:$3|yê tê|yên tên}} xwestin {{PLURAL:$3|ev e|ev in}}: $2.',
 'unknown-error' => 'Çewtiyeke nenas pêk hat.',
 'large-file' => 'Mezinbûna pelê bila ji $1 ne mezintir be; ev pel $2 e.',
 'emptyfile' => "Data'ya barkirî vala ye. Sedemê valabûnê belkî şaşnivîsek di navê data'yê da ye. Xêra xwe seke, ku tu rast dixazê vê data'yê barbikê.",
-'fileexists' => "Datayek bi vê navê berê heye.
+'fileexists' => 'Datayek bi vê navê berê heye.
 Eger tu niha li „Tomarbike“ xê, ew wêneyê kevin ê here û wêneyê te ê were barkirin di bin wê navê.
-Di bin '''<tt>[[:$1]]</tt>''' du dikarî sekê, ku di dixwazê wê wêneyê biguherînê.
+Di bin <strong>[[:$1]]</strong> du dikarî sekê, ku di dixwazê wê wêneyê biguherînê.
 Eger tu naxazê, xêra xwe li „Betal“ xe.
-[[$1|thumb]]",
-'fileexists-extension' => "Datayek wek vê navê berê heye: [[$2|thumb]]
-* Navî datayê yê tê barkirin: '''<tt>[[:$1]]</tt>'''
-* Navî datayê yê berê heyê: '''<tt>[[:$2]]</tt>'''
-Xêra xwe navekî din bibîne.",
-'file-thumbnail-no' => "Navî vê datayê bi '''<tt>$1</tt>''' destpêdike. Ev dibêje ku ev wêneyekî çûçik e ''(thumbnail)''. Xêra xwe seke, ku belkî versyonekî mezin yê vê wêneyê li cem te heye û wê wêneyê mezintir di bin navî orîjînal da barbike.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Datayek wek vê navê berê heye: [[$2|thumb]]
+* Navî datayê yê tê barkirin: <strong>[[:$1]]</strong>
+* Navî datayê yê berê heyê: <strong>[[:$2]]</strong>
+Xêra xwe navekî din bibîne.',
+'file-thumbnail-no' => "Navî vê datayê bi <strong>$1</strong> destpêdike. Ev dibêje ku ev wêneyekî çûçik e ''(thumbnail)''. Xêra xwe seke, ku belkî versyonekî mezin yê vê wêneyê li cem te heye û wê wêneyê mezintir di bin navî orîjînal da barbike.",
 'fileexists-forbidden' => 'Medyayek bi vê navî heye; xêra xwe şonda here û vê medyayê bi navekî din barbike.
 [[File:$1|thumb|center|$1]]',
 'uploadwarning' => 'Hişyariya barkirinê',
@@ -1125,8 +1140,8 @@ Xêra xwe navekî din bibîne.",
 'upload-unknown-size' => 'Mezinahiya nayê zanîn',
 
 'license' => 'Lîsans:',
-'license-header' => 'Lîsens:',
-'nolicense' => 'ya hilbijartî nîne',
+'license-header' => 'Lîsans',
+'nolicense' => 'Ya hilbijartî nîne',
 'license-nopreview' => 'Pêşdîtin ne gengaz e.',
 
 # Special:ListFiles
@@ -1153,7 +1168,7 @@ Xêra xwe navekî din bibîne.",
 'filehist-user' => 'Bikarhêner',
 'filehist-dimensions' => 'Mezinahî',
 'filehist-filesize' => 'Mezinahiya pelê',
-'filehist-comment' => 'Nivîs',
+'filehist-comment' => 'Şîrove',
 'filehist-missing' => 'Pel nîne',
 'imagelinks' => 'Girêdanên vî wêneyî',
 'linkstoimage' => 'Di van rûpelan de lînkek ji vî wêneyî re heye:',
@@ -1223,7 +1238,7 @@ Agahdariya li ser [$2 rûpela danasîna pelê] li jêr tê nîşandan.',
 'statistics-users-active' => 'Bikarhênerên çalak',
 'statistics-mostpopular' => 'Rûpelên herî lênerî',
 
-'disambiguations' => 'Rûpelên cudakirinê',
+'disambiguations' => 'Rûpelên girêdayî rûpelên cudakirinê',
 'disambiguationspage' => 'Template:disambig',
 
 'doubleredirects' => 'Beralîkirinên ducarî',
@@ -1235,7 +1250,7 @@ Agahdariya li ser [$2 rûpela danasîna pelê] li jêr tê nîşandan.',
 
 'withoutinterwiki' => 'Rûpelên bê girêdanên ziman',
 'withoutinterwiki-legend' => 'Pêşbendik',
-'withoutinterwiki-submit' => 'Nîşan bide',
+'withoutinterwiki-submit' => 'nîşan bide',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
@@ -1309,6 +1324,7 @@ Tu dikarî ji xwe re têketinekê hilbijêrî, navê bikarhêneriyê an navê r
 'allpagesprefix' => 'Rûpelên bi pêşbendik nîşan bide:',
 'allpagesbadtitle' => 'Sernavê rûpelê qedexe bû ya "interwiki"- ya "interlanguage"-pêşnavekî xwe hebû. Meqûle ku zêdertirî tiştekî nikanin werin bikaranîn di sernavê da.',
 'allpages-bad-ns' => 'Namespace\'a "$1" di {{SITENAME}} da tune ye.',
+'allpages-hide-redirects' => 'Beralîkirinan nîşan bide',
 
 # Special:Categories
 'categories' => 'Kategorî',
@@ -1321,15 +1337,15 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 # Special:DeletedContributions
 'deletedcontributions' => 'Beşdariyên bikarhênerekî yê jêbirî',
 'deletedcontributions-title' => 'Guherandinên bikarhêner yê jêbirî',
-'sp-deletedcontributions-contribs' => 'tevkarî',
+'sp-deletedcontributions-contribs' => 'beşdari',
 
 # Special:LinkSearch
-'linksearch' => 'Girêdanên derveyî',
+'linksearch' => 'Lêgerîna girêdanên derve',
 'linksearch-ns' => 'Valahiya nav:',
 'linksearch-ok' => 'Lêgerîn',
 
 # Special:ListUsers
-'listusers-submit' => 'Nîşan bide',
+'listusers-submit' => 'nîşan bide',
 'listusers-noresult' => 'Bikarhêner nehate dîtin.',
 'listusers-blocked' => '(hate astengkirin)',
 
@@ -1340,7 +1356,7 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 'activeusers-noresult' => 'Tu bikarhêner nehate dîtin.',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Ã\87êkirina hesabê nû',
+'newuserlogpage' => 'çêkirina hesabê nû',
 
 # Special:ListGroupRights
 'listgrouprights' => 'Mafên koma bikarhêner',
@@ -1394,7 +1410,7 @@ Gava tu bixwazî wê rûpelê ji nav lîsteya xwe ya şopandinê derbixî, li se
 'unwatchthispage' => 'Êdî neşopîne',
 'notanarticle' => 'Ne gotar e',
 'watchnochange' => 'Ne rûpelek, yê tu dişopînê, hate xeyrandin di vê wextê da, yê tu dixazê bibînê.',
-'watchlist-details' => '* {{PLURAL:$1|Rûpelek tê|$1 rûpel tên}} şopandin, rûpelên gotûbêjê nayên jimartin.',
+'watchlist-details' => '{{PLURAL:$1|Rûpeleka|$1 rûpel}} li ser lîsteya te ya şopandinê, rûpelên gotûbêjê nayên jimartin.',
 'wlheader-enotif' => '* Agahdariya E-nameyê pêk tê.',
 'wlheader-showupdated' => "* Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
 'watchlistcontains' => 'Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.',
@@ -1481,7 +1497,7 @@ Guhertoya dawî bi [[User:$3|$3]] ([[User talk:$3|gotûbêj]]).',
 'protectlogpage' => 'Têketina parastinê',
 'protectedarticle' => 'parastî [[$1]]',
 'modifiedarticleprotection' => 'parastina "[[$1]]" guherand',
-'unprotectedarticle' => '"[[$1]]" niha vê parastin e',
+'unprotectedarticle' => 'parastina "[[$1]]" rakir',
 'protect-title' => 'parastina "$1" biguherîne',
 'prot_1movedto2' => '$1 çû cihê $2',
 'protect-legend' => 'Parastinê teyîd bike',
@@ -1561,8 +1577,8 @@ Ji bo jêbirinan û çêkirinên nû, ji kerema xwe li [[{{ns:special}}:Log/dele
 'sp-contributions-newbies' => 'Tenê beşdariyên bikarhênerên nû nîşan bide',
 'sp-contributions-newbies-sub' => 'Ji bikarhênerên nû re',
 'sp-contributions-newbies-title' => 'Tevkariyên bikarhêner ji bo hesabên nû',
-'sp-contributions-blocklog' => 'Astengkirina bikarhêner',
-'sp-contributions-deleted' => 'Guherandinên bikarhênerekî yê jêbirî',
+'sp-contributions-blocklog' => 'astengkirina têketinê',
+'sp-contributions-deleted' => 'beşdariyên bikarhêner yên jêbirî',
 'sp-contributions-uploads' => 'yên barkirî',
 'sp-contributions-logs' => 'têketin',
 'sp-contributions-talk' => 'gotûbêj',
@@ -1644,7 +1660,7 @@ Sedemekê binivîse!',
 'blocklist-tempblocks' => 'Astengkirinên demkî veşêre',
 'blocklist-rangeblocks' => 'Astengkirinên cur bi cur veşêre',
 'blocklist-by' => 'Astengkirina rêveber',
-'blocklist-params' => 'Parametreyan asteng bike',
+'blocklist-params' => 'Parametreyên astengkirinê',
 'blocklist-reason' => 'Sedem',
 'ipblocklist-submit' => 'Lêgerîn',
 'ipblocklist-localblock' => 'Astengkirina herêmî',
@@ -1733,7 +1749,7 @@ da bikarî navê wê rûpelê biguherînî.',
 'delete_and_move_text' => '== Jêbirin gireke ==
 
 Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê ra?',
-'delete_and_move_confirm' => 'Erê, wê rûpelê jêbibe',
+'delete_and_move_confirm' => 'Erê, rûpelê jê bibe',
 'delete_and_move_reason' => 'Jêbir ji bo navguherandinê',
 'immobile-source-page' => 'Navê vê rûpelê nikare were guherandin.',
 
@@ -1800,13 +1816,13 @@ Tu dikarî tenê li çavkaniyê binêrî.',
 'tooltip-search-go' => 'Here rûpeleke tev bi vî navî, heke hebe',
 'tooltip-search-fulltext' => 'Di nav rûpelan de li vê nivîsê bigerre',
 'tooltip-p-logo' => 'Here Destpêkê',
-'tooltip-n-mainpage' => 'Biçe Destpêkê',
+'tooltip-n-mainpage' => 'Here Destpêkê',
 'tooltip-n-mainpage-description' => 'Here Destpêkê',
 'tooltip-n-portal' => 'Agahdarî li ser {{SITENAME}}, tu dikarî çi bikî, tu dikarî çi li ku bîbînî',
-'tooltip-n-recentchanges' => "Lîsteya guherandinên dawî di vê Wîkî'yê da.",
+'tooltip-n-recentchanges' => 'Lîsteya guherandinên dawî di vê wîkiyê da',
 'tooltip-n-randompage' => 'Rûpeleka ketober bar bike',
 'tooltip-n-help' => 'Bersivên ji bo pirsên te.',
-'tooltip-t-whatlinkshere' => 'Lîsteya hemû rûpelên ku pê ve girêdayî ne.',
+'tooltip-t-whatlinkshere' => 'Lîsteya hemû rûpelên ku pê ve girêdayî ne',
 'tooltip-t-recentchangeslinked' => 'Recent changes in pages linking to this page',
 'tooltip-feed-rss' => "RSS feed'ên ji bo rûpelê",
 'tooltip-feed-atom' => "Atom feed'ên ji bo vê rûpelê",
@@ -1851,13 +1867,9 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 
 # Info page
 'pageinfo-header-edits' => 'Guherandin',
-'pageinfo-header-watchlist' => 'Lîsteya şopandinê',
-'pageinfo-header-views' => 'Dîtin',
-'pageinfo-subjectpage' => 'Rûpel',
-'pageinfo-talkpage' => 'Rûpela gotûbêjê',
+'pageinfo-views' => 'Hejmara dîtinê',
 'pageinfo-watchers' => 'Hejmara kesên dişopînin',
 'pageinfo-edits' => 'Hejmara guherandinan',
-'pageinfo-views' => 'Hejmara dîtinê',
 
 # Patrolling
 'markaspatrolleddiff' => 'Wek serrastkirî nîşan bide',
@@ -1988,7 +2000,7 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'hemû',
-'namespacesall' => 'Hemû',
+'namespacesall' => 'hemû',
 'monthsall' => 'hemû',
 'limitall' => 'hemû',
 
@@ -2017,7 +2029,7 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 'recreate' => 'Dîsa çêke',
 
 # action=purge
-'confirm_purge_button' => 'Temam',
+'confirm_purge_button' => 'Baş e',
 'confirm-purge-top' => 'Bîra vê rûpelê jêbîbe ?',
 
 # Multipage image navigation
@@ -2031,7 +2043,7 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 'table_pager_prev' => 'Rûpela berî',
 'table_pager_first' => 'Rûpela pêşîn',
 'table_pager_last' => 'Rûpela dawî',
-'table_pager_limit_submit' => 'Biçe',
+'table_pager_limit_submit' => 'Here',
 
 # Auto-summaries
 'autosumm-blank' => 'Rûpel hate vala kirin',
index 9b8b641..f22569b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Cornish (Kernowek)
+/** Cornish (kernowek)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
 
 $namespaceNames = array(
        NS_MEDIA            => 'Media',
-       NS_SPECIAL          => 'Arbennek',
-       NS_TALK             => 'Kescows',
+       NS_SPECIAL          => 'Arbednek',
+       NS_TALK             => 'Keskows',
        NS_USER             => 'Devnydhyer',
-       NS_USER_TALK        => 'Kescows_Devnydhyer',
-       NS_PROJECT_TALK     => 'Kescows_$1',
+       NS_USER_TALK        => 'Keskows_Devnydhyer',
+       NS_PROJECT_TALK     => 'Keskows_$1',
        NS_FILE             => 'Restren',
-       NS_FILE_TALK        => 'Kescows_Restren',
+       NS_FILE_TALK        => 'Keskows_Restren',
        NS_MEDIAWIKI        => 'MediaWiki',
-       NS_MEDIAWIKI_TALK   => 'Kescows_MediaWiki',
-       NS_TEMPLATE         => 'Scantlyn',
-       NS_TEMPLATE_TALK    => 'Kescows_Scantlyn',
+       NS_MEDIAWIKI_TALK   => 'Keskows_MediaWiki',
+       NS_TEMPLATE         => 'Skantlyn',
+       NS_TEMPLATE_TALK    => 'Keskows_Skantlyn',
        NS_HELP             => 'Gweres',
-       NS_HELP_TALK        => 'Kescows_Gweres',
-       NS_CATEGORY         => 'Class',
-       NS_CATEGORY_TALK    => 'Kescows_Class',
+       NS_HELP_TALK        => 'Keskows_Gweres',
+       NS_CATEGORY         => 'Klass',
+       NS_CATEGORY_TALK    => 'Keskows_Klass',
 );
 
 $namespaceAliases = array(
-       'Arbednek'           => NS_SPECIAL,
+       'Arbennek'           => NS_SPECIAL,
        'Cows'               => NS_TALK,
-       'Keskows'            => NS_TALK,
+       'Kescows'            => NS_TALK,
        'Cows_Devnydhyer'    => NS_USER_TALK,
-       'Keskows_Devnydhyer' => NS_USER_TALK,
+       'Kescows_Devnydhyer' => NS_USER_TALK,
        'Cows_$1'            => NS_PROJECT_TALK,
-       'Keskows_$1'         => NS_PROJECT_TALK,
+       'Kescows_$1'         => NS_PROJECT_TALK,
        'Cows_Restren'       => NS_FILE_TALK,
-       'Keskows_Restren'    => NS_FILE_TALK,
+       'Kescows_Restren'    => NS_FILE_TALK,
        'Cows_MediaWiki'     => NS_MEDIAWIKI_TALK,
-       'Keskows_MediaWiki'  => NS_MEDIAWIKI_TALK,
+       'Kescows_MediaWiki'  => NS_MEDIAWIKI_TALK,
        'Cows_Scantlyn'      => NS_TEMPLATE_TALK,
-       'Skantlyn'           => NS_TEMPLATE,
-       'Keskows_Skantlyn'   => NS_TEMPLATE_TALK,
+       'Scantlyn'           => NS_TEMPLATE,
+       'Kescows_Skantlyn'   => NS_TEMPLATE_TALK,
        'Cows_Gweres'        => NS_HELP_TALK,
-       'Keskows_Gweres'     => NS_HELP_TALK,
+       'Kescows_Gweres'     => NS_HELP_TALK,
        'Cows_Class'         => NS_CATEGORY_TALK,
-       'Klass'              => NS_CATEGORY,
-       'Keskows_Klass'      => NS_CATEGORY_TALK,
+       'Class'              => NS_CATEGORY,
+       'Kescows_Class'      => NS_CATEGORY_TALK,
 );
 
 $specialPageAliases = array(
index 47cb98d..726c146 100644 (file)
@@ -10,6 +10,7 @@
  * @author AidaBishkek
  * @author Aidabishkek
  * @author Amire80
+ * @author Chorobek
  * @author Muratjumashev
  * @author Ztimur
  */
@@ -36,15 +37,15 @@ $messages = array(
 'tog-usenewrc' => 'Акыркы өзгөрүүлөрдүн жакшыртылган тизмесин колдонуу (JavaScript талап кылынат)',
 'tog-numberheadings' => 'Башсаптарды автоматтык түрдө номурлоо',
 'tog-showtoolbar' => 'Оңдоо учурунда аспаптар тактасын көрсөтүү (JavaScript талап кылынат)',
-'tog-editondblclick' => 'Ð\9aоÑ\88 Ñ\87еÑ\80Ñ\82Ò¯Ò¯ Ð¼ÐµÐ½ÐµÐ½ баракты оңдоо (JavaScript талап кылынат)',
+'tog-editondblclick' => 'Эки Ð±Ð°Ñ\81Ñ\8bп баракты оңдоо (JavaScript талап кылынат)',
 'tog-editsection' => 'Ар бир секция үчүн «оңдоо» шилтемеси',
 
-'underline-always' => 'Ð\90Ñ\80 Ð´айым',
+'underline-always' => 'Ð\94айым',
 'underline-never' => 'Эч качан',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Оңдоо талаасынын арибинин стили:',
-'editfont-default' => 'Ð\90Ñ\80алагÑ\8bÑ\87Ñ\82Ñ\8bн Ð°Ñ\80ибин ÐºÐ»Ð´Ð¾Ð½Ñ\83Ñ\83',
+'editfont-default' => 'СеÑ\80епÑ\87инин Ð°Ñ\80ибин ÐºÐ¾Ð»Ð´Ð¾Ð½',
 'editfont-monospace' => 'Моножазы ариби',
 
 # Dates
@@ -102,7 +103,7 @@ $messages = array(
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категориялар}}',
 'category_header' => '"$1" категориядагы барактар',
-'subcategories' => 'Ð\9aөмөк категориялар',
+'subcategories' => 'Ð\98Ñ\87ки категориялар',
 'category-media-header' => '"$1" категориясындагы медиафайлдар',
 'category-empty' => "''Бул категорияда азыр эч бир барак же файл жок.''",
 'hidden-categories' => '{{PLURAL:$1|Жашырылган категория|Жашырылган категориялар}}',
@@ -115,8 +116,8 @@ $messages = array(
 'category-file-count-limited' => 'Бул категорияда {{PLURAL:$1|$1|$1|$1}} файл бар.',
 'listingcontinuesabbrev' => 'уланд.',
 'index-category' => 'Индекстелген барактар',
-'noindex-category' => 'Иреттелбеген барактар',
-'broken-file-category' => 'Файлдарга туура эмес шилтемелүү барактар',
+'noindex-category' => 'Индекстелбеген барактар',
+'broken-file-category' => 'Файлдарга туура эмес шилтеме берген барактар',
 
 'about' => 'Тууралуу',
 'article' => 'Макала',
@@ -124,14 +125,14 @@ $messages = array(
 'cancel' => 'Жокко чыгар',
 'moredotdotdot' => 'Уландысы...',
 'mypage' => 'Барагым',
-'mytalk' => 'Талкуум',
+'mytalk' => 'ТалкÑ\83Ñ\83лаÑ\80Ñ\8bм',
 'anontalk' => 'Бул IP дарек үчүн талкуу',
-'navigation' => 'Багыттоо',
+'navigation' => 'Багыт алуу',
 'and' => '&#32;жана',
 
 # Cologne Blue skin
-'qbfind' => 'Издөө',
-'qbbrowse' => 'Ð\9aаÑ\80оо',
+'qbfind' => 'Изде',
+'qbbrowse' => 'СеÑ\80еп Ñ\81ал',
 'qbedit' => 'Оңдоо',
 'qbpageoptions' => 'Бул барак',
 'qbpageinfo' => 'Контекст',
@@ -151,7 +152,7 @@ $messages = array(
 'vector-view-edit' => 'Оңдо',
 'vector-view-history' => 'Тарыхын кара',
 'vector-view-view' => 'Оку',
-'vector-view-viewsource' => 'Ð\91айкоо',
+'vector-view-viewsource' => 'Ð\9aайнаÑ\80Ñ\8bн ÐºÐ°Ñ\80а',
 'actions' => 'Аракеттер',
 'namespaces' => 'Аталыш топтому',
 'variants' => 'Варианттар',
@@ -223,8 +224,8 @@ $messages = array(
 'mainpage-description' => 'Башбарак',
 'portal' => 'Жамаат порталы',
 'portal-url' => 'Project:Жамаат порталы',
-'privacy' => 'Ð\96аÑ\88Ñ\8bÑ\80Ñ\83Ñ\83ндÑ\83Ñ\83лÑ\83к Ñ\82аÑ\80Ñ\82иби',
-'privacypage' => 'Project:Ð\96аÑ\88Ñ\8bÑ\80Ñ\83Ñ\83ндÑ\83Ñ\83лÑ\83к Ñ\82аÑ\80Ñ\82иби',
+'privacy' => 'Ð\9cаалÑ\8bмаÑ\82Ñ\82Ñ\8b ÐºÑ\83пÑ\83Ñ\8f Ñ\81акÑ\82оо Ñ\81аÑ\8fÑ\81аÑ\82Ñ\8b',
+'privacypage' => 'Project:Ð\9cаалÑ\8bмаÑ\82Ñ\82Ñ\8b ÐºÑ\83пÑ\83Ñ\8f Ñ\81акÑ\82оо Ñ\81аÑ\8fÑ\81аÑ\82Ñ\8b',
 
 'retrievedfrom' => '"$1" булагындан алынды',
 'youhavenewmessages' => 'Сизге $1 ($2) бар.',
@@ -249,10 +250,10 @@ $messages = array(
 'nstab-main' => 'Макала',
 'nstab-user' => 'Колдонуучунун барагы',
 'nstab-special' => 'Атайын барак',
-'nstab-project' => 'Долбоор барагы',
+'nstab-project' => 'Долбоордун барагы',
 'nstab-image' => 'Файл',
 'nstab-mediawiki' => 'Билдирүү',
-'nstab-template' => 'Ð\9dÑ\83Ñ\81ка',
+'nstab-template' => 'Ð\9aалÑ\8bп',
 'nstab-help' => 'Жардам',
 'nstab-category' => 'Категория',
 
@@ -280,7 +281,7 @@ $messages = array(
 'badtitle' => 'Ыксыз аталыш',
 'badtitletext' => 'Талап кылынган барак аталышы туура эмес, бош, же тилдер-аралык же уики-аралык аталышы туура эмес шилтемеленген.
 Балким аталышта колдонулбай турган бир же андан көп белги камтылган.',
-'viewsource' => 'Ð\91айкоо',
+'viewsource' => 'Ð\9aайнаÑ\80Ñ\8bн ÐºÐ°Ñ\80а',
 
 # Login and logout pages
 'welcomecreation' => '== Кош келиңиз, $1! ==
@@ -289,21 +290,29 @@ $messages = array(
 'yourname' => 'Колдонуучунун аты',
 'yourpassword' => 'Сырсөз',
 'yourpasswordagain' => 'Сырсөздү кайра жазыңыз',
-'remembermypassword' => 'Ð\91Ñ\83л Ð±Ñ\80аÑ\83зеÑ\80де ÐºÐ°Ñ\82Ñ\82оо Ð¶Ð°Ð·Ñ\83Ñ\83мдÑ\83 Ñ\8dÑ\81Ñ\82е тут (эң көп $1 {{PLURAL:$1|күн|күн}})',
+'remembermypassword' => 'Ð\91Ñ\83л Ð±Ñ\80аÑ\83зеÑ\80де ÐºÐ°Ñ\82Ñ\82оо Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82Ñ\82аÑ\80Ñ\8bмдÑ\8b Ñ\8dÑ\81ке тут (эң көп $1 {{PLURAL:$1|күн|күн}})',
 'yourdomainname' => 'Сиздин домен',
 'login' => 'Кирүү',
 'nav-login-createaccount' => 'Кирүү / Каттоо',
 'loginprompt' => '{{SITENAME}} сайтына кирүү үчүн «cookies» колдонууга уруксатыңыз керек .',
 'userlogin' => 'Кирүү / Каттоо',
+'userloginnocreate' => 'Кирүү',
 'logout' => 'Чыгуу',
 'userlogout' => 'Чыгуу',
+'notloggedin' => 'Сиз системага кире элексиз',
 'nologin' => 'Каттала элексизби? $1.',
 'nologinlink' => 'Каттоону башта',
 'createaccount' => 'Жаңы колдонуучуну катта',
 'gotaccount' => 'Катталгансызбы? $1.',
 'gotaccountlink' => 'Кирүү',
-'userlogin-resetlink' => 'Кирүү маалыматыңызды унутуп калдыңызбы?',
+'userlogin-resetlink' => 'Кирүүчү маалыматарыңызды унутуп калдыңызбы?',
 'createaccountmail' => 'Электрондук дарек боюнча',
+'createaccountreason' => 'Себеби:',
+'badretype' => 'Сиз киргизген сырсөздөр дал келишпейт',
+'userexists' => 'Сиз тандаган колдонуучунун аты бош эмес.',
+'loginerror' => 'Колдонуучуну таанууда ката кетти',
+'createaccounterror' => '$1 эсебин түзүү мүмкүн эмес',
+'loginsuccesstitle' => 'Сиз ийгиликтүү кирдиңиз',
 'wrongpassword' => 'Ката сырсөз киргизилди. Кайтадан аракет кылып көрүңүз.',
 'wrongpasswordempty' => 'Сырсөз киргизилген жок. Кайтадан аракет кылып көрүңүз.',
 'mailmypassword' => 'Жаңы сырсөздү электрондук дарекке жибер',
@@ -316,8 +325,8 @@ $messages = array(
 'newpassword' => 'Жаңы сырсөз:',
 
 # Edit page toolbar
-'bold_sample' => 'Калын тамга',
-'bold_tip' => 'Калын тамга',
+'bold_sample' => 'Калың тамга',
+'bold_tip' => 'Калың тамга',
 'italic_sample' => 'Жантык тамга',
 'italic_tip' => 'Жантык тамга',
 'link_sample' => 'Шилтеменин аталышы',
@@ -330,7 +339,7 @@ $messages = array(
 'nowiki_tip' => 'Уики-форматтоого көңүл бөлбө',
 'image_tip' => 'Кыстарылган файл',
 'media_tip' => 'Файлга шилтеме',
-'sig_tip' => 'Ð\9aол Ñ\82амгаңÑ\8bз Ð¶Ð°Ð½Ð° Ñ\81ааÑ\82Ñ\8b',
+'sig_tip' => 'Ð\9aол Ñ\82амгаңÑ\8bз Ð¶Ð°Ð½Ð° Ñ\83бакÑ\8bÑ\82 Ð¼Ó©Ó©Ñ\80Ò¯',
 'hr_tip' => 'Туурасынын сызык (жыш колдонбоңуз)',
 
 # Edit pages
@@ -340,11 +349,16 @@ $messages = array(
 'savearticle' => 'Баракты сактап кой',
 'preview' => 'Алдын ала көрүү',
 'showpreview' => 'Алдын ала көрсөт',
+'showlivepreview' => 'Ылдам карап чыгуу',
 'showdiff' => 'Өзгөртүүлөрдү көрсөт',
 'anoneditwarning' => "'''Эскертүү:''' Сиз каттоодон өткөн жоксуз.
 IP дарегиңиз бул барактын оңдоо тарыхына жазылат.",
+'blockedtext' => 'Сиздин колдонуучу атыңыз же IP дарегиңиз тосмолонгон',
+'blockednoreason' => 'себеби көрсөтүлгөн эмес',
+'loginreqtitle' => 'Колдонуучунун аты талап кылынат',
+'loginreqlink' => 'Кирүү',
 'accmailtitle' => 'Сырсөз жөнөтүлдү.',
-'accmailtext' => '"$1" үчүн сырсөз $2 ге жөнөтүлдү.',
+'accmailtext' => ' [[User talk:$1|$1]] үчүн сырсөз $2 ге жөнөтүлдү.',
 'newarticle' => '(Жаңы)',
 'newarticletext' => "Сиз ачыла элек баракка шилтемени бастыңыз.
 Бул баракты ачуу үчүн, ылдый жактагы терезечеге жаза баштаңыз (кошумча маалымат алуу үчүн [[{{MediaWiki:Helppage}}|жардам барагы]] караңыз).
@@ -356,34 +370,44 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'noarticletext-nopermission' => 'Азыр бул баракта текст жок.
 Сиз башка барактардан [[Special:Search/{{PAGENAME}}|ушул аталыш менен баракты издөө]] салып,
 же <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийиштүү жазууларды таба аласыз]</span>.',
+'userpage-userdoesnotexist' => '"$1" Мындай колдонуучу катталган эмес. Ушул баракты түзүүнү же оңдогонду каалганыңыз анык болсун',
 'previewnote' => "'''Бул алдын ала көрүнүшү гана болгонун эсиңизге алыңыз.'''
 Өзгөртүүлөрүңүз сактала элек!",
+'continue-editing' => 'Өзгөртүүүлөрдү улантабыз',
+'session_fail_preview' => 'Кечиресиз, байланыш үзүлгөндүктөн сиздин өзгөртүүлөр сакталган жок. Дагы бир жолу аракет кылып көрүңүз. Болбосо, [[Special:UserLogout|logging out]] аткарып, кайра кирип көрүңүз.',
 'editing' => 'Оңдоо $1',
+'creating' => '$1 түзүлүүдө',
 'editingsection' => '$1 (бөлүмү) оңдолууда',
+'editingcomment' => ' $1 оңдолууда (жаңы бөлүм)',
 'yourtext' => 'Текстиңиз',
 'yourdiff' => 'Айырмалар',
-'templatesused' => 'Бул баракта колдонулган {{PLURAL:$1|шаблон |шаблон}}:',
+'templatesused' => 'Бул баракта колдонулган {{PLURAL:$1|калып |калыптар}}:',
 'template-protected' => '(корголгон)',
 'template-semiprotected' => '(жарым-жартылай корголгон)',
 'hiddencategories' => 'Бул барак {{PLURAL:$1|1 жашыруун категориянын|$1 жашыруун категориялардын}} мүчөсү:',
 'permissionserrorstext-withaction' => 'Сизге $2, төмөнкү {{PLURAL:$1|себеп|себеп}} менен уруксат жок:',
-'recreate-moveddeleted-warn' => "'''Ð\90байлаÑ\82Ñ\83Ñ\83: Сиз мурун өчүрүлгөн баракты кайра баштап жатасыз.'''
+'recreate-moveddeleted-warn' => "'''ЭÑ\81кеÑ\80Ñ\82Ò¯Ò¯: Сиз мурун өчүрүлгөн баракты кайра баштап жатасыз.'''
 
\91Ñ\83л Ð±Ð°Ñ\80акÑ\82Ñ\8b Ð¾Ò£Ð´Ð¾Ð¾Ð½Ñ\83 Ñ\83ланÑ\82Ñ\83Ñ\83га Ñ\8bлайÑ\8bгÑ\8bн Ñ\82екÑ\88еÑ\80иңиз.
-Ыңгайлуулук үчүн өчүрүү жана өзгөртүүлөрдүн тизмеси ылдый жакта берилген:",
\91Ñ\83л Ð±Ð°Ñ\80акÑ\82Ñ\8b ÐºÐ°Ð¹Ñ\80а ÐºÐ°Ð¹Ñ\82аÑ\80Ñ\83Ñ\83 Ñ\87Ñ\8bндап ÐºÐµÑ\80ек Ñ\8dкендигине ÐºÓ©Ð·Ò¯Ò£Ò¯Ð· Ð¶ÐµÑ\82Ñ\81ин.
+Ыңгайлуулук үчүн төмөндө өчүрүүлөрдүн жана өзгөртүүлөрдүн тизмеси берилген:",
 'moveddeleted-notice' => 'Бул барак өчүрүлгөн.
-Маалымат алуу үчүн баракты өчүрүү жана өзгөртүүлөрдүн тизмеси ылдый жакта берилген.',
+Маалымат үчүн төмөндө өчүрүүлөрдүн жана өзгөртүүлөрдүн тизмеси берилген.',
+'edit-conflict' => 'Өзгөртүүлөрдүн конфликти',
+'edit-already-exists' => 'Жаңы барак түзүү мүмкүн эмес. Мындай барак бар',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''Эскертүү:''' Шаблондун өлчөмү ашырып жиберилген.
-Кээ бир шаблондор кошулбайт.",
-'post-expand-template-inclusion-category' => 'Өлчөмү ашырып жиберилген шаблон камтыган барактар',
-'post-expand-template-argument-warning' => "'''Абайлатуу:''' Бул барак жаюуга өтө чоң көлөмдүү эң аз дегенде бир шаблон жүйөсүн камтыйт.
-Ушул сыяктуу жүйөлөр аттатылышты.",
-'post-expand-template-argument-category' => 'Аттатылган шаблон жүйөлөрүн камтыган барактар',
+'post-expand-template-inclusion-warning' => "'''Эскертүү:''' Камтылган калыптардын өлчөмү өтө чоң.
+Кээ бир калыптар камтылбайт.",
+'post-expand-template-inclusion-category' => 'Камтылган калыптардын өлчөмү ашып кеткен барактар',
+'post-expand-template-argument-warning' => "'''Эскертүү:''' Бул барак, жок дегенде, абдан чоң көлөмдүү калыптын бир жүйөсүн камтыйт жана  жайылганда өлчөмү абдан чоң болуп кетет. 
+Ушул сыяктуу жүйөлөр аттатылды.",
+'post-expand-template-argument-category' => 'Калыптардын аттатылган жүйөлөрүн камтыган барактар',
+'parser-template-loop-warning' => 'Калыптарда айланма бар:[[$1]]',
 
 # History pages
 'viewpagelogs' => 'Бул барак үчүн тизмелерди кара',
+'nohistory' => 'Бул барактын өзгөртүүлөр тарыхы жок',
+'currentrev' => 'Акыркы версиясы',
 'currentrev-asof' => '$1 -га соңку версиясы',
 'revisionasof' => '$1 -деги абалы',
 'revision-info' => '$1 карата $2 тарабынан жасалган версия',
@@ -393,18 +417,23 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'cur' => 'учрдг.',
 'next' => 'кийинки',
 'last' => 'соңку',
-'histlegend' => "Айырмалоону тандоо: Салыштырыла турган версияларлын тушундагы тегеректерди белгиле жана \"Enter\"-ди же астындагы нукуурун бас.<br />
+'page_first' => 'биринчи',
+'page_last' => 'акыркы',
+'histlegend' => "Айырмаларды тандоо: Салыштырыла турган версияларлын тушундагы тегеректерди белгилеп туруп \"Enter\"-ди же астындагы баскычты бас.<br />
 Түшүндүрүү: '''({{int:cur}})''' = соңку версиясынан айырма, '''({{int:last}})''' = мурунку версиясынан айырма, '''{{int:minoreditletter}}''' = майда оңдоо.",
 'history-fieldset-title' => 'Тарыхын кара',
 'history-show-deleted' => 'Өчүрүлгөндөрдү гана',
 'histfirst' => 'Эң эски',
 'histlast' => 'Соңку',
+'historyempty' => 'бош',
 
 # Revision feed
+'history-feed-title' => 'Өзгөртүүлөр тарыхы',
 'history-feed-item-nocomment' => '$1, $2 карата',
 
 # Revision deletion
 'rev-delundel' => 'көрсөт/жашыр',
+'rev-showdeleted' => 'көрсөт',
 'revdel-restore' => 'көрүнүшүн өзгөрт',
 'revdel-restore-deleted' => 'өчүрүлгөн версиялар',
 'revdel-restore-visible' => 'көрүнүүчү версиялары',
@@ -413,7 +442,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'revertmerge' => 'Бөл',
 
 # Diffs
-'history-title' => '"$1" барактын тарыхына сереп',
+'history-title' => '"$1" өзгөрүүлөр тарыхы',
 'lineno' => '$1 -сап:',
 'compareselectedversions' => 'Тандалган версияларды салыштыр',
 'editundo' => 'жокко чыгар',
@@ -434,7 +463,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'searchprofile-project' => 'Жардам жана Долбоор барактары',
 'searchprofile-images' => 'Мултимедиа',
 'searchprofile-everything' => 'Баары',
-'searchprofile-advanced' => 'Ð\96етилген',
+'searchprofile-advanced' => 'Ð\9aеңейтилген',
 'searchprofile-articles-tooltip' => '$1 -де изде',
 'searchprofile-project-tooltip' => '$1 -де изде',
 'searchprofile-images-tooltip' => 'Файлдарды изде',
@@ -450,12 +479,14 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'searchrelated' => 'байланыштуу',
 'searchall' => 'баары',
 'showingresultsheader' => "'''$4''' үчүн {{PLURAL:$5|'''$3''' жыйынтыктан '''$1'''-и|'''$1 - $2''' -дан '''$3''' жыйынтык}}",
-'search-nonefound' => 'СÑ\83Ñ\80ооңÑ\83зга Ñ\8bлайÑ\8bк ÐºÐµÐ»Ð³ÐµÐ½ Ð¶Ñ\8bйÑ\8bнÑ\82Ñ\8bк жок.',
+'search-nonefound' => 'Талапка Ñ\82өп Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82 Ñ\82абÑ\8bлган жок.',
 'powersearch' => 'Издөө',
+'powersearch-legend' => 'Кеңиртип изде',
 
 # Preferences page
-'preferences' => 'Түзөө',
+'preferences' => 'ЫңгайлаÑ\88Ñ\82Ñ\8bÑ\80Ñ\83Ñ\83',
 'mypreferences' => 'Ырастоолорум',
+'prefs-edits' => 'Өзгөртүүлөрдүн саны',
 'changepassword' => 'Сырсөздү өзгөртүү',
 'prefs-datetime' => 'Дата жана убакыт',
 'prefs-rc' => 'Соңку өзгөрүүлөр',
@@ -475,6 +506,12 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'prefs-help-email' => 'Электрондук дарек милдетүү эмес, бирок сырсөздү унутуп калсаңыз ал сырсөздү жиберүүгө керек.',
 'prefs-help-email-others' => 'Ошондой эле башкалар сиз менен колдонуучу же талкуу барактарыңыздагы шилтеме аркылуу байланыш түзүүгө уруксат берүүнү тандай аласыз.
 Электрондук дарегиңиз башка кодонуучуларга байланыш түзгөндө көрүнбөйт.',
+'prefs-advancedediting' => 'Кеңейтилген',
+'prefs-advancedrc' => 'Кеңейтилген',
+'prefs-advancedrendering' => 'Кеңейтилген',
+'prefs-advancedsearchoptions' => 'Кеңейтилген',
+'prefs-advancedwatchlist' => 'Кеңейтилген',
+'prefs-displayrc' => 'Көрсөтүүнү тууралоо',
 
 # Groups
 'group' => 'Топ:',
@@ -501,7 +538,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'rcshowhideminor' => 'Майда оңдоолорду $1',
 'rcshowhidebots' => 'ботторду $1',
 'rcshowhideliu' => '$1 катталган колдонуучу',
-'rcshowhideanons' => 'Ð\96аÑ\88Ñ\8bÑ\80Ñ\8bн ÐºÐ¾Ð»Ð´Ð¾Ð½Ñ\83Ñ\83Ñ\87Ñ\83лаÑ\80дÑ\8b $1',
+'rcshowhideanons' => 'Ð\96аÑ\88Ñ\8bÑ\80Ñ\83Ñ\83н ÐºÐ¾Ð»Ð´Ð¾Ð½Ñ\83Ñ\83Ñ\87Ñ\83лаÑ\80 $1',
 'rcshowhidepatr' => 'Көзөмөл алдындагы оңдоолорду $1',
 'rcshowhidemine' => 'Оңдоолорумду $1',
 'rclinks' => 'Соңку $2 кундө жасалган акыркы $1 өзгөртүүлөрдү көрсөт<br />$3',
@@ -535,6 +572,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'uploadedfiles' => 'Жүктөлгөн файлдар',
 'savefile' => 'Файлды сактап кой',
 'uploadedimage' => '"[[$1]]" жүктөлдү',
+'upload-success-subj' => 'Ийгиликтүү жүктөлдү',
 
 'license' => 'Лицензиялоо:',
 'license-header' => 'Лицензиялоо:',
@@ -557,8 +595,8 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'imagelinks' => 'Файл пайдалануу',
 'linkstoimage' => 'Бул файлга болгон {{PLURAL:$1|шилтеме|$1 шилтеме}} :',
 'nolinkstoimage' => 'Бул файлга шилтеме берген барак жок.',
-'sharedupload-desc-here' => 'Файл $1 -дан Ð¶Ð°Ð½Ð° Ð±Ð°Ñ\88ка Ð´Ð¾Ð»Ð±Ð¾Ð¾Ñ\80лоÑ\80до Ð¿Ð°Ð¹Ð´Ð°Ð»Ð°Ð½Ñ\83Ñ\83га Ð°Ð»Ð° Ð°Ð»Ñ\8bÑ\88аÑ\82.
«Ð»Ð´Ñ\8bй Ð¶Ð°ÐºÑ\82а Ð°Ð½Ñ\8bн [$2 Ñ\84айлдÑ\8b Ñ\81Ñ\8bпаÑ\82Ñ\82оо Ð±Ð°Ñ\80агÑ\8b]нан Ñ\81Ñ\8bпаÑ\82Ñ\82оÑ\81Ñ\83 көрсөтүлгөн.',
+'sharedupload-desc-here' => 'Ð\91Ñ\83л Ñ\84айл $1 -дан  Ð¶Ð°Ð½Ð° Ð±Ð°Ñ\88ка Ð´Ð¾Ð»Ð±Ð¾Ð¾Ñ\80лоÑ\80до Ð¿Ð°Ð¹Ð´Ð°Ð»Ð°Ð½Ñ\8bлÑ\8bÑ\88Ñ\8b Ð¼Ò¯Ð¼ÐºÒ¯Ð½.
¢Ó©Ð¼Ó©Ð½Ð´Ó© Ð°Ð½Ñ\8bн [$2 Ñ\84айлдÑ\8b Ñ\81Ñ\8bпаÑ\82Ñ\82оо Ð±Ð°Ñ\80агÑ\8b]нан Ñ\81Ñ\8bпаÑ\82Ñ\82амаÑ\81Ñ\8b көрсөтүлгөн.',
 
 # Unused templates
 'unusedtemplates' => 'Колдонулбаган нускалар',
@@ -666,8 +704,8 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'undeletecomment' => 'Түшүндүрмө:',
 
 # Namespace form on various pages
-'namespace' => 'Аталыш топтому',
-'invert' => 'ТандалгандÑ\8b кайтар',
+'namespace' => 'Аталыштар мейкиндиги:',
+'invert' => 'Ð\91елгиленгенди кайтар',
 'blanknamespace' => '(Негизги)',
 
 # Contributions
@@ -680,7 +718,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'year' => 'Жылынан (жана андан мурун):',
 
 'sp-contributions-newbies' => 'Жаңы колдонуучулардын гана салымдарын көрсөт',
-'sp-contributions-blocklog' => 'Ñ\82оÑ\81моолоÑ\80дÑ\83н Ñ\82измеÑ\81и',
+'sp-contributions-blocklog' => 'тосмолордун тизмеси',
 'sp-contributions-uploads' => 'жүктөөлөр',
 'sp-contributions-logs' => 'тизме',
 'sp-contributions-talk' => 'талкуу',
@@ -715,7 +753,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'blocklink' => 'тосмоло',
 'unblocklink' => 'тосмолоону алып сал',
 'change-blocklink' => 'тосмолоону өзгөрт',
-'contribslink' => 'салымдар',
+'contribslink' => 'салымдары',
 'blocklogpage' => 'Тосмоолордун тизмеси',
 'blocklogentry' => '[[$1]] тосмолонду, тосмолоо мөөнөтү: $2 $3',
 'block-log-flags-nocreate' => 'Каттоо мүмкүн эмес',
@@ -745,7 +783,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Колдонуучу барагыңыз',
 'tooltip-pt-mytalk' => 'Талкуу барагыңыз',
-'tooltip-pt-preferences' => 'Ырастооңуздар',
+'tooltip-pt-preferences' => 'Ырастоолоруңуз',
 'tooltip-pt-watchlist' => 'Өзгөрүүлөрүн көзөмөлгө алган барактардын тизмеси',
 'tooltip-pt-mycontris' => 'Салымдарыңыздын тизмеси',
 'tooltip-pt-login' => 'Сизге системада катталууга сунуш кылынат, бирок милдеттүү эмес',
@@ -754,7 +792,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'tooltip-ca-edit' => 'Сиз бул баракты оңдой аласыз. Кичи пейилдикке, сактоодон мурда алдын ала көрсөтүү нукуурун колдонуңуз.',
 'tooltip-ca-addsection' => 'Жаңы бөлүм башта',
 'tooltip-ca-viewsource' => 'Бул барак корголгон.
\91айкоого Ð°Ñ\87Ñ\8bлаÑ\82.',
¡Ð¸Ð· Ð°Ð½Ñ\8bн ÐºÐ°Ð¹Ð½Ð°Ñ\80Ñ\8bн ÐºÓ©Ñ\80Ó© Ð°Ð»Ð°Ñ\81Ñ\8bз',
 'tooltip-ca-history' => 'Бул барактын мурунку оңдоолору',
 'tooltip-ca-protect' => 'Бул баракты корго',
 'tooltip-ca-delete' => 'Бул баракты өчүр',
@@ -762,7 +800,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'tooltip-ca-watch' => 'Бул баракты көзөмөл тизмеңизге кошуңуз',
 'tooltip-ca-unwatch' => 'Бул баракты көзөмөл тизмеңизден алып салыңыз',
 'tooltip-search' => '{{SITENAME}} изде',
-'tooltip-search-go' => 'УÑ\88Ñ\83л Ð°Ñ\82алÑ\8bÑ\88 Ð¼ÐµÐ½ÐµÐ½ Ð±Ð°Ñ\80ак Ð±Ð°Ñ\80 Ð±Ð¾Ð»Ñ\81о, Ð°Ð»Ð³Ð°',
+'tooltip-search-go' => 'Так Ñ\83Ñ\88Ñ\83ндай Ð°Ñ\82алÑ\8bÑ\88Ñ\82агÑ\8b Ð±Ð°Ñ\80акÑ\82Ñ\8b ÐºÓ©Ñ\80Ñ\81Ó©Ñ\82',
 'tooltip-search-fulltext' => 'Ушул текст менен барактарды изде',
 'tooltip-p-logo' => 'Башбаракка кайрыл',
 'tooltip-n-mainpage' => 'Башбаракка кайрыл',
@@ -786,7 +824,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'tooltip-ca-nstab-special' => 'Бул атайын барак, аны оңдой албайсыз',
 'tooltip-ca-nstab-project' => 'Долбоор барагын кара',
 'tooltip-ca-nstab-image' => 'Файл барагын көрсөт',
-'tooltip-ca-nstab-template' => 'ШаблондÑ\83 көрсөт',
+'tooltip-ca-nstab-template' => 'Ð\9aалÑ\8bпÑ\82Ñ\8b көрсөт',
 'tooltip-ca-nstab-category' => 'Категория барагын көрсөт',
 'tooltip-minoredit' => 'Муну майда оңдоо деп белгиле',
 'tooltip-save' => 'Өзгөртүүлөрдү сактап кой',
@@ -825,10 +863,10 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 
 # Metadata
 'metadata' => 'Метамаалыматтар',
-'metadata-help' => 'Ð\91Ñ\83л Ñ\84айл Ð±Ð°Ð»ÐºÐ¸Ð¼ Ñ\81анаÑ\80ип ÐºÐ°Ð¼ÐµÑ\80адан Ð¶Ðµ Ñ\81каннеÑ\80ден ÐºÐ¾Ñ\88Ñ\83лган ÐºÐ¾Ñ\88Ñ\83мÑ\87а Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82 камтыйт. 
-Эгерде файл баштапкы абалынан соң өзгөртүлсө, анда кээ бир мүнөздөгүчтөрү толук түрдө дал келбеши мүмкүн.',
-'metadata-fields' => 'Төмөндө тизмеленген сүрөт метамаалыматтарынын саптары метамаалыматтардын жадыбалы түрүлгөндө сүрөт барагына кошумчаланат.
-Калгандары сөз байлашуу менен жашырылат.
+'metadata-help' => 'Ð\91Ñ\83л Ñ\84айл Ð°Ð´Ð°Ñ\82Ñ\82а Ñ\81анаÑ\80ип ÐºÐ°Ð¼ÐµÑ\80а Ð¶Ðµ Ñ\81каннеÑ\80 ÐºÐ¾Ñ\88Ñ\83Ñ\83Ñ\87Ñ\83 Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82Ñ\82аÑ\80дÑ\8b камтыйт. 
+Эгерде файл баштапкы абалынан өзгөртүлсө, анда анын кээ бир сыпаттары толук чагылдырылбашы мүмкүн.',
+'metadata-fields' => 'Төмөндө тизмеленген сүрөт метамаалыматтарынын саптары метамаалыматтардын жадыбалы түрүлүү учурда сүрөт барагына кошумчаланат.
+Калгандары баштапкы абалда (өзгөртүлбөсө) көргөзүлбөйт.
 * make
 * model
 * datetimeoriginal
@@ -871,7 +909,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'watchlisttools-raw' => 'Жетиле элек көзөмөл тизмени оңдо',
 
 # Core parser functions
-'duplicate-defaultsort' => '\'\'\'Ð\90байлаÑ\82Ñ\83Ñ\83:\'\'\' "$2" белгиленген ылгоочу ачкыч "$1" мурунку белгиленген ылгоочу ачкычты жокко чыгарат.',
+'duplicate-defaultsort' => '\'\'\'ЭÑ\81кеÑ\80Ñ\82Ò¯Ò¯:\'\'\' "$2" белгиленген ылгоочу ачкыч "$1" мурунку белгиленген ылгоочу ачкычты жокко чыгарат.',
 
 # Special:Version
 'version' => 'Версия',
index 3059c11..961b81f 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Amahoney
  * @author Andrew Dalby
  * @author Dferg
  * @author Esteban97
@@ -171,15 +172,15 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Paginarum segmenta dextero percussu in titulis redigenda (JavaScript poscitur)',
 'tog-showtoc' => 'Indicem plurium quam III segmentorum paginis praebere',
 'tog-rememberpassword' => 'Memorare tesserae meae hoc in navigatro inter conventa ({{PLURAL:$1|die|diebus}} $1 tenus)',
-'tog-watchcreations' => 'Paginas quas creo in paginarum custoditarum indicem addere',
-'tog-watchdefault' => 'Paginas quas recenseo in paginarum custoditarum indicem addere',
-'tog-watchmoves' => 'Paginas quas moveo in paginarum custoditarum indicem addere',
-'tog-watchdeletion' => 'Paginas quas deleo in paginarum custoditarum indicem addere',
+'tog-watchcreations' => 'Paginas quas creo et fasciculos quos impono in paginarum custoditarum indicem addere',
+'tog-watchdefault' => 'Paginas et fasciculos quos recenseo in paginarum custoditarum indicem addere',
+'tog-watchmoves' => 'Paginas et fasciculos quos moveo in paginarum custoditarum indicem addere',
+'tog-watchdeletion' => 'Paginas et fasciculos quos deleo in paginarum custoditarum indicem addere',
 'tog-minordefault' => 'Notare omnes recensiones quasi minores',
 'tog-previewontop' => 'Monstrare praevisum ante capsam recensiti, non post ipsam',
 'tog-previewonfirst' => 'Praevisum monstrare recensione incipiente',
 'tog-nocache' => 'Sistere paginas apothecare',
-'tog-enotifwatchlistpages' => 'Mittere mihi litteras electronicas si pagina a me custodita mutatur',
+'tog-enotifwatchlistpages' => 'Mittere mihi litteras electronicas si pagina a me custodita vel fasciculus a me custoditus mutatur',
 'tog-enotifusertalkpages' => 'Mittere mihi litteras electronicas si mea disputatio mutatur',
 'tog-enotifminoredits' => 'Mittere mihi litteras electronicas etiam pro recensionibus minoribus',
 'tog-enotifrevealaddr' => 'Monstrare inscriptio mea electronica in nuntiis notificantibus',
@@ -399,6 +400,10 @@ Vide [[Special:Version|paginam versionis]].',
 'youhavenewmessages' => 'Habes $1 ($2).',
 'newmessageslink' => 'nuntia nova',
 'newmessagesdifflink' => 'dissimilia post mutationem ultimam',
+'youhavenewmessagesfromusers' => 'Habes $1 ab {{PLURAL:$3|uno usore alio|usoribus $3}} ($2).',
+'youhavenewmessagesmanyusers' => 'Habes $1 a multis usoribus ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|nuntium novum|nuntia nova}}',
+'newmessagesdifflinkplural' => 'dissimilitudo post mutationem ultimam',
 'youhavenewmessagesmulti' => 'Habes nuntia nova in $1',
 'editsection' => 'recensere',
 'editold' => 'recensere',
@@ -512,7 +517,7 @@ Noli oblivisci [[Special:Preferences|praeferentias tuas]] apud {{grammar:accusat
 'createaccount' => 'Rationem novam creare',
 'gotaccount' => "Habesne iam rationem? '''$1'''.",
 'gotaccountlink' => 'Conventum aperi',
-'userlogin-resetlink' => 'Tesserae tuae oblitus esne?',
+'userlogin-resetlink' => 'Num tesserae tuae oblitus es?',
 'createaccountmail' => 'ab inscriptione electronica',
 'createaccountreason' => 'Causa:',
 'badretype' => 'Tesserae quas scripsisti inter se non congruunt.',
@@ -521,7 +526,7 @@ Nomen usoris alium selige.',
 'loginerror' => 'Error factus est in aperiendo conventum',
 'nocookiesnew' => "Ratio usoris creata est, sed conventum non apertum est. {{SITENAME}} ''Cookies'' utitur in usorum conventa aperiendo. Cookies tua debiles sunt. Eis potestatem fac, tum conventum aperi cum nomine usoris tesseraque tua nova.",
 'nocookieslogin' => "{{SITENAME}} ''Cookies'' utitur in usorum conventa aperiendo. Cookies tua debiles sunt. Eis potestatem fac, tum conare denuo.",
-'noname' => 'Nominem usoris ratum non designavisti.',
+'noname' => 'Nomen usoris ratum non designavisti.',
 'loginsuccesstitle' => 'Conventum prospere apertum est',
 'loginsuccess' => "'''Apud {{grammar:accusative|{{SITENAME}}}} agnosceris nomine \"\$1\".'''",
 'nosuchuser' => 'Usor "$1" non est.
@@ -665,7 +670,7 @@ aut [{{fullurl:{{FULLPAGENAME}}|action=edit}} hanc paginam creare]</span>.',
 'userpage-userdoesnotexist' => 'Usor "<nowiki>$1</nowiki>" non est. Visne re vera hanc paginam creare vel recensere?',
 'updated' => '(Novata)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Memento hanc paginam solum praevisum esse, neque iam servatam!'''",
+'previewnote' => "'''Memento hanc paginam solum praevisam esse, neque iam servatam!'''",
 'editing' => 'Recensio paginae "$1"',
 'creating' => 'Creans $1',
 'editingsection' => 'Recensens $1 (partem)',
@@ -807,6 +812,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'compareselectedversions' => 'Conferre emendationes selectas',
 'showhideselectedversions' => 'Monstrare/celare emendationes selectas',
 'editundo' => 'abrogare',
+'diff-multi' => '(Inter has {{PLURAL:$1|una emendatio|$1 emendationes}} ab {{PLURAL:$2|uno usore|$2 usoribus}} {{PLURAL:$1|facta|factae}} non {{PLURAL:$1|videtur|videntur}})',
 
 # Search results
 'searchresults' => 'Eventum investigationis',
@@ -1121,9 +1127,9 @@ Si vis id dare, opera tua tibi ascribentur.',
 Ut fasciculos antea impositos videas aut quaeras, adi ad [[Special:FileList|indicem fasciculorum impositorum]]. Fasciculi impositi et deleti quoque in [[Special:Log/upload|notatione fasciculorum impositorum]] notantur.
 
 Ad fasciculum in pagina includendum, utere nexu:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fasciculus.jpg]]</nowiki></tt>''' aut
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fasciculus.png|verba alia]]</nowiki></tt>''' aut
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fasciculus.ogg]]</nowiki></tt>''' pro nexum ad fasciculum directum.",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fasciculus.jpg]]</nowiki></code>''' aut
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fasciculus.png|verba alia]]</nowiki></code>''' aut
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fasciculus.ogg]]</nowiki></code>''' pro nexum ad fasciculum directum.",
 'upload-permitted' => 'Genera fasciculorum licita: $1.',
 'upload-preferred' => 'Genera fasciculorum suasa: $1.',
 'upload-prohibited' => 'Typi fasciculorum vetiti: $1.',
@@ -1162,7 +1168,7 @@ Vide etiam [[Special:NewFiles|pinacothecam fasciculorum recentissimorum imposito
 'upload-unknown-size' => 'Magnitudo ignota',
 
 'license' => 'Typus permissionis:',
-'license-header' => 'Typus permissionis:',
+'license-header' => 'Potestas usoris',
 'nolicense' => 'Nulla selecta',
 'license-nopreview' => '(Praevisum monstrari non potest)',
 
@@ -1555,6 +1561,8 @@ Adfirma quaesumus te paginam re vera delere velle, te consequentias intellere, e
 'rollback' => 'Reverti mutationes',
 'rollback_short' => 'Reverti',
 'rollbacklink' => 'reverti',
+'rollbacklinkcount' => 'reverti {{PLURAL:$1|unam recensionem|$1 recensiones}}',
+'rollbacklinkcount-morethan' => 'reverti plus quam {{PLURAL:$1|unam recensionem|$1 recensiones}}',
 'rollbackfailed' => 'Reversum defecit',
 'cantrollback' => 'Haec non potest reverti; conlator proximus solus auctor huius rei est.',
 'alreadyrolled' => 'Ad emendationem proximam paginae [[:$1]] ab usore [[User:$2|$2]] ([[User talk:$2|Disputatio]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) reverti non potest; alius paginam iam recensuit vel revertit.
index fc9b562..f2bccbf 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author ILVI
+ * @author Jewbask
  * @author Remember the dot
  * @author Runningfridgesrule
  * @author Taichi
@@ -171,12 +172,12 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#DIRIJAR', '#DIRECCIÓN', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
-       'fullpagename'            => array( '1', 'NOMBREDEHOJACOMPLETA', 'NOMBREDEPÁGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÁGINAENTERA', 'NOMBREDEPAGINAENTERA', 'NOMBRECOMPLETODEPÁGINA', 'NOMBRECOMPLETODEPAGINA', 'FULLPAGENAME' ),
-       'subpagename'             => array( '1', 'NOMBREDEHOJICA', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÁGINA', 'SUBPAGENAME' ),
-       'msg'                     => array( '0', 'MSJ:', 'MSG:' ),
-       'img_left'                => array( '1', 'cierda', 'izquierda', 'izda', 'izq', 'left' ),
-       'img_none'                => array( '1', 'dinguna', 'dinguno', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
+       'redirect'                  => array( '0', '#DIRIJAR', '#DIRECCIÓN', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+       'fullpagename'              => array( '1', 'NOMBREDEHOJACOMPLETA', 'NOMBREDEPÁGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÁGINAENTERA', 'NOMBREDEPAGINAENTERA', 'NOMBRECOMPLETODEPÁGINA', 'NOMBRECOMPLETODEPAGINA', 'FULLPAGENAME' ),
+       'subpagename'               => array( '1', 'NOMBREDEHOJICA', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÁGINA', 'SUBPAGENAME' ),
+       'msg'                       => array( '0', 'MSJ:', 'MSG:' ),
+       'img_left'                  => array( '1', 'cierda', 'izquierda', 'izda', 'izq', 'left' ),
+       'img_none'                  => array( '1', 'dinguna', 'dinguno', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
 );
 
 $messages = array(
@@ -474,6 +475,7 @@ Si puede ser mete un [[Special:ListUsers/sysop|administrador]] en corriente y ta
 'missingarticle-rev' => '(nº. de revisión: $1)',
 'missingarticle-diff' => '(Dif.: $1, $2)',
 'filecopyerror' => 'No se pudo copiar el arxiv "$1" a "$2".',
+'badtitle' => 'Titolo malo',
 'badtitletext' => 'El título de la hoja demandada está vazío, no es valible, o es un link interlingua o interwiki incorrecto.
 Puede ser que contiene uno o más caracteres que no se pueden usar en los títulos.',
 'viewsource' => 'Ver su manadero',
@@ -481,9 +483,11 @@ Puede ser que contiene uno o más caracteres que no se pueden usar en los títul
 # Login and logout pages
 'yourname' => 'Su nombre de usuario',
 'yourpassword' => 'Parola',
+'yourpasswordagain' => 'Entra de muevo la parola',
 'remembermypassword' => 'Acórdate de mi entrada de usador en este bilgisayar/orddênador (por un maksimum de {{PLURAL:$1|día|días}})',
 'login' => 'Entrar',
 'nav-login-createaccount' => 'Entrar / Crîar un cuento',
+'loginprompt' => 'Kale tener "cookies" aktivadas enel navegador para enrejistrarse en {{SITENAME}}',
 'userlogin' => 'Entrar / Registrarse',
 'logout' => 'Salir',
 'userlogout' => 'Salir',
@@ -492,6 +496,7 @@ Puede ser que contiene uno o más caracteres que no se pueden usar en los títul
 'createaccount' => 'Crea un nuevo cuento',
 'gotaccount' => "¿Ya tienes un cuento? '''$1'''.",
 'gotaccountlink' => 'Entrar',
+'userlogin-resetlink' => 'Olvidates tus detalyos de akseso?',
 'createaccountmail' => 'por una letra electrónica',
 'userexists' => 'El nombre que entrates ya se usa.
 Si puede ser, escoge un otro nombre.',
@@ -568,7 +573,8 @@ Puedes [[Special:Search/{{PAGENAME}}|buscar este títůlo de hoja]] en otras hoj
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los rejistros relasyonados]</span>.',
 'userpage-userdoesnotexist-view' => 'El cuento del usador $1 no está enrejistrado.',
 'note' => "'''Nota:'''",
-'previewnote' => "'¡Acórdate que esto es sólo una previsualización y daínda no se registró!'''",
+'previewnote' => "¡Akórdate ke esto es sólo una previsualizasion i aínda no se enrejistró!'''
+Los tus trokamientos no se tienen guadrados!",
 'editing' => 'Trocando $1',
 'editingsection' => 'Trocando $1 (sección)',
 'editingcomment' => 'Trocando $1 (kapítůlo)',
@@ -582,17 +588,26 @@ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'hiddencategories' => 'Esta hoja es un miembro de {{PLURAL:$1|1 kateggoría escondida|$1 kateggorías escondidas}}:',
 'nocreate-loggedin' => 'No tienes el permisso de creas hojas nuevas.',
 'permissionserrorstext-withaction' => 'No tienes el permiso para $2, por las {{PLURAL:$1|razón|razones}} venideras:',
+'recreate-moveddeleted-warn' => "'''Aviso: Estas kriando una oja la kuala fue efassada antes.'''
+Kale ke penses si es menesterozo editar esta oja.
+El enrejistro de efassado i taxireado para esta oja puede ser meldado aki:",
+'moveddeleted-notice' => "Esta ója fue efassada.
+El ''log'' de efassado i taxireado de la ója es amostrado abasho para dar referensia.",
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Avizo:''' La contenencia de xablon está muy grande.
 Algunos xablones no van á ser comprendidos.",
 'post-expand-template-inclusion-category' => 'Hojas ande la contenencia de xablones está sovrepassada',
+'post-expand-template-argument-warning' => "'''Aviso:''' Esta oja tiene kuanto menos un kampo enel xablon muy lungo.
+Este o estos kampos no van ser amostrados",
+'post-expand-template-argument-category' => 'Ojas ke tienen xablones kon parametros no uzados',
 
 # History pages
 'viewpagelogs' => 'Ver los registros de esta hoja',
 'currentrev' => "Enderechamiento d'al cavo",
 'currentrev-asof' => 'Enderechamiento de alcavo á las $1',
 'revisionasof' => 'Enderechamiento á las $1',
+'revision-info' => 'Revision en data $1 por $2',
 'previousrevision' => '← Enderechamiento de antes',
 'nextrevision' => 'Rêvisión venidera →',
 'currentrevisionlink' => 'Revisión actual',
@@ -613,6 +628,7 @@ Leyenda: (act) = diferencias con la versión actual,
 
 # Revision feed
 'history-feed-title' => 'Îstoria de nderechamientos',
+'history-feed-item-nocomment' => '$1 en $2',
 
 # Revision deletion
 'rev-delundel' => 'mostra/esconde',
@@ -635,10 +651,11 @@ Leyenda: (act) = diferencias con la versión actual,
 'revertmerge' => 'Apartar',
 
 # Diffs
-'history-title' => 'Istoria de revisiones para «$1»',
+'history-title' => 'Istorya de trokamientos para «$1»',
 'lineno' => 'Shurá $1:',
 'compareselectedversions' => 'Comparar versiones escogidas',
 'editundo' => 'deshaze',
+'diff-multi' => '(No {{PLURAL:$1|es amostrado un trokamiento intermedio echo|son amostrados $1 trokamientos intermedios echos}} por {{PLURAL:$2|un usador|$2 usadores}})',
 
 # Search results
 'searchresults' => 'Resultados de la búsqueda',
@@ -654,6 +671,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'nextn-title' => '$1 {{PLURAL:$1|resultado|resultados}} venideros',
 'shown-title' => 'Àmostrar $1 {{PLURAL:$1|resultado|resultados}} por hoja',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-exists' => 'Egziste una oja yamada "[[:$1]]" en esta viki',
 'searchmenu-new' => "'''Crîar la hoja «[[:$1]]» en esta viki!'''",
 'searchhelp-url' => 'Help:Ayudo',
 'searchprofile-articles' => 'Hojas de contènido',
@@ -667,6 +685,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'searchprofile-everything-tooltip' => 'Buscar en todo el contènido (y también hojas de diskusyón)',
 'searchprofile-advanced-tooltip' => 'Buscar en espacios de nombres particůlares',
 'search-result-size' => '$1 ({{PLURAL:$2|1 biervo|$2 biervos}})',
+'search-result-category-size' => '{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 basho-kateggoria|$2 basho-kateggoria}}, {{PLURAL:$3|1 dossia|$3 dossias}})',
 'search-redirect' => '(direksión desde $1)',
 'search-section' => '(capítůlo $1)',
 'search-suggest' => 'Quisites dezir: $1',
@@ -675,6 +694,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'search-interwiki-more' => '(más)',
 'search-mwsuggest-enabled' => 'con consejos',
 'search-mwsuggest-disabled' => 'no ay consejos',
+'searchrelated' => 'lisionado',
 'searchall' => 'todos',
 'showingresultsheader' => "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1-$2''' de '''$3'''}} para '''$4'''",
 'nonefound' => "'''Nota''': Por defecto sólo se busca en algunos espacios de nombre.
@@ -716,6 +736,8 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
 'yourlanguage' => 'Lingua:',
 'yournick' => 'Firma mueva:',
 'email' => 'Letral',
+'prefs-help-email' => 'El adreso de e-posta es menester para alimpiar la tu parola, si la olvidates',
+'prefs-help-email-others' => 'Endemas puedes eskojer si keres dar pueder a otros usadores de azer kontakto kon ti por modre de e-posta, a  traverso de un atamiento en tus ojas de usador i de diskusyon.',
 'prefs-signature' => 'Firma',
 
 # Groups
@@ -745,13 +767,18 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
 'recentchanges-legend' => 'Opciones encima de los trocamientos frescos',
 'recentchanges-summary' => 'Perseguid en esta hoja, los trocamientos de alcabo realizados en la Viki.',
 'recentchanges-feed-description' => 'Perseguir los trocamientos más nuevos en el viki en este feed.',
+'recentchanges-label-newpage' => 'Este trokamiento krio una mueva ója',
 'recentchanges-label-minor' => 'Esta es un trocamiento chiquitico',
+'recentchanges-label-bot' => 'Este trokamiento fue echo por un bot',
+'recentchanges-label-unpatrolled' => 'Estre trokamiento no esta akavidado',
 'rcnote' => "Debaxo {{PLURAL:$1|ay '''1''' trocamiento realizado|están los dal cabo '''$1''' trocamientos realizados}} en  {{PLURAL:$2|el dal cabo día|los dal cabo '''$2''' días}}, hasta el $4, $5.",
+'rcnotefrom' => "Debasho se amostran los trokamientos desde '''$2''' (amostrados fina <b>$1</b>)",
 'rclistfrom' => 'Mostra los trocamientos nuevos empeçando desde $1',
 'rcshowhideminor' => '$1 trocamientos chiquiticos',
 'rcshowhidebots' => '$1 bots',
 'rcshowhideliu' => '$1 empleadores enrējjistrados',
 'rcshowhideanons' => '$1 empleadores anonimes',
+'rcshowhidepatr' => '$1 trokamientos akavidados',
 'rcshowhidemine' => '$1 mis ediciones',
 'rclinks' => 'Ver los dal cabo $1 trocamientos en los dal cabo $2 días.<br />$3',
 'diff' => 'dif',
@@ -769,6 +796,7 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
 'recentchangeslinked-feed' => 'Trocamientos conectados',
 'recentchangeslinked-toolbox' => 'Trocamientos relatados',
 'recentchangeslinked-title' => 'Los trocamientos relacionados con "$1"',
+'recentchangeslinked-noresult' => 'Sin trokamientos en las ójas atadas en la data demandada',
 'recentchangeslinked-summary' => "Esto es la lista de los trocamientos de alcavo de las hojas que relatan á una hoja spēcifik (ou de los miembros de la katēggoría spēcifikada).
 Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con letras grexas'''.",
 'recentchangeslinked-page' => 'Nombre de la hoja',
@@ -780,6 +808,9 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con
 'filedesc' => 'Somario',
 'uploadedimage' => 'subió «[[$1]]»',
 
+'license' => 'Lesensia:',
+'license-header' => 'Lesensiamyénto',
+
 # Special:ListFiles
 'listfiles_name' => 'Nombre',
 'listfiles_user' => 'Usuario',
@@ -789,6 +820,7 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con
 'file-anchor-link' => 'Archivo',
 'filehist' => 'La storia del dosya',
 'filehist-help' => 'Klika encima de una data/ora para vel el arxivo de esta data.',
+'filehist-revert' => 'aboltar',
 'filehist-current' => 'actual',
 'filehist-datetime' => 'Data/Ora',
 'filehist-thumb' => 'Minyatura',
@@ -799,6 +831,7 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con
 'filehist-comment' => 'Comentario',
 'imagelinks' => 'El uso del dosya',
 'linkstoimage' => '{{PLURAL:$1|La hoja venidera da link|Las hojas venideras dan link}} a este arxivo:',
+'nolinkstoimage' => 'Dinguna ója tiene atamientos a esta imej',
 'sharedupload' => 'Este arxivo es de $1 i puede ser usado por otros proyectos.',
 'sharedupload-desc-here' => 'Esta hoja es de $1 y puede ser usado por otros projetos.
 La descripción en su [$2 hoja de descripción del arxivo] está amostrada debaxo.',
@@ -810,10 +843,13 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 # Statistics
 'statistics' => 'Estatísticas',
 
+'disambiguationspage' => 'Template:Aklarasion',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|baytes}}',
 'nmembers' => '$1 {{PLURAL:$1|miembro|miembros}}',
 'prefixindex' => 'Todas las hojas con prefixo',
+'usercreated' => '{{GENDER:$3|Enrejistrado|Enrejistrada}} el $1 a las $2',
 'newpages' => 'Hojas muevas',
 'ancientpages' => 'Artikolos mas viejos',
 'move' => 'taxirea',
@@ -847,6 +883,7 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 
 # Special:LinkSearch
 'linksearch' => 'Linkes eksternos',
+'linksearch-line' => 'Atamiento para $1 en la ója $2',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Registro de creación de usuarios',
@@ -860,6 +897,7 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 # Watchlist
 'watchlist' => 'Mi lista de escogidas',
 'mywatchlist' => 'Mi lista de akavidamientos',
+'watchlistfor2' => 'Para $1 $2',
 'addedwatchtext' => "La hoja «[[:$1]]» fue ajustada a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta hoja i en tu hoja de diskussión associada se van indicar aí, i la hoja va aparecer '''gordo''' en la hoja de [[Special:RecentChanges|trocamientos freskos]] para hazerla más kolay de detektar.
 
 Cuando queres eliminar la hoja de tu lista de escogidas, piza «Dexar de cudiar» en el menú.",
@@ -882,6 +920,7 @@ en forma turable, ansí como todo su istoria.
 Si puede ser, confirma que de verdad queres hazer esto, que estás entendiendo las
 resultados, i que lo estás haziendo de acorddo con las [[{{MediaWiki:Policy-url}}|Políticas]].',
 'actioncomplete' => 'Aksion kompleta',
+'actionfailed' => 'Aksiyon sin reushitá',
 'deletedtext' => '"$1" fue efassado.
 Mira $2 para un registro de los efassados nuevos.',
 'dellogpage' => 'Registro de efassados',
@@ -940,9 +979,12 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 
 'sp-contributions-newbies' => 'Mostrar solo las ajustamientos de los usuarios nuevos',
 'sp-contributions-blocklog' => 'registro de bloqueos',
-'sp-contributions-talk' => 'Diścutir',
+'sp-contributions-uploads' => 'suvidas',
+'sp-contributions-logs' => 'enrejistros',
+'sp-contributions-talk' => 'Diskusyón',
 'sp-contributions-search' => 'Buscar ajustamientos',
 'sp-contributions-username' => 'Dirección IP o nombre de usuario:',
+'sp-contributions-toponly' => "Amostrar solo revisiones d'alkavo",
 'sp-contributions-submit' => 'Buscar',
 
 # What links here
@@ -950,15 +992,17 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'whatlinkshere-title' => 'Hojas que dan link a "$1"',
 'whatlinkshere-page' => 'Hoja:',
 'linkshere' => "Las hojas venideras dan link a '''[[:$1]]''':",
+'nolinkshere' => "Dinguna ója tiene atamientos kon '''[[:$1]]'''",
 'isredirect' => 'Hoja redirigida',
 'istemplate' => 'inclusión',
-'isimage' => 'Link del image',
+'isimage' => 'Atamiento de la dossia',
 'whatlinkshere-prev' => '{{PLURAL:$1|de antes|de antes $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|venidera|venideras $1}}',
 'whatlinkshere-links' => '← linkes',
 'whatlinkshere-hideredirs' => '$1 redirecciones',
 'whatlinkshere-hidetrans' => '$1 inclusiones',
 'whatlinkshere-hidelinks' => '$1 linkes',
+'whatlinkshere-hideimages' => '$1 atamientos a imejes',
 'whatlinkshere-filters' => 'Filtres',
 
 # Block/unblock
@@ -1019,6 +1063,7 @@ Si puede ser, escoge otro nombre.',
 
 # Thumbnails
 'thumbnail-more' => 'Engrandece',
+'thumbnail_error' => 'Yerro kriando la imej chika: $1',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Tu hoja de usador',
@@ -1188,6 +1233,9 @@ Los otros campos se van a guardar por defecto.
 'watchlisttools-edit' => 'Ver i trocar tu lista de escogidas',
 'watchlisttools-raw' => 'Troca tu lista de escogidas en crudo',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Aviso:\'\'\' la klave primaria para ordenamiento "$2" anula la primera "$1"',
+
 # Special:Version
 'version' => 'Versión',
 'version-specialpages' => 'Pajinas espesiales',
@@ -1207,6 +1255,16 @@ Los otros campos se van a guardar por defecto.
 'specialpages' => 'Hojas especiales',
 'specialpages-group-users' => 'Usadores y derechos',
 
+# External image whitelist
+'external_image_whitelist' => ' #Desha esta linea ansina komo esta<pre>
+#Mete partes de frasas (solo la parte ke va entre los //) enbasho
+#Eyas van ser komparadas kon las URLs de las dossias ekternas (hotlinked)
+#Akeyos iguales van ser amostrados komo una imej; si no, solo el su atamientoque 
+#Las lineas ke empiezan kor «#» son konsideradas komentarios
+#Esta no aze diferente el senso se la letra
+
+#Mete todas las partes de frasas regex enriva de esta linea. Desha esta ansina komo se topa</pre>',
+
 # Special:Tags
 'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
 'tag-filter-submit' => 'Filtro',
index d813b7a..36efed7 100644 (file)
@@ -27,7 +27,7 @@ $namespaceNames = array(
        NS_TALK             => 'Diskussioun',
        NS_USER             => 'Benotzer',
        NS_USER_TALK        => 'Benotzer_Diskussioun',
-       NS_PROJECT_TALK     => '$1 Diskussioun',
+       NS_PROJECT_TALK     => '$1_Diskussioun',
        NS_FILE             => 'Fichier',
        NS_FILE_TALK        => 'Fichier_Diskussioun',
        NS_MEDIAWIKI        => 'MediaWiki',
@@ -147,31 +147,36 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#VIRULEEDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
-       'numberofpages'           => array( '1', 'Säitenzuel', 'SEITENANZAHL', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'Artikelen', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'Fichieren', 'DATEIANZAHL', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'Benotzerzuel', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'Aktiv_Benotzer', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
-       'pagename'                => array( '1', 'Säitennumm', 'SEITENNAME', 'PAGENAME' ),
-       'namespace'               => array( '1', 'Nummraum', 'NAMENSRAUM', 'NAMESPACE' ),
-       'subjectspace'            => array( '1', 'Haaptnummraum', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectpagename'         => array( '1', 'Haaptsäit', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'img_thumbnail'           => array( '1', 'Miniatur', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
-       'img_right'               => array( '1', 'riets', 'rechts', 'right' ),
-       'img_left'                => array( '1', 'lénks', 'links', 'left' ),
-       'img_none'                => array( '1', 'ouni', 'ohne', 'none' ),
-       'img_center'              => array( '1', 'zentréiert', 'zentriert', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'gerummt', 'gerahmt', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'net_gerummt', 'rahmenlos', 'frameless' ),
-       'img_page'                => array( '1', 'Säit=$1', 'Säit_$1', 'seite=$1', 'seite $1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'bord', 'rand', 'border' ),
-       'img_top'                 => array( '1', 'uewen', 'oben', 'top' ),
-       'grammar'                 => array( '0', 'GRAMMAIRE', 'GRAMMATIK:', 'GRAMMAR:' ),
-       'plural'                  => array( '0', 'PLURAL', 'PLURAL:' ),
-       'formatnum'               => array( '0', 'ZUELEFORMAT', 'ZAHLENFORMAT', 'FORMATNUM' ),
-       'special'                 => array( '0', 'spezial', 'special' ),
-       'hiddencat'               => array( '1', '__VERSTOPPT_KATEGORIE__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
+       'redirect'                  => array( '0', '#VIRULEEDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
+       'numberofpages'             => array( '1', 'Säitenzuel', 'SEITENANZAHL', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'Artikelen', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'Zuel_vu_Fichieren', 'DATEIANZAHL', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'Benotzerzuel', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'Aktiv_Benotzer', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
+       'pagename'                  => array( '1', 'Säitennumm', 'SEITENNAME', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'Nummraum', 'NAMENSRAUM', 'NAMESPACE' ),
+       'subjectspace'              => array( '1', 'Haaptnummraum', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectpagename'           => array( '1', 'Haaptsäit', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'img_thumbnail'             => array( '1', 'Miniatur', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
+       'img_right'                 => array( '1', 'riets', 'rechts', 'right' ),
+       'img_left'                  => array( '1', 'lénks', 'links', 'left' ),
+       'img_none'                  => array( '1', 'ouni', 'ohne', 'none' ),
+       'img_center'                => array( '1', 'zentréiert', 'zentriert', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'gerummt', 'gerahmt', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'net_gerummt', 'rahmenlos', 'frameless' ),
+       'img_page'                  => array( '1', 'Säit=$1', 'Säit_$1', 'seite=$1', 'seite $1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'bord', 'rand', 'border' ),
+       'img_top'                   => array( '1', 'uewen', 'oben', 'top' ),
+       'img_bottom'                => array( '1', 'ënnen', 'unten', 'bottom' ),
+       'grammar'                   => array( '0', 'GRAMMAIRE', 'GRAMMATIK:', 'GRAMMAR:' ),
+       'plural'                    => array( '0', 'PLURAL', 'PLURAL:' ),
+       'currentversion'            => array( '1', 'AKTUELL_VERSIOUN', 'JETZIGE_VERSION', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#SPROOCH:', '#SPRACHE:', '#LANGUAGE:' ),
+       'formatnum'                 => array( '0', 'ZUELEFORMAT', 'ZAHLENFORMAT', 'FORMATNUM' ),
+       'special'                   => array( '0', 'spezial', 'special' ),
+       'hiddencat'                 => array( '1', '__VERSTOPPT_KATEGORIE__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
+       'pagesincategory_pages'     => array( '0', 'Säiten', 'pages' ),
+       'pagesincategory_files'     => array( '0', 'Fichieren', 'files' ),
 );
 
 $messages = array(
@@ -190,17 +195,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Eenzel Abschnitter mat Rietsklick änneren (JavaScript)',
 'tog-showtoc' => 'Inhaltsverzeechnes weise bei Säite mat méi wéi dräi Iwwerschrëften',
 'tog-rememberpassword' => 'Meng Umeldung mat dësem Browser(fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
-'tog-watchcreations' => 'Säiten déi ech nei uleeën automatesch op meng Iwwerwaachungslëscht setzen',
-'tog-watchdefault' => 'Säiten déi ech änneren op meng Iwwerwaachungslëscht setzen',
-'tog-watchmoves' => 'Säiten déi ech réckelen automatesch op meng Iwwerwaachungslëscht setzen',
-'tog-watchdeletion' => 'Säiten déi ech läschen op meng Iwwerwaachungslëscht setzen',
+'tog-watchcreations' => 'Säiten déi ech uleeën a Fichieren déi ech eroplueden op meng Iwwerwaachungslëscht derbäisetzen',
+'tog-watchdefault' => 'Säiten a Fichieren déi ech änneren op meng Iwwerwaachungslëscht derbäisetzen',
+'tog-watchmoves' => 'Säiten a Fichieren déi ech réckelen automatesch op meng Iwwerwaachungslëscht derbäisetzen',
+'tog-watchdeletion' => 'Säiten a Fichieren déi ech läschen op meng Iwwerwaachungslëscht derbäisetzen',
 'tog-minordefault' => "All Ännerungen automatesch als 'Kleng Ännerungen' markéieren.",
 'tog-previewontop' => "Déi ''nach-net gespäichert Versioun'' iwwer der Ännerungsfënster weisen",
 'tog-previewonfirst' => "Beim éischten Änneren déi  ''nach net gespäichert Versioun'' weisen.",
 'tog-nocache' => 'Säitecache vum Browser desaktivéieren',
-'tog-enotifwatchlistpages' => 'Schéckt mir eng E-Mail wann eng vun de Säiten op menger Iwwerwaachungslëscht geännert gëtt',
+'tog-enotifwatchlistpages' => 'Schéckt mir eng E-Mail wann eng Säit oder e Fichier op menger Iwwerwaachungslëscht geännert gëtt',
 'tog-enotifusertalkpages' => 'Schéckt mir E-Maile wa meng Diskussiounssäit geännert gëtt.',
-'tog-enotifminoredits' => 'Schéckt mir och bei klengen Ännerungen op vu mir iwwerwaachte Säiten eng E-Mail.',
+'tog-enotifminoredits' => 'Schéckt mir och bei klengen Ännerungen op vu mir iwwerwaachte Säiten oder Fichieren eng E-Mail.',
 'tog-enotifrevealaddr' => 'Meng E-Mailadress an de Benoriichtigungsmaile weisen.',
 'tog-shownumberswatching' => "D'Zuel vun de Benotzer déi dës Säit iwwerwaache weisen",
 'tog-oldsig' => 'Aktuell Ënnerschrëft:',
@@ -216,7 +221,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ännerunge vun ugemellte Benotzer verstoppen',
 'tog-watchlisthideanons' => 'Ännerunge vun anonyme Benotzer (IP-Adressen) verstoppen',
 'tog-watchlisthidepatrolled' => 'Iwwerkuckten Ännerungen op der Iwwerwaachungslëscht verstoppen',
-'tog-nolangconversion' => 'Ëmwandlung vu Sproochvarianten ausschalten',
 'tog-ccmeonemails' => 'Schéck mir eng Kopie vun de Mailen, déi ech anere Benotzer schécken.',
 'tog-diffonly' => "Weis bei Versiounsvergläicher just d'Ënnerscheeder an net déi ganz Säit",
 'tog-showhiddencats' => 'Verstoppt Kategorië weisen',
@@ -441,6 +445,10 @@ Kuckt d'[[Special:Version|Versiounssäit]].",
 'youhavenewmessages' => 'Dir hutt $1 ($2).',
 'newmessageslink' => 'nei Messagen',
 'newmessagesdifflink' => 'Lescht Ännerung',
+'youhavenewmessagesfromusers' => 'Dir hutt $1 vu(n) {{PLURAL:$3|engem anere Benotzer|$3 anere Benotzer}} ($2).',
+'youhavenewmessagesmanyusers' => 'Dir hutt $1 vu ville Benotzer ($2)',
+'newmessageslinkplural' => '{{PLURAL:$1|een neie Message|nei Message}}',
+'newmessagesdifflinkplural' => 'lescht {{PLURAL:$1|Ännerung|Ännerungen}}',
 'youhavenewmessagesmulti' => 'Dir hutt nei Messagen op $1',
 'editsection' => 'änneren',
 'editold' => 'änneren',
@@ -495,9 +503,9 @@ All Spezialsäiten déi et gëtt, sinn op der [[Special:SpecialPages|Lëscht vun
 'dberrortext' => 'En Datebank Syntax Feeler ass opgetrueden.
 Dëst kann op e Feeler an der Software hiweisen.
 De leschte versichten Datebank Query war:
-<blockquote><tt>$1</tt></blockquote>
-vun der Funktioun "<tt>$2</tt>".
-D\'Datebank huet de Feeler "<tt>$3: $4</tt>" gemellt.',
+<blockquote><code>$1</code></blockquote>
+vun der Funktioun "<code>$2</code>".
+D\'Datebank huet de Feeler "<samp>$3: $4</samp>" gemellt.',
 'dberrortextcl' => 'En Datebank Syntax Feeler ass opgetrueden.
 De leschten Datebank Query war:
 "$1"
@@ -534,6 +542,8 @@ Mellt dëst w.e.g. bei engem [[Special:ListUsers/sysop|Administrateur]] a vergie
 'cannotdelete' => 'D\'Bild oder d\'Säit "$1" konnt net geläscht ginn.
 Et ka sinn datt et scho vun engem Anere geläscht gouf.',
 'cannotdelete-title' => 'D\'Säit "$1" kann net geläscht ginn',
+'delete-hook-aborted' => "D'Läsche gouf vun enger Schnëttstell (hook) ofgebrach.
+Eng Erklärung gouf net ginn.",
 'badtitle' => 'Schlechten Titel',
 'badtitletext' => 'De gewënschten Titel ass net valabel, eidel, oder een net korrekten Interwiki Link.',
 'perfcached' => 'Dës Date kommen aus dem Tëschespäicher a si méiglecherweis net aktuell. Maximal {{PLURAL:$1|ee Resultat ass|$1 Resultater sinn}} am Tësche späicher disponibel.',
@@ -561,6 +571,8 @@ $2',
 'titleprotected' => "Eng Säit mat dësem Numm kann net ugeluecht ginn. Dës Spär gouf vum [[User:$1|$1]] gemaach deen als Grond ''$2'' uginn huet.",
 'invalidtitle-knownnamespace' => 'Net valabelen Titel mam Nummraum "$2" a mam Text "$3"',
 'invalidtitle-unknownnamespace' => 'Net valabelen Titel mat der onbekannter Nummraum-Zuel $1 a mam Text "$2"',
+'exception-nologin' => 'Net ageloggt',
+'exception-nologin-text' => 'Dës Säit oder Aktioun erfuerdert datt Dir op dëser Wiki ageloggt sidd.',
 
 # Virus scanner
 'virus-badscanner' => "Schlecht Configuratioun: onbekannte  Virescanner: ''$1''",
@@ -568,11 +580,11 @@ $2',
 'virus-unknownscanner' => 'onbekannten Antivirus:',
 
 # Login and logout pages
-'logouttext' => "'''Dir sidd elo ofgemellt.'''
+'logouttext' => "'''Dir sidd elo ausgeloggt.'''
 
-Dir kënnt {{SITENAME}} elo anonym benotzen, oder Iech [[Special:UserLogin|erëm umellen]].
+Dir kënnt {{SITENAME}} elo anonym benotzen, oder Iech [[Special:UserLogin|erëm aloggen]].
 
-Opgepasst: Op verschiddene Säite gesäit et nach esou aus, wéi wann Dir nach ugemellt wiert, bis Dir Ärem Browser säin Tëschespäicher (cache) eidel maacht.",
+Opgepasst: Op verschiddene Säite kann et nach esou aus gesinn, wéi wann Dir nach ageloggt wiert, bis Dir Ärem Browser säin Tëschespäicher (cache) eidel maacht.",
 'welcomecreation' => '== Wëllkomm, $1! ==
 Äre Kont gouf kreéiert.
 Denkt drun, Är [[Special:Preferences|{{SITENAME}}-Astellungen]] unzepassen.',
@@ -582,8 +594,9 @@ Denkt drun, Är [[Special:Preferences|{{SITENAME}}-Astellungen]] unzepassen.',
 'remembermypassword' => 'Meng Umeldung op dësem Computer (fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
 '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.',
 'externaldberror' => 'Entweder ass e Feeler bei der externer Authentifizéierung geschitt, oder Dir däerft Ären externe Benotzerkont net aktualiséieren.',
-'login' => 'Umellen',
+'login' => 'Aloggen',
 'nav-login-createaccount' => 'Aloggen / Benotzerkont uleeën',
 'loginprompt' => "Fir sech op {{SITENAME}} aloggen ze kënnen, mussen d'Cookien aktivéiert sinn.",
 'userlogin' => 'Aloggen / Benotzerkont uleeën',
@@ -682,7 +695,7 @@ Fir är Umeldung ofzeschléissen, musst Dir elo hei een neit Passwuert uginn:',
 'oldpassword' => 'Aalt Passwuert:',
 'newpassword' => 'Neit Passwuert:',
 'retypenew' => 'Neit Passwuert nach eemol antippen:',
-'resetpass_submit' => 'Passwuert aginn an umellen',
+'resetpass_submit' => 'Passwuert aginn an aloggen',
 'resetpass_success' => 'Äert Passwuert gouf geännert!
 Loggt Iech elo an ...',
 'resetpass_forbidden' => 'Passwierder kënnen net geännert ginn.',
@@ -828,7 +841,6 @@ Déi lescht Entrée am Logbuch vun de Späre steet als Referenz hei drënner:',
 * '''Firefox / Safari:''' Halt ''Shift'' während Dir ''Reload'' klickt oder dréckt entweder ''Ctrl-F5'' oder ''Ctrl-R'' (''⌘-R'' op engem Mac);
 * '''Google Chrome:''' Dréckt ''Ctrl-Shift-R'' (''⌘-Shift-R'' op engem Mac)
 * '''Internet Explorer:''' dréckt ''Ctrl'' während Dir op ''Refresh'' klickt oder dréckt ''Ctrl-F5.''
-* '''Konqueror:''' klickt  ''Reload'' oder dréckt ''F5'' 
 * '''Opera:''' maacht de Cache eidel an ''Tools → Preferences;''",
 'usercssyoucanpreview' => "'''Tipp:''' Benotzt de \"{{int:showpreview}}\"-Knäppchen, fir Ären neien CSS virum Späicheren ze testen.",
 'userjsyoucanpreview' => "'''Tipp:''' Benotzt de ''{{int:showpreview}}''-Knäppchen, fir Ären neie JavaScript virum Späicheren ze testen.",
@@ -932,6 +944,7 @@ Et däerfen net méi wéi $2 {{PLURAL:$2|Ufro|Ufroe}} sinn, aktuell {{PLURAL:$2|
 'parser-template-loop-warning' => 'Endlos Schleef an der Schabloun: [[$1]] entdeckt',
 'parser-template-recursion-depth-warning' => "D'Limit vun der Zuel vun de Verschachtelunge vu Schabloune gouf iwwerschratt ($1)",
 'language-converter-depth-warning' => "D'Limite vun der déift vun der Sproochëmwandlung gouf iwwerschratt ($1)",
+'converter-manual-rule-error' => 'An der Regel iwwer déi manuell Ëmwandlung vun der Sprooch gouf e Feeler fonnt',
 
 # "Undo" feature
 'undo-success' => "D'Ännerung gëtt réckgängeg gemaach. Iwwerpréift w.e.g. de Verglach ënnendrënner fir nozekuckeen ob et esou richteg ass, duerno späichert w.e.g d'Ännerungen of, fir dës Aktioun ofzeschléissen.",
@@ -1532,9 +1545,9 @@ Hei fannt Dir en Extrait aus dem Läsch- a Réckel-Logbuch fir dëse Fichier.",
 Gitt op d'[[Special:FileList|Lëscht vun den eropgeluedene Fichieren]], fir no Fichieren ze sichen déi virdrun eropgeluede goufen, Eropluedunge fannt dir an der [[Special:Log/upload|Lëscht vun den eropgeluedene Fichieren]], geläschte Fichieren am [[Special:Log/delete|Läschlog]].
 
 Fir e '''Bild''' op enger Säit zu benotzen, schreift amplaz vum Bild eng vun dëse Formelen:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichier.jpg]]</nowiki></tt>''' fir déi ganz Versioun vum Fichier ze benotzen
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichier.png|200px|thumb|left|alt text]]</nowiki></tt>''' fir eng 200 Pixel breet Versioun an enger Këscht am lénke Rand mat 'alt text' als Beschreiwung
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichier.ogg]]</nowiki></tt>''' fir e Fichier direkt ze verlinken ouni de Fichier ze weisen",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichier.jpg]]</nowiki></code>''' fir déi ganz Versioun vum Fichier ze benotzen
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fichier.png|200px|thumb|left|alt text]]</nowiki></code>''' fir eng 200 Pixel breet Versioun an enger Këscht am lénke Rand mat 'alt text' als Beschreiwung
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fichier.ogg]]</nowiki></code>''' fir e Fichier direkt ze verlinken ouni de Fichier ze weisen",
 'upload-permitted' => 'Erlaabte Formater vun de Fichieren: $1.',
 'upload-preferred' => 'Fichierszorten déi am beschte funktionéieren: $1.',
 'upload-prohibited' => 'Verbuede Fichiers Formater: $1.',
@@ -1578,22 +1591,22 @@ Erlaabt {{PLURAL:$3|ass|sinn}}: $2.',
 'largefileserver' => 'Dëse Fichier ass méi grouss wéi déi um Server agestallte Maximalgréisst.',
 'emptyfile' => 'De Fichier deen Dir eropgelueden hutt, schéngt eidel ze sinn. Dëst kann duerch en Tippfeeler am Numm vum Fichier kommen. Préift w.e.g. no, op Dir dëse Fichier wierklech eropluede wëllt.',
 'windows-nonascii-filename' => "Dës Wiki ënnerstëtzt d'Spezialzeechen an de Fichiersnimm net.",
-'fileexists' => "Et gëtt schonn e Fichier mat dësem Numm, kuckt w.e.g.
-'''<tt>[[:$1]]</tt>''' wann Dir net sécher sidd, ob Dir den Numm ännere wëllt.
-[[$1|thumb]]",
-'filepageexists' => "D'Beschreiwungssäit fir dëse Fichier gouf schonns als '''<tt>[[:$1]]</tt>''' ugeluecht, et gëtt awer kee Fichier mat deem Numm.
+'fileexists' => 'Et gëtt schonn e Fichier mat dësem Numm, kuckt w.e.g.
+<strong>[[:$1]]</strong> wann Dir net sécher sidd, ob Dir den Numm ännere wëllt.
+[[$1|thumb]]',
+'filepageexists' => "D'Beschreiwungssäit fir dëse Fichier gouf schonns als <strong>[[:$1]]</strong> ugeluecht, et gëtt awer kee Fichier mat deem Numm.
 
 De Resumé deen Dir agitt, gëtt net op d'Beschreiwungssäit iwwerholl.
 Fir datt äre Resumé do opdaucht musst Dir e manuell änneren.
 [[$1|thumb]]",
-'fileexists-extension' => "E Fichier mat engem ähnlechen Numm gëtt et schonn: [[$2|thumb]]
-* Numm vum Fichier deen Dir versicht eropzelueden: '''<tt>[[:$1]]</tt>'''
-* Numm vum Fichier deen et scho gëtt: '''<tt>[[:$2]]</tt>'''
-Wielt w.e.g. en aneren Numm.",
+'fileexists-extension' => 'E Fichier mat engem ähnlechen Numm gëtt et schonn: [[$2|thumb]]
+* Numm vum Fichier deen Dir versicht eropzelueden: <strong>[[:$1]]</strong>
+* Numm vum Fichier deen et scho gëtt: <strong>[[:$2]]</strong>
+Wielt w.e.g. en aneren Numm.',
 'fileexists-thumbnail-yes' => "Beim Fichier schéngt et sech ëm e klengt Bild ''(Miniatur)'' ze handelen. [[$1|thumb]]
-Kuckt de Fichier '''<tt>[[:$1]]</tt>''' w.e.g. no.
+Kuckt de Fichier <strong>[[:$1]]</strong> w.e.g. no.
 Wann et sech ëm d'Bild an der Originalgréisst handelt, da brauch kee separat Bild als Minitaur eropgelueden ze ginn.",
-'file-thumbnail-no' => "Den Numm vum Fichier fänkt mat '''<tt>$1</tt>''' un.
+'file-thumbnail-no' => "Den Numm vum Fichier fänkt mat <strong>$1</strong> un.
 Da deit drop hin datt et eng Minitaur ''(thumbnail)'' ass.
 Wann Dir dat Bild a méi enger grousser Opléisung hutt, da luet dëst erop, soss ännert den Numm vum Fichier w.e.g.",
 'fileexists-forbidden' => 'Et gëtt schonn e Fichier mat dësem Numm an dee kann net iwwerschriwwe ginn.
@@ -1672,7 +1685,11 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
 'lockmanager-notlocked' => '"$1" konnt net fräigeschalt ginn; $1 ass net gespaart.',
 'lockmanager-fail-closelock' => 'De Spärfichier fir "$1" konnt net zougemaach ginn.',
 'lockmanager-fail-deletelock' => 'De Spärfichier fir "$1" konnt net geläscht ginn.',
+'lockmanager-fail-acquirelock' => '"$1" konnt net gespaart ginn.',
+'lockmanager-fail-openlock' => 'De Spärfichier fir "$1" konnt net opgemaach ginn.',
+'lockmanager-fail-releaselock' => 'D\'Spär fir "$1" konnt net opgehuewe ginn.',
 'lockmanager-fail-db-release' => "D'Spären op der Datebank $1 konnten net fräigeschalt ginn.",
+'lockmanager-fail-svr-acquire' => "D'Spären um Server $1 konnten net ofgefrot ginn.",
 'lockmanager-fail-svr-release' => "D'Spären um Server $1 konnten net fräigeschalt ginn.",
 
 # ZipDirectoryReader
@@ -1728,8 +1745,8 @@ Kuckt w.e.g. no op kee Feeler an der URL ass an op de Site och online ass.',
 'upload-curl-error28' => "D'Eroplueden huet ze laang gedauert (timeout)",
 'upload-curl-error28-text' => "Dëse Site huet ze laang gebraucht fir z'äntwerten. Kuckt w. e. g. no, ob dëse Site online ass, waart een Ament a probéiert et dann nach eng Kéier. Et ka sënnvoll sinn, et nach eng Kéier méi spéit ze versichen.",
 
-'license' => 'Lizenzéiert:',
-'license-header' => 'Lizenzéieren',
+'license' => 'Lizenz',
+'license-header' => 'Lizenz',
 'nolicense' => 'Keng Lizenz ausgewielt',
 'license-nopreview' => '(Kucken ouni ofzespäichere geet net)',
 'upload_source_url' => ' (gëlteg, ëffentlech zougänglech URL)',
@@ -1791,6 +1808,7 @@ Dir kënnt seng Beschreiwung op senger [$2 Beschreiwungssäit] änneren.',
 'shared-repo-from' => 'vu(n) $1',
 'shared-repo' => 'e gemeinsam genotzte Medienarchiv',
 'shared-repo-name-wikimediacommons' => 'Wikimedia-Commons',
+'upload-disallowed-here' => 'Leider kënnt Dir dëst Bild net iwwerschreiwen.',
 
 # File reversion
 'filerevert' => '"$1" zrécksetzen',
@@ -1825,7 +1843,7 @@ Dir kënnt seng Beschreiwung op senger [$2 Beschreiwungssäit] änneren.',
 # MIME search
 'mimesearch' => 'No MIME-Zort sichen',
 'mimesearch-summary' => "Op dëser Spezialsäit kënnen d'Fichieren no hirem MIME-Typ gefiltert ginn.
-Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <tt>image/jpeg</tt>.",
+Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
 'mimetype' => 'MIME-Typ:',
 'download' => 'eroflueden',
 
@@ -1871,9 +1889,9 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <tt>image/jpeg</tt>.",
 
 'disambiguations' => 'Säiten déi op Homonymie-Säite linken',
 'disambiguationspage' => 'Template:Homonymie',
-'disambiguations-text' => 'Dës Säite si mat enger Homonymie-Säit verlinkt.
-Sie sollten am beschten op déi eigentlech gemengte Säit verlinkt sinn.<br />
-Eng Säite gëtt als Homonymiesäit behandelt, wa si eng Schabloun benotzt déi vu [[MediaWiki:Disambiguationspage]] verlinkt ass.',
+'disambiguations-text' => "Dës Säite ass mat mindestens enger '''Homonymie-Säit''' verlinkt.
+Si sollte am beschten op déi eigentlech gemengte Säit verlinkt sinn.<br />
+Eng Säite gëtt als Homonymie-Säit behandelt, wa si eng Schabloun benotzt déi vu [[MediaWiki:Disambiguationspage]] verlinkt ass.",
 
 'doubleredirects' => 'Duebel Viruleedungen',
 'doubleredirectstext' => 'Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.
@@ -1898,6 +1916,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|Byte|Byten}}',
 'ncategories' => '$1 {{PLURAL:$1|Kategorie|Kategorien}}',
+'ninterwikis' => '$1 {{PLURAL:$1|Interwiki-Link|Interwiki-Linken}}',
 'nlinks' => '$1 {{PLURAL:$1|Link|Linken}}',
 'nmembers' => '$1 {{PLURAL:$1|Member|Memberen}}',
 'nrevisions' => '$1 {{PLURAL:$1|Versioun|Versiounen}}',
@@ -1925,6 +1944,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'mostlinkedtemplates' => 'Dacks benotzte Schablounen',
 'mostcategories' => 'Säite mat de meeschte Kategorien',
 'mostimages' => 'Dacks benotzte Biller',
+'mostinterwikis' => 'Säite mat de meeschten Interwikilinken',
 'mostrevisions' => 'Säite mat de meeschte Versiounen',
 'prefixindex' => 'All Säite mat Prefix',
 'prefixindex-namespace' => 'All Säite mat Prefix (Nummraum $1)',
@@ -1942,7 +1962,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'protectedtitlesempty' => 'Zur Zäit si mat de Parameteren déi Dir uginn hutt keng Säite fir neit Uleeë gespaart.',
 'listusers' => 'Benotzerlëscht',
 'listusers-editsonly' => 'Nëmme Benotzer mat Ännerunge weisen',
-'listusers-creationsort' => 'No dem Datum vum Uleeë sortéieren',
+'listusers-creationsort' => 'Nom Datum vum Uleeën zortéieren',
 'usereditcount' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
 'usercreated' => "{{GENDER:$3|De(n)|D'}} $1 ëm $2 Auer ugeluecht",
 'newpages' => 'Nei Säiten',
@@ -2008,8 +2028,8 @@ Dir kënnt d'Siche limitéieren wann Dir e Log-Typ, e Benotzernumm (case-senisit
 [[Special:UnusedCategories|Netbenotzt Kategorië]] ginn hei net gewisen.
 Kuckt och [[Special:WantedCategories|Gewënscht Kategorien]].',
 'categoriesfrom' => 'Weis Kategorien ugefaang bei:',
-'special-categories-sort-count' => 'No der Zuel sortéieren',
-'special-categories-sort-abc' => 'alphabetesch sortéieren',
+'special-categories-sort-count' => 'No der Zuel zortéieren',
+'special-categories-sort-abc' => 'alphabetesch zortéieren',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'Geläschte Kontributiounen',
@@ -2021,9 +2041,9 @@ Kuckt och [[Special:WantedCategories|Gewënscht Kategorien]].',
 'linksearch-pat' => 'Sich-Critère:',
 'linksearch-ns' => 'Nummraum:',
 'linksearch-ok' => 'Sichen',
-'linksearch-text' => 'Sougennante "Wildcards" wéi zum Beispill <tt>*.example.com</tt> kënne benotzt ginn.
+'linksearch-text' => 'Sougennante "Wildcards" wéi zum Beispill <code>*.example.com</code> kënne benotzt ginn.
 Et muss mindestens en Top-Level-Domaine ugi ginn, wéi z. Bsp. ".org".<br />
-Ënnerstëtzte Protekoller: <tt>$1</tt>',
+Ënnerstëtzte Protekoller: <code>$1</code>',
 'linksearch-line' => '$1 verlinkt vun $2',
 'linksearch-error' => 'Wildcards (*,?) kënnen nëmmen am Ufank vum Host-Numm benotzt ginn.',
 
@@ -2069,6 +2089,8 @@ Et ginn [[{{MediaWiki:Listgrouprights-helppage}}|zousätzlech Informatiounen]] i
 'mailnologin' => 'Keng E-Mailadress',
 'mailnologintext' => 'Dir musst [[Special:UserLogin|ugemellt]] sinn an eng gëlteg E-Mail Adress an Äre [[Special:Preferences|Astellungen]] aginn hunn, fir engem anere Benotzer eng E-Mail ze schécken.',
 'emailuser' => 'Dësem Benotzer eng E-Mail schécken',
+'emailuser-title-target' => '{{GENDER:$1|Dëser Benotzerin|Dësem Benotzer}} eng Mail schécken',
+'emailuser-title-notarget' => 'Dem Benotzer eng E-Mail schécken',
 'emailpage' => 'Dem Benotzer eng E-Mail schécken',
 'emailpagetext' => 'Dir kënnt mat dësem Formulaire dësem Benotzer en E-Mail-Message schécken.
 D\'E-Mailadress, déi Dir an [[Special:Preferences|Ären Astellungen]] aginn hutt, steet an der "From" Adress vun der Mail, sou datt den Destinataire Iech direkt äntwerte kann.',
@@ -2218,6 +2240,8 @@ dës Aktioun soll mat Vierssiicht gemaach ginn.",
 'rollback' => 'Ännerungen zrécksetzen',
 'rollback_short' => 'Zrécksetzen',
 'rollbacklink' => 'Zrécksetzen',
+'rollbacklinkcount' => '{{PLURAL:$1|Eng Ännerung|$1 Ännerungen}} zerécksetzen',
+'rollbacklinkcount-morethan' => 'méi wéi {{PLURAL:$1|Eng Ännerung|$1 Ännerungen}} zerécksetzen',
 'rollbackfailed' => 'Zrécksetzen huet net geklappt',
 'cantrollback' => 'Lescht Ännerung kann net zréckgesat ginn. De leschten Auteur ass deen eenzegen Auteur vun dëser Säit.',
 'alreadyrolled' => 'Déi lescht Ännerung vun der Säit [[:$1]] vum [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);; kann net zeréckgesat ginn;
@@ -2739,6 +2763,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 'import-error-interwiki' => 'D\'Säit  "$1" gouf net importéiert well deen Numm fir extern Linken (Interwiki) reservéiert ass.',
 'import-error-special' => 'D\'Säit "$1" gouf net importéiert well se zu engem speziellen Nummraum gehéiert an deem et keng Säite gëtt.',
 'import-error-invalid' => 'D\'Säit "$1" gouf net importéiert well hiren Numm net valabel ass.',
+'import-options-wrong' => 'Falsch {{PLURAL:$2|Optioun|Optiounen}}: <nowiki>$1</nowiki>',
 
 # Import log
 'importlogpage' => 'Lëscht vun den Säitenimporten',
@@ -2867,16 +2892,22 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 
 # Info page
 'pageinfo-title' => 'Informatioun iwwer "$1"',
-'pageinfo-header-edits' => 'Ännerungen',
-'pageinfo-header-watchlist' => 'Iwwerwaachungslëscht',
-'pageinfo-header-views' => 'Affichagen',
-'pageinfo-subjectpage' => 'Säit',
-'pageinfo-talkpage' => 'Diskussiounssäit',
-'pageinfo-watchers' => 'Zuel vun de Benotzer déi iwwerwaachen',
-'pageinfo-edits' => 'Zuel vun den Ännerungen',
-'pageinfo-authors' => 'Zuel vun de verschiddenen Auteuren',
+'pageinfo-header-basic' => 'Basisinformatiounen',
+'pageinfo-header-edits' => 'Historique vun den Ännerungen',
+'pageinfo-display-title' => 'Titel dee gewise gëtt',
 'pageinfo-views' => 'Zuel vun de Kéieren déi dës Säit gekuckt gouf',
-'pageinfo-viewsperedit' => 'Affichage pro Ännerung',
+'pageinfo-watchers' => "Zuel vun de Benotzer déi d'Säit iwwerwaachen",
+'pageinfo-redirects-name' => 'Viruleedungen op dës Säit',
+'pageinfo-subpages-name' => 'Ënnersäite vun dëser Säit',
+'pageinfo-firsttime' => 'Datum vum Uleeë vun der Säit',
+'pageinfo-lastuser' => 'Leschte Benotzer deen eppes geännert huet',
+'pageinfo-lasttime' => 'Datum vun der leschter Ännerung',
+'pageinfo-edits' => 'Gesamtzuel vun den Ännerungen',
+'pageinfo-authors' => 'Gesamtzuel vun de verschiddenen Auteuren',
+'pageinfo-recent-edits' => 'Zuel vun de rezenten Ännerungen (an de leschten $1)',
+'pageinfo-restriction' => 'Protectioun vun der Säit (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magescht Wuert|Magesch Wierder}} ($1)',
+'pageinfo-hidden-categories' => 'Verstoppte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
@@ -3579,7 +3610,7 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 * <span class="mw-specialpagecached">Spezialsäiten aus dem Tëschespäicher (ka vereelst sinn).</span>',
 'specialpages-group-maintenance' => 'Maintenance-Rapporten',
 'specialpages-group-other' => 'Aner Spezialsäiten',
-'specialpages-group-login' => 'Aloggen / Umellen',
+'specialpages-group-login' => 'Aloggen / Benotzerkont uleeën',
 'specialpages-group-changes' => 'Rezent Ännerungen a Lëschten',
 'specialpages-group-media' => 'Medie-Rapporten an eropgeluede Fichieren',
 'specialpages-group-users' => 'Benotzer a Rechter',
@@ -3709,9 +3740,12 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
 'api-error-empty-file' => 'De Fichier deen Dir geschéckt hutt war eidel.',
 'api-error-emptypage' => 'Et ass net erlaabt nei, eidel Säiten unzeleeën.',
 'api-error-fetchfileerror' => 'Interne Feeler: beim Opruffe vum Fichier huet eppes net fonctionnéiert.',
+'api-error-fileexists-forbidden' => 'E Fichier mam Numm "$1" gëtt et schonn an e kann net iwwerschriwwe ginn.',
+'api-error-fileexists-shared-forbidden' => 'E Fichier mam Numm "$1" gëtt et schonn am gedeelte Repertoire an e kann net iwwerschriwwe ginn.',
 'api-error-file-too-large' => 'De Fichier deen Dir geschéckt hutt war ze grouss.',
 'api-error-filename-tooshort' => 'Den Numm vum Fichier ass ze kuerz.',
 'api-error-filetype-banned' => 'Dësen Typ vu Fichier ass net zougelooss.',
+'api-error-filetype-banned-type' => "$1 {{PLURAL:$4|ass e Fichiersformat deen net erlaabt ass|si Fichiersformater déi net erlaabt sinn}}. Erlaabt {{PLURAL:$3|ass de Fichiersformat|sinn d'Fichiersformater}}: $2.",
 'api-error-filetype-missing' => "D'Erweiderung vum Fichier feelt.",
 'api-error-hookaborted' => "D'Ännerung déi Dir versicht hutt ze maachen ass duerch en 'extension-hook' ofgebrach ginn.",
 'api-error-http' => 'Interne Feeler: net méiglech sech op de Server ze connectéieren.',
index e731e91..ffe54c2 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Lezghian (Ð\9bезги)
+/** Lezghian (лезги)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -30,7 +30,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Мукьвара хьайи дегишвилера авай къаравулвал авунвай дуьзар хъувунар чуьнуьхун',
 'tog-newpageshidepatrolled' => 'ЦIийи ччинрин сиягьда къаравулвал авунвай ччинар чуьнуьхун',
 'tog-extendwatchlist' => 'ЧӀехи сиягь килигунин, кутазвай вири дегишунар, амма са эхирбур туш',
-'tog-usenewrc' => 'ЦIийи Ð´ÐµÐ³Ð¸Ñ\88вилеÑ\80ин Ñ\81иÑ\8fгÑ\8c ÐºÐ°Ñ\80дик ÐºÑ\83Ñ\82Ñ\83н (JavaScript герекзава)',
+'tog-usenewrc' => 'Ð\9cÑ\83кÑ\8cваÑ\80а Ñ\85Ñ\8cайи Ð¼Ð°Ñ\81акIавилеÑ\80ин Ñ\87Ñ\87ина Ð²Ð° Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин Ñ\81иÑ\8fгÑ\8cда  Ð´Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вÑ\83наÑ\80 ÐºIеÑ\80еÑ\82\80из Ñ\87Ñ\87аÑ\80а Ð°Ð²Ñ\83н. (JavaScript герекзава)',
 'tog-numberheadings' => 'Кьилин цӀарариз автоматдаказ номерар эцигун',
 'tog-showtoolbar' => 'Дуьзар хъувунин алатрин кьвати къалура (JavaScript)',
 'tog-editondblclick' => 'Ччинар кьве тIампIуналди дуьзар хъувун (JavaScript герекзава)',
@@ -163,7 +163,7 @@ $messages = array(
 'vector-action-unprotect' => 'Хуьн дегишарун',
 'vector-simplesearch-preference' => 'Гегьенш жагъурунин рикIел гъун кутун (кьилди "Вектор" акунар патал)',
 'vector-view-create' => 'Туькlуьрун',
-'vector-view-edit' => 'Ð\94Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вун',
+'vector-view-edit' => 'РаÑ\81ун',
 'vector-view-history' => 'Тарихдиз килигун',
 'vector-view-view' => 'Кlелун',
 'vector-view-viewsource' => 'Чешме къалурун',
@@ -223,7 +223,7 @@ $messages = array(
 'lastmodifiedat' => 'Ччинин эхиримжи масакIа хьун:  $1,  $2',
 'protectedpage' => 'Хвенвай ччин',
 'jumpto' => 'ЭлячIун иниз:',
-'jumptonavigation' => 'Навигация',
+'jumptonavigation' => 'Навигаци',
 'jumptosearch' => 'Жугъурун',
 'pool-queuefull' => 'ТIалабар кIватзавайди ацIа я',
 'pool-errorunknown' => 'Малумтушир гъалатI',
@@ -256,7 +256,7 @@ $messages = array(
 'newmessageslink' => 'цlийи чарар',
 'newmessagesdifflink' => 'Эхиримжи масакIавилер',
 'youhavenewmessagesmulti' => '"$1"-да квез цIийи чарар атанва.',
-'editsection' => 'дÑ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вун',
+'editsection' => 'РаÑ\81ун',
 'editold' => 'Дуьзар хъувун',
 'viewsourceold' => 'сифте кьилин коддиз килига',
 'editlink' => 'Дуьзар хъувун',
@@ -448,7 +448,7 @@ $messages = array(
 Квевай и ччинин туьхкlуьрунин гереквилиз килигиз тIалабзава.
 Агъадихъ и ччинин алудун ва тIвар эхцигунин журнал къалурнава.",
 'moveddeleted-notice' => 'И ччин алуднава. 
-Агъадихъ малумат патал и ччинин алудун ва тIвар эхцигунин журнал къалурнава.',
+Агъадихъ малумат патал и ччинин алудунин ва тIвар эхцигунин журнал къалурнава.',
 'log-fulllog' => 'Вири журналдиз килигун',
 'edit-conflict' => 'Дуьзар хъувунрин акьунар',
 
@@ -939,7 +939,7 @@ $messages = array(
 
 # Watchlist
 'watchlist' => 'Зи вилив хуьнин сиягь',
-'mywatchlist' => 'Ð\97и Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин сиягь',
+'mywatchlist' => 'Ð\97и Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\8eнин сиягь',
 '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 +1025,7 @@ $messages = array(
 
 # Contributions
 'contributions' => 'Уртахди кутур крар',
-'contributions-title' => '$1 уртахдин кутур крар',
+'contributions-title' => '$1 уртахди кутур крар',
 'mycontris' => 'За кутур кар',
 'contribsub2' => '($1)-ин кутур пай  ($2)',
 'uctop' => '(вини кьил)',
@@ -1189,12 +1189,8 @@ $messages = array(
 
 # Info page
 'pageinfo-header-edits' => 'Дуьзар хъувун',
-'pageinfo-header-watchlist' => 'Гуьзетунин сиягь',
-'pageinfo-header-views' => 'Килигунар',
-'pageinfo-subjectpage' => 'Ччин',
-'pageinfo-talkpage' => 'Веревирдрин ччин',
-'pageinfo-edits' => 'Дьузар хъувунрин кьадар',
 'pageinfo-views' => 'Килигунрин кьадар',
+'pageinfo-edits' => 'Дьузар хъувунрин кьадар',
 
 # Browsing diffs
 'previousdiff' => 'Вилик алатай дуьзар хъувун',
@@ -1204,7 +1200,7 @@ $messages = array(
 'file-info-size' => '$1 × $2 пикселар, файлдин кьадар: $3, MIME жуьре: $4',
 'file-nohires' => 'Идалайни хъсан ери авайд туш',
 'svg-long-desc' => 'SVG файл, номилдаказ $1 $2 × пикселяр, файлдин кьадар: $3',
-'show-big-image' => 'Ð\9cадни Ñ\85Ñ\8aÑ\81ан ÐµÑ\80идин Ñ\88икил',
+'show-big-image' => 'ЦlаÑ\80аÑ\84а Ñ\85вена Ñ\82Ñ\83нвай Ð¶ÐµÑ\80гедай',
 
 # Bad image list
 'bad_image_list' => 'Формат гьихьтинди хьана кlанда:
index f610349..2487b54 100644 (file)
@@ -10,6 +10,7 @@
  * @author Aelske
  * @author Benopat
  * @author Cicero
+ * @author Geitost
  * @author Kaganer
  * @author Matthias
  * @author Ooswesthoesbes
@@ -163,7 +164,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Gemarkeerde wieziginge verberge in recente wieziginge',
 'tog-newpageshidepatrolled' => "Gemarkeerde pagina's verberge in de lies mit nuuj pagina's",
 'tog-extendwatchlist' => 'Oetgebreide volglies gebroeke óm alle verangeringe te zeen en neet allein de lèste',
-'tog-usenewrc' => 'Oetgebreide recènte verangeringe (Javascript nudig)',
+'tog-usenewrc' => 'Tuun verangeringe per pagina in recènte verangeringe en volglies (Javascript nudig)',
 'tog-numberheadings' => 'Köpkes automatisch nummere',
 'tog-showtoolbar' => 'Laot edit toolbar zeen',
 'tog-editondblclick' => "Bewirk pagina's bie 'ne dobbelklik (JavaScript)",
@@ -171,17 +172,17 @@ $messages = array(
 'tog-editsectiononrightclick' => "Secties bewirke mit 'ne rechtermoesklik op sectietitels (JavaScript nudig)",
 'tog-showtoc' => "Inhaudsopgaaf veur pagina's mit mie es 3 köpkes",
 'tog-rememberpassword' => 'Mien wachwaord onthouwe veur later sessies (hoegstens $1 {{PLURAL:$1|daag|daag}})',
-'tog-watchcreations' => "Pagina's die ich aanmaak automatisch volge",
-'tog-watchdefault' => "Voog pagina's die se bewirks toe aan dien volglies",
-'tog-watchmoves' => "Pagina's die ich verplaats automatisch volge",
-'tog-watchdeletion' => "Pagina's die ich ewegsjaf automatisch volge",
+'tog-watchcreations' => "Volg autematis pagina's die ich aanmaak en bestenj die ich upload",
+'tog-watchdefault' => "Voog pagina's em bestenj die se bewirks toe aan dien volglies",
+'tog-watchmoves' => "Volg autematis pagina's en bestenj die ich verplaats",
+'tog-watchdeletion' => "Volg autematis pagina's en bestenj die ich ewegsjaf",
 'tog-minordefault' => 'Markeer sjtanderd alle bewirkinge es klein',
 'tog-previewontop' => 'Veurvertuin baove bewèrkingsveld tuine',
 'tog-previewonfirst' => 'Preview laote zien bie de ierste bewirking',
 'tog-nocache' => 'Zèt de browserpaginacaching oet',
-'tog-enotifwatchlistpages' => "'ne E-mail nao mich versjikke bie bewirkinge van pagina's op mien volglies",
+'tog-enotifwatchlistpages' => "Versjik 'ne e-mail nao mich bie bewirkinge van pagina's en bestenj op mien volglies",
 'tog-enotifusertalkpages' => "'ne E-mail nao mich versjikke es emes mien euverlèkpagina verangert",
-'tog-enotifminoredits' => "'ne E-mail nao mich versjikke bie klein bewirkinge op pagina's op mien volglies",
+'tog-enotifminoredits' => "Versjik  mich 'ne e-mail bie klein bewirkinge op pagina's en bestenj op mien volglies",
 'tog-enotifrevealaddr' => 'Mien e-mailadres tuine in e-mailberichte',
 'tog-shownumberswatching' => "'t Aantal gebroekers tuine die dees pagina volg",
 'tog-oldsig' => 'Bestaonde ongerteikening:',
@@ -197,7 +198,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Bewirkinge van aangemelde gebroekers op mien volglies versjtaeke',
 'tog-watchlisthideanons' => 'Bewirkinge van anonieme gebroekers op mien volglies versjtaeke',
 'tog-watchlisthidepatrolled' => 'Gemarkeerde wieziginge op mien volglies verberge',
-'tog-nolangconversion' => 'Variantconversie oetsjakele',
 'tog-ccmeonemails' => "'n Kopie nao mich versjikke van de e-mail dae ich nao anger gebroekers sjik",
 'tog-diffonly' => 'Pagina-inhaud zónger verangeringe neet tuine',
 'tog-showhiddencats' => 'Verbórge categorië tuine',
@@ -514,6 +514,8 @@ Maak hievan melding bie 'ne [[Special:ListUsers/sysop|systeembeheerder]] van {{S
 'cannotdelete' => 'Kós de pagina of \'t besjtand "$1" neet ewegsjaffe.
 Mesjiens haet emes angers det al gedaon.',
 'cannotdelete-title' => 'Pagina "$1" kin neet gewösj waere',
+'delete-hook-aborted' => "'t Wösje is aafgebroke door 'ne 'hook'.
+D'r is gein toelichting besjikbaar.",
 'badtitle' => 'Óngeljige paginatitel',
 'badtitletext' => 'De opgevraogde pagina is neet besjikbaar of laeg.',
 'perfcached' => "De gegaeves koume oet 'n cache en zeen mäögelik neet actueel. 't Geuf {{PLURAL:$1|maximaal ei rizzeltaot|maximaal $1 rizzeltaote}} inne cache.",
@@ -545,6 +547,8 @@ De gegaeve ree is ''$2''.",
 d\'n Opgegaeve raej vanne sloetendje admin waar "\'\'$3\'\'".',
 'invalidtitle-knownnamespace' => 'Óngèljige titel mit naamruumdje "$2" en teks "$3"',
 'invalidtitle-unknownnamespace' => 'Óngèljige titel mit ónbekèndj naamruumdenómmer $1 en teks "$2"',
+'exception-nologin' => 'Neet aangemèld',
+'exception-nologin-text' => 'Óm dees pagina te betrachte of dees hanjeling te kinne doon mós se aangemèldj zeen bie deze wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Slechte configuratie: onbekenge virusscanner: ''$1''",
@@ -1372,6 +1376,7 @@ Deze informatie is zichbaar veur angere gebroekers.',
 'right-writeapi' => 'Bewèrke via de API',
 'right-delete' => "Pagina's verwijdere",
 'right-bigdelete' => "Pagina's mit 'n grote gesjiedenis verwijdere",
+'right-deletelogentry' => 'Wösj of plaats trögk specifieke logbookregels',
 'right-deleterevision' => "Versies van pagina's verberge",
 'right-deletedhistory' => 'Verwijderde versies bekieke, zonder te kinne zeen wat verwijderd is',
 'right-deletedtext' => 'Bekieke gewösjde teks en wieziginge tösse verwiedere versies',
@@ -1564,18 +1569,18 @@ Aangeweze {{PLURAL:\$3|bestandjstype|bestandjstypes}}zeen \$2.",
 'largefileserver' => "'t Bestandj is groter dan de instelling van de server toestuit.",
 'emptyfile' => "'t Besjtand wats re höbs geupload is laeg. Dit kump waorsjienliek door 'n typfout in de besjtandsnaom. Kiek estebleef ofs te dit besjtand wirkelik wils uploade.",
 'windows-nonascii-filename' => 'Deze wiki ongersteunt gein bestandjsname mit speciaal teikes.',
-'fileexists' => "D'r is al e besjtand mit dees naam, bekiek '''<tt>[[:$1]]</tt>''' of se dat besjtand mesjien wils vervange.
+'fileexists' => "D'r is al e besjtand mit dees naam, bekiek <strong>[[:$1]]</strong> of se dat besjtand mesjien wils vervange.
 [[$1|thumb]]",
-'filepageexists' => "De besjrievingspagina veur dit besjtand besjteit al op '''<tt>[[:$1]]</tt>''', meh d'r besjteit gein besjtand mit deze naam. De samevatting dies te höbs opgegaeve zal neet op de besjrievingspagina versjiene. Bewirk de pagina handjmaotig óm dien besjrieving dao te tuine.
+'filepageexists' => "De besjrievingspagina veur dit besjtand besjteit al op <strong>[[:$1]]</strong>, meh d'r besjteit gein besjtand mit deze naam. De samevatting dies te höbs opgegaeve zal neet op de besjrievingspagina versjiene. Bewirk de pagina handjmaotig óm dien besjrieving dao te tuine.
 [[$1|thumb]]",
 'fileexists-extension' => "'n bestand met dezelfde naam bestuit al: [[$2|thumb]]
-* Naam van 't geüploade bestand: '''<tt>[[:$1]]</tt>'''
-* Naam van 't bestaonde bestand: '''<tt>[[:$2]]</tt>'''
+* Naam van 't geüploade bestand: <strong>[[:$1]]</strong>
+* Naam van 't bestaonde bestand: <strong>[[:$2]]</strong>
 Lèver 'ne angere naam te keze.",
 'fileexists-thumbnail-yes' => "'t Liek 'n afbeilding van 'n verkleinde grootte te zeen ''(thumbnail)''. [[$1|thumb]]
-Lèver 't bestand '''<tt>[[:$1]]</tt>''' te controlere.
+Lèver 't bestand <strong>[[:$1]]</strong> te controlere.
 Es 't gecontroleerde bestand dezelfde afbeilding van oorspronkelike grootte is, is 't neet noodzakelik 'ne extra thumbnail te uploade.",
-'file-thumbnail-no' => "De bestandsnaam begint met '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "De bestandsnaam begint met <strong>$1</strong>.
 't Liek 'n verkleinde afbeelding te zeen ''(thumbnail)''.
 Esse deze afbeelding in volledige resolutie höbs, upload dae afbeelding den. Wiezig anges estebleef de bestandsnaam.",
 'fileexists-forbidden' => "d'r Besteit al 'n bestand met deze naam det neet kin waere euevergesjreve. Upload dien bestand onger 'ne angere naam.
@@ -1669,6 +1674,7 @@ Gank trök nao t [[Special:Upload/stash/$1|uploadformuleer]] om dit perbleem te
 'lockmanager-fail-releaselock' => 'Kós de vergrendeling veur "$1" neet opheffe.',
 'lockmanager-fail-db-bucket' => 'Kós neet in kontak kómme mit genóg vergrendelingsdatabases in de bucket $1.',
 'lockmanager-fail-db-release' => "'t Waar neet meugelik ómme vergrendeling veure database $1 óp tö höffe.",
+'lockmanager-fail-svr-acquire' => "'t Waar neet meugelik ómme vergrendeling oppe server $1 tö kriege.",
 'lockmanager-fail-svr-release' => "'t Waar neet meugelik ómme vergrendeling veure server $1 óp tö höffe.",
 
 # ZipDirectoryReader
@@ -1816,7 +1822,7 @@ De [$2 pagina mit de besjtandjsbesjrieving] wurt hiejónger weergegaeve.',
 
 # MIME search
 'mimesearch' => 'Zeuk op MIME-type',
-'mimesearch-summary' => "Deze pagina maak het filtere van bestenj veur 't MIME-type meugelik. Inveur: contenttype/subtype, bv <tt>image/jpeg</tt>.",
+'mimesearch-summary' => "Deze pagina maak het filtere van bestenj veur 't MIME-type meugelik. Inveur: contenttype/subtype, bv <code>image/jpeg</code>.",
 'mimetype' => 'MIME-type:',
 'download' => 'Downloade',
 
@@ -2018,7 +2024,7 @@ Zuuch ouch [[Special:WantedCategories|neet-bestaondje categorieë mit verwiezing
 'linksearch-ok' => 'Zeuk',
 'linksearch-text' => 'Wildcards wie "*.wikipedia.org" of "*.org" zeen toegestaon.
 Haet mèndestes e toepleveldomein, wie beveurbeildj "*.org".<br />
-Óngerstäönendje protocolle: <tt>$1</tt> (veug dees neet tou in dien zeukópdrach).',
+Óngerstäönendje protocolle: <code>$1</code> (veug dees neet tou in dien zeukópdrach).',
 'linksearch-line' => '$1 gelink vanaaf $2',
 'linksearch-error' => 'Wildcards zijn alleen toegestaan aan het begin van een hostnaam.',
 
@@ -2826,19 +2832,15 @@ Meistal wörd dit door 'ne zwarte externe link veroorzaak.",
 'spambot_username' => 'MediaWiki spam opruming',
 'spam_reverting' => 'Bezig mit trökdrèjje nao de letste versie die gein verwiezing haet nao $1',
 'spam_blanking' => "Alle wieziginge mit 'ne link nao $1 waere verwiederd",
+'spam_deleting' => 'Alle wieziginge hawwe links nao $1, wuuertj gewösj',
 
 # Info page
 'pageinfo-title' => 'Informatie euver "$1"',
 'pageinfo-header-edits' => 'Bewirk',
-'pageinfo-header-watchlist' => 'Volglies',
-'pageinfo-header-views' => 'Weergave',
-'pageinfo-subjectpage' => 'Pagina',
-'pageinfo-talkpage' => 'Euverlègkpazjena',
+'pageinfo-views' => 'Aantal waergave',
 'pageinfo-watchers' => 'Aantal volgers',
 'pageinfo-edits' => 'Aantal bewèrkinge',
 'pageinfo-authors' => 'Aantal versjillende sjrievers',
-'pageinfo-views' => 'Aantal waergave',
-'pageinfo-viewsperedit' => 'Weergave per bewerking',
 
 # Skin names
 'skinname-standard' => 'Standaard',
@@ -3687,9 +3689,12 @@ Anges kin se-n ouch \'t einvawdig formeleer hieónger gebroeke. Dien commentaar
 'api-error-empty-file' => 't Bestandj det se perbeers te uploade had gein inhald.',
 'api-error-emptypage' => "Doe maags gein nuuj, laeg pagina's aanmake.",
 'api-error-fetchfileerror' => "Intern fout: d'r is get fout gegange bie 't óphaole van 't bestandj.",
+'api-error-fileexists-forbidden' => 'd\'r Besteit al e bestandj mitte naam "$1" det neet euversjreve kin waere.',
+'api-error-fileexists-shared-forbidden' => 'd\'r Besteit al e bestandj mitte naam "$1" inne gedeildje repositoir det neet euversjreve kin waere.',
 'api-error-file-too-large' => 't Bestandj det se perbeers te uploade waas te groet.',
 'api-error-filename-tooshort' => "t Bestandj det se perbeers te uploade had 'ne te kórte bestandjsnaam.",
 'api-error-filetype-banned' => 't Bestandj det se perbeers te uploade waas van e neet-toegelaote bestandjstype.',
+'api-error-filetype-banned-type' => "{{PLURAL:$4|'t bestandjstype $1 weurt|De bestandjstypes $1 waere}} neet toegelaote. {{PLURAL:$3|'t Toegelaote bestandjstype is|De toegelaote bestandjstypes zeen}} $2.",
 'api-error-filetype-missing' => "'t Bestandj haet gein extensie.",
 'api-error-hookaborted' => "De wieziging die se perbeers te make is aafgebraoke door 'nen oetbreidingshook.",
 'api-error-http' => "Intern fout: d'r kós gein verbinjing gemaak waere mitte server.",
index 8d0a9cd..04cfd83 100644 (file)
@@ -712,7 +712,7 @@ E pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] s
 'filesource' => 'Reixe:',
 'uploadedfiles' => 'Papê caregæ',
 'badfilename' => 'O nomme do papê o l\'è stæto cangioö in "$1".',
-'fileexists' => "Un papê co sto nomme o existe de zà, pe piaxei da unn'euggiâ a '''<tt>[[:$1]]</tt>''' se non ti tei seguo de voleilo cangiâ.
+'fileexists' => "Un papê co sto nomme o existe de zà, pe piaxei da unn'euggiâ a <strong>[[:$1]]</strong> se non ti tei seguo de voleilo cangiâ.
 [[$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ê',
index 3ac73c3..5c281d7 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Lumbaart (Lumbaart)
+/** lumbaart (lumbaart)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -96,10 +96,10 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'img_right'               => array( '1', 'drita', 'destra', 'right' ),
-       'img_left'                => array( '1', 'manzína', 'sinistra', 'left' ),
-       'img_none'                => array( '1', 'nissön', 'nessuno', 'none' ),
-       'sitename'                => array( '1', 'NUMSIT', 'NOMESITO', 'SITENAME' ),
+       'img_right'                 => array( '1', 'drita', 'destra', 'right' ),
+       'img_left'                  => array( '1', 'manzína', 'sinistra', 'left' ),
+       'img_none'                  => array( '1', 'nissön', 'nessuno', 'none' ),
+       'sitename'                  => array( '1', 'NUMSIT', 'NOMESITO', 'SITENAME' ),
 );
 
 $messages = array(
index 9597ca9..bf0b9d6 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Lingala (Lingála)
+/** Lingala (lingála)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
index aa7144a..0e446f3 100644 (file)
@@ -48,6 +48,11 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Kategorijos_aptarimas',
 );
 
+$namespaceGenderAliases = array(
+       NS_USER      => array( 'male' => 'Naudotojas', 'female' => 'Naudotoja' ),
+       NS_USER_TALK => array( 'male' => 'Naudotojo_aptarimas', 'female' => 'Naudotojos_aptarimas' ),
+);
+
 $specialPageAliases = array(
        'Allmessages'               => array( 'Visi_pranešimai' ),
        'Allpages'                  => array( 'Visi_puslapiai' ),
@@ -139,28 +144,28 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#PERADRESAVIMAS', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__BETURIN__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__BEGALERIJOS__', '__NOGALLERY__' ),
-       'toc'                     => array( '0', '__TURINYS__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BEREDAGSEKC__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'DABARTINISMĖNESIS', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'DABARTINIOMĖNESIOPAVADINIMAS', 'CURRENTMONTHNAME' ),
-       'currentday'              => array( '1', 'DABARTINĖDIENA', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'DABARTINĖDIENA2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'DABARTINĖSDIENOSPAVADINIMAS', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'DABARTINIAIMETAI', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'DABARTINISLAIKAS', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'DABARTINĖVALANDA', 'CURRENTHOUR' ),
-       'numberofpages'           => array( '1', 'PUSLAPIŲSKAIČIUS', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'STRAIPSNIŲSKAIČIUS', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'FAILŲSKAIČIUS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NAUDOTOJŲSKAIČIUS', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'KEITIMŲSKAIČIUS', 'NUMBEROFEDITS' ),
-       'img_thumbnail'           => array( '1', 'miniatiūra', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniatiūra=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'dešinėje', 'right' ),
-       'img_left'                => array( '1', 'kairėje', 'left' ),
+       'redirect'                  => array( '0', '#PERADRESAVIMAS', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__BETURIN__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__BEGALERIJOS__', '__NOGALLERY__' ),
+       'toc'                       => array( '0', '__TURINYS__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BEREDAGSEKC__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'DABARTINISMĖNESIS', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'DABARTINIOMĖNESIOPAVADINIMAS', 'CURRENTMONTHNAME' ),
+       'currentday'                => array( '1', 'DABARTINĖDIENA', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'DABARTINĖDIENA2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'DABARTINĖSDIENOSPAVADINIMAS', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'DABARTINIAIMETAI', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'DABARTINISLAIKAS', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'DABARTINĖVALANDA', 'CURRENTHOUR' ),
+       'numberofpages'             => array( '1', 'PUSLAPIŲSKAIČIUS', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'STRAIPSNIŲSKAIČIUS', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'FAILŲSKAIČIUS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NAUDOTOJŲSKAIČIUS', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'KEITIMŲSKAIČIUS', 'NUMBEROFEDITS' ),
+       'img_thumbnail'             => array( '1', 'miniatiūra', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniatiūra=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'dešinėje', 'right' ),
+       'img_left'                  => array( '1', 'kairėje', 'left' ),
 );
 
 $fallback8bitEncoding = 'windows-1257';
@@ -192,10 +197,10 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Įjungti skyrelių redagavimą paspaudus skyrelio pavadinimą dešiniuoju pelės klavišu (JavaScript)',
 'tog-showtoc' => 'Rodyti turinį, jei puslapyje daugiau nei 3 skyreliai',
 'tog-rememberpassword' => 'Prisiminti prisijungimo informaciją šioje naršyklėje (daugiausiai $1 {{PLURAL:$1|dieną|dienas|dienų}})',
-'tog-watchcreations' => 'Pridėti puslapius, kuriuos sukuriu, į stebimų sąrašą',
-'tog-watchdefault' => 'Pridėti puslapius, kuriuos redaguoju, į stebimų sąrašą',
-'tog-watchmoves' => 'Pridėti puslapius, kuriuos perkeliu, į stebimų sąrašą',
-'tog-watchdeletion' => 'Pridėti puslapius, kuriuos ištrinu, į stebimų sąrašą',
+'tog-watchcreations' => 'Pridėti puslapius, kuriuos aš sukuriu, į stebimų sąrašą',
+'tog-watchdefault' => 'Pridėti puslapius, kuriuos aš redaguoju, į stebimų sąrašą',
+'tog-watchmoves' => 'Pridėti puslapius, kuriuos aš perkeliu, į stebimų sąrašą',
+'tog-watchdeletion' => 'Pridėti puslapius, kuriuos aš ištrinu, į stebimų sąrašą',
 'tog-minordefault' => 'Pagal nutylėjimą pažymėti redagavimus kaip smulkius',
 'tog-previewontop' => 'Rodyti peržiūrą virš redagavimo lauko',
 'tog-previewonfirst' => 'Rodyti peržiūrą pirmą kartą pakeitus',
@@ -218,7 +223,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Slėpti prisijungusių naudotojų keitimus stebimųjų sąraše',
 'tog-watchlisthideanons' => 'Slėpti anoniminių naudotojų keitimus stebimųjų sąraše',
 'tog-watchlisthidepatrolled' => 'Slėpti patikrintus keitimus stebimųjų sąraše',
-'tog-nolangconversion' => 'Išjungti variantų keitimą',
 'tog-ccmeonemails' => 'Siųsti man laiškų, kuriuos siunčiu kitiems naudotojams, kopijas',
 'tog-diffonly' => 'Nerodyti puslapio turinio po skirtumais',
 'tog-showhiddencats' => 'Rodyti paslėptas kategorijas',
@@ -366,7 +370,7 @@ $messages = array(
 'create-this-page' => 'Sukurti šį puslapį',
 'delete' => 'Trinti',
 'deletethispage' => 'Ištrinti šį puslapį',
-'undelete_short' => 'Atstatyti $1 {{PLURAL:$1:redagavimą|redagavimus|redagavimų}}',
+'undelete_short' => 'Atkurti $1 {{PLURAL:$1:redagavimą|redagavimus|redagavimų}}',
 'viewdeleted_short' => 'Peržiūrėti $1 {{PLURAL:$1|ištrintą keitimą|ištrintus keitimus|ištrintų keitimų}}',
 'protect' => 'Užrakinti',
 'protect_change' => 'keisti',
@@ -441,6 +445,10 @@ $1',
 'youhavenewmessages' => 'Jūs turite $1 ($2).',
 'newmessageslink' => 'naujų žinučių',
 'newmessagesdifflink' => 'paskutinis pakeitimas',
+'youhavenewmessagesfromusers' => 'Jūs gavote $1 nuo {{PLURAL:$3|kito vartotojo|$3 vartotojų}} ($2).',
+'youhavenewmessagesmanyusers' => 'Jūs turite $1 iš daugelio vartotojų ( $2 ) .',
+'newmessageslinkplural' => '{{PLURAL:$1|naują žinutę|naujų žinučių}}',
+'newmessagesdifflinkplural' => 'paskutinis {{PLURAL:$1|pakeitimas|pakeitimai}}',
 'youhavenewmessagesmulti' => 'Turite naujų žinučių $1',
 'editsection' => 'redaguoti',
 'editold' => 'taisyti',
@@ -536,6 +544,8 @@ Prašome apie tai pranešti [[Special:ListUsers/sysop|administratoriui]], nepami
 'cannotdelete' => 'Nepavyko ištrinti puslapio ar failo „$1“.
 Galbūt jį jau kažkas kitas ištrynė.',
 'cannotdelete-title' => 'Negalite ištrinti puslapio "$1"',
+'delete-hook-aborted' => 'Trynimą atšaukė kabliukas.
+Nebuvo duotas joks paaiškinimas.',
 'badtitle' => 'Blogas pavadinimas',
 'badtitletext' => 'Nurodytas puslapio pavadinimas buvo neleistinas, tuščias arba neteisingai sujungtas tarpkalbinis arba tarpprojektinis pavadinimas. Jame gali būti vienas ar daugiau simbolių, neleistinų pavadinimuose',
 'perfcached' => 'Rodoma išsaugota duomenų kopija, todėl duomenys gali būti ne patys naujausi. Maksimaliai $1 {{PLURAL:$1|rezultatas|rezultatai|rezultatų}} yra saugoma.',
@@ -567,6 +577,8 @@ Nurodyta priežastis yra ''$2''.",
 Ją užrakinęs administratorius pateikė šį paaiškinimą: "$3".',
 'invalidtitle-knownnamespace' => 'Klaidingas pavadinimas vardų erdvėje "$2" ir tekstu "$3"',
 'invalidtitle-unknownnamespace' => 'Klaidingas pavadinimas nežinomoje vardų erdvėje numeriu $1 ir tekstu "$2"',
+'exception-nologin' => 'Neprisijungęs',
+'exception-nologin-text' => 'Šiam puslapiui ar veiksmui reikalingas prisijungimas šioje wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Neleistina konfigūracija: nežinomas virusų skeneris: ''$1''",
@@ -587,6 +599,7 @@ Jūsų paskyra buvo sukurta. Nepamirškite pakeisti savo [[Special:Preferences|{
 'remembermypassword' => 'Prisiminti prisijungimo duomenis šiame kompiuteryje (daugiausiai $1 {{PLURAL:$1|dieną|dienas|dienų}})',
 'securelogin-stick-https' => 'Likite prisijungę prie HTTPS po prisijungimo',
 'yourdomainname' => 'Jūsų domenas:',
+'password-change-forbidden' => 'Jus negalite keisti slaptažodžių šioje wiki.',
 'externaldberror' => 'Yra arba išorinė autorizacijos duomenų bazės klaida arba jums neleidžiama atnaujinti jūsų išorinės paskyros.',
 'login' => 'Prisijungti',
 'nav-login-createaccount' => 'Prisijungti / sukurti paskyrą',
@@ -906,10 +919,10 @@ Jūs galite grįžti ir redaguoti jau esantį puslapį, arba [[Special:UserLogin
 'permissionserrorstext-withaction' => 'Jūs neturite leidimo $2 dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:',
 'recreate-moveddeleted-warn' => "'''Dėmesio: Jūs atkuriate puslapį, kuris anksčiau buvo ištrintas.'''
 
-Jūs turite nuspręsti, ar reikėtų toliau redaguoti šį puslapį.
-Dėl patogumo čia pateikta šio puslapio šalinimų ir perkėlimų istorija:",
+Turėtumėte nuspręsti, ar reikėtų toliau redaguoti šį puslapį.
+Jūsų patogumui čia pateikiamas šio puslapio šalinimų ir perkėlimų sąrašas:",
 'moveddeleted-notice' => 'Šis puslapis buvo ištrintas.
-Žemiau pateikta puslapio šalinimų ir pervadinimų istorija.',
+Žemiau pateikiamas puslapio šalinimų ir pervadinimų sąrašas.',
 'log-fulllog' => 'Rodyti visą istoriją',
 'edit-hook-aborted' => 'Keitimas nutrauktas užlūžimo.
 Tam nėra paaiškinimo.',
@@ -1026,8 +1039,8 @@ Kaip administratorius, jūs galite ją pamatyti; daugiau detalių gali būti [{{
 'revdelete-show-file-submit' => 'Taip',
 'revdelete-selected' => "'''{{PLURAL:$2|Pasirinkta [[:$1]] versija|Pasirinktos [[:$1]] versijos}}:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Pasirinktas istorijos įvykis|Pasirinkti istorijos įvykiai}}:'''",
-'revdelete-text' => "'''Ištrintos versijos bei įvykiai vistiek dar bus rodomi puslapio istorijoje ir specialiųjų veiksmų istorijoje, bet jų turinio dalys nebus viešai prieinamos.'''
-Kiti administratoriai iš {{SITENAME}} vistiek galės pasiekti paslėptą turinį ir galės jį atkurti vėl per tą pačią sąsają, nebent yra nustatyti papildomi apribojimai.",
+'revdelete-text' => "'''Ištrintos versijos bei įvykiai vis tiek dar bus rodomi puslapio istorijoje ir specialiųjų veiksmų sąraše, bet jų turinio dalys nebus viešai prieinamos.'''
+Kiti administratoriai iš {{SITENAME}} vis tiek galės pasiekti paslėptą turinį ir galės jį atkurti per tą pačią sąsają, nebent yra nustatyti papildomi apribojimai.",
 'revdelete-confirm' => 'Prašome patvirtinti, kad jūs tai ketinate padaryti, kad jūs suprantate padarinius, ir kad jūs tai darote pagal [[{{MediaWiki:Policy-url}}|politiką]].',
 'revdelete-suppress-text' => "Ištrynimas turėtų būti taikomas '''tik''' šiais atvejais:
 * Netinkama asmeninė informacija
@@ -1078,7 +1091,7 @@ Prašome patikrinti sąrašus.',
 'revdelete-offender' => 'Versijos autorius:',
 
 # Suppression log
-'suppressionlog' => 'Trynimo istorija',
+'suppressionlog' => 'Trynimo sąrašas',
 'suppressionlogtext' => 'Žemiau yra trynimų ir blokavimų sąrašas, įtraukiant turinį, paslėptą nuo administratorių.
 Žiūrėkite [[Special:BlockList|blokavimų sąrašą]], kad rastumėte dabar veikiančius draudimus ir blokavimus.',
 
@@ -1107,15 +1120,15 @@ Prašome patikrinti sąrašus.',
 'mergehistory-reason' => 'Priežastis:',
 
 # Merge log
-'mergelog' => 'Sujungimų istorija',
+'mergelog' => 'Sujungimų sąrašas',
 'pagemerge-logentry' => 'sujungė [[$1]] su [[$2]] (versijos iki $3)',
 'revertmerge' => 'Atskirti',
 'mergelogpagetext' => 'Žemiau yra paskiausių vieno su kitu puslapių sujungimų sąrašas.',
 
 # Diffs
 'history-title' => '„$1“ versijų istorija',
-'difference-title' => '$1: Skirtumas tarp redakcijų',
-'difference-title-multipage' => '$1 ir $2: Skirtumas tarp puslapių',
+'difference-title' => '$1: Skirtumas tarp puslapio versijų',
+'difference-title-multipage' => 'Skirtumas tarp puslapių „$1 ir $2“',
 'difference-multipage' => '(Skirtumai tarp puslapių)',
 'lineno' => 'Eilutė $1:',
 'compareselectedversions' => 'Palyginti pasirinktas versijas',
@@ -1210,6 +1223,7 @@ Prašome patikrinti sąrašus.',
 'prefs-beta' => 'Beta funkcijos',
 'prefs-datetime' => 'Data ir laikas',
 'prefs-labs' => 'Bandomosios funkcijos',
+'prefs-user-pages' => 'Naudotojo puslapiai',
 'prefs-personal' => 'Naudotojo profilis',
 'prefs-rc' => 'Naujausi keitimai',
 'prefs-watchlist' => 'Stebimų sąrašas',
@@ -1226,7 +1240,7 @@ Prašome patikrinti sąrašus.',
 'prefs-rendering' => 'Išvaizda',
 'saveprefs' => 'Išsaugoti',
 'resetprefs' => 'Išvalyti neišsaugotus pakeitimus',
-'restoreprefs' => 'Atstatyti visus numatytuosius nustatymus',
+'restoreprefs' => 'Grąžinti visus numatytuosius nustatymus',
 'prefs-editing' => 'Redagavimas',
 'prefs-edit-boxsize' => 'Redagavimo lango dydis.',
 'rows' => 'Eilutės:',
@@ -1238,7 +1252,7 @@ Prašome patikrinti sąrašus.',
 'recentchangesdays' => 'Rodomos dienos paskutinių keitimų sąraše:',
 'recentchangesdays-max' => '(daugiausiai $1 {{PLURAL:$1|diena|dienos|dienų}})',
 'recentchangescount' => 'Numatytasis rodomas keitimų skaičius:',
-'prefs-help-recentchangescount' => 'Į tai įeina naujausi keitimai, puslapių istorijos ir specialiųjų veiksmų istorijos.',
+'prefs-help-recentchangescount' => 'Į tai įeina naujausi keitimai, puslapių istorijos ir specialiųjų veiksmų sąrašai.',
 'prefs-help-watchlist-token' => 'Įrašius slaptą raktą į šį laukelį, bus sugeneruotas RSS srautas su jūsų stebimųjų sąrašu.
 Bet kas, žinantis šio lauko raktą, galės matyti jūsų stebimų sąrašą, todėl pasirinkite saugią reikšmę.
 Galite panaudoti šią atsitiktinai sugeneruotą reikšmę: $1',
@@ -1269,7 +1283,7 @@ Galite panaudoti šią atsitiktinai sugeneruotą reikšmę: $1',
 'prefs-custom-css' => 'Asmeninis CSS',
 'prefs-custom-js' => 'Asmeninis JavaSript',
 'prefs-common-css-js' => 'Bendras CSS/JS visoms išvaizdoms:',
-'prefs-reset-intro' => 'Jūs galite pasinaudoti šiuo puslapiu atstatyti jūsų nustatymus į svetainės numatytuosius.
+'prefs-reset-intro' => 'Jūs galite pasinaudoti šiuo puslapiu, kad grąžintumėte savo nustatymus į svetainės numatytuosius.
 Tai nebeatšaukiama.',
 'prefs-emailconfirm-label' => 'El. pašto patvirtinimas:',
 'prefs-textboxsize' => 'Redagavimo lango dydis',
@@ -1351,8 +1365,8 @@ teisės",
 'group-suppress' => 'Peržiūrėtojai',
 'group-all' => '(visi)',
 
-'group-user-member' => 'Naudotojas',
-'group-autoconfirmed-member' => 'Automatiškai patvirtintas naudotojas',
+'group-user-member' => '{{GENDER:$1|naudotojas|naudotoja}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|automatiškai patvirtintas naudotojas|automatiškai patvirtinta naudotoja}}',
 'group-bot-member' => 'Botas',
 'group-sysop-member' => 'Administratorius',
 'group-bureaucrat-member' => 'Biurokratas',
@@ -1390,12 +1404,13 @@ teisės",
 'right-writeapi' => 'Naudoti rašymo API',
 'right-delete' => 'Trinti puslapius',
 'right-bigdelete' => 'Ištrinti puslapius su ilga istorija',
-'right-deleterevision' => 'Ištrinti ir atstatyti specifines puslapių versijas',
-'right-deletedhistory' => 'Žiūrėti ištrintų puslapių istoriją nerodant susieto teksto',
+'right-deletelogentry' => 'Naikinti ir anuliuoti konkrečius žurnalo įrašus',
+'right-deleterevision' => 'Ištrinti ir atkurti specifines puslapių versijas',
+'right-deletedhistory' => 'Žiūrėti ištrintų puslapių istoriją, nerodant susieto teksto',
 'right-deletedtext' => 'Peržiūrėti ištrintą tekstą ir skirtumus tarp ištrintų puslapio versijų.',
 'right-browsearchive' => 'Ieškoti ištrintų puslapių',
-'right-undelete' => 'Atstatyti puslapį',
-'right-suppressrevision' => 'Peržiūrėti ir atstatyti versijas, paslėptas nuo administratorių',
+'right-undelete' => 'Atkurti puslapį',
+'right-suppressrevision' => 'Peržiūrėti ir atkurti versijas, paslėptas nuo administratorių',
 'right-suppressionlog' => 'Žiūrėti privačius įvykių sąrašus',
 'right-block' => 'Blokuoti redagavimo galimybę kitiems naudotojams',
 'right-blockemail' => 'Blokuoti elektroninio pašto siuntimo galimybę naudotojui',
@@ -1427,7 +1442,7 @@ teisės",
 'right-passwordreset' => 'Peržiūrėti slaptažodžio pakeitimo e-mail laiškus',
 
 # User rights log
-'rightslog' => 'Naudotojų teisių istorija',
+'rightslog' => 'Naudotojų teisių pakeitimai',
 'rightslogtext' => 'Pateikiamas naudotojų teisių pakeitimų sąrašas.',
 'rightslogentry' => 'pakeista $1 grupės narystė iš $2 į $3',
 'rightslogentry-autopromote' => 'buvo automatiškai paaukštintas iš $2 į $3',
@@ -1454,7 +1469,7 @@ teisės",
 'action-deletedhistory' => 'žiūrėti šio ištrinto puslapio istoriją',
 'action-browsearchive' => 'ieškoti ištrintų puslapių',
 'action-undelete' => 'atkurti šį puslapį',
-'action-suppressrevision' => 'peržiūrėti ir atstatyti šią paslėptą reviziją',
+'action-suppressrevision' => 'peržiūrėti ir atkurti šią paslėptą versiją',
 'action-suppressionlog' => 'peržiūrėti šį privatų registrą',
 'action-block' => 'neleisti šiam naudotojui redaguoti',
 'action-protect' => 'pakeisti apsaugos lygius šiam puslapiui',
@@ -1530,19 +1545,20 @@ Puslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškin
 'upload-recreate-warning' => "'''Dėmėsio: Failas šiuo pavadinimu buvo ištrintas arba pervadintas.'''
 
 Jūsų patogumui pateiktas įrašas apie šio puslapio trynimą ar pervadinimą:",
-'uploadtext' => "Naudokitės žemiau pateikta forma failų įkėlimui.
-Norėdami peržiūrėti ar ieškoti anksčiau įkeltų paveikslėlių, eikite į [[Special:FileList|įkeltų failų sąrašą]], įkėlimai yra registruojami [[Special:Log/upload|įkėlimų istorijoje]], trynimai — [[Special:Log/delete|trynimų istorijoje]].
+'uploadtext' => "Kad įkeltumėte failą, naudokitės žemiau pateikta forma.
+Norėdami peržiūrėti ar ieškoti anksčiau įkeltų paveikslėlių, eikite į [[Special:FileList|įkeltų failų sąrašą]], įkėlimai yra registruojami [[Special:Log/upload|įkėlimų sąraše]], trynimai — [[Special:Log/delete|trynimų sąraše]].
 
 Norėdami panaudoti įkeltą failą puslapyje, naudokite tokias nuorodas:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Failas.jpg]]</nowiki></tt>''' norėdami naudoti pilną failo versiją
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Failas.png|200px|thumb|left|alternatyvusis tekstas]]</nowiki></tt>''' norėdami naudoti 200 pikselių pločio paveikslėlį rėmelyje puslapio kairėje; „alternatyvus tekstas“ bus naudojamas paveikslėlio aprašymui.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Failas.ogg]]</nowiki></tt>''' tiesioginei nuorodai į failą.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Failas.jpg]]</nowiki></code>''' norėdami naudoti pilną failo versiją
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Failas.png|200px|thumb|left|alternatyvusis tekstas]]</nowiki></code>''' norėdami naudoti 200 pikselių pločio paveikslėlį rėmelyje puslapio kairėje; „alternatyvus tekstas“ bus naudojamas paveikslėlio aprašymui.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Failas.ogg]]</nowiki></code>''' tiesioginei nuorodai į failą.",
 'upload-permitted' => 'Leidžiami failų tipai: $1.',
 'upload-preferred' => 'Pageidautini failų tipai: $1.',
 'upload-prohibited' => 'Uždrausti failų tipai: $1.',
-'uploadlog' => 'įkėlimų istorija',
-'uploadlogpage' => 'Įkėlimų istorija',
-'uploadlogpagetext' => 'Žemiau pateikiamas paskutinių failų įkėlimų istorija.',
+'uploadlog' => 'įkėlimų sąrašas',
+'uploadlogpage' => 'Įkėlimų sąrašas',
+'uploadlogpagetext' => 'Žemiau pateikiamas paskutinių failų įkėlimų sąrašas.
+Taip pat galite peržvelgti [[Special:NewFiles|naujausių failų galeriją]].',
 'filename' => 'Failo vardas',
 'filedesc' => 'Aprašymas',
 'fileuploadsummary' => 'Komentaras:',
@@ -1578,20 +1594,20 @@ Norėdami panaudoti įkeltą failą puslapyje, naudokite tokias nuorodas:
 'largefileserver' => 'Šis failas yra didesnis nei serveris yra sukonfigūruotas leisti.',
 'emptyfile' => 'Panašu, kad failas, kurį įkėlėte yra tuščias. Tai gali būti dėl klaidos failo pavadinime. Pasitikrinkite ar tikrai norite įkelti šitą failą.',
 'windows-nonascii-filename' => 'Ši viki neleidžia naudoti failų vardų su specialiais simboliais.',
-'fileexists' => "Failas tuo pačiu vardu jau egzistuoja, prašome pažiūrėti '''<tt>[[:$1]]</tt>''', jei nesate tikras, ar norite perrašyti šį failą.
-[[$1|thumb]]",
-'filepageexists' => "Šio failo aprašymo puslapis jau buvo sukurtas '''<tt>[[:$1]]</tt>''', bet šiuo metu nėra jokio failo šiuo pavadinimu.
+'fileexists' => 'Failas tuo pačiu vardu jau egzistuoja, prašome pažiūrėti <strong>[[:$1]]</strong>, jei nesate tikras, ar norite perrašyti šį failą.
+[[$1|thumb]]',
+'filepageexists' => 'Šio failo aprašymo puslapis jau buvo sukurtas <strong>[[:$1]]</strong>, bet šiuo metu nėra jokio failo šiuo pavadinimu.
 Jūsų įvestas komentaras neatsiras aprašymo puslapyje.
 Jei norite, kad jūsų komentaras ten atsirastų, jums reikia jį pakeisti pačiam.
-[[$1|thumb]]",
-'fileexists-extension' => "Failas su panašiu pavadinimu jau yra: [[$2|thumb]]
-* Įkeliamo failo pavadinimas: '''<tt>[[:$1]]</tt>'''
-* Jau esančio failo pavadinimas: '''<tt>[[:$2]]</tt>'''
-Prašome pasirinkti kitą vardą.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Failas su panašiu pavadinimu jau yra: [[$2|thumb]]
+* Įkeliamo failo pavadinimas: <strong>[[:$1]]</strong>
+* Jau esančio failo pavadinimas: <strong>[[:$2]]</strong>
+Prašome pasirinkti kitą vardą.',
 'fileexists-thumbnail-yes' => "Failas turbūt yra sumažinto dydžio failas ''(miniatiūra)''. [[$1|thumb]]
-Prašome peržiūrėti failą '''<tt>[[:$1]]</tt>'''.
+Prašome peržiūrėti failą <strong>[[:$1]]</strong>.
 Jeigu tai yra toks pats pradinio dydžio paveikslėlis, tai įkelti papildomos miniatūros nereikia.",
-'file-thumbnail-no' => "Failo pavadinimas prasideda  '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Failo pavadinimas prasideda  <strong>$1</strong>.
 Atrodo, kad yra sumažinto dydžio paveikslėlis ''(miniatiūra)''.
 Jei jūs turite šį paveisklėlį pilna raiška, įkelkite šitą, priešingu atveju prašome pakeisti failo pavadinimą.",
 'fileexists-forbidden' => 'Failas tokiu pačiu vardu jau egzistuoja ir negali būti perrašytas;
@@ -1736,8 +1752,8 @@ Dėl saugumo, img_auth.php yra išjungtas.',
 'upload_source_file' => ' (failas jūsų kompiuteryje)',
 
 # Special:ListFiles
-'listfiles-summary' => 'This special page shows all uploaded files.
-When filtered by user, only files where that user uploaded the most recent version of the file are shown.',
+'listfiles-summary' => 'Šiame specialiame puslapyje rodomi visi įkelti failai.
+Kai sąrašas susiaurinamas pagal naudotoją, rodomi tik tie failai, kurių naujausią versiją jis yra įkėlęs.',
 'listfiles_search_for' => 'Ieškoti failo pavadinimo:',
 'imgfile' => 'failas',
 'listfiles' => 'Failų sąrašas',
@@ -1819,7 +1835,7 @@ Informacija iš [$2 failo aprašymo puslapio] yra pateikiama žemiau.',
 
 # MIME search
 'mimesearch' => 'MIME paieška',
-'mimesearch-summary' => 'Šis puslapis leidžia rodyti failus pagal jų MIME tipą. Įveskite: turiniotipas/potipis, pvz. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Šis puslapis leidžia rodyti failus pagal jų MIME tipą. Įveskite: turiniotipas/potipis, pvz. <code>image/jpeg</code>.',
 'mimetype' => 'MIME tipas:',
 'download' => 'parsisiųsti',
 
@@ -1854,10 +1870,10 @@ Informacija iš [$2 failo aprašymo puslapio] yra pateikiama žemiau.',
 'statistics-pages-desc' => 'Visi puslapiai, tarp jų aptarimo, nukreipimų, ir kiti puslapiai.',
 'statistics-files' => 'Įkelti failai',
 'statistics-edits' => 'Puslapių redagavimų skaičius nuo {{SITENAME}} sukūrimo',
-'statistics-edits-average' => 'Vidutinis redakcijų kiekis puslapiui',
+'statistics-edits-average' => 'Vidutinis puslapio keitimų skaičius',
 'statistics-views-total' => 'Iš viso peržiūrų',
 'statistics-views-total-desc' => 'Neegzistuojančių ir specialiųjų puslapių parodymai neįtraukti',
-'statistics-views-peredit' => 'Peržiūrų skaičius redakcijai',
+'statistics-views-peredit' => 'Peržiūrų skaičius puslapio versijai',
 'statistics-users' => 'Registruotų [[Special:ListUsers|naudotojų]]',
 'statistics-users-active' => 'Aktyvių naudotojų',
 'statistics-users-active-desc' => 'Naudotojai, kurie per {{PLURAL:$1|paskutinę dieną|paskutines $1 dienų}} padarė keitimų',
@@ -1967,12 +1983,13 @@ Primename, kad kitos svetainės gali turėti tiesioginę nuorodą į failą, bet
 # Special:Log
 'specialloguserlabel' => 'Naudotojas:',
 'speciallogtitlelabel' => 'Pavadinimas:',
-'log' => 'Specialiųjų veiksmų istorija',
-'all-logs-page' => 'Visos viešosios istorijos',
-'alllogstext' => 'Bendras visų galimų „{{SITENAME}}“ specialiųjų veiksmų istorijų rodinys.
-Galima sumažinti rezultatų skaičių patikslinant veiksmo rūšį, naudotoją ar susijusį puslapį.',
-'logempty' => 'Istorijoje nėra jokių atitinkančių įvykių.',
+'log' => 'Specialiųjų veiksmų sąrašas',
+'all-logs-page' => 'Visi viešieji sąrašai',
+'alllogstext' => 'Bendrai pateikiamas visų galimų „{{SITENAME}}“ specialiųjų veiksmų sąrašas.
+Galima sumažinti rezultatų skaičių, patikslinant veiksmo rūšį, naudotoją ar susijusį puslapį.',
+'logempty' => 'Sąraše nėra jokių atitinkančių įvykių.',
 'log-title-wildcard' => 'Ieškoti pavadinimų, prasidedančių šiuo tekstu',
+'showhideselectedlogentries' => 'Rodyti/slėpti pasirinktus sąrašo elementus',
 
 # Special:AllPages
 'allpages' => 'Visi puslapiai',
@@ -2018,7 +2035,7 @@ Taip pat žiūrėkite [[Special:WantedCategories|trokštamas kategorijas]].',
 'linksearch-ok' => 'Ieškoti',
 'linksearch-text' => 'Galima naudoti žvaigždutes, pvz., „*.wikipedia.org“.<br />
 Yra būtinas bent jau aukščiausio lygio domenas, pvz., „*.org“.<br />
-Palaikomi protokolai: <tt>$1</tt> (nei vieno iš jų nenurodykite paieškoje).',
+Palaikomi protokolai: <code>$1</code> (nei vieno iš jų nenurodykite paieškoje).',
 'linksearch-line' => '$1 yra susietas iš $2',
 'linksearch-error' => 'Žvaigždutės gali būti tik adreso pradžioje.',
 
@@ -2119,7 +2136,7 @@ taip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąra
 'watchlist-details' => 'Stebima {{PLURAL:$1|$1 puslapis|$1 puslapiai|$1 puslapių}} neskaičiuojant aptarimų puslapių.',
 'wlheader-enotif' => '* El. pašto priminimai yra įjungti.',
 'wlheader-showupdated' => "* Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
-'watchmethod-recent' => 'tikrinami paskutiniai keitimai stebimiems puslapiams',
+'watchmethod-recent' => 'tikrinami naujausi stebimųjų puslapių pakeitimai',
 'watchmethod-list' => 'ieškoma naujausių keitimų stebimuose puslapiuose',
 'watchlistcontains' => 'Jūsų stebimųjų sąraše yra $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}}.',
 'iteminvalidname' => 'Problema su elementu „$1“, neteisingas vardas...',
@@ -2184,14 +2201,14 @@ Atsiliepimai ir pagalba:
 'delete-legend' => 'Trynimas',
 'historywarning' => "'''Dėmesio:''' Trinamas puslapis turi istoriją su maždaug $1 {{PLURAL:$1|versija|versijomis|versijų}}:",
 'confirmdeletetext' => 'Jūs pasirinkote ištrinti puslapį ar paveikslėlį kartu su visa jo istorija.
-Prašome patvirtinti, kad jūs tikrai norite tai padaryti, žinote apie galimus padarinius, ir kad jūs tai darote atsižvelgdami į [[{{MediaWiki:Policy-url}}|politiką]].',
+Prašome patvirtinti, kad jūs tikrai norite tai padaryti, žinote apie galimus padarinius ir kad tai darote pagal [[{{MediaWiki:Policy-url}}|taisykles]].',
 'actioncomplete' => 'Veiksmas atliktas',
 'actionfailed' => 'Veiksmas atšauktas',
 'deletedtext' => '„$1“ ištrintas.
 Paskutinių šalinimų istorija - $2.',
-'dellogpage' => 'Šalinimų istorija',
+'dellogpage' => 'Šalinimų sąrašas',
 'dellogpagetext' => 'Žemiau pateikiamas paskutinių trynimų sąrašas.',
-'deletionlog' => 'šalinimų istorija',
+'deletionlog' => 'šalinimų sąrašas',
 'reverted' => 'Atkurta į ankstesnę versiją',
 'deletecomment' => 'Priežastis:',
 'deleteotherreason' => 'Kita/papildoma priežastis:',
@@ -2208,6 +2225,8 @@ Paskutinių šalinimų istorija - $2.',
 'rollback' => 'Atmesti keitimus',
 'rollback_short' => 'Atmesti',
 'rollbacklink' => 'atmesti',
+'rollbacklinkcount' => 'atmesti $1 {{PLURAL:$1|keitimą|keitimus}}',
+'rollbacklinkcount-morethan' => 'atmesti daugiau nei $1 {{PLURAL:$1|keitimą|keitimų}}',
 'rollbackfailed' => 'Atmetimas nepavyko',
 'cantrollback' => 'Negalima atmesti redagavimo; paskutinis keitęs naudotojas yra šio puslapio autorius.',
 'alreadyrolled' => 'Nepavyko atmesti paskutinio [[User:$2|$2]] ([[User talk:$2|Aptarimas]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) daryto puslapio [[:$1]] keitimo;
@@ -2215,7 +2234,7 @@ kažkas jau pakeitė puslapį arba suspėjo pirmas atmesti keitimą.
 
 Paskutimas keitimas darytas naudotojo [[User:$3|$3]] ([[User talk:$3|Aptarimas]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Redagavimo komentaras: „''$1''“.",
-'revertpage' => 'Atmestas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]]) pakeitimas; sugrąžinta naudotojo [[User:$1|$1]] versija',
+'revertpage' => 'Atmestas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]]) pakeitimas; sugrąžinta [[User:$1|$1]] versija',
 'revertpage-nouser' => 'Atmesti (naudotojo vardas pašalintas) pakeitimai, grąžinta prieš tai buvusi [[User:$1|$1]] versija',
 'rollback-success' => 'Atmesti $1 pakeitimai;
 grąžinta prieš tai buvusi $2 versija.',
@@ -2226,8 +2245,8 @@ grąžinta prieš tai buvusi $2 versija.',
 Prašome paspausti „atgal“ ir perkraukite puslapį iš kurio atėjote, ir pamėginkite vėl.',
 
 # Protect
-'protectlogpage' => 'Rakinimų istorija',
-'protectlogtext' => 'Žemiau yra puslapių užrakinimų bei atrakinimų istorija.
+'protectlogpage' => 'Rakinimų sąrašas',
+'protectlogtext' => 'Žemiau yra puslapių užrakinimų bei atrakinimų sąrašas.
 Dabar veikiančių puslapių apsaugų sąrašą rasite [[Special:ProtectedPages|apsaugotų puslapių sąraše]].',
 'protectedarticle' => 'užrakino „[[$1]]“',
 'modifiedarticleprotection' => 'pakeistas „[[$1]]“ apsaugos lygis',
@@ -2269,9 +2288,10 @@ Dabar veikiančių puslapių apsaugų sąrašą rasite [[Special:ProtectedPages|
 'protect-otherreason-op' => 'Kita priežastis',
 'protect-dropdown' => '*Įprastos užrakinimo priežastys
 ** Intensyvus vandalizmas
-** Intensyvus nuorodų reklamavimas
-** Neproduktyvus redagavimo karas
-** Didelės svarbos puslapis',
+** Nuolatinis nepageidautinų nuorodų dėliojimas
+** Beprasmis redagavimo karas
+** Didelės svarbos puslapis
+** Pakartotinis ištrinto puslapio atkūrinėjimas',
 'protect-edit-reasonlist' => 'Keisti užrakinimo priežastis',
 'protect-expiry-options' => '1 valanda:1 hour,1 diena:1 day,1 savaitė:1 week,2 savaitės:2 weeks,1 mėnuo:1 month,3 mėnesiai:3 months,6 mėnesiai:6 months,1 metai:1 year,neribotai:infinite',
 'restriction-type' => 'Leidimas:',
@@ -2292,15 +2312,15 @@ Dabar veikiančių puslapių apsaugų sąrašą rasite [[Special:ProtectedPages|
 'restriction-level-all' => 'bet koks',
 
 # Undelete
-'undelete' => 'Atstatyti ištrintą puslapį',
+'undelete' => 'Atkurti ištrintą puslapį',
 'undeletepage' => 'Rodyti ir atkurti ištrintus puslapius',
 'undeletepagetitle' => "'''Tai sudaryta iš ištrintų [[:$1]] versijų'''.",
 'viewdeletedpage' => 'Rodyti ištrintus puslapius',
 'undeletepagetext' => '{{PLURAL:$1|Šis $1 puslapis buvo ištrintas|Šie $1 puslapiai buvo ištrinti|Šie $1 puslapių buvo ištrinti}}, bet dar yra archyve ir gali būti {{PLURAL:$1|atkurtas|atkurti|atkurti}}.
 Archyvas gali būti periodiškai valomas.',
-'undelete-fieldset-title' => 'Atstatyti versijas',
+'undelete-fieldset-title' => 'Atkurti versijas',
 'undeleteextrahelp' => "Norėdami atkurti visą puslapio istoriją, palikite visas varneles nepažymėtas ir spauskite '''''{{int:undeletebtn}}'''''.
-Norėdami atlikti pasirinktinį atstatymą, pažymėkite varneles tų versijų, kurias norėtumėte atstatyti, ir spauskite '''''{{int:undeletebtn}}'''''.",
+Norėdami atlikti pasirinktinį atkūrimą, pažymėkite varneles tų versijų, kurias norėtumėte atkurti, ir spauskite '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '$1 {{PLURAL:$1|versija|versijos|versijų}} suarchyvuota',
 'undeletehistory' => 'Jei atstatysite puslapį, istorijoje bus atstatytos visos versijos.
 Jei po ištrynimo buvo sukurtas puslapis tokiu pačiu pavadinimu, atstatytos versijos atsiras ankstesnėje istorijoje.',
@@ -2311,7 +2331,7 @@ Tokiais atvejais, jums reikia atžymėti arba atslėpti naujausią ištrintą ve
 'undeleterevision-missing' => 'Neteisinga arba dingusi versija. Jūs turbūt turite blogą nuorodą, arba versija buvo atkurta arba pašalinta iš archyvo.',
 'undelete-nodiff' => 'Nerasta jokių ankstesnių versijų.',
 'undeletebtn' => 'Atkurti',
-'undeletelink' => 'žiūrėti/atstatyti',
+'undeletelink' => 'žiūrėti/atkurti',
 'undeleteviewlink' => 'žiūrėti',
 'undeletereset' => 'Iš naujo',
 'undeleteinvert' => 'Žymėti priešingai',
@@ -2323,7 +2343,7 @@ Tokiais atvejais, jums reikia atžymėti arba atslėpti naujausią ištrintą ve
 'undeletedpage' => "'''$1 buvo atkurtas'''
 
 Peržiūrėkite [[Special:Log/delete|trynimų sąrašą]], norėdami rasti paskutinių trynimų ir atkūrimų sąrašą.",
-'undelete-header' => 'Žiūrėkite [[Special:Log/delete|trynimo istorijoje]] paskiausiai ištrintų puslapių.',
+'undelete-header' => 'Kad sužinotumėte, kurie puslapiai paskiausiai ištrinti, žiūrėkite [[Special:Log/delete|šalinimų sąrašą]].',
 'undelete-search-title' => 'Panaikintų puslapių paieška',
 'undelete-search-box' => 'Ieškoti ištrintų puslapių',
 'undelete-search-prefix' => 'Rodyti puslapius pradedant su:',
@@ -2344,14 +2364,14 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Vardų sritis:',
 'invert' => 'Žymėti priešingai',
-'tooltip-invert' => 'Įjunkite šią parinktį jei norite paslėpti nurodytos vardų srities (ir susijusių, jei įjungta parinktis) puslapių pakeitimus',
-'namespace_association' => 'Susiję vardų',
-'tooltip-namespace_association' => 'Įjunkite šią parinktį, kad taipogi įtrauktumėte pokalbių arba temos sritį, susieta su pasirinkta sritimi',
+'tooltip-invert' => 'Įjunkite šią parinktį, jei norite paslėpti nurodytos vardų srities (ir susijusių, jei įjungta parinktis) puslapių pakeitimus',
+'namespace_association' => 'Susijusi vardų sritis',
+'tooltip-namespace_association' => 'Įjunkite šią parinktį, kad taip pat įtrauktumėte aptarimų arba temos sritį, susijusią su pasirinkta sritimi',
 'blanknamespace' => '(Pagrindinė)',
 
 # Contributions
-'contributions' => 'Naudotojo įnašas',
-'contributions-title' => 'Naudotojo $1 indėlis',
+'contributions' => 'Naudotojo indėlis',
+'contributions-title' => '{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis',
 'mycontris' => 'Mano įnašas',
 'contribsub2' => 'Naudotojo $1 ($2)',
 'nocontribs' => 'Jokie keitimai neatitiko šių kriterijų.',
@@ -2359,13 +2379,13 @@ $1',
 'month' => 'Nuo mėnesio (ir anksčiau):',
 'year' => 'Nuo metų (ir anksčiau):',
 
-'sp-contributions-newbies' => 'Rodyti tik naujų paskyrų įnašus',
-'sp-contributions-newbies-sub' => 'Naujoms paskyroms',
-'sp-contributions-newbies-title' => 'Naudotojų keitimai naujoms paskyroms',
-'sp-contributions-blocklog' => 'Blokavimų istorija',
+'sp-contributions-newbies' => 'Rodyti tik naujų paskyrų keitimus',
+'sp-contributions-newbies-sub' => 'Neseniai prisiregistravusieji',
+'sp-contributions-newbies-title' => 'Naujai užsiregistravusių naudotojų indėlis',
+'sp-contributions-blocklog' => 'Blokavimų sąrašas',
 'sp-contributions-deleted' => 'ištrintas naudotojo indėlis',
 'sp-contributions-uploads' => 'nuotraukos',
-'sp-contributions-logs' => 'Specialiųjų veiksmų istorija',
+'sp-contributions-logs' => 'Specialiųjų veiksmų sąrašas',
 'sp-contributions-talk' => 'Aptarimas',
 'sp-contributions-userrights' => 'naudotojų teisių valdymas',
 'sp-contributions-blocked-notice' => 'Šis naudotojas šiuo metu užblokuotas.
@@ -2397,30 +2417,30 @@ Paskutinis blokavimo įrašas pateikiamas žemiau:',
 'whatlinkshere-filters' => 'Filtrai',
 
 # Block/unblock
-'autoblockid' => 'Autoblock # $1',
+'autoblockid' => 'Automatinis blokavimas # $1',
 'block' => 'Blokuoti naudotoją',
 'unblock' => 'Atblokuoti naudotoją',
 'blockip' => 'Blokuoti naudotoją',
 'blockip-title' => 'Blokuoti naudotoją',
 'blockip-legend' => 'Blokuoti naudotoją',
-'blockiptext' => 'Naudokite šią formą norėdami uždrausti rašymo teises nurodytui IP adresui ar naudotojui. Tai turėtų būti atliekama tam, kad sustabdytumėte vandalizmą, ir pagal [[{{MediaWiki:Policy-url}}|politiką]].
-Žemiau nurodykite tikslią priežastį (pavyzdžiui, nurodydami sugadintus puslapius).',
+'blockiptext' => 'Naudokite šią formą, kad uždraustumėte redagavimo prieigą pasirinktam IP adresui ar naudotojui. Tai turėtų būti atliekama tik tam, kad sustabdytumėte vandalizmą, ir neprieštarauti [[{{MediaWiki:Policy-url}}|projekte galiojančioms taisyklėms]].
+Žemiau pateikite tikslią priežastį (pavyzdžiui, nurodydami sugadintus puslapius).',
 'ipadressorusername' => 'IP adresas arba naudotojo vardas',
 'ipbexpiry' => 'Galiojimo laikas',
 'ipbreason' => 'Priežastis:',
 'ipbreasonotherlist' => 'Kita priežastis',
 'ipbreason-dropdown' => '*Bendrosios blokavimo priežastys
-** Melagingos informacijos įterpimas
+** Klaidingos informacijos įterpimas
 ** Turinio šalinimas iš puslapių
 ** Kitų svetainių reklamavimas
-** Nesąmonių/bet ko įterpimas į puslapius
-** GÄ\85sdinimai/Ä®žeidinėjimai
+** Nesusijusio arba beprasmio teksto įterpimas į puslapius
+** GÄ\85sdinimai/įžeidinėjimai
 ** Piktnaudžiavimas keliomis paskyromis
 ** Nepriimtinas naudotojo vardas',
-'ipb-hardblock' => 'Neleisti prisijungusius naudotojus nuo redagavimo iš šio IP adreso',
+'ipb-hardblock' => 'Neleisti prisijungusiems naudotojams redaguoti iš šio IP adreso',
 'ipbcreateaccount' => 'Neleisti kurti paskyrų',
 'ipbemailban' => 'Neleisti naudotojui siųsti el. pašto',
-'ipbenableautoblock' => 'Automatiškai blokuoti šio naudotojo paskiausiai naudotą IP adresą, bei bet kokius vėlesnius IP adresus, iš kurių jie mėgina redaguoti',
+'ipbenableautoblock' => 'Automatiškai blokuoti paskutinį naudotojo naudotą IP adresą ir visus kitus adresus, iš kurių jis bandys redaguoti',
 'ipbsubmit' => 'Blokuoti šį naudotoją',
 'ipbother' => 'Kitoks laikas',
 'ipboptions' => '2 valandos:2 hours,1 diena:1 day,3 dienos:3 days,1 savaitė:1 week,2 savaitės:2 weeks,1 mėnesis:1 month,3 mėnesiai:3 months,6 mėnesiai:6 months,1 metai:1 year,neribotai:infinite',
@@ -2428,22 +2448,22 @@ Paskutinis blokavimo įrašas pateikiamas žemiau:',
 'ipbotherreason' => 'Kita/papildoma priežastis',
 'ipbhidename' => 'Slėpti naudotojo vardą keitimuose bei sąrašuose',
 'ipbwatchuser' => 'Stebėti šio naudotojo puslapį ir jo aptarimų puslapį',
-'ipb-disableusertalk' => 'Neleiskite šiam nuo redagavimo savo aptarimų puslapis naudotojui užblokuotas',
-'ipb-change-block' => 'Perblokuoti šį naudotoją su šiais nustatymais',
-'ipb-confirm' => 'Patvirtinkite blokas',
+'ipb-disableusertalk' => 'Neleisti redaguoti savo naudotojo aptarimo puslapio',
+'ipb-change-block' => 'Iš naujo užblokuoti naudotoją, naudojant šiuos nustatymus',
+'ipb-confirm' => 'Patvirtinkite blokavimą',
 'badipaddress' => 'Neleistinas IP adresas',
 'blockipsuccesssub' => 'Užblokavimas pavyko',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] buvo užblokuotas.<br />
 Aplankykite [[Special:BlockList|IP blokavimų istoriją]] norėdami jį peržiūrėti.',
-'ipb-blockingself' => 'Jūs ruošiatės blokuoti sau! Ar tikrai norite tai padaryti?',
-'ipb-confirmhideuser' => 'Jūs ruošiatės užblokuoti tam tikro vartotojo su "slėpti vartotojo" įjungtas. Tai bus nuslopinti vartotojo vardą visuose sąrašuose ir žurnalo įrašus. Ar tikrai norite tai padaryti?',
+'ipb-blockingself' => 'Jūs ruošiatės užblokuoti save! Ar tikrai norite tai padaryti?',
+'ipb-confirmhideuser' => 'Jūs ruošiatės užblokuoti naudotoją, pasirinkę „slėpti naudotoją“ nustatymą. Tai paslėps naudotojo vardą visuose sąrašuose ir žurnalo įrašuose. Ar tikrai norite tai padaryti?',
 'ipb-edit-dropdown' => 'Redaguoti blokavimų priežastis',
 'ipb-unblock-addr' => 'Atblokuoti $1',
 'ipb-unblock' => 'Atblokuoti naudotojo vardą arba IP adresą',
-'ipb-blocklist' => 'Rodyti egzistuončius blokavimus',
+'ipb-blocklist' => 'Rodyti egzistuojančius blokavimus',
 'ipb-blocklist-contribs' => '$1 indėlis',
 'unblockip' => 'Atblokuoti naudotoją',
-'unblockiptext' => 'Naudokite šią formą, kad atkurtumėte rašymo teises
+'unblockiptext' => 'Naudokite šią formą, kad atkurtumėte redagavimo galimybę
 ankščiau užblokuotam IP adresui ar naudotojui.',
 'ipusubmit' => 'Atblokuoti šį adresą',
 'unblocked' => '[[User:$1|$1]] buvo atblokuotas',
@@ -2452,15 +2472,15 @@ ankščiau užblokuotam IP adresui ar naudotojui.',
 'blocklist' => 'Blokuoti naudotojai',
 'ipblocklist' => 'Blokuoti naudotojai',
 'ipblocklist-legend' => 'Rasti užblokuotą naudotoją',
-'blocklist-userblocks' => 'Slėpti į blokus',
+'blocklist-userblocks' => 'Slėpti paskyrų blokavimus',
 'blocklist-tempblocks' => 'Slėpti laikinus blokavimus',
-'blocklist-addressblocks' => 'Slėpti vieną IP blokų',
-'blocklist-rangeblocks' => 'Slėpti diapazono blokai',
-'blocklist-timestamp' => 'Laiko žymė',
-'blocklist-target' => 'Tikslinė',
+'blocklist-addressblocks' => 'Slėpti vieno IP adreso blokavimus',
+'blocklist-rangeblocks' => 'Slėpti IP adresų sričių blokavimus',
+'blocklist-timestamp' => 'Laiko žyma',
+'blocklist-target' => 'Užblokuotasis',
 'blocklist-expiry' => 'Galioja iki',
-'blocklist-by' => 'Blokavimo admin',
-'blocklist-params' => 'Blokuoti duomenys',
+'blocklist-by' => 'Užblokavęs administratorius',
+'blocklist-params' => 'Blokavimo nustatymai',
 'blocklist-reason' => 'Priežastis',
 'ipblocklist-submit' => 'Ieškoti',
 'ipblocklist-localblock' => 'Vietinis blokavimas',
@@ -2473,14 +2493,14 @@ ankščiau užblokuotam IP adresui ar naudotojui.',
 'emailblock' => 'el. paštas užblokuotas',
 'blocklist-nousertalk' => 'negali redaguoti savo aptarimų puslapio',
 'ipblocklist-empty' => 'Blokavimų sąrašas tuščias.',
-'ipblocklist-no-results' => 'Prašomas IP adresas ar naudotojo vardas nėra užblokuotas.',
+'ipblocklist-no-results' => 'Pasirinktas IP adresas ar naudotojo vardas nėra užblokuotas.',
 'blocklink' => 'blokuoti',
 'unblocklink' => 'atblokuoti',
 'change-blocklink' => 'keisti blokavimo nustatymus',
 'contribslink' => 'įnašas',
-'emaillink' => 'pasiųsti e-mail laišką',
+'emaillink' => 'siųsti el. laišką',
 'autoblocker' => 'Jūs buvote automatiškai užblokuotas, nes jūsų IP adresą neseniai naudojo „[[User:$1|$1]]“. Nurodyta naudotojo $1 blokavimo priežastis: „$2“.',
-'blocklogpage' => 'Blokavimų istorija',
+'blocklogpage' => 'Blokavimų sąrašas',
 'blocklog-showlog' => 'Šis naudotojas buvo užblokuotas.
 Pateikiamas paskutinis blokavimo istorijos įrašas.',
 'blocklog-showsuppresslog' => 'Šis naudotojas buvo užblokuotas ir paslėptas anksčiau.
@@ -2498,26 +2518,26 @@ Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|
 'block-log-flags-nousertalk' => 'negali redaguoti savo naudotojo aptarimo puslapio',
 'block-log-flags-angry-autoblock' => 'išplėstasis automatinis blokavimas įjungtas',
 'block-log-flags-hiddenname' => 'naudotojo vardas paslėptas',
-'range_block_disabled' => 'Administratoriaus galimybė kurti intevalinius blokus yra išjungta.',
+'range_block_disabled' => 'Administratoriams neleidžiama blokuoti IP adresų sričių.',
 'ipb_expiry_invalid' => 'Galiojimo laikas neleistinas.',
-'ipb_expiry_temp' => 'Paslėptų naudotojų vardų blokavimas turi būti nuolatinis.',
+'ipb_expiry_temp' => 'Paslėptų naudotojų vardų blokavimas turi būti neribotas.',
 'ipb_hide_invalid' => 'Negalima paslėpti šios paskyros; ji gali turėti per daug keitimų.',
 'ipb_already_blocked' => '„$1“ jau užblokuotas',
 'ipb-needreblock' => '$1 jau yra užblokuotas. Ar norite pakeisti nustatymus?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Kitas blokavimas|Kiti blokavimai}}',
-'unblock-hideuser' => 'Jūs negalite atblokuoti vartotoją, nes jų vardas buvo paslėpta.',
+'unblock-hideuser' => 'Jūs negalite atblokuoti šio naudotojo, nes jo vardas buvo paslėptas.',
 'ipb_cant_unblock' => 'Klaida: Blokavimo ID $1 nerastas. Galbūt jis jau atblokuotas.',
 'ipb_blocked_as_range' => 'Klaida: IP $1 nebuvo užblokuotas tiesiogiai, tad negali būti atblokuotas. Tačiau jis buvo užblokuotas kaip srities $2 dalis, kuri gali būti atblokuota.',
 'ip_range_invalid' => 'Neleistina IP sritis.',
 'ip_range_toolarge' => 'Didesni nei /$1 blokai neleidžiami.',
 'blockme' => 'Užblokuoti mane',
-'proxyblocker' => 'Tarpinių serverių blokuotojas',
+'proxyblocker' => 'Tarpinių serverių („proxy“) blokavimo priemonė',
 'proxyblocker-disabled' => 'Ši funkcija yra išjungta.',
 'proxyblockreason' => 'Jūsų IP adresas yra užblokuotas, nes jis yra atvirasis tarpinis serveris. Prašome susisiekti su savo interneto paslaugų tiekėju ar technine pagalba ir praneškite jiems apie šią svarbią saugumo problemą.',
 'proxyblocksuccess' => 'Atlikta.',
 'sorbsreason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės.',
 'sorbs_create_account_reason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės. Jūs negalite sukurti paskyros',
-'cant-block-while-blocked' => 'Jūs negalite blokuoti kitų naudotojų kuomet pats esate užblokuotas.',
+'cant-block-while-blocked' => 'Jūs negalite blokuoti kitų naudotojų, pats būdamas užblokuotas.',
 'cant-see-hidden-user' => 'Naudotojas, kurį bandote užblokuoti, jau yra užblokuotas arba paslėptas.
 Kadangi jūs neturi hideuser teisės, jūs negalite pamatyti arba pakeisti naudotojo blokavimo.',
 'ipbblocked' => 'Jūs negalite blokuoti ar atblokuoti kitų naudotojų, nes pats esate užblokuotas',
@@ -2588,7 +2608,7 @@ dėl to šį veiksmą vykdykite tik įsitikinę, kad suprantate visas pasekmes."
 
 Šiais atvejais jūs savo nuožiūra turite perkelti arba apjungti aptarimo puslapį.",
 'movearticle' => 'Pervardinti puslapį:',
-'moveuserpage-warning' => "'''Dėmesio:''' Jūs ruošiatės perkelti naudotojo puslapį. Atkreipkite dėmesį, kad bus perkeltas tik puslapis, naudotojas ''nebus'' pervadintas.",
+'moveuserpage-warning' => "'''Dėmesio:''' Jūs ruošiatės perkelti naudotojo puslapį. Atkreipkite dėmesį, kad bus perkeltas tik puslapis, naudotojas ''nebus'' pervadintas.",
 'movenologin' => 'Neprisijungęs',
 'movenologintext' => 'Norėdami pervadinti puslapį, turite būti užsiregistravęs naudotojas ir būti  [[Special:UserLogin|prisijungęs]].',
 'movenotallowed' => 'Jūs neturite teisių pervadinti puslapių.',
@@ -2617,7 +2637,7 @@ Prašome sujungti šiuos puslapius.'''",
 'movepage-page-moved' => 'Puslapis $1 perkeltas į $2.',
 'movepage-page-unmoved' => 'Puslapio $1 negalima perkelti į $2.',
 'movepage-max-pages' => 'Daugiausiai $1 {{PLURAL:$1|puslapis buvo perkeltas|puslapiai buvo perkelti|puslapių buvo perkelta}} ir daugiau nebus perkelta automatiškai.',
-'movelogpage' => 'Pervardinimų istorija',
+'movelogpage' => 'Perkėlimų sąrašas',
 'movelogpagetext' => 'Pervardintų puslapių sąrašas.',
 'movesubpage' => '{{PLURAL:$1|Subpuslapis|Subpuslapiai}}',
 'movesubpagetext' => 'Žemiau yra šio puslapio $1 {{PLURAL:$1|subpuslapis|subpuslapiai|subpuslapių}}.',
@@ -2749,7 +2769,7 @@ Išsaugokite jį savo kompiuteryje ir įkelkite jį čia.',
 'import-error-invalid' => 'Puslapis "$1" nebuvo įkeltas, kadangi jo vardas yra neteisingas.',
 
 # Import log
-'importlogpage' => 'Importo istorija',
+'importlogpage' => 'Importavimų sąrašas',
 'importlogpagetext' => 'Administraciniai puslapių importai su keitimų istorija iš kitų wiki projektų.',
 'import-logentry-upload' => 'importuota $1 įkeliant failą',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}',
@@ -2765,6 +2785,7 @@ Išsaugokite jį savo kompiuteryje ir įkelkite jį čia.',
 'javascripttest-pagetext-frameworks' => 'Prašome pasirinkti vieną iš išvardintų testavimo struktūrų: $1',
 'javascripttest-pagetext-skins' => 'Pasirinkite naudotojo sąsajos išvaizdą, kuriai atliksite testavimą:',
 'javascripttest-qunit-intro' => 'Peržiūrėkite [$1 testavimo dokumentaciją]',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit bandymų komplektas',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Jūsų naudotojo puslapis',
@@ -2792,7 +2813,7 @@ Išsaugokite jį savo kompiuteryje ir įkelkite jį čia.',
 'tooltip-search' => 'Ieškoti šiame projekte',
 'tooltip-search-go' => 'Eiti į puslapį su tokiu pavadinimu, jei toks yra',
 'tooltip-search-fulltext' => 'Ieškoti puslapių su šiuo tekstu',
-'tooltip-p-logo' => 'Pradinis puslapis',
+'tooltip-p-logo' => 'Eiti į pradinį puslapį',
 'tooltip-n-mainpage' => 'Eiti į pradinį puslapį',
 'tooltip-n-mainpage-description' => 'Eiti į pradinį puslapį',
 'tooltip-n-portal' => 'Apie projektą, ką galima daryti, kur ką rasti',
@@ -2830,7 +2851,7 @@ Išsaugokite jį savo kompiuteryje ir įkelkite jį čia.',
 'tooltip-watchlistedit-raw-submit' => 'Atnaujinti stebimųjų sąrašą',
 'tooltip-recreate' => 'Atkurti puslapį nepaisant to, kad jis buvo ištrintas',
 'tooltip-upload' => 'Pradėti įkėlimą',
-'tooltip-rollback' => 'Atšaukti atmestus šio puslapio pakeitimus į paskutinę versiją vienu spustelėjimu',
+'tooltip-rollback' => 'Vienu spustelėjimu grąžinama prieš tai redagavusio naudotojo versija',
 'tooltip-undo' => '„Anuliuoti“ atmeta šį keitimą ir atveria ankstesnės versijos redagavimo formą.
 Leidžia pridėti atmetimo priežastį komentaruose',
 'tooltip-preferences-save' => 'Išsaugoti nustatymus',
@@ -2849,7 +2870,7 @@ Leidžia pridėti atmetimo priežastį komentaruose',
 
 # Attribution
 'anonymous' => '{{SITENAME}} {{PLURAL:$1|anoniminis naudotojas|anoniminiai naudotojai}}',
-'siteuser' => '{{SITENAME}} naudotojas $1',
+'siteuser' => '{{SITENAME}} {{GENDER:$2|naudotojas|naudotoja}} $1',
 'anonuser' => '{{SITENAME}} anoniminis naudotojas $1',
 'lastmodifiedatby' => 'Šį puslapį paskutinį kartą redagavo $3 $2, $1.',
 'othercontribs' => 'Paremta $1 darbu.',
@@ -2861,24 +2882,20 @@ Leidžia pridėti atmetimo priežastį komentaruose',
 
 # Spam protection
 'spamprotectiontitle' => 'Priešreklaminis filtras',
-'spamprotectiontext' => 'Puslapis, kurį norėjote išsaugoti buvo užblokuotas priešreklaminio filtro. Tai turbūt sukėlė nuoroda į juodajame sąraše esančią svetainę.',
+'spamprotectiontext' => 'Tekstas, kurį norėjote išsaugoti, buvo užblokuotas priešreklaminio filtro. Taip turbūt įvyko dėl nuorodos į juodajame sąraše esančią svetainę.',
 'spamprotectionmatch' => 'Šis tekstas buvo atpažintas priešreklaminio filtro: $1',
 'spambot_username' => 'MediaWiki reklamų šalinimas',
 'spam_reverting' => 'Atkuriama į ankstesnę versiją, neturinčios nuorodų į $1',
 'spam_blanking' => 'Visos versijos turėjo nuorodų į $1, išvaloma',
+'spam_deleting' => 'Visos versijos turėjo nuorodų į $1, ištrinama',
 
 # Info page
 'pageinfo-title' => '„$1“ informacija',
 'pageinfo-header-edits' => 'Pakeitimai',
-'pageinfo-header-watchlist' => 'Stebėjimo sąrašas',
-'pageinfo-header-views' => 'Peržiūrėta',
-'pageinfo-subjectpage' => 'Puslapis',
-'pageinfo-talkpage' => 'Pokalbių puslapis',
+'pageinfo-views' => 'Peržiūrų skaičius',
 'pageinfo-watchers' => 'Stebėtojų skaičius',
 'pageinfo-edits' => 'Keitimų skaičius',
 'pageinfo-authors' => 'Skirtingų autorių skaičius',
-'pageinfo-views' => 'Peržiūrų skaičius',
-'pageinfo-viewsperedit' => 'Peržiūrėta redaguojant',
 
 # Skin names
 'skinname-standard' => 'Klasikinė',
@@ -2903,7 +2920,7 @@ Leidžia pridėti atmetimo priežastį komentaruose',
 'markedaspatrollederror-noautopatrol' => 'Jums neleidžiama pažymėti savo paties keitimų kaip patikrintų.',
 
 # Patrol log
-'patrol-log-page' => 'Patikrinimo istorija',
+'patrol-log-page' => 'Patikrinimų sąrašas',
 'patrol-log-header' => 'Tai patvirtintų versijų sąrašas.',
 'log-show-hide-patrol' => '$1 patvirtinimų sąrašą',
 
@@ -3463,10 +3480,10 @@ $5
 
 # Delete conflict
 'deletedwhileediting' => 'Dėmesio: Šis puslapis ištrintas po to, kai pradėjote redaguoti!',
-'confirmrecreate' => "Naudotojas [[User:$1|$1]] ([[User talk:$1|aptarimas]]) ištrynė šį puslapį po to, kai pradėjote jį redaguoti. Trynimo priežastis:
+'confirmrecreate' => "{{GENDER:$1|Naudotojas&nbsp;|Naudotoja&nbsp;|}}[[User:$1|$1]] ([[User talk:$1|aptarimas]]) ištrynė šį puslapį po to, kai pradėjote jį redaguoti. Trynimo priežastis:
 : ''$2''
 Prašome patvirtinti, kad tikrai norite iš naujo sukurti puslapį.",
-'confirmrecreate-noreason' => 'Naudotojas [[User:$1|$1]] ([[User talk:$1|aptarimas]]) ištrynė šį puslapį po to, kai jūs pradėjote redaguoti. Prašome patvirtinti, jog jūs tikrai norite atkurti šį puslapį.',
+'confirmrecreate-noreason' => '{{GENDER:$1|Naudotojas&nbsp;|Naudotoja&nbsp;|}}[[User:$1|$1]] ([[User talk:$1|aptarimas]]) ištrynė šį puslapį po to, kai jūs pradėjote redaguoti. Prašome patvirtinti, jog jūs tikrai norite atkurti šį puslapį.',
 'recreate' => 'Atkurti',
 
 # action=purge
@@ -3581,6 +3598,8 @@ Jūs turėjote gauti [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public Licens
 'version-software' => 'Įdiegta programinė įranga',
 'version-software-product' => 'Produktas',
 'version-software-version' => 'Versija',
+'version-entrypoints' => 'Įėjimo taško URL',
+'version-entrypoints-header-entrypoint' => 'Įėjimo taškas',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
@@ -3685,8 +3704,17 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
 'sqlite-no-fts' => '$1 be visatekstės paieškos palaikymo',
 
 # New logging system
-'logentry-delete-delete' => '$1 panaikino puslapį $3',
-'logentry-delete-restore' => '$1 atstatė puslapį $3',
+'logentry-delete-delete' => '$1 ištrynė puslapį $3',
+'logentry-delete-restore' => '$1 atkūrė puslapį $3',
+'logentry-delete-event' => '$1 pakeistas  matomumas {{PLURAL:$5|žurnalo įvykio|$5 žurnalo įvykių}} tarp $3: $4',
+'logentry-delete-revision' => '$1 pakeitė puslapio „$3“ {{PLURAL:$5|versijos|$5 versijų}} matomumą: $4',
+'logentry-delete-event-legacy' => '$1 pakeistas matomumą žurnalo renginiams tarp $3',
+'logentry-delete-revision-legacy' => '$1 pakeistas matomumas pažiūrų puslapio $3',
+'logentry-suppress-delete' => '$1 nuslopino puslapį $3',
+'logentry-suppress-event' => '$1 slaptai pakeistas matomumas {{PLURAL:$5|žurnalo įvykio|$5 žurnalo įvykiu}} tarp $3: $4',
+'logentry-suppress-revision' => '$1 slaptai pakeistas matomumas {{PLURAL:$5|peržiūros|$5 peržiūrų}} puslapyje $3: $4',
+'logentry-suppress-event-legacy' => '$1 slaptai pakeistas matomumas žurnalo įvykių tarp $3',
+'logentry-suppress-revision-legacy' => '$1 slaptai pakeistas matomumas peržiūrų puslapyje $3',
 'revdelete-content-hid' => 'turinys paslėptas',
 'revdelete-summary-hid' => 'paslėptas keitimo komentaras',
 'revdelete-uname-hid' => 'paslėptas naudotojo vardas',
@@ -3699,6 +3727,8 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
 'logentry-move-move-noredirect' => '$1 pervadino puslapį $3 į $4, nepalikdamas nukreipimo',
 'logentry-move-move_redir' => '$1 pervadino puslapį iš $3 į $4, vietoje buvusio nukreipimo',
 'logentry-move-move_redir-noredirect' => '$1 pervadino puslapį iš $3 į $4, vietoje buvusio nukreipimo, bet nesukurdamas naujo',
+'logentry-patrol-patrol' => '$1 pažymėjo peržiūrą $4 puslapio $3 patruliuojama',
+'logentry-patrol-patrol-auto' => '$1 automatiškai pažymėjo peržiūrą $4 puslapio $3 patruliuojama',
 'logentry-newusers-newusers' => '$1 sukūrė naudotojo paskyrą',
 'logentry-newusers-create' => '$1 sukūrė naudotojo paskyrą',
 'logentry-newusers-create2' => '$1 sukūrė naudotojo paskyrą $3',
@@ -3706,29 +3736,54 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
 'newuserlog-byemail' => 'slaptažodis nusiųstas elektroniniu paštu',
 
 # Feedback
+'feedback-bugornote' => 'Jei jūs esate pasirengę aprašyti techninę problemą išsamiau, [$1 praneškite apie programinę klaidą].
+Kitu atveju, galite naudotis žemiau esančia paprastesne forma. Jūsų komentaras bus įtrauktas į puslapį „[$3 $2]“, kartu su jūsų naudotojo vardu ir jūsų naudojama naršykle.',
 'feedback-subject' => 'Tema:',
 'feedback-message' => 'Pranešimas:',
 'feedback-cancel' => 'Atšaukti',
 'feedback-submit' => 'Siųsti Atsiliepimą',
 'feedback-adding' => 'Pridedamas atsiliepimas į puslapį ...',
+'feedback-error1' => 'Klaida: Neatpažįstamas rezultatas iš API',
 'feedback-error2' => 'Klaida: Redagavimas nepavyko',
+'feedback-error3' => 'Klaida: Jokio atsakymo iš API',
+'feedback-thanks' => 'Ačiū! Jūsų atsiliepimas buvo užregistruotas puslapyje „[$2 $1]“.',
 'feedback-close' => 'Atlikta',
+'feedback-bugcheck' => 'Puiku! Tiesiog patikrinkite, ar tai ne viena [$1 jau žinomų klaidų].',
+'feedback-bugnew' => 'Patikrinau. Pranešti apie naują klaidą',
 
 # API errors
 'api-error-badaccess-groups' => 'Jums neleidžiama įkelti failus į šią wiki.',
+'api-error-badtoken' => 'Vidinė klaida: blogai atpažinimo ženklas.',
 'api-error-copyuploaddisabled' => 'Siuntimas pagal URL yra išjungtas šiame serveryje.',
+'api-error-duplicate' => 'Jau {{PLURAL:$1|yra [$2 kitas failas]|yra [$2 kiti failai]}} puslapyje su tuo pačiu turiniu..',
+'api-error-duplicate-archive' => 'Jau {{PLURAL:$1|buvo [$2 kitas failas]|buvo [$2 kitų failų]}} puslapyje su tuo pačiu turiniu, bet {{PLURAL:$1|buvo|buvo}} ištrinti.',
+'api-error-duplicate-archive-popup-title' => 'Dubliuoti {{PLURAL:$1|failą kuris buvo|failus kurie buvo}} jau buvo ištrinti.',
 'api-error-duplicate-popup-title' => 'Dubliuoti  {{PLURAL:$1|failą|failus}}',
 'api-error-empty-file' => 'Pateikta failas buvo tuščias.',
+'api-error-emptypage' => 'Kurti naujus, tuščius puslapius neleidžiama.',
+'api-error-fetchfileerror' => 'Vidinė klaida: Kažkas nutiko gaunant failą.',
+'api-error-fileexists-forbidden' => 'Failas, kurio pavadinimas "$1" jau egzistuoja, ir negali būti perrašytas.',
+'api-error-fileexists-shared-forbidden' => 'Failas, kurio pavadinimas "$1" jau egzistuoja bendro naudojimo failų saugykloje, ir negali būti perrašytas.',
 'api-error-file-too-large' => 'Failą, kurį pateikėte buvo per didelis.',
 'api-error-filename-tooshort' => 'Failo vardas yra per trumpas.',
 'api-error-filetype-banned' => 'Šis failų tipas yra uždraustas.',
+'api-error-filetype-banned-type' => '$1 nėra {{PLURAL:$4|leistinas failo tipas|leistini failo tipai}}. {{PLURAL:$3|Leistinas failų tipas|Leistini failų tipai}} yra $2.',
+'api-error-filetype-missing' => 'Failas neturi galūnės.',
+'api-error-hookaborted' => 'Pakeitimą, kurį bandėte atlikti, nutraukė priedas.',
 'api-error-http' => 'Vidinė klaida: nepavyko prisijungti prie serverio.',
 'api-error-illegal-filename' => 'Failo vardas neleidžiamas.',
+'api-error-internal-error' => 'Vidinė klaida: Kažkas ne taip su jūsų įkėlimo apdorojimu wiki.',
 'api-error-invalid-file-key' => 'Vidinė klaida: failas nerastas saugykloje.',
+'api-error-missingparam' => 'Vidinė klaida: Trūksta reikalingų parametrų.',
+'api-error-missingresult' => 'Vidinė klaida: nepavyko nustatyti, ar pavyko nukopijuoti.',
 'api-error-mustbeloggedin' => 'Jūs turite būti prisijungęs kad galėtumėte įkelti failus.',
 'api-error-mustbeposted' => 'Vidinė klaida: prašymas reikalauja HTTP POST.',
+'api-error-noimageinfo' => 'Įkelti pavyko, bet serveris nepateikė mums jokios informacijos apie failą.',
+'api-error-nomodule' => 'Vidinė klaida: nėra nustatytas įkėlimų modulis.',
 'api-error-ok-but-empty' => 'Vidinė klaida: nėra atsakymo iš serverio.',
 'api-error-overwrite' => 'Perrašymas esamą failą neleidžiamas.',
+'api-error-stashfailed' => 'Vidinė klaida: serveriui nepavyko išsaugoti laikinąjį failą.',
+'api-error-timeout' => 'Serveris neatsakė per numatytą laiką.',
 'api-error-unclassified' => 'Įvyko nežinoma klaida',
 'api-error-unknown-code' => 'Nežinoma klaida: " $1 "',
 'api-error-unknown-error' => 'Vidinė klaida: kažkas nutiko bandant įkelti failą.',
index 497b6c4..69f914d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Latgalian (Latgaļu)
+/** Latgalian (latgaļu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
index 697d724..2af1c67 100644 (file)
@@ -22,9 +22,9 @@ $messages = array(
 'tog-usenewrc' => 'Tihdanglam thar belhchhan hmang 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' => 'Vawihnih klikin phêk siamţha 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-editsectiononrightclick' => 'Hlawm thupui ding-klik hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)',
+'tog-editsectiononrightclick' => 'Hlawm thupui ding-hmeh hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)',
 'tog-showtoc' => 'A chhunga thu awm te tilang rawh (thupui 3 aia tam phêk tan)',
 'tog-rememberpassword' => 'He ka rangpuifannaah hian min hre reng rawh (a rei berah ni $1  {{PLURAL:$1}})',
 'tog-watchcreations' => 'Ka phêk siamte ka ralvèn zing-ah telh rawh',
@@ -35,9 +35,9 @@ $messages = array(
 'tog-previewontop' => 'Siamţhatna bawm hmaah endikna dah rawh',
 'tog-previewonfirst' => 'Siamţhat vawi khatnaah endikna tilang rawh',
 'tog-nocache' => 'Fanna-in phêk a cache tur veng rawh',
-'tog-enotifwatchlistpages' => 'Ka ralvèn zinga phêk pakhat tihdanglam a nih apiangin email min thawn rawh',
-'tog-enotifusertalkpages' => 'Ka hmangtu-sawihona phêk tihdanglam a nihin min email rawh',
-'tog-enotifminoredits' => 'Phêk siamţhat tenauah pawh min email tho rawh',
+'tog-enotifwatchlistpages' => 'Ka ralvèn zinga phêk pakhat tihdanglam a nih apiangin e-lehkha min thawn rawh',
+'tog-enotifusertalkpages' => 'Ka hmangtu-sawihona phêk tihdanglam a nihin e-lehkha min thawn rawh',
+'tog-enotifminoredits' => 'Phêk siamţhat tenauah pawh e-lehkha min thawn tho rawh',
 'tog-enotifrevealaddr' => 'Hriattirna email zingah ka email address pho lang rawh',
 'tog-shownumberswatching' => 'Ralvèngtu zât tilang rawh',
 'tog-oldsig' => 'Khàrna hming hman mék:',
@@ -53,7 +53,7 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ralvèn zing aţang hmangtu inziaklut siamţhat tibo rawh.',
 'tog-watchlisthideanons' => 'Hmangtu hriat lohvina an siamţhat ralvèn zing aţang',
 'tog-watchlisthidepatrolled' => 'Siamţhat viltu nei ralvèn zingah telh suh',
-'tog-ccmeonemails' => 'Hmangtu dang hnena ka email thawn apiang min thawn ve zel rawh',
+'tog-ccmeonemails' => 'Hmangtu dang hnena ka e-lehkha thawn apiang min thawn ve zel rawh',
 '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',
@@ -384,6 +384,8 @@ $2',
 'customjsprotected' => 'Hmangtu dang mimal thil a tel avangin he JavaScript phêk hi siamţhat phalsak i ni lo.',
 'ns-specialprotected' => 'Phêk vohbîkte siam danglam theih a ni lo.',
 'titleprotected' => 'He phêk hi hmangtu [[User:$1|$1]] siam phalsak a ni lo. A chhan hetah: "\'\'$2\'\'" hian pêk a ni.',
+'invalidtitle-knownnamespace' => 'Hming pawm loh hminghmun "$2"-a "$3" tih thu chuang.',
+'invalidtitle-unknownnamespace' => 'Hming pawm loh leh hminghmun zât hriat loh $1-a thu chuang "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Inremdan dikhlel: Hrik thiantu hriat loh: ''$1''",
@@ -400,7 +402,7 @@ I [[Special:Preferences|{{SITENAME}}duhdàn]] siam danglam theihnghilh suh ang c
 'yourname' => 'Hmangtuhming:',
 'yourpassword' => 'Thurûk:',
 'yourpasswordagain' => 'Thurûk ziak nawn leh rawh le:',
-'remembermypassword' => 'He ka rangpuifanna hman mék (browser)-ah hian ka luhna (a rei berah ni {{PLURAL:$1||}}) min vawnsak rawh, thurûk ziah nawn ngai lo tùrin.',
+'remembermypassword' => 'He ka rangpuifanna hman mék (browser)-ah hian ka luhna (a rei berah ni {{PLURAL:$1||}}$1) min vawnsak rawh, thurûk ziah nawn ngai lo tùrin.',
 'securelogin-stick-https' => 'Luh hnuah HTTPS-ah hian chëng reng rawh.',
 'yourdomainname' => 'I ram:',
 'externaldberror' => 'Insawifiahna felfai lo a awm lo a nih loh vëk pawhin i pawnlam siangchan tihdanglam phalsak i ni lo a ni ang.',
@@ -933,6 +935,7 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'right-move-subpages' => 'Phêkte leh an phêkpéngte sawnna',
 'right-move-rootuserpages' => 'Hmangtu bulte sawnna',
 'right-movefile' => 'Taksa sawnna',
+'right-suppressredirect' => 'Phêk sawna hruailuhna phêk siam lohtírna',
 'right-upload' => 'Taksa hlankaina',
 'right-reupload' => 'Taksa awmsa ziahhnan rawh',
 'right-reupload-own' => 'Mahni hlankai taksa awmsa ziahhnan rawh',
@@ -1036,9 +1039,9 @@ I ràwnah paihna leh sawnna chhinchhiahna thuziak kan rawn chhawpchhuak e:",
 Ahmaa taksa hlankaisaho en tùr emaw zawng tùr chuan [[Special:FileList|taksa hlankai tawh zawng zawng tlarna]] tihah hian kal rawh; hlankai (nawn)ho pawh [[Special:Log/upload|hlankai chhinchhiahna]]-ah vawnfel an ni a, paih tawhho pawh [[Special:Log/delete|paihho chhinchhiahna]]-ah chhinchhiah fel vek an ni.
 
 Phêka taksa hmang tùrin ahnuaia tihphung engemaw ni ber hmang khuan zawmna i siam thei ang:
-*A taksa pumpui hmang tùr chuan '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' tiin. Heti hi chuan taksa hi i sezawl chhuah a ni.
-*Phêk veilam síra 'Sawifiahna' hmanga 200px-a liana i tàrlan duh chuan '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Sawifiahna]]</nowiki></tt>'''  tiin.
-*A taksa tárlang lova zawm ringawt i duh chuan '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' tiin.",
+*A taksa pumpui hmang tùr chuan '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' tiin. Heti hi chuan taksa hi i sezawl chhuah a ni.
+*Phêk veilam síra 'Sawifiahna' hmanga 200px-a liana i tàrlan duh chuan '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Sawifiahna]]</nowiki></code>'''  tiin.
+*A taksa tárlang lova zawm ringawt i duh chuan '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' tiin.",
 'upload-permitted' => 'Taksa phal chiho: $1.',
 'upload-preferred' => 'Taksa duh deuh bîk: $1.',
 'upload-prohibited' => 'Taksa khap: $1.',
@@ -1232,8 +1235,12 @@ Taksa sawifiahna hi i siamṭha duh a nih chuan  [$2 taksa sawifiahna phêk] a
 'withoutinterwiki-legend' => 'Thuhmabet',
 'withoutinterwiki-submit' => 'Tihlanna',
 
+'fewestrevisions' => 'Phêk siam danglam hlawh lo zualte',
+
 # Miscellaneous special pages
 'nbytes' => 'Bait {{PLURAL:$1||}} $1',
+'ncategories' => '{{PLURAL:$1|Páwl|Páwl}} $1',
+'nlinks' => '$1 {{PLURAL:$1||}} Zawmna $1',
 'nmembers' => 'A chhungah  {{PLURAL:$1||$1}} a awm.',
 'nrevisions' => 'siamṭhatna $1 {{PLURAL:$1||}}',
 'nviews' => 'vawi $1 {{PLURAL:$1||}} ràwn a ni tawh.',
@@ -1741,15 +1748,10 @@ A hnar i en thei ang.',
 # Info page
 'pageinfo-title' => '"$1" chungchanga hriattirna',
 'pageinfo-header-edits' => 'Siamţhatnate',
-'pageinfo-header-watchlist' => 'Ralvèn',
-'pageinfo-header-views' => 'En zât',
-'pageinfo-subjectpage' => 'Phêk',
-'pageinfo-talkpage' => 'Sawihona phêk',
+'pageinfo-views' => 'Thlir/en tawh zât',
 'pageinfo-watchers' => 'Thlirtu zât',
 'pageinfo-edits' => 'Siamţhat zât',
 'pageinfo-authors' => 'Ziaktu hrang zât',
-'pageinfo-views' => 'Thlir/en tawh zât',
-'pageinfo-viewsperedit' => 'Siamţhat pakhat zel en zât',
 
 # Patrolling
 'markaspatrolleddiff' => 'Vil angah chhiar rawh',
index 289d5c4..af20cc9 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Latvian (Latviešu)
+/** Latvian (latviešu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -56,7 +56,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Slēpt apstiprinātās izmaņas pēdējo izmaiņu sarakstā',
 'tog-newpageshidepatrolled' => 'Paslēpt pārbaudītās lapas jauno lapu sarakstā',
 'tog-extendwatchlist' => 'Izvērst uzraugāmo lapu sarakstu, lai parādītu visas veiktās izmaiņas (ne tikai pašas svaigākās)',
-'tog-usenewrc' => "Lietot uzlaboto pēdējo izmaiņu lapu (izmanto ''JavaScript'')",
+'tog-usenewrc' => "Grupēt izmaiņas pēc lapas pēdējās izmaiņās un uzraugāmo lapu sarakstā  (izmanto ''JavaScript'')",
 'tog-numberheadings' => 'Automātiski numurēt virsrakstus',
 'tog-showtoolbar' => 'Rādīt rediģēšanas rīkjoslu',
 'tog-editondblclick' => "Atvērt rediģēšanas lapu ar dubultklikšķi (izmanto ''JavaScript'')",
@@ -310,12 +310,13 @@ $1',
 'youhavenewmessages' => 'Tev ir $1 (skat. $2).',
 'newmessageslink' => 'jauns vēstījums',
 'newmessagesdifflink' => 'pēdējā izmaiņa',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|pēdējā izmaiņa|pēdējās izmaiņas}}',
 'youhavenewmessagesmulti' => 'Tev ir jauns ziņojums: $1',
 'editsection' => 'labot',
 'editold' => 'labot',
 'viewsourceold' => 'aplūkot kodu',
 'editlink' => 'labot',
-'viewsourcelink' => 'Skatīt pirmkodu',
+'viewsourcelink' => 'aplūkot kodu',
 'editsectionhint' => 'Rediģēt sadaļu: $1',
 'toc' => 'Satura rādītājs',
 'showtoc' => 'parādīt',
@@ -439,11 +440,11 @@ Tavs lietotāja konts ir izveidots. Neaizmirsti, ka ir iespējams mainīt [[Spec
 'securelogin-stick-https' => 'Saglabāt HTTPS savienojumu pēc pieslēgšanās',
 'yourdomainname' => 'Tavs domēns',
 'externaldberror' => 'Notikusi vai nu ārējās autentifikācijas datubāzes kļūda, vai arī tev nav atļauts izmainīt savu ārējo kontu.',
-'login' => 'Ieiet',
+'login' => 'Pieslēgties',
 'nav-login-createaccount' => 'Izveidot jaunu lietotāju vai doties iekšā',
 'loginprompt' => 'Lai ieietu {{grammar:lokatīvs|{{SITENAME}}}}, tavam datoram ir jāpieņem sīkdatnes (<i>cookies</i>).',
 'userlogin' => 'Izveidot jaunu lietotāju vai doties iekšā',
-'userloginnocreate' => 'Ieiet',
+'userloginnocreate' => 'Pieslēgties',
 'logout' => 'Iziet',
 'userlogout' => 'Iziet',
 'notloggedin' => 'Neesi iegājis',
@@ -668,6 +669,7 @@ Pēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:',
 'updated' => '(Atjaunots)',
 'note' => "'''Piezīme: '''",
 'previewnote' => "'''Atceries, ka šis ir tikai pirmskats un teksts vēl nav saglabāts!'''",
+'continue-editing' => 'Turpināt labošanu',
 'session_fail_preview' => "'''Neizdevās apstrādāt tavas izmaiņas, jo tika pazaudēti sesijas dati.
 Lūdzu mēģini vēlreiz.
 Ja tas joprojām nedarbojas, mēģini [[Special:UserLogout|izlogoties ārā]] un ielogoties no jauna.'''",
@@ -744,6 +746,7 @@ Izskatās, ka lapa ir dzēsta.',
 'edit-no-change' => 'Tavs labojums tika ignorēts, jo tekstā netika izdarītas izmaiņas.',
 'edit-already-exists' => 'Nevar izveidot jaunu lapu.
 Tā jau eksistē.',
+'defaultmessagetext' => 'Noklusētais ziņojuma teksts',
 
 # Parser/template warnings
 'expensive-parserfunction-category' => 'Lapas ar pārāk daudz laikietilpīgiem apstrādes funkciju izsaukumiem',
@@ -882,6 +885,7 @@ $1",
 
 # Diffs
 'history-title' => '"$1" versiju hronoloģija',
+'difference-title' => 'Atšķirības starp "$1" versijām',
 'difference-multipage' => '(Atšķirības starp lapām)',
 'lineno' => '$1. rindiņa:',
 'compareselectedversions' => 'Salīdzināt izvēlētās versijas',
@@ -973,6 +977,7 @@ Pagaidām vari meklēt, izmantojot Google vai Yahoo.
 'prefs-beta' => 'Beta funkcijas',
 'prefs-datetime' => 'Datums un laiks',
 'prefs-labs' => 'Laboratorijas funkcijas',
+'prefs-user-pages' => 'Lietotāja lapas',
 'prefs-personal' => 'Lietotāja dati',
 'prefs-rc' => 'Pēdējās izmaiņas',
 'prefs-watchlist' => 'Uzraugāmie raksti',
@@ -1249,6 +1254,7 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'newsectionsummary' => '/* $1 */ jauna sadaļa',
 'rc-enhanced-expand' => 'Rādīt informāciju (nepieciešams JavaScript)',
 'rc-enhanced-hide' => 'Paslēpt detaļas',
+'rc-old-title' => 'sākotnēji izveidota kā "$1 "',
 
 # Recent changes linked
 'recentchangeslinked' => 'Saistītās izmaiņas',
@@ -1340,13 +1346,13 @@ Pārskatāmāka versija ir pieejama [[Special:NewFiles|jauno attēlu galerijā]]
 'largefileserver' => 'Šis fails ir lielāks nekā serveris ņem pretī.',
 'emptyfile' => 'Šķiet, ka tu esi augšuplādējis tukšu failu. Iespējams, faila nosaukumā esi pieļāvis kļūdu. Lūdzu, pārbaudi, vai tiešām tu vēlies augšuplādēt tieši šo failu.',
 'windows-nonascii-filename' => 'Šī viki neatbalsta failu nosaukumus ar īpašām rakstzīmēm.',
-'fileexists' => "Fails ar šādu nosaukumu jau pastāv, lūdzu, pārbaudi '''<tt>[[:$1]]</tt>''', ja neesi drošs, ka vēlies to mainīt.
-[[$1|thumb]]",
-'fileexists-extension' => "Pastāv fails ar līdzīgu nosaukumu: [[$2|thumb]]
-* Augšupielādējamā faila nosaukums: '''<tt>[[:$1]]</tt>'''
-* Esošā faila nosaukums: '''<tt>[[:$2]]</tt>'''
-Lūdzu, izvēlieties citu nosaukumu.",
-'file-thumbnail-no' => "Faila vārds sākas ar '''<tt>$1</tt>'''.
+'fileexists' => 'Fails ar šādu nosaukumu jau pastāv, lūdzu, pārbaudi <strong>[[:$1]]</strong>, ja neesi drošs, ka vēlies to mainīt.
+[[$1|thumb]]',
+'fileexists-extension' => 'Pastāv fails ar līdzīgu nosaukumu: [[$2|thumb]]
+* Augšupielādējamā faila nosaukums: <strong>[[:$1]]</strong>
+* Esošā faila nosaukums: <strong>[[:$2]]</strong>
+Lūdzu, izvēlieties citu nosaukumu.',
+'file-thumbnail-no' => "Faila vārds sākas ar <strong>$1</strong>.
 Izskatās, ka šis ir samazināts attēls ''(thumbnail)''.
 Ja tev ir šis pats attēls pilnā izmērā, augšuplādē to, ja nav, tad nomaini faila vārdu.",
 'fileexists-forbidden' => 'Fails ar šādu nosaukumu jau eksistē un to nevar aizvietot ar jaunu.
@@ -1406,6 +1412,7 @@ Lūdzu, sazinieties ar [[Special:ListUsers/sysop|administratoru.]]',
 'backend-fail-notsame' => 'Neidentisks fails jau pastāv $1.',
 'backend-fail-delete' => 'Nevar izdzēst failu $1.',
 'backend-fail-alreadyexists' => 'Fails $1 jau pastāv.',
+'backend-fail-store' => 'Neizdevās saglabāt failu "$1" "$2".',
 'backend-fail-copy' => 'Nevar kopēt failu $1 uz $2.',
 'backend-fail-move' => 'Nevar pārvietot failu $1 uz $2.',
 'backend-fail-opentemp' => 'Nevar atvērt pagaidu failu.',
@@ -1439,6 +1446,7 @@ Atļauta ir tikai failu piekļuve.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL nevarēja sasniegt',
+'upload-curl-error28' => 'Augšupielādes noildze',
 
 'license' => 'Licence:',
 'license-header' => 'Licence',
@@ -1522,6 +1530,7 @@ Apraksts ir [$2 faila apraksta lapā], kas ir parādīta zemāk.',
 ** Viens tāds jau ir',
 'filedelete-edit-reasonlist' => 'Izmainīt dzēšanas iemeslus',
 'filedelete-maintenance' => 'Failu dzēšana un atjaunošana uzturēšanas laikā ir atslēgta.',
+'filedelete-maintenance-title' => 'Nevar izdzēst failu',
 
 # MIME search
 'mimesearch' => 'MIME meklēšana',
@@ -1620,6 +1629,7 @@ Katrā rindiņā ir saites uz pirmo un otro pāradresācijas lapu, kā arī pirm
 'mostimages' => 'Attēli, uz kuriem ir visvairāk saišu',
 'mostrevisions' => 'Raksti, kuriem ir visvairāk iepriekšēju versiju',
 'prefixindex' => 'Meklēt pēc virsraksta pirmajiem burtiem',
+'prefixindex-namespace' => 'Visas lapas ar prefiksu ($1 vārdtelpa)',
 'shortpages' => 'Īsākās lapas',
 'longpages' => 'Garākās lapas',
 'deadendpages' => 'Lapas bez izejošām saitēm',
@@ -1654,7 +1664,7 @@ Katrā rindiņā ir saites uz pirmo un otro pāradresācijas lapu, kā arī pirm
 
 # Special:Log
 'specialloguserlabel' => 'Izpildītājs:',
-'speciallogtitlelabel' => 'Nosaukums:',
+'speciallogtitlelabel' => 'Mērķis (nosaukums vai lietotājs):',
 'log' => 'Reģistri',
 'all-logs-page' => 'Visi publiski pieejamie reģistri',
 'alllogstext' => 'Visi pieejamie {{grammar:akuzatīvs{{SITENAME}}}} reģistri.
@@ -1678,6 +1688,9 @@ Tu vari sašaurināt aplūkojamo reģistru, izvēloties reģistra veidu, lietot
 'allpagesprefix' => 'Parādīt lapas ar šādu virsraksta sākumu:',
 'allpages-bad-ns' => '{{SITENAME}} nav vārdkopas "$1".',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Skatīt jaunāko.',
+
 # Special:Categories
 'categories' => 'Kategorijas',
 'categoriespagetext' => "{{PLURAL:$1|Šī kategorija|Šīs kategorijas}} satur lapas vai failus.
@@ -1697,7 +1710,7 @@ Skatīt arī [[Special:WantedCategories|''sarkanās'' kategorijas]].",
 'linksearch-pat' => 'Meklēt:',
 'linksearch-ns' => 'Vārdtelpas:',
 'linksearch-ok' => 'Meklēt',
-'linksearch-text' => 'Atbalstītie protokoli: <tt>$1</tt>',
+'linksearch-text' => 'Atbalstītie protokoli: <code>$1</code>',
 'linksearch-line' => '$1 ir izveidota saite no $2',
 
 # Special:ListUsers
@@ -2098,6 +2111,8 @@ Visus blokus var apskatīties [[Special:BlockList|IP bloku sarakstā]].',
 'blocklist-userblocks' => 'Paslēpt kontu bloķējumus',
 'blocklist-tempblocks' => 'Paslēpt pagaidu bloķējumus',
 'blocklist-addressblocks' => 'Paslēpt vienas IP adreses bloķējumus',
+'blocklist-timestamp' => 'Laiks',
+'blocklist-target' => 'Mērķis',
 'blocklist-params' => 'Bloķēšanas parametri',
 'blocklist-reason' => 'Iemesls',
 'ipblocklist-submit' => 'Meklēt',
@@ -2264,7 +2279,7 @@ Pirmajā gadījumā var arī lietot šādu metodi, piem., [[{{#Special:Export}}/
 # Namespace 8 related
 'allmessages' => 'Visi sistēmas paziņojumi',
 'allmessagesname' => 'Nosaukums',
-'allmessagesdefault' => 'Sākotnējais teksts',
+'allmessagesdefault' => 'Noklusētais ziņojuma teksts',
 'allmessagescurrent' => 'Pašreizējais teksts',
 'allmessagestext' => "Šajā lapā ir visu \"'''MediaWiki:'''\" lapās atrodamo sistēmas paziņojumu uzskaitījums.
 Šos paziņojumus var izmainīt tikai admini. Izmainot tos šeit, tie tiks izmainīti tikai šajā mediawiki instalācijā. Lai tos izmainītu visām pārējām, apskatieties [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] un [//translatewiki.net translatewiki.net].",
@@ -2429,15 +2444,10 @@ To visticamāk izraisīja ārēja saite uz melnajā sarakstā esošu interneta v
 # Info page
 'pageinfo-title' => 'Informācija par "$1"',
 'pageinfo-header-edits' => 'Labojumi',
-'pageinfo-header-watchlist' => 'Uzraugāmie raksti',
-'pageinfo-header-views' => 'Skatījumi',
-'pageinfo-subjectpage' => 'Lapa',
-'pageinfo-talkpage' => 'Diskusiju lapa',
+'pageinfo-views' => 'Skatījumu skaits',
 'pageinfo-watchers' => 'Uzraudzītāju skaits',
 'pageinfo-edits' => 'Izmaiņu skaits',
 'pageinfo-authors' => 'Atsevišķu autoru skaits',
-'pageinfo-views' => 'Skatījumu skaits',
-'pageinfo-viewsperedit' => 'Skatījumi uz labojumu',
 
 # Patrolling
 'markaspatrolleddiff' => 'Atzīmēt kā pārbaudītu',
@@ -2637,6 +2647,7 @@ Pārējie lauki, pēc noklusējuma, būs paslēpti.
 'exif-specialinstructions' => 'Īpašas norādes',
 'exif-headline' => 'Virsraksts',
 'exif-source' => 'Avots',
+'exif-contact' => 'Kontaktinformācija',
 'exif-languagecode' => 'Valoda',
 'exif-iimversion' => 'IIM versija',
 'exif-iimcategory' => 'Kategorija',
@@ -2645,6 +2656,7 @@ Pārējie lauki, pēc noklusējuma, būs paslēpti.
 'exif-lens' => 'Izmantotais objektīvs',
 'exif-serialnumber' => 'Fotoaparāta sērijas numurs',
 'exif-cameraownername' => 'Fotoaparāta īpašnieks',
+'exif-nickname' => 'Neformāls attēla nosaukums',
 'exif-rating' => 'Vērtējums (no 5)',
 'exif-copyrighted' => 'Autortiesību statuss',
 'exif-copyrightowner' => 'Autortiesību īpašnieks',
@@ -2659,6 +2671,8 @@ Pārējie lauki, pēc noklusējuma, būs paslēpti.
 'exif-contentwarning' => 'Brīdinājums par saturu',
 'exif-giffilecomment' => 'GIF faila komentārs',
 'exif-event' => 'Attēlotais notikums',
+'exif-organisationinimage' => 'Attēlotā organizācija',
+'exif-personinimage' => 'Attēlotā persona',
 
 # EXIF attributes
 'exif-compression-1' => 'Nekompresēts',
index f1c695d..3a273c5 100644 (file)
@@ -186,7 +186,6 @@ $messages = array(
 'tog-watchlisthideliu' => '不哨有簿',
 'tog-watchlisthideanons' => '不哨無簿',
 'tog-watchlisthidepatrolled' => '不哨已巡',
-'tog-nolangconversion' => '非轉',
 'tog-ccmeonemails' => '凡所遺書,請存副本。',
 'tog-diffonly' => '異下無示頁',
 'tog-showhiddencats' => '示隱類',
@@ -1331,9 +1330,9 @@ $1",
 此頁之誌刪與移於此示之以參詳也:",
 'uploadtext' => "下表以獻,[[Special:FileList|載獻]]覽之。或見[[Special:Log/upload|誌獻]]與[[Special:Log/delete|誌刪]]。
 欲嵌頁中,是格鏈之其一:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:File.jpg]]</tt>'''用此整獻
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:File.png||200px|thumb|left|名]]</tt>'''以二百像素置左框置『名』
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}:File.ogg]]</tt>'''直連獻,無示獻",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:File.jpg]]</code>'''用此整獻
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:File.png||200px|thumb|left|名]]</code>'''以二百像素置左框置『名』
+* '''<code><nowiki>[[</nowiki>{{ns:media}}:File.ogg]]</code>'''直連獻,無示獻",
 'upload-permitted' => '可之物類:$1。',
 'upload-preferred' => '議之物類:$1。',
 'upload-prohibited' => '禁之物類:$1。',
@@ -1374,8 +1373,8 @@ $1",
 'tmp-write-error' => '臨檔案寫錯也。',
 'large-file' => '檔長$2仟位元組,不逾$1為佳。',
 'emptyfile' => '無以獻,疑謬名也,惠核之。',
-'fileexists' => "'''<tt>[[:$1]]</tt>'''存矣,欲蓋之則再也。 [[$1|thumb]]",
-'filepageexists' => "此檔之述於'''<tt>[[:$1]]</tt>'''存矣,檔未存也。爾入述無存也。要現之,爾需纂之。",
+'fileexists' => '<strong>[[:$1]]</strong>存矣,欲蓋之則再也。 [[$1|thumb]]',
+'filepageexists' => '此檔之述於<strong>[[:$1]]</strong>存矣,檔未存也。爾入述無存也。要現之,爾需纂之。',
 'file-exists-duplicate' => '此檔乃重檔{{PLURAL:$1|一|數}}:',
 'file-deleted-duplicate' => '此檔([[:$1]])前刪。爾需查刪錄再貢之。',
 'uploadwarning' => '慎焉!',
@@ -1543,7 +1542,7 @@ $1',
 
 # MIME search
 'mimesearch' => '篩檔',
-'mimesearch-summary' => '此頁可以MIME篩檔.格仿「文類/次類」,如<tt>image/jpeg</tt>。',
+'mimesearch-summary' => '此頁可以MIME篩檔.格仿「文類/次類」,如<code>image/jpeg</code>。',
 'mimetype' => 'MIME類有:',
 'download' => '載下',
 
@@ -1719,7 +1718,7 @@ $1',
 'linksearch-ns' => '名集:',
 'linksearch-ok' => '尋',
 'linksearch-text' => '用似"*.wikipedia.org"之萬字。<br />
-援之議:<tt>$1</tt>',
+援之議:<code>$1</code>',
 'linksearch-line' => '$1連$2',
 'linksearch-error' => '萬字僅用於機之始也。',
 
index 469b493..cbc2a32 100644 (file)
 
 $fallback = 'tr';
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Medya',
+       NS_SPECIAL          => 'Doxmeli',
+       NS_TALK             => 'Ğarğala',
+       NS_USER             => 'Maxmare',
+       NS_USER_TALK        => 'Maxmare_mesaji',
+       NS_PROJECT_TALK     => '$1_ğarğala',
+       NS_FILE             => 'Dosya',
+       NS_FILE_TALK        => 'Dosya_ğarğala',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_ğarğala',
+       NS_TEMPLATE         => 'Şabloni',
+       NS_TEMPLATE_TALK    => 'Şabloni_ğarğala',
+       NS_HELP             => 'Meşvela',
+       NS_HELP_TALK        => 'Meşvela_ğarğala',
+       NS_CATEGORY         => 'Kʼatʼegori',
+       NS_CATEGORY_TALK    => 'Kʼatʼegori_ğarğala',
+);
+
+$namespaceAliases = array(
+       // Turkish namespace names.
+       'Medya'              => NS_MEDIA,
+       'Özel'               => NS_SPECIAL,
+       'Tartışma'           => NS_TALK,
+       'Kullanıcı'          => NS_USER,
+       'Kullanıcı_mesaj'    => NS_USER_TALK,
+       '$1_tartışma'        => NS_PROJECT_TALK,
+       'Dosya'              => NS_FILE,
+       'Dosya_tartışma'     => NS_FILE_TALK,
+       'MediaWiki_tartışma' => NS_MEDIAWIKI_TALK,
+       'Şablon'             => NS_TEMPLATE,
+       'Şablon_tartışma'    => NS_TEMPLATE_TALK,
+       'Yardım'             => NS_HELP,
+       'Yardım_tartışma'    => NS_HELP_TALK,
+       'Kategori'           => NS_CATEGORY,
+       'Kategori_tartışma'  => NS_CATEGORY_TALK,
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => "Link'iş tude kogu3’uxaçki:",
index aae0d93..dccadb8 100644 (file)
@@ -1390,9 +1390,9 @@ $3 द्वारा देल कारण अछि ''$2''",
 'uploadtext' => "निचुक्का पत्र संचिका उपारोपित करबा लेल प्रयोग करू।
 पहिलुका उपारोपित संचिका देखबा वा तकबा लेल जाउ [[Special:FileList|उपारोपित संचिका सभक सूची]], (पुनः) उपारोपित सेहो सम्प्रवेशित अछि [[Special:Log/upload|उपारोपित वृत्तलेख]] मे, मेटाएल सभ [[Special:Log/delete|मेटाएल वृत्तलेख]] मे।
 पन्नमे एकटा संचिका देबा लेल, ऐ पत्र सभमेसँ कोनो लागिक प्रयोग करू:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' संचिकाक पूर्ण संस्करण देखबा लेल
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>'''  २०० चित्राणु चाकर प्रकटन एकटा बक्शामे \"वैकल्पिक पाठ\" वामा कात वर्णनक रूपमे लिखल प्रयोग करू
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' बिना संचिका देखेने सोझे संचिकाक लागि देब",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' संचिकाक पूर्ण संस्करण देखबा लेल
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>'''  २०० चित्राणु चाकर प्रकटन एकटा बक्शामे \"वैकल्पिक पाठ\" वामा कात वर्णनक रूपमे लिखल प्रयोग करू
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' बिना संचिका देखेने सोझे संचिकाक लागि देब",
 'upload-permitted' => 'मान्य संचिका प्रकार:$1 ।',
 'upload-preferred' => 'मोनपसिन्न संचिका प्रकार:$1 ।',
 'upload-prohibited' => 'प्रतिबन्धित संचिका प्रकार:$1 ।',
@@ -1440,21 +1440,21 @@ $3 द्वारा देल कारण अछि ''$2''",
 ई संचिकानाममे गलत तंकणक कारण सम्भवतः भेल हएत।
 कृपा कऽ जाँचू जे की अहाँ ऐ संचिकाकेँ ठीके उपारोपित करए चाहै छी।',
 'windows-nonascii-filename' => 'ई विकी संचिकानाममे विशेष अक्षरक प्रयोग निषेध करैत अछि।',
-'fileexists' => "ऐ नाम्ना एकटा संचिका पहिनहियेसँ अछि, कृपा कऽ जाँचू '''<tt>[[:$1]]</tt>''' जँ अहाँ दुविधामे छी जे अहाँ एकरा बदलऽ चाहै छी वा नै।
-[[$1|thumb]]",
-'filepageexists' => "ऐ संचिकाक वर्णन पन्ना पहिनहिये '''<tt>[[:$1]]</tt>''' पर बना देल गेल, मुदा ऐ नामसँ कोनो संचिका अखन नै अछि।
+'fileexists' => 'ऐ नाम्ना एकटा संचिका पहिनहियेसँ अछि, कृपा कऽ जाँचू <strong>[[:$1]]</strong> जँ अहाँ दुविधामे छी जे अहाँ एकरा बदलऽ चाहै छी वा नै।
+[[$1|thumb]]',
+'filepageexists' => 'ऐ संचिकाक वर्णन पन्ना पहिनहिये <strong>[[:$1]]</strong> पर बना देल गेल, मुदा ऐ नामसँ कोनो संचिका अखन नै अछि।
 जे संक्षेप अहाँ दऽ रहल छी से वर्णन पन्नापर नै आएत।
 अहाँक संक्षेप ओतए आबए तै लेल अहाँकेँ ओकरा अपनेसँ सम्पादित करए पड़त।
-[[$1|thumb]]",
-'fileexists-extension' => "ऐ नामसँ एकटा संचिका पहिनहियेसँ अछि:[[$2|thumb]]
-* उपारोपित संचिकाक नाम: '''<tt>[[:$1]]</tt>'''
-* अखन स्थित फाइलक नाम: '''<tt>[[:$2]]</tt>'''
-कृपा कऽ दोसर नाम चुनू।",
+[[$1|thumb]]',
+'fileexists-extension' => 'ऐ नामसँ एकटा संचिका पहिनहियेसँ अछि:[[$2|thumb]]
+* उपारोपित संचिकाक नाम: <strong>[[:$1]]</strong>
+* अखन स्थित फाइलक नाम: <strong>[[:$2]]</strong>
+कृपा कऽ दोसर नाम चुनू।',
 'fileexists-thumbnail-yes' => "ई संचिका लगैए जे ''(लघुचित्र)'' क छोट आकारक चित्र अछि।
 [[$1|thumb]]
-कृपा कऽ ऐ संचिकाकेँ जाँचू '''<tt>[[:$1]]</tt>''' ।
+कृपा कऽ ऐ संचिकाकेँ जाँचू <strong>[[:$1]]</strong> ।
 जँ जाँचल संचिका मूल संचिकाक वएह चित्र छी तँ एकटा दोसर लघुचित्र उपारोपित करबाक आवश्यकता नै अछि।",
-'file-thumbnail-no' => "संचिकानाम शुरू होइए '''<tt>$1</tt>''' सँ।
+'file-thumbnail-no' => "संचिकानाम शुरू होइए <strong>$1</strong> सँ।
 लगैए जे ई छोट आकारक ''(लघुचित्र)'' क चित्र अछि।
 जँ अहाँ लग पूर्ण आनन्तर्यक चित्र अछि तँ से उपारोपित करू, नै तँ संचिकानाम बदलू।",
 'fileexists-forbidden' => 'ऐ नामक एकटा संचिका पहिनहियेसँ अछि, आ फेरसँ ओ पुनर्लेखित नै कएल जा सकैए।
@@ -1662,7 +1662,7 @@ $1',
 # MIME search
 'mimesearch' => 'माइम खोज',
 'mimesearch-summary' => 'ई पन्ना माइम प्रकारक संचिकाकेँ अलग करब सम्भव बनबैत अछि।
-निवेशन: पाठ प्रकार/ उपप्रकार, जेना <tt>image/jpeg</tt> ।',
+निवेशन: पाठ प्रकार/ उपप्रकार, जेना <code>image/jpeg</code> ।',
 'mimetype' => 'माइम प्रकार:',
 'download' => 'अवारोपन',
 
@@ -1854,7 +1854,7 @@ $1',
 'linksearch-ns' => 'नामस्थान :',
 'linksearch-ok' => 'ताकू',
 'linksearch-text' => 'ब्रह्मास्त्र जेना "*.wikipedia.org" प्रयोग कएल जा सकैए।
-सहायक संविद:<tt>$1</tt> (खोजमे ऐमेसँ कोनो नै जोड़ू)।',
+सहायक संविद:<code>$1</code> (खोजमे ऐमेसँ कोनो नै जोड़ू)।',
 'linksearch-line' => '$2 सँ $1 क लागि अछि।',
 'linksearch-error' => 'निमंत्रकनामक प्रारम्भमे ब्रह्मास्त्र आबि सकैए।',
 
@@ -2683,15 +2683,10 @@ $1 एकर प्रतिबन्धक कारण अछि : "$2"',
 # Info page
 'pageinfo-title' => '"$1"पृष्ठक लेल नब गप',
 'pageinfo-header-edits' => 'संपादन',
-'pageinfo-header-watchlist' => 'साकांक्ष-सूची',
-'pageinfo-header-views' => 'देखू',
-'pageinfo-subjectpage' => 'पृष्ठ',
-'pageinfo-talkpage' => 'टॉक पृष्ठ',
+'pageinfo-views' => 'देखहि बला के संख्या',
 'pageinfo-watchers' => 'जानकारक संख्या',
 'pageinfo-edits' => 'सम्पादनक संख्या',
 'pageinfo-authors' => 'भिन्न लेखक संख्या',
-'pageinfo-views' => 'देखहि बला के संख्या',
-'pageinfo-viewsperedit' => 'प्रति सम्पादन देखल गेल',
 
 # Skin names
 'skinname-standard' => 'प्राचीन',
@@ -3549,6 +3544,7 @@ $5
 'api-error-badaccess-groups' => 'अहि विकी सें अहां कोनो प्रारूप लोड नहि क सकब.',
 'api-error-filename-tooshort' => 'ई संचिका नाम बड छोट अछि |',
 'api-error-filetype-banned' => 'ऐ तरहक संचिका नाम प्रतिबंधित  अछि।',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|मान्य संचिका प्रकार नै अछि|मान्य संचिका प्रकार सभ नै अछि}}। मान्य अछि {{PLURAL:$3|संचिका प्रकार अछि|संचिका प्रकार सभ अछि}} $2।',
 'api-error-http' => 'आन्तरिक भ्रम: वितरकसँ सम्पर्क करबामे असफल',
 'api-error-illegal-filename' => 'ऐ तरहक संचिका नाम अमान्य अछि।',
 'api-error-mustbeposted' => 'आन्तरिक भ्रम: आग्रहक लेल परिपाठ्य संचार संविद पाठ चाही।',
index e25ebbd..4c4697c 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Moksha (Ð\9cокшень)
+/** Moksha (мокшень)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -1229,9 +1229,9 @@ $3 макссь туфталсь - ''$2''",
 Инголе тонкф файлхнень няфтеманкса ванк [[Special:FileList|тонкф архтофкснень лувомась]], файлонь одукс тонгомасна тяштевихть [[Special:Log/upload|тонгома лувомас]], файлонь нардамасна тяштевихть [[Special:Log/upload|нардама лувомас]].
 
 Архтофкс сёрматфксс сувафтоманкса эряви путомс ки:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' пяшксе файлонь верзинц тевс нолдаманди
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' 200 пиксель кели верзие ёмла кудняса лопань кержи ширеса тевс нолдаманди, 'alt text' вастс путозь архтофкс колга тяштемась
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' файлть мархта видеста сюлмамонди ся файлть апак няфнек.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' пяшксе файлонь верзинц тевс нолдаманди
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 200 пиксель кели верзие ёмла кудняса лопань кержи ширеса тевс нолдаманди, 'alt text' вастс путозь архтофкс колга тяштемась
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' файлть мархта видеста сюлмамонди ся файлть апак няфнек.",
 'upload-permitted' => 'Мярьговикс файл форматт: $1.',
 'upload-preferred' => 'Сембода пара файл форматт: $1.',
 'upload-prohibited' => 'Кардама файл форматт: $1.',
@@ -1258,21 +1258,21 @@ $3 макссь туфталсь - ''$2''",
 'large-file' => 'Сяда пароль файлхт улельхть аф $1-да кувака; тя файлсь $2.',
 'largefileserver' => 'Тя файлсь серверонь мярьгови кувалмода лама.',
 'emptyfile' => 'Файлсь, конась тон тонгодеть шаволь. Тя лиссь, улема, аф лац файллем серматкшнеманц сюнеда.  Ванк ди арьсек улель эли аф тонь мялец тя файлть тонгомонза.',
-'fileexists' => "Тя лемса файл улсь ни.
-Ванк '''<tt>[[:$1]]</tt>''' улель эли аф тонь мяльце сонь полафнемонза.
-[[$1|thumb]]",
-'filepageexists' => "Тя лемса лопа ульсь ни, ванк '''<tt>[[:$1]]</tt>''' аньцек тяни аш файл тя лем мархта.
+'fileexists' => 'Тя лемса файл улсь ни.
+Ванк <strong>[[:$1]]</strong> улель эли аф тонь мяльце сонь полафнемонза.
+[[$1|thumb]]',
+'filepageexists' => 'Тя лемса лопа ульсь ни, ванк <strong>[[:$1]]</strong> аньцек тяни аш файл тя лем мархта.
 Сёрмадомась тон тият аф эвондай лувондома лопаса.
 Тонь сёрмадомацень тоса эвондаманди тондейть сави эсь кядьса сонь петнемс
-[[$1|thumb]]",
-'fileexists-extension' => "Файл тя файлть лемонцты малады ульсь ни: [[$2|thumb]]
-* Тонгодеви файлть лемоц: '''<tt>[[:$1]]</tt>'''
-* Файллем, кона ульсь ни: '''<tt>[[:$2]]</tt>'''
-Эняльттяма, арьсек иля лем.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Файл тя файлть лемонцты малады ульсь ни: [[$2|thumb]]
+* Тонгодеви файлть лемоц: <strong>[[:$1]]</strong>
+* Файллем, кона ульсь ни: <strong>[[:$2]]</strong>
+Эняльттяма, арьсек иля лем.',
 'fileexists-thumbnail-yes' => "Файлсь, улема, архтофксонь кирьфтаф верзиесь ''(thumbnail)''. [[$1|thumb]]
-Ванк файл '''<tt>[[:$1]]</tt>''' лангс.
+Ванк файл <strong>[[:$1]]</strong> лангс.
 Дяряй файлсь конань лангс тон ваноть сяка пяшксе кувалмоса архтофкссь, тоса тага фкя миниатюр тонгомс аф эряви.",
-'file-thumbnail-no' => "Файллемсь ушедсь '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Файллемсь ушедсь <strong>$1</strong>.
 Архтофксть кувалмоц, улема, пяк кирьфтафоль ''(thumbnail)''.
 Улендяряй тонь тя файлть сяда кувака верзиец - тонк сонь, илякс полафтт файллемть.",
 'fileexists-forbidden' => 'Файл тя лем мархта ульсь ни, аш кода сонь тиемс одукс.
@@ -1387,7 +1387,7 @@ $3 макссь туфталсь - ''$2''",
 
 # MIME search
 'mimesearch' => 'MIME вешендема',
-'mimesearch-summary' => 'Тя лопась нолдасы тевс файлонь кочксема синь MIME сортснон коряс. Сёрмадомань формат: файлботмонь сортоц/файлонь форматонц, кепотьксонди <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Тя лопась нолдасы тевс файлонь кочксема синь MIME сортснон коряс. Сёрмадомань формат: файлботмонь сортоц/файлонь форматонц, кепотьксонди <code>image/jpeg</code>.',
 'mimetype' => 'MIME сорт:',
 'download' => 'тонгомс',
 
@@ -1564,7 +1564,7 @@ $3 макссь туфталсь - ''$2''",
 'linksearch-ns' => 'Лемботмоц:',
 'linksearch-ok' => 'Вешендемс',
 'linksearch-text' => 'Сембекондясти лепне "*.wikipedia.org" кондяма ули кода нолдамс тевс.<br />
-Кирдеви протоколхне: <tt>$1</tt>',
+Кирдеви протоколхне: <code>$1</code>',
 'linksearch-line' => '$1 сюлмаф $2ста',
 'linksearch-error' => 'Сембекондясти лепненди ули кода тихтедемс аньцек интернет сюлма лемть ушетксонза.',
 
index 08045b6..ff0f4f7 100644 (file)
  */
 
 $magicWords = array(
-       'redirect'                => array( '0', '#FIHODINANA', '#REDIRECTION', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__TSYASIANALAHATRA__', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__TSYASIANAGALLERY__', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__TEREONYLAHATRA__', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__LAHATRA__', '__LAHAT__', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__TSYAZOOVAINA__', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'VOLANA', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'VOLANA1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'ANARAMBOLANA', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'ANARAMBOLANAGEN', 'ANARANAVOLANA', 'CURRENTMONTHNAME', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ANARAMBOLANAFOHY', 'ANARANAVOLANAFOHY', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ANDRO', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ANDRO2', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ANARANANDRO', 'ANARANAANDRO', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'TAONA', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'LERA', 'HORAIREACTUEL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ORA', 'HEUREACTUELLE', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'VOLANAANTOERANA', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'VOLANAANTOERANA1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'ANARAMBOLANAANTOERANA', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'ANARAMBOLANAANTOERANAGEN', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ANARAMBOLANAANTOERANAFOHY', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ANDROANTOERANA', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ANDROANTOERANA2', 'JOUR2LOCAL', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'ANARANANDROANTOERANA', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'TAONAANTOERANA', 'ANNEELOCALE', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LERAANTOERANA', 'HORAIRELOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ORAANTOERANA', 'HEURELOCALE', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ISAPEJY', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ISALAHATSORATRA', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ISARAKITRA', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ISAMPIKAMBANA', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'ISAMPIKAMBANAMANOVA', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'ISAFANOVANA', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'ISATOPIMASO', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'ANARAMPEJY', 'ANARANAPEJY', 'NOMPAGE', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ANARAMPEJYX', 'ANARANAPEJYX', 'NOMPAGEX', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ANARANTSEHATRA', 'ANARANASEHATRA', 'ESPACENOMMAGE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ANARANTSEHATRAX', 'ANARANASEHATRAX', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'PEJINDRESAKA', 'PEJYRESAKA', 'DINIKA', 'ESPACEDISCUSSION', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'PEJINDRESAKAX', 'PEJYRESAKAX', 'DINIKAX', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'TOERANALAHATSORATRA', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'TOERANNYLAHATSORATRA', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'ANARAMPEJYFENO', 'ANARANAPEJYFENO', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ANARAMPEJYFENOX', 'ANARANAPEJYFENOX', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ANARANAZANAPEJY', 'ANARANJANAPEJY', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ANARANJANAPEJYX', 'ANARANAZANAPEJYX', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'ANARANAFOTOPEJY', 'ANARAMPOTOPEJY', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'ANARANAFOTOPEJYE', 'ANARAMPOTOPEJYE', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ANARAMPEJINDRESAKA', 'ANARANAPEJINDRESAKA', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
-       'img_right'               => array( '1', 'ankavanana', 'droite', 'right' ),
-       'img_left'                => array( '1', 'ankavia', 'gauche', 'left' ),
-       'img_none'                => array( '1', 'tsymisy', 'néant', 'neant', 'none' ),
-       'img_center'              => array( '1', 'ampivoany', 'anivony', 'centré', 'center', 'centre' ),
-       'img_page'                => array( '1', 'pejy $1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'sisiny', 'bordure', 'border' ),
-       'img_top'                 => array( '1', 'ambony', 'haut', 'top' ),
-       'img_middle'              => array( '1', 'anivo', 'milieu', 'middle' ),
-       'img_bottom'              => array( '1', 'ambany', 'bas', 'bottom' ),
-       'currentweek'             => array( '1', 'HERINANDRO', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ALAHADY', 'JDSACTUEL', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'HERINANDROANTOERANA', 'SEMAINELOCALE', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ALAHADYANTOERANA', 'JDSLOCAL', 'LOCALDOW' ),
-       'fullurl'                 => array( '0', 'URLREHETRA:', 'URLCOMPLETE:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLREHETRAX:', 'URLCOMPLETEX:', 'FULLURLE:' ),
-       'displaytitle'            => array( '1', 'ASEHOLOHATENY', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
+       'redirect'                  => array( '0', '#FIHODINANA', '#REDIRECTION', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__TSYASIANALAHATRA__', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__TSYASIANAGALLERY__', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__TEREONYLAHATRA__', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__LAHATRA__', '__LAHAT__', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__TSYAZOOVAINA__', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'VOLANA', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'VOLANA1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'ANARAMBOLANA', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ANARAMBOLANAGEN', 'ANARANAVOLANA', 'CURRENTMONTHNAME', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ANARAMBOLANAFOHY', 'ANARANAVOLANAFOHY', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ANDRO', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ANDRO2', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ANARANANDRO', 'ANARANAANDRO', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'TAONA', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'LERA', 'HORAIREACTUEL', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ORA', 'HEUREACTUELLE', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'VOLANAANTOERANA', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'VOLANAANTOERANA1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'ANARAMBOLANAANTOERANA', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'ANARAMBOLANAANTOERANAGEN', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ANARAMBOLANAANTOERANAFOHY', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ANDROANTOERANA', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ANDROANTOERANA2', 'JOUR2LOCAL', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'ANARANANDROANTOERANA', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'TAONAANTOERANA', 'ANNEELOCALE', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LERAANTOERANA', 'HORAIRELOCAL', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ORAANTOERANA', 'HEURELOCALE', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ISAPEJY', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ISALAHATSORATRA', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ISARAKITRA', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ISAMPIKAMBANA', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'ISAMPIKAMBANAMANOVA', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'ISAFANOVANA', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'ISATOPIMASO', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'ANARAMPEJY', 'ANARANAPEJY', 'NOMPAGE', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ANARAMPEJYX', 'ANARANAPEJYX', 'NOMPAGEX', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ANARANTSEHATRA', 'ANARANASEHATRA', 'ESPACENOMMAGE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ANARANTSEHATRAX', 'ANARANASEHATRAX', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'PEJINDRESAKA', 'PEJYRESAKA', 'DINIKA', 'ESPACEDISCUSSION', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'PEJINDRESAKAX', 'PEJYRESAKAX', 'DINIKAX', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'TOERANALAHATSORATRA', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'TOERANNYLAHATSORATRA', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ANARAMPEJYFENO', 'ANARANAPEJYFENO', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ANARAMPEJYFENOX', 'ANARANAPEJYFENOX', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ANARANAZANAPEJY', 'ANARANJANAPEJY', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ANARANJANAPEJYX', 'ANARANAZANAPEJYX', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'ANARANAFOTOPEJY', 'ANARAMPOTOPEJY', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'ANARANAFOTOPEJYE', 'ANARAMPOTOPEJYE', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ANARAMPEJINDRESAKA', 'ANARANAPEJINDRESAKA', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
+       'img_right'                 => array( '1', 'ankavanana', 'droite', 'right' ),
+       'img_left'                  => array( '1', 'ankavia', 'gauche', 'left' ),
+       'img_none'                  => array( '1', 'tsymisy', 'néant', 'neant', 'none' ),
+       'img_center'                => array( '1', 'ampivoany', 'anivony', 'centré', 'center', 'centre' ),
+       'img_page'                  => array( '1', 'pejy $1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'sisiny', 'bordure', 'border' ),
+       'img_top'                   => array( '1', 'ambony', 'haut', 'top' ),
+       'img_middle'                => array( '1', 'anivo', 'milieu', 'middle' ),
+       'img_bottom'                => array( '1', 'ambany', 'bas', 'bottom' ),
+       'currentweek'               => array( '1', 'HERINANDRO', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ALAHADY', 'JDSACTUEL', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'HERINANDROANTOERANA', 'SEMAINELOCALE', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ALAHADYANTOERANA', 'JDSLOCAL', 'LOCALDOW' ),
+       'fullurl'                   => array( '0', 'URLREHETRA:', 'URLCOMPLETE:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLREHETRAX:', 'URLCOMPLETEX:', 'FULLURLE:' ),
+       'displaytitle'              => array( '1', 'ASEHOLOHATENY', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
 );
 
 $fallback = 'fr';
@@ -110,7 +110,7 @@ $namespaceAliases = array(
        'Utilisateur' => NS_USER,
        'Discussion_Utilisateur' => NS_USER_TALK,
        'Discussion_$1' => NS_PROJECT_TALK,
-       'Discussion_Image' => NS_IMAGE_TALK,
+       'Discussion_Image' => NS_FILE_TALK,
        'Discussion_MediaWiki' => NS_MEDIAWIKI_TALK,
        'Modèle' => NS_TEMPLATE,
        'Discussion_Modèle' => NS_TEMPLATE_TALK,
@@ -224,7 +224,7 @@ $messages = array(
 'tog-hidepatrolled' => "Hanitrika ny fanovana voaara-maso ao amin'ny fanovana farany",
 'tog-newpageshidepatrolled' => "Hanitsika ny pejy voaara-maso ao amin'ny pejy vaovao",
 'tog-extendwatchlist' => 'Hanitatra ny lisitra fanaraham-pejy mba haneho ny fanovana rehetra fa tsy ny vaovao indrindra fotsiny',
-'tog-usenewrc' => "Hampiasa ny fanovana farany nohatsaraina (mila an'i Javascript)",
+'tog-usenewrc' => "Hamondrona ny fanovana araka ny pejy ao amin'ny fanovàna farany ary ao amin'ny pejy arahana (mila Javascript)",
 'tog-numberheadings' => 'Asio laharany ny lohateny',
 'tog-showtoolbar' => 'Asehoy ny edit toolbar (mila JavaScript)',
 'tog-editondblclick' => 'Ovay ny pejy rehefa voatsindry indroa misesy ny totozy (mila JavaScript)',
@@ -232,17 +232,17 @@ $messages = array(
 'tog-editsectiononrightclick' => "Ovay ny fizaràna rehefa manindry ny bokotra havanana amin'ny totozy eo amin'ny lohateny hoe fizaràna (mila JavaScript)",
 'tog-showtoc' => "Asehoy ny fanoroan-takila (ho an'ny pejy misy lohateny mihoatra ny 3)",
 'tog-rememberpassword' => "Tadidio ny tenimiafiko eto amin'ity solosaina ity (mandritry ny andro $1 fara-fahabetsany){{PLURAL:}}",
-'tog-watchcreations' => "Ampina ao anarin'ny pejy fanaraha-maso ny pejy amboariko",
-'tog-watchdefault' => "Atsofohy ao amin'ny lisitry ny pejy arahinao maso ny pejy izay ovainao na foroninao",
-'tog-watchmoves' => "Ampina ao anatin'ny pejiko fanaraha-maso ny pejy soloiko anarana",
-'tog-watchdeletion' => "Ampina anatin'ny pejy fanaraha-maso ny pejy nofafako",
+'tog-watchcreations' => 'Hanaraka ny pejy foronoko ary ny rakitra ampidiriko',
+'tog-watchdefault' => 'Hanaraka ny pejy ary ny rakitra ovaiko',
+'tog-watchmoves' => 'Hanaraka ny pejy ary ny rakitra ovaiko anarana',
+'tog-watchdeletion' => 'Hanaraka ny pejy ary ny rakitra voafafako',
 'tog-minordefault' => 'Mariho ho madinika foana aloha ny fanovana rehetra',
 'tog-previewontop' => "Asehoy alohan'ny boaty fanovana ny tsipalotra",
 'tog-previewonfirst' => "Asehoy ny tsipalotra amin'ny fanovana voalohany",
 'tog-nocache' => 'Tsy alefa ny fanehoana ny pejy voasitriky ny mpitety',
-'tog-enotifwatchlistpages' => 'Andefaso imailaka aho rehefa misy miova ny pejy',
+'tog-enotifwatchlistpages' => 'Andefasana imailaka rehefa voaova ny pejy na ny rakitra arahako',
 'tog-enotifusertalkpages' => 'Andefaso imailaka aho rehefa miova ny pejin-dresako',
-'tog-enotifminoredits' => 'Andefaso imailaka aho na dia fanovana madinika ihany aza',
+'tog-enotifminoredits' => "Andefasana imailaka na dia fanovana madinika aza no atao amin'ny pejy sy ny rakitra",
 'tog-enotifrevealaddr' => "Asehoy ny adiresy imailako any amin'ny imailaka fampilazana",
 'tog-shownumberswatching' => "Asehoy ny isan'ny mpikambana manara-maso ny pejy",
 'tog-oldsig' => "Topi-mason'ny sonia :",
@@ -529,12 +529,11 @@ Mitaky version $1-n'i MediaWiki",
 # General errors
 'error' => 'Tsy mety',
 'databaseerror' => "Tsy fetezana eo amin'ny toby",
-'dberrortext' => 'Nisy tsy fetezana ao amin\'ny fangatahana tany amin\'ny database.
-Inoana fa ny rindrankajy no misy olana (bug).
-Ny fangatahana farany dia:
-<blockquote><tt>$1</tt></blockquote>
-tao amin\'ny tao "<tt>$2</tt>".
-Toy izao no navalin\'ny MySQL "<tt>$3: $4</tt>".',
+'dberrortext' => "Nitranga ny hadisoana ara-pirafi-kataka (syntax error).
+Mety noho ny tsifandehanan'ny rindrankajy tsara izany.
+<blockquote><code>$1</code></blockquote>
+avy amin'ny tao « <code>$2</code> ».
+ary « <samp>$3 : $4</samp> » no hadisoana naverinn'ny banky angona.",
 'dberrortextcl' => "Ao amin'ny fangatahana tao amin'ny banky angona dia misy tsi-fetezana ara-pehezanteny.
 Ny fangatahana farany nalefa dia :
 « $1 »
@@ -572,21 +571,24 @@ Mihidy ho azy aloha ny banky angona mandra-pahatratran'ny serveur andevo ny tomp
 'badarticleerror' => "Tsy azo atao eto amin'ity pejy ity io asa io.",
 '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"',
 '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' => 'Ireto angona ireto dia nalaina tao anaty cache koa mety ho efa lany daty. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => "Aminy ''cache'' daholo ny ''data'' misy ato, tamin'ny $1 ny data tato no natao ''mise à jour''. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+'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",
+'perfcachedts' => "Ao amin'ny voatakona (cache) ny data aseho, ary tamin'ny $1 izy no navaozina farany. $4{{PLURAL:}} no isan'ny valim-pikarohana ao amin'ilay voatakona.",
 'querypage-no-updates' => "Tsy nalefa ny ''mise à jour'' (update) hoan'ity pejy ity.
 Mety tsy misy fifandraisana amin'ny zavamisy ankehitriny ny zavamisy ao anatin'ity pejy ity..",
 'wrong_wfQuery_params' => "Misy tsy fetezana amin'ny wfQuery()<br />
 Asa : $1<br />
 fangatahana : $2",
 'viewsource' => 'Hijery fango',
+'viewsource-title' => "Hijery ny fangon'i $1",
 'actionthrottled' => 'Tao voafetra',
 'actionthrottledtext' => "Mba hiady amin'ny spam, ny hatetika momba ny fanaovana io otao io dia ferana ho foifoy, ary niaotra io fetra io ianao.
 Andramo indray afaka minitra vitsivitsy.",
 'protectedpagetext' => 'Voaaro mba tsy hisy hanova ity pejy ity.',
 'viewsourcetext' => "Azonao atao no mijery sy mandrika ny votoatin'ity pejy ity :",
+'viewyourtext' => "Azonao atao ny mijery ary mandika ny fangon'ny '''fanovanao''' tamin'ity pejy ity:",
 'protectedinterface' => "Manome lahatsoratra ho an'ny rindrankajy ity pejy ity ary voaaro izy ity mba tsy hisy hanararaotra",
 'editinginterface' => "'''Tandremo :''' manova pejy ampiasan'ny lôjisialy wiki ianao. Mety hita ny mpikambana sàsany izy io. Rehefa tia mandika teny ianao, jereo ny volavola MediaWiki ho an'ny internationalisation ny hafatra [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
 'sqlhidden' => '(nafenina ny requête SQL)',
@@ -599,6 +601,7 @@ $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'' ».",
+'exception-nologin' => 'Tsy tafiditra',
 
 # Virus scanner
 'virus-badscanner' => "Diso : Tsy fantatray ny mpitady virus ''$1''",
@@ -693,6 +696,7 @@ mba hanaporofoana fa anao io kaonty io.",
 'emailconfirmlink' => 'Hamarino ny adiresy imailakao',
 'invalidemailaddress' => 'Tsy mety io imailaka nalefanao io satria tsy manaraka ny firafitra tokony ho izy.
 Azafady manomeza adiresy voasoratra tsara na avelao ho banga io toerana io.',
+'cannotchangeemail' => "Tsy afaka ovaina eto amin'ity wiki ity ny adiresy imailaky ny kaonty.",
 'accountcreated' => 'Kaonty voaforona',
 'accountcreatedtext' => "Voasokatra ilay kaonty hoan'i $1.",
 'createaccount-title' => "Fanokafana kaonty ho an'ny/i {{SITENAME}}",
@@ -736,6 +740,7 @@ Mety efa nanova tenimiafina na nanontany tenimiafina miserana angamba ianao.',
 'passwordreset-pretext' => '{{PLURAL:$1}}Mampidira singa data eo ambany',
 'passwordreset-username' => 'Anaram-pikambana :',
 'passwordreset-domain' => 'Vala (domain) :',
+'passwordreset-capture' => 'Hijery ny imailaka vokany ?',
 '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 :
@@ -752,6 +757,8 @@ Hitsahatra afaka {{PLURAL:$5|iray|$5}} andro {{PLURAL:$3|io|ireo}} tenimiafina {
 '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",
 
 # Special:ChangeEmail
 'changeemail' => 'Hanova ny adiresy imailaka',
@@ -861,10 +868,9 @@ Azonao atao ny [[Special:Search/{{PAGENAME}}|Mikaroka momba ny lohatenin'io pejy
 'blocked-notice-logextract' => "Ankehitriny ity mpikambana ity dia voasakana.
 Ny fampidirana faran'ny laogin'ny fanakanam-pikambana dia naseho teo ambany ho an'ny fampahalalàna :",
 'clearyourcache' => "'''Fantaro :''' Rehefa avy mitahiry, dia mila terenao ny fanavaozana ny voatakon'ny mpitety tranonkalanao hahafahanao mahita ny fanovana.
-'''Firefox/Safari:''' Tazomy ho voapotsitra ny kitika ''Maj'' na ''Shift'', dia tsindrio eo amin'i ''Actualiser'', na tsindrio Ctrl+F5
-'''Google Chrome:''' Miaraka tsindrio Ctrl, Maj ary R.
-'''Internet Explorer''': Miaraka tsindrio Ctrl sy F5
-'''Konqueror''': Tsindrio F5
+'''Firefox/Safari:''' Tazomy ho voapotsitra ny kitika ''Maj'' na ''Shift'', dia tsindrio eo amin'i ''Actualiser'', na Ctrl+F5
+'''Google Chrome:''' Tsindrio miaraka ny Ctrl, Maj ary R.
+'''Internet Explorer''': Tsindrio miaraka Ctrl sy F5
 '''Opera''': Esory ny voatatoka ao amin'ny ''Outils → Préférences'' (''Fitaovana  → Safidy'').",
 'usercssyoucanpreview' => "'''Fika:''' Ampiasao ny bokotra 'Tsipalotra' mialoha ny hitehirizanao ny CSS-nao vaovao.",
 'userjsyoucanpreview' => "'''Fika:''' Ampiasao ny bokotra 'Tsipalotra' mialoha ny hitehirizanao ny JS-nao vaovao.",
@@ -879,7 +885,9 @@ Ny fampidirana faran'ny laogin'ny fanakanam-pikambana dia naseho teo ambany ho a
 Tadidio fa mampiasa soramadinika ny lohatenin'ny pejinao manan-tovana *.css sy *.js, ohatra {{ns:user}}:Foo/vector.css fa tsy {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Nohavaozina)',
 'note' => "'''Fanamarihana:'''",
-'previewnote' => "'''Topi-maso ihany ity hitanao ity, tsy mbola voatahiry ny fanovana nataonao!'''",
+'previewnote' => "'''Fantaro fa topi-maso fotsiny ity.'''
+Mbola tsy voatahiry ny fanovanao !",
+'continue-editing' => 'Tohizana ny fanovana',
 'previewconflict' => "
 Ity topi-maso ity no mifanaraka amin'ny lahatsoratra ao amin'ny faritra eo ambony,
 ary toy izao no ho fisehon'ny pejy raha misafidy ny hitahiry azy ianao.",
@@ -918,7 +926,8 @@ Raha io no tahirizinao, dia ho very ny fanovana ity pejy ity rehetra taorian'io
 Ny zava-tsoratanao eto dia vokatr'asa naverinao soratana na nodikainao tany amina loharano ao amin'ny vala sarababem-bahoaka na loharano malalaka hafa (Jereo $1 ho an'ny antsipirihany).
 
 '''Aza mampiasa tahirin-kevitra tsy nahazoan-dalana!'''",
-'longpageerror' => "'''Tsi-fetezana : Ny lanjan’ny lahatsoratrao dia $1 Ko, mihoatra ny $2 Ko, ilay fetra napetraka. Tsy afaka tahirizina ilay lahatsoratra.'''",
+'longpageerror' => "'''Hadisoana : Ny tahirin-tsoratra nalefanao dia manana halava {{PLURAL:$1|iray|$1}} kilooktety, izay lava kokoa nohon'ny fetra avo indridra izay natao ho {{PLURAL:$2|iray|$2}} kilooktety.'''
+Tsy afaka tahirizina ilay tahirin-tsoratra.",
 'readonlywarning' => "'''FAMPITANDREMANA: Nohidiana noho ny antony fikolokoloana aloha ny banky angona,
 koa tsy afaka mitahiry ny fanovana nataonao aloha ianao izao. Angamba tokony hanao Couper coller aloha
 ianao dia tehirizo anaty rakitra ny fanovanao mandra-paha.'''
@@ -956,6 +965,7 @@ Mety voafafa angamba izy.',
 'edit-no-change' => "Tsy norarahian'ny rindrankajy ny fanovanao satria tsy nanova ny lahatsoratra ianao.",
 'edit-already-exists' => 'Tsy afaka amboarina ilay pejy vaovao.
 Efa misy izy.',
+'defaultmessagetext' => 'Hafatra raha tsy misy',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Tandremo : Betsaka loatra ny fanantsoana ny tao parser.
@@ -970,6 +980,11 @@ Ao aorian'ny fivelarana, mety namoaka valy lava loatra angamba izy, ary tsy namp
 'parser-template-loop-warning' => 'endrika vono hita tao : [[$1]]',
 'parser-template-recursion-depth-warning' => "Fetran'ny halalin'ny fiantsoana endrika voahoatra ($1).",
 'language-converter-depth-warning' => "Mihoatra ny fetran-kalalin'ny mpamadika teny ($1)",
+'node-count-exceeded-category' => "Pejy izay ahitana fihoatran'ny isam-patotra (node)",
+'node-count-exceeded-warning' => 'Pejy manana isam-patotra mihoatra',
+'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',
 
 # "Undo" feature
 'undo-success' => 'Ho voafafa io fanovana io. Marino tsara ny fanovana eo ambany, ary tehirizo rehefa vita.',
@@ -1114,8 +1129,7 @@ Jereo ny laogy.",
 
 # Suppression log
 'suppressionlog' => 'tatitr’asa momban’ny famafana pejy',
-'suppressionlogtext' => "Ity ny lisitra ny famafàna sy ny fanakanana asitrika amin'ny mpandrindra.
-Hijery ny [[Special:BlockList|lisitra ny adiresy IP sy mpikambana voasakana]] ho an'ny lisitra ny voaraoka sy ny fanakanana mbola miasa.",
+'suppressionlogtext' => "Ity ny lisitry ny famafana ary ny sakana mikasika ny votoatiny asitrika amin'ny mpandrindra. Jereo ny [[Special:BlockList|lisitry ny sakana]] ho an'ny lisitry ny fandroahana ary ny sakana mbola mihatra amin'izao fotoana.",
 
 # History merging
 'mergehistory' => 'Atsonika ny tantara ny pejy',
@@ -1150,6 +1164,8 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 
 # Diffs
 'history-title' => "Tantara ny endrik'i « $1 »",
+'difference-title' => "$1 : Fahasamihafan'ny santiôna roa",
+'difference-title-multipage' => 'Fahasamihafan\'ny pejy "$1" ary "$2"',
 'difference-multipage' => "(Fahasamihafan'ny pejy)",
 'lineno' => 'Andalana $1:',
 'compareselectedversions' => 'Ampitahao ireo version voafidy',
@@ -1245,11 +1261,12 @@ ihany no miseho amin'ny vokatry ny karoka).",
 'prefs-beta' => 'Fitaovana beta',
 'prefs-datetime' => 'Daty sy ora',
 'prefs-labs' => 'Fitaovana  « labs »',
+'prefs-user-pages' => 'Pejim-pikambana',
 'prefs-personal' => 'Mombamomba anao',
 'prefs-rc' => 'Vao niova',
 'prefs-watchlist' => 'Lisitry ny pejy arahana-maso',
 'prefs-watchlist-days' => "Isa ny andro haseho anatin'ny lisitra ny pejy arahana-maso",
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => '$1 {{PLURAL:$1|}} andro farafahabetsany',
 'prefs-watchlist-edits' => "Isa ny fanovana aseho eo amin'ny fanaraha-maso navelatra:",
 'prefs-watchlist-edits-max' => 'Isa fara-fahabetsany : 1000',
 'prefs-watchlist-token' => "token ho an'ny lisitry ny pejy arahi-maso:",
@@ -1356,10 +1373,15 @@ 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",
 'userrights-editusergroup' => 'Hanova vondrom-pikambana',
 'saveusergroups' => 'Tehirizo ny vondrom-pikambana',
 'userrights-groupsmember' => "Mpikambana amin'ny vondrona:",
 'userrights-groupsmember-auto' => "Mpikambana tsy dia voalazan'i :",
+'userrights-groups-help' => 'Azonao atao ny manova ny vondrona isian\'ity mpikambana ity.
+* Ny boaty voa-"check" dia midika fa ao amin\'io vondrona io ilay mpikambana.
+* Ny boaty tsy voa-"check" dia midika fa tsy ao amin\'io vondrona io ilay mpikambana.
+* Ny * dia fa tsy azonao esorina amin\'ilay vondrona nampianao/nesorinao ilay mpikambana.',
 'userrights-reason' => 'Antony :',
 'userrights-no-interwiki' => "Tsy manana alalana manova ny alalan'ny mpikambana eny amin'ny wiki hafa ianao.",
 'userrights-nodatabase' => 'Tsy eto akaiky na tsy misy ny banky angona « $1 ».',
@@ -1378,12 +1400,12 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'group-suppress' => 'Mpitondra',
 'group-all' => '(izy rehetra)',
 
-'group-user-member' => 'Mpikambana',
-'group-autoconfirmed-member' => 'Mpikambana voasoratra',
-'group-bot-member' => 'Mpikambana rôbô',
-'group-sysop-member' => 'Mpandrindra',
-'group-bureaucrat-member' => 'Borôkraty',
-'group-suppress-member' => 'Mpitondra',
+'group-user-member' => '{{GENDER:$1|mpikambana}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|Mpikambana voamarina ho azy}}',
+'group-bot-member' => '{{GENDER:$1|Mpikambana rôbô}}',
+'group-sysop-member' => '{{GENDER:$1|Mpandrindra}}',
+'group-bureaucrat-member' => '{{GENDER:$1|Borôkraty}}',
+'group-suppress-member' => '{{GENDER:$1|Mpitondra}}',
 
 'grouppage-user' => '{{ns:project}}:Mpikambana',
 'grouppage-autoconfirmed' => '{{ns:project}}:Mpikambana Voamafy',
@@ -1417,6 +1439,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'right-writeapi' => 'Mampiasa ny API fifanovana ny wiki',
 'right-delete' => 'Mamafa pejy',
 'right-bigdelete' => 'Mamafa pejy manana tantara be',
+'right-deletelogentry' => "Hamafa ary hamerina iditra manokana ao amin'ny laogy.",
 'right-deleterevision' => 'Mamafa ny version manokana-na pejy iray',
 'right-deletedhistory' => 'Mijery ny tantaram-pejy voafafa fa tsy lahatsorany',
 'right-deletedtext' => "Mijery ny lahatsoratra voafafa sy ny fampitahana anelanelan'ny santiôna voafafa",
@@ -1451,6 +1474,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'right-siteadmin' => 'Manidy sy manokatra ny banky angona',
 'right-override-export-depth' => "Mamoaka ny pejy miaraka amin'ny zana-pejy hatramin'ny ambaratonga fahadimy",
 'right-sendemail' => "Mandefa imailaka any amin'ny mpikambana hafa",
+'right-passwordreset' => 'Hijery ny imailaka famerenana ny tenimiafina',
 
 # User rights log
 'rightslog' => 'Tatitr’asa momban’ny fanovana satam-pikambana',
@@ -1484,6 +1508,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'action-suppressionlog' => 'hijery io tao tsy sarababem-bahoaka',
 'action-block' => 'manakana am-panoratana ny mpikambana iray',
 'action-protect' => "manova ny fanovàn'ity pejy ity",
+'action-rollback' => "Manafoana haingana ny fanovan'ny mpikambana farany nanova pejy iray",
 'action-import' => 'mampiditra ity pejy ity avy amina wiki hafa',
 'action-importupload' => 'hampiditra ity pejy ity avy amina rakitra nampidirina',
 'action-patrol' => 'marihana ho hita ity version ity',
@@ -1493,6 +1518,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'action-userrights' => "hanova ny fahefan'ny mpikambana rehetra",
 'action-userrights-interwiki' => "hanova ny fahefan'ny mpikambana any amin'ny wiki hafa",
 'action-siteadmin' => 'Manidy sy manokatra ny banky angona',
+'action-sendemail' => 'handefa imailaka',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|fanovana|fanovana}} $1',
@@ -1524,9 +1550,11 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|mpikambana|mpikambana}} manara-maso]',
 'rc_categories' => 'Ferana amin\'ireto sokajy ireto ihany (saraho amin\'ny "|")',
 'rc_categories_any' => 'Tsy misy fetrany',
+'rc-change-size-new' => "$1{{PLURAL:}} oktety taorian'ny fanovana",
 'newsectionsummary' => '/* $1 */ fizarana vaovao',
 'rc-enhanced-expand' => 'Jereo ny detail (mila JavaScript)',
 'rc-enhanced-hide' => 'Asitriho ny adidiny sy ny antsipiriany',
+'rc-old-title' => 'noforonina tamin\'ilay lohateny "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Novaina',
@@ -1571,14 +1599,15 @@ Raha hanisy sary ao anaty pejy, dia mampiasà rohy toy ny iray amin'ireto
 'ignorewarnings' => 'Aza mihaino fampitandremana',
 'minlength1' => 'Ny anaran-drakitra dia tokony manana litera iray fara-fahakeliny',
 'illegalfilename' => 'Misy litera tsy mety amin\'ny lohateny ny anaran\'ilay rakita "$1". Azafady soloy ny anaran\'ny rakitra dia andramo alefa indray.',
+'filename-toolong' => 'Tsy afaka mihoatra ny 240 oktety ny anaran-drakitra.',
 'badfilename' => 'Novana ho "$1" ny anaran\'ny rakitra.',
-'filetype-mime-mismatch' => "Ny karazan-drakitra dia tsy miady amin'ny karazana MIME.",
+'filetype-mime-mismatch' => 'Ny karazan-drakitra ".$1" dia tsy miady amin\'ny karazana MIME novinavinaina ho azy ho an\'ilay rakitra ($2).',
 'filetype-badmime' => 'Ny karazan-drakitra MIME « $1 » dia tsy afaka ampidirina.',
 'filetype-bad-ie-mime' => "Tsy afaka ampidirina ilay rakitra satria hitan'i Internet Explorer faha « $1 » izy, midika rakitra voarara satria mety mampidi-doza",
 'filetype-unwanted-type' => "Karazan-drakitra tsy tiana ny karazan-drakitra '''« .$1 »'''.
 {{PLURAL:$3||}}Ny karazan-drakitra fidiana dia $2.",
-'filetype-banned-type' => "Rarana ato ny karazan-drakitra '''« .$1 »'''
-{{PLURAL:$3||}}Ny karazan-drakitra ekena dia $2.",
+'filetype-banned-type' => "'''\".\$1\"'''dia {{PLURAL:\$4|anisan'ny|}} karazan-drakitra voarara.
+Karazan-drakitra azo alefa {{PLURAL:\$3||}} \$2.",
 'filetype-missing' => 'Tsy manan-karazan-drakitra ilay rakitra (hoatry ny « .jpg » ohatra).',
 'empty-file' => 'Tsy manam-botoatiny ny rakitra nalefanao.',
 'file-too-large' => 'Ngeza loatra ny rakitra nalefanao.',
@@ -1597,21 +1626,21 @@ Ngeza noho izay zakan'ny serveur io rakitra io.",
 'emptyfile' => "Ohatry ny tsy misy na inona na inona ilay rakitra nalefanao teo.
 Sao dia misy diso tsipelina ny anaran'ny rakitra? Azafady mba hamarino fa tena naniry handefa io rakitra io tokoa ianao.",
 'windows-nonascii-filename' => 'Tsy mahazaka anaran-drakitra misy tarehintsoratra manokana ity wiki ity.',
-'fileexists' => "Efa misy rakitra manana io anarana io ato.
-Mariho '''<tt>[[:$1]]</tt>''' raha mbola tsy te-hanova azy ianao.
-[[$1|thumb]]",
-'filepageexists' => "Efa namboarina teto ny pejy mamisavisa ity rakitra ity '''<tt>[[:$1]]</tt>''', fa tsy misy rakitra mitondra io anarana io.
+'fileexists' => 'Efa misy rakitra manana io anarana io ato.
+Mariho <strong>[[:$1]]</strong> raha mbola tsy te-hanova azy ianao.
+[[$1|thumb]]',
+'filepageexists' => "Efa namboarina teto ny pejy mamisavisa ity rakitra ity <strong>[[:$1]]</strong>, fa tsy misy rakitra mitondra io anarana io.
 Ny ambangovangony ho ataonareo dia tsy hiseho eo amin'ny pejy famisavisana.
 Mba hanao azy, tsy maintsy ovainao manokana ilay pejy [[$1|thumb]]",
-'fileexists-extension' => "Misy rakitra manana anarana mitovitovy : [[$2|thumb]]
-* Anaran-drakitra ho ampidirina : '''<tt>[[:$1]]</tt>'''
-* Anaran-drakitra misy : '''<tt>[[:$2]]</tt>'''
-Misafidia anarana hafa.",
+'fileexists-extension' => 'Misy rakitra manana anarana mitovitovy : [[$2|thumb]]
+* Anaran-drakitra ho ampidirina : <strong>[[:$1]]</strong>
+* Anaran-drakitra misy : <strong>[[:$2]]</strong>
+Misafidia anarana hafa.',
 'fileexists-thumbnail-yes' => "
 Hoatry ny saritapaka ''(vignette)'' ilay sary. [[$1|thumb]]
-Marino ilay rakitra '''<tt>[[:$1]]</tt>'''.
+Marino ilay rakitra <strong>[[:$1]]</strong>.
 Raha mitovy amin'ny sary voalohany ny sarin'ilay rakitra marinina, tsy ilaina ny mampiditra santiôna nakelezina.",
-'file-thumbnail-no' => "Manomboka amin'ny '''<tt>$1</tt>''' ny anaran'ilay rakitra.
+'file-thumbnail-no' => "Manomboka amin'ny <strong>$1</strong> ny anaran'ilay rakitra.
 Mety saritapaka ''(vignette)'' io sary io.
 Raha manana santiôna ilay rakitra ngezangeza noho io ianao, ampidiro ato ilay izy, raha tsy izany ovay ny anarany.",
 'fileexists-forbidden' => 'EEfa misy rakitra iray mitondra io anarana io ary tsy afaka itsahina ilay rakitra.
@@ -1649,7 +1678,7 @@ Tokony marina ny $1 aloha ny manao fampidirana vaovao.',
 'filename-bad-prefix' => "Ny anaran-drakitra ho ampidirinareo dia manomboka amin'ny '''« $1 »''', anarana omena an'ny fakan-tsary elektirônika.
 Misafidia anaran-drakitra mambangovango.",
 'upload-success-subj' => 'Voaray soa aman-tsara ny rakitra',
-'upload-success-msg' => 'Eto ny rakitra nalefanao : [[:{{ns:file}}:$1]]',
+'upload-success-msg' => "Vita soa aman-tsara ilay fandefasan-drakitra avy amin'i [$2]. Eto ny toerana mety ahitanao ny rakitrao : [[:{{ns:file}}:$1]]",
 'upload-failure-subj' => 'Olana nitranga teo am-pandefasana',
 'upload-failure-msg' => "Nisy olana tamin'ny fampidiranao [$2] :
 
@@ -1668,6 +1697,43 @@ Raha mbola misy foana ilay  olana, manorata any amin'ny [[Special:ListUsers/syso
 'upload-unknown-size' => 'tsy fantatra ny habe',
 'upload-http-error' => 'Nisy tsy fetezana HTTP nitranga : $1',
 
+# File backend
+'backend-fail-stream' => 'Tsy afaka mamaky ilay rakitra $1.',
+'backend-fail-backup' => 'Tsy afaka mitahiry ilay rakitra $1.',
+'backend-fail-hashes' => "Tsy azo ilay hash an-drakitra ho an'ny fampitahana.",
+'backend-fail-notsame' => "Efa misy rakitra samihafa ho an'i $1",
+'backend-fail-invalidpath' => '$1 dia lalam-pitahirizana tsy azo raisina.',
+'backend-fail-delete' => 'Tsy afaka mamafa ilay rakitra $1.',
+'backend-fail-alreadyexists' => 'Efa misy ilay rakitra $1.',
+'backend-fail-store' => 'Tsy afaka mitahiry ilay rakitra $1 anaty $2.',
+'backend-fail-copy' => 'Tsy afaka mandika ilay rakitra $1 anaty $2.',
+'backend-fail-move' => "Tsy afaka manova ny toeran'ilay raktira avy amin'i $1 mankany amin'i $2.",
+'backend-fail-opentemp' => 'Tsy afaka manokatra ilay rakitra miserana.',
+'backend-fail-writetemp' => "Tsy afaka manoratra ao anatin'ilay rakitra miserana.",
+'backend-fail-closetemp' => 'Tsy afaka manidy ilay rakitra miserana.',
+'backend-fail-read' => 'Tsy afaka mamaky ilay rakitra $1.',
+'backend-fail-create' => "Tsy afaka manoratra anatin'ilay rakitra $1.",
+'backend-fail-readonly' => 'Amin\'izao fotoana dia famakiana ihany ny fitahirizana terminal an\'i "$1". "\'\'$2\'\'" no antony nomena',
+'backend-fail-connect' => 'Tsy afaka mifandray amin\'ny terminal fitahirizana "$1".',
+'backend-fail-internal' => 'Hadisoana tsy fantatra tao anatin\'ny terminal fitahirizana "$1".',
+'backend-fail-usable' => "Tsy afaka manoratra ilay rakitra $1 noho ny tsifiampian'ny zo na noho ny petra-drakitra tsy misy.",
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Tsy afaka miantso ilay banky angona laogy ho an\'ny terminal fitahirizana "$1".',
+'filejournal-fail-dbquery' => 'Tsy afaka manavao ny banky angona laogy ho an\'ilay terminal fitahirizana "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Tsy afaka manalahidy an\'i "$1" ; tsy voahidy ilay izy.',
+'lockmanager-fail-closelock' => 'Tsy afaka manidy ilay rakitra fanidiana ho an\'i "$1".',
+'lockmanager-fail-deletelock' => 'Tsy afaka manidy ilay rakitra fanidiana ho an\'i "$1"',
+'lockmanager-fail-acquirelock' => 'Tsy afaka maka ilay rakitra fanidiana ho an\'i "$1"',
+'lockmanager-fail-openlock' => 'Tsy afaka manokatra ilay rakitra fanidiana ho an\'i "$1".',
+'lockmanager-fail-releaselock' => 'Tsy afaka mamela ilay fanidiana ho an\'i "$1"',
+'lockmanager-fail-db-bucket' => "Tsy ampy ny isan'ireo banky angona fanidiana voaantso anatin'ny baketra (godet) $1.",
+'lockmanager-fail-db-release' => "Tsy afaka mamela ny fanidiana eo amin'ny banky angona $1.",
+'lockmanager-fail-svr-acquire' => "Tsy afaka maka ny fanidiana eo amin'ny lohamilina $1.",
+'lockmanager-fail-svr-release' => "Tsy afaka mamela ny fanidiana eo amin'ny banky angona $1.",
+
 # ZipDirectoryReader
 'zip-file-open-error' => "Nitrangana hadisoana teo am-panokafana ilay rakitra ZIP ho an'ny fanamarinana.",
 'zip-wrong-format' => "Tsy ZIP ny karazan-drakitr'ilay rakitra voatonona.",
@@ -1697,6 +1763,7 @@ Ny petra-drakitra misy rakitra ihany no azo aleha.",
 'img-auth-public' => "Ny asa ataon'i img_auth.php dia maneho ny rakitry ny wiki an'olona.
 ity wiki ity dia no-regler-na ho sarababem-bahoaka.",
 'img-auth-noread' => "Tsy manana ny alalam-pamakiana ilay mpikambana eo amin'ny « $1 ».",
+'img-auth-bad-query-string' => 'Manana tohintsora-kataka tsy manara-penitra ilay URL.',
 
 # HTTP errors
 'http-invalid-url' => 'URL diso : $1',
@@ -1728,6 +1795,7 @@ Tsindrio eo amin'ny lohan-tsanganana raha hanova ny laharam-pisehoana.",
 'listfiles_search_for' => 'Hitady anarana media :',
 'imgfile' => 'rakitra',
 'listfiles' => "Lisitran'ny rakitra",
+'listfiles_thumb' => 'Sary nakelezina',
 'listfiles_date' => 'Daty',
 'listfiles_name' => 'Anarana',
 'listfiles_user' => 'Mpikambana',
@@ -1756,6 +1824,7 @@ Tsindrio eo amin'ny lohan-tsanganana raha hanova ny laharam-pisehoana.",
 'linkstoimage' => "Ireto avy no {{PLURAL:$1|pejy mirohy|pejy mirohy}} ($1) amin'io rakitra io:",
 'nolinkstoimage' => "Tsy misy pejy mirohy amin'ity sary ity.",
 'morelinkstoimage' => "Hijery [[Special:WhatLinksHere/$1|rohy fanampiny]] makany amin'io rakitra io.",
+'linkstoimage-redirect' => '$1 (fihodinana) $2',
 'sharedupload' => "Mety ho rakitra itambarana amin'ny tetikasa hafa ny rakitra $1.",
 'sharedupload-desc-here' => "Avy amin'i $1 io rakitra io ary mety ampiasain'ny tetikasa hafa.
 Aseho eo ambany ny [$2 famisavisana ilay rakitra].",
@@ -1793,12 +1862,13 @@ Aseho eo ambany ny [$2 famisavisana ilay rakitra].",
 ** Rakitra efa misy',
 'filedelete-edit-reasonlist' => 'Hanova ny antom-pamafàna',
 'filedelete-maintenance' => 'Ny famafana sy ny famerenan-drakitra dia tsy alefa mandritra ny fikojakojana.',
+'filedelete-maintenance-title' => 'Tsy afaka mamafa ilay rakitra',
 
 # MIME search
 'mimesearch' => 'Fikarohana MIME',
 'mimesearch-summary' => "Ity pejy ity dia afahanao manalisitra ny rakitra azo jerena amin'ny alàlan' ity wiki ity arakaraka ny karazana votoatiny MIME ananany
 
-Fampidirana : ''karazambotoatiny''/''zanakarazana'', ohatra par exemple <tt>sary/jpeg</tt>",
+Fampidirana : ''karazambotoatiny''/''zanakarazana'', ohatra par exemple <code>sary/jpeg</code>",
 'mimetype' => 'Karazana MIME :',
 'download' => 'Hampidina',
 
@@ -1868,6 +1938,8 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'nmembers' => '{{PLURAL:$1|mpikambana|mpikambana}} $1',
 'nrevisions' => '{{PLURAL:$1|fanovana|fanovana}} $1',
 'nviews' => '{{PLURAL:}}Tsidika $1',
+'nimagelinks' => "Ampiasain'ny pejy miisa{{PLURAL:}} $1",
+'ntransclusions' => "Ampiasaina eo amin'ny pejy miisa $1 {{PLURAL:}}",
 'specialpage-empty' => 'Tsy misy valiny ho aseho.',
 'lonelypages' => 'Pejy manirery',
 'lonelypagestext' => "Ireo pejy ireo dia tsy voarohy sy tsy ampiasain'ny pejin' ity wiki ity.",
@@ -1890,6 +1962,7 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'mostimages' => "Misy firohizana betsaka amin'ny sary",
 'mostrevisions' => 'Lahatsoratra niova im-betsaka indrindra',
 'prefixindex' => "Pejy manomboka amin'ny...",
+'prefixindex-namespace' => 'Ny pejy rehetra mitondra ny tovona (anaran-tsehatra $1)',
 'shortpages' => 'Pejy fohy',
 'longpages' => 'Pejy lavabe',
 'deadendpages' => 'Pejy tsy mirohy',
@@ -1932,8 +2005,8 @@ wiki ity aza izy.</p>",
 'booksources-invalid-isbn' => 'Ny ISBN nomena dia mety diso ; marino raha diso ianao teo am-pandikanana ny loharano fotony.',
 
 # Special:Log
-'specialloguserlabel' => 'Mpikambana:',
-'speciallogtitlelabel' => 'Lohateny:',
+'specialloguserlabel' => 'Mpikambana nanao :',
+'speciallogtitlelabel' => 'Tanjona (lohateny na mpikambana) :',
 'log' => 'Tatitr’asa',
 'all-logs-page' => 'Ny tatitr’asa',
 'alllogstext' => "Seho nakambana ho an'ny laogy rehetra azo jerena eto amin'ny {{SITENAME}}.
@@ -1973,12 +2046,13 @@ Vangio koa ny [[Special:WantedCategories|sokajy ilaina]].",
 'sp-deletedcontributions-contribs' => "fandraisan'anjara",
 
 # Special:LinkSearch
-'linksearch' => 'Rohy ivelany',
+'linksearch' => 'Fikarohana rohy ivelany',
 'linksearch-pat' => 'Volana tadiavina :',
 'linksearch-ns' => 'Anaran-tsehatra :',
 'linksearch-ok' => 'Fikarohana',
-'linksearch-text' => 'Ny soratra « joker » dia azo soratana ohatra <code>*.wikipedia.org</code>. br />
-Prôtôkôly zaka : <tt>$1</tt>.',
+'linksearch-text' => "Azo ampiasaina ny soratra joker toa i « *.wikipedia.org ».
+Mila top-level domain ambonimbony kokoa izy ireo, sahala « *.org » <br />
+Protokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
 'linksearch-line' => "$1 dia voarohy amin'ny $2",
 'linksearch-error' => "Ny soratra joker dia ampiasaina anatin'ny fanombohan'ny anaran-tsehatry ny milina hôte ihany.",
 
@@ -2024,7 +2098,7 @@ 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.",
 'usermailererror' => "Misy tsy mety amin'ny lohatenin'ny imailaka:",
-'defemailsubject' => "imailaka avy amin'ny sehatra {{SITENAME}}",
+'defemailsubject' => '{{SITENAME}} Mailaky ny mpikambana "$1"',
 'usermaildisabled' => 'Tsy azo mifandefa imailaka ny mpikambana',
 'usermaildisabledtext' => "Tsy mahazo mandefa imailaka any amin'ny mpikamban'ity wiki ity ianao",
 'noemailtitle' => 'Tsy misy adiresy imailaka',
@@ -2082,7 +2156,7 @@ Aoriana, raha irinao ny hanaisotra azy ao amin'ny pejy arahanao maso, dia tsindr
 'watchmethod-list' => 'fanamarinana ny pejy arahana ahitana fanovana farany',
 'watchlistcontains' => "Ao amin'ny pejy arahanao dia ahitana pejy $1{{PLURAL:}}.",
 'iteminvalidname' => "Olana amin'ny zavatra « $1 » : tsy ara-dalàna ny anarana...",
-'wlnote' => "Eo ambany eo ny {{PLURAL:}}fanovana farany $1 natao tanatin'ny $2 ora farany teo.",
+'wlnote' => "Eo ambany dia ahitana ny  {{PLURAL:$1|fanovana farany indrindra|ny fanovana ''$1'' farany}} natao tanatin'ny adin'ny {{PLURAL:$2|iray|'''$2'''}}, nanomboka ny $3, $4.",
 'wlshowlast' => 'Haneho ny $1 ora farany, ny $2 andro farany na $3',
 'watchlist-options' => 'Safidy ny lisitry ny pejy arahana',
 
@@ -2191,6 +2265,7 @@ Ho ann'y fanazavana fanampiny, jereo [[Special:ProtectedPages|ny lisitry ny pejy
 'protect-title-notallowed' => "Hijery ny lentam-piarovana ho an'i « [[$1]] »",
 'prot_1movedto2' => '[[$1]] voaova anarana ho [[$2]]',
 'protect-badnamespace-title' => 'Anaran-tsehatra tsy azo arovana',
+'protect-badnamespace-text' => "Tsy afaka arovana ny pejy ao amin'io anaran-tsehatra io.",
 'protect-legend' => 'Fanekena ny fiarovana pejy',
 'protectcomment' => 'Antony :',
 'protectexpiry' => 'Daty fitsaharana :',
@@ -2211,6 +2286,7 @@ Ity ny réglage ny pejy '''$1''' :",
 'protect-level-sysop' => 'Sysops ihany',
 'protect-summary-cascade' => 'Fiarovana an-driana',
 'protect-expiring' => "Miala amin'ny $1",
+'protect-expiring-local' => 'mitsahatra ny $1',
 'protect-expiry-indefinite' => 'tsiefa',
 'protect-cascade' => "Miaro ny pejy ao anatin'ity pejy ity (cascading protection)",
 'protect-cantedit' => "Tsy afaka manolo ny sokaji-piarovan'ity pejy ity ianao satria tsy manana ny sata ilaina",
@@ -2276,6 +2352,7 @@ efa nisy mpikambana iray hafa angamba no namerina ilay pejy.',
 
 Vakio ny [[Special:Log/delete|laogim-pamafana]] ho an'ny lisitry ny famafana sy ny famerenana pejy.",
 'undelete-header' => 'Jereo ny [[Special:Log/delete|laogim-pamafana]] rehefa hanalisitra ny pejy vao voafafa.',
+'undelete-search-title' => 'Hitady pejy voafafa',
 'undelete-search-box' => 'Hitady pejy voafafa',
 'undelete-search-prefix' => "Asehoy ny pejy manomboka amin'ny :",
 'undelete-search-submit' => 'Fikarohana',
@@ -2283,6 +2360,9 @@ Vakio ny [[Special:Log/delete|laogim-pamafana]] ho an'ny lisitry ny famafana sy
 'undelete-filename-mismatch' => "Tsy afaka averina ny santiônan'ilay rakitra tamin'ny $1 : tsy mifanaraka ny anaran-drakitra.",
 'undelete-bad-store-key' => "Tsy mety averina ny santiônan'ilay rakitra tamin'ny $1 : mbola tsy tao ilay rakitra talohan'ny famafana.",
 'undelete-cleanup-error' => 'Tsy fetezana teo am-pamafana ilay rakitra an-tahiry tsy miasa « $1 ».',
+'undelete-missing-filearchive' => "Tsy afaka atao ny mamerina ilay rakitra tahiry miaraka amin'ny ID $1 satria tsy ao amin'ny banky angona izy io.
+Mety efa naverina angamba izy io.",
+'undelete-error' => 'Pejin-kadisoam-panafoanana',
 'undelete-error-short' => 'Tsi-fetezana teo am-pamerenana ilay rakitra : $1',
 'undelete-error-long' => 'Nisy tsi-fetezana nitranga teo am-pamerenana ilay rakitra :
 
@@ -2293,6 +2373,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Anaran-tsehatra :',
 'invert' => 'Ampifamadiho ny safidy',
+'namespace_association' => 'Anaran-tsehatra nampiarahana',
 'blanknamespace' => '(fotony)',
 
 # Contributions
@@ -2343,6 +2424,7 @@ Aseho eo ambany ny iditra farany ao amin'ny laogim-panakanana  mba hampahalala :
 'whatlinkshere-filters' => 'sivana',
 
 # Block/unblock
+'autoblockid' => 'Fanakanana mandeha ho azy #$1',
 'block' => 'Hanakana ilay mpikambana',
 'unblock' => "Hanala ny sakan'ilay mpikambana",
 'blockip' => 'Sakano ny mpikambana',
@@ -2387,6 +2469,7 @@ Ampiasao ity fisy eto ambany ity hanalana ny sakana
 mihatra amin'ny adiresy IP na solonanarana iray.",
 'ipusubmit' => 'Esory ny sakana',
 'unblocked' => "voaala ny sakan'i [[User:$1|$1]]",
+'unblocked-range' => "Afaka ny sakan'i $1.",
 'unblocked-id' => "Niala ny sakan'i $1",
 'blocklist' => 'Mpikambana voasakana',
 'ipblocklist' => 'Lisitry ny adiresy IP sy mpikambana voasakana',
@@ -2416,6 +2499,7 @@ mihatra amin'ny adiresy IP na solonanarana iray.",
 'unblocklink' => 'esory ny sakana',
 'change-blocklink' => 'ovay ny fanakanana',
 'contribslink' => "fandraisan'anjara",
+'emaillink' => 'Handefa imailaka',
 'autoblocker' => "Voasakana satria ny adiresy IP-nao dia vao avy nampiasain'i \"[[User:\$1|\$1]]\". Ny anton'ny fanakanana dia: \"'''\$2'''\"",
 'blocklogpage' => "Tantaran'ny sakana",
 'blocklog-showlog' => 'Efa voasakana ity mpikambana ity taloha.
@@ -2442,8 +2526,11 @@ ny lisitry ny fisakanana sy fandrarana na tanteraka misy ankehitriny.",
 'ipb_already_blocked' => 'Efa voasakana « $1 »',
 'ipb-needreblock' => 'Efa voasakana i $1. Tianao ovaina ve ny parametatra ?',
 'ipb-otherblocks-header' => '{{PLURAL:$1}}sakana hafa',
+'unblock-hideuser' => "Tsy azonao atao ny manala ny sakan'ity mpikambana ity, satria nafenina ny anaram-pikambany.",
 'ipb_cant_unblock' => 'Tsy fetezana : Marik ny fanakanana $1 tsy hita.
 Mety efa natao angamba ny fanalana sakana.',
+'ipb_blocked_as_range' => "Hadisoana : tsy nosakanana manokana ny adiresy IP $1 ka noho izany tsy afaka alàna ny sakany.
+Ao amin'ny laharana $2 izay afaka alàna sakana anefa izy io.",
 'ip_range_invalid' => 'Tsy mety io IP io.',
 'ip_range_toolarge' => 'Ny fanidiana laharana IP ngeza nohonny /$1 dia tsy azo atao.',
 'blockme' => 'Sakano ahy',
@@ -2534,6 +2621,7 @@ mifanaraka amin'ilay anarana vaovao. Azafady mba atambaro izay pejin-dresaka iza
 'movepage-page-exists' => 'Efa misy ny pejy $1 ary tsy afaka soloina ho azy.',
 'movepage-page-moved' => 'Voaova anarana lasa $2 ilay pejy $1.',
 'movepage-page-unmoved' => 'Tsy afaka novaina anarana $2 ilay pejy $1.',
+'movepage-max-pages' => 'Efa tratra ny isam-pejy farafahabetsany izay azo ovaina anarana (pejy $1){{PLURAL:}}, ka tsy ho voaova anarana ho azy intsony ny pejy hafa.',
 'movelogpage' => 'Ny laogim-panisahana',
 'movelogpagetext' => 'Lisitry ny pejy nafindra toerana.',
 'movesubpage' => 'Zana-pejy{{PLURAL:$1||}} $1',
@@ -2546,7 +2634,7 @@ mifanaraka amin'ilay anarana vaovao. Azafady mba atambaro izay pejin-dresaka iza
 
 Efa misy ny lahatsoratra hoe "[[:$1]]". Irinao ve ny hamafana azy mba hahafahana mamindra toerana ity lahatsoratra ity?',
 'delete_and_move_confirm' => 'Eny, fafao io pejy io',
-'delete_and_move_reason' => 'Fafao mba hamindrana toerana ny anankiray',
+'delete_and_move_reason' => "Pejy voafafa hahafahana manolo ny anaran'i ''[[$1]]''",
 'selfmove' => 'Mitovy ny anarana taloha sy anarana vaovao; tsy afaka afindra ny pejy.',
 'immobile-source-namespace' => "Tsy afaka ovaina anarana ny pejy ao amin'ny anaran-tsehatra « $1 »",
 'immobile-target-namespace' => "Tsy afaka ovainao ny pejy makany amin'ny anaran-sehatra « $1 »",
@@ -2554,6 +2642,7 @@ Efa misy ny lahatsoratra hoe "[[:$1]]". Irinao ve ny hamafana azy mba hahafahana
 'immobile-source-page' => 'Tsy azo ovaina anarana ity pejy ity.',
 'immobile-target-page' => "Tsy afaka ovaina anarana makany amin'io lohateny io ilay pejy.",
 'imagenocrossnamespace' => 'Tsy mety ovaina anarana makany amina anaran-tsehatra hafa afatsy rakitra ihany ny rakitra.',
+'nonfile-cannot-move-to-file' => "Tsy afaka manova anaran'ny pejy tsy rakitra any amin'ny anaran-tsehatry ny rakitra.",
 'imagetypemismatch' => "Tsy mifanaraka amin'ny karazany ny fanitaran'ity rakitra ity.",
 'imageinvalidfilename' => 'Diso ny anaran-drakitra tanjona',
 'fix-double-redirects' => "Hanao update ny fihodinana makany amin'ny lohateny fotony",
@@ -2574,6 +2663,7 @@ ary safidio na ny votoatiny ankehitriny ihany no ilainao na miaraka amin'ny endr
 miampy fampahalalana momba ny fanovana farany fotsiny ve sa miaraka amin'ny tantaran'ny fanovana rehetra.
 
 Etsy amin'ny toerana farany dia afaka mampiasa rohy ihany koa ianao, ohatra [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] ho an'ny [[{{MediaWiki:Mainpage}}]].",
+'exportall' => 'Hamoaka ny pejy rehetra',
 'exportcuronly' => "Ny votoatiny ankehitriny ihany no haondrana fa tsy miaraka amin'ny tantarany iray manontolo",
 'exportnohistory' => "
 ----
@@ -2592,7 +2682,8 @@ Etsy amin'ny toerana farany dia afaka mampiasa rohy ihany koa ianao, ohatra [[{{
 'allmessagesname' => 'Anarana',
 'allmessagesdefault' => 'Dikan-teny tany am-boalohany',
 'allmessagescurrent' => 'Dikan-teny miasa ankehitriny',
-'allmessagestext' => "Ity no lisitry ny system messages misy eto amin'ity MediaWiki: namespace ity.",
+'allmessagestext' => "Ity dia lisitry ny hafatra hita ao amin'ny anaran-tsehatra MediaWiki.
+Andana vangio ny [//www.mediawiki.org/wiki/Localisation Fandikana an'i Mediawiki] ary [//translatewiki.net/ translatewiki.net] raha tia handray anjara amin'ny fandikana an'i Mediawiki amin'ny ankapobeny.",
 'allmessagesnotsupportedDB' => "Tsy mbola mandeha ny '''{{ns:special}}:Allmessages''' satria tsy mandeha koa ny '''\$wgUseDatabaseMessages'''.",
 'allmessages-filter-legend' => 'Tantavanina',
 'allmessages-filter' => 'Hanasivana araka ny satam-panovana :',
@@ -2723,6 +2814,7 @@ Ampesao ny topi-maso aloha no mihatiry.",
 'tooltip-diff' => "Asehoy izay novainao tamin'ny lahatsoratra.",
 'tooltip-compareselectedversions' => "Jereo ny fahasamihafana amin'ireo votoatin'ny pejy anankiroa ireo.",
 'tooltip-watch' => "Ampidiro amin'ny lisitry ny pejy arahinao maso ity pejy ity",
+'tooltip-watchlistedit-normal-submit' => 'Hanala ny lohateny',
 'tooltip-recreate' => 'Hamorona ilay pejy fanindroany raha efa voafafa izy',
 'tooltip-upload' => 'Hanomboka ny fampidirana',
 'tooltip-rollback' => "Manala ny fanovan'ny mpikambana farany nanova azy ilay asa « foano » (Rollback) .",
@@ -2757,16 +2849,11 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a
 
 # Info page
 'pageinfo-title' => 'Fampahalalana ho an\'i "$1"',
-'pageinfo-header-edits' => 'Fanovana',
-'pageinfo-header-watchlist' => 'Pejy arahana',
-'pageinfo-header-views' => 'Jery',
-'pageinfo-subjectpage' => 'Pejy',
-'pageinfo-talkpage' => 'Pejin-dresaka',
-'pageinfo-watchers' => "Isan'ny mpikambana manaraka an'ity pejy ity",
-'pageinfo-edits' => "Isan'ny fanovana",
-'pageinfo-authors' => "Isan'ny mpanoratra tokana",
+'pageinfo-header-edits' => "Tantaran'ny fanovana",
 'pageinfo-views' => "Isan'ny jery",
-'pageinfo-viewsperedit' => 'Tsidika isaky ny fanovana',
+'pageinfo-watchers' => "Isan'ny mpandray anjara manaraka",
+'pageinfo-edits' => "Isa manontolon'ny fanovana",
+'pageinfo-authors' => "Isa manontolon'ny mpandray anjara",
 
 # Patrolling
 'markaspatrolleddiff' => 'Marihana ho voamarina',
@@ -2807,6 +2894,7 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
 'widthheightpage' => '$1 × $2, pejy $3{{PLURAL:}}',
 'file-info' => 'Haben-drakitra : $1, karazana MIME : $2',
 'file-info-size' => "$1 × $2 teboka, haben'ilay rakitra : $3, endrika MIME : $4",
+'file-info-size-pages' => '$1 × $2 teboka, haben-drakitra : $3, karazana MIME $4, pejy $5 {{PLURAL:}}',
 'file-nohires' => "Tsy misy sary ngeza non'io",
 'svg-long-desc' => 'rakitra SVG, habe $1 × $2 teboka, habe : $3',
 'show-big-image' => "Hijery ny tena haben'ny sary",
@@ -2880,6 +2968,7 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 'exif-copyright' => 'Mpanana ilay copyright',
 'exif-exifversion' => 'Santiôna EXIF',
 'exif-flashpixversion' => 'Santiôna FlashPix',
+'exif-colorspace' => 'Valan-doko',
 'exif-pixelydimension' => 'Haavon-tsary ekena',
 'exif-pixelxdimension' => 'Halalan-tsary ekena',
 'exif-usercomment' => 'Diniky ny mpikambana',
@@ -2887,8 +2976,10 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 'exif-datetimeoriginal' => 'Daty fangalana niaviana',
 'exif-datetimedigitized' => 'Daty nanaovana numerisation',
 'exif-subsectime' => 'Daty nanovana',
+'exif-exposuretime' => 'Fitaona famakiana',
 'exif-exposuretime-format' => '$1 s ($2 s)',
 'exif-fnumber' => 'Isa F',
+'exif-exposureprogram' => 'Fomba famakiana',
 'exif-isospeedratings' => 'ISO',
 'exif-aperturevalue' => 'Sanasana',
 'exif-lightsource' => 'Loharanon-kazavana',
index 42ca8c7..2e6cc29 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Eastern Mari (Ð\9eлÑ\8bк Ð\9cарий)
+/** Eastern Mari (олÑ\8bк Ð¼арий)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -72,14 +72,14 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'img_right'               => array( '1', 'пурла', 'справа', 'right' ),
-       'img_left'                => array( '1', 'шола', 'слева', 'left' ),
-       'img_border'              => array( '1', 'чек', 'граница', 'border' ),
-       'img_sub'                 => array( '1', 'йымалне', 'под', 'sub' ),
-       'img_super'               => array( '1', 'ӱмбалне', 'над', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'кӱшычын', 'сверху', 'top' ),
-       'img_middle'              => array( '1', 'покшелне', 'посередине', 'middle' ),
-       'img_bottom'              => array( '1', 'ӱлычын', 'снизу', 'bottom' ),
+       'img_right'                 => array( '1', 'пурла', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'шола', 'слева', 'left' ),
+       'img_border'                => array( '1', 'чек', 'граница', 'border' ),
+       'img_sub'                   => array( '1', 'йымалне', 'под', 'sub' ),
+       'img_super'                 => array( '1', 'ӱмбалне', 'над', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'кӱшычын', 'сверху', 'top' ),
+       'img_middle'                => array( '1', 'покшелне', 'посередине', 'middle' ),
+       'img_bottom'                => array( '1', 'ӱлычын', 'снизу', 'bottom' ),
 );
 
 $messages = array(
@@ -258,6 +258,7 @@ $messages = array(
 'jumpto' => 'Куснаш:',
 'jumptonavigation' => 'навигацийыш',
 'jumptosearch' => 'кычалмашшке',
+'pool-errorunknown' => 'Палыдыме йоҥылыш',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}} нерген',
@@ -328,6 +329,7 @@ $messages = array(
 'filecopyerror' => '«$1» гыч «$2» файлыш копийым ышташ лийдыме.',
 'fileexistserror' => '«$1» файлыш возыкым ышташ лийдыме: файл уло.',
 'unexpected' => 'Келшыдыме кугыт: «$1»=«$2».',
+'cannotdelete-title' => '"$1" лаштыкым шӧраш ок лий',
 'badtitle' => 'Сай огыл лӱм',
 'badtitletext' => 'Йодмо лаштыкын лӱмжӧ йоҥылыш, але яра, але йылме кокла але интер-вики лӱмжӧ йоҥылыш. Ала лӱмыштӧ кӱлдымӧ тамга улыт.',
 'viewsource' => 'Тӱҥалтыш текст',
index 7093581..b664588 100644 (file)
@@ -139,6 +139,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIMEПребарување' ),
        'Mostcategories'            => array( 'НајмногуКатегории' ),
        'Mostimages'                => array( 'НајмногуСлики', 'НајмногуПодатотеки', 'ПодатотекиСоНајмногуВрски' ),
+       'Mostinterwikis'            => array( 'НајмногуМеѓувикија' ),
        'Mostlinked'                => array( 'СоНајмногуВрски', 'СтранициСоНајмногуВрски' ),
        'Mostlinkedcategories'      => array( 'НајупотребуваниКатегории' ),
        'Mostlinkedtemplates'       => array( 'НајупотребуваниШаблони' ),
@@ -195,132 +196,148 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#пренасочување', '#види', '#Пренасочување', '#ПРЕНАСОЧУВАЊЕ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__БЕЗСОДРЖИНА__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__БЕЗГАЛЕРИЈА__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__СОСОДРЖИНА__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__СОДРЖИНА__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__БЕЗ_УРЕДУВАЊЕ_НА_ПОДНАСЛОВИ__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__БЕЗНАСЛОВ__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'ТЕКОВЕНМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ТЕКОВЕНМЕСЕЦ1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'ТЕКОВЕНМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'ТЕКОВЕНМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ТЕКОВЕНМЕСЕЦСКР', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ТЕКОВЕНДЕН', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ТЕКОВЕНДЕН2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ТЕКОВЕНДЕНИМЕ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ТЕКОВНАГОДИНА', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ТЕКОВНОВРЕМЕ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ТЕКОВЕНЧАС', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'МЕСЕЦ_ЛОКАЛНО', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'МЕСЕЦ_ЛОКАЛНО1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'МЕСЕЦИМЕ_ЛОКАЛНО', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'МЕСЕЦИМЕ_ЛОКАЛНО_ГЕНИТИВ', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'МЕСЕЦИМЕ_ЛОКАЛНО_КРАТЕНКА', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ДЕН_ЛОКАЛНО', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ДЕН2_ЛОКАЛНО', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'ИМЕНАДЕН_ЛОКАЛНО', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ГОДИНА_ЛОКАЛНО', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ВРЕМЕ_ЛОКАЛНО', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ЧАС_ЛОКАЛНО', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'БРОЈНАСТРАНИЦИ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'БРОЈСТАТИИ', 'БРОЈНАСТАТИИ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'БРОЈНАПОДАТОТЕКИ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'БРОЈНАКОРИСНИЦИ', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'БРОЈНААКТИВНИКОРИСНИЦИ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'БРОЈНАУРЕДУВАЊА', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'БРОЈНАПРЕГЛЕДУВАЊА', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'СТРАНИЦА', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'СТРАНИЦАИ', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ИМЕПРОСТОР', 'ИМЕНСКИПРОСТОР', 'NAMESPACE' ),
-       'talkspace'               => array( '1', 'РАЗГОВОРПРОСТОР', 'TALKSPACE' ),
-       'fullpagename'            => array( '1', 'ЦЕЛОСНОИМЕНАСТРАНИЦА', 'FULLPAGENAME' ),
-       'subpagename'             => array( '1', 'ИМЕНАПОТСТРАНИЦА', 'SUBPAGENAME' ),
-       'basepagename'            => array( '1', 'ИМЕНАОСНОВНАСТРАНИЦА', 'BASEPAGENAME' ),
-       'talkpagename'            => array( '1', 'СТРАНИЦАЗАРАЗГОВОР', 'TALKPAGENAME' ),
-       'subjectpagename'         => array( '1', 'ИМЕНАСТАТИЈА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subst'                   => array( '0', 'ЗАМЕНИ:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'БЕЗБЗАМЕНИ', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'ИЗВЕШТNW:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'мини', 'мини-слика', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'мини-слика=$1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'десно', 'д', 'right' ),
-       'img_left'                => array( '1', 'лево', 'л', 'left' ),
-       'img_none'                => array( '1', 'н', 'нема', 'none' ),
-       'img_width'               => array( '1', '$1пкс', '$1п', '$1px' ),
-       'img_center'              => array( '1', 'центар', 'ц', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'рамка', 'ворамка', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'безрамка', 'frameless' ),
-       'img_page'                => array( '1', 'страница=$1', 'страница $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'исправено', 'исправено=$1', 'исправено $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'граничник', 'граница', 'border' ),
-       'img_baseline'            => array( '1', 'основналинија', 'baseline' ),
-       'img_sub'                 => array( '1', 'долениндекс', 'дол', 'sub' ),
-       'img_super'               => array( '1', 'горениндекс', 'гор', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'врв', 'најгоре', 'top' ),
-       'img_text_top'            => array( '1', 'текст-врв', 'текст-најгоре', 'text-top' ),
-       'img_middle'              => array( '1', 'средина', 'middle' ),
-       'img_bottom'              => array( '1', 'дно', 'најдолу', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'текст-дно', 'текст-најдолу', 'text-bottom' ),
-       'img_link'                => array( '1', 'врска=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'алт=$1', 'alt=$1' ),
-       'sitename'                => array( '1', 'ИМЕНАМРЕЖНОМЕСТО', 'SITENAME' ),
-       'localurl'                => array( '0', 'ЛОКАЛНААДРЕСА:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ЛОКАЛНААДРЕСАИ:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'ОПСЛУЖУВАЧ', 'SERVER' ),
-       'servername'              => array( '0', 'ИМЕНАОПСЛУЖУВАЧ', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ПАТЕКАНАСКРИПТА', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'ГРАМАТИКА:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ПОЛ:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'ТЕКОВНАСЕДМИЦА', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ТЕКОВЕНДЕНВОСЕДМИЦАТА', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'СЕДМИЦА_ЛОКАЛНО', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ЛОКАЛЕНДЕНВОСЕДМИЦАТА', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'НАЗНАКАНАРЕВИЗИЈА', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ДЕННАРЕВИЗИЈА', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ДЕННАРЕВИЗИЈА2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'МЕСЕЦНАРЕВИЗИЈА', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'МЕСЕЦНАРЕВИЗИЈА1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'ГОДИНАНАРЕВИЗИЈА', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'ВРЕМЕНАРЕВИЗИЈА', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'КОРИСНИКНАНАРЕВИЗИЈА', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'МНОЖИНА:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'ПОЛНАURL:', 'FULLURL:' ),
-       'raw'                     => array( '0', 'СИРОВО:', 'РЕД:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ПРИКАЖИНАСЛОВ', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'П', 'R' ),
-       'currentversion'          => array( '1', 'ТЕКОВНАВЕРЗИЈА', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ШИФРИРАЈURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ШИФРИРАЈКОТВА', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'ОЗНАЧЕНОТЕКОВНОВРЕМЕ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'ОЗНАЧЕНОЛОКАЛНОВРЕМЕ', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'ОЗНАКАЗАНАСОКА', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#ЈАЗИК:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'ЈАЗИКНАСОДРЖИНАТА', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'СТРАНИЦИВОИМЕНСКИПРОСТОР', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'БРОЈНААДМИНИСТРАТОРИ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ФОРМАТБРОЈ', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ПОСТАВИЛЕВО', 'PADLEFT' ),
-       'padright'                => array( '0', 'ПОСТАВИДЕСНО', 'PADRIGHT' ),
-       'special'                 => array( '0', 'специјална', 'специјални', 'special' ),
-       'defaultsort'             => array( '1', 'ОСНОВНОПОДРЕДУВАЊЕ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ПОДАТОТЕЧНАПАТЕКА:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'ознака', 'tag' ),
-       'hiddencat'               => array( '1', '__СКРИЕНАКАТ__', '__СКРИЕНАКАТЕГОРИЈА__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'СТРАНИЦИВОКАТЕГОРИЈА', 'СТРАНИЦИВОКАТ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'ГОЛЕМИНА_НА_СТРАНИЦА', 'PAGESIZE' ),
-       'index'                   => array( '1', '__ИНДЕКС__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__БЕЗИНДЕКС__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'БРОЈВОГРУПА', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__СТАТИЧНОПРЕНАСОЧУВАЊЕ__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'НИВОНАЗАШТИТА', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'форматнадатум', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'ПАТЕКА', 'PATH' ),
-       'url_wiki'                => array( '0', 'ВИКИ', 'WIKI' ),
-       'url_query'               => array( '0', 'БАРАЊЕ', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', 'безгрешки', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', 'беззамена', 'noreplace' ),
+       'redirect'                  => array( '0', '#пренасочување', '#види', '#Пренасочување', '#ПРЕНАСОЧУВАЊЕ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__БЕЗСОДРЖИНА__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__БЕЗГАЛЕРИЈА__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__СОСОДРЖИНА__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__СОДРЖИНА__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__БЕЗ_УРЕДУВАЊЕ_НА_ПОДНАСЛОВИ__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__БЕЗНАСЛОВ__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ТЕКОВЕНМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ТЕКОВЕНМЕСЕЦ1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'ТЕКОВЕНМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ТЕКОВЕНМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ТЕКОВЕНМЕСЕЦСКР', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ТЕКОВЕНДЕН', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ТЕКОВЕНДЕН2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ТЕКОВЕНДЕНИМЕ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ТЕКОВНАГОДИНА', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ТЕКОВНОВРЕМЕ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ТЕКОВЕНЧАС', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'МЕСЕЦ_ЛОКАЛНО', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'МЕСЕЦ_ЛОКАЛНО1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'МЕСЕЦИМЕ_ЛОКАЛНО', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'МЕСЕЦИМЕ_ЛОКАЛНО_ГЕНИТИВ', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'МЕСЕЦИМЕ_ЛОКАЛНО_КРАТЕНКА', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ДЕН_ЛОКАЛНО', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ДЕН2_ЛОКАЛНО', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'ИМЕНАДЕН_ЛОКАЛНО', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ГОДИНА_ЛОКАЛНО', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ВРЕМЕ_ЛОКАЛНО', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ЧАС_ЛОКАЛНО', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'БРОЈНАСТРАНИЦИ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'БРОЈСТАТИИ', 'БРОЈНАСТАТИИ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'БРОЈНАПОДАТОТЕКИ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'БРОЈНАКОРИСНИЦИ', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'БРОЈНААКТИВНИКОРИСНИЦИ', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'БРОЈНАУРЕДУВАЊА', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'БРОЈНАПРЕГЛЕДУВАЊА', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'СТРАНИЦА', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'СТРАНИЦАИ', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ИМЕПРОСТОР', 'ИМЕНСКИПРОСТОР', 'NAMESPACE' ),
+       'talkspace'                 => array( '1', 'РАЗГОВОРПРОСТОР', 'TALKSPACE' ),
+       'fullpagename'              => array( '1', 'ЦЕЛОСНОИМЕНАСТРАНИЦА', 'FULLPAGENAME' ),
+       'subpagename'               => array( '1', 'ПОТСТРАНИЦА', 'SUBPAGENAME' ),
+       'basepagename'              => array( '1', 'ИМЕНАОСНОВНАСТРАНИЦА', 'BASEPAGENAME' ),
+       'talkpagename'              => array( '1', 'СТРАНИЦАЗАРАЗГОВОР', 'TALKPAGENAME' ),
+       'subjectpagename'           => array( '1', 'ИМЕНАСТАТИЈА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subst'                     => array( '0', 'ЗАМЕНИ:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'БЕЗБЗАМЕНИ', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'ИЗВЕШТNW:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'мини', 'мини-слика', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'мини-слика=$1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'десно', 'д', 'right' ),
+       'img_left'                  => array( '1', 'лево', 'л', 'left' ),
+       'img_none'                  => array( '1', 'н', 'нема', 'none' ),
+       'img_width'                 => array( '1', '$1пкс', '$1п', '$1px' ),
+       'img_center'                => array( '1', 'центар', 'ц', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'рамка', 'ворамка', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'безрамка', 'frameless' ),
+       'img_page'                  => array( '1', 'страница=$1', 'страница_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'исправено', 'исправено=$1', 'исправено_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'граничник', 'граница', 'border' ),
+       'img_baseline'              => array( '1', 'основналинија', 'baseline' ),
+       'img_sub'                   => array( '1', 'долениндекс', 'дол', 'sub' ),
+       'img_super'                 => array( '1', 'горениндекс', 'гор', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'врв', 'најгоре', 'top' ),
+       'img_text_top'              => array( '1', 'текст-врв', 'текст-најгоре', 'text-top' ),
+       'img_middle'                => array( '1', 'средина', 'middle' ),
+       'img_bottom'                => array( '1', 'дно', 'најдолу', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'текст-дно', 'текст-најдолу', 'text-bottom' ),
+       'img_link'                  => array( '1', 'врска=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'алт=$1', 'alt=$1' ),
+       'img_class'                 => array( '1', 'класа=$1', 'class=$1' ),
+       'sitename'                  => array( '1', 'ИМЕНАМРЕЖНОМЕСТО', 'SITENAME' ),
+       'localurl'                  => array( '0', 'ЛОКАЛНААДРЕСА:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ЛОКАЛНААДРЕСАИ:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ПАТЕКАНАСТАТИЈА', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'НАЗНАКАНАСТРАНИЦА', 'PAGEID' ),
+       'server'                    => array( '0', 'ОПСЛУЖУВАЧ', 'SERVER' ),
+       'servername'                => array( '0', 'ИМЕНАОПСЛУЖУВАЧ', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ПАТЕКАНАСКРИПТА', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'СТИЛСКАПАТЕКА', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'ГРАМАТИКА:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ПОЛ:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__БЕЗПРЕТВОРАЊЕНАСЛОВ__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__БЕЗПРЕТВОРАЊЕСОДРЖИНА__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'ТЕКОВНАСЕДМИЦА', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ТЕКОВЕНДЕНВОСЕДМИЦАТА', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'СЕДМИЦА_ЛОКАЛНО', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ЛОКАЛЕНДЕНВОСЕДМИЦАТА', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'НАЗНАКАНАРЕВИЗИЈА', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ДЕННАРЕВИЗИЈА', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ДЕННАРЕВИЗИЈА2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'МЕСЕЦНАРЕВИЗИЈА', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'МЕСЕЦНАРЕВИЗИЈА1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'ГОДИНАНАРЕВИЗИЈА', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'ВРЕМЕНАРЕВИЗИЈА', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'КОРИСНИКНАНАРЕВИЗИЈА', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'МНОЖИНА:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'ПОЛНАURL:', 'FULLURL:' ),
+       'lcfirst'                   => array( '0', 'ПРВОМБ', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ПРВОГБ', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'МБ', 'LC:' ),
+       'uc'                        => array( '0', 'ГБ', 'UC:' ),
+       'raw'                       => array( '0', 'СИРОВО:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ПРИКАЖИНАСЛОВ', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'П', 'R' ),
+       'newsectionlink'            => array( '1', '__ВРСКАНОВПОДНАСЛОВ__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__БЕЗВРСКАНОВПОДНАСЛОВ__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'ТЕКОВНАВЕРЗИЈА', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ШИФРИРАЈURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ШИФРИРАЈКОТВА', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'ОЗНАЧЕНОТЕКОВНОВРЕМЕ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'ОЗНАЧЕНОЛОКАЛНОВРЕМЕ', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'ОЗНАКАЗАНАСОКА', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#ЈАЗИК:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'ЈАЗИКНАСОДРЖИНАТА', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'СТРАНИЦИВОИМЕНСКИПРОСТОР', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'БРОЈНААДМИНИСТРАТОРИ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ФОРМАТБРОЈ', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ПОСТАВИЛЕВО', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ПОСТАВИДЕСНО', 'PADRIGHT' ),
+       'special'                   => array( '0', 'специјална', 'специјални', 'special' ),
+       'defaultsort'               => array( '1', 'ОСНОВНОПОДРЕДУВАЊЕ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ПОДАТОТЕЧНАПАТЕКА:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'ознака', 'tag' ),
+       'hiddencat'                 => array( '1', '__СКРИЕНАКАТ__', '__СКРИЕНАКАТЕГОРИЈА__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'СТРАНИЦИВОКАТЕГОРИЈА', 'СТРАНИЦИВОКАТ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'ГОЛЕМИНА_НА_СТРАНИЦА', 'PAGESIZE' ),
+       'index'                     => array( '1', '__ИНДЕКС__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__БЕЗИНДЕКС__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'БРОЈВОГРУПА', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__СТАТИЧНОПРЕНАСОЧУВАЊЕ__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'НИВОНАЗАШТИТА', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'форматнадатум', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'ПАТЕКА', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ВИКИ', 'WIKI' ),
+       'url_query'                 => array( '0', 'БАРАЊЕ', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'безгрешки', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'беззамена', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', 'сите', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'страници', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'поткатегории', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'податотеки', 'files' ),
 );
 
 $linkTrail = '/^([a-zабвгдѓежзѕијклљмнњопрстќуфхцчџш]+)(.*)$/sDu';
@@ -329,35 +346,35 @@ $separatorTransformTable = array( ',' => '.', '.' => ',' );
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Потцртување на врски:',
-'tog-justify' => 'Ð\94воÑ\81Ñ\82Ñ\80аниÑ\87но Ð¿Ð¾Ñ\80амнÑ\83ваÑ\9aе Ð½Ð° Ð¿Ð°Ñ\80агÑ\80аÑ\84иÑ\82е',
+'tog-justify' => 'Ð\9fоÑ\80амнÑ\83ваÑ\9aе Ð½Ð° Ð¿Ð°Ñ\81Ñ\83Ñ\81иÑ\82е Ð¿Ð¾ Ñ\88иÑ\80инаÑ\82а Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а',
 'tog-hideminor' => 'Скривај ги ситните уредувања во скорешните промени',
 'tog-hidepatrolled' => 'Скриј испатролирани уредувања во скорешните промени',
 'tog-newpageshidepatrolled' => 'Скриј испатролирани страници од списокот на нови страници',
 'tog-extendwatchlist' => 'Прошири го список на набљудувања за приказ на сите промени, не само скорешните',
-'tog-usenewrc' => 'Ð\9aоÑ\80иÑ\81Ñ\82и Ð¿Ð¾Ð´Ð¾Ð±Ñ\80ени скорешни промени (бара JavaScript)',
-'tog-numberheadings' => 'Ð\90вÑ\82о Ð½Ñ\83меÑ\80иÑ\80аÑ\9aе Ð½Ð° заглавијата',
+'tog-usenewrc' => 'Ð\9fÑ\80омени Ð²Ð¾ Ð³Ñ\80Ñ\83пи Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð²Ð¾ Ñ\81пиÑ\81окоÑ\82 Ð½Ð° скорешни промени (бара JavaScript)',
+'tog-numberheadings' => 'Ð\9dÑ\83меÑ\80иÑ\80аÑ\98 Ð³Ð¸ заглавијата',
 'tog-showtoolbar' => 'Прикажи алатник за уредување (JavaScript)',
 'tog-editondblclick' => 'Уредување на страници при двојно кликнување (JavaScript)',
 'tog-editsection' => 'Овозможи уредување на заглавија преку врските [уреди]',
 'tog-editsectiononrightclick' => 'Овозможи уредување на заглавија со десен клик на нивниот наслов (JavaScript)',
 'tog-showtoc' => 'Покажи содржина (за страници со повеќе од 3 заглавија)',
 'tog-rememberpassword' => 'Запомни ме на овој прелистувач (највеќе до $1 {{PLURAL:$1|ден|дена}})',
-'tog-watchcreations' => 'Додавај ги страниците што ги создавам во списокот на набљудувања',
-'tog-watchdefault' => 'Додавај ги страниците што ги уредувам во списокот на набљудувања',
-'tog-watchmoves' => 'Додавај ги страниците што ги преместувам во списокот на набљудувања',
-'tog-watchdeletion' => 'Додавај ги страниците што ги бришам во списокот на набљудувања',
+'tog-watchcreations' => 'Ð\94одаваÑ\98 Ð³Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ñ\88Ñ\82о Ð³Ð¸ Ñ\81оздавам Ð¸ Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екиÑ\82е Ñ\88Ñ\82о Ð³Ð¸ Ð¿Ð¾Ð´Ð¸Ð³Ð°Ð¼ Ð²Ð¾ Ñ\81пиÑ\81окоÑ\82 Ð½Ð° Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваÑ\9aа',
+'tog-watchdefault' => 'Додавај ги страниците и податотеките што ги уредувам во списокот на набљудувања',
+'tog-watchmoves' => 'Додавај ги страниците и податотеките што ги преместувам во списокот на набљудувања',
+'tog-watchdeletion' => 'Додавај ги страниците и податотеките што ги бришам во списокот на набљудувања',
 'tog-minordefault' => 'Обележувај ги сите уредувања како ситни по основно',
 'tog-previewontop' => 'Прикажи го прегледот пред кутијата за уредување',
 'tog-previewonfirst' => 'Прикажи преглед на првото уредување',
 'tog-nocache' => 'Оневозможи кеширање на страниците во прелистувачот',
-'tog-enotifwatchlistpages' => 'Испраќај ми е-пошта при промена на страница од мојот список на набљудувања',
+'tog-enotifwatchlistpages' => 'Ð\98Ñ\81пÑ\80аÑ\9cаÑ\98 Ð¼Ð¸ Ðµ-поÑ\88Ñ\82а Ð¿Ñ\80и Ð¿Ñ\80омена Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð»Ð¸ Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ð¾Ð´ Ð¼Ð¾Ñ\98оÑ\82 Ñ\81пиÑ\81ок Ð½Ð° Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваÑ\9aа',
 'tog-enotifusertalkpages' => 'Испраќај ми е-пошта при промена на мојата страница за разговор',
-'tog-enotifminoredits' => 'Испраќај ми е-пошта и за ситни промени во страниците',
+'tog-enotifminoredits' => 'Испраќај ми е-пошта и за ситни промени во страниците и податотеките',
 'tog-enotifrevealaddr' => 'Откриј ја мојата е-поштенска адреса во пораките за известување',
 'tog-shownumberswatching' => 'Прикажи го бројот на корисници кои набљудуваат',
 'tog-oldsig' => 'Постоечки потпис:',
 'tog-fancysig' => 'Сметај го потписот за викитекст (без автоматска врска)',
-'tog-externaleditor' => 'По основно користи надворешен уредник (само за стручњаци, потребно е посебно нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
+'tog-externaleditor' => 'По основно користи надворешен уредувач (само за стручњаци, потребно е посебно нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
 'tog-externaldiff' => 'По основно користи надворешен програм за споредување верзии (само за стручњаци, потребно е специјално нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
 'tog-showjumplinks' => 'Овозможи врски на пристапност „скокни на“',
 'tog-uselivepreview' => 'Користи преглед во живо (JavaScript, експериментално)',
@@ -368,7 +385,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Скриј ги уредувањата на најавените корисници во списокот на набљудувања',
 'tog-watchlisthideanons' => 'Скриј ги уредувањата од анонимни корисници во списокот на набљудувања',
 'tog-watchlisthidepatrolled' => 'Скриј испатролирани уредувања од мојот список на набљудувања',
-'tog-nolangconversion' => 'Оневозможи претворање на јазични варијанти',
 'tog-ccmeonemails' => 'Испраќај ми копии од е-пораките што ги праќам до други корисници',
 'tog-diffonly' => 'Не ја покажувај содржината на страницата под разликите',
 'tog-showhiddencats' => 'Прикажи скриени категории',
@@ -597,6 +613,10 @@ $1',
 'youhavenewmessages' => 'Имате $1 ($2).',
 'newmessageslink' => 'нови пораки',
 'newmessagesdifflink' => 'скорешна промена',
+'youhavenewmessagesfromusers' => 'Имате $1 од {{PLURAL:$3|еден корисник|$3 корисници}} ($2).',
+'youhavenewmessagesmanyusers' => 'Имате $1 од многу корисници ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|нова порака|нови пораки}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|последна промена|последни промени}}',
 'youhavenewmessagesmulti' => 'Имате нови пораки на $1',
 'editsection' => 'уреди',
 'editsection-brackets' => '[$1]',
@@ -654,9 +674,9 @@ $1',
 'dberrortext' => 'Синтаксна грешка во барањето до базата.
 Ова може да значи грешка во програмската опрема.
 Последното барање до базата беше:
-<blockquote><tt>$1</tt></blockquote>
-од функцијата „<tt>$2</tt>“.
\92Ñ\80аÑ\82ена Ðµ Ð³Ñ\80еÑ\88каÑ\82а â\80\9e<tt>$3: $4</tt>“.',
+<blockquote><code>$1</code></blockquote>
+од функцијата „<code>$2</code>“.
\91азаÑ\82а Ñ\98а Ð´Ð°Ð´Ðµ Ð³Ñ\80еÑ\88каÑ\82а â\80\9e<samp>$3: $4</samp>“.',
 'dberrortextcl' => 'Грешка во барањето до базата.
 Последното барање до базата беше:
 „$1“
@@ -691,6 +711,8 @@ $1',
 'cannotdelete' => 'Страницата или податотеката „$1“ не можеше да се избрише.
 Можеби некој друг веќе ја избришал.',
 'cannotdelete-title' => 'Не можам да ја избришам страницата „$1“',
+'delete-hook-aborted' => 'Бришењето е прекинато со кука.
+Не е дадено никакво образложение.',
 'badtitle' => 'Лош наслов',
 'badtitletext' => 'Бараниот наслов е грешен, празен или неисправно поврзан меѓујазичен или меѓувики наслов. 
 Може да содржи недопуштени знаци.',
@@ -727,6 +749,8 @@ $2',
 Администраторот што ја заклучи го понуди следново образложение: „''$3''“.",
 'invalidtitle-knownnamespace' => 'Неважечки наслов со именски простор „$2“ и текст „$3“',
 'invalidtitle-unknownnamespace' => 'Неважечки наслов со именски простор бр. $1 и текст „$2“',
+'exception-nologin' => 'Не сте најавени',
+'exception-nologin-text' => 'Оваа страница или постапка бара да сте најавени на викито.',
 
 # Virus scanner
 'virus-badscanner' => "Лоша поставка: непознат проверувач на вируси: ''$1''",
@@ -747,6 +771,7 @@ $2',
 'remembermypassword' => 'Запомни ме на овој сметач (највеќе $1 {{PLURAL:$1|ден|дена}})',
 'securelogin-stick-https' => 'Останете поврзани со HTTPS по одјавата',
 'yourdomainname' => 'Вашиот домен:',
+'password-change-forbidden' => 'Не можете да ја менувате лозинката на ова вики.',
 'externaldberror' => 'Настана грешка при надворешното најавување на базата или пак немате дозвола да ја подновите вашата надворешна сметка.',
 'login' => 'Најава',
 'nav-login-createaccount' => 'Најава / регистрација',
@@ -997,23 +1022,27 @@ $2
 Затоа мораме да ја користиме неговата бројчена IP-адреса за да го препознаеме.
 Една ваква IP-адреса може да ја делат повеќе корисници.
 Ако сте анонимен корисник и сметате дека кон вас се упатени нерелевантни коментари, тогаш [[Special:UserLogin/signup|создајте корисничка сметка]] или [[Special:UserLogin|најавете се]] за да избегнете поистоветување со други анонимни корисници во иднина.''",
-'noarticletext' => 'Моментално нема текст на оваа страница.
-Можете да направите [[Special:Search/{{PAGENAME}}|пребарување за овој наслов на страница]] во други страници,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарување во дневниците],
-или [{{fullurl:{{FULLPAGENAME}}|action=edit}} да ја уредите оваа страница]</span>.',
-'noarticletext-nopermission' => 'Нема текст на оваа страница.
-Можете да го [[Special:Search/{{PAGENAME}}|пребарате овој наслов]] во други страници,
-или да ги <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате соодветните дневници]</span>.',
+'noarticletext' => 'Таква страница сè уште не постои.
+Можете да проверите [[Special:Search/{{PAGENAME}}|дали насловот се споменува]] во други статии,
+да ги <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате дневниците],
+или да [{{fullurl:{{FULLPAGENAME}}|action=edit}} ја создадете]</span>.',
+'noarticletext-nopermission' => 'Таква страница сè уште не постои.
+Можете да проверите [[Special:Search/{{PAGENAME}}|дали насловот се споменува]] во други статии,
+или да ги <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате дневниците]</span>.',
+'missing-revision' => 'Не ја пронајдов ревизијата бр. $1 на страницата со наслов „{{PAGENAME}}“.
+
+Ова обично се должи на застарена врска за разлики што води кон избришана страница.
+Повеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].',
 'userpage-userdoesnotexist' => 'Корисничката сметка „<nowiki>$1</nowiki>“ не е регистрирана.
 Ве молиме размислете дали навистина сакате да ја создадете/уредите оваа страница.',
 'userpage-userdoesnotexist-view' => 'Корисничката сметка „$1“ не е регистрирана.',
 'blocked-notice-logextract' => 'Овој корисник е моментално блокиран.
 Подолу е прикажан последниот дневнички запис:',
-'clearyourcache' => "'''Напомена: По зачувувањето морате да го исчистите кешот на прелистувачот за да можете ги видите промените.'''
+'clearyourcache' => "С'''Напомена: По зачувувањето морате да го исчистите кешот на прелистувачот за да можете ги видите промените.'''
 * '''Firefox / Safari:''' Држете ''Shift'' и стиснете на ''Reload'' или притиснете ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac);
 * '''Google Chrome:''' Притиснете ''Ctrl-Shift-R'' (''⌘-R'' на Mac)
 * '''Internet Explorer:''' Држете ''Ctrl'' додека притискате на ''Refresh'' или притиснете ''Ctrl-F5''.
-* '''Konqueror:''' Сликнете на „Превчитај“ или притиснете ''F5'';
+* '''Konqueror:''' Стиснете на „Превчитај“ или на ''F5'';
 * '''Opera:''' Исчистете го кешот во ''Tools → Preferences'';",
 'usercssyoucanpreview' => "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да го испробате вашиот нов CSS пред да зачувате.",
 'userjsyoucanpreview' => "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да ја испробате вашата нова JavaScript  пред да зачувате.",
@@ -1028,7 +1057,7 @@ $2
 'updated' => '(Подновено)',
 'note' => "'''Напомена:'''",
 'previewnote' => "'''Имајте предвид дека ова е само преглед.'''
\92аÑ\88иÑ\82е Ð¿Ñ\80омени сè уште не се зачувани!",
\9fÑ\80омениÑ\82е сè уште не се зачувани!",
 'continue-editing' => 'Продолжете со уредување',
 'previewconflict' => 'Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.',
 'session_fail_preview' => "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на сесиски податоци.'''
@@ -1070,8 +1099,8 @@ $2
 '''НЕ ПРАЌАЈТЕ ТЕКСТОВИ ЗАШТИТЕНИ СО АВТОРСКИ ПРАВА БЕЗ ДОЗВОЛА!'''",
 'longpageerror' => "'''Грешка: Текстот што го внесовте е голем {{PLURAL:$1|еден килобајт|$1 килобајти}}, што ја надминува границата од {{PLURAL:$2|еден килобајт|$2 килобајти}}.'''
 Затоа нема да може да се зачува.",
-'readonlywarning' => "'''Ð\9fРÐ\95Ð\94УÐ\9fРÐ\95Ð\94УÐ\92Ð\90Ð\8aÐ\95: Ð\91азаÑ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ðµ Ð·Ð°ÐºÐ»Ñ\83Ñ\87ена Ð·Ð°Ñ\80ади Ð¾Ð´Ñ\80жÑ\83ваÑ\9aе, Ð¿Ð° Ð½ÐµÐ¼Ð° Ð´Ð° Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð³Ð¸ Ð·Ð°Ñ\87Ñ\83ваÑ\82е Ð²Ð°Ñ\88иÑ\82е Ð¿Ñ\80омени сега.
\9fÑ\80обаÑ\98Ñ\82е Ð´Ð° Ð³Ð¾ Ð·Ð°Ñ\87Ñ\83ваÑ\82е Ñ\82екÑ\81Ñ\82оÑ\82 Ð»Ð¾ÐºÐ°Ð»Ð½Ð¾ (cut & paste) Ð²Ð¾ Ð½ÐµÐºÐ¾Ñ\98а Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ð¸ Ð´Ð° Ð³Ð¾ Ð¿Ñ\80аÑ\82иÑ\82е Ð¿Ð¾Ð´Ð¾Ñ\86на.'''
+'readonlywarning' => "'''Ð\9fРÐ\95Ð\94УÐ\9fРÐ\95Ð\94УÐ\92Ð\90Ð\8aÐ\95: Ð\91азаÑ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и Ðµ Ð·Ð°ÐºÐ»Ñ\83Ñ\87ена Ð·Ð°Ñ\80ади Ð¾Ð´Ñ\80жÑ\83ваÑ\9aе, Ð¿Ð° Ð½ÐµÐ¼Ð° Ð´Ð° Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð³Ð¸ Ð·Ð°Ñ\87Ñ\83ваÑ\82е Ð¿Ñ\80омениÑ\82е сега.
\9fÑ\80обаÑ\98Ñ\82е Ð´Ð° Ð³Ð¾ Ð·Ð°Ñ\87Ñ\83ваÑ\82е Ñ\82екÑ\81Ñ\82оÑ\82 Ð·Ð° Ð¿Ð¾Ð´Ð¾Ñ\86на, Ð»Ð¾ÐºÐ°Ð»Ð½Ð¾ (Ñ\81о Ð¿Ñ\80екопиÑ\80аÑ\9aе) Ð²Ð¾ Ð½ÐµÐºÐ¾Ñ\98а Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека.'''
 
 Администраторот кој ја заклучил базата на податоци го дал следново објаснување: $1",
 'protectedpagewarning' => "'''Предупредување:  Оваа страница е заклучена, така што само корисници со администраторски привилегии можат да ја уредуваат.'''
@@ -1134,6 +1163,7 @@ $2
 'expansion-depth-exceeded-warning' => 'Страницата ја надмина длабочината на проширувањето',
 'parser-unstrip-loop-warning' => 'Утврдена е јамка',
 'parser-unstrip-recursion-limit' => 'Пречекорена е границата на рекурзија ($1)',
+'converter-manual-rule-error' => 'Пронајдов грешка во правилото за рачно претворање на јазик',
 
 # "Undo" feature
 'undo-success' => 'Уредувањето може да се откаже.
@@ -1317,6 +1347,10 @@ $1",
 'editundo' => 'откажи',
 'diff-multi' => '({{PLURAL:$1|Не е прикажана една меѓувремена ревизија|Не се прикажани $1 меѓувремени ревизии}} од {{PLURAL:$2|еден корисник|$2 корисници}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Не е прикажана една меѓувремена ревизија направена|Не се прикажани $1 меѓувремени ревизии направени}} од повеќе од $2 {{PLURAL:$2|корисник|корисници}})',
+'difference-missing-revision' => 'Не пронајдов {{PLURAL:$2|една ревизија|$2 ревизии}} од оваа разлика ($1).
+
+Ова обично се должи на застарена врска за разлики што води кон избришана страница.
+Повеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].',
 
 # Search results
 'searchresults' => 'Резултати од пребарувањето',
@@ -1371,7 +1405,7 @@ $1",
 'showingresultsheader' => "{{PLURAL:$5|Резултат '''$1''' од '''$3'''|Резултати '''$1 - $2''' од '''$3'''}} за '''$4'''",
 'nonefound' => "'''Напомена''': Само некои именски простори се пребаруваат по основно.
 Обидете се со додавање на префиксот ''all:'' за да пребарувате низ сите содржини (вклучувајќи страници за разговор, шаблони, итн) или користете го бараниот именски простор како префикс.",
-'search-nonefound' => 'Нема резултати кои го задоволуваат бараното.',
+'search-nonefound' => 'Нема резултати што одговараат на бараното.',
 'powersearch' => 'Напредно пребарување',
 'powersearch-legend' => 'Напредно пребарување',
 'powersearch-ns' => 'Пребарај во следниве именски простори:',
@@ -1588,6 +1622,7 @@ $1",
 'right-writeapi' => 'Можност за пишување на API',
 'right-delete' => 'Бришење страници',
 'right-bigdelete' => 'Бришење страници со долга историја',
+'right-deletelogentry' => 'Бришење и враќање на конкретни ставки во дневник',
 'right-deleterevision' => 'Бришење и враќање на конкретни ревизии на страници',
 'right-deletedhistory' => 'Прегледување на записи во историја на бришења, без придружниот текст',
 'right-deletedtext' => 'Прегледување на избришан текст и промени помеѓу избришани ревизии',
@@ -1733,9 +1768,9 @@ $1",
 За преглед или пребарување на претходно подигнати податотеки, погледнете ја [[Special:FileList|списокот на подигнати податотеки]]; повторните подигања се заведени во [[Special:Log/upload|дневникот на подигања]], а бришењата се заведуваат во [[Special:Log/delete|дневникот на бришења]].
 
 За да поставите слика во страница, користете врска во еден од следниве облици:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Податотека.jpg]]</nowiki></tt>''' за верзија на сликата во целосна големина
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Податотека.png|200px|thumb|left|опис]]</nowiki></tt>''' за верзија на сликата со големина од 200 пиксели прикажана во соодветна кутија, со опис како што е наведено во '''опис'''
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Податотека.ogg]]</nowiki></tt>''' за директно поврзување со податотеката без нејзино прикажување",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Податотека.jpg]]</nowiki></code>''' за верзија на сликата во целосна големина
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Податотека.png|200px|thumb|left|опис]]</nowiki></code>''' за верзија на сликата со големина од 200 пиксели прикажана во соодветна кутија, со опис како што е наведено во '''опис'''
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Податотека.ogg]]</nowiki></code>''' за директно поврзување со податотеката без нејзино прикажување",
 'upload-permitted' => 'Дозволени типови на податотеки: $1.',
 'upload-preferred' => 'Преферирани типови на податотеки: $1.',
 'upload-prohibited' => 'Забранети типови на податотеки: $1.',
@@ -1777,25 +1812,25 @@ $1",
 'tmp-create-error' => 'Не можев да создадам привремена податотека.',
 'tmp-write-error' => 'Грешка при запис на привремената податотека.',
 'large-file' => 'Се препорачува податотеките да не бидат поголеми од $1; оваа податотека е $2.',
-'largefileserver' => 'Ð\93олеминаÑ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а Ðµ Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ð¾Ð´ Ð¼Ð°ÐºÑ\81имално Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ\82а Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð°.',
+'largefileserver' => 'Ð\93олеминаÑ\82а Ð½Ð° Ð¾Ð²Ð°Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ðµ Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ð¾Ð´ Ð¼Ð°ÐºÑ\81имално Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ\82а Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð° Ð¾Ð´ Ñ\81еÑ\80веÑ\80оÑ\82.',
 'emptyfile' => 'Податотеката што ја подигнавте изгледа дека е празна.
 Ова може да е поради грешка во името на податотеката.
 Ве молиме проверете дали навистина сакате да ја подигнете оваа податотека.',
 'windows-nonascii-filename' => 'Опслужувачот не поддржува податотечни имиња со специјални знаци.',
-'fileexists' => "Податотека со ова име веќе постои, проверете '''<tt>[[:$1]]</tt>''' ако не сте сигурни дали сакате да го промените.
-[[$1|thumb]]",
-'filepageexists' => "Страницата за опис на оваа податотека е веќе создадена на '''<tt>[[:$1]]</tt>''', но не постои податотека со тоа име.
+'fileexists' => 'Податотека со ова име веќе постои, проверете <strong>[[:$1]]</strong> ако не сте сигурни дали сакате да го промените.
+[[$1|thumb]]',
+'filepageexists' => 'Страницата за опис на оваа податотека е веќе создадена на <strong>[[:$1]]</strong>, но не постои податотека со тоа име.
 Описот кој го внесовте нема да стои на страницата за опис.
 Доколку сакате описот да стои тука, ќе морате да го уредите рачно.
-[[$1|thumb]]",
-'fileexists-extension' => "Податотека со слично име веќе постои: [[$2|thumb]]
-* Име на податотека која се подигнува: '''<tt>[[:$1]]</tt>'''
-* Име на постоечка податотека: '''<tt>[[:$2]]</tt>'''
-Ве молиме изберете друго име за податотеката.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Податотека со слично име веќе постои: [[$2|thumb]]
+* Име на податотека која се подигнува: <strong>[[:$1]]</strong>
+* Име на постоечка податотека: <strong>[[:$2]]</strong>
+Ве молиме изберете друго име за податотеката.',
 'fileexists-thumbnail-yes' => "Се чини дека податотеката е слика со намалена големина ''(минијатура)''. [[$1|thumb]]
-Проверете ја податотеката '''<tt>[[:$1]]</tt>'''.
+Проверете ја податотеката <strong>[[:$1]]</strong>.
 Ако податотеката која ја проверувате е истата слика во својата изворна големина тогаш не мора да ја подигате дополнително.",
-'file-thumbnail-no' => "Името на податотеката почнува со '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Името на податотеката почнува со <strong>$1</strong>.
 Изгледа дека е слика со намалена големина ''(мини, thumbnail)''.
 Ако ја имате оваа слика во изворна големина, подигнете ја неја. Во спротивно сменете го името на податотеката.",
 'fileexists-forbidden' => 'Податотека со тоа име веќе постои и не може да биде заменета.
@@ -1907,6 +1942,7 @@ $1',
 'lockmanager-fail-releaselock' => 'Не можев да го ослободам катанецот за „$1“.',
 'lockmanager-fail-db-bucket' => 'Не можев да контактирам доволно податотеки-катанци во садот $1',
 'lockmanager-fail-db-release' => 'Не можев да ги ослободам катанците на базата $1',
+'lockmanager-fail-svr-acquire' => 'Не можев да добијам катанци за опслужувачот $1',
 'lockmanager-fail-svr-release' => 'Не можев да ги ослободам катанците на опслужувачот $1',
 
 # ZipDirectoryReader
@@ -1970,7 +2006,7 @@ $1',
 'nolicense' => 'Нема',
 'license-nopreview' => '(Прегледот не е достапен)',
 'upload_source_url' => ' (важечка, јавно достапна URL-адреса)',
-'upload_source_file' => '(податотека на вашиот сметач)',
+'upload_source_file' => '(податотека на вашиот компјутер)',
 
 # Special:ListFiles
 'listfiles-summary' => 'Оваа специјална страница ги прикажува сите подигнати податотеки.
@@ -2028,6 +2064,7 @@ $1',
 'shared-repo' => 'заедничко складиште',
 'shared-repo-name-wikimediacommons' => 'Заедничката Ризница',
 'filepage.css' => '/* Тука поставените каскадни стилски страници (CSS) се вклучени во страницата за опис на податотеката, како и на клиентските викија */',
+'upload-disallowed-here' => 'Нажалост, не можете да ја замените сликава со нова.',
 
 # File reversion
 'filerevert' => 'Врати $1',
@@ -2062,7 +2099,7 @@ $1',
 # MIME search
 'mimesearch' => 'Пребарување по MIME',
 'mimesearch-summary' => 'Оваа страница овозможува филтрирање на податотеки врз основа на нивниот MIME-тип.
-Формат на внос: тип на содржина/поттип, на пр. <tt>image/jpeg</tt>.',
+Формат на внос: тип на содржина/поттип, на пр. <code>image/jpeg</code>.',
 'mimetype' => 'MIME-тип:',
 'download' => 'преземи',
 
@@ -2109,9 +2146,9 @@ $1',
 
 'disambiguations' => 'Страници што водат до страници за појаснување',
 'disambiguationspage' => 'Template:Појаснување',
-'disambiguations-text' => "СледниÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸Ð¼Ð°Ð°Ñ\82 Ð²Ñ\80Ñ\81ки ÐºÐ¾Ð¸ Ð²Ð¾Ð´Ð°Ñ\82 до '''страница за појаснување'''.
-Наместо тоа тие треба да водат до соодветната тема.<br />
¡Ñ\82Ñ\80аниÑ\86а Ñ\81е Ñ\82Ñ\80еÑ\82иÑ\80а ÐºÐ°ÐºÐ¾ Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð° Ð¿Ð¾Ñ\98аÑ\81нÑ\83ваÑ\9aе Ð°ÐºÐ¾ Ñ\82аа Ð³Ð¾ ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ñ\88аблоноÑ\82 ÐºÐ¾Ñ\98 Ðµ Ð½Ð°Ð²ÐµÐ´ÐµÐ½ [[MediaWiki:Disambiguationspage|Ñ\82Ñ\83ка]]",
+'disambiguations-text' => "СледниÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸Ð¼Ð°Ð°Ñ\82 Ð±Ð°Ñ\80ем Ð¿Ð¾ ÐµÐ´Ð½Ð° Ð²Ñ\80Ñ\81ка Ñ\88Ñ\82о Ð²Ð¾Ð´Ð¸ до '''страница за појаснување'''.
+Наместо тоа, може да имаат врска до посоодветната тема.<br />
\95дна Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81е Ñ\81меÑ\82а Ð·Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð° Ð¿Ð¾Ñ\98аÑ\81нÑ\83ваÑ\9aе Ð°ÐºÐ¾ Ð³Ð¾ ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ñ\88аблоноÑ\82 Ñ\88Ñ\82о Ð²Ð¾Ð´Ð¸ Ð¾Ð´ [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Двојни пренасочувања',
 'doubleredirectstext' => 'Оваа страница ги прикажува пренасочувачките страници до други пренасочувачки страници.
@@ -2137,6 +2174,7 @@ $1',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|бајт|бајти}}',
 'ncategories' => '$1 {{PLURAL:$1|категорија|категории}}',
+'ninterwikis' => '$1 {{PLURAL:$1|меѓувики|меѓувикија}}',
 'nlinks' => '$1 {{PLURAL:$1|врска|врски}}',
 'nmembers' => '$1 {{PLURAL:$1|член|члена}}',
 'nrevisions' => '$1 {{PLURAL:$1|измена|измени}}',
@@ -2165,6 +2203,7 @@ $1',
 'mostlinkedtemplates' => 'Најмногу врски кон шаблони',
 'mostcategories' => 'Страници со најмногу категории',
 'mostimages' => 'Најмногу врски до податотеки',
+'mostinterwikis' => 'Страници со најмногу меѓувики',
 'mostrevisions' => 'Статии со најмногу верзии',
 'prefixindex' => 'Страници со префикс',
 'prefixindex-namespace' => 'Сите страници со префикс (именски простор $1)',
@@ -2266,7 +2305,7 @@ $1',
 'linksearch-ok' => 'Барај',
 'linksearch-text' => 'Може да се користат џокери, како на „*.wikipedia.org“.
 Бара највисок домен, како на пр. „*.org“.<br />
-Поддржани протоколи: <tt>$1</tt> (не ги ставајте во пребарувањето).',
+Поддржани протоколи: <code>$1</code> (не ги ставајте во пребарувањето).',
 'linksearch-line' => '$1 врска во $2',
 'linksearch-error' => 'Џокер-знаците може да се користат само на почетокот во името на домаќинот.',
 
@@ -2312,6 +2351,8 @@ $1',
 'mailnologin' => 'Нема адреса за праќање',
 'mailnologintext' => 'Мора да сте [[Special:UserLogin|најавени]] и да имате важечка е-поштенска адреса во вашите [[Special:Preferences|нагодувања]] за да може да праќате е-пошта до други корисници.',
 'emailuser' => 'Пиши е-пошта на корисникот',
+'emailuser-title-target' => 'Составување на е-пошта за {{GENDER:$1|корисникот}}',
+'emailuser-title-notarget' => 'Е-пошта за корисникот',
 'emailpage' => 'Е-пошта',
 'emailpagetext' => 'Можете да го користите следниов образец за праќање на е-поштенска порака до овој корисник.
 Е-поштенската адреса која ја имате наведено во [[Special:Preferences|вашите нагодувања]] ќе се прикаже во „Од“ полето на е-пораката, со што примачот ќе може да ви одговори директно вам.',
@@ -2457,6 +2498,8 @@ $UNWATCHURL
 'rollback' => 'Отповикај промени',
 'rollback_short' => 'Отповикај',
 'rollbacklink' => 'отповикај',
+'rollbacklinkcount' => 'отповикај $1 {{PLURAL:$1|уредување|уредувања}}',
+'rollbacklinkcount-morethan' => 'отповикај повеќе од $1 {{PLURAL:$1|уредување|уредувања}}',
 'rollbackfailed' => 'Отповикувањето не успеа',
 'cantrollback' => 'Уредувањето не може да се отповика.
 Последниот уредник е воедно и единствениот автор на страницата.',
@@ -2636,7 +2679,7 @@ $1',
 'whatlinkshere' => 'Што води овде',
 'whatlinkshere-title' => 'Страници со врски што водат до „$1“',
 'whatlinkshere-page' => 'Страница:',
-'linkshere' => "СледниÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸Ð¼Ð°Ð°Ñ\82 Ð²Ñ\80Ñ\81ка Ð´Ð¾ '''[[:$1]]''':",
+'linkshere' => "СледниÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86и Ð²Ð¾Ð´Ð°Ñ\82 ÐºÐ¾Ð½ â\80\9e'''[[:$1]]'''â\80\9c:",
 'nolinkshere' => "Нема страници што водат кон '''[[:$1]]'''.",
 'nolinkshere-ns' => "Нема страници што водат кон '''[[:$1]]''' во избраниот именски простор.",
 'isredirect' => 'пренасочувачка страница',
@@ -2962,7 +3005,8 @@ $1',
 'import-interwiki-templates' => 'Вклучи ги сите шаблони',
 'import-interwiki-submit' => 'Увези',
 'import-interwiki-namespace' => 'Целен именски простор:',
-'import-upload-filename' => 'Име на податотеката:',
+'import-interwiki-rootpage' => 'Целна основна страница (незадолжително):',
+'import-upload-filename' => 'Податотека:',
 'import-comment' => 'Коментар:',
 'importtext' => 'Извезете ја податотеката од изворното вики користејќи ја [[Special:Export|алатката за извоз]].
 Зачувајте ја на вашиот сметач и подигнете ја овде.',
@@ -2997,6 +3041,9 @@ $1',
 'import-error-interwiki' => 'Страницата „$1“ не е увезена бидејќи името е резервирано за надворешни врски (меѓувики).',
 'import-error-special' => 'Страницата „$1“ не е увезена бидејќи припаѓа на посебен именски простор што не дозволува страници.',
 'import-error-invalid' => 'Страницата „$1“ не е увезена бидејќи името ѝ е неважечко.',
+'import-options-wrong' => '{{PLURAL:$2|Погрешна можност|Погрешни можности}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Укажаната основна страница е неважечки наслов.',
+'import-rootpage-nosubpage' => 'Именскиот простор „$1“ на основната страница не допушта потстраници.',
 
 # Import log
 'importlogpage' => 'Дневник на увезувања',
@@ -3072,8 +3119,8 @@ $1',
 'tooltip-ca-nstab-help' => 'Преглед на страницата за помош',
 'tooltip-ca-nstab-category' => 'Преглед на категоријата',
 'tooltip-minoredit' => 'Обележи ја промената како ситна',
-'tooltip-save' => 'Ð\97аÑ\87Ñ\83ваÑ\98Ñ\82е Ð³Ð¸ Ð²Ð°Ñ\88иÑ\82е Ð¿Ñ\80омени',
-'tooltip-preview' => 'Прегледајте ги вашите промени, ве молиме користете го ова пред зачувување!',
+'tooltip-save' => 'Ð\97аÑ\87Ñ\83ваÑ\98Ñ\82е Ð³Ð¸ Ð¿Ñ\80омениÑ\82е',
+'tooltip-preview' => 'Преглед на промените - ве молиме користете го ова пред зачувување!',
 'tooltip-diff' => 'Покажи кои промени ги направи во текстот.',
 'tooltip-compareselectedversions' => 'Видете ја разликата помеѓу двете избрани верзии на оваа страница.',
 'tooltip-watch' => 'Додај ја страницава во списокот на набљудувања',
@@ -3148,16 +3195,35 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Информации за „$1“',
-'pageinfo-header-edits' => 'Уредувања',
-'pageinfo-header-watchlist' => 'Список на набљудувања',
-'pageinfo-header-views' => 'Посети',
-'pageinfo-subjectpage' => 'Страница',
-'pageinfo-talkpage' => 'Страница за разговор',
+'pageinfo-header-basic' => 'Основни информации',
+'pageinfo-header-edits' => 'Историја на уредувања',
+'pageinfo-header-restrictions' => 'Заштита на страницата',
+'pageinfo-header-properties' => 'Својства на страницата',
+'pageinfo-display-title' => 'Наслов за приказ',
+'pageinfo-default-sort' => 'Основен подредбен клуч',
+'pageinfo-length' => 'Должина на страницата (во бајти)',
+'pageinfo-article-id' => 'Назнака на страницата',
+'pageinfo-robot-policy' => 'Статус на прелистувачот',
+'pageinfo-robot-index' => 'Се индексира',
+'pageinfo-robot-noindex' => 'Не се индексира',
+'pageinfo-views' => 'Број на посети',
 'pageinfo-watchers' => 'Број на набљудувачи',
+'pageinfo-redirects-name' => 'Пренасочувања кон страницата',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Потстраници на страницата',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|пренасочување|пренасочувања}}; $3 {{PLURAL:$3|непренасочување|непренасочувања}})',
+'pageinfo-firstuser' => 'Создавач на страницата',
+'pageinfo-firsttime' => 'Датум на создавање на страницата',
+'pageinfo-lastuser' => 'Последен уредник',
+'pageinfo-lasttime' => 'Датум на последното уредување',
 'pageinfo-edits' => 'Број на уредувања',
 'pageinfo-authors' => 'Број на засебни автори',
-'pageinfo-views' => 'Број на посети',
-'pageinfo-viewsperedit' => 'Посети по уредување',
+'pageinfo-recent-edits' => 'Број на скорешни уредувања (во последните $1)',
+'pageinfo-recent-authors' => 'Број на скорешни засебни автори',
+'pageinfo-restriction' => 'Заштита на страницата (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Волшебен збор|Волшебни зборови}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Скриена категорија|Скриени категории}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Превметнат шаблон|Превметнати шаблони}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Класично',
@@ -3204,7 +3270,7 @@ $1',
 # Media information
 'mediawarning' => "'''Предупредување''': Оваа податотека може да содржи штетен код.
 Ако ја користите, ова може да му наштети на вашиот систем.",
-'imagemaxsize' => "Ограничување на големина на слика:<br />''(на нивните описни страници)''",
+'imagemaxsize' => "Ограничување на големината на сликите:<br />''(на нивните описни страници)''",
 'thumbsize' => 'Големина на минијатурата:',
 'widthheight' => '$1 × $2',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|страница|страници}}',
@@ -3213,6 +3279,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 пиксели, големина: $3, MIME-тип: $4, $5 {{PLURAL:$5|страница|страници}}',
 'file-nohires' => 'Не е достапна поголема резолуција.',
 'svg-long-desc' => 'SVG податотека, номинално $1 × $2 пиксели, големина: $3',
+'svg-long-desc-animated' => 'Анимирана SVG-податотека, номинално: $1 × $2 пиксели, големина: $3',
 'show-big-image' => 'Вистинска големина',
 'show-big-image-preview' => 'Големина на овој преглед: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Друга резолуција|Други резолуции}}: $1.',
@@ -3222,6 +3289,8 @@ $1',
 'file-info-png-looped' => 'кружно',
 'file-info-png-repeat' => 'пуштено {{PLURAL:$1|еднаш|$1 пати}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|кадар|кадри}}',
+'file-no-thumb-animation' => "'''Напомена: Поради технички ограничувања, минијатурите на оваа податотека нема да се анимираат.'''",
+'file-no-thumb-animation-gif' => "'''Напомена: Поради технички ограничувања, минијатурите на GIF-слики со висока резолуција како оваа нема да се анимираат.'''",
 
 # Special:NewFiles
 'newimages' => 'Галерија на нови податотеки',
@@ -3396,7 +3465,7 @@ Variants for Chinese language
 'exif-whitebalance' => 'Рамнотежа на бело',
 'exif-digitalzoomratio' => 'Сооднос на дигиталното приближување (зум)',
 'exif-focallengthin35mmfilm' => 'Еквивалентно фокусно растојание за 35 мм филм',
-'exif-scenecapturetype' => 'Тип на сликање сцена',
+'exif-scenecapturetype' => 'Тип на сликаната сцена',
 'exif-gaincontrol' => 'Контрола на сцената',
 'exif-contrast' => 'Контраст',
 'exif-saturation' => 'Заситеност',
@@ -4017,8 +4086,8 @@ $5
 'version-entrypoints' => 'URL-а на влезните точки',
 'version-entrypoints-header-entrypoint' => 'Влезна точка',
 'version-entrypoints-header-url' => 'URL',
-'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=mk Ð\9fаÑ\82ека Ð½Ð° Ñ\81Ñ\82аÑ\82иÑ\98аÑ\82а]',
-'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=mk Ð\9fаÑ\82ека Ð½Ð° Ñ\81кÑ\80ипÑ\82ата]',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=mk Ð¡Ñ\82аÑ\82иÑ\98а]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=mk Ð¡ÐºÑ\80ипта]',
 
 # Special:FilePath
 'filepath' => 'Патека до податотека',
@@ -4031,7 +4100,7 @@ $5
 'fileduplicatesearch' => 'Барање на дуплирани податотеки',
 'fileduplicatesearch-summary' => 'Пребарување на дуплирани податотеки по тарабни вредности.',
 'fileduplicatesearch-legend' => 'Барање на дупликат',
-'fileduplicatesearch-filename' => 'Ð\98ме Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а:',
+'fileduplicatesearch-filename' => 'Ð\9fодаÑ\82оÑ\82ека:',
 'fileduplicatesearch-submit' => 'Барај',
 'fileduplicatesearch-info' => '$1 × $2 пиксели<br />Големина на податотеката: $3<br />MIME-тип: $4',
 'fileduplicatesearch-result-1' => 'Податотеката „$1“ нема истоветни дупликати.',
@@ -4179,9 +4248,12 @@ $5
 'api-error-empty-file' => 'Поднесената податотека е празна.',
 'api-error-emptypage' => 'Создавањето на нови празни страници не е дозволено.',
 'api-error-fetchfileerror' => 'Внатрешна грешка: нешто тргна наопаку при добивањето на податотеката.',
+'api-error-fileexists-forbidden' => 'Веќе постои податотека наречена „$1“ и не може да се презапише.',
+'api-error-fileexists-shared-forbidden' => 'Веќе постои податотека наречена „$1“ во заедничкото складиште и не може да се презапише.',
 'api-error-file-too-large' => 'Поднесената податотека е преголема.',
 'api-error-filename-tooshort' => 'Името на податотеката е прекратко.',
 'api-error-filetype-banned' => 'Овој тип на податотека е забранет.',
+'api-error-filetype-banned-type' => '$1 не {{PLURAL:$4|е допуштен тип на податотека|се допуштени типови на податотека}}. {{PLURAL:$3|Допуштен е|Допуштени се}} $2.',
 'api-error-filetype-missing' => 'На податотеката ѝ недостасува наставка.',
 'api-error-hookaborted' => 'Измената што се обидовте да ја направите е откажана од кука за наставки.',
 'api-error-http' => 'Внатрешна грешка: не можам да се поврзам со опслужувачот.',
index 65b3a1e..f2f8323 100644 (file)
@@ -16,6 +16,7 @@
  * @author Junaidpv
  * @author Jyothis
  * @author Kaganer
+ * @author Krenair
  * @author Manjith Joseph <manjithkaini@gmail.com>
  * @author Naveen Sankar
  * @author Praveen Prakash <me.praveen@gmail.com>
@@ -181,147 +182,147 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#തിരിച്ചുവിടുക', '#തിരിച്ചുവിടൽ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__ഉള്ളടക്കംവേണ്ട__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__ചിത്രസഞ്ചയംവേണ്ട__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ഉള്ളടക്കംഇടുക__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ഉള്ളടക്കം__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__സംശോധിക്കേണ്ട__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__തലക്കെട്ടുവേണ്ട__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'ഈമാസം', 'ഈമാസം2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ഈമാസം1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'ഈമാസത്തിന്റെപേര്‌', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'ഈമാസത്തിന്റെപേരുസൃഷ്ടിക്കുക', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ഈമാസത്തിന്റെപേര്‌സംഗ്രഹം', 'ഈമാസത്തിന്റെപേര്‌ചുരുക്കം', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ഈദിവസം', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ഈദിവസം2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ഈദിവസത്തിന്റെപേര്‌', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ഈവർഷം', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ഈസമയം', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ഈമണിക്കൂർ', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'പ്രാദേശികമാസം', 'പ്രാദേശികമാസം2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'പ്രാദേശികമാസം1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'പ്രാദേശികമാസത്തിന്റെപേര്‌', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'പ്രാദേശികമാസത്തിന്റെപേരുസൃഷ്ടിക്കുക', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'പ്രാദേശികമാസത്തിന്റെപേര്‌സംഗ്രഹം', 'പ്രാദേശികമാസത്തിന്റെപേര്‌ചുരുക്കം', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'പ്രാദേശികദിവസം', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'പ്രാദേശികദിവസം2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'പ്രാദേശികദിവസത്തിന്റെപേര്‌', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'പ്രാദേശികവർഷം', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'പ്രാദേശികസമയം', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'പ്രാദേശികമണിക്കൂർ', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'താളുകളുടെയെണ്ണം', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ലേഖനങ്ങളുടെയെണ്ണം', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'പ്രമാണങ്ങളുടെയെണ്ണം', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ഉപയോക്താക്കളുടെയെണ്ണം', 'അംഗങ്ങളുടെയെണ്ണം', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'സജീവോപയാക്താക്കളുടെയെണ്ണം', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'തിരുത്തലുകളുടെണ്ണം', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'എടുത്തുനോക്കലുകളുടെണ്ണം', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'താളിന്റെപേര്‌', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'താളിന്റെപേര്‌സമഗ്രം', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'നാമമേഖല', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'നാമമേഖലസമഗ്രം', 'NAMESPACEE' ),
-       'namespacenumber'         => array( '1', 'നാമമേഖലാസംഖ്യ', 'NAMESPACENUMBER' ),
-       'talkspace'               => array( '1', 'സംവാദമേഖല', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'സംവാദമേഖലസമഗ്രം', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'വിഷയമേഖല', 'ലേഖനമേഖല', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'വിഷയമേഖലസമഗ്രം', 'ലേഖനമേഖലസമഗ്രം', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'താളിന്റെമുഴുവൻപേര്‌', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'താളിന്റെമുഴുവൻപേര്സമഗ്രം', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'അനുബന്ധതാളിന്റെപേര്‌', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'അനുബന്ധതാളിന്റെപേര്സമഗ്രം', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'അടിസ്ഥാനതാളിന്റെപേര്‌', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'അടിസ്ഥാനതാളിന്റെപേര്‌സമഗ്രം', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'സംവാദതാളിന്റെപേര്‌', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'സംവാദതാളിന്റെപേര്‌സമഗ്രം', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'ലേഖനതാളിന്റെപേര്‌', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'ലേഖനതാളിന്റെപേര്‌സമഗ്രം', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'സന്ദേശം:', 'MSG:' ),
-       'subst'                   => array( '0', 'ബദൽ:', 'ഉൾപ്പെടുത്തൽ:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'സംരക്ഷിതബദൽ:', 'സംരക്ഷിതയുൾപ്പെടുത്തൽ:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'മൂലരൂപം:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'ലഘുചിത്രം', 'ലഘു', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'ലഘുചിത്രം=$1', 'ലഘു=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'വലത്ത്‌', 'വലത്‌', 'right' ),
-       'img_left'                => array( '1', 'ഇടത്ത്‌', 'ഇടത്‌', 'left' ),
-       'img_none'                => array( '1', 'ശൂന്യം', 'none' ),
-       'img_width'               => array( '1', '$1ബിന്ദു', '$1px' ),
-       'img_center'              => array( '1', 'നടുവിൽ', 'നടുക്ക്‌', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'ചട്ടം', 'ചട്ടത്തിൽ', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'ചട്ടരഹിതം', 'frameless' ),
-       'img_page'                => array( '1', 'താൾ=$1', 'താൾ_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'നേരേകുത്തനെ', 'നേരേകുത്തനെ=$1', 'നേരേകുത്തനെ_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'അതിർവര', 'border' ),
-       'img_baseline'            => array( '1', 'താഴെയുള്ളവര', 'baseline' ),
-       'img_sub'                 => array( '1', 'കീഴെയെഴുത്ത്', 'sub' ),
-       'img_super'               => array( '1', 'മേലേയെഴുത്ത്', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'മേലെ', 'top' ),
-       'img_text_top'            => array( '1', 'എഴുത്ത്-മേലെ', 'text-top' ),
-       'img_middle'              => array( '1', 'മദ്ധ്യം', 'middle' ),
-       'img_bottom'              => array( '1', 'താഴെ', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'എഴുത്ത്-താഴെ', 'text-bottom' ),
-       'img_link'                => array( '1', 'കണ്ണി=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'പകരം=$1', 'alt=$1' ),
-       'sitename'                => array( '1', 'സൈറ്റിന്റെപേര്', 'SITENAME' ),
-       'ns'                      => array( '0', 'നാമേ:', 'NS:' ),
-       'localurl'                => array( '0', 'ലോക്കൽയുആർഎൽ:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ലോക്കൽയുആർഎൽഇ:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'ലേഖനപഥം', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'സെർവർ', 'SERVER' ),
-       'servername'              => array( '0', 'സെർവറിന്റെപേര്', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'സ്ക്രിപ്റ്റ്പഥം', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'സ്റ്റൈൽപഥം', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'വ്യാകരണം:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ലിംഗം:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__തലക്കെട്ട്മാറ്റേണ്ട__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__ഉള്ളടക്കംമാറ്റേണ്ട__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'ആഴ്ച', 'ആഴ്‌ച', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ദിവസത്തിന്റെപേര്‌അക്കത്തിൽ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'പ്രാദേശികആഴ്ച', 'പ്രാദേശികആഴ്‌ച', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ആഴ്ചയുടെപേര്‌അക്കത്തിൽ', 'ആഴ്‌ചയുടെപേര്‌അക്കത്തിൽ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'തിരുത്തൽഅടയാളം', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'തിരുത്തിയദിവസം', 'തിരുത്തിയദിനം', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'തിരുത്തിയദിവസം2', 'തിരുത്തിയദിനം2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'തിരുത്തിയമാസം', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'തിരുത്തിയമാസം1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'തിരുത്തിയവർഷം', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'തിരുത്തിയസമയമുദ്ര', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'അവസാനംതിരുത്തിയയാൾ', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'ബഹുവചനം:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'പൂർണ്ണവിലാസം:', 'FULLURL:' ),
-       'raw'                     => array( '0', 'അസംസ്കൃതം:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ശീർഷകംപ്രദർശിപ്പിക്കുക', 'തലക്കെട്ട്പ്രദർശിപ്പിക്കുക', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'വ', 'R' ),
-       'newsectionlink'          => array( '1', '__പുതിയവിഭാഗംകണ്ണി__', '__പുതിയഖണ്ഡിക്കണ്ണി__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__പുതിയവിഭാഗംകണ്ണിവേണ്ട__', '__പുതിയഖണ്ഡിക്കണ്ണിവേണ്ട__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'ഈപതിപ്പ്', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'സമയമുദ്ര', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'പ്രാദേശികസമയമുദ്ര', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'ദിശാസൂചിക', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#ഭാഷ:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'ഉള്ളടക്കഭാഷ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'നാമമേഖലയിലുള്ളതാളുകൾ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'കാര്യനിർവ്വാഹകരുടെഎണ്ണം', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ദശാംശഘടന', 'സംഖ്യാഘടന', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ഇടത്ത്നിറക്കുക', 'PADLEFT' ),
-       'padright'                => array( '0', 'വലത്ത്നിറക്കുക', 'PADRIGHT' ),
-       'special'                 => array( '0', 'പ്രത്യേകം', 'special' ),
-       'defaultsort'             => array( '1', 'സ്വതവേയുള്ളക്രമപ്പെടുത്തൽ:', 'സ്വതവേയുള്ളക്രമപ്പെടുത്തൽചാവി:', 'സ്വതവേയുള്ളവർഗ്ഗക്രമപ്പെടുത്തൽ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'പ്രമാണപഥം:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'റ്റാഗ്', 'tag' ),
-       'hiddencat'               => array( '1', '‌‌__മറഞ്ഞിരിക്കുംവർഗ്ഗം__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'വർഗ്ഗത്തിലുള്ളതാളുകൾ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'താൾവലിപ്പം', 'PAGESIZE' ),
-       'index'                   => array( '1', '‌‌__സൂചിക__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__സൂചികവേണ്ട__', '__NOINDEX__' ),
-       'staticredirect'          => array( '1', '_സ്ഥിരസ്ഥിതതിരിച്ചുവിടൽ_', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'സംരക്ഷണതലം', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'ദിനരേഖീകരണരീതി', 'ദിവസരേഖീകരണരീതി', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'പഥം', 'PATH' ),
-       'url_wiki'                => array( '0', 'വിക്കി', 'WIKI' ),
-       'url_query'               => array( '0', 'ക്വറി', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', 'പിഴവില്ല', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', 'മാറ്റേണ്ടതില്ല', 'noreplace' ),
+       'redirect'                  => array( '0', '#തിരിച്ചുവിടുക', '#തിരിച്ചുവിടൽ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__ഉള്ളടക്കംവേണ്ട__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__ചിത്രസഞ്ചയംവേണ്ട__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ഉള്ളടക്കംഇടുക__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ഉള്ളടക്കം__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__സംശോധിക്കേണ്ട__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__തലക്കെട്ടുവേണ്ട__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ഈമാസം', 'ഈമാസം2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ഈമാസം1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'ഈമാസത്തിന്റെപേര്‌', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ഈമാസത്തിന്റെപേരുസൃഷ്ടിക്കുക', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ഈമാസത്തിന്റെപേര്‌സംഗ്രഹം', 'ഈമാസത്തിന്റെപേര്‌ചുരുക്കം', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ഈദിവസം', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ഈദിവസം2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ഈദിവസത്തിന്റെപേര്‌', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ഈവർഷം', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ഈസമയം', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ഈമണിക്കൂർ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'പ്രാദേശികമാസം', 'പ്രാദേശികമാസം2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'പ്രാദേശികമാസം1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'പ്രാദേശികമാസത്തിന്റെപേര്‌', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'പ്രാദേശികമാസത്തിന്റെപേരുസൃഷ്ടിക്കുക', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'പ്രാദേശികമാസത്തിന്റെപേര്‌സംഗ്രഹം', 'പ്രാദേശികമാസത്തിന്റെപേര്‌ചുരുക്കം', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'പ്രാദേശികദിവസം', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'പ്രാദേശികദിവസം2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'പ്രാദേശികദിവസത്തിന്റെപേര്‌', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'പ്രാദേശികവർഷം', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'പ്രാദേശികസമയം', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'പ്രാദേശികമണിക്കൂർ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'താളുകളുടെയെണ്ണം', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ലേഖനങ്ങളുടെയെണ്ണം', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'പ്രമാണങ്ങളുടെയെണ്ണം', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ഉപയോക്താക്കളുടെയെണ്ണം', 'അംഗങ്ങളുടെയെണ്ണം', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'സജീവോപയാക്താക്കളുടെയെണ്ണം', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'തിരുത്തലുകളുടെണ്ണം', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'എടുത്തുനോക്കലുകളുടെണ്ണം', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'താളിന്റെപേര്‌', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'താളിന്റെപേര്‌സമഗ്രം', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'നാമമേഖല', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'നാമമേഖലസമഗ്രം', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'നാമമേഖലാസംഖ്യ', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'സംവാദമേഖല', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'സംവാദമേഖലസമഗ്രം', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'വിഷയമേഖല', 'ലേഖനമേഖല', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'വിഷയമേഖലസമഗ്രം', 'ലേഖനമേഖലസമഗ്രം', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'താളിന്റെമുഴുവൻപേര്‌', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'താളിന്റെമുഴുവൻപേര്സമഗ്രം', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'അനുബന്ധതാളിന്റെപേര്‌', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'അനുബന്ധതാളിന്റെപേര്സമഗ്രം', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'അടിസ്ഥാനതാളിന്റെപേര്‌', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'അടിസ്ഥാനതാളിന്റെപേര്‌സമഗ്രം', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'സംവാദതാളിന്റെപേര്‌', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'സംവാദതാളിന്റെപേര്‌സമഗ്രം', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'ലേഖനതാളിന്റെപേര്‌', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'ലേഖനതാളിന്റെപേര്‌സമഗ്രം', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'സന്ദേശം:', 'MSG:' ),
+       'subst'                     => array( '0', 'ബദൽ:', 'ഉൾപ്പെടുത്തൽ:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'സംരക്ഷിതബദൽ:', 'സംരക്ഷിതയുൾപ്പെടുത്തൽ:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'മൂലരൂപം:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'ലഘുചിത്രം', 'ലഘു', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'ലഘുചിത്രം=$1', 'ലഘു=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'വലത്ത്‌', 'വലത്‌', 'right' ),
+       'img_left'                  => array( '1', 'ഇടത്ത്‌', 'ഇടത്‌', 'left' ),
+       'img_none'                  => array( '1', 'ശൂന്യം', 'none' ),
+       'img_width'                 => array( '1', '$1ബിന്ദു', '$1px' ),
+       'img_center'                => array( '1', 'നടുവിൽ', 'നടുക്ക്‌', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'ചട്ടം', 'ചട്ടത്തിൽ', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'ചട്ടരഹിതം', 'frameless' ),
+       'img_page'                  => array( '1', 'താൾ=$1', 'താൾ_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'നേരേകുത്തനെ', 'നേരേകുത്തനെ=$1', 'നേരേകുത്തനെ_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'അതിർവര', 'border' ),
+       'img_baseline'              => array( '1', 'താഴെയുള്ളവര', 'baseline' ),
+       'img_sub'                   => array( '1', 'കീഴെയെഴുത്ത്', 'sub' ),
+       'img_super'                 => array( '1', 'മേലേയെഴുത്ത്', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'മേലെ', 'top' ),
+       'img_text_top'              => array( '1', 'എഴുത്ത്-മേലെ', 'text-top' ),
+       'img_middle'                => array( '1', 'മദ്ധ്യം', 'middle' ),
+       'img_bottom'                => array( '1', 'താഴെ', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'എഴുത്ത്-താഴെ', 'text-bottom' ),
+       'img_link'                  => array( '1', 'കണ്ണി=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'പകരം=$1', 'alt=$1' ),
+       'sitename'                  => array( '1', 'സൈറ്റിന്റെപേര്', 'SITENAME' ),
+       'ns'                        => array( '0', 'നാമേ:', 'NS:' ),
+       'localurl'                  => array( '0', 'ലോക്കൽയുആർഎൽ:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ലോക്കൽയുആർഎൽഇ:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ലേഖനപഥം', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'സെർവർ', 'SERVER' ),
+       'servername'                => array( '0', 'സെർവറിന്റെപേര്', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'സ്ക്രിപ്റ്റ്പഥം', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'സ്റ്റൈൽപഥം', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'വ്യാകരണം:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ലിംഗം:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__തലക്കെട്ട്മാറ്റേണ്ട__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__ഉള്ളടക്കംമാറ്റേണ്ട__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'ആഴ്ച', 'ആഴ്‌ച', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ദിവസത്തിന്റെപേര്‌അക്കത്തിൽ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'പ്രാദേശികആഴ്ച', 'പ്രാദേശികആഴ്‌ച', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ആഴ്ചയുടെപേര്‌അക്കത്തിൽ', 'ആഴ്‌ചയുടെപേര്‌അക്കത്തിൽ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'തിരുത്തൽഅടയാളം', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'തിരുത്തിയദിവസം', 'തിരുത്തിയദിനം', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'തിരുത്തിയദിവസം2', 'തിരുത്തിയദിനം2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'തിരുത്തിയമാസം', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'തിരുത്തിയമാസം1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'തിരുത്തിയവർഷം', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'തിരുത്തിയസമയമുദ്ര', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'അവസാനംതിരുത്തിയയാൾ', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'ബഹുവചനം:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'പൂർണ്ണവിലാസം:', 'FULLURL:' ),
+       'raw'                       => array( '0', 'അസംസ്കൃതം:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ശീർഷകംപ്രദർശിപ്പിക്കുക', 'തലക്കെട്ട്പ്രദർശിപ്പിക്കുക', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'വ', 'R' ),
+       'newsectionlink'            => array( '1', '__പുതിയവിഭാഗംകണ്ണി__', '__പുതിയഖണ്ഡിക്കണ്ണി__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__പുതിയവിഭാഗംകണ്ണിവേണ്ട__', '__പുതിയഖണ്ഡിക്കണ്ണിവേണ്ട__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'ഈപതിപ്പ്', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'സമയമുദ്ര', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'പ്രാദേശികസമയമുദ്ര', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'ദിശാസൂചിക', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#ഭാഷ:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'ഉള്ളടക്കഭാഷ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'നാമമേഖലയിലുള്ളതാളുകൾ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'കാര്യനിർവ്വാഹകരുടെഎണ്ണം', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ദശാംശഘടന', 'സംഖ്യാഘടന', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ഇടത്ത്നിറക്കുക', 'PADLEFT' ),
+       'padright'                  => array( '0', 'വലത്ത്നിറക്കുക', 'PADRIGHT' ),
+       'special'                   => array( '0', 'പ്രത്യേകം', 'special' ),
+       'defaultsort'               => array( '1', 'സ്വതവേയുള്ളക്രമപ്പെടുത്തൽ:', 'സ്വതവേയുള്ളക്രമപ്പെടുത്തൽചാവി:', 'സ്വതവേയുള്ളവർഗ്ഗക്രമപ്പെടുത്തൽ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'പ്രമാണപഥം:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'റ്റാഗ്', 'tag' ),
+       'hiddencat'                 => array( '1', '‌‌__മറഞ്ഞിരിക്കുംവർഗ്ഗം__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'വർഗ്ഗത്തിലുള്ളതാളുകൾ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'താൾവലിപ്പം', 'PAGESIZE' ),
+       'index'                     => array( '1', '‌‌__സൂചിക__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__സൂചികവേണ്ട__', '__NOINDEX__' ),
+       'staticredirect'            => array( '1', '_സ്ഥിരസ്ഥിതതിരിച്ചുവിടൽ_', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'സംരക്ഷണതലം', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'ദിനരേഖീകരണരീതി', 'ദിവസരേഖീകരണരീതി', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'പഥം', 'PATH' ),
+       'url_wiki'                  => array( '0', 'വിക്കി', 'WIKI' ),
+       'url_query'                 => array( '0', 'ക്വറി', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'പിഴവില്ല', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'മാറ്റേണ്ടതില്ല', 'noreplace' ),
 );
 
 $digitGroupingPattern = "##,##,###";
@@ -334,7 +335,7 @@ $messages = array(
 'tog-hidepatrolled' => 'റോന്തുചുറ്റിയ തിരുത്തുകൾ പുതിയമാറ്റങ്ങളിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക',
 'tog-newpageshidepatrolled' => 'റോന്തുചുറ്റിയ താളുകൾ പുതിയതാളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക',
 'tog-extendwatchlist' => 'ഏറ്റവും പുതിയവ മാത്രമല്ല, എല്ലാ മാറ്റങ്ങളും ദൃശ്യമാകുന്ന വിധത്തിൽ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക വികസിപ്പിക്കുക.',
-'tog-usenewrc' => 'വിപàµ\81à´²àµ\80à´\95àµ\83à´¤ à´ªàµ\81തിയ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´\89പയàµ\8bà´\97ിക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)',
+'tog-usenewrc' => 'സമàµ\80à´ªà´\95ാല à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´¤à´¾à´³à´¿à´²àµ\81à´\82 à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനവയàµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95യിലàµ\81à´\82 à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´¤à´¾à´³à´¿à´¨à´¨àµ\81സരിà´\9aàµ\8dà´\9aàµ\8d à´\97ണമായി à´ªàµ\8dരദർശിപàµ\8dà´ªിക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)',
 'tog-numberheadings' => 'ഉപവിഭാഗങ്ങൾക്ക് ക്രമസംഖ്യ കൊടുക്കുക',
 'tog-showtoolbar' => 'തിരുത്തൽ റ്റൂൾബാർ  പ്രദർശിപ്പിക്കുക (ജാവാസ്ക്രിപ്റ്റ്)',
 'tog-editondblclick' => 'താളുകളിൽ ഇരട്ട ക്ലിക്ക് ചെയ്യുമ്പോൾ തിരുത്താനനുവദിക്കുക (ജാവാസ്ക്രിപ്റ്റ്)',
@@ -342,15 +343,15 @@ $messages = array(
 'tog-editsectiononrightclick' => 'ഉപവിഭാഗങ്ങളുടെ തലക്കെട്ടിൽ റൈറ്റ് ക്ലിക്ക് ചെയ്യുന്നതു വഴി തിരുത്താനനുവദിക്കുക (ജാവാസ്ക്രിപ്റ്റ്)',
 'tog-showtoc' => 'ഉള്ളടക്കപ്പട്ടിക പ്രദർശിപ്പിക്കുക (മൂന്നിൽ കൂടുതൽ ഉപശീർഷകങ്ങളുള്ള താളുകൾക്കു മാത്രം)',
 'tog-rememberpassword' => 'എന്റെ പ്രവേശനം ഈ ബ്രൗസറിൽ ({{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}) ഓർത്തുവെക്കുക',
-'tog-watchcreations' => 'à´\9eാൻ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
-'tog-watchdefault' => 'à´\9eാൻ à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
-'tog-watchmoves' => 'à´\9eാൻ à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81 à´®à´¾à´±àµ\8dà´±àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
-'tog-watchdeletion' => 'à´\9eാൻ à´¨àµ\80à´\95àµ\8dà´\95à´\82 à´\9aàµ\86à´¯àµ\8dà´¯àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
+'tog-watchcreations' => 'à´\9eാൻ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\82 à´\9eാൻ à´\85à´ªàµ\8dâ\80\8cà´²àµ\8bà´¡àµ\8d à´\9aàµ\86à´¯àµ\8dà´¯àµ\81à´¨àµ\8dà´¨ à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´\82 ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
+'tog-watchdefault' => 'à´\9eാൻ à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\82 à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´\82 ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
+'tog-watchmoves' => 'à´\9eാൻ à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81 à´®à´¾à´±àµ\8dà´±àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\82 à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´\82 ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
+'tog-watchdeletion' => 'à´\9eാൻ à´¨àµ\80à´\95àµ\8dà´\95à´\82 à´\9aàµ\86à´¯àµ\8dà´¯àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\82 à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´\82 ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
 'tog-minordefault' => 'എല്ലാ തിരുത്തലുകളും സ്വതേ ചെറുതിരുത്തലുകളായി അടയാളപ്പെടുത്തുക',
 'tog-previewontop' => 'തിരുത്തൽ പെട്ടിക്കു മുകളിൽ പ്രിവ്യൂ കാണിക്കുക',
 'tog-previewonfirst' => 'ആദ്യത്തെ തിരുത്തലിന്റെ പ്രിവ്യൂ കാണിക്കുക',
 'tog-nocache' => 'ബ്രൗസറിൽ താളുകൾ തദ്ദേശീയമായി സംഭരിച്ചുവയ്ക്കുന്നത് നിർജ്ജീവമാക്കുക',
-'tog-enotifwatchlistpages' => 'à´\9eാൻ à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾà´\95àµ\8dà´\95àµ\81 മാറ്റം സംഭവിച്ചാൽ എനിക്കു ഇമെയിൽ അയക്കുക',
+'tog-enotifwatchlistpages' => 'à´\9eാൻ à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾà´\95àµ\8dà´\95àµ\8b à´ªàµ\8dരമാണà´\99àµ\8dà´\99ൾà´\95àµ\8dà´\95àµ\8b മാറ്റം സംഭവിച്ചാൽ എനിക്കു ഇമെയിൽ അയക്കുക',
 'tog-enotifusertalkpages' => 'എന്റെ സം‌വാദം താളിനു മാറ്റം സംഭവിച്ചാൽ ഇമെയിൽ അയക്കുക',
 'tog-enotifminoredits' => 'ചെറുതിരുത്തലുകൾക്കും എനിക്ക് ഇമെയിൽ അയയ്ക്കുക',
 'tog-enotifrevealaddr' => 'വിജ്ഞാപന മെയിലുകളിൽ എന്റെ ഇമെയിൽ വിലാസം വെളിവാക്കാൻ അനുവദിക്കുക',
@@ -590,6 +591,10 @@ $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' => 'തിരുത്തുക',
@@ -645,8 +650,8 @@ $1',
 'dberrortext' => 'ഒരു വിവരശേഖര അന്വേഷണത്തിന്റെ ഉപയോഗക്രമത്തിൽ പിഴവ് സംഭവിച്ചിരിക്കുന്നു.
 ഇത് ചിലപ്പോൾ സോഫ്റ്റ്‌വെയർ ബഗ്ഗിനെ സൂചിപ്പിക്കുന്നതാവാം.
 അവസാനം ശ്രമിച്ച വിവരശേഖര അന്വേഷണം താഴെ കൊടുക്കുന്നു:
-<blockquote><tt>$1</tt></blockquote>
-"<tt>$2</tt>" എന്ന നിർദ്ദേശത്തിനകത്ത് നിന്നും.
+<blockquote><code>$1</code></blockquote>
+"<code>$2</code>" എന്ന നിർദ്ദേശത്തിനകത്ത് നിന്നും.
 വിവരശേഖരത്തിൽ നിന്നും ലഭിച്ച പിഴവ് "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'വിവരശേഖര അന്വേഷണ ഘടനയിൽ ഒരു പിഴവ് സംഭവിച്ചിരിക്കുന്നു.
 അവസാനം ശ്രമിച്ച വിവരശേഖര അന്വേഷണം താഴെ കൊടുക്കുന്നു:
@@ -667,7 +672,7 @@ $1',
 ദയവായി താളിന്റെ യു.ആർ.എൽ സഹിതം ഒരു [[Special:ListUsers/sysop|കാര്യനിർവാഹകനെ]] ഇത് അറിയിക്കുക.',
 'missingarticle-rev' => '(മാറ്റം#: $1)',
 'missingarticle-diff' => '(വ്യത്യാസം: $1, $2)',
-'readonly_lag' => 'വിവരശേഖരം സ്വയം ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു അതേസമയം കീഴ്-വിവരശേഖര സെർവറുകൾ മാസ്റ്റർ വരെ പിടിച്ചിരിക്കുന്നു',
+'readonly_lag' => ' കീഴ്-വിവരശേഖര സെർവറുകൾ മാസ്റ്റർ വരെ എത്തിയതിനാൽ വിവരശേഖരം സ്വയം ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു',
 'internalerror' => 'ആന്തരിക പിഴവ്',
 'internalerror_info' => 'ആന്തരിക പിഴവ്: $1',
 'fileappenderrorread' => 'കൂട്ടിച്ചേർക്കുന്ന സമയം "$1" വായിച്ചെടുക്കാൻ കഴിഞ്ഞില്ല.',
@@ -684,12 +689,14 @@ $1',
 'cannotdelete' => '"$1" എന്ന താൾ അഥവാ പ്രമാണം നീക്കം ചെയ്യാൻ കഴിഞ്ഞില്ല.
 അതു മിക്കവാറും മറ്റാരെങ്കിലും നീക്കം ചെയ്തിട്ടുണ്ടാവാം.',
 'cannotdelete-title' => '"$1" എന്ന താൾ മായ്ക്കാൻ കഴിയില്ല',
+'delete-hook-aborted' => 'മായ്ക്കൽ കൊളുത്തിനാൽ റദ്ദാക്കിയിരിക്കുന്നു.
+വിശദീകരണമൊന്നും നൽകിയിട്ടില്ല.',
 'badtitle' => 'അസാധുവായ തലക്കെട്ട്',
 'badtitletext' => 'താങ്കൾ ആവശ്യപ്പെട്ട തലക്കെട്ടുള്ള ഒരു താൾ നിലവിലില്ല. ഇതു തെറ്റായി അന്തർഭാഷാ/അന്തർവിക്കി കണ്ണി ചെയ്യപ്പെട്ടതു മൂലമോ, തലക്കെട്ടിൽ ഉപയോഗിക്കരുതാത്ത അക്ഷരരൂപങ്ങൾ ഉപയോഗിച്ചതു മൂലമോ സംഭവിച്ചതായിരിക്കാം.',
 'perfcached' => 'താഴെ കൊടുത്തിരിക്കുന്ന വിവരം ശേഖരിച്ചു വെച്ചിരിക്കുന്നതാണ്, അതുകൊണ്ട് ചിലപ്പോൾ പുതിയതായിരിക്കണമെന്നില്ല. പരമാവധി {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
 'perfcachedts' => 'താഴെയുള്ള വിവരങ്ങൾ ശേഖരിച്ച് വെച്ചവയിൽ പെടുന്നു, അവസാനം പുതുക്കിയത് $1-നു ആണ്‌. പരമാവധി {{PLURAL:$4|ഒരു ഫലം|$4 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
 'querypage-no-updates' => 'ഈ താളിന്റെ പുതുക്കൽ തൽക്കാലം നടക്കുന്നില്ല. ഇവിടുള്ള വിവരങ്ങൾ ഏറ്റവും പുതിയതാവണമെന്നില്ല.',
-'wrong_wfQuery_params' => 'wfQuery()à´\8eà´¨àµ\8dനതിലàµ\87à´\95àµ\8dà´\95àµ\8d à´¤àµ\86à´±àµ\8dറായ à´ªà´°à´¾à´®àµ\80à´±àµ\8dററàµ\81à´\95ൾ<br />
+'wrong_wfQuery_params' => 'wfQuery()à´\8eà´¨àµ\8dനതിലàµ\87à´\95àµ\8dà´\95àµ\8d à´¤àµ\86à´±àµ\8dറായ à´\9aà´°à´\99àµ\8dà´\99ൾ<br />
 നിർദ്ദേശം: $1<br />
 അന്വേഷണം: $2',
 'viewsource' => 'മൂലരൂപം കാണുക',
@@ -701,7 +708,7 @@ $1',
 'viewyourtext' => "താങ്കൾക്ക് ഈ താളിലെ '''താങ്കളുടെ തിരുത്തലുകളുടെ''' മൂലരൂപം കാണാനും പകർത്താനും സാധിക്കും:",
 'protectedinterface' => 'ഈ താൾ സോഫ്റ്റ്‌വെയറിന്റെ സമ്പർക്കമുഖ എഴുത്തുകൾ നൽകുന്നു, അതുകൊണ്ട് ദുരുപയോഗം തടയാൻ ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു.',
 'editinginterface' => "'''മുന്നറിയിപ്പ്:''' സോഫ്റ്റ്‌വെയറിൽ സമ്പർക്കമുഖം നിലനിർത്തുന്ന താളാണു താങ്കൾ തിരുത്തുവാൻ പോകുന്നത്. ഈ താളിൽ താങ്കൾ വരുത്തുന്ന മാറ്റങ്ങൾ ഉപയോക്താവ് വിക്കി കാണുന്ന വിധത്തെ മാറ്റിമറിച്ചേക്കാം. മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പരിഭാഷകൾക്ക് മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പ്രാദേശികവത്കരണ സംരംഭം ആയ [//translatewiki.net/wiki/Main_Page?setlang=ml ബീറ്റാവിക്കി] ഉപയോഗിക്കുവാൻ താല്പര്യപ്പെടുന്നു.",
-'sqlhidden' => '(SQL query മറച്ചിരിക്കുന്നു)',
+'sqlhidden' => '(എസ്.ക്യു.എൽ. ക്വറി മറച്ചിരിക്കുന്നു)',
 'cascadeprotected' => 'നിർഝരിത (cascading) സൗകര്യം ഉപയോഗിച്ച് തിരുത്തൽ നടത്തുന്നതിനു സം‌രക്ഷണം ഏർപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|താഴെ കൊടുത്തിട്ടുള്ള താളിന്റെ|താഴെ കൊടുത്തിട്ടുള്ള താളുകളുടെ}} ഭാഗമാണ്‌ ഈ താൾ. അതിനാൽ ഈ താൾ തിരുത്തുവാൻ സാധിക്കില്ല:
 $2',
 'namespaceprotected' => "'''$1''' നാമമേഖലയിലുള്ള താളുകൾ തിരുത്താൻ താങ്കൾക്ക് അനുവാദമില്ല.",
@@ -715,6 +722,8 @@ $2',
 ബന്ധിച്ച കാര്യ‌നിർവാഹക(ൻ) നൽകിയിരിക്കുന്ന കാരണം "\'\'$3\'\'" എന്നാണ്.',
 'invalidtitle-knownnamespace' => 'നാമമേഖല "$2", എഴുത്ത് "$3" എന്നിവ ഉപയോഗിച്ചുള്ള അസാധുവായ തലക്കെട്ട്',
 'invalidtitle-unknownnamespace' => 'അപരിചിതമായ നാമമേഖലാ സംഖ്യ $1, എഴുത്ത് "$2" എന്നിവ ഉപയോഗിച്ചുള്ള അസാധുവായ തലക്കെട്ട്',
+'exception-nologin' => 'ലോഗിൻ ചെയ്തിട്ടില്ല',
+'exception-nologin-text' => 'ഈ വിക്കിയിൽ ഈ താൾ അല്ലെങ്കിൽ പ്രവൃത്തി ലഭ്യമാകാൻ താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കേണ്ടതാണ്.',
 
 # Virus scanner
 'virus-badscanner' => "തെറ്റായ ക്രമീകരണങ്ങൾ: അപരിചിതമായ വൈറസ് തിരച്ചിൽ ഉപാധി :  ''$1''",
@@ -736,6 +745,7 @@ $2',
 'remembermypassword' => 'എന്റെ പ്രവേശനം ഈ ബ്രൗസറിൽ ({{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}) ഓർത്തുവെക്കുക',
 'securelogin-stick-https' => 'പ്രവേശനത്തിനു ശേഷവും എച്ച്.റ്റി.റ്റി.പി.എസ്. തന്നെ ഉപയോഗിക്കുക',
 'yourdomainname' => 'താങ്കളുടെ ഡൊമെയിൻ:',
+'password-change-forbidden' => 'ഈ വിക്കിയിൽ രഹസ്യവാക്കുകൾ മാറ്റാനാവില്ല.',
 'externaldberror' => 'ഒന്നുകിൽ ഡേറ്റാബേസ് സാധൂകരണത്തിൽ പ്രശ്നം ഉണ്ടായിരുന്നു അല്ലെങ്കിൽ നവീകരിക്കുവാൻ താങ്കളുടെ ബാഹ്യ അംഗത്വം താങ്കളെ അനുവദിക്കുന്നില്ല.',
 'login' => 'പ്രവേശിക്കുക',
 'nav-login-createaccount' => 'പ്രവേശിക്കുക / അംഗത്വമെടുക്കുക',
@@ -953,8 +963,8 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'newarticle' => '(പുതിയത്)',
 'newarticletext' => 'ഇതുവരെ നിലവിലില്ലാത്ത ഒരു താൾ സൃഷ്ടിക്കാനുള്ള ശ്രമത്തിലാണ് താങ്കൾ. അതിനായി താഴെ ആവശ്യമുള്ള വിവരങ്ങൾ എഴുതിച്ചേർത്ത് സേവ് ചെയ്യുക (കൂടുതൽ വിവരങ്ങൾക്ക് [[{{MediaWiki:Helppage}}|സഹായം താൾ]] കാണുക). താങ്കളിവിടെ അബദ്ധത്തിൽ വന്നതാണെങ്കിൽ ബ്രൗസറിന്റെ ബാക്ക് ബട്ടൺ ഞെക്കിയാൽ തിരിച്ചുപോകാം.',
 'anontalkpagetext' => "----
-{| class=\"messagebox standard-talk\" style=\"border: 1px solid #B3B300; background-color:#FFFFBF;\"
-|align=\"left\" |
+{| class=\"messagebox standard-talk\" style=\"border: 1px solid #B3B300; background-color:#FFFFBF; text-align: left;\"
+|
 ''ഇതുവരെ അംഗത്വം എടുക്കാതിരിക്കുകയോ, നിലവിലുള്ള അംഗത്വം ഉപയോഗിക്കാതിരിക്കുകയോ ചെയ്യുന്ന '''ഒരു അജ്ഞാത ഉപയോക്താവിന്റെ സം‌വാദം താളാണിത്'''.
 അതിനാൽ അദ്ദേഹത്തെ തിരിച്ചറിയുവാൻ അക്കരൂപത്തിലുള്ള ഐ.പി. വിലാസം ഉപയോഗിക്കേണ്ടതുണ്ട്. ഇത്തരം ഒരു ഐ.പി. വിലാസം പല ഉപയോക്താക്കൾ പങ്കുവെക്കുന്നുണ്ടാവാം.
 താങ്കൾ ഈ സന്ദേശം ലഭിച്ച ഒരു അജ്ഞാത ഉപയോക്താവാണെങ്കിൽ, ഭാവിയിൽ ഇതര ഉപയോക്താക്കളുമായി ഉണ്ടായേക്കാവുന്ന ആശയക്കുഴപ്പം ഒഴിവാക്കാൻ ദയവായി [[Special:UserLogin/signup|ഒരു അംഗത്വമെടുക്കുക]] അല്ലെങ്കിൽ  [[Special:UserLogin|പ്രവേശിക്കുക]].
@@ -964,6 +974,10 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'noarticletext-nopermission' => 'ഇപ്പോൾ ഈ താളിൽ എഴുത്തുകളൊന്നും ഇല്ല.
 താങ്കൾക്ക് മറ്റു താളുകളിൽ [[Special:Search/{{PAGENAME}}|ഈ താളിന്റെ തലക്കെട്ടിനായി തിരയാവുന്നതാണ്‌]],
 അല്ലെങ്കിൽ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ബന്ധപ്പെട്ട രേഖകൾ പരിശോധിക്കാവുന്നതാണ്‌]</span>.',
+'missing-revision' => '"{{PAGENAME}}" എന്ന താളിന്റെ #$1 എന്ന നാൾപ്പതിപ്പ് നിലവിലില്ല.
+
+മായ്ക്കപ്പെട്ട താളിന്റെ കാലഹരണപ്പെട്ട നാൾവഴി കണ്ണി ഉപയോഗിച്ചാലാണ് സാധാരണ ഇങ്ങനെ സംഭവിക്കുക.
+കൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] കാണാവുന്നതാണ്.',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" എന്ന ഉപയോക്താവ് അംഗത്വമെടുത്തിട്ടില്ല. ഈ താൾ സൃഷ്ടിക്കണമോ എന്നതു പരിശോധിക്കുക.',
 'userpage-userdoesnotexist-view' => '"$1" എന്ന അം‌ഗത്വം നിലവിലില്ല.',
 'blocked-notice-logextract' => 'ഈ ഉപയോക്താവ് ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുകയാണ്.
@@ -971,9 +985,8 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'clearyourcache' => "'''ശ്രദ്ധിക്കുക:''' സേവ് ചെയ്തശേഷം മാറ്റങ്ങൾ കാണാനായി താങ്കൾക്ക് ബ്രൗസറിന്റെ കാഷെ ഒഴിവാക്കേണ്ടി വന്നേക്കാം.
 * '''ഫയർഫോക്സ് / സഫാരി:'''  ''Reload'' ബട്ടൺ അമർത്തുമ്പോൾ ''Shift'' കീ അമർത്തി പിടിക്കുകയോ, ''Ctrl-F5'' അല്ലെങ്കിൽ  ''Ctrl-R''  (മാക്കിന്റോഷിൽ ''⌘-R'' ) എന്ന് ഒരുമിച്ച് അമർത്തുകയോ ചെയ്യുക
 * '''ഗൂഗിൾ ക്രോം:'''  ''Ctrl-Shift-R'' (മാക്കിന്റോഷിൽ ''⌘-Shift-R'' ) അമർത്തുക
-* '''ഇന്റർനെറ്റ് എക്സ്പ്ലോറർ:''' ''Refresh'' ബട്ടൺ അമർത്തുമ്പോൾ ''Ctrl'' കീ അമർത്തിപിടിക്കുക. അല്ലെങ്കിൽ ''Ctrl-F5'' അമർത്തുക;
-* '''ഓപ്പറ:'''  ''Tools→Preferences'' ഉപയോഗിച്ച് കാഷെ പൂർണ്ണമായും ക്ലിയർ ചെയ്യുക;
-* '''കോൺക്വറർ:''' ''Reload'' ബട്ടൺ അമർത്തുകയോ ''F5'' കീ അമർത്തുകയോ ചെയ്യുക.",
+* '''ഇന്റർനെറ്റ് എക്സ്പ്ലോറർ:''' ''Refresh'' ബട്ടൺ അമർത്തുമ്പോൾ ''Ctrl'' കീ അമർത്തിപിടിക്കുക. അല്ലെങ്കിൽ ''Ctrl-F5'' അമർത്തുക
+* '''ഓപ്പറ:'''  ''Tools→Preferences'' ഉപയോഗിച്ച് കാഷെ പൂർണ്ണമായും ക്ലിയർ ചെയ്യുക",
 'usercssyoucanpreview' => "'''വഴികാട്ടി:''' താങ്കളുടെ പുതിയ CSS സേവ് ചെയ്യുന്നതിനു മുമ്പ് \"{{int:showpreview}}\" എന്ന ബട്ടൻ ഉപയോഗിച്ച് പരിശോധിക്കുക.",
 'userjsyoucanpreview' => "'''വഴികാട്ടി:''' താങ്കളുടെ പുതിയ ജാവാസ്ക്രിപ്റ്റ് സേവ് ചെയ്യുന്നതിനു മുമ്പ് \"{{int:showpreview}}\" എന്ന ബട്ടൻ ഉപയോഗിച്ച് പരിശോധിക്കുക.",
 'usercsspreview' => "'''താങ്കൾ താങ്കളുടെ സ്വന്തം സി.എസ്.എസ്. പ്രിവ്യൂ ചെയ്യുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക.'''
@@ -1053,8 +1066,8 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'moveddeleted-notice' => 'ഈ താൾ മായ്ക്കപ്പെട്ടിരിക്കുന്നു.
 ഈ താളിന്റെ മായ്ക്കൽ രേഖ പരിശോധനയ്ക്കായി താഴെ കൊടുത്തിരിക്കുന്നു',
 'log-fulllog' => 'എല്ലാ രേഖകളും കാണുക',
-'edit-hook-aborted' => 'à´\95àµ\8aà´³àµ\81à´¤àµ\8dà´¤àµ\8d à´\9bàµ\87ദിà´\9aàµ\8dà´\9a à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\8d.
-à´\87à´¤àµ\8d à´\92à´°àµ\81 à´µà´¿à´¶à´¦àµ\80à´\95രണവും നൽകിയിട്ടില്ല.',
+'edit-hook-aborted' => 'തിരàµ\81à´¤àµ\8dതൽ à´\95àµ\8aà´³àµ\81à´¤àµ\8dതിനാൽ à´±à´¦àµ\8dദാà´\95àµ\8dà´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.
+വിശദàµ\80à´\95രണമàµ\8aà´¨àµ\8dà´¨ും നൽകിയിട്ടില്ല.',
 'edit-gone-missing' => 'ഈ താൾ പുതുക്കുവാൻ സാധിക്കുകയില്ല.
 ഇത് മായ്ക്കപ്പെട്ടതായി കാണുന്നു.',
 'edit-conflict' => 'തിരുത്തൽ സമരസപ്പെടായ്ക.',
@@ -1109,7 +1122,7 @@ $3 അതിനു കാണിച്ചിരിക്കുന്ന കാര
 'last' => 'മുമ്പ്',
 'page_first' => 'ആദ്യ',
 'page_last' => 'അവസാന',
-'histlegend' => "വ്യത്യാസങ്ങൾ ഒത്തുനോക്കാൻ: ഒത്തുനോക്കേണ്ട പതിപ്പുകൾക്കൊപ്പമുള്ള റേഡിയോ ബട്ടൺ തിരഞ്ഞെടുത്ത് ''\"തിരഞ്ഞെടുത്ത പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം കാണുക\"'' എന്ന ബട്ടൺ ഞെക്കുകയോ ENTER കീ അമർത്തുകയോ ചെയ്യുക.<br />
+'histlegend' => "വ്യത്യാസങ്ങൾ ഒത്തുനോക്കാൻ: ഒത്തുനോക്കേണ്ട പതിപ്പുകൾക്കൊപ്പമുള്ള റേഡിയോ ബട്ടൺ തിരഞ്ഞെടുത്ത് ''\"തിരഞ്ഞെടുത്ത പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം കാണുക\"'' എന്ന ബട്ടൺ ഞെക്കുകയോ ''എന്റർ'' കീ അമർത്തുകയോ ചെയ്യുക.<br />
 
 സൂചന: (ഇപ്പോൾ) = നിലവിലുള്ള പതിപ്പുമായുള്ള വ്യത്യാസം, (മുമ്പ്) = തൊട്ടുമുൻപത്തെ പതിപ്പുമായുള്ള വ്യത്യാസം, (ചെ.) = ചെറിയ തിരുത്തൽ.",
 'history-fieldset-title' => 'നാൾവഴി പരിശോധന',
@@ -1270,6 +1283,10 @@ $1",
 'editundo' => 'മാറ്റം തിരസ്ക്കരിക്കുക',
 'diff-multi' => '(ഇടയ്ക്ക് {{PLURAL:$2|ഒരു ഉപയോക്താവ്|$2 ഉപയോക്താക്കൾ}} ചെയ്ത {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} പ്രദർശിപ്പിക്കുന്നില്ല.)',
 'diff-multi-manyusers' => '(ഇടയ്ക്ക് {{PLURAL:$2|ഒന്നിലധികം|$2 എണ്ണത്തിലധികം}} ഉപയോക്താക്കൾ ചെയ്തിട്ടുള്ള {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} പ്രദർശിപ്പിക്കുന്നില്ല.)',
+'difference-missing-revision' => 'ഈ വ്യത്യാസത്തിൽ ($1) {{PLURAL:$2|ഒരു നാൾപ്പതിപ്പ്|$2 നാൾപ്പതിപ്പുകൾ}} കാണാനായില്ല.
+
+മായ്ക്കപ്പെട്ട താളിന്റെ കാലഹരണപ്പെട്ട നാൾവഴി കണ്ണി ഉപയോഗിച്ചാലാണ് സാധാരണ ഇങ്ങനെ സംഭവിക്കുക.
+കൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] കാണാവുന്നതാണ്.',
 
 # Search results
 'searchresults' => 'തിരച്ചിലിന്റെ ഫലം',
@@ -1537,6 +1554,7 @@ $1",
 'right-writeapi' => 'തിരുത്തുക എ.പി.ഐ.യുടെ ഉപയോഗം',
 'right-delete' => 'താളുകൾ മായ്ക്കുക',
 'right-bigdelete' => 'വലിയ നാൾവഴിയുള്ള താളുകൾ മായ്ക്കുക',
+'right-deletelogentry' => 'രേഖയിലെ പ്രത്യേക ഉൾപ്പെടുത്തലുകൾ മായ്ക്കുകയോ പുനഃസ്ഥാപിക്കുകയോ ചെയ്യുക',
 'right-deleterevision' => 'താളിന്റെ പ്രത്യേക പതിപ്പുകൾ മായ്ക്കുക പുനഃസ്ഥാപിക്കുക',
 'right-deletedhistory' => 'മായ്ക്കപ്പെട്ട വിവരങ്ങൾ ബന്ധപ്പെട്ട എഴുത്തുകൾ ഇല്ലാതെ കാണുക',
 'right-deletedtext' => 'മായ്ക്കപ്പെട്ട എഴുത്തും താളിന്റെ മായ്ക്കപ്പെട്ട പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസവും കാണുക',
@@ -1558,7 +1576,7 @@ $1",
 'right-edituserjs' => 'മറ്റ് ഉപയോക്താക്കളുടെ JS പ്രമാണങ്ങൾ തിരുത്തുക',
 'right-rollback' => 'ഒരു പ്രത്യേക താളിൽ അവസാനം തിരുത്തൽ നടത്തിയ ഉപയോക്താവിന്റെ തിരുത്തൽ പെട്ടെന്ന് ഒഴിവാക്കുക',
 'right-markbotedits' => 'മുൻപ്രാപനം നടത്തിയ തിരുത്തലുകൾ യാന്ത്രിക തിരുത്തലുകളായി അടയാളപ്പെടുത്തുക',
-'right-noratelimit' => 'നിലവാരമിà´\9fലിനàµ\8dà´±àµ\86 പരിധികൾ ബാധകമല്ല',
+'right-noratelimit' => 'à´ªàµ\8dരവർതàµ\8dതനà´\99àµ\8dà´\99ൾà´\95àµ\8dà´\95àµ\8d പരിധികൾ ബാധകമല്ല',
 'right-import' => 'മറ്റുള്ള വിക്കികളിൽ നിന്നും താളുകൾ ഇറക്കുമതി ചെയ്യുക',
 'right-importupload' => 'അപ്‌‌ലോഡ് ചെയ്ത പ്രമാണത്തിൽ നിന്നും താളുകൾ ഇറക്കുമതി ചെയ്യുക',
 'right-patrol' => 'മറ്റുള്ളവരുടെ തിരുത്തലുകൾ റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക',
@@ -1682,7 +1700,7 @@ $1",
 പ്രമാണം താളിൽ പ്രദർശിപ്പിക്കുവാൻ താഴെ കാണുന്ന ഒരു വഴി സ്വീകരിക്കുക
 
 *'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''' പൂർണ്ണരൂപത്തിലുള്ള പ്രമാണം ഉപയോഗിക്കാൻ
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' 200 പിക്സൽ ഉള്ള പെട്ടിയിൽ പകരമുള്ള എഴുത്തടക്കം ഉപയോഗിക്കാൻ
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 200 പിക്സൽ ഉള്ള പെട്ടിയിൽ പകരമുള്ള എഴുത്തടക്കം ഉപയോഗിക്കാൻ
 *'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>''' പ്രമാണം കാട്ടാതെ പ്രമാണത്തെ നേരിട്ടു കണ്ണി ചേർക്കാൻ",
 'upload-permitted' => 'അനുവദനീയമായ പ്രമാണ തരങ്ങൾ: $1.',
 'upload-preferred' => 'പ്രോത്സാഹിപ്പിക്കുന്ന പ്രമാണ തരങ്ങൾ: $1.',
@@ -1727,22 +1745,22 @@ $2 {{PLURAL:$3|തരത്തിലുള്ള പ്രമാണം|തരങ
 പ്രമാണത്തിന്റെ പേരിലുള്ള അക്ഷരത്തെറ്റായിരിക്കാം ഇതിനു കാരണം.
 ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യണോ എന്നൊരിക്കൽ കൂടി പരിശോധിക്കുക.',
 'windows-nonascii-filename' => 'പ്രത്യേകാക്ഷരങ്ങളുള്ള പ്രമാണനാമങ്ങൾ ഈ വിക്കി പിന്തുണയ്ക്കുന്നില്ല.',
-'fileexists' => "ഇതേ പേരിൽ വേറെ ഒരു പ്രമാണം നിലവിലുണ്ട്.
-ദയവായി '''<tt>[[:$1]]</tt>''' പരിശോധിച്ച് പ്രസ്തുത പ്രമാണം മാറ്റണമോ എന്നു തീരുമാനിക്കുക.
-[[$1|thumb]]",
-'filepageexists' => "ഈ പ്രമാണത്തിനുള്ള വിവരണതാൾ '''<tt>[[:$1]]</tt>''' എന്നു സൃഷ്ടിക്കപ്പെട്ടിട്ടുണ്ട്, പക്ഷേ ഇതേ പേരിൽ പ്രമാണം ഒന്നും നിലവിലില്ല.
+'fileexists' => 'ഇതേ പേരിൽ വേറെ ഒരു പ്രമാണം നിലവിലുണ്ട്.
+ദയവായി <strong>[[:$1]]</strong> പരിശോധിച്ച് പ്രസ്തുത പ്രമാണം മാറ്റണമോ എന്നു തീരുമാനിക്കുക.
+[[$1|thumb]]',
+'filepageexists' => 'ഈ പ്രമാണത്തിനുള്ള വിവരണതാൾ <strong>[[:$1]]</strong> എന്നു സൃഷ്ടിക്കപ്പെട്ടിട്ടുണ്ട്, പക്ഷേ ഇതേ പേരിൽ പ്രമാണം ഒന്നും നിലവിലില്ല.
 വിവരണതാളിൽ താങ്കൾ ഇവിടെ ചേർക്കുന്ന ലഘുകുറിപ്പ് പ്രത്യക്ഷപ്പെടുന്നതല്ല.
 അവിടെ ലഘുകുറിപ്പ് വരാൻ ആ താൾ താങ്കൾ സ്വയം തിരുത്തേണ്ടതാണ്.
-[[$1|ലഘുചിത്രം]]",
-'fileexists-extension' => "ഇതേ പേരിൽ മറ്റൊരു പ്രമാണം നിലവിലുണ്ട്: [[$2|ലഘുചിത്രം]]
-* ഇപ്പോൾ അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിന്റെ പേര്‌: '''<tt>[[:$1]]</tt>'''
-* നിലവിലുള്ള പ്രമാണത്തിന്റെ പേര്‌: '''<tt>[[:$2]]</tt>'''
-മറ്റൊരു പേരു തിരഞ്ഞെടുക്കുക.",
+[[$1|ലഘുചിത്രം]]',
+'fileexists-extension' => 'ഇതേ പേരിൽ മറ്റൊരു പ്രമാണം നിലവിലുണ്ട്: [[$2|ലഘുചിത്രം]]
+* ഇപ്പോൾ അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിന്റെ പേര്‌: <strong>[[:$1]]</strong>
+* നിലവിലുള്ള പ്രമാണത്തിന്റെ പേര്‌: <strong>[[:$2]]</strong>
+മറ്റൊരു പേരു തിരഞ്ഞെടുക്കുക.',
 'fileexists-thumbnail-yes' => "ഈ ചിത്രം വലിപ്പം കുറച്ച ഒന്നാണെന്നു ''(ലഘുചിത്രം)'' കാണുന്നു.
 [[$1|ലഘുചിത്രം]]
-ദയവായി '''<tt>[[:$1]]</tt>''' എന്ന ചിത്രം പരിശോധിക്കുക.
+ദയവായി <strong>[[:$1]]</strong> എന്ന ചിത്രം പരിശോധിക്കുക.
 [[:$1]] എന്ന ചിത്രവും ഈ ചിത്രവും ഒന്നാണെങ്കിൽ ലഘുചിത്രത്തിനു വേണ്ടി മാത്രമായി ചിത്രം അപ്‌ലോഡ് ചെയ്യേണ്ടതില്ല.",
-'file-thumbnail-no' => "പ്രമാണത്തിന്റെ പേര്‌  '''<tt>$1</tt>''' എന്നാണ്‌ തുടങ്ങുന്നത്.
+'file-thumbnail-no' => "പ്രമാണത്തിന്റെ പേര്‌  <strong>$1</strong> എന്നാണ്‌ തുടങ്ങുന്നത്.
 ഇതു വലിപ്പം കുറച്ച ഒരു ചിത്രം ''(ലഘുചിത്രം)'' ആണെന്നു കാണുന്നു.
 പൂർണ്ണ റെസലൂഷൻ ഉള്ള ചിത്രം ഉണ്ടെങ്കിൽ അതു അപ്‌ലോഡ് ചെയ്യുവാൻ താല്പര്യപ്പെടുന്നു, അല്ലെങ്കിൽ പ്രമാണത്തിന്റെ പേരു മാറ്റുവാൻ അഭ്യർത്ഥിക്കുന്നു.",
 'fileexists-forbidden' => 'ഈ പേരിൽ ഒരു പ്രമാണം നിലവിലുണ്ട്, അതു മാറ്റി സൃഷ്ടിക്കുക സാദ്ധ്യമല്ല.
@@ -1821,10 +1839,15 @@ $1',
 'backend-fail-connect' => '"$1"  ശേഖരണ ബാക്കെൻഡുമായി ബന്ധപ്പെടാൻ കഴിഞ്ഞില്ല.',
 'backend-fail-internal' => '"$1" എന്ന സ്റ്റോറേജ് ബാക്കെൻഡിൽ അപരിചിതമായ പിഴവ് സംഭവിച്ചു.',
 'backend-fail-contenttype' => '"$1" എന്നതിൽ സംഭരിച്ചിരിക്കുന്ന പ്രമാണത്തിന്റെ ഉള്ളടക്ക തരം നിർണ്ണയിക്കാനായില്ല.',
+'backend-fail-batchsize' => 'ശേഖരണ ബാക്ക്എൻഡിൽ $1 ഫയൽ {{PLURAL:$1|പ്രവൃത്തി|പ്രവൃത്തികൾ}} ചെയ്യാൻ നൽകിയിരുന്നു; അതിന്റെ പരിധി $2 {{PLURAL:$2|പ്രവൃത്തി|പ്രവൃത്തികൾ}} ആണ്.',
 'backend-fail-usable' => 'ആവശ്യമായത്ര അനുമതിയില്ലാത്തതു കൊണ്ടോ ഡയറക്റ്ററികൾ/കണ്ടൈനറുകൾ ഇല്ലാത്തതു കൊണ്ടോ പ്രമാണം $1 എഴുതിച്ചേർക്കാൻ കഴിഞ്ഞില്ല.',
 
+# File journal errors
+'filejournal-fail-dbconnect' => '"$1" എന്ന ശേഖരണ ബാക്ക്എൻഡിനായി ജേണൽ ഡേറ്റാബേസിനെ ബന്ധപ്പെടാൻ കഴിഞ്ഞില്ല.',
+'filejournal-fail-dbquery' => '"$1" എന്ന ശേഖരണ ബാക്ക്എൻഡിനായി ജേണൽ ഡേറ്റാബേസ് പുതുക്കാൻ കഴിഞ്ഞില്ല.',
+
 # Lock manager
-'lockmanager-notlocked' => '"$1" à´\8eà´¨àµ\8dനതിലàµ\86 à´ªàµ\82à´\9fàµ\8dà´\9fൽ അഴിക്കാൻ കഴിഞ്ഞില്ല; അത് പൂട്ടിയിട്ടില്ല.',
+'lockmanager-notlocked' => '"$1" à´\8eà´¨àµ\8dനതിലàµ\86 à´ªàµ\82à´\9fàµ\8dà´\9fàµ\8d അഴിക്കാൻ കഴിഞ്ഞില്ല; അത് പൂട്ടിയിട്ടില്ല.',
 'lockmanager-fail-closelock' => '"$1" എന്നതിന്റെ പൂട്ടൽ പ്രമാണം അടയ്ക്കാൻ കഴിഞ്ഞില്ല.',
 'lockmanager-fail-deletelock' => '"$1" എന്നതിന്റെ പൂട്ടൽ പ്രമാണം നീക്കംചെയ്യാൻ കഴിഞ്ഞില്ല.',
 'lockmanager-fail-acquirelock' => '"$1" എന്നതിന്റെ പൂട്ട് ലഭ്യമാക്കാൻ കഴിഞ്ഞില്ല.',
@@ -1832,6 +1855,7 @@ $1',
 'lockmanager-fail-releaselock' => '"$1" എന്നതിന്റെ പൂട്ട് വിടുവിക്കാൻ കഴിഞ്ഞില്ല.',
 'lockmanager-fail-db-bucket' => '$1 എന്ന ബക്കറ്റിൽ ആവശ്യത്തിനു പൂട്ടൽ ഡേറ്റാബേസുകളെ ബന്ധപ്പെടാൻ കഴിഞ്ഞില്ല.',
 'lockmanager-fail-db-release' => '$1 ഡേറ്റാബേസിലെ പൂട്ടലുകൾ വിടുവിക്കാൻ കഴിഞ്ഞില്ല.',
+'lockmanager-fail-svr-acquire' => '$1 സെർവറിൽ പൂട്ട് ലഭ്യമാക്കാൻ കഴിഞ്ഞില്ല.',
 'lockmanager-fail-svr-release' => '$1 സെർവറിലെ പൂട്ടലുകൾ വിടുവിക്കാൻ കഴിഞ്ഞില്ല.',
 
 # ZipDirectoryReader
@@ -1951,6 +1975,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'shared-repo' => 'ഒരു പങ്കുവെക്കപ്പെട്ട സംഭരണി',
 'shared-repo-name-wikimediacommons' => 'വിക്കിമീഡിയ കോമൺസ്',
 'filepage.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. പ്രമാണ വിവരണ താളുകളിൽ ഉൾപ്പെടുത്തപ്പെടുന്നതായിരിക്കും, ബാഹ്യ ക്ലൈന്റ് വിക്കികളിലും അത് ലഭ്യമായിരിക്കും */',
+'upload-disallowed-here' => 'നിർഭാഗ്യവശാൽ ഈ ചിത്രത്തിനു മുകളിൽ മറ്റൊരു ചിത്രം ചേർക്കാൻ താങ്കൾക്ക് കഴിയില്ല.',
 
 # File reversion
 'filerevert' => '$1 തിരസ്ക്കരിക്കുക',
@@ -1986,7 +2011,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 # MIME search
 'mimesearch' => 'മൈം(MIME) തിരയൽ',
 'mimesearch-summary' => 'ഈ താൾ പ്രമാണങ്ങളെ അവയുടെ മൈം(MIME)-തരം അനുസരിച്ച് അരിച്ചെടുക്കാൻ പ്രാപ്തമാക്കുന്നു:
-നൽകേണ്ടവിധം: പ്രമാണത്തിന്റെ തരം/ഉപതരം, ഉദാ:<tt>image/jpeg</tt>.',
+നൽകേണ്ടവിധം: പ്രമാണത്തിന്റെ തരം/ഉപതരം, ഉദാ:<code>image/jpeg</code>.',
 'mimetype' => 'മൈം(MIME) തരം:',
 'download' => 'ഡൗൺലോഡ്',
 
@@ -2032,11 +2057,12 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 
 'disambiguations' => 'വിവക്ഷിത താളുകളിലേയ്ക്ക് കണ്ണിചേർത്തിരിക്കുന്ന താളുകൾ',
 'disambiguationspage' => 'Template:വിവക്ഷകൾ',
-'disambiguations-text' => 'താഴെ കൊടുത്തിരിക്കുന്ന താളുകൾ വിവക്ഷിതങ്ങൾ താളിലേക്കു കണ്ണി ചേർക്കപ്പെട്ടിരിക്കുന്നു. അതിനു പകരം അവ ലേഖനതാളുകളിലേക്കു കണ്ണി ചേക്കേണ്ടതാണ്‌. <br /> ഒരു താളിനെ വിവക്ഷിത താൾ ആയി പരിഗണിക്കണമെങ്കിൽ അതു  [[MediaWiki:Disambiguationspage]] എന്ന താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ട ഒരു ഫലകം ഉപയോഗിക്കണം.',
+'disambiguations-text' => "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ '''വിവക്ഷിതങ്ങൾ താളിലേയ്ക്ക്''' കുറഞ്ഞത് ഒരു കണ്ണിയുണ്ട്. അവ അനുയോജ്യമായ താളിലേയ്ക്ക് കണ്ണിചേർക്കപ്പെടേണ്ടതാവാം. <br />
+[[MediaWiki:Disambiguationspage]] എന്ന താളിൽ കണ്ണി ചേർത്തിട്ടുള്ള ഫലകം ഉപയോഗിക്കുന്ന താളുകളെ വിവക്ഷിതങ്ങൾ താളായി കണക്കാക്കുന്നു.",
 
 'doubleredirects' => 'ഇരട്ട തിരിച്ചുവിടലുകൾ',
 'doubleredirectstext' => 'ഈ താളിൽ ഒരു തിരിച്ചുവിടലിൽ നിന്നും മറ്റു തിരിച്ചുവിടൽ താളുകളിലേയ്ക്ക് പോകുന്ന താളുകൾ കൊടുത്തിരിക്കുന്നു. ഓരോ വരിയിലും ഒന്നാമത്തേയും രണ്ടാമത്തേയും തിരിച്ചുവിടൽ താളിലേക്കുള്ള കണ്ണികളും, രണ്ടാമത്തെ തിരിച്ചുവിടൽ താളിൽ നിന്നു ശരിയായ ലക്ഷ്യതാളിലേക്കുള്ള കണ്ണികളും ഉൾക്കൊള്ളുന്നു.
-<del>à´µàµ\86à´\9fàµ\8dà´\9fà´¿à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനവ</del> à´¶à´°à´¿à´¯à´¾à´\95àµ\8dà´\95àµ\87à´£àµ\8dà´\9fà´¤àµ\81à´£àµ\8dà´\9f്.',
+<del>à´µàµ\86à´\9fàµ\8dà´\9fà´¿à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനവ</del> à´¶à´°à´¿à´¯à´¾à´\95àµ\8dà´\95ിയവയാണ്.',
 'double-redirect-fixed-move' => '[[$1]] മാറ്റിയിരിക്കുന്നു.
 ഇത് ഇപ്പോൾ [[$2]] എന്നതിലേയ്ക്ക് തിരിച്ചുവിടപ്പെട്ടിരിക്കുന്നു.',
 'double-redirect-fixed-maintenance' => '[[$1]] എന്ന താളിൽ നിന്ന് [[$2]] എന്ന താളിലേയ്ക്കുള്ള ഇരട്ട തിരിച്ചുവിടൽ ശരിയാക്കുന്നു.',
@@ -2057,6 +2083,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 # Miscellaneous special pages
 'nbytes' => '{{PLURAL:$1|ഒരു ബൈറ്റ്|$1 ബൈറ്റുകൾ}}',
 'ncategories' => '{{PLURAL:$1|ഒരു വർഗ്ഗം|$1 വർഗ്ഗങ്ങൾ}}',
+'ninterwikis' => '{{PLURAL:$1|ഒരു അന്തർവിക്കി|$1 അന്തർവിക്കികൾ}}',
 'nlinks' => '{{PLURAL:$1|ഒരു കണ്ണി|$1 കണ്ണികൾ}}',
 'nmembers' => '{{PLURAL:$1|ഒരു അംഗം|$1 അംഗങ്ങൾ}}',
 'nrevisions' => '{{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}}',
@@ -2085,6 +2112,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'mostlinkedtemplates' => 'ഏറ്റവുമധികം കണ്ണി ചേർത്തിരിക്കുന്ന ഫലകങ്ങൾ',
 'mostcategories' => 'ഏറ്റവുമധികം വർഗ്ഗങ്ങൾ ഉൾപ്പെടുത്തിയിരിക്കുന്ന താളുകൾ',
 'mostimages' => 'ഏറ്റവുമധികം കണ്ണി ചേർത്തിരിക്കുന്ന പ്രമാണങ്ങൾ',
+'mostinterwikis' => 'ഏറ്റവുമധികം അന്തർവിക്കികളുള്ള താളുകൾ',
 'mostrevisions' => 'ഏറ്റവുമധികം തിരുത്തപ്പെട്ട താളുകൾ',
 'prefixindex' => 'പൂർവ്വപദത്തോടു കൂടിയ എല്ലാ താളുകളും',
 'prefixindex-namespace' => 'പൂർവ്വപദമുള്ള എല്ലാ താളുകളും (നാമമേഖല $1)',
@@ -2185,7 +2213,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'linksearch-ok' => 'തിരയൂ',
 'linksearch-text' => '"*.wikipedia.org" പോലുള്ള വൈൽഡ് കാർഡുകൾ ഉപയോഗിക്കാവുന്നതാണ്‌.
 കുറഞ്ഞത് "*.org" പോലുള്ള ടോപ്-ലെവൽ ഡൊമൈൻ എങ്കിലും ഉണ്ടായിരിക്കണം.<br />
-പിന്താങ്ങുന്ന പ്രോട്ടോക്കോളുകൾ: <tt>$1</tt> (താങ്കളുടെ തിരച്ചിലിൽ ഇവ ചേർക്കരുത്).',
+പിന്താങ്ങുന്ന പ്രോട്ടോക്കോളുകൾ: <code>$1</code> (താങ്കളുടെ തിരച്ചിലിൽ ഇവ ചേർക്കരുത്).',
 'linksearch-line' => '$1,  $2ൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ടിരിക്കുന്നു.',
 'linksearch-error' => 'ഹോസ്റ്റ്നെയിമിന്റെ തുടക്കത്തിൽ മാത്രമേ വൈൽഡ് കാർഡുകൾ വരാവൂ.',
 
@@ -2231,6 +2259,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'mailnologin' => 'അയയ്ക്കാനുള്ള വിലാസം ലഭ്യമല്ല',
 'mailnologintext' => 'മറ്റ് ഉപയോക്താക്കൾക്കു ഇമെയിലയക്കുവാൻ താങ്കൾ [[Special:UserLogin|ലോഗിൻ]] ചെയ്തിരിക്കുകയും, സാധുവായ ഒരു ഇമെയിൽ വിലാസം താങ്കളുടെ [[Special:Preferences|ക്രമീകരണങ്ങൾ]] താളിൽ സജ്ജീകരിച്ചിരിക്കുകയും വേണം.',
 'emailuser' => 'ഈ ഉപയോക്താവിനു ഇമെയിൽ അയക്കുക',
+'emailuser-title-target' => 'ഈ {{GENDER:$1|ഉപയോക്താവിന്}} ഇമെയിൽ അയയ്ക്കുക',
+'emailuser-title-notarget' => 'ഉപയോക്താവിന് ഇമെയിൽ അയക്കുക',
 'emailpage' => 'ഉപയോക്താവിന് ഇമെയിൽ അയക്കുക',
 'emailpagetext' => 'താഴെ കാണുന്ന ഫോം മറ്റൊരു ഉപയോക്താവിന്‌ ഇമെയിൽ അയക്കാൻ ഉപയോഗിക്കാവുന്നതാണ്.
 [[Special:Preferences|ഉപയോക്താവിന്റെ ക്രമീകരണങ്ങളിൽ]] കൊടുത്തിട്ടുള്ള ഇമെയിൽ വിലാസം "ദാതാവ്" ആയി വരുന്നതാണ്‌, അതുകൊണ്ട് സ്വീകർത്താവിന്‌ താങ്കൾക്ക് നേരിട്ട് മറുപടി അയക്കാൻ കഴിയും.',
@@ -2370,6 +2400,8 @@ $UNWATCHURL
 'rollback' => 'തിരുത്തലുകൾ റോൾബാക്ക് ചെയ്യുക',
 'rollback_short' => 'റോൾബാക്ക്',
 'rollbacklink' => 'റോൾബാക്ക്',
+'rollbacklinkcount' => '{{PLURAL:$1|ഒരു തിരുത്ത്|$1 തിരുത്തുകൾ}} മുൻപ്രാപനം ചെയ്യുക',
+'rollbacklinkcount-morethan' => '{{PLURAL:$1|ഒന്നിലധികം തിരുത്തുകൾ|$1 എണ്ണത്തിലധികം തിരുത്തുകൾ}} മുൻപ്രാപനം ചെയ്യുക',
 'rollbackfailed' => 'റോൾബാക്ക് പരാജയപ്പെട്ടു',
 'cantrollback' => 'തിരുത്തൽ തിരസ്കരിക്കുവാൻ സാധിക്കുകയില്ല. ഒരു ഉപയോക്താവ് മാത്രമാണ് ഈ താളിൽ സം‌ഭാവന ചെയ്തിരിക്കുന്നത്.',
 'alreadyrolled' => '[[:$1]] എന്ന താളിൽ [[User:$2|$2]] ([[User talk:$2|സംവാദം]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) നടത്തിയ തിരുത്തലുകൾ മുൻപ്രാപനം ചെയ്യാൻ സാധിക്കുന്നതല്ല. മറ്റാരോ താൾ തിരുത്തുകയോ മുൻപ്രാപനം ചെയ്യുകയോ ചെയ്തിരിക്കുന്നു.
@@ -2865,6 +2897,7 @@ $1',
 'import-interwiki-templates' => 'എല്ലാ ഫലകങ്ങളും ഉൾപ്പെടുത്തുക',
 'import-interwiki-submit' => 'ഇറക്കുമതി',
 'import-interwiki-namespace' => 'ഉദ്ദിഷ്ട നാമമേഖല:',
+'import-interwiki-rootpage' => 'ലക്ഷ്യമിട്ട മൂലതാൾ (ഐച്ഛികം):',
 'import-upload-filename' => 'പ്രമാണത്തിന്റെ പേര്‌',
 'import-comment' => 'കുറിപ്പ്:',
 'importtext' => 'ദയവായി സ്രോതസ്സ് വിക്കിയിൽ നിന്ന് [[Special:Export|കയറ്റുമതി ഉപകരണം]] ഉപയോഗിച്ച് പ്രമാണം കയറ്റുമതി ചെയ്യുക.
@@ -2900,6 +2933,9 @@ $1',
 'import-error-interwiki' => 'ബാഹ്യ കണ്ണിചേർക്കലിനു (അന്തർവിക്കി) കരുതിവെച്ചിരിക്കുന്ന പേര് ആയതിനാൽ, "$1" എന്ന താൾ ഇറക്കുമതി ചെയ്തില്ല.',
 'import-error-special' => 'താളുകൾ അനുവദിക്കാത്ത പ്രത്യേക നാമമേഖലയിൽ പെടുന്നതായതിനാൽ "$1" എന്ന താൾ ഇറക്കുമതി ചെയ്തില്ല.',
 'import-error-invalid' => 'പേര് അസാധുവായതിനാൽ "$1" എന്ന താൾ ഇറക്കുമതി ചെയ്യില്ല.',
+'import-options-wrong' => 'തെറ്റായ {{PLURAL:$2|ഐച്ഛികം|ഐച്ഛികങ്ങൾ}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'നൽകിയ മൂലതാൾ അസാധുവാണ്.',
+'import-rootpage-nosubpage' => 'മൂലതാളിന്റെ നാമമേഖലയായ "$1" ഉപതാളുകൾ അനുവദിക്കുന്നില്ല.',
 
 # Import log
 'importlogpage' => 'ഇറക്കുമതി പ്രവർത്തനരേഖ',
@@ -3041,16 +3077,34 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" എന്ന താളിന്റെ വിവരങ്ങൾ',
-'pageinfo-header-edits' => 'തിരുത്തലുകൾ',
-'pageinfo-header-watchlist' => 'ശ്രദ്ധിക്കുന്നവ',
-'pageinfo-header-views' => 'എടുത്തുനോക്കലുകൾ',
-'pageinfo-subjectpage' => 'താൾ',
-'pageinfo-talkpage' => 'സം‌വാദം താൾ',
-'pageinfo-watchers' => 'ശ്രദ്ധിക്കുന്നവരുടെ എണ്ണം',
-'pageinfo-edits' => 'ആകെ തിരുത്തലുകൾ',
-'pageinfo-authors' => 'ആകെ രചയിതാക്കളുടെ എണ്ണം',
+'pageinfo-header-basic' => 'അടിസ്ഥാനവിവരങ്ങൾ',
+'pageinfo-header-edits' => 'തിരുത്തൽചരിത്രം',
+'pageinfo-header-restrictions' => 'സംരക്ഷണം',
+'pageinfo-header-properties' => 'താളിന്റെ ഗുണഗണങ്ങൾ',
+'pageinfo-display-title' => 'പ്രദർശിപ്പിക്കേണ്ട തലക്കെട്ട്',
+'pageinfo-default-sort' => 'സ്വതേയുള്ള ക്രമപ്പെടുത്തൽ ചാവി',
+'pageinfo-length' => 'താളിന്റെ നീളം (ബൈറ്റിൽ)',
+'pageinfo-article-id' => 'താളിന്റെ ഐ.ഡി.',
+'pageinfo-robot-policy' => 'തിരച്ചിൽ പ്രവർത്തനത്തിന്റെ സ്ഥിതി',
+'pageinfo-robot-index' => 'സൂചികാവത്കരിക്കാവുന്നത്',
+'pageinfo-robot-noindex' => 'സൂചികാവത്കരിക്കാനാവാത്തത്',
 'pageinfo-views' => 'എടുത്തുനോക്കലുകളുടെ എണ്ണം',
-'pageinfo-viewsperedit' => 'ഓരോ തിരുത്തലിലും ഉള്ള എടുത്തുനോട്ടങ്ങൾ',
+'pageinfo-watchers' => 'താൾ ശ്രദ്ധിക്കുന്നവരുടെ എണ്ണം',
+'pageinfo-redirects-name' => 'ഈ താളിലേക്കുള്ള തിരിച്ചുവിടലുകൾ',
+'pageinfo-subpages-name' => 'ഈ താളിന്റെ ഉപതാളുകൾ',
+'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|ഒരു തിരിച്ചുവിടൽ|$2 തിരിച്ചുവിടലുകൾ}}; {{PLURAL:$3|തിരിച്ചുവിടലല്ലാത്ത ഒരെണ്ണം|തിരിച്ചുവിടലല്ലാത്ത $3}})',
+'pageinfo-firstuser' => 'താളിന്റെ നിർമ്മാതാവ്',
+'pageinfo-firsttime' => 'താൾ നിർമ്മിച്ച ദിവസം',
+'pageinfo-lastuser' => 'ഏറ്റവും പുതിയ രചയിതാവ്',
+'pageinfo-lasttime' => 'അവസാനത്തെ തിരുത്തുനടന്ന ദിവസം',
+'pageinfo-edits' => 'മൊത്തം തിരുത്തുകളുടെ എണ്ണം',
+'pageinfo-authors' => 'ആകെ വ്യത്യസ്തരചയിതാക്കളുടെ എണ്ണം',
+'pageinfo-recent-edits' => 'സമീപകാലത്തെ തിരുത്തുകൾ (കഴിഞ്ഞ $1 കാലയളവിനുള്ളിൽ)',
+'pageinfo-recent-authors' => 'സമീപകാലത്തെ വ്യത്യസ്തരചയിതാക്കളുടെ എണ്ണം',
+'pageinfo-restriction' => 'താൾ സംരക്ഷണം (<code>$1</code>)',
+'pageinfo-magic-words' => 'മാന്ത്രിക{{PLURAL:$1|വാക്ക്|വാക്കുകൾ}} ($1)',
+'pageinfo-hidden-categories' => 'മറഞ്ഞിരിക്കുന്ന {{PLURAL:$1|വർഗ്ഗം|വർഗ്ഗങ്ങൾ}} ($1)',
+'pageinfo-templates' => 'ഉൾപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}} ($1)',
 
 # Skin names
 'skinname-standard' => 'സാർവത്രികം',
@@ -3103,7 +3157,8 @@ $1',
 'file-info-size' => '$1 × $2 പിക്സൽ, പ്രമാണത്തിന്റെ വലിപ്പം: $3, മൈം തരം: $4',
 'file-info-size-pages' => '$1 × $2 പിക്സൽ, പ്രമാണത്തിന്റെ വലിപ്പം: $3, മൈം തരം: $4, {{PLURAL:$5|ഒരു താൾ|$5 താളുകൾ}}',
 'file-nohires' => 'കൂടുതൽ വ്യക്തതയുള്ള ചിത്രം ലഭ്യമല്ല.',
-'svg-long-desc' => 'SVG പ്രമാണം, നാമമാത്രമായ $1 × $2 പിക്സലുകൾ, പ്രമാണത്തിന്റെ വലിപ്പം: $3',
+'svg-long-desc' => 'എസ്.വി.ജി. പ്രമാണം, നാമമാത്രമായ $1 × $2 പിക്സലുകൾ, പ്രമാണത്തിന്റെ വലിപ്പം: $3',
+'svg-long-desc-animated' => 'ചലിക്കുന്ന എസ്.വി.ജി. പ്രമാണം, നാമമാത്രമായ $1 × $2 പിക്സലുകൾ, പ്രമാണത്തിന്റെ വലിപ്പം: $3',
 'show-big-image' => 'പൂർണ്ണ റെസലൂഷൻ',
 'show-big-image-preview' => 'ഈ പ്രിവ്യൂവിന്റെ വലിപ്പം: $1.',
 'show-big-image-other' => 'മറ്റ് {{PLURAL:$2|റെസലൂഷൻ|റെസലൂഷനുകൾ}}: $1.',
@@ -3113,6 +3168,8 @@ $1',
 'file-info-png-looped' => 'പുനരാവർത്തിതം',
 'file-info-png-repeat' => '{{PLURAL:$1|ഒരു തവണ|$1 തവണ}} പ്രവർത്തിപ്പിച്ചു',
 'file-info-png-frames' => '{{PLURAL:$1|ഒരു ഫ്രെയിം|$1 ഫ്രെയിം}}',
+'file-no-thumb-animation' => "'''ശ്രദ്ധിക്കുക: സാങ്കേതികപരിമിതികൾ മൂലം, ഈ പ്രമാണത്തിന്റെ ലഘുചിത്രങ്ങൾ ചലനാത്മകമല്ല.'''",
+'file-no-thumb-animation-gif' => "'''കുറിപ്പ്: സാങ്കേതികമായ പരിമിതികളാൽ, ഇങ്ങനെയുള്ള ഉയർന്ന റെസലൂഷൻ ജി.ഐ.എഫ്. ചിത്രങ്ങളുടെ ലഘുചിത്രങ്ങൾ ചലിക്കുന്നതായിരിക്കുകയില്ല.'''",
 
 # Special:NewFiles
 'newimages' => 'പുതിയ പ്രമാണങ്ങളുടെ ചിത്രശാല',
@@ -3560,7 +3617,7 @@ $1',
 'confirmemail_noemail' => '[[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളുടെ കൂടെ]] സാധുവായൊരു ഇ-മെയിൽ വിലാസം സജ്ജീകരിച്ചിട്ടില്ല.',
 'confirmemail_text' => '{{SITENAME}} സം‌രംഭത്തിൽ ഇ-മെയിൽ സൗകര്യം ഉപയോഗിക്കണമെങ്കിൽ താങ്കൾ താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിന്റെ സാധുത തെളിയിച്ചിരിക്കണം. താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിലേക്ക് സ്ഥിരീകരണ മെയിൽ അയക്കുവാൻ താഴെയുള്ള ബട്ടൺ അമർത്തുക. താങ്കൾക്ക് അയക്കുന്ന ഇ-മെയിലിൽ ഒരു സ്ഥിരീകരണ കോഡ് ഉണ്ട്. ആ കോഡിൽ അമർത്തിയാൽ താങ്കളുടെ വിലാസത്തിന്റെ സാധുത തെളിയിക്കപ്പെടും.',
 'confirmemail_pending' => 'താങ്കളുടെ അംഗത്വം ഈ അടുത്ത് ഉണ്ടാക്കിയതാണെങ്കിൽ,  ഒരു സ്ഥിരീകരണ കോഡ് താങ്കൾക്ക് ഇ-മെയിൽ ചെയ്തിട്ടുണ്ട്.  പുതിയ സ്ഥിരീകരണ കോഡ് ആവശ്യപ്പെടാൻ ശ്രമിക്കുന്നതിനു മുൻപ് ആദ്യത്തെ സ്ഥിരീകരണ കോഡിനായി കുറച്ച് സമയം കാത്തിരിക്കൂ.',
-'confirmemail_send' => 'സ്ഥിരീകരണ കോഡ് (confirmation code) മെയിൽ ചെയ്യുക',
+'confirmemail_send' => 'സ്ഥിരീകരണ കോഡ്  ഇമെയിലിൽ അയയ്ക്കുക',
 'confirmemail_sent' => 'സ്ഥിരീകരണ ഇ-മെയിൽ അയച്ചിരിക്കുന്നു.',
 'confirmemail_oncreate' => 'ഒരു സ്ഥിരീകരണ കോഡ് താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിലേക്ക് അയച്ചിട്ടുണ്ട്.
 ലോഗിൻ ചെയ്യുന്നതിനു ഈ കോഡ് ആവശ്യമില്ല. പക്ഷെ വിക്കിയിൽ ഇ-മെയിലുമായി ബന്ധപ്പെട്ട സേവനങ്ങൾ ഉപയോഗിക്കുന്നതിനു മുൻപ് പ്രസ്തുത കോഡ് ഉപയോഗിച്ച് ഇ-മെയിൽ സ്ഥിരീകരിച്ചിരിക്കണം.',
@@ -3778,7 +3835,7 @@ $5
 * <span class="mw-specialpagecached">പ്രാദേശികമായി സംഭരിച്ചുപയോഗിക്കുന്ന പ്രത്യേക താളുകൾ.</span>',
 'specialpages-group-maintenance' => 'പരിചരണം ആവശ്യമായവ',
 'specialpages-group-other' => 'മറ്റു പ്രത്യേക താളുകൾ',
-'specialpages-group-login' => 'à´ªàµ\8dà´°à´µàµ\87ശിà´\95àµ\8dà´\95àµ\81à´\95 / à´\85à´\82à´\97à´¤àµ\8dà´µà´\82 à´\8eടുക്കുക',
+'specialpages-group-login' => 'à´ªàµ\8dà´°à´µàµ\87ശിà´\95àµ\8dà´\95àµ\81à´\95 / à´\85à´\82à´\97à´¤àµ\8dവമàµ\86ടുക്കുക',
 'specialpages-group-changes' => 'പുതിയ മാറ്റങ്ങളും രേഖകളും',
 'specialpages-group-media' => 'മീഡിയ രേഖകളും അപ്‌ലോഡുകളും',
 'specialpages-group-users' => 'ഉപയോക്താക്കളും അവകാശങ്ങളും',
@@ -3913,9 +3970,12 @@ $5
 'api-error-empty-file' => 'താങ്കൾ സമർപ്പിച്ച പ്രമാണം ശൂന്യമാണ്.',
 'api-error-emptypage' => 'ശൂന്യമായ പുതിയ താളുകൾ സൃഷ്ടിക്കുന്നത് അനുവദിക്കുന്നില്ല.',
 'api-error-fetchfileerror' => 'ആന്തരിക പിഴവ്: പ്രമാണം ശേഖരിച്ചുകൊണ്ടിരുന്നപ്പോൾ എന്തോ പിഴവുണ്ടായി.',
+'api-error-fileexists-forbidden' => '"$1" എന്ന പേരിൽ ഒരു പ്രമാണം മുമ്പേയുണ്ട്, അതിന്റെ മുകളിലായി സൃഷ്ടിക്കാനാകില്ല.',
+'api-error-fileexists-shared-forbidden' => '"$1" എന്ന പേരിൽ ഒരു പ്രമാണം പങ്ക് വെച്ചുപയോഗിക്കുന്ന ശേഖരത്തിൽ മുമ്പേയുണ്ട്, അതിനു മുകളിലായി സൃഷ്ടിക്കാനാകില്ല.',
 'api-error-file-too-large' => 'താങ്കൾ സമർപ്പിച്ച പ്രമാണം വളരെ വലുതാണ്.',
 'api-error-filename-tooshort' => 'പ്രമാണത്തിന്റെ പേര് വളരെച്ചെറുതാണ്.',
 'api-error-filetype-banned' => 'ഈ തരത്തിലുള്ള പ്രമാണങ്ങൾ നിരോധിച്ചിരിക്കുന്നു.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|അനുവദനീയമല്ലാത്ത തരം പ്രമാണമാണ്‌|അനുവദനീയമല്ലാത്ത തരങ്ങളിലുള്ള പ്രമാണങ്ങളാണ്}}. $2 {{PLURAL:$3|തരത്തിലുള്ള പ്രമാണം|തരങ്ങളിലുള്ള പ്രമാണങ്ങൾ}} ആണ് അഭിലഷണീയം.',
 'api-error-filetype-missing' => 'പ്രമാണത്തിന് എക്സ്‌റ്റെൻഷൻ ഇല്ല.',
 'api-error-hookaborted' => 'താങ്കൾ വരുത്താൻ ശ്രമിച്ച മാറ്റം ഒരു അനുബന്ധത്തിന്റെ കൊളുത്തിനാൽ റദ്ദാക്കപ്പെട്ടു.',
 'api-error-http' => 'ആന്തരിക പിഴവ്: സെർവറുമായി ബന്ധപ്പെടാൻ കഴിയുന്നില്ല.',
index 614cd34..e6b5d5f 100644 (file)
@@ -49,7 +49,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Сүүлийн өөрчлөлтүүдэд манагдсан засваруудыг нуух',
 'tog-newpageshidepatrolled' => 'Шинэ хуудсуудын жагсаалтаас манагдаж буй хуудсуудыг нуух',
 'tog-extendwatchlist' => 'Хянах жагсаалтаа сүүлийн л засваруудыг бус бүх засварыг харуулахаар томруулах',
-'tog-usenewrc' => 'Сүүлийн өөрчлөлтүүдийн сайжруулсан хэлбэрийг ашиглах (ЖаваСкрипт хэрэглэгдэнэ)',
+'tog-usenewrc' => 'Сүүлийн үед хуудсанд хийсэн Грүп өөрчлөлтүүд (ЖаваСкрипт хэрэглэгдэнэ)',
 'tog-numberheadings' => 'Гарчигуудыг автоматаар дэс дугаарлах',
 'tog-showtoolbar' => 'Засварлах түүлбарыг үзүүлэх (ЖаваСкрипт)',
 'tog-editondblclick' => 'Хоёр удаа дараад хуудсыг засварлах (ЖаваСкрипт)',
@@ -1445,20 +1445,20 @@ $1 тэмдэгтээс богино байх ёстой.',
 'emptyfile' => 'Таны оруулсан файл хоосон байх шиг байна. Энэ нь файлын нэрийг алдаатай оруулснаас болсон байж магадгүй.
 Энэ файлыг үнэхээр оруулахыг хүсэж байгаа эсэхээ шалгана уу.',
 'windows-nonascii-filename' => 'Энэ вики файлын нэрэнд тусгай тэмдэгт хэрэглэхийг хориглож байна.',
-'fileexists' => "Ийм нэртэй файл байна. Та үүнийг өөрчлөхийг хүсэж байгаадаа итгэлгүй байвал '''<tt>[[:$1]]</tt>'''-г шалгаж үзнэ үү.
-[[$1|thumb]]",
-'filepageexists' => "Энэ файлын тайлбар хуудас '''<tt>[[:$1]]</tt>'''-д аль хэдийнээ үүсгэгдсэн байна. Харин энэ нэртэй файл байхгүй байна.
+'fileexists' => 'Ийм нэртэй файл байна. Та үүнийг өөрчлөхийг хүсэж байгаадаа итгэлгүй байвал <strong>[[:$1]]</strong>-г шалгаж үзнэ үү.
+[[$1|thumb]]',
+'filepageexists' => 'Энэ файлын тайлбар хуудас <strong>[[:$1]]</strong>-д аль хэдийнээ үүсгэгдсэн байна. Харин энэ нэртэй файл байхгүй байна.
 Таны оруулсан файлын тухай товч агуулга нь тайлбарын хуудсанд гарахгүй.
-Өөрийн оруулсан файлын тухай товч агуулгыг тэнд тавихын тулд та гар аргаар засварлах хэрэгтэй",
-'fileexists-extension' => "Ойролцоо нэртэй файл байна: [[$2|thumb]]
-* Оруулж байгаа файлын нэр: '''<tt>[[:$1]]</tt>'''
-* Оршиж буй файлын нэр: '''<tt>[[:$2]]</tt>'''
-Өөр нэр сонгоно уу.",
+Өөрийн оруулсан файлын тухай товч агуулгыг тэнд тавихын тулд та гар аргаар засварлах хэрэгтэй',
+'fileexists-extension' => 'Ойролцоо нэртэй файл байна: [[$2|thumb]]
+* Оруулж байгаа файлын нэр: <strong>[[:$1]]</strong>
+* Оршиж буй файлын нэр: <strong>[[:$2]]</strong>
+Өөр нэр сонгоно уу.',
 'fileexists-thumbnail-yes' => "Энэ файл хэмжээг нь багасгасан зураг юм шиг байна ''(thumbnail)''.
 [[$1|thumb]]
-'''<tt>[[:$1]]</tt>''' файлыг шалгана уу.
+<strong>[[:$1]]</strong> файлыг шалгана уу.
 Хэрэв шалгагдсан файл ердийн хэмжээний ижил зураг бол дахин жижиг зургийг оруулах хэрэггүй.",
-'file-thumbnail-no' => "Файлын нэр '''<tt>$1</tt>'''-р эхэлж байна.
+'file-thumbnail-no' => "Файлын нэр <strong>$1</strong>-р эхэлж байна.
 Хэмжээг нь багасгасан зураг юм шиг байна ''(thumbnail)''.
 Таньд энэ зурагны чанар сайтай хувилбар байвал түүнийгээ оруулж, байхгүй бол файлын нэрийг өөрчилнө үү.",
 'fileexists-forbidden' => 'Ийм нэртэй файл аль хэдийнээ байгаа бөгөөд дэtрээс нь дарж бичих боломжгүй байна.
@@ -1685,7 +1685,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 # MIME search
 'mimesearch' => 'MIME хайлт',
 'mimesearch-summary' => 'Энэ хуудас MIME-төрлөөр нь файлуудыг шүүх боломжийг олгодог.
-Оруулалт: агуулгын төрөл/доод төрөл, ж.нь. <tt>image/jpeg</tt>.',
+Оруулалт: агуулгын төрөл/доод төрөл, ж.нь. <code>image/jpeg</code>.',
 'mimetype' => 'MIME төрөл:',
 'download' => 'Татаж авах',
 
@@ -1869,7 +1869,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'linksearch-ok' => 'Хайх',
 'linksearch-text' => '"*.wikipedia.org" зэрэг орлуулагч тэмдэгт хэрэглэх боломжтой.<br />
 Дор хаяж дээд түвшиний домайн хэрэгтэй байна, жишээ нь "*.org".<br />
-Дэмжигдэх протоколууд : <tt>$1</tt> (эдгээрээс алийг нь ч хайлтад бүү оруул).',
+Дэмжигдэх протоколууд : <code>$1</code> (эдгээрээс алийг нь ч хайлтад бүү оруул).',
 'linksearch-line' => '$1 нь $2-с холбогдсон',
 'linksearch-error' => 'Орлуулагч тэмдэгт хост нэрийн эхлэлд л гарах боломжтой.',
 
@@ -2656,14 +2656,10 @@ $1',
 # Info page
 'pageinfo-title' => '"$1" - хуудасны мэдээлэл',
 'pageinfo-header-edits' => 'Өөрчлөлтүүд',
-'pageinfo-header-views' => 'Харагдац',
-'pageinfo-subjectpage' => 'Хуудас',
-'pageinfo-talkpage' => 'Ярианы хуудас',
+'pageinfo-views' => 'Харагдацуудын тоо',
 'pageinfo-watchers' => 'Хянагчдын тоо',
 'pageinfo-edits' => 'Засваруудын тоо',
 'pageinfo-authors' => 'Тус тусын зохиогчидын тоо',
-'pageinfo-views' => 'Харагдацуудын тоо',
-'pageinfo-viewsperedit' => 'Засвар тус бүрийн харагдац',
 
 # Patrolling
 'markaspatrolleddiff' => 'Хяналтанд авъя',
index 81c228d..f0ade8f 100644 (file)
@@ -28,6 +28,7 @@
  * @author Rahuldeshmukh101
  * @author Rdeshmuk
  * @author Sankalpdravid
+ * @author Sau6402
  * @author Shantanoo
  * @author Shreewiki
  * @author Shreyas19
@@ -162,143 +163,143 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#पुनर्निर्देशन', '#पुर्ननिर्देशन', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__अनुक्रमणिकानको__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__प्रदर्शननको__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__अनुक्रमणिकाहवीच__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__अनुक्रमणिका__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__असंपादनक्षम__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__शीर्षकनाही__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'सद्यमहिना', 'सद्यमहिना२', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'सद्यमहिना१', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'सद्यमहिनानाव', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'सद्यमहिनासाधारण', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'सद्यमहिनासंक्षीप्त', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'सद्यदिवस', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'सद्यदिवस२', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'सद्यदिवसनाव', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'सद्यवर्ष', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'सद्यवेळ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'सद्यतास', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'स्थानिकमहिना', 'स्थानिकमहिना२', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'स्थानिकमहिना१', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'स्थानिकमहिनानाव', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'स्थानिकमहिनासाधारण', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'स्थानिकमहिनासंक्षीप्त', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'स्थानिकदिवस', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'स्थानिकदिवस२', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'स्थानिकदिवसनाव', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'स्थानिकवर्ष', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'स्थानिकवेळ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'स्थानिकतास', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'पानसंख्या', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'लेखसंख्या', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'संचिकासंख्या', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'सदस्यसंख्या', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'सक्रीयसदस्यसंख्या', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'संपादनसंख्या', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'धडकसंख्या', 'प्रेक्षासंख्या', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'लेखनाव', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'लेखानावव', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'नामविश्व', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'नामविश्वा', 'नामविश्वाचे', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'चर्चाविश्व', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'चर्चाविश्वा', 'चर्चाविश्वाचे', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'विषयविश्व', 'लेखविश्व', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'विषयविश्वा', 'लेखविश्वा', 'विषयविश्वाचे', 'लेखविश्वाचे', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'पूर्णलेखनाव', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'पूर्णलेखनावे', 'अंशदुवा', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'उपपाननाव', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'उपपाननावे', 'उपपाननावाचे', 'उपौंशदुवा', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'मूळपाननाव', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'मूळपाननावे', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'चर्चापाननाव', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'चर्चापाननावे', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'विषयपाननाव', 'लेखपाननाव', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'विषयपाननावे', 'लेखपाननावे', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'संदेश:', 'निरोप:', 'MSG:' ),
-       'subst'                   => array( '0', 'पर्याय:', 'समाविष्टी:', 'अबाह्य:', 'निरकंसबिंब:', 'कंसत्याग:', 'साचाहिन:', 'साचान्तर:', 'साचापरिस्फोट:', 'साचोद्घाटन:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'संदेशनवा:', 'निरोपनवा:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'इवलेसे', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'इवलेसे=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'उजवे', 'right' ),
-       'img_left'                => array( '1', 'डावे', 'left' ),
-       'img_none'                => array( '1', 'कोणतेचनाही', 'नन्ना', 'none' ),
-       'img_width'               => array( '1', '$1अंश', '$1कणी', '$1पक्ष', '$1px' ),
-       'img_center'              => array( '1', 'मध्यवर्ती', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'चौकट', 'फ़्रेम', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'विनाचौकट', 'विनाफ़्रेम', 'frameless' ),
-       'img_page'                => array( '1', 'पान=$1', 'पान $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'उभा', 'उभा=$1', 'उभा $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'सीमा', 'border' ),
-       'img_baseline'            => array( '1', 'तळरेषा', 'आधाररेषा', 'baseline' ),
-       'img_sub'                 => array( '1', 'अधो', 'sub' ),
-       'img_super'               => array( '1', 'उर्ध्व', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'अत्यूच्च', 'top' ),
-       'img_text_top'            => array( '1', 'मजकूर-शीर्ष', 'शीर्ष-मजकूर', 'text-top' ),
-       'img_middle'              => array( '1', 'मध्य', 'middle' ),
-       'img_bottom'              => array( '1', 'तळ', 'बूड', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'मजकुरतळ', 'text-bottom' ),
-       'img_link'                => array( '1', 'दुवा=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'अल्ट=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'इन्ट:', 'INT:' ),
-       'sitename'                => array( '1', 'संकेतस्थळनाव', 'SITENAME' ),
-       'ns'                      => array( '0', 'नावि:', 'NS:' ),
-       'nse'                     => array( '0', 'नाविअरिक्त:', 'नाव्यारिक्त:', 'नाव्याख:', 'NSE:' ),
-       'localurl'                => array( '0', 'स्थानिकस्थळ:', 'स्थानिकसंकेतस्थळ:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'स्थानिकस्थली:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'विदादाता', 'SERVER' ),
-       'servername'              => array( '0', 'विदादातानाव', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'संहीतामार्ग', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'व्याकरण:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'लिंग:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__विनाशीर्षकबदल__', '__विनाशीब__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__विनामजकुरबदल__', '__विनामब__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'सद्यआठवडा', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'सद्यउतरण', 'सद्यउतार', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'स्थानिकआठवडा', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'स्थानिकउतरण', 'स्थानिकउतार', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'आवृत्तीक्र्मांक', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'आवृत्तीदिन', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'आवृत्तीदिन२', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'आवृत्तीमास', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'आवृत्तीवर्ष', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'आवृत्तीमुद्रा', 'आवृत्तीठसा', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'आवृत्तीसदस्य', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'बहुवचन:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'संपूर्णसंस्थळ', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'संपूर्णसंस्थली:', 'संपूर्णसंस्थळी:', 'FULLURLE:' ),
-       'raw'                     => array( '0', 'कच्चे:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'शीर्षकदाखवा', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'ॠ', 'R' ),
-       'newsectionlink'          => array( '1', '__नवविभागदुवा__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__विनानवविभागदुवा__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'सद्यआवृत्ती', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'संकेतस्थलीआंग्ल्संकेत:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'नांगरआंग्लसंकेत', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'सद्यकालमुद्रा', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'स्थानिककालमुद्रा', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'दिशाचिन्ह', 'दिशादर्शक', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#भाषा:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'मसुदाभाषा', 'मजकुरभाषा', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'नामविश्वातीलपाने:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'प्रचालकसंख्या', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'क्रमपद्धती', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'डावाभरीव', 'भरीवडावा', 'PADLEFT' ),
-       'padright'                => array( '0', 'उजवाभरीव', 'भरीवउजवा', 'PADRIGHT' ),
-       'special'                 => array( '0', 'विशेष', 'special' ),
-       'defaultsort'             => array( '1', 'अविचलवर्ग:', 'अविचलवर्गकळ:', 'अविचलवर्गवर्गीकरण:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'संचिकामार्ग:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'खूण', 'खूणगाठ', 'tag' ),
-       'hiddencat'               => array( '1', '__वर्गलपवा__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'वर्गातीलपाने', 'वर्गीतपाने', 'श्रेणीतपाने', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'पानक्षमता', 'PAGESIZE' ),
-       'index'                   => array( '1', '__क्रमीत__', '__अनुक्रमीत__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__विनाक्रमीत__', '__विनाअनुक्रमीत__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'गटक्रमांक', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__अविचलपुर्ननिर्देश__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'सुरक्षास्तर', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'दिनांकनपद्धती', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#पुनर्निर्देशन', '#पुर्ननिर्देशन', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__अनुक्रमणिकानको__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__प्रदर्शननको__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__अनुक्रमणिकाहवीच__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__अनुक्रमणिका__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__असंपादनक्षम__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__शीर्षकनाही__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'सद्यमहिना', 'सद्यमहिना२', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'सद्यमहिना१', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'सद्यमहिनानाव', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'सद्यमहिनासाधारण', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'सद्यमहिनासंक्षीप्त', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'सद्यदिवस', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'सद्यदिवस२', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'सद्यदिवसनाव', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'सद्यवर्ष', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'सद्यवेळ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'सद्यतास', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'स्थानिकमहिना', 'स्थानिकमहिना२', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'स्थानिकमहिना१', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'स्थानिकमहिनानाव', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'स्थानिकमहिनासाधारण', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'स्थानिकमहिनासंक्षीप्त', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'स्थानिकदिवस', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'स्थानिकदिवस२', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'स्थानिकदिवसनाव', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'स्थानिकवर्ष', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'स्थानिकवेळ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'स्थानिकतास', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'पानसंख्या', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'लेखसंख्या', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'संचिकासंख्या', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'सदस्यसंख्या', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'सक्रीयसदस्यसंख्या', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'संपादनसंख्या', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'धडकसंख्या', 'प्रेक्षासंख्या', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'लेखनाव', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'लेखानावव', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'नामविश्व', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'नामविश्वा', 'नामविश्वाचे', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'चर्चाविश्व', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'चर्चाविश्वा', 'चर्चाविश्वाचे', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'विषयविश्व', 'लेखविश्व', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'विषयविश्वा', 'लेखविश्वा', 'विषयविश्वाचे', 'लेखविश्वाचे', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'पूर्णलेखनाव', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'पूर्णलेखनावे', 'अंशदुवा', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'उपपाननाव', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'उपपाननावे', 'उपपाननावाचे', 'उपौंशदुवा', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'मूळपाननाव', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'मूळपाननावे', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'चर्चापाननाव', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'चर्चापाननावे', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'विषयपाननाव', 'लेखपाननाव', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'विषयपाननावे', 'लेखपाननावे', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'संदेश:', 'निरोप:', 'MSG:' ),
+       'subst'                     => array( '0', 'पर्याय:', 'समाविष्टी:', 'अबाह्य:', 'निरकंसबिंब:', 'कंसत्याग:', 'साचाहिन:', 'साचान्तर:', 'साचापरिस्फोट:', 'साचोद्घाटन:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'संदेशनवा:', 'निरोपनवा:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'इवलेसे', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'इवलेसे=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'उजवे', 'right' ),
+       'img_left'                  => array( '1', 'डावे', 'left' ),
+       'img_none'                  => array( '1', 'कोणतेचनाही', 'नन्ना', 'none' ),
+       'img_width'                 => array( '1', '$1अंश', '$1कणी', '$1पक्ष', '$1px' ),
+       'img_center'                => array( '1', 'मध्यवर्ती', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'चौकट', 'फ़्रेम', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'विनाचौकट', 'विनाफ़्रेम', 'frameless' ),
+       'img_page'                  => array( '1', 'पान=$1', 'पान $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'उभा', 'उभा=$1', 'उभा $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'सीमा', 'border' ),
+       'img_baseline'              => array( '1', 'तळरेषा', 'आधाररेषा', 'baseline' ),
+       'img_sub'                   => array( '1', 'अधो', 'sub' ),
+       'img_super'                 => array( '1', 'उर्ध्व', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'अत्यूच्च', 'top' ),
+       'img_text_top'              => array( '1', 'मजकूर-शीर्ष', 'शीर्ष-मजकूर', 'text-top' ),
+       'img_middle'                => array( '1', 'मध्य', 'middle' ),
+       'img_bottom'                => array( '1', 'तळ', 'बूड', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'मजकुरतळ', 'text-bottom' ),
+       'img_link'                  => array( '1', 'दुवा=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'अल्ट=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'इन्ट:', 'INT:' ),
+       'sitename'                  => array( '1', 'संकेतस्थळनाव', 'SITENAME' ),
+       'ns'                        => array( '0', 'नावि:', 'NS:' ),
+       'nse'                       => array( '0', 'नाविअरिक्त:', 'नाव्यारिक्त:', 'नाव्याख:', 'NSE:' ),
+       'localurl'                  => array( '0', 'स्थानिकस्थळ:', 'स्थानिकसंकेतस्थळ:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'स्थानिकस्थली:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'विदादाता', 'SERVER' ),
+       'servername'                => array( '0', 'विदादातानाव', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'संहीतामार्ग', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'व्याकरण:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'लिंग:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__विनाशीर्षकबदल__', '__विनाशीब__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__विनामजकुरबदल__', '__विनामब__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'सद्यआठवडा', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'सद्यउतरण', 'सद्यउतार', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'स्थानिकआठवडा', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'स्थानिकउतरण', 'स्थानिकउतार', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'आवृत्तीक्र्मांक', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'आवृत्तीदिन', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'आवृत्तीदिन२', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'आवृत्तीमास', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'आवृत्तीवर्ष', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'आवृत्तीमुद्रा', 'आवृत्तीठसा', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'आवृत्तीसदस्य', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'बहुवचन:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'संपूर्णसंस्थळ', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'संपूर्णसंस्थली:', 'संपूर्णसंस्थळी:', 'FULLURLE:' ),
+       'raw'                       => array( '0', 'कच्चे:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'शीर्षकदाखवा', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'ॠ', 'R' ),
+       'newsectionlink'            => array( '1', '__नवविभागदुवा__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__विनानवविभागदुवा__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'सद्यआवृत्ती', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'संकेतस्थलीआंग्ल्संकेत:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'नांगरआंग्लसंकेत', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'सद्यकालमुद्रा', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'स्थानिककालमुद्रा', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'दिशाचिन्ह', 'दिशादर्शक', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#भाषा:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'मसुदाभाषा', 'मजकुरभाषा', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'नामविश्वातीलपाने:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'प्रचालकसंख्या', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'क्रमपद्धती', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'डावाभरीव', 'भरीवडावा', 'PADLEFT' ),
+       'padright'                  => array( '0', 'उजवाभरीव', 'भरीवउजवा', 'PADRIGHT' ),
+       'special'                   => array( '0', 'विशेष', 'special' ),
+       'defaultsort'               => array( '1', 'अविचलवर्ग:', 'अविचलवर्गकळ:', 'अविचलवर्गवर्गीकरण:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'संचिकामार्ग:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'खूण', 'खूणगाठ', 'tag' ),
+       'hiddencat'                 => array( '1', '__वर्गलपवा__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'वर्गातीलपाने', 'वर्गीतपाने', 'श्रेणीतपाने', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'पानक्षमता', 'PAGESIZE' ),
+       'index'                     => array( '1', '__क्रमीत__', '__अनुक्रमीत__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__विनाक्रमीत__', '__विनाअनुक्रमीत__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'गटक्रमांक', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__अविचलपुर्ननिर्देश__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'सुरक्षास्तर', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'दिनांकनपद्धती', 'formatdate', 'dateformat' ),
 );
 
 $digitTransformTable = array(
@@ -958,6 +959,7 @@ $2',
 'updated' => '(बदल झाला आहे.)',
 'note' => "'''सूचना:'''",
 'previewnote' => "'''लक्षात ठेवा की ही फक्त झलक आहे''', बदल अजून जतन करण्यात आलेले नाहीत.",
+'continue-editing' => 'संपादन चालु राहुदे',
 'previewconflict' => 'वरील संपादन क्षेत्रातील मजकूर जतन केल्यावर या झलकेप्रमाणे दिसेल.',
 'session_fail_preview' => "'''क्षमस्व! सत्र विदेच्या क्षयामुळे आम्ही तुमची संपादन प्रक्रीया पार पाडू शकलो नाही.कृपया पुन्हा प्रयत्न करा.जर एवढ्याने काम झाले नाही तर सदस्य खात्यातून बाहेर पडून पुन्हा प्रवेश करून पहा.'''",
 'session_fail_preview_html' => "'''क्षमस्व! सत्र विदेच्या क्षयामुळे आम्ही तुमची संपादन प्रक्रीया पार पाडू शकलो नाही.'''
@@ -970,6 +972,7 @@ $2',
 असे कदाचित तुम्ही अनामिक proxy वापरत असल्याने होऊ शकते.'''",
 'edit_form_incomplete' => '”’तुमच्या संपादनाचा काही भाग सर्व्हरपर्यंत पोचला नाही; तुमचे संपादन पूर्ण आहे का याची पुन्हा खात्री करा.',
 'editing' => '$1 चे संपादन होत आहे.',
+'creating' => '$1 ची निर्मिती सुरु आहे',
 'editingsection' => '$1 (विभाग) संपादन',
 'editingcomment' => '$1 चे संपादन (प्रतिक्रिया)',
 'editconflict' => 'वादग्रस्त संपादन: $1',
@@ -1219,6 +1222,8 @@ $1",
 
 # Diffs
 'history-title' => '"$1" चा संपादन इतिहास',
+'difference-title' => '"$1" च्या विविध उजळण्या',
+'difference-title-multipage' => '"$1" व "$2" या पानान मधला फरक',
 'difference-multipage' => '(पानांमधील फरक)',
 'lineno' => 'ओळ $1:',
 'compareselectedversions' => 'निवडलेल्या आवृत्त्यांमधील बदल पहा',
@@ -1313,6 +1318,7 @@ $1",
 'prefs-beta' => 'बीटा चेहेरेपट्टी',
 'prefs-datetime' => 'दिनांक आणि वेळ',
 'prefs-labs' => 'प्रायोगिक वैशिष्ट्ये',
+'prefs-user-pages' => 'सदस्य पान',
 'prefs-personal' => 'सदस्य व्यक्तिरेखा',
 'prefs-rc' => 'अलीकडील बदल',
 'prefs-watchlist' => 'नित्य पहाण्याची सूची',
@@ -1675,19 +1681,19 @@ $1",
 'largefileserver' => 'सेवा संगणकावर (सर्वर) निर्धारित केलेल्या आकारापेक्षा या संचिकेचा आकार मोठा आहे.',
 'emptyfile' => 'चढवलेली संचिका रिकामी आहे. हे संचिकानाम चुकीचे लिहिल्याने असू शकते. कृपया तुम्हाला हीच संचिका चढवायची आहे का ते तपासा.',
 'windows-nonascii-filename' => 'या विकीवर विशेष चिन्हातील फाईलनांवाचा आधार घेता येणार नाही.',
-'fileexists' => "या नावाची संचिका आधीच अस्तित्वात आहे, कृपया ही संचिका बदलण्याबद्दल तुम्ही साशंक असाल तर '''<tt>[[:$1]]</tt>''' तपासा.
-[[$1|thumb]]",
-'filepageexists' => "या नावाचे एक माहितीपृष्ठ (संचिका नव्हे) अगोदरच अस्तित्त्वात आहे. कृपया जर आपणांस त्यात बदल करायचा नसेल तर '''<tt>[[:$1]]</tt>''' तपासा.
-[[$1|thumb]]",
-'fileexists-extension' => "या नावाची संचिका अस्तित्वात आहे: [[$2|thumb]]
-* चढवित असलेल्या संचिकेचे नाव: '''<tt>[[:$1]]</tt>'''
-* अस्तित्वात असलेल्या संचिकेचे नाव: '''<tt>[[:$2]]</tt>'''
-कृपया दुसरे नाव निवडा.",
+'fileexists' => 'या नावाची संचिका आधीच अस्तित्वात आहे, कृपया ही संचिका बदलण्याबद्दल तुम्ही साशंक असाल तर <strong>[[:$1]]</strong> तपासा.
+[[$1|thumb]]',
+'filepageexists' => 'या नावाचे एक माहितीपृष्ठ (संचिका नव्हे) अगोदरच अस्तित्त्वात आहे. कृपया जर आपणांस त्यात बदल करायचा नसेल तर <strong>[[:$1]]</strong> तपासा.
+[[$1|thumb]]',
+'fileexists-extension' => 'या नावाची संचिका अस्तित्वात आहे: [[$2|thumb]]
+* चढवित असलेल्या संचिकेचे नाव: <strong>[[:$1]]</strong>
+* अस्तित्वात असलेल्या संचिकेचे नाव: <strong>[[:$2]]</strong>
+कृपया दुसरे नाव निवडा.',
 'fileexists-thumbnail-yes' => "आपण चढवित असलेली संचिका ही मोठ्या चित्राची इवलीशी प्रतिकृती ''(thumbnail)'' असण्याची शक्यता आहे. [[$1|इवलेसे]]
-कृपया '''<tt>[[:$1]]</tt>''' ही संचिका तपासा.
+कृपया <strong>[[:$1]]</strong> ही संचिका तपासा.
 जर तपासलेली संचिका ही याच आकाराची असेल तर नवीन प्रतिकृती चढविण्याची गरज नाही.",
-'file-thumbnail-no' => "या संचिकेचे नाव '''<tt>$1</tt>''' पासून सुरू होत आहे. ही कदाचित झलक असू शकते.
-जर तुमच्या कडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.",
+'file-thumbnail-no' => 'या संचिकेचे नाव <strong>$1</strong> पासून सुरू होत आहे. ही कदाचित झलक असू शकते.
+जर तुमच्या कडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.',
 'fileexists-forbidden' => 'या नावाची संचिका अगोदरच अस्तित्त्वात आहे; कृपया पुन्हा मागे जाऊन ही संचिका नवीन नावाने चढवा.
 [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'हे नाव असलेली एक संचिका शेअर्ड संचिका कोशात आधी पासून आहे; कृपया परत फिरा आणि नविन(वेगळ्या) नावाने ही संचिका पुन्हा चढवा.[[File:$1|thumb|center|$1]]',
@@ -1755,7 +1761,8 @@ $1',
 'backend-fail-writetemp' => 'तात्पुरत्या संचिकेत लिहिणे जमले नाही.',
 'backend-fail-closetemp' => 'तात्पुरती संचिका बंद करणे जमले नाही.',
 'backend-fail-read' => '$1 ही संचिका वाचता आली नाही.',
-'backend-fail-create' => '$1 ही संचिका बनवता आली नाही.',
+'backend-fail-create' => '$1 ही संचिका लिहिता आली नाही.',
+'backend-fail-maxsize' => '$1 ही संचिका लिहिता आली नाही कारण ती {{PLURAL:$2|one byte|$2 bytes}} पेक्षा मोठी आहे.',
 'backend-fail-readonly' => 'पार्श्वभौमीक साठवण "$1" “फक्त वाचा” असे आहे. दिलेले कारण "$2" आहे.',
 'backend-fail-synced' => 'अंतर्गत पार्श्वभौमीक साठवणीतील फाईल "$1" विसंगत आहे.',
 'backend-fail-connect' => 'पार्श्वभौमीक साठा "$1"शी संबंध जोडू शकत नाही.',
@@ -1772,6 +1779,7 @@ $1',
 'lockmanager-fail-releaselock' => '"$1" साठी लॉक उघडू शकत नाही',
 'lockmanager-fail-db-bucket' => '$1 बास्केट मधील कुलूप बंद डेटाबेसशी पुरेसा संपर्क होवू शकत नाही',
 'lockmanager-fail-db-release' => '"$1" डाटाबेस वरील लॉक उघडू शकत नाही',
+'lockmanager-fail-svr-acquire' => 'सर्व्हर "$1" वरील कुलूप उघडू शकत नाही',
 'lockmanager-fail-svr-release' => 'सर्व्हर "$1" वरील् लॉक उघडू शकत नाही',
 
 # ZipDirectoryReader
@@ -1919,7 +1927,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 # MIME search
 'mimesearch' => 'विविधामाप (माईम) शोधा',
 'mimesearch-summary' => 'हे पान विविधामाप (माईम)-प्रकारांकरिता संचिकांची चाळणी करण्याची सुविधा पुरवते:
-Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
+Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mimetype' => 'विविधामाप (माईम) प्रकार:',
 'download' => 'उतरवा',
 
@@ -2086,6 +2094,9 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
 'allpagesbadtitle' => 'दिलेले शीर्षक चुकीचे किंवा आंतरभाषीय किंवा आंतरविकि शब्दाने सुरू होणारे होते. त्यात एक किंवा अधिक शीर्षकात न वापरता येणारी अक्षरे असावीत.',
 'allpages-bad-ns' => '{{SITENAME}}मध्ये "$1" हे नामविश्व नाही.',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'आखेरचे दृश्य',
+
 # Special:Categories
 'categories' => 'वर्ग',
 'categoriespagetext' => 'विकिवर खालील वर्ग {{PLURAL:$1|आहे|आहेत}}.
@@ -2107,7 +2118,7 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
 'linksearch-ok' => 'शोध',
 'linksearch-text' => '"*.wikipedia.org" सारखी वाईल्डकार्ड्स वापरायला परवानगी आहे.
 किमान एक उच्च-स्तरिय डोमेन (top-level domain) गरजेचे आहे.<br />
-पुढील प्रोटोकॉल्समध्ये चालेल: <tt>$1</tt> (तुमच्या शोधामध्ये या पैकी कुठलेही टाकू नयेत).',
+पुढील प्रोटोकॉल्समध्ये चालेल: <code>$1</code> (तुमच्या शोधामध्ये या पैकी कुठलेही टाकू नयेत).',
 'linksearch-line' => '$2 मधून $1 जोडलेले आहे',
 'linksearch-error' => 'वाईल्डकार्ड्स होस्ट नावाच्या फक्त सुरवातीलाच येऊ शकतात.',
 
@@ -2925,15 +2936,10 @@ $1',
 # Info page
 'pageinfo-title' => '"$1" च्याबद्दल माहिती',
 'pageinfo-header-edits' => 'संपादने',
-'pageinfo-header-watchlist' => 'पहाऱ्याची सूची',
-'pageinfo-header-views' => 'दृष्टीपथात',
-'pageinfo-subjectpage' => 'पान',
-'pageinfo-talkpage' => 'चर्चा पान',
+'pageinfo-views' => 'अभिप्रायांची संख्या',
 'pageinfo-watchers' => 'पाहणाऱ्यांची संख्या',
 'pageinfo-edits' => 'संपादनांची संख्या',
 'pageinfo-authors' => 'वेगळ्या लेखकांची संख्या',
-'pageinfo-views' => 'अभिप्रायांची संख्या',
-'pageinfo-viewsperedit' => 'प्रति संपादन अभिप्राय',
 
 # Skin names
 'skinname-standard' => 'अभिजात',
@@ -3626,6 +3632,9 @@ $5
 'version-software' => 'स्थापित संगणक प्रणाली (Installed software)',
 'version-software-product' => 'उत्पादन',
 'version-software-version' => 'आवृत्ती',
+'version-entrypoints' => 'आत येणारी यू॰आर॰एल',
+'version-entrypoints-header-entrypoint' => 'आत येण्याचा मार्ग',
+'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
 # Special:FilePath
 'filepath' => 'संचिका मार्ग',
@@ -3785,6 +3794,7 @@ $5
 'api-error-file-too-large' => 'तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप मोठी होती.',
 'api-error-filename-tooshort' => 'संचिकेचे नाव खूपच छोटे आहे.',
 'api-error-filetype-banned' => 'याप्रकारची संचिका प्रतिबंधित आहे.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|ही परवानगी नसलेल्या प्रकारची संचिका आहे.|ह्या परवानगी नसलेल्या प्रकारच्या संचिका आहेत.}} $2 {{PLURAL:$3|ही परवानगी असलेल्या प्रकारची संचिका आहे|ह्या परवानगी असलेल्या प्रकारच्या संचिका आहेत}}.',
 'api-error-filetype-missing' => 'या संचिकेस विस्तार(एक्सटेंशन) नाही.',
 'api-error-hookaborted' => 'तुम्ही केलेला बदल extension ने उलटवला आहे',
 'api-error-http' => 'अंतर्गत त्रुटी: सर्व्हरशी जोडणी होऊ शकली नाही.',
@@ -3809,4 +3819,14 @@ $5
 'api-error-uploaddisabled' => 'चढवण्याचे कार्य ह्या विकिवर अवरुद्ध करण्यात आले आहे',
 'api-error-verification-error' => 'ही संचिका भ्रष्ट(करप्ट) झाली किंवा चुकिचा विस्तार(एक्सटेंशन) असलेली असू शकते.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|सेकंदापूर्वी|सेकंदांपूर्वी}}',
+'duration-minutes' => '$1 {{PLURAL:$1|मिनिटापूर्वी|मिनिटांपूर्वी}}',
+'duration-hours' => '$1 {{PLURAL:$1|तासापूर्वी|तासांपूर्वी}}',
+'duration-days' => '$1 {{PLURAL:$1|दिवसापूर्वी|दिवसांपूर्वी}}',
+'duration-weeks' => '$1 {{PLURAL:$1|आठवड्यापूर्वी | आठवड्यांपूर्वी}}',
+'duration-years' => '$1 {{PLURAL:$1|वर्षापूर्वी|वर्षांपूर्वी}}',
+'duration-decades' => '$1 {{PLURAL:$1|दशकापूर्वी|दशकांपूर्वी }}',
+'duration-centuries' => '$1 {{PLURAL:$1|शतकापूर्वी|शतकांपूर्वी }}',
+
 );
index d1b99aa..77a7da9 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Hill Mari (Ð\9aырык мары)
+/** Hill Mari (кырык мары)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
index cce899d..da1ea47 100644 (file)
@@ -68,36 +68,36 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#LENCONG', '#REDIRECT' ),
-       'currentmonth'            => array( '1', 'BULANSEMASA', 'BULANSEMASA2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'BULANSEMASA1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NAMABULANSEMASA', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'NAMABULANSEMASAGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'SINGBULANSEMASA', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'HARISEMASA', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'HARISEMASA2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NAMAHARISEMASA', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'TAHUNSEMASA', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'WAKTUSEMASA', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'JAMSEMASA', 'CURRENTHOUR' ),
-       'pagename'                => array( '1', 'NAMALAMAN', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NAMALAMANE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'RUANGNAMA', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'RUANGNAMAE', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'RUANGBINCANG', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'RUANGBINCANGE', 'TALKSPACEE' ),
-       'fullpagename'            => array( '1', 'NAMALAMANPENUH', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'NAMALAMANPENUHE', 'FULLPAGENAMEE' ),
-       'msg'                     => array( '0', 'PESAN:', 'MSG:' ),
-       'subst'                   => array( '0', 'TUKAR:', 'SUBST:' ),
-       'img_right'               => array( '1', 'kiri', 'right' ),
-       'img_left'                => array( '1', 'kanan', 'left' ),
-       'img_none'                => array( '1', 'tiada', 'none' ),
-       'img_center'              => array( '1', 'tengah', 'center', 'centre' ),
-       'sitename'                => array( '1', 'NAMATAPAK', 'SITENAME' ),
-       'ns'                      => array( '0', 'RN:', 'NS:' ),
-       'nse'                     => array( '0', 'RNE:', 'NSE:' ),
-       'currentweek'             => array( '1', 'MINGGUSEMASA', 'CURRENTWEEK' ),
+       'redirect'                  => array( '0', '#LENCONG', '#REDIRECT' ),
+       'currentmonth'              => array( '1', 'BULANSEMASA', 'BULANSEMASA2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'BULANSEMASA1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NAMABULANSEMASA', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'NAMABULANSEMASAGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'SINGBULANSEMASA', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'HARISEMASA', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'HARISEMASA2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NAMAHARISEMASA', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'TAHUNSEMASA', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'WAKTUSEMASA', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'JAMSEMASA', 'CURRENTHOUR' ),
+       'pagename'                  => array( '1', 'NAMALAMAN', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NAMALAMANE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'RUANGNAMA', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'RUANGNAMAE', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'RUANGBINCANG', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'RUANGBINCANGE', 'TALKSPACEE' ),
+       'fullpagename'              => array( '1', 'NAMALAMANPENUH', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NAMALAMANPENUHE', 'FULLPAGENAMEE' ),
+       'msg'                       => array( '0', 'PESAN:', 'MSG:' ),
+       'subst'                     => array( '0', 'TUKAR:', 'SUBST:' ),
+       'img_right'                 => array( '1', 'kiri', 'right' ),
+       'img_left'                  => array( '1', 'kanan', 'left' ),
+       'img_none'                  => array( '1', 'tiada', 'none' ),
+       'img_center'                => array( '1', 'tengah', 'center', 'centre' ),
+       'sitename'                  => array( '1', 'NAMATAPAK', 'SITENAME' ),
+       'ns'                        => array( '0', 'RN:', 'NS:' ),
+       'nse'                       => array( '0', 'RNE:', 'NSE:' ),
+       'currentweek'               => array( '1', 'MINGGUSEMASA', 'CURRENTWEEK' ),
 );
 
 $specialPageAliases = array(
@@ -198,7 +198,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Sorokkan suntingan yang telah dironda daripada senarai perubahan terkini',
 'tog-newpageshidepatrolled' => 'Sorokkan laman yang telah dironda daripada senarai laman baru',
 'tog-extendwatchlist' => 'Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini',
-'tog-usenewrc' => 'Guna peningkatan perubahan terkini (perlukan JavaScript)',
+'tog-usenewrc' => 'Perubahan kumpulan mengikut laman dalam perubahan terkini dan senarai pantau (memerlukan JavaScript)',
 'tog-numberheadings' => 'Nomborkan tajuk secara automatik',
 'tog-showtoolbar' => 'Tunjukkan bar sunting (JavaScript)',
 'tog-editondblclick' => 'Klik ganda untuk sunting halaman (JavaScript)',
@@ -206,17 +206,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Bolehkan penyuntingan bahagian dengan mengklik kanan pada tajuk bahagian (JavaScript)',
 'tog-showtoc' => 'Tunjukkan isi kandungan (bagi rencana yang melebihi 3 tajuk)',
 'tog-rememberpassword' => 'Ingat log masuk saya di pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})',
-'tog-watchcreations' => 'Tambahkan laman yang saya cipta ke dalam senarai pantau',
-'tog-watchdefault' => 'Tambahkan laman yang saya sunting ke dalam senarai pantau',
-'tog-watchmoves' => 'Tambahkan laman yang saya pindahkan ke dalam senarai pantau',
-'tog-watchdeletion' => 'Tambahkan laman yang saya hapuskan ke dalam senarai pantau',
+'tog-watchcreations' => 'Tambahkan halaman-halaman yang saya buat dan fail-fail yang saya muat naik ke dalam senarai pantau',
+'tog-watchdefault' => 'Tambahkan halaman-halaman dan fail-fail yang saya sunting ke dalam senarai pantau',
+'tog-watchmoves' => 'Tambahkan halaman-halaman dan fail-fail yang saya pindahkan ke dalam senarai pantau',
+'tog-watchdeletion' => 'Tambahkan halaman-halaman dan fail-fail yang saya hapuskan ke dalam senarai pantau',
 'tog-minordefault' => 'Tandakan semua suntingan sebagai kecil secara asali',
 'tog-previewontop' => 'Tunjukkan pralihat di atas kotak sunting',
 'tog-previewonfirst' => 'Tunjukkan pralihat pada suntingan pertama',
 'tog-nocache' => 'Lumpuhkan pengagregatan laman',
-'tog-enotifwatchlistpages' => 'E-melkan saya apabila berlaku perubahan pada laman yang dipantau',
+'tog-enotifwatchlistpages' => 'E-mel kepada saya tentang perubahan pada halaman-halaman dan fail-fail dalam senarai pantau saya',
 'tog-enotifusertalkpages' => 'E-melkan saya apabila berlaku perubahan pada laman perbincangan saya',
-'tog-enotifminoredits' => 'Juga e-melkan saya apabila berlaku penyuntingan kecil',
+'tog-enotifminoredits' => 'Juga e-mel kepada saya tentang suntingan kecil pada halaman-halaman dan fail-fail',
 'tog-enotifrevealaddr' => 'Serlahkan alamat e-mel saya dalam e-mel pemberitahuan',
 'tog-shownumberswatching' => 'Tunjukkan bilangan pemantau',
 'tog-oldsig' => 'Tanda tangan yang sedia ada:',
@@ -232,7 +232,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Sembunyikan suntingan oleh pengguna log masuk daripada senarai pantau',
 'tog-watchlisthideanons' => 'Sembunyikan suntingan oleh pengguna tanpa nama daripada senarai pantau',
 'tog-watchlisthidepatrolled' => 'Sorokkan suntingan yang telah dironda daripada senarai pantau',
-'tog-nolangconversion' => 'Lumpuhkan penukaran kelainan',
 'tog-ccmeonemails' => 'Kirimkan saya salinan e-mel yang saya hantar kepada pengguna lain',
 'tog-diffonly' => 'Jangan tunjukkan kandungan laman di bawah perbezaan',
 'tog-showhiddencats' => 'Tunjukkan kategori tersembunyi',
@@ -460,6 +459,10 @@ $1',
 'youhavenewmessages' => 'Anda mempunyai $1 ($2).',
 'newmessageslink' => 'pesanan baru',
 'newmessagesdifflink' => 'perubahan terakhir',
+'youhavenewmessagesfromusers' => 'Anda menerima $1 daripada {{PLURAL:$3|seorang|$3 orang}} pengguna lain ($2).',
+'youhavenewmessagesmanyusers' => 'Anda menerima $1 daripada ramai pengguna ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|pesanan|pesanan-pesanan}} baru',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|perubahan|perubahan-perubahan}} terkini',
 'youhavenewmessagesmulti' => 'Anda telah menerima pesanan baru pada $1',
 'editsection' => 'sunting',
 'editsection-brackets' => '[$1]',
@@ -512,12 +515,12 @@ Senarai laman khas yang sah boleh dilihat di [[Special:SpecialPages]].',
 # General errors
 'error' => 'Ralat',
 'databaseerror' => 'Ralat pangkalan data',
-'dberrortext' => 'Ralat sintaks pertanyaan pangkalan data telah terjadi.
-Ini mungkin menandakan pepijat dalam perisian wiki ini.
-Pertanyaan pangkalan data yang terakhir ialah:
-<blockquote><tt>$1</tt></blockquote>
-daripada fungsi "<tt>$2</tt>".
-Pangkalan data memulangkan ralat "<tt>$3: $4</tt>".',
+'dberrortext' => 'Terjadinya ralat sintaks pertanyaan pangkalan data.
+Ini mungkin menandakan adanya pepijat dalam perisian ini.
+Pertanyaan pangkalan data terakhir yang dicuba ialah:
+<blockquote><code>$1</code></blockquote>
+daripada dalam fungsi "<samp>$2</samp>".
+Pangkalan data memulangkan ralat "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Terdapat ralat sintaks pertanyaan pangkalan data.
 Pertanyaan terakhir ialah:
 "$1"
@@ -555,6 +558,8 @@ Sila catat URL bagi laman ini dan laporkan perkara ini kepada seorang [[Special:
 'cannotdelete' => 'Laman atau fail $1 tidak dapat dihapuskan.
 Ia mungkin telah pun dihapuskan oleh orang lain.',
 'cannotdelete-title' => 'Laman "$1" tidak dapat dihapuskan',
+'delete-hook-aborted' => 'Penghapusan dibatalkan oleh penyangkuk.
+Tiada sebab diberikan.',
 'badtitle' => 'Tajuk tidak sah',
 'badtitletext' => 'Tajuk laman yang diminta tidak sah, kosong, ataupun tajuk antara bahasa atau tajuk antara wiki yang salah dipaut. Ia mungkin mengandungi aksara yang tidak dibenarkan.',
 'perfcached' => 'Data yang berikut disimpan dalam cache dan mungkin tidak terkemas kini. Semaksimum {{PLURAL:$1|satu hasil|$1 hasil}} terdapat dalam cache.',
@@ -585,6 +590,8 @@ Pertanyaan: $2',
 Pentadbir yang menguncinya memberikan penjelasan yang berikut: "$3".',
 'invalidtitle-knownnamespace' => 'Tajuk tidak sah dengan ruang nama "$2" dan teks "$3"',
 'invalidtitle-unknownnamespace' => 'Tajuk tidak sah dengan nombor ruang nama tidak dikenali $1 dan teks "$2"',
+'exception-nologin' => 'Belum log masuk',
+'exception-nologin-text' => 'Halaman atau tindakan ini memerlukan anda untuk log masuk ke dalam wiki ini.',
 
 # Virus scanner
 'virus-badscanner' => "Konfigurasi rosak: pengimbas virus yang tidak diketahui: ''$1''",
@@ -604,6 +611,7 @@ Akaun anda telah dibuka. Jangan lupa untuk mengubah [[Special:Preferences|keutam
 'remembermypassword' => 'Ingat log masuk saya pada pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})',
 'securelogin-stick-https' => 'Kekal disambungkan ke HTTPS selepas log masuk',
 'yourdomainname' => 'Domain anda:',
+'password-change-forbidden' => 'Anda tidak dapat mengubah kata laluan di wiki ini.',
 'externaldberror' => 'Berlaku ralat pangkalan data bagi pengesahan luar atau anda tidak dibenarkan mengemaskinikan akaun luar anda.',
 'login' => 'Log masuk',
 'nav-login-createaccount' => 'Log masuk / buka akaun',
@@ -838,15 +846,18 @@ Sekiranya anda adalah seorang pengguna tanpa nama dan berasa bahawa komen yang t
 'noarticletext-nopermission' => 'Tiada teks dalam laman ini ketika ini.
 Anda boleh [[Special:Search/{{PAGENAME}}|mencari tajuk laman ini]] dalam laman lain,
 atau <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log yang berkaitan]</span>.',
+'missing-revision' => 'Semakan #$1 pada halaman "{{PAGENAME}}" tidak wujud.
+
+Hal ini biasanya disebabkan oleh pautan sejarah yang lapuk ke halaman yang sudah dihapuskan.
+Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].',
 'userpage-userdoesnotexist' => 'Akaun pengguna "<nowiki>$1</nowiki>" tidak berdaftar. Sila pastikan sama ada anda mahu mencipta/menyunting laman ini.',
 'userpage-userdoesnotexist-view' => 'Akaun pengguna "$1" tidak berdaftar.',
 'blocked-notice-logextract' => 'Pengguna ini sedang disekat.
 Masukan log sekatan terakhir disediakan di bawah sebagai rujukan:',
-'clearyourcache' => "'''Catatan: Selepas menyimpan laman ini, anda mungkin perlu membersihkan cache pelayar web anda terlebih dahulu untuk mengenakan perubahan.'''
+'clearyourcache' => "'''Catatan:''' Selepas menyimpan laman ini, anda mungkin perlu membersihkan cache pelayar web anda terlebih dahulu untuk mengenakan perubahan.
 *'''Firefox/Safari:''' Tekan terus ''Shift'' sambil klik ''Reload'', atau tekan ''Ctrl+F5'' atau tekan ''Ctrl+R''  (''⌘+R'' bagi Mac)
 *'''Google Chrome:''' Tekan ''Ctrl+Shift+R''  (''⌘+Shift+R'' bagi Mac)
 *'''Internet Explorer:''' Tekan terus ''Ctrl'' sambil klik ''Refresh'', atau tekan ''Ctrl+F5''
-*'''Konqueror:''' Klik butang ''Reload'', atau tekan ''F5''
 *'''Opera:''' Kosongkan cache di menu ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Petua:''' Gunakan butang \"{{int:showpreview}}\" untuk menguji CSS baru anda sebelum menyimpan.",
 'userjsyoucanpreview' => "'''Petua:''' Gunakan butang \"{{int:showpreview}}\" untuk menguji JavaScript baru anda sebelum menyimpan.",
@@ -961,6 +972,7 @@ Argumen-argumen ini telah ditinggalkan.',
 'expansion-depth-exceeded-warning' => 'Laman terlebih dalam peluasan',
 'parser-unstrip-loop-warning' => 'Gelung unstrip dikesan',
 'parser-unstrip-recursion-limit' => 'Had rekursi unstrip dilampaui ($1)',
+'converter-manual-rule-error' => 'Ralat dikesan dalam aturan penukaran bahasa manual',
 
 # "Undo" feature
 'undo-success' => 'Suntingan ini boleh dibatalkan. Sila semak perbandingan di bawah untuk mengesahkan bahawa anda betul-betul mahu melakukan tindakan ini, kemudian simpan perubahan tersebut.',
@@ -1149,6 +1161,10 @@ Sila pastikan bahawa perubahan ini akan mengekalkan kesinambungan sejarah laman.
 'editundo' => 'batal',
 'diff-multi' => '($1 {{PLURAL:$1|semakan pertengahan|semakan pertengahan}} oleh $2 {{PLURAL:$2|pengguna|pengguna}} tidak dipaparkan)',
 'diff-multi-manyusers' => '($1 {{PLURAL:$1|semakan pertengahan|semakan pertengahan}} oleh lebih daripada $2 {{PLURAL:$2|pengguna|pengguna}} tidak dipaparkan)',
+'difference-missing-revision' => '{{PLURAL:$2|Satu semakan|$2 semakan}} bagi perbezaan ini ($1) tidak ditemui.
+
+Hal ini biasanya disebabkan oleh pautan perbezaan yang lapuk ke halaman yang sudah dihapuskan.
+Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].',
 
 # Search results
 'searchresults' => 'Hasil carian',
@@ -1417,6 +1433,7 @@ Tindakan ini tidak boleh dibatalkan.',
 'right-writeapi' => 'Menggunakan API tulis',
 'right-delete' => 'Menghapuskan laman',
 'right-bigdelete' => 'Menghapuskan laman bersejarah',
+'right-deletelogentry' => 'Memadamkan dan memulihkan entri log tertentu',
 'right-deleterevision' => 'Menghapuskan dan memulihkan semula mana-mana semakan bagi sesebuah laman',
 'right-deletedhistory' => 'Melihat senarai entri sejarah yang telah dihapuskan, tetapi tanpa teks yang berkaitan',
 'right-deletedtext' => 'Melihat teks yang telah dihapuskan dan perubahan antara semakan-semakan yang telah dihapuskan',
@@ -1563,9 +1580,9 @@ Log penghapusan dan pemindahan untuk laman ini disediakan di bawah ini untuk kem
 Untuk melihat atau mencari imej yang sudah dimuat naik, sila ke [[Special:FileList|senarai fail yang dimuat naik]]. Tindakan muat naik akan direkodkan dalam [[Special:Log/upload|log muat naik]], manakala penghapusan dalam [[Special:Log/delete|log penghapusan]].
 
 Untuk menyertakan sebarang fail ke dalam sesebuah laman, gunakan pautan dengan satu daripada bentuk-bentuk berikut:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.jpg]]</nowiki></tt>''' untuk menggunakan versi penuh bagi fail itu
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.png|200px|thumb|left|teks alternatif]]</nowiki></tt>''' untuk menggunakan lakaran 200 piksel lebar di dalam sebuah kotak yang diletakkan di jidar kiri dengan keterangan 'teks alternatif'
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fail.ogg]]</nowiki></tt>''' untuk memaut secara terus tanpa memaparkan fail itu",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.jpg]]</nowiki></code>''' untuk menggunakan versi penuh bagi fail itu
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fail.png|200px|thumb|left|teks alternatif]]</nowiki></code>''' untuk menggunakan lakaran 200 piksel lebar di dalam sebuah kotak yang diletakkan di jidar kiri dengan keterangan 'teks alternatif'
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fail.ogg]]</nowiki></code>''' untuk memaut secara terus tanpa memaparkan fail itu",
 'upload-permitted' => 'Jenis fail yang dibenarkan: $1.',
 'upload-preferred' => 'Jenis fail yang diutamakan: $1.',
 'upload-prohibited' => 'Jenis fail yang dilarang: $1.',
@@ -1606,20 +1623,20 @@ Untuk menyertakan sebarang fail ke dalam sesebuah laman, gunakan pautan dengan s
 'largefileserver' => 'Fail ini telah melebihi had muat naik pelayan web.',
 'emptyfile' => 'Fail yang dimuat naik adalah kosong. Ini mungkin disebabkan oleh kesilapan menaip nama fail. Sila pastikan bahawa anda betul-betul mahu memuat naik fail ini.',
 'windows-nonascii-filename' => 'Wiki ini tidak menyokong nama fail yang mengandungi aksara khas.',
-'fileexists' => "Sebuah fail dengan nama ini telah pun wujud.
-Sila semak '''<tt>[[:$1]]</tt>''' sekiranya anda tidak pasti bahawa anda mahu menukarnya atau tidak.
-[[$1|thumb]]",
-'filepageexists' => "Laman penerangan untuk fail ini telah pun dicipta di '''<tt>[[:$1]]</tt>''', tetapi tiada fail dengan nama ini wujud.
+'fileexists' => 'Sebuah fail dengan nama ini telah pun wujud.
+Sila semak <strong>[[:$1]]</strong> sekiranya anda tidak pasti bahawa anda mahu menukarnya atau tidak.
+[[$1|thumb]]',
+'filepageexists' => 'Laman penerangan untuk fail ini telah pun dicipta di <strong>[[:$1]]</strong>, tetapi tiada fail dengan nama ini wujud.
 Ringkasan yang anda masukkan tidak akan muncul di laman penerangan tersebut. Untuk memastikannya muncul, anda perlu menyuntingnya secara manual.
-[[$1|thumb]]",
-'fileexists-extension' => "Sebuah fail dengan nama yang sama telah pun wujud: [[$2|thumb]]
-* Nama fail yang dimuat naik: '''<tt>[[:$1]]</tt>'''
-* Nama fail yang sedia ada: '''<tt>[[:$2]]</tt>'''
-Sila pilih nama lain.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Sebuah fail dengan nama yang sama telah pun wujud: [[$2|thumb]]
+* Nama fail yang dimuat naik: <strong>[[:$1]]</strong>
+* Nama fail yang sedia ada: <strong>[[:$2]]</strong>
+Sila pilih nama lain.',
 'fileexists-thumbnail-yes' => "Fail ini kelihatan seperti sebuah imej yang telah dikecilkan ''(gambar kenit)''. [[$1|thumb]]
-Sila semak fail '''<tt>[[:$1]]</tt>'''.
+Sila semak fail <strong>[[:$1]]</strong>.
 Jika fail yang disemak itu adalah sama dengan yang saiz asal, maka anda tidak perlu memuat naik gambar kenit tambahan.",
-'file-thumbnail-no' => "Nama fail ini bermula dengan '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Nama fail ini bermula dengan <strong>$1</strong>.
 Barangkali ia adalah sebuah imej yang telah dikecilkan ''(gambar kenit)''.
 Jika anda memiliki imej ini dalam leraian penuh, sila muat naik fail tersebut. Jika tidak, sila tukar nama fail ini.",
 'fileexists-forbidden' => 'Sebuah fail dengan nama ini telah pun wujud, dan tidak boleh ditulis ganti. Jika anda masih mahu memuat naik fail ini, sila berundur dan muat naik fail ini dengan nama lain. [[File:$1|thumb|center|$1]]',
@@ -1724,6 +1741,7 @@ Sila hubungi [[Special:ListUsers/sysop|pentadbir sistem]].',
 'lockmanager-fail-releaselock' => 'Kunci untuk "$1" tidak dapat dikeluarkan.',
 'lockmanager-fail-db-bucket' => 'Di baldi $1 tidak dapat dihubungi pangkalan data selak yang secukupnya.',
 'lockmanager-fail-db-release' => 'Selak-selak tidak dapat dikeluarkan di pangkalan data $1.',
+'lockmanager-fail-svr-acquire' => 'Selak-selak tidak dapat diperoleh di pelayan $1.',
 'lockmanager-fail-svr-release' => 'Selak-selak tidak dapat dikeluarkan di pelayan $1.',
 
 # ZipDirectoryReader
@@ -1841,6 +1859,7 @@ Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di s
 'shared-repo' => 'sebuah gedung kongsi',
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
 'filepage.css' => '/* CSS yang ditempatkan di sini disertakan pada laman keterangan fail, dan juga pada klien wiki asing */',
+'upload-disallowed-here' => 'Maaf, anda tidak boleh menggantikan imej ini.',
 
 # File reversion
 'filerevert' => 'Balikkan $1',
@@ -1875,7 +1894,7 @@ Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di s
 
 # MIME search
 'mimesearch' => 'Carian MIME',
-'mimesearch-summary' => 'Anda boleh menggunakan laman ini untuk mencari fail mengikut jenis MIME. Format input ialah "jenis/subjenis", contohnya <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Anda boleh menggunakan laman ini untuk mencari fail mengikut jenis MIME. Format input ialah "jenis/subjenis", contohnya <code>image/jpeg</code>.',
 'mimetype' => 'Jenis MIME:',
 'download' => 'muat turun',
 
@@ -1921,7 +1940,9 @@ Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di s
 
 'disambiguations' => 'Laman-laman yang berpaut dengan laman penyahkekaburan',
 'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Laman-laman berikut mengandungi pautan ke '''laman penyahtaksaan'''. Pautan ini sepatutnya ditujukan kepada topik yang sepatutnya.<br />Sesebuah laman dianggap sebagai laman penyahtaksaan jika ia menggunakan templat yang dipaut dari [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Laman-laman berikut mengandungi sekurang-kurangnya satu pautan ke '''laman penyahkekaburan'''.
+Pautan ini sepatutnya ditujukan ke topik yang sepatutnya.<br />
+Sesebuah laman dianggap sebagai laman penyahkekaburan jika ia menggunakan templat yang dipaut dari [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Lencongan berganda',
 'doubleredirectstext' => 'Yang berikut ialah senarai laman yang melencong ke laman lencongan lain. Setiap baris mengandungi pautan ke laman lencongan pertama dan kedua, serta baris pertama bagi teks lencongan kedua, lazimnya merupakan laman sasaran "sebenar", yang sepatutnya ditujui oleh lencongan pertama.
@@ -1945,6 +1966,7 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
 # Miscellaneous special pages
 'nbytes' => '{{PLURAL:$1|$1 bait}}',
 'ncategories' => '$1 kategori',
+'ninterwikis' => '$1 pautan antara wiki',
 'nlinks' => '$1 pautan',
 'nmembers' => '$1 ahli',
 'nrevisions' => '$1 semakan',
@@ -1973,6 +1995,7 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
 'mostlinkedtemplates' => 'Templat dipaut terbanyak',
 'mostcategories' => 'Rencana dengan kategori terbanyak',
 'mostimages' => 'Imej dipaut terbanyak',
+'mostinterwikis' => 'Halaman yang paling banyak pautan antara wiki',
 'mostrevisions' => 'Rencana dengan semakan terbanyak',
 'prefixindex' => 'Indeks awalan',
 'prefixindex-namespace' => 'Semua laman dengan awalan (ruang nama $1)',
@@ -2072,7 +2095,7 @@ Lihat juga [[Special:WantedCategories|kategori yang dikehendaki]].',
 'linksearch-ok' => 'Cari',
 'linksearch-text' => 'Kad bebas seperti "*.wikipedia.org" dibenarkan.<br />
 Memerlukan sekurang-kurangnya satu domain peringkat tinggi, cth. "*.org".<br />
-Protokol yang disokong: <tt>$1</tt> (jangan bubuh sebarang protokol ini dalam carian anda)',
+Protokol yang disokong: <code>$1</code> (jangan bubuh sebarang protokol ini dalam carian anda)',
 'linksearch-line' => '$1 dipaut dari $2',
 'linksearch-error' => 'Kad bebas hanya boleh digunakan pada permulaan nama hos.',
 
@@ -2120,6 +2143,8 @@ Anda boleh mengetahui [[{{MediaWiki:Listgrouprights-helppage}}|maklumat tambahan
 terlebih dahulu dan mempunyai alamat e-mel yang sah dalam
 [[Special:Preferences|laman keutamaan]] untuk mengirim e-mel kepada pengguna lain.',
 'emailuser' => 'Kirim e-mel kepada pengguna ini',
+'emailuser-title-target' => 'E-mel {{GENDER:$1|pengguna}} ini',
+'emailuser-title-notarget' => 'E-mel pengguna',
 'emailpage' => 'E-mel pengguna',
 'emailpagetext' => 'Gunakan borang berikut untuk mengirim pesanan e-mel kepada pengguna ini.
 
@@ -2269,6 +2294,8 @@ Sila lihat $2 untuk rekod penghapusan terkini.',
 'rollback' => 'Undurkan suntingan.',
 'rollback_short' => 'Undur',
 'rollbacklink' => 'undur',
+'rollbacklinkcount' => 'mengundurkan $1 {{PLURAL:$1|suntingan}}',
+'rollbacklinkcount-morethan' => 'mengundurkan lebih daripada $1 {{PLURAL:$1|suntingan}}',
 'rollbackfailed' => 'Pengunduran gagal',
 'cantrollback' => 'Suntingan tersebut tidak dapat dibalikkan: penyumbang terakhir adalah satu-satunya pengarang bagi rencana ini.',
 'alreadyrolled' => 'Suntingan terakhir bagi [[:$1]] oleh [[User:$2|$2]] ([[User talk:$2|Perbualan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tidak dapat dibalikkan; terdapat pengguna lain yang telah menyunting atau membalikkan laman itu.
@@ -2762,6 +2789,7 @@ Semua tindakan import transwiki dicatatkan dalam [[Special:Log/import|log import
 'import-interwiki-templates' => 'Sertakan semua templat',
 'import-interwiki-submit' => 'Import',
 'import-interwiki-namespace' => 'Ruang nama destinasi:',
+'import-interwiki-rootpage' => 'Halaman akar tujuan (tidak wajib):',
 'import-upload-filename' => 'Nama fail:',
 'import-comment' => 'Komen:',
 'importtext' => 'Sila eksport fail daripada sumber wiki dengan menggunakan [[Special:Export|utiliti eksport]].
@@ -2794,6 +2822,9 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'import-error-interwiki' => 'Laman "$1" tidak diimport kerana namanya ditempah untuk pemautan luaran (antara wiki).',
 'import-error-special' => 'Laman "$1" tidak diimport kerana ia tergolong dalam ruang nama khas yang tidak membenarkan laman.',
 'import-error-invalid' => 'Laman "$1" tidak diimport kerana namanya tidak sah.',
+'import-options-wrong' => '{{PLURAL:$2|Pilihan|Pilihan-pilihan}} salah: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Halaman akar yang dinyatakan adalah tidak sah.',
+'import-rootpage-nosubpage' => 'Ruang nama "$1" halaman akar tidak membenarkan subhalaman.',
 
 # Import log
 'importlogpage' => 'Log import',
@@ -2881,7 +2912,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'tooltip-rollback' => 'Balikkan semua suntingan oleh penyumbang terakhir pada laman ini dengan satu klik.',
 'tooltip-undo' => 'Balikkan suntingan ini dan buka borang sunting dalam mod pralihat. Sebab boleh dinyatakan dalam ruangan ringkasan.',
 'tooltip-preferences-save' => 'Simpan keutamaan',
-'tooltip-summary' => 'Masukkan ringkasan pendek',
+'tooltip-summary' => 'Berikan ringkasan',
 
 # Stylesheets
 'common.css' => '/* CSS yang terletak di sini akan digunakan pada semua kulit */',
@@ -2921,16 +2952,34 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 
 # Info page
 'pageinfo-title' => 'Maklumat untuk "$1"',
-'pageinfo-header-edits' => 'Suntingan',
-'pageinfo-header-watchlist' => 'Senarai pantau',
-'pageinfo-header-views' => 'Kunjungan',
-'pageinfo-subjectpage' => 'Laman',
-'pageinfo-talkpage' => 'Laman perbincangan',
-'pageinfo-watchers' => 'Bilangan pemantau',
-'pageinfo-edits' => 'Bilangan suntingan',
-'pageinfo-authors' => 'Bilangan pengarang yang berlainan',
+'pageinfo-header-basic' => 'Maklumat asas',
+'pageinfo-header-edits' => 'Sunting sejarah',
+'pageinfo-header-restrictions' => 'Perlindungan halaman',
+'pageinfo-header-properties' => 'Sifat halaman',
+'pageinfo-display-title' => 'Tajuk paparan',
+'pageinfo-default-sort' => 'Kunci isih azali',
+'pageinfo-length' => 'Kepanjangan halaman (bait)',
+'pageinfo-article-id' => 'ID halaman',
+'pageinfo-robot-policy' => 'Status enjin pencarian',
+'pageinfo-robot-index' => 'Boleh diindekskan',
+'pageinfo-robot-noindex' => 'Tidak boleh diindekskan',
 'pageinfo-views' => 'Bilangan kunjungan',
-'pageinfo-viewsperedit' => 'Kunjungan sesuntingan',
+'pageinfo-watchers' => 'Bilangan pemantau halaman',
+'pageinfo-redirects-name' => 'Lencongan ke halaman ini',
+'pageinfo-subpages-name' => 'Subhalaman untuk halaman ini',
+'pageinfo-subpages-value' => '$1 ($2 lencongan; $3 bukan lencongan)',
+'pageinfo-firstuser' => 'Pembuat halaman',
+'pageinfo-firsttime' => 'Tarikh halaman dibuat',
+'pageinfo-lastuser' => 'Penyunting terkini',
+'pageinfo-lasttime' => 'Tarikh suntingan terkini',
+'pageinfo-edits' => 'Jumlah suntingan',
+'pageinfo-authors' => 'Jumlah pengarang yang berlainan',
+'pageinfo-recent-edits' => 'Bilangan suntingan terkini (dalam $1 yang lalu)',
+'pageinfo-recent-authors' => 'Bilangan pengarang berbeza yang terkini',
+'pageinfo-restriction' => 'Perlindungan halaman (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => 'Kata sakti ($1)',
+'pageinfo-hidden-categories' => 'Kategori tersembunyi ($1)',
+'pageinfo-templates' => 'Templat tertransklusi ($1)',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -2986,6 +3035,7 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
 'file-info-size-pages' => '$1 × $2 piksel, saiz fail: $3, jenis MIME: $4, $5 laman',
 'file-nohires' => 'Tiada leraian lebih besar.',
 'svg-long-desc' => 'Fail SVG, ukuran dasar $1 × $2 piksel, saiz fail: $3',
+'svg-long-desc-animated' => 'Fail SVG animasi, ukuran dasar $1 × $2 piksel, saiz fail: $3',
 'show-big-image' => 'Leraian penuh',
 'show-big-image-preview' => 'Saiz pralihat ini: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Leraian|Leraian-leraian}} lain: $1.',
@@ -2995,6 +3045,8 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
 'file-info-png-looped' => 'berulang',
 'file-info-png-repeat' => 'dimainkan {{PLURAL:$1|sekali|sebanyak $1 kali}}',
 'file-info-png-frames' => '$1 bingkai',
+'file-no-thumb-animation' => "'''Perhatian: Disebabkan had teknikal, gambar kenit untuk fail ini tidak beranimasi.'''",
+'file-no-thumb-animation-gif' => "''''''Perhatian: Disebabkan had teknikal, gambar kenit untuk imej GIF beresolusi tinggi seperti ini tidak beranimasi.'''",
 
 # Special:NewFiles
 'newimages' => 'Galeri fail baru',
@@ -3669,7 +3721,7 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 * <span class="mw-specialpagecached">Laman khas tercache (mungkin lapuk).</span>',
 'specialpages-group-maintenance' => 'Laporan penyenggaraan',
 'specialpages-group-other' => 'Laman khas lain',
-'specialpages-group-login' => 'Log masuk / daftar',
+'specialpages-group-login' => 'Log masuk / buka akaun',
 'specialpages-group-changes' => 'Perubahan terkini dan log',
 'specialpages-group-media' => 'Laporan media dan muat naik',
 'specialpages-group-users' => 'Pengguna dan hak',
@@ -3803,9 +3855,12 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
 'api-error-empty-file' => 'Fail yang anda serahkan adalah kosong.',
 'api-error-emptypage' => 'Anda tidak dibenarkan membuat laman baru yang kosong.',
 'api-error-fetchfileerror' => 'Ralat dalaman: ada malasah ketika mengambil fail itu.',
+'api-error-fileexists-forbidden' => 'Fail bernama "$1" sudah wujud, dan tidak boleh ditulis ganti.',
+'api-error-fileexists-shared-forbidden' => 'Fail bernama "$1" sudah wujud dalam repositori fail kongsian, dan tidak boleh ditulis ganti.',
 'api-error-file-too-large' => 'Fail yang anda serahkan adalah terlalu besar.',
 'api-error-filename-tooshort' => 'Nama fail ini terlalu pendek.',
 'api-error-filetype-banned' => 'Fail jenis ini adalah dilarang.',
+'api-error-filetype-banned-type' => '$1 merupakan {{PLURAL:$4|jenis|jenis-jenis}} fail yang dilarang. {{PLURAL:$3|Jenis|Jenis-jenis}} fail yang dibenarkan ialah $2.',
 'api-error-filetype-missing' => 'Fail ini tiada sambungannya.',
 'api-error-hookaborted' => 'Pengubahsuaian yang anda buat telah disekat oleh cangkuk sambungan.',
 'api-error-http' => 'Ralat dalaman: tidak dapat bersambung dengan pelayan.',
index 8c479ca..3a9a45f 100644 (file)
@@ -142,133 +142,133 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#RINDIRIZZA', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__EBDAWERREJ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__EBDAGALLERIJA__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__SFORZAWERREJ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__WERREJ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__EBDASEZZJONIMODIFIKA__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'XAHARKURRENTI', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'ISEMXAHARKURRENTI', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'ĠENISEMXAHARKURRENTI', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ABBREVXAHARKURRENTI', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ĠURNATAKURRENTI', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ĠURNATAKURRENTI2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ISEMĠURNATAKURRENTI', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'SENAKURRENTI', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ĦINKURRENTI', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'SIEGĦAKURRENTI', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'XAHARLOKALI', 'XAHARLOKALI2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'XAHARLOKALI1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'ISEMXAHARLOKALI', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'ĠENISEMXAHARLOKALI', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ABBREVXAHARLOKALI', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ĠURNATALOKALI', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ĠURNATALOKALI2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'ISEMTAL-ĠURNATALOKALI', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'SENALOKALI', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ĦINLOKALI', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'SIEGĦALOKALI', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NUMRUTA\'PAĠNI', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NUMRUTA\'ARTIKLI', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NUMRUTA\'FAJLS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NUMRUTA\'UTENTI', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NUMRUTA\'UTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NUMBRUTA\'MODIFIKI', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NUMRUTA\'VISTI', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'ISEMTAL-PAĠNA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ISEMTAL-PAĠNAE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'SPAZJUTAL-ISEM', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'SPAZJUTAL-ISEME', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'SPAZJUTA\'DISKUSSJONI', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'SPAZJUTA\'DISKUSSJONIE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'SPAZJUTAS-SUĠĠETT', 'SPAZJUTAL-ARTIKLU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'fullpagename'            => array( '1', 'ISEMSĦIĦTAL-PAĠNA', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ISEMTAL-PAĠNASĦIĦAE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ISEMTAS-SOTTOPAĠNA', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ISEMTAS-SUBPAĠNAE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'ISEMBAŻIKUTAL-PAĠNA', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'ISEMTAL-PAĠNATAL-BAŻIE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ISEMPAĠNATA\'DISKUSSJONI', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'ISEMTAL-PAĠNATAD-DISKUSSJONIE', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'ISEMTAS-SUĠĠETTTAL-PAĠNA', 'ISEMTAL-ARTIKLUTAL-PAĠNA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'ISEMTAS-SUĠĠETTTAL-PAĠNAE', 'ISEMTAL-ARTIKLUTAL-PAĠNAE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'MSĠ:', 'MSG:' ),
-       'subst'                   => array( '0', 'BIDDEL:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'MSĠEW:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'daqsminuri', 'minuri', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'daqsminuri=$1', 'minuri=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'lemin', 'right' ),
-       'img_left'                => array( '1', 'xellug', 'left' ),
-       'img_none'                => array( '1', 'xejn', 'none' ),
-       'img_center'              => array( '1', 'nofs', 'ċentrali', 'ċentru', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'tilat', 'b\'tilar', 'tilar', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'bla_tilar', 'frameless' ),
-       'img_page'                => array( '1', 'paġna=$1', 'paġna $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'wieqaf', 'wieqaf=$1', 'wieqaf $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'bordura', 'burdura', 'border' ),
-       'img_baseline'            => array( '1', 'bażi_tal-linja', 'baseline' ),
-       'img_sub'                 => array( '1', 'bid', 'sub' ),
-       'img_super'               => array( '1', 'tajjeb', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'fuq', 'top' ),
-       'img_text_top'            => array( '1', 'test-fuq', 'text-top' ),
-       'img_bottom'              => array( '1', 'taħt', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'test-taħt', 'text-bottom' ),
-       'img_link'                => array( '1', 'ħolqa=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'ISEMTAS-SIT', 'SITENAME' ),
-       'ns'                      => array( '0', 'IS:', 'NS:' ),
-       'localurl'                => array( '0', 'URLLOKALI:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URLLOKALIE:', 'LOCALURLE:' ),
-       'servername'              => array( '0', 'ISEMTAS-SERVER', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'DESTINAZZJONITA\'SKRITT', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'GRAMMATIKA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'SESS:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__EBDAKONVERTURTITLU__', '__EBDAKT__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__EBDAKONVERTURKONTENUT__', '__EBDAKK__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'ĠIMGĦAKURRENTI', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ĠTĠKURRENTI', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'ĠIMGĦALOKALI', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ĠTĠLOKALI', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDTAR-REVIŻJONI', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ĠURNATATAR-REVIŻJONI', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ĠURNATATAR-REVIŻJONI2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'XAHARTAR-REVIŻJONI', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'SENATAR-REVIŻJONI', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'TIMBRUTAR-REVIŻJONI', 'REVISIONTIMESTAMP' ),
-       'fullurl'                 => array( '0', 'URLSĦIĦA:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLSĦIĦAE:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'IBDAKŻ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'IBDAKK:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'KŻ:', 'LC:' ),
-       'uc'                      => array( '0', 'KK:', 'UC:' ),
-       'displaytitle'            => array( '1', 'URITITLU', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__ĦOLQASEZZJONIĠDIDA__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__EBDAĦOLQASEZZJONIĠDIDA__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'VERŻJONIKURRENTI', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'URLKODIĊI:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ANKRAKODIĊI', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'TIMBRUTAL-ĦINKURRENTI', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'TIMBRUTAL-ĦINLOKALI', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'MARKATAD-DIREZZJONI', 'MARKADIRE', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#LINGWA:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'LINGWATAL-KONTENUT', 'LINGKONTENUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PAĠNIFL-ISPAZJUTAL-ISEM:', 'PAĠNISI:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'NUMRUTA\'AMMIN', 'NUMBEROFADMINS' ),
-       'padleft'                 => array( '0', 'PADXELLUG', 'PADLEFT' ),
-       'padright'                => array( '0', 'PADLEMIN', 'PADRIGHT' ),
-       'special'                 => array( '0', 'speċjali', 'special' ),
-       'defaultsort'             => array( '1', 'DEFAULTSORTJA:', 'DEFAULTSORTJAĊAVETTA:', 'DEFAULTKATEGORIJISORTJA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'DESTINAZZJONITAL-FAJL:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'tabella', 'tag' ),
-       'hiddencat'               => array( '1', '__KATMOĦBIJA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAĠNIFIL-KATEGORIJA', 'PAĠNIFILK', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'DAQSTAL-PAĠNI', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDIĊI__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__EBDAINDIĊI__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'NUMRUFIL-GRUPP', 'NUMFIL-GRUPP', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__RIINDIRIZZSTATIKU__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'LIVELLITA\'PROTEZZJONI', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'formatdata', 'dataformat', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#RINDIRIZZA', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__EBDAWERREJ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__EBDAGALLERIJA__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__SFORZAWERREJ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__WERREJ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__EBDASEZZJONIMODIFIKA__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'XAHARKURRENTI', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'ISEMXAHARKURRENTI', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ĠENISEMXAHARKURRENTI', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ABBREVXAHARKURRENTI', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ĠURNATAKURRENTI', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ĠURNATAKURRENTI2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ISEMĠURNATAKURRENTI', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'SENAKURRENTI', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ĦINKURRENTI', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'SIEGĦAKURRENTI', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'XAHARLOKALI', 'XAHARLOKALI2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'XAHARLOKALI1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'ISEMXAHARLOKALI', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'ĠENISEMXAHARLOKALI', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ABBREVXAHARLOKALI', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ĠURNATALOKALI', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ĠURNATALOKALI2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'ISEMTAL-ĠURNATALOKALI', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'SENALOKALI', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ĦINLOKALI', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'SIEGĦALOKALI', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NUMRUTA\'PAĠNI', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NUMRUTA\'ARTIKLI', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NUMRUTA\'FAJLS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NUMRUTA\'UTENTI', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NUMRUTA\'UTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NUMBRUTA\'MODIFIKI', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NUMRUTA\'VISTI', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'ISEMTAL-PAĠNA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ISEMTAL-PAĠNAE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'SPAZJUTAL-ISEM', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'SPAZJUTAL-ISEME', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'SPAZJUTA\'DISKUSSJONI', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'SPAZJUTA\'DISKUSSJONIE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'SPAZJUTAS-SUĠĠETT', 'SPAZJUTAL-ARTIKLU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'fullpagename'              => array( '1', 'ISEMSĦIĦTAL-PAĠNA', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ISEMTAL-PAĠNASĦIĦAE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ISEMTAS-SOTTOPAĠNA', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ISEMTAS-SUBPAĠNAE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'ISEMBAŻIKUTAL-PAĠNA', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'ISEMTAL-PAĠNATAL-BAŻIE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ISEMPAĠNATA\'DISKUSSJONI', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ISEMTAL-PAĠNATAD-DISKUSSJONIE', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'ISEMTAS-SUĠĠETTTAL-PAĠNA', 'ISEMTAL-ARTIKLUTAL-PAĠNA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'ISEMTAS-SUĠĠETTTAL-PAĠNAE', 'ISEMTAL-ARTIKLUTAL-PAĠNAE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'MSĠ:', 'MSG:' ),
+       'subst'                     => array( '0', 'BIDDEL:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'MSĠEW:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'daqsminuri', 'minuri', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'daqsminuri=$1', 'minuri=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'lemin', 'right' ),
+       'img_left'                  => array( '1', 'xellug', 'left' ),
+       'img_none'                  => array( '1', 'xejn', 'none' ),
+       'img_center'                => array( '1', 'nofs', 'ċentrali', 'ċentru', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'tilat', 'b\'tilar', 'tilar', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'bla_tilar', 'frameless' ),
+       'img_page'                  => array( '1', 'paġna=$1', 'paġna $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'wieqaf', 'wieqaf=$1', 'wieqaf $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'bordura', 'burdura', 'border' ),
+       'img_baseline'              => array( '1', 'bażi_tal-linja', 'baseline' ),
+       'img_sub'                   => array( '1', 'bid', 'sub' ),
+       'img_super'                 => array( '1', 'tajjeb', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'fuq', 'top' ),
+       'img_text_top'              => array( '1', 'test-fuq', 'text-top' ),
+       'img_bottom'                => array( '1', 'taħt', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'test-taħt', 'text-bottom' ),
+       'img_link'                  => array( '1', 'ħolqa=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'ISEMTAS-SIT', 'SITENAME' ),
+       'ns'                        => array( '0', 'IS:', 'NS:' ),
+       'localurl'                  => array( '0', 'URLLOKALI:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URLLOKALIE:', 'LOCALURLE:' ),
+       'servername'                => array( '0', 'ISEMTAS-SERVER', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'DESTINAZZJONITA\'SKRITT', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'GRAMMATIKA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'SESS:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__EBDAKONVERTURTITLU__', '__EBDAKT__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__EBDAKONVERTURKONTENUT__', '__EBDAKK__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'ĠIMGĦAKURRENTI', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ĠTĠKURRENTI', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'ĠIMGĦALOKALI', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ĠTĠLOKALI', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDTAR-REVIŻJONI', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ĠURNATATAR-REVIŻJONI', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ĠURNATATAR-REVIŻJONI2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'XAHARTAR-REVIŻJONI', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'SENATAR-REVIŻJONI', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'TIMBRUTAR-REVIŻJONI', 'REVISIONTIMESTAMP' ),
+       'fullurl'                   => array( '0', 'URLSĦIĦA:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLSĦIĦAE:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'IBDAKŻ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'IBDAKK:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'KŻ:', 'LC:' ),
+       'uc'                        => array( '0', 'KK:', 'UC:' ),
+       'displaytitle'              => array( '1', 'URITITLU', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__ĦOLQASEZZJONIĠDIDA__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__EBDAĦOLQASEZZJONIĠDIDA__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VERŻJONIKURRENTI', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'URLKODIĊI:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ANKRAKODIĊI', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'TIMBRUTAL-ĦINKURRENTI', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'TIMBRUTAL-ĦINLOKALI', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'MARKATAD-DIREZZJONI', 'MARKADIRE', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#LINGWA:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'LINGWATAL-KONTENUT', 'LINGKONTENUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PAĠNIFL-ISPAZJUTAL-ISEM:', 'PAĠNISI:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NUMRUTA\'AMMIN', 'NUMBEROFADMINS' ),
+       'padleft'                   => array( '0', 'PADXELLUG', 'PADLEFT' ),
+       'padright'                  => array( '0', 'PADLEMIN', 'PADRIGHT' ),
+       'special'                   => array( '0', 'speċjali', 'special' ),
+       'defaultsort'               => array( '1', 'DEFAULTSORTJA:', 'DEFAULTSORTJAĊAVETTA:', 'DEFAULTKATEGORIJISORTJA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'DESTINAZZJONITAL-FAJL:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'tabella', 'tag' ),
+       'hiddencat'                 => array( '1', '__KATMOĦBIJA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAĠNIFIL-KATEGORIJA', 'PAĠNIFILK', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'DAQSTAL-PAĠNI', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDIĊI__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__EBDAINDIĊI__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'NUMRUFIL-GRUPP', 'NUMFIL-GRUPP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__RIINDIRIZZSTATIKU__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'LIVELLITA\'PROTEZZJONI', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'formatdata', 'dataformat', 'formatdate', 'dateformat' ),
 );
 
 $messages = array(
@@ -279,7 +279,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Aħbi l-modifiki verifikati fit-tibdil riċenti',
 'tog-newpageshidepatrolled' => 'Aħbi l-paġni verifikati mil-lista tal-paġni l-ġodda',
 'tog-extendwatchlist' => "Espandi l-lista ta' osservazzjoni biex turi t-tibdil kollu, u mhux biss dak riċenti",
-'tog-usenewrc' => 'Uża t-tibdil riċenti avvanzat (bżonn tal-JavaScript)',
+'tog-usenewrc' => "Iġbor il-modifiki skont il-paġna fit-tibdil riċenti u fil-lista ta' osservazzjonijiet (bżonn tal-Javascript)",
 'tog-numberheadings' => 'Numerazzjoni awtomatika tat-titli tas-sezzjonijiet',
 'tog-showtoolbar' => 'Uri l-kolonna tal-għodda għall-immodifikar (bżonn tal-JavaScript)',
 'tog-editondblclick' => "Immodifika l-paġni permezz ta' klikk doppju (bżonn tal-JavaScript)",
@@ -287,8 +287,8 @@ $messages = array(
 'tog-editsectiononrightclick' => "L-immodifikar ta' sezzjonijiet bi klikk lemini fuq it-titli tas-sezzjonijiet (bżonn tal-JavaScript)",
 'tog-showtoc' => "Uri l-werrej (għal paġni b'iktar minn 3 sezzjonijiet)",
 'tog-rememberpassword' => "Ftakar il-login tiegħi fuq dan il-browżer (għal massimu ta' {{PLURAL:$1|ġurnata|$1 ġurnata}})",
-'tog-watchcreations' => "Żid il-paġni li noħloq fil-lista ta' osservazzjoni tiegħi",
-'tog-watchdefault' => "Żid il-paġni li nimmodifika fil-lista ta' osservazzjoni personali",
+'tog-watchcreations' => "Żid il-paġni li noħloq u l-fajls li ntella' fil-lista ta' osservazzjoni tiegħi",
+'tog-watchdefault' => "Żid il-paġni u l-fajls li nimmodifika fil-lista ta' osservazzjoni personali",
 'tog-watchmoves' => "Żid il-paġni li mmexxi fil-lista ta' osservazzjoni tiegħi",
 'tog-watchdeletion' => "Żid il-paġni li nħassar mal-lista ta' osservazzjoni tiegħi",
 'tog-minordefault' => 'Immarka awtomatikament kull modifika bħala waħda minuri',
@@ -297,7 +297,7 @@ $messages = array(
 'tog-nocache' => 'Iddiżattiva l-cache tal-paġni tal-browser',
 'tog-enotifwatchlistpages' => "Ibgħatli ittra-e kull meta sseħħ modifika fuq paġna li tinsab fil-lista ta' osservazzjoni tiegħi",
 'tog-enotifusertalkpages' => "Ibgħatli ittra-e kull meta l-paġna ta' diskussjoni tiegħi tiġi modifikata",
-'tog-enotifminoredits' => 'Ibgħatli wkoll ittra-e għall-modifiki minuri fuq paġni',
+'tog-enotifminoredits' => 'Ibgħatli wkoll ittra-e għall-modifiki minuri fuq paġni u fajls',
 'tog-enotifrevealaddr' => "Ikxef l-indirizz tal-posta elettronika tiegħi fil-messaġġi ta' avviż",
 'tog-shownumberswatching' => "Uri n-numru ta' utenti li qegħdin isegwu din il-paġna",
 'tog-oldsig' => 'Firma attwali:',
@@ -313,7 +313,6 @@ $messages = array(
 'tog-watchlisthideliu' => "Aħbi modifiki minn utenti illogjati mil-lista ta' osservazzjoni tiegħi",
 'tog-watchlisthideanons' => "Aħbi modifiki minn utenti anonimi mil-lista ta' osservazzjoni",
 'tog-watchlisthidepatrolled' => "Aħbi l-modifiki verifikati mil-lista ta' osservazzjoni",
-'tog-nolangconversion' => 'Disattiva konversazzjonijiet fost varjanti lingwistiċi',
 'tog-ccmeonemails' => "Ibgħatli kopji tal-ittri-e li nibgħat 'l utenti oħrajn",
 'tog-diffonly' => 'Turiex kontenut tal-paġni wara li tkun għamilt paragun bejn il-verżjonijiet',
 'tog-showhiddencats' => 'Uri kategoriji moħbija',
@@ -948,6 +947,7 @@ Jekk jogħġbok, erġa' pprova. Jekk xorta tibqa' ma taħdimx, ipprova [[Special
 Din il-modifika ma ġietx aċċettata sabiex ma jkunx hemm żballji fit-test tal-paġna. Dan xi kultant jiġri minħabba li qiegħed tuża servizz difettuż anonimu li huwa bbażat fuq il-web ta' prokura.'''",
 'edit_form_incomplete' => "'''Ċerti parti tal-formola tal-modifika ma laħqux is-server; iċċekkja jekk il-modifiki tiegħek humiex intatti u erġa' pprova.'''",
 'editing' => "Modifika ta' $1",
+'creating' => 'Qiegħed toħloq $1',
 'editingsection' => "Modifika ta' $1 (sezzjoni)",
 'editingcomment' => 'Qed jiġi editjat $1 (sezzjoni ġdida)',
 'editconflict' => "Kunflitt t'editjar: $1",
@@ -1003,7 +1003,7 @@ Tista' tmur lura u tagħmel modifiki ta' paġni eżistenti, inkella [[Special:Us
 
 Aċċerta ruħek jekk huwiex opportun li tkompli timmodifika din il-paġna.
 Ir-reġistru tat-tħassir u tal-mixi huwa pprovdut għal aktar konvenjenza:",
-'moveddeleted-notice' => 'Din il-paġna ġiet imħassra. Ir-reġistri tat-tħassir u tal-mixi għal din il-paġna huma provduti hawn taħt għal referenza.',
+'moveddeleted-notice' => 'Din il-paġna ġiet imħassra. Ir-reġistri tat-tħassir u tal-mixi għal din il-paġna huma provduti hawn taħt bħala referenza.',
 'log-fulllog' => 'Uri r-reġistru sħiħ',
 'edit-hook-aborted' => "Il-modifika ġiet abbandunata mill-''hook''.
 Ma ngħatat l-ebda spjegazzjoni.",
@@ -1203,6 +1203,7 @@ Nota li l-użu tal-links tan-navigazzjoni jagħmel reset tal-kolonna.",
 # Diffs
 'history-title' => 'Kronoloġija tal-modifiki ta\' "$1"',
 'difference-title' => 'Differenza bejn ir-reviżjonijiet ta\' "$1"',
+'difference-title-multipage' => 'Differenza bejn il-paġni "$1" u "$2"',
 'difference-multipage' => '(Differenzi bejn il-paġni)',
 'lineno' => 'Linja $1:',
 'compareselectedversions' => 'Qabbel il-verżjonijiet magħżula',
@@ -1300,6 +1301,7 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
 'prefs-beta' => 'Karatteristiċi tal-Beta',
 'prefs-datetime' => 'Data u ħin',
 'prefs-labs' => 'Karatteristiċi tal-laboratorji',
+'prefs-user-pages' => 'Paġni tal-utent',
 'prefs-personal' => 'Profil tal-utent',
 'prefs-rc' => 'Modifiki riċenti',
 'prefs-watchlist' => 'Osservazzjoni speċjali',
@@ -1475,6 +1477,7 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
 'right-writeapi' => 'Uża API sabiex tagħmel modifiki fil-wiki',
 'right-delete' => 'Ħassar paġni',
 'right-bigdelete' => "Ħassar paġni b'kronoloġija kbira",
+'right-deletelogentry' => "Ħassar u reġġa' lura daħliet speċifi tar-reġistru",
 'right-deleterevision' => 'Ħassar reviżjonijiet speċifiki tal-paġni',
 'right-deletedhistory' => 'Uri r-reviżjonijiet tal-kronoloġija li huma mħassra mingħajr it-test assoċjat.',
 'right-deletedtext' => 'Jara test imħassar u modifiki bejn reviżjonijiet imħassra',
@@ -1584,6 +1587,7 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
 'number_of_watching_users_pageview' => '[osservat minn {{PLURAL:$1|$1 utent|$1 utent}}]',
 'rc_categories' => 'Illimita għall-kategoriji (issepara b\' "|")',
 'rc_categories_any' => 'Kwalunkwe',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} wara l-modifika',
 'newsectionsummary' => '/* $1 */ sezzjoni ġdida',
 'rc-enhanced-expand' => 'Uri d-dettalji (hemm bżonn tal-JavaScript)',
 'rc-enhanced-hide' => 'Aħbi d-dettalji',
@@ -1614,9 +1618,9 @@ Ir-reġistru tat-tħassir u tat-tmexxieh għal din il-paġna huma mogħtija għa
 Biex tara jew tfittex fajls li ġew mtellgħin qabel mur fil-[[Special:FileList|lista ta' fajls mtellgħin]]. Fajls imtellgħin u verżjonijiet ġodda tal-fajls huma reġistrati fir-[[Special:Log/upload|reġistru tat-tlugħ tal-fajls]], u dawk li tħassru huma fir-[[Special:Log/delete|reġistru tat-tħassir]].
 
 Biex tinkludi fajl f'paġna, uża ħolqa taħt waħda minn dawn il-forom:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fajl.jpg]]</nowiki></tt>''' sabiex tuża' l-verżjoni sħiħa tal-fajl
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fajl.png|200px|thumb|left|test alternattiv]]</nowiki></tt>''' sabiex tpoġġi l-istampa fuq ix-xellug ġo kaxxa ta' 200px b'\"test alternattiv\" tkun id-deskrizzjoni
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fajl.ogg]]</nowiki></tt>''' biex toħloq ħolqa diretta lejn il-fajl, mingħajr ma turih.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fajl.jpg]]</nowiki></code>''' sabiex tuża' l-verżjoni sħiħa tal-fajl
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fajl.png|200px|thumb|left|test alternattiv]]</nowiki></code>''' sabiex tpoġġi l-istampa fuq ix-xellug ġo kaxxa ta' 200px b'\"test alternattiv\" tkun id-deskrizzjoni
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fajl.ogg]]</nowiki></code>''' biex toħloq ħolqa diretta lejn il-fajl, mingħajr ma turih.",
 'upload-permitted' => "Tipi ta' fajls permessi: $1.",
 'upload-preferred' => "Tipi ta' fajls preferuti: $1.",
 'upload-prohibited' => "Tipi ta' fajls projibiti: $1.",
@@ -1661,19 +1665,19 @@ dan il-fajl huwa $2 kbir.',
 'emptyfile' => "Il-Fajl li ġie ''uploaded'' jidher li huwa vojt. Dan jista' jkun minħabba żball fl-isem tal-fajl.
 Jekk jogħġbok verifika jekk xorta waħda trid itella' dan il-fajl.",
 'windows-nonascii-filename' => "Din il-wiki ma taċċettax ismijiet tal-fajls b'karattri speċjali.",
-'fileexists' => "Fajl b'dan l-isem ġa jeżisti, jekk jogħġbok verifika l-ewwel '''<tt>[[:$1]]</tt>''' jekk ma tridx tikteb fuqu.
+'fileexists' => "Fajl b'dan l-isem ġa jeżisti, jekk jogħġbok verifika l-ewwel <strong>[[:$1]]</strong> jekk ma tridx tikteb fuqu.
 [[$1|thumb]]",
-'filepageexists' => "Il-paġna ta' deskrizzjoni għal dan il-fajl diġà ġiet maħluqa f''''<tt>[[:$1]]</tt>''', iżda l-ebda fajl b'dan l-isem ma jeżisti. It-taqsira li daħħalt mhux se tidher fuq il-paġna ta' deskrizzjoni.
+'filepageexists' => "Il-paġna ta' deskrizzjoni għal dan il-fajl diġà ġiet maħluqa f'<strong>[[:$1]]</strong>, iżda l-ebda fajl b'dan l-isem ma jeżisti. It-taqsira li daħħalt mhux se tidher fuq il-paġna ta' deskrizzjoni.
 Sabiex it-taqsira tidher fuq il-paġna ta' deskrizzjoni, huwa neċessarju li timmodifikaha manwalment.
 [[$1|thumb]]",
 'fileexists-extension' => "Diġà jeżisti fajl b'isem simili: [[$2|thumb]]
-* L-isem tal-fajl imtella': '''<tt>[[:$1]]</tt>'''
-* L-isem tal-fajl eżistenti: '''<tt>[[:$2]]</tt>'''
+* L-isem tal-fajl imtella': <strong>[[:$1]]</strong>
+* L-isem tal-fajl eżistenti: <strong>[[:$2]]</strong>
 Jekk jogħġbok, agħżel isem differenti.",
 'fileexists-thumbnail-yes' => "Il-fajl li ttella' jidher li huwa stampa żgħira ''(minjatura)''. [[$1|thumb]]
-Jekk jogħġbok, iċċekkja dan il-fajl '''<tt>[[:$1]]</tt>'''.
+Jekk jogħġbok, iċċekkja dan il-fajl <strong>[[:$1]]</strong>.
 Jekk il-fajl li ċċekkjajt huwa l-istess stampa fid-daqs oriġinali, m'hemmx bżonn li ttella' minjatura oħra.",
-'file-thumbnail-no' => "L-isem tal-fajl jibda' b''''<tt>$1</tt>'''. Jidher ukoll li din hija stampa tad-daqs imnaqqas ''(thumbnail)''.<br />
+'file-thumbnail-no' => "L-isem tal-fajl jibda' b'<strong>$1</strong>. Jidher ukoll li din hija stampa tad-daqs imnaqqas ''(thumbnail)''.<br />
 Jekk għandek din l-istampa ta' riżoluzzjoni sħiħa, jekk jogħġbok, tella' dan il-fajl jew inkella immodifika l-isem tal-fajl.",
 'fileexists-forbidden' => "Fajl b'dan l-isem diġà jeżisti.<br />
 Jekk jogħġbok mur lura u tella' dan il-fajl b'isem ġdid. [[File:$1|thumb|center|$1]]",
@@ -1742,6 +1746,10 @@ Jekk il-problema tkompli tippersisti, ikkuntatja lil xi [[Special:ListUsers/syso
 'upload-unknown-size' => 'Dimensjoni mhux magħrufa',
 'upload-http-error' => 'Qam żball HTTP: $1',
 
+# File backend
+'backend-fail-delete' => 'Il-fajl "$1" ma setax jiġi mħassar.',
+'backend-fail-alreadyexists' => 'Il-fajl "$1" diġà jeżisti.',
+
 # ZipDirectoryReader
 'zip-file-open-error' => 'Qam żball waqt il-ftuħ tal-fajl għall-kontrolli ZIP.',
 'zip-wrong-format' => 'Il-fajl speċifikat ma kienx fajl ZIP.',
@@ -1882,11 +1890,12 @@ Id-deskrizzjoni fuq il-[$2 paġna ta' deskrizzjoni tal-fajl] tinsab hawn taħt."
 ** Fajl duplikat",
 'filedelete-edit-reasonlist' => 'Immodifika r-raġunijiet għat-tħassir',
 'filedelete-maintenance' => "It-tħassir u r-restawr ta' fajls huwa diżattivat għall-mument minħabba xi manutenzjoni.",
+'filedelete-maintenance-title' => 'Il-fajl ma jistax jiġi mħassar',
 
 # MIME search
 'mimesearch' => 'Fittex fil-bażi għal tip MIME',
 'mimesearch-summary' => "Din il-paġna tippermetti l-iffiltrar ta' fajls abbażi tat-tip MIME.
-Daħħal: tip/sottotip, eż. <tt>image/jpeg</tt>.",
+Daħħal: tip/sottotip, eż. <code>image/jpeg</code>.",
 'mimetype' => 'Tip MIME:',
 'download' => 'niżżel',
 
@@ -1930,7 +1939,7 @@ Daħħal: tip/sottotip, eż. <tt>image/jpeg</tt>.",
 'statistics-users-active-desc' => 'Utenti li wettqu azzjoni fl-aħħar {{PLURAL:$1|ġurnata|$1 ġurnata}}',
 'statistics-mostpopular' => 'Il-paġni l-aktar miżjura',
 
-'disambiguations' => "Paġni ta' diżambigwazzjoni",
+'disambiguations' => "Paġni li jorbtu lejn paġni ta' diżambigwazzjoni",
 'disambiguationspage' => 'Template:diżambig',
 'disambiguations-text' => "Il-Paġni li jinsabu f'din lista huma parti minn '''paġna ta' diżambigwazzjoni''' b'hekk għandhom jiġu relatati mas-suġġett preċiż minflok. <br />
 Paġna tiġi stimata paġna ta' diżambigwazzjoni dawk kollha li jagħmlu użu mit-template elenkat f'[[MediaWiki:Disambiguationspage]]",
@@ -1956,7 +1965,7 @@ Kull filliera għandha ħolqa għall-ewwel u t-tieni riindirizz, kif ukoll fejn
 
 # Miscellaneous special pages
 'nbytes' => '{{PLURAL:$1|byte|$1  bytes}}',
-'ncategories' => '{{PLURAL:$1|kategorija|$1  kategoriji}}',
+'ncategories' => '{{PLURAL:$1|kategorija|$1 kategoriji}}',
 'nlinks' => '{{PLURAL:$1|link|$1 links}}',
 'nmembers' => '$1 {{PLURAL:$1|membru|membri}}',
 'nrevisions' => '{{PLURAL:$1|reviżjoni|$1 reviżjonijiet}}',
@@ -2029,12 +2038,13 @@ Kun af li siti elettroniċi oħra jistgħu jorbtu b'ħolqa diretta lejn il-fajl,
 
 # Special:Log
 'specialloguserlabel' => 'Azzjoni effettwata minn:',
-'speciallogtitlelabel' => 'Titlu:',
+'speciallogtitlelabel' => 'Azzjoni effetwata fuq:',
 'log' => 'Reġistri',
 'all-logs-page' => 'Ir-reġistri pubbliċi kollha',
-'alllogstext' => "Preżentazzjoni unifikata tar-reġistri kollha ta' {{SITENAME}}. Tista' tqassar il-kriterji ta' tfittxija billi tagħżel it-tip ta' reġistru, l-isem tal-utent, jew il-paġna affetwata (it-tnejn tal-aħħar huma sensittivi għal kif jinkitbu l-karattri).",
+'alllogstext' => "Ġabra sħiħa tar-reġistri kollha ta' {{SITENAME}}. Tista' tqassar il-kriterji ta' tfittxija billi tagħżel it-tip ta' reġistru, l-isem tal-utent, jew il-paġna affetwata (it-tnejn tal-aħħar huma sensittivi għal kif jinkitbu l-karattri).",
 'logempty' => "Ir-reġistru m'għandu l-ebda element li jaqbel mat-tfittxija tiegħek.",
 'log-title-wildcard' => "Tfittxija ta' titli li jibdew b'dan it-test",
+'showhideselectedlogentries' => 'Uri/aħbi d-daħliet magħżula tar-reġistru',
 
 # Special:AllPages
 'allpages' => 'Il-paġni kollha',
@@ -2052,6 +2062,11 @@ Kun af li siti elettroniċi oħra jistgħu jorbtu b'ħolqa diretta lejn il-fajl,
 'allpagesprefix' => 'Uri l-paġni bil-prefiss:',
 'allpagesbadtitle' => "It-titlu indikat għal dil-paġna mhuwiex validu jew inkella fih xi prefiss interlingwa jew interwiki. Għaldaqstant, jista' ikun fih xi karratru(i) li ma jistgħux jintużaw fit-titli.",
 'allpages-bad-ns' => 'In-namespace "$1" ma jeżistix fuq {{SITENAME}}.',
+'allpages-hide-redirects' => 'Aħbi rindirizzi',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Qiegħed tara verżjoni ta' din il-paġna memorizzata fil-''cache'', li tista' tkun antika sa massimu ta' $1.",
+'cachedspecial-refresh-now' => 'Uri l-iktar riċenti.',
 
 # Special:Categories
 'categories' => 'Kategoriji',
@@ -2068,12 +2083,12 @@ Ara wkoll il-[[Special:WantedCategories|kategoriji rikjesti]].',
 'sp-deletedcontributions-contribs' => 'kontribuzzjonijiet',
 
 # Special:LinkSearch
-'linksearch' => 'Ħoloq esterni',
+'linksearch' => 'Fittex ħoloq esterni',
 'linksearch-pat' => "Mudell ta' tfittxija:",
 'linksearch-ns' => 'Spazju tal-isem:',
 'linksearch-ok' => 'Fittex',
 'linksearch-text' => 'Huwa possibbli li tagħmel użu minn metakarattri, per eżempju "*.wikipedia.org".<br />
-Protokolli aċċettati: <tt>$1</tt>',
+Protokolli aċċettati: <code>$1</code>',
 'linksearch-line' => '$1 hija marbuta mill-paġna $2',
 'linksearch-error' => 'Il-metakarattri jistgħu jintużaw biss fil-bidu tal-indirizz.',
 
@@ -2312,7 +2327,7 @@ Il-Preferenzi kurrenti ta' din il-paġni huma '''$1''':",
 'protect-othertime' => 'Ħin ieħor:',
 'protect-othertime-op' => 'ħin ieħor',
 'protect-existing-expiry' => 'Skadenza attwali: $2, $3',
-'protect-otherreason' => 'Raġunijiet oħra/addizjonali:',
+'protect-otherreason' => 'Raġunijiet oħra/addizzjonali:',
 'protect-otherreason-op' => 'Raġuni oħra',
 'protect-dropdown' => '*Raġunijiet komuni għall-protezzjoni
 ** Vandaliżmu eċċessiv
@@ -2471,7 +2486,7 @@ Indika r-raġuni speċifika għalfejn tixtieq tipproċedi bil-blokk (per eżempj
 'ipbcreateaccount' => "Impedixxi ħolqien ta' kontijiet oħrajn",
 'ipbemailban' => 'Impedixxi utenti milli jkunu jistgħu jibgħatu posta elettronika',
 'ipbenableautoblock' => 'Awtomatikament blokka l-aħħar indirizz tal-IP użat minn dan l-utent, u IP suċċessivi li jipprovaw jagħmlu modifiki',
-'ipbsubmit' => 'Imblokk lil dan l-utent',
+'ipbsubmit' => 'Imblokka lil dan l-utent',
 'ipbother' => 'Ħin ieħor:',
 'ipboptions' => 'sagħtejn:2 hours,ġurnata 1:1 day,3 ġranet:3 days,ġimgħa 1:1 week,ġimgħatejn:2 weeks,xahar 1:1 month,3 xhur:3 months,6 xhur:6 months,sena 1:1 year,infinita:infinite',
 'ipbotheroption' => 'ieħor',
@@ -2639,7 +2654,7 @@ Jekk jogħġbok, waħħad iż-żewġ paġni manwalment.'''",
 'movetalk' => "Mexxi wkoll il-paġna ta' diskussjoni",
 'move-subpages' => 'Mexxi s-sottopaġni (sa $1)',
 'move-talk-subpages' => "Mexxi is-sottopaġni kollha tal-paġna ta' diskussjoni (sa $1)",
-'movepage-page-exists' => 'Il-Paġna $1 ġa teżisti u ma tistax tiġi awtomatikament miktub fuqha.',
+'movepage-page-exists' => 'Il-paġna $1 diġà teżisti u ma tistax tiġi miktuba fuqha awtomatikament.',
 'movepage-page-moved' => 'Il-Paġna $1 ġiet imċaqilqa għal $2.',
 'movepage-page-unmoved' => 'Il-Paġna $1 ma setgħatx tiġi mċaqilqa għal $2.',
 'movepage-max-pages' => "Ġie mċaqlaq in-numru massimu ta' {{PLURAL:$1|paġna u ma jistax jiġi mċaqlaq aktar awtomatikament|$1 paġni u ma jistgħux jiġu mċaqilqa aktar awtomatikament.}}",
@@ -2766,6 +2781,7 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 'import-invalid-interwiki' => 'Ma jistax jiġi importat mill-wiki indikata.',
 'import-error-edit' => 'Il-paġna "$1" ma ġietx  impurtata minħabba li mintix awtorizzat li timmodifikaha.',
 'import-error-create' => 'Il-paġna "$1" ma ġietx  impurtata minħabba li mintix awtorizzat li toħloqha.',
+'import-error-invalid' => 'Il-paġna "$1" ma ġietx impurtata minħabba li isimha hi invalida.',
 
 # Import log
 'importlogpage' => 'Importazzjoni',
@@ -2775,6 +2791,14 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 'import-logentry-interwiki' => 'Trasferixxejt minn wiki ieħor il-paġna $1',
 'import-logentry-interwiki-detail' => '{{PLURAL:$1|reviżjoni|$1 reviżjonijiet}} minn $2',
 
+# JavaScriptTest
+'javascripttest' => 'Testjar tal-JavaScript',
+'javascripttest-disabled' => 'Din il-funzjoni ma ġietx abilitata fuq din il-wiki.',
+'javascripttest-pagetext-noframework' => 'Din il-paġna hi riservata għall-eżekuzzjoni tat-testijiet tal-JavaScript.',
+'javascripttest-pagetext-frameworks' => 'Jekk jogħġbok agħżel wieħed mill-oqsma tal-ittestjar: $1',
+'javascripttest-pagetext-skins' => 'Agħżel aspett grafiku fuq liema tesegwixxi testijiet:',
+'javascripttest-qunit-intro' => 'Ara d-[$1 dokumentazzjoni dwar it-test] fuq mediawiki.org.',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Il-paġna tal-utent tiegħek',
 'tooltip-pt-anonuserpage' => "Il-Paġna tal-utent ta' dan l-indirizz tal-IP",
@@ -2835,6 +2859,8 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 'tooltip-diff' => 'Uri liem modifiki għamilt fit-test.',
 'tooltip-compareselectedversions' => "Ara d-differenzi bejn iż-żewġ verżjonijiet magħżula ta' din il-paġna.",
 'tooltip-watch' => "Żid din il-paġna mal-lista ta' osservazzjoni tiegħek",
+'tooltip-watchlistedit-normal-submit' => 'Neħħi t-titli',
+'tooltip-watchlistedit-raw-submit' => "Aġġorna l-lista ta' osservazzjoni",
 'tooltip-recreate' => "Erġa' oħloq din il-paġna minkejja li kienet ġiet imħassra",
 'tooltip-upload' => "Ibda tella'",
 'tooltip-rollback' => '"Rollback" tannulla l-modifiki li saru mill-aħħar kontributur fuq din il-paġna, permezz ta\' sempliċi klikk',
@@ -2886,19 +2912,15 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 'spambot_username' => 'Tindif tal-MedjaWiki mill-ispam',
 'spam_reverting' => "Erġa' lura għall-aħħar verżjoni li m'għandiex link għal $1",
 'spam_blanking' => 'Paġna svojtjata, kull verżjoni kellu link għal $1',
+'spam_deleting' => 'Paġna mħassra, ir-reviżjonijiet kollha kellhom ħoloq lejn $1',
 
 # Info page
 'pageinfo-title' => 'Informazzjoni għal "$1"',
 'pageinfo-header-edits' => 'Modifiki',
-'pageinfo-header-watchlist' => "Lista ta' osservazzjonijiet",
-'pageinfo-header-views' => 'Viżti',
-'pageinfo-subjectpage' => 'Paġna',
-'pageinfo-talkpage' => "Paġna ta' diskussjoni",
+'pageinfo-views' => "Numru ta' viżti",
 'pageinfo-watchers' => "Numru ta' osservaturi",
 'pageinfo-edits' => "Numru ta' modifiki",
 'pageinfo-authors' => "Numru ta' awturi distinti",
-'pageinfo-views' => "Numru ta' viżti",
-'pageinfo-viewsperedit' => 'Viżti kull modifika',
 
 # Skin names
 'skinname-standard' => 'Classic',
@@ -3258,6 +3280,8 @@ Oħrajn jiġu moħbija kif inhu definit oriġinarjament.
 # Flash modes
 'exif-flash-fired-0' => "Il-''flash'' ma ħariġx",
 'exif-flash-fired-1' => "Il-''flash'' ħareġ",
+'exif-flash-function-1' => "''Flash'' diżattivata",
+'exif-flash-redeye-1' => 'modalità riduzzjoni tal-għajnejn ħomor',
 
 'exif-focalplaneresolutionunit-2' => 'pulzier',
 
@@ -3568,6 +3592,9 @@ Inti tista' wkoll tuża' l-[[Special:EditWatchlist|editur bl-interfaċċa standa
 'iranian-calendar-m9' => 'Azar',
 'iranian-calendar-m10' => 'Dey',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskussjoni]])',
+
 # Core parser functions
 'unknown_extension_tag' => 'Estensjoni tat-tag mhux magħrufa "$1"',
 'duplicate-defaultsort' => '\'\'\'Twissija:\'\'\' iċ-ċavetta tal-issortjar oriġinali "$2" tissostitwixxi dik preċedenti "$1".',
@@ -3600,6 +3627,9 @@ Flimkien ma' dan il-programm suppost kellek tirċievi [{{SERVER}}{{SCRIPTPATH}}/
 'version-software' => 'Softwer installat',
 'version-software-product' => 'Prodott',
 'version-software-version' => 'Verżjoni',
+'version-entrypoints' => "URL ta' aċċess",
+'version-entrypoints-header-entrypoint' => "Punt ta' dħul",
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Post tal-fajl',
@@ -3704,12 +3734,18 @@ Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-p
 
 # New logging system
 'logentry-delete-delete' => '$1 ħassar il-paġna $3',
+'logentry-delete-restore' => "$1 reġġa' lura l-paġna $3",
+'logentry-delete-event' => "$1 biddel il-viżibilità ta' {{PLURAL:$5|azzjoni tar-reġistru|$5 azzjonijiet tar-reġistru}} ta' $3: $4",
 'revdelete-restricted' => "limiti applikati 'l amministraturi",
 'revdelete-unrestricted' => "neħħi l-limiti 'l amministraturi",
 'logentry-move-move' => '$1 mexxa l-paġna $3 għal $4',
 'logentry-move-move-noredirect' => '$1 mexxa l-paġna $3 għal $4 mingħajr ma ħalla rindirizz',
 'logentry-move-move_redir' => '$1 mexxa l-paġna $3 għal $4 fuq rindrizz',
 'logentry-move-move_redir-noredirect' => '$1 mexxa l-paġna $3 għal $4 fuq rindirizz mingħajr ma ħalla rindirizz',
+'logentry-newusers-newusers' => '$1 ħoloq kont tal-utent',
+'logentry-newusers-create' => '$1 ħoloq kont tal-utent',
+'logentry-newusers-create2' => '$1 ħoloq kont tal-utent $3',
+'logentry-newusers-autocreate' => 'Il-kont $1 ġie maħluq awtomatikament',
 'newuserlog-byemail' => "il-password intbagħtet permezz ta' posta elettronika",
 
 # Feedback
@@ -3725,4 +3761,26 @@ Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-p
 'feedback-bugcheck' => 'Tajjeb ħafna! Ivverifika li mhux diġà fost id-[$1 difetti magħrufa].',
 'feedback-bugnew' => 'Ikkontrollajt. Irrapporta d-difett',
 
+# API errors
+'api-error-fileexists-forbidden' => 'Fajl bl-isem "$1" diġà jeżisti, u ma jistax jiġi miktub fuqu.',
+'api-error-fileexists-shared-forbidden' => 'Fajl bl-isem "$1" diġà jeżisti fir-repożitorju maqsum u ma jistax jiġi miktub fuqu.',
+'api-error-file-too-large' => 'Il-fajl magħżul huwa wisq kbir.',
+'api-error-filename-tooshort' => 'L-isem tal-fajl huwa qasir wisq.',
+'api-error-filetype-banned' => "It-tip ta' fajl mhuwiex aċċettat.",
+'api-error-filetype-missing' => 'L-isem tal-fajl jonqsu l-estensjoni.',
+'api-error-illegal-filename' => 'L-isem tal-fajl mhuwiex permess.',
+'api-error-uploaddisabled' => "It-tlugħ ta' fajls mhuwiex attivat fuq din il-wiki.",
+'api-error-verification-error' => "Dan il-fajl jista' jkun imħassar, jew għandu l-estensjoni l-ħażina.",
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekonda|sekondi}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuti}}',
+'duration-hours' => '$1 {{PLURAL:$1|siegħa|sigħat}}',
+'duration-days' => '$1 {{PLURAL:$1|jum|jiem}}',
+'duration-weeks' => '$1 {{PLURAL:$1|ġimgħa|ġimgħat}}',
+'duration-years' => '$1 {{PLURAL:$1|sena|snin}}',
+'duration-decades' => '$1 {{PLURAL:$1|deċennju|deċennji}}',
+'duration-centuries' => '$1 {{PLURAL:$1|seklu|sekli}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennju|millennji}}',
+
 );
index 8047db0..ac69cb0 100644 (file)
@@ -64,17 +64,17 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ANCAMINAR', '#REDIRECIONAMENTO', '#REDIRECT' ),
-       'img_right'               => array( '1', 'dreita', 'direita', 'right' ),
-       'img_left'                => array( '1', 'squierda', 'esquerda', 'left' ),
-       'img_none'                => array( '1', 'nanhun', 'nenhum', 'none' ),
-       'img_center'              => array( '1', 'centro', 'center', 'centre' ),
-       'img_middle'              => array( '1', 'meio', 'middle' ),
-       'language'                => array( '0', '#LHENGUA:', '#IDIOMA:', '#LANGUAGE:' ),
-       'filepath'                => array( '0', 'CAMINOFEXEIRO:', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'eitiqueta', 'tag' ),
-       'pagesize'                => array( '1', 'TAMANHOFEXEIRO', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
-       'staticredirect'          => array( '1', '_ANCAMINARSTATICO_', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ),
+       'redirect'                  => array( '0', '#ANCAMINAR', '#REDIRECIONAMENTO', '#REDIRECT' ),
+       'img_right'                 => array( '1', 'dreita', 'direita', 'right' ),
+       'img_left'                  => array( '1', 'squierda', 'esquerda', 'left' ),
+       'img_none'                  => array( '1', 'nanhun', 'nenhum', 'none' ),
+       'img_center'                => array( '1', 'centro', 'center', 'centre' ),
+       'img_middle'                => array( '1', 'meio', 'middle' ),
+       'language'                  => array( '0', '#LHENGUA:', '#IDIOMA:', '#LANGUAGE:' ),
+       'filepath'                  => array( '0', 'CAMINOFEXEIRO:', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'eitiqueta', 'tag' ),
+       'pagesize'                  => array( '1', 'TAMANHOFEXEIRO', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
+       'staticredirect'            => array( '1', '_ANCAMINARSTATICO_', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ),
 );
 
 $messages = array(
index 1459d46..65b112e 100644 (file)
@@ -12,6 +12,7 @@
  * @author Hanzaw
  * @author Hintha
  * @author Lagoonaing
+ * @author Liangent
  * @author Lionslayer
  * @author Minnyoonthit
  * @author Myanmars
@@ -391,8 +392,8 @@ $1',
 'loginprompt' => '{{SITENAME}} သို့ လော့အင်ဝင်ရန် ကွတ်ကီးသုံးနိုင်ရန် ပြုလုပ်ပေးထားရမည်။',
 'userlogin' => 'Log in ဝင်ရန်/ အကောင့် လုပ်ရန်',
 'userloginnocreate' => 'Log in ဝင်ရန်',
-'logout' => 'Log out ထွက်ရန်',
-'userlogout' => 'Log out ထွက်ရန်',
+'logout' => 'ထွက်ရန်',
+'userlogout' => 'ထွက်ရန်',
 'notloggedin' => 'logged in ဝင်မထားပါ',
 'nologin' => 'အကောင့်မရှိဘဲ ဖြစ်နေပါသလား။ $1။',
 'nologinlink' => 'အကောင့်လုပ်ရန်',
index ff028d5..f908fdc 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Erzya (Эрзянь)
+/** Erzya (эрзянь)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -114,75 +114,75 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'currentmonth'            => array( '1', 'МОЛИЦЯКОВ', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'МОЛИЦЯКОВЛЕМ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'МОЛИЦЯКОВЛЕМГЕН', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'МОЛИЦЯКОВКИРЬТЯНЬХВОРМА', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'МОЛИЦЯЧЫ', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'МОЛИЦЯЧЫ2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'МОЛИЦЯЧЫЛЕМ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'МОЛИЦЯИЕ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'МОЛИЦЯШКА', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'МОЛИЦЯЦЯС', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ТЕСКЭНЬКОВ', 'МЕСТНЫЙ_МЕСЯЦ', 'МЕСТНЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'ТЕСКЭНЬКОВЛЕМ', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'ТЕСКЭНЬКОВЛЕМГЕН', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_РОД', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ТЕСКЭНЬКОВКИРЬТЯНЬХВОРМА', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ТЕСКЭНЬЧЫ', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ТЕСКЭНЬЧЫ2', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'ТЕСКЭНЬЧЫЛЕМ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ТЕСКЭНЬИЕ', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ТЕСКЭНЬШКА', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ТЕСКЭНЬЦЯС', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ЗЯРОЛОПАТ', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ЗЯРОСЁРМАДОВКСТ', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ЗЯРОФАЙЛАТ', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ЗЯРОТЕИЦЯТ', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'ЗЯРОВИТНЕМАТПЕТНЕМАТ', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'ЛОПАЛЕМ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
-       'namespace'               => array( '1', 'ЛЕМПОТМО', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
-       'talkspace'               => array( '1', 'КОРТАМОПОТМО', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
-       'fullpagename'            => array( '1', 'ЛОПАЛЕМКУВАКАСТО', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
-       'talkpagename'            => array( '1', 'КОРТАМОЛОПАЛЕМ', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
-       'msg'                     => array( '0', 'ПАЧТЯМНЭ:', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
-       'img_thumbnail'           => array( '1', 'кенжешка', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
-       'img_right'               => array( '1', 'вить_кедь', 'справа', 'right' ),
-       'img_left'                => array( '1', 'керш_кедь', 'слева', 'left' ),
-       'img_none'                => array( '1', 'вейкеяк_арась', 'без', 'none' ),
-       'img_center'              => array( '1', 'куншкасо', 'центр', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'кундсо', 'обрамить', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'кундовтомо', 'безрамки', 'frameless' ),
-       'img_page'                => array( '1', 'лопа=$1', 'лопа $1', 'страница=$1', 'страница $1', 'страница $1', 'page=$1', 'page $1' ),
-       'img_top'                 => array( '1', 'верькс', 'сверху', 'top' ),
-       'img_text_top'            => array( '1', 'текст-верькс', 'текст-сверху', 'text-top' ),
-       'img_middle'              => array( '1', 'куншка', 'посередине', 'middle' ),
-       'img_bottom'              => array( '1', 'алкс', 'снизу', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'текст-алкс', 'текст-снизу', 'text-bottom' ),
-       'sitename'                => array( '1', 'САЙТЛЕМ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
-       'gender'                  => array( '0', 'СЫМЕ:', 'ПОЛ:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'МОЛИЦЯ_ТАРГО', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'МОЛИЦЯ_ЧИ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'ТЕСКЭНЬТАРГО', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
-       'revisionid'              => array( '1', 'ЛИЯКСТОМТОМАID', 'ИД_ВЕРСИИ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ЛИЯКСТОМТОМАЧЫ', 'ДЕНЬ_ВЕРСИИ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ЛИЯКСТОМТОМАЧЫ2', 'ДЕНЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'ЛИЯКСТОМТОМАКОВ', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ЛИЯКСТОМТОМАИЕ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
-       'plural'                  => array( '0', 'ЛАМОНЬЧИСЛА', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
-       'lcfirst'                 => array( '0', 'ВАСЕНЦЕ_ТЕШТЬКЕСЬ_ВИШКИНЕ:', 'ПЕРВАЯ_БУКВА_МАЛЕНЬКАЯ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ВАСЕНЦЕ_ТЕШТЬКЕСЬ_ПОКШ:', 'ПЕРВАЯ_БУКВА_БОЛЬШАЯ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'ВИШКА_ТЕШТЬКЕСЭ:', 'МАЛЕНЬКИМИ_БУКВАМИ:', 'LC:' ),
-       'uc'                      => array( '0', 'ПОШК_ТЕШТЬКЕСЭ:', 'БОЛЬШИМИ_БУКВАМИ:', 'UC:' ),
-       'raw'                     => array( '0', 'ВЕРЕКСТЭ', 'НЕОБРАБ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'НЕВТЕМС_КОНЯКС', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
-       'currentversion'          => array( '1', 'ТЕВАТЕВЕРСИЯ', 'ТЕКУЩАЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
-       'language'                => array( '0', '#КЕЛЕСЬ:', '#ЯЗЫК:', '#LANGUAGE:' ),
-       'numberofadmins'          => array( '1', 'ЗЯРОАДМИНТНЭДЕ', 'КОЛИЧЕСТВО_АДМИНИСТРАТОРОВ', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'башка_тевень', 'служебная', 'special' ),
-       'filepath'                => array( '0', 'ФАЙЛАНЬКИ', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
-       'pagesize'                => array( '1', 'ЛОПАКУВАЛМО', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
-       'url_path'                => array( '0', 'ЯН', 'ПУТЬ', 'PATH' ),
-       'url_wiki'                => array( '0', 'ВИКИ', 'WIKI' ),
+       'currentmonth'              => array( '1', 'МОЛИЦЯКОВ', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'МОЛИЦЯКОВЛЕМ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'МОЛИЦЯКОВЛЕМГЕН', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'МОЛИЦЯКОВКИРЬТЯНЬХВОРМА', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'МОЛИЦЯЧЫ', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'МОЛИЦЯЧЫ2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'МОЛИЦЯЧЫЛЕМ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'МОЛИЦЯИЕ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'МОЛИЦЯШКА', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'МОЛИЦЯЦЯС', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ТЕСКЭНЬКОВ', 'МЕСТНЫЙ_МЕСЯЦ', 'МЕСТНЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'ТЕСКЭНЬКОВЛЕМ', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'ТЕСКЭНЬКОВЛЕМГЕН', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_РОД', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ТЕСКЭНЬКОВКИРЬТЯНЬХВОРМА', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ТЕСКЭНЬЧЫ', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ТЕСКЭНЬЧЫ2', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'ТЕСКЭНЬЧЫЛЕМ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ТЕСКЭНЬИЕ', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ТЕСКЭНЬШКА', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ТЕСКЭНЬЦЯС', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ЗЯРОЛОПАТ', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ЗЯРОСЁРМАДОВКСТ', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ЗЯРОФАЙЛАТ', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ЗЯРОТЕИЦЯТ', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'ЗЯРОВИТНЕМАТПЕТНЕМАТ', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'ЛОПАЛЕМ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'ЛЕМПОТМО', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
+       'talkspace'                 => array( '1', 'КОРТАМОПОТМО', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
+       'fullpagename'              => array( '1', 'ЛОПАЛЕМКУВАКАСТО', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
+       'talkpagename'              => array( '1', 'КОРТАМОЛОПАЛЕМ', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
+       'msg'                       => array( '0', 'ПАЧТЯМНЭ:', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
+       'img_thumbnail'             => array( '1', 'кенжешка', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+       'img_right'                 => array( '1', 'вить_кедь', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'керш_кедь', 'слева', 'left' ),
+       'img_none'                  => array( '1', 'вейкеяк_арась', 'без', 'none' ),
+       'img_center'                => array( '1', 'куншкасо', 'центр', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'кундсо', 'обрамить', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'кундовтомо', 'безрамки', 'frameless' ),
+       'img_page'                  => array( '1', 'лопа=$1', 'лопа $1', 'страница=$1', 'страница $1', 'страница $1', 'page=$1', 'page $1' ),
+       'img_top'                   => array( '1', 'верькс', 'сверху', 'top' ),
+       'img_text_top'              => array( '1', 'текст-верькс', 'текст-сверху', 'text-top' ),
+       'img_middle'                => array( '1', 'куншка', 'посередине', 'middle' ),
+       'img_bottom'                => array( '1', 'алкс', 'снизу', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'текст-алкс', 'текст-снизу', 'text-bottom' ),
+       'sitename'                  => array( '1', 'САЙТЛЕМ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
+       'gender'                    => array( '0', 'СЫМЕ:', 'ПОЛ:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'МОЛИЦЯ_ТАРГО', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'МОЛИЦЯ_ЧИ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'ТЕСКЭНЬТАРГО', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
+       'revisionid'                => array( '1', 'ЛИЯКСТОМТОМАID', 'ИД_ВЕРСИИ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ЛИЯКСТОМТОМАЧЫ', 'ДЕНЬ_ВЕРСИИ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ЛИЯКСТОМТОМАЧЫ2', 'ДЕНЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'ЛИЯКСТОМТОМАКОВ', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ЛИЯКСТОМТОМАИЕ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
+       'plural'                    => array( '0', 'ЛАМОНЬЧИСЛА', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
+       'lcfirst'                   => array( '0', 'ВАСЕНЦЕ_ТЕШТЬКЕСЬ_ВИШКИНЕ:', 'ПЕРВАЯ_БУКВА_МАЛЕНЬКАЯ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ВАСЕНЦЕ_ТЕШТЬКЕСЬ_ПОКШ:', 'ПЕРВАЯ_БУКВА_БОЛЬШАЯ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'ВИШКА_ТЕШТЬКЕСЭ:', 'МАЛЕНЬКИМИ_БУКВАМИ:', 'LC:' ),
+       'uc'                        => array( '0', 'ПОШК_ТЕШТЬКЕСЭ:', 'БОЛЬШИМИ_БУКВАМИ:', 'UC:' ),
+       'raw'                       => array( '0', 'ВЕРЕКСТЭ', 'НЕОБРАБ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'НЕВТЕМС_КОНЯКС', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
+       'currentversion'            => array( '1', 'ТЕВАТЕВЕРСИЯ', 'ТЕКУЩАЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#КЕЛЕСЬ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+       'numberofadmins'            => array( '1', 'ЗЯРОАДМИНТНЭДЕ', 'КОЛИЧЕСТВО_АДМИНИСТРАТОРОВ', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'башка_тевень', 'служебная', 'special' ),
+       'filepath'                  => array( '0', 'ФАЙЛАНЬКИ', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
+       'pagesize'                  => array( '1', 'ЛОПАКУВАЛМО', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
+       'url_path'                  => array( '0', 'ЯН', 'ПУТЬ', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ВИКИ', 'WIKI' ),
 );
 
 $messages = array(
@@ -193,7 +193,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Кекшемс лувонь кирдиень витнеметнень-петнематнень чыяконь полавтнематнестэ',
 'tog-newpageshidepatrolled' => 'Кекшемс лувонь кирдиень ванстома лопатнень од лопань керьксэнть эйстэ',
 'tog-extendwatchlist' => 'Келейгавтомс сёрмадовксонь мельга ваномань сёрмалевксэнть невтевест весе полавтнематне, аволь ансяк чыеньсетне.',
-'tog-usenewrc' => 'Ð\9dолдак Ñ\82евÑ\81 Ð²Ð°Ð´Ñ\80Ñ\8fлгавÑ\82озÑ\8c Ð¾Ð´ Ð»Ð¸Ñ\8fкÑ\81Ñ\82омаÑ\82  (веши JavaScript)',
+'tog-usenewrc' => 'Ð\9fÑ\83Ñ\80намÑ\81 Ð»Ð¸Ñ\8fкÑ\81Ñ\82омÑ\82омаÑ\82 Ð»Ð¾Ð¿Ð°Ð½Ñ\8c ÐºÐ¾Ñ\80Ñ\8fÑ\81 ÐºÑ\83Ñ\80онÑ\8c-кÑ\83Ñ\80онÑ\8c Ñ\87иенÑ\8c Ð¿Ð¾Ð»Ð°Ð²Ñ\82немаÑ\82неÑ\81Ñ\8d-ванома Ð»ÐµÐ¼Ñ\80иÑ\81Ñ\8cмеÑ\82неÑ\81Ñ\8d  (веши JavaScript)',
 'tog-numberheadings' => 'Сёрмадовкс коняксос кадык сынсь ловома валтнэ путовить',
 'tog-showtoolbar' => 'Кедьёнкс лазнэнть невтемс сёрмадома шкасто (JavaScript)',
 'tog-editondblclick' => 'Кавксть лепштязь совамс сёрмадовксонь витнеме-петнеме (JavaScript)',
@@ -201,7 +201,7 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Витнемс секциятнень-пелькстнэнь, лепштямс сёрмадовксонть лемензэ лангс чэерень витьёнсе повнэсэ  (JavaScript)',
 'tog-showtoc' => 'Невтемс сёрмадовкс потмокс (лопатненень, конатнесэ 3-до ламо сёрмадовкст)',
 'tog-rememberpassword' => 'Ледстемс совамо валом те бравзерсэнть (сех кувать $1 {{PLURAL:$1|чи|чить}})',
-'tog-watchcreations' => 'СовавÑ\82омÑ\81 Ð¼Ð¾Ð½Ñ\8c Ñ\82еевÑ\82Ñ\8c Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c Ð²Ð°Ð½Ð¾Ð¼Ð° Ð»ÐµÐ¼ Ñ\80иÑ\81Ñ\8cмезÑ\8dнÑ\8c',
+'tog-watchcreations' => 'СовавÑ\82омÑ\81 Ð²Ð°Ð½Ð¾Ð¼Ð° Ð»ÐµÐ¼Ñ\80иÑ\81Ñ\8cмезÑ\8dнÑ\8c Ð¼Ð¾Ð½Ñ\8c Ñ\82еевÑ\82Ñ\8c Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c Ð´Ñ\8b Ñ\81енÑ\8c, Ð¼ÐµÐ·Ðµ Ð¹Ð¾Ð²ÐºÑ\81Ñ\82ан',
 'tog-watchdefault' => 'Совавтомс монь витевть лопатнень ванома лем рисьмезэнь',
 'tog-watchmoves' => 'Лопанть лиякстомтса, совавтык ванома лем рисьмезэнь',
 'tog-watchdeletion' => 'Лопанть нардаса, совавтык сонзэ ванома лем рисьмезэнь',
@@ -214,6 +214,7 @@ $messages = array(
 'tog-enotifminoredits' => 'Пачтямс е-сёрмасо лиякстомтоматнеде, сестэяк зярдо апокшкынеть',
 'tog-enotifrevealaddr' => 'Штавтомс е-сёрмань адресэм яволявтомань сёрмадовкстнэсэ',
 '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 подробнее])',
@@ -226,7 +227,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Кекшемс совазь теицянь витнематнень-петнематнень, иляст неяво ванома лемрисьмесэ',
 'tog-watchlisthideanons' => 'Кекшемс апак сова теицянь витнематнень-петнематнень, иляст неяво ванома лемрисьмесэ',
 'tog-watchlisthidepatrolled' => 'Кекшемс лувонь кирдиень витнематнень-петнематнень ванома лемрисьменть эйстэ',
-'tog-nolangconversion' => 'А меремс вариантонь полавтома лия лангс',
 'tog-ccmeonemails' => 'Кучт монень копия е-сёрматнеде, конатнень кучан лия теицянень',
 'tog-diffonly' => 'Иляк невтне лопапотмоксонть diffs ало',
 'tog-showhiddencats' => 'Невтемс кекшень категориятнень',
@@ -311,6 +311,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'поладксозо моли',
 'index-category' => 'Индекс марто лопатне',
 'noindex-category' => 'Индекстэме лопатне',
+'broken-file-category' => 'Лопат, конатнесэ файлань яжазь сюлмавомапеть',
 
 'about' => 'Эстедензэ',
 'article' => 'Потмокслопа',
@@ -690,7 +691,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 {{FULLPAGENAME}}|action=edit}} витнемс-петнемс те лопанть]</span>.',
 'updated' => '(Одолгавтозь)',
 'note' => "'''Явт мель:'''",
-'previewnote' => "'''Ð\9aиÑ\80дÑ\82Ñ\8c Ð¼ÐµÐ»Ñ\8cÑ\81Ñ\8d, Ð¢е ансяк васнянь невтевкс.'''
+'previewnote' => "'''Ð\9aиÑ\80дÑ\82Ñ\8fÑ\8f Ð¼ÐµÐ»Ñ\8cÑ\81Ñ\8d, Ñ\82е ансяк васнянь невтевкс.'''
 Полавтоматне зярс апак вансто!",
 'editing' => 'Витнят-петнят $1',
 'editingsection' => 'Витнеме-петнеме $1 (секциянть)',
@@ -729,6 +730,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'post-expand-template-inclusion-warning' => 'Ванок: Парцунлопатнеде кельгстят пек ламо.
 Совавтовомо аволь весе парцунлопатне кельгить.',
 'post-expand-template-inclusion-category' => 'Лопатне, конатнень лопапарцун марто покшолмаст пек ламо',
+'post-expand-template-argument-warning' => "'''Ванок''': Те лопасонть ули лопапарцунонь вейке эли седе ламо аргумент, конась вельть покш. Сеть аргументтнэ нардазь.",
 'post-expand-template-argument-category' => 'Лопатнесэ улить лопа парцунонь нардань аргументт',
 'parser-template-loop-warning' => 'Лопа парцунсто "чары реве" муевсь: [[$1]]',
 
@@ -812,7 +814,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'revertmerge' => 'Явомс логонть мекев, кода ульнесь вейтьсэндямодо икеле',
 
 # Diffs
-'history-title' => 'Историясь ламо вановксонть "$1"',
+'history-title' => '"$1"-нь полавтнемань историязо',
 'lineno' => 'Киксэсь $1:',
 'compareselectedversions' => 'Кочказь версиятнень аравтомс карадо-каршо',
 'editundo' => 'Велявтомс мекев мезе витнинь-петнинь',
@@ -946,6 +948,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'gender-female' => 'Авань сыме',
 'email' => 'Е-сёрма',
 'prefs-help-realname' => 'Алкуксонь леметь (арась мелеть, иляк путо): путсак, ды сон карми неявомо не таркатнесэ, косо тон тев теят.',
+'prefs-help-email' => 'Е-сёрмапаргот а эряви тешкстамс. Сон карми эрявомо ансяк салававалонь одов пачтямсто ёмавтындерясак неень салавань валот.',
+'prefs-help-email-others' => 'Мелеть сайтянзат, путыка кортамо лопазот е-сёрмапаргот, конань вельде лия ломантне сёрмадовить тенть. Минек вельде е-сёрмапаргот зярдояк а неяви, зярдо лия совицятне сёрмалить тенть.',
 'prefs-help-email-required' => 'Е-сёрмань адресэть эряви.',
 'prefs-signature' => 'Кедь путовкс',
 'prefs-dateformat' => 'Ков чинь форматозо',
@@ -1110,7 +1114,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'empty-file' => 'Тонь максовт файлась чаво.',
 'filename-tooshort' => 'Файлань лементь а саты кувалмозо.',
 'unknown-error' => 'А содавикс манявкс лиссь.',
-'file-thumbnail-no' => "Файланть лемезэ ушодови  '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Файланть лемезэ ушодови  <strong>$1</strong>.
 Сонсь маряви вишкалгавтозь фотокуво, покшолмазо ''(кенжешка)''.
 Улиндеряй файланть покш верзиязо, йовкстыка сонзэ  - арась, полавтыка тетень лемензэ.",
 'file-exists-duplicate' => 'Те кавонзавкс файла вана {{PLURAL:$1|те файланть|неть файлатнень}} эйстэ:',
@@ -1811,12 +1815,9 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'spambot_username' => 'MediaWiki-нь шукшто ванькскавтома',
 
 # Info page
-'pageinfo-header-views' => 'Ванома потмот',
-'pageinfo-subjectpage' => 'Лопа',
-'pageinfo-talkpage' => 'Кортнема лопа',
+'pageinfo-views' => 'Зяро ванома потмонзо',
 'pageinfo-edits' => 'Зяроксть витнезь-петнезь',
 'pageinfo-authors' => 'Зяро авторонзо',
-'pageinfo-views' => 'Зяро ванома потмонзо',
 
 # Skin names
 'skinname-standard' => 'Классикань',
index 0f1552c..68482db 100644 (file)
@@ -74,56 +74,56 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#بور', '#تغییرمسیر', '#تغییر_مسیر', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__بی‌فهرست__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__بی‌نگارخنه__', '__بی‌نگارخانه__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__بافهرست__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__فهرست__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__بی‌بخش__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', 'بی‌عنوان__', '__بی‌عنوان__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'ماه', 'ماه‌کنونی', 'ماه_کنونی', 'ماه‌کنونی۲', 'ماه_اسایی۲', 'ماه_کنونی۲', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ماه۱', 'ماه‌کنونی۱', 'ماه_کنونی۱', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'نام‌ماه‌اضافه', 'نام_ماه_اضافه', 'نام‌ماه‌کنونی‌اضافه', 'نام_ماه_کنونی_اضافه', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'مخفف‌نام‌ماه', 'مخفف_نام_ماه', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'روز', 'روزکنونی', 'روز_کنونی', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'روز۲', 'روز_۲', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'نام‌روز', 'نام_روز', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'سال', 'سال‌کنونی', 'سال_کنونی', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'زمان‌کنونی', 'زمان_کنونی', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ساعت', 'ساعت‌کنونی', 'ساعت_کنونی', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ماه‌محلی', 'ماه_محلی', 'ماه‌محلی۲', 'ماه_محلی۲', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'ماه‌محلی۱', 'ماه_محلی۱', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'نام‌ماه‌محلی', 'نام_ماه_محلی', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'نام‌ماه‌محلی‌اضافه', 'نام_ماه_محلی_اضافه', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'مخفف‌ماه‌محلی', 'مخفف_ماه_محلی', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'روزمحلی', 'روز_محلی', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'روزمحلی۲', 'روز_محلی_۲', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'نام‌روزمحلی', 'نام_روز_محلی', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'سال‌محلی', 'سال_محلی', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'زمون_محلی', 'زمان_محلی', 'زمان‌محلی', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ساعت‌محلی', 'ساعت_محلی', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'تعدادصفحه‌ها', 'تعداد_صفحه‌ها', 'ولگ‌ئون_نمره', 'وألگ‌ئون_نومره', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'تعدادکارورون', 'تعدادکاربران', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'کارورون_فعال', 'کاربران_فعال', 'کاربران‌فعال', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'تعداددچی‌یه‌ئون', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'نام‌صفحه', 'نام_صفحه', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'نام‌صفحه‌کد', 'نام_صفحه_کد', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'فضای‌نام', 'فضای_نام', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'فضای‌نام‌کد', 'فضای_نام_کد', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'فضای‌گپ', 'فضای_گپ', 'فضای‌بحث', 'فضای_بحث', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'فضای‌گپ_کد', 'فضای_گپ_کد', 'فضای‌بحث‌کد', 'فضای_بحث_کد', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'فضای‌موضوع', 'فضای‌مقاله', 'فضای_موضوع', 'فضای_مقاله', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'int'                     => array( '0', 'ترجمه:', 'INT:' ),
-       'sitename'                => array( '1', 'نام‌وبگاه', 'نام_وبگاه', 'SITENAME' ),
-       'ns'                      => array( '0', 'فن:', 'NS:' ),
-       'nse'                     => array( '0', 'فنک:', 'NSE:' ),
-       'localurl'                => array( '0', 'نشونی:', 'نشانی:', 'LOCALURL:' ),
-       'grammar'                 => array( '0', 'دستور_زبون:', 'دستور_زوون:', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'جنسیت:', 'جنس:', 'GENDER:' ),
+       'redirect'                  => array( '0', '#بور', '#تغییرمسیر', '#تغییر_مسیر', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__بی‌فهرست__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__بی‌نگارخنه__', '__بی‌نگارخانه__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__بافهرست__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__فهرست__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__بی‌بخش__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', 'بی‌عنوان__', '__بی‌عنوان__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ماه', 'ماه‌کنونی', 'ماه_کنونی', 'ماه‌کنونی۲', 'ماه_اسایی۲', 'ماه_کنونی۲', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ماه۱', 'ماه‌کنونی۱', 'ماه_کنونی۱', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'نام‌ماه‌اضافه', 'نام_ماه_اضافه', 'نام‌ماه‌کنونی‌اضافه', 'نام_ماه_کنونی_اضافه', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'مخفف‌نام‌ماه', 'مخفف_نام_ماه', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'روز', 'روزکنونی', 'روز_کنونی', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'روز۲', 'روز_۲', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'نام‌روز', 'نام_روز', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'سال', 'سال‌کنونی', 'سال_کنونی', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'زمان‌کنونی', 'زمان_کنونی', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ساعت', 'ساعت‌کنونی', 'ساعت_کنونی', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ماه‌محلی', 'ماه_محلی', 'ماه‌محلی۲', 'ماه_محلی۲', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'ماه‌محلی۱', 'ماه_محلی۱', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'نام‌ماه‌محلی', 'نام_ماه_محلی', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'نام‌ماه‌محلی‌اضافه', 'نام_ماه_محلی_اضافه', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'مخفف‌ماه‌محلی', 'مخفف_ماه_محلی', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'روزمحلی', 'روز_محلی', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'روزمحلی۲', 'روز_محلی_۲', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'نام‌روزمحلی', 'نام_روز_محلی', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'سال‌محلی', 'سال_محلی', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'زمون_محلی', 'زمان_محلی', 'زمان‌محلی', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ساعت‌محلی', 'ساعت_محلی', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'تعدادصفحه‌ها', 'تعداد_صفحه‌ها', 'ولگ‌ئون_نمره', 'وألگ‌ئون_نومره', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'تعدادکارورون', 'تعدادکاربران', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'کارورون_فعال', 'کاربران_فعال', 'کاربران‌فعال', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'تعداددچی‌یه‌ئون', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'نام‌صفحه', 'نام_صفحه', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'نام‌صفحه‌کد', 'نام_صفحه_کد', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'فضای‌نام', 'فضای_نام', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'فضای‌نام‌کد', 'فضای_نام_کد', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'فضای‌گپ', 'فضای_گپ', 'فضای‌بحث', 'فضای_بحث', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'فضای‌گپ_کد', 'فضای_گپ_کد', 'فضای‌بحث‌کد', 'فضای_بحث_کد', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'فضای‌موضوع', 'فضای‌مقاله', 'فضای_موضوع', 'فضای_مقاله', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'int'                       => array( '0', 'ترجمه:', 'INT:' ),
+       'sitename'                  => array( '1', 'نام‌وبگاه', 'نام_وبگاه', 'SITENAME' ),
+       'ns'                        => array( '0', 'فن:', 'NS:' ),
+       'nse'                       => array( '0', 'فنک:', 'NSE:' ),
+       'localurl'                  => array( '0', 'نشونی:', 'نشانی:', 'LOCALURL:' ),
+       'grammar'                   => array( '0', 'دستور_زبون:', 'دستور_زوون:', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'جنسیت:', 'جنس:', 'GENDER:' ),
 );
 
 $messages = array(
@@ -136,7 +136,7 @@ $messages = array(
 'tog-extendwatchlist' => 'گت تر هکردن دمبال هکرده‌ئون فهرست تموم دگارسه‌ئون سر، و نا فقط آخرین  موردون',
 'tog-usenewrc' => 'استفاده از تازه دگاردسته‌ئون گت‌تر بَیی (نیازمند جاوااسکریپت)',
 'tog-numberheadings' => 'شماره بشتن خدکار عناوین',
-'tog-showtoolbar' => 'نشون هدائن نوار ابزار جعبه دچی ین',
+'tog-showtoolbar' => 'دچی‌ین جعبه نوار ابزار ره سِراق هدائن',
 'tog-editondblclick' => 'دچی ین ولگون با دتا کلیک (نیازمند جاوااسکریپت)',
 'tog-editsection' => 'به کار دمبدائن تیکه‌ئون دچی‌ین از طریق پیوندون [دچی‌ین]',
 'tog-editsectiononrightclick' => 'به کار دمبدائن دچی‌ین قسمت‌ئون با راست کیلیک<br />عناوین قسمت‌ئون ِرو (جاوااسکریپت)',
@@ -154,7 +154,7 @@ $messages = array(
 'tog-enotifusertalkpages' => 'هر گادر منه کاروری صفخه‌ی گپ دله ات چی بنویشنه مه سّه ایمیل بزن',
 'tog-enotifminoredits' => 'هرگادر صحه ها دله اتا خورد چی ره عوض هکردنه مه وسّه ایمیل بزن',
 'tog-enotifrevealaddr' => 'منه ایمیل نامه ئون ایطیلاع رسونی دله دواشه',
-'tog-shownumberswatching' => 'نشون هدائن کارورن دمبال کوننده',
+'tog-shownumberswatching' => 'دمبالکرونِ سِراق هدائن',
 'tog-oldsig' => 'پیش نیمایش ایمضای موجود:',
 'tog-fancysig' => 'ایمضا ره ویکی متن نظر بیرین (بدون لینک هایتن)',
 'tog-externaleditor' => 'به شیکل پیش فرض خارجی ویرایشگرون جه ایستیفاده بواشه',
@@ -330,14 +330,14 @@ $messages = array(
 'talk' => 'گپ',
 'views' => 'هارشی‌ئون',
 'toolbox' => 'أبـزار جـا',
-'userpage' => 'کارور صفحه ره نشون هدائن',
+'userpage' => 'کارور صفحه ره سِراق هدائن',
 'projectpage' => 'بدی‌ین پروژه‌ی ِصفحه',
 'imagepage' => 'بدی‌ین ِعکس ِصفحه',
 'mediawikipage' => 'پیغوم ره بدی‌ین',
 'templatepage' => 'بدی‌ین شابلون',
 'viewhelppage' => 'راهنما صفحه هارشی‌ین',
 'categorypage' => 'بدی‌ین رج',
-'viewtalkpage' => 'گپ ئون ره نشون هدائن',
+'viewtalkpage' => 'گپون ره سِراق هدائن',
 'otherlanguages' => 'بقیه زوون‌ئون',
 'redirectedfrom' => '($1 جه بموئه)',
 'redirectpagesub' => 'گجگی‌بَیتـِن',
@@ -363,7 +363,7 @@ $2، $1',
 'edithelp' => 'دچی‌ین رانما',
 'edithelppage' => 'Help:دَچی‌ین',
 'helppage' => 'Help:راهنما',
-'mainpage' => 'گت ولگ',
+'mainpage' => 'گت صفحه',
 'mainpage-description' => 'گت صفحه',
 'policy-url' => 'Project:سیاستون',
 'portal' => 'کارورون ِلوش',
@@ -545,7 +545,7 @@ $2، $1',
 'watchthis' => 'این صفحه ره دمبال هـاکاردن',
 'savearticle' => 'جادکتن ِصفحه',
 'preview' => 'پیش نمایش',
-'showpreview' => 'پیش‌نمایش نشون هدائن',
+'showpreview' => 'پیش‌نمایش ره سِراق هدائن',
 'showlivepreview' => 'پیش‌نمایش آنلاین',
 'showdiff' => 'نمایش تغییرات',
 'blockedtext' => "'''شمه آی پی دوسته بیّه.'''
@@ -599,7 +599,7 @@ $2، $1',
 'historyempty' => '(خالی)',
 
 # Revision deletion
-'rev-delundel' => 'نشون هدائن/فرو بوردن',
+'rev-delundel' => 'دیار بیّن/فرو بوردن',
 'revdelete-text' => "'''نسخه‌ئون و حذف بئی موارد ره بشنه سیاهه جا و صفحه تاریخچه دله بدین، ولی اتی قسمت از وشونه محتواره بقیه کارورون نتوننه بوینن.'''
 {{SITENAME}} بقیه مدیرون بتوننه اینتا پنهون بئیه محتوا ره هارشن و وشونه حذف بئیون ره احیاء هاکنن، مگر اینکه اتی سری محدودیت ونه رو اعمال بئی باشه.",
 'revdel-restore' => 'دیاری تغییر هدائن',
@@ -713,9 +713,9 @@ $2، $1',
 
 بعد از این که پرونده‌یی ره باربی‌یشتنی، به این سه شکل بنشنه وه ره صفحه‌ئون دله بی‌یشتن:
 
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' استفاده از نسخه کامل پرونده وسّه
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' استفاده از اتا نسخه ۲۰۰ پیکسلی از پرونده که اتا جعبه سمت چپ متن دله دره و عبارت alt text ونه دله به عنوان توضیح استفاده بیّه وسّه
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' بساتن اتا پیوند مستقیم به پرونده بدون نمایش پرونده",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' استفاده از نسخه کامل پرونده وسّه
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' استفاده از اتا نسخه ۲۰۰ پیکسلی از پرونده که اتا جعبه سمت چپ متن دله دره و عبارت alt text ونه دله به عنوان توضیح استفاده بیّه وسّه
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' بساتن اتا پیوند مستقیم به پرونده بدون نمایش پرونده",
 'uploadlogpage' => 'باربی‌یشتن گزارش',
 'uploadedimage' => '"[[$1]]" ره باربی‌یشته',
 
@@ -880,13 +880,15 @@ $2، $1',
 'blockip-title' => 'کارور ره دَوستن',
 'blockip-legend' => 'کارور ره دَوستن',
 'ipbsubmit' => 'ای کارور دأبه‌س بأوه',
+'ipboptions' => '۲ ساعت:2 hours,۱ روز:1 day,۳ روز:3 days,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌پایون:infinite',
 'ipblocklist' => 'IP نـه‌شـونـی‌ئون ئو کـارورنـوم‌ئونی کـه دأبـه‌سـتـوونـه',
 'infiniteblock' => 'بی‌پایون',
+'expiringblock' => '$1 دله، ساعت $2 دِرِس وونه',
 'blocklink' => 'دَوستن',
 'unblocklink' => 'وا هـه‌کـارده‌ن',
 'change-blocklink' => 'قطع دسترسی تغییر هدائن',
 'contribslink' => 'کایری‌ئون',
-'blocklogentry' => '[[$1]] دأبـه‌سـتـو بـأیـه ئو وه‌نـه دأبه‌ستو بوئه‌ن زأمـون، تـا  $2 $3 هـأسـه',
+'blocklogentry' => '[[$1]] دَوسته بیّه و ونه دَوسته بی‌ین گادِر $2 تا $3 هسته',
 
 # Move page
 'newtitle' => 'ترنه نوم:',
index c8a4181..044a768 100644 (file)
@@ -107,7 +107,6 @@ $messages = array(
 'tog-watchlisthideminor' => 'Tiquintlātīz tlapatlalitzintli motlachiyalizpan',
 'tog-watchlisthideliu' => 'Tiquintlātīz tlācah ōmocalacqueh īntlapatlaliz motlachiyalizpan',
 'tog-watchlisthideanons' => 'Tiquintlātīz tlācah ahtōcāitl īntlapatlaliz motlachiyalizpan',
-'tog-nolangconversion' => 'Ahmo tictēquitiltia tlahtōlcuepaliztli',
 'tog-ccmeonemails' => 'Nō xinēch-mailīz ihcuāc nitē-mailīz tlatequitiltilīlli',
 'tog-diffonly' => 'Ahmo tiquittāz zāzanilli ītlapiyaliz ahneneuhquilitzīntlan',
 'tog-showhiddencats' => 'Mà monèxtìkàn in tlatlatìltìn tlaìxmatkàtlàlilòmë',
@@ -813,10 +812,10 @@ Intlā ticnequi, tlācah quimatīzqueh motequi.',
 Tlahcuilōlli iuhcāyōtl {{PLURAL:\$3|moēlēhuia cah|moēlēhuiah cateh}} \$2.",
 'filetype-missing' => 'Tlahcuilōlli ahmo quipiya huēiyaquiliztli (quemeh ".jpg").',
 'large-file' => 'Mā tlahcuilōlli ahmo achi huēiyac $1; inīn cah $2.',
-'fileexists-extension' => "Tlahcuilōlli zan iuh tōcātica ia: [[$2|thumb]]
-* Tlahcuilōlli moquetzacah: '''<tt>[[:$1]]</tt>'''
-* Tlahcuilōlli tlein ia ītōca: '''<tt>[[:$2]]</tt>'''
-Timitztlātlauhtiah, xitlahcuiloa occē tōcāitl.",
+'fileexists-extension' => 'Tlahcuilōlli zan iuh tōcātica ia: [[$2|thumb]]
+* Tlahcuilōlli moquetzacah: <strong>[[:$1]]</strong>
+* Tlahcuilōlli tlein ia ītōca: <strong>[[:$2]]</strong>
+Timitztlātlauhtiah, xitlahcuiloa occē tōcāitl.',
 'savefile' => 'Quipiyāz tlahcuilōlli',
 'uploadedimage' => 'ōmoquetz "[[$1]]"',
 'overwroteimage' => 'ōmoquetz yancuīc "[[$1]]" iuhcāyōtl',
@@ -1041,7 +1040,7 @@ In āxcān tlachiyaliztli onca īpan $PAGETITLE_URL
 $NEWPAGE
 
 In tlapatlaliztli īxtlamatiliztli cah: $PAGESUMMARY $PAGEMINOREDIT
-
 Xicnotzāz in tlapatlani:
 Correo electrónico: {{canonicalurl:Special:Emailuser|target=$PAGEEDITOR}}
 Huiqui: {{canonicalurl:User:$PAGEEDITOR}}
index 2f002b9..8d3edf6 100644 (file)
@@ -25,7 +25,10 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Liân-kiat oē té-sûn:',
+'tog-justify' => 'pâi-chê  tōaⁿ-lo̍h',
 'tog-hideminor' => 'Am chòe-kīn ê sió kái-piàn',
+'tog-hidepatrolled' => 'Am chòe-kīn sûn koè--ê  kái-piàn',
+'tog-newpageshidepatrolled' => 'Sin-ia̍h ê chheng-toaⁿ am sûn koè--ê',
 'tog-extendwatchlist' => 'Khok-chhiong kàm-sī-toaⁿ kàu hián-sī só͘-ū ê kái-piàn',
 'tog-usenewrc' => 'Ka-kiông pán ê chòe-kīn-ê-kái-piàn (su-iàu JavaScript)',
 'tog-numberheadings' => 'Phiau-tê chū-tōng pian-hō',
@@ -43,22 +46,37 @@ $messages = array(
 'tog-previewontop' => 'Sûn-khoàⁿ ê lōe-iông tī pian-chi̍p keh-á thâu-chêng',
 'tog-previewonfirst' => 'Thâu-pái pian-chi̍p seng khoàⁿ-māi',
 'tog-nocache' => 'Koaiⁿ-tiāu ia̍h ê cache',
+'tog-enotifwatchlistpages' => 'Kam-sī-tuann ū ē bûn-tsiunn nā ū kái-piàn, kià tiān-tsú-phue hōo guá.',
+'tog-enotifusertalkpages' => 'Guá ê thó-lūn ia̍h  nā ū lâng kái,  kià tiān-tsú-phue hōo guá.',
+'tog-enotifminoredits' => 'Sió pian-chi̍p mā kià tiān-tsú-phue hōo guá.',
+'tog-enotifrevealaddr' => 'Hō͘ pat-lâng khoàⁿ ê tio̍h oá ê tiān-chú-phoe tē-chí',
+'tog-shownumberswatching' => 'Hián-sī tng leh khoàⁿ ê iōng-chiá sò͘-bo̍k',
+'tog-oldsig' => 'Chit-má ê chhiam-miâ:',
 'tog-fancysig' => 'Chhiam-miâ mài chò liân-kiat',
 'tog-externaleditor' => 'Iōng gōa-pō· pian-chi̍p-khì',
 'tog-externaldiff' => 'Iōng gōa-pō· diff',
+'tog-showjumplinks' => 'Hō͘ "thiàu khì" chit ê liân-chiap ē-sái',
+'tog-uselivepreview' => 'Ēng sui khoàⁿ-māi (ài ū JavaScript) (chhì-giām--ê)',
 'tog-forceeditsummary' => 'Pian-chi̍p khài-iàu bô thiⁿ ê sî-chūn, kā goá thê-chhéⁿ',
 'tog-watchlisthideown' => 'Kàm-sī-toaⁿ bián hián-sī goá ê pian-chi̍p',
 'tog-watchlisthidebots' => 'Kàm-sī-toaⁿ bián hián-sī ki-khì pian-chi̍p',
 'tog-watchlisthideminor' => 'Kàm-sī-toaⁿ bián hián-sī sió siu-kái',
+'tog-watchlisthideliu' => 'Kàm-sī-toaⁿ bián hián-sī iōng-chiá ū teng-ji̍p ê pian-chi̍p',
+'tog-watchlisthideanons' => 'Kàm-sī-toaⁿ bián hián-sī bû-bêng-sī ê pian-chi̍p',
+'tog-watchlisthidepatrolled' => 'Kàm-sī-toaⁿ bián hián-sī khoàⁿ-koè--ê pian-chi̍p',
 'tog-ccmeonemails' => 'Kià hō͘ pa̍t-lâng ê email sūn-soà kià copy hō͘ goá',
 'tog-diffonly' => 'Diff ē-pêng bián hián-sī ia̍h ê loē-iông',
+'tog-showhiddencats' => 'Hián-sī chhàng khí--lâi ê lūi-pia̍t',
+'tog-norollbackdiff' => 'ká tńg-khí liáu bián-koán cheng-chha goā-chē',
 
 'underline-always' => 'Tiāⁿ-tio̍h',
 'underline-never' => 'Tiāⁿ-tio̍h mài',
 'underline-default' => 'Tòe liû-lám-khì ê default',
 
 # Font style option in Special:Preferences
+'editfont-style' => 'Pian-chi̍p sî ēng ê jī-thé hêng-sek:',
 'editfont-default' => 'Tòe liû-lám-khì ê default',
+'editfont-monospace' => 'Monospaced jī-thé',
 'editfont-sansserif' => 'Sans-serif jī-thé',
 'editfont-serif' => 'Serif jī-thé',
 
@@ -137,6 +155,7 @@ $messages = array(
 'article' => 'Loē-iông ia̍h',
 'newwindow' => '(ē khui sin thang-á hián-sī)',
 'cancel' => 'Chhú-siau',
+'moredotdotdot' => 'Iáu-ū',
 'mypage' => 'Góa ê ia̍h',
 'mytalk' => 'Góa ê thó-lūn',
 'anontalk' => 'Chit ê IP ê thó-lūn-ia̍h',
@@ -387,6 +406,7 @@ Chhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iû-go
 'nav-login-createaccount' => 'Teng-ji̍p / khui sin kháu-chō',
 'loginprompt' => 'Thiⁿ ē-kha ê chu-liāu thang khui sin hō·-thâu a̍h-sī teng-ji̍p {{SITENAME}}.',
 'userlogin' => 'Teng-ji̍p / khui sin kháu-chō',
+'userloginnocreate' => 'Teng-ji̍p',
 'logout' => 'Teng-chhut',
 'userlogout' => 'Teng-chhut',
 'notloggedin' => 'Bô teng-ji̍p',
@@ -396,6 +416,7 @@ Chhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iû-go
 'gotaccount' => "Í-keng ū kháu-chō? '''$1'''.",
 'gotaccountlink' => 'Teng-ji̍p',
 'createaccountmail' => 'Thàu koè tiān-chú-phoe',
+'createaccountreason' => 'Lí-iû:',
 'badretype' => 'Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.',
 'userexists' => 'Lí beh ti̍h ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ kéng pa̍t-ê miâ.',
 'loginerror' => 'Teng-ji̍p chhò-gō·',
index 5ebe516..b1f60f1 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Norwegian Bokmål (‪Norsk (bokmål)‬)
+/** Norwegian Bokmål (‪norsk (bokmål)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
  * @author Boivie
  * @author Brik
  * @author Byrial
+ * @author Danmichaelo
+ * @author Dittaeva
  * @author Eirik
  * @author EivindJ
  * @author Event
  * @author Finnrind
+ * @author Geitost
  * @author Guaca
  * @author H92
+ * @author Haakon K
  * @author Harald Khan
+ * @author Jeblad
  * @author Jóna Þórunn
  * @author Kph
  * @author Kph-no
@@ -187,124 +192,124 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#OMDIRIGERING', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__INGENINNHOLDSFORTEGNELSE__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__INTETGALLERI__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__TVINGINNHOLDSFORTEGNELSE__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__INNHOLDSFORTEGNELSE__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__INGENSEKSJONSREDIGERING__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'NÅVÆRENDEMÅNED', 'NÅVÆRENDEMÅNED2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'NÅVÆRENDEMÅNED1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NÅVÆRENDEMÅNEDSNAVN', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'NÅVÆRENDEMÅNEDSNAVNGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'NÅVÆRENDEMÅNEDSNAVNKORT', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'NÅVÆRENDEDAG', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'NÅVÆRENDEDAG2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NÅVÆRENDEDAGSNAVN', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'NÅVÆRENDEÅR', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'NÅVÆRENDETID', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'NÅVÆRENDETIME', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LOKALMÅNED', 'LOKALMÅNED2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LOKALMÅNED1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'LOKALMÅNEDSNAVN', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'LOKALMÅNEDSNAVNGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'LOKALMÅNEDSNAVNKORT', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'LOKALDAG', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'LOKALDAG2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'LOKALDAGSNAVN', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'LOKALTÅR', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LOKALTID', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'LOKALTIME', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ANTALLSIDER', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ANTALLARTIKLER', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ANTALLFILER', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ANTALLBRUKERE', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'ANTALLAKTIVEBRUKERE', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'ANTALLREDIGERINGER', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'ANTALLVISNINGER', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'SIDENAVN', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'SIDENAVNE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NAVNEROM', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NAVNEROME', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'DISKUSJONSROM', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'DISKUSJONSROME', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'SUBJEKTROM', 'ARTIKKELROM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'SUBJEKTROME', 'ARTIKKELROME', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'FULLTSIDENAVN', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'FULLTSIDENAVNE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'UNDERSIDENAVN', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'UNDERSIDENAVNE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'GRUNNSIDENAVN', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'GRUNNSIDENAVNE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'DISKUSJONSSIDENAVN', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'DISKUSJONSSIDENAVNE', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'SUBJEKTSIDENAVN', 'ARTIKKELSIDENAVN', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'SUBJEKTSIDENAVNE', 'ARTIKKELSIDENAVNE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'img_thumbnail'           => array( '1', 'miniatyr', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniatyr=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'høyre', 'right' ),
-       'img_left'                => array( '1', 'venstre', 'left' ),
-       'img_none'                => array( '1', 'ingen', 'none' ),
-       'img_center'              => array( '1', 'sentrer', 'senter', 'midtstilt', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'ramme', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'rammeløs', 'ingenramme', 'frameless' ),
-       'img_page'                => array( '1', 'side=$1', 'side $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'portrett', 'portrett=$1', 'portrett_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_baseline'            => array( '1', 'grunnlinje', 'baseline' ),
-       'img_top'                 => array( '1', 'topp', 'top' ),
-       'img_middle'              => array( '1', 'midt', 'middle' ),
-       'img_bottom'              => array( '1', 'bunn', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'tekst-bunn', 'text-bottom' ),
-       'img_link'                => array( '1', 'lenke=$1', 'link=$1' ),
-       'ns'                      => array( '0', 'NR:', 'NS:' ),
-       'localurl'                => array( '0', 'LOKALURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALURLE:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'ARTIKKELSTI', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'TJENER', 'SERVER' ),
-       'servername'              => array( '0', 'TJENERNAVN', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SKRIPTSTI', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'STILSTI', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMMATIKK:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'KJØNN:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__INGENTITTELKONVERTERING__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__INGENINNHOLDSKONVERTERING__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'NÅVÆRENDEUKE', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'NÅVÆRENDEUKEDAG', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'LOKALUKE', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'LOKALUKEDAG', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'REVISJONSID', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'REVISJONSDAG', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'REVISJONSDAG2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'REVISJONSMÅNED', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'REVISJONSMÅNED1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'REVISJONSÅR', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'REVISJONSTIDSSTEMPEL', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'REVISJONSBRUKER', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'FLERTALL:', 'PLURAL:' ),
-       'raw'                     => array( '0', 'RÅ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'VISTITTEL', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__NYSEKSJONSLENKE__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__INGENNYSEKSJONSLENKE__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'NÅVÆRENDEVERSJON', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'NÅVÆRENDETIDSSTEMPEL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'LOKALTTIDSSTEMPEL', 'LOCALTIMESTAMP' ),
-       'contentlanguage'         => array( '1', 'INNHOLDSSPRÅK', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'SIDERINAVNEROM:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ANTALLADMINISTRATORER', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'spesial', 'special' ),
-       'defaultsort'             => array( '1', 'STANDARDSORTERING', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'FILSTI:', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__SKJULTKATEGORI__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'SIDERIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'SIDESTØRRELSE', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEKSER__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__INGENINDEKSERING__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'NUMMERIGRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__STATISTOMDIRIGERING__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'BESKYTTELSESNIVÅ', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'datoformat', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'STI', 'PATH' ),
-       'url_query'               => array( '0', 'SPØRRING', 'QUERY' ),
+       'redirect'                  => array( '0', '#OMDIRIGERING', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__INGENINNHOLDSFORTEGNELSE__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__INTETGALLERI__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__TVINGINNHOLDSFORTEGNELSE__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__INNHOLDSFORTEGNELSE__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__INGENSEKSJONSREDIGERING__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'NÅVÆRENDEMÅNED', 'NÅVÆRENDEMÅNED2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'NÅVÆRENDEMÅNED1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NÅVÆRENDEMÅNEDSNAVN', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'NÅVÆRENDEMÅNEDSNAVNGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'NÅVÆRENDEMÅNEDSNAVNKORT', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'NÅVÆRENDEDAG', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'NÅVÆRENDEDAG2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NÅVÆRENDEDAGSNAVN', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'NÅVÆRENDEÅR', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'NÅVÆRENDETID', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'NÅVÆRENDETIME', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LOKALMÅNED', 'LOKALMÅNED2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LOKALMÅNED1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'LOKALMÅNEDSNAVN', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'LOKALMÅNEDSNAVNGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'LOKALMÅNEDSNAVNKORT', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'LOKALDAG', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKALDAG2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'LOKALDAGSNAVN', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'LOKALTÅR', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LOKALTID', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'LOKALTIME', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ANTALLSIDER', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ANTALLARTIKLER', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ANTALLFILER', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ANTALLBRUKERE', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'ANTALLAKTIVEBRUKERE', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'ANTALLREDIGERINGER', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'ANTALLVISNINGER', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'SIDENAVN', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'SIDENAVNE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NAVNEROM', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NAVNEROME', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'DISKUSJONSROM', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'DISKUSJONSROME', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'SUBJEKTROM', 'ARTIKKELROM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'SUBJEKTROME', 'ARTIKKELROME', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'FULLTSIDENAVN', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'FULLTSIDENAVNE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'UNDERSIDENAVN', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'UNDERSIDENAVNE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'GRUNNSIDENAVN', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'GRUNNSIDENAVNE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'DISKUSJONSSIDENAVN', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'DISKUSJONSSIDENAVNE', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'SUBJEKTSIDENAVN', 'ARTIKKELSIDENAVN', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'SUBJEKTSIDENAVNE', 'ARTIKKELSIDENAVNE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'img_thumbnail'             => array( '1', 'miniatyr', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniatyr=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'høyre', 'right' ),
+       'img_left'                  => array( '1', 'venstre', 'left' ),
+       'img_none'                  => array( '1', 'ingen', 'none' ),
+       'img_center'                => array( '1', 'sentrer', 'senter', 'midtstilt', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'ramme', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'rammeløs', 'ingenramme', 'frameless' ),
+       'img_page'                  => array( '1', 'side=$1', 'side $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'portrett', 'portrett=$1', 'portrett_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_baseline'              => array( '1', 'grunnlinje', 'baseline' ),
+       'img_top'                   => array( '1', 'topp', 'top' ),
+       'img_middle'                => array( '1', 'midt', 'middle' ),
+       'img_bottom'                => array( '1', 'bunn', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'tekst-bunn', 'text-bottom' ),
+       'img_link'                  => array( '1', 'lenke=$1', 'link=$1' ),
+       'ns'                        => array( '0', 'NR:', 'NS:' ),
+       'localurl'                  => array( '0', 'LOKALURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALURLE:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ARTIKKELSTI', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'TJENER', 'SERVER' ),
+       'servername'                => array( '0', 'TJENERNAVN', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SKRIPTSTI', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'STILSTI', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMMATIKK:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'KJØNN:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__INGENTITTELKONVERTERING__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__INGENINNHOLDSKONVERTERING__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'NÅVÆRENDEUKE', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'NÅVÆRENDEUKEDAG', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'LOKALUKE', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'LOKALUKEDAG', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'REVISJONSID', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'REVISJONSDAG', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'REVISJONSDAG2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'REVISJONSMÅNED', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'REVISJONSMÅNED1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'REVISJONSÅR', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'REVISJONSTIDSSTEMPEL', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'REVISJONSBRUKER', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'FLERTALL:', 'PLURAL:' ),
+       'raw'                       => array( '0', 'RÅ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'VISTITTEL', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__NYSEKSJONSLENKE__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__INGENNYSEKSJONSLENKE__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'NÅVÆRENDEVERSJON', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'NÅVÆRENDETIDSSTEMPEL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'LOKALTTIDSSTEMPEL', 'LOCALTIMESTAMP' ),
+       'contentlanguage'           => array( '1', 'INNHOLDSSPRÅK', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'SIDERINAVNEROM:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ANTALLADMINISTRATORER', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'spesial', 'special' ),
+       'defaultsort'               => array( '1', 'STANDARDSORTERING', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'FILSTI:', 'FILEPATH:' ),
+       'hiddencat'                 => array( '1', '__SKJULTKATEGORI__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'SIDERIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'SIDESTØRRELSE', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEKSER__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__INGENINDEKSERING__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'NUMMERIGRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__STATISTOMDIRIGERING__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'BESKYTTELSESNIVÅ', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'datoformat', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'STI', 'PATH' ),
+       'url_query'                 => array( '0', 'SPØRRING', 'QUERY' ),
 );
 
 $messages = array(
@@ -315,29 +320,29 @@ $messages = array(
 'tog-hidepatrolled' => 'Skjul patruljerte redigeringer i siste endringer',
 'tog-newpageshidepatrolled' => 'Skjul patruljerte sider fra listen over nye sider',
 'tog-extendwatchlist' => 'Utvid overvåkningslisten til å vise alle endringer, ikke bare de siste',
-'tog-usenewrc' => 'Bruk forbedret siste endringer (krever JavaScript)',
+'tog-usenewrc' => 'Grupper endringer i siste endringer og overvåkingslistte (krever JavaScript)',
 'tog-numberheadings' => 'Autonummerer overskrifter',
-'tog-showtoolbar' => 'Vis verktøylinje (JavaScript)',
-'tog-editondblclick' => 'Rediger sider ved å dobbeltklikke (JavaScript)',
+'tog-showtoolbar' => 'Vis verktøylinje (krever JavaScript)',
+'tog-editondblclick' => 'Rediger sider ved å dobbeltklikke (krever JavaScript)',
 'tog-editsection' => 'Rediger avsnitt ved hjelp av [rediger]-lenke',
 'tog-editsectiononrightclick' => 'Rediger avsnitt ved å høyreklikke på avsnittsoverskrift (JavaScript)',
 'tog-showtoc' => 'Vis innholdsfortegnelse (for sider med flere enn tre avsnitt)',
 'tog-rememberpassword' => 'Husk meg i denne nettleseren (i høyst $1 {{PLURAL:$1|dag|dager}})',
-'tog-watchcreations' => 'Overvåk sider jeg oppretter',
-'tog-watchdefault' => 'Overvåk alle sider jeg redigerer',
-'tog-watchmoves' => 'Overvåk sider jeg flytter',
-'tog-watchdeletion' => 'Overvåk sider jeg sletter',
+'tog-watchcreations' => 'Legg til sider jeg oppretter og filer jeg laster opp i min overvåkingsliste',
+'tog-watchdefault' => 'Legg til sider og filer jeg endrer på i min overvåkingsliste',
+'tog-watchmoves' => 'Legg til sider og filer jeg flytter til min overvåkingsliste',
+'tog-watchdeletion' => 'Legg til sider og filer jeg sletter i min overvåkingsliste',
 'tog-minordefault' => 'Merk i utgangspunktet alle redigeringer som mindre',
-'tog-previewontop' => 'Flytt forhåndsvisningen foran redigeringsboksen',
-'tog-previewonfirst' => 'Vis forhåndsvisning ved første redigering av en side',
+'tog-previewontop' => 'Vis forhåndsvisningen over redigeringsboksen',
+'tog-previewonfirst' => 'Vis forhåndsvisning når du begynner å redigere',
 'tog-nocache' => 'Deaktiver nettlesermellomlagring av sider («caching»)',
-'tog-enotifwatchlistpages' => 'Send meg en e-post når sider på overvåkningslisten blir endret',
-'tog-enotifusertalkpages' => 'Send meg en e-post ved endringer av brukerdiskusjonssiden min',
-'tog-enotifminoredits' => 'Send meg en e-post også ved mindre sideendringer',
+'tog-enotifwatchlistpages' => 'Send meg en e-post når sider og filer på overvåkningslisten min blir endret',
+'tog-enotifusertalkpages' => 'Send meg en e-post når brukerdiskusjonssiden min endres',
+'tog-enotifminoredits' => 'Send meg e-post også ved mindre endringer av sider og filer',
 'tog-enotifrevealaddr' => 'Vis min e-postadresse i utgående meldinger',
-'tog-shownumberswatching' => 'Vis antall overvåkende brukere',
+'tog-shownumberswatching' => 'Vis antall brukere som overvåker',
 'tog-oldsig' => 'Nåværende signatur:',
-'tog-fancysig' => 'Håndter signatur som wikitekst (uten automatisk lenke)',
+'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',
@@ -349,7 +354,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Skjul endringer av innloggede brukere fra overvåkningslisten',
 'tog-watchlisthideanons' => 'Skjul endringer av anonyme brukere fra overvåkningslisten',
 'tog-watchlisthidepatrolled' => 'Skjul patruljerte endringer fra overvåkningslisten',
-'tog-nolangconversion' => 'Slå av variantkonvertering',
 'tog-ccmeonemails' => 'Send meg kopier av e-poster jeg sender til andre brukere',
 'tog-diffonly' => 'Ikke vis sideinnhold under differ',
 'tog-showhiddencats' => 'Vis skjulte kategorier',
@@ -428,7 +432,7 @@ $messages = array(
 'hidden-category-category' => 'Skjulte kategorier',
 'category-subcat-count' => '{{PLURAL:$2|Denne kategorien har kun følgende underkategori.|Denne kategorien har følgende {{PLURAL:$1|underkategori|$1 underkategorier}}, av totalt $2.}}',
 'category-subcat-count-limited' => 'Kategorien har følgende {{PLURAL:$1|underkategori|$1 underkategorier}}.',
-'category-article-count' => '{{PLURAL:$2|Denne kategorien inneholder kun følgende side.|Følgende {{PLURAL:$1|side|$1 sider}} er i denne kategorien, av totalt $2.}}',
+'category-article-count' => '{{PLURAL:$2|Denne kategorien inneholder kun følgende side.|Under vises $1 av totalt $2 sider som befinner seg i denne kategorien.}}',
 'category-article-count-limited' => 'Følgende {{PLURAL:$1|side|$1 sider}} er i denne kategorien.',
 'category-file-count' => '{{PLURAL:$2|Denne kategorien inneholder kun den følgende filen.|Følgende {{PLURAL:$1|fil|$1 filer}} er i denne kategorien, av totalt $2.}}',
 'category-file-count-limited' => 'Følgende {{PLURAL:$1|fil|$1 filer}} er i denne kategorien.',
@@ -572,6 +576,10 @@ $1',
 'youhavenewmessages' => 'Du har $1 ($2).',
 'newmessageslink' => 'nye meldinger',
 'newmessagesdifflink' => 'siste endring',
+'youhavenewmessagesfromusers' => 'Du har $1 fra {{PLURAL:$3|en annen bruker| $3 brukere}} ($2).',
+'youhavenewmessagesmanyusers' => 'Du har $1 fra mange brukere ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|en ny melding|nye meldinger}}',
+'newmessagesdifflinkplural' => 'siste {{PLURAL:$1|endring|endringer}}',
 'youhavenewmessagesmulti' => 'Du har nye beskjeder på $1',
 'editsection' => 'rediger',
 'editold' => 'rediger',
@@ -665,6 +673,8 @@ Vennligst rapporter dette til en [[Special:ListUsers/sysop|administrator]], oppg
 'cannotdelete' => 'Siden eller fila «$1» kunne ikke slettes.
 Den kan ha blitt slettet av noen andre.',
 'cannotdelete-title' => 'Kan ikke slette siden «$1»',
+'delete-hook-aborted' => 'Sletting avbrutt av en funksjon.
+Den ga ingen forklaring.',
 'badtitle' => 'Ugyldig tittel',
 'badtitletext' => 'Den ønskede tittelen var ugyldig, tom eller feilaktig lenket fra en annen wiki.
 Den inneholder kanskje ett eller flere tegn som ikke kan brukes i titler.',
@@ -694,9 +704,13 @@ $2',
 'ns-specialprotected' => 'Spesialsider kan ikke redigeres.',
 'titleprotected' => "Denne tittelen har blitt låst for oppretting av [[User:$1|$1]].
 Den angitte grunnen er «''$2''».",
-'filereadonlyerror' => "Kan ikke endre filen «$1» fordi filrepositoriet «$2» er skrivebeskyttet.
+'filereadonlyerror' => 'Kan ikke endre filen «$1» fordi filsamlingen «$2» er skrivebeskyttet.
 
-Oppgitt årsak er «''$3''».",
+Administrators nærmere begrunnelse: «$3».',
+'invalidtitle-knownnamespace' => 'Ugyldig tittel med navnerommet «$2» og teksten «$3»',
+'invalidtitle-unknownnamespace' => 'Ugyldig tittel med ukjent navneromsnummer $1 og teksten «$2»',
+'exception-nologin' => 'Ikke innlogget',
+'exception-nologin-text' => 'Denne siden eller handlingen krever at du er innlogget på denne wikien.',
 
 # Virus scanner
 'virus-badscanner' => "Dårlig konfigurasjon: Ukjent virusskanner: ''$1''",
@@ -717,6 +731,7 @@ Ikke glem å endre [[Special:Preferences|innstillingene]] dine.',
 'remembermypassword' => 'Husk meg på denne datamaskinen (i maks $1 {{PLURAL:$1|dag|dager}})',
 '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.',
 'externaldberror' => 'Det var en ekstern autentifiseringsfeil, eller du kan ikke oppdatere din eksterne konto.',
 'login' => 'Logg inn',
 'nav-login-createaccount' => 'Logg inn eller opprett en konto',
@@ -785,6 +800,7 @@ Som et resultat kan det ikke opprettes flere kontoer fra denne IP-adressen.',
 'invalidemailaddress' => 'Din e-postadresse kan ikke aksepteres, fordi den er ugyldig formatert.
 Skriv inn en fungerende e-postadresse eller tøm feltet.',
 'cannotchangeemail' => 'E-postadresser knyttet til brukerkontoer kan ikke endres på denne wikien.',
+'emaildisabled' => 'Dette nettstedet kan ikke sende e-poster.',
 'accountcreated' => 'Konto opprettet',
 'accountcreatedtext' => 'Brukerkontoen for $1 har blitt opprettet.',
 'createaccount-title' => 'Kontooppretting på {{SITENAME}}',
@@ -965,6 +981,10 @@ Du kan [[Special:Search/{{PAGENAME}}|søke etter denne sidetittelen]] på andre
 eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} opprette siden]</span>.',
 'noarticletext-nopermission' => 'Det er ingen tekst på denne siden.
 Du kan [[Special:Search/{{PAGENAME}}|søke etter sidens tittel]] i andre sider, eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søke i relevante logger]</span>.',
+'missing-revision' => 'Revisjonen #$1 av siden med navnet "{{PAGENAME}}" eksisterer ikke.
+
+Dette skyldes som regel at en gammel historikklenke er fulgt til en side som er slettet.
+Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].',
 'userpage-userdoesnotexist' => 'Brukerkontoen «$1» er ikke registrert.
 Sjekk om du ønsker å opprette/redigere denne siden.',
 'userpage-userdoesnotexist-view' => 'Kontoen «$1» er ikke registrert.',
@@ -974,7 +994,6 @@ Siste blokkeringsloggelement kan sees nedenfor.',
 * '''Firefox / Safari:''' Hold ''Shift'' mens du klikker på ''Oppdater'' eller trykk ''Ctrl-F5'' eller ''Ctrl-R'' (''⌘-R'' på en Mac)
 * '''Google Chrome:''' Trykk ''Ctrl-Shift-R'' (''⌘-Shift-R'' på en Mac)
 * '''Internet Explorer:''' Hold ''Ctrl'' mens du klikker på ''Oppdater'' eller trykk ''Ctrl-F5''
-* '''Konqueror:''' Klikk ''Oppdater'' eller trykk ''F5''
 * '''Opera:''' Tøm hurtiglageret i ''Verktøy → Innstillinger''",
 'usercssyoucanpreview' => "'''Tips:''' Bruk «{{int:showpreview}}»-knappen for å teste din nye CSS før du lagrer.",
 'userjsyoucanpreview' => "'''Tips:''' Bruk «{{int:showpreview}}»-knappen for å teste ditt nye JS før du lagrer.",
@@ -989,6 +1008,7 @@ Siste blokkeringsloggelement kan sees nedenfor.',
 'note' => "'''Merk:'''",
 'previewnote' => "'''Husk at dette bare er en forhåndsvisning.'''
 Endringene dine har ikke blitt lagret ennå!",
+'continue-editing' => 'Fortsett med redigeringen',
 'previewconflict' => 'Slik vil teksten i redigeringsvinduet se ut dersom du lagrer den.',
 'session_fail_preview' => "'''Beklager! Klarte ikke å lagre redigeringen din på grunn av tap av øktdata.'''
 Prøv igjen.
@@ -1001,6 +1021,7 @@ Om det fortsetter å gå galt, prøv å [[Special:UserLogout|logge ut]] og så i
 'token_suffix_mismatch' => "'''Redigeringen din har blitt avvist fordi klienten din ikke hadde punktasjonstegn i redigeringsteksten. Redigeringen har blitt avvist for å hindre ødeleggelse av artikkelteksten. Dette forekommer av og til når man bruker vevbaserte anonyme proxytjenester.'''",
 'edit_form_incomplete' => "'''Deler av redigeringsskjemaet nådde ikke tjeneren; dobbelsjekk at redigeringen er korrekt og prøv igjen.'''",
 'editing' => 'Redigerer $1',
+'creating' => 'Oppretter $1',
 'editingsection' => 'Redigerer $1 (avsnitt)',
 'editingcomment' => 'Redigerer $1 (ny seksjon)',
 'editconflict' => 'Redigeringskonflikt: $1',
@@ -1035,7 +1056,7 @@ Systemadministratoren som låste databasen oppga følgende årsak: $1",
 Det siste loggelementet er oppgitt under som referanse:",
 'semiprotectedpagewarning' => "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan endre den.
 Det siste loggelementet er oppgitt under som referanse:",
-'cascadeprotectedwarning' => "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede sider:<!--{{PLURAL:$1}}-->",
+'cascadeprotectedwarning' => "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede {{PLURAL:$1|sider}}:",
 'titleprotectedwarning' => "'''Advarsel: Denne siden har blitt låst slik at [[Special:ListGroupRights|spesielle rettigheter]] kreves for å opprette den.'''
 Det siste loggelementet er oppgitt under som referanse:",
 'templatesused' => '{{PLURAL:$1|Mal|Maler}} som brukes på denne siden:',
@@ -1065,6 +1086,7 @@ Slette- og flytteloggen vises nedenfor.',
 'edit-conflict' => 'Redigeringskonflikt.',
 'edit-no-change' => 'Redigeringen din ble ignorert fordi det ikke var noen endringer.',
 'edit-already-exists' => 'Kunne ikke opprette ny side fordi den finnes fra før.',
+'defaultmessagetext' => 'Standard meldingstekst',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.
@@ -1080,6 +1102,13 @@ Disse parameterne har blitt utelatt.',
 'parser-template-loop-warning' => 'Mal-loop oppdaget: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Mal er brukt for mange ganger ($1)',
 'language-converter-depth-warning' => 'Dybdegrense for språkkonvertering overskredet ($1)',
+'node-count-exceeded-category' => 'Sider hvor antallet noder er overskredet',
+'node-count-exceeded-warning' => 'Siden har overskredet antallet noder',
+'expansion-depth-exceeded-category' => 'Sider hvor hvor ekspansjonsdybden er overskredet',
+'expansion-depth-exceeded-warning' => 'Sida har overskredet ekspansjonsdybden',
+'parser-unstrip-loop-warning' => '«Unstrip»-loop påvist',
+'parser-unstrip-recursion-limit' => 'Rekursjonsgrense for taggfjerning overskredet ($1)',
+'converter-manual-rule-error' => 'En feil ble oppdaget i en manuell språkkonverteringsregel',
 
 # "Undo" feature
 'undo-success' => 'Redigeringen kan omgjøres. Sjekk sammenligningen under for å bekrefte at du vil gjøre dette, og lagre endringene for å fullføre omgjøringen.',
@@ -1144,7 +1173,7 @@ Du kan fortsatt se den; detaljer finnes i [{{fullurl:{{#Special:Log}}/delete|pag
 Som administrator kan du se den; detaljer kan finnes i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].",
 'rev-deleted-no-diff' => "Du kan ikke vise forskjellen fordi en av versjonene har blitt '''slettet'''.
 Det kan finnes flere detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].",
-'rev-suppressed-no-diff' => "Du kanne ikke se revisjonsforskjellen fordi en av revisjonene har blitt '''slettet'''.",
+'rev-suppressed-no-diff' => "Du kan ikke se revisjonsforskjellen fordi en av revisjonene har blitt '''slettet.'''",
 'rev-deleted-unhide-diff' => "Én av revisjonene i denne diffen har blitt '''slettet'''.
 Det finnes flere detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].
 Du kan fortsatt [$1 se diffen] om du ønsker å gå videre.",
@@ -1203,9 +1232,9 @@ $1",
 'deletedhist' => 'Slettet historikk',
 'revdelete-hide-current' => 'Feil under skjuling av objektet datert $2, $1: dette er den gjeldende revisjonen.
 Den kan ikke skjules.',
-'revdelete-show-no-access' => 'Feil under visning av objekt datert $2, $1: dette objektet har blitt markert "begrenset".
+'revdelete-show-no-access' => 'Feil under visning av objekt datert $2, $1: dette objektet har blitt markert «begrenset».
 Du har ikke tilgang til det.',
-'revdelete-modify-no-access' => 'Feil under endring av objekt datert $2, $1: dette objektet har blitt markert "begrenset".
+'revdelete-modify-no-access' => 'Feil under endring av objekt datert $2, $1: dette objektet har blitt markert «begrenset».
 Du har ikke tilgang til det.',
 'revdelete-modify-missing' => 'Feil under endring av objekt ID $1: det mangler i databasen!',
 'revdelete-no-change' => "'''Advarsel:''' objektet datert $2 $1 hadde allerede synlighetsinnstillingene du forespurte.",
@@ -1224,7 +1253,7 @@ Vennligst sjekk loggen.',
 # Suppression log
 'suppressionlog' => 'Sideskjulingslogg',
 'suppressionlogtext' => 'Under er en liste over sider som er slettet eller blokkert med innhold skjult fra administratorer.
-Se [[Special:BlockList|IP-blokkeringsliste]] for oversikt over aktuelle utelukkelser og blokkeringer.',
+Se [[Special:BlockList|blokkeringslisten]] for oversikt over aktuelle utelukkelser og blokkeringer.',
 
 # History merging
 'mergehistory' => 'Flett sidehistorikker',
@@ -1257,18 +1286,23 @@ Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
 
 # Diffs
 'history-title' => 'Revisjonshistorikk for «$1»',
-'difference' => '(Forskjell mellom revisjoner)',
+'difference-title' => 'Forskjell mellom versjoner av «$1»',
+'difference-title-multipage' => 'Forskjell mellom sidene «$1» og «$2»',
 'difference-multipage' => '(Forskjell mellom sider)',
 'lineno' => 'Linje $1:',
 'compareselectedversions' => 'Sammenlign valgte revisjoner',
 'showhideselectedversions' => 'Vis/skjul valgte versjoner',
-'editundo' => 'angre',
+'editundo' => 'fjern',
 'diff-multi' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av {{PLURAL:$2|én bruker|$2 brukere}} vises ikke)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av mer enn $2 {{PLURAL:$2|bruker|brukere}} vises ikke)',
+'difference-missing-revision' => '{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.
+
+Dette skyldes som regel at en gammel forskjell-lenke er fulgt til en side som er slettet.
+Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].',
 
 # Search results
-'searchresults' => 'Søkeresultat',
-'searchresults-title' => 'Søkeresultat for «$1»',
+'searchresults' => 'Søkeresultater',
+'searchresults-title' => 'Søkeresultater for «$1»',
 'searchresulttext' => 'For mer informasjon om søking i {{SITENAME}}, se [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => "Du søkte etter '''[[:$1]]''' ([[Special:Prefixindex/$1|alle sider som begynner med «$1»]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle sider som lenker til «$1»]])",
 'searchsubtitleinvalid' => "Du søkte etter '''$1'''",
@@ -1304,8 +1338,8 @@ Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
 'search-redirect' => '(omdirigering $1)',
 'search-section' => '(avsnitt $1)',
 'search-suggest' => 'Mente du: $1',
-'search-interwiki-caption' => 'Søsterprosjekt',
-'search-interwiki-default' => '$1-resultat:',
+'search-interwiki-caption' => 'Søsterprosjekter',
+'search-interwiki-default' => '$1-resultater:',
 'search-interwiki-more' => '(mer)',
 'search-mwsuggest-enabled' => 'med forslag',
 'search-mwsuggest-disabled' => 'ingen forslag',
@@ -1319,7 +1353,7 @@ Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
 'showingresultsheader' => "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
 'nonefound' => "'''Merk''': Som standard søkes det kun i enkelte navnerom.
 For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler, osv), eller bruk det ønskede navnerommet som prefiks.",
-'search-nonefound' => 'Det var ingen resultater som passet til søket.',
+'search-nonefound' => 'Ingen resultater passet til søket.',
 'powersearch' => 'Avansert søk',
 'powersearch-legend' => 'Avansert søk',
 'powersearch-ns' => 'Søk i navnerom:',
@@ -1353,13 +1387,14 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
 'prefs-beta' => 'Betafunksjoner',
 'prefs-datetime' => 'Dato og tid',
 'prefs-labs' => 'Lab-funksjoner',
+'prefs-user-pages' => 'Brukersider',
 'prefs-personal' => 'Brukerdata',
 'prefs-rc' => 'Siste endringer',
 'prefs-watchlist' => 'Overvåkningsliste',
 'prefs-watchlist-days' => 'Dager som skal vises i overvåkningslisten:',
 'prefs-watchlist-days-max' => 'Maksimalt $1 {{PLURAL:$1|dag|dager}}',
 'prefs-watchlist-edits' => 'Antall redigeringer som skal vises i utvidet overvåkningsliste:',
-'prefs-watchlist-edits-max' => 'Maksimum antall: 1000',
+'prefs-watchlist-edits-max' => 'Maksimalt antall: 1000',
 'prefs-watchlist-token' => 'Nøkkel for overvåkningsliste',
 'prefs-misc' => 'Diverse',
 'prefs-resetpass' => 'Endre passord',
@@ -1379,7 +1414,7 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
 'stub-threshold' => 'Grense for <span class="mw-stub-example">stubblenkeformatering</span>:',
 'stub-threshold-disabled' => 'Deaktivert',
 'recentchangesdays' => 'Antall dager som skal vises i siste endringer:',
-'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dag|dager}})',
+'recentchangesdays-max' => 'Maks $1 {{PLURAL:$1|dag|dager}}',
 'recentchangescount' => 'Antall redigeringer som skal vises som standard:',
 'prefs-help-recentchangescount' => 'Dette inkluderer nylige endringer, sidehistorikk og logger.',
 'prefs-help-watchlist-token' => 'Om du fyller ut dette feltet med et hemmelig tall, vil det lages en RSS-liste for overvåkningslisten din.
@@ -1400,8 +1435,8 @@ Her er et tilfeldig tall du kan bruke: $1',
 'timezoneregion-asia' => 'Asia',
 'timezoneregion-atlantic' => 'Atlanterhavet',
 'timezoneregion-australia' => 'Australia',
-'timezoneregion-europe' => 'Europe',
-'timezoneregion-indian' => 'Det indiske hav',
+'timezoneregion-europe' => 'Europa',
+'timezoneregion-indian' => 'Indiahavet',
 'timezoneregion-pacific' => 'Stillehavet',
 'allowemail' => 'Tillat andre å sende meg e-post',
 'prefs-searchoptions' => 'Søkealternativ',
@@ -1445,12 +1480,12 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'prefs-signature' => 'Signatur',
 'prefs-dateformat' => 'Datoformat',
 'prefs-timeoffset' => 'Tidsforskyvning',
-'prefs-advancedediting' => 'Avanserte alternativ',
+'prefs-advancedediting' => 'Avanserte alternativer',
 'prefs-advancedrc' => 'Avanserte alternativ',
-'prefs-advancedrendering' => 'Avanserte alternativ',
-'prefs-advancedsearchoptions' => 'Avanserte alternativ',
-'prefs-advancedwatchlist' => 'Avanserte alternativ',
-'prefs-displayrc' => 'Visningsalternativ',
+'prefs-advancedrendering' => 'Avanserte alternativer',
+'prefs-advancedsearchoptions' => 'Avanserte alternativer',
+'prefs-advancedwatchlist' => 'Avanserte alternativer',
+'prefs-displayrc' => 'Visningsalternativer',
 'prefs-displaysearchoptions' => 'Visningsalternativer',
 'prefs-displaywatchlist' => 'Visningsalternativer',
 'prefs-diffs' => 'Forskjeller',
@@ -1512,7 +1547,7 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'right-createpage' => 'Opprette sider (som ikke er diskusjonssider)',
 'right-createtalk' => 'Opprette diskusjonssider',
 'right-createaccount' => 'Opprette nye kontoer',
-'right-minoredit' => 'Marker endringer som mindre',
+'right-minoredit' => 'Markere endringer som mindre',
 'right-move' => 'Flytte sider',
 'right-move-subpages' => 'Flytte sider med undersider',
 'right-move-rootuserpages' => 'Flytte hovedbrukersider',
@@ -1531,9 +1566,10 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'right-writeapi' => 'Redigere via API',
 'right-delete' => 'Slette sider',
 'right-bigdelete' => 'Slette sider med stor historikk',
+'right-deletelogentry' => 'Slett og gjenopprett spesifikke loggoppføringer',
 'right-deleterevision' => 'Slette og gjenopprette enkeltrevisjoner av sider',
 'right-deletedhistory' => 'Se slettet sidehistorikk uten tilhørende sidetekst',
-'right-deletedtext' => 'Vis slettet tekst og endringer mellom slettede versjoner',
+'right-deletedtext' => 'Vise slettet tekst og endringer mellom slettede versjoner',
 'right-browsearchive' => 'Søke i slettede sider',
 'right-undelete' => 'Gjenopprette sider',
 'right-suppressrevision' => 'Se og gjenopprette skjulte siderevisjoner',
@@ -1543,8 +1579,8 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'right-hideuser' => 'Blokkere et brukernavn og skjule det fra det offentlige',
 'right-ipblock-exempt' => 'Kan redigere fra blokkerte IP-adresser',
 'right-proxyunbannable' => 'Kan redigere fra blokkerte proxyer',
-'right-unblockself' => 'Fjern blokkering av seg selv',
-'right-protect' => 'Endre beskyttelsesnivåer',
+'right-unblockself' => 'Fjerne blokkering av seg selv',
+'right-protect' => 'Endre beskyttelsesnivåer og redigere beskyttete sider',
 'right-editprotected' => 'Redigere beskyttede sider',
 'right-editinterface' => 'Redigere brukergrensesnittet',
 'right-editusercssjs' => 'Redigere andre brukeres CSS- og JS-filer',
@@ -1569,7 +1605,7 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 
 # User rights log
 'rightslog' => 'Brukerrettighetslogg',
-'rightslogtext' => 'Dette er en logg over forandringer i brukerrettigheter.',
+'rightslogtext' => 'Dette er en logg over endringer av brukerrettigheter.',
 'rightslogentry' => 'endret gruppe for $1 fra $2 til $3',
 'rightslogentry-autopromote' => 'ble automatisk forfremmet fra $2 til $3',
 'rightsnone' => '(ingen)',
@@ -1599,7 +1635,7 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'action-suppressionlog' => 'se denne private loggen',
 'action-block' => 'blokkere denne brukeren fra å redigere',
 'action-protect' => 'endre denne sidens beskyttelsesnivåer',
-'action-rollback' => 'tilbakestill raskt endringene til den siste brukeren som redigerte en bestemt side',
+'action-rollback' => 'raskt tilbakestille endringene til den siste brukeren som redigerte en bestemt side',
 'action-import' => 'importere denne siden fra en annen wiki',
 'action-importupload' => 'importere denne siden fra en opplastet fil',
 'action-patrol' => 'merke andre brukeres redigeringer som patruljert',
@@ -1609,20 +1645,20 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'action-userrights' => 'redigere alle brukerrettigheter',
 'action-userrights-interwiki' => 'endre brukerrettigheter for brukere på andre wikier',
 'action-siteadmin' => 'låse eller låse opp databasen',
-'action-sendemail' => 'send e-post',
+'action-sendemail' => 'sende e-poster',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|endring|endringer}}',
 'recentchanges' => 'Siste endringer',
-'recentchanges-legend' => 'Alternativ for siste endringer',
-'recentchangestext' => 'Vis de siste endringene til denne siden',
+'recentchanges-legend' => 'Alternativer for siste endringer',
+'recentchanges-summary' => 'På denne siden vises de siste endringene i wikien.',
 'recentchanges-feed-description' => 'Følg med på siste endringer i denne wikien med denne matingen.',
 'recentchanges-label-newpage' => 'Denne redigeringen opprettet en ny side',
 'recentchanges-label-minor' => 'Dette er en mindre endring',
 'recentchanges-label-bot' => 'Denne redigeringen ble gjort av en bot',
 'recentchanges-label-unpatrolled' => 'Denne redigeringen har ikke blitt patruljert ennå',
 'rcnote' => "Nedenfor vises {{PLURAL:$1|'''1''' endring|de siste '''$1''' endringene}} fra {{PLURAL:$2|det siste døgnet|de siste '''$2''' døgnene}}, per $5 $4.",
-'rcnotefrom' => "Nedenfor er endringene fra '''$2''' (opp til '''$1''' vises).",
+'rcnotefrom' => "Nedenfor er endringene siden '''$2''' (opp til '''$1''' vises).",
 'rclistfrom' => 'Vis nye endringer med start fra $1',
 'rcshowhideminor' => '$1 mindre endringer',
 'rcshowhidebots' => '$1 roboter',
@@ -1641,11 +1677,11 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'number_of_watching_users_pageview' => '[$1 overvåkende {{PLURAL:$1|bruker|brukere}}]',
 'rc_categories' => 'Begrens til kategorier (skilletegn: «|»)',
 'rc_categories_any' => 'Alle',
-'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} etter endring',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte}} etter endring',
 'newsectionsummary' => '/* $1 */ ny seksjon',
 'rc-enhanced-expand' => 'Vis detaljer (krever JavaScript)',
 'rc-enhanced-hide' => 'Skjul detaljer',
-'rc-old-title' => 'opprinnelig opprettet som "$1"',
+'rc-old-title' => 'opprinnelig opprettet som «$1»',
 
 # Recent changes linked
 'recentchangeslinked' => 'Relaterte endringer',
@@ -1672,12 +1708,12 @@ Sider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
 
 Slette- og flytteloggen for denne siden gjengis her:",
 'uploadtext' => "Bruk skjemaet nedenfor for å laste opp filer.
-For å se eller søke i eksisterende filer, gå til [[Special:FileList|listen over filer]]. Opplastinger lagres også i [[Special:Log/upload|opplastingsloggen]].
+For å se eller søke i eksisterende filer, gå til [[Special:FileList|listen over filer]]. Opplastinger lagres også i [[Special:Log/upload|opplastingsloggen]] og slettinger i [[Special:Log/delete|sletteloggen]].
 
 For å inkludere en fil på en side, bruk en slik lenke:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnavn.jpg<nowiki>]]</nowiki></tt>''' for å bruke bildet i opprinnelig form
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnavn.png|200px|thumb|left|Alternativ tekst<nowiki>]]</nowiki></tt>''' for å bruke bildet med en bredde på 200&nbsp;piksler, venstrestilt og med «Alternativ tekst» som beskrivelse
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}:Filnavn.ogg<nowiki>]]</nowiki></tt>''' for å lenke direkte til filen uten å vise den",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Filnavn.jpg]]</nowiki></code>''' for å bruke bildet i opprinnelig form
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Filnavn.png|200px|thumb|left|Alternativ tekst]]</nowiki></code>''' for å bruke bildet med en bredde på 200&nbsp;piksler, venstrestilt og med «Alternativ tekst» som beskrivelse
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Filnavn.ogg]]</nowiki></code>''' for å lenke direkte til filen uten å vise den",
 'upload-permitted' => 'Tillatte filtyper: $1.',
 'upload-preferred' => 'Foretrukne filtyper: $1',
 'upload-prohibited' => 'Forbudte filtyper: $1.',
@@ -1696,7 +1732,7 @@ Se [[Special:NewFiles|galleriet over nye filer]] for en mer visuell visning',
 'ignorewarnings' => 'Ignorer eventuelle advarsler',
 'minlength1' => 'Filnavn må være på minst én bokstav.',
 'illegalfilename' => 'Filnavnet «$1» inneholder ugyldige tegn. Gi filen et nytt navn og prøv igjen.',
-'filename-toolong' => 'Filnavn kan ikke overstige 240 bytes.',
+'filename-toolong' => 'Filnavn kan ikke overstige 240 byte.',
 'badfilename' => 'Navnet på filen er blitt endret til «$1».',
 'filetype-mime-mismatch' => 'Filendelsen «.$1» tilsvarer ikke MIME-typen som oppgis i filen ($2).',
 'filetype-badmime' => 'Filer av typen «$1» kan ikke lastes opp.',
@@ -1721,19 +1757,19 @@ Se [[Special:NewFiles|galleriet over nye filer]] for en mer visuell visning',
 'largefileserver' => 'Denne filen er større enn det tjeneren er satt opp til å tillate.',
 'emptyfile' => 'Filen du lastet opp ser ut til å være tom. Dette kan komme av en skrivefeil i filnavnet. Sjekk om du virkelig vil laste opp denne filen.',
 'windows-nonascii-filename' => 'Denne wikien støtter ikke filnavn med spesialtegn.',
-'fileexists' => "Ei fil med dette navnet finnes allerede.
-Sjekk '''<tt>[[:$1]]</tt>''' hvis du ikke er sikker på at du vil forandre den.
-[[$1|thumb]]",
-'filepageexists' => "Beskrivelsessiden for denne filen finnes allerede på '''<tt>[[:$1]]</tt>''', men ingen filer med dette navnet finnes. Sammendraget du skruver inn vil ikke vises på beskrivelsessiden. For at det skal dukke opp der må du skrive det inn manuelt etter å da lastet opp filen.
-[[$1|thumb]]",
-'fileexists-extension' => "En fil med et lignende navn finnes: [[$2|thumb]]
-* Navnet på din fil: '''<tt>[[:$1]]</tt>'''
-* Navn på eksisterende fil: '''<tt>[[:$2]]</tt>'''
-Velg et annet filnavn.",
-'fileexists-thumbnail-yes' => "Filen ser ut til å være et bilde av redusert størrelse. [[$1|thumb]]
-Vennligst sjekk filen '''<tt>[[:$1]]</tt>'''.
-Om filen du sjekket er det samme bildet, men i opprinnelig størrelse, er det ikke nødvendig å laste opp en ekstra fil.",
-'file-thumbnail-no' => "Filnavnet begynner med '''<tt>$1</tt>'''.
+'fileexists' => 'Ei fil med dette navnet finnes allerede.
+Sjekk <strong>[[:$1]]</strong> hvis du ikke er sikker på at du vil forandre den.
+[[$1|thumb]]',
+'filepageexists' => 'Beskrivelsessiden for denne filen finnes allerede på <strong>[[:$1]]</strong>, men ingen filer med dette navnet finnes. Sammendraget du skruver inn vil ikke vises på beskrivelsessiden. For at det skal dukke opp der må du skrive det inn manuelt etter å da lastet opp filen.
+[[$1|thumb]]',
+'fileexists-extension' => 'En fil med et lignende navn finnes: [[$2|thumb]]
+* Navnet på din fil: <strong>[[:$1]]</strong>
+* Navn på eksisterende fil: <strong>[[:$2]]</strong>
+Velg et annet filnavn.',
+'fileexists-thumbnail-yes' => 'Filen ser ut til å være et bilde av redusert størrelse. [[$1|thumb]]
+Vennligst sjekk filen <strong>[[:$1]]</strong>.
+Om filen du sjekket er det samme bildet, men i opprinnelig størrelse, er det ikke nødvendig å laste opp en ekstra fil.',
+'file-thumbnail-no' => "Filnavnet begynner med <strong>$1</strong>.
 Det virker som om det er et bilde av redusert størrelse ''(miniatyrbilde)''.
 Om du har dette bildet i stor utgave, last opp det, eller endre filnavnet på denne filen.",
 'fileexists-forbidden' => 'En fil med dette navnet finnes fra før, og kan ikke erstattes.
@@ -1819,14 +1855,16 @@ Om problemet fortsetter, kontakt en [[Special:ListUsers/sysop|administrator]].',
 'backend-fail-closetemp' => 'Kunne ikke lukke den midlertidige filen.',
 'backend-fail-read' => 'Kunne ikke lese filen $1.',
 'backend-fail-create' => 'Kunne ikke opprette filen $1.',
-'backend-fail-maxsize' => 'Filen $1 ble ikke opprettet fordi den ville blitt større enn {{PLURAL:$2|$2 bytes|$2 byte}}.',
+'backend-fail-maxsize' => 'Kunne ikke skrive filen $1 fordi den er større enn {{PLURAL:$2|én byte|$2 bytes}}.',
 'backend-fail-readonly' => 'Underliggende "$1" er satt skrivebeskyttet fordi: "$2"',
 'backend-fail-synced' => 'Fila «$1» er i en inkonsistent status innen de interne bakstykkene',
 'backend-fail-connect' => 'Kunne ikke koble til filbackend «$1».',
 'backend-fail-internal' => 'En ukjent feil oppsto i filbackend «$1».',
 'backend-fail-contenttype' => 'Kunne ikke avgjøre innholdstypen til filen som skal lagres på «$1».',
 'backend-fail-batchsize' => 'Bakgrunnsprosesseringen belastet med {{PLURAL:$1|en filoperasjon|en samling av $1 filoperasjoner}}; grensen er $2.',
+'backend-fail-usable' => 'Kunne ikke skrive fila $1 på grunn av utilstrekkelige tillatelser eller manglende mapper/beholdere.',
 
+# File journal errors
 'filejournal-fail-dbconnect' => 'Kunne ikke koble til journaldatabasen for lagringssystemet «$1».',
 'filejournal-fail-dbquery' => 'Kunne ikke oppdatere journaldatabasen for lagringssystemet «$1».',
 
@@ -1839,6 +1877,7 @@ Om problemet fortsetter, kontakt en [[Special:ListUsers/sysop|administrator]].',
 'lockmanager-fail-releaselock' => 'Kunne ikke frigi låsen for «$1».',
 'lockmanager-fail-db-bucket' => 'Kunne ikke kontakte nok låsedatabaser i bøtten $1.',
 'lockmanager-fail-db-release' => 'Kunne ikke frigi låser på databasen $1.',
+'lockmanager-fail-svr-acquire' => 'Kunne ikke hente lås på server $1.',
 'lockmanager-fail-svr-release' => 'Kunne ikke frigi låser på tjeneren $1.',
 
 # ZipDirectoryReader
@@ -1946,11 +1985,16 @@ En [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengelig.',
 Se [$2 filbeskrivelsessida] for mer informasjon.',
 'sharedupload-desc-here' => 'Denne filen er fra $1 og kan brukes av andre prosjekter.
 Beskrivelsen fra [$2 filbeskrivelsessida] vises nedenfor.',
+'sharedupload-desc-edit' => 'Denne filen er fra $1 og kan være i bruk av andre prosjekter.
+Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
+'sharedupload-desc-create' => 'Denne filen er fra $1 og kan være i bruk av andre prosjekter.
+Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
 'filepage-nofile' => 'Det finnes ingen fil med dette navnet.',
 'filepage-nofile-link' => 'Ingen fil med dette navnet eksisterer, men du kan [$1 laste den opp].',
 'uploadnewversion-linktext' => 'Last opp en ny versjon av denne filen',
 'shared-repo-from' => 'fra $1',
 'shared-repo' => 'et delt fillager',
+'upload-disallowed-here' => 'Beklageligvis kan du ikke overskrive dette bildet.',
 
 # File reversion
 'filerevert' => 'Tilbakestill $1',
@@ -1984,7 +2028,7 @@ Beskrivelsen fra [$2 filbeskrivelsessida] vises nedenfor.',
 
 # MIME search
 'mimesearch' => 'MIME-søk',
-'mimesearch-summary' => 'Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype, for eksempel <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype, for eksempel <code>image/jpeg</code>.',
 'mimetype' => 'MIME-type:',
 'download' => 'last ned',
 
@@ -2032,7 +2076,7 @@ Beskrivelsen fra [$2 filbeskrivelsessida] vises nedenfor.',
 'disambiguationspage' => 'Template:Peker',
 'disambiguations-text' => "Følgende sider lenker til en '''pekerside'''.
 De burde i stedet lenke til en passende innholdsside.<br />
-En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[MediaWiki:Disambiguationspage]]",
+En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Doble omdirigeringer',
 'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
@@ -2057,6 +2101,7 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|kategori|kategorier}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikier}}',
 'nlinks' => '$1 {{PLURAL:$1|lenke|lenker}}',
 'nmembers' => '$1 {{PLURAL:$1|medlem|medlemmer}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisjon|revisjoner}}',
@@ -2085,6 +2130,7 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
 'mostlinkedtemplates' => 'Mest brukte maler',
 'mostcategories' => 'Sider med flest kategorier',
 'mostimages' => 'Mest brukte filer',
+'mostinterwikis' => 'Sider med flest interwikier',
 'mostrevisions' => 'Artikler med flest revisjoner',
 'prefixindex' => 'Alle sider med prefiks',
 'prefixindex-namespace' => 'All sider med prefiks ($1 navnerom)',
@@ -2138,6 +2184,7 @@ Merk at andre sider kanskje lenker til en fil med en direkte lenke, så filen li
 Du kan minske antallet resultater ved å velge loggtype, brukernavn eller den siden som er påvirket (husk å skille mellom store og små bokstaver).',
 'logempty' => 'Ingen elementer i loggen.',
 'log-title-wildcard' => 'Søk i titler som starter med denne teksten',
+'showhideselectedlogentries' => 'Vis/skjul de valgte logghendelsene',
 
 # Special:AllPages
 'allpages' => 'Alle sider',
@@ -2155,6 +2202,12 @@ Du kan minske antallet resultater ved å velge loggtype, brukernavn eller den si
 'allpagesprefix' => 'Vis sider med prefikset:',
 'allpagesbadtitle' => 'Den angitte sidetittelen var ugyldig eller hadde et interwiki-prefiks. Den kan inneholde ett eller flere tegn som ikke kan brukes i titler.',
 'allpages-bad-ns' => '{{SITENAME}} har ikke navnerommet «$1».',
+'allpages-hide-redirects' => 'Skjul omdirigeringer',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du ser en mellomlagret versjon av denne siden, som kan være opp til $1 gammel.',
+'cachedspecial-viewing-cached-ts' => 'Du ser på en mellomlagret versjon av denne siden, som kan være ikke helt oppdatert',
+'cachedspecial-refresh-now' => 'Vis siste.',
 
 # Special:Categories
 'categories' => 'Kategorier',
@@ -2177,7 +2230,7 @@ Se også [[Special:WantedCategories|ønskede kategorier]].',
 'linksearch-ok' => 'Søk',
 'linksearch-text' => 'Jokertegn som «*.wikipedia.org» kan brukes.
 Det kreves at det oppgis minst et toppnivådomene, for eksempel «*.org».<br />
-Støttede protokoller: <tt>$1</tt> (ikke legg til noen av disse i søket ditt).',
+Støttede protokoller: <code>$1</code> (ikke legg til noen av disse i søket ditt).',
 'linksearch-line' => '$1 lenkes fra $2',
 'linksearch-error' => 'Jokertegn kan kun brukes foran tjenernavnet.',
 
@@ -2223,6 +2276,8 @@ Mer informasjon om de enkelte rettighetstypene kan finnes [[{{MediaWiki:Listgrou
 'mailnologin' => 'Ingen avsenderadresse',
 'mailnologintext' => 'Du må være [[Special:UserLogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.',
 'emailuser' => 'E-post til denne brukeren',
+'emailuser-title-target' => 'Send epost til denne {{GENDER:$1|brukeren}}',
+'emailuser-title-notarget' => 'E-post til bruker',
 'emailpage' => 'E-post til bruker',
 'emailpagetext' => 'Du kan bruke skjemaet nedenfor for å sende en e-post til denne brukeren.
 Den e-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil dukke opp i «fra»-feltet på denne e-posten, så mottakeren er i stand til å svare.',
@@ -2366,6 +2421,8 @@ Se $2 for en oversikt over de siste slettingene.',
 'rollback' => 'Fjern redigeringer',
 'rollback_short' => 'Tilbakestill',
 'rollbacklink' => 'tilbakestill',
+'rollbacklinkcount' => 'tilbakestill {{PLURAL:$1|én endring|$1 endringer}}',
+'rollbacklinkcount-morethan' => 'tilbakestill mer enn $1 {{PLURAL:$1|endring|endringer}}',
 'rollbackfailed' => 'Kunne ikke tilbakestille',
 'cantrollback' => 'Kan ikke fjerne redigering; den siste brukeren er den eneste forfatteren.',
 'alreadyrolled' => 'Kan ikke fjerne den siste redigeringen på [[$1]] av [[User:$2|$2]] ([[User talk:$2|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); en annen har allerede redigert siden eller fjernet redigeringen.
@@ -2637,7 +2694,7 @@ Blokkeringsloggen vises nedenfor.',
 Skjulingsloggen vises nedenfor.',
 'blocklogentry' => 'blokkerte [[$1]] med en varighet på $2 $3',
 'reblock-logentry' => 'endret blokkeringsinnstillinger for [[$1]] med en varighet på $2 $3',
-'blocklogtext' => 'Dette er en logg som viser hvilke brukere som har blitt blokkert og avblokkert. Automatisk blokkerte IP-adresser vises ikke. Se [[Special:BlockList|blokkeringslisten]] for en liste over IP-adresser som er blokkert akkurat nå.',
+'blocklogtext' => 'Dette er en logg som viser hvilke brukere som har blitt blokkert og avblokkert. Automatisk blokkerte IP-adresser vises ikke. Se [[Special:BlockList|blokkeringslisten]] for alle aktive blokkeringer.',
 'unblocklogentry' => 'opphevet blokkeringen av $1',
 'block-log-flags-anononly' => 'kun uregistrerte brukere',
 'block-log-flags-nocreate' => 'kontooppretting deaktivert',
@@ -2849,6 +2906,7 @@ Besøk [//translatewiki.net translatewiki.net] om du ønsker å bidra med overse
 'import-interwiki-templates' => 'Inkluder alle maler',
 'import-interwiki-submit' => 'Importer',
 'import-interwiki-namespace' => 'Målnavnerom:',
+'import-interwiki-rootpage' => 'Destinasjonens grunnside (valgfri):',
 'import-upload-filename' => 'Filnavn:',
 'import-comment' => 'Kommentar:',
 'importtext' => 'Importer filen fra kildewikien med [[Special:Export|eksporteringsverktøyet]].
@@ -2881,6 +2939,9 @@ Lagre den på din egen datamaskin og last den opp her.',
 'import-error-interwiki' => 'Siden «$1» ble ikke importert fordi navnet er reservert for ekstern lenking (interwiki).',
 'import-error-special' => 'Siden «$1» ble ikke importert fordi den tilhører et spesialnavnerom som ikke tillater sider.',
 'import-error-invalid' => 'Siden «$1» ble ikke importert fordi navnet er ugyldig.',
+'import-options-wrong' => 'Feil {{PLURAL:$2|opsjon|opsjoner}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Den angitte grunnsiden har en ugyldig tittel.',
+'import-rootpage-nosubpage' => 'Navnerommet "$1" til grunnsiden tillater ikke undersider.',
 
 # Import log
 'importlogpage' => 'Importlogg',
@@ -3016,19 +3077,38 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'spambot_username' => 'MediaWikis spamopprydning',
 'spam_reverting' => 'Tilbakestiller til siste versjon uten lenke til $1',
 'spam_blanking' => 'Alle revisjoner inneholdt lenke til $1, tømmer siden',
+'spam_deleting' => 'Sletter alle revisjoner med lenker til $1',
 
 # Info page
 'pageinfo-title' => 'Informasjon om «$1»',
-'pageinfo-header-edits' => 'Redigeringer',
-'pageinfo-header-watchlist' => 'Overvåkningsliste',
-'pageinfo-header-views' => 'Visninger',
-'pageinfo-subjectpage' => 'Side',
-'pageinfo-talkpage' => 'Diskusjonsside',
-'pageinfo-watchers' => 'Antall overvåkere',
-'pageinfo-edits' => 'Antall redigeringer',
-'pageinfo-authors' => 'Antall forskjellige forfattere',
+'pageinfo-header-basic' => 'Grunnleggende informasjon',
+'pageinfo-header-edits' => 'Redigeringshistorikk',
+'pageinfo-header-restrictions' => 'Sidebeskyttelse',
+'pageinfo-header-properties' => 'Sideegenskaper',
+'pageinfo-display-title' => 'Visningstittel',
+'pageinfo-default-sort' => 'Standardsorteringsnøkkel',
+'pageinfo-length' => 'Sidelengde (i bytes)',
+'pageinfo-article-id' => 'Side-ID',
+'pageinfo-robot-policy' => 'Søkemotorstatus',
+'pageinfo-robot-index' => 'Indekserbar',
+'pageinfo-robot-noindex' => 'Ikke indekserbar',
 'pageinfo-views' => 'Antall visninger',
-'pageinfo-viewsperedit' => 'Visninger per redigering',
+'pageinfo-watchers' => 'Antall overvåkere av siden',
+'pageinfo-redirects-name' => 'Omdirigeringer til siden',
+'pageinfo-subpages-name' => 'Undersider av siden',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringer}}; $3 {{PLURAL:$3|ikke-omdirigering|ikke-omdirigeringer}})',
+'pageinfo-firstuser' => 'Sideoppretter',
+'pageinfo-firsttime' => 'Dato for opprettelse av siden',
+'pageinfo-lastuser' => 'Siste forfatter',
+'pageinfo-lasttime' => 'Dato for siste redigering',
+'pageinfo-edits' => 'Totalt antall redigeringer',
+'pageinfo-authors' => 'Totalt antall forskjellige forfattere',
+'pageinfo-recent-edits' => 'Antall nylige redigeringer (innen siste $1)',
+'pageinfo-recent-authors' => 'Antall nylige forfattere',
+'pageinfo-restriction' => 'Sidebeskyttelse (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magisk|Magiske}} ord ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
+'pageinfo-templates' => 'Transkludert {{PLURAL:$1|mal|maler}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -3080,7 +3160,8 @@ Ved å åpne den kan systemet ditt kompromitteres.",
 'file-info-size' => '$1 × $2 piksler, filstørrelse: $3, MIME-type: $4',
 'file-info-size-pages' => '$1 × $2 piksler, filstørrelse: $3, MIME-type: $4, $5 {{PLURAL:$5|side|sider}}',
 'file-nohires' => 'Ingen høyere oppløsning tilgjengelig.',
-'svg-long-desc' => 'SVG-fil, standardoppløsning $1 × $2 piksler, filstørrelse: $3',
+'svg-long-desc' => 'SVG-fil, standardstørrelse $1 × $2 piksler, filstørrelse: $3',
+'svg-long-desc-animated' => 'Animert SVG-fil, standardstørrelse $1 × $2 piksler, filstørrelse: $3',
 'show-big-image' => 'Full oppløsning',
 'show-big-image-preview' => 'Størrelse på denne forhåndsvisningen: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Annen oppløsning|Andre oppløsninger}}: $1.',
@@ -3090,6 +3171,8 @@ Ved å åpne den kan systemet ditt kompromitteres.",
 'file-info-png-looped' => 'loopet',
 'file-info-png-repeat' => 'avspilt $1 {{PLURAL:$1|gang|ganger}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|bilde|bilder}}',
+'file-no-thumb-animation' => "'''Merk: På grunn av tekniske begrensninger vil ikke miniatyrbilder av denne filen bli animert.'''",
+'file-no-thumb-animation-gif' => "'''Merk: På grunn av tekniske begrensninger vil ikke miniatyrbilder av høyoppløselige GIF-bilder, slik som denne, bli animert.'''",
 
 # Special:NewFiles
 'newimages' => 'Galleri over nye filer',
@@ -3746,6 +3829,9 @@ Du skal ha mottatt [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi av GNU General Publ
 'version-software' => 'Installert programvare',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Versjon',
+'version-entrypoints' => 'Inngangspunkts-URL-er',
+'version-entrypoints-header-entrypoint' => 'Inngangspunkt',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Filsti',
@@ -3773,7 +3859,7 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
 * <span class="mw-specialpagecached">Spesialsider som oppdateres periodisk (kan være foreldede).</span>',
 'specialpages-group-maintenance' => 'Vedlikeholdsrapporter',
 'specialpages-group-other' => 'Andre spesialsider',
-'specialpages-group-login' => 'Innlogging / registrering',
+'specialpages-group-login' => 'Innlogging / opprette bruker',
 'specialpages-group-changes' => 'Siste endringer og logger',
 'specialpages-group-media' => 'Medierapporter og opplastinger',
 'specialpages-group-users' => 'Brukere og rettigheter',
@@ -3907,9 +3993,12 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
 'api-error-empty-file' => 'Filen du sendte inn var tom.',
 'api-error-emptypage' => 'Det er ikke tillatt å opprette nye, tomme sider.',
 'api-error-fetchfileerror' => 'Intern feil: Noe gikk galt ved henting av denne filen.',
+'api-error-fileexists-forbidden' => 'En fil med navnet «$1» finnes allerede, og kan ikke overskrives.',
+'api-error-fileexists-shared-forbidden' => 'En fil med navnet «$1» finnes allerede i det delte filsystemet, og kan ikke overskrives.',
 'api-error-file-too-large' => 'Filen du la inn var for stor.',
 'api-error-filename-tooshort' => 'Filnavnet er for kort.',
 'api-error-filetype-banned' => 'Denne filtypen er ikke tillatt.',
+'api-error-filetype-banned-type' => '{{PLURAL:$4|Filtypen|Filtypene}} $1 er ikke {{PLURAL:$4|tillatt|tillatte}}. {{PLURAL:$3|Tillatt filtype|Tillatte filtyper}} er $2.',
 'api-error-filetype-missing' => 'Filen mangler filendelse.',
 'api-error-hookaborted' => 'Endringen du prøvde å gjøre ble avbrutt av en utvidelsestilkobling.',
 'api-error-http' => 'Intern feil: kan ikke få forbindelse til server.',
@@ -3934,4 +4023,15 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
 'api-error-uploaddisabled' => 'Opplastning har blitt deaktivert på denne wikien.',
 'api-error-verification-error' => 'Filen kan være korrupt, eller ha feil filendelse.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minutt|minutter}}',
+'duration-hours' => '$1 {{PLURAL:$1|time|timer}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dager}}',
+'duration-weeks' => '$1 {{PLURAL:$1|uke|uker}}',
+'duration-years' => '$1 {{PLURAL:$1|år|år}}',
+'duration-decades' => '$1 {{PLURAL:$1|tiår|tiår}}',
+'duration-centuries' => '$1 {{PLURAL:$1|århundre|århundrer}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
+
 );
index 675b8a9..db850eb 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Geitost
  * @author Kaganer
  * @author Purodha
  * @author Slomox
@@ -55,33 +56,33 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#wiederleiden', '#WEITERLEITUNG', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__KEENINHOLTVERTEKEN__', '__KEIN_INHALTSVERZEICHNIS__', '__KEININHALTSVERZEICHNIS__', '__NOTOC__' ),
-       'forcetoc'                => array( '0', '__WIESINHOLTVERTEKEN__', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__INHOLTVERTEKEN__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__KEENÄNNERNLINK__', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'AKTMAAND', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'AKTMAANDNAAM', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'AKTMAANDNAAMGEN', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
-       'currentday'              => array( '1', 'AKTDAG', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
-       'currentdayname'          => array( '1', 'AKTDAGNAAM', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'AKTJOHR', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'AKTTIED', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
-       'numberofarticles'        => array( '1', 'ARTIKELTALL', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
-       'pagename'                => array( '1', 'SIETNAAM', 'SEITENNAME', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'SIETNAAME', 'SEITENNAME_URL', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NAAMRUUM', 'NAMENSRAUM', 'NAMESPACE' ),
-       'img_thumbnail'           => array( '1', 'duum', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
-       'img_right'               => array( '1', 'rechts', 'right' ),
-       'img_left'                => array( '1', 'links', 'left' ),
-       'img_none'                => array( '1', 'keen', 'ohne', 'none' ),
-       'img_center'              => array( '1', 'merrn', 'zentriert', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'rahmt', 'gerahmt', 'framed', 'enframed', 'frame' ),
-       'sitename'                => array( '1', 'STEEDNAAM', 'PROJEKTNAME', 'SITENAME' ),
-       'ns'                      => array( '0', 'NR:', 'NS:' ),
-       'localurl'                => array( '0', 'STEEDURL:', 'LOKALE_URL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'STEEDURLE:', 'LOKALE_URL_C:', 'LOCALURLE:' ),
-       'grammar'                 => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
+       'redirect'                  => array( '0', '#wiederleiden', '#WEITERLEITUNG', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__KEENINHOLTVERTEKEN__', '__KEIN_INHALTSVERZEICHNIS__', '__KEININHALTSVERZEICHNIS__', '__NOTOC__' ),
+       'forcetoc'                  => array( '0', '__WIESINHOLTVERTEKEN__', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__INHOLTVERTEKEN__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__KEENÄNNERNLINK__', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'AKTMAAND', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'AKTMAANDNAAM', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'AKTMAANDNAAMGEN', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
+       'currentday'                => array( '1', 'AKTDAG', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
+       'currentdayname'            => array( '1', 'AKTDAGNAAM', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'AKTJOHR', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'AKTTIED', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
+       'numberofarticles'          => array( '1', 'ARTIKELTALL', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
+       'pagename'                  => array( '1', 'SIETNAAM', 'SEITENNAME', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'SIETNAAME', 'SEITENNAME_URL', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NAAMRUUM', 'NAMENSRAUM', 'NAMESPACE' ),
+       'img_thumbnail'             => array( '1', 'duum', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
+       'img_right'                 => array( '1', 'rechts', 'right' ),
+       'img_left'                  => array( '1', 'links', 'left' ),
+       'img_none'                  => array( '1', 'keen', 'ohne', 'none' ),
+       'img_center'                => array( '1', 'merrn', 'zentriert', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'rahmt', 'gerahmt', 'framed', 'enframed', 'frame' ),
+       'sitename'                  => array( '1', 'STEEDNAAM', 'PROJEKTNAME', 'SITENAME' ),
+       'ns'                        => array( '0', 'NR:', 'NS:' ),
+       'localurl'                  => array( '0', 'STEEDURL:', 'LOKALE_URL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'STEEDURLE:', 'LOKALE_URL_C:', 'LOCALURLE:' ),
+       'grammar'                   => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
 );
 
 
@@ -255,7 +256,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ännern vun anmellt Brukers nich wiesen',
 'tog-watchlisthideanons' => 'Ännern vun anonyme Brukers nich wiesen',
 'tog-watchlisthidepatrolled' => 'Nakeken Ännern op de Oppasslist nich wiesen',
-'tog-nolangconversion' => 'Variantenkonverschoon utschalten',
 'tog-ccmeonemails' => 'vun Nettbreven, de ik wegschick, mi sülvst Kopien tostüren',
 'tog-diffonly' => "Na ''{{int:showdiff}}'' nich de kumplette Sied wiesen",
 'tog-showhiddencats' => 'Wies verstekene Kategorien',
@@ -1448,9 +1448,9 @@ Dat kann nich wedder ungeschehn maakt warrn.',
 Dat du hoochladene Datein söken un ankieken kannst, gah na de [[Special:FileList|List vun hoochladene Datein]]. Dat Hoochladen un nee Hoochladen vun Datein warrt ok in dat [[Special:Log/upload|Hoochlade-Logbook]] fasthollen. Dat Wegsmieten in dat [[Special:Log/delete|Wegsmiet-Logbook]].
 
 Üm en Datei in en Sied to bruken, schriev dat hier in de Sied rin:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:datei.jpg]]</nowiki></tt>''' för de Datei in vulle Grött
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:datei.jpg|200px|thumb|left|Beschrieven]]</nowiki></tt>''' för dat Bild in en Breed vun 200 Pixels in en lütt Kassen op de linke Sied mit ''Beschrieven'' as Text ünner dat Bild
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' för en direkten Lenk op de Datei, ahn dat se wiest warrt.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:datei.jpg]]</nowiki></code>''' för de Datei in vulle Grött
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:datei.jpg|200px|thumb|left|Beschrieven]]</nowiki></code>''' för dat Bild in en Breed vun 200 Pixels in en lütt Kassen op de linke Sied mit ''Beschrieven'' as Text ünner dat Bild
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' för en direkten Lenk op de Datei, ahn dat se wiest warrt.",
 'upload-permitted' => 'Verlöövte Dateitypen: $1.',
 'upload-preferred' => 'Vörtagene Dateitypen: $1.',
 'upload-prohibited' => 'Verbadene Dateitypen: $1.',
@@ -1478,17 +1478,17 @@ Kiek bi de [[Special:NewFiles|Galerie vun ne’e Datein]] för en Översicht mit
 'large-file' => 'Datein schöölt opbest nich grötter wesen as $1. Disse Datei is $2 groot.',
 'largefileserver' => 'De Datei is grötter as de vun’n Server verlöövte Bövergrenz för de Grött.',
 'emptyfile' => 'De hoochladene Datei is leddig. De Grund kann en Tippfehler in de Dateinaam ween. Kontrolleer, of du de Datei redig hoochladen wullst.',
-'fileexists' => "En Datei mit dissen Naam existeert al, prööv '''<tt>[[:$1]]</tt>''', wenn du di nich seker büst of du dat ännern wullst.
-[[$1|thumb]]",
-'filepageexists' => "En Sied, de dat Bild beschrifft, gifft dat al as '''<tt>[[:$1]]</tt>''', dat gifft aver keen Datei mit dissen Naam. De Text, den du hier ingiffst, warrt nich op de Sied övernahmen. Du musst de Sied na dat Hoochladen noch wedder extra ännern.",
-'fileexists-extension' => "Dat gifft al en Datei mit en ähnlichen Naam: [[$2|thumb]]
-* Naam vun diene Datei: '''<tt>[[:$1]]</tt>'''
-* Naam vun de Datei, de al dor is: '''<tt>[[:$2]]</tt>'''
-Blot dat Ennen vun de Datei is bi dat Groot-/Lütt-Schrieven anners. Kiek na, wat de Datein villicht desülven sünd.",
+'fileexists' => 'En Datei mit dissen Naam existeert al, prööv <strong>[[:$1]]</strong>, wenn du di nich seker büst of du dat ännern wullst.
+[[$1|thumb]]',
+'filepageexists' => 'En Sied, de dat Bild beschrifft, gifft dat al as <strong>[[:$1]]</strong>, dat gifft aver keen Datei mit dissen Naam. De Text, den du hier ingiffst, warrt nich op de Sied övernahmen. Du musst de Sied na dat Hoochladen noch wedder extra ännern.',
+'fileexists-extension' => 'Dat gifft al en Datei mit en ähnlichen Naam: [[$2|thumb]]
+* Naam vun diene Datei: <strong>[[:$1]]</strong>
+* Naam vun de Datei, de al dor is: <strong>[[:$2]]</strong>
+Blot dat Ennen vun de Datei is bi dat Groot-/Lütt-Schrieven anners. Kiek na, wat de Datein villicht desülven sünd.',
 'fileexists-thumbnail-yes' => "De Datei schient en Bild to wesen, dat lütter maakt is ''(thumbnail)''. [[$1|thumb]]
-Kiek di de Datei '''<tt>[[:$1]]</tt>''' an.
+Kiek di de Datei <strong>[[:$1]]</strong> an.
 Wenn dat dat Bild in vulle Grött is, denn bruukst du keen extra Vörschaubild hoochladen.",
-'file-thumbnail-no' => "De Dateinaam fangt an mit '''<tt>$1</tt>'''. Dat düüdt dor op hen, dat dat en lütter maakt Bild ''(thumbnail, Duumnagel-Bild)'' is.
+'file-thumbnail-no' => "De Dateinaam fangt an mit <strong>$1</strong>. Dat düüdt dor op hen, dat dat en lütter maakt Bild ''(thumbnail, Duumnagel-Bild)'' is.
 Kiek na, wat du dat Bild nich ok in vulle Grött hest un laad dat ünner’n Originalnaam hooch oder änner den Dateinaam.",
 'fileexists-forbidden' => 'En Datei mit dissen Naam gifft dat al un kann nich överschreven warrn.
 Wenn du ehr liekers hoochladen wullt, gah trüch un laad de Datei ünner en annern Naam hooch. [[File:$1|thumb|center|$1]]',
@@ -1614,7 +1614,7 @@ De [$2 Bildsied vun dor] warrt ünnen wiest.',
 
 # MIME search
 'mimesearch' => 'MIME-Söök',
-'mimesearch-summary' => 'Disse Sied verlööft dat Filtern vun Datein na’n MIME-Typ. Du musst jümmer den Medien- un den Subtyp ingeven, to’n Bispeel: <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Disse Sied verlööft dat Filtern vun Datein na’n MIME-Typ. Du musst jümmer den Medien- un den Subtyp ingeven, to’n Bispeel: <code>image/jpeg</code>.',
 'mimetype' => 'MIME-Typ:',
 'download' => 'Dalladen',
 
@@ -1795,8 +1795,8 @@ Kiek ok bi de [[Special:WantedCategories|wünschten Kategorien]].',
 'linksearch-pat' => 'Söökmunster:',
 'linksearch-ns' => 'Naamruum:',
 'linksearch-ok' => 'Söken',
-'linksearch-text' => 'Wildcards as to’n Bispeel <tt>*.wikipedia.org</tt> köönt bruukt warrn.<br />
-Ünnerstütt Protokollen: <tt>$1</tt>',
+'linksearch-text' => 'Wildcards as to’n Bispeel <code>*.wikipedia.org</code> köönt bruukt warrn.<br />
+Ünnerstütt Protokollen: <code>$1</code>',
 'linksearch-line' => '$1 hett en Lenk vun $2',
 'linksearch-error' => 'Wildcards dröfft blot an’n Anfang vun de URL stahn.',
 
index 0f2f267..714892d 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Erwin
  * @author Erwin85
+ * @author Geitost
  * @author Jens Frank
  * @author Kaganer
  * @author Purodha
@@ -73,139 +74,139 @@ $bookstoreList = array(
 
 #!!# Translation <b>HLEERSTE:</b> is used more than once for <a href="#mw-sp-magic-lcfirst">lcfirst</a> and <a href="#mw-sp-magic-ucfirst">ucfirst</a>.
 $magicWords = array(
-       'redirect'                => array( '0', '#DEURVERWIEZING', '#DOORVERWIJZING', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__GIENONDERWARPEN__', '__GEENINHOUD__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__GIENGALLERIEJE__', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORSEERONDERWARPEN__', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ONDERWARPEN__', '__INHOUD__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__GIENBEWARKSEKSIE__', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__GIENKOPJEN__', '__GEENKOP__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'DISSEMAOND', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'DISSEMAONDNAAM', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'DISSEMAONDGEN', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'DISSEMAONDAOFK', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'DISSEDAG', 'HUIDIGEDAG', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'DISSEDAG2', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'DISSEDAGNAAM', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'DITJAOR', 'HUIDIGJAAR', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'DISSETIED', 'HUIDIGETIJD', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'DITURE', 'HUIDIGUUR', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LOKALEMAOND', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LOKALEMAOND1', 'LOKALEMAAND1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'LOKALEMAONDNAAM', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'LOKALEMAONDNAAMGEN', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'LOKALEMAONDAOFK', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'LOKALEDAG', 'PLAATSELIJKEDAG', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'LOKALEDAG2', 'PLAATSELIJKEDAG2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'LOKALEDAGNAAM', 'PLAATSELIJKEDAGNAAM', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'LOKAALJAOR', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LOKALETIED', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'LOKAALURE', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ANTALPAGINAS', 'ANTALPAGINA\'S', 'ANTALPAGINA’S', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ANTALARTIKELS', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ANTALBESTANDEN', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ANTALGEBRUKERS', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'ANTALAKTIEVEGEBRUKERS', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'ANTALBEWARKINGEN', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'ANTALKERENBEKEKEN', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'PAGINANAAM', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NAAMRUUMTE', 'NAAMRUIMTE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NAAMRUUMTEE', 'NAAMRUIMTEE', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'OVERLEGRUUMTE', 'OVERLEGRUIMTE', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'OVERLEGRUUMTEE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ONDERWARPRUUMTE', 'ARTIKELRUUMTE', 'ONDERWERPRUIMTE', 'ARTIKELRUIMTE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ONDERWARPRUUMTEE', 'ARTIKELRUUMTEE', 'ONDERWERPRUIMTEE', 'ARTIKELRUIMTEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'HELEPAGINANAAM', 'VOLLEDIGEPAGINANAAM', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'HELEPAGINANAAME', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'BAOSISPAGINANAAM', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'BAOSISPAGINANAAME', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'OVERLEGPAGINANAAME', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'ONDERWARPPAGINANAAM', 'ARTIKELPAGINANAAM', 'ONDERWERPPAGINANAAM', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'ONDERWARPPAGINANAAME', 'ARTIKELPAGINANAAME', 'ONDERWERPPAGINANAAME', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'BERICHT:', 'MSG:' ),
-       'subst'                   => array( '0', 'VERVANG:', 'VERV:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'BERICHTNW', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'miniatuur', 'duumnegel', 'doemnaegel', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniatuur=$1', 'duumnegel=$1', 'doemnaegel=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'rechts', 'right' ),
-       'img_left'                => array( '1', 'links', 'left' ),
-       'img_none'                => array( '1', 'gien', 'geen', 'none' ),
-       'img_center'              => array( '1', 'esentreerd', 'gecentreerd', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'umraand', 'omkaderd', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'kaoderloos', 'kaderloos', 'frameless' ),
-       'img_page'                => array( '1', 'pagina=$1', 'pagina_$1', 'pagina $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'rechtop', 'rechtop=$1', 'rechtop$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'raand', 'rand', 'border' ),
-       'img_baseline'            => array( '1', 'grondliende', 'grondlijn', 'baseline' ),
-       'img_top'                 => array( '1', 'boven', 'top' ),
-       'img_text_top'            => array( '1', 'tekste-boven', 'tekst-boven', 'text-top' ),
-       'img_middle'              => array( '1', 'midden', 'middle' ),
-       'img_bottom'              => array( '1', 'benejen', 'beneden', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'tekste-benejen', 'tekst-beneden', 'text-bottom' ),
-       'img_link'                => array( '1', 'verwiezing=$', 'verwijzing=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'WEBSTEENAAM', 'SITENAAM', 'SITENAME' ),
-       'ns'                      => array( '0', 'NR:', 'NS:' ),
-       'localurl'                => array( '0', 'LOKALEURL', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
-       'servername'              => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SKRIPTPAD', 'SCRIPTPAD', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'STIELPAD', 'STIJLPAD', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMMATIKA:', 'GRAMMATICA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GESLACHTE:', 'GESLACHT:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__GIENTITELKONVERSIE__', '__GIENTC__', '__GEENTITELCONVERSIE__', '__GEENTC__', '__GEENPAGINANAAMCONVERSIE__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__GIENINHOUDKONVERSIE__', '__GIENIC__', '__GEENINHOUDCONVERSIE__', '__GEENIC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'DISSEWEKE', 'HUIDIGEWEEK', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'DISSEDVDW', 'HUIDIGEDVDW', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'LOKALEWEKE', 'PLAATSELIJKEWEEK', 'LOKALEWEEK', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'LOKALEDVDW', 'PLAATSELIJKEDVDW', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'REVISIEID', 'REVISIE-ID', 'VERSIEID', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'REVISIEDAG', 'VERSIEDAG', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'REVISIEDAG2', 'VERSIEDAG2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'REVISIEMAOND', 'VERSIEMAAND', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'REVISIEJAOR', 'VERSIEJAAR', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'REVISIETIEDSTEMPEL', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'VERSIEGEBRUKER', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'MEERVOUD:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'HELEURL', 'VOLLEDIGEURL', 'VOLLEDIGEURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'HELEURLE', 'VOLLEDIGEURLE', 'VOLLEDIGEURLE:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'KLEERSTE:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'KL:', 'LC:' ),
-       'uc'                      => array( '0', 'HL:', 'UC:' ),
-       'raw'                     => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'WEERGEGEVENTITEL', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__NIEJESECTIEVERWIEZING__', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'DISSEVERSIE', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'URLKODEREN', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ANKERKODEREN', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'DISSETIEDSTEMPEL', 'HUIDIGETIJDSTEMPEL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'LOKALETIEDSTEMPEL', 'PLAATSELIJKETIJDSTEMPEL', 'LOKALETIJDSTEMPEL', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'RICHTINGMARKERING', 'RICHTINGSMARKERING', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#TAAL:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'INHOUDSTAAL', 'INHOUDTAAL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PAGINASINNAAMRUUMTE', 'PAGINA’SINNAAMRUUMTE', 'PAGINA\'SINNAAMRUUMTE', 'PAGINASINNAAMRUIMTE', 'PAGINA’SINNAAMRUIMTE', 'PAGINA\'SINNAAMRUIMTE', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ANTALBEHEERDERS', 'AANTALBEHEERDERS', 'AANTALADMINS', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMATTEERNUM', 'NUMFORMATTEREN', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'LINKSOPVULLEN', 'PADLEFT' ),
-       'padright'                => array( '0', 'RECHTSOPVULLEN', 'PADRIGHT' ),
-       'special'                 => array( '0', 'spesiaal', 'speciaal', 'special' ),
-       'defaultsort'             => array( '1', 'STANDARDSORTERING:', 'STANDAARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'BESTAANDSPAD:', 'BESTANDSPAD:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'etiket', 'label', 'tag' ),
-       'hiddencat'               => array( '1', '__VERBÖRGENKAT__', '__VERBORGENCAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAGINASINKATEGORIE', 'PAGINASINKAT', 'PAGINASINCATEGORIE', 'PAGINASINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'PAGINAGROOTTE', 'PAGESIZE' ),
-       'noindex'                 => array( '1', '__GIENINDEX__', '__GEENINDEX__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'ANTALINGROEP', 'AANTALINGROEP', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__STAOTIESEDEURVERWIEZING__', '__STATISCHEDOORVERWIJZING__', '__STATISCHEREDIRECT__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'BEVEILIGINGSNIVO', 'BEVEILIGINGSNIVEAU', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'daotumopmaak', 'datumopmaak', 'formatdate', 'dateformat' ),
-       'url_query'               => array( '0', 'ZEUKOPDRACHTE', 'ZOEKOPDRACHT', 'QUERY' ),
+       'redirect'                  => array( '0', '#DEURVERWIEZING', '#DOORVERWIJZING', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__GIENONDERWARPEN__', '__GEENINHOUD__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__GIENGALLERIEJE__', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORSEERONDERWARPEN__', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ONDERWARPEN__', '__INHOUD__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__GIENBEWARKSEKSIE__', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__GIENKOPJEN__', '__GEENKOP__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'DISSEMAOND', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'DISSEMAONDNAAM', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'DISSEMAONDGEN', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'DISSEMAONDAOFK', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'DISSEDAG', 'HUIDIGEDAG', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'DISSEDAG2', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'DISSEDAGNAAM', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'DITJAOR', 'HUIDIGJAAR', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'DISSETIED', 'HUIDIGETIJD', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'DITURE', 'HUIDIGUUR', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LOKALEMAOND', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LOKALEMAOND1', 'LOKALEMAAND1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'LOKALEMAONDNAAM', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'LOKALEMAONDNAAMGEN', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'LOKALEMAONDAOFK', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'LOKALEDAG', 'PLAATSELIJKEDAG', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKALEDAG2', 'PLAATSELIJKEDAG2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'LOKALEDAGNAAM', 'PLAATSELIJKEDAGNAAM', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'LOKAALJAOR', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LOKALETIED', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'LOKAALURE', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ANTALPAGINAS', 'ANTALPAGINA\'S', 'ANTALPAGINA’S', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ANTALARTIKELS', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ANTALBESTANDEN', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ANTALGEBRUKERS', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'ANTALAKTIEVEGEBRUKERS', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'ANTALBEWARKINGEN', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'ANTALKERENBEKEKEN', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'PAGINANAAM', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NAAMRUUMTE', 'NAAMRUIMTE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NAAMRUUMTEE', 'NAAMRUIMTEE', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'OVERLEGRUUMTE', 'OVERLEGRUIMTE', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'OVERLEGRUUMTEE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ONDERWARPRUUMTE', 'ARTIKELRUUMTE', 'ONDERWERPRUIMTE', 'ARTIKELRUIMTE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ONDERWARPRUUMTEE', 'ARTIKELRUUMTEE', 'ONDERWERPRUIMTEE', 'ARTIKELRUIMTEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'HELEPAGINANAAM', 'VOLLEDIGEPAGINANAAM', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'HELEPAGINANAAME', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'BAOSISPAGINANAAM', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'BAOSISPAGINANAAME', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'OVERLEGPAGINANAAME', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'ONDERWARPPAGINANAAM', 'ARTIKELPAGINANAAM', 'ONDERWERPPAGINANAAM', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'ONDERWARPPAGINANAAME', 'ARTIKELPAGINANAAME', 'ONDERWERPPAGINANAAME', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'BERICHT:', 'MSG:' ),
+       'subst'                     => array( '0', 'VERVANG:', 'VERV:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'BERICHTNW', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'miniatuur', 'duumnegel', 'doemnaegel', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniatuur=$1', 'duumnegel=$1', 'doemnaegel=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'rechts', 'right' ),
+       'img_left'                  => array( '1', 'links', 'left' ),
+       'img_none'                  => array( '1', 'gien', 'geen', 'none' ),
+       'img_center'                => array( '1', 'esentreerd', 'gecentreerd', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'umraand', 'omkaderd', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'kaoderloos', 'kaderloos', 'frameless' ),
+       'img_page'                  => array( '1', 'pagina=$1', 'pagina_$1', 'pagina $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'rechtop', 'rechtop=$1', 'rechtop$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'raand', 'rand', 'border' ),
+       'img_baseline'              => array( '1', 'grondliende', 'grondlijn', 'baseline' ),
+       'img_top'                   => array( '1', 'boven', 'top' ),
+       'img_text_top'              => array( '1', 'tekste-boven', 'tekst-boven', 'text-top' ),
+       'img_middle'                => array( '1', 'midden', 'middle' ),
+       'img_bottom'                => array( '1', 'benejen', 'beneden', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'tekste-benejen', 'tekst-beneden', 'text-bottom' ),
+       'img_link'                  => array( '1', 'verwiezing=$', 'verwijzing=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'WEBSTEENAAM', 'SITENAAM', 'SITENAME' ),
+       'ns'                        => array( '0', 'NR:', 'NS:' ),
+       'localurl'                  => array( '0', 'LOKALEURL', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
+       'servername'                => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SKRIPTPAD', 'SCRIPTPAD', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'STIELPAD', 'STIJLPAD', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMMATIKA:', 'GRAMMATICA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GESLACHTE:', 'GESLACHT:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__GIENTITELKONVERSIE__', '__GIENTC__', '__GEENTITELCONVERSIE__', '__GEENTC__', '__GEENPAGINANAAMCONVERSIE__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__GIENINHOUDKONVERSIE__', '__GIENIC__', '__GEENINHOUDCONVERSIE__', '__GEENIC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'DISSEWEKE', 'HUIDIGEWEEK', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'DISSEDVDW', 'HUIDIGEDVDW', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'LOKALEWEKE', 'PLAATSELIJKEWEEK', 'LOKALEWEEK', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'LOKALEDVDW', 'PLAATSELIJKEDVDW', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'REVISIEID', 'REVISIE-ID', 'VERSIEID', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'REVISIEDAG', 'VERSIEDAG', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'REVISIEDAG2', 'VERSIEDAG2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'REVISIEMAOND', 'VERSIEMAAND', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'REVISIEJAOR', 'VERSIEJAAR', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'REVISIETIEDSTEMPEL', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'VERSIEGEBRUKER', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'MEERVOUD:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'HELEURL', 'VOLLEDIGEURL', 'VOLLEDIGEURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'HELEURLE', 'VOLLEDIGEURLE', 'VOLLEDIGEURLE:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'KLEERSTE:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'KL:', 'LC:' ),
+       'uc'                        => array( '0', 'HL:', 'UC:' ),
+       'raw'                       => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'WEERGEGEVENTITEL', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__NIEJESECTIEVERWIEZING__', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'DISSEVERSIE', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'URLKODEREN', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ANKERKODEREN', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'DISSETIEDSTEMPEL', 'HUIDIGETIJDSTEMPEL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'LOKALETIEDSTEMPEL', 'PLAATSELIJKETIJDSTEMPEL', 'LOKALETIJDSTEMPEL', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'RICHTINGMARKERING', 'RICHTINGSMARKERING', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#TAAL:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'INHOUDSTAAL', 'INHOUDTAAL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PAGINASINNAAMRUUMTE', 'PAGINA’SINNAAMRUUMTE', 'PAGINA\'SINNAAMRUUMTE', 'PAGINASINNAAMRUIMTE', 'PAGINA’SINNAAMRUIMTE', 'PAGINA\'SINNAAMRUIMTE', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ANTALBEHEERDERS', 'AANTALBEHEERDERS', 'AANTALADMINS', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMATTEERNUM', 'NUMFORMATTEREN', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'LINKSOPVULLEN', 'PADLEFT' ),
+       'padright'                  => array( '0', 'RECHTSOPVULLEN', 'PADRIGHT' ),
+       'special'                   => array( '0', 'spesiaal', 'speciaal', 'special' ),
+       'defaultsort'               => array( '1', 'STANDARDSORTERING:', 'STANDAARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'BESTAANDSPAD:', 'BESTANDSPAD:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'etiket', 'label', 'tag' ),
+       'hiddencat'                 => array( '1', '__VERBÖRGENKAT__', '__VERBORGENCAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAGINASINKATEGORIE', 'PAGINASINKAT', 'PAGINASINCATEGORIE', 'PAGINASINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'PAGINAGROOTTE', 'PAGESIZE' ),
+       'noindex'                   => array( '1', '__GIENINDEX__', '__GEENINDEX__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'ANTALINGROEP', 'AANTALINGROEP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__STAOTIESEDEURVERWIEZING__', '__STATISCHEDOORVERWIJZING__', '__STATISCHEREDIRECT__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'BEVEILIGINGSNIVO', 'BEVEILIGINGSNIVEAU', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'daotumopmaak', 'datumopmaak', 'formatdate', 'dateformat' ),
+       'url_query'                 => array( '0', 'ZEUKOPDRACHTE', 'ZOEKOPDRACHT', 'QUERY' ),
 );
 
 $specialPageAliases = array(
@@ -312,35 +313,35 @@ $messages = array(
 'tog-justify' => "Alinea's uutvullen",
 'tog-hideminor' => 'Kleine wiezigingen verbargen in leste wiezigingen',
 'tog-hidepatrolled' => 'Wiezigingen die emarkeerd bin verbargen in leste wiezigingen',
-'tog-newpageshidepatrolled' => "Pagina's die emarkeerd bin, verbargen in de lieste mit nieje artikels",
+'tog-newpageshidepatrolled' => 'Ziejen die emarkeerd bin, verbargen in de lieste mit nieje artikels',
 'tog-extendwatchlist' => 'Volglieste uutbreien, zodat alle wiezigingen zichtbaor bin, en niet allinnig de leste wieziging',
-'tog-usenewrc' => "Gebruuk de pagina uutebreiden leste wiezigingen (hierveur he'j JavaScript neudig)",
+'tog-usenewrc' => 'Groepeer wiezigingen per zied in "Leste wiezigingen" en "Mien volglieste" (hierveur he\'j JavaScript neudig)',
 'tog-numberheadings' => 'Koppen vanzelf nummeren',
 'tog-showtoolbar' => 'Laot de warkbalke zien',
 'tog-editondblclick' => 'Mit dubbelklik bewarken (JavaScript)',
 'tog-editsection' => 'Mit bewarkgedeeltes',
 'tog-editsectiononrightclick' => 'Bewarkgedeelte mit rechtermuusknoppe bewarken (JavaScript)',
-'tog-showtoc' => 'Samenvatting van de onderwarpen laoten zien (mit meer as dree onderwarpen)',
+'tog-showtoc' => 'Samenvatting laoten zien van de zaken die an bod koemen (mit meer as dree onderwarpen)',
 'tog-rememberpassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
-'tog-watchcreations' => "Pagina's die'k anmake op mien volglieste zetten",
-'tog-watchdefault' => "Pagina's die'k wiezige op mien volglieste zetten",
-'tog-watchmoves' => "Pagina's die'k herneume op mien volglieste zetten",
-'tog-watchdeletion' => "Pagina's die'k vortdo op mien volglieste zetten",
+'tog-watchcreations' => "Spul wa'k anmake op mien volglieste zetten",
+'tog-watchdefault' => "Spul wa'k bewarke op mien volglieste zetten",
+'tog-watchmoves' => "Spul wa'k herneume op mien volglieste zetten",
+'tog-watchdeletion' => "Spul wa'k vortdo op mien volglieste zetten",
 'tog-minordefault' => "Markeer alle veraanderingen as 'kleine wieziging'",
-'tog-previewontop' => 'De naokiekpagina boven t bewarkingsveld zetten',
+'tog-previewontop' => 'De naokiekzied boven t bewarkingsveld zetten',
 'tog-previewonfirst' => 'Naokieken bie eerste wieziging',
 'tog-nocache' => 'De tussenopslag van de webkieker uutzetten',
-'tog-enotifwatchlistpages' => 'Stuur mien n berichjen over paginawiezigingen.',
-'tog-enotifusertalkpages' => 'Stuur mien n berichjen as mien overlegpagina ewiezigd is.',
-'tog-enotifminoredits' => 'Stuur mien oek n berichjen bie kleine bewarkingen',
+'tog-enotifwatchlistpages' => 'Stuur mien n berichjen over zied- of bestaandswiezigingen uut mien volglieste.',
+'tog-enotifusertalkpages' => 'Stuur mien n berichjen as mien overlegzied ewiezigd is.',
+'tog-enotifminoredits' => 'Stuur mien oek n berichjen bie kleine bewarkingen van ziejen en bestaanden',
 'tog-enotifrevealaddr' => 'Mien netpostadres laoten zien in netposttiejigen',
-'tog-shownumberswatching' => 't Antal gebrukers bekieken die disse pagina volgt',
+'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" (mö\'j JavaScript veur hebben - experimenteel)',
+'tog-uselivepreview' => 'Gebruuk "rechtstreeks naokieken" (mu\'j JavaScript veur hebben - experimenteel)',
 'tog-forceeditsummary' => 'Geef n melding bie n lege samenvatting',
 'tog-watchlisthideown' => 'Verbarg mien eigen bewarkingen',
 'tog-watchlisthidebots' => 'Verbarg botgebrukers',
@@ -348,11 +349,10 @@ $messages = array(
 'tog-watchlisthideliu' => 'Bewarkingen van an-emelde gebrukers op mien volglieste verbargen',
 'tog-watchlisthideanons' => 'Bewarkingen van anonieme gebrukers op mien volglieste verbargen',
 'tog-watchlisthidepatrolled' => 'Wiezigingen die emarkeerd bin op volglieste verbargen',
-'tog-nolangconversion' => 't Ummezetten van variaanten uutschakelen',
 'tog-ccmeonemails' => 'Stuur mien kopieën van berichten an aandere gebrukers',
-'tog-diffonly' => 'Laot de pagina-inhoud niet onder de an-egeven wiezigingen zien.',
+'tog-diffonly' => 'Laot de inhoud van ziejen niet onder de an-egeven wiezigingen zien.',
 'tog-showhiddencats' => 'Laot verbörgen kategorieën zien',
-'tog-noconvertlink' => 'Paginanaamkonversie uutschakelen',
+'tog-noconvertlink' => 'Ziednaamkonversie uutschakelen',
 'tog-norollbackdiff' => 'Wiezigingen vortlaoten nao t weerummedreien',
 
 'underline-always' => 'Altied',
@@ -428,23 +428,23 @@ $messages = array(
 'hidden-category-category' => 'Verbörgen kategorieën',
 'category-subcat-count' => '{{PLURAL:$2|Disse kategorie hef de volgende subkategorie.|Disse kategorie hef de volgende {{PLURAL:$1|subkategorie|$1 subkategorieën}}, van in totaal $2.}}',
 'category-subcat-count-limited' => 'Disse kategorie hef de volgende {{PLURAL:$1|subkategorie|$1 subkategorieën}}.',
-'category-article-count' => "{{PLURAL:$2|In disse kategorie steet allinnig de volgende pagina.|De volgende {{PLURAL:$1|pagina steet|$1 pagina's staon}} in disse kategorie, van in totaal $2.}}",
-'category-article-count-limited' => "In disse kategorie {{PLURAL:$1|steet de volgende pagina|staon de volgende $1 pagina's}}.",
+'category-article-count' => '{{PLURAL:$2|In disse kategorie steet allinnig de volgende zied.|De volgende {{PLURAL:$1|zied steet|$1 ziejen staon}} in disse kategorie, van in totaal $2.}}',
+'category-article-count-limited' => 'In disse kategorie {{PLURAL:$1|steet de volgende zied|staon de volgende $1 ziejen}}.',
 'category-file-count' => 'In disse kategorie {{PLURAL:$2|steet t volgende bestaand|staon de volgende $1 bestaanden, van in totaal $2}}.',
 'category-file-count-limited' => 'In disse kategorie {{PLURAL:$1|steet t volgende bestaand|staon de volgende $1 bestaanden}}.',
 'listingcontinuesabbrev' => '(vervolg)',
-'index-category' => "Pagina's die indexeerd bin",
-'noindex-category' => "Pagina's die niet indexeerd bin",
-'broken-file-category' => "Pagina's mit verkeerde bestaandsverwiezingen",
+'index-category' => 'Spul wat al indexeerd is',
+'noindex-category' => 'Spul wat nog niet indexeerd is',
+'broken-file-category' => 'Ziejen mit verkeerde bestaandsverwiezingen',
 
 'about' => 'Informasie',
 'article' => 'Artikel',
 'newwindow' => '(niej vienster)',
 'cancel' => 'Aofbreken',
 'moredotdotdot' => 'Meer...',
-'mypage' => 'Mien gebrukerspagina',
+'mypage' => 'Mien gebrukerszied',
 'mytalk' => 'Mien overleg',
-'anontalk' => 'Overlegpagina veur dit IP-adres',
+'anontalk' => 'Overlegzied veur dit IP-adres',
 'navigation' => 'Navigasie',
 'and' => '&#32;en',
 
@@ -452,10 +452,10 @@ $messages = array(
 'qbfind' => 'Zeuken',
 'qbbrowse' => 'Blaojen',
 'qbedit' => 'Bewark',
-'qbpageoptions' => 'Pagina-opsies',
-'qbpageinfo' => 'Pagina-informasie',
+'qbpageoptions' => 'Disse zied',
+'qbpageinfo' => 'Ziedinformasie',
 'qbmyoptions' => 'Veurkeuren',
-'qbspecialpages' => "Spesiale pagina's",
+'qbspecialpages' => 'Spesiale ziejen',
 'faq' => 'Vragen die vake esteld wörden',
 'faqpage' => 'Project:Vragen die vake esteld wörden',
 
@@ -493,47 +493,47 @@ $messages = array(
 'view' => 'Lezen',
 'edit' => 'Bewarken',
 'create' => 'Anmaken',
-'editthispage' => 'Pagina bewarken',
-'create-this-page' => 'Disse pagina anmaken',
+'editthispage' => 'Disse zied bewarken',
+'create-this-page' => 'Disse zied anmaken',
 'delete' => 'Vortdoon',
-'deletethispage' => 'Disse pagina vortdoon',
+'deletethispage' => 'Disse zied vortdoon',
 'undelete_short' => '$1 {{PLURAL:$1|versie|versies}} weerummeplaotsen',
 'viewdeleted_short' => '{{PLURAL:$1|Eén versie die vortedaon is|$1 versies die vortedaon bin}} bekieken',
 'protect' => 'Beveiligen',
 'protect_change' => 'wiezigen',
 'protectthispage' => 'Beveiligen',
 'unprotect' => 'Beveiliging wiezigen',
-'unprotectthispage' => 'Beveiliging van disse pagina wiezigen',
-'newpage' => 'Nieje pagina',
-'talkpage' => 'Overlegpagina',
+'unprotectthispage' => 'Beveiliging van disse zied wiezigen',
+'newpage' => 'Nieje zied',
+'talkpage' => 'Overlegzied',
 'talkpagelinktext' => 'Overleg',
-'specialpage' => 'Spesiale pagina',
+'specialpage' => 'Spesiale zied',
 'personaltools' => 'Persoonlike instellingen',
 'postcomment' => 'Niej onderwarp',
 'articlepage' => 'Artikel',
 'talk' => 'Overleg',
-'views' => 'Aspekten/aksies',
+'views' => 'Weergaven',
 'toolbox' => 'Hulpmiddels',
-'userpage' => 'gebrukerspagina',
-'projectpage' => 'Bekiek projektpagina',
-'imagepage' => 'Bestaandspagina bekieken',
+'userpage' => 'gebrukerszied',
+'projectpage' => 'Bekiek projektzied',
+'imagepage' => 'Bestaandszied bekieken',
 'mediawikipage' => 'Tiejige bekieken',
 'templatepage' => 'Mal bekieken',
-'viewhelppage' => 'Hulppagina bekieken',
-'categorypage' => 'Kategoriepagina bekieken',
-'viewtalkpage' => 'Bekiek overlegpagina',
+'viewhelppage' => 'Hulpzied bekieken',
+'categorypage' => 'Kategoriezied bekieken',
+'viewtalkpage' => 'Bekiek overlegzied',
 'otherlanguages' => 'Aandere talen',
 'redirectedfrom' => '(deurestuurd vanaof "$1")',
-'redirectpagesub' => 'Deurstuurpagina',
-'lastmodifiedat' => 'Disse pagina is t lest ewiezigd op $1 um $2.',
-'viewcount' => 'Disse pagina is $1 {{PLURAL:$1|keer|keer}} bekeken.',
-'protectedpage' => 'Beveiligden pagina',
+'redirectpagesub' => 'Deurstuurzied',
+'lastmodifiedat' => 'Disse zied is t lest ewiezigd op $1 um $2.',
+'viewcount' => 'Disse zied is $1 {{PLURAL:$1|keer|keer}} bekeken.',
+'protectedpage' => 'Beveiligden zied',
 'jumpto' => 'Gao naor:',
 'jumptonavigation' => 'navigasie',
 'jumptosearch' => 'zeuk',
 'view-pool-error' => "De servers bin noen overbelast.
-Te veule meensen proberen disse pagina te bekieken.
-Wacht even veurda'j opniej toegang proberen te kriegen tot disse pagina.
+Te veule meensen proberen disse zied te bekieken.
+Wacht even veurda'j opniej toegang proberen te kriegen tot disse zied.
 
 $1",
 'pool-timeout' => 'Wachttied tiejens t wachten op vergrendeling',
@@ -565,9 +565,9 @@ $1",
 'badaccess-groups' => 'Disse aksie kan allinnig uutevoerd wörden deur gebrukers uut {{PLURAL:$2|de groep|één van de groepen}}: $1.',
 
 'versionrequired' => 'Versie $1 van MediaWiki is neudig',
-'versionrequiredtext' => 'Versie $1 van MediaWiki is neudig um disse pagina te gebruken. Zie [[Special:Version|Versie]].',
+'versionrequiredtext' => 'Versie $1 van MediaWiki is neudig um disse zied te gebruken. Zie [[Special:Version|Versie]].',
 
-'ok' => 'Oké',
+'ok' => 'Best',
 'retrievedfrom' => 'Van "$1"',
 'youhavenewmessages' => 'Je hebben $1 ($2).',
 'newmessageslink' => 'nieje berichten',
@@ -579,7 +579,7 @@ $1",
 'editlink' => 'bewark',
 'viewsourcelink' => 'brontekste bekieken',
 'editsectionhint' => 'Bewarkingsveld: $1',
-'toc' => 'Onderwarpen',
+'toc' => 'Kömp an bod',
 'showtoc' => 'Bekieken',
 'hidetoc' => 'Verbarg',
 'collapsible-collapse' => 'Inklappen',
@@ -594,7 +594,7 @@ $1",
 'site-atom-feed' => '$1 Atom-voer',
 'page-rss-feed' => '"$1" RSS-voer',
 'page-atom-feed' => '"$1" Atom-voer',
-'red-link-title' => '$1 (pagina besteet nog niet)',
+'red-link-title' => '$1 (zied besteet nog niet)',
 'sort-descending' => 'Aoflopend sorteren',
 'sort-ascending' => 'Oplopend sorteren',
 
@@ -602,8 +602,8 @@ $1",
 'nstab-main' => 'Artikel',
 'nstab-user' => 'Gebruker',
 'nstab-media' => 'Media',
-'nstab-special' => 'Spesiale pagina',
-'nstab-project' => 'Projektpagina',
+'nstab-special' => 'Spesiale zied',
+'nstab-project' => 'Projektzied',
 'nstab-image' => 'Bestaand',
 'nstab-mediawiki' => 'Tiejige',
 'nstab-template' => 'Mal',
@@ -615,10 +615,10 @@ $1",
 'nosuchactiontext' => 'De opdrachte in t webadres in ongeldig.
 Je hebben t webadres misschien verkeerd in-etikt of de verkeerde verwiezing evolgd.
 Dit kan oek dujen op n fout in de programmatuur van {{SITENAME}}.',
-'nosuchspecialpage' => 'Der besteet gien spesiale pagina mit disse naam',
-'nospecialpagetext' => "<strong>Disse spesiale pagina wörden niet herkend deur de programmatuur.</strong>
+'nosuchspecialpage' => 'Der besteet gien spesiale zied mit disse naam',
+'nospecialpagetext' => "<strong>Disse spesiale zied wörden niet herkend deur de programmatuur.</strong>
 
-n Lieste mit bestaonde spesiale pagina ku'j vienen op [[Special:SpecialPages|{{int:specialpages}}]].",
+n Lieste mit bestaonde spesiale ziejen ku'j vienen op [[Special:SpecialPages|{{int:specialpages}}]].",
 
 # General errors
 'error' => 'Foutmelding',
@@ -637,15 +637,15 @@ t Leste veurzeuk an de databanke was:
 vanuut de funksie "$2"
 De databanke gaf de volgende foutmelding: "$3: $4"',
 'laggedslavemode' => '<strong>Waorschuwing:</strong> t is meugelik dat leste wiezigingen in de tekste van dit artikel nog niet verwarkt bin.',
-'readonly' => 'De databanke is beveilig',
-'enterlockreason' => 'Waorumme en veur hoe lange is e eblokkeerd?',
+'readonly' => 'De databanke is beveiligd',
+'enterlockreason' => 'Waorumme en veur hoe lange is t eblokkeerd?',
 'readonlytext' => "De databanke van {{SITENAME}} is noen esleuten veur nieje bewarkingen en wiezigingen, warschienlik veur bestaandsonderhoud. De verantwoordelike systeembeheerder gaf hierveur de volgende reden op: '''$1'''",
-'missing-article' => 'In de databanke steet gien tekste veur de pagina "$1" die der wel in zol mutten staon ($2).
+'missing-article' => 'In de databanke steet gien tekste veur de zied "$1" die der wel in zol mutten staon ($2).
 
-Dit kan koemen deurda\'j n ouwe verwiezing naor t verschil tussen twee versies van n pagina volgen of n versie opvragen die vortedaon is.
+Dit kan koemen deurda\'j n ouwe verwiezing naor t verschil tussen twee versies van n zied volgen of n versie opvragen die vortedaon is.
 
 As dat niet zo is, dan he\'j misschien n fout in de programmatuur evunnen.
-Meld t dan effen bie n [[Special:ListUsers/sysop|systeembeheerder]] van {{SITENAME}} en vermeld derbie de internetverwiezing van disse pagina.',
+Meld t dan effen bie n [[Special:ListUsers/sysop|systeembeheerder]] van {{SITENAME}} en vermeld derbie de internetverwiezing van disse zied.',
 'missingarticle-rev' => '(versienummer: $1)',
 'missingarticle-diff' => '(Wieziging: $1, $2)',
 'readonly_lag' => 'De databanke is automaties beveilig, zodat de ondergeschikten servers zich kunnen synchroniseren mit de sentrale server.',
@@ -661,39 +661,45 @@ Meld t dan effen bie n [[Special:ListUsers/sysop|systeembeheerder]] van {{SITENA
 'fileexistserror' => 'Kon niet schrieven naor t bestaand "$1": t bestaand besteet al',
 'unexpected' => 'Onverwachten weerde: "$1"="$2".',
 'formerror' => 'Fout: kon formulier niet versturen',
-'badarticleerror' => 'Disse haandeling kan op disse pagina niet uutevoerd wörden.',
-'cannotdelete' => 'De pagina of t bestaand "$1" kon niet vortedaon wörden.
+'badarticleerror' => 'Disse haandeling kan op disse zied niet uutevoerd wörden.',
+'cannotdelete' => 'De zied of t bestaand "$1" kon niet vortedaon wörden.
 t Kan ween dat n aander t al vortedaon hef.',
-'cannotdelete-title' => 'Pagina "$1" kan niet vortedaon wörden',
+'cannotdelete-title' => 'Zied "$1" kan niet vortedaon wörden',
+'delete-hook-aborted' => 't Vortdoon wörden in t wiere eschopt deur n MediaWiki-programmatuuruutbreiding.
+Der is gien veerdere informasie beschikbaor.',
 'badtitle' => 'Ongeldige naam',
-'badtitletext' => 'De naam van de op-evreugen pagina is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.',
-'perfcached' => 'Disse gegevens koemen uut t tussengeheugen en bin misschien niet aktueel. Der {{PLURAL:$1|is maximaal een resultaot|bin maximaal $1 resultaoten}} beschikbaor in t tussengeheugen.',
-'perfcachedts' => 'Disse gegevens koemen uut t tussengeheugen die veur t lest bie-ewörken is op $2 um $3. Der {{PLURAL:$4|is maximaal een resultaot|bin maximaal $4 resultaoten}} beschikbaor in t tussengeheugen.',
-'querypage-no-updates' => "'''Disse pagina wörden niet meer bie-ewörken.'''",
+'badtitletext' => 'De naam van de op-evreugen zied is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.',
+'perfcached' => 'Disse gegevens koemen uut t tussengeheugen en bin misschien niet aktueel. Der {{PLURAL:$1|is hooguut een resultaot|bin hooguut $1 resultaoten}} beschikbaor in t tussengeheugen.',
+'perfcachedts' => 'Disse gegevens koemen uut t tussengeheugen die veur t lest bie-ewörken is op $2 um $3. Der {{PLURAL:$4|is hooguut een resultaot|bin hooguut $4 resultaoten}} beschikbaor in t tussengeheugen.',
+'querypage-no-updates' => "'''Disse zied wörden niet meer bie-ewörken.'''",
 'wrong_wfQuery_params' => 'Parameters veur wfQuery() waren verkeerd<br />
 Funksie: $1<br />
 Zeukopdrachte: $2',
 'viewsource' => 'Brontekste bekieken',
 'viewsource-title' => 'Bron bekieken van $1',
-'actionthrottled' => 'Haandeling tegen-ehuilen',
+'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 pagina is beveiligd um bewarkingen te veurkoemen.',
-'viewsourcetext' => 'Je kunnen de brontekste van disse pagina bewarken en bekieken:',
-'viewyourtext' => "Je kunnen '''joew bewarkingen''' an de brontekste van disse pagina bekieken en kopiëren:",
-'protectedinterface' => 'Op disse pagina steet n tekste die gebruukt wörden veur systeemteksten van de wiki. Allinnig beheerders kunnen disse pagina bewarken.',
-'editinginterface' => "'''Waorschuwing:''' je bewarken n pagina die gebruukt wörden deur de programmatuur. Wa'j hier wiezigen, is van invleud op de hele wiki. Overweeg veur vertalingen um [//translatewiki.net/wiki/Main_Page?setlang=nds-nl translatewiki.net] te gebruken, t vertalingsprojekt veur MediaWiki.",
+'protectedpagetext' => 'Disse zied is beveiligd um bewarkingen te veurkoemen.',
+'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 n tekste die gebruukt wörden veur systeemteksten van de wiki. Allinnig beheerders kunnen disse zied bewarken.',
+'editinginterface' => "'''Waorschuwing:''' je bewarken n zied die gebruukt wörden deur de programmatuur. Wa'j hier wiezigen, is van invleud op de hele wiki. Overweeg veur vertalingen um [//translatewiki.net/wiki/Main_Page?setlang=nds-nl translatewiki.net] te gebruken, t vertalingsprojekt veur MediaWiki.",
 'sqlhidden' => '(SQL-zeukopdrachte verbörgen)',
-'cascadeprotected' => 'Disse pagina is beveiligd umdat t veurkump in de volgende {{PLURAL:$1|pagina|pagina\'s}}, die beveiligd {{PLURAL:$1|is|bin}} mit de "kaskade"-opsie:
+'cascadeprotected' => 'Disse zied is beveiligd umdat t veurkömp in de volgende {{PLURAL:$1|zied|ziejen}}, die beveiligd {{PLURAL:$1|is|bin}} mit de "kaskade"-opsie:
 $2',
-'namespaceprotected' => "Je maggen gien pagina's in de '''$1'''-naamruumte bewarken.",
-'customcssprotected' => 'Je kunnen disse CSS-pagina niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.',
-'customjsprotected' => 'Je kunnen disse JavaScript-pagina niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.',
-'ns-specialprotected' => "Spesiale pagina's kunnen niet bewarkt wörden.",
-'titleprotected' => "t Anmaken van disse pagina is beveiligd deur [[User:$1|$1]].
+'namespaceprotected' => "Je maggen gien ziejen in de '''$1'''-naamruumte bewarken.",
+'customcssprotected' => 'Je kunnen disse CSS-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.',
+'customjsprotected' => 'Je kunnen disse JavaScript-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.',
+'ns-specialprotected' => 'Spesiale ziejen kunnen niet bewarkt wörden.',
+'titleprotected' => "t Anmaken van disse zied is beveiligd deur [[User:$1|$1]].
 De op-egeven reden is ''$2''.",
-'filereadonlyerror' => 'Kon t bestaand "$1" niet anpassen umdat de bestaandsmap "$2" op dit moment allinnig-lezen is.
+'filereadonlyerror' => 'Kon t bestaand "$1" niet anpassen umdat de bestaandsmap "$2" op dit moment op allinnig-lezen steet.
 
-De op-egeven reden is "\'\'$3\'\'".',
+De beheerder gaf hierveur de volgende reden: "$3".',
+'invalidtitle-knownnamespace' => 'Ongeldige titel mit naamruumte "$2" en tekste "$3"',
+'invalidtitle-unknownnamespace' => 'Ongeldige titel mit onbekend naamruumtenummer $1 en tekste "$2"',
+'exception-nologin' => 'Niet an-emeld',
+'exception-nologin-text' => "Um disse zied te bekieken of disse haandeling uut te kunnen voeren mu'j an-emeld ween bie disse wiki.",
 
 # Virus scanner
 'virus-badscanner' => "Slichte konfigurasie: onbekend antivirusprogramma: ''$1''",
@@ -704,7 +710,7 @@ De op-egeven reden is "\'\'$3\'\'".',
 'logouttext' => "'''Je bin noen aofemeld.'''
 
 Je kunnen {{SITENAME}} noen anoniem gebruken of je eigen [[Special:UserLogin|opniej anmelden]] onder disse of n aandere gebrukersnaam.
-t Kan ween dat der wat pagina's bin die weeregeven wörden asof je an-emeld bin totda'j t tussengeheugen van joew webkieker leegmaken.",
+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.",
 'welcomecreation' => '== Welkom, $1! ==
 Joew gebrukersnaam is an-emaakt.
 Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] in te stellen.',
@@ -742,7 +748,7 @@ Je hebben disse scheumbestaanden uutezet.
 Zet ze an, en meld daornao an mit de nieje gegevens.',
 'nocookieslogin' => 't Anmelden is mislokt umdat de webkieker gien scheumbestaanden (cookies) an hef staon. Probeer t aksepteren van scheumbestaanden an te zetten en daornao opniej an te melden.',
 'nocookiesfornew' => "De gebruker is niet an-emaakt, umdat de bron niet bevestigd kon wörden.
-Zörg derveur da'j scheumbestaanden (cookies) an hebben staon, herlaot disse pagina en probeer t opniej.",
+Zörg derveur da'j scheumbestaanden (cookies) an hebben staon, herlaoj disse zied en probeer t opniej.",
 'noname' => 'Je mutten n gebrukersnaam opgeven.',
 'loginsuccesstitle' => 'Suksesvol an-emeld',
 'loginsuccess' => 'Je bin noen an-emeld bie {{SITENAME}} as "$1".',
@@ -773,7 +779,7 @@ en blief joew bestaonde wachtwoord gebruken.',
 'noemailcreate' => 'Je mutten n geldig netpostadres opgeven',
 'passwordsent' => 'Der is n niej wachtwoord verstuurd naor t netpostadres van gebruker "$1". Meld an, a\'j t wachtwoord ontvangen.',
 'blocked-mailpassword' => "Dit IP-adres is eblokkeerd. Dit betekent da'j niet bewarken kunnen en dat {{SITENAME}} joew wachtwoord niet weerummehaolen kan, dit wörden edaon um misbruuk tegen te gaon.",
-'eauthentsent' => "Der is n bevestigingsberich naor t op-egeven netpostadres verstuurd. Veurdat der veerdere berichten naor dit netpostadres verstuurd kunnen wörden, mö'j de instruksies volgen in t toe-esturen berich, um te bevestigen da'j joe eigen daodwarkelik an-emeld hebben.",
+'eauthentsent' => "Der is n bevestigingsberich naor t op-egeven netpostadres verstuurd. Veurdat der veerdere berichten naor dit netpostadres verstuurd kunnen wörden, mu'j de instruksies volgen in t toe-esturen berich, um te bevestigen da'j joe eigen daodwarkelik an-emeld hebben.",
 'throttled-mailpassword' => 'In {{PLURAL:$1|t leste ure|de leste $1 uren}} is der al n wachtwoordherinnering estuurd.
 Um misbruuk te veurkoemen wörden der mer één wachtwoordherinnering per {{PLURAL:$1|ure|$1 uren}} verstuurd.',
 'mailerror' => 'Fout bie t versturen van bericht: $1',
@@ -785,6 +791,7 @@ Um misbruuk te veurkoemen wörden der mer één wachtwoordherinnering per {{PLUR
 'invalidemailaddress' => 't Netpostadres kon niet aksepteerd wörden umdat de opmaak ongeldig is.
 Voer de juuste opmaak van t adres in of laot t veld leeg.',
 'cannotchangeemail' => 't Netpostadres veur n gebruker kan op disse wiki niet ewiezigd wörden.',
+'emaildisabled' => 'Disse webstee kan gien netpost versturen.',
 'accountcreated' => 'Gebrukersprofiel is an-emaakt',
 'accountcreatedtext' => 'De gebrukersnaam veur $1 is an-emaakt.',
 'createaccount-title' => 'Gebrukers anmaken veur {{SITENAME}}',
@@ -805,7 +812,7 @@ Je mutten effen wachten veurda'j t opniej proberen kunnen.",
 
 # Change password dialog
 'resetpass' => 'Wachtwoord wiezigen',
-'resetpass_announce' => "Je bin an-emeld mit n veurlopige kode die mit de netpost toe-estuurd wörden. Um t anmelden te voltooien, mö'j n niej wachtwoord invoeren:",
+'resetpass_announce' => "Je bin an-emeld mit n veurlopige kode die mit de netpost toe-estuurd wörden. Um t anmelden te voltooien, mu'j n niej wachtwoord invoeren:",
 'resetpass_text' => '<!-- Tekste hier invoegen -->',
 'resetpass_header' => 'Wachtwoord wiezigen',
 'oldpassword' => "Wachtwoord da'j noen hebben",
@@ -814,7 +821,7 @@ Je mutten effen wachten veurda'j t opniej proberen kunnen.",
 'resetpass_submit' => 'Voer t wachtwoord in en meld je an',
 'resetpass_success' => 'Joew wachtwoord is suksesvol ewiezigd Je wörden noen an-emeld...',
 'resetpass_forbidden' => 'Wachtwoorden kunnen niet ewiezigd wörden',
-'resetpass-no-info' => "Je mutten an-emeld ween veurda'j disse pagina gebruken kunnen.",
+'resetpass-no-info' => "Je mutten an-emeld ween veurda'j disse zied gebruken kunnen.",
 'resetpass-submit-loggedin' => 'Wachtwoord wiezigen',
 'resetpass-submit-cancel' => 'Aofbreken',
 'resetpass-wrong-oldpass' => "t Veurlopige wachtwoord of t wachtwoord da'j noen hebben is ongeldig.
@@ -838,14 +845,14 @@ De volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres
 
 $2
 
-{{PLURAL:$3|Dit tiedelike wachtwoord vervuilt|Disse tiedelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.
+{{PLURAL:$3|Dit tiedelike wachtwoord vervölt|Disse tiedelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.
 Meld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
 'passwordreset-emailtext-user' => "De gebruker $1 van {{SITENAME}} hef joew gebrukersgegevens veur {{SITENAME}} ($4) op-evreugen vanaof t IP-adres $1.
 De volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:
 
 $2
 
-{{PLURAL:$3|Dit tiedelike wachtwoord vervuilt|Disse tiedelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.
+{{PLURAL:$3|Dit tiedelike wachtwoord vervölt|Disse tiedelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.
 Meld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
 'passwordreset-emailelement' => 'Gebrukersnaam: $1
 Tiedelik wachtwoord: $2',
@@ -856,8 +863,8 @@ Tiedelik wachtwoord: $2',
 # Special:ChangeEmail
 'changeemail' => 'Wiezig netpostadres',
 'changeemail-header' => 'Netpostadres wiezigen',
-'changeemail-text' => "Vul dit formulier in um joew netpostadres te wiezigen. Um disse wieziging te bevestigen mö'j je wachtwoord invoeren.",
-'changeemail-no-info' => 'Je mutten an-emeld ween um drekt toegang te hebben tot disse pagina.',
+'changeemail-text' => "Vul dit formulier in um joew netpostadres te wiezigen. Um disse wieziging te bevestigen mu'j je wachtwoord invoeren.",
+'changeemail-no-info' => 'Je mutten an-emeld ween um drekt toegang te hebben tot disse zied.',
 'changeemail-oldemail' => 't Ouwe netpostadres:',
 'changeemail-newemail' => 't Nieje netpostadres:',
 'changeemail-none' => '(gien)',
@@ -888,16 +895,16 @@ Tiedelik wachtwoord: $2',
 'summary' => 'Samenvatting:',
 'subject' => 'Onderwarp:',
 'minoredit' => 'kleine wieziging',
-'watchthis' => 'volg disse pagina',
-'savearticle' => 'Pagina opslaon',
+'watchthis' => 'volg disse zied',
+'savearticle' => 'Zied opslaon',
 'preview' => 'Naokieken',
 'showpreview' => 'Bewarking naokieken',
 'showlivepreview' => 'Drekte weergave',
 'showdiff' => 'Verschil bekieken',
 'anoneditwarning' => "'''Waorschuwing:''' je bin niet an-emeld.
-Joew IP-adres zal op-esleugen wörden a'j wiezigingen op disse pagina anbrengen.",
+Joew IP-adres zal op-esleugen wörden a'j wiezigingen op disse zied anbrengen.",
 'anonpreviewwarning' => "''Je bin niet an-emeld.''
-''Deur de bewarking op te slaon wörden joew IP-adres op-esleugen in de paginageschiedenisse.''",
+''Deur de bewarking op te slaon wörden joew IP-adres op-esleugen in de ziedgeschiedenisse.''",
 'missingsummary' => "'''Herinnering:''' je hebben gien samenvatting op-egeven veur de bewarking. A'j noen weer op ''Opslaon'' klikken wörden de bewarking zonder samenvatting op-esleugen.",
 'missingcommenttext' => 'Plaots joew opmarking hieronder.',
 'missingcommentheader' => "'''Waorschuwing:''' je hebben der gien onderwarptitel bie ezet. A'j noen weer op \"{{int:savearticle}}\" klikken, dan wörden de bewarking op-esleugen zonder onderwarptitel.",
@@ -934,31 +941,31 @@ NB: je kunnen de opsie "n bericht sturen" niet gebruken, behalven a\'j n geldig
 Joew IP-adres is $3 en joew blokkeernummer is $5.
 Geef disse nummers deur a\'j kontakt mit ene opnemen over de blokkering.',
 'blockednoreason' => 'gien reden op-egeven',
-'whitelistedittext' => "Um pagina's te kunnen wiezigen, mö'j $1 ween",
+'whitelistedittext' => "Um ziejen te kunnen wiezigen, mu'j $1 ween",
 'confirmedittext' => "Je mutten je netpostadres bevestigen veurda'j bewarken kunnen. Vul je adres in en bevestig t via [[Special:Preferences|mien veurkeuren]].",
 'nosuchsectiontitle' => 'Disse seksie besteet niet',
 'nosuchsectiontext' => 'Je proberen n seksie te bewarken dat niet besteet.
 t Kan ween dat t herneumd is of dat t vortedaon is to jie t an t bekieken waren.',
 'loginreqtitle' => 'Anmelden verplicht',
 'loginreqlink' => 'Anmelden',
-'loginreqpagetext' => 'Je mutten $1 um disse pagina te bekieken.',
+'loginreqpagetext' => 'Je mutten $1 um disse zied te bekieken.',
 'accmailtitle' => 'Wachtwoord is verstuurd.',
 'accmailtext' => "Der is n willekeurig wachtwoord veur [[User talk:$1|$1]] verstuurd naor $2.
 
-t Wachtwoord veur disse gebruker kan ewiezigd wörden deur de pagina ''[[Special:ChangePassword|wachtwoord wiezigen]]'' te gebruken.",
+t Wachtwoord veur disse gebruker kan ewiezigd wörden deur de zied ''[[Special:ChangePassword|wachtwoord wiezigen]]'' te gebruken.",
 'newarticle' => '(Niej)',
-'newarticletext' => "Disse pagina besteet nog niet.
-In t veld hieronder ku'j wat schrieven um disse pagina an te maken (meer informasie vie'j op de [[{{MediaWiki:Helppage}}|hulppagina]]).
+'newarticletext' => "Disse zied besteet nog niet.
+In t veld hieronder ku'j wat schrieven um disse zied an te maken (meer informasie vie'j op de [[{{MediaWiki:Helppage}}|hulpzied]]).
 A'j hier per ongelok terechtekeumen bin gebruuk dan de knoppe '''veurige''' um weerumme te gaon.",
-'anontalkpagetext' => "---- ''Disse overlegpagina heurt bie n anonieme gebruker die nog gien gebrukersnaam hef, of t niet gebruuk. We gebruken daorumme t IP-adres um hum of heur te herkennen, mer t kan oek ween dat meerdere personen t zelfde IP-adres gebruken, en da'j hiermee berichten ontvangen die niet veur joe bedoeld bin. A'j dit veurkoemen willen, dan ku'j t bes [[Special:UserLogin/signup|n gebrukersnaam anmaken]] of [[Special:UserLogin|anmelden]].''",
-'noarticletext' => 'Der steet noen gien tekste op disse pagina.
-Je kunnen [[Special:Search/{{PAGENAME}}|de titel opzeuken]] in aandere pagina\'s,
+'anontalkpagetext' => "---- ''Disse overlegzied heurt bie n anonieme gebruker die nog gien gebrukersnaam hef, of t niet gebruukt. We gebruken daorumme t IP-adres um hum of heur te herkennen, mer t kan oek ween dat meerdere personen t zelfde IP-adres gebruken, en da'j hiermee berichten ontvangen die niet veur joe bedoeld bin. A'j dit veurkoemen willen, dan ku'j t best [[Special:UserLogin/signup|n gebrukersnaam anmaken]] of [[Special:UserLogin|anmelden]].''",
+'noarticletext' => 'Der steet noen gien tekste op disse zied.
+Je kunnen [[Special:Search/{{PAGENAME}}|de titel opzeuken]] in aandere ziejen,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} zeuken in de logboeken],
-of [{{fullurl:{{FULLPAGENAME}}|action=edit}} disse pagina bewarken]</span>.',
-'noarticletext-nopermission' => 'Op disse pagina steet gien tekste.
-Je kunnen [[Special:Search/{{PAGENAME}}|zeuken naor disse term]] in aandere pagina\'s of
+of [{{fullurl:{{FULLPAGENAME}}|action=edit}} disse zied bewarken]</span>.',
+'noarticletext-nopermission' => 'Op disse zied steet gien tekste.
+Je kunnen [[Special:Search/{{PAGENAME}}|zeuken naor disse term]] in aandere ziejen of
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken deurzeuken]</span>.',
-'userpage-userdoesnotexist' => 'Je bewarken n gebrukerspagina van n gebruker die niet besteet (gebruker "<nowiki>$1</nowiki>"). Kiek effen nao o\'j disse pagina wel anmaken/bewarken willen.',
+'userpage-userdoesnotexist' => 'Je bewarken n gebrukerszied van n gebruker die niet besteet (gebruker "<nowiki>$1</nowiki>"). Kiek effen nao o\'j disse zied wel anmaken/bewarken willen.',
 'userpage-userdoesnotexist-view' => 'Gebruker "$1" steet hier niet in-eschreven',
 'blocked-notice-logextract' => 'Disse gebruker is op t moment eblokkeerd.
 De leste regel uut t blokkeerlogboek steet hieronder as referensie:',
@@ -970,110 +977,120 @@ De leste regel uut t blokkeerlogboek steet hieronder as referensie:',
 *'''Opera:''' leeg t tussengeheugen in ''Extra → Voorkeuren\"",
 'usercssyoucanpreview' => "'''Tip:''' gebruuk de knoppe \"{{int:showpreview}}\" um joew nieje css/js nao te kieken veurda'j t opslaon.",
 'userjsyoucanpreview' => "'''Tip:''' gebruuk de knoppe \"{{int:showpreview}}\" um joew nieje css/js nao te kieken veurda'j t opslaon.",
-'usercsspreview' => "'''Dit is allinnig n kontrole van joew persoonlike CSS.'''
+'usercsspreview' => "'''Dit is allinnig n naokieksel van joew persoonlike CSS.'''
 '''t Is nog niet op-esleugen!'''",
 'userjspreview' => "'''Denk deran da'j joew persoonlike JavaScript allinnig nog mer an t bekieken bin, t is nog niet op-esleugen!'''",
 'sitecsspreview' => "'''Je bin allinnig mer de CSS an t naokieken.'''
 '''t Is nog niet op-esleugen!'''",
 'sitejspreview' => "'''Je bin allinnig mer de JavaScript-kode an t naokieken.'''
 '''t Is nog niet op-esleugen!'''",
-'userinvalidcssjstitle' => "'''Waorschuwing:''' der is gien uutvoering mit de naam \"\$1\". Vergeet niet dat joew eigen .css- en .js-pagina's beginnen mit n kleine letter, bv. \"{{ns:user}}:Naam/'''v'''ector\" in plaotse van \"{{ns:user}}:Naam/'''V'''ector.css\".",
+'userinvalidcssjstitle' => "'''Waorschuwing:''' der is gien uutvoering mit de naam \"\$1\". Vergeet niet dat joew eigen .css- en .js-ziejen beginnen mit n kleine letter, bv. \"{{ns:user}}:Naam/'''v'''ector\" in plaotse van \"{{ns:user}}:Naam/'''V'''ector.css\".",
 'updated' => '(Bewark)',
 'note' => "'''Opmarking:'''",
-'previewnote' => "'''NB: je bin de pagina allinnig nog mer an t naokieken; de tekste is nog niet op-esleugen!'''",
-'previewconflict' => "Disse versie laot zien hoe de tekste in t bovenste veld deruut kump te zien a'j de tekste opslaon.",
+'previewnote' => "'''Waort je: dit is n naokiekzied.'''
+Joew tekste is niet op-esleugen!",
+'continue-editing' => 'Deurgaon mit bewarken',
+'previewconflict' => "Disse versie löt zien hoe de tekste in t bovenste veld deruut kömp te zien a'j de tekste opslaon.",
 'session_fail_preview' => "'''De bewarking kan niet verwarkt wörden wegens n verlies an data.'''
 Probeer t laoter weer.
-As t probleem dan nog steeds veurkump, probeer dan [[Special:UserLogout|opniej an te melden]].",
+As t probleem dan nog steeds veurkömp, probeer dan [[Special:UserLogout|opniej an te melden]].",
 'session_fail_preview_html' => "'''De bewarking kan niet verwarkt wörden wegens n verlies an data.'''
 
-''Umdat in {{SITENAME}} roewe HTML in-eschakeld is, is de weergave dervan verbörgen um te veurkoemen dat t JavaScript an-evuilen wörden.''
+''Umdat in {{SITENAME}} roewe HTML in-eschakeld is, is de weergave dervan verbörgen um te veurkoemen dat t JavaScript an-evöllen wörden.''
 
 '''As dit n legitieme wieziging is, probeer t dan opniej.'''
-As t dan nog problemen geef, probeer dan um [[Special:UserLogout|opniej an te melden]].",
-'token_suffix_mismatch' => "'''De bewarking is eweigerd umdat de webkieker de leestekens in t bewarkingstoken verkeerd behaandeld hef. De bewarking is eweigerd um verminking van de paginatekste te veurkoemen. Dit gebeurt soms as der n web-ebaseerden proxydienst gebruukt wörden waor fouten in zitten.'''",
+As t dan nog problemen gif, probeer dan um [[Special:UserLogout|opniej an te melden]].",
+'token_suffix_mismatch' => "'''De bewarking is eweigerd umdat de webkieker de leestekens in t bewarkingstoken verkeerd behaandeld hef. De bewarking is eweigerd um verminking van de ziedtekste te veurkoemen. Dit gebeurt soms as der n web-ebaseerden proxydienst gebruukt wörden waor fouten in zitten.'''",
 'edit_form_incomplete' => "'''Partie delen van t bewarkingsformulier hebben de server niet bereikt. Kiek eers nao of de bewarkingen kloppen en probeer t opniej.'''",
-'editing' => 'Bewark: $1',
-'editingsection' => 'Bewark: $1 (deelpagina)',
-'editingcomment' => 'Bewark: $1 (niej onderwarp)',
-'editconflict' => 'Bewarkingskonflikt: $1',
-'explainconflict' => "'''NB:''' n aander hef disse pagina ewiezigd naoda'j an disse bewarking begunnen bin.
-t Bovenste bewarkingsveld laot de pagina zien zo as t noen is.
-Daoronder (bie \"Wiezigingen\") staon de verschillen tussen joew versie en de op-esleugen pagina.
+'editing' => 'Bewarken: $1',
+'creating' => 'Anmaken: $1',
+'editingsection' => 'Bewarken: $1 (deelzied)',
+'editingcomment' => 'Bewarken: $1 (niej onderwarp)',
+'editconflict' => 'Tegelieke bewörken: $1',
+'explainconflict' => "'''NB:''' n aander hef disse zied ewiezigd naoda'j an disse bewarking begunnen bin.
+t Bovenste bewarkingsveld löt de zied zien zo as t noen is.
+Daoronder (bie \"Wiezigingen\") staon de verschillen tussen joew versie en de op-esleugen zied.
 Helemaole onderan (bie \"Joew tekste\") steet nog n bewarkingsveld mit joew versie.
 Je zullen je eigen wiezigingen in de nieje tekste in mutten passen.
 '''Allinnig''' de tekste in t bovenste veld wörden beweerd a'j noen kiezen veur \"{{int:savearticle}}\".",
 'yourtext' => 'Joew tekste',
 'storedversion' => 'Op-esleugen versie',
-'nonunicodebrowser' => "'''Waorschuwing: de webkieker kan niet goed overweg mit unikode, schakel over op n aandere webkieker um de wiezigingen an te brengen!'''",
-'editingold' => "'''Waorschuwing: je bewarken noen n ouwe versie van disse pagina. A'j de wiezigingen opslaon, gaon alle niejere versies verleuren.'''",
+'nonunicodebrowser' => "'''Waorschuwing: joew webkieker kan niet goed mit unikode uut de voten, schakel over op n aandere webkieker um de wiezigingen an te brengen!'''",
+'editingold' => "'''Waorschuwing: je bewarken noen n ouwe versie van disse zied. A'j de wiezigingen opslaon, bi'j alle niejere versies kwiet.'''",
 'yourdiff' => 'Wiezigingen',
 'copyrightwarning' => "Waort je dat alle biedragen an {{SITENAME}} vrie-egeven mutten wörden onder de \$2 (zie \$1 veur meer informasie).
 A'j niet willen dat joew tekste deur aander volk bewarkt en verspreid kan wörden, slao de tekste dan niet op.<br />
-Deur op \"Pagina opslaon\" te klikken beleuf je ons da'j disse tekste zelf eschreven hebben, of over-eneumen hebben uut n vrieje, openbaore bron.<br />
+Deur op \"Zied opslaon\" te klikken beleuf je ons da'j disse tekste zelf eschreven hebben, of over-eneumen hebben uut n vrieje, openbaore bron.<br />
 '''Gebruuk gien spul mit auteursrechten, a'j daor gien toestemming veur hebben!'''",
 'copyrightwarning2' => "Waort je dat alle biedragen an {{SITENAME}} deur aander volk bewarkt of vortedaon kan wörden. A'j niet willen dat joew tekste deur aander volk bewarkt wörden, slao de tekste dan niet op.<br />
-Deur op \"Pagina opslaon\" te klikken beleuf je ons da'j disse tekste zelf eschreven hebben, of over-eneumen hebben uut n vrieje, openbaore bron (zie \$1 veur meer informasie).
+Deur op \"Zied opslaon\" te klikken beleuf je ons da'j disse tekste zelf eschreven hebben, of over-eneumen hebben uut n vrieje, openbaore bron (zie \$1 veur meer informasie).
 '''Gebruuk gien spul mit auteursrechten, a'j daor gien toestemming veur hebben!'''",
 'longpageerror' => "'''Foutmelding: de tekste die'j opslaon willen is {{PLURAL:$1|een kilobyte|$1 kilobytes}}. Dit is groter as t toe-estaone maximum van $2 kilobytes. Joew tekste kan niet op-esleugen wörden.'''",
-'readonlywarning' => "'''Waorschuwing: De databanke is op dit moment in onderhoud; t is daorumme niet meugelik um pagina's te wiezigen.
-Je kunnen de tekste t beste bie joew eigen systeem opslaon en laoter opniej proberen de pagina te bewarken.'''
+'readonlywarning' => "'''Waorschuwing: De databanke is op dit moment in onderhoud; t is daorumme niet meugelik um ziejen te wiezigen.
+Je kunnen de tekste t beste bie joew eigen systeem opslaon en laoter opniej proberen de zied te bewarken.'''
 
 As grund is angeven: $1",
-'protectedpagewarning' => "'''Waorschuwing: disse pagina is beveiligd, zodat allinnig beheerders t kunnen wiezigen.'''
+'protectedpagewarning' => "'''Waorschuwing: disse zied is beveiligd, zodat allinnig beheerders t kunnen wiezigen.'''
 De leste logboekregel steet hieronder:",
-'semiprotectedpagewarning' => "'''Let op:''' disse pagina is beveiligd en ku'j allinnig bewarken a'j n eregistreerden gebruker bin.
+'semiprotectedpagewarning' => "'''Let op:''' disse zied is beveiligd en ku'j allinnig bewarken a'j n eregistreerden gebruker bin.
 De leste logboekregel steet hieronder:",
-'cascadeprotectedwarning' => "'''Waorschuwing:''' disse pagina is beveiligd, zodat allinnig beheerders disse pagina kunnen bewarken, dit wörden edaon umdat disse pagina veurkump in de volgende {{PLURAL:$1|kaskade-beveiligden pagina|kaskade-beveiligden pagina's}}:",
-'titleprotectedwarning' => "'''Waorschuwing: disse pagina is beveilig. Je hebben [[Special:ListGroupRights|bepaolde rechten]] neudig um t an te kunnen maken.'''
+'cascadeprotectedwarning' => "'''Waorschuwing:''' disse zied is beveiligd, zodat allinnig beheerders disse zied bewarken kunnen, dit wörden edaon umdat disse zied veurkömp in de volgende {{PLURAL:$1|kaskade-beveiligden zied|kaskade-beveiligden ziejen}}:",
+'titleprotectedwarning' => "'''Waorschuwing: disse zied is beveiligd. Je hebben [[Special:ListGroupRights|bepaolde rechten]] neudig um t an te kunnen maken.'''
 De leste logboekregel steet hieronder:",
-'templatesused' => '{{PLURAL:$1|Mal|Mallen}} die op disse pagina gebruukt wörden:',
+'templatesused' => '{{PLURAL:$1|Mal|Mallen}} die op disse zied gebruukt wörden:',
 'templatesusedpreview' => '{{PLURAL:$1|Mal|Mallen}} die in disse bewarking gebruukt wörden:',
 'templatesusedsection' => '{{PLURAL:$1|Mal|Mallen}} die in dit subkopjen gebruukt wörden:',
-'template-protected' => '(beveilig)',
-'template-semiprotected' => '(semibeveilig)',
-'hiddencategories' => 'Disse pagina vuilt in de volgende verbörgen {{PLURAL:$1|kategorie|kategorieën}}:',
+'template-protected' => '(beveiligd)',
+'template-semiprotected' => '(half-beveiligd)',
+'hiddencategories' => 'Disse zied völt in de volgende verbörgen {{PLURAL:$1|kategorie|kategorieën}}:',
 'edittools' => '<!-- Disse tekste steet onder de bewarkings- en bestaandinlaodformulieren. -->',
-'nocreatetitle' => "t Anmaken van pagina's is beteund",
-'nocreatetext' => "Disse webstee hef de meugelikheid um nieje pagina's an te maken beteund. Je kunnen pagina's die al bestaon wiezigen of je kunnen je [[Special:UserLogin|anmelden of n gebrukerspagina anmaken]].",
-'nocreate-loggedin' => "Je hebben gien toestemming um nieje pagina's an te maken.",
+'nocreatetitle' => 't Anmaken van nieje ziejen is beteund',
+'nocreatetext' => 'Disse webstee hef de meugelikheid um nieje ziejen an te maken beteund. Je kunnen ziejen die al bestaon wiezigen of je kunnen je [[Special:UserLogin|anmelden of n gebrukerszied anmaken]].',
+'nocreate-loggedin' => 'Je hebben gien toestemming um nieje ziejen an te maken.',
 'sectioneditnotsupported-title' => 't Bewarken van seksies wörden niet ondersteund',
-'sectioneditnotsupported-text' => 'Je kunnen op disse pagina gien seksies bewarken.',
+'sectioneditnotsupported-text' => 'Je kunnen op disse zied gien seksies bewarken.',
 'permissionserrors' => 'Fouten mit de rechten',
 'permissionserrorstext' => 'Je maggen of kunnen dit niet doon. De {{PLURAL:$1|reden|redens}} daorveur {{PLURAL:$1|is|bin}}:',
 'permissionserrorstext-withaction' => 'Je hebben gien rech um $2, mit de volgende {{PLURAL:$1|reden|redens}}:',
-'recreate-moveddeleted-warn' => "'''Waorschuwing: je maken n pagina an die eerder al vortedaon is.'''
+'recreate-moveddeleted-warn' => "'''Waorschuwing: je maken n zied an die eerder al vortedaon is.'''
 
-Bedenk eers of t neudig is um disse pagina veerder te bewarken.
-Veur de dudelikheid steet hieronder  t vortdologboek en t herneumlogboek veur disse pagina:",
-'moveddeleted-notice' => 'Disse pagina is vortedaon.
+Bedenk eerst of t neudig is um disse zied veerder te bewarken.
+Veur de dudelikheid steet hieronder  t vortdologboek en t herneumlogboek veur disse zied:",
+'moveddeleted-notice' => 'Disse zied is vortedaon.
 Hieronder steet de informasie uut t vortdologboek en t herneumlogboek.',
 'log-fulllog' => 't Hele logboek bekieken',
 'edit-hook-aborted' => 'De bewarking is aofebreuken deur n hook.
 Der is gien reden op-egeven.',
-'edit-gone-missing' => 'De pagina kon niet bie-ewörken wörden.
+'edit-gone-missing' => 'De zied kon niet bie-ewörken wörden.
 t Schient dat t vortedaon is.',
-'edit-conflict' => 'Bewarkingskonflikt.',
+'edit-conflict' => 'Tegelieke bewörken.',
 'edit-no-change' => 'Joew bewarking is enegeerd, umdat der gien wieziging an de tekste edaon is.',
-'edit-already-exists' => 'De pagina kon niet an-emaakt wörden.
+'edit-already-exists' => 'De zied kon niet an-emaakt wörden.
 t Besteet al.',
+'defaultmessagetext' => 'Standardtekste',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'Waorschuwing: disse pagina gebruukt te veule kostbaore parserfunksies.
+'expensive-parserfunction-warning' => 'Waorschuwing: disse zied gebruukt te veule kostbaore parserfunksies.
 
 Noen {{PLURAL:$1|is|bin}} t der $1, terwiel t der minder as $2 {{PLURAL:$2|mut|mutten}} ween.',
-'expensive-parserfunction-category' => "Pagina's die te veule kostbaore parserfunksies gebruken",
+'expensive-parserfunction-category' => 'Ziejen die te veule kostbaore parserfunksies gebruken',
 'post-expand-template-inclusion-warning' => 'Waorschuwing: de grootte van de in-evoegden mal is te groot.
 Sommigen mallen wörden niet in-evoegd.',
-'post-expand-template-inclusion-category' => "Pagina's die over de maximumgrootte veur in-evoegden mallen hinne gaon",
-'post-expand-template-argument-warning' => 'Waorschuwing: disse pagina gebruuk tenminsten één parameter in n mal, die te groot is as t uuteklap wörden. Disse parameters wörden vorteleuten.',
-'post-expand-template-argument-category' => "Pagina's mit ontbrekende malelementen",
+'post-expand-template-inclusion-category' => 'Ziejen die over de maximumgrootte veur in-evoegden mallen hinne gaon',
+'post-expand-template-argument-warning' => 'Waorschuwing: disse zied gebruuk tenminsten één parameter in n mal, die te groot is as t uuteklap wörden. Disse parameters wörden vorteleuten.',
+'post-expand-template-argument-category' => 'Ziejen mit ontbrekende malelementen',
 'parser-template-loop-warning' => 'Der is n kringloop in mallen waoreneumen: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Der is over de rekursiediepte veur mallen is hinne gaon ($1)',
 'language-converter-depth-warning' => 'Je hebben t dieptelimiet veur de taalumzetter bereikt ($1)',
+'node-count-exceeded-category' => 'Ziejen die t knuppenantal overschrejen hebben.',
+'node-count-exceeded-warning' => 'Op de zied is t maximale antal nodes overschrejen',
+'expansion-depth-exceeded-category' => 'Ziejen waor de expansiediepte overschrejen is',
+'expansion-depth-exceeded-warning' => 'Op disse zied staon te veule mallen',
+'parser-unstrip-loop-warning' => 'Der is n "unstrip"-lusse evunnen',
+'parser-unstrip-recursion-limit' => 'De rekursielimiet ($1) veur "unstrip" is overschrejen',
 
 # "Undo" feature
-'undo-success' => 'De bewarking kan weerummedreid wörden. Kiek de vergelieking hieronder nao um der wisse van de ween dat alles goed is, en slao de de pagina op um de bewarking weerumme te dreien.',
+'undo-success' => 'De bewarking kan weerummedreid wörden. Kiek de vergelieking hieronder nao um der wisse van de ween dat alles goed is, en slao de de zied op um de bewarking weerumme te dreien.',
 'undo-failure' => 'De wieziging kon niet weerummedreid wörden umdat t ondertussen awweer ewiezigd is.',
 'undo-norev' => 'De bewarking kon niet weerummedreid wörden, umdat t niet besteet of vortedaon is.',
 'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) weerummedreid.',
@@ -1085,8 +1102,8 @@ Sommigen mallen wörden niet in-evoegd.',
 De deur $3 op-egeven reden is ''$2''",
 
 # History pages
-'viewpagelogs' => 'Bekiek logboeken veur disse pagina',
-'nohistory' => 'Der bin gien eerdere versies van disse pagina.',
+'viewpagelogs' => 'Bekiek logboeken veur disse zied',
+'nohistory' => 'Der bin gien eerdere versies van disse zied.',
 'currentrev' => 'Leste versie',
 'currentrev-asof' => 'Leste versie van $1',
 'revisionasof' => 'Versie op $1',
@@ -1109,9 +1126,9 @@ De deur $3 op-egeven reden is ''$2''",
 
 # Revision feed
 'history-feed-title' => 'Wiezigingsoverzichte',
-'history-feed-description' => 'Wiezigingsoverzichte veur disse pagina op de wiki',
+'history-feed-description' => 'Wiezigingsoverzichte veur disse zied op de wiki',
 'history-feed-item-nocomment' => '$1 op $2',
-'history-feed-empty' => "De op-evreugen pagina besteet niet. t Kan ween dat disse pagina vortedaon is of dat t herneumd is. Probeer te [[Special:Search|zeuken]] naor soortgelieke nieje pagina's.",
+'history-feed-empty' => 'De op-evreugen zied besteet niet. t Kan ween dat disse zied vortedaon is of dat t herneumd is. Probeer te [[Special:Search|zeuken]] naor soortgelieke nieje ziejen.',
 
 # Revision deletion
 'rev-deleted-comment' => '(bewarkingsopmarking vortedaon)',
@@ -1186,7 +1203,7 @@ $1",
 'revdel-restore' => 'Zichtbaorheid wiezigen',
 'revdel-restore-deleted' => 'vortedaone versies',
 'revdel-restore-visible' => 'zichtbaore versies',
-'pagehist' => 'Paginageschiedenisse',
+'pagehist' => 'Ziedgeschiedenisse',
 'deletedhist' => 'Geschiedenisse die vortehaold is',
 'revdelete-hide-current' => 'Fout bie t verbargen van t objekt van $1 um $2 uur: dit is de versie van noen.
 Disse versie kan niet verbörgen wörden.',
@@ -1194,7 +1211,7 @@ Disse versie kan niet verbörgen wörden.',
 Je hebben gien toegang tot dit objekt.',
 'revdelete-modify-no-access' => 'Fout bie t wiezigen van t objekt van $1 um $2 uur: dit objekt is emarkeerd as "beveilig".
 Je hebben gien toegang tot dit objekt.',
-'revdelete-modify-missing' => 'Fout bie t wiezigen van versienummer $1: t kump niet veur in de databanke!',
+'revdelete-modify-missing' => 'Fout bie t wiezigen van versienummer $1: t kömp niet veur in de databanke!',
 'revdelete-no-change' => "'''Waorschuwing:''' t objekt van $1 um $2 uur had al de an-egeven zichtbaorheidsinstellingen.",
 'revdelete-concurrent-change' => 'Fout bie t wiezigen van t objekt van $1 um $2 uur: de staotus is inmiddels ewiezigd deur n aander.
 Kiek de logboeken nao.',
@@ -1210,39 +1227,42 @@ Kiek de logboeken nao.',
 
 # Suppression log
 'suppressionlog' => 'Verbargingslogboek',
-'suppressionlogtext' => "In de onderstaande lieste staon de vortedaone pagina's en blokkeringen die veur beheerders verbörgen bin. In de [[Special:BlockList|IP-blokkeerlieste]] bin de blokkeringen, die noen van toepassing bin, te bekieken.",
+'suppressionlogtext' => 'In de onderstaande lieste staon de vortedaone ziejen en blokkeringen die veur beheerders verbörgen bin. 
+In de [[Special:BlockList|blokkeerlieste]] bin de blokkeringen, die noen van toepassige bin, te bekieken.',
 
 # History merging
-'mergehistory' => "Geschiedenisse van pagina's bie mekaar doon",
-'mergehistory-header' => "Via disse pagina ku'j versies uut de geschiedenisse van n bronpagina mit n niejere pagina samenvoegen. Zörg derveur dat disse versies uut de geschiedenisse histories juus bin.",
-'mergehistory-box' => "Geschiedenisse van twee pagina's bie mekaar doon:",
-'mergehistory-from' => 'Bronpagina:',
-'mergehistory-into' => 'Bestemmingspagina:',
+'mergehistory' => 'Geschiedenisse van ziejen bie mekaar doon',
+'mergehistory-header' => "Via disse zied ku'j versies uut de geschiedenisse van n bronzied mit n niejere zied samenvoegen. Zörg derveur dat disse versies uut de geschiedenisse histories juus bin.",
+'mergehistory-box' => 'Geschiedenisse van twee ziejen bie mekaar doon:',
+'mergehistory-from' => 'Bronzied:',
+'mergehistory-into' => 'Bestemmingszied:',
 'mergehistory-list' => 'Bewarkingsgeschiedenisse die bie mekaar edaon kan wörden',
 'mergehistory-merge' => 'De volgende versies van [[:$1]] kunnen samenevoegd wörden naor [[:$2]]. Gebruuk de kolom mit keuzerondjes um allinnig de versies die emaak bin op en veur de an-egeven tied samen te voegen. Let op dat t gebruken van de navigasieverwiezingen disse kolom zal herinstellen.',
 'mergehistory-go' => 'Bekiek bewarkingen die bie mekaar edaon kunnen wörden',
 'mergehistory-submit' => 'Versies bie mekaar doon',
 'mergehistory-empty' => 'Der bin gien versies die samenevoegd kunnen wörden.',
 'mergehistory-success' => '$3 {{PLURAL:$3|versie|versies}} van [[:$1]] bin suksesvol samenevoegd naor [[:$2]].',
-'mergehistory-fail' => 'Kan gien geschiedenisse samenvoegen, kiek opniej de pagina- en tiedparameters nao.',
-'mergehistory-no-source' => 'Bronpagina $1 besteet niet.',
-'mergehistory-no-destination' => 'Bestemmingspagina $1 besteet niet.',
-'mergehistory-invalid-source' => 'De bronpagina mut n geldige titel ween.',
-'mergehistory-invalid-destination' => 'De bestemmingspagina mut n geldige titel ween.',
+'mergehistory-fail' => 'Kan gien geschiedenisse samenvoegen, kiek opniej de zied- en tiedparameters nao.',
+'mergehistory-no-source' => 'Bronzied $1 besteet niet.',
+'mergehistory-no-destination' => 'Bestemmingszied $1 besteet niet.',
+'mergehistory-invalid-source' => 'De bronzied mut n geldige titel ween.',
+'mergehistory-invalid-destination' => 'De bestemmingszied mut n geldige titel ween.',
 'mergehistory-autocomment' => '[[:$1]] samenevoegd naor [[:$2]]',
 'mergehistory-comment' => '[[:$1]] samenevoegd naor [[:$2]]: $3',
-'mergehistory-same-destination' => 'De bronpagina en doelpagina kunnen niet t zelfde ween',
+'mergehistory-same-destination' => 'De bronzied en doelzied kunnen niet t zelfde ween',
 'mergehistory-reason' => 'Reden:',
 
 # Merge log
 'mergelog' => 'Samenvoegingslogboek',
 'pagemerge-logentry' => 'voegen [[$1]] naor [[$2]] samen (versies tot en mit $3)',
 'revertmerge' => 'Samenvoeging weerummedreien',
-'mergelogpagetext' => "Hieronder zie'j n lieste van de leste samenvoegingen van n paginageschiedenisse naor n aandere.",
+'mergelogpagetext' => "Hieronder zie'j n lieste van de leste samenvoegingen van n ziedgeschiedenisse naor n aandere.",
 
 # Diffs
-'history-title' => 'Geschiedenisse van "$1"',
-'difference-multipage' => "(Verschil tussen pagina's)",
+'history-title' => 'Versiegeschiedenisse van "$1"',
+'difference-title' => 'Verschil tussen versies van "$1"',
+'difference-title-multipage' => 'Verschil tussen ziejen "$1" en "$2"',
+'difference-multipage' => '(Verschil tussen ziejen)',
 'lineno' => 'Regel $1:',
 'compareselectedversions' => 'Vergeliek de ekeuzen versies',
 'showhideselectedversions' => 'Ekeuzen versies bekieken/verbargen',
@@ -1254,7 +1274,7 @@ Kiek de logboeken nao.',
 'searchresults' => 'Zeukresultaoten',
 'searchresults-title' => 'Zeukresultaoten veur "$1"',
 'searchresulttext' => 'Veur meer informasie over zeuken op {{SITENAME}}, zie [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Je zöchten naor \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|alle pagina\'s die beginnen mit "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle pagina\'s die verwiezen naor "$1"]])',
+'searchsubtitle' => 'Je zöchten naor \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|alle ziejen die beginnen mit "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle ziejen die verwiezen naor "$1"]])',
 'searchsubtitleinvalid' => 'Veur zeukopdrachte "$1"',
 'toomanymatches' => 'Der waren te veule resultaoten. Probeer n aandere zeukopdrachte.',
 'titlematches' => 'Overeenkomst mit t onderwarp',
@@ -1265,22 +1285,22 @@ Kiek de logboeken nao.',
 'nextn' => 'volgende {{PLURAL:$1|$1}}',
 'prevn-title' => '{{PLURAL:$1|Veurig resultaot|Veurige $1 resultaoten}}',
 'nextn-title' => '{{PLURAL:$1|Volgend resultaot|Volgende $1 resultaoten}}',
-'shown-title' => 'Laot $1 {{PLURAL:$1|resultaot|resultaoten}} per pagina zien',
+'shown-title' => 'Laot $1 {{PLURAL:$1|resultaot|resultaoten}} per zied zien',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Zeukopsies',
-'searchmenu-exists' => "* Pagina '''[[$1]]'''",
-'searchmenu-new' => "'''De pagina \"[[:\$1]]\" op disse wiki anmaken!'''",
+'searchmenu-exists' => "'''Der is n zied mit de naam \"[[:\$1]]\" op disse wiki.'''",
+'searchmenu-new' => "'''De zied \"[[:\$1]]\" op disse wiki anmaken!'''",
 'searchhelp-url' => 'Help:Inhold',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Paginanamen mit dit veurvoegsel laoten zien]]',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ziednamen mit dit veurvoegsel laoten zien]]',
 'searchprofile-articles' => 'Artikels',
-'searchprofile-project' => "Hulp- en projektpagina's",
+'searchprofile-project' => 'Hulp- en projektziejen',
 'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Alles',
 'searchprofile-advanced' => 'Uutebreid',
 'searchprofile-articles-tooltip' => 'Zeuken in $1',
 'searchprofile-project-tooltip' => 'Zeuken in $1',
 'searchprofile-images-tooltip' => 'Zeuken naor bestaanden',
-'searchprofile-everything-tooltip' => "Alle inhoud deurzeuken (oek overlegpagina's)",
+'searchprofile-everything-tooltip' => 'Alle inhoud deurzeuken (oek overlegziejen)',
 'searchprofile-advanced-tooltip' => 'Zeuken in de an-egeven naamruumtes',
 'search-result-size' => '$1 ({{PLURAL:$2|1 woord|$2 woorden}})',
 'search-result-category-size' => '{{PLURAL:$1|1 kategorielid|$1 kategorielejen}} ({{PLURAL:$2|1 onderkategorie|$2 onderkategorieën}}, {{PLURAL:$3|1 bestaand|$3 bestaanden}})',
@@ -1301,7 +1321,7 @@ Kiek de logboeken nao.',
 'showingresults' => "Hieronder {{PLURAL:$1|steet '''1''' resultaot|staon '''$1''' resultaoten}}  <b>$1</b> vanaof nummer <b>$2</b>.",
 'showingresultsnum' => "Hieronder {{PLURAL:$3|steet '''1''' resultaot|staon '''$3''' resultaoten}} vanaof nummer '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Resultaot '''$1''' van '''$3'''|Resultaoten '''$1 - $2''' van '''$3'''}} veur '''$4'''",
-'nonefound' => "<strong>Let wel:</strong> standard wörden niet alle naamruumtes deurzöcht. A'j in zeukopdrachte as veurvoegsel \"''all:'' gebruken wörden alle pagina's deurzöcht (oek overlegpagina's, mallen en gao zo mer deur). Je kunnen oek n naamruumte as veurvoegsel gebruken.",
+'nonefound' => "<strong>Let wel:</strong> standard wörden niet alle naamruumtes deurzöcht. A'j in zeukopdrachte as veurvoegsel \"''all:'' gebruken wörden alle ziejen deurzöcht (oek overlegziejen, mallen en gao zo mer deur). Je kunnen oek n naamruumte as veurvoegsel gebruken.",
 'search-nonefound' => 'Der bin gien resultaoten veur de zeukopdrachte.',
 'powersearch' => 'Zeuk',
 'powersearch-legend' => 'Uutebreid zeuken',
@@ -1315,7 +1335,7 @@ Kiek de logboeken nao.',
 'searchdisabled' => 'Zeuken in {{SITENAME}} is niet meugelik. Je kunnen gebruukmaken van Google. De gegevens over {{SITENAME}} bin misschien niet bie-ewörken.',
 
 # Quickbar
-'qbsettings' => 'Paginalieste',
+'qbsettings' => 'Lieste mit ziejen',
 'qbsettings-none' => 'Gien',
 'qbsettings-fixedleft' => 'Links, vaste',
 'qbsettings-fixedright' => 'Rechts, vaste',
@@ -1336,11 +1356,12 @@ Kiek de logboeken nao.',
 'prefs-beta' => 'Bètafunksies',
 'prefs-datetime' => 'Daotum en tied',
 'prefs-labs' => 'Alphafunksies',
+'prefs-user-pages' => 'Gebrukersziejen',
 'prefs-personal' => 'Gebrukersgegevens',
 'prefs-rc' => 'Leste wiezigingen',
 'prefs-watchlist' => 'Volglieste',
 'prefs-watchlist-days' => 'Antal dagen in de volglieste bekieken:',
-'prefs-watchlist-days-max' => 'Maximaal $1 {{PLURAL:$1|dag|dagen}}',
+'prefs-watchlist-days-max' => 'Hooguut $1 {{PLURAL:$1|dag|dagen}}',
 'prefs-watchlist-edits' => 'Antal wiezigingen in de uutebreiden volglieste:',
 'prefs-watchlist-edits-max' => 'Maximale antal: 1.000',
 'prefs-watchlist-token' => 'Volgliestesleutel',
@@ -1349,7 +1370,7 @@ Kiek de logboeken nao.',
 'prefs-changeemail' => 'Netpostadres wiezigen',
 'prefs-setemail' => 'Stel n netpostadres in',
 'prefs-email' => 'Instellingen veur netpost',
-'prefs-rendering' => 'Paginaweergave',
+'prefs-rendering' => 'Ziedweergave',
 'saveprefs' => 'Veurkeuren opslaon',
 'resetprefs' => 'Standardveurkeuren herstellen',
 'restoreprefs' => 'Alle standardinstellingen weerummezetten',
@@ -1358,13 +1379,13 @@ Kiek de logboeken nao.',
 'rows' => 'Regels',
 'columns' => 'Kolommen',
 'searchresultshead' => 'Zeukresultaoten',
-'resultsperpage' => 'Antal zeukresultaoten per pagina',
+'resultsperpage' => 'Antal zeukresultaoten per zied',
 'stub-threshold' => 'Verwiezingsformattering van <a href="#" class="stub">beginnetjes</a>:',
-'stub-threshold-disabled' => 'uuteschakeld',
-'recentchangesdays' => 'Antal dagen die de lieste "leste wiezigingen" laot zien:',
-'recentchangesdays-max' => '(maximaal $1 {{PLURAL:$1|dag|dagen}})',
+'stub-threshold-disabled' => 'uutezet',
+'recentchangesdays' => 'Antal dagen die "Leste wiezigingen" löt zien:',
+'recentchangesdays-max' => '(hooguut $1 {{PLURAL:$1|dag|dagen}})',
 'recentchangescount' => 'Standard antal bewarkingen um te laoten zien:',
-'prefs-help-recentchangescount' => "Dit geldt veur leste wiezigingen, paginageschiedenisse en logboekpagina's",
+'prefs-help-recentchangescount' => 'Dit geldt veur leste wiezigingen, ziedgeschiedenisse en logboekziejen',
 'prefs-help-watchlist-token' => "A'j in dit veld n geheime kode invullen, dan maakt t RSS-voer an veur joew volglieste.
 Iederene die disse kode weet kan joew volglieste bekieken, kies dus n veilige kode.
 Je kunnen oek disse egenereren standardkode gebruken: $1",
@@ -1395,7 +1416,7 @@ Je kunnen oek disse egenereren standardkode gebruken: $1",
 'prefs-custom-css' => 'Persoonlike CSS',
 'prefs-custom-js' => 'Persoonlike JS',
 'prefs-common-css-js' => 'Edeelden CSS/JS veur elke vormgeving:',
-'prefs-reset-intro' => 'Je kunnen disse pagina gebruken um joew veurkeuren naor de standardinstellingen weerumme te zetten.
+'prefs-reset-intro' => 'Je kunnen disse zied gebruken um joew veurkeuren naor de standardinstellingen weerumme te zetten.
 Disse haandeling kan niet ongedaonemaakt wörden.',
 'prefs-emailconfirm-label' => 'Netpostbevestiging:',
 'prefs-textboxsize' => 'Aofmetingen bewarkingsscharm',
@@ -1407,9 +1428,9 @@ Disse haandeling kan niet ongedaonemaakt wörden.',
 'yourrealname' => 'Echte naam (niet verplicht)',
 'yourlanguage' => 'Taal veur systeemteksten',
 'yourvariant' => 'Taalvariaant veur inhoud:',
-'prefs-help-variant' => "Joew veurkeursvariaant of -spelling um de inhoudspagina's van disse wiki in weer te geven.",
+'prefs-help-variant' => 'Joew veurkeursvariaant of -spelling um de inhoudsziejen van disse wiki in weer te geven.',
 'yournick' => 'Alias veur ondertekeningen',
-'prefs-help-signature' => 'Reaksies op de overlegpagina\'s mutten ondertekend wörden mit "<nowiki>~~~~</nowiki>", dit wörden dan ummezet in joew ondertekening mit daorbie de daotum en tied van de bewarking.',
+'prefs-help-signature' => 'Reaksies op de overlegziejen mutten ondertekend wörden mit "<nowiki>~~~~</nowiki>", dit wörden dan ummezet in joew ondertekening mit daorbie de daotum en tied van de bewarking.',
 'badsig' => 'Ongeldige haandtekening; HTML naokieken.',
 'badsiglength' => 'Joew haandtekening is te lang.
 t Mut minder as {{PLURAL:$1|letter|letters}} hebben.',
@@ -1422,7 +1443,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'email' => 'Privéberichten',
 'prefs-help-realname' => "* Echte naam (niet verplicht): a'j disse opsie invullen zu'w joew echte naam gebruken um erkenning te geven veur joew warkzaamheen.",
 'prefs-help-email' => "n Netpostadres is niet verplicht, mer zo ku'w wel joew wachtwoord toesturen veur a'j t vergeten bin.",
-'prefs-help-email-others' => "Je kunnen oek aandere meensen de meugelikheid geven um kontakt mit joe op te nemen mit n verwiezing op joew gebrukers- en overlegpagina zonder da'j de identiteit pries hoeven te geven.",
+'prefs-help-email-others' => "Je kunnen oek aandere meensen de meugelikheid geven um kontakt mit joe op te nemen mit n verwiezing op joew gebrukers- en overlegzied zonder da'j de identiteit pries hoeven te geven.",
 'prefs-help-email-required' => "Hier he'w n netpostadres veur neudig.",
 'prefs-info' => 'Baosisinformasie',
 'prefs-i18n' => 'Taalinstellingen',
@@ -1490,63 +1511,64 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'grouppage-suppress' => '{{ns:project}}:Toezichte',
 
 # Rights
-'right-read' => "Pagina's bekieken",
-'right-edit' => "Pagina's bewarken",
-'right-createpage' => "Pagina's anmaken",
-'right-createtalk' => "Overlegpagina's anmaken",
+'right-read' => 'Ziejen bekieken',
+'right-edit' => 'Ziejen bewarken',
+'right-createpage' => 'Ziejen anmaken',
+'right-createtalk' => 'Overlegziejen anmaken',
 'right-createaccount' => 'Nieje gebrukers anmaken',
 'right-minoredit' => 'Bewarkingen markeren as klein',
-'right-move' => "Pagina's herneumen",
-'right-move-subpages' => "Pagina's samen mit subpagina's verplaotsen",
-'right-move-rootuserpages' => "Gebrukerspagina's van t hoogste nivo herneumen",
+'right-move' => 'Ziejen herneumen',
+'right-move-subpages' => 'Ziejen samen mit de ziejen die deronder hangen verplaotsen',
+'right-move-rootuserpages' => 'Gebrukersziejen van t hoogste nivo herneumen',
 'right-movefile' => 'Bestaanden herneumen',
-'right-suppressredirect' => 'Gien deurverwiezing anmaken op de ouwe naam as n pagina herneumd wörden',
+'right-suppressredirect' => 'Gien deurverwiezing anmaken op de ouwe naam as n zied herneumd wörden',
 'right-upload' => 'Bestaanden opsturen',
 'right-reupload' => 'n Bestaond bestaand overschrieven',
 'right-reupload-own' => "Bestaanden overschrieven die'j der zelf bie ezet hebben",
 'right-reupload-shared' => 'Media uut de edeelden mediadatabanke plaotselik overschrieven',
 'right-upload_by_url' => 'Bestaanden inlaojen via n webadres',
-'right-purge' => 't Tussengeheugen van n pagina legen',
+'right-purge' => 't Tussengeheugen van n zied legen',
 'right-autoconfirmed' => 'Behaandeld wörden as n an-emelde gebruker',
 'right-bot' => 'Behaandeld wörden as n eautomatiseerd preces',
-'right-nominornewtalk' => "Kleine bewarkingen an n overlegpagina leien niet tot n melding 'nieje berichten'",
+'right-nominornewtalk' => "Kleine bewarkingen an n overlegzied leien niet tot n melding 'nieje berichten'",
 'right-apihighlimits' => 'Hoge API-limieten gebruken',
 'right-writeapi' => 'Bewarken via de API',
-'right-delete' => "Pagina's vortdoon",
-'right-bigdelete' => "Pagina's mit n grote geschiedenisse vortdoon",
-'right-deleterevision' => "Versies van pagina's verbargen",
+'right-delete' => 'Ziejen vortdoon',
+'right-bigdelete' => 'Ziejen mit n grote geschiedenisse vortdoon',
+'right-deletelogentry' => 'Bepaolde logboekregels vortdoon en weerummeplaotsen',
+'right-deleterevision' => 'Versies van ziejen verbargen',
 'right-deletedhistory' => 'Vortedaone versies bekieken, zonder te kunnen zien wat der vortedaon is',
 'right-deletedtext' => 'Bekiek vortedaone tekste en wiezigingen tussen vortedaone versies',
-'right-browsearchive' => "Vortedaone pagina's bekieken",
-'right-undelete' => "Vortedaone pagina's weerummeplaotsen",
+'right-browsearchive' => 'Vortedaone ziejen bekieken',
+'right-undelete' => 'Vortedaone ziejen weerummeplaotsen',
 'right-suppressrevision' => 'Verbörgen versies bekieken en weerummeplaotsen',
 'right-suppressionlog' => 'Niet-publieke logboeken bekieken',
 'right-block' => 'Aandere gebrukers de meugelikheid ontnemen um te bewarken',
 'right-blockemail' => 'n Gebruker t recht ontnemen um berichjes te versturen',
-'right-hideuser' => 'n Gebruker veur de overige gebrukers verbargen',
+'right-hideuser' => 'n Gebruker veur de aandere gebrukers verbargen',
 'right-ipblock-exempt' => 'IP-blokkeringen ummezeilen',
 'right-proxyunbannable' => "Blokkeringen veur proxy's gelden niet",
 'right-unblockself' => 'Eigen gebruker deblokkeren',
 'right-protect' => "Beveiligingsnivo's wiezigen",
-'right-editprotected' => "Beveiligden pagina's bewarken",
+'right-editprotected' => 'Beveiligden ziejen bewarken',
 'right-editinterface' => 't {{SITENAME}}-uterlik bewarken',
 'right-editusercssjs' => 'De CSS- en JS-bestaanden van aandere gebrukers bewarken',
 'right-editusercss' => 'De CSS-bestaanden van aandere gebrukers bewarken',
 'right-edituserjs' => 'De JS-bestaanden van aandere gebrukers bewarken',
-'right-rollback' => 'Gauw de leste bewarking(en) van n gebruker an n pagina weerummedreien',
+'right-rollback' => 'Gauw de leste bewarking(en) van n gebruker an n zied weerummedreien',
 'right-markbotedits' => 'Weerummedreien bewarkingen markeren as botbewarkingen',
 'right-noratelimit' => 'Hef gien tiedsaofhankelike beparkingen',
-'right-import' => "Pagina's uut aandere wiki's invoeren",
-'right-importupload' => "Pagina's vanuut n bestaand invoeren",
-'right-patrol' => 'Bewarkingen as ekontroleerd markeren',
-'right-autopatrol' => 'Bewarkingen wörden automaties as ekontroleerd emarkeerd',
-'right-patrolmarks' => 'Kontroletekens in leste wiezigingen bekieken',
-'right-unwatchedpages' => "Bekiek n lieste mit pagina's die niet op n volglieste staon",
-'right-mergehistory' => "De geschiedenisse van pagina's bie mekaar doon",
+'right-import' => "Ziejen uut aandere wiki's invoeren",
+'right-importupload' => 'Ziejen vanuut n bestaand invoeren',
+'right-patrol' => 'Bewarkingen as nao-ekeken markeren',
+'right-autopatrol' => 'Bewarkingen wörden automaties op nao-ekeken ezet',
+'right-patrolmarks' => 'Naokiektekens in "Leste wiezigingen" bekieken',
+'right-unwatchedpages' => 'Bekiek n lieste mit ziejen die niet op n volglieste staon',
+'right-mergehistory' => 'De geschiedenisse van ziejen bie mekaar doon',
 'right-userrights' => 'Alle gebrukersrechten bewarken',
 'right-userrights-interwiki' => "Gebrukersrechten van gebrukers in aandere wiki's wiezigen",
 'right-siteadmin' => 'De databanke blokkeren en weer vriegeven',
-'right-override-export-depth' => "Pagina's uutvoeren, oek de pagina's waor naor verwezen wörden, tot n diepte van 5",
+'right-override-export-depth' => 'Ziejen uutvoeren, oek de ziejen waor naor verwezen wörden, tot n diepte van 5',
 'right-sendemail' => 'Bericht versturen naor aandere gebrukers',
 'right-passwordreset' => 'Bekiek netpostberichten veur t opniej instellen van joew wachtwoord',
 
@@ -1558,37 +1580,37 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'rightsnone' => '(gien)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'disse pagina lezen',
-'action-edit' => 'disse pagina bewarken',
-'action-createpage' => "pagina's schrieven",
-'action-createtalk' => "overlegpagina's anmaken",
+'action-read' => 'disse zied lezen',
+'action-edit' => 'disse zied bewarken',
+'action-createpage' => 'ziejen schrieven',
+'action-createtalk' => 'overlegziejen anmaken',
 'action-createaccount' => 'disse gebruker anmaken',
 'action-minoredit' => 'disse bewarking as klein markeren',
-'action-move' => 'disse pagina herneumen',
-'action-move-subpages' => "disse pagina en de biebeheurende subpagina's herneumen",
-'action-move-rootuserpages' => "gebrukerspagina's van t hoogste nivo herneumen",
+'action-move' => 'disse zied herneumen',
+'action-move-subpages' => 'disse zied en de biebeheurende ziejen die deronder hangen herneumen',
+'action-move-rootuserpages' => 'gebrukersziejen van t hoogste nivo herneumen',
 'action-movefile' => 'dit bestaand herneumen',
 'action-upload' => 'dit bestaand opsturen',
 'action-reupload' => 'dit bestaonde bestaand overschrieven',
 'action-reupload-shared' => 'n aander bestaand over dit bestaand uut de edeelden mediadatabanke hinne zetten.',
 'action-upload_by_url' => 'dit bestaand vanaof n webadres inlaojen',
 'action-writeapi' => 'de schrief-API bewarken',
-'action-delete' => 'disse pagina vortdoon',
+'action-delete' => 'disse zied vortdoon',
 'action-deleterevision' => 'disse versie vortdoon',
-'action-deletedhistory' => 'de vortedaone versies van disse pagina bekieken',
-'action-browsearchive' => "vortedaone pagina's zeuken",
-'action-undelete' => 'disse pagina weerummeplaotsen',
+'action-deletedhistory' => 'de vortedaone versies van disse zied bekieken',
+'action-browsearchive' => 'vortedaone ziejen zeuken',
+'action-undelete' => 'disse zied weerummeplaotsen',
 'action-suppressrevision' => 'disse verbörgen versie bekieken en weerummeplaotsen',
 'action-suppressionlog' => 'dit bescharmde logboek bekieken',
 'action-block' => 'disse gebruker blokkeren',
-'action-protect' => 't beveiligingsnivo van disse pagina anpassen',
-'action-rollback' => 'bewarkingen van de leste gebruker die n pagina hef ewiezigd rap weerummedreien',
-'action-import' => 'disse pagina van n aandere wiki invoeren',
-'action-importupload' => 'disse pagina invoeren vanaof n op-estuurd bestaand',
-'action-patrol' => 'bewarkingen van aander volk as ekontroleerd markeren',
-'action-autopatrol' => 'eigen bewarkingen as ekontroleerd markeren',
-'action-unwatchedpages' => "bekiek de liest mit pagina's die niet evolgd wörden",
-'action-mergehistory' => 'de geschiedenisse van disse pagina samenvoegen',
+'action-protect' => 't beveiligingsnivo van disse zied anpassen',
+'action-rollback' => 'bewarkingen van de leste gebruker die n zied hef ewiezigd rap weerummedreien',
+'action-import' => 'disse zied van n aandere wiki invoeren',
+'action-importupload' => 'disse zied invoeren vanaof n op-estuurd bestaand',
+'action-patrol' => 'bewarkingen van aandere luui op nao-ekeken zetten',
+'action-autopatrol' => 'eigen bewarkingen op nao-ekeken zetten',
+'action-unwatchedpages' => 'bekiek de lieste mit ziejen die niet evolgd wörden',
+'action-mergehistory' => 'de geschiedenisse van disse zied samenvoegen',
 'action-userrights' => 'alle gebrukersrechten bewarken',
 'action-userrights-interwiki' => "de rechten van gebrukers op aandere wiki's bewarken",
 'action-siteadmin' => 'de databanke blokkeren of vriegeven',
@@ -1598,9 +1620,9 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'nchanges' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
 'recentchanges' => 'Leste wiezigingen',
 'recentchanges-legend' => 'Opsies veur leste wiezigingen',
-'recentchanges-summary' => 'Op disse pagina ku-j de leste wiezigingen van disse wiki bekieken.',
+'recentchanges-summary' => "Op disse zied ku'j de leste wiezigingen van disse wiki bekieken.",
 'recentchanges-feed-description' => 'Zeuk naor de alderleste wiezingen op disse wiki in disse voer.',
-'recentchanges-label-newpage' => 'Mit disse bewarking is n nieje pagina an-emaakt',
+'recentchanges-label-newpage' => 'Mit disse bewarking is n nieje zied an-emaakt',
 'recentchanges-label-minor' => 'Dit is n kleine wieziging',
 'recentchanges-label-bot' => 'Disse bewarking is uutevoerd deur n bot',
 'recentchanges-label-unpatrolled' => 'Disse bewarking is nog niet nao-ekeken',
@@ -1636,29 +1658,29 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'recentchangeslinked-feed' => 'Volg verwiezigingen',
 'recentchangeslinked-toolbox' => 'Volg verwiezigingen',
 'recentchangeslinked-title' => 'Wiezigingen verwaant an $1',
-'recentchangeslinked-noresult' => 'Gien wiezigingen of pagina waornaor verwezen wörden in disse periode.',
-'recentchangeslinked-summary' => "Op disse spesiale pagina steet n lieste mit de leste wieziginen op pagina's waornaor verwezen wörden. Pagina's op [[Special:Watchlist|joew volglieste]] staon '''vet-edrokt'''.",
-'recentchangeslinked-page' => 'Paginanaam:',
-'recentchangeslinked-to' => "Bekiek wiezigingen op pagina's mit verwiezingen naor disse pagina",
+'recentchangeslinked-noresult' => 'Gien wiezigingen of zied waornaor verwezen wörden in disse periode.',
+'recentchangeslinked-summary' => "Op disse spesiale zied steet n lieste mit de leste wieziginen op ziejen waornaor verwezen wörden. Ziejen op [[Special:Watchlist|joew volglieste]] staon '''vet-edrokt'''.",
+'recentchangeslinked-page' => 'Ziednaam:',
+'recentchangeslinked-to' => 'Bekiek wiezigingen op ziejen mit verwiezingen naor disse zied',
 
 # Upload
 'upload' => 'Bestaand opsturen',
 'uploadbtn' => 'Bestaand opsturen',
-'reuploaddesc' => 'Weerumme naor t bestaandinlaodformulier.',
+'reuploaddesc' => 'Weerumme naor de opstuurzied',
 'upload-tryagain' => 'Bestaandsbeschrieving biewarken',
 'uploadnologin' => 'Niet an-emeld',
 'uploadnologintext' => 'Je mutten [[Special:UserLogin|an-emeld]] ween um bestaanden toe te kunnen voegen.',
-'upload_directory_missing' => 'De bestaandinlaodmap ($1) is vort en kon niet an-emaakt wörden deur de webserver.',
+'upload_directory_missing' => 'De inlaojmap veur bestaanden ($1) is vort en kon niet an-emaakt wörden deur de webserver.',
 'upload_directory_read_only' => "Op t moment ku'j gien bestaanden opsturen vanwegen techniese problemen ($1).",
 'uploaderror' => 'Fout bie t inlaojen van t bestaand',
 'upload-recreate-warning' => "'''Waorschuwing: der is n bestaand mit disse naam vortedaon of herneumd.'''
 
-Hieronder steet t vortdologboek en t herneumlogboek veur disse pagina:",
+Hieronder steet t vortdologboek en t herneumlogboek veur disse zied:",
 'uploadtext' => "Gebruuk t formulier hieronder um bestaanden op te sturen.
 Um bestaanden te bekieken of te zeuken die eerder al op-estuurd bin, ku'j naor de [[Special:FileList|bestaandslieste]] gaon.
 Bestaanden en media die nao t vortdoon opniej op-estuurd wörden ku'j in de smiezen houwen in t [[Special:Log/upload|logboek mit nieje bestaanden]] en t [[Special:Log/delete|vortdologboek]].
 
-Um t bestaand in te voegen in n pagina ku'j één van de volgende kodes gebruken:
+Um t bestaand in te voegen in n zied ku'j één van de volgende kodes gebruken:
 * '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Bestaand.jpg]]</nowiki>'''
 * '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Bestaand.png|alternetieve tekste]]</nowiki>'''
 * '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Bestaand.ogg]]</nowiki>''' drekte verwiezing naor n bestaand.",
@@ -1704,20 +1726,20 @@ Zie de [[Special:NewFiles|uutstalling mit media]] veur n overzichte.',
 'largefileserver' => 't Bestaand is groter as dat de server toesteet.',
 'emptyfile' => "t Bestaand da'j op-estuurd hebben is leeg. Dit kan koemen deur n tikfout in de bestaandsnaam. Kiek effen nao o'j dit bestaand wel bedoelden.",
 'windows-nonascii-filename' => 'Disse wiki ondersteunt gien bestaandsnamen mit spesiale tekens.',
-'fileexists' => "n Bestaand mit disse naam besteet al; voeg t bestaand onder n aandere naam toe.
-'''<tt>[[:$1]]</tt>''' [[$1|thumb]]",
-'filepageexists' => "De beschrievingspagina veur dit bestaand bestung al op '''<tt>[[:$1]]</tt>''', mer der besteet nog gien bestaand mit disse naam.
-De samenvatting die'j op-egeven hebben zal niet op de beschrievingspagina koemen.
-Bewark de pagina haandmaotig um joew beschrieving daor weer te geven.
+'fileexists' => 'n Bestaand mit disse naam besteet al; voeg t bestaand onder n aandere naam toe.
+<strong>[[:$1]]</strong> [[$1|thumb]]',
+'filepageexists' => "De beschrievingszied veur dit bestaand bestung al op <strong>[[:$1]]</strong>, mer der besteet nog gien bestaand mit disse naam.
+De samenvatting die'j op-egeven hebben zal niet op de beschrievingszied koemen.
+Bewark de zied haandmaotig um joew beschrieving daor weer te geven.
 [[$1|thumb]]",
 'fileexists-extension' => "n Bestaand mit n soortgelieke naam besteet al: [[$2|thumb]]
-* Naam van t bestaand da'j derbie zetten wollen: '''<tt>[[:$1]]</tt>'''
-* Naam van t bestaonde bestaand: '''<tt>[[:$2]]</tt>'''
+* Naam van t bestaand da'j derbie zetten wollen: <strong>[[:$1]]</strong>
+* Naam van t bestaonde bestaand: <strong>[[:$2]]</strong>
 Kies n aandere naam.",
 'fileexists-thumbnail-yes' => "Dit bestaand is n aofbeelding waorvan de grootte verkleind is ''(miniatuuraofbeelding)''. [[$1|thumb]]
-Kiek t bestaand nao <strong><tt>[[:$1]]</tt></strong>.
+Kiek t bestaand nao <strong><strong>[[:$1]]</strong></strong>.
 As de aofbeelding die'j krek nao-ekeken hebben de zelfde grootte hef, dan is t niet neudig um t opniej toe te voegen.",
-'file-thumbnail-no' => "De bestaandsnaam begint mit '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "De bestaandsnaam begint mit <strong>$1</strong>.
 Dit is warschienlik n verkleinde aofbeelding ''(overzichsaofbeelding)''.
 A'j disse aofbeelding in volle grootte hebben voeg t dan toe, wiezig aanders de bestaandsnaam.",
 'fileexists-forbidden' => 'n Bestaand mit disse naam besteet al, en kan niet overschreven wörden.
@@ -1734,11 +1756,11 @@ Bekiek t vortdologboek veurda'j veurdan gaon.",
 'savefile' => 'Bestaand opslaon',
 'uploadedimage' => 'Op-estuurd: [[$1]]',
 'overwroteimage' => 'Nieje versie van "[[$1]]" op-estuurd',
-'uploaddisabled' => 't Opsturen van bestaanden is uuteschakeld.',
-'copyuploaddisabled' => 't Opsturen van bestaanden via n webadres is uuteschakeld.',
+'uploaddisabled' => 't Opsturen van bestaanden is uutezet.',
+'copyuploaddisabled' => 't Opsturen van bestaanden via n webadres is uutezet.',
 'uploadfromurl-queued' => 'Joew bestaand is in de wachtrie ezet.',
-'uploaddisabledtext' => 't Opsturen van bestaanden is uuteschakeld.',
-'php-uploaddisabledtext' => 't Opsturen van PHP-bestaanden is uuteschakeld. Kiek de instellingen veur t opsturen van bestaanden effen nao.',
+'uploaddisabledtext' => 't Opsturen van bestaanden is uutezet.',
+'php-uploaddisabledtext' => 't Opsturen van PHP-bestaanden is uutezet. Kiek de instellingen veur t opsturen van bestaanden effen nao.',
 'uploadscripted' => 'In dit bestaand steet HTML- of skriptkode die verkeerd elezen kan wörden deur de webkieker.',
 'uploadvirus' => 'In dit bestaand zit n virus! Gegevens: $1',
 'uploadjava' => 't Bestaand is n ZIP-bestaand waor n Java .class-bestaand in zit.
@@ -1761,7 +1783,7 @@ t Inlaojen van Java-bestaanden is niet toe-estaon umdat hiermee beveiligingsinst
 $1',
 'upload-warning-subj' => 'Waorschuwing veur t opsturen van bestaanden',
 'upload-warning-msg' => 'Der was n probleem mit t inlaojen van t bestaand [$2].
-Gao weerumme naor t [[Special:Upload/stash/$1|bestaandinlaodformulier]] um dit probleem te verhelpen.',
+Gao weerumme naor t [[Special:Upload/stash/$1|opstuurformulier]] um dit probleem te verhelpen.',
 
 'upload-proto-error' => 'Verkeerd protokol',
 'upload-proto-error-text' => 'Um op disse maniere bestaanden toe te voegen mutten webadressen beginnen mit <code>http://</code> of <code>ftp://</code>.',
@@ -1792,14 +1814,15 @@ As t probleem zo blif, neem dan kontakt op mit één van de [[Special:ListUsers/
 'backend-fail-writetemp' => 'Kon niet naor n tiedelik bestaand schrieven.',
 'backend-fail-closetemp' => 'Kon niet n tiedelik bestaand sluten.',
 'backend-fail-read' => 'Kon t bestaand $1 niet lezen.',
-'backend-fail-create' => 'Kon t bestaand $1 niet anmaken.',
-'backend-fail-maxsize' => 'Kon t bestaand $1 niet anmaken umdat t groter is as {{PLURAL:$2|één byte|$2 bytes}}.',
+'backend-fail-create' => 'Kon t bestaand $1 niet schrieven.',
+'backend-fail-maxsize' => 'Kon t bestaand $1 niet schrieven umdat t groter is as {{PLURAL:$2|één byte|$2 bytes}}.',
 'backend-fail-readonly' => 'Van de opslag "$1" kan op dit moment allinnig elezen wörden. De op-egeven reden was: "$2"',
 'backend-fail-synced' => 't Bestaand "$1" bevient zich in n inkonsistente toestaand in de interne opslagbackends.',
 'backend-fail-connect' => 'Kon gien verbiending maken mit t opslagbackend "$1".',
 'backend-fail-internal' => 'Der is n onbekende fout op-etreden in t opslagbackend "$1".',
 'backend-fail-contenttype' => 'Kon t inhoudstype van t bestaand um op "$1" op te slaon niet bepaolen.',
 'backend-fail-batchsize' => 'Reeks van $1 bestaands{{PLURAL:$1|operasie|operasies}} in de opslagbackend; de limiet is $2 {{PLURAL:$2|operasie|operasies}}.',
+'backend-fail-usable' => 'Kon t bestaand $1 niet schrieven vanwegen te min rechten of niet-anwezige mappen of houwers.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Kon gien verbiending maken mit de journaaldatabanke veur t opslagbackend "$1".',
@@ -1814,22 +1837,23 @@ As t probleem zo blif, neem dan kontakt op mit één van de [[Special:ListUsers/
 'lockmanager-fail-releaselock' => 'Kon vergrendeling van "$1" der niet aof haolen.',
 'lockmanager-fail-db-bucket' => 'Kon niet in kontakt koemen mit genog vergrendelingsdatabanken in de nemmer $1.',
 'lockmanager-fail-db-release' => 'Kon de vergrendeling veur de databanke $1 niet deraof haolen.',
+'lockmanager-fail-svr-acquire' => 'Kon gien vergrendeling op server $1 zetten.',
 'lockmanager-fail-svr-release' => 'Kon de vergrendeling veur de server $1 der niet aof haolen.',
 
 # ZipDirectoryReader
-'zip-file-open-error' => 'Der is wat fout egaon bie t los doon van t bestaand veur de ZIP-kontrole.',
+'zip-file-open-error' => 'Der is wat fout egaon bie t los doon van t bestaand veur de ZIP-kontraole.',
 'zip-wrong-format' => 't Op-egeven bestaand was gien ZIP-bestaand.',
 'zip-bad' => 't Bestaand is beschaodig of is n onleesbaor ZIP-bestaand.
-De veiligheid kan niet ekontroleerd wörden.',
+De veiligheid kan niet nao-ekeken wörden.',
 'zip-unsupported' => 't Bestaand is n ZIP-bestaand dat gebruukmaak van ZIP-meugelikheen die MediaWiki niet ondersteunt.
-De veiligheid kan niet ekontroleerd wörden.',
+De veiligheid kan niet nao-ekeken wörden.',
 
 # Special:UploadStash
 'uploadstash' => 'Verbörgen bestaanden',
-'uploadstash-summary' => 'Disse pagina geef toegang tot bestaanden die op-estuurd bin of nog op-estuurd wörden mer nog niet beschikbaor emaakt bin op de wiki. Disse bestaanden bin allinnig zichtbaor veur de gebruker die ze opstuurt.',
+'uploadstash-summary' => 'Disse zied gif toegang tot bestaanden die op-estuurd bin of nog op-estuurd wörden mer nog niet beschikbaor emaakt bin op de wiki. Disse bestaanden bin allinnig zichtbaor veur de gebruker die ze opstuurt.',
 'uploadstash-clear' => 'Verbörgen bestaanden vortdoon',
 'uploadstash-nofiles' => 'Der bin gien verbörgen bestaanden.',
-'uploadstash-badtoken' => 't Uutvoeren van de haandeling is mislokt. Dit kump warschienlik deurdat joew bewarkingsreferensies verleupen bin. Probeer t opniej.',
+'uploadstash-badtoken' => 't Uutvoeren van de haandeling is mislokt. Dit kömp waorschienlik deurdat joew bewarkingsreferensies verleupen bin. Probeer t opniej.',
 'uploadstash-errclear' => 't Vortdoon van de bestaanden is mislokt.',
 'uploadstash-refresh' => 'Lieste mit bestaanden biewarken',
 'invalid-chunk-offset' => 'Ongeldig startpunt',
@@ -1840,8 +1864,8 @@ De veiligheid kan niet ekontroleerd wörden.',
 Joew server is niet in-esteld um disse informasie deur te geven.
 Misschien gebruukt t CGI, en dan wörden img_auth niet ondersteund.
 Zie https://www.mediawiki.org/wiki/Manual:Image_Authorization veur meer informasie.',
-'img-auth-notindir' => 't Op-evreugen pad is niet de in-estelde bestaandinlaodmap',
-'img-auth-badtitle' => 'Kon gien geldige paginanaam maken van "$1".',
+'img-auth-notindir' => 't Op-evreugen pad is niet bekend in de in-estelden inlaojmap',
+'img-auth-badtitle' => 'Kon gien geldige ziednaam maken van "$1".',
 'img-auth-nologinnWL' => 'Je bin niet an-emeld en "$1" steet niet op de witte lieste.',
 'img-auth-nofile' => 'Bestaand "$1" besteet niet.',
 'img-auth-isdir' => 'Je proberen de map "$1" binnen te koemen.
@@ -1849,7 +1873,7 @@ Allinnig toegang tot bestaanden is toe-estaon.',
 'img-auth-streaming' => 'Bezig mit t streumen van "$1".',
 'img-auth-public' => 't Doel van img_auth.php is de uutvoer van bestaanden van n besleuten wiki.
 Disse wiki is in-esteld as publieke wiki.
-Um beveiligingsredens is img_auth.php uuteschakeld.',
+Um beveiligingsredens is img_auth.php uutezet.',
 'img-auth-noread' => 'De gebruker hef gien leestoegang tot "$1".',
 'img-auth-bad-query-string' => 'In t webadres steet n ongeldige zeukopdrachte.',
 
@@ -1877,8 +1901,8 @@ Um beveiligingsredens is img_auth.php uuteschakeld.',
 'upload_source_file' => ' (een bestaand op de hardeschieve)',
 
 # Special:ListFiles
-'listfiles-summary' => "Op disse spesiale pagina ku'j alle bestaanden bekieken die lestens op-estuurd bin.
-As disse pagina efilterd wörden op gebruker, zie'j allinnig bestaanden waor de gebruker de leste versie van hef op-estuurd.",
+'listfiles-summary' => "Op disse spesiale zied ku'j alle bestaanden bekieken die lestens op-estuurd bin.
+As disse zied efilterd wörden op gebruker, zie'j allinnig bestaanden waor de gebruker de leste versie van hef op-estuurd.",
 'listfiles_search_for' => 'Zeuk naor bestaand:',
 'imgfile' => 'bestaand',
 'listfiles' => 'Bestaandslieste',
@@ -1906,11 +1930,11 @@ As disse pagina efilterd wörden op gebruker, zie'j allinnig bestaanden waor de
 'filehist-dimensions' => 'Grootte',
 'filehist-filesize' => 'Bestaandsgrootte',
 'filehist-comment' => 'Opmarkingen',
-'filehist-missing' => 'Bestaand ontbreekt',
+'filehist-missing' => 'Bestaand ontbrik',
 'imagelinks' => 'Bestaandsgebruuk',
-'linkstoimage' => "Dit bestaand wörden gebruukt op de volgende {{PLURAL:$1|pagina|$1 pagina's}}:",
+'linkstoimage' => 'Dit bestaand wörden gebruukt op de volgende {{PLURAL:$1|zied|$1 ziejen}}:',
 'linkstoimage-more' => 'Der {{PLURAL:$2|is|bin}} meer as $1 {{PLURAL:$1|verwiezing|verwiezingen}} naor dit bestaand.
-De volgende lieste geef allinnig de eerste {{PLURAL:$1|verwiezing|$1 verwiezingen}} naor dit bestaand weer.
+De volgende lieste gif allinnig de eerste {{PLURAL:$1|verwiezing|$1 verwiezingen}} naor dit bestaand weer.
 De [[Special:WhatLinksHere/$2|hele lieste]] is oek beschikbaor.',
 'nolinkstoimage' => 'Bestaand is niet in gebruuk.',
 'morelinkstoimage' => '[[Special:WhatLinksHere/$1|Meer verwiezingen]] naor dit bestaand bekieken.',
@@ -1919,6 +1943,10 @@ De [[Special:WhatLinksHere/$2|hele lieste]] is oek beschikbaor.',
 'sharedupload' => "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten.",
 'sharedupload-desc-there' => "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten. Bekiek de [$2 beschrieving van t bestaand] veur meer informasie.",
 'sharedupload-desc-here' => "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten. De [$2 beschrieving van t bestaand] dergindse, steet hieronder.",
+'sharedupload-desc-edit' => 'Dit besatand kömp van $1 en kan oek in aandere projekten gebruukt wörden.
+Je kunnen de [$2 zied mit de bestaandsbeschrieving] daor bewarken.',
+'sharedupload-desc-create' => 'Dit besatand kömp van $1 en kan oek in aandere projekten gebruukt wörden.
+Je kunnen de [$2 zied mit de bestaandsbeschrieving] daor bewarken.',
 'filepage-nofile' => 'Der besteet gien bestaand mit disse naam.',
 'filepage-nofile-link' => 'Der besteet gien bestaand mit disse naam, mer je kunnen t [$1 opsturen].',
 'uploadnewversion-linktext' => 'n Niejere versie van dit bestaand opsturen.',
@@ -1948,7 +1976,7 @@ De [[Special:WhatLinksHere/$2|hele lieste]] is oek beschikbaor.',
 'filedelete-nofile-old' => "Der is gien versie van '''$1''' in t archief mit de an-egeven eigenschappen.",
 'filedelete-otherreason' => 'Aandere reden:',
 'filedelete-reason-otherlist' => 'Aandere reden',
-'filedelete-reason-dropdown' => "*Veulveurkoemende redens veur t vortdoon van pagina's
+'filedelete-reason-dropdown' => "*Veulveurkoemende redens veur t vortdoon van ziejen
 ** Auteursrechtenschending
 ** Dit bestaand he'w dubbel",
 'filedelete-edit-reasonlist' => 'Reden veur t vortdoon bewarken',
@@ -1957,72 +1985,72 @@ De [[Special:WhatLinksHere/$2|hele lieste]] is oek beschikbaor.',
 
 # MIME search
 'mimesearch' => 'Zeuken op MIME-type',
-'mimesearch-summary' => 'Op disse spesiale pagina kunnen de bestaanden naor t MIME-type efiltreerd wörden. In de invoer mut altied t media- en subtype staon, bieveurbeeld: <tt>aofbeelding/jpeg</tt>.',
+'mimesearch-summary' => 'Op disse spesiale zied kunnen de bestaanden naor t MIME-type efiltreerd wörden. In de invoer mut altied t media- en subtype staon, bieveurbeeld: <code>aofbeelding/jpeg</code>.',
 'mimetype' => 'MIME-type:',
 'download' => 'binnenhaolen',
 
 # Unwatched pages
-'unwatchedpages' => "Pagina's die niet evolgd wörden",
+'unwatchedpages' => 'Ziejen die niet evolgd wörden',
 
 # List redirects
 'listredirects' => 'Lieste van deurverwiezingen',
 
 # Unused templates
 'unusedtemplates' => 'Ongebruukten mallen',
-'unusedtemplatestext' => 'Hieronder staon alle pagina\'s in de naamruumte "{{ns:template}}" die nargens gebruukt wörden.
+'unusedtemplatestext' => 'Hieronder staon alle ziejen in de naamruumte "{{ns:template}}" die nargens gebruukt wörden.
 Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
 'unusedtemplateswlh' => 'aandere verwiezingen',
 
 # Random page
-'randompage' => 'Zo mer n artikel',
-'randompage-nopages' => "Der staon gien pagina's in de {{PLURAL:$2|naamruumte|naamruumtes}}: $1.",
+'randompage' => 'Netzelde welk artikel',
+'randompage-nopages' => 'Der staon gien ziejen in de {{PLURAL:$2|naamruumte|naamruumtes}}: $1.',
 
 # Random redirect
-'randomredirect' => 'Zo mer n deurverwiezing',
+'randomredirect' => 'Netzelde welke deurverwiezing',
 'randomredirect-nopages' => 'Der staon gien deurverwiezingen in de naamruumte "$1".',
 
 # Statistics
 'statistics' => 'Staotistieken',
-'statistics-header-pages' => 'Paginastaotistieken',
+'statistics-header-pages' => 'Ziedstaotistieken',
 'statistics-header-edits' => 'Bewarkingsstaotistieken',
 'statistics-header-views' => 'Staotistieken bekieken',
 'statistics-header-users' => 'Gebrukerstaotistieken',
 'statistics-header-hooks' => 'Overige staotistieken',
-'statistics-articles' => "Inhouwelike pagina's",
-'statistics-pages' => "Pagina's",
-'statistics-pages-desc' => "Alle pagina's in de wiki, oek overlegpagina's, deurverwiezingen, en gao zo mer deur.",
+'statistics-articles' => 'Inhouwelike ziejen',
+'statistics-pages' => 'Ziejen',
+'statistics-pages-desc' => 'Alle ziejen in de wiki, oek overlegziejen, deurverwiezingen, en gao zo mer deur.',
 'statistics-files' => 'Bestaanden',
-'statistics-edits' => 'Paginabewarkingen vanaof t begin van {{SITENAME}}',
-'statistics-edits-average' => 'Gemiddeld antal bewarkingen per pagina',
-'statistics-views-total' => "Totaal antal weeregeven pagina's",
-'statistics-views-total-desc' => "t Bekieken van niet-bestaonde pagina's en spesiale pagina's zitten der niet bie in",
-'statistics-views-peredit' => "Weeregeven pagina's per bewarking",
+'statistics-edits' => 'Ziedbewarkingen vanaof t begin van {{SITENAME}}',
+'statistics-edits-average' => 'Gemiddeld antal bewarkingen per zied',
+'statistics-views-total' => 'Totaal antal weeregeven ziejen',
+'statistics-views-total-desc' => 't Bekieken van niet-bestaonde ziejen en spesiale ziejen zitten der niet bie in',
+'statistics-views-peredit' => 'Weeregeven ziejen per bewarking',
 'statistics-users' => 'In-eschreven [[Special:ListUsers|gebrukers]]',
 'statistics-users-active' => 'Aktieve gebrukers',
 'statistics-users-active-desc' => 'Gebrukers die de veurbieje {{PLURAL:$1|dag|$1 dagen}} n haandeling uutevoerd hebben',
-'statistics-mostpopular' => "Meestbekeken pagina's",
+'statistics-mostpopular' => 'Meestbekeken ziejen',
 
-'disambiguations' => "Pagina's die verwiezen naor deurverwiespagina's",
+'disambiguations' => 'Ziejen die verwiezen naor deurverwiesziejen',
 'disambiguationspage' => 'Template:Dv',
-'disambiguations-text' => "De onderstaonde pagina's verwiezen naor n '''deurverwiespagina'''. Disse verwiezingen mutten eigenliks rechtstreeks verwiezen naor t juuste onderwarp.
+'disambiguations-text' => "De onderstaonde ziejen verwiezen naor n '''deurverwieszied'''. Disse verwiezingen mutten eigenliks rechtstreeks verwiezen naor t juuste onderwarp.
 
-Pagina's wörden ezien as n deurverwiespagina, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]]",
+Ziejen wörden ezien as n deurverwieszied, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Dubbele deurverwiezingen',
-'doubleredirectstext' => "Op disse lieste staon alle pagina's die deurverwiezen naor aandere deurverwiezingen.
-Op elke regel steet de eerste en de tweede deurverwiezing, daorachter steet de doelpagina van de tweede deurverwiezing.
-Meestentieds is leste pagina de gewunste doelpagina, waor oek de eerste pagina heer zol mutten liejen.",
+'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.
+Meestentieds is leste zied de gewunste doelzied, waor oek de eerste zied heer zol mutten liejen.',
 'double-redirect-fixed-move' => '[[$1]] is herneumd en is noen n deurverwiezing naor [[$2]]',
 'double-redirect-fixed-maintenance' => 'Verbeteren van dubbele deurverwiezing van [[$1]] naor [[$2]].',
 'double-redirect-fixer' => 'Deurverwiezingsverbeteraar',
 
 'brokenredirects' => 'Ebreuken deurverwiezingen',
-'brokenredirectstext' => 'Disse deurverwiezingen verwiezen naor n niet-bestaonde pagina.',
+'brokenredirectstext' => 'Disse deurverwiezingen verwiezen naor n niet-bestaonde zied.',
 'brokenredirects-edit' => 'bewark',
 'brokenredirects-delete' => 'vortdoon',
 
-'withoutinterwiki' => "Pagina's zonder verwiezingen naor aandere talen",
-'withoutinterwiki-summary' => "De volgende pagina's verwiezen niet naor versies in n aandere taal.",
+'withoutinterwiki' => 'Ziejen zonder verwiezingen naor aandere talen',
+'withoutinterwiki-summary' => 'De volgende ziejen verwiezen niet naor versies in n aandere taal.',
 'withoutinterwiki-legend' => 'Veurvoegsel',
 'withoutinterwiki-submit' => 'Bekieken',
 
@@ -2035,44 +2063,44 @@ Meestentieds is leste pagina de gewunste doelpagina, waor oek de eerste pagina h
 'nmembers' => '$1 {{PLURAL:$1|onderwarp|onderwarpen}}',
 'nrevisions' => '$1 {{PLURAL:$1|versie|versies}}',
 'nviews' => '{{PLURAL:$1|1 keer|$1 keer}} bekeken',
-'nimagelinks' => "Wörden op {{PLURAL:$1|één pagina|$1 pagina's}} gebruukt",
-'ntransclusions' => "wörden op {{PLURAL:$1|één pagina|$1 pagina's}} gebruukt",
-'specialpage-empty' => 'Disse pagina is leeg.',
-'lonelypages' => "Weespagina's",
-'lonelypagestext' => "Naor disse pagina's wörden niet verwezen vanuut {{SITENAME}} en ze bin oek nargens in-evoegd.",
-'uncategorizedpages' => "Pagina's zonder kategorie",
+'nimagelinks' => 'Wörden op {{PLURAL:$1|één zied|$1 ziejen}} gebruukt',
+'ntransclusions' => 'wörden op {{PLURAL:$1|één zied|$1 ziejen}} gebruukt',
+'specialpage-empty' => 'Disse zied is leeg.',
+'lonelypages' => 'Weesziejen',
+'lonelypagestext' => 'Naor disse ziejen wörden niet verwezen vanuut {{SITENAME}} en ze bin oek nargens in-evoegd.',
+'uncategorizedpages' => 'Ziejen zonder kategorie',
 'uncategorizedcategories' => 'Kategorieën zonder kategorie',
 'uncategorizedimages' => 'Bestaanden zonder kategorie',
 'uncategorizedtemplates' => 'Mallen zonder kategorie',
 'unusedcategories' => 'Ongebruukten kategorieën',
 'unusedimages' => 'Ongebruukten bestaanden',
-'popularpages' => 'Populaire artikels',
+'popularpages' => 'Populaere artikels',
 'wantedcategories' => 'Gewunste kategorieën',
-'wantedpages' => "Gewunste pagina's",
-'wantedpages-badtitle' => 'Ongeldige paginanaam in resultaot: $1',
+'wantedpages' => 'Gewunste ziejen',
+'wantedpages-badtitle' => 'Ongeldige ziednaam in resultaot: $1',
 'wantedfiles' => 'Gewunste bestaanden',
-'wantedfiletext-cat' => "De volgende bestaanden wörden gebruukt mer bestaon niet. Bestaanden van externe databanken kunnen op-eneumen ween in de lieste, ondanks dat ze bestaon. Soortgelieke vals positieven wörden <del>deurehaold weeregeven</del>. Pagina's die niet-bestaonde bestaanden insluten staon op de pagina [[:$1]].",
+'wantedfiletext-cat' => 'De volgende bestaanden wörden gebruukt mer bestaon niet. Bestaanden van externe databanken kunnen op-eneumen ween in de lieste, ondanks dat ze bestaon. Soortgelieke vals positieven wörden <del>deurehaold weeregeven</del>. Ziejen die niet-bestaonde bestaanden insluten staon op de zied [[:$1]].',
 'wantedfiletext-nocat' => 'De volgende bestaanden wörden gebruukt mer bestaon niet. Bestaanden van externe databanken kunnen op-eneumen ween in de lieste, ondanks dat ze bestaon. Soortgelieke vals positieven wörden <del>deurehaold weeregeven</del>.',
 'wantedtemplates' => 'Gewunste mallen',
-'mostlinked' => "Pagina's waor t meest naor verwezen wörden",
+'mostlinked' => 'Ziejen waor t meest naor verwezen wörden',
 'mostlinkedcategories' => 'Meestgebruukten kategorieën',
 'mostlinkedtemplates' => 'Meestgebruukten mallen',
 'mostcategories' => 'Artikels mit de meeste kategorieën',
 'mostimages' => 'Meestgebruukten bestaanden',
 'mostrevisions' => 'Artikels mit de meeste bewarkingen',
-'prefixindex' => "Alle pagina's op veurvoegsel",
-'prefixindex-namespace' => "Alle pagina's mit t veurvoegsel (naamruumte $1)",
+'prefixindex' => 'Alle ziejen op veurvoegsel',
+'prefixindex-namespace' => 'Alle ziejen mit t veurvoegsel (naamruumte $1)',
 'shortpages' => 'Korte artikels',
 'longpages' => 'Lange artikels',
-'deadendpages' => "Pagina's zonder verwiezingen",
-'deadendpagestext' => "De onderstaonde pagina's verwiezen niet naor aandere pagina's in disse wiki.",
-'protectedpages' => "Pagina's die beveiligd bin",
+'deadendpages' => 'Ziejen zonder verwiezingen',
+'deadendpagestext' => 'De onderstaonde ziejen verwiezen niet naor aandere ziejen in disse wiki.',
+'protectedpages' => 'Ziejen die beveiligd bin',
 'protectedpages-indef' => 'Allinnig blokkeringen zonder verloopdaotum',
 'protectedpages-cascade' => 'Allinnig beveiligingen mit de kaskadeopsie',
-'protectedpagestext' => "De volgende pagina's bin beveiligd en kunnen niet herneumd of bewarkt wörden.",
-'protectedpagesempty' => "Der bin op t moment gien beveiligden pagina's",
-'protectedtitles' => 'Paginanamen die beveiligd bin',
-'protectedtitlestext' => "De volgende pagina's bin beveiligd, zodat ze niet opniej an-emaakt kunnen wörden",
+'protectedpagestext' => 'De volgende ziejen bin beveiligd en kunnen niet herneumd of bewarkt wörden.',
+'protectedpagesempty' => 'Der bin op t moment gien beveiligden ziejen',
+'protectedtitles' => 'Ziednamen die beveiligd bin',
+'protectedtitlestext' => 'De volgende ziejen bin beveiligd, zodat ze niet opniej an-emaakt kunnen wörden',
 'protectedtitlesempty' => 'Der bin noen gien titels beveiligd die an disse veurweerden voldoon.',
 'listusers' => 'Gebrukerslieste',
 'listusers-editsonly' => 'Allinnig gebrukers mit bewarkingen laoten zien',
@@ -2090,14 +2118,14 @@ De volgende bestaanden bin op-estuurd mer niet in gebruuk.
 t Kan ween dat der drekt verwezen wörden naor n bestaand.
 n Bestaand kan hier dus verkeerd op-eneumen ween.",
 'unusedcategoriestext' => 'De onderstaonde kategorieën bin an-emaakt mer bin niet in gebruuk.',
-'notargettitle' => 'Gien pagina op-egeven',
-'notargettext' => 'Je hebben niet op-egeven veur welke pagina je disse funksie bekieken willen.',
-'nopagetitle' => 'Doelpagina besteet niet',
-'nopagetext' => "De pagina die'j herneumen willen besteet niet.",
+'notargettitle' => 'Gien zied op-egeven',
+'notargettext' => 'Je hebben niet op-egeven veur welke zied je disse funksie bekieken willen.',
+'nopagetitle' => 'Doelzied besteet niet',
+'nopagetext' => "De zied die'j herneumen willen besteet niet.",
 'pager-newer-n' => '{{PLURAL:$1|1 niejere|$1 niejere}}',
 'pager-older-n' => '{{PLURAL:$1|1 ouwere|$1 ouwere}}',
 'suppress' => 'Toezichte',
-'querypage-disabled' => 'Disse spesiale pagina is uuteschakeld um prestasieredens.',
+'querypage-disabled' => 'Disse spesiale zied is uutezet um prestasieredens.',
 
 # Book sources
 'booksources' => 'Boekinformasie',
@@ -2108,34 +2136,41 @@ n Bestaand kan hier dus verkeerd op-eneumen ween.",
 
 # Special:Log
 'specialloguserlabel' => 'Uutvoerende gebruker:',
-'speciallogtitlelabel' => 'Doel (paginanaam of gebruker):',
+'speciallogtitlelabel' => 'Doel (ziednaam of gebruker):',
 'log' => 'Logboeken',
 'all-logs-page' => 'Alle publieke logboeken',
 'alllogstext' => 'Dit is t kombinasielogboek van {{SITENAME}}.
 Je kunnen oek kiezen veur bepaolde logboeken en filteren op gebruker (heufdlettergeveulig) en titel (heufdlettergeveulig).',
 'logempty' => 'Der steet gien passende informasie in t logboek.',
 'log-title-wildcard' => 'Zeuk naor titels die beginnen mit disse tekste:',
+'showhideselectedlogentries' => 'Ekeuzen logboekregels laoten zien of verbargen',
 
 # Special:AllPages
-'allpages' => "Alle pagina's",
+'allpages' => 'Alle ziejen',
 'alphaindexline' => '$1 tot $2',
-'nextpage' => 'Volgende pagina ($1)',
-'prevpage' => 'Veurige pagina ($1)',
-'allpagesfrom' => "Laot pagina's zien vanaof:",
-'allpagesto' => "Laot pagina's zien tot:",
+'nextpage' => 'Volgende zied ($1)',
+'prevpage' => 'Veurige zied ($1)',
+'allpagesfrom' => 'Laot ziejen zien vanaof:',
+'allpagesto' => 'Laot ziejen zien tot:',
 'allarticles' => 'Alle artikels',
-'allinnamespace' => "Alle pagina's (naamruumte $1)",
-'allnotinnamespace' => "Alle pagina's (niet in naamruumte $1)",
+'allinnamespace' => 'Alle ziejen (naamruumte $1)',
+'allnotinnamespace' => 'Alle ziejen (niet in naamruumte $1)',
 'allpagesprev' => 'veurige',
 'allpagesnext' => 'volgende',
 'allpagessubmit' => 'Zeuk',
-'allpagesprefix' => "Pagina's bekieken die beginnen mit:",
-'allpagesbadtitle' => 'De op-egeven paginanaam is ongeldig of der steet n interwikiveurvoegsel in. Meugelikerwieze staon der karakters in de naam die niet gebruukt maggen wörden in paginanamen.',
+'allpagesprefix' => 'Ziejen bekieken die beginnen mit:',
+'allpagesbadtitle' => 'De op-egeven ziednaam is ongeldig of der steet n interwikiveurvoegsel in. Meugelikerwieze staon der karakters in de naam die niet gebruukt maggen wörden in ziednamen.',
 'allpages-bad-ns' => '{{SITENAME}} hef gien "$1"-naamruumte.',
+'allpages-hide-redirects' => 'Deurverwiezingen verbargen',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Je bekieken noen n versie uut t tussengeheugen van disse zied, die hooguut $1 oud is.',
+'cachedspecial-viewing-cached-ts' => 'Je bekieken noen n versie uut t tussengeheugen van disse zied, t kan ween dat t niet helemaole bie de tied is.',
+'cachedspecial-refresh-now' => 'Leste bekieken.',
 
 # Special:Categories
 'categories' => 'Kategorieën',
-'categoriespagetext' => "De de volgende {{PLURAL:$1|kategorie steet|kategorieën staon}} pagina's of mediabestaanden.
+'categoriespagetext' => "De de volgende {{PLURAL:$1|kategorie steet|kategorieën staon}} ziejen of mediabestaanden.
 [[Special:UnusedCategories|ongebruukten kategorieën]] zie'j hier niet.
 Zie oek [[Special:WantedCategories|gewunste kategorieën]].",
 'categoriesfrom' => 'Laot kategorieën zien vanaof:',
@@ -2154,7 +2189,7 @@ Zie oek [[Special:WantedCategories|gewunste kategorieën]].",
 'linksearch-ok' => 'Zeuken',
 'linksearch-text' => 'Jokers zo as "*.wikipedia.org" of "*.org" bin toe-estaon.
 Hef tenminsten n topdomein, zo as "*.org".<br />
-Ondersteunde protokollen: <tt>$1</tt> (zet t niet in joew zeukopdrachte).',
+Ondersteunde protokollen: <code>$1</code> (zet t niet in joew zeukopdrachte).',
 'linksearch-line' => '$1 hef n verwiezing in $2',
 'linksearch-error' => 'Jokers bin allinnig toe-estaon an t begin van n webadres.',
 
@@ -2179,7 +2214,7 @@ Ondersteunde protokollen: <tt>$1</tt> (zet t niet in joew zeukopdrachte).',
 
 # Special:ListGroupRights
 'listgrouprights' => 'Rechten van gebrukersgroepen',
-'listgrouprights-summary' => "Op disse pagina staon de gebrukersgroepen van disse wiki beschreven, mit de biebeheurende rechten.
+'listgrouprights-summary' => "Op disse zied staon de gebrukersgroepen van disse wiki beschreven, mit de biebeheurende rechten.
 Meer informasie over de rechten ku'j [[{{MediaWiki:Listgrouprights-helppage}}|hier vienen]].",
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Rech toe-ewezen</span>
 * <span class="listgrouprights-revoked">Rech in-etrökken</span>',
@@ -2239,28 +2274,28 @@ De ontvanger kan dus drek beantwoorden.",
 'nowatchlist' => 'Gien artikels in volglieste.',
 'watchlistanontext' => '$1 is verplicht um joew volglieste te bekieken of te wiezigen.',
 'watchnologin' => 'Niet an-emeld',
-'watchnologintext' => "Um je volglieste an te passen mö'j eers [[Special:UserLogin|an-emeld]] ween.",
+'watchnologintext' => "Um je volglieste an te passen mu'j eerst [[Special:UserLogin|an-emeld]] ween.",
 'addwatch' => 'Op mien volglieste zetten',
-'addedwatchtext' => "De pagina \"[[:\$1]]\" steet noen op joew [[Special:Watchlist|volglieste]].
-Toekomstige wiezigingen op disse pagina en de overlegpagina zullen hier vermeld wörden, oek zullen disse pagina's '''vet-edrokt''' ween in de lieste mit de [[Special:RecentChanges|leste wiezigingen]] zoda'j t makkeliker zien kunnen.",
+'addedwatchtext' => "De zied \"[[:\$1]]\" steet noen op joew [[Special:Watchlist|volglieste]].
+Toekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wörden, oek zullen disse ziejen '''vet-edrokt''' ween in de lieste mit de [[Special:RecentChanges|leste wiezigingen]] zoda'j t makkeliker zien kunnen.",
 'removewatch' => 'Van mien volglieste aofhaolen',
-'removedwatchtext' => 'De pagina "[[:$1]]" is van [[Special:Watchlist|joew volglieste]] aofehaold.',
+'removedwatchtext' => 'De zied "[[:$1]]" is van [[Special:Watchlist|joew volglieste]] aofehaold.',
 'watch' => 'Volgen',
-'watchthispage' => 'Volg disse pagina',
+'watchthispage' => 'Volg disse zied',
 'unwatch' => 'Niet volgen',
 'unwatchthispage' => 'Niet volgen',
 'notanarticle' => 'Gien artikel',
 'notvisiblerev' => 'Bewarking is vortedaon',
-'watchnochange' => "Gien van de pagina's op joew volglieste is in disse periode ewiezigd",
-'watchlist-details' => "Der {{PLURAL:$1|steet één pagina|staon $1 pagina's}} op joew volglieste, zonder de overlegpagina's mee-erekend.",
+'watchnochange' => 'Gien van de ziejen op joew volglieste is in disse periode ewiezigd',
+'watchlist-details' => 'Der {{PLURAL:$1|steet één zied|staon $1 ziejen}} op joew volglieste, zonder de overlegziejen mee-erekend.',
 'wlheader-enotif' => 'Je kriegen bericht per netpost',
-'wlheader-showupdated' => "* Pagina's die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
-'watchmethod-recent' => "leste wiezigingen an t naokieken op pagina's die'j volgen",
+'wlheader-showupdated' => "* Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
+'watchmethod-recent' => "leste wiezigingen an t naokieken op ziejen die'j volgen",
 'watchmethod-list' => 'Kik joew nao volglieste veur de leste wiezigingen',
-'watchlistcontains' => "Der {{PLURAL:$1|steet 1 pagina|staon $1 pagina's}} op joew volglieste.",
+'watchlistcontains' => 'Der {{PLURAL:$1|steet 1 zied|staon $1 ziejen}} op joew volglieste.',
 'iteminvalidname' => "Verkeerde naam '$1'",
 'wlnote' => 'Hieronder {{PLURAL:$1|steet de leste wieziging|staon de leste $1 wiezigingen}} in {{PLURAL:$2|t aofeleupen ure|de leste $2 uren}} vanaof $3 um $4.',
-'wlshowlast' => 'Laot de aofeleupen $1 ure $2 dagen $3 zien',
+'wlshowlast' => 'Laot de veurbieje $1 uur $2 dagen $3 zien',
 'watchlist-options' => 'Opsies veur de volglieste',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2269,18 +2304,18 @@ Toekomstige wiezigingen op disse pagina en de overlegpagina zullen hier vermeld
 'watcherrortext' => 'Der is n fout op-etrejen tiejens t wiezigen van joew volgliesinstellingen veur "$1".',
 
 'enotif_mailer' => '{{SITENAME}}-berichgevingssysteem',
-'enotif_reset' => "Markeer alle pagina's as bezöcht.",
-'enotif_newpagetext' => 'Dit is n nieje pagina.',
+'enotif_reset' => 'Markeer alle ziejen as bezöcht.',
+'enotif_newpagetext' => 'Dit is n nieje zied.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-gebruker',
 'changed' => 'ewiezigd',
 'created' => 'an-emaakt',
-'enotif_subject' => '{{SITENAME}}-pagina $PAGETITLE is $CHANGEDORCREATED deur $PAGEEDITOR',
+'enotif_subject' => '{{SITENAME}}-zied $PAGETITLE is $CHANGEDORCREATED deur $PAGEEDITOR',
 'enotif_lastvisited' => 'Zie $1 veur alle wiezigingen sinds joew leste bezeuk.',
 'enotif_lastdiff' => 'Zie $1 um disse wieziging te bekieken.',
 'enotif_anon_editor' => 'anonieme gebruker $1',
 'enotif_body' => 'Huj $WATCHINGUSERNAME,
 
-De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE deur $PAGEEDITOR, zie $PAGETITLE_URL veur de leste versie.
+De zied $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE deur $PAGEEDITOR, zie $PAGETITLE_URL veur de leste versie.
 
 $NEWPAGE
 
@@ -2290,8 +2325,8 @@ Kontaktgevevens van de auteur:
 Netpost: $PAGEEDITOR_EMAIL
 Wiki: $PAGEEDITOR_WIKI
 
-Je kriegen veerder gien berichten, behalven a\'j disse pagina bezeuken.
-Op joew volglieste ku\'j veur alle pagina\'s die\'j volgen de waorschuwingsinstellingen deraof haolen.
+Je kriegen veerder gien berichten, behalven a\'j disse zied bezeuken.
+Op joew volglieste ku\'j veur alle ziejen die\'j volgen de waorschuwingsinstellingen deraof haolen.
 
 Groeten van t {{SITENAME}}-waorschuwingssysteem.
 
@@ -2302,7 +2337,7 @@ Je kunnen joew netpostinstellingen wiezigen op:
 Je kunnen de volgliestinstellingen wiezigen op:
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Je kunnen de pagina van joew volglieste aofhaolen deur op de volgende verwiezing te klikken:
+Je kunnen de zied van joew volglieste aofhaolen deur op de volgende verwiezing te klikken:
 $UNWATCHURL
 
 Opmarkingen en veerdere hulpe:
@@ -2312,33 +2347,33 @@ Opmarkingen en veerdere hulpe:
 'deletepage' => 'Vortdoon',
 'confirm' => 'Bevestigen',
 'excontent' => "De tekste was: '$1'",
-'excontentauthor' => "De tekste was: '$1' (pagina an-emaakt deur: [[Special:Contributions/$2|$2]])",
-'exbeforeblank' => "veurdat disse pagina leegemaakt wörden stung hier: '$1'",
-'exblank' => 'Pagina was leeg',
+'excontentauthor' => "De tekste was: '$1' (zied an-emaakt deur: [[Special:Contributions/$2|$2]])",
+'exbeforeblank' => "veurdat disse zied leegemaakt wörden stung hier: '$1'",
+'exblank' => 'Zied was leeg',
 'delete-confirm' => '"$1" vortdoon',
 'delete-legend' => 'Vortdoon',
-'historywarning' => "'''Waorschuwing''': de pagina die'j vortdoon, hef $1 {{PLURAL:$1|versie|versies}}:",
-'confirmdeletetext' => "Je staon op t punt n pagina en de geschiedenisse dervan vort te doon.
+'historywarning' => "'''Waorschuwing''': de zied die'j vortdoon, hef $1 {{PLURAL:$1|versie|versies}}:",
+'confirmdeletetext' => "Je staon op t punt n zied en de geschiedenisse dervan vort te doon.
 Bevestig hieronder dat dit inderdaod de bedoeling is, da'j de gevolgen begriepen en dat t akkedeert mit t [[{{MediaWiki:Policy-url}}|beleid]].",
 'actioncomplete' => 'Uutevoerd',
 'actionfailed' => 'De haandeling is mislokt.',
-'deletedtext' => 't Artikel "$1" is vortedaon. Zie de "$2" veur n lieste van pagina\'s die as lest vortedaon bin.',
+'deletedtext' => 't Artikel "$1" is vortedaon. Zie de "$2" veur n lieste van ziejen die as lest vortedaon bin.',
 'dellogpage' => 'Vortdologboek',
-'dellogpagetext' => "Hieronder steet n lieste van pagina's en bestaanden die as lest vortedaon bin.",
+'dellogpagetext' => 'Hieronder steet n lieste van ziejen en bestaanden die as lest vortedaon bin.',
 'deletionlog' => 'Vortdologboek',
 'reverted' => 'Eerdere versie hersteld',
 'deletecomment' => 'Reden:',
 'deleteotherreason' => 'Aandere/extra reden:',
 'deletereasonotherlist' => 'Aandere reden',
-'deletereason-dropdown' => "*Redens veur t vortdoon van pagina's
+'deletereason-dropdown' => '*Redens veur t vortdoon van ziejen
 ** Op vrage van de auteur
 ** Schending van de auteursrechten
-** Vandelisme",
+** Vandelisme',
 'delete-edit-reasonlist' => 'Redens veur t vortdoon bewarken',
-'delete-toobig' => "Disse pagina hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.
-t Vortdoon van dit soort pagina's is mit rechten bepark um t per ongelok versteuren van de warking van {{SITENAME}} te veurkoemen.",
-'delete-warning-toobig' => 'Disse pagina hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.
-Woart je: t vortdoon van disse pagina kan de warking van de databanke van {{SITENAME}} versteuren.
+'delete-toobig' => 'Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.
+t Vortdoon van dit soort ziejen is mit rechten bepark um t per ongelok versteuren van de warking van {{SITENAME}} te veurkoemen.',
+'delete-warning-toobig' => 'Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.
+Woart je: t vortdoon van disse zied kan de warking van de databanke van {{SITENAME}} versteuren.
 Wees veurzichtig',
 
 # Rollback
@@ -2347,10 +2382,10 @@ Wees veurzichtig',
 'rollbacklink' => 'Weerummedreien',
 'rollbackfailed' => 'Wieziging herstellen is mislokt',
 'cantrollback' => 'De wiezigingen konnen niet hersteld wörden; der is mer 1 auteur.',
-'alreadyrolled' => 'Kan de leste wieziging van de pagina [[:$1]] deur [[User:$2|$2]] ([[User talk:$2|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); niet weerummedreien.
-n Aander hef disse pagina al bewarkt of hersteld naor n eerdere versie.
+'alreadyrolled' => 'Kan de leste wieziging van de zied [[:$1]] deur [[User:$2|$2]] ([[User talk:$2|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); niet weerummedreien.
+n Aander hef disse zied al bewarkt of hersteld naor n eerdere versie.
 
-De leste bewarking op disse pagina is edaon deur [[User:$3|$3]] ([[User talk:$3|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+De leste bewarking op disse zied is edaon deur [[User:$3|$3]] ([[User talk:$3|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "De bewarkingssamenvatting was: ''$1''.",
 'revertpage' => 'Wiezigingen deur [[Special:Contributions/$2|$2]] hersteld tot de versie nao de leste wieziging deur $1',
 'revertpage-nouser' => 'Wiezigingen deur (gebrukersnaam vortedaon) weerummedreid naor de leste versie deur [[User:$1|$1]]',
@@ -2358,12 +2393,12 @@ De leste bewarking op disse pagina is edaon deur [[User:$3|$3]] ([[User talk:$3|
 
 # Edit tokens
 'sessionfailure-title' => 'Sessiefout',
-'sessionfailure' => 'Der is n probleem mit joew anmeldsessie. De aksie is stop-ezet uut veurzörg tegen n beveiligingsrisico (dat besteet uut t meugelike "kraken" van disse sessie). Gao weerumme naor de veurige pagina, laoj disse pagina opniej en probeer t nog es.',
+'sessionfailure' => 'Der is n probleem mit joew anmeldsessie. De aksie is stop-ezet uut veurzörg tegen n beveiligingsrisico (dat besteet uut t meugelike "kraken" van disse sessie). Gao weerumme naor de veurige zied, laoj disse zied opniej en probeer t nog es.',
 
 # Protect
 'protectlogpage' => 'Beveiligingslogboek',
-'protectlogtext' => "Hieronder staon de leste wiezigingen veur t blokkeren en vriegeven van artikels en pagina's.
-Zie de [[Special:ProtectedPages|lieste mit pagina's die beveiligd bin]] veur t hele overzichte.",
+'protectlogtext' => 'Hieronder staon de leste wiezigingen veur t blokkeren en vriegeven van artikels en ziejen.
+Zie de [[Special:ProtectedPages|lieste mit ziejen die beveiligd bin]] veur t hele overzichte.',
 'protectedarticle' => '[[$1]] is beveiligd',
 'modifiedarticleprotection' => 'beveiligingsnivo van "[[$1]]"  ewiezigd',
 'unprotectedarticle' => 'hef de beveiliging van "[[$1]]" deraof ehaold',
@@ -2372,30 +2407,30 @@ Zie de [[Special:ProtectedPages|lieste mit pagina's die beveiligd bin]] veur t h
 'protect-title-notallowed' => 'Beveiligingsnivo veur "$1" bekieken',
 'prot_1movedto2' => '[[$1]] is ewiezigd naor [[$2]]',
 'protect-badnamespace-title' => 'Niet te beveiligen naamruumte',
-'protect-badnamespace-text' => "Pagina's in disse naamruumte kunnen niet beveiligd wörden.",
+'protect-badnamespace-text' => 'Ziejen in disse naamruumte kunnen niet beveiligd wörden.',
 'protect-legend' => 'Beveiliging bevestigen',
 'protectcomment' => 'Reden:',
 'protectexpiry' => 'Duur',
 'protect_expiry_invalid' => 'Verlooptied is ongeldig.',
 'protect_expiry_old' => 'De verlooptied is al veurbie.',
 'protect-unchain-permissions' => 'Overige beveiligingsinstellingen beschikbaor maken',
-'protect-text' => "Hier ku'j t beveiligingsnivo veur de pagina '''$1''' instellen.",
-'protect-locked-blocked' => "Je kunnen beveiligingsnivo's niet wiezigen terwiel je eblokkeerd bin. Hier bin de instellingen zo as ze noen bin veur de pagina '''$1''':",
+'protect-text' => "Hier ku'j t beveiligingsnivo veur de zied '''$1''' instellen.",
+'protect-locked-blocked' => "Je kunnen beveiligingsnivo's niet wiezigen terwiel je eblokkeerd bin. Hier bin de instellingen zo as ze noen bin veur de zied '''$1''':",
 'protect-locked-dblock' => "Beveiligingsnivo's kunnen effen niet ewiezigd wörden umdat de databanke noen beveiligd is.
-Hier staon de instellingen zo as ze noen bin veur de pagina '''$1''':",
-'protect-locked-access' => "Je hebben gien rechten um t beveilingsnivo van pagina's te wiezigen.
-Hier staon de instellingen zo as ze noen bin veur de pagina '''$1''':",
-'protect-cascadeon' => "Disse pagina wörden beveiligd, umdat t op-eneumen is in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|bin}} mit de kaskadeopsie. Je kunnen t beveiligingsnivo van disse pagina anpassen, mer dat hef gien invleud op de kaskadebeveiliging.",
+Hier staon de instellingen zo as ze noen bin veur de zied '''$1''':",
+'protect-locked-access' => "Je hebben gien rechten um t beveilingsnivo van ziejen te wiezigen.
+Hier staon de instellingen zo as ze noen bin veur de zied '''$1''':",
+'protect-cascadeon' => 'Disse zied wörden beveiligd, umdat t op-eneumen is in de volgende {{PLURAL:$1|zied|ziejen}} die beveiligd {{PLURAL:$1|is|bin}} mit de kaskadeopsie. Je kunnen t beveiligingsnivo van disse zied anpassen, mer dat hef gien invleud op de kaskadebeveiliging.',
 'protect-default' => 'Veur alle gebrukers',
 'protect-fallback' => 'Hierveur is t rech "$1" neudig',
 'protect-level-autoconfirmed' => 'Blokkeer nieje en anonieme gebrukers',
 'protect-level-sysop' => 'Allinnig beheerders',
 'protect-summary-cascade' => 'kaskade',
 'protect-expiring' => 'löp aof op $1 (UTC)',
-'protect-expiring-local' => 'vervuilt op $1',
+'protect-expiring-local' => 'vervölt op $1',
 'protect-expiry-indefinite' => 'onbepark',
-'protect-cascade' => "Kaskadebeveiliging (beveilig alle pagina's en mallen die in disse pagina op-eneumen bin)",
-'protect-cantedit' => "Je kunnen t beveiligingsnivo van disse pagina niet wiezigen, umda'j gien rechten hebben um t te bewarken.",
+'protect-cascade' => 'Kaskadebeveiliging (beveilig alle ziejen en mallen die in disse zied op-eneumen bin)',
+'protect-cantedit' => "Je kunnen t beveiligingsnivo van disse zied niet wiezigen, umda'j gien rechten hebben um t te bewarken.",
 'protect-othertime' => 'Aandere tiedsduur:',
 'protect-othertime-op' => 'aandere tiedsduur',
 'protect-existing-expiry' => 'Bestaonde verloopdaotum: $2 $3',
@@ -2405,7 +2440,7 @@ Hier staon de instellingen zo as ze noen bin veur de pagina '''$1''':",
 ** Vandelisme
 ** Ongewunste verwiezingen plaotsen
 ** Bewarkingsoorlog
-** Pagina mit veul bezeukers',
+** Zied mit veule bezeukers',
 'protect-edit-reasonlist' => 'Redens veur beveiliging bewarken',
 'protect-expiry-options' => '1 uur:1 hour,1 dag:1 day,1 weke:1 week,2 weken:2 weeks,1 maond:1 month,3 maonden:3 months,6 maonden:6 months,1 jaor:1 year,onbeparkt:infinite',
 'restriction-type' => 'Toegang',
@@ -2426,22 +2461,22 @@ Hier staon de instellingen zo as ze noen bin veur de pagina '''$1''':",
 'restriction-level-all' => 'alles',
 
 # Undelete
-'undelete' => "Vortedaone pagina's bekieken",
-'undeletepage' => "Vortedaone pagina's bekieken en weerummeplaotsen",
+'undelete' => 'Vortedaone ziejen bekieken',
+'undeletepage' => 'Vortedaone ziejen bekieken en weerummeplaotsen',
 'undeletepagetitle' => "'''Hieronder staon de vortedaone bewarkingen van [[:$1]]'''.",
-'viewdeletedpage' => "Bekiek vortedaone pagina's",
-'undeletepagetext' => "Hieronder {{PLURAL:$1|steet de pagina die vortedaon is|staon de pagina's die vortedaon bin}} en vanuut t archief  weerummeplaots {{PLURAL:$1|kan|kunnen}} wörden.",
+'viewdeletedpage' => 'Bekiek vortedaone ziejen',
+'undeletepagetext' => 'Hieronder {{PLURAL:$1|steet de zied die vortedaon is|staon de ziejen die vortedaon bin}} en vanuut t archief  weerummeplaotst {{PLURAL:$1|kan|kunnen}} wörden.',
 'undelete-fieldset-title' => 'Versies weerummeplaotsen',
-'undeleteextrahelp' => "Laot alle vakjes leeg en klik op '''''{{int:undeletebtn}}''''' um de hele pagina mit alle veurgeschiedenisse weerumme te plaotsen.
+'undeleteextrahelp' => "Laot alle vakjes leeg en klik op '''''{{int:undeletebtn}}''''' um de hele zied mit alle veurgeschiedenisse weerumme te plaotsen.
 Vink de versies die weerummeplaotsen willen an en klik op '''''{{int:undeletebtn}}''''' um bepaolde versies weerumme te zetten.",
 'undeleterevisions' => '$1 {{PLURAL:$1|versie|versies}} earchiveerd',
-'undeletehistory' => "A'j n pagina weerummeplaotsen, wörden alle versies as ouwe versies weerummeplaots.
-As der al n nieje pagina mit de zelfde naam an-emaakt is, zullen disse versies as ouwe versies weerummeplaotst wörden, mer de op-esleugen versie zal niet ewiezigd wörden.",
-'undeleterevdel' => "Herstellen kan niet as daor de leste versie van de pagina of t bestaand gedeeltelik mee vortedaon wörden.
-In dat geval mö'j de leste versie as zichtbaor instellen.",
-'undeletehistorynoadmin' => 'Disse pagina is vortedaon. De reden hierveur steet hieronder, samen mit de informasie van de gebrukers die dit artikel ewiezigd hebben veurdat t vortedaon is. De tekste van t artikel is allinnig zichtbaor veur beheerders.',
+'undeletehistory' => "A'j n zied weerummeplaotsen, wörden alle versies as ouwe versies weerummeplaots.
+As der al n nieje zied mit de zelfde naam an-emaakt is, zullen disse versies as ouwe versies weerummeplaotst wörden, mer de op-esleugen versie zal niet ewiezigd wörden.",
+'undeleterevdel' => "Herstellen kan niet as daor de leste versie van de zied of t bestaand gedeeltelik mee vortedaon wörden.
+In dat geval mu'j de leste versie as zichtbaor instellen.",
+'undeletehistorynoadmin' => 'Disse zied is vortedaon. De reden hierveur steet hieronder, samen mit de informasie van de gebrukers die dit artikel ewiezigd hebben veurdat t vortedaon is. De tekste van t artikel is allinnig zichtbaor veur beheerders.',
 'undelete-revision' => 'Vortedaone versies van $1 (per $4 um $5) deur $3:',
-'undeleterevision-missing' => "Ongeldige of ontbrekende versie. t Is meugelik da'j n verkeerde verwiezing gebruken of dat disse pagina weerummeplaotst is of dat t uut t archief ewist is.",
+'undeleterevision-missing' => "Ongeldige of ontbrekende versie. t Is meugelik da'j n verkeerde verwiezing gebruken of dat disse zied weerummeplaotst is of dat t uut t archief ewist is.",
 'undelete-nodiff' => 'Gien eerdere versie evunnen.',
 'undeletebtn' => 'Weerummeplaotsen',
 'undeletelink' => 'bekiek/weerummeplaotsen',
@@ -2452,22 +2487,22 @@ In dat geval mö'j de leste versie as zichtbaor instellen.",
 'undeletedrevisions' => '$1 {{PLURAL:$1|versie|versies}} weerummeplaotst',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestaand|$2 bestaanden}} bin weerummeplaotst',
 'undeletedfiles' => '{{PLURAL:$1|1 bestaand|$1 bestaanden}} weerummeplaotst',
-'cannotundelete' => 'Weerummeplaotsen van t bestaand is mislokt; n aander hef disse pagina misschien al weerummeplaotst.',
+'cannotundelete' => 'Weerummeplaotsen van t bestaand is mislokt; n aander hef disse zied misschien al weerummeplaotst.',
 'undeletedpage' => "'''$1 is weerummeplaotst'''
 
-Bekiek t [[Special:Log/delete|vortdologboek]] veur n overzichte van pagina's die kortens vortedaon en weerummeplaotst bin.",
+Bekiek t [[Special:Log/delete|vortdologboek]] veur n overzichte van ziejen die kortens vortedaon en weerummeplaotst bin.",
 'undelete-header' => 'Zie t [[Special:Log/delete|vortdologboek ]] veur spul dat krek vortedaon is.',
-'undelete-search-title' => "Vortedaone pagina's zeuken",
-'undelete-search-box' => "Deurzeuk vortedaone pagina's",
-'undelete-search-prefix' => "Bekiek pagina's vanaof:",
+'undelete-search-title' => 'Vortedaone ziejen zeuken',
+'undelete-search-box' => 'Deurzeuk vortedaone ziejen',
+'undelete-search-prefix' => 'Bekiek ziejen vanaof:',
 'undelete-search-submit' => 'Zeuk',
-'undelete-no-results' => "Gien pagina's evunnen in t archief mit vortedaone pagina's.",
+'undelete-no-results' => 'Gien ziejen evunnen in t archief mit vortedaone ziejen.',
 'undelete-filename-mismatch' => 'Bestaandsversie van t tiedstip $1 kon niet hersteld wörden: bestaandsnaam kloppen niet',
 'undelete-bad-store-key' => 'Bestaandsversie van t tiedstip $1 kon niet hersteld wörden: t bestaand was der al niet meer veurdat t vortedaon wörden.',
 'undelete-cleanup-error' => 'Fout bie t herstellen van t ongebruukten archiefbestaand "$1".',
 'undelete-missing-filearchive' => 't Lokten niet um ID $1 weerumme te plaotsen umdat t niet in de databanke is.
 Misschien is t al weerummeplaotst.',
-'undelete-error' => 'Der is wat fout egaon bie t vortdoon van de pagina',
+'undelete-error' => 'Der is wat fout egaon bie t vortdoon van de zied',
 'undelete-error-short' => 'Fout bie t herstellen van t bestaand: $1',
 'undelete-error-long' => 'Fouten bie t herstellen van t bestaand:
 
@@ -2477,8 +2512,8 @@ $1',
 
 # Namespace form on various pages
 'namespace' => 'Naamruumte:',
-'invert' => 'seleksie ummekeren',
-'tooltip-invert' => "Vink dit vakjen an um wiezigingen an pagina's binnen de ekeuzen naamruumte te verbargen (en de biebeheurende naamruumte as dat an-evinkt is)",
+'invert' => 'Seleksie ummekeren',
+'tooltip-invert' => 'Vink dit vakjen an um wiezigingen an ziejen binnen de ekeuzen naamruumte te verbargen (en de biebeheurende naamruumte as dat an-evinkt is)',
 'namespace_association' => 'Naamruumte die hieran ekoppeld is',
 'tooltip-namespace_association' => 'Vink dit vakjen an um oek de overlegnaamruumte, of in t ummekeren geval de naamruumte zelf, derbie te doon die bie disse naamruumte heurt.',
 'blanknamespace' => '(Heufdnaamruumte)',
@@ -2512,12 +2547,12 @@ De leste regel uut t blokkeerlogboek steet as referensie',
 'sp-contributions-submit' => 'Zeuk',
 
 # What links here
-'whatlinkshere' => 'Verwiezingen naor disse pagina',
-'whatlinkshere-title' => 'Pagina\'s die verwiezen naor "$1"',
-'whatlinkshere-page' => 'Pagina:',
-'linkshere' => "Disse pagina's verwiezen naor '''[[:$1]]''':",
-'nolinkshere' => "Gien enkele pagina verwies naor '''[[:$1]]'''.",
-'nolinkshere-ns' => "Gien enkele pagina verwiest naor '''[[:$1]]''' in de ekeuzen naamruumte.",
+'whatlinkshere' => 'Verwiezingen naor disse zied',
+'whatlinkshere-title' => 'Ziejen die verwiezen naor "$1"',
+'whatlinkshere-page' => 'Zied:',
+'linkshere' => "Disse ziejen verwiezen naor '''[[:$1]]''':",
+'nolinkshere' => "Gien enkele zied verwis naor '''[[:$1]]'''.",
+'nolinkshere-ns' => "Gien enkele zied verwis naor '''[[:$1]]''' in de ekeuzen naamruumte.",
 'isredirect' => 'deurverwiezing',
 'istemplate' => 'in-evoegd as mal',
 'isimage' => 'bestaandsverwiezing',
@@ -2537,19 +2572,19 @@ De leste regel uut t blokkeerlogboek steet as referensie',
 'blockip' => 'Gebruker blokkeren',
 'blockip-title' => 'Gebruker blokkeren',
 'blockip-legend' => 'n Gebruker of IP-adres blokkeren',
-'blockiptext' => "Gebruuk dit formulier um n IP-adres of gebrukersnaam te blokkeren. t Is bedoeld um vandelisme te veurkoemen en mit in akkerderen mit t [[{{MediaWiki:Policy-url}}|beleid]]. Geef hieronder n reden op (bieveurbeeld op welke pagina's de vandelisme epleeg is)",
+'blockiptext' => 'Gebruuk dit formulier um n IP-adres of gebrukersnaam te blokkeren. t Is bedoeld um vandelisme te veurkoemen en mit in akkerderen mit t [[{{MediaWiki:Policy-url}}|beleid]]. Geef hieronder n reden op (bieveurbeeld op welke ziejen de vandelisme epleeg is)',
 'ipadressorusername' => 'IP-adres of gebrukersnaam',
 'ipbexpiry' => 'Verlöp nao',
 'ipbreason' => 'Reden:',
 'ipbreasonotherlist' => 'aandere reden',
-'ipbreason-dropdown' => "*Algemene redens veur t blokkeren
+'ipbreason-dropdown' => '*Algemene redens veur t blokkeren
 ** valse informasie invoeren
-** pagina's leegmaken
+** ziejen leegmaken
 ** ongewunste verwiezingen plaotsen
 ** onzinteksten schrieven
 ** targerieje of naor gedrag
 ** misbruuk vanaof meerdere profielen
-** ongewunste gebrukersnaam",
+** ongewunste gebrukersnaam',
 'ipb-hardblock' => 'Veurkoemen dat an-emelde gebrukers vanaof dit IP-adres kunnen bewarken',
 'ipbcreateaccount' => 'Veurkom t anmaken van gebrukersprofielen',
 'ipbemailban' => 'Veurkom dat bepaolde gebrukers berichten versturen',
@@ -2560,14 +2595,14 @@ De leste regel uut t blokkeerlogboek steet as referensie',
 'ipbotheroption' => 'aanders',
 'ipbotherreason' => 'Aandere/extra reden:',
 'ipbhidename' => 'Verbarg de gebrukersnaam in bewarkingen en liesten',
-'ipbwatchuser' => 'Gebrukerspagina en overlegpagina op volglieste zetten',
-'ipb-disableusertalk' => 'Veurkoemen dat disse gebruker tiejens de blokkering de eigen overlegpagina kan bewarken',
+'ipbwatchuser' => 'Gebrukerszied en overlegzied op volglieste zetten',
+'ipb-disableusertalk' => 'Veurkoemen dat disse gebruker tiejens de blokkering de eigen overlegzied kan bewarken',
 'ipb-change-block' => 'De gebruker opniej blokkeren mit disse instellingen',
 'ipb-confirm' => 'Blokkering bevestigen',
 'badipaddress' => 'Ongeldig IP-adres of onbestaonde gebrukersnaam',
 'blockipsuccesssub' => 'Suksesvol eblokkeerd',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] is noen eblokkeerd.<br />
-Op de [[Special:BlockList|IP-blokkeerlieste]] steet n lieste mit alle blokkeringen.',
+Op de [[Special:BlockList|blokkeerlieste]] steet n lieste mit alle blokkeringen.',
 'ipb-blockingself' => "Hiermee blokkeer je je eigen. Wi'j dat?",
 'ipb-confirmhideuser' => "Hiermee blokkeer je n verbörgen gebruker. Hierveur wörden gebrukersnamen in alle liesten en logboekregels verbörgen. Wi'j dat?",
 'ipb-edit-dropdown' => 'Blokkeerredens bewarken',
@@ -2590,7 +2625,7 @@ Op de [[Special:BlockList|IP-blokkeerlieste]] steet n lieste mit alle blokkering
 'blocklist-rangeblocks' => 'IP-adresblokkeringen verbargen',
 'blocklist-timestamp' => 'Tiedstip',
 'blocklist-target' => 'Doel',
-'blocklist-expiry' => 'Vervuilt',
+'blocklist-expiry' => 'Vervölt',
 'blocklist-by' => 'Eblokkeerd deur',
 'blocklist-params' => 'Blokkeringsparameters',
 'blocklist-reason' => 'Reden',
@@ -2603,7 +2638,7 @@ Op de [[Special:BlockList|IP-blokkeerlieste]] steet n lieste mit alle blokkering
 'noautoblockblock' => 'autoblok niet aktief',
 'createaccountblock' => 'anmaken van n gebrukersprofiel is eblokkeerd',
 'emailblock' => 't versturen van berichten is eblokkeerd',
-'blocklist-nousertalk' => 'kan zien eigen overlegpagina niet bewarken',
+'blocklist-nousertalk' => 'kan zien eigen overlegzied niet bewarken',
 'ipblocklist-empty' => 'De blokkeerlieste is leeg.',
 'ipblocklist-no-results' => 't Op-evreugen IP-adres of de gebrukersnaam is niet eblokkeerd.',
 'blocklink' => 'blokkeren',
@@ -2611,7 +2646,7 @@ Op de [[Special:BlockList|IP-blokkeerlieste]] steet n lieste mit alle blokkering
 'change-blocklink' => 'blokkering wiezigen',
 'contribslink' => 'biedragen',
 'emaillink' => 'netpostbericht sturen',
-'autoblocker' => 'Vanzelf eblokkeerd umdat t IP-adres overenekump mit t IP-adres van [[User:$1|$1]], die eblokkeerd is mit as reden: "$2"',
+'autoblocker' => 'Vanzelf eblokkeerd umdat t IP-adres overenekömp mit t IP-adres van [[User:$1|$1]], die eblokkeerd is mit as reden: "$2"',
 'blocklogpage' => 'Blokkeerlogboek',
 'blocklog-showlog' => 'Disse gebruker is al eerder eblokkeerd.
 t Blokkeerlogboek steet hieronder as referensie:',
@@ -2619,16 +2654,16 @@ t Blokkeerlogboek steet hieronder as referensie:',
 t Logboek mit onderdrokten versies steet hieronder as referensie:',
 'blocklogentry' => 'blokkeren "[[$1]]" veur $2 $3',
 'reblock-logentry' => 'hef de instellingen veur de blokkering van [[$1]] ewiezigd t Löp noen of over $2 $3',
-'blocklogtext' => "Hier zie'j n lieste van de leste blokkeringen en deblokkeringen. Automatiese blokkeringen en deblokkeringen koemen niet in t logboek te staon. Zie de [[Special:BlockList|IP-blokkeerlieste]] veur de lieste van adressen die noen eblokkeerd bin.",
+'blocklogtext' => "Hier zie'j n lieste van de leste blokkeringen en deblokkeringen. Automatiese blokkeringen en deblokkeringen koemen niet in t logboek te staon. Zie de [[Special:BlockList|blokkeerlieste]] veur de lieste van adressen die noen eblokkeerd bin.",
 'unblocklogentry' => 'blokkering van $1 is op-eheven',
 'block-log-flags-anononly' => 'allinnig anoniemen',
-'block-log-flags-nocreate' => 'anmaken van gebrukersprofielen uuteschakeld',
-'block-log-flags-noautoblock' => 'autoblokkeren uuteschakeld',
+'block-log-flags-nocreate' => 'anmaken van gebrukersprofielen uutezet',
+'block-log-flags-noautoblock' => 'autoblokkeren uutezet',
 'block-log-flags-noemail' => 't versturen van berichten is eblokkeerd',
-'block-log-flags-nousertalk' => 'kan zien eigen overlegpagina niet bewarken',
+'block-log-flags-nousertalk' => 'kan zien eigen overlegzied niet bewarken',
 'block-log-flags-angry-autoblock' => 'uutebreide automatiese blokkering in-eschakeld',
 'block-log-flags-hiddenname' => 'gebrukersnaam verbörgen',
-'range_block_disabled' => 'De meugelikheid veur beheerders um n groep adressen te blokkeren is uuteschakeld.',
+'range_block_disabled' => 'De meugelikheid veur beheerders um n groep adressen te blokkeren is uutezet.',
 'ipb_expiry_invalid' => 'De op-egeven verlooptied is ongeldig.',
 'ipb_expiry_temp' => 'Blokkeringen veur verbörgen gebrukers mutten permanent ween.',
 'ipb_hide_invalid' => 'Kan disse gebruker niet verbargen; warschienlik hef e al te veule bewarkingen emaakt.',
@@ -2644,12 +2679,12 @@ De blokkering is onderdeel van de reeks $2, waorvan de blokkering wel op-eheven
 'ip_range_toolarge' => 'Groeps-IP-adressen die groter bin as /$1, bin niet toe-estaon.',
 'blockme' => 'Mien blokkeren',
 'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Disse funksie is uuteschakeld.',
-'proxyblockreason' => "Dit is n automatiese preventieve blokkering umda'j gebruuk maken van n open proxyserver.",
+'proxyblocker-disabled' => 'Disse funksie is uutezet.',
+'proxyblockreason' => "Dit is n automatiese preventieve blokkering umda'j gebruukmaken van n open proxyserver.",
 'proxyblocksuccess' => 'Suksesvol.',
 'sorbsreason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS die'w veur {{SITENAME}} gebruken.",
 'sorbs_create_account_reason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS, die'w veur {{SITENAME}} gebruken.
-Je kunnen gien gebrukerspagina anmaken.",
+Je kunnen gien gebrukerszied anmaken.",
 'cant-block-while-blocked' => "Je kunnen aandere gebrukers niet blokkeren a'j zelf oek eblokkeerd bin.",
 'cant-see-hidden-user' => "De gebruker die'j proberen te blokkeren is al eblokkeerd en verbörgen.
 Umda'j gien rech hebben um gebrukers te verbargen, ku'j de blokkering van de gebruker niet bekieken of bewarken.",
@@ -2659,7 +2694,7 @@ Umda'j gien rech hebben um gebrukers te verbargen, ku'j de blokkering van de geb
 # Developer tools
 'lockdb' => 'Databanke blokkeren',
 'unlockdb' => 'Databanke vriegeven',
-'lockdbtext' => "Waorschuwing: a'j de databanke blokkeren dan kan der gienene meer pagina's bewarken, zien veurkeuren wiezingen of wat aanders doon waorveur der wiezigingen in de databanke neudig bin.",
+'lockdbtext' => "Waorschuwing: a'j de databanke blokkeren dan kan der gienene meer ziejen bewarken, zien veurkeuren wiezingen of wat aanders doon waorveur der wiezigingen in de databanke neudig bin.",
 'unlockdbtext' => 'Vriegeven van de databanke maak alle bewarkingen weer meugelik.
 Mut de databanke vrie-egeven wörden?',
 'lockconfirm' => 'Ja, ik wille de databanke blokkeren.',
@@ -2678,87 +2713,87 @@ Vergeet niet de [[Special:UnlockDB|databanke vrie te geven]] a'j klaor bin mit t
 
 # Move page
 'move-page' => 'Herneum "$1"',
-'move-page-legend' => 'Pagina herneumen',
-'movepagetext' => "Mit dit formulier ku'j de pagina n nieje naam geven, de geschiedenisse geet dan vanzelf mee.
-De ouwe naam zal automaties n deurverwiezing wörden naor de nieje pagina.
+'move-page-legend' => 'Zied herneumen',
+'movepagetext' => "Mit dit formulier ku'j de zied n nieje naam geven, de geschiedenisse geet dan vanzelf mee.
+De ouwe naam zal automaties n deurverwiezing wörden naor de nieje zied.
 Deurverwiezingen naor de ouwe naam kunnen automaties ewiezigd wörden.
 A'j derveur kiezen um dat niet te doon, kiek t dan effen nao of der [[Special:DoubleRedirects|dubbele]] en [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.
 t Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.
 
-n Pagina kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.
-Dit betekent da'j n pagina weer naor de ouwe naam kunnen herneumen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde pagina overschrieven.
+n Zied kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.
+Dit betekent da'j n zied weer naor de ouwe naam kunnen herneumen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde zied overschrieven.
 
 '''WAORSCHUWING!'''
-Veur populaire pagina's kan t herneumen drastiese en onveurziene gevolgen hebben.
+Veur populaere ziejen kan t herneumen drastiese en onveurziene gevolgen hebben.
 Zörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
-'movepagetext-noredirectfixer' => "Mit dit formulier ku'j de pagina n nieje naam geven, de geschiedenisse geet dan vanzelf mee.
-De ouwe naam zal automaties n deurverwiezing wörden naor de nieje pagina.
+'movepagetext-noredirectfixer' => "Mit dit formulier ku'j de zied n nieje naam geven, de geschiedenisse geet dan vanzelf mee.
+De ouwe naam zal automaties n deurverwiezing wörden naor de nieje zied.
 Kiek oek effen nao of der gien [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.
 t Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.
 
-n Pagina kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.
-Dit betekent da'j n pagina weer naor de ouwe naam kunnen herneumen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde pagina overschrieven.
+n Zied kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.
+Dit betekent da'j n zied weer naor de ouwe naam kunnen herneumen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde zied overschrieven.
 
 '''WAORSCHUWING!'''
-Veur popelaire pagina's kan t herneumen drastiese en onveurziene gevolgen hebben.
+Veur populaere ziejen kan t herneumen drastiese en onveurziene gevolgen hebben.
 Zörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
-'movepagetalktext' => "De overlegpagina die derbie heurt krig oek n nieje titel, mer '''niet''' in de volgende gevallen:
-* As de pagina in n aandere naamruumte eplaots wörden
-* As der al n niet-lege overlegpagina besteet onder de aandere naam
+'movepagetalktext' => "De overlegzied die derbie heurt krig oek n nieje titel, mer '''niet''' in de volgende gevallen:
+* As de zied in n aandere naamruumte eplaotst wörden
+* As der al n niet-lege overlegzied besteet onder de aandere naam
 * a'j t onderstaonde vinkjen vorthaolen",
 'movearticle' => 'Herneum',
-'moveuserpage-warning' => "'''Waorschuwing:''' Je staon op t punt um n gebrukerspagina te herneumen. Allinnig disse pagina zal herneumd wörden, '''niet''' de gebruker.",
+'moveuserpage-warning' => "'''Waorschuwing:''' Je staon op t punt um n gebrukerszied te herneumen. Allinnig disse zied zal herneumd wörden, '''niet''' de gebruker.",
 'movenologin' => 'Niet an-emeld.',
-'movenologintext' => 'Je mutten [[Special:UserLogin|an-emeld]] ween um de naam van n pagina te wiezigen.',
-'movenotallowed' => "Je hebben gien rechten um pagina's te herneumen.",
+'movenologintext' => 'Je mutten [[Special:UserLogin|an-emeld]] ween um de naam van n zied te wiezigen.',
+'movenotallowed' => 'Je hebben gien rechten um ziejen te herneumen.',
 'movenotallowedfile' => 'Je hebben gien rechten um bestaanden te herneumen.',
-'cant-move-user-page' => "Je hebben gien rechten um gebrukerspagina's te herneumen.",
-'cant-move-to-user-page' => "Je hebben gien rechten um n pagina naor n gebrukerspagina te herneumen. Herneumen naor n subpagina ma'j wel doon.",
+'cant-move-user-page' => 'Je hebben gien rechten um gebrukersziejen te herneumen.',
+'cant-move-to-user-page' => "Je hebben gien rechten um n zied naor n gebrukerszied te herneumen. Herneumen naor n zied die deronder völt ma'j wel doon.",
 'newtitle' => 'Nieje naam',
-'move-watch' => 'volg disse pagina',
+'move-watch' => 'volg disse zied',
 'movepagebtn' => 'Herneum',
 'pagemovedsub' => 'Naamwieziging suksesvol',
 'movepage-moved' => '\'\'\'"$1" is ewiezigd naor "$2"\'\'\'',
 'movepage-moved-redirect' => 'Der is n deurverwiezing an-emaakt.',
 'movepage-moved-noredirect' => 'Der is gien deurverwiezing an-emaakt.',
-'articleexists' => 'Onder disse naam besteet al n pagina. Kies n aandere naam.',
-'cantmove-titleprotected' => 'Je kunnen gien pagina naor disse titel herneumen, umdat de nieje titel beveiligd is tegen t anmaken dervan.',
-'talkexists' => "De pagina zelf is herneumd, mer de overlegpagina kon niet verherneumd wörden, umdat de doelnaam al n niet-lege overlegpagina had. Kombineer de overlegpagina's mit de haand.",
+'articleexists' => 'Onder disse naam besteet al n zied. Kies n aandere naam.',
+'cantmove-titleprotected' => 'Je kunnen gien zied naor disse titel herneumen, umdat de nieje titel beveiligd is tegen t anmaken dervan.',
+'talkexists' => 'De zied zelf is herneumd, mer de overlegzied kon niet verherneumd wörden, umdat de doelnaam al n niet-lege overlegzied had. Kombineer de overlegziejen mit de haand.',
 'movedto' => 'wiezigen naor',
-'movetalk' => 'De overlegpagina oek wiezigen, as t meuglik is.',
-'move-subpages' => "Herneum subpagina's (tot en mit $1)",
-'move-talk-subpages' => "Herneum subpagina's van overlegpagina's (tot en mit $1)",
-'movepage-page-exists' => 'De pagina $1 besteet al en kan niet automaties vortedaon wörden.',
-'movepage-page-moved' => 'De pagina $1 is herneumd naor $2.',
-'movepage-page-unmoved' => 'De pagina $1 kon niet herneumd wörden naor $2.',
-'movepage-max-pages' => "t Maximale antal automaties te herneumen pagina's is bereikt ({{PLURAL:$1|$1|$1}}).
-De overige pagina's wörden niet automaties herneumd.",
+'movetalk' => 'De overlegzied oek wiezigen, as t meuglik is.',
+'move-subpages' => 'Herneum de ziejen die deronder hangen (tot en mit $1)',
+'move-talk-subpages' => 'Herneum de ziejen die onder de overlegziejen hangen (tot en mit $1)',
+'movepage-page-exists' => 'De zied $1 besteet al en kan niet automaties vortedaon wörden.',
+'movepage-page-moved' => 'De zied $1 is herneumd naor $2.',
+'movepage-page-unmoved' => 'De zied $1 kon niet herneumd wörden naor $2.',
+'movepage-max-pages' => 't Maximale antal automaties te herneumen ziejen is bereikt ({{PLURAL:$1|$1|$1}}).
+De aandere ziejen wörden niet automaties herneumd.',
 'movelogpage' => 'Herneumlogboek',
-'movelogpagetext' => "Hieronder steet n lieste mit pagina's die herneumd bin.",
-'movesubpage' => "{{PLURAL:$1|Subpagina|Subpagina's}}",
-'movesubpagetext' => "De {{PLURAL:$1|subpagina|$1 subpagina's}} van disse pagina vie'j hieronder.",
-'movenosubpage' => "Disse pagina hef gien subpagina's.",
+'movelogpagetext' => 'Hieronder steet n lieste mit ziejen die herneumd bin.',
+'movesubpage' => '{{PLURAL:$1|Zied die deronder hank|Ziejen die deronder hangen}}',
+'movesubpagetext' => "De {{PLURAL:$1|zied die onder disse zied hank|$1 ziejen die onder disse zied hangen}} vie'j hieronder.",
+'movenosubpage' => 'Onder disse zied hangen gien aandere ziejen.',
 'movereason' => 'Reden:',
 'revertmove' => 'Weerummedreien',
 'delete_and_move' => 'Vortdoon en herneumen',
 'delete_and_move_text' => '==Mut vortedaon wörden==
 <div style="color: red"> Onder de nieje naam "[[:$1]]" besteet al n artikel. Wi\'j t vortdoon um plaotse te maken veur t herneumen?</div>',
-'delete_and_move_confirm' => 'Ja, disse pagina vortdoon',
+'delete_and_move_confirm' => 'Ja, disse zied vortdoon',
 'delete_and_move_reason' => 'Vortedaon vanwegen de herneuming van "[[$1]]"',
 'selfmove' => 'De naam kan niet ewiezigd wörden naor de naam die t al hef.',
-'immobile-source-namespace' => 'Pagina\'s in de naamruumte "$1" kunnen niet herneumd wörden',
-'immobile-target-namespace' => 'Pagina\'s kunnen niet herneumd wörden naor de naamruumte "$1"',
-'immobile-target-namespace-iw' => 'n Interwikiverwiezing is gien geldige bestemming veur t herneumen van n pagina.',
-'immobile-source-page' => 'Disse pagina kan niet herneumd wörden.',
-'immobile-target-page' => 'Kan niet herneumd wörden naor disse paginanaam.',
-'imagenocrossnamespace' => 'n Mediabestaand kan niet naor n aandere naamruumte verplaots wörden',
+'immobile-source-namespace' => 'Ziejen in de naamruumte "$1" kunnen niet herneumd wörden',
+'immobile-target-namespace' => 'Ziejen kunnen niet herneumd wörden naor de naamruumte "$1"',
+'immobile-target-namespace-iw' => 'n Interwikiverwiezing is gien geldige bestemming veur t herneumen van n zied.',
+'immobile-source-page' => 'Disse zied kan niet herneumd wörden.',
+'immobile-target-page' => 'Kan niet herneumd wörden naor disse ziednaam.',
+'imagenocrossnamespace' => 'n Mediabestaand kan niet naor n aandere naamruumte verplaotst wörden',
 'nonfile-cannot-move-to-file' => 'Je kunnen niet herneumen van en naor de bestaandsnaamruumte',
 'imagetypemismatch' => 'De nieje bestaandsextensie is niet gelieke an t bestaandstype',
 'imageinvalidfilename' => 'De nieje bestaandsnaam is ongeldig',
 'fix-double-redirects' => 'Alle deurverwiezingen die naor de ouwe titel verwiezen, herneumen naor de nieje titel',
 'move-leave-redirect' => 'n Deurverwiezing achterlaoten',
-'protectedpagemovewarning' => "'''Waorschuwing:''' disse pagina kan allinnig deur beheerders herneumd wörden.",
-'semiprotectedpagemovewarning' => "'''Waorschuwing:''' disse pagina kan allinnig deur eregistreerden gebrukers herneumd wörden.
+'protectedpagemovewarning' => "'''Waorschuwing:''' disse zied kan allinnig deur beheerders herneumd wörden.",
+'semiprotectedpagemovewarning' => "'''Waorschuwing:''' disse zied kan allinnig deur eregistreerden gebrukers herneumd wörden.
 De leste logboekregel steet hieronder:",
 'move-over-sharedrepo' => "== t Bestaand besteet al ==
 [[:$1]] besteet al in de edeelden mediadatabanke. A'j n bestaand naor disse titel herneumen, dan ku'j  t edeelden bestaand niet gebruken.",
@@ -2766,25 +2801,25 @@ De leste logboekregel steet hieronder:",
 Kies n aandere bestaandsnaam.',
 
 # Export
-'export' => "Pagina's uutvoeren",
-'exporttext' => "De tekste en geschiedenisse van n pagina of n antal pagina's kunnen in XML-formaot uutevoerd wörden. Dit bestaand ku'j daornao uutvoeren naor n aandere MediaWiki deur de [[Special:Import|invoerpagina]] te gebruken.
+'export' => 'Ziejen uutvoeren',
+'exporttext' => "De tekste en geschiedenisse van n zied of n koppel ziejen kunnen in XML-formaot uutevoerd wörden. Dit bestaand ku'j daornao uutvoeren naor n aandere MediaWiki deur de [[Special:Import|invoerzied]] te gebruken.
 
-Zet in t onderstaonde veld de namen van de pagina's die'j uutvoeren willen, één pagina per regel, en geef an o'j alle versies mit de bewarkingssamenvatting uutvoeren willen of allinnig de leste versies mit de bewarkingssamenvatting.
+Zet in t onderstaonde veld de namen van de ziejen die'j uutvoeren willen, één zied per regel, en gif an o'j alle versies mit de bewarkingssamenvatting uutvoeren willen of allinnig de leste versies mit de bewarkingssamenvatting.
 
-A'j dat leste doon willen dan ku'j oek n verwiezing gebruken, bieveurbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] veur de pagina \"[[{{MediaWiki:Mainpage}}]]\".",
-'exportall' => "Alle pagina's uutvoeren",
+A'j dat leste doon willen dan ku'j oek n verwiezing gebruken, bieveurbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] veur de zied \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => 'Alle ziejen uutvoeren',
 'exportcuronly' => 'Allinnig de actuele versie, niet de veurgeschiedenisse',
 'exportnohistory' => "----
-'''NB:''' t uutvoeren van de hele geschiedenisse is uuteschakeld vanwegen prestasieredens.",
-'exportlistauthors' => 'De hele auteurslieste opnemen veur elke pagina',
+'''NB:''' t uutvoeren van de hele geschiedenisse is uutezet vanwegen prestasieredens.",
+'exportlistauthors' => 'De hele auteurslieste opnemen veur elke zied',
 'export-submit' => 'Uutvoeren',
-'export-addcattext' => "Pagina's derbie doon uut de kategorie:",
+'export-addcattext' => 'Ziejen derbie doon uut de kategorie:',
 'export-addcat' => 'Derbie doon',
-'export-addnstext' => "Pagina's uut de volgende naamruumte derbie doon:",
+'export-addnstext' => 'Ziejen uut de volgende naamruumte derbie doon:',
 'export-addns' => 'Derbie doon',
 'export-download' => 'As bestaand opslaon',
 'export-templates' => 'Mit mallen derbie',
-'export-pagelinks' => "Pagina's waor naor verwezen wörden opnemen tot:",
+'export-pagelinks' => 'Ziejen waor naor verwezen wörden opnemen tot:',
 
 # Namespace 8 related
 'allmessages' => 'Alle systeemteksten',
@@ -2793,7 +2828,7 @@ A'j dat leste doon willen dan ku'j oek n verwiezing gebruken, bieveurbeeld [[{{#
 'allmessagescurrent' => 'De leste versie',
 'allmessagestext' => "Hieronder steet n lieste mit alle systeemteksten in de MediaWiki-naamruumte.
 Kiek oek effen bie [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie] en [//translatewiki.net translatewiki.net] a'j biedragen willen an de algemene vertaling veur MediaWiki.",
-'allmessagesnotsupportedDB' => "Disse pagina kan niet gebruukt wörden umdat '''\$wgUseDatabaseMessages''' uuteschakeld is.",
+'allmessagesnotsupportedDB' => "Disse zied kan niet gebruukt wörden umdat '''\$wgUseDatabaseMessages''' uutezet is.",
 'allmessages-filter-legend' => 'Filter',
 'allmessages-filter' => 'Filtreer op wiezigingen:',
 'allmessages-filter-unmodified' => 'niet ewiezigd',
@@ -2805,36 +2840,36 @@ Kiek oek effen bie [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie]
 
 # Thumbnails
 'thumbnail-more' => 'vergroten',
-'filemissing' => 'Bestaand ontbreekt',
+'filemissing' => 'Bestaand ontbrik',
 'thumbnail_error' => 'Fout bie t laojen van de miniatuuraofbeelding: $1',
-'djvu_page_error' => 'DjVu-pagina buten bereik',
+'djvu_page_error' => 'DjVu-zied buten bereik',
 'djvu_no_xml' => 'Kon de XML-gegevens veur t DjVu-bestaand niet oproepen',
 'thumbnail-temp-create' => 'Kon gien tiedelik miniatuurbestaand anmaken.',
 'thumbnail-dest-create' => 'Kon gien miniatuurbestaand op de doellokasie opslaon.',
 'thumbnail_invalid_params' => 'Ongeldige parameters veur de miniatuuraofbeelding',
 'thumbnail_dest_directory' => 'De bestemmingsmap kon niet an-emaakt wörden.',
 'thumbnail_image-type' => 'Dit bestaandstype wörden niet ondersteund',
-'thumbnail_gd-library' => 'De instellingen veur de GD-biebeltheek bin niet compleet. De funksie $1 ontbreekt',
+'thumbnail_gd-library' => 'De instellingen veur de GD-biebeltheek bin niet compleet. De funksie $1 ontbrik',
 'thumbnail_image-missing' => 't Lik derop dat t bestaand vort is: $1',
 
 # Special:Import
-'import' => "Pagina's invoeren",
+'import' => 'Ziejen invoeren',
 'importinterwiki' => 'Transwiki-invoer',
-'import-interwiki-text' => 'Kies n wiki en paginanaam um in te voeren.
+'import-interwiki-text' => 'Kies n wiki en ziednaam um in te voeren.
 Versie- en auteursgegevens blieven hierbie beweerd.
 Alle transwiki-invoerhaandelingen wörden op-esleugen in t [[Special:Log/import|invoerlogboek]].',
-'import-interwiki-source' => 'Bronwiki/pagina:',
-'import-interwiki-history' => 'Kopieer de hele geschiedenisse veur disse pagina',
+'import-interwiki-source' => 'Bronwiki/zied:',
+'import-interwiki-history' => 'Kopieer de hele geschiedenisse veur disse zied',
 'import-interwiki-templates' => 'Alle mallen opnemen',
 'import-interwiki-submit' => 'Invoeren',
 'import-interwiki-namespace' => 'Doelnaamruumte:',
 'import-upload-filename' => 'Bestaandsnaam:',
 'import-comment' => 'Opmarkingen:',
-'importtext' => 'Gebruuk de [[Special:Export|uutvoerfunksie]] in de wiki waor de informasie vandaon kump.
+'importtext' => 'Gebruuk de [[Special:Export|uutvoerfunksie]] in de wiki waor de informasie vandaon kömp.
 Slao t op joew eigen systeem op, en stuur t daornao hier op.',
-'importstart' => "Pagina's an t invoeren...",
+'importstart' => 'Ziejen an t invoeren...',
 'import-revision-count' => '$1 {{PLURAL:$1|versie|versies}}',
-'importnopages' => "Der bin gien pagina's um in te voeren.",
+'importnopages' => 'Der bin gien ziejen um in te voeren.',
 'imported-log-entries' => '$1 {{PLURAL:$1|logboekregel|logboekregels}} in-evoerd.',
 'importfailed' => 'Invoeren is mislokt: $1',
 'importunknownsource' => 'Onbekend invoerbrontype',
@@ -2842,7 +2877,7 @@ Slao t op joew eigen systeem op, en stuur t daornao hier op.',
 'importbadinterwiki' => 'Foute interwikiverwiezing',
 'importnotext' => 'Leeg of gien tekste',
 'importsuccess' => 'Invoeren suksesvol!',
-'importhistoryconflict' => 'Der bin konflikten in de geschiedenisse van de pagina (is misschien eerder al in-evoerd)',
+'importhistoryconflict' => 'Der bin konflikten in de geschiedenisse van de zied (is misschien eerder al in-evoerd)',
 'importnosources' => 'Gien transwiki-invoerbronnen vastesteld en t drek inlaojen van versies is eblokkeerd.',
 'importnofile' => 'Der is gien invoerbestaand op-estuurd.',
 'importuploaderrorsize' => 't Opsturen van t invoerbestaand is mislokt.
@@ -2852,21 +2887,21 @@ t Bestaand is mer gedeeltelik an-ekeumen.',
 'importuploaderrortemp' => 't Opsturen van t invoerbestaand is mislokt.
 De tiedelike map is niet anwezig.',
 'import-parse-failure' => 'Fout bie t verwarken van de XML-invoer',
-'import-noarticle' => "Der bin gien pagina's um in te voeren!",
+'import-noarticle' => 'Der bin gien ziejen um in te voeren!',
 'import-nonewrevisions' => 'Alle versies bin al eerder in-evoerd.',
 'xml-error-string' => '$1 op regel $2, kolom $3 (byte $4): $5',
 'import-upload' => 'XML-gegevens derbie doon',
 'import-token-mismatch' => 'De sessiegegevens bin verleuren egaon. Probeer t opniej.',
 'import-invalid-interwiki' => 't Is niet meugelik um van de an-egeven wiki in te voeren.',
-'import-error-edit' => 'De pagina "$1" is niet in-evoerd umda\'j de rechten niet hebben um t te bewarken.',
-'import-error-create' => 'De pagina "$1" is niet in-evoerd umda\'j de rechten niet hebben um t an te maken.',
-'import-error-interwiki' => 'De pagina "$1" is niet in-evoerd umdat disse naam ereserveerd is veur externe verwiezingen (interwiki).',
-'import-error-special' => 'Pagina "$1" is niet in-evoerd umdat t eplaotst is in n spesiale naamruumte waor gien pagina\'s in eplaotst kunnen wörden.',
-'import-error-invalid' => 'De pagina" "$1" is niet in-evoerd umdat de naam ongeldig is.',
+'import-error-edit' => 'De zied "$1" is niet in-evoerd umda\'j de rechten niet hebben um t te bewarken.',
+'import-error-create' => 'De zied "$1" is niet in-evoerd umda\'j de rechten niet hebben um t an te maken.',
+'import-error-interwiki' => 'De zied "$1" is niet in-evoerd umdat disse naam ereserveerd is veur externe verwiezingen (interwiki).',
+'import-error-special' => 'Zied "$1" is niet in-evoerd umdat t eplaotst is in n spesiale naamruumte waor gien ziejen in eplaotst kunnen wörden.',
+'import-error-invalid' => 'De zied" "$1" is niet in-evoerd umdat de naam ongeldig is.',
 
 # Import log
 'importlogpage' => 'Invoerlogboek',
-'importlogpagetext' => "Administratieve invoer van pagina's mit geschiedenisse van aandere wiki's.",
+'importlogpagetext' => "Administratieve invoer van ziejen mit geschiedenisse van aandere wiki's.",
 'import-logentry-upload' => 'hef [[$1]] in-evoerd',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|versie|versies}}',
 'import-logentry-interwiki' => 'transwiki $1',
@@ -2876,7 +2911,7 @@ De tiedelike map is niet anwezig.',
 'javascripttest' => 'JavaScript testen',
 'javascripttest-disabled' => 'Disse funksie steet niet an op disse wiki.',
 'javascripttest-title' => 'Tests uutvoeren veur $1',
-'javascripttest-pagetext-noframework' => 'Disse pagina is ereserveerd veur t uutvoeren van JavaScript-testen.',
+'javascripttest-pagetext-noframework' => 'Disse zied is ereserveerd veur t uutvoeren van JavaScript-testen.',
 'javascripttest-pagetext-unknownframework' => 'Onbekend testraamwark "$1".',
 'javascripttest-pagetext-frameworks' => 'Kies een van de volgende testraamwarken: $1',
 'javascripttest-pagetext-skins' => 'Kies n vormgeving um de tests mee uut te voeren:',
@@ -2908,7 +2943,7 @@ De tiedelike map is niet anwezig.',
 'tooltip-ca-unwatch' => 'Smiet disse bladziede van oewe voalglieste',
 'tooltip-search' => '{{SITENAME}} duurzeukn',
 'tooltip-search-go' => 'Noar n bladziede mit disse naam goan as t besteet',
-'tooltip-search-fulltext' => "De pagina's vuur disse tekst zeuken",
+'tooltip-search-fulltext' => 'Zeuk noar ziedn woar disse tekst in steet',
 'tooltip-p-logo' => 'Goa noar t vuurblad',
 'tooltip-n-mainpage' => 'Goa noar t vuurblad',
 'tooltip-n-mainpage-description' => 'Goa noar t vuurblad',
@@ -2943,7 +2978,7 @@ De tiedelike map is niet anwezig.',
 'tooltip-diff' => 'Bekiek oew aegen wiezigingen',
 'tooltip-compareselectedversions' => 'Bekiek de verschillen tussen de ekeuzen versies.',
 'tooltip-watch' => 'Voog disse bladziede to an oew volglieste',
-'tooltip-watchlistedit-normal-submit' => "Pagina's vortdoon",
+'tooltip-watchlistedit-normal-submit' => 'Ziejen vortdoon',
 'tooltip-watchlistedit-raw-submit' => 'Volglieste biewarken',
 'tooltip-recreate' => 'Disse bladziede opniej anmaken, ondanks t feit dat t vortdoan is.',
 'tooltip-upload' => 'Bestaanden tovogen',
@@ -2960,35 +2995,31 @@ Iej könt in de bewearkingssamenvatting n reden opgeven.',
 'anonymous' => 'Anonieme {{PLURAL:$1|gebruker|gebrukers}} van {{SITENAME}}',
 'siteuser' => '{{SITENAME}}-gebruker $1',
 'anonuser' => 'Anonieme {{SITENAME}}-gebruker $1',
-'lastmodifiedatby' => 'Disse pagina is t lest ewiezigd op $2, $1 deur $3.',
+'lastmodifiedatby' => 'Disse zied is t lest ewiezigd op $2, $1 deur $3.',
 'othercontribs' => 'Ebaseerd op wark van $1.',
 'others' => 'aandere',
 'siteusers' => '{{SITENAME}}-{{PLURAL:$2|gebruker|gebrukers}}  $1',
 'anonusers' => 'Anonieme {{SITENAME}}-{{PLURAL:$2|gebruker|gebrukers}} $1',
-'creditspage' => 'Pagina-auteurs',
-'nocredits' => 'Der is gien auteursinformasie beschikbaor veur disse pagina.',
+'creditspage' => 'Auteursinformasie',
+'nocredits' => 'Der is gien auteursinformasie beschikbaor veur disse zied.',
 
 # Spam protection
 'spamprotectiontitle' => 'Moekfilter',
-'spamprotectiontext' => "De pagina die'j opslaon wollen is eblokkeerd deur de moekfilter.
-Meestentieds kump dit deur n uutgaonde verwiezing die op de zwarte lieste steet.",
+'spamprotectiontext' => "De zied die'j opslaon wollen is eblokkeerd deur de moekfilter.
+Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet.",
 'spamprotectionmatch' => 'Disse tekste zörgen derveur dat onze moekfilter alarmsleug: $1',
 'spambot_username' => 'MediaWiki ongewunste zooi oprumen',
 'spam_reverting' => 'Bezig mit t weerummezetten naor de leste versie die gien verwiezing hef naor $1',
 'spam_blanking' => 'Alle wiezigingen mit n verwiezing naor $1 wörden vortehaold',
+'spam_deleting' => 'In alle versies staon verwiezingen naor $1. Zied vortedaon',
 
 # Info page
 'pageinfo-title' => 'Informasie over "$1"',
 'pageinfo-header-edits' => 'Bewarkingen',
-'pageinfo-header-watchlist' => 'Volglieste',
-'pageinfo-header-views' => 'Bekeken',
-'pageinfo-subjectpage' => 'Pagina:',
-'pageinfo-talkpage' => 'Overlegpagina',
+'pageinfo-views' => 'Antal keer bekeken',
 'pageinfo-watchers' => 'Antal volgers',
 'pageinfo-edits' => 'Antal bewarkingen',
 'pageinfo-authors' => 'Antal verschillende auteurs',
-'pageinfo-views' => 'Antal keer bekeken',
-'pageinfo-viewsperedit' => 'Antal keer bekeken per bewarking',
 
 # Skin names
 'skinname-standard' => 'Klassiek',
@@ -3001,19 +3032,19 @@ Meestentieds kump dit deur n uutgaonde verwiezing die op de zwarte lieste steet.
 'skinname-modern' => 'Niejmoeds',
 
 # Patrolling
-'markaspatrolleddiff' => 'Markeer as ekontroleerd',
-'markaspatrolledtext' => 'Disse pagina is emarkeerd as ekontroleerd',
-'markedaspatrolled' => 'Emarkeerd as ekontroleerd',
-'markedaspatrolledtext' => 'De ekeuzen versie van [[:$1]] is emarkeerd as ekontroleerd.',
-'rcpatroldisabled' => 'De kontrolemeugelikheid op leste wiezigingen is uuteschakeld.',
-'rcpatroldisabledtext' => 'De meugelikheid um de leste wiezigingen as ekontroleerd te markeren is noen uuteschakeld.',
+'markaspatrolleddiff' => 'Zet op nao-ekeken',
+'markaspatrolledtext' => 'Disse zied is op nao-ekeken ezet',
+'markedaspatrolled' => 'Op nao-ekeken ezet',
+'markedaspatrolledtext' => 'De ekeuzen versie van [[:$1]] is op nao-ekeken ezet.',
+'rcpatroldisabled' => 'De naokiekmeugelikheid op "Leste wiezigingen" is uutezet.',
+'rcpatroldisabledtext' => 'De meugelikheid um de leste wiezigingen op nao-ekeken te zetten is noen uutezet.',
 'markedaspatrollederror' => 'De bewarking kon niet aofevinkt wörden.',
 'markedaspatrollederrortext' => 'Je mutten n wieziging selekteren um t as nao-ekeken te markeren.',
-'markedaspatrollederror-noautopatrol' => 'Je maggen joew eigen bewarkingen niet as ekontroleerd markeren.',
+'markedaspatrollederror-noautopatrol' => 'Je maggen joew eigen bewarkingen niet op nao-ekeken zetten.',
 
 # Patrol log
 'patrol-log-page' => 'Markeerlogboek',
-'patrol-log-header' => 'In dit logboek staon de versies die emarkeerd bin as ekontroleerd.',
+'patrol-log-header' => 'In dit logboek staon de versies die op nao-ekeken ezet bin.',
 'log-show-hide-patrol' => 'Markeerlogboek $1',
 
 # Image deletion
@@ -3034,12 +3065,12 @@ $1',
 # Media information
 'mediawarning' => "'''Waorschuwing:''' in dit bestaand zit misschien kodering die slicht is veur t systeem.",
 'imagemaxsize' => "Maximale aofmetingen van aofbeeldingen:<br />
-''(veur op de beschrievingspagina)''",
+''(veur op de beschrievingszied)''",
 'thumbsize' => 'Grootte van de miniatuuraofbeelding:',
-'widthheightpage' => "$1 × $2, $3 {{PLURAL:$3|pagina|pagina's}}",
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|zied|ziejen}}',
 'file-info' => 'Bestaandsgrootte: $1, MIME-type: $2',
 'file-info-size' => '$1 × $2 beeldpunten, bestaandsgrootte: $3, MIME-type: $4',
-'file-info-size-pages' => "$1 × $2 beeldpunten, bestaandsgrootte: $3, MIME-type: $4, $5 {{PLURAL:$5|pagina|pagina's}}",
+'file-info-size-pages' => '$1 × $2 beeldpunten, bestaandsgrootte: $3, MIME-type: $4, $5 {{PLURAL:$5|zied|ziejen}}',
 'file-nohires' => 'Gien hogere resolusie beschikbaor.',
 'svg-long-desc' => 'SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaandsgrootte: $3',
 'show-big-image' => 'Volle resolusie',
@@ -3055,7 +3086,7 @@ $1',
 # Special:NewFiles
 'newimages' => 'Nieje bestaanden',
 'imagelisttext' => "Hier volgt n lieste mit '''$1''' {{PLURAL:$1|bestaand|bestaanden}} esorteerd $2.",
-'newimages-summary' => 'Op disse spesiale pagina staon de bestaanden die der as lest bie-ekeumen bin.',
+'newimages-summary' => 'Op disse spesiale zied staon de bestaanden die der as lest bie-ekeumen bin.',
 'newimages-legend' => 'Bestaandsnaam',
 'newimages-label' => 'Bestaandsnaam (of deel dervan):',
 'showhidebots' => '(Bots $1)',
@@ -3072,18 +3103,18 @@ $1',
 'ago' => '$1 eleen',
 
 # Bad image list
-'bad_image_list' => "De opmaak is as volgt:
+'bad_image_list' => 'De opmaak is as volgt:
 
 Allinnig regels in n lieste (regels die beginnen mit *) wörden verwarkt.
 De eerste verwiezing op n regel mut n verwiezing ween naor n ongewunst bestaand.
-Alle volgende verwiezingen die op de zelfde regel staon, wörden behaandeld as uutzundering, zo as pagina's waorop t bestaand in te tekste op-eneumen is.",
+Alle volgende verwiezingen die op de zelfde regel staon, wörden behaandeld as uutzundering, zo as ziejen waorop t bestaand in te tekste op-eneumen is.',
 
 # Metadata
 'metadata' => 'Metadata',
 'metadata-help' => 'In dit bestaand zit metadata mit EXIF-informasie, die deur n fotokamera, inleesapparaot of fotobewarkingsprogramma op-estuurd kan ween.',
 'metadata-expand' => 'Bekiek uutebreiden gegevens',
 'metadata-collapse' => 'Verbarg uutebreiden gegevens',
-'metadata-fields' => 'De aofbeeldingsmetadatavelden in dit bericht staon oek op n aofbeeldingspagina as de metadatatabel in-eklapt is.
+'metadata-fields' => 'De aofbeeldingsmetadatavelden in dit bericht staon oek op n aofbeeldingszied as de metadatatabel in-eklapt is.
 Aandere velden wörden verbörgen.
 * make
 * model
@@ -3118,7 +3149,7 @@ Aandere velden wörden verbörgen.
 'exif-jpeginterchangeformat' => 'Aofstaand tot JPEG SOI',
 'exif-jpeginterchangeformatlength' => 'Bytes van JPEG-gegevens',
 'exif-whitepoint' => 'Witpuntchromaticiteit',
-'exif-primarychromaticities' => 'Chromaciteit van primaire kleuren',
+'exif-primarychromaticities' => 'Chromasiteit van primaere kleuren',
 'exif-ycbcrcoefficients' => 'Transformasiematrixkoëfficiënten veur de kleurruumte',
 'exif-referenceblackwhite' => 'Referensieweerden veur zwart/wit',
 'exif-datetime' => 'Tiedstip van digitalisasie',
@@ -3269,8 +3300,8 @@ Aandere velden wörden verbörgen.
 'exif-contentwarning' => 'Waorschuwing over inhoud',
 'exif-giffilecomment' => 'Opmarking bie GIF-bestaand',
 'exif-intellectualgenre' => 'Soort onderwarp',
-'exif-subjectnewscode' => 'Onderwarpcode',
-'exif-scenecode' => 'IPTC-scènecode',
+'exif-subjectnewscode' => 'Onderwarpkode',
+'exif-scenecode' => 'IPTC-scènekode',
 'exif-event' => 'Aofebeelden gebeurtenisse',
 'exif-organisationinimage' => 'Aofebeelden organisasie',
 'exif-personinimage' => 'Aofebeeld persoon',
@@ -3501,13 +3532,13 @@ Aandere velden wörden verbörgen.
 # E-mail address confirmation
 'confirmemail' => 'Bevestig netpostadres',
 'confirmemail_noemail' => 'Je hebben gien geldig netpostadres in-evoerd in joew [[Special:Preferences|veurkeuren]].',
-'confirmemail_text' => "Bie disse wiki mö'j je netpostadres bevestigen veurda'j de berichtopsies gebruken kunnen. Klik op de onderstaonde knoppe um n bevestigingsbericht te ontvangen. In dit bericht zit n kode mit n verwiezing; um je netpostadres te bevestigen mö'j disse verwiezing los doon.",
+'confirmemail_text' => "Bie disse wiki mu'j je netpostadres bevestigen veurda'j de berichtopsies gebruken kunnen. Klik op de onderstaonde knoppe um n bevestigingsbericht te ontvangen. In dit bericht zit n kode mit n verwiezing; um je netpostadres te bevestigen mu'j disse verwiezing openen.",
 'confirmemail_pending' => "Der is al n bevestigingskode op-estuurd; a'j net n gebrukersnaam an-emaakt hebben, wacht dan eerst n paor minuten tot da'j dit bericht ontvöngen hebben veurda'j n nieje kode anvragen.",
 'confirmemail_send' => 'Stuur n bevestigingskode',
 'confirmemail_sent' => 'Bevestigingsbericht verstuurd.',
 'confirmemail_oncreate' => "n Bevestigingskode is naor joew netpostadres verstuurd. Disse kode is niet neudig um an te melden, mer je mutten t wel bevestigen veurda'j de netpostmeugelikheen van disse wiki gebruken kunnen.",
 'confirmemail_sendfailed' => '{{SITENAME}} kon joe gien bevestigingskode toesturen.
-Kontroleer joew netpostadres op ongeldige tekens.
+Kiek nao of der gien ongeldige tekens in t netpostadres zitten.
 
 Fout bie t versturen: $1',
 'confirmemail_invalid' => 'Ongeldige bevestigingskode. De kode kan verlopen ween.',
@@ -3557,84 +3588,87 @@ De bevestigingskode zal verlopen op $4.',
 'invalidateemail' => 'Netpostbevestiging ofbreken',
 
 # Scary transclusion
-'scarytranscludedisabled' => '[Interwiki-intergrasie is uuteschakeld]',
+'scarytranscludedisabled' => '[Interwiki-intergrasie is uutezet]',
 'scarytranscludefailed' => '[De mal $1 kon niet op-ehaold wörden]',
 'scarytranscludetoolong' => '[URL is te lang]',
 
 # Delete conflict
-'deletedwhileediting' => "'''Waorschuwing''': disse pagina is vortedaon terwiel jie t an t bewarken waren!",
-'confirmrecreate' => "Gebruker [[User:$1|$1]] ([[User talk:$1|Overleg]]) hef disse pagina vortedaon naoda'j  begunnen bin mit joew wieziging, mit opgave van de volgende reden: ''$2''. Bevestig da'j t artikel herschrieven willen.",
-'confirmrecreate-noreason' => "Gebruker [[User:$1|$1]] ([[User talk:$1|overleg]]) hef disse pagina vortedaon naoda'j  begunnen bin mit joew wieziging. Bevestig da'j t artikel herschrieven willen.",
+'deletedwhileediting' => "'''Waorschuwing''': disse zied is vortedaon terwiel jie t an t bewarken waren!",
+'confirmrecreate' => "Gebruker [[User:$1|$1]] ([[User talk:$1|Overleg]]) hef disse zied vortedaon naoda'j  begunnen bin mit joew wieziging, mit opgave van de volgende reden: ''$2''. Bevestig da'j t artikel herschrieven willen.",
+'confirmrecreate-noreason' => "Gebruker [[User:$1|$1]] ([[User talk:$1|overleg]]) hef disse zied vortedaon naoda'j  begunnen bin mit joew wieziging. Bevestig da'j t artikel herschrieven willen.",
 'recreate' => 'Herschrieven',
 
 # action=purge
 'confirm_purge_button' => 'Bevestig',
-'confirm-purge-top' => "Klik op 'bevestig' um t tussengeheugen van disse pagina te legen.",
-'confirm-purge-bottom' => "t leegmaken van t tussengeheugen zörgt derveur da'j de leste versie van n pagina zien.",
+'confirm-purge-top' => "Klik op 'bevestig' um t tussengeheugen van disse zied te legen.",
+'confirm-purge-bottom' => "t leegmaken van t tussengeheugen zörgt derveur da'j de leste versie van n zied zien.",
 
 # action=watch/unwatch
 'confirm-watch-button' => 'Oké',
-'confirm-watch-top' => 'Disse pagina op joew volglieste zetten?',
+'confirm-watch-top' => 'Disse zied op joew volglieste zetten?',
 'confirm-unwatch-button' => 'Oké',
-'confirm-unwatch-top' => 'Disse pagina van joew volglieste aofhaolen?',
+'confirm-unwatch-top' => 'Disse zied van joew volglieste aofhaolen?',
 
 # Multipage image navigation
 'imgmultipageprev' => '&larr; veurige',
 'imgmultipagenext' => 'volgende &rarr;',
 'imgmultigo' => 'Oké',
-'imgmultigoto' => 'Gao naor de pagina $1',
+'imgmultigoto' => 'Gao naor de zied $1',
 
 # Table pager
 'ascending_abbrev' => 'aofl.',
 'descending_abbrev' => 'opl.',
 'table_pager_next' => 'Volgende',
 'table_pager_prev' => 'Veurige',
-'table_pager_first' => 'Eerste pagina',
-'table_pager_last' => 'Leste pagina',
-'table_pager_limit' => 'Laot $1 onderwarpen per pagina zien',
-'table_pager_limit_label' => 'Onderwarpen per pagina:',
+'table_pager_first' => 'Eerste zied',
+'table_pager_last' => 'Leste zied',
+'table_pager_limit' => 'Laot $1 resultaoten per zied zien',
+'table_pager_limit_label' => 'Zaken per zied:',
 'table_pager_limit_submit' => 'Zeuk',
 'table_pager_empty' => 'Gien resultaoten',
 
 # Auto-summaries
-'autosumm-blank' => 'Pagina leegemaakt',
+'autosumm-blank' => 'Zied leegemaakt',
 'autosumm-replace' => "Tekste vervöngen deur '$1'",
 'autoredircomment' => 'deurverwiezing naor [[$1]]',
-'autosumm-new' => "Nieje pagina: '$1'",
+'autosumm-new' => "Nieje zied: '$1'",
+
+# Size units
+'size-kilobytes' => '$1 kB',
 
 # Live preview
 'livepreview-loading' => 'An t laojen…',
 'livepreview-ready' => 'An t laojen… ree!',
 'livepreview-failed' => 'Rechtstreeks naokieken is niet meugelik!
-Kiek de pagina op de normale maniere nao.',
+Kiek de zied op de normale maniere nao.',
 'livepreview-error' => 'Verbiending niet meugelik: $1 "$2"
-Kiek de pagina op de normale maniere nao.',
+Kiek de zied op de normale maniere nao.',
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => 'Wiezigingen die niejer bin as $1 {{PLURAL:$1|seconde|seconden}} staon misschien nog niet in de lieste.',
 'lag-warn-high' => 'De databanke is aorig zwaor belast. Wiezigingen die niejer bin as $1 {{PLURAL:$1|sekonde|sekonden}} staon daorumme misschien nog niet in de lieste.',
 
 # Watchlist editor
-'watchlistedit-numitems' => "Der {{PLURAL:$1|steet 1 pagina|staon $1 pagina's}} op joew volglieste, zonder overlegpagina's.",
+'watchlistedit-numitems' => 'Der {{PLURAL:$1|steet 1 zied|staon $1 ziejen}} op joew volglieste, zonder overlegziejen.',
 'watchlistedit-noitems' => 'Joew volglieste is leeg.',
 'watchlistedit-normal-title' => 'Volglieste bewarken',
-'watchlistedit-normal-legend' => "Disse pagina's van mien volglieste aofhaolen.",
-'watchlistedit-normal-explain' => "Pagina's die op joew volglieste staon, zie'j hieronder.
-Um n pagina van joew volglieste aof te haolen mö'j t vakjen dernaost anklikken, en klik dan op \"{{int:Watchlistedit-normal-submit}}\".
-Je kunnen oek [[Special:EditWatchlist/raw|de roewe lieste bewarken]].",
-'watchlistedit-normal-submit' => "Pagina's deraof haolen",
-'watchlistedit-normal-done' => "Der {{PLURAL:$1|is 1 pagina|bin $1 pagina's}} vortedaon uut joew volglieste:",
+'watchlistedit-normal-legend' => 'Disse ziejen van mien volglieste aofhaolen.',
+'watchlistedit-normal-explain' => 'Ziejen die op joew volglieste staon, zie\'j hieronder.
+Um n zied van joew volglieste aof te haolen mu\'j t vakjen dernaost anklikken, en klik dan op "{{int:Watchlistedit-normal-submit}}".
+Je kunnen oek [[Special:EditWatchlist/raw|de roewe lieste bewarken]].',
+'watchlistedit-normal-submit' => 'Ziejen deraof haolen',
+'watchlistedit-normal-done' => 'Der {{PLURAL:$1|is 1 zied|bin $1 ziejen}} vortedaon uut joew volglieste:',
 'watchlistedit-raw-title' => 'Roewe volglieste bewarken',
 'watchlistedit-raw-legend' => 'Roewe volglieste bewarken',
-'watchlistedit-raw-explain' => "Pagina's die op joew volglieste staon, zie'j hieronder. Je kunnen de lieste bewarken deur pagina's deruut vort te haolen en derbie te te zetten.
-Eén pagina per regel.
-A'j klaor bin, klik dan op \"{{int:Watchlistedit-raw-submit}}\".
-Je kunnen oek [[Special:EditWatchlist|t standardbewarkingsscharm gebruken]].",
+'watchlistedit-raw-explain' => 'Ziejen die op joew volglieste staon, zie\'j hieronder. Je kunnen de lieste bewarken deur ziejen deruut vort te haolen en derbie te te zetten.
+Eén zied per regel.
+A\'j klaor bin, klik dan op "{{int:Watchlistedit-raw-submit}}".
+Je kunnen oek [[Special:EditWatchlist|t standardbewarkingsscharm gebruken]].',
 'watchlistedit-raw-titles' => 'Titels:',
 'watchlistedit-raw-submit' => 'Volglieste biewarken',
 'watchlistedit-raw-done' => 'Joew volglieste is bie-ewörken.',
-'watchlistedit-raw-added' => "Der {{PLURAL:$1|is 1 pagina|bin $1 pagina's}} bie edaon:",
-'watchlistedit-raw-removed' => "Der {{PLURAL:$1|is 1 pagina|bin $1 pagina's}} vortedaon:",
+'watchlistedit-raw-added' => 'Der {{PLURAL:$1|is 1 zied|bin $1 ziejen}} bie edaon:',
+'watchlistedit-raw-removed' => 'Der {{PLURAL:$1|is 1 zied|bin $1 ziejen}} vortedaon:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Wiezigingen bekieken',
@@ -3651,7 +3685,7 @@ Je kunnen oek [[Special:EditWatchlist|t standardbewarkingsscharm gebruken]].",
 # Special:Version
 'version' => 'Versie',
 'version-extensions' => 'Uutbreidingen die installeerd bin',
-'version-specialpages' => "Spesiale pagina's",
+'version-specialpages' => 'Spesiale ziejen',
 'version-parserhooks' => 'Parserhoeken',
 'version-variables' => 'Variabels',
 'version-antispam' => 'Veurkoemen van ongewunste bewarkingen',
@@ -3677,12 +3711,15 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de
 'version-software' => 'Programmatuur die installeerd is',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Versie',
+'version-entrypoints' => 'Webadressen veur ingangen',
+'version-entrypoints-header-entrypoint' => 'Ingang',
+'version-entrypoints-header-url' => 'Webadres',
 
 # Special:FilePath
 'filepath' => 'Bestaandslokasie',
 'filepath-page' => 'Bestaand:',
 'filepath-submit' => 'Zeuken',
-'filepath-summary' => 'Disse spesiale pagina geef t hele pad veur n bestaand. 
+'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.',
 
@@ -3698,27 +3735,27 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'fileduplicatesearch-noresults' => 'Der is gien bestaand mit de naam "$1" evunnen.',
 
 # Special:SpecialPages
-'specialpages' => "Spesiale pagina's",
+'specialpages' => 'Spesiale ziejen',
 'specialpages-note' => '----
-* Normale spesiale pagina\'s.
-* <strong class="mw-specialpagerestricted">Beparkt toegankelike spesiale pagina\'s.</strong>
-* <span class="mw-specialpagecached">Spesiale pagina\'s mit allinnig gegevens uut t tussengeheugen (kunnen verouwerd ween).</span>',
+* Normale spesiale ziejen.
+* <strong class="mw-specialpagerestricted">Beparkt toegankelike spesiale ziejen.</strong>
+* <span class="mw-specialpagecached">Spesiale ziejen mit allinnig gegevens uut t tussengeheugen (kunnen verouwerd ween).</span>',
 'specialpages-group-maintenance' => 'Onderhoudsliesten',
-'specialpages-group-other' => "Overige spesiale pagina's",
+'specialpages-group-other' => 'Aandere spesiale ziejen',
 'specialpages-group-login' => 'Anmelden / inschrieven',
 'specialpages-group-changes' => 'Leste wiezigingen en logboeken',
 'specialpages-group-media' => 'Media-overzichten en nieje bestaanden',
 'specialpages-group-users' => 'Gebrukers en rechten',
-'specialpages-group-highuse' => "Veulgebruukten pagina's",
-'specialpages-group-pages' => 'Paginaliesten',
-'specialpages-group-pagetools' => 'Paginahulpmiddels',
+'specialpages-group-highuse' => 'Veulgebruukten ziejen',
+'specialpages-group-pages' => 'Liesten mit ziejen',
+'specialpages-group-pagetools' => 'Ziedhulpmiddels',
 'specialpages-group-wiki' => 'Wikigegevens en -hulpmiddels',
-'specialpages-group-redirects' => "Deurverwiezende spesiale pagina's",
+'specialpages-group-redirects' => 'Deurverwiezende spesiale ziejen',
 'specialpages-group-spam' => 'Hulpmiddels tegen ongewunste bewarkingen',
 
 # Special:BlankPage
-'blankpage' => 'Lege pagina',
-'intentionallyblankpage' => 'Disse pagina is bewust leeg eleuten.',
+'blankpage' => 'Lege zied',
+'intentionallyblankpage' => 'Disse zied is bewust leeg eleuten.',
 
 # External image whitelist
 'external_image_whitelist' => ' #Laot disse regel onveraanderd<pre>
@@ -3735,7 +3772,7 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'tag-filter' => '[[Special:Tags|Etiketfilter]]:',
 'tag-filter-submit' => 'Filtreren',
 'tags-title' => 'Etiket',
-'tags-intro' => 'Op disse pagina staon de etiketten waormee de programmatuur elke bewarking kan markeren, en de betekenisse dervan.',
+'tags-intro' => 'Op disse zied staon de etiketten waormee de programmatuur elke bewarking kan markeren, en de betekenisse dervan.',
 'tags-tag' => 'Etiketnaam',
 'tags-display-header' => 'Weergave in wiezigingsliesten',
 'tags-description-header' => 'Beschrieving van de betekenisse',
@@ -3744,10 +3781,10 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'tags-hitcount' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
 
 # Special:ComparePages
-'comparepages' => "Pagina's vergelieken",
-'compare-selector' => 'Paginaversies vergelieken',
-'compare-page1' => 'Pagina 1',
-'compare-page2' => 'Pagina 2',
+'comparepages' => 'Ziejen vergelieken',
+'compare-selector' => 'Ziedversies vergelieken',
+'compare-page1' => 'Zied 1',
+'compare-page2' => 'Zied 2',
 'compare-rev1' => 'Versie 1',
 'compare-rev2' => 'Versie 2',
 'compare-submit' => 'Vergelieken',
@@ -3756,13 +3793,13 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'compare-revision-not-exists' => "De versie die'j op-egeven hebben, besteet niet.",
 
 # Database error messages
-'dberr-header' => 'Disse wiki hef n probleem',
+'dberr-header' => 'Disse wiki hef wat kuren',
 'dberr-problems' => 't Spiet ons, mer disse webstee hef op t moment wat techniese problemen.',
 'dberr-again' => 'Wach n paor minuten en probeer t daornao opniej.',
 'dberr-info' => '(Kan gien verbiending maken mit de databankeserver: $1)',
 'dberr-usegoogle' => "Misschien ku'j ondertussen zeuken via Google.",
-'dberr-outofdate' => "Let op: indexen die zee hebben van onze pagina's bin misschien niet aktueel.",
-'dberr-cachederror' => 'Disse pagina is n kopie uut t tussengeheugen en is misschien niet aktueel.',
+'dberr-outofdate' => 'Let op: indexen die zee hebben van onze ziejen bin misschien niet aktueel.',
+'dberr-cachederror' => 'Disse zied is n kopie uut t tussengeheugen en is misschien niet aktueel.',
 
 # HTML forms
 'htmlform-invalid-input' => 'Der bin problemen mit n paor in-egeven weerden',
@@ -3781,17 +3818,17 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'sqlite-no-fts' => 'Versie $1 zonder ondersteuning veur "full-text" zeuken',
 
 # New logging system
-'logentry-delete-delete' => '$1 hef de pagina $3 vortedaon',
-'logentry-delete-restore' => '$1 hef de pagina $3 weerummezet',
+'logentry-delete-delete' => '$1 hef de zied $3 vortedaon',
+'logentry-delete-restore' => '$1 hef de zied $3 weerummezet',
 'logentry-delete-event' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 ewiezigd: $4',
-'logentry-delete-revision' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 ewiezigd: $4',
+'logentry-delete-revision' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de zied $3 ewiezigd: $4',
 'logentry-delete-event-legacy' => '$1 hef de zichtbaorheid van logboekregels van $3 ewiezigd',
-'logentry-delete-revision-legacy' => '$1 hef de zichtbaorheid van versies van de pagina $3 ewiezigd.',
-'logentry-suppress-delete' => '$1 hef de pagina $3 onderdrokt',
+'logentry-delete-revision-legacy' => '$1 hef de zichtbaorheid van versies van de zied $3 ewiezigd.',
+'logentry-suppress-delete' => '$1 hef de zied $3 onderdrokt',
 'logentry-suppress-event' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 sluuksem ewiezigd: $4',
-'logentry-suppress-revision' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 sluuksem ewiezigd: $4',
+'logentry-suppress-revision' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de zied $3 sluuksem ewiezigd: $4',
 'logentry-suppress-event-legacy' => '$1 hef de zichtbaorheid van logboekregels van $3 sluuksem ewiezigd',
-'logentry-suppress-revision-legacy' => '$1 hef de zichtbaorheid van versies van de pagina $3 sluuksem ewiezigd.',
+'logentry-suppress-revision-legacy' => '$1 hef de zichtbaorheid van versies van de zied $3 sluuksem ewiezigd.',
 'revdelete-content-hid' => 'inhoud verbörgen',
 'revdelete-summary-hid' => 'bewarkingssamenvatting verbörgen',
 'revdelete-uname-hid' => 'gebrukersnaam verbörgen',
@@ -3800,12 +3837,12 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'revdelete-uname-unhid' => 'gebrukersnaam zichtbaor emaakt',
 'revdelete-restricted' => 'hef beparkingen an beheerders op-eleg',
 'revdelete-unrestricted' => 'hef beparkingen veur beheerders deraof ehaold',
-'logentry-move-move' => '$1 herneumden de pagina $3 naor $4',
-'logentry-move-move-noredirect' => '$1 herneumden de pagina $3 naor $4 zonder n deurverwiezing achter te laoten',
-'logentry-move-move_redir' => '$1 herneumden de pagina $3 naor $4 over n deurverwiezing heer',
-'logentry-move-move_redir-noredirect' => '$1 herneumden de pagina $3 naor $4 over n deurverwiezing heer zonder n deurverwiezing achter te laoten',
-'logentry-patrol-patrol' => '$1 hef versie $4 van pagina $3 as ekontroleerd emarkeerd',
-'logentry-patrol-patrol-auto' => '$1 hef versie $4 van pagina $3 automaties as ekontroleerd emarkeerd',
+'logentry-move-move' => '$1 herneumden de zied $3 naor $4',
+'logentry-move-move-noredirect' => '$1 herneumden de zied $3 naor $4 zonder n deurverwiezing achter te laoten',
+'logentry-move-move_redir' => '$1 herneumden de zied $3 naor $4 over n deurverwiezing heer',
+'logentry-move-move_redir-noredirect' => '$1 herneumden de zied $3 naor $4 over n deurverwiezing heer zonder n deurverwiezing achter te laoten',
+'logentry-patrol-patrol' => '$1 hef versie $4 van de zied $3 op nao-ekeken ezet',
+'logentry-patrol-patrol-auto' => '$1 hef versie $4 van de zied $3 automaties op nao-ekeken ezet',
 'logentry-newusers-newusers' => '$1 hef n gebruker an-emaakt',
 'logentry-newusers-create' => '$1 hef n gebruker an-emaakt',
 'logentry-newusers-create2' => '$1 hef n gebruker $3 an-emaakt',
@@ -3814,16 +3851,16 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 
 # Feedback
 'feedback-bugornote' => 'A\'j zovere bin um n technies probleem nauwkeurig te beschrieven, [$1 meld dan n programmafout].
-Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew opmarkingen zullen op de pagina "[$3 $2]" ezet wörden, samen mit joew gebrukersnaam en de webkieker die\'j gebruken.',
+Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew opmarkingen zullen op de zied "[$3 $2]" ezet wörden, samen mit joew gebrukersnaam en de webkieker die\'j gebruken.',
 'feedback-subject' => 'Onderwarp:',
 'feedback-message' => 'Bericht:',
 'feedback-cancel' => 'Aofbreken',
 'feedback-submit' => 'Troegkoppeling opslaon',
-'feedback-adding' => 'Joew troegkoppeling wörden op de pagina ezet...',
+'feedback-adding' => 'Joew troegkoppeling wörden op de zied ezet...',
 'feedback-error1' => 'Fout: onbekend resultaot uut de API',
 'feedback-error2' => 'Fout: de bewarking is mislokt',
 'feedback-error3' => 'Fout: gien reaksie van de API',
-'feedback-thanks' => 'Bedankt! Joew troegkoppeling is op de pagina "[$2 $1]" ezet.',
+'feedback-thanks' => 'Bedankt! Joew troegkoppeling is op de zied "[$2 $1]" ezet.',
 'feedback-close' => 'Ree',
 'feedback-bugcheck' => 'Mooi! Kiek nao of t niet al één van de [$1 bekende problemen] is.',
 'feedback-bugnew' => 'Ik heb t nao-ekeken. Meld n nieje programmafout',
@@ -3837,11 +3874,14 @@ Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew opmarkingen zu
 'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Duplikaotbestaand dat al vortedaon is|Duplikaotbestaanden die al vortedaon bin}}',
 'api-error-duplicate-popup-title' => 'Zelfde {{PLURAL:$1|bestaand|bestaanden}}',
 'api-error-empty-file' => "t Bestaand da'j op-estuurd hebben is leeg.",
-'api-error-emptypage' => "Je maggen gien lege nieje pagina's anmaken.",
+'api-error-emptypage' => 'Je maggen gien lege nieje ziejen anmaken.',
 'api-error-fetchfileerror' => 'Interne fout: der is iets verkeerd egaon mit t ophaolen van t bestaand.',
+'api-error-fileexists-forbidden' => 'Der besteet al n bestaand mit de naam "$1" die niet overschreven kan wörden.',
+'api-error-fileexists-shared-forbidden' => 'Der besteet al n bestaand mit de naam "$1" in de edeelden bestaandsarchief dat niet overschreven kan wörden.',
 'api-error-file-too-large' => "t Bestaand da'j op-estuurd hebben is te groot.",
 'api-error-filename-tooshort' => 'De bestaandsnaam is te kort.',
 'api-error-filetype-banned' => 'Dit bestaandstype is niet toe-estaon.',
+'api-error-filetype-banned-type' => '{{PLURAL:$4|t Bestaandstype $1 wordt|De bestandstypes $1 worden}} niet toegelaten. {{PLURAL:$3|t Toe-estaone bestaandstype is|De toe-estaone bestaandstypen bin}} $2.',
 'api-error-filetype-missing' => 't Bestaand hef gien extensie.',
 'api-error-hookaborted' => "De wieziging die'j proberen deur te voeren is aofebreuken deur n extra uutbreiding.",
 'api-error-http' => 'Interne fout: der kon gien verbiending emaakt wörden mit de server.',
@@ -3853,7 +3893,7 @@ Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew opmarkingen zu
 'api-error-mustbeloggedin' => 'Je mutten an-emeld ween um bestaanden te kunnen opsturen.',
 'api-error-mustbeposted' => 'Der zit n fout in de programmatuur. Der wörden gien gebruukemaakt van de juuste HTTP-methode.',
 'api-error-noimageinfo' => 't Opsturen van t bestaand is aoferond, mer de server hef gien gegevens over t bestaand egeven.',
-'api-error-nomodule' => 'Interne fout: der is gien inlaodmodule in-esteld.',
+'api-error-nomodule' => 'Interne fout: der is gien inlaojmodule in-esteld.',
 'api-error-ok-but-empty' => 'Interne fout: de server hef gien gegevens weerestuurd.',
 'api-error-overwrite' => 'Je maggen gien bestaond bestaand overschrieven.',
 'api-error-stashfailed' => 'Interne fout: de server kon t tiedelike bestaand niet opslaon.',
@@ -3866,4 +3906,15 @@ Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew opmarkingen zu
 'api-error-uploaddisabled' => 'Je kunnen gien bestaanden opsturen in deze wiki.',
 'api-error-verification-error' => 'Dit bestaand is meugelik beschaodigd of hef n onjuuste extensie.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekonde|sekonden}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuut|minuten}}',
+'duration-hours' => '$1 {{PLURAL:$1|uur|uren}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dagen}}',
+'duration-weeks' => '$1 {{PLURAL:$1|weke|weken}}',
+'duration-years' => '$1 {{PLURAL:$1|jaor|jaoren}}',
+'duration-decades' => '$1 {{PLURAL:$1|desennium|desennia}}',
+'duration-centuries' => '$1 {{PLURAL:$1|eeuw|eeuwen}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
 );
index 3fd32e1..30b0d2b 100644 (file)
@@ -94,7 +94,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'प्रवेश गरेका प्रयोगकर्ताहरुको सम्पादन निगरानी सूचीबाट लुकाउने',
 'tog-watchlisthideanons' => 'अज्ञात प्रयोगकर्ताहरुबाट गरिएको सम्पादन निगरानी सूचीबाट लुकाउने',
 'tog-watchlisthidepatrolled' => 'गस्ती(पट्रोल)सम्पादनहरु मेरो निगरानी सूचीबाट लुकाउने',
-'tog-nolangconversion' => 'बहुरुप रुपान्तरण निस्क्रिय पार्नुहोस',
 'tog-ccmeonemails' => 'मैले अरु प्रयोगकर्ताहरुलाई पठाउने इ-मेल को प्रतिलिपि मलाई पठाउने',
 'tog-diffonly' => 'तलका पृष्टहरुको diffहरु सामग्री नदेखाउने',
 'tog-showhiddencats' => 'लुकाइएको प्रकारहरु देखाउने',
@@ -1415,9 +1414,9 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 हेर्नुहोस्- पहिला उर्ध्वभरण गरिएका [[Special:FileList|फाइलहरुको सूची]] , पुनः उर्ध्वभरण गरिएका [[Special:Log/upload|उर्ध्वभरण लग]]मा , मेटिएका फाइलहरु [[Special:Log/delete|मेटिएको लग]]मा।
 
 पृष्ठमा फाइल संलग्न गर्न तल दिएका फारमहरुमध्ये एउटामा लिङ्क गराउनुहोस्:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''पूर्ण आकारको फाइल प्रयोग गर्न
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' 200 पिक्सलको देब्रेपटि मार्जिन गरेर फाइलको बर्णनसहित प्रयोग गर्न
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' फाइल नदेखाई सिधै फाइलसित लिङ्क गरि प्रयोग गर्न",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''पूर्ण आकारको फाइल प्रयोग गर्न
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 200 पिक्सलको देब्रेपटि मार्जिन गरेर फाइलको बर्णनसहित प्रयोग गर्न
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' फाइल नदेखाई सिधै फाइलसित लिङ्क गरि प्रयोग गर्न",
 'upload-permitted' => 'अनुमति पाएका फ़ाइल प्रकार:$1.',
 'upload-preferred' => 'चाहिएका फ़ाइल प्रकार:$1.',
 'upload-prohibited' => 'निषिद्ध फ़ाइल प्रकार:$1.',
@@ -1463,12 +1462,12 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 यो फाइलनाम गलत राखिएको कारणले भएको हुनसक्छ
 यो फाइल साच्चै उर्ध्वभरण गर्नेकुरामा निश्चित हुनुहोस् ।',
 'windows-nonascii-filename' => 'विशेष वर्ण सहितका फाइलनामहरु यस विकिद्वारा समर्थित छैनन् ।',
-'fileexists' => "यो नामको फाइल पहिले नैं छ, यदि तपाईं परिवर्तन गर्ने कुरामा सुनिश्चित हुनुहुन्न भनें कृपया '''<tt>[[:$1]]</tt>''' जाँच गर्नुहोस्।
-[[$1|thumb]]",
-'fileexists-extension' => "यहि नामको एउटा फाइल पहिलेदेखि नैं छ: [[$2|thumb]]
-* उर्ध्वभरण हुँदै गरेको पाइलको नाम: '''<tt>[[:$1]]</tt>'''
-* पहिलेदेखि नैं भएको पाइअलको नाम: '''<tt>[[:$2]]</tt>'''
-कृपया अर्कै नाम रोज्नुहोस्।",
+'fileexists' => 'यो नामको फाइल पहिले नैं छ, यदि तपाईं परिवर्तन गर्ने कुरामा सुनिश्चित हुनुहुन्न भनें कृपया <strong>[[:$1]]</strong> जाँच गर्नुहोस्।
+[[$1|thumb]]',
+'fileexists-extension' => 'यहि नामको एउटा फाइल पहिलेदेखि नैं छ: [[$2|thumb]]
+* उर्ध्वभरण हुँदै गरेको पाइलको नाम: <strong>[[:$1]]</strong>
+* पहिलेदेखि नैं भएको पाइअलको नाम: <strong>[[:$2]]</strong>
+कृपया अर्कै नाम रोज्नुहोस्।',
 'file-exists-duplicate' => 'यस फाइल निम्न{{PLURAL:$1|फाइल|फाइलहरुको}}दुरुस्त नक्कल हो:',
 'uploadwarning' => 'उर्ध्वभरण चेतावनी',
 'uploadwarning-text' => 'कृपया तल फाइलको वर्णन परिवर्तन गर्नुहोस र पुन: प्रयास गर्नुहोस् ।',
@@ -1624,7 +1623,7 @@ $1',
 # MIME search
 'mimesearch' => 'MIME खोज',
 'mimesearch-summary' => 'MIME-प्रकार अनुसार फ़ाइलहरु खोज्न यस पृष्ठको प्रयोग गर्न सकिन्छ।
-इनपुट: फ़ाइलको प्रकार/उपप्रकार, उदा. <tt>image/jpeg</tt>।',
+इनपुट: फ़ाइलको प्रकार/उपप्रकार, उदा. <code>image/jpeg</code>।',
 'mimetype' => 'MIME प्रकार:',
 'download' => 'डाउनलोड',
 
@@ -1795,7 +1794,7 @@ $1',
 'linksearch-ns' => 'नेमस्पेस:',
 'linksearch-ok' => 'खोज्नुहोस्',
 'linksearch-text' => '"*.wikipedia.org" वाइल्डकार्डको रुपमा प्रयोग गर्न सकिने। <br />
-समर्थित प्रोटोकल:<tt>$1</tt>',
+समर्थित प्रोटोकल:<code>$1</code>',
 'linksearch-line' => '$1 $2सित जोड़िएको छ।',
 'linksearch-error' => 'मूलनामको सुरुमा मात्र वाइल्डकार्ड देखापर्न सक्छ।',
 
@@ -2565,15 +2564,10 @@ $1को बन्देजको कारण : "$2" हो',
 # Info page
 'pageinfo-title' => ' "$1"को लागि जाकारी',
 'pageinfo-header-edits' => 'सम्पादनहरु',
-'pageinfo-header-watchlist' => 'निगरानी सुची',
-'pageinfo-header-views' => 'अवलोकनहरु',
-'pageinfo-subjectpage' => 'पृष्ठ',
-'pageinfo-talkpage' => 'वार्तालाप पृष्ठ',
+'pageinfo-views' => 'अवलोकन संख्या',
 'pageinfo-watchers' => 'निगरानी कर्ताहरुको संख्या',
 'pageinfo-edits' => 'सम्पादन संख्या',
 'pageinfo-authors' => 'फरक सम्पादकरुको संख्या',
-'pageinfo-views' => 'अवलोकन संख्या',
-'pageinfo-viewsperedit' => 'प्रति सम्पादन अवलोकन संख्या',
 
 # Skin names
 'skinname-standard' => 'क्लासिक',
index b590943..b30c2fb 100644 (file)
@@ -95,151 +95,153 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#DOORVERWIJZING', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__GEENINHOUD__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__INHOUD__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__GEENKOP__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'HUIDIGEDAG', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'HUIDIGJAAR', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'HUIDIGETIJD', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'HUIDIGUUR', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LOKALEMAAND1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'PLAATSELIJKEDAG', 'LOKALEDAG', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'PLAATSELIJKEDAG2', 'LOKALEDAG2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'PLAATSELIJKEDAGNAAM', 'LOKALEDAGNAAM', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'PAGINANAAM', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NAAMRUIMTE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NAAMRUIMTEE', 'NAMESPACEE' ),
-       'namespacenumber'         => array( '1', 'NAAMRUIMTENUMMER', 'NAMESPACENUMBER' ),
-       'talkspace'               => array( '1', 'OVERLEGRUIMTE', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ONDERWERPRUIMTE', 'ARTIKELRUIMTE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ONDERWERPRUIMTEE', 'ARTIKELRUIMTEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'VOLLEDIGEPAGINANAAM', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'OVERLEGPAGINANAAME', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'ONDERWERPPAGINANAAM', 'ARTIKELPAGINANAAM', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'ONDERWERPPAGINANAAME', 'ARTIKELPAGINANAAME', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'BERICHT:', 'MSG:' ),
-       'subst'                   => array( '0', 'VERV:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'VEILIGVERV:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'BERICHTNW', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'miniatuur', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniatuur=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'rechts', 'right' ),
-       'img_left'                => array( '1', 'links', 'left' ),
-       'img_none'                => array( '1', 'geen', 'none' ),
-       'img_center'              => array( '1', 'gecentreerd', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'omkaderd', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'kaderloos', 'frameless' ),
-       'img_page'                => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'rechtop', 'rechtop=$1', 'rechtop$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'rand', 'border' ),
-       'img_baseline'            => array( '1', 'grondlijn', 'baseline' ),
-       'img_top'                 => array( '1', 'boven', 'top' ),
-       'img_text_top'            => array( '1', 'tekst-boven', 'text-top' ),
-       'img_middle'              => array( '1', 'midden', 'middle' ),
-       'img_bottom'              => array( '1', 'beneden', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'tekst-beneden', 'text-bottom' ),
-       'img_link'                => array( '1', 'verwijzing=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'SITENAAM', 'SITENAME' ),
-       'ns'                      => array( '0', 'NR:', 'NS:' ),
-       'localurl'                => array( '0', 'LOKALEURL', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'ARTIKELPAD', 'ARTICLEPATH' ),
-       'servername'              => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SCRIPTPAD', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'STIJLPAD', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMMATICA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GESLACHT:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__GEENPAGINANAAMCONVERSIE__', '__GEENTITELCONVERSIE__', '__GEENTC__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__GEENINHOUDCONVERSIE__', '__GEENIC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'HUIDIGEWEEK', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'HUIDIGEDVDW', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'PLAATSELIJKEWEEK', 'LOKALEWEEK', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'PLAATSELIJKEDVDW', 'LOKALEDVDW', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'VERSIEID', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'VERSIEDAG', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'VERSIEDAG2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'VERSIEMAAND', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'VERSIEMAAND1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'VERSIEJAAR', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'MEERVOUD:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'VOLLEDIGEURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'VOLLEDIGEURLE:', 'FULLURLE:' ),
-       'canonicalurl'            => array( '0', 'CANOIEKEURL:', 'CANONICALURL:' ),
-       'canonicalurle'           => array( '0', 'CANONIEKEURLE:', 'CANONICALURLE:' ),
-       'lcfirst'                 => array( '0', 'KLEERSTE:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'KL:', 'LC:' ),
-       'uc'                      => array( '0', 'HL:', 'UC:' ),
-       'raw'                     => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'WEERGEGEVENTITEL', 'TOONTITEL', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'V', 'R' ),
-       'newsectionlink'          => array( '1', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'HUIDIGETIJDSTEMPEL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'PLAATSELIJKETIJDSTEMPEL', 'LOKALETIJDSTEMPEL', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'RICHTINGMARKERING', 'RICHTINGSMARKERING', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#TAAL:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'INHOUDSTAAL', 'INHOUDTAAL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PAGINASINNAAMRUIMTE', 'PAGINA’SINNAAMRUIMTE', 'PAGINA\'SINNAAMRUIMTE', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'AANTALBEHEERDERS', 'AANTALADMINS', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMATTEERNUM', 'NUMFORMATTEREN', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'LINKSOPVULLEN', 'PADLEFT' ),
-       'padright'                => array( '0', 'RECHTSOPVULLEN', 'PADRIGHT' ),
-       'special'                 => array( '0', 'speciaal', 'special' ),
-       'speciale'                => array( '0', 'speciaale', 'speciale' ),
-       'defaultsort'             => array( '1', 'STANDAARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'BESTANDSPAD:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'label', 'tag' ),
-       'hiddencat'               => array( '1', '__VERBORGENCAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAGINASINCATEGORIE', 'PAGINASINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'PAGINAGROOTTE', 'PAGESIZE' ),
-       'noindex'                 => array( '1', '__GEENINDEX__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'AANTALINGROEP', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__STATISCHEDOORVERWIJZING__', '__STATISCHEREDIRECT__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'BEVEILIGINGSNIVEAU', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'datumopmaak', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'PAD', 'PATH' ),
-       'url_query'               => array( '0', 'ZOEKOPDRACHT', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', 'geenfout', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', 'nietvervangen', 'noreplace' ),
+       'redirect'                  => array( '0', '#DOORVERWIJZING', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__GEENINHOUD__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__INHOUD__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__GEENKOP__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'HUIDIGEDAG', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'HUIDIGJAAR', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'HUIDIGETIJD', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'HUIDIGUUR', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LOKALEMAAND1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'PLAATSELIJKEDAG', 'LOKALEDAG', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'PLAATSELIJKEDAG2', 'LOKALEDAG2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'PLAATSELIJKEDAGNAAM', 'LOKALEDAGNAAM', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'PAGINANAAM', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NAAMRUIMTE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NAAMRUIMTEE', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'NAAMRUIMTENUMMER', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'OVERLEGRUIMTE', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ONDERWERPRUIMTE', 'ARTIKELRUIMTE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ONDERWERPRUIMTEE', 'ARTIKELRUIMTEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'VOLLEDIGEPAGINANAAM', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'OVERLEGPAGINANAAME', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'ONDERWERPPAGINANAAM', 'ARTIKELPAGINANAAM', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'ONDERWERPPAGINANAAME', 'ARTIKELPAGINANAAME', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'BERICHT:', 'MSG:' ),
+       'subst'                     => array( '0', 'VERV:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'VEILIGVERV:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'BERICHTNW', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'miniatuur', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniatuur=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'rechts', 'right' ),
+       'img_left'                  => array( '1', 'links', 'left' ),
+       'img_none'                  => array( '1', 'geen', 'none' ),
+       'img_center'                => array( '1', 'gecentreerd', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'omkaderd', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'kaderloos', 'frameless' ),
+       'img_page'                  => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'rechtop', 'rechtop=$1', 'rechtop$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'rand', 'border' ),
+       'img_baseline'              => array( '1', 'grondlijn', 'baseline' ),
+       'img_top'                   => array( '1', 'boven', 'top' ),
+       'img_text_top'              => array( '1', 'tekst-boven', 'text-top' ),
+       'img_middle'                => array( '1', 'midden', 'middle' ),
+       'img_bottom'                => array( '1', 'beneden', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'tekst-beneden', 'text-bottom' ),
+       'img_link'                  => array( '1', 'verwijzing=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'SITENAAM', 'SITENAME' ),
+       'ns'                        => array( '0', 'NR:', 'NS:' ),
+       'nse'                       => array( '0', 'NRE:', 'NSE:' ),
+       'localurl'                  => array( '0', 'LOKALEURL', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ARTIKELPAD', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'PAGINAID', 'PAGEID' ),
+       'servername'                => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SCRIPTPAD', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'STIJLPAD', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMMATICA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GESLACHT:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__GEENPAGINANAAMCONVERSIE__', '__GEENTITELCONVERSIE__', '__GEENTC__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__GEENINHOUDCONVERSIE__', '__GEENIC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'HUIDIGEWEEK', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'HUIDIGEDVDW', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'PLAATSELIJKEWEEK', 'LOKALEWEEK', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'PLAATSELIJKEDVDW', 'LOKALEDVDW', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'VERSIEID', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'VERSIEDAG', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'VERSIEDAG2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'VERSIEMAAND', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'VERSIEMAAND1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'VERSIEJAAR', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'MEERVOUD:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'VOLLEDIGEURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'VOLLEDIGEURLE:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'CANOIEKEURL:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'CANONIEKEURLE:', 'CANONICALURLE:' ),
+       'lcfirst'                   => array( '0', 'KLEERSTE:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'KL:', 'LC:' ),
+       'uc'                        => array( '0', 'HL:', 'UC:' ),
+       'raw'                       => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'WEERGEGEVENTITEL', 'TOONTITEL', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'V', 'R' ),
+       'newsectionlink'            => array( '1', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'HUIDIGETIJDSTEMPEL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'PLAATSELIJKETIJDSTEMPEL', 'LOKALETIJDSTEMPEL', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'RICHTINGMARKERING', 'RICHTINGSMARKERING', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#TAAL:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'INHOUDSTAAL', 'INHOUDTAAL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PAGINASINNAAMRUIMTE', 'PAGINA’SINNAAMRUIMTE', 'PAGINA\'SINNAAMRUIMTE', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'AANTALBEHEERDERS', 'AANTALADMINS', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMATTEERNUM', 'NUMFORMATTEREN', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'LINKSOPVULLEN', 'PADLEFT' ),
+       'padright'                  => array( '0', 'RECHTSOPVULLEN', 'PADRIGHT' ),
+       'special'                   => array( '0', 'speciaal', 'special' ),
+       'speciale'                  => array( '0', 'speciaale', 'speciale' ),
+       'defaultsort'               => array( '1', 'STANDAARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'BESTANDSPAD:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'label', 'tag' ),
+       'hiddencat'                 => array( '1', '__VERBORGENCAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAGINASINCATEGORIE', 'PAGINASINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'PAGINAGROOTTE', 'PAGESIZE' ),
+       'noindex'                   => array( '1', '__GEENINDEX__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'AANTALINGROEP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__STATISCHEDOORVERWIJZING__', '__STATISCHEREDIRECT__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'BEVEILIGINGSNIVEAU', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'datumopmaak', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'PAD', 'PATH' ),
+       'url_query'                 => array( '0', 'ZOEKOPDRACHT', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'geenfout', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'nietvervangen', 'noreplace' ),
 );
 
 $specialPageAliases = array(
@@ -288,6 +290,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIMEzoeken', 'MIME-zoeken' ),
        'Mostcategories'            => array( 'MeesteCategorieën' ),
        'Mostimages'                => array( 'MeesteVerwezenBestanden', 'MeesteBestanden', 'MeesteAfbeeldingen' ),
+       'Mostinterwikis'            => array( 'MeesteInterwikiverwijzingen' ),
        'Mostlinked'                => array( 'MeestVerwezenPaginas', 'MeestVerwezenPagina\'s', 'MeestVerwezen' ),
        'Mostlinkedcategories'      => array( 'MeestVerwezenCategorieën' ),
        'Mostlinkedtemplates'       => array( 'MeestVerwezenSjablonen' ),
@@ -353,7 +356,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Gemarkeerde wijzigingen verbergen in recente wijzigingen',
 'tog-newpageshidepatrolled' => "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
 'tog-extendwatchlist' => 'Uitgebreide volglijst gebruiken om alle wijzigingen te bekijken, en niet alleen de laatste',
-'tog-usenewrc' => 'Uitgebreide Recente Wijzigingen-pagina gebruiken (vereist JavaScript)',
+'tog-usenewrc' => 'Wijzigingen per pagina weergeven in recente wijzigingen en volglijst (vereist JavaScript)',
 'tog-numberheadings' => 'Koppen automatisch nummeren',
 'tog-showtoolbar' => 'Bewerkingswerkbalk weergeven (vereist JavaScript)',
 'tog-editondblclick' => 'Dubbelklikken voor bewerken (vereist JavaScript)',
@@ -361,17 +364,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Bewerken van deelpagina’s mogelijk maken met een rechtermuisklik op een tussenkop (vereist JavaScript)',
 'tog-showtoc' => 'Inhoudsopgave weergeven (voor pagina’s met minstens 3 tussenkoppen)',
 'tog-rememberpassword' => 'Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})',
-'tog-watchcreations' => 'Pagina’s die ik aanmaak automatisch volgen',
-'tog-watchdefault' => 'Pagina’s die ik bewerk automatisch volgen',
-'tog-watchmoves' => 'Pagina’s die ik hernoem automatisch volgen',
-'tog-watchdeletion' => 'Pagina’s die ik verwijder automatisch volgen',
+'tog-watchcreations' => "Pagina's die ik aanmaak en bestanden die ik upload automatisch volgen",
+'tog-watchdefault' => 'Pagina’s en bestanden die ik bewerk automatisch volgen',
+'tog-watchmoves' => 'Pagina’s en bestanden die ik hernoem automatisch volgen',
+'tog-watchdeletion' => 'Pagina’s en bestanden die ik verwijder automatisch volgen',
 'tog-minordefault' => 'Mijn bewerkingen als ‘klein’ markeren',
 'tog-previewontop' => 'Voorvertoning boven bewerkingsveld weergeven',
 'tog-previewonfirst' => 'Voorvertoning bij eerste bewerking weergeven',
 'tog-nocache' => "Cachen van pagina's door de browser uitschakelen",
-'tog-enotifwatchlistpages' => 'Mij e-mailen bij bewerkingen van pagina’s op mijn volglijst',
+'tog-enotifwatchlistpages' => 'Mij e-mailen bij bewerkingen van pagina’s of bestanden op mijn volglijst',
 'tog-enotifusertalkpages' => 'Mij e-mailen als iemand mijn overlegpagina wijzigt',
-'tog-enotifminoredits' => 'Mij e-mailen bij kleine bewerkingen van pagina’s op mijn volglijst',
+'tog-enotifminoredits' => 'Mij e-mailen bij kleine bewerkingen van pagina’s en bestanden op mijn volglijst',
 'tog-enotifrevealaddr' => 'Mijn e-mailadres weergeven in e-mailberichten',
 'tog-shownumberswatching' => 'Het aantal gebruikers weergeven dat deze pagina volgt',
 'tog-oldsig' => 'Bestaande ondertekening:',
@@ -387,7 +390,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Bewerkingen van aangemelde gebruikers op mijn volglijst verbergen',
 'tog-watchlisthideanons' => 'Bewerkingen van anonieme gebruikers op mijn volglijst verbergen',
 'tog-watchlisthidepatrolled' => 'Gemarkeerde wijzigingen op mijn volglijst verbergen',
-'tog-nolangconversion' => 'Variantomzetting uitschakelen',
 'tog-ccmeonemails' => 'Mij een kopie zenden van e-mails die ik naar andere gebruikers stuur',
 'tog-diffonly' => 'Pagina-inhoud onder wijzigingen niet weergeven',
 'tog-showhiddencats' => 'Verborgen categorieën weergeven',
@@ -508,7 +510,7 @@ $messages = array(
 'vector-simplesearch-preference' => 'Verbeterde zoeksuggesties inschakelen (alleen voor het uiterlijk Vector)',
 'vector-view-create' => 'Aanmaken',
 'vector-view-edit' => 'Bewerken',
-'vector-view-history' => 'Geschiedenis bekijken',
+'vector-view-history' => 'Geschiedenis weergeven',
 'vector-view-view' => 'Lezen',
 'vector-view-viewsource' => 'Brontekst bekijken',
 'actions' => 'Handelingen',
@@ -612,6 +614,10 @@ Meer informatie is beschikbaar op de pagina [[Special:Version|softwareversie]].'
 'youhavenewmessages' => 'U hebt $1 ($2).',
 'newmessageslink' => 'nieuwe berichten',
 'newmessagesdifflink' => 'laatste wijziging',
+'youhavenewmessagesfromusers' => 'U heeft $1 van {{PLURAL:$3|een andere gebruiker|$3 gebruikers}} ($2).',
+'youhavenewmessagesmanyusers' => 'U heeft $1 van een groot aantal gebruikers ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|een nieuw bericht|nieuwe berichten}}',
+'newmessagesdifflinkplural' => 'laatste {{PLURAL:$1|wijziging|wijzigingen}}',
 'youhavenewmessagesmulti' => 'U hebt nieuwe berichten op $1',
 'editsection' => 'bewerken',
 'editold' => 'bewerken',
@@ -666,9 +672,9 @@ Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|{{in
 'dberrortext' => 'Er is een syntaxisfout in het databaseverzoek opgetreden.
 Mogelijk zit er een fout in de software.
 Het laatste verzoek aan de database was:
-<blockquote><tt>$1</tt></blockquote>
-vanuit de functie "<tt>$2</tt>".
-De database gaf de volgende foutmelding "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+vanuit de functie "<code>$2</code>".
+De database gaf de volgende foutmelding "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Er is een syntaxisfout in het databaseverzoek opgetreden.
 Het laatste verzoek aan de database was:
 "$1"
@@ -705,6 +711,8 @@ Maak hiervan melding bij een [[Special:ListUsers/sysop|beheerder]] van {{SITENAM
 'cannotdelete' => 'De pagina of het bestand "$1" kon niet verwijderd worden.
 Mogelijk is deze al door iemand anders verwijderd.',
 'cannotdelete-title' => 'Pagina "$1" kan niet verwijderd worden',
+'delete-hook-aborted' => 'Het verwijderen is afgebroken door een hook.
+Er is geen toelichting beschikbaar.',
 'badtitle' => 'Ongeldige paginanaam',
 'badtitletext' => 'De naam van de opgevraagde pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikinaamverwijzing.
 Wellicht bevat de paginanaam niet toegestane tekens.',
@@ -743,6 +751,8 @@ De gegeven reden is ''$2''.",
 De opgegeven reden is "\'\'$3\'\'".',
 'invalidtitle-knownnamespace' => 'Ongeldige titel met naamruimte "$2" en tekst "$3"',
 'invalidtitle-unknownnamespace' => 'Ongeldige titel met onbekend naamruimtenummer $1 en tekst "$2"',
+'exception-nologin' => 'Niet aangemeld',
+'exception-nologin-text' => 'Om deze pagina te bekijken of deze handeling uit te kunnen voeren moet u aangemeld zijn bij deze wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Onjuiste configuratie: onbekende virusscanner: ''$1''.",
@@ -763,6 +773,7 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
 'remembermypassword' => 'Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})',
 'securelogin-stick-https' => 'Verbonden blijven via HTTPS na aanmelden',
 'yourdomainname' => 'Uw domein:',
+'password-change-forbidden' => 'U kunt uw wachtwoord niet wijzigen in deze wiki.',
 'externaldberror' => 'Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.',
 'login' => 'Aanmelden',
 'nav-login-createaccount' => 'Aanmelden / registreren',
@@ -1026,6 +1037,10 @@ U kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina\'s
 'noarticletext-nopermission' => 'Deze pagina bevat geen tekst.
 U kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina\'s of
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken]</span>.',
+'missing-revision' => 'De versie #$1 van de pagina "{{PAGENAME}} bestaat niet.
+
+Dit wordt meestal veroorzaakt door het volgen van een verouderde verwijzing naar een pagina die is verwijderd.
+Meer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderlogboek].',
 'userpage-userdoesnotexist' => 'U bewerkt een gebruikerspagina van een gebruiker die niet bestaat (gebruiker "<nowiki>$1</nowiki>").
 Controleer of u deze pagina wel wilt aanmaken of bewerken.',
 'userpage-userdoesnotexist-view' => 'De gebruiker "$1" is niet geregistreerd.',
@@ -1035,7 +1050,6 @@ De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergege
 * '''Firefox / Safari:''' houd ''Shift'' ingedrukt terwijl u op ''Vernieuwen'' klikt of druk op ''Ctrl-F5'' of ''Ctrl-R'' (''⌘-Shift-R'' op een Mac)
 * '''Google Chrome:''' druk op ''Ctrl-Shift-R'' (''⌘-Shift-R'' op een Mac)
 * '''Internet Explorer:''' houd ''Ctrl'' ingedrukt terwijl u op ''Vernieuwen'' klikt of druk op ''Ctrl-F5''
-* '''Konqueror:''' klik op ''Reload'' of druk op ''F5''
 * '''Opera:''' leeg uw cache in ''Extra → Voorkeuren''",
 'usercssyoucanpreview' => "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om uw nieuwe CSS te testen alvorens op te slaan.",
 'userjsyoucanpreview' => "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om uw nieuwe JavaScript te testen alvorens op te slaan.",
@@ -1159,6 +1173,7 @@ Deze parameters zijn weggelaten.',
 'expansion-depth-exceeded-warning' => 'De pagina bevat te veel sjablonen',
 'parser-unstrip-loop-warning' => 'Er is een "unstrip"-lus gedetecteerd',
 'parser-unstrip-recursion-limit' => 'De recursielimiet ($1) voor "unstrip" is overschreden',
+'converter-manual-rule-error' => 'Er is een fout gedetecteerd in een handmatig toegevoegde taalconversieregel.',
 
 # "Undo" feature
 'undo-success' => 'Deze bewerking kan ongedaan gemaakt worden.
@@ -1348,6 +1363,10 @@ Let op dat het gebruiken van de navigatieverwijzingen deze kolom opnieuw instelt
 'editundo' => 'ongedaan maken',
 'diff-multi' => '({{PLURAL:$1|Eén tussenliggende versie|$1 tussenliggende versies}} door {{PLURAL:$2|één gebruiker|$2 gebruikers}} {{PLURAL:$1|wordt|worden}} niet weergegeven)',
 'diff-multi-manyusers' => '($1 tussenliggende {{PLURAL:$1|versie|versies}} door meer dan $2 {{PLURAL:$2|gebruiker|gebruikers}}  worden niet weergegeven)',
+'difference-missing-revision' => '{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.
+
+Dit wordt meestal veroorzaakt door het volgen van een verouderde verwijzing verschillen voor een pagina die is verwijderd.
+Meer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderlogboek].',
 
 # Search results
 'searchresults' => 'Zoekresultaten',
@@ -1621,6 +1640,7 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'right-writeapi' => 'Bewerken via de API',
 'right-delete' => "Pagina's verwijderen",
 'right-bigdelete' => "Pagina's met een grote geschiedenis verwijderen",
+'right-deletelogentry' => 'Specifieke logboekregels verwijderen en terugplaatsen',
 'right-deleterevision' => "Versies van pagina's verbergen",
 'right-deletedhistory' => 'Verwijderde versies bekijken, zonder te kunnen zien wat verwijderd is',
 'right-deletedtext' => 'Verwijderde tekst en wijzigingen tussen verwijderde versies bekijken',
@@ -1816,20 +1836,20 @@ Aangewezen {{PLURAL:\$3|bestandstype is|bestandstypes zijn}} \$2.",
 Dit zou kunnen komen door een typefout in de bestandsnaam.
 Ga na of u dit bestand werkelijk bedoelde te uploaden.',
 'windows-nonascii-filename' => 'Deze wiki ondersteunt geen bestandsnamen met speciale tekens.',
-'fileexists' => "Er bestaat al een bestand met deze naam.
-Controleer '''<tt>[[:$1]]</tt>''' als u niet zeker weet of u het huidige bestand wilt overschrijven.
-[[$1|thumb]]",
-'filepageexists' => "De beschrijvingspagina voor dit bestand bestaat al op '''<tt>[[:$1]]</tt>''', maar er bestaat geen bestand met deze naam.
+'fileexists' => 'Er bestaat al een bestand met deze naam.
+Controleer <strong>[[:$1]]</strong> als u niet zeker weet of u het huidige bestand wilt overschrijven.
+[[$1|thumb]]',
+'filepageexists' => 'De beschrijvingspagina voor dit bestand bestaat al op <strong>[[:$1]]</strong>, maar er bestaat geen bestand met deze naam.
 De samenvatting die u hebt opgegeven zal niet op de beschrijvingspagina verschijnen.
-Bewerk de pagina handmatig om uw beschrijving daar weer te geven. [[$1|miniatuur]]",
-'fileexists-extension' => "Een bestand met dezelfde naam bestaat al: [[$2|thumb]]
-* Naam van het geüploade bestand: '''<tt>[[:$1]]</tt>'''
-* Naam van het bestaande bestand: '''<tt>[[:$2]]</tt>'''
-Kies een andere naam.",
+Bewerk de pagina handmatig om uw beschrijving daar weer te geven. [[$1|miniatuur]]',
+'fileexists-extension' => 'Een bestand met dezelfde naam bestaat al: [[$2|thumb]]
+* Naam van het geüploade bestand: <strong>[[:$1]]</strong>
+* Naam van het bestaande bestand: <strong>[[:$2]]</strong>
+Kies een andere naam.',
 'fileexists-thumbnail-yes' => "Het bestand lijkt een verkleinde versie te zijn ''(miniatuurafbeelding)''. [[$1|thumb]]
-Controleer het bestand '''<tt>[[:$1]]</tt>'''.
+Controleer het bestand <strong>[[:$1]]</strong>.
 Als het gecontroleerde bestand dezelfde afbeelding van oorspronkelijke grootte is, is het niet noodzakelijk een extra miniatuurafbeelding te uploaden.",
-'file-thumbnail-no' => "De bestandsnaam begint met '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "De bestandsnaam begint met <strong>$1</strong>.
 Het lijkt een verkleinde afbeelding te zijn ''(miniatuurafbeelding)''.
 Als u deze afbeelding in volledige resolutie hebt, upload die afbeelding dan.
 Wijzig anders de bestandsnaam.",
@@ -1946,6 +1966,7 @@ Als het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop
 'lockmanager-fail-releaselock' => 'Het was niet mogelijk vergrendeling van "$1" op te heffen.',
 'lockmanager-fail-db-bucket' => 'Het was niet mogelijk om in contact te komen met voldoende vergrendelingsdatabases in de bucket $1.',
 'lockmanager-fail-db-release' => 'Het was niet mogelijk om de vergrendeling voor de database $1 op te heffen.',
+'lockmanager-fail-svr-acquire' => 'Het was niet mogelijk een vergrendeling te krijgen op server $1.',
 'lockmanager-fail-svr-release' => 'Het was niet mogelijk om de vergrendeling voor de server $1 op te heffen.',
 
 # ZipDirectoryReader
@@ -2067,6 +2088,7 @@ U kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].',
 'shared-repo' => 'een gedeelde mediadatabank',
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
 'filepage.css' => "/ * De CSS die hier geplaatst wordt, wordt opgenomen in de bestandsbeschrijvingspagina en wordt ook opgenomen op externe wiki's (via externe repositories) * /",
+'upload-disallowed-here' => 'U kunt deze afbeelding helaas niet overschrijven.',
 
 # File reversion
 'filerevert' => '$1 terugdraaien',
@@ -2101,7 +2123,7 @@ U kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].',
 # MIME search
 'mimesearch' => 'Zoeken op MIME-type',
 'mimesearch-summary' => 'Deze pagina maakt het filteren van bestanden voor het MIME-type mogelijk.
-Invoer: inhoudstype/subtype, bijvoorbeeld <tt>image/jpeg</tt>.',
+Invoer: inhoudstype/subtype, bijvoorbeeld <code>image/jpeg</code>.',
 'mimetype' => 'MIME-type:',
 'download' => 'downloaden',
 
@@ -2148,8 +2170,8 @@ Vergeet niet de "Verwijzingen naar deze pagina" te controleren alvorens dit sjab
 
 'disambiguations' => "Pagina's die verwijzen naar doorverwijspagina's",
 'disambiguationspage' => 'Template:Doorverwijspagina',
-'disambiguations-text' => "Hieronder staan pagina's die verwijzen naar een '''doorverwijspagina'''.
-Deze horen waarschijnlijk direct naar het juiste onderwerp te verwijzen.<br />
+'disambiguations-text' => "Hieronder staan pagina's met tenminste één verwijzing naar een '''doorverwijspagina'''.
+Deze horen waarschijnlijk direct naar een meer toepasselijke pagina te verwijzen.<br />
 Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dubbele doorverwijzingen',
@@ -2176,6 +2198,7 @@ Meestal is de laatste pagina het eigenlijke doel, waar de eerste pagina naar zou
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categorie|categorieën}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwikiverwijzing|interwikiverwijzingen}}',
 'nlinks' => '$1 {{PLURAL:$1|verwijzing|verwijzingen}}',
 'nmembers' => '$1 {{PLURAL:$1|item|items}}',
 'nrevisions' => '$1 {{PLURAL:$1|versie|versies}}',
@@ -2205,6 +2228,7 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
 'mostlinkedtemplates' => 'Meestgebruikte sjablonen',
 'mostcategories' => "Pagina's met de meeste categorieën",
 'mostimages' => 'Meestgebruikte bestanden',
+'mostinterwikis' => "Pagina's met de meeste interwikiverwijzingen",
 'mostrevisions' => "Pagina's met de meeste bewerkingen",
 'prefixindex' => "Alle pagina's op voorvoegsel",
 'prefixindex-namespace' => "Alle pagina's met het voorvoegsel (naamruimte $1)",
@@ -2307,7 +2331,7 @@ Zie ook [[Special:WantedCategories|niet-bestaande categorieën met verwijzingen]
 'linksearch-ok' => 'Zoeken',
 'linksearch-text' => 'Wildcards zoals "*.wikipedia.org" of "*.org" zijn toegestaan.
 Heeft tenminste een topleveldomein, zoals bijvoorbeeld "*.org".<br />
-Ondersteunde protocollen: <tt>$1</tt> (voeg deze niet toe in uw zoekopdracht).',
+Ondersteunde protocollen: <code>$1</code> (voeg deze niet toe in uw zoekopdracht).',
 'linksearch-line' => '$1 heeft een verwijzing in $2',
 'linksearch-error' => 'Wildcards zijn alleen toegestaan aan het begin van een hostnaam.',
 
@@ -2353,6 +2377,8 @@ Er kan [[{{MediaWiki:Listgrouprights-helppage}}|extra informatie]] over individu
 'mailnologin' => 'Geen verzendadres beschikbaar',
 'mailnologintext' => 'U moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in uw [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.',
 'emailuser' => 'Deze gebruiker e-mailen',
+'emailuser-title-target' => 'Deze {{GENDER:$1|gebruiker}} e-mailen',
+'emailuser-title-notarget' => 'Gebruiker e-mailen',
 'emailpage' => 'Gebruiker e-mailen',
 'emailpagetext' => 'Via dit formulier kunt u een e-mail aan deze gebruiker verzenden.
 Het e-mailadres dat u hebt opgegeven bij [[Special:Preferences|uw voorkeuren]] wordt als afzender gebruikt.
@@ -2498,6 +2524,8 @@ Wees voorzichtig.',
 'rollback' => 'Wijzigingen ongedaan maken',
 'rollback_short' => 'Terugdraaien',
 'rollbacklink' => 'terugdraaien',
+'rollbacklinkcount' => '{{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien',
+'rollbacklinkcount-morethan' => 'Meer dan {{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien',
 'rollbackfailed' => 'Ongedaan maken van wijzigingen mislukt.',
 'cantrollback' => 'Ongedaan maken van wijzigingen onmogelijk: deze pagina heeft slechts 1 auteur.',
 'alreadyrolled' => 'Het is niet mogelijk om de bewerking van de pagina [[:$1]] door [[User:$2|$2]] ([[User talk:$2|overleg]]{{int:pipe-separator}}[[Special:Contributions/$2|bijdragen]]) ongedaan te maken.
@@ -2765,13 +2793,13 @@ Zie de [[Special:BlockList|blokkadelijst]] voor recente blokkades.',
 'expiringblock' => 'vervalt op $1 om $2',
 'anononlyblock' => 'alleen anoniemen',
 'noautoblockblock' => 'autoblokkeren uitgeschakeld',
-'createaccountblock' => 'registreren gebruikers geblokkeerd',
-'emailblock' => 'e-mail geblokkeerd',
+'createaccountblock' => 'registreren gebruikers uitgeschakeld',
+'emailblock' => 'e-mail uitgeschakeld',
 'blocklist-nousertalk' => 'kan eigen overlegpagina niet bewerken',
 'ipblocklist-empty' => 'De blokkeerlijst is leeg.',
 'ipblocklist-no-results' => 'Dit IP-adres of deze gebruikersnaam is niet geblokkeerd.',
 'blocklink' => 'blokkeren',
-'unblocklink' => 'deblokkeren',
+'unblocklink' => 'blokkade opheffen',
 'change-blocklink' => 'blokkade wijzigen',
 'contribslink' => 'bijdragen',
 'emaillink' => 'e-mail verzenden',
@@ -2790,7 +2818,7 @@ Zie ook de [[Special:BlockList|blokkadelijst]] voor de op dit moment actieve blo
 'block-log-flags-anononly' => 'alleen anoniemen',
 'block-log-flags-nocreate' => 'registreren gebruikers geblokkeerd',
 'block-log-flags-noautoblock' => 'autoblokkeren is uitgeschakeld',
-'block-log-flags-noemail' => 'e-mail geblokkeerd',
+'block-log-flags-noemail' => 'e-mail uitgeschakeld',
 'block-log-flags-nousertalk' => 'kan eigen overlegpagina niet bewerken',
 'block-log-flags-angry-autoblock' => 'uitgebreide automatische blokkade ingeschakeld',
 'block-log-flags-hiddenname' => 'gebruiker verborgen',
@@ -3003,6 +3031,7 @@ Alle transwiki-importhandelingen worden opgeslagen in het [[Special:Log/import|i
 'import-interwiki-templates' => 'Alle sjablonen opnemen',
 'import-interwiki-submit' => 'Importeren',
 'import-interwiki-namespace' => 'Doelnaamruimte:',
+'import-interwiki-rootpage' => 'Basispagina voor doel (optioneel):',
 'import-upload-filename' => 'Bestandsnaam:',
 'import-comment' => 'Opmerking:',
 'importtext' => 'Gebruik de [[Special:Export|exportfunctie]] in de wiki waar de informatie vandaan komt.
@@ -3038,6 +3067,9 @@ Een tijdelijke map is niet aanwezig.',
 'import-error-interwiki' => 'De pagina "$1" is niet geïmporteerd omdat deze naam is gereserveerd voor externe verwijzingen (interwiki).',
 'import-error-special' => 'Pagina "$1" is niet geïmporteerd omdat deze is geplaatst in een speciale naamruimte waar geen pagina\'s in geplaatst kunnen worden.',
 'import-error-invalid' => 'De pagina" "$1" is niet geïmporteerd omdat de naam ongeldig is.',
+'import-options-wrong' => 'Verkeerde {{PLURAL:$2|optie|opties}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'De opgegeven basispagina is ongeldig.',
+'import-rootpage-nosubpage' => 'In de naamruimte "$1" van de basispagina is het aanmaken van subpagina\'s niet mogelijk.',
 
 # Import log
 'importlogpage' => 'Importlogboek',
@@ -3184,22 +3216,40 @@ U kunt wel de broncode bekijken.',
 Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'spamprotectionmatch' => 'De volgende tekst veroorzaakte een alarm van de spamfilter: $1',
 'spambot_username' => 'MediaWiki opschoning spam',
-'spam_reverting' => 'Bezig met terugdraaien naar de laatste versie die geen verwijzing heeft naar $1',
-'spam_blanking' => 'Alle wijzigingen met een verwijzing naar $1 worden verwijderd',
-'spam_deleting' => 'Alle versies bevatten verwijzingen naar $1. Bezig met verwijderen...',
+'spam_reverting' => 'Teruggedraaid naar de laatste versie die geen verwijzing bevat naar $1',
+'spam_blanking' => 'Alle versies bevatten een verwijzing naar $1. Pagina leeggemaakt',
+'spam_deleting' => 'Alle versies bevatten verwijzingen naar $1. Pagina verwijderd',
 
 # Info page
 'pageinfo-title' => 'Informatie over "$1"',
-'pageinfo-header-edits' => 'Bewerkingen',
-'pageinfo-header-watchlist' => 'Volglijst',
-'pageinfo-header-views' => 'Weergaven',
-'pageinfo-subjectpage' => 'Pagina',
-'pageinfo-talkpage' => 'Overlegpagina',
-'pageinfo-watchers' => 'Aantal volgers',
-'pageinfo-edits' => 'Aantal bewerkingen',
-'pageinfo-authors' => 'Aantal verschillende auteurs',
+'pageinfo-header-basic' => 'Basisgegevens',
+'pageinfo-header-edits' => 'Bewerkingsgeschiedenis',
+'pageinfo-header-restrictions' => 'Paginabeveiliging',
+'pageinfo-header-properties' => 'Pagina-eigenschappen',
+'pageinfo-display-title' => 'Weergegeven paginanaam',
+'pageinfo-default-sort' => 'Standaard sorteerwijze',
+'pageinfo-length' => 'Paginalengte (in bytes)',
+'pageinfo-article-id' => 'Paginanummer',
+'pageinfo-robot-policy' => 'Status voor de zoekmachine',
+'pageinfo-robot-index' => 'Indexeerbaar',
+'pageinfo-robot-noindex' => 'Niet indexeerbaar',
 'pageinfo-views' => 'Aantal weergaven',
-'pageinfo-viewsperedit' => 'Weergaven per bewerking',
+'pageinfo-watchers' => 'Aantal paginavolgers',
+'pageinfo-redirects-name' => 'Doorverwijzingen naar deze pagina',
+'pageinfo-subpages-name' => "Subpagina's van deze pagina",
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|doorverwijzing|doorverwijzingen}}; $3 {{PLURAL:$3|niet-doorverwijzing|niet-doorverwijzingen}})',
+'pageinfo-firstuser' => 'Gebruiker die de pagina heeft aangemaakt',
+'pageinfo-firsttime' => 'Datum waarop de pagina is aangemaakt',
+'pageinfo-lastuser' => 'Laatste bewerker',
+'pageinfo-lasttime' => 'Datum van laatste bewerking',
+'pageinfo-edits' => 'Totaal aantal bewerkingen',
+'pageinfo-authors' => 'Totaal aantal verschillende auteurs',
+'pageinfo-recent-edits' => 'Recent aantal bewerkingen (binnen de afgelopen $1).',
+'pageinfo-recent-authors' => 'Recent aantal verschillende auteurs',
+'pageinfo-restriction' => 'Paginabeveiliging (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magisch woord|Magische woorden}} ($1)',
+'pageinfo-hidden-categories' => 'Verborgen {{PLURAL:$1|categorie|categorieën}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Gebruikt sjabloon|Gebruikte sjablonen}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Klassiek',
@@ -3254,6 +3304,7 @@ $1',
 'file-info-size-pages' => "$1 × $2 pixels, bestandsgrootte: $3, MIME-type: $4, $5 {{PLURAL:$5|pagina|pagina's}}",
 'file-nohires' => 'Geen hogere resolutie beschikbaar.',
 'svg-long-desc' => 'SVG-bestand, nominaal $1 × $2 pixels, bestandsgrootte: $3',
+'svg-long-desc-animated' => 'Bewegend SVG-bestand, nominaal $1 × $2 pixels, bestandsgrootte: $3',
 'show-big-image' => 'Volledige resolutie',
 'show-big-image-preview' => 'Grootte van deze voorvertoning: $1.',
 'show-big-image-other' => 'Andere {{PLURAL:$2|resolutie|resoluties}}: $1.',
@@ -3263,6 +3314,8 @@ $1',
 'file-info-png-looped' => 'herhalend',
 'file-info-png-repeat' => '$1 {{PLURAL:$1|keer|keer}} afgespeeld',
 'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
+'file-no-thumb-animation' => "'''Let op: vanwege technische beperkingen, kunnen miniaturen van dit bestand niet geanimeerd worden weergegeven.''",
+'file-no-thumb-animation-gif' => "'''Let op: vanwege technische beperkingen, kunnen miniaturen van GIF-afbeeldingen met een hoge resolutie niet geanimeerd worden weergegeven.''",
 
 # Special:NewFiles
 'newimages' => 'Nieuwe bestanden',
@@ -4084,9 +4137,12 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
 'api-error-empty-file' => 'Het bestand dat u hebt geüpload is leeg.',
 'api-error-emptypage' => "Het aanmaken van nieuwe, lege pagina's is niet toegestaan.",
 'api-error-fetchfileerror' => 'Interne fout: er is iets misgegaan bij het ophalen van het bestand.',
+'api-error-fileexists-forbidden' => 'Er bestaat al een bestand met de naam "$1" dat niet overschreven kan worden.',
+'api-error-fileexists-shared-forbidden' => 'Er bestaat al een bestand met de naam "$1" in de gedeelde repository dat niet overschreven kan worden.',
 'api-error-file-too-large' => 'Het bestand dat u hebt geüpload is te groot.',
 'api-error-filename-tooshort' => 'De bestandsnaam is te kort.',
 'api-error-filetype-banned' => 'Dit bestandstype mag niet geüpload worden.',
+'api-error-filetype-banned-type' => '{{PLURAL:$4|Het bestandstype $1 wordt|De bestandstypes $1 worden}} niet toegelaten. {{PLURAL:$3|Het toegelaten bestandstype is|De toegelaten bestandstypes zijn}} $2.',
 'api-error-filetype-missing' => 'Het bestand heeft geen extensie.',
 'api-error-hookaborted' => 'De wijziging die u probeert te maken is afgebroken door een uitbreiding.',
 'api-error-http' => 'Interne fout: er kon geen verbinding gemaakt worden met de server.',
index eba4c62..506d181 100644 (file)
@@ -13,6 +13,7 @@
  * @author Eirik
  * @author Finnrind
  * @author Frokor
+ * @author Geitost
  * @author Gunnernett
  * @author Guttorm Flatabø
  * @author H92
@@ -98,74 +99,97 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#omdiriger', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__INGAINNHALDSLISTE__', '__INGENINNHOLDSLISTE__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__INKJEGALLERI__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ALLTIDINNHALDSLISTE__', '__ALLTIDINNHOLDSLISTE__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__INNHALDSLISTE__', '__INNHOLDSLISTE__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__INGABOLKENDRING__', '__INGABOLKREDIGERING__', '__INGENDELENDRING__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'MÅNADNO', 'MÅNEDNÅ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'MÅNADNONAMN', 'MÅNEDNÅNAVN', 'CURRENTMONTHNAME' ),
-       'currentmonthabbrev'      => array( '1', 'MÅNADNOKORT', 'MÅNEDNÅKORT', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'DAGNO', 'DAGNÅ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'DAGNO2', 'DAGNÅ2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'DAGNONAMN', 'DAGNÅNAVN', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ÅRNO', 'ÅRNÅ', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'TIDNO', 'TIDNÅ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'TIMENO', 'CURRENTHOUR' ),
-       'numberofpages'           => array( '1', 'SIDETAL', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'INNHALDSSIDETAL', 'INNHOLDSSIDETALL', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'FILTAL', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'BRUKARTAL', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'AKTIVEBRUKARAR', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'ENDRINGSTAL', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'SIDENAMN', 'SIDENAVN', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'SIDENAMNE', 'SIDENAVNE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NAMNEROM', 'NAVNEROM', 'NAMESPACE' ),
-       'fullpagename'            => array( '1', 'FULLTSIDENAMN', 'FULLPAGENAME' ),
-       'subpagename'             => array( '1', 'UNDERSIDENAMN', 'SUBPAGENAME' ),
-       'basepagename'            => array( '1', 'HOVUDSIDENAMN', 'BASEPAGENAME' ),
-       'talkpagename'            => array( '1', 'DISKUSJONSSIDENAMN', 'TALKPAGENAME' ),
-       'subst'                   => array( '0', 'LIMINN:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'IKWIKMELD:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'mini', 'miniatyr', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'mini=$1', 'miniatyr=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'høgre', 'høyre', 'right' ),
-       'img_left'                => array( '1', 'venstre', 'left' ),
-       'img_none'                => array( '1', 'ingen', 'none' ),
-       'img_width'               => array( '1', '$1pk', '$1px' ),
-       'img_center'              => array( '1', 'sentrum', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'ramme', 'ramma', 'framed', 'enframed', 'frame' ),
-       'img_link'                => array( '1', 'lenkje=$1', 'lenkja=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'NETTSTADNAMN', 'SITENAME' ),
-       'ns'                      => array( '0', 'NR:', 'NS:' ),
-       'localurl'                => array( '0', 'LOKALLENKJE:', 'LOKALLENKE:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALLENKJEE:', 'LOKALLENKEE:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'TENAR', 'TJENER', 'SERVER' ),
-       'servername'              => array( '0', 'TENARNAMN', 'TJENERNAVN', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SKRIPTSTIG', 'SKRIPTSTI', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'GRAMMATIKK:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'KJØNN:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'VEKENRNO', 'UKENRNÅ', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'VEKEDAGNRNO', 'UKEDAGNRNÅ', 'CURRENTDOW' ),
-       'revisionid'              => array( '1', 'VERSJONSID', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'VERSJONSDAG', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'VERSJONSDAG2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'VERSJONSMÅNAD', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'VERSJONSMÅNAD1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'VERSJONSÅR', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'VERSJONSTIDSTEMPEL', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'VERSJONSBRUKAR', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'FLEIRTAL:', 'PLURAL:' ),
-       'currentversion'          => array( '1', 'VERSJONNO', 'CURRENTVERSION' ),
-       'language'                => array( '0', '#SPRÅK:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'INNHALDSSPRÅK', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'SIDERINAMNEROM', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ADMINTAL', 'ADMINISTRATORTAL', 'NUMBEROFADMINS' ),
-       'filepath'                => array( '0', 'FILSTIG', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__GØYMDKAT__', '__LØYNDKAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'SIDERIKAT', 'SIDERIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'protectionlevel'         => array( '1', 'VERNENIVÅ', 'PROTECTIONLEVEL' ),
+       'redirect'                  => array( '0', '#omdiriger', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__INGAINNHALDSLISTE__', '__INGENINNHOLDSLISTE__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__INKJEGALLERI__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ALLTIDINNHALDSLISTE__', '__ALLTIDINNHOLDSLISTE__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__INNHALDSLISTE__', '__INNHOLDSLISTE__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__INGABOLKENDRING__', '__INGABOLKREDIGERING__', '__INGENDELENDRING__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'MÅNADNO', 'MÅNEDNÅ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'MÅNADNONAMN', 'MÅNEDNÅNAVN', 'CURRENTMONTHNAME' ),
+       'currentmonthabbrev'        => array( '1', 'MÅNADNOKORT', 'MÅNEDNÅKORT', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'DAGNO', 'DAGNÅ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'DAGNO2', 'DAGNÅ2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'DAGNONAMN', 'DAGNÅNAVN', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ÅRNO', 'ÅRNÅ', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'TIDNO', 'TIDNÅ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'TIMENO', 'CURRENTHOUR' ),
+       'numberofpages'             => array( '1', 'SIDETAL', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'INNHALDSSIDETAL', 'INNHOLDSSIDETALL', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'FILTAL', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'BRUKARTAL', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'AKTIVEBRUKARAR', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'ENDRINGSTAL', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'VISINGSTAL', 'TALPÅVISINGAR', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'SIDENAMN', 'SIDENAVN', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'SIDENAMNE', 'SIDENAVNE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NAMNEROM', 'NAVNEROM', 'NAMESPACE' ),
+       'fullpagename'              => array( '1', 'FULLTSIDENAMN', 'FULLPAGENAME' ),
+       'subpagename'               => array( '1', 'UNDERSIDENAMN', 'SUBPAGENAME' ),
+       'basepagename'              => array( '1', 'HOVUDSIDENAMN', 'BASEPAGENAME' ),
+       'talkpagename'              => array( '1', 'DISKUSJONSSIDENAMN', 'TALKPAGENAME' ),
+       'msg'                       => array( '0', 'MLD:', 'MSG:' ),
+       'subst'                     => array( '0', 'LIMINN:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'TRYGGLIMINN:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'IKWIKMELD:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'mini', 'miniatyr', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'mini=$1', 'miniatyr=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'høgre', 'høyre', 'right' ),
+       'img_left'                  => array( '1', 'venstre', 'left' ),
+       'img_none'                  => array( '1', 'ingen', 'none' ),
+       'img_width'                 => array( '1', '$1pk', '$1px' ),
+       'img_center'                => array( '1', 'sentrum', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'ramme', 'ramma', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'rammelaus', 'frameless' ),
+       'img_page'                  => array( '1', 'side=$1', 'side_$1', 'page=$1', 'page $1' ),
+       'img_link'                  => array( '1', 'lenkje=$1', 'lenkja=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'NETTSTADNAMN', 'SITENAME' ),
+       'ns'                        => array( '0', 'NR:', 'NS:' ),
+       'localurl'                  => array( '0', 'LOKALLENKJE:', 'LOKALLENKE:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALLENKJEE:', 'LOKALLENKEE:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ARTIKKELSTIG', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'SIDEID', 'PAGEID' ),
+       'server'                    => array( '0', 'TENAR', 'TJENER', 'SERVER' ),
+       'servername'                => array( '0', 'TENARNAMN', 'TJENERNAVN', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SKRIPTSTIG', 'SKRIPTSTI', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'GRAMMATIKK:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'KJØNN:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'VEKENRNO', 'UKENRNÅ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'VEKEDAGNRNO', 'UKEDAGNRNÅ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'LOKALVEKE', 'LOCALWEEK' ),
+       'revisionid'                => array( '1', 'VERSJONSID', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'VERSJONSDAG', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'VERSJONSDAG2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'VERSJONSMÅNAD', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'VERSJONSMÅNAD1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'VERSJONSÅR', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'VERSJONSTIDSTEMPEL', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'VERSJONSBRUKAR', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'FLEIRTAL:', 'PLURAL:' ),
+       'lcfirst'                   => array( '0', 'LFYRST:', 'LFØRST:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'SFYRST:', 'SFØRST:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'SMÅ:', 'LC:' ),
+       'uc'                        => array( '0', 'STORE:', 'UC:' ),
+       'displaytitle'              => array( '1', 'VISTITTEL', 'DISPLAYTITLE' ),
+       'currentversion'            => array( '1', 'VERSJONNO', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#SPRÅK:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'INNHALDSSPRÅK', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'SIDERINAMNEROM', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ADMINTAL', 'ADMINISTRATORTAL', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMATTAL', 'FORMATNUM' ),
+       'special'                   => array( '0', 'spesial', 'special' ),
+       'filepath'                  => array( '0', 'FILSTIG', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'merke', 'tag' ),
+       'hiddencat'                 => array( '1', '__GØYMDKAT__', '__LØYNDKAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'SIDERIKAT', 'SIDERIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'SIDESTORLEIK', 'PAGESIZE' ),
+       'protectionlevel'           => array( '1', 'VERNENIVÅ', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'datoformat', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'STIG', 'PATH' ),
+       'pagesincategory_all'       => array( '0', 'alle', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'sider', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'underkategoriar', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'filer', 'files' ),
 );
 
 $namespaceNames = array(
@@ -328,7 +352,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Gøym endringar av innlogga brukarar i overvakingslista.',
 'tog-watchlisthideanons' => 'Gøym endringar av anonyme brukarar i overvakingslista.',
 'tog-watchlisthidepatrolled' => 'Gøym patruljerte endringar i overvakingslista',
-'tog-nolangconversion' => 'Slå av variantkonvertering',
 'tog-ccmeonemails' => 'Send meg kopi av e-postane eg sender til andre brukarar',
 'tog-diffonly' => 'Ikkje vis sideinnhaldet under skilnadene mellom versjonane',
 'tog-showhiddencats' => 'Vis gøymde kategoriar',
@@ -603,7 +626,7 @@ Dette kan òg skuldast ein feil i programvara som er nytta av {{SITENAME}}.',
 # General errors
 'error' => 'Feil',
 'databaseerror' => 'Databasefeil',
-'dberrortext' => 'Det oppstod ein syntaksfeil i databaseførespurnaden. Dette kan tyde på ein feil i programvara. Den sist prøvde førespurnaden var: <blockquote><tt>$1</tt></blockquote> frå innan funksjonen «<tt>$2</tt>». Databasen returnerte feilen «<tt>$3: $4</tt>».',
+'dberrortext' => 'Det oppstod ein syntaksfeil i ein databaseførespurnad. Dette kan tyda på feil i programvara. Siste førespurnaden til databasen var: <blockquote><code>$1</code></blockquote> frå funksjonen «<code>$2</code>». Databasen returnerte feilen «<samp>$3: $4</samp>».',
 'dberrortextcl' => 'Det oppstod ein syntaksfeil i databaseførespurnaden.
 Den sist prøvde førespurnaden var: «$1» frå funksjonen «$2».
 Databasen returnerte feilen «$3: $4».',
@@ -845,7 +868,7 @@ Mellombels passord: $2',
 'showpreview' => 'Førehandsvis',
 'showlivepreview' => 'Levande førehandsvising',
 'showdiff' => 'Vis skilnad',
-'anoneditwarning' => "'''Åtvaring:''' Du er ikkje innlogga. IP-adressa di vert lagra i historikken for denne sida.",
+'anoneditwarning' => "'''Åtvaring:''' Du er ikkje innlogga. IP-adressa di vert lagra i historikken for sida.",
 'anonpreviewwarning' => "''Du er ikkje innlogga. Lagrar du vil IP-adressa di verta førd opp i endringshistorikken til denne sida.''",
 'missingsummary' => "'''Påminning:''' Du har ikkje skrive noko endringssamandrag. Dersom du trykkjer «Lagre» ein gong til, vert endringa di lagra utan.",
 'missingcommenttext' => 'Ver venleg og skriv ein kommentar nedanfor.',
@@ -1062,7 +1085,7 @@ Grunnen som vart gjeven av $3 er ''$2''",
 'rev-deleted-comment' => '(endringssamandrag fjerna)',
 'rev-deleted-user' => '(brukarnamnet er fjerna)',
 'rev-deleted-event' => '(fjerna loggoppføring)',
-'rev-deleted-user-contribs' => 'brukarnamn eller IP-adresse er fjerna - endringa er skjult i bidraga',
+'rev-deleted-user-contribs' => '[brukarnamn eller IP-adresse fjerna - endringa er gøymd frå bidraga]',
 'rev-deleted-text-permission' => "Denne sideversjonen er vorten '''sletta'''.
 Det kan vere detaljar i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
 'rev-deleted-text-unhide' => "Denne sideversjonen er vorten '''sletta'''.
@@ -1194,7 +1217,7 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
 'difference-multipage' => '(Skilnad mellom sider)',
 'lineno' => 'Line $1:',
 'compareselectedversions' => 'Samanlikn valde versjonar',
-'showhideselectedversions' => 'Syn/skjul valde versjonar',
+'showhideselectedversions' => 'Vis/løyn valde versjonar',
 'editundo' => 'angre',
 'diff-multi' => '({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} frå {{PLURAL:$2|éin brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ein mellomversjon|$1 mellomversjonar}} av meir enn $2 {{PLURAL:$2|brukar|brukarar}}  er ikkje {{PLURAL:$1|vist|viste}})',
@@ -1349,7 +1372,7 @@ Her er det framlegg til eit tal som kan nyttast, tilfelleleg henta fram: $1',
 'prefs-custom-js' => 'Eigendefinert JavaScript',
 'prefs-common-css-js' => 'Delt CSS/JavaScript for alle draktene:',
 'prefs-reset-intro' => 'Du kan nytta denne sida til å tilbakestilla innstillingane dine til standardinnstillingane.
-Dette kan ikke tilbakestillast.',
+Dette kan ikkje tilbakestillast.',
 'prefs-emailconfirm-label' => 'Stadfesting av e-post:',
 'prefs-textboxsize' => 'Storleiken til redigeringsvindauga',
 'youremail' => 'E-post:',
@@ -1477,7 +1500,7 @@ Dette kan ikke tilbakestillast.',
 'right-ipblock-exempt' => 'Kan gjere endringar frå blokkerte IP-adresser',
 'right-proxyunbannable' => 'Kan gjere endringar frå blokkerte proxyar',
 'right-unblockself' => 'Avblokkera seg sjølve',
-'right-protect' => 'Endre vernenivå',
+'right-protect' => 'Endra vernenivå og verna sider',
 'right-editprotected' => 'Endre verna sider',
 'right-editinterface' => 'Redigere brukargrensesnittet',
 'right-editusercssjs' => 'Endre andre brukarar sine CSS- og JS-filer',
@@ -1525,13 +1548,13 @@ Dette kan ikke tilbakestillast.',
 'action-writeapi' => 'bruke skrive-API',
 'action-delete' => 'slette denne sida',
 'action-deleterevision' => 'slette denne endringa',
-'action-deletedhistory' => 'sjå slettehistorikken til denne sida',
+'action-deletedhistory' => 'sjå slettehistorikken til sida',
 'action-browsearchive' => 'søke i sletta sider',
 'action-undelete' => 'attopprette denne sida',
 'action-suppressrevision' => 'sjå og attopprette denne skjulte endringa',
 'action-suppressionlog' => 'sjå denne private loggen',
 'action-block' => 'blokkere denne brukaren frå å gjere endringar',
-'action-protect' => 'endre vernenivået til denne sida',
+'action-protect' => 'endre vernenivået til sida',
 'action-import' => 'importere denne sida frå ein annan wiki',
 'action-importupload' => 'importere denne sida frå ei opplasta fil',
 'action-patrol' => 'merke andre endringar av andre brukar som patruljert',
@@ -1549,7 +1572,7 @@ Dette kan ikke tilbakestillast.',
 'recentchanges-legend' => 'Alternativ for siste endringar',
 'recentchanges-summary' => 'På denne sida ser du dei sist endra sidene i {{SITENAME}}.',
 'recentchanges-feed-description' => 'Fylg med på dei siste endringane på denne wikien med dette abonnementet.',
-'recentchanges-label-newpage' => 'Denne redigeringa oppretta ei ny side',
+'recentchanges-label-newpage' => 'Denne endringa oppretta ei ny side',
 'recentchanges-label-minor' => 'Dette er ei mindre endring',
 'recentchanges-label-bot' => 'Denne endringa vart gjort av ein bot',
 'recentchanges-label-unpatrolled' => 'Denne endringa er ikkje patruljert enno',
@@ -1605,9 +1628,9 @@ Slette- og flytteloggen til sida er gjeven opp her:",
 For å sjå eller søkje i eksisterande filer, gå til [[Special:FileList|fillista]]. Opplastingar vert òg lagra i [[Special:Log/upload|opplastingsloggen]], og slettingar i [[Special:Log/delete|sletteloggen]].
 
 For å bruke ei fil på ei side, bruk ei lenkje på eit liknande format:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnamn.jpg<nowiki>]]</nowiki></tt>''' for å bruke biletet i opphavleg form
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnamn.png|200px|mini|venstre|Alternativ tekst<nowiki>]]</nowiki></tt>''' for å bruke biletet med ei breidd på 200&nbsp;pikslar, venstrestilt og med «Alternativ tekst» som bilettekst
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}:Filnamn.ogg<nowiki>]]</nowiki></tt>''' for å lenkje direkte til fila utan å vise ho",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}:Filnamn.jpg<nowiki>]]</nowiki></code>''' for å bruke biletet i opphavleg form
+*'''<code><nowiki>[[</nowiki>{{ns:file}}:Filnamn.png|200px|mini|venstre|Alternativ tekst<nowiki>]]</nowiki></code>''' for å bruke biletet med ei breidd på 200&nbsp;pikslar, venstrestilt og med «Alternativ tekst» som bilettekst
+*'''<code><nowiki>[[</nowiki>{{ns:media}}:Filnamn.ogg<nowiki>]]</nowiki></code>''' for å lenkje direkte til fila utan å vise ho",
 'upload-permitted' => 'Godtekne filtypar: $1.',
 'upload-preferred' => 'Føretrekte filtypar: $1.',
 'upload-prohibited' => 'Ikkje godtekne filtypar: $1.',
@@ -1650,18 +1673,18 @@ For å bruke ei fil på ei side, bruk ei lenkje på eit liknande format:
 'largefileserver' => 'Denne fila er større enn det tenaren tillèt.',
 'emptyfile' => 'Det ser ut til at fila du lasta opp er tom. Dette kan komma av ein skrivefeil i filnamnet. Sjekk og tenk etter om du verkeleg vil laste opp fila.',
 'windows-nonascii-filename' => 'Wikien stør ikkje filnamn med spesialteikn.',
-'fileexists' => "Ei fil med dette namnet finst allereie, sjekk '''<tt>[[:$1]]</tt>''' om du ikkje er sikker på om du vil endre namnet.
-[[$1|thumb]]",
-'filepageexists' => "Skildringssida for denne fila finst allereie på '''<tt>[[:$1]]</tt>''', men det finst ikkje noka fil med dette namnet. Endringssamandraget du skriv inn vert ikkje vist på skildringssida. For at det skal dukke opp der, må du skrive det inn på skildringssida manuelt etter å ha lasta opp fila.
-[[$1|thumb]]",
-'fileexists-extension' => "Ei fil med eit liknande namn finst allereie: [[$2|thumb]]
-* Namnet på fila du lastar opp: '''<tt>[[:$1]]</tt>'''
-* Namnet på den eksisterande fila: '''<tt>[[:$2]]</tt>'''
-Ver venleg og vel eit anna namn.",
-'fileexists-thumbnail-yes' => "Fila ser ut til å vere eit bilete med redusert storleik. [[$1|thumb]]
-Ver venleg og sjekk fila '''<tt>[[:$1]]</tt>'''.
-Dersom denne er det same biletet i original storleik, er det ikkje nødvendig å laste opp ein mindre versjon.",
-'file-thumbnail-no' => "Filnamnet byrjar med '''<tt>$1</tt>'''.
+'fileexists' => 'Ei fil med dette namnet finst allereie, sjekk <strong>[[:$1]]</strong> om du ikkje er sikker på om du vil endre namnet.
+[[$1|thumb]]',
+'filepageexists' => 'Skildringssida for denne fila finst allereie på <strong>[[:$1]]</strong>, men det finst ikkje noka fil med dette namnet. Endringssamandraget du skriv inn vert ikkje vist på skildringssida. For at det skal dukke opp der, må du skrive det inn på skildringssida manuelt etter å ha lasta opp fila.
+[[$1|thumb]]',
+'fileexists-extension' => 'Ei fil med eit liknande namn finst allereie: [[$2|thumb]]
+* Namnet på fila du lastar opp: <strong>[[:$1]]</strong>
+* Namnet på den eksisterande fila: <strong>[[:$2]]</strong>
+Ver venleg og vel eit anna namn.',
+'fileexists-thumbnail-yes' => 'Fila ser ut til å vere eit bilete med redusert storleik. [[$1|thumb]]
+Ver venleg og sjekk fila <strong>[[:$1]]</strong>.
+Dersom denne er det same biletet i original storleik, er det ikkje nødvendig å laste opp ein mindre versjon.',
+'file-thumbnail-no' => "Filnamnet byrjar med <strong>$1</strong>.
 Det ser ut til å vere eit bilte med redusert storleik''(miniatyrbilete)''.
 Om du har dette bilete i stor utgåve, så last det opp eller endre filnamnet på denne fila.",
 'fileexists-forbidden' => 'Ei fil med dette namnet finst allereie, og ho kan ikkje verte skriven over.
@@ -1790,7 +1813,7 @@ For best tryggleik, er img_auth.php sett ut av funksjon.',
 'filehist-help' => 'Klikk på dato/klokkeslett for å sjå fila slik ho var på det tidspunktet.',
 'filehist-deleteall' => 'slett alle',
 'filehist-deleteone' => 'slett',
-'filehist-revert' => 'rull attende',
+'filehist-revert' => 'rulla attende',
 'filehist-current' => 'noverande',
 'filehist-datetime' => 'Dato/klokkeslett',
 'filehist-thumb' => 'Miniatyrbilete',
@@ -1822,7 +1845,7 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
 'shared-repo' => 'eit sams fillager',
 
 # File reversion
-'filerevert' => 'Rull attende $1',
+'filerevert' => 'Rulla attende $1',
 'filerevert-legend' => 'Rull attende fila',
 'filerevert-intro' => "Du rullar attende '''[[Media:$1|$1]]''' til [$4 versjonen frå $3, $2].",
 'filerevert-comment' => 'Årsak:',
@@ -1853,7 +1876,7 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
 
 # MIME search
 'mimesearch' => 'MIME-søk',
-'mimesearch-summary' => 'Denne sida gjer filtrering av filer etter MIME-type mogleg. Skriv inn: innhaldstype/undertype, t.d. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Denne sida gjer filtrering av filer etter MIME-type mogleg. Skriv inn: innhaldstype/undertype, t.d. <code>image/jpeg</code>.',
 'mimetype' => 'MIME-type:',
 'download' => 'last ned',
 
@@ -1997,6 +2020,7 @@ Merk at andre internettsider kan ha direkte lenkjer til filer, og difor kan file
 'alllogstext' => 'Kombinert vising av alle loggane på {{SITENAME}}. Du kan avgrense resultatet ved å velje loggtype, brukarnamn eller den sida som er påverka (hugs å skilje mellom store og små bokstavar)',
 'logempty' => 'Ingen treff i loggane.',
 'log-title-wildcard' => 'Søk i titlar som byrjar med denne teksten',
+'showhideselectedlogentries' => 'Vis/gøym valde loggoppføringar',
 
 # Special:AllPages
 'allpages' => 'Alle sider',
@@ -2038,7 +2062,7 @@ Sjå òg [[Special:WantedCategories|ønska kategoriar]].',
 'linksearch-pat' => 'Søkemønster:',
 'linksearch-ns' => 'Namnerom:',
 'linksearch-ok' => 'Søk',
-'linksearch-text' => 'Jokerteikn som «*.wikipedia.org» kan nyttast.<br />Støtta protokollar: <tt>$1</tt>',
+'linksearch-text' => 'Jokerteikn som «*.wikipedia.org» kan nyttast.<br />Støtta protokollar: <code>$1</code>',
 'linksearch-line' => '$2 lenkjer til $1',
 'linksearch-error' => 'Jokerteikn kan berre nyttast føre tenarnamnet.',
 
@@ -2133,9 +2157,9 @@ Om du seinare vil fjerne sida frå overvakingslista, klikk på «Fjern overvakin
 'watchnochange' => 'Ingen av sidene i overvakingslista er endra i den valde perioden.',
 'watchlist-details' => '{{PLURAL:$1|Éi side|$1 sider}} er overvaka, utanom diskusjonssider.',
 'wlheader-enotif' => '* Funksjonen for endringsmeldingar per e-post er på.',
-'wlheader-showupdated' => "* Sider som er vortne endra sidan du sist såg på dei er '''utheva'''",
+'wlheader-showupdated' => "* Sider som har blitt endra sidan du sist såg på dei er '''utheva'''",
 'watchmethod-recent' => 'sjekkar siste endringar for dei overvaka sidene',
-'watchmethod-list' => 'sjekkar om dei overvaka sidene er vortne endra i det siste',
+'watchmethod-list' => 'sjekkar om dei overvaka sidene har blitt endra i det siste',
 'watchlistcontains' => 'Overvakingslista di inneheld {{PLURAL:$1|éi side|$1 sider}}.',
 'iteminvalidname' => 'Problem med «$1», ugyldig namn...',
 'wlnote' => "Nedanfor er {{PLURAL:$1|den siste endringa|dei siste '''$1''' endringane}} {{PLURAL:$2|den siste timen|dei siste '''$2''' timane}}, for $3, kl. $4.",
@@ -2215,8 +2239,10 @@ Tilbakemeldingar og anna hjelp:
 
 # Rollback
 'rollback' => 'Rull attende endringar',
-'rollback_short' => 'Rull attende',
-'rollbacklink' => 'rull attende',
+'rollback_short' => 'Rulla attende',
+'rollbacklink' => 'rulla attende',
+'rollbacklinkcount' => 'rulla attende {{PLURAL:$1|éi endring|$1 endringar}}',
+'rollbacklinkcount-morethan' => 'rulla attende meir enn {{PLURAL:$1|éi endring|$1 endringar}}',
 'rollbackfailed' => 'Kunne ikkje rulle attende',
 'cantrollback' => 'Kan ikkje rulle attende fordi den siste brukaren er den einaste forfattaren.',
 'alreadyrolled' => 'Kan ikkje rulle attende den siste endringa av [[$1]] gjort av [[User:$2|$2]] ([[User talk:$2|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) fordi nokon andre alt har endra sida att eller fjerna endringa.
@@ -2579,7 +2605,7 @@ I desse falla lyt du flytte eller flette saman sida manuelt.",
 'move-subpages' => 'Flytt undersider (opp til $1)',
 'move-talk-subpages' => 'Flytt undersider av diskusjonssida (opp til $1)',
 'movepage-page-exists' => 'Sida $1 finst alt og kan ikkje skrivast over automatisk.',
-'movepage-page-moved' => 'Sida $1 har blitt flytta til $2.',
+'movepage-page-moved' => 'Sida $1 er flytt til $2.',
 'movepage-page-unmoved' => 'Sida $1 kunne ikkje flyttast til $2.',
 'movepage-max-pages' => 'Grensa på {{PLURAL:$1|éi side|$1 sider}} er nådd; ingen fleire sider kjem til å verte flytta automatisk.',
 'movelogpage' => 'Flyttelogg',
@@ -2590,9 +2616,9 @@ I desse falla lyt du flytte eller flette saman sida manuelt.",
 'movereason' => 'Årsak:',
 'revertmove' => 'flytt attende',
 'delete_and_move' => 'Slett og flytt',
-'delete_and_move_text' => '== Sletting påkrevd ==
+'delete_and_move_text' => '== Sletting påkravd ==
 
-Målsida «[[:$1]]» finst allereie. Vil du slette ho for å gje rom for flytting?',
+Målsida «[[:$1]]» finst alt. Vil du sletta henne for å gjeva rom for flytting?',
 'delete_and_move_confirm' => 'Ja, slett sida',
 'delete_and_move_reason' => 'Sletta for å gje rom for flytting frå «[[$1]]»',
 'selfmove' => 'Kjelde- og måltitlane er like; kan ikkje flytte sida over seg sjølv.',
@@ -2727,14 +2753,14 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'tooltip-ca-edit' => 'Du kan endre denne sida. Bruk førehandsvisings-knappen før du lagrar.',
 'tooltip-ca-addsection' => 'Start ein ny bolk',
 'tooltip-ca-viewsource' => 'Denne sida er verna, men du kan sjå kjeldeteksten.',
-'tooltip-ca-history' => 'Eldre versjonar av denne sida',
+'tooltip-ca-history' => 'Eldre versjonar av sida',
 'tooltip-ca-protect' => 'Vern denne sida',
 'tooltip-ca-unprotect' => 'Endra vernet av sida',
 'tooltip-ca-delete' => 'Slett denne sida',
 'tooltip-ca-undelete' => 'Attopprett denne sida',
 'tooltip-ca-move' => 'Flytt denne sida',
-'tooltip-ca-watch' => 'Legg denne sida til i overvakingslista di',
-'tooltip-ca-unwatch' => 'Fjern denne sida frå overvakingslista di',
+'tooltip-ca-watch' => 'Legg til sida i overvakingslista di',
+'tooltip-ca-unwatch' => 'Fjern sida frå overvakingslista di',
 'tooltip-search' => 'Søk gjennom {{SITENAME}}',
 'tooltip-search-go' => 'Gå til ei side med dette namnet om ho finst',
 'tooltip-search-fulltext' => 'Søk etter sider som inneheld denne teksten',
@@ -2771,11 +2797,11 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'tooltip-preview' => 'Førehandsvis endringane dine, bruk denne funksjonen før du lagrar!',
 'tooltip-diff' => 'Vis skilnaden mellom din versjon og lagra versjon, utan å lagre.',
 'tooltip-compareselectedversions' => 'Sjå endringane mellom dei valde versjonane av denne sida.',
-'tooltip-watch' => 'Legg denne sida til i overvakingslista di [alt-w]',
+'tooltip-watch' => 'Legg sida til i overvakingslista di [alt-w]',
 'tooltip-watchlistedit-raw-submit' => 'Oppdater overvakingslista',
 'tooltip-recreate' => 'Ved å trykkje på «Nyopprett» vert sida oppretta på nytt.',
 'tooltip-upload' => 'Start opplastinga',
-'tooltip-rollback' => '«Attenderull»-knappen attenderullar endringar på denne sida med eitt klikk til den førre utgåva av ein annan brukar',
+'tooltip-rollback' => '«Rulla attende»-knappen rullar med eitt klikk attende endringa(ne) på sida gjorde av den siste bidragsytaren',
 'tooltip-undo' => '«Gjer om» attenderullar endringar og opnar endringsvindauga med førehandsvising. Gjer at ein kan leggje til ei årsak samandragsboksen.',
 'tooltip-preferences-save' => 'Lagra innstillingar',
 'tooltip-summary' => 'Skriv inn eit kort samandrag',
@@ -2830,15 +2856,10 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 # Info page
 'pageinfo-title' => 'Informasjon om «$1»',
 'pageinfo-header-edits' => 'Endringar',
-'pageinfo-header-watchlist' => 'Overvakingsliste',
-'pageinfo-header-views' => 'Visningar',
-'pageinfo-subjectpage' => 'Side',
-'pageinfo-talkpage' => 'Diskusjonsside',
+'pageinfo-views' => 'Tal på visningar',
 'pageinfo-watchers' => 'Antal overvakarar',
 'pageinfo-edits' => 'Tal på endringar',
 'pageinfo-authors' => 'Tal på forskjellege forfattarar',
-'pageinfo-views' => 'Tal på visningar',
-'pageinfo-viewsperedit' => 'Visningar per endring',
 
 # Skin names
 'skinname-standard' => 'Klassisk',
@@ -3573,6 +3594,8 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
 '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' => '$1 oppretta ein brukarkonto',
 'logentry-newusers-create' => '$1 oppretta ein brukarkonto',
 'logentry-newusers-create2' => '$1 oppretta brukarkontoen $3',
@@ -3603,6 +3626,7 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
 'api-error-file-too-large' => 'Fila du sende var for stor.',
 'api-error-filename-tooshort' => 'Filnamnet er for stutt.',
 'api-error-filetype-banned' => 'Denne filtypen er ikkje tillaten.',
+'api-error-filetype-banned-type' => '$1 er ikkje ein tillaten filtype. {{PLURAL:$3|Tillaten filtype er|Tillatne filtypar er}} $2.',
 'api-error-filetype-missing' => 'Fila saknar ei ending.',
 'api-error-http' => 'Intern feil: kan ikkje kopla til tenaren.',
 'api-error-illegal-filename' => 'Filnamnet er ikkje tillate.',
index 94b5b1f..848131a 100644 (file)
@@ -32,14 +32,14 @@ $namespaceNames = array(
 );
 
 $magicWords = array(
-       'currentmonth'            => array( '1', 'KGWEDI_BJALE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'LEINA_KGWEDI_BJALE', 'CURRENTMONTHNAME' ),
-       'currentday'              => array( '1', 'LEHONO_LETSATSI', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'LEHONO_LETSATSI2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'LEHONO_LETSATSILEINA', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'NGWAGA_BJALE', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'NAKO_BJALE', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'IRI_BJALE', 'CURRENTHOUR' ),
+       'currentmonth'              => array( '1', 'KGWEDI_BJALE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'LEINA_KGWEDI_BJALE', 'CURRENTMONTHNAME' ),
+       'currentday'                => array( '1', 'LEHONO_LETSATSI', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'LEHONO_LETSATSI2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'LEHONO_LETSATSILEINA', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'NGWAGA_BJALE', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'NAKO_BJALE', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'IRI_BJALE', 'CURRENTHOUR' ),
 );
 
 $messages = array(
index de04157..6b4a774 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Occitan (Occitan)
+/** Occitan (occitan)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -146,130 +146,130 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#REDIRECCION', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__CAPDETAULA__', '__PASCAPDESOMARI__', '__PASCAPDETDM__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__CAPDEGALARIÁ__', '__CAPDEGALARIA__', '__PASCAPDEDEGALARIÁ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORÇARTAULA__', '__FORÇARSOMARI__', '__FORÇARTDM__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__TAULA__', '__SOMARI__', '__TDM__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__SECCIONNONEDITABLA__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__PASCAPDENTÈSTA__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'MESCORRENT', 'MESACTUAL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'NOMMESCORRENT', 'NOMMESACTUAL', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'NOMGENMESCORRENT', 'NOMGENMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ABREVMESCORRENT', 'ABREVMESACTUAL', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'JORNCORRENT', 'JORNACTUAL', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'JORNCORRENT2', 'JORNACTUAL2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NOMJORNCORRENT', 'NOMJORNACTUAL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ANNADACORRENTA', 'ANNADAACTUALA', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'DATACORRENTA', 'DATAACTUALA', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ORACORRENTA', 'ORAACTUALA', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'NOMMESLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'NOMGENMESLOCAL', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ABREVMESLOCAL', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'JORNLOCAL', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'JORNLOCAL2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NOMJORNLOCAL', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ANNADALOCALA', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ORARILOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ORALOCALA', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NOMBREPAGINAS', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NOMBREFICHIÈRS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NOMBREUTILIZAIRES', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NOMBREUTILIZAIRESACTIUS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NOMBREEDICIONS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NOMBREVISTAS', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'NOMPAGINA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NOMPAGINAX', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ESPACINOMENATGE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ESPACINOMENATGEX', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ESPACIDISCUSSION', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ESPACIDISCUSSIONX', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ESPACISUBJECTE', 'ESPACISUBJÈCTE', 'ESPACIARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ESPACISUBJECTEX', 'ESPACISUBJÈCTEX', 'ESPACIARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'NOMPAGINACOMPLET', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'NOMPAGINACOMPLETX', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NOMSOSPAGINA', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NOMSOSPAGINAX', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NOMBASADEPAGINA', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NOMBASADEPAGINAX', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NOMPAGINADISCUSSION', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NOMPAGINADISCUSSIONX', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NOMPAGINASUBJECTE', 'NOMPAGINASUBJÈCTE', 'NOMPAGINAARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NOMPAGINASUBJECTEX', 'NOMPAGINASUBJÈCTEX', 'NOMPAGINAARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'img_thumbnail'           => array( '1', 'vinheta', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'vinheta=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'drecha', 'dreta', 'right' ),
-       'img_left'                => array( '1', 'esquèrra', 'senèstra', 'gaucha', 'left' ),
-       'img_none'                => array( '1', 'neant', 'nonrés', 'none' ),
-       'img_center'              => array( '1', 'centrat', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'quadre', 'enquagrat', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'sens_quadre', 'frameless' ),
-       'img_upright'             => array( '1', 'redreça', 'redreça$1', 'redreça $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'bordadura', 'border' ),
-       'img_baseline'            => array( '1', 'linha_de_basa', 'baseline' ),
-       'img_sub'                 => array( '1', 'indici', 'ind', 'sub' ),
-       'img_super'               => array( '1', 'exp', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'naut', 'top' ),
-       'img_text_top'            => array( '1', 'naut-tèxte', 'naut-txt', 'text-top' ),
-       'img_middle'              => array( '1', 'mitan', 'middle' ),
-       'img_bottom'              => array( '1', 'bas', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'bas-tèxte', 'bas-txt', 'text-bottom' ),
-       'img_link'                => array( '1', 'ligam=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'NOMSIT', 'NOMSITE_NOMSITI', 'SITENAME' ),
-       'ns'                      => array( '0', 'ESPACEN:', 'NS:' ),
-       'localurl'                => array( '0', 'URLLOCALA:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URLLOCALAX:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'SERVIDOR', 'SERVER' ),
-       'servername'              => array( '0', 'NOMSERVIDOR', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'CAMINESCRIPT', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'GRAMATICA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GENRE:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'SETMANACORRENTA', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'JDSCORRENT', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'SETMANALOCALA', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'JDSLOCAL', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'NUMÈROVERSION', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'DATAVERSION', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'DATAVERSION2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MESREVISION', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ANNADAREVISION', 'ANREVISION', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'ORAREVISION', 'REVISIONTIMESTAMP' ),
-       'fullurl'                 => array( '0', 'URLCOMPLETA:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLCOMPLETAX:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'INITMINUS:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'INITMAJUS:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MINUS:', 'LC:' ),
-       'uc'                      => array( '0', 'MAJUS:', 'CAPIT:', 'UC:' ),
-       'raw'                     => array( '0', 'LINHA:', 'BRUT:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'AFICHARTÍTOL', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'BRUT', 'B', 'R' ),
-       'newsectionlink'          => array( '1', '__LIGAMSECCIONNOVÈLA__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__PASCAPDELIGAMSECCIONNOVÈLA__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'VERSIONACTUALA', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ENCÒDAURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'ENCÒDAANCÒRA', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'INSTANTACTUAL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'MARCADIRECCION', 'MARCADIR', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#LENGA:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'LENGACONTENGUT', 'LENGCONTENGUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PAGINASDINSESPACI:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMATNOMBRE', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'BORRATGEESQUÈRRA', 'PADLEFT' ),
-       'padright'                => array( '0', 'BORRATGEDRECHA', 'PADRIGHT' ),
-       'special'                 => array( '0', 'especial', 'special' ),
-       'defaultsort'             => array( '1', 'ORDENA:', 'CLAUDETRIADA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'CAMIN:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'balisa', 'tag' ),
-       'hiddencat'               => array( '1', '__CATAMAGADA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAGINASDINSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'TALHAPAGINA', 'PAGESIZE' ),
-       'noindex'                 => array( '1', '__PASCAPDINDÈX__', '__NOINDEX__' ),
-       'staticredirect'          => array( '1', '__REDIRECCIONESTATICA__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'NIVÈLDEPROTECCION', 'PROTECTIONLEVEL' ),
+       'redirect'                  => array( '0', '#REDIRECCION', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__CAPDETAULA__', '__PASCAPDESOMARI__', '__PASCAPDETDM__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__CAPDEGALARIÁ__', '__CAPDEGALARIA__', '__PASCAPDEDEGALARIÁ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORÇARTAULA__', '__FORÇARSOMARI__', '__FORÇARTDM__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__TAULA__', '__SOMARI__', '__TDM__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__SECCIONNONEDITABLA__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__PASCAPDENTÈSTA__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'MESCORRENT', 'MESACTUAL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'NOMMESCORRENT', 'NOMMESACTUAL', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'NOMGENMESCORRENT', 'NOMGENMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ABREVMESCORRENT', 'ABREVMESACTUAL', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'JORNCORRENT', 'JORNACTUAL', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'JORNCORRENT2', 'JORNACTUAL2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NOMJORNCORRENT', 'NOMJORNACTUAL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ANNADACORRENTA', 'ANNADAACTUALA', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'DATACORRENTA', 'DATAACTUALA', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ORACORRENTA', 'ORAACTUALA', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'NOMMESLOCAL', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'NOMGENMESLOCAL', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ABREVMESLOCAL', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'JORNLOCAL', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'JORNLOCAL2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NOMJORNLOCAL', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ANNADALOCALA', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ORARILOCAL', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ORALOCALA', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NOMBREPAGINAS', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NOMBREFICHIÈRS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NOMBREUTILIZAIRES', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NOMBREUTILIZAIRESACTIUS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NOMBREEDICIONS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NOMBREVISTAS', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'NOMPAGINA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NOMPAGINAX', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ESPACINOMENATGE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ESPACINOMENATGEX', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ESPACIDISCUSSION', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ESPACIDISCUSSIONX', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ESPACISUBJECTE', 'ESPACISUBJÈCTE', 'ESPACIARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ESPACISUBJECTEX', 'ESPACISUBJÈCTEX', 'ESPACIARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NOMPAGINACOMPLET', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NOMPAGINACOMPLETX', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NOMSOSPAGINA', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NOMSOSPAGINAX', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NOMBASADEPAGINA', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NOMBASADEPAGINAX', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NOMPAGINADISCUSSION', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NOMPAGINADISCUSSIONX', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NOMPAGINASUBJECTE', 'NOMPAGINASUBJÈCTE', 'NOMPAGINAARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NOMPAGINASUBJECTEX', 'NOMPAGINASUBJÈCTEX', 'NOMPAGINAARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'img_thumbnail'             => array( '1', 'vinheta', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'vinheta=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'drecha', 'dreta', 'right' ),
+       'img_left'                  => array( '1', 'esquèrra', 'senèstra', 'gaucha', 'left' ),
+       'img_none'                  => array( '1', 'neant', 'nonrés', 'none' ),
+       'img_center'                => array( '1', 'centrat', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'quadre', 'enquagrat', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'sens_quadre', 'frameless' ),
+       'img_upright'               => array( '1', 'redreça', 'redreça$1', 'redreça $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'bordadura', 'border' ),
+       'img_baseline'              => array( '1', 'linha_de_basa', 'baseline' ),
+       'img_sub'                   => array( '1', 'indici', 'ind', 'sub' ),
+       'img_super'                 => array( '1', 'exp', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'naut', 'top' ),
+       'img_text_top'              => array( '1', 'naut-tèxte', 'naut-txt', 'text-top' ),
+       'img_middle'                => array( '1', 'mitan', 'middle' ),
+       'img_bottom'                => array( '1', 'bas', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'bas-tèxte', 'bas-txt', 'text-bottom' ),
+       'img_link'                  => array( '1', 'ligam=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'NOMSIT', 'NOMSITE_NOMSITI', 'SITENAME' ),
+       'ns'                        => array( '0', 'ESPACEN:', 'NS:' ),
+       'localurl'                  => array( '0', 'URLLOCALA:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URLLOCALAX:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'SERVIDOR', 'SERVER' ),
+       'servername'                => array( '0', 'NOMSERVIDOR', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'CAMINESCRIPT', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'GRAMATICA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GENRE:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'SETMANACORRENTA', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'JDSCORRENT', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'SETMANALOCALA', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'JDSLOCAL', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'NUMÈROVERSION', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'DATAVERSION', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'DATAVERSION2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MESREVISION', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ANNADAREVISION', 'ANREVISION', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'ORAREVISION', 'REVISIONTIMESTAMP' ),
+       'fullurl'                   => array( '0', 'URLCOMPLETA:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLCOMPLETAX:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'INITMINUS:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'INITMAJUS:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MINUS:', 'LC:' ),
+       'uc'                        => array( '0', 'MAJUS:', 'CAPIT:', 'UC:' ),
+       'raw'                       => array( '0', 'LINHA:', 'BRUT:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'AFICHARTÍTOL', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'BRUT', 'B', 'R' ),
+       'newsectionlink'            => array( '1', '__LIGAMSECCIONNOVÈLA__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__PASCAPDELIGAMSECCIONNOVÈLA__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VERSIONACTUALA', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ENCÒDAURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ENCÒDAANCÒRA', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'INSTANTACTUAL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'MARCADIRECCION', 'MARCADIR', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#LENGA:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'LENGACONTENGUT', 'LENGCONTENGUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PAGINASDINSESPACI:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMATNOMBRE', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'BORRATGEESQUÈRRA', 'PADLEFT' ),
+       'padright'                  => array( '0', 'BORRATGEDRECHA', 'PADRIGHT' ),
+       'special'                   => array( '0', 'especial', 'special' ),
+       'defaultsort'               => array( '1', 'ORDENA:', 'CLAUDETRIADA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'CAMIN:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'balisa', 'tag' ),
+       'hiddencat'                 => array( '1', '__CATAMAGADA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAGINASDINSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'TALHAPAGINA', 'PAGESIZE' ),
+       'noindex'                   => array( '1', '__PASCAPDINDÈX__', '__NOINDEX__' ),
+       'staticredirect'            => array( '1', '__REDIRECCIONESTATICA__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVÈLDEPROTECCION', 'PROTECTIONLEVEL' ),
 );
 
 $datePreferences = array(
@@ -332,7 +332,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Amaga, de la tièra, las modificacions pels utilizaires connectats',
 'tog-watchlisthideanons' => 'Amaga, de la tièra, las modificacions anonimas',
 'tog-watchlisthidepatrolled' => 'Amagar las modificacions susvelhadas de la lista de seguiment',
-'tog-nolangconversion' => 'Desactivar la conversion de las variantas de lenga',
 'tog-ccmeonemails' => 'Me mandar una còpia dels corrièrs electronics que mandi als autres utilizaires',
 'tog-diffonly' => 'Far pas veire lo contengut de las paginas jos las difs',
 'tog-showhiddencats' => 'Afichar las categorias amagadas',
@@ -1585,9 +1584,9 @@ Lo jornal de las supressions e lo dels desplaçaments d'aquesta pagina son afich
 Per veire o recercar d'imatges mandats precedentament, consultatz [[Special:FileList|la tièra dels imatges]]. Las còpias e las supressions tanben son enregistradas dins l'[[Special:Log/upload|istoric dels impòrts]], las supressions dins l’[[Special:Log/delete|istoric de las supressions]].
 
 Per inclure un imatge dins una pagina, utilizatz un ligam de la forma
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichièr.jpg]]</nowiki></tt>''',
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichièr.png|200px|thumb|left|tèxte descriptiu]]</nowiki></tt>''' per utilizar una miniatura de 200 pixèls de larg dins una bóstia a esquèrra amb 'tèxte descriptiu' coma descripcion
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichièr.ogg]]</nowiki></tt>''' per ligar dirèctament cap al fichièr sens l'afichar.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichièr.jpg]]</nowiki></code>''',
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichièr.png|200px|thumb|left|tèxte descriptiu]]</nowiki></code>''' per utilizar una miniatura de 200 pixèls de larg dins una bóstia a esquèrra amb 'tèxte descriptiu' coma descripcion
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichièr.ogg]]</nowiki></code>''' per ligar dirèctament cap al fichièr sens l'afichar.",
 'upload-permitted' => 'Formats de fichièrs autorizats : $1.',
 'upload-preferred' => 'Formats de fichièrs preferits : $1.',
 'upload-prohibited' => 'Formats de fichièrs interdiches : $1.',
@@ -1629,20 +1628,20 @@ Vejatz la [[Special:NewFiles|galariá dels imatges novèls]] per una presentacio
 'large-file' => 'Los fichièrs importats deurián pas èsser mai gros que $1 ; aqueste fichièr fa $2.',
 'largefileserver' => "La talha d'aqueste fichièr es superiora al maximum autorizat.",
 'emptyfile' => 'Lo fichièr que volètz importar sembla void. Aquò pòt èsser degut a una error dins lo nom del fichièr. Verificatz que desiratz vertadièrament copiar aqueste fichièr.',
-'fileexists' => "Un fichièr amb aqueste nom existís ja.
-Mercé de verificar '''<tt>[[:$1]]</tt>'''.
-Sètz segur de voler modificar aqueste fichièr ? [[$1|thumb]]",
-'filepageexists' => "La pagina de descripcion per aqueste fichièr ja es estada creada aicí '''<tt>[[:$1]]</tt>''', mas cap de fichièr existís pas actualament jos aqueste nom.
+'fileexists' => 'Un fichièr amb aqueste nom existís ja.
+Mercé de verificar <strong>[[:$1]]</strong>.
+Sètz segur de voler modificar aqueste fichièr ? [[$1|thumb]]',
+'filepageexists' => "La pagina de descripcion per aqueste fichièr ja es estada creada aicí <strong>[[:$1]]</strong>, mas cap de fichièr existís pas actualament jos aqueste nom.
 Lo resumit qu'anatz especificar apareisserà pas sus la pagina de descripcion.
 Per o far, vos caldrà modificar la pagina manualament. [[$1|vinheta]]",
 'fileexists-extension' => "Un fichièr amb un nom pròchi existís ja : [[$2|thumb]]
-* Nom del fichièr d'importar : '''<tt>[[:$1]]</tt>'''
-* Nom del fichièr existent : '''<tt>[[:$2]]</tt>'''
+* Nom del fichièr d'importar : <strong>[[:$1]]</strong>
+* Nom del fichièr existent : <strong>[[:$2]]</strong>
 Causissètz-ne un autre.",
 'fileexists-thumbnail-yes' => "Lo fichièr sembla èsser un imatge en talha reducha ''(thumbnail)''. [[$1|thumb]]
-Verificatz lo fichièr '''<tt>[[:$1]]</tt>'''.
+Verificatz lo fichièr <strong>[[:$1]]</strong>.
 Se lo fichièr verificat es lo meteis imatge (dins una resolucion melhora), es pas de besonh d’importar una version reducha.",
-'file-thumbnail-no' => "Lo nom del fichièr comença per '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Lo nom del fichièr comença per <strong>$1</strong>.
 Es possible que s’agisca d’una version reducha ''(miniatura)''.
 Se dispausatz del fichièr en resolucion nauta, importatz-lo, si que non cambiatz lo nom del fichièr.",
 'fileexists-forbidden' => "Un fichièr amb aqueste nom existís ja e pòt pas èsser espotit.
@@ -1827,7 +1826,7 @@ Una [[Special:WhatLinksHere/$2|tièra completa]] es disponibla.',
 
 # MIME search
 'mimesearch' => 'Recèrca per tipe MIME',
-'mimesearch-summary' => 'Aquesta pagina especiala permet de cercar de fichièrs en foncion de lor tipe MIME. Entrada : tipe/sostipe, per exemple <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Aquesta pagina especiala permet de cercar de fichièrs en foncion de lor tipe MIME. Entrada : tipe/sostipe, per exemple <code>image/jpeg</code>.',
 'mimetype' => 'Tipe MIME :',
 'download' => 'telecargament',
 
@@ -2015,7 +2014,7 @@ Vejatz tanben [[Special:WantedCategories|las categorias demandadas]].',
 'linksearch-pat' => 'Recercar l’expression :',
 'linksearch-ns' => 'Espacis de noms :',
 'linksearch-ok' => 'Recercar',
-'linksearch-text' => 'De caractèrs « joker » pòdon èsser utilizats, per exemple <code>*.wikipedia.org</code>.<br />Protocòls reconeguts : <tt>$1</tt>.',
+'linksearch-text' => 'De caractèrs « joker » pòdon èsser utilizats, per exemple <code>*.wikipedia.org</code>.<br />Protocòls reconeguts : <code>$1</code>.',
 'linksearch-line' => '$1 amb un ligam a partir de $2',
 'linksearch-error' => 'Los caractèrs « joker » pòdon pas èsser utilizats qu’al començament del nom de domeni.',
 
@@ -2798,11 +2797,9 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
 'spam_blanking' => 'Totas las versions que contenon de ligams cap a $1 son blanquidas',
 
 # Info page
-'pageinfo-subjectpage' => 'Pagina',
+'pageinfo-views' => 'Nombre de vistas',
 'pageinfo-edits' => "Nombre d'edicions",
 'pageinfo-authors' => "Nombre d'autors distints",
-'pageinfo-views' => 'Nombre de vistas',
-'pageinfo-viewsperedit' => 'Visitas per modificacions',
 
 # Skin names
 'skinname-standard' => 'Estandard',
index 036e10b..0e59ab4 100644 (file)
@@ -16,6 +16,7 @@
  * @author Psubhashish
  * @author Sambiwiki
  * @author Shijualex
+ * @author Shisir 1945
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
@@ -173,84 +174,84 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ଲେଉଟାଣି', '#REDIRECT' ),
-       'noeditsection'           => array( '0', '_ବଦଳା_ନହେବାଶ୍ରେଣୀ_', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'ଏବେକାର_ମାସ', 'ଏବେର_ମାସ୨', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ଏବେର_ମାସ', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'ଏବେକାର_ମାସ_ନାଆଁ', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'ଏବେକାର_ମାସ_ନାଆଁ_ସାଧାରଣ', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ଏବେକାର_ମାସ_ନାଆଁ_ସଂକ୍ଷିପ୍ତ', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ଏବେକାର_ଦିନ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ଏବେକାର_ଦିନ୨', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ଏବେକାର_ଦିନ_ନାଆଁ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ଏବେକାର_ବର୍ଷ', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ଏବେକାର_ସମୟ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ଏବେକାର_ଘଣ୍ଟା', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ଏବେର_ମାସ୧', 'ସ୍ଥାନୀୟ_ମାସ୨', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'ଏବେକାର_ମାସ୧', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'ମାସ୧ର_ନାଆଁ', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'ସ୍ଥାନୀୟ_ମାସ୧_ନାଆଁ_ସାଧାରଣ', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ସ୍ଥାନୀୟ_ମାସର୧_ନାଆଁ_ସଂକ୍ଷିପ୍ତ', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'Local_ଦିନ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ସ୍ଥାନୀୟ_ଦିନ୨', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'ଦିନ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ସ୍ଥାନୀୟ_ବର୍ଷ', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ସ୍ଥାନୀୟ_ସମୟ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ସ୍ଥାନୀୟ_ଘଣ୍ଟା', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ପୃଷ୍ଠା_ସଂଖ୍ୟା', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ଲେଖା_ସଂଖ୍ୟା', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ଫାଇଲ_ସଂଖ୍ୟା', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ବ୍ୟବାହାରକାରୀ_ସଂଖ୍ୟା', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'ସଚଳ_ବ୍ୟବାହାରକାରୀଙ୍କ_ସଂଖ୍ୟା', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'ବଦଳ_ସଂଖ୍ୟା', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'କେତେଥର_ଦେଖାଯାଇଛି', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'ପୃଷ୍ଠା_ନାଆଁ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ପୃଷ୍ଠା_ନାମକାରଣକାରୀ', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ନେମସ୍ପେସ', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ନେମସ୍ପେସକାରୀ', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ଟକସ୍ପେସ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ଟକସ୍ପେସକାରୀ', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ବିଷୟସ୍ପେସ', 'ଲେଖାସ୍ପେସ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'msg'                     => array( '0', 'ମେସେଜ:', 'MSG:' ),
-       'img_manualthumb'         => array( '1', 'ନଖଦେଖଣା=$1', 'ଦେଖଣା=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'ଡାହାଣ', 'right' ),
-       'img_left'                => array( '1', 'ବାଆଁ', 'left' ),
-       'img_none'                => array( '1', 'କିଛି_ନୁହେଁ', 'none' ),
-       'img_width'               => array( '1', '$1_ପିକସେଲ', '$1px' ),
-       'img_center'              => array( '1', 'କେନ୍ଦ୍ର', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'ଫ୍ରେମକରା', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'ଫ୍ରେମନଥିବା', 'frameless' ),
-       'img_border'              => array( '1', 'ବର୍ଡର', 'border' ),
-       'img_baseline'            => array( '1', 'ବେସଲାଇନ', 'baseline' ),
-       'img_top'                 => array( '1', 'ଉପର', 'top' ),
-       'img_text_top'            => array( '1', 'ଲେଖା-ଉପର', 'text-top' ),
-       'img_middle'              => array( '1', 'ମଝି', 'middle' ),
-       'img_bottom'              => array( '1', 'ତଳ', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'ଲେଖା-ତଳ', 'text-bottom' ),
-       'img_link'                => array( '1', 'ଲିଙ୍କ=$1', 'link=$1' ),
-       'articlepath'             => array( '0', 'ଲେଖାର_ପଥ', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'ସର୍ଭର', 'SERVER' ),
-       'grammar'                 => array( '0', 'ବ୍ୟାକରଣ', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ଲିଙ୍ଗ', 'GENDER:' ),
-       'plural'                  => array( '0', 'ବହୁବଚନ:', 'PLURAL:' ),
-       'raw'                     => array( '0', 'କଞ୍ଚା', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ଦେଖଣାନାଆଁ', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '_ନୂଆବିଭାଗଲିଙ୍କ_', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '_ନୂଆ_ବିଭାଗ_ନକରିବା_ଲିଙ୍କ_', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'ନଗଦ_ରିଭିଜନ', 'CURRENTVERSION' ),
-       'numberofadmins'          => array( '1', 'ପରିଛାମାନଙ୍କତାଲିକା', 'NUMBEROFADMINS' ),
-       'padleft'                 => array( '0', 'ବାଆଁପ୍ୟାଡ଼', 'PADLEFT' ),
-       'padright'                => array( '0', 'ଡାହାଣପ୍ୟାଡ଼', 'PADRIGHT' ),
-       'special'                 => array( '0', 'ବିଶେଷ', 'special' ),
-       'filepath'                => array( '0', 'ଫାଇଲରାହା:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'ଟାଗ', 'tag' ),
-       'hiddencat'               => array( '1', '_ଲୁଚିଥିବାବିଭାଗ_', '__HIDDENCAT__' ),
-       'pagesize'                => array( '1', 'ଫରଦଆକାର', 'PAGESIZE' ),
-       'protectionlevel'         => array( '1', 'ପ୍ରତିରକ୍ଷାସ୍ତର', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'ତାରିଖରପ୍ରକାର', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'ବାଟ', 'PATH' ),
-       'url_wiki'                => array( '0', 'ଉଇକି', 'WIKI' ),
-       'url_query'               => array( '0', 'ପ୍ରଶ୍ନ', 'QUERY' ),
+       'redirect'                  => array( '0', '#ଲେଉଟାଣି', '#REDIRECT' ),
+       'noeditsection'             => array( '0', '_ବଦଳା_ନହେବାଶ୍ରେଣୀ_', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'ଏବେକାର_ମାସ', 'ଏବେର_ମାସ୨', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ଏବେର_ମାସ', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'ଏବେକାର_ମାସ_ନାଆଁ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ଏବେକାର_ମାସ_ନାଆଁ_ସାଧାରଣ', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ଏବେକାର_ମାସ_ନାଆଁ_ସଂକ୍ଷିପ୍ତ', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ଏବେକାର_ଦିନ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ଏବେକାର_ଦିନ୨', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ଏବେକାର_ଦିନ_ନାଆଁ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ଏବେକାର_ବର୍ଷ', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ଏବେକାର_ସମୟ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ଏବେକାର_ଘଣ୍ଟା', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ଏବେର_ମାସ୧', 'ସ୍ଥାନୀୟ_ମାସ୨', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'ଏବେକାର_ମାସ୧', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'ମାସ୧ର_ନାଆଁ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'ସ୍ଥାନୀୟ_ମାସ୧_ନାଆଁ_ସାଧାରଣ', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ସ୍ଥାନୀୟ_ମାସର୧_ନାଆଁ_ସଂକ୍ଷିପ୍ତ', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'Local_ଦିନ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ସ୍ଥାନୀୟ_ଦିନ୨', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'ଦିନ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ସ୍ଥାନୀୟ_ବର୍ଷ', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ସ୍ଥାନୀୟ_ସମୟ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ସ୍ଥାନୀୟ_ଘଣ୍ଟା', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ପୃଷ୍ଠା_ସଂଖ୍ୟା', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ଲେଖା_ସଂଖ୍ୟା', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ଫାଇଲ_ସଂଖ୍ୟା', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ବ୍ୟବାହାରକାରୀ_ସଂଖ୍ୟା', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'ସଚଳ_ବ୍ୟବାହାରକାରୀଙ୍କ_ସଂଖ୍ୟା', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'ବଦଳ_ସଂଖ୍ୟା', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'କେତେଥର_ଦେଖାଯାଇଛି', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'ପୃଷ୍ଠା_ନାଆଁ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ପୃଷ୍ଠା_ନାମକାରଣକାରୀ', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ନେମସ୍ପେସ', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ନେମସ୍ପେସକାରୀ', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ଟକସ୍ପେସ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ଟକସ୍ପେସକାରୀ', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ବିଷୟସ୍ପେସ', 'ଲେଖାସ୍ପେସ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'msg'                       => array( '0', 'ମେସେଜ:', 'MSG:' ),
+       'img_manualthumb'           => array( '1', 'ନଖଦେଖଣା=$1', 'ଦେଖଣା=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'ଡାହାଣ', 'right' ),
+       'img_left'                  => array( '1', 'ବାଆଁ', 'left' ),
+       'img_none'                  => array( '1', 'କିଛି_ନୁହେଁ', 'none' ),
+       'img_width'                 => array( '1', '$1_ପିକସେଲ', '$1px' ),
+       'img_center'                => array( '1', 'କେନ୍ଦ୍ର', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'ଫ୍ରେମକରା', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'ଫ୍ରେମନଥିବା', 'frameless' ),
+       'img_border'                => array( '1', 'ବର୍ଡର', 'border' ),
+       'img_baseline'              => array( '1', 'ବେସଲାଇନ', 'baseline' ),
+       'img_top'                   => array( '1', 'ଉପର', 'top' ),
+       'img_text_top'              => array( '1', 'ଲେଖା-ଉପର', 'text-top' ),
+       'img_middle'                => array( '1', 'ମଝି', 'middle' ),
+       'img_bottom'                => array( '1', 'ତଳ', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'ଲେଖା-ତଳ', 'text-bottom' ),
+       'img_link'                  => array( '1', 'ଲିଙ୍କ=$1', 'link=$1' ),
+       'articlepath'               => array( '0', 'ଲେଖାର_ପଥ', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'ସର୍ଭର', 'SERVER' ),
+       'grammar'                   => array( '0', 'ବ୍ୟାକରଣ', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ଲିଙ୍ଗ', 'GENDER:' ),
+       'plural'                    => array( '0', 'ବହୁବଚନ:', 'PLURAL:' ),
+       'raw'                       => array( '0', 'କଞ୍ଚା', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ଦେଖଣାନାଆଁ', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '_ନୂଆବିଭାଗଲିଙ୍କ_', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '_ନୂଆ_ବିଭାଗ_ନକରିବା_ଲିଙ୍କ_', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'ନଗଦ_ରିଭିଜନ', 'CURRENTVERSION' ),
+       'numberofadmins'            => array( '1', 'ପରିଛାମାନଙ୍କତାଲିକା', 'NUMBEROFADMINS' ),
+       'padleft'                   => array( '0', 'ବାଆଁପ୍ୟାଡ଼', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ଡାହାଣପ୍ୟାଡ଼', 'PADRIGHT' ),
+       'special'                   => array( '0', 'ବିଶେଷ', 'special' ),
+       'filepath'                  => array( '0', 'ଫାଇଲରାହା:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'ଟାଗ', 'tag' ),
+       'hiddencat'                 => array( '1', '_ଲୁଚିଥିବାବିଭାଗ_', '__HIDDENCAT__' ),
+       'pagesize'                  => array( '1', 'ଫରଦଆକାର', 'PAGESIZE' ),
+       'protectionlevel'           => array( '1', 'ପ୍ରତିରକ୍ଷାସ୍ତର', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'ତାରିଖରପ୍ରକାର', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'ବାଟ', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ଉଇକି', 'WIKI' ),
+       'url_query'                 => array( '0', 'ପ୍ରଶ୍ନ', 'QUERY' ),
 );
 
 $digitGroupingPattern = "##,##,###";
@@ -263,7 +264,7 @@ $messages = array(
 'tog-hidepatrolled' => 'ନଗଦ ବଦଳରେ ଥିବା ଜଗାହୋଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ',
 'tog-newpageshidepatrolled' => 'ନୂଆ ପୃଷ୍ଠାତାଲିକାରୁ ଜଗାହୋଇଥିବା ବଦଳସବୁକୁ ଲୁଚାଇବେ',
 'tog-extendwatchlist' => 'କେବଳ ନଗଦ ନୁହେଁ, ସବୁଯାକ ବଦଳକୁ ଦେଖାଇବା ନିମନ୍ତେ ଦେଖଣାତାଲିକାକୁ ବଢ଼ାଇବେ',
-'tog-usenewrc' => 'à¬\89ନà­\8dନତ à¬¨à¬\97ଦ à¬¬à¬¦à¬³ à¬¬à­\8dà­\9fବହାର à¬\95ରନà­\8dତà­\81 (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
+'tog-usenewrc' => 'ନà¬\97ଦ à¬¬à¬¦à¬³à¬°à­\87 à¬ªà­\83ଷà­\8dଠା à¬\85ନà­\81ଯାà­\9fà­\80 à¬\97à­\8bଷà­\8dଠà­\80 à¬¬à¬¦à¬³ à¬\8fବà¬\82 à¬¦à­\87à¬\96ଣା (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-numberheadings' => 'ଆପେଆପେ-ସଂଖ୍ୟାର ନାମଗୁଡ଼ିକ',
 'tog-showtoolbar' => 'ସମ୍ପାଦନା ଟୁଲବାର ଦେଖାଇବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ସଚଳ କରିବେ)',
 'tog-editondblclick' => 'ଦୁଇଥର କ୍ଲିକରେ ପୃଷ୍ଠା ବଦଳାଇବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
@@ -271,17 +272,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'ବିଭାଗ ନାମରେ ଡାହାଣ କ୍ଲିକ କରି ବିଭାଗ ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-showtoc' => 'ସୂଚୀପତ୍ର ଦେଖାଇବେ (୩ରୁ ଅଧିକ ମୁଖ୍ୟ ନାମ ଥିଲେ)',
 'tog-rememberpassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
-'tog-watchcreations' => 'ମà­\8b à¬¤à¬¿à¬\86ରି à¬ªà­\83ଷà­\8dଠାସବà­\81à¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ା à¬­à¬¿à¬¤à¬°à­\87 à¬°à¬\96ିବà­\87',
-'tog-watchdefault' => 'ମà­\8b à¬¦à­\87à¬\87 à¬¸à¬®à­\8dପାଦିତ à¬ªà­\83ଷà­\8dଠାସବà­\81à¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ା à¬­à¬¿à¬¤à¬°à­\87 à¬°à¬\96ିବà­\87',
-'tog-watchmoves' => 'ମà­\8b à¬¦à­\87à¬\87 à¬\98à­\81à¬\9eà­\8dà¬\9aାଯାà¬\87ଥିବା à¬ªà­\83ଷà­\8dଠାସବà­\81à¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ା à¬­à¬¿à¬¤à¬°à­\87 à¬°à¬\96ିବà­\87',
-'tog-watchdeletion' => 'ମà­\8b à¬¦à­\87à¬\87 à¬²à¬¿à¬­à¬¾à¬¯à¬¾à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠାସବà­\81à¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ା à¬­à¬¿à¬¤à¬°à­\87 à¬°à¬\96ିବà­\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ଡନà­\8dତà­\81',
+'tog-watchdefault' => 'ମà­\81à¬\81 à¬¬à¬¦à¬³à­\87à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନà­\8dତà­\81',
+'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ଡନà­\8dତà­\81',
+'tog-watchdeletion' => 'ମà­\81à¬\81 à¬²à¬¿à¬­à¬¾à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନà­\8dତà­\81',
 'tog-minordefault' => 'ସବୁଯାକ ସମ୍ପାଦନାକୁ ଛାଏଁ ଟିକେ ବଦଳ ଭାବରେ ସୂଚିତ କରିବେ',
 'tog-previewontop' => 'ଏଡ଼ିଟ ବାକ୍ସ ଆଗରୁ ଦେଖଣା ଦେଖାଇବେ',
 'tog-previewonfirst' => 'ପ୍ରଥମ ବଦଳର ଦେଖଣା ଦେଖାଇବେ',
 'tog-nocache' => 'ବ୍ରାଉଜର ପୃଷ୍ଠା ସଂରକ୍ଷଣକୁ ଅଚଳ କରିବେ',
-'tog-enotifwatchlistpages' => 'ମୋ ଦେଖଣାତାଲିକାରେ ଥିବା ପୃଷ୍ଠାରେ କିଛି ବଦଳ ହେଲେ ମୋତେ ଇ-ମେଲ କରିବେ',
+'tog-enotifwatchlistpages' => 'ମୋ ଦେଖଣାତାଲିକାରେ ଥିବା ପୃଷ୍ଠା ବା ଫାଇଲରେ କିଛି ବଦଳ ହେଲେ ମୋତେ ଇ-ମେଲ କରିବେ',
 'tog-enotifusertalkpages' => 'ମୋର ଆଲୋଚନା ପୃଷ୍ଠାରେ କିଛି ବଦଳ ହେଲେ ମୋତେ ଇ-ମେଲ କରିବେ',
-'tog-enotifminoredits' => 'ପୃଷ୍ଠାରେ ଛୋଟ ଛୋଟ ବଦଳ ହେଲେ ବି ମୋତେ ଇ-ମେଲ କରିବେ',
+'tog-enotifminoredits' => 'ପà­\83ଷà­\8dଠାରà­\87 à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡିà¬\95ରà­\87 à¬\9bà­\8bà¬\9f à¬\9bà­\8bà¬\9f à¬¬à¬¦à¬³ à¬¹à­\87ଲà­\87 à¬¬à¬¿ à¬®à­\8bତà­\87 à¬\87-ମà­\87ଲ à¬\95ରିବà­\87',
 'tog-enotifrevealaddr' => 'ସୂଚନା ଇ-ମେଲ ରେ ମୋର ଇ-ମେଲ ଠିକଣା ଦେଖାଇବେ',
 'tog-shownumberswatching' => 'ଦେଖୁଥିବା ବ୍ୟବହାରକାରୀଙ୍କ ସଂଖ୍ୟା ଦେଖାଇବେ',
 'tog-oldsig' => 'ଏବେ ଥିବା ନାମ:',
@@ -402,7 +403,7 @@ $messages = array(
 'qbpageoptions' => 'ଏହି ପୃଷ୍ଠାଟି',
 'qbpageinfo' => 'ଭିତର ଚିଜ',
 'qbmyoptions' => 'ମୋ ପୃଷ୍ଠାଗୁଡ଼ିକ',
-'qbspecialpages' => 'ନିà¬\86ରା ପୃଷ୍ଠା',
+'qbspecialpages' => 'ବିଶà­\87ଷ ପୃଷ୍ଠା',
 'faq' => 'ବାରମ୍ବାର ପଚରାଯାଉଥିବା ପ୍ରଶ୍ନ',
 'faqpage' => 'Project:ବାରମ୍ବାର ପଚରାଯାଉଥିବା ପ୍ରଶ୍ନ',
 
@@ -454,7 +455,7 @@ $messages = array(
 'newpage' => 'ନୂଆ ପୃଷ୍ଠା',
 'talkpage' => 'ପୃଷ୍ଠାକୁ ଆଲୋଚନା କରନ୍ତୁ',
 'talkpagelinktext' => 'କଥାଭାଷା',
-'specialpage' => 'ନିà¬\86ରା ପୃଷ୍ଠା',
+'specialpage' => 'ବିଶà­\87ଷ ପୃଷ୍ଠା',
 'personaltools' => 'ନିଜର ଟୁଲ',
 'postcomment' => 'ନୂଆ ଭାଗ',
 'articlepage' => 'ସୂଚୀ ପୃଷ୍ଠାଟି ଦେଖାଇବେ',
@@ -501,8 +502,8 @@ $1',
 'mainpage' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
 'mainpage-description' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
 'policy-url' => 'Project:ନୀତି',
-'portal' => 'ସà¬\99à­\8dà¬\98 à¬\86ଲà­\8bà¬\9aନା à¬¸à¬­à¬¾',
-'portal-url' => 'Project:ସà¬\99à­\8dà¬\98 à¬\86ଲà­\8bà¬\9aନା à¬¸à¬­à¬¾',
+'portal' => 'ସà¬\99à­\8dà¬\98 à¬¸à­\82à¬\9aନା à¬«à¬³à¬\95',
+'portal-url' => 'Project:ସà¬\99à­\8dà¬\98 à¬¸à­\82à¬\9aନା à¬«à¬³à¬\95',
 'privacy' => 'ଗୁମର ନୀତି',
 'privacypage' => 'Project:ଗୁମର ନୀତି',
 
@@ -519,11 +520,13 @@ $1',
 'youhavenewmessages' => 'ଆପଣଙ୍କର $1 ($2).',
 'newmessageslink' => 'ନୂଆ ମେସେଜ',
 'newmessagesdifflink' => 'ଶେଷ ବଦଳ',
+'youhavenewmessagesmanyusers' => 'ଆପଣଙ୍କର ବହୁତ ବ୍ୟବହାରକାରୀ($2)ମାନଙ୍କଠାରୁ $1 ଅଛି ।',
+'newmessagesdifflinkplural' => 'ଶେଷ{{PLURAL:$1|change|changes}}',
 'youhavenewmessagesmulti' => '$1 ତାରିଖରେ ନୂଆ ଚିଠିଟିଏ ଆସିଛି',
-'editsection' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
-'editold' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
+'editsection' => 'ସମ୍ପାଦନା',
+'editold' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
 'viewsourceold' => 'ମୂଳାଧାର ଦେଖିବେ',
-'editlink' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
+'editlink' => 'ସମ୍ପାଦନା',
 'viewsourcelink' => 'ମୂଳାଧାର ଦେଖିବେ',
 'editsectionhint' => '$1 ଭାଗଟିକୁ ବଦଳାଇବେ',
 'toc' => 'ଭିତର ଚିଜ',
@@ -549,7 +552,7 @@ $1',
 'nstab-main' => 'ପୃଷ୍ଠା',
 'nstab-user' => 'ବ୍ୟବହାରକାରୀଙ୍କର ପୃଷ୍ଠା',
 'nstab-media' => 'ମେଡିଆ ପରଦ',
-'nstab-special' => 'ନିà¬\86ରା ପୃଷ୍ଠା',
+'nstab-special' => 'ବିଶà­\87ଷ ପୃଷ୍ଠା',
 'nstab-project' => 'ପ୍ରକଳ୍ପ ପୃଷ୍ଠା',
 'nstab-image' => 'ଫାଇଲ',
 'nstab-mediawiki' => 'ସନ୍ଦେଶ',
@@ -591,8 +594,8 @@ $1',
 
 ଯଦି ଆପଣ ଖୋଜିଥିବା ପୃଷ୍ଠାଟି କେହି ଉଡ଼ାଇ ଦେଇଥାଏ ତେବେ ଏମିତି ହୋଇପାରେ ।
 
-ଯଦି à¬¸à­\87ମିତି à¬¹à­\8bà¬\87ନଥାà¬\8f à¬¤à­\87ବà­\87 à¬\86ପଣ à¬\8fହି à¬¸à¬«à¬\9fବେରରେ କିଛି ଅସୁବିଧା ଖୋଜି ପାଇଛନ୍ତି ।
-କେହି ଜଣେ ଟିକେ [[Special:ListUsers/sysop|ପରିଛା]] ଙ୍କୁ ଏହି ଇଉଆରେଲ (url) ସହ ଚିଠିଟିଏ ପଠାଇ ଦିଅନ୍ତୁ ।',
+ଯଦି à¬¸à­\87ମିତି à¬¹à­\8bà¬\87ନଥାà¬\8f à¬¤à­\87ବà­\87 à¬\86ପଣ à¬\8fହି à¬¸à¬«à­\8dà¬\9fà­±େରରେ କିଛି ଅସୁବିଧା ଖୋଜି ପାଇଛନ୍ତି ।
+କେହି ଜଣେ [[Special:ListUsers/sysop|ପରିଚାଳକ]] ଙ୍କୁ ଏହି ଇଉଆରଏଲ (url) ସହ ଚିଠିଟିଏ ପଠାଇ ଦିଅନ୍ତୁ ।',
 'missingarticle-rev' => '(ସଙ୍କଳନ#: $1)',
 'missingarticle-diff' => '(ତଫାତ: $1, $2)',
 'readonly_lag' => 'ଏହି ଡାଟାବେସଟିରେ ଆପେ ଆପେ ତାଲା ପଡ଼ିଯାଇଅଛି, ଇତିମଧ୍ୟରେ ସାନ ଡାଟାବେସଟି ମୁଖ୍ୟ ଡାଟାବେସ ସହିତ ଯୋଗାଯୋଗ କରୁଅଛି',
@@ -611,11 +614,13 @@ $1',
 'badarticleerror' => 'ଏହି ପୃଷ୍ଠାରେ ଏହି କାମଟି ହୋଇପାରିବ ନାହିଁ ।',
 'cannotdelete' => '"$1" ପୃଷ୍ଠା ବା ଫାଇଲଟି ଲିଭାଯାଇପାରିବ ନାହିଁ । ଏହା ଆଗରୁ କାହା ଦେଇ ବୋଧେ ଲିଭାଇ ଦିଆଯାଇଛି ।',
 'cannotdelete-title' => '"$1" ପୃଷ୍ଠାଟି ଲିଭଯାଇପାରିବ ନାହିଁ',
+'delete-hook-aborted' => 'ସମ୍ପାଦନା ଏକ ହୁକ (hook) ଦେଇ ବାରଣ କରାଗଲା ।
+ଏହା କିଛି ବି କାରଣ ଦେଇନାହିଁ ।',
 'badtitle' => 'ଖରାପ ନାଆଁ',
 'badtitletext' => 'ଆପଣ ଅନୁରୋଧ କରିଥିବା ପୃଷ୍ଠାଟି ଭୁଲ, ଖାଲି ଅଛି ବା ବାକି ଭାଷା ସାଙ୍ଗରେ ଭୁଲରେ ଯୋଡ଼ା ଯାଇଛି ବା ଭୁଲ ଇଣ୍ଟର ଉଇକି ନାମ ଦିଆଯାଇଛି ।
 ଏଥିରେ ଥିବା ଗୋଟିଏ ବା ଦୁଇଟି ଅକ୍ଷର ଶିରୋନାମା ଭାବରେ ବ୍ୟବହାର କରାଯାଇ ପାରିବ ନାହିଁ ।',
-'perfcached' => 'ତଳଲିà¬\96ିତ à¬¤à¬¥à­\8dà­\9fà¬\9fି à¬\86à¬\97ରà­\81 à¬°à¬¹à¬¿à¬¥à¬¿à¬¬à¬¾ à¬¤à¬¥à­\8dà­\9f, à¬¤à­\87ଣà­\81 à¬¨à¬\97ଦ à¬¹à­\8bà¬\87ନପାରà­\87 à¥¤ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'ତଳଲିଖିତ ତଥ୍ୟ ଆଗରୁ ଥିବା ତଥ୍ୟ ଓ  $1ରେ ଶେଷଥର ଅପଡେଟ ହୋଇଥିଲା । A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'ତଳଲିà¬\96ିତ à¬¤à¬¥à­\8dà­\9fà¬\97à­\81ଡିà¬\95à­\81 à¬\85ସà­\8dଥାà­\9fà­\80 à¬­à¬¾à¬¬à­\87 à¬°à¬\96ାà¬\97ଲା à¬\8fବà¬\82 à¬\8fହା à¬\85ପଡà­\87à¬\9f à¬¨ à¬¹à­\8bà¬\87ପାରà­\87 à¥¤ à¬\85ତିବà­\87ଶିରà­\87 {{PLURAL:$1|ଫଳ|$1ଫଳà¬\97à­\81ଡିà¬\95 }} à¬\85ସà­\8dଥାà­\9fà­\80 à¬°à­\82ପà­\87 à¬°à¬¹à¬¿ à¬ªà¬¾à¬°à¬¿à¬¬ à¥¤',
+'perfcachedts' => 'ତଳଲିଖିତ ତଥ୍ୟଗୁଡିକୁ ଅସ୍ଥାୟୀ ଭାବେ ରଖାଗଲା ଏବଂ  $1ରେ ଶେଷଥର ଅପଡେଟ ହୋଇଥିଲା । ଅତିବେଶିରେ {{PLURAL:$1|ଫଳ|$1ଫଳଗୁଡିକ }} ଅସ୍ଥାୟୀ ରୂପେ ରହି ପାରିବ ।',
 'querypage-no-updates' => 'ଏହି ପୃଷ୍ଠାଟି ପାଇଁ ଅପଡେଟସବୁ ଏବେ ଅଚଳ କରାଯାଇଅଛି ।
 ଏଠାରେ ଥିବା ତଥ୍ୟ ସବୁ ଏବେ ସତେଜ ହୋଇପାରିବ ନାହିଁ ।',
 'wrong_wfQuery_params' => 'wfQuery() ପାଇଁ ଭୁଲ ପାରାମିଟର<br />
@@ -642,6 +647,8 @@ $2',
 'ns-specialprotected' => 'ବିଶେଷ ପୃଷ୍ଠାସବୁକୁ ବଦଳାଯାଇପାରିବ ନାହିଁ ।',
 'titleprotected' => 'ଏହି ନାମଟି [[User:$1|$1]]ଙ୍କ ଦେଇ ନୂଆ ତିଆରିହେବାରୁ କିଳାଯାଇଅଛି ।
 ଏହାର କାରଣ ହେଲା "\'\'$2\'\'" ।',
+'exception-nologin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
+'exception-nologin-text' => 'ଏହା କରିବାକୁ ହେଲେ ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଲଗଇନ କରିବାକୁ ପଡିବ ।',
 
 # Virus scanner
 'virus-badscanner' => "ମନ୍ଦ ସଂରଚନା: ଅଜଣା ଭାଇରସ ସ୍କାନର: ''$1''",
@@ -661,6 +668,7 @@ $2',
 'remembermypassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
 'securelogin-stick-https' => 'ଲଗ ଇନ କଲାପରେ HTTPS ସହ ଯୋଡ଼ି ହୋଇ ରହନ୍ତୁ',
 'yourdomainname' => 'ଆପଣଙ୍କ ଡୋମେନ:',
+'password-change-forbidden' => 'ଆପଣ ଏହି ଉଇକିରେ ପାସୱାର୍ଡ ବଦଳାଇ ପାରିବେ ନାହିଁ ।',
 'externaldberror' => 'ବୋଧ ହୁଏ ଚିହ୍ନଟ ଡାଟାବେସ ଭୁଲଟିଏ ହୋଇଥିଲା ବା ଆପଣଙ୍କୁ ନିଜର ବାହାର ଖାତା ଅପଡେଟ କରିବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।',
 'login' => 'ଲଗଇନ',
 'nav-login-createaccount' => 'ଲଗ ଇନ /ନୂଆ ଖାତା ଖୋଲନ୍ତୁ',
@@ -671,8 +679,8 @@ $2',
 'userlogout' => 'ଲଗ ଆଉଟ',
 'notloggedin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
 'nologin' => 'ଖାତାଟିଏ ନାହିଁ? $1।',
-'nologinlink' => 'ନà­\81ଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
-'createaccount' => 'ନà­\81à¬\86 à¬\96ାତା à¬\96à­\8bଲିବା',
+'nologinlink' => 'ନà­\82ଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
+'createaccount' => 'ନà­\82à¬\86 à¬\96ାତାà¬\9fିà¬\8f à¬\96à­\8bଲନà­\8dତà­\81',
 'gotaccount' => 'ଆଗରୁ ଖାତାଟିଏ ଅଛି କି? $1.',
 'gotaccountlink' => 'ଲଗ ଇନ',
 'userlogin-resetlink' => 'ଲଗଇନ ତଥ୍ୟ ସବୁ ଭୁଲିଗେଲେକି?',
@@ -703,7 +711,7 @@ $2',
 'login-userblocked' => 'ଏହି ସଭ୍ୟଙ୍କୁ ଅଟକାଯାଇଛି । ଲଗ ଇନ କରିବାକୁ ଅନୁମତି ନାହିଁ ।',
 'wrongpassword' => 'ଦିଆଯାଇଥିବା ପାସବାର୍ଡ଼ଟି ଭୁଲ ଅଟେ  ।
 ଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।',
-'wrongpasswordempty' => 'ଦିଆଯାଇଥିବା ପାସବାର୍ଡ଼ଟି ଖାଲି ଛଡ଼ାଯାଇଛି ।</br>
+'wrongpasswordempty' => 'ଦିଆଯାଇଥିବା ପାସବାର୍ଡ଼ଟି ଖାଲି ଛଡ଼ାଯାଇଛି ।
 ଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।',
 'passwordtooshort' => 'ପାସବାର୍ଡ଼ଟି ଅତି କମରେ {{PLURAL:$1|ଗୋଟିଏ ଅକ୍ଷର|$1ଟି ଅକ୍ଷର}}ର ହୋଇଥିବା ଲୋଡ଼ା ।',
 'password-name-match' => 'ଆପଣଙ୍କ ପାସବାର୍ଡ଼ଟି ଆପଣଙ୍କ ଇଉଜର ନାମ ଠାରୁ ଅଲଗା ହେବା ଉଚିତ ।',
@@ -739,6 +747,7 @@ continue using your old password.',
 'invalidemailaddress' => 'ଏହି ଇ-ମେଲ ଠିକଣାଟି ସଠିକ ସଜାଣିରେ ନଥିବାରୁ ଏହାକୁ ଗ୍ରହଣ କରାଯାଇପାରିବ ନାହିଁ ।
 ଦୟାକରି ଏକ ସଚଳ ଓ ଠିକ ସଜାଣିରେ ଥିବା ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ ।',
 'cannotchangeemail' => 'ଖାତାରେ ଥିବା ଇମେଲ ଏହି ଉଇକିରେ ବଦଳାଯାଇପାରିବ ନାହିଁ ।',
+'emaildisabled' => 'ଏହି ସାଇଟ ଇ-ମେଲ ପଠାଇ ପାରିବ ନାହିଁ ।',
 'accountcreated' => 'ଖାତାଟି ଖୋଲାହୋଇଗଲା',
 'accountcreatedtext' => '$1 ପାଇଁ ନୂଆ ଖାତାଟିଏ ତିଆରି ହୋଇଗଲା ।',
 'createaccount-title' => '{{SITENAME}} ପାଇଁ ଖାତା ଖୋଲା',
@@ -946,6 +955,7 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 'note' => "'''ଟୀକା:'''",
 'previewnote' => "'''ଜାଣିରଖନ୍ତୁ ଯେ, ଏହା କେବଳ ଏକ ଦେଖଣା ।'''
 ଆପଣ କରିଥିବା ବଦଳସବୁ ଏଯାଏଁ ସାଇତା ଯାଇନାହିଁ!",
+'continue-editing' => 'ବଦଳାଇବା ଜାରି ରଖନ୍ତୁ',
 'previewconflict' => 'ଉପରେ ଦିଶୁଥିବା ଏହି ଦେଖଣାକୁ ସାଇତିଲେ ଏହା ଏକାପରି ଦେଖାଯିବ ।',
 'session_fail_preview' => "'''କ୍ଷମା କରିବେ! ଅବଧି ତଥ୍ୟ ନଷ୍ଟ ହୋଇଯାଇଥିବାରୁ ଆମେ ଆପଣଙ୍କ ବଦଳସବୁକୁ ଗ୍ରହଣ କରିପାରିଲୁ ନାହିଁ ।'''
 ଦୟାକରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।
@@ -961,13 +971,14 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 ଆପଣ ଏକ ୱେବ-ରେ ଥିବା ଅଜଣା ପ୍ରକ୍ସି ସାଇଟ କରି  ବ୍ୟବହାର କରୁଥିଲେ ଏପରି ହୋଇଥାଏ ।",
 'edit_form_incomplete' => "'''ସମ୍ପାଦନାର କେତେକ ଭାଗ ସର୍ଭର ଠେଇଁ ପହଞ୍ଚିଲା ନାହିଁ; ଭଲକରି ପରଖିନିଅନ୍ତୁ ଯେ ନିଜ ସମ୍ପାଦନା ସବୁ ଅକ୍ଷତ କି ନାହିଁ ଓ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।'''",
 'editing' => '$1 କୁ ବଦଳାଉଛି',
+'creating' => '$1କୁ ତିଆରି କରୁଛି',
 'editingsection' => '$1 (ଭାଗ)କୁ ବଦଳାଇବେ',
 'editingcomment' => '$1 (ନୂଆ ଭାଗ)କୁ ବଦଳାଉଛୁ',
 'editconflict' => 'ବଦଳାଇବା ଦ୍ଵନ୍ଦ: $1',
-'explainconflict' => "ଆପଣ ବଦଳାଇବା ଆରମ୍ଭ କରିବା ଭିତରେ କେହିଜଣେ ଏହି ପୃଷ୍ଠାକୁ ବଦଳାଇଛନ୍ତି ।</br>
-ଉପର ଲେଖା ଜାଗାଟି ଏହା ଯେମିତି ଅଛି ସେମିତି ଥିବା ଲେଖାଟି ଦେଖାଉଛି ।</br>
-ତଳ ଜାଗାଟିରେ ଆପଣ କରିଥିବା ବଦଳ ଦେଖାଉଛି ।</br>
-ଏବେ ଥିବା ଲେଖାରେ ଆପଣଙ୍କୁ ନିଜ ବଦଳକୁ ମିଶାଇବାକୁ ହେବ ।</br>
+'explainconflict' => "ଆପଣ ବଦଳାଇବା ଆରମ୍ଭ କରିବା ଭିତରେ କେହିଜଣେ ଏହି ପୃଷ୍ଠାକୁ ବଦଳାଇଛନ୍ତି ।
+ଉପର ଲେଖା ଜାଗାଟି ଏହା ଯେମିତି ଅଛି ସେମିତି ଥିବା ଲେଖାଟି ଦେଖାଉଛି ।
+ତଳ ଜାଗାଟିରେ ଆପଣ କରିଥିବା ବଦଳ ଦେଖାଉଛି ।
+ଏବେ ଥିବା ଲେଖାରେ ଆପଣଙ୍କୁ ନିଜ ବଦଳକୁ ମିଶାଇବାକୁ ହେବ ।
 ଯଦି ଆପଣ \"{{int:savearticle}}\" ଦବାନ୍ତି ତେବେ '''କେବଳ''' ଉପର ଲେଖାଟି ସାଇତା ହୋଇଯିବ ।",
 'yourtext' => 'ଆପଣଙ୍କ ଲେଖା',
 'storedversion' => 'ସାଇତା ସଙ୍କଳନ',
@@ -984,7 +995,7 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 ଯଦି ଆପଣ ନିଜର ଲେଖା ନିର୍ଦୟ ଭାବେ ସମ୍ପାଦିତ ହେଉ ବୋଲି ଚାହୁଁନାହାନ୍ତି ବା ବଣ୍ଟନ କରାଯାଉ ବୋଲି ଚାହୁଁ ନାହାନ୍ତି ତେବେ ତାହା ଏଠାରେ ଦିଅନ୍ତୁ ନାହିଁ ।<br />
 ଆପଣ ଆମପକ୍ଷେ ମଧ୍ୟ ପ୍ରତିଜ୍ଞା କରୁଛନ୍ତି ଯେ ଏହା ଆପଣ ନିଜେ ଲେଖିଛନ୍ତି, କିମ୍ବା ଏକ ପବ୍ଲିକ ଡୋମେନରୁ ବା ମାଗଣା ଓ ଖୋଲା ଲାଇସେନ୍ସ ଥିବା ସାଇଟରୁ ନକଲ କରି ଆଣିଛନ୍ତି । (ଦୟାକରି ସବିଶେଷ ପାଇଁ $1 ଦେଖନ୍ତୁ) ।
 '''ଅନୁମତି ବିନା ସତ୍ଵାଧିକାର ଥିବା କାମ ଏଠାରେ ଦିଅନ୍ତୁ ନାହିଁ !'''",
-'longpageerror' => "'''ଭୁଲ: ଆପଣ ଦେଇଥିବା ଲେଖାଟି $1 କିଲୋବାଇଟ ଲମ୍ବା, ଯାହାକି ସବୁଠାରୁ ଅଧିକ $2 ଠାରୁ ବି ଅଧିକ ।'''
+'longpageerror' => "'''ଭୁଲ: ଆପଣ ଦେଇଥିବା ଲେଖାଟି {{PLURAL:$1|କିଲୋବାଇଟ|$1 କିଲୋବାଇଟ}} ଲମ୍ବା, ଯାହାକି ସବୁଠାରୁ ଅଧିକ {{PLURAL:$2|କିଲୋବାଇଟ|$2 କିଲୋବାଇଟ}} ଠାରୁ ବି ଅଧିକ ।'''
 ଏହା ସାଇତାଯାଇପାରିବ ନାହିଁ ।",
 'readonlywarning' => "'''ସୂଚନା: ଏହି ଡାଟାବେସଟି ରକ୍ଷଣାବେକ୍ଷଣା ପାଇଁ କିଳାଯାଇଛି । ତେଣୁ ଆପଣ ଆପଣା ସମ୍ପାଦନା ଏବେ ସାଇତି ପାରିବେ ନାହିଁ ।'''
 ଆପଣ ଲେଖାସବୁ ଏକ ଟେକ୍ସଟ ଫାଇଲରେ ନକଲ କରି ପେଷ୍ଟ କରି ଆଗକୁ ବ୍ୟବହାର କରିବା ପାଇଁ ସାଇତି ପାରିବେ ।
@@ -1027,6 +1038,7 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 'edit-no-change' => 'ଆପଣଙ୍କ ସମ୍ପାଦନାକୁ ଅଣଦେଖା କରାଗଲା, କାରଣ ଲେଖାରେ କିଛି ବି ବଦଳ କରାଯାଇନଥିଲା ।',
 'edit-already-exists' => 'ନୂଆ ପୃଷ୍ଠାଟିଏ ତିଆରି କରିପାରିଲୁଁ ନାହିଁ ।
 ଏହା ଅଗରୁ ଅଛି ।',
+'defaultmessagetext' => 'ଡିଫଲ୍ଟ ମେସେଜ ଲେଖାଗୁଡିକ',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ଚେତାବନୀ:''' ଏହି ପୃଷ୍ଠାରେ ଅନେକ ଗୁଡ଼ିଏ ମୂଲ୍ୟବାନ ପାର୍ସର ଫଙ୍କସନ କଲ ଅଛି ।
@@ -1133,7 +1145,7 @@ $3ଙ୍କ ଦେଇ ଦିଆଯାଇଥିବା କାରଣ ହେଲା '
 'revdelete-selected' => "'''[[:$1]]ର {{PLURAL:$2|ବଛା ସଙ୍କଳନ|ବଛା ସଙ୍କଳନ}}:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|ବଛା ଲଗ ଘଟଣା|ବଛା ଲଗ ଘଟଣାବଳୀ}}:'''",
 'revdelete-text' => "'''ଲିଭାଯାଇଥିବା ସଂସ୍କରଣ ଓ ଘଟଣାସମୂହ ଏବେ ବି ପୃଷ୍ଠାର ଇତିହାସରେ ରହିବ, କିନ୍ତୁ ଜନସାଧାରଣଙ୍କୁ ସେସବୁର କିଛି ଭାଗ ଲୁଚାଇ ରଖାଯିବ ।'''
-à¬\8fହି {{SITENAME}}ର à¬¬à¬¾à¬\95ି à¬ªà¬°à¬¿à¬\9bାଗଣ ଲୁଚିରହିଥିବା ବିଷୟବସ୍ତୁ ଦେଖିପାରିବେ ଓ ଅଧିକ ବାରଣ ଥିଲେ ହେଁ ସେହି ଏକା ଇଣ୍ଟରଫେସ ବ୍ୟବହାର କରି ତାହାକୁ ଆଉଥରେ ଲିଭାଯିବାରୁ ଅଟକାଇପାରିବେ ।",
+à¬\8fହି {{SITENAME}}ର à¬¬à¬¾à¬\95ି à¬ªà¬°à¬¿à¬\9aାଳà¬\95ଗଣ ଲୁଚିରହିଥିବା ବିଷୟବସ୍ତୁ ଦେଖିପାରିବେ ଓ ଅଧିକ ବାରଣ ଥିଲେ ହେଁ ସେହି ଏକା ଇଣ୍ଟରଫେସ ବ୍ୟବହାର କରି ତାହାକୁ ଆଉଥରେ ଲିଭାଯିବାରୁ ଅଟକାଇପାରିବେ ।",
 'revdelete-confirm' => 'ଦୟାକରି ଥୟ କରନ୍ତୁ ଯେ ଆପଣ ଏହା କରିବାକୁ ଚାହୁଁଛନ୍ତି, ଆପଣ ଏହାର ପରିଣାମ ଜାଣନ୍ତି ଓ ଆପଣ [[{{MediaWiki:Policy-url}}|ନୀତି]] ଅନୁସାରେ ଏହା କରୁଛନ୍ତି ।',
 'revdelete-suppress-text' => "ଦବାଇ ରଖିବା '''କେବଳ''' ଏହି ତଳଲିଖିତ କ୍ଷେତ୍ରରେ ବ୍ୟବହାର କରାଯିବ:
 * ସମ୍ଭାବିତ ଅପମାନଜଣକ ତଥ୍ୟ
@@ -1145,11 +1157,11 @@ $3ଙ୍କ ଦେଇ ଦିଆଯାଇଥିବା କାରଣ ହେଲା '
 'revdelete-hide-name' => 'କାମ ଓ ଲକ୍ଷ ସବୁ ଲୁଚାଇଦିଅନ୍ତୁ',
 'revdelete-hide-comment' => 'ବଦଳ ସାରକଥା ଲୁଚାଇଦିଅନ୍ତୁ',
 'revdelete-hide-user' => 'ସମ୍ପାଦକଙ୍କର ଇଉଜର ନାମ /IP ଲୁଚାଇଦିଅନ୍ତୁ',
-'revdelete-hide-restricted' => 'ପରିà¬\9bା ଓ ବାକିମାନଙ୍କ ଠାରୁ ତଥ୍ୟକୁ ଦବାଇଦିଅନ୍ତୁ',
+'revdelete-hide-restricted' => 'ପରିà¬\9aାଳà¬\95 ଓ ବାକିମାନଙ୍କ ଠାରୁ ତଥ୍ୟକୁ ଦବାଇଦିଅନ୍ତୁ',
 'revdelete-radio-same' => '(ବଦଳାନ୍ତୁ ନାହିଁ)',
 'revdelete-radio-set' => 'ହଁ',
 'revdelete-radio-unset' => 'ନାହିଁ',
-'revdelete-suppress' => 'ପରିà¬\9bା ଓ ବାକିମାନଙ୍କ ଠାରୁ ତଥ୍ୟକୁ ଦବାଇଦିଅନ୍ତୁ',
+'revdelete-suppress' => 'ପରିà¬\9aାଳà¬\95 ଓ ବାକିମାନଙ୍କ ଠାରୁ ତଥ୍ୟକୁ ଦବାଇଦିଅନ୍ତୁ',
 'revdelete-unsuppress' => 'ଆଉଥରେ ସ୍ଥାପିତ ସଙ୍କଳନସବୁରେ ଥିବା ବାରଣକୁ ବାହାର କରିଦିଅନ୍ତୁ',
 'revdelete-log' => 'କାରଣ:',
 'revdelete-submit' => 'ବଛା {{PLURAL:$1|ସଙ୍କଳନ|ସଙ୍କଳନସବୁ}} ପାଇଁ ଲାଗୁ କରନ୍ତୁ',
@@ -1188,8 +1200,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'ଦବାଇବା ଲଗ',
-'suppressionlogtext' => 'ଲିଭାଯାଇଥିବା ଓ ଅଟକାଯାଇଥିବା ବସ୍ତୁର ଏକ ତାଲିକା ତଳେ ଦିଆଯାଇଛି ଯେଉଁଥିରେ ପରିଛାମାନଙ୍କଠାରୁ ଲୁଚାଯାଇଥିବା ବସ୍ତୁ ମଧ୍ୟ ଅଛି ।
-ଏବେ କରାଯାଇଥିବା ବାସନ୍ଦ ଓ ବାରଣ ପାଇଁ [[Special:BlockList|IP ଅଟକ ତାଲିକା]] ଦେଖନ୍ତୁ ।',
+'suppressionlogtext' => 'ଲିଭାଯାଇଥିବା ଓ ଅଟକାଯାଇଥିବା, ଏହା ସହ ପରିଛାମାନଙ୍କଠାରୁ ଲୁଚାଯାଇଥିବା ଲେଖାଗୁଡ଼ିକର ଏକ ତାଲିକା ତଳେ ଦିଆଯାଇଛି ।
+ଏବେ କରାଯାଇଥିବା ବାସନ୍ଦ ଓ ବାରଣ ପାଇଁ [[Special:BlockList|block list]] ଦେଖନ୍ତୁ ।',
 
 # History merging
 'mergehistory' => 'ପୃଷ୍ଠାର ଇତିହାସ ସବୁ ଯୋଡ଼ିଦେବେ',
@@ -1222,7 +1234,7 @@ $1",
 'mergelogpagetext' => 'ତଳେ ସବୁଠାରୁ ନଗଦ ଯୋଡ଼ାଯାଇଥିବା ପୃଷ୍ଠାର ଇତିହାସ ଆଉ ଗୋଟିଏ ସହ ଦିଆଯାଇଅଛି ।',
 
 # Diffs
-'history-title' => '"$1" à¬ªà¬¾à¬\87à¬\81 à¬¸à¬\99à­\8dà¬\95ଳନ ଇତିହାସ',
+'history-title' => '"$1" à¬° à¬ªà­\81ନରାବà­\83ତି ଇତିହାସ',
 'difference-multipage' => '(ପୃଷ୍ଠା ଭିତରେ ଥିବା ତଫାତ)‌',
 'lineno' => '$1 କ ଧାଡ଼ି:',
 'compareselectedversions' => 'ବଛାହୋଇଥିବା ସଙ୍କଳନ ଗୁଡ଼ିକୁ ତଉଲିବେ',
@@ -1250,7 +1262,7 @@ $1",
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) ଟି ଦେଖିବେ',
 'searchmenu-legend' => 'ଖୋଜିବା ବିକଳ୍ପ',
 'searchmenu-exists' => "'''ଏହି ଉଇକିରେ \"[[:\$1]]\" ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ଅଛି ।'''",
-'searchmenu-new' => "<big><big><big>'''ଏହି ପ୍ରସଙ୍ଗଟି ଆଗରୁ ନାହିଁ, ତେଣୁ <big>''[[:$1]]''</big> ନାମରେ ପ୍ରସଙ୍ଗଟିଏ ଏଠାରେ ଗଢ଼ନ୍ତୁ!'''</big></big></big>",
+'searchmenu-new' => "'''ଏହି ପ୍ରସଙ୍ଗଟି ଆଗରୁ ନାହିଁ, ତେଣୁ ''[[:$1]]'' ନାମରେ ପ୍ରସଙ୍ଗଟିଏ ଏଠାରେ ଗଢ଼ନ୍ତୁ!'''",
 'searchhelp-url' => 'Help:ସୂଚୀ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ଏହି ନାମ ଆଗରୁ ଥିବା ପୃଷ୍ଠାସବୁ ଖୋଜିବେ]]',
 'searchprofile-articles' => 'ସୂଚୀ ପୃଷ୍ଠା',
@@ -1320,6 +1332,7 @@ $1",
 'prefs-beta' => 'ଆଗ ବିଶେଷତାମାନ',
 'prefs-datetime' => 'ତାରିଖ ଓ ସମୟ',
 'prefs-labs' => 'ପରଖଶାଳା ସୁବିଧାସବୁ',
+'prefs-user-pages' => 'ବ୍ୟବହାରକାରୀଙ୍କର ପୃଷ୍ଠାଗୁଡିକ',
 'prefs-personal' => 'ସଭ୍ୟ ପ୍ରଫାଇଲ',
 'prefs-rc' => 'ନଗଦ ବଦଳ',
 'prefs-watchlist' => 'ଦେଖଣା ତାଲିକା',
@@ -1447,7 +1460,7 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'userrights-reason' => 'କାରଣ:',
 'userrights-no-interwiki' => 'ଆପଣଙ୍କୁ ବାକି ଉଇକିରେ ସଭ୍ୟ ଅଧିକାର ବଦଳାଇବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।',
 'userrights-nodatabase' => '$1 ଡାଟାବେସଟି ନାହିଁ ବା କେବଳ ସ୍ଥାନୀୟ ହୋଇ ରହିଛି ।',
-'userrights-nologin' => 'à¬\86ପଣ à¬ªà¬°à¬¿à¬\9bା à¬\96ାତାରà­\81 [[Special:UserLogin|ଲà¬\97 à¬\87ନ]] à¬\95ରି à¬¸à¬­à­\8dà­\9f à¬\85ଧିà¬\95ାରର à¬¸à­\81ବିଧା à¬¨େଇପାରିବେ ।',
+'userrights-nologin' => 'à¬\86ପଣ à¬ªà¬°à¬¿à¬\9aାଳà¬\95 à¬\96ାତାରà­\81 [[Special:UserLogin|ଲà¬\97 à¬\87ନ]] à¬\95ରି à¬¸à¬­à­\8dà­\9f à¬\85ଧିà¬\95ାରର à¬¸à­\81ବିଧା à¬¦େଇପାରିବେ ।',
 'userrights-notallowed' => 'ଆପଣଙ୍କ ଖାତାରେ ସଭ୍ୟ ଅଧିକାର ଯୋଡ଼ିବା ବା କାଢ଼ିବାର ଅନୁମତି ନାହିଁ ।',
 'userrights-changeable-col' => 'ଆପଣ ବଦଳାଇପାରିବା ଗୋଠସମୂହ',
 'userrights-unchangeable-col' => 'ଯେଉଁ ଗୋଠସବୁ ଆପଣ ବଦଳାଇପାରିବେ ନାହିଁ',
@@ -1457,7 +1470,7 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'group-user' => 'ବ୍ୟବହାରକାରୀଗଣ',
 'group-autoconfirmed' => 'ଆପେଆପେ ଥୟ କରା ସଭ୍ୟ',
 'group-bot' => 'ଆପେଆପେ ଚାଳିତ ସଭ୍ୟ',
-'group-sysop' => 'ପରିà¬\9bାଗଣ',
+'group-sysop' => 'ପରିà¬\9aାଳà¬\95ଗଣ',
 'group-bureaucrat' => 'ପ୍ରଶାସକ',
 'group-suppress' => 'ଅଜାଣତ ଅଣଦେଖା',
 'group-all' => '(ସବୁ)',
@@ -1465,14 +1478,14 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'group-user-member' => '{{GENDER:$1|ବ୍ୟବହାରକାରୀ}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|ଆପେଆପେ ଥୟ କରା ସଭ୍ୟ}}',
 'group-bot-member' => '{{GENDER:$1|ଆପେଚାଳିତ ସଭ୍ୟ}}',
-'group-sysop-member' => '{{GENDER:$1|ପରିà¬\9bା}}',
+'group-sysop-member' => '{{GENDER:$1|ପରିà¬\9aାଳà¬\95}}',
 'group-bureaucrat-member' => '{{GENDER:$1|ପ୍ରଶାସକ}}',
 'group-suppress-member' => '{{GENDER:$1|ଅଜାଣତ ଅଣଦେଖା}}',
 
 'grouppage-user' => '{{ns:project}}:ବ୍ୟବହାରକାରୀ',
 'grouppage-autoconfirmed' => '{{ns:project}}:ଆପେଆପେ ଥୟ କରା ସଭ୍ୟ',
 'grouppage-bot' => '{{ns:project}}:ଆପେ ଚାଳିତ ସଭ୍ୟଗଣ',
-'grouppage-sysop' => '{{ns:project}}:ପରିà¬\9bା',
+'grouppage-sysop' => '{{ns:project}}:ପରିà¬\9aାଳà¬\95',
 'grouppage-bureaucrat' => '{{ns:project}}:ପ୍ରଶାସକଗଣ',
 'grouppage-suppress' => '{{ns:project}}:ଅଜାଣତ ଅଣଦେଖା',
 
@@ -1642,9 +1655,9 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 ଆଗରୁ ଅପଲୋଡ଼ କରାଯାଇଥିବା ଫାଇଲ [[Special:FileList|ଅପଲୋଡ଼ ହୋଇସାରିଥିବା ଫାଇଲ]] ଖୋଜିବା ବା ଦେଖିବା ପାଇଁ, (ପୁନ) ଅପଲୋଡ଼ମାନ [[Special:Log/upload|ଅପଲୋଡ଼ ଇତିହାସ]]ରେ ରହିଛି, ଲିଭାଯାଇଥିବା ଇତିହାସ [[Special:Log/delete|ଲିଭାଯାଇଥିବା ଇତିହାସ]]ରେ ରହିଛି ।
 
 ଏକ ପୃଷ୍ଠାରେ ଫାଇଲଟିଏ ଭରିବା ନିମନ୍ତେ ତଳଲିଖିତ ଫର୍ମରେ ଲିଙ୍କଟିଏ ବ୍ୟବହାର କରିବେ:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' ଫାଇଲଟିର ପୁରା ସଂସ୍କରଣ ବ୍ୟବହାର କରିବେ
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' ବାମ ଏକ ୨୦୦ ପିକ୍ସେଲର ଚଉଡ଼ା ଘରେ ବିବରଣୀ 'alt text' ଥିବା ବର୍ଣ୍ଣନା ରହିବ
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' ଫାଇଲଟି ନ ଦେଖାଇ ଫାଇଲ ସହ ସିଧା ଯୋଡ଼ିବା",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ଫାଇଲଟିର ପୁରା ସଂସ୍କରଣ ବ୍ୟବହାର କରିବେ
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' ବାମ ଏକ ୨୦୦ ପିକ୍ସେଲର ଚଉଡ଼ା ଘରେ ବିବରଣୀ 'alt text' ଥିବା ବର୍ଣ୍ଣନା ରହିବ
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' ଫାଇଲଟି ନ ଦେଖାଇ ଫାଇଲ ସହ ସିଧା ଯୋଡ଼ିବା",
 'upload-permitted' => 'ଅନୁମୋଦିତ ଫାଇଲ ପ୍ରକାର: $1 ।',
 'upload-preferred' => 'ପସନ୍ଦର ଫାଇଲ ପ୍ରକାର: $1 ।',
 'upload-prohibited' => 'ଅନନୁମୋଦିତ ଫାଇଲ ପ୍ରକାର: $1 ।',
@@ -1692,21 +1705,21 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 ଏହା ହୁଏତ ଫାଇଲ ନାମରେ କିଛି ଭୁଲ ଜନିତ ହୋଇଥାଇପାରେ ।
 ସତରେ ଆପଣ ଏହି ଫାଇଲଟି ଅପଲୋଡ଼ କରିବାକୁ ଚାହାନ୍ତି କି ନାଁ ଠାରେ ପରଖି ନିଅନ୍ତୁ ।',
 'windows-nonascii-filename' => 'ଏହି ଉଇକି ବିଶେଷ ସଂକେତ ଥିବା ଫାଇଲ ନାମକୁ ଅନୁମତି ଦିଏ ନାହିଁ ।',
-'fileexists' => "ଏହି ଏକା ନାଆଁରେ ଆଗରୁ ଫାଇଲଟିଏ ଅଛି , ସତରେ ଆପଣ ଏହାକୁ ଅପଲୋଡ଼ କରିବାକୁ ଚାହାନ୍ତି କି ନାଁ ଦୟାକରି '''<tt>[[:$1]]</tt>''' ପରଖି ନିଅନ୍ତୁ ।
-[[$1|thumb]]",
-'filepageexists' => "ଏହି ଫାଇଲର ବିବରଣୀ ପୃଷ୍ଠାଟି '''<tt>[[:$1]]</tt>''' ଠାରେ ତିଆରି କରାଯାଇଅଛି, କିନ୍ତୁ ଏହି ନାମରେ ଗୋଟିଏ ବି ଫାଇଲ ନାହିଁ ।
+'fileexists' => 'ଏହି ଏକା ନାଆଁରେ ଆଗରୁ ଫାଇଲଟିଏ ଅଛି , ସତରେ ଆପଣ ଏହାକୁ ଅପଲୋଡ଼ କରିବାକୁ ଚାହାନ୍ତି କି ନାଁ ଦୟାକରି <strong>[[:$1]]</strong> ପରଖି ନିଅନ୍ତୁ ।
+[[$1|thumb]]',
+'filepageexists' => 'ଏହି ଫାଇଲର ବିବରଣୀ ପୃଷ୍ଠାଟି <strong>[[:$1]]</strong> ଠାରେ ତିଆରି କରାଯାଇଅଛି, କିନ୍ତୁ ଏହି ନାମରେ ଗୋଟିଏ ବି ଫାଇଲ ନାହିଁ ।
 ବିବରଣୀ ପୃଷ୍ଠାରେ ଆପଣ ଦେଇଥିବା ସାରକଥା ଦେଖାଯିବ ନାହିଁ ।
 ଆପଣଙ୍କ ବିବରଣୀ ସେଠାରେ ଦେଖାଇବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ନିଜେ ଏହା ବଦଳାଇବାକୁ ପଡ଼ିବ ।
-[[$1|thumb]]",
-'fileexists-extension' => "ଏକାପରି ନାଆଁ ଥିବା ଫାଇଲଟିଏ ଆଗରୁ ଅଛି: [[$2|thumb]]
-* ଅପଲୋଡ଼ କରାଯାଉଥିବା ଫାଇଲର ନାମ: '''<tt>[[:$1]]</tt>'''
-* ଆଗରୁ ଥିବା ଫାଇଲର ନାମ: '''<tt>[[:$2]]</tt>'''
-ଦୟାକରି ଅଲଗା ନାମଟିଏ ବାଛନ୍ତୁ ।",
+[[$1|thumb]]',
+'fileexists-extension' => 'ଏକାପରି ନାଆଁ ଥିବା ଫାଇଲଟିଏ ଆଗରୁ ଅଛି: [[$2|thumb]]
+* ଅପଲୋଡ଼ କରାଯାଉଥିବା ଫାଇଲର ନାମ: <strong>[[:$1]]</strong>
+* ଆଗରୁ ଥିବା ଫାଇଲର ନାମ: <strong>[[:$2]]</strong>
+ଦୟାକରି ଅଲଗା ନାମଟିଏ ବାଛନ୍ତୁ ।',
 'fileexists-thumbnail-yes' => "ଫାଇଲଟି ଏକ ସାନ ଆକାରର ଛବି ବୋଲି ବୋଧ ହୁଏ ''(ନଖଦେଖଣା)''.
 [[$1|thumb]]
-ଦୟାକରି '''<tt>[[:$1]]</tt>''' ଫାଇଲଟି ପରଖି ନିଅନ୍ତୁ ।
+ଦୟାକରି <strong>[[:$1]]</strong> ଫାଇଲଟି ପରଖି ନିଅନ୍ତୁ ।
 ଯଦି ବଛା ଫାଇଲଟି ମୂଳ ଫାଇଲ ଆକାରର ହୋଇଥାଏ ତେବେ ଆଉ ଗୋଟିଏ ନଖଦେଖଣା ସାନ ଛବି ଅପଲୋଡ଼ କରିବାକୁ ପଡ଼ିବ ।",
-'file-thumbnail-no' => "ଫାଇଲ ନାମ '''<tt>$1</tt>'''ରେ ଆରମ୍ଭ ହୋଇଥାଏ ।
+'file-thumbnail-no' => "ଫାଇଲ ନାମ <strong>$1</strong>ରେ ଆରମ୍ଭ ହୋଇଥାଏ ।
 ଏହା ଏକ ଛୋଟ ଆକାରର ଛବି ଭଳି ବୋଧ ହୁଏ ''(ଛୋଟଦେଖଣା)'' ।
 ଯଦି ଆପଣଙ୍କ ପାଖରେ ପୁରା ରେଜୋଲୁସନର ଛବିଟିଏ ଅଛି ତେବେ ତାହା ଅପଲୋଡ଼ କରନ୍ତୁ କିମ୍ବା ଫାଇଲ ନାମ ବଦଳାଇ ଦିଅନ୍ତୁ ।",
 'fileexists-forbidden' => 'ଏହି ନାମରେ ଫାଇଲଟିଏ ଆଗରୁ ଅଛି ଯାହା ଉପରେ ଆଉଥରେ ମଡ଼ାଯାଇପାରିବ ନାହିଁ ।
@@ -1784,7 +1797,7 @@ $1',
 'backend-fail-writetemp' => 'ଅସ୍ଥାୟୀ ଫାଇଲ ତିଆରି କରିପାରିଲୁ ନାହିଁ ।',
 'backend-fail-closetemp' => 'ଅସ୍ଥାୟୀ ଫାଇଲ ବନ୍ଦ କରିହେଲା ନାହିଁ ।',
 'backend-fail-read' => '$1 ଫାଇଲଟି ପଢ଼ିପାରିଲୁ ନାହିଁ ।',
-'backend-fail-create' => '$1 à¬«à¬¾à¬\87ଲà¬\9fି à¬¤à¬¿à¬\86ରି à¬\95ରିପାରିଲà­\81 ନାହିଁ ।',
+'backend-fail-create' => '$1 à¬«à¬¾à¬\87ଲରà­\87 à¬\95ିà¬\9bି à¬²à­\87à¬\96ି à¬¹à­\87ଲା ନାହିଁ ।',
 
 # Lock manager
 'lockmanager-notlocked' => 'କିଳାଯାଇଥିବା "$1"କୁ ଖୋଲିପାରିଲୁ ନାହିଁ; ଏହା ପ୍ରକୃତରେ କିଳାଯାଇନାହିଁ ।',
@@ -1854,7 +1867,7 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 ଆପଣ ଟିକେ କମ ବ୍ୟସ୍ତ ସମୟ ଭିତରେ ଚେଷ୍ଟା କରିପାରନ୍ତି ।',
 
 'license' => 'ସତ୍ଵ:',
-'license-header' => 'ସତ୍ଵ:',
+'license-header' => 'ସତ୍ଵ',
 'nolicense' => 'ଗୋଟିଏ ବି ବଛାଯାଇନାହିଁ',
 'license-nopreview' => '(ସାଇତିବା ଆଗଦେଖଣା ମିଳୁନାହିଁ)',
 'upload_source_url' => '(ଏକ ବୈଧ ସାଧାରଣରେ ଖୋଲାଯାଇପାରୁଥିବା URL)',
@@ -1944,7 +1957,7 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 # MIME search
 'mimesearch' => 'MIME ଖୋଜା',
 'mimesearch-summary' => 'ଏହି ପୃଷ୍ଠାଟି ଫାଇଲ ମାନଙ୍କର MIME ପ୍ରକାରକୁ ଛଣିବାରେ ସହଯୋଗ କରିଥାଏ ।
-ଇନପୁଟ: ବିଷୟ ଶ୍ରେଣୀ/ଉପ ଶ୍ରେଣ, ଯଥା: <tt>image/jpeg</tt> ।',
+ଇନପୁଟ: ବିଷୟ ଶ୍ରେଣୀ/ଉପ ଶ୍ରେଣ, ଯଥା: <code>image/jpeg</code> ।',
 'mimetype' => 'MIME ପ୍ରକାର:',
 'download' => 'ଡାଉନଲୋଡ଼',
 
@@ -1991,9 +2004,9 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 
 'disambiguations' => 'ବହୁବିକଳ୍ପ ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ା ପୃଷ୍ଠା',
 'disambiguationspage' => 'Template:ବହୁବିକଳ୍ପ',
-'disambiguations-text' => "ତଲାଲିà¬\96ିତ à¬ªà­\83ଷà­\8dଠାମାନ '''ବହୁବିକଳ୍ପ ପୃଷ୍ଠା'''କୁ ଯୋଡ଼ିଥାନ୍ତି ।
-ସà­\87ହିସବà­\81 à¬\89ପଯà­\81à¬\95à­\8dତ à¬ªà­\8dରସà¬\99à­\8dà¬\97 à¬¸à¬¹ à¬¯à­\8bଡ଼ାହà­\87ବା à¬\9cରà­\81ରà­\80 ।<br />
-A page is treated as disambiguation page if it uses a template which is linked from [[MediaWiki:Disambiguationspage]] ସହ ଯୋଡ଼ାଥିବା ଛାଞ୍ଚ ବ୍ୟବହାର କରୁଥିଲେ ପୃଷ୍ଠାଟିଏକୁ ବହୁବିକଳ୍ପ ପୃଷ୍ଠା ବୋଲି କୁହାଯାଏ",
+'disambiguations-text' => "ତଳà­\87 à¬¥à¬¿à¬¬à¬¾ à¬ªà­\83ଷà­\8dଠାà¬\97à­\81ଡିà¬\95 à¬\85ତିà¬\95ମରà­\87 à¬\97à­\8bà¬\9fà­\87 à¬\97à­\8bà¬\9fà­\87 '''ବହୁବିକଳ୍ପ ପୃଷ୍ଠା'''କୁ ଯୋଡ଼ିଥାନ୍ତି ।
+ସà­\87ସବà­\81 à¬\85ଧିà¬\95 à¬\89ପଯà­\81à¬\95à­\8dତ à¬ªà­\8dରସà¬\99à­\8dà¬\97 à¬¸à¬¹ à¬¯à­\8bଡ଼ାହà­\87ବା à¬\89à¬\9aିତ  ।<br />
+[[MediaWiki:Disambiguationspage]] ସହ ଯୋଡ଼ାଥିବା ଛାଞ୍ଚ ବ୍ୟବହାର କରୁଥିଲେ ପୃଷ୍ଠାଟିଏକୁ ବହୁବିକଳ୍ପ ପୃଷ୍ଠା ବୋଲି କୁହାଯାଏ",
 
 'doubleredirects' => 'ଯୋଡ଼ା ପୁନପ୍ରେରଣ',
 'doubleredirectstext' => 'ଏହି ପୃଷ୍ଠା ବାକି ବହୁବିକଳ୍ପ ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ିଥାଏ ।
@@ -2006,7 +2019,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
 
 'brokenredirects' => 'ଭଙ୍ଗା ପୁନପ୍ରେରଣ',
 'brokenredirectstext' => 'ତଳଲିଖିତ ପୁନପ୍ରେରଣ ସବୁ ସ୍ଥିତିହିନ ପୃଷ୍ଠାମାନଙ୍କୁ ପୁନପ୍ରେରିତ ହୋଇଥାଏ :',
-'brokenredirects-edit' => "<big>'''ଏହାକୁ ବଦଳାନ୍ତୁ'''</big>",
+'brokenredirects-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
 'brokenredirects-delete' => 'ଲିଭାଇବେ',
 
 'withoutinterwiki' => 'ଭାଷାର ଲିଙ୍କ ନଥିବା ପୃଷ୍ଠାମାନ',
@@ -2116,6 +2129,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
 'allpagesbadtitle' => 'ଆପଣ ଅନୁରୋଧ କରିଥିବା ପୃଷ୍ଠାଟି ଭୁଲ, ଅଲଗା ଭାଷାର ବ୍ୟବହାର କରାଯାଇଛି ବା ଭୁଲ ଇଣ୍ଟର ଉଇକି ଉପସର୍ଗ ଦିଆଯାଇଛି ।
 ଏଥିରେ ଥିବା ଗୋଟିଏ ବା ଦୁଇଟି ଅକ୍ଷର ଶିରୋନାମା ଭାବରେ ବ୍ୟବହାର କରାଯାଇ ପାରିବ ନାହିଁ ।',
 'allpages-bad-ns' => '{{SITENAME}}ରେ "$1" ନେମସ୍ପେସଟିଏ ନାହିଁ ।',
+'allpages-hide-redirects' => 'ପୁନଃପ୍ରେରଣସମୂହକୁ ଲୁଚାଇବେ',
 
 # SpecialCachedPage
 'cachedspecial-refresh-now' => 'ନୂତନତମ ଦେଖନ୍ତୁ ।',
@@ -2141,7 +2155,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
 'linksearch-ok' => 'ଖୋଜିବା',
 'linksearch-text' => '"*.wikipedia.org" ପରି ୱାଇଲ୍ଡକାର୍ଡ଼ର ବ୍ୟବହାର କରାଯାଇଥାଇ ପାରେ ।
 ଏକ ଉଚ୍ଚକୋଟୀର ଡୋମେନ ଲୋଡ଼ା, ଯଥା "*.org".<br />
-ଅନୁମୋଦିତ ପ୍ରଟୋକଲ: <tt>$1</tt> (ନିଜର ଖୋଜିବାରେ ଏହାକୁ ରଖନ୍ତୁ ନାହିଁ) ।',
+ଅନୁମୋଦିତ ପ୍ରଟୋକଲ: <code>$1</code> (ନିଜର ଖୋଜିବାରେ ଏହାକୁ ରଖନ୍ତୁ ନାହିଁ) ।',
 'linksearch-line' => '$1 ଟି $2ରୁ ଯୋଡ଼ାଯାଇଅଛି ।',
 'linksearch-error' => 'କେବଳ ହୋଷ୍ଟ ନାମର ଆରମ୍ଭରେ ୱାଇଲ୍ଡକାର୍ଡ଼ ଦେଖାଯିବ ।',
 
@@ -2157,7 +2171,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
 'activeusers-count' => 'ବିଗତ {{PLURAL:$3|ଦିନ|$3 ଦିନରେ}}ରେ $1ଟି {{PLURAL:$1|ସମ୍ପାଦନା|ସମ୍ପାଦନା}}',
 'activeusers-from' => 'ଏହି ନାମରେ ଆରମ୍ଭ ହେଉଥିବା ସଭ୍ୟମାନଙ୍କୁ ଦେଖାଇବେ:',
 'activeusers-hidebots' => 'ଆପେଆପେ ଚାଳିତ ସଭ୍ୟମାନଙ୍କୁ ଲୁଚାନ୍ତୁ',
-'activeusers-hidesysops' => 'ପରିà¬\9bାà¬\97ଣଙ୍କୁ ଲୁଚାଇବେ',
+'activeusers-hidesysops' => 'ପରିà¬\9aାଳà¬\95ମାନଙ୍କୁ ଲୁଚାଇବେ',
 'activeusers-noresult' => 'ଜଣେ ବି ସଭ୍ୟ ମିଳିଲେ ନାହିଁ ।',
 
 # Special:Log/newusers
@@ -2187,6 +2201,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
 'mailnologin' => 'ଗୋଟିଏ ବି ପଠାଇବା ଠିକଣା ନାହିଁ',
 'mailnologintext' => 'ଆପଣ ନିଜ [[Special:Preferences|ପସନ୍ଦସବୁ]]ରେ [[Special:UserLogin|ଲଗ ଇନ]] କରିଥିଲେ ଓ ନିଜର ଏକ ସଚଳ ଇ-ମେଲ ଠିକଣା ଥିଲେ ଯାଇ ବାକି ସବୁ ସଭ୍ୟଙ୍କୁ ଇ-ମେଲ ପଠାଇପାରିବେ ।',
 'emailuser' => 'ଏହି ସଭ୍ୟଙ୍କୁ ଇମେଲ କରିବେ',
+'emailuser-title-notarget' => 'ବ୍ୟବହାରକାରୀ କୁ ଇ-ମେଲ',
 'emailpage' => 'ଇ-ମେଲ ବ୍ୟବହାରକାରୀ',
 'emailpagetext' => 'ତଳେ ଥିବା ଫର୍ମ ବ୍ୟବହାର କରି ଆପଣ ଏହି ସଭ୍ୟଙ୍କୁ ଇ-ମେଲ କରିପାରିବେ ।
 [[Special:Preferences|ଆପଣଙ୍କ ପସନ୍ଦ]]ରେ ଥିବା ଇ-ମେଲ ଠିକଣା ପ୍ରେରକ ଭାବରେ ଦେଖାଯିବ, ତେଣୁ ଚିଠି ପାଇଥିବା ସଭ୍ୟ ଆପଣଙ୍କୁ ସିଧା ସଳଖ ଉତ୍ତର ଦେଇପାରିବ ।',
@@ -2409,7 +2424,7 @@ $2ଙ୍କ ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସ୍କର
 'pagesize' => '(ବାଇଟ)',
 
 # Restrictions (nouns)
-'restriction-edit' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
+'restriction-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
 'restriction-move' => 'ଘୁଞ୍ଚାଇବେ',
 'restriction-create' => 'ଗଢ଼ନ୍ତୁ',
 'restriction-upload' => 'ଅପଲୋଡ଼ କରନ୍ତୁ',
@@ -2567,8 +2582,8 @@ $1',
 'ipb-confirm' => 'ଅଟକ ଥୟ କରିବେ',
 'badipaddress' => 'ଭୁଲ IP ଠିକଣା',
 'blockipsuccesssub' => 'ବାସନ୍ଦ ସଫଳ ହେଲା',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] à¬\85à¬\9fà¬\95ାଯାà¬\87à¬\9bନà­\8dତି.<br />
-ଅଟକ ବାବଦରେ ଟିପ୍ପଣୀ ଦେବା ନିମନ୍ତେ [[Special:BlockList|IP ତାଲିକା]] ଦେଖନ୍ତୁ ।',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] à¬\85à¬\9fà¬\95ାଯାଯାà¬\87à¬\9bି.<br />
+ଅଟକ ବାବଦରେ ଟିପ୍ପଣୀ ଦେବା ନିମନ୍ତେ [[Special:BlockList|block list]] ଦେଖନ୍ତୁ ।',
 'ipb-blockingself' => 'ଆପଣ ନିଜକୁ ଅଟକାଇବାକୁ ଯାଉଛନ୍ତି ! ଆପଣ ପୁରାପୁରି ନିଶ୍ଚିତ ତ?',
 'ipb-confirmhideuser' => 'ଆପଣ "ବ୍ୟବହାରକାରୀଙ୍କୁ ଲୁଚାନ୍ତୁ" ସଚଳ କରି ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କୁ ଅଟକାଇବାକୁ ଯାଉଛନ୍ତି । ଏହା ବ୍ୟବହାରକାରୀଙ୍କ ନାମକୁ ସବୁଯାକ ତାଲିକାୟ ଇତିହାସରେ ଲୁଚାଇଦେବ । ତଥାପି ବି ଆପଣ ଏହା କରିବାକୁ ଚାହୁଁଛନ୍ତି କି?',
 'ipb-edit-dropdown' => 'ସମ୍ପାଦନା ଅଟକ କାରଣମାନ',
@@ -2927,13 +2942,13 @@ MediaWiki ବ୍ୟବହାର କରି [[Special:Import|ପୃଷ୍ଠା 
 'tooltip-t-contributions' => 'ଏହି ଇଉଜରଙ୍କର ଦେଇ କରାଯାଇଥିବା ସବୁଯାକ ଦାନ ଦେଖାଇବା',
 'tooltip-t-emailuser' => 'ଏହି ସଭ୍ୟଙ୍କୁ ଇ-ମେଲଟିଏ ପଠାଇବେ',
 'tooltip-t-upload' => 'ଫାଇଲ ଅପଲୋଡ଼ କରିବେ',
-'tooltip-t-specialpages' => 'ନିà¬\86ରା à¬ªà­\83ଷà­\8dଠା ତାଲିକା',
+'tooltip-t-specialpages' => 'ବିଶà­\87ଷ à¬ªà­\83ଷà­\8dଠାମାନà¬\99à­\8dà¬\95ର à¬\8fà¬\95 ତାଲିକା',
 'tooltip-t-print' => 'ଏହି ପୃଷ୍ଠାର ଛପାହୋଇପାରିବା ସଙ୍କଳନ',
 'tooltip-t-permalink' => 'ବଦଳାଯାଇଥିବା ଏହି ଫରଦଟିର ସ୍ଥାୟୀ ଲିଙ୍କ',
 'tooltip-ca-nstab-main' => 'ସୂଚୀ ପୃଷ୍ଠାଟି ଦେଖାଇବେ',
 'tooltip-ca-nstab-user' => 'ଫାଇଲ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ',
 'tooltip-ca-nstab-media' => 'ମିଡ଼ିଆ ପୃଷ୍ଠାଟି ଦେଖିବେ',
-'tooltip-ca-nstab-special' => 'à¬\8fà¬\87à¬\9fି à¬\97à­\8bà¬\9fିà¬\8f à¬¨à¬¿à¬\86ରା ପୃଷ୍ଠା, ଆପଣ ଏହାକୁ ବଦଳାଇପାରିବେ ନାହିଁ',
+'tooltip-ca-nstab-special' => 'à¬\8fହା à¬\97à­\8bà¬\9fିà¬\8f à¬¬à¬¿à¬¶à­\87ଷ ପୃଷ୍ଠା, ଆପଣ ଏହାକୁ ବଦଳାଇପାରିବେ ନାହିଁ',
 'tooltip-ca-nstab-project' => 'ପ୍ରକଳ୍ପ ପୃଷ୍ଠାଟି ଦେଖାଇବେ',
 'tooltip-ca-nstab-image' => 'ଫାଇଲ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ',
 'tooltip-ca-nstab-mediawiki' => 'ସିଷ୍ଟମ ମେସେଜ ଦେଖିବେ',
@@ -2982,15 +2997,11 @@ MediaWiki ବ୍ୟବହାର କରି [[Special:Import|ପୃଷ୍ଠା 
 # Info page
 'pageinfo-title' => '"$1"ର ବିବରଣୀ',
 'pageinfo-header-edits' => 'ବଦଳସବୁ',
-'pageinfo-header-watchlist' => 'ଦେଖଣା ତାଲିକା',
-'pageinfo-header-views' => 'ଦେଖଣା',
-'pageinfo-subjectpage' => 'ପୃଷ୍ଠା',
-'pageinfo-talkpage' => 'ଆଲୋଚନା ପୃଷ୍ଠା',
+'pageinfo-article-id' => 'ପୃଷ୍ଠା ଆଇଡ଼ି',
+'pageinfo-views' => 'ଦେଖଣା ସଂଖ୍ୟା',
 'pageinfo-watchers' => 'ଦେଖଣାହାରି ସଂଖ୍ୟା',
 'pageinfo-edits' => 'ସମ୍ପାଦନା ସଂଖ୍ୟା:',
 'pageinfo-authors' => 'ନିଆରା ଲେଖକଙ୍କ ସଂଖ୍ୟା',
-'pageinfo-views' => 'ଦେଖଣା ସଂଖ୍ୟା',
-'pageinfo-viewsperedit' => 'ସମ୍ପାଦନା ପ୍ରତି ଦେଖା',
 
 # Patrolling
 'markaspatrolleddiff' => 'ଜଗାଯାଇଅଛି ବୋଲି ଚିହ୍ନିତ କରାଗଲା',
@@ -3651,7 +3662,7 @@ $5
 # Special:Version
 'version' => 'ସଂସ୍କରଣ',
 'version-extensions' => 'ଇନଷ୍ଟଲ କରାହୋଇଥିବା ଏକ୍ସଟେନସନସବୁ',
-'version-specialpages' => 'ନିà¬\86ରା ପୃଷ୍ଠା',
+'version-specialpages' => 'ବିଶà­\87ଷ ପୃଷ୍ଠା',
 'version-parserhooks' => 'ପାର୍ସର ହୁକ',
 'version-variables' => 'ଚଳ',
 'version-antispam' => 'ଅଦରକାରୀ ମେଲ ଅଟକ',
@@ -3676,6 +3687,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'version-software' => 'ଇନଷ୍ଟଲ ହୋଇଥିବା ସଫ୍ଟୱାର',
 'version-software-product' => 'ଉତ୍ପାଦ',
 'version-software-version' => 'ସଂସ୍କରଣ',
+'version-entrypoints-header-entrypoint' => 'ପ୍ରବେଶ ବିନ୍ଦୁ',
 'version-entrypoints-header-url' => 'ଇଉଆରଏଲ',
 
 # Special:FilePath
@@ -3697,7 +3709,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'fileduplicatesearch-noresults' => '"$1" ନାମରେ ଗୋଟିଏ ବି ଫାଇଲ ମିଳିଲା ନାହିଁ ।',
 
 # Special:SpecialPages
-'specialpages' => 'ନିà¬\86ରା ପୃଷ୍ଠା',
+'specialpages' => 'ବିଶà­\87ଷ ପୃଷ୍ଠା',
 'specialpages-note' => '----
 * ସାଧାରଣ ବିଶେଷ ପୃଷ୍ଠାମାନ ।
 * <span class="mw-specialpagerestricted">କିଳାଯାଇଥିବା ବିଶେଷ ପୃଷ୍ଠାମାନ ।</span>',
@@ -3738,7 +3750,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'tags-display-header' => 'ବଦଳ ତାଲିକାରେ ଦେଖଣା',
 'tags-description-header' => 'ଅର୍ଥର ପୁରା ବିବରଣୀ',
 'tags-hitcount-header' => 'ଚିହ୍ନିତ ବଦଳ',
-'tags-edit' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
+'tags-edit' => 'ସମ୍ପାଦନା',
 'tags-hitcount' => '$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}',
 
 # Special:ComparePages
@@ -3841,6 +3853,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'api-error-file-too-large' => 'ଆପଣ ପଠାଇଥିବା ଫାଇଲଟି ବିରାଟ ଅଟେ ।',
 'api-error-filename-tooshort' => 'ଫାଇଲ ନାମଟି ଖୁବ ଛୋଟ ।',
 'api-error-filetype-banned' => 'ଏହି ପ୍ରକାରର ଫାଇଲ ବାରଣ କରାଯାଇଅଛି ।',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|ଏକ ଅନୁମୋଦିତ ଫାଇଲ ପ୍ରକାର ନୁହେଁ|ମାନ ଅନୁମୋଦିତ ଫାଇଲ ପ୍ରକାର ନୁହଁନ୍ତି}} । ଅନୁମୋଦିତ {{PLURAL:$3|ଫାଇଲ ପ୍ରକାର ହେଲା|ଫାଇଲ ପ୍ରକାର ହେଲା}} $2 ।',
 'api-error-filetype-missing' => 'ଫାଇଲଟିର ଏକ୍ସଟେନସନ ନାହିଁ ।',
 'api-error-hookaborted' => 'ଏକ ଏକ୍ସଟେନସନ ହୁକ ଦେଇ ଆପଣ କରୁଥିବା ବଦଳଟି ବନ୍ଦ କରିଦିଆଗଲା ।',
 'api-error-http' => 'ଭିତର ଅସୁବିଧା: ସର୍ଭର ସହ ଯୋଡ଼ି ହେଉନାହିଁ ।',
@@ -3865,4 +3878,10 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'api-error-uploaddisabled' => 'ଉଇକିରେ ଅପଲୋଡ଼ କରିବା ଅଚଳ କରାଯାଇଅଛି ।',
 'api-error-verification-error' => 'ଏହି ଫାଇଲଟି ବୋଧ ହୁଏ ନଷ୍ଟ ହୋଇଯାଇଅଛି କିମ୍ବା ଭୁଲ ଏକ୍ସଟେନସନ ଦିଆଯାଇଅଛି ।',
 
+# Durations
+'duration-years' => '$1 {{PLURAL:$1|year|years}}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decades}',
+'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
 );
index 1105add..9f18071 100644 (file)
@@ -50,14 +50,40 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
-       'Recentchanges'             => array( 'Фæстаг_ивдтытæ' ),
+       'Activeusers'               => array( 'АктивонАрхайджытæ' ),
+       'Allmessages'               => array( 'ФыстæджытæИууылдæр' ),
+       'Allpages'                  => array( 'ФæрстæИууылдæр' ),
+       'Blankpage'                 => array( 'АфтидФарс' ),
+       'Block'                     => array( 'Блок' ),
+       'Blockme'                   => array( 'НыблокМæКæн' ),
+       'Booksources'               => array( 'ЧингуытыРавзæрæнтæ' ),
+       'BrokenRedirects'           => array( 'ЦъæлРарвыстытæ' ),
+       'Categories'                => array( 'Категоритæ' ),
+       'ChangeEmail'               => array( 'EmailИвын' ),
+       'ChangePassword'            => array( 'ПарольИвын' ),
+       'ComparePages'              => array( 'ФæрстæАбарын' ),
+       'Confirmemail'              => array( 'EmailБæлвырдКæнын' ),
+       'Contributions'             => array( 'Бавæрд' ),
+       'CreateAccount'             => array( 'АккаунтСкæнын' ),
+       'DeletedContributions'      => array( 'ХафтБавæрд' ),
+       'Mycontributions'           => array( 'МæБавæрд' ),
+       'Mypage'                    => array( 'МæФарс' ),
+       'Mytalk'                    => array( 'МæНыхас' ),
+       'Myuploads'                 => array( 'МæБавгæд' ),
+       'Newimages'                 => array( 'НогФайлтæ' ),
+       'Newpages'                  => array( 'НогФæрстæ' ),
+       'Preferences'               => array( 'Фадæттæ' ),
+       'Randompage'                => array( 'ÆрхаугæФарс' ),
+       'Recentchanges'             => array( 'ФæстагИвдтытæ' ),
+       'Search'                    => array( 'Агурын' ),
+       'Watchlist'                 => array( 'Цæстдард' ),
 );
 
 
 $magicWords = array(
-       'redirect'                => array( '0', '#РАРВЫСТ', '#перенаправление', '#перенапр', '#REDIRECT' ),
-       'img_right'               => array( '1', 'рахиз', 'справа', 'right' ),
-       'img_left'                => array( '1', 'галиу', 'слева', 'left' ),
+       'redirect'                  => array( '0', '#РАРВЫСТ', '#перенаправление', '#перенапр', '#REDIRECT' ),
+       'img_right'                 => array( '1', 'рахиз', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'галиу', 'слева', 'left' ),
 );
 
 $linkTrail = '/^((?:[a-z]|а|æ|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|о|п|р|с|т|у|ф|х|ц|ч|ш|щ|ъ|ы|ь|э|ю|я|“|»)+)(.*)$/sDu';
@@ -71,7 +97,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Айсын бæрæггонд ивдтытæ фæстаг ивдтытæй',
 'tog-newpageshidepatrolled' => 'Басгæрст фæрстæ ног фæрсты номхыгъдæй æмбæхс',
 'tog-extendwatchlist' => 'Стырдæр цæстдард номхыгъд алы ивдимæ дæр, æрмæст фæстагимæ нал.',
-'tog-usenewrc' => 'Ð¥Ñ\83Ñ\8bздæÑ\80 Ñ\84æÑ\81Ñ\82аг Ð¸Ð²Ð´Ñ\82Ñ\8bÑ\82Ñ\8b Ð½Ð¾Ð¼Ñ\85Ñ\8bгÑ\8aд (домы JavaScript)',
+'tog-usenewrc' => 'ФæÑ\81Ñ\82аг Ã¦Ð¼Ã¦ Ñ\86æÑ\81Ñ\82даÑ\80д Ð¸Ð²Ð´Ñ\82Ñ\8bÑ\82æ Ñ\84аÑ\80Ñ\81мæ Ð³Ã¦Ñ\81гæ Ð¸Ñ\83 ÐºÃ¦Ð½Ã¦Ñ\82 (домы JavaScript)',
 'tog-numberheadings' => 'Сæргæндты автоматикон нумераци',
 'tog-showtoolbar' => 'Æвдисын ивыны панел (домы JavaScript)',
 'tog-editondblclick' => 'Фæрстæ дыкъæппæй ив (JavaScript)',
@@ -79,17 +105,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Сæргондыл рахиз æркъæппæй фарсы хæйттæ ив (JavaScript)',
 'tog-showtoc' => 'Сæргæндты номхыгъд æвдис (æртæ сæргондæй фылдæр цы фарсы ис, уым)',
 'tog-rememberpassword' => 'Бахъуыды мæ кæнæд ацы браузер ($1 {{PLURAL:$1|бонмæ|бонмæ}})',
-'tog-watchcreations' => 'Æз цы фæрстæ райдайын, уыдонмæ мæ цæст дарын мæ фæнды',
-'tog-watchdefault' => 'Æз цы фæрстæ ивын, уыдонмæ мæ цæст дарын мæ фæнды',
-'tog-watchmoves' => 'Æз цы фæрсты нæмттæ ивын, уыдонмæ мæ цæст дарын мæ фæнды',
-'tog-watchdeletion' => 'Æз цы фæрстæ аппарын, уыдонмæ мæ цæст дарын мæ фæнды',
+'tog-watchcreations' => 'Æз цы фæрстæ аразын æмæ цы файлтæ бавгæнын, уыдон мæ цæстдард уæт.',
+'tog-watchdefault' => 'Æз цы фæрстæ æмæ цы файлтæ ивын, уыдон мæ цæстдард уæт',
+'tog-watchmoves' => 'Æз цы фæрсты нæмттæ æмæ цы файлтæ ивын, уыдон мæ цæстдард уæт',
+'tog-watchdeletion' => 'Æз цы фæрстæ æмæ цы файлтæ хафын, уыдон мæ цæстдард уæт',
 'tog-minordefault' => 'Æппæт ивддзинæдтæ банысан кæн куыд чысылтæ',
 'tog-previewontop' => 'Разæркасты рудзынг ивыны рудзынджы уæлдæр',
 'tog-previewonfirst' => 'Æвдисын иу разæркаст фыццаг ивды рæстæджы',
 'tog-nocache' => 'Ахицæн кæнын браузеры кешкæнынад',
-'tog-enotifwatchlistpages' => 'Электронон постæй мæм хъуысынгæнинаг æрвыст уа, æз цы фæрстæм мæ цæст дарын, уыдонæй иу куы ивд æрцæуа, уæд',
+'tog-enotifwatchlistpages' => 'Æз цы фæрстæм æмæ цы файлтæм дарын мæ цæст, уыдонæй иу ивд куы æрцæуа, уæд-иу мæм E-mail æрцæуæд',
 'tog-enotifusertalkpages' => 'Электронон постæй мæм хъуысынгæнинаг æрвыст уа, мæ тæрхоны фарс куы ивд æрцæуа, уæд',
-'tog-enotifminoredits' => 'Ð\9aæд Ð¸Ð²Ð´Ð´Ð·Ð¸Ð½Ð°Ð´ Ñ\87Ñ\8bÑ\81Ñ\8bл Ñ\83, Ñ\83æддæÑ\80 Ð¼Ã¦Ð¼ Ñ\8dлекÑ\82Ñ\80онон Ñ\84Ñ\8bÑ\81Ñ\82æг Ã¦Ñ\80баÑ\86æÑ\83а',
+'tog-enotifminoredits' => 'ФаÑ\80Ñ\81 ÐºÃ¦Ð½Ã¦ Ñ\84айлÑ\8b Ð¸Ð²Ð´ Ñ\87Ñ\8bÑ\81Ñ\8bл ÐºÑ\83Ñ\8b Ñ\83а, Ñ\83æддæÑ\80-иÑ\83 Ð¼Ã¦Ð¼ E-mail Ã¦Ñ\80баÑ\86æÑ\83æÑ\82',
 'tog-enotifrevealaddr' => 'Æвдисын мæ e-mail хъусын кæныны фыстæджыты',
 'tog-shownumberswatching' => 'Цал архайæджы фарсмæ сæ цæст дарынц, уый равдис',
 'tog-oldsig' => 'Ныры къухæрфыст:',
@@ -422,6 +448,8 @@ $1',
 'cannotdelete' => 'Нæй аппарæн файл кæнæ фарс "$1".
 Æндæр исчи йæ аппæрста мыййаг.',
 'cannotdelete-title' => 'Нæ уайы схафын фарс "$1"',
+'delete-hook-aborted' => 'Хук æй хафын нæ бауагъта.
+Уæлæмхасæн æмбарынгæнæн нæ радта.',
 'badtitle' => 'Æнæмбæлон сæргонд',
 'badtitletext' => 'Æрдомд фарсы ном уыд рæдыдимæ кæнæ афтид кæнæ та йæ æхсæн-æвзаг æви йæ интервики æрвитæн раст нæ уыд.
 Гæнæн ис Номы ис ахæм дамгъæтæ, кæдон уым æвæрын нæй гæнæн.',
@@ -456,6 +484,10 @@ $2',
 'filereadonlyerror' => 'Нæ уайы фæивын файл "$1" уый тыххæй æмæ репозиторий "$2" кусы æрмæст фæрсыны уавæры.
 
 Радгæс, кæцы сæвæрдта ацы уавæр, ныууагъта ахæм амонæн: "\'\'$3\'\'".',
+'invalidtitle-knownnamespace' => '"$2" номдон æмæ "$3" тексты рæдыд сæр',
+'invalidtitle-unknownnamespace' => 'Æнæзонгæ номдоны нымæц, "$1" æмæ "$2" тексты рæдыд сæр',
+'exception-nologin' => 'Системæмæ æнæхызт',
+'exception-nologin-text' => 'Ацы фарс кæнæ ми домынц дæуæй, цæмæй системæмæ хызт уай.',
 
 # Virus scanner
 'virus-badscanner' => "Æвзæр æвæрд: Нæзонгæ вирусты скане: ''$1''",
@@ -552,25 +584,81 @@ $2',
 'emaildisabled' => 'Ацы сайтæн йæ бон нæу æрвитын e-mail.',
 'accountcreated' => 'Аккаунт конд æрцыд',
 'accountcreatedtext' => '$1 архайæджы аккаунт конд æрцыд.',
-'createaccount-title' => '{{grammar:genitive|{{SITENAME}}}} аккант бакæнын',
+'createaccount-title' => '{{grammar:genitive|{{SITENAME}}}} аккаунт бакæнын',
+'createaccount-text' => '{{grammar:genitive|{{SITENAME}}}} ($4) чидæр бакодта аккаунт дæ e-mail адрисæн æмæ йæ схуыдта "$2", "$3" паролимæ.
+Ныр ды хъуамæ бахизай системæмæ æмæ фæивай дæ парол.
+
+Дæ бон у мацæмæ дарай ацы фыстæг, кæд уыцы аккаунт рæдыдæй сарæзтис.',
+'usernamehasherror' => 'Фæсномыгы ма хъуамæ уа хызæг нысан',
+'login-throttled' => 'Фæстаг рæстæджы ды бахизын æгæр бирæ фæлвардтай.
+Дæ хорзæхæй, фæлæуу-иу иннæ фæлварæны размæ.',
+'login-abort-generic' => 'Нæ дын бантыст бахизын. Урæд.',
 'loginlanguagelabel' => 'Æвзаг: $1',
+'suspicious-userlogout' => 'Дæ рахизыны домæн нæ сæххæст ис, уымæн æмæ хæлд браузерæй кæнæ кешгæнæг проксийæ æрвысты хуызæн у.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'Нæбæрæг рæдыд PHP-йы mail() функцийы.',
+'user-mail-no-addy' => 'Е-mail æрвыста æнæ e-mail адрисæй.',
 
 # Change password dialog
+'resetpass' => 'Пароль фæивын',
+'resetpass_announce' => 'Ды бахызтæ e-mail-æй æрвыст рæстæгмæ паролæй.
+Цæмæй кæронмæ бахизай системæмæ, уый тыххæй ам хъуамæ сæвæрай ног пароль.',
 'resetpass_text' => '<!-- Бахæсс дæ текст ам -->',
+'resetpass_header' => 'Аккаунты пароль ивын',
 'oldpassword' => 'Раздæры пароль:',
 'newpassword' => 'Нæуæг пароль:',
+'retypenew' => 'Ног пароль ногæй бафысс:',
+'resetpass_submit' => 'Пароль сæвæрын æмæ системæмæ бахизын',
+'resetpass_success' => 'Дæ пароль ивд æрцыд!
+Ныр ды хизыс системæмæ...',
 'resetpass_forbidden' => 'Пароль баивæн нæй',
+'resetpass-no-info' => 'Ды хъуамæ системæмæ хызт уай, цæмæй ацы фарсмæ комкоммæ бавналай.',
 'resetpass-submit-loggedin' => 'Пароль фæивын',
 'resetpass-submit-cancel' => 'Ныууадзын',
+'resetpass-wrong-oldpass' => 'Рæстæгмæ кæнæ нырыккон пароль нæ бæззы.
+Гæнæн ис ды нырид фæивтай дæ пароль кæнæ та ног рæстæгмæ пароль æрдомдтай.',
 'resetpass-temp-password' => 'Рæстæгмæ пароль:',
 
 # Special:PasswordReset
+'passwordreset' => 'Пароль фæлварæн',
+'passwordreset-text' => 'Байдзаг кæн ацы формæ, цæмæй райсай дæ аккаунты бахизæнтæ рымысæн e-mail.',
+'passwordreset-legend' => 'Пароль раппарын',
+'passwordreset-disabled' => 'Парол фæлварын ацы викийы хицæн у.',
+'passwordreset-pretext' => '{{PLURAL:$1||Дæлдæр цы рардты хæйттæ ис, уыдонæй иу бафысс}}',
 'passwordreset-username' => 'Фæсномыг:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Цы e-mail рауадис, уый æвдыст æрцæуæт?',
+'passwordreset-capture-help' => 'Кæд сæвæрай ацы нысан, уæд дын e-mail (рæстæгмæ паролимæ) æвдыст æрцæудзæн. Архайæгмæ дæр æрвыст æрцæудзæн.',
 'passwordreset-email' => 'Электрон посты адрис:',
+'passwordreset-emailtitle' => '{{grammar:genitive|{{SITENAME}}}} акканты тыххæй',
+'passwordreset-emailtext-ip' => 'Чидæр (уæццæгæн ды, $1 IP адрисæй) æрдомдта дæ {{grammar:genitive|{{SITENAME}}}} ($4) аккаунты тыххæй детальтæ. Ацы архайæджы {{PLURAL:$3|аккаунт баст у|аккаунттæ баст сты}} ацы e-mail адрисимæ:
+
+$2
+
+{{PLURAL:$3|Ацы рæстæгмæ пароль|Ацы рæстæгмæ паролтæ}} кусдзысты {{PLURAL:$5|иу бон|$5 боны}}.
+Ныр ды хъуамæ бахизай системæмæ æмæ равзарай ног пароль. Кæд ай æндæр чидæр æрдомдта, кæнæ кæд дæ пароль æрхъуыды кодтай æмæ дæ нал фæды фæивай йæ, уæд дæ бон у мацæмæ дарай ацы фыстæг æмæ дарддæр архайай дæ зæронд паролæй.',
+'passwordreset-emailtext-user' => '{{grammar:genitive|{{SITENAME}}}} архайæг $1 æрдомдта дæ {{grammar:genitive|{{SITENAME}}}} ($4) аккаунты тыххæй детальтæ. Ацы архайæджы {{PLURAL:$3|аккаунт баст у|аккаунттæ баст сты}} ацы e-mail адрисимæ:
+
+$2
+
+{{PLURAL:$3|Ацы рæстæгмæ пароль|Ацы рæстæгмæ паролтæ}} кусдзысты {{PLURAL:$5|иу бон|$5 боны}}.
+Ныр ды хъуамæ бахизай системæмæ æмæ равзарай ног пароль. Кæд ай æндæр чидæр æрдомдта, кæнæ кæд дæ пароль æрхъуыды кодтай æмæ дæ нал фæды фæивай йæ, уæд дæ бон у мацæмæ дарай ацы фыстæг æмæ дарддæр архайай дæ зæронд паролæй.',
 'passwordreset-emailelement' => 'Фæсномыг: $1
 Рæстæгмæ пароль: $2',
+'passwordreset-emailsent' => 'Æрхъуыдыгæнæн e-mail æрвыст æрцыд',
+'passwordreset-emailsent-capture' => 'Æрхъуыдыгæнæн e-mail æрвыст æрцыд æмæ бындæр æвдыст у.',
+'passwordreset-emailerror-capture' => 'Æрхъуыдыгæнæн e-mail арæзт æрцыд æмæ бындæр æвдыст у. Фæлæ йæ арвитын нæ бантыстис: $1',
 
 # Special:ChangeEmail
+'changeemail' => 'E-mail адрис фæивын',
+'changeemail-header' => 'Аккаунты e-mail адрис фæивын',
+'changeemail-text' => 'Байдзаг кæн ацы формæ, цæмæй дæ e-mail адрис фæивай. Уый тыххæй дын хъæудзæн дæ пароль бафыссын.',
+'changeemail-no-info' => 'Ды хъуамæ системæмæ хызт уай, цæмæй ацы фарсмæ комкоммæ бавналай.',
+'changeemail-oldemail' => 'Нырыккон e-mail адрис:',
+'changeemail-newemail' => 'Ног e-mail адрис:',
+'changeemail-none' => '(нæй)',
+'changeemail-submit' => 'E-mail фæивын',
 'changeemail-cancel' => 'Ныууадзын',
 
 # Edit page toolbar
@@ -603,10 +691,53 @@ $2',
 'showdiff' => 'Иртасын',
 'anoneditwarning' => "'''Сындæггай:''' Ды системæйы нæ дæ.
 Дæ IP адрес фыст æрцæудзæнис фарсы историйы.",
+'anonpreviewwarning' => "''Ды системæмæ хызт нæ дæ. Бавæрд дын дæ IP адрис ныффысдзæн фарсы историйы.''",
+'missingsummary' => "'''Æрхъуыдыкæнинаг:''' Ды не рхастай ивды афыст.
+Кæд ногæй равзарай \"{{int:savearticle}}\", уæд ивд æнæ афыстæй бавæрд уыдзæнис.",
+'missingcommenttext' => 'Дæ хорзæхæй, дæлдæр комментари бафысс.',
+'missingcommentheader' => "'''Æрхъуыдыкæнинаг:''' Ды ацы комментарийæн не рхастай темæ/сæр.
+Кæд ногæй равзарай \"{{int:savearticle}}\", уæд ивд æнæ уымæй бавæрд уыдзæнис.",
 'summary-preview' => 'Ивд афыст уыдзæн:',
+'subject-preview' => 'Темæ/сæр:',
 'blockedtitle' => 'Архайæг хъодыгонд æрцыд',
+'blockedtext' => "'''Дæ фæсномыг кæнæ дæ IP адрис блокгонд æрцыд.'''
+
+Блок скодта $1.
+Йæ аххосаг у ''$2''.
+
+* Блокы райдиан: $8
+* Блокы кæрон: $6
+* Блокы мысан: $7
+
+Дæ бон у бадзурай {{grammar:allative|$1}} кæнæ [[{{MediaWiki:Grouppage-sysop}}|радгæсмæ]], цæмæй блокы тыххæй аныхас кæнай.
+Дæ бон нæу электронон фыстæг æм арвитай, цалынмæ дæ [[Special:Preferences|аккаунты фадæтты]] раст e-mail нæ бацамонай æмæ цалынмæ уымæй дæр нæ дæ блокгонд.
+Дæ нырыккон IP адрис у $3, æмæ блокы бæрæггæнæн у #$5.
+Дæ хорзæхæй, уæлдæр цы детальтæ ис, уыдон иу дæ домæнмæ бафтау.",
+'autoblockedtext' => "'''Дæ IP адрис йæхæдæг ныблок ис, уымæн æмæ ууылты архайдта æндæр архайæг, кæй ныблок кодта $1.'''
+Йæ аххосаг у:
+
+:''$2''
+
+* Блокы райдиан: $8
+* Блокы кæрон: $6
+* Блокы мысан: $7
+
+Дæ бон у бадзурай {{grammar:allative|$1}} кæнæ æндæр [[{{MediaWiki:Grouppage-sysop}}|радгæсмæ]], цæмæй блокы тыххæй аныхас кæнай.
+
+Дæ бон нæу электронон фыстæг æм арвитай, цалынмæ дæ [[Special:Preferences|аккаунты фадæтты]] раст e-mail нæ бацамонай æмæ цалынмæ уымæй дæр нæ дæ блокгонд.
+
+Дæ нырыккон IP адрис у $3, æмæ блокы бæрæггæнæн у #$5.
+Дæ хорзæхæй, уæлдæр цы детальтæ ис, уыдон иу дæ домæнмæ бафтау.",
 'blockednoreason' => 'аххос амынд не ’рцыд',
+'whitelistedittext' => 'Дæуæн хъæуы $1, цæмæй фæртæ ивай.',
+'confirmedittext' => 'Фæрстæ ивыны размæ ды хъуамæ сбæлвырд кæнай дæ e-mail адрис.
+Дæ хæрзæхæй, сæвæр æмæ сбæлвырд кæн дæ e-mail адрис дæ [[Special:Preferences|фадæтты]].',
+'nosuchsectiontitle' => 'Хай нæ уард кæны',
+'nosuchsectiontext' => 'Ды фæлвардтай ахæм фарс ивын, кæцы нæй.
+Гæнæн ис, цалынмæ ды фарс кастæ, уый хаст кæнæ хафт æрцыдис.',
 'loginreqtitle' => 'Хъæуы бахизын',
+'loginreqlink' => 'бахизын',
+'loginreqpagetext' => 'Дæуæн хъæуы $1 цæмæй æндæр фæрстæ кæсай.',
 'accmailtitle' => 'Пароль рарвыст у.',
 'newarticle' => '(Ног)',
 'newarticletext' => 'Ды ныххæцыдтæ ахæм æрвитæныл, кæй фарс нырмæ нæй.
@@ -758,7 +889,7 @@ $2',
 'prefs-edits' => 'Ивдтыты нымæц:',
 'prefsnologin' => 'Системæйæн дæхи нæ бацамыдтай',
 'changepassword' => 'Пароль ивæн',
-'prefs-skin' => 'ФæлÑ\8bÑ\81Ñ\82',
+'prefs-skin' => 'ЦÑ\8aаÑ\80',
 'skin-preview' => 'Разæркаст',
 'prefs-beta' => 'Бета фадæттæ',
 'prefs-datetime' => 'Датæ æмæ рæстæг',
@@ -1417,7 +1548,7 @@ $3',
 
 # Special:Version
 'version' => 'Фæлтæр',
-'version-skins' => 'ФæлÑ\8bÑ\81Ñ\82',
+'version-skins' => 'ЦÑ\8aаÑ\80',
 'version-other' => 'Æндæр',
 'version-version' => '(Фæлтæр $1)',
 'version-license' => 'Лицензи',
@@ -1464,4 +1595,30 @@ $3',
 'feedback-message' => 'Фыстæг:',
 'feedback-close' => 'Æххæст',
 
+# API errors
+'api-error-noimageinfo' => 'Æвгæд æххæст у, фæлæ нын сервер ницыуал рабæрæг кодта файлы тыххæй.',
+'api-error-nomodule' => 'Мидæггаг рæдыд: Бавгæнæн модуль нæу æвæрд.',
+'api-error-ok-but-empty' => 'Мидæггаг рæдыд: Серверæй дзуапп нæй.',
+'api-error-overwrite' => 'Уæвгæ файл ногæй фыссын нæй гæнæн.',
+'api-error-stashfailed' => 'Мидæггаг рæдыд: Серверæн нæ рауадис рæстæгмæ файл фæдарын.',
+'api-error-timeout' => 'Сервер нæ радта дзуапп бадзырд рæстæгмæ.',
+'api-error-unclassified' => 'Нæзонгæ рæдыд æрцыд.',
+'api-error-unknown-code' => 'Нæзонгæ рæдыд: "$1".',
+'api-error-unknown-error' => 'Мидæггаг рæдыд: Цыдæр раст нæ ацыдис, файл куы æвгæдтай, уæд.',
+'api-error-unknown-warning' => 'Нæзонгæ фæдзæхст: "$1".',
+'api-error-unknownerror' => 'Нæзонгæ рæдыд: "$1".',
+'api-error-uploaddisabled' => 'Ацы викийы бавгæныны фадат хицæн у.',
+'api-error-verification-error' => 'Ацы файл гæнæн ис хæлд у, кæнæ йæ номы фæстаг хай раст нæу.',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|секунд|секунды}}',
+'duration-minutes' => '$1 {{PLURAL:$1|минут|минуты}}',
+'duration-hours' => '$1 {{PLURAL:$1|сахат|сахаты}}',
+'duration-days' => '$1 {{PLURAL:$1|бон|боны}}',
+'duration-weeks' => '$1 {{PLURAL:$1|къуыри|къуырийы}}',
+'duration-years' => '$1 {{PLURAL:$1|аз|азы}}',
+'duration-decades' => '$1 {{PLURAL:$1|дæсадз|дæсадзы}}',
+'duration-centuries' => '$1 {{PLURAL:$1|æнус|æнусы}}',
+'duration-millennia' => '$1 {{PLURAL:$1|мин аз|мин азы}}',
+
 );
index f29fb29..b192f98 100644 (file)
  * @author Kaganer
  * @author Sukh
  * @author Surinder.wadhawan
+ * @author TariButtar
  * @author Ævar Arnfjörð Bjarmason
  * @author לערי ריינהארט
  */
 
 $namespaceNames = array(
        NS_MEDIA            => 'ਮੀਡੀਆ',
-       NS_SPECIAL          => 'ਖਾਸ',
-       NS_TALK             => 'à¨\9aਰà¨\9aਾ',
-       NS_USER             => 'ਮà©\88à¨\82ਬਰ',
-       NS_USER_TALK        => 'ਮà©\88à¨\82ਬਰ_à¨\9aਰà¨\9aਾ',
-       NS_PROJECT_TALK     => '$1_à¨\9aਰà¨\9aਾ',
+       NS_SPECIAL          => 'à¨\96਼ਾਸ',
+       NS_TALK             => 'à¨\97ੱਲ-ਬਾਤ',
+       NS_USER             => 'ਵਰਤà©\8cà¨\82à¨\95ਾਰ',
+       NS_USER_TALK        => 'ਵਰਤà©\8cà¨\82à¨\95ਾਰ_à¨\97ੱਲ-ਬਾਤ',
+       NS_PROJECT_TALK     => '$1_à¨\97ੱਲ-ਬਾਤ',
        NS_FILE             => 'ਤਸਵੀਰ',
-       NS_FILE_TALK        => 'ਤਸਵà©\80ਰ_à¨\9aਰà¨\9aਾ',
-       NS_MEDIAWIKI        => 'ਮà©\80ਡà©\80à¨\86ਵਿà¨\95ਿ',
-       NS_MEDIAWIKI_TALK   => 'ਮà©\80ਡà©\80à¨\86ਵਿà¨\95ਿ_à¨\9aਰà¨\9aਾ',
-       NS_TEMPLATE         => 'ਨਮà©\82ਨਾ',
-       NS_TEMPLATE_TALK    => 'ਨਮà©\82ਨਾ_à¨\9aਰà¨\9aਾ',
+       NS_FILE_TALK        => 'ਤਸਵà©\80ਰ_à¨\97ੱਲ-ਬਾਤ',
+       NS_MEDIAWIKI        => 'ਮà©\80ਡà©\80à¨\86ਵਿà¨\95à©\80',
+       NS_MEDIAWIKI_TALK   => 'ਮà©\80ਡà©\80à¨\86ਵਿà¨\95à©\80_à¨\97ੱਲ-ਬਾਤ',
+       NS_TEMPLATE         => 'ਫਰਮਾ',
+       NS_TEMPLATE_TALK    => 'ਫਰਮਾ_à¨\97ੱਲ-ਬਾਤ',
        NS_HELP             => 'ਮਦਦ',
-       NS_HELP_TALK        => 'ਮਦਦ_à¨\9aਰà¨\9aਾ',
+       NS_HELP_TALK        => 'ਮਦਦ_à¨\97ੱਲ-ਬਾਤ',
        NS_CATEGORY         => 'ਸ਼੍ਰੇਣੀ',
-       NS_CATEGORY_TALK    => 'ਸ਼੍ਰੇਣੀ_ਚਰਚਾ',
+       NS_CATEGORY_TALK    => 'ਸ਼੍ਰੇਣੀ_ਗੱਲ-ਬਾਤ',
+);
+
+$namespaceAliases = array(
+       'ਖਾਸ' => NS_SPECIAL,
+       'ਚਰਚਾ' => NS_TALK,
+       'ਮੈਂਬਰ' => NS_USER,
+       'ਮੈਂਬਰ_ਚਰਚਾ' => NS_USER_TALK,
+       '$1_ਚਰਚਾ' => NS_PROJECT_TALK,
+       'ਤਸਵੀਰ_ਚਰਚਾ' => NS_FILE_TALK,
+       'ਮੀਡੀਆਵਿਕਿ' => NS_MEDIAWIKI,
+       'ਮੀਡੀਆਵਿਕਿ_ਚਰਚਾ' => NS_MEDIAWIKI_TALK,
+       'ਨਮੂਨਾ' => NS_TEMPLATE,
+       'ਨਮੂਨਾ_ਚਰਚਾ' => NS_TEMPLATE_TALK,
+       'ਮਦਦ_ਚਰਚਾ' => NS_HELP_TALK,
+       'ਸ਼੍ਰੇਣੀ_ਚਰਚਾ' => NS_CATEGORY_TALK,
+);
+
+$specialPageAliases = array(
+       'Activeusers'               => array( 'ਸਰਗਰਮ_ਵਰਤੌਂਕਾਰ' ),
+       'Blankpage'                 => array( 'ਖਾਲੀ_ਸਫ਼ਾ' ),
+       'Block'                     => array( 'ਪਾਬੰਦੀ_ਲਾਉਣਾ', 'ਪਾਬੰਦੀ_ਸ਼ੁਦਾ_ਆਈ_ਪੀ', 'ਪਾਬੰਦੀ_ਸ਼ੁਦਾ_ਵਰਤੌਂਕਾਰ' ),
+       'Listusers'                 => array( 'ਵਰਤੌਂਕਾਰਾਂ_ਦੀ_ਸੂਚੀ' ),
 );
 
 $digitTransformTable = array(
@@ -63,30 +86,63 @@ $messages = array(
 'tog-hidepatrolled' => 'ਮੌਨਜੁਦਾ ਬਦਲਾਬ ਮੈ ਸੈ ਸਹੀਤਕ ਬਦਲਾਬ ਕੌ ਛੁਪਾ ਕਰ ਰਖੇ.',
 'tog-newpageshidepatrolled' => 'ਨਵੀ ਸੁਚੀ ਮੈ ਸੈ ਗਸ਼ਤ ਪਰਚੇ ਕੌ ਛੁਪਾਏ.',
 'tog-extendwatchlist' => 'ਸਾਰੀ ਨਵੀ ਤਬਦੀਲੀਆ ਹੀ ਨਹੀ ,ਪੂਰਾਣੀ ਤਬਦੀਲੀਆ ਨੂੰ ਵੀ ਨਵੀ ਸੂਚੀ ਵਿਚ ਵਧਾ ਕੈ ਸ਼ਾਮੀਲ ਕਰੌ.',
-'tog-usenewrc' => 'ਸà©\81ਦਾਰ à¨\95à©\80ਤà©\87 à¨¹à©\8cà¨\82à¨\82à¨\9eà©\87 à¨°à©\82à¨\9aà©\80 à¨¦à©\80  à¨µà¨°à¨¤à©\8c à¨\95ਰà©\8c (à¨\9cਰà©\82ਰਤ à¨¹à©\88 à¨\9cਾਵਾ à¨¸à¨\95à©\8dਰਿਪà©\8dà¨\9f à¨\95à©\80)',
+'tog-usenewrc' => 'ਤਾà¨\9c਼ਾ à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨\85ਤà©\87 à¨¨à¨¿à¨\97ਰਾਨà©\80 à¨²à¨¿à¨¸à¨\9f à¨µà¨¿à¨\9a à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨¸à¨«à¨¼à©\87 à¨®à©\81ਤਾਬà¨\95 (à¨\9cਾਵਾ à¨¸à¨\95à©\8dਰਿਪà¨\9f à¨²à©\8bà©\9cà©\80à¨\82ਦà©\80 à¨¹à©\88)',
 'tog-numberheadings' => 'ਆਟੋ-ਨੰਬਰ ਹੈਡਿੰਗ',
 'tog-showtoolbar' => 'ਐਡਿਟ ਟੂਲਬਾਰ ਵੇਖੋ (JavaScript)',
+'tog-editondblclick' => 'ਦੋਹਰੇ ਕਲਿੱਕ ਨਾਲ਼ ਸਫ਼ਾ ਸੋਧੋ (ਜਾਵਾ ਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
+'tog-editsection' => '[ਸੋਧੋ] ਲਿੰਕਾਂ ਜ਼ਰੀਏ ਸੈਕਸ਼ਨ ਸੋਧ ਯੋਗ ਕਰੋ',
+'tog-editsectiononrightclick' => 'ਸੈਕਸ਼ਨ ਸਿਰਲੇਖਾਂ ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਦੁਆਰਾ ਸੋਧ ਯੋਗ ਕਰੋ (ਜਾਵਾ ਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
 'tog-showtoc' => 'ਟੇਬਲ ਆਫ਼ ਕੰਨਟੈੱਟ ਵੇਖਾਓ (for pages with more than 3 headings)',
 'tog-rememberpassword' => 'ਇਸ ਬਰਾਊਜ਼ਰ ਉੱਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ ($1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ)',
-'tog-watchcreations' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨¬à¨£à¨¾à¨\8f à¨\97à¨\8f à¨¨à¨µà©\87à¨\82 à¨¸à¨«à¨¼à©\87 à¨®à©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
-'tog-watchdefault' => 'à¨\9cà©\8b à¨¸à¨«à¨¼à©\87 à¨®à©\88à¨\82 à¨¸à©\8bਧਦਾ à¨¹à¨¾à¨\82, à¨\93ਹ à¨ªà©\87à¨\9c à¨®à©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
-'tog-watchmoves' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨­à©\87à¨\9cà©\87 à¨\95ਿਤà©\87 à¨¸à¨«à¨¼à©\87 à¨¨à©\82à©° à¨®à©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
+'tog-watchcreations' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨¬à¨£à¨¾à¨\8f à¨\97à¨\8f à¨¨à¨µà©\87à¨\82 à¨¸à¨«à¨¼à©\87 à¨\85ਤà©\87 à¨\85ੱਪਲà©\8bਡ à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
+'tog-watchdefault' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¸à©\8bਧà©\87 à¨¸à¨«à¨¼à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
+'tog-watchmoves' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¬à¨¦à¨²à©\87 à¨¸à¨¿à¨°à¨²à©\87à¨\96ਾà¨\82 à¨µà¨¾à¨²à¨¼à©\87 à¨¸à¨«à¨¼à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
 'tog-watchdeletion' => 'ਮੇਰੇ ਵਲੋਂ ਹਟਾਏ ਗਏ ਸਫ਼ੇ ਮੇਰੀ ਵਾਚ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
+'tog-minordefault' => 'ਸਾਰੀਆਂ ਸੋਧਾਂ ਤੇ ਮੂਲ ਰੂਪ ਵਿਚ ਛੋਟੀਆਂ ਹੋਣ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ',
 'tog-previewontop' => 'ਐਡਿਟ ਬਕਸੇ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵੇਖਾਓ',
 'tog-previewonfirst' => 'ਪਹਿਲੇ ਐਡਿਟ ਉੱਤੇ ਝਲਕ ਵੇਖਾਓ',
 'tog-nocache' => 'ਬਰਾਊਜ਼ਰ ਸਫ਼ਾ ਕੈਸ਼ ਕਰਨਾ ਬੰਦ ਕਰੋ',
-'tog-enotifwatchlistpages' => 'ਜਦੋਂ ਮੇਰੀ ਵਾਚ-ਲਿਸਟ ਵਿੱਚੋਂ ਸਫ਼ਾ ਬਦਲਿਆ ਜਾਵੇ ਤਾਂ ਮੈਨੂੰ ਈਮੇਲ ਭੇਜੋ',
+'tog-enotifwatchlistpages' => 'ਜਦੋਂ ਮੇਰੀ ਵਾਚ-ਲਿਸਟ ਵਿਚ ਦਰਜ ਕੋਈ ਸਫ਼ਾ ਬਦਲਿਆ ਜਾਵੇ ਯਾ ਮਿਸਲ ਬਦਲੀ ਜਾਵੇ ਤਾਂ ਮੈਨੂੰ ਈਮੇਲ ਭੇਜੋ',
+'tog-enotifusertalkpages' => 'ਜਦੋਂ ਮੇਰਾ ਗੱਲ-ਬਾਤ ਸਫ਼ਾ ਬਦਲਿਆ ਜਾਵੇ ਤਾਂ ਮੈਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
+'tog-enotifminoredits' => 'ਸਫ਼ਿਆਂ ਅਤੇ ਫ਼ਾਈਲਾਂ ਦੀਆਂ ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ ਲਈ ਵੀ ਮੈਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
+'tog-enotifrevealaddr' => 'ਜਾਣੂ ਕਰਵਾਉਣ ਵਾਲ਼ੀਆਂ ਈ-ਮੇਲਾਂ ਵਿਚ ਮੇਰਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਕਰੋ',
+'tog-shownumberswatching' => 'ਨਜ਼ਰ ਰੱਖ ਰਹੇ ਮੈਂਬਰਾਂ ਦੀ ਗਿਣਤੀ ਵਖਾਓ',
 'tog-oldsig' => 'ਮੌਜੂਦਾ ਦਸਤਖਤ:',
+'tog-fancysig' => 'ਦਸਤਖ਼ਤ ਨੂੰ ਵਿਕੀਲਿਖਤ ਦੇ ਤੌਰ ਤੇ ਵਰਤੋ (ਬਿਨਾਂ ਆਟੋਮੈਟਿਕ ਲਿੰਕ)',
+'tog-externaleditor' => 'ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਬਾਹਰੀ ਸੋਧਕ ਵਰਤੋ (ਸਿਰਫ਼ ਮਾਹਿਰਾਂ ਲਈ ਹੈ, ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਤੇ ਖ਼ਾਸ ਸੈਟਿੰਗਾਂ ਲੋੜੀਂਦੀਆਂ ਹਨ। [//
+www.mediawiki.org/wiki/
+Manual:External_editors More
+information.])',
+'tog-externaldiff' => 'ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਬਾਹਰੀ ਫ਼ਰਕ ਵਰਤੋ (ਸਿਰਫ਼
+ਮਾਹਿਰਾਂ ਲਈ ਹੈ, ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਤੇ ਖ਼ਾਸ
+ਸੈਟਿੰਗਾਂ ਲੋੜੀਂਦੀਆਂ ਹਨ। [//
+www.mediawiki.org/wiki/
+Manual:External_editors More
+information.])',
+'tog-showjumplinks' => '"ਇਸ ਤੇ ਜਾਓ" ਦੇ ਲਿੰਕ ਦਿਖਾਣਾ ਸਮਰੱਥ ਕਰੋ',
+'tog-uselivepreview' => 'ਸਿੱਧੀ ਝਲਕ ਵਰਤੋ (ਜਾਵਾਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ) (ਤਜਰਬੇਕਾਰੀ)',
+'tog-forceeditsummary' => 'ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦਾਖ਼ਲ ਕਰਾਂ ਤਾਂ ਮੈਨੂੰ ਖ਼ਬਰਦਾਰ ਕਰੋ',
 'tog-watchlisthideown' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ ਵਿੱਚੋਂ ਮੇਰੀਆਂ ਸੋਧਾਂ ਹਟਾਓ',
 'tog-watchlisthidebots' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ ਵਿੱਚੋਂ ਰੋਬਾਟ ਦਿਆਂ ਸੋਧਾਂ ਹਟਾਓ',
 'tog-watchlisthideminor' => 'ਛੋਟੇ ਸੋਧ ਵਾਚ-ਲਿਸਟ ਤੋਂ ਓਹਲੇ ਰੱਖੋ',
+'tog-watchlisthideliu' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਲਾਗ ਇਨ ਕੀਤੇ ਮੈਂਬਰਾਂ ਦੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ',
+'tog-watchlisthideanons' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਗੁਮਨਾਮ ਮੈਂਬਰਾਂ ਦੀਆਂ ਕੀਤੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ',
+'tog-watchlisthidepatrolled' => 'ਵੇਖੀਆਂ ਜਾ ਚੁੱਕੀਆਂ ਸੋਧਾਂ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਲੁਕਾਓ',
+'tog-ccmeonemails' => 'ਜੋ ਈ-ਮੇਲਾਂ ਮੈਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਭੇਜਦਾ ਹਾਂ ਓਹਨਾਂ ਦੀਆਂ ਨਕਲਾਂ ਮੈਨੂੰ ਭੇਜੋ',
+'tog-diffonly' => 'ਫ਼ਰਕਾਂ ਤੋਂ ਹੇਠ ਸਫ਼ੇ ਦੀ ਸਮੱਗਰੀ ਨਾ ਵਖਾਓ',
+'tog-showhiddencats' => 'ਲੁਕੀਆਂ ਸ਼੍ਰੇਣੀਆਂ ਵਖਾਓ',
+'tog-norollbackdiff' => '"ਵਾਪਸ ਮੋੜੌ"ਅਮਲ ਵਿਚ ਲਿਆਣ ਬਾਦ ਫ਼ਰਕ ਨਾ ਦਿਖਾਓ',
 
 'underline-always' => 'ਹਮੇਸ਼ਾਂ',
 'underline-never' => 'ਕਦੇ ਨਹੀਂ',
 'underline-default' => 'ਬਰਾਊਜ਼ਰ ਡਿਫਾਲਟ',
 
 # Font style option in Special:Preferences
+'editfont-style' => 'ਸੰਪਾਦਨ ਖੇਤਰ ਦੇ ਅੱਖਰਾਂ ਦੀ ਫ਼ੌਂਟ ਰੀਤੀ',
 'editfont-default' => 'ਬਰਾਊਜ਼ਰ ਡਿਫਾਲਟ',
+'editfont-monospace' => 'ਇੱਕੋ ਜਿਹੀ ਖ਼ਾਲੀ ਥਾਂ ਵਾਲ਼ਾ ਅੱਖਰ',
+'editfont-sansserif' => 'Sans-serif ਨਾਂ ਦਾ ਫ਼ੌਂਟ',
+'editfont-serif' => 'ਨੋਕਦਾਰ ਅੱਖਰ',
 
 # Dates
 'sunday' => 'ਐਤਵਾਰ',
@@ -95,14 +151,14 @@ $messages = array(
 'wednesday' => 'ਬੁੱਧਵਾਰ',
 'thursday' => 'ਵੀਰਵਾਰ',
 'friday' => 'ਸ਼ੁੱਕਰਵਾਰ',
-'saturday' => 'ਸ਼ਨਿੱà¨\9aਰਵਾਰ',
+'saturday' => 'ਸ਼ਨà©\80ਵਾਰ',
 'sun' => 'ਐਤ',
 'mon' => 'ਸੋਮ',
 'tue' => 'ਮੰਗਲ',
 'wed' => 'ਬੁੱਧ',
 'thu' => 'ਵੀਰ',
 'fri' => 'ਸ਼ੁੱਕਰ',
-'sat' => 'ਸ਼ਨਿੱà¨\9aਰ',
+'sat' => 'ਸ਼ਨà©\80',
 'january' => 'ਜਨਵਰੀ',
 'february' => 'ਫ਼ਰਵਰੀ',
 'march' => 'ਮਾਰਚ',
@@ -111,10 +167,10 @@ $messages = array(
 'june' => 'ਜੂਨ',
 'july' => 'ਜੁਲਾਈ',
 'august' => 'ਅਗਸਤ',
-'september' => 'ਸਤੰਬਰ',
+'september' => 'ਸਿਤੰਬਰ',
 'october' => 'ਅਕਤੂਬਰ',
 'november' => 'ਨਵੰਬਰ',
-'december' => 'ਦਸੰਬਰ',
+'december' => 'ਦਿਸੰਬਰ',
 'january-gen' => 'ਜਨਵਰੀ',
 'february-gen' => 'ਫ਼ਰਵਰੀ',
 'march-gen' => 'ਮਾਰਚ',
@@ -123,44 +179,51 @@ $messages = array(
 'june-gen' => 'ਜੂਨ',
 'july-gen' => 'ਜੁਲਾਈ',
 'august-gen' => 'ਅਗਸਤ',
-'september-gen' => 'ਸਤੰਬਰ',
+'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' => 'ਦਸੰ',
+'aug' => 'ਅਗਸਤ',
+'sep' => 'ਸਿਤੰਬਰ',
+'oct' => 'ਅਕਤੂਬਰ',
+'nov' => 'ਨਵੰਬਰ',
+'dec' => 'ਦਿਸੰਬਰ',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ਕੈਟਾਗਰੀ|ਕੈਟਾਗਰੀਆਂ}}',
 'category_header' => 'ਕੈਟਾਗਰੀ "$1" ਵਿੱਚ ਲੇਖ',
 'subcategories' => 'ਸਬ-ਕੈਟਾਗਰੀਆਂ',
-'category-media-header' => 'ਕੈਟਾਗਰੀ "$1" ਵਿੱਚ ਮੀਡਿਆ',
-'category-empty' => "''ਇਹ ਕੈਟਾਗਰੀ ਵਿੱਚ ਇਸ ਵੇਲੇ ਕੋਈ ਲੇਖ (ਆਰਟੀਕਲ) ਜਾਂ ਮੀਡਿਆ ਨਹੀਂ ਹੈ।''",
-'hidden-categories' => '{{PLURAL:$1|ਅਲੋਪ ਸ਼੍ਰੇਣੀ|ਅਲੋਪ ਸ਼੍ਰੇਣੀਆ}}',
-'category-subcat-count' => '{{ਕੁਲ   $2 ਸ਼੍ਰੇਣੀਆਂ ਵਿਚੌਂ , PLURAL:$2|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼ ਹੇਠ ਲਿਖੀ ਸ਼੍ਰੇਣੀ ਹੈ|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਨਿਮਿਨਲਿਖਿਤ {{PLURAL:$1|ਉਪ ਸ਼੍ਰੇਣੀ ਹੈ|$1ਉਪਸ਼੍ਰੇਣੀਆਂ ਹਨ}}  }}',
-'category-article-count' => '{{ ਕੁਲ $2 ਲੇਖਾਂ ਵਿਚੌਂ , PLURAL:$2| ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼  ਨਿਮਨਲਿਖਿਤ  {{PLURAL:$1|ਲੇਖ ਹੈ|$1 ਲੇਖ ਹਨ}}, }}',
-'listingcontinuesabbrev' => 'ਅਗੇ.',
+'category-media-header' => 'ਕੈਟਾਗਰੀ "$1" ਵਿੱਚ ਮੀਡੀਆ',
+'category-empty' => "''ਇਸ ਕੈਟਾਗਰੀ ਵਿੱਚ ਇਸ ਵੇਲ਼ੇ ਕੋਈ ਵੀ ਲੇਖ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ ਹੈ।''",
+'hidden-categories' => '{{PLURAL:$1|ਲੁਕੀਵੀਂ ਸ਼੍ਰੇਣੀ|ਲੁਕਵੀਂਆਂ ਸ਼੍ਰੇਣੀਆਂ}}',
+'hidden-category-category' => 'ਲੁਕੀਆਂ ਸ਼੍ਰੇਣੀਆਂ',
+'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 ਸਫ਼ੇ}} ਹਨ}}',
+'category-article-count-limited' => 'ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਇਹ {{PLURAL:$1|ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ।}}',
+'category-file-count' => '{{PLURAL:$2|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਸਿਰਫ਼ ਇਹ ਫ਼ਾਈਲ ਹੈ।| ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ {{PLURAL:$1|ਫ਼ਾਈਲ ਹੈ|$1 ਫ਼ਾਈਲਾਂ ਹਨ।}}}}',
+'category-file-count-limited' => 'ਇਸ ਸ਼੍ਰੇਣੀ ਵਿਚ ਇਹ {{PLURAL:$1|ਫ਼ਾਈਲ ਹੈ|$1 ਫ਼ਾਈਲਾਂ ਹਨ।}}',
+'listingcontinuesabbrev' => 'ਜਾਰੀ',
+'index-category' => 'ਤਤਕਰੇ ਵਾਲ਼ੇ ਸਫ਼ੇ',
 'noindex-category' => 'ਕ੍ਰਮਸੂਚੀ ਰਹਿਤ ਸਫ਼ੇ',
+'broken-file-category' => 'ਟੁੱਟੇ ਹੋਏ ਫ਼ਾਈਲ ਜੋੜਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ',
 
 'about' => 'ਇਸ ਬਾਰੇ',
 'article' => 'ਸਮੱਗਰੀ ਪੇਜ',
-'newwindow' => '(ਨਵà©\80à¨\82 à¨µà¨¿à©°à¨¡à©\8b à¨µà¨¿à©±à¨\9a à¨\96à©\8bਲà©\8dਹà©\8b)',
+'newwindow' => '(ਨਵà©\80à¨\82 à¨µà¨¿à©°à¨¡à©\8b à¨µà¨¿à©±à¨\9a à¨\96à©\81ੱਲà©\8dਹਦà©\80 à¨¹à©\88)',
 'cancel' => 'ਰੱਦ ਕਰੋ',
 'moredotdotdot' => 'ਹੋਰ...',
 'mypage' => 'ਮੇਰਾ ਪੇਜ',
 'mytalk' => 'ਮੇਰੀ ਗੱਲਬਾਤ',
 'anontalk' => 'ਇਹ IP ਲਈ ਗੱਲਬਾਤ',
-'navigation' => 'ਨà©\87ਵà©\80à¨\97à©\87ਸ਼ਨ',
+'navigation' => 'ਰਹਿਨà©\81ਮਾà¨\88',
 'and' => '&#32;ਅਤੇ',
 
 # Cologne Blue skin
@@ -171,37 +234,38 @@ $messages = array(
 'qbpageinfo' => 'ਭਾਗ',
 'qbmyoptions' => 'ਮੇਰੇ ਪੇਜ',
 'qbspecialpages' => 'ਖਾਸ ਪੇਜ',
-'faq' => 'ਸਵਾਲ-à¨\9cਵਾਬ',
+'faq' => 'à¨\85à¨\95ਸਰ à¨ªà©\81ੱà¨\9bà©\87 à¨\9cਾਣ à¨µà¨¾à¨²à¨¼à©\87 à¨¸à¨µà¨¾à¨²',
 'faqpage' => 'Project:ਸਵਾਲ-ਜਵਾਬ',
 
 # Vector skin
 'vector-action-addsection' => 'ਮਜ਼ਮੂਨ ਜੋੜੋ',
-'vector-action-delete' => 'ਹਟਾਓ',
+'vector-action-delete' => 'ਮਿਟਾਓ',
 'vector-action-move' => 'ਭੇਜੋ',
-'vector-action-protect' => 'ਸੁਰੱਖਿਅਤ',
+'vector-action-protect' => 'ਸੁਰੱਖਿਅਤ ਬਣਾਓ',
 'vector-action-undelete' => 'ਹਟਾਉਣਾ ਵਾਪਸ',
 'vector-action-unprotect' => 'ਸੁਰੱਖਿਆ ਬਦਲੋ',
+'vector-simplesearch-preference' => 'ਵਾਧੂ ਖੋਜ ਸਲਾਹਾਂ ਯੋਗ ਕਰੋ (ਸਿਰਫ਼ ਵਿਕਟਰ ਸਕਿੰਨ ਵਿਚ)',
 'vector-view-create' => 'ਬਣਾਓ',
 'vector-view-edit' => 'ਸੋਧ',
 'vector-view-history' => 'ਅਤੀਤ ਵੇਖੋ',
 'vector-view-view' => 'ਪੜ੍ਹੋ',
 'vector-view-viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
-'actions' => 'ਕਾਰਵਾਈ',
-'namespaces' => 'ਨਾà¨\82-ਥਾà¨\82:',
+'actions' => 'ਕਾਰਵਾਈਆਂ',
+'namespaces' => 'ਨਾਮ-ਥਾà¨\82ਵਾà¨\82',
 'variants' => 'ਬਦਲ',
 
-'errorpagetitle' => 'ਗਲਤੀ',
-'returnto' => '$1 ਤੇ ਵਾਪਸ ਜਾਓ',
+'errorpagetitle' => 'à¨\97਼ਲਤà©\80',
+'returnto' => '$1 ’ਤੇ ਵਾਪਸ ਜਾਓ।',
 'tagline' => '{{SITENAME}} ਤੋਂ',
-'help' => 'ਮੱਦਦ',
-'search' => 'ਖੋਜ',
-'searchbutton' => 'ਖੋਜ',
+'help' => 'ਮਦਦ',
+'search' => 'ਖੋਜ',
+'searchbutton' => 'ਖੋਜ',
 'go' => 'ਜਾਓ',
 'searcharticle' => 'ਜਾਓ',
-'history' => 'ਸਫ਼ਾ ਅਤੀਤ',
+'history' => 'ਸਫ਼à©\87 à¨¦à¨¾ à¨\85ਤà©\80ਤ',
 'history_short' => 'ਅਤੀਤ',
 'updatedmarker' => 'ਮੇਰੇ ਆਖਰੀ ਖੋਲ੍ਹਣ ਬਾਦ ਅੱਪਡੇਟ',
-'printableversion' => 'ਪਰਿੰà¨\9fਯੋਗ ਵਰਜਨ',
+'printableversion' => 'à¨\9bਪਣਯੋਗ ਵਰਜਨ',
 'permalink' => 'ਪੱਕਾ ਲਿੰਕ',
 'print' => 'ਪਰਿੰਟ ਕਰੋ',
 'view' => 'ਵੇਖੋ',
@@ -209,24 +273,25 @@ $messages = array(
 'create' => 'ਬਣਾਓ',
 'editthispage' => 'ਇਹ ਪੇਜ ਸੋਧੋ',
 'create-this-page' => 'ਇਹ ਸਫ਼ਾ ਬਣਾਓ',
-'delete' => 'ਹਟਾਓ',
+'delete' => 'ਮਿਟਾਓ',
 'deletethispage' => 'ਇਹ ਪੇਜ ਹਟਾਓ',
 'undelete_short' => 'ਅਣ-ਹਟਾਓ {{PLURAL:$1|one edit|$1 edits}}',
+'viewdeleted_short' => '{{PLURAL:$1|ਇਕ ਮਿਟਾਈ ਸੋਧ|$1 ਮਿਟਾਈਆਂ ਸੋਧਾਂ}} ਵੇਖੋ',
 'protect' => 'ਸੁਰੱਖਿਆ',
-'protect_change' => 'ਬਦਲà©\8b',
+'protect_change' => 'ਤਬਦà©\80ਲà©\80',
 'protectthispage' => 'ਇਹ ਪੇਜ ਸੁਰੱਖਿਅਤ ਕਰੋ',
 'unprotect' => 'ਸੁਰੱਖਿਆ ਬਦਲੋ',
 'unprotectthispage' => 'ਇਹ ਪੇਜ਼ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ',
-'newpage' => 'ਨਵਾà¨\82 à¨ªà©\87à¨\9c',
+'newpage' => 'ਨਵਾà¨\82 à¨¸à¨«à¨¼à¨¾',
 'talkpage' => 'ਇਸ ਪੇਜ ਬਾਰੇ ਚਰਚਾ',
 'talkpagelinktext' => 'ਗੱਲਬਾਤ',
 'specialpage' => 'ਖਾਸ ਪੇਜ',
-'personaltools' => 'ਨਿੱà¨\9cà©\80 à¨\9fà©\82ਲ',
+'personaltools' => 'ਨਿੱà¨\9cà©\80 à¨¸à©°à¨¦',
 'postcomment' => 'ਨਵਾਂ ਭਾਗ',
 'articlepage' => 'ਸਮੱਗਰੀ ਪੇਜ ਵੇਖੋ',
 'talk' => 'ਚਰਚਾ',
 'views' => 'ਵੇਖੋ',
-'toolbox' => 'à¨\9fà©\82ਲਬਾà¨\95ਸ',
+'toolbox' => 'ਸੰਦ à¨¬à¨\95ਸਾ',
 'userpage' => 'ਯੂਜ਼ਰ ਪੇਜ ਵੇਖੋ',
 'projectpage' => 'ਪਰੋਜੈਕਟ ਪੇਜ ਵੇਖੋ',
 'imagepage' => 'ਫਾਇਲ ਪੇਜ ਵੇਖੋ',
@@ -235,15 +300,21 @@ $messages = array(
 'viewhelppage' => 'ਮੱਦਦ ਪੇਜ ਵੇਖੋ',
 'categorypage' => 'ਕੈਟਾਗਰੀ ਪੇਜ ਵੇਖੋ',
 'viewtalkpage' => 'ਚਰਚਾ ਵੇਖੋ',
-'otherlanguages' => 'ਹà©\8bਰ à¨­à¨¾à¨¸à¨¼à¨¾à¨µà¨¾à¨\82 à¨µà¨¿à©±ਚ',
+'otherlanguages' => 'ਹà©\8bਰ à¨\9c਼ਬਾਨਾà¨\82 à¨µà¨¿ਚ',
 'redirectedfrom' => '($1 ਤੋਂ ਰੀ-ਡਿਰੈਕਟ)',
 'redirectpagesub' => 'ਰੀ-ਡਿਰੈਕਟ ਪੇਜ',
-'lastmodifiedat' => 'à¨\87ਹ à¨ªà©\87à¨\9c à¨\86à¨\96ਰà©\80 à¨µà¨¾à¨° $2, $1 à¨¨à©\82à©° ਸੋਧਿਆ ਗਿਆ ਸੀ।',
+'lastmodifiedat' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨\86à¨\96਼ਰà©\80 à¨µà¨¾à¨° $1 à¨¨à©\82à©° $2 â\80\99ਤà©\87 ਸੋਧਿਆ ਗਿਆ ਸੀ।',
 'viewcount' => 'ਇਹ ਪੇਜ ਅਸੈੱਸ ਕੀਤਾ ਗਿਆ {{PLURAL:$1|ਇੱਕਵਾਰ|$1 ਵਾਰ}}.',
 'protectedpage' => 'ਸੁਰੱਖਿਅਤ ਪੇਜ',
-'jumpto' => 'ਜੰਪ ਕਰੋ:',
-'jumptonavigation' => 'ਨੇਵੀਗੇਸ਼ਨ',
-'jumptosearch' => 'ਖੋਜ',
+'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).
@@ -253,13 +324,13 @@ $messages = array(
 'copyrightpage' => '{{ns:project}}:ਕਾਪੀਰਾਈਟ',
 'currentevents' => 'ਮੌਜੂਦਾ ਇਵੈਂਟ',
 'currentevents-url' => 'Project:ਮੌਜੂਦਾ ਈਵੈਂਟ',
-'disclaimers' => 'ਦਾà¨\85ਵà©\87',
-'disclaimerpage' => 'Project:à¨\86ਮ à¨¦à¨¾à¨\85ਵਾ',
+'disclaimers' => 'à¨\87ਨà¨\95ਾਰà©\80 à¨\90ਲਾਨ',
+'disclaimerpage' => 'Project:à¨\86ਮ à¨\87ਨà¨\95ਾਰ',
 'edithelp' => 'ਮੱਦਦ ਐਡੀਟਿੰਗ',
 'edithelppage' => 'Help:ਐਡਟਿੰਗ',
-'helppage' => 'Help:ਸਮੱà¨\97ਰà©\80',
-'mainpage' => 'ਮà©\81ੱà¨\96 à¨ªà©\87à¨\9c',
-'mainpage-description' => 'ਮà©\81ੱà¨\96 à¨ªà©\87à¨\9c',
+'helppage' => 'Help:à¨\9aà©\80à¨\9c਼ਾà¨\82',
+'mainpage' => 'ਮà©\81ੱà¨\96 à¨¸à¨«à¨¼à¨¾',
+'mainpage-description' => 'ਮà©\81ੱà¨\96 à¨¸à¨«à¨¼à¨¾',
 'policy-url' => 'Project:ਪਾਲਸੀ',
 'portal' => 'ਕਮਿਊਨਟੀ ਪੋਰਟਲ',
 'portal-url' => 'Project:ਕਮਿਊਨਟੀ ਪੋਰਟਲ',
@@ -268,49 +339,64 @@ $messages = array(
 
 'badaccess' => 'ਅਧਿਕਾਰ ਗਲਤੀ',
 'badaccess-group0' => 'ਤੁਹਾਨੂੰ ਉਹ ਐਕਸ਼ਨ ਕਰਨ ਦੀ ਮਨਜ਼ੂਰੀ ਨਹੀਂ, ਜਿਸ ਦੀ ਤੁਸੀਂ ਮੰਗ ਕੀਤੀ ਹੈ।',
+'badaccess-groups' => 'ਜੋ ਕੰਮ ਤੁਸੀਂ ਕਰਨਾ ਚਾਹਿਆ ਹੈ ਓਹ {{PLURAL:$2|ਇਸ ਗਰੁੱਪ|ਇਹਨਾਂ ਗਰੁੱਪਾਂ}} ਦੇ ਮੈਂਬਰ ਹੀ ਕਰ ਸਕਦੇ ਹਨ: $1',
+
+'versionrequired' => 'ਮੀਡੀਆਵਿਕੀ ਦੇ $1 ਵਰਜਨ ਦੀ ਲੋੜ ਹੈ',
+'versionrequiredtext' => 'ਇਸ ਸਫ਼ੇ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਮੀਡੀਆਵਿਕੀ ਦੇ $1 ਵਰਜਨ ਦੀ ਲੋੜ ਹੈ।
+ਵੇਖੋ [[Special:Version|ਵਰਜਨ ਸਫ਼ੇ]]।',
 
 'ok' => 'ਠੀਕ ਹੈ',
 'retrievedfrom' => '"$1" ਤੋਂ ਲਿਆ',
-'youhavenewmessages' => 'ਤà©\81ਹਾਨà©\82à©° $1 ($2).',
+'youhavenewmessages' => 'ਤà©\81ਹਾਡà©\87 à¨²à¨\88 $1। ($2)',
 'newmessageslink' => 'ਨਵੇਂ ਸੁਨੇਹੇ',
-'newmessagesdifflink' => 'ਆਖਰੀ ਬਦਲਾਅ',
+'newmessagesdifflink' => 'ਆਖ਼ਰੀ ਤਬਦੀਲੀ',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|ਇਕ  ਮੈਂਬਰ|$3 ਮੈਂਬਰਾਂ}} ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)',
+'youhavenewmessagesmanyusers' => 'ਕਈ ਮੈਂਬਰਾਂ ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।',
+'newmessageslinkplural' => '{{PLURAL:$1|ਇੱਕ ਨਵਾਂ ਸੁਨੇਹਾ|ਨਵੇਂ ਸੁਨੇਹੇ}}',
+'newmessagesdifflinkplural' => 'ਆਖ਼ਰੀ {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}',
 'youhavenewmessagesmulti' => 'ਤੁਹਾਨੂੰ ਨਵੇਂ ਸੁਨੇਹੇ $1 ਉੱਤੇ ਹਨ',
 'editsection' => 'ਸੋਧ',
-'editold' => 'ਸੋਧ',
+'editold' => 'ਸੋਧ',
 'viewsourceold' => 'ਸਰੋਤ ਵੇਖੋ',
 'editlink' => 'ਸੋਧ',
 'viewsourcelink' => 'ਸਰੋਤ ਵੇਖੋ',
 'editsectionhint' => 'ਸ਼ੈਕਸ਼ਨ ਸੋਧ: $1',
-'toc' => 'ਸਮà¨\97ੱਰà©\80',
+'toc' => 'ਲਿਸà¨\9f',
 'showtoc' => 'ਵੇਖੋ',
 'hidetoc' => 'ਓਹਲੇ',
 'collapsible-collapse' => 'ਸਮੇਟੋ',
 'collapsible-expand' => 'ਫੈਲਾਓ',
 'thisisdeleted' => 'ਵੇਖੋ ਜਾਂ $1 ਰੀਸਟੋਰ?',
 'viewdeleted' => '$1 ਵੇਖਣਾ?',
+'restorelink' => '{{PLURAL:$1|ਇਕ ਮਿਟਾਈ ਹੋਈ ਸੋਧ|$1 ਮਿਟਾਈਆਂ ਹੋਈਆਂ ਸੋਧਾਂ}}',
 'feedlinks' => 'ਫੀਡ:',
+'feed-invalid' => 'ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫ਼ੀਡ ਦੀ ਅਵੈਧ ਕਿਸਮ',
+'feed-unavailable' => 'ਸੰਸਥਾਵਾਂ  ਸਮੱਗਰੀ ਦਾ ਆਧੁਨਕੀਕਰਣ ਉਪਲਬਧ ਨਹੀਂ',
 'site-rss-feed' => '$1 RSS ਫੀਡ',
 'site-atom-feed' => '$1 ਐਟਮ ਫੀਡ',
 'page-rss-feed' => '"$1" RSS ਫੀਡ',
 'page-atom-feed' => '"$1" ਐਟਮ ਫੀਡ',
-'red-link-title' => '$1 (à¨\87ਸ à¨¨à¨¾à¨\82 à¨¦à¨¾ à¨ªà©\87à¨\9c ਨਹੀਂ ਹੈ)',
+'red-link-title' => '$1 (ਸਫ਼ਾ à¨®à©\8cà¨\9cà©\82ਦ ਨਹੀਂ ਹੈ)',
 'sort-descending' => 'ਘੱਟਦਾ ਕ੍ਰਮ',
 'sort-ascending' => 'ਵੱਧਦਾ ਕ੍ਰਮ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'ਲੇਖ',
-'nstab-user' => 'ਯà©\82à¨\9c਼ਰ à¨ªà©\87à¨\9c',
+'nstab-user' => 'ਮà©\88à¨\82ਬਰ à¨¸à¨«à¨¼à¨¾',
 'nstab-media' => 'ਮੀਡਿਆ ਪੇਜ',
-'nstab-special' => 'ਖਾਸ ਸਫ਼ਾ',
-'nstab-project' => 'ਪਰà©\8bà¨\9cà©\88à¨\95à¨\9f à¨ªà©\87à¨\9c',
-'nstab-image' => 'ਫਾà¨\87ਲ',
+'nstab-special' => 'à¨\96਼ਾਸ à¨¸à¨«à¨¼à¨¾',
+'nstab-project' => 'ਪà©\8dਰà©\8bà¨\9cà©\88à¨\95à¨\9f à¨¸à¨«à¨¼à¨¾',
+'nstab-image' => 'ਫ਼ਾà¨\88ਲ',
 'nstab-mediawiki' => 'ਸੁਨੇਹਾ',
-'nstab-template' => 'à¨\9fà©\88ਪਲà©\87à¨\9f',
+'nstab-template' => 'ਸਾà¨\82à¨\9aਾ',
 'nstab-help' => 'ਮੱਦਦ ਪੇਜ',
 'nstab-category' => 'ਕੈਟਾਗਰੀ',
 
 # Main script and global functions
 'nosuchaction' => 'ਕੋਈ ਇੰਝ ਦਾ ਐਕਸ਼ਨ ਨਹੀਂ',
+'nosuchactiontext' => 'URL ਦੁਆਰਾ ਦੱਸਿਆ ਕੰਮ ਗ਼ਲਤ ਹੈ।
+ਸ਼ਾਇਦ ਤੁਸੀਂ URL ਸਹੀ ਨਹੀਂ ਲਿਖਿਆ ਜਾਂ ਕਿਸੇ ਗ਼ਲਤ ਲਿੰਕ ਤੇ ਆਏ ਹੋ।
+ਇਹ ਵੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ {{SITENAME}} ਦੁਆਰੇ ਵਰਤੇ ਜਾਂਦੇ ਸਾਫ਼ਟਵੇਅਰ ਵਿਚਲੀ ਗ਼ਲਤੀ ਵੱਲ ਇਸ਼ਾਰਾ ਹੋਵੇ।',
 'nosuchspecialpage' => 'ਕੋਈ ਇੰਝ ਦਾ ਖਾਸ ਪੇਜ ਨਹੀਂ',
 'nospecialpagetext' => '<strong>ਤੁਸੀਂ ਇੱਕ ਅਵੈਧ ਖਾਸ ਪੇਜ ਦੀ ਮੰਗ ਕੀਤੀ ਹੈ।</strong>
 
@@ -319,14 +405,45 @@ A list of valid special pages can be found at [[Special:SpecialPages]].',
 # General errors
 'error' => 'ਗਲਤੀ',
 'databaseerror' => 'ਡਾਟਾਬੇਸ ਗਲਤੀ',
+'dberrortext' => 'ਡੈਟਾਬੇਸ ਪੁ੍ਛ ਗਿੱਛ ਵਿਚ ਹਿਦਾਇਤਾਂ ਦੀ ਤਰੁੱਟੀ ਮਿਲੀ ਹੈ।
+ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਤਰੁ੍ੱਟੀ ਸਾਫ਼ਟਵੇਅਰ ਦੀ ਹੋਵੇ।
+ਇਸ ਗਣਿਤਫ਼ਲ "<tt>$2</tt>" ਵਿਚੌਂ ਪਿਛਲੀ ਡੈਟਬਾਸ ਪੁੱਛ ਗਿੱਛ ਸੀ: <blockquote><tt>$1</tt></blockquote.
+ਡੈਟਾਬੇਸ ਨੇ ਇਹ ਤਰੁੱਟੀ "<tt>$3: $4</tt>"ਜਵਾਬ ਵਿਚ ਦਿੱਤੀ।',
+'dberrortextcl' => 'ਡੈਟਾਬੇਸ ਪੁ੍ਛ ਗਿੱਛ ਵਿਚ ਹਿਦਾਇਤਾਂ ਦੀ ਤਰੁੱਟੀ ਮਿਲੀ ਹੈ।
+ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਤਰੁੱਟੀ ਸਾਫ਼ਟਵੇਅਰ ਦੀ ਹੋਵੇ।
+ਇਸ ਗਣਿਤਫ਼ਲ "$2" ਵਿਚੌਂ ਪਿਛਲੀ ਡੈਟਬਾਸ ਪੁੱਛ ਗਿੱਛ ਸੀ: "$1".
+ਡੈਟਾਬੇਸ ਨੇ ਇਹ ਤਰੁੱਟੀ "$1"ਜਵਾਬ ਵਿਚ ਦਿੱਤੀ।',
+'laggedslavemode' => "'''ਖ਼ਬਰਦਾਰ:''' ਹੋ ਸਕਦਾ ਹੈ ਸਫ਼ੇ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਸ਼ਾਮਲ ਨਾ ਹੋਣ।",
 'readonly' => 'ਡਾਟਾਬੇਸ ਲਾਕ ਹੈ',
-'missing-article' => "ਡੈਟਾਬੇਸ ਨੂੰ ਕਿਸੇ ਪੰਨੇ ਦਾ ਪਾਠ ''$1''ਜੋ ਇਸ ਨੂੰ $2 ਵਿਚ ਢੂੰਡਣਾ ਸੀ ,ਨਹੀਂ ਮਿਲਿਆ।
-ਆਮ ਤੌਰ ਤੇ ਮਿਟਾਏ ਜਾ ਚੁਕੇ ਪੰਨੇ ਦੀ ਇਤਿਹਾਸ ਕੜੀ ਦੀ ਵਰਤੌਂ ਕਰਣ ਨਾਲ ਇਸ ਤਰਾਂ ਹੁੰਦਾ ਹੈ।
-ਜੇ ਇਸ ਤਰਾਂ ਦਿ ਗੱਲ ਨਹੀਂ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਤੁਹਾਨੂੰ ਸਾਫ਼ਟਵੇਅਰ ਵਿਚ ਤ੍ਰੁਟੀ ਮਿਲ ਗਈ ਹੈ।ਕਿਰਪਾ ਕਰਕੇ ਪਤੇ ਸਮੇਤ [[Special:ListUsers/sysop|administrator]] ਨੂੰ  ਇਸ ਦੀ ਸੂਚਨਾ ਦਿਓ।",
+'enterlockreason' => 'ਤਾਲਾ-ਬੰਦੀ ਲਈ ਕਾਰਨ ਦਾਖ਼ਲ ਕਰੋ, ਨਾਲ਼ ਹੀ ਤਾਲਾ-ਬੰਦੀ ਦੇ ਰਿਲੀਜ਼ ਹੋਣ ਦਾ ਅੰਦਾਜ਼ਨ ਵਕਤ',
+'readonlytext' => 'ਡੈਟਾਬੇਸ ਨੂੰ ਇਸ ਵੇਲ਼ੇ ਤਾਲਾ ਲੱਗਾ ਹੋਇਆ ਹੈ, ਸ਼ਾਇਦ ਆਮ ਰੱਖ-ਰਖਾਵ ਲਈ, ਇਸਤੋਂ ਬਾਅਦ ਇਹ ਆਮ ਵਾਂਗ ਉਪਲੱਬਧ ਹੋਵੇਗਾ।
+ਜਿਸ ਪ੍ਰਬੰਧਕ ਨੇ ਇਸਨੂੰ ਤਾਲਾ ਲਾਇਆ ਹੈ ਉਸਦਾ ਕਹਿਣਾ ਹੈ ਕਿ: $1',
+'missing-article' => "ਡਾਟਾਬੇਸ ਨੂੰ ''$1'' $2 ਨਾਮ ਦਾ ਕੋਈ ਸਫ਼ਾ ਨਹੀਂ ਮਿਲਿਆ।
+ਆਮ ਤੌਰ ਤੇ ਮਿਟਾਏ ਜਾ ਚੁੱਕੇ ਸਫ਼ੇ ਦੀ ਅਤੀਤ ਕੜੀ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲ਼ ਇੰਝ ਹੁੰਦਾ ਹੈ।
+ਜੇ ਇਹ ਗੱਲ ਨਹੀਂ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਤੁਹਾਨੂੰ ਸਾਫ਼ਟਵੇਅਰ ਵਿਚ ਖ਼ਾਮੀ ਮਿਲ ਗਈ ਹੈ। ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਸਫ਼ੇ ਦੇ ਪਤੇ ਸਮੇਤ [[Special:ListUsers/sysop|administrator]] ਨੂੰ ਇਤਲਾਹ ਦਿਓ।",
+'missingarticle-rev' => '(ਬਦਲਾਅ#: $1)',
+'missingarticle-diff' => '(ਫ਼ਰਕ: $1, $2)',
+'readonly_lag' => 'ਜਦੌਂ ਤਕ ਅਧੀਨ ਡੇਟਾਬੇਸ ਸਰਵਰ ਸੁਤੰਤਰ ਡੈਟਾਬੇਸ ਸਰਵਰ ਦੀ ਪਕੜ ਵਿਚ ਨਹੀਂ ਆ ਜਾਂਦੇ ਡੈਟਾਬੇਸ ਸਵੈ ਜਕੜਿਆ ਗਿਆ ਹੈ।',
 'internalerror' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ',
 'internalerror_info' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ: $1',
-'badtitle' => 'ਗਲਤ ਟਾਇਟਲ',
-'badtitletext' => 'ਤੁਹਾਡਾ ਅਰਜ਼ਿਤ ਸਿਰਲੇਖ ਅਪ੍ਰਮਾਣਿਕ,ਖਾਲੀ ਯਾ ਗਲਤ ਜੁੜਿਆ ਹੋਇਆ ਅੰਤਰ-ਭਾਸ਼ਾ ਯਾ ਅੰਤਰ-ਵਿਕਿ ਸਿਰਲੇਖ ਹੈ।ਇਹ ਵੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਸ ਵਿਚ ਇਕ ਦੋ ਅੱਖਰ ਐਸੇ ਹੋਣ ਜੋ ਸਿਰਲੇਖ ਵਿਚ ਵਰਤੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।',
+'fileappenderrorread' => 'ਅੰਤਕਾ ਜੋੜਨ ਲਗਿਆਂ "$1"ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।',
+'fileappenderror' => "''$1'' ''$2'' ਨਾਲ਼ ਜੋੜਿਆ ਨਹੀ ਜਾ ਸਕਦਾ",
+'filecopyerror' => "'''$1''' ਫ਼ਾਈਲ '''$2''' ਵਿਚ ਨਕਲ ਨਹੀਂ ਹੋ ਸਕੀ।",
+'filerenameerror' => "ਫ਼ਾਈਲ ''$1'' ਦਾ ਨਾਮ ਬਦਲ ਕੇ ''$2'' ਨਹੀਂ ਰੱਖਿਆ ਜਾ ਸਕਿਆ।",
+'filedeleteerror' => "ਫ਼ਾਈਲ ''$1'' ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
+'directorycreateerror' => "''$1'' ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
+'filenotfound' => "ਫ਼ਾਈਲ ''$1'' ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।",
+'fileexistserror' => 'ਮਿਸਲ "$1" ਤੇ ਲਿਖ ਨਹੀਂ ਸਕਦੇ: ਮਿਸਲ ਹੌਂਦ ਵਿਚ ਹੈ।',
+'unexpected' => 'ਨਾ-ਸੰਭਾਵਿਤ ਗਣਿਤਫ਼ਲ',
+'formerror' => 'ਦੋਸ਼:ਫ਼ਾਰਮ ਪੇਸ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ',
+'badarticleerror' => 'ਇਹ ਕਾਰਵਾਈ ਇਸ ਸਫ਼ੇ ਤੇ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।',
+'cannotdelete' => "ਫ਼ਾਈਲ ਜਾਂ ਸਫ਼ਾ ''$1'' ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।
+ਸ਼ਾਇਦ ਕੋਈ ਪਹਿਲਾਂ ਹੀ ਇਸਨੂੰ ਮਿਟਾ ਚੁੱਕਾ ਹੈ।",
+'cannotdelete-title' => "ਸਫ਼ਾ ''$1'' ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ",
+'delete-hook-aborted' => 'ਹੁੱਕ ਨੇ ਮਿਟਾਉਣਾ ਨਾਕਾਮ ਕੀਤਾ।
+ਇਸਨੇ ਕੋਈ ਕਾਰਨ ਨਹੀਂ ਦੱਸਿਆ।',
+'badtitle' => 'ਗ਼ਲਤ ਸਿਰਲੇਖ',
+'badtitletext' => 'ਤੁਹਾਡਾ ਦਰਖ਼ਾਸਤਸ਼ੁਦਾ ਸਿਰਲੇਖ ਨਾਕਾਬਿਲ, ਖ਼ਾਲੀ ਜਾਂ ਗ਼ਲਤ ਜੁੜਿਆ ਹੋਇਆ inter-languagd ਜਾਂ inter-wiki ਸਿਰਲੇਖ ਹੈ। ਇਹ ਵੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਸ ਵਿਚ ਇਕ-ਦੋ ਅੱਖਰ ਐਸੇ ਹੋਣ ਜੋ ਸਿਰਲੇਖ ਵਿਚ ਵਰਤੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।',
 'viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
 'protectedpagetext' => 'ਇਸ ਪੰਨੇ ਨੂੰ ਐਡਿਟ ਕਰਨ ਦੀ ਮਨਾਹੀ ਹੈ।',
 'viewsourcetext' => 'ਤੁਸੀਂ ਇਸ ਪੰਨੇ ਦਾ ਸੋਮਾ ਦੇਖ ਸਕਦੇ ਹੋ ਤੇ ਉਸ ਦਾ ਉਤਾਰਾ ਵੀ ਲੈ ਸਕਦੇ ਹੋ।',
@@ -334,38 +451,51 @@ A list of valid special pages can be found at [[Special:SpecialPages]].',
 'protectedinterface' => 'ਇਹ ਪੰਨਾ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦਾ ਮੂਲ ਪਾਠ ਹੈ ,ਅਤੇ ਦੁਰਵਰਤੌਂ ਤੌਂ ਬਚਾਅ ਲਈ ਰਾਖਵਾਂ ਕੀਤਾ ਗਿਆ ਹੈ।',
 'editinginterface' => "'''ਚਿਤਾਵਨੀ''' ਤੁਸੀਂ ਐਸੇ ਪੰਨੇ ਨੂੰ ਬਦਲ ਰਹੇ ਹੋ ਜੋ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦੇ ਮੂਲ ਪਾਠ ਲਈ ਵਰਤਿਆ ਗਿਆ ਹੈ।
 ਇਸ ਪੰਨੇ ਦੇ ਬਦਲਾਅ ਦੁਸਰੇ ਵਰਤੋਂ ਕਰਣ ਵਾਲਿਆਂ ਲਈ ਵਰਤੇ ਜਾਣ ਵਾਲੇ ਇੰਟਰਫਲੇਸ ਦੀ ਸ਼ਕਲ ਤੇ ਅਸਰ ਪਾ ਦੇਣਗੇ।ਅਨੁਵਾਦ ਕਰਣ ਲਈ ,ਕਿਰਪਾ ਕਰਕੇ [//translatewiki.net/wiki/Main_Page?setlang=pa ਟ੍ਰਾਂਸਲੇਟਵਿਕੀ.ਨੈਟ] ਦੀ ਵਰਤੌਂ ਕਰੋ,ਇਹ ਮੀਡੀਆਵਿਕੀ ਦੀ ਸਥਾਨਕੀਕਰਣ ਯੋਜਨਾ ਹੈ।",
+'namespaceprotected' => "ਤੁਹਾਨੂੰ '''$1''' ਥਾਂ-ਨਾਮ ਵਾਲ਼ੇ ਸਫ਼ਿਆਂ ਵਿਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
+'customcssprotected' => 'ਤੁਹਾਨੂੰ ਇਸ CSS ਸਫ਼ੇ ਵਿਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਇਸ ਵਿਚ ਕਿਸੇ ਹੋਰ ਮੈਂਬਰ ਦੀਆਂ ਨਿੱਜੀ ਸੈਟਿੰਗਾਂ ਹਨ।',
+'customjsprotected' => 'ਤੁਹਾਨੂੰ ਇਸ CSS ਸਫ਼ੇ ਵਿਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਇਸ ਵਿਚ ਕਿਸੇ ਹੋਰ ਮੈਂਬਰ ਦੀਆਂ ਨਿੱਜੀ ਸੈਟਿੰਗਾਂ ਹਨ।',
+'ns-specialprotected' => 'ਖ਼ਾਸ ਸਫ਼ੇ ਸੋਧੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।',
+'titleprotected' => 'ਇਹ ਸਿਰਲੇਖ [[User:$1|$1]] ਵੱਲੋਂ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦਿੱਤਾ ਹੋਇਆ ਕਾਰਨ ਹੈ, "\'\'$2\'\'"।',
+'invalidtitle-knownnamespace' => 'ਥਾਂ-ਨਾਮ "$2" ਅਤੇ ਲਿਖਤ "$3" ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ',
+'exception-nologin' => 'ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ',
+'exception-nologin-text' => 'ਇਹ ਸਫ਼ਾ ਜਾਂ ਕਾਰਵਾਈ ਤੁਹਾਡਾ ਇਸ ਵਿਕੀ ਤੇ ਲਾਗਇਨ ਹੋਣਾ ਲੋੜਦੀ ਹੈ।',
+
+# Virus scanner
+'virus-unknownscanner' => 'ਅਣਪਛਾਤਾ ਐਂਟੀਵਾਇਰਸ:',
 
 # Login and logout pages
 'logouttext' => "'''ਹੁਣ ਤੁਸੀਂ ਲਾਗਆਉਟ ਹੋ ਗਏ ਹੋ।'''
 
 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.",
-'welcomecreation' => '== $1 ਜੀ ਆਇਆਂ ਨੂੰ! ==
+'welcomecreation' => '== ਜੀ ਆਇਆਂ ਨੂੰ, $1! ==
 
-ਤà©\81ਹਾਡਾ à¨\85à¨\95ਾà¨\8aà¨\82à¨\9f à¨¬à¨£à¨¾à¨\87à¨\86 à¨\97ਿà¨\86 à¨¹à©\88। à¨\86ਪਣà©\80 [[Special:ਪਸੰਦ|{{SITENAME}} à¨ªà¨¸à©°à¨¦]] à¨¬à¨¦à¨²à¨£à©\80 ਨਾ ਭੁੱਲੋ।',
-'yourname' => 'ਯà©\82à¨\9c਼ਰ ਨਾਂ:',
+ਤà©\81ਹਾਡਾ à¨\96ਾਤਾ à¨¬à¨£ à¨\9aà©\81ੱà¨\95ਾ à¨¹à©\88। à¨\86ਪਣà©\80à¨\86à¨\82 [[Special:Preferences|{{SITENAME}} à¨ªà¨¸à©°à¨¦à¨¾à¨\82]] à¨¬à¨¦à¨²à¨£à©\80à¨\86à¨\82 ਨਾ ਭੁੱਲੋ।',
+'yourname' => 'ਮà©\88à¨\82ਬਰ ਨਾਂ:',
 'yourpassword' => 'ਪਾਸਵਰਡ:',
-'yourpasswordagain' => 'ਪਾਸਵਰਡ à¨®à©\81à©\9c-ਲਿਖੋ:',
-'remembermypassword' => 'ਇਸ ਕੰਪਿਊਟਰ ਉੱਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ ($1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ)',
+'yourpasswordagain' => 'ਪਾਸਵਰਡ à¨¦à©\81ਬਾਰਾ ਲਿਖੋ:',
+'remembermypassword' => 'ਇਸ ਕੰਪਿਊਟਰ ’ਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ (ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ)',
 'yourdomainname' => 'ਤੁਹਾਡੀ ਡੋਮੇਨ:',
+'password-change-forbidden' => 'ਇਸ ਵਿਕੀ ਤੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।',
 'login' => 'ਲਾਗ ਇਨ',
-'nav-login-createaccount' => 'ਲਾਗ ਇਨ / ਅਕਾਊਂਟ ਬਣਾਓ',
-'loginprompt' => 'ਤੁਹਾਨੂੰ {{SITENAME}} ਉੱਤੇ ਲਾਗਇਨ ਕਰਨ ਲਈ ਕੂਕੀਜ਼ ਯੋਗ ਕਰਨੇ ਜ਼ਰੂਰੀ ਹਨ।',
-'userlogin' => 'ਲਾਗ ਇਨ / ਅਕਾਊਂਟ ਬਣਾਓ',
+'nav-login-createaccount' => 'ਲਾਗ ਇਨ/ਖਾਤਾ ਬਣਾਓ',
+'loginprompt' => 'ਤੁਹਾਨੂੰ {{SITENAME}} ਤੇ ਲਾਗਇਨ ਕਰਨ ਲਈ ਕੂਕੀਜ਼ ਯੋਗ ਕਰਨੇ ਜ਼ਰੂਰੀ ਹਨ।',
+'userlogin' => 'ਲਾਗ ਇਨ/ਖਾਤਾ ਖੋਲ੍ਹੋ',
 'userloginnocreate' => 'ਲਾਗ ਇਨ',
 'logout' => 'ਲਾਗ ਆਉਟ',
 'userlogout' => 'ਲਾਗ ਆਉਟ',
 'notloggedin' => 'ਲਾਗਇਨ ਨਹੀਂ',
-'nologin' => 'ਅਕਾਊਂਟ ਨਹੀਂ ਹੈ? $1',
-'nologinlink' => 'ਇੱਕ ਅਕਾਊਂਟ ਬਣਾਓ',
-'createaccount' => 'ਅਕਾਊਂਟ ਬਣਾਓ',
-'gotaccount' => "ਪਹਿਲਾਂ ਹੀ ਇੱਕ ਅਕਾਊਂਟ ਹੈ? '''$1'''.",
-'gotaccountlink' => 'ਲਾਗਇਨ',
+'nologin' => 'ਖਾਤਾ ਨਹੀਂ ਹੈ? $1।',
+'nologinlink' => 'ਖਾਤਾ ਬਣਾਓ',
+'createaccount' => 'ਖਾਤਾ ਬਣਾਓ',
+'gotaccount' => "ਖਾਤਾ ਹੈ? '''$1'''।",
+'gotaccountlink' => 'ਲਾਗ ਇਨ',
+'userlogin-resetlink' => 'ਆਪਣੀ ਲਾਗਇਨ ਜਾਣਕਾਰੀ ਭੁੱਲ ਗਏ ਹੋ?',
 'createaccountmail' => 'ਈਮੇਲ ਨਾਲ',
 'createaccountreason' => 'ਕਾਰਨ:',
 'badretype' => 'ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।',
-'userexists' => 'ਯà©\82à¨\9c਼ਰ à¨¨à¨¾à¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¹à©\80 à¨µà¨°à¨¤à©\8bà¨\82 à¨\85ਧà©\80ਨ ਹੈ।
-ਵੱà¨\96ਰਾ à¨¯à©\82à¨\9c਼ਰ à¨¨à¨¾à¨\82 à¨µà¨°à¨¤à©\8bà¨\82 à¨\9cà©\80।',
+'userexists' => 'à¨\87ਹ à¨®à©\88à¨\82ਬਰ-ਨਾਮ à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¹à©\80 à¨µà¨°à¨¤à©\8bà¨\82 â\80\99à¨\9a ਹੈ।
+ਮਿਹਰਬਾਨà©\80 à¨\95ਰà¨\95à©\87 à¨µà©±à¨\96ਰਾ à¨®à©\88à¨\82ਬਰ-ਨਾਮ à¨µà¨°à¨¤à©\8bà¨\82।',
 'loginerror' => 'ਲਾਗਇਨ ਗਲਤੀ',
 '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.',
@@ -373,29 +503,32 @@ Note that some pages may continue to be displayed as if you were still logged in
 'noname' => 'ਤੁਸੀਂ ਇੱਕ ਵੈਧ ਯੂਜ਼ਰ ਨਾਂ ਨਹੀਂ ਦਿੱਤਾ ਹੈ।',
 'loginsuccesstitle' => 'ਲਾਗਇਨ ਸਫ਼ਲ ਰਿਹਾ',
 'loginsuccess' => "'''ਤੁਸੀਂ {{SITENAME}} ਉੱਤੇ \"\$1\" ਵਾਂਗ ਲਾਗਇਨ ਕਰ ਚੁੱਕੇ ਹੋ।'''",
-'nosuchuser' => '"$1" ਨਾਂ ਨਾਲ ਕੋਈ ਯੂਜ਼ਰ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਸ਼ਬਦ ਧਿਆਨ ਨਾਲ ਚੈੱਕ ਕਰੋ ਜਾਂ ਨਵਾਂ ਅਕਾਊਂਟ ਬਣਾਓ।',
+'nosuchuser' => '!"$1" ਨਾਂ ਨਾਲ ਕੋਈ ਯੂਜ਼ਰ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਸ਼ਬਦ ਜੋੜ ਧਿਆਨ ਨਾਲ ਚੈਕ ਕਰੋ ਉਪਰ ਹੇਠਾਂ ਦਾ ਕੇਸ ਵਰਤਣ ਨਾਲ ਫ਼ਰਕ ਪੈਂਦਾ ਹੈ ਜਾਂ [[Special:UserLogin/signup|ਨਵਾਂ ਖਾਤਾ ਬਣਾਓ]]',
 'nosuchusershort' => '"$1" ਨਾਂ ਨਾਲ ਕੋਈ ਵੀ ਯੂਜ਼ਰ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਸ਼ਬਦ ਧਿਆਨ ਨਾਲ ਚੈੱਕ ਕਰੋ।',
 'nouserspecified' => 'ਤੁਹਾਨੂੰ ਇੱਕ ਯੂਜ਼ਰ-ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ।',
+'login-userblocked' => 'ਇਹ ਮੈਂਬਰ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। ਲਾਗਇਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
 'wrongpassword' => 'ਗਲਤ ਪਾਸਵਰਡ ਦਿੱਤਾ ਹੈ। ਮੁੜ-ਟਰਾਈ ਕਰੋ ਜੀ।',
 'wrongpasswordempty' => 'ਖਾਲੀ ਪਾਸਵਰਡ ਦਿੱਤਾ ਹੈ। ਮੁੜ-ਟਰਾਈ ਕਰੋ ਜੀ।',
 'passwordtooshort' => 'ਪਾਸਵਰਡ {{PLURAL:$1|1 ਅੱਖਰ|$1 ਅੱਖਰਾਂ}} ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ।',
 'password-name-match' => 'ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਤੁਹਾਡੇ ਯੂਜ਼ਰ ਨਾਂ ਤੋਂ ਵੱਖਰਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
-'mailmypassword' => 'ਨਵਾਂ ਪਾਸਵਰਡ ਈਮੇਲ ਕਰੋ',
+'password-login-forbidden' => 'ਇਹ ਮੈਂਬਰ-ਨਾਮ ਅਤੇ ਪਾਸਵਰਡ ਵਰਤਣ ਦੀ ਮਨਾਹੀ ਹੈ।',
+'mailmypassword' => 'ਨਵਾਂ ਪਾਸਵਰਡ ਈ-ਮੇਲ ਕਰੋ',
 'passwordremindertitle' => '{{SITENAME}} ਲਈ ਪਾਸਵਰਡ ਯਾਦ ਰੱਖੋ',
-'passwordremindertext' => 'ਕਿਸੇ ਨੇ (ਸ਼ਾਇਦ ਤੁਸੀਂ, IP ਐਡਰੈੱਸ $1 ਤੋਂ)
-ਮੰਗ ਕੀਤੀ ਸੀ ਕਿ ਅਸੀਂ ਤੁਹਾਨੂੰ {{SITENAME}} ($4) ਲਈ ਪਾਸਵਰਡ ਭੇਜੀਏ।
-ਯੂਜ਼ਰ "$2" ਲਈ ਹੁਣ ਪਾਸਵਰਡ "$3" ਹੈ।
-ਤੁਹਾਨੂੰ ਹੁਣ ਲਾਗਇਨ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਹੁਣੇ ਬਦਲਣਾ ਚਾਹੀਦਾ ਹੈ।
-
-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.',
+'passwordremindertext' => 'ਕਿਸੇ ਨੇ (ਸ਼ਾਇਦ ਤੁਸੀਂ, IP ਪਤਾ $1 ਤੋਂ) {{SITENAME}} ਲਈ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ ($4)।
+ਮੈਂਬਰ "$2" ਲਈ ਆਰਜ਼ੀ ਪਾਸਵਰਡ ਬਣਾ ਕੇ "$3" ਤੇ ਭੇਜ ਦਿੱਤਾ ਗਿਆ ਹੈ।
+ਜੇ ਤੁਹਾਡਾ ਇਹੀ ਇਰਾਦਾ ਸੀ ਤਾਂ ਤੁਹਾਨੂੰ ਚਾਹੀਦਾ ਹੈ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਲਓ।
+ਤੁਹਾਡਾ ਆਰਜ਼ੀ ਪਾਸਵਰਡ {{PLURAL:$5|ਇਕ ਦਿਨ|$5 ਦਿਨਾਂ}} ਵਿਚ ਖ਼ਤਮ ਹੋ ਜਾਵੇਗਾ।
+
+ਜੇ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਸੀ ਜਾਂ ਜੇ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਯਾਦ ਹੈ ਅਤੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ।',
 'noemail' => 'ਯੂਜ਼ਰ "$1" ਲਈ ਰਿਕਾਰਡ ਵਿੱਚ ਕੋਈ ਈਮੇਲ ਐਡਰੈੱਸ ਨਹੀਂ ਹੈ।',
 'noemailcreate' => 'ਤੁਹਾਨੂੰ ਠੀਕ ਈਮੇਲ ਐਡਰੈੱਸ ਦੇਣਾ ਪਵੇਗਾ',
 'passwordsent' => '"$1" ਨਾਲ ਰਜਿਸਟਰ ਕੀਤੇ ਈਮੇਲ ਐਡਰੈੱਸ ਉੱਤੇ ਈਮੇਲ ਭੇਜੀ ਗਈ ਹੈ।
 ਇਹ ਮਿਲ ਦੇ ਬਾਅਦ ਮੁੜ ਲਾਗਇਨ ਕਰੋ ਜੀ।',
-'throttled-mailpassword' => 'ਇੱਕ ਪਾਸਵਰਡ ਰੀਮਾਈਡਰ ਪਹਿਲਾਂ ਹੀ ਭੇਜਿਆ ਗਿਆ ਹੈ, ਆਖਰੀ
-$1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $1 ਘੰਟਿਆਂ ਵਿੱਚ ਇੱਕ ਹੀ ਪਾਸਵਰਡ ਰੀਮਾਈਡਰ ਭੇਜਿਆ ਜਾਂਦਾ ਹੈ।',
+'blocked-mailpassword' => 'ਤੁਹਾਡੇ IP ਪਤੇ ਤੇ ਸੋਧ ਕਰਨ ਤੇ ਪਾਬੰਦੀ ਹੈ ਅਤੇ ਇਸੇ ਕਰਕੇ, ਗ਼ਲਤ ਵਰਤੋਂ ਤੋਂ ਬਚਣ ਲਈ, ਪਾਸਵਰਡ ਹਾਸਲ ਕਰਨ ਵਾਲ਼ੀ ਸਹੂਲਤ ਦੀ ਵਰਤੋਂ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'eauthentsent' => 'ਇਕ ਤਸਦੀਕੀ ਈ-ਮੇਲ ਨਾਮਜ਼ਦ ਕੀਤੇ ਈ-ਮੇਲ ਪਤੇ ਤੇ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।
+ਤੁਹਾਡੇ ਪਤੇ ਤੇ ਕੋਈ ਹੋਰ ਈ-ਮੇਲ ਭੇਜਣ ਤੋਂ ਪਹਿਲਾਂ, ਇਹ ਤਸਦੀਕ ਕਰਨ ਲਈ ਕਿ ਖਾਤਾ ਅਸਲ ਵਿਚ ਤੁਹਾਡਾ ਹੀ ਹੈ, ਤੁਹਾਨੂੰ ਉਸ ਈ-ਮੇਲ ਵਿਚਲੀਆਂ ਹਦਾਇਤਾਂ ਤੇ ਅਮਲ ਕਰਨਾ ਹੋਵੇਗਾ।',
+'throttled-mailpassword' => 'ਆਖ਼ਰੀ {{PLURAL:$1|ਇੱਕ ਘੰਟੇ|$1 ਘੰਟਿਆਂ}} ਵਿਚ ਇੱਕ ਪਾਸਵਰਡ ਯਾਦ-ਦਹਾਨੀ ਪਹਿਲਾਂ ਹੀ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।
+ਗ਼ਲਤ ਵਰਤੋਂ ਤੋਂ ਬਚਣ ਲਈ, {{PLURAL:$1|ਇੱਕ ਘੰਟੇ|$1 ਘੰਟਿਆਂ}} ਵਿੱਚ ਸਿਰਫ਼ ਇੱਕ ਹੀ ਪਾਸਵਰਡ ਯਾਦ-ਦਹਾਨੀ ਭੇਜੀ ਜਾਂਦੀ ਹੈ।',
 'mailerror' => 'ਈਮੇਲ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: $1',
 'acct_creation_throttle_hit' => 'ਅਫਸੋਸ ਹੈ, ਪਰ ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ $1 ਅਕਾਊਂਟ ਬਣਾ ਚੁੱਕੇ ਹੋ। ਤੁਸੀਂ ਹੋਰ ਨਹੀਂ ਬਣਾ ਸਕਦੇ।',
 'emailauthenticated' => 'ਤੁਹਾਡਾ ਈਮੇਲ ਐਡਰੈੱਸ $1 ਉੱਤੇ ਪਰਮਾਣਿਤ ਕੀਤਾ ਗਿਆ ਹੈ।',
@@ -403,10 +536,23 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'noemailprefs' => 'ਇਹ ਫੀਚਰ ਵਰਤਣ ਲਈ ਇੱਕ ਈਮੇਲ ਐਡਰੈੱਸ ਦਿਓ।।',
 'emailconfirmlink' => 'ਆਪਣਾ ਈ-ਮੇਲ ਐਡਰੈੱਸ ਕਨਫਰਮ ਕਰੋ।',
 'invalidemailaddress' => 'ਈਮੇਲ ਐਡਰੈੱਸ ਮਨਜ਼ੂਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਕਿਉਂਕਿ ਇਹ ਠੀਕ ਫਾਰਮੈਟ ਨਹੀਂ ਜਾਪਦਾ ਹੈ। ਇੱਕ ਠੀਕ ਫਾਰਮੈਟ ਵਿੱਚ ਦਿਓ ਜਾਂ ਇਹ ਖੇਤਰ ਖਾਲੀ ਛੱਡ ਦਿਓ।',
+'cannotchangeemail' => 'ਇਸ ਵਿਕੀ ਤੇ ਈ-ਮੇਲ ਪਤੇ ਬਦਲੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।',
+'emaildisabled' => 'ਇਹ ਸਾਈਟ ਈ-ਮੇਲਾਂ ਨਹੀਂ ਭੇਜ ਸਕਦੀ।',
 'accountcreated' => 'ਅਕਾਊਂਟ ਬਣਾਇਆ',
 'accountcreatedtext' => '$1 ਲਈ ਯੂਜ਼ਰ ਅਕਾਊਂਟ ਬਣਾਇਆ ਗਿਆ।',
 'createaccount-title' => '{{SITENAME}} ਲਈ ਅਕਾਊਂਟ ਬਣਾਉਣਾ',
-'loginlanguagelabel' => 'ਭਾਸ਼ਾ: $1',
+'createaccount-text' => 'ਕਿਸੇ ਨੇ "$2" ਮੈਂਬਰ-ਨਾਮ ਅਤੇ "$3" ਪਾਸਵਰਡ ਨਾਲ਼ {{SITENAME}} ($4) ਤੇ, ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਵਰਤਦੇ ਹੋਏ, ਖਾਤਾ ਬਣਾਇਆ ਹੈ।
+ਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣਾ ਚਾਹੀਦਾ ਹੈ।
+
+ਜੇ ਇਹ ਖਾਤਾ ਗ਼ਲਤੀ ਨਾਲ਼ ਬਣ ਗਿਆ ਹੈ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਸਕਦੇ ਹੋ।',
+'usernamehasherror' => 'ਮੈਂਬਰ-ਨਾਮ ਵਿਚ ਹੈਸ਼ ਅੱਖਰ ਨਹੀਂ ਹੋ ਸਕਦੇ',
+'login-throttled' => 'ਤੁਸੀਂ ਬਹੁਤ ਸਾਰੀਆਂ ਤਾਜ਼ਾ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।
+ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜੀ ਉਡੀਕ ਕਰੋ।',
+'login-abort-generic' => 'ਤੁਹਾਡੀ ਲਾਗਇਨ ਨਾਕਾਮ ਸੀ - ਰੱਦ',
+'loginlanguagelabel' => 'ਬੋਲੀ: $1',
+
+# E-mail sending
+'user-mail-no-addy' => 'ਬਿਨਾਂ ਈ-ਮੇਲ ਪਤਾ ਦਿੱਤੇ ਈ-ਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ।',
 
 # Change password dialog
 'resetpass' => 'ਪਾਸਵਰਡ ਬਦਲੋ',
@@ -418,142 +564,328 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'resetpass_submit' => 'ਪਾਸਵਰਡ ਸੈੱਟ ਕਰੋ ਅਤੇ ਲਾਗਇਨ ਕਰੋ',
 'resetpass_success' => 'ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਠੀਕ ਤਰਾਂ ਬਦਲਿਆ ਗਿਆ ਹੈ! ਹੁਣ ਤੁਸੀਂ ਲਾਗਇਨ ਕਰ ਸਕਦੇ ਹੋ...',
 'resetpass_forbidden' => 'ਪਾਸਵਰਡ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
+'resetpass-no-info' => 'ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।',
 'resetpass-submit-loggedin' => 'ਪਾਸਵਰਡ ਬਦਲੋ',
 'resetpass-submit-cancel' => 'ਰੱਦ ਕਰੋ',
+'resetpass-wrong-oldpass' => 'ਗ਼ਲਤ ਆਰਜ਼ੀ ਜਾਂ ਚਾਲੂ ਪਾਸਵਰਡ।
+ਸ਼ਾਇਦ ਤੁਸੀਂ ਕਾਮਯਾਬੀ ਨਾਲ਼ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲ ਚੁੱਕੇ ਹੋ ਜਾਂ ਆਰਜ਼ੀ ਪਾਸਵਰਡ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਸੀ।',
 'resetpass-temp-password' => 'ਆਰਜ਼ੀ ਪਾਸਵਰਡ:',
 
+# Special:PasswordReset
+'passwordreset' => 'ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਕਰੋ',
+'passwordreset-text' => 'ਆਪਣੇ ਖਾਤੇ ਦੀ ਤਫ਼ਸੀਲ ਦੀ ਈ-ਮੇਲ ਹਾਸਲ ਕਰਨ ਲਈ ਇਹ ਫ਼ਾਰਮ ਮੁਕੰਮਲ ਕਰੋ।',
+'passwordreset-legend' => 'ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਕਰੋ',
+'passwordreset-disabled' => 'ਇਸ ਵਿਕੀ ਤੇ ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਬੰਦ ਕੀਤੇ ਗਏ ਹਨ।',
+'passwordreset-username' => 'ਮੈਂਬਰ-ਨਾਂ:',
+'passwordreset-domain' => 'ਡੋਮੇਨ:',
+'passwordreset-email' => 'ਈ-ਮੇਲ ਪਤਾ:',
+'passwordreset-emailtitle' => '{{SITENAME}} ਤੇ ਖਾਤੇ ਦੀ ਜਾਣਕਾਰੀ',
+'passwordreset-emailtext-ip' => 'ਕਿਸੇ ਨੇ (ਸ਼ਾਇਦ ਤੁਸੀਂ, IP ਪਤਾ $1 ਤੋਂ) {{SITENAME}}
+($4) ਲਈ ਖਾਤਾ ਤਫ਼ਸੀਲ ਯਾਦ-ਦਹਾਨੀ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਹ {{PLURAL:
+$3|ਖਾਤਾ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜਿਆ ਹੈ|ਖਾਤੇ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜੇ ਹਨ}}:
+$2
+
+ਇਹ ਆਰਜ਼ੀ ਪਾਸਵਰਡ
+{{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} ਵਿਚ ਖ਼ਤਮ ਹੋ {{PLURAL:$3|ਜਾਵੇਗਾ|ਜਾਣਗੇ}}।
+ਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਨਵਾਂ ਪਾਸਵਰਡ ਬਣਾਉਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਸੀ ਜਾਂ ਜੇ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਯਾਦ ਹੈ ਅਤੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ।',
+'passwordreset-emailelement' => 'ਮੈਂਬਰ-ਨਾਂ: $1
+ਆਰਜ਼ੀ ਪਾਸਵਰਡ: $2',
+'passwordreset-emailsent' => 'ਇੱਕ ਯਾਦ-ਦਹਾਨੀ ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।',
+'passwordreset-emailsent-capture' => 'ਇੱਕ ਯਾਦ-ਦਹਾਨੀ ਈ-ਮੇਲ, ਜਿਹੜੀ ਕਿ ਹੇਠਾਂ ਦਿੱਸ ਰਹੀ ਹੈ, ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।',
+
+# Special:ChangeEmail
+'changeemail' => 'ਈ-ਮੇਲ ਪਤਾ ਬਦਲੋ',
+'changeemail-header' => 'ਖਾਤੇ ਵਾਲ਼ਾ ਈ-ਮੇਲ ਪਤਾ ਬਦਲੋ',
+'changeemail-text' => 'ਆਪਣਾ ਈ-ਮੇਲ ਪਤਾ ਬਦਲਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਮੁਕੰਮਲ ਕਰੋ। ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਤਸਦੀਕ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖ਼ਲ ਕਰਨਾ ਪਵੇਗਾ।',
+'changeemail-no-info' => 'ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।',
+'changeemail-oldemail' => 'ਚਾਲੂ ਈ-ਮੇਲ ਪਤਾ:',
+'changeemail-newemail' => 'ਨਵਾਂ ਈ-ਮੇਲ ਪਤਾ:',
+'changeemail-none' => '(ਕੋਈ ਨਹੀਂ)',
+'changeemail-submit' => 'ਈ-ਮੇਲ ਬਦਲੋ',
+'changeemail-cancel' => 'ਰੱਦ ਕਰੋ',
+
 # Edit page toolbar
-'bold_sample' => 'à¨\97à©\82à©\9cਾ à¨\9fà©\88à¨\95ਸà¨\9f',
-'bold_tip' => 'ਬà©\8bਲਡ à¨\9fà©\88à¨\95ਸà¨\9f',
-'italic_sample' => 'ਤਿਰà¨\9bਾ à¨\9fà©\88à¨\95ਸà¨\9f',
-'italic_tip' => 'ਤਿਰà¨\9bਾ à¨\9fà©\88à¨\95ਸà¨\9f',
-'link_sample' => 'ਲਿੰà¨\95 à¨\9fਾà¨\87à¨\9fਲ',
+'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 à¨¦à¨¾ à¨¸à¨¿à¨°à¨²à©\87à¨\96',
 'link_tip' => 'ਅੰਦਰੂਨੀ ਲਿੰਕ',
-'extlink_sample' => 'http://www.example.com à¨²à¨¿à©°à¨\95 à¨\9fਾà¨\88à¨\9fਲ',
-'extlink_tip' => 'ਬਾਹਰà©\80 à¨\95à©\9cà©\80ਅਗੇਤਰ http:// ਯਾਦ ਰੱਖੋ)',
-'headline_sample' => 'ਹà©\88ੱਡਲਾà¨\88ਨ à¨\9fà©\88à¨\95ਸà¨\9f',
-'headline_tip' => 'ਦà©\82ਸਰੇ ਦਰਜੇ ਦਾ ਸਿਰਲੇਖ',
+'extlink_sample' => 'http://www.example.com à¨²à¨¿à©°à¨\95 à¨¸à¨¿à¨°à¨²à©\87à¨\96',
+'extlink_tip' => 'ਬਾਹਰà©\80 à¨²à¨¿à©°à¨\95 (ਅਗੇਤਰ http:// ਯਾਦ ਰੱਖੋ)',
+'headline_sample' => 'ਸà©\81ਰà¨\96਼à©\80 à¨¦à©\80 à¨²à¨¿à¨\96ਤ',
+'headline_tip' => 'ਦà©\82à¨\9cੇ ਦਰਜੇ ਦਾ ਸਿਰਲੇਖ',
 'nowiki_sample' => 'ਅਸੰਗਠਿਤ ਪਾਠ (NON -FORMATTED) ਇੱਥੇ ਰਖੋ।',
-'nowiki_tip' => 'ਵਿà¨\95ਿ à¨¸à©°à¨\97ਠਨਾ (formatting) à¨¨à¨\9c਼ਰà¨\85ਦਾਜ਼ ਕਰੋ',
+'nowiki_tip' => 'ਵਿà¨\95à©\80 à¨«à¨¼à©\8cਰਮà©\88à¨\9fਿੰà¨\97 à¨¨à¨\9c਼ਰà¨\85à©°ਦਾਜ਼ ਕਰੋ',
 'image_tip' => 'ਇੰਬੈੱਡ ਚਿੱਤਰ',
 'media_tip' => 'ਮੀਡਿਆ ਫਾਇਲ ਲਿੰਕ',
-'sig_tip' => 'à¨\9fਾà¨\88ਮ-ਸà¨\9fà©\88à¨\82ਪ à¨¨à¨¾à¨² à¨¤à©\81ਹਾਡà©\87 à¨¦à¨¸à¨¤à¨\96ਤ',
-'hr_tip' => 'ਹਰà©\80à¨\9cੱà¨\9fਲ ਲਾਈਨ (use sparingly)',
+'sig_tip' => 'ਤà©\81ਹਾਡà©\87 à¨¦à¨¸à¨¤à¨\96਼ਤ à¨µà¨\95ਤ à¨¸à¨®à©\87ਤ',
+'hr_tip' => 'ਲà©\87à¨\9fਵà©\80à¨\82 ਲਾਈਨ (use sparingly)',
 
 # Edit pages
-'summary' => 'ਸੰà¨\96à©\87ਪ:',
+'summary' => 'ਸਾਰ:',
 'subject' => 'ਵਿਸ਼ਾ/ਹੈੱਡਲਾਈਨ:',
 'minoredit' => 'ਇਹ ਛੋਟੀ ਸੋਧ ਹੈ',
-'watchthis' => 'à¨\87ਹ à¨ªà©\87à¨\9c à¨µà¨¾à¨\9a à¨\95ਰੋ',
-'savearticle' => 'ਪà©\87à¨\9c à¨¸à©°à¨­à¨¾à¨²ੋ',
+'watchthis' => 'à¨\87ਸ à¨¸à¨«à¨¼à©\87 â\80\99ਤà©\87 à¨¨à¨\9c਼ਰ à¨°à©±à¨\96ੋ',
+'savearticle' => 'ਸਫ਼ਾ à¨¸à¨¾à¨\82ਭੋ',
 'preview' => 'ਝਲਕ',
 'showpreview' => 'ਝਲਕ ਵੇਖੋ',
 'showlivepreview' => 'ਲਾਈਵ ਝਲਕ',
-'showdiff' => 'ਬਦਲਾਅ ਵੇਖਾਓ',
-'anoneditwarning' => "'''ਚੇਤਾਵਨੀ:''' ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੈ। ਤੁਹਾਡਾ IP ਐਡਰੈੱਸ ਇਸ ਪੇਜ ਦੇ ਐਡਿਟ ਅਤੀਤ ਵਿੱਚ ਰਿਕਾਰਡ ਕੀਤਾ ਜਾਵੇਗਾ।",
+'showdiff' => 'ਤਬਦੀਲੀ ਵੇਖੋ',
+'anoneditwarning' => "'''ਚੇਤਾਵਨੀ:''' ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੈ। ਤੁਹਾਡਾ IP ਐਡਰੈੱਸ ਇਸ ਸਫ਼ੇ ਦੇ ਅਤੀਤ ਵਿੱਚ ਰਿਕਾਰਡ ਕੀਤਾ ਜਾਵੇਗਾ।",
+'anonpreviewwarning' => "''ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ। ਤਬਦੀਲੀ ਸਾਂਭਣ ਨਾਲ਼ ਤੁਹਾਡਾ IP ਪਤਾ ਸਫ਼ੇ ਦੇ ਸੋਧ ਅਤੀਤ ਵਿਚ ਰਿਕਾਰਡ ਹੋ ਜਾਵੇਗਾ।''",
+'missingsummary' => "'''ਯਾਦ-ਦਹਾਨੀ:''' ਤੁਸੀਂ ਸੋਧ ਸਾਰ ਮੁਹੱਈਆ ਨਹੀਂ ਕਰਵਾਇਆ। ਜੇ ਤੁਸੀਂ \"{{int:savearticle}}\" ਤੇ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕੀਤਾ ਤਾਂ ਤੁਹਾਡਾ ਸਫ਼ਾ ਇਸਦੇ ਬਿਨਾਂ ਹੀ ਸਾਂਭਿਆ ਜਾਵੇਗਾ।",
 'missingcommenttext' => 'ਹੇਠਾਂ ਇੱਕ ਟਿੱਪਣੀ ਦਿਓ।',
 'summary-preview' => 'ਸੰਖੇਪ ਝਲਕ:',
 'subject-preview' => 'ਵਿਸ਼ਾ/ਹੈੱਡਲਾਈਨ ਝਲਕ:',
 'blockedtitle' => 'ਯੂਜ਼ਰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ',
+'blockedtext' => "'''ਤੁਹਾਡੇ ਮੈਂਬਰ-ਨਾਂ ਜਾਂ IP ਪਤੇ ਉੱਤੇ ਪਾਬੰਦੀ ਲੱਗ ਚੁੱਕੀ ਹੈ।'''
+
+ਪਾਬੰਦੀ $1 ਨੇ ਲਾਈ ਹੈ।
+ਦਿੱਤਾ ਗਿਆ ਕਾਰਨ ਇਹ ਹੈ, ''$2''।
+
+* ਪਾਬੰਦੀ ਸ਼ੁਰੂ: $8
+* ਪਾਬੰਦੀ ਖ਼ਤਮ: $6
+* ਪਾਬੰਦੀ ਲਾਉਣ ਵਾਲ਼ੇ ਦਾ ਇਰਾਦਾ: $7
+
+ਪਾਬੰਦੀ ਬਾਰੇ ਚਰਚਾ ਕਰਨ ਲਈ ਤੁਸੀਂ $1 ਜਾਂ ਕਿਸੇ ਹੋਰ
+[[{{MediaWiki:Grouppage-
+sysop}}|administrator]] ਨਾਲ਼ ਰਾਬਤਾ ਕਰ ਸਕਦੇ ਹੋ।
+ਤੁਸੀਂ 'ਇਸ ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ' ਸਹੂਲਤ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਸਕਦੇ ਜੇ ਤੁਹਾਡੀਆਂ [[Special:Preferences|ਖਾਤਾ ਪਸੰਦਾਂ]] ਵਿਚ ਇੱਕ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਨਹੀਂ ਦਿੱਤਾ ਗਿਆ ਅਤੇ ਜੇ ਤੁਹਾਡੇ ਇਸਨੂੰ ਵਰਤਣ ਤੇ ਪਾਬੰਦੀ ਹੈ।
+ਤੁਹਾਡਾ ਚਾਲੂ IP ਪਤਾ $3 ਹੈ,
+ਅਤੇ ਪਾਬੰਦੀ ਪਤਾ #$5 ਹੈ।
+ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਆਪਣੇ ਕਿਸੇ ਵੀ ਸਵਾਲ ਜਾਂ ਪੁੱਛ-ਗਿੱਛ ਵਿਚ ਇਹ ਉੱਪਰਲੀ ਤਫ਼ਸੀਲ ਜ਼ਰੂਰ ਸ਼ਾਮਲ ਕਰੋ।",
+'blockednoreason' => 'ਕੋਈ ਕਾਰਨ ਨਹੀਂ ਦੱਸਿਆ ਗਿਆ',
 'whitelistedittext' => 'ਪੇਜ ਸੋਧਣ ਲਈ ਤੁਹਾਨੂੰ $1 ਕਰਨਾ ਪਵੇਗਾ।',
+'confirmedittext' => 'ਸਫ਼ਿਆਂ ਨੂੰ ਸੋਧਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਨੂੰ ਆਪਣਾ ਈ-ਮੇਲ ਪਤਾ ਤਸਦੀਕ ਕਰਨਾ ਪਵੇਗਾ।
+ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਆਪਣੀਆਂ [[Special:Preferences|ਖਾਤਾ ਪਸੰਦਾ]] ਜ਼ਰੀਏ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦਿਓ ਅਤੇ ਤਸਦੀਕ ਕਰੋ।',
 'nosuchsectiontitle' => 'ਇੰਝ ਦਾ ਕੋਈ ਸ਼ੈਕਸ਼ਨ ਨਹੀਂ ਹੈ।',
+'nosuchsectiontext' => 'ਤੁਸੀਂ ਨਾ-ਮੌਜੂਦ ਸੈਕਸ਼ਨ ਨੂੰ ਸੋਧਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਹੈ।
+ਸ਼ਾਇਦ ਤੁਹਾਡੇ ਸਫ਼ੇ ਨੂੰ ਵੇਖਣ ਦੇ ਦੌਰਾਨ ਇਹ ਮਿਟਾਇਆ ਜਾਂ ਇਸਦਾ ਸਿਰਲੇਖ ਬਦਲਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।',
 'loginreqtitle' => 'ਲਾਗਇਨ ਚਾਹੀਦਾ ਹੈ',
 'loginreqlink' => 'ਲਾਗਇਨ',
 'loginreqpagetext' => 'ਹੋਰ ਪੇਜ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ $1 ਕਰਨਾ ਪਵੇਗਾ।',
 'accmailtitle' => 'ਪਾਸਵਰਡ ਭੇਜਿਆ।',
 'accmailtext' => '"$1" ਲਈ ਪਾਸਵਰਡ $2 ਨੂੰ ਭੇਜਿਆ ਗਿਆ।',
 'newarticle' => '(ਨਵਾਂ)',
-'newarticletext' => "ਤੁਸੀਂ ਕਿਸੇ ਐਸੇ ਲਿੰਕ ਰਾਹੀਂ ਉਸ ਪੰਨੇ ਤੇ ਪੁੱਜੇ ਹੋ ਜੋ ਅਜੇ ਬਣਾਇਆ ਨਹੀਂ ਗਿਆ।
-ਪੰਨਾ ਬਨਾਉਣ ਲਈ  ਹੇਠ ਦਿੱਤੇ ਖਾਨੇ ਵਿਚ ਪਾਠ ਲਿਖੋ।(ਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ [[{{MediaWiki:Helppage}}|ਮੱਦਦ ਪੰਨਾ]] ਦੇਖੋ)
-ਜੇ ਤੁਸੀਂ ਇੱਥੇ ਗਲਤੀ ਨਾਲ ਆਏ ਹੋ ਤਾਂ ਆਪਣੇ ਬਰਾਊਜ਼ਰ ਦੇ ਬੈਕ ('''back''') ਬਟਨ ਪਰ ਕਲਿਕ ਕਰੋ।",
-'noarticletext' => 'ਫਿਲਹਾਲ ਇਸ ਪੰਨੇ ਤੇ ਐਸਾ ਕੋਈ ਪਾਠ ਨਹੀਂ ਹੈ।ਤੁਸੀਂ ਦੂਸਰੇ ਪੰਨਿਆਂ ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਪਾਠ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ।,<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਸੰਭੰਧਿਤ ਖਾਤਿਆਂ ਵਿਚ ਖੋਜ ਸਕਦੇ ਹੋ],
-ਯਾ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਪੰਨੇ ਨੂੰ ਸੰਪਾਦਨ ਕਰ ਸਕਦੇ ਹੋ]</span>।',
-'noarticletext-nopermission' => '↓
-ਫਿਲਹਾਲ ਇਸ ਪੰਨੇ ਤੇ ਐਸਾ ਕੋਈ ਪਾਠ ਨਹੀਂ ਹੈ।ਤੁਸੀਂ ਦੂਸਰੇ ਪੰਨਿਆਂ ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਪਾਠ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ।,<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਸੰਬੰਧਿਤ ਖਾਤਿਆਂ ਵਿਚ ਖੋਜ ਸਕਦੇ ਹੋ],
-ਯਾ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਪੰਨੇ ਨੂੰ ਸੰਪਾਦਨ ਕਰ ਸਕਦੇ ਹੋ]</span>।',
+'newarticletext' => "ਤੁਸੀਂ ਕਿਸੇ ਐਸੇ ਲਿੰਕ ਰਾਹੀਂ ਇਸ ਸਫ਼ੇ ’ਤੇ ਪੁੱਜੇ ਹੋ ਜੋ ਹਾਲੇ ਬਣਾਇਆ ਨਹੀਂ ਗਿਆ।
+ਸਫ਼ਾ ਬਣਾਉਣ ਲਈ ਹੇਠ ਦਿੱਤੇ ਖ਼ਾਨੇ ਵਿਚ ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ। (ਹੋਰ ਮਦਦ ਲਈ [[{{MediaWiki:Helppage}}|ਮਦਦ ਸਫ਼ਾ]] ਵੇਖੋ)
+ਜੇ ਤੁਸੀਂ ਗ਼ਲਤੀ ਨਾਲ਼ ਇੱਥੇ ਆਏ ਹੋ ਤਾਂ ਆਪਣੇ ਬਰਾਊਜ਼ਰ ਦੇ ''ਪਿੱਛੇ'' (back) ਬਟਨ ’ਤੇ ਕਲਿੱਕ ਕਰੋ।",
+'anontalkpagetext' => "----''ਇਹ ਇਕ ਗੁਮਨਾਮ ਮੈਂਬਰ ਲਈ ਇਕ ਚਰਚਾ ਸਫ਼ਾ ਹੈ ਜਿਸਨੇ ਹਾਲੇ ਖਾਤਾ ਨਹੀ ਬਣਾਇਆ ਜਾਂ ਉਸਨੂੰ ਵਰਤ ਨਹੀਂ ਰਿਹਾ।
+ਇਸ ਵਾਸਤੇ ਸਾਡੇ ਕੋਲ ਉਸਨੂੰ ਪਛਾਨਣ ਲਈ IP ਪਤਾ ਹੈ।
+ਇਕ IP ਪਤਾ ਕਈ ਵਰਤਣ ਵਾਲ਼ਿਆਂ ਦੁਆਰਾ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।
+ਜੇ ਤੁਸੀਂ ਇੱਕ ਗੁਮਨਾਮ ਮੈਂਬਰ ਹੋ ਅਤੇ ਸਮਝਦੇ ਹੋ ਕਿ ਇਹ ਟਿੱਪਣੀਆਂ ਤੁਹਾਡੇ ਲਈ ਹਨ ਤਾਂ ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਹੋਰਾਂ ਗੁਮਨਾਮ ਮੈਂਬਰਾਂ ਨਾਲ਼ ਪੈਦਾ ਹੋਣ ਵਾਲ਼ੀ ਉਲਝਣ ਤੋਂ ਬਚਣ ਲਈ [[Special:UserLogin/signup|ਖਾਤਾ ਬਣਾਓ]] ਜਾਂ [[Special:UserLogin|ਲਾਗਇਨ ਕਰੋ]]।''",
+'noarticletext' => 'ਫ਼ਿਲਹਾਲ ਇਸ ਸਫ਼ੇ ’ਤੇ ਕੋਈ ਲਿਖਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਦੂਜੇ ਸਫ਼ਿਆਂ ’ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਸਿਰਲੇਖ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਸਬੰਧਿਤ ਚਿੱਠੇ ਖੋਜ] ਸਕਦੇ ਹੋ ਜਾਂ ਇਸ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਸਫ਼ੇ ਵਿਚ ਲਿਖ] ਸਕਦੇ ਹੋ</span>।',
+'noarticletext-nopermission' => 'ਫ਼ਿਲਹਾਲ ਇਸ ਸਫ਼ੇ ’ਤੇ ਕੋਈ ਲਿਖਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਦੂਸਰੇ ਸਫ਼ਿਆਂ ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਪਾਠ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ, ਸਬੰਧਤ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਚਿੱਠੇ] ਖੋਜ ਸਕਦੇ ਹੋ, ਜਾਂ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਸਫ਼ੇ ਵਿਚ ਲਿਖ] ਸਕਦੇ ਹੋ</span>।',
+'userpage-userdoesnotexist' => 'ਮੈਂਬਰ ਖਾਤਾ "$1" ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।
+ਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਣਾਉਣਾ/ਸੋਧਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਮਿਰਬਾਨੀ ਕਰਕੇ ਜਾਂਚ ਕਰ ਲਓ।',
+'userpage-userdoesnotexist-view' => 'ਮੈਂਬਰ ਖਾਤਾ "$1" ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।',
+'blocked-notice-logextract' => 'ਇਹ ਮੈਂਬਰ ਇਸ ਵੇਲ਼ੇ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।
+ਹਵਾਲੇ ਲਈ ਪਾਬੰਦੀ ਚਿੱਠੇ ਦਾ ਨਵਾਂ ਦਾਖ਼ਲਾ ਹੇਠ ਦਿੱਤਾ ਗਿਆ ਹੈ:',
+'usercssyoucanpreview' => "'''ਟੋਟਕਾ:''' ਆਪਣੇ ਨਵੇਂ CSS ਸਫ਼ੇ ਨੂੰ ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਪਰਖ ਕਰਨ ਲਈ \"{{int:showpreview}}\" ਬਟਨ ਵਰਤੋ।",
+'userjsyoucanpreview' => "'''ਟੋਟਕਾ:''' ਆਪਣੀ ਜਾਵਾਸਕ੍ਰਿਪਟ ਨੂੰ ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਪਰਖ ਕਰਨ ਲਈ \"{{int:showpreview}}\" ਬਟਨ ਵਰਤੋ।",
+'usercsspreview' => "'''ਯਾਦ ਰੱਖੋ ਤੁਸੀਂ ਆਪਣੀ ਮੈਂਬਰ CSS ਦੀ ਸਿਰਫ਼ ਇਕ ਝਲਕ ਵੇਖ ਰਹੇ ਹੋ।'''
+'''ਇਹ ਹਾਲੇ ਸਾਂਭੀ ਨਹੀਂ ਗਈ ਹੈ!'''",
+'userjspreview' => "'''ਯਾਦ ਰੱਖੋ ਤੁਸੀਂ ਆਪਣੀ ਮੈਂਬਰ ਜਾਵਾਸਕ੍ਰਿਪਟ ਦੀ ਸਿਰਫ਼ ਇਕ ਪਰਖ/ਝਲਕ ਵੇਖ ਰਹੇ ਹੋ।'''
+'''ਇਹ ਹਾਲੇ ਸਾਂਭੀ ਨਹੀਂ ਗਈ ਹੈ!'''",
+'sitecsspreview' => "'''ਯਾਦ ਰੱਖੋ ਤੁਸੀਂ ਇਸ CSS ਦੀ ਸਿਰਫ਼ ਇਕ ਝਲਕ ਵੇਖ ਰਹੇ ਹੋ।'''
+'''ਇਹ ਹਾਲੇ ਸਾਂਭੀ ਨਹੀਂ ਗਈ ਹੈ!'''",
+'sitejspreview' => "'''ਯਾਦ ਰੱਖੋ ਤੁਸੀਂ ਇਸ ਜਾਵਾਸਕ੍ਰਿਪਟ ਕੋਡ ਦੀ ਸਿਰਫ਼ ਇਕ ਝਲਕ ਵੇਖ ਰਹੇ ਹੋ।'''
+'''ਇਹ ਹਾਲੇ ਸਾਂਭੀ ਨਹੀਂ ਗਈ ਹੈ!'''",
 'updated' => '(ਅੱਪਡੇਟ)',
 'note' => "'''ਨੋਟ:'''",
-'previewnote' => 'ਇਹ ਸਿਰਫ਼ ਇੱਕ ਝਲਕ ਹੈ; ਬਦਲਾਅ ਹਾਲੇ ਸੰਭਾਲੇ ਨਹੀਂ ਗਏ ਹਨ!',
+'previewnote' => 'ਯਾਦ ਰੱਖੋ ਇਹ ਸਿਰਫ਼ ਇੱਕ ਝਲਕ ਹੈ; ਤੁਹਾਡੀਆਂ ਤਬਦੀਲੀਆਂ ਹਾਲੇ ਸਾਂਭੀਆਂ ਨਹੀਂ ਗਈਆਂ!',
+'continue-editing' => 'ਸੋਧਣਾ ਜਾਰੀ ਰੱਖੋ',
+'previewconflict' => 'ਇਹ ਝਲਕ ਲਿਖਤ ਦਾ ਓਹ ਅਕਸ ਪੇਸ਼ ਕਰਦੀ ਹੈ ਜਿਵੇਂ ਓਹ ਤੁਹਾਡੇ ਸਾਂਭੇ ਜਾਣ ਤੋਂ ਬਾਅਦ ਦਿੱਸੇਗਾ।',
 'editing' => '$1 ਸੋਧਿਆ ਜਾ ਰਿਹਾ ਹੈ',
-'editingsection' => '$1 (ਸ਼ੈਕਸ਼ਨ) ਸੋਧ',
+'creating' => '$1 ਬਣਾ ਰਹੇ ਹੋ',
+'editingsection' => '$1 ਜ਼ੇਰੇ ਸੁਧਾਈ ਹੈ (ਸ਼ੈਕਸ਼ਨ)',
 'editingcomment' => '$1 (ਟਿੱਪਣੀ) ਸੋਧ',
 'editconflict' => 'ਅਪਵਾਦ ਟਿੱਪਣੀ: $1',
 'yourtext' => 'ਤੁਹਾਡਾ ਟੈਕਸਟ',
 'storedversion' => 'ਸੰਭਾਲਿਆ ਵਰਜਨ',
 'yourdiff' => 'ਅੰਤਰ',
-'templatesused' => 'ਇਸ ਸਫੇ ਤੇ ਪ੍ਰ੍ਯੋਗਿਤ {{PLURAL:$1|ਫਰਮਾ|ਫਰਮੇ}}:',
+'longpageerror' => "'''ਗ਼ਲਤੀ: ਤੁਹਾਡੀ ਪੇਸ਼ ਕੀਤੀ ਲਿਖਤ {{PLURAL:$1|ਇੱਕ ਕਿਲੋਬਾਈਟ|$1 ਕਿਲੋਬਾਈਟ}} ਦੀ ਹੈ ਜੋ ਕਿ {{PLURAL:$2|ਇੱਕ ਕਿਲੋਬਾਈਟ|$2 ਕਿਲੋਬਾਈਟ}} ਦੇ ਵੱਧ ਤੋਂ ਵੱਧ ਅਕਾਰ ਤੋਂ ਜ਼ਿਆਦਾ ਹੈ।'''
+ਇਹ ਸਾਂਭੀ ਨਹੀਂ ਜਾ ਸਕਦੀ।",
+'readonlywarning' => "'''ਖ਼ਬਰਦਾਰ: ਡੈਟਾਬੇਸ ਰੱਖ-ਰਖਾਵ ਦੇ ਕਰਕੇ ਤਾਲਾ-ਬੱਧ ਹੈ ਇਸ ਕਰਕੇ ਤੁਸੀਂ ਹੁਣੇ ਆਪਣੀ ਤਬਦੀਲੀ ਨਹੀਂ ਸਾਂਭ ਸਕਦੇ।'''
+ਸ਼ਾਇਦ ਤੁਸੀਂ ਇਸ ਲਿਖਤ ਨੂੰ ਕੱਟ ਅਤੇ ਪੇਸਟ ਕਰ ਕੇ ਇਕ ਫ਼ਾਈਲ ਵਜੋਂ ਬਾਅਦ ਵਿਚ ਵਰਤਣ ਲਈ ਸਾਂਭਣਾ ਚਾਹੋਗੇ।
+
+ਜਿਹੜੇ ਪ੍ਰਬੰਧਕ ਨੇ ਇਸਨੂੰ ਤਾਲਾ ਲਾਇਆ ਹੈ ਉਸਦਾ ਕਹਿਣਾ ਹੈ ਕਿ: $1",
+'protectedpagewarning' => "'''ਖ਼ਬਰਦਾਰ: ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਹੈ ਜਿਸ ਕਰਕੇ ਸਿਰਫ਼ ਐਡਮਨਿਸਟ੍ਰੇਟਰ ਹੱਕ ਵਾਲ਼ੇ ਮੈਂਬਰ ਹੀ ਇਸ ਨੂੰ ਸੋਧ ਸਕਦੇ ਹਨ।'''
+ਚਿੱਠੇ ਦਾ ਨਵਾਂ ਦਾਖ਼ਲਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
+'semiprotectedpagewarning' => "'''ਨੋਟ:''' ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਹੈ ਤਾਂ ਕਿ ਸਿਰਫ਼ ਰਜਿਸਟਰ ਹੋਏ ਮੈਂਬਰ ਹੀ ਇਸ ਨੂੰ ਸੋਧ ਸਕਣ।
+ਚਿੱਠੇ ਵਿਚਲਾ ਨਵਾਂ ਦਾਖ਼ਲਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
+'titleprotectedwarning' => "'''ਖ਼ਬਰਦਾਰ: ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਹੈ ਸੋ ਇਸਨੂੰ ਬਣਾਉਣ ਲਈ [[Special:ListGroupRights|ਖ਼ਾਸ ਹੱਕਾਂ]] ਦੀ ਲੋੜ ਹੈ।'''
+ਚਿੱਠੇ ਦਾ ਨਵਾਂ ਦਾਖ਼ਲਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
+'templatesused' => 'ਇਸ ਸਫੇ ’ਤੇ {{PLURAL:$1|ਵਰਤਿਆ ਸਾਂਚਾ|ਵਰਤੇ ਸਾਂਚੇ}}:',
 'templatesusedpreview' => "{{PLURAL:$1|ਟੈਪਲੇਟ|ਟੈਪਲੇਟ}} ਇਹ ਝਲਕ 'ਚ ਵਰਤੇ ਜਾਂਦੇ ਹਨ:",
 'templatesusedsection' => 'ਇਹ ਸ਼ੈਕਸ਼ਨ ਵਿੱਚ ਟੈਪਲੇਟ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ:',
 'template-protected' => '(ਸੁਰੱਖਿਅਤ)',
-'template-semiprotected' => '(ਅਰਧ-ਸੁਰੱਖਿਅਤ)',
+'template-semiprotected' => '(ਨੀਮ-ਸੁਰੱਖਿਅਤ)',
+'hiddencategories' => 'ਇਹ ਸਫ਼ਾ {{PLURAL:$1|1 ਲੁਕਵੀਂ ਸ਼੍ਰੇਣੀ|
+$1 ਲੁਕਵੀਆਂ ਸ਼੍ਰੇਣੀਆਂ}} ਦਾ ਮੈਂਬਰ ਹੈ:',
+'nocreatetitle' => 'ਸਫ਼ਾ ਬਣਾਉਣ ਦੀ ਹੱਦ ਹੈ',
+'nocreatetext' => '{{SITENAME}} ਨੇ ਨਵੇਂ ਸਫ਼ੇ ਬਣਾਉਣ ਤੇ ਰੋਕ ਲਾਈ ਹੋਈ ਹੈ।
+ਤੁਸੀਂ ਵਾਪਸ ਜਾ ਕੇ ਮੌਜੂਦਾ ਸਫ਼ੇ ਸੋਧ ਸਕਦੇ ਹੋ ਜਾਂ [[Special:UserLogin|ਲਾਗਇਨ ਜਾਂ ਖਾਤਾ ਬਣਾ]] ਸਕਦੇ ਹੋ।',
+'nocreate-loggedin' => 'ਤੁਹਾਨੂੰ ਨਵੇਂ ਸਫ਼ੇ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
 'permissionserrors' => 'ਅਧਿਕਾਰ ਗਲਤੀਆਂ',
 'permissionserrorstext' => 'ਤੁਹਾਨੂੰ ਇੰਝ ਕਰਨ ਦੇ ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ। ਹੇਠ ਦਿੱਤੇ {{PLURAL:$1|ਕਾਰਨ|ਕਾਰਨ}} ਨੇ:',
-'recreate-moveddeleted-warn' => "'''ਖ਼ਬਰਦਾਰ: ਤੁਸੀਂ ਐਸ ਪੰਨਾ ਰਚ ਰਹੇ ਹੋ ਜਿਸ ਨੂੰ ਪਹਿਲੇ ਹਟਾਇਆ ਜਾ ਚੁੱਕ ਹੈ।'''
-ਖਿਆਲ ਕਰੋ ਕਿ ਕੀ ਇਸ ਪੰਨੇ ਦਾ ਕਾਇਮ ਰਹਿਣਾ ਠੀਕ ਹੈ।
-ਇਸ ਪੰਨੇ ਨੂੰ ਹਟਾਉਣ ਯਾ ਜਘ੍ਹਾ ਬਦਲੀ ਦਾ ਚਿੱਠਾ ਹੇਠਾਂ ਦਿੱਤਾ ਹੈ।",
-'moveddeleted-notice' => 'ਇਹ ਪੰਨਾ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।
-ਪੰਨੇ ਦੇ ਹਟਾਣ ਯਾ ਜਗ੍ਹਾ ਬਦਲੀ ਦਾ ਚਿੱਠਾ,ਹਵਾਲੇ ਲਈ ਹੇਠ ਦਿੱਤਾ ਹੈ।',
+'permissionserrorstext-withaction' => '{{PLURAL:$1|ਇਸ ਕਾਰਨ|ਇਹਨਾਂ ਕਾਰਨਾਂ}} ਕਰਕੇ ਤੁਹਾਨੂੰ $2 ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ:',
+'recreate-moveddeleted-warn' => "'''ਖ਼ਬਰਦਾਰ:
+ਤੁਸੀਂ ਐਸਾ ਸਫ਼ਾ ਬਣਾ ਰਹੇ ਹੋ ਜੋ ਪਹਿਲਾਂ ਮਿਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।'''
+
+ਖ਼ਿਆਲ ਕਰੋ ਕਿ ਕੀ ਇਸ ਸਫ਼ੇ ਦਾ ਕਾਇਮ ਰਹਿਣਾ ਠੀਕ ਹੈ।
+ਇਸਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸਿਰਲੇਖ ਬਦਲੀ ਦਾ ਚਿੱਠਾ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
+'moveddeleted-notice' => 'ਇਹ ਸਫ਼ਾ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।
+ਇਸਦੇ ਮਿਟਾਉਣ ਜਾਂ ਸਿਰਲੇਖ ਬਦਲੀ ਦਾ ਚਿੱਠਾ ਹਵਾਲੇ ਲਈ ਹੇਠ ਦਿੱਤਾ ਗਿਆ ਹੈ।',
+'log-fulllog' => 'ਪੂਰਾ ਚਿੱਠਾ ਵੇਖੋ',
+'edit-gone-missing' => 'ਸਫ਼ਾ ਅਪਡੇਟ ਨਹੀਂ ਹੋ ਸਕਿਆ।
+ਲਗਦਾ ਹੈ ਮਿਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।',
+'edit-no-change' => 'ਤੁਹਾਡੀ ਸੋਧ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ ਕਿਉਂਕਿ ਲਿਖਤ ਵਿਚ ਕੋਈ ਤਬਦੀਲੀ ਨਹੀਂ ਕੀਤੀ ਗਈ।',
+'edit-already-exists' => 'ਨਵਾਂ ਸਫ਼ਾ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਿਆ।
+ਇਹ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''ਖ਼ਬਰਦਾਰ: ਸੰਚੇ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਕੁਝ ਸੰਚੇ ਛੁਟ ਜਾਣਗੇ।",
-'post-expand-template-inclusion-category' => 'ਉਹ ਪੰਨੇ ਜਿਥੇ ਸੰਚਿਆਂ ਦਾ ਅਕਾਰ ਨਿਣਮਿਤ ਹੱਦ ਤੌਂ ਵੱਧ ਹੈ।',
-'post-expand-template-argument-warning' => "'''ਖ਼ਬਰਦਾਰ'''ਇਸ ਸਫ਼ੇ ਤੇ ਕਿਸੇ ਫ਼ਰਮੇ ਵਿਚ ਘੱਟੋ ਘੱਟ ਇਕ ਸਁਘਟਕ ਐਸਾ ਹੈ ਜਿਸ ਦਾ ਵਿਸਤ੍ਰਿਤ ਰੂਪ ਬਹੁਤ ਵੱਡਾ ਹੈ।ਐਸੇ ਸਁਘਟਕਾਂ ਨੂਁ ਛੱਡ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
+'post-expand-template-inclusion-warning' => "'''ਖ਼ਬਰਦਾਰ:''' ਟੈਂਪਲੇਟਾਂ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ। ਕੁਝ ਟੈਂਪਲੇਟ ਸ਼ਾਮਲ ਨਹੀਂ ਹੋਣਗੇ।",
+'post-expand-template-inclusion-category' => 'ਓਹ ਸਫ਼ੇ ਜਿੱਥੇ ਟੈਂਪਲੇਟਾਂ ਦੇ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਅਕਾਰ ਹੱਦੋਂ ਵਧ ਗਿਆ ਹੈ',
+'post-expand-template-argument-warning' => "'''ਖ਼ਬਰਦਾਰ:'''
+ਇਸ ਸਫ਼ੇ ਤੇ ਘੱਟੋ ਘੱਟ ਇਕ ਐਸੀ ਟੈਂਪਲੇਟ ਬਹਿਸ ਹੈ ਜਿਸ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ। ਐਸੀਆਂ ਬਹਿਸਾਂ ਨੂੰ ਛੱਡ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
 'post-expand-template-argument-category' => 'ਐਸੇ ਸਫ਼ੇ ਜਿਨ੍ਹਾਂ ਵਿਚ ਫ਼ਰਮੇ ਦੇ ਸਁਘਟਕ ਛੁੱਟ ਗਏ ਹਨ ।',
+'parser-template-loop-warning' => 'ਸਾਂਚੇ ਦਾ ਲੂਪ ਲੱਭਿਆ: [[$1]]',
+
+# "Undo" feature
+'undo-success' => 'ਇਹ ਸੋਧ ਨਕਾਰੀ ਜਾ ਸਕਦੀ ਹੈ।
+ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਇਹ ਤਸਦੀਕ ਕਰਨ ਲਈ ਹੇਠਲੀ ਤੁਲਨਾ ਜਾਂਚੋ ਕਿ ਇਹ ਓਹੀ ਹੈ ਜੋ ਤੁਸੀਂ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ ਅਤੇ ਫਿਰ ਸੋਧ ਨਕਾਰਨ ਲਈ ਤਬਦੀਲੀਆਂ ਸਾਂਭ ਦਿਓ।',
+'undo-norev' => 'ਸੋਧ ਨਕਾਰੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਕਿਉਂਕਿ ਇਹ ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ।',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|ਗੱਲ-ਬਾਤ]]) ਦੀ ਸੋਧ $1 ਨਕਾਰੀ',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'ਅਕਾਊਂਟ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
+'cantcreateaccount-text' => "[[User:$3|$3]] ਨੇ ਇਸ IP ਪਤੇ ('''$1''') ਤੋਂ ਖਾਤਾ ਬਣਾਉਣ ਤੇ ਪਾਬੰਦੀ ਲਾਈ ਹੈ।
+
+$3 ਨੇ ਕਾਰਨ ਇਹ ਦੱਸਿਆ ਹੈ, ''$2''",
 
 # History pages
-'viewpagelogs' => 'ਇਸ ਪੇਜ ਦੇ ਲਈ ਲਾਗ ਵੇਖੋ',
+'viewpagelogs' => 'ਇਸ ਸਫ਼ੇ ਲਈ ਚਿੱਠੇ ਵੇਖੋ',
+'nohistory' => 'ਇਸ ਸਫ਼ੇ ਦਾ ਕੋਈ ਸੋਧ ਅਤੀਤ ਨਹੀਂ ਹੈ।',
 'currentrev' => 'ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ',
-'currentrev-asof' => '$1 à¨¦à©\87 à¨¸à¨®à©\87à¨\82 à¨¦à¨¾ à¨µà¨°à¨¨à¨£',
-'revisionasof' => '$1 à¨¦à©\87 à¨°à©\80ਵਿà¨\9c਼ਨ à¨µà¨¾à¨\82à¨\97',
-'revision-info' => ' $1ਦ ਬਦਲਾਅ $2ਦਵਾਰਾ ਕੀਤਾ ਹੋਇਆ',
+'currentrev-asof' => '$1 à¨®à©\81ਤਾਬà¨\95 à¨¸à¨­ à¨¤à©\8bà¨\82 à¨¨à¨µà¨¾à¨\82 à¨°à©\80ਵਿà¨\9c਼ਨ',
+'revisionasof' => '$1 à¨¦à¨¾ à¨°à©\80ਵਿà¨\9c਼ਨ',
+'revision-info' => '$2 ਦਾ ਬਣਾਇਆ $1 ਦਾ ਰੀਵਿਜ਼ਨ',
 'previousrevision' => '←ਪੁਰਾਣਾ ਰੀਵਿਜ਼ਨ',
 'nextrevision' => 'ਨਵਾਂ ਰੀਵਿਜ਼ਨ→',
-'currentrevisionlink' => 'ਮà©\8cà¨\9cà©\82ਦਾ ਰੀਵਿਜ਼ਨ',
+'currentrevisionlink' => 'ਸਭ à¨¤à©\8b à¨¨à¨µà¨¾à¨\82 ਰੀਵਿਜ਼ਨ',
 'cur' => 'ਮੌਜੂਦਾ',
 'next' => 'ਅੱਗੇ',
-'last' => 'ਆਖਰੀ',
+'last' => 'à¨\86à¨\96਼ਰà©\80',
 'page_first' => 'ਪਹਿਲਾਂ',
 'page_last' => 'ਆਖਰੀ',
-'history-fieldset-title' => 'ਇਤਿਹਾਸ ਤੇ ਇਕ ਨਜ਼ਰ ਮਾਰੋ ।',
-'history-show-deleted' => 'ਕੇਵਲ ਮਿਟਾਏ ਗਏ',
-'histfirst' => 'ਸਭ ਤੋਂ ਪਹਿਲਾਂ',
+'histlegend' => "ਫ਼ਰਕ ਵੇਖੋ:
+ਮੁਕਾਬਲਾ ਕਰਨ ਲਈ ਰੀਵਿਜ਼ਨਾਂ ਦੇ ਰੇਡੀਓ ਬਟਨਾਂ ਵਿਚ ਨਿਸ਼ਾਨ ਲਾਓ ਅਤੇ ਜਾਓ ਜਾਂ ਸਭ ਤੋਂ ਥੱਲੇ ਵਾਲ਼ੇ ਬਟਨ ਤੇ ਕਲਿੱਕ ਕਰੋ। <br />
+ਲੈਜਅੰਡ:
+'''({{int:cur}})''' = ਨਵੇਂ ਰੀਵਿਜ਼ਨ ਨਾਲ਼ੋਂ ਫ਼ਰਕ, '''({{int:last}})''' = ਆਖ਼ਰੀ ਰੀਵਿਜ਼ਨ ਨਾਲ਼ੋਂ ਫ਼ਰਕ, '''({{int:minoreditletter}})''' = ਛੋਟੀ ਸੋਧ।",
+'history-fieldset-title' => 'ਅਤੀਤ ’ਤੇ ਨਜ਼ਰ ਮਾਰੋ',
+'history-show-deleted' => 'ਸਿਰਫ਼ ਮਿਟਾਏ ਗਏ',
+'histfirst' => 'ਸਭ ਤੋਂ ਪਹਿਲਾ',
 'histlast' => 'ਸਭ ਤੋਂ ਨਵਾਂ',
 'historysize' => '($1 ਬਾਈਟ)',
 'historyempty' => '(ਖਾਲੀ)',
 
 # Revision feed
 'history-feed-title' => 'ਰੀਵਿਜ਼ਨ ਅਤੀਤ',
+'history-feed-description' => 'ਵਿਕੀ ਤੇ ਇਸ ਸਫ਼ੇ ਦਾ ਰੀਵਿਜ਼ਨ ਅਤੀਤ',
+'history-feed-item-nocomment' => '$1 ਤੋਂ $2 ’ਤੇ',
+'history-feed-empty' => 'ਦਰਖ਼ਾਸਤਸ਼ੁਦਾ ਸਫ਼ਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।
+ਸ਼ਾਇਦ ਇਸਨੂੰ ਵਿਕੀ ਤੋਂ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ ਜਾਂ ਨਾਮ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਹੈ।
+ਵਿਕੀ ਦੇ ਨਵੇਂ ਮੁਨਾਸਿਬ ਸਫ਼ਿਆਂ ਵਿਚ [[Special:Search|ਲੱਭਣ]] ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।',
 
 # Revision deletion
 'rev-deleted-comment' => '(ਟਿੱਪਣੀ ਹਟਾਈ)',
 'rev-deleted-user' => '(ਯੂਜ਼ਰ ਨਾਂ ਹਟਾਇਆ)',
 'rev-deleted-event' => '(ਐਂਟਰੀ ਹਟਾਈ)',
-'rev-delundel' => 'ਵੇਖਾਓ/ਓਹਲੇ',
+'rev-deleted-user-contribs' => '[ਮੈਂਬਰ-ਨਾਂ ਜਾਂ IP ਪਤਾ ਹਟਾਇਆ - ਸੋਧ ਯੋਗਦਾਨਾਂ ਵਿਚੋਂ ਓਹਲੇ ਕੀਤੀ]',
+'rev-deleted-text-permission' => "ਸਫ਼ੇ ਦੀ ਇਹ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।
+ਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|
+page={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।",
+'rev-deleted-text-unhide' => "ਸਫ਼ੇ ਦੀ ਇਹ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।
+ਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|
+page={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।
+ਜੇ ਤੁਸੀਂ ਅੱਗੇ ਵਧਣਾ ਚਾਹੋ ਤਾਂ ਹਾਲੇ ਵੀ [$1 ਇਹ ਰੀਵਿਜ਼ਨ ਵੇਖ] ਸਕਦੇ ਹੋ।",
+'rev-deleted-no-diff' => "ਤੁਸੀਂ ਇਹ ਫ਼ਰਕ ਨਹੀਂ ਵੇਖ ਸਕਦੇ ਕਿਉਂਕਿ ਇਹਨਾਂ ਵਿੱਚੋਂ ਇੱਕ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।
+ਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|
+page={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।",
+'rev-suppressed-no-diff' => "ਤੁਸੀਂ ਇਹ ਫ਼ਰਕ ਨਹੀਂ ਵੇਖ ਸਕਦੇ ਕਿਉਂਕਿ ਇਹਨਾਂ ਵਿੱਚੋਂ ਇੱਕ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।",
+'rev-deleted-unhide-diff' => "ਇਸ ਫ਼ਰਕ ਵਿੱਚੋਂ ਇੱਕ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।
+ਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|
+page={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।
+ਜੇ ਤੁਸੀਂ ਅੱਗੇ ਵਧਣਾ ਚਾਹੋ ਤਾਂ ਹਾਲੇ ਵੀ [$1 ਇਹ ਰੀਵਿਜ਼ਨ ਵੇਖ] ਸਕਦੇ ਹੋ।",
+'rev-suppressed-diff-view' => "ਇਸ ਫ਼ਰਕ ਵਿੱਚੋਂ ਇੱਕ ਰੀਵਿਜ਼ਨ '''ਜ਼ਬਤ''' ਕੀਤੀ ਜਾ ਚੁੱਕੀ ਹੈ।
+ਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|
+page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।",
+'rev-delundel' => 'ਦਿਖਾਓ/ਲੁਕਾਓ',
+'rev-showdeleted' => 'ਵਖਾਓ',
+'revisiondelete' => 'ਰੀਵਿਜ਼ਨ ਮਿਟਾਓ/ਮਿਟਾਈ ਰੱਦ ਕਰੋ',
 'revdelete-nooldid-title' => 'ਕੋਈ ਟਾਰਗੇਟ ਰੀਵਿਜ਼ਨ ਨਹੀਂ',
+'revdelete-nologtype-title' => 'ਚਿੱਠੇ ਦੀ ਕਿਸਮ ਨਹੀਂ ਦੱਸੀ ਗਈ',
+'revdelete-nologtype-text' => 'ਇਹ ਕਾਰਵਾਈ ਕਰਨ ਲਈ ਤੁਸੀਂ ਚਿੱਠੇ ਦੀ ਕਿਸਮ ਨਹੀਂ ਦੱਸੀ।',
+'revdelete-no-file' => 'ਦੱਸੀ ਗਈ ਫ਼ਾਈਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
+'revdelete-show-file-confirm' => 'ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਤੁਸੀਂ $2 ਨੂੰ $3 ਦੀ ਫ਼ਾਈਲ "<nowiki>$1</nowiki>" ਦੀ ਮਿਟਾਈ ਗਈ ਰੀਵਿਜ਼ਨ ਵੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?',
+'revdelete-show-file-submit' => 'ਹਾਂ',
+'revdelete-selected' => "'''[[:$1]] {{PLURAL:$2|ਦੀ ਚੁਣੀ ਹੋਈ ਰੀਵਿਜ਼ਨ|ਦੀਆਂ ਚੁਣੀਆਂ ਹੋਈਆਂ ਰੀਵਿਜ਼ਨਾਂ}}:'''",
 'revdelete-legend' => 'ਪਾਬੰਦੀਆਂ ਸੈੱਟ ਕਰੋ:',
 'revdelete-hide-text' => 'ਰੀਵਿਜ਼ਨ ਟੈਕਸਟ ਓਹਲੇ',
 'revdelete-hide-image' => 'ਫਾਇਲ ਸਮੱਗਰੀ ਓਹਲੇ',
 'revdelete-hide-name' => 'ਐਕਸ਼ਨ ਅਤੇ ਟਾਰਗੇਟ ਓਹਲੇ',
+'revdelete-hide-comment' => 'ਸੋਧ ਸਾਰ ਲੁਕਾਓ',
+'revdelete-hide-user' => 'ਸੋਧਣ ਵਾਲ਼ੇ ਦਾ ਮੈਂਬਰ-ਨਾਂ/IP ਪਤਾ ਲੁਕਾਓ',
+'revdelete-radio-same' => '(ਨਹੀਂ ਬਦਲਣਾ)',
 'revdelete-radio-set' => 'ਹਾਂ',
+'revdelete-radio-unset' => 'ਨਹੀਂ',
+'revdelete-unsuppress' => 'ਮੁੜ ਬਹਾਲ ਕੀਤੀਆਂ ਰੀਵਿਜ਼ਨਾਂ ਤੋਂ ਰੋਕਾਂ ਹਟਾਓ',
 'revdelete-log' => 'ਕਾਰਨ:',
 'revdelete-submit' => 'ਚੁਣੇ ਰੀਵਿਜ਼ਨ ਉੱਤੇ ਲਾਗੂ ਕਰੋ',
+'logdelete-success' => "'''ਚਿੱਠੇ ਦੀ ਦਿੱਖ ਕਾਮਯਾਬੀ ਨਾਲ਼ ਸੈੱਟ ਕੀਤੀ।'''",
+'logdelete-failure' => "'''ਚਿੱਠੇ ਦੀ ਦਿੱਖ ਸੈੱਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ:''' $1",
 'revdel-restore' => 'ਦਿੱਖ ਬਦਲੋ',
-'revdel-restore-deleted' => 'ਹà¨\9fਾà¨\8f à¨\97à¨\8f à¨¬à¨¦à¨²à¨¾à¨\85',
-'revdel-restore-visible' => 'ਦà©\8dਰਿਸ਼à¨\9f à¨¬à¨¦à¨²à¨¾à¨\85',
+'revdel-restore-deleted' => 'ਮਿà¨\9fਾà¨\8f à¨\97à¨\8f à¨°à©\80ਵà©\80à¨\9c਼ਨ',
+'revdel-restore-visible' => 'ਦਿੱਸਣਯà©\8bà¨\97 à¨°à©\80ਵà©\80à¨\9c਼ਨ',
 'pagehist' => 'ਪੇਜ ਦਾ ਅਤੀਤ',
 'deletedhist' => 'ਹਟਾਇਆ ਗਿਆ ਅਤੀਤ',
+'revdelete-hide-current' => 'ਤਾਰੀਖ਼ &2, $1 ਦੀ ਚੀਜ਼ ਲੁਕਾਉਣ ਵਿਚ ਗ਼ਲਤੀ: ਇਹ ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ ਹੈ।
+ਇਹ ਲੁਕਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ।',
+'revdelete-otherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
+'revdelete-reasonotherlist' => 'ਹੋਰ ਕਾਰਨ',
+'revdelete-edit-reasonlist' => 'ਮਿਟਾਏ ਜਾਣ ਦੇ ਕਾਰਨ ਸੋਧੋ',
+'revdelete-offender' => 'ਰੀਵਿਜ਼ਨ ਲੇਖਕ:',
+
+# History merging
+'mergehistory' => 'ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤ ਰਲ਼ਾਓ',
+'mergehistory-from' => 'ਸਰੋਤ ਸਫ਼ਾ:',
+'mergehistory-list' => 'ਰਲ਼ਾਉਣਯੋਗ ਸੋਧ ਅਤੀਤ',
+'mergehistory-go' => 'ਰਲ਼ਾਉਣਯੋਗ ਸੋਧਾਂ ਵਖਾਓ',
+'mergehistory-empty' => 'ਕੋਈ ਰੀਵਿਜ਼ਨ ਰਲ਼ਾਈ ਨਹੀ ਜਾ ਸਕਦੀ।',
+'mergehistory-no-source' => 'ਸਰੋਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
+'mergehistory-autocomment' => '[[:$1]] ਨੂੰ [[:$2]] ਵਿੱਚ ਰਲ਼ਾਇਆ',
+'mergehistory-comment' => '[[:$1]] ਨੂੰ [[:$2]] ਵਿੱਚ ਰਲ਼ਾਇਆ: $3',
+'mergehistory-same-destination' => 'ਸਰੋਤ ਸਫ਼ਾ ਅਤੇ ਮੰਜ਼ਿਲ ਸਫ਼ਾ ਇੱਕੋ ਜਿਹੇ ਨਹੀਂ ਹੋ ਸਕਦੇ',
+'mergehistory-reason' => 'ਕਾਰਨ:',
 
 # Merge log
-'revertmerge' => 'ਬਿਨ-ਮਿਲਾਨ',
+'mergelog' => 'ਰਲ਼ਾਉਣ ਦਾ ਚਿੱਠਾ',
+'pagemerge-logentry' => '[[$1]] ਨੂੰ [[$2]] ਵਿੱਚ ਰਲ਼ਾਇਆ ($3 ਤੱਕ ਦੀਆ ਰੀਵਿਜ਼ਨਾਂ)',
+'revertmerge' => 'ਅਨ-ਮਰਜ',
+'mergelogpagetext' => 'ਹੇਠਾਂ ਇੱਕ ਸਫ਼ੇ ਦੇ ਅਤੀਤ ਨੂੰ ਦੂਜੇ ਦੇ ਅਤੀਤ ਵਿਚ ਰਲ਼ਾਉਣ ਦੀ ਸਭ ਤੋਂ ਤਾਜ਼ਾ ਲਿਸਟ ਹੈ।',
 
 # Diffs
-'history-title' => '"$1" ਦੀ ਸ਼ੋਧ ਤਵਾਰੀਖ',
+'history-title' => '"$1" ਦੇ ਰੀਵਿਜ਼ਨ ਦਾ ਅਤੀਤ',
+'difference-title' => '"$1" ਦੇ ਰੀਵਿਜ਼ਨਾਂ ਵਿਚ ਫ਼ਰਕ',
+'difference-title-multipage' => 'ਸਫ਼ਿਆਂ "$1" ਅਤੇ "$2" ਵਿਚ ਫ਼ਰਕ',
+'difference-multipage' => '(ਦੋ ਸਫ਼ਿਆਂ ਵਿਚਕਾਰ ਫ਼ਰਕ)',
 'lineno' => 'ਲਾਈਨ $1:',
 'compareselectedversions' => 'ਚੁਣੇ ਵਰਜਨਾਂ ਦੀ ਤੁਲਨਾ',
-'editundo' => 'ਵਾਪਸ(undo)',
+'showhideselectedversions' => 'ਚੁਣੇ ਰੀਵਿਜ਼ਨ ਵਖਾਓ/ਲੁਕਾਓ',
+'editundo' => 'ਨਕਾਰੋ',
+'diff-multi' => '({{PLURAL:$2|ਮੈਂਬਰ ਦੀ|$2 ਮੈਂਬਰਾਂ ਦੀਆਂ}} {{PLURAL:$1|ਵਿਚਕਾਰਲੀ ਰੀਵਿਜ਼ਨ ਨਹੀਂ ਦਿਖਾਈ ਜਾ ਰਹੀ|ਵਿਚਕਾਰਲੀਆਂ $1 ਰੀਵਿਜ਼ਨਾਂ ਨਹੀਂ ਦਿਖਾਈਆਂ ਜਾ ਰਹੀਆਂ}})',
 
 # Search results
 'searchresults' => 'ਖੋਜ ਨਤੀਜੇ',
@@ -565,42 +897,56 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'notitlematches' => 'ਕੋਈ ਪੇਜ ਟਾਇਟਲ ਨਹੀਂ ਮਿਲਦਾ',
 'textmatches' => 'ਪੇਜ ਟੈਕਸਟ ਮਿਲਦਾ',
 'notextmatches' => 'ਕੋਈ ਪੇਜ ਟੈਕਸਟ ਨਹੀਂ ਮਿਲਦਾ',
-'prevn' => 'ਪਿੱਛੇ {{PLURAL:$1|$1}}',
-'nextn' => 'ਅੱਗੇ {{PLURAL:$1|$1}}',
-'prevn-title' => 'ਪਹਿਲਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
-'nextn-title' => '↓
-ਅਗਲਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
-'shown-title' => 'ਪ੍ਰਤੀ ਪੇਜ਼ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}} ਵੇਖਾਓ',
+'prevn' => 'ਪਿਛਲੇ {{PLURAL:$1|$1}}',
+'nextn' => 'ਅਗਲੇ {{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-exists' => "'''ਇਸ ਵਿਕਿ ਤੇ \"[[:\$1]]\" ਨਾਮ ਦਾ ਇਕ ਸਫ਼ਾ ਹੈ'''",
-'searchmenu-new' => "'''ਇਸ ਵਿਕਿ ਪਰ \"[[:\$1]]\" ਨਾਮ ਨਾਲ ਪੰਨਾ ਬਣਾਓ!'''",
+'searchmenu-legend' => 'ਖੋਜ ਇਖ਼ਤਿਆਰ',
+'searchmenu-exists' => "'''ਇਸ ਵਿਕੀ ’ਤੇ \"[[:\$1]]\" ਨਾਮ ਦਾ ਸਫ਼ਾ ਹੈ।'''",
+'searchmenu-new' => "'''ਇਸ ਵਿਕੀ ’ਤੇ \"[[:\$1]]\" ਸਫ਼ਾ ਬਣਾਓ!'''",
 'searchhelp-url' => 'Help:ਸਮੱਗਰੀ',
-'searchprofile-articles' => 'ਸਮੱਗਰੀ ਪੇਜ',
-'searchprofile-project' => 'ਮੱਦਦ ਅਤੇ ਪ੍ਰੋਜੈਕਟ ਸਫ਼ੇ',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ਇਸ ਅਗੇਤਰ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵੇਖੋ]]',
+'searchprofile-articles' => 'ਸਮੱਗਰੀ ਸਫ਼ੇ',
+'searchprofile-project' => 'ਮਦਦ ਅਤੇ ਪ੍ਰੋਜੈਕਟ ਸਫ਼ੇ',
 'searchprofile-images' => 'ਮਲਟੀਮੀਡਿਆ',
-'searchprofile-everything' => 'ਹਰ à¨\9aà©\80à¨\9c਼',
-'searchprofile-advanced' => 'ਤà¨\95ਨà©\80à¨\95à©\80',
-'searchprofile-articles-tooltip' => "$1 'ਚ ਖੋਜ",
-'searchprofile-project-tooltip' => "$1 'ਚ ਖੋਜ",
-'searchprofile-images-tooltip' => 'ਫਾà¨\87ਲਾà¨\82 à¨²à¨\88 à¨\96à©\8bà¨\9c',
-'searchprofile-everything-tooltip' => 'ਸਭ à¨¸à¨®à©±à¨\97ਰà©\80 à¨¦à©\80 à¨\96à©\8bà¨\9c (à¨\9fਾà¨\95 ਸਫ਼ਿਆਂ ਸਮੇਤ)',
-'searchprofile-advanced-tooltip' => 'à¨\96ਾਸ à¨¸à¨¿à¨°à¨²à©\87à¨\96ਾਂ ਵਿਚ ਖੋਜੋ',
+'searchprofile-everything' => 'ਸਭ à¨\95à©\81à¨\9d',
+'searchprofile-advanced' => 'à¨\86ਧà©\81ਨਿà¨\95',
+'searchprofile-articles-tooltip' => '$1 ਵਿਚ ਖੋਜੋ',
+'searchprofile-project-tooltip' => '$1 ਵਿਚ ਖੋਜੋ',
+'searchprofile-images-tooltip' => 'ਫਾà¨\87ਲਾà¨\82 à¨\96à©\8bà¨\9cà©\8b',
+'searchprofile-everything-tooltip' => 'ਸਭ à¨\9aà©\80à¨\9c਼ਾà¨\82 à¨\96à©\8bà¨\9cà©\8b (à¨\97ੱਲਬਾਤ ਸਫ਼ਿਆਂ ਸਮੇਤ)',
+'searchprofile-advanced-tooltip' => 'à¨\86ਪਣà©\87 à¨¬à¨£à¨¾à¨\8f à¨¨à¨¾à¨®-ਥਾà¨\82ਵਾਂ ਵਿਚ ਖੋਜੋ',
 'search-result-size' => '$1 ({{PLURAL:$2|੧ ਸ਼ਬਦ|$2 ਸ਼ਬਦ}})',
 'search-redirect' => '($1 ਰੀ-ਡਿਰੈਕਟ)',
 'search-section' => '(ਭਾਗ $1)',
 'search-suggest' => 'ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ: $1',
+'search-interwiki-caption' => 'ਸਾਥੀ ਪ੍ਰੋਜੈਕਟ',
 'search-interwiki-default' => '$1 ਨਤੀਜੇ:',
 'search-interwiki-more' => '(ਹੋਰ)',
 'search-mwsuggest-enabled' => 'ਸੁਝਾਆਵਾਂ ਨਾਲ',
 'search-mwsuggest-disabled' => 'ਕੋਈ ਸੁਝਾਅ ਨਹੀਂ',
-'searchrelated' => 'ਸੰਬੰਧਿਤ',
+'search-relatedarticle' => 'ਸਬੰਧਿਤ',
+'mwsuggest-disable' => 'AJAX ਸਲਾਹਾਂ ਬੰਦ ਕਰੋ',
+'searcheverything-enable' => 'ਸਾਰੇ ਥਾਂ-ਨਾਂਵਾਂ ਵਿਚ ਖੋਜੋ',
+'searchrelated' => 'ਸਬੰਧਿਤ',
 'searchall' => 'ਸਭ',
-'search-nonefound' => 'ਤੁਹਾਡੀ ਖੋਜ ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਕੋਈ ਸਿੱਟੇ ਨਹੀਂ ਮਿਲੇ।',
+'showingresults' => "ਹੇਠਾਂ #'''$2''' ਨਾਲ਼ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ {{PLURAL:
+$1|'''1''' ਨਤੀਜਾ|'''$1''' ਤੱਕ ਨਤੀਜੇ}} ਵਖਾਓ।",
+'showingresultsnum' => "ਹੇਠਾਂ #'''$2''' ਨਾਲ਼ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ {{PLURAL:
+$3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
+'showingresultsheader' => "'''$4''' ਵਾਸਤੇ {{PLURAL:$5|'''$3''' ਵਿਚੋਂ '''$1''' ਨਤੀਜੇ|'''$3''' ਵਿਚੋਂ '''$1 - $2''' ਨਤੀਜੇ}}",
+'search-nonefound' => 'ਤੁਹਾਡੀ ਖੋਜ ਨਾਲ਼ ਮੇਲ ਖਾਂਦੇ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ।',
 'powersearch' => 'ਖੋਜ',
 'powersearch-legend' => 'ਤਕਨੀਕੀ ਖੋਜ',
 'powersearch-ns' => 'ਨੇਮ-ਸਪੇਸ ਵਿੱਚ ਖੋਜ:',
 'powersearch-redir' => 'ਰੀ-ਡਿਰੈਕਟ ਲਿਸਟ',
 'powersearch-field' => 'ਇਸ ਲਈ ਖੋਜ',
+'powersearch-togglelabel' => 'ਜਾਂਚੋ:',
+'powersearch-toggleall' => 'ਸਭ',
+'powersearch-togglenone' => 'ਕੋਈ ਨਹੀਂ',
+'search-external' => 'ਬਾਹਰੀ ਖੋਜ',
 
 # Quickbar
 'qbsettings' => 'ਤੁਰੰਤ ਬਾਰ',
@@ -608,7 +954,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 
 # Preferences page
 'preferences' => 'ਮੇਰੀ ਪਸੰਦ',
-'mypreferences' => 'ਮੇਰੀ ਪਸੰਦ',
+'mypreferences' => 'ਮੇਰੀਆਂ ਪਸੰਦਾਂ',
 'prefs-edits' => 'ਸੋਧਾਂ ਦੀ ਗਿਣਤੀ:',
 'prefsnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
 'prefsnologintext' => 'ਯੂਜ਼ਰ ਪਸੰਦ ਸੈੱਟ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ [[Special:UserLogin|logged in]] ਕਰਨਾ ਪਵੇਗਾ।',
@@ -617,46 +963,90 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'skin-preview' => 'ਝਲਕ',
 'datedefault' => 'ਕੋਈ ਪਸੰਦ ਨਹੀਂ',
 'prefs-datetime' => 'ਮਿਤੀ ਅਤੇ ਸਮਾਂ',
+'prefs-user-pages' => 'ਮੈਂਬਰ ਸਫ਼ੇ',
 'prefs-personal' => 'ਯੂਜ਼ਰ ਪਰੋਫਾਇਲ',
 'prefs-rc' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ',
 'prefs-watchlist' => 'ਵਾਚ-ਲਿਸਟ',
+'prefs-watchlist-days' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਦਿਨ:',
+'prefs-watchlist-days-max' => 'ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}',
+'prefs-watchlist-edits' => 'ਵਧਾਈ ਹੋਈ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ ਤਬਦੀਲੀਆਂ:',
+'prefs-watchlist-edits-max' => 'ਵੱਧ ਤੋਂ ਵੱਧ ਨੰਬਰ: ੧੦੦੦',
+'prefs-watchlist-token' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਟੋਕਨ:',
 'prefs-misc' => 'ਫੁਟਕਲ',
 'prefs-resetpass' => 'ਪਾਸਵਰਡ ਬਦਲੋ',
+'prefs-changeemail' => 'ਈ-ਮੇਲ ਪਤਾ ਬਦਲੋ',
+'prefs-setemail' => 'ਈ-ਮੇਲ ਪਤਾ ਸੈੱਟ ਕਰੋ',
 'prefs-email' => 'ਈਮੇਲ ਚੋਣਾਂ',
 'prefs-rendering' => 'ਦਿੱਖ',
 'saveprefs' => 'ਸੰਭਾਲੋ',
 'resetprefs' => 'ਰੀ-ਸੈੱਟ',
 'prefs-editing' => 'ਸੰਪਾਦਨ',
+'prefs-edit-boxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
 'rows' => 'ਕਤਾਰਾਂ:',
 'columns' => 'ਕਾਲਮ:',
 'searchresultshead' => 'ਖੋਜ',
 'resultsperpage' => 'ਪ੍ਰਤੀ ਪੇਜ ਹਿੱਟ:',
+'recentchangesdays' => 'ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਦਿਨ:',
+'recentchangesdays-max' => 'ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}',
+'prefs-help-recentchangescount' => 'ਇਸ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ, ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤ ਅਤੇ ਚਿੱਠੇ ਸ਼ਾਮਲ ਹਨ।',
 'savedprefs' => 'ਤੁਹਾਡੀ ਪਸੰਦ ਸੰਭਾਲੀ ਗਈ ਹੈ।',
 'timezonelegend' => 'ਸਮਾਂ ਖੇਤਰ:',
 'localtime' => 'ਲੋਕਲ ਸਮਾਂ:',
 'timezoneuseserverdefault' => 'ਸਰਵਰ ਡਿਫਾਲਟ ਵਰਤੋਂ',
 'servertime' => 'ਸਰਵਰ ਟਾਈਮ',
 'guesstimezone' => 'ਬਰਾਊਜ਼ਰ ਤੋਂ ਭਰੋ',
+'timezoneregion-africa' => 'ਅਫ਼ਰੀਕਾ',
+'timezoneregion-america' => 'ਅਮਰੀਕਾ',
+'timezoneregion-antarctica' => 'ਅੰਟਾਰਕਟਿਕਾ',
+'timezoneregion-arctic' => 'ਆਰਕਟਿਕ',
+'timezoneregion-asia' => 'ਏਸ਼ੀਆ',
+'timezoneregion-atlantic' => 'ਅੰਧ ਮਹਾਂਸਾਗਰ',
+'timezoneregion-australia' => 'ਆਸਟ੍ਰੇਲੀਆ',
+'timezoneregion-europe' => 'ਯੂਰਪ',
+'timezoneregion-indian' => 'ਹਿੰਦ ਮਹਾਂਸਾਗਰ',
+'timezoneregion-pacific' => 'ਪ੍ਰਸ਼ਾਂਤ ਮਹਾਂਸਾਗਰ',
 'allowemail' => 'ਹੋਰ ਯੂਜ਼ਰਾਂ ਤੋਂ ਈਮੇਲ ਯੋਗ ਕਰੋ',
+'prefs-searchoptions' => 'ਖੋਜ ਇਖ਼ਤਿਆਰ',
+'prefs-namespaces' => 'ਥਾਂ-ਨਾਮ',
+'defaultns' => 'ਨਹੀਂ ਤਾਂ ਇਹਨਾਂ ਥਾਂ-ਨਾਂਵਾਂ ਵਿਚ ਖੋਜੋ:',
 'default' => 'ਡਿਫਾਲਟ',
 'prefs-files' => 'ਫਾਇਲਾਂ',
-'youremail' => 'ਈਮੇਲ:',
+'prefs-emailconfirm-label' => 'ਈ-ਮੇਲ ਤਸਦੀਕ:',
+'prefs-textboxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
+'youremail' => 'ਈ-ਮੇਲ:',
 'username' => 'ਯੂਜ਼ਰ ਨਾਂ:',
 'uid' => 'ਯੂਜ਼ਰ ID:',
-'yourrealname' => 'à¨\85ਸਲà©\80 à¨¨à¨¾à¨\82:',
+'yourrealname' => 'à¨\85ਸਲà©\80 à¨¨à¨¾à¨®:',
 'yourlanguage' => 'ਭਾਸ਼ਾ:',
 'yournick' => 'ਛੋਟਾ ਨਾਂ:',
+'prefs-help-signature' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ ਉੱਤੇ ਟਿੱਪਣੀਆਂ ਦੇ ਆਖ਼ਰ ਵਿਚ "<nowiki>~~~~</nowiki>" ਲਾਓ ਜੋ ਤੁਹਾਡੇ ਦਸਤਖ਼ਤ ਅਤੇ ਵਕਤ ਦੀ ਮੋਹਰ ਵਿਚ ਤਬਦੀਲ ਹੋ ਜਾਵੇਗਾ।',
 'badsiglength' => 'ਛੋਟਾ ਨਾਂ (Nickname) ਬਹੁਤ ਲੰਮਾ ਹੋ ਗਿਆ ਹੈ, ਇਹ $1 ਅੱਖਰਾਂ ਤੋਂ ਘੱਟ ਚਾਹੀਦਾ ਹੈ।',
+'yourgender' => 'ਲਿੰਗ:',
+'gender-unknown' => 'ਜ਼ਾਹਿਰ ਨਹੀਂ ਕੀਤਾ',
+'gender-male' => 'ਮਰਦ',
+'gender-female' => 'ਔਰਤ',
 'email' => 'ਈਮੇਲ',
 'prefs-help-realname' => 'ਅਸਲੀ ਨਾਂ ਚੋਣਵਾਂ ਹੈ, ਅਤੇ ਜੇ ਤੁਸੀਂ ਇਹ ਦਿੱਤਾ ਹੈ ਤਾਂ ਤੁਹਾਡੇ ਕੰਮ ਵਾਸਤੇ ਗੁਣ ਦੇ ਤੌਰ ਉੱਤੇ ਵਰਤਿਆ ਜਾਵੇਗਾ।',
-'prefs-help-email' => 'ਈਮੇਲ ਐਡਰੈੱਸ ਚੋਣਵਾਂ ਹੈ, ਪਰ ਇਹ ਤੁਹਾਨੂੰ ਹੋਰਾਂ ਵਲੋਂ ਤੁਹਾਡੇ ਨਾਲ ਤੁਹਾਡੇ ਯੂਜ਼ਰ ਜਾਂ ਯੂਜ਼ਰ_ਗੱਲਬਾਤ ਰਾਹੀਂ ਬਿਨਾਂ ਤੁਹਾਡੇ ਪਛਾਣ ਦੇ ਸੰਪਰਕ ਲਈ ਮੱਦਦ ਦਿੰਦਾ ਹੈ।',
+'prefs-help-email' => 'ਤੁਹਾਡੀ ਮਰਜ਼ੀ ਹੈ ਈਮੇਲ ਪਤਾ ਦਿਓ ਜਾਂ ਨਾ ਦਿਓ ਪਰ ਪਾਸਵਰਡ ਭੁੱਲ ਜਾਣ ਤੇ ਨਵਾਂ ਪਾਸਵਰਡ ਹਾਸਲ ਕਰਨ ਲਈ ਇਹ ਜ਼ਰੂਰੀ ਹੈ।',
+'prefs-help-email-others' => 'ਤੁਸੀਂ ਇਹ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ ਕਿ ਤੁਹਾਡੇ ਮੈਂਬਰ ਜਾਂ ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਤੋਂ ਹੋਰ ਮੈਂਬਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜ ਸਕਣ?
+ਜਦੋਂ ਹੋਰ ਮੈਂਬਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜਦੇ ਹਨ ਤਾਂ ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ।',
+'prefs-help-email-required' => 'ਈ-ਮੇਲ ਪਤਾ ਚਾਹੀਦਾ ਹੈ।',
+'prefs-info' => 'ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ',
+'prefs-signature' => 'ਦਸਤਖ਼ਤ',
+'prefs-dateformat' => 'ਤਾਰੀਖ਼ ਅੰਦਾਜ਼',
 'prefs-advancedediting' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedrc' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedrendering' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedsearchoptions' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedwatchlist' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
+'prefs-diffs' => 'ਫ਼ਰਕ',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'ਈ-ਮੇਲ ਪਤਾ ਸਹੀ ਲਗਦਾ ਹੈ',
+'email-address-validity-invalid' => 'ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦਾਖ਼ਲ ਕਰੋ',
 
 # User rights
+'userrights' => 'ਮੈਂਬਰ ਦੇ ਹੱਕਾਂ ਦਾ ਰੱਖ-ਰਖਾਓ',
 'userrights-lookup-user' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਦੇਖਭਾਲ',
 'userrights-user-editname' => 'ਇੱਕ ਯੂਜ਼ਰ ਨਾਂ ਦਿਓ:',
 'editusergroup' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੋਧ',
@@ -665,61 +1055,110 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'saveusergroups' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੰਭਾਲੋ',
 'userrights-groupsmember' => 'ਇਸ ਦਾ ਮੈਂਬਰ:',
 'userrights-reason' => 'ਕਾਰਨ:',
+'userrights-no-interwiki' => 'ਤੁਹਾਨੂੰ ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਹੱਕਾਂ ਵਿਚ ਤਬਦੀਲੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'userrights-nodatabase' => 'ਡੈਟਾਬੇਸ $1 ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਕਾਮੀ ਨਹੀਂ ਹੈ।',
+'userrights-notallowed' => 'ਤੁਹਾਡੇ ਖਾਤੇ ਨੂੰ ਮੈਂਬਰ ਨੂੰ ਹੱਕ ਦੇਣ ਜਾਂ ਖੋਹਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
 
 # Groups
 'group' => 'ਗਰੁੱਪ:',
 'group-user' => 'ਮੈਂਬਰ',
+'group-autoconfirmed' => 'ਖ਼ੁਦ-ਤਸਦੀਕਸ਼ੁਦਾ ਮੈਂਬਰ',
+'group-bot' => 'ਬੋਟ',
 'group-all' => '(ਸਭ)',
 
 'group-user-member' => 'ਮੈਂਬਰ',
 
 # Rights
+'right-read' => 'ਸਫ਼ੇ ਪੜ੍ਹਨਾ',
 'right-edit' => 'ਸਫ਼ੇ ਸੋਧ',
+'right-createpage' => 'ਸਫ਼ੇ ਬਣਾਉਣਾ (ਜੋ ਚਰਚਾ ਸਫ਼ੇ ਨਾ ਹੋਣ)',
+'right-createtalk' => 'ਚਰਚਾ ਸਫ਼ੇ ਬਣਾਉਣਾ',
+'right-minoredit' => 'ਸੋਧਾਂ ਦੇ ਛੋਟਾ ਹੋਣ ਲਈ ਨਿਸ਼ਾਨ ਲਾਉਣਾ',
+'right-move' => 'ਸਫ਼ੇ ਭੇਜਣਾ',
+'right-upload' => 'ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨਾ',
+'right-autoconfirmed' => 'ਨੀਮ-ਸੁਰੱਖਿਅਤ ਸਫ਼ਿਆਂ ਨੂੰ ਸੋਧਣਾ',
 'right-delete' => 'ਸਫ਼ੇ ਹਟਾਓ',
+'right-bigdelete' => 'ਵੱਡੇ ਅਤੀਤਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਮਿਟਾਉਣੇ',
+'right-browsearchive' => 'ਮਿਟਾਏ ਗਏ ਸਫ਼ੇ ਖੋਜਣਾ',
+'right-undelete' => 'ਸਫ਼ੇ ਨੂੰ ਅਣ-ਮਿਟਾਇਆ ਕਰਨਾ',
+'right-block' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਦੇ ਸੋਧ ਕਰਨ ਤੇ ਪਾਬੰਦੀ ਲਾਉਣੀ',
+'right-blockemail' => 'ਮੈਂਬਰ ਦੇ ਈ-ਮੇਲ ਭੇਜਣ ਤੇ ਪਾਬੰਦੀ ਲਾਉਣੀ',
+'right-hideuser' => 'ਮੈਂਬਰ-ਨਾਂ ਤੇ ਪਾਬੰਦੀ ਲਾਉਣੀ ਅਤੇ ਇਸਨੂੰ ਲੋਕਾਂ ਤੋਂ ਲੁਕਾਉਣਾ',
+'right-unwatchedpages' => 'ਨਜ਼ਰ ਨਾ ਰੱਖੇ ਜਾ ਰਹੇ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਵੇਖਣੀ',
+'right-mergehistory' => 'ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤਾਂ ਨੂੰ ਰਲ਼ਾਉਣਾ',
+'right-userrights' => 'ਸਾਰੇ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਸੋਧ ਕਰਨਾ',
+'right-userrights-interwiki' => 'ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਸੋਧ ਕਰਨਾ',
+'right-siteadmin' => 'ਡੈਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਉਣਾ ਤੇ ਖੋਲ੍ਹਣਾ',
+'right-sendemail' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣਾ',
 
 # User rights log
+'rightslog' => 'ਮੈਂਬਰ ਹੱਕਾਂ ਦਾ ਚਿੱਠਾ',
+'rightslogtext' => 'ਇਹ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਦਾ ਚਿੱਠਾ ਹੈ।',
+'rightslogentry-autopromote' => '$2 ਤੋਂ ਆਪਣੇ ਆਪ $3 ਤੱਕ ਤਰੱਕੀ ਕਰੀ',
 'rightsnone' => '(ਕੋਈ ਨਹੀਂ)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'ਇਹ ਪੰਨਾ ਸੋਧੋ',
+'action-read' => 'ਇਹ ਸਫ਼ਾ ਪੜ੍ਹਨ',
+'action-edit' => 'ਇਹ ਸਫ਼ਾ ਸੋਧੋ',
+'action-createpage' => 'ਸਫ਼ੇ ਬਣਾਉਣ',
+'action-createtalk' => 'ਚਰਚਾ ਸਫ਼ੇ ਬਣਾਉਣ',
+'action-createaccount' => 'ਮੈਂਬਰ ਖਾਤਾ ਬਣਾਉਣ',
+'action-upload' => 'ਇਹ ਫ਼ਾਈਲ ਅੱਪਲੋਡ ਕਰਨ',
+'action-delete' => 'ਇਹ ਸਫ਼ਾ ਮਿਟਾਉਣ',
+'action-deleterevision' => 'ਇਹ ਰੀਵਿਜ਼ਨ ਮਿਟਾਉਣ',
+'action-deletedhistory' => 'ਇਸ ਸਫ਼ੇ ਦਾ ਮਿਟਾਇਆ ਅਤੀਤ ਵੇਖਣ',
+'action-browsearchive' => 'ਮਿਟਾਏ ਸਫ਼ੇ ਖੋਜਣ',
+'action-undelete' => 'ਇਹ ਸਫ਼ਾ ਅਣ-ਮਿਟਿਆ ਕਰਨ',
+'action-block' => 'ਇਸ ਮੈਂਬਰ ਦੇ ਸੋਧ ਕਰਨ ਤੇ ਪਾਬੰਦੀ ਲਾਉਣ',
+'action-protect' => 'ਇਸ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲਣ',
+'action-unwatchedpages' => 'ਨਜ਼ਰ ਨਾ ਰੱਖੇ ਜਾ ਰਹੇ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਵੇਖਣ',
+'action-mergehistory' => 'ਇਸ ਸਫ਼ੇ ਦੇ ਅਤੀਤ ਨੂੰ ਰਲ਼ਾਉਣ',
+'action-userrights' => 'ਸਾਰੇ ਮੈਂਬਰ ਹੱਕ ਸੋਧਣ',
+'action-userrights-interwiki' => 'ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਮੈਂਬਰ ਹੱਕ ਸੋਧਣ',
+'action-siteadmin' => 'ਡੈਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਉਣ ਜਾਂ ਖੋਲ੍ਹਣ',
+'action-sendemail' => 'ਈ-ਮੇਲਾਂ ਭੇਜਣ',
 
 # Recent changes
-'recentchanges' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ',
+'nchanges' => '$1 {{PLURAL:$1|ਤਬਦੀਲੀ|
+ਤਬਦੀਲੀਆਂ}}',
+'recentchanges' => 'ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ',
 'recentchanges-legend' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ ਚੋਣਾਂ',
 'recentchanges-summary' => 'ਇਸ ਵਿਕੀ ਪਰ ਹਾਲ ਵਿਚ ਹੋਏ ਬਦਲਾਅਦੇਖੇ ਜਾ ਸਕਦੇ ਹਨ।',
-'recentchanges-feed-description' => 'ਇਸ ਵਿਕੀ ਪਰ ਹਾਲ ਵਿਚ ਹੋਏ ਬਦਲਾਅ ਇਸ ਫ਼ੀਡ ਵਿਚ ਦੇਖੇ ਜਾ ਸਕਦੇ ਹਨ।',
+'recentchanges-feed-description' => 'ਇਸ ਵਿਕੀ ’ਤੇ ਹਾਲ ਹੀ ਵਿਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।',
 'recentchanges-label-newpage' => 'ਇਹ ਸੋਧ ਨੇ ਨਵਾਂ ਸਫ਼ਾ ਬਣਾਇਆ ਹੈ',
 'recentchanges-label-minor' => 'ਇਹ ਛੋਟੀ ਸੋਧ ਹੈ',
-'recentchanges-label-bot' => 'à¨\87ਹ à¨¸à©\8bਧ à¨¨à©\82à©° à¨¬à©\8bà¨\9f à¨µà¨²à©\8bà¨\82 à¨\95à©\80ਤਾ à¨\97ਿà¨\86 ਹੈ',
+'recentchanges-label-bot' => 'à¨\87ਹ à¨¸à©\8bਧ à¨¬à©\8bà¨\9f à¨µà¨²à©\8bà¨\82 à¨\95à©\80ਤà©\80 à¨\97à¨\88 ਹੈ',
 'recentchanges-label-unpatrolled' => 'ਇਸ ਸੰਪਾਦਨ ਦੀ ਅਜੇ ਨਿਗਰਾਨੀ ਨਹੀਂ ਹੋਈ',
-'rcnotefrom' => "'''$2'''ਤੌਂ ('''$1''' ਤਕ) ਬਦਲਾਅ ਥੱਲੇ ਦਰਸਾਏ ਗਏ ਹਨ।",
-'rclistfrom' => '$1 ਤੌਨ ਨਵੇਂ ਬਦਲਾਅ ਦਿਖਾਓ',
+'rcnote' => "$4, $5 ਤੱਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਦਿਨ|'''$2''' ਦਿਨਾਂ}} ਵਿਚ {{PLURAL:$1|'''1''' ਤਬਦੀਲੀ ਹੋਈ ਹੈ।|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ ਹਨ।}}",
+'rcnotefrom' => "'''$2''' ਤੱਕ ('''$1''' ਤੱਕ ਦਿੱਸਦੀਆਂ) ਤਬਦੀਲੀਆਂ ਹੇਠ ਦਿੱਤੀਆਂ ਹਨ।",
+'rclistfrom' => '$1 ਤੋਂ ਸ਼ੁਰੂ ਕਰਕੇ ਨਵੀਆਂ ਤਬਦੀਲੀਆਂ ਦਿਖਾਓ',
 'rcshowhideminor' => '$1 ਛੋਟੀਆਂ ਸੋਧਾਂ',
 'rcshowhidebots' => '$1 ਬੋਟ',
-'rcshowhideliu' => '$1 ਲਾਗਇਨ ਹੋਏ ਯੂਜ਼ਰ',
-'rcshowhideanons' => '$1 ਅਗਿਆਤ ਯੂਜ਼ਰ',
-'rcshowhidemine' => '$1 ਮੇਰਾ ਐਡਿਟ',
-'rclinks' => 'ਪਿਛਲੇ $2 ਦਿਨਾਂ ਵਿਚ ਹੋਏ $1 ਬਦਲਾਅ ਦਿਖਾਓ<br />$3',
-'diff' => 'ਅੰਤਰ',
+'rcshowhideliu' => '$1 ਲਾਗਇਨ ਹੋਏ ਮੈਂਬਰ',
+'rcshowhideanons' => '$1 ਗੁਮਨਾਮ ਮੈਂਬਰ',
+'rcshowhidepatr' => 'ਵੇਖੀਆਂ ਜਾ ਚੁੱਕੀਆਂ ਸੋਧਾਂ $1',
+'rcshowhidemine' => 'ਮੇਰੀਆਂ ਸੋਧਾਂ $1',
+'rclinks' => 'ਪਿਛਲੇ $2 ਦਿਨਾਂ ਵਿਚ ਹੋਈਆਂ $1 ਤਬਦੀਲੀਆਂ ਦਿਖਾਓ <br /> $3',
+'diff' => 'ਫ਼ਰਕ',
 'hist' => 'ਅਤੀਤ',
-'hide' => 'à¨\93ਹਲà©\87',
-'show' => 'ਵà©\87à¨\96à©\8b',
+'hide' => 'ਲà©\81à¨\95ਾà¨\93',
+'show' => 'ਵà¨\96ਾà¨\93',
 'minoreditletter' => 'ਛ',
 'newpageletter' => 'ਨ',
 'boteditletter' => 'ਬ',
 'rc_categories_any' => 'ਕੋਈ ਵੀ',
-'rc-enhanced-expand' => 'ਵà©\87ਰਵਾ à¨µà©\87à¨\96à©\8b (à¨\9cਾਵਾਸà¨\95à©\8dਰਿਪà¨\9f à¨²à©\8bà©\9cà©\80ਦੀ ਹੈ)',
-'rc-enhanced-hide' => 'ਵà©\87ਰਵਾ à¨\93ਹਲà©\87',
+'rc-enhanced-expand' => 'ਵà©\87ਰਵਾ à¨µà¨\96ਾà¨\93 (à¨\9cਾਵਾਸà¨\95à©\8dਰਿਪà¨\9f à¨²à©\8bà©\9cà©\80à¨\82ਦੀ ਹੈ)',
+'rc-enhanced-hide' => 'ਵà©\87ਰਵਾ à¨²à©\81à¨\95ਾà¨\93',
 
 # Recent changes linked
-'recentchangeslinked' => 'ਸਬੰਧਿਤ à¨¬à¨¦à¨²à¨¾à¨\85',
+'recentchangeslinked' => 'ਸਬੰਧਿਤ à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82',
 'recentchangeslinked-feed' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
-'recentchangeslinked-toolbox' => 'ਸਬੰਧਿਤ à¨¬à¨¦à¨²à¨¾à¨\85',
-'recentchangeslinked-title' => '"$1" ਨਾਲ ਸੰਬੰਧਿਤ ਬਦਲਾਅ',
-'recentchangeslinked-noresult' => 'à¨\9cà©\81à©\9cà©\87 à¨¹à©\8bà¨\8f à¨¸à¨«à¨¿à¨\86à¨\82 à¨¤à©\87 ,ਦਿੱਤà©\87 à¨¸à¨®à©\87à¨\82 à¨µà¨¿à¨\9a à¨\95à©\81à¨\9d à¨¨à¨¹à©\80à¨\82 à¨¬à¨¦à¨²à¨¿à¨\86 ।',
-'recentchangeslinked-summary' => 'à¨\87ਹ à¨¸à©\82à¨\9aà©\80 à¨\8aਨà©\8dਹਾà¨\82 à¨ªà©°à¨¨à¨¿à¨\86à¨\82 ,à¨\9cà©\8b à¨\87à¨\95 à¨\96ਾਸ à¨ªà©°à¨¨à©\87 à¨¨à¨¾à¨² à¨¸à©°à¨¬à©°à¨§à¨¿à¨¤ à¨¹à¨¨, (ਯਾ à¨\95ਿਸà©\87 à¨\96ਾਸ à¨¸à¨¼à©\8dਰà©\87ਣà©\80 à¨¦à©\87 à¨®à©\88à¨\82ਬਰਾà¨\82) à¨¦à©\87 à¨¹à¨¾à¨² à¨µà¨¿à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µà¨¾à¨\82 à¨¨à©\82à©° à¨¦à¨°à¨¸à¨¼à¨¾à¨\82ਦà©\80 à¨¹à©\88 [[Special:Watchlist|ਤà©\81ਹਾਡà©\80 à¨¦à©\8dਰਿਸ਼à¨\9fà©\80 à¨\97à©\8bà¨\9aਰ à¨¸à©\82à¨\9aà©\80]] à¨µà¨¿à¨\9a à¨®à©\8cà¨\9cà©\82ਦ à¨ªà©°à¨¨à©\87 à¨®à©\8bà¨\9fà©\87 à¨\85ਖਰਾਂ ਵਿਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
-'recentchangeslinked-page' => 'ਸਫ਼ਾ à¨¨à¨¾à¨\82:',
-'recentchangeslinked-to' => 'ਇਸ ਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿਚ ਹੋਏ ਬਦਲਾਅ ਦਿਖਾਓ',
+'recentchangeslinked-toolbox' => 'ਸਬੰਧਿਤ à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82',
+'recentchangeslinked-title' => '"$1" ਨਾਲ਼ ਸਬੰਧਿਤ ਤਬਦੀਲੀਆਂ',
+'recentchangeslinked-noresult' => 'à¨\9cà©\81à©\9cà©\87 à¨¸à¨«à¨¿à¨\86à¨\82 â\80\99ਤà©\87, à¨¦à¨¿à©±à¨¤à©\87 à¨¸à¨®à©\87à¨\82 â\80\99à¨\9a à¨\95à©\8bà¨\88 à¨¤à¨¬à¨¦à©\80ਲà©\80 à¨¨à¨¹à©\80à¨\82 à¨¹à©\8bà¨\88।',
+'recentchangeslinked-summary' => 'à¨\87ਹ à¨²à¨¿à¨¸à¨\9f à¨\87à¨\95 à¨\96਼ਾਸ à¨¸à¨«à¨¼à©\87 à¨¨à¨¾à¨² à¨¸à¨¬à©°à¨§à¨¿à¨¤ à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨\9cਾà¨\82 à¨\95ਿਸà©\87 à¨\96਼ਾਸ à¨¸à¨¼à©\8dਰà©\87ਣà©\80 à¨¦à©\87 à¨®à©\88à¨\82ਬਰਾà¨\82 à¨¦à©\87 à¨¹à¨¾à¨² à¨µà¨¿à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µà¨¾à¨\82 à¨¨à©\82à©° à¨¦à¨°à¨¸à¨¾à¨\82à¨\89ਦà©\80 à¨¹à©\88। [[Special:Watchlist|ਤà©\81ਹਾਡà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f]] à¨µà¨¿à¨\9a à¨®à©\8cà¨\9cà©\82ਦ à¨¸à¨«à¨¼à©\87 à¨®à©\8bà¨\9fà©\87 à¨\85ੱਖਰਾਂ ਵਿਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
+'recentchangeslinked-page' => 'ਸਫ਼à©\87 à¨¦à¨¾ à¨¨à¨¾à¨®:',
+'recentchangeslinked-to' => 'ਇਸਦੇ ਬਦਲੇ ਇਸ ਸਫ਼ੇ ਨਾਲ਼ ਜੁੜੇ ਸਫ਼ਿਆਂ ਵਿਚ ਹੋਏ ਬਦਲਾਅ ਦਿਖਾਓ',
 
 # Upload
 'upload' => 'ਫਾਇਲ ਅੱਪਲੋਡ ਕਰੋ',
@@ -729,29 +1168,39 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'uploadnologintext' => 'ਤੁਹਾਨੂੰ[[Special:UserLogin|logged in] ਕਰਨਾ ਪਵੇਗਾ]
 to upload files.',
 'uploaderror' => 'ਅੱਪਲੋਡ ਗਲਤੀ',
+'upload-recreate-warning' => "'''ਖ਼ਬਰਦਾਰ: ਇਸ ਨਾਮ ਦੀ ਫ਼ਾਈਲ ਮਿਟਾਈ ਜਾਂ ਹੋਰ ਨਾਮ ਤੇ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।'''
+ਮਿਟਾਉਣ ਅਤੇ ਭੇਜੇ ਜਾਣ ਦਾ ਚਿੱਠਾ ਸਹੂਲਤ ਲਈ ਇੱਥੇ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
 'uploadlog' => 'ਅੱਪਲੋਡ ਲਾਗ',
-'uploadlogpage' => 'à¨\85ੱਪਲà©\8bਡ à¨²à¨¾à¨\97',
+'uploadlogpage' => 'à¨\85ੱਪਲà©\8bਡ à¨¦à¨¾ à¨\9aਿੱਠਾ',
 'filename' => 'ਫਾਇਲ ਨਾਂ',
-'filedesc' => 'ਸੰà¨\96à©\87ਪ',
+'filedesc' => 'ਸਾਰ',
 'fileuploadsummary' => 'ਸੰਖੇਪ:',
 'filestatus' => 'ਕਾਪੀਰਾਈਟ ਹਾਲਤ:',
 'filesource' => 'ਸੋਰਸ:',
 'uploadedfiles' => 'ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫਾਇਲਾਂ',
 'ignorewarning' => 'ਚੇਤਾਵਨੀ ਅਣਡਿੱਠੀ ਕਰਕੇ ਕਿਵੇਂ ਵੀ ਫਾਇਲ ਸੰਭਾਲੋ।',
+'ignorewarnings' => 'ਕੋਈ ਚੇਤਾਵਨੀ ਹੋਈ ਤਾਂ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰੋ',
 'minlength1' => 'ਫਾਇਲ ਨਾਂ ਵਿੱਚ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਅੱਖਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
 'badfilename' => 'ਫਾਇਲ ਨਾਂ "$1" ਬਦਲਿਆ ਗਿਆ ਹੈ।',
 'filetype-missing' => 'ਫਾਇਲ ਦੀ ਕੋਈ ਐਕਸ਼ਟੇਸ਼ਨ ਨਹੀਂ ਹੈ (ਜਿਵੇਂ ".jpg").',
-'fileexists' => "ਇਹ ਫਾਇਲ ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਜੇ ਤੁਸੀਂ ਇਹ ਬਦਲਣ ਬਾਰੇ ਜਾਣਦੇ ਨਹੀਂ ਹੋ ਤਾਂ  '''<tt>[[:$1]]</tt>''' ਵੇਖੋ ਜੀ। [[$1|thumb]]",
-'fileexists-extension' => "ਇਸ ਨਾਂ ਨਾਲ ਰਲਦੀ ਫਾਇਲ ਮੌਜੂਦ ਹੈ: [[$2|thumb]]
-* ਅੱਪਲੋਡ ਕੀਤੀ ਫਾਇਲ ਦਾ ਨਾਂ: '''<tt>[[:$1]]</tt>'''
-* ਮੌਜੂਦ ਫਾਇਲ ਦਾ ਨਾਂ: '''<tt>[[:$2]]</tt>'''
-ਇੱਕ ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ",
+'filename-tooshort' => 'ਫ਼ਾਈਲ ਬਹੁਤ ਛੋਟੀ ਹੈ।',
+'filetype-banned' => 'ਇਸ ਕਿਸਮ ਦੀ ਫ਼ਾਈਲ ਦੀ ਮਨਾਹੀ ਹੈ।',
+'illegal-filename' => 'ਇਸ ਫ਼ਾਈਲ-ਨਾਮ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'fileexists' => 'ਇਹ ਫਾਇਲ ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਜੇ ਤੁਸੀਂ ਇਹ ਬਦਲਣ ਬਾਰੇ ਜਾਣਦੇ ਨਹੀਂ ਹੋ ਤਾਂ  <strong>[[:$1]]</strong> ਵੇਖੋ ਜੀ। [[$1|thumb]]',
+'fileexists-extension' => 'ਇਸ ਨਾਂ ਨਾਲ ਰਲਦੀ ਫਾਇਲ ਮੌਜੂਦ ਹੈ: [[$2|thumb]]
+* ਅੱਪਲੋਡ ਕੀਤੀ ਫਾਇਲ ਦਾ ਨਾਂ: <strong>[[:$1]]</strong>
+* ਮੌਜੂਦ ਫਾਇਲ ਦਾ ਨਾਂ: <strong>[[:$2]]</strong>
+ਇੱਕ ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ',
+'file-exists-duplicate' => 'ਇਹ ਫ਼ਾਈਲ {{PLURAL:$1|ਇਸ ਫ਼ਾਈਲ|ਇਹਨਾਂ ਫ਼ਾਈਲਾਂ}} ਦੀ ਨਕਲ ਹੈ:',
 'uploadwarning' => 'ਅੱਪਲੋਡ ਚੇਤਾਵਨੀ',
 'savefile' => 'ਫਾਇਲ ਸੰਭਾਲੋ',
-'uploadedimage' => '"[[$1]]" ਅੱਪਲੋਡ',
+'uploadedimage' => '"[[$1]]" ਅੱਪਲੋਡ ਕੀਤੀ',
+'overwroteimage' => '"[[$1]]" ਦਾ ਨਵਾਂ ਰੂਪ ਅੱਪਲੋਡ ਕਰੋ',
 'uploaddisabled' => 'ਅੱਪਲੋਡ ਆਯੋਗ ਹੈ',
 'uploadvirus' => 'ਇਹ ਫਾਇਲ ਵਿੱਚ ਵਾਇਰਸ ਹੈ! ਵੇਰਵੇ ਲਈ ਵੇਖੋ: $1',
 'sourcefilename' => 'ਸੋਰਸ ਫਾਇਲ ਨਾਂ:',
+'upload-maxfilesize' => 'ਫ਼ਾਈਲ ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਅਕਾਰ: $1',
+'upload-description' => 'ਫ਼ਾਈਲ ਦਾ ਵੇਰਵਾ',
 'watchthisupload' => 'ਇਸ ਫਾਇਲ ਨੂੰ ਵਾਚ ਕਰੋ',
 'upload-success-subj' => 'ਠੀਕ ਤਰ੍ਹਾਂ ਅੱਪਲੋਡ',
 'upload-warning-subj' => 'ਅੱਪਲੋਡ ਚੇਤਾਵਨੀ',
@@ -759,18 +1208,38 @@ to upload files.',
 'upload-file-error' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ',
 'upload-misc-error' => 'ਅਣਜਾਣ ਅੱਪਲੋਡ ਗਲਤੀ',
 
+# File backend
+'backend-fail-notexists' => 'ਫ਼ਾਈਲ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
+'backend-fail-delete' => 'ਫ਼ਾਈਲ "$1" ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।',
+'backend-fail-alreadyexists' => 'ਫ਼ਾਈਲ "$1" ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।',
+'backend-fail-store' => 'ਫ਼ਾਈਲ "$1", "$2" ਵਿਚ ਸਾਂਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।',
+'backend-fail-copy' => 'ਫ਼ਾਈਲ "$1", "$2" ਵਿਚ ਨਕਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।',
+'backend-fail-move' => 'ਫ਼ਾਈਲ "$1", "$2" ਤੇ ਭੇਜੀ ਨਹੀਂ ਜਾ ਸਕੀ।',
+'backend-fail-opentemp' => 'ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ।',
+
+# Special:UploadStash
+'uploadstash-refresh' => 'ਫ਼ਾਈਲਾਂ ਦੀ ਲਿਸਟ ਨੂੰ ਤਾਜ਼ਾ ਕਰੋ',
+
+# img_auth script messages
+'img-auth-nofile' => 'ਫ਼ਾਈਲ "$1" ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
+
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'URL ’ਤੇ ਪਹੁੰਚਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।',
+'upload-curl-error6-text' => 'ਦਿੱਤੇ ਹੋਏ URL ’ਤੇ ਪਹੁੰਚਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।
+ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ ਕਿ URL ਸਹੀ ਹੈ ਅਤੇ ਸਾਈਟ ਉਪਲੱਬਧ ਹੈ।',
 'upload-curl-error28' => 'ਅੱਪਲੋਡ ਟਾਈਮ-ਆਉਟ',
 
 'license' => 'ਲਾਈਸੈਂਸਿੰਗ:',
-'license-header' => 'ਵਰਤਣ à¨²à¨\88 à¨®à©°à¨\9c਼à©\82ਰà©\80 à¨¦à©\87ਣਾ',
+'license-header' => 'ਲਾà¨\88ਸੰਸ',
 'nolicense' => 'ਕੁਝ ਵੀ ਚੁਣਿਆ',
 'license-nopreview' => '(ਝਲਕ ਉਪਲੱਬਧ ਨਹੀਂ)',
 'upload_source_file' => ' (ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਉੱਤੇ ਇੱਕ ਫਾਇਲ)',
 
 # Special:ListFiles
+'listfiles_search_for' => 'ਇਸ ਮੀਡੀਆ ਨਾਮ ਨੂੰ ਖੋਜੋ:',
 'imgfile' => 'ਫਾਇਲ',
 'listfiles' => 'ਫਾਇਲ ਲਿਸਟ',
+'listfiles_thumb' => 'ਨਮੂਨਾ-ਤਸਵੀਰ',
 'listfiles_date' => 'ਮਿਤੀ',
 'listfiles_name' => 'ਨਾਂ',
 'listfiles_user' => 'ਯੂਜ਼ਰ',
@@ -779,25 +1248,38 @@ to upload files.',
 'listfiles_count' => 'ਵਰਜਨ',
 
 # File description page
-'file-anchor-link' => 'ਫਾà¨\87ਲ',
-'filehist' => 'ਫਾà¨\87ਲ ਅਤੀਤ',
-'filehist-help' => 'à¨\87à¨\9bਿਤ à¨¸à¨®à©\87à¨\82 à¨¤à©\87 à¨\9fਿà¨\95-à¨\9fਿਕ ਕਰੋ ਤਾਂ ਉਸ ਸਮੇਂ ਦੀ ਫਾਈਲ ਪੇਸ਼ ਹੋ ਜਾਵੇਗੀ।',
+'file-anchor-link' => 'ਫ਼ਾà¨\88ਲ',
+'filehist' => 'ਫ਼ਾà¨\88ਲ à¨¦à¨¾ ਅਤੀਤ',
+'filehist-help' => 'ਤਾਰà©\80à¨\96਼/ਸਮà©\87à¨\82 â\80\99ਤà©\87 à¨\95ਲਿੱਕ ਕਰੋ ਤਾਂ ਉਸ ਸਮੇਂ ਦੀ ਫਾਈਲ ਪੇਸ਼ ਹੋ ਜਾਵੇਗੀ।',
 'filehist-deleteall' => 'ਸਭ ਹਟਾਓ',
 'filehist-deleteone' => 'ਇਹ ਹਟਾਓ',
-'filehist-revert' => 'ਰà©\80ਵਰà¨\9f',
+'filehist-revert' => 'à¨\89ਲà¨\9fਾà¨\93',
 'filehist-current' => 'ਮੌਜੂਦਾ',
-'filehist-datetime' => 'ਮਿਤà©\80/ਸਮਾਂ',
-'filehist-thumb' => 'à¨\85à©°à¨\97à©\82ਠਾà¨\95ਾਰ',
+'filehist-datetime' => 'ਤਾਰà©\80à¨\96਼/ਸਮਾਂ',
+'filehist-thumb' => 'ਨਮà©\82ਨਾ',
 'filehist-thumbtext' => '$1 ਦੇ ਸਮੇਂ ਦੇ ਸੰਸਕਰਨ ਦਾ ਅੰਗੂਠਾਕਾਰ ਪ੍ਰਤੀਰੂਪ',
-'filehist-user' => 'ਯੂਜ਼ਰ',
-'filehist-dimensions' => 'ਮਾਪ',
+'filehist-nothumb' => 'ਕੋਈ ਨਮੂਨਾ-ਤਸਵੀਰ ਨਹੀਂ',
+'filehist-user' => 'ਮੈਂਬਰ',
+'filehist-dimensions' => 'ਨਾਪ',
 'filehist-filesize' => 'ਫਾਇਲ ਆਕਾਰ',
 'filehist-comment' => 'ਟਿੱਪਣੀ',
-'imagelinks' => 'ਫ਼ਾਈਲ ਦੀ ਵਰਤੌਂ',
-'linkstoimage' => 'ਹੇਠ ਲਿਖਿਤ {{PLURAL:$1|ਪੰਨੇ ਦਾ ਹਵਾਲਾ ਹੈ|$1 ਪੰਨੇ ਦੇ ਹਵਾਲੇ ਹਨ}} to this file:',
-'nolinkstoimage' => 'ਇਸ ਮਿਸਲ ਨਾਲ ਕੋਈ ਵਿ ਸਫ਼ੇ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ ।',
-'sharedupload-desc-here' => 'ਇਹ ਮਿਸਲ $1 ਦੀ ਹੈ ਅਤੇ ਹੋਰ ਪ੍ਰਾਜੈਕਟਾਂ ਵਿਚ ਵੀ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ । ਇਸ ਦੇ [$2 ਮਿਸਲ ਵਾਲੇ ਬ੍ਰਿਤਾਂਤ ਪੰਨੇ] ਵਿਚ ਮੌਜੂਦ ਵਰਨਣ ਨਿਮਨ ਲਿਖਿਤ ਹੈ।',
+'filehist-missing' => 'ਫ਼ਾਈਲ ਗੁੰਮ',
+'imagelinks' => 'ਫ਼ਾਈਲ ਦੀ ਵਰਤੋਂ',
+'linkstoimage' => 'ਇਹ {{PLURAL:$1|ਸਫ਼ੇ ਦੇ ਲਿੰਕ|$1 ਸਫ਼ੇ}} ਇਸ ਫ਼ਾਈਲ ਨਾਲ਼ ਜੋੜਦੇ ਹਨੇ:',
+'nolinkstoimage' => 'ਕੋਈ ਵੀ ਸਫ਼ਾ ਇਸ ਫ਼ਾਈਲ ਨਾਲ਼ ਨਹੀਂ ਜੋੜਦਾ।',
+'morelinkstoimage' => 'ਇਸ ਫ਼ਾਈਲ ਨਾਲ਼ ਜੋੜਦੇ [[Special:WhatLinksHere/$1|ਹੋਰ ਲਿੰਕ]] ਵੇਖੋ।',
+'sharedupload' => 'ਇਹ ਫ਼ਾਈਲ $1 ਤੋਂ ਹੈ ਅਤੇ ਸ਼ਾਇਦ ਦੂਜੇ ਪ੍ਰੋਜੈਕਟਾਂ ਤੇ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ।',
+'sharedupload-desc-there' => 'ਇਹ ਫ਼ਾਈਲ $1 ਤੋਂ ਹੈ ਅਤੇ ਸ਼ਾਇਦ ਦੂਜੇ ਪ੍ਰੋਜੈਕਟਾਂ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ।
+ਜ਼ਿਆਦਾ ਜਾਣਕਾਰੀ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ [$2 ਫ਼ਾਈਲ ਦਾ ਵੇਰਵਾ ਸਫ਼ਾ] ਵੇਖੋ।',
+'sharedupload-desc-here' => 'ਇਹ ਫ਼ਾਈਲ $1 ਦੀ ਹੈ ਅਤੇ ਹੋਰ ਪ੍ਰਾਜੈਕਟਾਂ ਵਿਚ ਵੀ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ । ਇਸ [$2 ਫ਼ਾਈਲ ਦੇ ਵੇਰਵਾ ਸਫ਼ੇ] ਵਿਚ ਮੌਜੂਦ ਵੇਰਵਾ ਹੇਠ ਦਿਸ ਰਿਹਾ ਹੈ।',
+'sharedupload-desc-edit' => 'ਇਹ ਫ਼ਾਈਲ $1 ਤੋਂ ਹੈ ਅਤੇ ਸ਼ਾਇਦ ਦੂਜੇ ਪ੍ਰੋਜੈਕਟਾਂ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ।
+ਸ਼ਾਇਦ ਤੁਸੀਂ [$2 ਫ਼ਾਈਲ ਦੇ ਵੇਰਵੇ ਸਫ਼ੇ] ਤੇ ਇਸਦਾ ਵੇਰਵਾ ਬਦਲਣਾ ਚਾਹੋ।',
+'sharedupload-desc-create' => 'ਇਹ ਫ਼ਾਈਲ $1 ਤੋਂ ਹੈ ਅਤੇ ਸ਼ਾਇਦ ਦੂਜੇ ਪ੍ਰੋਜੈਕਟਾਂ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ।
+ਸ਼ਾਇਦ ਤੁਸੀਂ [$2 ਫ਼ਾਈਲ ਦੇ ਵੇਰਵੇ ਸਫ਼ੇ] ਤੇ ਇਸਦਾ ਵੇਰਵਾ ਬਦਲਣਾ ਚਾਹੋ।',
+'filepage-nofile' => 'ਇਸ ਨਾਮ ਦੀ ਕੋਈ ਫ਼ਾਈਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
+'filepage-nofile-link' => 'ਇਸ ਨਾਮ ਦੀ ਕੋਈ ਫ਼ਾਈਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ ਪਰ ਤੁਸੀਂ [$1 ਇਸਨੂੰ ਅੱਪਲੋਡ ਕਰ] ਸਕਦੇ ਹੋ।',
 'uploadnewversion-linktext' => 'ਇਸ ਫਾਇਲ ਦਾ ਇੱਕ ਨਵਾਂ ਵਰਜਨ ਅੱਪਲੋਡ ਕਰੋ',
+'shared-repo-from' => '$1 ਤੋਂ',
 
 # File reversion
 'filerevert' => '$1 ਰੀਵਰਟ',
@@ -808,17 +1290,39 @@ to upload files.',
 # File deletion
 'filedelete' => '$1 ਹਟਾਓ',
 'filedelete-legend' => 'ਫਾਇਲ ਹਟਾਓ',
+'filedelete-intro' => "ਤੁਸੀਂ ਸਾਰੇ ਅਤੀਤ ਸਮੇਤ ਫ਼ਾਈਲ '''[[Media:$1|$1]]''' ਨੂੰ ਮਿਟਾਉਣ ਵਾਲ਼ੇ ਹੋ।",
+'filedelete-intro-old' => "ਤੁਸੀਂ ਫ਼ਾਈਲ '''[[Media:$1|$1]]''' ਦਾ [$4 $2, $3] ਵਾਲ਼ਾ ਰੂਪ ਮਿਟਾ ਰਹੇ ਹੋ।",
 'filedelete-comment' => 'ਕਾਰਨ:',
 'filedelete-submit' => 'ਹਟਾਓ',
 'filedelete-success' => "'''$1''' ਨੂੰ ਹਟਾਇਆ ਗਿਆ।",
+'filedelete-success-old' => "ਫ਼ਾਈਲ '''[[Media:$1|$1]]''' ਦਾ $2, $3 ਵਾਲ਼ਾ ਰੂਪ ਮਿਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।",
+'filedelete-nofile' => "'''$1''' ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
+'filedelete-otherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
+'filedelete-reason-otherlist' => 'ਹੋਰ ਕਾਰਨ',
+'filedelete-reason-dropdown' => '* ਮਿਟਾਉਣ ਦੇ ਆਮ ਕਾਰਨ
+** ਡੁਪਲੀਕੇਟ ਫ਼ਾਈਲ
+** ਕਾਪੀਰਾਈਟ ਦੀ ਉਲੰਘਣਾ',
+'filedelete-edit-reasonlist' => 'ਮਿਟਾਉਣ ਦੇ ਕਾਰਨ ਸੋਧੋ',
+'filedelete-maintenance-title' => 'ਫ਼ਾਈਲ ਮਿਟਾ ਨਹੀਂ ਸਕਦੇ',
 
 # MIME search
 'mimesearch' => 'MIME ਖੋਜ',
 'mimetype' => 'MIME ਕਿਸਮ:',
 'download' => 'ਡਾਊਨਲੋਡ',
 
+# Unwatched pages
+'unwatchedpages' => 'ਨਜ਼ਰ ਹੇਠ ਨਾ ਰੱਖੇ ਗਏ ਸਫ਼ੇ',
+
+# List redirects
+'listredirects' => 'ਰੀਡਾਇਰੈਕਟਾਂ ਦੀ ਲਿਸਟ',
+
+# Unused templates
+'unusedtemplates' => 'ਅਣ-ਵਰਤੇ ਗਏ ਸਾਂਚੇ',
+'unusedtemplateswlh' => 'ਹੋਰ ਲਿੰਕ',
+
 # Random page
-'randompage' => 'ਰਲਵਾਂ ਪੇਜ਼',
+'randompage' => 'ਰਲ਼ਵਾਂ ਸਫ਼ਾ',
+'randompage-nopages' => '{{PLURAL:$2|ਇਸ ਥਾਂ-ਨਾਮ|ਇਹਨਾਂ ਥਾਂ-ਨਾਂਵਾ}} ਵਿਚ ਕੋਈ ਸਫ਼ਾ ਨਹੀਂ ਹੈ: $1।',
 
 # Statistics
 'statistics' => 'ਅੰਕੜੇ',
@@ -826,95 +1330,198 @@ to upload files.',
 'statistics-header-edits' => 'ਸੋਧ ਅੰਕੜੇ',
 'statistics-header-views' => 'ਵੇਖਣ ਅੰਕੜੇ',
 'statistics-header-users' => 'ਯੂਜ਼ਰ ਅੰਕੜੇ',
+'statistics-header-hooks' => 'ਹੋਰ ਆਂਕੜੇ',
+'statistics-pages' => 'ਸਫ਼ੇ',
+'statistics-pages-desc' => 'ਇਸ ਵਿਕੀ ਦੇ ਸਾਰੇ ਸਫ਼ੇ, ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ, ਰੀਡਾਇਰੈਕਟਾਂ ਇਤਿਆਦਿ ਨੂੰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋਏ',
+'statistics-files' => 'ਅੱਪਲੋਡ ਹੋਈਆਂ ਫ਼ਾਈਲਾਂ',
+'statistics-edits-average' => 'ਪ੍ਰਤੀ ਸਫ਼ਾ ਔਸਤਨ ਸੋਧਾਂ',
+'statistics-users' => 'ਰਜਿਸਟਰ ਹੋਏ [[Special:ListUsers|ਮੈਂਬਰ]]',
+'statistics-users-active' => 'ਚੁਸਤ ਮੈਂਬਰ',
+'statistics-users-active-desc' => 'ਮੈਂਬਰ, ਜਿੰਨ੍ਹਾ ਨੇ ਆਖ਼ਰੀ {{PLURAL:$1|ਦਿਨ|$1 ਦਿਨਾਂ}} ਵਿਚ ਕੋਈ ਕੰਮ ਕੀਤਾ ਹੈ।',
 'statistics-mostpopular' => 'ਸਭ ਤੋਂ ਵੱਧ ਵੇਖੇ ਪੇਜ',
 
+'doubleredirects' => 'ਦੋਹਰੇ ਰੀਡਿਰੈਕਟ',
+
+'brokenredirectstext' => 'ਇਹ ਰਿਡਿਰੈਕਟ ਨਾ-ਮੌਜੂਦ ਸਫ਼ਿਆਂ ’ਤੇ ਜੋੜਦੇ ਹਨ:',
 'brokenredirects-edit' => 'ਸੋਧ',
 'brokenredirects-delete' => 'ਹਟਾਓ',
 
+'withoutinterwiki' => 'ਬਿਨਾਂ ਬੋਲੀ ਲਿੰਕਾਂ ਦੇ ਸਫ਼ੇ',
+'withoutinterwiki-summary' => 'ਇਹ ਸਫ਼ੇ ਹੋਰ ਬੋਲੀਆਂ ਵਾਲ਼ੇ ਵਰਜਨਾਂ ਨਾਲ਼ ਨਹੀਂ ਜੁੜਦੇ।',
+'withoutinterwiki-legend' => 'ਅਗੇਤਰ',
+'withoutinterwiki-submit' => 'ਵਖਾਓ',
+
+'fewestrevisions' => 'ਸਭ ਤੋਂ ਘੱਟ ਰੀਵਿਜ਼ਨਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|ਬਾਈਟ|ਬਾਈਟ}}',
+'ncategories' => '$1 {{PLURAL:$1|ਕੈਟੇਗਰੀ|ਕੈਟੇਗਰੀਆਂ}}',
+'nlinks' => '$1 {{PLURAL:$1|ਲਿੰਕ|ਲਿੰਕ}}',
 'nmembers' => '$1 {{PLURAL:$1|ਮੈਂਬਰ|ਮੈਂਬਰ}}',
+'nrevisions' => '$1 {{PLURAL:$1|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}}',
+'nviews' => '$1 {{PLURAL:$1|ਨਜ਼ਾਰਾ|ਨਜ਼ਾਰੇ}}',
+'nimagelinks' => '$1 {{PLURAL:$1|ਸਫ਼ੇ|ਸਫ਼ਿਆਂ}} ’ਤੇ ਵਰਤਿਆ ਹੋਇਆ',
+'ntransclusions' => '$1 {{PLURAL:$1|ਸਫ਼ੇ|ਸਫ਼ਿਆਂ}} ’ਤੇ ਵਰਤਿਆ ਹੋਇਆ',
+'specialpage-empty' => 'ਇਸ ਰਿਪੋਟ ਦਾ ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਹੈ।',
+'lonelypages' => 'ਯਤੀਮ ਸਫ਼ੇ',
+'uncategorizedpages' => 'ਬਗ਼ੈਰ ਕੈਟੇਗਰੀਆਂ ਵਾਲ਼ੇ ਸਫ਼ੇ',
+'uncategorizedcategories' => 'ਬਗ਼ੈਰ ਕੈਟੇਗਰੀਆਂ ਵਾਲ਼ੀਆਂ ਕੈਟੇਗਰੀਆਂ',
+'uncategorizedimages' => 'ਬਗ਼ੈਰ ਕੈਟੇਗਰੀਆਂ ਵਾਲ਼ੀਆਂ ਫ਼ਾਈਲਾਂ',
+'uncategorizedtemplates' => 'ਬਗ਼ੈਰ ਕੈਟੇਗਰੀਆਂ ਵਾਲ਼ੇ ਸਾਂਚੇ',
 'unusedcategories' => 'ਅਣਵਰਤੀਆਂ ਕੈਟਾਗਰੀਆਂ',
 'unusedimages' => 'ਅਣਵਰਤੀਆਂ ਫਾਇਲਾਂ',
 'popularpages' => 'ਪਾਪੂਲਰ ਪੇਜ',
-'prefixindex' => 'ਇਸ ਅਗੇਤਰ ਵਾਲੇ ਸਾਰੇ ਪੰਨੇ',
+'wantedcategories' => 'ਚਾਹੀਦੀਆਂ ਕੈਟੇਗਰੀਆਂ',
+'wantedpages' => 'ਚਾਹੀਦੇ ਸਫ਼ੇ',
+'wantedfiles' => 'ਚਾਹੀਦੀਆਂ ਫ਼ਾਈਲਾਂ',
+'wantedtemplates' => 'ਚਾਹੀਦੇ ਸਾਂਚੇ',
+'mostcategories' => 'ਸਭ ਤੋਂ ਵੱਧ ਕੈਟੇਗਰੀਆਂ ਵਾਲ਼ੇ ਸਫ਼ੇ',
+'prefixindex' => 'ਇਸ ਅਗੇਤਰ ਵਾਲ਼ੇ ਸਾਰੇ ਸਫ਼ੇ',
 'shortpages' => 'ਛੋਟੇ ਪੇਜ',
 'listusers' => 'ਯੂਜ਼ਰ ਲਿਸਟ',
-'usercreated' => ' $1 ਨੂੰ $2 ਵਜੇ {{GENDER:$3|ਮੈਂਬਰ ਨੇ ਰਚਿਆ}}',
-'newpages' => 'ਨਵà©\87à¨\82 à¨ªà©\87à¨\9c',
+'usercreated' => '$1 ਨੂੰ $2 ’ਤੇ {{GENDER:$3|ਰਚਿਆ}}',
+'newpages' => 'ਨਵà©\87à¨\82 à¨¸à¨«à¨¼à©\87',
 'newpages-username' => 'ਯੂਜ਼ਰ ਨਾਂ:',
 'ancientpages' => 'ਸਭ ਤੋਂ ਪੁਰਾਣੇ ਪੇਜ',
 'move' => 'ਭੇਜੋ',
 'movethispage' => 'ਇਹ ਪੇਜ ਭੇਜੋ',
+'unusedcategoriestext' => 'ਇਹ ਕੈਟੇਗਰੀ ਸਫ਼ੇ ਮੌਜੂਦ ਹਨ ਹਾਲਾਂਕਿ ਕਿਸੇ ਵੀ ਸਫ਼ੇ ਜਾਂ ਕੈਟੇਗਰੀ ਨੇ ਇਹਨਾਂ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ।',
 'notargettitle' => 'ਟਾਰਗੇਟ ਨਹੀਂ',
 'pager-newer-n' => '{{PLURAL:$1|੧ ਨਵਾਂ|$1 ਨਵੇਂ}}',
+'pager-older-n' => '{{PLURAL:$1|੧ ਪੁਰਾਣਾ|$1 ਪੁਰਾਣੇ}}',
 
 # Book sources
 'booksources' => 'ਕਿਤਾਬ ਸਰੋਤ',
-'booksources-search-legend' => 'à¨\95ਿਤਾਬ à¨¸à¨°à©\8bਤ à¨²à¨\88 à¨\96à©\8bà¨\9c',
+'booksources-search-legend' => 'à¨\95ਿਤਾਬ à¨¸à¨°à©\8bਤ à¨\96à©\8bà¨\9cà©\8b',
 'booksources-go' => 'ਜਾਓ',
+'booksources-invalid-isbn' => 'ਦਿੱਤਾ ਗਿਆ ISBN ਸਹੀ ਨਹੀਂ ਲਗਦਾ, ਅਸਲੀ ਸਰੋਤ ਤੋਂ ਨਕਲ ਕਰਦੇ ਵਕਤ ਹੋਈਆਂ ਗ਼ਲਤੀਆਂ ਜਾਂਚੋ।',
 
 # Special:Log
 'specialloguserlabel' => 'ਯੂਜ਼ਰ:',
 'speciallogtitlelabel' => 'ਟਾਇਟਲ:',
-'log' => 'ਲਾਗ',
-'all-logs-page' => 'ਸਭ ਲਾਗ',
+'log' => 'ਚਿੱਠੇ',
+'all-logs-page' => 'ਸਾਰੇ ਆਮ ਚਿੱਠੇ',
+'logempty' => 'ਚਿੱਠੇ ’ਚ ਮੇਲ ਖਾਂਦੀ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।',
+'log-title-wildcard' => 'ਇਸ ਲਿਖਤ ਨਾਲ਼ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ ਸਿਰਲੇਖ ਖੋਜੋ',
+'showhideselectedlogentries' => 'ਚਿੱਠੇ ਦੇ ਚੁਣੇ ਹੋਏ ਦਾਖ਼ਲੇ ਵਖਾਓ/ਲੁਕਾਓ',
 
 # Special:AllPages
-'allpages' => 'ਸਭ à¨ªà©\87à¨\9c',
+'allpages' => 'ਸਭ à¨¸à¨«à¨¼à©\87',
 'alphaindexline' => '$1 ਤੋਂ $2',
 'nextpage' => 'ਅੱਗੇ ਪੇਜ ($1)',
 'prevpage' => 'ਪਿੱਛੇ ਪੇਜ ($1)',
-'allarticles' => 'ਸਭ ਲੇਖ',
+'allpagesfrom' => 'ਇਸਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵਖਾਓ:',
+'allpagesto' => 'ਇਸਤੇ ਖ਼ਤਮ ਹੋਣ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵਖਾਓ:',
+'allarticles' => 'ਸਭ ਸਫ਼ੇ',
 'allinnamespace' => 'ਸਭ ਪੇਜ ($1 ਨੇਮਸਪੇਸ)',
 'allnotinnamespace' => 'ਸਭ ਪੇਜ ($1 ਨੇਮਸਪੇਸ ਵਿੱਚ ਨਹੀਂ)',
 'allpagesprev' => 'ਪਿੱਛੇ',
 'allpagesnext' => 'ਅੱਗੇ',
 'allpagessubmit' => 'ਜਾਓ',
+'allpagesprefix' => 'ਇਸ ਅਗੇਤਰ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵਖਾਓ:',
+'allpages-bad-ns' => '{{SITENAME}} ’ਤੇ "$1" ਥਾਂ-ਨਾਮ ਨਹੀਂ ਹੈ।',
+'allpages-hide-redirects' => 'ਰੀਡਿਰੈਕਟ ਲੁਕਾਓ',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'ਸਭ ਤੋਂ ਨਵਾਂ ਵੇਖੋ।',
 
 # Special:Categories
 'categories' => 'ਕੈਟਾਗਰੀਆਂ',
+'categoriesfrom' => 'ਇਸਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੀਆਂ ਕੈਟੇਗਰੀਆਂ ਵਖਾਓ:',
+'special-categories-sort-count' => 'ਗਿਣਤੀ ਮੁਤਾਬਕ ਤਰਤੀਬ ਦੇਵੋ',
+'special-categories-sort-abc' => 'ਅੱਖਰਾਂ ਮੁਤਾਬਕ ਤਰਤੀਬ ਦੇਵੋ',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'ਮਿਟਾਏ ਹੋਏ ਮੈਂਬਰ ਯੋਗਦਾਨ',
+'deletedcontributions-title' => 'ਮਿਟਾਏ ਹੋਏ ਮੈਂਬਰ ਯੋਗਦਾਨ',
+'sp-deletedcontributions-contribs' => 'ਯੋਗਦਾਨ',
 
 # Special:LinkSearch
 'linksearch' => 'ਬਾਹਰੀ ਲਿੰਕ',
+'linksearch-ns' => 'ਥਾਂ-ਨਾਮ:',
+'linksearch-ok' => 'ਖੋਜੋ',
 'linksearch-line' => '$2 ਵਿਚ $1 ਬਾਹਰੀ ਸਿਰਨਾਵਾਂ ਹੈ',
 
 # Special:ListUsers
+'listusersfrom' => 'ਇਸਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ ਮੈਂਬਰ ਵਖਾਓ:',
 'listusers-submit' => 'ਵੇਖੋ',
 '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:Log/newusers
-'newuserlogpage' => 'ਮੈਂਬਰ ਖਾਤਾ ਉਸਾਰੀ ਚਿੱਠਾ',
+'newuserlogpage' => 'ਬਣਾਏ ਖਾਤਿਆਂ ਦਾ ਚਿੱਠਾ',
+'newuserlogpagetext' => 'ਇਹ ਬਣੇ ਮੈਂਬਰਾਂ ਦਾ ਚਿੱਠਾ ਹੈ।',
 
 # Special:ListGroupRights
 'listgrouprights-group' => 'ਗਰੁੱਪ',
+'listgrouprights-rights' => 'ਹੱਕ',
+'listgrouprights-helppage' => 'Help:ਗਰੁੱਪ ਹੱਕ',
 'listgrouprights-members' => '(ਮੈਂਬਰਾਂ ਦੀ ਲਿਸਟ)',
+'listgrouprights-addgroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਜੋੜੋ',
+'listgrouprights-removegroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਹਟਾਓ',
 
 # E-mail user
 'mailnologin' => 'ਕੋਈ ਭੇਜਣ ਐਡਰੈੱਸ ਨਹੀਂ',
-'emailuser' => 'ਇਹ ਯੂਜ਼ਰ ਨੂੰ ਈਮੇਲ ਕਰੋ',
+'mailnologintext' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ [[Special:UserLogin|ਲਾਗਇਨ]] ਹੋਣਾ ਅਤੇ ਆਪਣੀਆਂ [[Special:Preferences|ਪਸੰਦਾਂ]] ਵਿਚ ਇਕ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦੇਣਾ ਪਵੇਗਾ।',
+'emailuser' => 'ਇਸ ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
 'emailpage' => 'ਯੂਜ਼ਰ ਨੂੰ ਈਮੇਲ ਕਰੋ',
 'defemailsubject' => '{{SITENAME}} ਈਮੇਲ',
+'usermaildisabled' => 'ਮੈਂਬਰ ਈ-ਮੇਲ ਬੰਦ ਹੈ',
+'usermaildisabledtext' => 'ਇਸ ਵਿਕੀ ’ਤੇ ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਨਹੀਂ ਭੇਜ ਸਕਦੇ',
 'noemailtitle' => 'ਕੋਈ ਈਮੇਲ ਐਡਰੈੱਸ ਨਹੀਂ',
+'noemailtext' => 'ਇਸ ਮੈਂਬਰ ਨੇ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਨਹੀਂ ਦਿੱਤਾ ਹੋਇਆ।',
+'nowikiemailtitle' => 'ਈ-ਮੇਲ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ',
+'nowikiemailtext' => 'ਇਸ ਮੈਂਬਰ ਨੇ ਦੂਜੇ ਮੈਂਬਰਾਂ ਤੋਂ ਈ-ਮੇਲ ਨਾ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚੁਣ ਰੱਖਿਆ ਹੈ।',
+'emailnotarget' => 'ਪ੍ਰਾਪਤ ਕਰਤਾ ਦਾ ਨਾ-ਮੌਜੂਦ ਜਾਂ ਗ਼ਲਤ ਮੈਂਬਰ-ਨਾਂ।',
+'emailtarget' => 'ਪ੍ਰਾਪਤ ਕਰਤਾ ਦਾ ਮੈਂਬਰ-ਨਾਂ ਦਾਖ਼ਲ ਕਰੋ',
+'emailusername' => 'ਮੈਂਬਰ-ਨਾਂ:',
+'emailusernamesubmit' => 'ਭੇਜੋ',
+'email-legend' => 'ਕਿਸੇ ਦੂਜੇ {{SITENAME}} ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
 'emailfrom' => 'ਵਲੋਂ:',
 'emailto' => 'ਵੱਲ:',
 'emailsubject' => 'ਵਿਸ਼ਾ:',
 'emailmessage' => 'ਸੁਨੇਹਾ:',
 'emailsend' => 'ਭੇਜੋ',
 'emailccme' => 'ਸੁਨੇਹੇ ਦੀ ਇੱਕ ਕਾਪੀ ਮੈਨੂੰ ਵੀ ਭੇਜੋ।',
+'emailccsubject' => '$1 ਨੂੰ ਭੇਜੇ ਤੁਹਾਡੇ ਸੁਨੇਹੇ ਦੀ ਨਕਲ: $2',
 'emailsent' => 'ਈਮੇਲ ਭੇਜੀ ਗਈ',
 'emailsenttext' => 'ਤੁਹਾਡੀ ਈਮੇਲ ਭੇਜੀ ਗਈ ਹੈ।',
+'emailuserfooter' => 'ਇਹ ਈ-ਮੇਲ $1 ਨੇ {{SITENAME}} ’ਤੇ "ਇਸ ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ" ਸਹੂਲਤ ਜ਼ਰੀਏ $2 ਨੂੰ ਭੇਜੀ ਸੀ।',
 
 # Watchlist
-'watchlist' => 'ਮà©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸਟ',
-'mywatchlist' => 'ਮà©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸਟ',
+'watchlist' => 'ਮà©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸਟ',
+'mywatchlist' => 'ਮà©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸਟ',
 'watchlistfor2' => '$1 $2 ਲਈ',
+'nowatchlist' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।',
+'watchlistanontext' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ ਵੇਖਣ ਜਾਂ ਸੋਧਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ $1।',
 'watchnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
-'watch' => 'ਵਾਚ',
+'watchnologintext' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਫੇਰ-ਬਦਲ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ [[Special:UserLogin|ਲਾਗਇਨ]] ਕਰਨਾ ਪਵੇਗਾ।',
+'addwatch' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ’ਚ ਜੋੜੋ',
+'addedwatchtext' => "ਸਫ਼ਾ \"[[:\$1]]\" ਤੁਹਾਡੀ [[Special:Watchlist|ਨਿਗਰਾਨੀ-ਲਿਸਟ]] ’ਚ ਜੁੜ ਚੁੱਕਾ ਹੈ।
+ਇਸ ਅਤੇ ਇਸਦੇ ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ’ਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਓਥੇ ਵਖਾਈ ਦੇਣਗੀਆਂ ਅਤੇ ਵੇਖਣ ਦੀ ਸੌਖ ਲਈ [[Special:RecentChanges|ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਦੀ ਲਿਸਟ]] ਵਿਚ ਇਹ ਸਫ਼ਾ '''ਗੂੜ੍ਹਾ''' ਦਿਖਾਈ ਦੇਵੇਗਾ।",
+'removewatch' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ’ਚੋਂ ਹਟਾਓ',
+'removedwatchtext' => 'ਸਫ਼ਾ "[[:$1]]" [[Special:Watchlist|ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ]] ’ਚੋਂ ਹਟ ਚੁੱਕਾ ਹੈ।',
+'watch' => 'ਨਜ਼ਰ ਰੱਖੋ',
 'watchthispage' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
-'unwatch' => 'ਅਣ-ਵਾਚ',
-'wlshowlast' => 'ਆਖਰੀ $1 ਦਿਨ $2 ਘੰਟੇ $3 ਵੇਖੋ',
-'watchlist-options' => 'ਧਿਆਨ ਗੋਚਰ ਸੂਚੀ ਵਿਕਲਪ',
+'unwatch' => 'ਨਜ਼ਰ ਹਟਾਓ',
+'unwatchthispage' => 'ਨਜ਼ਰ ਰੱਖਣੀ ਬੰਦ ਕਰੋ',
+'notvisiblerev' => 'ਇੱਕ ਵੱਖਰੇ ਮੈਂਬਰ ਦੀ ਬਣਾਈ ਆਖ਼ਰੀ ਰੀਵਿਜ਼ਨ ਮਿਟਾਈ ਜਾ ਚੁੱਕੀ ਹੈ',
+'watchnochange' => 'ਵਖਾਏ ਜਾ ਰਹੇ ਸਮੇਂ ਅੰਦਰ ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲਾ ਕੋਈ ਵੀ ਸਫ਼ਾ ਸੋਧਿਆ ਨਹੀਂ ਗਿਆ।',
+'watchlist-details' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ {{PLURAL:$1|$1 ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।',
+'watchlistcontains' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ $1 {{PLURAL:$1|ਸਫ਼ਾ ਹੈ|ਸਫ਼ੇ ਹਨ}}।',
+'wlnote' => "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|'''$2''' ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:
+$1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ}}, ਹੇਠਾਂ ਵੇਖੋ।",
+'wlshowlast' => 'ਆਖ਼ਰੀ $1 ਦਿਨ $2 ਘੰਟੇ $3 ਵਖਾਓ',
+'watchlist-options' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਦੇ ਇਖ਼ਤਿਆਰ',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...',
@@ -924,36 +1531,74 @@ to upload files.',
 'enotif_impersonal_salutation' => '{{SITENAME}} ਯੂਜ਼ਰ',
 'changed' => 'ਬਦਲਿਆ',
 'created' => 'ਬਣਾਇਆ',
+'enotif_lastvisited' => 'ਤੁਹਾਡੀ ਆਖ਼ਰੀ ਆਮਦ ਤੋਂ ਲੈ ਕੇ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।',
+'enotif_lastdiff' => 'ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।',
 'enotif_anon_editor' => 'ਅਗਿਆਤ ਯੂਜ਼ਰ $1',
 
 # Delete
 'deletepage' => 'ਪੇਜ ਹਟਾਓ',
 'confirm' => 'ਪੁਸ਼ਟੀ',
 'excontent' => "ਸਮੱਗਰੀ ਸੀ: '$1'",
+'exbeforeblank' => 'ਖ਼ਾਲੀ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਸਮੱਗਰੀ ਸੀ: "$1"',
 'exblank' => 'ਪੇਜ ਖਾਲੀ ਹੈ',
 'delete-confirm' => '"$1" ਹਟਾਓ',
 'delete-legend' => 'ਹਟਾਓ',
-'actioncomplete' => 'ਐਕਸ਼ਨ ਪੂਰਾ ਹੋਇਆ',
-'actionfailed' => 'ਹਰਕਤ ਨਿਸ਼ਫ਼ਲ',
-'dellogpage' => 'ਹਟਾਉਣ ਲਾਗ',
+'historywarning' => "'''ਖ਼ਬਰਦਾਰ:''' ਜੋ ਸਫ਼ਾ ਤੁਸੀਂ ਮਿਟਾਉਣ ਜਾ ਰਹੇ ਹੋ ਉਸਦਾ ਅਤੀਤ ਤਕਰੀਬਨ $1 {{PLURAL:$1|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}} ਦਾ ਹੈ:",
+'actioncomplete' => 'ਕਾਰਵਾਈ ਪੂਰੀ ਹੋਈ',
+'actionfailed' => 'ਕਾਰਵਾਈ ਨਾਕਾਮ',
+'deletedtext' => '"$1" ਮਿਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।
+ਤਾਜ਼ੀਆਂ ਮਿਟਾਉਣਾਂ ਦੇ ਰਿਕਾਰਡ ਲਈ $2 ਵੇਖੋ।',
+'dellogpage' => 'ਮਿਟਾਉਣ ਦਾ ਚਿੱਠਾ',
+'dellogpagetext' => 'ਹੇਠਾਂ ਸਭ ਤੋਂ ਤਾਜ਼ਾ ਮਿਟਾਉਣਾਂ ਦੀ ਲਿਸਟ ਹੈ।',
+'deletionlog' => 'ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ',
 'deletecomment' => 'ਕਾਰਨ:',
 'deleteotherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
 'deletereasonotherlist' => 'ਹੋਰ ਕਾਰਨ',
+'deletereason-dropdown' => '*ਮਿਟਾਉਣ ਦੇ ਆਮ ਕਾਰਨ
+**ਲੇਖਕ ਦੇ ਕਹਿਣ ’ਤੇ
+**ਕਾਪੀਰਾਈਟ ਦੀ ਉਲੰਘਣਾ
+**ਵੰਦਾਲਿਜ਼ਮ',
+'delete-edit-reasonlist' => 'ਮਿਟਾਉਣ ਦੇ ਕਾਰਨ ਸੋਧੋ',
 
 # Rollback
+'rollback' => 'ਸੋਧਾਂ ਵਾਪਸ ਮੋੜੋ',
 'rollback_short' => 'ਰੋਲਬੈਕ',
-'rollbacklink' => 'ਰੋਲਬੈਕ',
+'rollbacklink' => 'ਵਾਪਸ ਮੋੜੋ',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}} ਵਾਪਸ ਮੋੜੋ',
+'rollbacklinkcount-morethan' => '$1 ਤੋਂ ਜ਼ਿਆਦਾ {{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}} ਵਾਪਸ ਮੋੜੋ',
 'rollbackfailed' => 'ਰੋਲਬੈਕ ਫੇਲ੍ਹ',
+'editcomment' => "ਸੋਧ ਸਾਰ ਸੀ: \"''\$1''\"",
 
 # Protect
-'protectlogpage' => 'ਸੁਰੱਖਿਆ ਲਾਗ',
+'protectlogpage' => 'ਸੁਰੱਖਿਆ ਚਿੱਠਾ',
+'protectedarticle' => '"[[$1]]" ਸੁਰੱਖਿਅਤ ਕੀਤਾ',
+'modifiedarticleprotection' => '"[[$1]]" ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੀ',
+'unprotectedarticle' => '"[[$1]]" ਤੋਂ ਸੁਰੱਖਿਆ ਹਟਾਈ',
+'protect-title' => '"$1" ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ',
+'protect-title-notallowed' => '"$1" ਦਾ ਸੁਰੱਖਿਆ ਦਰਜਾ ਵੇਖੋ',
+'prot_1movedto2' => '[[$1]] ਨੂੰ [[$2]] ’ਤੇ ਭੇਜਿਆ',
+'protect-badnamespace-title' => 'ਨਾ-ਸੁਰੱਖਿਆਯੋਗ ਥਾਂ-ਨਾਮ',
+'protect-badnamespace-text' => 'ਇਸ ਥਾਂ-ਨਾਮ ਵਿਚਲੇ ਸਫ਼ੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ।',
 'protect-legend' => 'ਸੁਰੱਖਿਆ ਕਨਫਰਮ',
 'protectcomment' => 'ਕਾਰਨ:',
 'protectexpiry' => 'ਮਿਆਦ:',
+'protect_expiry_invalid' => 'ਖ਼ਤਮ ਹੋਣ ਦਾ ਸਮਾਂ ਗ਼ਲਤ ਹੈ।',
+'protect_expiry_old' => 'ਖ਼ਤਮ ਹੋਣ ਦਾ ਸਮਾਂ ਗੁਜ਼ਰਿਆ ਹੋਇਆ ਹੈ।',
+'protect-text' => "ਇੱਥੇ ਸ਼ਾਇਦ ਤੁਸੀਂ ਸਫ਼ਾ '''$1''' ਦਾ ਸੁਰੱਖਿਆ ਦਰਜਾ ਵੇਖ ਅਤੇ ਬਦਲ ਸਕਦੇ ਹੋ।",
 'protect-default' => 'ਸਭ ਯੂਜ਼ਰ ਮਨਜ਼ੂਰ',
 'protect-fallback' => '"$1" ਅਧਿਕਾਰ ਲੋੜੀਦਾ ਹੈ',
 'protect-level-autoconfirmed' => 'ਨਵੇਂ ਤੇ ਗ਼ੈਰ-ਰਜਿਸਟਰ ਯੂਜ਼ਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ',
 'protect-level-sysop' => 'ਕੇਵਲ ਪਰਸ਼ਾਸ਼ਕ',
+'protect-summary-cascade' => 'ਕਾਸਕੇਡਿੰਗ',
+'protect-cascade' => 'ਇਸ ਸਫ਼ੇ ਵਿਚ ਸ਼ਾਮਲ ਸਫ਼ੇ ਸੁਰੱਖਿਅਤ ਕਰੋ (ਕਾਸਕੇਡਿੰਗ ਸੁਰੱਖਿਆ)',
+'protect-cantedit' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ਦਾ ਸੁਰੱਖਿਆ ਦਰਜਾ ਨਹੀਂ ਬਦਲ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਹਾਨੂੰ ਇਸਨੂੰ ਸੋਧਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'protect-othertime' => 'ਹੋਰ ਸਮਾਂ',
+'protect-othertime-op' => 'ਹੋਰ ਸਮਾਂ',
+'protect-existing-expiry' => 'ਖ਼ਤਮ ਹੋਣ ਦਾ ਮੌਜੂਦਾ ਸਮਾਂ: $2, $3',
+'protect-otherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
+'protect-otherreason-op' => 'ਹੋਰ ਕਾਰਨ',
+'protect-edit-reasonlist' => 'ਸੁਰੱਖਿਆ ਦੇ ਕਾਰਨ ਸੋਧੋ',
+'protect-expiry-options' => '੧ ਘੰਟਾ:1 hour,੧ ਦਿਨ:1 day,੧ ਹਫ਼ਤਾ:1 week,੨ ਹਫ਼ਤੇ:2 weeks,੧ ਮਹੀਨਾ:1 month,੩ ਮਹੀਨੇ:3 months,੬ ਮਹੀਨੇ:6 months,੧ ਸਾਲ:1 year,ਬੇਹੱਦ:infinite',
 'restriction-type' => 'ਅਧਿਕਾਰ:',
 'minimum-size' => 'ਘੱਟੋ-ਘੱਟ ਆਕਾਰ',
 'maximum-size' => 'ਵੱਧੋ-ਵੱਧ ਆਕਾਰ',
@@ -962,6 +1607,7 @@ to upload files.',
 # Restrictions (nouns)
 'restriction-edit' => 'ਸੋਧ',
 'restriction-move' => 'ਭੇਜੋ',
+'restriction-create' => 'ਬਣਾਓ',
 'restriction-upload' => 'ਅੱਪਲੋਡ',
 
 # Restriction levels
@@ -970,54 +1616,69 @@ to upload files.',
 'restriction-level-all' => 'ਕੋਈ ਲੈਵਲ',
 
 # Undelete
+'undelete' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਵੇਖੋ',
+'undeletepage' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਵੇਖੋ ਅਤੇ ਮੁੜ ਬਹਾਲ ਕਰੋ',
+'viewdeletedpage' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਵੇਖੋ',
+'undelete-fieldset-title' => 'ਰੀਵਿਜ਼ਨਾਂ ਮੁੜ ਬਹਾਲ ਕਰੋ',
+'undelete-nodiff' => 'ਕੋਈ ਪਿਛਲੀ ਰੀਵਿਜ਼ਨ ਨਹੀਂ ਲੱਭੀ',
 'undeletebtn' => 'ਰੀਸਟੋਰ',
-'undeletelink' => 'ਵà©\87à¨\96à©\8b/ਰà©\80ਸà¨\9fà©\8bਰ',
-'undeleteviewlink' => 'ਦੇਖੋ',
+'undeletelink' => 'ਵà©\87à¨\96à©\8b/ਮà©\81à©\9c à¨¬à¨¹à¨¾à¨² à¨\95ਰà©\8b',
+'undeleteviewlink' => 'ਵੇਖੋ',
 'undeletereset' => 'ਰੀ-ਸੈੱਟ',
 'undeletecomment' => 'ਟਿੱਪਣੀ:',
+'undelete-header' => 'ਤਾਜ਼ੇ ਮਿਟਾਏ ਗਏ ਸਫ਼ਿਆਂ ਲਈ [[Special:Log/
+delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
+'undelete-search-title' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ',
+'undelete-search-box' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ',
+'undelete-search-submit' => 'ਖੋਜੋ',
 'undelete-show-file-submit' => 'ਹਾਂ',
 
 # Namespace form on various pages
-'namespace' => 'ਨਾà¨\82-ਥਾà¨\82:',
+'namespace' => 'ਥਾà¨\82-ਨਾਮ:',
 'invert' => 'ਉਲਟ ਚੋਣ',
 'blanknamespace' => '(ਮੁੱਖ)',
 
 # Contributions
-'contributions' => 'ਯà©\82à¨\9c਼ਰ ਯੋਗਦਾਨ',
-'contributions-title' => '$1 à¨¦à©\80 à¨°à¨\9aਨਾ',
+'contributions' => 'ਮà©\88à¨\82ਬਰ ਯੋਗਦਾਨ',
+'contributions-title' => '$1 à¨²à¨\88 à¨®à©\88à¨\82ਬਰ à¨¯à©\8bà¨\97ਦਾਨ',
 'mycontris' => 'ਮੇਰਾ ਯੋਗਦਾਨ',
 'contribsub2' => '$1 ($2) ਲਈ',
-'uctop' => '(à¨\89ੱਤà©\87)',
-'month' => 'ਇਸ(ਯਾ ਹੋਰ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੌਂ',
-'year' => 'ਇਸ(ਜਾਂ ਹੋਰ ਪਿਛਲੇ) ਸਾਲ ਤੌਂ',
+'uctop' => '(à¨\9fà©\80ਸà©\80)',
+'month' => 'ਇਸ (ਅਤੇ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੋਂ :',
+'year' => 'ਇਸ (ਅਤੇ ਪਿਛਲੇ) ਸਾਲ ਤੋਂ :',
 
+'sp-contributions-newbies' => 'ਸਿਰਫ਼ ਨਵੇਂ ਮੈਂਬਰਾਂ ਦੇ ਯੋਗਦਾਨ ਵਖਾਓ',
 'sp-contributions-newbies-sub' => 'ਨਵੇਂ ਅਕਾਊਂਟਾਂ ਲਈ',
-'sp-contributions-blocklog' => 'ਪਾਬੰਦà©\80 à¨²à¨¾à¨\97',
+'sp-contributions-blocklog' => 'ਪਾਬੰਦà©\80 à¨\9aਿੱਠਾ',
 'sp-contributions-uploads' => 'ਅਪਲੋਡ',
-'sp-contributions-logs' => 'ਲਾਗ',
-'sp-contributions-talk' => 'ਗੱਲਬਾਤ',
+'sp-contributions-logs' => 'ਚਿੱਠੇ',
+'sp-contributions-talk' => 'ਗੱਲ-ਬਾਤ',
+'sp-contributions-blocked-notice' => 'ਇਹ ਮੈਂਬਰ ਇਸ ਵੇਲ਼ੇ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।
+ਪਾਬੰਦੀ ਚਿੱਠੇ ਦਾ ਤਾਜ਼ਾ ਦਾਖ਼ਲਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:',
+'sp-contributions-blocked-notice-anon' => 'ਇਹ IP ਪਤਾ ਇਸ ਵੇਲ਼ੇ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।
+ਪਾਬੰਦੀ ਚਿੱਠੇ ਦਾ ਤਾਜ਼ਾ ਦਾਖ਼ਲਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:',
 'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
-'sp-contributions-username' => 'IP à¨\90ਡਰà©\88ੱਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:',
-'sp-contributions-toponly' => 'à¨\95à©\87ਵਲ à¨\89ਹà©\80 à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨¦à¨¿à¨\96ਾà¨\93 à¨\9cà©\8b à¨¨à¨µà©\80ਨਤਮ à¨¸à©\8bਧਾà¨\82 à¨¹à¨¨à¥¤',
-'sp-contributions-submit' => 'ਖੋਜ',
+'sp-contributions-username' => 'IP à¨ªà¨¤à¨¾ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:',
+'sp-contributions-toponly' => 'ਸਿਰਫ਼ à¨\89ਹà©\80 à¨¸à©\8bਧਾà¨\82 à¨µà¨\96ਾà¨\93 à¨\9cà©\8b à¨¸à¨­ à¨¤à©\8bà¨\82 à¨¨à¨µà©\80à¨\82à¨\86à¨\82 à¨¹à¨¨',
+'sp-contributions-submit' => 'ਖੋਜ',
 
 # What links here
-'whatlinkshere' => 'à¨\87ੱਥà©\87 à¨\95ਿਹà©\9cà©\87 à¨²à¨¿à©°à¨\95',
-'whatlinkshere-title' => '$1 ਨਾਲ ਜੁੜੇ ਹੋਏ ਪੰਨੇ',
+'whatlinkshere' => 'à¨\95ਿਹà©\9cà©\87 (ਸਫ਼à©\87) à¨\87ੱਥà©\87 à¨\9cà©\8bà©\9cਦà©\87 à¨¹à¨¨',
+'whatlinkshere-title' => '$1 ਨਾਲ਼ ਜੋੜਦੇ ਸਫ਼ੇ',
 'whatlinkshere-page' => 'ਸਫਾ:',
-'linkshere' => "ਹà©\87ਠ à¨¦à¨¿à©±à¨¤à©\87 à¨ªà©°à¨¨à©\87 '''[[:$1]]''' à¨¨à¨¾à¨² à¨\9cà©\8bà©\9cਦà©\87 à¨¹à¨¨à¥¤",
-'nolinkshere' => "'''[[:$1]]'''ਨਾਲ ਮਿਲਦਾ ਜੁਲਦਾ ਕੋਈ ਪੰਨਾ ਨਹੀਂ ਹੈ।",
-'isredirect' => 'ਰà©\80-ਡਿਰà©\88à¨\95à¨\9f à¨ªà©\87à¨\9c',
+'linkshere' => "à¨\87ਹ à¨¸à¨«à¨¼à©\87 '''[[:$1]]''' à¨¨à¨¾à¨²à¨¼ à¨\9cà©\8bà©\9cਦà©\87 à¨¹à¨¨:",
+'nolinkshere' => "ਕੋਈ ਵੀ ਸਫ਼ਾ '''[[:$1]]''' ਨਾਲ਼ ਨਹੀਂ ਜੋੜਦਾ।",
+'isredirect' => 'ਰà©\80-ਡਿਰà©\88à¨\95à¨\9f à¨¸à¨«à¨¼à¨¾',
 'istemplate' => 'ਟਾਕਰਾ ਕਰੋ',
-'isimage' => 'ਮਿਸਲ à¨¦à©\80 à¨\95à©\9cà©\80',
+'isimage' => 'ਫ਼ਾà¨\88ਲ à¨¦à¨¾ à¨²à¨¿à©°à¨\95',
 'whatlinkshere-prev' => '{{PLURAL:$1|ਪਿਛਲਾ|ਪਿਛਲੇ $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|ਅਗਲਾ|ਅਗਲੇ $1}}',
 'whatlinkshere-links' => '← ਲਿੰਕ',
-'whatlinkshere-hideredirs' => '$1 ਗੈਰਸਿਧਾ',
+'whatlinkshere-hideredirs' => 'ਅਸਿੱਧੇ ਰਾਹ $1',
 'whatlinkshere-hidetrans' => '$1 ਇੱਥੇ ਕੀ ਕੀ ਜੁੜਦਾ ਹੈ।',
 'whatlinkshere-hidelinks' => '$1 ਲਿੰਕ',
-'whatlinkshere-hideimages' => '$1 ਸੰਬੰਧਿਤ ਚਿਤਰ',
-'whatlinkshere-filters' => 'ਫਿਲà¨\9fਰ',
+'whatlinkshere-hideimages' => 'ਤਸਵੀਰ ਲਿੰਕ $1',
+'whatlinkshere-filters' => 'à¨\9bਾਨਣà©\80à¨\86à¨\82',
 
 # Block/unblock
 'blockip' => 'ਯੂਜ਼ਰ ਬਲਾਕ ਕਰੋ',
@@ -1027,24 +1688,67 @@ to upload files.',
 'ipbreasonotherlist' => 'ਹੋਰ ਕਾਰਨ',
 'ipbsubmit' => 'ਇਹ ਯੂਜ਼ਰ ਲਈ ਪਾਬੰਦੀ',
 'ipbother' => 'ਹੋਰ ਟਾਈਮ:',
-'ipboptions' => '੨ à¨\98à¨\82à¨\9fà©\87:2 hours, à©§ à¨¦à¨¿à¨¨:1 day, à©© à¨¦à¨¿à¨¨:3 days, à©§ à¨¹à¨«à©\8dਤਾ:1 week, à©¨ à¨¹à¨«à©\8dਤੇ:2 weeks, ੧ ਮਹੀਨਾ:1 month, ੩ ਮਹੀਨੇ:3 months, ੬ ਮਹੀਨੇ:6 months, ੧ ਸਾਲ:1 year, ਹਮੇਸ਼ਾ ਲਈ:infinite',
+'ipboptions' => '੨ à¨\98à©°à¨\9fà©\87:2 hours, à©§ à¨¦à¨¿à¨¨:1 day, à©© à¨¦à¨¿à¨¨:3 days, à©§ à¨¹à¨«à¨¼à¨¤à¨¾:1 week, à©¨ à¨¹à¨«à¨¼ਤੇ:2 weeks, ੧ ਮਹੀਨਾ:1 month, ੩ ਮਹੀਨੇ:3 months, ੬ ਮਹੀਨੇ:6 months, ੧ ਸਾਲ:1 year, ਹਮੇਸ਼ਾ ਲਈ:infinite',
 'ipbotheroption' => 'ਹੋਰ',
 'ipbotherreason' => 'ਹੋਰ/ਆਮ ਕਾਰਨ:',
+'ipbwatchuser' => 'ਇਸ ਮੈਂਬਰ ਦੇ ਮੈਂਬਰ ਅਤੇ ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ ਤੇ ਨਜ਼ਰ ਰੱਖੋ',
+'ipb-confirm' => 'ਪਾਬੰਦੀ ਤਸਦੀਕ ਕਰੋ',
 'badipaddress' => 'ਗਲਤ IP ਐਡਰੈੱਸ',
+'blockipsuccesssub' => 'ਪਾਬੰਦੀ ਕਾਮਯਾਬ',
+'ipb-edit-dropdown' => 'ਪਾਬੰਦੀ ਲਾਉਣ ਦੇ ਕਾਰਨ ਸੋਧੋ',
 'ipb-unblock-addr' => '$1 ਅਣ-ਬਲਾਕ',
 'ipb-unblock' => 'ਇੱਕ ਯੂਜ਼ਰ ਨਾਂ ਜਾਂ IP ਐਡਰੈੱਸ ਅਣ-ਬਲਾਕ ਕਰੋ',
+'ipb-blocklist' => 'ਮੌਜੂਦਾ ਪਾਬੰਦੀਆਂ ਵੇਖੋ',
+'ipb-blocklist-contribs' => '$1 ਦੇ ਯੋਗਦਾਨ',
 'unblockip' => 'ਯੂਜ਼ਰ ਅਣ-ਬਲਾਕ ਕਰੋ',
+'ipusubmit' => 'ਇਹ ਪਾਬੰਦੀ ਹਟਾਓ',
+'unblocked' => '[[User:$1|$1]] ਪਾਬੰਦੀ ਮੁਕਤ ਹੋ ਚੁੱਕਾ ਹੈ',
+'unblocked-range' => '$1 ਪਾਬੰਦੀ ਮੁਕਤ ਹੋ ਚੁੱਕੀ ਹੈ',
+'unblocked-id' => 'ਪਾਬੰਦੀ $1 ਹਟ ਚੁੱਕੀ ਹੈ',
+'blocklist' => 'ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੈਂਬਰ',
+'ipblocklist' => 'ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੈਂਬਰ',
+'ipblocklist-legend' => 'ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੈਂਬਰ ਲੱਭੋ',
+'blocklist-userblocks' => 'ਖਾਤਾ ਪਾਬੰਦੀਆਂ ਲੁਕਾਓ',
+'blocklist-tempblocks' => 'ਆਰਜ਼ੀ ਪਾਬੰਦੀਆਂ ਲੁਕਾਓ',
+'blocklist-timestamp' => 'ਵਕਤ ਦੀ ਮੋਹਰ',
+'blocklist-target' => 'ਨਿਸ਼ਾਨਾ',
+'blocklist-by' => 'ਪਾਬੰਦੀ ਲਾਉਣ ਵਾਲ਼ਾ ਐਡਮਿਨ',
+'blocklist-reason' => 'ਕਾਰਨ',
 'ipblocklist-submit' => 'ਖੋਜ',
+'ipblocklist-otherblocks' => 'ਹੋਰ {{PLURAL:$1|ਪਾਬੰਦੀ|ਪਾਬੰਦੀਆਂ}}',
 'infiniteblock' => 'ਬੇਅੰਤ',
-'expiringblock' => '$1 $2 ਮਿਆਦ ਖਤਮ',
+'expiringblock' => 'ਮਿਆਦ ਖ਼ਤਮ $1 ਨੂੰ $2 ’ਤੇ',
 'anononlyblock' => 'anon. ਹੀ',
+'createaccountblock' => 'ਖਾਤਾ ਬਣਾਉਣਾ ’ਤੇ ਪਾਬੰਦੀ ਹੈ',
 'emailblock' => 'ਈਮੇਲ ਬਲਾਕ ਹੈ',
-'blocklink' => 'ਬਲਾਕ',
-'unblocklink' => 'ਅਣ-ਬਲਾਕ',
-'change-blocklink' => 'ਬਲਾਕ ਬਦਲੋ',
+'blocklist-nousertalk' => 'ਆਪਣਾ ਗੱਲ-ਬਾਤ ਸਫ਼ਾ ਨਹੀਂ ਸੋਧ ਸਕਦਾ',
+'ipblocklist-empty' => 'ਪਾਬੰਦੀ ਲਿਸਟ ਖ਼ਾਲੀ ਹੈ।',
+'ipblocklist-no-results' => 'ਦਿੱਤੇ ਗਏ IP ਪਤੇ ਜਾਂ ਮੈਂਬਰ-ਨਾਂ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਹੈ।',
+'blocklink' => 'ਪਾਬੰਦੀ ਲਾਓ',
+'unblocklink' => 'ਪਾਬੰਦੀ ਰੱਦ ਕਰੋ',
+'change-blocklink' => 'ਪਾਬੰਦੀ ਬਦਲੋ',
 'contribslink' => 'ਯੋਗਦਾਨ',
+'emaillink' => 'ਈ-ਮੇਲ ਭੇਜੋ',
+'blocklogpage' => 'ਪਾਬੰਦੀ ਚਿੱਠਾ',
+'blocklog-showlog' => 'ਇਸ ਮੈਂਬਰ ’ਤੇ ਪਹਿਲਾਂ ਪਾਬੰਦੀ ਲਾਈ ਗਈ ਸੀ।
+ਪਾਬੰਦੀ ਦਾ ਚਿੱਠਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:',
+'blocklogentry' => '[[$1]] ’ਤੇ $2 ਲਈ ਪਾਬੰਦੀ ਲਾਈ। $3',
 'unblocklogentry' => '$1 ਤੋਂ ਪਾਬੰਦੀ ਹਟਾਈ',
+'block-log-flags-anononly' => 'ਸਿਰਫ਼ ਗੁੰਮਨਾਮ ਮੈਂਬਰ',
+'block-log-flags-nocreate' => 'ਖਾਤਾ ਬਣਾਉਣ ’ਤੇ ਪਾਬੰਦੀ ਹੈ',
+'block-log-flags-nousertalk' => 'ਆਪਣਾ ਗੱਲ-ਬਾਤ ਸਫ਼ਾ ਨਹੀਂ ਸੋਧ ਸਕਦਾ',
+'block-log-flags-hiddenname' => 'ਮੈਂਬਰ-ਨਾਂ ਲੁਕਾਇਆ',
+'ipb_expiry_invalid' => 'ਖ਼ਤਮ ਹੋਣ ਦਾ ਸਮਾਂ ਗ਼ਲਤ।',
+'ipb_already_blocked' => '"$1" ਪਹਿਲਾਂ ਹੀ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ',
+'ipb-needreblock' => '$1 ਪਹਿਲਾਂ ਹੀ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। ਕੀ ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਬਦਲਣੀਆਂ ਚਾਹੁੰਦੇ ਹੋ?',
+'ipb-otherblocks-header' => 'ਹੋਰ {{PLURAL:$1|ਪਾਬੰਦੀ|ਪਾਬੰਦੀਆਂ}}',
+'unblock-hideuser' => 'ਤੁਸੀਂ ਇਸ ਮੈਂਬਰ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਕਿਉਂਕਿ ਇਸਦਾ ਮੈਂਬਰ-ਨਾਂ ਲੁਕਾਇਆ ਹੋਇਆ ਹੈ।',
+'ipb_cant_unblock' => 'ਗ਼ਲਤੀ: ਪਾਬੰਦੀ ਪਤਾ $1 ਨਹੀਂ ਲੱਭਿਆ। ਸ਼ਾਇਦ ਇਹ ਪਹਿਲਾਂ ਹੀ ਪਾਬੰਦੀ-ਮੁਕਤ ਹੋ ਚੁੱਕਾ ਹੈ।',
+'blockme' => 'ਮੇਰੇ ’ਤੇ ਪਾਬੰਦੀ ਲਾਓ',
 'proxyblocksuccess' => 'ਪੂਰਾ ਹੋਇਆ',
+'cant-block-while-blocked' => 'ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਜਦੋਂ ਤੁਸੀਂ ਖ਼ੁਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੋ।',
+'ipbblocked' => 'ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਪਾਬੰਦੀਸ਼ੁਦਾ ਜਾਂ ਪਾਬੰਦੀ-ਮੁਕਤ ਨਹੀਂ ਕਰ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਸੀਂ ਖ਼ੁਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੋ',
+'ipbnounblockself' => 'ਤੁਹਾਨੂੰ ਖ਼ੁਦ ਨੂੰ ਪਾਬੰਦੀ-ਮੁਕਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ',
 
 # Developer tools
 'lockdb' => 'ਡਾਟਾਬੇਸ ਲਾਕ',
@@ -1059,37 +1763,48 @@ to upload files.',
 'movepagebtn' => 'ਸਫ਼ਾ ਭੇਜੋ',
 'pagemovedsub' => 'ਭੇਜਣਾ ਸਫ਼ਲ ਰਿਹਾ',
 'movepage-moved' => '\'\'\'"$1" ਨੂੰ  "$2"\'\'\' ਉੱਤੇ ਭੇਜਿਆ',
+'movepage-moved-redirect' => 'ਇੱਕ ਰੀਡਿਰੈਕਟ ਬਣਾ ਦਿੱਤਾ ਗਿਆ।',
+'articleexists' => 'ਇਸ ਨਾਮ ਦਾ ਸਫ਼ਾ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ ਜਾਂ ਤੁਹਾਡਾ ਚੁਣਿਆ ਹੋਇਆ ਨਾਮ ਸਹੀ ਨਹੀਂ ਹੈ।
+ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਕੋਈ ਹੋਰ ਨਾਮ ਚੁਣੋ।',
 'movedto' => 'ਮੂਵ ਕੀਤਾ',
-'movelogpage' => 'ਮੂਵ ਲਾਗ',
+'movepage-page-moved' => 'ਸਫ਼ਾ $1 ਨੂੰ $2 ’ਤੇ ਭੇਜਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।',
+'movelogpage' => 'ਭੇਜੇ ਜਾਣ ਦਾ ਚਿੱਠਾ',
 'movereason' => 'ਕਾਰਨ:',
-'revertmove' => 'ਰà©\80ਵਰà¨\9f',
+'revertmove' => 'ਰੱਦ à¨\95ਰà©\8b',
 'delete_and_move' => 'ਹਟਾਓ ਅਤੇ ਮੂਵ ਕਰੋ',
+'delete_and_move_confirm' => 'ਹਾਂ, ਸਫ਼ਾ ਮਿਟਾ ਦੇਵੋ',
+'move-leave-redirect' => 'ਪਿੱਛੇ ਇਕ ਰੀਡਿਰੈਕਟ ਛੱਡੋ',
 
 # Export
 'export' => 'ਸਫ਼ੇ ਐਕਸਪੋਰਟ ਕਰੋ',
+'exportcuronly' => 'ਸਿਰਫ਼ ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ ਸ਼ਾਮਲ ਕਰੋ, ਸਾਰਾ ਅਤੀਤ ਨਹੀਂ',
 'export-submit' => 'ਐਕਸਪੋਰਟ',
 'export-addcat' => 'ਸ਼ਾਮਲ',
 'export-addns' => 'ਸ਼ਾਮਲ',
 'export-download' => 'ਫਾਇਲ ਵਜੋਂ ਸੰਭਾਲੋ',
+'export-templates' => 'ਸਾਂਚੇ ਸ਼ਾਮਲ ਕਰੋ',
 
 # Namespace 8 related
 'allmessages' => 'ਸਿਸਟਮ ਸੁਨੇਹੇ',
-'allmessagesname' => 'ਨਾà¨\82',
+'allmessagesname' => 'ਨਾਮ',
 'allmessagesdefault' => 'ਡਿਫਾਲਟ ਟੈਕਸਟ',
 'allmessagescurrent' => 'ਮੌਜੂਦਾ ਟੈਕਸਟ',
+'allmessages-filter-legend' => 'ਛਾਨਣਾ',
+'allmessages-filter-all' => 'ਸਭ',
 'allmessages-language' => 'ਭਾਸ਼ਾ:',
 'allmessages-filter-submit' => 'ਜਾਓ',
 
 # Thumbnails
-'thumbnail-more' => 'ਫà©\88ਲਾਓ',
+'thumbnail-more' => 'ਵਧਾਓ',
 'filemissing' => 'ਫਾਇਲ ਗੁੰਮ ਹੈ',
-'thumbnail_error' => 'à¨\85à¨\81à¨\97à©\82ਠਾ à¨\9dਲà¨\95 à¨¬à¨¨à¨¾à¨\89ਣ à¨µà¨¿à¨\9a à¨\97ਲਤà©\80 à¨¹à©\8bà¨\88 à¨¹à©\88 : $1',
+'thumbnail_error' => 'ਨਮà©\82ਨਾ à¨¬à¨£à¨¾à¨\89ਣ à¨µà¨¿à¨\9a à¨\97਼ਲਤà©\80 à¨¹à©\8bà¨\88 à¨¹à©\88: $1',
 
 # Special:Import
 'import' => 'ਪੇਜ ਇੰਪੋਰਟ ਕਰੋ',
 'import-interwiki-submit' => 'ਇੰਪੋਰਟ',
 'import-comment' => 'ਟਿੱਪਣੀ:',
 'importstart' => 'ਪੇਜ ਇੰਪੋਰਟ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ...',
+'import-revision-count' => '$1 {{PLURAL:$1|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}}',
 'importfailed' => 'ਇੰਪੋਰਟ ਫੇਲ੍ਹ: $1',
 'importnotext' => 'ਖਾਲੀ ਜਾਂ ਕੋਈ ਟੈਕਸਟ ਨਹੀਂ',
 'importsuccess' => 'ਇੰਪੋਰਟ ਸਫ਼ਲ!',
@@ -1100,67 +1815,73 @@ to upload files.',
 'import-logentry-upload-detail' => '$1 ਰੀਵਿਜ਼ਨ',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'ਤੁਹਾਡਾ ਯੂਜ਼ਰ ਸਫ਼ਾ',
-'tooltip-pt-mytalk' => 'ਤੁਹਾਡਾ ਚਰਚਾ ਪੇਜ',
-'tooltip-pt-preferences' => 'ਮੇਰੀ ਪਸੰਦ',
-'tooltip-pt-watchlist' => 'ਤੁਹਾਡੇ ਵਿਚਾਰ ਗੋਚਰੇ ਰੱਖੇ ਪੰਨਿਆਂ ਦਿ ਸੂਚੀ।',
-'tooltip-pt-mycontris' => 'ਮੇਰੇ ਯੋਗਦਾਨ ਦੀ ਲਿਸਟ',
-'tooltip-pt-login' => 'ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਉਤਸ਼ਾਹਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਪਰ ਇਹ ਲਾਜ਼ਮੀ ਨਹੀਂ ਹੈ',
+'tooltip-pt-userpage' => 'ਤੁਹਾਡਾ ਮੈਂਬਰ ਸਫ਼ਾ',
+'tooltip-pt-mytalk' => 'ਤੁਹਾਡਾ ਗੱਲਬਾਤ ਸਫ਼ਾ',
+'tooltip-pt-preferences' => 'ਤੁਹਾਡੀਆਂ ਪਸੰਦਾਂ',
+'tooltip-pt-watchlist' => 'ਓਹਨਾਂ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਜੋ ਤੁਸੀਂ ਤਬਦੀਲੀਆਂ ਲਈ ਵੇਖ ਰਹੇ ਹੋ',
+'tooltip-pt-mycontris' => 'ਤੁਹਾਡੇ ਯੋਗਦਾਨਾਂ ਦੀ ਲਿਸਟ',
+'tooltip-pt-login' => 'ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਉਤਸ਼ਾਹਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ; ਪਰ ਇਹ ਕੋਈ ਲਾਜ਼ਮੀ ਨਹੀਂ',
+'tooltip-pt-anonlogin' => 'ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਉਤਸ਼ਾਹਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ; ਪਰ ਇਹ ਕੋਈ ਲਾਜ਼ਮੀ ਨਹੀਂ ਹੈ',
 '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-move' => 'ਇਹ ਪੇਜ ਭੇਜੋ',
-'tooltip-ca-watch' => "ਇਹ ਸਫ਼ੇ ਆਪਣੀ ਵਾਚ-ਲਿਸਟ 'ਚੋਂ ਹਟਾਓ",
-'tooltip-ca-unwatch' => 'ਇਹ ਸਫ਼ਾ ਆਪਣੀ ਵਾਚ-ਲਿਸਟ ਤੋਂ ਹਟਾਓ',
-'tooltip-search' => 'ਖੋਜ {{SITENAME}}',
-'tooltip-search-go' => 'ਠੀਕ ਇਹ ਨਾਂ ਵਾਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਉ, ਜੇ ਮੌਜੂਦ ਹੈ',
-'tooltip-search-fulltext' => 'ਇਸ ਟੈਕਸਟ ਲਈ ਸਫ਼ਿਆਂ ਦੀ ਖੋਜ।',
-'tooltip-p-logo' => 'ਮੁੱਖ ਪੇਜ',
-'tooltip-n-mainpage' => 'ਮੁੱਖ ਪੇਜ ਖੋਲ੍ਹੋ',
-'tooltip-n-mainpage-description' => 'ਮੁੱਖ ਪੇਜ਼ ਉੱਤੇ ਜਾਓ',
-'tooltip-n-portal' => 'ਪਰੋਜੈਕਟ ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭ ਸਕਦੇ ਹੋ',
+'tooltip-ca-edit' => 'ਤੁਸੀਂ ਇਹ ਸਫ਼ਾ ਸੋਧ ਸਕਦੇ ਹੋ। ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਸੰਭਾਲਣ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਬਟਨ ਵਰਤੋ',
+'tooltip-ca-addsection' => 'ਨਵਾਂ ਭਾਗ ਸ਼ੁਰੂ ਕਰੋ',
+'tooltip-ca-viewsource' => 'ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਹੈ।
+ਤੁਸੀਂ ਇਸਦਾ ਸਰੋਤ ਵੇਖ ਸਕਦੇ ਹੋ।',
+'tooltip-ca-history' => 'ਇਸ ਸਫ਼ੇ ਦੇ ਪਿਛਲੇ ਰੀਵਿਜ਼ਨ',
+'tooltip-ca-protect' => 'ਇਹ ਸਫ਼ਾ ਮਹਿਫ਼ੂਜ਼ ਕਰੋ',
+'tooltip-ca-unprotect' => 'ਇਸ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ',
+'tooltip-ca-delete' => 'ਇਹ ਸਫ਼ਾ ਮਿਟਾਓ',
+'tooltip-ca-move' => 'ਇਹ ਸਫ਼ਾ ਭੇਜੋ',
+'tooltip-ca-watch' => 'ਇਹ ਸਫ਼ਾ ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਸ਼ਾਮਲ ਕਰੋ',
+'tooltip-ca-unwatch' => 'ਇਹ ਸਫ਼ਾ ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ’ਚੋਂ ਹਟਾਓ',
+'tooltip-search' => '{{SITENAME}} ’ਤੇ ਖੋਜੋ',
+'tooltip-search-go' => 'ਠੀਕ ਇਸ ਨਾਮ ਵਾਲ਼ੇ ਸਫ਼ੇ ’ਤੇ ਜਾਉ, ਜੇ ਮੌਜੂਦ ਹੈ ਤਾਂ',
+'tooltip-search-fulltext' => 'ਇਸ ਲਿਖਤ ਲਈ ਸਫ਼ੇ ਲੱਭੋ',
+'tooltip-p-logo' => 'ਮੁੱਖ ਸਫ਼ੇ ’ਤੇ ਜਾਓ',
+'tooltip-n-mainpage' => 'ਮੁੱਖ ਸਫ਼ੇ ’ਤੇ ਜਾਓ',
+'tooltip-n-mainpage-description' => 'ਮੁੱਖ ਸਫ਼ੇ ’ਤੇ ਜਾਓ',
+'tooltip-n-portal' => 'ਪਰੋਜੈਕਟ ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭਣਾ ਹੈ',
 'tooltip-n-currentevents' => 'ਮੌਜੂਦਾ ਸਮਾਗਮ ਬਾਰੇ ਪਿਛਲੀ ਜਾਣਕਾਰੀ ਲੱਭੋ',
-'tooltip-n-recentchanges' => 'ਵਿà¨\95ਿ à¨µà¨¿à©±à¨\9a à¨¤à¨¾à¨\9c਼ਾ à¨¬à¨¦à¨²à¨¾à¨\85 ਦੀ ਲਿਸਟ',
-'tooltip-n-randompage' => 'à¨\87ੱà¨\95 à¨°à¨²à¨µà¨¾à¨\82 à¨ªà©\87à¨\9c ਲੋਡ ਕਰੋ',
+'tooltip-n-recentchanges' => 'ਵਿà¨\95à©\80 â\80\99à¨\9a à¨¤à¨¾à¨\9c਼ਾ à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 ਦੀ ਲਿਸਟ',
+'tooltip-n-randompage' => 'à¨\87à¨\95 à¨°à¨²à¨¼à¨µà¨¾à¨\82 à¨¸à¨«à¨¼à¨¾ ਲੋਡ ਕਰੋ',
 'tooltip-n-help' => 'ਖੋਜਣ ਲਈ ਥਾਂ',
-'tooltip-t-whatlinkshere' => 'ਸਭ à¨µà¨¿à¨\95ਿ à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨¦à©\80 à¨²à¨¿à¨¸à¨\9f, à¨\9cà©\8b à¨\87ੱਥà©\87 à¨²à¨¿à©°à¨\95 à¨\95à©\80ਤੇ ਹਨ',
-'tooltip-t-recentchangeslinked' => 'à¨\87ਹ à¨¸à¨«à¨¼à©\87 à¨¤à©\8bà¨\82 à¨²à¨¿à©°à¨\95 à¨\95à©\80ਤà©\87 à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨µà¨¿à©±à¨\9a à¨¤à¨¾à¨\9c਼ਾ à¨¬à¨¦à¨²à¨¾à¨\85',
-'tooltip-feed-atom' => 'à¨\87ਸ à¨ªà©°à¨¨ੇ ਦੀ ਐਟਮ ਫ਼ੀਡ',
-'tooltip-t-contributions' => 'à¨\87ਸ à¨®à©\88à¨\82ਬਰ à¨¦à¨¾ à¨¯à©\8bà¨\97ਦਾਨ à¨¦à¨¿à¨\96ਾà¨\93',
-'tooltip-t-emailuser' => 'à¨\87ਹ à¨¯à©\82à¨\9c਼ਰ à¨¨à©\82à©° ਮੇਲ ਭੇਜੋ',
+'tooltip-t-whatlinkshere' => 'ਵਿà¨\95à©\80 à¨¦à©\87 à¨¸à¨¾à¨°à©\87 à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨¦à©\80 à¨²à¨¿à¨¸à¨\9f, à¨\9cà©\8b à¨\87ੱਥà©\87 à¨\9cà©\8bà©\9cਦੇ ਹਨ',
+'tooltip-t-recentchangeslinked' => 'à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¤à©\8bà¨\82 à¨²à¨¿à©°à¨\95 à¨\95à©\80ਤà©\87 à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨µà¨¿à©±à¨\9a à¨¤à¨¾à¨\9c਼ਾ à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82',
+'tooltip-feed-atom' => 'à¨\87ਸ à¨¸à¨«à¨¼ੇ ਦੀ ਐਟਮ ਫ਼ੀਡ',
+'tooltip-t-contributions' => 'à¨\87ਸ à¨®à©\88à¨\82ਬਰ à¨¦à©\87 à¨¯à©\8bà¨\97ਦਾਨ à¨¦à©\80 à¨²à¨¿à¨¸à¨\9f',
+'tooltip-t-emailuser' => 'à¨\87ਸ à¨®à©\88à¨\82ਬਰ à¨¨à©\82à©° à¨\88-ਮੇਲ ਭੇਜੋ',
 'tooltip-t-upload' => 'ਚਿੱਤਰ ਜਾਂ ਮੀਡਿਆ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ',
-'tooltip-t-specialpages' => 'ਸਭ à¨\96ਾਸ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ',
+'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨\96਼ਾਸ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ',
 'tooltip-t-print' => 'ਇਹ ਸਫ਼ੇ ਦਾ ਛਪਣਯੋਗ ਵਰਜਨ',
-'tooltip-t-permalink' => 'ਸਫ਼à©\87 à¨¦à©\87 à¨\87ਹ à¨°à©\80ਵਿà¨\9c਼ਨ à¨²à¨\88 à¨ªà©±à¨\95à©\87 ਲਿੰਕ',
-'tooltip-ca-nstab-main' => 'ਸਮà¨\97ੱਰà©\80 à¨ªà©\87à¨\9c ਵੇਖੋ',
-'tooltip-ca-nstab-user' => 'ਯà©\82à¨\9c਼ਰ à¨ªà©\87à¨\9c ਵੇਖੋ',
+'tooltip-t-permalink' => 'ਸਫ਼à©\87 à¨¦à©\87 à¨\87ਸ à¨°à©\80ਵਿà¨\9c਼ਨ à¨²à¨\88 à¨ªà©±à¨\95ਾ ਲਿੰਕ',
+'tooltip-ca-nstab-main' => 'ਸਮੱà¨\97ਰà©\80 à¨¸à¨«à¨¼à¨¾ ਵੇਖੋ',
+'tooltip-ca-nstab-user' => 'ਮà©\88à¨\82ਬਰ à¨¸à¨«à¨¼à¨¾ ਵੇਖੋ',
 'tooltip-ca-nstab-media' => 'ਮੀਡਿਆ ਪੇਜ ਵੇਖੋ',
-'tooltip-ca-nstab-special' => 'à¨\87ਹ à¨\96ਾਸ à¨¸à¨«à¨¼à¨¾ à¨¹à©\88, à¨¤à©\81ਸà©\80à¨\82 à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¨à©\82à©° à¨¸à©\8bਧ à¨¨à¨¹à©\80à¨\82 à¨¸à¨\95ਦà©\87 à¨¹à©\8b',
-'tooltip-ca-nstab-project' => 'ਪਰà©\8bà¨\9cà©\88à¨\95à¨\9f à¨ªà©\87à¨\9c ਵੇਖੋ',
-'tooltip-ca-nstab-image' => 'à¨\9aਿੱਤਰ à¨ªà©\87à¨\9c ਵੇਖੋ',
+'tooltip-ca-nstab-special' => 'à¨\87ਹ à¨\96਼ਾਸ à¨¸à¨«à¨¼à¨¾ à¨¹à©\88, à¨¤à©\81ਸà©\80à¨\82 à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¨à©\82à©° à¨¸à©\8bਧ à¨¨à¨¹à©\80à¨\82 à¨¸à¨\95ਦà©\87।',
+'tooltip-ca-nstab-project' => 'ਪà©\8dਰà©\8bà¨\9cà©\88à¨\95à¨\9f à¨¸à¨«à¨¼à¨¾ ਵੇਖੋ',
+'tooltip-ca-nstab-image' => 'ਫ਼ਾà¨\88ਲ à¨¸à¨«à¨¼à¨¾ ਵੇਖੋ',
 'tooltip-ca-nstab-mediawiki' => 'ਸਿਸਟਮ ਸੁਨੇਹੇ ਵੇਖੋ',
-'tooltip-ca-nstab-template' => 'à¨\9fà©\88ਪਲà©\87à¨\9f ਵੇਖੋ',
+'tooltip-ca-nstab-template' => 'ਸਾà¨\82à¨\9aਾ ਵੇਖੋ',
 'tooltip-ca-nstab-help' => 'ਮੱਦਦ ਪੇਜ ਵੇਖੋ',
-'tooltip-ca-nstab-category' => 'ਕੈਟਾਗਰੀ ਪੇਜ ਵੇਖੋ',
-'tooltip-minoredit' => 'ਇਸ ਤੇ ਛੋਟੇ ਬਦਲਾਅ ਦਾ  ਨਿਸ਼ਾਨ ਲਾਓ',
-'tooltip-save' => 'ਆਪਣੇ ਬਦਲਾਅ ਸੰਭਾਲੋ',
-'tooltip-preview' => 'ਆਪਣੇ ਬਦਲਾਅ ਦੀ ਝਲਕ ਵੇਖੋ, ਸੰਭਾਲਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ ਜੀ!',
-'tooltip-diff' => 'ਇਸ ਪਾਠ ਵਿਚ ਆਪਣੇ ਕੀਤੇ ਹੋਏ ਬਦਲਾਅ ਦੇਖੋ',
-'tooltip-compareselectedversions' => 'ਇਸ ਪੰਨੇ ਦੇ ਚੁਣੇ ਹੋਏ ਸ਼ੋਧਾਂ ਵਿਚ ਫ਼ਰਕ ਦੇਖੋ',
-'tooltip-watch' => 'ਇਹ ਸਫ਼ੇ ਨੂੰ ਆਪਣੀ ਵਾਚ-ਲਿਸਟ ਵਿਚ ਪਾਓ',
+'tooltip-ca-nstab-category' => 'ਕੈਟਾਗਰੀ ਸਫ਼ਾ ਵੇਖੋ',
+'tooltip-minoredit' => 'ਇਸ ’ਤੇ ਛੋਟੀ ਤਬਦਲੀ ਦੇ ਤੌਰ ’ਤੇ ਨਿਸ਼ਾਨ ਲਾਓ',
+'tooltip-save' => 'ਆਪਣੀਆਂ ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ',
+'tooltip-preview' => 'ਆਪਣੀ ਤਬਦੀਲੀ ਦੀ ਝਲਕ ਵੇਖੋ, ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ!',
+'tooltip-diff' => 'ਤੁਹਾਡੇ ਦੁਆਰਾ ਲਿਖਤ ਵਿਚ ਕੀਤੀਆਂ ਤਬਦੀਲੀਆਂ ਵਖਾਉਂਦਾ ਹੈ',
+'tooltip-compareselectedversions' => 'ਇਸ ਸਫ਼ੇ ਦੇ ਦੋ ਚੁਣੇ ਹੋਏ ਸੋਧਾਂ ਵਿਚ ਫ਼ਰਕ ਵੇਖੋ',
+'tooltip-watch' => 'ਇਸ ਸਫ਼ੇ ਨੂੰ ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਪਾਓ',
+'tooltip-watchlistedit-normal-submit' => 'ਸਿਰਲੇਖ ਹਟਾਓ',
+'tooltip-watchlistedit-raw-submit' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਨਵੀਂ ਕਰੋ',
 'tooltip-upload' => 'ਅੱਪਲੋਡ ਸਟਾਰਟ ਕਰੋ',
-'tooltip-rollback' => "'' ਵਾਪਸ ਲੈ ਜਾਓ '' ਇਕ ਝਟਕੇ ਵਿਚ ਹੀ ਪਿਛਲੇ ਯੂਜ਼ਰ ਦੇ ਬਦਲਾਵਾਂ ਨੂੰ ਗਾਇਬ ਕਰ ਦੇਂਦਾ ਹੈ।",
-'tooltip-undo' => '" ਪੁਰਾਣੀ ਹਾਲਤ ਵਿਚ ਪਰਤੋ " ਇਸ ਬਦਲਾਅ ਨੂੰ ਰੱਦ ਕਰਕੇ ਸੰਪਾਦਨ ਫਾਰਮ ਨੂੰ ਝਲਕ ਦੇ ਅੰਦਾਜ਼ ਵਿਚ ਦਿਖਾਂਦਾ ਹੈ।
-ਇਸ ਦਵਾਰਾ ਸਾਰ ਵਿਚ ਪੁਰਾਣੇ ਹਾਲਤ ਵਿਚ ਪਰਤਣ ਦਾ ਕਾਰਨ ਲਿਖਿਆ ਜਾ ਸਕਦਾ ਹੈ।',
-'tooltip-summary' => 'ਇਕ ਸੰਖੇਪ ਖੁਲਾਸਾ ਦਰਜ ਕਰੋ',
+'tooltip-rollback' => "''ਵਾਪਸ ਮੋੜੋ'' ਇਕ ਹੀ ਕਲਿੱਕ ਨਾਲ਼ ਆਖ਼ਰੀ ਯੋਗਦਾਨ ਨੂੰ ਰੱਦ ਕਰ ਦਿੰਦਾ ਹੈ",
+'tooltip-undo' => '"ਨਕਾਰੋ" ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਰੱਦ ਕਰਕੇ ਸੋਧ ਫ਼ਾਰਮ ਨੂੰ ਝਲਕ ਦੇ ਅੰਦਾਜ਼ ਵਿਚ ਦਿਖਾਉਂਦਾ ਹੈ।
+ਇੰਝ "ਸਾਰ" ਵਿਚ ਤਬਦੀਲੀ ਨਕਾਰਨ ਦਾ ਕਾਰਨ ਲਿਖਿਆ ਜਾ ਸਕਦਾ ਹੈ।',
+'tooltip-preferences-save' => 'ਪਸੰਦਾਂ ਸਾਂਭੋ',
+'tooltip-summary' => 'ਸੰਖੇਪ ਸਾਰ ਦਰਜ ਕਰੋ',
 
 # Attribution
+'lastmodifiedatby' => 'ਇਹ ਸਫ਼ਾ ਆਖ਼ਰੀ ਵਾਰ $1 ਨੂੰ $2 ’ਤੇ $3 ਨੇ ਸੋਧਿਆ ਸੀ।',
 'others' => 'ਹੋਰ',
 'siteusers' => '{{SITENAME}} ਯੂਜ਼ਰ $1',
 'creditspage' => 'ਪੇਜ ਮਾਣ',
@@ -1168,6 +1889,11 @@ to upload files.',
 # Spam protection
 'spamprotectiontitle' => 'Spam ਸੁਰੱਖਿਆ ਫਿਲਟਰ',
 
+# Info page
+'pageinfo-header-edits' => 'ਸੋਧਾਂ ਦਾ ਅਤੀਤ',
+'pageinfo-watchers' => 'ਸਫ਼ੇ ’ਤੇ ਨਜ਼ਰ ਰੱਖਣ ਵਾਲ਼ੇ',
+'pageinfo-edits' => 'ਕੁੱਲ ਸੋਧਾਂ',
+
 # Skin names
 'skinname-standard' => 'ਕਲਾਸਿਕ',
 'skinname-monobook' => 'ਮੋਨੋਬੁੱਕ',
@@ -1177,15 +1903,15 @@ to upload files.',
 
 # Browsing diffs
 'previousdiff' => '← ਪੁਰਾਣੀ ਸੋਧ',
-'nextdiff' => 'à¨\85ੰਤਰ à¨\85ੱà¨\97à©\87 →',
+'nextdiff' => 'ਨਵà©\80à¨\82 à¨¸à©\8bਧ →',
 
 # Media information
 'thumbsize' => 'ਥੰਮਨੇਲ ਆਕਾਰ:',
 'widthheightpage' => '$1 × $2, $3 ਪੇਜ਼',
 'file-info' => 'ਫਾਇਲ ਆਕਾਰ: $1, MIME ਕਿਸਮ: $2',
-'file-info-size' => '$1 Ã\97 $2 à¨ªà¨¿à¨\95ਸਲ, à¨«à¨¾à¨\87ਲ ਆਕਾਰ: $3, MIME ਕਿਸਮ: $4',
-'file-nohires' => 'à¨\87ਸ à¨¤à©\8cà¨\82 à¨\9c਼ਿà¨\86ਦਾ à¨°à©\88à¨\9c਼à©\8bਲà¨\8aਸ਼ਨ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
-'svg-long-desc' => 'SVG à¨«à¨¾à¨\87ਲ, nominally $1 Ã\97 $2 pixels, file size: $3',
+'file-info-size' => '$1 Ã\97 $2 à¨ªà¨¿à¨\95ਸਲ, à¨«à¨¼à¨¾à¨\88ਲ ਆਕਾਰ: $3, MIME ਕਿਸਮ: $4',
+'file-nohires' => 'à¨\87ਸ à¨¤à©\8bà¨\82 à¨µà©±à¨¡à©\80 à¨¤à¨¸à¨µà©\80ਰ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
+'svg-long-desc' => 'SVG à¨«à¨¼à¨¾à¨\88ਲ, à¨\86ਮ à¨¤à©\8cਰ â\80\99ਤà©\87 $1 Ã\97 $2 à¨ªà¨¿à¨\95ਸਲ, à¨«à¨¼à¨¾à¨\88ਲ à¨¦à¨¾ à¨\85à¨\95ਾਰ: $3',
 'show-big-image' => 'ਪੂਰਾ ਰੈਜ਼ੋਲੇਸ਼ਨ',
 
 # Special:NewFiles
@@ -1196,13 +1922,13 @@ to upload files.',
 
 # Bad image list
 'bad_image_list' => 'ਤਰਤੀਬ ਇਸ ਤਰਾਂ ਹੈ:
-à¨\95à©\87ਵਲ à¨¸à©\82à¨\9aà©\80ਬੱਧ à¨®à©±à¨¦à¨¾à¨\82 (* à¨¨à¨¾à¨² à¨¸à¨¼à©\81ਰà©\82 à¨¹à©\8bਣ à¨µà¨¾à¨²à©\80à¨\86à¨\82 à¨ªà©°à¨\95ਤà©\80à¨\86à¨\82) à¨¹à©\80 à¨µà¨¿à¨\9aਾਰ à¨\85ਧà©\80ਨ à¨¹à©\8bਣà¨\97à©\80à¨\86à¨\82
-ਪੰà¨\95ਤà©\80 à¨µà¨¿à¨\9a à¨ªà¨¹à¨¿à¨²à©\80 à¨\95à©\9cà©\80 à¨\97ਲਤ à¨«à¨¾à¨\88ਲ à¨¦à©\80 à¨\95à©\9cà©\80 à¨¹à©\8bਣà©\80 à¨\9aਾਹà©\80ਦà©\80 à¨¹à©\88।à¨\89ਸ à¨ªà©°à¨\95ਤà©\80 à¨µà¨¿à¨\9a à¨\85ੱà¨\97à©\87 à¨¦à¨¿à¨¤à©\80à¨\86à¨\82 à¨\95à©\9cà©\80à¨\86à¨\82 à¨¨à©\82à©° à¨\85ਪਵਾਦ à¨®à©°à¨¨à¨¿à¨\86 à¨\9cਾਵà©\87à¨\97ਾ, à¨­à¨¾à¨µ à¨\89ਹ à¨ªà©°à¨¨à©\87 à¨\9cਿਨà©\8dਹਾà¨\82 à¨µà¨¿à¨\9a à¨«à¨¾à¨\88ਲ à¨\95ਿਸà©\87 à¨ªà©°à¨\95ਤà©\80 à¨µà¨¿à¨\9a à¨¸à¨¥à¨¿à¨¤ à¨¹à©\8b à¨¸à¨\95ਦà©\80 à¨¹à©\87।',
+ਸਿਰਫ਼ à¨²à¨¿à¨¸à¨\9f à¨µà¨¿à¨\9aਲà©\80à¨\86à¨\82 à¨\9aà©\80à¨\9c਼ਾà¨\82 (* à¨¨à¨¾à¨² à¨¸à¨¼à©\81ਰà©\82 à¨¹à©\8bਣ à¨µà¨¾à¨²à©\80à¨\86à¨\82 à¨\95ਤਾਰਾà¨\82) â\80\99ਤà©\87 à¨¹à©\80 à¨\97਼à©\8cਰ à¨\95à©\80ਤਾ à¨\9cਾਵà©\87à¨\97ਾ
+ਲਾà¨\88ਨ à¨µà¨¿à¨\9a à¨ªà¨¹à¨¿à¨²à©\80 à¨\95à©\9cà©\80 à¨\97਼ਲਤ à¨«à¨¼à¨¾à¨\88ਲ à¨¦à©\80 à¨\95à©\9cà©\80 à¨¹à©\8bਣà©\80 à¨\9aਾਹà©\80ਦà©\80 à¨¹à©\88। à¨\89ਸ à¨²à¨¾à¨\88ਨ â\80\99à¨\9a à¨\85ੱà¨\97à©\87 à¨¦à¨¿à¨¤à©\80à¨\86à¨\82 à¨\95à©\9cà©\80à¨\86à¨\82 à¨¨à©\82à©° à¨\87ਤਰਾà¨\9c਼ਯà©\8bà¨\97 à¨®à©°à¨¨à¨¿à¨\86 à¨\9cਾਵà©\87à¨\97ਾ, à¨­à¨¾à¨µ à¨\89ਹ à¨¸à¨«à¨¼à©\87 à¨\9cਿਨà©\8dਹਾà¨\82 à¨µà¨¿à¨\9a à¨«à¨¼à¨¾à¨\88ਲ à¨\95ਿਸà©\87 à¨²à¨¾à¨\88ਨ à¨µà¨¿à¨\9a à¨¸à¨¥à¨¿à¨¤ à¨¹à©\8b à¨¸à¨\95ਦà©\80 à¨¹à©\88।',
 
 # Metadata
 'metadata' => 'ਮੇਟਾ ਡੈਟਾ',
-'metadata-help' => 'à¨\87ਸ à¨®à¨¿à¨¸à¨² à¨µà¨¿à¨\9a à¨µà¨¾à¨§à©\82 à¨\9cਾਨà¨\95ਾਰà©\80à¨\86à¨\82 à¨¹à¨¨ , à¨\9cà©\8b à¨¸à¨¼à¨¾à¨\87ਦ à¨\89ਸ à¨\95à©\88ਮਰà©\87 à¨¯à¨¾ à¨¸à¨\95à©\88ਨਰ à¨¦à©\80 à¨¦à©\87ਣ à¨¹à¨¨ à¨\9cà©\8bà¨\95ਿ à¨\87ਸ à¨®à¨¿à¨¸à¨² à¨¨à©\82à©° à¨¬à¨¨à¨¾à¨\89ਣ à¨²à¨\88 à¨µà¨°à¨¤à¨¿à¨\86 à¨\97ਿà¨\86 à¨¹à©\88।à¨\85à¨\97਼ਰ à¨\87ਹ à¨®à¨¿à¨¸à¨² à¨¬à¨¦à¨²à¨¾à¨\88 à¨\97à¨\88 à¨¹à©\88 à¨¤à¨¾à¨\82 à¨¹à©\8b à¨¸à¨\95ਦਾ à¨¹à©\88 à¨\95à©\81à¨\9d à¨µà©\87ਰਵà©\87 à¨¬à¨¦à¨²à©\80 à¨®à¨¿à¨¸ਲ ਦਾ ਸਹੀ ਰੂਪਮਾਨ ਨਾ ਹੋਣ।',
-'metadata-fields' => 'ਮà©\88à¨\9fਾਡà©\88à¨\9fਾ à¨¸à©\82à¨\9aà©\80 à¨ªà¨\9f à¨¨à©\82à©° à¨\9bà©\8bà¨\9fਾ à¨\95ਰਣ à¨¨à¨¾à¨² à¨\87ਸ à¨¸à©\81ਨà©\87ਹà©\87 à¨µà¨¿à¨\9a à¨¸à©\82à¨\9aà©\80ਬੱਧ à¨«à¨¼à©\80ਲਡ à¨®à©\82ਰਤ à¨¦à©\87 à¨¦à©\8dਰਿਸ਼ à¨µà¨¿à¨\9a à¨¸à¨¼à¨¾à¨®à¨² à¨\95à©\80ਤà©\87 à¨\9cਾਣà¨\97à©\87।ਬਾà¨\95à©\80 à¨«à¨¼à©\80ਲਡਾà¨\82 à¨¨à©\82à©° à¨\9bਿਪਾà¨\87à¨\86 à¨\9cਾà¨\8fà¨\97ਾ।',
+'metadata-help' => 'à¨\87ਸ à¨«à¨¼à¨¾à¨\88ਲ à¨µà¨¿à¨\9a à¨µà¨¾à¨§à©\82 à¨\9cਾਣà¨\95ਾਰà©\80à¨\86à¨\82 à¨¹à¨¨, à¨\9cà©\8b à¨¸à¨¼à¨¾à¨\87ਦ à¨\89ਸ à¨\95à©\88ਮਰà©\87 à¨\9cਾà¨\82 à¨¸à¨\95à©\88ਨਰ à¨¦à©\80 à¨¦à©\87ਣ à¨¹à¨¨ à¨\9cà©\8b à¨\87ਸਨà©\82à©° à¨¬à¨£à¨¾à¨\89ਣ à¨²à¨\88 à¨µà¨°à¨¤à¨¿à¨\86 à¨\97ਿà¨\86। à¨\9cà©\87 à¨\87ਸ à¨«à¨¼à¨¾à¨\88ਲ à¨µà¨¿à¨\9a à¨\95à©\8bà¨\88 à¨¤à¨¬à¨¦à©\80ਲà©\80 à¨\95à©\80ਤà©\80 à¨\97à¨\88 à¨¹à©\88 à¨¤à¨¾à¨\82 à¨¹à©\8b à¨¸à¨\95ਦਾ à¨¹à©\88 à¨\95à©\81à¨\9d à¨µà©\87ਰਵà©\87 à¨¬à¨¦à¨²à©\80 à¨«à¨¼à¨¾à¨\88ਲ ਦਾ ਸਹੀ ਰੂਪਮਾਨ ਨਾ ਹੋਣ।',
+'metadata-fields' => 'à¨\87ਸ à¨¸à©\81ਨà©\87ਹà©\87 à¨µà¨¿à¨\9a à¨¸à©\82à¨\9aà©\80ਬੱਧ à¨\96à©\87ਤਰ à¨¤à¨¸à¨µà©\80ਰ à¨¸à¨«à¨¼à©\87 â\80\99à¨\9a à¨¸à¨¼à¨¾à¨®à¨² à¨\95à©\80ਤà©\87 à¨\9cਾਣà¨\97à©\87 à¨\9cà©\8b à¨\89ਦà©\8bà¨\82 à¨¦à¨¿à©±à¨¸à¨¦à©\87 à¨¹à¨¨ à¨\9cਦà©\8b à¨®à©\88à¨\9fਾਡà©\88à¨\9fਾ à¨\96਼ਾà¨\95ਾ à¨¬à©°à¨¦ à¨¹à©\8bਵà©\87। à¨¬à¨¾à¨\95à©\80 à¨\89à¨\82à¨\9e à¨¹à©\80 à¨²à©\81à¨\95à©\87 à¨¹à©\8bਣà¨\97à©\87।',
 
 # EXIF tags
 'exif-imagewidth' => 'ਚੌੜਾਈ',
@@ -1245,8 +1971,8 @@ to upload files.',
 'exif-gpsspeed-m' => 'ਮੀਲ ਪ੍ਰਤੀ ਘੰਟਾ',
 
 # External editor support
-'edit-externally' => 'ਬਾਹਰà©\80 à¨«à¨¾à¨°à¨®à©\82ਲਾ à¨²à¨\97ਾ à¨\95à©\87 à¨\87ਸ à¨®à¨¿à¨¸à¨² à¨¨à©\82à©° à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨\95ਰà©\8b।',
-'edit-externally-help' => '(ਵਧà©\87ਰà©\87 à¨\9cਾਣà¨\95ਾਰà©\80 à¨²à¨\87 [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] à¨\87ਥà©\87 à¨¦à¨¬ੋ)',
+'edit-externally' => 'ਬਾਹਰà©\80 à¨\90ਪਲà©\80à¨\95à©\87ਸ਼ਨ à¨µà¨°à¨¤à¨¦à©\87 à¨¹à©\8bà¨\8f à¨\87ਸ à¨«à¨¼à¨¾à¨\88ਲ à¨¨à©\82à©° à¨¸à©\8bਧà©\8b',
+'edit-externally-help' => '(à¨\9c਼ਿà¨\86ਦਾ à¨\9cਾਣà¨\95ਾਰà©\80 à¨²à¨\88 [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] à¨µà©\87à¨\96ੋ)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'ਸਭ',
@@ -1300,20 +2026,32 @@ to upload files.',
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 title was|$1 titles were}} ਹਟਾਓ:',
 
 # Watchlist editing tools
-'watchlisttools-edit' => 'ਵਾਚਲਿਸਟ ਵੇਖੋ ਤੇ ਸੋਧੋ',
+'watchlisttools-view' => 'ਮੌਕੇ ਮੁਤਾਬਕ ਤਬਦੀਲੀਆਂ ਵੇਖੋ',
+'watchlisttools-edit' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ ’ਤੇ ਸੋਧੋ',
+'watchlisttools-raw' => 'ਕੱਚੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ',
 
 # Special:Version
 'version' => 'ਵਰਜਨ',
 
 # Special:SpecialPages
-'specialpages' => 'à¨\96ਾਸ à¨ªà©\87à¨\9c',
+'specialpages' => 'à¨\96਼ਾਸ à¨¸à¨«à¨¼à©\87',
 'specialpages-group-login' => 'ਲਾਗ ਇਨ / ਅਕਾਊਂਟ ਬਣਾਓ',
 
 # Special:BlankPage
 'blankpage' => 'ਖ਼ਾਲੀ ਪੇਜ',
 
+# External image whitelist
+'external_image_whitelist' => " #ਇਸ ਲਾਈਨ ਨੂੰ ਇੰਝ ਹੀ ਰਹਿਣ ਦਿਓ <pre>
+#ਹੇਠਾਂ ਓਹੀ ਐਕਸਪ੍ਰੈਸ਼ਨ ਪਾਓ (ਜਿਹੜਾ ਹਿੱਸਾ // ਦੇ ਵਿਚਾਲੇ ਹੈ)
+#ਇਹ ਬਾਹਰੀ ਤਸਵੀਰਾਂ ਦੇ URLs (ਹੌਟਲਿੰਕਡ) ਨਾਲ਼ ਮਿਲਣਗੀਆਂ
+#ਜਿਹੜੀਆਂ ਮਿਲਣਗੀਆਂ ਓਹ ਬਤੌਰ ਤਸਵੀਰਾਂ ਦਿੱਸਣਗੀਆਂ ਨਹੀਂ ਤਾਂ ਤਸਵੀਰ ਦਾ ਸਿਰਫ਼ ਲਿੰਕ ਨਜ਼ਰ ਆਵੇਗਾ
+#'#' ਨਾਲ਼ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੀਆਂ ਲਾਈਨਾਂ ਟਿੱਪਣੀਆਂ ਵਾਂਗ ਲਈਆਂ ਜਾਂਦੀਆਂ ਹਨ
+#ਇਹ ਕੇਸ-ਇਨਸੈਂਸਟਿਵ ਹੈ
+
+#ਸਾਰੇ ਰੈਜੈਕਸ ਫ਼ਰੈਗਮੈਂਟ ਇਸ ਲਾਈਨ ਤੋਂ ਉੱਪਰ ਪਾਓ। ਇਸ ਲਾਈਨ ਨੂੰ ਇੰਝ ਹੀ ਰਹਿਣ ਦਿਓ </pre>",
+
 # Special:Tags
-'tag-filter' => '[[Special:Tags|à¨\9aਿà¨\9f]] ਛਾਨਣੀ:',
+'tag-filter' => '[[Special:Tags|à¨\9fà©\88à¨\97]] ਛਾਨਣੀ:',
 
 # HTML forms
 'htmlform-submit' => 'ਭੇਜੋ',
index db1ff10..3d3d16b 100644 (file)
@@ -76,35 +76,35 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'tue' => 'Mrt',
 'wed' => 'Mie',
 'thu' => 'Jue',
-'fri' => 'Vie',
+'fri' => 'Bie',
 'sat' => 'Sab',
 'january' => 'Eneru',
-'february' => 'Febreru',
-'march' => 'Marzu',
+'february' => 'Pebreru',
+'march' => 'Marsu',
 'april' => 'Abril',
 'may_long' => 'Mayu',
 'june' => 'Juniu',
 'july' => 'Juliu',
 'august' => 'Agostu',
-'september' => 'Setiembri',
+'september' => 'Septiembri',
 'october' => 'Octubri',
 'november' => 'Nobiembri',
-'december' => 'Diciembri',
+'december' => 'Disiembri',
 'january-gen' => 'Eneru',
-'february-gen' => 'Febreru',
-'march-gen' => 'Marzu',
+'february-gen' => 'Pebreru',
+'march-gen' => 'Marsu',
 'april-gen' => 'Abril',
 'may-gen' => 'Mayu',
 'june-gen' => 'Juniu',
 'july-gen' => 'Juliu',
 'august-gen' => 'Agostu',
-'september-gen' => 'Setiembri',
-'october-gen' => 'Octobri',
-'november-gen' => 'Noviembri',
-'december-gen' => 'Diciembri',
+'september-gen' => 'Septiembri',
+'october-gen' => 'Octubri',
+'november-gen' => 'Nobiembri',
+'december-gen' => 'Disiembri',
 'jan' => 'Ene',
 'feb' => 'Peb',
-'mar' => 'Mrz',
+'mar' => 'Mrs',
 'apr' => 'Abr',
 'may' => 'Myu',
 'jun' => 'Jnu',
@@ -154,10 +154,19 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'faqpage' => 'Project:MAK',
 
 # Vector skin
+'vector-action-addsection' => 'Dagdagan ing pisasabian',
+'vector-action-delete' => 'Buran',
 'vector-action-move' => 'Iyalis',
 'vector-action-protect' => 'Protectan/kambilan',
 'vector-action-undelete' => 'Isubli/iurung ya pangabura',
 'vector-action-unprotect' => 'Idayu ya panga-protecta',
+'vector-view-create' => 'Maglalang',
+'vector-view-edit' => 'Alilan',
+'vector-view-history' => 'Lawen ya ing amlat',
+'vector-view-view' => 'Basan',
+'vector-view-viewsource' => 'Lawen ya ing pikuanan',
+'namespaces' => 'Karinanlagiu',
+'variants' => 'Aliwapa',
 
 'errorpagetitle' => 'Mali',
 'returnto' => 'Magbalik king $1.',
@@ -173,6 +182,7 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'printableversion' => 'Kopiang malyaring i-print',
 'permalink' => 'Suglung a permanenti',
 'print' => 'I-print',
+'view' => 'Lawen',
 'edit' => 'Alilan',
 'create' => 'Maglalang',
 'editthispage' => 'I-edit ya ing bulung a ini',
@@ -275,7 +285,7 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'nstab-project' => 'Bulung ding proyektu',
 'nstab-image' => 'Simpan (File)',
 'nstab-mediawiki' => 'Mensahi',
-'nstab-template' => 'Modelu (template)',
+'nstab-template' => 'Ulma (template)',
 'nstab-help' => 'Saup bulung',
 'nstab-category' => 'Kategoriya',
 
@@ -644,6 +654,7 @@ Ini ing sangkan a binie nang $3: ''$2''",
 Kabaldugan: (ngeni)=pamiyaliwa king salukuyan a bersion (bersion ngeni),
 (tauli)=pamiyaliwa ketang sadyang (tauling) bersion, M = malating edit.',
 'history-fieldset-title' => 'Amlat da reng pamaglawe',
+'history-show-deleted' => 'Milako yamu',
 'histfirst' => 'Minunang dili',
 'histlast' => 'Pekabayu',
 'historysize' => '({{PLURAL:$1|1 a byte|byte}})',
@@ -748,7 +759,12 @@ Gamitan me ing radio button column bang bukud mung detang miyalilan aniang o bay
 'prevn' => 'minunang {{PLURAL:$1|$1}}',
 'nextn' => 'tutuking {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Lon ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Atin bulung a mikilagiung \"[[:\$1]]\" keng wiking ini.'''",
 'searchhelp-url' => 'Help:Kalamnan',
+'searchprofile-everything' => 'Eganagana',
+'searchprofile-articles-tooltip' => 'Paintunan king$1',
+'searchprofile-images-tooltip' => 'Manintun makasimpan',
+'searchprofile-everything-tooltip' => 'Manintun karing eganaganang laman (kayabe no reng bulung pamisabi-sabi)',
 'search-result-size' => '$1 ({{PLURAL:$2|1 a kataya|$2 kataya}})',
 'search-result-score' => 'Kaugnayan (relevance): $1%',
 'search-redirect' => '(pamanalis direksiun $1)',
@@ -1020,19 +1036,19 @@ Ba yang iyabe ing simpan king metung a bulung gamitan me ing suglung (link) king
 Ing simpan a ini $2 ya.',
 'largefileserver' => 'Mas maragul ya ing simpan (file) a ini kesa ketang makapaintulut (configured) king server.',
 'emptyfile' => 'Balamu ala yang laman ing simpan (file) a linulan mu. Mapaliaring ing sangkan, pamagkamali (typo) ya king lagyung simpan (file name). Pakaisipan mu nung taganang buri meng ilulan ining simpan.',
-'fileexists' => "Atin nang simpan (file) a maki lagyung anti kaniti; pakilawe mu '''<tt>[[:$1]]</tt>''' nung e ka siguradu nung buri meng alilan.
-[[$1|thumb]]",
-'filepageexists' => "Melalang na ing bulung pamilarawan (description page) para king simpan (file) a ini king '''<tt>[[:$1]]</tt>''', oneng king salukuyan, ala pang simpan a maki lagyung anti kaniti.
+'fileexists' => 'Atin nang simpan (file) a maki lagyung anti kaniti; pakilawe mu <strong>[[:$1]]</strong> nung e ka siguradu nung buri meng alilan.
+[[$1|thumb]]',
+'filepageexists' => 'Melalang na ing bulung pamilarawan (description page) para king simpan (file) a ini king <strong>[[:$1]]</strong>, oneng king salukuyan, ala pang simpan a maki lagyung anti kaniti.
 E ya tambing lunto king bulung pamilarawan ing sampulung (summary) a isulat mu.
-Ba yang lunto karin ing kekang sampulung, kailangan me pamung i-edit",
-'fileexists-extension' => "Maki simpan (file) a makayawig lagyu kaniti: [[$2|thumb]]
-* Lagyu ning simpan a milululan: '''<tt>[[:$1]]</tt>'''
-* Lagyu ning salukuyan a simpan: '''<tt>[[:$2]]</tt>'''
-Mamili kang aliwang lagyu.",
+Ba yang lunto karin ing kekang sampulung, kailangan me pamung i-edit',
+'fileexists-extension' => 'Maki simpan (file) a makayawig lagyu kaniti: [[$2|thumb]]
+* Lagyu ning simpan a milululan: <strong>[[:$1]]</strong>
+* Lagyu ning salukuyan a simpan: <strong>[[:$2]]</strong>
+Mamili kang aliwang lagyu.',
 'fileexists-thumbnail-yes' => "Lupa yang larawan a pepalati ing simpan ''(thumbnail)''. [[$1|thumb]]
-Pakilawe me ing simpan '''<tt>[[:$1]]</tt>'''.
+Pakilawe me ing simpan <strong>[[:$1]]</strong>.
 Nung ya naman ketang minunang maki orihinal a dagul ing simpan a maka-check, e na kailangang maglulan karagdagan a thumbnail.",
-'file-thumbnail-no' => "Magumpisa ya ing lagyungsimpan (filename) king '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Magumpisa ya ing lagyungsimpan (filename) king <strong>$1</strong>.
 Lupa yang larawan a pepalati ''(thumbnail)''.
 Nung atyu keka ining larawan king bersion a pekamalino (full resolution), ilulan me ini; nung ali naman, pakiyalilan me ing lagyung simpan.",
 'fileexists-forbidden' => 'Atin nang simpan a maki lagyung anti kaniti;
@@ -1147,7 +1163,7 @@ Miyalilan ing pamanayus nung i-click ya ing pamagat ning kolum (column header).'
 # MIME search
 'mimesearch' => 'pamanintun MIME',
 'mimesearch-summary' => 'Papaliari ning bulung a ini ing pamanialak (filtering) kareng simpan (file) para king kayang MIME-type.
-Isulat (input): contenttype/subtype, alimbawa <tt>image/jpeg</tt>.',
+Isulat (input): contenttype/subtype, alimbawa <code>image/jpeg</code>.',
 'download' => 'ikuldas (download)',
 
 # Unwatched pages
@@ -1294,6 +1310,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 # Special:LinkSearch
 'linksearch' => 'Suglung palual',
+'linksearch-line' => '$1 makasuglung ibat $2',
 
 # Special:ListUsers
 'listusersfrom' => 'Ipakit la reng talagamit magumpisa king:',
@@ -1583,7 +1600,7 @@ $1',
 'nolinkshere-ns' => "Alang bulung a makatuglung king '''[[:$1]]''' ketang mepiling pirinan lagyu (namespace).",
 'isredirect' => 'Bulung ning pamanaliling direksiun',
 'istemplate' => 'misingit',
-'isimage' => 'suglung king larawan',
+'isimage' => 'Isuglung king larawan',
 'whatlinkshere-prev' => '{{PLURAL:$1|minunang|minunang $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|next|tutuking $1}}',
 'whatlinkshere-links' => '← suglung',
@@ -2080,6 +2097,14 @@ Detang aliwa tambing (by default) lang makasalikut.
 'exif-gpsareainformation' => 'Lagyu ning lugal king GPS',
 'exif-gpsdatestamp' => 'Petsa ning GPS',
 'exif-gpsdifferential' => 'Pamanulid king pamialiwa ning GPS (GPS differential correction)',
+'exif-worldregioncreated' => 'Labuad nung nu ya meyakua ing litratu',
+'exif-countrycreated' => 'Bangsa nung nokarin ya meyakua ing litratu',
+'exif-countrydest' => 'Bangsang makalto',
+'exif-provinceorstatedest' => 'Lalawigan o bangsang makalto',
+'exif-citydest' => 'Lakanbalen makalto',
+'exif-objectname' => 'Makuyad a bansag',
+'exif-source' => 'Pikuanan',
+'exif-cameraownername' => 'Mikibandi keng paglitratu',
 
 # EXIF attributes
 'exif-compression-1' => 'E makapitpit (uncompressed)',
index cf649e0..9806086 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Kaganer
+ * @author Krinkle
  * @author Xqt
  * @author לערי ריינהארט
  */
@@ -126,6 +127,7 @@ $messages = array(
 'subcategories' => 'Unnerabdeeling',
 'category-media-header' => 'Media in Abdeeling „$1“',
 'category-empty' => "''Die Abdeeling hot zu daere Zeit kene Bledder oder Feils.''",
+'hidden-categories' => '{{PLURAL:$1|Versteckelte Abdeeling|Verstecktelte Abdeelinge}}',
 'category-article-count-limited' => '{{PLURAL:$1|Sell Blatt iss|Selle $1 Bledder sin}} in daer Abdeeling drin:',
 'category-file-count-limited' => '{{PLURAL:$1|Sell Feil iss|Selle $1 Feils sin}} in daer Abdeeling drin:',
 'listingcontinuesabbrev' => '(weider)',
@@ -276,6 +278,7 @@ Wenns des net iss, hoscht verleicht en Fehler in de Daadebank gfunne. Bitte meld
 'missingarticle-diff' => '(Unnerschidd zwische Versione: $1, $2)',
 'internalerror' => 'Interner Fehler',
 'internalerror_info' => 'Interner Fehler: $1',
+'badtitle' => 'Tidl net gildich',
 'ns-specialprotected' => 'Besunnere Bledder sinn net zum Ennere.',
 
 # Virus scanner
@@ -424,7 +427,7 @@ Paesswatt fer nau: $2',
 'qbsettings-none' => 'Ken',
 
 # Preferences page
-'preferences' => 'paerseenlich Profil',
+'preferences' => 'Paerseenlich Profil',
 'mypreferences' => 'Mei Uffschtelling',
 'changepassword' => 'Paesswatt ennere',
 'skin-preview' => 'Aagucke',
@@ -887,9 +890,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 
 # Info page
 'pageinfo-header-edits' => 'Enneringe',
-'pageinfo-header-watchlist' => 'Watsch-Lischt',
-'pageinfo-subjectpage' => 'Blatt',
-'pageinfo-talkpage' => 'Gschwetz-Blatt',
 
 # Browsing diffs
 'nextdiff' => 'Zum neegschte Versionsunnerschidd →',
index 64430a7..4e90283 100644 (file)
@@ -233,8 +233,8 @@ Zum die Said aaleche, kannscht do in dem Käschtel unne aafange mid schraiwe (gu
 Wenn do nid hin hoscht welle, no druck in Daim Browser uff '''Zrick'''.",
 'noarticletext' => 'Uff derre Said gebbt\'s noch kää Text. Du kannscht uff annere Saide [[Special:Search/{{PAGENAME}}|den Aitrach suche]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbuchaidrach suche, wu dezu ghert],
 orrer [{{fullurl:{{FULLPAGENAME}}|action=edit}} die Said bearwaide]</span>.',
-'previewnote' => "'''Denk dran, dass des numme e Vorschau isch.'''
-Dai Ännerunge sinn no nid gspaichert worre!",
+'previewnote' => "'''Deng'g droa, dass des numme e Vorschau isch.'''
+Doi Ännerunge sinn no nid gschbaichert worre!",
 'editing' => 'Am $1 bearwaide',
 'editingsection' => '$1 bearwaide (Abschnitt)',
 'yourtext' => 'Doin Tegschd',
@@ -250,7 +250,7 @@ du gebbscht do au zu, dass Du des selwerscht gschriwwe hoscht orrer vun ere effe
 'hiddencategories' => 'Die Said ghert zu {{PLURAL:$1|1 versteckelte Kategorie|$1 versteckelte Kategorie}}:',
 'permissionserrorstext-withaction' => 'Du därfscht nid $2, aus {{PLURAL:$1|dem Grund|denne Grind}}:',
 'moveddeleted-notice' => 'Die Said isch glescht worre.
-De Leschaidrach fer die Said isch do unne aagewwe als Quell.',
+De Leschaidrach fa die Said isch do unne als Kwell aagewwe.',
 
 # History pages
 'viewpagelogs' => 'D Lochbiecher fer die Said aagucke',
index a0cd772..582180f 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Ankry
  * @author Bartek50003
  * @author BdgwksxD
  * @author Beau
@@ -19,6 +20,7 @@
  * @author Holek
  * @author Jwitos
  * @author Kaganer
+ * @author Karol007
  * @author Lajsikonik
  * @author Lampak
  * @author Lazowik
@@ -33,6 +35,7 @@
  * @author Odder
  * @author Olgak85
  * @author Przemub
+ * @author Reedy
  * @author Remedios44
  * @author Remember the dot
  * @author Rzuwig
@@ -203,101 +206,101 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#PATRZ', '#PRZEKIERUJ', '#TAM', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__BEZSPISU__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__BEZGALERII__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ZESPISEM__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__SPIS__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BEZEDYCJISEKCJI__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__BEZNAGŁÓWKA__', '__NOHEADER__' ),
-       'currentday'              => array( '1', 'AKTUALNYDZIEŃ', 'CURRENTDAY' ),
-       'currentdayname'          => array( '1', 'NAZWADNIA', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'AKTUALNYROK', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'AKTUALNYCZAS', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'AKTUALNAGODZINA', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MIESIĄC', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'MIESIĄCNAZWA', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'MIESIĄCNAZWAD', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'MIESIĄCNAZWASKR', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'DZIEŃ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'DZIEŃ2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'DZIEŃTYGODNIA', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ROK', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'CZAS', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'GODZINA', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'STRON', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ARTYKUŁÓW', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'PLIKÓW', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'UŻYTKOWNIKÓW', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'LICZBAAKTYWNYCHUŻYTKOWNIKÓW', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'EDYCJI', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'NAZWASTRONY', 'PAGENAME' ),
-       'namespace'               => array( '1', 'NAZWAPRZESTRZENI', 'NAMESPACE' ),
-       'talkspace'               => array( '1', 'DYSKUSJA', 'TALKSPACE' ),
-       'fullpagename'            => array( '1', 'PELNANAZWASTRONY', 'FULLPAGENAME' ),
-       'subpagename'             => array( '1', 'NAZWAPODSTRONY', 'SUBPAGENAME' ),
-       'basepagename'            => array( '1', 'BAZOWANAZWASTRONY', 'BASEPAGENAME' ),
-       'talkpagename'            => array( '1', 'NAZWASTRONYDYSKUSJI', 'TALKPAGENAME' ),
-       'subst'                   => array( '0', 'podst:', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'mały', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'mały=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'prawo', 'right' ),
-       'img_left'                => array( '1', 'lewo', 'left' ),
-       'img_none'                => array( '1', 'brak', 'none' ),
-       'img_center'              => array( '1', 'centruj', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'ramka', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'bezramki', 'bez_ramki', 'frameless' ),
-       'img_page'                => array( '1', 'strona=$1', 'page=$1', 'page $1' ),
-       'img_border'              => array( '1', 'tło', 'border' ),
-       'img_top'                 => array( '1', 'góra', 'top' ),
-       'img_middle'              => array( '1', 'środek', 'middle' ),
-       'img_bottom'              => array( '1', 'dół', 'bottom' ),
-       'sitename'                => array( '1', 'PROJEKT', 'SITENAME' ),
-       'ns'                      => array( '0', 'PN:', 'NS:' ),
-       'articlepath'             => array( '0', 'ŚCIEŻKAARTYKUŁÓW', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'SERWER', 'SERVER' ),
-       'servername'              => array( '0', 'NAZWASERWERA', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ŚCIEŻKASKRYPTU', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'ODMIANA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'PŁEĆ:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'AKTUALNYTYDZIEŃ', 'CURRENTWEEK' ),
-       'localweek'               => array( '1', 'TYDZIEŃROKU', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'DZIEŃTYGODNIANR', 'LOCALDOW' ),
-       'plural'                  => array( '0', 'MNOGA:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'PEŁNYURL', 'FULLURL:' ),
-       'lcfirst'                 => array( '0', 'ZMAŁEJ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ZWIELKIEJ:', 'ZDUŻEJ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MAŁE:', 'LC:' ),
-       'uc'                      => array( '0', 'WIELKIE:', 'DUŻE:', 'UC:' ),
-       'displaytitle'            => array( '1', 'WYŚWIETLANYTYTUŁ', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__LINKNOWEJSEKCJI__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'AKTUALNAWERSJA', 'CURRENTVERSION' ),
-       'language'                => array( '0', '#JĘZYK:', '#LANGUAGE:' ),
-       'numberofadmins'          => array( '1', 'ADMINISTRATORÓW', 'NUMBEROFADMINS' ),
-       'padleft'                 => array( '0', 'DOLEWEJ', 'PADLEFT' ),
-       'padright'                => array( '0', 'DOPRAWEJ', 'PADRIGHT' ),
-       'special'                 => array( '0', 'specjalna', 'special' ),
-       'defaultsort'             => array( '1', 'DOMYŚLNIESORTUJ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ŚCIEŻKAPLIKU', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__KATEGORIAUKRYTA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'STRONYWKATEGORII', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'ROZMIARSTRONY', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEKSUJ__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__NIEINDEKSUJ__', '__NOINDEX__' ),
-       'protectionlevel'         => array( '1', '__POZIOMZABEZPIECZEŃ__', 'PROTECTIONLEVEL' ),
-       'url_path'                => array( '0', 'ŚCIEŻKA', 'PATH' ),
-       'url_query'               => array( '0', 'ZAPYTANIE', 'QUERY' ),
+       'redirect'                  => array( '0', '#PATRZ', '#PRZEKIERUJ', '#TAM', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__BEZSPISU__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__BEZGALERII__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ZESPISEM__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__SPIS__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BEZEDYCJISEKCJI__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__BEZNAGŁÓWKA__', '__NOHEADER__' ),
+       'currentday'                => array( '1', 'AKTUALNYDZIEŃ', 'CURRENTDAY' ),
+       'currentdayname'            => array( '1', 'NAZWADNIA', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'AKTUALNYROK', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'AKTUALNYCZAS', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'AKTUALNAGODZINA', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MIESIĄC', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'MIESIĄCNAZWA', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'MIESIĄCNAZWAD', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'MIESIĄCNAZWASKR', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'DZIEŃ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'DZIEŃ2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'DZIEŃTYGODNIA', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ROK', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'CZAS', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'GODZINA', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'STRON', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ARTYKUŁÓW', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'PLIKÓW', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'UŻYTKOWNIKÓW', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'LICZBAAKTYWNYCHUŻYTKOWNIKÓW', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'EDYCJI', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'NAZWASTRONY', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'NAZWAPRZESTRZENI', 'NAMESPACE' ),
+       'talkspace'                 => array( '1', 'DYSKUSJA', 'TALKSPACE' ),
+       'fullpagename'              => array( '1', 'PELNANAZWASTRONY', 'FULLPAGENAME' ),
+       'subpagename'               => array( '1', 'NAZWAPODSTRONY', 'SUBPAGENAME' ),
+       'basepagename'              => array( '1', 'BAZOWANAZWASTRONY', 'BASEPAGENAME' ),
+       'talkpagename'              => array( '1', 'NAZWASTRONYDYSKUSJI', 'TALKPAGENAME' ),
+       'subst'                     => array( '0', 'podst:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'mały', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'mały=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'prawo', 'right' ),
+       'img_left'                  => array( '1', 'lewo', 'left' ),
+       'img_none'                  => array( '1', 'brak', 'none' ),
+       'img_center'                => array( '1', 'centruj', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'ramka', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'bezramki', 'bez_ramki', 'frameless' ),
+       'img_page'                  => array( '1', 'strona=$1', 'page=$1', 'page $1' ),
+       'img_border'                => array( '1', 'tło', 'border' ),
+       'img_top'                   => array( '1', 'góra', 'top' ),
+       'img_middle'                => array( '1', 'środek', 'middle' ),
+       'img_bottom'                => array( '1', 'dół', 'bottom' ),
+       'sitename'                  => array( '1', 'PROJEKT', 'SITENAME' ),
+       'ns'                        => array( '0', 'PN:', 'NS:' ),
+       'articlepath'               => array( '0', 'ŚCIEŻKAARTYKUŁÓW', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'SERWER', 'SERVER' ),
+       'servername'                => array( '0', 'NAZWASERWERA', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ŚCIEŻKASKRYPTU', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'ODMIANA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'PŁEĆ:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'AKTUALNYTYDZIEŃ', 'CURRENTWEEK' ),
+       'localweek'                 => array( '1', 'TYDZIEŃROKU', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'DZIEŃTYGODNIANR', 'LOCALDOW' ),
+       'plural'                    => array( '0', 'MNOGA:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'PEŁNYURL', 'FULLURL:' ),
+       'lcfirst'                   => array( '0', 'ZMAŁEJ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ZWIELKIEJ:', 'ZDUŻEJ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MAŁE:', 'LC:' ),
+       'uc'                        => array( '0', 'WIELKIE:', 'DUŻE:', 'UC:' ),
+       'displaytitle'              => array( '1', 'WYŚWIETLANYTYTUŁ', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__LINKNOWEJSEKCJI__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'AKTUALNAWERSJA', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#JĘZYK:', '#LANGUAGE:' ),
+       'numberofadmins'            => array( '1', 'ADMINISTRATORÓW', 'NUMBEROFADMINS' ),
+       'padleft'                   => array( '0', 'DOLEWEJ', 'PADLEFT' ),
+       'padright'                  => array( '0', 'DOPRAWEJ', 'PADRIGHT' ),
+       'special'                   => array( '0', 'specjalna', 'special' ),
+       'defaultsort'               => array( '1', 'DOMYŚLNIESORTUJ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ŚCIEŻKAPLIKU', 'FILEPATH:' ),
+       'hiddencat'                 => array( '1', '__KATEGORIAUKRYTA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'STRONYWKATEGORII', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'ROZMIARSTRONY', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEKSUJ__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NIEINDEKSUJ__', '__NOINDEX__' ),
+       'protectionlevel'           => array( '1', '__POZIOMZABEZPIECZEŃ__', 'PROTECTIONLEVEL' ),
+       'url_path'                  => array( '0', 'ŚCIEŻKA', 'PATH' ),
+       'url_query'                 => array( '0', 'ZAPYTANIE', 'QUERY' ),
 );
 
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podkreślenie linków',
 'tog-justify' => 'Wyrównuj tekst w akapitach do obu marginesów',
-'tog-hideminor' => 'Ukryj drobne modyfikacje w ostatnich zmianach',
+'tog-hideminor' => 'Ukryj drobne edycje w ostatnich zmianach',
 'tog-hidepatrolled' => 'Ukryj sprawdzone edycje w ostatnich zmianach',
 'tog-newpageshidepatrolled' => 'Ukryj sprawdzone strony na liście nowych stron',
 'tog-extendwatchlist' => 'Pokaż na liście obserwowanych wszystkie zmiany, nie tylko ostatnie',
-'tog-usenewrc' => 'Zastosuj rozbudowany widok ostatnich zmian (JavaScript)',
+'tog-usenewrc' => 'Grupuj zmiany według stron na liście ostatnich zmian i obserwowanych (Wymaga JavaScript)',
 'tog-numberheadings' => 'Automatyczna numeracja nagłówków',
 'tog-showtoolbar' => 'Pokaż pasek narzędzi (JavaScript)',
 'tog-editondblclick' => 'Podwójne kliknięcie rozpoczyna edycję (JavaScript)',
@@ -305,17 +308,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Kliknięcie prawym klawiszem myszy na tytule sekcji rozpoczyna jej edycję (JavaScript)',
 'tog-showtoc' => 'Pokazuj spis treści (na stronach z więcej niż 3 nagłówkami)',
 'tog-rememberpassword' => 'Zapamiętaj moje hasło w przeglądarce (maksymalnie przez $1 {{PLURAL:$1|dzień|dni}})',
-'tog-watchcreations' => 'Dodaj do obserwowanych strony tworzone przeze mnie',
-'tog-watchdefault' => 'Dodaj do obserwowanych strony, które edytuję',
-'tog-watchmoves' => 'Dodaj do obserwowanych strony, które przenoszę',
-'tog-watchdeletion' => 'Dodaj do obserwowanych strony, które usuwam',
-'tog-minordefault' => 'Wszystkie zmiany oznaczaj domyślnie jako drobne',
+'tog-watchcreations' => 'Dodawaj do obserwowanych tworzone przeze mnie strony oraz wgrywane przeze mnie pliki',
+'tog-watchdefault' => 'Dodawaj do obserwowanych strony i pliki, które edytuję',
+'tog-watchmoves' => 'Dodawaj do obserwowanych strony i pliki, które przenoszę',
+'tog-watchdeletion' => 'Dodawaj do obserwowanych strony i pliki, które usuwam',
+'tog-minordefault' => 'Wszystkie edycje domyślnie oznaczaj jako drobne',
 'tog-previewontop' => 'Pokazuj podgląd powyżej obszaru edycji',
 '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, jeśli strona z listy moich obserwowanych zostanie zmodyfikowana',
-'tog-enotifusertalkpages' => 'Wyślij do mnie e‐mail, jeśli moja strona dyskusji zostanie zmodyfikowana',
-'tog-enotifminoredits' => 'Wyślij e‐mail także w przypadku drobnych zmian na stronach',
+'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-enotifminoredits' => 'Wyślij e‐mail także w przypadku drobnych zmian na stronach lub w plikach',
 'tog-enotifrevealaddr' => 'Nie ukrywaj mojego adresu e‐mail w powiadomieniach',
 'tog-shownumberswatching' => 'Pokaż liczbę użytkowników obserwujących stronę',
 'tog-oldsig' => 'Twój obecny podpis',
@@ -327,11 +330,10 @@ $messages = array(
 'tog-forceeditsummary' => 'Informuj o niewypełnieniu opisu zmian',
 'tog-watchlisthideown' => 'Ukryj moje edycje na liście obserwowanych',
 'tog-watchlisthidebots' => 'Ukryj edycje botów na liście obserwowanych',
-'tog-watchlisthideminor' => 'Ukrywaj drobne zmiany na liście obserwowanych',
+'tog-watchlisthideminor' => 'Ukryj drobne zmiany na liście obserwowanych',
 'tog-watchlisthideliu' => 'Ukryj edycje zalogowanych użytkowników na liście obserwowanych',
 'tog-watchlisthideanons' => 'Ukryj edycje anonimowych użytkowników na liście obserwowanych',
 'tog-watchlisthidepatrolled' => 'Ukryj sprawdzone edycje na liście obserwowanych',
-'tog-nolangconversion' => 'Wyłącz odmianę',
 'tog-ccmeonemails' => 'Przesyłaj mi kopie wiadomości, które wysyłam do innych użytkowników',
 'tog-diffonly' => 'Nie pokazuj treści stron pod porównaniami zmian',
 'tog-showhiddencats' => 'Pokazuj ukryte kategorie',
@@ -556,6 +558,10 @@ $1',
 'youhavenewmessages' => 'Masz $1 ($2).',
 'newmessageslink' => 'nowe wiadomości',
 'newmessagesdifflink' => 'różnica z poprzednią wersją',
+'youhavenewmessagesfromusers' => 'Masz $1 od {{PLURAL:$3|innego użytkownika|$3 innych użytkowników}} ($2).',
+'youhavenewmessagesmanyusers' => 'Masz $1 od wielu użytkowników ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|jedną wiadomość|$1 wiadomości}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ostatnia zmiana|ostatnie $1 zmiany|ostatnie $1 zmian}}',
 'youhavenewmessagesmulti' => 'Masz nowe wiadomości na $1',
 'editsection' => 'edytuj',
 'editold' => 'edytuj',
@@ -609,9 +615,9 @@ Listę dostępnych stron specjalnych znajdziesz [[Special:SpecialPages|tutaj]].'
 'dberrortext' => 'Wystąpił błąd składni w zapytaniu do bazy danych.
 Może to oznaczać błąd w oprogramowaniu.
 Ostatnie, nieudane zapytanie to:
-<blockquote><tt>$1</tt></blockquote>
-wysłane przez funkcję „<tt>$2</tt>”.
-Baza danych zgłosiła błąd „<tt>$3: $4</tt>”.',
+<blockquote><code>$1</code></blockquote>
+wysłane przez funkcję „<code>$2</code>”.
+Baza danych zgłosiła błąd „<samp>$3: $4</samp>”.',
 'dberrortextcl' => 'Wystąpił błąd składni w zapytaniu do bazy danych.
 Ostatnie, nieudane zapytanie to:
 „$1”
@@ -648,6 +654,8 @@ Można zgłosić ten fakt [[Special:ListUsers/sysop|administratorowi]], podając
 'cannotdelete' => 'Strona lub plik „$1” nie mogą zostać usunięte.
 Możliwe, że zostały już usunięte przez kogoś innego.',
 'cannotdelete-title' => 'Nie można usunąć strony „$1”.',
+'delete-hook-aborted' => 'Usuwanie przerwane przez hak.
+Przyczyna nieokreślona.',
 'badtitle' => 'Niepoprawny tytuł',
 'badtitletext' => 'Podano niepoprawny tytuł strony. Prawdopodobnie jest pusty lub zawiera znaki, których użycie jest zabronione.',
 'perfcached' => 'Poniższe dane są kopią z pamięci podręcznej i mogą być nieaktualne. Maksymalnie {{PLURAL:$1|jeden wynik jest|$1 wyniki są|$1 wyników jest}} w pamięci podręcznej.',
@@ -681,6 +689,8 @@ Uzasadnienie blokady: ''$2''.",
 Administrator blokujący go podał następujący powód "\'\'$3\'\'".',
 'invalidtitle-knownnamespace' => 'Nieprawidłowa nazwa w obszarze nazw "$2" o treści "$3"',
 'invalidtitle-unknownnamespace' => 'Nieprawidłowa nazwa z nieznaną liczbą przestrzeni nazw  $1  o treści "$2"',
+'exception-nologin' => 'Nie jesteś zalogowany/a',
+'exception-nologin-text' => 'Ta strona lub akcja wymaga bycia zalogowanym na tej wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Zła konfiguracja – nieznany skaner antywirusowy ''$1''",
@@ -701,6 +711,7 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji dla {{GRAMMAR:D.lp|{{
 'remembermypassword' => 'Zapamiętaj moje hasło na tym komputerze (maksymalnie przez $1 {{PLURAL:$1|dzień|dni}})',
 'securelogin-stick-https' => 'Po zalogowaniu utrzymuj połączenie poprzez HTTPS',
 'yourdomainname' => 'Twoja domena',
+'password-change-forbidden' => 'Nie można zmieniać haseł na tej wiki.',
 'externaldberror' => 'Wystąpił błąd zewnętrznej bazy autentyfikacyjnej lub nie posiadasz uprawnień koniecznych do aktualizacji zewnętrznego konta.',
 'login' => 'Zaloguj się',
 'nav-login-createaccount' => 'Logowanie i rejestracja',
@@ -952,6 +963,9 @@ Możesz [[Special:Search/{{PAGENAME}}|poszukać „{{PAGENAME}}” na innych str
 'noarticletext-nopermission' => 'Na tej stronie nie ma jeszcze artykułu.
 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 logi].</span>',
+'missing-revision' => 'Wersja #$1 strony "{{PAGENAME}}" nie istnieje.
+
+Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powód usunięcia znajduje się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze].',
 'userpage-userdoesnotexist' => 'Użytkownik „<nowiki>$1</nowiki>” nie jest zarejestrowany.
 Upewnij się, czy na pewno zamierza{{GENDER:|łeś|łaś|sz}} utworzyć lub zmodyfikować właśnie tę stronę.',
 'userpage-userdoesnotexist-view' => 'Konto użytkownika „$1” nie jest zarejestrowane.',
@@ -961,7 +975,6 @@ Ostatni wpis rejestru blokad jest pokazany poniżej.',
 * '''Firefox / Safari:''' Przytrzymaj ''Shift'' podczas klikania ''Odśwież bieżącą stronę'', lub naciśnij klawisze ''Ctrl+F5'' lub ''Ctrl+R'' (''⌘-R'' na komputerze Mac)
 * '''Google Chrome:''' Naciśnij ''Ctrl-Shift-R'' (''⌘-Shift-R'' na komputerze Mac)
 * '''Internet Explorer:''' Przytrzymaj ''Ctrl'' jednocześnie klikając ''Odśwież'' lub naciśnij klawisze ''Ctrl+F5''
-* '''Konqueror:''' Kliknij polecenie ''Odśwież'' lub naciśnij klawisz ''F5''
 * '''Opera:''' Wyczyść pamięć podręczną w ''Narzędzia → Preferencje''",
 'usercssyoucanpreview' => "'''Podpowiedź:''' Użyj przycisku „Podgląd”, aby przetestować nowy arkusz stylów CSS przed jego zapisaniem.",
 'userjsyoucanpreview' => "'''Podpowiedź:''' Użyj przycisku „Podgląd”, aby przetestować nowy kod JavaScript przed jego zapisaniem.",
@@ -1080,6 +1093,7 @@ Argument ten będzie pominięty.',
 'expansion-depth-exceeded-warning' => 'Strona przekroczyła głębokość rozbudowy',
 'parser-unstrip-loop-warning' => 'Wykryto nieskończoną pętlę',
 'parser-unstrip-recursion-limit' => 'Przekroczono maksymalną głębokość zagnieżdżania ($1)',
+'converter-manual-rule-error' => 'Błąd w językowych regułach konwersji',
 
 # "Undo" feature
 'undo-success' => 'Edycja może zostać wycofana. Porównaj ukazane poniżej różnice między wersjami, a następnie zapisz zmiany.',
@@ -1265,6 +1279,9 @@ Użycie linków nawigacyjnych kasuje wybór w kolumnie.',
 'editundo' => 'anuluj edycję',
 'diff-multi' => '(Nie pokazano $1 wersji {{PLURAL:$1|utworzonej|utworzonych}} przez {{PLURAL:$2|jednego użytkownika|$2 użytkowników}})',
 'diff-multi-manyusers' => '(Nie pokazano $1 {{PLURAL:$1|pośredniej wersji utworzonej|pośrednich wersji utworzonych}} przez {{PLURAL:$2|jednego użytkownika|$2 użytkowników}})',
+'difference-missing-revision' => '{{PLURAL:$2|Wersja|$2 wersje|$2 wersji}} #$1 strony "{{PAGENAME}}" nie {{PLURAL:$2|została znaleziona|zostały znalezione|zostało znalezionych}}.
+
+Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powód usunięcia znajduje się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze].',
 
 # Search results
 'searchresults' => 'Wyniki wyszukiwania',
@@ -1533,6 +1550,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'right-writeapi' => 'Zapis poprzez interfejs API',
 'right-delete' => 'Usuwanie stron',
 'right-bigdelete' => 'Usuwanie stron z długą historią edycji',
+'right-deletelogentry' => 'Usuwanie i przywracanie wpisów rejestru',
 'right-deleterevision' => 'Usuwanie i odtwarzanie określonej wersji strony',
 'right-deletedhistory' => 'Podgląd usuniętych wersji, bez przypisanego im tekstu',
 'right-deletedtext' => 'Podgląd usuniętego tekstu i zmian pomiędzy usuniętymi wersjami',
@@ -1677,9 +1695,9 @@ Poniżej znajduje się rejestr usunięć i zmian nazwy tej strony:",
 Jeśli chcesz przejrzeć lub przeszukać dotychczas przesłane pliki, przejdź do [[Special:FileList|listy plików]]. Każde przesłanie zostaje odnotowane w [[Special:Log/upload|rejestrze przesyłanych plików]], a usunięcie w [[Special:Log/delete|rejestrze usuniętych]].
 
 Plik pojawi się na stronie, jeśli użyjesz linku według jednego z następujących wzorów:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.jpg]]</nowiki></tt>''' pokaże plik w pełnej postaci
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.png|200px|thumb|left|podpis grafiki]]</nowiki></tt>''' pokaże szeroką na 200 pikseli miniaturkę umieszczoną przy lewym marginesie, otoczoną ramką, z podpisem „podpis grafiki”
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Plik.ogg]]</nowiki></tt>''' utworzy bezpośredni link do pliku bez wyświetlania samego pliku",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.jpg]]</nowiki></code>''' pokaże plik w pełnej postaci
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.png|200px|thumb|left|podpis grafiki]]</nowiki></code>''' pokaże szeroką na 200 pikseli miniaturkę umieszczoną przy lewym marginesie, otoczoną ramką, z podpisem „podpis grafiki”
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Plik.ogg]]</nowiki></code>''' utworzy bezpośredni link do pliku bez wyświetlania samego pliku",
 'upload-permitted' => 'Dopuszczalne formaty plików: $1.',
 'upload-preferred' => 'Zalecane formaty plików: $1.',
 'upload-prohibited' => 'Zabronione formaty plików: $1.',
@@ -1725,21 +1743,21 @@ Plik ma rozmiar {{PLURAL:$2|1 bajt|$2 bajty|$2 bajtów}}.',
 'emptyfile' => 'Przesłany plik wydaje się być pusty. Może być to spowodowane literówką w nazwie pliku.
 Sprawdź, czy nazwa jest prawidłowa.',
 'windows-nonascii-filename' => 'Na tej wiki nie można używać znaków specjalnych w nazwach plików.',
-'fileexists' => "Plik o takiej nazwie już istnieje.
-Sprawdź '''<tt>[[:$1]]</tt>''', jeśli nie jesteś pewien czy chcesz go zastąpić.
-[[$1|thumb]]",
-'filepageexists' => "Istnieje już strona opisu tego pliku, została utworzona '''<tt>[[:$1]]</tt>''', ale brak jest pliku o tej nazwie.
+'fileexists' => 'Plik o takiej nazwie już istnieje.
+Sprawdź <strong>[[:$1]]</strong>, jeśli nie jesteś pewien czy chcesz go zastąpić.
+[[$1|thumb]]',
+'filepageexists' => 'Istnieje już strona opisu tego pliku, została utworzona <strong>[[:$1]]</strong>, ale brak jest pliku o tej nazwie.
 Informacje, które wprowadzasz o przesyłanym pliku, nie pojawią się na jego stronie opisu.
 Jeśli chcesz, by się tam pojawiły, musisz później, ręcznie przeredagować stronę opisu.
-[[$1|thumb]]",
-'fileexists-extension' => "Plik o podobnej nazwie już istnieje: [[$2|thumb]]
-* Nazwa przesyłanego pliku: '''<tt>[[:$1]]</tt>'''
-* Nazwa istniejącego pliku: '''<tt>[[:$2]]</tt>'''
-Wybierz inną nazwę.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Plik o podobnej nazwie już istnieje: [[$2|thumb]]
+* Nazwa przesyłanego pliku: <strong>[[:$1]]</strong>
+* Nazwa istniejącego pliku: <strong>[[:$2]]</strong>
+Wybierz inną nazwę.',
 'fileexists-thumbnail-yes' => "Plik wydaje się być pomniejszoną grafiką ''(miniaturką)''. [[$1|thumb]]
-Sprawdź plik '''<tt>[[:$1]]</tt>'''.
+Sprawdź plik <strong>[[:$1]]</strong>.
 Jeśli wybrany plik jest tą samą grafiką co ta w rozmiarze pierwotnym, nie musisz przesyłać dodatkowej miniaturki.",
-'file-thumbnail-no' => "Nazwa pliku zaczyna się od '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Nazwa pliku zaczyna się od <strong>$1</strong>.
 Wydaje się, że jest to pomniejszona grafika ''(miniaturka)''.
 Jeśli posiadasz tę grafikę w pełnym rozmiarze – prześlij ją. Jeśli chcesz wysłać tę – zmień nazwę przesyłanego obecnie pliku.",
 'fileexists-forbidden' => 'Plik o tej nazwie już istnieje i nie może zostać nadpisany.
@@ -1835,7 +1853,7 @@ Jeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sy
 'backend-fail-connect' => 'Nie można nawiązać połączenia do wewnętrznych funkcji magazynowania "$1".',
 'backend-fail-internal' => 'Wystąpił nieznany błąd w wewnętrznych funkcjach magazynowania "$1".',
 'backend-fail-contenttype' => 'Nie można określić typ zawartości pliku do przechowywania w "$1".',
-'backend-fail-batchsize' => 'Wewnętrzne funkcje magazynowania otrzymały $1 {{PLURAL:$1|operację|operacje|operacji}} na pliku; limit wynosi $2 {{PLURAL:$2| operacja|operacje|operacji}}.',
+'backend-fail-batchsize' => 'Wewnętrzne funkcje magazynowania otrzymały $1 {{PLURAL:$1|operację|operacje|operacji}} na pliku; limit to $2 {{PLURAL:$2|operacja|operacje|operacji}}.',
 'backend-fail-usable' => 'Nie można zapisać pliku $1 ze względu na niewystarczające uprawnienia lub brak katalogów/kontenerów.',
 
 # File journal errors
@@ -1851,6 +1869,7 @@ Jeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sy
 'lockmanager-fail-releaselock' => 'Nie może zwolnić blokady dla " $1 ".',
 'lockmanager-fail-db-bucket' => 'Nie można powiązać wystarczającej ilości zablokowanych baz danych w segmencie $1 .',
 'lockmanager-fail-db-release' => 'Nie udało się zwolnić blokad w bazie danych $1.',
+'lockmanager-fail-svr-acquire' => 'Nie udało się uzyskać blokady na serwerze $1.',
 'lockmanager-fail-svr-release' => 'Nie udało się zwolnić blokady na serwerze $1.',
 
 # ZipDirectoryReader
@@ -1954,10 +1973,10 @@ Dostępna jest też [[Special:WhatLinksHere/$2|pełna lista]].',
 'morelinkstoimage' => 'Pokaż [[Special:WhatLinksHere/$1|więcej odnośników]] do tego pliku.',
 'linkstoimage-redirect' => '$1 (przekierowanie do pliku) $2',
 'duplicatesoffile' => '{{PLURAL:$1|Następujący plik jest kopią|Następujące pliki są kopiami}} pliku ([[Special:FileDuplicateSearch/$2|więcej informacji]]):',
-'sharedupload' => 'Ten plik znajduje się na $1 i może być używany w innych projektach.',
-'sharedupload-desc-there' => 'Ten plik znajduje się na $1 i może być używany w innych projektach.
+'sharedupload' => 'Ten plik znajduje się w $1 i może być używany w innych projektach.',
+'sharedupload-desc-there' => 'Ten plik znajduje się w $1 i może być używany w innych projektach.
 Więcej informacji odnajdziesz na [$2 stronie opisu pliku].',
-'sharedupload-desc-here' => 'Ten plik znajduje się na $1 i może być używany w innych projektach.
+'sharedupload-desc-here' => 'Ten plik znajduje się w $1 i może być używany w innych projektach.
 Poniżej znajdują się informacje ze [$2 strony opisu] tego pliku.',
 'sharedupload-desc-edit' => 'Plik ten pochodzi z $1 i może być wykorzystany w innych projektach.
 Być może zechcesz zmienić opis na tej [$2 stronie opisu pliku].',
@@ -2002,7 +2021,7 @@ Być może zechcesz zmienić opis na tej [$2 stronie opisu pliku].',
 # MIME search
 'mimesearch' => 'Wyszukiwanie MIME',
 'mimesearch-summary' => 'Ta strona umożliwia wyszukiwanie plików ze względu na ich typ MIME.
-Użycie: typ_treści/podtyp, np. <tt>image/jpeg</tt>.',
+Użycie: typ_treści/podtyp, np. <code>image/jpeg</code>.',
 'mimetype' => 'Typ MIME',
 'download' => 'pobierz',
 
@@ -2076,6 +2095,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bajt|bajty|bajtów}}',
 'ncategories' => '$1 {{PLURAL:$1|kategoria|kategorie|kategorii}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwiki|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linki|linków}}',
 'nmembers' => '$1 {{PLURAL:$1|element|elementy|elementów}}',
 'nrevisions' => '$1 {{PLURAL:$1|wersja|wersje|wersji}}',
@@ -2104,6 +2124,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 'mostlinkedtemplates' => 'Najczęściej linkowane szablony',
 'mostcategories' => 'Strony z największą liczbą kategorii',
 'mostimages' => 'Najczęściej linkowane pliki',
+'mostinterwikis' => 'Strony z największą liczbą linków interwiki',
 'mostrevisions' => 'Strony o największej liczbie wersji',
 'prefixindex' => 'Wszystkie strony o prefiksie',
 'prefixindex-namespace' => 'Wszystkie strony z prefiksem (przestrzeń nazw $1)',
@@ -2203,7 +2224,7 @@ Zobacz również [[Special:WantedCategories|brakujące kategorie]].',
 'linksearch-ok' => 'Szukaj',
 'linksearch-text' => 'Można użyć symboli wieloznacznych jak „*.wikipedia.org”.
 Wymaga podania co najmniej domeny najwyższego poziomu np. „*.org”.<br />
-Obsługiwane protokoły: <tt>$1</tt> (nie podawaj ich podczas wyszukiwania).',
+Obsługiwane protokoły: <code>$1</code> (nie podawaj ich podczas wyszukiwania).',
 'linksearch-line' => '$1 link na stronie $2',
 'linksearch-error' => 'Symbolu wieloznacznego można użyć wyłącznie na początku nazwy hosta.',
 
@@ -2249,6 +2270,8 @@ Sprawdź stronę z [[{{MediaWiki:Listgrouprights-helppage}}|dodatkowymi informac
 'mailnologin' => 'Brak adresu',
 'mailnologintext' => 'Musisz się [[Special:UserLogin|zalogować]] i mieć wpisany aktualny adres e‐mailowy w swoich [[Special:Preferences|preferencjach]], aby móc wysłać e‐mail do innego użytkownika.',
 'emailuser' => 'Wyślij e‐mail do tego użytkownika',
+'emailuser-title-target' => 'Wyślij e-mail do {{GENDER:$1|tego użytkownika|tej użytkowniczki|tego użytkownika}}',
+'emailuser-title-notarget' => 'Wyślij wiadomość e‐mail',
 'emailpage' => 'Wyślij e‐mail do użytkownika',
 'emailpagetext' => 'Możesz użyć poniższego formularza, aby wysłać wiadomość e‐mail do tego użytkownika.
 Adres e‐mailowy, który został przez Ciebie wprowadzony w [[Special:Preferences|Twoich preferencjach]], zostanie umieszczony w polu „Od”, dzięki czemu odbiorca będzie mógł Ci odpowiedzieć.',
@@ -2362,7 +2385,7 @@ Pomoc
 'exblank' => 'Strona była pusta',
 'delete-confirm' => 'Usuwanie „$1”',
 'delete-legend' => 'Usuń',
-'historywarning' => "'''Uwaga!''' Strona, którą chcesz usunąć, ma w przybliżeniu {{PLURAL:$1|starszą wersję|$1 starsze wersje|$1 starszych wersji}}:",
+'historywarning' => "'''Uwaga!''' Strona, którą chcesz usunąć, ma w przybliżeniu {{PLURAL:$1|jedną starszą wersję|$1 starsze wersje|$1 starszych wersji}}:",
 'confirmdeletetext' => 'Zamierzasz usunąć stronę razem z całą dotyczącą jej historią.
 Upewnij się, czy na pewno chcesz to zrobić, że rozumiesz konsekwencje i że robisz to w zgodzie z [[{{MediaWiki:Policy-url}}|zasadami]].',
 'actioncomplete' => 'Operacja wykonana',
@@ -2390,6 +2413,8 @@ Bądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w prac
 'rollback' => 'Cofnij edycję',
 'rollback_short' => 'Cofnij',
 'rollbacklink' => 'cofnij',
+'rollbacklinkcount' => 'cofnij $1 {{PLURAL:$1|edycję|edycje|edycji}}',
+'rollbacklinkcount-morethan' => 'cofnij więcej niż $1 {{PLURAL:$1|edycję|edycje|edycji}}',
 'rollbackfailed' => 'Nie udało się cofnąć zmiany',
 'cantrollback' => 'Nie można cofnąć edycji, ponieważ jest tylko jedna wersja tej strony.',
 'alreadyrolled' => 'Nie można dla strony [[:$1|$1]] cofnąć ostatniej zmiany, którą wykonał [[User:$2|$2]] ([[User talk:$2|dyskusja]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).
@@ -2477,7 +2502,7 @@ Obecne ustawienia dla strony '''$1''' to:",
 'undeletepage' => 'Odtwarzanie usuniętych stron',
 'undeletepagetitle' => "'''Poniżej znajdują się usunięte wersje strony [[:$1]]'''.",
 'viewdeletedpage' => 'Zobacz usunięte wersje',
-'undeletepagetext' => '{{PLURAL:$1|Następująca strona została usunięta, ale jej|Następujące $1 strony zostały usunięte, ale ich}} kopia wciąż znajduje się w archiwum.
+'undeletepagetext' => '{{PLURAL:$1|Następująca strona została usunięta, ale jej kopia wciąż znajduje|Następujące $1 strony zostały usunięte, ale ich kopie wciąż znajdują|Następujące $1 stron zostało usuniętych, ale ich kopie wciąż znajdują}} się w archiwum.
 Archiwum co jakiś czas może być oczyszczane.',
 'undelete-fieldset-title' => 'Odtwarzanie wersji',
 'undeleteextrahelp' => "Jeśli chcesz odtworzyć całą historię edycji strony, pozostaw wszystkie pola niezaznaczone i kliknij '''''{{int:undeletebtn}}'''''.
@@ -2533,7 +2558,7 @@ $1',
 'tooltip-invert' => 'Zaznacz to pole, aby ukryć zmiany na stronach w wybranych przestrzeniach nazw (oraz związanych z nimi innymi przestrzeniami nazw, jeśli zaznaczono)',
 'namespace_association' => 'powiązana przestrzeń nazw',
 'tooltip-namespace_association' => 'Zaznacz to pole, aby uwzględnić strony dyskusji i tematu związane z wybranymi przestrzeniami nazw',
-'blanknamespace' => '(główna)',
+'blanknamespace' => '(Główna)',
 
 # Contributions
 'contributions' => 'Wkład użytkownika',
@@ -2889,6 +2914,7 @@ Wszystkie operacje importu transwiki są odnotowywane w [[Special:Log/import|rej
 'import-interwiki-templates' => 'Załącz wszystkie szablony',
 'import-interwiki-submit' => 'Importuj',
 'import-interwiki-namespace' => 'Docelowa przestrzeń nazw',
+'import-interwiki-rootpage' => 'Docelowa strona główna (opcjonalna):',
 'import-upload-filename' => 'Nazwa pliku',
 'import-comment' => 'Komentarz:',
 'importtext' => 'Korzystając na źródłowej wiki z narzędzia [[Special:Export|eksportu]] wyeksportuj plik.
@@ -2922,6 +2948,9 @@ Brak katalogu dla plików tymczasowych.',
 'import-error-interwiki' => 'Strona „$1” nie została zaimportowana, ponieważ jej nazwa jest zarezerwowana do linków zewnętrznych (interwiki).',
 'import-error-special' => 'Strona „$1” nie została zaimportowana, ponieważ należy do specjalnej przestrzeni nazw, która nie zezwala na strony.',
 'import-error-invalid' => 'Strona „$1” nie została zaimportowana, ponieważ jej nazwa jest nieprawidłowa.',
+'import-options-wrong' => '{{PLURAL:$2|Niepoprawna opcja|Niepoprawne opcje}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Wskazana strona główna jest niepoprawna.',
+'import-rootpage-nosubpage' => 'Przestrzeń nazw "$1" strony głównej nie dopuszcza stron podrzędnych.',
 
 # Import log
 'importlogpage' => 'Rejestr importu',
@@ -2975,7 +3004,7 @@ Brak katalogu dla plików tymczasowych.',
 'tooltip-n-currentevents' => 'Informacje o aktualnych wydarzeniach',
 'tooltip-n-recentchanges' => 'Lista ostatnich zmian na {{GRAMMAR:MS.lp|{{SITENAME}}}}.',
 'tooltip-n-randompage' => 'Pokaż stronę wybraną losowo',
-'tooltip-n-help' => 'Tutaj możesz się wielu rzeczy dowiedzieć.',
+'tooltip-n-help' => 'Tutaj możesz się dowiedzieć wielu rzeczy.',
 'tooltip-t-whatlinkshere' => 'Pokaż listę wszystkich stron linkujących do tej strony',
 'tooltip-t-recentchangeslinked' => 'Ostatnie zmiany w stronach, do których ta strona linkuje',
 'tooltip-feed-rss' => 'Kanał RSS dla tej strony',
@@ -3062,19 +3091,38 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'spambot_username' => 'MediaWiki – usuwanie spamu',
 'spam_reverting' => 'Przywracanie ostatniej wersji nie zawierającej linków do $1',
 'spam_blanking' => 'Wszystkie wersje zawierały odnośniki do $1. Czyszczenie strony.',
+'spam_deleting' => 'Wszystkie wersje zawierały linki do $1, usuwam.',
 
 # Info page
 'pageinfo-title' => 'Informacje o „$1“',
-'pageinfo-header-edits' => 'Edycje',
-'pageinfo-header-watchlist' => 'Obserwowane',
-'pageinfo-header-views' => 'Odsłon',
-'pageinfo-subjectpage' => 'Strona',
-'pageinfo-talkpage' => 'Strona dyskusji',
-'pageinfo-watchers' => 'Obserwujących',
-'pageinfo-edits' => 'Edycji',
-'pageinfo-authors' => 'Autorów',
+'pageinfo-header-basic' => 'Podstawowe informacje',
+'pageinfo-header-edits' => 'Historia edycji',
+'pageinfo-header-restrictions' => 'Zmień zabezpieczenie',
+'pageinfo-header-properties' => 'Właściwości strony',
+'pageinfo-display-title' => 'Wyświetl tytuł',
+'pageinfo-default-sort' => 'Domyślny klucz sortowania',
+'pageinfo-length' => 'Długość strony (w bajtach)',
+'pageinfo-article-id' => 'Identyfikator strony',
+'pageinfo-robot-policy' => 'Stan wyszukiwarki',
+'pageinfo-robot-index' => 'Indeksowalne',
+'pageinfo-robot-noindex' => 'Nieindeksowalne',
 'pageinfo-views' => 'Odsłon',
-'pageinfo-viewsperedit' => 'Odsłon na edycję',
+'pageinfo-watchers' => 'Liczba obserwujących',
+'pageinfo-redirects-name' => 'Liczba przekierowań do tej strony',
+'pageinfo-subpages-name' => 'Liczba podstron tej strony',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|przekierowanie|przekierowania|przekierowań}}; $3 {{PLURAL:$3|bez przekierowania|bez przekierowań|bez przekierowań}})',
+'pageinfo-firstuser' => 'Twórca strony',
+'pageinfo-firsttime' => 'Data utworzenia strony',
+'pageinfo-lastuser' => 'Autor ostatniej edycji',
+'pageinfo-lasttime' => 'Data ostatniej edycji',
+'pageinfo-edits' => 'Liczba edycji',
+'pageinfo-authors' => 'Całkowita liczba autorów',
+'pageinfo-recent-edits' => 'Liczba ostatnich edycji (w przeciągu $1)',
+'pageinfo-recent-authors' => 'Liczba ostatnich autorów',
+'pageinfo-restriction' => 'Zabezpieczenie strony (<code>$1</code>)',
+'pageinfo-magic-words' => 'Magiczne {{PLURAL:$1|słowo|słowa|słowa}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Ukryta kategoria|Ukryte kategorie|Ukryte kategorie}} ($1)',
+'pageinfo-templates' => 'Transkludowan{{PLURAL:$1|y szablon|e szablony}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Standardowa',
@@ -3856,12 +3904,12 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 
 # Special:SpecialPages
 'specialpages' => 'Strony specjalne',
-'specialpages-note' => '* Typowe strony specjalne.
-* <span class="mw-specialpagerestricted">Strony specjalne o ograniczonym dostępie.</span>
-* <span class="mw-specialpagecached">Buforowane strony specjalne (mogą być nieaktualne).</span>',
+'specialpages-note' => '----
+* Normalne strony specjalne.
+* <span class="mw-specialpagerestricted">Zastrzeżone strony specjalne.</span>',
 'specialpages-group-maintenance' => 'Raporty konserwacyjne',
 'specialpages-group-other' => 'Inne strony specjalne',
-'specialpages-group-login' => 'Logowanie i rejestracja',
+'specialpages-group-login' => 'Zaloguj się / utwórz konto',
 'specialpages-group-changes' => 'Ostatnie zmiany i rejestry',
 'specialpages-group-media' => 'Pliki',
 'specialpages-group-users' => 'Użytkownicy i uprawnienia',
@@ -3991,13 +4039,16 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
 'api-error-duplicate' => '{{PLURAL:$1|Jest już [$2 inny plik]|Są już [$2 inne pliki]}} o tej samej zawartości',
 'api-error-duplicate-archive' => '{{PLURAL:$1|Był już [$2 inny plik]|Były już [$2 inne pliki]}} o takiej samej zawartości, ale {{PLURAL:$1|został usunięty|zostały usunięte}}.',
 'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Zdublowany plik, który został już usunięty|Zdublowane pliki, które zostały już usunięte}}',
-'api-error-duplicate-popup-title' => '{{PLURAL:$1|Zdublowany plik|Zdublowane plik}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Zdublowany plik|Zdublowane pliki}}',
 'api-error-empty-file' => 'Przesłany przez Ciebie plik jest pusty.',
 'api-error-emptypage' => 'Tworzenie nowych, pustych stron jest niedozwolone.',
 'api-error-fetchfileerror' => 'Błąd wewnętrzny – wystąpił błąd w trakcie pobierania pliku.',
+'api-error-fileexists-forbidden' => 'Plik o nazwie "$1" już istnieje i nie może być nadpisany.',
+'api-error-fileexists-shared-forbidden' => 'Plik o nazwie "$1" już istnieje we współdzielonym repozytorium i nie może być nadpisany.',
 'api-error-file-too-large' => 'Przesłany przez Ciebie plik jest zbyt duży.',
 'api-error-filename-tooshort' => 'Nazwa pliku jest zbyt krótka.',
 'api-error-filetype-banned' => 'Zabroniony format pliku.',
+'api-error-filetype-banned-type' => '$1 nie {{PLURAL:$4|jest dozwolonym typem pliku|są dozwolonymi typami plików}}. Dopuszczalne są pliki w {{PLURAL:$3|formacie|formatach}} $2.',
 'api-error-filetype-missing' => 'Brak rozszerzenia w nazwie pliku.',
 'api-error-hookaborted' => 'Zmiana, którą próbowałeś wykonać została przerwana przez hak rozszerzenia.',
 'api-error-http' => 'Błąd wewnętrzny – brak połączenia z serwerem.',
index 2c95a9d..da95401 100644 (file)
@@ -48,7 +48,7 @@ $messages = array(
 'tog-hidepatrolled' => "Stërma le modìfiche verificà ant j'ùltime modìfiche",
 'tog-newpageshidepatrolled' => 'Stërma le pàgine verificà da la lista dle pàgine neuve',
 'tog-extendwatchlist' => 'Slarga la funsion "ten sot euj" an manera che a la smon-a tute le modìfiche, nen mach l\'ùltima',
-'tog-usenewrc' => "Deuvra j'ùltime modìfiche an bela forma (a-i va JavaScript)",
+'tog-usenewrc' => "Deuvra j'ùltime modìfiche ameliorà (a-i và JavaScript)",
 'tog-numberheadings' => 'Tìtoj ëd paràgraf<br />che as nùmero daspërlor',
 'tog-showtoolbar' => "Mostra la bara dj'utiss (a-i va Javascript)",
 'tog-editondblclick' => "Dobia sgnacà për modifiché l'artìcol<br />(a-i va JavaScript)",
@@ -56,17 +56,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Abilité la modìfica dle session ën sgnacand-je ansima<br />  al tìtol col tast drit dël rat (a-i va Javascript)',
 'tog-showtoc' => "Buta le tàole dij contnù<br />(për j'artìcoj che l'han pì che 3 session)",
 'tog-rememberpassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di|di}})",
-'tog-watchcreations' => 'Gionta le pàgine che i creo mi a la lista ëd lòn che im ten-o sot euj',
+'tog-watchcreations' => "Gionta le pàgine che i creo mi e j'archivi che i cario mi a la lista ëd lòn che im ten-o sot euj",
 'tog-watchdefault' => "Gionta le pàgine che i modìfico mi a la lista dle ròbe ch'i ten-o sot-euj",
-'tog-watchmoves' => 'Gionta le pàgine che i tramudo a lòn che im ten-o sot euj',
-'tog-watchdeletion' => 'Gionta le pàgine che i scancelo via a la lista ëd lòn che im ten-o sot euj',
+'tog-watchmoves' => "Gionta le pàgine e j'archivi che i tramudo a lòn che im ten-o sot euj",
+'tog-watchdeletion' => "Gionta le pàgine e j'archivi che i scancelo via a la lista ëd lòn che im ten-o sot euj",
 'tog-minordefault' => 'Marca tute le modìfice coma cite<br />(mach coma predefinission dla casela)',
 'tog-previewontop' => 'Smon-e la preuva dzora al quàder ëd modìfica dël test e nen sota',
 'tog-previewonfirst' => 'Smon na preuva la prima vira che as fa na modìfica',
 'tog-nocache' => 'Disabilité la memòria local ëd le pàgine dël navigador',
-'tog-enotifwatchlistpages' => "Mand-me un messagi an pòsta eletrònica quand a-i son dle modìfiche a le pàgine ch'im ten-o sot euj",
+'tog-enotifwatchlistpages' => "Mandeme un mëssagi an pòsta eletrònica quand a-i son dle modìfiche a le pàgine ch'im ten-o sot euj",
 'tog-enotifusertalkpages' => 'Mand-me un messagi ëd pòsta eletrònica quand a-i son dle modìfiche a mia pàgina dle ciaciarade',
-'tog-enotifminoredits' => 'Mand-me un messagi an pòsta eletrònica bele che për le modìfiche cite',
+'tog-enotifminoredits' => "Mandeme un mëssagi an pòsta eletrònica bele che për le modìfiche cite dle pàgine o dj'archivi",
 'tog-enotifrevealaddr' => 'Lassa che a së s-ciàira mia adrëssa ëd pòsta eletrònica ant ij messagi ëd notìfica',
 'tog-shownumberswatching' => "Smon ël nùmer d'utent che as ten-o la pàgina sot euj",
 'tog-oldsig' => 'Firma esistenta:',
@@ -82,7 +82,6 @@ $messages = array(
 '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-nolangconversion' => 'Fërma la conversion antra variant lenghìstiche',
 '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à',
@@ -306,6 +305,10 @@ $1",
 'youhavenewmessages' => "A l'ha $1 ($2).",
 'newmessageslink' => 'mëssagi neuv',
 'newmessagesdifflink' => "A-i é chèich-còs ëd diferent da 'nt l'ùltima revision",
+'youhavenewmessagesfromusers' => "It l'has $1 da {{PLURAL:$3|n'autr utent|$3 utent}} ($2).",
+'youhavenewmessagesmanyusers' => "A l'ha $1 da vàire utent ($2).",
+'newmessageslinkplural' => '{{PLURAL:$1|un mëssagi neuv|$1 mëssagi neuv}}',
+'newmessagesdifflinkplural' => 'ùltime {{PLURAL:$1|modìfica|modìfiche}}',
 'youhavenewmessagesmulti' => "A l'ha dij neuv mëssagi an $1",
 'editsection' => 'modìfica',
 'editold' => 'modìfica',
@@ -357,12 +360,12 @@ Na lista ëd pàgine speciaj bon-e a peul esse trovà ambelessì [[Special:Speci
 # General errors
 'error' => 'Eror',
 'databaseerror' => 'Eror ant la base dat',
-'dberrortext' => 'A l\'é capitaje n\'eror ëd sintassi ant la domanda mandà a la base dat.
-Sòn a peul vorèj dì n\'eror ant ël programa.
-L\'ùltima domanda mandà a la base dat a l\'é stàita:
+'dberrortext' => "A l'é capitaje n'eror ëd sintassi ant la domanda mandà a la base dij dat.
+Sòn a peul vorèj dì n'eror ant ël programa.
+L'ùltima arcesta mandà a la base dij dat a l'é stàita:
 <blockquote><tt>$1</tt></blockquote>
-da \'nt la funsion "<tt>$2</tt>".
-La base dat a l\'ha dane andré n\'eror "<tt>$3: $4</tt>".',
+da 'nt la funsion «<tt>$2</tt>».
+La base dij dat a l'ha dàit n'eror «<tt>$3: $4</tt>».",
 'dberrortextcl' => 'A-i é staje n\'eror ant la sintassi d\'anterogassion dla base dat.
 L\'ùltima anterogassion a l\'é stàita:
 "$1"
@@ -399,6 +402,8 @@ Për piasì, fa rapòrt a n'[[Special:ListUsers/sysop|aministrator]], pijand nò
 'cannotdelete' => "La pàgina o l'archivi \"\$1\" a peul pa esse scancelà.
 Peul desse ch'a l'é già stàit ëscancelà da cheidun d'àutr.",
 'cannotdelete-title' => 'A peul pa scancelesse la pàgina «$1»',
+'delete-hook-aborted' => "Modìfica anulà da n'estension.
+A l'ha smonù gnun-e spiegassion.",
 'badtitle' => 'Tìtol nen giust',
 'badtitletext' => "La pàgina che a l'ha ciamà a peul pa esse mostrà. A podrìa tratesse ëd na pàgina nen bon-a, veujda, ò pura a podrìa ëdcò esse n'eror ant n'anliura antra lenghe diferente ò tra diferente version ëd {{SITENAME}}.",
 'perfcached' => "Ij dat sì-dapress a sòn ëstàit memorisà an local e a peulo esse nen agiornà. Al pi {{PLURAL:$1|n'arzultà a l'é disponìbil|$1 arzultà a son disponìbij}} ant la memòria local.",
@@ -429,6 +434,8 @@ Coma rason a l'ha butà: ''$2''.",
 L'aministrator ch'a l'ha blocalo a l'ha lassà sta spiegassion: «$3».",
 'invalidtitle-knownnamespace' => 'Tìtol pa bon con spassi nominal "$2" e test "$3"',
 'invalidtitle-unknownnamespace' => 'Tìtol pa bon con spassi nominal sconossù nùmer $1 e test "$2"',
+'exception-nologin' => 'Nen rintrà ant ël sistema',
+'exception-nologin-text' => "Costa pàgina o assion a ciama ch'a sia rintrà an costa wiki.",
 
 # Virus scanner
 'virus-badscanner' => "Configurassion falà: antivìrus nen conossù: ''$1''",
@@ -449,6 +456,7 @@ Che as dësmentia pa ëd cambié ij [[Special:Preferences|"sò gust" an {{SITENA
 'remembermypassword' => "Vis-te mia ciav ansima a st'ordinator-sì (për al pi $1 {{PLURAL:$1|di|di}})",
 'securelogin-stick-https' => "Resté colegà an HTTPS apress d'esse intrà ant ël sistema",
 'yourdomainname' => 'Sò domini',
+'password-change-forbidden' => 'It peule pa cangé le ciav dzora a sta wiki-sì.',
 'externaldberror' => "Ò che a l'é rivaje n'eror d'autenticassion esterna, ò pura a l'é chiel (chila) che a l'é nen autorisà a agiornesse sò cont estern.",
 'login' => 'Rintré ant ël sistema',
 'nav-login-createaccount' => 'rintré ant ël sistema',
@@ -621,7 +629,7 @@ Ciav a temp: $2',
 # Edit pages
 'summary' => 'Resumé:',
 'subject' => 'Sogèt:',
-'minoredit' => "Costa-sì a l'é na modìfica cita",
+'minoredit' => "Costa a l'é na modìfica cita",
 'watchthis' => "Ten sot euj st'artìcol-sì",
 'savearticle' => 'Salva sta pàgina',
 'preview' => 'Preuva',
@@ -689,6 +697,9 @@ o purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} modìfiché la pàgina ades
 'noarticletext-nopermission' => 'Al moment a-i é pa gnun test an sta pàgina-sì.
 It peule [[Special:Search/{{PAGENAME}}|sërché sto tìtol ëd pàgina-sì]] an d\'àutre pàgine,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché j\'argistrassion colegà]</span>.',
+'missing-revision' => "La revision #\$1 dla pàgina ciamà \"{{PAGENAME}}\" a esist pa.
+
+Sòn a l'é normalment causà da l'andèje dapress a na vej liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scancelament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
 'userpage-userdoesnotexist' => 'Lë stranòm "<nowiki>$1</nowiki>" a l\'é pa registrà. Për piasì ch\'a varda se da bon a veul creé/modifiché sta pàgina.',
 'userpage-userdoesnotexist-view' => 'Ël cont utent "$1" a l\'é pa registrà.',
 'blocked-notice-logextract' => "S'utent a l'é al moment blocà.
@@ -814,6 +825,7 @@ Costi paràmeter a son stàit lassà fòra.",
 'expansion-depth-exceeded-warning' => "La pàgina a l'ha sorpassà la profondità d'espansion",
 'parser-unstrip-loop-warning' => 'Trovà un sicl nen dësmontàbil',
 'parser-unstrip-recursion-limit' => "Sorpassà ël lìmit d'arcorensa nen dësmontàbil: $1",
+'converter-manual-rule-error' => 'Eror trovà ant la régola ëd conversion manual ëd la lenga',
 
 # "Undo" feature
 'undo-success' => "Sta modìfica-sì as peul scancelesse. Për piasì, ch'a contròla ambelessì sota për esse sigur che a l'é pro lòn che a veul fé, e peuj ch'as salva lòn ch'a l'ha butà chiel/chila për finì dë scancelé la modìfica ch'a-i era.",
@@ -998,6 +1010,11 @@ Ch'a varda mach che a-i ven-a nen fòra un rabel ant la continuità stòrica.",
 'editundo' => "buta 'me ch'a l'era",
 'diff-multi' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} ëd {{PLURAL:$2|n'utent|$2 utent}} pa mostrà)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} da pi che $2 {{PLURAL:$2|n'utent|utent}} pa mostrà)",
+'difference-missing-revision' => "{{PLURAL:$2|Na revision|$2 revision}} dë sta diferensa ($1) a {{PLURAL:$2|l'é pa stàita|son pa stàite}} trovà.
+
+
+
+Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scanselament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
 
 # Search results
 'searchresults' => "Arzultà dl'arserca",
@@ -1268,6 +1285,7 @@ Costa anformassion a sarà pùblica.",
 'right-writeapi' => "Dovré l'API dë scritura",
 'right-delete' => 'Scancelé dle pàgine',
 'right-bigdelete' => 'Scancelé dle pàgine con na stòria longa',
+'right-deletelogentry' => 'Scancelé e ripristiné dle vos ëd registr specìfiche',
 'right-deleterevision' => 'Scancelé e disdëscancelé na version ëspessìfica ëd na pàgina',
 'right-deletedhistory' => 'Vardé le revision ëscancelà ëd la stòria, sensa sò test',
 'right-deletedtext' => 'Vëdde ël test ëscancelà e le modìfiche antra le revision ëscancelà',
@@ -1412,9 +1430,9 @@ Le pàgine dzora a [[Special:Watchlist|la lista ëd lòn ch'as ten sot-euj]] a r
 Për vardé ò sërché dle figure già carià, ch'a vada an sla [[Special:FileList|lista dle figure]], ij (ri)càrich a son ëdcò registrà ant ël [[Special:Log/upload|registr dij càrich]], jë scancelament ant ël [[Special:Log/delete|registr djë scancelament]].
 
 Për buté na figura ant n'artìcol, dovré n'anliura ant un-a dle forme sì sota:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' për dovré la version pien-a dla figura
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' për dovré na dimension ëd 200 pontin ant un quàder a la bordura snistra con 'alt text' com descrission
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' për coleghé diretament la figura sensa fé vëdde l'archivi",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' për dovré la version pien-a dla figura
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' për dovré na dimension ëd 200 pontin ant un quàder a la bordura snistra con 'alt text' com descrission
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' për coleghé diretament la figura sensa fé vëdde l'archivi",
 'upload-permitted' => "Sòrt d'archivi consentìe: $1.",
 'upload-preferred' => "Sòrt d'archivi preferìe: $1.",
 'upload-prohibited' => "Sòrt d'archivi proibìe: $1.",
@@ -1460,20 +1478,20 @@ Beiché la [[Special:NewFiles|galarìa dj'archivi neuv]] për na presentassion p
 Sòn a podrìa esse rivà përchè che chiel a l'ha scrivù mal ël nòm dl'archivi midem.
 Për piasì che a contròla se a l'é pro cost l'archivi che a veul carié.",
 'windows-nonascii-filename' => "Sta wiki-sì a manten pa ij nòm d'archivi con caràter speciaj.",
-'fileexists' => "N'archivi con ës nòm-sì a-i é già, për piasì che a contròla '''<tt>[[:$1]]</tt>''' se a l'é pa sigur dë vorèj cangelo.
+'fileexists' => "N'archivi con ës nòm-sì a-i é già, për piasì che a contròla <strong>[[:$1]]</strong> se a l'é pa sigur dë vorèj cangelo.
 [[$1|thumb]]",
-'filepageexists' => "La pàgina ëd descrission për st'archivi-sì a l'é già stàita creà an '''<tt>[[:$1]]</tt>''', mach ch'a-i é gnun archivi ch'as ciama parèj.
+'filepageexists' => "La pàgina ëd descrission për st'archivi-sì a l'é già stàita creà an <strong>[[:$1]]</strong>, mach ch'a-i é gnun archivi ch'as ciama parèj.
 Lòn ch'a buta për somari as ës-ciairerà nen ant la pàgina ëd descrission.
 Për podèj buté sò somari a l'ha da modifichesse la pàgina a man.
 [[$1|thumb]]",
 'fileexists-extension' => "N'archivi con ës nòm-sì a-i é già: [[$2|thumb]]
-* Nòm dl'archivi ch'as carìa: '''<tt>[[:$1]]</tt>'''
-* Nòm dl'archivi ch'a-i é già: '''<tt>[[:$2]]</tt>'''
+* Nòm dl'archivi ch'as carìa: <strong>[[:$1]]</strong>
+* Nòm dl'archivi ch'a-i é già: <strong>[[:$2]]</strong>
 Për piasì, ch'a serna un nòm diferent.",
 'fileexists-thumbnail-yes' => "L'archivi a jë smija a na ''figurin-a''. [[$1|thumb]]
-Për piasì, ch'a contròla l'archivi '''<tt>[[:$1]]</tt>'''.
+Për piasì, ch'a contròla l'archivi <strong>[[:$1]]</strong>.
 S'a l'é la midema figura a amzura pijn-a, a veul dì ch'a fa nen dë manca dë carié na figurin-a.",
-'file-thumbnail-no' => "Ël nòm dl'archivi as anandia con '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Ël nòm dl'archivi as anandia con <strong>$1</strong>.
 A jë smija a na ''figurin-a''.
 Se a l'ha na figura a amzura pijn-a a l'é mej ch'a carìa cola-lì, dësnò ch'a-j cangia nòm a l'archivi, për piasì.",
 'fileexists-forbidden' => "Belavans n'archivi con ës nòm-sì a-i é già, donca ël nòm as peul pa pì dovresse.
@@ -1584,6 +1602,7 @@ Se a-i riva sossì n'àotra vira, ch'as buta an comunicassion con n'[[Special:Li
 'lockmanager-fail-releaselock' => 'As peul pa gavé la saradura për «$1».',
 'lockmanager-fail-db-bucket' => 'As peul pa contatesse a basta ëd base ëd dàit ëd saradura ant ël sëstin $1.',
 'lockmanager-fail-db-release' => 'As peulo pa gavesse le saradure an sla base ëd dàit $1.',
+'lockmanager-fail-svr-acquire' => 'As peul pa butesse le saradure an sël servent $1.',
 'lockmanager-fail-svr-release' => 'As peulo pa arlassesse le saradure an sël servent $1.',
 
 # ZipDirectoryReader
@@ -1701,6 +1720,7 @@ Peul desse ch'a veula modifiché la descrission dzora soa [pàgina ëd descrissi
 'shared-repo-from' => 'da $1',
 'shared-repo' => "n'archivi condivis",
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
+'upload-disallowed-here' => 'Për maleur a peul pa rampiassé sta figura.',
 
 # File reversion
 'filerevert' => "Buté torna $1 tanme ch'a l'era",
@@ -1734,7 +1754,7 @@ Peul desse ch'a veula modifiché la descrission dzora soa [pàgina ëd descrissi
 
 # MIME search
 'mimesearch' => 'Arserca për sòrt MIME',
-'mimesearch-summary' => "Sta pàgina-sì a lassa filtré j'archivi për sòrt MIME. Buté: sòrt/sotasòrt, pr'es. <tt>image/jpeg</tt>.",
+'mimesearch-summary' => "Sta pàgina-sì a lassa filtré j'archivi për sòrt MIME. Buté: sòrt/sotasòrt, pr'es. <code>image/jpeg</code>.",
 'mimetype' => 'Sòrt MIME:',
 'download' => 'dëscarié',
 
@@ -1781,8 +1801,9 @@ Ch'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che
 
 'disambiguations' => "Pàgine ch'a men-o vers dle pàgine d'omonimìe",
 'disambiguationspage' => "Template:Gestion dj'omonimìe",
-'disambiguations-text' => "Ste pàgine-sì a men-o a na '''pàgina ëd gestion dj'omònim''', mach che a dovrìo ëmné bele drit a n'artìcol.<br />
-Na pàgina as trata coma \"pàgina ëd gestion dj'omònim\" se a deuvra në stamp dont l'anliura as treuva ant ël [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Ste pàgine-sì a men-o a na '''pàgina ëd gestion dj'omònim'''.
+Mach che a dovrìo ëmné bele drit a n'artìcol.<br />
+Na pàgina as trata coma pàgina ëd gestion dj'omònim se a deuvra në stamp dont l'anliura as treuva ant ël [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Ridiression dobie',
 'doubleredirectstext' => "Sta pàgina-sì a a lista dle pàgine ch'a armando a d'àutre pàgine ëd ridiression.
@@ -1808,6 +1829,7 @@ Adess a l'é na ridiression a [[$2]].",
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categorìa|categorìe}}',
+'ninterwikis' => '$1 {{PLURAL:$1|antërwiki|antërwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|anliura|anliure}}',
 'nmembers' => '$1 {{PLURAL:$1|element|element}}',
 'nrevisions' => '{{PLURAL:$1|na revision|$1 revision}}',
@@ -1836,6 +1858,7 @@ Adess a l'é na ridiression a [[$2]].",
 'mostlinkedtemplates' => 'Stamp pì dovrà',
 'mostcategories' => 'Artìcoj che a son marcà an pì categorìe',
 'mostimages' => 'Figure pì dovrà',
+'mostinterwikis' => "Pàgine con pi 'd liure antërwiki",
 'mostrevisions' => 'Artìcoj pì modificà',
 'prefixindex' => "Tute le pàgine ch'a ancamin-o con",
 'prefixindex-namespace' => 'Tute le pàgine con prefiss ($1 spassi nominal)',
@@ -1935,7 +1958,7 @@ Ch'a bèica ëdcò [[Special:WantedCategories|le categorìe domandà]].",
 'linksearch-ok' => 'Sërché',
 'linksearch-text' => 'As peulo dovresse dij ciapatut com "*.wikipedia.org".
 A-i é dabzògn almanch d\'un domini a livel pi àut, për esempi "*.org".<br />
-Protocòj ch\'as peulo dovresse: <tt>$1</tt> (ch\'a gionta gnun ëd costi an soa arserca).',
+Protocòj ch\'as peulo dovresse: <code>$1</code> (ch\'a gionta gnun ëd costi an soa arserca).',
 'linksearch-line' => "$1 a l'ha n'anliura ch'a-j riva dzora da $2",
 'linksearch-error' => 'Ij ciapatut as peulo butesse mach an prinsipi dël nòm dël sërvent.',
 
@@ -1982,6 +2005,8 @@ A peulo ess-ie d'[[{{MediaWiki:Listgrouprights-helppage}}|anformassion adissiona
 'mailnologintext' => "A dev [[Special:UserLogin|rintré ant ël sistema]]
 e avèj registrà n'adrëssa ëd pòsta eletrònica vàlida ant ij [[Special:Preferences|sò gust]] për podèj mandé dij mëssagi ëd pòsta eletrònica a j'àutri Utent.",
 'emailuser' => "Mandeje un mëssagi eletrònich a st'utent-sì",
+'emailuser-title-target' => 'Mandé un mëssagi ëd pòsta eletrònica a cost {{GENDER:$1|utent}}',
+'emailuser-title-notarget' => "Mandeje un mëssagi ëd pòsta eletrònica a st'utent-sì",
 'emailpage' => "Mandeje un mëssagi ëd pòsta eletrònica a st'utent-sì",
 'emailpagetext' => "A peule dovré ël formolari sì-sota për mandé un mëssagi ëd pòsta eletrònica a st'utent-sì.
 L'adrëssa ëd pòsta eletrònica ch'a l'ha butà ant ij [[Special:Preferences|Ij sò gust]] a sarà butà ant l'adrëssa «Da» ëd sò mëssagi, parèj chi ch'a l'arsèiv a podrà rësponde diretament a chiel.",
@@ -2127,6 +2152,8 @@ ch'a daga da ment a lòn ch'a fa.",
 'rollback' => 'Gavé via le modìfiche',
 'rollback_short' => 'Ripristiné',
 'rollbacklink' => "ripristiné j'archivi",
+'rollbacklinkcount' => 'tiré andré $1 {{PLURAL:$1|modìfica|modìfiche}}',
+'rollbacklinkcount-morethan' => 'tiré andré pi che $1 {{PLURAL:$1|modìfica|modìfiche}}',
 'rollbackfailed' => "A l'é pa podusse ripristiné",
 'cantrollback' => "As peul pa tornesse a na version pì veja: l'ùltima modìfica a l'ha fala l'ùnich utent che a l'abia travajà a cost artìcol-sì.",
 'alreadyrolled' => "As peulo pa anulé j'ultime modìfiche ëd [[:$1]] fàite da [[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2618,12 +2645,13 @@ Për piasì, ch'a vìsita la [//www.mediawiki.org/wiki/Localisation Localisassio
 'import-interwiki-text' => "Che a selession-a na wiki e ël tìtol dla pàgina da amporté.
 Date dle revision e stranòm dj'editor a resteran piàjit sù 'cò lor.
 Tute j'amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/import|Registr dj'amportassion]].",
-'import-interwiki-source' => 'Sorziss wiki/pàgina:',
-'import-interwiki-history' => 'Còpia tute le version stòriche dë sta pàgina-sì',
-'import-interwiki-templates' => 'Ansëriss tùit jë stamp',
+'import-interwiki-source' => 'Wiki e pàgina sorgiss:',
+'import-interwiki-history' => 'Copié tute le revision ëd la stòria ëd costa pàgina',
+'import-interwiki-templates' => 'Anserì tùit jë stamp',
 'import-interwiki-submit' => 'Amporté',
 'import-interwiki-namespace' => 'Spassi nominal ëd destinassion:',
-'import-upload-filename' => 'Nòm dël file:',
+'import-interwiki-rootpage' => 'Pàgina prinsipal ëd destinassion (opsional):',
+'import-upload-filename' => "Nòm ëd l'archivi:",
 'import-comment' => 'Oget:',
 'importtext' => "Për piasì, che as espòrta l'archivi da 'nt la sorgiss wiki ën dovrand l'[[Special:Export|utiss d'esportassion]]. 
 Che as lo salva ansima a sò ordinator e peui che a lo caria ambelessì.",
@@ -2634,99 +2662,103 @@ Che as lo salva ansima a sò ordinator e peui che a lo caria ambelessì.",
 'importfailed' => 'Amportassion falìa: $1',
 'importunknownsource' => "Sorgiss d'amportassion ëd na sòrt nen conossùa",
 'importcantopen' => "L'archivi da amporté a l'é pa podusse deurbe",
-'importbadinterwiki' => 'Anliura antra wiki diferente malfaita',
-'importnotext' => 'Veujd ò sensa pa gnun test',
-'importsuccess' => 'Amportassion andaita a bon fin!',
-'importhistoryconflict' => "A-i son dle stòrie dë sta pàgina-sì che as contradisso un-a con l'àutra (a peul esse che sta pàgina-sì a l'avèissa già amportala)",
-'importnosources' => "A l'é pa staita definìa gnun-a sorgiss d'amportassion da na wiki diferenta, e carié mach le stòrie as peul nen.",
+'importbadinterwiki' => 'Liura antra wiki diferente cioca',
+'importnotext' => 'Veujd o con gnun test',
+'importsuccess' => 'Amportassion finìa!',
+'importhistoryconflict' => "A-i son dle stòrie dë sta pàgina-sì che as contradiso un-a con l'àutra (a peul esse che sta pàgina-sì a l'avèissa già amportala)",
+'importnosources' => "A l'é pa stàita definìa gnun-a sorgiss d'amportassion da na wiki diferenta, e carié mach le stòrie as peul nen.",
 'importnofile' => "Pa gnun archivi d'amportassion carià.",
 'importuploaderrorsize' => "A l'é falìe la caria dl'archivi d'amporté. L'archivi a resta pì gròss che lòn ch'as peul cariesse.",
 'importuploaderrorpartial' => "A l'é falìe la caria dl'archivi d'amporté. L'archivi a resta carià mach për un tòch.",
 'importuploaderrortemp' => "A l'é falìe la caria dl'archivi d'amporté. A-i manca un dossié provisòri.",
 'import-parse-failure' => "Eror dë scomposission XML ant l'amportassion",
 'import-noarticle' => "Pa gnun-a pàgina d'amporté.",
-'import-nonewrevisions' => "Tute le revision a l'ero già stàite amportà.",
+'import-nonewrevisions' => "Tute le revision a j'ero già stàite amportà.",
 'xml-error-string' => '$1 ant la riga $2, colòna $3 (byte $4): $5',
-'import-upload' => 'Carìa dat XML',
-'import-token-mismatch' => 'Perdù ij dat ëd session.
-Për piasì preuva torna.',
+'import-upload' => 'Cariament ëd dat XML',
+'import-token-mismatch' => "Pèrdita dij dat ëd session.
+Për piasì, ch'a preuva torna.",
 'import-invalid-interwiki' => 'As peul pa amportesse da la wiki spessificà.',
-'import-error-edit' => "La pàgina «$1» a l'é pa amportà përchè a peul pa modifichela.",
-'import-error-create' => "La pàgina «$1» a l'é pa amportà përchè a peul pa creela.",
-'import-error-interwiki' => 'La pàgina "$1" a l\'é pa amportà përchè sò nòm a l\'é arzervà për na liura esterna (antërwiki).',
-'import-error-special' => 'La pàgina "$1" a l\'é pa amportà përchè a ponta a në spassi nominal ch\'a përmët pa dle pàgine.',
+'import-error-edit' => "La pàgina «$1» a l'é pa stàita amportà përchè chiel a peul pa modifichela.",
+'import-error-create' => "La pàgina «$1» a l'é pa stàita amportà përchè chiel a peul pa creela.",
+'import-error-interwiki' => "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é arzervà për na liura esterna (antërwiki).",
+'import-error-special' => "La pàgina «$1» a l'é pa amportà përchè a ponta a në spassi nominal ch'a përmët pa dle pàgine.",
 'import-error-invalid' => "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é pa bon.",
+'import-options-wrong' => '{{PLURAL:$2|Opsion|Opsion}} sbalià: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => "La pàgina prinsipal dàita a l'é un tìtol pa bon.",
+'import-rootpage-nosubpage' => 'Lë spassi nominal «$1» ëd la pàgina prinsipal a përmët pa dle sot-pagine.',
 
 # Import log
 'importlogpage' => "Registr dj'amportassion",
 'importlogpagetext' => "Amportassion aministrative ëd pàgine e ëd soa stòria da dj'àutre wiki.",
-'import-logentry-upload' => "amportà [[$1]] con un càrich d'archivi",
+'import-logentry-upload' => "a l'ha amportà [[$1]] con un càrich d'archivi",
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|revision|revision}}',
 'import-logentry-interwiki' => "Amportà da n'àutra wiki $1",
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revision|revision}} da $2',
 
 # JavaScriptTest
 'javascripttest' => 'Preuva ëd JavaScript',
-'javascripttest-disabled' => "Sta funsion-sì a l'é pa stàita abilità dzora sta wiki-sì.",
+'javascripttest-disabled' => "Sta funsion-sì a l'é pa stàita abilità ansima a costa wiki.",
 'javascripttest-title' => 'Fé dle preuve $1',
 'javascripttest-pagetext-noframework' => "Costa pàgina a l'é arservà për fé dle preuve JavaScript.",
-'javascripttest-pagetext-unknownframework' => 'Utiss ëd preuva pa conossù "$1".',
-'javascripttest-pagetext-frameworks' => "Për piasì, ch'a serna un-a dle struture ëd test sì-dapress: $1",
+'javascripttest-pagetext-unknownframework' => 'Strutura ëd preuva pa conossùa «$1».',
+'javascripttest-pagetext-frameworks' => "Për piasì, ch'a serna un-a dle struture ëd preuva sì-dapress: $1",
 'javascripttest-pagetext-skins' => "Ch'a serna na pel për fé le preuve:",
-'javascripttest-qunit-intro' => 'Varda [$1 la documentassion dle preuve] dzora a mediawiki.org.',
+'javascripttest-qunit-intro' => 'Vëdde [$1 la documentassion dle preuve] dzora a mediawiki.org.',
 'javascripttest-qunit-heading' => 'Sequensa ëd preuve QUnit ëd JavaScript su MediaWiki',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Toa pàgina utent',
-'tooltip-pt-anonuserpage' => 'Pàgina Utent për l',
-'tooltip-pt-mytalk' => 'Toa pàgina ëd discussion e ciaciarade.',
-'tooltip-pt-anontalk' => 'Pàgina ëd ciaciarade për l',
+'tooltip-pt-userpage' => 'Soa pàgina utent',
+'tooltip-pt-anonuserpage' => "La pàgina utent për l'IP con ël qual chiel a contribuiss",
+'tooltip-pt-mytalk' => 'Soa pàgina ëd discussion e ciaciarade',
+'tooltip-pt-anontalk' => 'La pàgina ëd ciaciarade an sle contribussion da costa adrëssa IP',
 'tooltip-pt-preferences' => 'Coma che i veuj mia {{SITENAME}}.',
 'tooltip-pt-watchlist' => 'Lista dle pàgine che chiel as ten sot euj.',
-'tooltip-pt-mycontris' => 'Lista ëd toe contribussion',
-'tooltip-pt-login' => "Un a l'é nen obligà a rintré ant al sistema, ma se a lo fa a l",
-'tooltip-pt-anonlogin' => "Un a l'é nen obligà a rintré ant al sistema, ma se a lo fa a l",
+'tooltip-pt-mycontris' => 'Lista ëd soe contribussion',
+'tooltip-pt-login' => "Un a l'é nen obligà a rintré ant al sistema, ma se a lo fa a l'é mej",
+'tooltip-pt-anonlogin' => "Un a l'é nen obligà a rintré ant al sistema, ma se a lo fa a l'é mej",
 'tooltip-pt-logout' => 'Seurte da',
 'tooltip-ca-talk' => 'Discussion ansima a sta pàgina ëd contnù.',
-'tooltip-ca-edit' => 'Modifiché sta pàgina-sì. Për piasì, che as fasa na preuva anans che salvé .',
-'tooltip-ca-addsection' => 'Ancamin-a na neuva session',
-'tooltip-ca-viewsource' => 'Sta pàgina-sì a l',
+'tooltip-ca-edit' => 'A peul modifiché sa pàgina-sì. Për piasì, che as fasa na preuva anans che salvé.',
+'tooltip-ca-addsection' => 'Ancaminé na neuva session',
+'tooltip-ca-viewsource' => "Sta pàgina-sì a l'é protegiùa.
+A peul visualisene la sorgiss",
 'tooltip-ca-history' => 'Veje version dla pàgina.',
-'tooltip-ca-protect' => 'Për protege sta pàgina-sì.',
+'tooltip-ca-protect' => 'Protege costa pàgina',
 'tooltip-ca-unprotect' => 'Cangé la protession ëd costa pàgina-sì',
 'tooltip-ca-delete' => 'Scancelé sta pàgina-sì',
-'tooltip-ca-undelete' => 'Pijé andré le modìfiche faite a sta pàgina-sì, anans che a fussa scancelà.',
-'tooltip-ca-move' => 'Tramudé sta pàgina, visadì cangeje tìtol.',
+'tooltip-ca-undelete' => 'Pijé andré le modìfiche fàite a sta pàgina-sì, anans che a fussa scancelà.',
+'tooltip-ca-move' => "Tramudé sta pàgina, visadì cangeje 'd tìtol.",
 'tooltip-ca-watch' => 'Gionté sta pàgina-sì a la lista dle ròbe che as ten-o sot euj.',
 'tooltip-ca-unwatch' => 'Gavé via sta pàgina da',
-'tooltip-search' => 'Sërca an {{SITENAME}}',
-'tooltip-search-go' => "Andé a na pàgina ch'as ciama parej, sempe ch'a-i në sia un-a",
+'tooltip-search' => 'Sërc an {{SITENAME}}',
+'tooltip-search-go' => "Andé a na pàgina ch'as ciama parèj, sempe ch'a-i në sia un-a",
 'tooltip-search-fulltext' => 'Sërché ës test-sì antra le pàgine dël sit',
 'tooltip-p-logo' => 'Pàgina prinsipal.',
 'tooltip-n-mainpage' => 'Visité la pàgina prinsipal.',
-'tooltip-n-mainpage-description' => 'Vìsita la pàgina prinsipal',
+'tooltip-n-mainpage-description' => "Andé a la pàgina d'intrada",
 'tooltip-n-portal' => 'Rësguard al proget, lòn che a peul fé, andoa trové còsa.',
 'tooltip-n-currentevents' => 'Informassion ansima a lòn che a-i riva.',
-'tooltip-n-recentchanges' => 'Lista dj',
+'tooltip-n-recentchanges' => "Lista dj'ùltime modìfiche an sla wiki",
 'tooltip-n-randompage' => 'Carié na pàgina basta che a sia.',
 'tooltip-n-help' => 'Ël pòst për capì.',
 'tooltip-t-whatlinkshere' => 'Lista ëd tute le pàgine dla wiki che a men-o ambelessì.',
 'tooltip-t-recentchangeslinked' => 'Ùltime modìfiche dle pàgine andoa as peul andesse da costa.',
-'tooltip-feed-rss' => 'RSS feed për sta pàgina-sì.',
-'tooltip-feed-atom' => 'Atom feed për sta pàgina-sì.',
-'tooltip-t-contributions' => 'Vardé la lista dle contribussion dë st',
-'tooltip-t-emailuser' => 'Mandeje un messagi ëd pòsta a st',
-'tooltip-t-upload' => 'Carié archivi ëd figure ò son.',
+'tooltip-feed-rss' => 'Fluss RSS për costa pàgina',
+'tooltip-feed-atom' => 'Fluss Atom për costa pàgina.',
+'tooltip-t-contributions' => 'Vardé la lista dle contribussion ëd cost utent',
+'tooltip-t-emailuser' => "Mandeje un mëssagi ëd pòsta a st'utent",
+'tooltip-t-upload' => "Carié n'archivi ëd figure ò son.",
 'tooltip-t-specialpages' => 'Lista ëd tute le pàgine speciaj.',
 'tooltip-t-print' => 'Version bon-a da stampé dë sta pàgina',
-'tooltip-t-permalink' => 'Anliura fissa a sta version-i dla pàgina',
+'tooltip-t-permalink' => 'Anliura fissa a sta version- dla pàgina',
 'tooltip-ca-nstab-main' => 'Vardé la pàgina ëd contnù.',
 'tooltip-ca-nstab-user' => 'Vardé la pàgina Utent.',
-'tooltip-ca-nstab-media' => 'Vardé la pàgina dl',
-'tooltip-ca-nstab-special' => 'Costa a l',
+'tooltip-ca-nstab-media' => 'Vardé la pàgina dël mojen',
+'tooltip-ca-nstab-special' => "Costa a l'é na pàgina special, a peul nen modifichela.",
 'tooltip-ca-nstab-project' => 'Vardé la pàgina proteta.',
-'tooltip-ca-nstab-image' => 'Vardé la pàgina dl',
-'tooltip-ca-nstab-mediawiki' => 'Vardé ël messagi ëd sistema.',
+'tooltip-ca-nstab-image' => "Vardé la pàgina dl'archivi",
+'tooltip-ca-nstab-mediawiki' => 'Vardé ël mëssagi ëd sistema.',
 'tooltip-ca-nstab-template' => 'Vardé lë stamp.',
 'tooltip-ca-nstab-help' => 'Vardé la pàgina d',
 'tooltip-ca-nstab-category' => 'Vardé la pàgina dla categorìa.',
@@ -2777,20 +2809,38 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'spambot_username' => 'MediaWiki - trigomiro che a-j dà deuit a la rumenta',
 'spam_reverting' => "Buta andaré a l'ùltima version che a l'avèissa pa andrinta dj'anliure a $1",
 'spam_blanking' => "Pàgina dësveujdà, che tute le version a l'avìo andrinta dj'anliure a $1",
-'spam_deleting' => 'Tute le revision a contenìo colegament a $1, scanselé',
+'spam_deleting' => 'Tute le revision a contnisìo dle liure a $1, scancelament',
 
 # Info page
 'pageinfo-title' => 'Anformassion për "$1"',
+'pageinfo-header-basic' => 'Anformassion ëd base',
 'pageinfo-header-edits' => 'Modìfiche',
-'pageinfo-header-watchlist' => 'Ròba che as ten sot euj',
-'pageinfo-header-views' => 'Vìsite',
-'pageinfo-subjectpage' => 'Pàgina',
-'pageinfo-talkpage' => 'Pàgina ëd discussion',
+'pageinfo-header-restrictions' => 'Protession ëd la pàgina',
+'pageinfo-header-properties' => 'Proprietà ëd la pàgina',
+'pageinfo-display-title' => 'Tìtol visualisà',
+'pageinfo-default-sort' => "ciav d'ordinament për sòlit",
+'pageinfo-length' => 'Longheur ëd la pàgina (an byte)',
+'pageinfo-article-id' => 'Identificativ ëd la pàgina',
+'pageinfo-robot-policy' => "Stat dël motor d'arserca",
+'pageinfo-robot-index' => 'Indesàbil',
+'pageinfo-robot-noindex' => 'Nen indesàbil',
+'pageinfo-views' => 'Nùmer ëd vìsite',
 'pageinfo-watchers' => "Vàire ch'a ten-o sot-euj la pàgina",
+'pageinfo-redirects-name' => 'Ridiression a sta pàgina-sì',
+'pageinfo-subpages-name' => 'Sot-pàgine ëd costa pàgina',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ridiression|ridiression}}; $3 {{PLURAL:$3|nen ridiression|nen ridiression}})',
+'pageinfo-firstuser' => 'Creator ëd la pàgina',
+'pageinfo-firsttime' => 'Data ëd creassion ëd la pàgina',
+'pageinfo-lastuser' => 'Ùltim contributor',
+'pageinfo-lasttime' => "Data ëd l'ùltima modìfica",
 'pageinfo-edits' => 'Nùmer ëd modìfiche',
 'pageinfo-authors' => "Nùmer d'autor diferent",
-'pageinfo-views' => 'Nùmer ëd vìsite',
-'pageinfo-viewsperedit' => 'Visualisassion për modìfica',
+'pageinfo-recent-edits' => "Nùmer ëd modìfiche recente (ant j'ùltim $1)",
+'pageinfo-recent-authors' => "Nùmer d'autor diferent recent",
+'pageinfo-restriction' => 'Protession ëd la pàgina (<code>{{lcfirst:$1}}</code>)',
+'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)',
 
 # Patrolling
 'markaspatrolleddiff' => 'Marca coma verificà',
@@ -2834,6 +2884,7 @@ An fasend-lo travajé ansima a sò ordinator chiel a podrìa porteje ëd dann a
 'file-info-size-pages' => "$1 × $2 pontin, dimension ëd l'archivi: $3, sòrt MIME: $4, $5 {{PLURAL:$5|pàgina|pàgine}}",
 'file-nohires' => 'Gnun-a risolussion pì bela disponìbil.',
 'svg-long-desc' => "archivi an forma SVG, amzure nominaj $1 × $2 pixel, amzura dl'archivi: $3",
+'svg-long-desc-animated' => "Archivi SVG animà, dimension $1 × $2 pontin, amzura dl'archivi: $3",
 'show-big-image' => 'Version a amzura pijn-a',
 'show-big-image-preview' => 'Amzure dë sta preuva: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Àutra arzolussion|Àutre arzolussion}}: $1.',
@@ -2843,6 +2894,8 @@ An fasend-lo travajé ansima a sò ordinator chiel a podrìa porteje ëd dann a
 'file-info-png-looped' => 'an sìrcol',
 'file-info-png-repeat' => 'sonà $1 {{PLURAL:$1|vira|vire}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|quàder|quàder}}',
+'file-no-thumb-animation' => "'''Nòta: Për dle limitassion técniche, le miniadure ëd s'archivi a saran pa animà.'''",
+'file-no-thumb-animation-gif' => "'''Nòta: Për limitassion técniche, le miniadure ëd figure GIF a àuta arzolussion com costa a saran pa animà.'''",
 
 # Special:NewFiles
 'newimages' => 'Galerìa ëd figure e son neuv',
@@ -3110,7 +3163,7 @@ J'àutri a saran stërmà coma stàndard.
 
 'exif-subjectdistance-value' => '$1 méter',
 
-'exif-meteringmode-0' => 'as sa nen coma',
+'exif-meteringmode-0' => 'Pa conossù',
 'exif-meteringmode-1' => 'Media',
 'exif-meteringmode-2' => 'Media centrà',
 'exif-meteringmode-3' => 'Quadrèt (Spot)',
@@ -3119,7 +3172,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-meteringmode-6' => 'Parsial',
 'exif-meteringmode-255' => "n'àutr",
 
-'exif-lightsource-0' => 'Nen marcà',
+'exif-lightsource-0' => 'Pa conossù',
 'exif-lightsource-1' => 'Lus dël dì',
 'exif-lightsource-2' => 'Fluoressenta',
 'exif-lightsource-3' => 'Lus al tungsten (a incandessensa)',
@@ -3200,7 +3253,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-sharpness-1' => 'dossa',
 'exif-sharpness-2' => 'contrastà',
 
-'exif-subjectdistancerange-0' => 'Nen specificà',
+'exif-subjectdistancerange-0' => 'Pa conossù',
 'exif-subjectdistancerange-1' => 'Macro',
 'exif-subjectdistancerange-2' => 'Prim pian',
 'exif-subjectdistancerange-3' => 'Anquadratura a soget lontan',
@@ -3536,7 +3589,7 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
 * <span class="mw-specialpagecached">Pàgine speciaj mach an memòria local (a peulo esse veje).</span>',
 'specialpages-group-maintenance' => 'Rapòrt ëd manutension',
 'specialpages-group-other' => 'Àutre pàgine speciaj',
-'specialpages-group-login' => 'Login / registrassion',
+'specialpages-group-login' => 'Intré ant ël sistema / creé un cont',
 'specialpages-group-changes' => 'Ùltime modìfiche e registr',
 'specialpages-group-media' => 'Rapòrt dij file multimediaj e dle carie',
 'specialpages-group-users' => 'Utent e drit',
@@ -3670,9 +3723,12 @@ Dësnò, a peule dovré ël formlari semplificà sì-sota. Sò coment a sarà gi
 'api-error-empty-file' => "L'archivi ch'a l'ha mandà a l'era veuid.",
 'api-error-emptypage' => "La creassion ëd pagine neuve veujde a l'é pa përmëttùa.",
 'api-error-fetchfileerror' => "Eror antern: quaicòs a l'é andàit mal an mente as arcuperava l'archivi",
+'api-error-fileexists-forbidden' => "N'archivi con nòm «$1» a esist già, e a peul pa esse dzorascrivù.",
+'api-error-fileexists-shared-forbidden' => 'N\'archivi con nòm "$1" a esist già ant ël depòsit condivis ëd j\'archivi, e a peul pa esse dzorascrivù.',
 'api-error-file-too-large' => "L'archivi ch'a l'ha mandà a l'era tròp gròss.",
 'api-error-filename-tooshort' => "Ël nòm ëd l'archivi a l'é tròp curt.",
 'api-error-filetype-banned' => "Costa sòrt d'archivi a l'é proibìa.",
+'api-error-filetype-banned-type' => "$1 {{PLURAL:$4|a l'é na sòrt d'archivi proibìa|a son ëd sòrt d'archivi proibìe}}. {{PLURAL:$3|Sòrt d'archivi consentìa a l'é|Sòrt d'archivi consentìe a son}} $2.",
 'api-error-filetype-missing' => "L'archivi a l'é sensa estension.",
 'api-error-hookaborted' => "La modìfica ch'a l'ha provà a fé a l'é stàita blocà dal gancio ëd n'estension.",
 'api-error-http' => 'Eror antern: as peul pa coleghesse al sërvent.',
index 9212034..57d9886 100644 (file)
@@ -1376,9 +1376,9 @@ $1",
 
 اک فائل نوں اک صفے تے لیان لئی تھلے دتے گۓ فارم ورتو:
 
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' فائل دا پورا ورین ورتن لئی
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' 200 پکسل چوڑا ورتنا
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' سدا سدا فائل جوڑنا بنا فائل دسے",
+*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' فائل دا پورا ورین ورتن لئی
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 200 پکسل چوڑا ورتنا
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' سدا سدا فائل جوڑنا بنا فائل دسے",
 'upload-permitted' => 'جناں فائلاں دی اجازت اے: $1۔',
 'upload-preferred' => 'جیہڑیاں فائلاں دوجیاں نالوں ودیا: $1۔',
 'upload-prohibited' => 'روکیاں گیاں فائلاں: $1',
@@ -1426,22 +1426,22 @@ $1",
 اے ہوسکدا اے فائل ناں چ کسے ٹائپو توں ہووے۔
 مہربانی کرکے چیک کرو تسیں اصل چ ایس فائل نون چڑھاناں جاندے او؟',
 'windows-nonascii-filename' => 'اے وکی فائل ناں جناں چ کوئی خاص کیریکٹر ہووے سپورٹ نئیں کردا۔',
-'fileexists' => "اک فائل ایس ناں نال پہلے ای ہے مہربانی کرکے '''<tt>[[:$1]]</tt>'''  ویکھو
+'fileexists' => 'اک فائل ایس ناں نال پہلے ای ہے مہربانی کرکے <strong>[[:$1]]</strong>  ویکھو
 اگر تھانوں یقین نئیں اگ تسیں اینون بدلنا چاندے اوہ۔
-[[$1|thumb]]",
-'filepageexists' => "ایس فائل دا دسن والا صفہ پہلے ای '''<tt>[[:$1]]</tt>''' تے بنایا جاچکیا اے، پر این ناں دی کوئی فائل ایس ویلے نئیں ہیگی۔
+[[$1|thumb]]',
+'filepageexists' => 'ایس فائل دا دسن والا صفہ پہلے ای <strong>[[:$1]]</strong> تے بنایا جاچکیا اے، پر این ناں دی کوئی فائل ایس ویلے نئیں ہیگی۔
 سمری جیہڑی تسیں لکھو گے اوہ دسن والے صفے تے نئیں دسے گی۔
 اپنی سموری اوتھے دیکھن لئی توانوں اپنے ہتھیں اینون تبدیل کرنا پوے گا۔
-[[$1|thumb]]",
-'fileexists-extension' => "ایس ناں دی شائل ہیگی اے: [[$2|thumb]]
-* چڑھائی گئی فائل دا ناں: '''<tt>[[:$1]]</tt>'''
-* ہیگی فائل دا ناں: '''<tt>[[:$2]]</tt>'''
-مہربانی کرکے وکھرا ناں چنو.",
+[[$1|thumb]]',
+'fileexists-extension' => 'ایس ناں دی شائل ہیگی اے: [[$2|thumb]]
+* چڑھائی گئی فائل دا ناں: <strong>[[:$1]]</strong>
+* ہیگی فائل دا ناں: <strong>[[:$2]]</strong>
+مہربانی کرکے وکھرا ناں چنو.',
 'fileexists-thumbnail-yes' => "ایہ اک ناپ دی مورت دی فائل دسدی اے ''(تھمبنیل)''.
 [[$1|thumb]]
-مہربانی کرکے فائل ویکھو '''<tt>[[:$1]]</tt>'''.
+مہربانی کرکے فائل ویکھو <strong>[[:$1]]</strong>.
 اگر ویکھی فائل اوسے مورت دے اصل ناپ دی اے تے فیر ایہ ضروری نئیں جے اک فالتو تھمبنیل چڑھائی جاۓ۔.",
-'file-thumbnail-no' => "فائل ناں '''<tt>$1</tt>''' توں شروع ہوندا اے۔
+'file-thumbnail-no' => "فائل ناں <strong>$1</strong> توں شروع ہوندا اے۔
 اے اک نکے ناپ دی مورت لگدی اے ''(تھمبنیل)''۔
 اگر تواڈے کول ایہ مورت پورے وڈے ناپ چ اے تسیں اینوں چڑھا سکدے او، نئیں تے فیر ایس فائل دا ناں بدلو۔",
 'fileexists-forbidden' => 'ایس ناں دی فائل پہلے ای ہیگی اے تے اودے اتے نئیں لکھیا جاسکدا۔
@@ -1682,7 +1682,7 @@ $1",
 # MIME search
 'mimesearch' => 'MIME کھوج',
 'mimesearch-summary' => 'ایہ صفہ فاغلاں نوں اوناں دی مائم ٹائپ  لئی نتارا قابل کردا اے.
-انپٹ: contenttype/subtype, e.g. <tt>مورت/jpeg</tt>.',
+انپٹ: contenttype/subtype, e.g. <code>مورت/jpeg</code>.',
 'mimetype' => 'مائم ٹائپ',
 'download' => 'فائل کاپی کرو',
 
@@ -1877,7 +1877,7 @@ $1",
 'linksearch-ok' => 'کھوج',
 'linksearch-text' => 'وائلڈکارڈز جیویں کہ "*.wikipedia.org" ورتے جاسکدے نیں۔
 "*.org".<br /> دی لوڑ
-منے گۓ پروٹوکول: <tt>$1</tt>',
+منے گۓ پروٹوکول: <code>$1</code>',
 'linksearch-line' => '$1 نوں $2 نال جوڑیا',
 'linksearch-error' => 'وکیکارڈو میزبان دے ناں دے شروع چ دس سکدے نیں۔',
 
@@ -2724,15 +2724,10 @@ $1',
 # Info page
 'pageinfo-title' => '"$1" لئی جانکاری',
 'pageinfo-header-edits' => 'تبدیلیاں',
-'pageinfo-header-watchlist' => 'اکھ تھلے رکھی لسٹ',
-'pageinfo-header-views' => 'وکھالے',
-'pageinfo-subjectpage' => 'صفہ',
-'pageinfo-talkpage' => 'گل بات صفہ',
+'pageinfo-views' => 'را‎ ۓ گنتی',
 'pageinfo-watchers' => 'ویکھن والے',
 'pageinfo-edits' => 'تبدیلیاں گنتی',
 'pageinfo-authors' => 'وکھرے لکھاریاں دی گنتی',
-'pageinfo-views' => 'را‎ ۓ گنتی',
-'pageinfo-viewsperedit' => 'تبدیلی سعاب نال وکھالے',
 
 # Patrolling
 'markaspatrolleddiff' => 'ویکھے گۓ دا نشان لاؤ',
@@ -3580,6 +3575,7 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 'api-error-file-too-large' => 'جیڑی فائل تسی دسی اے اوہ بوت وڈی اے۔',
 'api-error-filename-tooshort' => 'اس فائل دا ناں بوت چھوٹا اے۔',
 'api-error-filetype-banned' => 'اس قسم دی فائل تے پابندی اے۔',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|اینج دی فائل دی اجازت نئیں|اینج دیاں فائلاں دی اجازت نئیں}} اجازت دتی {{PLURAL:$3|فائل ٹائپ اے|فائل ٹائپ نیں}} $2۔',
 'api-error-filetype-missing' => 'فائل چ ایکسٹنشن نئیں اے۔',
 'api-error-hookaborted' => 'جیڑی تبدیلی تسی کرنا چاہی اے، اونوں اک ایکسٹنشن کنڈے نیں بند کردتا اے۔',
 'api-error-http' => 'انٹرنیٹ ئلطی: سرور نال کوئی جوڑ نئیں۔',
index a62df39..840efbc 100644 (file)
@@ -1145,9 +1145,9 @@ Pāusai iz [[Special:Watchlist|nadirītan listin]] ast pastarīntan.',
 Kāi widālai anga laukīlai ānkstais enkraūtans zūrbrukins jaīs en [[Special:FileList|listin stēisan enkraūtan zūrbrukin]]. Enkraūsenei ast enpeisātan en [[Special:Log/upload|enkraūsnas registeŗu]], āupausinsenei en [[Special:Log/delete|āupausinsnas registeŗu]].
 
 Zūrbrukis wīrst tikkuns en pāusu, ik tū wīrst tērpauwuns(si) aīnan iz izbilīsenins:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' kāi tērpaulai pilnan zūrbrukes wersiōnin
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|papeisāsenis]]</nowiki></tt>''' kāi tērpaulai 200-pikselin miniatūrin sen \"papeisāsenis\" papeisāsenin
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' kāi entikriskai autengīnlai šlāit zūrbrukes waidīnsnan",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' kāi tērpaulai pilnan zūrbrukes wersiōnin
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|papeisāsenis]]</nowiki></code>''' kāi tērpaulai 200-pikselin miniatūrin sen \"papeisāsenis\" papeisāsenin
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' kāi entikriskai autengīnlai šlāit zūrbrukes waidīnsnan",
 'upload-permitted' => 'Preiwērptai zūrbrukin fōrmatai: $1.',
 'upload-preferred' => 'Pirminiskai zūrbrukin fōrmatai: $1.',
 'upload-prohibited' => 'Drēuditai zūrbrukin fōrmatai: $1.',
@@ -1176,22 +1176,22 @@ Madli kitawīdinais zūrbrukes pabilīsnan be enkraūneis din etkūmps.',
 'large-file' => 'Rāditan ast, kāi zūrbrukes debban ni būlai mūisesan nikāi $1; šisse zūrbrukes debban ast $2.',
 'largefileserver' => 'Zūrbrukes debban ast mūisesan, nikāi maksimālin preiwērptan.',
 'emptyfile' => 'Enkraūts zūrbrukis perwaidinna būtwei pāustan. Sta mazzi būtwei litteras blāndas en zūrbrukes pabilīsnai paggan. Madli izbandais anga zūrbrukes pabilisnā ast tikrōmiskan.',
-'fileexists' => "Zūrbrukis sen šin pabilīsnan jāu ekzistijja. Izbandais '''<tt>[[:$1]]</tt>''', ik ni assei aušaudīwingi kāi tū kwaitēi din kitawīdintun.
-[[$1|thumb]]",
-'filepageexists' => "Šisse zūrbrukes ebpeisāsenes pāusan ast jāu teīktan: '''<tt>[[:$1]]</tt>''', adder tēntiskai niaīns zūrbrukis sen šan pabilīsnan ni ekzistijja.
+'fileexists' => 'Zūrbrukis sen šin pabilīsnan jāu ekzistijja. Izbandais <strong>[[:$1]]</strong>, ik ni assei aušaudīwingi kāi tū kwaitēi din kitawīdintun.
+[[$1|thumb]]',
+'filepageexists' => 'Šisse zūrbrukes ebpeisāsenes pāusan ast jāu teīktan: <strong>[[:$1]]</strong>, adder tēntiskai niaīns zūrbrukis sen šan pabilīsnan ni ekzistijja.
 Infōrmaciōnis ezze zūrbrukin, kawīdans tū assei enweddus, ni wīrst tikkušas en ebpeisāsenes pāusu.
 Ik tū kwaitēi, kāi tennas pastālai waidīntan, tū turri redigītun tennans rānkiskai.
-[[$1|thumb]]",
-'fileexists-extension' => "Zūrbrukis sen palīgun pabilīsnan ekzistijja: [[$2|thumb]]
-*Enkraūtas zūrbrukes pabilisnā: '''<tt>[[:$1]]</tt>'''
-*Ekzistīntes zūrbrukes pabilisnā: '''<tt>[[:$2]]</tt>'''
-Etrīnkais kittan pabilīsnan.",
-'fileexists-thumbnail-yes' => "Zūrbrukis perwaidinna būtwei mazintā grāfiki \"(miniatūri)\".[[\$1|thumb]]
-Izbandais zūrbrukin '''<tt>[[:\$1]]</tt>'''.
-Ik etrīnkauts zūrbrukis ast ši subba grāfiki, kawīda en ōrginalu debban, tū ni turri enkraūtun papilniminan miniatūrin.",
-'file-thumbnail-no' => "Zūrbrukes pabilisnā pagaūne si sen '''<tt>\$1</tt>'''.
-Perwaidinna di, kāi sta ast mazintā grāfiki \"(thumbnail)\".
-Ik turri tū šan grāfikin en pilnasmu debban, enkraūneis din. Ik tū kwaitēi enkraūtun šan, kitawīdinais zūrbrukes pabilīsnan.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Zūrbrukis sen palīgun pabilīsnan ekzistijja: [[$2|thumb]]
+*Enkraūtas zūrbrukes pabilisnā: <strong>[[:$1]]</strong>
+*Ekzistīntes zūrbrukes pabilisnā: <strong>[[:$2]]</strong>
+Etrīnkais kittan pabilīsnan.',
+'fileexists-thumbnail-yes' => 'Zūrbrukis perwaidinna būtwei mazintā grāfiki "(miniatūri)".[[$1|thumb]]
+Izbandais zūrbrukin <strong>[[:$1]]</strong>.
+Ik etrīnkauts zūrbrukis ast ši subba grāfiki, kawīda en ōrginalu debban, tū ni turri enkraūtun papilniminan miniatūrin.',
+'file-thumbnail-no' => 'Zūrbrukes pabilisnā pagaūne si sen <strong>$1</strong>.
+Perwaidinna di, kāi sta ast mazintā grāfiki "(thumbnail)".
+Ik turri tū šan grāfikin en pilnasmu debban, enkraūneis din. Ik tū kwaitēi enkraūtun šan, kitawīdinais zūrbrukes pabilīsnan.',
 'fileexists-forbidden' => 'Zūrbrukis sen stawīdan pabilīsnan jāu ekzistijja be ni mazzi būtwei kirsāi peisātan.
 Ik tū kwaitēi enkraūtun zūrbrukin, ettreppais be enkraūneis tennan etkūmps sen kittan pabilīsnan. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Zūrbrukis sen šin emnin  jau ekzistijja en dallautan repōzitōrijan stēisan zūrbrukin.
@@ -1333,7 +1333,7 @@ Preiēiminan ast dīgi [[Special:WhatLinksHere/$2|pilna listi]].',
 # MIME search
 'mimesearch' => 'MIME laukīsna',
 'mimesearch-summary' => 'Šin pāusan wērpja laukīsnan stēisan zūrbrukin pa tenēisan MIME tīpan.
-Tērpausna: ēnturas_tīps/pōtips, perw. <tt>image/jpeg</tt>.',
+Tērpausna: ēnturas_tīps/pōtips, perw. <code>image/jpeg</code>.',
 'mimetype' => 'MIME tīps',
 'download' => 'izkraūneis',
 
@@ -1514,7 +1514,7 @@ Tu mazzi anzitun rezultātans etrīnkantei registeres tīpan, tērpautajas pabil
 'linksearch-ns' => 'Emninplattibi:',
 'linksearch-ok' => 'Laukīs',
 'linksearch-text' => 'Mazīngi tērpautun tulapresliskan simbōlin "*"  - perwaidīnsnai „*.wikipedia.org”<br />
-Ebšlūzitai prōtokulai: <tt>$1</tt>',
+Ebšlūzitai prōtokulai: <code>$1</code>',
 'linksearch-line' => 'Prei $1 autenginna $2',
 'linksearch-error' => 'Mazīngi tērpautun tulapresliskan simbōlin "*" tēr en hostas pabilīsnas pagaūseņu.',
 
index 79f113b..ff59bb3 100644 (file)
@@ -95,64 +95,64 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'notoc'                   => array( '0', '__بی‌نيولک__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__بی‌نندارتونه__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__نيوليکداره__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__نيوليک__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__بی‌برخې__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'روانه_مياشت', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'دروانې_مياشت_نوم', 'CURRENTMONTHNAME' ),
-       'currentmonthabbrev'      => array( '1', 'دروانې_مياشت_لنډون', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'نن', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'نن۲', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'دننۍورځې_نوم', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'سږکال', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'داوخت', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'دم_ګړۍ', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'سيمه_يزه_مياشت', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'دسيمه_يزې_مياشت_نوم', 'LOCALMONTHNAME' ),
-       'localmonthabbrev'        => array( '1', 'دسيمه_يزې_مياشت_لنډون', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'سيمه_يزه_ورځ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'سيمه_يزه_ورځ۲', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'دسيمه_يزې_ورځ_نوم', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'سيمه_يزکال', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'سيمه_يزوخت', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'سيمه_يزه_ګړۍ', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'دمخونوشمېر', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'دليکنوشمېر', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ددوتنوشمېر', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'دکارونکوشمېر', 'NUMBEROFUSERS' ),
-       'pagename'                => array( '1', 'دمخ_نوم', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'دمخ_نښه', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'نوم_تشيال', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'د_نوم_تشيال_نښه', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'دخبرواترو_تشيال', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'دخبرواترو_تشيال_نښه', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'دسکالوتشيال', 'دليکنې_تشيال', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'دسکالوتشيال_نښه', 'دليکنې_تشيال_نښه', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'دمخ_بشپړنوم', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'دمخ_بشپړنوم_نښه', 'FULLPAGENAMEE' ),
-       'msg'                     => array( '0', 'پیغام:', 'پ:', 'MSG:' ),
-       'img_thumbnail'           => array( '1', 'بټنوک', 'thumbnail', 'thumb' ),
-       'img_right'               => array( '1', 'ښي', 'right' ),
-       'img_left'                => array( '1', 'کيڼ', 'left' ),
-       'img_none'                => array( '1', 'هېڅ', 'none' ),
-       'img_center'              => array( '1', 'مېنځ،_center', 'center', 'centre' ),
-       'sitename'                => array( '1', 'دوېبځي_نوم', 'SITENAME' ),
-       'server'                  => array( '0', 'پالنګر', 'SERVER' ),
-       'servername'              => array( '0', 'دپالنګر_نوم', 'SERVERNAME' ),
-       'grammar'                 => array( '0', 'ګرامر:', 'GRAMMAR:' ),
-       'currentweek'             => array( '1', 'روانه_اوونۍ', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'داوونۍورځ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'سيمه_يزه_اوونۍ', 'LOCALWEEK' ),
-       'plural'                  => array( '0', 'جمع:', 'PLURAL:' ),
-       'language'                => array( '0', '#ژبه:', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'ځانګړی', 'special' ),
-       'hiddencat'               => array( '1', '__پټه_وېشنيزه__', '__HIDDENCAT__' ),
-       'pagesize'                => array( '1', 'مخکچه', 'PAGESIZE' ),
-       'index'                   => array( '1', '__ليکلړ__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__بې_ليکلړ__', '__NOINDEX__' ),
-       'protectionlevel'         => array( '1', 'ژغورکچه', 'PROTECTIONLEVEL' ),
+       'notoc'                     => array( '0', '__بی‌نيولک__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__بی‌نندارتونه__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__نيوليکداره__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__نيوليک__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__بی‌برخې__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'روانه_مياشت', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'دروانې_مياشت_نوم', 'CURRENTMONTHNAME' ),
+       'currentmonthabbrev'        => array( '1', 'دروانې_مياشت_لنډون', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'نن', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'نن۲', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'دننۍورځې_نوم', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'سږکال', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'داوخت', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'دم_ګړۍ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'سيمه_يزه_مياشت', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'دسيمه_يزې_مياشت_نوم', 'LOCALMONTHNAME' ),
+       'localmonthabbrev'          => array( '1', 'دسيمه_يزې_مياشت_لنډون', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'سيمه_يزه_ورځ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'سيمه_يزه_ورځ۲', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'دسيمه_يزې_ورځ_نوم', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'سيمه_يزکال', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'سيمه_يزوخت', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'سيمه_يزه_ګړۍ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'دمخونوشمېر', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'دليکنوشمېر', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ددوتنوشمېر', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'دکارونکوشمېر', 'NUMBEROFUSERS' ),
+       'pagename'                  => array( '1', 'دمخ_نوم', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'دمخ_نښه', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'نوم_تشيال', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'د_نوم_تشيال_نښه', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'دخبرواترو_تشيال', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'دخبرواترو_تشيال_نښه', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'دسکالوتشيال', 'دليکنې_تشيال', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'دسکالوتشيال_نښه', 'دليکنې_تشيال_نښه', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'دمخ_بشپړنوم', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'دمخ_بشپړنوم_نښه', 'FULLPAGENAMEE' ),
+       'msg'                       => array( '0', 'پیغام:', 'پ:', 'MSG:' ),
+       'img_thumbnail'             => array( '1', 'بټنوک', 'thumbnail', 'thumb' ),
+       'img_right'                 => array( '1', 'ښي', 'right' ),
+       'img_left'                  => array( '1', 'کيڼ', 'left' ),
+       'img_none'                  => array( '1', 'هېڅ', 'none' ),
+       'img_center'                => array( '1', 'مېنځ،_center', 'center', 'centre' ),
+       'sitename'                  => array( '1', 'دوېبځي_نوم', 'SITENAME' ),
+       'server'                    => array( '0', 'پالنګر', 'SERVER' ),
+       'servername'                => array( '0', 'دپالنګر_نوم', 'SERVERNAME' ),
+       'grammar'                   => array( '0', 'ګرامر:', 'GRAMMAR:' ),
+       'currentweek'               => array( '1', 'روانه_اوونۍ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'داوونۍورځ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'سيمه_يزه_اوونۍ', 'LOCALWEEK' ),
+       'plural'                    => array( '0', 'جمع:', 'PLURAL:' ),
+       'language'                  => array( '0', '#ژبه:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'ځانګړی', 'special' ),
+       'hiddencat'                 => array( '1', '__پټه_وېشنيزه__', '__HIDDENCAT__' ),
+       'pagesize'                  => array( '1', 'مخکچه', 'PAGESIZE' ),
+       'index'                     => array( '1', '__ليکلړ__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__بې_ليکلړ__', '__NOINDEX__' ),
+       'protectionlevel'           => array( '1', 'ژغورکچه', 'PROTECTIONLEVEL' ),
 );
 
 $rtl = true;
@@ -165,7 +165,7 @@ $messages = array(
 'tog-hidepatrolled' => 'په وروستيو بدلونونو کې څارل شوې سمونونه پټول',
 'tog-newpageshidepatrolled' => 'د نوؤ مخونو په لړليک کې کتل شوي مخونه پټول',
 'tog-extendwatchlist' => 'يوازې د وروستني بدلونونو د ښکاره کولو لپاره نه بلکه د ټولو بدلونونو د ښکاره کولو لپاره کتنلړ غځول',
-'tog-usenewrc' => 'د وروستي بدلونو پرمختللې بڼه کارول (جاوا سکرېپټ ته اړتيا ده)',
+'tog-usenewrc' => 'په کتنلړ او وروستي بدلونو مخ باندې ډله ايز بدلونونه (جاوا سکرېپټ ته اړتيا ده)',
 'tog-numberheadings' => 'د سرليکونو خپلکاره شمېرايښودنه',
 'tog-showtoolbar' => 'د سمولو توکپټه ښکاره کول (جاواسکرېپټ)',
 'tog-editondblclick' => 'په دوه کلېک سره د مخونو سمون (د جاواسکرېپټ اړتيا ده)',
@@ -173,17 +173,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'د ښي کلېک سره د سرليکونو د برخې سمون چارنول (جاواسکرېپټ ته اړتيا)',
 'tog-showtoc' => 'نيوليک ښکاره کول (د هغو مخونو لپاره چې له ۳ نه ډېر سرليکونه لري)',
 'tog-rememberpassword' => 'زما کارن-نوم په دې کتنمل (تر $1 {{PLURAL:$1|ورځې|ورځو}}) په ياد وساته!',
-'tog-watchcreations' => 'هغه مخونه چې زه يې جوړوم، زما کتنلړ کې ورګډ کړه',
-'tog-watchdefault' => 'هغه مخونه چې زه يې سموم، زما کتنلړ کې ورګډ کړه',
-'tog-watchmoves' => 'هغه مخونه چې زه يې لېږدوم، زما کتنلړ کې ورګډ کړه',
-'tog-watchdeletion' => 'هغه مخونه چې زه يې ړنګوم، زما کتنلړ کې ورګډ کړه',
+'tog-watchcreations' => 'زما کتنلړ کې دې هغه مخونه چې زه يې جوړوم او هغه دوتنې چې زه يې پورته کوم ورګډې شي',
+'tog-watchdefault' => 'زما کتنلړ کې دې هغه مخونه او دوتنې ورګډې شي چې زه يې سموم',
+'tog-watchmoves' => 'زما کتنلړ کې دې هغه مخونه او دوتنې ورګډې شي چې زه يې لېږدوم',
+'tog-watchdeletion' => 'زما کتنلړ کې دې هغه مخونه او دوتنې ورګډې شي چې زه يې ړنګوم',
 'tog-minordefault' => 'په تلواليزه توګه ټول سمونونه واړه په نخښه کول',
 'tog-previewontop' => 'د سمون بکس نه دمخه مخکتنه ښکاره کول',
 'tog-previewonfirst' => 'په لومړي سمون کې مخکتنه ښکاره کول',
 'tog-nocache' => 'د کتنمل د مخ ياده ساتنې چار ناچارندول',
-'tog-enotifwatchlistpages' => 'کله چې زما کتنلړ کې يو مخ بدلون مومي نو ما ته دې برېښليک راشي',
+'tog-enotifwatchlistpages' => 'کله چې زما د کتنلړ په يوې دوتنې يا يو مخ کې بدلون راځي نو ما ته دې د بدلون په اړه برېښليک راشي',
 'tog-enotifusertalkpages' => 'کله چې زما د خبرو اترو په مخ کې بدلون پېښېږي نو ما ته دې يو برېښليک ولېږلی شي.',
-'tog-enotifminoredits' => 'کله چې په مخونو کې وړې سمونې کېږي نو ماته دې برېښليک ولېږل شي',
+'tog-enotifminoredits' => 'کله چې په مخونو او دوتنو کې وړې سمونې کېږي نو ماته دې د بدلون په اړه برېښليک راشي',
 'tog-enotifrevealaddr' => 'په يادښت برېښليک کې زما برېښليک پته ښکاره کول',
 'tog-shownumberswatching' => 'د کتونکو کارنانو شمېر ښکاره کول',
 'tog-oldsig' => 'اوسنی لاسليک:',
@@ -267,7 +267,7 @@ $messages = array(
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|وېشنيزه|وېشنيزې}}',
 'category_header' => 'د "$1" په وېشنيزه کې شته مخونه',
-'subcategories' => 'وړې-وېشنيزې',
+'subcategories' => 'څېرمه وېشنيزې',
 'category-media-header' => 'د "$1" په وېشنيزه کې شته رسنۍ',
 'category-empty' => "''تر اوسه پورې همدا وېشنيزه هېڅ کوم مخ يا کومه رسنيزه دوتنه نلري.''",
 'hidden-categories' => '{{PLURAL:$1|پټه وېشنيزه|پټې وېشنيزې}}',
@@ -753,6 +753,7 @@ $1',
 'previewnote' => "'''هېر مو نه شي چې دا يواځې يوه مخليدنه ده.'''
 ستاسې لخوا ترسره شوي بدلونونه لا تر اوسه پورې نه دي خوندي شوي!!",
 'editing' => 'د $1 سمونه',
+'creating' => '$1 جوړېدنې کې دی',
 'editingsection' => 'سمونه $1 (برخه)',
 'editingcomment' => 'د $1 سمون (نوې برخه)',
 'editconflict' => 'په سمادولو کې خنډ: $1',
@@ -798,11 +799,15 @@ $1',
 'edit-no-change' => 'ستاسې سمون بابېزه وګڼل شو، دا ځکه چې تاسې په متن کې کوم بدلون نه دی راوستلی.',
 'edit-already-exists' => 'په دې نوم يو نوی مخ جوړ نه شو.
 پدې نوم د پخوا نه يو مخ شته.',
+'defaultmessagetext' => 'تلوالیزه پيغام متن',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''ګواښنه:''' دا کينډۍ د خپل ټاکلي بريد نه ډېره لويه ده.
 ځينې کينډۍ به په کې ګډې نه شي.",
 'post-expand-template-inclusion-category' => 'هغه مخونه چې په کې د کارېدلو کينډيو شمېر له ټاکلې کچې ډېر دی',
+'post-expand-template-argument-warning' => "'''ګواښنه:''' دا مخ لږ تر لږه د يوې کينډۍ عاملين لري چې بې حده لوی دی.
+دا عاملين ړنګ شول.",
+'post-expand-template-argument-category' => 'هغه مخونه چې د کينډۍ ړنګ شوي عاملين لري.',
 
 # "Undo" feature
 'undo-norev' => 'دا سمون ناکړ کېدلای نه شي دا ځکه چې دا سمون نشته او يا هم ړنګ شوی.',
@@ -891,7 +896,7 @@ $1',
 'revertmerge' => 'بېلول',
 
 # Diffs
-'history-title' => 'د "$1" Ø¯ Ù¾Û\90Ú\9aÙ\84Ù\8aÚ© Ø¨Ú¼Ù\87',
+'history-title' => 'د "$1" Ø¯ Ù\85Ø®Ù\84Ù\8aدÙ\86Û\90 Ù¾Û\90Ú\9aÙ\84Ù\8aÚ©',
 'difference-multipage' => '(د مخونو تر مېنځ توپير)',
 'lineno' => '$1 کرښه:',
 'compareselectedversions' => 'ټاکلې بڼې سره پرتلل',
@@ -995,7 +1000,7 @@ $1',
 'saveprefs' => 'خوندي کول',
 'resetprefs' => 'بيا سمول',
 'restoreprefs' => 'ټولې تلواليزې امستنې پرځای کول',
-'prefs-editing' => 'د Ø³Ù\85Ù\88Ù\84Ù\88 Ù¾Ù\87 Ø­Ø§Ù\84 Ú©Û\90',
+'prefs-editing' => 'سÙ\85Û\90دÙ\86Û\90 Ú©Û\90 Ø¯Û\8c',
 'prefs-edit-boxsize' => 'د سمون کړکۍ کچه.',
 'rows' => 'ليکې:',
 'columns' => 'ستنې:',
@@ -1171,7 +1176,7 @@ $1',
 'nchanges' => '$1 {{PLURAL:$1|بدلون|بدلونونه}}',
 'recentchanges' => 'وروستي بدلونونه',
 'recentchanges-legend' => 'د ورستي بدلونو خوښنې',
-'recentchanges-summary' => 'په همدې مخ باندې د ويکي ترټولو تازه وروستي بدلونونه وڅارۍ.',
+'recentchanges-summary' => 'په دې مخ د ويکي ترټولو تازه وروستي بدلونونه وڅارۍ.',
 'recentchanges-feed-description' => 'همدلته د ويکي ترټولو تازه وروستي بدلونونه وڅارۍ او وګورۍ چې څه پېښ شوي.',
 'recentchanges-label-newpage' => 'دغه سمون يو نوی مخ جوړ کړی',
 'recentchanges-label-minor' => 'دا يوه وړه سمونه ده',
@@ -1221,9 +1226,9 @@ $1',
 که چېرته د پخونيو پورته شويو دوتنو کتل او پلټل غواړۍ نو [[Special:FileList|د پورته شويو دوتنو لړليک]] ته ورشۍ، [[Special:Log/upload|د (بيا) پورته شويو دوتنو يادښتونه]] او [[Special:Log/delete|د ړنګېدو يادښتونه]] هم کتلای شی.
 
 ددې لپاره چې يوه مخ ته انځور ورواچوی، نو بيا پدې ډول تړنې (لېنک) وکاروی
-* د يوې دوتنې د بشپړې بڼې د کارولو په موخه د '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' کوډ وکاروۍ.
-* د '۲۰۰ پېکسل' په کچه د 'بټنوک' په توګه د يوې دوتنې کارول چې د مخ کيڼې څنډې کې او ترلاندې 'د انځور څرګندونې' ولري، نو د دې موخې لپاره د '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|بټنوک|کيڼ|د انځور څرګندونې]]</nowiki></tt>''' کوډ وکاروۍ.
-* د انځور د ښودلو نه پرته، د دوتنې سره د سيخې تړنې لپاره د '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' کوډ وکاروۍ.",
+* د يوې دوتنې د بشپړې بڼې د کارولو په موخه د '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' کوډ وکاروۍ.
+* د '۲۰۰ پېکسل' په کچه د 'بټنوک' په توګه د يوې دوتنې کارول چې د مخ کيڼې څنډې کې او ترلاندې 'د انځور څرګندونې' ولري، نو د دې موخې لپاره د '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|بټنوک|کيڼ|د انځور څرګندونې]]</nowiki></code>''' کوډ وکاروۍ.
+* د انځور د ښودلو نه پرته، د دوتنې سره د سيخې تړنې لپاره د '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' کوډ وکاروۍ.",
 'upload-permitted' => 'د پرېښودلو دوتنو ډولونه: $1.',
 'upload-preferred' => 'د غوره دوتنو ډولونه: $1.',
 'upload-prohibited' => 'د منع شويو دوتنو ډولونه: $1.',
@@ -1248,13 +1253,15 @@ $1',
 'file-too-large' => 'کومه دوتنه چې تاسې دلته سپارلې ډېره لويه ده.',
 'filename-tooshort' => 'د دوتنې نوم ډېر لنډ دی',
 'filetype-banned' => 'په دې ډول دوتنې بنديز دی.',
+'illegal-filename' => 'د دوتنې نوم نه دی پرېښل شوی.',
+'unknown-error' => 'يوه ناڅرګنده تېروتنه رامېنځته شوه.',
 'tmp-create-error' => 'لنډمهاله دوتنه جوړېدای نه شي',
-'fileexists' => "د پخوا نه پدې نوم يوه دوتنه شته، که تاسو ډاډه نه ياست او يا هم که تاسو غواړۍ چې بدلون پکې راولۍ، لطفاً '''<tt>[[:$1]]</tt>''' وګورۍ.
-[[$1|thumb]]",
-'fileexists-extension' => "په همدې نوم يوه بله دوتنه د پخوا نه شته: [[$2|thumb]]
-* د پورته کېدونکې دوتنې نوم: '''<tt>[[:$1]]</tt>'''
-* د پخوا نه شته دوتنه: '''<tt>[[:$2]]</tt>'''
-لطفاً يو داسې نوم وټاکی چې د پخوانۍ دوتنې سره توپير ولري.",
+'fileexists' => 'د پخوا نه پدې نوم يوه دوتنه شته، که تاسو ډاډه نه ياست او يا هم که تاسو غواړۍ چې بدلون پکې راولۍ، لطفاً <strong>[[:$1]]</strong> وګورۍ.
+[[$1|thumb]]',
+'fileexists-extension' => 'په همدې نوم يوه بله دوتنه د پخوا نه شته: [[$2|thumb]]
+* د پورته کېدونکې دوتنې نوم: <strong>[[:$1]]</strong>
+* د پخوا نه شته دوتنه: <strong>[[:$2]]</strong>
+لطفاً يو داسې نوم وټاکی چې د پخوانۍ دوتنې سره توپير ولري.',
 'fileexists-forbidden' => 'د پخوا نه پدې نوم يوه دوتنه شته، او په دې نوم بله دوتنه نه پورته کېږي.
 که تاسې بيا هم د خپلې دوتنې پورته کول غواړۍ، نو لطفاً بېرته وګرځۍ او همدغه دوتنه بيا په يوه نوي نوم پورته کړی.
 [[File:$1|thumb|center|$1]]',
@@ -1279,10 +1286,11 @@ $1',
 'upload-http-error' => 'د HTTP يوه ستونزه رامېنځ ته شوې: $1',
 
 # File backend
+'backend-fail-notexists' => 'د $1 په نوم دوتنه نشته.',
 'backend-fail-delete' => 'د "$1" دوتنه ړنګه نه شوه.',
 'backend-fail-alreadyexists' => 'د $1 دوتنه له پخوا نه شته.',
 'backend-fail-read' => 'د "$1" دوتنه نه شي لوستل کېدای.',
-'backend-fail-create' => 'د "$1" دوتنه نه شي جوړېدای.',
+'backend-fail-create' => 'د "$1" په دوتنه کې نور څه و نه ليکل شول.',
 
 # ZipDirectoryReader
 'zip-wrong-format' => 'ځانګړې شوې دوتنه يوه ZIP دوتنه نه وه.',
@@ -1757,6 +1765,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 # Namespace form on various pages
 'namespace' => 'نوم-تشيال:',
 'invert' => 'ټاکنې سرچپه کول',
+'namespace_association' => 'مل نومتشيال',
 'blanknamespace' => '(آرنی)',
 
 # Contributions
@@ -1836,6 +1845,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'unblockip' => 'کارن له بنديزه وېستل',
 'ipusubmit' => 'دا بنديز ليرې کول',
 'unblocked' => 'له [[User:$1|$1]] بنديز ليري شو',
+'unblocked-range' => 'له $1 بنديز ليرې شو',
 'blocklist' => 'بنديز لګېدلي کارنان',
 'ipblocklist' => 'بنديز لګېدلي کارنان',
 'ipblocklist-legend' => 'يو بنديز شوی کارن موندل',
@@ -1879,6 +1889,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # Developer tools
 'lockdb' => 'توکبنسټ تړل',
+'unlockdb' => 'توکبنسټ پرانيستل',
 'lockconfirm' => 'هو، زه د توکبنسټ تړل غواړم.',
 'lockbtn' => 'توکبنسټ تړل',
 'unlockbtn' => 'توکبنسټ پرانيستل',
@@ -1999,7 +2010,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-ca-move' => 'همدا مخ لېږدول',
 'tooltip-ca-watch' => 'دا مخ په خپل کتنلړکې ګډول',
 'tooltip-ca-unwatch' => 'همدا مخ خپل کتنلړ نه لرې کول',
-'tooltip-search' => 'د {{SITENAME}} لټون',
+'tooltip-search' => '{{SITENAME}} پلټل',
 'tooltip-search-go' => 'په دې نوم د کټ مټ ورته مخ شتون په صورت کې، هماغه مخ ته ورځه',
 'tooltip-search-fulltext' => 'په مخونو کې دا متن وپلټه',
 'tooltip-p-logo' => 'لومړی مخ',
@@ -2056,13 +2067,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 # Info page
 'pageinfo-title' => 'د "$1" مالومات',
 'pageinfo-header-edits' => 'سمونونه',
-'pageinfo-header-watchlist' => 'کتنلړ',
-'pageinfo-header-views' => 'کتنې',
-'pageinfo-subjectpage' => 'مخ',
-'pageinfo-talkpage' => 'د خبرواترو مخ',
+'pageinfo-views' => 'د کتنو شمېر',
 'pageinfo-watchers' => 'د کتونکو شمېر',
 'pageinfo-edits' => 'د سمونونو شمېر',
-'pageinfo-views' => 'د کتنو شمېر',
 
 # Skin names
 'skinname-standard' => 'کلاسيک',
@@ -2384,14 +2391,14 @@ $5
 'autosumm-new' => 'د "$1" تورو مخ جوړ شو',
 
 # Live preview
-'livepreview-loading' => 'د Ø¨Ø±Ø³Û\90رÛ\90دÙ\84Ù\88 Ù¾Ù\87 Ø­Ø§Ù\84 Ú©Û\90...',
+'livepreview-loading' => 'برسÛ\90رÛ\90دÙ\86Û\90 Ú©Û\90 Ø¯Û\8c...',
 'livepreview-ready' => 'برسېرېدنه ... چمتو ده!',
 
 # Watchlist editor
 'watchlistedit-noitems' => 'ستاسې کتنلړ کې هېڅ کوم سرليک نشته.',
 'watchlistedit-normal-title' => 'کتنلړ سمول',
 'watchlistedit-normal-legend' => 'د کتنلړ نه سرليکونه لرې کول',
-'watchlistedit-normal-submit' => 'سرليکونه لرکول',
+'watchlistedit-normal-submit' => 'سرليکونه لرې کول',
 'watchlistedit-normal-done' => '{{PLURAL:$1|1 سرليک ستاسې له کتنلړ نه ليري شو|$1 سرليکونه ستاسې له کتنلړ نه ليري شوه}}:',
 'watchlistedit-raw-title' => 'خام کتنلړ سمول',
 'watchlistedit-raw-legend' => 'خام کتنلړ سمول',
@@ -2423,6 +2430,9 @@ $5
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|خبرې اترې]])',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'ګواښنه:\'\'\'د "$2" تلواليزه اوډون تڼۍ تر دې پخوا ټاکلې تلواليزه اوډون تڼۍ "$1" پر ځای چارنه کېږي.',
+
 # Special:Version
 'version' => 'بڼه',
 'version-extensions' => 'لګېدلي شاتاړي',
@@ -2543,6 +2553,7 @@ $5
 'api-error-filename-tooshort' => 'د دوتنې نوم ډېر لنډ دی.',
 'api-error-filetype-banned' => 'په دې ډول دوتنې بنديز دی.',
 'api-error-illegal-filename' => 'د دوتنې نوم نه دی پرېښل شوی.',
+'api-error-unclassified' => 'يوه ناڅرګنده تېروتنه رامېنځته شوه.',
 'api-error-unknown-code' => 'ناڅرګنده تېروتنه: "$1"',
 'api-error-unknown-warning' => 'ناڅرګنده ګواښنه: "$1".',
 'api-error-unknownerror' => 'ناڅرګنده تېروتنه: "$1".',
index 8cfc8b6..fbd3612 100644 (file)
@@ -44,6 +44,7 @@
  * @author SandroHc
  * @author Sir Lestaty de Lioncourt
  * @author Sérgio Ribeiro
+ * @author Teles
  * @author Urhixidur
  * @author Villate
  * @author Waldir
@@ -194,117 +195,117 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#REDIRECIONAMENTO', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__SEMTDC__', '__SEMSUMÁRIO__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__SEMGALERIA__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÁRIO__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__TDC__', '__SUMÁRIO__', '__SUMARIO__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NAOEDITARSECAO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÍTULO__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
-       'currentmonthabbrev'      => array( '1', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'DIAATUAL', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'DIAATUAL2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ANOATUAL', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'HORARIOATUAL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'HORAATUAL', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthabbrev'        => array( '1', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'ABREVIATURADOMESLOCAL', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'DIALOCAL', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'DIALOCAL2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'HORARIOLOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NUMERODEPAGINAS', 'NÚMERODEPÁGINAS', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NUMERODEARTIGOS', 'NÚMERODEARTIGOS', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÁRIOS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÁRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÁGINA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÁGINAC', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'DOMINIO', 'DOMÍNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'DOMINIOC', 'DOMÍNIOC', 'ESPACONOMINALC', 'ESPAÇONOMINALC', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'PAGINADEDISCUSSAO', 'PÁGINADEDISCUSSÃO', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'PAGINADEDISCUSSAOC', 'PÁGINADEDISCUSSÃOC', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'PAGINADECONTEUDO', 'PAGINADECONTEÚDO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'PAGINADECONTEUDOC', 'PAGINADECONTEÚDOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÁGINA', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'NOMECOMPLETODAPAGINAC', 'NOMECOMPLETODAPÁGINAC', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NOMEDASUBPAGINA', 'NOMEDASUBPÁGINA', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NOMEDASUBPAGINAC', 'NOMEDASUBPÁGINAC', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NOMEDAPAGINABASE', 'NOMEDAPÁGINABASE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NOMEDAPAGINABASEC', 'NOMEDAPÁGINABASEC', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÁGINADEDISCUSSÃO', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÁGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÁGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÁGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'img_thumbnail'           => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'direita', 'right' ),
-       'img_left'                => array( '1', 'esquerda', 'left' ),
-       'img_none'                => array( '1', 'nenhum', 'none' ),
-       'img_center'              => array( '1', 'centro', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'semmoldura', 'semborda', 'frameless' ),
-       'img_page'                => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'borda', 'border' ),
-       'img_baseline'            => array( '1', 'linhadebase', 'baseline' ),
-       'img_top'                 => array( '1', 'acima', 'top' ),
-       'img_middle'              => array( '1', 'meio', 'middle' ),
-       'img_bottom'              => array( '1', 'abaixo', 'bottom' ),
-       'img_link'                => array( '1', 'ligação=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'NOMEDOSITE', 'NOMEDOSÍTIO', 'NOMEDOSITIO', 'SITENAME' ),
-       'server'                  => array( '0', 'SERVIDOR', 'SERVER' ),
-       'servername'              => array( '0', 'NOMEDOSERVIDOR', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'CAMINHODOSCRIPT', 'SCRIPTPATH' ),
-       'gender'                  => array( '0', 'GENERO', 'GÊNERO', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__SEMCONVERTERTITULO__', '__SEMCONVERTERTÍTULO__', '__SEMCT__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__SEMCONVERTERCONTEUDO__', '__SEMCONVERTERCONTEÚDO__', '__SEMCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'SEMANAATUAL', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'DIADASEMANAATUAL', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'DIADASEMANALOCAL', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDDAREVISAO', 'IDDAREVISÃO', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'DIADAREVISAO', 'DIADAREVISÃO', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'DIADAREVISAO2', 'DIADAREVISÃO2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MESDAREVISAO', 'MÊSDAREVISÃO', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ANODAREVISAO', 'ANODAREVISÃO', 'REVISIONYEAR' ),
-       'revisionuser'            => array( '1', 'USUARIODAREVISAO', 'USUÁRIODAREVISÃO', 'REVISIONUSER' ),
-       'fullurl'                 => array( '0', 'URLCOMPLETO:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLCOMPLETOC:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'PRIMEIRAMINUSCULA:', 'PRIMEIRAMINÚSCULA:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'PRIMEIRAMAIUSCULA:', 'PRIMEIRAMAIÚSCULA:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MINUSCULA', 'MINÚSCULA', 'MINUSCULAS', 'MINÚSCULAS', 'LC:' ),
-       'uc'                      => array( '0', 'MAIUSCULA', 'MAIÚSCULA', 'MAIUSCULAS', 'MAIÚSCULAS', 'UC:' ),
-       'displaytitle'            => array( '1', 'EXIBETITULO', 'EXIBETÍTULO', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__SEMLINKDENOVASECAO__', '__SEMLINKDENOVASEÇÃO__', '__SEMLIGACAODENOVASECAO__', '__SEMLIGAÇÃODENOVASEÇÃO__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'REVISAOATUAL', 'REVISÃOATUAL', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'CODIFICAURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'CODIFICAANCORA:', 'CODIFICAÂNCORA:', 'ANCHORENCODE' ),
-       'language'                => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'IDIOMADOCONTEUDO', 'IDIOMADOCONTEÚDO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PAGINASNOESPACONOMINAL', 'PÁGINASNOESPAÇONOMINAL', 'PAGINASNODOMINIO', 'PÁGINASNODOMÍNIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'NUMERODEADMINISTRADORES', 'NÚMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
-       'defaultsort'             => array( '1', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAGINASNACATEGORIA', 'PÁGINASNACATEGORIA', 'PAGINASNACAT', 'PÁGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEXAR__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__NAOINDEXAR__', '__NÃOINDEXAR__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'NIVELDEPROTECAO', 'NÍVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
+       'redirect'                  => array( '0', '#REDIRECIONAMENTO', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__SEMTDC__', '__SEMSUMÁRIO__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__SEMGALERIA__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÁRIO__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__TDC__', '__SUMÁRIO__', '__SUMARIO__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NAOEDITARSECAO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÍTULO__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
+       'currentmonthabbrev'        => array( '1', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'DIAATUAL', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'DIAATUAL2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ANOATUAL', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'HORARIOATUAL', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'HORAATUAL', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
+       'localmonthabbrev'          => array( '1', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'ABREVIATURADOMESLOCAL', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'DIALOCAL', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'DIALOCAL2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'HORARIOLOCAL', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NUMERODEPAGINAS', 'NÚMERODEPÁGINAS', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NUMERODEARTIGOS', 'NÚMERODEARTIGOS', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÁRIOS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÁRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÁGINA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÁGINAC', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'DOMINIO', 'DOMÍNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'DOMINIOC', 'DOMÍNIOC', 'ESPACONOMINALC', 'ESPAÇONOMINALC', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'PAGINADEDISCUSSAO', 'PÁGINADEDISCUSSÃO', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'PAGINADEDISCUSSAOC', 'PÁGINADEDISCUSSÃOC', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'PAGINADECONTEUDO', 'PAGINADECONTEÚDO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'PAGINADECONTEUDOC', 'PAGINADECONTEÚDOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÁGINA', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NOMECOMPLETODAPAGINAC', 'NOMECOMPLETODAPÁGINAC', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NOMEDASUBPAGINA', 'NOMEDASUBPÁGINA', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NOMEDASUBPAGINAC', 'NOMEDASUBPÁGINAC', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NOMEDAPAGINABASE', 'NOMEDAPÁGINABASE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NOMEDAPAGINABASEC', 'NOMEDAPÁGINABASEC', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÁGINADEDISCUSSÃO', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÁGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÁGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÁGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'img_thumbnail'             => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'direita', 'right' ),
+       'img_left'                  => array( '1', 'esquerda', 'left' ),
+       'img_none'                  => array( '1', 'nenhum', 'none' ),
+       'img_center'                => array( '1', 'centro', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'semmoldura', 'semborda', 'frameless' ),
+       'img_page'                  => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'borda', 'border' ),
+       'img_baseline'              => array( '1', 'linhadebase', 'baseline' ),
+       'img_top'                   => array( '1', 'acima', 'top' ),
+       'img_middle'                => array( '1', 'meio', 'middle' ),
+       'img_bottom'                => array( '1', 'abaixo', 'bottom' ),
+       'img_link'                  => array( '1', 'ligação=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'NOMEDOSITE', 'NOMEDOSÍTIO', 'NOMEDOSITIO', 'SITENAME' ),
+       'server'                    => array( '0', 'SERVIDOR', 'SERVER' ),
+       'servername'                => array( '0', 'NOMEDOSERVIDOR', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'CAMINHODOSCRIPT', 'SCRIPTPATH' ),
+       'gender'                    => array( '0', 'GENERO', 'GÊNERO', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__SEMCONVERTERTITULO__', '__SEMCONVERTERTÍTULO__', '__SEMCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__SEMCONVERTERCONTEUDO__', '__SEMCONVERTERCONTEÚDO__', '__SEMCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'SEMANAATUAL', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'DIADASEMANAATUAL', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'DIADASEMANALOCAL', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDDAREVISAO', 'IDDAREVISÃO', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'DIADAREVISAO', 'DIADAREVISÃO', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'DIADAREVISAO2', 'DIADAREVISÃO2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MESDAREVISAO', 'MÊSDAREVISÃO', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ANODAREVISAO', 'ANODAREVISÃO', 'REVISIONYEAR' ),
+       'revisionuser'              => array( '1', 'USUARIODAREVISAO', 'USUÁRIODAREVISÃO', 'REVISIONUSER' ),
+       'fullurl'                   => array( '0', 'URLCOMPLETO:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLCOMPLETOC:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'PRIMEIRAMINUSCULA:', 'PRIMEIRAMINÚSCULA:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'PRIMEIRAMAIUSCULA:', 'PRIMEIRAMAIÚSCULA:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MINUSCULA', 'MINÚSCULA', 'MINUSCULAS', 'MINÚSCULAS', 'LC:' ),
+       'uc'                        => array( '0', 'MAIUSCULA', 'MAIÚSCULA', 'MAIUSCULAS', 'MAIÚSCULAS', 'UC:' ),
+       'displaytitle'              => array( '1', 'EXIBETITULO', 'EXIBETÍTULO', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__SEMLINKDENOVASECAO__', '__SEMLINKDENOVASEÇÃO__', '__SEMLIGACAODENOVASECAO__', '__SEMLIGAÇÃODENOVASEÇÃO__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'REVISAOATUAL', 'REVISÃOATUAL', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'CODIFICAURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'CODIFICAANCORA:', 'CODIFICAÂNCORA:', 'ANCHORENCODE' ),
+       'language'                  => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'IDIOMADOCONTEUDO', 'IDIOMADOCONTEÚDO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PAGINASNOESPACONOMINAL', 'PÁGINASNOESPAÇONOMINAL', 'PAGINASNODOMINIO', 'PÁGINASNODOMÍNIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NUMERODEADMINISTRADORES', 'NÚMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
+       'defaultsort'               => array( '1', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
+       'hiddencat'                 => array( '1', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAGINASNACATEGORIA', 'PÁGINASNACATEGORIA', 'PAGINASNACAT', 'PÁGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEXAR__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NAOINDEXAR__', '__NÃOINDEXAR__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVELDEPROTECAO', 'NÍVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
 );
 
 $messages = array(
@@ -315,7 +316,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Esconder edições patrulhadas nas mudanças recentes',
 'tog-newpageshidepatrolled' => 'Esconder páginas patrulhadas na lista de páginas novas',
 'tog-extendwatchlist' => 'Listagem expandida de todas as mudanças às páginas vigiadas, não apenas das mais recentes',
-'tog-usenewrc' => 'Usar a versão melhorada das mudanças recentes (requer JavaScript)',
+'tog-usenewrc' => 'Agrupar alterações por página nas mudanças recentes e 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 um clique duplo (JavaScript)',
@@ -323,17 +324,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Possibilitar a edição de secções por clique com o botão direito no título da secção (JavaScript)',
 'tog-showtoc' => 'Mostrar índice (para páginas com mais de três secções)',
 'tog-rememberpassword' => 'Recordar os meus dados neste browser (no máximo, durante $1 {{PLURAL:$1|dia|dias}})',
-'tog-watchcreations' => 'Adicionar as páginas que eu criar às minhas páginas vigiadas',
-'tog-watchdefault' => 'Adicionar as páginas que eu editar às minhas páginas vigiadas',
-'tog-watchmoves' => 'Adicionar as páginas que eu mover às minhas páginas vigiadas',
-'tog-watchdeletion' => 'Adicionar as páginas que eu eliminar às minhas páginas vigiadas',
+'tog-watchcreations' => 'Adicionar as páginas e ficheiros que eu criar às minhas páginas vigiadas',
+'tog-watchdefault' => 'Adicionar as páginas e ficheiros que eu editar às minhas páginas vigiadas',
+'tog-watchmoves' => 'Adicionar as páginas e ficheiros que eu mover às minhas páginas vigiadas',
+'tog-watchdeletion' => 'Adicionar as páginas e ficheiros que eu eliminar às minhas páginas vigiadas',
 'tog-minordefault' => 'Por omissão, marcar todas as edições como menores',
 'tog-previewontop' => 'Mostrar a antevisão antes da caixa de edição',
 'tog-previewonfirst' => 'Mostrar a antevisão na primeira edição',
 'tog-nocache' => 'Desactivar a cache de páginas do browser',
-'tog-enotifwatchlistpages' => 'Notificar-me por correio electrónico quando uma página vigiada é alterada',
+'tog-enotifwatchlistpages' => 'Notificar-me por correio electrónico quando uma página ou ficheiro vigiado for alterado',
 'tog-enotifusertalkpages' => 'Notificar-me por correio electrónico quando a minha página de discussão é editada',
-'tog-enotifminoredits' => 'Notificar-me por correio electrónico também quando as edições forem menores',
+'tog-enotifminoredits' => 'Notificar-me por correio electrónico também sobre edições menores de páginas ou ficheiros',
 'tog-enotifrevealaddr' => 'Revelar o meu endereço de correio electrónico nas notificações',
 'tog-shownumberswatching' => 'Mostrar o número de utilizadores a vigiar',
 'tog-oldsig' => 'Assinatura existente:',
@@ -349,7 +350,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Esconder edições de utilizadores autenticados ao listar mudanças às páginas vigiadas',
 'tog-watchlisthideanons' => 'Esconder edições de utilizadores anónimos ao listar mudanças às páginas vigiadas',
 'tog-watchlisthidepatrolled' => 'Esconder edições patrulhadas ao listar mudanças às páginas vigiadas',
-'tog-nolangconversion' => 'Impossibilitar a conversão de variantes da língua',
 'tog-ccmeonemails' => 'Enviar-me cópias das mensagens por correio electrónico que eu enviar a outros utilizadores',
 'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
 'tog-showhiddencats' => 'Mostrar categorias ocultas',
@@ -574,6 +574,10 @@ Consulte a página da [[Special:Version|versão do sistema]].',
 'youhavenewmessages' => 'Tem $1 ($2).',
 'newmessageslink' => 'mensagens novas',
 'newmessagesdifflink' => 'comparar com a penúltima revisão',
+'youhavenewmessagesfromusers' => 'Você tem $1 de {{PLURAL:$3|outro utilizador|$3 utilizadores}} ($2).',
+'youhavenewmessagesmanyusers' => 'Você tem $1 de muitos utilizadores ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|uma mensagem nova|mensagens novas}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|última alteração|últimas alterações}}',
 'youhavenewmessagesmulti' => 'Tem mensagens novas em $1',
 'editsection' => 'editar',
 'editold' => 'editar',
@@ -620,7 +624,7 @@ Isto pode também indicar um defeito no software da {{SITENAME}}.',
 'nosuchspecialpage' => 'Esta página especial não existe',
 'nospecialpagetext' => '<strong>Solicitou uma página especial inválida.</strong>
 
-Uma lista das páginas especiais válidas pode ser encontrada em [[Special:SpecialPages|{{int:specialpages}}]].',
+Encontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Erro',
@@ -667,6 +671,8 @@ Anote a URL e reporte este incidente a um [[Special:ListUsers/sysop|administrado
 'cannotdelete' => 'Não foi possível eliminar a página ou ficheiro "$1".
 Pode já ter sido eliminado por outro utilizador.',
 'cannotdelete-title' => 'Não é possível eliminar a página "$1"',
+'delete-hook-aborted' => 'A eliminação foi cancelada por um "hook".
+Não foi dada nenhuma explicação.',
 'badtitle' => 'Título inválido',
 'badtitletext' => 'O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorrecto.
 Talvez contenha um ou mais caracteres que não podem ser usados em títulos.',
@@ -683,7 +689,7 @@ Consulta: $2',
 'actionthrottledtext' => 'Como medida anti-spam, está impedido de realizar esta operação demasiadas vezes num espaço de tempo curto e já excedeu esse limite. Tente de novo dentro de alguns minutos, por favor.',
 'protectedpagetext' => 'Esta página foi protegida contra novas edições.',
 'viewsourcetext' => 'Pode ver e copiar o conteúdo desta página:',
-'viewyourtext' => "Você pode ver e copiar o código-fonte das '''suas edições''' a esta página:",
+'viewyourtext' => "Pode ver e copiar o código-fonte das '''suas edições''' desta página:",
 'protectedinterface' => 'Esta página fornece o texto da interface ao software e está protegida para prevenir abusos.',
 'editinginterface' => "'''Aviso:''' Está a editar uma página usada para fornecer texto de interface ao software. Alterações a esta página afectarão a aparência da interface de utilizador para os outros utilizadores. Para traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projecto destinado à tradução do MediaWiki.",
 'sqlhidden' => '(Consulta SQL em segundo-plano)',
@@ -700,6 +706,8 @@ A justificação foi "\'\'$2\'\'".',
 O administrador que efetuou o bloqueio deu a seguinte explicação: "$3".',
 'invalidtitle-knownnamespace' => 'Título inválido com o espaço nominal "$2" e texto "$3"',
 'invalidtitle-unknownnamespace' => 'Título inválido com número de espaço nominal $1 desconhecido e texto "$2"',
+'exception-nologin' => 'Não está autenticado',
+'exception-nologin-text' => 'Esta página ou operação requer que esteja autenticado nesta wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Má configuração: antivírus desconhecido: ''$1''",
@@ -720,6 +728,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências na
 'remembermypassword' => 'Recordar os meus dados neste computador (no máximo, por $1 {{PLURAL:$1|dia|dias}})',
 '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.',
 'externaldberror' => 'Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido actualizar a sua conta externa.',
 'login' => 'Autenticação',
 'nav-login-createaccount' => 'Entrar / criar conta',
@@ -792,7 +801,7 @@ Não serão enviados correios de nenhuma das seguintes funcionalidades.',
 'emailconfirmlink' => 'Confirme o seu endereço de correio electrónico',
 'invalidemailaddress' => 'O endereço de correio electrónico não pode ser aceite porque parece ter um formato inválido.
 Introduza um endereço formatado correctamente ou deixe o campo vazio.',
-'cannotchangeemail' => 'A conta de e-mail não pode ser alterado nesta wiki.',
+'cannotchangeemail' => 'Os endereços de correio electrónico das contas não podem ser alterados nesta wiki.',
 'emaildisabled' => 'Este site não consegue enviar e-mails.',
 'accountcreated' => 'Conta criada',
 'accountcreatedtext' => 'A conta de utilizador para $1 foi criada.',
@@ -804,7 +813,7 @@ Se a conta foi criada por engano, pode ignorar esta mensagem.',
 'usernamehasherror' => 'O nome de utilizador não pode conter o símbolo de cardinal (#).',
 'login-throttled' => 'Realizou demasiadas tentativas de autenticação com esta conta.
 Aguarde antes de tentar novamente, por favor.',
-'login-abort-generic' => 'A sua autenticação não teve êxito - Abortada',
+'login-abort-generic' => 'A sua autenticação não teve êxito - Cancelada',
 'loginlanguagelabel' => 'Língua: $1',
 'suspicious-userlogout' => 'O seu pedido para sair foi negado porque parece ter sido enviado por um browser danificado ou por um proxy com cache.',
 
@@ -822,7 +831,7 @@ Para prosseguir, será necessário definir uma nova palavra-chave.',
 'newpassword' => 'Palavra-chave nova:',
 'retypenew' => 'Repita a palavra-chave nova:',
 'resetpass_submit' => 'Definir palavra-chave e entrar',
-'resetpass_success' => 'Sua palavra-chave foi alterada com sucesso! Autenticando-se...',
+'resetpass_success' => 'A sua palavra-chave foi alterada! Autenticação em curso...',
 'resetpass_forbidden' => 'Não é possível alterar palavras-chave',
 'resetpass-no-info' => 'Precisa estar autenticado para aceder directamente a esta página.',
 'resetpass-submit-loggedin' => 'Alterar palavra-chave',
@@ -835,7 +844,7 @@ Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova pal
 'passwordreset' => 'Repor palavra-chave',
 'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta por correio electrónico.',
 'passwordreset-legend' => 'Reiniciar a palavra-chave',
-'passwordreset-disabled' => 'Reiniciar a palavra-chave foi impossibilitado nesta wiki.',
+'passwordreset-disabled' => 'O reinício da palavra-chave foi impossibilitado nesta wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
 'passwordreset-username' => 'Nome de utilizador:',
 'passwordreset-domain' => 'Domínio:',
@@ -875,10 +884,10 @@ Palavra-chave temporária: $2',
 'bold_tip' => 'Texto a negrito',
 'italic_sample' => 'Texto em itálico',
 'italic_tip' => 'Texto em itálico',
-'link_sample' => 'Título do link',
-'link_tip' => 'Link interno',
-'extlink_sample' => 'http://www.example.com link externo',
-'extlink_tip' => 'Link externo (lembre-se do prefixo http://)',
+'link_sample' => 'Título da ligação',
+'link_tip' => 'Ligação interna',
+'extlink_sample' => 'http://www.example.com título da ligação',
+'extlink_tip' => 'Ligação externo (lembre-se do prefixo http://)',
 'headline_sample' => 'Texto do cabeçalho',
 'headline_tip' => 'Secção de nível 2',
 'nowiki_sample' => 'Inserir texto não-formatado aqui',
@@ -886,7 +895,7 @@ Palavra-chave temporária: $2',
 'image_sample' => 'Exemplo.jpg',
 'image_tip' => 'Ficheiro embutido',
 'media_sample' => 'Exemplo.ogg',
-'media_tip' => 'Link para ficheiro',
+'media_tip' => 'Ligação para ficheiro',
 'sig_tip' => 'A sua assinatura, com hora e data',
 'hr_tip' => 'Linha horizontal (utilize moderadamente)',
 
@@ -956,7 +965,7 @@ Ela pode ter sido movida ou removida enquanto estava a ver a página.',
 
 A palavra-chave para esta nova conta pode ser alterada na página [[Special:ChangePassword|alterar palavra-chave]] após autenticação.',
 'newarticle' => '(Nova)',
-'newarticletext' => "Seguiu um link para uma página que ainda não existe.
+'newarticletext' => "Seguiu uma ligação para uma página que ainda não existe.
 Para criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [[{{MediaWiki:Helppage}}|página de ajuda]] para mais detalhes).
 Se chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu browser.",
 'anontalkpagetext' => "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).
@@ -969,6 +978,10 @@ ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.',
 'noarticletext-nopermission' => 'Ainda não existe texto nesta página.
 Pode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas
 ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar registos relacionados]</span>.',
+'missing-revision' => 'A revisão #$1 da página denominada "{{PAGENAME}}" não existe.
+
+Isto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.
+Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].',
 'userpage-userdoesnotexist' => 'A conta "<nowiki>$1</nowiki>" não se encontra registada.
 Verifique se deseja realmente criar ou editar esta página, por favor.',
 'userpage-userdoesnotexist-view' => 'A conta de utilizador "$1" não está registada.',
@@ -1099,8 +1112,9 @@ Estes argumentos foram omitidos.',
 'node-count-exceeded-warning' => 'A página excedeu o total de nós',
 'expansion-depth-exceeded-category' => 'Páginas em que a profundidade de expansão é excedida',
 'expansion-depth-exceeded-warning' => 'A página excedeu a profundidade de expansão',
-'parser-unstrip-loop-warning' => 'Detectado loop unstrip',
+'parser-unstrip-loop-warning' => 'Foi detectado um ciclo infinito unstrip',
 'parser-unstrip-recursion-limit' => 'Limite de recursão do unstrip excedido ($1)',
+'converter-manual-rule-error' => 'Erro detetado na regra de conversão de língua manual',
 
 # "Undo" feature
 'undo-success' => 'É possível desfazer a edição.
@@ -1260,8 +1274,8 @@ Certifique-se de que esta alteração manterá a continuidade histórica da pág
 'mergehistory-from' => 'Página de origem:',
 'mergehistory-into' => 'Página de destino:',
 'mergehistory-list' => 'Histórico de edições fundíveis',
-'mergehistory-merge' => 'As seguintes revisões de [[:$1]] podem fundir-se em [[:$2]].
-Usando os botões de opção, pode escolher fundir apenas as revisões até àquela que marcar.
+'mergehistory-merge' => 'As seguintes edições de [[:$1]] podem ser fundidas em [[:$2]].
+Usando os botões de opção, pode escolher fundir apenas as edições até àquela que marcar.
 Note que, se usar os links de navegação, os botões de opção voltarão aos valores originais.',
 'mergehistory-go' => 'Mostrar edições que podem ser fundidas',
 'mergehistory-submit' => 'Fundir edições',
@@ -1285,6 +1299,8 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
 
 # Diffs
 'history-title' => 'Histórico de edições de "$1"',
+'difference-title' => 'Diferenças entre edições de "$1"',
+'difference-title-multipage' => 'Diferenças entre as páginas "$1" e "$2"',
 'difference-multipage' => '(Diferenças entre páginas)',
 'lineno' => 'Linha $1:',
 'compareselectedversions' => 'Comparar as versões seleccionadas',
@@ -1292,6 +1308,10 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
 'editundo' => 'desfazer',
 'diff-multi' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de {{PLURAL:$2|um utilizador|$2 utilizadores}} {{PLURAL:$1|não apresentada|não apresentadas}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de mais de {{PLURAL:$2|um utilizador|$2 utilizadores}} não {{PLURAL:$1|apresentada|apresentadas}})',
+'difference-missing-revision' => '{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.
+
+Isto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.
+Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].',
 
 # Search results
 'searchresults' => 'Resultados da pesquisa',
@@ -1346,7 +1366,7 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
 'showingresultsheader' => "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1–$2''' de '''$3'''}} para '''$4'''",
 'nonefound' => "'''Nota''': Por omissão, só alguns dos espaços nominais são pesquisados.
 Tente usar o prefixo ''all:'' para pesquisar todo o conteúdo (incluindo páginas de discussão, predefinições, etc.), ou use como prefixo o espaço nominal desejado.",
-'search-nonefound' => 'A pesquisa não produziu quaisquer resultados.',
+'search-nonefound' => 'A pesquisa não produziu resultados.',
 'powersearch' => 'Pesquisa avançada',
 'powersearch-legend' => 'Pesquisa avançada',
 'powersearch-ns' => 'Pesquisar nos espaços nominais:',
@@ -1367,7 +1387,7 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'qbsettings-fixedright' => 'Fixa à direita',
 'qbsettings-floatingleft' => 'Flutuante à esquerda',
 'qbsettings-floatingright' => 'Flutuante à direita',
-'qbsettings-directionality' => 'Fixado, a dependener da direccionalidade do script da sua língua',
+'qbsettings-directionality' => 'Fixa, conforme a direccionalidade da escrita na sua língua',
 
 # Preferences page
 'preferences' => 'Preferências',
@@ -1382,6 +1402,7 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'prefs-beta' => 'Funcionalidades beta',
 'prefs-datetime' => 'Data e hora',
 'prefs-labs' => 'Funcionalidades dos laboratórios',
+'prefs-user-pages' => 'Páginas de utilizador',
 'prefs-personal' => 'Perfil de utilizador',
 'prefs-rc' => 'Mudanças recentes',
 'prefs-watchlist' => 'Páginas vigiadas',
@@ -1470,7 +1491,7 @@ Esta informação será pública.',
 'prefs-help-realname' => 'Opcional: se optar por revelar o seu nome verdadeiro, este será utilizado para atribuir-lhe crédito pelo seu trabalho.',
 'prefs-help-email' => 'Opcional: o endereço de correio electrónico é opcional, mas será necessário para reiniciar a palavra-chave caso esqueça a antiga.',
 'prefs-help-email-others' => 'Também pode optar por permitir que outros entrem em contacto consigo por correio electrónico, através de um link nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio electrónico.',
-'prefs-help-email-required' => 'O endereço de correio electrónico é requerido.',
+'prefs-help-email-required' => 'É necessário o endereço de correio electrónico.',
 'prefs-info' => 'Informações básicas',
 'prefs-i18n' => 'Internacionalização',
 'prefs-signature' => 'Assinatura',
@@ -1524,9 +1545,9 @@ Esta informação será pública.',
 
 'group-user-member' => '{{GENDER:$1|utilizador|utilizadora}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|utilizador autoconfirmado|utilizadora autoconfirmada}}',
-'group-bot-member' => 'robô',
+'group-bot-member' => '{{GENDER:$1|robô}}',
 'group-sysop-member' => '{{GENDER:$1|administrador|administradora}}',
-'group-bureaucrat-member' => 'burocrata',
+'group-bureaucrat-member' => '{{GENDER:$1|burocrata}}',
 'group-suppress-member' => '{{GENDER:$1|supressor|supressora}}',
 
 'grouppage-user' => '{{ns:project}}:Utilizadores',
@@ -1561,6 +1582,7 @@ Esta informação será pública.',
 'right-writeapi' => 'Usar a API de escrita',
 'right-delete' => 'Eliminar páginas',
 'right-bigdelete' => 'Eliminar páginas com histórico grande',
+'right-deletelogentry' => 'Eliminar e restaurar entradas específicas de registos',
 'right-deleterevision' => 'Eliminar e restaurar edições específicas de páginas',
 'right-deletedhistory' => 'Ver entradas de histórico eliminadas, sem o texto associado',
 'right-deletedtext' => 'Ver texto eliminado e mudanças entre revisões eliminadas',
@@ -1706,9 +1728,9 @@ Para ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:Fil
 Os reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de uploads]] e as eliminações no [[Special:Log/delete|registo de eliminações]].
 
 Para utilizar um ficheiro numa página, depois de ter feito o upload, insira um link com um dos seguintes formatos:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></tt>''' para mostrar uma imagem nas suas dimensões originais;
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></tt>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></tt>''' para apresentar um link directo para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar um link directo para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
 'upload-permitted' => 'Tipos de ficheiros permitidos: $1.',
 'upload-preferred' => 'Tipos de ficheiros preferidos: $1.',
 'upload-prohibited' => 'Tipos de ficheiro proibidos: $1.',
@@ -1728,7 +1750,7 @@ Consulte a [[Special:NewFiles|galeria de novos ficheiros]] para visioná-los.',
 'minlength1' => 'Os nomes de ficheiros devem de ter pelo menos uma letra.',
 'illegalfilename' => 'O nome do ficheiro "$1" contém caracteres que não são permitidos no título das páginas.
 Altere o nome do ficheiro e tente enviá-lo novamente, por favor.',
-'filename-toolong' => 'Os nomes de arquivo não podem ser superiores a 240 bytes.',
+'filename-toolong' => 'Os nomes de ficheiros não podem ter mais de 240 bytes.',
 'badfilename' => 'O nome do ficheiro foi alterado para "$1".',
 'filetype-mime-mismatch' => 'A extensão ".$1" não corresponde ao tipo MIME do ficheiro ($2).',
 'filetype-badmime' => 'Não é permitido carregar ficheiros do tipo MIME "$1".',
@@ -1756,21 +1778,21 @@ este tem $2.',
 Isto pode dever-se a um erro no nome do ficheiro.
 Verifique se é realmente este o ficheiro que deseja carregar, por favor.',
 'windows-nonascii-filename' => 'A wiki não aceita nomes de ficheiros com caracteres especiais.',
-'fileexists' => "Já existe um ficheiro com este nome.
-Verifique '''<tt>[[:$1]]</tt>''' caso não tenha a certeza de que quer alterar o ficheiro actual, por favor.
-[[$1|thumb]]",
-'filepageexists' => "A página de descrição deste ficheiro já foi criada em '''<tt>[[:$1]]</tt>''', mas neste momento não existe nenhum ficheiro com este nome.
+'fileexists' => 'Já existe um ficheiro com este nome.
+Verifique <strong>[[:$1]]</strong> caso não tenha a certeza de que quer alterar o ficheiro actual, por favor.
+[[$1|thumb]]',
+'filepageexists' => 'A página de descrição deste ficheiro já foi criada em <strong>[[:$1]]</strong>, mas neste momento não existe nenhum ficheiro com este nome.
 O resumo que introduzir não aparecerá na página de descrição.
 Para fazê-lo aparecer, terá de editar a página manualmente.
-[[$1|thumb]]",
-'fileexists-extension' => "Já existe um ficheiro de nome semelhante: [[$2|thumb]]
-* Nome do ficheiro que está sendo carregado: '''<tt>[[:$1]]</tt>'''
-* Nome do ficheiro existente: '''<tt>[[:$2]]</tt>'''
-Escolha um nome diferente, por favor.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Já existe um ficheiro de nome semelhante: [[$2|thumb]]
+* Nome do ficheiro que está sendo carregado: <strong>[[:$1]]</strong>
+* Nome do ficheiro existente: <strong>[[:$2]]</strong>
+Escolha um nome diferente, por favor.',
 'fileexists-thumbnail-yes' => "O ficheiro aparenta ser uma imagem de tamanho reduzido (''miniatura'', ou ''thumbnail)''. [[$1|thumb]]
-Verifique o ficheiro '''<tt>[[:$1]]</tt>''', por favor.
+Verifique o ficheiro <strong>[[:$1]]</strong>, por favor.
 Se este ficheiro é a mesma imagem mas no tamanho original, não é necessário carregar uma miniatura.",
-'file-thumbnail-no' => "O nome do ficheiro começa por '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "O nome do ficheiro começa por <strong>$1</strong>.
 Parece ser uma imagem de tamanho reduzido (uma ''miniatura'' ou ''thumbnail)''.
 Se tiver a imagem original de maior dimensão, envie-a em vez desta. Se não, altere o nome do ficheiro, por favor.",
 'fileexists-forbidden' => 'Já existe um ficheiro com este nome, e não pode ser reescrito.
@@ -1856,38 +1878,40 @@ Caso o problema persista, contacte um [[Special:ListUsers/sysop|administrador]].
 'backend-fail-copy' => 'Não foi possível copiar o ficheiro $1 para $2.',
 'backend-fail-move' => 'Não é possível mover o ficheiro $1 para $2.',
 'backend-fail-opentemp' => 'Não foi possível abrir o ficheiro temporário.',
-'backend-fail-writetemp' => 'Não foi possível gravar para arquivo temporário.',
-'backend-fail-closetemp' => 'Não foi possível fechar o arquivo temporário.',
-'backend-fail-read' => 'Não foi possível ler o arquivo $1.',
-'backend-fail-create' => 'Não foi possível criar o arquivo $1.',
-'backend-fail-maxsize' => 'Não foi possível criar o ficheiro  $1  porque ele é maior do que  {{PLURAL:$2| um byte| $2  bytes}}.',
+'backend-fail-writetemp' => 'Não foi possível escrever no ficheiro temporário.',
+'backend-fail-closetemp' => 'Não foi possível fechar o ficheiro temporário.',
+'backend-fail-read' => 'Não foi possível ler o ficheiro $1.',
+'backend-fail-create' => 'Não foi possível gravar o ficheiro $1.',
+'backend-fail-maxsize' => 'Não foi possível gravar o ficheiro $1 porque tem mais do que {{PLURAL:$2|um byte|$2 bytes}}.',
 'backend-fail-readonly' => 'O servidor de armazenamento "$1" está actualmente no modo "somente leitura". A razão dada foi: "$2"',
-'backend-fail-synced' => 'O ficheiro" $1 " está em um estado inconsistente dentro da base de dados',
+'backend-fail-synced' => 'O ficheiro "$1" está num estado inconsistente nos servidores de armazenamento interno',
 'backend-fail-connect' => 'Não foi possível estabelecer ligação com o servidor de armazenamento "$1".',
 'backend-fail-internal' => 'Ocorreu um erro desconhecido no servidor de armazenamento "$1".',
-'backend-fail-contenttype' => 'Não foi possível determinar o tipo de conteúdo do ficheiro para armazenar em " $1 ".',
-'backend-fail-batchsize' => 'Foi fornecido um bloco de $1 {{PLURAL:$1|operação|operações}} sobre ficheiros ao servidor backend de armazenamento; o limite é de $2 {{PLURAL:$2|operação|operações}}.',
+'backend-fail-contenttype' => 'Não foi possível determinar o tipo de conteúdo do ficheiro para armazenar em "$1".',
+'backend-fail-batchsize' => 'Foi fornecido um bloco de $1 {{PLURAL:$1|operação|operações}} sobre ficheiros ao servidor de armazenamento; o limite é de $2 {{PLURAL:$2|operação|operações}}.',
+'backend-fail-usable' => 'Não foi possível gravar o ficheiro $1 devido a permissões insuficientes ou a directórios ou repositórios inexistentes.',
 
 # File journal errors
-'filejournal-fail-dbconnect' => 'Não foi possível ligar à base de dados de registos no "backend" de armazenamento "$1".',
-'filejournal-fail-dbquery' => 'Não foi possível atualizar a base de dados de registos do "backend" de armazenamento "$1".',
+'filejournal-fail-dbconnect' => 'Não foi possível estabelecer ligação à base de dados de registos no servidor de armazenamento "$1".',
+'filejournal-fail-dbquery' => 'Não foi possível atualizar a base de dados de registos do servidor de armazenamento "$1".',
 
 # Lock manager
-'lockmanager-notlocked' => 'Não foi possível desbloquear " $1 "; não se encontra bloqueado.',
+'lockmanager-notlocked' => 'Não foi possível desbloquear "$1" porque não se encontra bloqueado.',
 'lockmanager-fail-closelock' => 'Não foi possível encerrar a referência de bloqueio para "$1".',
 'lockmanager-fail-deletelock' => 'Não foi possível eliminar a referência de bloqueio para "$1".',
 'lockmanager-fail-acquirelock' => 'Não foi possível adquirir bloqueio para "$1".',
-'lockmanager-fail-openlock' => 'Não foi possível abrir ficheiro de bloqueio para "$1".',
-'lockmanager-fail-releaselock' => 'Não foi possível libertar bloqueio para "$1".',
+'lockmanager-fail-openlock' => 'Não foi possível abrir o ficheiro de bloqueio de "$1".',
+'lockmanager-fail-releaselock' => 'Não foi possível libertar o bloqueio de "$1".',
 'lockmanager-fail-db-bucket' => 'Não foi possível contactar bases de dados de bloqueio suficientes no "bucket" $1.',
 'lockmanager-fail-db-release' => 'Não foi possível libertar bloqueios na base de dados $1.',
+'lockmanager-fail-svr-acquire' => 'Não foi possível obter bloqueios no servidor $1.',
 'lockmanager-fail-svr-release' => 'Não foi possível libertar bloqueios no servidor $1.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Foi encontrado um erro ao abrir o ficheiro ZIP para verificação.',
 'zip-wrong-format' => 'O ficheiro especificado não é um ficheiro ZIP.',
 'zip-bad' => 'O ficheiro ZIP encontra-se corrompido ou não é legível.
-A sua segurança não pode ser devidamente verificada.',
+A segurança do mesmo não pode ser devidamente verificada.',
 'zip-unsupported' => 'Este ficheiro ZIP usa funcionalidades ZIP não suportadas pelo MediaWiki.
 A sua segurança não pode ser devidamente verificada.',
 
@@ -1906,7 +1930,7 @@ A sua segurança não pode ser devidamente verificada.',
 'img-auth-nopathinfo' => 'PATH_INFO em falta.
 O seu servidor não está configurado para passar esta informação.
 Pode ser baseado em CGI e não consegue suportar img_auth.
-Consulte a documentação em [//www.mediawiki.org/wiki/Manual:Image_Authorization Image Authorization].',
+Consulte a documentação em https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'O endereço especificado não conduz ao directório de carregamento de ficheiros configurado.',
 'img-auth-badtitle' => 'Não é possível construir um título válido a partir de "$1".',
 'img-auth-nologinnWL' => 'Não está autenticado e o ficheiro "$1" não está na lista branca.',
@@ -1945,8 +1969,8 @@ Verifique se o endereço está correcto e o site disponível, por favor.',
 'upload_source_file' => ' (um ficheiro no seu computador)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Esta página especial mostra todos os ficheiros carregados.
-Quando filtrados pelo usuário, os últimos ficheiros carregados aparecem no topo da lista.',
+'listfiles-summary' => 'Esta página especial lista todos os ficheiros carregados.
+Quando filtrada por utilizador, só lista os ficheiros cuja última versão foi carregada pelo utilizador.',
 'listfiles_search_for' => 'Pesquisar por nome de imagem:',
 'imgfile' => 'ficheiro',
 'listfiles' => 'Ficheiros',
@@ -1988,11 +2012,11 @@ Encontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].',
 'sharedupload-desc-there' => 'Este ficheiro provém de $1 e pode ser usado por outros projectos.
 Consulte a [$2 página de descrição do ficheiro] para mais informações, por favor.',
 'sharedupload-desc-here' => 'Este ficheiro provém de $1 e pode ser usado por outros projectos.
-A descrição na [$2 página de descrição] é mostrada abaixo.',
+A descrição na [$2 página original de descrição do ficheiro] é mostrada abaixo.',
 'sharedupload-desc-edit' => 'Este ficheiro provém de $1 e pode ser utilizado por outros projetos.
-Talvez você pretenda editar a descrição na sua [$2 página de descrição de ficheiro] lá.',
+Talvez queira editar a descrição na [$2 página original de descrição do ficheiro].',
 'sharedupload-desc-create' => 'Este ficheiro provém de $1 e pode ser utilizado por outros projetos.
-Talvez você pretenda editar a descrição na sua [$2 página de descrição de ficheiro] lá.',
+Talvez queira editar a descrição na [$2 página original de descrição do ficheiro].',
 'filepage-nofile' => 'Não existe nenhum ficheiro com este nome.',
 'filepage-nofile-link' => 'Não existe nenhum ficheiro com este nome, mas pode [$1 carregá-lo].',
 'uploadnewversion-linktext' => 'Carregar uma nova versão deste ficheiro',
@@ -2027,11 +2051,11 @@ Talvez você pretenda editar a descrição na sua [$2 página de descrição de
 ** Ficheiro duplicado',
 'filedelete-edit-reasonlist' => 'Editar motivos de eliminação',
 'filedelete-maintenance' => 'Eliminação e restauro de ficheiros foram temporariamente impossibilitadas durante a manutenção.',
-'filedelete-maintenance-title' => 'Não é possível excluir o ficheiro',
+'filedelete-maintenance-title' => 'Não é possível eliminar o ficheiro',
 
 # MIME search
 'mimesearch' => 'Pesquisa MIME',
-'mimesearch-summary' => 'Esta página permite pesquisar os ficheiros da wiki, filtrando-os a partir do seu tipo MIME. O tipo MIME deve ser especificado na forma: tipo/subtipo. Alguns exemplos de tipos frequentes: <tt>image/jpeg</tt>, <tt>image/gif</tt>, <tt>image/png</tt>, <tt>application/pdf</tt>, <tt>application/vnd.ms-excel</tt>, <tt>application/zip</tt>, <tt>application/vnd.ms-powerpoint</tt>.',
+'mimesearch-summary' => 'Esta página permite pesquisar os ficheiros da wiki, filtrando-os a partir do seu tipo MIME. O tipo MIME deve ser especificado na forma: tipo/subtipo. Alguns exemplos de tipos frequentes: <code>image/jpeg</code>, <code>image/gif</code>, <code>image/png</code>, <code>application/pdf</code>, <code>application/vnd.ms-excel</code>, <code>application/zip</code>, <code>application/vnd.ms-powerpoint</code>.',
 'mimetype' => 'Tipo MIME:',
 'download' => 'download',
 
@@ -2077,9 +2101,9 @@ Talvez você pretenda editar a descrição na sua [$2 página de descrição de
 
 'disambiguations' => 'Páginas com ligações para páginas de desambiguação',
 'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => 'As páginas abaixo contêm links para uma página de desambiguação.
-Estes links deviam ser desambiguados, apontando-os para a página apropriada.<br />
-Considera-se que uma página é de desambiguação se nela for utilizada uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].',
+'disambiguations-text' => "As páginas abaixo contêm pelo menos um link para uma '''página de desambiguação'''.
+Estes links deviam ser desambiguados, apontando-os para uma página mais apropriada.<br />
+Considera-se que uma página é de desambiguação se nela for utilizada uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Redireccionamentos duplos',
 'doubleredirectstext' => 'Esta página lista todas as páginas que redireccionam para outras páginas de redireccionamento.
@@ -2125,7 +2149,7 @@ Agora redirecciona para [[$2]].',
 'wantedpages' => 'Páginas desejadas',
 'wantedpages-badtitle' => 'Título inválido no conjunto de resultados: $1',
 'wantedfiles' => 'Ficheiros desejados',
-'wantedfiletext-cat' => 'Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>. Adicionalmente, páginas que incorporam ficheiros que não existem estão listadas em [[:$1]].',
+'wantedfiletext-cat' => 'Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>. Adicionalmente, as páginas que incorporam ficheiros que não existem estão listadas em [[:$1]].',
 'wantedfiletext-nocat' => 'Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>.',
 'wantedtemplates' => 'Predefinições desejadas',
 'mostlinked' => 'Páginas com mais afluentes',
@@ -2143,7 +2167,7 @@ Agora redirecciona para [[$2]].',
 'protectedpages' => 'Páginas protegidas',
 'protectedpages-indef' => 'Apenas protecções infinitas',
 'protectedpages-cascade' => 'Apenas protecções em cascata',
-'protectedpagestext' => 'As seguintes páginas encontram-se protegidas contra edições ou movimentações',
+'protectedpagestext' => 'As seguintes páginas estão protegidas contra edição ou movimentação',
 'protectedpagesempty' => 'Neste momento, nenhuma das páginas está protegida com estes parâmetros.',
 'protectedtitles' => 'Títulos protegidos',
 'protectedtitlestext' => 'Os títulos a seguir encontram-se protegidos contra criação',
@@ -2186,6 +2210,7 @@ No entanto, outros sites na internet podem ter links para um ficheiro através d
 Pode reduzir a lista escolhendo um tipo de registo, um nome de utilizador ou um título de página. Respeite maiúsculas e minúsculas.',
 'logempty' => 'Não há dados a apresentar.',
 'log-title-wildcard' => 'Procurar títulos iniciados por este texto',
+'showhideselectedlogentries' => 'Mostrar ou ocultar as entradas seleccionadas',
 
 # Special:AllPages
 'allpages' => 'Todas as páginas',
@@ -2207,8 +2232,8 @@ Talvez contenha um ou mais caracteres que não podem ser usados nos títulos.',
 'allpages-hide-redirects' => 'Ocultar redirecionamentos',
 
 # SpecialCachedPage
-'cachedspecial-viewing-cached-ttl' => 'Você está a visualizar uma versão desta página em cache que tem uma antiguidade máxima de $1.',
-'cachedspecial-viewing-cached-ts' => 'Você está a visualizar uma versão desta página em cache que pode não refletir totalmente a situação atual.',
+'cachedspecial-viewing-cached-ttl' => 'Está a ver uma versão desta página guardada na cache há pelo menos $1.',
+'cachedspecial-viewing-cached-ts' => 'Está a ver uma versão da página guardada na cache, que pode estar desatualizada.',
 'cachedspecial-refresh-now' => 'Ver mais recente.',
 
 # Special:Categories
@@ -2232,7 +2257,7 @@ Veja também as [[Special:WantedCategories|categorias desejadas]].',
 'linksearch-ok' => 'Prosseguir',
 'linksearch-text' => 'É possível usar caracteres de substituição \'\'(wildcards)\'\', como por exemplo: "*.wikipedia.org".
 É necessário, pelo menos, um domínio de topo, por exemplo "*.org".<br />
-Protocolos suportados: <tt>$1</tt> (não adicione nenhum destes na sua pesquisa).',
+Protocolos suportados: <code>$1</code> (não adicione nenhum destes na sua pesquisa).',
 'linksearch-line' => 'Link para $1 na página $2',
 'linksearch-error' => "Caracteres de substituição ''(wildcards)'' só podem ser usados no início do endereço.",
 
@@ -2275,14 +2300,14 @@ Encontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações
 'listgrouprights-removegroup-self-all' => 'Remover a própria conta de todos os grupos',
 
 # E-mail user
-'mailnologin' => 'Nenhum endereço de envio',
+'mailnologin' => 'Não existe endereço de envio',
 'mailnologintext' => 'Precisa de estar [[Special:UserLogin|autenticado]] e possuir um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio electrónico a outros utilizadores.',
-'emailuser' => 'Enviar-lhe um e-mail',
-'emailpage' => 'Contactar utilizador',
+'emailuser' => 'Enviar correio electrónico a este utilizador',
+'emailpage' => 'Enviar correio electrónico ao utilizador',
 'emailpagetext' => 'Pode usar o formulário abaixo para enviar uma mensagem por correio electrónico para este utilizador.
 O endereço de correio que introduziu nas suas [[Special:Preferences|preferências]] irá aparecer no campo do remetente da mensagem "De:", para que o destinatário lhe possa responder directamente.',
 'usermailererror' => 'O sistema de correio devolveu o erro:',
-'defemailsubject' => 'E-mail do usuário "$1" da {{SITENAME}}',
+'defemailsubject' => 'Correio electrónico da {{SITENAME}}, do utilizador "$1"',
 'usermaildisabled' => 'Correio electrónico do utilizador foi desactivado',
 'usermaildisabledtext' => 'Não pode enviar correio electrónico aos outros utilizadores desta wiki',
 'noemailtitle' => 'Sem endereço de correio electrónico',
@@ -2315,8 +2340,8 @@ O endereço de correio que introduziu nas suas [[Special:Preferences|preferênci
 'watchlistfor2' => 'Para $1 $2',
 'nowatchlist' => 'A sua lista de páginas vigiadas está vazia.',
 'watchlistanontext' => 'Precisa de $1 para ver ou editar a sua lista de páginas vigiadas, por favor.',
-'watchnologin' => 'Não está autenticado',
-'watchnologintext' => 'Precisa de estar [[Special:UserLogin|autenticado]] para modificar a sua lista de páginas vigiadas.',
+'watchnologin' => 'Não está autenticado(a)',
+'watchnologintext' => 'Precisa de [[Special:UserLogin|autenticar-se]] para modificar a sua lista de páginas vigiadas.',
 'addwatch' => 'Adicionar às páginas vigiadas',
 'addedwatchtext' => "A página \"[[:\$1]]\" foi adicionada à sua lista de [[Special:Watchlist|páginas vigiadas]], onde serão indicadas quaisquer
 modificações futuras desta página e da respectiva página de discussão.
@@ -2425,6 +2450,8 @@ prossiga com precaução.',
 'rollback' => 'Reverter edições',
 'rollback_short' => 'Voltar',
 'rollbacklink' => 'voltar',
+'rollbacklinkcount' => 'reverter $1 {{PLURAL:$1|edição|edições}}',
+'rollbacklinkcount-morethan' => 'reverter mais do que $1 {{PLURAL:$1|edição|edições}}',
 'rollbackfailed' => 'A reversão falhou',
 'cantrollback' => 'Não foi possível reverter a edição; o último contribuidor é o único autor desta página',
 'alreadyrolled' => 'Não foi possível reverter as edições de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2439,8 +2466,8 @@ A última edição foi de [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-
 # Edit tokens
 'sessionfailure-title' => 'Erro de sessão',
 'sessionfailure' => 'Foram detectados problemas com a sua sessão;
-esta operação foi cancelada como medida de protecção contra a intercepção de sessões.
-Clique o botão "Voltar" e recarregue a página de onde veio, depois tente novamente.',
+a operação foi cancelada como medida de protecção contra a interceptação de sessões.
+Volte à página anterior, refresque-a e tente novamente.',
 
 # Protect
 'protectlogpage' => 'Registo de protecção',
@@ -2466,7 +2493,7 @@ Consulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as p
 Esta é a configuração presente para a página '''$1''':",
 'protect-locked-dblock' => "Não é possível alterar os níveis de protecção, porque a base de dados está bloqueada.
 Esta é a configuração actual para a página '''$1''':",
-'protect-locked-access' => "A sua conta não tem permissão de alterar os níveis de protecção de uma página.
+'protect-locked-access' => "A sua conta não tem permissões para alterar os níveis de protecção de uma página.
 Esta é a configuração actual da página '''$1''':",
 'protect-cascadeon' => 'Esta página está protegida porque se encontra incluída {{PLURAL:$1|na página listada a seguir, protegida|nas páginas listadas a seguir, protegidas}} com protecção em cascata.
 Pode alterar o nível de protecção desta página, mas isso não afectará a protecção em cascata.',
@@ -2514,7 +2541,7 @@ Pode alterar o nível de protecção desta página, mas isso não afectará a pr
 'undeletepage' => 'Ver e restaurar páginas eliminadas',
 'undeletepagetitle' => "'''Seguem-se as edições eliminadas de [[:$1]]'''.",
 'viewdeletedpage' => 'Ver páginas eliminadas',
-'undeletepagetext' => '{{PLURAL:$1|A seguinte página foi eliminada|As seguintes páginas foram eliminadas}}, mas ainda {{PLURAL:$1|permanece|permanecem}} na base de dados e poderem ser restauradas. O arquivo pode ser limpo periodicamente.',
+'undeletepagetext' => '{{PLURAL:$1|A seguinte página foi eliminada|As seguintes páginas foram eliminadas}}, mas ainda {{PLURAL:$1|permanece|permanecem}} em arquivo e podem ser restauradas. O arquivo pode ser limpo periodicamente.',
 'undelete-fieldset-title' => 'Restaurar edições',
 'undeleteextrahelp' => "Para restaurar o histórico de edições completo desta página, desmarque todas as caixas de selecção e clique '''''{{int:undeletebtn}}'''''.
 Para efectuar uma restauração selectiva, marque as caixas correspondentes às edições que pretende restaurar e clique '''''{{int:undeletebtn}}'''''.",
@@ -2570,7 +2597,7 @@ $1',
 # Contributions
 'contributions' => 'Contribuições do utilizador',
 'contributions-title' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1',
-'mycontris' => 'Minhas contribuições',
+'mycontris' => 'Contribuições',
 'contribsub2' => 'Para $1 ($2)',
 'nocontribs' => 'Não foram encontradas alterações com este critério.',
 'uctop' => ' (edição actual)',
@@ -2586,10 +2613,10 @@ $1',
 'sp-contributions-logs' => 'registos',
 'sp-contributions-talk' => 'discussão',
 'sp-contributions-userrights' => 'gestão de privilégios de utilizador',
-'sp-contributions-blocked-notice' => 'Este utilizador encontra-se actualmente bloqueado.
-Para referência, o último registo de bloqueio é apresentado abaixo:',
+'sp-contributions-blocked-notice' => 'Este utilizador está bloqueado neste momento.
+Para referência é apresentado abaixo o último registo de bloqueio:',
 'sp-contributions-blocked-notice-anon' => 'Este endereço IP está bloqueado neste momento.
-Para sua referência, encontra abaixo a entrada mais recente no registo de bloqueios:',
+Para referência é apresentado abaixo o último registo de bloqueio:',
 'sp-contributions-search' => 'Pesquisar contribuições',
 'sp-contributions-username' => 'Endereço IP ou utilizador:',
 'sp-contributions-toponly' => 'Mostrar somente as revisões mais recentes',
@@ -2833,7 +2860,7 @@ Faça a fusão manual das páginas de discussão, por favor.'''",
 A página de destino ("[[:$1]]") já existe. Deseja eliminá-la de modo a poder mover?',
 'delete_and_move_confirm' => 'Sim, eliminar a página',
 'delete_and_move_reason' => 'Eliminada para poder mover "[[$1]]" para este título',
-'selfmove' => 'O título de origem e de destinato são os mesmos;
+'selfmove' => 'Os títulos de origem e destino são iguais;
 não é possível mover uma página para ela mesma.',
 'immobile-source-namespace' => 'Não é possível mover páginas no espaço nominal "$1"',
 'immobile-target-namespace' => 'Não é possível mover páginas para o espaço nominal "$1"',
@@ -2899,8 +2926,8 @@ Se deseja colaborar na localização genérica do MediaWiki, visite [//www.media
 'thumbnail_error' => 'Erro ao criar miniatura: $1',
 'djvu_page_error' => 'página DjVu inacessível',
 'djvu_no_xml' => 'Não foi possível aceder ao XML para o ficheiro DjVU',
-'thumbnail-temp-create' => 'Não foi possível criar ficheiro temporário de miniatura',
-'thumbnail-dest-create' => 'Não é possível salvar miniatura',
+'thumbnail-temp-create' => 'Não foi possível criar o ficheiro temporário da miniatura',
+'thumbnail-dest-create' => 'Não é possível gravar a miniatura no destino',
 'thumbnail_invalid_params' => 'Parâmetros de miniatura inválidos',
 'thumbnail_dest_directory' => 'Não foi possível criar o directório de destino',
 'thumbnail_image-type' => 'Tipo de imagem não suportado',
@@ -3091,21 +3118,17 @@ Permite colocar uma justificação no resumo da edição.',
 Este bloqueio foi provavelmente causado por um link para um site externo que consta da lista negra.",
 'spamprotectionmatch' => 'O seguinte texto activou o filtro de spam: $1',
 'spambot_username' => 'MediaWiki limpeza de spam',
-'spam_reverting' => 'Revertendo para a última revisão que não contém links para $1',
-'spam_blanking' => 'Todas as revisões continham links para $1, limpando',
+'spam_reverting' => 'A reverter para a última revisão que não contém links para $1',
+'spam_blanking' => 'Todas as revisões continham links para $1; a esvaziar',
+'spam_deleting' => 'Todas as revisões continham links para $1; a eliminar',
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
 'pageinfo-header-edits' => 'Edições',
-'pageinfo-header-watchlist' => 'Páginas vigiadas',
-'pageinfo-header-views' => 'Visitas',
-'pageinfo-subjectpage' => 'Página',
-'pageinfo-talkpage' => 'Página de discussão',
+'pageinfo-views' => 'Número de visitas',
 'pageinfo-watchers' => 'Número de vigilantes',
 'pageinfo-edits' => 'Número de edições',
 'pageinfo-authors' => 'Número de autores individuais',
-'pageinfo-views' => 'Número de visitas',
-'pageinfo-viewsperedit' => 'Visitas por edição',
 
 # Skin names
 'skinname-standard' => 'Clássico',
@@ -3761,7 +3784,8 @@ Também pode [[Special:EditWatchlist/raw|editar a lista de páginas vigiadas em
 'watchlistedit-raw-title' => 'Editar a lista de páginas vigiadas em forma de texto',
 'watchlistedit-raw-legend' => 'Editar a lista de páginas vigiadas em forma de texto',
 'watchlistedit-raw-explain' => 'A lista de páginas vigiadas é apresentada abaixo.
-Pode adicionar novas linhas ou remover linhas para aumentar ou reduzir a lista, desde que mantenha uma única página por linha.
+Pode adicionar ou remover linhas, para aumentar ou reduzir a lista.
+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:',
@@ -3891,7 +3915,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á a experienciar dificuldades técnicas.',
+'dberr-problems' => 'Desculpe! Este site está com dificuldades técnicas.',
 'dberr-again' => 'Experimente esperar uns minutos e actualizar.',
 'dberr-info' => '(Não foi possível contactar o servidor da base de dados: $1)',
 'dberr-usegoogle' => 'Pode tentar pesquisar no Google entretanto.',
@@ -3943,11 +3967,11 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'logentry-newusers-newusers' => '$1 criou uma conta de utilizador',
 'logentry-newusers-create' => '$1 criou uma conta de utilizador',
 'logentry-newusers-create2' => '$1 criou uma conta de utilizador $3',
-'logentry-newusers-autocreate' => 'A conta $1 foi criada automaticalmente',
+'logentry-newusers-autocreate' => 'A conta $1 foi criada automaticamente',
 'newuserlog-byemail' => 'palavra-chave enviada por correio-electrónico',
 
 # Feedback
-'feedback-bugornote' => 'Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 denuncie um defeito].
+'feedback-bugornote' => 'Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 comunique o defeito].
 Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário será adicionado à página "[$3 $2]", junto com o seu nome de utilizador e o navegador que está a usar.',
 'feedback-subject' => 'Assunto:',
 'feedback-message' => 'Mensagem:',
@@ -3960,7 +3984,7 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 'feedback-thanks' => 'Obrigado! O seu comentário foi adicionado à página "[ $2  $1 ]".',
 'feedback-close' => 'Feito',
 'feedback-bugcheck' => 'Perfeito! Verifique apenas que não é já um dos [$1 defeitos conhecidos].',
-'feedback-bugnew' => 'Eu verifiquei. Denunciar um novo defeito.',
+'feedback-bugnew' => 'Eu verifiquei. Comunicar um novo defeito.',
 
 # API errors
 'api-error-badaccess-groups' => 'Não tem permissão para enviar ficheiros para esta wiki.',
@@ -3973,11 +3997,14 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 'api-error-empty-file' => 'O ficheiro que enviou está vazio.',
 'api-error-emptypage' => 'Não é permitido criar páginas novas vazias.',
 'api-error-fetchfileerror' => 'Erro interno: Ocorreu um problema indeterminado ao aceder ao ficheiro.',
+'api-error-fileexists-forbidden' => 'Já existe um ficheiro com o nome "$1" e não pode ser substituído.',
+'api-error-fileexists-shared-forbidden' => 'Já existe um ficheiro com o nome "$1" no repositório de ficheiros partilhados e não pode ser substituído.',
 'api-error-file-too-large' => 'O ficheiro que enviou era demasiado grande.',
 'api-error-filename-tooshort' => 'O nome do ficheiro é demasiado curto.',
 'api-error-filetype-banned' => 'Este tipo de ficheiro é proibido.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|não é um tipo de ficheiro permitido|não são tipos de ficheiro permitidos}}. {{PLURAL:$3|O tipo de ficheiro permitido é|Os tipos de ficheiro permitidos são}} $2.',
 'api-error-filetype-missing' => 'Falta a extensão do ficheiro.',
-'api-error-hookaborted' => 'A modificação que tentou fazer foi abortada pelo hook de uma extensão.',
+'api-error-hookaborted' => 'A modificação que tentou fazer foi cancelada por uma extensão.',
 'api-error-http' => 'Erro interno: Ocorreu um problema na ligação ao servidor.',
 'api-error-illegal-filename' => 'Este nome de ficheiro não é permitido.',
 'api-error-internal-error' => 'Erro interno: Ocorreu um erro indeterminado na wiki ao processar o ficheiro que enviou.',
@@ -3987,7 +4014,7 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 'api-error-mustbeloggedin' => 'Tem de estar autenticado para enviar ficheiros.',
 'api-error-mustbeposted' => 'Erro interno: O pedido necessita do HTTP POST.',
 'api-error-noimageinfo' => 'O envio correu bem, mas o servidor não forneceu nenhuma informação sobre o ficheiro.',
-'api-error-nomodule' => 'Erro interno: Não está definido nenhum módulo para recebimento de ficheiros.',
+'api-error-nomodule' => 'Erro interno: Não está definido nenhum módulo para upload de ficheiros.',
 'api-error-ok-but-empty' => 'Erro interno: o servidor não respondeu.',
 'api-error-overwrite' => 'Não é permitido sobrescrever um ficheiro existente.',
 'api-error-stashfailed' => 'Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.',
index 3236db2..6d17f6c 100644 (file)
@@ -47,6 +47,7 @@
  * @author Raylton P. Sousa
  * @author Rodrigo Calanca Nishino
  * @author Sir Lestaty de Lioncourt
+ * @author Teles
  * @author TheGabrielZaum
  * @author Urhixidur
  * @author Vuln
@@ -197,133 +198,133 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#REDIRECIONAMENTO', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__SEMTDC__', '__SEMSUMÁRIO__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__SEMGALERIA__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÁRIO__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__TDC__', '__SUMARIO__', '__SUMÁRIO__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__NAOEDITARSECAO__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÍTULO__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
-       'currentmonthabbrev'      => array( '1', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'DIAATUAL', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'DIAATUAL2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ANOATUAL', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'HORARIOATUAL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'HORAATUAL', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthabbrev'        => array( '1', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'ABREVIATURADOMESLOCAL', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'DIALOCAL', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'DIALOCAL2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'HORARIOLOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NUMERODEPAGINAS', 'NÚMERODEPÁGINAS', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NUMERODEARTIGOS', 'NÚMERODEARTIGOS', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÁRIOS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÁRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÁGINA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÁGINAC', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'DOMINIO', 'DOMÍNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'DOMINIOC', 'DOMÍNIOC', 'ESPACONOMINALC', 'ESPAÇONOMINALC', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'PAGINADEDISCUSSAO', 'PÁGINADEDISCUSSÃO', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'PAGINADEDISCUSSAOC', 'PÁGINADEDISCUSSÃOC', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'PAGINADECONTEUDO', 'PAGINADECONTEÚDO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'PAGINADECONTEUDOC', 'PAGINADECONTEÚDOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÁGINA', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'NOMECOMPLETODAPAGINAC', 'NOMECOMPLETODAPÁGINAC', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NOMEDASUBPAGINA', 'NOMEDASUBPÁGINA', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NOMEDASUBPAGINAC', 'NOMEDASUBPÁGINAC', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NOMEDAPAGINABASE', 'NOMEDAPÁGINABASE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NOMEDAPAGINABASEC', 'NOMEDAPÁGINABASEC', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÁGINADEDISCUSSÃO', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÁGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÁGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÁGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'img_thumbnail'           => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'direita', 'right' ),
-       'img_left'                => array( '1', 'esquerda', 'left' ),
-       'img_none'                => array( '1', 'nenhum', 'none' ),
-       'img_center'              => array( '1', 'centro', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'semmoldura', 'semborda', 'frameless' ),
-       'img_page'                => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'borda', 'border' ),
-       'img_baseline'            => array( '1', 'linhadebase', 'baseline' ),
-       'img_top'                 => array( '1', 'acima', 'top' ),
-       'img_middle'              => array( '1', 'meio', 'middle' ),
-       'img_bottom'              => array( '1', 'abaixo', 'bottom' ),
-       'img_link'                => array( '1', 'ligação=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'NOMEDOSITE', 'NOMEDOSÍTIO', 'NOMEDOSITIO', 'SITENAME' ),
-       'server'                  => array( '0', 'SERVIDOR', 'SERVER' ),
-       'servername'              => array( '0', 'NOMEDOSERVIDOR', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'CAMINHODOSCRIPT', 'SCRIPTPATH' ),
-       'gender'                  => array( '0', 'GENERO', 'GÊNERO', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__SEMCONVERTERTITULO__', '__SEMCONVERTERTÍTULO__', '__SEMCT__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__SEMCONVERTERCONTEUDO__', '__SEMCONVERTERCONTEÚDO__', '__SEMCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'SEMANAATUAL', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'DIADASEMANAATUAL', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'DIADASEMANALOCAL', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDDAREVISAO', 'IDDAREVISÃO', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'DIADAREVISAO', 'DIADAREVISÃO', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'DIADAREVISAO2', 'DIADAREVISÃO2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MESDAREVISAO', 'MÊSDAREVISÃO', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ANODAREVISAO', 'ANODAREVISÃO', 'REVISIONYEAR' ),
-       'revisionuser'            => array( '1', 'USUARIODAREVISAO', 'USUÁRIODAREVISÃO', 'REVISIONUSER' ),
-       'fullurl'                 => array( '0', 'URLCOMPLETO:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLCOMPLETOC:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'PRIMEIRAMINUSCULA:', 'PRIMEIRAMINÚSCULA:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'PRIMEIRAMAIUSCULA:', 'PRIMEIRAMAIÚSCULA:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MINUSCULA', 'MINÚSCULA', 'MINUSCULAS', 'MINÚSCULAS', 'LC:' ),
-       'uc'                      => array( '0', 'MAIUSCULA', 'MAIÚSCULA', 'MAIUSCULAS', 'MAIÚSCULAS', 'UC:' ),
-       'displaytitle'            => array( '1', 'EXIBETITULO', 'EXIBETÍTULO', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__SEMLINKDENOVASECAO__', '__SEMLINKDENOVASEÇÃO__', '__SEMLIGACAODENOVASECAO__', '__SEMLIGAÇÃODENOVASEÇÃO__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'REVISAOATUAL', 'REVISÃOATUAL', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'CODIFICAURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'CODIFICAANCORA:', 'CODIFICAÂNCORA:', 'ANCHORENCODE' ),
-       'language'                => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'IDIOMADOCONTEUDO', 'IDIOMADOCONTEÚDO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PAGINASNOESPACONOMINAL', 'PÁGINASNOESPAÇONOMINAL', 'PAGINASNODOMINIO', 'PÁGINASNODOMÍNIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'NUMERODEADMINISTRADORES', 'NÚMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
-       'defaultsort'             => array( '1', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAGINASNACATEGORIA', 'PÁGINASNACATEGORIA', 'PAGINASNACAT', 'PÁGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEXAR__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__NAOINDEXAR__', '__NÃOINDEXAR__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'NIVELDEPROTECAO', 'NÍVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
-       'url_path'                => array( '0', 'CAMINHO', 'PATH' ),
+       'redirect'                  => array( '0', '#REDIRECIONAMENTO', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__SEMTDC__', '__SEMSUMÁRIO__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__SEMGALERIA__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÁRIO__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__TDC__', '__SUMARIO__', '__SUMÁRIO__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__NAOEDITARSECAO__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÍTULO__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
+       'currentmonthabbrev'        => array( '1', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'DIAATUAL', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'DIAATUAL2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ANOATUAL', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'HORARIOATUAL', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'HORAATUAL', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
+       'localmonthabbrev'          => array( '1', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'ABREVIATURADOMESLOCAL', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'DIALOCAL', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'DIALOCAL2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'HORARIOLOCAL', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NUMERODEPAGINAS', 'NÚMERODEPÁGINAS', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NUMERODEARTIGOS', 'NÚMERODEARTIGOS', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÁRIOS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÁRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÁGINA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÁGINAC', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'DOMINIO', 'DOMÍNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'DOMINIOC', 'DOMÍNIOC', 'ESPACONOMINALC', 'ESPAÇONOMINALC', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'PAGINADEDISCUSSAO', 'PÁGINADEDISCUSSÃO', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'PAGINADEDISCUSSAOC', 'PÁGINADEDISCUSSÃOC', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'PAGINADECONTEUDO', 'PAGINADECONTEÚDO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'PAGINADECONTEUDOC', 'PAGINADECONTEÚDOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÁGINA', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NOMECOMPLETODAPAGINAC', 'NOMECOMPLETODAPÁGINAC', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NOMEDASUBPAGINA', 'NOMEDASUBPÁGINA', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NOMEDASUBPAGINAC', 'NOMEDASUBPÁGINAC', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NOMEDAPAGINABASE', 'NOMEDAPÁGINABASE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NOMEDAPAGINABASEC', 'NOMEDAPÁGINABASEC', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÁGINADEDISCUSSÃO', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÁGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÁGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÁGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'img_thumbnail'             => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'direita', 'right' ),
+       'img_left'                  => array( '1', 'esquerda', 'left' ),
+       'img_none'                  => array( '1', 'nenhum', 'none' ),
+       'img_center'                => array( '1', 'centro', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'semmoldura', 'semborda', 'frameless' ),
+       'img_page'                  => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'borda', 'border' ),
+       'img_baseline'              => array( '1', 'linhadebase', 'baseline' ),
+       'img_top'                   => array( '1', 'acima', 'top' ),
+       'img_middle'                => array( '1', 'meio', 'middle' ),
+       'img_bottom'                => array( '1', 'abaixo', 'bottom' ),
+       'img_link'                  => array( '1', 'ligação=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'NOMEDOSITE', 'NOMEDOSÍTIO', 'NOMEDOSITIO', 'SITENAME' ),
+       'server'                    => array( '0', 'SERVIDOR', 'SERVER' ),
+       'servername'                => array( '0', 'NOMEDOSERVIDOR', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'CAMINHODOSCRIPT', 'SCRIPTPATH' ),
+       'gender'                    => array( '0', 'GENERO', 'GÊNERO', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__SEMCONVERTERTITULO__', '__SEMCONVERTERTÍTULO__', '__SEMCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__SEMCONVERTERCONTEUDO__', '__SEMCONVERTERCONTEÚDO__', '__SEMCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'SEMANAATUAL', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'DIADASEMANAATUAL', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'DIADASEMANALOCAL', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDDAREVISAO', 'IDDAREVISÃO', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'DIADAREVISAO', 'DIADAREVISÃO', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'DIADAREVISAO2', 'DIADAREVISÃO2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MESDAREVISAO', 'MÊSDAREVISÃO', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ANODAREVISAO', 'ANODAREVISÃO', 'REVISIONYEAR' ),
+       'revisionuser'              => array( '1', 'USUARIODAREVISAO', 'USUÁRIODAREVISÃO', 'REVISIONUSER' ),
+       'fullurl'                   => array( '0', 'URLCOMPLETO:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLCOMPLETOC:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'PRIMEIRAMINUSCULA:', 'PRIMEIRAMINÚSCULA:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'PRIMEIRAMAIUSCULA:', 'PRIMEIRAMAIÚSCULA:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MINUSCULA', 'MINÚSCULA', 'MINUSCULAS', 'MINÚSCULAS', 'LC:' ),
+       'uc'                        => array( '0', 'MAIUSCULA', 'MAIÚSCULA', 'MAIUSCULAS', 'MAIÚSCULAS', 'UC:' ),
+       'displaytitle'              => array( '1', 'EXIBETITULO', 'EXIBETÍTULO', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__SEMLINKDENOVASECAO__', '__SEMLINKDENOVASEÇÃO__', '__SEMLIGACAODENOVASECAO__', '__SEMLIGAÇÃODENOVASEÇÃO__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'REVISAOATUAL', 'REVISÃOATUAL', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'CODIFICAURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'CODIFICAANCORA:', 'CODIFICAÂNCORA:', 'ANCHORENCODE' ),
+       'language'                  => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'IDIOMADOCONTEUDO', 'IDIOMADOCONTEÚDO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PAGINASNOESPACONOMINAL', 'PÁGINASNOESPAÇONOMINAL', 'PAGINASNODOMINIO', 'PÁGINASNODOMÍNIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NUMERODEADMINISTRADORES', 'NÚMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
+       'defaultsort'               => array( '1', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
+       'hiddencat'                 => array( '1', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAGINASNACATEGORIA', 'PÁGINASNACATEGORIA', 'PAGINASNACAT', 'PÁGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'TAMANHODAPAGINA', 'TAMANHODAPÁGINA', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEXAR__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NAOINDEXAR__', '__NÃOINDEXAR__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÁTICO__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVELDEPROTECAO', 'NÍVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
+       'url_path'                  => array( '0', 'CAMINHO', 'PATH' ),
 );
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Sublinhar links:',
+'tog-underline' => 'Sublinhar ligação:',
 'tog-justify' => 'Justificar parágrafos',
-'tog-hideminor' => 'Esconder edições secundárias nas mudanças recentes',
-'tog-hidepatrolled' => 'Esconder edições patrulhadas nas mudanças recentes',
-'tog-newpageshidepatrolled' => 'Esconder páginas patrulhadas da lista de páginas novas',
+'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' => 'Utilizar mudanças recentes melhoradas (requer JavaScript)',
+'tog-usenewrc' => 'Agrupar alterações por páginas nas mudanças recentes e 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)',
-'tog-editsection' => 'Habilitar edição de seção via links [editar]',
+'tog-editsection' => 'Habilitar edição de seção via ligações [editar]',
 '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}})',
@@ -341,19 +342,18 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Revelar o meu endereço de email nas notificações',
 '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-fancysig' => 'Tratar assinatura como wikitexto (sem ligação automática)',
 'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
 'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
+'tog-showjumplinks' => 'Ativar ligações 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-watchlisthideown' => 'Esconder as minhas edições da lista de páginas vigiadas',
-'tog-watchlisthidebots' => 'Esconder edições efetuadas por robôs da lista de páginas vigiadas',
-'tog-watchlisthideminor' => 'Esconder edições menores da lista de páginas vigiadas',
+'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-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' => 'Esconder edições patrulhadas na lista de páginas vigiadas',
-'tog-nolangconversion' => 'Desabilitar conversão de variantes de idioma',
+'tog-watchlisthidepatrolled' => 'Ocultar edições patrulhadas na 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',
@@ -440,7 +440,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páginas indexadas',
 'noindex-category' => 'Páginas não indexadas',
-'broken-file-category' => 'Páginas com links quebrados para arquivos',
+'broken-file-category' => 'Páginas com ligações quebradas para arquivos',
 
 'about' => 'Sobre',
 'article' => 'Página de conteúdo',
@@ -493,7 +493,7 @@ $messages = array(
 'history_short' => 'Histórico',
 'updatedmarker' => 'atualizado desde a minha última visita',
 'printableversion' => 'Versão para impressão',
-'permalink' => 'Link permanente',
+'permalink' => 'Ligação permanente',
 'print' => 'Imprimir',
 'view' => 'Ver',
 'edit' => 'Editar',
@@ -619,8 +619,8 @@ Veja a [[Special:Version|página sobre a versão do sistema]].',
 # Main script and global functions
 'nosuchaction' => 'Ação inexistente',
 'nosuchactiontext' => 'A ação especificada pela URL é inválida.
-Você deve ter se enganado ao digitar a URL, ou seguiu um link incorreto.
-Isto também pode indicar um erro no software usado no sítio {{SITENAME}}.',
+Você deve ter se enganado ao digitar a URL, ou seguiu uma ligação incorreta.
+Isso também pode indicar um erro no software usado no sítio {{SITENAME}}.',
 'nosuchspecialpage' => 'Esta página especial não existe',
 'nospecialpagetext' => '<strong>Você requisitou uma página especial inválida.</strong>
 
@@ -648,7 +648,7 @@ O banco de dados retornou o erro "$3: $4".',
 Quem fez o bloqueio oferece a seguinte explicação: $1',
 'missing-article' => 'O banco de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome "$1" $2.
 
-Isso normalmente é causado ao acessar um link de diferença (diff) desatualizado ou para o histórico de uma página que foi apagada.
+Isso normalmente é causado ao acessar uma ligação de diferença (diff) desatualizada ou para o histórico de uma página que foi apagada.
 
 Se não for este o caso, você pode ter encontrado um defeito (bug) no software.
 Anote o URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].',
@@ -704,6 +704,8 @@ Quem o protegeu foi [[User:$1|$1]], com a justificativa: ''$2''.",
 O administrador que bloqueou ofereceu a seguinte explicação: "$3".',
 'invalidtitle-knownnamespace' => 'Título inválido para o espaço nominal "$2" e texto "$3"',
 'invalidtitle-unknownnamespace' => 'Título inválido para o espaço nominal de número desconhecido ($1) e texto "$2"',
+'exception-nologin' => 'Não está autenticado',
+'exception-nologin-text' => 'Esta página ou ação requer que você esteja autenticado neste wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Má configuração: antivírus desconhecido: ''$1''",
@@ -757,8 +759,8 @@ Certifique-se de que tem os cookies ativados, recarregue esta página e tente no
 'loginsuccesstitle' => 'Login bem sucedido',
 'loginsuccess' => "'''Agora você está {{GENDER:autenticado|autenticada}} ao wiki {{SITENAME}} como \"\$1\"'''.",
 'nosuchuser' => 'Não existe nenhum usuário com o nome "$1".
-Os nomes de usuário são sensíveis à capitalização.
-Verifique a ortografia, ou [[Special:UserLogin/signup|crie uma nova conta]].',
+Os nomes de usuário são sensíveis a letras maiúsculas.
+Verifique o que foi digitado ou [[Special:UserLogin/signup|crie uma nova conta]].',
 'nosuchusershort' => 'Não existe um usuário com o nome "$1". Verifique o nome que introduziu.',
 'nouserspecified' => 'Você precisa especificar um nome de usuário.',
 'login-userblocked' => 'Este usuário está bloqueado. Entrada proibida.',
@@ -796,9 +798,10 @@ Como resultado, visitantes que usam este endereço IP não podem criar mais nenh
 'accountcreated' => 'Conta criada',
 'accountcreatedtext' => 'A conta de usuário para $1 foi criada.',
 'createaccount-title' => 'Criação de conta em {{SITENAME}}',
-'createaccount-text' => 'Alguém criou uma conta de nome $2 para o seu endereço de email no wiki {{SITENAME}} ($4), tendo como senha "$3". Você deve se autenticar e alterar sua senha.
+'createaccount-text' => 'Alguém criou uma conta de nome $2 para o seu endereço de email no wiki {{SITENAME}} ($4), tendo como senha "$3".
+Você deve se autenticar e alterar sua senha.
 
-Você pode ignorar esta mensagem caso a conta tenha sido criada por engano.',
+Ignore esta mensagem caso a conta tenha sido criada por engano.',
 'usernamehasherror' => 'Nome de usuário não pode conter o símbolo de cardinal (#).',
 'login-throttled' => 'Você fez tentativas demais de se autenticar com esta conta recentemente.
 Por favor aguarde antes de tentar novamente.',
@@ -832,7 +835,7 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
 '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 neste wiki.',
+'passwordreset-disabled' => 'Redefinições de senha foram desabilitadas nesta wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
 'passwordreset-username' => 'Nome de usuário:',
 'passwordreset-domain' => 'Domínio:',
@@ -840,12 +843,12 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
 'passwordreset-capture-help' => 'Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o usuário.',
 'passwordreset-email' => 'Endereço de e-mail:',
 'passwordreset-emailtitle' => 'Detalhes da conta em {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, do endereço IP $1) solicitou um lembrete do seu detalhes de conta para {{SITENAME}} ($4). O seguinte usuário {{PLURAL:$3|conta|são contas}} associado com este endereço de e-mail:
+'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, do endereço IP $1) solicitou um lembrete do seu detalhes de conta para {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
 
 $2
 
 {{PLURAL:$3|Esta senha temporária |Essas senhas temporárias}} vão expirar em {{PLURAL:$5|um dia|$5 dias}}.
-Você deve efetuar login e escolher uma nova senha agora. Se você conseguir lembrar da senha, ignore este e-mail e continue usando sua senha anterior, do contrário, prossiga com as instruções clicando no link.',
+Você deve efetuar login e escolher uma nova senha agora. Se você conseguir lembrar da senha, ignore este e-mail e continue usando sua senha anterior, do contrário, prossiga com as instruções clicando na ligação.',
 'passwordreset-emailtext-user' => 'O usuário $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
 
 $2
@@ -873,10 +876,10 @@ Senha temporária: $2',
 'bold_tip' => 'Texto em negrito',
 'italic_sample' => 'Texto em itálico',
 'italic_tip' => 'Texto em itálico',
-'link_sample' => 'Título do link',
-'link_tip' => 'Link interno',
-'extlink_sample' => 'http://www.example.com título do link',
-'extlink_tip' => 'Link externo (lembre-se do prefixo http://)',
+'link_sample' => 'Título da ligação',
+'link_tip' => 'Ligação interna',
+'extlink_sample' => 'http://www.example.com título da ligação',
+'extlink_tip' => 'Ligação externa (lembre-se do prefixo http://)',
 'headline_sample' => 'Conteúdo do cabeçalho',
 'headline_tip' => 'Seção de nível 2',
 'nowiki_sample' => 'Inserir texto não-formatado aqui',
@@ -884,7 +887,7 @@ Senha temporária: $2',
 'image_sample' => 'Exemplo.jpg',
 'image_tip' => 'Arquivo embutido',
 'media_sample' => 'Exemplo.ogg',
-'media_tip' => 'Link para o arquivo',
+'media_tip' => 'Ligação para o arquivo',
 'sig_tip' => 'Sua assinatura, com hora e data',
 'hr_tip' => 'Linha horizontal (use de forma moderada)',
 
@@ -933,7 +936,7 @@ O motivo apresentado foi:
 
 Você pode contatar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir sobre o bloqueio.
 
-Note que não poderá utilizar a funcionalidade "Contatar usuário" se não possuir uma conta neste wiki ({{SITENAME}}) com um endereço de \'\'e-mail\'\' válido indicado nas suas [[Special:Preferences|preferências de usuário]] ou se tiver sido bloqueado de utilizar tal recurso.
+Note que não poderá utilizar a funcionalidade "Contatar usuário" se não possuir uma conta nesta wiki ({{SITENAME}}) com um endereço de \'\'e-mail\'\' válido indicado nas suas [[Special:Preferences|preferências de usuário]] ou se tiver sido bloqueado de utilizar tal recurso.
 
 Seu endereço de IP no momento é $3 e sua ID de bloqueio é #$5.
 Por favor, inclua tais dados em qualquer tentativa de esclarecimentos que for realizar.',
@@ -952,7 +955,7 @@ Ela pode ter sido movida ou removido enquanto você estava vendo a página.',
 
 A senha para esta nova conta pode ser alterada na página ''[[Special:ChangePassword|de troca de senha]]'', após a autenticação.",
 'newarticle' => '(Nova)',
-'newarticletext' => "Você seguiu um link para uma página que ainda não existe.
+'newarticletext' => "Você seguiu uma ligação para uma página que ainda não existe.
 Para criá-la, comece escrevendo na caixa abaixo (veja [[{{MediaWiki:Helppage}}|a página de ajuda]] para mais informações).
 Se você chegou aqui por engano, clique no botão '''voltar''' do seu navegador.",
 'anontalkpagetext' => "---- ''Esta é a página de discussão para um usuário anônimo que ainda não criou uma conta ou que não a usa, de forma que temos de utilizar o endereço de IP para identificá-lo(a). Tal endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha que comentários irrelevantes foram direcionados a você, por gentileza, [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]], a fim de evitar futuras confusões com outros usuários anônimos.''",
@@ -1150,15 +1153,15 @@ Você pode visualizá-la; podem existir mais detalhes no [{{fullurl:{{#Special:L
 Poderá haver detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].",
 'rev-suppressed-no-diff' => "Você não pode ver esta comparação porque uma das revisões foi '''eliminada'''.",
 'rev-deleted-unhide-diff' => "Uma das revisões desta diferença entre revisões foi '''eliminada'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].
+Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminações].
 Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.",
 'rev-suppressed-unhide-diff' => "Uma das revisões desta diferença entre revisões foi '''suprimida'''.
-Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].
+Podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supressões].
 Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.",
 'rev-deleted-diff-view' => "Uma das revisões desta diferença entre revisões foi '''eliminada'''.
-Você pode ver a diferença entre revisões; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
+Você pode ver a diferença entre revisões; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminações].",
 'rev-suppressed-diff-view' => "Uma das revisões desta comparação foi '''suprimida''''.
-Você pode ver esta comparação; detalhes podem ser encontradas no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supressão].",
+Você pode ver esta comparação; detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supressão].",
 'rev-delundel' => 'exibir/ocultar',
 'rev-showdeleted' => 'exibir',
 'revisiondelete' => 'Eliminar/restaurar edições',
@@ -1175,7 +1178,7 @@ Você pode ver esta comparação; detalhes podem ser encontradas no [{{fullurl:{
 'logdelete-selected' => "'''{{PLURAL:$1|Evento de registro selecionado|Eventos de registro selecionados}}:'''",
 'revdelete-text' => "'''Revisões eliminadas e eventos continuarão aparecendo no histórico da página e nos registros, apesar de o seu conteúdo textual estar inacessível ao público.'''
 Outros administradores no {{SITENAME}} continuarão podendo acessar ao conteúdo escondido e restaurá-lo através desta mesma ''interface'', a menos que uma restrição adicional seja definida.",
-'revdelete-confirm' => 'Por favor confirme que pretende executar esta acção, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].',
+'revdelete-confirm' => 'Por favor confirme que pretende executar esta ação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].',
 'revdelete-suppress-text' => "A supressão deverá ser usada '''apenas''' para os seguintes casos:
 * Informação pessoal inapropriada
 *: ''endereços de domicílio e números de telefone, números da segurança social, etc''",
@@ -1183,8 +1186,8 @@ Outros administradores no {{SITENAME}} continuarão podendo acessar ao conteúdo
 'revdelete-hide-text' => 'Ocultar texto da edição',
 'revdelete-hide-image' => 'Ocultar conteúdos do arquivo',
 'revdelete-hide-name' => 'Ocultar ação e alvo',
-'revdelete-hide-comment' => 'Esconder comentário de edição',
-'revdelete-hide-user' => 'Esconder nome de usuário/IP do editor',
+'revdelete-hide-comment' => 'Ocultar o sumário de edição',
+'revdelete-hide-user' => 'Ocultar nome de usuário/IP do editor',
 'revdelete-hide-restricted' => 'Suprimir dados de administradores assim como de outros',
 'revdelete-radio-same' => '(não altere)',
 'revdelete-radio-set' => 'Sim',
@@ -1213,7 +1216,7 @@ Você não tem acesso a ele.',
 'revdelete-modify-missing' => 'Erro ao modificar o item ID $1: está faltando na base de dados!',
 'revdelete-no-change' => "'''Aviso:''' o item datado de $2, $1 já possui as configurações de visualização requeridas.",
 'revdelete-concurrent-change' => 'Erro ao modificar o item datado de $2, $1: o seu estado parece ter sido alterado por outra pessoa enquanto você tentava modificá-lo.
-Por favor, verifique os registos.',
+Por favor, verifique os registros.',
 'revdelete-only-restricted' => 'Erro ao ocultar o item de $2 às $1: você não pode impedir que itens sejam visualizados por administradores sem também selecionar uma das outras opções de visibilidade.',
 'revdelete-reason-dropdown' => '*Motivos comuns para eliminação
 ** Violação de direitos autorais
@@ -1265,7 +1268,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'difference-multipage' => '(Diferenças entre páginas)',
 'lineno' => 'Linha $1:',
 'compareselectedversions' => 'Compare as versões selecionadas',
-'showhideselectedversions' => 'Mostrar/esconder versões selecionadas',
+'showhideselectedversions' => 'Exibir/ocultar edições selecionadas',
 'editundo' => 'desfazer',
 'diff-multi' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de {{PLURAL:$2|um usuário|$2 usuários}} {{PLURAL:$1|não apresentada|não apresentadas}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de mais de {{PLURAL:$2|um usuário|$2 usuário}} não {{PLURAL:$1|apresentada|apresentadas}})',
@@ -1288,8 +1291,8 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Opções de pesquisa',
-'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" neste wiki'''",
-'searchmenu-new' => "'''Criar a página \"[[:\$1|\$1]]\" neste wiki!'''",
+'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
+'searchmenu-new' => "'''Criar a página \"[[:\$1|\$1]]\" nesta wiki!'''",
 'searchhelp-url' => 'Help:Conteúdos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegue pelas páginas com este prefixo]]',
 'searchprofile-articles' => 'Páginas de conteúdo',
@@ -1388,7 +1391,7 @@ Note que os índices do sistema de busca externo poderão conter referências de
 'recentchangesdays' => 'Dias a serem exibidos nas Mudanças recentes:',
 'recentchangesdays-max' => '(máximo: $1 {{PLURAL:$1|dia|dias}})',
 'recentchangescount' => 'Número de edições a serem exibidas por padrão:',
-'prefs-help-recentchangescount' => 'Isto inclui mudanças recentes, histórico de páginas e registos.',
+'prefs-help-recentchangescount' => 'Isto inclui mudanças recentes, histórico de páginas e registros.',
 'prefs-help-watchlist-token' => "O preenchimento deste campo com uma senha secreta irá gerar um ''feed'' RSS para a sua lista de páginas vigiadas.
 Qualquer um que conheça a senha deste campo será capaz de ler sua lista de páginas vigiadas, então escolha um valor seguro.
 Eis um valor gerado aleatoriamente que você pode usar: $1",
@@ -1622,7 +1625,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'nchanges' => '$1 {{PLURAL:$1|alteração|alterações}}',
 'recentchanges' => 'Mudanças recentes',
 'recentchanges-legend' => 'Opções das mudanças recentes',
-'recentchanges-summary' => 'Veja as mais novas mudanças na {{SITENAME}} nesta página.',
+'recentchanges-summary' => 'Acompanhe nesta página as mudanças mais recentes deste wiki.',
 'recentchanges-feed-description' => 'Acompanhe neste feed as mudanças mais recentes do wiki.',
 'recentchanges-label-newpage' => 'Esta edição criou uma nova página',
 'recentchanges-label-minor' => 'Esta é uma edição menor',
@@ -1682,9 +1685,9 @@ Para sua conveniência, segue o registro de eliminação e de movimentação:",
 Para ver ou pesquisar arquivos já enviados, consulte a [[Special:FileList|lista de arquivos enviados]]. Re-envios também são registrados no [[Special:Log/upload|registro de uploads]]; eliminações no [[Special:Log/delete|registro de eliminações]]
 
 Para incluir o arquivo em uma página, use um link em um dos seguintes formatos:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Arquivo.jpg]]</nowiki></tt>''' para utilizar a versão completa do arquivo;
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Arquivo.png|200px|thumb|left|texto]]</nowiki></tt>''' para utilizar uma renderização de 200 pixels dentro de uma caixa posicionada à margem esquerda, contendo 'texto' como descrição;
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Arquivo.ogg]]</nowiki></tt>''' para um link direto ao arquivo sem que ele seja exibido.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Arquivo.jpg]]</nowiki></code>''' para utilizar a versão completa do arquivo;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Arquivo.png|200px|thumb|left|texto]]</nowiki></code>''' para utilizar uma renderização de 200 pixels dentro de uma caixa posicionada à margem esquerda, contendo 'texto' como descrição;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Arquivo.ogg]]</nowiki></code>''' para um link direto ao arquivo sem que ele seja exibido.",
 'upload-permitted' => 'Tipos de arquivos permitidos: $1.',
 'upload-preferred' => 'Tipos de arquivos preferidos: $1.',
 'upload-prohibited' => 'Tipos de arquivo proibidos: $1.',
@@ -1732,22 +1735,22 @@ este possui $2.',
 Isso pode ocorrer devido a um erro de digitação no nome do arquivo.
 Verifique se você realmente deseja enviar este arquivo.',
 'windows-nonascii-filename' => 'O wiki não aceita nomes de arquivos com caracteres especiais.',
-'fileexists' => "Já existe um arquivo com este nome.
-Verifique '''<tt>[[:$1]]</tt>''' caso não tenha certeza se deseja alterar o arquivo atual.
-[[$1|thumb]]",
-'filepageexists' => "A página de descrição deste arquivo já foi criada em '''<tt>[[:$1]]</tt>''', mas atualmente não existe nenhum arquivo com este nome.
+'fileexists' => 'Já existe um arquivo com este nome.
+Verifique <strong>[[:$1]]</strong> caso não tenha certeza se deseja alterar o arquivo atual.
+[[$1|thumb]]',
+'filepageexists' => 'A página de descrição deste arquivo já foi criada em <strong>[[:$1]]</strong>, mas atualmente não existe nenhum arquivo com este nome.
 O sumário que você inseriu não aparecerá na página de descrição.
 Para que ele apareça, será necessário editá-lo manualmente.
-[[$1|thumb]]",
-'fileexists-extension' => "Já existe um arquivo com nome similar: [[$2|thumb]]
-* Nome do arquivo que está sendo enviado: '''<tt>[[:$1]]</tt>'''
-* Nome do arquivo existente: '''<tt>[[:$2]]</tt>'''
-Escolha um nome diferente.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Já existe um arquivo com nome similar: [[$2|thumb]]
+* Nome do arquivo que está sendo enviado: <strong>[[:$1]]</strong>
+* Nome do arquivo existente: <strong>[[:$2]]</strong>
+Escolha um nome diferente.',
 'fileexists-thumbnail-yes' => "O arquivo parece ser uma imagem de tamanho reduzido (''miniatura'', ou ''thumbnail'').
 [[$1|thumb]]
-Verifique o arquivo '''<tt>[[:$1]]</tt>'''.
+Verifique o arquivo <strong>[[:$1]]</strong>.
 Se o arquivo enviado é o mesmo do de tamanho original, não é necessário enviar uma versão adicional em miniatura.",
-'file-thumbnail-no' => "O nome do arquivo começa com '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "O nome do arquivo começa com <strong>$1</strong>.
 Isso faz parecer se tratar de uma imagem de tamanho reduzido (''miniatura'', ou ''thumbnail'').
 Se você tem esta imagem em sua resolução completa, envie-a no lugar desta. Caso contrário, altere o nome de arquivo.",
 'fileexists-forbidden' => 'Já existe um arquivo com este nome e ele não pode ser sobrescrito.
@@ -2011,7 +2014,7 @@ Talvez você deseje editar a descrição na sua [$2 página de descrição de ar
 
 # MIME search
 'mimesearch' => 'Pesquisa MIME',
-'mimesearch-summary' => 'Esta página possibilita que os arquivos sejam filtrados a partir de seu tipo MIME. Sintaxe de busca: tipo/subtipo (por exemplo, <tt>image/jpeg</tt>).',
+'mimesearch-summary' => 'Esta página possibilita que os arquivos sejam filtrados a partir de seu tipo MIME. Sintaxe de busca: tipo/subtipo (por exemplo, <code>image/jpeg</code>).',
 'mimetype' => 'tipo MIME:',
 'download' => 'download',
 
@@ -2210,9 +2213,9 @@ Veja também [[Special:WantedCategories|categorias pedidas]].',
 'linksearch-ok' => 'Pesquisar',
 'linksearch-text' => 'É possível usar caracteres curinga, como "*.wikipedia.org".
 É necessário, pelo menos, um domínio de nível superior, por exemplo "*.org".<br />
-Protocolos suportados: <tt>$1</tt> (não adicionado nenhum desses em sua pesquisa).',
+Protocolos suportados: <code>$1</code> (não adicionado nenhum desses em sua pesquisa).',
 'linksearch-line' => '$2 possui links para $1',
-'linksearch-error' => "\"Caracteres mágicos\" (''wildcards'') só podem ser suados no início do endereço.",
+'linksearch-error' => "\"Caracteres mágicos\" (''wildcards'') só podem ser usados no início do endereço.",
 
 # Special:ListUsers
 'listusersfrom' => 'Mostrar usuários começando em:',
@@ -3047,19 +3050,15 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'spambot_username' => 'MediaWiki limpeza de spam',
 'spam_reverting' => 'Revertendo para a última versão que não contém links para $1',
 'spam_blanking' => 'Todas revisões contendo links para $1, limpando',
+'spam_deleting' => 'Eliminada por todas as suas edições conterem links para $1',
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
 'pageinfo-header-edits' => 'Edições',
-'pageinfo-header-watchlist' => 'Páginas vigiadas',
-'pageinfo-header-views' => 'Visitas',
-'pageinfo-subjectpage' => 'Página',
-'pageinfo-talkpage' => 'Página de discussão',
+'pageinfo-views' => 'Número de visitas',
 'pageinfo-watchers' => 'Número de pessoas vigiando',
 'pageinfo-edits' => 'Número de edições',
 'pageinfo-authors' => 'Número de autores individuais',
-'pageinfo-views' => 'Número de visitas',
-'pageinfo-viewsperedit' => 'Visitas por edição',
 
 # Skin names
 'skinname-standard' => 'Clássico',
@@ -3924,9 +3923,12 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'api-error-empty-file' => 'O arquivo que você enviou está vazio.',
 'api-error-emptypage' => 'Não é permitido criar páginas novas vazias.',
 'api-error-fetchfileerror' => 'Erro interno: ocorreu um problema indeterminado ao acessar o arquivo.',
+'api-error-fileexists-forbidden' => 'Já existe um arquivo com o nome "$1". Não é possível substituí-lo.',
+'api-error-fileexists-shared-forbidden' => 'Já existe, no repositório de arquivos partilhados, um arquivo com o nome "$1". Não é possível substituí-lo.',
 'api-error-file-too-large' => 'O arquivo que você enviou é muito grande.',
 'api-error-filename-tooshort' => 'O nome do arquivo é curto demais.',
 'api-error-filetype-banned' => 'Este tipo do arquivo é proibido.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|não é um tipo de arquivo permitido|não são tipos de arquivos permitidos}}. {{PLURAL:$3|O tipo de arquivo permitido é|Os tipos de arquivos permitidos são}} $2.',
 'api-error-filetype-missing' => 'Falta a extensão de arquivo.',
 'api-error-hookaborted' => 'A modificação que você tentou realizar foi abortada pelo hook de uma extensão.',
 'api-error-http' => 'Erro interno: não foi possível conectar ao servidor.',
index e2d7903..0beef17 100644 (file)
@@ -12,6 +12,7 @@
  * @author Ahonc
  * @author Aleator
  * @author AlexSm
+ * @author Amahoney
  * @author Amire80
  * @author AnakngAraw
  * @author Ans
  * @author Metalhead64
  * @author MichaelFrey
  * @author Mihai
+ * @author Minh Nguyen
  * @author Mormegil
  * @author Mpradeep
+ * @author Murma174
  * @author Najami
  * @author Nemo bis
  * @author Niels
@@ -92,6 +95,7 @@
  * @author Purodha
  * @author Rancher
  * @author Raymond
+ * @author Reedy
  * @author Robby
  * @author Rotemliss
  * @author Ryan Schmidt
  * @author Seb35
  * @author Sherbrooke
  * @author Shirayuki
+ * @author Shisir 1945
  * @author Shushruth
  * @author Siddhartha Ghai
  * @author Siebrand
  * @author Yyy
  * @author Žekřil71pl
  * @author פוילישער
+ * @author 아라
  */
 
 $messages = array(
@@ -138,7 +144,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Option in Recent changes tab of [[Special:Preferences]] (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}',
 'tog-newpageshidepatrolled' => 'Toggle in [[Special:Preferences]], section "Recent changes" (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}',
 'tog-extendwatchlist' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to show all applicable changes in watchlist (by default only the last change to a page on the watchlist is shown). {{Gender}}",
-'tog-usenewrc' => "[[Special:Preferences]], tab 'Recent changes'. Offers user to use alternative reprsentation of [[Special:RecentChanges]]. {{Gender}}",
+'tog-usenewrc' => "[[Special:Preferences]], tab 'Recent changes'. Offers user to use alternative representation of [[Special:RecentChanges]] and watchlist. {{Gender}}",
 'tog-numberheadings' => "[[Special:Preferences]], tab 'Misc'. Offers numbered headings on content pages to user. {{Gender}}",
 'tog-showtoolbar' => "[[Special:Preferences]], tab 'Edit'. Offers user to show edit toolbar in page edit screen. {{Gender}}
 
@@ -168,7 +174,7 @@ Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwa
 'tog-fancysig' => 'In user preferences under the signature box.  {{Gender}}',
 'tog-externaleditor' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external editor by default. {{Gender}}",
 'tog-externaldiff' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external diff program by default. {{Gender}}",
-'tog-showjumplinks' => 'Toggle option used in [[Special:Preferences]]. The "jump to" part should be the same with {{msg-mw|jumpto}} (or you can use <nowiki>{{int:jumpto}}</nowiki>). Thess links are shown in some of the older skins as "jump to: navigation, search" but they are hidden by default (you can enable them with this option). {{Gender}}',
+'tog-showjumplinks' => 'Toggle option used in [[Special:Preferences]]. The "jump to" part should be the same with {{msg-mw|jumpto}} (or you can use <nowiki>{{int:jumpto}}</nowiki>). These links are shown in some of the older skins as "jump to: navigation, search" but they are hidden by default (you can enable them with this option). {{Gender}}',
 'tog-uselivepreview' => 'Toggle option used in [[Special:Preferences]]. Live preview is an experimental feature (unavailable by default) to use edit preview without loading the page again. {{Gender}}',
 'tog-forceeditsummary' => "Toggle option used in [[Special:Preferences]] to force an edit ''{{msg-mw|summary}}''. {{Gender}}",
 'tog-watchlisthideown' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide own edits from watchlist. {{Gender}}",
@@ -177,8 +183,6 @@ Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwa
 'tog-watchlisthideliu' => "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}",
 'tog-watchlisthideanons' => "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}",
 'tog-watchlisthidepatrolled' => 'Option in Watchlist tab of [[Special:Preferences]]. {{Gender}}',
-'tog-nolangconversion' => '{{optional}}
-In user preferences.',
 'tog-ccmeonemails' => 'Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. {{Gender}}',
 'tog-diffonly' => 'Toggle option used in [[Special:Preferences]]. {{Gender}}',
 'tog-showhiddencats' => 'Toggle option used in [[Special:Preferences]]. {{Gender}}',
@@ -498,7 +502,7 @@ For explanation of 'lock' see [http://en.wikipedia.org/wiki/Lock_%28computer_sci
 {{Identical|Copyright}}',
 'currentevents' => 'Standard link in the sidebar, for news. See also {{msg|currentevents-url}} for the link url.',
 'currentevents-url' => "Target page of ''{{Mediawiki:currentevents}}'' in the sidebar. See also {{msg|currentevents}}.
-{{doc-important|Do not translate <tt>Project:</tt> part.}}",
+{{doc-important|Do not translate the \"<tt>Project:</tt>\" part.}}",
 'disclaimers' => 'Used as display name for the link to [[{{MediaWiki:Disclaimerpage}}]] shown at the bottom of every page on the wiki. Example [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].',
 'disclaimerpage' => 'Used as page for that contains the site disclaimer. Used at the bottom of every page on the wiki. Example: [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].
 {{doc-important|Do not change the "<tt>Project:</tt>" part.}}',
@@ -546,6 +550,19 @@ The format is: "{{int:youhavenewmessages| [[MediaWiki:Newmessageslink/{{SUBPAGEN
 
 {{Identical|New messages}}',
 'newmessagesdifflink' => 'This is the second link displayed in an orange rectangle when a user gets a message on his talk page. Used in message {{msg-mw|youhavenewmessages}} (as parameter $2).',
+'youhavenewmessagesfromusers' => 'New talk indicator message: the message appearing when someone edited your user talk page.
+The message takes three parameters; 
+*$1 {{msg-mw|newmessageslinkplural}}, 
+*$2 {{msg-mw|newmessagesdifflinkplural}}, and 
+*$3 the number of authors who have edited the talk page since the owning user last viewed it.',
+'youhavenewmessagesmanyusers' => 'New talk indicator message: the message appearing when someone edited your user talk page. Used when more than 10 users edited the user talk page since the owning user last viewed it, similar to{{msg-mw|youhavenewmessages}}. Parameters:
+* $1 is {{msg-mw|newmessageslinkplural}},
+* $2 is  {{msg-mw|newmessagesdifflinkplural}}.',
+'newmessageslinkplural' => 'Like {{msg-mw|newmessageslink}} but supporting pluralization. Used in message {{msg-mw|youhavenewmessagesfromusers}} (as parameter $1).
+This message itself takes one parameter, $1, which is 1 if there was one new edit, or 2 if there was more than one new edit
+since the last time the user has seen his or her talk page.',
+'newmessagesdifflinkplural' => 'Like {{msg-mw|newmessagesdifflink}} but supporting pluralization. Used in message {{msg-mw|youhavenewmessagesfromusers}} (as parameter $2).
+This message itself takes one parameter, $1, which is the number of new edits since the last time the user has seen his or her talk page.',
 'youhavenewmessagesmulti' => 'The alternative of {{msg|youhavenewmessages}} as used on wikis with a special setup so they can receive the "new message" notice on other wikis as well. Used on [http://www.wikia.com/ Wikia].
 The format is: "{{int:youhavenewmessagesmulti| [[MediaWiki:Newmessageslink/{{SUBPAGENAME}}|{{int:newmessageslink}}]]}}"',
 'editsection' => 'Display name of link to edit a section on a content page. Example: [{{MediaWiki:Editsection}}].
@@ -664,6 +681,7 @@ HTML markup cannot be used.
 $1 is a filename, I think.',
 'cannotdelete-title' => 'Title of error page when the user cannot delete a page
 * $1 is the page name',
+'delete-hook-aborted' => 'Error message shown when an extension hook prevents a page deletion, but does not provide an error message.',
 'badtitle' => 'The page title when a user requested a page with invalid page name. The content will be {{msg-mw|badtitletext}}.',
 'badtitletext' => 'The message shown when a user requested a page with invalid page name. The page title will be {{msg-mw|badtitle}}.',
 'perfcached' => 'Like {{msg-mw|perfcachedts}} but used when we do not know how long ago page was cached (unlikely to happen). Parameters:
@@ -696,6 +714,8 @@ $1 is a filename, I think.',
 'invalidtitle-unknownnamespace' => 'Displayed when an invalid title was encountered (generally in a list) and the namespace number is unknown.
 * $1 is the namespace number
 * $2 is the part of the title after the namespace (e.g. SomeName for the page User:SomeName)',
+'exception-nologin' => 'Generic page title used on error page when a user is not logged in. Message used by the UserNotLoggedIn exception.',
+'exception-nologin-text' => 'Generic reason displayed on error page when a user is not logged in. Message used by the UserNotLoggedIn exception.',
 
 # Login and logout pages
 'logouttext' => 'Log out message',
@@ -712,6 +732,7 @@ $1 is a filename, I think.',
 'remembermypassword' => 'A check box in [[Special:UserLogin]]
 
 {{Identical|Remember my login on this computer}}',
+'password-change-forbidden' => 'Error message shown when an external authentication source does not allow the password to be changed.',
 'externaldberror' => 'This message is thrown when a valid attempt to change the wiki password for a user fails because of a database error or an error from an external system.',
 'login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg|nav-login-createaccount}} is shown there).
 
@@ -740,6 +761,7 @@ 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 [[MediaWiki:Gotaccount/{{SUBPAGENAME}}]] appears.
 
 {{Identical|Log in}}',
+'userlogin-resetlink' => 'Used on the login page.',
 'createaccountmail' => 'Button text for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.',
 'createaccountreason' => '{{Identical|Reason}}',
 'createaccounterror' => 'Parameters:
@@ -832,7 +854,8 @@ Used on [[Special:ResetPass]]',
 {{Identical|Reset password}}',
 'passwordreset-text' => 'Text on [[Special:PasswordReset]]',
 'passwordreset-legend' => '{{Identical|Reset password}}',
-'passwordreset-pretext' => 'Parameters:
+'passwordreset-pretext' => 'These instructions are shown on the password reset dialogue, which can, in principle, take the user\'s email address as well as, or instead of, their username. This text displays above one or more fields, at least one of which needs to be completed, and the message does not know which routes are available, so it needs to refer to some vague noun rather than specifically "username".
+"One of the pieces of data" means "an info"/"a datum" (probably to be translatea with a singular noun in your language if available). Parameters:
 * $1 is the number of password reset routes. This is never 1, but always two or more. Thus, the first plural option is empty in English.',
 'passwordreset-username' => '{{Identical|Username}}',
 'passwordreset-domain' => 'A domain like used in Domain Name System (DNS) or more specifically like a domain component in the Lightweight Directory Access Protocol (LDAP)',
@@ -853,9 +876,9 @@ Parameters:
 * $2 - message {{msg-mw|passwordreset-emailelement|notext=1}} repeated $3 times
 * $3 - the number of repetitions in $2
 * $4 - base URL of the wiki',
-'passwordreset-emailelement' => "This is a body of a reminder email to allow them into the system with a new password.
-$1 will be the user's login name.
-$2 will be the temporary password given by the system.",
+'passwordreset-emailelement' => "This is a body of a reminder email to allow them into the system with a new password. Parameters:
+* $1 will be the user's login name. This parameter can be used for GENDER.
+$2 will be the temporary password given by the system.",
 'passwordreset-emailerror-capture' => 'Error message displayed when sending an e-mail fails. Parameters:
 * $1 is the name of a user who was supposed to get the e-mail.',
 
@@ -975,6 +998,11 @@ Parameters:
 
 See also {{msg-mw|Noarticletext-nopermission}}.',
 'noarticletext-nopermission' => 'See also {{msg-mw|Noarticletext}}.',
+'missing-revision' => 'Text displayed when the requested revision does not exist using a permalink.
+
+Example: [http://translatewiki.net/w/i.php?title=Project:News&oldid=9999999 Permalink with invalid revision#]
+
+* $1 is the ID of the missing revision',
 'userpage-userdoesnotexist' => 'Error message displayed when trying to edit or create a page or a subpage that belongs to a user who is not registered on the wiki. Parameters:
 * $1 is a possible username that has not been registered.',
 'userpage-userdoesnotexist-view' => 'Shown in user pages of non existing users. See for example [http://translatewiki.net/wiki/User:Foo User:Foo]. Parameters:
@@ -1016,7 +1044,7 @@ This text will be shown below upload forms. It will default to the contents of e
 'sectioneditnotsupported-title' => 'Page title of special page, which presumably appears when someone tries to edit a section, and section editing is disabled. Explanation of section editing on [http://meta.wikimedia.org/wiki/Help:Section_editing#Section_editing meta].',
 'sectioneditnotsupported-text' => 'I think this is the text of an error message, which presumably appears when someone tries to edit a section, and section editing is disabled. Explanation of section editing on [http://meta.wikimedia.org/wiki/Help:Section_editing#Section_editing meta].',
 'permissionserrorstext-withaction' => '* $1 is the number of reasons that were found why the action cannot be performed.
-* $2 is one of the action-* messages (for example {{msg|action-edit}}).
+* $2 is one of the action-* messages (for example {{msg|action-edit}}) or other such messages tagged with {{tl|doc-action}} in their documentation.
 
 Please report at [[Support]] if you are unable to properly translate this message. Also see [[bugzilla:14246]]',
 'recreate-moveddeleted-warn' => 'Warning shown when creating a page which has already been deleted. See for example [[Test]].',
@@ -1050,11 +1078,17 @@ When templates are expanded, there is a size limit for the number of bytes yield
 * <tt>$2</tt> is the value of the max depth limit',
 'parser-unstrip-loop-warning' => 'This error is shown when a parser extension tag such as &lt;pre> includes a reference to itself in its own output.
 The reference must be to the exact same invocation of the tag at the same location in the source, merely writing &lt;pre>&lt;pre>&lt;/pre>&lt;/pre> will not do it.
-This is usually impossible and unlikely to happen by accident, so translation is not essential.',
+This is usually impossible and unlikely to happen by accident, so translation is not essential.
+"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above. See also:
+*{{msg-mw|Parser-unstrip-recursion-limit}}',
 'parser-unstrip-recursion-limit' => 'This message is shown when the recursion limit for nested parser extension tags is exceeded.
 This warning may be encountered due to input text like &lt;ref>&lt;ref>&lt;ref>...&lt;/ref>&lt;/ref>&lt;/ref>.
 
-* <tt>$1</tt> is the depth limit',
+* <tt>$1</tt> is the depth limit
+
+"Unstrip" refers to the internal function of the parser, called \'unstrip\', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above. See also:
+*{{msg-mw|Parser-unstrip-loop-warning}}',
+'converter-manual-rule-error' => "This message is shown when a manual conversion rule for the language converter has errors. For example it's not using the correct syntax, or not supplying text in all variants.",
 
 # "Undo" feature
 'undo-success' => 'Text on special page to confirm edit revert. You arrive on this page by clicking on the "undo" link on a revision history special page.
@@ -1119,9 +1153,12 @@ Used in History and [[Special:Contributions]].',
 * '''$4''' - time.",
 
 # Revision deletion
+'rev-deleted-comment' => 'Apparently this can also be about the reason of a log action, not only an edit summary. See also:
+*{{msg-mw|revdelete-hide-comment}}',
 'rev-deleted-user-contribs' => 'Part of revision deletion.',
 'rev-deleted-text-unhide' => 'This message is very similar to {{msg-mw|rev-suppressed-unhide-diff}}. Parameters:
 * $1 is a HTML link to the diff',
+'rev-deleted-text-view' => 'I believe this is an error message which appears if a user tries to view a past revision of a page, where the revision has been hidden from view, although later revisions of the page still exist.',
 'rev-suppressed-unhide-diff' => 'This message is very similar to {{msg-mw|rev-deleted-unhide-diff}} and to {{msg-mw|rev-suppressed-text-unhide}}. Parameters:
 * $1 is a HTML link to the diff',
 'rev-delundel' => 'Link in page history for oversight (see also {{msg-mw|rev-showdeleted}})',
@@ -1231,7 +1268,9 @@ Parameters:
 [[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]',
 
 # Suppression log
-'suppressionlog' => 'Title of the suppression log. Shown in the drop down menu at [[Special:log]] and as header of [[Special:log/suppress]].',
+'suppressionlog' => '{{doc-logpage}}
+
+Title of the suppression log. Shown in the drop down menu at [[Special:log]] and as header of [[Special:log/suppress]].',
 'suppressionlogtext' => 'Description text of the suppression log. Shown at top of [[Special:log/suppress]].',
 
 # History merging
@@ -1255,7 +1294,8 @@ Parameters:
 * $6 is a revision comment',
 
 # Merge log
-'mergelog' => 'This is the name of a log of merge actions done on [[Special:MergeHistory]]. This special page and this log is not enabled by default.',
+'mergelog' => '{{doc-logpage}}
+This is the name of a log of merge actions done on [[Special:MergeHistory]]. This special page and this log is not enabled by default.',
 'pagemerge-logentry' => "This log message is used in a merge log entry.
 
 *Parameter $1 is the page name of the source of the content to be merged.
@@ -1287,9 +1327,17 @@ This message has sometimes a tooltip {{msg-mw|tooltip-undo}}',
 'diff-multi-manyusers' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive, and the intermediate revisions have been edited by more than 100 users. Parameters:
 * $1 is the number of revisions, will always be 101 or more.
 * $2 is the number of users that were found, which was limited at 100.",
+'difference-missing-revision' => 'Text displayed when the requested revision does not exist using a diff link.
+
+Example: [http://translatewiki.net/w/i.php?title=Project:News&diff=426850&oldid=99999999 Diff with invalid revision#]
+
+* $1 is the list of missing revisions IDs
+* $2 is the number of items in $1 (one or two)',
 
 # Search results
-'searchresults' => '{{Identical|Search results}}',
+'searchresults' => 'This is the title of the page that contains the results of a search.
+
+{{Identical|Search results}}',
 'searchresults-title' => 'Appears as page title in the html header of the search result special page.',
 'notitlematches' => 'Header of results page after a search for a title for which no page exists',
 'textmatches' => 'When displaying search results',
@@ -1650,6 +1698,15 @@ If someone with this right (bots by default) edits a user talk page and marks it
 'right-writeapi' => '{{doc-right|writeapi}}',
 'right-delete' => '{{doc-right|delete}}',
 'right-bigdelete' => '{{doc-right|bigdelete}}',
+'right-deletelogentry' => '{{doc-right|deletelogentry}}
+This user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.
+It can be given to the group {{msg|group-sysop|pl=yes}}, although this right is disabled by default.
+
+See also
+* {{msg|right-suppressionlog|pl=yes}}
+* {{msg|right-hideuser|pl=yes}}
+* {{msg|right-suppressrevision|pl=yes}}
+* {{msg|right-deleterevision|pl=yes}}',
 'right-deleterevision' => '{{doc-right|deleterevision}}
 This user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.
 It can be given to the group {{msg|group-sysop|pl=yes}}, although this right is disabled by default.
@@ -1657,7 +1714,8 @@ It can be given to the group {{msg|group-sysop|pl=yes}}, although this right is
 See also
 * {{msg|right-suppressionlog|pl=yes}}
 * {{msg|right-hideuser|pl=yes}}
-* {{msg|right-suppressrevision|pl=yes}}',
+* {{msg|right-suppressrevision|pl=yes}}
+* {{msg|right-deletelogentry|pl=yes}}',
 'right-deletedhistory' => '{{doc-right|deletedhistory}}',
 'right-deletedtext' => '{{doc-right|deletedtext}}',
 'right-browsearchive' => '{{doc-right|browsearchive}}',
@@ -1669,6 +1727,7 @@ It can be given to the group {{msg|group-suppress|pl=yes}}, although that group
 See also
 * {{msg|right-suppressionlog|pl=yes}}
 * {{msg|right-hideuser|pl=yes}}
+* {{msg|right-deletelogentry|pl=yes}}
 * {{msg|right-deleterevision|pl=yes}}',
 'right-suppressionlog' => '{{doc-right|suppressionlog}}
 This user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.
@@ -1677,6 +1736,7 @@ It can be given to the group {{msg|group-suppress|pl=yes}}, although that group
 See also
 * {{msg|right-suppressrevision|pl=yes}}
 * {{msg|right-hideuser|pl=yes}}
+* {{msg|right-deletelogentry|pl=yes}}
 * {{msg|right-deleterevision|pl=yes}}',
 'right-block' => '{{doc-right|block}}',
 'right-blockemail' => '{{doc-right|blockemail}}',
@@ -1687,6 +1747,7 @@ It can be given to the group {{msg|group-suppress|pl=yes}}, although that group
 See also
 * {{msg|right-suppressionlog|pl=yes}}
 * {{msg|right-suppressrevision|pl=yes}}
+* {{msg|right-deletelogentry|pl=yes}}
 * {{msg|right-deleterevision|pl=yes}}',
 'right-ipblock-exempt' => '{{doc-right|ipblock-exempt}}
 This user automatically bypasses IP blocks, auto-blocks and range blocks - so I presume - but I am uncertain',
@@ -1719,7 +1780,8 @@ The rate limits have no effect on the groups that have this right. Rate limits i
 'right-passwordreset' => '{{doc-right|passwordreset}}',
 
 # User rights log
-'rightslog' => 'In [[Special:Log]]',
+'rightslog' => '{{doc-logpage}}
+In [[Special:Log]]',
 'rightslogtext' => 'Text in [[Special:Log/rights]].',
 'rightslogentry' => 'This message is displayed in the [[Special:Log/rights|User Rights Log]] when a bureaucrat changes the user groups for a user.
 
@@ -1802,10 +1864,10 @@ Similar to {{msg-mw|wlnote}} which is used on [[Special:Watchlist]].
  Example: "\'\'{{int:rcnote/en|50|7||24 January 2008|14:48}}\'\'"',
 'rcnotefrom' => 'This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time. The corrosponding message is {{msg-mw|Rclistfrom}} (without split of date and time, [[bugzilla:19104|Bug 19104]]).
 
-Parameter $1 is the maximum number of changes that are displayed.
-Parameter $2 is a date and time.
-Parameter $3 is a date.
-Parameter $4 is a time.',
+Parameter $1 is the maximum number of changes that are displayed.
+* Parameter $2 is a date and time. (alternative to $3 and $4)
+* Parameter $3 is a date. (alternative to $1)
+* Parameter $4 is a time. (alternative to $1)',
 'rclistfrom' => 'Used on [[Special:RecentChanges]]. Parameter $1 is a link to the revision of a specific date and time. The date and the time are the link description (without split of date and time, [[bugzilla:19104|Bug 19104]]). The corrosponding message is {{msg-mw|Rcnotefrom}}.',
 'rcshowhideminor' => "Option text in [[Special:RecentChanges]]. Parameters:
 * $1 is the 'show/hide' command, with the text taken from either {{msg-mw|show}} or {{msg-mw|hide}}.",
@@ -1868,7 +1930,8 @@ Text displayed when uploading a file using [[Special:Upload]].",
 'upload-permitted' => 'Used in [[Special:Upload]].',
 'upload-preferred' => 'Used in [[Special:Upload]].',
 'upload-prohibited' => 'Used in [[Special:Upload]].',
-'uploadlogpage' => 'Page title of [[Special:Log/upload]].',
+'uploadlogpage' => '{{doc-logpage}}
+Page title of [[Special:Log/upload]].',
 'filename' => '{{Identical|Filename}}',
 'filedesc' => '{{Identical|Summary}}',
 'fileuploadsummary' => '{{Identical|Summary}}',
@@ -2044,7 +2107,7 @@ Used on [[Special:UploadWizard]].',
 'http-invalid-scheme' => 'The message appears in the Mediawiki code as follows:
 
  if ( $this->parsedUrl[\'scheme\'] != \'http\' ) {
-    $this->status->fatal( \'http-invalid-scheme\', $this->parsedUrl[\'scheme\'] );
+       $this->status->fatal( \'http-invalid-scheme\', $this->parsedUrl[\'scheme\'] );
  }
 
 Siebrand think this has to do with allowing MediaWiki to fetch remote URLs, and in that not allowing anything but "http://" request. So if this for example is "irc://" or "https://", $1 would be "irc" or "https" respectively.
@@ -2157,6 +2220,7 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
 * {{msg-mw|sharedupload}}, {{msg-mw|sharedupload-desc-here}}, {{msg-mw|sharedupload-desc-there}}',
 'shared-repo-name-wikimediacommons' => '{{optional}}',
 'filepage.css' => '{{Optional}}',
+'upload-disallowed-here' => 'This message appears on an image page in place of the normal reupload link if they cannot upload - e.g. if the image page is upload protected and they do not have the right priviledge.',
 
 # File reversion
 'filerevert' => '{{Identical|Revert}}',
@@ -2270,7 +2334,7 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 
 * '''Note:''' Do not change the link [[MediaWiki:Disambiguationspage]], even because it is listed as problematic. Be sure the \"D\" is in uppercase, so not \"d\".
 
-* '''Background information:''' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as diambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of diambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].",
+* '''Background information:''' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].",
 
 'doubleredirects' => 'Name of [[Special:DoubleRedirects]] displayed in [[Special:SpecialPages]]',
 'doubleredirectstext' => 'Shown on top of [[Special:Doubleredirects]]',
@@ -2297,6 +2361,8 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 # Miscellaneous special pages
 'nbytes' => 'Message used on the history page of a wiki page. Each version of a page consist of a number of bytes. $1 is the number of bytes that the page uses. Uses plural as configured for a language based on $1.',
 'ncategories' => "Used in the special page '[[Special:MostCategories]]' in brackets after each entry on the list signifying how many categories a page is part of. $1 is the number of categories.",
+'ninterwikis' => "Used in the special page '[[Special:MostInterwikis]]' in brackets after each entry on the list signifying how many interwikis a page is part of. Parameters:
+* $1 is the number of interwiki links.",
 'nlinks' => 'This appears in brackets after each entry on the special page [[Special:MostLinked]]. $1 is the number of wiki links.',
 'nmembers' => 'Appears in brackets after each category listed on the special page [[Special:WantedCategories]]. $1 is the number of members of the category.',
 'nrevisions' => 'Number of revisions.',
@@ -2327,6 +2393,7 @@ $1 is a page title",
 'mostlinkedtemplates' => 'Name of special page displayed in [[Special:SpecialPages]]',
 'mostcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
 'mostimages' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'mostinterwikis' => 'Name of special page displayed in [[Special:SpecialPages]]',
 'mostrevisions' => 'Name of special page displayed in [[Special:SpecialPages]]',
 'prefixindex' => 'The page title of [[Special:PrefixIndex]]. When the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.',
 'prefixindex-namespace' => 'The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace',
@@ -2382,7 +2449,8 @@ The title is {{msg-mw|nopagetitle}}.',
 'specialloguserlabel' => 'Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions \'\'performed\'\' by the specified user.  "Carried out" and "done" are possible alternatives for "performed".',
 'speciallogtitlelabel' => 'Used in [[Special:Log]] as a label for an input field with which the log can be filtered.  This filter selects for pages or users on which a log action was performed.',
 'log' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'all-logs-page' => 'Title of [[Special:Log]].',
+'all-logs-page' => '{{doc-logpage}}
+Title of [[Special:Log]].',
 'alllogstext' => 'Header of [[Special:Log]]',
 'log-title-wildcard' => '* Appears in: [[Special:Log]]
 * Description: A check box to enable prefix search option',
@@ -2484,7 +2552,9 @@ You can apparently use 'URL' instead of 'hostname'.",
 'activeusers-noresult' => 'identical with {{msg-mw|listusers-noresult}}',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in [[Special:RecentChanges]].',
+'newuserlogpage' => '{{doc-logpage}}
+
+Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in [[Special:RecentChanges]].',
 'newuserlogpagetext' => 'Part of the "Newuserlog" extension. It is the description you can see on [[Special:Log/newusers]].',
 
 # Special:ListGroupRights
@@ -2499,10 +2569,10 @@ You can apparently use 'URL' instead of 'hostname'.",
 'listgrouprights-helppage' => "The link used on [[Special:ListGroupRights]]. Just translate \"Group rights\", and '''leave the \"Help:\" namespace exactly as it is'''.",
 'listgrouprights-members' => 'Used on [[Special:ListGroupRights]] and [[Special:Statistics]] as a link to [[Special:ListUsers|Special:ListUsers/"group"]], a list of members in that group.',
 'listgrouprights-right-display' => "{{optional}}
-* $1 is the text from the 'right-...' messages, i.e. [[MediaWiki:right-edit]] = {{int:right-edit}}
+* $1 is the text from the 'right-...' messages, i.e. {{msg-mw|right-edit}}
 * $2 is the codename of this right",
 'listgrouprights-right-revoked' => "{{optional}}
-* $1 is the text from the 'right-...' messages, i.e. [[MediaWiki:right-edit]] = {{int:right-edit}}
+* $1 is the text from the 'right-...' messages, i.e. {{msg-mw|right-edit}}
 * $2 is the codename of this right",
 'listgrouprights-addgroup' => 'This is an individual right for groups, used on [[Special:ListGroupRights]].
 * $1 is an enumeration of group names.
@@ -2526,12 +2596,16 @@ See also {{msg-mw|listgrouprights-addgroup-all}}.',
 * $2 is the number of group names in $1.',
 
 # E-mail user
-'emailuser' => 'Link in the sidebar and title of [[Special:EmailUser|special page]]',
+'emailuser' => 'Link in the sidebar to send an e-mail to a user.',
+'emailuser-title-target' => 'Title of [[Special:EmailUser|special page]] when a user was given to e-mail. Parameters:
+* $1 is a plain text username, used for GENDER.',
+'emailuser-title-notarget' => 'Title of [[Special:EmailUser|special page]] when no user given to e-mail yet',
 'emailpage' => "Title of special page [[Special:EmailUser]], when it is the destination of the sidebar link {{msg-mw|Emailuser}} on a user's page.",
 'emailpagetext' => 'This is the text that is displayed above the e-mail form on [[Special:EmailUser]].
 
 Special:EmailUser appears when you click on the link "E-mail this user" in the sidebar, but only if there is an e-mail address in the recipient\'s user preferences. If there isn\'t then the message [[Mediawiki:Noemailtext]] will appear instead of Special:EmailUser.',
-'defemailsubject' => 'The default subject of EmailUser emails.  The first parameter is the username of the user sending the email.',
+'defemailsubject' => 'The default subject of EmailUser emails. Parameters:
+* $1 is the username of the user sending the email and can be used for GENDER.',
 'usermaildisabled' => 'Caption for an error message ({{msg-mw|Usermaildisabledtext}}) shown when the user-to-user e-mail feature is disabled on the wiki (see [[mw:Manual:$wgEnableEmail]], [[mw:Manual:$wgEnableUserEmail]]).',
 'noemailtitle' => 'The title of the message that appears instead of Special:EmailUser after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user.',
 'noemailtext' => 'The text of the message that appears in [[Special:EmailUser]] after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user because he has not specified or not confirmed an e-mail address.',
@@ -2644,7 +2718,8 @@ $1 is the <b>approximate</b> number of revisions that the page has, the message
 'deletedtext' => 'Parameters:
 * $1 is a page that was deleted
 * $2 is {{msg-mw|deletionlog}}',
-'dellogpage' => 'The name of the deletion log. Used as heading on [[Special:Log/delete]] and in the drop down menu for selecting logs on [[Special:Log]].
+'dellogpage' => '{{doc-logpage}}
+The name of the deletion log. Used as heading on [[Special:Log/delete]] and in the drop down menu for selecting logs on [[Special:Log]].
 
 {{Identical|Deletion log}}',
 'dellogpagetext' => 'Text in [[Special:Log/delete]].',
@@ -2667,7 +2742,13 @@ $1 is the <b>approximate</b> number of revisions that the page has, the message
 'rollback' => '{{Identical|Rollback}}',
 'rollback_short' => '{{Identical|Rollback}}',
 'rollbacklink' => '{{Identical|Rollback}}
+This link text appears on the recent changes page to users who have the "rollback" right.  It is also effectively a submit button; when clicked it performs the rollback without going to a dialog box first.
 This message has a tooltip {{msg-mw|tooltip-rollback}}',
+'rollbacklinkcount' => 'Text of the rollback link showing the number of edits to be rolled back. This link is also effectively a submit button; when clicked it performs the rollback without going to a dialog box first.  See also {{msg-mw|rollbacklink}}.
+* $1: the number of edits that will be rollbacked. If $1 is over the value of $wgShowRollbackEditCount (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.',
+'rollbacklinkcount-morethan' => 'Text of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.
+
+When the number of edits rolled back is smaller than [[mw:Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.',
 'rollbackfailed' => '{{Identical|Rollback}}',
 'cantrollback' => '{{Identical|Revert}}
 {{Identical|Rollback}}',
@@ -2691,7 +2772,8 @@ In other cases the message {{msg-mw|revertpage}} is used.',
 {{Identical|Rollback}}',
 
 # Protect
-'protectlogpage' => 'Title of [[Special:Log/protect]].',
+'protectlogpage' => '{{doc-logpage}}
+Title of [[Special:Log/protect]].',
 'protectlogtext' => 'Text in [[Special:Log/protect]].',
 'protectedarticle' => 'Text describing an action on [[Special:Log]]. $1 is a page title.',
 'modifiedarticleprotection' => 'Text describing an action on [[Special:Log]]. $1 is a page title.',
@@ -2739,11 +2821,9 @@ This message was something like "unlock move protection" in the past.',
 <tt><nowiki>* Groupname</nowiki></tt> - defines a new group<br />
 <tt><nowiki>** Reason</nowiki></tt> - defines a reason in this group',
 'protect-edit-reasonlist' => 'Shown beneath the page protection form on the right side. It is a link to [[MediaWiki:Protect-dropdown]]. See also {{msg|Delete-edit-reasonlist}} and {{msg|Ipb-edit-dropdown}}.',
-'protect-expiry-options' => "* Description: Options for the duration of the page protection.
-* <font color=\"red\">Be careful:</font> '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.
-* Example: See e.g. [[MediaWiki:Protect-expiry-options/nl]] if you still don't know how to do it.
+'protect-expiry-options' => "{{Identical|Infinite}}{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
 
-{{Identical|Infinite}}",
+Options for the duration of the page protection. Example: See e.g. [[MediaWiki:Protect-expiry-options/nl]] if you still don't know how to do it.",
 'restriction-type' => 'Used on [[Special:ProtectedPages]]. The text next to a drop-down box. See [[mw:Manual:Administrators|MediaWiki Manual]] for more information on protection.',
 'restriction-level' => 'Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. The text next to a drop-down box. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.',
 'minimum-size' => 'Used in [[Special:Protectedpages]] as a pair of radio buttons, with {{msg-mw|Maximum-size}}. There is an input box to specify the minimum bites of the projected pages listed.',
@@ -2927,15 +3007,14 @@ Example line:
 'ipbenableautoblock' => '{{Identical|Automatically block ...}}',
 'ipbsubmit' => '{{Identical|Block this user}}',
 'ipbother' => '{{Identical|Other time}}',
-'ipboptions' => "* Description: Options for the duration of the block.
-* <font color=\"red\">Be careful:</font> '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.
-* Example: See e.g. [[MediaWiki:Ipboptions/nl]] if you still don't know how to do it.
+'ipboptions' => "{{Identical|Infinite}}{{doc-important|Be careful: '''1 translation:1 english''', so the first part is the translation and the second part should stay in English.}}
 
-{{Identical|Infinite}}",
+Options for the duration of the block. Example: See e.g. [[MediaWiki:Ipboptions/nl]] if you still don't know how to do it.",
 'ipbotheroption' => '{{Identical|Other}}',
 'ipbotherreason' => '{{Identical|Other/additional reason}}',
 'ipbhidename' => 'This is the label for a checkbox in the user block form on [[Special:Block]].',
 'ipbwatchuser' => 'This is an option on [[Special:BlockIP]] to watch the user page and talk page of the blocked user',
+'ipb-disableusertalk' => '{{doc-singularthey}}',
 'ipb-change-block' => 'Confirmation checkbox required for blocks that would override an earlier block. Appears together with {{msg|ipb-needreblock}}.',
 'badipaddress' => 'An error message shown when one entered an invalid IP address in blocking page.',
 'blockipsuccesstext' => '<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is supported.',
@@ -2990,7 +3069,9 @@ Usage:
 'emaillink' => 'Used as display name for a link to send an e-mail to a user in the user tool links. Example: "(Talk | contribs | block | send e-mail)".
 
 {{Identical|E-mail}}',
-'blocklogpage' => "The page name of [[Special:Log/block]]. Also appears in the drop down menu of [[Special:Log]] pages and in the action links of Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").
+'blocklogpage' => "{{doc-logpage}}
+
+The page name of [[Special:Log/block]]. Also appears in the drop down menu of [[Special:Log]] pages and in the action links of Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").
 
 {{Identical|Block log}}",
 'blocklog-showlog' => 'Parameters:
@@ -3018,6 +3099,7 @@ See also {{msg-mw|Blocklistline}}.',
 'ipb_already_blocked' => '{{Identical|$1 is already blocked}}',
 'ipb-otherblocks-header' => '[[File:Special.Block with other blocks from GlobalBlocking and TorBlocks.png|thumb|Example]]
 Used on [[Special:Block]] as header for other blocks, i.e. from GlobalBlocking or TorBlocks',
+'unblock-hideuser' => '{{doc-singularthey}}',
 'blockme' => 'The page title of [[Special:Blockme]], a feature which is disabled by default.',
 'proxyblocksuccess' => '{{Identical|Done}}',
 'sorbs' => '{{optional}}',
@@ -3077,7 +3159,8 @@ See also {{msg-mw|Movepagetext-noredirectfixer|notext=1}}',
 'move-subpages' => 'The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any subpages will be moved with the main page to a new title.',
 'move-talk-subpages' => 'The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any talk subpages will be moved with the talk page to a new title.',
 'movepage-max-pages' => 'PROBABLY (A GUESS): when moving a page, you can select an option of moving its subpages, but there is a maximum that can be moved automatically.',
-'movelogpage' => 'Title of [[Special:Log/move]]. Used as heading on that page, and in the dropdown menu on log pages.',
+'movelogpage' => '{{doc-logpage}}
+Title of [[Special:Log/move]]. Used as heading on that page, and in the dropdown menu on log pages.',
 'movelogpagetext' => "Text on the special page 'Move log'.",
 'movesubpage' => "This is a section header on [[Special:MovePage]], below is a list of subpages.
 Parameters:
@@ -3157,6 +3240,7 @@ Tooltip shown when hovering over a little sign of a thumb image, to go to the im
 'import' => 'The title of the special page [[Special:Import]];',
 'import-interwiki-history' => 'This is an option on [[Special:Import]]. Usually, when unchecked, only the first version of a page is imported. When you check the option, all versions are imported. This is important often to check for licensing reasons.',
 'import-interwiki-submit' => '{{Identical|Import}}',
+'import-interwiki-rootpage' => 'Used on [[Special:Import]] as label',
 'import-upload-filename' => 'Used on [[Special:Import]] as label for upload of an XML file containing the pages to import.',
 'xml-error-string' => ':$1: Some kind of message, perhaps name of the error?
 :$2: line number
@@ -3177,9 +3261,13 @@ See also:
 * $1 is a page name.
 See also:
 * {{msg-mw|import-error-edit}}',
+'import-options-wrong' => 'Used on [[Special:Import]], when one of the options has an error.',
+'import-rootpage-invalid' => 'Used on [[Special:Import]], when the root page is invalid.',
+'import-rootpage-nosubpage' => 'Used on [[Special:Import]], when the import namespace does not support subpages. Parameters:
+* $1 is a namespace name.',
 
 # Import log
-'importlogpage' => '',
+'importlogpage' => '{{doc-logpage}}',
 'importlogpagetext' => 'This text appears at the top of the [//translatewiki.net/w/i.php?title=Special:Log&type=import import log] special page.',
 'import-logentry-upload' => 'This is the text of an entry in the Import log (and Recent Changes), after hour (and date, only in the Import log) and sysop name:
 * $1 is the name of the imported file',
@@ -3359,20 +3447,53 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 'nocredits' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}) but when there are no credits available. Note that the credits action is disabled by default (currently enabled on translatewiki.net).',
 
 # Spam protection
-'spam_reverting' => '{{Identical|Revert}}',
+'spam_reverting' => 'Edit summary for spam cleanup script. Used when a page is reverted because all later revisions contained a particular link. Parameters:
+* $1 is a spammed domain name.',
+'spam_blanking' => 'Edit summary for spam cleanup script. Used when a page is blanked (made to have no content, but still exist) because the script could not find an appropriate revision to set the page to. Parameters:
+* $1 is a spammed domain name.',
+'spam_deleting' => 'Edit summary for spam cleanup script. Used when a page is deleted because all revisions contained a particular link. Parameters:
+* $1 is a spammed domain name.',
 
 # Info page
-'pageinfo-title' => 'Page title for action=info.
-
+'pageinfo-title' => 'Page title for action=info. Parameters:
 * $1 is the page name',
-'pageinfo-header-edits' => 'Table section header in action=info.
-{{Identical|Edit}}',
-'pageinfo-header-watchlist' => 'Table section header in action=info.',
-'pageinfo-header-views' => 'Table section header in action=info.
-{{Identical|View}}',
-'pageinfo-subjectpage' => 'Table header in action=info.
-{{Identical|Page}}',
-'pageinfo-talkpage' => 'Table header in action=info.',
+'pageinfo-header-basic' => 'Table section header in action=info.',
+'pageinfo-header-edits' => 'Table section header in action=info.',
+'pageinfo-header-restrictions' => 'Table section header in action=info.',
+'pageinfo-header-properties' => 'Table section header in action=info.',
+'pageinfo-display-title' => 'The title that is displayed when the page is viewed.',
+'pageinfo-default-sort' => 'The key by which the page is sorted in categories by default.',
+'pageinfo-length' => 'The length of the page, in bytes.',
+'pageinfo-article-id' => 'The numeric identifier of the page.',
+'pageinfo-robot-policy' => 'The search engine status of the page, e.g. "marked as index".',
+'pageinfo-robot-index' => 'An indication that the page is indexable.',
+'pageinfo-robot-noindex' => 'An indication that the page is not indexable.',
+'pageinfo-views' => 'The number of times the page has been viewed.',
+'pageinfo-watchers' => 'The number of users watching the page.',
+'pageinfo-redirects-name' => 'The number of redirects to the page.',
+'pageinfo-redirects-value' => 'Parameters:
+* $1 is the number of redirects to the page.',
+'pageinfo-subpages-name' => 'The number of subpages of the page.',
+'pageinfo-subpages-value' => 'Parameters:
+* $1 is the number of subpages of the page.
+* $2 is the number of subpages of the page that are redirects.
+* $3 is the number of subpages of the page that are not redirects.',
+'pageinfo-firstuser' => 'The user who created the page.',
+'pageinfo-firsttime' => 'The date and time the page was created.',
+'pageinfo-lastuser' => 'The last user who edited the page.',
+'pageinfo-lasttime' => 'The date and time the page was last edited.',
+'pageinfo-edits' => 'The total number of times the page has been edited.',
+'pageinfo-authors' => 'The total number of users who have edited the page.',
+'pageinfo-recent-edits' => 'The number of times the page has been edited recently. $1 is a localised duration (e.g. 9 days).',
+'pageinfo-recent-authors' => 'The number of users who have edited the page recently.',
+'pageinfo-restriction' => 'Parameters:
+* $1 is the type of page protection (message restriction-$type, preferably in lowercase). If your language doesn\'t have small and capital letters, you can simply write <nowiki><code>$1</code></nowiki>.',
+'pageinfo-magic-words' => 'The list of magic words on the page. Parameters:
+* $1 is the number of magic words on the page.',
+'pageinfo-hidden-categories' => 'The list of hidden categories on the page. Parameters:
+* $1 is the number of hidden categories on the page.',
+'pageinfo-templates' => 'The list of templates transcluded within the page. Parameters:
+* $1 is the number of templates transcluded within the page.',
 
 # Skin names
 'skinname-standard' => '{{optional}}
@@ -3390,7 +3511,7 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 'markedaspatrolledtext' => '{{Identical|Markedaspatrolled}}',
 
 # Patrol log
-'patrol-log-page' => 'Name of log.',
+'patrol-log-page' => '{{doc-logpage}}',
 'patrol-log-header' => 'Text that appears above the log entries on the [[Special:log|patrol log]].',
 'log-show-hide-patrol' => '* $1 is one of {{msg|show}} or {{msg|hide}}',
 
@@ -3425,7 +3546,12 @@ Parameters:
 * $4 is the MIME type, a formalized textual information — for example: <code>image/jpeg</code>
 * $5 is the total number of pages in the document.',
 'file-nohires' => 'File info displayed on file description page. For example of message in use see [[:File:Mouse10.gif]].',
-'svg-long-desc' => 'Displayed under an SVG image at the image description page. Note that argument 3 is a string that includes the file size unit symbol. See for example [[:File:Yes check.svg]].',
+'svg-long-desc' => 'Displayed under an SVG image at the image description page. Note that argument 3 is a string that includes the file size unit symbol. See for example [[:File:Yes check.svg]].
+
+Start with a lowercase letter, unless the first word is “SVG”.',
+'svg-long-desc-animated' => 'Displayed under an SVG image at the image description page if the image is animated. Non-animated images use {{msg-mw|svg-long-desc}}. $1 is width, $2 is height, and $3 is file size, including unit (for example "10 KB").
+
+Start with a lowercase letter, unless the first word is “SVG”.',
 'show-big-image' => 'Displayed under an image at the image description page, when it is displayed smaller there than it was uploaded.',
 'show-big-image-size' => '
 Parameters:
@@ -3440,6 +3566,8 @@ Parameters:
 The variable $1 is the number of individual frames in an animated gif file.
 
 For example of message in use see [[:File:Mouse10.gif]].',
+'file-no-thumb-animation' => 'We cannot animate thumbnails of this file. This notice is shown on the image description page on animated svg files just below {{msg-mw|file-info-size}}. This message may be overridden by a more specific message of the form file-no-thumb-animation-&lt;extension&gt; like {{msg-mw|file-no-thumb-animation-gif}}',
+'file-no-thumb-animation-gif' => 'Cannot animate thumbnails of this gif file, because it has too big a resolution. The cut off resolution can vary between wikis ([[mw:manual:$wgMaxAnimatedGifArea|$wgMaxAnimatedGifArea]]). Note that resolution is calculated as width times height times number of frames. See {{msg-mw|file-no-thumb-animation}}.',
 
 # Special:NewFiles
 'newimages' => 'Page title of [[Special:NewImages]].',
@@ -4322,113 +4450,113 @@ Hint: the text "Remove Titles" is in {{msg-mw|watchlistedit-normal-submit}}',
 
 # Iranian month names
 'iranian-calendar-m1' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m2' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m3' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m4' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m5' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m6' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m7' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m8' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m9' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m10' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m11' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 'iranian-calendar-m12' => '{{optional}}
-Name of month in Iranian calender.',
+Name of month in Iranian calendar.',
 
 # Hijri month names
 'hijri-calendar-m1' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m2' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m3' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m4' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m5' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m6' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m7' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m8' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m9' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m10' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m11' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 'hijri-calendar-m12' => '{{optional}}
-Name of month in Islamic calender.',
+Name of month in Islamic calendar.',
 
 # Hebrew month names
 'hebrew-calendar-m1' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m2' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m3' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m4' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m5' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m6' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m6a' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m6b' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m7' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m8' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m9' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m10' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m11' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m12' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m1-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m2-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m3-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m4-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m5-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m6-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m6a-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m6b-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m7-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m8-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m9-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m10-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m11-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 'hebrew-calendar-m12-gen' => '{{optional}}
-Name of month in Hebrew calender.',
+Name of month in Hebrew calendar.',
 
 # Signatures
 'signature' => "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp)
@@ -4476,8 +4604,7 @@ This is being used in [[Special:Version]], preceeding the subversion revision nu
 'version-software-product' => 'Shown in [[Special:Version]]',
 'version-software-version' => '{{Identical|Version}}',
 'version-entrypoints' => 'Header on [[Special:Version]] above a table that lists the URLs of various entry points in this MediaWiki installation. Entry points are the "places" where the wiki\'s content and information can be accessed in various ways, for instance the standard index.php which shows normal pages, histories etc.',
-'version-entrypoints-header-entrypoint' => 'Header for the first column in the entry points table on [[Special:Version]].
-See also {{msg-mw|Version-entrypoints}}',
+'version-entrypoints-header-entrypoint' => 'ପ୍ରବେଶ ବିନ୍ଦୁ',
 'version-entrypoints-header-url' => 'Header for the second column in the entry points table on [[Special:Version]].',
 'version-entrypoints-articlepath' => 'A short description of the article path entry point. Links to the mediawiki.org documentation page for $wgArticlePath.',
 'version-entrypoints-scriptpath' => 'A short description of the script path entry point. Links to the mediawiki.org documentation page for $wgScriptPath.',
@@ -4710,9 +4837,17 @@ $4 is the gender of the target user.',
 'api-error-empty-file' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-emptypage' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-fetchfileerror' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-fileexists-forbidden' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-fileexists-shared-forbidden' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-file-too-large' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-filename-tooshort' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-filetype-banned' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-filetype-banned-type' => "API error message that can be used for client side localisation of API errors.
+
+* $1 is the extension(s) of the file which cannot be uploaded
+* $2 is the list of file extensions that can be uploaded (Example: ''png, gif, jpg, jpeg, ogg, pdf, svg.'')
+* $3 is the number of allowed file formats (to be used for the PLURAL function)
+* $4 is the number of extensions that could not be uploaded (to be used for the PLURAL function)",
 'api-error-filetype-missing' => 'The word "extension" refers to the part behind the last dot in a file name, that by convention gives a hint about the kind of data format which a files contents are in.',
 'api-error-hookaborted' => 'The word "extension" here refers to a [[:mw:Manual:Extensions|MediaWiki Extension]] which extends the functionality of the basic wiki by adding something to its capabilities. "… aborted by an extension" implies that an operation could not be performed successfully or was not allowed to continue to its intended end.',
 'api-error-http' => 'API error message that can be used for client side localisation of API errors.',
index 4fef2a4..7c34cfb 100644 (file)
@@ -130,139 +130,139 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#PUSAPUNA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__YUYARINANNAQ__', '__NOTDC__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__RIKCHASUYUNNAQ__', '__NOGALERÍA__', '__NOGALERIA__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__YUYARINATAATIPACHIY__', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__YUYARINA__', '__TDC__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__UMANNAQ__', '__NOTÍTULO__', '__NOTITULO__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'KUNANKILLA', 'MESACTUAL', 'MES_ACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'KUNANKILLASUTI', 'NOMBREMESACTUAL', 'NOMBRE_MES_ACTUAL', 'MESACTUALCOMPLETO', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'KUNANKILLASUTIP', 'GENERADORNOMBREMESACTUAL', 'MESACTUALGENITIVO', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'KUNANKILLAPISI', 'ABREVIACIONNOMBREMESACTUAL', 'ABREVIACIÓNNOMBREMESACTUAL', 'MESACTUALABREVIADO', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'KUNANPUNCHAW', 'DÍAACTUAL', 'DIAACTUAL', 'DÍA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'KUNANPUNCHAW2', 'DÍAACTUAL2', 'DIAACTUAL2', 'DÍA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'KUNANPUNCHAWSUTI', 'NOMBREDÍAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'KUNANWATA', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'KUNANPACHA', 'HORAACTUAL', 'HORA_ACTUAL', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'TIEMPOACTUAL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'KUNANURA', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'KAYPIKILLA', 'MESLOCAL', 'MESLOCAL2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'KAYPIKILLASUTI', 'NOMBREMESLOCAL', 'MESLOCALCOMPLETO', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'KAYPIKILLASUTIP', 'GENERADORNOMBREMESLOCAL', 'MESLOCALGENITIVO', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'KAYPIKILLAPISI', 'ABREVIACIONMESLOCAL', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'KAYPIPUNCHAW', 'DÍALOCAL', 'DIALOCAL', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'KAYPIPUNCHAW2', 'DIALOCAL2', 'DÍALOCAL2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'KAYPIPUNCHAWSUTI', 'NOMBREDIALOCAL', 'NOMBREDÍALOCAL', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'KAYPIWATA', 'AÑOLOCAL', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'KAYPIPACHA', 'HORALOCAL', 'HORAMINUTOSLOCAL', 'TIEMPOLOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'KAYPIURA', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'HAYKAPANQA', 'NÚMERODEPÁGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'HAYKAQILLQA', 'NÚMERODEARTÍCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'HAYKAWILLANIQI', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'HAYKARURAQ', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'HAYKARURACHKAQ', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'HAYKALLAMKAPUSQA', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'HAYKAQHAWASQA', 'HAYKAQAWASQA', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'PANQASUTI', 'NOMBREDEPAGINA', 'NOMBREDEPÁGINA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'PANQASUTIE', 'NOMBREDEPAGINAC', 'NOMBREDEPÁGINAC', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'SUTIKITI', 'ESPACIODENOMBRE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'SUTIKITIE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'RIMANAKUYKITI', 'RIMAYKITI', 'ESPACIODEDISCUSION', 'ESPACIODEDISCUSIÓN', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'RIMANAKUYKITIE', 'RIMAYKITIE', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'QILLQAKITI', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÍCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'QILLQAKITIE', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÍCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'HUNTAPANQASUTI', 'NOMBREDEPÁGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÁGINAENTERA', 'NOMBREDEPAGINAENTERA', 'NOMBRECOMPLETODEPÁGINA', 'NOMBRECOMPLETODEPAGINA', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'HUNTAPANQASUTIE', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÁGINAC', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'URINPANQASUTI', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÁGINA', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'URINPANQASUTIE', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÁGINAC', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'TIKSIPANQASUTI', 'NOMBREDEPAGINABASE', 'NOMBREDEPÁGINABASE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'TIKSIPANQASUTIE', 'NOMBREDEPAGINABASEC', 'NOMBREDEPÁGINABASEC', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'RIMANAKUYPANQASUTI', 'NOMBREDEPÁGINADEDISCUSIÓN', 'NOMBREDEPAGINADEDISCUSION', 'NOMBREDEPAGINADISCUSION', 'NOMBREDEPÁGINADISCUSIÓN', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'RIMANAKUYPANQASUTIE', 'NOMBREDEPÁGINADEDISCUSIÓNC', 'NOMBREDEPAGINADEDISCUSIONC', 'NOMBREDEPAGINADISCUSIONC', 'NOMBREDEPÁGINADISCUSIÓNC', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'QILLQAPANQASUTI', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÁGINADETEMA', 'NOMBREDEPÁGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÁGINADEARTÍCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'QILLQAPANQASUTIE', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÁGINADETEMAC', 'NOMBREDEPÁGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÁGINADEARTÍCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'WILLA:', 'MSJ:', 'MSG:' ),
-       'subst'                   => array( '0', 'WAKCHAY:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'WILLAMUSUQ:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'rikchacha', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'rikchacha=$1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'paña', 'alliq', 'derecha', 'dcha', 'der', 'right' ),
-       'img_left'                => array( '1', 'lluqi', 'ichuq', 'izquierda', 'izda', 'izq', 'left' ),
-       'img_none'                => array( '1', 'manaima', 'mana', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
-       'img_center'              => array( '1', 'chawpi', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'inchuyuq', 'inchu', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'inchunnaq', 'sinmarco', 'sin_embarcar', 'sinenmarcar', 'sin_enmarcar', 'frameless' ),
-       'img_page'                => array( '1', 'panqa=$1', 'pagina=$1', 'página=$1', 'pagina $1', 'página $1', 'pagina_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'sayaq', 'sayaq=$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'saywa', 'borde', 'border' ),
-       'img_baseline'            => array( '1', 'tiksisiqi', 'baseline' ),
-       'img_sub'                 => array( '1', 'uran', 'sub' ),
-       'img_super'               => array( '1', 'hanan', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'hawa', 'top' ),
-       'img_text_top'            => array( '1', 'qillqahawa', 'text-top' ),
-       'img_middle'              => array( '1', 'ukhupi', 'middle' ),
-       'img_bottom'              => array( '1', 'sikipi', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'qillqasiki', 'text-bottom' ),
-       'img_link'                => array( '1', 'tinki=$1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'wak=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'WILLAY:', 'INT:' ),
-       'sitename'                => array( '1', 'TIYAYSUTI', 'NOMBREDESITIO', 'NOMBREDELSITIO', 'SITENAME' ),
-       'ns'                      => array( '0', 'SKITI:', 'EN:', 'NS:' ),
-       'localurl'                => array( '0', 'KAYLLAURL:', 'URLLOCAL', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'KAYLLAURLE:', 'URLLOCALC:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'SIRWIQ', 'SERVIDOR', 'SERVER' ),
-       'servername'              => array( '0', 'SIRWIQSUTI', 'NOMBRESERVIDOR', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'QILLQAÑAN', 'QILLQANAN', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'SIMIKAMACHIY:', 'GRAMATICA:', 'GRAMÁTICA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'QHARIWARMI:', 'QARIWARMI:', 'GÉNERO:', 'GENERO:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__AMASUTITAHUKCHAYCHU__', '__NOCONVERTIRTITULO__', '__NOCONVERTIRTÍTULO__', '__NOCT___', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__AMASAMIQTAHUKCHAYCHU__', '__NOCONVERTIRCONTENIDO__', '__NOCC___', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'KUNANSIMANA', 'SEMANAACTUAL', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'KUNANSIMANAPUNCHAW', 'DDSACTUAL', 'DIADESEMANAACTUAL', 'DÍADESEMANAACTUAL', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'KAYLLASIMANA', 'SEMANALOCAL', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'KAYLLASIMANAPUNCHAW', 'DDSLOCAL', 'DIADESEMANALOCAL', 'DÍADESEMANALOCAL', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'MUSUQCHASQAID', 'IDDEREVISION', 'IDREVISION', 'IDDEREVISIÓN', 'IDREVISIÓN', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'MUSUQCHASQAPUNCHAW', 'DIADEREVISION', 'DIAREVISION', 'DÍADEREVISIÓN', 'DÍAREVISIÓN', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'MUSUQCHASQAPUNCHAW2', 'DIADEREVISION2', 'DIAREVISION2', 'DÍADEREVISIÓN2', 'DÍAREVISIÓN2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MUSUQCHASQAKILLA', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'MUSUQCHASQAWATA', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'MUSUQCHASQAPACHAQILLPA', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'MUSUQCHASQARURAQ', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'ACHKA:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'HUNTAURL:', 'URLCOMPLETA:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'HUNTAURLE:', 'URLCOMPLETAC:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'UCHUYÑAWPAQ:', 'UCHUYNAWPAQ:', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'HATUNÑAWPAQ:', 'HATUNNAWPAQ:', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'UCHUY:', 'MINUS:', 'MINÚS:', 'LC:' ),
-       'uc'                      => array( '0', 'HATUN:', 'MAYUS:', 'MAYÚS:', 'UC:' ),
-       'raw'                     => array( '0', 'CHAWA:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'SUTITARIKUCHIY', 'MOSTRARTÍTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
-       'currentversion'          => array( '1', 'KUNANMUSUQCHASQA', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'URLLLAWICHAY', 'URL-LLAWICHAY', 'CODIFICAR', 'CODIFICARURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'WATANALLAWICHAY', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'KUNANPACHAQILLPA', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'KAYLLAPACHAQILLPA', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'PURIRIYSANANCHA', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#RIMAY:', '#IDIOMA:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'SAMIQRIMAY', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'SUTIKITIPIPANQAKUNA:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'HAYKAKAMACHIQ', 'NÚMEROADMINISITRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NÚMEROADMINIISTRADORES', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'YUPAYRIKCHAKUY', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'PADLLUQI', 'PADICHUQ', 'PADLEFT' ),
-       'padright'                => array( '0', 'PADPAÑA', 'PADALLIQ', 'PADRIGHT' ),
-       'special'                 => array( '0', 'sapaq', 'especial', 'special' ),
-       'defaultsort'             => array( '1', 'ALLINCHAY:', 'SIQINCHAY:', 'ORDENAR:', 'ORDENPREDETERMINADO:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÍAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'WILLAÑIQIÑAN', 'WILLANIQINAN', 'RUTAARCHIVO', 'RUTARCHIVO', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'unanchacha', 'UNANCHACHA', 'etiqueta', 'ETIQUETA', 'tag' ),
-       'hiddencat'               => array( '1', '__PAKASQAKATIGURIYA__', '__CATEGORÍAOCULTA__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'KATIGURIYAPIPANQAKUNA', 'PÁGINASENCATEGORÍA', 'PÁGINASENCAT', 'PAGSENCAT', 'PAGINASENCATEGORIA', 'PAGINASENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'PANQACHHIKAN', 'PANQACHIKAN', 'PANQACHIKA', 'TAMAÑOPÁGINA', 'TAMAÑODEPÁGINA', 'TAMAÑOPAGINA', 'TAMAÑODEPAGINA', 'PAGESIZE' ),
-       'index'                   => array( '1', '__UNANCHAY__', '__INDEXAR__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__AMAUNANCHAYCHU__', '__NOINDEXAR__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'HUÑUPIYUPAY', 'HUNUPIYUPAY', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__TIYAQLLAPUSAPUNA__', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÁTICA__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'HAYKAAMACHAY', 'IMASINCHIAMACHAY', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
+       'redirect'                  => array( '0', '#PUSAPUNA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__YUYARINANNAQ__', '__NOTDC__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__RIKCHASUYUNNAQ__', '__NOGALERÍA__', '__NOGALERIA__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__YUYARINATAATIPACHIY__', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__YUYARINA__', '__TDC__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__UMANNAQ__', '__NOTÍTULO__', '__NOTITULO__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'KUNANKILLA', 'MESACTUAL', 'MES_ACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'KUNANKILLASUTI', 'NOMBREMESACTUAL', 'NOMBRE_MES_ACTUAL', 'MESACTUALCOMPLETO', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'KUNANKILLASUTIP', 'GENERADORNOMBREMESACTUAL', 'MESACTUALGENITIVO', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'KUNANKILLAPISI', 'ABREVIACIONNOMBREMESACTUAL', 'ABREVIACIÓNNOMBREMESACTUAL', 'MESACTUALABREVIADO', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'KUNANPUNCHAW', 'DÍAACTUAL', 'DIAACTUAL', 'DÍA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'KUNANPUNCHAW2', 'DÍAACTUAL2', 'DIAACTUAL2', 'DÍA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'KUNANPUNCHAWSUTI', 'NOMBREDÍAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'KUNANWATA', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'KUNANPACHA', 'HORAACTUAL', 'HORA_ACTUAL', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'TIEMPOACTUAL', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'KUNANURA', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'KAYPIKILLA', 'MESLOCAL', 'MESLOCAL2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'KAYPIKILLASUTI', 'NOMBREMESLOCAL', 'MESLOCALCOMPLETO', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'KAYPIKILLASUTIP', 'GENERADORNOMBREMESLOCAL', 'MESLOCALGENITIVO', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'KAYPIKILLAPISI', 'ABREVIACIONMESLOCAL', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'KAYPIPUNCHAW', 'DÍALOCAL', 'DIALOCAL', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'KAYPIPUNCHAW2', 'DIALOCAL2', 'DÍALOCAL2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'KAYPIPUNCHAWSUTI', 'NOMBREDIALOCAL', 'NOMBREDÍALOCAL', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'KAYPIWATA', 'AÑOLOCAL', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'KAYPIPACHA', 'HORALOCAL', 'HORAMINUTOSLOCAL', 'TIEMPOLOCAL', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'KAYPIURA', 'HORALOCAL', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'HAYKAPANQA', 'NÚMERODEPÁGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'HAYKAQILLQA', 'NÚMERODEARTÍCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'HAYKAWILLANIQI', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'HAYKARURAQ', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'HAYKARURACHKAQ', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'HAYKALLAMKAPUSQA', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'HAYKAQHAWASQA', 'HAYKAQAWASQA', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'PANQASUTI', 'NOMBREDEPAGINA', 'NOMBREDEPÁGINA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'PANQASUTIE', 'NOMBREDEPAGINAC', 'NOMBREDEPÁGINAC', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'SUTIKITI', 'ESPACIODENOMBRE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'SUTIKITIE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'RIMANAKUYKITI', 'RIMAYKITI', 'ESPACIODEDISCUSION', 'ESPACIODEDISCUSIÓN', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'RIMANAKUYKITIE', 'RIMAYKITIE', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'QILLQAKITI', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÍCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'QILLQAKITIE', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÍCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'HUNTAPANQASUTI', 'NOMBREDEPÁGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÁGINAENTERA', 'NOMBREDEPAGINAENTERA', 'NOMBRECOMPLETODEPÁGINA', 'NOMBRECOMPLETODEPAGINA', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'HUNTAPANQASUTIE', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÁGINAC', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'URINPANQASUTI', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÁGINA', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'URINPANQASUTIE', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÁGINAC', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'TIKSIPANQASUTI', 'NOMBREDEPAGINABASE', 'NOMBREDEPÁGINABASE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'TIKSIPANQASUTIE', 'NOMBREDEPAGINABASEC', 'NOMBREDEPÁGINABASEC', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'RIMANAKUYPANQASUTI', 'NOMBREDEPÁGINADEDISCUSIÓN', 'NOMBREDEPAGINADEDISCUSION', 'NOMBREDEPAGINADISCUSION', 'NOMBREDEPÁGINADISCUSIÓN', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'RIMANAKUYPANQASUTIE', 'NOMBREDEPÁGINADEDISCUSIÓNC', 'NOMBREDEPAGINADEDISCUSIONC', 'NOMBREDEPAGINADISCUSIONC', 'NOMBREDEPÁGINADISCUSIÓNC', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'QILLQAPANQASUTI', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÁGINADETEMA', 'NOMBREDEPÁGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÁGINADEARTÍCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'QILLQAPANQASUTIE', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÁGINADETEMAC', 'NOMBREDEPÁGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÁGINADEARTÍCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'WILLA:', 'MSJ:', 'MSG:' ),
+       'subst'                     => array( '0', 'WAKCHAY:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'WILLAMUSUQ:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'rikchacha', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'rikchacha=$1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'paña', 'alliq', 'derecha', 'dcha', 'der', 'right' ),
+       'img_left'                  => array( '1', 'lluqi', 'ichuq', 'izquierda', 'izda', 'izq', 'left' ),
+       'img_none'                  => array( '1', 'manaima', 'mana', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
+       'img_center'                => array( '1', 'chawpi', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'inchuyuq', 'inchu', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'inchunnaq', 'sinmarco', 'sin_embarcar', 'sinenmarcar', 'sin_enmarcar', 'frameless' ),
+       'img_page'                  => array( '1', 'panqa=$1', 'pagina=$1', 'página=$1', 'pagina $1', 'página $1', 'pagina_$1', 'página_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'sayaq', 'sayaq=$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'saywa', 'borde', 'border' ),
+       'img_baseline'              => array( '1', 'tiksisiqi', 'baseline' ),
+       'img_sub'                   => array( '1', 'uran', 'sub' ),
+       'img_super'                 => array( '1', 'hanan', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'hawa', 'top' ),
+       'img_text_top'              => array( '1', 'qillqahawa', 'text-top' ),
+       'img_middle'                => array( '1', 'ukhupi', 'middle' ),
+       'img_bottom'                => array( '1', 'sikipi', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'qillqasiki', 'text-bottom' ),
+       'img_link'                  => array( '1', 'tinki=$1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'wak=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'WILLAY:', 'INT:' ),
+       'sitename'                  => array( '1', 'TIYAYSUTI', 'NOMBREDESITIO', 'NOMBREDELSITIO', 'SITENAME' ),
+       'ns'                        => array( '0', 'SKITI:', 'EN:', 'NS:' ),
+       'localurl'                  => array( '0', 'KAYLLAURL:', 'URLLOCAL', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'KAYLLAURLE:', 'URLLOCALC:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'SIRWIQ', 'SERVIDOR', 'SERVER' ),
+       'servername'                => array( '0', 'SIRWIQSUTI', 'NOMBRESERVIDOR', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'QILLQAÑAN', 'QILLQANAN', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'SIMIKAMACHIY:', 'GRAMATICA:', 'GRAMÁTICA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'QHARIWARMI:', 'QARIWARMI:', 'GÉNERO:', 'GENERO:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__AMASUTITAHUKCHAYCHU__', '__NOCONVERTIRTITULO__', '__NOCONVERTIRTÍTULO__', '__NOCT___', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__AMASAMIQTAHUKCHAYCHU__', '__NOCONVERTIRCONTENIDO__', '__NOCC___', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'KUNANSIMANA', 'SEMANAACTUAL', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'KUNANSIMANAPUNCHAW', 'DDSACTUAL', 'DIADESEMANAACTUAL', 'DÍADESEMANAACTUAL', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'KAYLLASIMANA', 'SEMANALOCAL', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'KAYLLASIMANAPUNCHAW', 'DDSLOCAL', 'DIADESEMANALOCAL', 'DÍADESEMANALOCAL', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'MUSUQCHASQAID', 'IDDEREVISION', 'IDREVISION', 'IDDEREVISIÓN', 'IDREVISIÓN', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'MUSUQCHASQAPUNCHAW', 'DIADEREVISION', 'DIAREVISION', 'DÍADEREVISIÓN', 'DÍAREVISIÓN', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'MUSUQCHASQAPUNCHAW2', 'DIADEREVISION2', 'DIAREVISION2', 'DÍADEREVISIÓN2', 'DÍAREVISIÓN2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MUSUQCHASQAKILLA', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'MUSUQCHASQAWATA', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'MUSUQCHASQAPACHAQILLPA', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'MUSUQCHASQARURAQ', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'ACHKA:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'HUNTAURL:', 'URLCOMPLETA:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'HUNTAURLE:', 'URLCOMPLETAC:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'UCHUYÑAWPAQ:', 'UCHUYNAWPAQ:', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'HATUNÑAWPAQ:', 'HATUNNAWPAQ:', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'UCHUY:', 'MINUS:', 'MINÚS:', 'LC:' ),
+       'uc'                        => array( '0', 'HATUN:', 'MAYUS:', 'MAYÚS:', 'UC:' ),
+       'raw'                       => array( '0', 'CHAWA:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'SUTITARIKUCHIY', 'MOSTRARTÍTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
+       'currentversion'            => array( '1', 'KUNANMUSUQCHASQA', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'URLLLAWICHAY', 'URL-LLAWICHAY', 'CODIFICAR', 'CODIFICARURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'WATANALLAWICHAY', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'KUNANPACHAQILLPA', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'KAYLLAPACHAQILLPA', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'PURIRIYSANANCHA', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#RIMAY:', '#IDIOMA:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'SAMIQRIMAY', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'SUTIKITIPIPANQAKUNA:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'HAYKAKAMACHIQ', 'NÚMEROADMINISITRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NÚMEROADMINIISTRADORES', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'YUPAYRIKCHAKUY', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'PADLLUQI', 'PADICHUQ', 'PADLEFT' ),
+       'padright'                  => array( '0', 'PADPAÑA', 'PADALLIQ', 'PADRIGHT' ),
+       'special'                   => array( '0', 'sapaq', 'especial', 'special' ),
+       'defaultsort'               => array( '1', 'ALLINCHAY:', 'SIQINCHAY:', 'ORDENAR:', 'ORDENPREDETERMINADO:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÍAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'WILLAÑIQIÑAN', 'WILLANIQINAN', 'RUTAARCHIVO', 'RUTARCHIVO', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'unanchacha', 'UNANCHACHA', 'etiqueta', 'ETIQUETA', 'tag' ),
+       'hiddencat'                 => array( '1', '__PAKASQAKATIGURIYA__', '__CATEGORÍAOCULTA__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'KATIGURIYAPIPANQAKUNA', 'PÁGINASENCATEGORÍA', 'PÁGINASENCAT', 'PAGSENCAT', 'PAGINASENCATEGORIA', 'PAGINASENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'PANQACHHIKAN', 'PANQACHIKAN', 'PANQACHIKA', 'TAMAÑOPÁGINA', 'TAMAÑODEPÁGINA', 'TAMAÑOPAGINA', 'TAMAÑODEPAGINA', 'PAGESIZE' ),
+       'index'                     => array( '1', '__UNANCHAY__', '__INDEXAR__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__AMAUNANCHAYCHU__', '__NOINDEXAR__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'HUÑUPIYUPAY', 'HUNUPIYUPAY', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__TIYAQLLAPUSAPUNA__', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÁTICA__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'HAYKAAMACHAY', 'IMASINCHIAMACHAY', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
 );
 
 $messages = array(
@@ -307,7 +307,6 @@ $messages = array(
 'tog-watchlisthideliu' => "Rakiqunayuq ruraqkunap llamk'apusqankunata watiqay sutisuyupi pakay",
 'tog-watchlisthideanons' => "Rakiqunannaq ruraqkunap llamk'apusqankunata watiqay sutisuyupi pakay",
 'tog-watchlisthidepatrolled' => "Patrullasqa llamk'apusqakunata watiqasqakunapi pakay",
-'tog-nolangconversion' => 'Simi kutiyman ama niy',
 'tog-ccmeonemails' => 'Huk ruraqkunaman kachasqay e-chaskikunamanta iskaychasqakunata kachamuway',
 'tog-diffonly' => "Huk kaykunap uranpi kaq p'anqap samiqninta ama rikuchiychu",
 'tog-showhiddencats' => 'Pakasqa katiguriyakunata rikuchiy',
@@ -1607,9 +1606,9 @@ Kay qatiqpiqa kay p'anqapaq qulluy, astay hallch'akunatam rikunki:",
 Churkusqaña rikchakunatataq qhawanaykipaq icha maskanaykipaqqa [[Special:FileList|rikchakuna p'anqaman]] riy. Churkusqakunata [[Special:Log/upload|churkuy hallch'apim]], qullusqakunatataq [[Special:Log/delete|qulluy hallch'apim]] rikunki.
 
 Rikchata huk p'anqaman ch'aqtanaykipaqqa kay hunt'ana p'anqapi t'inkita llamk'achiy:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Willañiqi.jpg]]</nowiki></tt>''', willañiqip hunt'a musuqchasqan llamk'achinapaq
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Willañiqi.png|huk qillqa]]</nowiki></tt>''', lluq'i manyapi kaq kahapi 200 iñu suni rikch'achisqata llamk'achinapaq
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Willañiqi.ogg]]</nowiki></tt>''', willañiqiman chiqalla t'inkinapaq, willañiqita mana rikuchispa",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Willañiqi.jpg]]</nowiki></code>''', willañiqip hunt'a musuqchasqan llamk'achinapaq
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Willañiqi.png|huk qillqa]]</nowiki></code>''', lluq'i manyapi kaq kahapi 200 iñu suni rikch'achisqata llamk'achinapaq
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Willañiqi.ogg]]</nowiki></code>''', willañiqiman chiqalla t'inkinapaq, willañiqita mana rikuchispa",
 'upload-permitted' => 'Saqillasqa willañiqi layakuna: $1.',
 'upload-preferred' => 'Astawan munasqa willañiqi layakuna: $1.',
 'upload-prohibited' => 'Mana saqillasqa willañiqi layakuna: $1.',
@@ -1650,19 +1649,19 @@ Rikchata huk p'anqaman ch'aqtanaykipaqqa kay hunt'ana p'anqapi t'inkita llamk'ac
 'largefileserver' => 'Kay willañiqiqa sirwiqpi allinkachisqakama saqillasqa chhikanmanta aswan hatunmi.',
 'emptyfile' => "Churkusqayki willañiqiqa ch'usaqmi rikch'akun. Pantasqa sutinchá. Ama hina kaspa, llanchiy, churkuyman munasqayki willañiqichu.",
 'windows-nonascii-filename' => "Kay wikiqa sapaq sananchayuq willañiqi sutikunata manam q'iminchu.",
-'fileexists' => "Kachkanñam kay sutiyuq willañiqi.
-Ama hina kaspa, '''<tt>[[:$1]]</tt>''' nisqata llanchiy, huknachanaykimanta mana allin yachaspaykiqa.
+'fileexists' => 'Kachkanñam kay sutiyuq willañiqi.
+Ama hina kaspa, <strong>[[:$1]]</strong> nisqata llanchiy, huknachanaykimanta mana allin yachaspaykiqa.
+[[$1|thumb]]',
+'filepageexists' => "Kay willañiqipaq sut'ichana p'anqaqa kamarisqañam <strong>[[:$1]]</strong> nisqapi, ichataq kay sutiyuq willañiqi manaraqmi kanchu. Willanayki pisichayqa manam rikch'akunqachu sut'ichana p'anqapi. Rikch'akunanpaqqa, kikiykip makiykiwanmi llamk'apunayki tiyan.
 [[$1|thumb]]",
-'filepageexists' => "Kay willañiqipaq sut'ichana p'anqaqa kamarisqañam '''<tt>[[:$1]]</tt>''' nisqapi, ichataq kay sutiyuq willañiqi manaraqmi kanchu. Willanayki pisichayqa manam rikch'akunqachu sut'ichana p'anqapi. Rikch'akunanpaqqa, kikiykip makiykiwanmi llamk'apunayki tiyan.
-[[$1|thumb]]",
-'fileexists-extension' => "Kay willañiqip sutinman yaqa kaqlla sutiyuq willañiqim kachkanña: [[$2|thumb]]
-* Churkunayasqayki willañiqip sutin: '''<tt>[[:$1]]</tt>'''
-* Kachkaqña willañiqip sutin: '''<tt>[[:$2]]</tt>'''
-Ama hina kaspa, huk sutita akllay.",
+'fileexists-extension' => 'Kay willañiqip sutinman yaqa kaqlla sutiyuq willañiqim kachkanña: [[$2|thumb]]
+* Churkunayasqayki willañiqip sutin: <strong>[[:$1]]</strong>
+* Kachkaqña willañiqip sutin: <strong>[[:$2]]</strong>
+Ama hina kaspa, huk sutita akllay.',
 'fileexists-thumbnail-yes' => "Willañiqiqa ancha uchuylla rikchamanmi rikch'akun ''(thumbnail)''. [[$1|thumb]]
-Ama hina kaspa, '''<tt>[[:$1]]</tt>''' nisqa willañiqita llanchiy.
+Ama hina kaspa, <strong>[[:$1]]</strong> nisqa willañiqita llanchiy.
 Llanchisqa willañiqi qallariy chhikan kikin rikchaman kaqlla kaptinqa, huk rikchachata churkunaykiqa manam tiyanchu.",
-'file-thumbnail-no' => "Willañiqip sutinqa '''<tt>$1</tt>''' nisqawanmi qallarin. Ancha uchuylla rikchamanmi rikch'akun ''(thumbnail)''.
+'file-thumbnail-no' => "Willañiqip sutinqa <strong>$1</strong> nisqawanmi qallarin. Ancha uchuylla rikchamanmi rikch'akun ''(thumbnail)''.
 Kay churkunayki rikcha hunt'a chhikan kayniyuq kaptinqa, chay hunt'atam churkuy, manataq hinaptinqa willañiqip sutinta hukchay.",
 'fileexists-forbidden' => 'Kay sutiyuq willañiqiqa kachkanñam, manam huknachanallachu. Willañiqiykita kunanraq churkuyta munaspaykiqa, ama hina kaspa, willañiqip sutinta hukchaspa musuqmanta churkuy. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => "Kay sutiyuq willañiqiqa kachkañam rakinakusqa willañiqi qullqapi. Ama hina kaspa, churkuyta munaspaykiraq, ñawpaq p'anqaman kutispa willañiqiykita huk sutiwan churkuy. [[File:$1|thumb|center|$1]]",
@@ -1900,7 +1899,7 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
 
 # MIME search
 'mimesearch' => 'MIME maskay',
-'mimesearch-summary' => "Kay p'anqawanqa willañiqikunata MIME layankamam ch'illchiyta atinki. Qunapaq: contenttype/subtype, ahinataq <tt>image/jpeg</tt>.",
+'mimesearch-summary' => "Kay p'anqawanqa willañiqikunata MIME layankamam ch'illchiyta atinki. Qunapaq: contenttype/subtype, ahinataq <code>image/jpeg</code>.",
 'mimetype' => 'MIME laya:',
 'download' => 'chaqnamuy',
 
@@ -2096,7 +2095,7 @@ Rikuyniykitaqa k'ullkuchaytam atinki hallch'a layata, ruraqpa sutinta (uchuy ich
 'linksearch-ok' => 'Maskay',
 'linksearch-text' => 'Ima rantipas sananchawanpas maskayta saqillasunkim, ahinataq "*.wikipedia.org".
 Hawa kaq duminyullapas kanam, ahinataq "*.org".<br />
-Q\'imichisqa tantari qillqa: <tt>$1</tt> (maskaspaykiqa kaykunamanta ama mayqintapas yapaychu).',
+Q\'imichisqa tantari qillqa: <code>$1</code> (maskaspaykiqa kaykunamanta ama mayqintapas yapaychu).',
 'linksearch-line' => "$1-man $2-manta t'inkimusqa",
 'linksearch-error' => 'Ima rantipas sananchaqa (* ?) tiyaypa qallariyninpim kanman chaylla.',
 
@@ -2236,7 +2235,7 @@ Kay p\'anqata mana musuqmanta watukamuptiykiqa, manam huk hukchasqakunamanta wil
 
 --
 E-chaski willaykuy allinkachinakunata hukchanaykipaqqa kay p\'anqatam qhaway:
-{{canonicalurl:{{#special:Preferences}}}}
+{{canonicalurl:{{#special:Preferences}}}} 
 
 Watiqana sutisuyuykipaq allinkachinakunata hukchanaykipaqqa kay p\'anqatam qhaway:
 {{canonicalurl:{{#special:EditWatchlist}}}}
@@ -2926,15 +2925,10 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 # Info page
 'pageinfo-title' => '"$1" sutiyuq p\'anqamanta willay',
 'pageinfo-header-edits' => "Llamk'apusqakuna",
-'pageinfo-header-watchlist' => "Watiqasqa p'anqakuna",
-'pageinfo-header-views' => 'Rikunakuna',
-'pageinfo-subjectpage' => "P'anqa",
-'pageinfo-talkpage' => "Rimanakuy p'anqa",
+'pageinfo-views' => "Hayk'a qhawaykuna",
 'pageinfo-watchers' => "Hayk'a watiqaqkuna",
 'pageinfo-edits' => "Hayk'a hukchasqakuna",
 'pageinfo-authors' => "Hayk'a sapaq kaq ruraqkuna",
-'pageinfo-views' => "Hayk'a qhawaykuna",
-'pageinfo-viewsperedit' => "Qhawasqakuna llamk'apusqaman",
 
 # Patrolling
 'markaspatrolleddiff' => 'Qhawakipasqaman sananchay',
@@ -3771,6 +3765,7 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni
 'api-error-file-too-large' => 'Kachasqayki willañiqiqa nisyu hatunmi.',
 'api-error-filename-tooshort' => 'Kay willañiqi sutiqa nisyu pisillam.',
 'api-error-filetype-banned' => 'Kay willañiqi layaqa manam saqillasqachu.',
+'api-error-filetype-banned-type' => '$1 nisqaqa manam saqillasqachu willañiqi {{PLURAL:$4|laya|layakuna}}.  Saqillasqa willañiqi {{PLURAL:$3|layaqa|layakunaqa}} kaymi: $2.',
 'api-error-filetype-missing' => "Kay willañiqi sutiqa manam k'askaqniyuqchu.",
 'api-error-hookaborted' => "Wakinchaykachasqaykitaqa mast'ari ch'iwinam puchukachirqan.",
 'api-error-http' => "Ukhupi pantasqa: Manam sirwiqwan t'inkinakuyta atinichu.",
index db2a52b..85a7390 100644 (file)
@@ -241,7 +241,7 @@ $messages = array(
 'jumpto' => 'Chayman rina',
 'jumptonavigation' => 'Wampuna',
 'jumptosearch' => 'Maskana',
-'view-pool-error' => 'Atatay, kunan ratupi pankayuk antawakuna yapa trabajuta charinmi.
+'view-pool-error' => 'Atatay, kunan ratupi pankayuk antawakuna yapa trabajuta charinmi. 
 Yapa runakuna kay pankata rikukunmi.
 Ama shinachu kapay, ashakuta shuyapay, kipalla kutin pankata rikunkapak shamupay.
 
@@ -327,7 +327,7 @@ $1',
 'databaseerror' => 'Yachayyuk ukupi pantay',
 'laggedslavemode' => "'''Rikupay''': Kay pankapi, shina kakpi, mushuk killkaykuna illankacha.",
 'missing-article' => "Hatun kamupi shuk killkayta mana tarin, shinapash chay killkayta tiyanami kan. Paypa chay shutima kan : «$1» $2.
-Icha shuk ñawpak pachamanta ''diff'' ñamana tiyanchu, icha kay tinkika shuk pichashka pankapa shutimi kan.
+Icha shuk ñawpak pachamanta ''diff'' ñamana tiyanchu, icha kay tinkika shuk pichashka pankapa shutimi kan. 
 Mana shina kakpi, shuk [[Special:ListUsers/sysop|kamachyik]]man willapay, payta URL killkata willapay.",
 'missingarticle-rev' => '(Killkay#: $1)',
 'internalerror' => 'Antawa ukupi pantay tiyarka',
@@ -420,7 +420,7 @@ Pakpak shutita [[Special:Search/{{PAGENAME}}|shuk pankakunapi maskanata]], <span
 
 Tapuripay, kaypi killkanata allimi, mana allimi kanchu.
 Uraypi apakunakunapa pichanakunapa kamuta rikuchiwanchik:",
-'moveddeleted-notice' => 'Kaypankaka pichashkami kan.
+'moveddeleted-notice' => 'Kaypankaka pichashkami kan. 
 Uraypi apakuykunpa, pichaykunapa kamuta rikuchinchik:',
 
 # Parser/template warnings
@@ -505,7 +505,7 @@ Kay (kaykunachu) kachashkakunaka cunkashkami kashka.",
 'searchrelated' => 'tinkishka',
 'searchall' => 'tukuy',
 'showingresultsheader' => "{{PLURAL:$5|Maskashka panka: '''$1''', '''$3'''-manta|Maskashka pankakuna: '''$1 - $2''', '''$3'''-manta}}, '''$4''' maskashpaka",
-'nonefound' => "'''Musyay''': kikinka mana shina rimakpika, mana tukuy shuti-suyupi maskapanki.
+'nonefound' => "'''Musyay''': kikinka mana shina rimakpika, mana tukuy shuti-suyupi maskapanki. 
 Icha ''all:'' rimaywan (icha shuk shutisuyupa rimaywan) kikinpa killkata kallarikpika taripankimi.",
 'search-nonefound' => 'Kikinka maskashka rimaykunaka mana tiyanchu.',
 'powersearch' => 'Ashtawan alli maskana',
@@ -896,7 +896,7 @@ Shuk aspipi, shukniki tinkika ima tinkita wichkashkami kanka nin, kay aspipi shu
 'external_image_whitelist' => "  #Kay aspita kay shinallami sakipay<pre>
 #Uraypi ''regex'' samikunata churapay (// chawpipilla)
 #Kay samikunaka hawa rikchakunapa URLwan taripachishkami kanka.
-#Alli taripashkakunaka rikcha shinami rikushishkami kanka, shukkunaka tinki shinallami riksichinka,
+#Alli taripashkakunaka rikcha shinami rikushishkami kanka, shukkunaka tinki shinallami riksichinka, 
 #«#» llikawan kallarik aspikunaka willaykunallami kanka
 #Uchilla, hatun llikakunatapash churanata ushapanki, kaypi shinallami kan
 
index 13aa830..ff725b6 100644 (file)
  * @author Aryaz
  * @author Dalinanir
  * @author Jose77
+ * @author MoubarikBelkasim
  * @author Urhixidur
  */
 
 $messages = array(
 # Dates
+'sunday' => 'Asamas (Eřḥedd)',
+'monday' => 'Aynas (Řetnayen)',
+'tuesday' => 'Asinas (Ettřata)',
+'wednesday' => 'Akṛas (Řarbeɛ)',
+'thursday' => 'Akwas (Řexmis)',
+'friday' => 'Asimwas (Ejjemɛa)',
+'saturday' => 'Asiḍyas (Esseft)',
 'sun' => 'Asamas',
 'mon' => 'Aynas',
 'tue' => 'Asinas',
@@ -26,15 +34,15 @@ $messages = array(
 'january' => 'Yennayer',
 'february' => 'Yebrayer',
 'march' => 'Mares',
-'april' => 'Ibrir',
+'april' => 'Abril',
 'may_long' => 'May',
 'june' => 'Yunyu',
 'july' => 'Yulyuz',
-'august' => 'Ghuct',
-'september' => 'Cutanbir',
+'august' => 'Ɣuct',
+'september' => 'Cutenbir',
 'october' => 'Ktubar',
 'november' => 'Nuwanbir',
-'december' => 'Dujanbir',
+'december' => 'Dujembir',
 'january-gen' => 'Ynnayr',
 'february-gen' => 'Ybrayr',
 'march-gen' => 'Mars',
@@ -50,15 +58,15 @@ $messages = array(
 'jan' => 'Yennayer',
 'feb' => 'Yebrayer',
 'mar' => 'Mars',
-'apr' => 'Ybrir',
+'apr' => 'Abrir',
 'may' => 'May',
 'jun' => 'Yunyu',
 'jul' => 'Yulyuz',
-'aug' => 'Ghuct',
-'sep' => 'Cutanbir',
+'aug' => 'Ɣuct',
+'sep' => 'Cutembir',
 'oct' => 'Ktubar',
 'nov' => 'Nuwanbir',
-'dec' => 'Dujanbir',
+'dec' => 'Dujenbir',
 
 # Categories related messages
 'category_header' => 'Tasniwin di taggayt "$1"',
@@ -78,6 +86,14 @@ $messages = array(
 'qbedit' => 'Ẓṛeg',
 'qbspecialpages' => 'Tudmawin Special',
 
+# Vector skin
+'vector-action-move' => 'Smuṭṭi',
+'vector-view-create' => 'Seɣnu',
+'vector-view-edit' => 'Ẓṛeg',
+'vector-view-history' => 'Ẓeṛ amezruy',
+'vector-view-view' => 'Ɣeṛ',
+'actions' => 'Timegga',
+
 'errorpagetitle' => 'Anezri',
 'returnto' => 'Dwl ghar $1.',
 'tagline' => 'Zi {{SITENAME}}',
@@ -95,7 +111,7 @@ $messages = array(
 'editthispage' => 'Ẓṛg tasna ya',
 'delete' => 'Kks',
 'protect' => 'Mstn',
-'protect_change' => 'sbadl',
+'protect_change' => 'beddeř',
 'newpage' => 'Tasna d-tamaynut',
 'talkpage' => 'Siwl xf tasna ya',
 'talkpagelinktext' => 'Awal',
@@ -120,11 +136,11 @@ $messages = array(
 'disclaimerpage' => 'Project:Asmigel amatu',
 'edithelp' => 'Tallalt deg uẓareg',
 'edithelppage' => 'Help:Aẓareg',
-'helppage' => 'Help:tallalt',
+'helppage' => 'Help:Tira d yiwlafen',
 'mainpage' => 'Tasna Tamezwarut',
-'mainpage-description' => 'Tasna Tamzwarut',
+'mainpage-description' => 'Tasna Tamezwarut',
 'portal' => 'Tawwart n timetti',
-'portal-url' => 'Project:tawwart n timetti',
+'portal-url' => 'Project:tawwart n yiwdan',
 'privacy' => 'Tasertit n tusligi',
 'privacypage' => 'Project:Tasertit n tusligi',
 
@@ -134,6 +150,7 @@ $messages = array(
 'newmessagesdifflink' => 'Taẓṛigt tanggarut',
 'editsection' => 'Ẓṛeg',
 'editold' => 'ẓṛeg',
+'viewsourceold' => 'ẓeṛ aɣbalu',
 'editlink' => 'ẓṛg',
 'viewsourcelink' => 'ẓṛ aghbalu',
 'editsectionhint' => 'Ẓṛeg tigezmi: $1',
@@ -141,23 +158,23 @@ $messages = array(
 'showtoc' => 'sskn-d',
 'hidetoc' => 'snuffar',
 'site-rss-feed' => 'Tilgha n RSS n $1',
-'site-atom-feed' => 'Talghut n Atom n $1',
+'site-atom-feed' => 'Talɣut n Atom n $1',
 'page-rss-feed' => 'Asudem n RSS n "$1"',
-'red-link-title' => '$1 (tasna ur telli)',
+'red-link-title' => '$1 (tasna wer telli)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Tasna',
 'nstab-user' => 'Tasna n User',
 'nstab-project' => 'Tasna usenfar',
 'nstab-image' => 'Asatul',
-'nstab-template' => 'Tamudmt',
+'nstab-template' => 'Tamudemt',
 'nstab-category' => 'Taggayt(category)',
 
 # General errors
 'badtitle' => 'isem war icni ca',
 'badtitletext' => 'Isem n Tasna itexised war icni ca, ixwa, niɣ  isem n ajar-tutlayt niɣ ajar-wiki war icni ca.
 teqqad ad yilli days ca n usekkil war itwagg deg isem .',
-'viewsource' => 'Ẓṛ aghbalu',
+'viewsource' => 'Ẓeṛ aɣbalu',
 'viewsourcetext' => 'Tzemred a tẓerd u atsneɣled aɣbal n Tasna ya :',
 
 # Login and logout pages
@@ -299,10 +316,10 @@ Tasarut: (cur) = imṣebḍiyen ag tunɣilt n ruxa,
 'rev-delundel' => 'sken/ffer',
 
 # Diffs
-'history-title' => 'Amezruy n ufegged n "$1"',
+'history-title' => 'Amezruy n teẓṛigt n "$1"',
 'lineno' => 'Tabrit $1:',
 'compareselectedversions' => 'Smequdda tunɣilin a',
-'editundo' => 'kkes min ggigh',
+'editundo' => 'kkes min ggiɣ',
 'diff-multi' => '({{PLURAL:$1|ijj n ufegged|$1 ifeggiden}} war ad twamlen ca.)',
 
 # Search results
@@ -312,7 +329,11 @@ Tasarut: (cur) = imṣebḍiyen ag tunɣilt n ruxa,
 'prevn' => 'Amzray {{PLURAL:$1|$1}}',
 'nextn' => 'wn d-itasn {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Ẓeṛ ($1 {{int:pipe-separator}} $2) ($3)',
+'searchprofile-everything' => 'Marra',
+'searchprofile-articles-tooltip' => 'Rzu di $1',
+'searchprofile-project-tooltip' => 'Rzu di $1',
 'search-result-size' => '$1 ({{PLURAL:$2|1 tawalt|$2 tiwalin}})',
+'search-redirect' => '(awi $1)',
 'search-suggest' => 'Ttugha txsd a tinid: $1',
 'search-interwiki-caption' => 'Awmatn n usnfar',
 'search-interwiki-more' => '(ujar)',
@@ -341,7 +362,7 @@ mala tucit-id, ataf Lxdant inec a tetwassan ila inec.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|tiẓṛegt|tiẓṛigin}}',
-'recentchanges' => 'Tiẓṛigin tinggura',
+'recentchanges' => 'Tiẓṛigin tineggura',
 'recentchanges-feed-description' => 'Bbar tiẓṛigin timayutin n wiki deg usudem(feed) a .',
 'rcnote' => "Awadday {{PLURAL:$1|d '''1''' taẓṛigt|d '''$1''' tiẓṛigin tinggura}} deg {{PLURAL:$2|ass anggaru |'''$2''' ussan inggura}}, am di $5, $4.",
 'rcnotefrom' => "ɣar wadday d tiẓṛigin zi '''$2''' (ar '''$1''' ).",
@@ -356,7 +377,7 @@ mala tucit-id, ataf Lxdant inec a tetwassan ila inec.',
 'diff' => 'imṣebḍan',
 'hist' => 'Amezruy',
 'hide' => 'Snuffar',
-'show' => 'smmel-ad',
+'show' => 'semmel-d',
 'minoreditletter' => 'm',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
@@ -394,7 +415,7 @@ Tasniwin di [[Special:Watchlist|your watchlist]] d '''tizurarin'''.",
 'filehist-dimensions' => 'Tisektiwin',
 'filehist-filesize' => 'Tiddi n ufaylu',
 'filehist-comment' => 'Tinit',
-'imagelinks' => 'Iwurn n usdaw',
+'imagelinks' => 'Aseqdec usatul',
 'linkstoimage' => '{{PLURAL:$1|Tasna ya teqn-ad|$1 Tasniwin a qnent-id}} ɣa ufaylu ya :',
 'nolinkstoimage' => 'war telli ca n Tasna teqqen-d ɣa ufaylu ya.',
 'sharedupload' => 'Wa d ijj ufaylu itwacrec jar aṭṭas n isenfaren(projects).',
@@ -413,7 +434,7 @@ Tasniwin di [[Special:Watchlist|your watchlist]] d '''tizurarin'''.",
 'unusedtemplates' => 'Timudmiwin war twasexedment',
 
 # Random page
-'randompage' => 'Tasna zi ṭṭarf',
+'randompage' => 'Tasna mamec ma tella',
 
 # Random redirect
 'randomredirect' => '(redirect) zi ṭṭarf',
@@ -559,6 +580,7 @@ Tezemred ad tbedeld aswir n uḥeṭṭu n Tasna ya, maca war itegg walu i uḥe
 
 # Undelete
 'undeletebtn' => 'Ar-ad',
+'undeleteviewlink' => 'ẓeṛ',
 'undelete-search-submit' => 'Tarzzut',
 
 # Namespace form on various pages
@@ -590,7 +612,7 @@ Tezemred ad tbedeld aswir n uḥeṭṭu n Tasna ya, maca war itegg walu i uḥe
 'nolinkshere' => "war tlli ca n Tasna tqqen-d da '''[[:$1]]'''.",
 'isredirect' => 'Tasna n (redirect)',
 'istemplate' => 'Asidef',
-'isimage' => 'amaqqan n tugna',
+'isimage' => 'amaqqan usatul',
 'whatlinkshere-prev' => '{{PLURAL:$1|deffar|deffar $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|zzat|zzat $1}}',
 'whatlinkshere-links' => '← tizdayin',
@@ -657,11 +679,11 @@ snaqlitent s ufus.'''",
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Tasna inu',
 'tooltip-pt-mytalk' => 'Tasna usiwl inu',
-'tooltip-pt-preferences' => 'Isemyifiyen inu',
+'tooltip-pt-preferences' => 'Min d-ac itteɛjiben',
 'tooltip-pt-watchlist' => 'Tabdart n Tasniwin umi txmamd bac ad-ten teẓṛegd',
 'tooltip-pt-mycontris' => 'Umuɣ n tiwuriwin inu',
 'tooltip-pt-login' => 'Neqqar ac adef s umiḍan nnek; maca malla texsed waha',
-'tooltip-pt-logout' => 'Ufugh',
+'tooltip-pt-logout' => 'Ufuɣ',
 'tooltip-ca-talk' => 'Amsawal xef tasna n ukettur',
 'tooltip-ca-edit' => 'Tzemmared a tẓeṛged tasna ya.
 Bbeẓ x ufeskar n uzar-timeẓṛi zzat i gha txemmled min turid',
@@ -675,11 +697,11 @@ Bbeẓ x ufeskar n uzar-timeẓṛi zzat i gha txemmled min turid',
 'tooltip-ca-unwatch' => 'Kkes Tasna ya zi Tabdart uḥṭṭu inec',
 'tooltip-search' => 'Rzu {{SITENAME}}',
 'tooltip-search-go' => 'Uyur ghar tasna s yizwel a s imant nnes malla tella',
-'tooltip-search-fulltext' => 'Rzu di tasniwin x waḍṛis a',
+'tooltip-search-fulltext' => 'Rzu di tasniwin xef waḍṛis a',
 'tooltip-p-logo' => 'Tasbtirt Tamzwarut',
-'tooltip-n-mainpage' => 'Adef ghar tasna tamezwarut',
+'tooltip-n-mainpage' => 'Adef ɣar tasna tamezwarut',
 'tooltip-n-mainpage-description' => 'Adef ghar tasna tamezwarut',
-'tooltip-n-portal' => 'Xf usenfar, mayn tzemmared a tegged, mani gha tafed tighawsiwin',
+'tooltip-n-portal' => 'Xef usenfar, mayen tzemmared ad tegged, mani ɣa tafed tiɣawsiwin',
 'tooltip-n-currentevents' => 'Af tilgha n ugilal xf tmsarin titurawin',
 'tooltip-n-recentchanges' => 'Tabdart n isenfilen imaynuten di Wiki.',
 'tooltip-n-randompage' => 'Zdem ict tasna d tagacurant',
@@ -720,11 +742,11 @@ Bbeẓ x ufeskar n uzar-timeẓṛi zzat i gha txemmled min turid',
 'ilsubmit' => 'Tarzzut',
 
 # Bad image list
-'bad_image_list' => 'Tameslayt amya :
+'bad_image_list' => 'Talɣa tella ammu :
 
-imagraden n tebdart (ɣarsent * deg umzwaru) ig iteten waha.
-Tazdayt tamzwarut di tebrit ixessa atzdi ɣa afaylu war icni  .
-kur tazdayt tdeffad a tmekkas .',
+Imagraden n tebdart (ɣar-sent * deg umezwaru) waha iy yellan nican, inneḍni uhu.
+Amaqqan amezwarutdi tebridt ixessa ad tili teqqen ɣer ijen usatul aɛeffan.
+Marra imaqqanen nneḍni xef ijen uceṛṛid simant nnes ad ilin d tuksawin, amecnaw tasniwin mani izemmer usatul ad d-yeffeɣ deg uceṛṛiḍ.',
 
 # Metadata
 'metadata' => 'Timuca Meta',
index eb1c27e..fa744e3 100644 (file)
@@ -35,10 +35,10 @@ $namespaceNames = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#RENVIAMENT', '#REDIRECT' ),
-       'img_thumbnail'           => array( '1', 'miniatura', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_upright'             => array( '1', 'sidretg', 'sidretg=$1', 'sidretg_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'redirect'                  => array( '0', '#RENVIAMENT', '#REDIRECT' ),
+       'img_thumbnail'             => array( '1', 'miniatura', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_upright'               => array( '1', 'sidretg', 'sidretg=$1', 'sidretg_$1', 'upright', 'upright=$1', 'upright $1' ),
 );
 
 $messages = array(
@@ -1340,9 +1340,9 @@ Il log da stizzar e spustar vegn mussà sutvart:",
 Per contemplar u tschertgar datotecas gia chargiada si, visita la pagina [[Special:FileList|glista da datotecas chargiadas si]]. Tut las datotecas che vegnan chargiadas si èn era notads en il [[Special:Log/upload|log da chargiar si]], quellas ch'èn vegnidas stizzadas en il [[Special:Log/delete|log dal stizzar]].
 
 Per integrar ina datoteca en in artitgel pos ti per exempel duvrar in dals suandants cumonds:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' per utilisar la versiun cumplaina da la datoteca
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' per utilisar in maletg da la ladezza da 200 pixels en in champ da la vart sanestra cun la descripziun 'alt text'
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' per directamain far ina colliaziun a la datoteca senza integrar la datoteca",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' per utilisar la versiun cumplaina da la datoteca
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' per utilisar in maletg da la ladezza da 200 pixels en in champ da la vart sanestra cun la descripziun 'alt text'
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' per directamain far ina colliaziun a la datoteca senza integrar la datoteca",
 'upload-permitted' => 'Tips da datotecas lubids: $1.',
 'upload-preferred' => 'Tips da datotecas preferids: $1.',
 'upload-prohibited' => 'Tips da datotecas betg lubids: $1.',
@@ -1386,21 +1386,21 @@ questa datoteca è $2 gronda.",
 'emptyfile' => "La datoteca che ti has chargià si para dad esser vida.
 Quai po esser pervia d'in sbagl da tippar en il num da datoteca.
 Controllescha sche ti vuls propi chargiar si questa datoteca.",
-'fileexists' => "Ina datoteca cun quest num exista gia. Controllescha '''<tt>[[:$1]]</tt>''' sche ti n'es betg segir sche ti vuls midar ella.
+'fileexists' => "Ina datoteca cun quest num exista gia. Controllescha <strong>[[:$1]]</strong> sche ti n'es betg segir sche ti vuls midar ella.
 [[$1|thumb]]",
-'filepageexists' => "La pagina da descripziun per questa datoteca è vegnida creada ils '''<tt>[[:$1]]</tt>''' ma i n'exista anc nagina datoteca cun quest num. 
+'filepageexists' => "La pagina da descripziun per questa datoteca è vegnida creada ils <strong>[[:$1]]</strong> ma i n'exista anc nagina datoteca cun quest num. 
 La resumaziun che ti endatescha na vegn betg a cumparair sin la pagina da descripziun.
 Per che tia resumaziun cumpara là, stos ti modifitar manualmain la pagina da descripziun.
 [[$1|thumb]]",
 'fileexists-extension' => "I exista gia ina datoteca cun in num sumegliant: [[$2|thumb]]
-* Num da la datoteca che duai vegnir chargiada si: '''<tt>[[:$1]]</tt>'''
-* Num da la datoteca ch'exista gia: '''<tt>[[:$2]]</tt>'''
+* Num da la datoteca che duai vegnir chargiada si: <strong>[[:$1]]</strong>
+* Num da la datoteca ch'exista gia: <strong>[[:$2]]</strong>
 Tscherna per plaschair in auter num.",
 'fileexists-thumbnail-yes' => "Quest maletg para dad esser in maletg da grondezza reducida ''(Maletg da prevista)''.
 [[$1|thumb]]
-Controllescha per plaschair la datoteca ''<tt>[[:$1]]</tt>'''.
+Controllescha per plaschair la datoteca ''<strong>[[:$1]]</strong>.
 Sche la datoteca menziunada survart è il medem maletg en grondezza originala n'èsi betg necessari da chargiar si in maletg da pervista.",
-'file-thumbnail-no' => "Il num da la datoteca cumenza cun '''<tt>$1</tt>''', perquai para quai dad esser in maletg da grondezza reducida ''(Maletg da prevista)''.
+'file-thumbnail-no' => "Il num da la datoteca cumenza cun <strong>$1</strong>, perquai para quai dad esser in maletg da grondezza reducida ''(Maletg da prevista)''.
 Controllescha sche ti has era il maletg en grondezza originala e chargia si quel sut il num original.",
 'fileexists-forbidden' => 'I exista gia ina datoteca cun quest num che na po betg vegnir recuvrida. 
 Sche ti vuls anc adina chargiar si tia datoteca, turna per plaschair anavos e tscherna in auter nu. 
@@ -1579,7 +1579,7 @@ La descripziun da sia [$2 pagina da descripziun da datotecas] vegn mussada sutva
 # MIME search
 'mimesearch' => 'tschertgar tenor tip da MIME',
 'mimesearch-summary' => 'Questa pagina permetta da filtrar datotecas tenor lur tip MIME.
-Endatar il term da tschertgar en la furma tip/suttip, p.ex. <tt>image/jpeg</tt>.',
+Endatar il term da tschertgar en la furma tip/suttip, p.ex. <code>image/jpeg</code>.',
 'mimetype' => 'Tip MIME:',
 'download' => 'telechargiar',
 
@@ -1741,7 +1741,7 @@ I renviescha uss a [[$2]].',
 'linksearch-ok' => 'Tschertgar',
 'linksearch-text' => 'Sin questa pagina pos ti tschertgar paginas che cuntegnan colliaziuns a tschertas websites. 
 Uschenumnadas wildcards sco p.ex. "*.wikipedia.org" pon vegnir utilisadas.<br />
-Protocols sustegnids: <tt>$1</tt>',
+Protocols sustegnids: <code>$1</code>',
 'linksearch-line' => '$1 è collià davent da la pagina $2',
 'linksearch-error' => "Wildcards pon esser be a l'entschatta dal num da host.",
 
@@ -2511,15 +2511,10 @@ Probablamien è quai capità pervia dad in link ad ina pagina externa ch'è sin
 # Info page
 'pageinfo-title' => 'Infurmaziuns per "$1"',
 'pageinfo-header-edits' => 'Midadas',
-'pageinfo-header-watchlist' => "Glista d'observaziun",
-'pageinfo-header-views' => 'Visitas',
-'pageinfo-subjectpage' => 'Pagina',
-'pageinfo-talkpage' => 'Pagina da discussiun',
+'pageinfo-views' => 'Dumber da visitas',
 'pageinfo-watchers' => 'Dumber dad observaturs',
 'pageinfo-edits' => 'Dumber da midadas',
 'pageinfo-authors' => 'Dumber dad auturs differents',
-'pageinfo-views' => 'Dumber da visitas',
-'pageinfo-viewsperedit' => 'Visitas per midada',
 
 # Patrolling
 'markaspatrolleddiff' => 'Marcar sco controllà',
@@ -3310,6 +3305,7 @@ Questa pagina ha actualmain difficultads tecnicas.',
 'api-error-file-too-large' => 'La datoteca che ti has tramess era memia gronda.',
 'api-error-filename-tooshort' => 'Il num da datoteca è memia curt.',
 'api-error-filetype-banned' => 'Quest tip da datoteca è scumandà.',
+'api-error-filetype-banned-type' => "$1 {{PLURAL:$4|n'è betg in tip da datoteca lubì|n'èn betg tips da datoteca lubids}}. Lubidas èn datotecas {{PLURAL:$3|dal tip|dals tips}} $2.",
 'api-error-filetype-missing' => "Il num da datoteca n'ha betg ina finiziun da datoteca.",
 'api-error-hookaborted' => 'La midada che ti has empruvà da far è vegnida interrutta dad ina extensiun.',
 'api-error-http' => 'Errur interna: Betg pussaivel da connectar cun il server.',
index dde312e..beed6e8 100644 (file)
 $separatorTransformTable = array( ',' => ".", '.' => ',' );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#REDIRECTEAZA', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__FARACUPRINS__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__FARAGALERIE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORTEAZACUPRINS__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__CUPRINS__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__FARAEDITSECTIUNE__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__FARAANTET__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'NUMARLUNACURENTA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'LUNACURENTA1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NUMELUNACURENTA', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'NUMELUNACURENTAGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'LUNACURENTAABREV', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'NUMARZIUACURENTA', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'NUMARZIUACURENTA2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NUMEZIUACURENTA', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ANULCURENT', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'TIMPULCURENT', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ORACURENTA', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LUNALOCALA', 'LUNALOCALA2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LUNALOCALA1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'NUMELUNALOCALA', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'NUMELUNALOCALAGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'LUNALOCALAABREV', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ZIUALOCALA', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ZIUALOCALA2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'NUMEZIUALOCALA', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ANULLOCAL', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'TIMPULLOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ORALOCALA', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NUMARDEPAGINI', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NUMARDEARTICOLE', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NUMARDEFISIERE', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NUMARDEUTILIZATORI', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NUMARDEUTILIZATORIACTIVI', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NUMARDEMODIFICARI', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NUMARDEVIZUALIZARI', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'NUMEPAGINA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NUMEEPAGINA', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'SPATIUDENUME', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'SPATIUUDENUME', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'SPATIUDEDISCUTIE', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'SPATIUUDEDISCUTIE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'SPATIUSUBIECT', 'SPATIUARTICOL', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'SPATIUUSUBIECT', 'SPATIUUARTICOL', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'NUMEPAGINACOMPLET', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'NUMEEPAGINACOMPLET', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NUMESUBPAGINA', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NUMEESUBPAGINA', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NUMEDEBAZAPAGINA', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NUMEEDEBAZAPAGINA', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NUMEPAGINADEDISCUTIE', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NUMEEPAGINADEDISCUTIE', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NUMEPAGINASUBIECT', 'NUMEPAGINAARTICOL', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NUMEEPAGINASUBIECT', 'NUMEEPAGINAARTICOL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'MSJ:', 'MSG:' ),
-       'msgnw'                   => array( '0', 'MSJNOU:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'dreapta', 'right' ),
-       'img_left'                => array( '1', 'stanga', 'left' ),
-       'img_none'                => array( '1', 'nu', 'none' ),
-       'img_center'              => array( '1', 'centru', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'cadru', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'faracadru', 'frameless' ),
-       'img_page'                => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'dreaptasus', 'dreaptasus=$1', 'dreaptasus $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'chenar', 'border' ),
-       'img_baseline'            => array( '1', 'linia_de_bază', 'baseline' ),
-       'img_sub'                 => array( '1', 'indice', 'sub' ),
-       'img_super'               => array( '1', 'exponent', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'sus', 'top' ),
-       'img_text_top'            => array( '1', 'text-sus', 'text-top' ),
-       'img_middle'              => array( '1', 'mijloc', 'middle' ),
-       'img_bottom'              => array( '1', 'jos', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'text-jos', 'text-bottom' ),
-       'img_link'                => array( '1', 'legătură=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'NUMESITE', 'SITENAME' ),
-       'ns'                      => array( '0', 'SN:', 'NS:' ),
-       'localurl'                => array( '0', 'URLLOCAL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URLLOCALE:', 'LOCALURLE:' ),
-       'servername'              => array( '0', 'NUMESERVER', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'CALESCRIPT', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'GRAMATICA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GEN:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__FARACONVERTIRETITLU__', '__FCT__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__FARACONVERTIRECONTINUT__', '__FCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'SAPTAMANACURENTA', 'CURRENTWEEK' ),
-       'localweek'               => array( '1', 'SAPTAMANALOCALA', 'LOCALWEEK' ),
-       'revisionid'              => array( '1', 'IDREVIZIE', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ZIREVIZIE', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ZIREVIZIE2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'LUNAREVIZIE', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'ANREVIZIE', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'STAMPILATIMPREVIZIE', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'UTILIZATORREVIZIE', 'REVISIONUSER' ),
-       'fullurl'                 => array( '0', 'URLCOMPLET:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'URLCOMPLETE:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'MINUSCULAPRIMA:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'MAJUSCULAPRIMA:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'MINUSCULA:', 'LC:' ),
-       'uc'                      => array( '0', 'MAJUSCULA:', 'UC:' ),
-       'raw'                     => array( '0', 'BRUT:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ARATATITLU', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__LEGATURASECTIUNENOUA__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__FARALEGATURASECTIUNENOUA__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'VERSIUNECURENTA', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'CODIFICAREURL:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'CODIFICAREANCORA', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'STAMPILATIMPCURENT', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'STAMPILATIMPLOCAL', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'SEMNDIRECTIE', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#LIMBA:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'LIMBACONTINUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'PANIGIINSPATIULDENUME:', 'PAGINIINSN:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'NUMARADMINI', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMATNR', 'FORMATNUM' ),
-       'defaultsort'             => array( '1', 'SORTAREIMPLICITA:', 'CHEIESORTAREIMPLICITA:', 'CATEGORIESORTAREIMPLICITA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'CALEAFISIERULUI:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'eticheta', 'tag' ),
-       'hiddencat'               => array( '1', '__ASCUNDECAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'PAGINIINCATEGORIE', 'PAGINIINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'MARIMEPAGINA', 'PAGESIZE' ),
-       'noindex'                 => array( '1', '__FARAINDEX__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'NUMARINGRUP', 'NUMINGRUP', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__REDIRECTIONARESTATICA__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'NIVELPROTECTIE', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'formatdata', 'dataformat', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#REDIRECTEAZA', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__FARACUPRINS__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__FARAGALERIE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORTEAZACUPRINS__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__CUPRINS__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__FARAEDITSECTIUNE__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__FARAANTET__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'NUMARLUNACURENTA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'LUNACURENTA1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NUMELUNACURENTA', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'NUMELUNACURENTAGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'LUNACURENTAABREV', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'NUMARZIUACURENTA', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'NUMARZIUACURENTA2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NUMEZIUACURENTA', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ANULCURENT', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'TIMPULCURENT', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ORACURENTA', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LUNALOCALA', 'LUNALOCALA2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LUNALOCALA1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'NUMELUNALOCALA', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'NUMELUNALOCALAGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'LUNALOCALAABREV', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ZIUALOCALA', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ZIUALOCALA2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'NUMEZIUALOCALA', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ANULLOCAL', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'TIMPULLOCAL', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ORALOCALA', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NUMARDEPAGINI', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NUMARDEARTICOLE', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NUMARDEFISIERE', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NUMARDEUTILIZATORI', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NUMARDEUTILIZATORIACTIVI', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NUMARDEMODIFICARI', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NUMARDEVIZUALIZARI', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'NUMEPAGINA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NUMEEPAGINA', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'SPATIUDENUME', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'SPATIUUDENUME', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'SPATIUDEDISCUTIE', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'SPATIUUDEDISCUTIE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'SPATIUSUBIECT', 'SPATIUARTICOL', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'SPATIUUSUBIECT', 'SPATIUUARTICOL', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'NUMEPAGINACOMPLET', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'NUMEEPAGINACOMPLET', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NUMESUBPAGINA', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NUMEESUBPAGINA', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NUMEDEBAZAPAGINA', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NUMEEDEBAZAPAGINA', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NUMEPAGINADEDISCUTIE', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NUMEEPAGINADEDISCUTIE', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NUMEPAGINASUBIECT', 'NUMEPAGINAARTICOL', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NUMEEPAGINASUBIECT', 'NUMEEPAGINAARTICOL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'MSJ:', 'MSG:' ),
+       'msgnw'                     => array( '0', 'MSJNOU:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'dreapta', 'right' ),
+       'img_left'                  => array( '1', 'stanga', 'left' ),
+       'img_none'                  => array( '1', 'nu', 'none' ),
+       'img_center'                => array( '1', 'centru', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'cadru', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'faracadru', 'frameless' ),
+       'img_page'                  => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'dreaptasus', 'dreaptasus=$1', 'dreaptasus $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'chenar', 'border' ),
+       'img_baseline'              => array( '1', 'linia_de_bază', 'baseline' ),
+       'img_sub'                   => array( '1', 'indice', 'sub' ),
+       'img_super'                 => array( '1', 'exponent', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'sus', 'top' ),
+       'img_text_top'              => array( '1', 'text-sus', 'text-top' ),
+       'img_middle'                => array( '1', 'mijloc', 'middle' ),
+       'img_bottom'                => array( '1', 'jos', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'text-jos', 'text-bottom' ),
+       'img_link'                  => array( '1', 'legătură=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'NUMESITE', 'SITENAME' ),
+       'ns'                        => array( '0', 'SN:', 'NS:' ),
+       'localurl'                  => array( '0', 'URLLOCAL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URLLOCALE:', 'LOCALURLE:' ),
+       'servername'                => array( '0', 'NUMESERVER', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'CALESCRIPT', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'GRAMATICA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GEN:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__FARACONVERTIRETITLU__', '__FCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__FARACONVERTIRECONTINUT__', '__FCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'SAPTAMANACURENTA', 'CURRENTWEEK' ),
+       'localweek'                 => array( '1', 'SAPTAMANALOCALA', 'LOCALWEEK' ),
+       'revisionid'                => array( '1', 'IDREVIZIE', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ZIREVIZIE', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ZIREVIZIE2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'LUNAREVIZIE', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'ANREVIZIE', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'STAMPILATIMPREVIZIE', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'UTILIZATORREVIZIE', 'REVISIONUSER' ),
+       'fullurl'                   => array( '0', 'URLCOMPLET:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'URLCOMPLETE:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'MINUSCULAPRIMA:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'MAJUSCULAPRIMA:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'MINUSCULA:', 'LC:' ),
+       'uc'                        => array( '0', 'MAJUSCULA:', 'UC:' ),
+       'raw'                       => array( '0', 'BRUT:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ARATATITLU', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__LEGATURASECTIUNENOUA__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__FARALEGATURASECTIUNENOUA__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'VERSIUNECURENTA', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'CODIFICAREURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'CODIFICAREANCORA', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'STAMPILATIMPCURENT', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'STAMPILATIMPLOCAL', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'SEMNDIRECTIE', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#LIMBA:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'LIMBACONTINUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'PANIGIINSPATIULDENUME:', 'PAGINIINSN:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'NUMARADMINI', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMATNR', 'FORMATNUM' ),
+       'defaultsort'               => array( '1', 'SORTAREIMPLICITA:', 'CHEIESORTAREIMPLICITA:', 'CATEGORIESORTAREIMPLICITA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'CALEAFISIERULUI:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'eticheta', 'tag' ),
+       'hiddencat'                 => array( '1', '__ASCUNDECAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'PAGINIINCATEGORIE', 'PAGINIINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'MARIMEPAGINA', 'PAGESIZE' ),
+       'noindex'                   => array( '1', '__FARAINDEX__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'NUMARINGRUP', 'NUMINGRUP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__REDIRECTIONARESTATICA__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVELPROTECTIE', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'formatdata', 'dataformat', 'formatdate', 'dateformat' ),
 );
 
 $namespaceNames = array(
@@ -305,7 +305,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ascunde în schimbări recente editările patrulate',
 'tog-newpageshidepatrolled' => 'Ascunde paginile patrulate din lista de pagini noi',
 'tog-extendwatchlist' => 'Extinde lista de articole urmărite pentru a arăta toate schimbările efectuate, nu doar pe cele mai recente',
-'tog-usenewrc' => 'Afișează varianta îmbunătățită a schimbărilor recente (necesită JavaScript)',
+'tog-usenewrc' => 'Grupează modificările după pagină în cadrul schimbărilor recente și listei paginilor urmărite (necesită JavaScript)',
 'tog-numberheadings' => 'Numerotează automat secțiunile',
 'tog-showtoolbar' => 'Afișează bara de unelte pentru modificare (JavaScript)',
 'tog-editondblclick' => 'Activează modificarea paginii prin dublu clic (JavaScript)',
@@ -314,17 +314,17 @@ $messages = array(
 pe titlul secțiunii (JavaScript)',
 'tog-showtoc' => 'Arată cuprinsul (pentru paginile cu mai mult de 3 paragrafe cu titlu)',
 'tog-rememberpassword' => 'Autentificare automată de la acest navigator (expiră după $1 {{PLURAL:$1|zi|zile|de zile}})',
-'tog-watchcreations' => 'Adaugă paginile pe care le creez la lista mea de urmărire',
-'tog-watchdefault' => 'Adaugă paginile pe care le modific la lista mea de urmărire',
-'tog-watchmoves' => 'Adaugă paginile pe care le redenumesc la lista de pagini urmărite',
-'tog-watchdeletion' => 'Adaugă paginile pe care le șterg în lista de pagini urmărite',
+'tog-watchcreations' => 'Adaugă paginile pe care le creez și fișierele pe care le încarc la lista mea de urmărire',
+'tog-watchdefault' => 'Adaugă paginile și fișierele pe care le modific la lista mea de urmărire',
+'tog-watchmoves' => 'Adaugă paginile și fișierele pe care le redenumesc la lista mea de urmărire',
+'tog-watchdeletion' => 'Adaugă paginile și fișierele pe care le șterg la lista mea de urmărire',
 'tog-minordefault' => 'Marchează din oficiu toate modificările ca fiind minore',
 'tog-previewontop' => 'Arată previzualizarea deasupra căsuței de modificare',
 'tog-previewonfirst' => 'Arată previzualizarea la prima modificare',
 'tog-nocache' => 'Dezactivează opțiunea navigatorului de memorare în cache a paginilor',
-'tog-enotifwatchlistpages' => 'Trimite-mi un email la modificările paginilor',
+'tog-enotifwatchlistpages' => 'Trimite-mi un e-mail atunci când o pagină sau un fișier din lista mea de pagini urmărite suferă modificări',
 'tog-enotifusertalkpages' => 'Trimite-mi un email când pagina mea de discuții este modificată',
-'tog-enotifminoredits' => 'Trimite-mi un email de asemenea pentru modificările minore ale paginilor',
+'tog-enotifminoredits' => 'Trimite-mi, de asemenea, un e-mail în caz de modificări minore asupra paginilor și fișierelor',
 'tog-enotifrevealaddr' => 'Descoperă-mi adresa email în mesajele de notificare',
 'tog-shownumberswatching' => 'Arată numărul utilizatorilor care urmăresc',
 'tog-oldsig' => 'Semnătură actuală:',
@@ -340,7 +340,6 @@ pe titlul secțiunii (JavaScript)',
 'tog-watchlisthideliu' => 'Ascunde modificările făcute de utilizatori anonimi din lista de pagini urmărite',
 'tog-watchlisthideanons' => 'Ascunde modificările făcute de utilizatori anonimi din lista de pagini urmărite',
 'tog-watchlisthidepatrolled' => 'Ascunde paginile patrulate din lista de pagini urmărite',
-'tog-nolangconversion' => 'Dezactivează conversia variabilelor',
 'tog-ccmeonemails' => 'Doresc să primesc o copie a mesajelor e-mail pe care le trimit',
 'tog-diffonly' => 'Nu arăta conținutul paginii sub dif',
 'tog-showhiddencats' => 'Arată categoriile ascunse',
@@ -566,6 +565,10 @@ $1',
 'youhavenewmessages' => 'Aveți $1 ($2).',
 'newmessageslink' => 'mesaje noi',
 'newmessagesdifflink' => 'comparație cu versiunea precedentă',
+'youhavenewmessagesfromusers' => 'Aveți $1 de la {{PLURAL:$3|un alt utilizator|$3 utilizatori}} ($2).',
+'youhavenewmessagesmanyusers' => 'Aveți $1 de la mai mulți utilizatori ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|un mesaj nou|mesaje noi}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ultima modificare|ultimele modificări}}',
 'youhavenewmessagesmulti' => 'Aveți mesaje noi la $1',
 'editsection' => 'modificare',
 'editold' => 'modificare',
@@ -617,12 +620,12 @@ O listă cu paginile speciale valide se poate găsi la [[Special:SpecialPages|{{
 # General errors
 'error' => 'Eroare',
 'databaseerror' => 'Eroare la baza de date',
-'dberrortext' => 'A apărut o eroare în sintaxa interogării.
-Aceasta poate indica o problemă în program.
-Ultima interogare încercată a fost:
-<blockquote><tt>$1</tt></blockquote>
-din cadrul funcției "<tt>$2</tt>".
-Baza de date a returnat eroarea "<tt>$3: $4</tt>".',
+'dberrortext' => 'A apărut o eroare în sintaxa interogării bazei de date.
+Acest lucru poate indica o problemă în program.
+Ultima interogare trimisă către baza de date a fost:
+<blockquote><code>$1</code></blockquote>
+din cadrul funcției „<code>$2</code>”.
+Baza de date a returnat eroarea „<samp>$3: $4</samp>”.',
 'dberrortextcl' => 'A apărut o eroare de sintaxă în interogare.
 Ultima interogare încercată a fost:
 „$1”
@@ -634,12 +637,12 @@ Baza de date a returnat eroarea „$3: $4”',
 'readonlytext' => 'Baza de date {{SITENAME}} este momentan blocată la scriere, probabil pentru o operațiune de rutină, după care va fi deblocată și se va reveni la starea normală.
 
 Administratorul care a blocat-o a oferit această explicație: $1',
-'missing-article' => 'Baza de date nu găsește textul unei pagini care ar fi trebuit găsit, numit „$1” $2.
+'missing-article' => 'Baza de date nu găsește textul unei pagini care ar fi trebuit găsită, numită „$1” $2.
 
-În mod normal faptul este cauzat de urmărirea unei dif neactualizată sau a unei legături din istoric spre o pagină care a fost ștearsă.
+În mod normal faptul este cauzat de accesarea unei dif neactualizată sau a unei legături din istoric spre o pagină care a fost ștearsă.
 
 Dacă nu acesta e motivul, s-ar putea să fi găsit un bug în program.
-Te rog anunță acest aspect unui [[Special:ListUsers/sysop|administrator]], indicându-i adresa URL.',
+Vă rugăm să-i semnalați acest aspect unui [[Special:ListUsers/sysop|administrator]], indicându-i adresa URL.',
 'missingarticle-rev' => '(versiunea#: $1)',
 'missingarticle-diff' => '(Dif: $1, $2)',
 'readonly_lag' => 'Baza de date a fost închisă automatic în timp ce serverele secundare ale bazei de date îl urmează pe cel principal.',
@@ -659,6 +662,8 @@ Te rog anunță acest aspect unui [[Special:ListUsers/sysop|administrator]], ind
 'cannotdelete' => 'Pagina sau fișierul „$1” nu a putut fi șters.
 S-ar putea ca acesta să fi fost deja șters de altcineva.',
 'cannotdelete-title' => 'Imposibil de șters pagina „$1”',
+'delete-hook-aborted' => 'Ștergerea a fost abandonată din cauza unui hook.
+Nicio explicație furnizată.',
 'badtitle' => 'Titlu incorect',
 'badtitletext' => 'Titlul căutat a fost invalid, gol sau o legătură invalidă inter-linguală sau inter-wiki.
 
@@ -695,6 +700,8 @@ Motivul invocat este ''$2''.",
 Administratorul care a efectuat blocarea a furnizat explicația: „$3”.',
 'invalidtitle-knownnamespace' => 'Titlu invalid cu spațiul de nume „$2” și textul „$3”',
 'invalidtitle-unknownnamespace' => 'Titlu invalid cu numărul spațiului de nume $1 necunoscut și textul „$2”',
+'exception-nologin' => 'Neautentificat{{GENDER:||ă}}.',
+'exception-nologin-text' => 'Această pagină sau acțiune necesită ca dumneavoastră să fiți autentificat{{GENDER:||ă}} pe acest wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Configurație greșită: scaner de virus necunoscut: ''$1''",
@@ -715,6 +722,7 @@ Contul dumneavoatră a fost creat. Nu uitați să vă personalizați [[Special:P
 'remembermypassword' => 'Autentificare automată de la acest calculator (expiră după {{PLURAL:$1|24 de ore|$1 zile|$1 de zile}})',
 'securelogin-stick-https' => 'Rămâi conectat la HTTPS după autentificare',
 'yourdomainname' => 'Domeniul dumneavoastră:',
+'password-change-forbidden' => 'Nu puteți schimba parole pe acest wiki.',
 'externaldberror' => 'A fost fie o eroare de bază de date pentru o autentificare extenă sau nu aveți permisiunea să actualizați contul extern.',
 'login' => 'Autentificare',
 'nav-login-createaccount' => 'Creare cont / Autentificare',
@@ -737,7 +745,7 @@ Contul dumneavoatră a fost creat. Nu uitați să vă personalizați [[Special:P
 Vă rugăm să alegeți un alt nume.',
 'loginerror' => 'Eroare de autentificare',
 'createaccounterror' => 'Nu pot crea contul: $1',
-'nocookiesnew' => 'Contul a fost creat, dar dvs. nu sunteți autentificat(ă). {{SITENAME}} folosește cookie-uri pentru a reține utilizatorii autentificați. Browser-ul dvs. are modulele cookie dezactivate (disabled). Vă rugăm să le activați și să vă reautentificați folosind noul nume de utilizator și noua parolă.',
+'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.',
 'nocookiesfornew' => 'Contul de utilizator nu a fost creat, deoarece nu am putut confirma sursa.
 Asigurați-vă că aveți cookie-urile activate, reîncărcați pagina și încercați din nou.',
@@ -886,7 +894,7 @@ Parolă temporară: $2',
 # Edit pages
 'summary' => 'Rezumat:',
 'subject' => 'Subiect / titlu:',
-'minoredit' => 'Aceasta este o editare minoră',
+'minoredit' => 'Aceasta este o modificare minoră',
 'watchthis' => 'Monitorizează această pagină',
 'savearticle' => 'Salvare pagină',
 'preview' => 'Previzualizare',
@@ -955,6 +963,10 @@ sau puteți [{{fullurl:{{FULLPAGENAME}}|action=edit}} crea această pagină]</sp
 'noarticletext-nopermission' => 'Actualmente, această pagină este lipsită de conținut.
 Puteți [[Special:Search/{{PAGENAME}}|căuta acest titlu]] în alte pagini
 sau puteți <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} căuta înregistrări în jurnale]</span>.',
+'missing-revision' => 'Versiunea nr. $1 a paginii „{{PAGENAME}}” nu există.
+
+Acest lucru se întâmplă de obicei atunci când se accesează o legătură expirată către istoricul unei pagini șterse.
+Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].',
 'userpage-userdoesnotexist' => 'Contul de utilizator „<nowiki>$1</nowiki>” nu este înregistrat.
 Asigurați-vă că doriți să creați/modificați această pagină.',
 'userpage-userdoesnotexist-view' => 'Contul de utilizator „$1” nu este înregistrat.',
@@ -964,7 +976,6 @@ Ultima intrare în jurnalul blocărilor este afișată mai jos pentru referinț
 * '''Firefox / Safari:''' țineți apăsat pe ''Shift'' în timp ce faceți clic pe ''Reîncărcare'', ori apăsați ''Ctrl-F5'' sau ''Ctrl-R'' (''⌘-R'' pe un sistem Mac);
 * '''Google Chrome:''' apăsați ''Ctrl-Shift-R'' (''⌘-Shift-R'' pe un sistem Mac);
 * '''Internet Explorer:''' țineți apăsat pe ''Ctrl'' în timp ce faceți clic pe ''Reîmprospătare'' sau apăsați ''Ctrl-F5'';
-* '''Konqueror:''' faceți clic pe ''Reîncărcare'' sau apăsați ''F5'';
 * '''Opera:''' curățați memoria cache din ''Unelte → Preferințe''.",
 'usercssyoucanpreview' => "'''Sfat:''' Folosiți butonul „{{int:showpreview}}” pentru a testa noul CSS înainte de a-l salva.",
 'userjsyoucanpreview' => "'''Sfat:''' Folosiți butonul „{{int:showpreview}}” pentru a testa noul JavaScript înainte de a-l salva.",
@@ -1058,7 +1069,7 @@ Jurnalul ștergerilor și al mutărilor pentru această pagină este disponibil:
 Jurnalul ștergerilor și al mutărilor este disponibil mai jos.',
 'log-fulllog' => 'Vezi tot jurnalul',
 'edit-hook-aborted' => 'Modificarea a fost abandonată din cauza unui hook.
-Fără nicio explicație.',
+Nicio explicație furnizată.',
 'edit-gone-missing' => 'Pagina nu s-a putut actualiza.
 Se pare că a fost ștearsă.',
 'edit-conflict' => 'Conflict de modificare.',
@@ -1083,6 +1094,11 @@ Acsete argumente au fost omise.',
 'language-converter-depth-warning' => 'Limita adâncimii convertorului de limbă a fost depășită ($1)',
 'node-count-exceeded-category' => 'Pagini unde numărul de noduri este depășit',
 'node-count-exceeded-warning' => 'Pagina a depășit numărul de noduri',
+'expansion-depth-exceeded-category' => 'Pagini unde profunzimea de expansiune este depășită',
+'expansion-depth-exceeded-warning' => 'Pagina depășește profunzimea de expansiune',
+'parser-unstrip-loop-warning' => 'Buclă nedetașabilă detectată',
+'parser-unstrip-recursion-limit' => 'Limita de recursivitate nedetașabilă depășită ($1)',
+'converter-manual-rule-error' => 'Eroare detectată în regula manuală de conversie a limbii',
 
 # "Undo" feature
 'undo-success' => 'Modificarea poate fi anulată. Verificați diferența de dedesupt și apoi salvați pentru a termina anularea modificării.',
@@ -1097,15 +1113,15 @@ Acsete argumente au fost omise.',
 Motivul invocat de $3 este ''$2''",
 
 # History pages
-'viewpagelogs' => 'Vezi jurnalele pentru această pagină',
+'viewpagelogs' => 'Afișează jurnalele paginii',
 'nohistory' => 'Nu există istoric pentru această pagină.',
 'currentrev' => 'Versiunea curentă',
 'currentrev-asof' => 'Versiunea curentă din $1',
 'revisionasof' => 'Versiunea de la data $1',
-'revision-info' => 'Revizia pentru $1; $2',
+'revision-info' => 'Versiunea din $1; autor: $2',
 'previousrevision' => '←Versiunea anterioară',
 'nextrevision' => 'Versiunea următoare →',
-'currentrevisionlink' => 'afișează versiunea curentă',
+'currentrevisionlink' => 'Versiunea curentă',
 'cur' => 'actuală',
 'next' => 'următoarea',
 'last' => 'prec',
@@ -1122,7 +1138,7 @@ Motivul invocat de $3 este ''$2''",
 
 # Revision feed
 'history-feed-title' => 'Revizia istoricului',
-'history-feed-description' => 'Revizia istoricului pentru această pagină de pe wiki',
+'history-feed-description' => 'Istoricul versiunilor pentru această pagină din wiki',
 'history-feed-item-nocomment' => '$1 la $2',
 'history-feed-empty' => 'Pagina solicitată nu există.
 E posibil să fi fost ștearsă sau redenumită.
@@ -1133,7 +1149,7 @@ E posibil să fi fost ștearsă sau redenumită.
 'rev-deleted-user' => '(nume de utilizator șters)',
 'rev-deleted-event' => '(intrare ștearsă)',
 'rev-deleted-user-contribs' => '[nume de utilizator sau adresă IP ștearsă - modificare ascunsă din contribuții]',
-'rev-deleted-text-permission' => "Această revizie a paginii a fost '''ștearsă'''.
+'rev-deleted-text-permission' => "Această versiune a paginii a fost '''ștearsă'''.
 Mai multe detalii în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
 'rev-deleted-text-unhide' => "Această versiune a paginii a fost '''ștearsă'''.
 Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].
@@ -1145,8 +1161,8 @@ Ca administrator puteți [$1 vedea această versiune] în continuare, dacă dori
 Ca administrator puteți să o vedeți; detalii puteți găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
 'rev-suppressed-text-view' => "Această versiune a paginii a fost '''suprimată'''.
 Ca administrator puteți să o vedeți; detalii puteți găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].",
-'rev-deleted-no-diff' => "Nu poți vedea acestă diferență deoarece una dintre revizii a fost '''ștearsă'''.
-Pot exista mai multe detalii în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
+'rev-deleted-no-diff' => "Nu puteți vedea acestă diferență deoarece una dintre versiuni a fost '''ștearsă'''.
+Detalii în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
 'rev-suppressed-no-diff' => "Nu puteți vizualiza această diferență între versiuni deoarece una dintre versiuni a fost '''ștearsă'''.",
 'rev-deleted-unhide-diff' => "Una din versiunile acestui istoric a fost '''ștearsă'''.
 Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].
@@ -1162,8 +1178,8 @@ Ca administrator puteți vedea în continuare această diferență dinte versiun
 'rev-showdeleted' => 'arată',
 'revisiondelete' => 'Șterge/recuperează versiuni',
 'revdelete-nooldid-title' => 'Versiune invalidă',
-'revdelete-nooldid-text' => 'Nu ai specificat revizie pentru a efectua această
-funcție, revizia specificată nu există, sau ești pe cale să ascunzi revizia curentă.',
+'revdelete-nooldid-text' => 'Fie nu ați specificat versiunea pentru a efectua această
+funcție, fie versiunea specificată nu există, ori sunteți pe cale să ascundeți versiunea curentă.',
 'revdelete-nologtype-title' => 'Niciun tip de jurnal specificat',
 'revdelete-nologtype-text' => 'Nu ai specificat niciun tip de jurnal pentru a putea efectua această acțiune.',
 'revdelete-nologid-title' => 'Intrare în jurnal invalidă',
@@ -1235,13 +1251,13 @@ Asigură-te că această schimbare va menține continuitatea istoricului paginii
 'mergehistory-from' => 'Pagina sursă:',
 'mergehistory-into' => 'Pagina destinație:',
 'mergehistory-list' => 'Istoricul la care se aplică combinarea',
-'mergehistory-merge' => 'Ulmătoarele revizii ale [[:$1]] pot fi combinate în [[:$2]].
-Folosește butonul pentru a combina reviziile create la și după momentul specificat.
+'mergehistory-merge' => 'Următoarele versiuni ale [[:$1]] pot fi combinate în [[:$2]].
+Folosiți coloana butonului radio pentru a combina doar versiunile create la și înainte de momentul specificat.
 Folosirea linkurilor de navigare va reseta această coloană.',
 'mergehistory-go' => 'Vezi modificările care pot fi combinate',
 'mergehistory-submit' => 'Unește reviziile',
 'mergehistory-empty' => 'Reviziile nu pot fi combinate.',
-'mergehistory-success' => '$3 {{PLURAL:$3|revizie|revizii}} ale [[:$1]] au fost unite cu succes în [[:$2]].',
+'mergehistory-success' => '$3 {{PLURAL:$3|versiune|versiuni|de versiuni}} ale [[:$1]] {{PLURAL:$3|a fost unită|au fost unite|au fost unite}} cu succes în [[:$2]].',
 'mergehistory-fail' => 'Nu se poate executa combinarea istoricului, te rog verifică parametrii pagină și timp.',
 'mergehistory-no-source' => 'Pagina sursă $1 nu există.',
 'mergehistory-no-destination' => 'Pagina de destinație $1 nu există.',
@@ -1254,7 +1270,7 @@ Folosirea linkurilor de navigare va reseta această coloană.',
 
 # Merge log
 'mergelog' => 'Jurnal unificări',
-'pagemerge-logentry' => 'combină [[$1]] cu [[$2]] (revizii până la $3)',
+'pagemerge-logentry' => 'combină [[$1]] cu [[$2]] (versiuni până la $3)',
 'revertmerge' => 'Anulează îmbinarea',
 'mergelogpagetext' => 'Mai jos este o listă a celor mai recente combinări ale istoricului unei pagini cu al alteia.',
 
@@ -1267,8 +1283,12 @@ Folosirea linkurilor de navigare va reseta această coloană.',
 'compareselectedversions' => 'Compară versiunile marcate',
 'showhideselectedversions' => 'Șterge/recuperează versiunile marcate',
 'editundo' => 'anulare',
-'diff-multi' => '({{PLURAL:$1|O revizie intermediară|$1 revizii intermediare|$1 de revizii intermediare}} efectuată de {{PLURAL:$2|un utilizator|$2 utilizatori|$2 de utilizatori}} {{PLURAL:$1|neafișată|neafișate}})',
+'diff-multi' => '(Nu {{PLURAL:$1|s-a afișat o versiune intermediară efectuată|s-au afișat $1 versiuni intermediare efectuate|s-au afișat $1 de versiuni intermediare efectuate}} de {{PLURAL:$2|un utilizator|$2 utilizatori|$2 de utilizatori}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|O versiune intermediară efectuată de|$1 (de) versiuni intermediare efectuate de peste}} $2 {{PLURAL:$2|utilizator|utilizatori}} {{PLURAL:$1|neafișată|neafișate}})',
+'difference-missing-revision' => '{{PLURAL:$2|O versiune a|$2 versiuni ale|$2 de versiuni ale}} acestei diferențe ($1) nu {{PLURAL:$2|a fost găsită|au fost găsite}}.
+
+Acest lucru se întâmplă de obicei atunci când se accesează o legătură expirată către istoricul unei pagini șterse.
+Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].',
 
 # Search results
 'searchresults' => 'Rezultatele căutării',
@@ -1469,7 +1489,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 # User rights
 'userrights' => 'Administrare permisiuni de utilizator',
 'userrights-lookup-user' => 'Administrare grupuri de utilizatori',
-'userrights-user-editname' => 'Introdu un nume de utilizator:',
+'userrights-user-editname' => 'Introduceți un nume de utilizator:',
 'editusergroup' => 'Modificare grup de utilizatori',
 'editinguser' => "Modificare permisiuni de utilizator pentru '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Modificare grup de utilizatori',
@@ -1513,16 +1533,16 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'grouppage-suppress' => '{{ns:project}}:Oversight',
 
 # Rights
-'right-read' => 'Citește paginile',
+'right-read' => 'Citește pagini',
 'right-edit' => 'Modifică paginile',
 'right-createpage' => 'Creează pagini (altele decât pagini de discuție)',
 'right-createtalk' => 'Creează pagini de discuție',
 'right-createaccount' => 'Creează conturi noi',
 'right-minoredit' => 'Marchează modificările minore',
-'right-move' => 'Mută paginile',
-'right-move-subpages' => 'Mută paginile cu tot cu subpagini',
+'right-move' => 'Redenumește paginile',
+'right-move-subpages' => 'Redenumește paginile cu tot cu subpagini',
 'right-move-rootuserpages' => 'Redenumește pagina principală a unui utilizator',
-'right-movefile' => 'Mută fișierele',
+'right-movefile' => 'Redenumește fișiere',
 'right-suppressredirect' => 'Nu crea o redirecționare de la vechiul nume atunci când muți o pagină',
 'right-upload' => 'Încarcă fișiere',
 'right-reupload' => 'Suprascrie un fișier existent',
@@ -1532,11 +1552,12 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'right-purge' => 'Curăță memoria cache pentru o pagină fără confirmare',
 'right-autoconfirmed' => 'Modifică paginile semi-protejate',
 'right-bot' => 'Tratare ca proces automat',
-'right-nominornewtalk' => 'Nu activa mesajul "Aveți un mesaj nou" la modificarea minoră a paginii de discuții a utilizatorului',
+'right-nominornewtalk' => 'Nu declanșează mesajul „Aveți un mesaj nou” atunci când efectuează o modificare minoră pe pagina de discuții a utilizatorului',
 'right-apihighlimits' => 'Folosește o limită mai mare pentru rezultatele cererilor API',
 'right-writeapi' => 'Utilizează API la scriere',
-'right-delete' => 'Şterge pagini',
+'right-delete' => 'Șterge pagini',
 'right-bigdelete' => 'Şterge pagini cu istoric lung',
+'right-deletelogentry' => 'Șterge și recuperează intrări specifice din jurnale',
 'right-deleterevision' => 'Șterge și recuperează versiuni specifice ale paginilor',
 'right-deletedhistory' => 'Vezi intrările șterse din istoric, fără textul asociat',
 'right-deletedtext' => 'Vizualizați textul șters și modificările dintre versiunile șterse',
@@ -1576,7 +1597,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 # User rights log
 'rightslog' => 'Jurnal permisiuni de utilizator',
 'rightslogtext' => 'Acest jurnal cuprinde modificările permisiunilor utilizatorilor.',
-'rightslogentry' => 'a schimbat pentru $1 apartenența la un grup de la $2 la $3',
+'rightslogentry' => 'a schimbat permisiunile pentru $1 de la $2 la $3',
 'rightslogentry-autopromote' => 'a fost promovat în mod automat de la $2 la $3',
 'rightsnone' => '(niciunul)',
 
@@ -1587,21 +1608,21 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'action-createtalk' => 'creați pagini de discuție',
 'action-createaccount' => 'creați acest cont de utilizator',
 'action-minoredit' => 'marcați această modificare ca minoră',
-'action-move' => 'mutați această pagină',
-'action-move-subpages' => 'mutați această pagină și subpaginile sale',
+'action-move' => 'redenumiți această pagină',
+'action-move-subpages' => 'redenumiți această pagină și subpaginile sale',
 'action-move-rootuserpages' => 'redenumiți pagina principală a unui utilizator',
-'action-movefile' => 'mutați acest fișier',
+'action-movefile' => 'redenumiți acest fișier',
 'action-upload' => 'încărcați acest fișier',
 'action-reupload' => 'suprascrieți fișierul existent',
 'action-reupload-shared' => 'rescrieți acest fișier în depozitul partajat',
 'action-upload_by_url' => 'încărcați acest fișier de la o adresă URL',
 'action-writeapi' => 'utilizați scrierea prin API',
 'action-delete' => 'ștergeți această pagină',
-'action-deleterevision' => 'ștergeți această revizie',
+'action-deleterevision' => 'ștergeți această versiune',
 'action-deletedhistory' => 'vizualizați istoricul șters al aceste pagini',
 'action-browsearchive' => 'căutați pagini șterse',
 'action-undelete' => 'recuperați această pagină',
-'action-suppressrevision' => 'revizuiți și să restaurați această revizie ascunsă',
+'action-suppressrevision' => 'revizuiți și să restaurați această versiune ascunsă',
 'action-suppressionlog' => 'vizualizați acest jurnal privat',
 'action-block' => 'blocați permisiunea de modificare a acestui utilizator',
 'action-protect' => 'modificați nivelurile de protecție pentru această pagină',
@@ -1621,7 +1642,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'nchanges' => '$1 {{PLURAL:$1|modificare|modificări|de modificări}}',
 'recentchanges' => 'Schimbări recente',
 'recentchanges-legend' => 'Opțiuni schimbări recente',
-'recentchanges-summary' => 'Schimbări recente ... (Log)',
+'recentchanges-summary' => 'Urmăriți cele mai recente modificări din wiki pe această pagină.',
 'recentchanges-feed-description' => 'Urmărește cele mai recente schimbări folosind acest flux.',
 'recentchanges-label-newpage' => 'Această modificare a creat o pagină nouă',
 'recentchanges-label-minor' => 'Aceasta este o modificare minoră',
@@ -1683,9 +1704,9 @@ Iată aici înregistrările relevante din jurnalul de ștergeri și redenumiri:"
 Pentru a vizualiza sau căuta imagini deja trimise, mergeți la [[Special:FileList|lista cu imagini]]; (re)încărcările și ștergerile sunt de asemenea înregistrate în [[Special:Log/upload|jurnalul fișierelor trimise]], respectiv [[Special:Log/delete|jurnalul fișierelor șterse]].
 
 Pentru a insera un fișier într-o pagină, folosiți o legătură de forma:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fișier.jpg]]</nowiki></tt>''' pentru a include versiunea integrală a unui fișier
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fișier.png|200px|thumb|left|informații]]</nowiki></tt>''' pentru a introduce o imagine cu o lățime de 200 de pixeli într-un chenar plasat în partea stângă, având ca descriere textul „informații”
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fișier.ogg]]</nowiki></tt>''' pentru o legătură directă către fișier, fără a-l afișa",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fișier.jpg]]</nowiki></code>''' pentru a include versiunea integrală a unui fișier
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fișier.png|200px|thumb|left|informații]]</nowiki></code>''' pentru a introduce o imagine cu o lățime de 200 de pixeli într-un chenar plasat în partea stângă, având ca descriere textul „informații”
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fișier.ogg]]</nowiki></code>''' pentru o legătură directă către fișier, fără a-l afișa",
 'upload-permitted' => 'Tipuri de fișiere permise: $1.',
 'upload-preferred' => 'Tipuri de fișiere preferate: $1.',
 'upload-prohibited' => 'Tipuri de fișiere interzise: $1.',
@@ -1729,20 +1750,20 @@ Vezi [[Special:NewFiles|galeria fișierelor noi]] pentru o mai bună vizualizare
 'largefileserver' => 'Fișierul este mai mare decât este configurat serverul să permită.',
 'emptyfile' => 'Fișierul pe care l-ați încărcat pare a fi gol. Aceasta poate fi datorită unei greșeli în numele fișierului. Verificați dacă într-adevăr doriți să încărcați acest fișier.',
 'windows-nonascii-filename' => 'Acest wiki nu acceptă nume de fișiere care conțin caractere speciale.',
-'fileexists' => "Un fișier cu același nume există deja, vă rugăm verificați '''<tt>[[:$1]]</tt>''' dacă nu sunteți sigur dacă doriți să îl modificați.
-[[$1|thumb]]",
-'filepageexists' => "Pagina cu descrierea fișierului a fost deja creată la '''<tt>[[:$1]]</tt>''', dar niciun fișier cu acest nume nu există în acest moment.
+'fileexists' => 'Un fișier cu același nume există deja, vă rugăm verificați <strong>[[:$1]]</strong> dacă nu sunteți sigur dacă doriți să îl modificați.
+[[$1|thumb]]',
+'filepageexists' => 'Pagina cu descrierea fișierului a fost deja creată la <strong>[[:$1]]</strong>, dar niciun fișier cu acest nume nu există în acest moment.
 Sumarul pe care l-ai introdus nu va apărea în pagina cu descriere.
 Pentru ca sumarul tău să apară, va trebui să îl adaugi manual.
-[[$1|miniatură]]",
-'fileexists-extension' => "Un fișier cu un nume similar există: [[$2|thumb]]
-* Numele fișierului de încărcat: '''<tt>[[:$1]]</tt>'''
-* Numele fișierului existent: '''<tt>[[:$2]]</tt>'''
-Te rog alege alt nume.",
+[[$1|miniatură]]',
+'fileexists-extension' => 'Un fișier cu un nume similar există: [[$2|thumb]]
+* Numele fișierului de încărcat: <strong>[[:$1]]</strong>
+* Numele fișierului existent: <strong>[[:$2]]</strong>
+Te rog alege alt nume.',
 'fileexists-thumbnail-yes' => "Fișierul pare a fi o imagine cu o rezoluție scăzută ''(thumbnail)''. [[$1|thumb]]
-Verifică fișierul'''<tt>[[:$1]]</tt>'''.
+Verifică fișierul<strong>[[:$1]]</strong>.
 Dacă fișierul verificat este identic cu imaginea originală nu este necesară încărcarea altui thumbnail.",
-'file-thumbnail-no' => "Numele fișierului începe cu '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Numele fișierului începe cu <strong>$1</strong>.
 Se pare că este o imagine cu dimensiune redusă''(thumbnail)''.
 Dacă ai această imagine la rezoluție mare încarc-o pe aceasta, altfel schimbă numele fișierului.",
 'fileexists-forbidden' => 'Un fișier cu acest nume există deja și nu poate fi rescris.
@@ -1817,9 +1838,18 @@ Dacă problema persistă, contactați un [[Special:ListUsers/sysop|administrator
 'backend-fail-read' => 'Imposibil de citit fișierul $1.',
 'backend-fail-create' => 'Imposibil de scris fișierul $1.',
 'backend-fail-maxsize' => 'Nu s-a putut scrie fișierul $1 pentru că acesta este mai mare de {{PLURAL:$2|un octet|$2 octeți|$2 de octeți}}.',
+'backend-fail-readonly' => "Suportul de stocare „$1” este în prezent doar în citire. Motivul dat este: „''$2''”",
+'backend-fail-synced' => 'Fișierul „$1” este într-o stare de inconsistență în suporturile de stocare internă',
+'backend-fail-connect' => 'Imposibil de conectat la suportul de stocare „$1”.',
+'backend-fail-internal' => 'O eroare necunoscută s-a produs în suportul de stocare „$1”.',
 'backend-fail-contenttype' => 'Nu s-a putut determina tipul de conținut al fișierului de stocat la „$1”.',
+'backend-fail-batchsize' => 'Suportul de stocare a furnizat un lot de $1 {{PLURAL:$1|operațiune|operațiuni|de operațiuni}} de fișier; limita este $2 {{PLURAL:$2|operațiune|operațiuni|de operațiuni}}.',
 'backend-fail-usable' => 'Imposibil de scris fișierul $1 din cauza permisiunilor insuficiente sau din cauza directoarelor/containerelor lipsă.',
 
+# File journal errors
+'filejournal-fail-dbconnect' => 'Imposibil de conectat la baza de date a jurnalului pentru terminatul de stocare „$1”.',
+'filejournal-fail-dbquery' => 'Imposibil de actualizat baza de date a jurnalului pentru terminalul de stocare „$1”.',
+
 # Lock manager
 'lockmanager-notlocked' => 'Imposibil de deblocat „$1”; nu este blocată.',
 'lockmanager-fail-closelock' => 'Imposibil de închis fișierul de blocare pentru „$1”.',
@@ -1829,6 +1859,7 @@ Dacă problema persistă, contactați un [[Special:ListUsers/sysop|administrator
 'lockmanager-fail-releaselock' => 'Imposibil de eliberat blocarea pentru „$1”.',
 'lockmanager-fail-db-bucket' => 'Imposibil de contactat suficient baza de date cu blocări în găleata $1.',
 'lockmanager-fail-db-release' => 'Imposibil de eliberat blocările din baza de date $1.',
+'lockmanager-fail-svr-acquire' => 'Imposibil de obținut blocări pe serverul $1.',
 'lockmanager-fail-svr-release' => 'Imposibil de eliberat blocările de pe serverul $1.',
 
 # ZipDirectoryReader
@@ -1913,7 +1944,7 @@ Când acestei pagini îi este aplicat filtrul de utilizator, sunt afișate doar
 'filehist' => 'Istoricul fișierului',
 'filehist-help' => "Apăsați pe '''Data și ora''' pentru a vedea versiunea fișierului trimisă la momentul respectiv.",
 'filehist-deleteall' => 'șterge tot',
-'filehist-deleteone' => 'șterge',
+'filehist-deleteone' => 'ștergere',
 'filehist-revert' => 'revenire',
 'filehist-current' => 'actuală',
 'filehist-datetime' => 'Data și ora',
@@ -1948,6 +1979,7 @@ Poate doriți să-i modificați descrierea pe [$2 pagina sa descriptivă] de aco
 'uploadnewversion-linktext' => 'Încarcă o versiune nouă a acestui fișier',
 'shared-repo-from' => 'de la $1',
 'shared-repo' => 'un depozit partajat',
+'upload-disallowed-here' => 'Din păcate, nu puteți suprascrie această imagine.',
 
 # File reversion
 'filerevert' => 'Revenire $1',
@@ -1982,7 +2014,7 @@ Poate doriți să-i modificați descrierea pe [$2 pagina sa descriptivă] de aco
 # MIME search
 'mimesearch' => 'Căutare MIME',
 'mimesearch-summary' => 'This page enables the filtering of files for its MIME-type.
-Input: contenttype/subtype, e.g. <tt>image/jpeg</tt>.
+Input: contenttype/subtype, e.g. <code>image/jpeg</code>.
 
 
 Această pagină specială permite căutarea fișierelor în funcție de tipul MIME (Multipurpose Internet Mail Extensions). Cele mai des întâlnite sunt:
@@ -2040,9 +2072,9 @@ Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.w
 
 'disambiguations' => 'Pagini care trimit către pagini de dezambiguizare',
 'disambiguationspage' => 'Template:Dezambiguizare',
-'disambiguations-text' => "Paginile următoare conțin legături către o '''pagină de dezambiguizare'''.
-În locul acesteia ar trebui să conțină legături către un articol.<br />
-O pagină este considerată o pagină de dezambiguizare dacă folosește formate care apar la [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Paginile următoare conțin cel puțin o legătură către o '''pagină de dezambiguizare'''.
+Acestea ar trebui să conțină legături către un articol mai potrivit.<br />
+O pagină este considerată o pagină de dezambiguizare dacă folosește formate care apar la [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Redirecționări duble',
 'doubleredirectstext' => 'Această listă conține pagini care redirecționează la alte pagini de redirecționare.
@@ -2055,21 +2087,22 @@ Intrările <del>tăiate</del> au fost rezolvate.',
 'brokenredirects' => 'Redirecționări greșite',
 'brokenredirectstext' => 'Următoarele redirecționări conduc spre articole inexistente:',
 'brokenredirects-edit' => 'modificare',
-'brokenredirects-delete' => 'șterge',
+'brokenredirects-delete' => 'ștergere',
 
 'withoutinterwiki' => 'Pagini fără legături interwiki',
 'withoutinterwiki-summary' => 'Următoarele pagini nu se leagă la versiuni ale lor în alte limbi:',
 'withoutinterwiki-legend' => 'Prefix',
 'withoutinterwiki-submit' => 'Arată',
 
-'fewestrevisions' => 'Articole cu cele mai puține revizii',
+'fewestrevisions' => 'Articole cu cele mai puține versiuni',
 
 # Miscellaneous special pages
 'nbytes' => '{{PLURAL:$1|un octet|$1 octeți|$1 de octeți}}',
 'ncategories' => '{{PLURAL:$1|o categorie|$1 categorii|$1 de categorii}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|legături interwiki|de legături interwiki}}',
 'nlinks' => '{{PLURAL:$1|o legătură|$1 legături|$1 de legături}}',
 'nmembers' => '$1 {{PLURAL:$1|membru|membri|de membri}}',
-'nrevisions' => '{{PLURAL:$1|o revizie|$1 revizii|$1 de revizii}}',
+'nrevisions' => '{{PLURAL:$1|o versiune|$1 versiuni|$1 de versiuni}}',
 'nviews' => '{{PLURAL:$1|o accesare|$1 accesări|$1 de accesări}}',
 'nimagelinks' => 'Utilizat pe $1 {{PLURAL:$1|pagină|pagini}}',
 'ntransclusions' => 'utilizat pe $1 {{PLURAL:$1|pagină|pagini}}',
@@ -2095,6 +2128,7 @@ Intrările <del>tăiate</del> au fost rezolvate.',
 'mostlinkedtemplates' => 'Cele mai folosite formate',
 'mostcategories' => 'Articole cu cele mai multe categorii',
 'mostimages' => 'Cele mai căutate imagini',
+'mostinterwikis' => 'Pagini cu cele mai multe legături interwiki',
 'mostrevisions' => 'Articole cu cele mai multe revizuiri',
 'prefixindex' => 'Toate paginile cu prefix',
 'prefixindex-namespace' => 'Toate paginile cu prefix (spațiul de nume $1)',
@@ -2119,12 +2153,12 @@ Intrările <del>tăiate</del> au fost rezolvate.',
 'newpages-username' => 'Nume de utilizator:',
 'ancientpages' => 'Cele mai vechi articole',
 'move' => 'Redenumire',
-'movethispage' => 'Mută această pagină',
+'movethispage' => 'Redenumește această pagină',
 'unusedimagestext' => 'Următoarele fișiere există dar nu sunt incluse în nicio altă pagină.
 Vă rugăm să aveți în vedere faptul că alte saituri web pot avea o legătură directă către acest URL și s-ar putea afla aici chiar dacă nu sunt în utlizare activă.',
 'unusedcategoriestext' => 'Următoarele categorii de pagini există și totuși nici un articol sau categorie nu le folosește.',
 'notargettitle' => 'Lipsă țintă',
-'notargettext' => 'Nu ai specificat nici o pagină sau un utilizator țintă pentru care să se efectueze această operațiune.',
+'notargettext' => 'Nu ați specificat nici o pagină sau un utilizator țintă pentru care să se efectueze această operațiune.',
 'nopagetitle' => 'Nu există pagina destinație',
 'nopagetext' => 'Pagina destinație specificată nu există.',
 'pager-newer-n' => '{{PLURAL:$1|1 mai nou|$1 mai noi}}',
@@ -2194,7 +2228,7 @@ Vedeți și [[Special:WantedCategories|categoriile dorite]].',
 'linksearch-ok' => 'Caută',
 'linksearch-text' => 'Pot fi folosite metacaractere precum „*.wikipedia.org”.
 Necesită cel puțin un domeniu de nivel superior, cum ar fi „*.org”.<br />
-Protocoale suportate: <tt>$1</tt> (nu adăugați niciunul dintre acestea în câmpul de căutare).',
+Protocoale suportate: <code>$1</code> (nu adăugați niciunul dintre acestea în câmpul de căutare).',
 'linksearch-line' => '$1 este legat de $2',
 'linksearch-error' => 'Metacaracterele pot să apară doar la începutul hostname-ului.',
 
@@ -2218,9 +2252,9 @@ Protocoale suportate: <tt>$1</tt> (nu adăugați niciunul dintre acestea în câ
 'newuserlogpagetext' => 'Acesta este jurnalul creărilor conturilor de utilizator.',
 
 # Special:ListGroupRights
-'listgrouprights' => 'Permisiunile grupurilor de utilizatori',
-'listgrouprights-summary' => 'Mai jos este afișată o listă a grupurilor de utilizatori definită în această wiki, împreună cu permisiunile de acces asociate.
-Pot exista [[{{MediaWiki:Listgrouprights-helppage}}|informații adiționale]] despre permisiunile individuale.',
+'listgrouprights' => 'Permisiuni grupuri de utilizatori',
+'listgrouprights-summary' => 'Mai jos se află o listă a grupurilor de utilizatori definită în aceast wiki, împreună cu permisiunile de acces asociate.
+Pot exista [[{{MediaWiki:Listgrouprights-helppage}}|informații suplimentare]] despre permisiuni individuale.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Drept acordat</span>
 * <span class="listgrouprights-revoked">Drept revocat</span>',
 'listgrouprights-group' => 'Grup',
@@ -2240,9 +2274,11 @@ Pot exista [[{{MediaWiki:Listgrouprights-helppage}}|informații adiționale]] de
 'mailnologin' => 'Nu există adresă de trimitere',
 'mailnologintext' => 'Trebuie să fii [[Special:UserLogin|autentificat]] și să ai o adresă validă de e-mail în [[Special:Preferences|preferințe]] pentru a trimite e-mail altor utilizatori.',
 'emailuser' => 'Trimiteți un e-mail',
+'emailuser-title-target' => 'E-mail către {{GENDER:$1|acest utilizator|această utilizatoare}}',
+'emailuser-title-notarget' => 'E-mail către utilizator',
 'emailpage' => 'E-mail către utilizator',
-'emailpagetext' => 'Poți folosi formularul de mai jos pentru a trimite un e-mail acestui utilizator.
-Adresa de e-mail introdusă de tine în [[Special:Preferences|preferințele de utilizator]] va apărea ca adresa expeditorului e-mail-ului, deci destinatarul va putea să îți răspundă direct.',
+'emailpagetext' => 'Puteți folosi formularul de mai jos pentru a trimite un e-mail acestui utilizator.
+Adresa de e-mail specificată de dumneavoastră în [[Special:Preferences|preferințele de utilizator]] va apărea ca adresa expeditorului e-mailului; astfel, destinatarul va putea să vă răspundă direct.',
 'usermailererror' => 'Obiectul de mail a dat eroare:',
 'defemailsubject' => 'E-mail {{SITENAME}} de la utilizatorul „$1”',
 'usermaildisabled' => 'E-mail dezactivat',
@@ -2255,7 +2291,7 @@ Adresa de e-mail introdusă de tine în [[Special:Preferences|preferințele de u
 'emailtarget' => 'Introduceți numele de utilizator al destinatarului',
 'emailusername' => 'Nume de utilizator:',
 'emailusernamesubmit' => 'Trimite',
-'email-legend' => 'Trimite e-mail altui utilizator de la {{SITENAME}}',
+'email-legend' => 'Trimitere e-mail către alt utilizator de la {{SITENAME}}',
 'emailfrom' => 'De la:',
 'emailto' => 'Către:',
 'emailsubject' => 'Subiect:',
@@ -2276,7 +2312,7 @@ Adresa de e-mail introdusă de tine în [[Special:Preferences|preferințele de u
 'mywatchlist' => 'Pagini urmărite',
 'watchlistfor2' => 'Pentru $1 $2',
 'nowatchlist' => 'Nu ați ales să urmăriți nici o pagină.',
-'watchlistanontext' => 'Te rugăm să $1 pentru a vizualiza sau edita itemii de pe lista ta de urmărire.',
+'watchlistanontext' => 'Vă rugăm să vă $1 pentru a vizualiza sau edita elementele din lista dumneavoastră de pagini urmărite.',
 'watchnologin' => 'Nu sunteți autentificat',
 'watchnologintext' => 'Trebuie să fiți [[Special:UserLogin|autentificat]] pentru a vă modifica lista de pagini urmărite.',
 'addwatch' => 'Adăugă la lista de pagini urmărite',
@@ -2374,16 +2410,18 @@ Accesați $2 pentru o listă cu elementele recent șterse.',
 ** Violarea drepturilor de autor
 ** Vandalism',
 'delete-edit-reasonlist' => 'Modifică motivele ștergerii',
-'delete-toobig' => 'Această pagină are un istoric al modificărilor mare, mai mult de $1 {{PLURAL:$1|revizie|revizii}}.
-Ştergerea unei astfel de pagini a fost restricționată pentru a preveni apariția unor erori în {{SITENAME}}.',
-'delete-warning-toobig' => 'Această pagină are un istoric al modificărilor mult prea mare, mai mult de $1 {{PLURAL:$1|revizie|revizii}}.
-Ştergere lui poate afecta baza de date a sitului {{SITENAME}};
-continuă cu atenție.',
+'delete-toobig' => 'Această pagină are un istoric al modificărilor important, cu mai mult de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}.
+Ștergerea unei astfel de pagini a fost restricționată pentru a preveni apariția unor erori în {{SITENAME}}.',
+'delete-warning-toobig' => 'Această pagină are un istoric al modificărilor mult prea mare, cu mai mult de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}.
+Ștergerea sa poate afecta baza de date a sitului {{SITENAME}};
+acționați cu precauție.',
 
 # Rollback
 'rollback' => 'Editări de revenire',
 'rollback_short' => 'Revenire',
 'rollbacklink' => 'revenire',
+'rollbacklinkcount' => 'revenire asupra {{PLURAL:$1|unei modificări|a $1 modificări|a $1 de modificări}}',
+'rollbacklinkcount-morethan' => 'revenire asupra a mai mult de {{PLURAL:$1|o modificare|$1 modificări|$1 de modificări}}',
 'rollbackfailed' => 'Revenirea nu s-a putut face',
 'cantrollback' => 'Nu se poate reveni; ultimul contribuitor este autorul acestui articol.',
 'alreadyrolled' => 'Nu se poate reveni peste ultima modificare a articolului [[:$1]] făcută de către [[User:$2|$2]] ([[User talk:$2|discuție]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); altcineva a modificat articolul sau a revenit deja.
@@ -2427,7 +2465,7 @@ Iată configurația curentă a paginii '''$1''':",
 Aici sunt setările curente pentru pagina '''$1''':",
 'protect-cascadeon' => 'Această pagină este protejată deoarece este inclusă în {{PLURAL:$1|următoarea pagină, ce are|următoarele pagini ce au}} activată protejarea la modificare în cascadă.
 Puteți schimba nivelul de protejare al acestei pagini, dar asta nu va afecta protecția în cascadă.',
-'protect-default' => 'Permite toți utilizatorii',
+'protect-default' => 'Permis pentru toți utilizatorii',
 'protect-fallback' => 'Cere permisiunea "$1"',
 'protect-level-autoconfirmed' => 'Blochează utilizatorii noi și neînregistrați',
 'protect-level-sysop' => 'Numai administratorii',
@@ -2457,9 +2495,9 @@ Puteți schimba nivelul de protejare al acestei pagini, dar asta nu va afecta pr
 
 # Restrictions (nouns)
 'restriction-edit' => 'Modificare',
-'restriction-move' => 'Mută',
-'restriction-create' => 'Creează',
-'restriction-upload' => 'Încarcă',
+'restriction-move' => 'Redenumire',
+'restriction-create' => 'Creare',
+'restriction-upload' => 'Încărcare',
 
 # Restriction levels
 'restriction-level-sysop' => 'protejat complet',
@@ -2477,22 +2515,22 @@ Puteți schimba nivelul de protejare al acestei pagini, dar asta nu va afecta pr
 Pentru a realiza o recuperare selectivă bifați versiunile pe care doriți să le recuperați și apăsați butonul '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '$1 {{PLURAL:$1|versiune arhivată|versiuni arhivate|de versiuni arhivate}}',
 'undeletehistory' => 'Dacă recuperați pagina, toate versiunile asociate vor fi adăugate retroactiv în istorie. Dacă o pagină nouă cu același nume a fost creată de la momentul ștergerii acesteia, versiunile recuperate vor apărea în istoria paginii, iar versiunea curentă a paginii nu va fi înlocuită automat de către versiunea recuperată.',
-'undeleterevdel' => 'Restaurarea unui revizii nu va fi efectuată dacă ea va apărea în capul listei de revizii parțial șterse.
-În acest caz, trebuie să debifezi sau să arăți (unhide) cea mai recentă versiune ștearsă.',
+'undeleterevdel' => "Restaurarea unui versiuni nu va fi efectuată dacă ea va apărea în capul listei de versiuni parțial șterse.
+În acest caz, trebuie să debifați sau să reafișați (''unhide'') cea mai recentă versiune ștearsă.",
 'undeletehistorynoadmin' => 'Acest articol a fost șters. Motivul ștergerii apare mai jos, alături de detaliile utilzatorilor care au editat această pagină înainte de ștergere. Textul prorpiu-zis al reviziilor șterse este disponibil doar administratorilor.',
-'undelete-revision' => 'Ştergere revizia $1 (din $4 $5) de către $3:',
-'undeleterevision-missing' => 'Revizie lipsă sau invalidă.
-S-ar putea ca această legătură să fie greșită, sau revizia a fost restaurată ori ștearsă din arhivă.',
-'undelete-nodiff' => 'Nu s-a găsit vreo revizie anterioară.',
+'undelete-revision' => 'Ștergere versiunea $1 (din $4 $5) de către $3:',
+'undeleterevision-missing' => 'Versiune lipsă sau invalidă.
+S-ar putea ca legătura să fie greșită, ori versiunea să fi fost restaurată sau ștearsă din arhivă.',
+'undelete-nodiff' => 'Nu s-a găsit vreo versiune anterioară.',
 'undeletebtn' => 'Recuperează',
 'undeletelink' => 'vizualizare/recuperare',
 'undeleteviewlink' => 'vezi',
 'undeletereset' => 'Resetează',
 'undeleteinvert' => 'Exclude spațiul',
 'undeletecomment' => 'Motiv:',
-'undeletedrevisions' => '{{PLURAL:$1|o revizie restaurată|$1 revizii restaurate|$1 de revizii restaurate}}',
-'undeletedrevisions-files' => '$1 {{PLURAL:$1|revizie|revizii|de revizii}} și $2 {{PLURAL:$2|fișier|fișiere|de fișiere}} recuperate',
-'undeletedfiles' => '$1 {{PLURAL:$1|revizie recuperată|revizii recuperate|de revizii recuperate}}',
+'undeletedrevisions' => '{{PLURAL:$1|o versiune restaurată|$1 versiuni restaurate|$1 de versiuni restaurate}}',
+'undeletedrevisions-files' => '{{PLURAL:$1|O versiune|$1 versiuni|$1 de versiuni}} și {{PLURAL:$2|un fișier|$2 fișiere|$2 de fișiere}} recuperate',
+'undeletedfiles' => '{{PLURAL:$1|O versiune recuperată|$1 versiuni recuperate|$1 de versiuni recuperate}}',
 'cannotundelete' => 'Recuperarea a eșuat; este posibil ca altcineva să fi recuperat pagina deja.',
 'undeletedpage' => "'''$1 a fost recuperat'''
 
@@ -2550,7 +2588,7 @@ Iată aici ultima înregistrare relevantă din jurnalul blocărilor:',
 'sp-contributions-search' => 'Căutare contribuții',
 'sp-contributions-username' => 'Adresă IP sau nume de utilizator:',
 'sp-contributions-toponly' => 'Afișează numai versiunile recente',
-'sp-contributions-submit' => 'Caută',
+'sp-contributions-submit' => 'Căutare',
 
 # What links here
 'whatlinkshere' => 'Ce trimite aici',
@@ -2725,22 +2763,22 @@ Pentru a închide sau deschide baza de date, acesta trebuie să poată fi scris
 'lockedbyandtime' => '(de $1, pe $2, la $3 )',
 
 # Move page
-'move-page' => 'Mută $1',
-'move-page-legend' => 'Mută pagina',
-'movepagetext' => "Puteți folosi formularul de mai jos pentru a redenumi o pagină, mutându-i toată istoria sub noul nume.
+'move-page' => 'Redenumire $1',
+'move-page-legend' => 'Redenumire pagină',
+'movepagetext' => "Puteți folosi formularul de mai jos pentru a redenumi o pagină, mutându-i tot istoricul sub noul nume.
 Pagina veche va deveni o pagină de redirecționare către pagina nouă.
 Legăturile către pagina veche nu vor fi redirecționate către cea nouă;
 nu uitați să verificați dacă nu există redirecționări [[Special:DoubleRedirects|duble]] sau [[Special:BrokenRedirects|invalide]].
 
 Vă rugăm să rețineți că sunteți responsabil(ă) pentru a face legăturile vechi să rămână valide.
 
-Rețineți că pagina '''nu va fi mutată''' dacă există deja o pagină cu noul titlu, în afară de cazul că este complet goală sau este
-o redirecționare și în plus nu are nici o istorie de modificare.
-Cu alte cuvinte, veți putea muta înapoi o pagină pe care ați mutat-o greșit, dar nu veți putea suprascrie o pagină validă existentă prin mutarea alteia.
+Rețineți că pagina '''nu va fi redenumită''' dacă există deja o pagină cu noul titlu, în afara cazurilor în care cea din urmă nu are conținut sau este deja
+o redirecționare; în plus, aceasta nu trebuie să aibă un istoric de modificări.
+Cu alte cuvinte, veți putea redenumi înapoi o pagină pe care ați redenumit-o greșit, dar nu veți putea suprascrie o pagină validă existentă prin redenumirea alteia.
 
 '''ATENȚIE!'''
 Aceasta poate fi o schimbare drastică și neașteptată pentru o pagină populară;
-vă rugăm, să vă asigurați că înțelegeți toate consecințele înainte de a continua.",
+vă rugăm să vă asigurați că înțelegeți toate consecințele înainte de a continua.",
 'movepagetext-noredirectfixer' => "Completând formularul de mai jos veți redenumi o pagină, mutând tot istoricul la noul nume.
 Vechiul titlu va deveni o pagină de redirecționare către noul titlu.
 Fiți sigur că ați verificat lista redirecționărilor [[Special:DoubleRedirects|duble]] sau [[Special:BrokenRedirects|nefuncționale]].
@@ -2752,43 +2790,42 @@ Acest lucru înseamnă că veți putea redenumi la titlul inițial o pagină gre
 '''Atenție!'''
 Această acțiune poate determina o schimbare dramatică, neașteptată pentru o pagină cu trafic crescut;
 asigurați-vă că înțelegeți toate consecințele înainte de a continua.",
-'movepagetalktext' => "Pagina asociată de discuții, dacă există, va fi mutată
-automat odată cu aceasta '''afară de cazul că''':
-* Mutați pagina în altă secțiune a {{SITENAME}}
-* Există deja o pagină de discuții cu conținut (care nu este goală), sau
-* Nu confirmi căsuța de mai jos.
-
-În oricare din cazurile de mai sus va trebui să muți sau să unifici
-manual paginile de discuții, dacă dorești acest lucru.",
+'movepagetalktext' => "Pagina de discuții asociată, dacă există, va fi redenumită
+automat odată cu aceasta în '''afara următoarelor cazuri''':
+* există deja o pagină de discuții cu conținut (care nu este goală) sub noul nume, sau
+* nu bifați căsuța de mai jos.
+
+În oricare din cazurile de mai sus va trebui să redenumiți sau să unificați
+manual paginile de discuții, dacă doriți acest lucru.",
 'movearticle' => 'Pagina de redenumit:',
 'moveuserpage-warning' => "'''Atenție''': sunteți pe cale să redenumiți o pagină de utilizator. Vă rugăm să rețineți că singura redenumită va fi pagina, nu și utilizatorul.",
-'movenologin' => 'Nu ești autentificat',
-'movenologintext' => 'Trebuie să fii un utilizator înregistrat și să te [[Special:UserLogin|autentifici]] pentru a muta o pagină.',
-'movenotallowed' => 'Nu ai permisiunea să muți pagini.',
-'movenotallowedfile' => 'Nu ai permisiunea de a muta fișiere.',
-'cant-move-user-page' => 'Nu ai permisiunea de a muta paginile utilizatorului (în afară de subpagini).',
-'cant-move-to-user-page' => 'Nu aveți permisiunea de a muta o pagină în pagina utilizatorului (cu excepția subpaginii utilizatorului).',
+'movenologin' => 'Nu sunteți autentificat{{GENDER:||ă}}.',
+'movenologintext' => 'Trebuie să fiți un utilizator înregistrat și [[Special:UserLogin|autentificat]] pentru a redenumi o pagină.',
+'movenotallowed' => 'Nu aveți permisiunea de a redenumi pagini.',
+'movenotallowedfile' => 'Nu aveți permisiunea de a redenumi fișiere.',
+'cant-move-user-page' => 'Nu aveți permisiunea de a redenumi pagini de utilizator (cu excepția subpaginilor).',
+'cant-move-to-user-page' => 'Nu aveți permisiunea de a redenumi o pagină într-o pagină de utilizator (cu excepția subpaginii utilizatorului).',
 'newtitle' => 'Titlul nou',
 'move-watch' => 'Urmărește această pagină',
-'movepagebtn' => 'Mută pagina',
-'pagemovedsub' => 'Pagina a fost mutată',
-'movepage-moved' => "'''Pagina „$1” a fost mutată la „$2”'''",
+'movepagebtn' => 'Redenumește pagina',
+'pagemovedsub' => 'Pagina a fost redenumită',
+'movepage-moved' => "'''Pagina „$1” a fost redenumită în „$2”'''",
 'movepage-moved-redirect' => 'O redirecționare a fost creată.',
 'movepage-moved-noredirect' => 'Crearea redirecționărilor a fost suprimată.',
 'articleexists' => 'O pagină cu același nume există deja, sau numele pe care l-ați ales este invalid. Sunteți rugat să alegeți un alt nume.',
-'cantmove-titleprotected' => 'Nu puteți muta o pagină la această locație, pentru că noul titlu a fost protejat la creare',
-'talkexists' => "'''Pagina în sine a fost mutată cu succes, dar pagina de discuții nu a putut fi mutată deoarece o alta deja există la noul titlu.
-Te rugăm să le unifici manual.'''",
-'movedto' => 'mutată la',
+'cantmove-titleprotected' => 'Nu puteți redenumi o pagină cu acest nume, pentru că noul titlu a fost protejat la creare.',
+'talkexists' => "'''Pagina în sine a fost redenumită cu succes, dar pagina de discuții nu a putut fi redenumită deoarece o alta deja există la noul titlu.
+Vă rugăm să le unificați manual.'''",
+'movedto' => 'redenumită în',
 'movetalk' => 'Redenumește pagina de discuții asociată',
-'move-subpages' => 'Mută subpaginile (până la $1)',
-'move-talk-subpages' => 'Mută subpaginile paginii de discuții (până la $1)',
+'move-subpages' => 'Redenumește subpaginile (până la $1)',
+'move-talk-subpages' => 'Redenumește subpaginile paginii de discuții (până la $1)',
 'movepage-page-exists' => 'Pagina $1 există deja și nu poate fi rescrisă automat.',
-'movepage-page-moved' => 'Pagina $1 a fost mutată la $2.',
-'movepage-page-unmoved' => 'Pagina $1 nu a putut fi mutată la $2.',
-'movepage-max-pages' => 'Maxim $1 {{PLURAL:$1|pagină a fost mutată|pagini au fost mutate}}, nicio altă pagină nu va mai fi mutată automat.',
-'movelogpage' => 'Jurnal mutări',
-'movelogpagetext' => 'Mai jos se află o listă cu paginile mutate.',
+'movepage-page-moved' => 'Pagina $1 a fost redenumită în $2.',
+'movepage-page-unmoved' => 'Pagina $1 nu a putut fi redenumită în $2.',
+'movepage-max-pages' => 'Maximul de $1 {{PLURAL:$1|pagină redenumită|pagini redenumite|de pagini redenumite}} a fost atins și nici o altă pagină nu va mai fi redenumită automat.',
+'movelogpage' => 'Jurnal redenumiri',
+'movelogpagetext' => 'Mai jos se află o listă cu paginile redenumite.',
 'movesubpage' => '{{PLURAL:$1|Subpagină|Subpagini}}',
 'movesubpagetext' => 'Această pagină are $1 {{PLURAL:$1|subpagină afișată|subpagini afișate}} mai jos.',
 'movenosubpage' => 'Această pagină nu are subpagini.',
@@ -2800,12 +2837,12 @@ Te rugăm să le unifici manual.'''",
 Pagina destinație „[[:$1]]” există deja. Doriți să o ștergeți pentru a face loc redenumirii?',
 'delete_and_move_confirm' => 'Da, șterge pagina.',
 'delete_and_move_reason' => 'Șters pentru a face loc redenumirii paginii „[[$1]]”',
-'selfmove' => 'Titlurile sursei și ale destinației sunt aceleași; nu puteți muta o pagină peste ea însăși.',
+'selfmove' => 'Titlul sursei și al destinației este aceleași; nu puteți redenumi o pagină peste ea însăși.',
 'immobile-source-namespace' => 'Nu se pot redenumi paginile din spațiul de nume „$1”',
 'immobile-target-namespace' => 'Nu se pot redenumi paginile în spațiul de nume „$1”',
 'immobile-target-namespace-iw' => 'Legătura interwiki nu este o țintă validă pentru redenumire.',
-'immobile-source-page' => 'Această pagină nu poate fi mutată.',
-'immobile-target-page' => 'Nu poate fi mutat la destinația cu acest titlu.',
+'immobile-source-page' => 'Această pagină nu poate fi redenumită.',
+'immobile-target-page' => 'Imposibil de redenumit pagina la acel titlu.',
 'imagenocrossnamespace' => 'Fișierul nu poate fi mutat la un spațiu de nume care nu este destinat fișierelor',
 'nonfile-cannot-move-to-file' => 'Entitatea (care nu este un fișier) nu poate fi mutată în spațiul de nume destinat fișierelor',
 'imagetypemismatch' => 'Extensia nouă a fișierului nu se potrivește cu tipul acestuia',
@@ -2882,6 +2919,7 @@ Vă rugăm să vizitați [//www.mediawiki.org/wiki/Localisation MediaWiki Locali
 'import-interwiki-templates' => 'Includeți toate formatele',
 'import-interwiki-submit' => 'Importă',
 'import-interwiki-namespace' => 'Transferă către spațiul de nume:',
+'import-interwiki-rootpage' => 'Pagina rădăcină de destinație (opțional):',
 'import-upload-filename' => 'Nume fișier:',
 'import-comment' => 'Comentariu:',
 'importtext' => 'Vă rugăm să exportați fișierul din wikiul sursă folosind [[Special:Export|utilitarul de exportare]].
@@ -2917,6 +2955,9 @@ Un dosar temporar lipsește.',
 'import-error-interwiki' => 'Pagina „$1” nu poate fi importată deoarece numele acesteia este rezervat pentru legături externe (interwiki).',
 'import-error-special' => 'Pagina „$1” nu poate fi importată deoarece aparține unui spațiu de nume special care nu admite pagini.',
 'import-error-invalid' => 'Pagina „$1” nu poate fi importată deoarece numele acesteia este invalid.',
+'import-options-wrong' => '{{PLURAL:$2|Opțiune eronată|Opțiuni eronate}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Pagina rădăcină furnizată este un titlu nevalid.',
+'import-rootpage-nosubpage' => 'Spațiul de nume „$1” al paginii rădăcină nu permite subpagini.',
 
 # Import log
 'importlogpage' => 'Log import',
@@ -2991,9 +3032,9 @@ Un dosar temporar lipsește.',
 'tooltip-ca-nstab-template' => 'Vezi formatul',
 'tooltip-ca-nstab-help' => 'Vezi pagina de ajutor',
 'tooltip-ca-nstab-category' => 'Vezi categoria',
-'tooltip-minoredit' => 'Marcați această modificare ca fiind minoră',
+'tooltip-minoredit' => 'Marchează această modificare ca fiind minoră',
 'tooltip-save' => 'Salvați modificările dumneavoastră',
-'tooltip-preview' => 'Previzualizarea modificărilor dvs., folosiți-o vă rugăm înainte de a salva!',
+'tooltip-preview' => 'Vă rugăm să vă previzualizați modificările înainte de a le salva!',
 'tooltip-diff' => 'Arată-mi modificările efectuate asupra textului',
 'tooltip-compareselectedversions' => 'Vezi diferențele între cele două versiuni selectate de pe această pagină.',
 'tooltip-watch' => 'Adaugă această pagină la lista mea de pagini urmărite',
@@ -3046,16 +3087,34 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 
 # Info page
 'pageinfo-title' => 'Informații pentru „$1”',
-'pageinfo-header-edits' => 'Modificări',
-'pageinfo-header-watchlist' => 'Listă de urmărire',
-'pageinfo-header-views' => 'Vizualizări',
-'pageinfo-subjectpage' => 'Pagină',
-'pageinfo-talkpage' => 'Pagină de discuții',
-'pageinfo-watchers' => 'Număr de utilizatori care urmăresc pagina',
-'pageinfo-edits' => 'Număr de modificări',
-'pageinfo-authors' => 'Număr de autori distincți',
+'pageinfo-header-basic' => 'Informații de bază',
+'pageinfo-header-edits' => 'Istoric modificări',
+'pageinfo-header-restrictions' => 'Protecție pagină',
+'pageinfo-header-properties' => 'Proprietăți pagină',
+'pageinfo-display-title' => 'Titlu afișat',
+'pageinfo-default-sort' => 'Cheie de sortare implicită',
+'pageinfo-length' => 'Lungimea paginii (în octeți)',
+'pageinfo-article-id' => 'ID pagină',
+'pageinfo-robot-policy' => 'Statut pentru motorul de căutare',
+'pageinfo-robot-index' => 'Indexabilă',
+'pageinfo-robot-noindex' => 'Neindexabilă',
 'pageinfo-views' => 'Număr de vizualizări',
-'pageinfo-viewsperedit' => 'Vizualizări per modificare',
+'pageinfo-watchers' => 'Număr de utilizatori care urmăresc pagina',
+'pageinfo-redirects-name' => 'Redirecționări către această pagină',
+'pageinfo-subpages-name' => 'Subpagini ale acestei pagini',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecționare|redirecționări|de redirecționări}}; $3 {{PLURAL:$3|non-redirecționare|non-redirecționări|de non-redirecționări}})',
+'pageinfo-firstuser' => 'Creatorul paginii',
+'pageinfo-firsttime' => 'Data creării paginii',
+'pageinfo-lastuser' => 'Cel mai recent editor',
+'pageinfo-lasttime' => 'Data ultimei modificări',
+'pageinfo-edits' => 'Număr total de modificări',
+'pageinfo-authors' => 'Număr total de autori distincți',
+'pageinfo-recent-edits' => 'Număr de modificări recente (în ultima perioadă de $1)',
+'pageinfo-recent-authors' => 'Număr de autori distincți recenți',
+'pageinfo-restriction' => 'Protecție pagină (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Cuvânt magic|Cuvinte magice}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorie ascunsă|Categorii ascunse}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Format inclus|Formate incluse}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Clasic',
@@ -3110,7 +3169,8 @@ Executându-l, sistemul dvs. poate fi compromis.",
 'file-info-size' => '$1 × $2 pixeli, mărime fișier: $3, tip MIME: $4',
 'file-info-size-pages' => '$1 × $2 pixeli, mărime fișier: $3, tip MIME: $4, $5 {{PLURAL:$5|pagină|pagini}}',
 'file-nohires' => 'Rezoluții mai mari nu sunt disponibile.',
-'svg-long-desc' => 'fișier SVG, cu dimensiunea nominală de $1 × $2 pixeli, mărime fișier: $3',
+'svg-long-desc' => 'Fișier SVG, cu dimensiunea nominală de $1 × $2 pixeli, mărime fișier: $3',
+'svg-long-desc-animated' => 'Fișier SVG animat, cu dimensiunea nominală de $1 × $2 pixeli, mărime fișier: $3',
 'show-big-image' => 'Rezoluție maximă',
 'show-big-image-preview' => 'Mărimea acestei previzualizări: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Altă rezoluție|Alte rezoluții}}: $1.',
@@ -3120,6 +3180,8 @@ Executându-l, sistemul dvs. poate fi compromis.",
 'file-info-png-looped' => 'în buclă',
 'file-info-png-repeat' => 'redat {{PLURAL:$1|o dată|de $1 ori}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|cadru|cadre}}',
+'file-no-thumb-animation' => "'''Notă: Din cauza unor limitări de ordin tehnic, miniaturile acestui fișier nu vor fi animate.'''",
+'file-no-thumb-animation-gif' => "'''Notă: Din cauza unor limitări de ordin tehnic, miniaturile fișierelor GIF de înaltă rezoluție, precum acesta, nu vor fi animate.'''",
 
 # Special:NewFiles
 'newimages' => 'Galeria de imagini noi',
@@ -3666,7 +3728,7 @@ Vă rugăm să confirmați faptul că într-adevăr doriți să recreați acest
 'table_pager_prev' => 'Pagina anterioară',
 'table_pager_first' => 'Prima pagină',
 'table_pager_last' => 'Ultima pagină',
-'table_pager_limit' => 'Arată $1 itemi pe pagină',
+'table_pager_limit' => 'Arată $1 elemente pe pagină',
 'table_pager_limit_label' => 'Elemente pe pagină:',
 'table_pager_limit_submit' => 'Du-te',
 'table_pager_empty' => 'Niciun rezultat',
@@ -3779,7 +3841,7 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 * <span class="mw-specialpagecached">Pagini speciale aflate doar în memoria cache (pot fi neactualizate).</span>',
 'specialpages-group-maintenance' => 'Întreținere',
 'specialpages-group-other' => 'Alte pagini speciale',
-'specialpages-group-login' => 'Autentificare / Înregistrare',
+'specialpages-group-login' => 'Autentificare / creare cont',
 'specialpages-group-changes' => 'Schimbări recente și jurnale',
 'specialpages-group-media' => 'Fișiere',
 'specialpages-group-users' => 'Utilizatori și permisiuni',
@@ -3887,8 +3949,8 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'newuserlog-byemail' => 'parola trimisă prin e-mail',
 
 # Feedback
-'feedback-bugornote' => 'Dacă sunteți pregătit să descrieți o problemă tehnică în detaliu vă rugăm să [ $1 raportați un bug].
-În caz contrar, puteți utiliza formularul de mai jos. Comentariul dumneavoastră va fi adăugat pe pagina „[ $3  $2 ]”, împreună cu numele de utilizator și numele navigatorului pe care îl folosiți.',
+'feedback-bugornote' => 'Dacă sunteți pregătit să descrieți o problemă tehnică în detaliu vă rugăm să [$1 raportați un bug].
+În caz contrar, puteți utiliza formularul de mai jos. Comentariul dumneavoastră va fi adăugat pe pagina „[$3 $2]”, împreună cu numele de utilizator și numele navigatorului pe care îl folosiți.',
 'feedback-subject' => 'Subiect:',
 'feedback-message' => 'Mesaj:',
 'feedback-cancel' => 'Revocare',
@@ -3913,9 +3975,12 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'api-error-empty-file' => 'Fișierul încărcat de dumneavoastră este gol.',
 'api-error-emptypage' => 'Crearea paginilor noi, goale nu este permisă.',
 'api-error-fetchfileerror' => 'Eroare internă: ceva nu a funcționat corect la prelucrarea fișierului.',
+'api-error-fileexists-forbidden' => 'Un fișier cu numele „$1” există deja și nu poate fi suprascris.',
+'api-error-fileexists-shared-forbidden' => 'Un fișier cu numele „$1” există deja în depozitul de fișiere partajate, și nu poate fi suprascris.',
 'api-error-file-too-large' => 'Fișierul pe care l-ați trimis este prea mare.',
 'api-error-filename-tooshort' => 'Numele fișierului este prea scurt.',
 'api-error-filetype-banned' => 'Acest tip de fișiere este interzis.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|este un tip de fișier nepermis|sunt tipuri de fișier nepermise}}. {{PLURAL:$3|Tip de fișier permis este|Tipuri de fișier permise sunt}} $2.',
 'api-error-filetype-missing' => 'Fișierului îi lipsește extensia.',
 'api-error-hookaborted' => 'Modificarea pe care ați încercat să o faceți a fost oprită de sesizarea unei extensii.',
 'api-error-http' => 'Eroare internă: nu s-a reușit conectarea la server.',
index 47048cc..466631f 100644 (file)
@@ -30,7 +30,7 @@ $messages = array(
 'tog-hidepatrolled' => "Scunne le cangiaminde condrollete jndr'à le cangiaminde recende",
 'tog-newpageshidepatrolled' => "Scunne le pàggene tenute sotte condrolle da 'a liste de le pàggene nuève",
 'tog-extendwatchlist' => "Spanne 'a liste de le pàggene condrollete pe fa vedè tutte le cangiaminde fatte, none sulamende l'urteme",
-'tog-usenewrc' => "Ause le cangiaminde recende migliorate (richiede 'u JavaScript)",
+'tog-usenewrc' => "Ause le cangiaminde recende migliorate (vole 'u JavaScript)",
 'tog-numberheadings' => 'Testete auto-numerete',
 'tog-showtoolbar' => "Fà vedè 'a barra de le cangiaminde (JavaScript)",
 'tog-editondblclick' => "Cange le pàggene cu 'nu doppie clic (JavaScript)",
@@ -38,17 +38,17 @@ $messages = array(
 'tog-editsectiononrightclick' => "Abilite le cngiaminde d'a sezione ausanne 'u pulsande destre d'u mouse cazzanne sus a 'u titele (Javascript)",
 'tog-showtoc' => "Fa vedè 'a taggelle de le condenute (pe le pàggene cu cchiù de 3 testete)",
 'tog-rememberpassword' => "Arrencuerdete 'u nome mije sus a stu browser (pe 'nu massime de $1 {{PLURAL:$1|sciurne|sciurne}})",
-'tog-watchcreations' => "Mitte le pàggene ca je agghje ccrejete jndr'à le pàggene condrollete",
-'tog-watchdefault' => "Mitte le pàggene ca je agghje cangete jndr'à le pàggene condrolleteAdd pages I edit to my watchlist",
-'tog-watchmoves' => "Mitte le pàggene ca je agghje spustete jndr'à le pàggene condrollete",
-'tog-watchdeletion' => "Mitte le pàggene ca je agghje scangillete jndr'à le pàggene condrollete",
+'tog-watchcreations' => "Mitte le pàggene ca je agghie ccrejate jndr'à le pàggene condrollate",
+'tog-watchdefault' => "Mitte le pàggene ca je agghie cangiate jndr'à le pàggene condrollate",
+'tog-watchmoves' => "!Mitte le pàggene ca je agghie spustate jndr'à le pàggene condrollate",
+'tog-watchdeletion' => "Mitte le pàggene ca je agghie scangellate jndr'à le pàggene condrollate",
 'tog-minordefault' => 'Pe convenzione signe tutte le cangiaminde cumme a stuédeche',
 'tog-previewontop' => "Fa vedè l'andeprime apprime de 'a scatole de le cangiaminde",
 'tog-previewonfirst' => "Fà vedè l'andeprime sus a 'u prime cangiaminde",
 'tog-nocache' => "Disabbilete 'u caching d'a pàgene sfogliate",
-'tog-enotifwatchlistpages' => "Manneme 'na mail quanne 'a pàgene ca stoche a condrolle ha cangete",
+'tog-enotifwatchlistpages' => "Manneme 'na mail quanne 'a pàgene ca stoche a condrolle ha cangiate",
 'tog-enotifusertalkpages' => "Manneme 'na mail quanne 'a pàgene de le 'ngazzaminde ha cangete",
-'tog-enotifminoredits' => "Manneme 'na mail quanne onne state fatte cangiaminde stuèdeche sus 'a pàgene",
+'tog-enotifminoredits' => "Manneme 'na mail quanne onne state fatte cangiaminde stuèdeche sus a le pàggene",
 'tog-enotifrevealaddr' => "Fa vedè l'indirizze e-mail jndr'à le e-mail de notifiche",
 'tog-shownumberswatching' => "Fa vedè 'u numere de le utinde ca uardene",
 'tog-oldsig' => 'Firme esistende:',
@@ -66,7 +66,6 @@ $messages = array(
 'tog-watchlisthideliu' => "Scunne le cangiaminde de l'utinde canusciute da 'a liste de le pàgene condrollete",
 'tog-watchlisthideanons' => "Scunne le cangiaminde de l'utinde scanusciute da 'a liste de le pàgene condrollete",
 'tog-watchlisthidepatrolled' => "Scunne le cangiaminde condrollete jndr'à liste de le pàggene condrollete",
-'tog-nolangconversion' => 'Disabbilete le variande de conversione',
 'tog-ccmeonemails' => "Manneme 'na copie de le mail ca je manne a l'ôtre utinde",
 'tog-diffonly' => 'No fà vedè le pàggene cu le condenute sotte a le differenze',
 'tog-showhiddencats' => 'Fa vedè le categorije scunnute',
@@ -154,6 +153,7 @@ $messages = array(
 'index-category' => 'Pàggene indicizzate',
 'noindex-category' => 'Pàggene none indicizzate',
 'broken-file-category' => 'Pàggene cu collegaminde a le file scuasciate',
+'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
@@ -296,6 +296,10 @@ Vide [[Special:Version|Versione d'a pàgene]].",
 'youhavenewmessages' => 'Tu tine $1 ($2).',
 'newmessageslink' => 'messàgge nuève',
 'newmessagesdifflink' => 'urteme cangiaminde',
+'youhavenewmessagesfromusers' => "Tu è $1 da {{PLURAL:$3|'n'otre utende|$3 utinde}} ($2).",
+'youhavenewmessagesmanyusers' => 'Tu è $1 da assaije utinde ($2).',
+'newmessageslinkplural' => "{{PLURAL:$1|'nu messàgge nuève|messàgge nuève}}",
+'newmessagesdifflinkplural' => 'urteme {{PLURAL:$1|cangiamende|cangiaminde}}',
 'youhavenewmessagesmulti' => "T'onne arrevete mèssagge nueve sus 'a $1",
 'editsection' => 'cange',
 'editsection-brackets' => '[$1]',
@@ -353,9 +357,9 @@ Pe 'na liste de le pàggene speciele cirche aqquà [[Special:SpecialPages|{{int:
 'dberrortext' => "Ha assute n'errore de sindassi de 'na inderrogazione sus a 'u database.
 Quiste pò indicà 'nu bochere jndr'à 'u software.
 L'urteme tendative de inderrogazione sus a 'u database ha state:
-<blockquote><tt>\$1</tt></blockquote>
-cu 'a funzione \"<tt>\$2</tt>\".
-'U database ha returnate l'errore \"<tt>\$3: \$4</tt>\".",
+<blockquote><code>\$1</code></blockquote>
+cu 'a funzione \"<code>\$2</code>\".
+'U database ha returnate l'errore \"<samp>\$3: \$4</samp>\".",
 'dberrortextcl' => 'A assute \'n\'errore de sindasse sus a \'n\'inderrogazione d\'u database.
 L\'urteme tendative de inderrogazione sus a \'u database ha state:
 "$1"
@@ -392,6 +396,8 @@ Pe piacere manne 'na comunicazzione a 'n'[[Special:ListUsers/sysop|amministrator
 'cannotdelete' => '\'A pàgene o \'u file "$1" non ge pò essere scangellate.
 Pò essere ca ggià ha state scangellete da quacche otre.',
 'cannotdelete-title' => 'Non ge puè scangellà \'a pàgene "$1"',
+'delete-hook-aborted' => "Cangiamende annullete da  'nu ''hook''.
+Non g'à date nisciune mutive.",
 'badtitle' => 'Titele sbagliete',
 'badtitletext' => "'A pàgene ca è cerchete tène 'nu titele errete, vacande, o jè 'nu collegamende inter-lènghe o inter-uicchi errete.
 Pò essere ca tène une o cchiù carattere ca non ge ponne essere ausete jndr'à le titele.",
@@ -423,6 +429,13 @@ $2',
 'ns-specialprotected' => 'Le pàgene speciale no ponne essere cangete.',
 'titleprotected' => "Stu titele ha state prutette da 'a ccreazione da [[User:$1|$1]].
 'U mutive jè ''$2''.",
+'filereadonlyerror' => 'Non ge pozze cangià \'u file "$1" purcé l\'archivije de le file "$2" ste in mode sola letture.
+
+L\'amministratore ca l\'ha bloccate dèje sta spiegazione: "$3".',
+'invalidtitle-knownnamespace' => 'Titole invalide cu \'u namespace "$2" e teste "$3"',
+'invalidtitle-unknownnamespace' => 'Titele invalide cu numere de namespace scanusciute $1 e teste "$2"',
+'exception-nologin' => 'Non ge sì collegate',
+'exception-nologin-text' => "Sta pàgene o azione richiede ca a trasè jndr'à sta uicchi.",
 
 # Virus scanner
 'virus-badscanner' => "Configurazione ca fece schife: Virus scanner scanusciute: ''$1''",
@@ -443,6 +456,7 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
 'remembermypassword' => "Arrencuerdete 'u nome mije sus a stu combiuter (pe 'nu massime de $1 {{PLURAL:$1|sciurne|sciurne}})",
 'securelogin-stick-https' => "Statte collegate ô HTTPS apprisse 'a trasute",
 'yourdomainname' => "'U nome d'u dominie tue:",
+'password-change-forbidden' => 'Non ge puè cangià le passuord sus a sta uicchi.',
 'externaldberror' => "Vide bbuene, o stè 'n'errore de autendicazione a 'u database oppure tu non ge puè aggiorna 'u cunde tue esterne.",
 'login' => 'Tràse',
 'nav-login-createaccount' => 'Tràse / Reggistrete',
@@ -699,17 +713,20 @@ Tu puè [[Special:Search/{{PAGENAME}}|cercà pe quiste titele]] jndr\'à otre p
 'noarticletext-nopermission' => "Pe mò non ge stè teste jndr'à sta pàgene.
 Tu puè [[Special:Search/{{PAGENAME}}|cercà pe stu titele]]  jndr'à otre pàggene,
 o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche jndr'à l'archivije cullegate]</span>.",
+'missing-revision' => "'A revisione #\$1 d'a pàgene chiamate \"{{PAGENAME}}\" non g'esiste.
+
+Quiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.
+Le dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivije de le scangellaziune].",
 'userpage-userdoesnotexist' => '\'U cunde utende "<nowiki>$1</nowiki>" non g\'è reggistrete.
 Pe piacere, condrolle ce tu vuè cu ccreje/cange sta pàgene.',
 'userpage-userdoesnotexist-view' => '\'U cunde utende "$1" non g\'è reggistrate.',
 'blocked-notice-logextract' => "Stu utende jè correndemende bloccate.<br />
 L'urteme archivije de le bloccaminde se iacche aqquà sotte pe referimende:",
-'clearyourcache' => "''Vide Bbuene - Apprisse 'a reggistrazione, tu puè zumbà 'a cache d'u browser tune pe vedè le cangiaminde.'''
-*'''Mozilla / Firefox / Safari:''' cazze 'u ''Shift'' e condemboraneamende cazze 'u buttone ''Aggiorna'', o cazze 'nzieme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sus a 'nu Mac);
+'clearyourcache' => "'''Vide Bbuene''' - Apprisse 'a reggistrazione, tu puè zumbà 'a cache d'u browser tune pe vedè le cangiaminde.
+*'''Firefox / Safari:''' cazze 'u ''Shift'' e condemboraneamende cazze 'u buttone ''Aggiorna'', o cazze 'nzieme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sus a 'nu Mac);
 *'''Google Chrome:''' cazze ''Ctrl-Shift-R'' (''⌘-Shift-R'' sus a 'nu Mac)
 *'''Internet Explorer:''' cazze ''Ctrl'' e condemboraneamende cazze ''Aggiorna,'' o cazze ''Ctrl-F5''.
-*'''Konqueror: '''cazze ''Aggiorna'' o cazze ''F5'';
-*'''Opera:''' pulizze 'a cache da ''Tools → Preferences'' (in inglese) (Struminde - Preferenze in tagliàne);",
+*'''Opera:''' pulizze 'a cache da ''Tools → Preferences'' (in inglese) (Struminde - Preferenze in tarandine);",
 'usercssyoucanpreview' => "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u CSS nuève apprime de reggistrà.",
 'userjsyoucanpreview' => "'''Conziglie:''' Ause 'u buttone \"{{int:showpreview}}\" pe condrollà 'u JavaScript nuève apprime de reggistrà.",
 'usercsspreview' => "'''Arrecuerdete ca tu ste vide sulamende in andeprime 'u CSS tue.'''
@@ -830,6 +847,9 @@ Ste argumende onne state luete.",
 'node-count-exceeded-warning' => "Pagene ha sbunnate 'u condegge de le node",
 'expansion-depth-exceeded-category' => "Pàggene addò 'a profonnetà de l'espanzione jè supranate",
 'expansion-depth-exceeded-warning' => "Pàggene ca sbonnane 'a profonnetà de espanzione",
+'parser-unstrip-loop-warning' => 'Cicle infinite acchiate',
+'parser-unstrip-recursion-limit' => 'Limite de ricorsione infinite sbunnate ($1)',
+'converter-manual-rule-error' => "Errore assute jndr'à le regole de conversione d'a lènghe manuale",
 
 # "Undo" feature
 'undo-success' => "'U cangiamende pò essere annullate.
@@ -1001,6 +1021,7 @@ Vide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzera
 'mergehistory-comment' => "Squagghiete [[:$1]] jndr'à [[:$2]]: $3",
 'mergehistory-same-destination' => 'Le pàggene sorgende e de destinazione non ge ponne essere le stesse',
 'mergehistory-reason' => 'Mutive:',
+'mergehistory-revisionrow' => '$1 ($2) $3 . . $4 $5 $6',
 
 # Merge log
 'mergelog' => 'Archivije de le scuagghiaminde',
@@ -1019,6 +1040,10 @@ Vide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzera
 'editundo' => 'annulle',
 'diff-multi' => "({{PLURAL:$1|'na versione de mmienze|$1 cchiù versiune de mmienze}} de {{PLURAL:$2|'n'utende|$2 utinde}} non ge se vèdene)",
 'diff-multi-manyusers' => "({{PLURAL:$1|'Na revisione de 'mmienze|$1 revisiune de 'mmienze}} non g'è viste da cchiù de $2 {{PLURAL:$2|utende|utinde}})",
+'difference-missing-revision' => "{{PLURAL:$2|'Na revisione|$2 revisiune}} de sta differenze ($1) {{PLURAL:$2|non g'onne|non g'onne}} state acchiate.
+
+Quiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.
+Le dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivije de le scangellaziune].",
 
 # Search results
 'searchresults' => "Resultete d'a ricerche",
@@ -1292,6 +1317,7 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'right-writeapi' => 'Ause de le API scritte',
 'right-delete' => 'Scangille le pàggene',
 'right-bigdelete' => "Scangille le pàggene cu 'na storia longa longa",
+'right-deletelogentry' => "Scangille e ripristine vôsce specifiche de l'archivije",
 'right-deleterevision' => 'Scangille o repristine le revisiune specifiche de le pàggene',
 'right-deletedhistory' => "Vide le versiune, d'u cunde, scangellate, senza 'u teste lore associate",
 'right-deletedtext' => "Vide 'u teste scangellate e le cangiaminde 'mbrà le versiune scangellate",
@@ -1438,9 +1464,9 @@ L'archivije de de scangellaminde e de le spustaminde pe sta pàgene le puè acch
 Pe vedè o cercà le file carecate precedendemende veje a 'a [[Special:FileList|liste de le file carecate]], le carecaminde sonde pure reggistrate jndr'à l'[[Special:Log/upload|archivije de le carecaminde]], le scangellazziune jndr'à l'[[Special:Log/delete|archivije de le scangellaminde]].
 
 Pe ingludere 'nu file jndr'à 'na pàgene, ause 'u collegamende jndr'à une de le forme seguende:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' pe ausà 'a versiona comblete d'u file
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' pe ausà 'nu file cu 'a dimenziona massime de 200 pixel jndr'à 'na scatele ca se iacchie sus a 'u margine sinistre cu 'u teste 'alt text' cumme didascalìe.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' pe appundà direttamende a 'u file senze ca face vedè 'u file",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' pe ausà 'a versiona comblete d'u file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' pe ausà 'nu file cu 'a dimenziona massime de 200 pixel jndr'à 'na scatele ca se iacchie sus a 'u margine sinistre cu 'u teste 'alt text' cumme didascalìe.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pe appundà direttamende a 'u file senze ca face vedè 'u file",
 'upload-permitted' => 'Tipe de file permesse: $1.',
 'upload-preferred' => 'Tipe de file preferite: $1.',
 'upload-prohibited' => 'Tipe de file proibbite: $1.',
@@ -1488,20 +1514,20 @@ Stu file jè $2.",
 Pò essere ca è scritte male 'u nome d'u file e n'à carecate 'n'otre.
 Pe piacere condrolle ce tu avveramende vuè cu careche stu file.",
 'windows-nonascii-filename' => 'Sta Uicchi non ge supporte le nome de le file cu le carattere speciale.',
-'fileexists' => "'Nu file cu stu nome esiste già, pe piacere verifiche '''<tt>[[:$1]]</tt>''' ce tu non ge sì secure no 'u sce cangianne.
+'fileexists' => "'Nu file cu stu nome esiste già, pe piacere verifiche <strong>[[:$1]]</strong> ce tu non ge sì secure no 'u sce cangianne.
 [[$1|thumb]]",
-'filepageexists' => "'A pàgene de descrizione pe stu file ha state già ccreiate 'u '''<tt>[[:$1]]</tt>''', ma nisciune file cu stu nome osce a die esiste.
+'filepageexists' => "'A pàgene de descrizione pe stu file ha state già ccreiate 'u <strong>[[:$1]]</strong>, ma nisciune file cu stu nome osce a die esiste.
 'U riepileghe ca tu è mise non ge iesse sus 'a pàgene de descrizione.
 Pe fà assè 'u riepileghe tu tìne abbesogne de cangiarle a mane.
 [[$1|thumb]]",
 'fileexists-extension' => "'Nu file cu 'nu nome simile esiste già: [[$2|thumb]]
-* Nome d'u file ca vuè cu careche: '''<tt>[[:$1]]</tt>'''
-* Nome d'u file ca già esiste: '''<tt>[[:$2]]</tt>'''
+* Nome d'u file ca vuè cu careche: <strong>[[:$1]]</strong>
+* Nome d'u file ca già esiste: <strong>[[:$2]]</strong>
 Pe piacere vide ce scacchie 'nu nome differende.",
 'fileexists-thumbnail-yes' => "'U file pare ca jè 'n'immaggine de dimenzione ridotte ''(miniature)''. [[$1|thumb]]
-Pe piacere condrolle 'u file '''<tt>[[:$1]]</tt>'''.
+Pe piacere condrolle 'u file <strong>[[:$1]]</strong>.
 Ce 'u file condrollete jè d'a stesse dimenzione de quedda originale allore non ge stè abbesogne de carecà 'na miniatura de cchiù.",
-'file-thumbnail-no' => "'U nome d'u file accumenze pe '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "'U nome d'u file accumenze pe <strong>$1</strong>.
 Pare ca jè 'n'immaggine piccenne ''(miniature)''.
 Ce tu tìne sulamende st'immaggine da carecà apposte, ce nò vide ce cange 'u file.",
 'fileexists-forbidden' => "'U file cu stu nome già esiste e non ge pò essere sovrascritte.<br />
@@ -1592,11 +1618,18 @@ Ce 'u probbleme angore jè presende, condatte 'n'[[Special:ListUsers/sysop|ammin
 'backend-fail-closetemp' => 'Non ge pozze achiudere file temboranèe.',
 'backend-fail-read' => "Non ge pozze leggere 'u file $1.",
 'backend-fail-create' => "Non ge pozze scrivere 'u file $1.",
+'backend-fail-maxsize' => 'Non ge pozze scrivere \'u file "$1" purcé jè cchiù granne de {{PLURAL:$2|\'nu byte|$2 byte}}',
 'backend-fail-readonly' => 'L\'archivije de rete "$1" jè pe stu mumende in sole letture. \'U mutive ha state: "$2"',
 'backend-fail-synced' => "'U file \"\$1\" jè jndr'à 'nu state ingonsistende jndr'à l'archivije inderne",
 'backend-fail-connect' => 'Non ge pozze connettere \'a memorie de rrete "$1".',
 'backend-fail-internal' => "'N'errore scanusciute s'à verificate jndr'à l'archivije de rrete \"\$1\".",
 'backend-fail-contenttype' => 'Non ge pozze capìe \'u tipe de condenute d\'u file da reggistrà sus a "$1".',
+'backend-fail-batchsize' => "L'archivije de rrete ha date 'nu processe de $1 {{PLURAL:$1|operazione|operaziune}} sus a le file; 'u limite jè $2 {{PLURAL:$2|operazione|operaziune}}.",
+'backend-fail-usable' => 'Non ge pozze scrivere \'u file "$1" purcé mangane le permesse sufficiende o non g\'esiste \'a cartelle/contenitore.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Non ge pozze collegà a l\'archivije d\'u database pe memorizzà \'u rrete "$1".',
+'filejournal-fail-dbquery' => 'Non ge pozze aggiornà l\'archivije d\'u database pe memorizzà \'u rrete "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => 'Non ge pozze sbloccà "$1"; jidde non g\'è bloccate.',
@@ -1607,6 +1640,7 @@ Ce 'u probbleme angore jè presende, condatte 'n'[[Special:ListUsers/sysop|ammin
 'lockmanager-fail-releaselock' => 'Non ge pozze relassà blocche pe "$1".',
 'lockmanager-fail-db-bucket' => "Non ge pozze condattà 'u database purcé stonne troppe blocche jndr'à $1.",
 'lockmanager-fail-db-release' => "Non ge pozze relassà le blocche sus a 'u database $1.",
+'lockmanager-fail-svr-acquire' => "Non ge pozze pigghià le blocche sus a 'u server $1.",
 'lockmanager-fail-svr-release' => "Non ge pozze relassà le blocche sus a 'u server $1.",
 
 # ZipDirectoryReader
@@ -1717,6 +1751,10 @@ Quanne jè filtrate da l'utende, sulamende le file ca quidde utende ave carecate
 Pe piacere vide 'a [$2 pàgene de descrizione d'u file] pe maggiore 'mbormaziune.",
 'sharedupload-desc-here' => "Stu file è da $1 e pò essere ausate pe otre pruggette.<br />
 'A descriziona sus a [$2 pàgene de descrizione d'u file] ste aqquà sotte.",
+'sharedupload-desc-edit' => "Stu file avène da $1 e pò essere ausate da otre pruggette.
+Pò essere ca tu vuè cangià 'a descrizione de jidde [$2 pàgene de descrizione d'u file] aqquà.",
+'sharedupload-desc-create' => "Stu file avène da $1 e pò essere ausate da otre pruggette.
+Pò essere ca tu vuè cangià 'a descrizione de jidde [$2 pàgene de descrizione d'u file] aqquà.",
 'filepage-nofile' => 'Nisciune file cu stu nome esiste.',
 'filepage-nofile-link' => "Nisciune file cu stu nome esiste, ma tu 'u puè [$1 carecà].",
 'uploadnewversion-linktext' => "Careche 'na versiona nove de stu fail",
@@ -1758,7 +1796,7 @@ Pe piacere vide 'a [$2 pàgene de descrizione d'u file] pe maggiore 'mbormaziune
 # MIME search
 'mimesearch' => "Ricerca jndr'à 'u MIME",
 'mimesearch-summary' => "Sta pàgene abbilitesce 'u filtre sus a le file pu tipe de MIME.
-Input: contenttype/subtype, pe esembie <tt>image/jpeg</tt>.",
+Input: contenttype/subtype, pe esembie <code>image/jpeg</code>.",
 'mimetype' => 'Tipe de MIME:',
 'download' => 'scareche',
 
@@ -1807,7 +1845,7 @@ Arrecuèrdete de condrollà pe otre collegaminde a le template apprime de scange
 'disambiguationspage' => 'Template:disambigue',
 'disambiguations-text' => "Le pàggene seguende appondene a 'na '''pàgene de disambiguazione'''.
 'Nvece avessere appondà a 'a temateca appropriate.<br />
-'Na pàgene jè trattate cumme pàgene de disambiguazione ce tu ause 'nu template ca è appundate da [[MediaWiki:Disambiguationspage|Pàggene de disambiguazione]]",
+'Na pàgene jè trattate cumme pàgene de disambiguazione ce tu ause 'nu template ca è appundate da [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Ridirezionaminde a doppie',
 'doubleredirectstext' => "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.
@@ -1833,6 +1871,7 @@ Mò s'avène redirette a [[$2]].",
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categorije|categorije}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interuicchi|interuicchi}}',
 'nlinks' => '$1 {{PLURAL:$1|collegamende|collegaminde}}',
 'nmembers' => '$1 {{PLURAL:$1|membre|membre}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisione|revisiune}}',
@@ -1853,12 +1892,15 @@ Mò s'avène redirette a [[$2]].",
 'wantedpages' => 'Pàggene cchiù cerchete',
 'wantedpages-badtitle' => "Titele invalide in mmienze a l'inzieme de le resultate: $1",
 'wantedfiles' => 'File cchiù cerchete',
+'wantedfiletext-cat' => "Le seguende file onne state ausate ma non g'esistene, Le file de le archivije de fore ponne essere elengate fine ca esistene. Ogne false allarme avène <del>signate</del>. In aggiunde, le pàggene ca tènene ste file ca non g'esistene avène elengate jndr'à [[:$1]]",
+'wantedfiletext-nocat' => "Le file seguende onne state ausate ma non g'esistene. Le file da le archivije esterne ponne stà in liste fine ca esistente. Ogne false allarme avène <del>segnalate</del>.",
 'wantedtemplates' => 'Template cchiù ausete',
 'mostlinked' => 'Pàggene cchiù appundete',
 'mostlinkedcategories' => 'Categorije cchiù appundete',
 'mostlinkedtemplates' => 'Template cchiù appundete',
 'mostcategories' => "Pàggene cu 'nu sacche de categorije",
 'mostimages' => 'Fail cchiù appundete',
+'mostinterwikis' => 'Pàggene cu cchiù interuicchi de tutte',
 'mostrevisions' => 'Pàggene cchiù cangete',
 'prefixindex' => "Tutte le pàggene cu 'u prefisse",
 'prefixindex-namespace' => "Tutte le pàggene cu 'u prefisse ($1 namespace)",
@@ -1913,6 +1955,7 @@ Pe piacere note ca otre site de Indernette ponne appondà a 'nu file cu 'na URL
 Tu puè restringere 'a viste selezionanne 'u tipe de archivije, 'u nome utende (senzibbile a le maiuscole), o le pàggene coinvolte (pure chiste senzibbile a le maiuscole).",
 'logempty' => "Non ge stè 'n'anema de priatorie jndr'à l'archivije.",
 'log-title-wildcard' => 'Cirche le titele ca accumenzene cu stu teste',
+'showhideselectedlogentries' => "Fà vedè/scunne le righe scacchiate de l'archivije",
 
 # Special:AllPages
 'allpages' => 'Tutte le pàggene',
@@ -1959,7 +2002,7 @@ Vide pure [[Special:WantedCategories|Categorije cercate]].",
 'linksearch-ok' => 'Cirche',
 'linksearch-text' => 'Le wildcard cumme a "*.wikipedia.org" ponne essere ausate.<br />
 Onne abbesogne almede de \'nu dominie de levèlle ierte, pe esembie "*.org". <br />
-Protocolle supportate: <tt>$1</tt> (no sce aggiungenne nisciune de chiste jndr\'à recerca toje).',
+Protocolle supportate: <code>$1</code> (no sce aggiungenne nisciune de chiste jndr\'à recerca toje).',
 'linksearch-line' => '$1 jè pundete da $2',
 'linksearch-error' => "Le wildcard ponne essere ausate sulamende a l'inzie de l'hostname.",
 
@@ -1992,8 +2035,8 @@ Ponne stà [[{{MediaWiki:Listgrouprights-helppage}}|'mbormaziune de cchiù]] sus
 'listgrouprights-rights' => 'Diritte',
 'listgrouprights-helppage' => 'Help:Deritte de le gruppe',
 'listgrouprights-members' => '(liste de le membre)',
-'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
-'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
+'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' => 'Puè aggiungere {{PLURAL:$2|gruppe|gruppe}}: $1',
 'listgrouprights-removegroup' => 'Puè scangellà {{PLURAL:$2|gruppe|gruppe}}: $1',
 'listgrouprights-addgroup-all' => 'Puè aggiungere tutte le gruppe',
@@ -2007,6 +2050,8 @@ Ponne stà [[{{MediaWiki:Listgrouprights-helppage}}|'mbormaziune de cchiù]] sus
 'mailnologin' => 'Nisciune indirizze de invie',
 'mailnologintext' => "Tu a essere [[Special:UserLogin|collegate]] e a avè 'n'indirizze email valide jndr'à le [[Special:Preferences|preferenze]] tue pe mannà 'na mail a otre utinde.",
 'emailuser' => "Manne n'email a stu utende",
+'emailuser-title-target' => "Manne n'email a quiste {{GENDER:$1|utende}}",
+'emailuser-title-notarget' => "E-mail de l'utende",
 'emailpage' => "E-mail de l'utende",
 'emailpagetext' => "Tu puè ausà 'a schermate aqquà sotte pe mannà 'n'email a stu utende.
 L'indirizze e-mail ca tu è 'nzerite jndr'à le [[Special:Preferences|preferenze tue]] iesse jndr'à 'u cambe \"Da\" de l'e-mail, accussìa ce riceve 'a mail sape a ce addà responnere.",
@@ -2154,6 +2199,8 @@ và cunge cunge!",
 'rollback' => 'Annulle le cangiaminde',
 'rollback_short' => 'Annulle',
 'rollbacklink' => "annulle 'u cangiaminde",
+'rollbacklinkcount' => 'annulle $1 {{PLURAL:$1|cangiamende|cangiaminde}}',
+'rollbacklinkcount-morethan' => 'annulle cchiù de $1 {{PLURAL:$1|cangiamende|cangiaminde}}',
 'rollbackfailed' => 'Annullamende fallite',
 'cantrollback' => "Non ge se pò annullà stu cangiamende;
 l'urteme condrebbutore jè sulamende l'autore de sta pàgene.",
@@ -2295,6 +2342,7 @@ Pò essere ca già ha state scangellate.",
 $1",
 'undelete-show-file-confirm' => 'Sì secure ca tu vuè ccu vide \'na revisiona scangellate d\'u file "<nowiki>$1</nowiki>" d\'u $2 a le $3?',
 'undelete-show-file-submit' => 'Sine',
+'undelete-revisionrow' => '$1 $2 ($3) $4 . . $5 $6 $7',
 
 # Namespace form on various pages
 'namespace' => 'Namespace:',
@@ -2698,6 +2746,7 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 'import-error-interwiki' => 'Pagene "$1" non g\'ha state \'mbortate purcé \'u nome sue jè riservate pe collegaminde esterne (interuicchi).',
 'import-error-special' => "'A pagena \"\$1\" non g'ha state 'mbortate purcé apponde a 'nu namespace speciale ca non g'è permesse a le pàggene normale.",
 'import-error-invalid' => "'A pàgene \"\$1\" non g'ha state 'mbortate purcé 'u nome jè invalide.",
+'import-options-wrong' => '{{PLURAL:$2|opzione|opziune}} sbagliate: <nowiki>$1</nowiki>',
 
 # Import log
 'importlogpage' => "Archivie de le 'mbortaziune",
@@ -2847,19 +2896,30 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'spambot_username' => "Sdevacatore d'u spam de MediaUicchi",
 'spam_reverting' => "Turnanne a l'urtema revisione no ge condiene collegaminde a $1",
 'spam_blanking' => 'Tutte le revisiune condènene collegaminde a $1, vacande',
+'spam_deleting' => 'Tutte le revisiune condènene collegaminde a $1, stoche a scangelle',
 
 # Info page
 'pageinfo-title' => '\'Mbormaziune pe "$1"',
-'pageinfo-header-edits' => 'Cangiaminde',
-'pageinfo-header-watchlist' => 'Pàggene condrollate',
-'pageinfo-header-views' => 'Visite',
-'pageinfo-subjectpage' => 'Pàgene',
-'pageinfo-talkpage' => "Pàgene de le 'ngazzaminde",
-'pageinfo-watchers' => 'Numere de visitature',
-'pageinfo-edits' => 'Numere de cangiaminde',
-'pageinfo-authors' => 'Numere de autore diverse',
+'pageinfo-header-basic' => "'Mbormaziune 'nderra-'nderre",
+'pageinfo-header-edits' => 'Cunde de le cangiaminde',
+'pageinfo-header-properties' => "Probbietà d'a pàgene",
+'pageinfo-display-title' => "Fà vedè 'u titole",
+'pageinfo-article-id' => "ID d'a pàgene",
+'pageinfo-robot-policy' => "State d'u motore de ricerche",
+'pageinfo-robot-index' => 'Indicizzabbele',
+'pageinfo-robot-noindex' => 'None indicizzabbele',
 'pageinfo-views' => 'Numere de visite',
-'pageinfo-viewsperedit' => 'Visite pe cangiaminde',
+'pageinfo-watchers' => "Numere de visitature d'a pàgene",
+'pageinfo-redirects-name' => 'Redirezionaminde a sta pàgene',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Sottopàggene de sta pàgene',
+'pageinfo-firstuser' => "Ccrejatore d'a pàgene",
+'pageinfo-firsttime' => "Date d'a ccrejazione d'a pàgene",
+'pageinfo-lastuser' => 'Urteme cangiatore',
+'pageinfo-lasttime' => "Darte de l'urteme cangiamende",
+'pageinfo-edits' => 'Numere totale de cangiaminde',
+'pageinfo-authors' => 'Numere Totale de autore diverse',
+'pageinfo-magic-words' => '{{PLURAL:$1|Parole|Parole}} maggiche ($1)',
 
 # Skin names
 'skinname-standard' => 'Classeche',
@@ -3575,6 +3635,7 @@ Pe piacere conferme ca tu vuè avveramende reccrejà sta pàgene.",
 'ellipsis' => '...',
 'percent' => '$1%',
 'parentheses' => '($1)',
+'brackets' => '[$1]',
 
 # Multipage image navigation
 'imgmultipageprev' => '← pàgena precedende',
@@ -3605,6 +3666,22 @@ Pe piacere conferme ca tu vuè avveramende reccrejà sta pàgene.",
 'size-kilobytes' => '$1 KB',
 'size-megabytes' => '$1 MB',
 'size-gigabytes' => '$1 GB',
+'size-terabytes' => '$1 TB',
+'size-petabytes' => '$1 PB',
+'size-exabytes' => '$1 EB',
+'size-zetabytes' => '$1 ZB',
+'size-yottabytes' => '$1 YB',
+
+# Bitrate units
+'bitrate-bits' => '$1bps',
+'bitrate-kilobits' => '$1kbps',
+'bitrate-megabits' => '$1Mbps',
+'bitrate-gigabits' => '$1Gbps',
+'bitrate-terabits' => '$1Tbps',
+'bitrate-petabits' => '$1Pbps',
+'bitrate-exabits' => '$1Ebps',
+'bitrate-zetabits' => '$1Zbps',
+'bitrate-yottabits' => '$1Ybps',
 
 # Live preview
 'livepreview-loading' => 'Stoche a careche…',
@@ -3770,7 +3847,7 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 * <span class="mw-specialpagecached">Pàggene speciale in memorie cache (ponne essere vecchie).</span>',
 'specialpages-group-maintenance' => "Report d'a manutenzione",
 'specialpages-group-other' => 'Otre pàggene speciele',
-'specialpages-group-login' => 'Tràse / Reggistrete',
+'specialpages-group-login' => 'Tràse / Reggistrate',
 'specialpages-group-changes' => 'Cangiaminde recende e archivie',
 'specialpages-group-media' => 'Riepileghe de media e carecaminde',
 'specialpages-group-users' => 'Utinde e deritte',
@@ -3898,14 +3975,18 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 'api-error-badtoken' => 'Errore inderne: Gettone errate.',
 'api-error-copyuploaddisabled' => "'U carecamende da URL jè disabbilitate sus a stu server.",
 'api-error-duplicate' => "{{PLURAL:$1|Stè [$2 'n'otre file]|Stonne [$2 otre file]}} sus a 'u site cu 'u stesse condenute.",
+'api-error-duplicate-archive' => "{{PLURAL:$1|Stave [$2 'n'otre file]|Stavane [$2 otre file]}} già sus a 'u site cu 'u stesse condenute, ma {{PLURAL:$1|ha state|onne state}} scangellate.",
 'api-error-duplicate-archive-popup-title' => "Dupliche {{PLURAL:$1|'u file ca ha state|le file ca onne state}} scangellate.",
 'api-error-duplicate-popup-title' => 'Dupleche {{PLURAL:$1|file|file}}',
 'api-error-empty-file' => "'U file ca tu è confermate ere vacande.",
 'api-error-emptypage' => 'Quanne se ne ccreje une, le pàggene vacande non ge sò permesse.',
 'api-error-fetchfileerror' => "Errore inderne: Quacchecose ha sciute stuèrte quanne ste analizzave 'u file.",
+'api-error-fileexists-forbidden' => '\'Nu file cu \'u nome "$1" esiste, e non ge pò essere sovrascritte.',
+'api-error-fileexists-shared-forbidden' => "'Nu file cu 'u nome \"\$1\" esiste jndr'à l'archivije de le file comune, e non ge pò essere sovrascritte.",
 'api-error-file-too-large' => "'U file ca tu è confermate jè troppe granne.",
 'api-error-filename-tooshort' => "'U nome d'u file jè troppe curte.",
 'api-error-filetype-banned' => 'Stu tipe de file jè vietate.',
+'api-error-filetype-banned-type' => "$1 {{PLURAL:$4|ète 'nu tipe de file ca non g'è permesse|sonde tipe de file ca no sonde permesse}}. {{PLURAL:$3|'U tipe de file permesse ète|Le tipe de file permesse sonde}} $2.",
 'api-error-filetype-missing' => "'U file jè senze 'n'estenzione.",
 'api-error-hookaborted' => "'U cangiamende ca tu stè pruève a ffà ha state inderrotte da 'n'estenzione.",
 'api-error-http' => "Errore inderne: Non ge se riesce a collegà a 'u server",
index 909cfe9..be9b03d 100644 (file)
@@ -51,6 +51,7 @@
  * @author KorneySan
  * @author Kv75
  * @author Lockal
+ * @author MaxBioHazard
  * @author MaxSem
  * @author Ola
  * @author Ole Yves
@@ -58,6 +59,7 @@
  * @author Rave
  * @author Rubin
  * @author Sagan
+ * @author Shirayuki
  * @author Sk
  * @author TarzanASG
  * @author Temuri rajavi
@@ -188,154 +190,154 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#перенаправление', '#перенапр', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__БЕЗ_ЗАГОЛОВКА__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'МЕСТНЫЙ_МЕСЯЦ', 'МЕСТНЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'МЕСТНЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_РОД', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'КОЛИЧЕСТВО_АКТИВНЫХ_УЧАСТНИКОВ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ПРОСТРАНСТВО_СТАТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ_2', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ_2', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ_2', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ_2', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
-       'subst'                   => array( '0', 'ПОДСТАНОВКА:', 'ПОДСТ:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'ЗАЩПОДСТ:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'справа', 'right' ),
-       'img_left'                => array( '1', 'слева', 'left' ),
-       'img_none'                => array( '1', 'без', 'none' ),
-       'img_width'               => array( '1', '$1пкс', '$1px' ),
-       'img_center'              => array( '1', 'центр', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'обрамить', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'безрамки', 'frameless' ),
-       'img_page'                => array( '1', 'страница=$1', 'страница $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'сверхусправа', 'сверхусправа=$1', 'сверхусправа $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'граница', 'border' ),
-       'img_baseline'            => array( '1', 'основание', 'baseline' ),
-       'img_sub'                 => array( '1', 'под', 'sub' ),
-       'img_super'               => array( '1', 'над', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'сверху', 'top' ),
-       'img_text_top'            => array( '1', 'текст-сверху', 'text-top' ),
-       'img_middle'              => array( '1', 'посередине', 'middle' ),
-       'img_bottom'              => array( '1', 'снизу', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'текст-снизу', 'text-bottom' ),
-       'img_link'                => array( '1', 'ссылка=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'альт=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'ВНУТР:', 'INT:' ),
-       'sitename'                => array( '1', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
-       'ns'                      => array( '0', 'ПИ:', 'NS:' ),
-       'nse'                     => array( '0', 'ПИК:', 'NSE:' ),
-       'localurl'                => array( '0', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'ПУТЬ_К_СТАТЬЕ', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'СЕРВЕР', 'SERVER' ),
-       'servername'              => array( '0', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'ПАДЕЖ:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ПОЛ:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ЗАГОЛОВКА__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ТЕКСТА__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'МЕСТНЫЙ_ДЕНЬ_НЕДЕЛИ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'ИД_ВЕРСИИ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ДЕНЬ_ВЕРСИИ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ДЕНЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'ВЕРСИЯ_УЧАСНИКА', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'ПЕРВАЯ_БУКВА_МАЛЕНЬКАЯ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ПЕРВАЯ_БУКВА_БОЛЬШАЯ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'МАЛЕНЬКИМИ_БУКВАМИ:', 'LC:' ),
-       'uc'                      => array( '0', 'БОЛЬШИМИ_БУКВАМИ:', 'UC:' ),
-       'raw'                     => array( '0', 'НЕОБРАБ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'Н', 'R' ),
-       'newsectionlink'          => array( '1', '__ССЫЛКА_НА_НОВЫЙ_РАЗДЕЛ__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__БЕЗ_ССЫЛКИ_НА_НОВЫЙ_РАЗДЕЛ__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'ТЕКУЩАЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ЗАКОДИРОВАННЫЙ_АДРЕС:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'КОДИРОВАТЬ_МЕТКУ', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'ОТМЕТКА_ТЕКУЩЕГО_ВРЕМЕНИ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'ОТМЕТКА_МЕСТНОГО_ВРЕМЕНИ', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'НАПРАВЛЕНИЕ_ПИСЬМА', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#ЯЗЫК:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'ЯЗЫК_СОДЕРЖАНИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'СТРАНИЦ_В_ПРОСТРАНСТВЕ_ИМЁН:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'КОЛИЧЕСТВО_АДМИНИСТРАТОРОВ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ФОРМАТИРОВАТЬ_ЧИСЛО', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ЗАПОЛНИТЬ_СЛЕВА', 'PADLEFT' ),
-       'padright'                => array( '0', 'ЗАПОЛНИТЬ_СПРАВА', 'PADRIGHT' ),
-       'special'                 => array( '0', 'служебная', 'special' ),
-       'defaultsort'             => array( '1', 'СОРТИРОВКА_ПО_УМОЛЧАНИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'метка', 'тег', 'тэг', 'tag' ),
-       'hiddencat'               => array( '1', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
-       'index'                   => array( '1', '__ИНДЕКС__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__СТАТИЧЕСКОЕ_ПЕРЕНАПРАВЛЕНИЕ__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'УРОВЕНЬ_ЗАЩИТЫ', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'форматдаты', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'ПУТЬ', 'PATH' ),
-       'url_wiki'                => array( '0', 'ВИКИ', 'WIKI' ),
-       'url_query'               => array( '0', 'ЗАПРОС', 'QUERY' ),
+       'redirect'                  => array( '0', '#перенаправление', '#перенапр', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__БЕЗ_ЗАГОЛОВКА__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'МЕСТНЫЙ_МЕСЯЦ', 'МЕСТНЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'МЕСТНЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_РОД', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'КОЛИЧЕСТВО_АКТИВНЫХ_УЧАСТНИКОВ', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ПРОСТРАНСТВО_СТАТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ_2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ_2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ_2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ_2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
+       'subst'                     => array( '0', 'ПОДСТАНОВКА:', 'ПОДСТ:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'ЗАЩПОДСТ:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'слева', 'left' ),
+       'img_none'                  => array( '1', 'без', 'none' ),
+       'img_width'                 => array( '1', '$1пкс', '$1px' ),
+       'img_center'                => array( '1', 'центр', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'обрамить', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'безрамки', 'frameless' ),
+       'img_page'                  => array( '1', 'страница=$1', 'страница $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'сверхусправа', 'сверхусправа=$1', 'сверхусправа $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'граница', 'border' ),
+       'img_baseline'              => array( '1', 'основание', 'baseline' ),
+       'img_sub'                   => array( '1', 'под', 'sub' ),
+       'img_super'                 => array( '1', 'над', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'сверху', 'top' ),
+       'img_text_top'              => array( '1', 'текст-сверху', 'text-top' ),
+       'img_middle'                => array( '1', 'посередине', 'middle' ),
+       'img_bottom'                => array( '1', 'снизу', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'текст-снизу', 'text-bottom' ),
+       'img_link'                  => array( '1', 'ссылка=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'альт=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'ВНУТР:', 'INT:' ),
+       'sitename'                  => array( '1', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
+       'ns'                        => array( '0', 'ПИ:', 'NS:' ),
+       'nse'                       => array( '0', 'ПИК:', 'NSE:' ),
+       'localurl'                  => array( '0', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ПУТЬ_К_СТАТЬЕ', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'СЕРВЕР', 'SERVER' ),
+       'servername'                => array( '0', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'ПАДЕЖ:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ПОЛ:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ЗАГОЛОВКА__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ТЕКСТА__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'МЕСТНЫЙ_ДЕНЬ_НЕДЕЛИ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'ИД_ВЕРСИИ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ДЕНЬ_ВЕРСИИ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ДЕНЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'ВЕРСИЯ_УЧАСТНИКА', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'ПЕРВАЯ_БУКВА_МАЛЕНЬКАЯ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ПЕРВАЯ_БУКВА_БОЛЬШАЯ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'МАЛЕНЬКИМИ_БУКВАМИ:', 'LC:' ),
+       'uc'                        => array( '0', 'БОЛЬШИМИ_БУКВАМИ:', 'UC:' ),
+       'raw'                       => array( '0', 'НЕОБРАБ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'Н', 'R' ),
+       'newsectionlink'            => array( '1', '__ССЫЛКА_НА_НОВЫЙ_РАЗДЕЛ__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__БЕЗ_ССЫЛКИ_НА_НОВЫЙ_РАЗДЕЛ__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'ТЕКУЩАЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ЗАКОДИРОВАННЫЙ_АДРЕС:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'КОДИРОВАТЬ_МЕТКУ', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'ОТМЕТКА_ТЕКУЩЕГО_ВРЕМЕНИ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'ОТМЕТКА_МЕСТНОГО_ВРЕМЕНИ', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'НАПРАВЛЕНИЕ_ПИСЬМА', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#ЯЗЫК:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'ЯЗЫК_СОДЕРЖАНИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'СТРАНИЦ_В_ПРОСТРАНСТВЕ_ИМЁН:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'КОЛИЧЕСТВО_АДМИНИСТРАТОРОВ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ФОРМАТИРОВАТЬ_ЧИСЛО', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ЗАПОЛНИТЬ_СЛЕВА', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ЗАПОЛНИТЬ_СПРАВА', 'PADRIGHT' ),
+       'special'                   => array( '0', 'служебная', 'special' ),
+       'defaultsort'               => array( '1', 'СОРТИРОВКА_ПО_УМОЛЧАНИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'метка', 'тег', 'тэг', 'tag' ),
+       'hiddencat'                 => array( '1', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
+       'index'                     => array( '1', '__ИНДЕКС__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__СТАТИЧЕСКОЕ_ПЕРЕНАПРАВЛЕНИЕ__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'УРОВЕНЬ_ЗАЩИТЫ', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'форматдаты', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'ПУТЬ', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ВИКИ', 'WIKI' ),
+       'url_query'                 => array( '0', 'ЗАПРОС', 'QUERY' ),
 );
 
 
@@ -395,11 +397,11 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Подчёркивать ссылки:',
 'tog-justify' => 'Выравнивать текст по ширине страницы',
-'tog-hideminor' => 'СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки Ð² Ñ\81пиÑ\81ке Ñ\81вежиÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹',
+'tog-hideminor' => 'СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки Ð² Ñ\81пиÑ\81ке Ñ\81вежиÑ\85 Ð¿Ñ\80авок',
 'tog-hidepatrolled' => 'Скрывать патрулированные правки в списке свежих правок',
 'tog-newpageshidepatrolled' => 'Скрывать отпатрулированные страницы в списке новых страниц',
 'tog-extendwatchlist' => 'Расширенный список наблюдения, включающий все изменения, а не только последние',
-'tog-usenewrc' => 'Ð\98Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\83лÑ\83Ñ\87Ñ\88еннÑ\8bй Ñ\81пиÑ\81ок Ñ\81вежиÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ (Ñ\82Ñ\80ебÑ\83еÑ\82Ñ\81Ñ\8f JavaScript)',
+'tog-usenewrc' => 'Ð\93Ñ\80Ñ\83ппиÑ\80оваÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ñ\81вежиÑ\85 Ð¿Ñ\80авкаÑ\85 Ð¸ Ñ\81пиÑ\81ке Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f (JavaScript)',
 'tog-numberheadings' => 'Автоматически нумеровать заголовки',
 'tog-showtoolbar' => 'Показывать верхнюю панель инструментов при редактировании (JavaScript)',
 'tog-editondblclick' => 'Править страницы по двойному щелчку (JavaScript)',
@@ -407,17 +409,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Править секции при правом щелчке мышью на заголовке (JavaScript)',
 'tog-showtoc' => 'Показывать оглавление (для страниц более чем с 3 заголовками)',
 'tog-rememberpassword' => 'Помнить мою учётную запись в этом браузере (не более $1 {{PLURAL:$1|дня|дней|дней}})',
-'tog-watchcreations' => 'Добавлять созданные мной страницы в список наблюдения',
-'tog-watchdefault' => 'Ð\94обавлÑ\8fÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½Ñ\91ннÑ\8bе Ð¼Ð½Ð¾Ð¹ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð² Ñ\81пиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f',
-'tog-watchmoves' => 'Ð\94обавлÑ\8fÑ\82Ñ\8c Ð¿ÐµÑ\80еименованнÑ\8bе Ð¼Ð½Ð¾Ð¹ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð² Ñ\81пиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f',
-'tog-watchdeletion' => 'Добавлять удалённые мной страницы в список наблюдения',
+'tog-watchcreations' => 'Добавлять в список наблюдения созданные мной страницы и загруженные мной файлы',
+'tog-watchdefault' => 'Ð\94обавлÑ\8fÑ\82Ñ\8c Ð² Ñ\81пиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f Ð¸Ð·Ð¼ÐµÐ½Ñ\91ннÑ\8bе Ð¼Ð½Ð¾Ð¹ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð¸ Ð¾Ð¿Ð¸Ñ\81аниÑ\8f Ñ\84айлов',
+'tog-watchmoves' => 'Ð\94обавлÑ\8fÑ\82Ñ\8c Ð² Ñ\81пиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f Ð¿ÐµÑ\80еименованнÑ\8bе Ð¼Ð½Ð¾Ð¹ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð¸ Ñ\84айлÑ\8b',
+'tog-watchdeletion' => 'Добавлять в список наблюдения удалённые мной страницы и файлы',
 'tog-minordefault' => 'Помечать по умолчанию правки как малозначимые',
 'tog-previewontop' => 'Помещать предпросмотр перед окном редактирования',
 'tog-previewonfirst' => 'Показывать предпросмотр при переходе к редактированию',
 'tog-nocache' => 'Отключить кеширование страниц в браузере',
-'tog-enotifwatchlistpages' => 'Уведомлять по эл. почте об изменениях страниц из списка наблюдения',
+'tog-enotifwatchlistpages' => 'Уведомлять по эл. почте об изменениях страниц и файлов из списка наблюдения',
 'tog-enotifusertalkpages' => 'Уведомлять по эл. почте об изменении персональной страницы обсуждения',
-'tog-enotifminoredits' => 'УведомлÑ\8fÑ\82Ñ\8c Ð´Ð°Ð¶Ðµ Ð¿Ñ\80и Ð¼Ð°Ð»Ð¾Ð·Ð½Ð°Ñ\87иÑ\82елÑ\8cнÑ\8bÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8fÑ\85',
+'tog-enotifminoredits' => 'УведомлÑ\8fÑ\82Ñ\8c Ð´Ð°Ð¶Ðµ Ð¿Ñ\80и Ð½ÐµÐ·Ð½Ð°Ñ\87иÑ\82елÑ\8cнÑ\8bÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8fÑ\85 Ñ\81Ñ\82Ñ\80аниÑ\86 Ð¸ Ñ\84айлов',
 'tog-enotifrevealaddr' => 'Показывать мой почтовый адрес в сообщениях оповещения',
 'tog-shownumberswatching' => 'Показывать число участников, включивших страницу в свой список наблюдения',
 'tog-oldsig' => 'Текущая подпись:',
@@ -433,7 +435,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Скрывать правки представившихся участников из списка наблюдения',
 'tog-watchlisthideanons' => 'Скрывать правки анонимных участников из списка наблюдения',
 'tog-watchlisthidepatrolled' => 'Скрывать отпатрулированные правки в списке наблюдения',
-'tog-nolangconversion' => 'Отключить преобразование систем письма',
 'tog-ccmeonemails' => 'Отправлять мне копии писем, которые я посылаю другим участникам',
 'tog-diffonly' => 'Не показывать содержание страницы под сравнением двух версий',
 'tog-showhiddencats' => 'Показывать скрытые категории',
@@ -658,6 +659,10 @@ $1',
 'youhavenewmessages' => 'Вы получили $1 ($2).',
 'newmessageslink' => 'новые сообщения',
 'newmessagesdifflink' => 'последнее изменение',
+'youhavenewmessagesfromusers' => 'Вы получили $1 от {{PLURAL:$3|$3 участника|$3 участников|$3 участников}} ($2).',
+'youhavenewmessagesmanyusers' => 'Вы получили $1 от множества пользователей ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|новое сообщение|новые сообщения}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|последнее изменение|последние изменения}}',
 'youhavenewmessagesmulti' => 'Вы получили новые сообщения на $1',
 'editsection' => 'править',
 'editold' => 'править',
@@ -747,9 +752,11 @@ $1',
 'unexpected' => 'Неподходящее значение: «$1»=«$2».',
 'formerror' => 'Ошибка: невозможно передать данные формы',
 'badarticleerror' => 'Это действие не может быть выполнено на данной странице.',
-'cannotdelete' => 'Невозможно удалить страницу или файл «$1».
\92озможно, Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\83же Ð¾ÐºÐ°Ð·Ð°Ð»Ð°Ñ\81Ñ\8c удалена.',
+'cannotdelete' => 'Невозможно удалить или переименовать страницу или файл «$1».
\92озможно, Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\83же Ð±Ñ\8bла удалена.',
 'cannotdelete-title' => 'Нельзя удалить страницу «$1»',
+'delete-hook-aborted' => 'Правка отменена процедурой-перехватчиком.
+Дополнительных пояснений не приведено.',
 'badtitle' => 'Недопустимое название',
 'badtitletext' => 'Запрашиваемое название страницы неправильно, пусто, либо неправильно указано межъязыковое или интервики название. Возможно, в названии используются недопустимые символы.',
 'perfcached' => 'Следующие данные взяты из кэша и могут не учитывать последних изменений. В кэше хранится не более $1 {{PLURAL:$1|записи|записей|записей}}.',
@@ -784,6 +791,8 @@ $2',
 Установивший этот режим администратор оставил следующее разъяснение: «''$3''».",
 'invalidtitle-knownnamespace' => 'Недопустимый заголовок с пространством имен «$2» и текстом «$3»',
 'invalidtitle-unknownnamespace' => 'Недопустимый заголовок с неизвестным номером пространства $1 и текстом «$2»',
+'exception-nologin' => 'Вы не представились системе',
+'exception-nologin-text' => 'Для просмотра этой станицы или выполнения запрошенного действия необходимо представиться системе.',
 
 # Virus scanner
 'virus-badscanner' => "Ошибка настройки. Неизвестный сканер вирусов: ''$1''",
@@ -804,6 +813,7 @@ $2',
 'remembermypassword' => 'Помнить мою учётную запись на этом компьютере (не более $1 {{PLURAL:$1|дня|дней|дней}})',
 'securelogin-stick-https' => 'Продолжить подключение по HTTPS после входа',
 'yourdomainname' => 'Ваш домен:',
+'password-change-forbidden' => 'Вы не можете изменить пароль в этой вики.',
 'externaldberror' => 'Произошла ошибка при аутентификации с помощью внешней базы данных или у вас недостаточно прав для внесения изменений в свою внешнюю учётную запись.',
 'login' => 'Представиться системе',
 'nav-login-createaccount' => 'Представиться / зарегистрироваться',
@@ -1059,6 +1069,10 @@ $2
 'noarticletext-nopermission' => 'В настоящее время на этой странице нет текста.
 Вы можете [[Special:Search/{{PAGENAME}}|найти упоминание данного названия]] в других статьях,
 или <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} найти соответствующие записи журналов].</span>',
+'missing-revision' => 'Версия $1 страницы «{{PAGENAME}}» не существует.
+
+Это обычно бывает, если последовать по устаревшей ссылке на страницу, которая была удалена.
+Подробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].',
 'userpage-userdoesnotexist' => 'Учётной записи «<nowiki>$1</nowiki>» не существует. Убедитесь, что вы действительно желаете создать или изменить эту страницу.',
 'userpage-userdoesnotexist-view' => 'Не зарегистрировано учётной записи «$1».',
 'blocked-notice-logextract' => 'Этот участник в данный момент заблокирован.
@@ -1067,7 +1081,6 @@ $2
 * '''Firefox / Safari:''' Удерживая клавишу ''Shift'', нажмите на панели инструментов ''Обновить'', или нажмите ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac)
 * '''Google Chrome:''' Нажмите ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)
 * '''Internet Explorer:''' Удерживая ''Ctrl'' нажмите ''Обновить'', или нажмите ''Ctrl-F5''
-* '''Konqueror:''' Нажмите ''Обновить'' или ''F5''
 * '''Opera:''' Выберите очистку кеша в меню ''Инструменты → Настройки''",
 'usercssyoucanpreview' => "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый CSS-файл перед сохранением.",
 'userjsyoucanpreview' => "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый JS-файл перед сохранением.",
@@ -1098,7 +1111,7 @@ $2
 Подобные проблемы могут возникать при использовании анонимизирующих веб-прокси, содержащих ошибки.'''",
 'edit_form_incomplete' => "'''Некоторые части формы редактирования не достигли сервера. Внимательно проверьте, что ваши правки не повреждены, и попробуйте ещё раз.'''",
 'editing' => 'Редактирование $1',
-'creating' => 'Создание $1',
+'creating' => 'Создание страницы «$1»',
 'editingsection' => 'Редактирование: $1 (раздел)',
 'editingcomment' => 'Редактирование $1 (новый раздел)',
 'editconflict' => 'Конфликт редактирования: $1',
@@ -1187,6 +1200,7 @@ $2
 'expansion-depth-exceeded-warning' => 'На странице превышен предел вложенности',
 'parser-unstrip-loop-warning' => 'Обнаружен незакрытый pre',
 'parser-unstrip-recursion-limit' => 'Превышен предел рекурсии ($1)',
+'converter-manual-rule-error' => 'Ошибка в ручном правиле преобразования языка',
 
 # "Undo" feature
 'undo-success' => 'Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.',
@@ -1372,6 +1386,10 @@ $1",
 'editundo' => 'отменить',
 'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия|не показаны $1 промежуточные версии|не показаны $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников}})',
 'diff-multi-manyusers' => '(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показаны $1 промежуточных версий}}, сделанные более чем $2 {{PLURAL:$2|участником|участниками}})',
+'difference-missing-revision' => '{{PLURAL:$2|$2 версия|$2 версии|$2 версий}} для этого сравнения ($1) {{PLURAL:$2|не обнаружена|не обнаружены}}.
+
+Это обычно бывает, если последовать по устаревшей ссылке на страницу, которая была удалена.
+Подробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].',
 
 # Search results
 'searchresults' => 'Результаты поиска',
@@ -1639,6 +1657,7 @@ $1",
 'right-writeapi' => 'использование API для записи',
 'right-delete' => 'удаление страниц',
 'right-bigdelete' => 'удаление страниц с длинными историями изменений',
+'right-deletelogentry' => 'удаление и восстановление конкретных записей журнала.',
 'right-deleterevision' => 'удаление и восстановление конкретных версий страниц',
 'right-deletedhistory' => 'просмотр истории удалённых страниц без доступа к удалённому тексту',
 'right-deletedtext' => 'просмотр удалённого текста и изменений между удалёнными версиями страниц',
@@ -1785,9 +1804,9 @@ $1",
 Чтобы просмотреть ранее загруженные файлы, обратитесь к [[Special:FileList|списку загруженных файлов]]. Загрузка файлов также записывается в [[Special:Log/upload|журнал загрузок]], данные об удалённых файлах можно найти в [[Special:Log/delete|журнале удалений]].
 
 Для включения файла в статью вы можете использовать строки вида:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' для вставки полной версии файла;
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|описание]]</nowiki></tt>''' для вставки слева от текста уменьшенной до 200 пикселей по ширине версии файла с выводом под ним указанного описания;
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' для вставки ссылки на файл, без отображения его содержимого на странице.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' для вставки полной версии файла;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|описание]]</nowiki></code>''' для вставки слева от текста уменьшенной до 200 пикселей по ширине версии файла с выводом под ним указанного описания;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' для вставки ссылки на файл, без отображения его содержимого на странице.",
 'upload-permitted' => 'Разрешённые типы файлов: $1.',
 'upload-preferred' => 'Предпочтительные типы файлов: $1.',
 'upload-prohibited' => 'Запрещённые типы файлов: $1.',
@@ -1831,20 +1850,20 @@ $1",
 'largefileserver' => 'Размер файла превышает максимально разрешённый.',
 'emptyfile' => 'Загруженный вами файл, вероятно, пустой. Возможно, это произошло из-за ошибки при наборе имени файла. Пожалуйста, проверьте, действительно ли вы хотите загрузить этот файл.',
 'windows-nonascii-filename' => 'Эта вики не поддерживает имена файлов с символами, отсутствующими в таблице ASCII.',
-'fileexists' => "Файл с этим именем уже существует, пожалуйста, проверьте '''<tt>[[:$1]]</tt>''', если вы не уверены, что хотите заменить его.
-[[$1|thumb]]",
-'filepageexists' => "Страница описания для этого файла уже создана как '''<tt>[[:$1]]</tt>''', но файла с таким именем сейчас нет.
+'fileexists' => 'Файл с этим именем уже существует, пожалуйста, проверьте <strong>[[:$1]]</strong>, если вы не уверены, что хотите заменить его.
+[[$1|thumb]]',
+'filepageexists' => 'Страница описания для этого файла уже создана как <strong>[[:$1]]</strong>, но файла с таким именем сейчас нет.
 Введённое описание не появится на странице описания файла.
 Чтобы добавить новое описание, вам придётся изменить его вручную.
-[[$1|thumb]]",
-'fileexists-extension' => "Существует файл с похожим именем: [[$2|thumb]]
-* Имя загруженного файла: '''<tt>[[:$1]]</tt>'''
-* Имя существующего файла: '''<tt>[[:$2]]</tt>'''
-Пожалуйста, выберите другое имя.",
-'fileexists-thumbnail-yes' => "Файл, вероятно, является уменьшенной копией (миниатюрой). [[$1|thumb]]
-Пожалуйста, проверьте файл '''<tt>[[:$1]]</tt>'''.
-Если указанный файл является тем же изображением, не стоит загружать отдельно его уменьшенную копию.",
-'file-thumbnail-no' => "Название файла начинается с '''<tt>$1</tt>'''.
+[[$1|thumb]]',
+'fileexists-extension' => 'Существует файл с похожим именем: [[$2|thumb]]
+* Имя загруженного файла: <strong>[[:$1]]</strong>
+* Имя существующего файла: <strong>[[:$2]]</strong>
+Пожалуйста, выберите другое имя.',
+'fileexists-thumbnail-yes' => 'Файл, вероятно, является уменьшенной копией (миниатюрой). [[$1|thumb]]
+Пожалуйста, проверьте файл <strong>[[:$1]]</strong>.
+Если указанный файл является тем же изображением, не стоит загружать отдельно его уменьшенную копию.',
+'file-thumbnail-no' => "Название файла начинается с <strong>$1</strong>.
 Вероятно, это уменьшенная копия изображения ''(миниатюра)''.
 Если у вас есть данное изображение в полном размере, пожалуйста, загрузите его или измените имя файла.",
 'fileexists-forbidden' => 'Файл с этим именем уже существует и не может быть перезаписан.
@@ -1951,6 +1970,7 @@ $1',
 'lockmanager-fail-releaselock' => 'Не удалось разблокировать "$1".',
 'lockmanager-fail-db-bucket' => 'Не удалось связаться с достаточным количеством баз блокировок в сегменте $1.',
 'lockmanager-fail-db-release' => 'Не удалось снять блокировку базы данных  $1 .',
+'lockmanager-fail-svr-acquire' => 'Не удалось получить блокировку на сервере  $1.',
 'lockmanager-fail-svr-release' => 'Не удалось снять блокировки на сервере $1 .',
 
 # ZipDirectoryReader
@@ -2068,6 +2088,7 @@ $1',
 'shared-repo-from' => 'из $1',
 'shared-repo' => 'общего хранилища',
 'shared-repo-name-wikimediacommons' => 'Викисклада',
+'upload-disallowed-here' => 'К сожалению, вы не можете перезаписать это изображение.',
 
 # File reversion
 'filerevert' => 'Возврат к старой версии $1',
@@ -2101,7 +2122,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'Поиск по MIME',
-'mimesearch-summary' => 'Эта страница позволяет отбирать файлы по их MIME-типу. Формат ввода: типсодержимого/подтип, например <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Эта страница позволяет отбирать файлы по их MIME-типу. Формат ввода: типсодержимого/подтип, например <code>image/jpeg</code>.',
 'mimetype' => 'MIME-тип:',
 'download' => 'загрузить',
 
@@ -2148,8 +2169,8 @@ $1',
 
 'disambiguations' => 'Страницы, ссылающиеся на страницы разрешения неоднозначности',
 'disambiguationspage' => 'Template:Неоднозначность',
-'disambiguations-text' => "Следующие страницы ссылаются на '''многозначные страницы'''.
-Вместо этого они, вероятно, должны указывать на соответствующую конкретную статью.<br />
+'disambiguations-text' => "Следующие страницы содержат по меньшей мере одну ссылку на '''многозначную страницу'''.
+Вместо этого они, вероятно, должны указывать на соответствующую конкретную страницу.<br />
 Страница считается многозначной, если на ней размещён шаблон, имя которого указано на странице [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Двойные перенаправления',
@@ -2175,6 +2196,7 @@ $1',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|байт|байта|байт}}',
 'ncategories' => '$1 {{PLURAL:$1|категория|категории|категорий}}',
+'ninterwikis' => '$1 {{PLURAL:$1|интервики-ссылка|интервики-ссылки|интервики-ссылок}}',
 'nlinks' => '$1 {{PLURAL:$1|ссылка|ссылки|ссылок}}',
 'nmembers' => '$1 {{PLURAL:$1|объект|объекта|объектов}}',
 'nrevisions' => '$1 {{PLURAL:$1|версия|версии|версий}}',
@@ -2203,6 +2225,7 @@ $1',
 'mostlinkedtemplates' => 'Самые используемые шаблоны',
 'mostcategories' => 'Страницы, включённые в большое количество категорий',
 'mostimages' => 'Самые используемые файлы',
+'mostinterwikis' => 'Страницы с наибольшим числом межъязыковых ссылок',
 'mostrevisions' => 'Наиболее часто редактировавшиеся страницы',
 'prefixindex' => 'Указатель по началу названий страниц',
 'prefixindex-namespace' => 'Указатель по началу страниц (пространство имён «{{ns:$1}}»)',
@@ -2303,7 +2326,7 @@ $1',
 'linksearch-ok' => 'Найти',
 'linksearch-text' => 'Можно использовать подстановочные символы, например, <code>*.wikipedia.org</code>.
 Необходим по крайней мере домен верхнего уровня, например <code>*.org</code><br />
-Поддерживаемые протоколы: <tt>$1</tt> (не добавлять любой из них в вашем поиске)',
+Поддерживаемые протоколы: <code>$1</code> (не добавлять любой из них в вашем поиске)',
 'linksearch-line' => 'Ссылка на $1 из $2',
 'linksearch-error' => 'Подстановочные символы могут использоваться только в начале адресов.',
 
@@ -2351,6 +2374,8 @@ $1',
 'mailnologin' => 'Адрес для отправки отсутствует',
 'mailnologintext' => 'Вы должны [[Special:UserLogin|представиться системе]] и иметь действительный адрес электронной почты в ваших [[Special:Preferences|настройках]], чтобы иметь возможность отправлять электронную почту другим участникам.',
 'emailuser' => 'Письмо участнику',
+'emailuser-title-target' => 'Написание электронного письма {{GENDER:$1|участнику|участнице}}',
+'emailuser-title-notarget' => 'Написание электронного письма участнику',
 'emailpage' => 'Письмо участнику',
 'emailpagetext' => 'С помощью данной формы можно отправить сообщение на адрес электронной почты этого участника.
 В качестве обратного адреса будет указан тот адрес, который вы указали в [[Special:Preferences|своих настройках]], таким образом получатель будет иметь возможность ответить непосредственно вам.',
@@ -2495,6 +2520,8 @@ $UNWATCHURL
 'rollback' => 'Откатить изменения',
 'rollback_short' => 'Откат',
 'rollbacklink' => 'откатить',
+'rollbacklinkcount' => 'откатить $1 {{PLURAL:$1|правку|правки|правок}}',
+'rollbacklinkcount-morethan' => 'откатить больше, чем $1 {{PLURAL:$1|правку|правки|правок}}',
 'rollbackfailed' => 'Ошибка при совершении отката',
 'cantrollback' => 'Невозможно откатить изменения. Последний, кто вносил изменения, является единственным автором этой страницы.',
 'alreadyrolled' => 'Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),
@@ -2771,7 +2798,7 @@ $1',
 Ниже приведён журнал блокировок:',
 'blocklog-showsuppresslog' => '{{GENDER:$1|Этот участник уже заблокирован и скрыт|Эта участница уже заблокирована и скрыта}}. Журнал сокрытий приведён ниже:',
 'blocklogentry' => 'заблокировал [[$1]] на период $2 $3',
-'reblock-logentry' => 'изменил Ð½Ð°Ñ\81Ñ\82Ñ\80ойки Ð±Ð»Ð¾ÐºÐ¸Ñ\80овки Ð´Ð»Ñ\8f [[$1]], Ð¸Ñ\81Ñ\82екаеÑ\82 $2 $3',
+'reblock-logentry' => 'изменил Ð±Ð»Ð¾ÐºÐ¸Ñ\80овкÑ\83 [[$1]] Ð½Ð° Ð¿ÐµÑ\80иод $2 $3',
 'blocklogtext' => 'Журнал блокировок и разблокировок участников. Автоматически блокируемые IP-адреса здесь не указываются. См. [[Special:BlockList|список текущих блокировок]].',
 'unblocklogentry' => 'разблокировал $1',
 'block-log-flags-anononly' => 'только анонимные пользователи',
@@ -2987,6 +3014,7 @@ $1',
 'import-interwiki-templates' => 'Включить все шаблоны',
 'import-interwiki-submit' => 'Импортировать',
 'import-interwiki-namespace' => 'Целевое пространство имён:',
+'import-interwiki-rootpage' => 'Корневая страница (необязательно):',
 'import-upload-filename' => 'Имя файла:',
 'import-comment' => 'Примечание:',
 'importtext' => 'Пожалуйста, экспортируйте страницу из исходной вики, используя [[Special:Export|соответствующий инструмент]]. Сохраните файл на диск, а затем загрузите его сюда.',
@@ -3018,6 +3046,9 @@ $1',
 'import-error-interwiki' => 'Страница «$1» не была импортирована, так как её название зарезервировано для внешних ссылок (интервики).',
 'import-error-special' => 'Страница «$1» не была импортирована, так как она относится к особому пространству имён, не позволяющему создавать страницы.',
 'import-error-invalid' => 'Страница «$1» не была импортирована из-за недопустимого названия.',
+'import-options-wrong' => '{{PLURAL:$2|Неверная опция|Неверные опции}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Указанное название корневой страницы некорректно.',
+'import-rootpage-nosubpage' => 'В пространстве имён указанной корневой страницы «$1» подстраницы запрещены.',
 
 # Import log
 'importlogpage' => 'Журнал импорта',
@@ -3170,16 +3201,34 @@ The wiki server can't provide data in a format your client can read.",
 
 # Info page
 'pageinfo-title' => 'Сведения по «$1»',
-'pageinfo-header-edits' => 'Правки',
-'pageinfo-header-watchlist' => 'Список наблюдения',
-'pageinfo-header-views' => 'Просмотры',
-'pageinfo-subjectpage' => 'Страница',
-'pageinfo-talkpage' => 'Страница обсуждения',
-'pageinfo-watchers' => 'Число наблюдающих',
-'pageinfo-edits' => 'Число правок',
-'pageinfo-authors' => 'Количество различных авторов',
+'pageinfo-header-basic' => 'Основные сведения',
+'pageinfo-header-edits' => 'История изменений',
+'pageinfo-header-restrictions' => 'Защита страницы',
+'pageinfo-header-properties' => 'Свойства страницы',
+'pageinfo-display-title' => 'Отображаемый заголовок',
+'pageinfo-default-sort' => 'Ключ сортировки по умолчанию',
+'pageinfo-length' => 'Длина страницы (в байтах)',
+'pageinfo-article-id' => 'Идентификатор страницы',
+'pageinfo-robot-policy' => 'Индексация поисковыми службами',
+'pageinfo-robot-index' => 'Индексируется',
+'pageinfo-robot-noindex' => 'Не индексируется',
 'pageinfo-views' => 'Количество просмотров',
-'pageinfo-viewsperedit' => 'Просмотров на правку',
+'pageinfo-watchers' => 'Число наблюдающих',
+'pageinfo-redirects-name' => 'Перенаправления на эту страницу',
+'pageinfo-subpages-name' => 'Подстраницы данной страницы',
+'pageinfo-subpages-value' => '$1($2 {{PLURAL:$2|перенаправление|перенаправления|перенаправлений}}; $3 {{PLURAL:$3|обычная|обычные|обычных}})',
+'pageinfo-firstuser' => 'Создатель страницы',
+'pageinfo-firsttime' => 'Дата создания страницы',
+'pageinfo-lastuser' => 'Последний редактор',
+'pageinfo-lasttime' => 'Дата последней правки',
+'pageinfo-edits' => 'Общее число правок',
+'pageinfo-authors' => 'Общее число различных авторов',
+'pageinfo-recent-edits' => 'Правок за последнее время (в течение $1)',
+'pageinfo-recent-authors' => 'Уникальных авторов за последнее время',
+'pageinfo-restriction' => 'Защита страницы (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Магическое слово|Магические слова}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрытая категория|Скрытых категорий}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Шаблон|Шаблонов}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Классическое',
@@ -3233,7 +3282,8 @@ $1',
 'file-info-size' => '$1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}, размер файла: $3, MIME-тип: $4',
 'file-info-size-pages' => '$1 × $2 пикселей, размер файла: $3, MIME-тип: $4, $5 {{PLURAL:$5|страница|страницы|страниц}}',
 'file-nohires' => 'Нет версии с бо́льшим разрешением.',
-'svg-long-desc' => 'Файл .SVG, номинально $1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}, размер файла: $3',
+'svg-long-desc' => 'SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}, размер файла: $3',
+'svg-long-desc-animated' => 'Анимированный SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}, размер файла: $3',
 'show-big-image' => 'Изображение в более высоком разрешении',
 'show-big-image-preview' => 'Размер при предпросмотре: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Другое разрешение|Другие разрешения}}: $1.',
@@ -3243,6 +3293,8 @@ $1',
 'file-info-png-looped' => 'закольцованный',
 'file-info-png-repeat' => 'проигрывается $1 {{PLURAL:$1|раз|раза|раз}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|кадр|кадра|кадров}}',
+'file-no-thumb-animation' => "'''Примечание. По техническим причинам, миниатюры этого файла не будет анимироваться.'''",
+'file-no-thumb-animation-gif' => "'''Примечание. По техническим причинам, миниатюры подобных GIF-изображений высокого разрешения не анимируются.'''",
 
 # Special:NewFiles
 'newimages' => 'Галерея новых файлов',
@@ -4130,9 +4182,12 @@ MediaWiki распространяется в надежде, что она бу
 'api-error-empty-file' => 'Отправленный вами файл пуст.',
 'api-error-emptypage' => 'Не допускается создание новых пустых страниц.',
 'api-error-fetchfileerror' => 'Внутренняя ошибка: что-то пошло не так при получении файла.',
+'api-error-fileexists-forbidden' => 'Файл с именем «$1» уже существует и не может быть перезаписан.',
+'api-error-fileexists-shared-forbidden' => 'Файл с именем «$1» уже существует в хранилище общих файлов и не может быть перезаписан.',
 'api-error-file-too-large' => 'Отправленный вами файл слишком велик.',
 'api-error-filename-tooshort' => 'Слишком короткое имя файла.',
 'api-error-filetype-banned' => 'Этот тип файлов запрещён.',
+'api-error-filetype-banned-type' => '$1 — {{PLURAL:$4|запрещённый тип файла|запрещённые типы файлов}}. {{PLURAL:$3|Разрешённый тип файлов —|Разрешённые типы файлов:}} $2.',
 'api-error-filetype-missing' => 'У этого файла отсутствует расширение.',
 'api-error-hookaborted' => 'Изменение, которые вы пытались сделать, прервано обработчиком расширения.',
 'api-error-http' => 'Внутренняя ошибка: не удаётся подключиться к серверу.',
index 64e8807..82a4753 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Rusyn (Русиньскый)
+/** Rusyn (русиньскый)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -43,6 +43,80 @@ $namespaceAliases = array(
        'Дізкузія_ку_MediaWiki'   => NS_MEDIAWIKI_TALK,
 );
 
+$specialPageAliases = array(
+       'Activeusers'               => array( 'Актівны_хоснователї' ),
+       'Allmessages'               => array( 'Сістемовы_повідомлїня' ),
+       'Allpages'                  => array( 'Вшыткы_сторінкы' ),
+       'Ancientpages'              => array( 'Давны_сторінкы' ),
+       'Badtitle'                  => array( 'Планый_тітул' ),
+       'Blankpage'                 => array( 'Порожня_сторінка' ),
+       'Block'                     => array( 'Заблоковати' ),
+       'Blockme'                   => array( 'Заблокуйте_ня' ),
+       'Booksources'               => array( 'Жрідла_книг' ),
+       'BrokenRedirects'           => array( 'Розорваны_напрямлїня' ),
+       'Categories'                => array( 'Катеґорії' ),
+       'ChangeEmail'               => array( 'Змінити_імейл' ),
+       'ChangePassword'            => array( 'Змінити_гесло' ),
+       'ComparePages'              => array( 'Порівнаня_сторінок' ),
+       'Confirmemail'              => array( 'Потвердити_імейл' ),
+       'Contributions'             => array( 'Вклад' ),
+       'CreateAccount'             => array( 'Створити_конто' ),
+       'Deadendpages'              => array( 'Сторінкы_без_одказів' ),
+       'DeletedContributions'      => array( 'Вымазаный_вклад' ),
+       'Disambiguations'           => array( 'Неєднозначны_одказы' ),
+       'DoubleRedirects'           => array( 'Подвійны_напрямлїня' ),
+       'EditWatchlist'             => array( 'Правити_список_мерькованя' ),
+       'Emailuser'                 => array( 'Писмо_хоснователёви' ),
+       'Export'                    => array( 'Експорт' ),
+       'Fewestrevisions'           => array( 'Найменшы_перевіркы' ),
+       'FileDuplicateSearch'       => array( 'Гляданя_дуплікатів_файлів' ),
+       'Filepath'                  => array( 'Стежка_до_файлу' ),
+       'Import'                    => array( 'Імпорт' ),
+       'Invalidateemail'           => array( 'Знеплатнити_імейл' ),
+       'BlockList'                 => array( 'Список_блоковань' ),
+       'LinkSearch'                => array( 'Гляданя_одказів' ),
+       'Listadmins'                => array( 'Список_адміністраторів' ),
+       'Listbots'                  => array( 'Список_ботів' ),
+       'Listfiles'                 => array( 'Список_файлів' ),
+       'Listgrouprights'           => array( 'Список_прав_ґруп' ),
+       'Listredirects'             => array( 'Список_напрямлїнь' ),
+       'Listusers'                 => array( 'Список_хоснователїв' ),
+       'Lockdb'                    => array( 'Заблоковати_датабазу' ),
+       'Log'                       => array( 'Журналы' ),
+       'Lonelypages'               => array( 'Ізолованы_сторінкы' ),
+       'Longpages'                 => array( 'Найдовшы_сторінкы' ),
+       'MergeHistory'              => array( 'Зєдинїня_історії' ),
+       'MIMEsearch'                => array( 'Гляданя_MIME' ),
+       'Mostcategories'            => array( 'Найкатеґорізованїшы' ),
+       'Mostimages'                => array( 'Найбівше_хоснованы_файлы' ),
+       'Mostlinkedcategories'      => array( 'Найвжыванїшы_катеґорії' ),
+       'Mostlinkedtemplates'       => array( 'Найвжыванїшы_шаблоны' ),
+       'Mostrevisions'             => array( 'Найбівше_ревізій' ),
+       'Movepage'                  => array( 'Переменовати' ),
+       'Mycontributions'           => array( 'Мій_вклад' ),
+       'Mypage'                    => array( 'Моя_сторінка' ),
+       'Mytalk'                    => array( 'Моя_діскузія' ),
+       'Myuploads'                 => array( 'Мої_награня_файлів' ),
+       'Newimages'                 => array( 'Новы_файлы' ),
+       'Newpages'                  => array( 'Новы_сторінкы' ),
+       'PasswordReset'             => array( 'Ресет_гесла' ),
+       'PermanentLink'             => array( 'Тырвалый_одказ' ),
+       'Popularpages'              => array( 'Популарны_сторінкы' ),
+       'Preferences'               => array( 'Наставлїня' ),
+       'Randompage'                => array( 'Нагодна_статя' ),
+       'Randomredirect'            => array( 'Нагодне_напрямлїня' ),
+       'Recentchanges'             => array( 'Послїднї_зміны' ),
+       'Recentchangeslinked'       => array( 'Повязаны_едітованя' ),
+       'Search'                    => array( 'Гляданя' ),
+       'Shortpages'                => array( 'Курты_сторінкы' ),
+       'Specialpages'              => array( 'Шпеціялны_сторінкы' ),
+       'Statistics'                => array( 'Штатістіка' ),
+       'Tags'                      => array( 'Позначкы' ),
+       'Unblock'                   => array( 'Одблоковати' ),
+       'Uncategorizedcategories'   => array( 'Некатеґорізованы_катеґорії' ),
+       'Uncategorizedimages'       => array( 'Некатеґорізованы_файлы' ),
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Підчарковати одказы:',
@@ -51,25 +125,25 @@ $messages = array(
 'tog-hidepatrolled' => 'Сховати патролёваны едітованя в списку послїднїх змін',
 'tog-newpageshidepatrolled' => 'Сховати патролёваны сторінкы зо списку новых сторінок',
 'tog-extendwatchlist' => 'Росшыреный список слїдованых сторінок, обсягує вшыткы зміны, не лем послїднї',
-'tog-usenewrc' => 'ХоÑ\81новаÑ\82и Ð·Ð´Ð¾ÐºÐ¾Ð½Ð°Ð»ÐµÐ½Ñ\8b Ð¿Ð¾Ñ\81лÑ\97днÑ\97 Ð·Ð¼Ñ\96нÑ\8b (JavaScript)',
+'tog-usenewrc' => 'Ð\92 Ð¿Ð¾Ñ\81лÑ\97днÑ\97Ñ\85 Ð·Ð¼Ñ\96наÑ\85 Ñ\96 Ñ\81лÑ\97дованÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 Ð·Ò\91Ñ\80Ñ\83поваÑ\82и Ð·Ð¼Ñ\96нÑ\8b Ð¿Ð¾ Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 (JavaScript)',
 'tog-numberheadings' => 'Автоматічно чісловати надписы',
 'tog-showtoolbar' => 'Вказати панел інштрументів (потрібный JavaScript)',
 'tog-editondblclick' => 'Едітовати двоїтым кликом (JavaScript)',
-'tog-editsection' => 'Ð\9fоволити едітованя секції сторінкы через одказ [едіт.]',
-'tog-editsectiononrightclick' => 'Ð\9fоволити едітованя секції сторінкы через кликаня правов клапков мышкы на надписы сторінок  (JavaScript)',
+'tog-editsection' => 'Ð\94озволити едітованя секції сторінкы через одказ [едіт.]',
+'tog-editsectiononrightclick' => 'Ð\94озволити едітованя секції сторінкы через кликаня правов клапков мышкы на надписы сторінок  (JavaScript)',
 'tog-showtoc' => 'Вказовати обсяг (на сторінках з веце як трёма надписами)',
 'tog-rememberpassword' => 'Запамятати моє приголошіня на тім переглядачу (максімално $1 {{PLURAL:$1|день|днів}})',
-'tog-watchcreations' => 'Придавати сторінкы створены мнов  до мого списку слїдованых',
-'tog-watchdefault' => 'Придавати мнов едітованы сторінкы до списку слїдованых',
-'tog-watchmoves' => 'Придавати переменованы сторінкы до мого списку слїдованых',
-'tog-watchdeletion' => 'Придавати сторінкы котры змажу, міджі слїдованы',
+'tog-watchcreations' => 'Придавати сторінкы створены мнов тай файлы мнов наладованы до мого списку слїдованых',
+'tog-watchdefault' => 'Придавати мнов едітованы сторінкы і файлы до списку слїдованых',
+'tog-watchmoves' => 'Придавати переменованы сторінкы і файлы до мого списку слїдованых',
+'tog-watchdeletion' => 'Придавати сторінкы і файлы, котры змажу, міджі слїдованы',
 'tog-minordefault' => 'Імпліцітно позначіти вшыткы зміны як малы',
 'tog-previewontop' => 'Вказовати нагляд перед окном едітованя  (не за ним)',
 'tog-previewonfirst' => 'Вказати нагляд при першій едітації',
 'tog-nocache' => 'Выпнути кешованя сторінок бровсером',
-'tog-enotifwatchlistpages' => 'Послати електронічну пошту, кідь ся змінила сторінка з мого списку слїдованя',
+'tog-enotifwatchlistpages' => 'Ð\9fоÑ\81лаÑ\82и ÐµÐ»ÐµÐºÑ\82Ñ\80онÑ\96Ñ\87нÑ\83 Ð¿Ð¾Ñ\88Ñ\82Ñ\83, ÐºÑ\96дÑ\8c Ñ\81Ñ\8f Ð·Ð¼Ñ\96нила Ñ\81Ñ\82оÑ\80Ñ\96нка Ð°Ð±Ð¾ Ñ\84айл Ð· Ð¼Ð¾Ð³Ð¾ Ñ\81пиÑ\81кÑ\83 Ñ\81лÑ\97дованÑ\8f',
 'tog-enotifusertalkpages' => 'Послати електронічну пошту при змінї моёй діскузной сторінкы',
-'tog-enotifminoredits' => 'Послати електронічну пошту і про меншы едітованя',
+'tog-enotifminoredits' => 'Послати електронічну пошту і про меншы едітованя сторінок і файлів',
 'tog-enotifrevealaddr' => 'Прозрадити мою поштову адресу в поштї  увідомлїня',
 'tog-shownumberswatching' => 'Вказати кілько хоснователїв придало сторінку до свого списку слїдованых',
 'tog-oldsig' => 'Екзістуючій підпис:',
@@ -179,7 +253,7 @@ $messages = array(
 'moredotdotdot' => 'Детайлнїше…',
 'mypage' => 'Моя сторінка',
 'mytalk' => 'Моя діскузія',
-'anontalk' => 'Діскузія ку тотїй IP-адресі',
+'anontalk' => 'Діскузія к тїй IP-адресї',
 'navigation' => 'Навіґація',
 'and' => '&#32;і',
 
@@ -198,7 +272,7 @@ $messages = array(
 'vector-action-addsection' => 'Придати тему',
 'vector-action-delete' => 'Вымазати',
 'vector-action-move' => 'Переменовати',
-'vector-action-protect' => 'Ð¥Ñ\80анити',
+'vector-action-protect' => 'Ð\92Ñ\81окоÑ\82ити',
 'vector-action-undelete' => 'Обновити',
 'vector-action-unprotect' => 'Змінити замок',
 'vector-simplesearch-preference' => 'Поволити росшырены пропозіції гляданя (лем взгляд Vector )',
@@ -222,7 +296,7 @@ $messages = array(
 'history' => 'Історія сторінкы',
 'history_short' => 'Історія',
 'updatedmarker' => 'змінено од послїдный навщівы',
-'printableversion' => 'Ð\92еÑ\80зÑ\96Ñ\8f Ð¿Ñ\80о Ð´Ñ\80Ñ\83к',
+'printableversion' => 'Ð\92еÑ\80зÑ\96Ñ\8f Ð´Ð¾ Ð´Ñ\80Ñ\83кÑ\83',
 'permalink' => 'Перманентный одказ',
 'print' => 'Друк',
 'view' => 'Видїти',
@@ -234,9 +308,9 @@ $messages = array(
 'deletethispage' => 'Змазати тоту сторінку',
 'undelete_short' => 'Обновити $1 {{PLURAL:$1|верзію|верзії|верзії}}',
 'viewdeleted_short' => 'Видїти {{PLURAL:$1|змазанов едітаціёв|$1 змазаны едітації|$1 змазаных едітацій}}',
-'protect' => 'Ð¥Ñ\80анити',
+'protect' => 'Ð\92Ñ\81окоÑ\82ити',
 'protect_change' => 'змінити',
-'protectthispage' => 'Ð¥Ñ\80анити тоту сторінку',
+'protectthispage' => 'СокоÑ\82ити тоту сторінку',
 'unprotect' => 'Змінити замок',
 'unprotectthispage' => 'Змінити замок той сторінкы',
 'newpage' => 'Нова сторінка',
@@ -245,18 +319,18 @@ $messages = array(
 'specialpage' => 'Шпеціална сторінка',
 'personaltools' => 'Особны інштрументы',
 'postcomment' => 'Нова секція',
-'articlepage' => 'Ð\9fеÑ\80еглÑ\8fднÑ\83ти сторінку',
+'articlepage' => 'Ð\9fоÑ\81моÑ\82Ñ\80ити сторінку',
 'talk' => 'Діскузія',
 'views' => 'Перегляды',
 'toolbox' => 'Інштрументы',
-'userpage' => 'Ð\92идÑ\97ти сторінку хоснователя',
-'projectpage' => 'Ð\92идÑ\97ти сторінку проєкту',
-'imagepage' => 'Ð\92идÑ\97ти сторінку файлу',
-'mediawikipage' => 'Ð\92идÑ\97ти сторінку повідомлїнь',
-'templatepage' => 'Ð\92идÑ\97ти шаблону',
-'viewhelppage' => 'Ð\92идÑ\97ти сторінку помочі',
-'categorypage' => 'Ð\92идÑ\97ти сторінку катеґорії',
-'viewtalkpage' => 'Ð\92идÑ\97ти діскузію',
+'userpage' => 'Ð\9fоÑ\81моÑ\82Ñ\80ити сторінку хоснователя',
+'projectpage' => 'Ð\9fоÑ\81моÑ\82Ñ\80ити сторінку проєкту',
+'imagepage' => 'Ð\9fоÑ\81моÑ\82Ñ\80ити сторінку файлу',
+'mediawikipage' => 'Ð\9fоÑ\81моÑ\82Ñ\80ити сторінку повідомлїнь',
+'templatepage' => 'Ð\9fоÑ\81моÑ\82Ñ\80ити шаблону',
+'viewhelppage' => 'Ð\9fоÑ\81моÑ\82Ñ\80ити сторінку помочі',
+'categorypage' => 'Ð\9fоÑ\81моÑ\82Ñ\80ити сторінку катеґорії',
+'viewtalkpage' => 'Ð\9fоÑ\81моÑ\82Ñ\80ити діскузію',
 'otherlanguages' => 'Іншыма языками',
 'redirectedfrom' => '(Напрямленый з $1)',
 'redirectpagesub' => 'Сторінка-напрямлїня',
@@ -276,15 +350,15 @@ $1',
 'pool-errorunknown' => 'Незнама хыба',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'O  {{grammar:accusative|{{SITENAME}}}}',
-'aboutpage' => 'Project:Описаня',
+'aboutsite' => 'О&nbsp;{{grammar:genitive|{{SITENAME}}}}',
+'aboutpage' => 'Project:{{SITENAME}}',
 'copyright' => 'Обсяг є доступный з $1.',
 'copyrightpage' => '{{ns:project}}:Авторьске право',
 'currentevents' => 'Актуалны подїї',
 'currentevents-url' => 'Project:Актуалны подїї',
-'disclaimers' => 'Ð\92Ñ\8bлÑ\83Ñ\87Ñ\96нÑ\8f Ð·Ð¾Ð´Ð¿Ð¾Ð²Ñ\96дноÑ\81Ñ\82и',
-'disclaimerpage' => 'Project:Ð\92Ñ\8bлÑ\83Ñ\87Ñ\96нÑ\8f Ð·Ð¾Ð´Ð¿Ð¾Ð²Ñ\96дноÑ\81Ñ\82и',
-'edithelp' => 'Ð\9fомÑ\96Ñ\87 Ð¿Ñ\80о ÐµÐ´Ñ\96Ñ\82ованÑ\8f',
+'disclaimers' => 'Вылучіня одповідности',
+'disclaimerpage' => 'Project:Вылучіня одповідности',
+'edithelp' => 'Поміч едітованя',
 'edithelppage' => 'Help:Едітованя',
 'helppage' => 'Help:Обсяг',
 'mainpage' => 'Головна сторінка',
@@ -292,12 +366,12 @@ $1',
 'policy-url' => 'Project:Правила',
 'portal' => 'Портал комуніты',
 'portal-url' => 'Project:Портал комуніты',
-'privacy' => 'Політіка охраны особных дат',
-'privacypage' => 'Project:Ð\9eÑ\85Ñ\80ана Ð¾Ñ\81обнÑ\8bÑ\85 Ð´Ð°Ñ\82',
+'privacy' => 'Політіка сокочіня пріватных дан',
+'privacypage' => 'Project:СокоÑ\87Ñ\96нÑ\8f Ð¿Ñ\80Ñ\96ваÑ\82нÑ\8bÑ\85 Ð´Ð°Ð½',
 
-'badaccess' => 'Ð¥Ñ\8bба Ð¾Ð¿Ñ\80авнÑ\97нÑ\8f',
-'badaccess-group0' => 'Ð\92ам Ð½Ðµ Ñ\94 Ð¿Ð¾волено выконавати тоту дїю.',
-'badaccess-groups' => 'Ð\94Ñ\97Ñ\8f, Ñ\8fкÑ\83 Ñ\81Ñ\8cÑ\82е Ñ\85оÑ\82Ñ\97ли Ð·Ñ\80обиÑ\82и, Ð¿Ð¾волена лем хоснователям із {{PLURAL:$2|ґрупы|ґруп}}: $1.',
+'badaccess' => 'Ð\91Ñ\80ак Ð¿Ñ\80ав Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пÑ\83',
+'badaccess-group0' => 'Ð\92ам Ð½Ðµ Ñ\94 Ð´Ð¾Ð·волено выконавати тоту дїю.',
+'badaccess-groups' => 'Ð\94Ñ\97Ñ\8f, Ñ\8fкÑ\83 Ñ\81Ñ\8cÑ\82е Ñ\85оÑ\82Ñ\97ли Ð·Ñ\80обиÑ\82и, Ð´Ð¾Ð·волена лем хоснователям із {{PLURAL:$2|ґрупы|ґруп}}: $1.',
 
 'versionrequired' => 'Потрібна MediaWiki верзії $1',
 'versionrequiredtext' => 'Про роботу з тов сторінков потрібна MediaWiki верзії $1. Відь [[Special:Version|сторінку верзії]].',
@@ -307,6 +381,10 @@ $1',
 'youhavenewmessages' => 'Маєте $1 ($2).',
 'newmessageslink' => 'новы повідомлїня',
 'newmessagesdifflink' => 'послїдня зміна',
+'youhavenewmessagesfromusers' => 'Мате $1 од {{PLURAL:$3|іншого хоснователя|$3 іншых хоснователїв}} ($2).',
+'youhavenewmessagesmanyusers' => 'Мате $1 од много далшых хоснователїв ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ное повідомлїня|новы повідомлїня}}',
+'newmessagesdifflinkplural' => 'остатня {{PLURAL:$1|зміна|зміны|змін}}',
 'youhavenewmessagesmulti' => 'Маєте новы ознамы на $1',
 'editsection' => 'едіт.',
 'editold' => 'едіт.',
@@ -329,9 +407,9 @@ $1',
 'site-atom-feed' => '$1 Atom канал',
 'page-rss-feed' => '"$1" RSS канал',
 'page-atom-feed' => '"$1" Atom канал',
-'red-link-title' => '$1 (Ñ\82ака Ñ\81Ñ\82оÑ\80Ñ\96нка Ð½Ðµ ÐµÐºÐ·Ñ\96Ñ\81Ñ\82Ñ\83Ñ\94)',
-'sort-descending' => 'Сортовати зоступно',
-'sort-ascending' => 'Сортовати взоступно',
+'red-link-title' => '$1 (Ñ\82акой Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b Ð½Ñ\97Ñ\82)',
+'sort-descending' => 'Сортовати спадаючі',
+'sort-ascending' => 'Сортовати ступаючі',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Сторінка',
@@ -349,7 +427,7 @@ $1',
 'nosuchaction' => 'Такой дїї не має',
 'nosuchactiontext' => 'Дїя, уведжена в URL, неправилна.
 Могли сьте неправилно написати URL або перейти через некоректный одказ .
-Може тыж значіти хыбу в програмовім забезпечіню {{GRAMMAR:genitive|{{SITENAME}}}}.',
+Може тыж значіти ґанч в проґрамовім забеспечіню {{GRAMMAR:genitive|{{SITENAME}}}}.',
 'nosuchspecialpage' => 'Такой шпеціалной сторінкы нїт',
 'nospecialpagetext' => '<strong>Така шпеціална сторінка не екзістує.</strong>
 
@@ -359,7 +437,7 @@ $1',
 'error' => 'Хыба',
 'databaseerror' => 'Датабазова хыба',
 'dberrortext' => 'Найджена  сінтактічна хыба в запросї до датабазы.
-Тото може вказовати на хыбу в проґрамовім забезпечіню.
+Тото може вказовати на хыбу в проґрамовім забеспечіню.
 Послїднїй запрос до датабазы:
 <blockquote><tt>$1</tt></blockquote>
 з функції "<tt>$2</tt>".
@@ -377,17 +455,17 @@ $1',
 Адміністратор, котрый датабазу замкнув, охабив тото пояснїня: $1',
 'missing-article' => 'В датабазї ся не нашов жаданый текст сторінкы «$1» $2.
 
-Подобна сітуація звычайно взникає при спробі переходу по застаралому одказованю на історію змін сторінкы, яка была вымазана.
+Подобна сітуація звычайно выникать при спробі переходу по застаралому одказованю на історію змін сторінкы, яка была вымазана.
 
-Кідь то не є тот припад, може сьте нашли помылку в проґрамовім забезпечіню.
+Кідь то не є тот припад, може сьте нашли помылку в проґрамовім забеспечіню.
 Просиме Вас, оголоште то [[Special:ListUsers/sysop|адміністраторам]], придайте і URL.',
 'missingarticle-rev' => '(ревізія № $1)',
 'missingarticle-diff' => '(Роздїл: $1, $2)',
 'readonly_lag' => 'Датабаза автоматічно заблокована од змін, докы ся другый датабазовый сервер не сінхронізує з мастером',
 'internalerror' => 'Інтерна хыба',
 'internalerror_info' => 'Інтерна хыба: $1',
-'fileappenderrorread' => 'Ð\92 Ñ\87аÑ\81Ñ\97 Ð¿Ñ\80идаванÑ\8f Ñ\81Ñ\8f Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ило прочітати  "$1".',
-'fileappenderror' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило ся придати «$1» до «$2».',
+'fileappenderrorread' => 'Ð\92 Ñ\87аÑ\81Ñ\97 Ð¿Ñ\80идаванÑ\8f Ñ\81Ñ\8f Ð½Ðµ Ð²Ð´Ð°ло прочітати  "$1".',
+'fileappenderror' => 'Ð\9dе Ð²Ð´Ð°ло ся придати «$1» до «$2».',
 'filecopyerror' => 'Не было можне копіровати файл «$1» на «$2».',
 'filerenameerror' => 'Не было можне переменовати файл «$1» на «$2».',
 'filedeleteerror' => 'Не было можне змазаты файл «$1».',
@@ -400,6 +478,7 @@ $1',
 'cannotdelete' => 'Не є можне вымазати сторінку або файл "$1".
 Може уж быв(а)  змазаный(а) дакым іншым.',
 'cannotdelete-title' => 'Не годен змазати сторінку "$1"',
+'delete-hook-aborted' => 'Едітованя было сторноване процедуров пунктом припоёваня без близшого пояснїня.',
 'badtitle' => 'Неприпустна назва',
 'badtitletext' => 'Пожадована назва сторінкы неправилна, порожня, або неправилно одказована як міджі-язычного ці міджі-вікі назва.
 Може ся хоснують сімболы, котры не можуть быти хоснованы в назвах.',
@@ -410,13 +489,13 @@ $1',
 Функція: $1<br />
 Запрос: $2',
 'viewsource' => 'Видїти код',
-'viewsource-title' => 'Відїти жрідло сторінкы $1',
+'viewsource-title' => 'Видїти жрідло сторінкы $1',
 'actionthrottled' => 'Акція была придушена',
 'actionthrottledtext' => 'Взглядом ку протиспамовым опатрїням не можете жадану акцію провести барз часто в короткім часї. Спробуйте то знову о пару мінут.',
 'protectedpagetext' => 'Тота сторінка была замкнута, также ся не дасть едітовати',
 'viewsourcetext' => 'Можете видїти і копіровати код той сторінкы:',
 'viewyourtext' => "Можете собі посмотрити і скопіровати жрідловый текст '''вашых змін''' той сторінкы:",
-'protectedinterface' => 'Тота сторінка є частинов інтрефейсу проґрамового забезпечіня і єй можуть едітовати лем адміністраторы проєкту.',
+'protectedinterface' => 'Тота сторінка є частёв інтрефейсу проґрамового забеспечіня і єй можуть едітовати лем адміністраторы проєкту.',
 'editinginterface' => "'''Увага:''' Едітуєте сторінку,котра є частинов текстового інтерфейсу. Зміны той сторінкы выкличуть зміну інтерфейсу про іншых хоснователїв. Про переклад увідомлїня хоснуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проєкт, што ся занимає локалізаціёв MediaWiki.",
 'sqlhidden' => '(SQL запрос скрытый)',
 'cascadeprotected' => 'Сторінка є замнкута, бо є вложена до  {{PLURAL:$1|наслїдуючой сторінкы замкнуты|наслїдуючіх сторінок замнкнутых|наслїдуючіх сторінок замнкнутых}} каскадовым замком:
@@ -426,10 +505,17 @@ $2',
 'customjsprotected' => 'Не маєте права едітовати тоту сторінку з JavaScript-ом, бо обсягує персоналны наставлїна іншого хоснователя.',
 'ns-specialprotected' => 'Шпеціалны сторінкы не є можне едітовати.',
 'titleprotected' => "Створїня сторінкы з таков назвов было заборонене хоснователём [[User:$1|$1]] з причінов: ''$2''.",
+'filereadonlyerror' => "Не годно змінити файл „$1“, бо архів файлів „$2“ є теперь лем на чітаня.
+
+Адміністратор сервера, котрый архів заблоковав, додав тото пояснїня: „''$3''“.",
+'invalidtitle-knownnamespace' => 'Непряавилна назва в просторї назв „$2“ і текстом „$3“',
+'invalidtitle-unknownnamespace' => 'Неправилна назва з незнамым чіслом простору назв $1 і текстом „$2“',
+'exception-nologin' => 'Не сьте приголошеный(а)',
+'exception-nologin-text' => 'Гевся сторінка або дїя потребує, жебы сьте были на тотїй вікі приголошены.',
 
 # Virus scanner
 'virus-badscanner' => "Зла конфіґурація: незнамый антивіровый проґрам: ''$1''",
-'virus-scanfailed' => 'Ñ\81кенованÑ\8f Ñ\81Ñ\8f Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ило (код $1)',
+'virus-scanfailed' => 'Ñ\81кенованÑ\8f Ñ\81Ñ\8f Ð½Ðµ Ð²Ð´Ð°ло (код $1)',
 'virus-unknownscanner' => 'незнамый антівірус',
 
 # Login and logout pages
@@ -439,16 +525,17 @@ $2',
 'welcomecreation' => '== Вітаєме вас, $1! ==
 Ваше конто было вытворене.
 Не забудьте змінити свої [[Special:Preferences|наставлїня сайту]].',
-'yourname' => 'Ð\9cено хоснователя:',
+'yourname' => 'Ð\86мÑ\8f хоснователя:',
 'yourpassword' => 'Гесло:',
 'yourpasswordagain' => 'Повторяйте гесло:',
 'remembermypassword' => 'Запамятати моє приголошіня на тім компютерї (максімално $1 {{PLURAL:$1|день|днів}})',
 'securelogin-stick-https' => 'Останьте  припоєны через HTTPS по приголошіню',
 'yourdomainname' => 'Ваша домена:',
-'externaldberror' => 'Або ся стала хыба екстерной автентіфікачной датабазы, або не маєте поволено мінити своє екстерне конто.',
+'password-change-forbidden' => 'На тій вікі не можете мінити гесла.',
+'externaldberror' => 'Або ся стала хыба екстерной автентіфікачной датабазы, або не маєте дозволено мінити своє екстерне конто.',
 'login' => 'Приголошіня',
 'nav-login-createaccount' => 'Приголошіня / створїня конта',
-'loginprompt' => 'Ку приголошіню до {{grammar:2sg|{{SITENAME}}}} мусите мати поволены cookies.',
+'loginprompt' => 'К приголошіню до {{grammar:2sg|{{SITENAME}}}} мусите мати актівованы cookies.',
 'userlogin' => 'Приголошіня / створїня конта',
 'userloginnocreate' => 'Приголошіня',
 'logout' => 'Одголосити',
@@ -459,20 +546,20 @@ $2',
 'createaccount' => 'Вытворити конто',
 'gotaccount' => "Уж сьте реґістрованы? '''$1'''.",
 'gotaccountlink' => 'Приголошіня',
-'userlogin-resetlink' => 'Забыли сьте вашы дата про приголошіня?',
+'userlogin-resetlink' => 'Забыли сьте вашы даны на приголошіня?',
 'createaccountmail' => 'електроничнов поштов',
 'createaccountreason' => 'Причіна:',
 'badretype' => 'Вами написаны гесла не сугласять.',
 'userexists' => 'Уведжене імя хоснователя ся уж хоснує.
 Просиме, выберьте інше імя.',
 'loginerror' => 'Хыба при приголошованю',
-'createaccounterror' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило ся створити конто хоснователя: $1',
+'createaccounterror' => 'Ð\9dе Ð²Ð´Ð°ло ся створити конто хоснователя: $1',
 'nocookiesnew' => 'Конто хоснователя было створене, але не сьте приголошены.
 {{SITENAME}} хоснує cookies про приголошіня але вы маєте cookies выпнуты .
 Просиме Вас, повольте їх, а потім ся приголоште знову з вашым новым меном і геслом.',
 'nocookieslogin' => '{{SITENAME}} хоснує cookies про приголошіня хоснователїв. Вы маєте cookies выпнуты. Просиме Вас, повольте їх і спобуйте знова.',
-'nocookiesfornew' => 'Конто хоснователя не было створене, бо сьме не были годны підтветдити ёго походжіня.
-УÑ\82веÑ\80диÑ\82е Ñ\81Ñ\8f, Ð¶Ðµ Ð¼Ð°Ñ\94Ñ\82е Ð¿Ð¾волены cookies, обновте тоту сторінку і спробуйте то знову.',
+'nocookiesfornew' => 'Конто хоснователя не было створене, бо сьме не были годны потвердити ёго походжіня.
+УÑ\82веÑ\80диÑ\82е Ñ\81Ñ\8f, Ð¶Ðµ Ð¼Ð°Ñ\94Ñ\82е Ð´Ð¾Ð·волены cookies, обновте тоту сторінку і спробуйте то знову.',
 'noname' => 'Мусите увести мено свого конта.',
 'loginsuccesstitle' => 'Успішне приголошіня',
 'loginsuccess' => "'''Теперь працуєте {{grammar:locative|{{SITENAME}}}} під меном $1.'''",
@@ -480,7 +567,7 @@ $2',
 'nosuchusershort' => 'Хоснователь з меном $1 не екзістує.
 Перевірте правилность написаня мена.',
 'nouserspecified' => 'Мусите задати мено хоснователя.',
-'login-userblocked' => 'Тот хоснователь є заблокованый. Приголошіня не є доволене.',
+'login-userblocked' => 'ТоÑ\82 Ñ\85оÑ\81новаÑ\82елÑ\8c Ñ\94 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ\8bй. Ð\9fÑ\80иголоÑ\88Ñ\96нÑ\8f Ð½Ðµ Ñ\94 Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ðµ.',
 'wrongpassword' => 'Задали сьте хыбне гесло. Спробуйте іщі раз.',
 'wrongpasswordempty' => 'Было задане порожнє гесло. Спробуйте іщі раз.',
 'passwordtooshort' => 'Гесло мусить быти довге холем  $1 {{PLURAL:$1|знак|знакы|знаків}}.',
@@ -501,19 +588,20 @@ $2',
 'noemailcreate' => 'Мусите задати правилну адресу електронічной пошты',
 'passwordsent' => 'Нове гесло было послане на адресу електронічной пошты реґістровану про „$1“. Приголосьте ся зясь, кідь го обтримете.',
 'blocked-mailpassword' => 'Вашій IP адресї была заблокована можность едітації і сучасно з тым є заблокована функція про засланя нового гесла.',
-'eauthentsent' => 'На задану адресу електронічной пошты было послане підтверджіня,
-Передтым як вам на тоту адресу буде мочі быти засылана далша пошта, наслїдуйте інштрукції в ел. пошті, жебы сьте підтвердили, же тота адреса справды належыть вам.',
-'throttled-mailpassword' => 'Ð\93еÑ\81ло Ñ\83ж Ð±Ñ\8bло Ñ\80аз Ð·Ð°Ñ\81лане Ð¿Ð¾Ñ\87аÑ\81 уплынулых $1 годин.
+'eauthentsent' => 'На задану адресу електронічной пошты было послане потверджіня,
+Передтым як вам на тоту адресу буде мочі быти засылана далша пошта, слїдуйте інштрукції в ел. пошті, жебы сьте потвердили, же тота адреса справды належыть вам.',
+'throttled-mailpassword' => 'Ð\93еÑ\81ло Ñ\83ж Ð±Ñ\8bло Ñ\80аз Ð·Ð°Ñ\81лане Ð±Ñ\96гом уплынулых $1 годин.
 Гесло може быти заслане лем раз за $1 {{PLURAL:$1|годину|годины|годин}}.',
 'mailerror' => 'Хыба засыланя ел. пошты: $1',
-'acct_creation_throttle_hit' => 'ХоÑ\81новаÑ\82елÑ\97 Ð¿Ñ\80иÑ\85одÑ\8fÑ\87Ñ\96 Ð· Ð²Ð°Ñ\88ой IP Ð°Ð´Ñ\80еÑ\81Ñ\8b Ñ\83ж Ð´Ð½ÐµÑ\81Ñ\8c Ñ\81Ñ\82воÑ\80или {{PLURAL:$1|конÑ\82о|конÑ\82а|конÑ\82}}, Ñ\88Ñ\82о Ñ\94 Ð´Ð¾Ð²Ð¾Ð»ÐµÐ½Ðµ Ð¼Ð°ÐºÑ\81Ñ\96мÑ\83м. Ð\97аÑ\82о Ñ\82епеÑ\80Ñ\8c Ð½Ðµ Ñ\94 Ð´Ð¾волено з той IP адресы закладати далшы конта.',
+'acct_creation_throttle_hit' => 'ХоÑ\81новаÑ\82елÑ\97 Ð¿Ñ\80иÑ\85одÑ\8fÑ\87Ñ\96 Ð· Ð²Ð°Ñ\88ой IP Ð°Ð´Ñ\80еÑ\81Ñ\8b Ñ\83ж Ð´Ð½ÐµÑ\81Ñ\8c Ñ\81Ñ\82воÑ\80или {{PLURAL:$1|конÑ\82о|конÑ\82а|конÑ\82}}, Ñ\88Ñ\82о Ñ\94 Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ðµ Ð¼Ð°ÐºÑ\81Ñ\96мÑ\83м. Ð\97аÑ\82о Ñ\82епеÑ\80Ñ\8c Ð½Ðµ Ñ\94 Ð´Ð¾Ð·волено з той IP адресы закладати далшы конта.',
 'emailauthenticated' => 'Адреса вашой ел. пошты была овірена дня $2 о $3.',
 'emailnotauthenticated' => 'Адреса вашой ел. пошты дотеперь не была овірена, функції ел. пошты суть недоступны.',
 'noemailprefs' => 'Шпеціфікуйте адресу ел. пошты, жебы наслїднуючі можности могли фунґовати.',
-'emailconfirmlink' => 'Підтвердьте свою адресу ел. пошты',
+'emailconfirmlink' => 'Потвердьте свою адресу ел. пошты',
 'invalidemailaddress' => 'Уведена адреса ел. пошты не може быти прията, бо она не має правилный формат.
 Просиме Вас, уведьте коректну адесу або зохабте поле порожнє.',
 'cannotchangeemail' => 'В тій вікі не годен мінити імейловы адресы.',
+'emaildisabled' => 'Сесь сервер не годен одосылати імейлы.',
 'accountcreated' => 'Конто вытворене',
 'accountcreatedtext' => 'Конто хоснователя $1 было вытворене.',
 'createaccount-title' => 'Вытвориня конта про  {{SITENAME}}',
@@ -523,7 +611,7 @@ $2',
 'usernamehasherror' => 'Мено хоснователя не сміє обсяговати сімбол мережка (#)',
 'login-throttled' => 'Зробили сьте дуже много спроб о приголошіня.
 Просиме Вас, почекайте перед далшов спробов.',
-'login-abort-generic' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило ся войти до сістемы.',
+'login-abort-generic' => 'Ð\9dе Ð²Ð´Ð°ло ся войти до сістемы.',
 'loginlanguagelabel' => 'Язык: $1',
 'suspicious-userlogout' => 'Ваша пожадавка на одголошіня была одвергнута, бо вызерає то так, же была послана розбитым переглядачом або кешуючім проксі-сервером.',
 
@@ -582,7 +670,7 @@ $2
 Дочасне гесло: $2',
 'passwordreset-emailsent' => 'Імейл з геслом быв посланый.',
 'passwordreset-emailsent-capture' => 'Быв выґенерованый припоминаючій імейл, котрый є указаный ниже.',
-'passwordreset-emailerror-capture' => 'Ð\91Ñ\8bв Ð²Ñ\8bÒ\91енеÑ\80ованÑ\8bй Ð¿Ñ\80ипоминаÑ\8eÑ\87Ñ\96й Ñ\96мейл, ÐºÐ¾Ñ\82Ñ\80Ñ\8bй Ñ\94 Ñ\83казанÑ\8bй Ð½Ð¸Ð¶Ðµ, Ð°Ð»Ðµ Ð¾Ð´Ð¾Ñ\81лаÑ\82и Ñ\85оÑ\81новаÑ\82елÑ\91ви Ñ\81Ñ\8f Ð³Ð¾ Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ило: $1',
+'passwordreset-emailerror-capture' => 'Ð\91Ñ\8bв Ð²Ñ\8bÒ\91енеÑ\80ованÑ\8bй Ð¿Ñ\80ипоминаÑ\8eÑ\87Ñ\96й Ñ\96мейл, ÐºÐ¾Ñ\82Ñ\80Ñ\8bй Ñ\94 Ñ\83казанÑ\8bй Ð½Ð¸Ð¶Ðµ, Ð°Ð»Ðµ Ð¾Ð´Ð¾Ñ\81лаÑ\82и Ñ\85оÑ\81новаÑ\82елÑ\91ви Ñ\81Ñ\8f Ð³Ð¾ Ð½Ðµ Ð²Ð´Ð°ло: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Зміна імейловой адресы',
@@ -596,7 +684,7 @@ $2
 'changeemail-cancel' => 'Сторно',
 
 # Edit page toolbar
-'bold_sample' => 'Тучный текст',
+'bold_sample' => 'Товстый текст',
 'bold_tip' => 'Шырокый текст',
 'italic_sample' => 'Курсива',
 'italic_tip' => 'Курсива',
@@ -660,8 +748,8 @@ $2
 Просиме Вас, пиште тоты детайлы во вшыткых запытах на адміністратора.",
 'blockednoreason' => 'причіна не была задана',
 'whitelistedittext' => 'Про едітованя ся мусите $1.',
-'confirmedittext' => 'Мусите підтвердити вашу адресу ел. пошты передтым як будете едітовати сторінкы.
-На сторінцї [[Special:Preferences|наставлїня]] задайте і зохабте собі підтвердити свою адресу ел. пошты.',
+'confirmedittext' => 'Мусите потвердити вашу адресу ел. пошты передтым як будете едітовати сторінкы.
+На сторінцї [[Special:Preferences|наставлїня]] задайте і зохабте собі потвердити свою адресу ел. пошты.',
 'nosuchsectiontitle' => 'Секція ненайдена',
 'nosuchsectiontext' => 'Пробуєте едітовати секцію, котра не екзістує.
 Може была переменована або змазана, покы сьте перезерали сторінку.',
@@ -669,8 +757,8 @@ $2
 'loginreqlink' => 'Приголосити ся',
 'loginreqpagetext' => 'Ку перезераню іншых сторінок ся мусите $1.',
 'accmailtitle' => 'Гесло одослане.',
-'accmailtext' => 'Ð\9dагодно выґенероване гесло про хоснователя [[User talk:$1|$1]] было послане на $2.
-Гесло того нового конта буде можне по приголошіню змінити на [[Special:ChangePassword|сторінцї про зміну гесла]].',
+'accmailtext' => 'ТÑ\80аÑ\84Ñ\83нково выґенероване гесло про хоснователя [[User talk:$1|$1]] было послане на $2.
+Гесло того нового конта буде мочі по приголошіню змінити на [[Special:ChangePassword|сторінцї про зміну гесла]].',
 'newarticle' => '(Нова)',
 'newarticletext' => "Перешли сте на сторінку, котра іщі не екзістує.
 Нову сторінку створите так, же зачнете писати в окнї ниже (вид. [[{{MediaWiki:Helppage}}|сторінка помочі]], про вецей інформації).
@@ -683,11 +771,15 @@ $2
 'noarticletext-nopermission' => 'Теперь на тїй сторінцї не є текст.
 Можете [[Special:Search/{{PAGENAME}}|глядати тоту назву]] в іншых сторінках,
 або <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} глядати в лоґах]</span>.',
+'missing-revision' => 'Ревізія #$1 сторінкы з назвов „{{PAGENAME}}“ не є.
+
+Гевсе звычайно запрічінене так, же наслїдовали сьте застарїлый історічный одказ на сторінку, котра была уж змазана.
+Детайлы можуть быти найджены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} книзї змазаных сторінок].',
 'userpage-userdoesnotexist' => 'Хосновательске конто під назвов  "<nowiki>$1</nowiki>" не є реґістроване. Сконтролюйте ці хочете вытворити/едітовати тоту сторінку.',
 'userpage-userdoesnotexist-view' => 'Хосновательске конто „$1 не є реґістроване.',
 'blocked-notice-logextract' => 'Тот хоснователь є теперь блокованый.
 Послїднїй запис в лоґах блоковань є такый:',
-'clearyourcache' => "'''Позначка: По уложіню мусите вымазати кеш вашого перезерача, інакше зміны не будете відїти.'''
+'clearyourcache' => "'''Позначка: По уложіню мусите вымазати кеш вашого перезерача, інакше зміны не будете видїти.'''
 '''Mozilla / Firefox / Safari:''' При кликнутю на ''Актуалізовати'' тримайте ''Shift'', або стиснийте ''Ctrl-F5'' або ''Ctrl-R'' (на Macintosh ''Command-R'');
 '''Konqueror''': Кликнийте на ''Актуалізовати'' або стиснийте ''F5'';
 '''Opera:''' Вымажте обсяг кеш в меню ''Інштрументы → Наставлїня'';
@@ -706,15 +798,16 @@ $2
 'note' => "'''Позначка:'''&nbsp;",
 'previewnote' => "'''Памятайте, же то лем нагляд.'''
 Зміны іщі не суть уложены!",
+'continue-editing' => 'Продовжыти едітованя',
 'previewconflict' => 'Тот нагляд зображує текст так, як буде вызерати по уложіню сторінкы.',
-'session_fail_preview' => "'''Вашу пожадавку ся не подарило зпрацовати, бо были страчены дата сеансу.
+'session_fail_preview' => "'''Вашу пожадавку ся не удало спрацовати, бо были страчены дата сеансу.
 Просиме, спробуйте то зясь.
\9aÑ\96дÑ\8c Ñ\81Ñ\8f Ñ\82оÑ\82 Ð¿Ñ\80облем Ð±Ñ\83де Ð¾Ð¿Ð°ÐºÐ¾Ð²Ð°Ñ\82и, Ñ\81пÑ\80обÑ\83йÑ\82е Ñ\81Ñ\8f [[Special:UserLogout|одголоÑ\81иÑ\82и]] Ñ\96 Ð·Ð½Ð¾Ð²Ñ\83 Ð¿Ñ\80иголоÑ\81иÑ\82и Ð´Ð¾ Ñ\81Ñ\96Ñ\81Ñ\82емÑ\83.'''",
-'session_fail_preview_html' => "'''Вашу пожадавку ся не подарило зпрацовати, бо были страчены дата сеансу..'''
\9aÑ\96дÑ\8c Ñ\81Ñ\8f Ñ\82оÑ\82 Ð¿Ñ\80облем Ð±Ñ\83де Ð¾Ð¿Ð°ÐºÐ¾Ð²Ð°Ñ\82и, Ñ\81пÑ\80обÑ\83йÑ\82е Ñ\81Ñ\8f [[Special:UserLogout|одголоÑ\81иÑ\82и]] Ñ\96 Ð·Ð½Ð¾Ð²Ñ\83 Ð¿Ñ\80иголоÑ\81иÑ\82и Ð´Ð¾ Ñ\81Ñ\96Ñ\81Ñ\82емÑ\8b.'''",
+'session_fail_preview_html' => "'''Вашу пожадавку ся не удало спрацовати, бо были страчены дата сеансу..'''
 
-''Зато же {{SITENAME}} має запнуте хоснованя чістого HTML, нагляд ся про превенцію проти утокам JavaScript-ом не зображує.''
+''Зато же {{SITENAME}} має запнуте хоснованя чістого HTML, нагляд ся про превенцію проти атакам JavaScript-ом не зображує.''
 
-'''Ð\9aÑ\96дÑ\8c Ñ\96де Ð¾ Ñ\80Ñ\8fднÑ\83 ÐµÐ´Ñ\96Ñ\82аÑ\86Ñ\96Ñ\8e, Ñ\81пÑ\80обÑ\83йÑ\82е Ñ\82о Ð·Ð½Ð¾Ð²Ñ\83. Ð\9aÑ\96дÑ\8c Ñ\81Ñ\8f Ñ\82оÑ\82 Ð¿Ñ\80облем Ð±Ñ\83де Ð¾Ð¿Ð°ÐºÐ¾Ð²Ð°Ñ\82и, Ñ\81пÑ\80обÑ\83йÑ\82е Ñ\81Ñ\8f [[Special:UserLogout|одголоÑ\81иÑ\82и]] Ñ\96 Ð·Ð½Ð¾Ð²Ñ\83 Ð¿Ñ\80иголоÑ\81иÑ\82и Ð´Ð¾ Ñ\81Ñ\96Ñ\81Ñ\82емÑ\83.'''",
+'''Ð\9aÑ\96дÑ\8c Ñ\96де Ð¾ Ñ\80Ñ\8fднÑ\83 ÐµÐ´Ñ\96Ñ\82аÑ\86Ñ\96Ñ\8e, Ñ\81пÑ\80обÑ\83йÑ\82е Ñ\82о Ð·Ð½Ð¾Ð²Ñ\83. Ð\9aÑ\96дÑ\8c Ñ\81Ñ\8f Ñ\82оÑ\82 Ð¿Ñ\80облем Ð±Ñ\83де Ð¿Ð¾Ð²Ñ\82оÑ\80иÑ\82и, Ñ\81пÑ\80обÑ\83йÑ\82е Ñ\81Ñ\8f [[Special:UserLogout|одголоÑ\81иÑ\82и]] Ñ\96 Ð·Ð½Ð¾Ð²Ñ\83 Ð¿Ñ\80иголоÑ\81иÑ\82и Ð´Ð¾ Ñ\81Ñ\96Ñ\81Ñ\82емÑ\8b.'''",
 'token_suffix_mismatch' => "'''Ваша едітація не была схвалена, бо ваш вебовый переглядач комолить дакотры знакы в едітованім текстї.
 Едітація не была схвалена, жебы ся заборонило пошкоджіню тексту сторінкы.
 Тото ся може даколи стати, кідь хоснуєте хыбный вебовый анонімізер.'''",
@@ -731,16 +824,16 @@ $2
 '''Лем''' выше вказаный текст зістане ухованый по кликнутю на  „{{int:savearticle}}“.",
 'yourtext' => 'Ваш текст',
 'storedversion' => 'Уложена верзія',
-'nonunicodebrowser' => "'''Увага: Ваш переглядач не є способный працовати із знаками Unicode. Абы сьте могли тоту сторінку безпечно едітовати: вшыткы знакы мімо  ASCII суть зображены в гексадецімалных кодах.'''",
+'nonunicodebrowser' => "'''Увага: Ваш переглядач не є способный працовати із знаками Unicode. Абы сьте могли тоту сторінку беспечно едітовати: вшыткы знакы мімо  ASCII суть зображены в гексадецімалных кодах.'''",
 'editingold' => "'''Увага: Нынї едітуєте застаралу верзію той сторінкы. Кідь єй уложыте, вшыткы пізнїшы зміны ся стратять.'''",
 'yourdiff' => 'Роздїлы',
-'copyrightwarning' => "Просиме Вас, уважте, што вшыткы додаваня і зміны до {{grammar:genitive|{{SITENAME}}}} будуть выпущены під ліценціёв $2 (від. $1).
+'copyrightwarning' => "Просиме Вас, уважте, што вшыткы додаваня і зміны до {{grammar:genitive|{{SITENAME}}}} будуть выпущены під ліценціов $2 (від. $1).
 Кідь не хочете, жебы написане вами ся немилосердно едітовало і шырило, пак ту не пиште.<br />
-Вы тыж підтверджуєте, што написане вами ту належыть вам або взяте із жрідла, што є  верейным ці вольным жрідлом.
-'''Ð\9dÐ\95 Ð\9fУÐ\91Ð\9bÐ\86Ð\9aУÐ\99ТÐ\95 Ð¢Ð£ Ð\91Ð\95Ð\97 Ð\9fÐ\9eÐ\92Ð\9eÐ\9bÐ\87Ð\9dЯ Ð\9cÐ\90ТÐ\95РÐ\86Ð\90Ð\9bЫ, Ð¨Ð¢Ð\9e Ð¡Ð¯ Ð\9eХРÐ\90Ð\9dЮЮТЬ АВТОРЬСКЫМ ПРАВОМ!''",
+Вы тыж потверджуєте, што написане вами ту належыть вам або взяте із жрідла, што є  публічным ці вольным жрідлом.
+'''Ð\9dÐ\95 Ð\9fУÐ\91Ð\9bÐ\86Ð\9aУÐ\99ТÐ\95 Ð¢Ð£ Ð\91Ð\95Ð\97 Ð\94Ð\9eÐ\97Ð\92Ð\9eÐ\9bÐ\87Ð\9dЯ Ð\9cÐ\90ТÐ\95РÐ\86Ð\90Ð\9bЫ, Ð¨Ð¢Ð\9e Ð¡Ð¯ Ð¡Ð\9eÐ\9aÐ\9eТЯТЬ АВТОРЬСКЫМ ПРАВОМ!''",
 'copyrightwarning2' => "Просиме Вас, уважте, што вшыткы додаваня і зміны до  {{grammar:2sg|{{SITENAME}}}} можуть быти другыма хоснователями управлены, змінены ці одстранены. Покы собі не желате, жебы ваш текст быв немилосердно управляный, пак го до {{grammar:2sg|{{SITENAME}}}} не укладайте.<br />
 Уложінём приспевку ся завязуєте, же є вашым дїлом або є скопірованый із жрідел, котры не суть хоронены авторьскым правом (тзв. <em>public domain</em>), детайлы найдете на $1. '''Не копіруйте дїла хоронены авторьскым правом без дозволїня!'''",
-'longpageerror' => "'''ХЫÐ\91Ð\90: Ð\9fÑ\80обÑ\83Ñ\94Ñ\82е Ñ\83ложÑ\8bÑ\82и Ñ\82екÑ\81Ñ\82 Ð¾ Ð²ÐµÐ»Ð¸ÐºÐ¾Ñ\81Ñ\82и {{PLURAL:$1|$1 Ð\9aÑ\96Ð\91}}, Ð¿Ñ\80иÑ\87Ñ\96м Ð´Ð¾волене максімум є {{PLURAL:$2|$2 КіБ}}. Ваша едітація не може быти уложена.'''",
+'longpageerror' => "'''ХЫÐ\91Ð\90: Ð\9fÑ\80обÑ\83Ñ\94Ñ\82е Ñ\83ложÑ\8bÑ\82и Ñ\82екÑ\81Ñ\82 Ð¾ Ð²ÐµÐ»Ð¸ÐºÐ¾Ñ\81Ñ\82и {{PLURAL:$1|$1 Ð\9aÑ\96Ð\91}}, Ð°Ð»Ðµ Ð´Ð¾Ð·волене максімум є {{PLURAL:$2|$2 КіБ}}. Ваша едітація не може быти уложена.'''",
 'readonlywarning' => "'''УВАГА: Датабаза была замкнута про утримованя, также не будете мочі уложыти свої зміны. Можете сі го окопіровати до файлу і уложыти го пізнїше.'''
 
 Адміністратор сервера, котрый датабазу замкнув, зохабив тото пояснїня: $1",
@@ -754,8 +847,8 @@ $2
 'templatesused' => '{{PLURAL:$1|Шаблона, хоснована|Шаблоны, хоснованы}} на тій сторінці:',
 'templatesusedpreview' => '{{PLURAL:$1|Шаблона, хоснована|Шаблоны, хоснованы}} у тім перегляді:',
 'templatesusedsection' => '{{PLURAL:$1|Шаблона, хоснована|Шаблоны, хоснованы}} у тій секції:',
-'template-protected' => '(хранена)',
-'template-semiprotected' => '(частково хранено)',
+'template-protected' => '(всокочена)',
+'template-semiprotected' => '(частково всокочене)',
 'hiddencategories' => 'Тота сторінка належыть до $1 {{PLURAL:$1|схованa катеґорія|схованы катеґорії|схованых катеґорій}}:',
 'nocreatetitle' => 'Створїня сторінок обмеджено',
 'nocreatetext' => 'На {{grammar:6sg|{{SITENAME}}}} є можливость створїна новых сторінок обмеджена.
@@ -765,7 +858,7 @@ $2
 'sectioneditnotsupported-text' => 'На тій сторінцї не є підпороване едітованя єдной секції.',
 'permissionserrors' => 'Хыба оправнїня',
 'permissionserrorstext' => 'Не маєте поволїня той операції з  {{PLURAL:$1|такой причіны|такых причін}}:',
-'permissionserrorstext-withaction' => 'Ð\9dе Ð¼Ð°Ñ\94Ñ\82е Ð¿Ð¾Ð²Ð¾Ð»Ñ\97нÑ\8f Ð½Ð° $2 Ð· {{PLURAL:$1|Ñ\82акой Ð¿Ñ\80иÑ\87Ñ\96нÑ\8b\82акÑ\8bÑ\85 Ð¿Ñ\80ичін}}:',
+'permissionserrorstext-withaction' => 'Ð\9dе Ð¼Ð°Ñ\94Ñ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\97нÑ\8f Ð½Ð° $2 Ð· {{PLURAL:$1|Ñ\82акой Ð¿Ñ\80Ñ\96Ñ\87Ñ\96нÑ\8b\82акÑ\8bÑ\85 Ð¿Ñ\80Ñ\96чін}}:',
 'recreate-moveddeleted-warn' => "'''Увага: Пробуєте знову створити сторінку, котра была в минулости змазана.'''
 
 Уважте, ці справды треба знову створити тоту сторінку.
@@ -774,26 +867,33 @@ $2
 Запис змазаня а переменованя сі можете посмотрити ниже.',
 'log-fulllog' => 'Зобразити вшыток запис',
 'edit-hook-aborted' => 'Едітованя было сторноване процедуров без близшого пояснїня.',
-'edit-gone-missing' => 'СÑ\82оÑ\80Ñ\96нкÑ\83 Ñ\81Ñ\8f Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ило обновити.
+'edit-gone-missing' => 'СÑ\82оÑ\80Ñ\96нкÑ\83 Ñ\81Ñ\8f Ð½Ðµ Ð²Ð´Ð°ло обновити.
 Асі была змазана.',
 'edit-conflict' => 'Конфлікт едітованя.',
-'edit-no-change' => 'Ваша едітація была іґнорована, бо не дішло ку жадній змінї тексту.',
-'edit-already-exists' => 'Не подарило ся створити нову сторінку, бо она уж екзістує.',
+'edit-no-change' => 'Ваша едітація была іґнорована, бо ся не зробила жадна зміна тексту.',
+'edit-already-exists' => 'Не вдало ся створити нову сторінку, бо она уж екзістує.',
+'defaultmessagetext' => 'Преднаставленый текст повідомлїня',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'Увага: Тота сторінка обсягує дуже много кликаня выконово нарочных функцій парсера.
-
-Поволеный ліміт є $2, теперь шак  {{PLURAL:$1|ту єдно кликаня є|ту суть  $2 кликаня|ту є $2 кликань}}.',
+'expensive-parserfunction-warning' => 'Увага: Тота сторінка обсягує дуже много кликаня выконово тяжкых функцій парсера.
+Дозволеный ліміт є $2, теперь шак  {{PLURAL:$1|ту єдно кликаня є|ту суть  $2 кликаня|ту є $2 кликань}}.',
 'expensive-parserfunction-category' => 'Сторінкы з дуже великым чіслом кликаня функції парсера',
-'post-expand-template-inclusion-warning' => 'Увага: Ñ\80озмÑ\96Ñ\80 Ñ\88аблон Ð¿Ñ\80о включіня є барз великый.
+'post-expand-template-inclusion-warning' => 'Ð\9fозÑ\96Ñ\80Ñ\8c: Ñ\80озмÑ\96Ñ\80 Ñ\88аблон Ð½Ð° включіня є барз великый.
 Дакотры шаблоны не будуть включены.',
 'post-expand-template-inclusion-category' => 'Сторінкы з перевышуючов великостёв включеных шаблон',
-'post-expand-template-argument-warning' => 'Увага: Тота сторінка обсягує принайменшім єден арґумент шаблоны, котрый є по розбалїню дуже великый.
+'post-expand-template-argument-warning' => 'Увага: Тота сторінка обсягує принайменшім єден арґумент шаблоны, котрый є по роспакованю дуже великый.
 Тоты арґументы были іґнорованы.',
 'post-expand-template-argument-category' => 'Сторінкы обсягуючі іґнорованы арґументы шаблон',
 'parser-template-loop-warning' => 'Найдженый цікл шаблон: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Перевышеный ліміт глубкы рекурзівного вкладаня шаблон ($1)',
 'language-converter-depth-warning' => 'Перевышеный ліміт глубкы у языковій конверзії ($1)',
+'node-count-exceeded-category' => 'Сторінкы перевышуючі чісло вузлів',
+'node-count-exceeded-warning' => 'Сторінка перевышыла чісло вузлів',
+'expansion-depth-exceeded-category' => 'Сторінкы превышують глубку експанзії',
+'expansion-depth-exceeded-warning' => 'Сторінка перевышыла глубку експанзії',
+'parser-unstrip-loop-warning' => 'Выявлене заціклїня unstrip',
+'parser-unstrip-recursion-limit' => 'Перевышеный ліміт рекурзії unstrip ($1)',
+'converter-manual-rule-error' => 'Найджена хыба в ручнім правилї конверзії языка',
 
 # "Undo" feature
 'undo-success' => 'Едітованя може быти зручене.
@@ -886,7 +986,7 @@ $3 зазначів тоту причіну: ''$2''",
 'revdelete-text' => "'''Змазаны верзії і подїї будуть надале зображены в історії сторінкы і протоколовачіх записах, але дакотры їх части не будуть публікованы.'''
 Другы адміністраторы {{GRAMMAR:2sg|{{SITENAME}}}} собі будуть мочі схованый обсяг перезерати і помочов того самого інтерфейсу го будуть мочі обновити,
 кідь не были наставлены далшы обмеджіня.",
-'revdelete-confirm' => 'Просиме Вас, підтвердьте же то хочете справды зробити, же собі усвідомуєте резултат і же є то в згодї з  [[{{MediaWiki:Policy-url}}|правилами]].',
+'revdelete-confirm' => 'Просиме Вас, потвердьте, же то хочете справды зробити, же собі усвідомлюєте резултат і же є то в згодї з  [[{{MediaWiki:Policy-url}}|правилами]].',
 'revdelete-suppress-text' => "Затаёваня бы ся мало хосновати  ''лем''' в такых припадах:
 * Потенціално огварячі інформації
 * Непотрібны особны дата
@@ -906,10 +1006,10 @@ $3 зазначів тоту причіну: ''$2''",
 'revdelete-log' => 'Причіна:',
 'revdelete-submit' => 'Апліковати на {{PLURAL:$1|зазначену ревізію|зазначены ревізії}}',
 'revdelete-success' => "'''Видимость ревізії успішно змінена.'''",
-'revdelete-failure' => "'''Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило ся змінити видимость ревізії:'''
+'revdelete-failure' => "'''Ð\9dе Ð²Ð´Ð°ло ся змінити видимость ревізії:'''
 $1",
 'logdelete-success' => "'''Видимость події успішно наставена.'''",
-'logdelete-failure' => "'''Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило ся наставити видимость протоколу.'''
+'logdelete-failure' => "'''Ð\9dе Ð²Ð´Ð°ло ся наставити видимость протоколу.'''
 $1",
 'revdel-restore' => 'Змінити видимость',
 'revdel-restore-deleted' => 'вымазаны ревізії',
@@ -938,12 +1038,13 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Запис затаїня',
-'suppressionlogtext' => 'Тото є  список змазаня і блокованя котрый має обсяг схованый перед адміністраторами. Видьте тыж [[Special:BlockList|список вшыткых блоковань]].',
+'suppressionlogtext' => 'Тото є список мазаня і блокованя загорнюючі спрятаня обсягу і перед адміністраторами.
+Смотьте тыж [[Special:BlockList|Список вшыткых актуалных блоковань]].',
 
 # History merging
 'mergehistory' => 'Злучованя історії сторінок',
-'mergehistory-header' => 'ТоÑ\82а Ñ\81Ñ\82оÑ\80Ñ\96нка Ð\92ам Ð´Ð¾Ð²Ð¾Ð»Ð¸Ñ\82Ñ\8c Ð·Ð»Ñ\83Ñ\87Ñ\96Ñ\82и Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e Ñ\94дной Ð·Ð´Ñ\80ойовой сторінкы з новшов сторінков.
-Пересвідчте ся, же тота зміна утриме цалосность і поступность  історії сторінкы.',
+'mergehistory-header' => 'ТоÑ\82а Ñ\81Ñ\82оÑ\80Ñ\96нка Ð\92ам Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ\82Ñ\8c Ð·Ð»Ñ\83Ñ\87Ñ\96Ñ\82и Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e Ñ\94дной Ð¶Ñ\80Ñ\96дловой сторінкы з новшов сторінков.
+Пересвіджте ся, же тота зміна утриме повязаность і поступность  історії сторінкы.',
 'mergehistory-box' => 'Злучіти ревізії двох сторінок:',
 'mergehistory-from' => 'Здроёва сторінка:',
 'mergehistory-into' => 'Цілёва сторінка:',
@@ -971,6 +1072,8 @@ $1",
 
 # Diffs
 'history-title' => '$1: Історія змін',
+'difference-title' => '$1: Роздїлы міджі ревізіями',
+'difference-title-multipage' => '$1 і $2: Роздїлы міджі сторінками',
 'difference-multipage' => '(Роздїлы міджі сторінками)',
 'lineno' => 'Рядок $1:',
 'compareselectedversions' => 'Порівнати выбраны верзії',
@@ -978,10 +1081,14 @@ $1",
 'editundo' => 'вернути назад',
 'diff-multi' => '({{PLURAL:$1|Не є зображена єдна міджілегла верзія|Не суть зображены $1 міджілеглы верзії|Не є зображено $1 міджілеглых верзій}} од {{PLURAL:$2|1 хоснователя|$2 хоснователїв}} .)',
 'diff-multi-manyusers' => '(Не є зображено $1 міджілеглых верзій од веце як $2 {{PLURAL:$2|хоснователя|хоснователїв}}.)',
+'difference-missing-revision' => '{{PLURAL:$2|Єдна з ревізій|$2 ревізії|$2 ревізій}} к пожадованому порівнаню ($1) {{PLURAL:$2|не є|не суть|не є}}.
+
+Гевсе є звычайно запрічінене так, же наслїдовали сьте застарїлый одказ історічнов ревізіов сторінкы, котра уж была змазана.
+Детайлы можуть быти найджены в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} книзї змазаный сторінок].',
 
 # Search results
 'searchresults' => 'Резултаты гляданя',
-'searchresults-title' => 'Резултаты гляданя про "$1"',
+'searchresults-title' => 'Резултаты гляданя "$1"',
 'searchresulttext' => 'Про детайлнїшы інформації про гляданя у проєктї, смоть [[{{MediaWiki:Helppage}}|сторінка помочі]]',
 'searchsubtitle' => 'Глядали сьте «[[:$1]]» ([[Special:Prefixindex/$1|вшыткы сторінкы, што ся зачінають на «$1»]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|вшыткы сторінкы, што мають одказ на «$1»]])',
 'searchsubtitleinvalid' => "Глядали сте '''$1'''",
@@ -1032,7 +1139,7 @@ $1",
 'showingresultsheader' => "{{PLURAL:$5|Резултат '''$1''' з '''$3'''|Резултаты '''$1 — $2''' з '''$3'''}}  про '''$4'''",
 'nonefound' => "'''Позначка:''' Штандартно ся глядать лем в дакотрых просторах назв.
 Хоснуйте префікс ''all:'', жебы глядати у вшыткых просторах назв (рахувчі тыж сторінкы діскузії, шаблоны ітд.), або зазначте потрібный простор назв.",
-'search-nonefound' => 'На ваш запрос не были найджены жадны резултаты.',
+'search-nonefound' => 'На вашу пожадавку не были найджены жадны резултаты.',
 'powersearch' => 'Росшырене гляданя',
 'powersearch-legend' => 'Росшырене гляданя',
 'powersearch-ns' => 'Глядати у просторах назв:',
@@ -1066,7 +1173,8 @@ $1",
 'prefs-beta' => 'Бета-функції',
 'prefs-datetime' => 'Датум і час',
 'prefs-labs' => 'Експеріменталны функції',
-'prefs-personal' => 'Інформації о хоснователёві',
+'prefs-user-pages' => 'Сторінкы хоснователя',
+'prefs-personal' => 'Інформації о хоснователёви',
 'prefs-rc' => 'Послїднї зміны',
 'prefs-watchlist' => 'Слїдованы сторінкы',
 'prefs-watchlist-days' => 'Чісло днїв зображеных в слїдованых сторінках:',
@@ -1091,13 +1199,13 @@ $1",
 'resultsperpage' => 'Чісло резултатів на сторінку:',
 'stub-threshold' => 'Поріг про форматованя одказу як <a href="#" class="stub">одказів на "stub"</a> (v bajtech):',
 'stub-threshold-disabled' => 'Выпнуте',
-'recentchangesdays' => 'Ð\9dа кілько днїв вказовати новы едітованя',
+'recentchangesdays' => 'Ð\97а кілько днїв вказовати новы едітованя',
 'recentchangesdays-max' => '(максімум $1 {{PLURAL:$1|день|днї|днїв}})',
 'recentchangescount' => 'Чісло імпліцітно зображованых едітовань:',
 'prefs-help-recentchangescount' => 'Тыкать ся послїднїх змін, історії сторінок і протоколовачіх записів.',
 'prefs-help-watchlist-token' => 'Кідь до того поля выповните тайный ключ, буде створеный RSS канал вашых слїдованых сторінок.
-Хоцьхто хто знає тот ключ, пак буде мочі ваш список слїдованых сторінок чітати, также не забывайте на безпечность.
-Можете схосновати тоту нагодно выґенеровану годноту: $1',
+Хоцьхто хто знає тот ключ, пак буде мочі ваш список слїдованых сторінок чітати, та же не забывайте на беспечность.
+Можете схосновати тото трафунково выґенероване значіня: $1',
 'savedprefs' => 'Ваше наставлїня было уложене.',
 'timezonelegend' => 'Часова зона:',
 'localtime' => 'Містный час:',
@@ -1127,14 +1235,14 @@ $1",
 'prefs-common-css-js' => 'Сдїляне CSS/JS про вшыткы штілы:',
 'prefs-reset-intro' => 'Помочов той сторінкы можете вшыткы наставлїня вернути на імпліцітны годноты.
 Тоту операцію не годен вернути назад.',
-'prefs-emailconfirm-label' => 'Підтверджіня електронічной пошты:',
+'prefs-emailconfirm-label' => 'Потверджіня електронічной пошты:',
 'prefs-textboxsize' => 'Розмір окна едітованя',
 'youremail' => 'Адреса електронічной пошты:',
 'username' => 'Мено хоснователя:',
 'uid' => 'Ідентіфікатор хоснователя:',
 'prefs-memberingroups' => 'Член {{PLURAL:$1|ґрупы|ґруп}}:',
 'prefs-registration' => 'Час реґістрації:',
-'yourrealname' => 'СкÑ\83Ñ\82оÑ\87не Ð¼ÐµÐ½Ð¾:',
+'yourrealname' => 'Ð\9fÑ\80авдиве Ñ\96мÑ\8f:',
 'yourlanguage' => 'Язык:',
 'yourvariant' => 'Варіант языка обсягу:',
 'prefs-help-variant' => 'Вами преферованый варіант або правопис, як ся мають на тій вікі зображати обсяговы сторінкы.',
@@ -1198,7 +1306,7 @@ $1",
 # Groups
 'group' => 'Ґрупа:',
 'group-user' => 'Хоснователї',
-'group-autoconfirmed' => 'Автопідтверджены хоснователї',
+'group-autoconfirmed' => 'Автопотверджены хоснователї',
 'group-bot' => 'Боты',
 'group-sysop' => 'Адміністраторы',
 'group-bureaucrat' => 'Бірократы',
@@ -1213,7 +1321,7 @@ $1",
 'group-suppress-member' => '{{GENDER:$1|ревізор|ревізорка|ревізор}}',
 
 'grouppage-user' => '{{ns:project}}:Хоснователї',
-'grouppage-autoconfirmed' => '{{ns:project}}:Автопідтверджены хоснователї',
+'grouppage-autoconfirmed' => '{{ns:project}}:Автопотверджены хоснователї',
 'grouppage-bot' => '{{ns:project}}:Боты',
 'grouppage-sysop' => '{{ns:project}}:Адміністраторы',
 'grouppage-bureaucrat' => '{{ns:project}}:Бірократы',
@@ -1231,12 +1339,12 @@ $1",
 'right-move-rootuserpages' => 'Переменованя корінёвых сторінок хоснователїв',
 'right-movefile' => 'Переменовати файлы',
 'right-suppressredirect' => 'Нестворіня напрямлїня про переменоваю сторінкы',
-'right-upload' => 'Ð\9dагÑ\80аваня файлів',
+'right-upload' => 'Ð\9dаладовованя файлів',
 'right-reupload' => 'Переписованя екзістуючіх файлів',
-'right-reupload-own' => 'Ð\9fеÑ\80епиÑ\81ованÑ\8f Ñ\84айлÑ\96в Ð½Ð°Ð³Ñ\80анÑ\8bÑ\85 Ñ\81ам Ñ\81обов',
-'right-reupload-shared' => 'Ð\9dагÑ\80аванÑ\8f Ð»Ð¾ÐºÐ°Ð»Ð½Ñ\8bÑ\85 Ñ\84айлÑ\96в Ð¿Ñ\80о Ð¿Ð¾Ñ\82иÑ\81нÑ\83Ñ\82Ñ\8f Ñ\82Ñ\8bÑ\85 Ð² Ñ\81дÑ\97лÑ\8fнÑ\96м Ñ\83Ñ\81Ñ\85овÑ\96щу',
-'right-upload_by_url' => 'Ð\9dагÑ\80аваня файлів з URL адрес',
-'right-purge' => 'Очіщіня кешу про сторінкы без підтверджовачого діалоґу',
+'right-reupload-own' => 'Ð\9fеÑ\80епиÑ\81ованÑ\8f Ñ\84айлÑ\96в Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8bÑ\85 Ð¾Ð´ Ñ\81ебе Ñ\81амого',
+'right-reupload-shared' => 'Ð\9dаладованÑ\8f Ð»Ð¾ÐºÐ°Ð»Ð½Ñ\8bÑ\85 Ñ\84айлÑ\96в Ð¶ÐµÐ±Ñ\8b Ð¿ÐµÑ\80екÑ\80Ñ\8bли Ñ\82оÑ\82Ñ\8bÑ\85 Ð² Ñ\81полоÑ\87нÑ\96м Ñ\83Ñ\81Ñ\85овищу',
+'right-upload_by_url' => 'Ð\9dаладовованя файлів з URL адрес',
+'right-purge' => 'Очіщіня кешу про сторінкы без потверджовачого діалоґу',
 'right-autoconfirmed' => 'Едітованя часточно замкнутых сторінок',
 'right-bot' => 'Быти поважованый за автоматічный процес',
 'right-nominornewtalk' => 'Невыписованя новых повідомлїнь по малых управах діскузной сторінкы',
@@ -1244,6 +1352,8 @@ $1",
 'right-writeapi' => 'Хосновати API про писаня',
 'right-delete' => 'Змазаня сторінок',
 'right-bigdelete' => 'Мазаня сторінок з довгов історіёв',
+'right-deletelogentry' => 'Мазаня тай обновлїня окремых записів лоґів
+,',
 'right-deleterevision' => 'Мазаня і обновованя конкретных ревізій сторінок',
 'right-deletedhistory' => 'Зображованя змазаных положок в історії без одповідаючого тексту',
 'right-deletedtext' => 'перегляд змазаного тексту і роздїлів міджі змазаныма верзіами',
@@ -1267,7 +1377,7 @@ $1",
 'right-markbotedits' => 'Означованя ревертів як едітованя робота',
 'right-noratelimit' => 'Не має обмеджіня в швыдкости',
 'right-import' => 'Імпорт сторінок з іншых вікі',
-'right-importupload' => 'Ð\86мпоÑ\80Ñ\82 Ñ\81Ñ\82оÑ\80Ñ\96нок Ñ\87еÑ\80ез Ð½Ð°Ð³Ñ\80аваня файлів',
+'right-importupload' => 'Ð\86мпоÑ\80Ñ\82 Ñ\81Ñ\82оÑ\80Ñ\96нок Ñ\87еÑ\80ез Ð½Ð°Ð»Ð°Ð´Ð¾ваня файлів',
 'right-patrol' => 'Позначованя едітовань як перевіреных',
 'right-autopatrol' => 'Автоматічне означованя едітовань як перевіреных',
 'right-patrolmarks' => 'Зобразованя патролёваных сторінок в Послїднїх змінах',
@@ -1298,10 +1408,10 @@ $1",
 'action-move-subpages' => 'переменованя той сторінкы зо вшыткыма єй підсторінками',
 'action-move-rootuserpages' => 'переменовати корінёвы сторінкы хостователїв',
 'action-movefile' => 'переменовати тот файл',
-'action-upload' => 'нагÑ\80ати тот файл',
+'action-upload' => 'наладовати тот файл',
 'action-reupload' => 'переписати тот екзістуючій файл',
 'action-reupload-shared' => 'перекрыти тот файл зо сполочного уложыштя',
-'action-upload_by_url' => 'нагÑ\80ати тот файл з URL адресы',
+'action-upload_by_url' => 'наладовати тот файл з URL адресы',
 'action-writeapi' => 'хосновати API про писаня',
 'action-delete' => 'Вымазати тоту сторінку',
 'action-deleterevision' => 'вымазати тоту ревізію сторінкы',
@@ -1358,6 +1468,7 @@ $1",
 'newsectionsummary' => '/* $1 */ нова секція',
 'rc-enhanced-expand' => 'Вказати детайлы (потрібный JavaScript)',
 'rc-enhanced-hide' => 'Сховати детайлы',
+'rc-old-title' => 'спочатку створена як $1',
 
 # Recent changes linked
 'recentchangeslinked' => 'Повязаны зміны',
@@ -1371,29 +1482,29 @@ $1",
 'recentchangeslinked-to' => 'Вказати зміны на сторінках, одказуючіх на задану сторінку',
 
 # Upload
-'upload' => 'Ð\9dагÑ\80ати файл',
-'uploadbtn' => 'Начітати файл',
-'reuploaddesc' => 'Ð\97Ñ\80Ñ\83Ñ\88Ñ\8bÑ\82и Ð½Ð°Ñ\87Ñ\96Ñ\82анÑ\8f Ð° Ð²ÐµÑ\80нÑ\83Ñ\82и Ñ\81Ñ\8f Ð´Ð¾ Ñ\84оÑ\80мÑ\8b Ð½Ð°Ñ\87Ñ\96Ñ\82аня',
+'upload' => 'Ð\9dаладовати файл',
+'uploadbtn' => 'Наладовати файл',
+'reuploaddesc' => 'Ð\97Ñ\80Ñ\83Ñ\88Ñ\8bÑ\82и Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8f Ð° Ð²ÐµÑ\80нÑ\83Ñ\82и Ñ\81Ñ\8f Ð´Ð¾ Ñ\84оÑ\80мÑ\8b Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð¾Ð²аня',
 'upload-tryagain' => 'Уложыти зміненый попис файлу',
 'uploadnologin' => 'Не сьте приголошеный(а)',
-'uploadnologintext' => 'Ð\9fÑ\80о Ð½Ð°Ñ\87Ñ\96Ñ\82анÑ\8f Ñ\84айлÑ\83 Ñ\81Ñ\8f Ð¼Ñ\83Ñ\81иÑ\82е [[Special:UserLogin|приголосити]].',
-'upload_directory_missing' => 'Ð\90дÑ\80еÑ\81аÑ\80Ñ\8c Ð¿Ñ\80о Ð½Ð°Ð³Ñ\80аванÑ\8f Ñ\84айлÑ\96в ($1) Ñ\85Ñ\8bбиÑ\82Ñ\8c Ñ\96 вебовый сервер го не годен створити.',
-'upload_directory_read_only' => 'Ð\94о Ð°Ð´Ñ\80еÑ\81аÑ\80Ñ\8f Ð¿Ñ\80о Ð½Ð°Ñ\87Ñ\96Ñ\82анÑ\8b Ñ\84айлÑ\8b ($1) Ð½Ðµ Ð¼Ð°Ñ\94 вебовый сервер права запису.',
-'uploaderror' => 'Ð\9fÑ\80и Ð½Ð°Ñ\87Ñ\96Ñ\82аванÑ\8e Ð´Ñ\96Ñ\88ло ÐºÑ\83 Ñ\85Ñ\8bби',
-'upload-recreate-warning' => "'''Увага: Файл з тов назвов быв скоре змазаный ці переменованый.'''
+'uploadnologintext' => 'Ð\96ебÑ\8b Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ñ\82и Ñ\84айл, Ð¼Ñ\83Ñ\81иÑ\82е Ñ\81Ñ\8f [[Special:UserLogin|приголосити]].',
+'upload_directory_missing' => 'Ð\90дÑ\80еÑ\81аÑ\80Ñ\8c Ð¿Ñ\80о Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð¾Ð²Ð°Ð½Ñ\8f Ñ\84айлÑ\96в ($1) Ñ\85Ñ\8bбиÑ\82Ñ\8c Ñ\82ай вебовый сервер го не годен створити.',
+'upload_directory_read_only' => 'Ð\94о Ð°Ð´Ñ\80еÑ\81аÑ\80Ñ\8f Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8bÑ\85 Ñ\84айлÑ\96в ($1) Ð½Ðµ Ð¼Ð°Ñ\82Ñ\8c вебовый сервер права запису.',
+'uploaderror' => 'Ð\9fÑ\96д Ñ\87аÑ\81 Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8f Ñ\81Ñ\8f Ð¿Ñ\80иÑ\82Ñ\80аÑ\84ила Ñ\85Ñ\8bба',
+'upload-recreate-warning' => "'''Увага: Файл з тов назвов быв оперед змазаный ці переменованый.'''
 
 Ту є про перегляд зображеный список мазаня і переменованя той сторінкы:",
-'uploadtext' => "Ниже даный формулар служыть про начітаваня файлів. Уж начітаны файлы собі можете перезерати і глядати помочов [[Special:FileList|списку начітаных файлів]], качде начітаня ся тыж зазначує до [[Special:Log/upload|книгы начітаваня]], змазаня суть в [[Special:Log/delete|книзї змазаных сторінок]].
+'uploadtext' => "Ниже даный формуларь служыть на наладовованя файлів. Уж наладованы файлы собі можете перезерати і глядати помочов [[Special:FileList|списку наладованых файлів]], кажде наладованя ся тыж зазначує до [[Special:Log/upload|книгы наладованя]], змазаня суть в [[Special:Log/delete|книзї змазаных сторінок]].
 
-Про вложіня образку до сторінкы хоснуйте єден з наслїдуючіх способів запису:
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Файл.jpg]]</nowiki></code>''' Ð´Ð¾ Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b Ð²Ð»Ð¾Ð¶Ñ\8bÑ\82Ñ\8c Ñ\86Ñ\96лый образок,
+Про вложіня образчіка до сторінкы хоснуйте єден із слїдуючіх способів запису:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Файл.jpg]]</nowiki></code>''' Ð´Ð¾ Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b Ð²Ð»Ð¾Ð¶Ñ\8bÑ\82Ñ\8c Ñ\86Ñ\97лый образок,
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Файл.png|thumb|left|Попис]]</nowiki></code>''' вложыть нагляд в рамику зарівнанім на лівый бік, з пописом „Попис“,
-* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Файл.ogg]]</nowiki></code>''' Ð²Ð»Ð¾Ð¶Ñ\8bÑ\82Ñ\8c Ð¿Ñ\80Ñ\8fмÑ\8bй одказ на файл, без того жебы ся зобразив на сторінцї.",
-'upload-permitted' => 'Доволены тіпы  файлів: $1.',
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Файл.ogg]]</nowiki></code>''' Ð²Ð»Ð¾Ð¶Ñ\8bÑ\82Ñ\8c Ð´Ñ\96Ñ\80екÑ\82 одказ на файл, без того жебы ся зобразив на сторінцї.",
+'upload-permitted' => 'Ð\94озволенÑ\8b Ñ\82Ñ\96пÑ\8b  Ñ\84айлÑ\96в: $1.',
 'upload-preferred' => 'Преферованы тіпы файлів: $1',
 'upload-prohibited' => 'Заказаны тіпы файлів: $1.',
-'uploadlog' => 'книга Ð½Ð°Ð³Ñ\80аваня',
-'uploadlogpage' => 'Ð\9bоÒ\91 Ð½Ð°Ð³Ñ\80аных файлів',
+'uploadlog' => 'книга Ð½Ð°Ð»Ð°Ð´Ð¾ваня',
+'uploadlogpage' => 'Ð\9bоÒ\91 Ð½Ð°Ð»Ð°Ð´Ð¾Ð²аных файлів',
 'uploadlogpagetext' => 'Ниже найдете список найновшых файлів. Смотьте [[Special:NewFiles|ґалерію новых образків]] про веце візуалного нагляду.',
 'filename' => 'Назва файлу:',
 'filedesc' => 'Попис',
@@ -1401,149 +1512,193 @@ $1",
 'filereuploadsummary' => 'Зміны у файлі:',
 'filestatus' => 'Авторьскы права:',
 'filesource' => 'Жрідло:',
-'uploadedfiles' => 'Начітаны файлы',
-'ignorewarning' => 'Іґноровати варованя тай начітати файл.',
+'uploadedfiles' => 'Наладованы файлы',
+'ignorewarning' => 'Іґноровати варованя тай уложыти файл.',
 'ignorewarnings' => 'Іґноровати вшыткы варованя',
 'minlength1' => 'Назва файлу мусить мати холем єдну літеру.',
-'illegalfilename' => 'Ð\9dазва Ñ\84айлÑ\83 "$1" Ð¾Ð±Ñ\81Ñ\8fгÑ\83Ñ\94 Ð±Ñ\83квÑ\8b, ÐºÐ¾Ñ\82Ñ\80Ñ\8b Ð½Ðµ Ñ\81Ñ\83Ñ\82Ñ\8c Ð¿Ð¾Ð²Ð¾Ð»ÐµÐ½Ñ\8b Ð² Ð½Ð°Ð·Ð²Ð°Ñ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок. Ð\9fÑ\80оÑ\81име, Ð¿ÐµÑ\80еменÑ\83йÑ\82е Ñ\84айл Ñ\96 Ñ\81пÑ\80обÑ\83йÑ\82е Ð³Ð¾ Ð½Ð°Ð³Ñ\80ати зясь.',
+'illegalfilename' => 'Ð\9dазва Ñ\84айлÑ\83 "$1" Ð¾Ð±Ñ\81Ñ\8fгÑ\83Ñ\94 Ð±Ñ\83квÑ\8b, ÐºÐ¾Ñ\82Ñ\80Ñ\8b Ð½Ðµ Ñ\81Ñ\83Ñ\82Ñ\8c Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\8b Ð² Ð½Ð°Ð·Ð²Ð°Ñ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок. Ð\9fÑ\80оÑ\81име, Ð¿ÐµÑ\80еменÑ\83йÑ\82е Ñ\84айл Ñ\96 Ñ\81пÑ\80обÑ\83йÑ\82е Ð³Ð¾ Ð½Ð°Ð»Ð°Ð´Ð¾Ð²ати зясь.',
 'filename-toolong' => 'Назвы файлів не можуть быти довшы, як 240 байтів.',
 'badfilename' => 'Назва файлу была змінена на „$1“.',
 'filetype-mime-mismatch' => 'Росшырїня файлу ".$1" не одповідать ёго MIME тіпу ($2).',
-'filetype-badmime' => 'Ð\9dе Ñ\94 Ð¿Ð¾Ð²Ð¾Ð»ÐµÐ½Ðµ Ð½Ð°Ñ\87Ñ\96Ñ\82ати файлы MIME тіп „$1“.',
-'filetype-bad-ie-mime' => 'Ð\9dеможно Ð½Ð°Ñ\87Ñ\96Ñ\82аÑ\82и Ñ\82оÑ\82 Ñ\84айл, Ð±Ð¾ Internet Explorer Ð±Ñ\8b Ð³Ð¾ Ð¿Ð¾Ð²Ð°Ð¶Ð¾Ð²Ð°Ð² Ð·Ð° â\80\9e$1â\80\9c, Ñ\88Ñ\82о Ñ\94 Ð½Ðµ Ð´Ð¾Ð²Ð¾Ð»ÐµÐ½Ñ\8bй Ñ\96 Ð¿Ð¾Ñ\82енÑ\86Ñ\96ално Ð½ÐµÐ±ÐµÐ·печный тіп файлу.',
+'filetype-badmime' => 'Ð\9dе Ñ\94 Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð¾Ð²ати файлы MIME тіп „$1“.',
+'filetype-bad-ie-mime' => 'Ð\9dеможливо Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ñ\82и Ñ\82оÑ\82 Ñ\84айл, Ð±Ð¾ Internet Explorer Ð±Ñ\8b Ð³Ð¾ Ñ\82Ñ\80имав Ð·Ð° â\80\9e$1â\80\9c, Ñ\88Ñ\82о Ñ\94 Ð½Ðµ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\8bй Ñ\96 Ð¿Ð¾Ñ\82енÑ\86Ñ\96ално Ð½ÐµÐ±ÐµÑ\81печный тіп файлу.',
 'filetype-unwanted-type' => "„.$1“''' є нежеланый формат файлу. {{plural:$3|Желаный формат файлів є|Желаны форматы файлів суть}} $2.",
-'filetype-banned-type' => "'''â\80\9e.$1â\80\9c''' {{PLURAL:$4|Ñ\94 Ð½ÐµÐ´Ð¾Ð²Ð¾Ð»ÐµÐ½Ñ\8bй Ñ\84оÑ\80маÑ\82 Ñ\84айлÑ\96в|Ñ\81Ñ\83Ñ\82Ñ\8c Ð½ÐµÐ´Ð¾волены форматы файлів}}.
-{{PLURAL:$3|Ð\94оволенÑ\8bй Ñ\84оÑ\80маÑ\82 Ñ\84алÑ\96в|Ð\94оволены форматы файлів суть}} $2.",
-'filetype-missing' => 'Файл Ð½Ðµ Ð¼Ð°Ñ\94 Ñ\80оÑ\81Ñ\88Ñ\8bÑ\80Ñ\96ня (наприклад, «.jpg»).',
-'empty-file' => 'Начітаный файл є порожнїй.',
-'file-too-large' => 'Начітаный файл є барз великый.',
+'filetype-banned-type' => "'''â\80\9e.$1â\80\9c''' {{PLURAL:$4|Ñ\94 Ð½ÐµÐ´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\8bй Ñ\84оÑ\80маÑ\82 Ñ\84айлÑ\96в|Ñ\81Ñ\83Ñ\82Ñ\8c Ð½ÐµÐ´Ð¾Ð·волены форматы файлів}}.
+{{PLURAL:$3|Ð\94озволенÑ\8bй Ñ\84оÑ\80маÑ\82 Ñ\84алÑ\96в|Ð\94озволены форматы файлів суть}} $2.",
+'filetype-missing' => 'Файл Ð½Ðµ Ð¼Ð°Ñ\94 Ñ\80оÑ\81Ñ\88Ñ\8bÑ\80Ñ\97ня (наприклад, «.jpg»).',
+'empty-file' => 'Наладованый файл є порожнїй.',
+'file-too-large' => 'Наладованый файл є барз великый.',
 'filename-tooshort' => 'Назва файлу є барз коротка.',
 'filetype-banned' => 'Тот тіп файлу є заказаный.',
 'verification-error' => 'Тот файл не перешов овіринём файлів.',
 'hookaborted' => 'Пожадована вами зміна была одмітнута дакотрым росшырінём.',
-'illegal-filename' => 'ТоÑ\82а Ð½Ð°Ð·Ð²Ð° Ñ\84айлÑ\83 Ð½Ðµ Ñ\94 Ð¿Ð¾волена.',
-'overwrite' => 'Ð\9dе Ñ\94 Ð´Ð¾Ð²Ð¾Ð»ÐµÐ½Ðµ переписати екзістуючій файл.',
-'unknown-error' => 'Ð\94Ñ\96Ñ\88ло ÐºÑ\83 Ð½ÐµÐ·Ð½Ð°Ð¼Ñ\96й Ñ\85Ñ\8bбÑ\96.',
-'tmp-create-error' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило ся створити дочасный файл.',
+'illegal-filename' => 'ТоÑ\82а Ð½Ð°Ð·Ð²Ð° Ñ\84айлÑ\83 Ð½Ðµ Ñ\94 Ð´Ð¾Ð·волена.',
+'overwrite' => 'Ð\9dе Ñ\81лободно переписати екзістуючій файл.',
+'unknown-error' => 'ТÑ\80аÑ\84ила Ñ\81Ñ\8f Ð½ÐµÐ·Ð½Ð°Ð¼Ð° Ñ\85Ñ\8bба.',
+'tmp-create-error' => 'Ð\9dе Ð²Ð´Ð°ло ся створити дочасный файл.',
 'tmp-write-error' => 'Хыба запису до дочасного файлу.',
 'large-file' => 'Ся рекомендує, жебы довжка файлу непересяговала $1, тот файл має $2.',
 'largefileserver' => 'Розмір файлу є векшый як ліміт наставленый на сервері.',
 'emptyfile' => 'Файл, котрый сьте вложыли ся видить быти порожнїй. Могла то запричінити хыба в назві файлу. Просиме, перевірте ці сьте справды хотїли вложыти тот файл.',
 'windows-nonascii-filename' => 'Тота вікі не підпорує назвы файлів з шпеціалныма сімболами.',
-'fileexists' => "Файл з тов назвов уж екзістує, просиме посмотьте ся на '''<tt>[[:$1]]</tt>''', покы не знаєте напевно, ці хочете тот файл нагородити.
-[[$1|thumb]]",
-'filepageexists' => "Пописова сторінка про файл з тов назвов уж была на  '''<tt>[[:$1]]</tt>''' створена, але одповідаючій файл дотеперь не екзістує.
+'fileexists' => 'Файл з тов назвов уж екзістує, просиме посмотьте ся на <strong>[[:$1]]</strong>, покы не знаєте напевно, ці хочете тот файл нагородити.
+[[$1|thumb]]',
+'filepageexists' => 'Пописова сторінка про файл з тов назвов уж была на  <strong>[[:$1]]</strong> створена, але одповідаючій файл дотеперь не екзістує.
 Згорнутя, котре ту зазначіте, ся на пописовій сторінцї не зобразить.
-Кідь там хочете своє згорнутя зобразити, будете мусити дану сторінку едітовати мануално. [[$1|thumb]]",
-'fileexists-extension' => "Уже екзістує файл з подобным меном: [[$2|thumb]]
-* Назва начітаного файлу: '''<tt>[[:$1]]</tt>'''
-* Назва екзістуючого файлу: '''<tt>[[:$2]]</tt>'''
-Выберте іншу назву.",
-'fileexists-thumbnail-yes' => "Тот файл є асі образок в зменшеній великости ''(нагляд)''. [[$1|thumb]]
-Перевірте файл '''<tt>[[:$1]]</tt>'''.
\9fокÑ\8b Ñ\94 Ð²ÐºÐ°Ð·Ð°Ð½Ñ\8bй Ñ\84айл Ð²ÐµÐºÑ\88Ñ\8bй, Ð°Ð»Ðµ Ñ\96накÑ\88е Ñ\80овнакÑ\8bй, Ð½Ðµ Ñ\94 Ñ\82Ñ\80еба Ð¾ÐºÑ\80емо Ð½Ð°Ñ\87Ñ\96Ñ\82ати ёго зменшену верзію.",
-'file-thumbnail-no' => "Назва файлу ся зачінать на '''<tt>$1</tt>'''.
-Може є то образок в зменшеній великости ''(нагляд)''.
\9dаÑ\87Ñ\96Ñ\82айте файл в повнім розлишіню, покы є ку діспозіції, або зміньте назву файлу.",
-'fileexists-forbidden' => 'Файл Ð· Ñ\82аков Ð½Ð°Ð·Ð²Ð¾Ð² Ñ\83ж ÐµÐºÐ·Ñ\96Ñ\81Ñ\82Ñ\83Ñ\94 Ñ\96 Ð½Ðµ Ñ\94 Ð¿Ð¾Ð²Ð¾Ð»ÐµÐ½Ðµ го переписати.
-Кідь хочете тот файл начітати, вернийте ся і звольте іншу назву.
+Кідь там хочете своє згорнутя зобразити, будете мусити дану сторінку едітовати мануално. [[$1|thumb]]',
+'fileexists-extension' => 'Уже екзістує файл з подобным іменом: [[$2|thumb]]
+* Назва наладованого файлу: <strong>[[:$1]]</strong>
+* Назва екзістуючого файлу: <strong>[[:$2]]</strong>
+Выберте іншу назву.',
+'fileexists-thumbnail-yes' => "Тот файл є асі образчік в зменшеній великости ''(нагляд)''. [[$1|thumb]]
+Перевірте файл <strong>[[:$1]]</strong>.
\9aÑ\96дÑ\8c Ñ\94 Ð²ÐºÐ°Ð·Ð°Ð½Ñ\8bй Ñ\84айл Ð²ÐµÐºÑ\88Ñ\8bй, Ð°Ð»Ðµ Ñ\96накÑ\88е Ñ\94днакÑ\8bй, Ð½Ðµ Ñ\82Ñ\80еба Ð¾ÐºÑ\80емо Ð½Ð°Ð»Ð°Ð´Ð¾Ð²ати ёго зменшену верзію.",
+'file-thumbnail-no' => "Назва файлу ся зачінать на <strong>$1</strong>.
+Може є то образчік в зменшеній великости ''(нагляд)''.
\97аладÑ\83йте файл в повнім розлишіню, покы є ку діспозіції, або зміньте назву файлу.",
+'fileexists-forbidden' => 'Файл Ð· Ñ\82аков Ð½Ð°Ð·Ð²Ð¾Ð² Ñ\83ж ÐµÐºÐ·Ñ\96Ñ\81Ñ\82Ñ\83Ñ\94 Ñ\96 Ð½Ðµ Ñ\94 Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ го переписати.
+Кідь хочете тот файл наладовати, вернийте ся і звольте іншу назву.
 [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Файл з тов назвов уж екзістує в здїлянім усховіщу. Кідь і наперек тому хочете ваш файл начітати, вернийте ся і звольте іншу назву. [[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Файл з тов назвов уж екзістує в сполочнім усховищу. Кідь і наперек тому хочете ваш файл наладовати, вернийте ся і звольте іншу назву. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Тот файл є дуплікат {{PLURAL:$1|файлу|такых файлів}}:',
-'file-deleted-duplicate' => 'Ð\86денÑ\82Ñ\96Ñ\87нÑ\8bй Ñ\84айл ÐºÑ\83 Ñ\82омÑ\83 ([[:$1]]) Ð±Ñ\8bв Ñ\83ж Ñ\81коÑ\80е Ð·Ð¼Ð°Ð·Ð°Ð½Ñ\8bй. Ð\9fеÑ\80едÑ\82Ñ\8bм Ñ\8fк Ñ\84айл Ð·Ð½Ð¾Ð²Ñ\83 Ð½Ð°Ð³Ñ\80аєте, бы сьте мали перевірити записы о попереднёму змазаню.',
-'uploadwarning' => 'Увага Ð¿Ñ\80о Ð½Ð°Ñ\87Ñ\96Ñ\82анÑ\8f',
+'file-deleted-duplicate' => 'Ð\86денÑ\82Ñ\96Ñ\87нÑ\8bй Ñ\84айл ÐºÑ\83 Ñ\82омÑ\83 ([[:$1]]) Ð±Ñ\8bв Ñ\83ж Ñ\81коÑ\80е Ð·Ð¼Ð°Ð·Ð°Ð½Ñ\8bй. Ð\9fеÑ\80едÑ\82Ñ\8bм Ñ\8fк Ñ\84айл Ð·Ð½Ð¾Ð²Ñ\83 Ð·Ð°Ð»Ð°Ð´Ñ\83єте, бы сьте мали перевірити записы о попереднёму змазаню.',
+'uploadwarning' => 'Ð\9fозÑ\96Ñ\80Ñ\8c Ðº Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8e',
 'uploadwarning-text' => 'Просиме, зміньте опис файлу ниже і спробуйте то знову.',
 'savefile' => 'Уложыти файл',
-'uploadedimage' => 'нагÑ\80ав "[[$1]]"',
-'overwroteimage' => 'начітана нова верзія "[[$1]]"',
-'uploaddisabled' => 'Начітаня файлів заборонене',
-'copyuploaddisabled' => 'Начітаня файлів через URL є выпнуте.',
-'uploadfromurl-queued' => 'Ð\92аÑ\88а Ð¿Ð¾Ð¶Ð°Ð´Ð°Ð²ÐºÐ° Ð¿Ñ\80о Ð½Ð°Ñ\87Ñ\96Ñ\82анÑ\8f Ñ\84айлÑ\83 Ð±Ñ\8bла Ñ\83ложена Ð´Ð¾ Ñ\84Ñ\80онÑ\82ы.',
-'uploaddisabledtext' => 'Начітаня файлів є выпнуте.',
-'php-uploaddisabledtext' => 'В PHP є выпнуте начітаня файлів. Просиме, перевірте наставлїня file_uploads.',
+'uploadedimage' => 'наладовав "[[$1]]"',
+'overwroteimage' => 'наладована нова верзія "[[$1]]"',
+'uploaddisabled' => 'Наладовованя файлів заборонене.',
+'copyuploaddisabled' => 'Наладовованя файлів через URL є выпнуте.',
+'uploadfromurl-queued' => 'Ð\92аÑ\88а Ð¿Ð¾Ð¶Ð°Ð´Ð°Ð²ÐºÐ° Ð½Ð° Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð¾Ð²Ð°Ð½Ñ\8f Ñ\84айлÑ\83 Ð±Ñ\8bла Ñ\83ложена Ð´Ð¾ Ñ\88оÑ\80ы.',
+'uploaddisabledtext' => 'Наладовованя файлів є выпнуте.',
+'php-uploaddisabledtext' => 'В PHP є выпнуте наладовованя файлів. Просиме, перевірьте наставлїня file_uploads.',
 'uploadscripted' => 'Тот файл обсягує HTML-код або скріпт, якый може быти неправилно інтерпретованый вебовым переглядячом.',
 'uploadvirus' => 'Файл обсягує вірус! Детайлы: $1',
 'uploadjava' => 'Тот файл є ZIP архів, котрый обсягує .class-файл Java.
-Начітаня Java-файлів не є доволене, бо они можуть запричінити обход забезпечіня сістемы.',
+Наладованя Java-файлів не є дозволене, бо они можуть запрічінити обход забеспечіня сістемы.',
 'upload-source' => 'Жрідловый файл',
 'sourcefilename' => 'Назва жрідлового файлу:',
 'sourceurl' => 'Жрідлова URL-адреса:',
 'destfilename' => 'Назва цілёвого файлу:',
 'upload-maxfilesize' => 'Максімалный розмір файлу: $1',
 'upload-description' => 'Попис файлу',
-'upload-options' => 'Параметры начітаня',
+'upload-options' => 'Параметры наладовованя',
 'watchthisupload' => 'Слїдовати тот файл',
 'filewasdeleted' => 'Файл з таков назвов уж екзістовав а быв змазаный. Детайлы обсягує $1.',
-'filename-bad-prefix' => "Назва файлу, котрый начітавате ся зачінать на '''„$1“''', што не є назва звычайно приряджована діґіталным фотоапаратом. Звольте іншу назву, котра ваш файл попише лїпше.",
-'upload-success-subj' => 'Начітаня было успішне',
-'upload-success-msg' => 'Файл вами начітаный з [$2] є доступный на [[:{{ns:file}}:$1]]',
-'upload-failure-subj' => 'Проблем з начітаным файлом',
-'upload-failure-msg' => 'У вами начітаного файлу взникнув проблем  з [$2]::
+'filename-bad-prefix' => "Назва наладовованого файлу ся зачінать на '''„$1“''', што не є назва звычайно приряджована діґіталным фотоапаратом. Звольте іншу назву, котра ваш файл попише лїпше.",
+'upload-success-subj' => 'Наладованя было успішне',
+'upload-success-msg' => 'Файл вами наладованый з [$2] є доступный на [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Проблем з наладованём',
+'upload-failure-msg' => 'У вами наладованого файлу выник проблем  з [$2]::
 
 $1',
-'upload-warning-subj' => 'Увага Ð¿Ñ\80о Ð½Ð°Ñ\87Ñ\96Ñ\82анÑ\8f',
-'upload-warning-msg' => 'Почас вашого начітаваня файлу [$2] ся став проблем. Кідь го хочете вырїшыти, можете ся вернути до  [[Special:Upload/stash/$1|формуларя начітаваня]].',
+'upload-warning-subj' => 'Ð\9fозÑ\96Ñ\80Ñ\8c Ðº Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8e',
+'upload-warning-msg' => 'Під час вашого наладовованя файлу [$2] ся притрафив проблем. Кідь го хочете вырїшыти, можете ся вернути до  [[Special:Upload/stash/$1|формуларя наладовованя]].',
 
 'upload-proto-error' => 'Неплатный протокол',
-'upload-proto-error-text' => 'Ð\9dагÑ\80анÑ\8f Ð²Ð·Ð´Ð°Ð»ÐµÐ½ого файлу пожадує зазначіня URLs з початком <code>http://</code> або <code>ftp://</code>.',
+'upload-proto-error-text' => 'Ð\9dаладованÑ\8f Ð¾Ð´Ð»ÐµÐ³Ð»ого файлу пожадує зазначіня URLs з початком <code>http://</code> або <code>ftp://</code>.',
 'upload-file-error' => 'Інтерна хыба',
-'upload-file-error-text' => 'Почас спробы створїня дочасного файлу настала внутрїшня хыба на сервері.
+'upload-file-error-text' => 'При спробі створити дочасный файл настала внутрїшня хыба на серверї.
 Просиме контактуйте  [[Special:ListUsers/sysop|адміністратора]].',
 'upload-misc-error' => 'Незнама хыба',
-'upload-misc-error-text' => 'Ð\9dезнама Ñ\85Ñ\8bба Ð½Ð°Ñ\81Ñ\82ала Ð¿Ð¾Ñ\87аÑ\81 Ð½Ð°Ð³Ñ\80аванÑ\8f Ñ\84айлÑ\83. Ð\9fеÑ\80евÑ\96Ñ\80Ñ\82е Ñ\86Ñ\96 Ñ\94  URL Ð¿Ð»Ð°Ñ\82на і приступна і спробуйте то знову. Кідь ся хыба обявить знову, контактуйте [[Special:ListUsers/sysop|адміністратора]]. сістемы.',
+'upload-misc-error-text' => 'Ð\9dезнана Ñ\85Ñ\8bба Ñ\81Ñ\8f Ñ\82Ñ\80аÑ\84ила Ð¿Ñ\96д Ñ\87аÑ\81 Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8f Ñ\84айлÑ\83. Ð\9fеÑ\80евÑ\96Ñ\80Ñ\82е Ñ\86Ñ\96 Ñ\94  URL Ð¿Ñ\80авилна і приступна і спробуйте то знову. Кідь ся хыба обявить знову, контактуйте [[Special:ListUsers/sysop|адміністратора]]. сістемы.',
 'upload-too-many-redirects' => 'URL обсягує барз велё напрямлінь',
 'upload-unknown-size' => 'Незнамый розмір',
-'upload-http-error' => 'Дішло ку хыбі HTTP: $1',
+'upload-http-error' => 'Стала ся хыба HTTP: $1',
+'upload-copy-upload-invalid-domain' => 'Наладовованя копірованём негодно з той домены.',
+
+# File backend
+'backend-fail-stream' => 'Не вдало ся транслёвати файл $1.',
+'backend-fail-backup' => 'Не вдало ся створити резервну копію файлу $1.',
+'backend-fail-notexists' => 'Файл $1 не існує.',
+'backend-fail-hashes' => 'Не вдало ся обтримати гешы файлів про порівнаня.',
+'backend-fail-notsame' => 'Неідентичный файл $1 вже існує.',
+'backend-fail-invalidpath' => '$1 є неправилна степка к місцю уложіня.',
+'backend-fail-delete' => 'Не вдало ся вылучіти файл $1.',
+'backend-fail-alreadyexists' => 'Файл $1 вже існує.',
+'backend-fail-store' => 'Не вдало ся уложыти файл $1 в $2.',
+'backend-fail-copy' => 'Не вдало ся скопіровати файл $1 до $2.',
+'backend-fail-move' => 'Не вдало ся перемістити файл $1 до $2.',
+'backend-fail-opentemp' => 'Не вдало ся отворити дочасный файл.',
+'backend-fail-writetemp' => 'Не вдало ся записати до дочасного файлу.',
+'backend-fail-closetemp' => 'Не вдало ся заперти дочасный файл.',
+'backend-fail-read' => 'Не вдало ся прочітати файл $1.',
+'backend-fail-create' => 'Не вдало ся записати файл $1.',
+'backend-fail-maxsize' => 'Не вдало ся записати до файлу $1, бо він векшый як {{PLURAL:$2|$2 байт|$2 байты|$2 байтів}}.',
+'backend-fail-readonly' => 'Кінцёва уложна сістема „$1“ моментално лем на чітаня. Прічіна: „$2“',
+'backend-fail-synced' => 'Файл "$1" в кінцёвій уложній сістемі в неконзістентнім стані',
+'backend-fail-connect' => 'Не вдало ся припоїти до кінцёвой уложной сістемы „$1“.',
+'backend-fail-internal' => 'В кінцёвій уложній сістемі „$1“ ся стала незнама хыба.',
+'backend-fail-contenttype' => 'Не годно было становити тіп обсягу файлу, жебы уложыти го до „$1“.',
+'backend-fail-batchsize' => 'Кінцёве усховище прияло блок з $1 {{PLURAL:файловов операціов|файловыма операціями}};максімум є {{PLURAL:$2|$2}}.',
+'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“ не годен отворити.',
+'lockmanager-fail-releaselock' => 'Не годен увольнити замок про „$1“.',
+'lockmanager-fail-db-bucket' => 'Не годен навязати споїня з достаточнов кількостёв датабаз замків в сеґментї $1.',
+'lockmanager-fail-db-release' => 'Замкнутя датабазы $1 не вдало ся увольнити.',
+'lockmanager-fail-svr-acquire' => 'Не вдало ся здобыти замок сервера $1.',
+'lockmanager-fail-svr-release' => 'Замкнутя сервера $1 не вдало ся увольнити.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'При одкрытю ZIP-архіву про ёго перевірку выникла хыба.',
 'zip-wrong-format' => 'Вказаный файл не є ZIP-файлом',
 'zip-bad' => 'ZIP-файл є пошкодженый ці в іншый способ непридатный про чітаня.
-Не годен перевірити ёго безпечность.',
+Не годен перевірити ёго беспеку.',
 'zip-unsupported' => 'Файл хоснує такы можности ZIP, якы MediaWiki не підпорує.
-Не годен перевірити ёго безпечность.',
+Не годен перевірити ёго беспеку.',
 
 # Special:UploadStash
-'uploadstash' => 'Ð\9dагÑ\80аÑ\82и Ñ\81кÑ\80Ñ\8bÑ\88Ñ\83',
-'uploadstash-summary' => 'ТоÑ\82а Ñ\81Ñ\82оÑ\80Ñ\96нка Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\82Ñ\8c Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п ÐºÑ\83 Ñ\84айлом ÐºÐ¾Ñ\82Ñ\80Ñ\8b Ñ\81Ñ\83Ñ\82Ñ\8c Ð½Ð°Ð³Ñ\80аÑ\82Ñ\8b (або Ð½Ð°Ð³Ñ\80аванÑ\8f Ñ\96Ñ\89Ñ\96 Ð½Ðµ Ñ\81кÑ\96нÑ\87Ñ\96ло) Ð°Ð»Ðµ Ñ\96Ñ\89Ñ\96 Ð½Ðµ Ð±Ñ\8bли Ð¿Ñ\83влÑ\96кованÑ\8b Ð½Ð° Ð²Ñ\96кÑ\96. Ð¢Ð¾Ñ\82Ñ\8b Ñ\84айлÑ\8b Ð½Ðµ Ð²Ð¸Ð´Ð¸Ñ\82Ñ\8c Ð½Ð¸Ñ\85Ñ\82о Ð¾ÐºÑ\80ем Ñ\85оÑ\81новаÑ\82елÑ\8f Ñ\88Ñ\82о Ñ\97Ñ\85 Ð½Ð°Ð³Ñ\80ав.',
+'uploadstash' => 'СкÑ\80Ñ\8bÑ\88а Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8bÑ\85 Ñ\84айлÑ\96в',
+'uploadstash-summary' => 'ТоÑ\82а Ñ\81Ñ\82оÑ\80Ñ\96нка Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\82Ñ\8c Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п ÐºÑ\83 Ñ\84айлом ÐºÐ¾Ñ\82Ñ\80Ñ\8b Ñ\81Ñ\83Ñ\82Ñ\8c Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8b (або Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8f Ñ\96Ñ\89Ñ\96 Ð½Ðµ Ñ\81кÑ\96нÑ\87Ñ\96ло) Ð°Ð»Ðµ Ñ\96Ñ\89Ñ\96 Ð½Ðµ Ð±Ñ\8bли Ð¾Ð¿Ñ\83влÑ\96кованÑ\8b Ð½Ð° Ð²Ñ\96кÑ\96. Ð¢Ð¾Ñ\82Ñ\8b Ñ\84айлÑ\8b Ð½Ðµ Ð²Ð¸Ð´Ð¸Ñ\82Ñ\8c Ð½Ð¸Ñ\85Ñ\82о Ð¾ÐºÑ\80ем Ñ\85оÑ\81новаÑ\82елÑ\8f Ñ\88Ñ\82о Ñ\97Ñ\85 Ð½Ð°Ð»Ð°Ð´Ð¾Ð²ав.',
 'uploadstash-clear' => 'Змазати схованы файлы',
 'uploadstash-nofiles' => 'Не маєте жадны схованы файлы.',
 'uploadstash-badtoken' => 'Выконаня той дїї не было успішне, може зато, же вашы повірїня про едітованя скінчіли. Попробуйте знову.',
 'uploadstash-errclear' => 'Змазаня файлів не было успішне.',
 'uploadstash-refresh' => 'Обновити список файлів',
+'invalid-chunk-offset' => 'Неприступный посув фраґмента.',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Приступ одопертый',
 'img-auth-nopathinfo' => 'Ваш сервер не є наштелёваный так, жебы давав тоту інформацію.
 Може фунґує помочов CGI і img_auth на нім не може фунґовати.
 Посмотьте https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
-'img-auth-notindir' => 'Пожадована стежка не є в конфіґурованім адресарю з начітаныма файлами.',
+'img-auth-notindir' => 'Пожадована стежка не є в конфіґурованім адресарю із наладованыма файлами.',
 'img-auth-badtitle' => 'З „$1“  ся не дасть створити платна назва сторінкы.',
 'img-auth-nologinnWL' => 'Не сьте приголошеный і „$1“ не є на білім списку.',
 'img-auth-nofile' => 'Файл «$1» не екзістує.',
 'img-auth-isdir' => 'Пробуєте приступовати до адресаря „$1“.
-Доволеный є лем приступ к файлам.',
\94озволенÑ\8bй Ñ\94 Ð»ÐµÐ¼ Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п Ðº Ñ\84айлам.',
 'img-auth-streaming' => 'Переношать ся „$1“.',
-'img-auth-public' => 'Помочов img_auth.php ся поскытують файлы на пріватных вікі.
+'img-auth-public' => 'Помочов img_auth.php ся придавають файлы з пріватных вікі.
 Тота вікі є наставлена як публічна.
-З безпечностных причін є img_auth.php выпнуте.',
+З беспечностных прічін є img_auth.php выпнуте.',
 'img-auth-noread' => 'Хоснователь не має приступ про чітаня „$1“.',
 'img-auth-bad-query-string' => 'URL обсягує неправилный одказ.',
 
 # HTTP errors
 'http-invalid-url' => 'Неправилне URL: $1',
 'http-invalid-scheme' => 'URL хоснуючі схемы „$1“  не суть підпорованы.',
-'http-request-error' => 'Ð\9dезнама Ñ\85Ñ\8bба Ð¿Ð¾Ñ\87аÑ\81 Ð¾Ð´Ð¾Ñ\81Ñ\8bланÑ\8f пожадавкы.',
-'http-read-error' => 'Хыба почас чітаня HTTP.',
+'http-request-error' => 'Ð\9dезнана Ñ\85Ñ\8bба Ð¿Ñ\80и Ð¾Ð´Ð¾Ñ\81Ñ\8bланÑ\8e пожадавкы.',
+'http-read-error' => 'Хыба чітаня HTTP.',
 'http-timed-out' => 'Час про HTTP пожадавкы уплинув.',
 'http-curl-error' => 'Хыба при чітаню з URL: $1',
-'http-host-unreachable' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило Ñ\81Ñ\8f ÐºÐ¾Ð½Ñ\82акÑ\80овати URL.',
-'http-bad-status' => 'Почас HTTP пожадавкы настав проблем: $1 $2',
+'http-host-unreachable' => 'Ð\9dе Ð²Ð´Ð°Ð»Ð¾ Ñ\81Ñ\8f Ð´Ð¾Ñ\81Ñ\8fгнÑ\83ти URL.',
+'http-bad-status' => 'Під час HTTP пожадавкы притрафив ся проблем: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило ся досягнути URL.',
+'upload-curl-error6' => 'Ð\9dе Ð²Ð´Ð°ло ся досягнути URL.',
 'upload-curl-error6-text' => 'Із зазначеной URL ся не дасть чітати. Перевірте ці є URL правилно написана і сервер є доступный.',
-'upload-curl-error28' => 'Час про награваня уплинув',
+'upload-curl-error28' => 'Час становленый на наладованя уж вычерьпаный',
 'upload-curl-error28-text' => 'Сервер довго не одповідать. Перевірте ці є доступный і кус почекайте і спробуйте то знову.',
 
 'license' => 'Ліценцованя:',
@@ -1554,8 +1709,8 @@ $1',
 'upload_source_file' => ' (файл на вашім компютерї)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Тота шпеціална сторінка зображує вшыткы начітаны файлы.
\9fÑ\80и Ñ\84Ñ\96лÑ\82Ñ\80ованÑ\8e Ð¿Ð¾Ð´Ð»Ñ\8f Ñ\85оÑ\81новаÑ\82елÑ\8f Ñ\81Ñ\8f Ð·Ð¾Ð±Ñ\80ажÑ\83Ñ\8eÑ\82Ñ\8c Ð»ÐµÐ¼ Ñ\84айлÑ\8b, Ñ\83 ÐºÐ¾Ñ\82Ñ\80Ñ\8bÑ\85 Ñ\85оÑ\81новаÑ\82елÑ\8c Ð½Ð°Ñ\87Ñ\96Ñ\82ав актуалну верзію.',
+'listfiles-summary' => 'Тота шпеціална сторінка зображує вшыткы наладованы файлы.
\9fÑ\80и Ñ\84Ñ\96лÑ\82Ñ\80ованÑ\8e Ð·Ð° Ñ\85оÑ\81новаÑ\82елÑ\91м, Ð·Ð¾Ð±Ñ\80ажÑ\83Ñ\8eÑ\82Ñ\8c Ñ\81Ñ\8f Ð»ÐµÐ¼ Ñ\84айлÑ\8b, Ñ\83 ÐºÐ¾Ñ\82Ñ\80Ñ\8bÑ\85 Ñ\85оÑ\81новаÑ\82елÑ\8c Ð½Ð°Ð»Ð°Ð´Ð¾Ð²ав актуалну верзію.',
 'listfiles_search_for' => 'Глядати файл по назві:',
 'imgfile' => 'файл',
 'listfiles' => 'Список файлів',
@@ -1584,7 +1739,7 @@ $1',
 'filehist-filesize' => 'Розмір файлу',
 'filehist-comment' => 'Коментарь',
 'filehist-missing' => 'Файл хыбіть',
-'imagelinks' => 'Ð\92Ñ\8bÑ\83жÑ\8bÑ\82я файлу',
+'imagelinks' => 'ХоÑ\81нованя файлу',
 'linkstoimage' => '{{PLURAL:$1|Далша сторінка ся одказує|Далшы сторінкы ся одказують}} на тот файл:',
 'linkstoimage-more' => 'На тот файл {{PLURAL:$1|одказує веце сторінок|одказує веце як $1 сторінок|одказує веце як $1 сторінок}}.
 Наслїдуючій список зображує лем {{PLURAL:$1|тоту першу|першы $1|першых $1}}.
@@ -1598,9 +1753,13 @@ $1',
 Веце інформацій обсягує ёго [$2 сторінка з пописом файлу].',
 'sharedupload-desc-here' => 'Тот файл походить з {{grammar:2sg|$1}} і можуть го хосновати другы проєкты.
 Ниже суть зображены інформації, котры обсягує ёго [$2 сторінка з пописом файлу].',
+'sharedupload-desc-edit' => 'Гевсесь файл походить з {{grammar:2sg|$1}} тай можуть го хосновати другы проєкты.
+Може хочете управити [$2 тамтушню строрінку з пописом файлу].',
+'sharedupload-desc-create' => 'Гевсесь файл походить з {{grammar:2sg|$1}} тай можуть го хосновати другы проєкты.
+Може бы сьте хотїли правити [$2 тамтушню сторінку з пописом файлу].',
 'filepage-nofile' => 'Не екзістує файл з таков назвов',
-'filepage-nofile-link' => 'Файл з таков назвов не екзістує, але можете [$1 го начітати].',
-'uploadnewversion-linktext' => 'Ð\9dагÑ\80ати нову верзію того файлу',
+'filepage-nofile-link' => 'Файл з таков назвов не екзістує, але можете [$1 го наладовати].',
+'uploadnewversion-linktext' => 'Ð\9dаладовати нову верзію того файлу',
 'shared-repo-from' => 'з $1',
 'shared-repo' => 'здїляного усховіща',
 
@@ -1609,7 +1768,7 @@ $1',
 'filerevert-legend' => 'Вернути назад файл',
 'filerevert-intro' => "Вертате назад '''[[Media:$1|$1]]''' на [$4 верзію з $3 $2].",
 'filerevert-comment' => 'Причіна:',
-'filerevert-defaultcomment' => 'Ð\9dавеÑ\80нÑ\83Ñ\82а Ð²ÐµÑ\80зÑ\96Ñ\8f Ð½Ð°Ð³Ñ\80ана Ð²  $2 дня $1.',
+'filerevert-defaultcomment' => 'Ð\9dавеÑ\80нÑ\83Ñ\82а Ð²ÐµÑ\80зÑ\96Ñ\97 Ð· $2 дня $1.',
 'filerevert-submit' => 'Вернути назад',
 'filerevert-success' => "Файл '''[[Media:$1|$1]]''' быв вернутый назад на [$4 верзію з $3 $2].",
 'filerevert-badversion' => 'Не є доступна попередня верзія того файлу з одоповідаючов часовов значков.',
@@ -1636,7 +1795,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'Гляданя по MIME',
-'mimesearch-summary' => 'ТоÑ\82а Ñ\81Ñ\82оÑ\80Ñ\96нка Ñ\83можнÑ\8eÑ\94 Ñ\84Ñ\96лÑ\82Ñ\80оваÑ\82и Ñ\84айлÑ\8b Ð¿Ð¾Ð´Ð»Ñ\8f Ñ\82Ñ\96пÑ\83 MIME.<br />
+'mimesearch-summary' => 'ТоÑ\82а Ñ\81Ñ\82оÑ\80Ñ\96нка Ñ\83можнÑ\8eÑ\94 Ñ\84Ñ\96лÑ\82Ñ\80оваÑ\82и Ñ\84айлÑ\8b Ð·Ð° Ñ\82Ñ\96пом MIME.<br />
 Вступ: <code>тіп обсягу/підтіп</code>, наприклад <code>image/jpeg</code>.',
 'mimetype' => 'MIME-тіп:',
 'download' => 'скачати',
@@ -1653,11 +1812,11 @@ $1',
 'unusedtemplateswlh' => 'іншы одказы',
 
 # Random page
-'randompage' => 'Ð\9dагодна статя',
+'randompage' => 'ТÑ\80аÑ\84Ñ\83нкова статя',
 'randompage-nopages' => 'Не є сторінок в {{PLURAL:$2|просторі назв|просторах назв}} $1.',
 
 # Random redirect
-'randomredirect' => 'Ð\9dагодне напрямлїня',
+'randomredirect' => 'ТÑ\80аÑ\84Ñ\83нкове напрямлїня',
 'randomredirect-nopages' => 'Простор назв „$1“ не обсягує жадны напрямлїня.',
 
 # Statistics
@@ -1670,7 +1829,7 @@ $1',
 'statistics-articles' => 'Обсяговы сторінкы',
 'statistics-pages' => 'Сторінкы',
 'statistics-pages-desc' => 'Вшыткы сторінкы на вікі враховано діскузій, напрямлїня ітд.',
-'statistics-files' => 'Начітаны файлы',
+'statistics-files' => 'Наладованы файлы',
 'statistics-edits' => 'Чісло едітованя од основаня вікі {{SITENAME}}',
 'statistics-edits-average' => 'Середнє чісло едітовань на сторінку',
 'statistics-views-total' => 'Вшыткых переглядів',
@@ -1683,7 +1842,9 @@ $1',
 
 'disambiguations' => 'Сторінкы одказуючі на богатозначны статї',
 'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Одказы на наслїдуючіх сторінках ведуть на '''богатозначны сторінкы'''. (сторінкы котры обсягують дакотру з тых шаблон на [[MediaWiki:Disambiguationspage|списку шаблон про богатозначны сторінкы]]) намісто на дану статю.",
+'disambiguations-text' => "Слїдуючі сторінкы включають найменше єден одказ на '''чеперушку'''.
+Асі намісто того мали бы одказовати на конкретнїшу сторінку.<br />
+Сторінка є тримана за чеперушку, кідь хоснує дакотру із шаблон одказованых на [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Двоїты напрямлїня',
 'doubleredirectstext' => 'На тій сторінцї є список напрямлїн ведучіх на далшы напрямлїня.
@@ -1728,6 +1889,8 @@ $1',
 'wantedpages' => 'Пожадованы статї',
 'wantedpages-badtitle' => 'Резултаты обсягують неправилну назву: $1',
 'wantedfiles' => 'Жаданы файлы',
+'wantedfiletext-cat' => 'Наступны файлы ся хоснують але не існують. Файл з одлеглых усховищ гев можуть быти написасны, бо існують. Такы фалешны позітіва будуть зображены <del>перечаркнути</del>. Сторінкы, котры включають неіснуючі файлы суть іщі к тому написаны на  [[:$1]].',
+'wantedfiletext-nocat' => 'Насупны файлы ся хоснують але не існують. Файлы з одлеглых усховищ гев можуть быти написаны, ай наперек тому же існують. Такы фалешны позітіва будуть зображены <del>перечаркнуты</del>.',
 'wantedtemplates' => 'Хыблячі шаблоны',
 'mostlinked' => 'Найодказованїшы сторінкы',
 'mostlinkedcategories' => 'Найхоснованїшы катеґорії',
@@ -1736,6 +1899,7 @@ $1',
 'mostimages' => 'Найужыванїшы файлы',
 'mostrevisions' => 'Сторінкы з найвеце ревізіями',
 'prefixindex' => 'Вшыткы сторінкы з початком назв',
+'prefixindex-namespace' => 'Вшыткы сторінкы з префіксом (простор назв $1)',
 'shortpages' => 'Курты статї',
 'longpages' => 'Найдовшы статті',
 'deadendpages' => 'Слїпы сторінкы',
@@ -1746,11 +1910,11 @@ $1',
 'protectedpagestext' => 'Наслїдуючі сторінкы суть замкнуты або напів замкнуты про едітованя або переменованя',
 'protectedpagesempty' => 'Жадна сторінка не є замкнута з тыма параметрами.',
 'protectedtitles' => 'Замкнуты назвы сторінок',
-'protectedtitlestext' => 'Наслїдуючі назвы суть замкнуты і не доволены про сторінкы',
+'protectedtitlestext' => 'Ð\9dаÑ\81лÑ\97дÑ\83Ñ\8eÑ\87Ñ\96 Ð½Ð°Ð·Ð²Ñ\8b Ñ\81Ñ\83Ñ\82Ñ\8c Ð·Ð°Ð¼ÐºÐ½Ñ\83Ñ\82Ñ\8b Ñ\96 Ð½Ðµ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\8b Ð¿Ñ\80о Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b',
 'protectedtitlesempty' => 'Жадна назва не є замкнута з тыма параметрами.',
 'listusers' => 'Список хоснователїв',
 'listusers-editsonly' => 'Вказати лем хоснователїв з едітованями',
-'listusers-creationsort' => 'СоÑ\80Ñ\82оваÑ\82и Ð¿Ð¾Ð´Ð»Ñ\8f Ð´Ð°Ñ\82Ñ\83мÑ\83 створїня',
+'listusers-creationsort' => 'СоÑ\80Ñ\82оваÑ\82и Ð·Ð° Ð´Ð°Ñ\82Ñ\83мом створїня',
 'usereditcount' => '$1 {{PLURAL:$1|едітованя|едітованя|едітовань}}',
 'usercreated' => '{{GENDER:$3|Реґістрованый|Реґістрована|Реґістрованый(а)}} $1 в $2',
 'newpages' => 'Новы сторінкы',
@@ -1786,6 +1950,7 @@ $1',
 Зображіня можете зужыти выбером тіпу запису, мена хоснователя (залежыть на великости букв) або зазначеной сторінкы (тыж залежыть на великости букв).',
 'logempty' => 'Протокол не обсягує жаден одповідаючій запис.',
 'log-title-wildcard' => 'Глядати назвы зачінаючі ся з тым текстом',
+'showhideselectedlogentries' => 'Вказати/сховати зволены записы лоґу.',
 
 # Special:AllPages
 'allpages' => 'Вшыткы сторінкы',
@@ -1801,8 +1966,14 @@ $1',
 'allpagesnext' => 'Далшы',
 'allpagessubmit' => 'Выконати',
 'allpagesprefix' => 'Вказати сторінкы што ся зачінають на:',
-'allpagesbadtitle' => 'Задана назва сторінкы не была платна або обсяговала префікс міджіязыкового або міджівікі одказу. Може обсяговав буквы, котры не суть доволены.',
+'allpagesbadtitle' => 'Задана назва сторінкы не была правилна або обсяговала префікс міджіязыкового або міджівікі одказу. Може обсяговав буквы, котры не суть дозволены.',
 'allpages-bad-ns' => '{{SITENAME}} не має простору назв «$1».',
+'allpages-hide-redirects' => 'Сховати напрямлїня',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Позерати собі кешовану верзію той сторінкы, котра може быти стара аж $1.',
+'cachedspecial-viewing-cached-ts' => 'Позерати собі кешовану верзію той сторінкы, котра могла стратити актуалность.',
+'cachedspecial-refresh-now' => 'Вказати найновшы.',
 
 # Special:Categories
 'categories' => 'Катеґорії',
@@ -1810,7 +1981,7 @@ $1',
 Невказаны суть то [[Special:UnusedCategories|нехоснованы катеґорії]].
 Посмотьте ся тыж на [[Special:WantedCategories|жаданы катеґорії]].',
 'categoriesfrom' => 'Вказати сторінкы, што ся зачінають на:',
-'special-categories-sort-count' => 'Ñ\83поÑ\80Ñ\8fдковаÑ\82и Ð¿Ð¾Ð´Ð»Ñ\8f Ð¼Ð½Ð¾Ð¶ÐµÑ\81Ñ\82ва',
+'special-categories-sort-count' => 'Ñ\83поÑ\80Ñ\8fдковаÑ\82и Ð·Ð° ÐºÑ\96лÑ\8cкоÑ\81Ñ\82Ñ\91в',
 'special-categories-sort-abc' => 'упорядковати за алфавітом',
 
 # Special:DeletedContributions
@@ -1825,7 +1996,7 @@ $1',
 'linksearch-ok' => 'Глядати',
 'linksearch-text' => 'Може хосновати заступны сімболы, наприклад „*.wikipedia.org“.<br />
 Повиннов є передовшыткым домена найвысшой уровни, напр. „*.org“.<br />
-Підпорованы протоколы: <tt>$1</tt>',
+Підпорованы протоколы: <code>$1</code>',
 'linksearch-line' => '$2 одказує на $1',
 'linksearch-error' => 'Заступны сімболы може хосновати лем на початку доменового мена.',
 
@@ -1871,7 +2042,7 @@ $1',
 # E-mail user
 'mailnologin' => 'Без адресы одосланя',
 'mailnologintext' => 'Кідь хочете посылати ел. пошту іншым хоснователям, мусите ся [[Special:UserLogin|приголосити]] і мати платну адресу ел. пошты в своїм [[Special:Preferences|наставлїню]].',
-'emailuser' => 'Послати е-маіл тому хоснователёві',
+'emailuser' => 'Послати імейл тому хоснователёви',
 'emailpage' => 'Пошлийте е-пошту',
 'emailpagetext' => 'Помочов ниже зображеного формуларя можете тому хоснователёви послати повідомлїня ел. поштов.
 Адреса ел. пошты, котру мате зазначену в [[Special:Preferences|наставлїня]],ся обявить як адреса одосылателя пошты, жебы вам адресат міг одповісти прямо.',
@@ -1881,13 +2052,13 @@ $1',
 'usermaildisabledtext' => 'Не маєте право одосылати ел. пошту іншым хоснователям той вікі',
 'noemailtitle' => 'Без адресы ел. пошты',
 'noemailtext' => 'Тот хоснователь не зазначів платну адресу ел. пошты.',
-'nowikiemailtitle' => 'Ел. пошта не є доволена',
+'nowikiemailtitle' => 'Ð\95л. Ð¿Ð¾Ñ\88Ñ\82а Ð½Ðµ Ñ\94 Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð°',
 'nowikiemailtext' => 'Тот хоснователь собі не желать діставати пошту од іншых хоснователїв.',
 'emailnotarget' => 'Неекзістуюче або некоректне імя хоснователя.',
 'emailtarget' => 'Уведьте імя хоснователя-адресата',
 'emailusername' => 'Імя хоснователя:',
 'emailusernamesubmit' => 'Одослати',
-'email-legend' => 'Одосыланя ел. пошты іншому хоснователёві {{GRAMMAR:2sg|{{SITENAME}}}}',
+'email-legend' => 'Одосыланя ел. пошты іншому хоснователёви {{GRAMMAR:2sg|{{SITENAME}}}}',
 'emailfrom' => 'Од:',
 'emailto' => 'Кому:',
 'emailsubject' => 'Тема:',
@@ -1897,7 +2068,7 @@ $1',
 'emailccsubject' => 'Копія вашого повідомлїня про хоснователя $1: $2',
 'emailsent' => 'Пошта одослана',
 'emailsenttext' => 'Ваше повідомлїня было послане.',
-'emailuserfooter' => 'Тота ел. пошта была послана з {{grammar:2sg|{{SITENAME}}}} за помочі функції „Послати ел, пошту“; одослав го хоснователь $1 хоснователёві $2',
+'emailuserfooter' => 'Тота ел. пошта была послана з {{grammar:2sg|{{SITENAME}}}} за помочі функції „Послати ел, пошту“; одослав го хоснователь $1 хоснователёви $2',
 
 # User Messenger
 'usermessage-summary' => 'Зохабити сістемове повідомлїня',
@@ -1937,7 +2108,7 @@ $1',
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Придаваня до списку слїдованя...',
 'unwatching' => 'Одобратя зо списку слїдованя...',
-'watcherrortext' => 'При змінї слїдованой сторінкы „$1“ дішло ку хыбі.',
+'watcherrortext' => 'При змінї слїдованой сторінкы „$1“ ся стала хыба.',
 
 'enotif_mailer' => 'Засылач нотіфікацій {{grammar:2sg|{{SITENAME}}}}',
 'enotif_reset' => 'Означіти вшытко як навщівене',
@@ -1980,7 +2151,7 @@ $UNWATCHURL
 
 # Delete
 'deletepage' => 'Змазати сторінку',
-'confirm' => 'Підтверджіня',
+'confirm' => 'Потверджіня',
 'excontent' => 'обсяг быв: „$1“',
 'excontentauthor' => 'обсяг быв: „$1“ (і єдиным приспівателём быв „[[Special:Contributions/$2|$2]]“)',
 'exbeforeblank' => 'обсяг перед выпорожнїнём быв: „$1“',
@@ -1989,9 +2160,9 @@ $UNWATCHURL
 'delete-legend' => 'Вымазати',
 'historywarning' => "'''Варованя:''' Сторінка, котру хочете змазати, має історію з приближно $1 {{plural:$1|ревізії|ревізіями}}:",
 'confirmdeletetext' => 'Рыхтуєте ся вымазати сторінку і вшыткы єй лоґы едітовань.
-Просиме Вас, підтвердьте, же справды тото хочете зробити, повно розумієте наслїдкы і же робите тото в одповідности з [[{{MediaWiki:Policy-url}}|правилами]].',
+Просиме Вас, потвердьте, же справды тото хочете зробити, повно розумієте наслїдкы і же робите тото в одповідности з [[{{MediaWiki:Policy-url}}|правилами]].',
 'actioncomplete' => 'Дїя выконана',
-'actionfailed' => 'Ð\9eпеÑ\80аÑ\86Ñ\96Ñ\8f Ñ\81Ñ\8f Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ила',
+'actionfailed' => 'Ð\9eпеÑ\80аÑ\86Ñ\96Ñ\8f Ñ\81Ñ\8f Ð½Ðµ Ð²Ð´Ð°ла',
 'deletedtext' => '"$1" было змазане.
 Смоть $2 про список послїднїх змазань.',
 'dellogpage' => 'Лоґ вымазаня',
@@ -2006,13 +2177,15 @@ $UNWATCHURL
 ** Порушїня авторьскых прав
 ** Вандалізм',
 'delete-edit-reasonlist' => 'Едітовати причіны вымазаня',
-'delete-toobig' => 'ТоÑ\82а Ñ\81Ñ\82оÑ\80Ñ\96нка Ð¼Ð°Ñ\94 Ð²ÐµÐ»Ð¸ÐºÑ\83 Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e ÐµÐ´Ñ\96Ñ\82ованÑ\8f, Ñ\87еÑ\80ез $1 {{plural:$1|веÑ\80зÑ\96Ñ\97|веÑ\80зÑ\96й|веÑ\80зÑ\96й}}. Ð\9cазанÑ\8f Ñ\82акÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок Ñ\94 Ð¾Ð±Ð¼ÐµÐ´Ð¶ÐµÐ½Ð¾, Ð¶ÐµÐ±Ñ\8b Ñ\81Ñ\8f Ð¿ÐµÑ\80едÑ\96Ñ\88ло нехоченому нарушіню {{grammar:2sg|{{SITENAME}}}}.',
+'delete-toobig' => 'ТоÑ\82а Ñ\81Ñ\82оÑ\80Ñ\96нка Ð¼Ð°Ñ\94 Ð²ÐµÐ»Ð¸ÐºÑ\83 Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e ÐµÐ´Ñ\96Ñ\82ованÑ\8f, Ñ\87еÑ\80ез $1 {{plural:$1|веÑ\80зÑ\96Ñ\97|веÑ\80зÑ\96й|веÑ\80зÑ\96й}}. Ð\9cазанÑ\8f Ñ\82акÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок Ñ\94 Ð¾Ð±Ð¼ÐµÐ´Ð¶ÐµÐ½Ð¾, Ð¶ÐµÐ±Ñ\8b Ñ\81Ñ\8f Ð·Ð°Ð±Ð¾Ñ\80онило нехоченому нарушіню {{grammar:2sg|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Тота сторінка має велику історію едітацій, через $1 {{plural:$1|верзії|верзій|верзій}}. Мазаня такых сторінок може нарушыти датабазовы операцім {{grammar:2sg|{{SITENAME}}}}; мерькуйте.',
 
 # Rollback
 'rollback' => 'Вернути назад едітованя',
 'rollback_short' => 'Вернути назад',
 'rollbacklink' => 'вернути назад',
+'rollbacklinkcount' => 'вернутя $1 {{PLURAL:$1|едітованя|едітовань}} назад',
+'rollbacklinkcount-morethan' => 'вернутя бівше як $1 {{PLURAL:$1|едітованя|едітовань}} назад',
 'rollbackfailed' => 'Не годно было ся вернути назад',
 'cantrollback' => 'Не годен вернути послїднє едітованя, бо послїднїй приспіватель є єдиным автором той сторінкы.',
 'alreadyrolled' => 'Не годен вернути послїднє едітованя [[:$1]] од хоснователя [[User:$2|$2]] ([[User talk:$2|діскузія]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), бо дахто друхый уже сторінку едітовав або вернув тоту зміну назад.
@@ -2030,24 +2203,24 @@ $UNWATCHURL
 Стисните клапку „назад“, обновте сторінку, з котрой сьте пришли і спробуйте то знову;',
 
 # Protect
-'protectlogpage' => 'Лоґ охраны',
-'protectlogtext' => 'Ниже є уведеный список вшыткых замків і сторінок.
\9fоÑ\81моÑ\82Ñ\8c [[Special:ProtectedPages|Ñ\81пиÑ\81ок Ñ\85Ñ\80аненых сторінок]]',
+'protectlogpage' => 'Лоґ сокочіня',
+'protectlogtext' => 'Ð\9dиже Ñ\94 Ñ\83ведженÑ\8bй Ñ\81пиÑ\81ок Ð²Ñ\88Ñ\8bÑ\82кÑ\8bÑ\85 Ð·Ð°Ð¼ÐºÑ\96в Ñ\96 Ñ\81Ñ\82оÑ\80Ñ\96нок.
\9fоÑ\81моÑ\82Ñ\8c [[Special:ProtectedPages|Ñ\81пиÑ\81ок Ñ\81окоÑ\87еных сторінок]]',
 'protectedarticle' => 'замыкать "[[$1]]"',
 'modifiedarticleprotection' => 'зміненa рівень охраны сторінкы «[[$1]]»',
 'unprotectedarticle' => 'знята охрана з "[[$1]]"',
-'movedarticleprotection' => 'наставлїня замків пересунуто з „[[$2]]“ на „[[$1]]“',
+'movedarticleprotection' => 'наставлїня замків перенесено з „[[$2]]“ на „[[$1]]“',
 'protect-title' => 'Зміна уровнї охраны сторінкы „$1“',
 'protect-title-notallowed' => 'Указати уровни охраны сторінкы „$1“',
 'prot_1movedto2' => '«[[$1]]» переменована на «[[$2]]»',
 'protect-badnamespace-title' => 'Незамыкательный простор назв',
 'protect-badnamespace-text' => 'Сторінкы в тім просторї назв не годен замыкати.',
-'protect-legend' => 'Підтвердити замкнутя',
+'protect-legend' => 'Потвердити замкнутя',
 'protectcomment' => 'Причіна:',
 'protectexpiry' => 'Кінчіть:',
 'protect_expiry_invalid' => 'Неправилный час укончіня',
 'protect_expiry_old' => 'Час страты платности є в минулости.',
-'protect-unchain-permissions' => 'Ð\97пÑ\80иÑ\81Ñ\82Ñ\83пниÑ\82и далшы наставлїня замку',
+'protect-unchain-permissions' => 'Ð\9eÑ\82воÑ\80иÑ\82и Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п Ð½Ð° далшы наставлїня замку',
 'protect-text' => "Ту можете видїти і змінити рівень охраны сторінкы '''$1'''.",
 'protect-locked-blocked' => "Не можете мінити наставлїня замків покы сьте заблокованый. Сучасне наставлїня про тоту сторінку є: '''$1''':",
 'protect-locked-dblock' => "Наставлїня замків ся не дасть змінити про замкнуту датабазу.
@@ -2055,14 +2228,14 @@ $UNWATCHURL
 'protect-locked-access' => "Ваше конто немає права мінити рівень охраны сторінкы.
 Моменталны наставлїня про сторінку : '''$1''':",
 'protect-cascadeon' => 'Тота сторінка є теперь хранена, бо є загорнута {{PLURAL:$1|до зазначеной сторінкы ніже, на яку|до ниже зазначеных сторінок, на якы}} становлена каскадова охрана. Вы можете змінити рівень охраны той сторінкы, але тото не буде впливати на каскадову охрану.',
-'protect-default' => 'Доволити вшыткым хоснователям',
+'protect-default' => 'Ð\94озволиÑ\82и Ð²Ñ\88Ñ\8bÑ\82кÑ\8bм Ñ\85оÑ\81новаÑ\82елÑ\8fм',
 'protect-fallback' => 'Портрібны "$1" права',
 'protect-level-autoconfirmed' => 'Блоковати новых і незареґістрованых хоснователїв',
 'protect-level-sysop' => 'Лем адміністраторы',
 'protect-summary-cascade' => 'каскадовый',
 'protect-expiring' => 'кінчіть $1 (UTC)',
 'protect-expiring-local' => 'кінчіть ся $1',
-'protect-expiry-indefinite' => 'до Ð¾Ð´Ð²Ð¾Ð»Ð°Ð½Ñ\8f',
+'protect-expiry-indefinite' => 'навÑ\81е (до Ð¿Ð¾ÐºÐ»Ð¸ÐºÐ°Ð½Ñ\8f)',
 'protect-cascade' => 'Хранити сторінкы вложены до той сторінкы (каскадова охрана)',
 'protect-cantedit' => 'Вы не можете змінити рівень охороны той сторінкы, тому што вы не маєте прав про єй едітованя.',
 'protect-othertime' => 'Іншый час:',
@@ -2087,7 +2260,7 @@ $UNWATCHURL
 'restriction-edit' => 'Едітованя',
 'restriction-move' => 'Переменовати',
 'restriction-create' => 'Вытвориня',
-'restriction-upload' => 'Ð\9dагÑ\80аваня файлів',
+'restriction-upload' => 'Ð\9dаладовованя файлів',
 
 # Restriction levels
 'restriction-level-sysop' => 'замкнуте',
@@ -2120,21 +2293,23 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|Обновлена $1 верзія|Обновлены $1 верзії|Обновленых $1 верзій}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|Обновлена єдна верзія|Обновлены $1 верзії|Обновленых $1 верзій}} і $2 {{PLURAL:$2|файл|файлы|файлів}}.',
 'undeletedfiles' => '{{PLURAL:$1|обновленый $1 файл|обновлены $1 файлы|обновленых $1 файлів}}',
-'cannotundelete' => 'Ð\9eбновлÑ\97нÑ\8f Ñ\81Ñ\8f Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ило; правдоподобно  дахто другый обновив сторінку скоре як вы.',
+'cannotundelete' => 'Ð\9eбновлÑ\97нÑ\8f Ñ\81Ñ\8f Ð½Ðµ Ð²Ð´Ð°ло; правдоподобно  дахто другый обновив сторінку скоре як вы.',
 'undeletedpage' => "'''$1 была обновлена'''
 
 Запис о послїднїх мазанях і обновлїнях найдете в  [[Special:Log/delete|книзї змазаных сторінок]].",
 'undelete-header' => 'Видьте недавно змазаны сторінкы в [[Special:Log/delete|книзї змазаных сторінок]].',
+'undelete-search-title' => 'Гляданя змазаных сторінок',
 'undelete-search-box' => 'Гляданя вымазаных сторінок',
 'undelete-search-prefix' => 'Вказати сторінкы што ся почінають з',
 'undelete-search-submit' => 'Найти',
 'undelete-no-results' => 'Пожадавцї жадны змазаны сторінкы не одповідають.',
 'undelete-filename-mismatch' => 'Не годен обновити верзію файлу з часовов значков $1: назва файлу не одповідать',
 'undelete-bad-store-key' => 'Не годен обновити верзію файлу з часовов значков $1:  файл педед змазанём хыбив',
-'undelete-cleanup-error' => 'Хыба почас мазаня нехоснованого архівного файлу „$1“.',
-'undelete-missing-filearchive' => 'Не подарило ся обновити файл архіву з ідентіфікаціёв $1, протоже не є в датабазї. Може уже быв обновленый.',
-'undelete-error-short' => 'Хыба почас обновованя файлу: $1',
-'undelete-error-long' => 'Взникла хыба почас обновованя файлу:
+'undelete-cleanup-error' => 'Хыба мазаня нехоснованого архівного файлу „$1“.',
+'undelete-missing-filearchive' => 'Не вдало ся обновити файл архіву з ідентіфікаціёв $1, бо не є в датабазї. Може же уж быв обновленый.',
+'undelete-error' => 'Хыба обновлїня сторінкы',
+'undelete-error-short' => 'Хыба обновлїня файлу: $1',
+'undelete-error-long' => 'Выникла хыба під час обновлїня файлу:
 
 $1',
 'undelete-show-file-confirm' => 'На певно собі хочете посмотрити змазану ревізію файлу „<nowiki>$1</nowiki>“ з $2, $3?',
@@ -2149,21 +2324,21 @@ $1',
 'blanknamespace' => '(Основный)',
 
 # Contributions
-'contributions' => 'Приспевок хоснователя',
-'contributions-title' => 'Приспевок хоснователя $1',
-'mycontris' => 'Мої приспевкы',
-'contribsub2' => 'Приспевок $1 ($2)',
-'nocontribs' => 'Ð\9dенайдженÑ\8b Ð¶Ð°Ð´Ð½Ñ\8b Ð·Ð¼Ñ\96нÑ\8b Ð¿Ð¾Ð´Ð»Ñ\8f Ñ\82Ñ\8bÑ\85 ÐºÑ\80Ñ\96Ñ\82еÑ\80Ñ\96й.',
+'contributions' => 'Приспівок хоснователя',
+'contributions-title' => 'Приспівок хоснователя $1',
+'mycontris' => 'Мої приспівкы',
+'contribsub2' => 'Приспівок $1 ($2)',
+'nocontribs' => 'Ð\9dенайдженÑ\8b Ð¶Ð°Ð´Ð½Ñ\8b Ð·Ð¼Ñ\96нÑ\8b Ð·Ð° Ñ\82Ñ\8bма ÐºÑ\80Ñ\96Ñ\82еÑ\80Ñ\96Ñ\8fми.',
 'uctop' => ' (послїдня)',
 'month' => 'Од місяця (і скоре):',
 'year' => 'Од року (і скоре):',
 
-'sp-contributions-newbies' => 'Вказати приспевкы лем новых конт',
+'sp-contributions-newbies' => 'Вказати приспівкы лем новых конт',
 'sp-contributions-newbies-sub' => 'Новы хоснователї',
 'sp-contributions-newbies-title' => 'Приспівкы новый хоснователїв',
 'sp-contributions-blocklog' => 'Лоґ блокованя',
 'sp-contributions-deleted' => 'вымазаны приспевкы хоснователя',
-'sp-contributions-uploads' => 'нагÑ\80аванÑ\8f',
+'sp-contributions-uploads' => 'наладованÑ\8b Ñ\84айлÑ\8b',
 'sp-contributions-logs' => 'лоґы',
 'sp-contributions-talk' => 'діскузія',
 'sp-contributions-userrights' => 'Справа хосновательскых прав',
@@ -2171,8 +2346,8 @@ $1',
 Послїднїй запис в лоґах блоковань є такый:',
 'sp-contributions-blocked-notice-anon' => 'Тота IP адреса є теперь блокована.
 Послїднїй запис в лоґах блоковань є такый:',
-'sp-contributions-search' => 'Глядати приспевкы',
-'sp-contributions-username' => 'IP-адреса або мено хоснователя:',
+'sp-contributions-search' => 'Глядати приспівкы',
+'sp-contributions-username' => 'IP-адреса або імя хоснователя:',
 'sp-contributions-toponly' => 'Вказати лем актуалны ревізії',
 'sp-contributions-submit' => 'Найти',
 
@@ -2218,8 +2393,8 @@ $1',
 ** Знеужываня веце конт
 ** Невгодне мено хоснователя',
 'ipb-hardblock' => 'Заборонити приголошеным хоснователям едітовати з той IP-адресы',
-'ipbcreateaccount' => 'Не доволити реґістрацію новых хоснователїв',
-'ipbemailban' => 'Заборонити хоснователёві посылати ел. пошту',
+'ipbcreateaccount' => 'Ð\9dе Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ\82и Ñ\80еÒ\91Ñ\96Ñ\81Ñ\82Ñ\80аÑ\86Ñ\96Ñ\8e Ð½Ð¾Ð²Ñ\8bÑ\85 Ñ\85оÑ\81новаÑ\82елÑ\97в',
+'ipbemailban' => 'Заборонити хоснователёви посылати ел. пошту',
 'ipbenableautoblock' => 'Автоматічно блоковати IP адресы хоснованы тым хоснователём',
 'ipbsubmit' => 'Заблоковати',
 'ipbother' => 'Іншый час:',
@@ -2233,8 +2408,8 @@ $1',
 'ipb-confirm' => 'Потвердити блокованя',
 'badipaddress' => 'Неправилна IP адреса',
 'blockipsuccesssub' => 'Блокованя проведено',
-'blockipsuccesstext' => 'Хоснователь „[[Special:Contributions/$1|$1]]“ є блокованый.<br />
\9cожеÑ\82е Ñ\81обÑ\96 Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и [[Special:BlockList|Ñ\81пиÑ\81ок Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ\8bÑ\85 Ñ\85оÑ\81новаÑ\82елÑ\97в]].',
+'blockipsuccesstext' => '„[[Special:Contributions/$1|$1]]“ je {{GENDER:$1|заблокованый|заблокована}}.<br />
\9cожеÑ\82е Ñ\81обÑ\96 Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и [[Special:BlockList|Ñ\81пиÑ\81ок Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ\8bÑ\85 Ñ\80едакÑ\82оÑ\80Ñ\96в]].',
 'ipb-blockingself' => 'Зберате ся заблоковати {{gender:|сам|сама|самы}} себе! Сьте собі {{gender:|певный|певна|певны}}, же тото хочете зробити?',
 'ipb-confirmhideuser' => 'Рыхтуєте ся заблоковати хоснователя зо запнутов вольбов "сховати імя хоснователя". То запрічінить же імя хоснователя счезне зо вшыткых списків і протоколёвачіх записів.  Сьте собі {{gender:|певный|певна|певны}}, же хочете тото зробити?',
 'ipb-edit-dropdown' => 'Едітовати причіны блоковань',
@@ -2264,11 +2439,11 @@ $1',
 'ipblocklist-submit' => 'Глядати',
 'ipblocklist-localblock' => 'Локалне блокованя',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|Інше блокованя|Іншы блокованя}}',
-'infiniteblock' => 'до Ð¾Ð´Ð²Ð¾Ð»Ð°Ð½Ñ\8f',
+'infiniteblock' => 'навÑ\81е (до Ð¿Ð¾ÐºÐ»Ð¸ÐºÐ°Ð½Ñ\8f)',
 'expiringblock' => 'до $1, $2',
 'anononlyblock' => 'лем анонімы',
 'noautoblockblock' => 'без автоблокованя',
-'createaccountblock' => 'вÑ\8bÑ\82ваÑ\80Ñ\8fнÑ\8f ÐºÐ¾Ð½Ñ\82 Ð½Ðµ Ñ\94 Ð¿Ð¾волене',
+'createaccountblock' => 'вÑ\8bÑ\82воÑ\80Ñ\91ванÑ\8f ÐºÐ¾Ð½Ñ\82 Ð½Ðµ Ð´Ð¾Ð·волене',
 'emailblock' => 'е-маіл блокованый',
 'blocklist-nousertalk' => 'не може едітовати властну сторінку діскузії',
 'ipblocklist-empty' => 'Список блоковань є порожнїй.',
@@ -2276,7 +2451,7 @@ $1',
 'blocklink' => 'заблоковати',
 'unblocklink' => 'одблоковати',
 'change-blocklink' => 'змінити блок',
-'contribslink' => 'приспевкы',
+'contribslink' => 'приспівкы',
 'emaillink' => 'послати імейл',
 'autoblocker' => 'Сьте были автоматічно блокованы, протоже здїляте IP-адресу з хоснователём „[[User:$1|$1]]“. Причіна блокованя того хоснователя: „$2“',
 'blocklogpage' => 'Запис блоковань',
@@ -2285,16 +2460,18 @@ $1',
 'blocklog-showsuppresslog' => 'Тот хоснователь быв блокованый і схованый. Ту є про перегляд вказаный выпис з книгы блокованя:',
 'blocklogentry' => 'заблокoвав [[$1]] на термін $2 $3',
 'reblock-logentry' => 'змінив наставлїня блоку „[[$1]]“ з часом ексіпрації $2 $3',
-'blocklogtext' => 'Тото є книга блокованя і одблокованя хоснователїв. Автоматічно блокованы IP-адресы не суть выписаны. Попозерайте ся на  [[Special:BlockList|список блокованя IP]] з выписом актуалный заказів і блоковань.',
+'blocklogtext' => 'Тото є журнал дїй блокованя і одблокованя редакторів.
+Автоматічно блокованы IP адресы не выписованы.
+Смотьте тыж [[Special:BlockList|список вшыткых чінных блоковань]].',
 'unblocklogentry' => 'одблоковав $1',
 'block-log-flags-anononly' => 'лем анонімны хоснователї',
-'block-log-flags-nocreate' => 'вÑ\8bÑ\82ваÑ\80Ñ\8fнÑ\8f ÐºÐ¾Ð½Ñ\82 Ð½Ðµ Ð¿Ð¾волене',
+'block-log-flags-nocreate' => 'вÑ\8bÑ\82воÑ\80Ñ\91ванÑ\8f ÐºÐ¾Ð½Ñ\82 Ð½Ðµ Ð´Ð¾Ð·волене',
 'block-log-flags-noautoblock' => 'автоматічне блокованя выпнуте',
 'block-log-flags-noemail' => 'е-маіл блокованый',
 'block-log-flags-nousertalk' => 'не може едітовати властну сторінку діскузії',
 'block-log-flags-angry-autoblock' => 'росшырене автоматічне блокованя выпнуте',
 'block-log-flags-hiddenname' => 'мено хоснователя сховане',
-'range_block_disabled' => 'Ð\91локованÑ\8f Ñ\80оÑ\81Ñ\81Ñ\8fгÑ\96в IP-адÑ\80еÑ\81 Ð½Ðµ Ñ\94 Ð¿Ð¾Ð²Ð¾Ð»ÐµÐ½Ðµ',
+'range_block_disabled' => 'Ð\91локованÑ\8f Ñ\80оÑ\81Ñ\81Ñ\8fгÑ\96в IP-адÑ\80еÑ\81 Ð½Ðµ Ñ\94 Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ðµ.',
 'ipb_expiry_invalid' => 'Неплатный час експірації.',
 'ipb_expiry_temp' => 'Блокованя схованых мен хоснователїв бы мало быти тырвале.',
 'ipb_hide_invalid' => 'Тото конто ся не дасть затаїти; може має дуже много едітацій.',
@@ -2305,30 +2482,30 @@ $1',
 'ipb_cant_unblock' => 'Хыба: Блокованя з ID $1 не было найджене. Хоснователь уж може быв одблокованый.',
 'ipb_blocked_as_range' => 'Хыба: IP-адреса $1 не є блокована прямо а так єй не є можне одблоковати. Є частёв заблокованого россягу $2, котрый може быти одблокованый.',
 'ip_range_invalid' => 'Неплатный IP россяг.',
-'ip_range_toolarge' => 'Ð\91локованÑ\8f Ñ\80оÑ\81Ñ\81Ñ\8fгÑ\96в Ð²ÐµÐºÑ\88Ñ\8bÑ\85 Ñ\8fк  /$1 Ð½Ðµ Ñ\94 Ð¿Ð¾волене.',
+'ip_range_toolarge' => 'Ð\91локованÑ\8f Ñ\80оÑ\81Ñ\81Ñ\8fгÑ\96в Ð²ÐµÐºÑ\88Ñ\8bÑ\85 Ñ\8fк  /$1 Ð½Ðµ Ñ\94 Ð´Ð¾Ð·волене.',
 'blockme' => 'Заблокуй ня',
 'proxyblocker' => 'Блокованя проксі',
 'proxyblocker-disabled' => 'Тота фунція є выпнута.',
 'proxyblockreason' => 'Ваша IP-адреса была заблокована, зато же фунґує як отвореный проксі сервер. 
\9aонÑ\82акÑ\82Ñ\83йÑ\82е Ñ\81вого Ð\86нÑ\82еÑ\80неÑ\82-пÑ\80овайдеÑ\80а Ð°Ð±Ð¾ Ñ\82еÑ\85нÑ\96Ñ\87нÑ\83 Ð¿Ñ\96дпоÑ\80Ñ\83 Ñ\96 Ñ\96нÑ\84оÑ\80мÑ\83йÑ\82е Ñ\97Ñ\85 Ð¾ Ñ\82Ñ\96м Ñ\81еÑ\80Ñ\91знÑ\96м Ð±ÐµÐ·печностнім проблемі.',
\9aонÑ\82акÑ\82Ñ\83йÑ\82е Ñ\81вого Ð\86нÑ\82еÑ\80неÑ\82-пÑ\80овайдеÑ\80а Ð°Ð±Ð¾ Ñ\82еÑ\85нÑ\96Ñ\87нÑ\83 Ð¿Ñ\96дпоÑ\80Ñ\83 Ñ\96 Ñ\96нÑ\84оÑ\80мÑ\83йÑ\82е Ñ\97Ñ\85 Ð¾ Ñ\82Ñ\96м Ñ\81еÑ\80Ñ\8cÑ\91знÑ\96м Ð±ÐµÑ\81печностнім проблемі.',
 'proxyblocksuccess' => 'Готово.',
 'sorbsreason' => 'Ваша IP-адреса є веджена як отвореный проксі в DNSBL.',
 'sorbs_create_account_reason' => 'Ваша IP-адреса є веджена як одкрытый проксі в DNSBL. З той адресы собі не можете створити конто.',
 'cant-block-while-blocked' => 'Не можете блоковати іншых хоснователїв, кідь сьте сам заблокованый(а).',
 'cant-see-hidden-user' => 'Хоснователь, котрого хочете заблоковати, уж быв заблокованый і схованый. Кідьже не маєте права hideuser, не можете собі наставлїня блокованя того хоснователя посмотрити ани го змінити.',
 'ipbblocked' => 'Не можете блоковати або одблоковати іншых хоснователїв, {{GENDER:|сам|сама|сам}} сьте {{GENDER:|заблокованый|заблокована|заблокованый}}',
-'ipbnounblockself' => 'Не маєте доволене одблоковати {{GENDER:|сам|сама|сам}} себе',
+'ipbnounblockself' => 'Ð\9dе Ð¼Ð°Ñ\94Ñ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ðµ Ð¾Ð´Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ñ\82и {{GENDER:|Ñ\81ам|Ñ\81ама|Ñ\81ам}} Ñ\81ебе',
 
 # Developer tools
 'lockdb' => 'Замкнути датабазу',
 'unlockdb' => 'Одомкнути датабазу',
-'lockdbtext' => 'Кідь замкнете датабазу, знеможните другым едітовати, управляти наставлїня, слїдованы сторінкы ітд. Підтвердьте, же то справды хочете зробити і же одомкнете датабазу такой по оправах.',
-'unlockdbtext' => 'Кідь одомкнете датабазу, уможните другым едітовати, управляти наставлїня, слїдованы сторінкы ітд. Підтвердьте, же то хочете справды зробити.',
+'lockdbtext' => 'Кідь замкнете датабазу, знеможните другым едітовати, управляти наставлїня, слїдованы сторінкы ітд. Потвердьте, же то справды хочете зробити і же одомкнете датабазу такой по оправах.',
+'unlockdbtext' => 'Кідь одомкнете датабазу, уможните другым едітовати, управляти наставлїня, слїдованы сторінкы ітд. Потвердьте, же то хочете справды зробити.',
 'lockconfirm' => 'Гей, справды хочу замкнути датабазу.',
 'unlockconfirm' => 'Гей, справды хочу одомкнути датабазу.',
 'lockbtn' => 'Замкнути датабазу',
 'unlockbtn' => 'Одомкнути датабазу',
-'locknoconfirm' => 'Не было означене поличко підтверджіня.',
+'locknoconfirm' => 'Не было означене поличко потверджіня.',
 'lockdbsuccesssub' => 'Датабаза замкнута',
 'unlockdbsuccesssub' => 'Датабаза одомкнута',
 'lockdbsuccesstext' => 'Датабаза {{grammar:2sg|{{SITENAME}}}} была успішно замкнута.
@@ -2345,7 +2522,7 @@ $1',
 Стара назва стане перенапрямлинём на нову назву.
 Можете автоматично обновити напрямлиня на стару назву.
 Кідь вы тото не зробите, просиме Вас, перевірте наявність [[Special:DoubleRedirects|подвойных]] ці [[Special:BrokenRedirects|розорваных]] напрямлїнь.
\92Ñ\8b Ð·Ð¾Ð´Ð¿Ð¾Ð²Ñ\96даÑ\94те за то, жебы одказы і надале вказовали там, де мають.
\92Ñ\8b Ð¾Ð´Ð¿Ð¾Ð²Ñ\96дате за то, жебы одказы і надале вказовали там, де мають.
 
 Уважте, же сторінка '''не''' буде переменована, кідь сторінка з новов назвов уж екзістує, окрем того, коли она порожня або є напрямлїнём, а лоґ єй едітовань порожнїй.
 То значіть, же вы можете вернути сторінцї стару назву, кідь вы переменовали єй помылково, але вы не можете переписати екзістуючу сторінку.
@@ -2371,11 +2548,11 @@ $1',
 
 В тых припадох будете мусити переменовати ці злучіти сторінкы ручнї кідь желаєте єй переменованя.",
 'movearticle' => 'Переменовати сторінку',
-'moveuserpage-warning' => "'''Увага:''' Рихтуєте ся переменовати сторінку хоснователя. Усвідомте собі, же буде пересунута лем тота сторінка, а хоснователь  ''не буде'' переменованый.",
+'moveuserpage-warning' => "'''Увага:''' Рихтуєте ся переменовати сторінку хоснователя. Усвідомте собі, же буде переменована лем тота сторінка, а хоснователь  ''не буде'' переменованый.",
 'movenologin' => 'Не сьте приголошеный(а)!',
 'movenologintext' => 'Про переменованя сторінок ся мусите [[Special:UserLogin|приголосити]].',
 'movenotallowed' => 'Не маєте права переменовати сторінкы.',
-'movenotallowedfile' => 'Не маєте права пересувати файлы.',
+'movenotallowedfile' => 'Не маєте права переменовати файлы.',
 'cant-move-user-page' => 'Не маєте права переменовати сторінкы хоснователїв.',
 'cant-move-to-user-page' => 'Не маєте права переменовати сторінку на сторінку хоснователя (окрем підсторінкы сторінкы хоснователя)',
 'newtitle' => 'Нова назва:',
@@ -2396,7 +2573,7 @@ $1',
 'movepage-page-exists' => 'Сторінка $1 уж екзістує і не може быти автоматічно переписана.',
 'movepage-page-moved' => 'Сторінка $1 была переменована на $2.',
 'movepage-page-unmoved' => 'Сторінка $1 не може быти переменована на $2.',
-'movepage-max-pages' => '{{PLURAL:$1|Ð\91Ñ\8bла Ð¿ÐµÑ\80еменована Ð¼Ð°ÐºÑ\81Ñ\96мално Ð¿Ð¾Ð²Ð¾Ð»ÐµÐ½Ð° Ñ\94дна Ñ\81Ñ\82оÑ\80Ñ\96нка|Ð\91Ñ\8bли Ð¿ÐµÑ\80еменованÑ\8b Ð¼Ð°ÐºÑ\81Ñ\96мално Ð¿Ð¾Ð²Ð¾Ð»ÐµÐ½Ñ\8b $1 Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b\91Ñ\8bло Ð¿ÐµÑ\80еменоване Ð¼Ð°ÐºÑ\81Ñ\96мално Ð¿Ð¾воленых $1 сторінок}}, веце їх уж автоматічно переменованых не буде.',
+'movepage-max-pages' => '{{PLURAL:$1|Ð\91Ñ\8bла Ð¿ÐµÑ\80еменована Ð¼Ð°ÐºÑ\81Ñ\96мално Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ñ\94дна Ñ\81Ñ\82оÑ\80Ñ\96нка|Ð\91Ñ\8bли Ð¿ÐµÑ\80еменованÑ\8b Ð¼Ð°ÐºÑ\81Ñ\96мално Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\8b $1 Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b\91Ñ\8bло Ð¿ÐµÑ\80еменоване Ð¼Ð°ÐºÑ\81Ñ\96мално Ð´Ð¾Ð·воленых $1 сторінок}}, веце їх уж автоматічно переменованых не буде.',
 'movelogpage' => 'Лоґ переменовань',
 'movelogpagetext' => 'Тото є список вшыткых переменованый сторінок.',
 'movesubpage' => '{{PLURAL:$1|Підсторінка|Підсторінкы}}',
@@ -2407,7 +2584,7 @@ $1',
 'delete_and_move' => 'Змазати і переменовати',
 'delete_and_move_text' => '==Є треба змазаня==
 
-ЦÑ\96лÑ\91ва Ñ\81Ñ\82оÑ\80Ñ\96нка â\80\9e[[:$1]]â\80\9c Ñ\83ж ÐµÐºÐ·Ñ\96Ñ\81Ñ\82Ñ\83Ñ\94. Ð\96елаÑ\82е Ñ\81обÑ\96 Ñ\94й Ð·Ð¼Ð°Ð·Ð°Ñ\82и Ð¿Ñ\80о Ñ\83волнÑ\97нÑ\8f Ð¼Ñ\96Ñ\81Ñ\86Ñ\8f Ð¿Ñ\80о Ð¿ÐµÑ\80еÑ\81Ñ\83н?',
+ЦÑ\96лÑ\91ва Ñ\81Ñ\82оÑ\80Ñ\96нка â\80\9e[[:$1]]â\80\9c Ñ\83ж ÐµÐºÐ·Ñ\96Ñ\81Ñ\82Ñ\83Ñ\94. Ð\96елаÑ\82е Ñ\81обÑ\96 Ñ\94й Ð·Ð¼Ð°Ð·Ð°Ñ\82и Ð¿Ñ\80о Ñ\83волнÑ\97нÑ\8f Ð¼Ñ\96Ñ\81Ñ\86Ñ\8f Ð½Ð° Ð¿ÐµÑ\80еменованÑ\8f?',
 'delete_and_move_confirm' => 'Гей, змазати сторінку',
 'delete_and_move_reason' => 'Змазане про уможнїня переменованя з „[[$1]]“',
 'selfmove' => 'Початочна і нова назва суть ровнакы;
@@ -2439,9 +2616,11 @@ $1',
 До ниже зазначеного едітачного поля зазначте назвы сторінок, котры хочете експортовати; каждый рядок єдна назва. Тыж звольте, ці ся мають експортовати і старшы верзії сторінкы враховано інформацій в історії едітованя, або лем актуална верзія з інформаціов о послїднїй едітації.
 
 В другім припадї можете тыж хосновати прямый одказ, наприклад помочов [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] ся выекспортує „[[{{MediaWiki:Mainpage}}]]“.',
+'exportall' => 'Експортовати вшыткы сторінкы',
 'exportcuronly' => 'Загорняти лем сучасну верзію, не повну історію',
 'exportnohistory' => "----
 '''Позначка:''' експорт повных історій средством того формуларя быв про проблемы з ресурсами заказаный.",
+'exportlistauthors' => 'У каждой сторінкы выписати повный список приспівателїв',
 'export-submit' => 'Експорт',
 'export-addcattext' => 'Додати сторінкы з катеґорії:',
 'export-addcat' => 'Придати',
@@ -2460,11 +2639,11 @@ $1',
 Кідь хочете приспівати ку локалізації софтверу MediaWiki, навщівте [//www.mediawiki.org/wiki/Localisation локалізачну сторінку на mediawiki.org] і [//translatewiki.net сервер server translatewiki.net].',
 'allmessagesnotsupportedDB' => '{{ns:special}}:AllMessages не є підпороване, бо wgUseDatabaseMessages є выпнуте.',
 'allmessages-filter-legend' => 'Філтер',
-'allmessages-filter' => 'ФÑ\96лÑ\82еÑ\80 Ð¿Ð¾Ð´Ð»Ñ\8f Ñ\81Ñ\82авÑ\83:',
+'allmessages-filter' => 'ФÑ\96лÑ\82еÑ\80 Ð·Ð° Ñ\81Ñ\82аном:',
 'allmessages-filter-unmodified' => 'Незмінено',
 'allmessages-filter-all' => 'Вшыткы',
 'allmessages-filter-modified' => 'Змінено',
-'allmessages-prefix' => 'ФÑ\96лÑ\82еÑ\80 Ð¿Ð¾Ð´Ð»Ñ\8f Ð¿Ñ\80еÑ\84Ñ\96кÑ\81Ñ\83:',
+'allmessages-prefix' => 'ФÑ\96лÑ\82еÑ\80 Ð·Ð° Ð¿Ñ\80еÑ\84Ñ\96кÑ\81ом:',
 'allmessages-language' => 'Язык:',
 'allmessages-filter-submit' => 'Выконати',
 
@@ -2473,7 +2652,9 @@ $1',
 'filemissing' => 'Файл хыбить',
 'thumbnail_error' => 'Хыба створїня нагляду: $1',
 'djvu_page_error' => 'Сторінка DjVu мімо россяг',
-'djvu_no_xml' => 'Створїня XML про файл DjVu ся не подарило.',
+'djvu_no_xml' => 'Створїня XML про файл DjVu ся не вдало.',
+'thumbnail-temp-create' => 'Дочасный файл нагляду негодно было створити',
+'thumbnail-dest-create' => 'Нагляд не годно было уложыти на призначене місце',
 'thumbnail_invalid_params' => 'Неплатный параметер нагляду',
 'thumbnail_dest_directory' => 'Не дасть ся створити цілёвый адресарь',
 'thumbnail_image-type' => 'Непідпорованый тіп образку',
@@ -2491,41 +2672,55 @@ $1',
 'import-interwiki-namespace' => 'Цілёвый простор назв:',
 'import-upload-filename' => 'Назва файлу:',
 'import-comment' => 'Коментарь:',
-'importtext' => 'Ð\9fÑ\80оÑ\81име Ð\92аÑ\81, ÐµÐºÑ\81поÑ\80Ñ\82Ñ\83йÑ\82е Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83 Ð· Ñ\96нÑ\88ой Ð²Ñ\96кÑ\96 Ð¿Ð¾Ð¼Ð¾Ñ\87ов [[Special:Export|Ñ\96нÑ\88Ñ\82Ñ\80Ñ\83менÑ\82Ñ\83 Ð½Ð° ÐµÐºÑ\81поÑ\80Ñ\82]], Ñ\83ложÑ\82е Ñ\84айл Ð½Ð° Ð²Ð°Ñ\88 Ð´Ñ\96Ñ\81к Ð° Ð¿Ð¾Ñ\82Ñ\96м Ð³Ð¾ Ð½Ð°Ð³Ñ\80айÑ\82е Ñ\82Ñ\83.',
+'importtext' => 'Ð\9fÑ\80оÑ\81име Ð\92аÑ\81, ÐµÐºÑ\81поÑ\80Ñ\82Ñ\83йÑ\82е Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83 Ð· Ñ\96нÑ\88ой Ð²Ñ\96кÑ\96 Ð¿Ð¾Ð¼Ð¾Ñ\87ов [[Special:Export|Ñ\96нÑ\88Ñ\82Ñ\80Ñ\83менÑ\82Ñ\83 Ð½Ð° ÐµÐºÑ\81поÑ\80Ñ\82]], Ñ\83ложÑ\82е Ñ\84айл Ð½Ð° Ð²Ð°Ñ\88 Ð´Ñ\96Ñ\81к Ð° Ð¿Ð¾Ñ\82Ñ\96м Ð³Ð¾ Ð·Ð°Ð»Ð°Ð´Ñ\83йÑ\82е Ð³ÐµÐ².',
 'importstart' => 'Імпорт сторінок…',
 'import-revision-count' => '$1 {{PLURAL:$1|ревізія|ревізії|ревізій}}',
 'importnopages' => 'Не є што імпортовати.',
 'imported-log-entries' => '{{PLURAL:$1|Наімпортованый 1 протоколовачій запис|Наімпортованы $1 протоколовачі записы|Наімпортованых $1 протоколовачіх записів}}.',
-'importfailed' => 'Ð\86мпоÑ\80Ñ\82 Ñ\81Ñ\8f Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ив: $1',
+'importfailed' => 'Ð\86мпоÑ\80Ñ\82 Ñ\81Ñ\8f Ð½Ðµ Ð²Ð´Ð°в: $1',
 'importunknownsource' => 'Незнамый тіп  імпортованой сторінкы',
 'importcantopen' => 'Не дало ся отворити файл імпорту',
 'importbadinterwiki' => 'Неплатный одказ інтервікі',
 'importnotext' => 'Порожнїй або жаден текст',
 'importsuccess' => 'Імпорт сконченый!',
 'importhistoryconflict' => 'Екзістує конфлікт міджі історіямі верзії (може тота сторінка уж была імпортована скоре)',
-'importnosources' => 'Ð\9dе Ð±Ñ\8bло Ð²Ñ\8bбÑ\80ане Ð¶Ñ\80Ñ\96дло Ñ\96мпоÑ\80Ñ\82Ñ\83 Ð¼Ñ\96джÑ\96 Ð²Ñ\96кÑ\96, Ð¿Ñ\80Ñ\8fме Ð½Ð°Ñ\87Ñ\96Ñ\82аня історії змін є выпнуте.',
-'importnofile' => 'Не быв начітаный файл імпорту.',
-'importuploaderrorsize' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило Ñ\81Ñ\8f Ð½Ð°Ñ\87Ñ\96Ñ\82ати файл імпорту. Розмір файлу перевышує становлену меджу.',
-'importuploaderrorpartial' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило Ñ\81Ñ\8f Ð½Ð°Ñ\87Ñ\96Ñ\82аÑ\82и Ñ\96мпоÑ\80Ñ\82нÑ\8bй Ñ\84айл. Ð¤Ð°Ð¹Ð» Ð±Ñ\8bв Ð½Ð°Ñ\87Ñ\96Ñ\82анÑ\8bй Ð»ÐµÐ¼ Ñ\87аÑ\81Ñ\82оÑ\87но.',
-'importuploaderrortemp' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило Ñ\81Ñ\8f Ð½Ð°Ñ\87Ñ\96Ñ\82ати імпортный файл. Не є к діспозіції дочасный адресарь.',
-'import-parse-failure' => 'Хыба почас імпорту XML',
+'importnosources' => 'Ð\9dе Ð±Ñ\8bло Ð²Ñ\8bбÑ\80ане Ð¶Ñ\80Ñ\96дло Ñ\96мпоÑ\80Ñ\82Ñ\83 Ð¼Ñ\96джÑ\96 Ð²Ñ\96кÑ\96, Ð´Ñ\96Ñ\80екÑ\82 Ð½Ð°Ð»Ð°Ð´Ð¾Ð²аня історії змін є выпнуте.',
+'importnofile' => 'Не быв наладованый файл імпорту.',
+'importuploaderrorsize' => 'Ð\9dе Ð²Ð´Ð°Ð»Ð¾ Ñ\81Ñ\8f Ð½Ð°Ð»Ð°Ð´Ð¾Ð²ати файл імпорту. Розмір файлу перевышує становлену меджу.',
+'importuploaderrorpartial' => 'Ð\9dе Ð²Ð´Ð°Ð»Ð¾ Ñ\81Ñ\8f Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ñ\82и Ñ\96мпоÑ\80Ñ\82нÑ\8bй Ñ\84айл. Ð¤Ð°Ð¹Ð» Ð±Ñ\8bв Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ\8bй Ð»ÐµÐ¼ Ñ\87аÑ\81Ñ\82ково.',
+'importuploaderrortemp' => 'Ð\9dе Ð²Ð´Ð°Ð»Ð¾ Ñ\81Ñ\8f Ð½Ð°Ð»Ð°Ð´Ð¾Ð²ати імпортный файл. Не є к діспозіції дочасный адресарь.',
+'import-parse-failure' => 'Хыба під час імпорту XML',
 'import-noarticle' => 'Не є сторінка про імпорт!',
 'import-nonewrevisions' => 'Вшыткы верзії уж были скоре імпортованы',
 'xml-error-string' => '$1 на рядку $2, стовпець $3 (байт $4): $5',
-'import-upload' => 'Ð\9dагÑ\80ати XML дата',
+'import-upload' => 'Ð\9dаладовати XML дата',
 'import-token-mismatch' => 'Стратили ся дата релації. Спробуйте то знову.',
 'import-invalid-interwiki' => 'Із зазначеной вікі ся не дасть імпортовати.',
 'import-error-edit' => 'Сторінка „$1“ ся не наімпортовала, бо не мате право єй едітовати.',
 'import-error-create' => 'Сторінка „$1“ ся не наімпортовала, бо не мате право єй створити.',
+'import-error-interwiki' => 'Сторінка „$1“ ся не імпортує, бо єй назва є зарезервована про вонкашнї лінкы (interwiki).',
+'import-error-special' => 'Сторінка „$1“ ся не імпортує, бо належыть до шпеціалного простору назв, до котрого сторінкы не належать.',
+'import-error-invalid' => 'Сторінка „$1“ ся не імпортує, бо єй назва неприпустна.',
 
 # Import log
 'importlogpage' => 'Книга імпортів',
 'importlogpagetext' => 'На тій сторінцї ся зображують адміністраторскы імпорты сторінок враховано едітовань з іншых вікі.',
-'import-logentry-upload' => 'імпортовав [[$1]] начітанём файлу',
+'import-logentry-upload' => 'імпортовав [[$1]] наладованём файлу',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|ревізія|ревізії|ревізій}}',
 'import-logentry-interwiki' => 'міджівікі імпорт $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ревізія|ревізії|ревізій}} з $2',
 
+# JavaScriptTest
+'javascripttest' => 'Тестованя JavaScript',
+'javascripttest-disabled' => 'Тота функція не дозволена на тій вікі.',
+'javascripttest-title' => 'Біжать тест в $1',
+'javascripttest-pagetext-noframework' => 'Тота сторінка є резервована про тестованя JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Незнаный фреймворк тестованя „$1“.',
+'javascripttest-pagetext-frameworks' => 'Просиме, звольте єден з наступных фреймворків тестованя : $1',
+'javascripttest-pagetext-skins' => 'Звольте взгляд під котрым ся мають тесты спустити:',
+'javascripttest-qunit-intro' => 'Смотьте [$1 документацію тестованя] на mediawiki.org',
+'javascripttest-qunit-heading' => 'Сет тестів JavaScript в MediaWiki QUnit',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ваша сторінка хоснователя',
 'tooltip-pt-anonuserpage' => 'Сторінка хоснователя про IP-адресу, з котрой едітуєте',
@@ -2533,48 +2728,48 @@ $1',
 'tooltip-pt-anontalk' => 'Діскузія о едітованях выконаных з той IP-адресы',
 'tooltip-pt-preferences' => 'Вашы наставлїня',
 'tooltip-pt-watchlist' => 'Список сторінок, на котрых слїдуєте зміны',
-'tooltip-pt-mycontris' => 'Список вашых приспевків',
+'tooltip-pt-mycontris' => 'Список вашых приспівків',
 'tooltip-pt-login' => 'Рекомендуєме ся приголосити, але не є то повинне.',
 'tooltip-pt-anonlogin' => 'Рекомендуєме ся приголосити, але не є то повинне.',
 'tooltip-pt-logout' => 'Одголошіня',
 'tooltip-ca-talk' => 'Діскузія о обсягу сторінкы',
-'tooltip-ca-edit' => 'ТоÑ\82Ñ\83 Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83 Ð¼Ð¾Ð¶Ð½Ð¾ едітовати. Просиме, хоснуйте перегляд перед уложінём.',
+'tooltip-ca-edit' => 'ТоÑ\82Ñ\83 Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83 Ð¼Ð¾Ð¶ÐµÑ\82е едітовати. Просиме, хоснуйте перегляд перед уложінём.',
 'tooltip-ca-addsection' => 'Створити нову секцію',
 'tooltip-ca-viewsource' => 'Тота сторінка є замкнута.
 Можете видїти єй код.',
 'tooltip-ca-history' => 'Минулы верзії той сторінкы',
-'tooltip-ca-protect' => 'Ð¥Ñ\80анÑ\8c тоту сторінку',
+'tooltip-ca-protect' => 'Ð\92Ñ\81окоÑ\82иÑ\82и тоту сторінку',
 'tooltip-ca-unprotect' => 'Змінити замок той сторінкы',
 'tooltip-ca-delete' => 'Вымазати тоту сторінку',
 'tooltip-ca-undelete' => 'Обновити едітованя той сторінкы выконаны перед єй змазанём',
 'tooltip-ca-move' => 'Переменовати тоту сторінку',
-'tooltip-ca-watch' => 'Придати тоту сторінку до вашого списку слїдованых сторінок',
+'tooltip-ca-watch' => 'Придати гевсю сторінку до вашого списку слїдованых сторінок',
 'tooltip-ca-unwatch' => 'Одобрати тоту сторінку з вашого списку слїдованых сторінок',
 'tooltip-search' => 'Глядати {{SITENAME}}',
-'tooltip-search-go' => 'Ð\9fеÑ\80ейÑ\82и Ð´Ð¾ Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b, Ñ\88Ñ\82о Ð¼Ð°Ñ\94 Ñ\82оÑ\87но таку назву (кідь екзістує)',
-'tooltip-search-fulltext' => 'Ð\9dайÑ\82и Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b Ð¿Ñ\80о Ñ\82оÑ\82 Ñ\82екÑ\81Ñ\82',
+'tooltip-search-go' => 'Ð\9fеÑ\80ейÑ\82и Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83, Ñ\88Ñ\82о Ð¼Ð°Ñ\82Ñ\8c Ð°ÐºÑ\83Ñ\80аÑ\82 таку назву (кідь екзістує)',
+'tooltip-search-fulltext' => 'Ð\9dайÑ\82и Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b Ð· Ñ\82Ñ\8bм Ñ\82екÑ\81Ñ\82ом',
 'tooltip-p-logo' => 'Головна сторінка',
 'tooltip-n-mainpage' => 'Перейти на Головну сторінку',
 'tooltip-n-mainpage-description' => 'Перейти на головну сторінку',
 'tooltip-n-portal' => 'О проєктї, што можете зробити, де ся што находить',
 'tooltip-n-currentevents' => 'Актуалны подїї',
 'tooltip-n-recentchanges' => 'Список послїднїх змін',
-'tooltip-n-randompage' => 'Ð\97обÑ\80ажÑ\96нÑ\8f Ð½Ð°Ð³Ð¾Ð´Ð½Ð¾Ð¹ Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b',
+'tooltip-n-randompage' => 'Ð\86Ñ\82и Ð½Ð° Ñ\82Ñ\80аÑ\84Ñ\83нковÑ\83 Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83',
 'tooltip-n-help' => 'Посмотрити поміч',
-'tooltip-t-whatlinkshere' => 'Список вшыткых сторінок, што одказують на тоту сторінку',
-'tooltip-t-recentchangeslinked' => 'Ð\9fоÑ\81лÑ\97днÑ\97 Ð·Ð¼Ñ\96нÑ\8b Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85, ÐºÐ¾Ñ\82Ñ\80Ñ\8b Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð¾Ð´ÐºÐ°Ð· Ð½Ð° Ñ\82Ñ\96й сторінцї',
+'tooltip-t-whatlinkshere' => 'Список вшыткых сторінок, што одказують ся на тоту сторінку',
+'tooltip-t-recentchangeslinked' => 'Ð\9fоÑ\81лÑ\97днÑ\97 Ð·Ð¼Ñ\96нÑ\8b Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85, ÐºÐ¾Ñ\82Ñ\80Ñ\8b Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð¾Ð´ÐºÐ°Ð· Ð½Ð° Ñ\82Ñ\97й сторінцї',
 'tooltip-feed-rss' => 'RSS канал про тоту сторінку',
-'tooltip-feed-atom' => 'Atom ÐºÐ°Ð½Ð°Ð» Ð¿Ñ\80о Ñ\82оÑ\82Ñ\83 Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83',
+'tooltip-feed-atom' => 'Atom ÐºÐ°Ð½Ð°Ð» Ð³ÐµÐ²Ñ\81Ñ\91й Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b',
 'tooltip-t-contributions' => 'Перегляд приспевків того хоснователя',
-'tooltip-t-emailuser' => 'Послати е-маіл тому хоснователёві',
-'tooltip-t-upload' => 'Ð\9dагÑ\80ати файлы',
+'tooltip-t-emailuser' => 'Послати імейл тому хоснователёви',
+'tooltip-t-upload' => 'Ð\9dаладовати файлы',
 'tooltip-t-specialpages' => 'Список вшыткых шпеціалных сторінок',
-'tooltip-t-print' => 'Ð\92еÑ\80зÑ\96Ñ\8f Ñ\82ой Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b Ð¿Ñ\80о Ð´Ñ\80Ñ\83к',
+'tooltip-t-print' => 'Ð\92еÑ\80зÑ\96Ñ\8f Ñ\82ой Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b Ð´Ð¾ Ð´Ñ\80Ñ\83кÑ\83',
 'tooltip-t-permalink' => 'Перманентный одказ на тоту верзію сторінкы',
 'tooltip-ca-nstab-main' => 'Обсяг сторінкы',
 'tooltip-ca-nstab-user' => 'Видїти сторінку хоснователя',
 'tooltip-ca-nstab-media' => 'Вказати сторінку файлу',
-'tooltip-ca-nstab-special' => 'Шпеціална сторінка, она є недоступна про едітованя',
+'tooltip-ca-nstab-special' => 'Шпеціална сторінка, тай єй не годен едітовати.',
 'tooltip-ca-nstab-project' => 'Сторінка проєкту',
 'tooltip-ca-nstab-image' => 'Видїти код сторінкы',
 'tooltip-ca-nstab-mediawiki' => 'Вказати повідомлїня сістемы',
@@ -2587,10 +2782,12 @@ $1',
 'tooltip-diff' => 'Вказати зміны, што были зроблены в тексті.',
 'tooltip-compareselectedversions' => 'Видїти роздїл міджі двома указаныма верзіями той сторінкы.',
 'tooltip-watch' => 'Придати тоту сторінку до списку слїдованых',
+'tooltip-watchlistedit-normal-submit' => 'Остранити надписы',
+'tooltip-watchlistedit-raw-submit' => 'Актуалізовати список слїдованых сторінок',
 'tooltip-recreate' => 'Обновити сторінку і кідь была змазана',
 'tooltip-upload' => 'Почати одосыланя',
 'tooltip-rollback' => 'Єдным кликом вернути зміны, зроблены послїдным приспівателём',
-'tooltip-undo' => 'Ð\97Ñ\80Ñ\83Ñ\88Ñ\8bÑ\82и Ð·Ð¼Ñ\96нÑ\8b Ñ\96 Ð²ÐºÐ°Ð·Ð°Ñ\82и Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\97й Ð¿ÐµÑ\80еглÑ\8fд. Ð\94оволÑ\8fÑ\94 Ð¿Ñ\80идаÑ\82и Ð¿Ñ\80ичіну до ресуме.',
+'tooltip-undo' => 'Ð\97Ñ\80Ñ\83Ñ\88Ñ\8bÑ\82и Ð·Ð¼Ñ\96нÑ\8b Ñ\96 Ð²ÐºÐ°Ð·Ð°Ñ\82и Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\97й Ð¿ÐµÑ\80еглÑ\8fд. Ð\94озволÑ\8eÑ\94 Ð¿Ñ\80идаÑ\82и Ð¿Ñ\80Ñ\96чіну до ресуме.',
 'tooltip-preferences-save' => 'Уложыти наставлїня',
 'tooltip-summary' => 'Задайте курте згорнутя',
 
@@ -2616,19 +2813,15 @@ $1',
 'spambot_username' => 'MediaWiki очістка спаму',
 'spam_reverting' => 'Реверт на послїдню верзію необсягуючу одказы на $1',
 'spam_blanking' => 'Вшыткы ревізії обсяговали одказы на $1, выпорожнєны',
+'spam_deleting' => 'Вшыткы ревізії обсяговали одказы на $1, змазане',
 
 # Info page
 'pageinfo-title' => 'Інформація про "$1"',
 'pageinfo-header-edits' => 'Едітованя',
-'pageinfo-header-watchlist' => 'Слїдованы сторінкы',
-'pageinfo-header-views' => 'Перегляды',
-'pageinfo-subjectpage' => 'Сторінка',
-'pageinfo-talkpage' => 'Сторінка діскузії',
+'pageinfo-views' => 'Чісло переглядів',
 'pageinfo-watchers' => 'Чісло слїдуючіх',
 'pageinfo-edits' => 'Чісло едітовань',
 'pageinfo-authors' => 'Чісло різных авторів',
-'pageinfo-views' => 'Чісло переглядів',
-'pageinfo-viewsperedit' => 'Чісло зображінь на едітованя',
 
 # Patrolling
 'markaspatrolleddiff' => 'Означіти як перевірене',
@@ -2639,7 +2832,7 @@ $1',
 'rcpatroldisabledtext' => 'Патролованя послїднїх змін є моментално выпнута.',
 'markedaspatrollederror' => 'Не дасть ся означіти як перевірене',
 'markedaspatrollederrortext' => 'Мусите зволити ревізію, котра має быти означена як перевірена.',
-'markedaspatrollederror-noautopatrol' => 'Не маєте доволене означовати властны едітованя як перевірены.',
+'markedaspatrollederror-noautopatrol' => 'Ð\9dе Ð¼Ð°Ñ\94Ñ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ðµ Ð¾Ð·Ð½Ð°Ñ\87оваÑ\82и Ð²Ð»Ð°Ñ\81Ñ\82нÑ\8b ÐµÐ´Ñ\96Ñ\82ованÑ\8f Ñ\8fк Ð¿ÐµÑ\80евÑ\96Ñ\80енÑ\8b.',
 
 # Patrol log
 'patrol-log-page' => 'Книга перевіреных едітовань',
@@ -2648,8 +2841,8 @@ $1',
 
 # Image deletion
 'deletedrevision' => 'Змазана стара ревізія $1',
-'filedeleteerror-short' => 'Ð¥Ñ\8bба Ð¿Ð¾Ñ\87аÑ\81 Ð¼Ð°Ð·Ð°Ð½Ñ\8f Ñ\84айлÑ\83: $1',
-'filedeleteerror-long' => 'Взникла хыба почас мазаня файлу:
+'filedeleteerror-short' => 'Хыба мазаня файлу: $1',
+'filedeleteerror-long' => 'Выникла хыба під час мазаня файлу:
 
 $1',
 'filedelete-missing' => 'Файл „$1“ ся не дасть змазати, бо не екзістує.',
@@ -2686,13 +2879,13 @@ $1',
 # Special:NewFiles
 'newimages' => 'Ґалерія новых файлів',
 'imagelisttext' => "Ниже є {{plural:$1|єден файл|список '''$1'''&nbsp;файлів сортованых $2|список '''$1'''&nbsp;файлів сортованых $2}}.",
-'newimages-summary' => 'На тій шпеціалній сторінцї ся зображують остатнї начітаны файлы.',
+'newimages-summary' => 'На тій шпеціалній сторінцї ся зображують остатнї наладованы файлы.',
 'newimages-legend' => 'Філтер',
 'newimages-label' => 'Назва файлу (або єй часть):',
 'showhidebots' => '($1 ботів)',
 'noimages' => 'Не є што зобразити.',
 'ilsubmit' => 'Глядати',
-'bydate' => 'подлÑ\8f Ð´Ð°Ñ\82Ñ\83мÑ\83',
+'bydate' => 'за Ð´Ð°Ñ\82Ñ\83мом',
 'sp-newimages-showfrom' => 'Вказати новы файлы почінаючі од $2, $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
@@ -2716,7 +2909,7 @@ $1',
 Кідь ся файл зедітовав по вытворїню, даякы параметры можуть не одповідати тому образку.',
 'metadata-expand' => 'Вказати додатковы детайлы',
 'metadata-collapse' => 'Сховати додатковы детайлы',
-'metadata-fields' => 'Ð\9fоложкÑ\8b Ð¼ÐµÑ\82адаÑ\82 Ð¾Ð±Ñ\80азÑ\87Ñ\96кÑ\96в Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ñ\83 Ñ\82Ñ\96м Ð¿Ð¾Ð²Ñ\96домлÑ\97нÑ\8e Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\97 Ð· Ð¿Ð¾Ð¿Ð¸Ñ\81ом Ð²Ñ\8bпиÑ\81анÑ\8b Ð²Ñ\81е. Ð\9fÑ\80о Ð·Ð¾Ð±Ñ\80ажÑ\96нÑ\8f Ð´Ñ\80Ñ\83гÑ\8bÑ\85 буде треба кликнути на  „зобразити детайлы“.
+'metadata-fields' => 'Ð\9fоложкÑ\8b Ð¼ÐµÑ\82адаÑ\82 Ð¾Ð±Ñ\80азÑ\87Ñ\96кÑ\96в Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\8b Ñ\83 Ñ\82Ñ\96м Ð¿Ð¾Ð²Ñ\96домлÑ\97нÑ\8e Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\97 Ð· Ð¿Ð¾Ð¿Ð¸Ñ\81ом Ð²Ñ\8bпиÑ\81анÑ\8b Ð²Ñ\81е. Ð\96ебÑ\8b Ð²ÐºÐ°Ð·Ð°Ñ\82и Ð´Ñ\80Ñ\83гÑ\8b, буде треба кликнути на  „зобразити детайлы“.
 * make
 * model
 * datetimeoriginal
@@ -2757,7 +2950,7 @@ $1',
 'exif-imagedescription' => 'Назва образку',
 'exif-make' => 'Выробник фотоапарату',
 'exif-model' => 'Модел фотоапарату',
-'exif-software' => 'Проґрамове забезпечіня',
+'exif-software' => 'Проґрамове забеспечіня',
 'exif-artist' => 'Автор',
 'exif-copyright' => 'Властник авторьскых прав',
 'exif-exifversion' => 'Верзія Exif',
@@ -2820,7 +3013,7 @@ $1',
 'exif-gpslongitude' => 'Ґеоґрафічна довжка',
 'exif-gpsaltituderef' => 'Над/підморьска вышка/глубка',
 'exif-gpsaltitude' => 'Надморьска вышка',
-'exif-gpstimestamp' => 'GPS Ñ\87аÑ\81 (подлÑ\8f Ð°Ñ\82омовÑ\8bÑ\85 Ð³Ð¾Ð´Ð¸Ð½)',
+'exif-gpstimestamp' => 'GPS Ñ\87аÑ\81 (аÑ\82омовÑ\8b Ð³Ð¾Ð´Ð¸Ð½Ñ\8b)',
 'exif-gpssatellites' => 'Сателіты хоснованы про міряня',
 'exif-gpsstatus' => 'Статус приїмача',
 'exif-gpsmeasuremode' => 'Режім міряня',
@@ -2886,7 +3079,7 @@ $1',
 'exif-datetimemetadata' => 'Датум послїднёй управы метадат',
 'exif-nickname' => 'Неформална назва образчіка',
 'exif-rating' => 'Рейтінґ (1–5)',
-'exif-rightscertificate' => 'ЦеÑ\80Ñ\82Ñ\96Ñ\84Ñ\96каÑ\82 Ñ\80Ñ\8fджÑ\96ня прав',
+'exif-rightscertificate' => 'ЦеÑ\80Ñ\82Ñ\96Ñ\84Ñ\96каÑ\82 Ñ\81пÑ\80авованя прав',
 'exif-copyrighted' => 'Статус авторьскых прав',
 'exif-copyrightowner' => 'Властник авторьскых прав',
 'exif-usageterms' => 'Условія хоснованя',
@@ -2897,7 +3090,7 @@ $1',
 'exif-attributionurl' => 'Кідь хоснуєте тото дїло, зазначте одказ',
 'exif-preferredattributionname' => 'Кідь хоснуєте тото дїло, зазначте автора',
 'exif-pngfilecomment' => 'Позначкы ку файлу PNG',
-'exif-disclaimer' => 'Ð\92Ñ\8bлÑ\83Ñ\87Ñ\96нÑ\8f Ð·Ð¾Ð´Ð¿Ð¾Ð²Ñ\96дноÑ\81Ñ\82и',
+'exif-disclaimer' => 'Вылучіня одповідности',
 'exif-contentwarning' => 'Упозорнїня ку обсягу',
 'exif-giffilecomment' => 'Позначкы ку файлу GIF',
 'exif-intellectualgenre' => 'Тіп положкы',
@@ -2915,7 +3108,7 @@ $1',
 'exif-compression-3' => 'Кодованя факсів CCITT Group 3',
 'exif-compression-4' => 'Кодованя факсів CCITT Group 4',
 
-'exif-copyrighted-true' => 'Ð¥Ñ\80анене авторьскым правом',
+'exif-copyrighted-true' => 'СокоÑ\87ене авторьскым правом',
 'exif-copyrighted-false' => 'Вольне дїло',
 
 'exif-unknowndate' => 'Незнамый датум',
@@ -3122,7 +3315,7 @@ $1',
 
 # External editor support
 'edit-externally' => 'Едітовати тот файл хоснувчі екстерну аплікацію',
-'edit-externally-help' => '(Вецей інформації найдете в [//www.mediawiki.org/wiki/Manual:External_editors інштрукції про наставлїня].)',
+'edit-externally-help' => '(Веце інформацій найдете в [//www.mediawiki.org/wiki/Manual:External_editors інштрукції про наставлїня].)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'вшыткы',
@@ -3131,72 +3324,72 @@ $1',
 'limitall' => 'вшыткы',
 
 # E-mail address confirmation
-'confirmemail' => 'Підтверджіня адресы ел. пошты',
+'confirmemail' => 'Потверджіня адресы ел. пошты',
 'confirmemail_noemail' => 'Во своїм [[Special:Preferences|хосновательскім наставлїню]] сьте не зазначіли платну адресу ел. пошты.',
-'confirmemail_text' => 'Тота вікі выжадує, жебы сьте перед хоснованым дакотрых функцій підтвердили свою адресу електронічной пошты. Кликнутём на клапку ниже одошлете підтверджовачій лист на вами зазначену адресу. Тот лист обсягує одказ і код підтверджіня; зображінём одказованой сторінкы во своїм інтернетовім переглядачу підтвердите, же зазначена адреса є платна.',
-'confirmemail_pending' => 'Підтверджовачій код быв посланый ва вашу адресу ел. пошты.
+'confirmemail_text' => 'Тота вікі выжадує, жебы сьте перед хоснованым дакотрых функцій потвердили свою адресу електронічной пошты. Кликнутём на клапку ниже одошлете потверджовачій лист на вами зазначену адресу. Тот лист обсягує одказ і код потверджіня; зображінём одказованой сторінкы во своїм інтернетовім переглядачу потвердите, же зазначена адреса є платна.',
+'confirmemail_pending' => 'Потверджовачій код быв посланый ва вашу адресу ел. пошты.
 Кідь сьте собі конто створили перед моментом, спробуйте на доручіня коду пару минут почекати, покы пожадате о новый.',
-'confirmemail_send' => 'Одослати підтверджовачій код',
-'confirmemail_sent' => 'Підтверджовачій лист быв посланый.',
-'confirmemail_oncreate' => 'На вашу адресу ел. пошты быв посланый підтверджовачій код.
+'confirmemail_send' => 'Одослати потверджовачій код',
+'confirmemail_sent' => 'Потверджовачій лист быв посланый.',
+'confirmemail_oncreate' => 'На вашу адресу ел. пошты быв посланый потверджовачій код.
 Тот код не треба про приголошіня, але буде го треба про актівацію дакотрых функцій заложеных на хоснованю ел. пошты.',
-'confirmemail_sendfailed' => '{{GRAMMAR:3sg|{{SITENAME}}}} Ñ\81Ñ\8f Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ило Ð¾Ð´Ð¾Ñ\81лаÑ\82и Ð¿Ñ\96дÑ\82веÑ\80джоваÑ\87Ñ\96й Ð»Ð¸Ñ\81Ñ\82. Ð\9fеÑ\80евÑ\96Ñ\80те ці адреса не обсягує хыбны буквы.
+'confirmemail_sendfailed' => '{{GRAMMAR:3sg|{{SITENAME}}}} Ñ\81Ñ\8f Ð½Ðµ Ð²Ð´Ð°Ð»Ð¾ Ð¾Ð´Ð¾Ñ\81лаÑ\82и Ð¿Ð¾Ñ\82веÑ\80джоваÑ\87Ñ\96й Ð»Ð¸Ñ\81Ñ\82. Ð\9fеÑ\80евÑ\96Ñ\80Ñ\8cте ці адреса не обсягує хыбны буквы.
 
 Поштовый проґрам одповив: $1',
-'confirmemail_invalid' => 'Неплатный підтверджовачій код. Може уж уплинула платность коду.',
-'confirmemail_needlogin' => 'Про підтверджіня своёй адрес ел. пошты ся мусите $1.',
-'confirmemail_success' => 'Ваша адреса ел. пошты была підтверджена. Нынї ся можете [[Special:UserLogin|приголосити]] і хосновати вікі.',
-'confirmemail_loggedin' => 'Ваша адреса ел. пошты была підтверджена.',
-'confirmemail_error' => 'Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило Ñ\81Ñ\8f Ñ\83ложÑ\8bÑ\82и Ð²Ð°Ñ\88е Ð¿Ñ\96дтверджіня.',
-'confirmemail_subject' => 'Підтверджіня адресы ел. пошты про  {{grammar:4sg|{{SITENAME}}}}',
+'confirmemail_invalid' => 'Неправильный потверджовачій код. Може уж уплынула платность коду.',
+'confirmemail_needlogin' => 'Про потверджіня своёй адрес ел. пошты ся мусите $1.',
+'confirmemail_success' => 'Ваша адреса ел. пошты была потверджена. Нынї ся можете [[Special:UserLogin|приголосити]] і хосновати вікі.',
+'confirmemail_loggedin' => 'Ваша адреса ел. пошты была потверджена.',
+'confirmemail_error' => 'Ð\9dе Ð²Ð´Ð°Ð»Ð¾ Ñ\81Ñ\8f Ñ\83ложÑ\8bÑ\82и Ð²Ð°Ñ\88е Ð¿Ð¾тверджіня.',
+'confirmemail_subject' => 'Потверджіня адресы ел. пошты про  {{grammar:4sg|{{SITENAME}}}}',
 'confirmemail_body' => 'Хтось (асі вы, з IP адресы $1) собі реґістровав конто з меном "$2" і тов адресов ел. пошты на {{grammar:6sg|{{SITENAME}}}}.
 
-Кідь собі желате актівовати функції ел. пошты на {{grammar:6sg|{{SITENAME}}}}, так про підтверджіня, же тота адреса справды належыть вам, перейдите своїм інтернетовым переглядачом на наслїдуючу адресу:
+Кідь собі желате актівовати функції ел. пошты на {{grammar:6sg|{{SITENAME}}}}, так про потверджіня, же тота адреса справды належыть вам, перейдите своїм інтернетовым переглядачом на слїдуючу адресу:
 
 $3
 
-Кідь сьте о тото підтверджіня  *не жадали*, кликните на наслїднїй одказ, котрым підтверджіня зрушыте:
+Кідь сьте о тото потверджіня  *не жадали*, кликните на слїдуючій одказ, котрым потверджіня зрушыте:
 
 $5
 
-Платность того коду підтверджіня експірує $4.',
+Платность того коду потверджіня експірує $4.',
 'confirmemail_body_changed' => 'Хтось (асі вы, з IP адресы $1),
 змінив адресу ел. пошты ку конту "$2" на {{grammar:6sg|{{SITENAME}}}} на тоту адресу.
 
-Кідь собі желате актівовати функції ел. пошты на {{grammar:6sg|{{SITENAME}}}}, так про підтверджіня, же тота адреса справды належыть вам, перейдите своїм інтернетовым переглядачом на наслїдуючу адресу:
+Кідь собі желате актівовати функції ел. пошты на {{grammar:6sg|{{SITENAME}}}}, так про потверджіня, же тота адреса справды належыть вам, перейдьте своїм інтернетовым переглядачом на наслїдуючу адресу:
 
 $3
 
-Кідь сьте о тото підтверджіня  *не жадали*, кликните на наслїднїй одказ, котрым підтверджіня зрушыте:
+Кідь сьте о тото потверджіня  *не жадали*, кликните на слїдуючій одказ, котрым потверджіня зрушыте:
 
 $5
 
-Платность того коду підтверджіня експірує $4.',
+Платность того коду потверджіня експірує $4.',
 'confirmemail_body_set' => 'Дахто (асі вы, з IP адресы $1) наставив імейлову адресу 
 конта „$2“ на {{grammar:6sg|{{SITENAME}}}} на тоту адресу.
 
 Кідь хочете знову актівовати імейловы функції на
-{{grammar:6sg|{{SITENAME}}}}, так про підтверджіня, же тота адреса справды
+{{grammar:6sg|{{SITENAME}}}}, та жебы потвердити, же тота адреса справды
 належыть вам, ідьте своїм інтернетовым перезерачом на адресу ниже:
 
 $3
 
 Кідь вам тото конто *не належыть*, кликните на наступный
-одказ з чім підтверджіня зрушыте:
+одказ з чім потверджіня зрушыте:
 
 $5
 
 Платность того коду кінчіть $4.',
-'confirmemail_invalidated' => 'Підтверджіня адресы електронічной пошты было зрушене',
-'invalidateemail' => 'Зрушыти підтверджіня адресы електронічной пошты',
+'confirmemail_invalidated' => 'Потверджіня адресы електронічной пошты было зрушене',
+'invalidateemail' => 'Зрушыти потверджіня адресы електронічной пошты',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[Вкладаня шаблон міджі вікі є выпнуте]',
-'scarytranscludefailed' => '[Ð\9dе Ð¿Ð¾Ð´Ð°Ñ\80ило Ñ\81Ñ\8f Ð½Ð°Ñ\87Ñ\96Ñ\82ати шаблону про $1]',
+'scarytranscludefailed' => '[Ð\9dе Ð²Ð´Ð°Ð»Ð¾ Ñ\81Ñ\8f Ð½Ð°Ñ\82Ñ\8fгнÑ\83ти шаблону про $1]',
 'scarytranscludetoolong' => '[URL дуже довгый]',
 
 # Delete conflict
-'deletedwhileediting' => "'''Увага:''' Ð¿Ð¾Ñ\87аÑ\81 вашой едітації была тота сторінка змазана!",
+'deletedwhileediting' => "'''Увага:''' Ð±Ñ\96гом вашой едітації была тота сторінка змазана!",
 'confirmrecreate' => 'Хоснователь [[User:$1|$1]] ([[User talk:$1|діскузія]]) тоту сторінку змазав потім, як сьте зачали едітовати з причінов:
 : „$2“
 Справды собі хочете знову тоту сторінку створити?',
@@ -3240,8 +3433,8 @@ $5
 'autosumm-new' => 'Створена сторінка: $1',
 
 # Live preview
-'livepreview-loading' => 'Ð\9dагÑ\80аваня...',
-'livepreview-ready' => 'Ð\9dагÑ\80аваня… Готово!',
+'livepreview-loading' => 'Ð\9dаладовованя...',
+'livepreview-ready' => 'Ð\9dаладовованя… Готово!',
 'livepreview-failed' => 'Швыдкый нагляд не є доступный! Спробуйте хосновати звычайный нагляд.',
 'livepreview-error' => 'Не успішне споїня: $1 "$2". Хоснуйте звычайный нагляд.',
 
@@ -3302,7 +3495,7 @@ $5
 'version-license' => 'Ліценція',
 'version-poweredby-credits' => "Тота вікі біжыть на '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'іншы',
-'version-license-info' => 'MediaWiki Ñ\94 Ñ\81лободнÑ\8bй Ñ\81оÑ\84Ñ\82веÑ\80; Ð¼Ð¾Ð¶ÐµÑ\82е Ð³Ð¾ Ñ\88Ñ\8bÑ\80иÑ\82и Ð°Ð±Ð¾ Ñ\83пÑ\80авлÑ\8fÑ\82и Ð¿Ð¾Ð´Ð»Ñ\8f Ñ\83Ñ\81ловÑ\96й GNU General Public License, Ð²Ñ\8bдаваной Free Software Foundation; Ð±Ñ\83дÑ\8c Ð²ÐµÑ\80зÑ\96Ñ\8f 2 Ñ\82ой Ð»Ñ\96Ñ\86енÑ\86Ñ\96Ñ\97 Ð°Ð±Ð¾ (подлÑ\8f Ð²Ð°Ñ\88ого Ñ\83важÑ\96нÑ\8f) будьяка пізнїша верзія.
+'version-license-info' => 'MediaWiki Ñ\94 Ñ\81лободнÑ\8bй Ñ\81оÑ\84Ñ\82веÑ\80; Ð¼Ð¾Ð¶ÐµÑ\82е Ð³Ð¾ Ñ\88Ñ\8bÑ\80иÑ\82и Ð°Ð±Ð¾ Ñ\83пÑ\80авлÑ\8fÑ\82и Ð² Ð·Ð³Ð¾Ð´Ñ\97 Ð· Ñ\83Ñ\81ловÑ\96Ñ\8fми GNU General Public License, Ð²Ñ\8bдаваной Free Software Foundation; Ð±Ñ\83дÑ\8c Ð²ÐµÑ\80зÑ\96Ñ\8f 2 Ñ\82ой Ð»Ñ\96Ñ\86енÑ\86Ñ\96Ñ\97 Ð°Ð±Ð¾ (Ñ\8fк Ñ\83важÑ\8bÑ\82е) будьяка пізнїша верзія.
 
 MediaWiki є дістрібуована в надїї, же буде хосновна, але БЕЗ БУДЬЯКОЙ ЗАРУКЫ; не давають ся ани зарукы ПРОДАЙНОСТИ або ВАЛУШНОСТИ ПРО СТАНОВЛЕНЫЙ ЦІЛЬ. Детайлы ся дочітате в текстї  GNU General Public License.
 
@@ -3310,6 +3503,9 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'version-software' => 'Іншталованый софтвер',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Верзія',
+'version-entrypoints' => 'URL вступных пунктів',
+'version-entrypoints-header-entrypoint' => 'Вступный пункт',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Стежка ку файлу',
@@ -3336,7 +3532,7 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 * <span class="mw-specialpagecached">Кешованы шпеціалны сторінкы</span>',
 'specialpages-group-maintenance' => 'Технічны репорты',
 'specialpages-group-other' => 'Іншы',
-'specialpages-group-login' => 'Ð\9fÑ\80иголоÑ\88Ñ\96нÑ\8f / Ñ\80еÒ\91Ñ\96Ñ\81Ñ\82Ñ\80аÑ\86Ñ\96Ñ\8f',
+'specialpages-group-login' => 'Ð\9fÑ\80иголоÑ\88Ñ\96нÑ\8f / Ñ\81Ñ\82воÑ\80Ñ\97нÑ\8f ÐºÐ¾Ð½Ñ\82а',
 'specialpages-group-changes' => 'Послїднї зміны а лоґы',
 'specialpages-group-media' => 'Файлы',
 'specialpages-group-users' => 'Хоснователї і права',
@@ -3400,8 +3596,8 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'htmlform-select-badoption' => 'Вами зазначена величіна не є доступна можность.',
 'htmlform-int-invalid' => 'Зазначена величіна не є ціле чісло.',
 'htmlform-float-invalid' => 'Зазначена величіна не є чісло.',
-'htmlform-int-toolow' => 'Ð\92ами Ð·Ð°Ð·Ð½Ð°Ñ\87ена Ð²ÐµÐ»Ð¸Ñ\87Ñ\96на Ñ\94 Ð¼ÐµÐ½Ñ\88а Ñ\8fк Ð´Ð¾волене мінімум $1',
-'htmlform-int-toohigh' => 'Ð\92ами Ð·Ð°Ð·Ð½Ð°Ñ\87ена Ð²ÐµÐ»Ð¸Ñ\87Ñ\96на Ñ\94 Ð¼ÐµÐ½Ñ\88а Ñ\8fк Ð´Ð¾волене максімум $1',
+'htmlform-int-toolow' => 'Ð\92ами Ð·Ð°Ð·Ð½Ð°Ñ\87ене Ð·Ð½Ð°Ñ\87Ñ\96нÑ\8f Ñ\94 Ð¼ÐµÐ½Ñ\88е Ñ\8fк Ð´Ð¾Ð·волене мінімум $1',
+'htmlform-int-toohigh' => 'Ð\92ами Ð·Ð°Ð·Ð½Ð°Ñ\87ене Ð·Ð½Ð°Ñ\87Ñ\96нÑ\8f Ñ\94 Ð¼ÐµÐ½Ñ\88а Ñ\8fк Ð´Ð¾Ð·волене максімум $1',
 'htmlform-required' => 'Тота величіна є повинна',
 'htmlform-submit' => 'Одослати',
 'htmlform-reset' => 'Вернути зміны',
@@ -3414,59 +3610,89 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 # New logging system
 'logentry-delete-delete' => '$1 змазав сторінку $3',
 'logentry-delete-restore' => '$1 обновив сторінку $3',
+'logentry-delete-event' => '$1 змінив відимость {{PLURAL:$5|протоколового запису|$5 протоколовых записів}} к сторінцї $3: $4',
+'logentry-delete-revision' => '$1 змінив відимость {{PLURAL:$5|ревізії|$5 ревізій}} на сторінцї $3: $4',
+'logentry-delete-event-legacy' => '$1 змінив відимость протоколовых записів к сторінцї $3',
+'logentry-delete-revision-legacy' => '$1 змінив відимость ревізій на сторінцї $3',
+'logentry-suppress-delete' => '$1 утаїв сторінку $3',
+'logentry-suppress-event' => '$1 тайком змінив відимость {{PLURAL:$5|протоколового запису|$5 протоколовых записів}} к сторінцї $3: $4',
+'logentry-suppress-revision' => '$1 тайком змінив відимость {{PLURAL:$5|ревізії|$5 ревізій}} на сторінцї $3: $4',
+'logentry-suppress-event-legacy' => '$1 тайком змінив відимость протоколовых записів к сторінцї $3',
+'logentry-suppress-revision-legacy' => '$1 тайком змінив відимость ревізій на сторінцї $3',
+'revdelete-content-hid' => 'скрыти обсяг',
+'revdelete-summary-hid' => 'опис едітованя схованый',
+'revdelete-uname-hid' => 'імя хоснователя сховане',
+'revdelete-content-unhid' => 'обсяг одкрытый',
+'revdelete-summary-unhid' => 'опис едітованя одкрытый',
 'revdelete-uname-unhid' => 'імя хоснователя одкрыте',
 'revdelete-restricted' => 'приданы обмеджіня про адміністраторів',
 'revdelete-unrestricted' => 'зняты обмеджіня про адміністраторів',
-'logentry-move-move' => '$1 пересунув сторінку $3 на $4',
+'logentry-move-move' => '$1 переменовав сторінку $3 на $4',
 'logentry-move-move-noredirect' => '$1 переменовав сторінку $3 на $4 без створїня напрямлїня',
 'logentry-move-move_redir' => '$1 переменовав сторінку $3 на $4 з вычерянём напрямлїнём',
 'logentry-move-move_redir-noredirect' => '$1 переменовав сторінку $3 на $4 місце напрямлїня без створїня напрямлїня',
+'logentry-patrol-patrol' => '$1 означів ревізію $4 сторінкы $3 як перевірену',
+'logentry-patrol-patrol-auto' => '$1 автоматічно означів ревізію $4 сторінкы $3 як перевірену',
+'logentry-newusers-newusers' => '$1 створив конто хоснователя',
+'logentry-newusers-create' => '$1 створив конто хоснователя',
+'logentry-newusers-create2' => '$1 створив конто хоснователя $3',
+'logentry-newusers-autocreate' => 'Автоматічно было створене конто $1',
 'newuserlog-byemail' => 'гело послане електронічнов поштов',
 
 # Feedback
+'feedback-bugornote' => 'Кідь сьте прирыхтованый подробно описати технічный проблем, можете [$1 наголосити хыбу].
+Інакше можете схносновати простый формулать ниже. Ваш коментарь буде приданый на сторінку „[$3 $2]“ разом з вашым іменом хоснователя тай інформаціов о тім, якый бровсер хоснуєте.',
 'feedback-subject' => 'Предмет:',
 'feedback-message' => 'Повідомлїня:',
 'feedback-cancel' => 'Сторно',
 'feedback-submit' => 'Одослати одозву',
 'feedback-adding' => 'Коментарь ся придавать на сторінку…',
 'feedback-error1' => 'Хыба: Нерозознаый резултат з API',
-'feedback-error2' => 'Ð¥Ñ\8bба: Ð\95дÑ\96Ñ\82ованÑ\8f Ñ\81Ñ\8f Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ило',
+'feedback-error2' => 'Ð¥Ñ\8bба: Ð\95дÑ\96Ñ\82ованÑ\8f Ñ\81Ñ\8f Ð½Ðµ Ð²Ð´Ð°ло',
 'feedback-error3' => 'Хыба: API не вернуло жадну одповідь',
+'feedback-thanks' => 'Дякуєме! Ваш коментарь быв приданый на сторінку „[$2 $1]“.',
 'feedback-close' => 'Готово',
+'feedback-bugcheck' => 'Герешнї! Лем перевірьте, ці то не єдна з [$1 уж знамых хыб].',
+'feedback-bugnew' => 'Перевірив(а) єм то. Хочу повідомити нову хыбу.',
 
 # API errors
-'api-error-badaccess-groups' => 'Ð\9dе Ð¼Ð°Ñ\82е Ð´Ð¾Ð²Ð¾Ð»ÐµÐ½Ð¾ Ð½Ð°Ð³Ñ\80авати файлы на тоту вікі.',
+'api-error-badaccess-groups' => 'Ð\9dе Ð¼Ð°Ñ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð¾вати файлы на тоту вікі.',
 'api-error-badtoken' => 'Внутрїшня хыба: планый знак.',
-'api-error-copyuploaddisabled' => 'Начітаваня з URL є на тім сервері заказане.',
+'api-error-copyuploaddisabled' => 'Наладовованя з URL є на тім сервері заказане.',
 'api-error-duplicate' => 'На тій вікі уж {{PLURAL:$1|екзістує [$2 другый файл]|екзістують [$2 іншы файлы]}} з такым самым обсягом.',
 'api-error-duplicate-archive' => '{{PLURAL:$1|быв [$2 другый файл]|были [$2 даякы другы файлы]}} з такым самым обсягом уж гев оперед {{PLURAL:$1|быв|были}}, але {{PLURAL:$1|быв змазаный|были змазаны}}.',
 'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|дупліцітный файл, якый быв|дупліцітны файл, як были}} змазаны',
 'api-error-duplicate-popup-title' => 'Дупліцітны {{PLURAL:$1|файл|файлы}}',
-'api-error-empty-file' => 'Начітаный файл є порожнїй.',
-'api-error-fetchfileerror' => 'Внутрїшня хыба: дішло ку хыбі почас обтриманя файлу.',
-'api-error-file-too-large' => 'Начітаный файл є барз великый.',
+'api-error-empty-file' => 'Наладованый файл є порожнїй.',
+'api-error-emptypage' => 'Створїня новых, порожнїх сторінк неслободно.',
+'api-error-fetchfileerror' => 'Внутрїшня хыба: трафила ся хыба під час обтриманя файлу.',
+'api-error-fileexists-forbidden' => 'Файл з назвов „$1“ уж екзістує тай не годен го переписати.',
+'api-error-fileexists-shared-forbidden' => 'файл з назвов „$1“ уж екзістує в сполочнім усховищу тай не годен го переписати.',
+'api-error-file-too-large' => 'Наладованый файл є барз великый.',
 'api-error-filename-tooshort' => 'Назва файлу є барз курта.',
 'api-error-filetype-banned' => 'Тот тіп файлу є заказаный.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|є недозволеный формат файлів|суть недозволены форматы файлів}}. {{PLURAL:$3|Дозволеный формат фалів є|Дозволены форматы файлів суть}} $2.',
 'api-error-filetype-missing' => 'Тот файл не мать росшырїня.',
 'api-error-hookaborted' => 'Пожадована вами зміна была одмітнута дакотрым росшырінём.',
-'api-error-http' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\97Ñ\88нÑ\8f Ñ\85Ñ\8bба: Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ило Ñ\81Ñ\8f Ð¿Ñ\80ипоÑ\97Ñ\82и ÐºÑ\83 серверу.',
-'api-error-illegal-filename' => 'ТоÑ\82а Ð½Ð°Ð·Ð²Ð° Ñ\84айлÑ\83 Ð½Ðµ Ñ\94 Ð¿Ð¾волена.',
-'api-error-internal-error' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\97Ñ\88нÑ\8f Ñ\85Ñ\8bба: Ð´Ñ\96Ñ\88ло ÐºÑ\83 Ñ\85Ñ\8bбÑ\96 Ð¿Ð¾Ñ\87аÑ\81 Ñ\81пÑ\80аÑ\86ованÑ\8f Ð²Ð°Ñ\88ого Ð½Ð°Ñ\87Ñ\96Ñ\82аного файлу.',
+'api-error-http' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\97Ñ\88нÑ\8f Ñ\85Ñ\8bба: Ð½Ðµ Ð²Ð´Ð°Ð»Ð¾ Ñ\81Ñ\8f Ð¿Ñ\80ипоÑ\97Ñ\82и Ðº серверу.',
+'api-error-illegal-filename' => 'ТоÑ\82а Ð½Ð°Ð·Ð²Ð° Ñ\84айлÑ\83 Ð½Ðµ Ñ\94 Ð´Ð¾Ð·волена.',
+'api-error-internal-error' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\97Ñ\88нÑ\8f Ñ\85Ñ\8bба: Ð¿Ñ\80иÑ\82Ñ\80аÑ\84ила Ñ\81Ñ\8f Ñ\85Ñ\8bба Ð¿Ñ\96д Ñ\87аÑ\81 Ñ\81пÑ\80аÑ\86ованÑ\8f Ð²Ð°Ñ\88ого Ð½Ð°Ð»Ð°Ð´Ð¾Ð²аного файлу.',
 'api-error-invalid-file-key' => 'Внутрїшня хыба: файл ся не нашов в дочаснім усховіщі.',
 'api-error-missingparam' => 'Внутрїшня хыба: хыбують параметры пожадавкы.',
 'api-error-missingresult' => 'Внутрїшня хыба: не годен становити, ці копірованя было успішне.',
-'api-error-mustbeloggedin' => 'Ð\9fÑ\80о Ð½Ð°Ñ\87Ñ\96Ñ\82аванÑ\8f Ñ\84айлÑ\96в мусите быти приголошеный.',
+'api-error-mustbeloggedin' => 'Ð\96ебÑ\8b Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ñ\82и Ñ\84айлÑ\8b, мусите быти приголошеный.',
 'api-error-mustbeposted' => 'Внутрїшня хыба: пожадавка мусить быти через HTTP POST.',
-'api-error-noimageinfo' => 'Начітаня было успішне, але сервер не додав о файлї жадны інформації.',
-'api-error-nomodule' => 'Внутрїшня хыба: не є наставленый модул начітаваня.',
+'api-error-noimageinfo' => 'Наладованя было успішне, але сервер не додав о файлї ниякы інформації.',
+'api-error-nomodule' => 'Внутрїшня хыба: не є наставленый модул наладовованя.',
 'api-error-ok-but-empty' => 'Внутрїшня хыба: сервер не одповідать.',
-'api-error-overwrite' => 'Не є доволене переписати екзістуючій файл.',
-'api-error-stashfailed' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\97Ñ\88нÑ\8f Ñ\85Ñ\8bба: Ñ\81еÑ\80веÑ\80Ñ\83 Ñ\81Ñ\8f Ð½Ðµ Ð¿Ð¾Ð´Ð°Ñ\80ило уложыти дочасный файл.',
+'api-error-overwrite' => 'Ð\9dе Ñ\94 Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ðµ Ð¿ÐµÑ\80епиÑ\81аÑ\82и ÐµÐºÐ·Ñ\96Ñ\81Ñ\82Ñ\83Ñ\8eÑ\87Ñ\96й Ñ\84айл.',
+'api-error-stashfailed' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\97Ñ\88нÑ\8f Ñ\85Ñ\8bба: Ñ\81еÑ\80веÑ\80Ñ\83 Ñ\81Ñ\8f Ð½Ðµ Ð²Ð´Ð°ло уложыти дочасный файл.',
 'api-error-timeout' => 'Сервер не одповідав в очекаванім часї.',
-'api-error-unclassified' => 'Ð\94Ñ\96Ñ\88ло ÐºÑ\83 Ð½ÐµÐ·Ð½Ð°Ð¼Ñ\96й Ñ\85Ñ\8bбÑ\96.',
+'api-error-unclassified' => 'ТÑ\80аÑ\84ила Ñ\81Ñ\8f Ð½ÐµÐ·Ð½Ð°Ð¼Ð° Ñ\85Ñ\8bба.',
 'api-error-unknown-code' => 'Незнама хыба: „$1“',
-'api-error-unknown-error' => 'Внутрїшня хыба: дішло ку хыбі при спробі о начітаня файлу.',
+'api-error-unknown-error' => 'Внутрїшня хыба: трафила ся хыба при спробі о наладованя файлу.',
 'api-error-unknown-warning' => 'Незнаме варованя: $1',
+'api-error-unknownerror' => 'Незнама хыба: „$1“',
 'api-error-uploaddisabled' => 'Начітаваня файлів є на тій вікі выпнуте.',
 'api-error-verification-error' => 'Файл є може пошкодженый, або мать плане росшырїня.',
 
@@ -3479,5 +3705,6 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'duration-years' => '$1 {{PLURAL:$1|рік|рокы|років}}',
 'duration-decades' => '$1 {{PLURAL:$1|декада|декады|декад}}',
 'duration-centuries' => '$1 {{PLURAL:$1|стороча|стороча|стороч}}',
+'duration-millennia' => '$1 {{PLURAL:$1|тісячроча|тісячроча|тісячроч}}',
 
 );
index e7f611b..1f304a5 100644 (file)
@@ -21,6 +21,7 @@
  * @author Omnipaedista
  * @author Shantanoo
  * @author Shijualex
+ * @author Shreekant Hegde
  * @author Shubha
  * @author Vibhijain
  * @author రాకేశ్వర
@@ -171,107 +172,107 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#पुनर्निदेशन', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__नैवअनुक्रमणी__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__नैवसंक्रमणका__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__अनुक्रमणीसचते__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__अनुक्रमणी__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__नैवसम्पादनविभाग__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__नैवमुख्यशिर्षक__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'अद्यमासे', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'अद्यमासेनाम', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'अद्यमासेनामसाधारण', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'अद्यमासेसंक्षीप्त', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'अद्यदिवसे', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'अद्यदिवसे२', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'अद्यदिवसेनाम', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'अद्यवर्ष', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'सद्यसमय', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'सद्यघण्टा', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'स्थानिकमासे', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'स्थानिकमासेनाम', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'स्थानिकमासेनामसाधारण', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'स्थानिकमासेसंक्षीप्त', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'स्थानिकदिवसे', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'स्थानिकदिवसे२', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'स्थानिकदिवसेनाम', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'स्थानिकवर्षे', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'स्थानिकसमये', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'स्थानिकघण्टा', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'पृष्ठानाम्‌सङ्ख्या', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'लेखस्य‌सङ्ख्या', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'संचिकानाम्‌‌सङ्ख्या', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'योजकस्यसङ्ख्या', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'सम्पादनसङ्ख्या', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'दृष्टिसङ्ख्या', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'पृष्ठनाम', 'PAGENAME' ),
-       'namespace'               => array( '1', 'नामविश्व', 'NAMESPACE' ),
-       'talkspace'               => array( '1', 'व्यासपिठ', 'TALKSPACE' ),
-       'subjectspace'            => array( '1', 'विषयविश्व', 'लेखविश्व', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'fullpagename'            => array( '1', 'पूर्णपृष्ठनाम', 'FULLPAGENAME' ),
-       'subpagename'             => array( '1', 'उपपृष्ठनाम', 'SUBPAGENAME' ),
-       'basepagename'            => array( '1', 'आधारपृष्ठनाम', 'BASEPAGENAME' ),
-       'talkpagename'            => array( '1', 'संवादपृष्ठनाम', 'TALKPAGENAME' ),
-       'subjectpagename'         => array( '1', 'विषयपृष्ठनाम', 'लेखपृष्ठनाम', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'msg'                     => array( '0', 'सन्देश:', 'MSG:' ),
-       'msgnw'                   => array( '0', 'नूतनसन्देश:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'लघुत्तम', 'सङ्कुचितचित्र', 'अङ्गुष्ठ', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'सङ्कुचितचित्र=$1', 'अङ्गुष्ठ=$1', 'लघुत्तमचित्र=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'दक्षिणत', 'right' ),
-       'img_left'                => array( '1', 'वामतः', 'left' ),
-       'img_none'                => array( '1', 'नैव', 'none' ),
-       'img_width'               => array( '1', '$1पिट', '$1px' ),
-       'img_center'              => array( '1', 'मध्य', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'आबन्ध', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'निराबन्ध', 'frameless' ),
-       'img_page'                => array( '1', 'पृष्ठ=$1', 'पृष्ठ $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'उन्नत', 'उन्नत=$1', 'उन्नत $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'सीमा', 'border' ),
-       'img_baseline'            => array( '1', 'आधाररेखा', 'baseline' ),
-       'img_sub'                 => array( '1', 'विषये', 'sub' ),
-       'img_super'               => array( '1', 'अति', 'तीव्र', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'अग्र', 'top' ),
-       'img_text_top'            => array( '1', 'पाठ्य-अग्र', 'text-top' ),
-       'img_middle'              => array( '1', 'मध्ये', 'middle' ),
-       'img_bottom'              => array( '1', 'अधस', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'पाठ्य-अधस', 'text-bottom' ),
-       'img_link'                => array( '1', 'सम्बद्धं=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'विकल्प=$1', 'alt=$1' ),
-       'sitename'                => array( '1', 'स्थलनाम', 'SITENAME' ),
-       'grammar'                 => array( '0', 'व्याकरण:', 'GRAMMAR:' ),
-       'notitleconvert'          => array( '0', '__नैवशिर्षकपरिवर्त__', '__नैशिप__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__नैवलेखपरिवर्त__', '__नैलेप__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'अद्यसप्ताह', 'CURRENTWEEK' ),
-       'localweek'               => array( '1', 'स्थानिकसप्ताह', 'LOCALWEEK' ),
-       'revisionid'              => array( '1', 'आवृत्तीक्रमांक', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'आवृत्तीदिवसे', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'आवृत्तीदिवसे२', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'आवृत्तीमासे', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'आवृत्तीवर्षे', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'आवृत्तीसमयमुद्रा', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'अनेकवचन:', 'PLURAL:' ),
-       'displaytitle'            => array( '1', 'प्रदर्शनशीर्षक', 'उपाधिदर्शन', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__नूतनविभागसम्बद्धं__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'अद्यआवृत्ती', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'सद्यसमयमुद्रा', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'स्थानिकसमयमुद्रा', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'दिशाचिह्न', 'दिशे', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#भाषा:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'विषयभाषा', 'आधेयभाषा', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'नामविश्वातपृष्ठ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'प्रचालकसंख्या', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'रचनासंख्या', 'FORMATNUM' ),
-       'special'                 => array( '0', 'विशेष', 'special' ),
-       'filepath'                => array( '0', 'संचिकापथ', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'वीजक', 'tag' ),
-       'hiddencat'               => array( '1', '__लुप्तवर्ग__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'वर्गेपृष्ठ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'पृष्ठाकार', 'PAGESIZE' ),
-       'index'                   => array( '1', '__अनुक्रमणिका__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__नैवअनुक्रमणिका__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'गणानामसंख्या', 'गणसंख्या', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__अनित्यपुनर्निदेशन__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'रक्षास्तर', 'PROTECTIONLEVEL' ),
+       'redirect'                  => array( '0', '#पुनर्निदेशन', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__नैवअनुक्रमणी__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__नैवसंक्रमणका__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__अनुक्रमणीसचते__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__अनुक्रमणी__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__नैवसम्पादनविभाग__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__नैवमुख्यशिर्षक__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'अद्यमासे', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'अद्यमासेनाम', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'अद्यमासेनामसाधारण', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'अद्यमासेसंक्षीप्त', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'अद्यदिवसे', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'अद्यदिवसे२', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'अद्यदिवसेनाम', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'अद्यवर्ष', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'सद्यसमय', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'सद्यघण्टा', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'स्थानिकमासे', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'स्थानिकमासेनाम', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'स्थानिकमासेनामसाधारण', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'स्थानिकमासेसंक्षीप्त', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'स्थानिकदिवसे', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'स्थानिकदिवसे२', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'स्थानिकदिवसेनाम', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'स्थानिकवर्षे', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'स्थानिकसमये', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'स्थानिकघण्टा', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'पृष्ठानाम्‌सङ्ख्या', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'लेखस्य‌सङ्ख्या', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'संचिकानाम्‌‌सङ्ख्या', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'योजकस्यसङ्ख्या', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'सम्पादनसङ्ख्या', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'दृष्टिसङ्ख्या', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'पृष्ठनाम', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'नामविश्व', 'NAMESPACE' ),
+       'talkspace'                 => array( '1', 'व्यासपिठ', 'TALKSPACE' ),
+       'subjectspace'              => array( '1', 'विषयविश्व', 'लेखविश्व', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'fullpagename'              => array( '1', 'पूर्णपृष्ठनाम', 'FULLPAGENAME' ),
+       'subpagename'               => array( '1', 'उपपृष्ठनाम', 'SUBPAGENAME' ),
+       'basepagename'              => array( '1', 'आधारपृष्ठनाम', 'BASEPAGENAME' ),
+       'talkpagename'              => array( '1', 'संवादपृष्ठनाम', 'TALKPAGENAME' ),
+       'subjectpagename'           => array( '1', 'विषयपृष्ठनाम', 'लेखपृष्ठनाम', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'msg'                       => array( '0', 'सन्देश:', 'MSG:' ),
+       'msgnw'                     => array( '0', 'नूतनसन्देश:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'लघुत्तम', 'सङ्कुचितचित्र', 'अङ्गुष्ठ', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'सङ्कुचितचित्र=$1', 'अङ्गुष्ठ=$1', 'लघुत्तमचित्र=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'दक्षिणत', 'right' ),
+       'img_left'                  => array( '1', 'वामतः', 'left' ),
+       'img_none'                  => array( '1', 'नैव', 'none' ),
+       'img_width'                 => array( '1', '$1पिट', '$1px' ),
+       'img_center'                => array( '1', 'मध्य', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'आबन्ध', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'निराबन्ध', 'frameless' ),
+       'img_page'                  => array( '1', 'पृष्ठ=$1', 'पृष्ठ $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'उन्नत', 'उन्नत=$1', 'उन्नत $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'सीमा', 'border' ),
+       'img_baseline'              => array( '1', 'आधाररेखा', 'baseline' ),
+       'img_sub'                   => array( '1', 'विषये', 'sub' ),
+       'img_super'                 => array( '1', 'अति', 'तीव्र', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'अग्र', 'top' ),
+       'img_text_top'              => array( '1', 'पाठ्य-अग्र', 'text-top' ),
+       'img_middle'                => array( '1', 'मध्ये', 'middle' ),
+       'img_bottom'                => array( '1', 'अधस', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'पाठ्य-अधस', 'text-bottom' ),
+       'img_link'                  => array( '1', 'सम्बद्धं=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'विकल्प=$1', 'alt=$1' ),
+       'sitename'                  => array( '1', 'स्थलनाम', 'SITENAME' ),
+       'grammar'                   => array( '0', 'व्याकरण:', 'GRAMMAR:' ),
+       'notitleconvert'            => array( '0', '__नैवशिर्षकपरिवर्त__', '__नैशिप__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__नैवलेखपरिवर्त__', '__नैलेप__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'अद्यसप्ताह', 'CURRENTWEEK' ),
+       'localweek'                 => array( '1', 'स्थानिकसप्ताह', 'LOCALWEEK' ),
+       'revisionid'                => array( '1', 'आवृत्तीक्रमांक', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'आवृत्तीदिवसे', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'आवृत्तीदिवसे२', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'आवृत्तीमासे', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'आवृत्तीवर्षे', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'आवृत्तीसमयमुद्रा', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'अनेकवचन:', 'PLURAL:' ),
+       'displaytitle'              => array( '1', 'प्रदर्शनशीर्षक', 'उपाधिदर्शन', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__नूतनविभागसम्बद्धं__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'अद्यआवृत्ती', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'सद्यसमयमुद्रा', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'स्थानिकसमयमुद्रा', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'दिशाचिह्न', 'दिशे', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#भाषा:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'विषयभाषा', 'आधेयभाषा', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'नामविश्वातपृष्ठ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'प्रचालकसंख्या', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'रचनासंख्या', 'FORMATNUM' ),
+       'special'                   => array( '0', 'विशेष', 'special' ),
+       'filepath'                  => array( '0', 'संचिकापथ', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'वीजक', 'tag' ),
+       'hiddencat'                 => array( '1', '__लुप्तवर्ग__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'वर्गेपृष्ठ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'पृष्ठाकार', 'PAGESIZE' ),
+       'index'                     => array( '1', '__अनुक्रमणिका__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__नैवअनुक्रमणिका__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'गणानामसंख्या', 'गणसंख्या', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__अनित्यपुनर्निदेशन__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'रक्षास्तर', 'PROTECTIONLEVEL' ),
 );
 
 $digitGroupingPattern = "##,##,###";
@@ -472,8 +473,8 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'protect' => 'संरक्ष्यताम्',
 'protect_change' => 'परिवर्त्यताम्',
 'protectthispage' => 'इदं पृष्ठं संरक्ष्यताम्',
-'unprotect' => 'à¤\85सà¥\81रà¤\95à¥\8dषितà¥\80à¤\95रà¥\8bतु',
-'unprotectthispage' => 'à¤\8fततà¥\8dपà¥\83षà¥\8dठà¤\82 à¤\85सà¥\81रà¤\95à¥\8dषितà¥\80à¤\95रà¥\8bतà¥\81',
+'unprotect' => 'सà¤\82रà¤\95à¥\8dषणà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतयतु',
+'unprotectthispage' => 'à¤\85सà¥\8dय à¤ªà¥\81à¤\9fसà¥\8dय à¤¸à¥\81रà¤\95à¥\8dषाà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतयतà¥\81 à¥¤',
 'newpage' => 'नवीनपृष्ठम्',
 'talkpage' => 'अस्य पृष्ठस्य विषये चर्चा क्रियताम्',
 'talkpagelinktext' => 'सम्भाषणम्',
@@ -501,9 +502,9 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'jumpto' => 'गम्यताम् अत्र :',
 'jumptonavigation' => 'पर्यटनम्',
 'jumptosearch' => 'अन्वेषणम्',
-'view-pool-error' => 'à¤\95à¥\8dषमà¥\8dयतामà¥\8d, à¤ªà¤°à¤¿à¤µà¥\87षणयनà¥\8dतà¥\8dराणि à¤\85तिभारितानि à¤\85सà¥\8dमिनà¥\8d à¤¸à¤®à¤¯à¥\87
-बहवà¤\83 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतारà¤\83 à¤\8fततà¥\8d à¤ªà¥\83षà¥\8dठà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤ªà¥\8dरयतमानाà¤\83 à¤¸à¤¨à¥\8dति
-कृपया किंचित्कालं प्रतीक्षताम् भवान्, तदा क्रियताम् प्रयासः।
+'view-pool-error' => 'भà¥\8bà¤\83, à¤\85धà¥\81ना à¤µà¤¿à¤¤à¤¾à¤°à¤\95à¤\83 à¤\85तिभाराà¤\95à¥\8dरानà¥\8dतà¤\83 
+बहवà¤\83 à¤¯à¥\8bà¤\9cà¤\95ाà¤\83 à¤\8fततà¥\8d à¤ªà¥\83षà¥\8dठà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81à¤\82 à¤ªà¥\8dरयतमानाà¤\83 à¤¸à¤¨à¥\8dति 
+कृपया, कञ्चित्कालं प्रतीक्षतां करोतु । 
 $1',
 'pool-timeout' => 'कालावधिः समाप्ता, यन्त्रणस्यार्थे प्रतीक्षते',
 'pool-queuefull' => 'कुण्डपंक्तिः (पूल् क्यू इत्येषा) पूर्णा अस्ति।',
@@ -542,6 +543,10 @@ $1',
 'youhavenewmessages' => 'भवदर्थम् $1 सन्ति। ($2).',
 'newmessageslink' => 'नूतनाः सन्देशाः',
 'newmessagesdifflink' => 'अन्तिमं परिवर्तनम्',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|अन्ययोजकः|$3 योजकाः}} ($2) इत्यस्मात्  भवतः $1 अस्ति ।',
+'youhavenewmessagesmanyusers' => 'अनैकेभ्यः योजकेभ्यः ते $1 सन्ति $2 ।',
+'newmessageslinkplural' => '{{PLURAL:$1|नूतनः सन्देशः|नूतनसन्देशाः}}',
+'newmessagesdifflinkplural' => 'सद्यः {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}',
 'youhavenewmessagesmulti' => 'भवतः कृते $1 मध्ये नूतनः सन्देशः विद्यते',
 'editsection' => 'सम्पाद्यताम्',
 'editold' => 'सम्पाद्यताम्',
@@ -559,6 +564,7 @@ $1',
 'restorelink' => '{{PLURAL:$1|एकम् अपाकृतं संपादनम्  |$1 अपाकृतानि संपादनानि}}',
 'feedlinks' => 'अनुबन्ध:',
 'feed-invalid' => 'अमान्यं सेवाग्रहण-पूरण (सब्स्क्रिप्शन-फीड् इति) प्रकारः।',
+'feed-unavailable' => 'समवायसम्पूरणं नोपलभते ।',
 'site-rss-feed' => '$1 आरएसएस पूरणम्',
 'site-atom-feed' => '$1 अणुपूरणम्',
 'page-rss-feed' => '"$1" आरएसएस-पूरणम्',
@@ -607,12 +613,10 @@ $1',
 'enterlockreason' => 'तन्त्रितीकरणस्य कारणं ददातु, अपि च आकलितं ददातु यत् तन्त्रणं कदा उद्घाट्यिष्यते।',
 'readonlytext' => 'समंकाधारं वर्तमानकाले तन्त्रितमस्ति नूतनान् प्रविष्टीन् विरुध्य तथा च अन्यानि परिवर्तनानि विरुध्य। इदं नियमिततया समंकाधार परिचर्याऽर्थं तथा स्यात्। तत्पश्चादिदं सामान्यतां संप्राप्स्यति।
 तन्त्रितीकारकेन प्रबन्धकेन इदं कारणं प्रदत्तम्: $1',
-'missing-article' => 'दत्ताधारेण(डाटाबेस् इत्यनेन) "$1" $2 इतिनामकं प्राप्तव्यं यत् पृष्ठं तत् नैव प्राप्तम्।
-
+'missing-article' => 'त्ताधारेण(डाटाबेस् इत्यनेन) "$1" $2 इतिनामकं प्राप्तव्यं यत् पृष्ठं तत् नैव प्राप्तम्।
 प्रायः कालातीतस्य अथवा अपाकृतस्य इतिहाससम्पर्कतन्तोः कारणेन एवं भवति।
-
 यदि नैवं तर्हि भवता तन्त्रांशकीटकं प्राप्तं स्यात्।
-कृपया कोऽपि [[Special:ListUsers//sysop|administrator]]अस्य पृष्ठस्य सङ्केतज्ञापनपूर्वकं सूच्यताम्।',
+कृपया कोऽपि [[Special:ListUsers/sysop|administrator]]अस्य पृष्ठस्य सङ्केतज्ञापनपूर्वकं सूच्यताम्।',
 'missingarticle-rev' => '(आवृत्तिः# :$1)',
 'missingarticle-diff' => '(व्यतिरेक: $1, $2)',
 'readonly_lag' => 'मुख्य-समंकाधार-परिवेशकं उपमुख्य-समंकाधार-परिवेशकस्य संप्रापणात् पूर्वे एव स्वतः तन्त्रितम् अस्ति।',
@@ -632,10 +636,11 @@ $1',
 'cannotdelete' => '$1 इति पृष्ठं संचिका वा अपाकर्तुं नाशक्नोत्।
 इदं खलु केनचिदन्येन पूर्वे एव अपाकृतं स्यात्।',
 'cannotdelete-title' => ' "$1" पृष्ठं निर्मार्जयितुम् अशक्यम्',
+'delete-hook-aborted' => 'आलम्बेन अपमार्जनम् अपनीतम् । अनेन विवरणं न दत्तम् ।',
 'badtitle' => 'दुष्टं शिरोनाम',
 'badtitletext' => 'प्रार्थितं पृष्ठशीर्षकम् अमान्यं रिक्तम् अशुद्धतया सम्बद्धम् आन्तर्भाषिकम्, आन्तर्विकीयं वा शीर्षकमस्ति । अस्मिन् एकं एकाधिकानि वा एतादृशानि अक्षराणि विद्यन्ते येषां प्रयोगं शीर्षकेषु कर्तुम् अशक्यम्।',
-'perfcached' => 'à¤\85नà¥\81पदà¥\8bà¤\95à¥\8dतà¤\82 à¤¸à¤®à¤\82à¤\95à¤\82 à¤\95à¥\88शà¥\8d à¤\87तà¥\8dयà¥\87तसà¥\8dमादà¥\8d à¤\85सà¥\8dति, à¤\85तà¤\83 à¤\85दà¥\8dयतनà¤\82 à¤¨ à¤¸à¥\8dयातà¥\8d। A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'à¤\85नà¥\81पदà¥\8bà¤\95à¥\8dतà¤\82 à¤¸à¤®à¤\82à¤\95à¤\82 à¤\95à¥\88शà¥\8d à¤\87तà¥\8dयà¥\87तसà¥\8dमिनà¥\8d à¤µà¤¿à¤¦à¥\8dयतà¥\87, à¤¤à¤¥à¤¾ à¤\9a $1 à¤\87तà¥\8dयà¥\87ततà¥\8dसमयà¥\87 à¤\85नà¥\8dतिमà¤\82 à¤µà¤¾à¤°à¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतितमà¥\8d। A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'à¤\85नà¥\81पदà¥\8bà¤\95à¥\8dतà¤\82 à¤²à¥\87à¤\96à¤\83 à¤\95à¥\88शà¥\8d à¤\87तà¥\8dयà¥\87तसà¥\8dमादà¥\8d à¤\85सà¥\8dति, à¤\85तà¤\83 à¤\85दà¥\8dयतनà¤\82 à¤¨ à¤¸à¥\8dयातà¥\8d।  {{PLURAL:$1|one result is|$1 results are}}',
+'perfcachedts' => 'à¤\85धà¥\8bनिदà¥\87शितलà¥\87à¤\96à¤\83 à¤¸à¤\9eà¥\8dà¤\9aितà¤\83 à¥¤ à¤ªà¥\82रà¥\8dवपदà¥\8bनà¥\8dनतिà¤\83 $1 à¥¤ $4 {{PLURAL:}} à¤\85धिà¤\95ाधिà¤\95परिणामà¤\83 à¤¸à¤\9eà¥\8dà¤\9aयà¥\87 à¤\89पलबà¥\8dधà¤\83 à¥¤',
 'querypage-no-updates' => 'अस्य पृष्ठस्य परिशोधनं विफलीकृतमस्ति । 
 सद्यः अत्रत्यः विषयः न नवीक्रियते ।',
 'wrong_wfQuery_params' => 'wfQuery() इत्येतस्य अशुद्धः मानदण्डः दत्तः अस्ति<br />
@@ -660,6 +665,11 @@ $2',
 'ns-specialprotected' => 'विशिष्टानि पृष्ठानि परिवर्तयितुं न शक्यन्ते।',
 'titleprotected' => 'सदस्य [[User:$1|$1]] इत्यनेन एतत्-शीर्षकीयं पृष्ठं सृजनात् वारितमस्ति।
 एतदर्थं प्रदत्तं कारणम् "$2"।',
+'filereadonlyerror' => '"$1"  सञ्चिकापरिवर्तनं न शक्यते यतः "$2" शब्दकोशः केवलं पठनयोग्यः । प्रशासकेन पिहितं यः विवरणमिच्छति "$3".',
+'invalidtitle-knownnamespace' => ' "$2" नमावकाशेन "$3" पाठ्येन च युक्तम् अनर्हशीर्षम् ।',
+'invalidtitle-unknownnamespace' => 'अज्ञातनामवाकाशयुता  सङ्ख्या $1 पाठ्यः "$2" अपुष्टशीर्षिका ।',
+'exception-nologin' => 'न नामाभिलितम्',
+'exception-nologin-text' => 'एतस्मि पुटि प्रक्रियां वा ते प्रवेशः आवश्यकः ।',
 
 # Virus scanner
 'virus-badscanner' => "असुष्ठु अभिविन्यासः : अज्ञातं विषाणु-निरीक्षित्रम्: ''$1''",
@@ -680,6 +690,7 @@ $2',
 'remembermypassword' => 'अस्मिन् सङ्गणके मम प्रवेशः स्मर्यताम् (अधिकतमम् $1 {{PLURAL:$1|दिनम्|दिनानि}})',
 'securelogin-stick-https' => 'प्रवेशोपरान्तं एचटीटीपीएस(HTTPS) इत्यनेन सह संबद्धः तिष्ठतु।',
 'yourdomainname' => 'भवतः प्रक्षेत्रम्:',
+'password-change-forbidden' => 'अस्यां विक्यां निकुञ्चं परिवर्तयितुं न शक्नोति ।',
 'externaldberror' => 'तत्र प्रमाणीकरण समंकाधारे त्रुटिर्जाता, अथवा भवान् स्वकीयां बाह्य-लेखां अद्यतनीकर्तुं अनुमतिं न धारयति।',
 'login' => 'प्रविश्यताम्',
 'nav-login-createaccount' => 'प्रविश्यताम्/ सदस्यता प्राप्यताम्',
@@ -752,6 +763,7 @@ $2',
 'invalidemailaddress' => 'प्रतीयते यद् विद्युत्सन्देशसंकेतः अमान्ये प्रारूपे विद्यते। अतएव एतत् स्वीकरोतुं न शक्यते।
 कृपया एकं प्रारूपसम्मतं संकेतं ददातु, अथवा तत् क्षेत्रं रिक्तमेव करोतु।',
 'cannotchangeemail' => 'अस्मिन् विकिमध्ये सदस्य-ईपत्र-सङ्केतः परिवर्तयितुं न शक्यते ।',
+'emaildisabled' => 'स्थानमेतत् विद्युन्मनपत्रं न प्रेषयति ।',
 'accountcreated' => 'सदस्यता प्राप्ता',
 'accountcreatedtext' => '$1 इत्येतस्य सदस्यता प्राप्ता अस्ति।',
 'createaccount-title' => '{{SITENAME}} इत्येतदर्थं लेखासृजनम्',
@@ -812,12 +824,25 @@ You may ignore this message, if this account was created in error.',
 $2
 इत्यनेन ईपत्रसङ्केतेन सम्बद्धम् अस्ति / सम्बद्धानि सन्ति ।
 {{PLURAL:$3|अयं तात्कालिकः कूटशब्दः | इमे तात्कालिकाः कूटशब्दाः}}  {{PLURAL:$5| एकं दिनं | $5 दिनानि}} यावत् सक्रियः भवति / सक्रियाः भवन्ति ।',
+'passwordreset-emailtext-user' => 'कश्चित् (भवान् अपि स्यात्, $1 इति ऐ. पि. सङ्केतात्) {{SITENAME}} ($4) इत्यस्य प्रवेशसम्बद्धं विवरणं प्रार्थितवान् । अधः सूचितस्य उपयोक्तुः {{PLURAL:$3 | प्रवेशविवरणं | प्रवेशविवरणानि}} 
+$2
+इत्यनेन ईपत्रसङ्केतेन सम्बद्धम् अस्ति / सम्बद्धानि सन्ति ।
+{{PLURAL:$3|अयं तात्कालिकः कूटशब्दः | इमे तात्कालिकाः कूटशब्दाः}}  {{PLURAL:$5| एकं दिनं | $5 दिनानि}} यावत् सक्रियः भवति / सक्रियाः भवन्ति ।',
 'passwordreset-emailelement' => 'प्रयोक्तृनाम: $1
 अल्पकालिकः कूटशब्दः : $2',
 'passwordreset-emailsent' => 'एकः स्मारकः विद्युत्सन्देशः प्रेषितोऽस्ति।',
+'passwordreset-emailsent-capture' => 'अधो दर्शितस्य विद्युन्मानसङ्केतस्य अनुस्मारकं प्रेषितम् ।',
+'passwordreset-emailerror-capture' => 'अधो निर्दिष्टानुस्मारकः विद्युन्मानसन्देशः रचितः । किन्तुः योजकसम्प्रेषणं विपन्नम् ।$1',
 
 # Special:ChangeEmail
 'changeemail' => 'विद्युन्मानपत्रादेशं परिवर्तयतु',
+'changeemail-header' => 'उपयोजकसंज्ञायाः विद्युन्मानपत्रसङ्केतं परिवर्तयतु ।',
+'changeemail-text' => 'स्वस्य विद्युन्मानपत्रसङ्केतं परिवर्तयितुम् एतत् प्रपत्रं पूरयतु । दृढीकरणार्थं निकुञ्चः निवेशनीयः ।',
+'changeemail-no-info' => 'अस्य पुटस्य उपसञ्चारार्थं नामाभिलेखनम् अनिवार्यम् ।',
+'changeemail-oldemail' => 'प्रचलितः विद्युन्मानपत्रसङ्केतः ।',
+'changeemail-newemail' => 'नूतनः विद्युन्मानसङ्केतः ।',
+'changeemail-none' => 'असत्',
+'changeemail-submit' => 'विद्युन्मानपत्रसङ्केतं परिवर्तयतु ।',
 'changeemail-cancel' => 'निवर्तयते',
 
 # Edit page toolbar
@@ -861,6 +886,18 @@ $2
 'summary-preview' => 'सारांशस्य प्राग्दृश्यम् :',
 'subject-preview' => 'विषयस्य/शीर्षकस्य प्राग्दृश्यम्:',
 'blockedtitle' => 'प्रयोक्ता अवरुद्धः वर्तते',
+'blockedtext' => 'भवतः आइपिसङ्केतः स्वचालितविधिना अवरुद्धोऽस्ति, यस्मादयं भिन्नेनैकेन सदस्येन प्रयुक्त आसीत्, यो हि $1 इत्यनेन अवरुद्धः आसीत्।
+प्रदत्तं कारणमेतदस्ति:
+:\'\'$2\'\'
+* अवरोधनस्यारम्भः: $8
+* अवरोधनस्य समाप्तिः: $6
+* अभिप्रेतः अवरोध्यः: $7
+
+भवान् अवरोधार्थं सम्भाषणं कर्तुं  $1 इत्येतं अथवा अन्यान् [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धकान्]] सम्पर्कं कर्त्तुं शक्नोति।
+मनसि धारयतु यद् भवान् "e-mail this user"(विद्युत्सन्देशः)  इति सुविधायाः प्रयोगः तावत् कर्त्तुं न शक्नोति यावत् भवानेकं  विधिमान्यं विद्युत्सन्देश-सङ्केतं [[Special:Preferences|user preferences]] इत्यत्र न पञ्जीकृतवानस्ति अपि च भवान् तस्य प्रयोगात् न निवारितोऽस्ति।
+
+भवतः वर्तमानः आइपीसङ्केतः $3 इति अस्ति। अपि च अवरोधनस्य परिचयचिह्नम्  (आइडी) #$5 इत्यस्ति।
+कृपया भवान् स्वकीयेषु सर्वेष्वपि प्रश्नेषु सर्वमेतत् वर्णनं ददातु।',
 'autoblockedtext' => 'भवतः आइपिसङ्केतः स्वचालितविधिना अवरुद्धोऽस्ति, यस्मादयं भिन्नेनैकेन सदस्येन प्रयुक्त आसीत्, यो हि $1 इत्यनेन अवरुद्धः आसीत्।
 प्रदत्तं कारणमेतदस्ति:
 :\'\'$2\'\'
@@ -892,17 +929,25 @@ $2
 पृष्ठं स्रष्टुम् अधःप्रदत्तायां पेटिकायां टंकणं करोतु (सहाय्यार्थं [[{{MediaWiki:Helppage}}|अत्र]] क्लिक्करोतु।
 
 चेद्भवान् अत्र भ्रान्तिना आनीतोऽस्ति तदा स्वकीये ब्राउसर् इत्यस्मिन् '''बैक्''' इत्यस्मिन् क्लिक्करोतु।)",
+'anontalkpagetext' => 'तस्य अनामकयोजकस्य, अथवा अनुपयोजकस्य च परिचर्चापुटम् येन एतावति काले स्वस्थनं  न निर्मितम् । 
+अतः तस्य अभिज्ञानार्थं ऐ.पि.सङ्गेतसङ्ख्या प्रयोजनीया । 
+सा समाना सङ्ख्याः अन्ययोजकैः अपि विभक्ता । यदि भवान् अनामकयोजकः, भवता असम्बद्धटीकाः श्रुताः, कृपया स्वस्थनं निर्मीय नामाभिलेखं करोतु ।  [[Special:UserLogin/signup|create an account]], [[Special:UserLogin|log in]] अन्यानामकयोजकैः सह सम्भूयमनभ्रमैः विमुक्तः भवतु ।',
 'noarticletext' => 'अस्मिन् पृष्ठे अधुना किमपि न विद्यते। भवान् विकिपीडियावर्तिषु अन्येषु पृष्ठेषु इदं [[Special:Search/{{PAGENAME}}|शीर्षकम् अन्वेष्टुम्]]अर्हति अथवा इदं पृष्ठं 
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  सम्बद्धेषु पृष्ठेषु अन्वेष्टुम् अर्हति],
 अथवा [{{fullurl:{{FULLPAGENAME}}|action=edit}} इदं पृष्ठं सम्पादयितुम् अर्हति]</span>.',
 'noarticletext-nopermission' => 'अस्मिन् पृष्ठे अधुना किमपि न विद्यते। भवान् विकिपीडियावर्तिषु अन्येषु पृष्ठेषु इदं [[Special:Search/{{PAGENAME}}|शीर्षकम् अन्वेष्टुम् अर्हति]] 
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  related logs अन्वेष्टुम् अर्हति],
 अथवा [{{fullurl:{{FULLPAGENAME}}|action=edit}} इदं पृष्ठं स्रष्टुम् अर्हति]</span>.',
+'missing-revision' => '{{PAGENAME}} इति नामाङ्कितपुटस्य #$1 इति पुनरावृत्तिः अत्र नाश्ति । 
+पुटेन सह कालातीतानुबन्धकारणेन एतत् अभवत् ।
+विवरणम् अत्र दृश्यते ।[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 'userpage-userdoesnotexist' => '"$1" इति प्रयोक्तृलेखा पञ्जीकृता नास्ति।
 चेद्भवान् एतत्पृष्ठं स्रष्टुमिच्छति सम्पादयितुमिच्छति वा तदा कृपया पुनरीक्षताम्।',
 'userpage-userdoesnotexist-view' => '"$1" इति प्रयोक्तृलेखा पञ्जीकृता नास्ति।',
 'blocked-notice-logextract' => 'अयं प्रयोक्ता सम्प्रति अवरुद्धः वर्तते।
 नूतनतमा अवरोधाभिलेख-प्रविष्टिः सन्दर्भार्थम् अधस्तात् प्रदत्ताऽस्ति:',
+'clearyourcache' => "'''सूचनाः'''",
+'usercssyoucanpreview' => "'''सूचना :''' रक्षणात्पूर्वं स्वकीयं जावास्क्रिप्ट् इति लिपिं परीक्षितुं \"{{int:showpreview}}\" इति गण्डं प्रयोजयतु।",
 'userjsyoucanpreview' => "'''सूचना :''' रक्षणात्पूर्वं स्वकीयं जावास्क्रिप्ट् इति लिपिं परीक्षितुं \"{{int:showpreview}}\" इति गण्डं प्रयोजयतु।",
 'usercsspreview' => "'''मनसि धारयतु यद्भवान् केवलं प्राग्दृश्यं पश्यति स्वकीयस्य प्रयोक्तृ-सीएसएस् इत्येतस्य'''
 '''इदं अधुनावधि यावत् रक्षितं नास्ति!'''",
@@ -917,19 +962,27 @@ $2
 'updated' => '(अद्यतनीकृतः)',
 'note' => "'''सूचना:'''",
 'previewnote' => "'''स्मरणीयं यदेतत् केवलं प्राग्दृश्यमस्ति।'''
-भवता कृतानि परिवर्तनानि इदानीं यावत् न रक्षितानि !",
+ ते परिवर्तनानि इदानीं यावत् न रक्षितानि ।",
+'continue-editing' => 'सम्पादनम् अनुवर्तताम्',
 'previewconflict' => 'अस्मिन् प्राग्दृश्ये दर्शितमस्ति यत् उपरिवर्ति पाठ क्षेत्रस्य पाठः रक्षणपश्चात् कीदृशः दृष्टिगोचरः भविष्यति।',
 'session_fail_preview' => "'''क्षम्यताम्! अस्माभिः भवतः सम्पादनस्य संसाधनं न कर्तुं शक्तम् यस्माद्धि सत्रस्य सूचनाः लुप्ताः।'''
 कृपया पुनः चेष्टताम्।
 चेदेतत् अधुनाऽपि न कार्यशीलं स्यात्, [[Special:UserLogout|सत्राद्बहिः गत्वा]] पुनः प्रवेशं करोतु।",
+'session_fail_preview_html' => 'लेखभागाभावात् ते परिचर्यां समापयितुं न शक्यते ।[[Special:UserLogout|logging out]]',
+'token_suffix_mismatch' => "'''ते सम्पादनं तिर्स्कृतम् । यतः ते ग्राहकः सम्पादनप्रतीके लेखानचिह्नानि क्षतविक्षतानि अकरोत्। '''
+पाठ्यपुटस्य संरक्षणार्थं सम्पादनावकाशः पिहितः । अनामिकानाम् उपयोगकाले कदाचित् एवं सम्भवति ।",
+'edit_form_incomplete' => "'''सम्पादनस्य कतिचनांशाः वितारकं न प्राप्ताः ; सम्पादनं  द्विवरं परिशीलयतु । ते सम्पादनानि अनाहतानि, पुनः यतताम्  '''",
 'editing' => '$1 सम्पाद्यते',
+'creating' => '$1 सर्जनम्',
 'editingsection' => '$1 सम्पादनम् (विभागः)',
 'editingcomment' => '$1 संपादनम् (विभागः)',
 'editconflict' => 'सम्पादनयोः/सम्पादनानाम् अन्तर्विरोधः : $1',
+'explainconflict' => 'ते सम्पादनावसरे कोपि अन्यः परिवर्तितवान् । उपरितनलेखस्य क्षेत्रं सद्यः विद्यमानपुटयुक्तमस्ति । ते परिवर्तनम् अधः लेखक्षेत्रे दृश्यते । विद्यमानलेखैः सह ते परिवर्ताननि विलीनयतु । यदा संरक्षणप्रयत्नः क्रियते तदा केवलम् उपरिपठ्यभागः एव सुरक्षितं भवति ।',
 'yourtext' => 'भवतः पाठः',
 'storedversion' => 'रक्षिता आवृत्तिः',
 'nonunicodebrowser' => "'''पूर्वसूचना: भवतः विचरकं यूनीकोड्-अनुकूलम् नास्ति।'''
 भवान् सुरक्षिततया सम्पादनं करोतु इत्येतदर्थं एका युक्तिः कृताऽस्ति: आस्की-इतराणि अक्षराणि सम्पादनपिटके षौडशिक(hexadecimal) कूटेषु द्रक्ष्यन्ते।",
+'editingold' => "''' पूर्वसूचना : कालातीतपुटस्य सम्पादनं करोति  ''' यदि एतत् रक्षितुं यतते परिवर्तनं नैव रक्ष्यते ।",
 'yourdiff' => 'भेदाः',
 'copyrightwarning' => "कृपया संस्मर्तव्यं यत् {{SITENAME}} इत्येतद् प्रति कृतानि सर्वाणि योगदानानि $2 इत्यस्य प्रतिबंधांतर्गतानि सन्ति (अधिकाय ज्ञानाय $1 इत्येतद् पश्यतु)।
 
@@ -938,12 +991,30 @@ $2
 भवान् एतदपि प्रमाणीकरोति यत् एतद् भवता स्वतः लिखितमस्ति अथवा कस्माच्चत् जनार्पितात् वा मुक्तात् वा स्रोतसः प्रतिलिपीकृतमस्ति।
 
 '''प्रतिलिप्यधिकारयुतान् लेखान्, अनुज्ञां विना, माऽत्र प्रददातु!'''",
-'longpageerror' => "'''त्रुटिः: भवता प्रदत्तः पाठः $1 किलोबैटमितः दीर्घः, अतः एषः अधिकतमानुज्ञातात् $2 मितात् दीर्घतरः अस्ति। एषः रक्षितुं न शक्यते।'''",
+'copyrightwarning2' => "कृपया संस्मर्तव्यं यत् {{SITENAME}} इत्येतद् प्रति कृतानि सर्वाणि योगदानानि  इत्यस्य प्रतिबंधांतर्गतानि सन्ति (अधिकाय ज्ञानाय $1 इत्येतद् पश्यतु)।
+
+यदि भवान् स्वकीयानि लिखितानि परिवर्तमन्तश्च, पुनः वितर्यमन्तश्च न द्रष्टुमिच्छति तदा मा कृपया माऽत्र योगदानं करोतु। <br />
+
+भवान् एतदपि प्रमाणीकरोति यत् एतद् भवता स्वतः लिखितमस्ति अथवा कस्माच्चत् जनार्पितात् वा मुक्तात् वा स्रोतसः प्रतिलिपीकृतमस्ति।
+
+'''प्रतिलिप्यधिकारयुतान् लेखान्, अनुज्ञां विना, माऽत्र प्रददातु!'''",
+'longpageerror' => "रुटिः: भवता प्रदत्तः पाठः {{PLURAL:}} $1 किलोबैटमितः दीर्घः, अतः एषः अधिकतमानुज्ञातात् $2 मितात् दीर्घतरः अस्ति। एषः रक्षितुं न शक्यते।'''",
+'readonlywarning' => "पूर्वसूचना ''' निर्वहणार्थं पाठः पिहितः । अधुना भवान् सम्पादनं रक्षितुं नैव शक्नोति । पाठसञ्चिकायां संश्लेष्य कार्यफलं रक्षतु । एतद्विवरणं प्रतिबन्धकः प्रशासकः विरतरि ।$1",
+'protectedpagewarning' => "'''पूर्वसूचना ''' प्रशासकपदयुक्ताः योजकाः एव सम्पादनं कर्तुमर्हन्ति । अतः एतत्पुटं सुरक्षितम् । निदेशार्थम् अधः जघन्यप्रवेशः सूचितः ।",
+'semiprotectedpagewarning' => "'''सूचना ''' पञ्जीकृतयोजकानां  उपयोगार्थ केवलम् एतत्पुटम् अभिरक्षितम् । जघन्यप्रवेशस्य सूचना आनुकूल्यार्थम् अधोनिदेशिता ।",
+'cascadeprotectedwarning' => "'''पूर्वसूचना ''' प्रशासकसौकर्ययुक्तानां योजकानाम् सम्पादनार्थम् एतत् पुटम् अभिरक्षितमस्ति । यतः अधोनिदेशितनिर्झरे एतदन्तर्गतम् । {{PLURAL:$1|page|pages}}:",
+'titleprotectedwarning' => "'''पूर्वसूचना  [[Special:ListGroupRights|specific rights]] जनानां सर्जनार्थम् एतत्पुटम् अभिरक्षितम् । '''",
 'templatesused' => 'अस्मिन् पृष्ठे प्रयुक्तानि {{PLURAL:$1|फलकम्|फलकानि}}:',
 'templatesusedpreview' => 'अस्मिन् प्राग्दृश्ये प्रयुक्ताः {{PLURAL:$1|बिंबधराः |बिंबधराः}}:',
+'templatesusedsection' => '{{PLURAL:$1|Template|Templates}} अस्मिन् विभागे उपयुक्तम् ।',
 'template-protected' => '(संरक्षितम्)',
 'template-semiprotected' => '(अर्धसंरक्षितम्)',
 'hiddencategories' => 'इदं पृष्ठं {{PLURAL:$1|1 निगूढे वर्गे |$1 निगूढेषु वर्गेषु}} अन्यतमं विद्यते :',
+'nocreatetitle' => 'पुटनिर्माणं नियतम् ।',
+'nocreatetext' => '{{SITENAME}} नूतनपुटनिर्माणस्य क्षमता नियता । वर्तमानापुटानां सम्पादनार्थं निर्गच्छतु । अथवा [[Special:UserLogin|log in or create an account]].',
+'nocreate-loggedin' => 'नूतनपुटनिर्मार्थम् अनुमतिः नास्ति ।',
+'sectioneditnotsupported-title' => 'विभागसम्पादनं न पोषितम् ।',
+'sectioneditnotsupported-text' => 'अस्मिन् पुटे विभागसम्पादनण् न पोषितम् ।',
 'permissionserrors' => 'अनुज्ञा-विभ्रमाः',
 'permissionserrorstext' => 'भवान् तत् कर्तुं अनुज्ञां न धारयति {{PLURAL:$1|अधोऽङ्कितात् कारणात् |अधोऽङ्कितेभ्यः कारणेभ्यः:}}',
 'permissionserrorstext-withaction' => 'भवान् $2 इत्येतदर्थम् अनुमतः नास्ति, यतः {{PLURAL:$1|कारणम्|कारणानि}}:',
@@ -961,6 +1032,7 @@ $2
 'edit-no-change' => 'भवतः सम्पादनम् उपेक्षितम्, यतो हि भवता पाठे न किमपि परिवर्तनं कृतम्।',
 'edit-already-exists' => 'नूतनं पृष्ठं स्रष्टुं नापारयत्।
 इदं पूर्वे एव विद्यते।',
+'defaultmessagetext' => 'सन्देशपाठं स्थिरयतु ।',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''प्रबोधः :''' अस्मिन् पृष्ठे प्रभूतानि जटिलानि पार्सर्-फ़ंक्शन्-आह्वानानि सन्ति।
@@ -975,6 +1047,13 @@ $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' => 'विस्तारगाहातिक्रान्तपुटम् ।',
+'parser-unstrip-loop-warning' => 'अपट्टरन्धः दृष्टः ।',
+'parser-unstrip-recursion-limit' => 'अपट्टपुनरवतरणमितिः अतिक्रान्ता ।$1',
+'converter-manual-rule-error' => 'मानवीये भाषापरिवर्तने दोषः दृष्टः ।',
 
 # "Undo" feature
 'undo-success' => 'सम्पादनमिदं विपरीतीकर्तुं शक्यते।
@@ -1003,6 +1082,9 @@ $2
 'last' => 'पूर्वतनम्',
 'page_first' => 'प्रथमम्',
 'page_last' => 'अन्तिमम्',
+'histlegend' => 'भेदस्य चयनम्: आवृत्तिभेदस्य दर्शनाय अग्रे प्रदत्ता रेडियोमञ्जूषा नुद्यताम्, एण्टर्-कुड्मलं नुद्यताम्, अधः दत्तं कुड्मलं वा नुद्यताम् । <br />
+इतिहासः: (सद्योजातम्) = नूतनासु आवृत्तिषु भेदः, 
+(पूर्वतनम्) = पूर्वतनासु आवृत्तिषु भेदः, (लघु) = लघु परिवर्तनम्',
 'history-fieldset-title' => 'सुगमनस्य(ब्राउस् इत्यस्य) इतिहासः',
 'history-show-deleted' => 'केवलम् विलोपित',
 'histfirst' => 'पुरातनतमम्',
@@ -1023,15 +1105,47 @@ $2
 'rev-deleted-user' => '(प्रयोक्तृनाम अपाकृतमस्ति)',
 'rev-deleted-event' => '(अभिलेखन-क्रिया अपाकृताऽस्ति)',
 'rev-deleted-user-contribs' => '[प्रयोक्तृनाम अथवा आइपीसंकेतः अपाकृतः - सम्पादनं योगदानेभ्यः निगूढमस्ति]',
+'rev-deleted-text-permission' => 'अस्य पुटस्य पुनरवतरणम् अपमार्जितम् । विवरणम् अत्र प्राप्यते  । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
+'rev-deleted-text-unhide' => 'अस्य पुटस्य पुनरवतरणम् अपमार्जितम् । विवरणम् अत्र प्राप्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
+You can still [$1 view this revision]',
+'rev-suppressed-text-unhide' => "अस्य पुटस्य पुनरवतरणं ''' निषिद्धम् ''' यदि अनुवर्तनमिच्छति तर्हि विवरणम् अत्र प्राप्यते । [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
+You can still [$1 view this revision]",
+'rev-deleted-text-view' => 'एतस्मात् अन्तरतः किञ्चिदवतरणं परिमार्जितम् । एतदन्तरं दृष्टुं शक्नुवन्ति । विवरणम् [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाने की लॉग]',
+'rev-suppressed-text-view' => 'अस्मिन्नन्तरे किञ्चिदवतरणं सङ्गुपतम् । तदन्तरम् अत्र दृष्टुं शक्नुवन्ति । [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].',
+'rev-deleted-no-diff' => 'एतत् दृष्टुं नैव शक्यते यतः पुनरावर्तनं परिमार्जितम् । विवरणम् अत्र प्राप्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
+'rev-suppressed-no-diff' => 'एतदन्तरं दृष्टुं नैव शक्यते यतः अत्र किञ्चिदवतरणं परिमार्जितम् ।',
+'rev-deleted-unhide-diff' => 'अस्य पुटस्य पुनरवतरणम् अपमार्जितम् । विवरणम् अत्र प्राप्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].
+You can still [$1 view this revision]',
+'rev-suppressed-unhide-diff' => "अस्य पुटस्य पुनरवतरणं ''' निषिद्धम् ''' यदि अनुवर्तनमिच्छति तर्हि विवरणम् अत्र प्राप्यते । [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].
+You can still [$1 view this revision]",
+'rev-deleted-diff-view' => 'एतस्मात् अन्तरतः किञ्चिदवतरणं परिमार्जितम् । एतदन्तरं दृष्टुं शक्नुवन्ति । विवरणम् [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाने की लॉग]',
+'rev-suppressed-diff-view' => 'अस्मिन्नन्तरे किञ्चिदवतरणं सङ्गुपतम् । तदन्तरम् अत्र दृष्टुं शक्नुवन्ति । [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].',
 'rev-delundel' => 'दर्श्यन्ताम्/गोप्यन्ताम्',
 'rev-showdeleted' => 'दर्श्यताम्',
+'revisiondelete' => 'अवतरणं परिमार्जयतु/पुनस्थापयतु',
 'revdelete-nooldid-title' => 'लक्ष्यरूपा आवृत्तिः अमान्याऽस्ति।',
+'revdelete-nooldid-text' => 'एतत्कार्यं कर्तुं भवतः अवतरणं न दत्तम् । अथवा भवता दत्तावतरणस्य अस्तित्वं नास्ति । अथवा सद्यः अवतरणस्य सङ्गोपनं कुर्वन् अस्ति ।',
 'revdelete-nologtype-title' => 'अभिलेखस्य प्रकारः न प्रदत्तः',
 'revdelete-nologtype-text' => 'अस्यै क्रियायै भवता न कोऽपि अभिलेखप्रकारः निर्दिष्टः।',
 'revdelete-nologid-title' => 'अमान्या अभिलेख-प्रविष्टिः',
+'revdelete-nologid-text' => 'एतत् कार्यं साधयितुं भवान् प्रवेशलक्ष्यं न स्पष्टीकृतवान् अथवा प्रवेशः अस्तित्वे नास्ति ।',
 'revdelete-no-file' => 'निर्दिष्टा सञ्चिका न विद्यते ।',
 'revdelete-show-file-confirm' => '$2 तः $3 मध्ये "<nowiki>$1</nowiki>" इति सञ्चिकायाः निरस्तं परिष्करणं भवान् नूनं द्रष्टुम् इच्छति ?',
 'revdelete-show-file-submit' => 'आम्',
+'revdelete-selected' => "'''{{PLURAL:$2|Selected revision|Selected revisions}} of [[:$1]]:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Selected log event|Selected log events}}:'''",
+'revdelete-text' => "'''परिमार्जितानि अवतरणानि पुटेतिहासे अद्यापि दृश्यन्ते । तस्य कश्चन भागः सार्वजनिकः न भवति । '''
+{{SITENAME}} इत्यस्य अन्यप्रशसासकः गुप्तसामग्रीः प्राप्नुवन्ति । अपि च अन्तरापुटेन अस्य अपरिमार्जनं कर्तुं शक्नुवन्ति । यावत् अतिरिक्तप्रतिबन्धकाः न स्थापिताः ।",
+'revdelete-confirm' => 'भवान् एतत् कार्यं करोति इति दढयतु । भवान् अस्य परिणामं जानाति । [[{{MediaWiki:Policy-url}}|the policy]] भवान् एतदनुसारं करोति ।',
+'revdelete-suppress-text' => 'अधोनिदेशितपरिस्थितिषु केवलं निग्रहः कार्यः । 
+* अवमाननीयाः विषयाः ।
+* अप्रधानाः वैयक्तिकविषयाः
+* गृहसङ्केतः, दूरवाणीसङ्ख्या, सामाजिकसुरक्षासङ्ख्या, इत्यादयः ।',
+'revdelete-legend' => 'दृश्यप्रतिबन्धं निश्चिनोतु ।',
+'revdelete-hide-text' => 'अवतरणस्य पाठं गोपयतु ।',
+'revdelete-hide-image' => 'सञ्चिकाधेयं गोपयतु ।',
+'revdelete-hide-name' => 'प्रक्रियां लक्ष्यं च गोपयतु ।',
+'revdelete-hide-comment' => 'सम्पादनसारं गोपयतु ।',
 'revdelete-hide-user' => 'सम्पादकस्य योजकनाम/आइपिसंकेतः गोप्यताम्।',
 'revdelete-hide-restricted' => 'प्रबन्धकेभ्यः अन्येभ्यश्च समंकं गोपयतु।',
 'revdelete-radio-same' => 'मा परिवर्तयतु।',
@@ -1041,28 +1155,78 @@ $2
 'revdelete-unsuppress' => 'प्रत्यानीताऽऽवृत्तिभ्यः  वर्जनाः अपाकरोतु।',
 'revdelete-log' => 'कारणम् :',
 'revdelete-submit' => '{{PLURAL:$1|चितायां आवृत्त्यां|चितासु आवृत्तिषु}} अनुप्रयोजयतु।',
+'revdelete-success' => 'अवतरणदृश्यता साफल्येन उन्नतीकृता ।',
+'revdelete-failure' => 'अवतरणदृश्यता उन्नतीकरणं न शक्यते ।$1',
+'logdelete-success' => 'नामाङ्कनदृश्यता साफल्येन योजिता ।',
+'logdelete-failure' => 'नामाभिलेखदृश्यता सपला नाभवत् । $1',
 'revdel-restore' => 'दृष्टिविषयः परिवर्त्यताम्',
 'revdel-restore-deleted' => 'अपास्तानि संस्करणानि',
 'revdel-restore-visible' => 'दृष्टिगोचराणि संस्करणानि',
 'pagehist' => 'पृष्ठस्य इतिहासः',
+'deletedhist' => 'परिमार्जितेतिहासः ।',
+'revdelete-hide-current' => '$2 $1 दिनाङ्कितस्य गोपने दोषः । एतत् प्रकृतावतरणम्, एतत् न गोपनीयम् ।',
+'revdelete-show-no-access' => '$2, $1: दिनाङ्कितस्य दर्शने दोषः । एतत् पञ्जीकृतमिति अङ्कितम् । एतत् प्राप्तुं नैव शक्नोति ।',
+'revdelete-modify-no-access' => ' $2, $1 दिनाङ्कितं परिवर्तने दोषः । एतत् निर्बन्धितमिति अङ्कितम् । एतत् प्राप्तुं नैव शक्नोति ।',
+'revdelete-modify-missing' => '$1 दिनाङ्कितं परिवर्तने दोषः । मूलपाठात् विहीनम् एतत् ।',
+'revdelete-no-change' => "'''पूर्वसूचना ''' $2, $1 दिनाङ्किताः पूर्वमेव दृश्यतासंयोजनम् आभ्यर्थिताः ।",
+'revdelete-concurrent-change' => '$2, $1: दिनाङ्कितदेषपरिमार्जनानि । अस्य स्तरः केनचित् परिवर्तितं यत् भवता परिवर्तितुं प्रयत्नः कृतः । प्रवेशं परिशीलयतु ।',
+'revdelete-only-restricted' => '$2, $1: दिनाङ्कितस्य गोपने दोषाः। अन्यदृश्यविकल्पानां चयनेन विना एतत् निग्रहितुं नैव शक्नोति ।',
 'revdelete-reason-dropdown' => '*परित्यागाय समानकारणाः
 ** प्रतिलिपिअधिकारअतिक्रम
 ** अयोग्यवैयक्तिकविज्ञप्ति',
 'revdelete-otherreason' => 'अन्यत्/सङ्कलितं कारणम् :',
 'revdelete-reasonotherlist' => 'अन्यानि कारणानि',
 'revdelete-edit-reasonlist' => 'सम्पादनस्य अपाकरणाय कारणानि',
+'revdelete-offender' => 'अवतरणकर्ता ।',
+
+# Suppression log
+'suppressionlog' => 'निग्रहनामाभिलेखः ।',
+'suppressionlogtext' => 'अधोनिदेशितप्रशासकैः सङ्गुप्तस्य विभागस्य निष्कासितपुटानां सूची ।
+निषिद्धपिहितपुटानि  [[Special:BlockList|block list]] पश्यतु ।',
 
 # History merging
+'mergehistory' => 'संलीनपुटेतिहासाः ।',
+'mergehistory-header' => 'एतत्पुटं कस्यचित् स्रोतपुटस्य इतिहासस्य संयोजनार्थमस्ति ।
+एतत्परिवर्तनं पूर्वतनपुटैः नैरन्तर्यं रक्षति इति दृढयतु ।',
+'mergehistory-box' => 'पुटद्वयस्य अवतरणं व्यलीयताम् ।',
+'mergehistory-from' => 'मूलपुटम् ।',
+'mergehistory-into' => 'लक्षितपुटम् ।',
+'mergehistory-list' => 'विलीनयोग्यसम्पादनस्य इतिहासः ।',
+'mergehistory-merge' => '[[:$1]] इत्यस्य निम्नावतरणं । [[:$2]] इत्यनेन संयोजयितुं शक्यते । निर्दिष्टकाले सर्जितानि संयोजयितुं रेडियोपिञ्जस्तम्भम् उपयोजयतु । 
+सञ्चलनस्य अनुबन्धाः स्तम्भमेतं पुनःस्थापयति ।',
+'mergehistory-go' => 'विलीनयोग्यसम्पादनानि दर्शयतु ।',
+'mergehistory-submit' => 'अवतरणं योजयतु ।',
+'mergehistory-empty' => 'अवतरणानि संयोजयितुं न शक्यते ।',
+'mergehistory-success' => '$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].',
+'mergehistory-fail' => 'इतिहासविलीनता नैव शक्यते । पुटं कालं व्याप्तिं च परिशीलयतु ।',
+'mergehistory-no-source' => 'पूलपुटं $1 अस्तित्वं नास्ति ।',
+'mergehistory-no-destination' => 'लक्षितपुटं $1 अस्तित्वे नास्ति ।',
+'mergehistory-invalid-source' => 'मूलपुटस्य मान्यशीर्षिका स्यात् ।',
+'mergehistory-invalid-destination' => 'लक्षितपुटं मानितशीर्षिकायुतं भवेत् ।',
+'mergehistory-autocomment' => 'लीनं [[:$1]] into [[:$2]]',
+'mergehistory-comment' => 'लीनं [[:$1]]    [[:$2]] : $3',
+'mergehistory-same-destination' => 'मूलपुटं लक्षितपुटं च समानं न भवेत् ।',
 'mergehistory-reason' => 'कारणम् :',
 
 # Merge log
+'mergelog' => 'नामाभिलेखं योजयतु ।',
+'pagemerge-logentry' => '[[$1]]  तु [[$2]] मध्ये विलीनम् (अवतरणं $3 पर्यन्तम् ) ।',
 'revertmerge' => 'पृथक्क्रियताम्',
+'mergelogpagetext' => 'अतिनूतनविलीनस्य आवली अधो दत्ता यस्य इतिहासः अन्यस्मिन् अस्ति ।',
 
 # Diffs
 'history-title' => '"$1" इत्येतस्य आवर्तनेतिहासः :',
+'difference-title' => '"$1" इत्यस्य अवतरणमध्ये व्यत्यासः ।',
+'difference-title-multipage' => '"$1" तथा "$2" पुटयोः मध्ये व्यत्यासः ।',
+'difference-multipage' => 'पुटेषु व्यत्यासः ।',
 'lineno' => 'पंक्तिः $1:',
 'compareselectedversions' => 'चितानाम् आवृत्तीनां तोलनं क्रियताम्',
+'showhideselectedversions' => 'चितावतरणानि दर्शयतु/गोपयतु ।',
 'editundo' => 'निष्क्रियताम्',
+'diff-multi' => '({{PLURAL:$2|योजकेन|$2 योजकैः}} कृता {{PLURAL:$1|मध्यमा आवृत्तिः|$1 मध्यमा आवृत्तयः}} न दर्शिताः ।)',
+'diff-multi-manyusers' => '({{PLURAL:$2|योजकेन|$2 योजकैः}} कृता {{PLURAL:$1|मध्यमा आवृत्तिः|$1 मध्यमा आवृत्तयः}} न दर्शिताः ।)',
+'difference-missing-revision' => '{{PLURAL:$2|One revision|$2 पुनरावृत्तेः }} व्यत्यासः ($1) {{PLURAL:$2|was|were}} न दृष्टः ।
+कारणम् अत्र दृश्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 
 # Search results
 'searchresults' => 'अन्वेषणस्य फलितानि',
@@ -1070,7 +1234,10 @@ $2
 'searchresulttext' => '{{SITENAME}} इत्यस्मिन् अन्वेषणे सहाय्यार्थम् [[{{MediaWiki:Helppage}}|{{int:help}}]] इत्येतत् पश्यतु ।',
 'searchsubtitle' => 'भवान् \'\'\'[[:$1]]\'\'\'([[Special:Prefixindex/$1|सर्वाणि "$1" इत्यस्माद् आरभमन्तः पृष्ठाणि]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|सर्वाणि "$1" इत्येतत्प्रति संबद्धानि पृष्ठाणि]]) इत्यस्य कृते अन्विष्टवान्।',
 'searchsubtitleinvalid' => "भवता '''$1''' इत्यस्य कृते अन्वेषणं कृतम्",
+'toomanymatches' => 'अत्यधिकाः मेलाः प्रत्यागताः । अन्यप्रश्नेन यतताम् ।',
+'titlematches' => 'पुटशीर्षिकामेलाः ।',
 'notitlematches' => 'न कस्यापि पृष्ठस्य शीर्षकम् अस्य समम्।',
+'textmatches' => 'पुटपाठस्य मेलाः',
 'notextmatches' => 'न कस्यापि पृष्ठस्य पाठः अस्य सममस्ति',
 'prevn' => 'प्राक्तनानि {{PLURAL:$1|$1}}',
 'nextn' => 'अग्रिमाणि {{PLURAL:$1|$1}}',
@@ -1078,8 +1245,11 @@ $2
 'nextn-title' => 'प्राक्तन-{{PLURAL:$1|फलितम्| फलितानि}}',
 'shown-title' => 'प्रत्येकस्मिन् पृष्ठे $1 {{PLURAL:$1|फलितम्|फलितानि}} दर्श्यताम्',
 'viewprevnext' => 'दर्श्यताम् ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'अन्वेषणस्य विकल्पाः ।',
 'searchmenu-exists' => 'अस्मिन् विकिमध्ये "[[:$1]]"नामकं पृष्ठं विद्यते।',
 'searchmenu-new' => "'''अस्यां विक्यां \"[[:\$1]]\" इति पृष्ठं सृज्यताम्!'''",
+'searchhelp-url' => 'Help: साहाय्यम् : आधेयाः ।',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|एतदुपसर्गयुक्तपुटं पश्यतु ]]',
 'searchprofile-articles' => 'आन्तर्यम्',
 'searchprofile-project' => 'सहायता प्रकल्पपृष्ठानि च',
 'searchprofile-images' => 'बहुमाध्यमः',
@@ -1092,6 +1262,7 @@ $2
 'searchprofile-advanced-tooltip' => 'विशेषनामस्थानेषु अन्विष्यताम्',
 'search-result-size' => '$1 ({{PLURAL:$2|1 शब्दः|$2 शब्दाः}})',
 'search-result-category-size' => '{{PLURAL:$1|1 सदस्यः|$1 सदस्याः}} ({{PLURAL:$2|1 उपवर्गः|$2 उपर्गाः}}, {{PLURAL:$3|1 सञ्चिका|$3 सञ्चिकाः}})',
+'search-result-score' => 'सम्बन्धः $1% ।',
 'search-redirect' => '($1 इत्यत्र अनुप्रेषितम्)',
 'search-section' => '(विभागः $1)',
 'search-suggest' => 'किं भवतः आशयः एवमस्ति : $1',
@@ -1100,8 +1271,13 @@ $2
 'search-interwiki-more' => '(अधिकानि)',
 'search-mwsuggest-enabled' => 'उपक्षेपेभ्यः सह',
 'search-mwsuggest-disabled' => 'नात्र उपक्षेपाः',
+'search-relatedarticle' => 'सम्बद्धानि ।',
+'mwsuggest-disable' => 'निष्क्रियाः AJAX सूचनाः ।',
+'searcheverything-enable' => 'सर्वनामावकाशे अन्विषतु ।',
 'searchrelated' => 'सम्बद्धानि',
 'searchall' => 'सर्वाणि',
+'showingresults' => "निम्नगतक्रमाङ्कस्य '''$2''' तः आरभ्य अधिकतमं परिणामः'''$1''' {{PLURAL:$1| दर्शितः}}।",
+'showingresultsnum' => "निम्नगतक्रमाङ्क'''$2'''तः आरभ्य अधिकतमः '''$3''' परिणामः {{PLURAL:$3|दर्शितः}}।",
 'showingresultsheader' => "'''$4''' इत्येतस्य {{PLURAL:$5|'''$3'''स्य '''$1'''  फलितम्|'''$3'''स्य '''$1 - $2'''  फलितानि}}",
 'nonefound' => "'''सूचना''': स्वतः अत्र केषुचिदेव नामाकाशेषु अन्वेषणं क्रियते।
 
@@ -1125,41 +1301,62 @@ $2
 'qbsettings-none' => 'नास्ति',
 'qbsettings-fixedleft' => 'बामे स्थापितः',
 'qbsettings-fixedright' => 'दक्षिणे स्थापितः',
+'qbsettings-floatingleft' => 'वामप्लवनम् ।',
+'qbsettings-floatingright' => 'दक्षिणे प्लवनम् ।',
+'qbsettings-directionality' => 'निश्चितम् । ते भाषालिप्याः दिशात्मकतानुसारं भवति ।',
 
 # Preferences page
 'preferences' => 'इष्टतमानि',
 'mypreferences' => 'मम इष्टतमानि',
 'prefs-edits' => 'सम्पादनानां सख्याः',
 'prefsnologin' => 'नैव प्रविष्ट',
+'prefsnologintext' => 'वरीयतां परिवर्तयितुं भवता <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}}नामाभिलेखः]</span> करणियः।',
 'changepassword' => 'कूटशब्दः परिवर्त्यताम्',
 'prefs-skin' => 'त्वक्',
 'skin-preview' => 'प्राग्दृश्यम्',
 'datedefault' => 'वरीयांसि नास्ति',
+'prefs-beta' => 'आवर्णलक्षणानि ।',
 'prefs-datetime' => 'दिनांक तथा समय',
+'prefs-labs' => 'प्रयोगशालालक्षणानि ।',
+'prefs-user-pages' => 'योजकपुटानि ।',
 'prefs-personal' => 'योजकः व्यक्तिरेखा',
 'prefs-rc' => 'सद्योजातानि परिवर्तनानि',
 'prefs-watchlist' => 'दृष्टि सूची',
 'prefs-watchlist-days' => 'दृष्टि सूची दर्शनार्थे  दिवसानि',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'अधिकतमानि $1 {{PLURAL:$1|दिनानि}}',
+'prefs-watchlist-edits' => 'विस्तृतावलोकनावल्यां प्रदर्शयितुम् अत्यधिकपरिवर्तनानि ।',
 'prefs-watchlist-edits-max' => 'अधिकतम संख्या: १०००',
+'prefs-watchlist-token' => 'अवलोकनावल्याः प्रतीकः ।',
 'prefs-misc' => 'विविधः',
 'prefs-resetpass' => 'कूटशब्दः परिवर्त्यताम्',
+'prefs-changeemail' => 'विद्युन्मानपत्रसङ्केतं परिवर्तयतु ।',
+'prefs-setemail' => 'विद्युन्मानपत्रसङ्केतं योजयतु ।',
 'prefs-email' => 'इमेल वैकल्पिकाः',
 'prefs-rendering' => 'स्वरुपः',
 'saveprefs' => 'संरक्ष्यताम्',
 'resetprefs' => 'असंरक्षितानि परिवर्तनानि विलुप्यन्ताम्',
 'restoreprefs' => 'समग्राः व्यवस्थादय व्यवस्थानुसारं पुनः संरक्ष्यताम्',
 'prefs-editing' => 'सम्पादनम्',
+'prefs-edit-boxsize' => 'सम्पादनकोष्ठस्य आकारः ।',
 'rows' => 'पंक्ति',
 'columns' => 'अध: पंक्त्याः',
 'searchresultshead' => 'अन्वेषणम्',
 'resultsperpage' => 'प्रति पृष्ट हिट्स:',
+'stub-threshold' => '<a href="#" class="stub">आधारानुबन्धानां </a>अधिकतमाकारः ।',
 'stub-threshold-disabled' => 'निष्क्रियः',
 'recentchangesdays' => 'दिवसानि पर्यन्तो सद्यावधि-परिवर्तनानि दृश्यतु:',
 'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिवसः|दिवसानि}}',
 'recentchangescount' => 'सम्पादन संख्यकानि व्यवस्थानुसारेण दृश्यतु:',
+'prefs-help-recentchangescount' => 'अत्र सद्यः परिवर्तनानि, पुटेतिहासाः, प्रवेशाः च अन्तर्गताः ।',
+'prefs-help-watchlist-token' => 'अत्र रहस्यकुञ्चिकया पूरणेन भवतः नीरीक्षावल्यां RSS पूरितं भवति । रहस्यकुञ्चिकां यः जानाति तेन भवतः निरीक्षावली दृष्टुं शक्यते । अतः कृपया सुरक्षमौल्यं चिनोतु । अत्र यादृच्छया निर्मितं मौल्यं भवान्  $1 द्वारा पश्यति ।',
+'savedprefs' => 'आद्यताः संरक्षिताः ।',
 'timezonelegend' => 'समय मण्डल:',
 'localtime' => 'स्थानीय समय:',
+'timezoneuseserverdefault' => 'विकिनिश्चितं ($1) उपयुज्यताम् ।',
+'timezoneuseoffset' => 'अन्ये (समयान्तरं निर्दिशतु )',
+'timezoneoffset' => 'समयान्तरम् ¹',
+'servertime' => 'वितारकसमयः ।',
+'guesstimezone' => 'जालदर्शिकातः पूरयतु ।',
 'timezoneregion-africa' => 'कालद्वीप',
 'timezoneregion-america' => 'अमेरिका',
 'timezoneregion-antarctica' => 'अंटार्कटिका',
@@ -1170,8 +1367,18 @@ $2
 'timezoneregion-europe' => 'यूरोप',
 'timezoneregion-indian' => 'हिंद महासागर',
 'timezoneregion-pacific' => 'प्रशांत महासागर',
+'allowemail' => 'अन्योपयोजकानां विद्युन्मानसङ्केतं निष्कियं करोतु ।',
+'prefs-searchoptions' => 'अन्वेषणविकल्पाः ।',
+'prefs-namespaces' => 'नामाकाशः :',
+'defaultns' => 'अन्यथा एतेषु नामाकाशेषु अन्विषतु ।',
 'default' => 'यदभावे',
 'prefs-files' => 'सञ्चिका',
+'prefs-custom-css' => 'सि.एस्.एस्.रचयतु ।',
+'prefs-custom-js' => 'जावालिपिं रचयतु ।',
+'prefs-common-css-js' => 'सर्वावरणानां कृते विभक्त सि.एस्.एस्./ जावालिपिः ।',
+'prefs-reset-intro' => 'आद्यतानां पुनर्निदेशार्थम् एतत्पुटम् उपयोक्तुं शकोति । एतत् अकृतं न भवति ।',
+'prefs-emailconfirm-label' => 'विद्युन्मानसङ्केतस्य दृढीकरणम् ।',
+'prefs-textboxsize' => 'सम्पादनकोष्ठस्य आकारः ।',
 'youremail' => 'ईपत्रसङ्केतः',
 'username' => 'योजकनामन्:',
 'uid' => 'प्रयोक्तृ-क्रमांकः :',
@@ -1179,6 +1386,8 @@ $2
 'prefs-registration' => 'पंजीकरण कालः:',
 'yourrealname' => 'वास्तविकं नाम:',
 'yourlanguage' => 'भाषा:',
+'yourvariant' => 'भाषासामग्रीणां संस्करणम् ।',
+'prefs-help-variant' => ' विक्यां प्रदर्शितुं भवति ।',
 'yournick' => 'नूतनाः हस्ताक्षराः:',
 'prefs-help-signature' => 'संभाषणपृष्ठगताः संवादाः "<nowiki>~~~~</nowiki>" इति लिखित्वा हस्ताक्षरोपेताः कर्त्तव्याः। एतानि चिह्नानि पृष्ठरक्षणपश्चात् भवतः हस्ताक्षरान् समयमुद्रां च प्रदर्शयिष्यन्ति।',
 'badsig' => 'अमान्याः (त्रुटिपूर्णाः) हि एते अपक्वाः हस्ताक्षराः।
 'gender-unknown' => 'अनिर्दिष्टम्',
 'gender-male' => 'पुरुष',
 'gender-female' => 'स्त्री',
+'prefs-help-gender' => 'वैकल्पिकः : अयं तन्त्रांशः लिङ्गानुसारसम्बोधनस्य उपयोजकः ।',
 'email' => 'विद्युत्पत्रव्यवस्था',
+'prefs-help-realname' => 'निजनामधेयस्य उल्लेखः आवश्यकः नास्ति । 
+यदि ददाति तर्हि अस्य प्रयोगः भवतः योगदानार्थं भवते श्रेयं दातुम् उपयुक्तः भवति ।',
 'prefs-help-email' => 'ईपत्रसङ्केतः अनिवार्यः नास्ति । किन्तु कूटशब्दः विस्मर्यते चेत् तस्य परिवर्तनाय अवश्यकः भवति ।',
 'prefs-help-email-others' => 'अन्ये योजकाः ईपत्रमाध्यमेन भवतः सम्पर्कं यथा कुर्युः तथा भवदीये योजकपृष्ठे सम्भाषणपृष्ठे वा सम्पर्कतन्तुः योजयितुं शक्यः ।
 भवतः सम्पर्कं कृतवद्भिः योजकैः भवदीयः ईपत्रसङ्केतः अभिज्ञातः न भवति ।',
+'prefs-help-email-required' => 'विद्युन्मानपत्रसङ्केतः आवश्यकः ।',
+'prefs-info' => 'मूलसूचनाः ।',
+'prefs-i18n' => 'अन्ताराष्ट्रिकरणम् ।',
 'prefs-signature' => 'हस्ताक्षर',
+'prefs-dateformat' => 'दिनाङ्कस्य प्रारूपः',
+'prefs-timeoffset' => 'समयान्तरम् ।',
+'prefs-advancedediting' => 'उन्नतविकल्पाः',
+'prefs-advancedrc' => 'उन्नतविकल्पाः',
+'prefs-advancedrendering' => 'उन्नतविकल्पाः',
+'prefs-advancedsearchoptions' => 'उन्नतविकल्पाः',
+'prefs-advancedwatchlist' => 'उन्नतविकल्पाः',
+'prefs-displayrc' => 'प्रदर्शनविकल्पाः',
+'prefs-displaysearchoptions' => 'प्रदर्शनविकल्पाः',
+'prefs-displaywatchlist' => 'प्रदर्शनविकल्पाः',
+'prefs-diffs' => 'अन्तरम्',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'प्रयुक्तः विद्युन्मानपत्रसङ्केतः मानितः ।',
+'email-address-validity-invalid' => 'मान्यः विद्युन्मानपत्रसङ्केतः योजनीयः ।',
 
 # User rights
+'userrights' => 'योजकाधिकारस्य प्रबन्धनम् ।',
+'userrights-lookup-user' => 'योजकसमूहं प्रबन्धयतु ।',
+'userrights-user-editname' => 'योजकनाम योजयतु ।',
+'editusergroup' => 'योजकसमूहं सम्पादयतु ।',
+'editinguser' => "'''[[User:$1|$1]]''' $2 इति योजकस्य योजकाधिकारः परिवर्त्यते ।",
+'userrights-editusergroup' => 'योजकसमूहं सम्पादयतु ।',
+'saveusergroups' => 'योजकसमूहं संरक्षतु ।',
+'userrights-groupsmember' => 'अस्य सदस्यः  ।',
+'userrights-groupsmember-auto' => 'अस्य निश्चितसदस्यः ।',
+'userrights-groups-help' => 'अस्य सदस्यस्य समूहसदस्यत्वं परिवर्तयितुं शक्यते । 
+* मञ्जूषा अङ्किता चेत् योजकः अस्य समूहस्य सदस्यः अस्ति ।
+* मञ्जूषा अनङ्किता चेत् योजकः अस्य समूहस्य सदस्यः न 
+* कदाचित् भवता समूहः योजितः चेत् अपनेतुं नैव शक्नोति इति * चिह्नं सूचयति ।',
 'userrights-reason' => 'कारणम् :',
+'userrights-no-interwiki' => 'अन्यविकिषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।',
+'userrights-nodatabase' => '$1 मूलपाठाः न सन्ति अथवा स्थानीयाः ।',
+'userrights-nologin' => '[[Special:UserLogin|log in]] प्रशासकस्थानेन प्रविश्य योजकाधिकारान् निर्देष्टुं शक्नोति ।',
+'userrights-notallowed' => 'योजकाधिकारान् अपनेतुं ते स्थानस्य अनुमतिः नास्ति ।',
+'userrights-changeable-col' => 'परिवर्तनार्हाः समूहाः ।',
+'userrights-unchangeable-col' => 'परिवर्तनार्हाः समूहाः ।',
 
 # Groups
+'group' => 'समूहः :',
 'group-user' => 'योजकः',
+'group-autoconfirmed' => 'स्वदृढितयोजकाः ।',
+'group-bot' => 'स्वयं सक्रियाः ।',
 'group-sysop' => 'प्रबंधकाः',
+'group-bureaucrat' => 'स्वयम् अधिकारिणः ।',
+'group-suppress' => 'अलक्ष्यम् ।',
 'group-all' => '(सर्वे)',
 
 'group-user-member' => '{{GENDER:$1|योजक}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|स्वस्थानदृढितः योजकः}}',
+'group-bot-member' => '{{GENDER:$1|स्वयं सक्रियः}}',
+'group-sysop-member' => '{{GENDER:$1|प्रशासकः}}',
+'group-bureaucrat-member' => '{{GENDER:$1|स्वयम् अधिकारी}}',
+'group-suppress-member' => '{{GENDER:$1|अलक्ष्यम्}}',
 
 'grouppage-user' => '{{ns:project}}:योजक',
+'grouppage-autoconfirmed' => '{{ns:project}}: स्वयंदृढितयोजकाः ।',
+'grouppage-bot' => '{{ns:project}}: स्वयंसक्रियाः।',
 'grouppage-sysop' => '{{ns:project}}:प्रचालकाः',
+'grouppage-bureaucrat' => '{{ns:project}}: स्वयम् अधिकारिणः ।',
+'grouppage-suppress' => '{{ns:project}}: अक्ष्यम् ।',
+
+# Rights
+'right-read' => 'पुटानि पठतु ।',
+'right-edit' => 'पुटसम्पादनं करोतु ।',
+'right-createpage' => 'पुटनिर्माणं करोतु ।(यानि चर्च्यानि न सन्ति)',
+'right-createtalk' => 'चर्च्यपुटानां निर्माणं करोतु ।',
+'right-createaccount' => 'नूतनयोजकस्थानं निर्मातु ।',
+'right-minoredit' => 'सम्पादनं लघुचिह्नया निर्दिशतु ।',
+'right-move' => 'पुटं चालयतु ।',
+'right-move-subpages' => 'उपपुटैः सह पुटं चालयतु ।',
+'right-move-rootuserpages' => 'मूलयोजकपुटानि चालयतु ।',
+'right-movefile' => 'सञ्चिकाः चालयतु ।',
+'right-suppressredirect' => 'पुटचालनावसरे मूलपुटेभ्यः पुनर्निदेशं न सृजतु ।',
+'right-upload' => 'सञ्चिकाः उत्तारयतु ।',
+'right-reupload' => 'स्थितसञ्चिकाः पुनर्लिखतु ।',
+'right-reupload-own' => 'एकेन उत्तारितसञ्चिकाः पुनर्लिखतु ।',
+'right-reupload-shared' => 'विभक्तमाध्यमकोशगतसञ्चिकाः अतिसञ्चरतु ।',
+'right-upload_by_url' => 'अन्तर्जालस्थानात् सञ्चिकाः उत्तारयतु ।',
+'right-purge' => 'दृढतारहितपुटस्य क्षेत्राधारं पुनातु ।',
+'right-autoconfirmed' => 'अल्परक्षितपुटनि सम्पादयतु ।',
+'right-bot' => 'स्वचालितप्रक्रियाः इव उपचारितः भवतु ।',
+'right-nominornewtalk' => 'चर्चापुटानां लघुसम्पादनं न भवतु । नूतनसन्देशान् चोदयतु ।',
+'right-apihighlimits' => 'API प्रश्नेषु उन्नतसीमम् उपयोजयतु ।',
+'right-writeapi' => 'श्वेतं API उपयोगः ।',
+'right-delete' => 'पुटानि परिमार्जयतु ।',
+'right-bigdelete' => 'दीर्घेतिहासयुक्तपुटानि परिमार्जयतु ।',
+'right-deletelogentry' => 'निर्दिष्टनामाभिलेकप्रवेशं परिमार्जयतु अपरिमार्जयतु च ।',
+'right-deleterevision' => 'निर्दिष्टावरतरणस्य पुटानि अपमर्जतु, अनपमर्जतु ।',
+'right-deletedhistory' => ' तत्सम्बद्धपाठैः विनाअपमर्जितेतिहासप्रवेशस्य दर्शनम् ।',
+'right-deletedtext' => 'अपमर्जितावतरणेषु परिवर्तनं, अपमर्जितपाठान् च अवलोकयतु ।',
+'right-browsearchive' => 'अपमर्जितपुटानि अन्विषतु ।',
+'right-undelete' => 'पुटम् अनपमर्जतु ।',
+'right-suppressrevision' => 'प्रशासकेभ्यः सङ्गुप्तावतरणानि पुनरालोक्य पुनरानयतु ।',
+'right-suppressionlog' => 'स्वायत्तनामाबिलेखं पश्यतु ।',
+'right-block' => 'अन्ययोजकान् सम्पादनेन अवरोधतु ।',
+'right-blockemail' => 'योजकस्य विद्युन्मानसन्देशप्रेषणम् अवरोधतु ।',
+'right-hideuser' => 'योजकनाम अवरोधतु । तेन सर्वजनोपयोगात् गोपयतु ।',
+'right-ipblock-exempt' => 'IP अवरोधं मार्गयतु, स्वयम् अवरोधः, निर्दिष्टावरोधः ।',
+'right-proxyunbannable' => 'अन्येषां स्वयंचालितावरोधं परिहरतु ।',
+'right-unblockself' => 'स्वयम् अनवरोधं करोतु ।',
+'right-protect' => 'सुरक्षास्तरान् परिवर्तयतु । सुरक्षितपुटानि सम्पादयतु ।',
+'right-editprotected' => 'सुरक्षितपुटानि सम्पादयतु ।',
+'right-editinterface' => 'योजकमाध्यमं सम्पादयतु ।',
+'right-editusercssjs' => 'अन्ययोजकान् सम्पादयतु । सि.एस्.एस्. जावलालिपिसञ्चिकाः च ।',
+'right-editusercss' => 'अन्ययोजकान् सम्पादयतु सि.एस्.एस्. सञ्चिकाः ।',
+'right-edituserjs' => 'अन्ययोजकान सम्पादयतु जावालिपिसञ्चिकाः ।',
+'right-rollback' => 'अन्तिमयोजकस्य सम्पादनं शीघ्रं प्रचालयतु यः निर्दिष्टपुटं सम्पादितवान् ।',
+'right-markbotedits' => 'प्रतिचालितसम्पादनानि स्वचालितसम्पदनं इव  अङ्कितानिकरोतु ।',
+'right-noratelimit' => 'मूल्यनियत्या प्रभावितं नस्यात् ।',
+'right-import' => 'अन्यविकितः पुटानाम् आयातं करोतु ।',
+'right-importupload' => 'उत्तारितसञ्चिकातः पुटानि आयातानि करोतु ।',
+'right-patrol' => 'अन्येषां सम्पादनम् आरक्षितमिव अङ्कयतु ।',
+'right-autopatrol' => 'कस्यचित् स्वस्य सम्पादनानि आरक्षितमिव स्वयम् अङ्कयतु ।',
+'right-patrolmarks' => 'आरक्षणाङ्कितानां सद्यः परिवर्तनानि अवलोकयतु ।',
+'right-unwatchedpages' => 'अपरीक्षितपुटानाम् आवलीम् अवलोकयतु ।',
+'right-mergehistory' => 'पुटेतिहासं विलीनं करोतु ।',
+'right-userrights' => 'सर्वयोजकाधिकारं सम्पादयतु ।',
+'right-userrights-interwiki' => 'योजकाधिकारान् अन्यविकिषु सम्पादयतु ।',
+'right-siteadmin' => 'पाठमूलस्य निशेधनम् अनिशेधनं च ।',
+'right-override-export-depth' => 'पञ्चस्तरपर्यन्तं संलग्नपुटानि निर्यातानि करोतु ।',
+'right-sendemail' => 'अन्ययोजकेभ्यः विद्युन्मानपत्राणि प्रेषयतु ।',
+'right-passwordreset' => 'निकुञ्चपुनारचितानां विद्युन्मानपत्राणाम् अवलोकनम् ।',
 
 # User rights log
 'rightslog' => 'प्रयोक्तृ-अधिकार-सूचिका',
+'rightslogtext' => 'अयं योजकाधिकारस्य परिवर्तनकुञ्चः ।',
+'rightslogentry' => '$2 - $3 तः $1 सामूहिकसदस्यत्वं परिवर्तितम् ।',
+'rightslogentry-autopromote' => '$2 तः $3 स्वयम् उन्नतीकृतम् ।',
 'rightsnone' => '(कतम)',
 
 # Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'एतत्पुटं पठतु ।',
 'action-edit' => 'इदं पृष्ठं सम्पाद्यताम्',
+'action-createpage' => 'पुटानि सृजतु ।',
+'action-createtalk' => 'चर्चापुटानि सृजतु ।',
+'action-createaccount' => 'नूतनयोजकस्थानं निर्मातु ।',
+'action-minoredit' => 'एतत्सम्पादनं लघु इति अङ्कयतु ।',
+'action-move' => 'एतत्पुटं चालयतु ।',
+'action-move-subpages' => 'एतत्पुटम् अस्य उपपुटानि च चालयतु ।',
+'action-move-rootuserpages' => 'मूलयोजकपुटानि चालयतु ।',
+'action-movefile' => 'एतां सञ्चिकां चालयतु ।',
+'action-upload' => 'एतां सञ्चिकाम् उत्तारयतु ।',
+'action-reupload' => 'स्थितसञ्चिकां पुनर्लिखतु ।',
+'action-reupload-shared' => 'विभक्तकोशे एतां सञ्चिकां पुनर्लिखतु ।',
+'action-upload_by_url' => 'अन्तर्जालस्थानतः एतां सञ्चिकाम् उत्तारयतु ।',
+'action-writeapi' => 'श्वेतं API उपयोगः ।',
+'action-delete' => 'एतत्पुटं अपमर्जयतु ।',
+'action-deleterevision' => 'एतदवतरणम् अपमर्जतु ।',
+'action-deletedhistory' => 'अस्य पुटस्य अपमर्जितेतिहासम् अवलोकयतु ।',
+'action-browsearchive' => 'अपमर्जितपुटानि अन्विषतु ।',
+'action-undelete' => 'एतत्पुटम् अनपमर्जयतु ।',
+'action-suppressrevision' => 'सङ्गुप्तावतरणं पुनःपश्यतु पुनर्नयतु च ।',
+'action-suppressionlog' => 'एतत् स्वायत्तपुटम् अवलोकयतु ।',
+'action-block' => 'अन्ययोजकान् सम्पादनेन अवरोधतु ।',
+'action-protect' => 'अस्य पुटस्य सुरक्षास्तरं परिवर्तयतु ।',
+'action-rollback' => 'अन्तिमयोजकस्य सम्पादनं शीघ्रं प्रचालयतु यः निर्दिष्टपुटं सम्पादितवान् ।',
+'action-import' => 'अन्यविकितः एतत्पुटम् आयातयतु ।',
+'action-importupload' => 'उत्तारितसञ्चिकातः पुटानि आयातानि करोतु ।',
+'action-patrol' => 'अन्येषां सम्पादनम् आरक्षितमिव अङ्कयतु ।',
+'action-autopatrol' => 'भवतः सम्पादनम् आरक्षितम् इति अङ्कयतु ।',
+'action-unwatchedpages' => 'अपरीक्षितपुटानाम् आवलीम् अवलोकयतु ।',
+'action-mergehistory' => 'पुटेतिहासं विलीनं करोतु ।',
+'action-userrights' => 'सर्वयोजकाधिकारं सम्पादयतु ।',
+'action-userrights-interwiki' => 'योजकाधिकारान् अन्यविकिषु सम्पादयतु ।',
+'action-siteadmin' => 'पाठमूलस्य निशेधनम् अनिशेधनं च ।',
+'action-sendemail' => 'विद्युन्मानपत्राणि प्रेषयतु ।',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}',
@@ -1242,16 +1604,21 @@ $2
 'minoreditletter' => '(लघु)',
 'newpageletter' => '(नवीनम्)',
 'boteditletter' => '(बोट्)',
+'number_of_watching_users_pageview' => '[$1 अवलोकयति {{PLURAL:$1|योजकः|योजकाः}}]',
+'rc_categories' => 'वर्गान् नियतीकरोतु ।',
 'rc_categories_any' => 'कश्चित्',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} परिवर्तनपश्चात् ।',
 'newsectionsummary' => '/* $1 */ नवीन विभागः',
 'rc-enhanced-expand' => 'विवरणानि दर्श्यन्ताम् (जावालिपिः अपेक्ष्यते)',
 'rc-enhanced-hide' => 'विवरणानि गोप्यन्ताम्',
+'rc-old-title' => 'मूलरूपेण $1 इति रचितम् ।',
 
 # Recent changes linked
 'recentchangeslinked' => 'पृष्ठसम्बद्धानि परिवर्तनानि',
 'recentchangeslinked-feed' => 'पृष्ठ-सम्बन्धितानि परिवर्तनानि',
 'recentchangeslinked-toolbox' => 'पृष्ठसम्बद्धानि परिवर्तनानि',
 'recentchangeslinked-title' => '"$1" इत्यस्मिन् जातानि परिवर्तनानि',
+'recentchangeslinked-noresult' => 'निर्दिष्टे अवधौ सम्बद्धे पृष्ठे कोपि परिवर्तनं न जातम् ।',
 'recentchangeslinked-summary' => "एषा विशेषपृष्ठसम्बद्धेषु पॄष्ठेषु अथवा वर्गविशेषे अन्तर्भूतेषु पृष्ठेषु सद्योजातानां परिवर्तनानाम् आवलिः।
 
 [[Special:Watchlist|भवतः अवेक्षणसूच्यां]] विद्यमानानि पृष्ठानि '''स्थूलाक्षरैः''' दर्शितानि।",
 # Upload
 'upload' => 'सञ्चिका आरोप्यताम्',
 'uploadbtn' => 'सञ्चिका आरोप्यताम्',
+'reuploaddesc' => 'उत्तारणम् अपकर्षतु उत्तरणप्रपत्रम् आगच्छतु च ।',
+'upload-tryagain' => 'उन्नतीकृतं सञ्चिकाविवरणं समर्पयतु ।',
+'uploadnologin' => 'न प्रविष्टम्',
+'uploadnologintext' => 'सञ्चिकारोपणाय [[Special:UserLogin|अन्तःप्रवेशः]] अपेक्षितः ।',
+'upload_directory_missing' => 'उत्तारणनिदेशनं ($1) नष्टम्, जालवितारकेन सर्जितुं न शक्यते ।',
+'upload_directory_read_only' => 'उत्तारणनिदेशनं ($1) तु जालवितारकेन लेखनयोग्यं नास्ति ।',
+'uploaderror' => 'उत्तरणदोषः ।',
+'upload-recreate-warning' => "''' पूर्वसूचना ''' तन्नामयुक्ता सञ्चिका अपमर्जिता अथवा चालिता ।",
+'uploadtext' => "सञ्चिकाः उत्तर्तुम् अधः सूचितरूपणि उपयोजयतु ।
+To view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].
+
+To include a file in a page, use a link in one of the following forms:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' to use the full version of the file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' to use a 200 pixel wide rendition in a box in the left margin with 'alt text' as description
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' for directly linking to the file without displaying the file",
+'upload-permitted' => 'अनुमतसञ्चिकाभेदाः $1.',
+'upload-preferred' => 'अनुमतसञ्चिकाभेदाः $1.',
+'upload-prohibited' => 'अनुमतसञ्चिकाभेदाः $1.',
+'uploadlog' => 'उत्तरणस्य सूची ।',
 'uploadlogpage' => 'आरोपितानां सूची',
+'uploadlogpagetext' => 'अधः सद्यः काले उत्तारितसञ्चिकानाम् आवली अस्ति ।
+अधिकदृश्यविवरणार्थम् एतत् पश्यतु [[Special:NewFiles|gallery of new files]]',
 'filename' => 'सञ्चिकानाम',
 'filedesc' => 'सारांशः :',
 'fileuploadsummary' => 'संग्रहः :',
+'filereuploadsummary' => 'सञ्चिकापरिवर्तनानि ।',
+'filestatus' => 'प्रतिकृत्यधिकारस्य स्थितिः ।',
 'filesource' => 'मूल:',
 'uploadedfiles' => 'आरोपिताः सञ्चिकाः',
+'ignorewarning' => 'पूर्वसूचनां निर्लक्ष्य सञ्चिकाः कथञ्चित् संरक्षतु ।',
+'ignorewarnings' => 'पूर्वसूचनाः निर्लक्षतु ।',
+'minlength1' => 'सञ्चिकानाम न्यूनतिन्यूनम् एकाक्षरं भवेत् ।',
+'illegalfilename' => 'अस्यां "$1" सञ्चिकानाम्नि सङ्ख्या अस्ति । अत्र सा निषिद्धा । सञ्चिकां पुनः नामाङ्कयतु ।',
+'filename-toolong' => 'सञ्चिकानाम २४०बैट्स्तः अधिकदीर्घं न भवेत् ।',
+'badfilename' => '"$1" इति सञ्चिकानाम परिवर्तितम् ।',
+'filetype-mime-mismatch' => '".$1" इति सञ्चिकाविस्तारः अपमर्जितया MIME ($2) प्रकारस्य सञ्चिका मेलं न करोति ।',
+'filetype-badmime' => 'MIME प्रकारस्य "$1" सञ्चिकाः उत्तारयितुं नार्हन्ति ।',
+'filetype-bad-ie-mime' => 'जालदर्शिकया सूचितं यत् "$1" सञ्चिका अपायकरिणीसञ्चिका इति । अतः एताम् उत्तारयितुं नैव शक्यते ।',
+'filetype-unwanted-type' => "'''\".\$1\"''' काचित् अनपक्षिता सञ्चिका अस्ति । 
+अपेक्षिता सञ्चिका एषा {{PLURAL:\$3|अस्ति}} \$2।",
+'filetype-banned-type' => '\'\'\'".$1"\'\'\'सञ्चिका {{PLURAL:$4|प्रकारस्य }} अनुमतिः नास्ति ।
+प्रकारसञ्चिकायाः{{PLURAL:$3|}} अनुमतिरस्ति  $2।',
+'filetype-missing' => 'अस्याः सञ्चिकायाः विस्तारः नास्ति । (उदाहरणम् ".jpg")।',
+'empty-file' => 'समर्पिता सञ्चिका रिक्ता अस्ति ।',
+'file-too-large' => 'संयोजिता शीर्षिका सुदीर्घा अस्ति ।',
+'filename-tooshort' => 'सञ्चिकानाम अतीव ह्रस्वम् अस्ति ।',
+'filetype-banned' => 'ईदृशी सञ्चिका प्रतिबन्धिता ।',
+'verification-error' => 'सञ्चिकापरीक्षायाम् इयं सञ्चिका अनुत्तीर्णा ।',
+'hookaborted' => 'भवतः संस्करणप्रयत्नः विस्तारेण अपसारितः ।',
+'illegal-filename' => 'सञ्चिकानामलेखनं नानुमतः ।',
+'overwrite' => 'वर्तमानसञ्चिकायाः पुनर्लेखनं नानुमतम् ।',
+'unknown-error' => 'अज्ञातदोषः उपगतः ।',
+'tmp-create-error' => 'तत्कालिकसञ्चिकां सृष्टुं नैव शक्यते ।',
+'tmp-write-error' => 'तात्कालिकसञ्चिकायाः दोषसम्पादनम् ।',
+'large-file' => '$1; इयं सञ्चिका $2. तः अधिका दीर्घा न स्यात् इति सूचितम् ।',
+'largefileserver' => 'इयं सञ्चिका वितारकस्य निदेशनात् अधिका दीर्घा अस्ति ।',
+'emptyfile' => 'उत्तारितसञ्चिका रिक्ता इति भाति । 
+सञिकानामाङ्कनकारणं स्यात् ।
+एतां सञ्चिकाम् उत्तारयितुमिच्छति वा इति परिशीलयतु ।',
+'windows-nonascii-filename' => 'एषा विकि विशेषाक्षरयुक्तं सञ्चिकानाम न अनुमन्यते ।',
+'fileexists' => 'अनेन सञ्चिकानाम्ना काचित् सञ्चिकास्ति । यदि निश्चयेन न जानाति परिवर्तयितुम् इच्छति तर्हि  <strong>[[:$1]]</strong> एतत् परिशीलयतु । : [[$1|thumb]]',
+'filepageexists' => 'अस्याः सञ्चिकायाः विवरणपुटम् तावत् निर्मितम् एव । <strong>[[:$1]]</strong>, अनेन नाम्ना सद्यः कापि सञ्चिका वर्तते  । 
+लिखितसारांशः विवरणपुटे न आगमिष्यति । 
+ते सारांशः तत्रागन्तुं स्वयं सम्पादयतु । [[$1|thumb]]',
+'fileexists-extension' => 'अनेन नाम्ना सदृनामाङ्किता सञ्चिका पूर्वमेव अस्ति । [[$2|thumb]]
+* उत्तर्यमानसञ्चिकायाः नाम  <strong>[[:$1]]</strong>
+* वर्तमानसञिकायाः नाम <strong>[[:$2]]</strong>
+* अन्यनाम चिनोतु ।',
+'fileexists-thumbnail-yes' => "एषा सञ्चिका बृहच्चित्रस्य क्षीणाकारा इति भाति । ''(उङ्गुष्टाकारः)''  [[$1|thumb]]
+<strong>[[:$1]]</strong> सञ्चिकां पश्यतु । 
+यदि परिक्षिता सञ्चिका एतादृशाकरस्य भवति तर्हि उत्तारणस्य आवश्यकता नास्ति ।",
+'file-thumbnail-no' => 'सञ्चिकानाम आरभते <strong>$1</strong>एतस्मात् ।
+न्यूनीकृताकारस्य चित्रम् इति भाति  
+यदि एतच्चित्रं मूलाकारेण अस्ति तर्हि उत्तारयतु अन्यथा न ।',
+'fileexists-forbidden' => 'एदादृशनाम्नः सञ्चिका तावत् पूर्वमेवोपस्थिता । अस्य स्थाने अन्यां नोत्तारयितुं शक्यते । 
+तथापि यदि एतां सञ्चिकाम् उत्तारयितुम् इच्छति तर्हि सञ्चिकायाः नाम परिवर्तयतु ।
+[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'एतस्य नाम्नः सञ्चिका विभक्तभाण्डारे तावत् अस्ति एव । 
+तथापि यदि एतां सञ्चिकाम् उत्तारयितुम् इच्छति तर्हि अस्याः नामपरिवर्तनं करोतु ।
+[[File:$1|thumb|center|$1]]',
+'file-exists-duplicate' => 'एषा सञ्चिका तु {{PLURAL:$1|file|files}}: इत्यस्य प्रतिकृतिः ।',
+'file-deleted-duplicate' => 'अस्याः सञ्चिकायाः ([[:$1]]) सादृश्ययुक्ता सञ्चिकातु अपमर्जिता ।
+एतस्याः उत्तारणात् पूर्वं प्राचीनसञ्चिकायाः इतिहासः अवलोकनीयः ।',
+'uploadwarning' => 'उत्तारणस्य पूर्वसूचना ।',
+'uploadwarning-text' => 'अधो दत्तं सञ्चिकाविवरणं संस्कृत्य पुनः यतताम् ।',
+'savefile' => 'सञ्चिकां संरक्षतु ।',
 'uploadedimage' => '"[[$1]]" इत्येतद् आरोपितमस्ति',
-
+'overwroteimage' => '"[[$1]]" इत्यस्य नूतनावतरणम् उत्तारयतु ।',
+'uploaddisabled' => 'सक्रियम् उत्तारयतु ।',
+'copyuploaddisabled' => 'निष्क्रियतः यु.आर्.एल् तः उत्तारयतु  ।',
+'uploadfromurl-queued' => 'ते उत्तारणम् अनुपङ्कौ अस्ति ।',
+'uploaddisabledtext' => 'उत्तारितसञ्चिकाः निष्क्रियाः ।',
+'php-uploaddisabledtext' => 'PHP मध्ये उत्तारितसञ्चिकाः निष्क्रियाः ।',
+'uploadscripted' => 'HTMLयुक्ताः अथवा लिपिसङ्केतयुक्ताः सञ्चिकाः जालदर्शिकया बाधिताः ।',
+'uploadvirus' => 'अस्यां सञ्चिकायां वैराणुः अस्ति । विवरणम् $1',
+'uploadjava' => 'इयं ZIP सञ्चिका अस्यां जावावर्गस्य सञ्चिकाः सन्ति । 
+जावासञ्चिकाः उत्तरणं निषिद्धम् । यतः अनेन सुरक्षाबन्धाः शिथिलाः भवन्ति ।',
+'upload-source' => 'मूलसञ्चिका ।',
+'sourcefilename' => 'मूलसञ्चिकायाः नाम ।',
+'sourceurl' => 'मूलं URL:',
+'destfilename' => 'लक्षितसञ्चिकायाः नाम ।',
+'upload-maxfilesize' => 'सञ्चिकायाः गरिष्ठाकारः ।$1',
+'upload-description' => 'सञ्चिकाविवरणम् ।',
+'upload-options' => 'उत्तारणविकल्पाः ।',
+'watchthisupload' => 'इमां सञ्चिकाम् अवलोकयतु ।',
+'filewasdeleted' => 'अनेन नाम्ना उत्तारिता काचित् सञ्चिका पूर्वमेव अपमर्जिता ।
+ $1 परिशील्य उत्तरणं पुनः उत्तारयतु ।',
+'filename-bad-prefix' => "यस्याः सञ्चिकायाः उत्तारणं कुर्वाणः अस्ति तस्य नाम '''\"\$1\"''' तः आरभते ।  यत् डिज़िटल् क्यामरा द्वारा दत्तम् अस्ति । 
+अस्याः अधिकज्ञानप्रपकं किमपि अन्यत् नाम योजयतु ।",
+'upload-success-subj' => 'सफलम् उत्तारणम् ।',
+'upload-success-msg' => '[$2] तः उत्तारणं सफलम् । तदत्र अस्ति । [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'उत्तारणसमस्या ।',
+'upload-failure-msg' => '[$2]तः उत्तारणे कापिसमस्या आसीत् । 
+$1',
+'upload-warning-subj' => 'उत्तारणस्य पूर्वसूचना ।',
+'upload-warning-msg' => ' [$2] तः उत्तारणे समस्या आसीत् । अस्याः समस्यायाः परिहारार्थम् अत्र गच्छतु  [[Special:Upload/stash/$1|उत्तारणप्रपत्रम्]]',
+
+'upload-proto-error' => 'सदोषः क्रमः ।',
+'upload-proto-error-text' => 'स्वयम् उत्तरणं <code>http://</code> or <code>ftp://</code>. इत्यनेन सह आरब्धः भवति ।',
+'upload-file-error' => 'आन्तरिकः दोषः',
+'upload-file-error-text' => 'वितारके तात्कालिकसञ्चिकानिर्माणावसरे उपगतः आन्तरिकदोषः । 
+सम्पर्कयतु एतम् [[Special:ListUsers/sysop|administrator]]',
+'upload-misc-error' => 'अज्ञातः उत्तारणदोषः ।',
+'upload-misc-error-text' => 'उत्तारणावसरे कश्चन अज्ञातदोषः उपगतः । 
+URL मान्यम् अभिगम्यं वेति परिशील्य पुनः यतताम् ।[[Special:ListUsers/sysop|administrator]]',
+'upload-too-many-redirects' => 'URL अधिकपुनर्निदेशान् अन्तर्गतम् ।',
 'upload-unknown-size' => 'अज्ञात आकार',
+'upload-http-error' => 'कश्चन HTTP दोषः उपगतः $1',
+'upload-copy-upload-invalid-domain' => 'अस्मिन् कोशे प्रतिकृत्युत्तारणम् उपलब्धं नास्ति ।',
+
+# File backend
+'backend-fail-stream' => 'सञ्चिका क्रमगता न $1.',
+'backend-fail-backup' => 'सञ्चिकां प्रतिचयनम् अशक्तम् $1.',
+'backend-fail-notexists' => '$1 सञ्चिका न वर्तते ।',
+'backend-fail-hashes' => 'सञ्चिकादोषः तोलनार्थं न मिलति ।',
+'backend-fail-notsame' => '$1 मध्ये काचित् अज्ञातसञ्चिका पूर्वमेवास्ति ।',
+'backend-fail-invalidpath' => '$1 मान्यः सङ्ग्रहपथः न ।',
+'backend-fail-delete' => '$1 सञ्चिकां परिमर्जितुं नैव शक्यते ।',
+'backend-fail-alreadyexists' => '$1 इति सञ्चिक पूर्वमेव वर्तते ।',
+'backend-fail-store' => '$1 सञ्चिकां $2 मध्ये सङ्ग्रहितुं नैव शक्यते ।',
+'backend-fail-copy' => '$1 सञ्चिकां $2 मध्ये प्रतिकृतिः कर्तुं नैव शक्यते ।',
+'backend-fail-move' => '$1 सञ्चिकां $2 प्रति चालयितुं न शक्यते ।',
+'backend-fail-opentemp' => 'तात्कालिकसञ्चिकाः उद्घाटयितुं नैव शक्यते ।',
+'backend-fail-writetemp' => 'तात्कालिकसञ्चिकायां लेखितुं न शक्यते ।',
+'backend-fail-closetemp' => 'तात्कालिकसञ्चिकां पिधातुं नैव शक्यते ।',
+'backend-fail-read' => '$1 इति सञ्चिकां पठितुं नैव शक्यते ।',
+'backend-fail-create' => '$1 इति सञ्चिकां लेखितुं नैव शक्यते ।',
+'backend-fail-maxsize' => '{{PLURAL:$2|one byte|$2 bytes}}तः अधिकम् अस्ति अतः $1 सञ्चिकां लेखितुं नैव शक्यते ।',
+'backend-fail-readonly' => '"$1" सङ्ग्रहागारान्तः तु सद्यः केवलं पठनार्हः  कारणं दत्तं तु  "\'\'$2\'\'" ।',
+'backend-fail-synced' => '"$1" सञ्चिका आन्तरिकसङ्ग्रहागारन्ते  उपयोगायोग्यस्थितौ न अस्ति ।',
+'backend-fail-connect' => '"$1" सङ्ग्राहागारन्ते सम्पर्कयितुं नैव शक्यते ।',
+'backend-fail-internal' => '"$1"सङ्ग्रहागारन्ते अज्ञातदोषः उपगतः ।',
+'backend-fail-contenttype' => '"$1"मध्ये सङ्ग्रहितुं सञ्चिकायाः प्रकारं निश्चिनोतुं नैव शक्यते ।',
+'backend-fail-batchsize' => '$1 संचिकायाः गणस्य निक्षेपावकाशः प्रदत्तः । {{PLURAL:$1|operation|operations}}; समयनिर्बन्धः $2 {{PLURAL:$2|operation|operations}}.',
+'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" निमित्तं सञ्चिकाम् उद्घाटयितुं न शक्यते ।',
+'lockmanager-fail-releaselock' => '"$1"कपाटितुं न शक्यते ।',
+'lockmanager-fail-db-bucket' => ' $1 द्रेणपात्रे कपाटनीयमूलपाठाः अपर्याप्ताः सन्ति ।',
+'lockmanager-fail-db-release' => '$1 मूलपाठेषु कपाटिकाविमोचनं नैव शक्यते ।',
+'lockmanager-fail-svr-acquire' => '$1 वितारके कपाटिकायोजनं न शक्यते ।',
+'lockmanager-fail-svr-release' => '$1 मूलपाठेषु कपाटिकाविमोचनं नैव शक्यते ।',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'ZIP परिशीलनार्थम् उद्घाटनावसरे कश्चन दोषः सङ्गतः ।',
+'zip-wrong-format' => 'निश्चितसञ्चिका तु सञ्चिका ZIP नैव ।',
+'zip-bad' => 'ZIP सञ्चिका तु दूषिता अथवा अपठनीया अस्ति । 
+सुरक्षार्थं परिशीलयितुं  न शक्यते ।',
+'zip-unsupported' => 'एषा सञिका तु मीडियाविकिना अननुमोदिता ZIP सञ्चिका अस्ति ।
+सुरक्षर्थं सम्यक् परिशील्या न भवति ।',
+
+# Special:UploadStash
+'uploadstash' => 'राशीः उत्तारयतु ।',
+'uploadstash-summary' => 'एतत्पुटम् उत्तारितसञ्चिकानां सम्पर्कं साधयति । विक्याम् एतानि प्रकाशितानि न । योजकः उत्तारितवानपि एताः सञ्चिकाः अदृश्याः सन्ति ।',
+'uploadstash-clear' => 'राशीकृतसञ्चिकाः विशदयतु ।',
+'uploadstash-nofiles' => 'भवान् सञ्चिकाः न राशीकृतवान् ।',
+'uploadstash-badtoken' => 'प्रक्रियाचरणं सफलम् । किन्तु प्रायः ते सम्पादनाधिकारः विनष्टः । पुनः यतताम् ।',
+'uploadstash-errclear' => 'सञ्चिकविशदनं सफलम् ।',
+'uploadstash-refresh' => 'सञ्चिकावलीं संस्करोतु ।',
+'invalid-chunk-offset' => 'अमान्यं चङ्क् आफ्सेट्',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'अभिगमनम् अपलपितम् ।',
+'img-auth-nopathinfo' => 'पथसूची विनष्टा ।
+ते वितारकः सूचनाः प्रेषयितुं संसिद्धः न ।
+एतत् CGI अवलम्बितं स्यात् अपि च img_auth अनुमोदनं न करोति ।
+See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+'img-auth-notindir' => 'सुदृढितायाम् उत्तारणनिदेशिकायाम् अभ्यर्थितपथः नास्ति ।',
+'img-auth-badtitle' => '"$1"तः मान्यशीर्षिकां निर्मातुं न शक्यते ।',
+'img-auth-nologinnWL' => 'नामाभिलेखेन न प्रविष्टः अपिच $1 तु श्वेतावली न ।',
+'img-auth-nofile' => '"$1" इति सञ्चिका न वर्तते ।',
+'img-auth-isdir' => 'भवान् "$1"निदेशिकाम् अभिगन्तुं यतते ।
+सञ्चिकाभिगमनम् एव अनुमतम् ।',
+'img-auth-streaming' => '"$1"इत्यस्य प्रवाहिनी ।',
+'img-auth-public' => 'स्वायत्तविकितः सञ्चिकाः नेतुम् अयं कार्यक्रमः img_auth.php उपयुज्यते ।
+एषा विकिः सार्वजनिकविकिः इति  दृढिता । 
+वैकल्पिकसुरक्षार्थं img_auth.php अपलपितः । ।',
+'img-auth-noread' => '"$1"पठने योजकस्य अभिगमनं नास्ति ।',
+'img-auth-bad-query-string' => ' URL मध्ये अमान्यं प्रश्नतन्तुः अस्ति ।',
+
+# HTTP errors
+'http-invalid-url' => ' $1 इति अमान्यम् URL ।',
+'http-invalid-scheme' => '"$1"योजनायुक्तं URLs नानुमोदितानि ।',
+'http-request-error' => ' अज्ञातदोषात् HTTP अभ्यर्थनं निष्पलम् ।',
+'http-read-error' => 'HTTP पठनदोषः।',
+'http-timed-out' => 'HTTP अभ्यर्थनं कालातीतम् ।',
+'http-curl-error' => 'दोषाहरणस्य URL: $1',
+'http-host-unreachable' => 'URL प्राप्तुं न शक्यते ।',
+'http-bad-status' => 'HTTP : $1 $2अभ्यर्थने समस्या आसीत् ।',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'URL प्राप्तुं न शक्यते ।',
+'upload-curl-error6-text' => 'उपपन्नं URL न प्राप्नोति ।
+द्विटङ्कनेन URLअदोषत्वं क्षेत्रं च परिशीलयतु ।',
+'upload-curl-error28' => 'उत्तारणस्य समयातीतः ।',
+'upload-curl-error28-text' => 'जालक्षेत्रेण प्रतिस्पन्दितुं दीर्घकालः आश्रितः । 
+जालक्षेत्रस्य जीवितं परिशीलयतु । अथवा कञ्चित्कालान्तरेण प्रयतताम् । 
+भवान् न्यूनकार्यव्यस्तकाले प्रयत्नं करोतु ।',
 
 'license' => 'अनुमतिदानम्',
 'license-header' => 'अनुमतिदानम्',
+'nolicense' => 'चियनं नास्ति ।',
+'license-nopreview' => 'पूर्वावलोकनं न मिलति ।',
+'upload_source_url' => '(मान्यं, प्रचारात्मकाभिगमनयुतं URL)',
+'upload_source_file' => ' (ते सङ्गणकस्य सञ्चिका)',
 
 # Special:ListFiles
+'listfiles-summary' => 'एतद्विशेषपुटम् उत्तारितसञ्चिकाः प्रदर्शयति । 
+योजकेन शुद्धाः अतिनूतनं सञ्चिकाः केवलम् अत्र प्रदर्शयति ।',
+'listfiles_search_for' => 'माध्यमनामधेयार्थम् अन्विषतु ।',
 'imgfile' => 'संचिका',
+'listfiles' => 'सञ्चिकावली ।',
+'listfiles_thumb' => 'अंगुष्ठनखाकारम् ।',
 'listfiles_date' => 'दिनाङ्क',
 'listfiles_name' => 'नामन्',
 'listfiles_user' => 'योजक',
 'file-anchor-link' => 'सञ्चिका',
 'filehist' => 'सञ्चिकायाः इतिहासः',
 'filehist-help' => 'सञ्चिका तत्समये कीदृशी आसीदिति द्रष्टुं दिनांकः/समयः नुद्यताम् ।',
+'filehist-deleteall' => 'सर्वान् परिमर्जतु ।',
 'filehist-deleteone' => 'विलोप',
 'filehist-revert' => 'प्रतिनिवर्त्यताम्',
 'filehist-current' => 'सद्योजातम्',
 'filehist-datetime' => 'दिनाङ्कः/समयः',
 'filehist-thumb' => 'अंगुष्ठनखाकारम्',
 'filehist-thumbtext' => '$1 समये विद्यमत्याः आवृत्तेः अंगुष्ठनखाकारम्',
+'filehist-nothumb' => 'अङ्गुष्टनखाकारकं नाश्ति ।',
 'filehist-user' => 'योजकः',
 'filehist-dimensions' => 'आयामाः',
+'filehist-filesize' => 'सञ्चिकाकारः ।',
 'filehist-comment' => 'टिप्पणी',
+'filehist-missing' => 'सञ्चिका विनष्टा ।',
 'imagelinks' => 'संचिका यत्र उपयुक्ता',
 'linkstoimage' => '{{PLURAL:$1|अधोलिखितं पृष्ठं| अधोलिखितानि $1 पृष्ठाणि}} इदं संचिकां प्रति संबंधनं {{PLURAL:$1|करोति| कुर्वन्ति}}।',
+'linkstoimage-more' => '{{PLURAL:$1|$1}} तः अधिकपुटानि अस्यां सञ्चिकायां योज्यन्ते । 
+अधोनिदेशितसूची सञ्चिकाभिः योजनीयपुटानि पश्यति ।{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठ}} 
+[[Special:WhatLinksHere/$2|पूर्णसूची]] अपि लभ्यते ।',
 'nolinkstoimage' => 'एतद चित्रात् न पृष्ठा सम्बद्धं करोन्ति।',
+'morelinkstoimage' => ' [[Special:WhatLinksHere/$1|more links]] मध्ये सञ्चिकामवलोकयतु ।',
+'linkstoimage-redirect' => '$1 (सञ्चिका पुनर्निदेशिता) $2',
+'duplicatesoffile' => 'अधो निदेशितसञ्चिका द्विप्रतिः । {{PLURAL:$1|}} विशेषविवरणार्थम् अत्र प्रविशतु । [[Special:FileDuplicateSearch/$2|more details]]',
 'sharedupload' => 'इयं संचिका $1 इत्यस्मादस्ति, एषा खलु अन्येष्वपि प्रकल्पेषु प्रयोक्तुं शक्यते।',
+'sharedupload-desc-there' => 'एषा सञ्चिका $1 तथा अन्यप्रकल्पेन च उपयुक्ता ।
+इत्योप्यतिशयसूचनार्थं $2 सञ्चिकाविवरणपुटं पश्यतु ।',
 'sharedupload-desc-here' => 'एषा सञ्चिका $1 इत्यतः उद्धृता अन्यासु योजनासु उपयोगार्हा ।
-अस्याः सञ्चिकायाः  [$2 सञ्चिकावि वरणपृष्ठम्] इत्यत्र उपलभ्यमानं विवरणम् अधोलिखितं यथा ।',
+अस्याः सञ्चिकायाः  [$2 सञ्चिकाविवरणपृष्ठम्] इत्यत्र उपलभ्यमानं विवरणम् अधोलिखितं यथा ।',
+'sharedupload-desc-edit' => '    एषा सञ्चिका $1 इत्यतः उद्धृता अन्यासु योजनासु उपयोगार्हा । 
+अस्याः सञ्चिकायाः [$2 सञ्चिकाविवरणपृष्ठम्] इत्यत्र उपलभ्यमानं विवरणम् अधोलिखितं यथा ।',
+'sharedupload-desc-create' => 'एषा सञ्चिका $1 इत्यतः उद्धृता अन्यासु योजनासु उपयोगार्हा । 
+अस्याः सञ्चिकायाः [$2 सञ्चिकाविवरणपृष्ठम्] इत्यत्र उपलभ्यमानं विवरणम् अधोलिखितं यथा ।',
+'filepage-nofile' => 'अनेन नाम्ना कापि सञ्चिका न वर्तते ।',
+'filepage-nofile-link' => 'अनेन नाम्ना कापि सञ्चिका न वर्तते । $1 इत्येतत् उत्तारयितुं शक्नोति ।',
 'uploadnewversion-linktext' => 'अस्य पृष्ठस्य नूतनाम् आवृत्तिं उद्भारयतु',
+'shared-repo-from' => '$1 इत्यस्मात् ।',
+'shared-repo' => 'विभक्तः कोशः ।',
 
 # File reversion
+'filerevert' => '$1 अनुवर्तताम् ।',
+'filerevert-legend' => 'सञ्चिकाम् अनुवर्तताम् ।',
+'filerevert-intro' => "भवान् '''[[Media:$1|$1]]''' इति सञ्चिकायाः  $4 इत्यवतरणं $3, $2 इति अनुवर्तमानः अस्ति ।",
 'filerevert-comment' => 'कारणम् :',
+'filerevert-defaultcomment' => '$2 इत्येनं $1 समयस्य अवतरणम् अनुवृत्तम् ।',
+'filerevert-submit' => 'अनुवर्तताम् ।',
+'filerevert-success' => "'''[[Media:$1|$1]]''' इत्येनं $4 $2 को $3 समयावतरणम् अनुवृत्तम् ।",
+'filerevert-badversion' => 'दत्तसमये सन्देशदायिका सञ्चिका प्राचीनावतरणं नास्ति ।',
 
 # File deletion
+'filedelete' => '$1 इत्येतत् अपमर्जतु ।',
+'filedelete-legend' => 'सञ्चिकाम् अपमर्जतु ।',
+'filedelete-intro' => "'''[[Media:$1|$1]]''' इति सञ्चिकायाः इतिहाससहितम् अपमर्जयन् अस्ति ।",
+'filedelete-intro-old' => "भवान्'''[[Media:$1|$1]]''' इत्यस्य [$4 $2 इत्येतयोः $3 कालस्य अवतरणम्] अपमार्जयन् अस्ति ।",
 'filedelete-comment' => 'कारणम् :',
 'filedelete-submit' => 'विलुप्यताम्',
+'filedelete-success' => "'''$1''' अपमर्जितम् ।",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' इत्यस्य $2 इत्येतत् $3 समयस्यावतरणम् अपमर्जितम् ।",
+'filedelete-nofile' => "'''$1''' न वर्तते ।",
+'filedelete-nofile-old' => "'''$1''' इत्यस्य भवता वर्णितविशेषतायुतम् अवतरणम् अत्र न वर्तते ।",
+'filedelete-otherreason' => 'अपरम्/अतिरिक्तं कारणम् :',
 'filedelete-reason-otherlist' => 'अन्य कारणम्',
+'filedelete-reason-dropdown' => '* अपमर्जनस्य सामान्यं कारणम् । 
+** कृतिस्वाम्यस्य उल्लङ्घनम् । 
+** प्रतिकृता सञ्चिका ।',
+'filedelete-edit-reasonlist' => 'अपमार्जनकारणानि सम्पादयतु ।',
+'filedelete-maintenance' => 'सञ्चिकानाम् अपमर्जनम् अनमपमर्जनं च निर्वहणकाले तात्कालिकतया निष्क्रियौ ।',
+'filedelete-maintenance-title' => 'सञ्चिकाम् अपमर्जितुं न शक्यते ।',
 
 # MIME search
+'mimesearch' => 'MIME अन्वेषणम् ।',
+'mimesearch-summary' => 'MIME-प्रकारानुसारं सञ्चिकान्वेषणार्थम् एतत्पुटम् उपयोक्तुं शाक्नोति । 
+इनपुट: सञ्चिकायाः प्रकारः/उपप्रकारः, उदाहरणम्. <code>image/jpeg</code>.',
+'mimetype' => 'MIME प्रकारः :',
 'download' => 'डाउनलोड',
 
+# Unwatched pages
+'unwatchedpages' => 'अनवलोकितपुटानि ।',
+
+# List redirects
+'listredirects' => 'चालितानाम् अवली ।',
+
+# Unused templates
+'unusedtemplates' => 'अनुपयुक्ताः प्राकृतयः ।',
+'unusedtemplatestext' => 'अस्मिन् पुटे {{ns:template}} नामस्थानयुतानि सर्वपुटानि अन्तर्गतानि । यानि अन्यपुटेषु न सन्ति । 
+अस्य अपमर्जनात् पूर्वं सञ्चिकायाः अन्यानुबन्धान् परिशीलयतु ।',
+'unusedtemplateswlh' => 'अन्यानुबन्धाः ।',
+
 # Random page
 'randompage' => 'यादृच्छिकपृष्ठम्',
+'randompage-nopages' => 'अधोनिदेशितनामस्थाने पुटानि न सन्ति । {{PLURAL:$2| एतन्नमस्थाने}} नास्ति : $1।',
+
+# Random redirect
+'randomredirect' => 'यादृच्छिकचालनम् ।',
+'randomredirect-nopages' => '$1नामस्थाने चालनानि न सन्ति ।',
 
 # Statistics
 'statistics' => 'स्थितिगणितम्',
+'statistics-header-pages' => 'पुटसाङ्ख्यिकाः ।',
+'statistics-header-edits' => 'सङ्ख्यिकाः सम्पादयतु ।',
+'statistics-header-views' => 'साङ्ख्यिकाः अवलोकयतु ।',
+'statistics-header-users' => 'योजकसाङ्ख्यिकाः ।',
+'statistics-header-hooks' => 'अन्यसाङ्ख्यिकाः ।',
+'statistics-articles' => 'आधेयपुटानि ।',
 'statistics-pages' => 'पृष्ठानि',
+'statistics-pages-desc' => 'अस्यां विक्यां तु सम्भाषाणपुटसहितानि अन्यसर्वपुटानि चालितानि ।',
 'statistics-files' => 'उद्भारितसञ्चिकाः',
+'statistics-edits' => '{{SITENAME}} व्यवस्थापनपर्यन्तं पुटसम्पादनानि ।',
+'statistics-edits-average' => 'प्रतिपुटं माध्यसम्पादनानि ।',
+'statistics-views-total' => 'अवलोकनयोगः ।',
+'statistics-views-total-desc' => 'असंवृत्तपुटानाम् अवलोकनानि । अपि च विशेषपुटानि नान्तर्गतानि ।',
+'statistics-views-peredit' => 'प्रतिसम्पादनम् अवलोकनम् ।',
+'statistics-users' => 'पञ्जीकृतः [[Special:ListUsers|योजकः]]',
 'statistics-users-active' => 'सक्रियाः सदस्याः',
+'statistics-users-active-desc' => 'गतेषु {{PLURAL:$1|day|$1 दिनेषु}} सक्रियाः योजकाः  ।',
+'statistics-mostpopular' => 'अत्यवलोकितपुटानि ।',
 
+'disambiguations' => 'द्वैधीभावरहितपुटानाम् अनुबन्धितपुटानि ।',
 'disambiguationspage' => 'Template:असन्दिग्धम्',
+'disambiguations-text' => 'अधो निदेशितपुटानि असन्धिग्धपुटेन अनुबन्धितानि । 
+एतानि यथार्थविषैः योजनीयानि । <br />
+यदि कोऽपि पुटेन प्रकृतिं प्रयोजयति यः  [[MediaWiki:Disambiguationspage]] इत्यनेन अनुबद्धः  ससन्दिग्धपुटम् इति उच्यते ।',
 
 'doubleredirects' => 'दुगुनी-अनुप्रेषिते',
-
+'doubleredirectstext' => 'एतत्पुटं तेषां पुटानां सूची अस्ति यानि अन्यपुनर्निदेशितपुटानि प्रति पुनरिदेशितानि सन्ति । 
+प्रत्येकं पङ्क्तिः प्रथमद्वितीयपुनर्निदेशम् अन्तर्गता । द्वितीयपुनर्निदेशः लक्ष्यं यत् वास्तवं लक्ष्यपुटं प्रथमं प्रदर्शितम् । 
+अपि च प्रथमपुनर्निदेशः वास्तवेन एतदेवलक्षितं स्यात् । <del>काटी गई</del> प्रविष्टयः परिहृताः ।',
+'double-redirect-fixed-move' => '[[$1]] इत्यस्य स्थानं परिवर्तितम् । 
+इदानीम् [[$2]] इत्यस्य दिशि पुनर्निदिष्टम् अस्ति ।',
+'double-redirect-fixed-maintenance' => '[[$1]] तः [[$2]] पुनर्निदेशद्वयं निश्चिनोति ।',
+'double-redirect-fixer' => 'पुनर्निदेशस्य बन्धकः ।',
+
+'brokenredirects' => 'भग्नपुनर्निदेशाः ।',
+'brokenredirectstext' => 'अधो दत्तपुनर्निदेशाः अवृत्तपुटैः सह अनुबन्दं रक्षन्ति ।',
 'brokenredirects-edit' => 'सम्पाद्यताम्',
 'brokenredirects-delete' => 'विलुप्यताम्',
 
+'withoutinterwiki' => 'भाषानुबन्धरिहातानि पुटानि ।',
+'withoutinterwiki-summary' => 'अधस्थपुटानि अन्यभाषावतरणैः अनुबन्धं न कुर्वन्ति ।',
 'withoutinterwiki-legend' => 'पूर्वोऽपपदम्',
 'withoutinterwiki-submit' => 'दर्श्यताम्',
 
+'fewestrevisions' => 'न्यूनतमालोकनयुक्तपुटानि ।',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|बैट्|बैट्स्}}',
+'ncategories' => '{{PLURAL:$1|वर्गः|वर्गाः }}',
+'nlinks' => '$1 {{PLURAL:$1|अनुबन्धः|अनुबन्धाः}}',
 'nmembers' => '$1 {{PLURAL:$1|सदस्यः|सदस्याः}}',
+'nrevisions' => '$1 {{PLURAL:$1|पुनरावृत्तिः}}',
+'nviews' => '$1 {{PLURAL:$1|अनुबन्धः|अनुबन्धाः}}',
+'nimagelinks' => '$1 {{PLURAL:$1|पुटम्|पुटानि}} प्रयुक्तानि ।',
+'ntransclusions' => '$1 {{PLURAL:$1|पुटम्|पुटानि}} प्रयुक्तानि ।',
+'specialpage-empty' => 'अस्य वृत्तस्य परिणामः नास्ति ।',
+'lonelypages' => 'अनाथपुटानि ।',
+'lonelypagestext' => '{{SITENAME}} इत्यस्मिन् अधो निदेशितपुटानि नानुबद्धानि अथवा अन्तर्गतानि अन्यपुटेषु ।',
+'uncategorizedpages' => 'अवर्गीकृतपुटानि ।',
+'uncategorizedcategories' => 'अवर्गीकृताः वर्गाः ।',
+'uncategorizedimages' => 'अवर्गीकृताः सञ्चिकाः ।',
+'uncategorizedtemplates' => 'अवर्गीकृताः प्रकृतयः ।',
+'unusedcategories' => 'अनुपयुक्ताः वर्गाः ।',
+'unusedimages' => 'अनुपयुक्तानि पुटाणी ।',
+'popularpages' => 'प्रसिद्धानि पुटानि ।',
+'wantedcategories' => 'आवश्यकाः वर्गाः ।',
+'wantedpages' => 'आवश्यकपुटानि ।',
+'wantedpages-badtitle' => '$1 परिणामनिरूपणे अमान्यशीर्षकम् ।',
+'wantedfiles' => 'आवश्यकाः सञ्चिकाः ।',
+'wantedfiletext-cat' => 'अधो दत्तसञ्चिकाः उपयुक्ताः किन्तु न वर्तन्ते । बाह्यकोशानां सञ्चिकाः उपस्थिताः इति एताः सूच्यां स्युः । एतादृशः कोपि सदोषप्रवेशः<del> अवरुद्धः</del> भवति । अपि च यत्पुटं तादृश्याः अनुपस्थितसञ्चिकायाः प्रयोगं कुर्वन्ति तासं सूची  [[:$1]] मध्ये अस्ति ।',
+'wantedfiletext-nocat' => 'अधो दत्ताः सञ्चिकाः उपयुक्ताः किन्तु न वर्तन्ते । बाह्यकोशस्य सञ्चिकाः उपस्थिताः इति एताः सूच्यां स्युः । तदृशः कोऽपि सदोषप्रवेशः<del>struck out</del>. अत्र स्यात् ।',
+'wantedtemplates' => 'आवश्यकाः प्राकृतयः ।',
+'mostlinked' => 'अत्यनुबद्धानि पुटानि ।',
+'mostlinkedcategories' => 'वर्गैः सह अत्यनुबद्धाः ।',
+'mostlinkedtemplates' => 'प्राकृतिभिः अत्यनुबद्धाः ।',
+'mostcategories' => 'बहुवर्गयुक्तपुटानि ।',
+'mostimages' => 'अत्यनुबद्धानि पुटानि ।',
+'mostrevisions' => 'सर्वाधिकपुनरावृत्तियुक्तानि पुटानि ।',
 'prefixindex' => 'उपसर्गयुक्तानि सर्वाणि पृष्ठानि',
+'prefixindex-namespace' => 'उपसर्गैः युक्तानि सर्वपुटानि । ($1 नामस्थानम्)',
+'shortpages' => 'ह्रस्वपुटानि',
 'longpages' => 'दीर्घाणि पृष्ठानि',
+'deadendpages' => 'अन्तिमपुटानि ।',
+'deadendpagestext' => 'अधो निदेशितपुटानि {{SITENAME}} इत्यस्मिन्  अन्यपुटैः अनुबद्धानि न ।',
+'protectedpages' => 'सुरक्षितानि पुतानि ।',
+'protectedpages-indef' => 'अनिर्दिष्टसुरक्षा केवलम् ।',
+'protectedpages-cascade' => 'प्रपातसंरक्षणं केवलम् ।',
+'protectedpagestext' => 'अधोसूचितपुटानि चालनात् सम्पादनात् वा सुरक्षितानि ।',
+'protectedpagesempty' => 'अनेन विस्तारेण न किमपि पुटं सद्यः न सुरक्षितम् ।',
+'protectedtitles' => 'सुरक्षितानि शीर्षकानि ।',
+'protectedtitlestext' => 'अधो दत्तशीर्षकाणि सर्जनात् रक्षितानि ।',
+'protectedtitlesempty' => 'एतैः विस्तारैः न किमपि शीर्षकं सद्यः परिरक्षितानि ।',
 'listusers' => 'योजक सूचि',
-'usercreated' => '$1 दिने $2 समये रचितम्',
+'listusers-editsonly' => 'केवलं सम्पादनसहितयोजकान् दर्शयतु ।',
+'listusers-creationsort' => 'सर्जनदिनाङ्कैः वर्गीकरोतु ।',
+'usereditcount' => '$1 {{PLURAL:$1|दिनम्|दिनानि}}',
+'usercreated' => '$1 दिने $2 समये रचितम् योजकनाम $3',
 'newpages' => 'नवीनपृष्ठम्',
 'newpages-username' => 'योजकनामन्:',
 'ancientpages' => 'प्राचीनतमानि पृष्ठानि',
 'move' => 'चाल्यताम्',
 'movethispage' => 'इदं पृष्ठं चाल्यताम्',
+'unusedimagestext' => 'अधो दत्तसञ्चिकाः सन्ति किन्तु कस्मिंश्चिदपि पुटे न न्यस्ताः ।',
+'unusedcategoriestext' => 'निम्नलिखितवर्गाः सन्ति तथापि अन्यपुटं वर्गः वा न उपयुङ्क्ते ।',
+'notargettitle' => 'लक्ष्यं नास्ति ।',
+'notargettext' => 'एतत्कार्यं समाचरितुं भवान् लक्षितपुटं योजकं वा न निर्दिष्टवान् ।',
+'nopagetitle' => 'तादृशलक्षितपुटं नास्ति ।',
+'nopagetext' => 'भवता निर्दिष्टं लक्षितपुटं नास्ति ।',
 'pager-newer-n' => '{{PLURAL:$1|नूतनतरम् 1|नूतनतराणि $1}}',
 'pager-older-n' => '{{PLURAL:$1|पुरातनतरम् 1|पुरातनतराणि $1}}',
+'suppress' => 'अलक्ष्यम् ।',
+'querypage-disabled' => 'समाचरणकारणेन एतद्विशेषपुटं निष्क्रियम् ।',
 
 # Book sources
 'booksources' => 'ग्रन्थानां स्रोतः',
 'booksources-search-legend' => 'ग्रन्थस्रोतः अन्विष्यताम्',
 'booksources-go' => 'गम्यताम्',
+'booksources-text' => 'अधस्था आवली नूतनप्राचीनपुस्तकानां विक्रयकेन्द्रस्य अनुबन्धान् सूचयति । यत्र ते  आवश्यकाः अन्यविषयाः अपि उपलभ्याः ।',
+'booksources-invalid-isbn' => 'दत्तं ISBN मान्यम् इति  न भाति । मूलस्रोततः प्रतिकृतीः कर्तुं परिशीलयतु ।',
 
 # Special:Log
+'specialloguserlabel' => 'आचारी :',
+'speciallogtitlelabel' => 'लक्ष्यम् (शीर्षकम् / योजकः)',
 'log' => 'लॉग् इत्येतानि',
+'all-logs-page' => 'सर्वसार्वजनिकप्रवेशः ।',
+'alllogstext' => '{{SITENAME}}इत्यस्य उबलब्धप्रवेशानां  संयुक्तप्रदर्शनम् ।
+प्रवेशप्रकारं चित्वा भवान् दृश्यं क्षाययितुं शक्नोति । योजकनाम,  सदस्य नाम (ह्रस्वदीर्घाक्षरसंवादी) प्रभावितपुटम् ।',
+'logempty' => 'प्रवेशे मेलयुक्तपुटं नास्ति ।',
+'log-title-wildcard' => 'अनेन पाठेन आरब्धानि शीर्षकानि अन्विषतु ।',
+'showhideselectedlogentries' => 'चितप्रवेशावलीः प्रदर्शयतु/गोपयतु ।',
 
 # Special:AllPages
 'allpages' => 'सर्वाणि पृष्ठानि',
 'alphaindexline' => '$1 तः $2 पर्यन्तम्',
+'nextpage' => '($1)अग्रिमपुटम् ।',
 'prevpage' => 'पूर्वपृष्ठम् ($1)',
 'allpagesfrom' => 'इत्यस्मात् आरभ्यमाणानि पृष्ठानि दर्श्यन्ताम्:',
 'allpagesto' => 'तानि पृष्ठानि दर्श्यन्तां येषाम् अन्त्यम् एवम् :',
 'allarticles' => 'सर्वाणि पृष्ठानि',
+'allinnamespace' => 'सर्वपुटानि ($1 नामस्थानम्)',
+'allnotinnamespace' => 'सर्वपुटानि ($1 नामस्थानं विना)',
 'allpagesprev' => 'पूर्वतन',
 'allpagesnext' => 'अग्रिम',
 'allpagessubmit' => 'गम्यताम्',
+'allpagesprefix' => 'उपसर्गयुक्तपुटानि दर्शयतु ।',
+'allpagesbadtitle' => 'दत्तपुटशीर्षकम् अमान्यम् अथवा आन्तर्भाषिकम्, आन्तर्विकीयं वा अस्ति । 
+अस्मिन् एकं नैकं वा अक्षराणि सन्ति येषां प्रयोगं शीर्षकेषु कर्तुम् अशक्यम् ।',
+'allpages-bad-ns' => '{{SITENAME}} इत्यस्मिन् "$1" नामस्थानं नास्ति ।',
+'allpages-hide-redirects' => 'पुनर्निदेशान् गोपयतु ।',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => ' भवान् अस्यपुटास्य निगूढावृत्तिं पश्यन् अस्ति । यत् $1 कालिकम्  अस्ति ।',
+'cachedspecial-viewing-cached-ts' => 'भवान् निगूढावृत्तेः पुटम् अवलोकयन् अस्ति । यत् परिपूर्णतया वास्तवं न ।',
+'cachedspecial-refresh-now' => 'जघन्यम् अवलोकयतु ।',
 
 # Special:Categories
 'categories' => 'वर्गाः',
+'categoriespagetext' => 'निम्नोक्ताः {{PLURAL:$1|श्रेणी|श्रेणयः}} पुटानि माध्यमान् वा युक्ताः ।
+यस्याः श्रेण्याः [[Special:UnusedCategories|अप्रयुक्तश्रेण्यः]] अत्र न सन्ति ।
+[[Special:WantedCategories|अपेक्षितश्रेण्यः]] अपि पश्यतु ।',
+'categoriesfrom' => 'इत्यस्मात् आरभ्यमाणानि पृष्ठानि दर्श्यन्ताम्:',
+'special-categories-sort-count' => 'गणनानुगुणं वर्गीकरोतु ।',
+'special-categories-sort-abc' => 'अकारदिक्रमेण वर्गीकरोतु ।',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'अपमर्जितानि योजकयोगदानानि ।',
+'deletedcontributions-title' => 'अपमर्जितानि योजकयोगदानानि ।',
+'sp-deletedcontributions-contribs' => 'योगदानानि ।',
 
 # Special:LinkSearch
 'linksearch' => 'बाह्यसम्पर्कतन्तूनाम् अन्वेषणम्',
+'linksearch-pat' => 'अन्वेषणस्य क्रमः ।',
+'linksearch-ns' => 'नामस्थानम् :',
 'linksearch-ok' => 'अन्वेषणम्',
+'linksearch-text' => '"*.wikipedia.org" सदृशानि वन्यपत्राणि योजयितुं शक्यते । 
+न्यूनातिन्यूनं ".org" सदृशः अत्युन्नतस्तरस्य डोमेन आवश्यकम् अस्ति <br />
+अनुमोदितक्रमागतिः  <code>$1</code> (एतेषु कतममपि अन्वेषणे न योजयतु )',
 'linksearch-line' => '$2 पृष्ठं $1 तः सम्पृक्तम् अस्ति।',
+'linksearch-error' => 'वन्यपत्राणि आतिथेयस्य नाम्ना समं केवलं प्रभान्ति ।',
 
 # Special:ListUsers
+'listusersfrom' => 'एतस्मात् आरभमाणान् योजकान् दर्शयतु ।',
 'listusers-submit' => 'दर्श्यताम्',
+'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:Log/newusers
 'newuserlogpage' => 'प्रयोक्तृ-सृजन-सूचिका',
+'newuserlogpagetext' => 'अयं योजकनिर्माणास्य प्रवेशः ।',
 
 # Special:ListGroupRights
+'listgrouprights' => 'योजकसमूहाधिकाराः ।',
+'listgrouprights-summary' => 'अधोदत्ता विकिपरिभाषितस्य सङ्गताभिगम्यताधिकारैः सहिता योजकसमूहस्य आवली । [[{{MediaWiki:Listgrouprights-helppage}}|additional information]]',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">दत्ताधिकाराः</span>
+* <span class="listgrouprights-revoked">हृताधिकाराः</span>',
 'listgrouprights-group' => 'वर्ग',
+'listgrouprights-rights' => 'अधिकाराः ।',
+'listgrouprights-helppage' => 'Help: समूहाधिकाराः ।',
 'listgrouprights-members' => '(सदस्यानां सूची)',
+'listgrouprights-addgroup' => '{{PLURAL:$2|समूहः}} योज्यताम् $1',
+'listgrouprights-removegroup' => 'समूहः{{PLURAL:$2|विलोपयतु}}: $1',
+'listgrouprights-addgroup-all' => 'सर्वसमूहान् योजयतु ।',
+'listgrouprights-removegroup-all' => 'सर्वसमूहान् अपनयतु ।',
+'listgrouprights-addgroup-self' => 'स्वस्थाने {{PLURAL:$2|समूहम्}} योजयतु $1',
+'listgrouprights-removegroup-self' => 'स्वस्थाने {{PLURAL:$2|समूहम्}} अपनयतु  $1',
+'listgrouprights-addgroup-self-all' => 'स्वस्थाने सर्वसमूहान योजयतु ।',
+'listgrouprights-removegroup-self-all' => 'स्वस्थानात् सर्वसमूहान् अपनयतु ।',
 
 # E-mail user
+'mailnologin' => 'सम्प्रेषणस्य सङ्केतः नास्ति ।',
+'mailnologintext' => 'अस्य योजकेभ्यः विद्युन्मानपत्रप्रेषणार्थम् [[Special:UserLogin|नामाभिलेखनम्]] आवश्यकम् [[Special:Preferences|आद्यता]]यां प्रेषयितुं विद्युन्मानपत्रसङ्केतः आवश्यकः ।',
 'emailuser' => 'एतस्मै योजकाय ईपत्रं प्रेष्यताम्',
 'emailpage' => 'ई-मेल योजक',
+'emailpagetext' => 'अस्मै योजकाय विद्युन्मानपत्रं प्रेषयितुम् अधो दत्तप्रपत्रम् उपयोक्तुं शक्नोति । 
+[[Special:Preferences|your user preferences]] अत्र भवता विनिवेशितः वि-पत्रसङ्केतः सकाशात् इति स्थाने प्रतिभाति । अनेन स्वीकर्ता साक्षात् प्रत्युत्तरं दातुं प्रभविष्यति ।',
+'usermailererror' => 'पत्राचारपदार्थस्य प्रत्यागतदोषः ।',
+'defemailsubject' => '{{SITENAME}}"$1" इति योजकात् विद्युन्मानपत्रम् ।',
+'usermaildisabled' => 'योजकस्य विद्युन्मानपत्रं निष्क्रियम् ।',
+'usermaildisabledtext' => 'अस्यां विक्याम् अन्ययोजकेभ्यः विद्युन्मानपत्रं प्रेषयितुं नै शक्नोति ।',
+'noemailtitle' => 'विद्युन्मानपत्रसङ्केतः नास्ति ।',
+'noemailtext' => 'अस्य योजकस्य निरिदिष्टः विद्युन्मानपत्रसङ्केतः नास्ति ।',
+'nowikiemailtitle' => 'विद्युन्मानपत्रम् अननुमतम् ।',
+'nowikiemailtext' => 'अयं योजकः अन्ययोजकेभ्यः विद्युन्मानपत्राणि स्वीकार्तुं नेच्छति ।',
+'emailnotarget' => 'स्वीकर्तुः अस्तित्वविहीनम् अथवा अमान्यं योजकनाम  ।',
+'emailtarget' => 'स्वीकर्तुः योजकनाम लिखतु ।',
 'emailusername' => 'योजकनामन्:',
+'emailusernamesubmit' => 'उपस्थाप्यताम्',
+'email-legend' => '{{SITENAME}}  इति अन्ययोजकाय विद्युन्मानपत्रं प्रेषयतु ।',
 'emailfrom' => 'सकाशात्',
 'emailto' => 'सविधे:',
 'emailsubject' => 'विषयः',
 'emailmessage' => 'सन्देशः :',
 'emailsend' => 'प्रेषति',
+'emailccme' => 'सन्देशस्य प्रतिकृतिः मे विद्युन्मानपत्रसङ्केताय अपि प्रेषयतु ।',
+'emailccsubject' => '$1: $2 कृते अपि भवतः सन्देशस्य प्रकृतीः ।',
+'emailsent' => 'विद्युन्मानपत्रं प्रेषितम् ।',
+'emailsenttext' => 'भवतः विद्युन्मानपत्रसन्देशः प्रेषिताः ।',
+'emailuserfooter' => 'एतद्विद्युन्मानपत्रं {{SITENAME}} इत्यस्य योजपत्राचरव्यवस्थाद्वारा  $1 इत्यनेन $2 कृते प्रेषितम् ।',
+
+# User Messenger
+'usermessage-summary' => 'तान्त्रिकसन्देशानां त्यागः ।',
+'usermessage-editor' => 'तान्त्रिकसन्देशवाहकः ।',
 
 # Watchlist
 'watchlist' => 'मम अवेक्षणसूची',
 'mywatchlist' => 'मम अवेक्षणसूची',
 'watchlistfor2' => 'हि $1 $2',
+'nowatchlist' => 'अवलोकनावल्यां पदार्थः नास्ति ।',
+'watchlistanontext' => 'अवलोकनपट्टिकायां पुटं दृष्टुं सम्पादयितुं वा  $1  करोतु ।',
+'watchnologin' => 'न नामाभिलितम्',
+'watchnologintext' => 'अवलोकनावलीं परिवर्तयितुं भवता नामाभिलेखनं करणीयम् ।[[Special:UserLogin|logged in]]',
+'addwatch' => 'अवलोकनावलीं योजयतु ।',
 'addedwatchtext' => 'भवतः [[Special:Watchlist|ध्यानसूचिकायां]] "[[:$1]]" इत्येतत् योजितमस्ति।
 इदानींप्रभृति अस्मिन् पृष्ठे तथा अस्य चर्चापृष्ठे सन्तः परिवर्तनानि भवतः निरीक्षासूचिकायां द्रक्ष्यन्ते तथा च [[Special:RecentChanges|सद्यःपरिवर्तितानां सूचिकायां]] इदं पृष्ठं स्थूलाक्षरैः द्रक्ष्यते, यस्मात् भवान् सरलतया इदं पश्यतु <p>निरीक्षासूचिकातः निराकर्तुमिच्छति चेत्, "मा निरीक्षताम्" इत्यसमिन् नोदयतु।',
+'removewatch' => 'अवलोकनावलीतः अपनयतु ।',
 'removedwatchtext' => '"[[:$1]]" इति पृष्ठं [[Special:Watchlist|भवतः निरीक्षासूचिकातः]] निराकृतमस्ति।',
 'watch' => 'निरीक्षताम्',
 'watchthispage' => 'इदं पृष्ठं निरीक्षताम्',
 'unwatch' => 'मा निरीक्षताम्',
+'unwatchthispage' => 'अवलोकनेन अलम् ।',
+'notanarticle' => 'न आधेयं पुटम् ।',
+'notvisiblerev' => 'अन्ययोजकेन कृतम् अवतरणम् अपमर्जितम् ।',
+'watchnochange' => 'दर्शितावधौ अवलोकितपदार्थाः न सम्पादिताः ।',
 'watchlist-details' => '{{PLURAL:$1|$1 पृष्ठं|$1 पृष्ठानि}} भवतः अवेक्षणसूच्यां सन्ति, सम्भाषणपृष्ठानि नात्र गणितानि।',
+'wlheader-enotif' => '* विद्युन्मानपत्रस्य सूचनाः सक्रियाः ।',
+'wlheader-showupdated' => '* भवतः सन्दर्शनस्य पश्चात् परिवर्तितानि पुटानि स्थूलाक्षरैः निर्दिष्टानि ।',
+'watchmethod-recent' => 'अवलोकितपुटानां सद्यः सम्पादनस्य परीक्षणम् ।',
+'watchmethod-list' => 'सद्यः सम्पादनार्थम् अवलोकितपुटानां परीक्षणम् ।',
+'watchlistcontains' => 'भवतः अवलोकनावली $1 युक्तास्ति ।{{PLURAL:$1|page|pages}}.',
+'iteminvalidname' => "समस्या  '$1' इत्यनेन अस्ति । अमान्यं नाम ।",
+'wlnote' => "अधस्तात् {{PLURAL:$1|'''1''' परिवर्तनमस्ति|अन्तिमानि '''$1''' परिवर्तनानि सन्ति}},{{PLURAL:$2|गते दिवसे|'''$2''' गतेषु दिवसेषु}}, , $3, $4. इति",
 'wlshowlast' => 'अन्तिमानि ($1 होराः $2 दिनानि) $3 इति दर्श्यन्ताम्',
 'watchlist-options' => 'अवेक्षणसूच्याः विकल्पाः',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'निरीक्षते...',
 'unwatching' => 'निरीक्षाम् अपाकरोति...',
+'watcherrortext' => ' "$1" कृते अवलोकनावल्याः व्यवस्थापरिवर्तनावसरे दोषः संविधितः ।',
 
+'enotif_mailer' => '{{SITENAME}} सूचितः विद्युन्मानपत्रप्रेषकः ।',
+'enotif_reset' => 'सन्दर्शितानि इति सर्वपुटानि अङ्कयतु ।',
 'enotif_newpagetext' => 'इदम् एकं नवीनपृष्ठम्',
 'enotif_impersonal_salutation' => '{{SITENAME}} योजक',
+'changed' => 'परिवर्तितम् ।',
+'created' => 'सृष्टम् ।',
+'enotif_subject' => '{{SITENAME}}  $ पुटशीर्षकं $ परिवर्तितम्$ इत्यनेन ।',
+'enotif_lastvisited' => 'भवतः पूवसन्दर्शनस्य पश्चात् सवृत्तपरिवर्तनार्थं $1 पश्यतु ।',
+'enotif_lastdiff' => 'एतत्परिवर्तनं दृष्टुं $1 पश्यतु ।',
+'enotif_anon_editor' => 'अनामकः योजकः $1',
+'enotif_body' => 'आत्मीय $ अवलोकनबन्धो',
 
 # Delete
 'deletepage' => 'पृष्ठं निराकरोतु।',
 'confirm' => 'स्थिरीकरोतु',
+'excontent' => '"$1" आधेयः आसीत् ।',
+'excontentauthor' => 'आधेयः $1आसीत् । अपि च योगदाता तु "[[Special:Contributions/$2|$2]]" आसीत् ।',
+'exbeforeblank' => 'रिक्तीकरणात् पूर्वम् आधेयः "$1" आसीत् ।',
+'exblank' => 'पुटं रिक्तमासीत् ।',
 'delete-confirm' => 'विलुप्यताम् "$1"',
 'delete-legend' => 'विलुप्यताम्',
+'historywarning' => "' पूर्वसूचना ''' भवता अपमर्जनसिद्धपुटे बहुशः  $1 इतिहासयुक्तः अस्ति ।{{PLURAL:$1|revision|revisions}}:",
 'confirmdeletetext' => 'भवान् एकं पृष्ठं तस्य अखिलेन इतिहासेन सहितं अपाकर्तुं प्रवृत्तोऽस्ति। कृपया सुपुष्टीकरोतु यत् भवतः एतदेव आशयः, यद् भवता अस्य परिणामाः सुविज्ञाताः सन्ति तथा च भवता क्रियैषा [[{{MediaWiki:Policy-url}}| यथानीति]] सम्पाद्यते।',
 'actioncomplete' => 'कार्यं सम्पन्नम्',
 'actionfailed' => 'कर्मन् रिष्ट',
 'deletedtext' => '"$1" इत्येतद् अपाकृतमस्ति।
 सद्यःकृतानां अपाकरणानाम् अभिलेखः $2 इत्यस्मिन् पश्यतु।',
 'dellogpage' => 'अपाकरणानां सूचिका',
+'dellogpagetext' => 'सद्यः कालीनापमर्जितपुटानाम् आवली अधः अस्ति ।',
+'deletionlog' => 'अपमर्जनसूचिका ।',
+'reverted' => 'प्राचीनपुनरावृत्तिः पूर्ववत् कृता ।',
 'deletecomment' => 'कारणम् :',
 'deleteotherreason' => 'अपरं/अतिरिक्तं कारणम् :',
 'deletereasonotherlist' => 'इतर कारणम्',
+'deletereason-dropdown' => '*अपमर्जनस्य सामान्यकारणानि । 
+** लेखकस्य निवेदनम् । 
+** कृतिस्वाम्यस्य उल्लङ्घनम् । 
+** नाशकत्वम् ।',
+'delete-edit-reasonlist' => 'अपमार्जनकारणानि सम्पादयतु ।',
+'delete-toobig' => 'अस्य पुटास्य सम्पादनेतिहासः$1तः अधिकः {{PLURAL:$1|पुनरावृत्तिः}} इति कारणेन बृहत् अस्ति । 
+{{SITENAME}} इत्यस्य अकस्मात् प्रविदारणम् अवरोद्धुं तादृशपुटस्य अपमर्जनं निषिद्धम्  ।',
+'delete-warning-toobig' => ' $1 {{PLURAL:$1|पुनरावृत्तिः|पुनरावृत्तयः}} अस्मिन् पुटे विसृतः सम्पादनेतिहासः ।',
 
 # Rollback
+'rollback' => 'सम्पादनं निर्वर्तयतु ।',
+'rollback_short' => 'प्रत्याहरणम् ।',
 'rollbacklink' => 'प्रतिनिवर्त्यताम्',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|सम्पादनम्|सम्पादनानि}} प्रत्याहरतु ।',
+'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|सम्पादनम्|सम्पादनानि}} अधिकं प्रत्याहरतु ।',
+'rollbackfailed' => 'प्रत्यहरणम् असफलम् ।',
+'cantrollback' => 'सम्पादनं  पूर्ववत् प्रत्यानेतुं न शक्यते ।
+गतयोजकः केवलम् अस्यपुटस्य कर्ता ।',
+'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा कृतम्  [[:$1]] इत्यस्य गतसम्पादनं पूर्वतनस्थितौ प्रत्याहरणं न शक्यते । अत्रान्तरे कोऽप्यन्यः एतत्पुटं पुनस्सम्पादितवान् अथवा पूर्वमेव प्राचीनस्थितौ आनीतम् अस्ति ।
+अस्य पुटास्य अन्तिमसम्पादनं [[User:$3|$3]] ([[User talk:$3|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) इत्यनेन कृतम् ।',
+'editcomment' => "\"''\$1''\" इति सम्पादनसारः आसीत् ।",
+'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]])इत्यस्य सम्पादनम् अपमर्ज्य  [[User:$1|$1]] इति अन्तिमपुनरावृत्तिः ।',
+'revertpage-nouser' => '(योजकस्य नाम अपनीतम्) द्वारा कृतसम्पादनं पूर्वस्थितौ प्रत्याहृत्य तत्पूर्वतनस्य [[User:$1|$1]] द्वारा कृतपुनरावृत्तेः नूतनावृत्तिः कृता ।',
+'rollback-success' => '$1 इत्यस्य सम्पादनम् अपनयतु । 
+$2 द्वारा सम्पादितां अन्तिमावृत्तिं पुनस्थापयतु ।',
+
+# Edit tokens
+'sessionfailure-title' => 'सत्रस्य वैफल्यम् ।',
+'sessionfailure' => 'भवतः प्रवेशत्रेण सह कापि समस्या अस्ति इति भाति ।
+सत्रापहरणात् रक्षणस्य सावधानार्थं भवतः क्रियाकलापः अपनीतः ।
+निर्गत्य पूर्वपुटं गत्वा पुनः गत्वा प्रयत्नं करोतु ।',
 
 # Protect
 'protectlogpage' => 'सुरक्षासूची',
+'protectlogtext' => 'अधो दत्ता सुरक्षार्थं कृतपरिवर्ननानां सूचिका अस्ति । 
+वरतमानस्य सुरक्षितपुटानां सूचिकार्थम् अत्र [[Special:ProtectedPages|सुरक्षितपुटानां सूचिका]] पश्यतु ।',
 'protectedarticle' => '"[[$1]]" इत्येतद् संरक्षितमस्ति',
 'modifiedarticleprotection' => '"[[$1]]" इत्येतदर्थं सुरक्षा-स्तरः परिवर्तित: :',
+'unprotectedarticle' => '"[[$1]]"तः सुरक्षा अपमर्जिता ।',
+'movedarticleprotection' => 'सुरक्षणस्य स्तरः  "[[$2]]" तः परिवर्त्य   "[[$1]]" कृतः अस्ति ।',
+'protect-title' => '"$1" इत्यस्य सुरक्षास्तरं पश्यतु ।',
+'protect-title-notallowed' => '"$1" इत्यस्य सुरक्षास्तरं पश्यतु ।',
+'prot_1movedto2' => '[[$1]] इत्यस्य नामपरिवर्तनं कृत्वा [[$2]] इति कृतम् ।',
+'protect-badnamespace-title' => 'असुरक्षितं नामस्थानम् ।',
+'protect-badnamespace-text' => 'अस्मिन् नामस्थाने पुटानि सुरक्षितानि न भवन्ति ।',
+'protect-legend' => 'सुरक्षां दृढयतु ।',
 'protectcomment' => 'कारणम् :',
 'protectexpiry' => 'अवसानम् :',
 'protect_expiry_invalid' => 'अवसान-समयः अमान्योऽस्ति।',
 'protect_expiry_old' => 'अवसान-समयः अतीतोऽस्ति।',
+'protect-unchain-permissions' => 'अग्रिमान् सुरक्षाविकल्पान् निर्तालयतु ।',
 'protect-text' => "'''$1''' इति पृष्ठस्य कृते सुरक्षा-स्तरं भवान् अत्र दृष्टुं शक्नोति, तथा च तं परिवर्तयितुं शक्नोति।",
+'protect-locked-blocked' => "भवान् सुरक्शणस्य स्तरं परिवर्तयितुं नैव शक्नोति ।
+'''$1'' इति पुटस्य वर्तमाना स्थितिः एषा अस्ति ।",
+'protect-locked-dblock' => "सक्रियेन दत्तपाठतालनेन सुरक्षापत्राणि परिवर्तयितुं न शक्यते ।
+'''$1''' इत्यस्य वर्तमाना स्थितिः एषा अस्ति ।",
 'protect-locked-access' => "भवान् अस्य पृष्ठस्य सुरक्षा-स्तरं परिवर्तयितुम् अनुज्ञां न धारयति। '''$1''' इति पृष्ठस्य अधुनातनः सुरक्षा-स्तरः :",
 'protect-cascadeon' => 'इदं पृष्ठं वर्तमत्काले सुरक्षितमस्ति, यत इदं {{PLURAL:$1|निम्नलिखिते पृष्ठे |निम्नलिखितेषु पृष्ठेषु}} समाहितमस्ति {{PLURAL:$1|यस्मिन्|येषु}} सोपानात्मिका सुरक्षा प्रभाविनी अस्ति। भवान् अस्य पृष्ठस्य सुरक्षा-स्तरं परिवर्तयितुं शक्नोति, परं तेन सोपानात्मिका-सुरक्षा न परिवर्तयिष्यति।',
 'protect-default' => 'सर्वान् प्रयोक्तॄन् अनुज्ञापयतु।',
@@ -1452,32 +2363,95 @@ $2
 'protect-level-sysop' => 'प्रबंधकाः केवलाः',
 'protect-summary-cascade' => 'सोपानात्मकम्',
 'protect-expiring' => 'अवसानम् $1 (UTC)',
+'protect-expiring-local' => '$1 अपनीतम् ।',
 'protect-expiry-indefinite' => 'अनिश्चितकालः',
 'protect-cascade' => 'अस्मिन् पृष्ठे समाहितानि पृष्ठाणि सुरक्षितानि करोतु (सोपानात्मिका सुरक्षा)।',
 'protect-cantedit' => 'भवान् अस्य पृष्ठस्य सुरक्षा-स्तरं परिवर्तयितुं न शक्नोति, यतो भवान् इदं पृष्ठं संपादयितुं अनुज्ञां न धारयति।',
+'protect-othertime' => 'अन्यः समयः ।',
+'protect-othertime-op' => 'अन्यः समयः :',
+'protect-existing-expiry' => 'विद्यमानः समाप्तिसमयः  $3, $2',
+'protect-otherreason' => 'अपरं/अतिरिक्तं कारणम् :',
 'protect-otherreason-op' => 'इतर कारणम्',
+'protect-dropdown' => '*सुरक्षायाः सामान्यकारणानि । 
+** अत्यधिकं नाशकत्वम् ।
+** अत्यधिकं शुष्कसन्देशाः ।
+** अफलदायि सम्पादनयुद्धम्
+** अधिकसञ्चारयुक्तपुटानि ।',
+'protect-edit-reasonlist' => 'सुरक्षाकारणानि सम्पादयतु ।',
+'protect-expiry-options' => '१ होरा :1 hour,१दिनम्:1 day,१ सप्ताहः:1 week,सप्ताहद्वयम्:2 weeks,१मासः:1 month,३मासाः:3 months,६मासाः:6 months,१ वर्षम् :1 year, अनन्तम् :infinite',
 'restriction-type' => 'अनुमतिः:',
 'restriction-level' => 'सुरक्षा-स्तरः :',
+'minimum-size' => 'कनिष्टाकारः ।',
+'maximum-size' => 'गरिष्टाकारः ।',
+'pagesize' => 'बैट्स् ।',
 
 # Restrictions (nouns)
 'restriction-edit' => 'सम्पाद्यताम्',
+'restriction-move' => 'चलनम् ।',
 'restriction-create' => 'सृज्यताम्',
 'restriction-upload' => 'आरोप्यताम्',
 
 # Restriction levels
 'restriction-level-sysop' => 'पूर्णतया संरक्षितम्',
 'restriction-level-autoconfirmed' => 'अर्धसंरक्षितम्',
+'restriction-level-all' => 'कोऽपि स्तरः ।',
 
 # Undelete
+'undelete' => 'अपमर्जितपुटानि अवलोकयतु ।',
+'undeletepage' => 'अपमर्जितपुटानि दृष्ट्वा पुनस्थापयतु ।',
+'undeletepagetitle' => "'''अधः [[:$1|$1]] इत्येतेषाम् अपनीतावृत्तीनां दर्शनं भवति ।",
+'viewdeletedpage' => 'अपमर्जितपुटानि अवलोकयतु ।',
+'undeletepagetext' => '{{PLURAL:$1|$1पुटं|$1 पुटानि}} इत्येतानि अपनीतानि किन्तु  एतानि लेखागारे सन्ति अपि च पुनस्थापितानि कर्तुं शक्यते ।',
+'undelete-fieldset-title' => 'पुनरावृत्तीः पुनस्थापयतु ।',
+'undeleteextrahelp' => "पुटानाम् इतिहासं प्रत्याहर्तुं चिह्नितमञ्जूषाः अवचिताः कृत्वा '''''{{int:undeletebtn}}''''' इत्येतत् तुदतु ।  
+विचितेतिहासं प्रत्याहर्तुं तद्वृत्तीनां पार्श्वगतचिह्नमञ्जूषासु चयनचिह्नानि विनिवेशयतु । पश्चात्'''''{{int:undeletebtn}}''''' एतत् तुदतु  ।",
+'undeleterevisions' => '$1 {{PLURAL:$1|पुनरावृत्तिः}}',
+'undeletehistory' => 'यदि भवान् पुटानि पुनस्थापयितुमिच्छति तर्हि पुनरवृत्तीनां सर्वेतिहासाः पुनस्थापितानि भवन्ति । 
+अपनयनात् परं यदि तस्मिन् एव नाम्नि नूतनपुटनिर्माणं करोति चेत् तस्य पुनस्थापितावृत्तिः पूर्वेतिहासे एव दृश्यते ।',
+'undeleterevdel' => 'यदि पुनस्थापनस्य फलस्वरूपशीर्षकपुटं, सञ्चिकां, पुनरावृत्तिं वा आंशिकरूपेण नाशयति चेत् एतत् न क्रियते ।
+एतादस्थितौ नूतनापनीताः पुनरावृत्तीनाम् अपचयनं असङ्गोपनं वा कुर्याट् ।',
+'undeletehistorynoadmin' => 'एतत्पुटम् अपमर्जितम् ।
+अधः अपमर्जनस्य कारणं दर्शितम् । अपमर्जनात् पूर्वं ये योजकाः सम्पादनं कृतवन्तः तेषां विषयः अपि दर्शिताः । 
+अपमर्जितपुनरावृत्तीनां वास्तवपाठः केवलं प्रशासकै दृष्टुं शक्यते ।',
+'undelete-revision' => '$1 ($4 इत्येतं $5 समये $3 द्वारा निर्मितम्) इत्येतेषाम् अपमर्जितपुनरावृत्तयः ।',
+'undeleterevision-missing' => 'अमान्या अथवा विलुप्ता पुनरावृत्तिः । भवान् प्रदुष्टानुबन्धयुक्तः अथवा पुनरावृत्तिः पुनस्थापिता अथवा लेखागारात् अपनीता ।',
+'undelete-nodiff' => 'पूर्वतनपुनरावृत्तिः न दृष्टा ।',
+'undeletebtn' => 'पुन्थापयतु ।',
 'undeletelink' => 'दृश्यताम्/प्रत्यानीयताम्',
 'undeleteviewlink' => 'दृश्यताम्',
+'undeletereset' => 'पुनर्योजयतु ।',
+'undeleteinvert' => 'चयनं परिवर्तयतु ।',
 'undeletecomment' => 'कारणम् :',
+'undeletedrevisions' => '{{PLURAL:$1| पुनरावृत्तिः पुनस्थापिता|$1 पुनरावृत्तयः पुनस्थापिताः}} अस्ति|सन्ति ।',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 पुनरावृत्तिः|$1 पुनरावृत्तयः}} अपि च {{PLURAL:$2|१सञ्चिका|$2 सञ्चिकाः}} पुनस्थापिताः सन्ति ।',
+'undeletedfiles' => '{{PLURAL:$1|१सञ्चिका|$1 सञ्चिकाः}} पुनस्थापिताः ।',
+'cannotundelete' => 'अनपमर्जनम् असफलम् । 
+प्रथमं कोऽप्यन्यः पुटम् अपमर्जितवान् स्यात् ।',
+'undeletedpage' => "'''$1 इत्येतत् पुनस्थापितम् अस्ति । 
+सद्यः अपनीतानि पुनस्थापितानि च पुटाणि ज्ञातुम् अत्र पश्यतु । [[Special:Log/delete|अपनयनप्रवेशः]] ।",
+'undelete-header' => 'सद्यः एव अपनीतानां पुटानां दर्शनार्थं अत्र प्रविशतु । [[Special:Log/delete|अपनीतावली]] ।',
+'undelete-search-title' => 'अपमर्जितपुटानि अन्विषतु ।',
+'undelete-search-box' => 'अपमर्जितपुटानि अन्विषतु ।',
+'undelete-search-prefix' => 'इत्यनेन आरब्धपुटानि दर्शयतु ।',
 'undelete-search-submit' => 'अन्वेषणम्',
+'undelete-no-results' => 'अपमर्जनलेखागारे अमेलपुटानि लब्धानि ।',
+'undelete-filename-mismatch' => 'समयमुद्रया सञ्चिकापुनरावृत्तिः अनपमर्जितुं शक्यते । यतः $1 इति सञिकानाम अननुरूपम् ।',
+'undelete-bad-store-key' => 'समयमुद्रया सञ्चिकापुनरावृत्तिः अनपमर्जनं  नैव शक्नोति । ।$1: यतः अपमर्जनात् पूर्वमेव विलुप्तम् ।',
+'undelete-cleanup-error' => 'दोषापमारजनस्य अनुपयुक्ता लेखागारसञ्चिका "$1" ।',
+'undelete-missing-filearchive' => '$1 इति सञ्चिकालेखागारस्य अभिज्ञापकं पुनस्थापितुं नैव शक्यते । यतः एतत् दत्तपाठे नास्ति ।
+एतत् पूर्वमेव अनपमर्जितं स्यात् ।',
+'undelete-error' => 'पुटापमर्जने दोषः ।',
+'undelete-error-short' => 'सञ्चिकानपमर्जने दोषः : $1',
+'undelete-error-long' => '!!सञ्चिकानपमर्जने आगता समस्या ।$1',
+'undelete-show-file-confirm' => '$2 तः $3 मध्ये "<nowiki>$1</nowiki>" इति सञ्चिकायाः निरस्तं परिष्करणं भवान् नूनं द्रष्टुम् इच्छति ?',
 'undelete-show-file-submit' => 'आम्',
 
 # Namespace form on various pages
 'namespace' => 'नामाकाशः :',
 'invert' => 'चयनं विपरीतीकरोतु',
+'tooltip-invert' => 'चितनामस्थाने परिवर्तनं गोपयितुं मञ्जूषाम् अर्गलयतु ।',
+'namespace_association' => 'सम्बद्धं नामस्थानम् ।',
+'tooltip-namespace_association' => 'चितनामस्थानेन सह सम्बद्धं विषयनामस्थानम् अथवा सम्भाषणम् अपि उपादातुम् इमां मञ्जूषाम् अर्गलयतु ।',
 'blanknamespace' => '(मुख्यः)',
 
 # Contributions
@@ -1485,15 +2459,24 @@ $2
 'contributions-title' => '$1 इत्येतस्य कृते योजकानां योगदानानि',
 'mycontris' => 'मम योगदानानि',
 'contribsub2' => '$1 इत्येतदर्थम् ($2)',
+'nocontribs' => 'एतादृशयोग्यताभिः समं परिवर्तनानि न दृष्टानि ।',
 'uctop' => '(शीर्षम्)',
 'month' => 'अस्मात् मासात् (प्राक्तनानि च):',
 'year' => 'अस्मात् वर्षात् (प्राक्तनानि च):',
 
 'sp-contributions-newbies' => 'नूतनयोजकानां केवलं योगदानानि दर्श्यन्ताम्',
+'sp-contributions-newbies-sub' => 'नूतनलेखार्थम् ।',
+'sp-contributions-newbies-title' => 'नूतनलेखार्थं योजकयोगदानम् ।',
 'sp-contributions-blocklog' => 'अवरुद्धा सूची',
+'sp-contributions-deleted' => 'योजकयोगदानम् अपमर्जतु ।',
 'sp-contributions-uploads' => 'आरोप्यताम्',
 'sp-contributions-logs' => 'लोग्स',
 'sp-contributions-talk' => 'सम्भाषणम्',
+'sp-contributions-userrights' => 'योजकाधिकारस्य व्यवस्थापनम् ।',
+'sp-contributions-blocked-notice' => 'अयं प्रयोक्ता सम्प्रति अवरुद्धः वर्तते।
+नूतनतमा अवरोधाभिलेख-प्रविष्टिः सन्दर्भार्थम् अधस्तात् प्रदत्ताऽस्ति:',
+'sp-contributions-blocked-notice-anon' => 'अयं प्रयोक्ता सम्प्रति अवरुद्धः वर्तते।
+नूतनतमा अवरोधाभिलेख-प्रविष्टिः सन्दर्भार्थम् अधस्तात् प्रदत्ताऽस्ति:',
 'sp-contributions-search' => 'योगदानानि अन्विष्यन्ताम्',
 'sp-contributions-username' => 'आइ.पी.सङ्केतः अथवा योजकनाम :',
 'sp-contributions-toponly' => 'सम्पादनानां नूतनावृत्तिमात्रं दर्श्यताम्',
@@ -1505,6 +2488,7 @@ $2
 'whatlinkshere-page' => 'पृष्ठम् :',
 'linkshere' => "अधोलिखितानि पृष्ठाणि '''[[:$1]]''' इत्येतद् प्रति संबंधनं कुर्वन्ति :",
 'nolinkshere' => "'''[[:$1]]'''इत्येतेन न किञ्चित् पृष्ठं संयुक्तम्",
+'nolinkshere-ns' => "चितनामस्थानात्  '''[[:$1]]''' इत्येनं योजनयोग्यं पुटं नास्ति  ।",
 'isredirect' => 'अनुप्रेषण-पृष्ठम्',
 'istemplate' => 'मिलापयतु',
 'isimage' => 'सञ्चिकासंबन्ध',
 'whatlinkshere-filters' => 'निस्यन्दनानि',
 
 # Block/unblock
+'autoblockid' => 'स्वयं पिहितम् । $1',
+'block' => 'योजकम् अवरुणद्धु ।',
+'unblock' => 'योजकम् अनवरुणद्धु ।',
 'blockip' => 'प्रयोक्तारं निरुध्नातु',
+'blockip-title' => 'योजकम् अवरुणद्धु ।',
+'blockip-legend' => 'योजकम् अवरुणद्धु ।',
+'blockiptext' => 'विशिष्टं  IP सङ्केतम् अथवा योजकनाम लेखानाधिकारस्य प्राप्तये निम्नदत्तपत्रस्य उपयोगं करोतु ।
+केवलं नाशकत्वम् अवरोद्धुं एतस्य उपयोगं करोतु । [[{{MediaWiki:Policy-url}}|नीतिः]] इत्यानुसारं करणीयम् ।
+अधः विशिष्टं कारणमपि लिखतु ।',
+'ipadressorusername' => 'आइ.पी.सङ्केतः अथवा योजकनाम :',
+'ipbexpiry' => 'समाप्तिः :',
 'ipbreason' => 'कारणम् :',
+'ipbreasonotherlist' => 'अन्यत् कारणम्',
+'ipbreason-dropdown' => '* अवरोधस्य सामान्यानि कारणानि ।  
+** मिथ्या योजकनाम । 
+** एकाधिकयोजकस्थानं निर्मीय तेषां दुरुपयोगः । 
+** असत्यविषयानाम् उत्तारणम् । 
+** पुटेषु अवकरपूरणम् । 
+** पुटेभ्यः पदार्थान् अपनयनम् । 
+** बाह्यजालस्थानाम् असम्बद्धानुबन्धानाम् संयोजनम् । 
+** योजकानां पीडनम् ।',
+'ipb-hardblock' => 'नामाभिलेखितयोजकान् अनेन ऐपि सङ्केतेन सम्पादनं निवारयतु ।',
+'ipbcreateaccount' => 'योजकस्थानस्य निर्माणं निवारयतु ।',
+'ipbemailban' => 'योजकस्य विद्युन्मानसन्देशप्रेषणम् अवरुणद्धु ।',
+'ipbenableautoblock' => 'अनेन योजकेन उपयुक्तम् ऐपिसङ्केतम्, अग्रे अनेन योजकेन सम्पादयितुं प्रयतमानम् ऐपिसङ्केतं च स्वयम् अवरुद्धं करोतु ।',
+'ipbsubmit' => 'एतं योजकम् अवरुणद्धु ।',
+'ipbother' => 'अन्यः समयः ।',
 'ipboptions' => '२ होराः:2 hours,१ दिनम्:1 day,३ दिनानि:3 days,१ सप्ताहः:1 week,२ सप्ताहौ:2 weeks,१ मासः:1 month,३ मासाः:3 months,६ मासाः:6 months,१ वर्षः:1 year,अनन्तम्:infinite',
 'ipbotheroption' => 'अन्य',
+'ipbotherreason' => 'अपरं/अतिरिक्तं कारणम् :',
+'ipbhidename' => 'सम्पादनेभ्यः आवलीभ्यः च योजकनाम सङ्गोपयतु ।',
+'ipbwatchuser' => 'अस्य योजकस्य योजकपुटानि सम्भाषणपुटानि च अवलोकयतु ।',
+'ipb-disableusertalk' => 'एतं योजकम् अवरोधकाले स्वस्य सम्भाषणपुटस्य सम्पानात् निवारयतु ।',
+'ipb-change-block' => 'एतैः विन्यासैः योजकं पुनः अवरुणद्धु ।',
+'ipb-confirm' => 'अवरोधं दृढयतु ।',
+'badipaddress' => 'अमान्यः ऐपिसङ्केतः ।',
+'blockipsuccesssub' => 'अवरोधः सफलः ।',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]इत्येतत् अवरुद्धम् । <br />
+अवरोधानां समीक्षां करोतु । [[Special:BlockList|IP अवरोधसूचिका]]',
+'ipb-blockingself' => 'भवान् स्वयम् अवरोधने निरतः । निश्चयेन स्वावरोधनम् इच्छति वा ?',
+'ipb-confirmhideuser' => 'योजकगोपनस्य पिञ्जं निपीडयन् भवान् योजकावरुद्धिं यतते । एतत् सर्वावलीषु सर्वप्रवेशसूचिकासु च योजकनाम निग्रहति । भवान् निश्चयेन एतत् कर्तुमिच्छति वा ?',
+'ipb-edit-dropdown' => 'अवरोधकारणानि सम्पादयतु ।',
+'ipb-unblock-addr' => '$1 अनवरोधनं करोतु ।',
+'ipb-unblock' => 'योजकनाम अथवा ऐपिसङ्केतम् अवरुणद्धु ।',
+'ipb-blocklist' => 'वर्तमानावरोधान् अवलोकयतु ।',
+'ipb-blocklist-contribs' => '$1कृते योगदानम् ।',
+'unblockip' => 'योजकसु अवरोधं परिहरतु ।',
+'unblockiptext' => 'सद्यः अवरुद्धान् ऐपिसङ्केतान् अथवा अवरुद्धानि योजकनामानि पुनस्संस्थाप्य लिखनावकाशं प्राप्तुम् अधो दत्तप्रपत्रस्य उपयोगं करोतु ।',
+'ipusubmit' => 'अवरोधम् अपनयतु ।',
+'unblocked' => '[[User:$1|$1]] इति योजकस्य अवरोधम् अपनयतु ।',
+'unblocked-range' => '$1 इत्येतस्य अवरोधः कृतः ।',
+'unblocked-id' => '$1 इत्यस्य अवरोधः अपनीतः ।',
+'blocklist' => 'अवरुद्धाः योजकाः ।',
 'ipblocklist' => 'अवरुद्धाः योजकाः',
+'ipblocklist-legend' => 'अवरुद्धयोजकं पश्यतु ।',
+'blocklist-userblocks' => 'योजकस्थानावरुद्धिं गोपयतु ।',
+'blocklist-tempblocks' => 'तात्कालिकावरुद्धिं गोपयतु ।',
+'blocklist-addressblocks' => 'एकाकिनम् ऐपि अवरोधं गोपयतु ।',
+'blocklist-rangeblocks' => 'प्रान्तीयावरोधान् गोपयतु ।',
+'blocklist-timestamp' => 'समयमुद्रा',
+'blocklist-target' => 'लक्ष्यम्',
+'blocklist-expiry' => 'नश्यति',
+'blocklist-by' => 'वरोधनस्य प्रशसनम् ।',
+'blocklist-params' => 'विस्तारान् अवरुणद्धु ।',
 'blocklist-reason' => 'कारणम्',
 'ipblocklist-submit' => 'अन्वेषणम्',
+'ipblocklist-localblock' => 'स्थानीयावरोधः ।',
+'ipblocklist-otherblocks' => 'अन्याः{{PLURAL:$1|अवरोधाः}}',
+'infiniteblock' => 'अनन्तम् ।',
+'expiringblock' => '$1 इत्यस्य $2समये समाप्तिः भवति ।',
+'anononlyblock' => 'अनामकः केवलम् ।',
+'noautoblockblock' => 'स्वयमवरोधः निष्क्रियः ।',
+'createaccountblock' => 'योजकस्थाननिर्माणं निष्क्रियम् ।',
+'emailblock' => 'विद्युन्मानपत्रं निष्क्रियम् ।',
+'blocklist-nousertalk' => 'स्वस्य सम्भाषणपुटं सम्पादयितुं न शक्यते ।',
+'ipblocklist-empty' => 'अवरोधावली रिक्ता अस्ति ।',
+'ipblocklist-no-results' => 'अभ्यर्थितः ऐपिसङ्केतः अथवा अभ्यर्थितः योजकनाम अवरुद्धं न ।',
 'blocklink' => 'अवरोधः क्रियताम्',
 'unblocklink' => 'निरोधः अपास्यताम्',
 'change-blocklink' => 'विभागः परिवर्त्यताम्',
 'contribslink' => 'योगदानम्',
+'emaillink' => 'विद्युन्मानपत्रं प्रेषयतु ।',
+'autoblocker' => 'भवतः ऐपि सङ्केतः स्वयम् अवरुद्धः यः सद्यः काले एव [[User:$1|$1]]" इत्यनेन उपयुक्तः । 
+$1 इत्यस्य अवरोधस्य कारणं तु "$2" अस्ति ।',
 'blocklogpage' => 'अवरोधानां सूची',
+'blocklog-showlog' => 'अयम् एपि सङ्केतः पूर्वमेव अवरुद्धः । 
+अवरोधसूची आधाराय अधः दत्तः अस्ति :',
+'blocklog-showsuppresslog' => 'अयं योजकः पूर्वमेव अवरुद्धः सङ्गुप्तः च  ।
+निग्रहकरणं तु अधः उल्लिखितम् ।',
 'blocklogentry' => '[[$1]] इत्येतद् अवरुद्धम्, $2 $3 इति अवसान-समयेन सह',
+'reblock-logentry' => '[[$1]] इत्यस्य अवरोधस्य विन्यासः परिवर्तितः अयं $2 $3 समये विनश्येत् ।',
+'blocklogtext' => 'इयम् अवरुद्धानवरुद्धप्रक्रियायाः अवलोकनस्य सूचिका । 
+स्वयम् अवरुद्धानाम् ऐपिसङ्केतानाम् आवली न कृता ।
+सद्यः उपयोगनिषेधस्य अवरोधानाम् आवलीप्राप्तये [[Special:BlockList|block list]] अवलोकयतु ।',
 'unblocklogentry' => 'अनिरुद्धम् $1',
+'block-log-flags-anononly' => 'अनामकाः योजकाः केवलम् ।',
 'block-log-flags-nocreate' => 'सदस्यता प्राप्तिः अवरुद्धा अस्ति',
+'block-log-flags-noautoblock' => 'स्वयमवरोधः निष्क्रियः ।',
+'block-log-flags-noemail' => 'विद्युन्मानपत्रं निष्क्रियम् ।',
+'block-log-flags-nousertalk' => 'स्वस्य सम्भाषणपुटं सम्पादयितुं न शक्यते ।',
+'block-log-flags-angry-autoblock' => ' उन्नतीकृतः स्वयमवरोधः सक्रियः ।',
+'block-log-flags-hiddenname' => 'योजकस्य नाम सङ्गुप्तम् ।',
+'range_block_disabled' => ' प्रादेशिकावरोधस्य प्रशासकस्य सामर्थ्यं निष्क्रियम् ।',
+'ipb_expiry_invalid' => 'अवसानसमयः अमान्योऽस्ति।',
+'ipb_expiry_temp' => 'सङ्गुप्तयोजकनामावरोधः शश्वतः भवेत् ।',
+'ipb_hide_invalid' => 'एतस्य योजकस्थानस्य निग्रहः असाध्यः । अस्मिन् अनेकानि सम्पादनानि स्युः ।',
+'ipb_already_blocked' => '"$1" इत्येषः पूर्वमेव अवरुद्धः ।',
+'ipb-needreblock' => '$1 इत्येषः पूर्वमेव अवरुद्धः विन्यासं परिवर्तयितुमिच्छति वा ?',
+'ipb-otherblocks-header' => 'अन्याः {{PLURAL:$1|अवरोधः |अवरोधाः}}',
+'unblock-hideuser' => 'एतं योजकम् अवरोधात् विमोचयितुं न शक्यते । यतः अस्य योजकनाम सङ्गुप्तम् ।',
+'ipb_cant_unblock' => ' दोषः : $1 इति अवरुद्धः पत्रसङ्केतः न दृष्टः । प्रायः तावत् पूर्वमेव उत्तारितम् ।',
+'ipb_blocked_as_range' => 'दोषः : $1 इति ऐपिसङ्केतः साक्षात् अवरुद्धः न अपि च विमोचनं न शक्यते ।
+$2 इति प्रकारस्य अवरोधं कर्तुं शक्यते यत् अनवरोधमिच्छति ।',
+'ip_range_invalid' => 'अमान्यः ऐपिप्रकारः',
+'ip_range_toolarge' => '/$1 तः अधिकं वृहत्प्रकारकः अवरोधः नानुमतः ।',
+'blockme' => 'माम् अवरुणद्धु ।',
+'proxyblocker' => 'प्रतिहस्तकः अवरोधकः ।',
+'proxyblocker-disabled' => 'अयं कार्यकलापः निष्क्रियः ।',
+'proxyblockreason' => 'भवतः ऐपि सङ्केतः अवरुद्धः  यतः अयं कश्चन मुक्तप्रतिहस्तकः । 
+अन्तर्जालसेवादायकं सम्पर्कयतु गभीरायाः सुरक्षासमस्यायाः विषये सूचयतु च',
 'proxyblocksuccess' => 'समापित ।',
+'sorbsreason' => 'DNSBL उपयोगः {{SITENAME}} कृतस्य भवतः ऐपिसङ्केतः मुक्तप्रतिहस्तकः इति आवलीगतः',
+'sorbs_create_account_reason' => 'DNSBL उपयुक्तः {{SITENAME}} अतः भवतः ऐपिसङ्केतः अवरुद्धः यतः अयं मुक्तप्रतिहस्तकः इति आवलीगतः । अतः भवान् योजकस्थानं निर्मातुं न शक्नोति ।',
+'cant-block-while-blocked' => 'अन्ययोजकान् अवरोद्धुं भवान् नैव शक्नोति यतः भवान् अवरुद्धः ।',
+'cant-see-hidden-user' => 'यं योजकः अवरोद्धं भवान् प्रयतमानः सः पूर्वमेव अवरुद्धः सङ्गुप्तः च ।
+भवान् तु योजकसङ्गोपनाधिकारयुक्तः न । अतः भवान् योजकावरोधं दृष्टुं सम्पादयितुं वा न शक्नोति ।',
+'ipbblocked' => 'भवान् अन्ययोजकान् अवरोद्धुम् विमोचयितुं वा न शक्नोति । यतः भवान् तु अवरुद्धः अस्ति ।',
+'ipbnounblockself' => 'भवान् भवन्तं मोचयितुं नैव शक्नोति ।',
+
+# Developer tools
+'lockdb' => 'दत्तपाठान् अवरुणद्धु ।',
+'unlockdb' => 'दत्तपाठान् अनवरुणद्धु ।',
+'lockdbtext' => 'दत्तपाठानाम् अवरोधः सर्वयोजकानां सम्पादनसामर्थ्यं लुम्पति । तेषाम् आद्यतां परिवर्तयतु । तेषाम् अवलोकनावलीं सम्पादयतु । परिवर्तनावश्यकदतापाठान् अपि परिवर्तयतु । भवान् एतदेव कर्तुकामः इति दृढयतु । यदा भवतः निर्वहणं भविष्यति तदा दत्तपाठाः अनवरुद्धाः भविष्यन्ति ।',
+'unlockdbtext' => 'दत्तपाठानाम् अवरोधः सर्वयोजकानां सम्पादनसामर्थ्यं लुम्पति । तेषाम् आद्यतां परिवर्तयतु । तेषाम् अवलोकनावलीं सम्पादयतु । परिवर्तनावश्यकदतापाठान् अपि परिवर्तयतु । भवान् एतदेव कर्तुकामः इति दृढयतु ।',
+'lockconfirm' => 'आम्, अहं निश्चयेन दत्तपाठान् अवरोद्धुम् इच्छामि ।',
+'unlockconfirm' => 'आम्, अहं निश्चयेन दत्तपाठान् अनवरोद्धुम् इच्छामि ।',
+'lockbtn' => 'दत्तपाठान् अवरुणद्धु ।',
+'unlockbtn' => 'दत्तपाठान् विमोचयतु ।',
+'locknoconfirm' => 'दृढीकरणमञ्जूषां भवान् न अर्गलितवान् ।',
+'lockdbsuccesssub' => 'दत्तपाठावरोधः सफलः ।',
+'unlockdbsuccesssub' => 'दत्तपाठावरोधः विमुक्तः ।',
+'lockdbsuccesstext' => 'दत्तपाठाः तालिताः । ।<br />
+भवतः निर्वहणस्य पश्चात् वितालनं स्मरतु [[Special:UnlockDB|वितालनम्]] ।',
+'unlockdbsuccesstext' => 'दत्तपाठाः वितालिताः ।',
+'lockfilenotwritable' => 'दत्तपाठः कपाटनस्य सञ्चिका लेखनार्हा न ।
+दत्तपाठान् कपाटयितुम् अकापाटयितुं वा जालवितारकेन लेखनार्हः आवश्यक्तः ।',
+'databasenotlocked' => 'दत्तपाठाः कपाटिताः न ।',
+'lockedbyandtime' => '(द्वारा {{GENDER:$1|$1}} इत्यस्मिन् $2 अत्र $3)',
 
 # Move page
+'move-page' => ' $1 चालयतु ।',
 'move-page-legend' => 'पृष्ठं रक्ष्यताम्',
+'movepagetext' => "अधोतत्तं प्रपत्रमुपयुज्य  पुटस्य पुनर्नामकरणं करिष्यति । अस्य पूर्णेतिहासः नूतनेन नाम्ना सह गच्छति । 
+नूतनशीर्षकस्य प्राचीनशीर्षकं पुनर्निदिष्टं  भवति । 
+भवान् पुनर्निदेशान् उन्नतीकरोतु यत् स्वयं मूलशीर्षकं निदेशति । 
+यदि भवान् एवं कर्तुं नैव शक्नोति तर्हि  [[Special:DoubleRedirects|द्विगुणम्]]पुनर्दिदेशाः[[Special:BrokenRedirects|भग्नपुनर्निदेशाः]] एतदर्थम् अवश्यं परिशीलयतु । 
+एतत् भवतः दायित्वं यत् अनुबन्धाः सुनिश्चितं स्थानं नयेयुः ।
+यदि नूतनशीर्षकस्य लेखः पूर्वमेवास्ति तर्हि स्थानान्तरणं न भविष्यति । नूतनशीर्षकयुक्तलेखः रिक्तमस्ति अथवा कुत्रचित् अनुप्रेषणं करोति अपि च अनेन सह प्राचीनेतिहासः नास्ति चेत् स्थानान्तरणं न सम्भविष्यति ।
+अर्थात् यदि भवता दोषः संवृत्तः चेत् भवान् पुनः प्राचीननाम्ना एतत्पुटं स्थानान्तरणं कर्तुं शक्नोति । अपि च किञ्चिदपि वर्तमानपुटस्य स्थाने एतत् स्थानान्तरणं कर्तुं नैव शक्नोति ।
+पूर्वसूचना : यदि पुटं प्रसिद्धं तर्हि तस्य एतत् बृहत् अथवा अकस्मात् परिवर्तनं भवितुमर्हति ।
+अनुवर्तनात् पूर्वम् अस्य परिणामं सम्यक् चिन्तयतु ।
+
+'''सूचना'''
+स्थानान्तरकरणेन कस्मिंश्चित् महालेखे अनपेक्षितं परिवर्तनं सम्भवेत् ।
+अतः भवति निवेदनम् अस्ति यत् भवान् पूवमेव परिणामं चित्नयतु ।",
+'movepagetext-noredirectfixer' => "अधोतत्तं प्रपत्रमुपयुज्य  पुटस्य पुनर्नामकरणं करिष्यति । अस्य पूर्णेतिहासः नूतनेन नाम्ना सह गच्छति । 
+नूतनशीर्षकस्य प्राचीनशीर्षकं पुनर्निदिष्टं  भवति । 
+भवान् पुनर्निदेशान् उन्नतीकरोतु यत् स्वयं मूलशीर्षकं निदेशति । 
+यदि भवान् एवं कर्तुं नैव शक्नोति तर्हि  [[Special:DoubleRedirects|द्विगुणम्]]पुनर्दिदेशाः[[Special:BrokenRedirects|भग्नपुनर्निदेशाः]] एतदर्थम् अवश्यं परिशीलयतु । 
+एतत् भवतः दायित्वं यत् अनुबन्धाः सुनिश्चितं स्थानं नयेयुः ।
+यदि नूतनशीर्षकस्य लेखः पूर्वमेवास्ति तर्हि स्थानान्तरणं न भविष्यति । नूतनशीर्षकयुक्तलेखः रिक्तमस्ति अथवा कुत्रचित् अनुप्रेषणं करोति अपि च अनेन सह प्राचीनेतिहासः नास्ति चेत् स्थानान्तरणं न सम्भविष्यति ।
+अर्थात् यदि भवता दोषः संवृत्तः चेत् भवान् पुनः प्राचीननाम्ना एतत्पुटं स्थानान्तरणं कर्तुं शक्नोति । अपि च किञ्चिदपि वर्तमानपुटस्य स्थाने एतत् स्थानान्तरणं कर्तुं नैव शक्नोति ।
+पूर्वसूचना : यदि पुटं प्रसिद्धं तर्हि तस्य एतत् बृहत् अथवा अकस्मात् परिवर्तनं भवितुमर्हति ।
+अनुवर्तनात् पूर्वम् अस्य परिणामं सम्यक् चिन्तयतु ।
+
+'''सूचना'''
+स्थानान्तरकरणेन कस्मिंश्चित् महालेखे अनपेक्षितं परिवर्तनं सम्भवेत् ।
+अतः भवति निवेदनम् अस्ति यत् भवान् पूवमेव परिणामं चित्नयतु ।",
+'movepagetalktext' => 'सम्बद्धसम्भाषणपुटानि अनेन सह स्थानान्तरितानि भवन्ति अन्यथा  
+* भवान् पुटं अन्यस्थानान्तरं कुर्वन् अस्ति । 
+* अस्मिन् नाम्नि सम्भाषणपुटं पूर्वनिर्मितमस्ति अस्थवा  
+* अधोदत्ताम् अर्गलनमञ्चूषाम् उत्पाटितवान् । 
+अस्मिन् विषये यदि इच्छति तर्हि भवता पुटानि चालनीयानि अथवा संयोजनीयानि ।',
 'movearticle' => 'पृष्ठं चाल्यताम्',
+'moveuserpage-warning' => 'पूर्वसूचा : योजकपुटं चालयितुम् उद्युक्तः । स्मरतु केवलं पुटं स्थानान्तरितं भवति न तु योजकनाम परिवर्तनं न भविष्यति ।',
+'movenologin' => 'न नामाभिलितम्',
+'movenologintext' => ' [[Special:UserLogin|logged in]] पञ्जीकृतयोजकः भवता नामाभिलेखनं करणीयं भवति ।',
+'movenotallowed' => 'पुटानि स्थानान्तरियितुम् अनुमतिः नाश्ति ।',
+'movenotallowedfile' => 'सञ्चिकाः स्थानान्तरयितुम् अनुमतिः नास्ति ।',
+'cant-move-user-page' => 'योजकपुटानि स्थानन्तरितुम् अनुमतिः ते नास्ति । (उपपुटानि विना)',
+'cant-move-to-user-page' => 'किञ्चिनपुटं योजकपुटं स्थानान्तरितुं ते अनुमतिः नास्ति । (योजकपुटं विना)',
 'newtitle' => 'नूतनं शीर्षकं प्रति :',
 'move-watch' => 'इदं पृष्ठं निरीक्षताम्।',
 'movepagebtn' => 'पृष्ठं चालयतु।',
 'pagemovedsub' => 'चालनं सिद्धम्।',
 'movepage-moved' => '\'\'\'"$1" इत्येतद् "$2" इत्येतद् प्रति चालितमस्ति \'\'\'',
+'movepage-moved-redirect' => 'पुनर्निदेशः सृष्टः ।',
+'movepage-moved-noredirect' => 'पुनर्निदेशनसृष्टिः निग्रहितः ।',
 'articleexists' => 'अनेन नाम्ना पृष्ठमेकं पूर्वेऽपि विद्यते, अथवा भवता चितं नाम तु अमान्यमस्ति। कृपया इतरं किमपि नाम चिनोतु।',
+'cantmove-titleprotected' => 'अस्मिन् स्थाने पुटस्थानान्तरणं न भवति । यतः नूतनशीर्षकं सर्जनात् सुरक्षितम् ।',
 'talkexists' => "'''पृष्ठं साफल्येन चालितमस्ति, परं चर्चापृष्ठं चालयितुं न शक्यम्, यतो नवेऽपि पृष्ठे चर्चापृष्ठं विद्यते। कृपया तं स्वयमेव चालयतु।'''",
 'movedto' => 'इदं प्रति चालितम्।',
 'movetalk' => 'सहगामिनं चर्चापृष्ठं चालयतु।',
+'move-subpages' => 'उपपुटनि चालयतु । ($1 पर्यन्तम्)',
+'move-talk-subpages' => 'सम्भाषणपुटानाम् उपपुटानि चालयतु ।($1 पर्यन्तम्)',
+'movepage-page-exists' => '$1 इत्येतत् पुटं पूर्वमेव विद्यते । तदुपरि लेखनम् अशक्यम् ।',
+'movepage-page-moved' => '$1 पुटं $2 प्रति चालितम् अस्ति ।',
+'movepage-page-unmoved' => '$1 पुटं $2 प्रति चालनम् अशक्यम् ।',
+'movepage-max-pages' => '$1  इत्यस्य {{PLURAL:$1|page|pages}} गरष्टपुटानि चालितानि अतः इतोप्यधिकपुटानि स्वयं चालितानि न भवन्ति ।',
 'movelogpage' => 'लॉग् इत्येतद् चाल्यताम्',
+'movelogpagetext' => 'पुटचालनस्य आवली अधः अस्ति ।',
+'movesubpage' => '{{PLURAL:$1|उपपुटः|उपपुटानि}}',
+'movesubpagetext' => '$1 {{PLURAL:$1|उपपुटम्|उपपुटानि }}अस्य पुटस्य उपपुटानि अधः दर्शितानि ।',
+'movenosubpage' => 'अस्य पुटस्य उपपुटानि न सन्ति ।',
 'movereason' => 'कारणम् :',
 'revertmove' => 'प्रतिनिवर्त्यताम्',
+'delete_and_move' => 'अपमर्जनं चालनं च ।',
+'delete_and_move_text' => '==अपमर्जनम् आवश्यकम्==
+लक्षितपुटं "[[:$1]]" पूर्वमेव अस्ति ।
+चालनपथं सृष्टुम् एतत् अपमर्जितुम् इच्छति वा ?',
+'delete_and_move_confirm' => 'आम्, पुटम् अपमर्जतु ।',
+'delete_and_move_reason' => '"[[$1]]" तः स्थानान्तरणं कर्तुं पथनिर्माणार्थम् अपमर्जितम् ।',
+'selfmove' => 'स्रोतः लक्ष्यशीर्षकं च समाने ।
+पुटं स्वस्थानान् स्थानान्तरं न शक्यते ।',
+'immobile-source-namespace' => '$1 इति नामस्थाने पुटस्थानान्तरं न शक्यते ।',
+'immobile-target-namespace' => '"$1" इति नामस्थाने पुटानां स्थानान्तरं न शक्यते ।',
+'immobile-target-namespace-iw' => 'पुटचालनार्थम् अन्तर्विक्यानुबन्धः मान्यं लक्ष्यं न ।',
+'immobile-source-page' => 'एतत्पुटं चालनयोग्यं न ।',
+'immobile-target-page' => 'तत् लक्षितशीर्षकं प्रति चालयितुं न शक्यते ।',
+'imagenocrossnamespace' => 'सञ्चिकां  अनामस्थाने स्थानान्तरितं कर्तुं नैव शक्यते ।',
+'nonfile-cannot-move-to-file' => 'असञ्चिकायाः सञ्चिकानामस्थाने स्थानान्तरं न शक्यते ।',
+'imagetypemismatch' => 'नूतपुटविस्तारः तस्य प्रकाण सह मेलं न  प्राप्नोति ।',
+'imageinvalidfilename' => 'लक्षितसञ्चिकानाम अमान्यम् ।',
+'fix-double-redirects' => 'यङ्कमपि पुनर्निदेशं उन्नतीकरोतु यः मूलशीर्षकं निदेशति ।',
+'move-leave-redirect' => 'कञ्चित् पुनर्निदेशं पूर्वमेव त्यजतु ।',
+'protectedpagemovewarning' => "'''पूर्वसूचना ''' प्रशासकपदयुक्ताः योजकाः एव सम्पादनं कर्तुमर्हन्ति । अतः एतत्पुटं सुरक्षितम् । निदेशार्थम् अधः जघन्यप्रवेशः सूचितः ।",
+'semiprotectedpagemovewarning' => "'''सूचना ''' पञ्जीकृतयोजकानां  उपयोगार्थ केवलम् एतत्पुटम् अभिरक्षितम् । जघन्यप्रवेशस्य सूचना आनुकूल्यार्थम् अधोनिदेशिता ।",
+'move-over-sharedrepo' => '==वर्तमानसञ्चिकाः==
+ [[:$1]] विभक्तकोशे सञ्चिकास्ति । अस्यां शीर्षकं स्थानान्तरणेन विभक्तसञ्चिका विकृता भवति ।',
+'file-exists-sharedrepo' => 'विभक्तकोशे चितसञ्चिकानाम प्रथममेव उपयोगे अस्ति  । अन्यं नाम चिनोतु ।',
 
 # Export
 'export' => 'पृष्ठानां निर्यातं करोतु',
+'exporttext' => 'विशेष पुटस्य पाठम् अथवा सम्पादनेतिहासं निर्हर्तुं शक्नोति । अथवा पुटसमूहम् उपोतं कर्तुमपि शक्नोति ।
+एतत् [[Special:Import|आयातपुटं]] अस्य साहाय्येन मीडियाविक्याः प्रयोगं कृत्वा अन्यविकीतः आयातं कर्तुं शक्नोति ।
+पुटानि नर्हर्तुम् अधो दत्तपाठमञ्जूषायां शीर्शकं लिखतु । एकस्य शीर्षकस्य एका पङ्क्तिः । अपि च वर्तमानावृत्त्या सह प्राचीनावृत्तिमपि इच्छति वा नेति अथवा गतसम्पादनस्य विषयज्ञानेन सह केवलं वर्नमानावृत्तिम् इच्छाति । 
+पश्चात् स्थित्यर्थे भवान् कञ्चित् अनुबन्धं प्रयोक्तुमर्हति । यथा"[[{{MediaWiki:Mainpage}}]]"पुटार्थम् [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।',
+'exportall' => 'सर्वपुटानि निर्यातानि करोतु ।',
+'exportcuronly' => 'सद्यः पुनरावृत्तिं केवलं सङ्गृह्णातु  समूर्णम् इतिहासं न ।',
+'exportnohistory' => 'सुचना : अनुष्टानस्य कारणेन पुटनिर्यातस्य सम्पूर्णेतिहासः एतत्पुटाद्वारा निष्क्रियाः  ।',
+'exportlistauthors' => 'प्रत्येकं पुटाय योगदातॄणां पूर्णावलीम् अन्तर्भावयतु ।',
 'export-submit' => 'निर्हरति',
+'export-addcattext' => 'वर्गतः पटानि योजयतु ।',
 'export-addcat' => 'संयोजयति',
+'export-addnstext' => 'नामस्थानात् पुटानि योजयतु ।',
 'export-addns' => 'संयोजयति',
+'export-download' => 'सञ्चिका इव रक्षतु ।',
+'export-templates' => 'प्राकृतीः अनर्भावयतु ।',
+'export-pagelinks' => '...इत्यस्य गाहाय अनुबद्धपुटानि अन्तरभावयतु ।',
 
 # Namespace 8 related
 'allmessages' => 'व्यवस्था सन्देशाः',
 'allmessagesname' => 'नाम',
 'allmessagesdefault' => 'डिफॉल्टसन्देशपाठ',
+'allmessagescurrent' => 'सद्यः सन्देशपाठः ।',
+'allmessagestext' => 'एषा मीडियाविकिनामस्थाने उपलब्धा काचित् तन्त्रसन्देशस्य सूचिका अस्ति ।  यदि भवान् सामान्यमीडियाविकि क्षेत्रीयकरणे योगदानं कर्तुमिच्छति तर्हि[//www.mediawiki.org/wiki/Localisation मीडियाविकि क्षेत्रीयकरणम्] अथवा [//translatewiki.net translatewiki.net] इत्यत्र गच्छतु ।',
+'allmessagesnotsupportedDB' => "अस्य पुटस्य उपयोगः नैव शक्यते यतः '''\$wgUseDatabaseMessages''' तटास्थम् अस्ति ।",
+'allmessages-filter-legend' => 'शोधनी ।',
+'allmessages-filter' => 'ग्राहकीकरणस्य स्थितौ शोधनी ।',
+'allmessages-filter-unmodified' => 'अपरिष्कृतम् ।',
 'allmessages-filter-all' => 'अखिलम्',
 'allmessages-filter-modified' => 'परिवर्तितम्',
+'allmessages-prefix' => 'उपसर्गानुगुणं शोधनी ।',
 'allmessages-language' => 'भाषा:',
 'allmessages-filter-submit' => 'गम्यताम्',
 
 # Thumbnails
 'thumbnail-more' => 'विस्तीर्यताम्',
+'filemissing' => 'सञ्चिका विनष्टा ।',
 'thumbnail_error' => 'सङ्कुचितचित्रनिर्माणे दोषः: $1',
+'djvu_page_error' => 'DjVu पुटं  पृष्ठ परिधेः बहिः ।',
+'djvu_no_xml' => 'DjVu पुटार्थं XMLप्राप्तुं न शक्तम् ।',
+'thumbnail-temp-create' => 'अनित्यां सङ्कुचितसञ्चिकां निर्मातुं न शक्यते ।',
+'thumbnail-dest-create' => 'लक्ष्ये सङ्कुचितं रक्षितुं न शक्यते ।',
+'thumbnail_invalid_params' => 'सङ्कुचितस्य विस्तारः अमान्यः ।',
+'thumbnail_dest_directory' => 'लक्षस्य निदेशिकां सृष्टुं नैव शक्यते ।',
+'thumbnail_image-type' => 'चित्रस्य प्रकारः नानुमोदितः ।',
+'thumbnail_gd-library' => 'अपूर्णं जि.जि.ग्रन्थालयानुन्यासः : विनष्टः कार्यकलापः $1',
+'thumbnail_image-missing' => 'सञ्चिका विनष्टा इति भाति : $1',
 
 # Special:Import
+'import' => 'पृष्ठानां निर्यातं करोतु',
+'importinterwiki' => 'ट्रान्स् विकि आयातकाः',
+'import-interwiki-text' => 'आयातं कर्तुं एकां विकिं एकं पुटं चिनोतु ।  
+पुनरावृत्तीनां दिनाङ्कानि, सम्पादनानि च सुरक्षितानि भविष्यन्ति। 
+सर्वाः ट्रान्सविक्यायातक्रियाः नामाभिलेखिताः [[Special:Log/import|आयातसूचिकासु]] स्थापिताः ।',
+'import-interwiki-source' => 'स्रोतविकि/पुटम्',
+'import-interwiki-history' => 'एतत्पुटार्थं सर्वेतिहासान् पुनरावृत्तीः च प्रकृतीः करोतु ।',
+'import-interwiki-templates' => 'प्राकृतीः अनर्भावयतु ।',
+'import-interwiki-submit' => 'आयातं करोतु ।',
+'import-interwiki-namespace' => 'लक्षितनामस्थानानि ।',
+'import-interwiki-rootpage' => 'लक्षितमूलपुटम् । (ऐच्छिकम्)',
+'import-upload-filename' => 'सञ्चिकानाम',
 'import-comment' => 'टिप्पणी:',
+'importtext' => '[[Special:Export|export utility]] एतेनानुबन्धेन स्रोतविकितः सञ्चिकानां निर्यातं करोतु । भवदीयसङ्गणके सुरक्ष्य अत्र उत्तारयतु ।',
+'importstart' => 'पुटानाम् आयातः....',
+'import-revision-count' => '$1 {{PLURAL:$1|पुनरावृत्तिः}}',
+'importnopages' => 'आयातं कर्तुं पुटानि न सन्ति ।',
+'imported-log-entries' => 'आयातकृतम्$1{{PLURAL:$1|log entry|प्रवेशसूचिकाः}}.',
+'importfailed' => 'असफलायाताः : $1',
+'importunknownsource' => 'अज्ञातायातस्रोतप्रकारः ।',
+'importcantopen' => 'आयातसञ्चिकाः उद्घाटयितुं न शक्यते ।',
+'importbadinterwiki' => 'प्रदुष्टः अन्तर्विक्यनुबन्धः ।',
+'importnotext' => 'रिक्तम् अथवा पाठः नास्ति ।',
+'importsuccess' => 'आयातः समाप्तः ।',
+'importhistoryconflict' => 'उपलब्धाः इतिहासपुनरावृत्तयः परस्परं विपरीताः। (एतत्पुटं पूर्वमेव आयातम् इति भाति ।)',
+'importnosources' => 'कोऽपि ट्रान्स्विकि आयातः नोपलब्धः अपि च प्रत्यक्षेतिहासस्य उत्तारणं निष्कियम् ।',
+'importnofile' => 'कापि आयातसञ्चिका उत्तारिता ।',
+'importuploaderrorsize' => 'आयातसञ्चिकाः अनुत्तारिताः। अस्याः आकारः अधिकतरः अस्ति ।',
+'importuploaderrorpartial' => 'आयातसञ्चिकाः अनुत्तारिताः । सञ्चिकाः अपूर्णोत्तारिताः ।',
+'importuploaderrortemp' => 'अयातसञ्चिकानाम् उत्तारणम् असफलम् ।
+अनित्यः सम्पुटः विनष्टः ।',
+'import-parse-failure' => 'XML आयातस्य व्यवस्थायाः वैफल्यम् ।',
+'import-noarticle' => 'आयातं कर्तुं पुटानि न सन्ति ।',
+'import-nonewrevisions' => 'सर्वाः पुनरावृत्तयः पूर्वमेव आयाताः ।',
+'xml-error-string' => '$1 पङ्किः $2 इत्यस्मिन् , स्तम्भः $3 (बैट्स् $4): $5',
+'import-upload' => 'XML पाठान् उत्तारयतु ।',
+'import-token-mismatch' => 'सत्रस्य पाठानां नाशः ।
+पुनः प्रयतताम् ।',
+'import-invalid-interwiki' => 'निर्दिष्टविकितः आयातः न सम्भवति ।',
+'import-error-edit' => '" $1 "पुटस्य आयातः न शक्यते यतः तस्य सम्पादनुमति ते नास्ति ।',
+'import-error-create' => '" $1 "पुटस्य आयातः न शक्यते यतः ते सम्पादनस्य अनुमतिः नास्ति ।',
+'import-error-interwiki' => '"$1" पुटम् आयातं न यतः अस्य नाम बाह्यानुबन्धार्थं सुरक्षितम् । (अन्तर्विकि)',
+'import-error-special' => '"$1" पुटम् आयातं नैव यतः एतत् विशेषनामस्थानेन सम्बद्धं यत् अन्यपुटानि नानुमन्यते ।',
+'import-error-invalid' => '"$1" पुटं न आयातं यतः अस्य नाम अमान्यम् ।',
+'import-options-wrong' => 'असमीचीनः {{PLURAL:$2|विकल्पः|विकल्पाः}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'दत्तमूलपुटम् अमान्यशीर्षकयुक्तम् ।',
+'import-rootpage-nosubpage' => 'मूलपुटस्य "$1" इति नामस्थाने उपपुटानि नानुमतानि ।',
+
+# Import log
+'importlogpage' => 'आयातसूचिका ।',
+'importlogpagetext' => 'अन्यविकितः सम्पादितेतिहाससहितानि प्रशासकानाम् आयातपुटानि ।',
+'import-logentry-upload' => 'सञ्चिकाम् उत्तारयित्वा [[$1]] इत्यस्य आयातः कृतः ।',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|पुनरावृत्तिः}}',
+'import-logentry-interwiki' => 'ट्रान्स्विकिकृतम् ।$1',
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|पुनरावृत्तिः}} $2 इत्येतस्मात् ।',
+
+# JavaScriptTest
+'javascripttest' => 'जावालिपिपरीक्षणम् ।',
+'javascripttest-disabled' => 'विक्याम् अयं क्रियाकलापः निष्क्रियः ।',
+'javascripttest-title' => '$1 परीक्षाप्रचलति ।',
+'javascripttest-pagetext-noframework' => 'जावलिपिचालनपरीक्षार्थम् एतत्पुटम् आरक्षितम् ।',
+'javascripttest-pagetext-unknownframework' => 'अज्ञातपरीक्षाप्रक्रिया  $1',
+'javascripttest-pagetext-frameworks' => 'अधो दत्तेषु कञ्चिदेकां परीक्षाप्रक्रियां चिनोतु : $1',
+'javascripttest-pagetext-skins' => 'अनेन सह परीक्षां सञ्चालयितुं  काचित् त्वक् चिनोतु ।',
+'javascripttest-qunit-intro' => 'mediawiki.org. [$1 अभिलेखपरीक्षा] इत्यत्र पश्यतु ।',
+'javascripttest-qunit-heading' => 'मिडियाविक्याः जवालिपेः Qघटकस्य परीक्षाप्रणाली ।',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'भवतः योजकपृष्ठम्',
+'tooltip-pt-anonuserpage' => 'ऐपिसङ्केतार्थं योजकपुटं भवान् सम्पादयति एवम्..',
 'tooltip-pt-mytalk' => 'भवतः सम्भाषणपृष्ठम्',
+'tooltip-pt-anontalk' => 'एतस्मात् ऐपिसङ्केतात् सम्पादनस्य परिचर्चा ।',
 'tooltip-pt-preferences' => 'भवतः इष्टतमानि',
 'tooltip-pt-watchlist' => 'भवद्भिः परिवर्तनानि निरीक्ष्यमाणानां पृष्ठानां सूची',
 'tooltip-pt-mycontris' => 'भवतः योगदानानाम् आवली',
 'tooltip-pt-login' => 'भवान् न प्रविष्टः। प्रवेशः अनिवार्यः न।',
+'tooltip-pt-anonlogin' => 'भवतः नामाभिलेखः उत्साहयते । किन्तु नामाभिलेखः ऐच्छिकः ।',
 'tooltip-pt-logout' => 'निर्गमनम्',
 'tooltip-ca-talk' => 'पृष्ठान्तर्गतविषये चर्चा',
 'tooltip-ca-edit' => 'भवान् इदं पृष्ठं सम्पादयितुम् अर्हति। रक्षणात्पूर्वं कृपया प्राग्दृश्यं पश्यतु।',
@@ -1587,7 +2877,9 @@ $2
 'tooltip-ca-viewsource' => 'इदं पृष्ठं संरक्षितं विद्यते। भवान् अस्य स्रोतः द्रष्टुम् अर्हति।',
 'tooltip-ca-history' => 'अस्य पृष्ठस्य पुरातन्यः आवृत्तयः',
 'tooltip-ca-protect' => 'इदं पृष्ठं संरक्ष्यताम्',
+'tooltip-ca-unprotect' => 'अस्य पुटास्य सुरक्षां परिवर्तयतु ।',
 'tooltip-ca-delete' => 'इदं पृष्ठम् अपाक्रियताम्',
+'tooltip-ca-undelete' => 'अस्य पुटस्य अपमर्जनात् पूर्वम् अस्य सम्पादनानि पुनस्थापयतु ।',
 'tooltip-ca-move' => 'इदं पृष्ठं चाल्यताम्',
 'tooltip-ca-watch' => 'इदं पृष्ठं भवतः अवेक्षणसूच्यां योज्यताम्',
 'tooltip-ca-unwatch' => 'इदं पृष्ठं भवतः अवेक्षणसूच्याः निष्कास्यताम्',
@@ -1614,10 +2906,13 @@ $2
 'tooltip-t-permalink' => 'पृष्ठस्य अस्याः आवृत्तेः स्थिरसम्पर्कतन्तुः',
 'tooltip-ca-nstab-main' => 'आन्तर्यं दृश्यताम्',
 'tooltip-ca-nstab-user' => 'योजकपृष्ठं दृश्यताम्',
+'tooltip-ca-nstab-media' => 'माध्यमपुटम् अवलोकयतु ।',
 'tooltip-ca-nstab-special' => 'इदमेकं विशिष्टं पृष्ठम्, भवान् इदं पृष्ठं सम्पादयितुं न अर्हति।',
 'tooltip-ca-nstab-project' => 'प्रकल्पपृष्ठं दृश्यताम्',
 'tooltip-ca-nstab-image' => 'सञ्चिकापृष्ठं दृश्यताम्',
+'tooltip-ca-nstab-mediawiki' => 'तन्त्रसन्देशान् अवलोकयतु ।',
 'tooltip-ca-nstab-template' => 'फलकं दृश्यताम्',
+'tooltip-ca-nstab-help' => 'साहाय्यपुटम् अवलोकयतु ।',
 'tooltip-ca-nstab-category' => 'वर्गाणां पृष्ठं दृश्यताम्',
 'tooltip-minoredit' => 'इदं परिवर्तनं लघुपरिवर्तनरूपेण अङ्क्यताम्',
 'tooltip-save' => 'परिवर्तनानि रक्ष्यन्ताम्',
@@ -1625,23 +2920,49 @@ $2
 'tooltip-diff' => 'पाठे भवता कृतानि परिवर्तनानि दृश्यन्ताम्।',
 'tooltip-compareselectedversions' => 'पृष्ठस्य द्वयोः चितयोः आवृत्त्योः भेदः दृश्यताम्',
 'tooltip-watch' => 'इदं पृष्ठं भवतः अवेक्षणसूच्यां योज्यताम्',
+'tooltip-watchlistedit-normal-submit' => 'शीर्षकानि अपनयतु ।',
+'tooltip-watchlistedit-raw-submit' => 'अवलोकनावलीं समुद्धरतु ।',
+'tooltip-recreate' => 'एतत्पुटं पूर्वमेव अपमर्जितः अतः पुन सृजतु ।',
+'tooltip-upload' => 'उत्तारणम् आरभताम्',
 'tooltip-rollback' => '"पूर्ण-प्रतिगमनं(रोलबैक् इत्येतद्)" अस्य पृष्ठस्य संपादनानि अंतिम-योगदातृकृतानि विपरीतीकरोति एकेन क्लिक्कारेण',
 'tooltip-undo' => '"निष्क्रियताम्" इत्येतद् इदं सम्पादनं विपरीतीकरोति, तथा च सम्पादनप्रारूपं प्राग्दृश्यरूपेण उद्घाटयति।
 
 अस्य सारांशे कारणमपि लेखितुं शक्यते।',
+'tooltip-preferences-save' => 'आद्यताः रक्षतु ।',
 'tooltip-summary' => 'संक्षिप्तः सारांशः योज्यताम्',
 
+# Metadata
+'notacceptable' => 'भवतः ग्रहकस्य पठनेच्छारूपेण विकिवितारकः दत्तपाठं प्रकल्पितुं नैव शक्नोति ।',
+
 # Attribution
+'anonymous' => '{{SITENAME}} इत्यस्य {{PLURAL:$1||}} अनामकयोजकः ।',
 'siteuser' => '{{SITENAME}} योजक $1',
 'anonuser' => '{{SITENAME}} अज्ञात योजक $1',
+'lastmodifiedatby' => 'एतस्य पुटस्य अन्तिमपरिवर्तनं $1 दिनाङ्के $2 समये कृतम् ।',
+'othercontribs' => '$1 इत्यस्य कार्यस्य अनुसारम् ।',
 'others' => 'अन्य',
 'siteusers' => '{{SITENAME}} {{PLURAL:$2|योजक|योजक}} $1',
 'anonusers' => '{{SITENAME}} अज्ञात {{PLURAL:$2|योजक|योजक}} $1',
+'creditspage' => 'पुटनां समाकलनानि ।',
+'nocredits' => 'अस्य पुटस्य समाकलनसूचना नोपलब्धा ।',
+
+# Spam protection
+'spamprotectiontitle' => 'स्पाम् सुरक्षाशोधनी ।',
+'spamprotectiontext' => 'भवान् यं पाठं रक्षितुमिच्छति सः स्पाम् शोधन्या अवरुद्धः । 
+प्रायः एतत् निषिद्धबाह्यस्थानस्य अनुबन्धेन सम्भूतम् ।',
+'spamprotectionmatch' => 'अधस्थपाठेन अस्माकं स्फांशोधनी लक्षिता : $1',
+'spambot_username' => 'मिडियाविकिअवकरशुद्धीकरणम् ।',
+'spam_reverting' => '$1 इत्यनेन नानुबद्धनां प्राचीनपुनरावृत्तीनां पुनस्थापनं कुर्वन्ति ।',
+'spam_blanking' => 'सर्वाः पुनरावृत्तयः $1 इत्यस्य अनुबन्धाः पूर्णपाठाः अपनीयन्ते ।',
+'spam_deleting' => 'सर्वाः पुनरावृत्तयः $1 इत्यस्य अनुबन्धाः । पूर्णपाठाः अपनीयन्ते ।',
 
 # Info page
+'pageinfo-title' => '"$1" कृते सूचनाः ।',
 'pageinfo-header-edits' => 'सम्पादयति',
-'pageinfo-subjectpage' => 'पृष्ठम्',
-'pageinfo-talkpage' => 'कथा पृष्ठम्',
+'pageinfo-views' => 'अवलोकनानां सङ्ख्या ।',
+'pageinfo-watchers' => 'अवलोकनानां सङ्ख्या ।',
+'pageinfo-edits' => 'सम्पादननां सङ्ख्या ।',
+'pageinfo-authors' => 'स्पष्टानां कर्तॄणां सङ्ख्या ।',
 
 # Skin names
 'skinname-standard' => 'पूर्व',
@@ -1651,18 +2972,74 @@ $2
 'skinname-myskin' => 'मे चर्मन्',
 'skinname-chick' => 'Chick',
 
+# Patrolling
+'markaspatrolleddiff' => 'आरक्षितमिति अङ्कयतु ।',
+'markaspatrolledtext' => 'एतपुटम् आरक्षितमिति अङ्कयतु ।',
+'markedaspatrolled' => 'आरक्षितमिति अङ्कयतु ।',
+'markedaspatrolledtext' => '[[:$1]] इत्यस्य चितपुनरावृत्तिः आरक्षणचिह्निता अस्ति ।',
+'rcpatroldisabled' => 'सद्यः परिवर्तननानि आरक्षणं निष्क्रियम् ।',
+'rcpatroldisabledtext' => 'नूतनपरिवर्ननानाम् आरक्षणव्यवस्था सद्यः निष्क्रिया ।',
+'markedaspatrollederror' => 'आरक्षितमिति अङ्कितं न भवति ।',
+'markedaspatrollederrortext' => 'आरक्षितमिति सूचयितुं पुनरावृत्तिं विशेषयतु ।',
+'markedaspatrollederror-noautopatrol' => 'स्वस्य परिवर्तनानि आरक्षितं कर्तुं भवान् नानुमतः ।',
+
+# Patrol log
+'patrol-log-page' => 'आरक्षणसूचिका ।',
+'patrol-log-header' => 'इयम् आरक्षितपुनरावृत्तीनां सूचिका अस्ति ।',
+'log-show-hide-patrol' => '$1 इत्यस्य आरक्षणसूचिका ।',
+
+# Image deletion
+'deletedrevision' => 'अपमर्जितप्राचीनपुनरावृत्तिः $1',
+'filedeleteerror-short' => 'सञ्चिकानपमर्जने दोषः : $1',
+'filedeleteerror-long' => ' सञ्चिकानामपमर्जने आगता समस्या  $1',
+'filedelete-missing' => '"$1" सञ्चिका अनपमर्जनीया यतः एषा न वर्तते एव ।',
+'filedelete-old-unregistered' => 'दत्तपाठे $1 इति विशिष्टा पुनरावृत्तिः नास्ति ।',
+'filedelete-current-unregistered' => '"$1" विशिष्टा सञ्चिका दत्तपाठे नास्ति ।',
+'filedelete-archive-read-only' => '"$1" लेखागारास्य निदेशिका जालवितारकेन अलेख्या अस्ति ।',
+
 # Browsing diffs
 'previousdiff' => '← पुरातनतरं सम्पादनम्',
 'nextdiff' => 'नवतरं सम्पादनम् →',
 
 # Media information
+'mediawarning' => 'पूर्वसूचना : प्रायः एतादृशपुटे अनर्थसङ्केतः भवति ।
+एतदनुष्टाने अनीय भवतः तन्त्रव्यवस्था सदोषा स्यात् ।',
+'imagemaxsize' => "चित्राकरस् परिमितिः :<br />''(सञ्चिकाविविरणपुटार्थम्)''",
+'thumbsize' => 'सङ्कुचितास्य आकारः ।',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$1|पुटम्|पुटानि}} प्रयुक्तानि ।',
+'file-info' => 'सञ्चिकाकारः : $1, MIME प्रकारः $2',
 'file-info-size' => '$1 × $2 पिक्सेलानि, संचिकायाः आकारः: $3, MIME-प्रकारः: $4',
+'file-info-size-pages' => '$1 × $2  पिक्सेल्, सञ्चिकायाः आकारः :  $3 , MIME प्रकारः :  $4 ,  $5   {{PLURAL:$5|पुटम्|पुटानि}}',
 'file-nohires' => 'उच्चतरं विभेदनं नोपलब्धम्',
 'svg-long-desc' => 'SVG संचिका, साधारणतया $1 × $2 पिक्सेलानि, संचिकायाः आकारः : $3',
 'show-big-image' => 'पूर्णं विभेदनम्',
+'show-big-image-preview' => 'अस्य पूर्वावलोकनस्य आकारः : $1',
+'show-big-image-other' => 'अन्याः {{PLURAL:$2| प्रस्तवः|प्रस्तावाः}}:  $1 ।',
+'show-big-image-size' => '$1 × $2  पिक्सेल्',
+'file-info-gif-looped' => 'चक्रितम्',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|पृष्ठम्|पृष्ठानि}}',
+'file-info-png-looped' => 'चक्रितम्',
+'file-info-png-repeat' => 'विलसितम् $1   {{PLURAL:$1|समयः|समयाः}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|पृष्ठम्|पृष्ठानि}}',
 
 # Special:NewFiles
 'newimages' => 'नूतन-संचिकानां वीथिका',
+'imagelisttext' => "अधः $2 इत्यनुसारं '''$1''' {{PLURAL:$1|सञ्चिका दत्ता|सञ्चिकाः प्रदत्ता।}}",
+'newimages-summary' => 'एतत् विशेषपुटम् सद्यः उत्तारितसञ्चिकाः दर्शयति ।',
+'newimages-legend' => 'शोधनी ।',
+'newimages-label' => 'सञ्चिकानाम (अथवा अस्य भागः)',
+'showhidebots' => '(स्वयं चालकः $1)',
+'noimages' => 'शून्यदर्शनम् ।',
+'ilsubmit' => 'अन्वेषणम्',
+'bydate' => 'दिनाङ्कानुगुणम्',
+'sp-newimages-showfrom' => ' $2 $1 तः आरब्धाः सञ्चिकाः दर्शयतु ।',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 second|$1 seconds}}',
+'minutes' => '{{PLURAL:$1|$1 निमेषः|$1 निमेषाः}}',
+'hours' => '{{PLURAL:$1|$1होरा|$1 होराः}}',
+'days' => '{{PLURAL:$1|$1 दिनम्|$1 दिनानि}}',
+'ago' => '$1 पूर्वम्',
 
 # Bad image list
 'bad_image_list' => 'रूपम् एवम् अस्ति -
 # EXIF tags
 'exif-imagewidth' => 'विस्तारः',
 'exif-imagelength' => 'औन्नत्यम्',
+'exif-bitspersample' => 'प्रत्येकं भागस्य अंशः ।',
+'exif-compression' => 'तुलनायाः योजना ।',
+'exif-photometricinterpretation' => 'पिक्सेल् रचनम् ।',
+'exif-orientation' => 'अभिस्थापनम्',
+'exif-samplesperpixel' => 'भागानां सङ्ख्या ।',
+'exif-planarconfiguration' => 'दत्तांशस्य व्यवस्था ।',
+'exif-ycbcrsubsampling' => 'Y इत्यस्य C इत्यनेन सह सबसॅम्पलींग प्रमाणम् ।',
+'exif-ycbcrpositioning' => 'Y तथा C  पोज़िशनिंग',
+'exif-xresolution' => 'तिर्यक् प्रस्तावः ।',
+'exif-yresolution' => 'लम्बप्रस्तावः ।',
+'exif-stripoffsets' => 'चित्रदत्तांशस्य स्थानम् ।',
+'exif-rowsperstrip' => 'प्रतिपट्टं स्तम्भानां सङ्ख्या ।',
+'exif-stripbytecounts' => 'सङ्कोचितप्रपट्टं बैट्स् ।',
+'exif-jpeginterchangeformat' => 'Offset to JPEG SOI',
+'exif-jpeginterchangeformatlength' => 'जेपिइजि दत्तांशस्य बैट्स् ।',
+'exif-whitepoint' => 'श्वेतबिन्दुवर्णगुणः ।',
+'exif-primarychromaticities' => 'प्राथमिकस्य वर्णगुणः ।',
+'exif-ycbcrcoefficients' => 'वर्णाकाशस्य वर्गान्तरम् मॅट्रीक्स कोएफिशीयंट्स्',
+'exif-referenceblackwhite' => 'उल्लेखमौल्यस्य श्वेतकृष्णयुगम् ।',
+'exif-datetime' => 'सञ्चिकापरिवर्तनस्य दिनाङ्कः समयः च ।',
+'exif-imagedescription' => 'चित्रशीर्षकम् ।',
+'exif-make' => 'चित्रग्राहिण्याः उत्पादकः ।',
+'exif-model' => 'चित्रग्राहिण्याः स्वरूपम् ।',
+'exif-software' => 'तन्त्रांशः उपयुक्तः ।',
 'exif-artist' => 'लेखक',
+'exif-copyright' => 'स्वामित्वस्य धारकः ।',
+'exif-exifversion' => 'Exif आवृत्तिः ।',
+'exif-flashpixversion' => 'अनुमोदिता फ्लाश्पिक्स् आवृत्तिः ।',
+'exif-colorspace' => 'वर्णावकाशः ।',
+'exif-componentsconfiguration' => 'प्रत्येकं भागस्य अर्थः ।',
+'exif-compressedbitsperpixel' => 'चित्रसङ्कोचविधानम् ।',
+'exif-pixelydimension' => 'चित्रविस्तारः ।',
+'exif-pixelxdimension' => 'चित्रैन्नत्यम् ।',
+'exif-usercomment' => 'योजकाभिप्रायः ।',
+'exif-relatedsoundfile' => 'सम्बद्धश्रवणसञ्चिका ।',
+'exif-datetimeoriginal' => 'दत्तांशसर्जनस्य दिनाङ्कः समयः च ।',
+'exif-datetimedigitized' => 'अङ्कीकरणस्य दिनाङ्कः समयः च ।',
+'exif-subsectime' => 'उपक्षणानां दिनाङ्कः समयः च ।',
+'exif-subsectimeoriginal' => 'मूलोपक्षणानां दिनाङ्कः समयः च ।',
+'exif-subsectimedigitized' => 'अङ्कीकृतोपक्षणानां दिनाङ्कः समयः च ।',
+'exif-exposuretime' => 'विगोपनसमयः ।',
+'exif-exposuretime-format' => '$1 क्षणः ($2)',
+'exif-fnumber' => 'F सङ्ख्या',
+'exif-exposureprogram' => 'विगोपनकार्यक्रमः',
+'exif-spectralsensitivity' => 'सङ्घट्टनसंवेदनशीलता ।',
+'exif-isospeedratings' => 'ISO वेगतुलना ।',
+'exif-shutterspeedvalue' => 'APEX पिधानस्य वेगः ।',
+'exif-aperturevalue' => 'APEX रन्ध्रः ।',
+'exif-brightnessvalue' => 'APEX कान्तिः ।',
+'exif-exposurebiasvalue' => 'APEX विगोपनाधारः ।',
+'exif-maxaperturevalue' => 'गरिष्टभूरन्ध्रः ।',
+'exif-subjectdistance' => 'विषयान्तरम् ।',
+'exif-meteringmode' => 'मापनस्य विधानम् ।',
+'exif-lightsource' => 'प्रकाशमूलम् ।',
 'exif-flash' => 'स्फुरणम्',
+'exif-focallength' => 'काचपटलस्य दैर्घ्यम् ।',
+'exif-subjectarea' => 'विषयक्षेत्रम् ।',
+'exif-flashenergy' => 'स्फुरणशक्तिः ।',
+'exif-focalplanexresolution' => 'मध्यकेन्द्रविमान X प्रस्तावः ।',
+'exif-focalplaneyresolution' => 'मध्यकेन्द्रविमानस्य Y प्रस्तावः ।',
+'exif-focalplaneresolutionunit' => 'मध्यकेन्द्रस्य विमानप्रस्तावस्य घटकः ।',
+'exif-subjectlocation' => 'विष्यस्थानम् ।',
+'exif-exposureindex' => 'विगोपनस्य अनुक्रमणी',
+'exif-sensingmethod' => 'संवेदशीलक्रमः ।',
+'exif-filesource' => 'सञ्चिकास्रोतः ।',
+'exif-scenetype' => 'संवेदनप्रकारः ।',
+'exif-customrendered' => 'चित्रविन्यासं परिवर्तयतु ।',
+'exif-exposuremode' => 'विगोपनस्य विधानम् ।',
+'exif-whitebalance' => 'श्वेतावकाशः ।',
+'exif-digitalzoomratio' => 'आङ्किकविस्तारकप्रमाणः ।',
+'exif-focallengthin35mmfilm' => 'मध्यकेन्द्रस्य दैर्घ्यं ३५मि.मी. पटले भवति ।',
+'exif-scenecapturetype' => 'दृश्यग्रहणविधानम् ।',
+'exif-gaincontrol' => 'दृश्यनियन्त्रणम् ।',
+'exif-contrast' => 'सङ्कोचनम् ।',
+'exif-saturation' => 'तर्पणम् ।',
+'exif-sharpness' => 'नैशित्यम् ।',
+'exif-devicesettingdescription' => 'उपकरणव्यवस्थापनस्य विवरणम् ।',
+'exif-subjectdistancerange' => 'विषयन्तरवलयः ।',
+'exif-imageuniqueid' => 'विशिष्टं चित्रचिह्नम् ।',
+'exif-gpsversionid' => 'GPS लग्नावृत्तिः ।',
+'exif-gpslatituderef' => 'उत्तरस्य अथवा दक्षिणस्य अक्षांशः ।',
+'exif-gpslatitude' => 'अक्षांशः ।',
+'exif-gpslongituderef' => 'पूर्वस्य अथवा पश्चिमस्य अक्षांशः ।',
+'exif-gpslongitude' => 'रेखांशः',
+'exif-gpsaltituderef' => 'आरोहस्य उल्लेखः ।',
+'exif-gpsaltitude' => 'उन्मितिः',
+'exif-gpstimestamp' => 'GPS समयः (एटोमिक क्लॉक)',
+'exif-gpssatellites' => 'मापनार्थम् उपयुक्ताः उपग्रहाः ।',
+'exif-gpsstatus' => 'स्वीकर्तुः स्थितिः ।',
+'exif-gpsmeasuremode' => 'मापनस्य विधानम् ।',
+'exif-gpsdop' => 'मापनस्य यथार्थता ।',
 'exif-gpsspeedref' => 'गती एकक',
+'exif-gpsspeed' => 'जिपिएस् ग्राहकस्य वेगः ।',
+'exif-gpstrackref' => 'सञ्चालनस्य निदेशार्थम् उल्लेखः ।',
+'exif-gpstrack' => 'सञ्चालनस्य निदेशः ।',
+'exif-gpsimgdirectionref' => 'सञ्चालनस्य निदेशार्थम् उल्लेखः ।',
+'exif-gpsimgdirection' => 'चित्रस्य निदेशः ।',
+'exif-gpsmapdatum' => 'जियोडेटिक्  सर्वेक्षणोपयुक्तः दत्तांशः ।',
+'exif-gpsdestlatituderef' => 'लक्ष्याक्षांशस्य उल्लेखः ।',
+'exif-gpsdestlatitude' => 'अक्षांशस्य लक्ष्यम् ।',
+'exif-gpsdestlongituderef' => 'लक्ष्यस्य रेखांशस्य उल्लेखः ।',
+'exif-gpsdestlongitude' => 'लक्ष्यस्य रेखांशः ।',
+'exif-gpsdestbearingref' => 'लक्ष्यस्य स्वभावार्थमुल्लेखः ।',
+'exif-gpsdestbearing' => 'लक्ष्यस्य स्वभावः ।',
+'exif-gpsdestdistanceref' => 'लक्षान्तरस्य कृते उल्लेखः ।',
+'exif-gpsdestdistance' => 'लक्ष्यान्तरम् ।',
+'exif-gpsprocessingmethod' => 'जिपिएस् प्रक्रियायाः क्रमस्य नाम ।',
+'exif-gpsareainformation' => 'जिपिएस् क्षेत्रस्य नाम ।',
+'exif-gpsdatestamp' => 'जिपिएस् महाद्वारम् ।',
+'exif-gpsdifferential' => 'जिपिएस् व्यत्यासस्य परिष्कारः ।',
+'exif-jpegfilecomment' => 'जिपिइजि सञ्चिकाटीका ।',
+'exif-keywords' => 'कुञ्चपदानि ।',
+'exif-worldregioncreated' => 'चित्रग्राहस्य वैश्विकप्रदेशः ।',
+'exif-countrycreated' => 'चित्रग्राहस्य देशीयप्रदेशः ।',
+'exif-countrycodecreated' => 'चित्रग्राहस्य देशस्य सङ्केतसङ्ख्या ।',
+'exif-provinceorstatecreated' => 'चित्रग्राहस्य राज्यस्य प्रदेशः ।',
+'exif-citycreated' => 'चित्रग्राहस्य नगरप्रदेशः ।',
+'exif-sublocationcreated' => 'चित्रग्रहस्य उपनगरप्रदेशः ।',
+'exif-worldregiondest' => 'वैश्विकप्रदेशः दर्शितः ।',
+'exif-countrydest' => 'नगरं दर्शितम् ।',
+'exif-countrycodedest' => 'दर्शितनगरस्य सङ्केतसङ्ख्या ।',
+'exif-provinceorstatedest' => 'दर्शितं राज्यम् ।',
+'exif-citydest' => 'दर्शितं नगरम् ।',
+'exif-sublocationdest' => 'दर्शितः नगरस्य उपभागः ।',
+'exif-objectname' => 'ह्रस्वशीर्षकम् ।',
+'exif-specialinstructions' => 'विशेषसूचनाः ।',
+'exif-headline' => 'शीर्षकम् ।',
+'exif-credit' => 'श्रेयः/ प्रदाता',
 'exif-source' => 'मूल',
+'exif-editstatus' => 'चित्रस्य सम्पादस्थितिः ।',
+'exif-urgency' => 'त्वरा',
+'exif-fixtureidentifier' => 'सङ्गमनाम ।',
+'exif-locationdest' => 'स्थानं चित्रितम् ।',
+'exif-locationdestcode' => 'चित्रितस्थानस्य सङ्केतसङ्ख्या ।',
+'exif-objectcycle' => 'माध्यमगम्यः दिनस्य समयः ।',
+'exif-contact' => 'सम्पर्कस्य सूचनाः ।',
+'exif-writer' => 'लेखकः ।',
+'exif-languagecode' => 'भाषा ।',
+'exif-iimversion' => 'IIM आवृत्तिः ।',
 'exif-iimcategory' => 'वर्ग',
+'exif-iimsupplementalcategory' => 'संयोज्यवर्गः ।',
+'exif-datetimeexpires' => 'पश्चात् न उपयोजयतु ।',
+'exif-datetimereleased' => 'अस्मिन् दिने लोकार्पितम् ।',
+'exif-originaltransmissionref' => 'मूलप्रसरणस्य स्थानसङ्केतसङ्ख्या ।',
+'exif-identifier' => 'अभिज्ञापकः ।',
+'exif-lens' => 'उपयुक्तः काछपटलः ।',
+'exif-serialnumber' => 'चित्रग्राह्याः क्रमसङ्ख्या ।',
+'exif-cameraownername' => 'चित्रग्राह्याः स्वामी ।',
+'exif-label' => 'लक्षः',
+'exif-datetimemetadata' => 'मेटा दत्तांशस्य परिवर्तनस्य दिनाङ्कः ।',
+'exif-nickname' => 'चित्रस्य साधारणं नाम ।',
+'exif-rating' => 'तुलना ।(पञ्चसु)',
+'exif-rightscertificate' => 'अधिकरनिर्वहणस्य प्रमाणपत्रम् ।',
+'exif-copyrighted' => 'प्रतिकृत्यधिकारस्य स्थितिः ।',
+'exif-copyrightowner' => 'स्वामित्वस्य धारकः ।',
+'exif-usageterms' => 'उपयोगस्य नियमाः ।',
+'exif-webstatement' => 'सद्यस्कस्य स्वामित्वस्य वृत्तम् ।',
+'exif-originaldocumentid' => 'मूलप्रलेखस्य विशिष्टाभिज्ञानसङ्केतः ।',
+'exif-licenseurl' => 'अनुज्ञापत्रस्य स्वामित्वस्य कृते URL ।',
+'exif-morepermissionsurl' => 'पर्यायानज्ञापत्रीकरणस्य सूचनाः ।',
+'exif-attributionurl' => 'यदा एतस्य पु्नरुपयोगं करोति तदा अनेन अनुबद्नातु ।',
+'exif-preferredattributionname' => 'यदा एतत्कार्यं पुनरुपयोजति तदा समाकलयतु ।',
+'exif-pngfilecomment' => 'जिपिइजि सञ्चिकाटीका ।',
+'exif-disclaimer' => 'प्रत्याख्यानम्',
+'exif-contentwarning' => 'पूर्वसूचना विषयः ।',
+'exif-giffilecomment' => 'GIF सञ्चिकायाः टीका ।',
+'exif-intellectualgenre' => 'वस्तुनः प्रकारः ।',
+'exif-subjectnewscode' => 'विषयसङ्केतसङ्ख्या ।',
+'exif-scenecode' => 'IPTC योजनासङ्केतसङ्ख्या ।',
+'exif-event' => 'चित्रितघटना ।',
+'exif-organisationinimage' => 'चित्रितसङ्घटनम् ।',
+'exif-personinimage' => 'चित्रितजनः ।',
+'exif-originalimageheight' => 'कर्तनात्पूरव चित्रस्य औन्नत्यम् ।',
+'exif-originalimagewidth' => 'कर्तनात् पूर्वं चित्रस्य व्यासः ।',
+
+# EXIF attributes
+'exif-compression-1' => 'असङ्कोचितम् ।',
+'exif-compression-2' => 'CCITT समूहः 3 1- Dimensional Modified Huffman run length encoding',
+'exif-compression-3' => 'CCITT समूह ३ फेक्स  सङ्केतीकरणम् ।',
+'exif-compression-4' => 'CCITT समूहः३ फेक्स् सङ्केतीरणम् ।',
+
+'exif-copyrighted-true' => 'स्वामत्वरक्षितम् ।',
+'exif-copyrighted-false' => 'सार्जनिकस्थानम् ।',
+
+'exif-unknowndate' => 'अज्ञातदिनाङ्कः ।',
 
 'exif-orientation-1' => 'सामान्य',
+'exif-orientation-2' => 'तिर्यक् परिवर्तितम् ।',
+'exif-orientation-3' => '१८०° प्ररिभ्रमितम् ।',
+'exif-orientation-4' => 'लम्भतया परिवर्तितम् ।',
+'exif-orientation-5' => 'CCW ९०° परिभ्रमितम् । अपि च लम्बतया परिवर्तितम् ।',
+'exif-orientation-6' => 'CCW ९०° परिभ्रमितम् ।',
+'exif-orientation-7' => 'CCW ९०° परिभ्रमितम् । अपि च लम्बतया परिवर्तितम् ।',
+'exif-orientation-8' => 'CCW ९०° परिभ्रमितम् ।',
+
+'exif-planarconfiguration-1' => 'विशालं प्रारूपम् ।',
+'exif-planarconfiguration-2' => 'पर्यालोचकस्य प्रारूपम् ।',
+
+'exif-colorspace-65535' => 'अक्रमाङ्कितम् ।',
+
+'exif-componentsconfiguration-0' => 'न वर्तते ।',
+
+'exif-exposureprogram-0' => 'न व्याख्यातम् ।',
+'exif-exposureprogram-1' => 'मानवीयः ।',
+'exif-exposureprogram-2' => 'साधारणकार्यक्रमः ।',
+'exif-exposureprogram-3' => 'अवकाशस्य आद्यता ।',
+'exif-exposureprogram-4' => 'पिधानस्य आद्यता ।',
+'exif-exposureprogram-5' => 'सर्जनात्मकः कार्यक्रमः ।',
+'exif-exposureprogram-6' => 'प्रक्रियाकार्यक्रमः ।',
+'exif-exposureprogram-7' => 'आलेख्य प्रकारः ।',
+'exif-exposureprogram-8' => 'आयतप्रकारः । (आयतचित्राणि पृष्ठभूमिकेन्द्रीकृतनि )',
+
+'exif-subjectdistance-value' => '$1 मीटर्स् ।',
 
 'exif-meteringmode-0' => 'अज्ञात',
 'exif-meteringmode-1' => 'माध्य',
+'exif-meteringmode-2' => 'केन्द्रभारयुतं सर्वसामान्यम् ।',
+'exif-meteringmode-3' => 'प्रदेशः ।',
+'exif-meteringmode-4' => 'विविधप्रदेशाः ।',
+'exif-meteringmode-5' => 'प्रकारः ।',
+'exif-meteringmode-6' => 'भागशः ।',
+'exif-meteringmode-255' => 'अन्यत्',
 
 'exif-lightsource-0' => 'अज्ञात',
+'exif-lightsource-1' => 'दिवाप्रकाशः ।',
+'exif-lightsource-2' => 'प्रभासमानम् ।',
+'exif-lightsource-3' => 'उज्वलप्रकाशस्य तन्त्रीविशेषः',
+'exif-lightsource-4' => 'स्फुरणम् ।',
+'exif-lightsource-9' => 'सुवायुमण्डलम् ।',
+'exif-lightsource-10' => 'मेघाच्छन्नवायुमण्डलम् ।',
+'exif-lightsource-11' => 'छाया ।',
+'exif-lightsource-12' => 'दिवाप्रकाशः उज्वलकान्तिः ।(D 5700 – 7100K)',
+'exif-lightsource-13' => 'दिनस्य श्वेतोज्वलप्रकाशः (N 4600 – 5400K)',
+'exif-lightsource-14' => 'शान्तशुभ्रः उज्ज्वलप्रकाशः (W 3900 – 4500K)',
+'exif-lightsource-15' => 'श्वेतदीप्तप्रकाशः ।(WW 3200 – 3700K)',
+'exif-lightsource-17' => 'सुयोगः प्रकाशः A',
+'exif-lightsource-18' => 'योग्यप्रकाशः B',
+'exif-lightsource-19' => 'सुयोग्यप्रकाशः C',
+'exif-lightsource-24' => 'ISO स्टूडीयो टङ्गस्टन् ।',
+'exif-lightsource-255' => 'अन्यप्रकाशस्रोतः ।',
+
+# Flash modes
+'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-2' => 'इञ्चस्',
+
+'exif-sensingmethod-1' => 'अनिरूपितम् ।',
+'exif-sensingmethod-2' => 'एकशलाकावर्णस्थानस्य संवेदकः ।',
+'exif-sensingmethod-3' => 'शलाकद्वसस्य वर्णस्थानस्य संवेदकः ।',
+'exif-sensingmethod-4' => 'शलाकत्रयस्य वर्णस्थानस्य संवेदकः ।',
+'exif-sensingmethod-5' => 'वर्णसान्दर्भिकस्थानस्य संवेदकः ।',
+'exif-sensingmethod-7' => 'ट्रिलियनियर्  संवेदकः ।',
+'exif-sensingmethod-8' => 'वर्णसान्दर्भिकस्थानस्य संवेदकः ।',
+
+'exif-filesource-3' => 'आङ्किकस्थिरचित्रग्राही ।',
+
+'exif-scenetype-1' => 'सक्षात् ग्रहीतचित्रम् ।',
+
+'exif-customrendered-0' => 'साधारणप्रक्रिया ।',
+'exif-customrendered-1' => 'प्रक्रियां परिवर्तयतु ।',
+
+'exif-exposuremode-0' => 'स्वयं प्रदर्शनम् ।',
+'exif-exposuremode-1' => 'मानवीयं प्रदर्शनम् ।',
+'exif-exposuremode-2' => 'स्वयम् आवरणम्',
+
+'exif-whitebalance-0' => 'स्वयं श्वेतावरणम् ।',
+'exif-whitebalance-1' => 'मनवकरणस्य श्वेतावरणम् ।',
+
+'exif-scenecapturetype-0' => 'सुयोग्यम् ।',
+'exif-scenecapturetype-1' => 'आयतम् ।',
+'exif-scenecapturetype-2' => 'लम्बचित्राकृतिः ।',
+'exif-scenecapturetype-3' => 'रात्रिदृश्यम् ।',
+
+'exif-gaincontrol-0' => 'नास्ति',
+'exif-gaincontrol-1' => 'मन्दार्जनम् ।',
+'exif-gaincontrol-2' => 'तीव्रार्जनम् ।',
+'exif-gaincontrol-3' => 'मन्दार्जनावन्तिः ।',
+'exif-gaincontrol-4' => 'तीव्रार्जनावनतिः ।',
 
 'exif-contrast-0' => 'सामान्य',
+'exif-contrast-1' => 'कोमलम् ।',
+'exif-contrast-2' => 'कठिणम् ।',
+
+'exif-saturation-0' => 'सामान्यम्',
+'exif-saturation-1' => 'मन्दतर्पणम् ।',
+'exif-saturation-2' => 'तीव्रतर्पणम् ।',
 
 'exif-sharpness-0' => 'सामान्य',
+'exif-sharpness-1' => 'कोमलम् ।',
+'exif-sharpness-2' => 'कठिणम् ।',
 
 'exif-subjectdistancerange-0' => 'अज्ञात',
-
+'exif-subjectdistancerange-1' => 'बृहत्',
+'exif-subjectdistancerange-2' => 'अवलोकनं पिदधातु ।',
+'exif-subjectdistancerange-3' => 'दूरदृश्यम् ।',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'उत्तराक्षांशः ।',
+'exif-gpslatitude-s' => 'दक्षिणाक्षांशः ।',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'पश्चिमरेखांशः ।',
+'exif-gpslongitude-w' => 'पश्चिमरेखांशः ।',
+
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|meter|meters}} समुद्रस्तरादौन्नत्यम् ।',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|meter|meters}} समुद्रस्तरादवनतिः ।',
+
+'exif-gpsstatus-a' => 'मापनस्य प्रगतिः ।',
+'exif-gpsstatus-v' => 'अन्तर्निर्वहणस्य मापनम् ।',
+
+'exif-gpsmeasuremode-2' => 'द्विमुखमापनम् ।',
+'exif-gpsmeasuremode-3' => 'त्रिमुखमापनम् ।',
+
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'प्रतिहोरा कि.मी ।',
+'exif-gpsspeed-m' => 'मैल् प्रतिहोरा ।',
+'exif-gpsspeed-n' => 'ग्रन्थयः ।',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'कि.मी.',
+'exif-gpsdestdistance-m' => 'मैल्स् ।',
+'exif-gpsdestdistance-n' => 'समुद्रीयः क्रोशः ।',
+
+'exif-gpsdop-excellent' => 'उत्कृष्टम् ($1)',
+'exif-gpsdop-good' => 'साधु ($1)',
+'exif-gpsdop-moderate' => 'मध्यमः $1',
+'exif-gpsdop-fair' => ' युक्तम् ($1)',
+'exif-gpsdop-poor' => 'दीनम् ($1)',
+
+'exif-objectcycle-a' => 'प्रतः केवलम् ।',
+'exif-objectcycle-p' => 'सायं केवलम् ।',
+'exif-objectcycle-b' => 'सायं प्रातः च ।',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'यथार्था दिशा ।',
+'exif-gpsdirection-m' => 'कान्तीयदिशा ।',
+
+'exif-ycbcrpositioning-1' => 'केन्द्रितम् ।',
+'exif-ycbcrpositioning-2' => 'सहक्षेत्रम् ।',
+
+'exif-dc-contributor' => 'योगदानिनः ।',
+'exif-dc-coverage' => 'माध्यमस्य स्थानिकः अथवा लैकिकः अवकाशः ।',
+'exif-dc-date' => 'दिनाङ्काः ।',
+'exif-dc-publisher' => 'प्रकाशकः ।',
+'exif-dc-relation' => 'सम्बद्धमाध्यमः ।',
+'exif-dc-rights' => 'अधिकाराः ।',
+'exif-dc-source' => 'स्रोतसः माध्यमः ।',
+'exif-dc-type' => 'माध्यमप्रकारः ।',
+
+'exif-rating-rejected' => 'तिरस्कृतम् ।',
+
+'exif-isospeedratings-overflow' => '६५५३५ तः महत्तरः ।',
+
+'exif-iimcategory-ace' => 'कलाः, संस्कृतिः, मनोरञ्जनम् ।',
+'exif-iimcategory-clj' => 'पराधः न्यायनियमाः ।',
+'exif-iimcategory-dis' => 'विपदः व्यापदः च ।',
+'exif-iimcategory-fin' => 'अर्थव्यवस्था वाणिज्यं च ।',
 'exif-iimcategory-edu' => 'विद्याभ्यासः',
 'exif-iimcategory-evn' => 'परिसरः',
 'exif-iimcategory-hth' => 'स्वास्थ्यम्',
+'exif-iimcategory-hum' => 'मानवीयासक्तिः ।',
+'exif-iimcategory-lab' => 'परिश्रमः',
+'exif-iimcategory-lif' => 'जीवनविधानं विश्रामः च ।',
+'exif-iimcategory-pol' => 'राजनीतिः ।',
+'exif-iimcategory-rel' => 'मतं विश्वासः च ।',
+'exif-iimcategory-sci' => 'विज्ञानं तन्त्रज्ञानं च ।',
+'exif-iimcategory-soi' => 'समाजिकाः विवादाः ।',
 'exif-iimcategory-spo' => 'क्रीडाः',
+'exif-iimcategory-war' => 'युद्धम्, सङ्घर्षः, अशान्तिः ।',
 'exif-iimcategory-wea' => 'वातावरण',
 
+'exif-urgency-normal' => 'सामान्यम् ($1)',
+'exif-urgency-low' => 'मन्दम् ।$1',
+'exif-urgency-high' => 'उन्नतम् ($1)',
+'exif-urgency-other' => 'योजकनिरूपिता आद्यता : $1',
+
 # External editor support
 'edit-externally' => 'बाह्यां प्रणालीम् उपयुज्य इयं सञ्चिका सम्पाद्यताम् ।',
 'edit-externally-help' => '(अधिकासूचनार्थं [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] इत्येतत् दृश्यताम्)',
 
 # E-mail address confirmation
 'confirmemail' => 'ईपत्रसङ्केतः प्रमाणीक्रियताम्',
+'confirmemail_noemail' => 'भवतः योजकाद्यतायां व्यवस्थापितः विद्युन्मानपत्रसङ्केतः मान्यं नाश्ति ।  [[Special:Preferences|user preferences]]',
+'confirmemail_text' => '{{SITENAME}} इत्यत्र विद्युन्मानसुविधोपयोगात् पूर्वं भवतः विद्युन्मानपत्रसङ्केतं मान्यं करोतु । 
+भवतः सङ्केतं दृढीकरणसङ्केतं प्राप्तुं अधः दत्तं कड्मलं तुदतु ।
+तत्र पत्रं ससङ्केतम् अनुबन्धयुक्तं भवति । 
+भवतः विद्युन्मानपत्रसङ्केतं प्रमाणीकर्तुम् अनेन अनुबन्धेन जालगवाक्षेन पूरयतु ।',
+'confirmemail_pending' => 'कश्चित् दृढीकरणस्य सङ्केतसङ्ख्या तावत् विद्युन्मानपत्रद्वारा ते प्रेषितम् । 
+भवान् सद्यः योजकस्थानं निर्मितवान् । नूतनसङ्केतसङ्ख्या कतिपयनिमेषापर्यन्तं निरीक्षताम्,',
+'confirmemail_send' => 'दृढीकरणसङ्केतसङ्ख्यां प्रेषयतु ।',
+'confirmemail_sent' => 'दृढीकरणस्य विद्युन्मानपत्रं प्रेषितम् ।',
+'confirmemail_oncreate' => 'दृढीकरणस्य सङ्केतसङ्ख्या विद्युन्मानपत्रद्वारा सम्प्रेषितम् । 
+नामाभिलेखार्थम् एषा सङ्केतसङ्ख्या नावश्यकी । किन्तु  वीक्यां विद्युन्मानपत्राधारितलक्षणानि सक्रिययितुं सङ्केतसङ्ख्या प्रकप्पनीया ।',
+'confirmemail_sendfailed' => '{{SITENAME}}भवतः दृढीकरणपत्रप्रेषणं विफलम् । 
+अमान्याक्षरशोधाय भवतः विद्युन्मानपत्रसङ्केतं परिशीलयतु ।   
+पत्रवाहकः प्रत्यर्पितवान् : $1',
+'confirmemail_invalid' => 'अमान्या दृढीकरणसङ्केतसङ्ख्या ।
+प्रायः सङ्केतसङ्ख्या विनष्टा ।',
+'confirmemail_needlogin' => 'भवतः विद्युन्मनपत्रसङ्केतं दृढयितुं भवान् $1 करोतु ।',
+'confirmemail_success' => 'भवतः विद्युन्मानपत्रसङ्केतः इदानीं दृढीकृतः अस्ति । [[Special:UserLogin|log in]]
+अधुना भवान् नामाभिलेखेन विकिविहरस्य आनन्दम् अनुभवितुं शक्नोति ।',
+'confirmemail_loggedin' => 'भवतः विद्युन्मानपत्रसङ्केतः दृढीकृतः ।',
+'confirmemail_error' => 'भवतः दृढीकरणावसरे काचित् समस्या उत्पन्ना ।',
+'confirmemail_subject' => '{{SITENAME}}विद्युन्मानपत्रसङ्केतस्य दृढीकरणम् ।',
+'confirmemail_body' => 'कोऽपि अथवा भवान् $1 इति ऐपिसङ्केतद्वारा {{SITENAME}}इत्यस्मिन् "$2" इति नाम्ना योजकस्थाननिर्माणार्थम् अभ्यर्थनं दत्तवान् ।
+एतत् योजकस्थानं भवतः एव अपि च {{SITENAME}} इत्यस्मिन् उलब्धे विद्युन्मानपत्रसङ्केतः ।
+सुविधारम्भं कर्तुम् अधोदत्तानुबन्ध स्वस्य जालगवाक्षे उद्घाटयतु ।
+
+$3
+
+यदि एतदभ्यर्थनं भवान् न कृतवान् तर्हि एतत् अपकर्षितुम् अधो दतानुबन्धम् उद्घाटयतु ।
+
+$5
+
+इयं दृढीकरणसङ्केतसङ्ख्या $4 इत्यस्मिन् समाप्ता भवति ।',
+'confirmemail_body_changed' => 'कोऽपि अथवा भवान् $1 इति ऐपिसङ्केतद्वारा {{SITENAME}}इत्यस्मिन् "$2" इति योजस्थानस्य विद्युन्मानपत्रसङ्केतं परिवर्त्य दत्तवान्  ।
+अस्य विषयस्य दृढीकरणार्थम् एतत् योजकस्थानं भवतः एव अस्ति अपि च  {{SITENAME}}इत्यस्मिन् विद्युन्मानसौकर्यं पुनरारब्धुम् अधो दत्तानुबन्धं जालगवाक्षे उद्घाटयतु ।
+
+$3
+
+यदि एतत् योजकस्थानं भवतः नाश्ति तर्हि भवतः विद्युन्मानपत्रसङ्केतम् अपाकृष्टुं अधो दत्तानुबन्धं जालगवाक्षे उद्घाटयतु ।
+
+
+$5
+एतत् दृढीकर्तुं $6 इत्येतत् $7 इति होरायाः पश्चात् कार्यं न करोति ।',
+'confirmemail_body_set' => 'कोऽपि अथवा भवान् $1 इति ऐपिसङ्केतद्वारा {{SITENAME}}इत्यस्मिन् "$2" इति योजस्थानस्य विद्युन्मानपत्रसङ्केतं परिवर्त्य दत्तवान्  ।
+अस्य विषयस्य दृढीकरणार्थम् एतत् योजकस्थानं भवतः एव अस्ति अपि च  {{SITENAME}}इत्यस्मिन् विद्युन्मानसौकर्यं पुनरारब्धुम् अधो दत्तानुबन्धं जालगवाक्षे उद्घाटयतु ।
+
+$3
+
+यदि एतत् योजकस्थानं भवतः नाश्ति तर्हि भवतः विद्युन्मानपत्रसङ्केतम् अपाकृष्टुं अधो दत्तानुबन्धं जालगवाक्षे उद्घाटयतु ।
+
+
+$5
+एतत् दृढीकर्तुं $6 इत्येतत् $7 इति होरायाः पश्चात् कार्यं न करोति ।',
+'confirmemail_invalidated' => 'विद्युन्मानपत्रसङ्केतस्य दृढीकरणम् अपकर्षितम् ।',
+'invalidateemail' => 'विद्युन्मानपत्रस्य दृढीकरणम् अपकर्षतु ।',
+
+# Scary transclusion
+'scarytranscludedisabled' => 'अन्तर्विकीयः अन्तर्भवनं निष्क्रियम् ।',
+'scarytranscludefailed' => '$1 कृते प्राकृतिः प्रार्थना न प्राप्ता ।',
+'scarytranscludetoolong' => '[URLअतिदीर्घा अस्ति ]',
+
+# Delete conflict
+'deletedwhileediting' => 'पूर्वसूचना : भवतः सम्पादनारम्भात् पश्चात् एतत् पुटम् अपमर्जितम् ।',
+'confirmrecreate' => "योजकः [[User:$1|$1]] ([[User talk:$1|सम्भाषणम्]]) सकारणं भवतः सम्पादनात् परं पुटमेतत् अपमर्जितम् । 
+: ''$2''
+एतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।",
+'confirmrecreate-noreason' => 'यदा भावान् अस्य पुटास्य सम्पादनम् आरब्धवान् तत्पश्चात् अन्यः योजकः [[User:$1|$1]] ([[User talk:$1|talk]]) एतत् अपनीतवान् । अतः एतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।',
+'recreate' => 'पुनर्निर्मीयताम्',
 
 # action=purge
 'confirm_purge_button' => 'अस्तु',
+'confirm-purge-top' => 'अस्य पुटस्य इतिहाससङ्ग्रहं निर्मलं करोति वा ?',
+'confirm-purge-bottom' => 'कस्यचिदपि पुटस्य अपमर्जनेन सञ्चिका निर्मला भवति  अपि च नूतनतमा आवृत्तिः प्रकटिता भवति ।',
 
 # action=watch/unwatch
 'confirm-watch-button' => 'अस्तु',
 'confirm-watch-top' => 'इदं पृष्ठं भवतः अवेक्षणसूच्यां योजयाम ?',
 'confirm-unwatch-button' => 'अस्तु',
+'confirm-unwatch-top' => 'इदं पृष्ठं भवतः अवेक्षणसूच्याः निष्कास्यताम्',
 
 # Multipage image navigation
+'imgmultipageprev' => 'पूर्वतनं पृष्ठम्',
 'imgmultipagenext' => 'अग्रिमं पृष्ठम्',
 'imgmultigo' => 'गम्यताम् !',
 'imgmultigoto' => '$1 पृष्ठं गम्यताम्',
 
 # Table pager
+'ascending_abbrev' => 'आरुह्',
+'descending_abbrev' => 'अवरुह्',
 'table_pager_next' => 'अग्रिमं पृष्ठम्',
 'table_pager_prev' => 'पूर्वतनं पृष्ठम्',
 'table_pager_first' => 'प्रथमं पृष्ठम्',
 'table_pager_last' => 'अन्तिमं पृष्ठम्',
+'table_pager_limit' => 'प्रतिपृष्ठं $1 वस्तु दर्श्यताम्',
+'table_pager_limit_label' => 'प्रतिपुटं पदार्थाः ।',
 'table_pager_limit_submit' => 'गम्यताम्',
 'table_pager_empty' => 'फलितानि न सन्ति',
 
 # Auto-summaries
 'autosumm-blank' => 'पृष्ठं रिक्तीकृतम्',
+'autosumm-replace' => '"$1" इत्यनेन सह आधेस्य विनिमयः कृतः ।',
+'autoredircomment' => '[[$1]] प्रति पुटं पुनर्निदिष्टम् ।',
 'autosumm-new' => '$1 नवीन पृष्ठं निर्मीत अस्ती',
 
+# Live preview
+'livepreview-loading' => 'सम्पूर्यमाणः.....',
+'livepreview-ready' => 'सम्पूरणं सज्जम् ।',
+'livepreview-failed' => 'साक्षात् पूर्वावलोकनं निष्पलम् ।
+सामान्यपूर्वावलोकनं यतताम् ।',
+'livepreview-error' => '$1 "$2" तः सम्पर्कः न सिद्धः ।
+सामान्यपूर्वावलोकनं यतताम् ।',
+
+# Friendlier slave lag warnings
+'lag-warn-normal' => '$1 {{PLURAL:$1|क्षणम्|क्षणानि}} इति काले सम्भूतपरिवर्तन प्रायः अस्यां सूचिकायां न दर्शितम् ।',
+'lag-warn-high' => 'अत्युन्नतदत्तांशवितारकस्य विलम्बत्वेन {{PLURAL:$1|क्षणम्|क्षणानि}} तः पूर्वं सम्भूतपरिवर्तनं सूचिकायां न दृश्यते ।',
+
+# Watchlist editor
+'watchlistedit-numitems' => 'भवतः अवलोकनावली {{PLURAL:$1|1 शीर्षकम्|$1 शीर्षकानि}}, अन्तर्भूता, सम्भाषणपुटरहिता ।',
+'watchlistedit-noitems' => 'भवतः अवलोकनावली शीर्षकैः रहिता ।',
+'watchlistedit-normal-title' => 'अवलोकनावलीं सम्पादयतु ।',
+'watchlistedit-normal-legend' => 'अवलोकनावलीतः शीर्षकानि अपनयतु ।',
+'watchlistedit-normal-explain' => 'भवतः अवलोकनावल्याः शीर्षकानि अधः दर्शितानि । 
+शीर्षकम् अपनेतुम् अस्य पार्श्वे विद्यमानमञ्जूषाम् अर्गलयतु । पश्चात् {{int:Watchlistedit-normal-submit}}" एतत् तुदतु ।
+भवान् [[Special:EditWatchlist/raw|अपक्वावलोकनावलीं सम्पादयतु ]] कर्तुं शक्नोति ।',
+'watchlistedit-normal-submit' => 'शीर्षकानि अपनयतु ।',
+'watchlistedit-normal-done' => 'भवतः अवलोकनावली तः{{PLURAL:$1|1शीर्षकम्|$1 शीर्षकानि}} अपनीतानि ।',
+'watchlistedit-raw-title' => 'अपक्वाम् अवलोकनावलीं सम्पादयतु ।',
+'watchlistedit-raw-legend' => 'अपक्वाम् अवलोकनावलीं सम्पादयतु ।',
+'watchlistedit-raw-explain' => 'भवतः अवलोकनावल्याः शीर्षकानि अधः दर्शितानि । अपि च भवान् आवलीतः अपनीय संयोज्य वा परिवर्तयितुं शक्नोति । 
+प्रत्येकं लङ्क्तौ एकं शीर्षकम् । 
+समाप्तेः पश्चात् "{{int:Watchlistedit-raw-submit}}" एतत् तुदतु ।
+भवान् [[Special:EditWatchlist|सूक्तसम्पादकस्य]] अपि उपयोजयितुं शक्नोति ।',
+'watchlistedit-raw-titles' => 'शीर्षकाणि :',
+'watchlistedit-raw-submit' => 'अवलोकनावली उपारोप्यताम्',
+'watchlistedit-raw-done' => 'भवतः अवलोकनावली उन्नतीकारोतु ।',
+'watchlistedit-raw-added' => '{{PLURAL:$1|1शीर्षकम्|$1 शीर्षकानि}} संवृद्धानि ।',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1शीर्षकम्|$1 शीर्षकानि}} अपनीतानि ।',
+
 # Watchlist editing tools
 'watchlisttools-view' => 'उचितानि परिवर्तनानि दृश्यन्ताम्',
 'watchlisttools-edit' => 'अवेक्षणसूची दृश्यतां सम्पाद्यतां च',
 'watchlisttools-raw' => 'अपरिष्कृता अवेक्षणसूची सम्पाद्यताम्',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|अम्भाषणम्]])',
+
 # Core parser functions
+'unknown_extension_tag' => 'अज्ञातं वर्तमानसूत्रम् $1',
 'duplicate-defaultsort' => '\'\'\'प्रबोधः\'\'\' पुरानी मूल क्रमांकन कुंजी "$1" के बजाय अब मूल क्रमांकन कुंजी "$2" होगी।',
 
 # Special:Version
 'version' => 'आवृत्तिः',
+'version-extensions' => 'अनुस्थापितानि विस्तरणानि ।',
+'version-specialpages' => 'विशेषपृष्ठानि',
+'version-parserhooks' => 'विन्यासस्य आलम्बः ।',
+'version-variables' => 'भङ्गुरम्',
+'version-antispam' => 'अनिष्टस्य अवरोधः ।',
 'version-skins' => 'छादन',
 'version-other' => 'अन्यत्',
+'version-mediahandlers' => 'माध्यनिर्वाहकाः ।',
+'version-hooks' => 'आलम्बाः ।',
+'version-extension-functions' => 'विस्तरणस्य कार्यकलापाः ।',
+'version-parser-extensiontags' => 'विन्यासविस्तारणस्य सूत्रम् ।',
+'version-parser-function-hooks' => 'विन्यासकलापस्य आलम्बाः ।',
+'version-hook-name' => 'आलम्बस्य नाम ।',
+'version-hook-subscribedby' => 'सदस्यत्वम् अनेन प्राप्तम् ।',
+'version-version' => '(आवृत्तिः$1)',
+'version-license' => 'अनुज्ञापत्रम्',
+'version-poweredby-credits' => "इयं विकिः अनेन सञ्चालिता '''[//www.mediawiki.org/ MediaWiki]''', स्वामित्वम् © 2001 - $1  $2 ।",
 'version-poweredby-others' => 'अन्य',
+'version-license-info' => 'मिडियाविकिः तु निश्शुल्कतन्त्रांशः ; भवान् पुनः वितर्तुं शक्नोति अथवा GNU सामान्यसार्वजनिकानुज्ञपत्रस्य नियमानुगुणं द्वीतीयावृत्तिम् अथवा अन्यनूतनावृतिं संस्कर्तुं शक्नोति । 
+
+एषा बहूपयोगाय भवेत् इति धिया मिडियाविकिः वितीर्णा । किन्तु केनापि प्रमाणत्वेन विना दत्ता । अथवा निर्दिष्टोद्देशर्थे अनुकूलकरं वेति अपरिशील्य अथवा वाणिज्यस्य आनुषङ्गिकानुज्ञापत्रेण विना अपि मीडियाविकिः प्रदत्ता । विशेषविवरणप्राप्तये GNU सर्वजनसामान्यम् अनुज्ञापत्रं पश्यतु ।
+
+[{{SERVER}}{{SCRIPTPATH}}/COPYING काचित् प्रतिः, GNU सर्वजनसामान्यम् अनुज्ञापत्रम्] इत्येतत् भवान् स्वीकृतवान् । अनेन कार्यकलापेन सह , यदि नास्ति, निश्शुल्कतन्त्रज्ञानप्रतिष्ठानं पत्रं प्रेषयतु । सङ्केतः - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html सद्यसः पठितुमर्हति]',
+'version-software' => 'तन्त्रांशः अनुस्थापितः ।',
 'version-software-product' => 'उत्पाद',
 'version-software-version' => 'आवृत्ति',
+'version-entrypoints' => 'प्रवेशबिन्दुः URLs',
+'version-entrypoints-header-entrypoint' => 'प्रवेशबिन्दुः ।',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
+'filepath' => 'सञ्चिकापथः ।',
 'filepath-page' => 'सञ्चिका:',
 'filepath-submit' => 'गम्यताम्',
+'filepath-summary' => 'एतद्विशेषपुटं सञ्चिकायाः पूर्णपथं प्रदर्शयति । 
+चित्राणि परिपूर्णसत्वयुतानि दर्शितानि । अन्यसञ्चिकाभेदाः सम्बद्धकार्यकलापैः प्रत्यक्षं आरब्धाः ।',
 
 # Special:FileDuplicateSearch
+'fileduplicatesearch' => 'प्रतिकृतिसञ्चिकार्थम् अन्विषतु ।',
+'fileduplicatesearch-summary' => 'सम्मिश्रमौल्यामूलयुतर्थं  प्रतिकृतिसञ्चिकार्थम् अन्विषतु ।',
+'fileduplicatesearch-legend' => 'प्रतिकृत्यर्थम् अन्विषतु ।',
 'fileduplicatesearch-filename' => 'सञ्चिकानाम:',
 'fileduplicatesearch-submit' => 'अन्वेषणम्',
+'fileduplicatesearch-info' => '$1 × $2 पिक्सेलानि, संचिकायाः आकारः: $3, MIME-प्रकारः: $4',
+'fileduplicatesearch-result-1' => '"$1" इत्यस्मिन् सादृश्यावृत्तिः नास्ति ।',
+'fileduplicatesearch-result-n' => 'इति सञ्चिका {{PLURAL:$1|सादृश्यप्रतिकृतिः|$2 सादृश्यप्रतिकृतयः}}',
+'fileduplicatesearch-noresults' => '"$1" इति नाम्ना सञ्चिका न दृष्टा ।',
 
 # Special:SpecialPages
 'specialpages' => 'विशेषपृष्ठानि',
-'specialpages-group-login' => 'प्रविश्यताम् / हस्ताङ्कनं क्रियताम्',
+'specialpages-note' => '----
+* साधारणं विशेषपुटम् । 
+* <span class="mw-specialpagerestricted">प्रतिद्धं विशेषपुटम् ।</span>',
+'specialpages-group-maintenance' => 'निर्वहणवृत्तानि ।',
+'specialpages-group-other' => 'अन्यविशेषपुटानि ।',
+'specialpages-group-login' => 'प्रविश्यताम् / लेखा सृज्यताम्',
 'specialpages-group-changes' => 'सद्योजातानि परिवर्तनानि आवल्यश्च',
 'specialpages-group-media' => 'माध्यमस्य इतिवृत्तम् आरोपणानि च',
 'specialpages-group-users' => 'योजकाः अधिकाराश्च',
 'specialpages-group-highuse' => 'अधिकोपयोगीनि पृष्ठानि',
 'specialpages-group-pages' => 'पृष्ठानाम् आवली',
 'specialpages-group-pagetools' => 'पृष्ठोपकरणानि',
+'specialpages-group-wiki' => 'विकिदत्तांशः उपकरणानि च',
+'specialpages-group-redirects' => 'विशेषपृष्ठानां पुनर्निदेशनम्',
+'specialpages-group-spam' => 'अनपेक्षितसन्देशस्य उपकरणानि',
 
 # Special:BlankPage
 'blankpage' => 'रिक्तानि पृष्ठानि',
 #सभी मानक अभिव्यक्ति अंश इस पंक्ति के ऊपर डालें। इस पक्ति को जस का तस छोड़ दें</pre>',
 
 # Special:Tags
+'tags' => 'तर्कसिद्धानि परिवर्तनाङ्कनानि',
 'tag-filter' => '[[Special:Tags|Tag]] शोधनी:',
+'tag-filter-submit' => 'शोधनी',
+'tags-title' => 'अङ्कनानि',
+'tags-intro' => 'एतत्पुटं सार्थसूत्राणि दर्शयति यस्य कोऽपि तन्त्रांशः यत्किमपि सम्पादनम् अङ्कयितुं प्रयोजयति ।',
+'tags-tag' => 'अङ्कननाम',
+'tags-display-header' => 'परिवर्तितसूचीषु प्रदर्शनम्',
+'tags-description-header' => 'अर्थस्य समग्रवर्णनम्',
+'tags-hitcount-header' => 'अङ्कितानि परिवर्तनानि',
 'tags-edit' => 'सम्पाद्यताम्',
 'tags-hitcount' => '$1 {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}',
 
 # Special:ComparePages
 'comparepages' => 'पृष्ठानि तोल्यन्ताम्',
+'compare-selector' => 'पृष्ठसंस्करणानि तोलयतु',
 'compare-page1' => 'पृष्ठम् १',
 'compare-page2' => 'पृष्ठम् २',
 'compare-rev1' => 'संस्करणम् 1',
 'compare-rev2' => 'संस्करणम् २',
 'compare-submit' => 'तोल्यताम्',
+'compare-invalid-title' => 'सूचिता शीर्षिका अमान्या वर्तते ।',
+'compare-title-not-exists' => 'निर्दिष्टं शीर्षकं न विद्यते ।',
+'compare-revision-not-exists' => 'निर्दिष्टं संस्करनं न विद्यते ।',
 
 # Database error messages
 'dberr-header' => 'अस्मिन् विकिमध्ये काचित् समस्या विद्यते',
 'dberr-problems' => 'क्षम्यताम् ! अस्मिन् जालपुटे तान्त्रिकसमस्याः अनुभूयमानाः सन्ति ।',
+'dberr-again' => 'किञ्चित् कालं प्रतीक्ष्य पुनः उपारोप्यताम् ।',
+'dberr-info' => '(दत्ताशं वितारकं सम्पर्कयितुं नैव शक्यते $1 )',
+'dberr-usegoogle' => 'अत्रान्तरे भवान् गूगल् इति शोधनयन्त्रे अन्वेषणं कर्तुं शक्नोति ।',
+'dberr-outofdate' => 'अस्माकम् आधेयस्य तेषाम् अनुक्रमणिका कालातिक्रान्ता इति जानातु ।',
+'dberr-cachederror' => 'एषा सङ्ग्रहितप्रतिः अभ्यर्थितपुटस्य , एषा उन्नतीकृता अपि न स्यात् ।',
 
 # HTML forms
 'htmlform-invalid-input' => 'भवता आरोपितेषु अंशेषु काचन समस्या विद्यते ।',
 'htmlform-select-badoption' => 'भवता निर्दिष्टं मौल्यं युक्तविकल्पः न ।',
 'htmlform-int-invalid' => 'भवता निर्दिष्टं मौल्यं पूर्णाङ्कः न ।',
 'htmlform-float-invalid' => 'भवता निर्दिष्टं मौल्यं संख्या न ।',
+'htmlform-int-toolow' => 'भवता निश्चितं मौल्यं $1 इत्यस्मात् न्यूनम् अस्ति ।',
+'htmlform-int-toohigh' => 'भवता निश्चितं मौल्यं  $1 तः अधिकम् अस्ति ।',
+'htmlform-required' => 'इदं मूल्यम् अपेक्षितम् ।',
+'htmlform-submit' => 'उपस्थाप्यताम्',
+'htmlform-reset' => 'परिवर्तनानि पूर्वस्थितिं प्रति आनयतु',
 'htmlform-selectorother-other' => 'अन्य',
 
+# SQLite database support
+'sqlite-has-fts' => '$1 अन्वेषणसमर्थपूर्णपाठेन सह',
+'sqlite-no-fts' => '$1 अन्वेषणसमर्थपूर्णपाठेन विना',
+
 # New logging system
+'logentry-delete-delete' => '$1 इत्यनेन $3 पुटं निष्कासितम्',
+'logentry-delete-restore' => '$1 इत्यनेन $3 पृष्ठं प्रात्यानीतम्',
+'logentry-delete-event' => '$1 परिवर्तितदृश्यस्य {{PLURAL:$5|a log event|$5 log events}} $3: $4 इत्यस्मिन् ।',
+'logentry-delete-revision' => '$1 इत्येषः $3 पुटस्य {{PLURAL:$5|एका आवृत्तिः|$५ आवृत्तयः}}इत्यस्य दृश्यता परिवर्तिता $4',
+'logentry-delete-event-legacy' => '$1 इत्येतत् $3 पुटे  प्रवेशप्रक्रियायाः दृश्यताः परिवर्तिता ।',
+'logentry-delete-revision-legacy' => '$1 इत्येतत् $3 पुटे आवृत्तीनां दृश्यता  परिवर्तिता ।',
+'logentry-suppress-delete' => '$1 निग्रहितपुटम् $3',
+'logentry-suppress-event' => '$1 परिवर्तितदृश्यस्य {{PLURAL:$5|a log event|$5 log events}} $3: $4 इत्यस्मिन् ।',
+'logentry-suppress-revision' => '$1 इत्येषः $3 पुटस्य {{PLURAL:$5|एका आवृत्तिः|$५ आवृत्तयः}}इत्यस्य दृश्यता परिवर्तिता $4',
+'logentry-suppress-event-legacy' => '$1 इत्येतत् $3 पुटे  प्रवेशप्रक्रियायाः दृश्यताः परिवर्तिता ।',
+'logentry-suppress-revision-legacy' => '$1 इत्येतत् $3 पुटे आवृत्तीनां दृश्यता  परिवर्तिता ।',
+'revdelete-content-hid' => 'आधेयं विलोपितम्',
+'revdelete-summary-hid' => 'सम्पादनसारः विलोपितः',
+'revdelete-uname-hid' => 'योजकस्य नाम सङ्गुप्तम् ।',
+'revdelete-content-unhid' => 'आधेयं न लोपितम्',
+'revdelete-summary-unhid' => 'सम्पादनसारः न लोपितः',
+'revdelete-uname-unhid' => 'योजकस्य नाम न लोपितम्',
+'revdelete-restricted' => 'प्रबन्धकानां प्रतिबन्धनानि आरोपितानि',
+'revdelete-unrestricted' => 'प्रबन्धकानां प्रतिबन्धनानि निष्कासितानि',
 'logentry-move-move' => '$1 इति प्रयोक्त्रा $3 इत्येतत् $4 इत्येतत् प्रति चालितम्',
 'logentry-move-move-noredirect' => '$1 इति प्रयोक्त्रा $3 इति पृष्ठम् $4 इत्येतत् प्रति चालितं, अनुप्रेषणेन विना',
 'logentry-move-move_redir' => '↓
 $1 इत्यनेन $3 इति पृष्ठम् $4 इत्येतत् प्रति चालितं, अनुप्रेषणम् अतिक्रम्य',
 'logentry-move-move_redir-noredirect' => '$1 इति प्रयोक्त्रा $3 इति पृष्ठं $4 इत्येतत् प्रति चालितम्, अनुप्रेषणम् अतिक्रम्य, अनुप्रेषणमोचनेन च विना।',
+'logentry-patrol-patrol' => '$1 अङ्कितावृत्तिः $4 इति पुटस्य $3 आरक्षणम् ।',
+'logentry-patrol-patrol-auto' => '$1 इत्येतत् $3 पुटस्य $4 आवृत्तिं स्वयं चालितरूपात् आरक्षितम् ।',
+'logentry-newusers-newusers' => '$1 योजकलेखाम् असृजत्',
+'logentry-newusers-create' => '$1 योजकलेखाम् असृजत्',
+'logentry-newusers-create2' => '$1,  $3 योजकलेखाम् असृजत्',
+'logentry-newusers-autocreate' => '$1 लेखा स्वयमेव सृष्टं जातम्',
+'newuserlog-byemail' => 'कूटशब्दः ईपत्रद्वारा प्रेषितः',
 
 # Feedback
+'feedback-bugornote' => 'यदि भवान् कस्याश्चित् तान्त्रिकसमस्यायाः विषये विशदीकर्तुम् इच्छति तर्हि [$1 मत्कुणसञ्चिकां करोतु ।]
+अन्यथा चेत् भवान् सरलप्रपत्रम् उपयोक्तुं शक्नोति । भवतः टीका योजकनाम्ना सह भवतः जालगवाक्षेन सह  "[$3 $2]" इत्यस्मिन् पुटे योज्यते ।',
 'feedback-subject' => 'विषय:',
 'feedback-message' => 'संदेश:',
 'feedback-cancel' => 'निवर्तयते',
+'feedback-submit' => 'प्रतिस्पन्दः प्रेष्यताम्',
+'feedback-adding' => 'पृष्ठे प्रतिस्पन्दः योजनीयः ...',
+'feedback-error1' => 'API इत्यस्मात् दोषः : अज्ञातः परिणामः ।',
+'feedback-error2' => 'दोषः : सम्पादनं निष्फलं जातम्',
+'feedback-error3' => 'दोषः : ए पि ऐ तः प्रतिस्पन्दः न प्राप्तः',
+'feedback-thanks' => 'धन्यवादः ! भवतः प्रतिस्पन्दः "[ $2  $1 ]" पृष्ठाय प्रेषितः अस्ति ।',
 'feedback-close' => 'समापित',
+'feedback-bugcheck' => 'उत्तमम् परिशीलयतु यत्  [ $1 known bugs] पूर्वमेव नासीत् इति ।',
+'feedback-bugnew' => 'अहं परीक्षितवान् ।  नूतनदोषं सूचयतु ।',
+
+# API errors
+'api-error-badaccess-groups' => 'भवान् अस्यां वीक्यां सञ्चिकाः उत्तारयितुम् नानुमतः ।',
+'api-error-badtoken' => 'आन्तरिकदोषः : दुष्टप्रतीकः ।',
+'api-error-copyuploaddisabled' => 'अस्मिन् वितारके युआर् एल् द्वारा उत्तारणं निष्क्रियम् ।',
+'api-error-duplicate' => '{{PLURAL:$1| [ $2 अन्यसञ्चिकाः] | सन्ति [ $2 काश्चन अन्यसञ्चिकाः]}} एकस्मिन् एव ।',
+'api-error-duplicate-archive' => 'तत्र {{PLURAL:$1|आसीत् [$2 काश्चन अन्यसञ्चिकाः] |  [$2काचन अन्यसञ्चिकाः]}}, पूर्वमेव {{PLURAL:$1|यह was|they आसन्}} किन्तु अपनीताः ।',
+'api-error-duplicate-archive-popup-title' => 'द्विप्रतिः {{PLURAL:$1| सञ्चिका |सञ्चिकाः}} पूर्वमेव अपमर्जिताः ।',
+'api-error-duplicate-popup-title' => 'द्विप्रतिः {{PLURAL:$1| सञ्चिका| सञ्चिकाः}}',
+'api-error-empty-file' => 'समर्पिता सञ्चिका रिक्ता आसीत् ।',
+'api-error-emptypage' => 'नूतनस्य रिक्तस्य पृष्ठस्य सर्जनं निषिद्धम् ।',
+'api-error-fetchfileerror' => 'आन्तरिकदोषः : सञ्चिकायाः प्राप्त्यवसरे कश्चन दोषः जातः ।',
+'api-error-fileexists-forbidden' => '"$1" नामिका सञ्चिका पूर्वमेव विद्यते । पुनः तदुपरि लेखनम् अशक्यम् ।',
+'api-error-fileexists-shared-forbidden' => '"$1" इति नाम्नः सञ्चिका पूर्वमेव सञ्चिकाकोशे अस्ति । अधिलिखितं न स्यात् ।',
+'api-error-file-too-large' => 'समर्पिता सञ्चिका सुदीर्घा अस्ति ।',
+'api-error-filename-tooshort' => 'सञ्चिकानाम अतीव ह्रस्वम् अस्ति ।',
+'api-error-filetype-banned' => 'ईदृशी सञ्चिका अनुरुद्धा ।',
+'api-error-filetype-banned-type' => '\'\'\'".$1"\'\'\'सञ्चिका {{PLURAL:$4|प्रकारस्य }} अनुमतिः नास्ति ।
+प्रकारसञ्चिकायाः{{PLURAL:$3|}} अनुमतिरस्ति  $2।',
+'api-error-filetype-missing' => 'अस्याः सञ्चिकायाः विस्तारः लुप्तः अस्ति ।',
+'api-error-hookaborted' => 'भवतः संस्करणप्रयत्नः विस्तारेण अपसारितः ।',
+'api-error-http' => 'आन्तरिकदोषः : वितारकस्य सम्पर्के असमर्थम् ।',
+'api-error-illegal-filename' => 'सञ्चिकानामलेखनं नानुमतम् ।',
+'api-error-internal-error' => 'आन्तरिकदोषः : वीक्यां भवतः उत्तारणावसरे काचनदोषः संवृत्तः ।',
+'api-error-invalid-file-key' => 'आन्तरिकदोषः : अनित्यसञ्चिकाकोशे सञ्चिका न दृष्टा ।',
+'api-error-missingparam' => 'आन्तरिकदोषः : अभ्यर्थनानुगुणं व्याप्तिः विलुप्ता ।',
+'api-error-missingresult' => 'आन्तरिकदोषः : प्रतिकृतिः सफला इति निश्चिता नाभवत् ।',
+'api-error-mustbeloggedin' => 'सञ्चिकायाः उपारोपणाय अन्तः प्रवेशः अनिवार्यः ।',
+'api-error-mustbeposted' => 'आन्तरिकदोषः : HTTP प्रस्तोतुम् अभ्यर्थनम् आवश्यकम् ।',
+'api-error-noimageinfo' => 'उत्तारणं सफलम् । किन्तु सञ्चिकाविषये वितारकः कामपि सूचनां न अयच्छतु ।',
+'api-error-nomodule' => 'आन्तरिकदोषः : उत्तारणघटकः न व्यवस्थितः ।',
+'api-error-ok-but-empty' => 'आन्तरिकदोषः : वितारकतः प्रतिस्पन्दः न प्राप्तः ।',
+'api-error-overwrite' => 'वर्तमानसञ्चिकायाः पुनर्लेखनं नानुमतम् ।',
+'api-error-stashfailed' => 'आन्तरिकदोषः : तात्कालिकसञ्चिकायाः रक्षणे वितारकः असमर्थः जातः ।',
+'api-error-timeout' => 'अपेक्षितावधौ वितारकेण प्रतिस्पन्दः न दर्शितः ।',
+'api-error-unclassified' => 'कश्चन अज्ञातः दोषः जातः ।',
+'api-error-unknown-code' => 'अज्ञातः दोषः " $1 "',
+'api-error-unknown-error' => 'आन्तरिकदोषः : सञ्चिकायाः आरोपणावसरे कश्चन दोषः जातः ।',
+'api-error-unknown-warning' => 'अज्ञातः प्रबोधः "$1"',
+'api-error-unknownerror' => 'अज्ञातः दोषः " $1 "',
+'api-error-uploaddisabled' => 'अस्यां वीक्याम् आरोपणं निष्क्रिया कृता अस्ति ।',
+'api-error-verification-error' => 'इयं सञ्चिका सदोषा स्यात् अथवा विस्तारः दोषयुक्तः स्यात् ।',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|क्षणम्|क्षणानि}}',
+'duration-minutes' => '$1 {{PLURAL:$1|निमेषः|निमेषाः}}',
+'duration-hours' => '$1 {{PLURAL:$1|घण्टा|घण्टाः}}',
+'duration-days' => '$1 {{PLURAL:$1|दिनम्|दिनानि}}',
+'duration-weeks' => '$1 {{PLURAL:$1|सप्ताहः|सप्ताहाः}}',
+'duration-years' => '$1 {{PLURAL:$1|वर्षम्|वर्षाणि}}',
+'duration-decades' => '$1 {{PLURAL:$1|दशकम्|दशकानि}}',
+'duration-centuries' => '$1 {{PLURAL:$1|शतकम्|शतकानि}}',
+'duration-millennia' => '$1 {{PLURAL:$1|सहस्राब्धः|सहस्राब्धाः}}',
 
 );
index cfc70f2..935f965 100644 (file)
@@ -50,7 +50,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ',
 'tog-newpageshidepatrolled' => 'Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ',
 'tog-extendwatchlist' => 'Кэтээһин тупсарыллыбыт испииһэгэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)',
-'tog-usenewrc' => 'Саҥа Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bлаÑ\80 Ñ\82Ñ\83пÑ\81аÑ\80Ñ\8bллÑ\8bбÑ\8bÑ\82 Ð¸Ñ\81пииһÑ\8dкÑ\82Ñ\8dÑ\80ин Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83Ñ\83 (JavaScript баар буолуохтаах)',
+'tog-usenewrc' => 'Саҥа Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bлаÑ\80 Ñ\83онна ÐºÑ\8dÑ\82Ñ\8dбил Ñ\82иһикÑ\82Ñ\8dÑ\80игÑ\8dÑ\80 Ñ\83лаÑ\80Ñ\8bйÑ\8bÑ\8bлаÑ\80Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\82Ò¯Ò¯Ñ\80гÑ\8d (JavaScript баар буолуохтаах)',
 'tog-numberheadings' => 'Бас тыллары нүөмэрдээ',
 'tog-showtoolbar' => 'Көннөрүү үстүрүмүөннэрин көрдөр (JavaScript)',
 'tog-editondblclick' => 'Хоһулатан иккитэ баттаан сирэйи уларытыы (JavaScript)',
@@ -58,17 +58,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Сиэксийэ баһыгар уҥа тимэҕинэн<br />баттаан сиэксийэни көннөрүү (JavaScript)',
 'tog-showtoc' => 'Иһинээҕитин көрдөр (ыстатыйа үстэн ордук бас тыллаах буоллаҕына)',
 'tog-rememberpassword' => 'Миигин бу браузерга сигээ ($1 {{PLURAL:$1|күн|күнтэн ордуга суох}})',
-'tog-watchcreations' => 'Суруйбут ыстатыйаларбын кэтээн көрүүгэ киллэрэн ис',
-'tog-watchdefault' => 'Уларыппыт сирэйдэрбин кэтээн көрүү испииһэгэр киллэрэн ис',
-'tog-watchmoves' => 'Аатын уларыппыт сирэйдэрбин кэтээн көрүү испииһэгэр киллэрэн ис',
-'tog-watchdeletion' => 'Соппут сирэйдэрбин кэтээн көрүү испииһэгэр киллэрэн ис',
+'tog-watchcreations' => 'Суруйбут ыстатыйаларбын уонна укпут билэлэрбин кэтээн көрүүгэ киллэрэн ис',
+'tog-watchdefault' => 'Уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис',
+'tog-watchmoves' => 'Аатын уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү испииһэгэр киллэрэн ис',
+'tog-watchdeletion' => 'Соппут сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис',
 'tog-minordefault' => 'Уларытыылары атын этиллибэтэҕинэ кыра уларытыы курдук бэлиэтээ',
 'tog-previewontop' => 'Хайдах буоларын уларытар түннүк үрдүнэн (иннигэр) көрдөр',
 'tog-previewonfirst' => 'Хайдах буоларын тута көрдөр',
 'tog-nocache' => 'Браузерга сирэйи кэштыыры араар',
-'tog-enotifwatchlistpages' => 'Кэтиир сирэйдэрим уларыйдахтарына e-mail көмөтүнэн биллэр',
+'tog-enotifwatchlistpages' => 'Ð\9aÑ\8dÑ\82ииÑ\80 Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80им Ñ\83онна Ð±Ð¸Ð»Ñ\8dлÑ\8dÑ\80им Ñ\83лаÑ\80Ñ\8bйдаÑ\85Ñ\82аÑ\80Ñ\8bна e-mail ÐºÓ©Ð¼Ó©Ñ\82үнÑ\8dн Ð±Ð¸Ð»Ð»Ñ\8dÑ\80',
 'tog-enotifusertalkpages' => 'Ырытар сирэйим уларыйдаҕына эл. почтанан биллэр',
-'tog-enotifminoredits' => 'Кыра да уларытыы киирдэҕинэ эл. почтанан биллэр',
+'tog-enotifminoredits' => 'Кыра да уларытыы киирдэҕинэ эл. почтанан биллэрээр',
 'tog-enotifrevealaddr' => 'Мин почтам аадырыһын биллэриилэргэ көрдөр',
 'tog-shownumberswatching' => 'Сирэйи кэтээн көрөр дьон ахсаанын көрдөр',
 'tog-oldsig' => 'Баар илии баттааһын:',
@@ -84,7 +84,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Бэлиэтэммит кыттааччылар уларытыыларын кэтиир испииһэккэ көрдөрүмэ',
 'tog-watchlisthideanons' => 'Ааттарын эппэтэх кыттааччылар уларытыыларын кэтээһин испииһэгэр көрдөрүмэ',
 'tog-watchlisthidepatrolled' => 'Ботурууллааччы көрбүт көннөрүүтүн кэтээһин испииһэгэр көрдөрүмэ',
-'tog-nolangconversion' => 'Сурук систематын уларытары боп',
 'tog-ccmeonemails' => 'Атын кыттааччыларга суруйбут суруктарбын бэйэбэр эмиэ ыыт',
 'tog-diffonly' => 'Икки барылы тэҥнииргэ сирэй иһин көрдөрүмэ',
 'tog-showhiddencats' => 'Кистэммит категориялары көрдөр',
@@ -307,6 +306,9 @@ $1',
 'youhavenewmessages' => '$1 ($2) кэллэ',
 'newmessageslink' => 'саҥа суруктар',
 'newmessagesdifflink' => 'кэлиҥҥи уларытыы',
+'youhavenewmessagesfromusers' => 'Маны $1 {{PLURAL:$3|соҕотох кыттааччыттан|$3 кыттааччыттан}} туппуккун ($2).',
+'youhavenewmessagesmanyusers' => 'Маны $1 элбэх кыттааччыттан туппуккун ($2).',
+'newmessagesdifflinkplural' => 'тиһэх {{PLURAL:$1|уларытыы|уларытыылар}}',
 'youhavenewmessagesmulti' => '$1, саҥа суруктар кэллилэр',
 'editsection' => 'уларыт',
 'editold' => 'уларыт',
@@ -397,6 +399,8 @@ $1',
 'cannotdelete' => '«$1» сирэй эбэтэр билэ сотуллар кыаҕа суох.
 Ким эрэ инники сотторбут буолуон сөп.',
 'cannotdelete-title' => '«$1» сирэйи сотор сатаммат',
+'delete-hook-aborted' => 'Көннөрүү төттөрү көннөрүллүбүт.
+Эбии туох да быһаарыллыбатах.',
 'badtitle' => 'Табыллыбат аат',
 'badtitletext' => 'Ыйытыллыбыт сирэй аата сыыһа, иччитэх, эбэтэр сыыһа ыйынньыктаах тыллар ыккардыларынааҕы дуу, биикилэр ыккардыларынааҕы дуу аат.',
 'perfcached' => 'Бу кээстэн ылыллыбыт онон бүтэһик уларыйыылары аахсымыан сөп. Кээскэ {{PLURAL:$1|соҕотох суруктан|$1 суруктан}} ордук хараллыбат.',
@@ -427,6 +431,9 @@ $2',
 
 Бу эрэсиими туруорбут дьаһабыл маннык быһаарыыны хаалларбыт: «''$3''».",
 'invalidtitle-knownnamespace' => '«$2» аат далыгар маннык тиэкистээх «$3» сатаммат аат',
+'invalidtitle-unknownnamespace' => 'Биллибэт аат дала $1 нүөмэрдээх, "$2" тиэкистээх сатаммат аат',
+'exception-nologin' => 'Ааккын билиһиннэрбэтэххин',
+'exception-nologin-text' => 'Маны көрөргө эбэтэр оҥорорго ааккын билиһиннэриэхтээххин.',
 
 # Virus scanner
 'virus-badscanner' => "Сатаммата. Вирус сканера биллибэтэ: ''$1''",
@@ -520,6 +527,7 @@ $2',
 'invalidemailaddress' => 'Киллэрбит аадырыһыҥ эл. почта аадырыһыгар майгыннаабат.
 Сөпкө суруй эбэтэр кураанах хааллар.',
 'cannotchangeemail' => 'Бу биикигэ бу аакка баайыллыбыт электроннай почта аадырыһа уларытыллар кыаҕа суох эбит.',
+'emaildisabled' => 'Бу ситим-сир сурук ыыппат эбит.',
 'accountcreated' => 'Саҥа аат иҥэрилиннэ',
 'accountcreatedtext' => 'Кыттааччы $1 диэн ааттанна.',
 'createaccount-title' => '{{SITENAME}} бырайыакка саҥа аат оҥоруу',
@@ -801,6 +809,7 @@ IP-аадырыһа эрэ көстөр.
 'edit-no-change' => 'Эн көннөрүүҥ киирбэтэ, тоҕо диэтэххэ тугу да уларыппатаххын.',
 'edit-already-exists' => 'Саҥа сирэйи оҥорор табыллыбат.
 Маннык сирэй баар эбит.',
+'defaultmessagetext' => 'Туспа этиллибэтэҕинэ суруллар тиэкис',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Болҕой. Бу сирэй наһаа элбэх көмпүүтэри ноҕуруускалыыр ресурсаларга сигэнэр.
@@ -816,6 +825,10 @@ IP-аадырыһа эрэ көстөр.
 '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-warning' => 'Сирэйгэ угуллубут билэлэр аһара элбээбиттэр',
+'parser-unstrip-recursion-limit' => 'Рекурсия ахсаана таһынан барбыт ($1)',
 
 # "Undo" feature
 'undo-success' => 'Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.',
@@ -995,6 +1008,8 @@ $1",
 
 # Diffs
 'history-title' => 'Көннөрүү сурунаала "$1"',
+'difference-title' => '$1 — барыллар ыккардыларынааҕы ураты',
+'difference-title-multipage' => '"$1" сирэйдэр "$2" уратылара',
 'difference-multipage' => '(Сирэйдэр ыккардыларынааҕы уратылар)',
 'lineno' => '$1 строка:',
 'compareselectedversions' => 'Талыллыбыт торумнары тэҥнээ',
@@ -1089,6 +1104,7 @@ $1",
 'prefs-beta' => 'Бета-туруоруулар',
 'prefs-datetime' => 'Күнэ-дьыла уонна кэмэ',
 'prefs-labs' => 'Тургутуллар туруоруулар',
+'prefs-user-pages' => 'Кыттааччы сирэйдэрэ',
 'prefs-personal' => 'Кыттааччы туруоруулара',
 'prefs-rc' => 'Кэлиҥҥи уларытыылар',
 'prefs-watchlist' => 'Кэтээһин',
@@ -1381,6 +1397,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'newsectionsummary' => '/* $1 */ саҥа сиэксийэ',
 'rc-enhanced-expand' => 'Сиһилии көрдөр (JavaScript туһаныллар)',
 'rc-enhanced-hide' => 'Сиһилиитин көрдөрүмэ',
+'rc-old-title' => 'бастаан бу аатынан суруллубут "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Сигэнэр уларытыылар',
@@ -1409,9 +1426,9 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 Урут суруллубут билэлэри көрөргө манна тиий: [[Special:FileList|ойуулар тиһиктэрэ]]. Билэлэри суруйуу уонна иккистээн суруйуу устуоруйата [[Special:Log/upload|манна]], сотуу устуоруйата [[Special:Log/delete|манна]] көстөллөр.
 
 Ойууну ыстатыйаҕа киллэрэргэ маннык суруйуллар:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' ойуу хайдах баарынан (кыччаппакка)
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|хос быһаарыы]]</nowiki></tt>''' 200 пииксэл кэтиттээх аллараа өттүгэр быһаарыы суруктаах экран хаҥас кырыытыгар сыстар ойуу
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' - ойууну бэйэтин көрдөрбөккө сигэтин эрэ көрдөрүү.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ойуу хайдах баарынан (кыччаппакка)
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|хос быһаарыы]]</nowiki></code>''' 200 пииксэл кэтиттээх аллараа өттүгэр быһаарыы суруктаах экран хаҥас кырыытыгар сыстар ойуу
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' - ойууну бэйэтин көрдөрбөккө сигэтин эрэ көрдөрүү.",
 'upload-permitted' => 'Көҥүллэммит билэ көрүҥнэрэ: $1.',
 'upload-preferred' => 'Маннык билэ көрүҥнэрин туһанар ордук: $1.',
 'upload-prohibited' => 'Маннык билэ көрүҥнэрэ бобуллубуттар: $1.',
@@ -1455,20 +1472,20 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'largefileserver' => 'Билэ ыйааһына көҥүллэммиттэн ордук.',
 'emptyfile' => 'Суруйбут билэҥ арааһа кураанах быһылаах. Баҕар билэ аатын сыыһа суруйбутуҥ буолаарай. Өссө төгүл көр.',
 'windows-nonascii-filename' => 'Бу биики ASCII табылыыссатыгар суох бэлиэлэри өйөөбөт..',
-'fileexists' => "Инник ааттаах билэ бэлиэр баар эбит, ону уларытыаххын саарбахтыыр буоллаххына - маны көр '''<tt>[[:$1]]</tt>'''.
-[[$1|thumb]]",
-'filepageexists' => "Бу билэни быһаарар сирэй урут бу аатынан оҥоһуллубут эбит: '''<tt>[[:$1]]</tt>''', ол гынан баран маннык ааттаах сирэй суох.
+'fileexists' => 'Инник ааттаах билэ бэлиэр баар эбит, ону уларытыаххын саарбахтыыр буоллаххына - маны көр <strong>[[:$1]]</strong>.
+[[$1|thumb]]',
+'filepageexists' => 'Бу билэни быһаарар сирэй урут бу аатынан оҥоһуллубут эбит: <strong>[[:$1]]</strong>, ол гынан баран маннык ааттаах сирэй суох.
 Киллэрбит быһаарыыҥ быһаарыы сирэйигэр тахсыа суоҕа.
 Саҥа быһаарыыны эбэр буоллаххына илиигинэн уларытыаххын наада.
-[[$1|thumb]]",
-'fileexists-extension' => "Майгынныыр ааттаах билэ баар: [[$2|thumb]]
-* Эн суруйбут билэҥ аата: '''<tt>[[:$1]]</tt>'''
-* Уруккуттан баар билэ аата: '''<tt>[[:$2]]</tt>'''
-Атын аатта таларыҥ буоллар.",
-'fileexists-thumbnail-yes' => "Ойуу арааһа кыччатыллыбыт ойуу (миниатюра) быһыылаах. [[$1|thumb]]
-Көр '''<tt>[[:$1]]</tt>'''.
-Бу ойуу урукку ойуу кыччатыллыбыта буоллаҕына суруйар наадата суох.",
-'file-thumbnail-no' => "Билэ аата мантан саҕаланар '''<tt>$1</tt>'''.
+[[$1|thumb]]',
+'fileexists-extension' => 'Майгынныыр ааттаах билэ баар: [[$2|thumb]]
+* Эн суруйбут билэҥ аата: <strong>[[:$1]]</strong>
+* Уруккуттан баар билэ аата: <strong>[[:$2]]</strong>
+Атын аатта таларыҥ буоллар.',
+'fileexists-thumbnail-yes' => 'Ойуу арааһа кыччатыллыбыт ойуу (миниатюра) быһыылаах. [[$1|thumb]]
+Көр <strong>[[:$1]]</strong>.
+Бу ойуу урукку ойуу кыччатыллыбыта буоллаҕына суруйар наадата суох.',
+'file-thumbnail-no' => "Билэ аата мантан саҕаланар <strong>$1</strong>.
 Арааһа ойуу кыра куоппуйата быһыылаах ''(миниатюра)''.
 Бу ойуу толору барыйаана баар буоллаҕына ону манна суруй, эбэтэр аатын уларыт.",
 'fileexists-forbidden' => 'Маннык ааттаах билэ баар, хат суруллар кыаҕа суох.
@@ -1537,6 +1554,7 @@ $1',
 'upload-too-many-redirects' => 'URL наһаа элбэх утаарыылаах',
 'upload-unknown-size' => 'Биллибэт кээмэй',
 'upload-http-error' => 'HTTP алҕаһа таҕыста: $1',
+'upload-copy-upload-invalid-domain' => 'Бу домеҥҥа хачайдааһыны хатылыыр табыллыбат.',
 
 # File backend
 'backend-fail-stream' => '$1 билэни ыытар табыллыбата.',
@@ -1555,11 +1573,13 @@ $1',
 'backend-fail-closetemp' => 'Быстах кэмнээх билэни сабар табыллыбата.',
 'backend-fail-read' => '$1 билэни ааҕар табыллыбата.',
 'backend-fail-create' => '$1 билэни суруттарар табыллыбата.',
+'backend-fail-maxsize' => '$1 билэни суруттарар табыллыбата, тоҕо диэтэххэ кини кээмэйэ $2 баайты куоһарар.',
 'backend-fail-readonly' => '«$1» сиэрбэр «ааҕыы эрэ» эрэсиимҥэ турар. Төрүөтэ: «$2»',
 'backend-fail-synced' => '«$1» билэ сөпсөһүллүбэтэх туруктаах эбит',
 'backend-fail-connect' => 'Маны кытта «$1» холбонор табыллыбата.',
 'backend-fail-internal' => 'Манна «$1» биллибэт алҕас таҕыста.',
 'backend-fail-contenttype' => 'Билэ иһинээҕитин көрүҥүн араарар сатамматаҕын түмүгэр манна «$1» угар табыллыбата.',
+'backend-fail-usable' => '$1 билэни суруттарар табыллыбата, тоҕо диэтэххэ быраабыҥ тиийбэтэ эбэтэр анаммыт паапка суох буолан биэрдэ.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Маны "$1" хааччаҕын устар табыллыбата; кини хааччахтамматах.',
@@ -1570,6 +1590,7 @@ $1',
 'lockmanager-fail-releaselock' => '"$1" хааччаҕын устар сатаммата.',
 'lockmanager-fail-db-bucket' => '$1 сегмеҥҥа хааччах баазаларын кытта ситими ситиһэр табыллыбата.',
 'lockmanager-fail-db-release' => '$1 билии олоҕун хааччахтааһынын устар табыллыбата.',
+'lockmanager-fail-svr-acquire' => '$1 сиэрбэр хааччахтааһынын ылар табыллыбата.',
 'lockmanager-fail-svr-release' => '$1 сиэрбэр хааччахтааһынын устар табыллыбата.',
 
 # ZipDirectoryReader
@@ -1677,6 +1698,10 @@ $1',
 Эбии информацияны [$2 туһунан сирэй]гэ булуохха сөп.',
 'sharedupload-desc-here' => '$1 бу билэтэ атын бырайыактарга эмиэ туттуллуон сөп.
 [$2 туһунан сирэй]тэн ылыллыбыт тиэкис аллара көрдөрүлүннэ.',
+'sharedupload-desc-edit' => 'Бу билэ манна сытар $1, хас да ситим-сиргэ туттуллар кыахтаах.
+[$2 билэ туһунан] сирэйи уларытыахха сөп.',
+'sharedupload-desc-create' => 'Бу билэ манна сытар $1, хас да ситим-сиргэ туттуллар кыахтаах.
+[$2 билэ туһунан] сирэйи уларытыахха сөп.',
 'filepage-nofile' => 'Маннык ааттаах билэ суох.',
 'filepage-nofile-link' => 'Маннык ааттаах билэ суох. Ол гынан баран эн [$1 суруттарыаххын] сөп.',
 'uploadnewversion-linktext' => 'Бу билэ саҥа барылын суруттар',
@@ -1715,7 +1740,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'MIME көрдөөһүн',
-'mimesearch-summary' => 'Бу сирэй MIME көрүҥнээх фильтрдааһыны көҥүллүүр. Киллэрии: contenttype/subtype, холобур <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Бу сирэй MIME көрүҥнээх фильтрдааһыны көҥүллүүр. Киллэрии: contenttype/subtype, холобур <code>image/jpeg</code>.',
 'mimetype' => 'MIME көрүҥэ:',
 'download' => 'хачайдаан ылыы',
 
@@ -1868,6 +1893,7 @@ $1',
 Сурунаал көрүҥүнэн, кыттааччы аатынан (улахан-кыра буукубата учуоттанар) эбэтэр сирэй аатынан (эмиэ улахана-кырата учуоттанар) наардыаххытын сөп.',
 'logempty' => 'Сурунаалга сөп түбэһэр элэмиэннэр суохтар.',
 'log-title-wildcard' => 'Бу сурук бэлиэлэриттэн (буукубалартан) саҕаланар ааттары бул',
+'showhideselectedlogentries' => 'Талыллыбыт суруктары кистээ/көрдөр',
 
 # Special:AllPages
 'allpages' => 'Сирэйдэр барыта',
@@ -1885,8 +1911,11 @@ $1',
 'allpagesprefix' => 'Мантан саҕаланар сирэйдэри бул:',
 'allpagesbadtitle' => 'Сирэй маннык ааттанара сатаммат: аакка туттуллуо суохтаах бэлиэлэрдээх эбэтэр тыллар ыккардыларыгар туһаныллар ыйынньыктаах.',
 'allpages-bad-ns' => '{{SITENAME}} не содержит пространства имён «$1».',
+'allpages-hide-redirects' => 'Утаарыылары кистээ',
 
 # SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Сирэй кээстэммит барылын көрөҕүн, $1 ынараа өттүгэр саҥардыллыбыт буолуон сөп.',
+'cachedspecial-viewing-cached-ts' => 'Сирэй кээскэ киирбит барылын көрөҕүн, дьиҥнээх сирэй чыҥха атын буолуон сөп.',
 'cachedspecial-refresh-now' => 'Бүтэһик барылы көр.',
 
 # Special:Categories
@@ -1910,7 +1939,7 @@ $1',
 'linksearch-ok' => 'Бул',
 'linksearch-text' => 'Туруоран биэрэр бэлиэлэри туһаныахха сөп, холобур, "*.wikipedia.org".
 Саатар үрдүкү таһымнаах домен наада эбит, холобур "*.org".<br />
-Өйүүр боротокуоллар: <tt>$1</tt> (көрдүүргэр балартан ханныгын да эбимэ)',
+Өйүүр боротокуоллар: <code>$1</code> (көрдүүргэр балартан ханныгын да эбимэ)',
 'linksearch-line' => 'Мантан $2 манна $1 ыйынньык',
 'linksearch-error' => 'Туруоран биэрэр бэлиэлэри аадырыс/hostname саҕаланыытыгар эрэ туттуохха сөп.',
 
@@ -2325,8 +2354,8 @@ $1',
 'ipb-confirm' => 'Хааччаҕы бигэргэт',
 'badipaddress' => 'IP аадырыһа сыыһа',
 'blockipsuccesssub' => 'Тохтотулунна',
-'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] Ð±Ð¾Ð±Ñ\83ллÑ\83бÑ\83Ñ\82\82оÑ\85Ñ\82оÑ\82Ñ\83ллÑ\83бÑ\83т.<br />
-[[Special:BlockList|Бобуллубут IP-лар испииһэктэрин]] көр.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] Ð±Ð¾Ð±Ñ\83ллÑ\83бÑ\83Ñ\82\85ааÑ\87Ñ\87аÑ\85Ñ\82аммÑ\8bт.<br />
+[[Special:BlockList|Бобуллубут IP-лар тиһиктэрин]] көр.',
 'ipb-blockingself' => 'Эн бэйэҕин хааччахтаан эрэҕин! Ону өйдүүгүн дуо?',
 'ipb-confirmhideuser' => 'Кытааччыны хааччахтаан уонна аатын кистээн эрэҕин. Аата мантан инньэ тиһиктэргэ уонна сурунаалларга көстүбэт буолуо. Бигэргэтэҕин дуо?',
 'ipb-edit-dropdown' => 'Бобуу биричиинэтин уларыт',
@@ -2378,7 +2407,7 @@ $1',
 'reblock-logentry' => 'манна [[$1]] аналлаах хааччахтааһын туруоруулара уларыйда, болдьоҕо $2 $3',
 'blocklogtext' => 'Кыттааччылары хааччахтааһын уонна ол хааччахтааһыннарын суох гыныы сурунаала.
 Аптамаатынан хааччахтаммыт IP-лар манна көстүбэттэр.
-[[Special:BlockList|Билигин баар хааччахтаныылар испииһэктэрин]] көр.',
+[[Special:BlockList|Билигин баар хааччахтаныылар тиһиктэрин]] көр.',
 'unblocklogentry' => '$1 хааччахтааһыны уһулла',
 'block-log-flags-anononly' => 'ааттамматах кыттааччылар эрэ',
 'block-log-flags-nocreate' => 'саҥа бэлиэтэнии бобуллубут',
@@ -2747,19 +2776,15 @@ $1',
 'spambot_username' => 'Спамы ыраастааһын',
 'spam_reverting' => 'Манна: $1 ыйынньыга суох бүтэһик торуму сөргүтүү (төннөрүү)',
 'spam_blanking' => 'Бары торумнар манна "$1" ыйынньыктаахтар, барытын суох оҥоруу',
+'spam_deleting' => 'Бары барыллар манна "$1" сигэнэллэр эит, сотуу бара турар',
 
 # Info page
 'pageinfo-title' => '"$1" туһунан',
 'pageinfo-header-edits' => 'Уларытыылар',
-'pageinfo-header-watchlist' => 'Кэтээһин тиһигэ',
-'pageinfo-header-views' => 'Көрүүлэр',
-'pageinfo-subjectpage' => 'Сирэй',
-'pageinfo-talkpage' => 'Ырытыы сирэйэ',
+'pageinfo-views' => 'Көрүү ахсаана',
 'pageinfo-watchers' => 'Кэтээччилэр ахсааннара',
 'pageinfo-edits' => 'Көннөрүү ахсаана',
-'pageinfo-authors' => 'Араас ааптардар ахсааннара',
-'pageinfo-views' => 'Көрүү ахсаана',
-'pageinfo-viewsperedit' => 'Биир уларытыыга тиксэр көрүү ахсаана',
+'pageinfo-authors' => 'Бу сирэйи уларыппыт ааптардар ахсааннара',
 
 # Skin names
 'skinname-standard' => 'Классика',
@@ -3454,6 +3479,8 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'version-software' => 'Туруоруллубут бырагырааммалар',
 'version-software-product' => 'Бородуукта',
 'version-software-version' => 'Барыл (торум)',
+'version-entrypoints-header-entrypoint' => 'Киирии сирэ',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Билэ суола',
@@ -3615,9 +3642,12 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'api-error-empty-file' => 'Ыыппыт билэҥ кураанах.',
 'api-error-emptypage' => 'Саҥа кураанах сирэйи оҥорор табыллыбат.',
 'api-error-fetchfileerror' => 'Ис алҕас: билэни ыларга туох эрэ сатаммата.',
+'api-error-fileexists-forbidden' => 'Маннык "$1" ааттаах билэ хайыы үйэ баар уонна хат суруллар кыаҕа суох эбит.',
+'api-error-fileexists-shared-forbidden' => '«$1» диэн ааттаах билэ уопсай харайар сиргэ баар уонна хат суруллар кыаҕа суох эбит.',
 'api-error-file-too-large' => 'Ыыппыт билэҥ наһаа улахан эбит.',
 'api-error-filename-tooshort' => 'Билэҥ аата наһаа кылгас.',
 'api-error-filetype-banned' => 'Маннык көрүҥнээх билэлэр бобуулаахтар.',
+'api-error-filetype-banned-type' => '$1 — {{PLURAL:$4|билэ бобуллубут көрүҥэ|билэ бобуллубут көрүҥнэрэ}}.. Көҥүллэммит билэ {{PLURAL:$3|көрүҥэ маннык|көрүҥнэрэ манныктар}}: $2.',
 'api-error-filetype-missing' => 'Бу билэ тэнитиитэ (расширение) суох эбит.',
 'api-error-hookaborted' => 'Эн киллэрбит уларытыыгын кэҥэтии таҥастааччыта оннугар төннөрбүт.',
 'api-error-http' => 'Ис алҕас: Сиэрбэргэ холбонор табыллыбата.',
@@ -3642,4 +3672,15 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'api-error-uploaddisabled' => 'Бу биикигэ хачайдыыр араарыллыбыт эбит.',
 'api-error-verification-error' => 'Бу билэ алдьаммыт эбэтэр табыгаһа суох кэҥэтиилээх.',
 
+# Durations
+'duration-seconds' => '$1 сөкүүндэ',
+'duration-minutes' => '$1 мүнүүтэ',
+'duration-hours' => '$1 чаас',
+'duration-days' => '$1 хонук',
+'duration-weeks' => '$1 нэдиэлэ',
+'duration-years' => '$1 сыл',
+'duration-decades' => '$1 декаада',
+'duration-centuries' => '$1 үйэ',
+'duration-millennia' => '$1 тыһыынча сыл',
+
 );
index 6289a79..dd50025 100644 (file)
@@ -1152,10 +1152,6 @@ Ona te source em ńel daṛeaḱ',
 
 # Info page
 'pageinfo-header-edits' => 'Toṅgeko',
-'pageinfo-header-watchlist' => 'Ńeloḱ tạlika',
-'pageinfo-header-views' => 'Ńelme',
-'pageinfo-subjectpage' => 'Sakam',
-'pageinfo-talkpage' => 'Galmarao sakam',
 'pageinfo-watchers' => 'Ńeńelkoaḱ nombor',
 
 # Browsing diffs
index 05dd5ea..560516f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Sardinian (Sardu)
+/** Sardinian (sardu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -843,9 +843,9 @@ Is pàginas de sa [[Special:Watchlist|watchlist tua]] sunt in '''grassu'''.",
 Pro castiare o chircare is files giai carrigaus, bae a sa [[Special:FileList|lista de is files carrigaus]]. Carrigamentos de files e de noas versiones de files sunt registradas in su [[Special:Log/upload|registru de carrigamentu]], is burraduras in su [[Special:Log/delete|registru burraduras]].
 
 Pro insertare unu file aintru de una pàgina, tocat a faghere unu cullegamentu tipu custu:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' pro impreare sa versione cumpleta de su file
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></tt>''' pro impreare una versione lada 200 pixel insertada in d'unu box, allinniada a manca e cun 'testu alternativu' comente didascalia
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' pro ingenerare unu cullegamentu a su file chentza de du biri",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' pro impreare sa versione cumpleta de su file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' pro impreare una versione lada 200 pixel insertada in d'unu box, allinniada a manca e cun 'testu alternativu' comente didascalia
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pro ingenerare unu cullegamentu a su file chentza de du biri",
 'uploadlogpage' => 'Carrigadas',
 'uploadlogpagetext' => 'A suta ddoi est sa lista de is files carrigados de reghente.
 Càstia sa [[Special:NewFiles|galleria de files nous]] pro una presentada prus bisuale.',
index 4a74cb9..a74b896 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Sicilian (Sicilianu)
+/** Sicilian (sicilianu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -177,7 +177,6 @@ $messages = array(
 'tog-watchlisthideliu' => "Ammuccia li canciamenti di l'utilizzatura riggistrati nti l'ussirvati spiciali",
 'tog-watchlisthideanons' => "Ammuccia li canciamenti di l'utilizzatura anònimi nti l'ussirvati spiciali",
 'tog-watchlisthidepatrolled' => "Ammuccia li mudìfichi virificati nta l'ussirvati spiciali",
-'tog-nolangconversion' => 'Disattiva la cunvirsioni tra varianti linguìstichi',
 'tog-ccmeonemails' => "Mànnami na copia dî missaggi spiditi a l'àutri utenti",
 'tog-diffonly' => "Nun visualizzari lu cuntinutu dâ pàggina quannu s'esequi na ''diff'' tra dui virsioni",
 'tog-showhiddencats' => 'Ammustra li catigurìi ammucciati.',
@@ -1334,9 +1333,9 @@ L'operazioni nun pò èssiri annullata.",
 riggistrati [[Special:Log/delete|ccà]].
 
 Pi nziriri nu file nta na pàggina, fai nu lijami accussì:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' p'usari la virsioni ntera dû file
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testu altirnativu]]</nowiki></tt>''' p'usari na virsioni làrica 200 pixel nziruta nta nu box, alliniata a manu manca e cu 'testu altirnativu' comu didascalìa
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' pi culligari direttamenti a lu file senza vidìrilu.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' p'usari la virsioni ntera dû file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testu altirnativu]]</nowiki></code>''' p'usari na virsioni làrica 200 pixel nziruta nta nu box, alliniata a manu manca e cu 'testu altirnativu' comu didascalìa
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pi culligari direttamenti a lu file senza vidìrilu.",
 'upload-permitted' => 'Tipi di file cunzintiti: $1.',
 'upload-preferred' => 'Tipi di file cunsigghiati: $1.',
 'upload-prohibited' => 'Tipi di file pruibbiti: $1.',
@@ -1364,17 +1363,17 @@ Pi nziriri nu file nta na pàggina, fai nu lijami accussì:
 'large-file' => 'Si raccumanna di nun supirari li diminzioni di $1 pi ognunu file; stu file è granni $2.',
 'largefileserver' => 'Lu file sùpira li diminzioni cunzintiti dâ cunfigurazzioni dû server.',
 'emptyfile' => "Lu file appena carricatu pari èssiri vacanti. Chistu putissi èssiri duvutu a n'erruri ntô nomu dû file. Virificari ca si ntenni riarmenti carricari stu file.",
-'fileexists' => "Nu file cu stu nomu asisti già, pi favuri cuntrolla '''<tt>[[:$1]]</tt>''' siddu nun sî sicuru di vulìrilu suvrascrìviri.
-[[$1|thumb]]",
-'filepageexists' => "La pàggina di discrizzioni di stu file fu ggià criata nnû nnirizzu '''<tt>[[:$1]]</tt>''', macari si ancora non c'è nu file cu stu nomu. La discrizzioni di l'uggettu ca fu misa ntô mentri dû caricamentu non si vidi supra a la pàggina di discussioni. Pi fàrila cumpàriri ntâ pàggina di discussioni, c'è la nicissitati di mudificàrila a manu",
+'fileexists' => 'Nu file cu stu nomu asisti già, pi favuri cuntrolla <strong>[[:$1]]</strong> siddu nun sî sicuru di vulìrilu suvrascrìviri.
+[[$1|thumb]]',
+'filepageexists' => "La pàggina di discrizzioni di stu file fu ggià criata nnû nnirizzu <strong>[[:$1]]</strong>, macari si ancora non c'è nu file cu stu nomu. La discrizzioni di l'uggettu ca fu misa ntô mentri dû caricamentu non si vidi supra a la pàggina di discussioni. Pi fàrila cumpàriri ntâ pàggina di discussioni, c'è la nicissitati di mudificàrila a manu",
 'fileexists-extension' => "Nu file cu nu nomu simili a chistu esisti già; l'unica diffirenza è l'usu dê maiusculi nte l'estensioni: [[$2|thumb]]
-* Nomu dû file carricatu: '''<tt>[[:$1]]</tt>'''
-* Nome dû file esistenti: '''<tt>[[:$2]]</tt>'''
+* Nomu dû file carricatu: <strong>[[:$1]]</strong>
+* Nome dû file esistenti: <strong>[[:$2]]</strong>
 Pi favuri scegghiti n'àutru nomu.",
 'fileexists-thumbnail-yes' => "Lu file carricato sembra èssiri lu risurtatu di n'antiprima ''(thumbnail)''. [[$1|thumb]]
-Virificari, pi cunfruntu, lu file '''<tt>[[:$1]]</tt>'''.
+Virificari, pi cunfruntu, lu file <strong>[[:$1]]</strong>.
 Siduu si tratta dâ stissa mmagini, nte dimenzioni urigginali, nun è nicissariu carricara àutri antiprimi.",
-'file-thumbnail-no' => "Lu nomu dô file accumenza cu '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Lu nomu dô file accumenza cu <strong>$1</strong>.
 Pari quinni èssiri lu risurtatu di n'antiprima ''(thumbnail)''.
 Siddu si disponi dâ mmàggini ntâ risuluzzioni urigginali, si prega di carricàrila. 'N casu cuntrariu, si prega di canciari lu nomu dô file.",
 'fileexists-forbidden' => "Nu file cu stu nomu asisti già e nun pò essiri sovrascrittu. Turnari n'arreri e canciari lu nomu cu lu quali carricari lu file. [[File:$1|thumb|center|$1]]",
@@ -1519,7 +1518,7 @@ Appressu veni ammustrata la discrizioni prisenti nâ [$2 paggina di discrizzioni
 
 # MIME search
 'mimesearch' => "Circata 'n basi a lu tipu MIME",
-'mimesearch-summary' => "Sta pàggina cunzenti di filtrari li file 'n basi a lu tipu MIME. Nziriri la stringa di ricerca ntâ forma tipu/suttatipu, p'asempiu <tt>image/jpeg</tt>.",
+'mimesearch-summary' => "Sta pàggina cunzenti di filtrari li file 'n basi a lu tipu MIME. Nziriri la stringa di ricerca ntâ forma tipu/suttatipu, p'asempiu <code>image/jpeg</code>.",
 'mimetype' => 'Tipu MIME:',
 'download' => 'scarica',
 
@@ -1702,7 +1701,7 @@ Talìa macari li [[Special:WantedCategories|catigurìi addumannati]].',
 'linksearch-ns' => 'Namespace:',
 'linksearch-ok' => 'Cerca',
 'linksearch-text' => 'C\'è la pussibbilitati di fari usu di metacaràttiri, p\'asèmpiu "*.wikipedia.org".<br />
-Protucolli suppurtati: <tt>$1</tt>',
+Protucolli suppurtati: <code>$1</code>',
 'linksearch-line' => '$1 prisenti ntâ pàggina $2',
 'linksearch-error' => 'Li metacaràttiri si ponnu usari sulu a lu princìpiu dû nnirizzu.',
 
index fb14ac7..95939d5 100644 (file)
@@ -892,7 +892,7 @@ Tae pit the eimage intae a page, uise an airtin i the form
 'illegalfilename' => 'The filename "$1" haes characters that isna alloud in page teitles. Please rename the file an gie uplaidin it anither shot.',
 'badfilename' => 'Eimage name haes been chynged tae "$1".',
 'largefileserver' => 'This file is bigger nor the server is confeigurt tae allou.',
-'fileexists' => "A file wi this name exists aareadies, please check '''<tt>[[:$1]]</tt>''' gin ye'r no siccar that ye want tae chynge it.
+'fileexists' => "A file wi this name exists aareadies, please check <strong>[[:$1]]</strong> gin ye'r no siccar that ye want tae chynge it.
 [[$1|thumb]]",
 'fileexists-forbidden' => 'A file wi this name aareadies exists; please gang back an uplaid this file unner a new name. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'A file wi this name aareadies exists in the shared file depose; please gang back an uplaid this file unner a new name. [[File:$1|thumb|center|$1]]',
index 298fd95..13f0764 100644 (file)
@@ -104,55 +104,55 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#چوريو', '#REDIRECT' ),
-       'localmonth'              => array( '1', 'مقاميمهينو', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'مقاميمهينونالو', 'LOCALMONTHNAME' ),
-       'localday'                => array( '1', 'مقاميڏينهن', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'مقاميڏينهن2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'مقاميڏينهننالو', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'مقاميسال', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'مقاميوقت', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'مقاميڪلاڪ', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'صفحنجوتعداد', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'مضموننجوتعداد', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'فائيلنجوتعداد', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'يوزرسجوتعداد', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'ترميمنجوتعداد', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'صفحيجوعنوان', 'PAGENAME' ),
-       'namespace'               => array( '1', 'نانئپولار', 'NAMESPACE' ),
-       'talkspace'               => array( '1', 'بحثپولار', 'TALKSPACE' ),
-       'subjectspace'            => array( '1', 'مضمونپولار', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'fullpagename'            => array( '1', 'صحفيجوپورونالو', 'FULLPAGENAME' ),
-       'msg'                     => array( '0', 'نياپو:', 'MSG:' ),
-       'img_right'               => array( '1', 'ساڄو', 'right' ),
-       'img_left'                => array( '1', 'کاٻو', 'left' ),
-       'img_none'                => array( '1', 'ڪجهنه', 'none' ),
-       'img_width'               => array( '1', '$1 عڪسلون', '$1px' ),
-       'img_center'              => array( '1', 'مرڪز', 'center', 'centre' ),
-       'img_top'                 => array( '1', 'سِرُ', 'top' ),
-       'img_middle'              => array( '1', 'وچ', 'middle' ),
-       'img_bottom'              => array( '1', 'تَرُ', 'bottom' ),
-       'sitename'                => array( '1', 'سرزميننالو', 'SITENAME' ),
-       'ns'                      => array( '0', 'نپ', 'NS:' ),
-       'localurl'                => array( '0', 'مقامييوآريل', 'LOCALURL:' ),
-       'grammar'                 => array( '0', 'وياڪرڻ', 'GRAMMAR:' ),
-       'currentweek'             => array( '1', 'هلندڙهفتو', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'اڄوڪوڏينهن', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'مقاميهفتو', 'LOCALWEEK' ),
-       'plural'                  => array( '0', 'جمع', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'مڪمليوآريل', 'FULLURL:' ),
-       'currenttimestamp'        => array( '1', 'هلندڙوقتمهر', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'مقاميوقتمهر', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'طرفنشان', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#ٻولي:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'موادٻولي', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'نپ۾صفحا', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'منتظمينجوتعداد', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'خاص', 'special' ),
-       'filepath'                => array( '0', 'فائيلڏس', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__ لڪل زمرو __', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'زمريجاصفحا', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'صفحيجيماپ', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#چوريو', '#REDIRECT' ),
+       'localmonth'                => array( '1', 'مقاميمهينو', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'مقاميمهينونالو', 'LOCALMONTHNAME' ),
+       'localday'                  => array( '1', 'مقاميڏينهن', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'مقاميڏينهن2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'مقاميڏينهننالو', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'مقاميسال', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'مقاميوقت', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'مقاميڪلاڪ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'صفحنجوتعداد', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'مضموننجوتعداد', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'فائيلنجوتعداد', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'يوزرسجوتعداد', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'ترميمنجوتعداد', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'صفحيجوعنوان', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'نانئپولار', 'NAMESPACE' ),
+       'talkspace'                 => array( '1', 'بحثپولار', 'TALKSPACE' ),
+       'subjectspace'              => array( '1', 'مضمونپولار', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'fullpagename'              => array( '1', 'صحفيجوپورونالو', 'FULLPAGENAME' ),
+       'msg'                       => array( '0', 'نياپو:', 'MSG:' ),
+       'img_right'                 => array( '1', 'ساڄو', 'right' ),
+       'img_left'                  => array( '1', 'کاٻو', 'left' ),
+       'img_none'                  => array( '1', 'ڪجهنه', 'none' ),
+       'img_width'                 => array( '1', '$1 عڪسلون', '$1px' ),
+       'img_center'                => array( '1', 'مرڪز', 'center', 'centre' ),
+       'img_top'                   => array( '1', 'سِرُ', 'top' ),
+       'img_middle'                => array( '1', 'وچ', 'middle' ),
+       'img_bottom'                => array( '1', 'تَرُ', 'bottom' ),
+       'sitename'                  => array( '1', 'سرزميننالو', 'SITENAME' ),
+       'ns'                        => array( '0', 'نپ', 'NS:' ),
+       'localurl'                  => array( '0', 'مقامييوآريل', 'LOCALURL:' ),
+       'grammar'                   => array( '0', 'وياڪرڻ', 'GRAMMAR:' ),
+       'currentweek'               => array( '1', 'هلندڙهفتو', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'اڄوڪوڏينهن', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'مقاميهفتو', 'LOCALWEEK' ),
+       'plural'                    => array( '0', 'جمع', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'مڪمليوآريل', 'FULLURL:' ),
+       'currenttimestamp'          => array( '1', 'هلندڙوقتمهر', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'مقاميوقتمهر', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'طرفنشان', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#ٻولي:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'موادٻولي', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'نپ۾صفحا', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'منتظمينجوتعداد', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'خاص', 'special' ),
+       'filepath'                  => array( '0', 'فائيلڏس', 'FILEPATH:' ),
+       'hiddencat'                 => array( '1', '__ لڪل زمرو __', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'زمريجاصفحا', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'صفحيجيماپ', 'PAGESIZE' ),
 );
 
 $messages = array(
index 5db1519..80a7268 100644 (file)
@@ -141,7 +141,6 @@ $messages = array(
 'tog-watchlisthideown' => "Cua li me' mudìfigghi i' l'abbaidaddi ippiziari",
 'tog-watchlisthidebots' => "Cua li mudìfigghi di li bot i' l'abbaidaddi ippiziari",
 'tog-watchlisthideminor' => "Cua li mudìfigghi minori i' l'abbaidaddi ippiziari",
-'tog-nolangconversion' => "Disattiba lu cunvirthimentu i' li varianti linghìsthighi",
 'tog-ccmeonemails' => "Inviammi una còpia di l'imbasciaddi ippididdi a l'althri utenti",
 'tog-diffonly' => 'No visuarizzà lu cuntinuddu di la pàgina daboi lu cunfrontu tra versioni',
 'tog-showhiddencats' => 'Musthrà li categuri cuaddi',
@@ -1004,16 +1003,16 @@ usà inveci
 'largefileserver' => 'Lu file supara li misuri cunsintiddi da la cunfigurazioni di lu server.',
 'emptyfile' => "Lu file appena cariggaddu pari assé bioddu. Lu chi pudia assé dubuddu a un'errori i' l'innòmmu di lu file. Verifiggà chi s'aggia avveru gana di cariggà chisthu file.",
 'fileexists' => "Un file cu' chisth'innòmmu isisthi già.
-Verifiggà primma '''<tt>[[:$1]]</tt>''' si nò s'è sigguri di vurellu sobbraschribì.
+Verifiggà primma <strong>[[:$1]]</strong> si nò s'è sigguri di vurellu sobbraschribì.
 [[$1|thumb]]",
 'fileexists-extension' => "Un file cu'un'innòmmu sìmmiri isisthi già; la sora diffarènzia è l'usu di li maiuschini i' l'esthensioni: [[$2|thumb]]
-* Innòmmu di lu file cariggaddu: '''<tt>[[:$1]]</tt>'''
-* Innòmmu di lu file esisthenti: '''<tt>[[:$2]]</tt>'''
+* Innòmmu di lu file cariggaddu: <strong>[[:$1]]</strong>
+* Innòmmu di lu file esisthenti: <strong>[[:$2]]</strong>
 Verifiggà ch'i dui file nò siani lu matessi o sciubarà un'innòmmu diffarènti pa lu file da carriggà.",
 'fileexists-thumbnail-yes' => "Lu file carriggaddu pari assé lu risulthaddu d'un'antiprimma ''(thumbnail)''. [[$1|thumb]]
-Verifiggà, pa cunfrontu, lu file '''<tt>[[:$1]]</tt>'''.
+Verifiggà, pa cunfrontu, lu file <strong>[[:$1]]</strong>.
 S'è la matessi immàgina, i' li misuri originari, nò è nezzessàriu carriggà althri antiprimmi.",
-'file-thumbnail-no' => "L'innòmmu di lu file ischumenza cun '''<tt>$1</tt>'''. Pari assé lu risulthaddu d'un'antiprimma ''(thumbnail)''.
+'file-thumbnail-no' => "L'innòmmu di lu file ischumenza cun <strong>$1</strong>. Pari assé lu risulthaddu d'un'antiprimma ''(thumbnail)''.
 Si si diponi di l'immàgina i' la risoruzioni originari, pa piazeri carriggalla. A l'invessu, pa piazeri ciambà l'innòmmu di lu file.",
 'fileexists-forbidden' => "Un file cun chisthu innòmmu isisthi già. Turrà indareddu e mudìfiggà l'innòmmu cu' lu quari carriggà lu file. [[File:$1|thumb|center|$1]]",
 'fileexists-shared-forbidden' => "Un file cun chisthu innòmmu isisthi già i l'archìbiu di li risuzzi mùrthimediari cundibisi. Turrà indareddu e mudìfiggà l'innòmmu cu' lu quari carriggà lu file. [[File:$1|thumb|center|$1]]",
@@ -1106,7 +1105,7 @@ Si si diponi di l'immàgina i' la risoruzioni originari, pa piazeri carriggalla.
 
 # MIME search
 'mimesearch' => 'Zercha sigundu a lu tipu MIME',
-'mimesearch-summary' => 'Chistha pàgina cunsenti di filthrà li file sigundu lu tipu MIME. Insirì li paràuri zirchaddi cumenti tipu/sottutipu e.g. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Chistha pàgina cunsenti di filthrà li file sigundu lu tipu MIME. Insirì li paràuri zirchaddi cumenti tipu/sottutipu e.g. <code>image/jpeg</code>.',
 'mimetype' => 'Tipu MIME:',
 'download' => 'ischarriggamentu',
 
index be89336..8829a0b 100644 (file)
@@ -20,7 +20,7 @@
 
 $namespaceNames = array(
        NS_MEDIA            => 'Media',
-       NS_SPECIAL          => 'Doaimmat',
+       NS_SPECIAL          => 'Erenoamáš',
        NS_TALK             => 'Ságastallan',
        NS_USER             => 'Geavaheaddji',
        NS_USER_TALK        => 'Geavaheaddjeságastallan',
@@ -37,6 +37,10 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Kategoriijaságastallan',
 );
 
+$namespaceAliases = array(
+       'Doaimmat' => NS_SPECIAL,
+);
+
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktiivvalaš_geavaheaddjit' ),
        'Allmessages'               => array( 'Buot_systemasánit' ),
@@ -48,6 +52,7 @@ $specialPageAliases = array(
        'Contributions'             => array( 'Geavaheaddji_rievdadusat' ),
        'Disambiguations'           => array( 'Liŋkkat_dárkonsiidduide' ),
        'DoubleRedirects'           => array( 'Guoktegeardásaš_ođđasitstivremat' ),
+       'Emailuser'                 => array( 'SáddeEpoastta' ),
        'Export'                    => array( 'Olggosfievrrit_siidduid' ),
        'Listfiles'                 => array( 'Fiilalogahallan' ),
        'Listredirects'             => array( 'Listu_ođđasitstivremiin' ),
@@ -83,8 +88,8 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#OĐĐASITSTIVREN', '#STIVREN', '#REDIRECT' ),
-       'numberofarticles'        => array( '1', 'ARTIHKKALIIDMEARRI', 'NUMBEROFARTICLES' ),
+       'redirect'                  => array( '0', '#OĐĐASITSTIVREN', '#STIVREN', '#REDIRECT' ),
+       'numberofarticles'          => array( '1', 'ARTIHKKALIIDMEARRI', 'NUMBEROFARTICLES' ),
 );
 
 $linkTrail = '/^(:?[a-zàáâçčʒǯđðéèêëǧǥȟíìîïıǩŋñóòôõßšŧúùûýÿüžþæøåäö]+)(.*)$/sDu';
@@ -134,13 +139,13 @@ $messages = array(
 'thursday' => 'duorastat',
 'friday' => 'bearjadat',
 'saturday' => 'lávvordat',
-'sun' => 'so',
+'sun' => 'So',
 'mon' => 'vu',
-'tue' => 'ma',
+'tue' => 'Dis',
 'wed' => 'ga',
 'thu' => 'du',
 'fri' => 'be',
-'sat' => 'lá',
+'sat' => 'Lá',
 'january' => 'ođđajagimánnu',
 'february' => 'guovvamánnu',
 'march' => 'njukčamánnu',
@@ -170,13 +175,13 @@ $messages = array(
 'mar' => 'njuk',
 'apr' => 'cuoŋ',
 'may' => 'mies',
-'jun' => 'geassemánnu',
-'jul' => 'suoidnemánnu',
-'aug' => 'borgemánnu',
-'sep' => 'čakčamánnu',
-'oct' => 'golggotmánnu',
-'nov' => 'skábmamánnu',
-'dec' => 'juovlamánnu',
+'jun' => 'geas',
+'jul' => 'suoi',
+'aug' => 'borg',
+'sep' => 'čakč',
+'oct' => 'golg',
+'nov' => 'skáb',
+'dec' => 'juov',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Luohkká|Luohkát}}',
@@ -207,9 +212,11 @@ $messages = array(
 'qbspecialpages' => 'Doaibmasiiddut',
 
 # Vector skin
+'vector-action-addsection' => 'Lasit fáttá',
 'vector-action-delete' => 'Sihko',
 'vector-action-move' => 'Sirdde',
 'vector-action-protect' => 'Suodjal',
+'vector-action-undelete' => 'Máhcat',
 'vector-action-unprotect' => 'Rievdat suodjaleami',
 'vector-view-create' => 'Álggat',
 'vector-view-edit' => 'Rievdat',
@@ -251,7 +258,7 @@ $messages = array(
 'talk' => 'Ságastallan',
 'views' => 'Čájáhusat',
 'toolbox' => 'Neavvobumbá',
-'userpage' => 'Čájet geavaheaddjisiiddu',
+'userpage' => 'Čájet geavaheaddjesiiddu',
 'projectpage' => 'Čájet prošeaktasiiddu',
 'imagepage' => 'Čájet fiilasiiddu',
 'mediawikipage' => 'Čájet diehtosiiddu',
@@ -270,7 +277,7 @@ $messages = array(
 'jumptosearch' => 'ohcamii',
 
 # 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' => 'Dieđut {{GRAMMAR:elative|{{SITENAME}}}}',
+'aboutsite' => '{{SITENAME}} birra',
 'aboutpage' => 'Project:Dieđut',
 'copyright' => 'Sisdoalu sáhttá geavahit liseanssain $1.',
 'currentevents' => 'Áigeguovdil',
@@ -309,7 +316,7 @@ $messages = array(
 'nstab-main' => 'Siidu',
 'nstab-user' => 'Geavaheaddjisiidu',
 'nstab-media' => 'Media',
-'nstab-special' => 'Erenomáš',
+'nstab-special' => 'Erenoamáš',
 'nstab-project' => 'Prošeaktasiidu',
 'nstab-image' => 'Fiila',
 'nstab-mediawiki' => 'Dieđáhus',
@@ -348,9 +355,9 @@ $messages = array(
 'sqlhidden' => '(SQL-jearahallan lea čihkojuvvon)',
 
 # Login and logout pages
-'logouttext' => "'''Leat dál čálligoahtán olggos {{GRAMMAR:elative|{{SITENAME}}}}.'''
+'logouttext' => "'''Don leat dál loggen olggos {{GRAMMAR:elative|{{SITENAME}}}}s.'''
 
-Sáhtát joatkit {{GRAMMAR:genitive|{{SITENAME}}}} geavaheami anonyman, dahje čálligoahtit ođđasit sisa.",
+Sáhtát joatkit {{GRAMMAR:genitive|{{SITENAME}}}} geavaheami anonyman dahje logget ođđasit sisa",
 'welcomecreation' => '== Bures boahtin, $1! ==
 Du geavaheaddjidovddaldat lea dál anus.
 Ále vajáldahte rievdadit {{GRAMMAR:genitive|{{SITENAME}}}} iežat ásahusaid.',
@@ -364,7 +371,7 @@ Du geavaheaddjidovddaldat lea dál anus.
 'loginprompt' => 'Sisačállimii dárbbašuvvojit geavssat (cookies).',
 'userlogin' => 'Logge sisa dahje ráhkat dovddaldaga',
 'logout' => 'Čálligoađe olggos',
-'userlogout' => 'Čálligoađe olggos',
+'userlogout' => 'Logge olggos',
 'notloggedin' => 'It leat čálligoahttan sisa',
 'nologin' => "Jus dus ii vel leat geavaheaddjidovddaldat, sáhtát '''$1''' dakkára.",
 'nologinlink' => 'ráhkadit',
@@ -447,13 +454,13 @@ Du geavaheaddjidovddaldat lea dál anus.
 'showpreview' => 'Geahča ovdalgiihtii',
 'showlivepreview' => 'Ovdalgeahčastan',
 'showdiff' => 'Čájet rievdadusaid',
-'anoneditwarning' => "'''Váruhus:''' It leat čálligoahtán sisa. Du IP-čujuhus báhcá dán siiddu ođasmahttinhistorjái.",
+'anoneditwarning' => "'''Váruhus:''' It leat loggen sisa. Du IP-čujuhus báhcá dán siiddu rievdadushistorjái.",
 'missingsummary' => 'It leat čállán čoahkkáigeasu. Jus válljet Vurke ođđasit, de rievdadusat maid ráhkadit vurkejuvvo čoahkkáigeasuhaga.',
 'missingcommenttext' => 'Čále čoahkkáigeasu vuollái.',
 'missingcommentheader' => 'It leat čállán bajilčállaga du oaivilii. Vállje <em>Vurke</em>, jus it hálit čállit bajilčállaga.',
 'summary-preview' => 'Čoahkkáigeasu ovdalgihtiigeahččan:',
 'subject-preview' => 'Bajilčállaga ovdalgihtiigeahččan:',
-'blockedtitle' => 'Geavaheaddji lea cakkojuvvon',
+'blockedtitle' => 'Geavaheaddji lea hehttejuvvon',
 'whitelistedittext' => 'Don fertet $1, ovdalgo sáhtát rievdadit siidduid.',
 'confirmedittext' => 'It sáhte rievdadit siiddu ovdalgo leat sihkarastan iežat e-poastačujuhusa. Sáhtat sihkarastit [[Special:Preferences|ásahussiidduin]].',
 'nosuchsectiontitle' => 'Diekkár oassi ii gávdno',
@@ -465,6 +472,8 @@ Du geavaheaddjidovddaldat lea dál anus.
 'accmailtext' => "geavaheaddji '''$1''' suollemassátni lea sáddejuvvon čujuhussii '''$2'''.",
 'newarticle' => '(ođđa)',
 'newarticletext' => 'Leat boahtán muhtin liŋkka mielde siidui, mii ii vel lea čállejuvvon. Sáhtát álggahit siiddu vuollái. Jus it háliit álggahit siiddu, geavat fierbmilohkki máhccandoaimma.',
+'userpage-userdoesnotexist' => 'Geavaheaddjedovddaldat «$1» ii leat registrerejuvvon. Hálidatgo duođas rievdadit dán siiddu?',
+'userpage-userdoesnotexist-view' => 'Geavaheaddjedovddaldat «$1» ii leat registrerejuvvon.',
 'updated' => '(Beaiváduvvon)',
 'note' => "'''Cuigehus:'''",
 'previewnote' => "'''Dát lea siiddu ovdalgihtiigeahččan. Siidu ii leat vel vurkejuvvon!'''",
@@ -552,12 +561,13 @@ Eará bajasdoallit sáhtet lohkat čihkojuvvon sisdoalu ja máhcahit dan.",
 'history-title' => 'Siiddu «$1» historjá',
 'lineno' => 'Gurgadas $1:',
 'compareselectedversions' => 'Veardde válljejuvvon veršuvnnaid',
+'showhideselectedversions' => 'Čájet/čiega válljejuvvon veršuvnnaid',
 'editundo' => 'šluhtte',
 'diff-multi' => '(Veršuvnnaid gaskas {{PLURAL:$1|okta rievdadus|$1 eará rievdadusa}}.)',
 
 # Search results
 'searchresults' => 'Ohcanbohtosat',
-'searchresults-title' => 'Ohcanbohtosat: "$1"',
+'searchresults-title' => 'Ohcanbohtosat: «$1»',
 'searchsubtitle' => 'Ohcan tearpmain [[:$1]]',
 'searchsubtitleinvalid' => 'Ohcan tearpmain $1',
 'notitlematches' => 'Ohcansátni ii dihtton ovttasge bájilčállagis',
@@ -566,6 +576,7 @@ Eará bajasdoallit sáhtet lohkat čihkojuvvon sisdoalu ja máhcahit dan.",
 'viewprevnext' => 'Čájet [$3] oktanaga.
 
 $1 {{int:pipe-separator}} $2',
+'searchmenu-new' => "'''Álggat siiddu ''[[:$1]]'' dán Wikipediai'''",
 'searchhelp-url' => 'Help:Rávvagat',
 'searchprofile-articles' => 'Sisdoallosiiddut',
 'searchprofile-project' => 'Veahkke- ja prošeaktasiiddut',
@@ -591,7 +602,7 @@ $1 {{int:pipe-separator}} $2',
 'preferences' => 'Ásahusat',
 'mypreferences' => 'Ásahusat',
 'prefs-edits' => 'Rievdadusaid mearri:',
-'prefsnologin' => 'It leat čálligoahtán sisa.',
+'prefsnologin' => 'It leat čálligoahtán sisa',
 'prefsnologintext' => 'Don fertet [[Special:UserLogin|čálligoahtit sisa]], ovdalgo sáhtát rievdadit du ásahusaid.',
 'changepassword' => 'Suollemassáni molson',
 'prefs-skin' => 'Olggosoaidnu',
@@ -606,7 +617,7 @@ $1 {{int:pipe-separator}} $2',
 'saveprefs' => 'Vurke ásahusaid',
 'resetprefs' => 'Máhcat vurkejuvvon ásahusaid',
 'prefs-editing' => 'Rievdadeapmi',
-'rows' => 'Gurgadasat',
+'rows' => 'Gurgadasa:',
 'columns' => 'Kolumnat',
 'searchresultshead' => 'Ohcan',
 'resultsperpage' => 'Bohtosa juohke siiddus',
@@ -621,14 +632,20 @@ $1 {{int:pipe-separator}} $2',
 'allowemail' => 'Suova e-postta sádden čujuhussii',
 'prefs-files' => 'Fiillat',
 'youremail' => 'E-poastačujuhus',
-'username' => 'Dovddaldat',
-'uid' => 'Nummir',
+'username' => 'Geavaheaddjenamma:',
+'uid' => 'Geavaheaddji-ID:',
+'prefs-memberingroups' => 'Miellahttu/lahttu {{PLURAL:$1|joavkkus|joavkkuin}}:',
+'prefs-registration' => 'Registrerenáigi:',
 'yourrealname' => 'Rivttes namma',
 'yourlanguage' => 'Geavahanvuođu giella',
 'yourvariant' => 'Giellavarianta:',
 'yournick' => 'Vuolláičálus',
 'badsig' => 'Vuolláičálus ii dohke.',
 'badsiglength' => 'Vuolláičálus lea menddo guhki - vuolláičálus sáhttá leat eanemusta $1 mearka.',
+'yourgender' => 'Sohkabealli:',
+'gender-unknown' => 'Ii diehtu',
+'gender-male' => 'Dievdu',
+'gender-female' => 'Nisson',
 'email' => 'E-poastadoaimmat',
 'prefs-help-realname' => 'Eaktodahtolaš. Du namma čájehuvvo geavaheaddjidovddaldaga sajis siiddu dahkkilogahallamis.',
 'prefs-help-email' => 'Eaktodahtolaš. Eará geavaheaddjit sáhttet váldit dunnje oktavuođa e-poasttain nu ahte du e-poastačujuhus ii dihtto.',
@@ -636,15 +653,18 @@ $1 {{int:pipe-separator}} $2',
 'prefs-dateformat' => 'Beaivemeari hábmi',
 
 # User rights
-'userrights' => 'Geavaheaddjirivttiid stivren',
+'userrights' => 'Geavaheaddjevuoigatvuođaid stivren',
 'userrights-lookup-user' => 'Geavaheaddjirivttiid stivren',
 'userrights-user-editname' => 'Geavaheaddjidovddaldat',
 'editusergroup' => 'Rievdat geavaheaddjijoavkkuid',
 'editinguser' => "Rievdadit siiddu '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
-'userrights-editusergroup' => 'Redigere geavaheaddjijoavkkuid',
+'userrights-editusergroup' => 'Rievdat geavaheaddjejoavkku',
 'saveusergroups' => 'Vurke',
 'userrights-groupsmember' => 'Lahttun čuovvovaš joavkkuin:',
+'userrights-groupsmember-auto' => 'Implikáhtalaš (miel)lahttu {{PLURAL:$1|joavkkus|joavkkuin}}:',
 'userrights-reason' => 'Sivva',
+'userrights-changeable-col' => 'Joavkkut, maid dus lea lohpi rievdadit',
+'userrights-unchangeable-col' => 'Joavkkut, maid dus ii leat lohpi rievdadit',
 
 # Groups
 'group' => 'Joavku:',
@@ -703,7 +723,7 @@ $1 {{int:pipe-separator}} $2',
 'upload' => 'Lasit fiilla',
 'uploadbtn' => 'Lasit fiilla',
 'reuploaddesc' => 'Máhca sáddenskovvái.',
-'uploadnologin' => 'It leat čálligoahtán sisa',
+'uploadnologin' => 'It leat loggen sisa',
 'uploadnologintext' => 'Don fertet leat [[Special:UserLogin|čálligoahtán sisa]], ovdalgo sáhtát vurket fiillaid.',
 'uploaderror' => 'Vurkenfeaila',
 'uploadlog' => 'Fiilalogga',
@@ -722,6 +742,7 @@ $1 {{int:pipe-separator}} $2',
 'uploadwarning' => 'Lasihanvaruhus',
 'savefile' => 'Vurke',
 'uploadedimage' => 'vurkii fiilla [[$1]]',
+'overwroteimage' => 'vurkii ođđa veršuvnna fiillas «[[$1]]»',
 'uploaddisabled' => '{{GRAMMAR:genitive|{{SITENAME}}}} ii sáhte lasihit fiillaid.',
 'uploaddisabledtext' => 'Fiillaid vurken lea váldojuvvon eret anus.',
 'uploadscripted' => 'Dát fiila sisdisdoalla HTML-koda dahje skriptaid, maid neahttabláđejeaddji sáhttá vahagis dahkat.',
@@ -899,7 +920,7 @@ $1 {{int:pipe-separator}} $2',
 'booksources-text' => 'Vuolábealde leat liŋkkat olggobeal siidduide, main vuvdojuvvot ođđa ja boares girjjid. Siiddui sáhttá maid leat lassedieđut girjjiin.',
 
 # Special:Log
-'specialloguserlabel' => 'Geavaheaddji',
+'specialloguserlabel' => 'Geavaheaddji:',
 'speciallogtitlelabel' => 'Mearri',
 'log' => 'Loggat',
 'all-logs-page' => 'Buot loggat',
@@ -926,6 +947,9 @@ $1 {{int:pipe-separator}} $2',
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
+# Special:LinkSearch
+'linksearch-ok' => 'Oza',
+
 # Special:ListUsers
 'listusers-submit' => 'Oza',
 'listusers-noresult' => 'Geavaheaddjit eai dihtton. Dárkis maid sierra bustávasturrodagat.',
@@ -960,6 +984,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'emailccsubject' => 'Kopiija sáddejuvvon sánis čujuhussii $1: $2',
 'emailsent' => 'E-poastasátni lea sáddejuvvon',
 'emailsenttext' => 'E-poastasátni lea sáddejuvvon.',
+'emailuserfooter' => 'Dán e-poastta sáddii geavaheaddji $1 geavaheaddjái $2 {{SITENAME}} "E-mailUser"-doaimmain.',
 
 # Watchlist
 'watchlist' => 'Čuovvunlistu',
@@ -1005,7 +1030,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'deletepage' => 'Sihko siiddu',
 'confirm' => 'Daga',
 'excontent' => 'sisdisdolii: ”$1”',
-'exbeforeblank' => 'sisdoallu ovdal gurrema: ”$1”',
+'exbeforeblank' => 'sisdoallu ovdal gurrema: «$1»',
 'exblank' => 'lei guoros',
 'historywarning' => 'Siiddu, man aiggot sihkut, lea rievdaduvvon dávjit go oktii:',
 'confirmdeletetext' => 'Leat sihkumin siiddu dahje fiilla ja buot dan historjjá. Ádde dagu váikkuhsaid ja sihko {{GRAMMAR:genitive|{{SITENAME}}}} [[{{MediaWiki:Policy-url}}|geavahaid]] mielde.',
@@ -1063,7 +1088,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 
 # Restrictions (nouns)
 'restriction-edit' => 'rievdádeapmi',
-'restriction-move' => 'sirdin',
+'restriction-move' => 'Sirdin',
 'restriction-upload' => 'Fiilla vurken',
 
 # Restriction levels
@@ -1121,8 +1146,8 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'whatlinkshere-links' => 'liŋkkat',
 
 # Block/unblock
-'block' => 'Cagge geavaheaddji',
-'blockip' => 'Eastte rievdadusaid',
+'block' => 'Hehtte geavaheaddji',
+'blockip' => 'Hehtte rievdadeamis',
 'blockip-title' => 'Cagge geavaheaddji',
 'blockip-legend' => 'Cagge geavaheaddji',
 'ipadressorusername' => 'IP-čujuhus dahje geavaheaddjidovddaldat',
@@ -1140,13 +1165,13 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'ipbcreateaccount' => 'Eastte dovddaldagaid ráhkadeami',
 'ipbemailban' => 'Eastte geavaheaddji sáddemis e-poastta',
 'ipbenableautoblock' => 'Eastte maŋimus IP-čujuhus, mas geavaheaddji lea ráhkadan rievdadusaid, ja maid daid čujuhusaid, main son vel iska rievdadit.',
-'ipbsubmit' => 'Eastte',
+'ipbsubmit' => 'Hehtte dán geavaheaddji',
 'ipbother' => 'Eará áigi',
 'ipboptions' => '2 diimma:2 hours,1 beaivi:1 day,3 beaivve:3 days,1 vahkku:1 week,2 vahkku:2 weeks,1 mánotbádji:1 month,3 mánotbaji:3 months,6 mánotbaji:6 months,1 jahki:1 year,bissovaš:infinite',
-'ipbotheroption' => 'Eará',
+'ipbotheroption' => 'eará',
 'ipbotherreason' => 'Eará sivva',
 'badipaddress' => 'IP-čujuhus lea boastut.',
-'blockipsuccesssub' => 'Easttan lihkosmuvai',
+'blockipsuccesssub' => 'Hehtten lihkosmuvai',
 'blockipsuccesstext' => "Geavaheaddji dahje IP-čujuhus '''$1''' lea eston.<br />Dálá easttut gávdnot [[Special:BlockList|easttolisttus]].",
 'ipb-edit-dropdown' => 'Rievdat sivaid',
 'ipb-unblock-addr' => 'Sihko geavaheaddji $1 estema',
@@ -1155,6 +1180,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'ipblocklist-submit' => 'Oza',
 'infiniteblock' => 'bissovaččat',
 'expiringblock' => 'boarásnuvvá $1 $2',
+'blocklink' => 'hehtte',
 'contribslink' => 'rievdadusat',
 'blocklogentry' => 'esttii geavaheaddji dahje IP-čujuhusa [[$1]], eastima bistin lea $2 $3',
 'proxyblocksuccess' => 'Gárvvis.',
@@ -1203,7 +1229,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 
 # Special:Import
 'import-comment' => 'Sivva',
-'import-revision-count' => '$1 {{PLURAL:$1|veršuvdna|veršuvnna}}',
+'import-revision-count' => '$1 {{PLURAL:$1|veršuvdna|veršuvnnat}}',
 
 # Import log
 'import-logentry-upload-detail' => '$1 veršuvdna/veršuvnna',
@@ -1234,7 +1260,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'tooltip-p-logo' => 'Váldosiidu',
 'tooltip-n-mainpage' => 'Mana váldosiidui',
 'tooltip-n-portal' => 'Ságastallan prošeavttas',
-'tooltip-n-currentevents' => 'Áigeguovdilis áššiin ságastallan',
+'tooltip-n-currentevents' => 'Dieđut Wikipedia áigeguovdilis dáhpáhusain',
 'tooltip-n-recentchanges' => 'Listu varas rievdadusain',
 'tooltip-n-randompage' => 'Raba summal siidu',
 'tooltip-n-help' => 'Rávvagat',
@@ -1260,7 +1286,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'tooltip-save' => 'Vurke rievdadusaid',
 'tooltip-preview' => 'Geahča rievdadusa ovdalgihtii ovdal vurkema',
 'tooltip-diff' => 'Čájet rievdadusaid',
-'tooltip-compareselectedversions' => 'Veardde válljejuvvon veršuvnnaid',
+'tooltip-compareselectedversions' => 'Veardit válljejuvvon veršuvnnaid.',
 'tooltip-watch' => 'Lasit dán siiddu čuovvunlisttui',
 'tooltip-recreate' => 'Álggat dán siiddu ođđasit',
 
@@ -1288,6 +1314,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 # Special:NewFiles
 'newimages' => 'Ođđa govat',
 'imagelisttext' => "Vuolábealde lea '''$1''' fiilla ordnejuvvon $2.",
+'noimages' => 'Ii oaidnámus.',
 'ilsubmit' => 'Oza',
 'bydate' => 'beaivemeari mielde',
 'sp-newimages-showfrom' => 'Čájet ođđa govaid $1 rájes',
@@ -1355,7 +1382,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 # E-mail address confirmation
 'confirmemail' => 'Sihkaraste e-poastačujuhusa',
 'confirmemail_noemail' => 'Dus ii leat lasihuvvon gelbbolaš e-poastačujuhus [[Special:Preferences|ásahusain]].',
-'confirmemail_success' => 'Du e-poastačujuhus lea dál konfirmerejuvvon. Sáhtat dál čálligoahtit sisa.',
+'confirmemail_success' => 'Du e-poastačujuhus lea dál konfirmerejuvvon. Sáhtát dál logget sisa.',
 'confirmemail_loggedin' => 'Du e-poastačujuhus lea dál konfirmerejuvvon.',
 'confirmemail_subject' => '{{GRAMMAR:genitive|{{SITENAME}}}} e-poastačujuhusa konfirmeren',
 
@@ -1414,6 +1441,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 
 # New logging system
 'logentry-delete-delete' => '$1 sihkui siiddu $3',
+'logentry-delete-restore' => '$1 máhcahii siiddu $3',
 'logentry-move-move' => '$1 sirddii siiddu $3 nammii $4',
 'logentry-move-move_redir-noredirect' => '$1 sirddii siiddu $3 nammii $4 iige ráhkadan ođđasitstivrema',
 'logentry-newusers-create' => '$1 ráhkadii dovddaldaga',
index d7d74c0..6abfc5a 100644 (file)
@@ -50,7 +50,6 @@ $messages = array(
 'tog-watchlisthideown' => 'Cíiitám he ticpatlöxde listade cáminot zo',
 'tog-watchlisthidebots' => 'Cíiitám botám listade cáminot zo',
 'tog-watchlisthideminor' => 'Cíiitám ticpatlöx nebajlipöxde listade cáminot zo',
-'tog-nolangconversion' => 'Necoccebj convercionde variantám',
 'tog-ccmeonemails' => 'Iitom he copynámde e-iitom he iitomde diijömde caitóm',
 'tog-diffonly' => 'Necohuatlöx contentuade páhina minöxde quiíx.',
 
index 1b99be8..d033b2c 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Samogitian (Žemaitėška)
+/** Samogitian (žemaitėška)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -37,9 +37,8 @@ $namespaceNames = array(
 );
 
 /**
-  * Aliases from the fallback language 'lt' to avoid breakage of links
-  */
-
+ * Aliases from the fallback language 'lt' to avoid breakage of links
+ */
 $namespaceAliases = array(
        'Specialus'             => NS_SPECIAL,
        'Aptarimas'             => NS_TALK,
@@ -57,6 +56,8 @@ $namespaceAliases = array(
        'Kategorijos_aptarimas' => NS_CATEGORY_TALK,
 );
 
+$namespaceGenderAliases = array();
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Pabrauktė nūruodas:',
@@ -97,7 +98,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Kavuotė prisėjongosium nauduotuojum keitėmus keravuojamu sārošė',
 'tog-watchlisthideanons' => 'Kavuotė anonimėniu nauduotuoju keitėmus keravuojamu sarašė',
 'tog-watchlisthidepatrolled' => 'Kavuotė parveizietos pakeitėmos keravuojamu sārašė',
-'tog-nolangconversion' => 'Ėšjongtė variantu keitėma',
 'tog-ccmeonemails' => 'Siōstė mon gromatu kopėjės, katros siontiu kėtėims nauduotojams',
 'tog-diffonly' => 'Neruodītė poslapė torėnė puo skėrtomās',
 'tog-showhiddencats' => 'Ruodītė pakavuotas kateguorėjės',
@@ -951,9 +951,9 @@ Ana gal sodarītė ne daugiau kāp $1 {{PLURAL:$1|sėmbuolis|sėmbuolē|sėmbuol
 Nuoriedamė parveizietė ar ėiškuotė unkstiau ikeltū abruozdieliu, ēkėt i [[Special:FileList|ikeltū failu saraša]], ikielėmā ėr ėštrīnėmā īr ožregėstroujamė [[Special:Log/upload|ikielėmu istuorėjuo]], trīnėmā - [[Special:Log/delete|trīnėmu istuorėjuo]].
 
 Nuoriedamė panauduotė ikelta faila poslapī, nauduokėt tuokės nūoruodas:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' aba
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' tėisiuogėnē nūruodā i faila.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' aba
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' tėisiuogėnē nūruodā i faila.",
 'upload-permitted' => 'Laistėnė failu tėpā: $1.',
 'upload-preferred' => 'Pageidajamė failu tėpā: $1.',
 'upload-prohibited' => 'Oždraustė failu tėpā: $1.',
@@ -971,12 +971,12 @@ Nuoriedamė panauduotė ikelta faila poslapī, nauduokėt tuokės nūoruodas:
 'badfilename' => 'Faila pavadinėms pakeists i „$1“.',
 'filetype-missing' => 'Fails netor galūnės (kāp pavīzdīs „.jpg“).',
 'emptyfile' => 'Panašu, ka fails, katra ikieliet īr toščias. Tas gal būtė diel klaiduos faila pavadėnėmė. Pasėtėkrinkėt a tėkrā nuorėt ikeltė šėta faila.',
-'fileexists' => "Fails so tuokiu vardu jau īr, prašuom paveizėtė '''<tt>[[:$1]]</tt>''', jēgo nesat ožtėkrėnts, a nuorit ana parrašītė.
-[[$1|thumb]]",
-'fileexists-extension' => "Fails so pavėdiu pavadinėmu jau īr: [[$2|thumb]]
-* Ikeliama faila pavadinėms: '''<tt>[[:$1]]</tt>'''
-* Jau esontė faila pavadinėms: '''<tt>[[:$2]]</tt>'''
-Prašuom ėšsėrėnktė kėta varda.",
+'fileexists' => 'Fails so tuokiu vardu jau īr, prašuom paveizėtė <strong>[[:$1]]</strong>, jēgo nesat ožtėkrėnts, a nuorit ana parrašītė.
+[[$1|thumb]]',
+'fileexists-extension' => 'Fails so pavėdiu pavadinėmu jau īr: [[$2|thumb]]
+* Ikeliama faila pavadinėms: <strong>[[:$1]]</strong>
+* Jau esontė faila pavadinėms: <strong>[[:$2]]</strong>
+Prašuom ėšsėrėnktė kėta varda.',
 'file-exists-duplicate' => 'Tas fails īr {{PLURAL:$1|šėta faila|šėtū failu}} doblėkats:',
 'uploadwarning' => 'Diemesė',
 'savefile' => 'Ėšsauguotė faila',
@@ -1070,7 +1070,7 @@ Infuormacėjė ėš [$2 faila aprašīma poslapė] īr pateikta žemiau.',
 
 # MIME search
 'mimesearch' => 'MIME paėiška',
-'mimesearch-summary' => 'Šėts poslapis laid ruodīti failus vagol anū MIME tipa. Iveskėt: torėnėtips/potipis, pvz. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Šėts poslapis laid ruodīti failus vagol anū MIME tipa. Iveskėt: torėnėtips/potipis, pvz. <code>image/jpeg</code>.',
 'mimetype' => 'MIME tips:',
 'download' => 'parsėsiūstė',
 
index 52ab42f..9b3eb3e 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Serbo-Croatian (Srpskohrvatski)
+/** Serbo-Croatian (srpskohrvatski / српскохрватски)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -115,94 +115,94 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#PREUSMJERI', '#PREUSMERI', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORSIRANISADRŽAJ__', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__SADRŽAJ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__BEZ_IZMENA__', '__BEZIZMENA__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'TRENUTNIMJESEC', 'TRENUTNIMESEC', 'TRENUTAČNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'TRENUTNIMJESEC1', 'TRENUTNIMESEC1', 'TRENUTAČNIMJESEC1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'TRENUTNIMJESECIME', 'TRENUTNIMESECIME', 'TRENUTAČNIMJESECIME', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'TRENUTNIMJESECROD', 'TRENUTNIMESECROD', 'TRENUTAČNIMJESECROD', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'TRENUTNIMJESECSKR', 'TRENUTNIMESECSKR', 'TRENUTAČNIMJESECSKR', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'TRENUTNIDAN', 'TRENUTAČNIDAN', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'TRENUTNIDAN2', 'TRENUTAČNIDAN2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'TRENUTNIDANIME', 'TRENUTAČNIDANIME', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'TRENUTNAGODINA', 'TRENUTAČNAGODINA', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'TRENUTNOVRIJEME', 'TRENUTNOVREME', 'TRENUTAČNOVRIJEME', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'TRENUTNISAT', 'TRENUTAČNISAT', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LOKALNIMJESEC', 'LOKALNIMESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LOKALNIMJESEC1', 'LOKALNIMESEC1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'LOKALNIMJESECIME', 'LOKALNIMESECIME', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'LOKALNIMJESECROD', 'LOKALNIMESECROD', 'LOKALNIMJESECGEN', 'LOKALNIMESECGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'LOKALNIMJESECSKR', 'LOKALNIMESECSKR', 'LOKALNIMJESECKRAT', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'LOKALNIDAN', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'LOKALNIDAN2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'LOKALNAGODINA', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LOKALNOVRIJEME', 'LOKALNOVREME', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'LOKALNISAT', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'BROJSTRANICA', 'BROJSTRANA', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'BROJČLANAKA', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'BROJIZMJENA', 'BROJIZMENA', 'BROJUREĐIVANJA', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'STRANICA', 'IMESTRANICE', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'STRANICE', 'IMESTRANICEE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ),
-       'fullpagename'            => array( '1', 'PUNOIMESTRANE', 'PUNOIMESTRANICE', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'PUNOIMESTRANEE', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ),
-       'msg'                     => array( '0', 'POR:', 'MSG:' ),
-       'subst'                   => array( '0', 'ZAMJENI:', 'ZAMENI:', 'ZAMJENA:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'NVPOR:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'minijatura', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'minijatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'desno', 'right' ),
-       'img_left'                => array( '1', 'lijevo', 'levo', 'left' ),
-       'img_none'                => array( '1', 'n', 'bez', 'ništa', 'none' ),
-       'img_center'              => array( '1', 'centar', 'središte', 'c', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'bez_okvira', 'bezokvira', 'frameless' ),
-       'img_page'                => array( '1', 'stranica=$1', 'stranica_$1', 'strana=$1', 'strana_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'uspravno', 'uspravno=$1', 'uspravno_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'granica', 'obrub', 'border' ),
-       'img_baseline'            => array( '1', 'osnovnacrta', 'pocetna_linija', 'baseline' ),
-       'img_top'                 => array( '1', 'vrh', 'top' ),
-       'img_text_top'            => array( '1', 'vrh_teksta', 'tekst_vrh', 'text-top' ),
-       'img_middle'              => array( '1', 'sredina', 'middle' ),
-       'img_bottom'              => array( '1', 'dno', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'tekst-dno', 'text-bottom' ),
-       'localurl'                => array( '0', 'LOKALNIURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALNIURLE:', 'LOCALURLE:' ),
-       'notitleconvert'          => array( '0', '__BEZTC__', '__BEZKN__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__BEZCC__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'TRENUTNASEDMICA', 'TRENUTAČNITJEDAN', 'TRENUTNANEDELJA', 'TRENUTNITJEDAN', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'TRENUTNIDANSEDMICE', 'TRENUTAČNIDANTJEDNA', 'TRENUTNIDANNEDELJE', 'TRENUTNIDANTJEDNA', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'LOKALNASEDMICA', 'LOKALNITJEDAN', 'LOKALNANEDELJA', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'LOKALNIDANSEDMICE', 'LOKALNIDANTJEDNA', 'LOKALNIDANNEDELJE', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDIZMJENE', 'IDIZMENE', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'IZMJENEDANA', 'IZMENEDANA', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'IZMJENEDANA2', 'IZMENEDANA2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MJESECIZMJENE', 'MESECIZMENE', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'MJESECIZMJENE1', 'MESECIZMENE1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'GODINAIZMJENE', 'GODINAIZMENE', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'OZNAKAVREMENAIZMJENE', 'OZNAKAVREMENAIZMENE', 'REVISIONTIMESTAMP' ),
-       'plural'                  => array( '0', 'MNOŽINA:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'PUNIURL:', 'PUNURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'PUNIURLE:', 'PUNURLE:', 'FULLURLE:' ),
-       'currenttimestamp'        => array( '1', 'TRENUTNAOZNAKAVREMENA', 'TRENUTAČNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'LOKALNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ),
-       'special'                 => array( '0', 'posebno', 'special' ),
-       'hiddencat'               => array( '1', '__SAKRIVENAKATEGORIJA__', 'SKRIVENAKAT', '__SAKRIVENAKAT__', '__HIDDENCAT__' ),
-       'pagesize'                => array( '1', 'VELICINASTRANICE', 'VELIČINASTRANICE', 'VELIČINASTRANE', 'VELICINASTRANE', 'PAGESIZE' ),
-       'formatdate'              => array( '0', 'formatdatuma', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#PREUSMJERI', '#PREUSMERI', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORSIRANISADRŽAJ__', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__SADRŽAJ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__BEZ_IZMENA__', '__BEZIZMENA__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'TRENUTNIMJESEC', 'TRENUTNIMESEC', 'TRENUTAČNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'TRENUTNIMJESEC1', 'TRENUTNIMESEC1', 'TRENUTAČNIMJESEC1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'TRENUTNIMJESECIME', 'TRENUTNIMESECIME', 'TRENUTAČNIMJESECIME', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'TRENUTNIMJESECROD', 'TRENUTNIMESECROD', 'TRENUTAČNIMJESECROD', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'TRENUTNIMJESECSKR', 'TRENUTNIMESECSKR', 'TRENUTAČNIMJESECSKR', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'TRENUTNIDAN', 'TRENUTAČNIDAN', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'TRENUTNIDAN2', 'TRENUTAČNIDAN2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'TRENUTNIDANIME', 'TRENUTAČNIDANIME', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'TRENUTNAGODINA', 'TRENUTAČNAGODINA', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'TRENUTNOVRIJEME', 'TRENUTNOVREME', 'TRENUTAČNOVRIJEME', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'TRENUTNISAT', 'TRENUTAČNISAT', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LOKALNIMJESEC', 'LOKALNIMESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LOKALNIMJESEC1', 'LOKALNIMESEC1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'LOKALNIMJESECIME', 'LOKALNIMESECIME', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'LOKALNIMJESECROD', 'LOKALNIMESECROD', 'LOKALNIMJESECGEN', 'LOKALNIMESECGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'LOKALNIMJESECSKR', 'LOKALNIMESECSKR', 'LOKALNIMJESECKRAT', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'LOKALNIDAN', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKALNIDAN2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'LOKALNAGODINA', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LOKALNOVRIJEME', 'LOKALNOVREME', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'LOKALNISAT', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'BROJSTRANICA', 'BROJSTRANA', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'BROJČLANAKA', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'BROJIZMJENA', 'BROJIZMENA', 'BROJUREĐIVANJA', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'STRANICA', 'IMESTRANICE', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'STRANICE', 'IMESTRANICEE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ),
+       'fullpagename'              => array( '1', 'PUNOIMESTRANE', 'PUNOIMESTRANICE', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'PUNOIMESTRANEE', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ),
+       'msg'                       => array( '0', 'POR:', 'MSG:' ),
+       'subst'                     => array( '0', 'ZAMJENI:', 'ZAMENI:', 'ZAMJENA:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'NVPOR:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'minijatura', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'minijatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'desno', 'right' ),
+       'img_left'                  => array( '1', 'lijevo', 'levo', 'left' ),
+       'img_none'                  => array( '1', 'n', 'bez', 'ništa', 'none' ),
+       'img_center'                => array( '1', 'centar', 'središte', 'c', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'bez_okvira', 'bezokvira', 'frameless' ),
+       'img_page'                  => array( '1', 'stranica=$1', 'stranica_$1', 'strana=$1', 'strana_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'uspravno', 'uspravno=$1', 'uspravno_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'granica', 'obrub', 'border' ),
+       'img_baseline'              => array( '1', 'osnovnacrta', 'pocetna_linija', 'baseline' ),
+       'img_top'                   => array( '1', 'vrh', 'top' ),
+       'img_text_top'              => array( '1', 'vrh_teksta', 'tekst_vrh', 'text-top' ),
+       'img_middle'                => array( '1', 'sredina', 'middle' ),
+       'img_bottom'                => array( '1', 'dno', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'tekst-dno', 'text-bottom' ),
+       'localurl'                  => array( '0', 'LOKALNIURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALNIURLE:', 'LOCALURLE:' ),
+       'notitleconvert'            => array( '0', '__BEZTC__', '__BEZKN__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__BEZCC__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'TRENUTNASEDMICA', 'TRENUTAČNITJEDAN', 'TRENUTNANEDELJA', 'TRENUTNITJEDAN', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'TRENUTNIDANSEDMICE', 'TRENUTAČNIDANTJEDNA', 'TRENUTNIDANNEDELJE', 'TRENUTNIDANTJEDNA', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'LOKALNASEDMICA', 'LOKALNITJEDAN', 'LOKALNANEDELJA', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'LOKALNIDANSEDMICE', 'LOKALNIDANTJEDNA', 'LOKALNIDANNEDELJE', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDIZMJENE', 'IDIZMENE', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'IZMJENEDANA', 'IZMENEDANA', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'IZMJENEDANA2', 'IZMENEDANA2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MJESECIZMJENE', 'MESECIZMENE', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'MJESECIZMJENE1', 'MESECIZMENE1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'GODINAIZMJENE', 'GODINAIZMENE', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'OZNAKAVREMENAIZMJENE', 'OZNAKAVREMENAIZMENE', 'REVISIONTIMESTAMP' ),
+       'plural'                    => array( '0', 'MNOŽINA:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'PUNIURL:', 'PUNURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'PUNIURLE:', 'PUNURLE:', 'FULLURLE:' ),
+       'currenttimestamp'          => array( '1', 'TRENUTNAOZNAKAVREMENA', 'TRENUTAČNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'LOKALNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ),
+       'special'                   => array( '0', 'posebno', 'special' ),
+       'hiddencat'                 => array( '1', '__SAKRIVENAKATEGORIJA__', 'SKRIVENAKAT', '__SAKRIVENAKAT__', '__HIDDENCAT__' ),
+       'pagesize'                  => array( '1', 'VELICINASTRANICE', 'VELIČINASTRANICE', 'VELIČINASTRANE', 'VELICINASTRANE', 'PAGESIZE' ),
+       'formatdate'                => array( '0', 'formatdatuma', 'formatdate', 'dateformat' ),
 );
 
 $linkTrail = '/^([a-zčćđžš]+)(.*)$/sDu';
@@ -1596,9 +1596,9 @@ Zapisnik brisanja i premještanja za ovu stranicu je dostupan ovdje na uvid:",
 Da bi ste vidjeli ili pretražili ranije postavljene datoteke, pogledajte [[Special:FileList|spisak postavljenih datoteka]], ponovna postavljanja su također zapisana u [[Special:Log/upload|evidenciji postavljanja]], a brisanja u [[Special:Log/delete|evidenciji brisanja]].
 
 Da bi ste prikazali datoteku na stranici, koristite link na jedan od slijedećih načina:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></tt>''' da upotrijebite potpunu veziju datoteke
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|thumb|lijevo|opis slike]]</nowiki></tt>''' da upotrijebite smanjeni prikaz širine 200 piksela unutar okvira, s lijevim poravnanjem i ''opisom slike''.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></tt>''' za direkno povezivanje datoteke bez njenog prikazivanja",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' da upotrijebite potpunu veziju datoteke
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|thumb|lijevo|opis slike]]</nowiki></code>''' da upotrijebite smanjeni prikaz širine 200 piksela unutar okvira, s lijevim poravnanjem i ''opisom slike''.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' za direkno povezivanje datoteke bez njenog prikazivanja",
 'upload-permitted' => 'Podržane vrste datoteka: $1.',
 'upload-preferred' => 'Preferirane vrste datoteka: $1.',
 'upload-prohibited' => 'Zabranjene vrste datoteka: $1.',
@@ -1646,21 +1646,21 @@ Ova datoteka je velika $2.',
 Ovo je moguće zbog greške u imenu datoteke. 
 Molimo Vas da provjerite da li stvarno želite da pošaljete ovu datoteku.',
 'windows-nonascii-filename' => 'Ova wiki ne podržava imena datoteka sa posebnim znacima.',
-'fileexists' => "Datoteka sa ovim imenom već postoji.
-Molimo Vas da provjerite '''<tt>[[:$1]]</tt>''' ako niste sigurni da li želite da je promjenite.
-[[$1|thumb]]",
-'filepageexists' => "Opis stranice za ovu datoteku je već napravljen ovdje '''<tt>[[:$1]]</tt>''', ali datoteka sa ovim nazivom trenutno ne postoji.
+'fileexists' => 'Datoteka sa ovim imenom već postoji.
+Molimo Vas da provjerite <strong>[[:$1]]</strong> ako niste sigurni da li želite da je promjenite.
+[[$1|thumb]]',
+'filepageexists' => 'Opis stranice za ovu datoteku je već napravljen ovdje <strong>[[:$1]]</strong>, ali datoteka sa ovim nazivom trenutno ne postoji.
 Sažetak koji ste naveli neće se pojaviti na stranici opisa.
 Da bi se Vaš opis ovdje našao, potrebno je da ga ručno uredite.
-[[$1|thumb]]",
-'fileexists-extension' => "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]
-* Naziv datoteke koja se postavlja: '''<tt>[[:$1]]</tt>'''
-* Naziv postojeće datoteke: '''<tt>[[:$2]]</tt>'''
-Molimo Vas da izaberete drugačiji naziv.",
-'fileexists-thumbnail-yes' => "Izgleda da je datoteka slika smanjene veličine ''(\"thumbnail\")''. [[\$1|thumb]]
-Molimo provjerite datoteku '''<tt>[[:\$1]]</tt>'''.
-Ako je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.",
-'file-thumbnail-no' => "Naziv datoteke počinje sa '''<tt>\$1</tt>'''.
+[[$1|thumb]]',
+'fileexists-extension' => 'Datoteka sa sličnim nazivom postoji: [[$2|thumb]]
+* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>
+* Naziv postojeće datoteke: <strong>[[:$2]]</strong>
+Molimo Vas da izaberete drugačiji naziv.',
+'fileexists-thumbnail-yes' => 'Izgleda da je datoteka slika smanjene veličine \'\'("thumbnail")\'\'. [[$1|thumb]]
+Molimo provjerite datoteku <strong>[[:$1]]</strong>.
+Ako je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.',
+'file-thumbnail-no' => "Naziv datoteke počinje sa <strong>\$1</strong>.
 Izgleda da se radi o smanjenoj slici ''(\"thumbnail\")''.
 Ako imate ovu sliku u punoj rezoluciji, postavite nju; ili promijenite naslov ove datoteke.",
 'fileexists-forbidden' => 'Datoteka sa ovim imenom već postoji i ne može biti presnimljena.
@@ -1905,7 +1905,7 @@ Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 # MIME search
 'mimesearch' => 'MIME pretraga',
 'mimesearch-summary' => 'Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.
-Ulazni podaci: vrstasadržaja/podvrsta, npr. <tt>image/jpeg</tt>.',
+Ulazni podaci: vrstasadržaja/podvrsta, npr. <code>image/jpeg</code>.',
 'mimetype' => 'MIME tip:',
 'download' => 'učitaj',
 
@@ -2102,7 +2102,7 @@ Vidi također [[Special:WantedCategories|zatražene kategorije]].',
 'linksearch-ok' => 'Traži',
 'linksearch-text' => 'Mogu se koristiti džokeri poput „*.wikipedia.org“.<br />
 Potreban je najviši domen, kao „*.org“.<br />
-Podržani protokoli: <tt>$1</tt> (ne stavljajte u pretragu)',
+Podržani protokoli: <code>$1</code> (ne stavljajte u pretragu)',
 'linksearch-line' => '$1 je povezan od $2',
 'linksearch-error' => 'Džokeri se mogu pojavljivati samo na početku naziva servera.',
 
@@ -2953,15 +2953,10 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
 # Info page
 'pageinfo-title' => 'Informacije za "$1"',
 'pageinfo-header-edits' => 'Izmjene',
-'pageinfo-header-watchlist' => 'Praćene stranice',
-'pageinfo-header-views' => 'Pregledi',
-'pageinfo-subjectpage' => 'Stranica',
-'pageinfo-talkpage' => 'Stranica za razgovor',
+'pageinfo-views' => 'Broj pregleda',
 'pageinfo-watchers' => 'Broj onih koji pregledaju',
 'pageinfo-edits' => 'Broj izmjena',
 'pageinfo-authors' => 'Broj specifičnih autora',
-'pageinfo-views' => 'Broj pregleda',
-'pageinfo-viewsperedit' => 'Pregleda po izmjeni',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označi kao patrolirano',
@@ -3817,6 +3812,7 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'api-error-file-too-large' => 'Datoteka koju ste poslali je bila prevelika.',
 'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
 'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|nije dopušten tip datoteke|nisu dopušteni tipovi datoteka}}. {{PLURAL:$3|Dopuštena vrsta datoteke je|Dopuštene vrste datoteka su}} $2.',
 'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
 'api-error-hookaborted' => 'Izmjena koji ste pokušali načiniti je otkazana preko "kuke" proširenja mediawiki softvera.',
 'api-error-http' => 'Unutrašnja greška: ne može se spojiti na server.',
index 6cd98ab..cc05670 100644 (file)
@@ -269,8 +269,6 @@ $1',
 Ẓr [[Special:Version|ayyaw tasna]].',
 
 'ok' => 'Waxxa',
-'pagetitle' => '(MediaWiki)$1 - {{SITENAME}}',
-'pagetitle-view-mainpage' => '{{SITENAME}}',
 'retrievedfrom' => 'Yurrid z "$1"',
 'youhavenewmessages' => 'Illa dark $1 ($2).',
 'newmessageslink' => 'Tibratin timaynutin',
index be52dea..972e2ef 100644 (file)
@@ -149,46 +149,46 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#යළියොමුව', '#REDIRECT' ),
-       'currentmonth'            => array( '1', 'වත්මන්මාසය', 'වත්මන්මාසය2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'වත්මන්මාසය1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'වත්මන්මාසනාමය', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'වත්මන්මාසනාමයපොදු', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'වත්මන්මාසයකෙටි', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'වත්මන්දිනය', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'වත්මන්දිනය2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'වත්මන්දිනනාමය', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'වත්මන්වසර', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'වත්මන්වේලාව', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'වත්මන්පැය', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'දේශීයමාසය', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'දේශීයමාසනාමය', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'දේශීයමාසනාමයපොදු', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'දේශීයමාසයකෙටි', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'දේශීයදිනය', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'දේශීයදිනය2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'දේශීයදිනනාමය', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'දේශීයවසර', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'දේශීයවේලාව', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'දේශීයපැය', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'පිටුසංඛ්‍යාව', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ලිපිසංඛ්‍යාව', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ගොනුසංඛ්‍යාව', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'පරිශීලකයන්සංඛ්‍යාව', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'සංස්කරණසංඛ්‍යාව', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'පිටුනාමය', 'PAGENAME' ),
-       'namespace'               => array( '1', 'නාමඅවකාශය', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'නාමඅවකාශයන්', 'NAMESPACEE' ),
-       'msg'                     => array( '0', 'පණිවුඩ:', 'MSG:' ),
-       'img_right'               => array( '1', 'දකුණ', 'right' ),
-       'img_left'                => array( '1', 'වම', 'left' ),
-       'img_none'                => array( '1', 'නොමැත', 'none' ),
-       'img_width'               => array( '1', '$1පික්', '$1px' ),
-       'img_center'              => array( '1', 'මධ්‍යය', 'center', 'centre' ),
-       'img_border'              => array( '1', 'දාරය', 'border' ),
-       'img_sub'                 => array( '1', 'උප', 'sub' ),
-       'img_middle'              => array( '1', 'මැද', 'middle' ),
-       'special'                 => array( '0', 'විශේෂ', 'special' ),
+       'redirect'                  => array( '0', '#යළියොමුව', '#REDIRECT' ),
+       'currentmonth'              => array( '1', 'වත්මන්මාසය', 'වත්මන්මාසය2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'වත්මන්මාසය1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'වත්මන්මාසනාමය', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'වත්මන්මාසනාමයපොදු', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'වත්මන්මාසයකෙටි', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'වත්මන්දිනය', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'වත්මන්දිනය2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'වත්මන්දිනනාමය', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'වත්මන්වසර', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'වත්මන්වේලාව', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'වත්මන්පැය', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'දේශීයමාසය', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'දේශීයමාසනාමය', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'දේශීයමාසනාමයපොදු', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'දේශීයමාසයකෙටි', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'දේශීයදිනය', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'දේශීයදිනය2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'දේශීයදිනනාමය', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'දේශීයවසර', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'දේශීයවේලාව', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'දේශීයපැය', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'පිටුසංඛ්‍යාව', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ලිපිසංඛ්‍යාව', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ගොනුසංඛ්‍යාව', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'පරිශීලකයන්සංඛ්‍යාව', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'සංස්කරණසංඛ්‍යාව', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'පිටුනාමය', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'නාමඅවකාශය', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'නාමඅවකාශයන්', 'NAMESPACEE' ),
+       'msg'                       => array( '0', 'පණිවුඩ:', 'MSG:' ),
+       'img_right'                 => array( '1', 'දකුණ', 'right' ),
+       'img_left'                  => array( '1', 'වම', 'left' ),
+       'img_none'                  => array( '1', 'නොමැත', 'none' ),
+       'img_width'                 => array( '1', '$1පික්', '$1px' ),
+       'img_center'                => array( '1', 'මධ්‍යය', 'center', 'centre' ),
+       'img_border'                => array( '1', 'දාරය', 'border' ),
+       'img_sub'                   => array( '1', 'උප', 'sub' ),
+       'img_middle'                => array( '1', 'මැද', 'middle' ),
+       'special'                   => array( '0', 'විශේෂ', 'special' ),
 );
 
 $messages = array(
@@ -199,7 +199,7 @@ $messages = array(
 'tog-hidepatrolled' => 'මෑත වෙනස් කිරීම්වල මුර සංචාරය කරන ලද සංස්කරණ සඟවන්න',
 'tog-newpageshidepatrolled' => 'විමසුමට ලක්කෙරුණු පිටු, අළුත් පිටු ලැයිස්තුවෙහි නොපෙන්වන්න',
 'tog-extendwatchlist' => 'මෑත වෙනස්වීම් පමණක් නොව, අදාළ සියළු වෙනස්වීම් දක්වා පෙන්වන අයුරින් මුර-ලැයිස්තුව පුළුල් කරන්න',
-'tog-usenewrc' => 'à¶\86à·\80රà·\8aධà·\92ත à¶¸à·\91ත à·\80à·\99නà·\83à·\8aà·\80à·\93මà·\8a à¶·à·\8fà·\80à·\92තà·\8f à¶\9aරනà·\8aන (ජාවාස්ක්‍රිප්ට් ඇවැසිය)',
+'tog-usenewrc' => 'මà·\91ත à·\80à·\99නà·\83à·\8aà·\80à·\93මà·\8a à·\83à·\84 à¶¸à·\94ර à¶½à·\90යà·\92à·\83à·\8aතà·\94à·\80 à·\84à·\93 à¶´à·\92ටà·\94à·\80 à¶\85නà·\94à·\80 à·\83මà·\96à·\84 à·\80à·\99නà·\83à·\8aà·\80à·\93මà·\8a (ජාවාස්ක්‍රිප්ට් ඇවැසිය)',
 'tog-numberheadings' => 'ශීර්ෂ-නාම ස්වයංක්‍රීයව අංකනය කරන්න',
 'tog-showtoolbar' => 'සංස්කරණ මෙවලම්තීරුව පෙන්වන්න (ජාවාස්ක්‍රිප්ට්)',
 'tog-editondblclick' => 'ද්විත්ව-ක්ලික් කිරීම මගින් පිටු සංස්කරණය අරඹන්න (ජාවාස්ක්‍රිප්ට්)',
@@ -207,17 +207,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'ඡේද ශීර්ෂ මත දකුණු-ක්ලික් කිරීමෙන් ඡේද සංස්කරණය සක්‍රීය කරන්න (ජාවාස්ක්‍රිප්ට්)',
 'tog-showtoc' => 'පටුන පෙන්වන්න ( තුනකට වඩා වැඩියෙන් ශීර්ෂ-නාම අඩංගු පිටු සඳහා)',
 'tog-rememberpassword' => 'මගේ ප්‍රවිෂ්ටය මෙම ගවේශකයෙහි උපරිම ලෙස {{PLURAL:$1|දිනයක්|දින $1ක්}} මතක තබා ගන්න',
-'tog-watchcreations' => 'මම à¶­à¶±à¶± à¶´à·\92ටà·\94 à¶¸à¶\9cà·\9a à¶¸à·\94ර-ලැයිස්තුවට එක් කරන්න',
-'tog-watchdefault' => 'මම à·\83à¶\82à·\83à·\8aà¶\9aරණය à¶\9aරන à¶´à·\92ටà·\94 à¶¸à¶\9cà·\9a à¶¸à·\94ර-ලැයිස්තුවට එක් කරන්න',
-'tog-watchmoves' => 'මම à¶\9cà·\99නයන à¶´à·\92ටà·\94 à¶¸à¶\9cà·\9a à¶¸à·\94ර-ලැයිස්තුවට එක් කරන්න',
-'tog-watchdeletion' => 'මම මකාදමන පිටු මගේ මුර-ලැයිස්තුවට එක් කරන්න',
+'tog-watchcreations' => 'මම à¶­à¶±à¶± à¶´à·\92ටà·\94 à·\84à·\8f à¶¸à¶¸ à¶\8bඩà·\94à¶\9cත à¶\9aරන à¶\9cà·\9cනà·\94 à¶¸à·\8fà¶\9cà·\9a à¶¸à·\94රලැයිස්තුවට එක් කරන්න',
+'tog-watchdefault' => 'මම à·\83à¶\82à·\83à·\8aà¶\9aරණය à¶\9aරන à¶´à·\92ටà·\94 à·\84à·\8f à¶\9cà·\9cනà·\94 à¶¸à·\8fà¶\9cà·\9a à¶¸à·\94ර ලැයිස්තුවට එක් කරන්න',
+'tog-watchmoves' => 'මම à¶\9cà·\99නයන à¶´à·\92ටà·\94 à·\84à·\8f à¶\9cà·\9cනà·\94 à¶¸à·\8fà¶\9cà·\9a à¶¸à·\94ර ලැයිස්තුවට එක් කරන්න',
+'tog-watchdeletion' => 'මම මකා දමන පිටු සහ ගොනු මාගේ මුර ලැයිස්තුවට එක් කරන්න',
 'tog-minordefault' => 'සියළු සංස්කරණයන් පෙර-නිමියෙන් සුළු-සංස්කරණ ලෙස සලකුණු කරන්න',
 'tog-previewontop' => 'සංස්කරණ කොටුවට ඉදිරියෙන් පෙර-දසුන පෙන්වන්න',
 'tog-previewonfirst' => 'පළමු සංස්කරණයෙහිදී පෙර-දසුන පෙන්වන්න',
 'tog-nocache' => 'ගවේශක පිටු මතක තබා ගැනීම අක්‍රීය කරන්න',
-'tog-enotifwatchlistpages' => 'මà\9cà·\9a à¶¸à·\94ර-ලà·\90යà·\92à·\83à·\8aතà·\94à·\80à·\9a à¶´à·\92ටà·\94à·\80à¶\9aà·\8a à·\80à·\99නà·\83à·\8a à·\80à·\96 à·\80à·\92ට à¶¸à·\8f à·\84ට à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a-තà·\90පà·\91ලක් එවන්න',
+'tog-enotifwatchlistpages' => 'මà·\8fà¶\9cà·\9a à¶¸à·\94ර à¶½à·\90යà·\92à·\83à·\8aතà·\94à·\80à·\99à·\84à·\92 à¶´à·\92ටà·\94à·\80à¶\9aà·\8a à·\84à·\9d à¶\9cà·\9cනà·\94à·\80à¶\9aà·\8a à·\84à·\9d à·\80à·\99නà·\83à·\8aà·\80à·\96 à·\80à·\92ට à¶¸à·\8f à·\84ට à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a à¶­à·\90පà·\90ලà·\8a à¶´à¶«à·\92à·\80à·\94ඩයක් එවන්න',
 'tog-enotifusertalkpages' => 'මගේ පරිශීලක සාකච්ඡා පිටුව වෙනස් වූ විට මා හට විද්‍යුත්-තැපෑලක් එවන්න',
-'tog-enotifminoredits' => 'පිටුවල  සුළු-සංස්කරණයකදී පවා මට ඊ- තැපැල් ලිපියක් එවන්න',
+'tog-enotifminoredits' => 'පිටුවල හෝ ගොනුවල හෝ  සුළු-සංස්කරණයකදී පවා මට විද්‍යුත් තැපැල් පණිවුඩයක් එවන්න',
 'tog-enotifrevealaddr' => 'දැනුම්දීමේ විද්‍යුත්-ලිපි වල මාගේ විද්‍යුත්-ලිපිනය හෙළි කරන්න',
 'tog-shownumberswatching' => 'මුර කරනු ලබන පරිශීලකයන් සංඛ්‍යාව පෙන්වන්න',
 'tog-oldsig' => 'පවතින අත්සන:',
@@ -233,7 +233,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'ප්‍රවිෂ්ට වී ඇති පරිශීලකයන් විසින් සිදුකර ඇති සංස්කරණ මුර-ලැයිස්තුවෙන් සඟවන්න',
 'tog-watchlisthideanons' => 'නිර්නාමික පරිශීලකයන් විසින් සිදුකොට ඇති සංස්කරණ මුර-ලැයිස්තුවෙන් සඟවන්න',
 'tog-watchlisthidepatrolled' => 'විමසුමට ලක්කෙරුණු සංස්කරණයන්, මෑත වෙනස්වීම් හී නොපෙන්වන්න',
-'tog-nolangconversion' => 'විචල්‍යයන් පෙරැළීම අක්‍රීය කරන්න',
 'tog-ccmeonemails' => 'මා විසින් අනෙකුත් පරිශීලකයන් හට යවන විද්‍යුත්-තැපෑලයන්හි පිටපත් මාහට එවන්න',
 'tog-diffonly' => '“වෙනස් ”පදයන්ට පහළින්, පිටුවල අන්තර්ගතය   නොපෙන්වන්න',
 'tog-showhiddencats' => 'සැඟවුනු ප්‍රවර්ග පෙන්වන්න',
@@ -348,9 +347,9 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'මාතෘකාව එක්කරන්න',
-'vector-action-delete' => 'මà¶\9aà·\8fදමනà·\8aන',
+'vector-action-delete' => 'මකන්න',
 'vector-action-move' => 'ගෙනයන්න',
-'vector-action-protect' => 'ආරක්‍ෂණය කරන්න',
+'vector-action-protect' => 'ආරක්‍ෂණය',
 'vector-action-undelete' => 'මකාදැමීම අවලංගු කරන්න',
 'vector-action-unprotect' => 'ආරක්ෂණ තත්වය වෙනස් කරන්න',
 'vector-simplesearch-preference' => 'වැඩිදියුණුකළ සෙවුම් යෝජනා සක්‍රීය කරන්න (වෙක්ටර් තීමය සඳහා පමණි)',
@@ -366,7 +365,7 @@ $messages = array(
 'errorpagetitle' => 'දෝෂය',
 'returnto' => '$1 වෙත නැවත යන්න.',
 'tagline' => '{{SITENAME}} වෙතින්',
-'help' => 'à¶\8bදà·\80à·\94',
+'help' => 'à¶\8bදà·\80à·\8a',
 'search' => 'සොයන්න',
 'searchbutton' => 'සොයන්න',
 'go' => 'යන්න',
@@ -374,11 +373,11 @@ $messages = array(
 'history' => 'පිටුවේ ඉතිහාසය',
 'history_short' => 'ඉතිහාසය',
 'updatedmarker' => 'මාගේ අවසාන පිවිසුමෙන් පසුව යාවත්කාලීන කරඇත',
-'printableversion' => 'මුද්‍රණයකලහැකි සංස්කරණය',
+'printableversion' => 'මුද්‍රණය කල හැකි සංස්කරණය',
 'permalink' => 'ස්ථාවර සබැඳුම',
 'print' => 'මුද්‍රණය කරන්න',
 'view' => 'දසුන',
-'edit' => 'සංස්කරණය කරන්න',
+'edit' => 'සංස්කරණය',
 'create' => 'තනන්න',
 'editthispage' => 'මෙම පිටුව සංස්කරණය කරන්න',
 'create-this-page' => 'මෙම පිටුව තනන්න',
@@ -386,7 +385,7 @@ $messages = array(
 'deletethispage' => 'මෙම පිටුව මකන්න',
 'undelete_short' => '{{PLURAL:$1|එක් සංස්කරණයක|සංස්කරණ $1 ක}} මකා දැමීම ප්‍රතිලෝම කරන්න',
 'viewdeleted_short' => 'මකා දමනු ලැබූ {{PLURAL:$1|එක් සංස්කරණයක්|සංස්කරණ $1  ක්}} බලන්න',
-'protect' => 'ආරක්‍ෂණය කරන්න',
+'protect' => 'ආරක්‍ෂණය',
 'protect_change' => 'වෙනස් කරන්න',
 'protectthispage' => 'මෙම පිටුව ආරක්‍ෂණය කරන්න',
 'unprotect' => 'ආරක්ෂණ තත්වය වෙනස් කරන්න',
@@ -415,7 +414,7 @@ $messages = array(
 'lastmodifiedat' => 'මෙම පිටුව අවසන් වරට වෙනස් කරන ලද්දේ $1 දිනදී, $2 වේලාවෙහිදීය.',
 'viewcount' => 'මෙම පිටුවට {{PLURAL:$1|එක් වරක්|$1 වරක්}} පිවිස ඇත.',
 'protectedpage' => 'ආරක්ෂිත පිටුව',
-'jumpto' => 'à·\80à·\99ත à¶ºන්න:',
+'jumpto' => 'à·\80à·\99ත à¶´à¶±à·\92න්න:',
 'jumptonavigation' => 'සංචලනය',
 'jumptosearch' => 'සොයන්න',
 'view-pool-error' => "සමාවන්න, ස'වරයන් මෙම අවස්ථාවෙහිදී අධිපූරණය වී ඇත.
@@ -460,6 +459,10 @@ $1",
 'youhavenewmessages' => 'ඔබ හට $1 ($2)',
 'newmessageslink' => 'නව පණිවුඩ',
 'newmessagesdifflink' => 'අවසාන වෙනස',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|තවත් එක් පරිශීලකයෙකුගෙන්|පරිශීලකයන් $3 දෙනෙකුගෙන්}} ඔබ හට $1 ඇත ($2).',
+'youhavenewmessagesmanyusers' => 'බොහෝ පරිශීලකයන් වෙතින් ඔබ හට $1 ඇත ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|නව පණිවුඩයක්|නව පණිවුඩ}}',
+'newmessagesdifflinkplural' => 'අවසන් {{PLURAL:$1|වෙනස්වීම|වෙනස්වීම්}}',
 'youhavenewmessagesmulti' => 'ඔබ හට $1 හි නව පණිවුඩ ඇත',
 'editsection' => 'සංස්කරණය',
 'editsection-brackets' => '[$1]',
@@ -556,6 +559,8 @@ URL  සඳහන් කරමින්, මෙම කරුණ [[Special:ListUs
 'cannotdelete' => '"$1" පිටුව හෝ ගොනුව හෝ මකා දැමිය නොහැකි විය.
 අනෙකෙකු විසින් දැනටමත් ‍මකා දැමීම සිදු කර ඇතිවා විය හැක.',
 'cannotdelete-title' => '"$1" පිටුව මැකිය නොහැක',
+'delete-hook-aborted' => 'හසුර මගින් මකාදැමුම රෝධනය කෙරිණි.
+එයට පැහැදිලි කිරීමක් ලබා නොදුනි.',
 'badtitle' => 'නුසුදුසු ශීර්ෂයක්',
 'badtitletext' => 'අයැද ඇති පිටු ශීර්ෂය අනීතික, හිස් හෝ වැරදි ලෙස සබැඳි අන්තර්-භාෂා/අන්තර්-විකී ශීර්ෂයකි.
 ශීර්ෂයන්හි භාවිතා කල නොහැකි අක්ෂර එකක් හෝ කිහිපයක් හෝ එහි අඩංගු වී ඇතිවා විය හැක.',
@@ -587,6 +592,7 @@ $2',
 'ns-specialprotected' => 'විශේෂ පිටු සංස්කරණය කිරීම සිදු කල නොහැක.',
 'titleprotected' => "මෙම ශීර්ෂ-නාමය තැනීම  [[User:$1|$1]] විසින් වාරණය කොට ඇත.
 මේ සඳහා  ''$2''  හේතුව දක්වා ඇත.",
+'exception-nologin' => 'ප්‍රවිෂ්ට වී නොමැත',
 
 # Virus scanner
 'virus-badscanner' => "අයෝග්‍ය වික්‍යාසයකි: අඥාත වයිරස සුපිරික්සකයකි: ''$1''",
@@ -620,7 +626,7 @@ $2',
 'nologin' => "ඔබ හට ගිණුමක් නොමැතිද? '''$1'''.",
 'nologinlink' => 'ගිණුමක් තනන්න',
 'createaccount' => 'අලුත් ගිණුමක් තනන්න',
-'gotaccount' => "දැනටමත් ගිණුමක් තිබේද? '''$1'''.",
+'gotaccount' => 'දැනටමත් ගිණුමක් තිබේද? $1.',
 'gotaccountlink' => 'පිවිසෙන්න',
 'userlogin-resetlink' => 'ඔබේ පිවිසුම් තොරතුරු අමතකද?',
 'createaccountmail' => 'විද්‍යුත් තැපෑල මගින්',
@@ -689,8 +695,8 @@ $2',
 
 මෙම ගිණුම තැනී ඇත්තේ වැරදීමකින් නම්, මෙම පණිවුඩය නොසලකා හැරිය හැක.',
 'usernamehasherror' => 'පරිශීලක නාමයේ පූරක අනුලකුණු අඩංගු විය නොහැකිය',
-'login-throttled' => 'à¶\94බ à·\80à·\92à·\83à·\92නà·\8a à¶¸à·\91තදà·\93  à¶´à¶¸à¶«à¶§ à·\80ඩà·\8f à·\80à·\8fර à¶\9cණනà¶\9aà·\8a à¶´à·\8aâ\80\8dරà·\80à·\92à·\82à·\8aට à·\80à·\93මට à¶\8bතà·\8aà·\83à·\8fà·\84 දරා ඇත.
-යà·\85à·\92 à¶\8bතà·\8aà·\83à·\8fà·\84 à¶\9aà·\92රà·\93මට à¶´à·\99ර à¶\9aරà·\94ණà·\8fà¶\9aර à¶¸à¶¯à¶\9aà·\8a à¶´à·\9cරà·\9cතà·\8aතà·\94 à·\80න්න.',
+'login-throttled' => 'à¶\94බ à·\80à·\92à·\83à·\92නà·\8a à¶¸à·\91තදà·\93  à¶´à¶¸à¶«à¶§ à·\80ඩà·\8f à·\80à·\8fර à¶\9cණනà¶\9aà·\8a à¶´à·\92à·\80à·\92à·\83à·\93මà·\99à·\84à·\92 à¶\8bතà·\8aà·\83à·\8fà·\84යනà·\8a දරා ඇත.
+යà·\85à·\92 à¶\8bතà·\8aà·\83à·\8fà·\84 à¶\9aà·\92රà·\93මට à¶´à·\99ර à¶¸à¶³ à·\80à·\9aලà·\8fà·\80à¶\9aà·\8a à¶»à·\90ඳà·\93 à·\83à·\92ටà·\92න්න.',
 'login-abort-generic' => 'ඔබගේ පිවිසීම අසාර්ථකයි - අතහැර දමනලදී',
 'loginlanguagelabel' => 'භාෂාව: $1',
 'suspicious-userlogout' => 'නිෂ්ක්‍රමණය සඳහා ඔබගේ අයැදුම නිෂ්ප්‍රභා කෙරුනේ එය යොමු කොට ඇත්තේ භින්න(කැඩුනු) බ්‍රවුසරයකින් හෝ නිවේෂණය කෙරෙමින් පවතින ප්‍රොක්සියක් වෙතින් යැයි බැලූ බැල්මට පෙනෙන බැවිනි.',
@@ -762,7 +768,7 @@ $2
 'link_sample' => 'සබැඳි ශීර්ෂය',
 'link_tip' => 'අභ්‍යන්තර සබැඳිය',
 'extlink_sample' => 'http://www.example.com සබැඳුම් මාතෘකාව',
-'extlink_tip' => 'බාහිර සබැඳිය ( http:// උපසර්ගය සිහි තබාගන්න)',
+'extlink_tip' => 'බාහිර සබැඳිය (http:// උපසර්ගය සිහි තබාගන්න)',
 'headline_sample' => 'සිරස්තල පෙළ',
 'headline_tip' => '2 වන මට්ටමෙහි සිරස්තලය',
 'nowiki_sample' => 'ආකෘතිකරණය-නොකල පෙළ මෙහි රුවන්න',
@@ -838,9 +844,9 @@ $2
 
 මෙම නව ගිණුම සඳහා මුරපදය, ප්‍රවිෂ්ට වීමෙන් අනතුරුව, ''[[Special:ChangePassword|මුර පදය වෙනස් කරන්න]]''  පිටුව තුලදී වෙනස් කල හැක.",
 'newarticle' => '(නව)',
-'newarticletext' => "බà·\90ඳà·\92යà¶\9aà·\8a à¶\94à·\83à·\8aà·\83à·\9a à¶´à·\90මà·\92ණ à¶\94බ à¶´à·\92à·\80à·\92à·\83 à¶\87තà·\8aතà·\9a à¶¯à·\90නට à¶±à·\9cපà·\80තà·\92න à¶½à·\92පà·\92යකටයි.
+'newarticletext' => "බà·\90ඳà·\92යà¶\9aà·\8a à¶\94à·\83à·\8aà·\83à·\9a à¶´à·\90මà·\92ණ à¶\94බ à¶´à·\92à·\80à·\92à·\83 à¶\87තà·\8aතà·\9a à¶¯à·\90නට à¶±à·\9cපà·\80තà·\92න à¶´à·\92ටà·\94à·\80කටයි.
 මෙම ලිපිය තැනීමට අවශ්‍ය නම්, පහත ඇති කොටුව තුල අකුරු ලිවීම අරඹන්න (වැඩිදුර තොරතුරු සඳහා [[{{MediaWiki:Helppage}}|උදවු පිටුව]] බලන්න).
-à¶\94බ à¶¸à·\99à·\84à·\92 à¶´à·\92à·\80à·\92à·\83 à¶\87තà·\8aතà·\9a à¶\85තà·\8aà·\80à·\90රà·\90දà·\8aදà¶\9aà·\92නà·\8a à¶±à¶¸à·\8a, à¶\94බà¶\9cà·\9a à·\83à·\90රà·\92à·\83රයà·\99à·\84à·\92 (බà·\8aâ\80\8dරà·\80à·\94à·\83රයà·\99à·\84à·\92) '''à¶\86පà·\83à·\94 (back)''' à¶¶à·\9cතà·\8aතම à¶\9aà·\8aලà·\92à¶\9aà·\8a à¶\9aරන්න.",
+à¶\94බ à¶¸à·\99à·\84à·\92 à¶´à·\92à·\80à·\92à·\83 à¶\87තà·\8aතà·\9a à¶\85තà·\8aà·\80à·\90රà·\90දà·\8aදà¶\9aà·\92නà·\8a à¶±à¶¸à·\8a, à¶\94බà¶\9cà·\9a à\9cà·\80à·\9aà·\82à¶\9aයà·\99à·\84à·\92 '''à¶\86පà·\83à·\94''' à¶¶à·\9cතà·\8aතම à¶\94බන්න.",
 'anontalkpagetext' => "----''මෙම සංවාද පිටුව අයත් වන්නේ තවමත් ගිණුමක් තනා නැති හෝ එසේ කොට එනමුදු එය භාවිතා නොකරන හෝ නිර්නාමික පරිශීලකයෙකුටය.
 එබැවින්, ඔහු/ඇය හැඳින්වීමට සංඛ්‍යාත්මක IP ලිපිනය භාවිතා කිරීමට අප හට සිදුවේ.
 පරිශීලකයන් කිහිප දෙනෙකු විසින් මෙවැනි IP ලිපිනයක් හවුලේ පරිහරණය කරනවා විය හැක.
@@ -994,7 +1000,7 @@ $3 විසින් සපයා ඇති හේතුව ''$2'' වේ",
 'currentrev' => 'නවතම සංශෝධනය',
 'currentrev-asof' => '$1 වන විට නවතම සංශෝධනය',
 'revisionasof' => '$1 තෙක් සංශෝධනය',
-'revision-info' => '$1 වන විට  $2 විසින් සිදු කර ඇති සංශෝධන',
+'revision-info' => '$1 වන විට $2 විසින් සිදු කර ඇති සංශෝධන',
 'previousrevision' => '← පැරණි සංශෝධනය',
 'nextrevision' => 'නව සංශෝධනය →',
 'currentrevisionlink' => 'වත්මන් සංශෝධනය',
@@ -1016,7 +1022,7 @@ $3 විසින් සපයා ඇති හේතුව ''$2'' වේ",
 # Revision feed
 'history-feed-title' => 'සංශෝධන ඉතිහාසය',
 'history-feed-description' => 'විකියෙහි මෙම පිටුව සඳහා ඇති සංශෝධන ඉතිහාසය',
-'history-feed-item-nocomment' => '$1 විසින්  $2 හිදී',
+'history-feed-item-nocomment' => '$1 විසින් $2 හිදී',
 'history-feed-empty' => 'අයැදුනු පිටුව නොපවතියි.
 එය විකියෙන් මකා දමා හෝ නම-වෙනස් කොට ඇතිවා විය හැකිය.
 අදාල නව පිටු සඳහා  [[Special:Search|විකිය තුල ගවේෂණය]] අත්හදා බලන්න.',
@@ -1158,8 +1164,8 @@ $1",
 'lineno' => 'පේළිය $1:',
 'compareselectedversions' => 'තෝරාගත් සංශෝධන සසඳන්න',
 'showhideselectedversions' => 'තෝරාගත් සංශෝධන පෙන්වන්න/සඟවන්න',
-'editundo' => 'අහෝසි කරන්න',
-'diff-multi' => '({{PLURAL:$2|one user|$2 users}} විසින් සිදුකල {{PLURAL:$1|එක් අතරමැදි සංශෝධනයක්| අතරමැදි සංශෝධන $1 ක්}} පෙන්නුම් කර නොමැත.)',
+'editundo' => 'අහෝසි',
+'diff-multi' => '({{PLURAL:$2|එක් පරිශීලකයෙක්|පරිශීලකයන් $2 ක්}} විසින් සිදුකල {{PLURAL:$1|එක් අතරමැදි සංශෝධනයක්|අතරමැදි සංශෝධන $1 ක්}} පෙන්නුම් කර නොමැත.)',
 'diff-multi-manyusers' => '(පරිශීලකයන් $2 කට වඩා වැඩි ගණනකගේ ආසන්න පුනරීක්‍ෂණ $1ක් පෙන්වා නොමැත)',
 
 # Search results
@@ -1173,14 +1179,14 @@ $1",
 'notitlematches' => 'පිටු ශීර්ෂ ගැලපීම් කිසිවක් නොමැත',
 'textmatches' => 'පිටු පෙළ ගැළපෙයි',
 'notextmatches' => 'පිටු පෙළ කිසිවක් නොගැළපෙයි',
-'prevn' => 'පෙර  {{PLURAL:$1|$1}}',
-'nextn' => 'මීලඟ  {{PLURAL:$1|$1}}',
-'prevn-title' => 'පූර්ව  {{PLURAL:$1|ප්‍රතිඵලය|ප්‍රතිඵලයන් $1}}',
-'nextn-title' => 'මීලඟ  {{PLURAL:$1|ප්‍රතිඵලය|ප්‍රතිඵල $1}}',
+'prevn' => 'පෙර {{PLURAL:$1|$1}}',
+'nextn' => 'මීලඟ {{PLURAL:$1|$1}}',
+'prevn-title' => 'පූර්ව {{PLURAL:$1|ප්‍රතිඵලය|ප්‍රතිඵලයන් $1}}',
+'nextn-title' => 'මීලඟ {{PLURAL:$1|ප්‍රතිඵලය|ප්‍රතිඵල $1}}',
 'shown-title' => 'එක් පිටුවක {{PLURAL:$1|ප්‍රතිඵලයක්|ප්‍රතිඵල $1 ක්}} බැගින් පෙන්වන්න',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) නරඹන්න',
 'searchmenu-legend' => 'ගවේෂණ තෝරාගැනීම්',
-'searchmenu-exists' => "''' මෙම විකියෙහි  \"[[:\$1]]\" ලෙස නම් කර ඇති පිටුවක් ඇත'''",
+'searchmenu-exists' => "'''මෙම විකියෙහි \"[[:\$1]]\" ලෙස නම් කර ඇති පිටුවක් ඇත.'''",
 'searchmenu-new' => "'''මෙම විකියෙහි \"[[:\$1]]\" පිටුව තනන්න!'''",
 'searchhelp-url' => 'Help:පටුන',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|මෙම උපසර්ගය භාවිත කරමින් පිටු පිරික්සන්න]]',
@@ -1192,9 +1198,9 @@ $1",
 'searchprofile-articles-tooltip' => '$1 හි ගවේෂණය කරන්න',
 'searchprofile-project-tooltip' => '$1 හි ගවේෂණය කරන්න',
 'searchprofile-images-tooltip' => 'ගොනු සඳහා ගවේෂණය කරන්න',
-'searchprofile-everything-tooltip' => 'සියළු අන්තර්ගතය ගවේෂණය කරන්න(සාකච්ඡා පිටුද ඇතුළුව)',
+'searchprofile-everything-tooltip' => 'සියළු අන්තර්ගතය ගවේෂණය කරන්න (සාකච්ඡා පිටුද ඇතුළුව)',
 'searchprofile-advanced-tooltip' => 'අභිරුචි නාමඅවකාශයන්හි ගවේෂණය කරන්න',
-'search-result-size' => '$1 ({{PLURAL:$2|වචන 1 ක් |වචන $2 ක්}})',
+'search-result-size' => '$1 ({{PLURAL:$2|වචන 1 ක්|වචන $2 ක්}})',
 'search-result-category-size' => '{{PLURAL:$1|එක් සාමාජීකයෙන්|සාමාජීකයන් $1 ක්}} ({{PLURAL:$2|එක් උප-ප්‍රවර්ගයක්|උප-ප්‍රවර්ග $2 ක්}}, {{PLURAL:$3|එක් ගොනුවක්|ගොනු $3 ක්}})',
 'search-result-score' => 'අදාළතාව: $1%',
 'search-redirect' => '($1 යළි-යොමු කරන්න)',
@@ -1208,11 +1214,11 @@ $1",
 'search-relatedarticle' => 'සහසම්බන්ධිත',
 'mwsuggest-disable' => 'AJAX ඇඟවිලි අක්‍රීය කරන්න',
 'searcheverything-enable' => 'සියළු නාමඅවකාශයන්හි ගවේෂණය කරන්න',
-'searchrelated' => 'à·\83à·\84à·\83මà·\8aබනà·\8aධිත',
+'searchrelated' => 'à\86à·\81à·\8aâ\80\8dරිත',
 'searchall' => 'සියල්ල',
 'showingresults' => "#'''$2''' ගෙන් ආරම්භ කොට, {{PLURAL:$1|ප්‍රතිඵල '''1'''  ක් |ප්‍රතිඵල '''$1''' ක්}} දක්වා පහත පෙන්වා ඇත.",
 'showingresultsnum' => "#'''$2''' ගෙන් ආරම්භ කොට, {{PLURAL:$3|ප්‍රතිඵල '''1'''  ක් |ප්‍රතිඵල '''$3''' ක්}} පහත පෙන්වා ඇත.",
-'showingresultsheader' => "'''$4''' සඳහා {{PLURAL:$5| '''$3''' අතුරින් '''$1''' ප්‍රතිඵලය| '''$3''' අතුරින් '''$1 - $2''' ප්‍රතිඵලයන් }}",
+'showingresultsheader' => "'''$4''' සඳහා {{PLURAL:$5| '''$3''' අතුරින් '''$1''' ප්‍රතිඵලය| '''$3''' අතුරින් '''$1 - $2''' ප්‍රතිඵලයන්}}",
 'nonefound' => "'''සටහන''': පෙරනිමියෙන් ගවේෂණය වන්නේ සමහරක් නාමඅවකාශ පමණි.
 ඔබ‍ගේ විමසුමට ''all:'' උපසර්ගය යෙදීම මගින් සියළු අන්තර්ගතය ගවේෂණයට ඉඩ සැලසීම අත්හදා බලන්න (සාකච්ඡා පිටු, සැකිලි, ආදියද ඇතුළුව), නැතහොත්, උපසර්ගය ලෙස අපේක්‍ෂිත නාමඅවකාශය භාවිතා කරන්න.",
 'search-nonefound' => 'විමසුම හා ගැලපෙන ප්‍රතිඵල කිසිවක් නොමැත.',
@@ -1336,9 +1342,9 @@ HTML ටැගයන් පිරික්සන්න.',
 'email' => 'විද්‍යුත් තැපෑල',
 'prefs-help-realname' => 'සැබෑ නාමය හෙළි කිරීම වෛකල්පිකයි.
 ඔබ විසින් එය හෙළි කල හොත්, ඔබගේ කෘතීන් සඳහා ඔබහට කතෘ-බුහුමන් පිරිනැමීමට එය භාවිතා කරනු ඇත.',
-'prefs-help-email' => 'à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a à¶­à·\90පà·\91ලà·\8a à¶½à·\92පà·\92නය à¶\85තà·\8aâ\80\8dයà·\8fà·\80à·\81à·\8aâ\80\8dය à¶±à·\9cà·\80à·\9a, à¶\91à·\84à·\99තà·\8a à¶¸à·\94ර à¶´à¶¯ à¶´à·\8aâ\80\8dරතà·\8aâ\80\8dයà·\8fරමà·\8aභ à¶\9aà·\92රà·\93මට à¶\91ය à¶\85à·\80à·\81à·\8aâ\80\8dය à·\80à·\9a (à¶\94බà¶\9cà·\9a à¶¸à·\94ර à¶´à¶¯à¶º à¶\85මතà¶\9a à·\80à·\96 à·\80à·\92ට).',
+'prefs-help-email' => 'à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a à¶­à·\90පà·\90ලà·\8a à¶½à·\92පà·\92නය à¶\85තà·\8aâ\80\8dයà·\8fà·\80à·\81à·\8aâ\80\8dය à¶±à·\9cà·\80à·\9a, à¶\91à·\84à·\99තà·\8a à¶\94බà¶\9cà·\9a à¶¸à·\94ර à¶´à¶¯à¶º à¶\85මතà¶\9a à·\80à·\96 à·\80à·\92ටà·\99à¶\9a à¶\91ය à¶ºà¶½à·\92 à·\83à·\90à¶\9aà·\83à·\93මට à¶±à¶¸à·\8a à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a à¶½à·\92පà·\92නයà¶\9aà·\8a à¶¯à·\93 à¶­à·\92බà·\92ය à¶ºà·\94තà·\94ය.',
 'prefs-help-email-others' => 'ඔබගේ පරිශීලක හෝ පරිශීලක සාකච්ඡා පිටුවෙහි සබැඳියක් ඔස්සේ විද්‍යුත් තැපෑල මගින් අනෙක් අයට ඔබව සම්බන්ධ කර ගැනීම පිණිස තේරිමක් සිදු කල හැක.
-à¶\85නà·\99à¶\9aà·\94තà·\8a à¶´à¶»à·\92à·\81à·\93ලà¶\9aයනà·\8a à¶\94බà·\80 à¶\85මතන à·\80à·\92ට à¶\94බà¶\9cà·\9a à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a à¶­à·\90පà·\90ලà·\8a à¶½à·\92පà·\92නය à·\81à·\8aâ\80\8dරà·\90තà·\92මය à¶±à·\9cà·\80ේ.',
+à¶\85නà·\99à¶\9aà·\94තà·\8a à¶´à¶»à·\92à·\81à·\93ලà¶\9aයනà·\8a à¶\94බà·\80 à¶\85මතන à·\80à·\92ට à¶\94බà¶\9cà·\9a à·\80à·\92දà·\8aâ\80\8dයà·\94තà·\8a à¶­à·\90පà·\90ලà·\8a à¶½à·\92පà·\92නය à·\84à·\99ලà·\92දරà·\80à·\94 à¶±à·\9cà¶\9aà·\99රේ.',
 'prefs-help-email-required' => 'විද්‍යුත්-ලිපිනය අවශ්‍යයි.',
 'prefs-info' => 'මූලික තොරතුරු',
 'prefs-i18n' => 'ජාත්‍යන්තරකරණය',
@@ -1520,7 +1526,7 @@ HTML ටැගයන් පිරික්සන්න.',
 'recentchanges-label-minor' => 'මෙය සුළු සංස්කරණයකි',
 'recentchanges-label-bot' => 'මෙය රොබෝවක් විසින් කරන ලද සංස්කරණයකි',
 'recentchanges-label-unpatrolled' => 'මෙම සංස්කරණය තවම විමර්ශනය කර නොමැත',
-'rcnote' => "$4 දින, $5 වන තෙක්, අවසන් {{PLURAL:$2|දිනදී|දින '''$2''' තුලදී}} සිදුවී ඇති, {{PLURAL:$1| '''1''' ක් වෙනස|අවසන් වෙනස්වීම් '''$1'''  }} පහත දැක්වේ.",
+'rcnote' => "$4 දින, $5 වන තෙක්, අවසන් {{PLURAL:$2|දිනදී|දින '''$2''' තුලදී}} සිදුවී ඇති, {{PLURAL:$1| '''1''' ක් වෙනස|අවසන් වෙනස්වීම් '''$1'''}} පහත දැක්වේ.",
 'rcnotefrom' => "'''$2''' න් පසු සිදුවී ඇති වෙනස්කම් මෙහි පහත දැක්වේ ('''$1''' ක ප්‍රමාණයක උපරිමයක් පෙන්වා ඇත).",
 'rclistfrom' => '$1 සිට බලපැවැත්වෙන මෑත වෙනස්වීම් පෙන්වන්න',
 'rcshowhideminor' => 'සුළු සංස්කරණ $1',
@@ -1551,13 +1557,13 @@ HTML ටැගයන් පිරික්සන්න.',
 'recentchangeslinked-toolbox' => 'සහසම්බන්ධිත වෙනස්වීම්',
 'recentchangeslinked-title' => '"$1" ආශ්‍රිත වෙනස්කිරීම්',
 'recentchangeslinked-noresult' => 'සලකා බැලූ කාලසීමාවෙහිදී, සබැඳි පිටු වල කිසිදු වෙනසක් සිදුවී නොමැත.',
-'recentchangeslinked-summary' => "විශේෂී ලෙස නිරූපිත පිටුවකට (හෝ විශේෂි ලෙස නිරූපිත ප්‍රවර්ගයක සාමාජීකයන්ට) සබැඳි පිටුවල  මෑතදී සිදුවූ වෙනස්වීම් දැක්වෙන ලැයිස්තුවක් මෙහි දැක්වේ.
-[[Special:Watchlist|ඔබගේ  මුර-ලැයිස්තුවෙහි]] පිටු  '''තදකුරු''' වලින් දක්වා ඇත.",
+'recentchangeslinked-summary' => "විශේෂී ලෙස නිරූපිත පිටුවකට (හෝ විශේෂි ලෙස නිරූපිත ප්‍රවර්ගයක සාමාජීකයන්ට) සබැඳි පිටුවල මෑතදී සිදුවූ වෙනස්වීම් දැක්වෙන ලැයිස්තුවක් මෙහි දැක්වේ.
+[[Special:Watchlist|ඔබගේ  මුර-ලැයිස්තුවෙහි]] පිටු '''තදකුරු''' වලින් දක්වා ඇත.",
 'recentchangeslinked-page' => 'පිටු නාමය:',
 'recentchangeslinked-to' => 'ඒ වෙනුවට දී ඇති පිටුවට සබැඳෙන පිටුවල වෙනස්වීම්  පෙන්වන්න',
 
 # Upload
-'upload' => 'à¶\9cà·\9cනà·\94à·\80à¶\9aà·\8a à¶\8bඩà·\94à¶\9cත à¶\9aà·\92රà·\93ම',
+'upload' => 'à¶\9cà·\9cනà·\94à·\80à¶\9aà·\8a à¶\8bඩà·\94à¶\9cත à¶\9aරනà·\8aන',
 'uploadbtn' => 'ගොනුව උඩුගත කරන්න',
 'reuploaddesc' => 'උඩුගත කිරීම අත්හැරදමා උඩුගත කිරීම් ආකෘති පත්‍රය වෙත යන්න',
 'upload-tryagain' => 'වෙනස් කරන ලද ගොනු විස්තරය ඉදිරිපත් කරන්න',
@@ -1573,9 +1579,9 @@ HTML ටැගයන් පිරික්සන්න.',
 පෙරදී උඩුගතකෙරුණු ගොනු නැරඹුම හෝ ගවේෂණය සඳහා  [[Special:FileList|උඩුගතකෙරුණු ගොනු ලැයිස්තුව]] වෙත යන්න, (යළි)උඩුගතකෙරුම්ද  [[Special:Log/upload|උඩුගතකෙරුම් ලඝු-සටහන]] තුල සටහන් කර ඇති අතර, මකාදැමුම්  [[Special:Log/delete|මකාදැමුම් ලඝු-සටහන]] හි ඇත.
 
 ගොනුවක් පිටුවක බහාලීම සඳහා, පහත ආකාරයේ සබැඳියක් භාවිතා කරන්න:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' ගොනුවෙහි පරිපූර්ණ අනුවාදය භාවිතා කිරීමට
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' 'විකල්ප පෙළ' යන්න විස්තරය ලෙසින් තැබෙමින් වම් මායිමෙහි කොටුවක පික්සල 200 පළල ප්‍රවාචිතයක් භාවිතා කිරීමට
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' ගොනුව ප්‍රදර්ශනය නොකෙරෙමින්  ගොනුවට සෘජු ලෙස සබැඳීමට",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ගොනුවෙහි පරිපූර්ණ අනුවාදය භාවිතා කිරීමට
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 'විකල්ප පෙළ' යන්න විස්තරය ලෙසින් තැබෙමින් වම් මායිමෙහි කොටුවක පික්සල 200 පළල ප්‍රවාචිතයක් භාවිතා කිරීමට
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' ගොනුව ප්‍රදර්ශනය නොකෙරෙමින්  ගොනුවට සෘජු ලෙස සබැඳීමට",
 'upload-permitted' => 'අවසරලත් ගොනු වර්ගයන්: $1.',
 'upload-preferred' => 'අභිරුචි ගොනු වර්ගයන්: $1.',
 'upload-prohibited' => 'තහනම් ගොනු වර්ගයන්: $1.',
@@ -1623,20 +1629,20 @@ HTML ටැගයන් පිරික්සන්න.',
 මෙය සමහරවිට ගොනු  නාමයේ මුද්‍රණ දෝෂයක් නිසා විය හැක.
 ඔබට නිසැකවම මෙම ගොනුව උඩුගත කිරීමට අවශ්‍යයද යන්න පරික්‍ෂා කර බලන්න.',
 'windows-nonascii-filename' => 'විශේෂ අක්ෂර සහිත ගොනු නාම සදහා මෙම විකිය සහය නොදක්වයි.',
-'fileexists' => "මෙම නම සහිත ගොනුවක් දැනටමත් පවතියි, මෙය වෙනස් කල යුතු බවට ඔබට නිසැක නොවේ නම්, කරුණාකර '''<tt>[[:$1]]</tt>''' පරික්ෂා කර බලන්න .
-[[$1|thumb]]",
-'filepageexists' => "මෙම ගොනුව සඳහා විස්තර පිටුව දැනටමත් '''<tt>[[:$1]]</tt>''' හි තනා ඇති නමුත්, මෙම නම ඇති කිසිදු ගොනුවක් දැනට නොපවතියි.
+'fileexists' => 'මෙම නම සහිත ගොනුවක් දැනටමත් පවතියි, මෙය වෙනස් කල යුතු බවට ඔබට නිසැක නොවේ නම්, කරුණාකර <strong>[[:$1]]</strong> පරික්ෂා කර බලන්න .
+[[$1|thumb]]',
+'filepageexists' => 'මෙම ගොනුව සඳහා විස්තර පිටුව දැනටමත් <strong>[[:$1]]</strong> හි තනා ඇති නමුත්, මෙම නම ඇති කිසිදු ගොනුවක් දැනට නොපවතියි.
 ඔබ විසින් ඇතුලත් කෙරෙන සාරාංශය විස්තර පිටුවෙහි දිස් නොවනු ඇත.
 සාරාංශය එහි  දිස්කෙරුමට,  ඔබ විසින් එය හස්තීය ලෙස සංස්කරණය කෙරුම සිදුකල යුතු වේ.
-[[$1|thumb]]",
-'fileexists-extension' => "එක්වැනි නමක් ඇති ගොනුවක් පවතී: [[$2|thumb]]
-* උඩුගත කෙරෙන ගොනුවේ නම: '''<tt>[[:$1]]</tt>'''
-* පවතින ගොනුවේ නම: '''<tt>[[:$2]]</tt>'''
-කරුණාකර වෙනත් නමක් තෝරාගන්න.",
+[[$1|thumb]]',
+'fileexists-extension' => 'එක්වැනි නමක් ඇති ගොනුවක් පවතී: [[$2|thumb]]
+* උඩුගත කෙරෙන ගොනුවේ නම: <strong>[[:$1]]</strong>
+* පවතින ගොනුවේ නම: <strong>[[:$2]]</strong>
+කරුණාකර වෙනත් නමක් තෝරාගන්න.',
 'fileexists-thumbnail-yes' => "ගොනුව, කුඩා ප්‍රමාණයේ රූපයක් බව පෙනී යයි ''(සිඟිති-රූපය)''. [[$1|thumb]]
-කරුණාකර '''<tt>[[:$1]]</tt>''' ගොනුව පරික්‍ෂා කර බලන්න.
+කරුණාකර <strong>[[:$1]]</strong> ගොනුව පරික්‍ෂා කර බලන්න.
 පරික්‍ෂා කර බැලූ ගොනුවෙහි අඩංගු වන්නේ මුලික ප්‍රමාණයෙහි රූපයම නම් අමතර සිඟිති-රූපයක් උඩුගත කිරීම අවශ්‍ය නොවේ.",
-'file-thumbnail-no' => "ගොනු නම '''<tt>$1</tt>''' යන්නෙන් ආරම්භ වේ.
+'file-thumbnail-no' => "ගොනු නම <strong>$1</strong> යන්නෙන් ආරම්භ වේ.
 එය කුඩාකල ප්‍රමාණයෙහි රූපයක් බව පෙනී යයි  ''(සිඟිති-රූපය)''.
 පූර්ණ විසර්ජනය සහිත මෙම රූපය ඔබ සතු වෙයි නම් මෙය උඩුගත කරන්න, නැතහොත් ගොනු නාමය වෙනස් කරන්න.",
 'fileexists-forbidden' => 'මෙම නම ඇති ගොනුවක් දැනටමත් පවතින අතර, එය උඩින් ලීවීම සිදුකල නොහැක.
@@ -1725,7 +1731,10 @@ URLහි නීතික බව හා ප්‍රවේශ්‍ය බව 
 'backend-fail-writetemp' => 'තාවකාලික ගොනුව වෙත ලිවිය නොහැක.',
 'backend-fail-closetemp' => 'තාවකාලික ගොනුව වැසීම කල නොහැක.',
 'backend-fail-read' => '$1 ගොනුව කියවිය නොහැක.',
-'backend-fail-create' => '$1 ගොනුව තැනිය නොහැක.',
+'backend-fail-create' => '$1 ගොනුව ලිවිය නොහැකි විය.',
+'backend-fail-maxsize' => '{{PLURAL:$2|බයිට එකකට|බයිට $2 කට}} වඩා විහාල බැවින්  $1 ගොනුව ලිවිය නොහැකි විය.',
+'backend-fail-readonly' => 'ගබඩා බැක්එන්ඩය "$1" දැනට කියවීම-පමණක් සඳහා වෙයි. දක්වා ඇති හේතුව නම්: "\'\'$2\'\'"',
+'backend-fail-usable' => 'අවසර ප්‍රමාණවත් නොවීම නිසාවෙන් හෝ නාමාවලී/බහාලුම් නොමැති වීම නිසාවෙන් $1 ගොනුව ලිවිය නොහැකි විය.',
 
 # Lock manager
 'lockmanager-notlocked' => '"$1" හී අගුළු ඇරිය නොහැක; එය අගුළු දමාද නොමැත.',
@@ -1884,7 +1893,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 # MIME search
 'mimesearch' => 'MIME ගවේෂණය',
 'mimesearch-summary' => 'ගොනු, එහි MIME-වර්ගය අනුව පෙරහනය කිරීමට මෙම පිටුව අවකාශ සලසයි.
-ප්‍රදානය: අන්කර්ගතවර්ගය/උපවර්ගය, නිද. <tt>රූපය/jpeg</tt>.',
+ප්‍රදානය: අන්කර්ගතවර්ගය/උපවර්ගය, නිද. <code>රූපය/jpeg</code>.',
 'mimetype' => 'MIME වර්ගය:',
 'download' => 'බාගතකිරීම',
 
@@ -2055,6 +2064,10 @@ When filtered by user, only files where that user uploaded the most recent versi
 'allpagesbadtitle' => 'සපයා ඇති පිටු ශීර්ෂය අනීතික විය නැතහොත් එහි අන්තර්-භාෂා හෝ අන්තර් විකී උපසර්ගයක් අඩංගු විය.
 ශීර්ෂයන්හි අඩංගු විය නොහැකි අක්ෂර එකක් හෝ කිහිපයක් හෝ එහි අඩංගු වී තිබිය හැක.',
 'allpages-bad-ns' => '{{SITENAME}} හි  "$1" නාමඅවකාශය නොමැත.',
+'allpages-hide-redirects' => 'යළි-යොමු සඟවන්න',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'නවතමය නරඹන්න.',
 
 # Special:Categories
 'categories' => 'ප්‍රවර්ග',
@@ -2077,7 +2090,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 'linksearch-ok' => 'ගවේෂණය',
 'linksearch-text' => '"*.wikipedia.org" වැනි ආදේශක භාවිතා කල හැක.
 අඩුම තරමින් උසස්-මට්ටමේ වසමක් අවශ්‍යයි, නිදසුනක් ලෙස "*.org".<br />
-සහය දක්වන ප්‍රෝටෝකොලයන්: <tt>$1</tt> (ඔබේ සෙවුමෙහි මේවා කිසිවක් නොයොදන්න).',
+සහය දක්වන ප්‍රෝටෝකොලයන්: <code>$1</code> (ඔබේ සෙවුමෙහි මේවා කිසිවක් නොයොදන්න).',
 'linksearch-line' => '$2 වෙතින් $1 සබැඳිණි',
 'linksearch-error' => 'ආදේශක  පෙනීසිටිය හැක්කේ සත්කාරකනාමය ආරම්භයෙහි පමණයි.',
 
@@ -2174,7 +2187,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 'notanarticle' => 'අන්තර්ගත පිටුවක් නොවේ',
 'notvisiblerev' => 'සංශෝධනය මකාදමා ඇත',
 'watchnochange' => 'ඔබ විසින් මුරකෙරෙන කිසිදු අයිතමයක් දක්වා ඇති කාල සීමාවෙහිදී  සංස්කරණයට භාජනය වී නොමැත.',
-'watchlist-details' => 'සාකච්ඡා පිටු නොගිණුනු කල, ඔබගේ මුර-ලැයිස්තුවෙහි {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} ඇත.',
+'watchlist-details' => 'සාකච්ඡා පිටු නොගිණුනු කල, ඔබගේ මුර ලැයිස්තුවෙහි {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} ඇත.',
 'wlheader-enotif' => '* විද්‍යුත්-තැපැල් දැනුම්දීම සක්‍රීය කෙරිණි.',
 'wlheader-showupdated' => "* ඔබ විසින් ඒවාට අවසන් වරට පිවිසුනු පසුව වෙනස්කෙරුනු පිටු  '''තදකුරු''' වලින් පෙන්වා ඇත",
 'watchmethod-recent' => 'මුර-කෙරෙන පිටු සඳහා මෑත සංස්කරණයන් පරික්‍ෂා කරමින්',
@@ -2182,7 +2195,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 'watchlistcontains' => 'ඔබගේ මුර-ලැයිස්තුවෙහි  {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} අඩංගුය.',
 'iteminvalidname' => "'$1' අයිතමය පිළිබඳ ගැටළුවක් ඇත, අනීතික නමකි...",
 'wlnote' => "පහත දැක්වෙන්නේ $3, $4 මෙන්, අවසන් {{PLURAL:$2|පැය|පැය '''$2''' }} තුලදී සිදු කෙරී ඇති {{PLURAL:$1|අවසන් වෙනස්වීම්යි |අවසන් වෙනස්වීම්  '''$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
@@ -2445,7 +2458,7 @@ $1',
 'sp-contributions-submit' => 'සොයන්න',
 
 # What links here
-'whatlinkshere' => 'සබැඳි පිටු',
+'whatlinkshere' => 'මà·\99තනට à·\83බà·\90ඳà·\92 à¶´à·\92ටà·\94',
 'whatlinkshere-title' => '"$1" වෙත සබැ‍ඳෙන පිටු',
 'whatlinkshere-page' => 'පිටුව:',
 'linkshere' => "ඉදිරියෙහි දැක්වෙන පිටු, '''[[:$1]]''' වෙත සබැඳෙයි:",
@@ -2831,16 +2844,15 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 'tooltip-pt-preferences' => 'මගේ අභිරුචි',
 'tooltip-pt-watchlist' => 'වෙනස්වීම් සිදුවී තිබේදැයි යන්න පිලිබඳව ඔබගේ විමසුමට ලක්ව ඇති පිටු ලැයිස්තුව',
 'tooltip-pt-mycontris' => 'ඔබගේ දායකත්වයන් ලැයිස්තුව‍',
-'tooltip-pt-login' => 'පà·\8aâ\80\8dරà·\80à·\92à·\83à·\93ම à·\80ඩà·\8f à¶ºà·\9dà¶\9cà·\8aâ\80\8dයà·\80à·\9a. à¶±à¶¸à·\94තà·\8a à¶\91ය à¶\85නà·\92à·\80à·\8fරà·\8aය à¶±à·\90ත.',
+'tooltip-pt-login' => 'පà·\92à·\80à·\92à·\83à·\93ම à·\80ඩà·\8f à¶ºà·\9dà¶\9cà·\8aâ\80\8dය à·\80à·\9a. à¶±à¶¸à·\94තà·\8a, à¶\91ය à¶\85නà·\92à·\80à·\8fරà·\8aය à¶±à·\90ත',
 'tooltip-pt-anonlogin' => 'එය අවශ්‍ය‍යෙන් කල යුත්තක් ‍නොවුනද, ප්‍රවිෂ්ට වීම සඳහා ඔබ ධෛර්යමත් කරනු ලැබේ.',
 'tooltip-pt-logout' => 'නික්මීම',
 'tooltip-ca-talk' => 'අන්තර්ගත පිටුව පිළිබඳ සාකච්ඡාව',
-'tooltip-ca-edit' => 'ඔබ‍ට මෙම පිටුව සංස්කරණය කල හැක.
-සුරැකීමට පෙර කරුණාකර පෙරදසුන බොත්තම භාවිතා කරන්න.',
+'tooltip-ca-edit' => 'ඔබ‍ට මෙම පිටුව සංස්කරණය කල හැක. සුරැකීමට පෙර කරුණාකර පෙරදසුන බොත්තම භාවිතා කරන්න',
 'tooltip-ca-addsection' => 'නව ඡේදයක් අරඹන්න',
 'tooltip-ca-viewsource' => 'මෙම පිටුව ආරක්‍ෂණය කොට ඇත.
 ඔබට එහි මූලාශ්‍රය නැරඹිය හැක.',
-'tooltip-ca-history' => 'මà·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶´à·\99ර à\85නà·\94à·\80à·\8fදයනà·\8a.',
+'tooltip-ca-history' => 'මà·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶´à·\99ර à·\83à¶\82à·\81à·\9dධනයනà·\8a',
 'tooltip-ca-protect' => 'මෙම පිටුව ආරක්‍ෂණය කරන්න',
 'tooltip-ca-unprotect' => 'මෙම පිටුවෙහි ආරක්ෂණ තත්වය වෙනස් කරන්න',
 'tooltip-ca-delete' => 'මේ පිටුව මකන්න',
@@ -2857,7 +2869,7 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 'tooltip-n-portal' => 'ව්‍යාපෘති පිළිබඳ, ඔබට කල හැක්කේ කුමක්ද, තොරතුරු සොයාගත හැක්කේ කොතැනද',
 'tooltip-n-currentevents' => 'කාලීන සිදුවීම් පිළිබඳ පසුබිම් තොරතුරු සොයා දැනගන්න',
 'tooltip-n-recentchanges' => 'විකියෙහි මෑත වෙනස්කිරීම් ලැයිස්තුවක්',
-'tooltip-n-randompage' => 'à¶\85à·\84ඹà·\94 à¶´à·\92ටà·\94à·\80à¶\9aà·\8a à¶½à·\9dඩà·\8aකරන්න',
+'tooltip-n-randompage' => 'à¶\85à·\84ඹà·\94 à¶´à·\92ටà·\94à·\80à¶\9aà·\8a à¶´à·\96රණය කරන්න',
 'tooltip-n-help' => 'සොයා දැනගත හැකි තැන',
 'tooltip-t-whatlinkshere' => 'මෙය හා සබැ‍ඳෙන සියළු විකි පිටු ලැයිස්තුව',
 'tooltip-t-recentchangeslinked' => 'මෙම පිටුව හා සබැඳි පිටුවල ‍නව වෙනස්වීම්',
@@ -2946,15 +2958,10 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 # Info page
 'pageinfo-title' => '"$1" සඳහා තොරතුරු',
 'pageinfo-header-edits' => 'සංස්කරණ',
-'pageinfo-header-watchlist' => 'මුර-ලැයිස්තුව',
-'pageinfo-header-views' => 'නැරඹුම්',
-'pageinfo-subjectpage' => 'පිටුව',
-'pageinfo-talkpage' => 'සාකච්ඡා පිටුව',
+'pageinfo-views' => 'නැරඹුම් සංඛ්‍යාව',
 'pageinfo-watchers' => 'මුරකරන්නන් සංඛ්‍යාව',
 'pageinfo-edits' => 'සංස්කරණයන් සංඛ්‍යාව',
 'pageinfo-authors' => 'ප්‍රභින්න කර්තෘවරුන් සංඛ්‍යාව',
-'pageinfo-views' => 'නැරඹුම් සංඛ්‍යාව',
-'pageinfo-viewsperedit' => 'එක් සංස්කරණයකට නැරඹුම් ගණන',
 
 # Patrolling
 'markaspatrolleddiff' => 'පරික්ෂාකර බැලූ ලෙස සලකුණු කරන්න',
@@ -2996,7 +3003,7 @@ $1',
 'file-info' => 'ගොනු විශාලත්වය: $1, MIME වර්ගය: $2',
 'file-info-size' => '$1 × $2 පික්සල, ගොනු විශාලත්වය: $3, MIME ශෛලිය: $4',
 'file-info-size-pages' => '$1 × $2 පික්සල, ගොනු තරම: $3, MIME වර්ගය: $4, $5 {{PLURAL:$5|පිටුව|පිටු}}',
-'file-nohires' => 'මෙයට ඉහල විසර්ජනයක් (resolution) දක්වා එළඹිය නොහැක.',
+'file-nohires' => 'මෙයට ඉහල විසර්ජනයක් දක්වා එළඹිය නොහැක.',
 'svg-long-desc' => 'SVG ගොනුව, නාමමාත්‍රිකව $1 × $2 පික්සල්, ගොනු විශාලත්වය: $3',
 'show-big-image' => 'පූර්ණ විභේදනය',
 'show-big-image-preview' => 'මෙම පෙරදසුනෙහි තරම: $1.',
@@ -3079,7 +3086,7 @@ Variants for Chinese language
 'variantname-tg' => 'tg',
 
 # Metadata
-'metadata' => 'පාරදත්ත (Metadata)',
+'metadata' => 'පාරදත්ත',
 'metadata-help' => 'සමහරවිට ඩිජිටල් කැමරාවක් හෝ ස්කෑනරයක් හෝ භාවිතයෙන්, නිමැවා හෝ සංඛ්‍යාංකකරණය (ඩිජිටල්කරණය) කොට එක් කල , අමතර තොරතුරු මෙම ගොනුවේ අඩංගුය.
 ගොනුව මුලින්ම පැවැති තත්ත්වයෙහි සිට විකරණය කොට තිබේ නම්, සමහරක් තොරතුරු විකරිත ගොනුව පූර්ණ වශයෙන් පිළිඹිමු නොකරනු ඇත.',
 'metadata-expand' => 'විස්තීරණය කරන ලද විස්තර පෙන්වන්න',
@@ -3087,14 +3094,14 @@ Variants for Chinese language
 'metadata-fields' => 'Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.
 Others will be hidden by default.
 * make
-* model
+* මාදිලිය
 * datetimeoriginal
 * exposuretime
 * fnumber
 * isospeedratings
 * focallength
-* artist
-* copyright
+* කලාකරු
+* ප්‍රකාශන හිමිකම
 * imagedescription
 * gpslatitude
 * gpslongitude
@@ -3676,8 +3683,8 @@ This confirmation code will expire at $4.',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'අදාල වෙනස්වීම් නරඹන්න',
-'watchlisttools-edit' => 'මුර-ලැයිස්තුව නැරඹීම හා සංස්කරණය',
-'watchlisttools-raw' => 'නොනිමි මුර-ලැයිස්තුව සංස්කරණය කරන්න',
+'watchlisttools-edit' => 'මුර ලැයිස්තුව නැරඹීම හා සංස්කරණය',
+'watchlisttools-raw' => 'නොනිමි මුර ලැයිස්තුව සංස්කරණය කරන්න',
 
 # Iranian month names
 'iranian-calendar-m1' => 'ෆාර්වාදීන්',
@@ -3743,7 +3750,7 @@ This confirmation code will expire at $4.',
 
 # Core parser functions
 'unknown_extension_tag' => 'අඥාත ප්‍රසර්ජන ටැගය "$1"',
-'duplicate-defaultsort' => 'අවවාදයයි: "$2" පෙරනිමි සුබෙදුම් යතුර විසින් ‍පූර්ව පෙරනිමි සුබෙදුම් යතුර  වූ  "$1" අතික්‍රමණය කරයි.',
+'duplicate-defaultsort' => '\'\'\'අවවාදයයි:\'\'\' "$2" පෙරනිමි සුබෙදුම් යතුර විසින් ‍පූර්ව පෙරනිමි සුබෙදුම් යතුර වූ "$1" අතික්‍රමණය කරයි.',
 
 # Special:Version
 'version' => 'අනුවාදය',
@@ -3773,6 +3780,9 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'version-software' => 'ස්ථාපිත මෘදුකාංග',
 'version-software-product' => 'නිෂ්පාදනය',
 'version-software-version' => 'අනුවාදය',
+'version-entrypoints' => 'නිවේශන ලක්ෂ්‍ය URL',
+'version-entrypoints-header-entrypoint' => 'නිවේශන ලක්ෂ්‍යය',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'ගොනු පෙත',
@@ -3924,10 +3934,12 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'api-error-duplicate-archive-popup-title' => 'දැනටමත් මකා දමා ඇති එක වගේ {{PLURAL:$1|ගොනුවක්|ගොනු}}',
 'api-error-duplicate-popup-title' => 'අනුපිටපත් {{PLURAL:$1|ගොනු|ගොනුව}}',
 'api-error-empty-file' => 'ඔබ ඉදිරිපත්කල ගොනුව හිස් එකකි.',
+'api-error-emptypage' => 'නවතම එකක් තනමින්, හිස් පිටුවලට ඉඩ නොදේ.',
 'api-error-fetchfileerror' => 'අභ්‍යන්තර දෝෂය: ගොනුව පැමිණවීම අතරතුරදී කුමක්දෝ වැරදුණා.',
 'api-error-file-too-large' => 'ඔබ විසින් යොමන ලද ගොනුව පමණට වඩා විශෘලය.',
 'api-error-filename-tooshort' => 'ගොනු නාමය කෙටි වැඩියි.',
 'api-error-filetype-banned' => 'මෙම වර්ගයේ ගොනු තහනම් කර ඇත.',
+'api-error-filetype-banned-type' => '$1 යනු {{PLURAL:$4|අවසරලත් ගොනු වර්ගයක්|අවසරලත් ගොනු වර්ගයන්}} නොවේ. අවසරලත්  {{PLURAL:$3|ගොනු වර්ගය|ගොනු වර්ගයන්}} වන්නේ  $2.',
 'api-error-filetype-missing' => 'මෙම ගොනුවට විස්තීරණය මග හරි ඇත.',
 'api-error-hookaborted' => 'ඔබ සිදු කරන්නට ගිය වෙනස්කම විස්තීර්ණ කොක්කක් මඟින් රෝධනය කරන ලදී.',
 'api-error-http' => 'අභ්‍යන්තර දෝෂය: සර්වරය වෙත සම්බන්ධ විය නොහැක.',
@@ -3952,4 +3964,15 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'api-error-uploaddisabled' => 'මෙම විකියෙහි උඩුගතකිරීම අක්‍රිය කොට ඇත.',
 'api-error-verification-error' => 'මෙම ගොනුව පළුදුවී හෝ එයට වැරදි විස්තිර්ණයක් (extension) ඇතුවා වියහැක.',
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|තත්පර|තත්පර}} $1 ක්',
+'duration-minutes' => '{{PLURAL:$1|මිනිත්තු|මිනිත්තු}} $1 ක්',
+'duration-hours' => '{{PLURAL:$1|පැය|පැය}} $1 ක්',
+'duration-days' => '{{PLURAL:$1|දින|දින}} $1 ක්',
+'duration-weeks' => '{{PLURAL: $1|සති|සති}} $1 ක්',
+'duration-years' => '{{PLURAL:$1|වසර|වසර}} $1 ක්',
+'duration-decades' => '{{PLURAL:$1|දශක|දශක}} $1 ක්',
+'duration-centuries' => '{{PLURAL:$1|ශතවර්ෂ|ශතවර්ෂ}} $1 ක්',
+'duration-millennia' => '{{PLURAL:$1|සහස‍්‍රවර්ෂ|සහස‍්‍රවර්ෂ}} $1 ක්',
+
 );
index 0111218..50e5730 100644 (file)
@@ -179,69 +179,69 @@ $bookstoreList = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#presmeruj', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__BEZOBSAHU__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__BEZGALÉRIE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__VYNÚTIŤOBSAH__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__OBSAH__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__NEUPRAVOVAŤSEKCIE__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'AKTUÁLNYMESIAC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'NÁZOVAKTUÁLNEHOMESIACA', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'NÁZOVAKTUÁLNEHOMESIACAGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'NÁZOVAKTUÁLNEHOMESIACASKRATKA', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'AKTUÁLNYDEŇ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'AKTUÁLNYDEŇ2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NÁZOVAKTUÁLNEHODŇA', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'AKTUÁLNYROK', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'AKTUÁLNYČAS', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'AKTUÁLNAHODINA', 'CURRENTHOUR' ),
-       'numberofpages'           => array( '1', 'POČETSTRÁNOK', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'POČETČLÁNKOV', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'POČETSÚBOROV', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'POČETPOUŽÍVATEĽOV', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'POČETÚPRAV', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'NÁZOVSTRÁNKY', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'NÁZOVSTRÁNKYE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'MENNÝPRIESTOR', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'MENNÝPRIESTORE', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'DISKUSNÝPRIESTOR', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'DISKUSNÝPRIESTORE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'PRIESTORČLÁNKOV', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'PRIESTORČLÁNKOVE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'PLNÝNÁZOVSTRÁNKY', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'PLNÝNÁZOVSTRÁNKYE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'NÁZOVPODSTRÁNKY', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'NÁZOVPODSTRÁNKYE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'NÁZOVZÁKLADNEJSTRÁNKY', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'NÁZOVZÁKLADNEJSTRÁNKYE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'NÁZOVDISKUSNEJSTRÁNKY', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'NÁZOVDISKUSNEJSTRÁNKYE', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'NÁZOVČLÁNKU', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'NÁZOVČLÁNKUE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'SPRÁVA:', 'MSG:' ),
-       'subst'                   => array( '0', 'NAHR:', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'náhľad', 'náhľadobrázka', 'thumbnail', 'thumb' ),
-       'img_right'               => array( '1', 'vpravo', 'right' ),
-       'img_left'                => array( '1', 'vľavo', 'left' ),
-       'img_none'                => array( '1', 'žiadny', 'none' ),
-       'img_width'               => array( '1', '$1bod', '$1px' ),
-       'img_center'              => array( '1', 'stred', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'rám', 'framed', 'enframed', 'frame' ),
-       'img_border'              => array( '1', 'okraj', 'border' ),
-       'sitename'                => array( '1', 'NÁZOVLOKALITY', 'SITENAME' ),
-       'ns'                      => array( '0', 'MP:', 'NS:' ),
-       'servername'              => array( '0', 'NÁZOVSERVERA', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'CESTAKUSKRIPTU', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
-       'currentweek'             => array( '1', 'AKTUÁLNYTÝŽDEŇ', 'CURRENTWEEK' ),
-       'currentversion'          => array( '1', 'AKTUÁLNAVERZIA', 'CURRENTVERSION' ),
-       'language'                => array( '0', '#JAZYK:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'JAZYKOBSAHU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'numberofadmins'          => array( '1', 'POČETSPRÁVCOV', 'NUMBEROFADMINS' ),
-       'filepath'                => array( '0', 'CESTAKSÚBORU:', 'FILEPATH:' ),
-       'hiddencat'               => array( '1', '__SKRYTÁKATEGÓRIA__', '__SKRYTÁKAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'STRÁNOKVKATEGÓRII', 'STRÁNOKVKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'VEĽKOSŤSTRÁNKY', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#presmeruj', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__BEZOBSAHU__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__BEZGALÉRIE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__VYNÚTIŤOBSAH__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__OBSAH__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__NEUPRAVOVAŤSEKCIE__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'AKTUÁLNYMESIAC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'NÁZOVAKTUÁLNEHOMESIACA', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'NÁZOVAKTUÁLNEHOMESIACAGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'NÁZOVAKTUÁLNEHOMESIACASKRATKA', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'AKTUÁLNYDEŇ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'AKTUÁLNYDEŇ2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NÁZOVAKTUÁLNEHODŇA', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'AKTUÁLNYROK', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'AKTUÁLNYČAS', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'AKTUÁLNAHODINA', 'CURRENTHOUR' ),
+       'numberofpages'             => array( '1', 'POČETSTRÁNOK', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'POČETČLÁNKOV', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'POČETSÚBOROV', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'POČETPOUŽÍVATEĽOV', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'POČETÚPRAV', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'NÁZOVSTRÁNKY', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'NÁZOVSTRÁNKYE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'MENNÝPRIESTOR', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'MENNÝPRIESTORE', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'DISKUSNÝPRIESTOR', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'DISKUSNÝPRIESTORE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'PRIESTORČLÁNKOV', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'PRIESTORČLÁNKOVE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'PLNÝNÁZOVSTRÁNKY', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'PLNÝNÁZOVSTRÁNKYE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'NÁZOVPODSTRÁNKY', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'NÁZOVPODSTRÁNKYE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'NÁZOVZÁKLADNEJSTRÁNKY', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'NÁZOVZÁKLADNEJSTRÁNKYE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'NÁZOVDISKUSNEJSTRÁNKY', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'NÁZOVDISKUSNEJSTRÁNKYE', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'NÁZOVČLÁNKU', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'NÁZOVČLÁNKUE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'SPRÁVA:', 'MSG:' ),
+       'subst'                     => array( '0', 'NAHR:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'náhľad', 'náhľadobrázka', 'thumbnail', 'thumb' ),
+       'img_right'                 => array( '1', 'vpravo', 'right' ),
+       'img_left'                  => array( '1', 'vľavo', 'left' ),
+       'img_none'                  => array( '1', 'žiadny', 'none' ),
+       'img_width'                 => array( '1', '$1bod', '$1px' ),
+       'img_center'                => array( '1', 'stred', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'rám', 'framed', 'enframed', 'frame' ),
+       'img_border'                => array( '1', 'okraj', 'border' ),
+       'sitename'                  => array( '1', 'NÁZOVLOKALITY', 'SITENAME' ),
+       'ns'                        => array( '0', 'MP:', 'NS:' ),
+       'servername'                => array( '0', 'NÁZOVSERVERA', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'CESTAKUSKRIPTU', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+       'currentweek'               => array( '1', 'AKTUÁLNYTÝŽDEŇ', 'CURRENTWEEK' ),
+       'currentversion'            => array( '1', 'AKTUÁLNAVERZIA', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#JAZYK:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'JAZYKOBSAHU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'numberofadmins'            => array( '1', 'POČETSPRÁVCOV', 'NUMBEROFADMINS' ),
+       'filepath'                  => array( '0', 'CESTAKSÚBORU:', 'FILEPATH:' ),
+       'hiddencat'                 => array( '1', '__SKRYTÁKATEGÓRIA__', '__SKRYTÁKAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'STRÁNOKVKATEGÓRII', 'STRÁNOKVKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'VEĽKOSŤSTRÁNKY', 'PAGESIZE' ),
 );
 
 $namespaceNames = array(
@@ -288,7 +288,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Skryť strážené úpravy v Posledných úpravách',
 'tog-newpageshidepatrolled' => 'Skryť strážené stránky zo zoznamu nových stránok',
 'tog-extendwatchlist' => 'Rozšíriť zoznam sledovaných, aby zobrazoval všetky zmeny, nie len posledné',
-'tog-usenewrc' => 'Použiť rozšírené zobrazenie posledných úprav (vyžaduje JavaScript)',
+'tog-usenewrc' => 'Zoskupiť zmeny v posledných úpravách a zoznamoch sledovaných (vyžaduje JavaScript)',
 'tog-numberheadings' => 'Automaticky číslovať nadpisy',
 'tog-showtoolbar' => 'Zobraziť panel nástrojov úprav',
 'tog-editondblclick' => 'Upravovať stránky po dvojitom kliknutí (JavaScript)',
@@ -296,17 +296,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Umožniť upravovať sekcie po kliknutí pravým tlačidlom na nadpisy sekcií (JavaScript)',
 'tog-showtoc' => 'Zobrazovať obsah (pre stránky s viac ako 3 nadpismi)',
 'tog-rememberpassword' => 'Zapamätať si prihlásenie na tomto počítači (najviac $1 {{PLURAL:$1|deň|dni|dní}})',
-'tog-watchcreations' => 'Pridávať stránky, ktoré vytvorím, automaticky medzi sledované',
-'tog-watchdefault' => 'Pridávať stránky, ktoré upravujem, automaticky medzi sledované',
-'tog-watchmoves' => 'Pridávať stránky, ktoré presuniem, do môjho zoznamu sledovaných',
-'tog-watchdeletion' => 'Pridávať stránky, ktoré zmažem, do môjho zoznamu sledovaných',
+'tog-watchcreations' => 'Pridávať stránky, ktoré vytvorím a súbory, ktoré nahrám medzi sledované',
+'tog-watchdefault' => 'Pridávať stránky a súbory, ktoré upravím medzi sledované',
+'tog-watchmoves' => 'Pridávať stránky a súbory, ktoré presuniem medzi sledované',
+'tog-watchdeletion' => 'Pridávať stránky a súbory, ktoré zmažem medzi sledované',
 'tog-minordefault' => 'Označovať všetky zmeny štandardne ako drobné',
 'tog-previewontop' => 'Zobrazovať náhľad pred textovým poľom úprav, nie až za ním',
 'tog-previewonfirst' => 'Zobraziť náhľad pred prvou úpravou',
 'tog-nocache' => 'Zakázať ukladanie stránok do vyrovnávacej pamäte prehliadača',
-'tog-enotifwatchlistpages' => 'Upozorniť ma emailom, keď sa zmení stránka z môjho zoznamu sledovaných',
+'tog-enotifwatchlistpages' => 'Upozorniť ma emailom, keď sa zmení stránka alebo súbor z môjho zoznamu sledovaných',
 'tog-enotifusertalkpages' => 'Upozorniť ma emailom po zmene mojej používateľskej diskusnej stránky',
-'tog-enotifminoredits' => 'Upozorniť ma emailom aj na drobné úpravy stránok',
+'tog-enotifminoredits' => 'Upozorniť ma emailom aj na drobné úpravy stránok a súborov',
 'tog-enotifrevealaddr' => 'Zobraziť moju emailovú adresu v emailoch s upozorneniami',
 'tog-shownumberswatching' => 'Zobraziť počet používateľov sledujúcich stránku',
 'tog-oldsig' => 'Súčasný podpis:',
@@ -322,7 +322,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Skryť úpravy prihlásených používateľov zo zoznamu sledovaných stránok',
 'tog-watchlisthideanons' => 'Skryť úpravy anonymných používateľov zo zoznamu sledovaných stránok',
 'tog-watchlisthidepatrolled' => 'Skryť strážené úpravy Zozname sledovaných stránok',
-'tog-nolangconversion' => 'Vypnúť konverziu variantov',
 'tog-ccmeonemails' => 'Posielať mi kópie mojich emailov, ktoré pošlem ostatným používateľom',
 'tog-diffonly' => 'Nezobrazovať obsah stránky pod rozdielmi',
 'tog-showhiddencats' => 'Zobraziť skryté kategórie',
@@ -616,7 +615,7 @@ Databáza vrátila chybu „$3: $4“.',
 Správca, ktorý nariadil uzamknutie, uvádza tento dôvod: $1',
 'missing-article' => 'Text stránky s názvom „$1” $2, ktorú ste požadovali, nebol nájdený v databáze.
 
-To sa zvyčajne stane, keď kliknete na zastaralý odkaz na rozdiel alebo do histórie stránky, ktorá bola zmazaná.
+To sa zvyčajne stane, keď kliknete na zastaraný odkaz na rozdiel alebo do histórie stránky, ktorá bola zmazaná.
 
 Ak to tak nie je, je možné, že ste našli chybu v softvéri.
 Oznámte to prosím [[Special:ListUsers/sysop|správcovi]] a uveďte URL.',
@@ -639,6 +638,8 @@ Oznámte to prosím [[Special:ListUsers/sysop|správcovi]] a uveďte URL.',
 'cannotdelete' => 'Nebolo možné zmazať stránku alebo súbor „$1“.
 Možno ju už zmazal nieto iný.',
 'cannotdelete-title' => 'Nemôžete zmazať stránku "$1"',
+'delete-hook-aborted' => 'Zmazanie zrušila prídavná funkcia (prípojný bod syntaktického analyzátora).
+Neudala vysvetlenie.',
 'badtitle' => 'Neplatný nadpis',
 'badtitletext' => 'Požadovaný nadpis bol neplatný, nezadaný, alebo nesprávne odkazovaný z inej jazykovej verzie {{GRAMMAR:genitív|{{SITENAME}}}}. Mohol tiež obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v nadpisoch.',
 'perfcached' => 'Nasledujúce údaje pochádzajú z vyrovnávacej pamäte a nemusia byť úplne aktuálne. Vo vyrovnávacej pamäti {{PLURAL:$1|je dostupný|sú dostupné|je dostupných}} najviac {{PLURAL:$1|jeden výsledok|$1 výsledky|$1 výsledkov}}.',
@@ -670,6 +671,8 @@ Udaný dôvod: ''$2''.",
 Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
 'invalidtitle-knownnamespace' => 'Neplatný názov s menným priestorom „$2“ a textom „$3“',
 'invalidtitle-unknownnamespace' => 'Neplatný názov s neznámym číslom menného priestoru „$1“ a textom „$2“',
+'exception-nologin' => 'Nie ste prihlásený',
+'exception-nologin-text' => 'Táto stránka alebo operácia vyžaduje, aby ste boli na tejto wiki prihlásení.',
 
 # Virus scanner
 'virus-badscanner' => "Chybná konfigurácia: neznámy antivírus: ''$1''",
@@ -691,6 +694,7 @@ Nezabudnite si nastaviť svoje [[Special:Preferences|používateľské nastaveni
 'remembermypassword' => 'Pamätať si prihlásenie na tomto počítači (naviac $1 {{PLURAL:$1|deň|dni|dní}})',
 '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.',
 'externaldberror' => 'Buď nastala chyba externej autentifikačnej databázy alebo vám nie je povolené aktualizovať váš externý účet.',
 'login' => 'Prihlásiť',
 'nav-login-createaccount' => 'Vytvorenie konta / prihlásenie',
@@ -943,6 +947,10 @@ alebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} upravovať túto stránku]</span
 'noarticletext-nopermission' => 'Táto stránka momentálne neobsahuje žiadny text.
 Môžete [[Special:Search/{{PAGENAME}}|hľadať názov tejto stránky]] v texte iných stránok
 alebo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} si pozrieť súvisiace záznamy]</span>.',
+'missing-revision' => 'Revízia #$1 stránky s názvom „{{PAGENAME}}“ neexistuje.
+
+Pravdepodobne ste nasledovali zastaraný odkaz na historickú verziu stránky, ktorá bola medzičasom odstránená.
+Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zázname zmazaní].',
 'userpage-userdoesnotexist' => 'Používateľský účet „<nowiki>$1</nowiki>“ nie je registrovaný. Prosím, skontrolujte, či naozaj chcete vytvoriť/upravovať túto stránku.',
 'userpage-userdoesnotexist-view' => 'Používateľský účet „$1“ nie je registrovaný.',
 'blocked-notice-logextract' => 'Tento používateľ je momentálne zablokovaný.
@@ -1252,6 +1260,10 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
 'editundo' => 'vrátiť',
 'diff-multi' => '{{PLURAL:$1|Jedna medziľahlá revízia|$1 medziľahlé revízie|$1 medziľahlých revízií}} od {{PLURAL:$2|jedného používateľa|$2 používateľov}} {{PLURAL:$1|nie je zobrazená|nie sú zobrazené|nie je zobrazených}}.',
 'diff-multi-manyusers' => '({{PLURAL:$1|$1 medziľahlá revízia|$1 medziľahlé revízie|$1 medziľahlých revízií}} od viac ako {{PLURAL:$2|$2 používateľa|$2 používateľov}} {{PLURAL:$1|nie je zobrazená|nie sú zobrazené|nie je zobrazených}})',
+'difference-missing-revision' => '{{PLURAL:$2|$2 revízia|$2 revízie|$2 revízií}} pre požadovaný rozdiel ($1) {{PLURAL:$2|neexistuje|neexistujú|neexistuje}}.
+
+Pravdepodobne ste nasledovali zastaraný odkaz na rozdiel revízií, z ktorých niektorá bola medzičasom odstránená.
+Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zázname zmazaní].',
 
 # Search results
 'searchresults' => 'Výsledky vyhľadávania',
@@ -1516,6 +1528,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'right-writeapi' => 'Použitie API na zápis',
 'right-delete' => 'Mazať stránky',
 'right-bigdelete' => 'Mazať stránky s veľkou históriou',
+'right-deletelogentry' => 'Odstrániť a obnoviť špecifické položky',
 'right-deleterevision' => 'Mazať a obnovovať konkrétne revízie stránok',
 'right-deletedhistory' => 'Zobrazovať zmazané položky histórie bez ich plného textu',
 'right-deletedtext' => 'Zobrazovať zmazané texty a zmeny medzi zmazanými verziami',
@@ -1707,20 +1720,20 @@ Vizuálny prehľad nájdete v [[Special:NewFiles|galérii novo nahraných súbor
 'largefileserver' => 'Tento súbor je väčší ako je možné nahrať na server (z dôvodu obmedzenia veľkosti súboru v konfigurácii servera).',
 'emptyfile' => 'Zdá sa, že súbor, ktorý ste nahrali je prázdny. Mohlo sa stať, že ste urobili v názve súboru preklep. Prosím, skontrolujte, či skutočne chcete nahrať tento súbor.',
 'windows-nonascii-filename' => 'Táto wiki nepodporuje názvy súborov so špeciálnymi znakmi.',
-'fileexists' => "Súbor s týmto názvom už existuje, prosím skontrolujte '''<tt>[[:$1]]</tt>''' ak nie ste si istý, či ho chcete zmeniť.
-[[$1|thumb]]",
-'filepageexists' => "Popisná stránka pre tento súbor už bola vytvorená na '''<tt>[[:$1]]</tt>''', ale žiadny súbor s týmto názvom momentálne neexistuje.
+'fileexists' => 'Súbor s týmto názvom už existuje, prosím skontrolujte <strong>[[:$1]]</strong> ak nie ste si istý, či ho chcete zmeniť.
+[[$1|thumb]]',
+'filepageexists' => 'Popisná stránka pre tento súbor už bola vytvorená na <strong>[[:$1]]</strong>, ale žiadny súbor s týmto názvom momentálne neexistuje.
 Zadané zhrnutie sa neobjaví na popisnej stránke.
 Aby sa tam zhrnutie objavilo, budete potrebné ho manuálne upraviť.
-[[$1|thumb]]",
-'fileexists-extension' => "Súbor s podobným názvom už existuje: [[$2|thumb]]
-* Názov súboru, ktorý nahrávate: '''<tt>[[:$1]]</tt>'''
-* Názov existujúceho súboru: '''<tt>[[:$2]]</tt>'''
-Prosím, vyberte preň iný názov.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Súbor s podobným názvom už existuje: [[$2|thumb]]
+* Názov súboru, ktorý nahrávate: <strong>[[:$1]]</strong>
+* Názov existujúceho súboru: <strong>[[:$2]]</strong>
+Prosím, vyberte preň iný názov.',
 'fileexists-thumbnail-yes' => "Zdá sa, že súbor je obrázkom redukovanej veľkosti ''(náhľadom)''. [[$1|thumb]]
-Prosím, skontolujte súbor '''<tt>[[:$1]]</tt>'''.
+Prosím, skontolujte súbor <strong>[[:$1]]</strong>.
 Ak je kontrolovaný súbor rovnaký obrázok v pôvodnej veľkosti, nie je potrebné nahrávať ďalší náhľad.",
-'file-thumbnail-no' => "Názov súboru začína '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Názov súboru začína <strong>$1</strong>.
 Zdá sa, že je to obrázok redukovanej veľkosti ''(náhľad)''.
 Ak máte tento obrázok v plnom rozlíšení, nahrajte ho, inak prosím zmeňte názov.",
 'fileexists-forbidden' => 'Súbor s týmto názvom už existuje a nie je možné ho prepísať.
@@ -1829,6 +1842,7 @@ Ak problém pretrváva, kontaktujte [[Special:ListUsers/sysop|správcu systému]
 'lockmanager-fail-releaselock' => 'Nepodarilo sa uvoľniť zámok „$1“.',
 'lockmanager-fail-db-bucket' => 'Nepodarilo sa kontaktovať dostatok databáz zámkov v buckete $1.',
 'lockmanager-fail-db-release' => 'Nepodarilo sa uvoľniť zámky na databáze $1.',
+'lockmanager-fail-svr-acquire' => 'Nepodarilo sa získať zámky na serveri $1.',
 'lockmanager-fail-svr-release' => 'Nepodarilo sa uvoľniť zámky na serveri $1.',
 
 # ZipDirectoryReader
@@ -1975,7 +1989,7 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 
 # MIME search
 'mimesearch' => 'MIME vyhľadávanie',
-'mimesearch-summary' => 'Táto stránka umožňuje filtovanie súborov podľa MIME typu. Vstup: typobsahu/podtyp, napr. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Táto stránka umožňuje filtovanie súborov podľa MIME typu. Vstup: typobsahu/podtyp, napr. <code>image/jpeg</code>.',
 'mimetype' => 'MIME typ:',
 'download' => 'stiahnuť',
 
@@ -2023,7 +2037,7 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'disambiguationspage' => 'Template:Rozlišovacia stránka',
 'disambiguations-text' => "Nasledovné stránky odkazujú na '''rozlišovaciu stránku'''.
 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]]",
+Stránka sa považuje za rozlišovaciu, keď používa šablónu, na ktorú odkazuje [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dvojité presmerovania',
 'doubleredirectstext' => 'Táto stránka obsahuje zoznam stránok, ktoré presmerovávajú na iné presmerovacie stránky.
@@ -2130,6 +2144,7 @@ na ktorý/-ého chcete aplikovať túto funkciu.',
 Môžete zúžiť rozsah, ak zvolíte typ záznamu, používateľské meno alebo dotyčnú stránku (záleží na veľkosti písmen).',
 'logempty' => 'V zázname neboli nájdené zodpovedajúce položky.',
 'log-title-wildcard' => 'Hľadať názvy začínajúce týmto textom',
+'showhideselectedlogentries' => 'Zobraziť/skryť vybraté položky záznamu',
 
 # Special:AllPages
 'allpages' => 'Všetky stránky',
@@ -2175,7 +2190,7 @@ Pozri aj [[Special:WantedCategories|žiadané kategórie]].',
 '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: <tt>$1</tt> (nepridávajte ich do hľadania).',
+Podporované protokoly: <code>$1</code> (nepridávajte ich do hľadania).',
 'linksearch-line' => 'Na $1 odkazuje $2',
 'linksearch-error' => 'Zástupné znaky je možné použiť iba na začiatku názvu domény.',
 
@@ -2357,9 +2372,11 @@ Na $2 nájdete zoznam posledných zmazaní.',
 'delete-warning-toobig' => 'Táto stránka má veľkú históriu úprav, viac ako $1 {{PLURAL:$1|revíziu|revízie|revízií}}. Jej zmazanie by mohlo narušiť databázové operácie {{GRAMMAR:genitív|{{SITENAME}}}}; postupujte opatrne.',
 
 # Rollback
-'rollback' => 'Rollback úprav',
-'rollback_short' => 'Rollback',
+'rollback' => 'Vrátiť späť úpravy',
+'rollback_short' => 'Vrátiť',
 'rollbacklink' => 'rollback',
+'rollbacklinkcount' => 'vrátenie $1 {{PLURAL:$1|úpravy|úprav}}',
+'rollbacklinkcount-morethan' => 'vrátiť viac ako $1 {{PLURAL:$1|úpravu|úprav}}',
 'rollbackfailed' => 'Rollback neúspešný',
 'cantrollback' => 'Nie je možné úpravu vrátiť späť, posledný autor je jediný autor tejto stránky.',
 'alreadyrolled' => 'Nemožno vrátiť späť poslednú úpravu [[:$1]] od [[User:$2|$2]] ([[User talk:$2|Diskusia]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); niekto iný buď upravoval stránku alebo už vrátil úpravy späť.
@@ -3042,19 +3059,15 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 'spambot_username' => 'MediaWiki čistenie spamu',
 'spam_reverting' => 'Vraciam poslednú verziu, ktorá neobsahuje odkazy na $1',
 'spam_blanking' => 'Všetky revízie obsahovali odkaz na $1, odstraňujem obsah',
+'spam_deleting' => 'Všetky revízie obsahovali odkaz na $1, odstraňuje sa',
 
 # Info page
 'pageinfo-title' => 'Informácie o „$1“',
 'pageinfo-header-edits' => 'Úpravy',
-'pageinfo-header-watchlist' => 'Sledované stránky',
-'pageinfo-header-views' => 'Zobrazení',
-'pageinfo-subjectpage' => 'Stránka',
-'pageinfo-talkpage' => 'Diskusná stránka',
+'pageinfo-views' => 'Počet zobrazení',
 'pageinfo-watchers' => 'Počet sledovateľov',
 'pageinfo-edits' => 'Počet úprav',
 'pageinfo-authors' => 'Počet rôznych autorov',
-'pageinfo-views' => 'Počet zobrazení',
-'pageinfo-viewsperedit' => 'Zobrazení na úpravu',
 
 # Skin names
 'skinname-standard' => 'Klasický',
@@ -3923,9 +3936,12 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 'api-error-empty-file' => 'Súbor, ktorý ste poslali bol prázdny.',
 'api-error-emptypage' => 'Vytváranie nových, prázdnych stránok nie je dovolené.',
 'api-error-fetchfileerror' => 'Vnútorná chyba: Niečo pokazilo počas sťahovania súboru.',
+'api-error-fileexists-forbidden' => 'Súbor s názvom „$1“ už existuje a nie je možné prepísať ho.',
+'api-error-fileexists-shared-forbidden' => 'Súbor s názvom „$1“ už neexistuje v repozitári zdieľaných súborov a nie je možné prepísať ho.',
 'api-error-file-too-large' => 'Súbor, ktorý ste poslali bol príliš veľký.',
 'api-error-filename-tooshort' => 'Názov súboru je príliš krátky.',
 'api-error-filetype-banned' => 'Tento typ súboru je zakázaný.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|nie je povolený typ súboru|nie sú povolené typy súboru}}. {{PLURAL:$3|Povolený typ súborov je|Povolené typy súborov sú}} $2.',
 'api-error-filetype-missing' => 'Súboru chýba prípona.',
 'api-error-hookaborted' => 'Zmena, ktorú ste sa pokúsili vykonať bola zrušená prípojným bodom rozšírenia.',
 'api-error-http' => 'Vnútorná chyba: Nepodarilo sa pripojiť k serveru.',
index 0d61ed7..7f173aa 100644 (file)
@@ -113,44 +113,44 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#PREUSMERITEV', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__BREZKAZALAVSEBINE__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__BREZGALERIJE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__VSILIKAZALOVSEBINE__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__POGLAVJE__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BREZUREJANJARAZDELKOV__', '__NOEDITSECTION__' ),
-       'img_thumbnail'           => array( '1', 'sličica', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'sličica=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'desno', 'right' ),
-       'img_left'                => array( '1', 'levo', 'left' ),
-       'img_none'                => array( '1', 'brez', 'none' ),
-       'img_width'               => array( '1', '$1_pik', '$1px' ),
-       'img_center'              => array( '1', 'sredina', 'sredinsko', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'okvir', 'okvirjeno', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'brezokvirja', 'frameless' ),
-       'img_page'                => array( '1', 'stran=$1', 'm_stran $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'zgorajdesno', 'zgorajdesno=$1', 'zgorajdesno $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'obroba', 'border' ),
-       'img_sub'                 => array( '1', 'pod', 'podpisano', 'sub' ),
-       'img_super'               => array( '1', 'nad', 'nadpisano', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'vrh', 'top' ),
-       'img_text_top'            => array( '1', 'vrh-besedila', 'text-top' ),
-       'img_bottom'              => array( '1', 'dno', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'dno-besedila', 'text-bottom' ),
-       'sitename'                => array( '1', 'IMESTRANI', 'SITENAME' ),
-       'server'                  => array( '0', 'STREZNIK', 'SERVER' ),
-       'grammar'                 => array( '0', 'SKLON:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'SPOL:', 'GENDER:' ),
-       'plural'                  => array( '0', 'MNOZINA:', 'PLURAL:' ),
-       'language'                => array( '0', '#JEZIK:', '#LANGUAGE:' ),
-       'tag'                     => array( '0', 'oznaka', 'tag' ),
-       'hiddencat'               => array( '1', '__SKRITAKATEGORIJA__', '__HIDDENCAT__' ),
-       'index'                   => array( '1', '__KAZALO__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__BREZKAZALA__', '__NOINDEX__' ),
-       'staticredirect'          => array( '1', '__STATICNAPREUSMERITEV__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'STOPNJAZASCITE', 'PROTECTIONLEVEL' ),
-       'url_path'                => array( '0', 'POT', 'PATH' ),
-       'url_query'               => array( '0', 'POIZVEDBA', 'QUERY' ),
+       'redirect'                  => array( '0', '#PREUSMERITEV', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__BREZKAZALAVSEBINE__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__BREZGALERIJE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__VSILIKAZALOVSEBINE__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__POGLAVJE__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BREZUREJANJARAZDELKOV__', '__NOEDITSECTION__' ),
+       'img_thumbnail'             => array( '1', 'sličica', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'sličica=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'desno', 'right' ),
+       'img_left'                  => array( '1', 'levo', 'left' ),
+       'img_none'                  => array( '1', 'brez', 'none' ),
+       'img_width'                 => array( '1', '$1_pik', '$1px' ),
+       'img_center'                => array( '1', 'sredina', 'sredinsko', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'okvir', 'okvirjeno', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'brezokvirja', 'frameless' ),
+       'img_page'                  => array( '1', 'stran=$1', 'm_stran $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'zgorajdesno', 'zgorajdesno=$1', 'zgorajdesno $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'obroba', 'border' ),
+       'img_sub'                   => array( '1', 'pod', 'podpisano', 'sub' ),
+       'img_super'                 => array( '1', 'nad', 'nadpisano', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'vrh', 'top' ),
+       'img_text_top'              => array( '1', 'vrh-besedila', 'text-top' ),
+       'img_bottom'                => array( '1', 'dno', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'dno-besedila', 'text-bottom' ),
+       'sitename'                  => array( '1', 'IMESTRANI', 'SITENAME' ),
+       'server'                    => array( '0', 'STREZNIK', 'SERVER' ),
+       'grammar'                   => array( '0', 'SKLON:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'SPOL:', 'GENDER:' ),
+       'plural'                    => array( '0', 'MNOZINA:', 'PLURAL:' ),
+       'language'                  => array( '0', '#JEZIK:', '#LANGUAGE:' ),
+       'tag'                       => array( '0', 'oznaka', 'tag' ),
+       'hiddencat'                 => array( '1', '__SKRITAKATEGORIJA__', '__HIDDENCAT__' ),
+       'index'                     => array( '1', '__KAZALO__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__BREZKAZALA__', '__NOINDEX__' ),
+       'staticredirect'            => array( '1', '__STATICNAPREUSMERITEV__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'STOPNJAZASCITE', 'PROTECTIONLEVEL' ),
+       'url_path'                  => array( '0', 'POT', 'PATH' ),
+       'url_query'                 => array( '0', 'POIZVEDBA', 'QUERY' ),
 );
 
 $linkTrail = '/^([a-zčćđžš]+)(.*)$/sDu';
@@ -191,7 +191,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Skrij pregledana urejanja v zadnjih spremembah',
 'tog-newpageshidepatrolled' => 'Skrij pregledane strani iz seznama novih strani',
 'tog-extendwatchlist' => 'Razširi spisek nadzorov, da bo prikazoval vse spremembe, ne le najnovejše',
-'tog-usenewrc' => 'Izboljšane zadnje spremembe (zahteva JavaScript)',
+'tog-usenewrc' => 'Združi spremembe posamezne strani na zadnjih spremembah in spisku nadzorov (zahteva JavaScript)',
 'tog-numberheadings' => 'Samodejno številči poglavja',
 'tog-showtoolbar' => 'Prikaži urejevalno orodno vrstico',
 'tog-editondblclick' => 'Omogoči urejanje strani z dvojnim klikom (zahteva JavaScript)',
@@ -199,17 +199,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Omogoči urejanje razdelkov z desnim klikanjem njihovih naslovov (zahteva JavaScript)',
 'tog-showtoc' => 'Prikaži vsebino (strani z več kot tremi naslovi)',
 'tog-rememberpassword' => 'Zapomni si me v tem brskalniku (za največ $1 {{PLURAL:$1|dan|dneva|dni}})',
-'tog-watchcreations' => 'Vse ustvarjene strani dodaj na spisek nadzorov',
-'tog-watchdefault' => 'Dodaj na spisek nadzorov vse članke, ki sem jih ustvaril/-a ali spremenil/-a',
-'tog-watchmoves' => 'Dodaj strani, ki jih premaknem, na moj spisek nadzorov',
-'tog-watchdeletion' => 'Dodaj strani, ki jih izbrišem, na moj spisek nadzorov',
+'tog-watchcreations' => 'Vse ustvarjene strani in moje naložene datoteke dodaj na spisek nadzorov',
+'tog-watchdefault' => 'Dodaj na spisek nadzorov vse članke in datoteke, ki sem jih spremenil/-a',
+'tog-watchmoves' => 'Dodaj strani in datoteke, ki jih premaknem, na moj spisek nadzorov',
+'tog-watchdeletion' => 'Dodaj strani in datoteke, ki jih izbrišem, na moj spisek nadzorov',
 'tog-minordefault' => 'Vsa urejanja označi kot manjša',
 'tog-previewontop' => 'Prikaži predogled pred urejevalnim poljem in ne za njim',
 'tog-previewonfirst' => 'Ob začetku urejanja prikaži predogled',
 'tog-nocache' => 'Onemogoči predpomnenje strani v brskalniku',
-'tog-enotifwatchlistpages' => 'Ob spremembah strani mi pošlji e-pošto',
+'tog-enotifwatchlistpages' => 'Ob spremembah strani ali datotek mi pošlji e-pošto',
 'tog-enotifusertalkpages' => 'Pošlji e-pošto ob spremembah moje pogovorne strani',
-'tog-enotifminoredits' => 'Pošlji e-pošto tudi za manjše spremembe strani',
+'tog-enotifminoredits' => 'Pošlji e-pošto tudi za manjše spremembe strani in datotek',
 'tog-enotifrevealaddr' => 'V sporočilih z obvestili o spremembah razkrij moj e-poštni naslov',
 'tog-shownumberswatching' => 'Prikaži število uporabnikov, ki spremljajo temo',
 'tog-oldsig' => 'Obstoječi podpis:',
@@ -448,6 +448,7 @@ $1',
 'youhavenewmessages' => 'Imate $1 ($2)',
 'newmessageslink' => 'nova sporočila',
 'newmessagesdifflink' => 'zadnja sprememba',
+'newmessageslinkplural' => '{{PLURAL:$1|novo sporočilo|nova sporočila}}',
 'youhavenewmessagesmulti' => 'Na $1 imate novo sporočilo',
 'editsection' => 'uredi',
 'editold' => 'spremeni',
@@ -541,6 +542,8 @@ Prosimo, da o tem obvestite [[Special:ListUsers/sysop|administratorja]] (ne poza
 'cannotdelete' => 'Strani ali datoteke »$1« ni mogoče izbrisati.
 Morda jo je izbrisal že kdo drug.',
 'cannotdelete-title' => 'Ne morem izbrisati strani »$1«',
+'delete-hook-aborted' => 'Zanka je prekinila brisanje.
+Vrnila ni nobene razlage.',
 'badtitle' => 'Nepravilen naslov',
 'badtitletext' => 'Navedeni naslov strani je neveljaven, prazen, napačno povezan k drugim jezikom oziroma wikiprojektom.
 Morda vsebuje enega ali več nepodprtih znakov.',
@@ -576,6 +579,8 @@ Podani razlog je bil »''$2''«.",
 Administrator, ki ga je zaklenil, je podal naslednje pojasnilo: »$3«.',
 'invalidtitle-knownnamespace' => 'Neveljaven naslov z imenskim prostorom »$2« in besedilom »$3«',
 'invalidtitle-unknownnamespace' => 'Neveljaven naslov z neznano številko imenskega prostora $1 in besedilom »$2«',
+'exception-nologin' => 'Niste prijavljeni',
+'exception-nologin-text' => 'Izbrana stran ali dejanje zahteva, da ste na tem wikiju prijavljeni.',
 
 # Virus scanner
 'virus-badscanner' => "Slaba konfiguracija: neznani virus skener: ''$1''",
@@ -596,6 +601,7 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 'remembermypassword' => 'Zapomni si me na tem računalniku (za največ $1 {{PLURAL:$1|dan|dneva|dni}})',
 'securelogin-stick-https' => 'Po prijavi ostani povezan preko HTTPS',
 'yourdomainname' => 'Domena',
+'password-change-forbidden' => 'Na tem wikiju ne morete spreminjati gesel.',
 'externaldberror' => 'Pri potrjevanju istovetnosti je prišlo do notranje napake ali pa za osveževanje zunanjega računa nimate dovoljenja.',
 'login' => 'Prijava',
 'nav-login-createaccount' => 'Prijavite se / registrirajte se',
@@ -1437,6 +1443,7 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'right-writeapi' => 'Uporaba napisanega API-ja',
 'right-delete' => 'Brisanje strani',
 'right-bigdelete' => 'Brisanje strani z obsežno zgodovino',
+'right-deletelogentry' => 'Brisanje in obnavljanje izbranih dnevniških vnosov',
 'right-deleterevision' => 'Brisanje in obnova posebnih redakcij strani',
 'right-deletedhistory' => 'Ogled zgodovine brisanja, brez besedila izbrisanih strani',
 'right-deletedtext' => 'Ogled izbrisanega besedila in primerjava med izbrisanimi redakcijami',
@@ -1581,9 +1588,9 @@ Dnevnik brisanja in prestavitev za to stran sta navedena tukaj:",
 Za ogled ali iskanje že naloženih pojdite na [[Special:FileList|seznam naloženih datotek]]; ponovna nalaganja so zabeležena tudi v [[Special:Log/upload|dnevniku nalaganja]], izbrisi pa v [[Special:Log/delete|dnevniku brisanja]].
 
 Datoteko lahko na želeno stran vključite na naslednje načine:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></tt>''' (polna velikost)
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg|200px|thumb|left|opisno besedilo]]</nowiki></tt>''' (slika pomanjšana na 200 slikovnih pik širine, uokvirjena, z levo poravnavo in opisom »opisno besedilo«)
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></tt>''' (neposredna povezava z datoteko)",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' (polna velikost)
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg|200px|thumb|left|opisno besedilo]]</nowiki></code>''' (slika pomanjšana na 200 slikovnih pik širine, uokvirjena, z levo poravnavo in opisom »opisno besedilo«)
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' (neposredna povezava z datoteko)",
 'upload-permitted' => 'Dovoljene vrste datotek: $1.',
 'upload-preferred' => 'Priporočene vrste datotek: $1.',
 'upload-prohibited' => 'Prepovedane vrste datotek: $1.',
@@ -1629,20 +1636,20 @@ Za grafični pogled obiščite [[Special:NewFiles|galerijo novih datotek]].',
 Do tega bi lahko prišlo zaradi tipkarske napake v imenu.
 Ali datoteko resnično želite naložiti?',
 'windows-nonascii-filename' => 'Ta wiki ne podpira imen datotek s posebnimi znaki.',
-'fileexists' => "Datoteka s tem imenom že obstaja. Preden jo povozite, preverite stran '''<tt>[[:$1]]</tt>'''.
-[[$1|thumb]]",
-'filepageexists' => "Opisna stran za to datoteko je bila že ustvarjena na '''<tt>[[:$1]]</tt>''', vendar datoteka s tem imenom trenutno ne obstaja.
+'fileexists' => 'Datoteka s tem imenom že obstaja. Preden jo povozite, preverite stran <strong>[[:$1]]</strong>.
+[[$1|thumb]]',
+'filepageexists' => 'Opisna stran za to datoteko je bila že ustvarjena na <strong>[[:$1]]</strong>, vendar datoteka s tem imenom trenutno ne obstaja.
 Povzetek, ki ste ga vnesli, se ne bo prikazal na opisni strani.
 Da tam prikažete povzetek, morate stran urediti ročno.
-[[$1|thumb]]",
-'fileexists-extension' => "Datoteka s podobnim imenom že obstaja: [[$2|thumb]]
-* Ime naložene datoteke: '''<tt>[[:$1]]</tt>'''
-* Ime obstoječe datoteke: '''<tt>[[:$2]]</tt>'''
-Prosimo, izberite drugo ime.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Datoteka s podobnim imenom že obstaja: [[$2|thumb]]
+* Ime naložene datoteke: <strong>[[:$1]]</strong>
+* Ime obstoječe datoteke: <strong>[[:$2]]</strong>
+Prosimo, izberite drugo ime.',
 'fileexists-thumbnail-yes' => "Kot izgleda, je ta slika pomanjšana ''(thumbnail)''. [[$1|thumb]]
-Prosimo, preverite datoteko '''<tt>[[:$1]]</tt>'''.
+Prosimo, preverite datoteko <strong>[[:$1]]</strong>.
 Če je preverjena datoteka enaka kot ta, ki jo nalage, ni potrebno nalagati še dodatne sličice.",
-'file-thumbnail-no' => "Ime datoteke se začne z '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Ime datoteke se začne z <strong>$1</strong>.
 Izgleda, da je to pomanjšana slika ''(thumbnail)''.
 Če imate sliko polne resolucije, jo naložite, drugače spremenite ime datoteke.",
 'fileexists-forbidden' => 'Datoteka s tem imenom že obstaja in je ni mogoče prepisati.
@@ -1757,6 +1764,7 @@ Prosimo, preverite veljavnost in dostopnost naslova URL ter poskusite ponovno.
 'lockmanager-fail-releaselock' => 'Ne morem sprostiti zaklepa »$1«.',
 'lockmanager-fail-db-bucket' => 'Ne morem kontaktirati zadostnega števila zaklenitvenih zbirk podatkov v vedru $1.',
 'lockmanager-fail-db-release' => 'Ne morem sprostiti zaklepov zbirke podatkov $1.',
+'lockmanager-fail-svr-acquire' => 'Ne morem pridobiti zaklepov na strežniku $1.',
 'lockmanager-fail-svr-release' => 'Ne morem sprostiti zaklepov strežnika $1.',
 
 # ZipDirectoryReader
@@ -1911,7 +1919,7 @@ Morda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datote
 # MIME search
 'mimesearch' => 'Iskanje po vrsti MIME',
 'mimesearch-summary' => 'Ta stran omogoča filtriranje datotek po njihovi vrsti MIME.
-Vnesite: vrstavsebine/podvrsta, npr. <tt>image/jpeg</tt>.',
+Vnesite: vrstavsebine/podvrsta, npr. <code>image/jpeg</code>.',
 'mimetype' => 'Vrsta MIME:',
 'download' => 'prenesi',
 
@@ -1958,9 +1966,9 @@ Preden jih izbrišete, preverite še druge povezave nanje.',
 
 'disambiguations' => 'Strani s povezavami na razločitvene strani',
 'disambiguationspage' => 'Template:Razločitev',
-'disambiguations-text' => "Naslednje strani se povezujejo na '''razločitvene strani'''.
-Namesto tega bi se naj povezovale na primerno temo.<br />
-Stran se obravnava kot razločitvena, če uporablja predloge povezane iz [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Naslednje strani vsebujejo vsaj eno povezavo na '''razločitvene strani'''.
+Namesto tega bi morda bilo bolje, da se povezujejo na primernejše strani.<br />
+Stran se obravnava kot razločitvena, če uporablja predloge, povezane z [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dvojne preusmeritve',
 'doubleredirectstext' => 'Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.
@@ -2113,7 +2121,7 @@ Glej tudi [[Special:WantedCategories|želene kategorije]].',
 'linksearch-ok' => 'Išči',
 'linksearch-text' => 'Nadomestne znake, kot je »*.wikipedia.org«, lahko uporabljate.
 Zahtevana je vsaj najvišja domena, na primer »*.org«.<br />
-Podprti protokoli: <tt>$1</tt> (teh ne dodajte v svoje iskanje).',
+Podprti protokoli: <code>$1</code> (teh ne dodajte v svoje iskanje).',
 'linksearch-line' => '$1 povezano iz $2',
 'linksearch-error' => 'Jokerji se lahko pojavijo le na začetku gostiteljskega imena.',
 
@@ -2305,6 +2313,8 @@ nadaljujte s previdnostjo.',
 'rollback' => 'Vrni spremembe',
 'rollback_short' => 'Vrni',
 'rollbacklink' => 'vrni',
+'rollbacklinkcount' => 'vrni $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}',
+'rollbacklinkcount-morethan' => 'vrni več kot $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}',
 'rollbackfailed' => 'Vrnitev ni uspela',
 'cantrollback' => 'Urejanja ne morem vrniti; zadnji urejevalec je hkrati edini.',
 'alreadyrolled' => 'Zadnje spremembe [[:$1]] uporabnika [[User:$2|$2]] ([[User talk:$2|pogovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ne morem vrniti;
@@ -2961,15 +2971,10 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 # Info page
 'pageinfo-title' => 'Informacije o »$1«',
 'pageinfo-header-edits' => 'Urejanja',
-'pageinfo-header-watchlist' => 'Spisek nadzorov',
-'pageinfo-header-views' => 'Ogledi',
-'pageinfo-subjectpage' => 'Stran',
-'pageinfo-talkpage' => 'Pogovorna stran',
+'pageinfo-views' => 'Število ogledov',
 'pageinfo-watchers' => 'Število spremljevalcev',
 'pageinfo-edits' => 'Število urejanj',
 'pageinfo-authors' => 'Število različnih avtorjev',
-'pageinfo-views' => 'Število ogledov',
-'pageinfo-viewsperedit' => 'Razmerje med ogledi in urejanji',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označite kot nadzorovano',
@@ -3701,7 +3706,7 @@ Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
 * <span class="mw-specialpagecached">Predpomnjene posebne strani (morda so zastarele).</span>',
 'specialpages-group-maintenance' => 'Vzdrževalna poročila',
 'specialpages-group-other' => 'Ostale posebne strani',
-'specialpages-group-login' => 'Prijavite se / registrirajte se',
+'specialpages-group-login' => 'Prijavite se / ustvarite račun',
 'specialpages-group-changes' => 'Zadnje spremembe in dnevniki',
 'specialpages-group-media' => 'Poročila o datotekah in nalaganja',
 'specialpages-group-users' => 'Uporabniki in pravice',
@@ -3836,9 +3841,12 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 'api-error-empty-file' => 'Poslana datoteka je prazna.',
 'api-error-emptypage' => 'Ustvarjanje novih, praznih strani ni dovoljeno.',
 'api-error-fetchfileerror' => 'Notranja napaka: pri pridobivanju datoteke je nekaj šlo narobe.',
+'api-error-fileexists-forbidden' => 'Datoteka »$1« že obstaja in je ni mogoče prepisati.',
+'api-error-fileexists-shared-forbidden' => 'Datoteka »$1« že obstaja v skupnem skladišču datotek in je ni mogoče prepisati.',
 'api-error-file-too-large' => 'Poslana datoteka je prevelika.',
 'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
 'api-error-filetype-banned' => 'Ta vrsta datoteke je prepovedana.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|ni dovoljena datotečna vrsta|nista dovoljeni datotečni vrsti|niso dovoljene datotečne vrste}}. {{PLURAL:$3|Dovoljena datotečna vrsta je|Dovoljeni datotečni vrsti sta|Dovoljene datotečne vrste so}} $2.',
 'api-error-filetype-missing' => 'Datoteki manjka končnica.',
 'api-error-hookaborted' => 'Spremembo, ki ste jo poskušali narediti, je prekinila razširitev.',
 'api-error-http' => 'Notranja napaka: ni mogoče vzpostaviti povezave s strežnikom.',
index ae7c2e5..440dfd9 100644 (file)
@@ -1076,10 +1076,10 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'large-file' => 'De Dateigriße sullte noach Meeglichkeet $1 ne ieberschreita. Diese Datei ies $2 gruß.',
 'largefileserver' => 'De Datei ies grißer ols de vum Server eengestallte Maximalgriße.',
 'emptyfile' => 'De huchgeloadene Datei ies laar. Dar Grund koan a Tippfahler eim Dateinoama sei. Bitte kontrolliere, ob du de Datei wirklich huchloada wielst.',
-'fileexists' => "Anne Datei miet diesem Noama existiert bereits.
-Bitte priefe '''<tt>[[:$1]]</tt>''', wenn du dir ne secher biest, ob du se ändern wielst.
-[[$1|thumb]]",
-'file-thumbnail-no' => "Dar Dateinoame beginnt miet '''<tt>$1</tt>'''. Dies deutet uff a Bild verringerter Griße ''(thumbnail)'' hin.
+'fileexists' => 'Anne Datei miet diesem Noama existiert bereits.
+Bitte priefe <strong>[[:$1]]</strong>, wenn du dir ne secher biest, ob du se ändern wielst.
+[[$1|thumb]]',
+'file-thumbnail-no' => "Dar Dateinoame beginnt miet <strong>$1</strong>. Dies deutet uff a Bild verringerter Griße ''(thumbnail)'' hin.
 Bitte priefe, ob du doas Bild ei voller Ufflesung vorliegen host und loade dieses under damm Originalnoama huch.",
 'file-exists-duplicate' => 'Diese Datei ies a Duplikat dar fulgenda {{PLURAL:$1|Datei|$1 Dateien}}:',
 'file-deleted-duplicate' => 'Anne identische Datei dieser Datei ([[:$1]]) wurde frieher geläscht. Ieberpriefe doas Läsch-Logbuch, bevor du se huchlädst.',
@@ -1192,7 +1192,7 @@ Anne [[Special:WhatLinksHere/$2|vullständige Liste]] ies verfiegbar.',
 
 # MIME search
 'mimesearch' => 'Suche noach MIME-Typ',
-'mimesearch-summary' => 'Uff dieser Spezialseyte kinna de Dateien noach damm MIME-Typ gefiltert waan. Die Eingabe muuß emmer dann Medien- und Subtyp beinhalten: <tt>image/jpeg</tt> (siehe Dateibeschreibungsseyte).',
+'mimesearch-summary' => 'Uff dieser Spezialseyte kinna de Dateien noach damm MIME-Typ gefiltert waan. Die Eingabe muuß emmer dann Medien- und Subtyp beinhalten: <code>image/jpeg</code> (siehe Dateibeschreibungsseyte).',
 'download' => 'Herunderloada',
 
 # Unwatched pages
@@ -1356,7 +1356,7 @@ Siehe au de Liste der [[Special:WantedCategories|gewinschta Kategorien]].',
 # Special:LinkSearch
 'linksearch-ns' => 'Noamensraum:',
 'linksearch-ok' => 'Sucha',
-'linksearch-text' => 'Diese Spezialseite ermeegliecht de Suche noach Seita, ei denen bestimmte Weblinks enthaala sein. Dabei kinna Wildcards wie beispielsweise <tt>*.example.com</tt> benutzt waan.<br />Understitzte Protokolle: <tt>$1</tt>',
+'linksearch-text' => 'Diese Spezialseite ermeegliecht de Suche noach Seita, ei denen bestimmte Weblinks enthaala sein. Dabei kinna Wildcards wie beispielsweise <code>*.example.com</code> benutzt waan.<br />Understitzte Protokolle: <code>$1</code>',
 'linksearch-line' => '$1 ies verlinkt vun $2',
 'linksearch-error' => 'Wildcards kinna ock oam Oanfang dar URL verwendet waan.',
 
index 97fb200..2b71faf 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Albanian (Shqip)
+/** Albanian (shqip)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -15,6 +15,7 @@
  * @author Eagleal
  * @author Ergon
  * @author Euriditi
+ * @author FatosMorina
  * @author Kaganer
  * @author Marinari
  * @author Mdupont
@@ -127,77 +128,77 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#RIDREJTO', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__JOTP__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__JOGALERI__', '__NOGALLERY__' ),
-       'toc'                     => array( '0', '__TP__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__JOREDAKTIMSEKSIONI__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
-       'currentday'              => array( '1', 'DITASOT', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'DITASOT2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'EMRIIDITËSOT', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'SIVJET', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'KOHATANI', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ORATANI', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'MUAJILOKAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'EMRIIMUAJITLOKAL', 'LOCALMONTHNAME' ),
-       'localday'                => array( '1', 'DITALOKALE', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'DITALOKALE2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'EMRIIDITËSLOKALE', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'VITILOKAL', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'KOHALOKALE', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ORALOKALE', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'NUMRIFAQEVE', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'NUMRIIARTIKUJVE', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'NUMRIISKEDAVE', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NUMRIIPËRDORUESVE', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'NUMRIIPËRDORUESVEAKTIVË', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'NUMRIREDAKTIMEVE', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'NUMRIISHIKIMEVE', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'EMRIFAQES', 'PAGENAME' ),
-       'namespace'               => array( '1', 'HAPËSIRA', 'NAMESPACE' ),
-       'fullpagename'            => array( '1', 'EMRIIPLOTËIFAQES', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'EMRIIPLOTËIFAQESE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'EMRIINËNFAQES', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'EMRIINËNFAQESE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'EMRIIFAQESBAZË', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'EMRIIFAQESBAZËE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'EMRIIFAQESSËDISKUTIMIT', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'EMRIIFAQESSËDISKUTIMITE', 'TALKPAGENAMEE' ),
-       'subst'                   => array( '0', 'ZËVN', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'parapamje', 'pamje', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'parapamje=$1', 'pamje=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'djathtas', 'right' ),
-       'img_left'                => array( '1', 'majtas', 'left' ),
-       'img_none'                => array( '1', 's\'ka', 'none' ),
-       'img_center'              => array( '1', 'qendër', 'qendrore', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'i_kornizuar', 'pa_kornizë', 'kornizë', 'framed', 'enframed', 'frame' ),
-       'img_page'                => array( '1', 'faqja=$1', 'faqja $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'lartdjathtas', 'lartdjathtas=$1', 'lartdjathtas $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'kufi', 'border' ),
-       'img_baseline'            => array( '1', 'linjabazë', 'baseline' ),
-       'img_sub'                 => array( '1', 'nën', 'sub' ),
-       'img_text_top'            => array( '1', 'tekst-top', 'text-top' ),
-       'img_middle'              => array( '1', 'mes', 'middle' ),
-       'img_bottom'              => array( '1', 'fund', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'tekst-fund', 'text-bottom' ),
-       'img_link'                => array( '1', 'lidhje=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'EMRIISAJTIT', 'SITENAME' ),
-       'localurl'                => array( '0', 'URLLOKALE', 'LOCALURL:' ),
-       'server'                  => array( '0', 'SERVERI', 'SERVER' ),
-       'servername'              => array( '0', 'EMRIISERVERIT', 'SERVERNAME' ),
-       'grammar'                 => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GJINIA:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'JAVAMOMENTALE', 'CURRENTWEEK' ),
-       'plural'                  => array( '0', 'SHUMËS:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'URLEPLOTË', 'FULLURL:' ),
-       'language'                => array( '0', '#GJUHA:', '#LANGUAGE:' ),
-       'numberofadmins'          => array( '1', 'NUMRIIADMINISTRUESVE', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'speciale', 'special' ),
-       'hiddencat'               => array( '1', '__KATEGORIEFSHEHUR__', '__HIDDENCAT__' ),
-       'pagesize'                => array( '1', 'MADHËSIAEFAQES', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#RIDREJTO', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__JOTP__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__JOGALERI__', '__NOGALLERY__' ),
+       'toc'                       => array( '0', '__TP__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__JOREDAKTIMSEKSIONI__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
+       'currentday'                => array( '1', 'DITASOT', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'DITASOT2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'EMRIIDITËSOT', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'SIVJET', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'KOHATANI', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ORATANI', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'MUAJILOKAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'EMRIIMUAJITLOKAL', 'LOCALMONTHNAME' ),
+       'localday'                  => array( '1', 'DITALOKALE', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'DITALOKALE2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'EMRIIDITËSLOKALE', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'VITILOKAL', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'KOHALOKALE', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ORALOKALE', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'NUMRIFAQEVE', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'NUMRIIARTIKUJVE', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'NUMRIISKEDAVE', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'NUMRIIPËRDORUESVE', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'NUMRIIPËRDORUESVEAKTIVË', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'NUMRIREDAKTIMEVE', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'NUMRIISHIKIMEVE', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'EMRIFAQES', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'HAPËSIRA', 'NAMESPACE' ),
+       'fullpagename'              => array( '1', 'EMRIIPLOTËIFAQES', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'EMRIIPLOTËIFAQESE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'EMRIINËNFAQES', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'EMRIINËNFAQESE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'EMRIIFAQESBAZË', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'EMRIIFAQESBAZËE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'EMRIIFAQESSËDISKUTIMIT', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'EMRIIFAQESSËDISKUTIMITE', 'TALKPAGENAMEE' ),
+       'subst'                     => array( '0', 'ZËVN', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'parapamje', 'pamje', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'parapamje=$1', 'pamje=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'djathtas', 'right' ),
+       'img_left'                  => array( '1', 'majtas', 'left' ),
+       'img_none'                  => array( '1', 's\'ka', 'none' ),
+       'img_center'                => array( '1', 'qendër', 'qendrore', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'i_kornizuar', 'pa_kornizë', 'kornizë', 'framed', 'enframed', 'frame' ),
+       'img_page'                  => array( '1', 'faqja=$1', 'faqja $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'lartdjathtas', 'lartdjathtas=$1', 'lartdjathtas $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'kufi', 'border' ),
+       'img_baseline'              => array( '1', 'linjabazë', 'baseline' ),
+       'img_sub'                   => array( '1', 'nën', 'sub' ),
+       'img_text_top'              => array( '1', 'tekst-top', 'text-top' ),
+       'img_middle'                => array( '1', 'mes', 'middle' ),
+       'img_bottom'                => array( '1', 'fund', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'tekst-fund', 'text-bottom' ),
+       'img_link'                  => array( '1', 'lidhje=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'EMRIISAJTIT', 'SITENAME' ),
+       'localurl'                  => array( '0', 'URLLOKALE', 'LOCALURL:' ),
+       'server'                    => array( '0', 'SERVERI', 'SERVER' ),
+       'servername'                => array( '0', 'EMRIISERVERIT', 'SERVERNAME' ),
+       'grammar'                   => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GJINIA:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'JAVAMOMENTALE', 'CURRENTWEEK' ),
+       'plural'                    => array( '0', 'SHUMËS:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'URLEPLOTË', 'FULLURL:' ),
+       'language'                  => array( '0', '#GJUHA:', '#LANGUAGE:' ),
+       'numberofadmins'            => array( '1', 'NUMRIIADMINISTRUESVE', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'speciale', 'special' ),
+       'hiddencat'                 => array( '1', '__KATEGORIEFSHEHUR__', '__HIDDENCAT__' ),
+       'pagesize'                  => array( '1', 'MADHËSIAEFAQES', 'PAGESIZE' ),
 );
 
 $datePreferences = array(
@@ -478,6 +479,10 @@ $1",
 'youhavenewmessages' => 'Ju keni $1 ($2).',
 'newmessageslink' => 'mesazhe të reja',
 'newmessagesdifflink' => 'ndryshimi i fundit',
+'youhavenewmessagesfromusers' => 'Ju keni $1 nga {{Shumës:$3|përdorues tjetër|përdoruesit $3}} ($2).',
+'youhavenewmessagesmanyusers' => 'Ju keni 1$ nga shumë përdorues (2$).',
+'newmessageslinkplural' => '{{SHUMËS:1$|një porosi e re|porosi të reja}}',
+'newmessagesdifflinkplural' => 'i fundit {{SHUMËS:$1|ndryshimi|ndryshimet}}',
 'youhavenewmessagesmulti' => 'Ju keni mesazhe të reja në $1',
 'editsection' => 'redakto',
 'editold' => 'redaktoni',
@@ -572,6 +577,8 @@ Nëse nuk është kjo arsyeja, ateherë ju mund të keni gjetur një gabim në p
 'cannotdelete' => 'Faqja ose skeda $1 nuk mund të fshihej.
 Mund të jetë fshirë nga dikush tjetër.',
 'cannotdelete-title' => 'Faqja "$1" nuk mund të fshihet',
+'delete-hook-aborted' => 'Fshirja u anulua nga togëza.
+Nuk jipet shpjegim.',
 'badtitle' => 'Titull i pasaktë',
 'badtitletext' => 'Titulli i faqes që kërkuat nuk ishte i saktë, ishte bosh, ose ishte një titull ndër-gjuhësor/inter-wiki me lidhje të pasaktë.
 Mund të përmbajë një ose më shumë germa, të cilat nuk mund të përdoren në tituj.',
@@ -603,6 +610,13 @@ $2',
 'ns-specialprotected' => 'Faqet speciale nuk mund të redaktohen.',
 'titleprotected' => "Ky titull është mbrojtur nga [[User:$1|$1]] dhe nuk mund të krijohet.
 Arsyeja e dhënë është ''$2''.",
+'filereadonlyerror' => 'Nuk është në gjendje që të ndryshojë skedarin "$1" sepse depoja e skedarit "$2" është në formën vetëm-lexim.
+
+Administratori i cili e mbylli atë e dha këtë shpjegim: "$3".',
+'invalidtitle-knownnamespace' => 'Titull jo i vlefshëm me hapësirën "$2" dhe teksti "$3"',
+'invalidtitle-unknownnamespace' => 'Titull jo i vlefshëm me numrin e panjohur të hapësirës së emrit $1 dhe tekstit "$2"',
+'exception-nologin' => 'I paqasur',
+'exception-nologin-text' => 'Kjo faqe ose ky veprim ju kërkon që të qaseni në këtë wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Konfiguracion i parregullt: Skaner i panjohur virusesh: ''$1''",
@@ -623,6 +637,7 @@ Arsyeja e dhënë është ''$2''.",
 'remembermypassword' => 'Mbaj mënd fjalëkalimin tim për tërë vizitat e ardhshme (për një kohë maksimale prej $1 {{PLURAL:$1|dite|ditësh}})',
 'securelogin-stick-https' => 'Qëndro i lidhur me HTTPS pas hyrjes me emrin përkatës',
 'yourdomainname' => 'Faqja juaj',
+'password-change-forbidden' => 'Ju nuk mund të ndryshoni fjalëkalimet në këtë wiki.',
 'externaldberror' => 'Ose kishte një gabim tek regjistri i identifikimit të jashtëm, ose nuk ju lejohet të përtërini llogarinë tuaje të jashtme.',
 'login' => 'Hyni',
 'nav-login-createaccount' => 'Hyni ose hapni një llogari',
@@ -688,6 +703,7 @@ Ju lutemi ndiqni këshillat në eMailin e pranuar.',
 'emailconfirmlink' => 'Vërtetoni adresën tuaj',
 'invalidemailaddress' => 'Posta elektronike nuk mund të pranohet kështu si është pasi ka format jo valid. Ju lutemi, vendoni një postë mirë të formatuar, ose zbrazeni fushën.',
 'cannotchangeemail' => 'Adresat e-mail të llogarive nuk mund të ndryshohen në këtë wiki.',
+'emaildisabled' => 'Kjo faqe nuk mund të dërgojë e-maila.',
 'accountcreated' => 'Llogarija e Përdoruesit u krijua',
 'accountcreatedtext' => 'Llogarija e Përdoruesit për $1 u krijua',
 'createaccount-title' => 'Hapja e llogarive për {{SITENAME}}',
@@ -861,6 +877,9 @@ ose [{{fullurl:{{FULLPAGENAME}}|action=edit}} të redaktoni këtë faqe]</span>.
 Ju mundeni [[Special:Search/{{PAGENAME}}|me kërku këtë titull]] në faqe tjera,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} me kërku në regjistrat tematikisht të afërm],
 apo [{{fullurl:{{FULLPAGENAME}}|action=edit}} me redaktu këtë faqe]</span>.',
+'missing-revision' => 'Inspektimi #$1 i faqes me emrin "{{PAGENAME}}" nuk ekziston.
+
+Kjo zakonisht shkaktuar duke ndjekur një lidhje të vjetër tek një faqe që është fshirë. Hollësitë mund të gjenden në [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regjistrin e fshirjeve].',
 'userpage-userdoesnotexist' => 'Llogaria e përdoruesit "<nowiki>$1</nowiki>" nuk është e regjistruar. 
 Ju lutem kontrolloni nëse dëshironi të krijoni/redaktoni këtë faqe.',
 'userpage-userdoesnotexist-view' => 'Llogaria i përdoruesit "$1" nuk është e regjistruar.',
@@ -886,6 +905,7 @@ Më poshtë mund t'i referoheni shënimit të regjistruar për bllokimin e fundi
 'note' => "'''Shënim:'''",
 'previewnote' => "'''Vini re! Kjo faqe është vetëm për shqyrtim.'''
 Ndryshimet tuaja nuk janë ruajtur ende!",
+'continue-editing' => 'Vazhdo ndryshimin',
 'previewconflict' => 'Kjo parapamje reflekton tekstin sipër kutisë së redaktimit siç do të duket kur të kryeni ndryshimin.',
 'session_fail_preview' => "'''Ju kërkojmë ndjesë! Redaktimi juaj nuk mund të perpunohej për shkak të humbjes së të dhënave të seancës.'''
 Ju lutemi, provojeni përsëri.
@@ -899,6 +919,7 @@ Redaktimi nuk u pranua për të parandaluar korruptimin e tekstit në faqe.
 Kjo ndodh ndonjëherë kur përdoret server anonim dytësor me gabime.",
 'edit_form_incomplete' => "'''Disa pjesë të formularit të redaktimit nuk arritën në server; kontrolloni edhe një herë nëse redaktimet tuaja janë të paprekura dhe provojeni përsëri.'''",
 'editing' => 'Duke redaktuar $1',
+'creating' => 'Duke krijuar $1',
 'editingsection' => 'Duke redaktuar $1 (paragraf)',
 'editingcomment' => 'Duke redaktuar (paragraf i ri) $1',
 'editconflict' => 'Konflikt redaktimi: $1',
@@ -964,6 +985,7 @@ Duket se është grisur.',
 'edit-no-change' => 'Redaktimi juaj është anashkaluar pasi që asnjë ndryshim nuk u bë në tekst.',
 'edit-already-exists' => 'Faqja nuk mundej të hapet.
 Ajo tanimë ekziston.',
+'defaultmessagetext' => 'Teksti i porosisë së parazgjedhur',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.
@@ -1120,7 +1142,7 @@ Ju lutemi kontrolloni regjistrat.',
 
 # Suppression log
 'suppressionlog' => 'Regjistri i ndalimeve',
-'suppressionlogtext' => 'Më poshtë është një listë e grisjeve dhe bllokimeve duke përfshirë përmnajtjen e fshehur nga administratorët.
+'suppressionlogtext' => 'Më poshtë është një listë e grisjeve dhe bllokimeve duke përfshirë përmbajtjen e fshehur nga administratorët.
 Shiko [[Special:BlockList|listën e bllokimeve IP]] për listën e përjashtimeve operacionale dhe bllokimeve aktuale.',
 
 # History merging
@@ -1156,6 +1178,8 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 
 # Diffs
 'history-title' => 'Historiku i redaktimeve te "$1"',
+'difference-title' => 'Ndryshimi mes inspektimeve të "$1"',
+'difference-title-multipage' => 'Ndryshimi mes faqeve "$1" dhe "$2"',
 'difference-multipage' => '(Ndryshimi midis faqeve)',
 'lineno' => 'Rreshti $1:',
 'compareselectedversions' => 'Krahasoni versionet e zgjedhura',
@@ -1250,6 +1274,7 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'prefs-beta' => 'Karakteristikat Beta',
 'prefs-datetime' => 'Data dhe Ora',
 'prefs-labs' => 'Karakteristikat laboratorik',
+'prefs-user-pages' => 'Faqet e përdoruesit',
 'prefs-personal' => 'Përdoruesi',
 'prefs-rc' => 'Ndryshime së fundmi',
 'prefs-watchlist' => 'Lista mbikqyrëse',
@@ -1428,6 +1453,7 @@ Kjo informatë është publike.',
 'right-writeapi' => 'Përdorimi i shkrimit API',
 'right-delete' => 'Gris faqet',
 'right-bigdelete' => 'Gris faqet me histori të gjata',
+'right-deletelogentry' => 'Fshij dhe mos i fshij shënimet në regjistrat e veçantë',
 'right-deleterevision' => 'Grisi dhe riktheji revizionet specifike të faqeve',
 'right-deletedhistory' => 'Shiko shënimet e grisura të historikut, pa tekstet e tyre të shoqëruara',
 'right-deletedtext' => 'Shiko tekstin dhe ndryshimet e grisura ndërmjet versioneve të grisura',
@@ -1538,9 +1564,11 @@ Kjo informatë është publike.',
 'number_of_watching_users_pageview' => '[$1 duke u mbikqyrur nga {{PLURAL:$1|përdorues|përdorues}}]',
 'rc_categories' => 'Kufizimi i kategorive (të ndara me "|")',
 'rc_categories_any' => 'Të gjitha',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajtë}} pas ndryshimit',
 'newsectionsummary' => '/* $1 */ seksion i ri',
 'rc-enhanced-expand' => 'Trego detajet (kërkon JavaScript)',
 'rc-enhanced-hide' => 'Fshih detajet',
+'rc-old-title' => 'fillimisht i krijuar si "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Ndryshime të ndërvarura',
@@ -1571,9 +1599,9 @@ Për të parë ose kërkuar skeda të ngarkuara më parë, shkoni tek [[Special:
 (ri)ngarkimet janë gjithashtu të regjistruara tek [[Special:Log/upload|regjistri i ngarkimeve]], grisjet tek [[Special:Log/delete|regjistri i grisjeve]].
 
 Për të përfshirë një skedë në një faqe, përdorni një nga format e mëposhtme:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skeda.jpg]]</nowiki></tt>''' për të përdorur versionin e plotë të skedës
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skeda.png|200px|thumb|left|alt text]]</nowiki></tt>''' për të përdorur nje interpretim prej 200 piksel në të majtë me 'alt tekst' si përshkrim
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Skeda.ogg]]</nowiki></tt>''' për të lidhur skedën direkt, pa e shfaqur atë",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skeda.jpg]]</nowiki></code>''' për të përdorur versionin e plotë të skedës
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skeda.png|200px|thumb|left|alt text]]</nowiki></code>''' për të përdorur nje interpretim prej 200 piksel në të majtë me 'alt tekst' si përshkrim
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Skeda.ogg]]</nowiki></code>''' për të lidhur skedën direkt, pa e shfaqur atë",
 'upload-permitted' => 'Llojet e lejuara të skedave: $1.',
 'upload-preferred' => 'Llojet e parapëlqyera të skedave: $1.',
 'upload-prohibited' => 'Llojet e ndaluara të skedave: $1.',
@@ -1618,20 +1646,20 @@ kjo skedë është $2.',
 'largefileserver' => 'Skeda është më e madhe se sa serveri e lejon këtë.',
 'emptyfile' => 'Skeda që keni dhënë është bosh ose mbi madhësinë e lejushme. Kjo gjë mund të ndodhi nëse shtypni emrin gabim, prandaj kontrolloni nëse dëshironi të jepni skedën me këtë emër.',
 'windows-nonascii-filename' => 'Ky wiki nuk e mbështet emrin e dokumentit me karaktere të veçanta.',
-'fileexists' => "Ekziston një skedë me atë emër, ju lutem kontrolloni '''<tt>[[:$1]]</tt>''' në qoftë se nuk jeni të sigurt nëse dëshironi ta zëvendësoni.
-[[$1|thumb]]",
-'filepageexists' => "Përshkrimi i faqes për këtë skedë është krijuar tek '''<tt>[[:$1]]</tt>''', por asnjë skedë me këtë emër nuk ekziston.
+'fileexists' => 'Ekziston një skedë me atë emër, ju lutem kontrolloni <strong>[[:$1]]</strong> në qoftë se nuk jeni të sigurt nëse dëshironi ta zëvendësoni.
+[[$1|thumb]]',
+'filepageexists' => 'Përshkrimi i faqes për këtë skedë është krijuar tek <strong>[[:$1]]</strong>, por asnjë skedë me këtë emër nuk ekziston.
 Përmbledhja që shkruat nuk do të shfaqet në përshkrimin e faqes.
 Për ta bërë përmbledhjen tuaj të dukshme atje, ju duhet ta redaktoni automatikisht.
-[[$1|thumb]]",
-'fileexists-extension' => "Ekziston një skedë me emër të ngjashëm: [[$2|thumb]]
-* Emri i skedës në ngarkim: '''<tt>[[:$1]]</tt>'''
-* Emri i skedës ekzistuese: '''<tt>[[:$2]]</tt>'''
-Ju lutem zgjidhni një emër tjetër.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Ekziston një skedë me emër të ngjashëm: [[$2|thumb]]
+* Emri i skedës në ngarkim: <strong>[[:$1]]</strong>
+* Emri i skedës ekzistuese: <strong>[[:$2]]</strong>
+Ju lutem zgjidhni një emër tjetër.',
 'fileexists-thumbnail-yes' => "Kjo skedë duket se është një figurë me madhësi të zvogëluar ''(figurë përmbledhëse)''. [[$1|thumb]]
-Ju lutem kontrolloni skedën '''<tt>[[:$1]]</tt>'''.
+Ju lutem kontrolloni skedën <strong>[[:$1]]</strong>.
 Nëse skeda e kontrolluar është e së njëjtës madhësi me origjinalen atëherë nuk ka nevojë të ngarkoni një figurë përmbledhëse.",
-'file-thumbnail-no' => "Emri i skedës fillon me '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Emri i skedës fillon me <strong>$1</strong>.
 Duket se është një figurë me madhësi të zvogëluar ''(thumbnail)''.
 Nëse keni këtë figurë me madhësi të plotë ju lutem të ngarkoni atë, përndryshe ju lutem të ndryshoni emrin e skedës.",
 'fileexists-forbidden' => 'Ekziston një skedë me të njëjtin emër. Ju lutemi kthehuni mbrapsht dhe ngarkoni këtë skedë me një emër të ri. 
@@ -1688,6 +1716,7 @@ Nëse problemi vazhdon atëherë kontaktoni një [[Special:ListUsers/sysop|admin
 'upload-too-many-redirects' => 'Adresa URL përmbante shumë përcjellime.',
 'upload-unknown-size' => 'Madhësia e panjohur',
 'upload-http-error' => 'Ndodhi një gabim HTTP: $1',
+'upload-copy-upload-invalid-domain' => 'Ngarkesat e kopjimit nuk janë në dispozicion nga ky domein.',
 
 # File backend
 'backend-fail-stream' => 'Nuk mund të kalojë skedën $1.',
@@ -1706,6 +1735,12 @@ Nëse problemi vazhdon atëherë kontaktoni një [[Special:ListUsers/sysop|admin
 'backend-fail-closetemp' => 'Nuk mund të mbyllë skedën e përkohshme.',
 'backend-fail-read' => 'Nuk mund të lexojë skedën $1.',
 'backend-fail-create' => 'Nuk mund të krijojë skedën $1.',
+'backend-fail-maxsize' => 'Nuk mund të shkruante skedarin "$1" sepse ai është më i madh se {{SHUMËS:$2|një bajt|$2 bajtë}}',
+'backend-fail-readonly' => 'Shërbimi i depos "$1" është për momentin vetëm-për-lexim. Arsyeja e dhënë është: "\'\'$2\'\'"',
+'backend-fail-synced' => 'Skedari "$1" është në një gjendje të parregullt brenda proceseve të depos së brendshme',
+'backend-fail-connect' => 'Nuk u arrit lidhja me shërbimin e depos "$1".',
+'backend-fail-internal' => 'Një problem i panjohur ndodhi në shërbimin e depos "$1".',
+'backend-fail-contenttype' => 'Nuk mundi të përcaktojë llojin e përmbajtjes së skedarit për ta ruajtur në "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => 'Nuk mund të zhbllokojë "$1"; nuk është e bllokuar.',
@@ -1866,7 +1901,7 @@ Përshkrimi në [$2 faqen përshkruese të skedës] është treguar më poshtë.
 
 # MIME search
 'mimesearch' => 'Kërkime MIME',
-'mimesearch-summary' => 'Kjo faqe lejon kërkimin e skedave sipas llojit MIME. Kërkimi duhet të jetë i llojit: contenttype/subtype, p.sh. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Kjo faqe lejon kërkimin e skedave sipas llojit MIME. Kërkimi duhet të jetë i llojit: contenttype/subtype, p.sh. <code>image/jpeg</code>.',
 'mimetype' => 'Lloji MIME:',
 'download' => 'shkarkim',
 
@@ -1960,6 +1995,8 @@ Secili rresht përmban lidhjet tek përcjellimi i parë dhe përcjellimi i dytë
 'wantedpages' => 'Artikuj më të dëshiruar',
 'wantedpages-badtitle' => 'Titull i pavlefshëm në vendosjen e rezultateve: $1',
 'wantedfiles' => 'Skedat e dëshiruara',
+'wantedfiletext-cat' => 'Skedarët vijues janë përdorur por nuk ekzistojnë. Skedarët nga depot e panjohura mund të listohen megjithëse nuk ekzistojnë. Ndonjë gjë pozitive e pavërtetë e tillë do të <del>largohet</del>. Për më tepër, faqet që vendosin skedarë që nuk ekzistojnë janë listuar në [[:$1]].',
+'wantedfiletext-nocat' => 'Skedarët vijues janë përdorur por nuk ekzistojnë. Skedarët nga depot e panjohura mund të listohen megjithëse nuk ekzistojnë. Ndonjë gjë pozitive e pavërtetë e tillë do të <del>largohet</del>.',
 'wantedtemplates' => 'Stampat e dëshiruara',
 'mostlinked' => 'Artikuj më të lidhur',
 'mostlinkedcategories' => 'Kategori më të lidhura',
@@ -2019,6 +2056,7 @@ Ju lutemi, vini re se faqe të tjera në rrjet si mund të lidhin një figurë m
 Ju mund të kufizoni pamje sipas tipit të regjistrit, emrit të përdoruesit (shumë i ndjeshëm), dhe faqes në çështje (edhe rastet e ndjeshme)',
 'logempty' => 'Nuk ka asnjë përputhje në regjistër.',
 'log-title-wildcard' => 'Kërko tituj që fillojnë me këtë tekst',
+'showhideselectedlogentries' => 'Paraqit/fshih shënimet e përzgjedhura të regjistruara.',
 
 # Special:AllPages
 'allpages' => 'Të gjitha faqet',
@@ -2037,6 +2075,12 @@ Ju mund të kufizoni pamje sipas tipit të regjistrit, emrit të përdoruesit (s
 'allpagesbadtitle' => 'Titulli i dhënë ishte i pavlefshë ose kishte një parashtesë ndër-gjuhe ose ndër-wiki.
 Mund të përmbajë një ose më shumë karktere të cilat nuk mund të përdoren në tituj.',
 'allpages-bad-ns' => '{{SITENAME}} nuk ka hapësirë "$1".',
+'allpages-hide-redirects' => 'Fshih përcjelljet',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Ju jeni duke e parë një version të ruajtur të kësaj faqe, që mund të jetë deri $1 e vjetër',
+'cachedspecial-viewing-cached-ts' => 'Ju jeni duke e parë një version të ruajtur të kësaj faqe, që mund të mos jetë tërësisht e pranishme.',
+'cachedspecial-refresh-now' => 'Shikoni të fundit.',
 
 # Special:Categories
 'categories' => 'Kategori',
@@ -2059,7 +2103,7 @@ Shikoni edhe [[Special:WantedCategories|kategoritë e dëshiruara]].',
 'linksearch-ok' => 'Kërko',
 'linksearch-text' => 'Ylli zëvëndësues mund të përdoret si p.sh. "*.wikipedia.org".
 Duhet një domen top-nivel, si p.sh. "*.org.<br />
-Protokolle të mbështetura: <tt>$1<tt> (mos shtoni ndonjërin nga këta në kërkimin tuaj).',
+Protokolle të mbështetura: <code>$1<code> (mos shtoni ndonjërin nga këta në kërkimin tuaj).',
 'linksearch-line' => '$1 lidhur nga $2',
 'linksearch-error' => 'Ylli mund të përdoret vetëm në fillim të emrit',
 
@@ -2272,6 +2316,8 @@ vazhdoni me kujdes.',
 'rollback' => 'Riktheji mbrapsh redaktimet',
 'rollback_short' => 'Riktheje',
 'rollbacklink' => 'riktheje',
+'rollbacklinkcount' => 'riktheni $1 {{PLURAL:$1|ndryshimin|ndryshiemt}}',
+'rollbacklinkcount-morethan' => 'riktheni më tepër $1 {{PLURAL:$1|ndryshim|ndryshime}}',
 'rollbackfailed' => 'Rikthimi dështoi',
 'cantrollback' => 'Redaktimi nuk mund të kthehej;
 redaktori i fundit është i vetmi autor i këtij artikulli.',
@@ -2706,6 +2752,7 @@ Ju lutemi zgjidhni në emët tjetër.',
 'exporttext' => 'Mund të eksportoni tekstin dhe historinë e redaktimit e një faqeje ose disa faqesh të mbështjesha në XML; kjo mund të importohet në një wiki tjetër që përdor softuerin MediaWiki (tani për tani, ky opsion nuk është përfshirë tek {{SITENAME}}).
 
 Për të eksportuar faqe, thjesht shtypni një emër për çdo rresht, ose krijoni lidhje të tipit [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] si [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Eksportoni të gjitha faqet',
 'exportcuronly' => 'Përfshi vetëm versionin e fundit, jo të gjithë historinë',
 'exportnohistory' => "'''Shënim:''' Eksportimi i historisë së faqes për shkaqe të rendimentit nuk është e mundshme.",
 'exportlistauthors' => 'Përfshij një listë të plotë të kontribuesve për secilën faqe',
@@ -2792,6 +2839,9 @@ Ju lutemi provoni përsëri.',
 'import-invalid-interwiki' => 'Nuk mund të importohet nga wiki i specifikuar.',
 'import-error-edit' => 'Faqja "$1" nuk është importuar sepse ju nuk lejoheni ta redaktoni atë.',
 'import-error-create' => 'Faqja "$1" nuk është importuar sepse ju nuk lejoheni ta krijoni atë.',
+'import-error-interwiki' => 'Faqja "$1" nuk është importuar sepse emri i saj është rezervuar për lidhje të jashtme (interwiki)',
+'import-error-special' => 'Faqja "$1" nuk është importuar sepse ajo i përket një hapësire të veçantë që nuk i lejon faqet.',
+'import-error-invalid' => 'Faqja "$1" nuk është importuar sepse emri i saj është i palejueshëm.',
 
 # Import log
 'importlogpage' => 'Regjistri i importeve',
@@ -2802,7 +2852,15 @@ Ju lutemi provoni përsëri.',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$!1|version|versione}} nga $2',
 
 # JavaScriptTest
+'javascripttest' => 'Duke testuar JavaScript',
+'javascripttest-disabled' => 'Ky funksion nuk është mundësuar në këtë wiki.',
+'javascripttest-title' => 'Duke kryer testet $1',
+'javascripttest-pagetext-noframework' => 'Kjo faqe është rezervuar për kryerjen e testimeve JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Kornizë pune e panjohur testuese "$1".',
+'javascripttest-pagetext-frameworks' => 'Ju lutemi zgjidhni njërën nga kornizat vijuese punuese të testimit: $1',
+'javascripttest-pagetext-skins' => "Zgjidhni një mostër për t'i kryer testimet:",
 'javascripttest-qunit-intro' => 'Shiko [$1 dokumentacionin e testimit] në mediawiki.org.',
+'javascripttest-qunit-heading' => 'Platforma testuese JavaScript QUnit',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Faqja juaj e përdoruesit',
@@ -2898,19 +2956,15 @@ Ju lutemi provoni përsëri.',
 'spambot_username' => 'MediaWiki spam-pastrues',
 'spam_reverting' => "U kthye tek versioni i fundit që s'ka lidhje tek $1",
 'spam_blanking' => 'U boshatis sepse të gjitha versionet kanë lidhje tek $1',
+'spam_deleting' => 'Të gjitha inspektimet përmbanin lidhje në $1, duke fshirë',
 
 # Info page
 'pageinfo-title' => 'Informacion për " $1 "',
 'pageinfo-header-edits' => 'Redaktimet',
-'pageinfo-header-watchlist' => 'Lista mbikqyrëse',
-'pageinfo-header-views' => 'Shikime',
-'pageinfo-subjectpage' => 'Faqe',
-'pageinfo-talkpage' => 'Faqe diskutimi',
+'pageinfo-views' => 'Numri i shikimeve',
 'pageinfo-watchers' => 'Numri i mbikqyrësve',
 'pageinfo-edits' => 'Numri i redaktimeve',
 'pageinfo-authors' => 'Numri i autorëve të veçantë',
-'pageinfo-views' => 'Numri i shikimeve',
-'pageinfo-viewsperedit' => 'Shikime për redaktim',
 
 # Skin names
 'skinname-standard' => 'Standarte',
@@ -3598,6 +3652,7 @@ Ju duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU Ge
 'version-software' => 'Softuerët e instaluar',
 'version-software-product' => 'Produkti',
 'version-software-version' => 'Versioni',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Vendndodhja e skedave',
@@ -3759,9 +3814,12 @@ Përndryshe, ju mund të formularin e thjeshtë më poshtë. Komenti juaj do të
 'api-error-empty-file' => 'Skeda që paraqitët ishte bosh.',
 'api-error-emptypage' => 'Nuk lejohet krijimi i faqeve të reja bosh.',
 'api-error-fetchfileerror' => 'Gabim i brendshëm: Diçka shkoi keq gjatë marrjes së skedës.',
+'api-error-fileexists-forbidden' => 'Një skedar me emrin "$1" tashmë ekziston dhe nuk mund të mbishkruhet.',
+'api-error-fileexists-shared-forbidden' => 'Një skedar me emrin "$1" tashmë ekziston në depon për skedarët e shpërndarë dhe nuk mund të mbishkruhet.',
 'api-error-file-too-large' => 'Skeda që paraqitët ishte shumë e madhe.',
 'api-error-filename-tooshort' => 'Emri i skedës është shumë i shkurtër.',
 'api-error-filetype-banned' => 'Ky lloj i skedës është përjashtuar.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|nuk është një lloj i skedës së lejuar|nuk janë lloje të lejuara të skedave}}. {{PLURAL:$3|Lloji i lejuar i skedës është|Llojet e lejuara të skedave janë}} $2.',
 'api-error-filetype-missing' => 'Skedës i mungon një shtesë.',
 'api-error-hookaborted' => 'Modifikimi që provuat të bëni u ndërpre nga një goditje shtese.',
 'api-error-http' => 'Gabim i brendshëm: Nuk mund të lidhet me serverin.',
@@ -3786,4 +3844,15 @@ Përndryshe, ju mund të formularin e thjeshtë më poshtë. Komenti juaj do të
 'api-error-uploaddisabled' => 'Ngarkimi është i çaktivizuar në këte wiki.',
 'api-error-verification-error' => 'Skeda mund të jetë e korruptuar ose ka shtesë të gabuar.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekondë|sekonda}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minutë|minuta}}',
+'duration-hours' => '$1 {{PLURAL:$1|orë|orë}}',
+'duration-days' => '$1 {{PLURAL:$1|ditë|ditë}}',
+'duration-weeks' => '$1 {{PLURAL:$1|javë|javë}}',
+'duration-years' => '$1 {{PLURAL:$1|vit|vite}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekadë|dekada}}',
+'duration-centuries' => '$1 {{PLURAL:$1|shekull|shekuj}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milennium|mileniume}}',
+
 );
index 2400634..6a55ec0 100644 (file)
@@ -73,11 +73,6 @@ $namespaceAliases = array(
        'Разговор_о_МедијаВикију' => NS_MEDIAWIKI_TALK,
 );
 
-
-$extraUserToggles = array(
-       'nolangconversion',
-);
-
 $datePreferenceMigrationMap = array(
        'default',
        'hh:mm d. month y.',
@@ -251,150 +246,150 @@ $dateFormats = array(
 
 /* NOT USED IN STABLE VERSION */
 $magicWords = array(
-       'redirect'                => array( '0', '#Преусмери', '#преусмери', '#ПРЕУСМЕРИ', '#Преусмјери', '#преусмјери', '#ПРЕУСМЈЕРИ', '#redirect', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__БЕЗСАДРЖАЈА__', '__БЕЗ_САДРЖАЈА__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__БЕЗГАЛЕРИЈЕ__', '__БЕЗ_ГАЛЕРИЈЕ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ФОРСИРАНИСАДРЖАЈ__', '__ФОРСИРАНИ_САДРЖАЈ__', '__ПРИМОРАНИСАДРЖАЈ__', '__ПРИМОРАНИ_САДРЖАЈ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__САДРЖАЈ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__БЕЗИЗМЕНА__', '__БЕЗ_ИЗМЕНА__', '__БЕЗИЗМЈЕНА__', '__БЕЗ_ИЗМЈЕНА__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__БЕЗЗАГЛАВЉА__', '__БЕЗ_ЗАГЛАВЉА__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'ТРЕНУТНИМЕСЕЦ', 'ТРЕНУТНИ_МЕСЕЦ', 'ТЕКУЋИМЕСЕЦ', 'ТЕКУЋИ_МЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ТРЕНУТНИМЕСЕЦ1', 'ТРЕНУТНИ_МЕСЕЦ1', 'ТЕКУЋИМЕСЕЦ1', 'ТЕКУЋИ_МЕСЕЦ1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'ТРЕНУТНИМЕСЕЦИМЕ', 'ИМЕТЕКУЋЕГМЕСЕЦА', 'ИМЕ_ТЕКУЋЕГ_МЕСЕЦА', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'ТРЕНУТНИМЕСЕЦГЕН', 'ТЕКУЋИМЕСЕЦГЕН', 'ТЕКУЋИ_МЕСЕЦ_ГЕН', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'ТРЕНУТНИМЕСЕЦСКР', 'ТЕКУЋИМЕСЕЦСКР', 'ТЕКУЋИ_МЕСЕЦ_СКР', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ТРЕНУТНИДАН', 'ТЕКУЋИДАН', 'ТЕКУЋИ_ДАН', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ТЕКУЋИДАН2', 'ТЕКУЋИ_ДАН_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'ТРЕНУТНИДАНИМЕ', 'ИМЕТЕКУЋЕГДАНА', 'ИМЕ_ТЕКУЋЕГ_ДАНА', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ТРЕНУТНАГОДИНА', 'ТЕКУЋАГОДИНА', 'ТЕКУЋА_ГОДИНА', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ТРЕНУТНОВРЕМЕ', 'ТЕКУЋЕВРЕМЕ', 'ТЕКУЋЕ_ВРЕМЕ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ТЕКУЋИСАТ', 'ТЕКУЋИ_САТ', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ЛОКАЛНИМЕСЕЦ', 'ЛОКАЛНИ_МЕСЕЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'ЛОКАЛНИМЕСЕЦ2', 'ЛОКАЛНИ_МЕСЕЦ2', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'ИМЕЛОКАЛНОГМЕСЕЦА', 'ИМЕ_ЛОКАЛНОГ_МЕСЕЦА', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'ЛОКАЛНИМЕСЕЦГЕН', 'ЛОКАЛНИ_МЕСЕЦ_ГЕН', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'ЛОКАЛНИМЕСЕЦСКР', 'ЛОКАЛНИ_МЕСЕЦ_СКР', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ЛОКАЛНИДАН', 'ЛОКАЛНИ_ДАН', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ЛОКАЛНИДАН2', 'ЛОКАЛНИ_ДАН2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'ИМЕЛОКАЛНОГДАНА', 'ИМЕ_ЛОКАЛНОГ_ДАНА', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ЛОКАЛНАГОДИНА', 'ЛОКАЛНА_ГОДИНА', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ЛОКАЛНОВРЕМЕ', 'ЛОКАЛНО_ВРЕМЕ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ЛОКАЛНИСАТ', 'ЛОКАЛНИ_САТ', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'БРОЈСТРАНИЦА', 'БРОЈ_СТРАНИЦА', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'БРОЈЧЛАНАКА', 'БРОЈ_ЧЛАНАКА', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'БРОЈДАТОТЕКА', 'БРОЈ_ДАТОТЕКА', 'БРОЈФАЈЛОВА', 'БРОЈ_ФАЈЛОВА', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'БРОЈКОРИСНИКА', 'БРОЈ_КОРИСНИКА', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'БРОЈАКТИВНИХКОРИСНИКА', 'БРОЈ_АКТИВНИХ_КОРИСНИКА', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'БРОЈИЗМЕНА', 'БРОЈ_ИЗМЕНА', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'БРОЈПРЕГЛЕДА', 'БРОЈ_ПРЕГЛЕДА', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'ИМЕСТРАНИЦЕ', 'ИМЕ_СТРАНИЦЕ', 'СТРАНИЦА', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'ИМЕНАСТРАНИЦА', 'ИМЕНА_СТРАНИЦА', 'СТРАНИЦЕ', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ИМЕНСКИПРОСТОР', 'ИМЕНСКИ_ПРОСТОР', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ИМЕНСКИПРОСТОРИ', 'ИМЕНСКИ_ПРОСТОРИ', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'РАЗГОВОР', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'РАЗГОВОРИ', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ИМЕНСКИПРОСТОРЧЛАНКА', 'ИМЕНСКИ_ПРОСТОР_ЧЛАНКА', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ИМЕНСКИПРОСТОРЧЛАНАКА', 'ИМЕНСКИ_ПРОСТОР_ЧЛАНАКА', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'ПУНОИМЕСТРАНИЦЕ', 'ПУНОИМЕСТРАНЕ', 'ПУНО_ИМЕ_СТРАНИЦЕ', 'ПУНО_ИМЕ_СТРАНЕ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ПУНАИМЕНАСТРАНИЦА', 'ПУНАИМЕНАСТРАНА', 'ПУНА_ИМЕНА_СТРАНИЦА', 'ПУНА_ИМЕНА_СТРАНА', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ИМЕПОДСТРАНИЦЕ', 'ИМЕПОДСТРАНЕ', 'ИМЕ_ПОДСТРАНИЦЕ', 'ИМЕ_ПОДСТРАНЕ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ИМЕНАПОДСТРАНИЦА', 'ИМЕНАПОДСТРАНА', 'ИМЕНА_ПОДСТРАНИЦА', 'ИМЕНА_ПОДСТРАНА', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'ИМЕОСНОВЕ', 'ИМЕ_ОСНОВЕ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'ИМЕНАОСНОВА', 'ИМЕНА_ОСНОВА', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'ИМЕРАЗГОВОРА', 'ИМЕ_РАЗГОВОРА', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'ИМЕНАРАЗГОВОРА', 'ИМЕНА_РАЗГОВОРА', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'ИМЕЧЛАНКА', 'ИМЕ_ЧЛАНКА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'ИМЕНАЧЛАНАКА', 'ИМЕНА_ЧЛАНАКА', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'ПОР:', 'MSG:' ),
-       'subst'                   => array( '0', 'ЗАМЕНИ:', 'ЗАМЕНА:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'БЕЗБЕДНАЗАМЕНА', 'БЕЗБЕДНА_ЗАМЕНА', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'НВПОР:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'мини', 'умањено', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'мини=$1', 'умањено=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'десно', 'д', 'right' ),
-       'img_left'                => array( '1', 'лево', 'л', 'left' ),
-       'img_none'                => array( '1', 'без', 'н', 'none' ),
-       'img_width'               => array( '1', '$1пискел', '$1п', '$1px' ),
-       'img_center'              => array( '1', 'центар', 'ц', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'оквир', 'рам', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'безоквира', 'без_оквира', 'безрама', 'без_рама', 'frameless' ),
-       'img_page'                => array( '1', 'страница=$1', 'страна=$1', 'страница_$1', 'страна_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'усправно', 'усправно=$1', 'усправно_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'ивица', 'border' ),
-       'img_baseline'            => array( '1', 'основа', 'baseline' ),
-       'img_sub'                 => array( '1', 'под', 'sub' ),
-       'img_super'               => array( '1', 'супер', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'врх', 'top' ),
-       'img_text_top'            => array( '1', 'врхтекста', 'врх_текста', 'text-top' ),
-       'img_middle'              => array( '1', 'средина', 'middle' ),
-       'img_bottom'              => array( '1', 'дно', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'срединатекста', 'средина_текста', 'text-bottom' ),
-       'img_link'                => array( '1', 'веза=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'алт=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'ИНТ:', 'INT:' ),
-       'sitename'                => array( '1', 'ИМЕСАЈТА', 'SITENAME' ),
-       'ns'                      => array( '0', 'ИП:', 'NS:' ),
-       'localurl'                => array( '0', 'ЛОКАЛНААДРЕСА:', 'ЛОКАЛНА_АДРЕСА:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ЛОКАЛНЕАДРЕСЕ:', 'ЛОКАЛНЕ_АДРЕСЕ:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'ПУТАЊАЧЛАНКА', 'ПУТАЊА_ЧЛАНКА', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'СЕРВЕР', 'SERVER' ),
-       'servername'              => array( '0', 'ИМЕСЕРВЕРА', 'ИМЕ_СЕРВЕРА', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'СКРИПТА', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'ПУТАЊАСТИЛА', 'ПУТАЊА_СТИЛА', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'ГРАМАТИКА:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'РОД:', 'ЛИЦЕ:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__БЕЗКН__', '__BEZKN__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__БЕЗЦЦ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'ТРЕНУТНАНЕДЕЉА', 'ТРЕНУТНА_НЕДЕЉА', 'ТЕКУЋАНЕДЕЉА', 'ТЕКУЋА_НЕДЕЉА', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ТРЕНУТНИДОВ', 'ТЕКУЋИДУН', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'ЛОКАЛНАНЕДЕЉА', 'ЛОКАЛНА_НЕДЕЉА', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ЛОКАЛНИДУН', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'ИДРЕВИЗИЈЕ', 'ИД_РЕВИЗИЈЕ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ДАНИЗМЕНЕ', 'ДАН_ИЗМЕНЕ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ДАНИЗМЕНЕ2', 'ДАН_ИЗМЕНЕ2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'МЕСЕЦИЗМЕНЕ', 'МЕСЕЦ_ИЗМЕНЕ', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'МЕСЕЦИЗМЕНЕ1', 'МЕСЕЦ_ИЗМЕНЕ1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'ГОДИНАИЗМЕНЕ', 'ГОДИНА_ИЗМЕНЕ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'ВРЕМЕИЗМЕНЕ', 'ВРЕМЕ_ИЗМЕНЕ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'КОРИСНИКИЗМЕНЕ', 'КОРИСНИК_ИЗМЕНЕ', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'МНОЖИНА:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'ПУНУРЛ:', 'ЦЕЛААДРЕСА', 'ЦЕЛА_АДРЕСА', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'ПУНУРЛЕ:', 'ЦЕЛЕАДРЕСЕ', 'ЦЕЛЕ_АДРЕСЕ', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'ЛЦПРВИ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'УЦПРВИ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'ЛЦ:', 'LC:' ),
-       'uc'                      => array( '0', 'УЦ:', 'UC:' ),
-       'raw'                     => array( '0', 'ЧИСТ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'НАЗИВПРИКАЗА', 'НАЗИВ_ПРИКАЗА', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'Р', 'R' ),
-       'newsectionlink'          => array( '1', '__НОВАВЕЗАОДЕЉКА__', '__НОВА_ВЕЗА_ОДЕЉКА__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__БЕЗНОВЕВЕЗЕОДЕЉКА__', '__БЕЗ_НОВЕ_ВЕЗЕ_ОДЕЉКА__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'ТЕКУЋЕИЗДАЊЕ', 'ТЕКУЋЕ_ИЗДАЊЕ', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'КОДИРАЊЕАДРЕСЕ', 'КОДИРАЊЕ_АДРЕСЕ', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'КОДИРАЊЕВЕЗЕ', 'КОДИРАЊЕ_ВЕЗЕ', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'ТЕКУЋИОТИСАКВРЕМЕНА', 'ТЕКУЋИ_ОТИСАК_ВРЕМЕНА', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'ОТИСАКВРЕМЕНА', 'ОТИСАК_ВРЕМЕНА', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'СМЕРОЗНАКЕ', 'СМЕР      _ОЗНАКЕ', 'DIRECTIONMARK', 'DIRMARK' ),
-       'contentlanguage'         => array( '1', 'ЈЕЗИКСАДРЖАЈА', 'ЈЕЗИК_САДРЖАЈА', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'СТРАНИЦАУИМЕНСКОМПРОСТОРУ', 'СТРАНАУИМЕНСКОМПРОСТОРУ', 'СТРАНИЦА_У_ИМЕНСКОМ_ПРОСТОРУ', 'СТРАНА_У_ИМЕНСКОМ_ПРОСТОРУ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'БРОЈАДМИНА', 'БРОЈ_АДМИНА', 'NUMBEROFADMINS' ),
-       'padleft'                 => array( '0', 'ПОРАВНАЈЛЕВО', 'ПОРАВНАЈ_ЛЕВО', 'PADLEFT' ),
-       'padright'                => array( '0', 'ПОРАВНАЈДЕСНО', 'ПОРАВНАЈ_ДЕСНО', 'PADRIGHT' ),
-       'special'                 => array( '0', 'посебно', 'special' ),
-       'filepath'                => array( '0', 'ПУТАЊАДАТОТЕКЕ', 'ПУТАЊА_ДАТОТЕКЕ', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'ознака', 'tag' ),
-       'hiddencat'               => array( '1', '__САКРИВЕНАКАТ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'СТРАНИЦАУКАТЕГОРИЈИ', 'СТРАНАУКАТЕГОРИЈИ', 'СТРАНИЦА_У_КАТЕГОРИЈИ', 'СТРАНА_У_КАТЕГОРИЈИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'ВЕЛИЧИНАСТРАНИЦЕ', 'ВЕЛИЧИНАСТРАНЕ', 'ВЕЛИЧИНА_СТРАНИЦЕ', 'ВЕЛИЧИНА_СТРАНЕ', 'PAGESIZE' ),
-       'index'                   => array( '1', '__ИНДЕКС__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__БЕЗИНДЕКСА__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'БРОЈУГРУПИ', 'БРОЈ_У_ГРУПИ', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__СТАТИЧКОПРЕУСМЕРЕЊЕ__', 'СТАТИЧКО_ПРЕУСМЕРЕЊЕ', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'НИВОЗАШТИТЕ', 'НИВО_ЗАШТИТЕ', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'форматдатума', 'формат_датума', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'ПУТАЊА', 'PATH' ),
-       'url_wiki'                => array( '0', 'ВИКИ', 'WIKI' ),
-       'url_query'               => array( '0', 'РЕДОСЛЕД', 'QUERY' ),
+       'redirect'                  => array( '0', '#Преусмери', '#преусмери', '#ПРЕУСМЕРИ', '#Преусмјери', '#преусмјери', '#ПРЕУСМЈЕРИ', '#redirect', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__БЕЗСАДРЖАЈА__', '__БЕЗ_САДРЖАЈА__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__БЕЗГАЛЕРИЈЕ__', '__БЕЗ_ГАЛЕРИЈЕ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ФОРСИРАНИСАДРЖАЈ__', '__ФОРСИРАНИ_САДРЖАЈ__', '__ПРИМОРАНИСАДРЖАЈ__', '__ПРИМОРАНИ_САДРЖАЈ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__САДРЖАЈ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__БЕЗИЗМЕНА__', '__БЕЗ_ИЗМЕНА__', '__БЕЗИЗМЈЕНА__', '__БЕЗ_ИЗМЈЕНА__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__БЕЗЗАГЛАВЉА__', '__БЕЗ_ЗАГЛАВЉА__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ТРЕНУТНИМЕСЕЦ', 'ТРЕНУТНИ_МЕСЕЦ', 'ТЕКУЋИМЕСЕЦ', 'ТЕКУЋИ_МЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ТРЕНУТНИМЕСЕЦ1', 'ТРЕНУТНИ_МЕСЕЦ1', 'ТЕКУЋИМЕСЕЦ1', 'ТЕКУЋИ_МЕСЕЦ1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'ТРЕНУТНИМЕСЕЦИМЕ', 'ИМЕТЕКУЋЕГМЕСЕЦА', 'ИМЕ_ТЕКУЋЕГ_МЕСЕЦА', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ТРЕНУТНИМЕСЕЦГЕН', 'ТЕКУЋИМЕСЕЦГЕН', 'ТЕКУЋИ_МЕСЕЦ_ГЕН', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'ТРЕНУТНИМЕСЕЦСКР', 'ТЕКУЋИМЕСЕЦСКР', 'ТЕКУЋИ_МЕСЕЦ_СКР', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ТРЕНУТНИДАН', 'ТЕКУЋИДАН', 'ТЕКУЋИ_ДАН', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ТЕКУЋИДАН2', 'ТЕКУЋИ_ДАН_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ТРЕНУТНИДАНИМЕ', 'ИМЕТЕКУЋЕГДАНА', 'ИМЕ_ТЕКУЋЕГ_ДАНА', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ТРЕНУТНАГОДИНА', 'ТЕКУЋАГОДИНА', 'ТЕКУЋА_ГОДИНА', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ТРЕНУТНОВРЕМЕ', 'ТЕКУЋЕВРЕМЕ', 'ТЕКУЋЕ_ВРЕМЕ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ТЕКУЋИСАТ', 'ТЕКУЋИ_САТ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ЛОКАЛНИМЕСЕЦ', 'ЛОКАЛНИ_МЕСЕЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'ЛОКАЛНИМЕСЕЦ2', 'ЛОКАЛНИ_МЕСЕЦ2', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'ИМЕЛОКАЛНОГМЕСЕЦА', 'ИМЕ_ЛОКАЛНОГ_МЕСЕЦА', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'ЛОКАЛНИМЕСЕЦГЕН', 'ЛОКАЛНИ_МЕСЕЦ_ГЕН', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'ЛОКАЛНИМЕСЕЦСКР', 'ЛОКАЛНИ_МЕСЕЦ_СКР', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ЛОКАЛНИДАН', 'ЛОКАЛНИ_ДАН', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ЛОКАЛНИДАН2', 'ЛОКАЛНИ_ДАН2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'ИМЕЛОКАЛНОГДАНА', 'ИМЕ_ЛОКАЛНОГ_ДАНА', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ЛОКАЛНАГОДИНА', 'ЛОКАЛНА_ГОДИНА', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ЛОКАЛНОВРЕМЕ', 'ЛОКАЛНО_ВРЕМЕ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ЛОКАЛНИСАТ', 'ЛОКАЛНИ_САТ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'БРОЈСТРАНИЦА', 'БРОЈ_СТРАНИЦА', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'БРОЈЧЛАНАКА', 'БРОЈ_ЧЛАНАКА', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'БРОЈДАТОТЕКА', 'БРОЈ_ДАТОТЕКА', 'БРОЈФАЈЛОВА', 'БРОЈ_ФАЈЛОВА', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'БРОЈКОРИСНИКА', 'БРОЈ_КОРИСНИКА', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'БРОЈАКТИВНИХКОРИСНИКА', 'БРОЈ_АКТИВНИХ_КОРИСНИКА', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'БРОЈИЗМЕНА', 'БРОЈ_ИЗМЕНА', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'БРОЈПРЕГЛЕДА', 'БРОЈ_ПРЕГЛЕДА', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'ИМЕСТРАНИЦЕ', 'ИМЕ_СТРАНИЦЕ', 'СТРАНИЦА', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'ИМЕНАСТРАНИЦА', 'ИМЕНА_СТРАНИЦА', 'СТРАНИЦЕ', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ИМЕНСКИПРОСТОР', 'ИМЕНСКИ_ПРОСТОР', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ИМЕНСКИПРОСТОРИ', 'ИМЕНСКИ_ПРОСТОРИ', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'РАЗГОВОР', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'РАЗГОВОРИ', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ИМЕНСКИПРОСТОРЧЛАНКА', 'ИМЕНСКИ_ПРОСТОР_ЧЛАНКА', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ИМЕНСКИПРОСТОРЧЛАНАКА', 'ИМЕНСКИ_ПРОСТОР_ЧЛАНАКА', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ПУНОИМЕСТРАНИЦЕ', 'ПУНОИМЕСТРАНЕ', 'ПУНО_ИМЕ_СТРАНИЦЕ', 'ПУНО_ИМЕ_СТРАНЕ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ПУНАИМЕНАСТРАНИЦА', 'ПУНАИМЕНАСТРАНА', 'ПУНА_ИМЕНА_СТРАНИЦА', 'ПУНА_ИМЕНА_СТРАНА', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ИМЕПОДСТРАНИЦЕ', 'ИМЕПОДСТРАНЕ', 'ИМЕ_ПОДСТРАНИЦЕ', 'ИМЕ_ПОДСТРАНЕ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ИМЕНАПОДСТРАНИЦА', 'ИМЕНАПОДСТРАНА', 'ИМЕНА_ПОДСТРАНИЦА', 'ИМЕНА_ПОДСТРАНА', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'ИМЕОСНОВЕ', 'ИМЕ_ОСНОВЕ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'ИМЕНАОСНОВА', 'ИМЕНА_ОСНОВА', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'ИМЕРАЗГОВОРА', 'ИМЕ_РАЗГОВОРА', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'ИМЕНАРАЗГОВОРА', 'ИМЕНА_РАЗГОВОРА', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'ИМЕЧЛАНКА', 'ИМЕ_ЧЛАНКА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'ИМЕНАЧЛАНАКА', 'ИМЕНА_ЧЛАНАКА', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'ПОР:', 'MSG:' ),
+       'subst'                     => array( '0', 'ЗАМЕНИ:', 'ЗАМЕНА:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'БЕЗБЕДНАЗАМЕНА', 'БЕЗБЕДНА_ЗАМЕНА', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'НВПОР:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'мини', 'умањено', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'мини=$1', 'умањено=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'десно', 'д', 'right' ),
+       'img_left'                  => array( '1', 'лево', 'л', 'left' ),
+       'img_none'                  => array( '1', 'без', 'н', 'none' ),
+       'img_width'                 => array( '1', '$1пискел', '$1п', '$1px' ),
+       'img_center'                => array( '1', 'центар', 'ц', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'оквир', 'рам', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'безоквира', 'без_оквира', 'безрама', 'без_рама', 'frameless' ),
+       'img_page'                  => array( '1', 'страница=$1', 'страна=$1', 'страница_$1', 'страна_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'усправно', 'усправно=$1', 'усправно_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'ивица', 'border' ),
+       'img_baseline'              => array( '1', 'основа', 'baseline' ),
+       'img_sub'                   => array( '1', 'под', 'sub' ),
+       'img_super'                 => array( '1', 'супер', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'врх', 'top' ),
+       'img_text_top'              => array( '1', 'врхтекста', 'врх_текста', 'text-top' ),
+       'img_middle'                => array( '1', 'средина', 'middle' ),
+       'img_bottom'                => array( '1', 'дно', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'срединатекста', 'средина_текста', 'text-bottom' ),
+       'img_link'                  => array( '1', 'веза=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'алт=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'ИНТ:', 'INT:' ),
+       'sitename'                  => array( '1', 'ИМЕСАЈТА', 'SITENAME' ),
+       'ns'                        => array( '0', 'ИП:', 'NS:' ),
+       'localurl'                  => array( '0', 'ЛОКАЛНААДРЕСА:', 'ЛОКАЛНА_АДРЕСА:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ЛОКАЛНЕАДРЕСЕ:', 'ЛОКАЛНЕ_АДРЕСЕ:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'ПУТАЊАЧЛАНКА', 'ПУТАЊА_ЧЛАНКА', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'СЕРВЕР', 'SERVER' ),
+       'servername'                => array( '0', 'ИМЕСЕРВЕРА', 'ИМЕ_СЕРВЕРА', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'СКРИПТА', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'ПУТАЊАСТИЛА', 'ПУТАЊА_СТИЛА', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'ГРАМАТИКА:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'РОД:', 'ЛИЦЕ:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__БЕЗКН__', '__BEZKN__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__БЕЗЦЦ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'ТРЕНУТНАНЕДЕЉА', 'ТРЕНУТНА_НЕДЕЉА', 'ТЕКУЋАНЕДЕЉА', 'ТЕКУЋА_НЕДЕЉА', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ТРЕНУТНИДОВ', 'ТЕКУЋИДУН', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'ЛОКАЛНАНЕДЕЉА', 'ЛОКАЛНА_НЕДЕЉА', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ЛОКАЛНИДУН', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'ИДРЕВИЗИЈЕ', 'ИД_РЕВИЗИЈЕ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ДАНИЗМЕНЕ', 'ДАН_ИЗМЕНЕ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ДАНИЗМЕНЕ2', 'ДАН_ИЗМЕНЕ2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'МЕСЕЦИЗМЕНЕ', 'МЕСЕЦ_ИЗМЕНЕ', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'МЕСЕЦИЗМЕНЕ1', 'МЕСЕЦ_ИЗМЕНЕ1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'ГОДИНАИЗМЕНЕ', 'ГОДИНА_ИЗМЕНЕ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'ВРЕМЕИЗМЕНЕ', 'ВРЕМЕ_ИЗМЕНЕ', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'КОРИСНИКИЗМЕНЕ', 'КОРИСНИК_ИЗМЕНЕ', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'МНОЖИНА:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'ПУНУРЛ:', 'ЦЕЛААДРЕСА', 'ЦЕЛА_АДРЕСА', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ПУНУРЛЕ:', 'ЦЕЛЕАДРЕСЕ', 'ЦЕЛЕ_АДРЕСЕ', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'ЛЦПРВИ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'УЦПРВИ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'ЛЦ:', 'LC:' ),
+       'uc'                        => array( '0', 'УЦ:', 'UC:' ),
+       'raw'                       => array( '0', 'ЧИСТ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'НАЗИВПРИКАЗА', 'НАЗИВ_ПРИКАЗА', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'Р', 'R' ),
+       'newsectionlink'            => array( '1', '__НОВАВЕЗАОДЕЉКА__', '__НОВА_ВЕЗА_ОДЕЉКА__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__БЕЗНОВЕВЕЗЕОДЕЉКА__', '__БЕЗ_НОВЕ_ВЕЗЕ_ОДЕЉКА__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'ТЕКУЋЕИЗДАЊЕ', 'ТЕКУЋЕ_ИЗДАЊЕ', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'КОДИРАЊЕАДРЕСЕ', 'КОДИРАЊЕ_АДРЕСЕ', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'КОДИРАЊЕВЕЗЕ', 'КОДИРАЊЕ_ВЕЗЕ', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'ТЕКУЋИОТИСАКВРЕМЕНА', 'ТЕКУЋИ_ОТИСАК_ВРЕМЕНА', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'ОТИСАКВРЕМЕНА', 'ОТИСАК_ВРЕМЕНА', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'СМЕРОЗНАКЕ', 'СМЕР    _ОЗНАКЕ', 'DIRECTIONMARK', 'DIRMARK' ),
+       'contentlanguage'           => array( '1', 'ЈЕЗИКСАДРЖАЈА', 'ЈЕЗИК_САДРЖАЈА', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'СТРАНИЦАУИМЕНСКОМПРОСТОРУ', 'СТРАНАУИМЕНСКОМПРОСТОРУ', 'СТРАНИЦА_У_ИМЕНСКОМ_ПРОСТОРУ', 'СТРАНА_У_ИМЕНСКОМ_ПРОСТОРУ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'БРОЈАДМИНА', 'БРОЈ_АДМИНА', 'NUMBEROFADMINS' ),
+       'padleft'                   => array( '0', 'ПОРАВНАЈЛЕВО', 'ПОРАВНАЈ_ЛЕВО', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ПОРАВНАЈДЕСНО', 'ПОРАВНАЈ_ДЕСНО', 'PADRIGHT' ),
+       'special'                   => array( '0', 'посебно', 'special' ),
+       'filepath'                  => array( '0', 'ПУТАЊАДАТОТЕКЕ', 'ПУТАЊА_ДАТОТЕКЕ', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'ознака', 'tag' ),
+       'hiddencat'                 => array( '1', '__САКРИВЕНАКАТ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'СТРАНИЦАУКАТЕГОРИЈИ', 'СТРАНАУКАТЕГОРИЈИ', 'СТРАНИЦА_У_КАТЕГОРИЈИ', 'СТРАНА_У_КАТЕГОРИЈИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'ВЕЛИЧИНАСТРАНИЦЕ', 'ВЕЛИЧИНАСТРАНЕ', 'ВЕЛИЧИНА_СТРАНИЦЕ', 'ВЕЛИЧИНА_СТРАНЕ', 'PAGESIZE' ),
+       'index'                     => array( '1', '__ИНДЕКС__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__БЕЗИНДЕКСА__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'БРОЈУГРУПИ', 'БРОЈ_У_ГРУПИ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__СТАТИЧКОПРЕУСМЕРЕЊЕ__', 'СТАТИЧКО_ПРЕУСМЕРЕЊЕ', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'НИВОЗАШТИТЕ', 'НИВО_ЗАШТИТЕ', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'форматдатума', 'формат_датума', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'ПУТАЊА', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ВИКИ', 'WIKI' ),
+       'url_query'                 => array( '0', 'РЕДОСЛЕД', 'QUERY' ),
 );
 $separatorTransformTable = array( ',' => '.', '.' => ',' );
 
@@ -406,7 +401,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Сакриј прегледане измене у списку скорашњих измена',
 'tog-newpageshidepatrolled' => 'Сакриј прегледане странице са списка нових страница',
 'tog-extendwatchlist' => 'Прошири списак надгледања за приказ свих измена, не само скорашњих',
-'tog-usenewrc' => 'Побољшани списак скорашњих измена (јаваскрипт)',
+'tog-usenewrc' => 'Промене у групи по страници у списку скорашњих измена и надгледаних страница (захтева јаваскрипт)',
 'tog-numberheadings' => 'Самостално нумериши поднаслове',
 'tog-showtoolbar' => 'Трака с алаткама за уређивање (јаваскрипт)',
 'tog-editondblclick' => 'Уређивање страница двоструким кликом (јаваскрипт)',
@@ -414,17 +409,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Уређивање одељака десним кликом на њихове наслове (јаваскрипт)',
 'tog-showtoc' => 'Прикажи садржај страница које имају више од три поднаслова',
 'tog-rememberpassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
-'tog-watchcreations' => 'Додај странице које направим у списак надгледања',
-'tog-watchdefault' => 'Додај странице које изменим у списак надгледања',
-'tog-watchmoves' => 'Додај странице које преместим у списак надгледања',
-'tog-watchdeletion' => 'Додај странице које обришем у списак надгледања',
+'tog-watchcreations' => 'Додај странице које направим и датотеке које пошаљем у списак надгледања',
+'tog-watchdefault' => 'Ð\94одаÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¸ Ð´Ð°Ñ\82оÑ\82еке ÐºÐ¾Ñ\98е Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð¼ Ñ\83 Ñ\81пиÑ\81ак Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа',
+'tog-watchmoves' => 'Ð\94одаÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¸ Ð´Ð°Ñ\82оÑ\82еке ÐºÐ¾Ñ\98е Ð¿Ñ\80емеÑ\81Ñ\82им Ñ\83 Ñ\81пиÑ\81ак Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа',
+'tog-watchdeletion' => 'Ð\94одаÑ\98 Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¸ Ð´Ð°Ñ\82оÑ\82еке ÐºÐ¾Ñ\98е Ð¾Ð±Ñ\80иÑ\88ем Ñ\83 Ñ\81пиÑ\81ак Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа',
 'tog-minordefault' => 'Означавај све измене као мање',
 'tog-previewontop' => 'Прикажи преглед пре оквира за уређивање',
 'tog-previewonfirst' => 'Прикажи преглед на првој измени',
 'tog-nocache' => 'Онемогући привремено меморисање страница',
-'tog-enotifwatchlistpages' => 'Пошаљи ми е-поруку када се промени страница коју надгледам',
+'tog-enotifwatchlistpages' => 'Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 ÐºÐ°Ð´Ð° Ñ\81е Ð¿Ñ\80омени Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð»Ð¸ Ð´Ð°Ñ\82оÑ\82ека ÐºÐ¾Ñ\98Ñ\83 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ð¼',
 'tog-enotifusertalkpages' => 'Пошаљи ми е-поруку када се промени моја страница за разговор',
-'tog-enotifminoredits' => 'Пошаљи ми е-поруку и за мање измене',
+'tog-enotifminoredits' => 'Пошаљи ми е-поруку и за мање измене у страницама и датотекама',
 'tog-enotifrevealaddr' => 'Откриј моју е-адресу у порукама обавештења',
 'tog-shownumberswatching' => 'Прикажи број корисника који надгледају',
 'tog-oldsig' => 'Текући потпис:',
@@ -440,7 +435,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Сакриј измене пријављених корисника са списка надгледања',
 'tog-watchlisthideanons' => 'Сакриј измене анонимних корисника са списка надгледања',
 'tog-watchlisthidepatrolled' => 'Сакриј прегледане измене са списка надгледања',
-'tog-nolangconversion' => 'Онемогући претварање писама',
 'tog-ccmeonemails' => 'Пошаљи ми примерке е-порука које пошаљем другим корисницима',
 'tog-diffonly' => 'Не приказуј садржај странице испод разлика',
 'tog-showhiddencats' => 'Прикажи скривене категорије',
@@ -669,7 +663,11 @@ $1',
 'retrievedfrom' => 'Преузето из „$1“',
 'youhavenewmessages' => 'Имате $1 ($2).',
 'newmessageslink' => 'нових порука',
-'newmessagesdifflink' => 'последња измена',
+'newmessagesdifflink' => 'последњу измену',
+'youhavenewmessagesfromusers' => 'Имате $1 од {{PLURAL:$3|другог корисника|$3 корисника|$3 корисника}} ($2).',
+'youhavenewmessagesmanyusers' => 'Имате $1 од много корисника ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|нову поруку|нове поруке}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|последњу измену|последње измене}}',
 'youhavenewmessagesmulti' => 'Имате нових порука на $1',
 'editsection' => 'уреди',
 'editsection-brackets' => '[$1]',
@@ -727,9 +725,9 @@ $1',
 'dberrortext' => 'Дошло је до синтактичке грешке у бази.
 Можда се ради о грешци у софтверу.
 Последњи покушај упита је гласио:
-<blockquote><tt>$1</tt></blockquote>
-унутар функције „<tt>$2</tt>“.
-База података је пријавила грешку „<tt>$3: $4</tt>“.',
+<blockquote><code>$1</code></blockquote>
+унутар функције „<code>$2</code>“.
+База података је пријавила грешку „<samp>$3: $4</samp>“.',
 'dberrortextcl' => 'Дошло је до синтактичке грешке у бази.
 Последњи покушај упита је гласио:
 „$1“
@@ -766,6 +764,8 @@ $1',
 'cannotdelete' => 'Не могу да обришем страницу или датотеку „$1“.
 Вероватно ју је неко други обрисао.',
 'cannotdelete-title' => 'Не могу да обришем страницу „$1“',
+'delete-hook-aborted' => 'Брисање је прекинула кука.
+Није дато никакво образложење.',
 'badtitle' => 'Неисправан наслов',
 'badtitletext' => 'Наслов странице је неисправан, празан или је међујезички или међувики наслов погрешно повезан.
 Можда садржи знакове који се не могу користити у насловима.',
@@ -801,6 +801,8 @@ $2',
 Администратор који ју је закључао понудио је следеће објашњење: „$3“.',
 'invalidtitle-knownnamespace' => 'Неисправан наслов с именским простором „$2“ и текстом „$3“',
 'invalidtitle-unknownnamespace' => 'Неисправан наслов с именским простором бр. $1 и текстом „$2“',
+'exception-nologin' => 'Нисте пријављени',
+'exception-nologin-text' => 'Ова страница или радња захтева да будете пријављени на вики.',
 
 # Virus scanner
 'virus-badscanner' => "Неисправна поставка: непознати скенер за вирусе: ''$1''",
@@ -822,6 +824,7 @@ $2',
 'remembermypassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
 'securelogin-stick-https' => 'Останите повезани са HTTPS након пријаве',
 'yourdomainname' => 'Домен:',
+'password-change-forbidden' => 'Не можете да промените лозинку на овом викију.',
 'externaldberror' => 'Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате свој спољни налог.',
 'login' => 'Пријави ме',
 'nav-login-createaccount' => 'Пријава/регистрација',
@@ -1003,7 +1006,7 @@ $2
 'watchthis' => 'надгледај ову страницу',
 'savearticle' => 'Сачувај страницу',
 'preview' => 'Преглед',
-'showpreview' => 'Ð\9fÑ\80икажи Ð¿Ñ\80еÑ\82пÑ\80еглед',
+'showpreview' => 'Ð\9fÑ\80егледаÑ\98',
 'showlivepreview' => 'Тренутни преглед',
 'showdiff' => 'Прикажи измене',
 'anoneditwarning' => "'''Упозорење:''' нисте пријављени.
@@ -1072,6 +1075,10 @@ $2
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} уредити страницу]</span>.',
 'noarticletext-nopermission' => 'На овој страници тренутно нема садржаја.
 Можете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама или <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје]</span>.',
+'missing-revision' => 'Не могу да пронађем измену бр. $1 на страници под називом „{{PAGENAME}}“.
+
+Ово се обично дешава када пратите застарелу везу до странице која је обрисана.
+Више информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].',
 'userpage-userdoesnotexist' => 'Кориснички налог „<nowiki>$1</nowiki>“ није отворен.
 Размислите да ли заиста желите да направите или уредите ову страницу.',
 'userpage-userdoesnotexist-view' => 'Кориснички налог „$1“ није отворен.',
@@ -1081,7 +1088,6 @@ $2
 *'''Фајерфокс и Сафари:''' држите ''Shift'' и кликните на ''Освежи'', или притисните ''Ctrl-F5'' или Ctrl-R (''⌘-R'' на Макинтошу)
 *'''Гугл кроум:''' притисните ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Макинтошу)
 *'''Интернет експлорер: '''држите ''Ctrl'' и кликните на ''Освежи'', или притисните ''Ctrl-F5''
-*'''К-освајач: '''кликните на ''Освежи'' или притисните ''F5''
 *'''Опера:''' очистите привремену меморију преко менија ''Алатке → Поставке''.",
 'usercssyoucanpreview' => "'''Савет:''' кориситите дугме „{{int:showpreview}}“ да испробате свој нови CSS пре него што га сачувате.",
 'userjsyoucanpreview' => "'''Савет:''' кориситите дугме „{{int:showpreview}}“ да испробате свој нови јаваскрипт пре него што га сачувате.",
@@ -1166,7 +1172,7 @@ $2
 'sectioneditnotsupported-text' => 'Уређивање одељка није подржано на овој страници.',
 'permissionserrors' => 'Грешке у дозволама',
 'permissionserrorstext' => 'Немате овлашћење за ту радњу из {{PLURAL:$1|следећег|следећих}} разлога:',
-'permissionserrorstext-withaction' => 'Ð\9dемаÑ\82е Ð¾Ð²Ð»Ð°Ñ\88Ñ\9bеÑ\9aа Ð·Ð° $2 Ð·Ð±Ð¾Ð³ {{PLURAL:$1|следећег|следећих}} разлога:',
+'permissionserrorstext-withaction' => 'Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´Ð° $2 Ð¸Ð· {{PLURAL:$1|следећег|следећих}} разлога:',
 'recreate-moveddeleted-warn' => "'''Упозорење: поново правите страницу која је претходно обрисана.'''
 
 Размотрите да ли је прикладно да наставите с уређивањем ове странице.
@@ -1174,8 +1180,8 @@ $2
 'moveddeleted-notice' => 'Ова страница је обрисана.
 Историја њеног брисања и премештања налази се испод:',
 'log-fulllog' => 'Погледај целу историју',
-'edit-hook-aborted' => 'Измена је прекинута куком.
\9eбÑ\80азложеÑ\9aе Ð½Ð¸Ñ\98е Ð¿Ð¾Ð½Ñ\83Ñ\92ено.',
+'edit-hook-aborted' => 'Измену је прекинула кука.
\9dиÑ\98е Ð´Ð°Ñ\82о Ð½Ð¸ÐºÐ°ÐºÐ²Ð¾ Ð¾Ð±Ñ\80азложеÑ\9aе.',
 'edit-gone-missing' => 'Не могу да ажурирам страницу.
 Изгледа да је обрисана.',
 'edit-conflict' => 'Сукоб измена.',
@@ -1204,6 +1210,7 @@ $2
 'expansion-depth-exceeded-warning' => 'Страница у којој је прекорачена дубина проширења',
 'parser-unstrip-loop-warning' => 'Утврђена је петља',
 'parser-unstrip-recursion-limit' => 'Прекорачено је ограничење рекурзије ($1)',
+'converter-manual-rule-error' => 'Пронађена је грешка у правилу за ручно претварање језика',
 
 # "Undo" feature
 'undo-success' => 'Измена се може вратити.
@@ -1383,8 +1390,8 @@ $1",
 'mergelogpagetext' => 'Испод се налази списак скорашњих спајања историја страница.',
 
 # Diffs
-'history-title' => 'Историја измена за „$1“',
-'difference-title' => 'Разлика између измена странице „$1“',
+'history-title' => 'Историја измена странице „$1“',
+'difference-title' => 'Разлика између измена на страници „$1“',
 'difference-title-multipage' => 'Разлика између страница „$1“ и „$2“',
 'difference-multipage' => '(разлике између страница)',
 'lineno' => 'Ред $1:',
@@ -1393,6 +1400,10 @@ $1",
 'editundo' => 'поништи',
 'diff-multi' => '({{PLURAL:$1|није приказана међуизмена|нису приказане $1 међуизмене|није приказано $1 међуизмена}} {{PLURAL:$2|једног|$2|$2}} корисника)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Није приказана међуизмена|Нису приказане $1 међуизмене|Није приказано $1 међуизмена}} од више од $2 корисника)',
+'difference-missing-revision' => 'Не могу да пронађем {{PLURAL:$2|једну измену|$2 измене|$2 измена}} од ове разлике ($1).
+
+Ово се обично дешава када пратите застарелу везу до странице која је обрисана.
+Више информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].',
 
 # Search results
 'searchresults' => 'Резултати претраге',
@@ -1483,6 +1494,7 @@ $1",
 'prefs-beta' => 'Бета могућности',
 'prefs-datetime' => 'Датум и време',
 'prefs-labs' => 'Пробне могућности',
+'prefs-user-pages' => 'Корисничке странице',
 'prefs-personal' => 'Профил',
 'prefs-rc' => 'Скорашње измене',
 'prefs-watchlist' => 'Списак надгледања',
@@ -1666,6 +1678,7 @@ $1",
 'right-writeapi' => 'писање АПИ-ја',
 'right-delete' => 'брисање страница',
 'right-bigdelete' => 'брисање страница с великом историјом',
+'right-deletelogentry' => 'Брисање и враћање одређених ставки у дневнику',
 'right-deleterevision' => 'брисање и враћање одређених измена страница',
 'right-deletedhistory' => 'прегледање обрисаних ставки историје без повезаног текста',
 'right-deletedtext' => 'прегледање обрисаног текста и измена између обрисаних измена',
@@ -1674,7 +1687,7 @@ $1",
 'right-suppressrevision' => 'прегледање и враћање измена које су сакривене од стране администратора',
 'right-suppressionlog' => 'гледање приватних дневника',
 'right-block' => 'блокирање даљих измена других корисника',
-'right-blockemail' => 'блокиÑ\80аÑ\9aе ÐºÐ¾Ñ\80иÑ\81ника да шаљу е-поруке',
+'right-blockemail' => 'онемогÑ\83Ñ\9bаваÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\86има да шаљу е-поруке',
 'right-hideuser' => 'блокирање корисничког имена и његово сакривање од јавности',
 'right-ipblock-exempt' => 'заобилажење блокирања IP адресе, самоблокирања и блокирања опсега',
 'right-proxyunbannable' => 'заобилажење самоблокирања посредника',
@@ -1812,9 +1825,9 @@ $1",
 За преглед или претрагу постојећих датотека, погледајте [[Special:FileList|списак отпремљених датотека]], поновна отпремања су наведена у [[Special:Log/upload|дневнику отпремања]], а брисања у [[Special:Log/delete|дневнику брисања]].
 
 Датотеку додајете на жељену страницу користећи следеће обрасце:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Слика.jpg]]</nowiki></tt>''' за верзију слике у пуној величини
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Слика.png|200п|мини|лево|опис]]</nowiki></tt>''' за верзију слике с величином од 200 пиксела која је приказана у засебном оквиру, заједно с описом.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Датотека.ogg]]</nowiki></tt>''' за директно повезивање с датотеком без њеног приказивања",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Слика.jpg]]</nowiki></code>''' за верзију слике у пуној величини
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Слика.png|200п|мини|лево|опис]]</nowiki></code>''' за верзију слике с величином од 200 пиксела која је приказана у засебном оквиру, заједно с описом.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Датотека.ogg]]</nowiki></code>''' за директно повезивање с датотеком без њеног приказивања",
 'upload-permitted' => 'Дозвољене врсте датотека: $1.',
 'upload-preferred' => 'Пожељне врсте датотека: $1.',
 'upload-prohibited' => 'Забрањене врсте датотека: $1.',
@@ -1861,21 +1874,21 @@ $1",
 Узрок може бити грешка у називу датотеке.
 Проверите да ли заиста желите да је пошаљете.',
 'windows-nonascii-filename' => 'Овај вики не подржава називе датотека с посебним знацима.',
-'fileexists' => "Датотека с овим називом већ постоји. Погледајте '''<tt>[[:$1]]</tt>''' ако нисте сигурни да ли желите да је промените.
-[[$1|thumb]]",
-'filepageexists' => "Страница с описом ове датотеке је већ направљена овде '''<tt>[[:$1]]</tt>''', иако датотека не постоји.
+'fileexists' => 'Датотека с овим називом већ постоји. Погледајте <strong>[[:$1]]</strong> ако нисте сигурни да ли желите да је промените.
+[[$1|thumb]]',
+'filepageexists' => 'Страница с описом ове датотеке је већ направљена овде <strong>[[:$1]]</strong>, иако датотека не постоји.
 Опис који сте навели се неће појавити на страници с описом.
 Да би се ваш опис овде нашао, потребно је да га ручно измените.
-[[$1|thumb]]",
-'fileexists-extension' => "Датотека са сличним називом већ постоји: [[$2|thumb]]
-* Назив датотеке коју шаљете: '''<tt>[[:$1]]</tt>'''
-* Назив постојеће датотеке: '''<tt>[[:$2]]</tt>'''
-Изаберите другачији назив.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Датотека са сличним називом већ постоји: [[$2|thumb]]
+* Назив датотеке коју шаљете: <strong>[[:$1]]</strong>
+* Назив постојеће датотеке: <strong>[[:$2]]</strong>
+Изаберите другачији назив.',
 'fileexists-thumbnail-yes' => "Изгледа да је датотека умањено издање слике ''(thumbnail)''.
 [[$1|thumb]]
-Проверите датотеку '''<tt>[[:$1]]</tt>'''.
+Проверите датотеку <strong>[[:$1]]</strong>.
 Ако је проверена датотека иста слика оригиналне величине, није потребно слати додатну слику.",
-'file-thumbnail-no' => "Датотека почиње са '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Датотека почиње са <strong>$1</strong>.
 Изгледа да се ради о умањеној слици ''(thumbnail)''.
 Уколико имате ову слику у пуној величини, пошаљите је, а ако немате, промените назив датотеке.",
 'fileexists-forbidden' => 'Датотека с овим називом већ постоји и не може се заменити.
@@ -1968,14 +1981,15 @@ $1',
 'backend-fail-writetemp' => 'Не могу да пишем у привременој датотеци.',
 'backend-fail-closetemp' => 'Не могу да затворим привремену датотеку.',
 'backend-fail-read' => 'Не могу да прочитам датотеку $1.',
-'backend-fail-create' => 'Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим датотеку $1.',
-'backend-fail-maxsize' => 'Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим датотеку $1 јер је већа од {{PLURAL:$2|$2 бајта|$2 бајта|$2 бајтова}}.',
+'backend-fail-create' => 'Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88ем датотеку $1.',
+'backend-fail-maxsize' => 'Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88ем датотеку $1 јер је већа од {{PLURAL:$2|$2 бајта|$2 бајта|$2 бајтова}}.',
 'backend-fail-readonly' => 'Складишна основа „$1“ тренутно не може да се записује. Наведени разлог гласи: „$2“',
 'backend-fail-synced' => 'Датотека „$1“ је недоследна између унутрашњих складишних основа',
 'backend-fail-connect' => 'Не могу да се повежем са складишном основом „$1“.',
 'backend-fail-internal' => 'Дошло је до непознате грешке у складишној основи „$1“.',
 'backend-fail-contenttype' => 'Не могу да утврдим какав садржај има датотека коју треба да сместим у „$1“.',
 'backend-fail-batchsize' => 'Складишна основа је добила блокаду од $1 {{PLURAL:$1|операције|операције|операција}}; ограничење је $2 {{PLURAL:$2|операција|операције|операција}}.',
+'backend-fail-usable' => 'Не могу да запишем датотеку $1 јер немате довољно дозвола или вам недостају фасцикле/садржаоци.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не могу да се повежем с новинарском базом за складишну основу „$1“.',
@@ -1990,6 +2004,7 @@ $1',
 'lockmanager-fail-releaselock' => 'Не могу да ослободим катанац за „$1“.',
 'lockmanager-fail-db-bucket' => 'Не могу да контактирам с довољно катанаца у канти $1.',
 'lockmanager-fail-db-release' => 'Не могу да ослободим катанце у бази $1.',
+'lockmanager-fail-svr-acquire' => 'Не могу да добијем катанце на серверу $1.',
 'lockmanager-fail-svr-release' => 'Не могу да ослободим катанце на серверу $1.',
 
 # ZipDirectoryReader
@@ -2111,6 +2126,7 @@ $1',
 'shared-repo' => 'заједничко складиште',
 'shared-repo-name-wikimediacommons' => 'Викимедијина остава',
 'filepage.css' => '/* CSS који је постављен овде се налази на страницама за опис датотека, као и на страним викијима */',
+'upload-disallowed-here' => 'Нажалост, не можете да замените ову слику.',
 
 # File reversion
 'filerevert' => 'Врати $1',
@@ -2145,7 +2161,7 @@ $1',
 # MIME search
 'mimesearch' => 'MIME претрага',
 'mimesearch-summary' => 'Ова страница омогућава филтрирање датотека према њиховим врстама MIME.
-Улазни подаци: contenttype/subtype, нпр. <tt>image/jpeg</tt>.',
+Улазни подаци: contenttype/subtype, нпр. <code>image/jpeg</code>.',
 'mimetype' => 'MIME врста:',
 'download' => 'преузми',
 
@@ -2192,9 +2208,9 @@ $1',
 
 'disambiguations' => 'Странице до вишезначних одредница',
 'disambiguationspage' => 'Template:Вишезначна одредница',
-'disambiguations-text' => "Следеће странице су повезане с '''вишезначном одредницом'''.
\9eне Ð±Ð¸ Ñ\82Ñ\80ебало Ð±Ð¸Ñ\82и Ñ\83пÑ\83Ñ\9bене ÐºÐ° Ð¾Ð´Ð³Ð¾Ð²Ð°Ñ\80аÑ\98Ñ\83Ñ\9bем Ñ\87ланкÑ\83.
-Страница се сматра вишезначном одредницом ако користи шаблон који је повезан са списком [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Следеће странице садрже бар једну везу до '''вишезначне одреднице'''.
£Ð¼ÐµÑ\81Ñ\82о Ñ\82ога, Ð²Ð°Ñ\99ало Ð±Ð¸ Ð´Ð° Ð²Ð¾Ð´Ðµ Ð´Ð¾ Ð¾Ð´Ð³Ð¾Ð²Ð°Ñ\80аÑ\98Ñ\83Ñ\9bе Ñ\82еме.
+Страница се сматра вишезначном одредницом ако користи шаблон који води од [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Двострука преусмерења',
 'doubleredirectstext' => 'Ова страница приказује странице које преусмеравају на друга преусмерења.
@@ -2220,6 +2236,7 @@ $1',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|бајт|бајта|бајтова}}',
 'ncategories' => '$1 {{PLURAL:$1|категорија|категорије|категорија}}',
+'ninterwikis' => '$1 {{PLURAL:$1|међувики|међувикија|међувикија}}',
 'nlinks' => '$1 {{PLURAL:$1|веза|везе|веза}}',
 'nmembers' => '$1 {{PLURAL:$1|члан|члана|чланова}}',
 'nrevisions' => '$1 {{PLURAL:$1|измена|измене|измена}}',
@@ -2248,6 +2265,7 @@ $1',
 'mostlinkedtemplates' => 'Шаблони с највише веза',
 'mostcategories' => 'Чланци с највише категорија',
 'mostimages' => 'Датотеке с највише веза',
+'mostinterwikis' => 'Странице са највише међувикија',
 'mostrevisions' => 'Странице с највише измена',
 'prefixindex' => 'Све странице с префиксом',
 'prefixindex-namespace' => 'Све странице с предметком (именски простор $1)',
@@ -2302,6 +2320,7 @@ $1',
 Можете сузити приказ одабирући врсту историје, корисничког имена или тражене странице.',
 'logempty' => 'Нема пронађених ставки у историји.',
 'log-title-wildcard' => 'тражи наслове који почињу с овим текстом',
+'showhideselectedlogentries' => 'Прикажи/сакриј изабране записе',
 
 # Special:AllPages
 'allpages' => 'Све странице',
@@ -2348,7 +2367,7 @@ $1',
 'linksearch-ok' => 'Претражи',
 'linksearch-text' => 'Могу се користити џокери попут „*.wikipedia.org“.<br />
 Потребан је највиши домен, као „*.org“.<br />
-Подржани протоколи: <tt>$1</tt> (не стављајте у претрагу)',
+Подржани протоколи: <code>$1</code> (не стављајте у претрагу)',
 'linksearch-line' => '$1 веза у $2',
 'linksearch-error' => 'Џокери се могу појавити само на почетку адресе.',
 
@@ -2381,8 +2400,8 @@ $1',
 'listgrouprights-rights' => 'Права',
 'listgrouprights-helppage' => 'Help:Права групе',
 'listgrouprights-members' => '(списак чланова)',
-'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
-'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
+'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <code>($2)</code></span>',
+'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <code>($2)</code></span>',
 'listgrouprights-addgroup' => 'додаје {{PLURAL:$2|следећу групу|следеће групе}}: $1',
 'listgrouprights-removegroup' => 'брише {{PLURAL:$2|следећу групу|следеће групе}}: $1',
 'listgrouprights-addgroup-all' => 'додавање свих група',
@@ -2396,6 +2415,8 @@ $1',
 'mailnologin' => 'Нема адресе за слање',
 'mailnologintext' => 'Морате бити [[Special:UserLogin|пријављени]] и имати исправну е-адресу у [[Special:Preferences|подешавањима]] да бисте слали е-поруке другим корисницима.',
 'emailuser' => 'Пошаљи е-поруку',
+'emailuser-title-target' => 'Слање е-поруке {{GENDER:$1|кориснику|корисници|кориснику}}',
+'emailuser-title-notarget' => 'Слање е-поруке кориснику',
 'emailpage' => 'Слање е-порука',
 'emailpagetext' => 'Користите овај образац да пошаљете е-поруку овом кориснику.
 Е-адреса коју сте унели у [[Special:Preferences|подешавањима]] ће бити приказана као адреса пошиљаоца, тако да ће прималац поруке моћи да вам одговори.',
@@ -2525,7 +2546,7 @@ $UNWATCHURL
 Погледајте ''$2'' за више детаља.",
 'dellogpage' => 'Дневник брисања',
 'dellogpagetext' => 'Испод је списак последњих брисања.',
-'deletionlog' => 'Ð\94невник брисања',
+'deletionlog' => 'дневник брисања',
 'reverted' => 'Враћено на ранију измену',
 'deletecomment' => 'Разлог:',
 'deleteotherreason' => 'Други/додатни разлог:',
@@ -2544,6 +2565,8 @@ $UNWATCHURL
 'rollback' => 'Врати измене',
 'rollback_short' => 'Врати',
 'rollbacklink' => 'врати',
+'rollbacklinkcount' => 'врати $1 {{PLURAL:$1|измену|измене|измена}}',
+'rollbacklinkcount-morethan' => 'врати више од $1 {{PLURAL:$1|измене|измене|измена}}',
 'rollbackfailed' => 'Неуспешно враћање',
 'cantrollback' => 'Не могу да вратим измену.
 Последњи аутор је уједно и једини.',
@@ -2740,7 +2763,7 @@ $1',
 # Block/unblock
 'autoblockid' => 'Самоблокирање #$1',
 'block' => 'Блокирај корисника',
-'unblock' => 'Ð\9eдблокирај корисника',
+'unblock' => 'Ð\94еблокирај корисника',
 'blockip' => 'Блокирај корисника',
 'blockip-title' => 'Блокирање корисника',
 'blockip-legend' => 'Блокирај корисника',
@@ -2761,7 +2784,7 @@ $1',
 ** Неприхватљиво корисничко име',
 'ipb-hardblock' => 'Забрани пријављеним корисницима да уређују с ове ИП адресе',
 'ipbcreateaccount' => 'Онемогући отварање налога',
-'ipbemailban' => 'Ð\97абÑ\80ани ÐºÐ¾Ñ\80иÑ\81никÑ\83 Ñ\81лаÑ\9aе Ðµ-поÑ\80Ñ\83ка',
+'ipbemailban' => 'Ð\9eнемогÑ\83Ñ\9bи ÐºÐ¾Ñ\80иÑ\81никÑ\83 Ð´Ð° Ñ\88аÑ\99е Ðµ-поÑ\80Ñ\83ке',
 'ipbenableautoblock' => 'Аутоматски блокирај последњу ИП адресу овог корисника и све даљње адресе с којих покуша да уређује',
 'ipbsubmit' => 'Блокирај овог корисника',
 'ipbother' => 'Друго време:',
@@ -2780,11 +2803,11 @@ $1',
 'ipb-blockingself' => 'Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?',
 'ipb-confirmhideuser' => 'Управо ћете блокирати корисника с укљученом могућношћу „сакриј корисника“. Овим ће корисничко име бити сакривено у свим списковима и извештајима. Желите ли то да урадите?',
 'ipb-edit-dropdown' => 'Уреди разлоге блокирања',
-'ipb-unblock-addr' => 'Ð\9eдблокирај $1',
-'ipb-unblock' => 'Ð\9eдблокирај корисничко име или ИП адресу',
+'ipb-unblock-addr' => 'Ð\94еблокирај $1',
+'ipb-unblock' => 'Ð\94еблокирај корисничко име или ИП адресу',
 'ipb-blocklist' => 'Погледај постојећа блокирања',
 'ipb-blocklist-contribs' => 'Доприноси за $1',
-'unblockip' => 'Ð\9eдблокирај корисника',
+'unblockip' => 'Ð\94еблокирај корисника',
 'unblockiptext' => 'Користите образац испод да бисте вратили право писања блокираној IP адреси или корисничком имену.',
 'ipusubmit' => 'Уклони ову блокаду',
 'unblocked' => '[[User:$1|$1]] је деблокиран',
@@ -2816,7 +2839,7 @@ $1',
 'ipblocklist-empty' => 'Списак блокирања је празан.',
 'ipblocklist-no-results' => 'Тражена ИП адреса или корисничко име није блокирано.',
 'blocklink' => 'блокирај',
-'unblocklink' => 'одблокирај',
+'unblocklink' => 'деблокирај',
 'change-blocklink' => 'промени блокирање',
 'contribslink' => 'доприноси',
 'emaillink' => 'пошаљи е-поруку',
@@ -2832,7 +2855,7 @@ $1',
 'blocklogtext' => 'Ово је дневник блокирања и деблокирања корисника.
 Аутоматски блокиране ИП адресе нису наведене.
 Текуће забране и блокирања можете наћи [[Special:BlockList|овде]].',
-'unblocklogentry' => '{{GENDER:|Ñ\98е Ð¾Ð´Ð±Ð»Ð¾ÐºÐ¸Ñ\80ао|Ñ\98е Ð¾Ð´Ð±Ð»Ð¾ÐºÐ¸Ñ\80ала|Ñ\98е Ð¾Ð´блокирао}} „$1“',
+'unblocklogentry' => '{{GENDER:|Ñ\98е Ð´ÐµÐ±Ð»Ð¾ÐºÐ¸Ñ\80ао|Ñ\98е Ð´ÐµÐ±Ð»Ð¾ÐºÐ¸Ñ\80ала|Ñ\98е Ð´Ðµблокирао}} „$1“',
 'block-log-flags-anononly' => 'само анонимни корисници',
 'block-log-flags-nocreate' => 'онемогућено отварање налога',
 'block-log-flags-noautoblock' => 'аутоматско блокирање је онемогућено',
@@ -3050,6 +3073,7 @@ $1',
 'import-interwiki-templates' => 'Укључи све шаблоне',
 'import-interwiki-submit' => 'Увези',
 'import-interwiki-namespace' => 'Одредишни именски простор:',
+'import-interwiki-rootpage' => 'Одредишна основна страница (необавезно):',
 'import-upload-filename' => 'Назив датотеке:',
 'import-comment' => 'Коментар:',
 'importtext' => 'Извезите датотеку с изворног викија користећи [[Special:Export|извоз]].
@@ -3086,6 +3110,9 @@ $1',
 'import-error-interwiki' => 'Не могу да увезем страницу „$1“ јер је њен назив резервисан за спољно повезивање (међувики).',
 'import-error-special' => 'Не могу да увезем страницу „$1“ јер она припада посебном именском простору које не прихвата странице.',
 'import-error-invalid' => 'Не могу да увезем страницу „$1“ јер је њен назив неисправан.',
+'import-options-wrong' => '{{PLURAL:$2|Погрешна опција|Погрешне опције}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Наведена основна страница има неисправан наслов.',
+'import-rootpage-nosubpage' => 'Именски простор „$1“ основне странице не дозвољава подстранице.',
 
 # Import log
 'importlogpage' => 'Дневник увоза',
@@ -3170,7 +3197,7 @@ $1',
 'tooltip-watchlistedit-raw-submit' => 'Ажурирај списак',
 'tooltip-recreate' => 'Поново направите страницу иако је обрисана',
 'tooltip-upload' => 'Започните отпремање',
-'tooltip-rollback' => '„Врати“ поништава последњу измену ове странице једним кликом',
+'tooltip-rollback' => 'Опција „Врати“ враћа измене последњег корисника',
 'tooltip-undo' => 'Враћа ову измену и отвара образац за уређивање.',
 'tooltip-preferences-save' => 'Сачувај поставке',
 'tooltip-summary' => 'Унесите кратак опис',
@@ -3232,20 +3259,21 @@ $1',
 'spamprotectionmatch' => 'Следећи текст је изазвао наш филтер за непожељне поруке: $1',
 'spambot_username' => 'Чишћење непожељних порука у Медијавикији',
 'spam_reverting' => 'Враћам на последњу измену која не садржи везе до $1',
-'spam_blanking' => 'Све измене које садрже везе до $1, бришем',
+'spam_blanking' => 'Све измене садрже везе до $1. Чистим',
+'spam_deleting' => 'Све измене садрже везе до $1. Бришем',
 
 # Info page
 'pageinfo-title' => 'Подаци о „$1“',
-'pageinfo-header-edits' => 'Измена',
-'pageinfo-header-watchlist' => 'Списак надгледања',
-'pageinfo-header-views' => 'Прегледа',
-'pageinfo-subjectpage' => 'Страница',
-'pageinfo-talkpage' => 'Страница за разговор',
-'pageinfo-watchers' => 'Број прегледача',
-'pageinfo-edits' => 'Број измена',
-'pageinfo-authors' => 'Број различитих аутора',
+'pageinfo-header-basic' => 'Основни подаци',
+'pageinfo-header-edits' => 'Историја измена',
+'pageinfo-header-restrictions' => 'Заштита странице',
+'pageinfo-header-properties' => 'Својства странице',
+'pageinfo-display-title' => 'Наслов за приказ',
+'pageinfo-default-sort' => 'Подразумевани кључ сортирања',
 'pageinfo-views' => 'Број прегледа',
-'pageinfo-viewsperedit' => 'Прегледа по измени',
+'pageinfo-watchers' => 'Број надгледача страница',
+'pageinfo-edits' => 'Број измена',
+'pageinfo-authors' => 'Број засебних аутора',
 
 # Skin names
 'skinname-standard' => 'Класично',
@@ -4153,7 +4181,7 @@ $5
 * <span class="mw-specialpagecached">привремено меморисане посебне странице</span>',
 'specialpages-group-maintenance' => 'Извештаји одржавања',
 'specialpages-group-other' => 'Остале посебне странице',
-'specialpages-group-login' => 'Ð\9eÑ\82ваÑ\80аÑ\9aе Ð½Ð°Ð»Ð¾Ð³Ð° Ð¸ Ð¿Ñ\80иÑ\98авÑ\99иваÑ\9aе',
+'specialpages-group-login' => 'Ð\9fÑ\80иÑ\98ава/Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\98а',
 'specialpages-group-changes' => 'Скорашње измене и дневници',
 'specialpages-group-media' => 'Извештаји о мултимедијалном садржају и отпремања',
 'specialpages-group-users' => 'Корисници и корисничка права',
@@ -4231,7 +4259,7 @@ $5
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:|је обрисао|је обрисала|је обрисао}} $3',
 'logentry-delete-restore' => '$1 {{GENDER:|је вратио|је вратила|је вратио}} страницу $3',
-'logentry-delete-event' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивост {{PLURAL:$5|догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4',
+'logentry-delete-event' => '$1 {{GENDER:$2|је променио|је променила|је променио}} видљивост {{PLURAL:$5|догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4',
 'logentry-delete-revision' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивост {{PLURAL:$5|измене|$5 измене|$5 измена}} на страници $3: $4',
 'logentry-delete-event-legacy' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивост догађајâ у дневнику на $3',
 'logentry-delete-revision-legacy' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивост изменâ на страници $3',
@@ -4287,9 +4315,12 @@ $5
 'api-error-empty-file' => 'Послата датотека је празна.',
 'api-error-emptypage' => 'Стварање нових празних страница није дозвољено.',
 'api-error-fetchfileerror' => 'Унутрашња грешка: дошло је до грешке при добављању датотеке.',
+'api-error-fileexists-forbidden' => 'Већ постоји датотека с именом „$1“ и не може да се замени.',
+'api-error-fileexists-shared-forbidden' => 'Већ постоји датотека с именом „$1“ у заједничкој ризници и не може да се замени.',
 'api-error-file-too-large' => 'Послата датотека је превелика.',
 'api-error-filename-tooshort' => 'Назив датотеке је прекратак.',
 'api-error-filetype-banned' => 'Ова врста датотеке је забрањена.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|је забрањена врста датотеке|су забрањене врсте датотека}}. {{PLURAL:$3|Дозвољена је|Дозвољене су}} $2.',
 'api-error-filetype-missing' => 'Датотеци недостаје наставак.',
 'api-error-hookaborted' => 'Измена је одбачена од куке за проширења.',
 'api-error-http' => 'Унутрашња грешка: не могу да се повежем са сервером.',
index af585ca..dd45054 100644 (file)
@@ -64,10 +64,6 @@ $namespaceAliases = array(
        'Razgovor_o_slici'        => NS_FILE_TALK,
 );
 
-$extraUserToggles = array(
-       'nolangconversion',
-);
-
 $datePreferenceMigrationMap = array(
        'default',
        'hh:mm d. month y.',
@@ -162,146 +158,146 @@ $dateFormats = array(
 
 /* NOT USED IN STABLE VERSION */
 $magicWords = array(
-       'redirect'                => array( '0', '#Preusmeri', '#preusmeri', '#PREUSMERI', '#Preusmjeri', '#preusmjeri', '#PREUSMJERI', '#redirect', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__BEZSADRŽAJA__', '__BEZ_SADRŽAJA__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__BEZGALERIJE__', '__BEZ_GALERIJE__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__FORSIRANISADRŽAJ__', '__FORSIRANI_SADRŽAJ__', '__PRIMORANISADRŽAJ__', '__PRIMORANI_SADRŽAJ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__SADRŽAJ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BEZIZMENA__', '__BEZ_IZMENA__', '__BEZIZMJENA__', '__BEZ_IZMJENA__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__BEZZAGLAVLJA__', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'TRENUTNIMESEC', 'TRENUTNI_MESEC', 'TEKUĆIMESEC', 'TEKUĆI_MESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'TRENUTNIMESEC1', 'TRENUTNI_MESEC1', 'TEKUĆIMESEC1', 'TEKUĆI_MESEC1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'TRENUTNIMESECIME', 'IMETEKUĆEGMESECA', 'IME_TEKUĆEG_MESECA', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'TRENUTNIMESECGEN', 'TEKUĆIMESECGEN', 'TEKUĆI_MESEC_GEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'TRENUTNIMESECSKR', 'TEKUĆIMESECSKR', 'TEKUĆI_MESEC_SKR', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'TRENUTNIDAN', 'TEKUĆIDAN', 'TEKUĆI_DAN', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'TEKUĆIDAN2', 'TEKUĆI_DAN_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'TRENUTNIDANIME', 'IMETEKUĆEGDANA', 'IME_TEKUĆEG_DANA', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'TRENUTNAGODINA', 'TEKUĆAGODINA', 'TEKUĆA_GODINA', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'TRENUTNOVREME', 'TEKUĆEVREME', 'TEKUĆE_VREME', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'TEKUĆISAT', 'TEKUĆI_SAT', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LOKALNIMESEC', 'LOKALNI_MESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LOKALNIMESEC2', 'LOKALNI_MESEC2', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'IMELOKALNOGMESECA', 'IME_LOKALNOG_MESECA', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'LOKALNIMESECGEN', 'LOKALNI_MESEC_GEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'LOKALNIMESECSKR', 'LOKALNI_MESEC_SKR', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'LOKALNIDAN', 'LOKALNI_DAN', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'LOKALNIDAN2', 'LOKALNI_DAN2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'IMELOKALNOGDANA', 'IME_LOKALNOG_DANA', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'LOKALNAGODINA', 'LOKALNA_GODINA', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LOKALNOVREME', 'LOKALNO_VREME', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'LOKALNISAT', 'LOKALNI_SAT', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'BROJSTRANICA', 'BROJ_STRANICA', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'BROJČLANAKA', 'BROJ_ČLANAKA', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'BROJDATOTEKA', 'BROJ_DATOTEKA', 'BROJFAJLOVA', 'BROJ_FAJLOVA', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'BROJKORISNIKA', 'BROJ_KORISNIKA', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'BROJAKTIVNIHKORISNIKA', 'BROJ_AKTIVNIH_KORISNIKA', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'BROJIZMENA', 'BROJ_IZMENA', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'BROJPREGLEDA', 'BROJ_PREGLEDA', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'IMESTRANICE', 'IME_STRANICE', 'STRANICA', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'IMENASTRANICA', 'IMENA_STRANICA', 'STRANICE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'IMENSKIPROSTOR', 'IMENSKI_PROSTOR', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'IMENSKIPROSTORI', 'IMENSKI_PROSTORI', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'RAZGOVOR', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'RAZGOVORI', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'IMENSKIPROSTORČLANKA', 'IMENSKI_PROSTOR_ČLANKA', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'IMENSKIPROSTORČLANAKA', 'IMENSKI_PROSTOR_ČLANAKA', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'PUNOIMESTRANICE', 'PUNOIMESTRANE', 'PUNO_IME_STRANICE', 'PUNO_IME_STRANE', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'PUNAIMENASTRANICA', 'PUNAIMENASTRANA', 'PUNA_IMENA_STRANICA', 'PUNA_IMENA_STRANA', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'IMEPODSTRANICE', 'IMEPODSTRANE', 'IME_PODSTRANICE', 'IME_PODSTRANE', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'IMENAPODSTRANICA', 'IMENAPODSTRANA', 'IMENA_PODSTRANICA', 'IMENA_PODSTRANA', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'IMEOSNOVE', 'IME_OSNOVE', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'IMENAOSNOVA', 'IMENA_OSNOVA', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'IMERAZGOVORA', 'IME_RAZGOVORA', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'IMENARAZGOVORA', 'IMENA_RAZGOVORA', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'IMEČLANKA', 'IME_ČLANKA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'IMENAČLANAKA', 'IMENA_ČLANAKA', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'POR:', 'MSG:' ),
-       'subst'                   => array( '0', 'ZAMENI:', 'ZAMENA:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'BEZBEDNAZAMENA', 'BEZBEDNA_ZAMENA', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'NVPOR:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'mini', 'umanjeno', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'mini=$1', 'umanjeno=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'desno', 'd', 'right' ),
-       'img_left'                => array( '1', 'levo', 'l', 'left' ),
-       'img_none'                => array( '1', 'bez', 'n', 'none' ),
-       'img_width'               => array( '1', '$1piskel', '$1p', '$1px' ),
-       'img_center'              => array( '1', 'centar', 'c', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'bezokvira', 'bez_okvira', 'bezrama', 'bez_rama', 'frameless' ),
-       'img_page'                => array( '1', 'stranica=$1', 'strana=$1', 'stranica_$1', 'strana_$1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'uspravno', 'uspravno=$1', 'uspravno_$1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'ivica', 'border' ),
-       'img_baseline'            => array( '1', 'osnova', 'baseline' ),
-       'img_sub'                 => array( '1', 'pod', 'sub' ),
-       'img_top'                 => array( '1', 'vrh', 'top' ),
-       'img_text_top'            => array( '1', 'vrhteksta', 'vrh_teksta', 'text-top' ),
-       'img_middle'              => array( '1', 'sredina', 'middle' ),
-       'img_bottom'              => array( '1', 'dno', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'sredinateksta', 'sredina_teksta', 'text-bottom' ),
-       'img_link'                => array( '1', 'veza=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'IMESAJTA', 'SITENAME' ),
-       'ns'                      => array( '0', 'IP:', 'NS:' ),
-       'localurl'                => array( '0', 'LOKALNAADRESA:', 'LOKALNA_ADRESA:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALNEADRESE:', 'LOKALNE_ADRESE:', 'LOCALURLE:' ),
-       'articlepath'             => array( '0', 'PUTANJAČLANKA', 'PUTANJA_ČLANKA', 'ARTICLEPATH' ),
-       'servername'              => array( '0', 'IMESERVERA', 'IME_SERVERA', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SKRIPTA', 'SKRIPT', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'PUTANJASTILA', 'PUTANJA_STILA', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'ROD:', 'LICE:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__BEZKN__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__BEZCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'TRENUTNANEDELJA', 'TRENUTNA_NEDELJA', 'TEKUĆANEDELJA', 'TEKUĆA_NEDELJA', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'TRENUTNIDOV', 'TEKUĆIDUN', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'LOKALNANEDELJA', 'LOKALNA_NEDELJA', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'LOKALNIDUN', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'IDREVIZIJE', 'ID_REVIZIJE', 'IB_IZMENE', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'DANIZMENE', 'DAN_IZMENE', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'DANIZMENE2', 'DAN_IZMENE2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'MESECIZMENE', 'MESEC_IZMENE', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'MESECIZMENE1', 'MESEC_IZMENE1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'GODINAIZMENE', 'GODINA_IZMENE', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'VREMEIZMENE', 'VREME_IZMENE', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'KORISNIKIZMENE', 'KORISNIK_IZMENE', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'MNOŽINA:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'PUNURL:', 'CELAADRESA', 'CELA_ADRESA', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'PUNURLE:', 'CELEADRESE', 'CELE_ADRESE', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'LCPRVI:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'UCPRVI:', 'UCFIRST:' ),
-       'raw'                     => array( '0', 'ČIST:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'NAZIVPRIKAZA', 'NAZIV_PRIKAZA', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__NOVAVEZAODELJKA__', '__NOVA_VEZA_ODELJKA__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__BEZNOVEVEZEODELJKA__', '__BEZ_NOVE_VEZE_ODELJKA__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'TEKUĆEIZDANJE', 'TEKUĆE_IZDANJE', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'KODIRANJEADRESE', 'KODIRANJE_ADRESE', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'KODIRANJEVEZE', 'KODIRANJE_VEZE', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'TEKUĆIOTISAKVREMENA', 'TEKUĆI_OTISAK_VREMENA', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'OTISAKVREMENA', 'OTISAK_VREMENA', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'SMEROZNAKE', 'SMER    _OZNAKE', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#JEZIK:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'JEZIKSADRŽAJA', 'JEZIK_SADRŽAJA', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'STRANICAUIMENSKOMPROSTORU', 'STRANAUIMENSKOMPROSTORU', 'STRANICA_U_IMENSKOM_PROSTORU', 'STRANA_U_IMENSKOM_PROSTORU', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'BROJADMINA', 'BROJ_ADMINA', 'NUMBEROFADMINS' ),
-       'padleft'                 => array( '0', 'PORAVNAJULEVO', 'PORAVNAJ_ULEVO', 'PADLEFT' ),
-       'padright'                => array( '0', 'PORAVNAJUDESNO', 'PORAVNAJ_UDESNO', 'PADRIGHT' ),
-       'special'                 => array( '0', 'posebno', 'special' ),
-       'filepath'                => array( '0', 'PUTANJADATOTEKE', 'PUTANJA_DATOTEKE', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'oznaka', 'tag' ),
-       'hiddencat'               => array( '1', '__SAKRIVENAKAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'STRANICAUKATEGORIJI', 'STRANAUKATEGORIJI', 'STRANICA_U_KATEGORIJI', 'STRANA_U_KATEGORIJI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'VELIČINASTRANICE', 'VELIČINASTRANE', 'VELIČINA_STRANICE', 'VELIČINA_STRANE', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEKS__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__BEZINDEKSA__', '__BEZ_INDEKSA__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'BROJUGRUPI', 'BROJ_U_GRUPI', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__STATIČKOPREUSMERENJE__', 'STATIČKO_PREUSMERENJE', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'NIVOZAŠTITE', 'NIVO_ZAŠTITE', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'formatdatuma', 'format_datuma', 'formatdate', 'dateformat' ),
-       'url_path'                => array( '0', 'PUTANJA', 'PATH' ),
-       'url_wiki'                => array( '0', 'VIKI', 'WIKI' ),
-       'url_query'               => array( '0', 'REDOSLED', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', 'bez_greške', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', 'bez_zamene', 'noreplace' ),
+       'redirect'                  => array( '0', '#Preusmeri', '#preusmeri', '#PREUSMERI', '#Preusmjeri', '#preusmjeri', '#PREUSMJERI', '#redirect', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__BEZSADRŽAJA__', '__BEZ_SADRŽAJA__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__BEZGALERIJE__', '__BEZ_GALERIJE__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__FORSIRANISADRŽAJ__', '__FORSIRANI_SADRŽAJ__', '__PRIMORANISADRŽAJ__', '__PRIMORANI_SADRŽAJ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__SADRŽAJ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BEZIZMENA__', '__BEZ_IZMENA__', '__BEZIZMJENA__', '__BEZ_IZMJENA__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__BEZZAGLAVLJA__', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'TRENUTNIMESEC', 'TRENUTNI_MESEC', 'TEKUĆIMESEC', 'TEKUĆI_MESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'TRENUTNIMESEC1', 'TRENUTNI_MESEC1', 'TEKUĆIMESEC1', 'TEKUĆI_MESEC1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'TRENUTNIMESECIME', 'IMETEKUĆEGMESECA', 'IME_TEKUĆEG_MESECA', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'TRENUTNIMESECGEN', 'TEKUĆIMESECGEN', 'TEKUĆI_MESEC_GEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'TRENUTNIMESECSKR', 'TEKUĆIMESECSKR', 'TEKUĆI_MESEC_SKR', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'TRENUTNIDAN', 'TEKUĆIDAN', 'TEKUĆI_DAN', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'TEKUĆIDAN2', 'TEKUĆI_DAN_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'TRENUTNIDANIME', 'IMETEKUĆEGDANA', 'IME_TEKUĆEG_DANA', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'TRENUTNAGODINA', 'TEKUĆAGODINA', 'TEKUĆA_GODINA', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'TRENUTNOVREME', 'TEKUĆEVREME', 'TEKUĆE_VREME', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'TEKUĆISAT', 'TEKUĆI_SAT', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LOKALNIMESEC', 'LOKALNI_MESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LOKALNIMESEC2', 'LOKALNI_MESEC2', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'IMELOKALNOGMESECA', 'IME_LOKALNOG_MESECA', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'LOKALNIMESECGEN', 'LOKALNI_MESEC_GEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'LOKALNIMESECSKR', 'LOKALNI_MESEC_SKR', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'LOKALNIDAN', 'LOKALNI_DAN', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKALNIDAN2', 'LOKALNI_DAN2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'IMELOKALNOGDANA', 'IME_LOKALNOG_DANA', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'LOKALNAGODINA', 'LOKALNA_GODINA', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LOKALNOVREME', 'LOKALNO_VREME', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'LOKALNISAT', 'LOKALNI_SAT', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'BROJSTRANICA', 'BROJ_STRANICA', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'BROJČLANAKA', 'BROJ_ČLANAKA', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'BROJDATOTEKA', 'BROJ_DATOTEKA', 'BROJFAJLOVA', 'BROJ_FAJLOVA', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'BROJKORISNIKA', 'BROJ_KORISNIKA', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'BROJAKTIVNIHKORISNIKA', 'BROJ_AKTIVNIH_KORISNIKA', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'BROJIZMENA', 'BROJ_IZMENA', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'BROJPREGLEDA', 'BROJ_PREGLEDA', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'IMESTRANICE', 'IME_STRANICE', 'STRANICA', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'IMENASTRANICA', 'IMENA_STRANICA', 'STRANICE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'IMENSKIPROSTOR', 'IMENSKI_PROSTOR', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'IMENSKIPROSTORI', 'IMENSKI_PROSTORI', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'RAZGOVOR', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'RAZGOVORI', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'IMENSKIPROSTORČLANKA', 'IMENSKI_PROSTOR_ČLANKA', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'IMENSKIPROSTORČLANAKA', 'IMENSKI_PROSTOR_ČLANAKA', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'PUNOIMESTRANICE', 'PUNOIMESTRANE', 'PUNO_IME_STRANICE', 'PUNO_IME_STRANE', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'PUNAIMENASTRANICA', 'PUNAIMENASTRANA', 'PUNA_IMENA_STRANICA', 'PUNA_IMENA_STRANA', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'IMEPODSTRANICE', 'IMEPODSTRANE', 'IME_PODSTRANICE', 'IME_PODSTRANE', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'IMENAPODSTRANICA', 'IMENAPODSTRANA', 'IMENA_PODSTRANICA', 'IMENA_PODSTRANA', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'IMEOSNOVE', 'IME_OSNOVE', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'IMENAOSNOVA', 'IMENA_OSNOVA', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'IMERAZGOVORA', 'IME_RAZGOVORA', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'IMENARAZGOVORA', 'IMENA_RAZGOVORA', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'IMEČLANKA', 'IME_ČLANKA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'IMENAČLANAKA', 'IMENA_ČLANAKA', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'POR:', 'MSG:' ),
+       'subst'                     => array( '0', 'ZAMENI:', 'ZAMENA:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'BEZBEDNAZAMENA', 'BEZBEDNA_ZAMENA', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'NVPOR:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'mini', 'umanjeno', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'mini=$1', 'umanjeno=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'desno', 'd', 'right' ),
+       'img_left'                  => array( '1', 'levo', 'l', 'left' ),
+       'img_none'                  => array( '1', 'bez', 'n', 'none' ),
+       'img_width'                 => array( '1', '$1piskel', '$1p', '$1px' ),
+       'img_center'                => array( '1', 'centar', 'c', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'bezokvira', 'bez_okvira', 'bezrama', 'bez_rama', 'frameless' ),
+       'img_page'                  => array( '1', 'stranica=$1', 'strana=$1', 'stranica_$1', 'strana_$1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'uspravno', 'uspravno=$1', 'uspravno_$1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'ivica', 'border' ),
+       'img_baseline'              => array( '1', 'osnova', 'baseline' ),
+       'img_sub'                   => array( '1', 'pod', 'sub' ),
+       'img_top'                   => array( '1', 'vrh', 'top' ),
+       'img_text_top'              => array( '1', 'vrhteksta', 'vrh_teksta', 'text-top' ),
+       'img_middle'                => array( '1', 'sredina', 'middle' ),
+       'img_bottom'                => array( '1', 'dno', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'sredinateksta', 'sredina_teksta', 'text-bottom' ),
+       'img_link'                  => array( '1', 'veza=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'IMESAJTA', 'SITENAME' ),
+       'ns'                        => array( '0', 'IP:', 'NS:' ),
+       'localurl'                  => array( '0', 'LOKALNAADRESA:', 'LOKALNA_ADRESA:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALNEADRESE:', 'LOKALNE_ADRESE:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', 'PUTANJAČLANKA', 'PUTANJA_ČLANKA', 'ARTICLEPATH' ),
+       'servername'                => array( '0', 'IMESERVERA', 'IME_SERVERA', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SKRIPTA', 'SKRIPT', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'PUTANJASTILA', 'PUTANJA_STILA', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'ROD:', 'LICE:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__BEZKN__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__BEZCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'TRENUTNANEDELJA', 'TRENUTNA_NEDELJA', 'TEKUĆANEDELJA', 'TEKUĆA_NEDELJA', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'TRENUTNIDOV', 'TEKUĆIDUN', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'LOKALNANEDELJA', 'LOKALNA_NEDELJA', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'LOKALNIDUN', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'IDREVIZIJE', 'ID_REVIZIJE', 'IB_IZMENE', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'DANIZMENE', 'DAN_IZMENE', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'DANIZMENE2', 'DAN_IZMENE2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'MESECIZMENE', 'MESEC_IZMENE', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'MESECIZMENE1', 'MESEC_IZMENE1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'GODINAIZMENE', 'GODINA_IZMENE', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'VREMEIZMENE', 'VREME_IZMENE', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'KORISNIKIZMENE', 'KORISNIK_IZMENE', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'MNOŽINA:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'PUNURL:', 'CELAADRESA', 'CELA_ADRESA', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'PUNURLE:', 'CELEADRESE', 'CELE_ADRESE', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'LCPRVI:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'UCPRVI:', 'UCFIRST:' ),
+       'raw'                       => array( '0', 'ČIST:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'NAZIVPRIKAZA', 'NAZIV_PRIKAZA', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__NOVAVEZAODELJKA__', '__NOVA_VEZA_ODELJKA__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__BEZNOVEVEZEODELJKA__', '__BEZ_NOVE_VEZE_ODELJKA__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'TEKUĆEIZDANJE', 'TEKUĆE_IZDANJE', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'KODIRANJEADRESE', 'KODIRANJE_ADRESE', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'KODIRANJEVEZE', 'KODIRANJE_VEZE', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'TEKUĆIOTISAKVREMENA', 'TEKUĆI_OTISAK_VREMENA', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'OTISAKVREMENA', 'OTISAK_VREMENA', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'SMEROZNAKE', 'SMER  _OZNAKE', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#JEZIK:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'JEZIKSADRŽAJA', 'JEZIK_SADRŽAJA', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'STRANICAUIMENSKOMPROSTORU', 'STRANAUIMENSKOMPROSTORU', 'STRANICA_U_IMENSKOM_PROSTORU', 'STRANA_U_IMENSKOM_PROSTORU', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'BROJADMINA', 'BROJ_ADMINA', 'NUMBEROFADMINS' ),
+       'padleft'                   => array( '0', 'PORAVNAJULEVO', 'PORAVNAJ_ULEVO', 'PADLEFT' ),
+       'padright'                  => array( '0', 'PORAVNAJUDESNO', 'PORAVNAJ_UDESNO', 'PADRIGHT' ),
+       'special'                   => array( '0', 'posebno', 'special' ),
+       'filepath'                  => array( '0', 'PUTANJADATOTEKE', 'PUTANJA_DATOTEKE', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'oznaka', 'tag' ),
+       'hiddencat'                 => array( '1', '__SAKRIVENAKAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'STRANICAUKATEGORIJI', 'STRANAUKATEGORIJI', 'STRANICA_U_KATEGORIJI', 'STRANA_U_KATEGORIJI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'VELIČINASTRANICE', 'VELIČINASTRANE', 'VELIČINA_STRANICE', 'VELIČINA_STRANE', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEKS__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__BEZINDEKSA__', '__BEZ_INDEKSA__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'BROJUGRUPI', 'BROJ_U_GRUPI', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__STATIČKOPREUSMERENJE__', 'STATIČKO_PREUSMERENJE', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'NIVOZAŠTITE', 'NIVO_ZAŠTITE', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'formatdatuma', 'format_datuma', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'PUTANJA', 'PATH' ),
+       'url_wiki'                  => array( '0', 'VIKI', 'WIKI' ),
+       'url_query'                 => array( '0', 'REDOSLED', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'bez_greške', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', 'bez_zamene', 'noreplace' ),
 );
 
 $separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -314,7 +310,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Sakrij pregledane izmene u spisku skorašnjih izmena',
 'tog-newpageshidepatrolled' => 'Sakrij pregledane stranice sa spiska novih stranica',
 'tog-extendwatchlist' => 'Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih',
-'tog-usenewrc' => 'Poboljšani spisak skorašnjih izmena (javaskript)',
+'tog-usenewrc' => 'Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica (zahteva javaskript)',
 'tog-numberheadings' => 'Samostalno numeriši podnaslove',
 'tog-showtoolbar' => 'Traka s alatkama za uređivanje (javaskript)',
 'tog-editondblclick' => 'Uređivanje stranica dvostrukim klikom (javaskript)',
@@ -322,17 +318,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Uređivanje odeljaka desnim klikom na njihove naslove (javaskript)',
 'tog-showtoc' => 'Prikaži sadržaj stranica koje imaju više od tri podnaslova',
 'tog-rememberpassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
-'tog-watchcreations' => 'Dodaj stranice koje napravim u spisak nadgledanja',
-'tog-watchdefault' => 'Dodaj stranice koje izmenim u spisak nadgledanja',
-'tog-watchmoves' => 'Dodaj stranice koje premestim u spisak nadgledanja',
-'tog-watchdeletion' => 'Dodaj stranice koje obrišem u spisak nadgledanja',
+'tog-watchcreations' => 'Dodaj stranice koje napravim i datoteke koje pošaljem u spisak nadgledanja',
+'tog-watchdefault' => 'Dodaj stranice i datoteke koje izmenim u spisak nadgledanja',
+'tog-watchmoves' => 'Dodaj stranice i datoteke koje premestim u spisak nadgledanja',
+'tog-watchdeletion' => 'Dodaj stranice i datoteke koje obrišem u spisak nadgledanja',
 'tog-minordefault' => 'Označavaj sve izmene kao manje',
 'tog-previewontop' => 'Prikaži pregled pre okvira za uređivanje',
 'tog-previewonfirst' => 'Prikaži pregled na prvoj izmeni',
 'tog-nocache' => 'Onemogući privremeno memorisanje stranica',
-'tog-enotifwatchlistpages' => 'Pošalji mi e-poruku kada se promeni stranica koju nadgledam',
+'tog-enotifwatchlistpages' => 'Pošalji mi e-poruku kada se promeni stranica ili datoteka koju nadgledam',
 'tog-enotifusertalkpages' => 'Pošalji mi e-poruku kada se promeni moja stranica za razgovor',
-'tog-enotifminoredits' => 'Pošalji mi e-poruku i za manje izmene',
+'tog-enotifminoredits' => 'Pošalji mi e-poruku i za manje izmene u stranicama i datotekama',
 'tog-enotifrevealaddr' => 'Otkrij moju e-adresu u porukama obaveštenja',
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji nadgledaju',
 'tog-oldsig' => 'Tekući potpis:',
@@ -348,7 +344,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Sakrij izmene prijavljenih korisnika sa spiska nadgledanja',
 'tog-watchlisthideanons' => 'Sakrij izmene anonimnih korisnika sa spiska nadgledanja',
 'tog-watchlisthidepatrolled' => 'Sakrij pregledane izmene sa spiska nadgledanja',
-'tog-nolangconversion' => 'Onemogući pretvaranje pisama',
 'tog-ccmeonemails' => 'Pošalji mi primerke e-poruka koje pošaljem drugim korisnicima',
 'tog-diffonly' => 'Ne prikazuj sadržaj stranice ispod razlika',
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
@@ -489,7 +484,7 @@ $messages = array(
 'history' => 'Istorija stranice',
 'history_short' => 'Istorija',
 'updatedmarker' => 'ažurirano od moje poslednje posete',
-'printableversion' => 'Izdanje za štampu',
+'printableversion' => 'Verzija za štampu',
 'permalink' => 'Trajna veza',
 'print' => 'Štampaj',
 'view' => 'Pogledaj',
@@ -577,7 +572,11 @@ Pogledajte stranicu za [[Special:Version|izdanje]].',
 'retrievedfrom' => 'Preuzeto iz „$1“',
 'youhavenewmessages' => 'Imate $1 ($2).',
 'newmessageslink' => 'novih poruka',
-'newmessagesdifflink' => 'poslednja izmena',
+'newmessagesdifflink' => 'poslednju izmenu',
+'youhavenewmessagesfromusers' => 'Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika|$3 korisnika}} ($2).',
+'youhavenewmessagesmanyusers' => 'Imate $1 od mnogo korisnika ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|novu poruku|nove poruke}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|poslednju izmenu|poslednje izmene}}',
 'youhavenewmessagesmulti' => 'Imate novih poruka na $1',
 'editsection' => 'uredi',
 'editsection-brackets' => '[$1]',
@@ -632,13 +631,13 @@ Spisak svih posebnih stranica nalazi se [[Special:SpecialPages|ovde]].',
 # General errors
 'error' => 'Greška',
 'databaseerror' => 'Greška u bazi podataka',
-'dberrortext' => 'Došlo je do sintaksne greške u bazi.
+'dberrortext' => 'Došlo je do sintaktičke greške u bazi.
 Možda se radi o grešci u softveru.
 Poslednji pokušaj upita je glasio:
-<blockquote><tt>$1</tt></blockquote>
-unutar funkcije „<tt>$2</tt>“.
-Baza podataka je prijavila grešku „<tt>$3: $4</tt>“.',
-'dberrortextcl' => 'Došlo je do sintaksne greške u bazi.
+<blockquote><code>$1</code></blockquote>
+unutar funkcije „<code>$2</code>“.
+Baza podataka je prijavila grešku „<samp>$3: $4</samp>“.',
+'dberrortextcl' => 'Došlo je do sintaktičke greške u bazi.
 Poslednji pokušaj upita je glasio:
 „$1“
 unutar funkcije „$2“.
@@ -674,6 +673,8 @@ Prijavite je [[Special:ListUsers/sysop|administratoru]] uz odgovarajuću vezu.',
 'cannotdelete' => 'Ne mogu da obrišem stranicu ili datoteku „$1“.
 Verovatno ju je neko drugi obrisao.',
 'cannotdelete-title' => 'Ne mogu da obrišem stranicu „$1“',
+'delete-hook-aborted' => 'Brisanje je prekinula kuka.
+Nije dato nikakvo obrazloženje.',
 'badtitle' => 'Neispravan naslov',
 'badtitletext' => 'Naslov stranice je neispravan, prazan ili je međujezički ili međuviki naslov pogrešno povezan.
 Možda sadrži znakove koji se ne mogu koristiti u naslovima.',
@@ -709,6 +710,8 @@ Navedeni razlog: ''$2''.",
 Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.',
 'invalidtitle-knownnamespace' => 'Neispravan naslov s imenskim prostorom „$2“ i tekstom „$3“',
 'invalidtitle-unknownnamespace' => 'Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“',
+'exception-nologin' => 'Niste prijavljeni',
+'exception-nologin-text' => 'Ova stranica ili radnja zahteva da budete prijavljeni na viki.',
 
 # Virus scanner
 'virus-badscanner' => "Neispravna postavka: nepoznati skener za viruse: ''$1''",
@@ -730,6 +733,7 @@ Ne zaboravite da prilagodite svoja [[Special:Preferences|podešavanja]].',
 'remembermypassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
 'securelogin-stick-https' => 'Ostanite povezani sa HTTPS nakon prijave',
 'yourdomainname' => 'Domen:',
+'password-change-forbidden' => 'Ne možete da promenite lozinku na ovom vikiju.',
 'externaldberror' => 'Došlo je do greške pri prepoznavanju baze podataka ili nemate ovlašćenja da ažurirate svoj spoljni nalog.',
 'login' => 'Prijavi me',
 'nav-login-createaccount' => 'Prijava/registracija',
@@ -911,7 +915,7 @@ Privremena lozinka: $2',
 'watchthis' => 'nadgledaj ovu stranicu',
 'savearticle' => 'Sačuvaj stranicu',
 'preview' => 'Pregled',
-'showpreview' => 'Prikaži pregled',
+'showpreview' => 'Pregledaj',
 'showlivepreview' => 'Trenutni pregled',
 'showdiff' => 'Prikaži izmene',
 'anoneditwarning' => "'''Upozorenje:''' niste prijavljeni.
@@ -980,6 +984,10 @@ Možete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranic
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti stranicu]</span>.',
 'noarticletext-nopermission' => 'Na ovoj stranici trenutno nema sadržaja.
 Možete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama ili <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje]</span>.',
+'missing-revision' => 'Ne mogu da pronađem izmenu br. $1 na stranici pod nazivom „{{PAGENAME}}“.
+
+Ovo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.
+Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].',
 'userpage-userdoesnotexist' => 'Korisnički nalog „<nowiki>$1</nowiki>“ nije otvoren.
 Razmislite da li zaista želite da napravite ili uredite ovu stranicu.',
 'userpage-userdoesnotexist-view' => 'Korisnički nalog „$1“ nije otvoren.',
@@ -989,7 +997,6 @@ Izveštaj o poslednjem blokiranju možete pogledati ispod:',
 *'''Fajerfoks i Safari:''' držite ''Shift'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5'' ili Ctrl-R (''⌘-R'' na Makintošu)
 *'''Gugl kroum:''' pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Makintošu)
 *'''Internet eksplorer: '''držite ''Ctrl'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5''
-*'''K-osvajač: '''kliknite na ''Osveži'' ili pritisnite ''F5''
 *'''Opera:''' očistite privremenu memoriju preko menija ''Alatke → Postavke''.",
 'usercssyoucanpreview' => "'''Savet:''' korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi CSS pre nego što ga sačuvate.",
 'userjsyoucanpreview' => "'''Savet:''' korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi javaskript pre nego što ga sačuvate.",
@@ -1082,8 +1089,8 @@ Ovde je navedena istorija brisanja i premeštanja s obrazloženjem:",
 'moveddeleted-notice' => 'Ova stranica je obrisana.
 Istorija njenog brisanja i premeštanja nalazi se ispod:',
 'log-fulllog' => 'Pogledaj celu istoriju',
-'edit-hook-aborted' => 'Izmena je prekinuta kukom.
-Obrazloženje nije ponuđeno.',
+'edit-hook-aborted' => 'Izmenu je prekinula kuka.
+Nije dato nikakvo obrazloženje.',
 'edit-gone-missing' => 'Ne mogu da ažuriram stranicu.
 Izgleda da je obrisana.',
 'edit-conflict' => 'Sukob izmena.',
@@ -1112,6 +1119,7 @@ Ovakve argumente bi trebalo izbegavati.",
 'expansion-depth-exceeded-warning' => 'Stranica u kojoj je prekoračena dubina proširenja',
 'parser-unstrip-loop-warning' => 'Utvrđena je petlja',
 'parser-unstrip-recursion-limit' => 'Prekoračeno je ograničenje rekurzije ($1)',
+'converter-manual-rule-error' => 'Pronađena je greška u pravilu za ručno pretvaranje jezika',
 
 # "Undo" feature
 'undo-success' => 'Izmena se može vratiti.
@@ -1153,7 +1161,7 @@ Objašnjenje: '''({{int:cur}})''' – razlika s trenutnom izmenom,
 
 # Revision feed
 'history-feed-title' => 'Istorija izmena',
-'history-feed-description' => 'Istorija izmena ove stranice',
+'history-feed-description' => 'Istorija izmena ove stranice na vikiju',
 'history-feed-item-nocomment' => '$1 u $2',
 'history-feed-empty' => 'Tražena stranica ne postoji.
 Moguće da je obrisana s vikija ili je preimenovana.
@@ -1291,8 +1299,8 @@ Korišćenje navigacionih veza će poništiti ovu kolonu.',
 'mergelogpagetext' => 'Ispod se nalazi spisak skorašnjih spajanja istorija stranica.',
 
 # Diffs
-'history-title' => 'Istorija izmena za „$1“',
-'difference-title' => 'Razlika između izmena stranice „$1“',
+'history-title' => 'Istorija izmena stranice „$1“',
+'difference-title' => 'Razlika između izmena na stranici „$1“',
 'difference-title-multipage' => 'Razlika između stranica „$1“ i „$2“',
 'difference-multipage' => '(razlike između stranica)',
 'lineno' => 'Red $1:',
@@ -1301,6 +1309,10 @@ Korišćenje navigacionih veza će poništiti ovu kolonu.',
 'editundo' => 'poništi',
 'diff-multi' => '({{PLURAL:$1|nije prikazana međuizmena|nisu prikazane $1 međuizmene|nije prikazano $1 međuizmena}} {{PLURAL:$2|jednog|$2|$2}} korisnika)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana međuizmena|Nisu prikazane $1 međuizmene|Nije prikazano $1 međuizmena}} od više od $2 korisnika)',
+'difference-missing-revision' => 'Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).
+
+Ovo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.
+Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].',
 
 # Search results
 'searchresults' => 'Rezultati pretrage',
@@ -1391,6 +1403,7 @@ Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
 'prefs-beta' => 'Beta mogućnosti',
 'prefs-datetime' => 'Datum i vreme',
 'prefs-labs' => 'Probne mogućnosti',
+'prefs-user-pages' => 'Korisničke stranice',
 'prefs-personal' => 'Profil',
 'prefs-rc' => 'Skorašnje izmene',
 'prefs-watchlist' => 'Spisak nadgledanja',
@@ -1554,7 +1567,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'right-edit' => 'uređivanje stranica',
 'right-createpage' => 'pravljenje stranica (izuzev stranica za razgovor)',
 'right-createtalk' => 'pravljenje stranica za razgovor',
-'right-createaccount' => 'pravljenje novih korisničkih naloga',
+'right-createaccount' => 'otvaranje novih korisničkih naloga',
 'right-minoredit' => 'označavanje izmena kao manje',
 'right-move' => 'premeštanje stranica',
 'right-move-subpages' => 'premeštanje stranica s njihovim podstranicama',
@@ -1574,6 +1587,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'right-writeapi' => 'pisanje API-ja',
 'right-delete' => 'brisanje stranica',
 'right-bigdelete' => 'brisanje stranica s velikom istorijom',
+'right-deletelogentry' => 'Brisanje i vraćanje određenih stavki u dnevniku',
 'right-deleterevision' => 'brisanje i vraćanje određenih izmena stranica',
 'right-deletedhistory' => 'pregledanje obrisanih stavki istorije bez povezanog teksta',
 'right-deletedtext' => 'pregledanje obrisanog teksta i izmena između obrisanih izmena',
@@ -1582,7 +1596,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'right-suppressrevision' => 'pregledanje i vraćanje izmena koje su sakrivene od strane administratora',
 'right-suppressionlog' => 'gledanje privatnih dnevnika',
 'right-block' => 'blokiranje daljih izmena drugih korisnika',
-'right-blockemail' => 'blokiranje korisnika da šalju e-poruke',
+'right-blockemail' => 'onemogućavanje korisnicima da šalju e-poruke',
 'right-hideuser' => 'blokiranje korisničkog imena i njegovo sakrivanje od javnosti',
 'right-ipblock-exempt' => 'zaobilaženje blokiranja IP adrese, samoblokiranja i blokiranja opsega',
 'right-proxyunbannable' => 'zaobilaženje samoblokiranja posrednika',
@@ -1622,7 +1636,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'action-edit' => 'uređivanje ove stranice',
 'action-createpage' => 'pravljenje stranica',
 'action-createtalk' => 'pravljenje stranica za razgovor',
-'action-createaccount' => 'pravljenje ovog korisničkog naloga',
+'action-createaccount' => 'otvaranje ovog korisničkog naloga',
 'action-minoredit' => 'označavanje ove izmene kao manje',
 'action-move' => 'premeštanje ove stranice',
 'action-move-subpages' => 'premeštanje ove stranice i njenih podstranica',
@@ -1658,7 +1672,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'nchanges' => '$1 {{PLURAL:$1|izmena|izmene|izmena}}',
 'recentchanges' => 'Skorašnje izmene',
 'recentchanges-legend' => 'Postavke skorašnjih izmena',
-'recentchanges-summary' => 'Ovde pratite najskorije izmene na vikiju.',
+'recentchanges-summary' => 'Pratite skorašnje izmene na ovoj stranici.',
 'recentchanges-feed-description' => 'Pratite skorašnje izmene uz pomoć ovog dovoda.',
 'recentchanges-label-newpage' => 'Nova stranica',
 'recentchanges-label-minor' => 'Manja izmena',
@@ -1720,9 +1734,9 @@ Istorija brisanja i premeštanja se nalazi ispod:",
 Za pregled ili pretragu postojećih datoteka, pogledajte [[Special:FileList|spisak otpremljenih datoteka]], ponovna otpremanja su navedena u [[Special:Log/upload|dnevniku otpremanja]], a brisanja u [[Special:Log/delete|dnevniku brisanja]].
 
 Datoteku dodajete na željenu stranicu koristeći sledeće obrasce:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Slika.jpg]]</nowiki></tt>''' za verziju slike u punoj veličini
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Slika.png|200p|mini|levo|opis]]</nowiki></tt>''' za verziju slike s veličinom od 200 piksela koja je prikazana u zasebnom okviru, zajedno s opisom.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></tt>''' za direktno povezivanje s datotekom bez njenog prikazivanja",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Slika.jpg]]</nowiki></code>''' za verziju slike u punoj veličini
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Slika.png|200p|mini|levo|opis]]</nowiki></code>''' za verziju slike s veličinom od 200 piksela koja je prikazana u zasebnom okviru, zajedno s opisom.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' za direktno povezivanje s datotekom bez njenog prikazivanja",
 'upload-permitted' => 'Dozvoljene vrste datoteka: $1.',
 'upload-preferred' => 'Poželjne vrste datoteka: $1.',
 'upload-prohibited' => 'Zabranjene vrste datoteka: $1.',
@@ -1769,21 +1783,21 @@ Promenite naziv datoteke i ponovo je pošaljite.',
 Uzrok može biti greška u nazivu datoteke.
 Proverite da li zaista želite da je pošaljete.',
 'windows-nonascii-filename' => 'Ovaj viki ne podržava nazive datoteka s posebnim znacima.',
-'fileexists' => "Datoteka s ovim nazivom već postoji. Pogledajte '''<tt>[[:$1]]</tt>''' ako niste sigurni da li želite da je promenite.
-[[$1|thumb]]",
-'filepageexists' => "Stranica s opisom ove datoteke je već napravljena ovde '''<tt>[[:$1]]</tt>''', iako datoteka ne postoji.
+'fileexists' => 'Datoteka s ovim nazivom već postoji. Pogledajte <strong>[[:$1]]</strong> ako niste sigurni da li želite da je promenite.
+[[$1|thumb]]',
+'filepageexists' => 'Stranica s opisom ove datoteke je već napravljena ovde <strong>[[:$1]]</strong>, iako datoteka ne postoji.
 Opis koji ste naveli se neće pojaviti na stranici s opisom.
 Da bi se vaš opis ovde našao, potrebno je da ga ručno izmenite.
-[[$1|thumb]]",
-'fileexists-extension' => "Datoteka sa sličnim nazivom već postoji: [[$2|thumb]]
-* Naziv datoteke koju šaljete: '''<tt>[[:$1]]</tt>'''
-* Naziv postojeće datoteke: '''<tt>[[:$2]]</tt>'''
-Izaberite drugačiji naziv.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Datoteka sa sličnim nazivom već postoji: [[$2|thumb]]
+* Naziv datoteke koju šaljete: <strong>[[:$1]]</strong>
+* Naziv postojeće datoteke: <strong>[[:$2]]</strong>
+Izaberite drugačiji naziv.',
 'fileexists-thumbnail-yes' => "Izgleda da je datoteka umanjeno izdanje slike ''(thumbnail)''.
 [[$1|thumb]]
-Proverite datoteku '''<tt>[[:$1]]</tt>'''.
+Proverite datoteku <strong>[[:$1]]</strong>.
 Ako je proverena datoteka ista slika originalne veličine, nije potrebno slati dodatnu sliku.",
-'file-thumbnail-no' => "Datoteka počinje sa '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Datoteka počinje sa <strong>$1</strong>.
 Izgleda da se radi o umanjenoj slici ''(thumbnail)''.
 Ukoliko imate ovu sliku u punoj veličini, pošaljite je, a ako nemate, promenite naziv datoteke.",
 'fileexists-forbidden' => 'Datoteka s ovim nazivom već postoji i ne može se zameniti.
@@ -1876,14 +1890,15 @@ Ako se problem ne reši, kontaktirajte [[Special:ListUsers/sysop|administratora]
 'backend-fail-writetemp' => 'Ne mogu da pišem u privremenoj datoteci.',
 'backend-fail-closetemp' => 'Ne mogu da zatvorim privremenu datoteku.',
 'backend-fail-read' => 'Ne mogu da pročitam datoteku $1.',
-'backend-fail-create' => 'Ne mogu da napravim datoteku $1.',
-'backend-fail-maxsize' => 'Ne mogu da napravim datoteku $1 jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.',
+'backend-fail-create' => 'Ne mogu da zapišem datoteku $1.',
+'backend-fail-maxsize' => 'Ne mogu da zapišem datoteku $1 jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.',
 'backend-fail-readonly' => 'Skladišna osnova „$1“ trenutno ne može da se zapisuje. Navedeni razlog glasi: „$2“',
 'backend-fail-synced' => 'Datoteka „$1“ je nedosledna između unutrašnjih skladišnih osnova',
 'backend-fail-connect' => 'Ne mogu da se povežem sa skladišnom osnovom „$1“.',
 'backend-fail-internal' => 'Došlo je do nepoznate greške u skladišnoj osnovi „$1“.',
 'backend-fail-contenttype' => 'Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smestim u „$1“.',
 'backend-fail-batchsize' => 'Skladišna osnova je dobila blokadu od $1 {{PLURAL:$1|operacije|operacije|operacija}}; ograničenje je $2 {{PLURAL:$2|operacija|operacije|operacija}}.',
+'backend-fail-usable' => 'Ne mogu da zapišem datoteku $1 jer nemate dovoljno dozvola ili vam nedostaju fascikle/sadržaoci.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Ne mogu da se povežem s novinarskom bazom za skladišnu osnovu „$1“.',
@@ -1898,6 +1913,7 @@ Ako se problem ne reši, kontaktirajte [[Special:ListUsers/sysop|administratora]
 'lockmanager-fail-releaselock' => 'Ne mogu da oslobodim katanac za „$1“.',
 'lockmanager-fail-db-bucket' => 'Ne mogu da kontaktiram s dovoljno katanaca u kanti $1.',
 'lockmanager-fail-db-release' => 'Ne mogu da oslobodim katance u bazi $1.',
+'lockmanager-fail-svr-acquire' => 'Ne mogu da dobijem katance na serveru $1.',
 'lockmanager-fail-svr-release' => 'Ne mogu da oslobodim katance na serveru $1.',
 
 # ZipDirectoryReader
@@ -1969,7 +1985,7 @@ Kad je poređano po korisniku, popis prikazuje samo one datoteke čije je posled
 'listfiles_search_for' => 'Naziv datoteke:',
 'imgfile' => 'datoteka',
 'listfiles' => 'Spisak datoteka',
-'listfiles_thumb' => 'Umanjeni prikaz',
+'listfiles_thumb' => 'Minijatura',
 'listfiles_date' => 'Datum',
 'listfiles_name' => 'Naziv',
 'listfiles_user' => 'Korisnik',
@@ -2006,8 +2022,8 @@ Dostupan je i [[Special:WhatLinksHere/$2|potpuni spisak]].',
 'sharedupload' => 'Ova datoteka se nalazi na $1 i može se koristiti i na drugim projektima.',
 'sharedupload-desc-there' => 'Ova datoteka se nalazi na $1 i može se koristiti i na drugim projektima.
 Pogledajte [$2 stranicu za opis datoteke] za više detalja o njoj.',
-'sharedupload-desc-here' => 'Ova datoteka se nalazi na $1 i može se koristiti i na drugim projektima.
-Opis na [$2 stranici datoteke] je prikazan ispod.',
+'sharedupload-desc-here' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
+Opis njene [$2 stranice za opis] je prikazan ispod.',
 'sharedupload-desc-edit' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
 Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 'sharedupload-desc-create' => 'Ova datoteka se nalazi na $1 i može da se koristi na drugim projektima.
@@ -2034,7 +2050,7 @@ Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 'filedelete' => 'Obriši $1',
 'filedelete-legend' => 'Obriši datoteku',
 'filedelete-intro' => "Brišete datoteku '''[[Media:$1|$1]]''' zajedno s njenom istorijom.",
-'filedelete-intro-old' => "Brišete izdanje datoteke '''[[Media:$1|$1]]''' od [$4 $2; $3].",
+'filedelete-intro-old' => "Brišete verziju datoteke '''[[Media:$1|$1]]''' od [$4 $2; $3].",
 'filedelete-comment' => 'Razlog:',
 'filedelete-submit' => 'Obriši',
 'filedelete-success' => "Datoteka '''$1''' je obrisana.",
@@ -2053,7 +2069,7 @@ Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 # MIME search
 'mimesearch' => 'MIME pretraga',
 'mimesearch-summary' => 'Ova stranica omogućava filtriranje datoteka prema njihovim vrstama MIME.
-Ulazni podaci: contenttype/subtype, npr. <tt>image/jpeg</tt>.',
+Ulazni podaci: contenttype/subtype, npr. <code>image/jpeg</code>.',
 'mimetype' => 'MIME vrsta:',
 'download' => 'preuzmi',
 
@@ -2100,9 +2116,9 @@ Pre brisanja proverite da li druge stranice vode do tih šablona.',
 
 'disambiguations' => 'Stranice do višeznačnih odrednica',
 'disambiguationspage' => 'Template:Višeznačna odrednica',
-'disambiguations-text' => "Sledeće stranice su povezane s '''višeznačnom odrednicom'''.
-One bi trebalo biti upućene ka odgovarajućem članku.
-Stranica se smatra višeznačnom odrednicom ako koristi šablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Sledeće stranice sadrže bar jednu vezu do '''višeznačne odrednice'''.
+Umesto toga, valjalo bi da vode do odgovarajuće teme.
+Stranica se smatra višeznačnom odrednicom ako koristi šablon koji vodi od [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dvostruka preusmerenja',
 'doubleredirectstext' => 'Ova stranica prikazuje stranice koje preusmeravaju na druga preusmerenja.
@@ -2210,6 +2226,7 @@ Druge veb stranice mogu koristiti sliku preko direktne adrese, tako da i pored t
 Možete suziti prikaz odabirući vrstu istorije, korisničkog imena ili tražene stranice.',
 'logempty' => 'Nema pronađenih stavki u istoriji.',
 'log-title-wildcard' => 'traži naslove koji počinju s ovim tekstom',
+'showhideselectedlogentries' => 'Prikaži/sakrij izabrane zapise',
 
 # Special:AllPages
 'allpages' => 'Sve stranice',
@@ -2256,7 +2273,7 @@ Pogledajte i [[Special:WantedCategories|tražene kategorije]].',
 'linksearch-ok' => 'Pretraži',
 'linksearch-text' => 'Mogu se koristiti džokeri poput „*.wikipedia.org“.<br />
 Potreban je najviši domen, kao „*.org“.<br />
-Podržani protokoli: <tt>$1</tt> (ne stavljajte u pretragu)',
+Podržani protokoli: <code>$1</code> (ne stavljajte u pretragu)',
 'linksearch-line' => '$1 veza u $2',
 'linksearch-error' => 'Džokeri se mogu pojaviti samo na početku adrese.',
 
@@ -2289,8 +2306,8 @@ Pogledajte [[{{MediaWiki:Listgrouprights-helppage}}|više detalja]] o pojedinač
 'listgrouprights-rights' => 'Prava',
 'listgrouprights-helppage' => 'Help:Prava grupe',
 'listgrouprights-members' => '(spisak članova)',
-'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
-'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
+'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <code>($2)</code></span>',
+'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <code>($2)</code></span>',
 'listgrouprights-addgroup' => 'dodaje {{PLURAL:$2|sledeću grupu|sledeće grupe}}: $1',
 'listgrouprights-removegroup' => 'briše {{PLURAL:$2|sledeću grupu|sledeće grupe}}: $1',
 'listgrouprights-addgroup-all' => 'dodavanje svih grupa',
@@ -2433,7 +2450,7 @@ Potvrdite svoju nameru, da razumete posledice i da ovo radite u skladu s [[{{Med
 Pogledajte ''$2'' za više detalja.",
 'dellogpage' => 'Dnevnik brisanja',
 'dellogpagetext' => 'Ispod je spisak poslednjih brisanja.',
-'deletionlog' => 'Dnevnik brisanja',
+'deletionlog' => 'dnevnik brisanja',
 'reverted' => 'Vraćeno na raniju izmenu',
 'deletecomment' => 'Razlog:',
 'deleteotherreason' => 'Drugi/dodatni razlog:',
@@ -2452,6 +2469,8 @@ Njeno brisanje može poremetiti bazu podataka, stoga postupajte s oprezom.',
 'rollback' => 'Vrati izmene',
 'rollback_short' => 'Vrati',
 'rollbacklink' => 'vrati',
+'rollbacklinkcount' => 'vrati $1 {{PLURAL:$1|izmenu|izmene|izmena}}',
+'rollbacklinkcount-morethan' => 'vrati više od $1 {{PLURAL:$1|izmene|izmene|izmena}}',
 'rollbackfailed' => 'Neuspešno vraćanje',
 'cantrollback' => 'Ne mogu da vratim izmenu.
 Poslednji autor je ujedno i jedini.',
@@ -2627,7 +2646,7 @@ Izveštaj o blokiranim korisnicima se nalazi ispod:',
 'sp-contributions-submit' => 'Pretraži',
 
 # What links here
-'whatlinkshere' => 'Šta je povezano ovde',
+'whatlinkshere' => 'Šta vodi ovde',
 'whatlinkshere-title' => 'Stranice koje su povezane sa „$1“',
 'whatlinkshere-page' => 'Stranica:',
 'linkshere' => "Sledeće stranice imaju vezu do '''[[:$1]]''':",
@@ -2648,7 +2667,7 @@ Izveštaj o blokiranim korisnicima se nalazi ispod:',
 # Block/unblock
 'autoblockid' => 'Samoblokiranje #$1',
 'block' => 'Blokiraj korisnika',
-'unblock' => 'Odblokiraj korisnika',
+'unblock' => 'Deblokiraj korisnika',
 'blockip' => 'Blokiraj korisnika',
 'blockip-title' => 'Blokiranje korisnika',
 'blockip-legend' => 'Blokiraj korisnika',
@@ -2669,7 +2688,7 @@ Izaberite konkretan razlog ispod (primer: navođenje konkretnih stranica koje su
 ** Neprihvatljivo korisničko ime',
 'ipb-hardblock' => 'Zabrani prijavljenim korisnicima da uređuju s ove IP adrese',
 'ipbcreateaccount' => 'Onemogući otvaranje naloga',
-'ipbemailban' => 'Zabrani korisniku slanje e-poruka',
+'ipbemailban' => 'Onemogući korisniku da šalje e-poruke',
 'ipbenableautoblock' => 'Automatski blokiraj poslednju IP adresu ovog korisnika i sve daljnje adrese s kojih pokuša da uređuje',
 'ipbsubmit' => 'Blokiraj ovog korisnika',
 'ipbother' => 'Drugo vreme:',
@@ -2688,11 +2707,11 @@ Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'ipb-blockingself' => 'Ovom radnjom ćete blokirati sebe! Jeste li sigurni da to želite?',
 'ipb-confirmhideuser' => 'Upravo ćete blokirati korisnika s uključenom mogućnošću „sakrij korisnika“. Ovim će korisničko ime biti sakriveno u svim spiskovima i izveštajima. Želite li to da uradite?',
 'ipb-edit-dropdown' => 'Uredi razloge blokiranja',
-'ipb-unblock-addr' => 'Odblokiraj $1',
-'ipb-unblock' => 'Odblokiraj korisničko ime ili IP adresu',
+'ipb-unblock-addr' => 'Deblokiraj $1',
+'ipb-unblock' => 'Deblokiraj korisničko ime ili IP adresu',
 'ipb-blocklist' => 'Pogledaj postojeća blokiranja',
 'ipb-blocklist-contribs' => 'Doprinosi za $1',
-'unblockip' => 'Odblokiraj korisnika',
+'unblockip' => 'Deblokiraj korisnika',
 'unblockiptext' => 'Koristite obrazac ispod da biste vratili pravo pisanja blokiranoj IP adresi ili korisničkom imenu.',
 'ipusubmit' => 'Ukloni ovu blokadu',
 'unblocked' => '[[User:$1|$1]] je deblokiran',
@@ -2724,7 +2743,7 @@ Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'ipblocklist-empty' => 'Spisak blokiranja je prazan.',
 'ipblocklist-no-results' => 'Tražena IP adresa ili korisničko ime nije blokirano.',
 'blocklink' => 'blokiraj',
-'unblocklink' => 'odblokiraj',
+'unblocklink' => 'deblokiraj',
 'change-blocklink' => 'promeni blokiranje',
 'contribslink' => 'doprinosi',
 'emaillink' => 'pošalji e-poruku',
@@ -2740,7 +2759,7 @@ Istorija sakrivanja se nalazi ispod:',
 'blocklogtext' => 'Ovo je dnevnik blokiranja i deblokiranja korisnika.
 Automatski blokirane IP adrese nisu navedene.
 Tekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].',
-'unblocklogentry' => '{{GENDER:|je odblokirao|je odblokirala|je odblokirao}} „$1“',
+'unblocklogentry' => '{{GENDER:|je deblokirao|je deblokirala|je deblokirao}} „$1“',
 'block-log-flags-anononly' => 'samo anonimni korisnici',
 'block-log-flags-nocreate' => 'onemogućeno otvaranje naloga',
 'block-log-flags-noautoblock' => 'automatsko blokiranje je onemogućeno',
@@ -2958,6 +2977,7 @@ Sve radnje pri uvozu s drugih vikija su zabeležene u [[Special:Log/import|dnevn
 'import-interwiki-templates' => 'Uključi sve šablone',
 'import-interwiki-submit' => 'Uvezi',
 'import-interwiki-namespace' => 'Odredišni imenski prostor:',
+'import-interwiki-rootpage' => 'Odredišna osnovna stranica (neobavezno):',
 'import-upload-filename' => 'Naziv datoteke:',
 'import-comment' => 'Komentar:',
 'importtext' => 'Izvezite datoteku s izvornog vikija koristeći [[Special:Export|izvoz]].
@@ -2994,6 +3014,9 @@ Pokušajte ponovo.',
 'import-error-interwiki' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (međuviki).',
 'import-error-special' => 'Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.',
 'import-error-invalid' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.',
+'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Navedena osnovna stranica ima neispravan naslov.',
+'import-rootpage-nosubpage' => 'Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.',
 
 # Import log
 'importlogpage' => 'Dnevnik uvoza',
@@ -3029,7 +3052,7 @@ Pokušajte ponovo.',
 'tooltip-ca-edit' => 'Možete da uređujete ovu stranicu. Koristite pretpregled pre snimanja',
 'tooltip-ca-addsection' => 'Započnite novi odeljak',
 'tooltip-ca-viewsource' => 'Ova stranica je zaključana. Možete da vidite izvorni kod.',
-'tooltip-ca-history' => 'Prethodna izdanja ove stranice',
+'tooltip-ca-history' => 'Prethodne verzije ove stranice',
 'tooltip-ca-protect' => 'Zaštitite ovu stranicu',
 'tooltip-ca-unprotect' => 'Promeni zaštitu ove stranice',
 'tooltip-ca-delete' => 'Obrišite ovu stranicu',
@@ -3078,7 +3101,7 @@ Pokušajte ponovo.',
 'tooltip-watchlistedit-raw-submit' => 'Ažuriraj spisak',
 'tooltip-recreate' => 'Ponovo napravite stranicu iako je obrisana',
 'tooltip-upload' => 'Započnite otpremanje',
-'tooltip-rollback' => '„Vrati“ poništava poslednju izmenu ove stranice s jednim klikom',
+'tooltip-rollback' => 'Opcija „Vrati“ vraća izmene poslednjeg korisnika',
 'tooltip-undo' => 'Vraća ovu izmenu i otvara obrazac za uređivanje.',
 'tooltip-preferences-save' => 'Sačuvaj postavke',
 'tooltip-summary' => 'Unesite kratak opis',
@@ -3140,20 +3163,16 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'spamprotectionmatch' => 'Sledeći tekst je izazvao naš filter za nepoželjne poruke: $1',
 'spambot_username' => 'Čišćenje nepoželjnih poruka u Medijavikiji',
 'spam_reverting' => 'Vraćam na poslednju izmenu koja ne sadrži veze do $1',
-'spam_blanking' => 'Sve izmene koje sadrže veze do $1, brišem',
+'spam_blanking' => 'Sve izmene sadrže veze do $1. Čistim',
+'spam_deleting' => 'Sve izmene sadrže veze do $1. Brišem',
 
 # Info page
 'pageinfo-title' => 'Podaci o „$1“',
-'pageinfo-header-edits' => 'Izmena',
-'pageinfo-header-watchlist' => 'Spisak nadgledanja',
-'pageinfo-header-views' => 'Pregleda',
-'pageinfo-subjectpage' => 'Stranica',
-'pageinfo-talkpage' => 'Stranica za razgovor',
-'pageinfo-watchers' => 'Broj pregledača',
-'pageinfo-edits' => 'Broj izmena',
-'pageinfo-authors' => 'Broj različitih autora',
+'pageinfo-header-edits' => 'Istorija izmena',
 'pageinfo-views' => 'Broj pregleda',
-'pageinfo-viewsperedit' => 'Pregleda po izmeni',
+'pageinfo-watchers' => 'Broj nadgledača stranica',
+'pageinfo-edits' => 'Broj izmena',
+'pageinfo-authors' => 'Broj zasebnih autora',
 
 # Skin names
 'skinname-standard' => 'Klasično',
@@ -3179,7 +3198,7 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 
 # Patrol log
 'patrol-log-page' => 'Dnevnik patroliranja',
-'patrol-log-header' => 'Ovo je istorija pregledanih izmena.',
+'patrol-log-header' => 'Ovo je dnevnik patroliranih izmena.',
 'log-show-hide-patrol' => '$1 dnevnik patroliranja',
 
 # Image deletion
@@ -3478,7 +3497,7 @@ Ako je prvobitno stanje datoteke promenjeno, moguće je da neki detalji ne opisu
 'exif-datetimeexpires' => 'Ne koristi nakon',
 'exif-datetimereleased' => 'Objavljeno',
 'exif-originaltransmissionref' => 'Izvorni prenos kôda lokacije',
-'exif-identifier' => 'Oznaka',
+'exif-identifier' => 'Naznaka',
 'exif-lens' => 'Korišćeni objektiv',
 'exif-serialnumber' => 'Serijski broj kamere',
 'exif-cameraownername' => 'Vlasnik kamere',
@@ -3836,7 +3855,7 @@ Ovaj potvrdni kod ističe $6 u $7.',
 
 # Delete conflict
 'deletedwhileediting' => "'''Upozorenje''': ova stranica je obrisana nakon što ste počeli s uređivanjem!",
-'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|je obrisao|je obrisala|obrisa}} ovu stranicu nakon što ste počeli da je uređujete, sa sledećim razlogom:
+'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|je obrisao|je obrisala|je obrisao}} ovu stranicu nakon što ste počeli da je uređujete iz sledećeg razloga:
 : ''$2''
 Potvrdite da stvarno želite da napravite stranicu.",
 'confirmrecreate-noreason' => 'Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovu stranicu nakon što ste počeli da ga uređujete. Potvrdite da stvarno želite da ponovo napravite ovu stranicu.',
@@ -4061,7 +4080,7 @@ Slike su prikazane u punoj veličini, a druge vrste datoteka se pokreću pomoću
 * <span class="mw-specialpagecached">privremeno memorisane posebne stranice</span>',
 'specialpages-group-maintenance' => 'Izveštaji održavanja',
 'specialpages-group-other' => 'Ostale posebne stranice',
-'specialpages-group-login' => 'Otvaranje naloga i prijavljivanje',
+'specialpages-group-login' => 'Prijava/registracija',
 'specialpages-group-changes' => 'Skorašnje izmene i dnevnici',
 'specialpages-group-media' => 'Izveštaji o multimedijalnom sadržaju i otpremanja',
 'specialpages-group-users' => 'Korisnici i korisnička prava',
@@ -4137,17 +4156,17 @@ Slike su prikazane u punoj veličini, a druge vrste datoteka se pokreću pomoću
 'sqlite-no-fts' => '$1 bez podrške pretrage celog teksta',
 
 # New logging system
-'logentry-delete-delete' => '$1 je obrisao stranicu $3',
-'logentry-delete-restore' => '$1 je vratio stranicu $3',
-'logentry-delete-event' => '$1 je promenio vidljivost {{PLURAL:$5|događaja u istoriji|$5 događaja u istoriji|$5 događaja u istoriji}} na $3: $4',
-'logentry-delete-revision' => '$1 je promenio vidljivost {{PLURAL:$5|izmene|$5 izmene|$5 izmena}} na stranici $3: $4',
-'logentry-delete-event-legacy' => '$1 je promenio vidljivost događajâ u istoriji na $3',
-'logentry-delete-revision-legacy' => '$1 je promenio vidljivost izmenâ na stranici $3',
-'logentry-suppress-delete' => '$1 je potisnuo stranicu $3',
-'logentry-suppress-event' => '$1 je potajno promenio vidljivost {{PLURAL:$5|događaja u istoriji|$5 događaja u istoriji|$5 događaja u istoriji}} na $3: $4',
-'logentry-suppress-revision' => '$1 je potajno promenio vidljivost {{PLURAL:$5|izmene|$5 izmene|$5 izmena}} na stranici $3: $4',
-'logentry-suppress-event-legacy' => '$1 je potajno promenio vidljivost događajâ u istoriji na $3',
-'logentry-suppress-revision-legacy' => '$1 je potajno promenio vidljivost izmenâ na stranici $3',
+'logentry-delete-delete' => '$1 {{GENDER:|je obrisao|je obrisala|je obrisao}} $3',
+'logentry-delete-restore' => '$1 {{GENDER:|je vratio|je vratila|je vratio}} stranicu $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|je promenio|je promenila|je promenio}} vidljivost {{PLURAL:$5|događaja|$5 događaja|$5 događaja}} u dnevniku na $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:|je promenio|je promenila|je promenio}} vidljivost {{PLURAL:$5|izmene|$5 izmene|$5 izmena}} na stranici $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:|je promenio|je promenila|je promenio}} vidljivost događajâ u dnevniku na $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:|je promenio|je promenila|je promenio}} vidljivost izmenâ na stranici $3',
+'logentry-suppress-delete' => '$1 {{GENDER:|je potisnuo|je potisnula|je potisnuo}} stranicu $3',
+'logentry-suppress-event' => '$1 je potajno {{GENDER:|promenio|promenila|promenio}} vidljivost {{PLURAL:$5|događaja|$5 događaja|$5 događaja}} u dnevniku na $3: $4',
+'logentry-suppress-revision' => '$1 je potajno {{GENDER:|promenio|promenila|promenio}} vidljivost {{PLURAL:$5|izmene|$5 izmene|$5 izmena}} na stranici $3: $4',
+'logentry-suppress-event-legacy' => '$1 je potajno {{GENDER:|promenio|promenila|promenio}} vidljivost događajâ u dnevniku na $3',
+'logentry-suppress-revision-legacy' => '$1 je potajno {{GENDER:|promenio|promenila|promenio}} vidljivost izmenâ na stranici $3',
 'revdelete-content-hid' => 'sadržaj je sakriven',
 'revdelete-summary-hid' => 'opis izmene je sakriven',
 'revdelete-uname-hid' => 'korisničko ime je sakriveno',
@@ -4156,15 +4175,15 @@ Slike su prikazane u punoj veličini, a druge vrste datoteka se pokreću pomoću
 'revdelete-uname-unhid' => 'korisničko ime je otkriveno',
 'revdelete-restricted' => 'primenjena ograničenja za administratore',
 'revdelete-unrestricted' => 'uklonjena ograničenja za administratore',
-'logentry-move-move' => '$1 je premestio stranicu $3 na $4',
-'logentry-move-move-noredirect' => '$1 je premestio stranicu $3 na $4 bez ostavljanja preusmerenja',
-'logentry-move-move_redir' => '$1 je premestio stranicu $3 na $4 preko preusmerenja',
-'logentry-move-move_redir-noredirect' => '$1 je premestio stranicu $3 na $4 preko preusmerenja bez ostavljanja preusmerenja',
-'logentry-patrol-patrol' => '$1 je označio izmenu $4 stranice $3 kao pregledanu',
-'logentry-patrol-patrol-auto' => '$1 je samostalno označio izmenu $4 stranice $3 kao pregledanu',
-'logentry-newusers-newusers' => '$1 je otvorio korisnički nalog',
-'logentry-newusers-create' => '$1 je otvorio korisnički nalog',
-'logentry-newusers-create2' => '$1 je otvorio korisnički nalog $3',
+'logentry-move-move' => '$1 {{GENDER:|je premestio|je premestila|je premestio}} stranicu $3 na $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:|je premestio|je premestila|je premestio}} stranicu $3 na $4 bez ostavljanja preusmerenja',
+'logentry-move-move_redir' => '$1 {{GENDER:|je premestio|je premestila|je premestio}} stranicu $3 na $4 preko preusmerenja',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:|je premestio|je premestila|je premestio}} stranicu $3 na $4 preko preusmerenja bez ostavljanja preusmerenja',
+'logentry-patrol-patrol' => '$1 {{GENDER:|je označio|je označila|je označio}} izmenu $4 stranice $3 kao patroliranu',
+'logentry-patrol-patrol-auto' => '$1 je samostalno {{GENDER:|označio|označila|označio}} izmenu $4 stranice $3 kao pregledanu',
+'logentry-newusers-newusers' => '$1 {{GENDER:|je otvorio|je otvorila|je otvorio}} korisnički nalog',
+'logentry-newusers-create' => '$1 {{GENDER:|je otvorio|je otvorila|je otvorio}} korisnički nalog',
+'logentry-newusers-create2' => '$1 {{GENDER:|je otvorio|je otvorila|je otvorio}} korisnički nalog $3',
 'logentry-newusers-autocreate' => 'Nalog $1 je samostalno otvoren',
 'newuserlog-byemail' => 'lozinka je poslata e-poštom',
 
@@ -4195,9 +4214,12 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'api-error-empty-file' => 'Poslata datoteka je prazna.',
 'api-error-emptypage' => 'Stvaranje novih praznih stranica nije dozvoljeno.',
 'api-error-fetchfileerror' => 'Unutrašnja greška: došlo je do greške pri dobavljanju datoteke.',
+'api-error-fileexists-forbidden' => 'Već postoji datoteka s imenom „$1“ i ne može da se zameni.',
+'api-error-fileexists-shared-forbidden' => 'Već postoji datoteka s imenom „$1“ u zajedničkoj riznici i ne može da se zameni.',
 'api-error-file-too-large' => 'Poslata datoteka je prevelika.',
 'api-error-filename-tooshort' => 'Naziv datoteke je prekratak.',
 'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|je zabranjena vrsta datoteke|su zabranjene vrste datoteka}}. {{PLURAL:$3|Dozvoljena je|Dozvoljene su}} $2.',
 'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
 'api-error-hookaborted' => 'Izmena je odbačena od kuke za proširenja.',
 'api-error-http' => 'Unutrašnja greška: ne mogu da se povežem sa serverom.',
index 641ef8d..9918087 100644 (file)
@@ -112,44 +112,44 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#STIR', '#DOORVERWIJZING', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__NOINOT__', '__GEENINHOUD__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__NOPIKTURAMA__', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__INOTDWENGI__', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__INOT__', '__INHOUD__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__NOKENKISKAKI__', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'CURRENTMOTNH', 'DISIMUN', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'DISIMUNNEN', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'DISIMUNNENGEN', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'DISIMUNSH', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'DISIDEY', 'HUIDIGEDAG', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'DISIDEY2', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'DISIDEYNEN', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'DISIYARI', 'HUIDIGJAAR', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'DISITEN', 'HUIDIGETIJD', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'DISIYURU', 'HUIDIGUUR', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'PRESIMUN', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'PRESIMUNNEN', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'PRESIMUNNENGEN', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'PRESIMUNSH', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'PRESIDEY', 'PLAATSELIJKEDAG', 'LOKALEDAG', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'PRESIDEY2', 'PLAATSELIJKEDAG2', 'LOKALEDAG2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'PRESIDEYNEN', 'PLAATSELIJKEDAGNAAM', 'LOKALEDAGNAAM', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'PRESIYARI', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'PRESITEN', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'PRESIYURU', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'PAPIRANUMRO', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'PAPIRALEGIMNUMRO', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'GEFRENUMRO', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'MASYINNUMRO', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
-       'numberofedits'           => array( '1', 'KENKINUMRO', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
-       'pagename'                => array( '1', 'PAPIRANEN', 'PAGINANAAM', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'PAPIRANENE', 'PAGINANAAME', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NENPREKI', 'NAAMRUIMTE', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NENPREKIE', 'NAAMRUIMTEE', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'TAKIPREKI', 'OVERLEGRUIMTE', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'TAKIPREKIE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
-       'special'                 => array( '0', 'spesyal', 'speciaal', 'special' ),
+       'redirect'                  => array( '0', '#STIR', '#DOORVERWIJZING', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__NOINOT__', '__GEENINHOUD__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__NOPIKTURAMA__', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__INOTDWENGI__', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__INOT__', '__INHOUD__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__NOKENKISKAKI__', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'CURRENTMOTNH', 'DISIMUN', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'DISIMUNNEN', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'DISIMUNNENGEN', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'DISIMUNSH', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'DISIDEY', 'HUIDIGEDAG', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'DISIDEY2', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'DISIDEYNEN', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'DISIYARI', 'HUIDIGJAAR', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'DISITEN', 'HUIDIGETIJD', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'DISIYURU', 'HUIDIGUUR', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'PRESIMUN', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'            => array( '1', 'PRESIMUNNEN', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'PRESIMUNNENGEN', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'PRESIMUNSH', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'PRESIDEY', 'PLAATSELIJKEDAG', 'LOKALEDAG', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'PRESIDEY2', 'PLAATSELIJKEDAG2', 'LOKALEDAG2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'PRESIDEYNEN', 'PLAATSELIJKEDAGNAAM', 'LOKALEDAGNAAM', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'PRESIYARI', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'PRESITEN', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'PRESIYURU', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'PAPIRANUMRO', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'PAPIRALEGIMNUMRO', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'GEFRENUMRO', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'MASYINNUMRO', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'KENKINUMRO', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'PAPIRANEN', 'PAGINANAAM', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'PAPIRANENE', 'PAGINANAAME', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NENPREKI', 'NAAMRUIMTE', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NENPREKIE', 'NAAMRUIMTEE', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'TAKIPREKI', 'OVERLEGRUIMTE', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'TAKIPREKIE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
+       'special'                   => array( '0', 'spesyal', 'speciaal', 'special' ),
 );
 
 $messages = array(
index ca03e2a..e5916f4 100644 (file)
@@ -86,7 +86,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Beoarbaidengen truch ounmäldede Benutsere in ju Beoboachtengslieste uutbländje',
 'tog-watchlisthideanons' => 'Beoarbaidengen truch anonyme Benutsere (IP) in ju Beoboachtengslieste uutbländje',
 'tog-watchlisthidepatrolled' => 'Kontrollierde Annerengen in ju Beooboachtengslieste "Lääste Annerengen" uutbländje',
-'tog-nolangconversion' => 'Konvertierenge fon Sproakvarianten deaktivierje',
 'tog-ccmeonemails' => 'Seend mie Kopien fon do E-Maile, do iek uur Benutsere seende.',
 'tog-diffonly' => 'Wies bie dän Versionsfergliek bloot do Unnerskeede, nit ju fulboodige Siede',
 'tog-showhiddencats' => 'Wies ferstatte Kategorien',
@@ -1373,12 +1372,12 @@ Bestäätigje dan ju Lizenz-Fereenboarenge un klik deerätter ap '''„Doatäi h
 Dit kon n Skoft duurje, besunners bie ne loangsomme Internet-Ferbiendenge.
 
 Uum ne '''Bielde''' in ne Siede tou ferweenden, skrieuw an Steede fon ju Bielde toun Biespil:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:Doatäi.jpg<nowiki>]]</nowiki></tt>'''
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:Doatäi.jpg|Link-Text<nowiki>]]</nowiki></tt>'''
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:Doatäi.jpg<nowiki>]]</nowiki></code>'''
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:Doatäi.jpg|Link-Text<nowiki>]]</nowiki></code>'''
 
 Uum '''Mediendoatäie''' ientoubienden, ferweende toun Biespil:
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}:Doatäi.ogg<nowiki>]]</nowiki></tt>'''
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}:Doatäi.ogg|Link-Text<nowiki>]]</nowiki></tt>'''
+* '''<code><nowiki>[[</nowiki>{{ns:media}}:Doatäi.ogg<nowiki>]]</nowiki></code>'''
+* '''<code><nowiki>[[</nowiki>{{ns:media}}:Doatäi.ogg|Link-Text<nowiki>]]</nowiki></code>'''
 
 Beoachtje, dät, juust as bie normoale Sieden-Inhoolde, uur Benutsere dien Doatäie läskje of annerje konnen.",
 'upload-permitted' => 'Ferlööwede Doatäitypen: $1.',
@@ -1424,20 +1423,20 @@ Ferlööwed {{PLURAL:$3|is|sunt}} $2.",
 'windows-nonascii-filename' => 'Dit Wiki unnerstöänt neen Doatäinoomen do der Sunnerteekene änthoolde.',
 'fileexists' => "Ne Doatäi mäd dissen Noome bestoant al.
 Wan du ap 'Doatäi spiekerje' klikst, wäd ju Doatäi uurskrieuwen.
-Unner '''<tt>[[:$1]]</tt>''' koast du die bewisje, of du dät wuddelk wolt.
+Unner <strong>[[:$1]]</strong> koast du die bewisje, of du dät wuddelk wolt.
 [[$1|thumb]]",
-'filepageexists' => "Ju Beskrieuwengssiede foar disse Doatäi wuude al moaked as '''<tt>[[:$1]]</tt>''', man der bestoant neen Doatäi mäd dissen Noome.
+'filepageexists' => 'Ju Beskrieuwengssiede foar disse Doatäi wuude al moaked as <strong>[[:$1]]</strong>, man der bestoant neen Doatäi mäd dissen Noome.
 Ju ienroate Beskrieuwenge wäd nit ap ju Beskrieuwengssiede uurnuumen.
 Ju Beskrieuwengssiede moast du ätter dät Hoochleeden fon ju Doatäi noch mäd de Hounde beoarbaidje.
-[[$1|thumb]]",
-'fileexists-extension' => "Een Doatäi mäd n äänelken Noome existiert al: [[$2|thumb]]
-* Noome fon ju hoochtouleedende Doatäi: '''<tt>[[:$1]]</tt>'''
-* Noome fon ju anweesende Doatäi: '''<tt>[[:$2]]</tt>'''
-Wääl n uur Noome.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Een Doatäi mäd n äänelken Noome existiert al: [[$2|thumb]]
+* Noome fon ju hoochtouleedende Doatäi: <strong>[[:$1]]</strong>
+* Noome fon ju anweesende Doatäi: <strong>[[:$2]]</strong>
+Wääl n uur Noome.',
 'fileexists-thumbnail-yes' => "Bie ju Doatäi skient et sik uum ne Bielde fon ferlitjerde Grööte ''(thumbnail)'' tou honneljen. [[$1|thumb]]
-Pröif ju Doatäi '''<tt>[[:$1]]</tt>'''.
+Pröif ju Doatäi <strong>[[:$1]]</strong>.
 Wan et sik uum ju Bielde in Originoalgrööte honnelt, dan houget neen apaate Foarskaubielde hoochleeden tou wäiden.",
-'file-thumbnail-no' => "Die Doatäinoome begint mäd '''<tt>$1</tt>'''. Dit tjut ap ne Bielde fon ferlitjerde Grööte ''(thumbnail)'' wai.
+'file-thumbnail-no' => "Die Doatäinoome begint mäd <strong>$1</strong>. Dit tjut ap ne Bielde fon ferlitjerde Grööte ''(thumbnail)'' wai.
 Pröif, of du ju Bielde in fulle Aplöösenge foarlääsen hääst un leed ju unner dän Originoalnoome hooch. Uurs annerje dän Doatäinoome.",
 'fileexists-forbidden' => 'Mäd dissen Noome bestoant al ne Doatäi un ju kon nit uurskrieuwen wäide. Gung jädden tourääch un leede dien Doatäi unner n uur Noome hooch. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Mäd dissen Noome bestoant al ne Doatäi in dät zentroale Medienarchiv.
@@ -1629,7 +1628,7 @@ Ne [[Special:WhatLinksHere/$2|fulständige Lieste]] is ferföigboar.',
 
 # MIME search
 'mimesearch' => 'Säike ätter MIME-Typ',
-'mimesearch-summary' => 'Ap disse Spezialsiede konnen do Doatäie ätter dän MIME-Typ filterd wäide. Ju Iengoawe mout immer dän Medien- un Subtyp beienhoolde: <tt>image/jpeg</tt> (sjuch Bieldbeskrieuwengssiede).',
+'mimesearch-summary' => 'Ap disse Spezialsiede konnen do Doatäie ätter dän MIME-Typ filterd wäide. Ju Iengoawe mout immer dän Medien- un Subtyp beienhoolde: <code>image/jpeg</code> (sjuch Bieldbeskrieuwengssiede).',
 'mimetype' => 'MIME-Typ:',
 'download' => 'Deelleede',
 
@@ -1818,7 +1817,7 @@ Sjuch uk ju Lieste fon do [[Special:WantedCategories|wonskede Kategorien]].',
 'linksearch-pat' => 'Säikmuster:',
 'linksearch-ns' => 'Noomensruum:',
 'linksearch-ok' => 'Säike (012)',
-'linksearch-text' => 'Disse Spezioalsiede moaket ju Säike muugelke ätter Sieden, in do bestimde Webferbiendengen äntheelden sunt. Deerbie konnen Ploatshooldere as biespilswiese <tt>*.biespiell.de</tt> benutsed wäide. Der mout ap minste een Top-Level-Domai, t.B. „*.org“. anroat wäide. <br />Unnerstutsede Protokolle: <tt>$1</tt> (Disse jädden nit bie ju Säikanfroage anreeke.)',
+'linksearch-text' => 'Disse Spezioalsiede moaket ju Säike muugelke ätter Sieden, in do bestimde Webferbiendengen äntheelden sunt. Deerbie konnen Ploatshooldere as biespilswiese <code>*.biespiell.de</code> benutsed wäide. Der mout ap minste een Top-Level-Domai, t.B. „*.org“. anroat wäide. <br />Unnerstutsede Protokolle: <code>$1</code> (Disse jädden nit bie ju Säikanfroage anreeke.)',
 'linksearch-line' => '$1 is ferlinked fon $2',
 'linksearch-error' => 'Wildcards konnen bloot an dän Ounfang fon ju URL ferwoand wäide.',
 
@@ -2610,15 +2609,10 @@ Do ap dän lokoale Reekener spiekerje un deerätter hier hoochleede.',
 # Info page
 'pageinfo-title' => 'Informatione tou „$1“',
 'pageinfo-header-edits' => 'Beoarbaidengen',
-'pageinfo-header-watchlist' => 'Beooboachtengslieste',
-'pageinfo-header-views' => 'Siedenaproupe',
-'pageinfo-subjectpage' => 'Siede',
-'pageinfo-talkpage' => 'Diskussionssiede',
+'pageinfo-views' => 'Antaal fon Siedenaproupe',
 'pageinfo-watchers' => 'Antaal fon do Besäikere',
 'pageinfo-edits' => 'Antaal fon do  Beoarbaidengen',
 'pageinfo-authors' => 'Antaal fon unnerskeedelke Autoren',
-'pageinfo-views' => 'Antaal fon Siedenaproupe',
-'pageinfo-viewsperedit' => 'Siedenaproupe pro Beoarbaidenge',
 
 # Patrolling
 'markaspatrolleddiff' => 'As pröiwed markierje',
index ff0b98d..6b8b243 100644 (file)
@@ -136,7 +136,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Sumputkeun anu geus diroris ti béréndélan nu anyar robah',
 'tog-newpageshidepatrolled' => 'Sumputkeun nu geus diroris tina béréndélan kaca anyar',
 'tog-extendwatchlist' => 'Legaan béréndélan ngarah sakabéh parobahanana kaawaskeun',
-'tog-usenewrc' => 'Nu anyar robah dina wanda séjén (maké JavaScript)',
+'tog-usenewrc' => 'Parobahan grup dumasar kaca dina béréndélan anyar robah jeung awaskeuneun (maké JavaScript)',
 'tog-numberheadings' => 'Nomeran lulugu sacara otomatis',
 'tog-showtoolbar' => "Témbongkeun ''toolbar'' édit (JavaScript)",
 'tog-editondblclick' => 'Édit kaca ku klik ganda (JavaScript)',
@@ -144,17 +144,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Fungsikeun ngédit sub-bagean kalawan klik-katuhu dina judul bagean (JavaScript)',
 'tog-showtoc' => 'Témbongkeun daptar eusi<br />(pikeun kaca nu leuwih ti tilu subjudul)',
 'tog-rememberpassword' => 'Apalkeun login kuring dina ieu panyungsi (pikeun paling lila $1 {{PLURAL:$1|poé|poé}})',
-'tog-watchcreations' => 'Awaskeun kaca jieunan kuring',
-'tog-watchdefault' => 'Tambahkeun kaca nu diédit ku anjeun kana awaskeuneun anjeun',
-'tog-watchmoves' => 'Awaskeun kaca nu dipindahkeun ku kuring',
-'tog-watchdeletion' => 'Awaskeun kaca nu dihapus ku kuring',
+'tog-watchcreations' => 'Tambahkeun kaca-kaca jieunan kuring jeung berkas muatan kuring kana awaskeuneun',
+'tog-watchdefault' => 'Tambahkeun kaca jeung berkas anu diédit ku kuring kana awaskeuneun',
+'tog-watchmoves' => 'Tambahkeun kaca jeung berkas anu dipindahkeun ka awaskeuneun',
+'tog-watchdeletion' => 'Tambahkeun kaca jeung berkas anu dihapus kana awaskeuneun',
 'tog-minordefault' => 'Tandaan sadaya éditan salaku minor luyu jeung ti dituna',
 'tog-previewontop' => 'Témbongkeun sawangan méméh kotak édit (lain sanggeusna)',
 'tog-previewonfirst' => 'Témbongkeun sawangan dina éditan munggaran',
 'tog-nocache' => "Tumpurkeun ''cache'' kaca dina pangaprak",
-'tog-enotifwatchlistpages' => 'Surélékan mun robah',
+'tog-enotifwatchlistpages' => 'Lamun aya kaca atawa berkas anu diawaskeun robah, béjaan ngaliwatan surélék',
 'tog-enotifusertalkpages' => 'Mun kaca obrolan kuring robah, béjaan ngaliwatan surélék',
-'tog-enotifminoredits' => 'Béjaan ogé (ngaliwatan surélék) mun aya parobahan leutik dina kacana',
+'tog-enotifminoredits' => 'Béjaan ogé (ngaliwatan surélék) lamun aya parobahan leutik dina kaca jeung berkasna',
 'tog-enotifrevealaddr' => 'Témbongkeun alamat surélék kuring dina surat émbaran',
 'tog-shownumberswatching' => 'Témbongkeun jumlah nu ngawaskeun',
 'tog-oldsig' => 'Paraf nu geus aya:',
@@ -170,7 +170,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Sumputkeun éditan pamaké nu asup log tina daptar awaskeun',
 'tog-watchlisthideanons' => 'Sumputkeun éditan pamaké anonim tina daptar awaskeun',
 'tog-watchlisthidepatrolled' => 'Sumputkeun éditan nu geus diroris tina béréndélan awaskeuneun',
-'tog-nolangconversion' => 'Tumpurkeun konversi varian',
 'tog-ccmeonemails' => 'Kirimkeun ogé salinan surélékna ka alamat kuring',
 'tog-diffonly' => 'Ulah némbongkeun eusi kaca di handapeun béda éditan',
 'tog-showhiddencats' => 'Témbongkeun kategori nyumput',
@@ -1425,8 +1424,8 @@ Pikeun némbongkeun atawa néang gambar-gambar nu pernah dimuat saméméhna, man
 Paké formulir di handap pikeun ngamuat koropak gambar anyar pikeun ilustrasi kaca anjeun. Na kalolobaan panyungsi, anjeun bakal manggihan tombol \"Sungsi/''Browse''...\", nu bakal nganteur ka dialog muka-koropak nu baku na sistim operasi anjeun. Milih hiji koropak bakal ngeusian ngaran koropakna kana rohangan téks gigireun tombol nu tadi. Anjeun ogé kudu nyontréng kotak nu nandakeun yén anjeun teu ngarumpak hak cipta batur ku dimuatna ieu koropak. Pencét tombol \"Muatkeun/''Upload''\" pikeun ngeréngsékeun muatan. Prosés ieu bisa lila mun anjeun migunakeun sambungan internét nu lambat.
 
 Format nu dianjurkeun nyéta JPEG pikeun gambar fotografik, PNG pikeun hasil ngagambar sarta gambar séjénna, sarta OGG pikeun sora. Pilih ngaran koropak nu déskriptif sangkan teu ngalieurkeun. Pikeun ngasupkeun gambarna na kaca séjén, pigunakeun tumbu dina wujud
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Gambar.jpg]]</nowiki></tt>''' pikeun gambar dina ukuran aslina
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></tt>''' pikeun sora.
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Gambar.jpg]]</nowiki></code>''' pikeun gambar dina ukuran aslina
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' pikeun sora.
 
 Catet yén salaku kaca wiki, nu séjén bisa ngarobah atawa ngahapus muatan anjeun mun maranéhna nganggap ieu saluyu jeung kapentingan proyék, sarta anjeun bisa waé dipeungpeuk ti ngamuat koropak mun anjeun ngaruksak/ngaganggu sistim.",
 'upload-permitted' => 'Tipeu koropak nu diwidian: $1.',
@@ -1468,12 +1467,12 @@ Catet yén salaku kaca wiki, nu séjén bisa ngarobah atawa ngahapus muatan anje
 'largefileserver' => 'Ieu koropak badag teuing, ngaleuwihan wates nu diwenangkeun ku server.',
 'emptyfile' => "Koropak nu dimuatkeun ku anjeun jigana kosong. Hal ieu bisa jadi alatan sarupaning ''typo'' na ngaran koropakna. Mangga parios deui yén anjeun leres-leres hoyong ngamuat koropak éta.",
 'windows-nonascii-filename' => 'Ieu wiki teu ngarojong ngaran berkas anu maké aksara husus.',
-'fileexists' => "Koropak nu ngaranna kieu geus aya, mangga parios '''<tt>[[:$1]]</tt>''' mun anjeun teu yakin rék ngaganti.
-[[$1|thumb]]",
-'fileexists-extension' => "Geus aya berkas anu ngaranna sarupa: [[$2|thumb]]
-* Ngaran berkas nu dimuat: '''<tt>[[:$1]]</tt>'''
-* Ngaran berkas nu geus aya: '''<tt>[[:$2]]</tt>'''
-Pilih ngaran séjén.",
+'fileexists' => 'Koropak nu ngaranna kieu geus aya, mangga parios <strong>[[:$1]]</strong> mun anjeun teu yakin rék ngaganti.
+[[$1|thumb]]',
+'fileexists-extension' => 'Geus aya berkas anu ngaranna sarupa: [[$2|thumb]]
+* Ngaran berkas nu dimuat: <strong>[[:$1]]</strong>
+* Ngaran berkas nu geus aya: <strong>[[:$2]]</strong>
+Pilih ngaran séjén.',
 'fileexists-forbidden' => 'Berkas  nu ngaranna kitu geus aya sarta teu bisa ditimpah.
 Mun anjeun keukeuh rék ngunggahkeun berkas anjeun, mangga balik deui sarta paké ngaran anyar.
 [[File:$1|thumb|center|$1]]',
@@ -1620,7 +1619,7 @@ Pedaran ti [$2 kaca pedaranana] dipidangkeun di handap.',
 
 # MIME search
 'mimesearch' => 'Sungsi MIME',
-'mimesearch-summary' => 'Ieu kaca bisa dipaké nyaring koropak dumasar tipeu MIME-na. Asupan: contenttype/subtype, contona <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Ieu kaca bisa dipaké nyaring koropak dumasar tipeu MIME-na. Asupan: contenttype/subtype, contona <code>image/jpeg</code>.',
 'mimetype' => 'Tipeu MIME:',
 'download' => 'pulut',
 
@@ -1805,7 +1804,7 @@ Baca ogé [[Special:WantedCategories|kategori nu dipikabutuh]].',
 'linksearch-pat' => 'Pola sungsi:',
 'linksearch-ns' => 'Spasi ngaran:',
 'linksearch-ok' => 'Sungsi',
-'linksearch-text' => "''Wildcard'' sarupaning \"*.wikipedia.org\" bisa dipaké.<br />Protokol nu dirojong: <tt>\$1</tt>",
+'linksearch-text' => "''Wildcard'' sarupaning \"*.wikipedia.org\" bisa dipaké.<br />Protokol nu dirojong: <code>\$1</code>",
 'linksearch-line' => '$1 ditumbu ti $2',
 'linksearch-error' => "''Wildcard'' ngan bisa némbongan dina awal ngaran indung (''host'').",
 
@@ -2479,8 +2478,6 @@ Sigana mah ieu téh alatan tumbu ka loka luar.',
 # Info page
 'pageinfo-title' => 'Émbaran pikeun "$1"',
 'pageinfo-header-edits' => 'Éditan',
-'pageinfo-subjectpage' => 'Kaca',
-'pageinfo-talkpage' => 'Kaca sawala',
 'pageinfo-watchers' => 'Jumlah nu ngawaskeun',
 'pageinfo-edits' => 'Jumlah éditan',
 'pageinfo-authors' => 'Jumlah kontributor nu béda',
@@ -2786,6 +2783,12 @@ Nu séjénna bakal disumputkeun sakumaha asalna.
 'exif-gpslongitude-e' => 'Gurat Wétan',
 'exif-gpslongitude-w' => 'Gurat Kulon',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|méter|méter}} luhureun beungeut laut',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|méter|méter}} handapeun beungeut laut',
+
+'exif-gpsstatus-a' => 'Keur ngukur',
+
 'exif-gpsmeasuremode-2' => 'Ukuran 2-diménsi',
 'exif-gpsmeasuremode-3' => 'Ukuran 3-diménsi',
 
@@ -2794,9 +2797,53 @@ Nu séjénna bakal disumputkeun sakumaha asalna.
 'exif-gpsspeed-m' => 'Mil per jam',
 'exif-gpsspeed-n' => 'Knot',
 
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Kilométer',
+'exif-gpsdestdistance-m' => 'Mil',
+'exif-gpsdestdistance-n' => 'Mil laut',
+
+'exif-gpsdop-excellent' => 'Sampurna ($1)',
+'exif-gpsdop-good' => 'Alus ($1)',
+'exif-gpsdop-moderate' => 'Moderat ($1)',
+'exif-gpsdop-fair' => 'Cukup ($1)',
+'exif-gpsdop-poor' => 'Awon ($1)',
+
+'exif-objectcycle-a' => 'Isuk-isuk wungkul',
+'exif-objectcycle-p' => 'Soré wungkul',
+'exif-objectcycle-b' => 'Isuk jeung beurang',
+
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'Arah sajati',
 'exif-gpsdirection-m' => 'Arah magnétik',
 
+'exif-ycbcrpositioning-1' => 'Nengah',
+
+'exif-dc-contributor' => 'Kontributor',
+'exif-dc-date' => 'Titimangsa',
+'exif-dc-publisher' => 'Pamedal',
+'exif-dc-relation' => 'Média anu tumali',
+'exif-dc-rights' => 'Hak',
+'exif-dc-source' => 'Média sumber',
+'exif-dc-type' => 'Jenis média',
+
+'exif-rating-rejected' => 'Ditolak',
+
+'exif-isospeedratings-overflow' => 'Leuwih ti 65535',
+
+'exif-iimcategory-ace' => 'Seni, budaya, jeung hiburan',
+'exif-iimcategory-clj' => 'Hukum jeung kajahatan',
+'exif-iimcategory-dis' => 'Bencana jeung kacilakaan',
+'exif-iimcategory-edu' => 'Atikan',
+'exif-iimcategory-evn' => 'Lingkungan',
+'exif-iimcategory-hth' => 'Kawaluyaan',
+'exif-iimcategory-pol' => 'Politik',
+'exif-iimcategory-rel' => 'Ageman jeung kayakinan',
+'exif-iimcategory-soi' => 'Isu sosial',
+'exif-iimcategory-spo' => 'Olahraga',
+'exif-iimcategory-wea' => 'Cuaca',
+
+'exif-urgency-normal' => 'Normal ($1)',
+
 # External editor support
 'edit-externally' => 'Édit koropak ieu migunakeun aplikasi éksternal',
 'edit-externally-help' => 'Baca [//www.mediawiki.org/wiki/Manual:External_editors pituduh ngatur] pikeun émbaran leuwih jéntré.',
@@ -3010,12 +3057,29 @@ Coba ku sawangan normal.',
 'revdelete-unrestricted' => 'Watesan akses kuncén dihapuskeun',
 'newuserlog-byemail' => 'Sandi geus dikirim maké surélék.',
 
+# Feedback
+'feedback-subject' => 'Ngeunaan:',
+'feedback-message' => 'Surat:',
+'feedback-cancel' => 'Bolay',
+
 # API errors
 'api-error-file-too-large' => 'Berkas nu dikirim gedé teuing.',
 'api-error-filename-tooshort' => 'Ngaran berkas pondok teuing.',
 'api-error-filetype-banned' => 'Jenis berkas ieu dipahing.',
+'api-error-filetype-banned-type' => '$1 kaasup tipeu koropak nu teu dicaram. {{PLURAL:$3|Nu diwidian nyaéta|Nu diwidian nyaéta}} $2.',
 'api-error-filetype-missing' => 'Ngaran berkas euweuh éxténsian.',
 'api-error-illegal-filename' => 'Ngaran berkas kitu dipahing.',
 'api-error-mustbeloggedin' => 'Anjeun kudu asup log pikeun ngunggahkeun berkas.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|detik|detik}}',
+'duration-minutes' => '$1 {{PLURAL:$1|menit|menit}}',
+'duration-hours' => '$1 {{PLURAL:$1|jam|jam}}',
+'duration-days' => '$1 {{PLURAL:$1|poé|poé}}',
+'duration-weeks' => '$1 {{PLURAL:$1|minggu|minggu}}',
+'duration-years' => '$1 {{PLURAL:$1|taun|taun}}',
+'duration-decades' => '$1 {{PLURAL:$1|dékadeu|dékadeu}}',
+'duration-centuries' => '$1 {{PLURAL:$1|abad|abad}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milénium|milénium}}',
+
 );
index 50716de..c343447 100644 (file)
@@ -12,6 +12,7 @@
  * @author Dafer45
  * @author Diupwijk
  * @author EPO
+ * @author Fader
  * @author Fluff
  * @author GameOn
  * @author Greggegorius
@@ -47,6 +48,7 @@
  * @author Thurs
  * @author Tobulos1
  * @author VickyC
+ * @author Warrakkk
  * @author Where next Columbus
  * @author Where next Columbus?
  * @author WikiPhoenix
@@ -171,127 +173,127 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#OMDIRIGERING', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__INGENINNEHÅLLSFÖRTECKNING__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__INGETGALLERI__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ALLTIDINNEHÅLLSFÖRTECKNING__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__INNEHÅLLSFÖRTECKNING__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__INTEREDIGERASEKTION__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__INGENRUBRIK__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'NUVARANDEMÅNAD', 'NUMÅNAD', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'NUVARANDEMÅNAD1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'NUVARANDEMÅNADSNAMN', 'NUMÅNADSNAMN', 'CURRENTMONTHNAME' ),
-       'currentmonthabbrev'      => array( '1', 'NUVARANDEMÅNADKORT', 'NUMÅNADKORT', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'NUVARANDEDAG', 'NUDAG', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'NUVARANDEDAG2', 'NUDAG2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'NUVARANDEDAGSNAMN', 'NUDAGSNAMN', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'NUVARANDEÅR', 'NUÅR', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'NUVARANDETID', 'NUTID', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'NUVARANDETIMME', 'NUTIMME', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'LOKALMÅNAD', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'LOKALMÅNAD1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'LOKALMÅNADSNAMN', 'LOCALMONTHNAME' ),
-       'localmonthabbrev'        => array( '1', 'LOKALMÅNADKORT', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'LOKALDAG', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'LOKALDAG2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'LOKALDAGSNAMN', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'LOKALTÅR', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'LOKALTID', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'LOKALTIMME', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'ANTALSIDOR', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'ANTALARTIKLAR', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'ANTALFILER', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'ANTALANVÄNDARE', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'ANTALAKTIVAANVÄNDARE', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'ANTALREDIGERINGAR', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'ANTALVISNINGAR', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'SIDNAMN', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'SIDNAMNE', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'NAMNRYMD', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'NAMNRYMDE', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'DISKUSSIONSRYMD', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'DISKUSSIONSRYMDE', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ARTIKELRYMD', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ARTIKELRYMDE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'HELASIDNAMNET', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'HELASIDNAMNETE', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'UNDERSIDNAMN', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'UNDERSIDNAMNE', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'GRUNDSIDNAMN', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'GRUNDSIDNAMNE', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'DISKUSSIONSSIDNAMN', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'DISKUSSIONSSIDNAMNE', 'TALKPAGENAMEE' ),
-       'msg'                     => array( '0', 'MED:', 'MSG:' ),
-       'subst'                   => array( '0', 'BYT:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'MEDNW:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'miniatyr', 'mini', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniatyr=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'höger', 'right' ),
-       'img_left'                => array( '1', 'vänster', 'left' ),
-       'img_none'                => array( '1', 'ingen', 'none' ),
-       'img_center'              => array( '1', 'centrerad', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'inramad', 'ram', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'ramlös', 'frameless' ),
-       'img_page'                => array( '1', 'sida=$1', 'sida $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'stående', 'stående=$1', 'stående $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'kantlinje', 'border' ),
-       'img_baseline'            => array( '1', 'baslinje', 'baseline' ),
-       'img_sub'                 => array( '1', 'ned', 'sub' ),
-       'img_super'               => array( '1', 'upp', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'topp', 'top' ),
-       'img_text_top'            => array( '1', 'text-topp', 'text-top' ),
-       'img_middle'              => array( '1', 'mitten', 'middle' ),
-       'img_bottom'              => array( '1', 'botten', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'text-botten', 'text-bottom' ),
-       'img_link'                => array( '1', 'länk=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'SAJTNAMN', 'SITENAMN', 'SITENAME' ),
-       'ns'                      => array( '0', 'NR:', 'NS:' ),
-       'localurl'                => array( '0', 'LOKALURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'LOKALURLE:', 'LOCALURLE:' ),
-       'servername'              => array( '0', 'SERVERNAMN', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'SKRIPTSÖKVÄG', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'KÖN:', 'GENDER:' ),
-       'currentweek'             => array( '1', 'NUVARANDEVECKA', 'NUVECKA', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'NUVARANDEVECKODAG', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'LOKALVECKA', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'LOKALVECKODAG', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'REVISIONSID', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'REVISIONSDAG', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'REVISIONSDAG2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'REVISIONSMÅNAD', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'REVISIONSÅR', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'REVISIONSTIDSSTÄMPEL', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'REVISIONSANVÄNDARE', 'REVISIONUSER' ),
-       'fullurl'                 => array( '0', 'FULLTURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'FULLTURLE:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'LBFÖRST:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'UCFIRST', 'SBFÖRST:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'LB:', 'LC:' ),
-       'uc'                      => array( '0', 'SB:', 'UC:' ),
-       'raw'                     => array( '0', 'RÅ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'VISATITEL', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__NYTTAVSNITTLÄNK__', '__NEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'NUVARANDEVERSION', 'NUVERSION', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'NUTIDSTÄMPEL', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'LOKALTIDSTÄMPEL', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#SPRÅK:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'INNEHÅLLSSPRÅK', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'SIDORINAMNRYMD:', 'SIDORINR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'ANTALADMINS', 'ANTALADMINISTRATÖRER', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'FORMATERANUM', 'FORMATERATAL', 'FORMATNUM' ),
-       'defaultsort'             => array( '1', 'STANDARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'FILSÖKVÄG:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'tagg', 'tag' ),
-       'hiddencat'               => array( '1', '__DOLDKAT__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'SIDORIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'SIDSTORLEK', 'PAGESIZE' ),
-       'index'                   => array( '1', '__INDEXERA__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__INTEINDEXERA_', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'ANTALIGRUPP', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__STATISKOMDIRIGERING__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'SKYDDSNIVÅ', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'formateradatum', 'datumformat', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#OMDIRIGERING', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__INGENINNEHÅLLSFÖRTECKNING__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__INGETGALLERI__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ALLTIDINNEHÅLLSFÖRTECKNING__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__INNEHÅLLSFÖRTECKNING__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__INTEREDIGERASEKTION__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__INGENRUBRIK__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'NUVARANDEMÅNAD', 'NUMÅNAD', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'NUVARANDEMÅNAD1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'NUVARANDEMÅNADSNAMN', 'NUMÅNADSNAMN', 'CURRENTMONTHNAME' ),
+       'currentmonthabbrev'        => array( '1', 'NUVARANDEMÅNADKORT', 'NUMÅNADKORT', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'NUVARANDEDAG', 'NUDAG', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'NUVARANDEDAG2', 'NUDAG2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'NUVARANDEDAGSNAMN', 'NUDAGSNAMN', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'NUVARANDEÅR', 'NUÅR', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'NUVARANDETID', 'NUTID', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'NUVARANDETIMME', 'NUTIMME', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'LOKALMÅNAD', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'LOKALMÅNAD1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'LOKALMÅNADSNAMN', 'LOCALMONTHNAME' ),
+       'localmonthabbrev'          => array( '1', 'LOKALMÅNADKORT', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'LOKALDAG', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKALDAG2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'LOKALDAGSNAMN', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'LOKALTÅR', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'LOKALTID', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'LOKALTIMME', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'ANTALSIDOR', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ANTALARTIKLAR', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ANTALFILER', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ANTALANVÄNDARE', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'ANTALAKTIVAANVÄNDARE', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'ANTALREDIGERINGAR', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'ANTALVISNINGAR', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'SIDNAMN', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'SIDNAMNE', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'NAMNRYMD', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'NAMNRYMDE', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'DISKUSSIONSRYMD', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'DISKUSSIONSRYMDE', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ARTIKELRYMD', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ARTIKELRYMDE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'HELASIDNAMNET', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'HELASIDNAMNETE', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'UNDERSIDNAMN', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'UNDERSIDNAMNE', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'GRUNDSIDNAMN', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'GRUNDSIDNAMNE', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'DISKUSSIONSSIDNAMN', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'DISKUSSIONSSIDNAMNE', 'TALKPAGENAMEE' ),
+       'msg'                       => array( '0', 'MED:', 'MSG:' ),
+       'subst'                     => array( '0', 'BYT:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'MEDNW:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'miniatyr', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'miniatyr=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'höger', 'right' ),
+       'img_left'                  => array( '1', 'vänster', 'left' ),
+       'img_none'                  => array( '1', 'ingen', 'none' ),
+       'img_center'                => array( '1', 'centrerad', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'inramad', 'ram', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'ramlös', 'frameless' ),
+       'img_page'                  => array( '1', 'sida=$1', 'sida $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'stående', 'stående=$1', 'stående $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'kantlinje', 'border' ),
+       'img_baseline'              => array( '1', 'baslinje', 'baseline' ),
+       'img_sub'                   => array( '1', 'ned', 'sub' ),
+       'img_super'                 => array( '1', 'upp', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'topp', 'top' ),
+       'img_text_top'              => array( '1', 'text-topp', 'text-top' ),
+       'img_middle'                => array( '1', 'mitten', 'middle' ),
+       'img_bottom'                => array( '1', 'botten', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'text-botten', 'text-bottom' ),
+       'img_link'                  => array( '1', 'länk=$1', 'link=$1' ),
+       'sitename'                  => array( '1', 'SAJTNAMN', 'SITENAMN', 'SITENAME' ),
+       'ns'                        => array( '0', 'NR:', 'NS:' ),
+       'localurl'                  => array( '0', 'LOKALURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'LOKALURLE:', 'LOCALURLE:' ),
+       'servername'                => array( '0', 'SERVERNAMN', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'SKRIPTSÖKVÄG', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'KÖN:', 'GENDER:' ),
+       'currentweek'               => array( '1', 'NUVARANDEVECKA', 'NUVECKA', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'NUVARANDEVECKODAG', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'LOKALVECKA', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'LOKALVECKODAG', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'REVISIONSID', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'REVISIONSDAG', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'REVISIONSDAG2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'REVISIONSMÅNAD', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'REVISIONSÅR', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'REVISIONSTIDSSTÄMPEL', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'REVISIONSANVÄNDARE', 'REVISIONUSER' ),
+       'fullurl'                   => array( '0', 'FULLTURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'FULLTURLE:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'LBFÖRST:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'UCFIRST', 'SBFÖRST:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'LB:', 'LC:' ),
+       'uc'                        => array( '0', 'SB:', 'UC:' ),
+       'raw'                       => array( '0', 'RÅ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'VISATITEL', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__NYTTAVSNITTLÄNK__', '__NEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'NUVARANDEVERSION', 'NUVERSION', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'NUTIDSTÄMPEL', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'LOKALTIDSTÄMPEL', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#SPRÅK:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'INNEHÅLLSSPRÅK', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'SIDORINAMNRYMD:', 'SIDORINR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'ANTALADMINS', 'ANTALADMINISTRATÖRER', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'FORMATERANUM', 'FORMATERATAL', 'FORMATNUM' ),
+       'defaultsort'               => array( '1', 'STANDARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'FILSÖKVÄG:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'tagg', 'tag' ),
+       'hiddencat'                 => array( '1', '__DOLDKAT__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'SIDORIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'SIDSTORLEK', 'PAGESIZE' ),
+       'index'                     => array( '1', '__INDEXERA__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__INTEINDEXERA_', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'ANTALIGRUPP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__STATISKOMDIRIGERING__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'SKYDDSNIVÅ', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'formateradatum', 'datumformat', 'formatdate', 'dateformat' ),
 );
 
 $linkTrail = '/^([a-zåäöéÅÄÖÉ]+)(.*)$/sDu';
@@ -340,7 +342,7 @@ $messages = array(
 'tog-nocache' => 'Stäng av cachelagring för sidor',
 'tog-enotifwatchlistpages' => 'Skicka e-post till mig när en sida på min bevakningslista ändras',
 'tog-enotifusertalkpages' => 'Skicka e-post till mig när något händer på min diskussionssida',
-'tog-enotifminoredits' => 'Skicka mig e-post även för mindre ändringar',
+'tog-enotifminoredits' => 'Skicka mig e-post även för mindre ändringar av sidor och filer',
 'tog-enotifrevealaddr' => 'Visa min e-postadress i e-postmeddelanden om ändringar som skickas till andra',
 'tog-shownumberswatching' => 'Visa antalet användare som bevakar',
 'tog-oldsig' => 'Nuvarande signatur:',
@@ -357,7 +359,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Visa inte redigeringar av inloggade användare i bevakningslistan',
 'tog-watchlisthideanons' => 'Visa inte redigeringar av anonyma användare i bevakningslistan',
 'tog-watchlisthidepatrolled' => 'Göm patrullerade redigeringar från bevakningslistan',
-'tog-nolangconversion' => 'Konvertera inte mellan språkvarianter',
 'tog-ccmeonemails' => 'Skicka kopior till mig av e-post jag skickar till andra användare',
 'tog-diffonly' => 'Visa inte sidinnehåll under diffar',
 'tog-showhiddencats' => 'Visa dolda kategorier',
@@ -581,6 +582,10 @@ $1',
 'youhavenewmessages' => 'Du har $1 ($2).',
 'newmessageslink' => 'nya meddelanden',
 'newmessagesdifflink' => 'senaste ändringen',
+'youhavenewmessagesfromusers' => 'Du har $1 från {{PLURAL:$3|en annan användare|$3 användare}} ($2).',
+'youhavenewmessagesmanyusers' => 'Du har $1 från många användare ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ett nytt meddelande|nya meddelanden}}',
+'newmessagesdifflinkplural' => 'senaste {{PLURAL:$1|ändring|ändringar}}',
 'youhavenewmessagesmulti' => 'Du har nya meddelanden på $1',
 'editsection' => 'redigera',
 'editold' => 'redigera',
@@ -633,7 +638,7 @@ I [[Special:SpecialPages|listan över specialsidor]] kan du se vilka specialsido
 'error' => 'Fel',
 'databaseerror' => 'Databasfel',
 'dberrortext' => 'Ett syntaxfel i databasfrågan har uppstått.
-Detta kan indikera en bug i mjukvaran.
+Detta kan indikera en bugg i mjukvaran.
 Den senaste databasfrågan att köras var:
 <blockquote><tt>$1</tt></blockquote>
 från funktionen "<tt>$2</tt>".
@@ -674,6 +679,8 @@ Rapportera gärna problemet till någon [[Special:ListUsers/sysop|administratör
 'cannotdelete' => 'Sidan eller filen "$1" kunde inte raderas.
 Den kanske redan har raderats av någon annan.',
 'cannotdelete-title' => 'Sidan "$1" kan inte raderas',
+'delete-hook-aborted' => 'Borttagning avbruten av hook.
+Den gav ingen förklaring.',
 'badtitle' => 'Felaktig titel',
 'badtitletext' => 'Den begärda sidtiteln är antingen ogiltig eller tom, eller så är titeln felaktigt länkad från en annan wiki.
 Den kan innehålla ett eller flera tecken som inte får användas i sidtitlar.',
@@ -705,6 +712,8 @@ Den uppgivna anledningen är "\'\'$2\'\'".',
 Den administratören som låste den gav denna anledning: "\'\'$3\'\'".',
 'invalidtitle-knownnamespace' => 'Ogiltig titel med namnrymden "$2" och texten "$3"',
 'invalidtitle-unknownnamespace' => 'Ogiltig titel med okänt namnrymdsnummer $1 och texten "$2"',
+'exception-nologin' => 'Inte inloggad',
+'exception-nologin-text' => 'Denna sida eller åtgärd kräver att du måste vara inloggad på denna wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Dålig konfigurering: okänd virusskanner: ''$1''",
@@ -725,6 +734,7 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
 'remembermypassword' => 'Spara min inloggning på den här datorn (i max $1 {{PLURAL:$1|dygn|dygn}})',
 '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.',
 'externaldberror' => 'Antingen inträffade autentiseringsproblem med en extern databas, eller så får du inte uppdatera ditt externa konto.',
 'login' => 'Logga in',
 'nav-login-createaccount' => 'Logga in / skapa konto',
@@ -963,15 +973,18 @@ Du kan [[Special:Search/{{PAGENAME}}|söka efter denna sidtitel]] på andra sido
 'noarticletext-nopermission' => 'Det finns för tillfället ingen text på denna sida.
 Du kan [[Special:Search/{{PAGENAME}}|söka efter denna sidas titel]] i andra sidor,
 eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relevanta loggar]</span>.',
+'missing-revision' => 'Revisionen #$1 av sidan med namnet "{{PAGENAME}}" finns inte.
+
+Detta orsakas vanligen av efter en gammal historiklänk till en sida som har raderats.
+Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" är inte ett registrerat användarkonto. Tänk efter om du vill skapa/redigera den här sidan.',
 'userpage-userdoesnotexist-view' => 'Kontot "$1" är inte registrerat.',
 'blocked-notice-logextract' => 'Användaren är blockerad.
 Orsaken till senaste blockeringen kan ses nedan:',
-'clearyourcache' => "'''OBS:''' Sedan du sparat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.
+'clearyourcache' => "'''OBS:''' Efter du sparat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.
 *'''Firefox / Safari:''' Håll ned ''Skift'' och klicka på ''Uppdatera sidan'' eller tryck antingen ''Ctrl-F5'' eller ''Ctrl-R'' (''⌘-R'' på Mac)
 *'''Google Chrome:''' Tryck ''Ctrl-Skift-R''  (''⌘-Shift-R'' på Mac)
 *'''Internet Explorer:'''  Håll ned ''Ctrl'' och klicka på ''Uppdatera'' eller tryck ''Ctrl-F5''
-*'''Konqueror:''' Klicka på ''Reload'' eller tryck på ''F5''
 *'''Opera:''' Rensa cachen i ''Verktyg → Inställningar''",
 'usercssyoucanpreview' => "'''Tips:''' Använd \"{{int:showpreview}}\"-knappen för att testa din nya css innan du sparar.",
 'userjsyoucanpreview' => "'''Tips:''' Använd \"{{int:showpreview}}\"-knappen för att testa din nya JavaScript innan du sparar.",
@@ -1088,6 +1101,9 @@ Dessa parametrar har uteslutits.',
 'node-count-exceeded-warning' => 'Sidan har överskridit antalet nodar',
 'expansion-depth-exceeded-category' => 'Sidor där expansionsdjupet överskrids',
 'expansion-depth-exceeded-warning' => 'Sidan överskrider expansionsdjupet',
+'parser-unstrip-loop-warning' => 'Tagavskalningsloop upptäcktes',
+'parser-unstrip-recursion-limit' => 'Tagavskalningsloop överskred rekursionsgränsen ($1)',
+'converter-manual-rule-error' => 'Fel upptäcktes i manuell språkkonverteringsregel',
 
 # "Undo" feature
 'undo-success' => 'Redigeringen kan göras ogjord.
@@ -1276,6 +1292,10 @@ Se till att sidhistorikens kontinuitet behålls när du sammanfogar historik.',
 'editundo' => 'gör ogjord',
 'diff-multi' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av {{PLURAL:$2|en användare|$2 användare}} visas inte)',
 'diff-multi-manyusers' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av mer än $2 användare visas inte)',
+'difference-missing-revision' => '{{PLURAL:$2|En revision|$2 revisioner}} av denna skillnad ($1) kunde inte hittas.
+
+Detta orsakas vanligtvis av att följa en utgången difflänk till en sida som har raderats.
+Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].',
 
 # Search results
 'searchresults' => 'Sökresultat',
@@ -1544,6 +1564,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'right-writeapi' => 'Använda skriv-API:t',
 'right-delete' => 'Radera sidor',
 'right-bigdelete' => 'Radera sidor med stor historik',
+'right-deletelogentry' => 'Radera och återställ specifika loggposter',
 'right-deleterevision' => 'Radera och återställa enskilda sidversioner',
 'right-deletedhistory' => 'Se raderad historik utan tillhörande sidtext',
 'right-deletedtext' => 'Visa raderad text och ändringar mellan raderade versioner',
@@ -1688,9 +1709,9 @@ Raderings- och sidflyttningsloggen för denna sida återges här:",
 För att titta på eller leta efter filer som redan har laddats upp, se [[Special:FileList|listan över uppladdade filer]]. Uppladdningar loggförs även i [[Special:Log/upload|uppladdningsloggen]], och raderingar i [[Special:Log/delete|raderingsloggen]].
 
 Använd en länk på något av följande format för att infoga en fil på en sida:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' för att visa filen i dess hela storlek
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alternativ text]]</nowiki></tt>''' för att visa en rendering med bredden 200 pixel i en ruta till vänster med bildtexten 'alternativ text'
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' för att länka direkt till filen utan att visa den",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' för att visa filen i dess hela storlek
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alternativ text]]</nowiki></code>''' för att visa en rendering med bredden 200 pixel i en ruta till vänster med bildtexten 'alternativ text'
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' för att länka direkt till filen utan att visa den",
 'upload-permitted' => 'Tillåtna filtyper: $1.',
 'upload-preferred' => 'Föredragna filtyper: $1.',
 'upload-prohibited' => 'Förbjudna filtyper: $1.',
@@ -1735,21 +1756,21 @@ denna fil är $2.',
 'largefileserver' => 'Denna fil är större än vad servern ställts in att tillåta.',
 'emptyfile' => 'Filen du laddade upp verkar vara tom; felet kan bero på ett stavfel i filnamnet. Kontrollera om du verkligen vill ladda upp denna fil.',
 'windows-nonascii-filename' => 'Denna wiki stödjer inte filnamn med specialtecken.',
-'fileexists' => "Det finns redan en fil med detta namn.
-Titta på '''<tt>[[:$1]]</tt>''', såvida du inte är säker på att du vill ändra den.
-[[$1|thumb]]",
-'filepageexists' => "Beskrivningssidan för denna fil har redan skapats på '''<tt>[[:$1]]</tt>''', men just nu finns ingen fil med detta namn.
+'fileexists' => 'Det finns redan en fil med detta namn.
+Titta på <strong>[[:$1]]</strong>, såvida du inte är säker på att du vill ändra den.
+[[$1|thumb]]',
+'filepageexists' => 'Beskrivningssidan för denna fil har redan skapats på <strong>[[:$1]]</strong>, men just nu finns ingen fil med detta namn.
 Den sammanfattning du skriver här kommer inte visas på beskrivningssidan.
 För att din sammanfattning ska visas där, så måste du redigera beskrivningssidan manuellt.
-[[$1|thumb]]",
-'fileexists-extension' => "En fil med ett liknande namn finns redan: [[$2|thumb]]
-* Namn på den fil du försöker ladda upp: '''<tt>[[:$1]]</tt>'''
-* Namn på filen som redan finns: '''<tt>[[:$2]]</tt>'''
-Var vänlig välj ett annat namn.",
+[[$1|thumb]]',
+'fileexists-extension' => 'En fil med ett liknande namn finns redan: [[$2|thumb]]
+* Namn på den fil du försöker ladda upp: <strong>[[:$1]]</strong>
+* Namn på filen som redan finns: <strong>[[:$2]]</strong>
+Var vänlig välj ett annat namn.',
 'fileexists-thumbnail-yes' => "Filen verkar vara en bild med förminskad storlek ''(miniatyrbild)''. [[$1|thumb]]
-Var vänlig kontrollera filen '''<tt>[[:$1]]</tt>'''.
+Var vänlig kontrollera filen <strong>[[:$1]]</strong>.
 Om det är samma fil i originalstorlek så är det inte nödvändigt att ladda upp en extra miniatyrbild.",
-'file-thumbnail-no' => "Filnamnet börjar med '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Filnamnet börjar med <strong>$1</strong>.
 Det verkar vara en bild med förminskad storlek ''(miniatyrbild)''.
 Om du har denna bild i full storlek, ladda då hellre upp den, annars var vänlig och ändra filens namn.",
 'fileexists-forbidden' => 'En fil med detta namn existerar redan, och kan inte överskrivas.
@@ -1835,13 +1856,14 @@ Om problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].'
 'backend-fail-closetemp' => 'Kunde inte stänga temporär fil.',
 'backend-fail-read' => 'Kunde inte läsa filen $1.',
 'backend-fail-create' => 'Kunde inte skapa filen $1.',
-'backend-fail-maxsize' => 'Kunde inte skapa filen $1, eftersom den är större än {{PLURAL:$2|$2|$2}} byte.',
+'backend-fail-maxsize' => 'Kunde inte skapa filen $1 eftersom den är större än {{PLURAL:$2|en byte|$2 bytes}}.',
 'backend-fail-readonly' => 'Lagringssystemet "$1" är för närvarande skrivskyddad. Den angivna anledningen är: "$2"',
 'backend-fail-synced' => 'Filen "$1" är i ett inkonsekvent tillstånd inom de interna lagringssystemen',
 'backend-fail-connect' => 'Kunde inte ansluta till lagringssystemet "$1".',
 'backend-fail-internal' => 'Ett okänt fel uppstod i lagringssystemet "$1".',
 'backend-fail-contenttype' => 'Kunde inte bestämma innehållstypen för filen att spara på "$1".',
 'backend-fail-batchsize' => 'Lagringssystemet gav en batch på $1 fil{{PLURAL:$1|operation|operationer}}; gränsen är $2 {{PLURAL:$2|operation|operationer}}.',
+'backend-fail-usable' => 'Kunde inte skriva filen $1 beroende på otillräckliga behörigheter eller saknade kataloger/containrar.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Kunde inte ansluta till journaldatabasen för lagringssystemet "$1".',
@@ -1856,6 +1878,7 @@ Om problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].'
 'lockmanager-fail-releaselock' => 'Kunde inte att frigöra låset för "$1".',
 'lockmanager-fail-db-bucket' => 'Kunde inte kontakta tillräckligt många låsdatabaser i hinken $1.',
 'lockmanager-fail-db-release' => 'Kunde inte frigöra låsen på databasen $1 .',
+'lockmanager-fail-svr-acquire' => 'Kunde inte erhålla lås på servern $1 .',
 'lockmanager-fail-svr-release' => 'Kunde inte frigöra låsen på servern $1.',
 
 # ZipDirectoryReader
@@ -1973,6 +1996,7 @@ Kanske vill du redigera beskrivningen på dess [$2 filbeskrivningssida] där.',
 'shared-repo-from' => 'från $1',
 'shared-repo' => 'en gemensam filförvaring',
 'filepage.css' => '/* CSS som skrivs här inkluderas på filbeskrivningssidan, även på utländska klientwikis */',
+'upload-disallowed-here' => 'Tyvärr inte kan du skriva över denna bild.',
 
 # File reversion
 'filerevert' => 'Återställ $1',
@@ -2006,7 +2030,7 @@ Kanske vill du redigera beskrivningen på dess [$2 filbeskrivningssida] där.',
 
 # MIME search
 'mimesearch' => 'MIME-sökning',
-'mimesearch-summary' => 'På den här sidan kan du söka efter filer via dess MIME-typ. Input: contenttype/subtype, t.ex. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'På den här sidan kan du söka efter filer via dess MIME-typ. Input: contenttype/subtype, t.ex. <code>image/jpeg</code>.',
 'mimetype' => 'MIME-typ:',
 'download' => 'ladda ner',
 
@@ -2053,8 +2077,8 @@ Innan mallarna raderas, kontrollera att det inte finns andra länkar till dem.',
 
 'disambiguations' => 'Sidor som länkar till förgreningssidor',
 'disambiguationspage' => 'Template:Förgrening',
-'disambiguations-text' => "Följande sidor länkar till ''förgreningssidor''.
-Länkarna bör troligtvis ändras så att de länkar till en artikel istället.<br />
+'disambiguations-text' => "Följande sidorna innehåller minst en länk till en '''förgreningssida'''.
+De bör troligtvis ändras så att de länkar till en mer passande sida istället.<br />
 En sida anses vara en förgreningssida om den inkluderar en mall som länkas till från [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dubbla omdirigeringar',
@@ -2079,6 +2103,7 @@ En sida anses vara en förgreningssida om den inkluderar en mall som länkas til
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
 'ncategories' => '$1 {{PLURAL:$1|kategori|kategorier}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|länk|länkar}}',
 'nmembers' => '$1 {{PLURAL:$1|medlem|medlemmar}}',
 'nrevisions' => '$1 {{PLURAL:$1|version|versioner}}',
@@ -2107,6 +2132,7 @@ En sida anses vara en förgreningssida om den inkluderar en mall som länkas til
 'mostlinkedtemplates' => 'Mest använda mallar',
 'mostcategories' => 'Sidor med flest kategorier',
 'mostimages' => 'Filer med flest länkar till sig',
+'mostinterwikis' => 'Sidor med flest interwikis',
 'mostrevisions' => 'Sidor med flest ändringar',
 'prefixindex' => 'Alla sidor med prefix',
 'prefixindex-namespace' => 'Alla sidor med prefix ($1 namnrymder)',
@@ -2160,6 +2186,7 @@ Lägg märke till att andra webbplatser kan länka till en fil med en direkt URL
 Du kan avgränsa sökningen och få färre träffar genom att ange typ av logg, användarnamn (skiftlägeskänsligt), eller berörd sida (också skiftlägeskänsligt).',
 'logempty' => 'Inga matchande träffar i loggen.',
 'log-title-wildcard' => 'Sök efter sidtitlar som börjar med texten',
+'showhideselectedlogentries' => 'Visa/Dölj markerade loggposter',
 
 # Special:AllPages
 'allpages' => 'Alla sidor',
@@ -2205,7 +2232,7 @@ Se även [[Special:WantedCategories|önskade kategorier]].',
 'linksearch-ok' => 'Sök',
 'linksearch-text' => 'Jokertecken (wildcards) som t.ex. "*.wikipedia.org" kan användas.
 Det krävs åtminstone en toppnivå-domän, t.ex. "*.org".<br />
-Protokoll som stöds: <tt>$1</tt> (lägg inte till något av dessa i din sökning).',
+Protokoll som stöds: <code>$1</code> (lägg inte till något av dessa i din sökning).',
 'linksearch-line' => '$1 länkas från $2',
 'linksearch-error' => 'Jokertecken kan bara användas i början av domännamnet.',
 
@@ -2251,6 +2278,8 @@ Det kan finnas [[{{MediaWiki:Listgrouprights-helppage}}|ytterligare information]
 'mailnologin' => 'Ingen adress att skicka till',
 'mailnologintext' => 'För att kunna skicka e-post till andra användare, måste du vara [[Special:UserLogin|inloggad]] och ha angivit en korrekt e-postadress i dina [[Special:Preferences|användarinställningar]].',
 'emailuser' => 'Skicka e-post till den här användaren',
+'emailuser-title-target' => 'Skicka e-post till denna {{GENDER:$1|användare}}',
+'emailuser-title-notarget' => 'E-postanvändare',
 'emailpage' => 'Skicka e-post till användare',
 'emailpagetext' => 'Du kan använda det här formuläret för att skicka e-post till den här användaren.
 Den e-postadress du har angivit i [[Special:Preferences|dina användarinställningar]] kommer att visas som "Från"-adress i meddelandet, så att mottagaren har möjlighet att svara direkt till dig.',
@@ -2393,6 +2422,8 @@ Se $2 för noteringar om de senaste raderingarna.',
 'rollback' => 'Rulla tillbaka ändringar',
 'rollback_short' => 'Återställning',
 'rollbacklink' => 'rulla tillbaka',
+'rollbacklinkcount' => 'rulla tillbaka $1 {{PLURAL:$1|redigering|redigeringar}}',
+'rollbacklinkcount-morethan' => 'rulla tillbaka mer än $1 {{PLURAL:$1|redigering|redigeringar}}',
 'rollbackfailed' => 'Tillbakarullning misslyckades',
 'cantrollback' => 'Det gick inte att rulla tillbaka, då sidan endast redigerats av en användare.',
 'alreadyrolled' => 'Det gick inte att rulla tillbaka den senaste redigeringen av [[User:$2|$2]] ([[User talk:$2|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) på sidan [[:$1|$1]]. Någon annan har redan rullat tillbaka eller redigerat sidan.
@@ -2885,6 +2916,7 @@ All överföring mellan wikier (transwiki) listas i  [[Special:Log/import|import
 'import-interwiki-templates' => 'Inkludera alla mallar',
 'import-interwiki-submit' => 'Importera',
 'import-interwiki-namespace' => 'Målnamnrymd:',
+'import-interwiki-rootpage' => 'Destinationens grundsida (valfri):',
 'import-upload-filename' => 'Filnamn:',
 'import-comment' => 'Kommentar:',
 'importtext' => 'Var god exportera filen från ursprungs-wikin med hjälp av [[Special:Export|exporteringsverktyget]].
@@ -2917,6 +2949,9 @@ Spara den på din dator och ladda upp den här.',
 'import-error-interwiki' => 'Sidan "$1" är inte importerad eftersom dess namn är reserverat för externa länkar (interwiki).',
 'import-error-special' => 'Sidan "$1" är inte importerad eftersom den tillhör en särskild namnrymd som inte tillåter sidor.',
 'import-error-invalid' => 'Sidan "$1" är inte importerad eftersom dess namn är ogiltigt.',
+'import-options-wrong' => 'Fel {{PLURAL:$2|alternativ|alternativ}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Angiven grundsida är en ogiltig titel.',
+'import-rootpage-nosubpage' => 'Namnrymden "$1" till grundsidan tillåter inte undersidor.',
 
 # Import log
 'importlogpage' => 'Importlogg',
@@ -3066,19 +3101,35 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'spambot_username' => 'MediaWikis spampatrull',
 'spam_reverting' => 'Återställer till den senaste versionen som inte innehåller länkar till $1',
 'spam_blanking' => 'Alla versioner innehöll en länk till $1, blankar',
+'spam_deleting' => 'Alla ändringar innehöll länkar till $1, raderar',
 
 # Info page
 'pageinfo-title' => 'Information om "$1"',
-'pageinfo-header-edits' => 'Redigeringar',
-'pageinfo-header-watchlist' => 'Bevakningslista',
-'pageinfo-header-views' => 'Visningar',
-'pageinfo-subjectpage' => 'Sida',
-'pageinfo-talkpage' => 'Diskussionssida',
-'pageinfo-watchers' => 'Antal användare som bevakar sidan',
-'pageinfo-edits' => 'Antal redigeringar',
-'pageinfo-authors' => 'Antal olika författare',
+'pageinfo-header-basic' => 'Grundläggande information',
+'pageinfo-header-edits' => 'Redigeringshistorik',
+'pageinfo-header-restrictions' => 'Sidskydd',
+'pageinfo-header-properties' => 'Sidegenskaper',
+'pageinfo-display-title' => 'Visningstitel',
+'pageinfo-default-sort' => 'Standardsorteringsnyckel',
+'pageinfo-length' => 'Sidlängd (i byte)',
+'pageinfo-article-id' => 'Sid-ID',
+'pageinfo-robot-policy' => 'Sökmotorns status',
+'pageinfo-robot-index' => 'Indexerbar',
+'pageinfo-robot-noindex' => 'Inte indexerbar',
 'pageinfo-views' => 'Antal visningar',
-'pageinfo-viewsperedit' => 'Sidvisningar per redigering',
+'pageinfo-watchers' => 'Antal användare som bevakar sidan',
+'pageinfo-redirects-name' => 'Omdirigeringar till denna sida',
+'pageinfo-subpages-name' => 'Undersidor till denna sida',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringar}}; $3 {{PLURAL:$3|icke-omdirigering|icke-omdirigeringar}})',
+'pageinfo-firstuser' => 'Sidskapare',
+'pageinfo-firsttime' => 'Datum när sidan skapades',
+'pageinfo-lastuser' => 'Senaste redigeraren',
+'pageinfo-lasttime' => 'Datum för senaste redigeringen',
+'pageinfo-edits' => 'Totalt antal redigeringar',
+'pageinfo-authors' => 'Totalt antal olika författare',
+'pageinfo-restriction' => 'Sidskydd (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magiskt|Magiska}} ord ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Dold kategori|Dolda kategorier}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -3133,6 +3184,7 @@ Om du kör den kan din dator skadas.",
 'file-info-size-pages' => '$1 × $2 pixlar, filstorlek: $3, MIME-typ: $4, $5 {{PLURAL:$5|sida|sidor}}',
 'file-nohires' => 'Det finns ingen version med högre upplösning.',
 'svg-long-desc' => 'SVG-fil, grundstorlek: $1 × $2 pixlar, filstorlek: $3',
+'svg-long-desc-animated' => 'animerad SVG-fil, nominellt $1 × $2 pixlar, filstorlek: $3',
 'show-big-image' => 'Högupplöst version',
 'show-big-image-preview' => 'Storlek på förhandsvisningen: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Annan upplösning|Andra upplösningar}}: $1.',
@@ -3142,6 +3194,8 @@ Om du kör den kan din dator skadas.",
 'file-info-png-looped' => 'upprepad',
 'file-info-png-repeat' => 'spelad $1 {{PLURAL:$1|gång|gånger}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|bild|bilder}}',
+'file-no-thumb-animation' => "'''OBS: På grund av tekniska begränsningar kommer inte miniatyrer av denna fil animeras.'''",
+'file-no-thumb-animation-gif' => "'''OBS: På grund av tekniska begränsningar kommer inte miniatyrer av GIF-bilder med hög upplösning som denna animeras.'''",
 
 # Special:NewFiles
 'newimages' => 'Galleri över nya filer',
@@ -3810,7 +3864,7 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 * <span class="mw-specialpagecached">Cachade specialsidor (kan vara föråldrade).</span>',
 'specialpages-group-maintenance' => 'Underhållsrapporter',
 'specialpages-group-other' => 'Övriga specialsidor',
-'specialpages-group-login' => 'Inloggning/registrering',
+'specialpages-group-login' => 'Logga in / skapa konto',
 'specialpages-group-changes' => 'Senaste ändringar och loggar',
 'specialpages-group-media' => 'Filer och uppladdning',
 'specialpages-group-users' => 'Användare och behörigheter',
@@ -3944,9 +3998,12 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'api-error-empty-file' => 'Filen du skickade var tom.',
 'api-error-emptypage' => 'Det är inte tillåtet att skapa nya, tomma sidor.',
 'api-error-fetchfileerror' => 'Internt fel: något gick fel vid hämtningen av filen.',
+'api-error-fileexists-forbidden' => 'En fil med namnet "$1" finns redan och kan inte skrivas över.',
+'api-error-fileexists-shared-forbidden' => 'En fil med namnet "$1" finns redan i det delade filarkivet och kan inte skrivas över.',
 'api-error-file-too-large' => 'Filen du skickade var för stor.',
 'api-error-filename-tooshort' => 'Filnamnet är för kort.',
 'api-error-filetype-banned' => 'Denna typ av fil är förbjuden.',
+'api-error-filetype-banned-type' => '$1 är inte {{PLURAL:$4|en tillåten filtyp|tillåtna filtyper}}. {{PLURAL:$3|Tillåten filtyp|Tillåtna filtyper}} är $2.',
 'api-error-filetype-missing' => 'Filen saknar en filändelse.',
 'api-error-hookaborted' => 'Ändringen du försökte göra avbröts av en extension hook.',
 'api-error-http' => 'Internt fel: Det gick inte att ansluta till servern.',
index 3310dc9..10100e5 100644 (file)
@@ -131,7 +131,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ficha kurasa zilizofanyiwa doria kwenye mabadiliko ya karibuni',
 'tog-newpageshidepatrolled' => 'Ficha kurasa zilizofanyiwa doria kwenye orodha ya kurasa mpya',
 'tog-extendwatchlist' => 'Tanua orodha ya maangalizi ili kuonyesha mabadiliko yote yaliyofanyika, si hilo la mwisho tu.',
-'tog-usenewrc' => 'Mabadiliko ya karibuni yenye maelezo mengine (inatumia JavaScript)',
+'tog-usenewrc' => 'Mabadiliko ya kundi kwa kurasa kwenye mabadiliko ya karibuni na maangalizi (JavaScript inahitajika)',
 'tog-numberheadings' => 'Vichwa vya habari vijipange namba-vyenyewe',
 'tog-showtoolbar' => 'Onyesha mwambaa wa zana za kuhariria (JavaScript)',
 'tog-editondblclick' => 'Hariri ukurasa kwa kubonyeza mara mbili',
@@ -139,17 +139,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Wezesha sehemu ya kuandikia kwa kubonyeza kitufe cha kulia cha puku yako juu ya sehemu ya majina husika (JavaScript)',
 'tog-showtoc' => 'Onyesha mistari ya yaliyomo (kwa kila kurasa iliyo na zaidi ya vichwa vya habari 3)',
 'tog-rememberpassword' => 'Kumbuka kuingia kwangu pamoja na neno la siri katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)',
-'tog-watchcreations' => 'Weka kurasa nilizoumba katika maangalizi yangu',
-'tog-watchdefault' => 'Weka kurasa zote nilizohariri katika maangalizi yangu',
-'tog-watchmoves' => 'Weka kurasa zote nilizohamisha katika maangalizi yangu',
-'tog-watchdeletion' => 'Weka kurasa zote nilizofuta katika maangalizi yangu',
+'tog-watchcreations' => 'Ongeza kurasa nilizoumba katika maangalizi yangu',
+'tog-watchdefault' => 'Ongeza kurasa zote nilizohariri katika maangalizi yangu',
+'tog-watchmoves' => 'Ongeza kurasa zote nilizohamisha katika maangalizi yangu',
+'tog-watchdeletion' => 'Ongeza kurasa zote nilizofuta katika maangalizi yangu',
 'tog-minordefault' => 'Weka alama zote za mabadiliko madogo kama matumizi mbadala',
 'tog-previewontop' => 'Onyesha mandhari kabla ya sanduku la kuhariria',
 'tog-previewonfirst' => 'Onyesha mandhari unapoanza kuhariri',
 'tog-nocache' => 'Kurasa zisiwekwe katika kache (akiba ya muda) ya kivinjari',
-'tog-enotifwatchlistpages' => 'Nitumie barua pepe pale kurasa zilizopo katika maangalizi yangu zikibadilishwa',
+'tog-enotifwatchlistpages' => 'Nitumie barua pepe pale kurasa zilizopo katika maangalizi yangu zinabadilishwa',
 'tog-enotifusertalkpages' => 'Nitumie barua pepe pale ukurasa wangu wa majadiliano ukiwa na mabadiliko',
-'tog-enotifminoredits' => 'Pia nitumie barua pale mabadiliko ya ukurasa yanapokuwa madogo tu',
+'tog-enotifminoredits' => 'Pia nitumie barua pale mabadiliko ya ukurasa yanapokuwa madogo tu.',
 'tog-enotifrevealaddr' => 'Onyesha anwani ya barua pepe yangu katika barua pepe za taarifa',
 'tog-shownumberswatching' => 'Onyesha idadi ya watumiaji waangalizi',
 'tog-oldsig' => 'Sahihi iliyopo:',
@@ -165,7 +165,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ficha mabadiliko yaliyofanywa na watumiaji kwenye maangalilizi',
 'tog-watchlisthideanons' => 'Ficha mabadiliko yaliyofanywa na watumiaji wasiojisajili kwenye maangalilizi',
 'tog-watchlisthidepatrolled' => 'Ficha maharirio yaliyodoliwa katika maangalizi',
-'tog-nolangconversion' => 'Lemaza mabadiliko kadhaa',
 'tog-ccmeonemails' => 'Nitumie nakala ya barua pepe nitakazo tuma kwa watumiaji wengine',
 'tog-diffonly' => 'Usionyeshe yaliyomo kwenye ukurasa chini ya faili za diff',
 'tog-showhiddencats' => 'Onyesha jamii zilizofichwa',
@@ -390,13 +389,17 @@ Tazama [[Special:Version|ukurasa wa toleo]].',
 'youhavenewmessages' => 'Una $1 ($2).',
 'newmessageslink' => 'ujumbe mpya',
 'newmessagesdifflink' => 'badiliko la mwisho',
+'youhavenewmessagesfromusers' => 'Una $1 kutoka {{PLURAL:$3|another user|$3 users}} ($2)',
+'youhavenewmessagesmanyusers' => 'Una $1 kutoka kwa watumiaji wengi $2',
+'newmessageslinkplural' => '{{PLURAL:$1|a new message|ujumbe mpya}}',
+'newmessagesdifflinkplural' => 'last {{PLURAL:$1|change|mabadiliko}}',
 'youhavenewmessagesmulti' => 'Umepokea jumbe mpya kule $1',
 'editsection' => 'hariri',
 'editold' => 'hariri',
 'viewsourceold' => 'view source',
 'editlink' => 'hariri',
 'viewsourcelink' => 'onyesha kodi za ukurasa',
-'editsectionhint' => 'Hariri fungu: $1',
+'editsectionhint' => 'Hariri sehemu: $1',
 'toc' => 'Yaliyomo',
 'showtoc' => 'fichua',
 'hidetoc' => 'ficha',
@@ -513,6 +516,8 @@ $2',
 'ns-specialprotected' => 'Kurasa maalumu haziwezi kuhaririwa.',
 'titleprotected' => 'Jina hili limekingwa lisiumbwe na [[User:$1|$1]].
 Sababu zilizotolewa ni "\'\'$2\'\'".',
+'exception-nologin' => 'Hujaingia',
+'exception-nologin-text' => 'Ukurasa huu unahitaji kuwa mtumiaji awe ameingia katika wiki hii.',
 
 # Virus scanner
 'virus-badscanner' => "Usanidi mbaya: kiskani virusi hakijulikani: ''$1''",
@@ -532,6 +537,7 @@ Usisahau kubadilisha mapendekezo yako ya [[Special:Preferences|{{SITENAME}}]].',
 'remembermypassword' => 'Kumbuka kuingia kwangu katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)',
 'securelogin-stick-https' => 'Endelea kuunganishwa na HTTPS baada ya kuingia',
 'yourdomainname' => 'Tovuti yako:',
+'password-change-forbidden' => 'Hauwezi kubadili nywila katika Wiki hii.',
 'externaldberror' => 'Huenda kulikuwa na hitilafu ya database au labda hauruhusiwi kubadilisha akaunti yako ya nje.',
 'login' => 'Ingia',
 'nav-login-createaccount' => 'Ingia/ sajili akaunti',
@@ -801,6 +807,7 @@ Kumbuka kwamba desturi ya kurasa za .css na .js hutumia herufi ndogo, yaani, {{n
 'note' => "'''Taarifa:'''",
 'previewnote' => "'''Hii ni hakikisho tu.''' 
 Mabadiliko hayajahifadhiwa bado!",
+'continue-editing' => 'Endelea kuhariri',
 'previewconflict' => 'Hakikisho hii inaonyesha maandiko yaliyopo sanduku la juu yataonekayo ukiyahifadhi.',
 'session_fail_preview' => "'''Pole! Hatukuweza kuhifadhi sahihisho lako kwa sababu data za kipindi zilipotelewa.'''
 Tafadhali jaribu tena.
@@ -879,6 +886,7 @@ Inaonekana kwamba ukurasa umefutwa.',
 'edit-no-change' => 'Uhariri wako haukufanikiwa, kwa sababu hapakuwa na mabadiliko yoyote kwenye maandishi.',
 'edit-already-exists' => 'Haikufanikiwa kuanzisha ukurasa mpya.
 Ukurasa wa jina hilo unapatikana tayari.',
+'defaultmessagetext' => 'Ujumbe uliopo',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Ilani:''' Kigezo kinajumlisha ukubwa uliozidi mno.
@@ -945,10 +953,18 @@ Bado unaweza [$1 kutazama sahihisho hili] iwapo utapenda kuendelea.",
 'rev-suppressed-text-unhide' => "Pitio la ukurasa huu '''limefichwa'''.
 Maelezo yanaweza kupatikana kwenye [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} kumbukumbu ya ufichaji].
 Bado unaweza [$1 kutazama sahihisho hili] iwapo utapenda kuendelea.",
-'rev-deleted-text-view' => "Pitio hilo la ukurasa '''lilifutwa'''.
-Kwa sababu u mkabidhi, bado unaweza kulitazama; maelezo mengine yapo kwenye [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kumbukumbu ya kufuta].",
-'rev-suppressed-text-view' => "Pitio hilo la ukurasa '''lilifichwa'''.
-Kwa sababu u mkabidhi, bado unaweza kulitazama; maelezo mengine yapo kwenye [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} kumbukumbu ya kuficha].",
+'rev-deleted-text-view' => "Pitio hilo la ukurasa huu '''limefutwa'''.
+Unaweza kulitazama; maelezo mengine yapo kwenye [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kumbukumbu ya ufutaji].",
+'rev-suppressed-text-view' => "Pitio la ukurasa huu '''limefichwa'''.
+Unaweza kulitazama; maelezo mengine yapo kwenye [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} kumbukumbu ya ufichaji].",
+'rev-deleted-unhide-diff' => "Pitio la ukurasa huu '''limefutwa'''.
+Maelezo yanaweza kupatikana kwenye [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kumbukumbu ya ufutaji].
+Bado unaweza [$1 kutazama sahihisho hili] iwapo utapenda kuendelea.",
+'rev-suppressed-unhide-diff' => "Pitio la ukurasa huu '''limefutwa'''.
+Maelezo yanaweza kupatikana kwenye [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kumbukumbu ya ufutaji].
+Bado unaweza [$1 kutazama sahihisho hili] iwapo utapenda kuendelea.",
+'rev-deleted-diff-view' => "Pitio hilo la ukurasa huu '''limefutwa'''.
+Unaweza masasisho; maelezo mengine yapo kwenye [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kumbukumbu ya ufutaji]",
 'rev-delundel' => 'onyesha/ficha',
 'rev-showdeleted' => 'onyesha',
 'revisiondelete' => 'Kufuta/kurudisha mapitio',
@@ -1032,6 +1048,8 @@ Tazama [[Special:BlockList|IP block orodha ya uzuio wa IP]] kuona orodha ya zuio
 
 # Diffs
 'history-title' => 'Historia ya mapitio ya "$1"',
+'difference-title' => 'Tofauti kati ya marekesbisho "$1"',
+'difference-title-multipage' => 'Tofauti kati ya kurasa "$1" na "$2"',
 'difference-multipage' => '(Tofauti kati ya kurasa)',
 'lineno' => 'Mstari $1:',
 'compareselectedversions' => 'Linganisha mapitio mawili uliyochagua',
@@ -1126,6 +1144,7 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
 'datedefault' => 'Chaguo-msingi',
 'prefs-beta' => 'Zana za Beta',
 'prefs-datetime' => 'Tarehe na saa',
+'prefs-labs' => 'Maumbile ya maabara',
 'prefs-user-pages' => 'Kurasa za watumiaji',
 'prefs-personal' => 'Kuhusu mtumiaji',
 'prefs-rc' => 'Mabadiliko ya karibuni',
@@ -1197,7 +1216,7 @@ Hutaweza kulibatilisha tendo hili baadaye.',
 'prefs-registration' => 'Wakati wa kusajili:',
 'yourrealname' => 'Jina lako halisi:',
 'yourlanguage' => 'Lugha:',
-'yourvariant' => 'Variant:',
+'yourvariant' => 'Kadiri ya lugha ya wiki:',
 'yournick' => 'Sahihi:',
 'prefs-help-signature' => 'Unapoandika kwenye kurasa za majadiliano tafadhali utie sahihi kwa kuandika "<nowiki>~~~~</nowiki>"; itaonekana jina lako pamoja na saa na tarehe ya kuhifadhi.',
 'badsig' => 'Umeweka sahihi batili.
@@ -1326,7 +1345,7 @@ Taarifa hii itakuwa wazi.',
 'right-userrights-interwiki' => 'Kuhariri wezo za watumiaji kwenye wiki zingine',
 'right-siteadmin' => 'Kufunga na kufungua hifadhidata',
 'right-sendemail' => 'Kutuma barua-pepe kwa watumiaji wengine',
-'right-passwordreset' => 'Kuona barua pepe zinazoweka neno la siri upya',
+'right-passwordreset' => 'Onesha barua pepe zinazoweka neno la siri upya',
 
 # User rights log
 'rightslog' => 'Kumbukumbu za vyeo vya watumiaji',
@@ -1366,6 +1385,7 @@ Taarifa hii itakuwa wazi.',
 'action-userrights' => 'kubadilisha wezo zote za watumiaji',
 'action-userrights-interwiki' => 'kuhariri wezo za watumiaji kwenye wiki zingine',
 'action-siteadmin' => 'kufunga na kufungua hifadhidata',
+'action-sendemail' => 'tuma barua pepe',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|badiliko|mabadiliko}} $1',
@@ -1400,6 +1420,7 @@ Taarifa hii itakuwa wazi.',
 'newsectionsummary' => '/* $1 */ mjadala mpya',
 'rc-enhanced-expand' => 'Onyesha maelezo mengine (inahitaji JavaScript)',
 'rc-enhanced-hide' => 'Ficha maelezo mengine',
+'rc-old-title' => 'ilitengenezwa hapo awali na "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Mabadiliko husika',
@@ -1426,9 +1447,9 @@ Rejea kumbukumbu za kufuta au kuhamisha ukurasa huu zinazotolewa chini:",
 Kwa kutazama au kutafuta faili zilizopakiwa awali, tafadhali nenda kwenye [[Special:FileList|orodha ya mafaili yaliyopakiwa]]. Kwa zile faili ambazo zishapitiwa, basi angalia [[Special:Log/upload|kumbukumbu ya mafaili]]. Kwa mafaili yaliyofutwa, tafadhali [[Special:Log/delete|tazama hapa]].
 
 Kwa kutumia faili katika makala, tumia moja kati ya viungo vifuatavyo:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Picha.jpg]]</nowiki></tt>''' kwa kutumia toleo zima la faili
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Picha.png|200px|thumb|left|maelezo ya picha]]</nowiki></tt>''' tumia pixel 200 kwa ukubwa mzuri na sehemu ya 'maelezo ya picha' ikiwa kama maelezo husika na picha iliyopo
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' kwa kuunga moja kwa moja bila kuonyesga faili",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Picha.jpg]]</nowiki></code>''' kwa kutumia toleo zima la faili
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Picha.png|200px|thumb|left|maelezo ya picha]]</nowiki></code>''' tumia pixel 200 kwa ukubwa mzuri na sehemu ya 'maelezo ya picha' ikiwa kama maelezo husika na picha iliyopo
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' kwa kuunga moja kwa moja bila kuonyesga faili",
 'upload-permitted' => 'Aina ya mafaili yanayoruhusiwa: $1.',
 'upload-preferred' => 'Aina za mafaili yaliyopendelewa: $1.',
 'upload-prohibited' => 'Aina za mafaili yanayokataliwa: $1.',
@@ -1474,22 +1495,22 @@ faili hili lina $2.',
 'emptyfile' => 'Faili ulilolipakia linaonekana kuwa tupu.
 Hii huenda ikawa jina lake limeandikwa vibaya.
 Tafadhali uhakikishe kwamba ni kweli unataka kupakia faili hili.',
-'windows-nonascii-filename' => 'Wiki hii haiwezi kutumia majina ya mafaili yenye herufi maalum.',
-'fileexists' => "Faili lenye jina hili lipo tayari, tafadhali tazama '''<tt>[[:$1]]</tt>''' ikiwa una mashaka kuhusu kulibadilisha.
-[[$1|thumb]]",
-'filepageexists' => "Ukurasa wa maelezo kwa ajili ya faili hili tayari umeshaanzishwa katika '''<tt>[[:$1]]</tt>''', lakini bado hakuna faili lenye jina hili kwa sasa.
+'windows-nonascii-filename' => 'Wiki hii haiwezi kutumia majina ya mafaili yenye herufi maalumu.',
+'fileexists' => 'Faili lenye jina hili lipo tayari, tafadhali tazama <strong>[[:$1]]</strong> ikiwa una mashaka kuhusu kulibadilisha.
+[[$1|thumb]]',
+'filepageexists' => 'Ukurasa wa maelezo kwa ajili ya faili hili tayari umeshaanzishwa katika <strong>[[:$1]]</strong>, lakini hakuna faili lenye jina hili kwa sasa.
 Muhtasari utakaoandika hautaonekana katika ukurasa wa maelezo.
 Kufanya muhtasari wako uonekana pale, utahitajika uhariri ukurasa kwa mikono.
-[[$1|thumb]]",
-'fileexists-extension' => "Faili lenye jina linalofanana nalo lipo tayari:[[$2|thumb]]
-* Jina la faili linalopakiwa: '''<tt>[[:$1]]</tt>'''
-* Jina la faili lililopo tayari: '''<tt>[[:$2]]</tt>'''
-Tafadhali chagua jina lingine.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Faili lenye jina linalofanana nalo lipo tayari:[[$2|thumb]]
+* Jina la faili linalopakiwa: <strong>[[:$1]]</strong>
+* Jina la faili lililopo tayari: <strong>[[:$2]]</strong>
+Tafadhali chagua jina lingine.',
 'fileexists-thumbnail-yes' => "Faili linaonekana kuwa ni ''picha'' iliyopunguzwa ukubwa.
 [[$1|thumb]]
-Tafadhali tazama faili la '''<tt>[[:$1]]</tt>'''.
+Tafadhali tazama faili la <strong>[[:$1]]</strong>.
 Ikiwa faili hili linaonyesha picha ile ile kwa ukubwa wa kawaida hakuna haja ya kupakia faili lingine la picha ndogo.",
-'file-thumbnail-no' => "Jina la faili linaloanza na '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Jina la faili linaanza na <strong>$1</strong>.
 Inaonekana kuwa ni picha iliyopunguzwa ukubwa''(thumbnail)''.
 Ikiwa unaoyo picha hii kwa ukubwa wa kawaida tafadhali pakia picha hii, vinginevyo tafadhali badilisha jina la faili.",
 'fileexists-forbidden' => 'Faili lenye jina hili lipo tayari, na haliwezi kuandikizwa.
@@ -1515,7 +1536,7 @@ Tafadhali utazame kipimo cha file_uploads.',
 'uploadvirus' => 'Faili lina kirusi!
 Maelezo mengine: $1',
 'uploadjava' => 'Faili ZIP hili lina faili Java .class humo ndani.
-Hairuhusiki kupakia mafaili ya Java, kwa sababu yanawezesha kuambaa vizuio vya usalama.',
+Hairuhusiki kupakia mafaili ya Java, kwa sababu yanawezesha kusababisha vizuio vya usalama kuzungukwa.',
 'upload-source' => 'Faili la chanzo',
 'sourcefilename' => 'Jina la faili la chanzo:',
 'sourceurl' => 'URL ya chanzo:',
@@ -1551,7 +1572,18 @@ Tatizo likiendelea, uwasiliane na [[Special:ListUsers/sysop|mkabidhi]].',
 'upload-http-error' => 'Imetokea hitilafu ya HTTP: $1',
 
 # File backend
+'backend-fail-stream' => 'Haikuweza kutafuta faili "$1".',
+'backend-fail-notexists' => 'faili $1 haipo',
+'backend-fail-delete' => 'Haikuweza kufuta faili "$1".',
 'backend-fail-alreadyexists' => 'Faili $1 linapatikana tayari.',
+'backend-fail-store' => 'Haikuweza kunakili faili "$1" kwa "$2".',
+'backend-fail-copy' => 'Haikuweza kunakili faili "$1" kwa "$2".',
+'backend-fail-move' => 'Haikuweza kuhamisha faili "$1" kwa "$2".',
+'backend-fail-opentemp' => 'Haikuweza kuanzisha faili ya muda.',
+'backend-fail-writetemp' => 'Haikuweza kuandika kwa faili ya muda.',
+'backend-fail-closetemp' => 'Haikuweza kufunga faili ya muda.',
+'backend-fail-read' => 'Haikuweza kusoma faili "$1".',
+'backend-fail-create' => 'Haikuweza kuandika faili "$1".',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Ilitokea hitilafu wakati wa kufungua faili kwa ajili ya ukaguzi wa ZIP.',
@@ -1596,8 +1628,7 @@ Unaweza kujaribu wakati tovuti haina kazi nyingi.',
 
 # Special:ListFiles
 'listfiles-summary' => 'Ukurasa huu maalum unaonyesha mafaili yote yaliyopakiwa.
-Kwa kawaida mafaili ya mwisho kupakiwa yanaonekana juu kabisa ya orodha.
-Ukibofya kichwa cha safu mtindo wa kupanga orodha utabadilika.',
+Ikichujwa na mtumiaji, toleo la mafaili pekee ambayo mtumiaji ameyapakia hivi karibuni ndiyo yatakayoonekana.',
 'listfiles_search_for' => 'Tafuta jina la faili:',
 'imgfile' => 'faili',
 'listfiles' => 'Orodha ya mafaili',
@@ -1683,7 +1714,7 @@ Pengine ungependa kuhariri maelezo yaliyopo katika [$2 ukurasa wa maelezo ya fai
 # MIME search
 'mimesearch' => 'Utafutaji wa MIME',
 'mimesearch-summary' => 'Ukarasa huu unawezesha kuchuja mafaili kutokana na aina ya MIME. 
-Ingiza: aina ya faili/aina mahususi, kwa mfano <tt>image/jpeg</tt>.',
+Ingiza: aina ya faili/aina mahususi, kwa mfano <code>image/jpeg</code>.',
 'mimetype' => 'Aina ya MIME:',
 'download' => 'pakua',
 
@@ -1730,9 +1761,9 @@ Kumbuka kuhakikisha kwamba hakuna viungo vingine vinavyoelekea kigezo fulani kab
 
 'disambiguations' => 'Kurasa zinazoungana na kurasa za uanishaji',
 'disambiguationspage' => 'Template:Maana',
-'disambiguations-text' => "Kurasa zinazofuata zina viungo vinavyoelekea '''kurasa ya kutofautishana maana'''.
-Ni afadhali kiungo kiende makala inayostahili moja kwa moja.<br />
-Kurasa za kutofautishana maana ni zile zinazotumia kigezo kinachoorodheshwa katika ukurasa wa [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Kurasa zinazofuata zina angalau kiungo kimoja kinachoelekea kwa '''kurasa ya kutofautishana maana'''.
+Ni afadhali kiungo kiende makala yanayostahili moja kwa moja.<br />
+Ukurasa unatibiwa kama ukurasa wa kutofautishana maana inazotumia kigezo kinachoorodheshwa katika ukurasa wa [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Maelekezo mawilimawili',
 'doubleredirectstext' => 'Ukurasa huu unaorodhesha kurasa zinazoelekeza kurasa zingine za kuelekeza.
@@ -1784,13 +1815,14 @@ Sasa unaelekeza kwa [[$2]].',
 'mostimages' => 'Mafaili yanayoungwa kuliko yote',
 'mostrevisions' => 'Kurasa zenye mapitio mengi kuliko zote',
 'prefixindex' => 'Kurasa zote zenye viambishi awali',
+'prefixindex-namespace' => 'Kurasa zote zenye kiambishi awali ($1)',
 'shortpages' => 'Kurasa fupi',
 'longpages' => 'Kurasa ndefu',
 'deadendpages' => 'Kurasa ambazo haziungi na ukurasa mwingine wowote',
 'deadendpagestext' => 'Kurasa zifuatazo haziungana na kurasa zingine katika {{SITENAME}}.',
 'protectedpages' => 'Kurasa zinazolindwa',
 'protectedpages-indef' => 'Ulinzi kwa muda usiojulikana tu',
-'protectedpages-cascade' => 'zinazokuwa na ulindaji kwa kurasa chini zake tu',
+'protectedpages-cascade' => 'Mpangilio wa ulindaji tu',
 'protectedpagestext' => 'Kurasa zifuatazo zinalindwa zisisogezwe wala kuhaririwa',
 'protectedpagesempty' => 'Hakuna kurasa zinazolindwa kwa sasa kwa vigezo hivi.',
 'protectedtitles' => 'Majina yanayozuluiwa',
@@ -1815,11 +1847,11 @@ Sasa unaelekeza kwa [[$2]].',
 'booksources' => 'Vyanzo vya vitabu',
 'booksources-search-legend' => 'Tafuta mahali panopopatikana kitabu',
 'booksources-go' => 'Nenda',
-'booksources-invalid-isbn' => 'ISBN iliyoandikwa haonekani kuwa halali; hakikisha kwamba ni sawa na ISBN ya asili.',
+'booksources-invalid-isbn' => 'ISBN iliyoandikwa haonekani kuwa halali; hakikisha kwamba ni sawa na chanzo halisi cha ISBN.',
 
 # Special:Log
-'specialloguserlabel' => 'Mtumiaji:',
-'speciallogtitlelabel' => 'Cheo:',
+'specialloguserlabel' => 'Mtendaji:',
+'speciallogtitlelabel' => 'Kusudio (jina la ukurasa au mtumiaji):',
 'log' => 'Kumbukumbu',
 'all-logs-page' => 'Kumbukumbu zote zilizo wazi',
 'alllogstext' => 'Hapa panaonyeshwa kumbukumbu zote za {{SITENAME}} kwa pamoja.
@@ -1846,6 +1878,9 @@ Inaweza kuwa na herufi isiyoweza kutumiwa ndani ya majina ya kurasa.',
 'allpages-bad-ns' => 'Eneo la "$1" halipatikani kwenye {{SITENAME}}.',
 'allpages-hide-redirects' => 'Ficha kurasa za kuelekeza',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Tazama ya hivi karibuni.',
+
 # Special:Categories
 'categories' => 'Jamii',
 'categoriespagetext' => 'Jamii {{PLURAL:$1|inayofuata ina|zinazofuata zina}} kurasa au mafaili ya picha au sauti.
@@ -1865,10 +1900,11 @@ Tazama pia [[Special:WantedCategories|jamii zinazohitajika]].',
 'linksearch-pat' => 'Herufi zitakazotafutwa:',
 'linksearch-ns' => 'Eneo la wiki:',
 'linksearch-ok' => 'Tafuta',
-'linksearch-text' => 'Alama maalum za kutafuta kama "*.wikipedia.org" zinaweza kutumika.<br />
-Itifaki zinazoungwa mkono: <tt>$1</tt>',
+'linksearch-text' => 'Alama maalumu za kutafuta kama vile "*.wikipedia.org" zinaweza kutumika.<br />
+Inahitajika angalau kikoa cha kiwango cha juu, kwa mfano "*.org".<br />
+Itifaki zinazoungwa mkono: <code>$1</code> (usiongeza hizi unapotafuta).',
 'linksearch-line' => '$2 umeungwa kutoka $1',
-'linksearch-error' => 'Alama maalum za kutafuta zinaweza kutumika mwanzoni mwa URL tu.',
+'linksearch-error' => 'Alama maalumu zinaweza kuonekana mwanzoni mwa URL tu.',
 
 # Special:ListUsers
 'listusersfrom' => 'Onyesha watumiaji kuanzia:',
@@ -1939,6 +1975,10 @@ Anwani yako ya barua pepe ulioitaja katika [[Special:Preferences|mapendekezo yak
 'emailsenttext' => 'Barua pepe yako imetumwa.',
 'emailuserfooter' => 'Barua pepe hii imetumwa na $1 kwa $2 kwa kutumia zana ya "Kumtumia mtumiaji barua pepe" iliyopo {{SITENAME}}.',
 
+# User Messenger
+'usermessage-summary' => 'Inawacha ujumbe wa mfumo.',
+'usermessage-editor' => 'Jumbe za mfumo',
+
 # Watchlist
 'watchlist' => 'Maangalizi yangu',
 'mywatchlist' => 'Maangalizi yangu',
@@ -1965,28 +2005,28 @@ Ukitaka kufuta ukurasa huo kutoka maangalizi yako baadaye, bonyeza \"Acha kufuat
 'watchnochange' => 'Hakuna kitu kati ya maangalizi yako kilichohaririwa katika kipindi kilichotajwa.',
 'watchlist-details' => 'Unafuatilia {{PLURAL:$1|ukurasa $1|kurasa $1}} bila kuzingatia kurasa za majadiliano.',
 'wlheader-enotif' => '* Huduma ya kuarifu kwa barua pepe imewezeshwa.',
-'wlheader-showupdated' => "* Kurasa zilizobadilika tangu ulipoziona mwishoni zinaonyeshwa '''kooze'''",
+'wlheader-showupdated' => "* Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa katika hali ya '''kukooza'''",
 'watchmethod-recent' => 'kupitia madabiliko ya karibuni ili kupata kurasa za maangalizi',
-'watchmethod-list' => 'kupitia kurasa za maangalizi ili kupata madabiliko ya karibuni',
-'watchlistcontains' => 'Orodha ya maangalizi yako ina {{PLURAL:$1|kitu|vitu}} $1.',
-'iteminvalidname' => "Kitu '$1' kina tatizo la jina batili...",
-'wlnote' => "{{PLURAL:$1|Badiliko la|Mabadiliko '''$1''' ya}} mwisho katika {{PLURAL:$2|saa iliyopita linaonyeshwa|masaa '''$2''' yaliyopita yanaonyeshwa}} chini, ilivyokuwa saa $4, tarehe $3.",
+'watchmethod-list' => 'Kupitia kurasa za maangalizi ili kupata madabiliko ya karibuni',
+'watchlistcontains' => 'Orodha ya maangalizi yako ina {{PLURAL:$1|pages|kurasa}}.',
+'iteminvalidname' => "Shida na kitu  '$1' ,  jina batili...",
+'wlnote' => "{{PLURAL:$1|is the last change|Mabadiliko '''$1''' ya}} mwisho katika {{PLURAL:$2|hour|masaa '''$2''' yaliyopita yanaonyeshwa}} chini, ilivyokuwa saa $4, tarehe $3.",
 'wlshowlast' => 'Onyesha kutoka masaa $1 siku $2 $3',
 'watchlist-options' => 'Hitiari za maangalizi',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Unafuatilia...',
 'unwatching' => 'Umeacha kufuatilia...',
-'watcherrortext' => 'Hitilafu ilitokea ulipojaribu kubadilisha vipimo vya maangalizi yako kwa ajili ya "$1".',
+'watcherrortext' => 'Hitilafu ilitokea ulipojaribu kubadilisha mpangilio wa maangalizi yako ya "$1".',
 
 'enotif_mailer' => 'Huduma ya taarifa ya barua pepe kutoka kwa {{SITENAME}}',
-'enotif_reset' => 'Weka alama ya kutembelewa kwenye kurasa zote',
+'enotif_reset' => 'Weka alama kwa kurasa zote zilizotembelewa',
 'enotif_newpagetext' => 'Ukurasa huu ni mpya.',
 'enotif_impersonal_salutation' => 'Kwa mtumiaji wa {{SITENAME}}',
 'changed' => 'alibadilisha',
 'created' => 'alianzisha',
 'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED ukurasa wa $PAGETITLE kwenye {{SITENAME}}',
-'enotif_lastvisited' => 'Tazama mabadiliko yote tangu ziara yako iliyopita kwenye ukurasa wa $1.',
+'enotif_lastvisited' => 'Tazama $1 kwa mabadiliko yote tangu ziara yako ya mwisho.',
 'enotif_lastdiff' => 'Tazama badiliko hili hapo $1.',
 'enotif_anon_editor' => 'mtumiaji bila jina $1',
 'enotif_body' => 'Mpendwa $WATCHINGUSERNAME,
@@ -2021,7 +2061,7 @@ Kutoa maoni yako au kupata msaada mwingine:
 'deletepage' => 'Futa ukurasa',
 'confirm' => 'Yakinisha',
 'excontent' => "iliyokuwemo: '$1'",
-'excontentauthor' => 'yaliyomo yalikuwa: "$1" (yaliyechangiwa na mchangiaji mmoja tu anayeitwa "[[Special:Contributions/$2|$2]]")',
+'excontentauthor' => 'Yaliyomo yalikuwa: "$1" (na mchangiaji mmoja tu anayeitwa "[[Special:Contributions/$2|$2]]")',
 'exbeforeblank' => 'maandishi kabla hayajafutwa yote yalikuwa: "$1"',
 'exblank' => 'ukurasa ulikuwa tupu',
 'delete-confirm' => 'Futa "$1"',
@@ -2033,7 +2073,7 @@ Tafadhali hakikisha kwamba unalenga kufanya hivyo, na kwamba unaelewa matokeo ya
 'actionfailed' => 'Tendo halikufaulu',
 'deletedtext' => '"$1" imefutwa. Ona $2 kwa historia ya kurasa zilizofutwa hivi karibuni.',
 'dellogpage' => 'Kumbukumbu ya ufutaji',
-'dellogpagetext' => 'Kurasa na mafaili zilizofutwa hivi karibuni zinaorodheshwa chini.',
+'dellogpagetext' => 'Hapa chini ni orodha ya mafaili yaliyofutwa hivi karibuni.',
 'deletionlog' => 'kumbukumbu za kufuta',
 'reverted' => 'Ilirejeshwa hadi pitio la zamani',
 'deletecomment' => 'Sababu:',
@@ -2063,16 +2103,16 @@ ukurasa huu una mhariri mmoja tu.',
 'rollback-success' => 'Masahihisho aliyeyafanya $1 yalirejeshwa hadi kufika sahihisho la mwisho aliyefanya $2.',
 
 # Edit tokens
-'sessionfailure-title' => 'Kushindikana cha kipindi',
+'sessionfailure-title' => 'Kushindikana kwa kipindi',
 
 # Protect
 'protectlogpage' => 'Kumbukumbu ya ulindaji',
 'protectedarticle' => 'aliulinda "[[$1]]"',
 'modifiedarticleprotection' => 'alibadilisha kiwango cha ulindaji kwa ajili ya "[[$1]]"',
-'unprotectedarticle' => 'alitoa ulindaji wa "[[$1]]"',
-'movedarticleprotection' => 'alihamisha ulindaji wa "[[$2]]" hadi "[[$1]]"',
+'unprotectedarticle' => 'ulindaji ulitolewa kutoka kwa "[[$1]]"',
+'movedarticleprotection' => 'mpangilio wa ulindaji wa kuhamishwa kutoka "[[$2]]" hadi "[[$1]]"',
 'protect-title' => 'Kubadilisha kiwango cha ulindaji wa "$1"',
-'protect-title-notallowed' => 'Tazama kiwango cha ulindaji wa "$1"',
+'protect-title-notallowed' => 'Tazama kiwango cha ulindaji cha "$1"',
 'prot_1movedto2' => 'alihamisha [[$1]] hadi [[$2]]',
 'protect-badnamespace-title' => 'Eneo la wiki lisiloweza kulindwa',
 'protect-badnamespace-text' => 'Kurasa zilizopo katika eneo hili la wiki haziwezi kulindwa',
@@ -2081,7 +2121,7 @@ ukurasa huu una mhariri mmoja tu.',
 'protectexpiry' => 'Itakwisha:',
 'protect_expiry_invalid' => 'Muda wa kwisha ni batilifu.',
 'protect_expiry_old' => 'Muda wa kuishi umepita tayari.',
-'protect-unchain-permissions' => 'Fungua chaguzi zingine za ulinzi',
+'protect-unchain-permissions' => 'Fungua chaguzi zingine za ulindaji',
 'protect-text' => "Unaweza kutazama na kubadilisha kiwango cha ulindaji hapa kwa ukurasa '''$1'''.",
 'protect-locked-dblock' => "Viwango vya ulindaji haviwezi kubadilishwa kwa sababu hifadhidata imefungwa.
 Hapo panaandikwa viwango vya ulindaji wa ukurasa '''$1''':",
@@ -2246,9 +2286,12 @@ Andika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizohari
 'ipb-unblock-addr' => 'Acha kumzuia $1',
 'ipb-unblock' => 'Acha kumzuia mtumiaji au anwani wa IP',
 'ipb-blocklist-contribs' => 'Michango ya $1',
+'unblockip' => 'Acha kuzuia mtumiaji',
 'blocklist' => 'Watumiaji waliozuiliwa',
 'ipblocklist' => 'Watumiaji waliozuiliwa',
+'ipblocklist-legend' => 'Tafuta mtumiaji aliyezuiwa',
 'blocklist-timestamp' => 'Tarehe na saa',
+'blocklist-target' => 'Lengo',
 'blocklist-expiry' => 'Itakwisha',
 'blocklist-reason' => 'Sababu',
 'ipblocklist-submit' => 'Tafuta',
@@ -2256,10 +2299,12 @@ Andika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizohari
 'infiniteblock' => 'milele',
 'expiringblock' => 'inakwisha tarehe $1 saa $2',
 'emailblock' => 'barua pepe imezuiliwa',
+'ipblocklist-empty' => 'Orodha ya kuzuiwa ni tupu.',
 'blocklink' => 'zuia',
 'unblocklink' => 'acha kuzuia',
 'change-blocklink' => 'badilisha zuia',
 'contribslink' => 'michango',
+'emaillink' => 'tuma barua pepe',
 'blocklogpage' => 'Kumbukumbu ya uzuio',
 'blocklogentry' => 'amemzuia [[$1]] mpaka $2 $3',
 'unblocklogentry' => 'aliachisha kuzuia $1',
@@ -2271,10 +2316,10 @@ Andika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizohari
 'proxyblocksuccess' => 'Tayari.',
 
 # Developer tools
-'lockdb' => 'Kufunga hifadhidata',
-'unlockdb' => 'Kufungua hifadhidata',
-'lockconfirm' => 'Ndiyo, kwa kweli nataka kufunga hifadhidata.',
-'unlockconfirm' => 'Ndiyo, kwa kweli nataka kufungua hifadhidata.',
+'lockdb' => 'Funga hifadhidata',
+'unlockdb' => 'Fungua hifadhidata',
+'lockconfirm' => 'Ndiyo, ni kweli nataka kufunga hifadhidata.',
+'unlockconfirm' => 'Ndiyo,nataka kufungua hifadhidata.',
 'lockbtn' => 'Funga hifadhidata',
 'unlockbtn' => 'Fungua hifadhidata',
 'locknoconfirm' => 'Hujaweka alama katika sanduku la kuitika kitendo.',
@@ -2523,15 +2568,15 @@ Tafadhali jaribu tena.',
 # Info page
 'pageinfo-title' => 'Taarifa juu ya "$1"',
 'pageinfo-header-edits' => 'Maharirio',
-'pageinfo-header-watchlist' => 'Maangalizi',
-'pageinfo-subjectpage' => 'Ukurasa',
-'pageinfo-talkpage' => 'Ukurasa wa majadiliano',
 'pageinfo-watchers' => 'Idadi ya wanaofuatilia',
 'pageinfo-edits' => 'Idadi ya haririo',
 
 # Image deletion
 'deletedrevision' => 'Pitio la awali lililofutwa $1',
 'filedeleteerror-short' => 'Hitilafu wakati wa kufuta faili: $1',
+'filedeleteerror-long' => 'Hitilafu zilitokea wakati wa kufuta faili:
+
+$1',
 'filedelete-missing' => 'Faili "$1" haliwezi kufutwa, kwa sababu halipo.',
 'filedelete-old-unregistered' => 'The specified file revision "$1" is not in the database.',
 'filedelete-current-unregistered' => 'Faili lilotajwa la "$1" halipo katika hifadhidata.',
@@ -2626,14 +2671,18 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
 'exif-lightsource' => 'Mwanga',
 'exif-flash' => 'Taa ya picha',
 'exif-flashenergy' => 'Nguvu ya taa ya picha',
+'exif-filesource' => 'Chanzo cha faili',
 'exif-gpslatituderef' => 'Latitudo kwenda kaskazini au kusini',
 'exif-gpslatitude' => 'Latitudo',
 'exif-gpslongituderef' => 'Longitudo kwenda mashariki au magharibi',
 'exif-gpslongitude' => 'Longitudo',
 'exif-gpsaltituderef' => 'Rejeo ya mwinuko',
 'exif-gpsaltitude' => 'Mwinuko',
+'exif-gpsmeasuremode' => 'Jinsi ya kupima',
 'exif-gpsspeedref' => 'Kizio cha kupima mwendo',
 'exif-gpsspeed' => 'Mwendo wa sanduku la GPS',
+'exif-gpstrack' => 'Mwelekeo wa harakati',
+'exif-gpsimgdirection' => 'Mwelekeo wa picha',
 'exif-gpsdestlatitude' => 'Latitudo ya kikomo',
 'exif-gpsdestlongitude' => 'Longitudo ya kikomo',
 'exif-gpsdestdistance' => 'Mbali wa kikomo',
@@ -2645,26 +2694,37 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
 'exif-countrycreated' => 'Nchi palipopigwa picha',
 'exif-countrycodecreated' => 'Kodi ya nchi picha palipopigwa',
 'exif-countrydest' => 'Nchi inayoonyeshwa',
+'exif-citydest' => 'Mji umeonyeshwa',
 'exif-objectname' => 'Jina fupi',
 'exif-specialinstructions' => 'Maelekezo maalum',
 'exif-headline' => 'Kichwa cha habari',
+'exif-source' => 'Chanzo',
 'exif-urgency' => 'Umuhimu',
 'exif-writer' => 'Mwandishi',
 'exif-languagecode' => 'Lugha',
 'exif-iimcategory' => 'Jamii',
+'exif-datetimeexpires' => 'Usitumie baada ya',
+'exif-datetimereleased' => 'Ilitolewa mnamo',
 'exif-cameraownername' => 'Mwenye kamera',
+'exif-label' => 'Lebo',
 'exif-copyrighted' => 'Hali ya hakimiliki',
 'exif-copyrightowner' => 'Mwenye hatimiliki',
 'exif-pngfilecomment' => 'Maoni juu ya faili la PNG',
+'exif-disclaimer' => 'Kanusho',
+'exif-contentwarning' => 'Ilani ya maduhui',
 'exif-giffilecomment' => 'Maoni juu ya faili la GIF',
+'exif-intellectualgenre' => 'Aina ya kifaa',
 'exif-personinimage' => 'Mtu aliyepigwa picha',
 
+'exif-copyrighted-true' => 'Yenye hatimiliki',
+
 'exif-unknowndate' => 'Tarehe haijulikani',
 
 'exif-orientation-1' => 'Kawaida',
 
 'exif-componentsconfiguration-0' => 'haipo',
 
+'exif-exposureprogram-0' => 'Haijafafanuliwa',
 'exif-exposureprogram-1' => 'Kwa mikono',
 'exif-exposureprogram-2' => 'Programu ya kawaida',
 
@@ -2689,6 +2749,8 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
 
 'exif-focalplaneresolutionunit-2' => 'inchi',
 
+'exif-customrendered-0' => 'Mchakato wa kawaida',
+
 'exif-scenecapturetype-0' => 'Kawaida',
 'exif-scenecapturetype-1' => 'Mandhari',
 'exif-scenecapturetype-2' => 'Watu',
@@ -2729,7 +2791,7 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
 # Pseudotags used for GPSDestDistanceRef
 'exif-gpsdestdistance-k' => 'Kilomita',
 'exif-gpsdestdistance-m' => 'Maili',
-'exif-gpsdestdistance-n' => 'Maili ya baharia',
+'exif-gpsdestdistance-n' => 'Maili ya bahari',
 
 'exif-gpsdop-excellent' => 'Nzuri sana ($1)',
 'exif-gpsdop-good' => 'Nzuri ($1)',
@@ -2745,14 +2807,18 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
 'exif-gpsdirection-t' => 'Mwelekeo halisi',
 'exif-gpsdirection-m' => 'Mwelekeo wa sumaku',
 
+'exif-ycbcrpositioning-1' => 'Katikati',
+
 'exif-dc-contributor' => 'Wengine waliochangia',
 'exif-dc-date' => 'Tarehe',
 'exif-dc-publisher' => 'Mchapishaji',
 'exif-dc-rights' => 'Haki',
+'exif-dc-source' => 'Chanzo cha media',
+'exif-dc-type' => 'Aina ya media',
 
-'exif-rating-rejected' => 'Lilikataliwa',
+'exif-rating-rejected' => 'Ilikataliwa',
 
-'exif-isospeedratings-overflow' => 'Zaidi na 65535',
+'exif-isospeedratings-overflow' => 'Zaidi ya 65535',
 
 'exif-iimcategory-ace' => 'Sanaa, utamaduni na burudani',
 'exif-iimcategory-clj' => 'Uhalifu na sheria',
@@ -2767,6 +2833,7 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
 'exif-iimcategory-pol' => 'Siasa',
 'exif-iimcategory-rel' => 'Dini na imani',
 'exif-iimcategory-sci' => 'Sayansi na teknolojia',
+'exif-iimcategory-soi' => 'Masuala ya kijamii',
 'exif-iimcategory-spo' => 'Michezo',
 'exif-iimcategory-war' => 'Vita, migogoro na vurugu',
 'exif-iimcategory-wea' => 'Hali ya hewa',
@@ -2941,6 +3008,7 @@ Pia unaweza [[Special:EditWatchlist|kutumia kihariri cha kawaida]].',
 # Special:Version
 'version' => 'Toleo',
 'version-specialpages' => 'Kurasa maalum',
+'version-variables' => 'Vibadili',
 'version-skins' => 'Maumbo',
 'version-other' => 'Zingine',
 'version-version' => '(Toleo $1)',
@@ -2955,6 +3023,7 @@ Huwa unapokea [{{SERVER}}{{SCRIPTPATH}}/COPYING nakala ya GNU General Public Lic
 'version-software' => 'Bidhaa pepe iliyosakinishwa',
 'version-software-product' => 'Bidhaa',
 'version-software-version' => 'Toleo',
+'version-entrypoints-header-url' => 'KISARA Kioneshi Sanifu Raslimali',
 
 # Special:FilePath
 'filepath' => 'Njia ya faili',
@@ -3059,6 +3128,12 @@ Tovuti hii inapata matatatizo wakati huu.',
 'logentry-suppress-revision' => '$1 alibadilisha kwa siri hali ya kuonekana wazi {{PLURAL:$5|kumbukumbu $5 ya|kumbukumbu $5 za}} ukurasa wa $3: $4',
 'logentry-suppress-event-legacy' => '$1 alibadilisha kwa siri hali ya kuonekana wazi ya kumbukumbu za $3',
 'logentry-suppress-revision-legacy' => '$1 alibadilisha kwa siri hali ya kuonekana wazi mapitio ya ukurasa $3',
+'revdelete-content-hid' => 'maudhui yamefichwa',
+'revdelete-summary-hid' => 'historia ya kuhariri imefichwa',
+'revdelete-uname-hid' => 'jina la mtumiaji limefichwa',
+'revdelete-content-unhid' => 'maudhui hayajafichwa',
+'revdelete-summary-unhid' => 'muhtasari wa kuhariri haujafichwa',
+'revdelete-uname-unhid' => 'jina la mtumiaji halijafichwa',
 'revdelete-restricted' => 'aliwazuia pia wakabidhi wasiyaone maelezo',
 'revdelete-unrestricted' => 'aliwarudishia wakabidhi uwezo wa kuona maelezo',
 'logentry-move-move' => '$1 alihamisha ukurasa wa $3 hadi $4',
@@ -3081,9 +3156,23 @@ Tovuti hii inapata matatatizo wakati huu.',
 'feedback-close' => 'Tayari',
 
 # API errors
+'api-error-empty-file' => 'Faili ulilowasilisha ni tupu.',
+'api-error-emptypage' => 'Kutengeneza mpya, kurasa tupu hazikubaliwi',
+'api-error-filename-tooshort' => 'Jina la faili ni fupi mno.',
+'api-error-filetype-banned' => 'Aina hili la faili hairuhusiwi.',
+'api-error-illegal-filename' => 'Jina hilo la faili haliruhusiwi.',
 'api-error-unclassified' => 'Ilitokea hitilafu isiyojulikana.',
 'api-error-unknown-code' => 'Hitilafu isiyojulikana: "$1".',
 'api-error-unknown-warning' => 'Ilani isiyojulikana: "$1".',
 'api-error-unknownerror' => 'Hitilafu isiyojulikana: "$1".',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|second|sekunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minute|dakikas}}',
+'duration-hours' => '$1 {{PLURAL:$1|hour|masaa}}',
+'duration-days' => '$1 {{PLURAL:$1|day|masiku}}',
+'duration-weeks' => '$1 {{PLURAL:$1|week|wiki}}',
+'duration-years' => '$1 {{PLURAL:$1|year|miaka}}',
+'duration-centuries' => '$1 {{PLURAL:$1|century|karne}}',
+
 );
index b705e0f..c843c68 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Silesian (Å\9alůnski)
+/** Silesian (Å\9blůnski)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
 $fallback = 'pl';
 
 $namespaceNames = array(
-       NS_SPECIAL        => 'Szpecyjalna',
-       NS_TALK           => 'Dyskusyjo',
-       NS_USER           => 'Używacz',
-       NS_USER_TALK      => 'Dyskusyjo_używacza',
-       NS_PROJECT_TALK   => 'Dyskusyjo_$1',
-       NS_FILE           => 'Plik',
-       NS_FILE_TALK      => 'Dyskusyjo_plika',
-       NS_MEDIAWIKI      => 'MediaWiki',
-       NS_MEDIAWIKI_TALK => 'Dyskusyjo_MediaWiki',
-       NS_TEMPLATE       => 'Muster',
-       NS_TEMPLATE_TALK  => 'Dyskusyjo_mustra',
-       NS_HELP           => 'Půmoc',
-       NS_HELP_TALK      => 'Dyskusyjo_půmocy',
-       NS_CATEGORY       => 'Kategoryjo',
-       NS_CATEGORY_TALK  => 'Dyskusyjo_kategoryji',
+       NS_SPECIAL          => 'Szpecyjalna',
+       NS_TALK             => 'Dyskusyjo',
+       NS_USER             => 'Używacz',
+       NS_USER_TALK        => 'Dyskusyjo_używacza',
+       NS_PROJECT_TALK     => 'Dyskusyjo_$1',
+       NS_FILE             => 'Plik',
+       NS_FILE_TALK        => 'Dyskusyjo_plika',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'Dyskusyjo_MediaWiki',
+       NS_TEMPLATE         => 'Muster',
+       NS_TEMPLATE_TALK    => 'Dyskusyjo_mustra',
+       NS_HELP             => 'Půmoc',
+       NS_HELP_TALK        => 'Dyskusyjo_půmocy',
+       NS_CATEGORY         => 'Kategoryjo',
+       NS_CATEGORY_TALK    => 'Dyskusyjo_kategoryji',
 );
 
 $namespaceAliases = array(
@@ -279,7 +279,7 @@ $messages = array(
 'viewtalkpage' => 'Zajta godki',
 'otherlanguages' => 'We inkszych godkach',
 'redirectedfrom' => '(Punkńyńto s $1)',
-'redirectpagesub' => 'Zajta překerowujůnco',
+'redirectpagesub' => 'Zajta przekerowujůnco',
 'lastmodifiedat' => 'Ta zajta bůła uostatńo sprowjano $2, $1.',
 'viewcount' => 'W ta zajta filowano {{PLURAL:$1|tylko roz|$1 rozůw}}.',
 'protectedpage' => 'Zajta zawarto',
@@ -411,19 +411,22 @@ Eli tak ńy je, możno śe trefił feler we softwaru MediaWiki. Kej ja, pedz uo
 'formerror' => 'Feler: ńy idźe wysuać formulařa',
 'badarticleerror' => 'Tyj uoperacyje ńy idźe zrobić lo tyj zajty.',
 'cannotdelete' => 'Ńy idźe wyćepać podanyj zajty abo grafiki $1.',
+'cannotdelete-title' => 'Ńy idźie wyćepać zajty "$1".',
 'badtitle' => 'Felerno tytůua',
 'badtitletext' => 'Podano felerny titel zajty. Prawdopodańy sům w ńim znoki, kerych ńy wolno užywać we titlach abo je pusty.',
-'perfcached' => 'To co sam je naškryflane, to ino kopja s pamjyńći podrynčnyj a može ńy być aktualne. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'To co sam je naškryflane, to ino kopja s pamjyńći podrynčnyj a bůuo uaktualńůne $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'To co sam je naszkryflane, to ino kopja s pamjyńći podryncznyj a może ńy być aktualne. Nojwjyncyj {{PLURAL:$1|jydyn wynik je|$1 wyniki sům}} w tyj pamjyńći.',
+'perfcachedts' => 'To co sam je naszkryflane, to ino kopja s pamjyńći podryncznyj a bůło uaktualńůne $1. Nojwjyncyj {{PLURAL:$4|jeden wynik je|$4 wyniki sům}} dostympne.',
 'querypage-no-updates' => 'Uaktualńyńo lo tyj zajty sům terozki zawarte. Dane, kere sam sům, ńy zostouy uodśwjyžůne.',
 'wrong_wfQuery_params' => 'Felerne parametry překozane do wfQuery()<br />
 Funkcyjo: $1<br />
 Zapytańy: $2',
 'viewsource' => 'Zdrzůdłowy tekst',
+'viewsource-title' => 'Uobocz zdrzůdło lo $1',
 'actionthrottled' => 'Akcyjo wstřimano',
 'actionthrottledtext' => 'Mechańizm uobrůny před spamym uograńičo ličba wykonań tyj čynnośći we jednostce času. Průbowoužeś go uocygańić. Proša, sprůbuj na nowo za pora minut.',
-'protectedpagetext' => 'Ta zajta je zawarto před sprowjańym.',
-'viewsourcetext' => 'We tekst zdřůduowy tyj zajty možno dali filować, idźe go tyž kopjować.',
+'protectedpagetext' => 'Ta zajta je zawarto przed sprowjańym.',
+'viewsourcetext' => 'We tekst zdrzůduowy tyj zajty możno dali filować, idźe go tyż kopjyrować.',
+'viewyourtext' => 'We tekst zdrzůduowy tyj zajty możno dali filować, idźe go tyż kopjować.',
 'protectedinterface' => 'Na tyj zajće znojduje śe tekst interfejsu uoprogramowańo, bestož uůna je zawarto uod sprowjańo.',
 'editinginterface' => "''''Dej pozůr:''' Sprowjosz zajta, na keryj je tekst interfejsu uoprogramowańo. Pomjyńyńa na tyj zajće zmjyńům wyglůnd interfejsu lo inkšych užytkowńikůw.",
 'sqlhidden' => '(schowano zapytańy SQL)',
@@ -435,6 +438,10 @@ $2',
 'ns-specialprotected' => 'Ńy idźe sprowjać zajtůw we přestřyni mjan {{ns:special}}.',
 'titleprotected' => "Wćepańy sam zajty uo takim mjańe zawar [[User:$1|$1]].
 Powůd zawarćo: ''$2''.",
+'filereadonlyerror' => 'Ńy idźe pomjyńać plika "$1" abo repozytorjum "$2" terozki je zawarte.
+
+Administrator kery zawarł wćepał kůmyntorz: "$3".',
+'invalidtitle-knownnamespace' => 'Felerne mjano "$3" w przestrzeńy "$2".',
 
 # Virus scanner
 'virus-badscanner' => "Felerno konfiguracyjo – ńyznany skaner antywirusowy ''$1''",
@@ -450,7 +457,7 @@ Dej pozůr, co na ńykerych zajtach přeglůndarka može dali pokozywać co jež
 Uotwarli my sam lo Ćebje kůnto.
 Ńy zapomńij poštalować [[Special:Preferences|preferencyji lo {{GRAMMAR:D.lp|{{SITENAME}}}}]].',
 'yourname' => 'Mjano użytkowńika:',
-'yourpassword' => 'Hasuo:',
+'yourpassword' => 'Hasło:',
 'yourpasswordagain' => 'Naszkryflej ausdruk zaś',
 'remembermypassword' => 'Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})',
 'securelogin-stick-https' => 'Po zalogowańy mjyj połonczenie bez HTTPS',
@@ -464,9 +471,9 @@ Uotwarli my sam lo Ćebje kůnto.
 'logout' => 'Wyloguj',
 'userlogout' => 'Uodloguj śe',
 'notloggedin' => 'Ńy ježeś zalůgowany',
-'nologin' => "Ńy moš kůnta? '''$1'''.",
+'nologin' => "Ńy mosz kůnta? '''$1'''.",
 'nologinlink' => 'Twůrz kůnto',
-'createaccount' => 'Zouůž nowe kůnto',
+'createaccount' => 'Twůrz nowe kůnto',
 'gotaccount' => "Mosz już kůnto? '''$1'''.",
 'gotaccountlink' => 'Naloguj śe',
 'userlogin-resetlink' => 'Zapomńoł żeś dane lo nalogowańo?',
@@ -487,13 +494,13 @@ Sprowdź szrajbůng, abo [[Special:UserLogin/signup|utwůrz nowe kůnto]].',
 'nosuchusershort' => 'Ńy mo sam užytkowńika uo mjańe "$1".',
 'nouserspecified' => 'Podej mjano użytkowńika.',
 'login-userblocked' => 'Tyn sprowjorz ma zawrzite sprowjyńa. Ńy możno sie zalgować.',
-'wrongpassword' => 'Hasuo kere žeś naškryflou je felerne. Poprůbůj naškryflać je ješče roz.',
+'wrongpassword' => 'Hasło kere żeś naszkryfloł je felerne. Poprůbůj naszkryflać je jeszcze roz.',
 'wrongpasswordempty' => 'Hasuo kere žeś podou je puste. Naškryflej je ješče roz.',
 'passwordtooshort' => 'Hasło kere żeś podoł je felerne abo za krůtke.
 Hasło muśi mjeć przinojmńij {{PLURAL:$1|1 buchsztaba|$1 buchsztabůw}} a być inksze od mjana użytkowńika.',
 'password-name-match' => 'Hasło musi być inne niż nazwa użytkownika.',
 'password-login-forbidden' => 'Ńy wolno mjyć takij nazwy a hasua.',
-'mailmypassword' => 'Wyślij mi nowe hasuo bez e-brif',
+'mailmypassword' => 'Wyślij mi nowe hasło bez e-brif',
 'passwordremindertitle' => 'Nowe tymčasowe hasuo dla {{SITENAME}}',
 'passwordremindertext' => 'Ftůś (cheba Ty, s IP $1)
 pado, aże chce nowe hasło do {{SITENAME}} ($4).
@@ -507,8 +514,8 @@ Jak ktůś inkszy chćoł nowe hasło abo jak Ci śe przipůmńouo stare a ńy c
 'passwordsent' => 'Nowe hasuo pošuo na e-brifa uod užytkowńika "$1".
 Zalůguj śe zaś jak dostańyš tygo brifa.',
 'blocked-mailpassword' => 'Twůj adres IP zostou zawarty a ńy možeš užywać funkcyje odzyskiwańo hasua skuli možliwośći jeji nadužywańo.',
-'eauthentsent' => 'Potwjerdzeńy zostouo wysuane na e-brifa.
-Jak bydźeš chćou, coby wysyuouo Ći e-brify, pjyrwyj go přečytej. Bydźeš tam mjou instrukcyjo co moš zrobić, coby pokozać, aže tyn adres je Twůj.',
+'eauthentsent' => 'Potwjerdzeńy zostoło posłane na e-brifa.
+Jak bydźesz chćoł, coby wysyłouo Ći e-brify, pjyrwyj go przeczytej. Bydźesz tam mjoł instrukcyjo co mosz zrobić, coby pokozać, aże tyn ausdruk je Twůj.',
 'throttled-mailpassword' => 'Připůmńyńy hasua bůuo juž wysuane bez {{PLURAL:$1|uostatńo godźina|uostatńe $1 godźin}}.
 Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano na jydne bez {{PLURAL:$1|godźina|$1 godźiny}}.',
 'mailerror' => 'Při wysyuańu e-brifa zdořiu śe feler: $1',
@@ -519,10 +526,11 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano
 'emailconfirmlink' => 'Potwjerdź swůj adres e-brifa',
 'invalidemailaddress' => 'E-brif ńy bydźe zaakceptůwany skiž tygo co jego format ńy speuńo formalnych wymagań. Proša naškryflać poprowny adres e-brifa abo wyčyśćić pole.',
 'cannotchangeemail' => 'Ńy możno pomjyńyc ausdruku e-mail.',
+'emaildisabled' => 'Ta zajta ńy je mogebna posyłać e-brify.',
 'accountcreated' => 'Utwůřůno kůnto',
 'accountcreatedtext' => 'Kůnto lo $1 zostouo utwůřůne.',
 'createaccount-title' => 'Stwořyńy kůnta na {{GRAMMAR:MS.lp|{{SITENAME}}}}',
-'createaccount-text' => 'Ktoś utwořiu na {{GRAMMAR:MS.lp|{{SITENAME}}}} ($4) dla Twojego adresa e-brif kůnto "$2". Aktualne hasuo to "$3". Powińežeś śe terozki zalogůwać a je zmjyńić.',
+'createaccount-text' => 'Ktoś utworził na {{GRAMMAR:MS.lp|{{SITENAME}}}} ($4) dla Twojego adresa e-brif kůnto "$2". Aktualne hasło to "$3". Powińeżeś śe terozki zalogůwać a je zmjyńić.',
 'usernamehasherror' => 'Nazwa sprowjorza ńy może mjyć buchsztaby "#".',
 'login-throttled' => '!Wykonołżeś za wjela průb zalůgowańo śe na te kůnto. Poczekej chwila ńym zaś sprůbujesz.',
 'login-abort-generic' => 'Felerne logowańe',
@@ -534,12 +542,12 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano
 'user-mail-no-addy' => 'Próba wysłania e‐maila bez adresu odbiorcy',
 
 # Change password dialog
-'resetpass' => 'Zmjyń hasło',
+'resetpass' => 'Pomjyńaj hasło',
 'resetpass_announce' => 'Zalůgowoužeś śe s tymčasowym kodym uotřimanym bez e-brif. Coby zakůńčyć proces logůwańo muśiš naštalować nowe hasuo:',
 'resetpass_header' => 'Zmjyń hasło lů swojygo kůnta',
-'oldpassword' => 'Stare hasuo',
-'newpassword' => 'Nowe hasuo',
-'retypenew' => 'Naškryflej ješče roz nowe hasuo:',
+'oldpassword' => 'Stare hasło',
+'newpassword' => 'Nowe hasło',
+'retypenew' => 'Naszkryflej jeszcze roz nowe hasło:',
 'resetpass_submit' => 'Naštaluj hasuo a zalůguj',
 'resetpass_success' => 'Twoje hasuo zostouo půmyślńy pomjyńone! Trwo logůwańe...',
 'resetpass_forbidden' => 'Ńy idźe sam půmjyńyć hasuůw.',
@@ -583,7 +591,7 @@ Tymczasowe hasło: $2',
 'changeemail-header' => 'Pomjyno ausduku e-mail',
 'changeemail-text' => 'Wypełnij formularz, podej nowy ausdruk a hasło.',
 'changeemail-no-info' => 'Muśysz być zalogowany, coby uzyskać bezpostrzedńi dostymp do tyj zajty.',
-'changeemail-oldemail' => 'Łobecny ausdruk:',
+'changeemail-oldemail' => 'Uobecny ausdruk:',
 'changeemail-newemail' => 'Nowy adresu e-brif',
 'changeemail-none' => 'podstawowo',
 'changeemail-submit' => 'Zapisz nowy',
@@ -665,8 +673,8 @@ Hasło można pomjyńyć [[Special:ChangePassword|tu]].',
 'newarticle' => '(Nowy)',
 'newarticletext' => 'Ńy mo sam jeszcze artikla uo takijj titli. Eli chcesz go sprowjać, naszkryflej niżyj jego tekst (wjyncy informacyj nojdźesz [[{{MediaWiki:Helppage}}|na zajće půmocy]]). Eli żeś chćoł zrobić cosik inksze, naćiś ino knefel "Nazod".',
 'anontalkpagetext' => "---- ''To je zajta godki lo anůnimowych używoczy  - takich, kerzi ńy majům jeszcze swojigo kůnta abo ńy chcům go terozki używać.
-By jeich idyntyfikować, używomy numerůw IP.
-Eli jeżeś anůnimowym używoczym a wydowo Ći śe, aże zamjyszczůne sam kůmyntorze ńy sům skjyrowane do Ćebje, [[Special:UserLogin|utwůrz prosza kůnto]] abo [[Special:UserLogin|zalůguj śe]] - bez tůż uńikńesz potym podobnych ńyporozumjyń.''",
+By jejich idyntyfikować, używomy numerůw IP.
+Eli jeżeś anůnimowym używoczym a wydowo Ći śe, aże zamjyszczůne sam kůmyntorze ńy sům skjyrowane do Ćebje, [[Special:UserLogin|utwůrz prosza kůnto]] abo [[Special:UserLogin|zalůguj śe]] - beztůż uńikńesz potym podobnych ńyporozumjyń.''",
 'noarticletext' => 'Ńy můmy zajta uo takij titli. Mogesz [{{fullurl:{{FULLPAGENAME}}|action=edit}} wćepać artikel {{FULLPAGENAME}}] abo [[Special:Search/{{PAGENAME}}|sznupać {{PAGENAME}} we inkszych]].',
 'noarticletext-nopermission' => 'Na tyj zajće ńy mo jeszcze artikla.
 Mogesz [[Special:Search/{{PAGENAME}}|wysznupać ta titla]] we treśći inkszych zajtůw
@@ -687,6 +695,7 @@ abo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}
 'updated' => '(Pomjyńano)',
 'note' => "'''Pozůr:'''",
 'previewnote' => "'''To je ino podglůnd - artikel jeszcze ńy je spamjyntany!'''",
+'continue-editing' => 'Sprowjej dalej',
 'previewconflict' => 'Wersyjo podglůndano uodnośi śe do tekstu s pola edycyje na wjyrchu. Tak bydźe wyglůndać zajta jeli zdecyduješ śe jům naškryflać.',
 'session_fail_preview' => "'''Přeprašomy! Serwer ńy može přetwořyć tygo sprowjyńo skuli utraty danych ze sesyji. Sprůbuj ješče roz. Kejby to ńy pomoguo - wylůguj śe i zalogůj uod nowa.'''",
 'session_fail_preview_html' => "'''Přeprašomy! Serwer ńy može přetwořyć tygo sprowjyńo skuli utraty danych ze sesyji.'''
@@ -696,8 +705,9 @@ abo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}
 '''Jeli to je prawiduowo průba sprowjańo, sprůbuj ješče roz. Kejby to ńy pomoguo - wylůguj śe a zalůguj na nowo.'''",
 'token_suffix_mismatch' => "'''Twoje sprowjyńy zostouo uodćepńynte skuli tego, co twůj klijynt pomjyšou znaki uod interpůnkcyji w žetůńe sprowjyń. Twoje sprowjyńy zostouo uodćepńynte coby zapobjec zńyščyńu tekstu zajty. Take průblymy zdořajům śe w roźe kůřistańo s felernych anůnimowych śećowych usuůg proxy.'''",
 'editing' => 'Sprowjosz $1',
+'creating' => 'Tworzyńy $1',
 'editingsection' => 'Sprowjosz $1 (sekcyjo)',
-'editingcomment' => 'Sprowjosz "$1" (kůmyntorz)',
+'editingcomment' => 'Sprowjosz "$1" (nowy kůmyntorz)',
 'editconflict' => 'Kůnflikt sprowjyń: $1',
 'explainconflict' => "Ktoś zdůnžyu wćepać swoja wersyjo artikla ńim žeś naškryflou sprowjyńy.
 We polu edycyji na wjyrchu moš tekst zajty aktůalńy naškryflany w baźe danych.
@@ -714,17 +724,20 @@ By wćepać swoje pomjyńańo muśiš pomjyńać tekst w polu na wjyrchu.
 'copyrightwarning2' => "Pamjyntej uo tym, aže couki wkuod do {{GRAMMAR:MS.lp|{{SITENAME}}}} može być sprowjany, pomjyńany abo wyćepany bez inkšych užytkownikůw. Jak ńy chceš, coby koždy můg go zmjyńać i dali rozpowšychńać bez uograničyń, ńy wćepuj go sam.<br />
 Škryflajůnc sam tukej pośwjadčoš tyž, co te pisańy je twoje wuasne, abo žeś go wźůn(a) s matyrjouůw kere sům na public domain, abo kůmpatybilne (kuknij tyž: $1).
 '''PROŠA ŃY WĆEPYWAĆ SAM MATYRJOUŮW KERE SŮM CHRŮŃONE PRAWYM AUTORSKIM BEZ DOZWOLEŃO WUAŚĆIĆELA!'''",
-'longpageerror' => "'''Feler: Tekst kery žeś sam wćepywou mo $1 kilobajtůw. Maksymalno dugość tekstu ńy može być wjynkšo kej $2 kilobajtůw. Twůj tekst ńy bydźe sam naškryflany.'''",
+'longpageerror' => "''Feler: Tekst kery żeś sam wćepywoł mo {{PLURAL:$1|jedyn kilobajt|$1 kilobajtůw}}. Maksymalno dugość tekstu ńy może być srogszo kej {{PLURAL:$2|jedyn kilobajt|$2 kilobajtůw}}. Twůj tekst ńy bydźe sam naszkryflany.'''",
 'readonlywarning' => "'''Dej pozůr: Baza danych zostoua filowo zawarto skuli potřeb admińistracyjnych. Bestůž ńy do śe terozki naškryflać Twojich pomjyńań. Radzymy přećepać nowy tekst kajś do plika tekstowego (wytnij/wklej) a wćepać sam zaś po uodymkńyńću bazy.'''
 
 Admińistrator kery zawar baza dou take wyjaśńyńe: $1",
-'protectedpagewarning' => "'''Dej pozůr: Sprowjańe tyj zajty zostouo zawarte. Mogům jům sprowjać ino užytkowńicy s uprawńyńami admińistratora.'''",
-'semiprotectedpagewarning' => "'''Pozůr:''' Ta zajta zostoua zawarto a ino zaregišterowani užytkownicy mogům jům sprowjać.",
+'protectedpagewarning' => "'''Dej pozůr: Sprowjańe tyj zajty zostoło zawarte. Mogům jům sprowjać ino użytkowńicy s uprawńyńami admińistratora.'''
+Uostatńy wpis w rejerze je poniżej.",
+'semiprotectedpagewarning' => "'''Pozůr:''' Ta zajta zostoła zawarto a ino zaregiszterowani użytkownicy mogům jům sprowjać.
+Uostotńy wpis w rejerze je ńyżej.",
 'cascadeprotectedwarning' => "'''Dej pozůr:''' Ta zajta zostoua zawarto a ino užytkowńicy s uprawńyńami admińistratora mogům jům sprowjać. Zajta ta je podpjynto pod {{PLURAL:$1|nastympujůnco zajta, kero zostoua zawarto|nastympujůncych zajtach, kere zostouy zawarte}} ze zauůnčonům opcjům dźedźičyńo:",
-'titleprotectedwarning' => "'''DEJ POZŮR: Zajta uo tym titlu zostoua zawarto a ino ńykeři užytkowńicy mogům jům wćepać.'''",
+'titleprotectedwarning' => "'''Dej pozůr: Zajta uo tym titlu zostoła zawarto a ino [[Special:ListGroupRights|ńykerzi użytkowńicy]] mogům jům wćepać.'''
+Uostatńy wpis z rejera je ńyżej.",
 'templatesused' => '{{PLURAL:$1|Szablon|Szablůny}} użyte na tyj zajće:',
-'templatesusedpreview' => 'Šablůny užyte we tym podglůńdźe:',
-'templatesusedsection' => 'Šablůny užyte w tyj tajli:',
+'templatesusedpreview' => '{{PLURAL:$1|Szablon|Szablůny}} użyte na tyj zajće:',
+'templatesusedsection' => '{{PLURAL:$1|Szablon|Szablůny}} użyte w tyj tajli:',
 'template-protected' => '(zawrzity uod sprowjańo)',
 'template-semiprotected' => '(tajlowo zawarte)',
 'hiddencategories' => 'Ta zajta je {{PLURAL:$1|w jednyj schrůńunyj katygoryji|we $1 schrůńunych katygoryjach}}:',
@@ -732,6 +745,8 @@ Admińistrator kery zawar baza dou take wyjaśńyńe: $1",
 'nocreatetext' => 'Na {{GRAMMAR:MS.lp|{{SITENAME}}}} twořyńy nowych zajtůw uograńičůno.
 Možeš sprowjać te co juž sům, abo [[Special:UserLogin|zalogować śe, abo zauožyć konto]].',
 'nocreate-loggedin' => 'Ńy moš uprowńyń do twořyńo nowych zajtůw.',
+'sectioneditnotsupported-title' => 'Sprowjańy tajli ńymogebne',
+'sectioneditnotsupported-text' => 'Sprowjańy tajli ńymogebne na tyj zajće.',
 'permissionserrors' => 'Felerne uprowńyńa',
 'permissionserrorstext' => 'Ńy moš uprowńyń do takij akcyje {{PLURAL:$1|skuli tego, co:|bestůž, co:}}',
 'permissionserrorstext-withaction' => 'Ńy mogesz $2, ze {{PLURAL:$1|takigo powodu|takich powodůw}}:',
@@ -749,6 +764,7 @@ Zdowo śe, co zostoua wyćepano.',
 'edit-no-change' => 'Twoje sprowjyńe uostouo zignorowane pů takymu, co ńic žeś we tekśće ńy zmjyńiu.',
 'edit-already-exists' => 'Ńy idźe utwořić nowyj zajty.
 Tako zajta juž sam je.',
+'defaultmessagetext' => 'Tekst důmyślny',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Dej pozůr: ta zajta mo za dužo uodwouań do funkcyji parsera, kere mocno uobćůnžajům systym.
@@ -767,7 +783,7 @@ Powinno być myńi jak $2 {{PLURAL:$2|wywouańy|wywouańo|wywouań}}, a terozki
 'undo-success' => 'Sprowjyńy zostouo wycůfane. Proša pomjarkować ukozane půnižyj dyferencyje mjyndzy wersyjami, coby zweryfikować jejich poprawność, potym zaś naškryflać pomjyńańo coby zakońčyć uoperacyjo.',
 'undo-failure' => 'Sprowjyńo ńy idźe wycofać skuli kůnflikta ze wersyjůma postřednimi.',
 'undo-norev' => 'Sprowjyńo ńy idźe cofnůńć skuli tego, co ńy istńije abo zostouo wyćepane.',
-'undo-summary' => 'Wycůfańy wersyji $1 naškryflanej bez [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]])',
+'undo-summary' => 'Wycůfańy wersyji $1 naszkryflanej bez [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]])',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Ńy idźe utwořić kůnta',
@@ -790,8 +806,8 @@ Skuli: ''$2''",
 'last' => 'poprz.',
 'page_first' => 'počůnek',
 'page_last' => 'kůńec',
-'histlegend' => 'Wybůr růžńic do porůwnańo: postow kropki we boksach a naćiś enter abo knefel na dole.<br />
-Legynda: (bjež.) - růžńice s wersyjům bježůncům, (popř.) - růžńice s wersyjům popředzajůncům, d - drobne zmjany',
+'histlegend' => 'Wybůr růżńic do porůwnańo: postow kropki we boksach a naćiś enter abo knefel na dole.<br />
+Legynda: (akt.) - růżńice s wersyjům bjeżůncům, (poprz.) - růżńice s wersyjům poprzedzajůncům, d - drobne zmjany',
 'history-fieldset-title' => 'Přeglůndej historyjo',
 'history-show-deleted' => 'Jyno wyćepane',
 'histfirst' => 'uod počůnku',
@@ -816,9 +832,12 @@ Možeš tyž [[Special:Search|šnupać]] za tům zajtům.',
 Atoli kej admińistrator {{GRAMMAR:MS.lp|{{SITENAME}}}} možeš jům uobejřeć.
 Powody wyćepańo idźe znejść we [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejeře wyćepań]',
 'rev-delundel' => 'ukoż/schrůń',
+'rev-showdeleted' => 'ukoż',
 'revisiondelete' => 'Wyćep/wćep nazod wersyje',
 'revdelete-nooldid-title' => 'Ńy wybrano wersyji',
 'revdelete-nooldid-text' => 'Ńy wybrano wersyji na kerych mo zostać wykůnano ta uoperacyjo.',
+'revdelete-no-file' => 'Ńy mo tygo plika.',
+'revdelete-show-file-confirm' => 'Jeżeś echt pewny co chcesz uobejzdrzeć wyćepano wersyjo plika „<nowiki>$1</nowiki>” s $2 $3?',
 'revdelete-show-file-submit' => 'Ja',
 'revdelete-selected' => "'''{{PLURAL:$2|Wybrano wersyja|Wybrane wersyje}} zajty [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Wybrane zdařyńy s rejeru|Wybrane zdařyńa s rejeru}}:'''",
@@ -867,7 +886,7 @@ $1',
 
 # Suppression log
 'suppressionlog' => 'Log schrůńyńć',
-'suppressionlogtext' => 'Půńiżyj je lista nojnowszych wyćepań i zawarć s uwzglyndńyńym treśći schrůńůnej lo admińistratorůw. Coby przřejrzeć lista aktualnych banůw i zawarć, uobezdrzij [[Special:BlockList|IP block list]].',
+'suppressionlogtext' => 'Půńiżyj je lista nojnowszych wyćepań a zawarć s uwzglyndńyńym treśći schrůńůnej lo admińistratorůw. Coby przejrzeć lista teroźnych banůw a zawarć, uobezdrzij [[Special:BlockList|IP block list]].',
 
 # History merging
 'mergehistory' => 'Pouůnč historyjo půmjyńań zajtůw',
@@ -898,7 +917,7 @@ $1',
 'mergelogpagetext' => 'Půńižej znojduje śe lista uostatńich pouůnčyń historyji půmjyńań zajtůw.',
 
 # Diffs
-'history-title' => 'Historyjo sprowjyń "$1"',
+'history-title' => 'Gyszichta sprowjyń "$1"',
 'difference-multipage' => '(Porůwnańje zajt)',
 'lineno' => 'Lińijo $1:',
 'compareselectedversions' => 'zrůwnej uobrane wersyje',
@@ -982,7 +1001,7 @@ $1',
 # Preferences page
 'preferences' => 'Preferyncyje',
 'mypreferences' => 'Moje preferyncyje',
-'prefs-edits' => 'Ličba sprowjyń:',
+'prefs-edits' => 'Liczba sprowjyń:',
 'prefsnologin' => 'Ńy ježeś zalůgowany',
 'prefsnologintext' => 'Muśiš śe <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} zalůgować]</span> coby štalować swoje preferyncyje.',
 'changepassword' => 'Zmjana hasua',
@@ -992,19 +1011,22 @@ $1',
 'prefs-beta' => 'Testowe funkcyje',
 'prefs-datetime' => 'Data a czas',
 'prefs-labs' => 'Funkcyje "labs"',
+'prefs-user-pages' => 'Zajty używaczy',
 'prefs-personal' => 'Dane užytkowńika',
 'prefs-rc' => 'Ńydowno pomjyńane',
 'prefs-watchlist' => 'Pozůrlista',
 'prefs-watchlist-days' => 'Ličba dńi widočnych na liśće artikli, na kere dowoš pozůr:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Max $1 {{PLURAL:$1|dźień|dńi}}',
 'prefs-watchlist-edits' => 'Ličba půmjyńań pokazywanych we rozšyřůnyj liśće artiklůw, na kere dowoš pozůr:',
 'prefs-watchlist-edits-max' => 'Maksymalno liczba: 1000',
 'prefs-watchlist-token' => 'ID půzorlisty:',
 'prefs-misc' => 'Roztůmajte',
 'prefs-resetpass' => 'Zmjyń hasło',
+'prefs-changeemail' => 'Pomjyno ausdruka e-brif',
+'prefs-setemail' => 'Nastow e-brif',
 'prefs-email' => 'E-brif',
 'prefs-rendering' => 'Wyglůnd',
-'saveprefs' => 'Naškryflej',
+'saveprefs' => 'Spamjyntej',
 'resetprefs' => 'Preferencyje důmyślne',
 'restoreprefs' => 'Wćep wszyjskie důmyślne preferencyje',
 'prefs-editing' => 'Sprowjańy',
@@ -1046,19 +1068,23 @@ $1',
 'youremail' => 'E-brif:',
 'username' => 'Mjano użytkowńika:',
 'uid' => 'ID užytkowńika:',
-'prefs-memberingroups' => 'Naležy do {{PLURAL:$1|grupy|grup:}}',
+'prefs-memberingroups' => 'Należy do {{PLURAL:$1|grupy|grup:}}',
+'prefs-registration' => 'Czas twůrzyńa kůnta:',
 'yourrealname' => 'Prawdźiwe mjano',
 'yourlanguage' => 'Godka interfejsu',
 'yournick' => 'Twoja šrajba:',
 'badsig' => 'Felerno šrajba, sprowdź značńiki HTML.',
-'badsiglength' => 'Twůj šrajbůng je za dugi. Maksymalno jego dugość to $1 {{PLURAL:$1|buchštaby|buchštabůw}}',
+'badsiglength' => 'Twůj szrajbůng je za dugi. Maksymalno jego dugość to $1 {{PLURAL:$1|buchsztaby|buchsztabůw}}',
+'yourgender' => 'Płeć',
+'gender-unknown' => 'ńyznana',
 'gender-male' => 'chop',
 'gender-female' => 'baba',
 'email' => 'E-brif',
-'prefs-help-realname' => '* Mjano a nazwisko (uopcjůnalÅ\84y): jak Å¾eÅ\9b zdecydowou aže je podoÅ¡, bydům užyte, coby Twoja robota mjoua atrybucyjo.',
+'prefs-help-realname' => '* Mjano a nazwisko (uopcjůnalÅ\84y): jak Å¼eÅ\9b zdecydowoÅ\82 aże je podosz, bydům użyte, coby Twoja robota mjoÅ\82a atrybucyjo.',
 'prefs-help-email' => 'Ukozańy e-brifowygo adresu ńy je powinne, nale nutne, coby resetować ausdruk, eli zapomńisz.',
 'prefs-help-email-others' => 'Mogesz tyż uůmożnić inkszym używoczům posłać ci e-brif bez twojo zajta używocza abo zajta dyskusyje. Twůj e-brifowy adres śe ńy ukoże.',
 'prefs-help-email-required' => 'Wymogany je adres e-brifa.',
+'prefs-diffs' => 'Diffy',
 
 # User rights
 'userrights' => 'Zařůndzańy prowami užytkowńikůw',
@@ -1077,29 +1103,29 @@ $1',
 'userrights-no-interwiki' => 'Ńy moš dostympu do sprowjańo uprawńyń.',
 'userrights-nodatabase' => 'Baza danych $1 ńy istńije abo ńy je lokalno.',
 'userrights-nologin' => 'Muśiš [[Special:UserLogin|zalůgować śe]] na kůnto admińistratora, coby nadować uprawńyńo užytkowńikům.',
-'userrights-notallowed' => 'Ńy moš dostympu do nadawańo uprawńyń užytkowńikům.',
+'userrights-notallowed' => 'Ńy mosz dostympu do nadawańo uprawńyń używaczom.',
 'userrights-changeable-col' => 'Grupy, kere možeš wybrać',
 'userrights-unchangeable-col' => 'Grupy, kerych ńy možeš wybrać',
 
 # Groups
 'group' => 'Grupa:',
-'group-user' => 'UžytkowÅ\84iki',
-'group-autoconfirmed' => 'Autůmatyčńy zatwjerdzůne užytkowńiki',
+'group-user' => 'Używacze',
+'group-autoconfirmed' => 'Autůmatyczńy zatwjerdzůne używacze',
 'group-bot' => 'Boty',
 'group-sysop' => 'Admińi',
 'group-bureaucrat' => 'Bjurokraty',
 'group-suppress' => 'Rewizoře',
 'group-all' => '(wšyjscy)',
 
-'group-user-member' => 'Sprowjorz',
-'group-autoconfirmed-member' => 'Autůmatyčńy zatwjerdzůny užytkowńik',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Admin',
-'group-bureaucrat-member' => 'Bjurokrata',
-'group-suppress-member' => 'Rewizůr',
+'group-user-member' => '{{GENDER:$1|używacz}}',
+'group-autoconfirmed-member' => 'Autůmatyczńy zatwjerdzůny używacz',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|admin}}',
+'group-bureaucrat-member' => '{{GENDER:$1|bjurokrata}}',
+'group-suppress-member' => '{{GENDER:$1|rewizůr}}',
 
 'grouppage-user' => '{{ns:project}}:Sprowjorze',
-'grouppage-autoconfirmed' => '{{ns:project}}:Autůmatyčńy zatwjerdzyńi užytkowńiki',
+'grouppage-autoconfirmed' => '{{ns:project}}:Autůmatyczńy zatwjerdzyńi używacze',
 'grouppage-bot' => '{{ns:project}}:Boty',
 'grouppage-sysop' => '{{ns:project}}:Admińistratory',
 'grouppage-bureaucrat' => '{{ns:project}}:Bjurokraty',
@@ -1113,8 +1139,9 @@ $1',
 'right-createaccount' => 'Utwořůne nowe kůnta užytkowńikůw',
 'right-minoredit' => 'Uoznoč půmjyńańo kej drobne',
 'right-move' => 'Přećepane zajty',
-'right-move-subpages' => 'Přećep zajty wroz s jejich podzajtůma',
+'right-move-subpages' => 'Przećep zajty wroz s jejich podzajtůma',
 'right-move-rootuserpages' => 'Překludzańy zajtůw uod užytkowńikůw',
+'right-movefile' => 'Przećepańe plikůw',
 'right-suppressredirect' => 'Ńy twůrz przekerowańo ze starygo mjana jak przećepujesz zajta',
 'right-upload' => 'Wćepane pliki',
 'right-reupload' => 'Nadpisuj pliki kere sam juž sům wćepane',
@@ -1176,6 +1203,7 @@ $1',
 'action-move' => 'přećepańe tyj zajty',
 'action-move-subpages' => 'přećepańo tyj zajty uoroz s jeij podzajtůma',
 'action-move-rootuserpages' => 'Překludzańy zajtůw uod užytkowńikůw (nale bes jeich podzajtůw)',
+'action-movefile' => 'przećepańe tygo plika',
 'action-upload' => 'wćepńyńćo tygo plika',
 'action-reupload' => 'nadpisańo tygo plika',
 'action-reupload-shared' => 'nadpisańo tygo plika we wspůlnym repozytorjům',
@@ -1204,7 +1232,7 @@ $1',
 'nchanges' => '$1 {{PLURAL:$1|pomjyńańe|pomjyńańa|pomjyńań}}',
 'recentchanges' => 'Ńydowno půmjyńane',
 'recentchanges-legend' => 'Uopcyje ńydowno půmjyńanych',
-'recentchanges-summary' => 'Ta zajta předstawjo historyjo uostatńich půmjyńań na tyj wiki',
+'recentchanges-summary' => 'Ta zajta ukozuje gyszichta uostatńich půmjyńań na tyj wiki.',
 'recentchanges-feed-description' => 'Dowej pozůr na půmjyńane na uostatku na tyj wiki.',
 'recentchanges-label-newpage' => 'Tym sprowjyńym stworzůno nowa zajta',
 'recentchanges-label-minor' => 'To je ńywjelge sprowjyńy',
@@ -1284,20 +1312,23 @@ Přelyź na zajta [[Special:NewFiles|galeryje nowych plikůw]], coby uobejzdře
 'filetype-unwanted-type' => "'''\".\$1\"''' ńy je zalecanym typym plika. Preferowane sům pliki we {{PLURAL:\$3|formaće|formatach}} \$2.",
 'filetype-banned-type' => "'''\".\$1\"''' je ńydozwolůnym typym plika. Dopuščalne sům pliki we {{PLURAL:\$3|formaće|formatach}} \$2.",
 'filetype-missing' => 'Plik ńy mo rozšyřyńo (np. ".jpg").',
+'empty-file' => 'Plik kery wćepałżeś je pusty.',
+'file-too-large' => 'Plik kery wćepałżeś je za srogi.',
+'filename-tooshort' => 'Mjano plika je za krůtkje.',
 'large-file' => 'Zaleco śe coby rozmjar plika ńy bůu wjynkšy jak $1 bajtůw. Tyn plik mo rozmjar $2 bajtůw.',
 'largefileserver' => 'Plik je wjynkšy ńiž maksymalny dozwolůny rozmjar.',
 'emptyfile' => 'Wćepywany plik cheba je pusty. Može to być bez tůž, co žeś wklepou zuo buchštaba w jygo mjańe. Sprowdź, čy mjano kere žeś wklepou je poprawne.',
-'fileexists' => "Plik uo takym mjańe juž je sam wćepany! Wćepańe nowyj grafiki ńyodwracalńe wyćepńe ta kero sam juž je wćepano ('''<tt>[[:$1]]</tt>''')! Sprowdź čy žeś je pewny co chceš tyn plik sam wćepać.
-[[$1|thumb]]",
-'filepageexists' => "Je juž sam zajta uopisu tygo plika utwořůno '''<tt>[[:$1]]</tt>''', ino ńy ma terozki plika uo tym mjańy. Informacyje uo pliku, kere žeś wćepou, ńy bydům pokozane na zajće uopisu. Jakbyś chćou coby te informacyje zostouy pokozane, muśyš jeich sprowjać rynčńy.",
-'fileexists-extension' => "Plik uo podobnym mjańe juž sam je: [[$2|thumb]]
-* Mjano wćepywanygo plika: '''<tt>[[:$1]]</tt>'''
-* Mjano plika kery juž sam je: '''<tt>[[:$2]]</tt>'''
-Wybjer proša inkše mjano.",
+'fileexists' => 'Plik uo takym mjańe juž je sam wćepany! Wćepańe nowyj grafiki ńyodwracalńe wyćepńe ta kero sam juž je wćepano (<strong>[[:$1]]</strong>)! Sprowdź čy žeś je pewny co chceš tyn plik sam wćepać.
+[[$1|thumb]]',
+'filepageexists' => 'Je juž sam zajta uopisu tygo plika utwořůno <strong>[[:$1]]</strong>, ino ńy ma terozki plika uo tym mjańy. Informacyje uo pliku, kere žeś wćepou, ńy bydům pokozane na zajće uopisu. Jakbyś chćou coby te informacyje zostouy pokozane, muśyš jeich sprowjać rynčńy.',
+'fileexists-extension' => 'Plik uo podobnym mjańe juž sam je: [[$2|thumb]]
+* Mjano wćepywanygo plika: <strong>[[:$1]]</strong>
+* Mjano plika kery juž sam je: <strong>[[:$2]]</strong>
+Wybjer proša inkše mjano.',
 'fileexists-thumbnail-yes' => "Zdowo śe co tyn plik je půmńijšůnům wersyjom grafiki ''(mińjaturkom)''. [[$1|thumb]]
-Uobejřij plik: '''<tt>[[:$1]]</tt>'''.
+Uobejřij plik: <strong>[[:$1]]</strong>.
 Jak to je ta sama grafika, ino wjelgo, ńy muśiš juž jei sam zaś wćepywać.",
-'file-thumbnail-no' => "Mjano plika začyno śe uod '''<tt>$1</tt>'''. Zdowo śe, co to je půmńijšůna grafika ''(mińaturka)''.
+'file-thumbnail-no' => "Mjano plika začyno śe uod <strong>$1</strong>. Zdowo śe, co to je půmńijšůna grafika ''(mińaturka)''.
 Jak moš ta grafika we peunym rozmjaře - wćepej ja sam.
 Jak chceš wćepać ta, bydźeš muśou zmjyńić mjano wćepywanygo terozki plika.",
 'fileexists-forbidden' => 'Plik uo takym mjańy juž sům můmy! Idź nazod i wćepej tyn plik pod inkšym mjanym. [[File:$1|thumb|center|$1]]',
@@ -1306,13 +1337,14 @@ Idź nazod i wćepej tyn plik pod inkšym mjanym. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Tyn plik je kopjům {{PLURAL:$1|plika|nastypujůncych plikůw:}}',
 'file-deleted-duplicate' => 'Identyczny plik jak tyn plik ([[:$1]]) zostoł wyćepany. Sprowdź historyja wyćepań tamtygo plika ńim wćepńesz go nazod.',
 'uploadwarning' => 'Uostřežyńe uo wćepywańu',
-'savefile' => 'Naškryflej plik',
+'savefile' => 'Spamjyntej plik',
 'uploadedimage' => 'wćepano "[[$1]]"',
-'overwroteimage' => 'wćepano nowšo wersyjo "[[$1]]"',
+'overwroteimage' => 'wćepano nowszo wersyjo "[[$1]]"',
 'uploaddisabled' => 'Wćepywanie sam plikůw je zawarte',
 'uploaddisabledtext' => 'Wćepywańe plikůw je zawarte.',
 'uploadscripted' => 'Tyn plik zawjyro kod HTML abo skrypt kery može zostać felerńe zinterpretowany bez přyglůndarka internetowo.',
 'uploadvirus' => 'W tym pliku je wirus! Ščygůuy: $1',
+'upload-source' => 'Plik zdrzůdłowy',
 'sourcefilename' => 'Mjano oryginalne:',
 'destfilename' => 'Mjano docylowe:',
 'upload-maxfilesize' => 'Maksymalny rozmior plika: $1',
@@ -1404,14 +1436,14 @@ Niżyj sům informacyje ze [$2 zajty popisu] tygo pliku.',
 'filedelete-nofile-old' => "Ńy ma sam zarchiwizowanyj wersje '''$1''' o atrybutach jake žeś podou.",
 'filedelete-otherreason' => 'Inkšy powůd:',
 'filedelete-reason-otherlist' => 'Inkszy powůd',
-'filedelete-reason-dropdown' => '* Nojčynstše powody wyćepańa
-** Narušyńy praw autorskych
-** Kopja plika kery juž sam jest',
+'filedelete-reason-dropdown' => '* Nojczynstsze powody wyćepańa
+** Naruszyńy praw autorskych
+** Kopja plika kery już sam jest',
 'filedelete-edit-reasonlist' => 'Sprowjańe powodůw wyćepańo zajty',
 
 # MIME search
 'mimesearch' => 'Sznupej MIME',
-'mimesearch-summary' => 'Ta zajta ůmožliwjo šnupańe za plikůma wedle jeich typu MIME. Užyće: typtreśći/podtyp, np. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Ta zajta ůmožliwjo šnupańe za plikůma wedle jeich typu MIME. Užyće: typtreśći/podtyp, np. <code>image/jpeg</code>.',
 'mimetype' => 'Typ MIME:',
 'download' => 'pobier',
 
@@ -1545,7 +1577,7 @@ Zajta uznawano je za ujydnoznačńajůnco kej zawiyro šablůn uokreślůny we [
 'specialloguserlabel' => 'Užytkowńik:',
 'speciallogtitlelabel' => 'Titel:',
 'log' => 'Register dźołano',
-'all-logs-page' => 'Wšyjstkie uoperacyje',
+'all-logs-page' => 'Wszyjstke uoperacyje',
 'alllogstext' => 'Wspůlny rejer wszyjstkych typůw uoperacyji do {{SITENAME}}.
 Możesz zawyńźić liczba wyńikůw wybjerajůnc typ rejeru, mjano użytkowńika abo titel zajty (wjelge a mołe buchsztaby majům znoczyńy).',
 'logempty' => 'Ńy ma wpisůw we rejeře',
@@ -1558,15 +1590,16 @@ Możesz zawyńźić liczba wyńikůw wybjerajůnc typ rejeru, mjano użytkowńik
 'prevpage' => 'Popředńo zajta ($1)',
 'allpagesfrom' => 'Zajty začynojůnce śe na:',
 'allpagesto' => 'Zajty uo titlach kere na zadku majům:',
-'allarticles' => 'Wšyskie zajty',
-'allinnamespace' => 'Wšyjstke zajty (we přestřyńi mjan $1)',
-'allnotinnamespace' => 'Wšyjstke zajty (ino bes přestřyńi mjan $1)',
-'allpagesprev' => 'Popředńo',
+'allarticles' => 'Wszyske zajty',
+'allinnamespace' => 'Wszyjstke zajty (we przestrzyńi mjan $1)',
+'allnotinnamespace' => 'Wszyjstke zajty (ino bes przestrzyńi mjan $1)',
+'allpagesprev' => 'Poprzedńo',
 'allpagesnext' => 'Nastympno',
 'allpagessubmit' => 'Ukoż',
-'allpagesprefix' => 'Pokož artikle s prefiksym:',
-'allpagesbadtitle' => 'Podane mjano je felerne, zawjera prefiks mjyndzyprojektowy abo mjyndzyjynzykowy. Može uůne tyž zawjerać jako buchštaba abo inkše znaki, kerych ńy wolno užywać we titlach.',
-'allpages-bad-ns' => '{{GRAMMAR:MS.lp|{{SITENAME}}}} ńy mo přestřyńi mjan „$1”.',
+'allpagesprefix' => 'Ukoż artikle s prefiksym:',
+'allpagesbadtitle' => 'Podane mjano je felerne, zawjera prefiks mjyndzyprojektowy abo mjyndzyjynzykowy. Może uůne tyż zawjerać jako buchsztaba abo inksze znaki, kerych ńy wolno używać we mjanach.',
+'allpages-bad-ns' => '{{GRAMMAR:MS.lp|{{SITENAME}}}} ńy mo przestrzyńi mjan „$1”.',
+'allpages-hide-redirects' => 'Ukoż pukńyńća',
 
 # Special:Categories
 'categories' => 'Kategoryje',
@@ -1587,7 +1620,7 @@ Kukńij tyż [[Special:WantedCategories|ńyistńyjůnce kategoryje]].',
 'linksearch-ns' => 'Przestrzyń mjan',
 'linksearch-ok' => 'Šnupej',
 'linksearch-text' => 'Idźe użyć symbola wjeloznacznygo „*”. Lů bajszpila „*.wikipedia.org” spowoduje sznupańy za wszyjstkimi linkůma kere prowadzům ku důmyńy „wikipedia.org” a jeij poddůmyn.<br />
-Uobsůgiwane protokoły: <tt>$1</tt>',
+Uobsůgiwane protokoły: <code>$1</code>',
 'linksearch-line' => '$1 link na zajće $2',
 'linksearch-error' => 'Symbola wjeloznacznygo idźe użyć yno na anfangu mjana hosta.',
 
@@ -1596,22 +1629,30 @@ Uobsůgiwane protokoły: <tt>$1</tt>',
 '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:Log/newusers
 'newuserlogpage' => 'Nowe użytkowniki',
 'newuserlogpagetext' => 'To je rejer uostatńo utworzůnych kůnt użytkowńikůw',
 
 # Special:ListGroupRights
-'listgrouprights' => 'UprawÅ\84\84o grup užytkowńikůw',
+'listgrouprights' => 'UprawÅ\84\84o 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.
 Sprowdź zajta [[{{MediaWiki:Listgrouprights-helppage}}|s dodatkowymi informacjami]] uo uprowńyńach użytkowńikůw.',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">Dane uprawńyńy</span>
+* <span class="listgrouprights-revoked">Uodebrane uprawńyńy</span>',
 'listgrouprights-group' => 'Grupa',
 'listgrouprights-rights' => 'Uprawńyńo',
-'listgrouprights-helppage' => 'Help:UprawÅ\84\84o grup užytkowńikůw',
-'listgrouprights-members' => '(lista čuůnkůw grupy)',
+'listgrouprights-helppage' => 'Help:UprawÅ\84\84o grup użytkowńikůw',
+'listgrouprights-members' => '(listo człůnkůw grupy)',
 'listgrouprights-addgroup' => 'Idźe dodać do {{PLURAL:$2|grupy|grup}}: $1',
 'listgrouprights-removegroup' => 'Idźe wyćepać s {{PLURAL:$2|grupy|grup}}: $1',
 'listgrouprights-addgroup-all' => 'Idźe dodać do kożdyj grupy',
 'listgrouprights-removegroup-all' => 'Idźe wyćepać s wszyjstkich grup',
+'listgrouprights-addgroup-self' => 'Je mogebny dać swe konto do {{PLURAL:$2|grupy|grup:}} $1',
 
 # E-mail user
 'mailnologin' => 'Brak adresu',
@@ -1621,9 +1662,15 @@ Sprowdź zajta [[{{MediaWiki:Listgrouprights-helppage}}|s dodatkowymi informacja
 'emailpagetext' => 'Możesz użyć půńiższygo formularza, coby wysłać wjadůmość e-brif do tygo użytkowńika.
 Adres e-brifa, kery zostoł bez Ćebje wkludzůny we [[Special:Preferences|Twojich sztalowańach]], pojawi śe we polu „Uod”, bez cůż uodbjorca bydźe můg Ći uodpedźeć.',
 'usermailererror' => 'Moduu uobsůgi počty zwrůćiu feler:',
-'defemailsubject' => 'Wjadůmość uod {{GRAMMAR:D.pl|{{SITENAME}}}}',
+'defemailsubject' => '{{SITENAME}} - e-brif uod używacza "$1"',
+'usermaildisabled' => 'E-brif używacza ńy załůnczony',
 'noemailtitle' => 'Brak adresu e-brif',
-'noemailtext' => 'Tyn užytkowńik ńy podou poprawnygo adresu e-brif, albo zadecydowou, co ńy chce uotřimywać wjadůmośći e-brif uod inkšych užytkowńikůw',
+'noemailtext' => 'Tyn używacz ńy podoł dobrygo e-brifa, abo zadecydowoł, co ńy chce uotrzimywać wjadůmośći e-brif uod inkszych używaczy.',
+'nowikiemailtitle' => 'E-brify ńyzwolone',
+'nowikiemailtext' => 'Tyn sprowjorz ńy chcy e-brifůw uod inkszych używaczy.',
+'emailtarget' => 'Podej adresata',
+'emailusername' => 'Mjano używacza:',
+'emailusernamesubmit' => 'Poślij',
 'email-legend' => 'Wyślij e-brif ku inkszymu użytkowńikowi {{GRAMMAR:MS.lp|{{SITENAME}}}}',
 'emailfrom' => 'Uod:',
 'emailto' => 'Ku:',
@@ -1724,9 +1771,9 @@ Pomoc:
 'deletecomment' => 'Čymu:',
 'deleteotherreason' => 'Inkšy powůd:',
 'deletereasonotherlist' => 'Inkszy powůd',
-'deletereason-dropdown' => '* Nojčynstše přičyny wyćepańa
+'deletereason-dropdown' => '* Nojczynstsze prziczyny wyćepańa
 ** Prośba autora
-** Narušyńy praw autorskych
+** Naruszyńy praw autorskych
 ** Wandalizm',
 'delete-edit-reasonlist' => 'Sprowjańe listy powodůw wyćepańo zajty',
 'delete-toobig' => 'Ta zajta mo fest dugo historyja sprowjyń, wjyncyj jak $1 {{PLURAL:$1|půmjyńańy|půmjyńańo|půmjyńań}}.
@@ -1903,7 +1950,7 @@ $1',
 'nolinkshere' => "Žodno zajta ńy je adrésowana do '''[[:$1]]'''.",
 'nolinkshere-ns' => "Žodno zajta ńy je adresowano do '''[[:$1]]''' we wybrany přestřyni mjan.",
 'isredirect' => 'překerowujůnca zajta',
-'istemplate' => 'douůnčona šablôna',
+'istemplate' => 'dołůnczony muster',
 'isimage' => 'Link do plika',
 'whatlinkshere-prev' => '{{PLURAL:$1|popředńe|popředńe $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|nastympne|nastympne $1}}',
@@ -2033,18 +2080,18 @@ Zawjerańy i uodmykańy bazy danych wymogo coby plik můgu być naškreflany bez
 # Move page
 'move-page' => 'Przećep $1',
 'move-page-legend' => 'Přećiś artikel',
-'movepagetext' => "Při půmocy formulařa půńižej možeš půmjyńyć nazwa zajty i přećepnůńć jei historja. Pod downym titlym uostańe zajta překerowujůnca. Zajty adresowane na stary titel uostanům jak bůuy.
+'movepagetext' => "Przi půmocy formularza půńiżej możesz půmjyńyć mjano zajty i przećepnůńć jej gyszichta. Pod downym mjanym uostańe śa zajta przekerowujůnca. Zajty adresowane na stare mjano uostanům jak bůły.
 
-Jak śe na to decyduješ, sprowdź, eli ńy je to [[Special:DoubleRedirects|podwůjne]] abo [[Special:BrokenRedirects|zuomane překerowańy]].
-Uodpowjadoš za to, coby linki wjoduy ku prawiduowym artiklům!
+Jak śe na to decydujesz, sprowdź, eli ńy je to [[Special:DoubleRedirects|podwůjne]] abo [[Special:BrokenRedirects|złomane przekerowańy]].
+Uodpowjadosz za to, coby linki wjodły ku prawym artiklům!
 
-Zajta '''ńy''' bydźe přećepano, jak:
-*je pusto i ńy bůua sprowjano
-*je zajtům překerowujůncą
-*zajta uo takym titlu juž sam jest
+Zajta '''ńy''' bydźe przećepano, jak:
+*je pusto i ńy bůła sprowjano
+*je zajtům przekerowujůncą
+*zajta uo takym mjane już sam je
 
 '''DEJ POZŮR!'''
-To može byÄ\87 drastyÄ\8dno abo i Å\84ypÅ\99ewidywalno zmjano, jak pÅ\99\87epÅ\84yÅ¡ jako popularno zajta. Bydź pewny, aže wjeÅ¡ co robiyÅ¡, Å\84im klikÅ\84yÅ¡ knefel \"pÅ\99ećep\"!",
+To może byÄ\87 drastyczno abo Å\84yprzewidywalno zmjano, jak przeÄ\87epÅ\84ysz jako popularno zajta. Bydź pewny, aże wjesz co robiysz, Å\84im klikÅ\84ysz knefel \"przećep\"!",
 'movepagetalktext' => 'Uodpowiednio zajta godki, jeśli jest, bydzie přećepano automatyčńe, pod warůnkiem, že:
 *ńy přećepuješ zajty do inkšy přestřeńy mjan
 *ńy ma sam zajty godki o takiym mjańe
@@ -2072,7 +2119,7 @@ Wybjer inkše mjano.',
 'movepage-page-moved' => 'Zajta $1 uostoła przekludzůno ku $2.',
 'movepage-page-unmoved' => 'Mjana zajty $1 ńy idźe půmjyńić na $2.',
 'movepage-max-pages' => 'Przekludzůnych uostało $1 {{PLURAL:$1|zajta|zajty|zajtůw}}. Wjynkszyj liczby ńy idźe przekludźić automatyczńy.',
-'movelogpage' => 'Přećepńynte',
+'movelogpage' => 'Przećepńynte',
 'movelogpagetext' => 'Uoto lista zajtůw, kere uostatńo zostouy přećepane.',
 'movereason' => 'Čymu:',
 'revertmove' => 'cofej',
@@ -2779,7 +2826,7 @@ Naškryflej sam mjano plika bez prefiksu „{{ns:file}}:”.',
 'specialpages-group-login' => 'Lůgowańy / rejerowańy',
 'specialpages-group-changes' => 'Pomjyńane na uostatku a rejery',
 'specialpages-group-media' => 'Pliki',
-'specialpages-group-users' => 'Užytkowńiki i uprawńyńa',
+'specialpages-group-users' => 'Użytkowńiki i uprawńyńa',
 'specialpages-group-highuse' => 'Zajty čynsto užywane',
 'specialpages-group-pages' => 'Zajty',
 'specialpages-group-pagetools' => 'Nořyńdźa zajtůw',
index 5c6f837..8b704d3 100644 (file)
@@ -8,6 +8,8 @@
  * @file
  *
  * @author Aswn
+ * @author Balajijagadesh
+ * @author Caliberoviv
  * @author Kaganer
  * @author Kanags
  * @author Karthi.dr
@@ -59,19 +61,19 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#வழிமாற்று', '#REDIRECT' ),
-       'img_right'               => array( '1', 'வலது', 'right' ),
-       'img_left'                => array( '1', 'இடது', 'left' ),
-       'img_none'                => array( '1', 'ஒன்றுமில்லை', 'none' ),
-       'img_center'              => array( '1', 'மையம்', 'center', 'centre' ),
-       'img_top'                 => array( '1', 'மேல்', 'top' ),
-       'img_middle'              => array( '1', 'மத்தியில்', 'middle' ),
-       'img_bottom'              => array( '1', 'கீழ்', 'bottom' ),
-       'plural'                  => array( '0', 'பன்மை', 'PLURAL:' ),
-       'special'                 => array( '0', 'சிறப்பு', 'special' ),
-       'pagesize'                => array( '1', 'பக்க_அளவு', 'PAGESIZE' ),
-       'url_path'                => array( '0', 'வழி', 'PATH' ),
-       'url_wiki'                => array( '0', 'விக்கி', 'WIKI' ),
+       'redirect'                  => array( '0', '#வழிமாற்று', '#REDIRECT' ),
+       'img_right'                 => array( '1', 'வலது', 'right' ),
+       'img_left'                  => array( '1', 'இடது', 'left' ),
+       'img_none'                  => array( '1', 'ஒன்றுமில்லை', 'none' ),
+       'img_center'                => array( '1', 'மையம்', 'center', 'centre' ),
+       'img_top'                   => array( '1', 'மேல்', 'top' ),
+       'img_middle'                => array( '1', 'மத்தியில்', 'middle' ),
+       'img_bottom'                => array( '1', 'கீழ்', 'bottom' ),
+       'plural'                    => array( '0', 'பன்மை', 'PLURAL:' ),
+       'special'                   => array( '0', 'சிறப்பு', 'special' ),
+       'pagesize'                  => array( '1', 'பக்க_அளவு', 'PAGESIZE' ),
+       'url_path'                  => array( '0', 'வழி', 'PATH' ),
+       'url_wiki'                  => array( '0', 'விக்கி', 'WIKI' ),
 );
 
 $linkTrail = "/^([\xE0\xAE\x80-\xE0\xAF\xBF]+)(.*)$/sDu";
@@ -86,7 +88,7 @@ $messages = array(
 'tog-hidepatrolled' => 'அண்மைய மாற்றங்களில் பலமுறை பார்வையிட்ட தொகுப்புகளை மறைக்கவும்',
 'tog-newpageshidepatrolled' => 'பலமுறை பார்வையிட்ட பக்கங்களைப் புதியபக்கங்களின் பட்டியலில் காட்டவேண்டாம்.',
 'tog-extendwatchlist' => 'அனைத்து பொருத்தமான மாற்றங்களைக் காட்டுமாறு கவனிப்புப் பட்டியலை விரிவாக்கு',
-'tog-usenewrc' => 'à®®à¯\87à®®à¯\8dபà®\9fà¯\81தà¯\8dதபà¯\8dபà®\9fà¯\8dà®\9f à®\85ணà¯\8dà®®à¯\88ய à®®à®¾à®±à¯\8dà®±à®\99à¯\8dà®\95ளà¯\8d (ஜாவாஸ்கிரிப்ட் தேவை)',
+'tog-usenewrc' => 'à®\85ணà¯\8dà®®à¯\88ய à®®à®¾à®±à¯\8dà®±à®\99à¯\8dà®\95ளà¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலà¯\8d à®ªà®\95à¯\8dà®\95தà¯\8dதிலà¯\8d à®®à®¾à®±à¯\8dà®±à®\99à¯\8dà®\95ளà¯\88 à®ªà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®ªà¯\8aà®±à¯\81தà¯\8dதà¯\81 à®\95à¯\81à®´à¯\81வாà®\95à¯\8dà®\95à¯\81 (ஜாவாஸ்கிரிப்ட் தேவை)',
 'tog-numberheadings' => 'தலைப்புகளுக்கு தானியங்கி இலக்கமிடு',
 'tog-showtoolbar' => 'கருவிப் பட்டையைக் காட்டு (ஜாவாஸ்கிரிப்ட் தேவை)',
 'tog-editondblclick' => 'இரட்டைச் சொடுக்கில் பக்கங்களைத் தொகு (ஜாவாஸ்கிரிப்ட் தேவை)',
@@ -94,17 +96,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'பிரிவுத் தலைப்பின் மீது வலச் சொடுக்குவதன் மூலம் பகுதித்  தொகுப்பை செயலாக்கவும் (ஜாவாஸ்கிரிப்ட் தேவை )',
 'tog-showtoc' => 'பொருளடக்க பட்டியலைக் காண்பி (மூன்றுக்கு மேற்பட்ட தலைப்புகளையுடைய கட்டுரைகளுக்கு)',
 'tog-rememberpassword' => 'எனது புகுபதிகை பற்றிய விவரங்களை இவ்வுலாவியில் (மிக அதிகமாக $1 {{PLURAL:$1|நாள்|நாட்கள்}}) வரை நினைவில் வைத்திருக்கவும்.',
-'tog-watchcreations' => 'நான் உருவாக்கும் பக்கங்களை எனது கவனிப்புப் பட்டியலில் சேர்க்கவும்.',
-'tog-watchdefault' => 'நான் தொகுக்கும் பக்கங்களை என் கவனிப்புப் பட்டியலில் சேர்',
-'tog-watchmoves' => 'நான் நகர்த்தும் பக்கங்களை என் கவனிப்புப் பட்டியலில் சேர்.',
-'tog-watchdeletion' => 'நான் நீக்கும் பக்கங்களை என் கவனிப்புப் பட்டியலில் சேர்',
+'tog-watchcreations' => 'நானà¯\8d à®\89à®°à¯\81வாà®\95à¯\8dà®\95à¯\81à®®à¯\8d à®ªà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®ªà®¤à®¿à®µà¯\87à®±à¯\8dà®±à¯\81à®®à¯\8d à®\95à¯\8bபà¯\8dபà¯\81à®\95ளà¯\88 à®\8eனதà¯\81 à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலிலà¯\8d à®\9aà¯\87à®°à¯\8dà®\95à¯\8dà®\95வà¯\81à®®à¯\8d.',
+'tog-watchdefault' => 'நானà¯\8d à®¤à¯\8aà®\95à¯\81à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®ªà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®\95à¯\8bபà¯\8dபà¯\81à®\95ளà¯\88 à®\8eனà¯\8d à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலிலà¯\8d à®\9aà¯\87à®°à¯\8d',
+'tog-watchmoves' => 'நானà¯\8d à®¨à®\95à®°à¯\8dதà¯\8dதà¯\81à®®à¯\8d à®ªà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®\95à¯\8bபà¯\8dபà¯\81à®\95ளà¯\88 à®\8eனà¯\8d à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலிலà¯\8d à®\9aà¯\87à®°à¯\8d.',
+'tog-watchdeletion' => 'நானà¯\8d à®¨à¯\80à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®ªà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®\95à¯\8bபà¯\8dபà¯\81à®\95ளà¯\88 à®\8eனà¯\8d à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலிலà¯\8d à®\9aà¯\87à®°à¯\8d',
 'tog-minordefault' => 'இயல்பிருப்பாக அனைத்து தொகுப்புகளையும் சிறியது எனக் குறித்துக்கொள்.',
 'tog-previewontop' => 'தொகுப்புப் பெட்டிக்கு முன்பு முன்தோற்றத்தைக் காட்டு',
 'tog-previewonfirst' => 'முதல் தொகுப்பில் முன்தோற்றத்தைக் காட்டு',
 'tog-nocache' => 'உலாவி பக்க இடைமாற்றை முடக்கு',
-'tog-enotifwatchlistpages' => 'நானà¯\8d à®\95வனிà®\95à¯\8dà®\95à¯\81à®®à¯\8d à®ªà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\8d மாற்றப்பட்டால் எனக்கு மின்னஞ்சல் செய்க',
+'tog-enotifwatchlistpages' => 'நானà¯\8d à®\95வனிà®\95à¯\8dà®\95à¯\81à®®à¯\8d à®ªà®\95à¯\8dà®\95à®®à¯\8d à®\85லà¯\8dலதà¯\81 à®\95à¯\8bபà¯\8dபà¯\81 மாற்றப்பட்டால் எனக்கு மின்னஞ்சல் செய்க',
 'tog-enotifusertalkpages' => 'என் பயனர் பேச்சுப் பக்கம் மாற்றப்பட்டால் எனக்கு மின்னஞ்சல் செய்',
-'tog-enotifminoredits' => 'பà®\95à¯\8dà®\95à®\99à¯\8dகளுக்கான சிறு தொகுப்புக்கள் குறித்தும் எனக்கு மின்னஞ்சல் செய்யவும்',
+'tog-enotifminoredits' => 'பà®\95à¯\8dà®\95à®®à¯\8d à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®\95à¯\8bபà¯\8dபà¯\81களுக்கான சிறு தொகுப்புக்கள் குறித்தும் எனக்கு மின்னஞ்சல் செய்யவும்',
 'tog-enotifrevealaddr' => 'அறிவித்தல் மின்னஞ்சல்களில் எனது மின்னஞ்சல் முகவரியை வெளிப்படுத்து',
 'tog-shownumberswatching' => 'கவனிக்கும் பயனர்களின் எண்ணிக்கையைக் காட்டவும்',
 'tog-oldsig' => 'நடப்பு கையொப்பம்:',
@@ -196,7 +198,7 @@ $messages = array(
 'category-empty' => "''இப்பகுப்பில் தற்போது பக்கங்களோ ஊடகங்களோ இல்லை.''",
 'hidden-categories' => '{{PLURAL:$1|மறைக்கப்பட்ட பகுப்பு|மறைக்கப்பட்ட பகுப்புகள்}}',
 'hidden-category-category' => 'மறைக்கப்பட்ட பகுப்புகள்',
-'category-subcat-count' => '{{PLURAL:$2|இந்தப் பகுப்பின் கீழ் பின்வரும் ஒரு துணைப் பகுப்பு மட்டுமே உள்ளது.|இந்தப்பகுப்பின் கீழ் உள்ள $2 துணைப் பகுப்புகளில் பின்வரும் {{PLURAL:$1|துணைப்பகுப்பும் உள்ளது.|$1 துணைப்பகுப்புகளும் உள்ளன.}}}}',
+'category-subcat-count' => '{{PLURAL:$2|இந்தப் பகுப்பின் கீழ் பின்வரும் ஒரு துணைப்பகுப்பு மட்டுமே உள்ளது.|இந்தப் பகுப்பில் மொத்தம் உள்ள $2 துணைப்பகுப்புகளில் பின்வரும் {{PLURAL:$1|துணைப்பகுப்பு உள்ளது.|$1 துணைப்பகுப்புகள் இங்கு காட்டப்பட்டுள்ளன.}}}}',
 'category-subcat-count-limited' => 'இந்தப் பகுப்பின் கீழ் பின்வரும் {{PLURAL:$1|ஒரு துணைப் பகுப்பு மட்டுமே உள்ளது.|$1 துணைப் பகுப்புகள் உள்ளன.}}',
 'category-article-count' => '{{PLURAL:$2|இந்தப் பகுப்பின் கீழ் பின்வரும் பக்கம் மட்டுமே உள்ளது.|இந்தப்பகுப்பின் கீழ் உள்ள $2 பக்கங்களில் பின்வரும் {{PLURAL:$1|பக்கமும் உள்ளது.|$1 பக்கங்களும் உள்ளன.}}}}',
 'category-article-count-limited' => 'இப்பகுப்பில் பின்வரும் {{PLURAL:$1|பக்கம்|$1 பக்கங்கள்}} உள்ள{{PLURAL:$1|து|ன}}.',
@@ -344,6 +346,8 @@ $1',
 'youhavenewmessages' => 'உங்களுக்குப் $1 உள்ளன ($2).',
 'newmessageslink' => 'புதிய செய்திகள்',
 'newmessagesdifflink' => 'கடைசி மாற்றம்',
+'newmessageslinkplural' => '{{PLURAL:$1|ஒரு புதிய செய்தி|புதிய செய்திகள்}}',
+'newmessagesdifflinkplural' => 'கடைசி {{PLURAL:$1|மாற்றம்|மாற்றங்கள்}}',
 'youhavenewmessagesmulti' => '$1 இல் உங்களுக்கு புதிய செய்திகள் காத்திருக்கின்றன',
 'editsection' => 'தொகு',
 'editold' => 'தொகு',
@@ -434,6 +438,8 @@ MySQL returned error "$3: $4".',
 'badarticleerror' => 'இச்செயற்பாட்டை இப்பக்கத்தில் செயற்படுத்த முடியாது.',
 'cannotdelete' => '"$1" பக்கத்தையோ கோப்பையோ நீக்க முடியாது. (வேறு யாராலோ ஏற்கெனவே நீக்கப்பட்டிருக்கலாம்.)',
 'cannotdelete-title' => '"$1" பக்கத்தை நீக்க முடியாது',
+'delete-hook-aborted' => 'நீக்கல்  hook ஆல் தடைசெய்யப்பட்டது.
+அது எந்த விளக்கமும் அளிக்கவில்லை.',
 'badtitle' => 'பழுதுள்ள தலைப்பு',
 'badtitletext' => 'கோரப்பட்ட பக்கத்தின் தலைப்பு செல்லாது, வெறுமை, அல்லது பிழையாக இணைக்கப்பட்ட மொழிகளிடை அல்லது விக்கியிடைத் தலைப்பாகும்.',
 'perfcached' => 'பின்வரும் தரவுகள் இடைக்கிடங்கில் உள்ளன,  தரவுகள் புதுப்பித்தநிலையில் இல்லாமல் இருக்கலாம். அதிக அளவாக  {{PLURAL:$1|ஒரு முடிவு|$1 முடிவுகள்}} இடைக்கிடங்கில் இருக்கலாம்.',
@@ -459,6 +465,11 @@ MySQL returned error "$3: $4".',
 'ns-specialprotected' => 'சிறப்புப் பக்கங்களைத் தொகுக்க முடியாது.',
 'titleprotected' => "பயனர் [[User:$1|$1]] இத்தலைப்பு உருவாக்கப்படுவதை தவிர்க்கும் வகையில் தடுத்துள்ளார்.
 கொடுக்கப்பட்டக் காரணம் ''$2''.",
+'filereadonlyerror' => '"$1" கோப்பைத் திருத்த முடியவில்லை ஏனெனில் கோப்புப் பெட்டகம் "$2" படிக்க-மட்டும் வகையில் உள்ளது. அதனை பூட்டிய நிர்வாகி பின்வரும் விளக்கத்தை அளித்துள்ளார்: "$3"',
+'invalidtitle-knownnamespace' => "பெயரிடைவெளி ' $2 '' மற்றும் உரை '' $3 '' கொன்ட தலைப்பு செல்லாது",
+'invalidtitle-unknownnamespace' => 'அறியப்படாத பெயரிடைவெளி $1 மற்றும் உரை $2 கொண்ட தலைப்பு செல்லாது',
+'exception-nologin' => 'புகுபதிகை செய்யப்படவில்லை.',
+'exception-nologin-text' => 'இந்த பக்கம் / செய்கை இந்த விக்கியில் உங்களது புகுபதிகையை எதிர்பார்க்கிறது.',
 
 # Virus scanner
 'virus-badscanner' => "சரியற்ற உள்ளமைவு: அறியப்படாத வைரஸ் வருடி: '' $1 ''",
@@ -477,6 +488,7 @@ MySQL returned error "$3: $4".',
 'remembermypassword' => 'எனது கடவுச்சொல்லை (கூடியது $1 {{PLURAL:$1|நாள்|நாட்கள்}}) அமர்வுகளிடையே நினைவில் வைத்திருக்கவும்.',
 'securelogin-stick-https' => 'புகுபதிகைக்குப் பிறகும் HTTPS-இலேயே இருக்கவும்',
 'yourdomainname' => 'உங்கள் உரிமைப்பரப்பு:',
+'password-change-forbidden' => 'நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது',
 'externaldberror' => 'வெளி உறுதிப்படுத்தலில் ஏற்பட்ட தவறு காரணமாக உங்கள் வெளி கணக்கை இற்றைப்படுத்த முடியாது.',
 'login' => 'புகுபதிகை',
 'nav-login-createaccount' => 'புகுபதிகை/பயனர் கணக்கு தொடக்கம்',
@@ -542,6 +554,7 @@ MySQL returned error "$3: $4".',
 'emailconfirmlink' => 'உங்கள் மின்னஞ்சல் முகவரியை உறுதிப்படுத்தவும்',
 'invalidemailaddress' => 'மின்னஞ்சல் முகவரி பிழையான கட்டமைப்பைக் கொண்டுள்ளப்படியால் மின்னஞ்சல் முகவரியை ஏற்றுக்கொள்ள முடியாது. தயவுசெய்து  சரியான கட்டமைப்புடன் கூடிய மின்னஞ்சல் முகவரியை இடவும் அல்லது அவ்விடத்தை வெற்றாக விடவும்.',
 'cannotchangeemail' => 'கணக்கின் மின்னஞ்சல் முகவரிகளை இந்த விக்கிஇல் மாற்ற முடியாது.',
+'emaildisabled' => 'இந்த வலைதளம் மின்அஞ்சல்களை அனுப்ப முடியாது',
 'accountcreated' => 'கணக்கு உருவாக்கப்பட்டது.',
 'accountcreatedtext' => '$1 என்ற பெயரில் பயனர் கணக்கு உருவாக்கப்பட்டது.',
 'createaccount-title' => '{{SITENAME}} தளத்துக்கான கணக்கு தொடக்கம்',
@@ -698,13 +711,14 @@ $1 பயனரையோ அல்லது வேறு [[{{MediaWiki:Grouppage
 இந்த புதிய கணக்கிற்கான கடவுச்சொல்லை புகுபதிகை செய்தவுடன் மாற்றிக்கொள்ளவும் ''[[Special:ChangePassword|கடவுச்சொல்லை மாற்று]]''.",
 'newarticle' => '(புதிது)',
 'newarticletext' => 'ஒரு இணைப்பினூடாக நீங்கள் வந்துள்ள இப்பக்கம் இன்னும் உருவாக்கப்படவில்லை. பக்கத்தை உருவாக்குவதற்குக் கீழேயுள்ள கட்டத்துள் தட்டச்சிடத் தொடங்குங்கள். (மேலதிக விபரங்களுக்கு [[{{MediaWiki:Helppage}}|உதவிப் பக்கத்தைப்]] பார்க்கவும்). நீங்கள் தவறுதலாக இங்கே வந்திருந்தால், உங்கள் உலாவியின் பின் செல்வதற்கான பொத்தானைச் சொடுக்கவும்.',
-'anontalkpagetext' => "----''தாங்கள், தமிழ் விக்கிப்பீடியாவின் பயனர் கணக்கு உருவாக்காத புதியவராகவோ அல்லது பயனர் கணக்கு உருவாக்கி, புகுபதிகை செய்ய மறந்த நிலையில் இப்பக்கத்திற்கு வந்தவராகவோ இருக்கலாம். தற்போதைய நிலையில் அடையாளம் காணமுடியாதவராக தாங்கள் இருப்பதால், தங்களைத் தாங்கள் உபயோகித்த இணைய விதிமுறை இலக்கம் (I.P.Number)கொண்டு அடையாளப்படுத்த வேண்டியுள்ளது. இந்த நிலையைத் தவிர்க்கத் தமிழ் விக்கிப்பீடியாவில் தங்களுக்கென ஒரு பயனர் பக்கத்தை உருவாக்கிக் கொள்ளலாம். இந்தப் பயனர் பக்கத்தின் உரையாடல் பக்கம் தங்களுடன் தொடர்பு கொள்வதற்கும், கருத்துப் பரிமாற்றத்திற்கும் உதவியாக இருக்கும். 
-
-தங்களுக்காக ஒரு பயனர் பக்கம் உருவாக்கிக் கொள்வது என்பது மிகவும் எளிதானது. [[Special:UserLogin/signup|இங்கு தங்களுக்கான புதிய கணக்கொன்றைத் தொடங்கி]] உங்களுக்கான பயனர் பக்கத்தை உருவாக்கிக் கொள்ள வேண்டுகிறோம், அல்லது [[Special:UserLogin|புகுபதிகை]] செய்திட வேண்டுகிறோம்.''",
+'anontalkpagetext' => "----''இது இன்னும் கணக்கொன்று ஏற்படுத்தாத அல்லது வழமையாக பயனர் கணக்கை பயன்படுத்தாத பயனர்களுக்குரிய கலந்துரையாடல் பக்கமாகும். அதனால் நாங்கள் இவரை அடையாளம் காண்பதற்கு எண்சார்ந்த ஐபி முகவரியைப் பயன்படுத்த வேண்டியதாய் இருக்கின்றது. இவ்வாறான ஐபி முகவரிகள் பல பயனர்களினால் பகிர்ந்துகொள்ளப்படலாம்.
+நீங்கள் ஒரு முகவரியற்ற பயனராயிருந்து, தொடர்பற்ற கருத்துக்கள் உங்களைக் குறித்துச் சொல்லப்பட்டிருப்பதாக நீங்கள் உணர்ந்தால், முகவரியற்ற ஏனைய பயனர்களுடனான குழப்பங்களை எதிர்காலத்தில் தவிர்ப்பதற்கு, தயவுசெய்து [[Special:UserLogin/signup|புதிய கணக்கொன்றை ஏற்படுத்துங்கள்]] அல்லது [[Special:UserLogin|புகுபதிகை]] செய்யுங்கள்.''",
 'noarticletext' => 'இப் பக்கத்தில் தற்பொழுது உள்ளடக்கம் எதுவுமில்லை. நீங்கள் இப்பக்க [[Special:Search/{{PAGENAME}}|தலைப்பை வேறு பக்கங்களில் தேடவோ]] அல்லது [{{fullurl:{{FULLPAGENAME}}|action=edit}} இப்பக்கத்தை தொகுக்கவோ] முடியும்.',
 'noarticletext-nopermission' => 'தற்பொழுது இப்பக்கத்தில் உரை எதுவும் இல்லை.
 நீங்கள் [[Special:Search/{{PAGENAME}}|பக்கத் தலைப்பை வைத்து]] அல்லது மற்ற பக்கங்களில்,
 or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} அல்லது தேடுதல் தொடர்பான பதிவுகளில் தேடவும்.]</span>.',
+'missing-revision' => "இந்த பரிசீலனை # $1  '' {{PAGENAME}}' பெயருள்ள பக்கத்தின் இல்லை.!N வேடிக்கையானN!இது தான் வழக்கமாக ஏற்பட்டிருக்கலாம் நீக்கப்பட்டுள்ளது பக்கத்திற்கு outdated வரலாறு இணைப்பை தொடர்ந்து.
+விவரங்கள் முடியும் கண்டறிய, [{{fullurl: {{# சிறப்பு: குறிப்பேடு}} / delete|page = {{FULLPAGENAMEE}}}} நீக்குதல் குறிப்பேடு].",
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" என்றக் கணக்கு இன்னமும் பதிவுச் செய்யப்படவில்லை. இதை உருவாக்க/தொகுக்க வேண்டுமா என்பதை உறுதிப்படுத்தவும்.',
 'userpage-userdoesnotexist-view' => 'பயனர் கணக்கு "$1" பதியப்படவில்லை',
 'blocked-notice-logextract' => 'இந்தப் பயனர் தற்சமயம் தடை செய்யப்பட்டுள்ளார். இவரது தடை பதிகையின் அண்மைய மாற்றம் கீழே தரப்பட்டுள்ளது:',
@@ -727,6 +741,7 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'updated' => '(இற்றைப்படுத்தப்பட்டது)',
 'note' => "'''குறிப்பு:'''",
 'previewnote' => "'''இது ஒரு முன்தோற்றம் மட்டுமே''', உங்கள் மாற்றங்கள் இன்னும் சேமிக்கப்படவில்லை!",
+'continue-editing' => 'தொகுத்தலைத் தொடரவும்',
 'previewconflict' => 'இந்த முன்தோற்றம் உரை தொகுப்புப் பகுதியின் மேற்பகுதியிலுள்ள உரையைப் பிரதிபலிக்கின்றது. நீங்கள் இப்பொழுது சேமித்தால் மேற்படி தோற்றமே கிடைக்கும்.',
 'session_fail_preview' => "'''உங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் உங்கள் தொகுப்பை செயற்படுத்த முடியவில்லை. அருள் கூர்ந்து மீண்டும் முயலவும். அதுவும் பலனளிக்காவிட்டால் விடுபதிகைச் செய்து மீண்டும் புகுபதிகைச் செய்யவும்'''",
 'session_fail_preview_html' => "'''மன்னிக்கவும்! தங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் தொகுப்பைச் செயற்படுத்த முடியவில்லை.'''
@@ -802,6 +817,7 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'edit-no-change' => 'வாசகங்களுக்கு எந்த மாற்றமும் செய்யப்படவில்லை என்பதனால் உங்கள் தொகுப்பு புறக்கணிக்கப்பட்டது.',
 'edit-already-exists' => 'புதிய பக்கமொன்றை உருவாக்க முடியாது.
 இப்பக்கம் ஏற்கனவே உள்ளது.',
+'defaultmessagetext' => 'இயல்பிருப்பு தகவல் உரை',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'எச்சரிக்கை: இப்பக்கம் அதிகளவு இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டுள்ளது.
@@ -817,6 +833,11 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'parser-template-loop-warning' => 'வார்ப்புருவின் முழுச்சுற்று உணரப்பட்டுள்ளது: [[$1]]',
 'parser-template-recursion-depth-warning' => 'வார்ப்புரு மறுநிகழ்வு (recursion) ஆழம் வரம்பை மீறிவிட்டது ( $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
 'undo-success' => "இத்தொகுப்பை மீளமைக்க முடியும். தயவு செய்து, கீழே காட்டப்பட்டுள்ள ஒப்பீட்டைப் பார்த்து, நீங்கள் செய்ய முயற்சிப்பது இதுதானா? என்பதை உறுதிப்படுத்திக் கொண்டு '''பக்கத்தைச் சேமிக்கவும்''' என்பதன் மேல் சொடுக்கவும்.",
@@ -964,7 +985,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'அடக்கல் பதிகை',
 'suppressionlogtext' => 'பின்வருவது நிர்வாகிகளிடமிருந்து மறைக்கப்பட்ட நீக்கல்களதும் தடுப்புகளதும் பட்டியலாகும்.
-நà®\9fà¯\88à®®à¯\81à®±à¯\88யிலà¯\81ளà¯\8dள à®¤à®\9fà¯\81பà¯\8dபà¯\81à®\95ளà¯\88à®\95à¯\8d à®\95ாண [[Special:BlockList|à®\90.பி. à®¤à®\9fà¯\88பà¯\8d à®ªà®\9fà¯\8dà®\9fியலà¯\88பà¯\8d]] à®ªà®¾à®°à¯\8dà®\95à¯\8dà®\95வà¯\81à®®à¯\8d',
+நடைமுறையிலுள்ள தடுப்புகளைக் காண [[Special:BlockList|தடைப் பட்டியலைப்]] பார்க்கவும்',
 
 # History merging
 'mergehistory' => 'பக்க வரலாறுகளை இணை',
@@ -995,7 +1016,9 @@ $1",
 'mergelogpagetext' => 'பின்வருவது அண்மையில் செய்யப்பட்ட பக்க வரலாறு இணைப்புகளின் பட்டியலாகும்.',
 
 # Diffs
-'history-title' => '"$1" பக்கத்தின் திருத்த வரலாறு',
+'history-title' => 'திருத்த வரலாறு - "$1"',
+'difference-title' => '"$1" பக்கத்தின் திருத்தங்களுக்கிடையேயான வேறுபாடு',
+'difference-title-multipage' => '"$1" மற்றும் "$2" பக்கங்களுக்கிடையேயான வேறுபாடு',
 'difference-multipage' => 'பக்கங்களுக்கு இடையேயான வேறுபாடு',
 'lineno' => 'வரிசை $1:',
 'compareselectedversions' => 'தெரிவு செய்யப்பட்ட பதிப்புக்களை ஒப்பிடவும்',
@@ -1094,6 +1117,7 @@ $1",
 'prefs-beta' => 'சோதனைநிலை அம்சங்கள்',
 'prefs-datetime' => 'நாள் நேரம்',
 'prefs-labs' => 'ஆய்வகச் சிறப்புக்கூறுகள்',
+'prefs-user-pages' => 'பயனர் பக்கங்கள்',
 'prefs-personal' => 'பயனர் தரவு',
 'prefs-rc' => 'அண்மைய மாற்றங்கள்',
 'prefs-watchlist' => 'கவனிப்புப் பட்டியல்',
@@ -1126,7 +1150,7 @@ $1",
 'savedprefs' => 'உங்கள் விருப்பத்தேர்வுகள் சேமிக்கப்பட்டுள்ளன.',
 'timezonelegend' => 'நேர வலயம்:',
 'localtime' => 'உள்ளூர் நேரம்:',
-'timezoneuseserverdefault' => 'வழà®\99à¯\8dà®\95னினà¯\8d à®\8eலà¯\8dலà¯\8bà®°à¯\81à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®ªà¯\8aதà¯\81வானவறà¯\8dà®±à¯\88 à®ªà®¯à®©à¯\8dபà®\9fà¯\81தà¯\8dதவà¯\81à®®à¯\8d',
+'timezoneuseserverdefault' => 'விà®\95à¯\8dà®\95ி à®\87யலà¯\8dபà¯\81நிலà¯\88யà¯\88 à®\89பயà¯\8bà®\95ிà®\95à¯\8dà®\95வà¯\81à®®à¯\8d ($1)',
 'timezoneuseoffset' => 'மற்றவை (வித்தியாசத்தைக் குறிப்பிடவும்)',
 'timezoneoffset' => 'நேர இடைவெளி¹:',
 'servertime' => 'வழங்கி நேரம்:',
@@ -1271,6 +1295,7 @@ $1",
 'right-writeapi' => 'எழுது API பயன்படுத்தவும்',
 'right-delete' => 'பக்கங்களை நீக்குக',
 'right-bigdelete' => 'பெரிய வரலாற்றைக் கொண்ட பக்கங்களை நீக்கல்',
+'right-deletelogentry' => 'குறிப்பிட்ட குறிப்பேடு உள்ளீடுகள் நீக்கியதை மீட்டல் மற்றும் நீக்குதல்',
 'right-deleterevision' => 'பக்கமொன்றின் குறித்த திருத்தங்களை நிக்கல் மீட்டல்',
 'right-deletedhistory' => 'நீக்கிய வரலாறு உள்ளீடுகளை காண்,அதனுடன் தொடர்புடைய உரை  இல்லாமல்',
 'right-deletedtext' => ' நீக்கப்பட்ட உரை மற்றும் நீக்கப்பட்ட பரிசீலனைகளுக்கு இடையேயான மாற்றங்களை காண்.',
@@ -1457,19 +1482,19 @@ $1",
 'largefileserver' => 'வழங்கி ஏற்கக்கூடிய உச்ச அளவுக் கோப்பைவிட இக்கோப்பு பெரியதாகும்.',
 'emptyfile' => 'நீங்கள் பதிவேற்றிய கோப்பு வெற்றாக உள்ளது. இது கோப்பின் பெயரை பிழையாக தட்டச்சிட்டதன் காரணமாக ஏற்பட்டிருக்கலாம்.  இக்கோப்பை நீங்கள் கட்டாயம் பதிவேற்ற வேண்டுமா என்பதை உறுதிசெய்துகொள்க.',
 'windows-nonascii-filename' => 'இந்த விக்கி சிறப்பு எழுத்துக்களை கொண்ட கோப்புபெயர்களை ஆதரிப்பதில்லை.',
-'fileexists' => "இப்பெயரைக் கொண்ட கோப்பொன்று ஏற்கனவே உள்ளது.
-அந்தக் கோப்பை மாற்றப்போகிறீர்கள் என்பதில் உங்களுக்கு நிச்சயமில்லாவிடில் அருள் கூர்ந்து '''<tt>[[:$1]]</tt>''' கோப்பை ஒரு முறை பார்க்கவும்.
-[[$1|thumb]]",
-'filepageexists' => "இக்கோப்பிற்கான விளக்கப்பக்கம் '''<tt>[[:$1]]</tt>''' பக்கத்தில் ஏற்கனவே உருவாக்கப்பட்டுள்ளது, ஆனால் இப்பெயரில் கோப்பு ஒன்றில்லை. இங்கே நீங்கள் கொடுக்கும் சுருக்கம் விளக்கப்பக்கத்தில் தானியக்கமாக இணைக்கப்பட மாட்டது. சுருக்கத்தை விளக்கப்பக்கத்தில் காணச் செய்வதற்காக அப்பக்கத்தை நேரடியாக தொகுக்க வேண்டியிருக்கும்.
-[[$1|thumb]]",
-'fileexists-extension' => "இப்பெயரைக் கொண்ட கோப்பு ஏற்கனவே உள்ளது: [[$2|thumb]]
-* பதிவேற்றப்படும் கோப்பின் பெயர்: '''<tt>[[:$1]]</tt>'''
-* ஏற்கனவே உள்ளக் கோப்பின் பெயர்: '''<tt>[[:$2]]</tt>'''
-அருள் கூர்ந்து வேறு பெயரைத் தெரிவுச் செய்யவும்.",
-'fileexists-thumbnail-yes' => "இந்தக் கோப்பு அளவில் சிறியதாக்கப்பட்ட படிமம் போலத் தோன்றுகிறது. [[$1|thumb]]
-அருள் கூர்ந்து '''<tt>[[:$1]]</tt>''' கோப்பை ஒரு முறை பார்க்கவும்.
-நீங்கள் பார்த படிமமும் பதிவேற்ற எத்தனிக்கும் படிமமு ஒன்றாயின் அதன் சிறிய படிமத்தை மீண்டும் பதிவேற்றத் தேவையில்லை.",
-'file-thumbnail-no' => "இக்கோப்பின் பெயர் '''<tt>$1</tt>''' என்பதில் தொடங்குகிறது.
+'fileexists' => 'இப்பெயரைக் கொண்ட கோப்பொன்று ஏற்கனவே உள்ளது.
+அந்தக் கோப்பை மாற்றப்போகிறீர்கள் என்பதில் உங்களுக்கு நிச்சயமில்லாவிடில் அருள் கூர்ந்து <strong>[[:$1]]</strong> கோப்பை ஒரு முறை பார்க்கவும்.
+[[$1|thumb]]',
+'filepageexists' => 'இக்கோப்பிற்கான விளக்கப்பக்கம் <strong>[[:$1]]</strong> பக்கத்தில் ஏற்கனவே உருவாக்கப்பட்டுள்ளது, ஆனால் இப்பெயரில் கோப்பு ஒன்றில்லை. இங்கே நீங்கள் கொடுக்கும் சுருக்கம் விளக்கப்பக்கத்தில் தானியக்கமாக இணைக்கப்பட மாட்டது. சுருக்கத்தை விளக்கப்பக்கத்தில் காணச் செய்வதற்காக அப்பக்கத்தை நேரடியாக தொகுக்க வேண்டியிருக்கும்.
+[[$1|thumb]]',
+'fileexists-extension' => 'இப்பெயரைக் கொண்ட கோப்பு ஏற்கனவே உள்ளது: [[$2|thumb]]
+* பதிவேற்றப்படும் கோப்பின் பெயர்: <strong>[[:$1]]</strong>
+* ஏற்கனவே உள்ளக் கோப்பின் பெயர்: <strong>[[:$2]]</strong>
+அருள் கூர்ந்து வேறு பெயரைத் தெரிவுச் செய்யவும்.',
+'fileexists-thumbnail-yes' => 'இந்தக் கோப்பு அளவில் சிறியதாக்கப்பட்ட படிமம் போலத் தோன்றுகிறது. [[$1|thumb]]
+அருள் கூர்ந்து <strong>[[:$1]]</strong> கோப்பை ஒரு முறை பார்க்கவும்.
+நீங்கள் பார்த படிமமும் பதிவேற்ற எத்தனிக்கும் படிமமு ஒன்றாயின் அதன் சிறிய படிமத்தை மீண்டும் பதிவேற்றத் தேவையில்லை.',
+'file-thumbnail-no' => "இக்கோப்பின் பெயர் <strong>$1</strong> என்பதில் தொடங்குகிறது.
 இந்தக் கோப்பு அளவில் சிறியதாக்கப்பட்ட படிமம் போலத் தோன்றுகிறது ''(thumbnail)''.
 இப்படிமத்தின் முழு அளவிலான படிமம் உங்களிடமிருப்பின் அதைப் பதிவேற்றவும் அல்லது தயவுசெய்து கோப்பின் பெயரை மாற்றவும்.",
 'fileexists-forbidden' => 'இப்பெயரைக் கொண்ட கோப்பு ஏற்கனவே உள்ளது. தாங்கள் இக்கோப்பினை கட்டாயமாக பதிவேற்றம் செய்ய வேண்டும் என்றால் தாங்கள் சிறிது பின்நோக்கிச்சென்று கோப்பிற்கு புதிய பெயர் அளித்து பதிவேற்றம் செய்யவும். 
@@ -1698,7 +1723,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'பலநோக்கு இணைய அஞ்சல் நீட்சித் தேடல்',
-'mimesearch-summary' => 'இப்பக்கம் பலநோக்கு இணைய அஞ்சல் நீட்சி வகையின் படி கோப்புக்களை வடிக்கட்ட உதவுகிறது. உள்ளீடு:உள்ளடக்க வகை/உபவகை, எ+கா <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'இப்பக்கம் பலநோக்கு இணைய அஞ்சல் நீட்சி வகையின் படி கோப்புக்களை வடிக்கட்ட உதவுகிறது. உள்ளீடு:உள்ளடக்க வகை/உபவகை, எ+கா <code>image/jpeg</code>.',
 'mimetype' => 'பலநோக்கு இணைய அஞ்சல் நீட்சி வகை:',
 'download' => 'தரவிறக்கு',
 
@@ -1735,6 +1760,7 @@ $1',
 'statistics-edits' => '{{SITENAME}} அமைக்கப்பட்டதிலிருந்து பக்க திருத்தங்கள்',
 'statistics-edits-average' => 'ஒரு பக்கத்திற்கான சராசரி தொகுப்புக்கள்',
 'statistics-views-total' => 'பார்வையிடப்பட்டதின் மொத்த எண்ணிக்கை',
+'statistics-views-total-desc' => 'தற்பொழுது இல்லாத மற்றும் சிறப்பு பக்கங்களின் காட்சிகள் இதில் சேர்க்கபடவில்லை',
 'statistics-views-peredit' => 'ஒரு தொகுத்தலுக்காக பார்க்கப்பட்ட எண்ணிக்கை',
 'statistics-users' => 'பதிவு செய்யப்பட்ட [[Special:ListUsers|பயனர்கள்]]',
 'statistics-users-active' => 'தொடர் பங்களிப்பாளர்கள் (பயனர்கள்)',
@@ -1769,6 +1795,8 @@ $1',
 'nmembers' => '$1 {{PLURAL:$1|உறுப்பினர்|உறுப்பினர்கள்}}',
 'nrevisions' => '{{PLURAL:$1|ஒரு திருத்தம்|$1 திருத்தங்கள்}}',
 'nviews' => '{{PLURAL:$1|ஒரு பார்வை|$1 பார்வைகள்}}',
+'nimagelinks' => '$1 {{PLURAL:$!|பக்கத்தில்|பக்கங்களில்}} பயன்படுத்தப்பட்டது',
+'ntransclusions' => '$1 {{PLURAL:$1|பக்கத்தில்|பக்கங்களில்}} பயன்படுத்தப்பட்டது',
 'specialpage-empty' => 'இந்தப் புகாருக்குகந்த முடிவுகள் எதுவுமில்லை.',
 'lonelypages' => 'உறவிலிப் பக்கங்கள்',
 'lonelypagestext' => 'கீழ்கண்ட பக்கங்கள், {{SITENAME}}-இத்தளத்தின் மற்ற பக்கங்களில் எந்தவிதத்திலும் இணைக்கப்படவில்லை.',
@@ -1841,6 +1869,7 @@ $1',
 'alllogstext' => '{{SITENAME}} தளத்தின் பதிவுகள் அனைத்திற்குமான ஒருங்கிணைந்த காட்சி. பதிவு வகை, பயனர் பெயர், அல்லது தொடர்புடைய பக்கத்தைத் தெரிவு செய்வதன்மூலம் காட்சி நோக்கை சுருக்கிக் கொள்ள முடியும்.',
 'logempty' => 'பொருத்தமான பதிவுகள் யாதுமில்லை.',
 'log-title-wildcard' => 'இவ்வுரையுடன் தொடங்கும் தலைப்புகளைத் தேடு',
+'showhideselectedlogentries' => 'தேர்ந்தெடுத்த குறிப்பேடு உள்ளீடுகள் காண்பி/மறை',
 
 # Special:AllPages
 'allpages' => 'அனைத்துப் பக்கங்கள்',
@@ -1858,6 +1887,7 @@ $1',
 'allpagesprefix' => 'பின்வரும் முன்னொட்டு உடைய பக்கங்களை காட்டு:',
 'allpagesbadtitle' => 'கொடுக்கப்பட்ட தலைப்பு செல்லுபடியற்றது அல்லது பிழையான விக்கியிடை அல்லது மொழி முன்னொட்டைக் கொண்டுள்ளது. இது தலைப்புக்களில் பயன்படுத்த முடியாத எழுத்துக்களையும் கொண்டிருக்கலாம்.',
 'allpages-bad-ns' => '{{SITENAME}} தளத்தில் "$1" பெயர்வெளி கிடையாது.',
+'allpages-hide-redirects' => 'வழிமாற்றுகளை மறை',
 
 # SpecialCachedPage
 'cachedspecial-refresh-now' => 'அண்மையான பதிப்பை காண்க',
@@ -1905,6 +1935,8 @@ $1',
 
 # Special:ListGroupRights
 'listgrouprights' => 'பயனர் குழு உரிமைகள்',
+'listgrouprights-key' => '<span class="listgrouprights-granted">உரிமை வழங்கப்பட்டது</span>
+ * <span class="listgrouprights-revoked">உரிமை பறிக்கபட்டது</span>',
 'listgrouprights-group' => 'குழு',
 'listgrouprights-rights' => 'உரிமைகள்',
 'listgrouprights-helppage' => 'Help:குழு உரிமைகள்',
@@ -1960,7 +1992,7 @@ $1',
 'mywatchlist' => 'என் கவனிப்புப் பட்டியல்',
 'watchlistfor2' => '$1 பயனரின் ($2)',
 'nowatchlist' => 'உங்களுடைய கவனிப்புப் பட்டியலில் ஒரு விடயமும் இல்லை.',
-'watchlistanontext' => 'à®\89மதà¯\81 à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலà¯\88 à®ªà®¾à®°à¯\8dà®\95 à®\85லà¯\8dலதà¯\81 à®¤à¯\8aà®\95à¯\81à®\95à¯\8dà®\95 à®\85à®°à¯\81ளà¯\8d à®\95à¯\82à®°à¯\8dநà¯\8dதà¯\81 $1.',
+'watchlistanontext' => 'à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலà¯\88பà¯\8d à®ªà®¾à®°à¯\8dà®\95à¯\8dà®\95 à®\85லà¯\8dலதà¯\81 à®¤à¯\8aà®\95à¯\81à®\95à¯\8dà®\95 à®\85à®°à¯\81ளà¯\8d à®\95à¯\82à®°à¯\8dநà¯\8dதà¯\81 $1 à®\9aà¯\86யà¯\8dயà¯\81à®\99à¯\8dà®\95ளà¯\8d.',
 'watchnologin' => 'புகுபதிகை செய்யப்படவில்லை.',
 'watchnologintext' => 'உங்கள் கவனிப்புப் பட்டியலில் திருத்தம் செய்வதற்கு, நீங்கள்[[Special:UserLogin|புகுபதிகை செய்திருக்கவேண்டும்]].',
 'addwatch' => 'கவனிப்புப் பட்டியலில் சேர்',
@@ -2062,6 +2094,7 @@ $NEWPAGE
 'rollback' => 'முன்நிலையாக்கத் தொகுப்புகள்',
 'rollback_short' => 'முன்நிலையாக்கு',
 'rollbacklink' => 'முன்நிலையாக்கு',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|தொகுப்பை|தொகுப்புகளை}} முன்நிலையாக்குக',
 'rollbackfailed' => 'முன்நிலையாக்கம் தோல்வி',
 'cantrollback' => 'தொகுப்பை முன்நிலையாக்க முடியாது; கடைசிப் பங்களிப்பாளரே இக்கட்டுரையின் ஒரே ஆசிரியராகும்.',
 'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) பயனரால் செய்யப்பட்ட [[:$1]] இன் கடைசித் தொகுப்பை முன்நிலையாக்க முடியாது; வேறு யாரோ இப்பக்கத்தை ஏற்கெனவே தொகுத்தோ அல்லது முன்நிலையாக்கியோ உள்ளார்.
@@ -2144,7 +2177,7 @@ $NEWPAGE
 'undelete' => 'நீக்கப்பட்ட பக்கங்களைப் பார்',
 'undeletepage' => 'பார்ப்பதுடன், நீக்கப்பட்ட பக்கங்களை மீட்டெடு',
 'undeletepagetitle' => "'''[[:$1]] பக்கத்துக்கான நீக்கப்பட்ட திருத்தங்கள் கீழே தரப்பட்டுள்ளன'''.",
-'viewdeletedpage' => 'நà¯\80à®\95à¯\8dà®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®ªà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\88பà¯\8d à®ªà®¾à®°à¯\8d',
+'viewdeletedpage' => 'நீக்கப்பட்ட பக்கங்களைப் பார்',
 'undeletepagetext' => 'பின்வரும் {{PLURAL:$1|பக்கம் நீக்கப்பட்டுவிட்டது எனினும் அது|$1 பக்கங்கள் நீக்கப்பட்டுவிட்டன எனினும் அவை}} காப்பகத்தில் உள்ளதால், மீட்டெடுக்க முடியும். காப்பகம் காலத்துக்குக் காலம் சுத்தப்படுத்தப்படலாம்.',
 'undelete-fieldset-title' => 'மாற்றங்களை பழையபடிக்கு கொண்டுவரவும்',
 'undeleteextrahelp' => "இந்த பக்கத்தின் முழு வரலாற்றை மீட்டமைக்க அனைத்து தேர்வுகளையும் நீக்கி விட்டு '''''{{int:undeletebtn}}''''' இதனை சொடுக்கவும்.
@@ -2172,7 +2205,7 @@ $NEWPAGE
 'cannotundelete' => 'நீக்கம் தோல்வி; வேறு யாராவது முன்னதாக இப்பக்கத்தை நீக்கியிருக்கலாம்.',
 'undeletedpage' => "'''$1 மீட்கப்பட்டது'''
 
-அண்மைய நீக்கல்களுக்கும் மீட்புக்ளுக்கும் [[Special:Log/delete|நீக்கல் பதிவைப்]] பார்க்கவும்.",
+à®\85ணà¯\8dà®®à¯\88ய à®¨à¯\80à®\95à¯\8dà®\95லà¯\8dà®\95ளà¯\81à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®®à¯\80à®\9fà¯\8dபà¯\81à®\95à¯\8dà®\95ளà¯\81à®\95à¯\8dà®\95à¯\81à®®à¯\8d [[Special:Log/delete|நà¯\80à®\95à¯\8dà®\95லà¯\8d à®ªà®¤à®¿à®µà¯\88பà¯\8d]] à®ªà®¾à®°à¯\8dà®\95à¯\8dà®\95வà¯\81à®®à¯\8d.",
 'undelete-header' => 'அண்மையில் நீக்கப்பட்ட பக்கங்களைக் காண [[Special:Log/delete|நீக்கல் பதிவைப்]] பார்க்க.',
 'undelete-search-title' => 'நீக்கப்பட்ட பக்கங்களைத் தேடு',
 'undelete-search-box' => 'நீக்கப்பட்ட பக்கங்களைத் தேடு',
@@ -2581,6 +2614,7 @@ $1',
 'javascripttest' => 'சாவாநிரல் சோதனை நடக்கின்றது',
 'javascripttest-disabled' => 'இந்தச் செயல்பாடு முடக்கப்பட்டுள்ளது.',
 'javascripttest-title' => '$1 சோதனைகள் நடக்கின்றன',
+'javascripttest-pagetext-noframework' => 'இந்த பக்கம் JavaScript பரிசோதனை ஓட்டத்திற்காக ஒதுக்கப்பட்டுள்ளது',
 'javascripttest-pagetext-skins' => 'சோதனைகளை நடத்த முகப்புறை ஒன்றைத் தேர்வுசெய்:',
 
 # Tooltip help for the actions
@@ -2678,15 +2712,10 @@ $1',
 # Info page
 'pageinfo-title' => '"$1" பக்கத்துக்கான தகவல்',
 'pageinfo-header-edits' => 'தொகுப்புகள்',
-'pageinfo-header-watchlist' => 'கவனிப்புப் பட்டியல்',
-'pageinfo-header-views' => 'பார்வைகள்',
-'pageinfo-subjectpage' => 'பக்கம்',
-'pageinfo-talkpage' => 'பேச்சுப் பக்கம்',
+'pageinfo-views' => 'காட்சிகள் எண்ணிக்கை',
 'pageinfo-watchers' => 'பார்வையாளர்கள் எண்ணிக்கை',
 'pageinfo-edits' => 'தொகுப்புகளின் எண்ணிக்கை:',
 'pageinfo-authors' => 'சாதகமான அம்சங்களை பெற்றிருக்கும் எழுத்தாளர்கள் எண்ணிக்கை',
-'pageinfo-views' => 'காட்சிகள் எண்ணிக்கை',
-'pageinfo-viewsperedit' => 'திருத்தந்களுக்கான காட்சிகள்',
 
 # Skin names
 'skinname-standard' => 'இயல்பான',
@@ -3359,6 +3388,8 @@ $5
 'version-software' => 'நிறுவப்பட்ட மென்பொருள்',
 'version-software-product' => 'உற்பத்திப்பொருள்',
 'version-software-version' => 'பதிப்பு',
+'version-entrypoints' => 'நுழைவு புள்ளி உரலிகள்',
+'version-entrypoints-header-entrypoint' => 'நுழைவு புள்ளி',
 'version-entrypoints-header-url' => 'உரலி (URL)',
 
 # Special:FilePath
@@ -3521,9 +3552,12 @@ $5
 'api-error-empty-file' => 'நீங்கள் அளித்த கோப்பு காலியாக உள்ளது.',
 'api-error-emptypage' => 'புதிய, காலி பக்கங்கள் உருவாக்கல் அனுமதிக்கப்படவில்லை.',
 'api-error-fetchfileerror' => 'உள்ளகப் பிழை: கோப்பைப் பெறுகையில் ஏதோ தவறு நேர்ந்துவிட்டது.',
+'api-error-fileexists-forbidden' => '"$1" என்ற பெயருள்ள கோப்பு ஏற்கனவே உள்ளது.  மேலெழுத முடியாது.',
+'api-error-fileexists-shared-forbidden' => '"$1" என்ற பெயருள்ள கோப்பு ஏற்கனவே கோப்பு பகிர்மானப் பெட்டகத்தில்  உள்ளது. மேலெழுத முடியாது.',
 'api-error-file-too-large' => 'நீங்கள் அளித்த கோப்பு மிகவும் பெரியதாக உள்ளது.',
 'api-error-filename-tooshort' => 'கோப்புப் பெயர் மிகவும் சிறியதாக உள்ளது.',
 'api-error-filetype-banned' => 'இக்கோப்பு வகை தடைசெய்யப்பட்டுள்ளது.',
+'api-error-filetype-banned-type' => '$1  {{PLURAL:$4|அனுமதிக்கப்படாத கோப்பு வகையாகும் | அனுமதிக்கப்படாத கோப்பு வகைகளாகும்}}.. அனுமதிக்கப்பட்ட {{PLURAL:$3|கோப்புவகை|கோப்புவகைகள்}} $2 என்பது(வை) ஆகும்.',
 'api-error-filetype-missing' => 'கோப்பில் ஒரு விரிவு விடுபடுகிறது.',
 'api-error-hookaborted' => 'நீங்கள் செய்ய முயன்ற மாற்றம் ஒரு விரிவாக்கத்தால் புறக்கணிக்கப்பட்டது.',
 'api-error-http' => 'உள்ளகப் பிழை: வழங்கியுடன் இணைக்க முடியவில்லை',
@@ -3548,4 +3582,15 @@ $5
 'api-error-uploaddisabled' => 'இந்த விக்கியில் பதிவேற்றல் செயலிழக்கச் செய்யப்பட்டுள்ளது.',
 'api-error-verification-error' => 'இக்கோப்பு பிழையுடனோ தவறான விரிவுடனோ இருக்கலாம்.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|நொடி|நொடிகள்}}',
+'duration-minutes' => '{{PLURAL: $1|நிமிடம்|நிமிடங்கள்}}',
+'duration-hours' => '$1 {{PLURAL:$1|மணி|மணிகள்}} முன்பு',
+'duration-days' => '$1 {{PLURAL:$1|நாள்|நாட்கள்}}',
+'duration-weeks' => '{{PLURAL: $1|வாரம்|வாரங்கள்}}',
+'duration-years' => '{{PLURAL: $1|வருடம்|வருடங்கள்}}',
+'duration-decades' => '$1 {{PLURAL:$1|பத்தாண்டு|பத்தாண்டுகள்}}',
+'duration-centuries' => '$1 {{PLURAL:$1|நூற்றாண்டு|நூற்றாண்டுகள்}}',
+'duration-millennia' => '$1 {{PLURAL:$1|ஆயிரம் ஆண்டு|ஆயிரம் ஆண்டுகள்}}',
+
 );
index f9cd17c..148206a 100644 (file)
@@ -7,7 +7,9 @@
  * @ingroup Language
  * @file
  *
+ * @author Arjunaraoc
  * @author Chaduvari
+ * @author Jprmvnvijay5
  * @author Kaganer
  * @author Kiranmayee
  * @author Meno25
@@ -127,13 +129,13 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#దారిమార్పు', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__విషయసూచికవద్దు__', '__NOTOC__' ),
-       'toc'                     => array( '0', '__విషయసూచిక__', '__TOC__' ),
-       'pagename'                => array( '1', 'పేజీపేరు', 'PAGENAME' ),
-       'img_right'               => array( '1', 'కుడి', 'right' ),
-       'img_left'                => array( '1', 'ఎడమ', 'left' ),
-       'special'                 => array( '0', 'ప్రత్యేక', 'special' ),
+       'redirect'                  => array( '0', '#దారిమార్పు', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__విషయసూచికవద్దు__', '__NOTOC__' ),
+       'toc'                       => array( '0', '__విషయసూచిక__', '__TOC__' ),
+       'pagename'                  => array( '1', 'పేజీపేరు', 'PAGENAME' ),
+       'img_right'                 => array( '1', 'కుడి', 'right' ),
+       'img_left'                  => array( '1', 'ఎడమ', 'left' ),
+       'special'                   => array( '0', 'ప్రత్యేక', 'special' ),
 );
 
 $linkTrail = "/^([\xE0\xB0\x81-\xE0\xB1\xAF]+)(.*)$/sDu";
@@ -148,7 +150,7 @@ $messages = array(
 'tog-hidepatrolled' => 'ఇటీవలి మార్పులలో నిఘా ఉన్న మార్పులను దాచిపెట్టు',
 'tog-newpageshidepatrolled' => 'కొత్త పేజీల జాబితా నుంచి నిఘా ఉన్న పేజీలను దాచిపెట్టు',
 'tog-extendwatchlist' => 'కేవలం ఇటీవలి మార్పులే కాక, మార్పులన్నీ చూపించటానికి నా వీక్షణా జాబితాను పెద్దది చేయి',
-'tog-usenewrc' => 'à°®à±\86à°°à±\81à°\97à±\88à°¨ à°\87à°\9fà±\80వలి à°®à°¾à°°à±\8dà°ªà±\81à°² à°ªà±\87à°\9cà±\80 (జావాస్క్రిప్టు అవసరం)',
+'tog-usenewrc' => 'à°\87à°\9fà±\80వలి à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°®à°°à°¿à°¯à±\81 à°µà°¿à°\95à±\8dà°·à°£ à°\9cాబితాలలà±\8b à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°ªà±\87à°\9cà±\80 à°µà°¾à°°à°¿à°\97à°¾ à°\9aà±\82పిà°\82à°\9aà±\81 (జావాస్క్రిప్టు అవసరం)',
 'tog-numberheadings' => 'శీర్షికలకు ఆటోమాటిక్‌గా వరుస సంఖ్యలు పెట్టు',
 'tog-showtoolbar' => 'దిద్దుబాట్లు చేసేటప్పుడు, అందుకు సహాయపడే పరికరాలపెట్టెను చూపించు (జావాస్క్రిప్టు)',
 'tog-editondblclick' => 'డబుల్‌ క్లిక్కు చేసినప్పుడు పేజీని మార్చు (జావాస్క్రిప్టు)',
@@ -156,17 +158,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'విభాగం పేరు మీద కుడి క్లిక్కుతో విభాగం మార్పు కావాలి (జావాస్క్రిప్టు)',
 'tog-showtoc' => 'విషయసూచిక చూపించు (3 కంటే ఎక్కువ శీర్షికలున్న పేజీలకు)',
 'tog-rememberpassword' => 'ఈ విహారిణిలో నా ప్రవేశాన్ని గుర్తుంచుకో (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}}కి)',
-'tog-watchcreations' => 'à°¨à±\87à°¨à±\81 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80లనà±\81 à°¨à°¾ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à±\81 à°\95à°²à±\81à°ªు',
-'tog-watchdefault' => 'à°¨à±\87à°¨à±\81 à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\8dà°²à±\81 à°\9aà±\87సిన à°ªà±\87à°\9cà±\80లనà±\81 à°¨à°¾ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à±\81 à°\95à°²à±\81à°ªు',
-'tog-watchmoves' => 'à°¨à±\87à°¨à±\81 à°¤à°°à°²à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80లనà±\81 à°¨à°¾ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à±\81 à°\95à°²à±\81à°ªు',
-'tog-watchdeletion' => 'à°¨à±\87à°¨à±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80లనà±\81 à°¨à°¾ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à±\81 à°\95à°²à±\81à°ªు',
+'tog-watchcreations' => 'à°¨à±\87à°¨à±\81 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà±\87 à°ªà±\87à°\9cà±\80లనà±\81 à°®à°°à°¿à°¯à±\81 à°¦à°¸à±\8dà°¤à±\8dరాలనà±\81 à°¨à°¾ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à±\81 à°\9aà±\87à°°à±\8dà°\9aు',
+'tog-watchdefault' => 'à°¨à±\87à°¨à±\81 à°®à°¾à°°à±\8dà°\9aà±\87 à°ªà±\87à°\9cà±\80లనà±\81 à°®à°°à°¿à°¯à±\81 à°¦à°¸à±\8dà°¤à±\8dరాలనà±\81 à°¨à°¾ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à±\81 à°\9aà±\87à°°à±\8dà°\9aు',
+'tog-watchmoves' => 'à°¨à±\87à°¨à±\81 à°¤à°°à°²à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80లనà±\81 à°¦à°¸à±\8dà°¤à±\8dరాలనà±\81 à°¨à°¾ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à±\81 à°\9aà±\87à°°à±\8dà°\9aు',
+'tog-watchdeletion' => 'à°¨à±\87à°¨à±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80లనà±\81 à°¦à°¸à±\8dà°¤à±\8dరాలనà±\81 à°¨à°¾ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à±\81 à°\9aà±\87à°°à±\8dà°\9aు',
 'tog-minordefault' => 'ప్రత్యేకంగా తెలుపనంతవరకూ నా మార్పులను చిన్న మార్పులుగా గుర్తించు',
 'tog-previewontop' => 'వ్యాసం మార్పుల తరువాత ఎలావుంటుందో మార్పుల‌ బాక్సుకు పైన చూపు',
 'tog-previewonfirst' => 'దిద్దిబాట్లు చేసిన వ్యాసాన్ని భద్రపరిచే ముందు ఎలా వుంటుందో ఒకసారి చూపించు',
 'tog-nocache' => 'విహారిణిలో పుటల కాషింగుని అచేతనంచేయి',
-'tog-enotifwatchlistpages' => 'నా వీక్షణాజాబితా లోని పేజీలు మారినపుడు నాకు ఈ-మెయిలు పంపించు',
+'tog-enotifwatchlistpages' => 'నా వీక్షణాజాబితా లోని పేజీ లేదా దస్త్రం మారినపుడు నాకు ఈ-మెయిలు పంపించు',
 'tog-enotifusertalkpages' => 'నా చర్చా పేజీలో మార్పులు జరిగినపుడు నాకు ఈ-మెయిలు పంపించు',
-'tog-enotifminoredits' => 'à°\9aà°¿à°¨à±\8dà°¨ à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\87సినపà±\8dà°ªà±\81à°¡à±\81 à°\95à±\82à°¡à°¾ à°¨à°¾à°\95à±\81 à°\88-à°®à±\86యిలు పంపించు',
+'tog-enotifminoredits' => 'à°ªà±\87à°\9cà±\80à°²à±\81 à°®à°°à°¿à°¯à±\81 à°¦à°¸à±\8dà°¤à±\8dరాలà°\95à±\81 à°\9cà°°à°¿à°\97à±\87 à°\9aà°¿à°¨à±\8dà°¨ à°®à°¾à°°à±\8dà°ªà±\81à°²à°\95à±\81 à°\95à±\82à°¡à°¾ à°¨à°¾à°\95à±\81 à°\88-à°®à±\86యిలà±\81à°¨ు పంపించు',
 'tog-enotifrevealaddr' => 'గమనింపు మెయిళ్ళలో నా ఈ-మెయిలు చిరునామాను చూపించు',
 'tog-shownumberswatching' => 'వీక్షకుల సంఖ్యను చూపించు',
 'tog-oldsig' => 'ప్రస్తుత సంతకం:',
@@ -301,26 +303,26 @@ $messages = array(
 'vector-simplesearch-preference' => 'మెరుగైన అన్వేషణ సలహాలని చేతనంచేయి (వెక్టర్ అలంకారానికి మాత్రమే)',
 'vector-view-create' => 'సృష్టించు',
 'vector-view-edit' => 'సవరించు',
-'vector-view-history' => 'à°\9aà°°à°¿à°¤à±\8dరని చూడండి',
+'vector-view-history' => 'à°\9aà°°à°¿à°¤à±\8dà°°à°¨à±\81 చూడండి',
 'vector-view-view' => 'చదువు',
 'vector-view-viewsource' => 'మూలాన్ని చూడండి',
-'actions' => 'à°\9aà°°à±\8dà°¯లు',
-'namespaces' => 'à°¨à±\87à°\82à°¸à±\8dà°ªà±\87à°¸ులు',
-'variants' => 'à°µà±\88విధà±\8dà°¯ాలు',
+'actions' => 'పనà±\81లు',
+'namespaces' => 'à°ªà±\87à°°à±\81బరులు',
+'variants' => 'à°°à°\95à°°à°\95ాలు',
 
 'errorpagetitle' => 'పొరపాటు',
 'returnto' => 'తిరిగి $1కి.',
 'tagline' => '{{SITENAME}} నుండి',
 'help' => 'సహాయం',
-'search' => 'à°\85à°¨à±\8dà°µà±\87à°·à°£',
+'search' => 'à°µà±\86à°¤à±\81à°\95à±\81',
 'searchbutton' => 'వెతుకు',
 'go' => 'వెళ్లు',
 'searcharticle' => 'వెళ్లు',
 'history' => 'పేజీ చరిత్ర',
 'history_short' => 'చరిత్ర',
 'updatedmarker' => 'నేను కిందటిసారి వచ్చిన తరువాత జరిగిన మార్పులు',
-'printableversion' => 'à°®à±\81à°¦à±\8dà°°à°¿à°\82à°\9aà±\81à°\95à±\8bదగ్గ కూర్పు',
-'permalink' => 'శాశà±\8dవత à°²à°¿à°\82à°\95à±\81',
+'printableversion' => 'à°\85à°\9aà±\8dà°\9aà±\81à°¤à±\80à°¯దగ్గ కూర్పు',
+'permalink' => 'శాశà±\8dవత à°²à°\82à°\95à±\86',
 'print' => 'ముద్రించు',
 'view' => 'చూచుట',
 'edit' => 'సవరించు',
@@ -340,12 +342,12 @@ $messages = array(
 'talkpage' => 'ఈ పేజీని చర్చించండి',
 'talkpagelinktext' => 'చర్చ',
 'specialpage' => 'ప్రత్యేక పేజీ',
-'personaltools' => 'à°µà±\8dà°¯à°\95à±\8dతిà°\97à°¤ పనిముట్లు',
+'personaltools' => 'తన పనిముట్లు',
 'postcomment' => 'కొత్త విభాగం',
 'articlepage' => 'విషయపు పేజీని చూడండి',
 'talk' => 'చర్చ',
-'views' => 'à°ªà±\87à°\9cà±\80 à°²à°¿à°\82à°\95ులు',
-'toolbox' => 'పరిà°\95రాలపెట్టె',
+'views' => 'à°\9aà±\82à°ªులు',
+'toolbox' => 'పనిమà±\81à°\9fà±\8dà°² పెట్టె',
 'userpage' => 'వాడుకరి పేజీని చూడండి',
 'projectpage' => 'ప్రాజెక్టు పేజీని చూడు',
 'imagepage' => 'ఫైలు పేజీని చూడండి',
@@ -362,7 +364,7 @@ $messages = array(
 'protectedpage' => 'సంరక్షణలోని పేజీ',
 'jumpto' => 'ఇక్కడికి గెంతు:',
 'jumptonavigation' => 'పేజీకి సంబంధించిన లింకులు',
-'jumptosearch' => 'à°\85à°¨à±\8dà°µà±\87à°·à°£',
+'jumptosearch' => 'à°µà±\86à°¤à±\81à°\95à±\81',
 'view-pool-error' => 'క్షమించండి, ప్రస్తుతం సర్వర్లన్నీ ఓవర్‌లోడ్ అయిఉన్నాయి.
 చాలామంది వాడుకరులు ఈ పేజీని చూస్తున్నారు.
 ఈ పేజీని వీక్షించడానికి కొద్దిసేపు నిరీక్షించండి.
@@ -377,15 +379,15 @@ $1',
 'aboutpage' => 'Project:గురించి',
 'copyright' => 'విషయ సంగ్రహం $1  కి లోబడి లభ్యం.',
 'copyrightpage' => '{{ns:project}}:ప్రచురణ హక్కులు',
-'currentevents' => 'వరà±\8dతమాన à°\98à°\9fà°¨లు',
-'currentevents-url' => 'Project:వరà±\8dతమాన à°\98à°\9fà°¨లు',
+'currentevents' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿ à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dలు',
+'currentevents-url' => 'Project:à°\87à°ªà±\8dà°ªà°\9fà°¿ à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dలు',
 'disclaimers' => 'అస్వీకారములు',
 'disclaimerpage' => 'Project:సాధారణ నిష్పూచీ',
 'edithelp' => 'దిద్దుబాటు సహాయం',
 'edithelppage' => 'Help:దిద్దుబాట్లు ఎలా చెయ్యాలి',
 'helppage' => 'Help:సూచిక',
 'mainpage' => 'మొదటి పేజీ',
-'mainpage-description' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80',
+'mainpage-description' => 'తలపà±\81à°\9f',
 'policy-url' => 'Project:విధానం',
 'portal' => 'సముదాయ పందిరి',
 'portal-url' => 'Project:సముదాయ పందిరి',
@@ -404,6 +406,10 @@ $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' => 'సవరించు',
@@ -513,6 +519,7 @@ $1',
 'actionthrottledtext' => 'స్పామును తగ్గించటానికి తీసుకున్న నిర్ణయాల వల్ల, మీరు ఈ కార్యాన్ని అతి తక్కువ సమయంలో బోలెడన్ని సార్లు చేయకుండా అడ్డుకుంటున్నాము. కొన్ని నిమిషాలు ఆగి మరలా ప్రయత్నించండి.',
 'protectedpagetext' => 'ఈ పేజీని మార్చకుండా ఉండేందుకు సంరక్షించారు.',
 'viewsourcetext' => 'మీరీ పేజీ సోర్సును చూడవచ్చు, కాపీ చేసుకోవచ్చు:',
+'viewyourtext' => "ఈ పేజీకి '''మీ మార్పుల''' యొక్క మూలాన్ని చూడవచ్చు లేదా కాపీచేసుకోవచ్చు:",
 'protectedinterface' => 'సాఫ్టువేరు ఇంటరుఫేసుకు చెందిన టెక్స్టును ఈ పేజీ అందిస్తుంది. దుశ్చర్యల నివారణ కోసమై దీన్ని లాకు చేసాం.',
 'editinginterface' => "'''హెచ్చరిక''': సాఫ్టువేరుకు ఇంటరుఫేసు టెక్స్టును అందించే పేజీని మీరు సరిదిద్దుతున్నారు.
 ఈ పేజీలో చేసే మార్పుల వల్ల ఇతర వాడుకరులకు ఇంటరుఫేసు కనబడే విధానంలో తేడావస్తుంది.
@@ -524,6 +531,8 @@ $2',
 'ns-specialprotected' => 'ప్రత్యేక పేజీలపై దిద్దుబాట్లు చేయలేరు.',
 'titleprotected' => "సభ్యులు [[User:$1|$1]] ఈ పేజీని సృష్టించనివ్వకుండా నిరోదిస్తున్నారు.
 అందుకు ఇచ్చిన కారణం: ''$2''.",
+'exception-nologin' => 'లోనికి ప్రవేశించిలేరు',
+'exception-nologin-text' => 'ఈ వికీలో ఈ పేజీ లేదా పనికి మీరు తప్పనిసరిగా ప్రవేశించివుండాలి.',
 
 # Virus scanner
 'virus-badscanner' => "తప్పుడు స్వరూపణం: తెలియని వైరస్ స్కానర్: ''$1''",
@@ -545,8 +554,9 @@ $2',
 'remembermypassword' => 'ఈ కంప్యూటరులో నా ప్రవేశాన్ని గుర్తుంచుకో (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}}కి)',
 'securelogin-stick-https' => 'ప్రవేశం తర్వాత కూడా HTTPSకి అనుసంధానమై ఉండు',
 'yourdomainname' => 'మీ డోమైను',
+'password-change-forbidden' => 'ఈ వికీలో మీరు సంకేతపదాలను మార్చలేరు.',
 'externaldberror' => 'డేటాబేసు అధీకరణలో పొరపాటు జరిగింది లేదా మీ బయటి ఖాతాని తాజాకరించడానికి మీకు అనుమతి లేదు.',
-'login' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి',
+'login' => 'à°²à±\8bనిà°\95à°¿ à°°ండి',
 'nav-login-createaccount' => 'లోనికి ప్రవేశించండి / ఖాతాని సృష్టించుకోండి',
 'loginprompt' => '{{SITENAME}}లోకి ప్రవేశించాలంటే మీ విహారిణిలో కూకీలు చేతనమై ఉండాలి.',
 'userlogin' => 'ప్రవేశించండి / ఖాతాను సృష్టించుకోండి',
@@ -614,6 +624,7 @@ $2',
 'invalidemailaddress' => 'మీరు ఇచ్చిన ఈ-మెయిలు చిరునామా సరైన రీతిలో లేనందున అంగీకరించటంలేదు.
 దయచేసి ఈ-మెయిలు చిరునామాను సరైన రీతిలో ఇవ్వండి లేదా ఖాళీగా వదిలేయండి.',
 'cannotchangeemail' => 'ఈ వికీలో ఖాతా ఈ-మెయిలు చిరునామాను మార్చుకోలేరు.',
+'emaildisabled' => 'ఈ సైటు ఈమెయిళ్ళను పంపించలేదు.',
 'accountcreated' => 'ఖాతాని సృష్టించాం',
 'accountcreatedtext' => '$1 కి వాడుకరి ఖాతాని సృష్టించాం.',
 'createaccount-title' => '{{SITENAME}} కోసం ఖాతా సృష్టి',
@@ -656,7 +667,7 @@ $2',
 'passwordreset-legend' => 'సంకేతపదాన్ని మార్చుకోండి',
 'passwordreset-disabled' => 'ఈ వికీలో సంకేతపదాల మార్పును అచేతనం చేసాం.',
 'passwordreset-pretext' => '{{PLURAL:$1||డేటా శకలాల్లోంచి ఒకదాన్ని ఇవ్వండి}}',
-'passwordreset-username' => 'వాడుకరిపేరు:',
+'passwordreset-username' => 'వాడుకరి పేరు:',
 'passwordreset-domain' => 'డొమైన్:',
 'passwordreset-email' => 'ఈ-మెయిలు చిరునామా:',
 'passwordreset-emailtitle' => '{{SITENAME}}లో ఖాతా వివరాలు',
@@ -677,10 +688,12 @@ $2
 'passwordreset-emailelement' => 'వాడుకరిపేరు: $1
 తాత్కాలిక సంకేతపదం: $2',
 'passwordreset-emailsent' => 'జ్ఞాపకం ఈమెయిలు పంపించాం.',
+'passwordreset-emailsent-capture' => 'క్రింద చూపబడిన, గుర్తుచేయు సందేశమును పంపినాము.',
 
 # Special:ChangeEmail
 'changeemail' => 'ఈ-మెయిలు చిరునామా మార్పు',
 'changeemail-header' => 'ఖాతా ఈ-మెయిల్ చిరునామాని మార్చండి',
+'changeemail-text' => 'మీ ఈమెయిల్ చిరునామా మార్చుటకు ఈ ఫారము నింపండి. ఈ మార్పుని ఖచ్చితపరచుటకు మీ సంకేతపదం  ప్రవేశపెట్టాలి.',
 'changeemail-no-info' => 'ఈ పేజీని నేరుగా చూడటానికి మీరు లోనికి ప్రవేశించివుండాలి.',
 'changeemail-oldemail' => 'ప్రస్తుత ఈ-మెయిలు చిరునామా:',
 'changeemail-newemail' => 'కొత్త ఈ-మెయిలు చిరునామా:',
@@ -761,7 +774,7 @@ $2
 'nosuchsectiontext' => 'మీరు లేని విభాగాన్ని మార్చడానికి ప్రయత్నించారు.
 మీరు పేజీని చూస్తూన్నప్పుడు దాన్ని ఎవరైనా తరలించి లేదా తొలగించి ఉండవచ్చు.',
 'loginreqtitle' => 'ప్రవేశము తప్పనిసరి',
-'loginreqlink' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aి',
+'loginreqlink' => 'à°²à±\8bనిà°\95à°¿ à°°à°\82à°¡ి',
 'loginreqpagetext' => 'ఇతర పుటలను చూడడానికి మీరు $1 ఉండాలి.',
 'accmailtitle' => 'సంకేతపదం పంపించబడింది.',
 'accmailtext' => "[[User talk:$1|$1]] కొరకు ఒక యాదృచ్చిక సంకేతపదాన్ని $2కి పంపించాం.
@@ -798,6 +811,7 @@ $2
 'note' => "'''గమనిక:'''",
 'previewnote' => "'''ఇది మునుజూపు మాత్రమేనని గుర్తుంచుకోండి.'''
 మీ మార్పులు ఇంకా భద్రమవ్వలేదు!",
+'continue-editing' => 'దిద్దుబాటుని కొనసాగించండి',
 'previewconflict' => 'భద్రపరచిన తరువాత పై టెక్స్ట్‌ ఏరియాలోని టెక్స్టు ఇలాగ కనిపిస్తుంది.',
 'session_fail_preview' => "'''క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.'''
 దయచేసి మళ్ళీ ప్రయత్నించండి.
@@ -870,6 +884,7 @@ $2
 'edit-no-change' => 'పాఠ్యంలో ఏమీ మార్పులు లేవు గనక, మీ మార్పుని పట్టించుకోవట్లేదు.',
 'edit-already-exists' => 'కొత్త పేజీని సృష్టించలేము.
 అది ఇప్పటికే ఉంది.',
+'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'హెచ్చరిక: ఈ పేజీలో ఖరీదైన పార్సరు పిలుపులు చాలా ఉన్నాయి.
@@ -1061,6 +1076,8 @@ $1",
 
 # Diffs
 'history-title' => '"$1" యొక్క కూర్పుల చరిత్ర',
+'difference-title' => '"$1" యొక్క తిరిగిచూపుల నడుమ తేడాలు',
+'difference-title-multipage' => '"$1" మరియు "$2" పేజీల మధ్య తేడా',
 'difference-multipage' => '(పేజీల మధ్య తేడా)',
 'lineno' => 'పంక్తి $1:',
 'compareselectedversions' => 'ఎంచుకున్న సంచికలను పోల్చిచూడు',
@@ -1070,7 +1087,7 @@ $1",
 'diff-multi-manyusers' => '$2 మంది పైన ({{PLURAL:$2|ఒక వాడుకరి|వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించట్లేదు)',
 
 # Search results
-'searchresults' => 'à°\85à°¨à±\8dà°µà±\87à°·à°£ ఫలితాలు',
+'searchresults' => 'à°µà±\86à°¦à±\81à°\95à±\81లాà°\9f ఫలితాలు',
 'searchresults-title' => '"$1"కి అన్వేషణ ఫలితాలు',
 'searchresulttext' => '{{SITENAME}}లో అన్వేషించే విషయమై మరింత సమాచారం కొరకు [[{{MediaWiki:Helppage}}|{{int:help}}]] చూడండి.',
 'searchsubtitle' => 'మీరు \'\'\'[[:$1]]\'\'\' కోసం వెతికారు ([[Special:Prefixindex/$1|"$1"తో మొదలయ్యే అన్ని పేజీలు]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"కి లింకు ఉన్న అన్ని పేజీలు]])',
@@ -1439,14 +1456,16 @@ $1",
 'number_of_watching_users_pageview' => '[వీక్షిస్తున్న సభ్యులు: {{PLURAL:$1|ఒక్కరు|$1}}]',
 'rc_categories' => 'ఈ వర్గాలకు పరిమితం చెయ్యి ("|" తో వేరు చెయ్యండి)',
 'rc_categories_any' => 'ఏదయినా',
+'rc-change-size-new' => 'మార్పు తర్వాత $1 {{PLURAL:$1|బైటు|బైట్లు}}',
 'newsectionsummary' => '/* $1 */ కొత్త విభాగం',
 'rc-enhanced-expand' => 'వివరాలని చూపించు (జావాస్క్రిప్ట్ అవసరం)',
 'rc-enhanced-hide' => 'వివరాలను దాచు',
+'rc-old-title' => 'మొదట "$1"గా సృష్టించారు',
 
 # Recent changes linked
 'recentchangeslinked' => 'సంబంధిత మార్పులు',
 'recentchangeslinked-feed' => 'సంబంధిత మార్పులు',
-'recentchangeslinked-toolbox' => 'à°¸à°\82à°¬à°\82ధిత మార్పులు',
+'recentchangeslinked-toolbox' => 'à°ªà±\8aà°\82తనà°\97à°² మార్పులు',
 'recentchangeslinked-title' => '$1 కు సంబంధించిన మార్పులు',
 'recentchangeslinked-noresult' => 'మీరిచ్చిన కాలంలో ఇక్కడికి లింకు ఉన్న పేజీలలో ఎటువంటు మార్పులూ జరగలేదు.',
 'recentchangeslinked-summary' => "దీనికి లింకై ఉన్న పేజీల్లో జరిగిన చివరి మార్పులు ఇక్కడ చూడవచ్చు. మీ వీక్షణ జాబితాలో ఉన్న పేజీలు '''బొద్దు'''గా ఉంటాయి.",
@@ -1470,9 +1489,9 @@ $1",
 గతంలో ఎక్కించిన దస్త్రాలను చూడడానికి లేదా వెతకడానికి [[Special:FileList|ఎక్కించిన దస్త్రాల యొక్క జాబితా]]కు వెళ్ళండి, (పునః)ఎక్కింపులు [[Special:Log/upload|ఎక్కింపుల చిట్టా]] లోనూ తొలగింపులు [[Special:Log/delete|తొలగింపుల చిట్టా]] లోనూ కూడా నమోదవుతాయి.
 
 ఒక దస్త్రాన్ని ఏదైనా పుటలో చేర్చడానికి, కింద చూపిన వాటిలో ఏదేనీ విధంగా లింకుని వాడండి:
-* దస్త్రపు పూర్తి కూర్పుని వాడడానికి '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''
-* ఎడమ వైపు మార్జినులో 200 పిక్సెళ్ళ వెడల్పుగల బొమ్మ  మరియు 'ప్రత్యామ్నాయ పాఠ్యం' అన్న వివరణతో గల పెట్టె కోసం  '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|ప్రత్యామ్నాయ పాఠ్యం]]</nowiki></tt>'''
-* దస్త్రాన్ని చూపించకుండా నేరుగా లింకు ఇవ్వడానికి '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''",
+* దస్త్రపు పూర్తి కూర్పుని వాడడానికి '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''
+* ఎడమ వైపు మార్జినులో 200 పిక్సెళ్ళ వెడల్పుగల బొమ్మ  మరియు 'ప్రత్యామ్నాయ పాఠ్యం' అన్న వివరణతో గల పెట్టె కోసం  '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|ప్రత్యామ్నాయ పాఠ్యం]]</nowiki></code>'''
+* దస్త్రాన్ని చూపించకుండా నేరుగా లింకు ఇవ్వడానికి '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
 'upload-permitted' => 'అనుమతించే ఫైలు రకాలు: $1.',
 'upload-preferred' => 'అనుమతించే ఫైలు రకాలు: $1.',
 'upload-prohibited' => 'నిషేధించిన ఫైలు రకాలు: $1.',
@@ -1491,6 +1510,7 @@ $1",
 'minlength1' => 'పైలు పేర్లు కనీసం ఒక్క అక్షరమైనా ఉండాలి.',
 'illegalfilename' => '"$1" అనే దస్త్రపుపేరు పేజీ శీర్షికలలో వాడకూడని అక్షరాలను కలిగివుంది.
 దస్త్రపు పేరుని మార్చి మళ్ళీ ఎక్కించడానికి ప్రయత్నించండి.',
+'filename-toolong' => 'దస్త్రపు పేరు 240 బైట్ల కంటే పొడవు ఉండకూడదు.',
 'badfilename' => 'ఫైలు పేరు "$1"కి మార్చబడినది.',
 'filetype-mime-mismatch' => 'దస్త్రపు పొడగింపు ".$1" ఆ దస్త్రం యొక్క MIME రకం ($2) తో సరిపోలలేదు.',
 'filetype-badmime' => '"$1" MIME రకం ఉన్న ఫైళ్ళను ఎగుమతికి అనుమతించం.',
@@ -1515,19 +1535,19 @@ $1",
 'largefileserver' => 'ఈ ఫైలు సైజు సర్వరులో విధించిన పరిమితి కంటే ఎక్కువగా ఉంది.',
 'emptyfile' => 'మీరు అప్‌లోడు చేసిన ఫైలు ఖాళీగా ఉన్నట్లుంది. ఫైలు పేరును ఇవ్వడంలో స్పెల్లింగు తప్పు దొర్లి ఉండొచ్చు. మీరు అప్‌లోడు చెయ్యదలచింది ఇదో కాదో నిర్ధారించుకోండి.',
 'windows-nonascii-filename' => 'దస్త్రాల పేర్లలో ప్రత్యేక అక్షరాలకు ఈ వికీలో తోడ్పాటు లేదు.',
-'fileexists' => "ఈ పేరుతో ఒక ఫైలు ఇప్పటికే ఉంది.
-దీనిని మీరు మార్చాలో లేదో తెలియకపోతె ఫైలు '''<tt>[[:$1]]</tt>'''ని చూడండి.
-[[$1|thumb]]",
-'filepageexists' => "ఈ ఫైలు కొరకు వివరణ పేజీని '''<tt>[[:$1]]</tt>''' వద్ద ఈసరికే సృష్టించారు, కానీ ఆ పేరుతో ప్రస్తుతం ఏ ఫైలూ లేదు. మీరు ఇస్తున్న సంగ్రహం ఆ వివరణ పేజీలో కనబడదు. మీ సంగ్రహం అక్కడ కనబడాలంటే, నేరుగా అక్కడే చేర్చాలి.
-[[$1|thumb]]",
-'fileexists-extension' => "ఇటువంటి పేరుతో మరో ఫైలు ఉంది: [[$2|thumb]]
-* ఎగుమతి చేస్తున్న ఫైలు పేరు: '''<tt>[[:$1]]</tt>'''
-* ప్రస్తుతం ఉన్న ఫైలు పేరు: '''<tt>[[:$2]]</tt>'''
-దయచేసి మరో పేరు ఎంచుకోండి.",
+'fileexists' => 'ఈ పేరుతో ఒక ఫైలు ఇప్పటికే ఉంది.
+దీనిని మీరు మార్చాలో లేదో తెలియకపోతె ఫైలు <strong>[[:$1]]</strong>ని చూడండి.
+[[$1|thumb]]',
+'filepageexists' => 'ఈ ఫైలు కొరకు వివరణ పేజీని <strong>[[:$1]]</strong> వద్ద ఈసరికే సృష్టించారు, కానీ ఆ పేరుతో ప్రస్తుతం ఏ ఫైలూ లేదు. మీరు ఇస్తున్న సంగ్రహం ఆ వివరణ పేజీలో కనబడదు. మీ సంగ్రహం అక్కడ కనబడాలంటే, నేరుగా అక్కడే చేర్చాలి.
+[[$1|thumb]]',
+'fileexists-extension' => 'ఇటువంటి పేరుతో మరో ఫైలు ఉంది: [[$2|thumb]]
+* ఎగుమతి చేస్తున్న ఫైలు పేరు: <strong>[[:$1]]</strong>
+* ప్రస్తుతం ఉన్న ఫైలు పేరు: <strong>[[:$2]]</strong>
+దయచేసి మరో పేరు ఎంచుకోండి.',
 'fileexists-thumbnail-yes' => "ఈ ఫైలు కుదించిన బొమ్మ లాగా ఉంది ''(థంబ్‌నెయిలు)''. [[$1|thumb]]
-'''<tt>[[:$1]]</tt>''' ఫైలు చూడండి.
+<strong>[[:$1]]</strong> ఫైలు చూడండి.
 గుర్తు పెట్టబడిన ఫైలు అసలు సైజే అది అయితే, మరో థంబ్‌నెయిలును అప్‌లోడు చెయ్యాల్సిన అవసరం లేదు.",
-'file-thumbnail-no' => "ఫైలు పేరు '''<tt>$1</tt>''' తో మొదలవుతోంది.
+'file-thumbnail-no' => "ఫైలు పేరు <strong>$1</strong> తో మొదలవుతోంది.
 అది పరిమాణం తగ్గించిన ''(నఖచిత్రం)'' లాగా అనిపిస్తోంది.
 ఈ బొమ్మ యొక్క పూర్తి స్పష్టత కూర్పు ఉంటే, దాన్ని ఎగుమతి చెయ్యండి. లేదా ఫైలు పేరును మార్చండి.",
 'fileexists-forbidden' => 'ఈ పేరుతో ఇప్పటికే ఒక ఫైలు ఉంది, దాన్ని తిరగరాయలేరు.
@@ -1551,12 +1571,12 @@ $1",
 'uploadvirus' => 'ఈ ఫైలులో వైరస్‌ ఉంది! వివరాలు: $1',
 'uploadjava' => 'ఇదొక ZIP ఫైలు, ఇందులో ఒక Java .class ఫైలు ఉంది.
 Java ఫైళ్ళ వలన భద్రతకు తూట్లు పడే అవకాశం ఉంది కాబట్టి, వాటిని ఎక్కించడానికి అనుమతి లేదు.',
-'upload-source' => 'à°®à±\82à°² à°«à±\88à°²à±\81',
+'upload-source' => 'à°®à±\82à°² à°¦à°¸à±\8dà°¤à±\8dà°°à°\82',
 'sourcefilename' => 'మూలం ఫైలుపేరు:',
 'sourceurl' => 'మూల URL:',
 'destfilename' => 'ఉద్దేశించిన ఫైలుపేరు:',
 'upload-maxfilesize' => 'గరిష్ట ఫైలు పరిమాణం: $1',
-'upload-description' => 'à°«à±\88à°²ు వివరణ',
+'upload-description' => 'దసà±\8dà°¤à±\8dà°°à°ªు వివరణ',
 'upload-options' => 'ఎక్కింపు వికల్పాలు',
 'watchthisupload' => 'ఈ ఫైలుని గమనించు',
 'filewasdeleted' => 'ఇదే పేరుతో ఉన్న ఒక ఫైలును గతంలో అప్లోడు చేసారు, తరువాతి కాలంలో దాన్ని తొలగించారు. దాన్నీ మళ్ళీ అప్లోడు చేసే ముందు, మీరు $1 ను చూడాలి',
@@ -1585,6 +1605,8 @@ $1',
 'backend-fail-delete' => '$1 ఫైలును తొలగించలేకున్నాం.',
 'backend-fail-alreadyexists' => '$1 అనే దస్త్రం ఇప్పటికే ఉంది.',
 'backend-fail-opentemp' => 'తాత్కాలిక దస్త్రాన్ని తెరవలేకపోతున్నాం.',
+'backend-fail-closetemp' => 'తాత్కాలిక దస్త్రాన్ని మూసివేయలేకపోయాం.',
+'backend-fail-read' => '$1 దస్త్రము చదువలేకపోతిమి.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'ఈ ఫైలును ZIP పరీక్ష కోసం తెరవబోతే, ఏదో తెలియని లోపం ఎదురైంది.',
@@ -1657,7 +1679,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'listfiles_count' => 'కూర్పులు',
 
 # File description page
-'file-anchor-link' => 'à°«à±\88à°²à±\81',
+'file-anchor-link' => 'దసà±\8dà°¤à±\8dà°°à°\82',
 'filehist' => 'దస్త్రపు చరిత్ర',
 'filehist-help' => 'తేదీ/సమయం ను నొక్కి ఆ సమయాన ఫైలు ఎలా ఉండేదో చూడవచ్చు.',
 'filehist-deleteall' => 'అన్నిటినీ తొలగించు',
@@ -1726,7 +1748,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 
 # MIME search
 'mimesearch' => 'బొమ్మల మెటాడేటా(MIME)ను వెతకండి',
-'mimesearch-summary' => 'ఈ పేజీ MIME-రకాన్ననుసరించి ఫైళ్ళను వడగట్టేందుకు దోహదం చేస్తుంది. Input: contenttype/subtype, ఉదా. <tt>బొమ్మ/jpeg</tt>.',
+'mimesearch-summary' => 'ఈ పేజీ MIME-రకాన్ననుసరించి ఫైళ్ళను వడగట్టేందుకు దోహదం చేస్తుంది. Input: contenttype/subtype, ఉదా. <code>బొమ్మ/jpeg</code>.',
 'mimetype' => 'MIME రకం:',
 'download' => 'డౌన్‌లోడు',
 
@@ -1877,10 +1899,11 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 ఒక చిట్టా రకాన్ని గానీ, ఒక వాడుకరి పేరు గానీ (case-sensitive), లేదా ప్రభావిత  పుటని (ఇది కూడా case-sensitive) గానీ ఎంచుకుని సంబంధిత చిట్టాను మాత్రమే చూడవచ్చు.',
 'logempty' => 'సరిపోలిన అంశాలేమీ చిట్టాలో లేవు.',
 'log-title-wildcard' => 'ఈ పాఠ్యంతో మొదలయ్యే పుస్తకాల కొరకు వెతుకు',
+'showhideselectedlogentries' => 'ఎంచుకున్న చిట్టా పద్దులను చూపించు/దాచు',
 
 # Special:AllPages
 'allpages' => 'అన్ని పేజీలు',
-'alphaindexline' => '$1 నుండి $2',
+'alphaindexline' => '$1 నుండి $2 వరకు',
 'nextpage' => 'తరువాతి పేజీ ($1)',
 'prevpage' => 'మునుపటి పేజీ ($1)',
 'allpagesfrom' => 'ఇక్కడ మొదలు పెట్టి పేజీలు చూపించు:',
@@ -1896,6 +1919,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'allpages-bad-ns' => '{{SITENAME}} లో "$1" అనే నేమ్&zwnj;స్పేస్ లేదు.',
 'allpages-hide-redirects' => 'దారిమార్పులను దాచు',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'సరికొత్త కూర్పును చూడండి.',
+
 # Special:Categories
 'categories' => 'వర్గాలు',
 'categoriespagetext' => 'ఈ క్రింది {{PLURAL:$1|వర్గం పేజీలను లేదా మాధ్యమాలను కలిగివుంది|వర్గాలు పేజీలను లేదా మాధ్యమాలను కలిగివున్నాయి}}.
@@ -1915,7 +1941,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'linksearch-pat' => 'వెతకాల్సిన నమూనా:',
 'linksearch-ns' => 'పేరుబరి:',
 'linksearch-ok' => 'వెతుకు',
-'linksearch-text' => '"*.wikipedia.org" వంటి వైల్డ్ కార్డులు వాడవచ్చు.<br />ఉపయోగించుకోగల ప్రోటోకాళ్లు: <tt>$1</tt>',
+'linksearch-text' => '"*.wikipedia.org" వంటి వైల్డ్ కార్డులు వాడవచ్చు.<br />ఉపయోగించుకోగల ప్రోటోకాళ్లు: <code>$1</code>',
 'linksearch-line' => '$2 నుండి $1కి లింకు ఉంది',
 'linksearch-error' => 'హోస్ట్‌నేముకు ముందు మాత్రమే వైల్డ్ కార్డులు వాడవచ్చు.',
 
@@ -2095,6 +2121,8 @@ $UNWATCHURL కి వెళ్ళండి.
 'rollback' => 'దిద్దుబాట్లను రద్దుచేయి',
 'rollback_short' => 'రద్దుచేయి',
 'rollbacklink' => 'రద్దుచేయి',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|మార్పును|మార్పులను}} రద్దుచేయి',
+'rollbacklinkcount-morethan' => '$1 కంటే ఎక్కువ {{PLURAL:$1|మార్పును|మార్పులను}} రద్దుచేయి',
 'rollbackfailed' => 'రద్దుచేయటం విఫలమైంది',
 'cantrollback' => 'రచనను వెనక్కి తీసుకువెళ్ళలేము; ఈ పేజీకి ఇదొక్కటే రచన.',
 'alreadyrolled' => '[[:$1]]లో [[User:$2|$2]] ([[User talk:$2|చర్చ]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) చేసిన చివరి మార్పును రద్దు చెయ్యలేము;
@@ -2142,6 +2170,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'protect-level-sysop' => 'నిర్వాహకులు మాత్రమే',
 'protect-summary-cascade' => 'కాస్కేడింగు',
 'protect-expiring' => '$1 (UTC)న కాలంచెల్లుతుంది',
+'protect-expiring-local' => '$1న కాలంచెల్లుతుంది',
 'protect-expiry-indefinite' => 'నిరవధికం',
 'protect-cascade' => 'ఈ పేజీకి జతపరిచిన పేజీలను కూడా రక్షించు (కాస్కేడింగు రక్షణ)',
 'protect-cantedit' => 'ఈ పేజీ యొక్క సంరక్షణా స్థాయిని మీరు మార్చలేరు, ఎందుకంటే దాన్ని మార్చే అనుమతి మీకు లేదు.',
@@ -2257,7 +2286,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'sp-contributions-submit' => 'వెతుకు',
 
 # What links here
-'whatlinkshere' => 'ఇక్కడికి లంకెలున్న పుటలు',
+'whatlinkshere' => 'ఇక్కడికి లంకెలున్నవి',
 'whatlinkshere-title' => '"$1"కి లింకున్న పుటలు',
 'whatlinkshere-page' => 'పేజీ:',
 'linkshere' => "కిందనున్న పేజీల నుండి '''[[:$1]]'''కు లింకులు ఉన్నాయి:",
@@ -2276,6 +2305,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'whatlinkshere-filters' => 'వడపోతలు',
 
 # Block/unblock
+'autoblockid' => 'tanaDDu #$1',
 'block' => 'వాడుకరి నిరోధం',
 'unblock' => 'వాడుకరిపై నిరోధాన్ని తీసెయ్యండి',
 'blockip' => 'వాడుకరి నిరోధం',
@@ -2531,7 +2561,7 @@ $UNWATCHURL కి వెళ్ళండి.
 # Namespace 8 related
 'allmessages' => 'అన్ని సిస్టం సందేశాలు',
 'allmessagesname' => 'పేరు',
-'allmessagesdefault' => 'à°¡à±\80ఫాలà±\8dà°\9fు పాఠ్యం',
+'allmessagesdefault' => 'à°\85à°ªà±\8dà°°à°®à±\87à°¯ à°¸à°\82à°¦à±\87శపు పాఠ్యం',
 'allmessagescurrent' => 'ప్రస్తుత పాఠ్యం',
 'allmessagestext' => 'మీడియావికీ పేరుబరిలో ఉన్న అంతరవర్తి సందేశాల జాబితా ఇది.
 సాధారణ మీడియావికీ స్థానికీకరణకి మీరు తోడ్పడాలనుకుంటే, దయచేసి [//www.mediawiki.org/wiki/Localisation మీడియావికీ స్థానికీకరణ] మరియు [//translatewiki.net ట్రాన్స్&zwnj;లేట్&zwnj;వికీ.నెట్] సైట్లను చూడండి.',
@@ -2607,6 +2637,7 @@ $UNWATCHURL కి వెళ్ళండి.
 
 # JavaScriptTest
 'javascripttest' => 'జావాస్క్రిప్ట్ పరీక్ష',
+'javascripttest-title' => '$1 పరీక్షలు నడుస్తున్నాయి',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'మీ వాడుకరి పేజీ',
@@ -2620,10 +2651,10 @@ $UNWATCHURL కి వెళ్ళండి.
 'tooltip-pt-anonlogin' => 'మీరు లోనికి ప్రవేశించడాన్ని ప్రోత్సహిస్తాం; కానీ, అది తప్పనిసరి కాదు',
 'tooltip-pt-logout' => 'నిష్క్రమించండి',
 'tooltip-ca-talk' => 'విషయపు పుట గురించి చర్చ',
-'tooltip-ca-edit' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dదవà°\9aà±\8dà°\9aà±\81. à°­à°¦à±\8dరపరిచేముందు మునుజూపు బొత్తాన్ని వాడండి.',
+'tooltip-ca-edit' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dదవà°\9aà±\8dà°\9aà±\81. à°¦à°¾చేముందు మునుజూపు బొత్తాన్ని వాడండి.',
 'tooltip-ca-addsection' => 'కొత్త విభాగాన్ని మొదలుపెట్టండి',
 'tooltip-ca-viewsource' => 'ఈ పుటని సంరక్షించారు. మీరు దీని మూలాన్ని చూడవచ్చు',
-'tooltip-ca-history' => 'à°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°\97à°¤ à°\95à±\82à°°à±\8dà°ªà±\81à°²à±\81.',
+'tooltip-ca-history' => 'à°\88 à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°µà±\86à°¨à±\81à°\95à°\9fà°¿ à°\95à±\82à°°à±\8dà°ªà±\81à°²à±\81',
 'tooltip-ca-protect' => 'ఈ పేజీని సంరక్షించండి',
 'tooltip-ca-unprotect' => 'ఈ పేజీ సంరక్షణను మార్చండి',
 'tooltip-ca-delete' => 'ఈ పేజీని తొలగించండి',
@@ -2635,24 +2666,24 @@ $UNWATCHURL కి వెళ్ళండి.
 'tooltip-search-go' => 'ఇదే పేరుతో పేజీ ఉంటే అక్కడికి తీసుకెళ్ళు',
 'tooltip-search-fulltext' => 'పేజీలలో ఈ పాఠ్యం కొరకు వెతుకు',
 'tooltip-p-logo' => 'మొదటి పుటను దర్శించండి',
-'tooltip-n-mainpage' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80ని à°¦à°°à±\8dశిà°\82à°\9aండి',
-'tooltip-n-mainpage-description' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80ని à°¦à°°à±\8dశిà°\82à°\9aండి',
+'tooltip-n-mainpage' => 'తలపà±\81à°\9fà°¨à±\81 à°\9aà±\82à°¡ండి',
+'tooltip-n-mainpage-description' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\81à°\9fà°¨à±\81 à°\9aà±\82à°¡ండి',
 'tooltip-n-portal' => 'ప్రాజెక్టు గురించి, మీరేం చేయవచ్చు, సమాచారం ఎక్కడ దొరుకుతుంది',
-'tooltip-n-currentevents' => 'వరà±\8dతమాన à°\98à°\9fనలà°\95à±\81 à°¸à°\82à°¬à°\82ధిà°\82à°\9aà°¿à°¨ à°¸à°®à°¾à°\9aారానà±\8dని à°ªà±\8aà°\82à°¦à°\82à°¡à°¿.',
+'tooltip-n-currentevents' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿ à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dà°² à°¯à±\8aà°\95à±\8dà°\95 à°®à±\81à°¨à±\81à°ªà°\9fà°¿ à°®à°\82దలనà±\81 à°¤à±\86à°²à±\81à°¸à±\81à°\95à±\8aà°¨à±\81à°¡à°¿',
 'tooltip-n-recentchanges' => 'వికీలో ఇటీవల జరిగిన మార్పుల జాబితా.',
 'tooltip-n-randompage' => 'ఓ యాదృచ్చిక పేజీని చూడండి',
 'tooltip-n-help' => 'తెలుసుకోడానికి ఓ మంచి ప్రదేశం.',
-'tooltip-t-whatlinkshere' => 'à°\87à°\95à±\8dà°\95à°¡à°¿à°\95à°¿ à°²à°¿à°\82à°\95యి à°\89à°¨à±\8dà°¨ à°\85à°¨à±\8dని à°µà°¿à°\95à±\80 à°ªà±\87à°\9cà±\80లు',
-'tooltip-t-recentchangeslinked' => 'à°\88 à°ªà±\87à°\9cà±\80à°¨à±\81à°\82à°¡à°¿ à°²à°¿à°\82à°\95à±\81à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80à°²à°\95à±\81 జరిగిన ఇటీవలి మార్పులు',
+'tooltip-t-whatlinkshere' => 'à°\87à°\95à±\8dà°\95à°¡à°¿à°¤à±\8b à°®à±\81డిపడియà±\81à°¨à±\8dà°¨ à°\85à°¨à±\8dని à°µà°¿à°\95à±\80 à°ªà±\81à°\9fà°² à°²à°\82à°\95à±\86లు',
+'tooltip-t-recentchangeslinked' => 'à°\88 à°ªà±\81à°\9fà°\95à±\81 à°®à±\81డివడియà±\81à°¨à±\8dà°¨ à°ªà±\81à°\9fలలà±\8b జరిగిన ఇటీవలి మార్పులు',
 'tooltip-feed-rss' => 'ఈ పేజీకి RSS ఫీడు',
 'tooltip-feed-atom' => 'ఈ పేజీకి Atom ఫీడు',
 'tooltip-t-contributions' => 'ఈ వాడుకరి యొక్క రచనల జాబితా చూడండి',
 'tooltip-t-emailuser' => 'ఈ వాడుకరికి ఓ ఈమెయిలు పంపండి',
 'tooltip-t-upload' => 'దస్త్రాలను ఎక్కించండి',
 'tooltip-t-specialpages' => 'అన్ని ప్రత్యేక పుటల యొక్క జాబితా',
-'tooltip-t-print' => 'à°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°®à±\81à°¦à±\8dరణా కూర్పు',
-'tooltip-t-permalink' => 'à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°\88 à°\95à±\82à°°à±\8dà°ªà±\81à°\95à°¿ à°¶à°¾à°¶à±\8dవత à°²à°¿à°\82à°\95à±\81',
-'tooltip-ca-nstab-main' => 'విషయపà±\81 à°ªà±\87à°\9cà±\80ని చూడండి',
+'tooltip-t-print' => 'à°\88 à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°\85à°\9aà±\8dà°\9aà±\81à°¤à±\80యదà°\97à±\8dà°\97 కూర్పు',
+'tooltip-t-permalink' => 'à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°\88 à°\95à±\82à°°à±\8dà°ªà±\81à°\95à°¿ à°¶à°¾à°¶à±\8dవత à°²à°\82à°\95à±\86',
+'tooltip-ca-nstab-main' => 'à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dà°² à°ªà±\81à°\9fà°¨à±\81 చూడండి',
 'tooltip-ca-nstab-user' => 'వాడుకరి పేజీని చూడండి',
 'tooltip-ca-nstab-media' => 'మీడియా పేజీని చూడండి',
 'tooltip-ca-nstab-special' => 'ఇది ఒక ప్రత్యేక పుట, దీన్ని మీరు సరిదిద్దలేరు',
@@ -2704,15 +2735,10 @@ $UNWATCHURL కి వెళ్ళండి.
 
 # Info page
 'pageinfo-title' => '"$1" గురించి సమాచారం',
-'pageinfo-header-edits' => 'మార్పులు',
-'pageinfo-header-watchlist' => 'వీక్షణ జాబితా',
-'pageinfo-header-views' => 'వీక్షణలు',
-'pageinfo-subjectpage' => 'పుట',
-'pageinfo-talkpage' => 'చర్చా పేజీ',
-'pageinfo-watchers' => 'వీక్షకుల సంఖ్య',
-'pageinfo-edits' => 'మార్పుల సంఖ్య',
+'pageinfo-header-edits' => 'మార్పుల చరిత్ర',
 'pageinfo-views' => 'వీక్షణల సంఖ్య',
-'pageinfo-viewsperedit' => 'ఒక మార్పుకి వీక్షణలు',
+'pageinfo-watchers' => 'పేజీ వీక్షకుల సంఖ్య',
+'pageinfo-edits' => 'మొత్తం మార్పుల సంఖ్య',
 
 # Skin names
 'skinname-standard' => 'సంప్రదాయ',
@@ -2967,6 +2993,7 @@ $1',
 'exif-iimcategory' => 'వర్గం',
 'exif-iimsupplementalcategory' => 'అనుషంగిక వర్గాలు',
 'exif-datetimeexpires' => 'దీని తరువాత వాడవద్దు',
+'exif-datetimereleased' => 'విడుదల తేదీ',
 'exif-identifier' => 'గుర్తింపకం',
 'exif-lens' => 'వాడిన కటకం',
 'exif-serialnumber' => 'కెమేరా యొక్క సీరియల్ నంబర్',
@@ -3364,6 +3391,9 @@ $5
 'version-software' => 'స్థాపిత మృదూపకరణాలు',
 'version-software-product' => 'ప్రోడక్టు',
 'version-software-version' => 'వెర్షను',
+'version-entrypoints' => 'ప్రవేశ బిందు చిరునామాలు',
+'version-entrypoints-header-entrypoint' => 'ప్రవేశ బిందువు',
+'version-entrypoints-header-url' => 'చిరునామా',
 
 # Special:FilePath
 'filepath' => 'పూర్తి చిరునామా',
@@ -3496,19 +3526,26 @@ $5
 
 # API errors
 'api-error-badaccess-groups' => 'ఈ వికీ లోనికి దస్త్రాలను ఎక్కించే అనుమతి మీకు లేదు.',
+'api-error-duplicate-archive-popup-title' => 'నకిలీ {{PLURAL:$1|దస్త్రాన్ని|దస్త్రాలను}} ఇప్పటికే తొలగించారు.',
+'api-error-duplicate-popup-title' => 'నకిలీ {{PLURAL:$1|దస్త్రం|దస్త్రాలు}}.',
 'api-error-empty-file' => 'మీరు దాఖలుచేసిన ఫైల్ ఖాళీది.',
 'api-error-emptypage' => 'కొత్త మరియు ఖాళీ పేజీలను సృష్టించడానికి అనుమతి లేదు.',
+'api-error-file-too-large' => 'మీరు సమర్పించిన దస్త్రం చాలా పెద్దగా ఉంది.',
 'api-error-filename-tooshort' => 'దస్త్రపు పేరు మరీ చిన్నగా ఉంది.',
 'api-error-filetype-banned' => 'ఈ రకపు దస్త్రాలని నిషేధించారు.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|అనేది అనుమతించబడిన ఫైలు రకం కాదు|అనేవి అనుమతించబడిన ఫైలు రకాలు కాదు}}. అనుమతించబడిన {{PLURAL:$3|ఫైలు రకం|ఫైలు రకాలు}} $2.',
 'api-error-http' => 'అంతర్గత దోషము: సేవకానికి అనుసంధానమవలేకపోతున్నది.',
 'api-error-illegal-filename' => 'ఆ పైల్ పేరు అనుమతించబడదు.',
 'api-error-invalid-file-key' => 'అంతర్గత దోషము: తాత్కాలిక నిల్వలో ఫైల్ కనపడలేదు.',
 'api-error-mustbeloggedin' => 'దస్త్రాలను ఎక్కించడానికి మీరు ప్రవేశించివుండాలి.',
 'api-error-nomodule' => 'అంతర్గత దోషము: ఎక్కింపు పర్వికము అమర్చబడలేదు.',
 'api-error-ok-but-empty' => 'అంతర్గత దోషము: సేవకము నుండి ఎటువంటి స్పందనా లేదు.',
+'api-error-stashfailed' => 'అంతర్గత పొరపాటు: తాత్కాలిక దస్త్రాన్ని భద్రపరచడంలో సేవకి విఫలమైంది.',
 'api-error-unclassified' => 'ఒక తెలియని దోషము సంభవించినది',
-'api-error-unknown-code' => 'తెలియని దోషము: $1',
+'api-error-unknown-code' => 'తెలియని పొరపాటు: "$1".',
+'api-error-unknown-error' => 'అంతర్గత పొరపాటు: మీ దస్త్రాన్ని ఎక్కించేప్పుడు ఏదో పొరపాటు జరిగింది.',
 'api-error-unknown-warning' => 'తెలియని హెచ్చరిక: $1',
+'api-error-unknownerror' => 'తెలియని పొరపాటు: "$1".',
 'api-error-uploaddisabled' => 'ఈ వికీలో ఎక్కింపులని అచేతనం చేసారు.',
 'api-error-verification-error' => 'ఈ ఫైల్ పాడైవుండవచ్చు, లేదా తప్పుడు పొడిగింతను కలిగివుండవచ్చు.',
 
index f43a031..4ddee10 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tetum (Tetun)
+/** Tetum (tetun)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -8,6 +8,7 @@
  * @file
  *
  * @author MF-Warburg
+ * @author Nemo bis
  * @author Reedy
  */
 
@@ -75,9 +76,9 @@ $messages = array(
 'tog-underline' => 'Subliña ligasaun sira:',
 'tog-justify' => 'Justifika parágrafu sira',
 'tog-hideminor' => "Lá'os hatudu muda ki-ki'ik iha mudansa foufoun sira",
-'tog-usenewrc' => 'Uza lista "Mudansa foufoun sira" di\'ak liu (JavaScript)',
+'tog-usenewrc' => 'Iha lista "mudansa foufoun sira" no "lista hateke": Hatudu mudansa iha grupu sira - grupu ida ba pájina ida (presiza JavaScript)',
 'tog-showtoolbar' => 'Hatudu kaixa edita (presiza JavaScript)',
-'tog-watchcreations' => "Hateke pájina sira-ne'ebé ha'u kria",
+'tog-watchcreations' => "Hateke pájina no imajen sira-ne'ebé ha'u kria/tau iha arkivu laran",
 'tog-watchdefault' => "Hateke pájina sira-ne'ebé ha'u edita",
 'tog-watchmoves' => "Hateke pájina sira-ne'ebé ha'u book",
 'tog-watchdeletion' => "Hateke pájina sira-ne'ebé ha'u halakon",
@@ -170,9 +171,11 @@ $messages = array(
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
+'vector-action-protect' => 'Proteje',
 'vector-view-create' => 'Kria',
 'vector-view-edit' => 'Edita',
 'vector-view-history' => 'Haree istória',
+'vector-view-view' => 'Lee',
 'actions' => 'Aksaun sira',
 
 'errorpagetitle' => 'Sala',
@@ -395,11 +398,16 @@ Ita-nia mudansa la armazenadu seidauk!",
 'lineno' => 'Liña $1:',
 
 # Search results
+'searchresults' => 'Rezultadu sira',
+'searchresults-title' => 'Rezultadu sira ba buka "$1"',
 'searchsubtitleinvalid' => "Ita buka tiha ona '''$1'''",
 'prevn' => 'molok {{PLURAL:$1|$1}}',
 '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-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)',
@@ -426,7 +434,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'timezoneregion-europe' => 'Europa',
 'youremail' => 'Korreiu eletróniku:',
 'username' => "Naran uza-na'in:",
-'uid' => "Uza-na'in ID:",
+'uid' => "Númeru uza-na'in:",
 'yourlanguage' => 'Lian:',
 'gender-male' => 'Mane',
 'gender-female' => 'Feto',
@@ -499,6 +507,9 @@ Ita-nia mudansa la armazenadu seidauk!",
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|diferensa|diferensa}}',
 'recentchanges' => 'Mudansa foufoun sira',
+'recentchanges-label-newpage' => 'Pájina foun',
+'recentchanges-label-minor' => "Ne'e mudansa ki'ik",
+'recentchanges-label-bot' => 'Edita husi prosesu automátiku ("bot")',
 'rcshowhideminor' => "$1 muda ki-ki'ik",
 'rcshowhidebots' => '$1 bot sira',
 'rcshowhideliu' => '$1 ema rejista',
@@ -544,6 +555,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'filehist-user' => "Uza-na'in",
 'filehist-comment' => 'Komentáriu',
 'imagelinks' => "Pájina iha ne'ebá fixeiru ne'e",
+'uploadnewversion-linktext' => 'Tau versaun foun imajen nian',
 
 # File reversion
 'filerevert-comment' => 'Razaun:',
@@ -752,6 +764,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'contribslink' => 'kontribuisaun',
 'block-log-flags-nocreate' => 'la bele kria konta foun',
 'block-log-flags-noemail' => 'korreiu eletróniku blokeiu',
+'block-log-flags-nousertalk' => 'la bele edita pájina diskusaun rasik',
 'ipb_already_blocked' => 'Ema ruma blokeiu "$1" tiha ona',
 
 # Move page
@@ -808,6 +821,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'tooltip-ca-unwatch' => 'Hasai pájina ne\'e husi Ita-nia "lista hateke"',
 'tooltip-search' => 'Buka iha {{SITENAME}}',
 'tooltip-search-go' => "Bá pájina ho naran ne'e (se iha)",
+'tooltip-search-fulltext' => "Buka pájina sira-ne'ebé iha testu ne'e iha laran",
 'tooltip-p-logo' => 'Pájina Mahuluk',
 'tooltip-n-mainpage' => 'Vizita Pájina Mahuluk',
 'tooltip-n-mainpage-description' => 'Vizita Pájina Mahuluk',
@@ -851,6 +865,13 @@ Ita-nia mudansa la armazenadu seidauk!",
 'showhidebots' => '($1 bot sira)',
 'ilsubmit' => 'Buka',
 
+# Bad image list
+'bad_image_list' => "Formatu:
+
+Liña hotu tenke komesa ho *
+Ligasaun uluk iha liña tenke ligasaun bá imajen aat.
+Ligasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.",
+
 # EXIF tags
 'exif-make' => 'Fabrikante kámara nian',
 'exif-model' => 'Kámara',
index bb12ce2..76b0027 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tajik (Cyrillic script) (Тоҷикӣ)
+/** Tajik (Cyrillic script) (тоҷикӣ)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -1100,18 +1100,18 @@ $1',
 'large-file' => 'Тавсия шудааст, ки парвандаҳо бузургтар аз $1 набошанд; ин парванда $2 аст.',
 'largefileserver' => 'Ин парванда аз андозаи иҷозат шудаи андозаҳои парванда дар хидматгор бурзургтар аст.',
 'emptyfile' => 'Парвандаи боршуда холӣ ба назар мерасад. Ин масъала мумкин аст хатои навишт дар номи парванда рух дода бошад. Лутфан таъйид кунед, ки оё шумо дар ҳақиқат мехоҳед ин парвандаро бо ҳамин шароит бор кунед.',
-'fileexists' => "Дар ҳоли ҳозир парвандае бо ҳамин ном мавҷуд аст.
-Агар боварӣ надоред, ки мехоҳед он парвандаро тағйир диҳед, лутфан '''<tt>[[:$1]]</tt>'''-ро баррасӣ кунед.
-[[$1|thumb]]",
-'filepageexists' => "Як саҳифаи тавсифот (на парванда) бо ҳамин ном дар '''<tt>[[:$1]]</tt>''' эҷод шуда буд, аммо парвандае бо ҳамин ном дар ҳоли ҳозир мавҷуд нест. Хулосаи ворид кардаи шумо дар саҳифаи тавсифот, пайдо нахоҳад шуд. Барои намоён кардани хулосаи худ, шумо ниёз доред онро дастӣ вироиш кунед.",
-'fileexists-extension' => "Парвандае бо номи мушобеҳ вуҷуд дорад: [[$2|thumb]]
-* Номи парвандаи боргузоришуда истода: '''<tt>[[:$1]]</tt>'''
-* Номи парвандаи вуҷуд дошта: '''<tt>[[:$2]]</tt>'''
-Лутфан як номи дигареро интихоб кунед.",
+'fileexists' => 'Дар ҳоли ҳозир парвандае бо ҳамин ном мавҷуд аст.
+Агар боварӣ надоред, ки мехоҳед он парвандаро тағйир диҳед, лутфан <strong>[[:$1]]</strong>-ро баррасӣ кунед.
+[[$1|thumb]]',
+'filepageexists' => 'Як саҳифаи тавсифот (на парванда) бо ҳамин ном дар <strong>[[:$1]]</strong> эҷод шуда буд, аммо парвандае бо ҳамин ном дар ҳоли ҳозир мавҷуд нест. Хулосаи ворид кардаи шумо дар саҳифаи тавсифот, пайдо нахоҳад шуд. Барои намоён кардани хулосаи худ, шумо ниёз доред онро дастӣ вироиш кунед.',
+'fileexists-extension' => 'Парвандае бо номи мушобеҳ вуҷуд дорад: [[$2|thumb]]
+* Номи парвандаи боргузоришуда истода: <strong>[[:$1]]</strong>
+* Номи парвандаи вуҷуд дошта: <strong>[[:$2]]</strong>
+Лутфан як номи дигареро интихоб кунед.',
 'fileexists-thumbnail-yes' => "Аз акс ба назар мерасад, ки акси андозааш хурд ''(ангуштдона)''. [[$1|thumb]]
-Лутан парвандаро '''<tt>[[:$1]]</tt>''' баррасӣ кунед.
+Лутан парвандаро <strong>[[:$1]]</strong> баррасӣ кунед.
 Агар парвандаи баррасишуда акси хурд карда шудаи он парвандаи аслӣ аст, ниёзе ба боргузории акси хурд нест.",
-'file-thumbnail-no' => "Номи парванда бо '''<tt>$1</tt>''' огоз мешавад. Ба назар мерасад, ки ин парванда як аксе ''(ангуштдона)'' аз акси калонтар бошад.
+'file-thumbnail-no' => "Номи парванда бо <strong>$1</strong> огоз мешавад. Ба назар мерасад, ки ин парванда як аксе ''(ангуштдона)'' аз акси калонтар бошад.
 Агар акси бо андозаи калонтар доред, онро боргузорӣ кунед, вагарна лутфан номи парвандаро тағйир диҳед.",
 'fileexists-forbidden' => 'Дар ҳоли ҳозир, парвандае бо ҳамин ном вуҷуд дорад; лутфан бар гардед ва парвандаи мавриди назари худро бо номи дигар бор кунед. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Дар ҳоли ҳозир парванде бо ҳамин ном дар анбори муштараки парвандаҳо вуҷуд дорад; лутфан бар гардед ва парвандаи мавриди назари худро бо номи дигар бо кунед. [[File:$1|thumb|center|$1]]',
@@ -1215,7 +1215,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'Ҷустуҷӯ бо стандарти MIME',
-'mimesearch-summary' => 'Бо кӯмаки ин саҳифа шумо метавонед парвандаҳое, ки як навъ ба хусус MIME пайдо кунед. Ворид: contenttype/subtype, намуна. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Бо кӯмаки ин саҳифа шумо метавонед парвандаҳое, ки як навъ ба хусус MIME пайдо кунед. Ворид: contenttype/subtype, намуна. <code>image/jpeg</code>.',
 'mimetype' => 'MIME навъ:',
 'download' => 'боргирӣ',
 
@@ -1375,7 +1375,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'linksearch-pat' => 'Ҷустуҷӯи нақш:',
 'linksearch-ns' => 'Фазоином:',
 'linksearch-ok' => 'Ҷустуҷӯ',
-'linksearch-text' => 'Нишонаҳои монанди "*.wikipedia.org"-ро метавон истифода кард.<br />Протоколҳои пуштибонишуда: <tt>$1</tt>',
+'linksearch-text' => 'Нишонаҳои монанди "*.wikipedia.org"-ро метавон истифода кард.<br />Протоколҳои пуштибонишуда: <code>$1</code>',
 'linksearch-line' => '$1 дорои пайванд аз $2 аст',
 'linksearch-error' => 'Нишонаҳо фақат дар ибтидои номи мизбони интернетӣ метавонанд истифода шаванд.',
 
index 325d0ea..82d419a 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tajik (Latin script) (Tojikī)
+/** Tajik (Latin script) (tojikī)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -974,15 +974,15 @@ Sahifahoi dar [[Special:Watchlist|fehristi nazaroti şumo]] buda  '''purrang'''
 'large-file' => 'Tavsija şudaast, ki parvandaho buzurgtar az $1 naboşand; in parvanda $2 ast.',
 'largefileserver' => 'In parvanda az andozai içozat şudai andozahoi parvanda dar xidmatgor burzurgtar ast.',
 'emptyfile' => "Parvandai borşuda xolī ba nazar merasad. In mas'ala mumkin ast xatoi navişt dar nomi parvanda rux doda boşad. Lutfan ta'jid kuned, ki ojo şumo dar haqiqat mexohed in parvandaro bo hamin şaroit bor kuned.",
-'fileexists' => "Dar holi hozir parvandae bo hamin nom mavçud ast.
-Agar bovarī nadored, ki mexohed on parvandaro taƣjir dihed, lutfan '''<tt>[[:$1]]</tt>'''-ro barrasī kuned.
-[[$1|thumb]]",
-'fileexists-extension' => "Parvandae bo nomi muşobeh vuçud dorad: [[$2|thumb]]
-* Nomi parvandai borguzorişuda istoda: '''<tt>[[:$1]]</tt>'''
-* Nomi parvandai vuçud doşta: '''<tt>[[:$2]]</tt>'''
-Lutfan jak nomi digarero intixob kuned.",
+'fileexists' => 'Dar holi hozir parvandae bo hamin nom mavçud ast.
+Agar bovarī nadored, ki mexohed on parvandaro taƣjir dihed, lutfan <strong>[[:$1]]</strong>-ro barrasī kuned.
+[[$1|thumb]]',
+'fileexists-extension' => 'Parvandae bo nomi muşobeh vuçud dorad: [[$2|thumb]]
+* Nomi parvandai borguzorişuda istoda: <strong>[[:$1]]</strong>
+* Nomi parvandai vuçud doşta: <strong>[[:$2]]</strong>
+Lutfan jak nomi digarero intixob kuned.',
 'fileexists-thumbnail-yes' => "Az aks ba nazar merasad, ki aksi andozaaş xurd ''(anguştdona)''. [[$1|thumb]]
-Lutan parvandaro '''<tt>[[:$1]]</tt>''' barrasī kuned.
+Lutan parvandaro <strong>[[:$1]]</strong> barrasī kuned.
 Agar parvandai barrasişuda aksi xurd karda şudai on parvandai aslī ast, nijoze ba borguzoriji aksi xurd nest.",
 'uploadwarning' => 'Ogohiji firistodan',
 'savefile' => 'Zaxirai parvanda',
@@ -1077,7 +1077,7 @@ Jak klik kardani rūi unvoni sutunho boisi taƣjiri tartibi namoişi parvandaho
 
 # MIME search
 'mimesearch' => 'Çustuçū bo standarti MIME',
-'mimesearch-summary' => "Bo kūmaki in sahifa şumo metavoned parvandahoe, ki jak nav' ba xusus MIME pajdo kuned. Vorid: contenttype/subtype, namuna. <tt>image/jpeg</tt>.",
+'mimesearch-summary' => "Bo kūmaki in sahifa şumo metavoned parvandahoe, ki jak nav' ba xusus MIME pajdo kuned. Vorid: contenttype/subtype, namuna. <code>image/jpeg</code>.",
 'mimetype' => "MIME nav':",
 'download' => 'borgirī',
 
@@ -1226,7 +1226,7 @@ Jak klik kardani rūi unvoni sutunho boisi taƣjiri tartibi namoişi parvandaho
 'linksearch-pat' => 'Çustuçūi naqş:',
 'linksearch-ns' => 'Fazoinom:',
 'linksearch-ok' => 'Çustuçū',
-'linksearch-text' => 'Nişonahoi monandi "*.wikipedia.org"-ro metavon istifoda kard.<br />Protokolhoi puştibonişuda: <tt>$1</tt>',
+'linksearch-text' => 'Nişonahoi monandi "*.wikipedia.org"-ro metavon istifoda kard.<br />Protokolhoi puştibonişuda: <code>$1</code>',
 'linksearch-line' => '$1 doroi pajvand az $2 ast',
 'linksearch-error' => 'Nişonaho faqat dar ibtidoi nomi mizboni internetī metavonand istifoda şavand.',
 
index 0a65a7e..29c4f13 100644 (file)
@@ -139,12 +139,12 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#เปลี่ยนทาง', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__ไม่มีสารบัญ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__ไม่มีแกลเลอรี่__', '__NOGALLERY__' ),
-       'noeditsection'           => array( '0', '__ไม่มีแก้เฉพาะส่วน__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'เดือนปัจจุบัน', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'ชื่อเดือนปัจจุบัน', 'CURRENTMONTHNAME' ),
+       'redirect'                  => array( '0', '#เปลี่ยนทาง', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__ไม่มีสารบัญ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__ไม่มีแกลเลอรี่__', '__NOGALLERY__' ),
+       'noeditsection'             => array( '0', '__ไม่มีแก้เฉพาะส่วน__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'เดือนปัจจุบัน', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'ชื่อเดือนปัจจุบัน', 'CURRENTMONTHNAME' ),
 );
 
 $datePreferences = array(
@@ -224,7 +224,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'ซ่อนการแก้ไขโดยผู้ใช้ล็อกอินจากรายการเฝ้าดู',
 'tog-watchlisthideanons' => 'ซ่อนการแก้ไขโดยผู้ใช้นิรนามจากรายการเฝ้าดู',
 'tog-watchlisthidepatrolled' => 'ซ่อนการแก้ไขที่ตรวจแล้วจากรายการเฝ้าดู',
-'tog-nolangconversion' => 'ปิดใช้งานการแปลงอักษรต่างรูป',
 'tog-ccmeonemails' => 'ส่งสำเนาอีเมลกลับมาทุกครั้งที่ส่งหาคนอื่น',
 'tog-diffonly' => 'ไม่แสดงเนื้อหาใต้ส่วนต่างการแก้ไข',
 'tog-showhiddencats' => 'แสดงหมวดหมู่ที่ซ่อนอยู่',
@@ -1498,9 +1497,9 @@ $1",
 สำหรับการดูหรือการค้นหาไฟล์ที่เคยอัปโหลดก่อนหน้านี้ ให้ไปที่[[Special:FileList|รายชื่อไฟล์ที่ถูกอัปโหลด]] การอัปโหลดและการอัปโหลดซ้ำดูได้ที่[[Special:Log/upload|บันทึกการอัปโหลด]] และการลบไฟล์ดูได้ที่[[Special:Log/delete|บันทึกการลบ]]
 
 ถ้าต้องการแทรกไฟล์ลงในหน้าหนึ่งๆ ให้ใช้คำสั่งหนึ่งในรูปแบบต่อไปนี้
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' เพื่อใช้รูปขนาดเต็ม
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|ข้อความอธิบาย]]</nowiki></tt>''' เพื่อใช้รูปย่อขนาดกว้าง 200 พิกเซลในกล่องที่จัดชิดซ้าย โดยมี \"ข้อความอธิบาย\" เป็นคำบรรยายใต้ภาพ
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' สำหรับการเชื่อมโยงไฟล์โดยตรง โดยไม่ปรากฏไฟล์นั้นออกมา",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' เพื่อใช้รูปขนาดเต็ม
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|ข้อความอธิบาย]]</nowiki></code>''' เพื่อใช้รูปย่อขนาดกว้าง 200 พิกเซลในกล่องที่จัดชิดซ้าย โดยมี \"ข้อความอธิบาย\" เป็นคำบรรยายใต้ภาพ
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' สำหรับการเชื่อมโยงไฟล์โดยตรง โดยไม่ปรากฏไฟล์นั้นออกมา",
 'upload-permitted' => 'ชนิดของไฟล์ที่อนุญาตให้ใช้ได้: $1',
 'upload-preferred' => 'ชนิดของไฟล์ที่ควรใช้: $1',
 'upload-prohibited' => 'ชนิดของไฟล์ที่ไม่อนุญาตให้ใช้: $1',
@@ -1542,20 +1541,20 @@ $1",
 'largefileserver' => 'ไฟล์นี้มีขนาดใหญ่กว่าค่าที่อนุญาตให้ใช้ได้',
 'emptyfile' => 'ไฟล์ที่อัปโหลดมาเหมือนไฟล์ว่าง อาจเกิดจากปัญหาพิมพ์ชื่อไฟล์ผิด กรุณาตรวจสอบไฟล์อีกครั้ง และแน่ใจว่าต้องการที่จะอัปโหลดไฟล์นี้',
 'windows-nonascii-filename' => 'วิกินี้ไม่รองรับชื่อไฟล์ที่มีตัวอักษรพิเศษ',
-'fileexists' => "มีไฟล์ชื่อนี้อยู่แล้ว กรุณาตรวจสอบ '''<tt>[[:$1]]</tt>''' หากคุณไม่แน่ใจว่าต้องการเปลี่ยนแปลงไฟล์นี้หรือไม่ [[$1|thumb]]",
-'filepageexists' => "หน้าคำอธิบายสำหรับไฟล์นี้ได้ถูกสร้างไว้แล้วที่ '''<tt>[[:$1]]</tt>''' แต่ไฟล์ชื่อนี้ไม่มีอยู่ในปัจจุบัน
+'fileexists' => 'มีไฟล์ชื่อนี้อยู่แล้ว กรุณาตรวจสอบ <strong>[[:$1]]</strong> หากคุณไม่แน่ใจว่าต้องการเปลี่ยนแปลงไฟล์นี้หรือไม่ [[$1|thumb]]',
+'filepageexists' => 'หน้าคำอธิบายสำหรับไฟล์นี้ได้ถูกสร้างไว้แล้วที่ <strong>[[:$1]]</strong> แต่ไฟล์ชื่อนี้ไม่มีอยู่ในปัจจุบัน
 สาระสำคัญที่คุณบันทึกจะไม่ปรากฏบนหน้าคำอธิบาย
 เพื่อให้สาระสำคัญปรากฏขึ้น คุณจำเป็นต้องแก้ไขด้วยตนเอง
-[[$1|thumb]]",
-'fileexists-extension' => "ไฟล์ที่โหลดมีชื่อใกล้เคียง: [[$2|thumb]]
-* ชื่อไฟล์ที่กำลังอัปโหลด: '''<tt>[[:$1]]</tt>'''
-* ชื่อไฟล์ที่มีอยู่แล้ว: '''<tt>[[:$2]]</tt>'''
-กรุณาเลือกชื่อไฟล์ใหม่",
+[[$1|thumb]]',
+'fileexists-extension' => 'ไฟล์ที่โหลดมีชื่อใกล้เคียง: [[$2|thumb]]
+* ชื่อไฟล์ที่กำลังอัปโหลด: <strong>[[:$1]]</strong>
+* ชื่อไฟล์ที่มีอยู่แล้ว: <strong>[[:$2]]</strong>
+กรุณาเลือกชื่อไฟล์ใหม่',
 'fileexists-thumbnail-yes' => "ไฟล์นี้ดูเหมือนจะเป็นภาพที่ถูกลดขนาดมา ''(รูปย่อ)''
 [[$1|thumb]]
-กรุณาตรวจสอบไฟล์ '''<tt>[[:$1]]</tt>'''
+กรุณาตรวจสอบไฟล์ <strong>[[:$1]]</strong>
 ถ้าตรวจสอบแล้วและพบว่าเป็นภาพเดียวกันกับภาพต้นฉบับ ไฟล์นั้นไม่จำเป็นต้องอัปโหลดเพิ่ม",
-'file-thumbnail-no' => "ชื่อไฟล์ขึ้นต้นด้วย '''<tt>$1</tt>'''
+'file-thumbnail-no' => "ชื่อไฟล์ขึ้นต้นด้วย <strong>$1</strong>
 ภาพนี้ดูเหมือนว่าจะเป็นภาพที่ถูกลดขนาดมา ''(thumbnail)''
 ถ้าคุณมีไฟล์ต้นฉบับขนาดใหญ่กว่านี้ กรุณาอัปโหลดไฟล์ต้นฉบับ หรือเปลี่ยนชื่อไฟล์ด้วย",
 'fileexists-forbidden' => 'ไฟล์ชื่อนี้มีอยู่แล้วในระบบ และไม่สามารถอัปโหลดทับได้
@@ -1755,7 +1754,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'ค้นหาตามชนิดไมม์',
-'mimesearch-summary' => 'หน้านี้แสดงไฟล์ตามการแบ่งของชนิดไมม์ (MIME) ของแต่ละไฟล์ ใส่ค่า: contenttype/subtype เช่น <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'หน้านี้แสดงไฟล์ตามการแบ่งของชนิดไมม์ (MIME) ของแต่ละไฟล์ ใส่ค่า: contenttype/subtype เช่น <code>image/jpeg</code>.',
 'mimetype' => 'ชนิดไมม์:',
 'download' => 'ดาวน์โหลด',
 
@@ -1945,7 +1944,7 @@ $1',
 'linksearch-ok' => 'สืบค้น',
 'linksearch-text' => 'อักขระตัวแทนเช่น "*.wikipedia.org" สามารถใช้ได้
 โดเมนระดับบนสุดจำเป็นต้องมีเป็นอย่างน้อย เช่น "*.org"<br />
-โพรโทคอลที่รองรับ: <tt>$1</tt> (อย่าใส่คำเหล่านี้ในการสืบค้นของคุณ)',
+โพรโทคอลที่รองรับ: <code>$1</code> (อย่าใส่คำเหล่านี้ในการสืบค้นของคุณ)',
 'linksearch-line' => '$1 ถูกลิงก์จาก $2',
 'linksearch-error' => 'เครื่องหมายแทนอักขระ (wildcard) อยู่หน้าชื่อโฮสต์ได้เท่านั้น',
 
@@ -2761,14 +2760,9 @@ $1',
 # Info page
 'pageinfo-title' => 'ข้อมูลสำหรับ "$1"',
 'pageinfo-header-edits' => 'การแก้ไข',
-'pageinfo-header-watchlist' => 'รายการเฝ้าดู',
-'pageinfo-header-views' => 'การเข้าดู',
-'pageinfo-subjectpage' => 'หน้า',
-'pageinfo-talkpage' => 'หน้าพูดคุย',
+'pageinfo-views' => 'จำนวนการเข้าดู',
 'pageinfo-watchers' => 'จำนวนผู้เข้าดู',
 'pageinfo-edits' => 'จำนวนการแก้ไข',
-'pageinfo-views' => 'จำนวนการเข้าดู',
-'pageinfo-viewsperedit' => 'จำนวนการเข้าดูต่อการแก้ไข',
 
 # Skin names
 'skinname-standard' => 'คลาสสิก',
index e840332..8530ecd 100644 (file)
@@ -76,7 +76,7 @@ $messages = array(
 'tog-watchlisthideown' => 'Gözegçilik sanawymdan öz özgerdişlerimi gizle',
 'tog-watchlisthidebots' => 'Gözegçilik sanawymdan bot özgerdişlerini gizle',
 'tog-watchlisthideminor' => 'Gözegçilik sanawymdan ujypsyzja özgerdişleri gizle',
-'tog-watchlisthideliu' => 'Gözegçilik sanawymda, sessiýa açan ulanyjylar tarapyndan edilen özgerdişleri görkezme',
+'tog-watchlisthideliu' => 'Gözegçilik sanawymda, hasaba girilgi ulanyjylaryň özgerdişlerini görkezme',
 'tog-watchlisthideanons' => 'Gözegçilik sanawymda, anonim ulanyjylar tarapyndan edilen özgerdişleri görkezme',
 'tog-watchlisthidepatrolled' => 'Gözegçilik sanawymdan patrullyk edilen özgerdişleri gizle',
 'tog-ccmeonemails' => 'Beýleki ulanyjylara iberen e-poçtalarymyň nusgalaryny maňa-da iber',
@@ -434,14 +434,14 @@ Hasabyňyz açyldy.
 'remembermypassword' => 'Sessiýamy şu kompýuterde ýatda sakla  (iň köp $1 {{PLURAL:$1|günläp|günläp}})',
 'yourdomainname' => 'Siziň domeniňiz:',
 'externaldberror' => 'Ýa tassyklama maglumat bazasynyň säwligi bar ýa-da öz ulanyjy hasabyňyzy täzelemegiňize rugsat berilmeýär.',
-'login' => 'Sessiýa aç',
-'nav-login-createaccount' => 'Sessiýa aç / täze hasap edin',
+'login' => 'Hasaba gir',
+'nav-login-createaccount' => 'Hasaba gir / täze hasap aç',
 'loginprompt' => '{{SITENAME}} saýtynda sessiýa açmak üçin kukileri işletmegiňiz zerurdyr.',
-'userlogin' => 'Sessiýa aç / täze hasap edin',
+'userlogin' => 'Hasaba gir / täze hasap aç',
 'userloginnocreate' => 'Sessiýa aç',
-'logout' => 'Sessiýany ýap',
-'userlogout' => 'Sessiýany ýap',
-'notloggedin' => 'Sessiýa açmansyňyz',
+'logout' => 'Hasapdan çyk',
+'userlogout' => 'Hasapdan çyk',
+'notloggedin' => 'Hasaba girmänsiňiz',
 'nologin' => "Siziň heniz hasabyňyz ýokmy? '''$1'''",
 'nologinlink' => 'Onda özüňize bir hasap ediniň',
 'createaccount' => 'Täze hasap aç',
@@ -453,7 +453,7 @@ Hasabyňyz açyldy.
 'badretype' => 'Girizen parollaryňyz biri-birine gabat gelmeýär.',
 'userexists' => 'Girizen ulanyjy adyňyz ulanylýar.
 Başga bir at saýlamagyňyzy haýyş edýäris.',
-'loginerror' => 'Sessiýa açyş säwligi',
+'loginerror' => 'Hasaba girmekde säwlik',
 'createaccounterror' => 'Hasaby döredip bolmaýar: $1',
 'nocookiesnew' => 'Ulanyjy hasaby döredildi, ýöne sessiýa açmadyňyz.
 {{SITENAME}} sessiýa açmak üçin kukilerden peýdalanýar.
@@ -463,8 +463,8 @@ Olary işletmegiňizi, soňra bolsa täze ulanyjy adyňyz we parolyňyz bilen se
 Siziň kukileriňiz togtadylgy dur.
 Olary işletmegiňizi we gaýtadan synanyşyp görmegiňizi haýyş edýäris.',
 'noname' => 'Dogry bir ulanyjy adyny görkezmediňiz.',
-'loginsuccesstitle' => 'Sessiýa açyldy',
-'loginsuccess' => "'''{{SITENAME}} saýtynda \"\$1\" ulanyjy ady bilen sessiýa açdyňyz.'''",
+'loginsuccesstitle' => 'Hasaba girdiňiz',
+'loginsuccess' => "'''{{SITENAME}} saýtynda \"\$1\" ulanyjy ady bilen hasaba girdiňiz.'''",
 'nosuchuser' => '"$1" diýen at bilen ulanyjy ýok.
 Ulanyjy atlary baş hem-de setir harplara duýgurdyr.
 Ýazylyşyny barlaň ýa-da [[Special:UserLogin/signup|täze hasap açyň]].',
@@ -565,7 +565,7 @@ Parolyňyzy eýýäm şowlulyk bilen üýtgeden ýa-da täze wagtlaýyn parol ta
 'showpreview' => 'Deslapky syny görkez',
 'showlivepreview' => 'Gönümel deslapky syn',
 'showdiff' => 'Üýtgeşmeleri görkez',
-'anoneditwarning' => "'''Duýduryş:''' Sessiýa açmansyňyz. Şonuň üçin hem IP adresiňiz bu sahypanyň özgerdişler geçmişine ýazylyp alynjakdyr.",
+'anoneditwarning' => "'''Üns beriň:''' Hasaba girmänsiňiz. Şonuň üçin hem IP adresiňiz bu sahypanyň özgerdişler geçmişine ýazylyp alynar.",
 'anonpreviewwarning' => "''Sessiýa açmadyňyz. Ýazdyrsaňyz, sahypanyň redaktirleme geçmişine IP adresiňiz ýazylar.''",
 'missingsummary' => "'''Ýatlatma:''' Redaktirleme mazmunyny ýazmadyňyz.
 Sahypany ýazdyr düwmesine ýene bir gezek bassaňyz, özgerdişiňiz mazmunsyz ýazdyrylar.",
@@ -610,7 +610,7 @@ Häzirki IP adresiňiz $3, blokirleme belgiňiz bolsa #$5.
 'nosuchsectiontext' => 'Siz ýok bölümi redaktirlejek bolduňyz.
 Sahypany görýän mahalayňyz onuň ady üýtgedilen ýa-da öçürilen bolmagy mümkin.',
 'loginreqtitle' => 'Sessiýa açmagyňyz zerur',
-'loginreqlink' => 'sessiýa açyň',
+'loginreqlink' => 'hasaba gir',
 'loginreqpagetext' => 'Başga sahypalary görmek üçin $1.',
 'accmailtitle' => 'Parol iberildi.',
 'accmailtext' => "[[User talk:$1|$1]] üçin ugralla döredilen parol $2 adresine iberildi.
@@ -1328,9 +1328,9 @@ Bu sahypanyň öçürme ýa-da at üýtgetme gündeligi aşakda berilýär:",
 Ozaldan ýüklenilgi faýllary görmek ýa-da agtarmak üçin [[Special:FileList|ýüklenilgi faýllaryň sanawyna]] serediň, (gaýtadan) ýüklenenler [[Special:Log/upload|ýükleme gündeliginde]], öçürilenler [[Special:Log/delete|öçürme gündeliginde]] saklanylýar.
 
 Bir sahypada faýl goýmaklyk üçin aşakdaky formlaryň birine görä çykgyt ulanyň;
-* Faýlyň doly wersiýasyny ulanmak üçin: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''
-* Çep gyrada bir gutynyň içinde aşagyna kesgitleme hökmünde 'alt tekst' bilen, 200 piksel giňişligindäki wersiýany ulanmaklyk üçin: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt tekst]]</nowiki></tt>'''
-* Faýly görkezmän, faýla gönümel çykgyt bermek üçin: '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''",
+* Faýlyň doly wersiýasyny ulanmak üçin: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''
+* Çep gyrada bir gutynyň içinde aşagyna kesgitleme hökmünde 'alt tekst' bilen, 200 piksel giňişligindäki wersiýany ulanmaklyk üçin: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt tekst]]</nowiki></code>'''
+* Faýly görkezmän, faýla gönümel çykgyt bermek üçin: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''",
 'upload-permitted' => 'Rugsat berilýän faýl görnüşleri: $1',
 'upload-preferred' => 'Ileri tutulýan faýl görnüşleri: $1.',
 'upload-prohibited' => 'Gadagan edilen faýl görnüşleri: $1.',
@@ -1376,22 +1376,22 @@ bu faýlyň ölçegi $2.',
 'emptyfile' => 'Ýüklän faýlyňyz boş ýaly-la.
 Munuň sebäbi faýlyň adyndaky bir ýalňyşlyk bolmagy ahmal.
 Faýly hakykatdan-da ýüklemek isleýändigiňizi anyklaň.',
-'fileexists' => "Şu atly faýl eýýäm bar.
-Üýtgetmek barada ikirjiňlenýän bolsaňyz, onda ilki bilen '''<tt>[[:$1]]</tt>''' faýlyna bir göz aýlaň.
-[[$1|thumb]]",
-'filepageexists' => "Bu faýl üçin düşündiriş sahypasy '''<tt>[[:$1]]</tt>''' adresinde eýýäm döredilipdir, emma häzir şeýle atly faýl ýok.
+'fileexists' => 'Şu atly faýl eýýäm bar.
+Üýtgetmek barada ikirjiňlenýän bolsaňyz, onda ilki bilen <strong>[[:$1]]</strong> faýlyna bir göz aýlaň.
+[[$1|thumb]]',
+'filepageexists' => 'Bu faýl üçin düşündiriş sahypasy <strong>[[:$1]]</strong> adresinde eýýäm döredilipdir, emma häzir şeýle atly faýl ýok.
 Ýazjak gysgaça mazmunyňyz düşündiriş sahypasynda peýda boljak däldir.
 Mazmunyň şol ýerde peýda bolmaklygy üçin, ony el bilen redaktirlemeli bolýarsyňyz.
-[[$1|thumb]]",
-'fileexists-extension' => "Birmeňzeş atly bir faýl bar: [[$2|thumb]]
-* Ýüklenilýän faýlyň ady: '''<tt>[[:$1]]</tt>'''
-* Bar bolan faýlyň ady: '''<tt>[[:$2]]</tt>'''
-Başga bir at saýlamagyňyzy haýyş edýäris.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Birmeňzeş atly bir faýl bar: [[$2|thumb]]
+* Ýüklenilýän faýlyň ady: <strong>[[:$1]]</strong>
+* Bar bolan faýlyň ady: <strong>[[:$2]]</strong>
+Başga bir at saýlamagyňyzy haýyş edýäris.',
 'fileexists-thumbnail-yes' => "Bu faýl kiçeldilen ölçegli bir surat ýaly-la ''(thumbnail)''.
 [[$1|thumb]]
-'''<tt>[[:$1]]</tt>''' faýlyny barlap görüň.
+<strong>[[:$1]]</strong> faýlyny barlap görüň.
 Eger barlanylan faýl asyl ölçegindäki şol bir surat bolsa, onda goşmaça bir miniatýura ýüklemek hökman däl.",
-'file-thumbnail-no' => "Bu faýlyň ady '''<tt>$1</tt>''' bilen başlanýar.
+'file-thumbnail-no' => "Bu faýlyň ady <strong>$1</strong> bilen başlanýar.
 Bu ölçegi kiçeldilen başga bir surat ýaly-la ''(thumbnail)''
 Eger sizde bu suratyň doly ölçeglisi bar bolsa şony ýükläň, ýogsam faýlyň adyny üýtgediň.",
 'fileexists-forbidden' => 'Şu atly bir faýl bar we onuň üstüne ýazyp bolmaýar.
@@ -1571,7 +1571,7 @@ Goşmaça maglumat üçin [$2 faýl düşündiriş sahypasyna] serediň.',
 # MIME search
 'mimesearch' => 'MIME gözlegi',
 'mimesearch-summary' => 'Bu sahypa faýllaryň  MIME tipi boýunça filtrlenmegini üpjün edýär.
-Giriş formaty: mazmuntip/kiçitip, meselem <tt>surat/jpeg</tt>.',
+Giriş formaty: mazmuntip/kiçitip, meselem <code>surat/jpeg</code>.',
 'mimetype' => 'MIME tipi:',
 'download' => 'düşür',
 
@@ -1756,7 +1756,7 @@ Gündeligiň görnüşini, ulanyjy adyny (baş-setir harpa duýgur), ýa-da täs
 'linksearch-ns' => 'At giňişligi:',
 'linksearch-ok' => 'Gözle',
 'linksearch-text' => '"*.wikipedia.org" ýaly çalşyrma simwollar ulanylyp bilner.<br />
-Goldanylýan protokollar: <tt>$1</tt>',
+Goldanylýan protokollar: <code>$1</code>',
 'linksearch-line' => '$1 sahypasyna $2 sahypasyndan çykgyt berilýär',
 'linksearch-error' => 'Çalşyrma simwollar diňe hostuň adynyň başlangyjynda peýda bolup bilýär.',
 
@@ -2438,9 +2438,9 @@ Kompýuteriňize ýazdyryň we şu ýere ýükläň.',
 'tooltip-pt-preferences' => 'Ileri tutmalaryňyz',
 'tooltip-pt-watchlist' => 'Gözegçilikde saklaýan sahypalarym',
 'tooltip-pt-mycontris' => 'Eden goşantlaryňyzyň sanawy',
-'tooltip-pt-login' => 'Sessiýa açmagyňyz maslahat berilýär, ýöne hökmany däl.',
+'tooltip-pt-login' => 'Hasaba girmegiňiz maslahat berilýär, ýöne hökmany däl.',
 'tooltip-pt-anonlogin' => 'Sessiýa açmagyňyz maslahat berilýär, yöne hökmany däl',
-'tooltip-pt-logout' => 'Sessiýany ýap',
+'tooltip-pt-logout' => 'Hasapdan çyk',
 'tooltip-ca-talk' => 'Sahypanyň mazmuny barada garaýşyňy beýan et',
 'tooltip-ca-edit' => 'Bu sahypany redaktirläp bilersiňiz. Ýazdyrmankaňyz synlap görmekligi ýatdan çykarmaň.',
 'tooltip-ca-addsection' => 'Täze bölüm başlat',
@@ -3069,7 +3069,7 @@ Faýlyň adyny "{{ns:file}}:" pristawkasyz giriziň.',
 * <strong class="mw-specialpagerestricted">Çäklendirilen ýörite sahypalar.</strong>',
 'specialpages-group-maintenance' => 'Tehniki abatlaýyş hasabatlary',
 'specialpages-group-other' => 'Başga ýörite sahypalar',
-'specialpages-group-login' => 'Sessiýa aç / hasap edin',
+'specialpages-group-login' => 'Hasaba gir / täze hasap aç',
 'specialpages-group-changes' => 'Soňky üýtgeşmeler we gündelikler',
 'specialpages-group-media' => 'Media hasabatlary we ýüklemeler',
 'specialpages-group-users' => 'Ulanyjylar we hukuklar',
index 8435208..eea0dee 100644 (file)
@@ -27,8 +27,8 @@ $namespaceNames = array(
        NS_FILE_TALK        => 'Usapang_talaksan',
        NS_MEDIAWIKI        => 'MediaWiki',
        NS_MEDIAWIKI_TALK   => 'Usapang_MediaWiki',
-       NS_TEMPLATE         => 'Suleras',
-       NS_TEMPLATE_TALK    => 'Usapang_suleras',
+       NS_TEMPLATE         => 'Padron',
+       NS_TEMPLATE_TALK    => 'Usapang_padron',
        NS_HELP             => 'Tulong',
        NS_HELP_TALK        => 'Usapang_tulong',
        NS_CATEGORY         => 'Kategorya',
@@ -36,100 +36,114 @@ $namespaceNames = array(
 );
 
 $namespaceAliases = array(
-       'Talaksan'          => NS_FILE,
-       'Usapang talaksan'  => NS_FILE_TALK,
-       'Kaurian'         => NS_CATEGORY,
-       'Usapang_kaurian' => NS_CATEGORY_TALK,
+       'Talaksan'         => NS_FILE,
+       'Usapang talaksan' => NS_FILE_TALK,
+       'Suleras'          => NS_TEMPLATE,
+       'Usapang_suleras'  => NS_TEMPLATE_TALK,
+       'Kaurian'          => NS_CATEGORY,
+       'Usapang_kaurian'  => NS_CATEGORY_TALK,
 );
 
 $specialPageAliases = array(
-       'Allmessages'               => array( 'Lahat ng mga mensahe' ),
-       'Allpages'                  => array( 'Lahat ng mga pahina', 'LahatPahina' ),
-       'Ancientpages'              => array( 'Sinaunang mga pahina' ),
-       'Blankpage'                 => array( 'Tanggalin ang nilalaman ng pahina' ),
-       'Block'                     => array( 'Hadlangan', 'Hadlangan ang IP', 'Hadlangan ang tagagamit' ),
-       'Blockme'                   => array( 'Hadlangang ako' ),
-       'Booksources'               => array( 'Mga pinagmulang aklat' ),
-       'BrokenRedirects'           => array( 'Naputol na mga panturo papunta sa ibang pahina', 'NaputulangPanturo' ),
-       'Categories'                => array( 'Mga kaurian' ),
-       'ChangePassword'            => array( 'Baguhin ang hudyat', 'Muling itakda ang hudyat', 'Muling magtakda ng hudyat' ),
-       'Confirmemail'              => array( 'Tiyakin ang e-liham' ),
-       'Contributions'             => array( 'Mga ambag' ),
-       'CreateAccount'             => array( 'Likhain ang kuwenta', 'LikhaKuwenta' ),
-       'Deadendpages'              => array( 'Mga pahinang sukol', 'Mga pahinang walang lagusan' ),
-       'DeletedContributions'      => array( 'Naburang mga ambag' ),
-       'Disambiguations'           => array( 'Mga paglilinaw', 'Paglilinaw' ),
-       'DoubleRedirects'           => array( 'Nagkadalawang mga panturo papunta sa ibang pahina', 'DoblengPanturo' ),
-       'Emailuser'                 => array( 'Tagagamit ng e-liham' ),
+       'Activeusers'               => array( 'Masisiglang_mga_Tagagamit' ),
+       'Allmessages'               => array( 'Lahat_ng_mga_mensahe' ),
+       'Allpages'                  => array( 'Lahat_ng_mga_pahina', 'LahatPahina' ),
+       'Ancientpages'              => array( 'Sinaunang_mga_pahina' ),
+       'Badtitle'                  => array( 'Masamang_pamagat' ),
+       'Blankpage'                 => array( 'Tanggalin_ang_nilalaman_ng_pahina' ),
+       'Block'                     => array( 'Hadlangan', 'Hadlangan_ang_IP', 'Hadlangan_ang_tagagamit' ),
+       'Blockme'                   => array( 'Hadlangang_ako' ),
+       'Booksources'               => array( 'Mga_pinagmulang_aklat' ),
+       'BrokenRedirects'           => array( 'Naputol_na_mga_panturo_papunta_sa_ibang_pahina', 'NaputulangPanturo' ),
+       'Categories'                => array( 'Mga_kategorya' ),
+       'ChangeEmail'               => array( 'Baguhin_ang_e-liham' ),
+       'ChangePassword'            => array( 'Baguhin_ang_hudyat', 'Muling_itakda_ang_hudyat', 'Muling_magtakda_ng_hudyat' ),
+       'ComparePages'              => array( 'Paghambingin_ang_mga_Pahina' ),
+       'Confirmemail'              => array( 'Tiyakin_ang_e-liham' ),
+       'Contributions'             => array( 'Mga_ambag' ),
+       'CreateAccount'             => array( 'Likhain_ang_kuwenta', 'LikhaKuwenta' ),
+       'Deadendpages'              => array( 'Mga_pahinang_sukol', 'Mga_pahinang_walang_lagusan' ),
+       'DeletedContributions'      => array( 'Naburang_mga_ambag' ),
+       'Disambiguations'           => array( 'Mga_paglilinaw', 'Paglilinaw' ),
+       'DoubleRedirects'           => array( 'Nagkadalawang_mga_panturo_papunta_sa_ibang_pahina', 'DoblengPanturo' ),
+       'EditWatchlist'             => array( 'Baguhin_ang_Bantayan' ),
+       'Emailuser'                 => array( 'Tagagamit_ng_e-liham' ),
        'Export'                    => array( 'Pagluluwas' ),
-       'Fewestrevisions'           => array( 'Pinakakaunting mga pagbabago' ),
-       'FileDuplicateSearch'       => array( 'Paghahanap ng kamukhang talaksan' ),
-       'Filepath'                  => array( 'Daanan ng talaksan' ),
+       'Fewestrevisions'           => array( 'Pinakakaunting_mga_pagbabago' ),
+       'FileDuplicateSearch'       => array( 'Paghahanap_ng_kamukhang_talaksan' ),
+       'Filepath'                  => array( 'Daanan_ng_talaksan' ),
        'Import'                    => array( 'Pag-aangkat' ),
-       'Invalidateemail'           => array( 'Hindi tanggap na e-liham' ),
-       'BlockList'                 => array( 'Talaan ng hinahadlangan', 'Talaan ng mga hinahadlangan', 'Talaan ng hinahadlangang IP' ),
-       'LinkSearch'                => array( 'Paghahanap ng kawing' ),
-       'Listadmins'                => array( 'Talaan ng mga tagapangasiwa' ),
-       'Listbots'                  => array( 'Talaan ng mga bot' ),
-       'Listfiles'                 => array( 'Itala ang mga talaksan', 'Talaan ng mga talaksan', 'Talaan ng mga larawan' ),
-       'Listgrouprights'           => array( 'Talaan ng mga karapatan ng pangkat' ),
-       'Listredirects'             => array( 'Talaan ng mga pagturo sa ibang pahina' ),
-       'Listusers'                 => array( 'Talaan ng mga tagagamit', 'Talaan ng tagagamit' ),
-       'Lockdb'                    => array( 'Ikandado ang kalipunan ng dato' ),
-       'Log'                       => array( 'Tala', 'Mga tala' ),
-       'Lonelypages'               => array( 'Nangungulilang mga pahina', 'Ulilang mga pahina' ),
-       'Longpages'                 => array( 'Mahabang mga pahina' ),
-       'MergeHistory'              => array( 'Pagsanibin ang kasaysayan' ),
-       'MIMEsearch'                => array( 'Paghahanap ng MIME' ),
-       'Mostcategories'            => array( 'Pinakamaraming mga kaurian' ),
-       'Mostimages'                => array( 'Mga talaksang may pinakamaraming kawing', 'Pinakamaraming talaksan', 'Pinakamaraming larawan' ),
-       'Mostlinked'                => array( 'Mga pahinang may pinakamaraming kawing', 'Pinakamaraming kawing' ),
-       'Mostlinkedcategories'      => array( 'Mga kauriang may pinakamaraming kawing', 'Pinakagamiting mga kaurian' ),
-       'Mostlinkedtemplates'       => array( 'Mga suleras na may pinakamaraming kawing', 'Pinakagamiting mga suleras' ),
-       'Mostrevisions'             => array( 'Pinakamaraming mga pagbabago' ),
-       'Movepage'                  => array( 'Ilipat ang pahina' ),
-       'Mycontributions'           => array( 'Mga ambag ko' ),
-       'Mypage'                    => array( 'Pahina ko' ),
-       'Mytalk'                    => array( 'Usapan ko' ),
-       'Newimages'                 => array( 'Bagong mga talaksan', 'Bagong mga larawan' ),
-       'Newpages'                  => array( 'Bagong mga pahina' ),
-       'Popularpages'              => array( 'Sikat na mga pahina' ),
-       'Preferences'               => array( 'Mga nais' ),
-       'Prefixindex'               => array( 'Talatuntunan ng unlapi' ),
-       'Protectedpages'            => array( 'Mga pahinang nakasanggalang' ),
-       'Protectedtitles'           => array( 'Mga pamagat na nakasanggalang' ),
-       'Randompage'                => array( 'Alin man', 'Alin mang pahina' ),
-       'Randomredirect'            => array( 'Pagtuturo papunta sa alin mang pahina' ),
-       'Recentchanges'             => array( 'Mga huling binago', 'HulingBinago' ),
-       'Recentchangeslinked'       => array( 'Nakakawing ng kamakailang pagbabago', 'Kaugnay na mga pagbabago' ),
-       'Revisiondelete'            => array( 'Pagbura ng pagbabago' ),
+       'Invalidateemail'           => array( 'Hindi_tanggap_na_e-liham' ),
+       'JavaScriptTest'            => array( 'Pagsubok_sa_JavaScript' ),
+       'BlockList'                 => array( 'Talaan_ng_hinahadlangan', 'Talaan_ng_mga_hinahadlangan', 'Talaan_ng_hinahadlangang_IP' ),
+       'LinkSearch'                => array( 'Paghahanap_ng_kawing' ),
+       'Listadmins'                => array( 'Talaan_ng_mga_tagapangasiwa' ),
+       'Listbots'                  => array( 'Talaan_ng_mga_bot' ),
+       'Listfiles'                 => array( 'Itala_ang_mga_talaksan', 'Talaan_ng_mga_talaksan', 'Talaan_ng_mga_larawan' ),
+       'Listgrouprights'           => array( 'Talaan_ng_mga_karapatan_ng_pangkat' ),
+       'Listredirects'             => array( 'Talaan_ng_mga_pagturo_sa_ibang_pahina' ),
+       'Listusers'                 => array( 'Talaan_ng_mga_tagagamit', 'Talaan_ng_tagagamit' ),
+       'Lockdb'                    => array( 'Ikandado_ang_kalipunan_ng_datos' ),
+       'Log'                       => array( 'Tala', 'Mga_tala' ),
+       'Lonelypages'               => array( 'Nangungulilang_mga_pahina', 'Ulilang_mga_pahina' ),
+       'Longpages'                 => array( 'Mahabang_mga_pahina' ),
+       'MergeHistory'              => array( 'Pagsanibin_ang_kasaysayan' ),
+       'MIMEsearch'                => array( 'Paghahanap_ng_MIME' ),
+       'Mostcategories'            => array( 'Pinakamaraming_mga_kategorya' ),
+       'Mostimages'                => array( 'Mga_talaksang_may_pinakamaraming_kawing', 'Pinakamaraming_talaksan', 'Pinakamaraming_larawan' ),
+       'Mostlinked'                => array( 'Mga_pahinang_may_pinakamaraming_kawing', 'Pinakamaraming_kawing' ),
+       'Mostlinkedcategories'      => array( 'Mga_kategoryang_may_pinakamaraming_kawing', 'Pinakagamiting_mga_kategorya' ),
+       'Mostlinkedtemplates'       => array( 'Mga_suleras_na_may_pinakamaraming_kawing', 'Pinakagamiting_mga_suleras' ),
+       'Mostrevisions'             => array( 'Pinakamaraming_mga_pagbabago' ),
+       'Movepage'                  => array( 'Ilipat_ang_pahina' ),
+       'Mycontributions'           => array( 'Mga_ambag_ko' ),
+       'Mypage'                    => array( 'Pahina_ko' ),
+       'Mytalk'                    => array( 'Usapan_ko' ),
+       'Myuploads'                 => array( 'Mga_Pagkakarga_Kong_Paitaas' ),
+       'Newimages'                 => array( 'Bagong_mga_talaksan', 'Bagong_mga_larawan' ),
+       'Newpages'                  => array( 'Bagong_mga_pahina' ),
+       'PasswordReset'             => array( 'Muling_Pagtatakda_ng_Hudyat' ),
+       'PermanentLink'             => array( 'Pamalagiang_Kawing' ),
+       'Popularpages'              => array( 'Sikat_na_mga_pahina' ),
+       'Preferences'               => array( 'Mga_nais' ),
+       'Prefixindex'               => array( 'Talatuntunan_ng_unlapi' ),
+       'Protectedpages'            => array( 'Mga_pahinang_nakasanggalang' ),
+       'Protectedtitles'           => array( 'Mga_pamagat_na_nakasanggalang' ),
+       'Randompage'                => array( 'Alin_man', 'Alin_mang_pahina' ),
+       'Randomredirect'            => array( 'Pagtuturo_papunta_sa_alin_mang_pahina' ),
+       'Recentchanges'             => array( 'Mga_huling_binago', 'HulingBinago' ),
+       'Recentchangeslinked'       => array( 'Nakakawing_ng_kamakailang_pagbabago', 'Kaugnay_na_mga_pagbabago' ),
+       'Revisiondelete'            => array( 'Pagbura_ng_pagbabago' ),
+       'RevisionMove'              => array( 'Paglipat_ng_Rebisyon' ),
        'Search'                    => array( 'Maghanap' ),
-       'Shortpages'                => array( 'Maikling mga pahina' ),
-       'Specialpages'              => array( 'Natatanging mga pahina' ),
-       'Statistics'                => array( 'Mga estadistika', 'Estadistika' ),
-       'Tags'                      => array( 'Mga tatak' ),
-       'Uncategorizedcategories'   => array( 'Mga kauriang walang kaurian' ),
-       'Uncategorizedimages'       => array( 'Mga talaksang walang kaurian', 'Mga larawang walang kaurian' ),
-       'Uncategorizedpages'        => array( 'Mga pahinang walang kaurian' ),
-       'Uncategorizedtemplates'    => array( 'Mga suleras na walang kaurian' ),
-       'Undelete'                  => array( 'Huwag burahin' ),
-       'Unlockdb'                  => array( 'Huwag ikandado ang kalipunan ng dato' ),
-       'Unusedcategories'          => array( 'Hindi ginagamit na mga kaurian' ),
-       'Unusedimages'              => array( 'Hindi ginagamit na mga talaksan', 'Hindi ginagamit na mga larawan' ),
-       'Unusedtemplates'           => array( 'Mga suleras na hindi ginagamit' ),
-       'Unwatchedpages'            => array( 'Mga pahinang hindi binabantayanan' ),
+       'Shortpages'                => array( 'Maikling_mga_pahina' ),
+       'Specialpages'              => array( 'Natatanging_mga_pahina' ),
+       'Statistics'                => array( 'Mga_estadistika', 'Estadistika' ),
+       'Tags'                      => array( 'Mga_tatak' ),
+       'Unblock'                   => array( 'Huwag_hadlangan' ),
+       'Uncategorizedcategories'   => array( 'Mga_kauriang_walang_kaurian' ),
+       'Uncategorizedimages'       => array( 'Mga_talaksang_walang_kaurian', 'Mga_larawang_walang_kaurian' ),
+       'Uncategorizedpages'        => array( 'Mga_pahinang_walang_kaurian' ),
+       'Uncategorizedtemplates'    => array( 'Mga_suleras_na_walang_kaurian' ),
+       'Undelete'                  => array( 'Huwag_burahin' ),
+       'Unlockdb'                  => array( 'Huwag_ikandado_ang_kalipunan_ng_dato' ),
+       'Unusedcategories'          => array( 'Hindi_ginagamit_na_mga_kaurian' ),
+       'Unusedimages'              => array( 'Hindi_ginagamit_na_mga_talaksan', 'Hindi_ginagamit_na_mga_larawan' ),
+       'Unusedtemplates'           => array( 'Mga_suleras_na_hindi_ginagamit' ),
+       'Unwatchedpages'            => array( 'Mga_pahinang_hindi_binabantayanan' ),
        'Upload'                    => array( 'Magkarga' ),
-       'Userlogin'                 => array( 'Paglagda ng tagagamit', 'Maglagda' ),
-       'Userlogout'                => array( 'Pag-alis sa pagkalagda ng tagagamit', 'AlisLagda' ),
-       'Userrights'                => array( 'Mga karapatan ng tagagamit' ),
-       'Version'                   => array( 'Bersyon' ),
-       'Wantedcategories'          => array( 'Ninanais na mga kaurian' ),
-       'Wantedfiles'               => array( 'Ninanais na mga talaksan' ),
-       'Wantedpages'               => array( 'Ninanais na mga pahina', 'Putol na mga kawing' ),
-       'Wantedtemplates'           => array( 'Ninanais na mga suleras' ),
-       'Watchlist'                 => array( 'Talaan ng binabantayan', 'Bantayan' ),
-       'Whatlinkshere'             => array( 'Ano ang nakakawing dito' ),
-       'Withoutinterwiki'          => array( 'Walang ugnayang-wiki' ),
+       'UploadStash'               => array( 'Pagkakarga_ng_mga_Nakatago' ),
+       'Userlogin'                 => array( 'Paglagda_ng_tagagamit', 'Maglagda' ),
+       'Userlogout'                => array( 'Pag-alis_sa_pagkalagda_ng_tagagamit', 'AlisLagda' ),
+       'Userrights'                => array( 'Mga_karapatan_ng_tagagamit' ),
+       'Version'                   => array( 'Bersiyon' ),
+       'Wantedcategories'          => array( 'Ninanais_na_mga_kaurian' ),
+       'Wantedfiles'               => array( 'Ninanais_na_mga_talaksan' ),
+       'Wantedpages'               => array( 'Ninanais_na_mga_pahina', 'Putol_na_mga_kawing' ),
+       'Wantedtemplates'           => array( 'Ninanais_na_mga_suleras' ),
+       'Watchlist'                 => array( 'Talaan_ng_binabantayan', 'Bantayan' ),
+       'Whatlinkshere'             => array( 'Ano_ang_nakakawing_dito' ),
+       'Withoutinterwiki'          => array( 'Walang_ugnayang-wiki' ),
 );
 
 $messages = array(
@@ -140,7 +154,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ikubli ang napatrolyang mga pagbabagong nasa kamakailang mga pagbabago',
 'tog-newpageshidepatrolled' => 'Itago ang napatrolyang mga pahina mula talaan ng bagong pahina',
 'tog-extendwatchlist' => 'Palawigin ang talaan ng mga binabantayan upang maipakita ang lahat ng mga pagbabago, hindi lamang ang pinakakamakailan lamang',
-'tog-usenewrc' => 'Gamitin ang pinadagdagang huling binago (kailangan ng JavaScript)',
+'tog-usenewrc' => 'Mga pagbabago ng pangkat ayon sa pahina sa kamakailang mga pagbabago at bantayan (nangangailangan ng JavaScript)',
 'tog-numberheadings' => 'Automatikong bilangin ang mga pamagat',
 'tog-showtoolbar' => "Ipakita ang ''toolbar'' ng pagbabago (JavaScript)",
 'tog-editondblclick' => 'Magbago ng mga pahina sa dalawahang pagpindot (JavaScript)',
@@ -148,17 +162,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Payagan ang mga pagbabagong panseksyon sa pakanang pagpindot ng mga panseksyong pamagat (JavaScript)',
 'tog-showtoc' => 'Ipakita ang talaan ng mga nilalaman (sa mga pahinang may higit sa 3 punong pamagat)',
 'tog-rememberpassword' => 'Tandaan ang paglagda ko sa panghanaphanap na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
-'tog-watchcreations' => 'Idagdag ang mga pahinang nilikha ko sa aking tala ng mga binabantayan',
-'tog-watchdefault' => 'Idagdag ang mga pahinang binago ko sa aking tala ng mga binabantayan',
-'tog-watchmoves' => 'Idagdag ang mga pahinang inilipat ko sa aking tala ng mga binabantayan',
-'tog-watchdeletion' => 'Idagdag mga pahinang ibinura ko sa aking tala ng mga binabantayan',
+'tog-watchcreations' => 'Idagdag sa aking tala ng mga binabantayan ang mga pahinang nilikha ko at mga talaksang ikinarga kong paitaas',
+'tog-watchdefault' => 'Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang binago ko',
+'tog-watchmoves' => 'Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang inilipat ko',
+'tog-watchdeletion' => 'Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang binura ko',
 'tog-minordefault' => 'Markahan ang lahat ng pagbabago bilang maliit nang nakatakda',
 'tog-previewontop' => 'Ipakita ang paunang tingin bago ang kahon ng pagbabago',
 'tog-previewonfirst' => 'Ipakita ang paunang tingin sa unang pagbabago',
 'tog-nocache' => 'Huwag paganahin ang pagtatago ng pahinang pantingintingin',
-'tog-enotifwatchlistpages' => 'Padalhan ako ng e-liham kapag nabago ang isa sa mga pahinang binabantayan ko',
+'tog-enotifwatchlistpages' => 'Padalhan ako ng e-liham kapag nabago ang isa sa pahina o talaksang binabantayan ko',
 'tog-enotifusertalkpages' => 'Padalhan ako ng e-liham kapag binago ang aking pahina ng usapan',
-'tog-enotifminoredits' => 'Padalhan din ako ng e-liham para sa mga maliliit na pagbabago ng mga pahina',
+'tog-enotifminoredits' => 'Padalhan din ako ng e-liham para sa mga maliliit na mga pagbabago ng mga pahina at mga talaksan',
 'tog-enotifrevealaddr' => 'Ipakita ang aking direksiyong e-liham sa loob ng mga e-liham ng pagpapahayag',
 'tog-shownumberswatching' => 'Ipakita ang bilang ng mga nagbabantay na tagagamit',
 'tog-oldsig' => 'Umiiral na lagda:',
@@ -174,7 +188,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Itago ang mga pagbabago ng mga nakalagdang tagagamit mula sa tala ng mga binabantayan',
 'tog-watchlisthideanons' => 'Itago ang mga pagbabago ng hindi nakikilalang mga tagagamit mula sa tala ng mga binabantayan',
 'tog-watchlisthidepatrolled' => 'Itago ang napatrolyang mga pagbabago mula sa tala ng mga binabantayan',
-'tog-nolangconversion' => 'Huwag paganahin ang pagpapalit ng mga halagang nagkakaibaiba (baryante)',
 'tog-ccmeonemails' => 'Padalahan ako ng mga kopya ng mga ipinadala kong e-liham sa ibang mga tagagamit',
 'tog-diffonly' => 'Huwag ipakita ang nilalaman ng pahinang nasa ilalim ng mga pagkakaiba',
 'tog-showhiddencats' => 'Ipakita ang mga nakatagong kategorya',
@@ -262,6 +275,9 @@ $messages = array(
 'index-category' => 'Mga pahinang may talatuntunan',
 'noindex-category' => 'Mga pahinang walang talatuntunan',
 'broken-file-category' => 'Mga pahina na may sirang mga kawing ng talaksan',
+'categoryviewer-pagedlinks' => '($1) ($2)',
+
+'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
 'about' => 'Patungkol',
 'article' => 'Pahina ng nilalaman',
@@ -395,12 +411,20 @@ $1',
 Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 
 'ok' => 'Sige',
+'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '← $1',
 'retrievedfrom' => 'Ikinuha mula sa "$1"',
 'youhavenewmessages' => 'Mayroon kang $1 ($2).',
 'newmessageslink' => 'mga bagong mensahe',
 'newmessagesdifflink' => 'huling pagbabago',
+'youhavenewmessagesfromusers' => 'Mayroon kang $1 magmula sa {{PLURAL:$3|ibang tagagamit|$3 mga tagagamit}} ($2).',
+'youhavenewmessagesmanyusers' => 'Mayroon kang $1 magmula sa maraming mga tagagamit ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|isang bagong mensahe|bagong mga mensahe}}',
+'newmessagesdifflinkplural' => 'huling {{PLURAL:$1|pagbabago|mga pagbabago}}',
 'youhavenewmessagesmulti' => 'Mayroon kang mga bagong mensahe sa $1',
 'editsection' => 'baguhin',
+'editsection-brackets' => '[$1]',
 'editold' => 'baguhin',
 'viewsourceold' => 'tingnan ang pinagmulan',
 'editlink' => 'baguhin',
@@ -421,6 +445,8 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 'site-atom-feed' => '$1 kargang Atom',
 'page-rss-feed' => '"$1" kargang RSS',
 'page-atom-feed' => '"$1" kargang Atom',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1 (hindi umiiral ang pahina)',
 'sort-descending' => 'Pagsunud-sunurin na bumababa',
 'sort-ascending' => 'Pagsunud-sunurin na tumataas',
@@ -450,12 +476,12 @@ Matatagpuan ang isang tala ng mga tamang natatanging pahina sa [[Special:Special
 # General errors
 'error' => 'Kamalian',
 'databaseerror' => 'Kamalian sa kalipunan ng dato',
-'dberrortext' => 'Nagkaroon po ng isang pagkakamali sa usisang pampalaugnayan sa kalipunan ng datos.
-Maaaring dahil ito sa depekto sa sopwer (\'\'software\'\').
-Ang huling sinubukang paguusisa sa kalipunan ng datos ay:
-<blockquote><tt>$1</tt></blockquote>
-mula sa gawaing "<tt>$2</tt>".
-Ibinalik ng kalipunan ng datos ang kamaliang "<tt>$3: $4</tt>".',
+'dberrortext' => 'Naganap ang isang pagkakamali sa pag-uusisa na pampalaugnayan sa kalipunan ng dato.
+Maaaring magpahiwatig ito ng isang surot sa loob ng sopwer.
+Ang huling tinangkang pag-uusisa sa kalipunan ng dato ay:
+<blockquote><code>$1</code></blockquote>
+magmula sa loob ng tungkuling "<code>$2</code>".
+Nagbalik ang kalipunan ng dato ng kamalian na "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Nagkaroon po ng isang pagkakamali sa usisang pampalaugnayan sa kalipunan ng datos.
 Ang huling sinubukang paguusisa sa kalipunan ng datos ay:
 "$1"
@@ -492,6 +518,8 @@ Pakiulat ito sa isang [[Special:ListUsers/sysop|tagapangasiwa]], na ibinibigay a
 'cannotdelete' => 'Hindi mabura ang pahina o talaksang "$1".
 Maaaring ibinura na ito ng iba.',
 'cannotdelete-title' => 'Hindi maibura ang pahinang "$1"',
+'delete-hook-aborted' => 'Pinigil ng sungkit ang pagbura.
+Walang ibinigay na paliwanag.',
 'badtitle' => 'Hindi kanais-nais na pamagat',
 'badtitletext' => 'Ang hiniling na pamagat ng pahina ay hindi katanggap-tanggap, wala, o isang may-maling kawing na pamagat na pangugnayang-wika (interwika) o pangugnayang wiki (interwiki).
 Maaaring naglalaman ito ng isa o higit pang mga panitik (karakter) na hindi maaaring gamitin para sa mga pamagat.',
@@ -528,6 +556,8 @@ Ang ibinigay na dahilan ay ''$2''.",
 Ang tagapangasiwang nagkandado nito ay nag-alok ng ganitong paliwanag: "$3".',
 'invalidtitle-knownnamespace' => 'Hindi katanggap-tanggap na pamagat na may puwang na pampangalang "$2" at tekstong "$3"',
 'invalidtitle-unknownnamespace' => 'Hindi katanggap-tanggap na pamagat na mayroong hindi nalalamang bilang na pampuwang ng pangalan na $1 at tekstong "$2"',
+'exception-nologin' => 'Hindi nakalagda',
+'exception-nologin-text' => 'Ang pahina o kilos na ito ay nangangailangan ng paglagda mo sa wiking ito.',
 
 # Virus scanner
 'virus-badscanner' => "Masamang kompigurasyon: hindi kilalang tagahagilap (iskaner) ng birus: ''$1''",
@@ -548,6 +578,7 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'remembermypassword' => 'Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
 'securelogin-stick-https' => 'Manatiling konektado sa HTTPS matapos lumagda',
 'yourdomainname' => 'Dominyo mo:',
+'password-change-forbidden' => 'Hindi mo maaaring palitan ang mga hudyat sa wiking ito.',
 'externaldberror' => 'Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.',
 'login' => 'Lumagda',
 'nav-login-createaccount' => 'Lumagda / lumikha ng kuwenta',
@@ -579,6 +610,7 @@ Hindi mo pinagagana ang mga kuki.
 Paki-andar mo ang mga ito at sumubok uli.",
 'nocookiesfornew' => 'Hindi nalikha ang akawnt ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito.
 Tiyaking mayroon kang pinagaganang mga otap, ikargang muli ang pahinang ito at subuking muli.',
+'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'Hindi mo tinukoy ang isang tanggap na pangalan ng tagagamit.',
 'loginsuccesstitle' => 'Matagumpay ang paglagda',
 'loginsuccess' => "'''Nakalagda ka na sa {{SITENAME}} bilang si \"\$1\".'''",
@@ -805,17 +837,20 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} baguhin ang pahinang ito]</span>.',
 'noarticletext-nopermission' => 'Kasalukuyang walang teksto sa pahinang ito.
 Maaari mong [[Special:Search/{{PAGENAME}}|hanapin ang pamagat ng pahinang ito]] sa ibang mga pahina,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa kaugnay na mga talaan]</span>.',
+'missing-revision' => 'Hindi umiiral ang rebisyong #$1 ng pahinang napangalanang "{{PAGENAME}}".
+
+Karaniwang itong dulot ng pagsunod sa isang wala na sa panahong kawing ng kasaysayan na papunta sa isang pahinang nabura na.
+Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].',
 'userpage-userdoesnotexist' => 'Hindi nakatala ang kuwenta ng tagagamit na "<nowiki>$1</nowiki>".
 Pakisuri kung ibig mong likhain/baguhin ang pahinang ito.',
 'userpage-userdoesnotexist-view' => 'Hindi nakatala ang kuwenta ng tagagamit na "$1".',
 'blocked-notice-logextract' => 'Kasalukuyang hinarang ang tagagamit na ito.
 Ang pinakahuling entrada sa talaan  ng pagharang ay ibinigay sa baba para sa inyong pagsasangguni:',
-'clearyourcache' => "'''Paunawa: Pagkatapos magsagip, baka kailangan mong laktawan ang taguan ng pantingin-tingin mo upang makita ang mga pagbabago.
-'''Firefox / Safari:''' Panatilihin ang pagpindot sa ''Shift'' habang nilalagitik ang ''Reload'', o pindutin ang ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sa Mac)
-'''Google Chrome:''' Pindutin ang ''Ctrl-Shift-R'' (''⌘-Shift-R'' sa Mac)
+'clearyourcache' => "'''Paunawa: Pagkatapos magsagip, maaaring kailanganing mong laktawan ang taguan ng iyong pantingin-tingin upang makita ang mga pagbabago.
+'''Firefox / Safari:''' Panatilihin ang pagpindot sa ''Shift'' habang nilalagitik ang ''Reload'', o pindutin ang ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sa isang Mac)
+'''Google Chrome:''' Pindutin ang ''Ctrl-Shift-R'' (''⌘-Shift-R'' sa isang Mac)
 '''Internet Explorer:''' Panatilihin ang pagpindot sa ''Ctrl'' habang nilalagitik ang ''Refresh'', o pindutin ang ''Ctrl-F5''
-'''Konqueror:''' Lagitikin ang ''Reload'' o pindutin ang ''F5''
-'''Opera:''' Linisin ang taguan sa ''Tools → Preferences''",
+'''Opera:''' Hawiin ang taguan sa loob ng ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Balato:''' Gamitin ang pindutang \"{{int:showpreview}}\" upang masubok ang bago mong CSS bago sagipin.",
 'userjsyoucanpreview' => "'''Balato:''' Gamitin ang pindutang \"{{int:showpreview}}\" upang masubok ang bago mong JavaScript bago sagipin.",
 'usercsspreview' => "'''Tandaan mong paunang tingin pa lamang ito ng iyong CSS na pantagagamit.'''
@@ -891,19 +926,20 @@ Ang pinakahuling entrada sa talaan ay ibinigay sa baba para sa inyong pagsasangg
 'template-semiprotected' => '(bahagyang nakasanggalang)',
 'hiddencategories' => 'Ang pahinang ito ay kasapi sa {{PLURAL:$1|1 nakatagong kategorya|$1 nakatagong kategorya}}:',
 'edittools' => '<!-- Ang teksto rito ay ipapakita sa ilalim ng mga pormularyo ng pagbabago at pagkarga. -->',
+'edittools-upload' => '-',
 'nocreatetitle' => 'May hangganan ang paglikha ng pahina',
 'nocreatetext' => 'Naglagay ng hangganan (restriksyon/limitasyon) ang {{SITENAME}} sa kakayahang makalikha ng bagong mga pahina.
 Maaari kang bumalik at magbago ng isang umiiral na pahina, o kaya [[Special:UserLogin|lumagda o lumikha ng kuwenta/akawnt]].',
-'nocreate-loggedin' => 'Walang kang pahintulot para lumikha ng bagong mga pahina.',
+'nocreate-loggedin' => 'Wala kang pahintulot para lumikha ng bagong mga pahina.',
 'sectioneditnotsupported-title' => 'Hindi sinusuportahan ang pagpapatnugot ng seksyon',
 'sectioneditnotsupported-text' => 'Hindi sinusuportahan ang pagpapatnugot ng seksyon sa pahinang ito.',
 'permissionserrors' => 'Mga kamalian sa mga pahintulot',
 'permissionserrorstext' => 'Wala kang pahintulot na gawin iyan, dahil sa sumusunod na {{PLURAL:$1|dahilan|mga dahilan}}:',
 'permissionserrorstext-withaction' => 'Wala kang pahintulot na $2, dahil sa sumusunod na {{PLURAL:$1|dahilan|mga dahilan}}:',
-'recreate-moveddeleted-warn' => "'''Babala: Muli mong inililikha ang isang pahinang binura na dati.'''
+'recreate-moveddeleted-warn' => "'''Babala: Muli mong nililikha ang isang pahinang binura na dati.'''
 
 Dapat mong isaalang-alang kung nararapat bang ipagpatuloy ang pagbago sa pahinang ito.
-Ang tala ng pagbubura at paglilipat para sa pahinang ito ay ibinigay dito para sa inyong kaginhawaan:",
+Ang tala ng pagbubura at paglilipat para sa pahinang ito ay ibinigay dito para sa kaginhawaan:",
 'moveddeleted-notice' => 'Ibinura na ang pahinang ito.
 Ang tala ng pagbubura at paglilipat para sa pahinang ito ibinigay sa baba para sa inyong pagsasangguni.',
 'log-fulllog' => 'Tingnan ang buong tala',
@@ -936,6 +972,7 @@ Hindi isasama ang ilang mga suleras.',
 'expansion-depth-exceeded-warning' => 'Lumampas ang pahina sa lalim ng paglawak',
 'parser-unstrip-loop-warning' => 'Napansin ang silo ng hindi pagtalop',
 'parser-unstrip-recursion-limit' => 'Nalampasan ang hangganan ng rekursiyon ng hindi pagtalop ($1)',
+'converter-manual-rule-error' => 'Napansin ang kamalian sa alituntunin ng kinakamay na pagpapalit ng wika',
 
 # "Undo" feature
 'undo-success' => 'Matatanggal ang pagbabago.
@@ -1104,6 +1141,7 @@ Tiyakin na ang pagbabago ay makapagpapanatili ng pagkakatuluy-tuloy ng pahinang
 'mergehistory-comment' => 'Pinagsanib ang [[:$1]] sa [[:$2]]: $3',
 'mergehistory-same-destination' => 'Pinagmulan at patutunguhan hindi dapat magkatulad',
 'mergehistory-reason' => 'Dahilan:',
+'mergehistory-revisionrow' => '$1 ($2) $3 . . $4 $5 $6',
 
 # Merge log
 'mergelog' => 'Tala ng pagsasanib',
@@ -1122,6 +1160,10 @@ Tiyakin na ang pagbabago ay makapagpapanatili ng pagkakatuluy-tuloy ng pahinang
 'editundo' => 'ibalik',
 'diff-multi' => '({{PLURAL:$1|Isang panggitnang pagbabago|$1 panggitnang mga pagbabago}} ng {{PLURAL:$2|isang tagagamit|$2 mga tagagamit}} ang hindi ipinakikita.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Isang panggitnang pagbabago|$1 panggitnang mga pagbabago}} ng {{PLURAL:$2|isang tagagamit|$2 mga tagagamit}} ang hindi ipinapakikita.)',
+'difference-missing-revision' => 'Hindi natagpuan ang {{PLURAL:$2|isang rebisyon|$2 mga rebisyon}} ng kaibahang ($1) ito.
+
+Karaniwang itong isinanhi ng pagsunod sa isang wala na sa panahong kawing sa pagkakaiba na papunta sa isang pahinang nabura na.
+Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].',
 
 # Search results
 'searchresults' => 'Kinalabasan/Resulta ng paghahanap',
@@ -1276,7 +1318,9 @@ Hindi ito maibabalik sa dating gawi.',
 'username' => 'Bansag:',
 'uid' => 'ID ng tagagamit:',
 'prefs-memberingroups' => 'Kasapi ng {{PLURAL:$1|na pangkat|na mga pangkat}}:',
+'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Oras ng pagtatala:',
+'prefs-registration-date-time' => '$1',
 'yourrealname' => 'Tunay na pangalan:',
 'yourlanguage' => 'Wika:',
 'yourvariant' => 'Iba pang anyo ng wika ng nilalaman:',
@@ -1298,7 +1342,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'prefs-help-email' => 'Hindi talaga kailangang may tirahan ng e-liham, subalit kailangan para sa muling pagtatakda ng hudyat, kung makalimutan mo ang hudyat mo.',
 'prefs-help-email-others' => 'Mapipili mo rin na makipag-ugnayan sa iyo ang iba sa pamamagitan ng iyong pahina ng tagagamit o usapan na hindi kailangang ilantad ang katauhan mo.',
 'prefs-help-email-required' => 'Kailangan ang direksiyong e-liham.',
-'prefs-info' => 'Payak na kabatiran',
+'prefs-info' => 'Saligang kabatiran',
 'prefs-i18n' => 'Internasyonalisasyon',
 'prefs-signature' => 'Lagda',
 'prefs-dateformat' => 'Anyo ng petsa',
@@ -1338,6 +1382,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'userrights-notallowed' => 'Walang pahintulot ang akawnt mo na magdagdag o magtanggal ng mga karapatan ng tagagamit.',
 'userrights-changeable-col' => 'Mga pangkat na maaari mong baguhin',
 'userrights-unchangeable-col' => 'Mga pangkat na hindi mo mababago',
+'userrights-irreversible-marker' => '$1*',
 
 # Groups
 'group' => 'Pangkat:',
@@ -1388,6 +1433,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'right-writeapi' => 'Gamit ng sinulat na API',
 'right-delete' => 'Burahin ang mga pahina',
 'right-bigdelete' => 'Burahin ang mga pahinang may malaking mga kasaysayan',
+'right-deletelogentry' => 'Burahin at huwag burahin ang partikular na mga lahok sa talaan',
 'right-deleterevision' => 'Burahin at tanggalin sa pagkabura ang isang partikular na mga pagbabago ng mga pahina',
 'right-deletedhistory' => 'Tingnan ang mga binurang pinasok na kasaysayan, na wala ang kanilang nakakabit na teksto',
 'right-deletedtext' => 'Tingnan ang naburang teksto at mga pagbabago sa pagitan ng dalawang mga rebisyon',
@@ -1495,9 +1541,11 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'minoreditletter' => 'm',
 'newpageletter' => 'B',
 'boteditletter' => 'b',
+'unpatrolledletter' => '!',
 'number_of_watching_users_pageview' => '[$1 binabantayang {{PLURAL:$1|tagagamit|mga tagagamit}}]',
 'rc_categories' => 'Itakda lang sa mga kaurian (ihiwalay sa pamamagitan ng "|")',
 'rc_categories_any' => 'Kahit ano',
+'rc-change-size' => '$1',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|mga byte}} pagkaraan ng pagbabago',
 'newsectionsummary' => '/* $1 */ bagong seksyon',
 'rc-enhanced-expand' => 'Ipakita ang mga detalye (kailangan ng JavaScript)',
@@ -1532,9 +1580,9 @@ Ang talaan ng pagbubura at paglipat para sa pahinang ito ay ibinigay dito para s
 Para tingnan o maghanap ng mga dati nang naikargang mga talaksan pumunta sa  [[Special:FileList|talaan ng ikinargang mga talaksan]], ang (muling) mga pagkakarga ay nakatala rin sa [[Special:Log/upload|talaan ng pagkarga]], ang mga binura/nabura sa  [[Special:Log/delete|talaan ng pagbubura]].
 
 Para maisama ang isang talaksan sa loob ng isang pahina, gumamit ng isang kawing na nasa loob ng isa sa mga sumusunod na mga pormularyo:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' para magamit ang buong bersyon ng talaksan
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' para magamit ang isang may 200 piksel na paghabi sa loob ng isang kahong nasa kaliwang pataan na may 'tekstong pamalit' ('' 'alt text' '') bilang paglalarawan
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' para sa tuwirang pagkakawing sa isang pahina na hindi ipinapakita ang talaksan",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' para magamit ang buong bersyon ng talaksan
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' para magamit ang isang may 200 piksel na paghabi sa loob ng isang kahong nasa kaliwang pataan na may 'tekstong pamalit' ('' 'alt text' '') bilang paglalarawan
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para sa tuwirang pagkakawing sa isang pahina na hindi ipinapakita ang talaksan",
 'upload-permitted' => 'Pinapahintulutang mga uri ng talaksan: $1.',
 'upload-preferred' => 'Mas iniibig na mga uri ng talaksan: $1.',
 'upload-prohibited' => 'Ipinagbabawal na mga uri ng talaksan: $1.',
@@ -1579,20 +1627,20 @@ ang talaksang ito ay $2.',
 'largefileserver' => 'Mas malaki ang talaksan kaysa nakatakdang papahintulutan ng serbidor.',
 'emptyfile' => 'Mukhang walang laman ang talaksan (file) na ikinarga mo. Maaaring dahil ito sa maling pagkapasok ng pangalan ng talaksan.  Paki tingin kung gusto mo talagang ikarga ang talaksan na ito.',
 'windows-nonascii-filename' => 'Ang wiking ito ay hindi nagsusuporta ng mga pangalan ng talaksan na mayroong natatanging mga panitik.',
-'fileexists' => "Mayroon ng talaksan na ganitong pangalan, paki tingin ang '''<tt>[[:$1]]</tt>''' kung tiyak ka na babaguhin ito.
-[[$1|thumb]]",
-'filepageexists' => "Ang pahina ng paglalarawan para sa talaksan na ito ay nalikha na sa '''<tt>[[:$1]]</tt>''', ngunit walang talaksang umiiral na may ganitong pangalan.
+'fileexists' => 'Mayroon ng talaksan na ganitong pangalan, paki tingin ang <strong>[[:$1]]</strong> kung tiyak ka na babaguhin ito.
+[[$1|thumb]]',
+'filepageexists' => 'Ang pahina ng paglalarawan para sa talaksan na ito ay nalikha na sa <strong>[[:$1]]</strong>, ngunit walang talaksang umiiral na may ganitong pangalan.
 Hindi lilitaw ang buod na ipapasok mo sa pahina ng paglalarawan.
 Para lumitaw ang buod mo doon, kailangan mong kinakamay na baguhin ito.
-[[$1|thumb]]",
-'fileexists-extension' => "Mayroon talaksan na ganitong pangalan: [[$2|thumb]]
-* Pangalan ng ikinakargang talaksan: '''<tt>[[:$1]]</tt>'''
-* Pangalan ng umiiral na talaksan: '''<tt>[[:$2]]</tt>'''
-Pumili ng ibang pangalan.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Mayroon talaksan na ganitong pangalan: [[$2|thumb]]
+* Pangalan ng ikinakargang talaksan: <strong>[[:$1]]</strong>
+* Pangalan ng umiiral na talaksan: <strong>[[:$2]]</strong>
+Pumili ng ibang pangalan.',
 'fileexists-thumbnail-yes' => "Mukhang pinaliit ''(thumbnail)'' na larawan ang talaksan. [[$1|thumb]]
-Paki tingin ang talaksan '''<tt>[[:$1]]</tt>'''.
+Paki tingin ang talaksan <strong>[[:$1]]</strong>.
 Kung ang tinignan na talaksan ay ang kaparehong larawan ng orihinal na laki, hindi na kailangang magkarga ng panibagong ''thumbnail''.",
-'file-thumbnail-no' => "Nagsisimula ang pangalan ng talaksan sa '''<tt>$1</tt>'''.  Tila ito'y isang larawan na may pinaliit na sukat''(thumbnail)''.
+'file-thumbnail-no' => "Nagsisimula ang pangalan ng talaksan sa <strong>$1</strong>.  Tila ito'y isang larawan na may pinaliit na sukat''(thumbnail)''.
 Kung mayroon ang larawang ito ng pinakamataas na resolution, ikarga ito, kung hindi paki palitan ang pangalan ng talaksan.",
 'fileexists-forbidden' => 'Umiiral na ang isang talaksang may ganitong pangalan, at hindi maaaring patungan.
 Kung nais mo pa ring ikarga pataas ang iyong talaksan, paki bumalik lamang at gumamit ng isang bagong pangalan.
@@ -1624,6 +1672,20 @@ bumalik at ikarga ang talaksan na ito sa bagong pangalan. [[File:$1|thumb|center
 'watchthisupload' => 'Bantayan ang talaksang ito',
 'filewasdeleted' => 'Isang talaksan na may ganitong pangalan ay naikarga dati at nabura. Kailangan mong tingnan ang $1 bago magpatuloy sa pagkarga nito muli.',
 'filename-bad-prefix' => "Ang talaksan na ikakarga mo ay nagsisimula sa '''\"\$1\"''', na isang hindi naglalarawang pangalan na karaniwang tinatakda ng mga kamerang digital. Paki pili ang isang mas naglalarawang pangalan para sa iyong talaksan.",
+'filename-prefix-blacklist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Ang palaugnayan ay ang sumusunod:
+#   * Ang lahat ng mga bagay mula sa isang panitik na "#" hanggang sa katapusan ng isang guhit ay isang puna
+#   * Bawat isang guhit na mayroong laman ay isang unlapi para sa tipikal na mga pangalan ng talaksan na kusang itinalaga ng mga kamerang dihital
+CIMG # Casio
+DSC_ # Nikon
+DSCF # Fuji
+DSCN # Nikon
+DUW # ilang mga teleponong mobilo
+IMG # heneriko
+JD # Jenoptik
+MGP # Pentax
+PICT # samu\'t sari
+ #</pre> <!-- leave this line exactly as it is -->',
 'upload-success-subj' => 'Matagumpay na pagkakarga',
 'upload-success-msg' => 'Matagumpay ang ikinarga mo mula sa [$2].  Makukuha ito mula rito: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'Problema sa pagkarga',
@@ -1685,6 +1747,7 @@ Kapag nagpatuloy ang suliranin, makipagugnayan sa isang [[Special:ListUsers/syso
 'lockmanager-fail-releaselock' => 'Hindi mapakawalan ang kandado para sa "$1".',
 'lockmanager-fail-db-bucket' => 'Hindi sapat na makaugnay sa mga kalipunang pandato ng kandado sa timba na $1.',
 'lockmanager-fail-db-release' => 'Hindi mapakawalan ang mga kandado sa kalipunan ng dato na $1.',
+'lockmanager-fail-svr-acquire' => 'Hindi magawang kunin ang mga kandado sa tagapaghain na $1.',
 'lockmanager-fail-svr-release' => 'Hindi mapakawalan ang mga kandado sa tagapaghain na $1.',
 
 # ZipDirectoryReader
@@ -1804,6 +1867,9 @@ Marahil ay naisa mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawa
 'uploadnewversion-linktext' => 'Magkarga ng isang bagong bersyon ng talaksang ito',
 'shared-repo-from' => 'mula sa $1',
 'shared-repo' => 'isang pinagsasaluhang repositoryo',
+'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
+'filepage.css' => '/* Ang Cascading Style Sheets na inilagay dito ay kabilang sa pahina ng paglalarawan ng talaksan, na kabilang din sa mga wiki ng dayuhang kliyente */',
+'upload-disallowed-here' => 'Sa kasamaang palad hindi mo muling masusulatan ang imaheng ito.',
 
 # File reversion
 'filerevert' => 'Ibalik sa dati ang $1',
@@ -1837,7 +1903,7 @@ Marahil ay naisa mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawa
 
 # MIME search
 'mimesearch' => 'Maghanap ng MIME',
-'mimesearch-summary' => 'Pinapagana ng pahinang ito ang pagsasala ng mga talaksan para sa kanyang uri ng MIME. Pagpapasok: uringnilalaman/mababangkabahaginguri, hal. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Pinapagana ng pahinang ito ang pagsasala ng mga talaksan para sa kanyang uri ng MIME. Pagpapasok: uringnilalaman/mababangkabahaginguri, hal. <code>image/jpeg</code>.',
 'mimetype' => 'Uri ng MIME:',
 'download' => "magkargang-pakuha ng talaksan (''download'')",
 
@@ -1883,9 +1949,9 @@ Marahil ay naisa mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawa
 
 'disambiguations' => 'Mga pahinang nakakawing sa mga pahina ng paglilinaw',
 'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Ang sumusunod ay mga pahinang may ugnay (link) sa isang '''pahinang naglilinaw'''.
-Dapat silang umugnay sa tamang paksa<br />
-Tinuturing ang isang pahina bilang pahinang naglilinaw kung ginagamit nito ang isang suleras (template) na nakaugnay mula sa [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Ang sumusunod na mga pahina ay naglalaman ng kahit na isang kawing na papunta sa isang '''pahina ng paglilinaw'''.
+Sa halip, maaaring kailanganing kumawing ang mga ito sa isang mas naaangkop na pahina.<br />
+Ang isang pahina ay itinuturing bilang pahina ng paglilinaw kung gumagamit ito ng isang suleras na nakakawing magmula sa [[MediaWiki:Disambiguationspage|MediaWiki:Pahina ng mga paglilinaw]].",
 
 'doubleredirects' => 'Mga dobleng karga',
 'doubleredirectstext' => 'Nagtatala ang pahinang ito ng mga pahinang pumupunta sa iba pang mga pahinang nililipatan.  Naglalaman ang bawat hanay ng mga kawing sa una ang pangalawang kapupuntahan, maging ng puntiryang pangalawang kapupuntahan, na karaniwang "tunay" na puntiryang pahina, na dapat kinatuturuan ng unang pupuntahan.
@@ -1909,10 +1975,11 @@ Nasugpo na ang mga ipinasok na <del>inekisan</del>.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|mga byte}}',
 'ncategories' => '$1 {{PLURAL:$1|kategorya|mga kategorya}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|mga interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|ugnay|mga ugnay}}',
 'nmembers' => '$1 {{PLURAL:$1|kasapi|mga kasapi}}',
 'nrevisions' => '$1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
-'nviews' => '$1 {{PLURAL:$1|nakita|mga nakikita}}',
+'nviews' => '$1 {{PLURAL:$1|pagtingin|mga pagtingin}}',
 'nimagelinks' => 'Ginamit sa $1 {{PLURAL:$1|pahina|mga pahina}}',
 'ntransclusions' => 'ginamit sa $1 {{plural:$1|pahina|mga pahina}}',
 'specialpage-empty' => 'Walang resulta para sa ulat na ito.',
@@ -1937,6 +2004,7 @@ Nasugpo na ang mga ipinasok na <del>inekisan</del>.',
 'mostlinkedtemplates' => 'Pinakamaraming ugnay sa mga suleras',
 'mostcategories' => 'Mga artikulong may pinakamaraming kategorya',
 'mostimages' => 'Pinakamaraming ugnay sa mga larawan',
+'mostinterwikis' => 'Mga pahinang mayroong pinakamaraming mga interwiki',
 'mostrevisions' => 'Mga artikulong may pinakamaraming pagbabago',
 'prefixindex' => 'Lahat ng mga pahinang may unlapi',
 'prefixindex-namespace' => 'Lahat ng mga pahinang may unlapi ($1 puwang ng pangalan)',
@@ -1977,6 +2045,7 @@ Pakitandaan lamang na ang iba mga websayt ay maaaring nakakawing sa isang talaks
 # Book sources
 'booksources' => 'Mapagkukuhanang mga aklat',
 'booksources-search-legend' => 'Maghanap ng mapagkukunang aklat',
+'booksources-isbn' => 'ISBN:',
 'booksources-go' => 'Punta',
 'booksources-text' => 'Matatagpuan sa ibaba ang mga tala ng mga ugnay sa ibang mga websayt na nagbebenta ng bago at nagamit na mga aklat, at maaring mayroon din
 na iba pang impormasyon tungkol sa mga aklat na hinahanap mo:',
@@ -2037,7 +2106,7 @@ Tingnan din ang [[Special:WantedCategories|ninanais na mga kategorya]].',
 'linksearch-ok' => 'Hanapin',
 'linksearch-text' => 'Maaaring gamitin ang mga "barahang pamalit" na katulad ng "*.wikipedia.org".
 Kailangan ng kahit na isang nasasakupang mataas ang kaantasan, halimbawa na ang "*.org".<br />
-Sinusuportahang mga protokolo: <tt>$1</tt> (huwag idagdag ang anuman sa mga ito sa paghahanap mo).',
+Sinusuportahang mga protokolo: <code>$1</code> (huwag idagdag ang anuman sa mga ito sa paghahanap mo).',
 'linksearch-line' => '$1 nakakawing/nakaugnay mula sa $2',
 'linksearch-error' => "Lilitaw lamang ang mga \"barahang-pamalit\" (''wildcard'') sa simula ng pangunahin/punong-abalang pangalan.",
 
@@ -2069,6 +2138,8 @@ Maaaring may mga [[{{MediaWiki:Listgrouprights-helppage}}|karagdagang kabatiran]
 'listgrouprights-rights' => 'Mga karapatan',
 'listgrouprights-helppage' => 'Help:Mga pangkat ng karapatan',
 'listgrouprights-members' => '(tala ng mga kasapi)',
+'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' => 'Maaaring idagdag ang {{PLURAL:$2|pangkat|mga pangkat}} na: $1',
 'listgrouprights-removegroup' => 'Maaaring tanggalin ang {{PLURAL:$2|pangkat|mga pangkat}} na: $1',
 'listgrouprights-addgroup-all' => 'Maaaring idagdag ang lahat ng mga pangkat',
@@ -2082,6 +2153,8 @@ Maaaring may mga [[{{MediaWiki:Listgrouprights-helppage}}|karagdagang kabatiran]
 'mailnologin' => 'Walang adres na mapagpapadalahan',
 'mailnologintext' => 'Kailangan mong [[Special:UserLogin|lumagda]] at magkaroon ng tanggap na e-liham sa iyong [[Special:Preferences|mga kagustuhan]] para makapagpadala ng e-liham sa ibang mga tagagamit.',
 'emailuser' => 'Padalhan ng e-liham ang tagagamit',
+'emailuser-title-target' => 'Padalhan ng elektronikong liham ang {{GENDER:$1|tagagamit}} na ito',
+'emailuser-title-notarget' => 'Padalhan ng e-liham ang tagagamit',
 'emailpage' => 'Magpadala ng e-liham sa tagagamit',
 'emailpagetext' => 'Magagamit mo ang pormularyo sa ibaba para makapagpadala ng mensahe sa pamamagitan ng isang e-liham para sa tagagamit na ito.
 Ang ipinasok mong direksiyong e-liham sa [[Special:Preferences|iyong mga kagustuhan ng tagagamit]] ay lilitaw bilang adres na "Mula kay" ng e-liham, para tuwirang makatugon sa iyo ang nakatanggap.',
@@ -2112,6 +2185,7 @@ Ang ipinasok mong direksiyong e-liham sa [[Special:Preferences|iyong mga kagustu
 # User Messenger
 'usermessage-summary' => 'Nag-iiwan ng mensaheng pangsistema.',
 'usermessage-editor' => 'Mensahero ng sistema',
+'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
 'watchlist' => 'Mga binabantayan ko',
@@ -2227,6 +2301,8 @@ magpatuloy na may pagiingat.',
 'rollback' => 'Mga pagbabagong may kaugnayan sa pagpapagulong na pabalik sa (mas) dati',
 'rollback_short' => 'Pagulunging pabalik sa (mas) dati',
 'rollbacklink' => 'pagulunging pabalik sa (mas) dati',
+'rollbacklinkcount' => 'pagulunging pabalik ang $1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
+'rollbacklinkcount-morethan' => 'pagulunging pabalik ang mahigit sa $1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
 'rollbackfailed' => 'Nabigo ang pagpapagulong na pabalik sa (mas) dati',
 'cantrollback' => 'Hindi maibalik ang pagbabago; tanging ang may-akda lamang ng pahinang ito ang huling tagapagambag/tagapaglathala.',
 'alreadyrolled' => 'Hindi mapagulong na pabalik sa dati ang huling pagbabago ng [[$1]] ni ([[User talk:$2|Usapan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2257,10 +2333,10 @@ Tingnan ang [[Special:ProtectedPages|talaan ng pinuprutektahang mga pahina]] par
 'prot_1movedto2' => 'Inilipat ang [[$1]] patungo sa [[$2]]',
 'protect-badnamespace-title' => 'Hindi mapupruteksiyunang puwang ng pangalan',
 'protect-badnamespace-text' => 'Hindi mapupruteksiyunan ang mga pahinang nasa puwang na pampangalang ito.',
-'protect-legend' => 'Pagtibayin/tiyakin ang panananggalang',
+'protect-legend' => 'Tiyakin ang panananggalang',
 'protectcomment' => 'Dahilan:',
 'protectexpiry' => 'Magtatapos sa:',
-'protect_expiry_invalid' => 'Hindi tanggap/hindi tama ang oras ng pagtatapos.',
+'protect_expiry_invalid' => 'Hindi katanggap-tanggap ang oras ng pagtatapos.',
 'protect_expiry_old' => 'Nasa nakaraan ang oras ng pagtatapos.',
 'protect-unchain-permissions' => 'Huwag ikandado ang iba pang mga pagpipilian ng pagprutekta',
 'protect-text' => "Maaari mong tingnan at baguhin dito ang antas ng pananananggalang para sa pahinang '''$1'''.",
@@ -2360,6 +2436,7 @@ Tingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa isang talaan ng m
 $1',
 'undelete-show-file-confirm' => 'Nakatitiyak ka bang ibig mong tanawin ang isang nabura nang pagbabago ng talaksang "<nowiki>$1</nowiki>" mula $2 noong $3?',
 'undelete-show-file-submit' => 'Oo',
+'undelete-revisionrow' => '$1 $2 ($3) $4 . . $5 $6 $7',
 
 # Namespace form on various pages
 'namespace' => 'Espasyo ng pangalan:',
@@ -2396,6 +2473,7 @@ Ang pinakahuling entrada sa talaan  ng pagharang ay ibinigay sa ibaba para sa pa
 'sp-contributions-username' => 'IP Address o bansag:',
 'sp-contributions-toponly' => 'Ipakita lang ang mga pamamatnugot na mga huling rebisyon',
 'sp-contributions-submit' => 'Hanapin',
+'sp-contributions-explain' => '',
 
 # What links here
 'whatlinkshere' => 'Mga nakaturo dito',
@@ -2536,6 +2614,7 @@ Tingnan ang [[Special:BlockList|talaan ng pagharang]] para sa lista ng kasalukuy
 'proxyblocker-disabled' => 'Nakapatay ang pagharang sa proxy.',
 'proxyblockreason' => 'Hinarang ang IP address mo dahil bukas na proxy ito. Makipag-ugnayan sa iyong tagabigay ng serbisyong Internet o suportang teknikal at ipaalam sa kanila itong seryesong suliranin sa seguridad.',
 'proxyblocksuccess' => 'Tapos na.',
+'sorbs' => 'DNSBL',
 'sorbsreason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito.',
 'sorbs_create_account_reason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito. Hindi ka makakalikha ng akawnt',
 'cant-block-while-blocked' => 'Hindi mo mahahadlangan/mahaharang ang ibang mga tagagamit habang hinahadlangan ka.',
@@ -2722,6 +2801,7 @@ Naitatala sa [[Special:Log/import|tala ng inangkat]] ang lahat ng mga transwikin
 'import-interwiki-templates' => 'Isama ang lahat ng mga suleras',
 'import-interwiki-submit' => 'Mag-angkat',
 'import-interwiki-namespace' => 'Kapupuntahang espasyo ng pangalan:',
+'import-interwiki-rootpage' => 'Ugat na pahina ng kapupuntahan (maaaring wala ito):',
 'import-upload-filename' => 'Pangalan ng talaksan:',
 'import-comment' => 'Komento:',
 'importtext' => 'Pakiluwas ang talaksan magmula sa pinagmulang wiki na ginagamit ang [[Special:Export|kasangkapang pangluwas]].  
@@ -2754,6 +2834,9 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'import-error-interwiki' => 'Hindi naangkat ang pahinang "$1" dahil ang pangalan nito ay nakalaan para sa pagkakawing na panlabas (interwiki).',
 'import-error-special' => 'Hindi naangkat ang pahinang "$1" dahil pag-aari ito ng isang natatanging puwang na pampangalan na hindi nagpapahintulot ng mga pahina.',
 'import-error-invalid' => 'Hindi naangkat ang pahinang "$1" dahil hindi katanggap-tanggap ang pangalan nito.',
+'import-options-wrong' => 'Maling {{PLURAL:$2|pili|mga mapipili}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Ang ibinigay na ugat na pahina ay isang hindi katanggap-tanggap na pamagat.',
+'import-rootpage-nosubpage' => 'Ang puwang ng pangalan na "$1" ng ugat na pahina ay hindi nagpapahintulot ng kabahaging mga pahina.',
 
 # Import log
 'importlogpage' => 'Talaan ng pagaangkat',
@@ -2840,32 +2923,43 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'tooltip-upload' => 'Simulan ang pagkarga',
 'tooltip-rollback' => 'Ibinabalik ng "Pagulungin pabalik sa dati" ang (mga) pagbabago sa pahinang ito patungo sa huling bersyon ng huling tagapagambag sa pamamagitan ng isang pindot lamang.',
 'tooltip-undo' => 'Ibinabalit ng "Ibalik" ang pagbabagong ito at binubuksan ang pahinang gawaan ng pagbabago sa anyong paunang-tingin muna.  Nagpapahintulot na makapagdagdag ng dahilan sa buod.',
-'tooltip-preferences-save' => 'Itakda ang mga kagustuhan',
+'tooltip-preferences-save' => 'Sagipin ang mga nais',
 'tooltip-summary' => 'Magbigay ng maikling buod',
 
 # 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 CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Bugkaw na Kolon (''Cologne Blue'') */",
+'cologneblue.css' => "/* Ang Cascading Style Sheets na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Bughaw na Kolown (''Cologne Blue'') */",
 'monobook.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Monobook */',
 'myskin.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa lahat ng mga tagagamit ng pabalat na Balatko (''MySkin'') */",
 'chick.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na ''Chick'' */",
 'simple.css' => "/* Ang CSS na iniligay dito ay makakaapekto sa mga tagagamit ng Payak (''Simple'') na pabalat */",
 'modern.css' => "/* Ang CSS na iniligay dito ay makakaapekto sa tagagamit ng Makabagong (''Modern'') pabalat */",
+'vector.css' => '/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng pabalat na Vector */',
 'print.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa kalalabasan o resulta ng paglilimbag */',
 'handheld.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa mga aparatong nahahawakan (''handheld device'') batay sa itinakdang pabalat sa ''\$wgHandheldStyle'' */",
+'noscript.css' => '/* Ang inilagay na Cascading Style Sheets dito ay makakaapekto sa mga tagagamit na hindi nagpapagana ng JavaScript */',
+'group-autoconfirmed.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga tagagamit na kusang natiyak */',
+'group-bot.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga bot */',
+'group-sysop.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets) dito ay makakaapekto lamang sa mga tagapagpaandar ng sistema */',
+'group-bureaucrat.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga burokrata */',
 
 # Scripts
-'common.js' => '/* Anumang JavaScript dito ay ikakarga para sa lahat ng mga tagagamit ng bawat pahinang ikinarga. */',
-'standard.js' => '/* Anumang JavaScript dito ay ikakarga para lahat ng mga tagagamit na gumagamit ng Karaniwang pabalat */',
-'nostalgia.js' => '/* Anumang JavaScript dito ay ikakarga para lahat ng mga tagagamit na gumagamit ng pabalat na Nostalgia */',
-'cologneblue.js' => '/* Anumang JavaScript dito ay ikakarga para sa tagagamit ng pabalat na Bughaw na Kolon */',
-'monobook.js' => '/* Anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na MonoBook */',
-'myskin.js' => '/* Anumang JavaScript dito ay ikakarga para sa tagagamit na gumagamit ng pabalat na Balatko */',
-'chick.js' => "/* Anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na ''Chick'' */",
-'simple.js' => '/* Anumang JavaScript dito ay ikakarga para sa tagagamit na gumagamit ng Payak na pabalat */',
-'modern.js' => '/* Anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Makabagong pabalat */',
+'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 */',
+'group-bot.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga bot lamang */',
+'group-sysop.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagapagpaandar ng sistema lamang */',
+'group-bureaucrat.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga burokrata lamang */',
 
 # Metadata
 'notacceptable' => 'Hindi makapagbigay ng dato ang serbidor ng wiki sa anyong mababasa ng iyong kliyente.',
@@ -2894,26 +2988,46 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
 
 # Info page
 'pageinfo-title' => 'Kabatiran para sa "$1"',
-'pageinfo-header-edits' => 'Mga pagpatnugot',
-'pageinfo-header-watchlist' => 'Bantayan ko',
-'pageinfo-header-views' => 'Mga pagtanaw',
-'pageinfo-subjectpage' => 'Pahina',
-'pageinfo-talkpage' => 'Pahina ng usapan',
-'pageinfo-watchers' => 'Bilang ng mga nagbabantay',
-'pageinfo-edits' => 'Bilang ng mga pamamatnugot',
-'pageinfo-authors' => 'Bilang ng magkakabukod na mga may-akda',
+'pageinfo-header-basic' => 'Saligang kabatiran',
+'pageinfo-header-edits' => 'Kasaysayan ng pamamatnugot',
+'pageinfo-header-restrictions' => 'Pruteksiyon ng pahina',
+'pageinfo-header-properties' => 'Mga kaarian ng pahina',
+'pageinfo-display-title' => 'Pamagat na ipinapakita',
+'pageinfo-default-sort' => 'Likas na nakatakdang susi ng pag-uuri',
+'pageinfo-length' => 'Haba ng pahina (na nasa mga byte)',
+'pageinfo-article-id' => 'ID ng pahina',
+'pageinfo-robot-policy' => 'Katayuan ng makinang panghanap',
+'pageinfo-robot-index' => 'Matataluntunan',
+'pageinfo-robot-noindex' => 'Hindi matataluntunan',
 'pageinfo-views' => 'Bilang ng mga pagtanaw',
-'pageinfo-viewsperedit' => 'Pagtanaw sa bawat pagbago',
+'pageinfo-watchers' => 'Bilang ng mga nagbabantay ng pahina',
+'pageinfo-redirects-name' => 'Napapapunta sa pahinang ito',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Mga kabahaging pahina ng pahinang ito',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pagpapapunta sa ibang pahina|mga pagpapapunta sa ibang pahina}}; $3 {{PLURAL:$3|hindi pagpapapunta sa ibang pahina|mga hindi pagpapapunta sa ibang pahina}})',
+'pageinfo-firstuser' => 'Tagapaglikha ng pahina',
+'pageinfo-firsttime' => 'Petsa ng paglikha ng pahina',
+'pageinfo-lastuser' => 'Pinakahuling patnugot',
+'pageinfo-lasttime' => 'Petsa ng pinakahuling pagpatnugot',
+'pageinfo-edits' => 'Kabuuang bilang ng mga pamamatnugot',
+'pageinfo-authors' => 'Kabuuang bilang ng magkakabukod na mga may-akda',
+'pageinfo-recent-edits' => 'Kamakailang bilang ng mga pamamatnugot (sa loob ng huling $1)',
+'pageinfo-recent-authors' => 'Kamakailang bilang ng magkakabukod na mga may-akda',
+'pageinfo-restriction' => 'Pruteksiyon ng pahina (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|Salita|Mga salita}}ng mahiwaga ($1)',
+'pageinfo-hidden-categories' => 'Nakatagong {{PLURAL:$1|kategorya|mga kategorya}} ($1)',
+'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 Kolon',
+'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',
 
 # Patrolling
 'markaspatrolleddiff' => 'Tatakan bilang napatrolya na',
@@ -2951,12 +3065,14 @@ $1',
 Maaaring manganib ang iyong sistema kapag ipinagana mo ito.",
 'imagemaxsize' => "Takdang hangganan sa laki ng larawan: <br />''(para sa mga pahina ng paglalarawan ng talaksan)''",
 'thumbsize' => 'Maliit na sukat (parang "kuko sa hinlalaki" lamang):',
+'widthheight' => '$1 × $2',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pahina|mga pahina}}',
 'file-info' => 'sukat ng talaksan: $1, tipo ng MIME: $2',
 'file-info-size' => '$1 × $2 piksel, sukat ng talaksan: $3, tipo ng MIME: $4',
 'file-info-size-pages' => '$1 × $2 mga piksel, sukat ng talaksan: $3, uri ng MIME: $4, $5 {{PLURAL:$5|pahina|mga pahina}}',
 'file-nohires' => 'Walang makuhang mas mataas na resolusyon (kalinawan).',
 'svg-long-desc' => 'Talaksang SVG, nasa mga bilang na $1 × $2 mga piksel, sukat ng talaksan: $3',
+'svg-long-desc-animated' => 'Animadong talaksang SVG, nasa mga bilang na $1 × $2 mga piksel, sukat ng talaksan: $3',
 'show-big-image' => 'Buong resolusyon (kalinawan)',
 'show-big-image-preview' => 'Sukat ng paunang-tingin na ito: $1.',
 'show-big-image-other' => 'Iba pang {{PLURAL:$2|resolusyon|mga resolusyon}}: $1.',
@@ -2966,6 +3082,8 @@ Maaaring manganib ang iyong sistema kapag ipinagana mo ito.",
 'file-info-png-looped' => 'nakalikaw',
 'file-info-png-repeat' => 'pinaandar ng $1 {{PLURAL:$1|ulit|mga ulit}}',
 'file-info-png-frames' => ' $1 {{PLURAL:$1|kuwadro|mga kuwadro}}',
+'file-no-thumb-animation' => "'''Paunawa: Dahil sa limitasyong teknikal, ang mga kagyat ng talaksang ito ay hindi magiging animado.'''",
+'file-no-thumb-animation-gif' => "'''Paunawa: Dahil sa mga limitasyong teknikal, ang mga kagyat ng mga imahe na GIF na mataas ang resolusyon na katulad ng isang ito ay hindi magiging animado.'''",
 
 # Special:NewFiles
 'newimages' => 'Galerya ng mga bagong talaksan',
@@ -2980,7 +3098,11 @@ Maaaring manganib ang iyong sistema kapag ipinagana mo ito.",
 'sp-newimages-showfrom' => 'Ipakita ang mga bagong talaksang nagsisimula mula $2, $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => '$1o',
+'video-dims' => '$1, $2 × $3',
+'seconds-abbrev' => '$1 segundo',
+'minutes-abbrev' => '$1 minuto',
+'hours-abbrev' => '$1 oras',
+'days-abbrev' => '$1 araw',
 'seconds' => '{{PLURAL:$1|$1 segundo|$1 mga segundo}}',
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 mga minuto}}',
 'hours' => '{{PLURAL:$1|$1 horas|$1 mga oras}}',
@@ -2994,6 +3116,61 @@ Tanging mga nakatalang bagay lamang (mga linyang nagsisimula sa *) ang pinaguuku
 Ang unang kawing sa isang linya ay dapat na nakakawing sa isang talaksang may masamang kalagayan.
 Anumang susunod na mga kawing sa pinanggalingang linya ay tinuturing na mga eksepsyon o bukod-tangi, iyong mga pahina kung saan ang mga talaksan ay maaaring lumitaw sa loob ng linya.',
 
+/*
+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',
+'variantname-zh-hant' => 'hant',
+'variantname-zh-cn' => 'cn',
+'variantname-zh-tw' => 'tw',
+'variantname-zh-hk' => 'hk',
+'variantname-zh-mo' => 'mo',
+'variantname-zh-sg' => 'sg',
+'variantname-zh-my' => 'my',
+'variantname-zh' => 'zh',
+
+# Variants for Gan language
+'variantname-gan-hans' => 'hans',
+'variantname-gan-hant' => 'hant',
+'variantname-gan' => 'gan',
+
+# Variants for Serbian language
+'variantname-sr-ec' => 'sr-ec',
+'variantname-sr-el' => 'sr-el',
+'variantname-sr' => 'sr',
+
+# Variants for Kazakh language
+'variantname-kk-kz' => 'kk-kz',
+'variantname-kk-tr' => 'kk-tr',
+'variantname-kk-cn' => 'kk-cn',
+'variantname-kk-cyrl' => 'kk-cyrl',
+'variantname-kk-latn' => 'kk-latn',
+'variantname-kk-arab' => 'kk-arab',
+'variantname-kk' => 'kk',
+
+# Variants for Kurdish language
+'variantname-ku-arab' => 'ku-Arab',
+'variantname-ku-latn' => 'ku-Latn',
+'variantname-ku' => 'ku',
+
+# Variants for Tajiki language
+'variantname-tg-cyrl' => 'tg-Cyrl',
+'variantname-tg-latn' => 'tg-Latn',
+'variantname-tg' => 'tg',
+
+# Variants for Inuktitut language
+'variantname-ike-cans' => 'ike-Cans',
+'variantname-ike-latn' => 'ike-Latn',
+'variantname-iu' => 'iu',
+
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'shi-Tfng',
+'variantname-shi-latn' => 'shi-Latn',
+'variantname-shi' => 'shi',
+
 # Metadata
 'metadata' => 'Metadatos',
 'metadata-help' => 'Naglalaman ang talaksang ito ng karagdagang kabatiran na maaaring idinagdag mula sa isang kamerang dihital o iskaner na ginamit para likhain o para maging dihital ito.
@@ -3015,6 +3192,8 @@ Likas na nakatakdang itago ang iba pa.
 * gpslatitude
 * gpslongitude
 * gpsaltitude',
+'metadata-langitem' => "'''$2:''' $1",
+'metadata-langitem-default' => '$1',
 
 # EXIF tags
 'exif-imagewidth' => 'Lapad',
@@ -3062,6 +3241,7 @@ Likas na nakatakdang itago ang iba pa.
 'exif-exposuretime' => 'Oras ng pagkakalantad',
 'exif-exposuretime-format' => '$1 seg ($2)<!--seg = segundo (seconds)-->',
 'exif-fnumber' => 'F Bilang',
+'exif-fnumber-format' => 'f/$1',
 'exif-exposureprogram' => 'Programa ng paglalantad',
 'exif-spectralsensitivity' => 'Sensitibidad sa ispektrum',
 'exif-isospeedratings' => 'Grado ng bilis ng ISO',
@@ -3075,6 +3255,7 @@ Likas na nakatakdang itago ang iba pa.
 'exif-lightsource' => 'Pinagmumulan ng liwanag',
 'exif-flash' => "Pangkisap (''flash'')",
 'exif-focallength' => 'Haba ng lenteng pampokus (pantuon)',
+'exif-focallength-format' => '$1 mm',
 'exif-subjectarea' => 'Saklaw na paksa',
 'exif-flashenergy' => "Lakas ng kisap (''flash'')",
 'exif-focalplanexresolution' => 'Resolusyong X ng kalatagan o lapyang pampokus',
@@ -3129,6 +3310,7 @@ Likas na nakatakdang itago ang iba pa.
 'exif-gpsareainformation' => 'Pangalan ng lugar ng GPS',
 'exif-gpsdatestamp' => 'Petsa ng GPS',
 'exif-gpsdifferential' => 'Pagtatama sa pakakaiba ng GPS',
+'exif-coordinate-format' => '$1° $2′ $3″ $4',
 'exif-jpegfilecomment' => 'Puna sa talaksang JPEG',
 'exif-keywords' => 'Mga susing-salita',
 'exif-worldregioncreated' => 'Rehiyon ng mundo kung saan kinuhanan ang larawan',
@@ -3194,15 +3376,37 @@ Likas na nakatakdang itago ang iba pa.
 'exif-originalimageheight' => 'Taas ng larawan bago ito inani',
 'exif-originalimagewidth' => 'Lapad ng larawan bago ito inani',
 
+# Make & model, can be wikified in order to link to the camera and model name
+'exif-contact-value' => '$1
+
+$2
+<div class="adr">
+$3
+
+$4, $5, $6 $7
+</div>
+$8',
+'exif-subjectnewscode-value' => '$2 ($1)',
+
 # EXIF attributes
 'exif-compression-1' => 'Walang kompresyon',
 'exif-compression-2' => 'CCITT Pangkat 3 1-kodigo sa haba ng pagtakbo ng Pangdimensiyong Huffman na May Bahagyang Pagbabago',
 'exif-compression-3' => 'Kodigo ng Pangkat 3 ng CCITT',
 'exif-compression-4' => 'Kodigo ng Pangkat 4 ng CCITT',
+'exif-compression-5' => 'LZW',
+'exif-compression-6' => 'JPEG (luma)',
+'exif-compression-7' => 'JPEG',
+'exif-compression-8' => 'Paimpisin (Adobe)',
+'exif-compression-32773' => 'PackBits (Macintosh RLE)',
+'exif-compression-32946' => 'Paimpisin (PKZIP)',
+'exif-compression-34712' => 'JPEG2000',
 
 'exif-copyrighted-true' => 'Nakakarapatang-ari',
 'exif-copyrighted-false' => 'Nasasakupan ng madla',
 
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
 'exif-unknowndate' => 'Hindi alam na araw',
 
 'exif-orientation-1' => 'Karaniwan',
@@ -3217,9 +3421,19 @@ Likas na nakatakdang itago ang iba pa.
 'exif-planarconfiguration-1' => 'pagkaayos sa malalaking bahagi (chunky)',
 'exif-planarconfiguration-2' => 'planar na pagkaayos',
 
+'exif-xyresolution-i' => '$1 dpi',
+'exif-xyresolution-c' => '$1 dpc',
+
+'exif-colorspace-1' => 'sRGB',
 'exif-colorspace-65535' => 'Hindi nakaakma sa pamantayang sukat',
 
 'exif-componentsconfiguration-0' => 'wala',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
 
 'exif-exposureprogram-0' => 'Hindi nabigyan ng kahulugan',
 'exif-exposureprogram-1' => 'Manwal',
@@ -3386,6 +3600,8 @@ Likas na nakatakdang itago ang iba pa.
 
 'exif-isospeedratings-overflow' => 'Mas mahigit kaysa sa 65535',
 
+'exif-maxaperturevalue-value' => '$1 APEX (f/$2)',
+
 'exif-iimcategory-ace' => 'Sining, kalinangan at kaaliwan',
 'exif-iimcategory-clj' => 'Krimen at batas',
 'exif-iimcategory-dis' => 'Mga kalamidad at mga sakuna',
@@ -3436,7 +3652,7 @@ Ibinalik ng tagapagpadala ang: $1',
 'confirmemail_invalid' => 'Hindi tamang kodigo ng kumpirmasyon.  Maaaring lumagpas na sa taning ang kodigo.',
 'confirmemail_needlogin' => 'Kailangan mong $1 upang kumpirmahin/mapatotohanan ang iyong adres ng e-liham.',
 'confirmemail_success' => 'Nakumpirma/napatotohanan na ang adres ng e-liham mo. Maaari ka ng [[Special:UserLogin|lumagda]] at maglibang sa wiki.',
-'confirmemail_loggedin' => 'Nakumpirma/napatotohanan na ngayon ang adres ng e-liham mo.',
+'confirmemail_loggedin' => 'Natiyak na ngayon ang tirahan ng e-liham mo.',
 'confirmemail_error' => 'May nangyaring kamalian sa pagsasagip ng iyong kumpirmasyon.',
 'confirmemail_subject' => 'Kumpirmasyon/pagpapatotoong pang-adres ng e-liham ng {{SITENAME}}',
 'confirmemail_body' => 'May isa, maaaring ikaw, na mula sa adres ng IP na $1,
@@ -3508,6 +3724,18 @@ Pakitiyak kung ibig mo talagang likhain muli ang pahinang ito.",
 'confirm-unwatch-button' => 'Sige',
 'confirm-unwatch-top' => 'Aalisin ba ang pahinang ito mula sa bantayan mo?',
 
+# Separators for various lists, etc.
+'semicolon-separator' => ';&#32;',
+'comma-separator' => ',&#32;',
+'colon-separator' => ':&#32;',
+'autocomment-prefix' => '-&#32;',
+'pipe-separator' => '&#32;|&#32;',
+'word-separator' => '&#32;',
+'ellipsis' => '...',
+'percent' => '$1%',
+'parentheses' => '($1)',
+'brackets' => '[$1]',
+
 # Multipage image navigation
 'imgmultipageprev' => '← nakaraang pahina',
 'imgmultipagenext' => 'susunod na pahina →',
@@ -3532,6 +3760,28 @@ Pakitiyak kung ibig mo talagang likhain muli ang pahinang ito.",
 'autoredircomment' => 'Ikinakarga sa [[$1]]',
 'autosumm-new' => "Nilikha ang pahina na may '$1'",
 
+# Size units
+'size-bytes' => '$1 B',
+'size-kilobytes' => '$1 KB',
+'size-megabytes' => '$1 MB',
+'size-gigabytes' => '$1 GB',
+'size-terabytes' => '$1 TB',
+'size-petabytes' => '$1 PB',
+'size-exabytes' => '$1 EB',
+'size-zetabytes' => '$1 ZB',
+'size-yottabytes' => '$1 YB',
+
+# Bitrate units
+'bitrate-bits' => '$1bps',
+'bitrate-kilobits' => '$1kbps',
+'bitrate-megabits' => '$1Mbps',
+'bitrate-gigabits' => '$1Gbps',
+'bitrate-terabits' => '$1Tbps',
+'bitrate-petabits' => '$1Pbps',
+'bitrate-exabits' => '$1Ebps',
+'bitrate-zetabits' => '$1Zbps',
+'bitrate-yottabits' => '$1Ybps',
+
 # Live preview
 'livepreview-loading' => 'Ikinakarga...',
 'livepreview-ready' => 'Ikinakarga… Handa na!',
@@ -3548,8 +3798,8 @@ maaaring hindi naipapakita sa talaang ito ang mga pagbabagong mas bago pa kaysa
 'watchlistedit-noitems' => 'Hindi naglalaman ng mga pamagat ang iyong talaan ng mga binabantayan.',
 'watchlistedit-normal-title' => 'Baguhin ang talaan ng mga binabantayan',
 'watchlistedit-normal-legend' => 'Tanggalin ang mga pamagat mula sa binabantayan',
-'watchlistedit-normal-explain' => 'Pinapakita sa ibaba ang mga pamagat na nasa talaan mo ng mga binabantayan.
-Para tanggalin ang isang pamagat, lagyan ng tsek ang kahon katabi nito, at pindutin ang "{{int:Watchlistedit-normal-submit}}".
+'watchlistedit-normal-explain' => 'Ipinapakita sa ibaba ang mga pamagat na nasa talaan mo ng mga binabantayan.
+Upang matanggal ang isang pamagat, lagyan ng tsek ang kahong katabi nito, at pindutin ang "{{int:Watchlistedit-normal-submit}}".
 Maaari mo ring [[Special:EditWatchlist/raw|baguhin ang hilaw na talaan]].',
 'watchlistedit-normal-submit' => 'Tanggalin ang mga Pamagat',
 'watchlistedit-normal-done' => 'Tinatanggal mula sa iyong talaan ng mga binabantayan ang {{PLURAL:$1|1 pamagat|$1 mga pamagat}}:',
@@ -3613,9 +3863,24 @@ Maaari mo ring [[Special:EditWatchlist|gamitin ang pangkaraniwang pampatnugot]].
 'hebrew-calendar-m10' => 'Tamuz',
 'hebrew-calendar-m11' => 'Av',
 'hebrew-calendar-m12' => 'Elul',
+'hebrew-calendar-m1-gen' => 'Tishrei',
+'hebrew-calendar-m2-gen' => 'Cheshvan',
+'hebrew-calendar-m3-gen' => 'Kislev',
+'hebrew-calendar-m4-gen' => 'Tevet',
+'hebrew-calendar-m5-gen' => 'Shevat',
+'hebrew-calendar-m6-gen' => 'Adar',
+'hebrew-calendar-m6a-gen' => 'Adar I',
+'hebrew-calendar-m6b-gen' => 'Adar II',
+'hebrew-calendar-m7-gen' => 'Nisan',
+'hebrew-calendar-m8-gen' => 'Iyar',
+'hebrew-calendar-m9-gen' => 'Sivan',
+'hebrew-calendar-m10-gen' => 'Tamuz',
+'hebrew-calendar-m11-gen' => 'Av',
+'hebrew-calendar-m12-gen' => 'Elul',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|makipag-usap]])',
+'timezone-utc' => 'UTC',
 
 # Core parser functions
 'unknown_extension_tag' => 'Hindi nalalamang tatak ng karugtong na "$1"',
@@ -3629,6 +3894,7 @@ Maaari mo ring [[Special:EditWatchlist|gamitin ang pangkaraniwang pampatnugot]].
 'version-variables' => 'Mga bagay na nababago/nagbabago',
 'version-antispam' => 'Pag-iwas sa masasamang mga e-liham',
 'version-skins' => 'Mga pabalat',
+'version-api' => 'API',
 'version-other' => 'Iba pa',
 'version-mediahandlers' => 'Mga tagahawak/tagapamahala ng midya',
 'version-hooks' => 'Mga pangkawit',
@@ -3638,6 +3904,7 @@ Maaari mo ring [[Special:EditWatchlist|gamitin ang pangkaraniwang pampatnugot]].
 'version-hook-name' => 'Pangalan ng pangkawit',
 'version-hook-subscribedby' => 'Sinuskribi ng/ni/nina',
 'version-version' => '(Bersyon $1)',
+'version-svn-revision' => '(r$2)',
 'version-license' => 'Lisensiya',
 'version-poweredby-credits' => "Ang wiking ito ay pinapatakbo ng '''[//www.mediawiki.org/ MediaWiki]''', karapatang-ari © 2001-$1 $2.",
 'version-poweredby-others' => 'iba pa',
@@ -3650,6 +3917,8 @@ Dapat na nakatanggap ka ng [{{SERVER}}{{SCRIPTPATH}}/COPYING isang sipi ng Pangk
 'version-entrypoints' => 'Mga URL na butas-pasukan',
 'version-entrypoints-header-entrypoint' => 'Butas na pasukan',
 'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Landas ng artikulo]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Landas ng panitik]',
 
 # Special:FilePath
 'filepath' => 'Lokasyon ng talaksan (file path)',
@@ -3676,7 +3945,7 @@ Ipinapakita ang mga larawan sa buong kalinawan, tuwirang sinisimulan ang ibang u
 * <span class="mw-specialpagerestricted">Pinaghihigpitang natatanging mga pahina.</span>',
 'specialpages-group-maintenance' => 'Mga pagpapanatiling ulat',
 'specialpages-group-other' => 'Iba pang natatanging mga pahina',
-'specialpages-group-login' => 'Lumagda/tumala',
+'specialpages-group-login' => 'Lumagda / lumikha ng akawnt',
 'specialpages-group-changes' => 'Mga huling binago at mga tala',
 'specialpages-group-media' => 'Mga ulat ng midya at mga pagkarga',
 'specialpages-group-users' => 'Mga tagagamit at mga karapatan',
@@ -3809,9 +4078,12 @@ O kaya, maaari mong gamitin ang maginhawang pormularyo sa ibaba. Ang iyong pagpu
 'api-error-empty-file' => 'Walang laman ang ipinasa mong talaksan.',
 'api-error-emptypage' => 'Lumilikha ng bago, hindi pinapayagan ang mga pahinang walang laman.',
 'api-error-fetchfileerror' => 'Panloob na kamalian: may naganap na pagkakamali habang kinukuha ang talaksan.',
+'api-error-fileexists-forbidden' => 'Isang talaksan na may pangalang "$1" ang umiiral na, at hindi maaaring patungan ng muling pagsusulat.',
+'api-error-fileexists-shared-forbidden' => 'Isang talaksang may pangalang "$1" ang umiiral na sa loob ng repository ng pinagsasaluhang talaksan, at hindi maaaring patungan ng muling pagsusulat.',
 'api-error-file-too-large' => 'Napakalaki ng talaksang ipinasa mo.',
 'api-error-filename-tooshort' => 'Napakaiksi ng pangalan ng talaksan.',
 'api-error-filetype-banned' => 'Ipinagbabawal ang ganitong uri ng talaksan.',
+'api-error-filetype-banned-type' => 'Ang $1 {{PLURAL:$4|ay isang hindi pinapahintulutang uri ng talaksan|ay hindi pinapahintulutang mga uri ng talaksan}}. Ang pinapayagang {{PLURAL:$3|uri ng talaksan ay ang|mga uri ng talaksan ay ang mga}} $2.',
 'api-error-filetype-missing' => 'Kulang ng karugtong ang talaksan.',
 'api-error-hookaborted' => 'Ang pagbabagong sinubok mong gawin ay hindi itinuloy ng isang kawil ng dugtong.',
 'api-error-http' => 'Panloob na kamalian: hindi makaugnay sa tagahain.',
index 5b7947c..05b2808 100644 (file)
@@ -19,17 +19,142 @@ $namespaceNames = array(
        NS_TALK             => 'Nopegət',
        NS_USER             => 'Okoədə',
        NS_USER_TALK        => 'Okoədəj_nopegət',
-       NS_PROJECT_TALK     => '$1_Nopegətəti',
+       NS_PROJECT_TALK     => '$1_Nopegət',
        NS_FILE             => 'Fajl',
-       NS_FILE_TALK        => 'Fajli_nopegət',
+       NS_FILE_TALK        => 'Fajl_nopegət',
        NS_MEDIAWIKI        => 'MediaWiki',
        NS_MEDIAWIKI_TALK   => 'MediaWiki_nopegət',
        NS_TEMPLATE         => 'Numunə',
        NS_TEMPLATE_TALK    => 'Numunə_nopegət',
        NS_HELP             => 'Koməg',
-       NS_HELP_TALK        => 'Koməgi_nopegət',
+       NS_HELP_TALK        => 'Koməg_nopegət',
        NS_CATEGORY         => 'Tispir',
-       NS_CATEGORY_TALK    => 'Tispiron_nopegət',
+       NS_CATEGORY_TALK    => 'Tispir_nopegət',
+);
+
+$namespaceAliases = array(
+       '$1_Nopegətəti'    => NS_PROJECT_TALK,
+       'Fajli_nopegət'    => NS_FILE_TALK,
+       'Koməgi_nopegət'   => NS_HELP_TALK,
+       'Tispiron_nopegət' => NS_CATEGORY_TALK,
+);
+
+$specialPageAliases = array(
+       'Allpages'                  => array( 'Һәммәј_сәһифон' ),
+       'Blankpage'                 => array( 'Тәјлијә_сәһифә' ),
+       'ChangeEmail'               => array( 'Е-номә_дәгиш_кардеј' ),
+       'ChangePassword'            => array( 'Пароли_дәгиш_кардеј' ),
+       'Emailuser'                 => array( 'Бә_иштирокәкә_номә_вығандеј' ),
+       'Longpages'                 => array( 'Дырозә_сәһифон' ),
+       'Movepage'                  => array( 'Сәһифә_номи_дәгиш_кардеј' ),
+       'Mypage'                    => array( 'Чымы_сәһифә' ),
+       'Mytalk'                    => array( 'Чымы_мызокирә' ),
+       'Myuploads'                 => array( 'Чымы_бо_жә_быә_чијон' ),
+       'Newimages'                 => array( 'Нујә_фајлон' ),
+       'Newpages'                  => array( 'Нујә_сәһифон' ),
+       'PasswordReset'             => array( 'Пароли_ләғв_кардеј' ),
+       'Protectedpages'            => array( 'Мыдофијә_кардә_быә_сәһифон' ),
+       'Protectedtitles'           => array( 'Мыдофијә_кардә_быә_номон' ),
+       'Randompage'                => array( 'Рајрастә_сәһифә._Рајрастә' ),
+       'Recentchanges'             => array( 'Ән_нујә_дәгишон' ),
+       'Recentchangeslinked'       => array( 'Ангыл_кардә_быә_дәгишон' ),
+       'Revisiondelete'            => array( 'Рәдд_кардә_быә_дәгишон' ),
+       'Search'                    => array( 'Нәве' ),
+       'Shortpages'                => array( 'Кыртә_сәһифон' ),
+       'Tags'                      => array( 'Нышонон' ),
+       'Undelete'                  => array( 'Бәрпо_кардеј' ),
+       'Version'                   => array( 'Рәвојәт' ),
+);
+
+$magicWords = array(
+       'redirect'                  => array( '0', '#ТОЖӘДӘН_ИСТИҒОМӘТ_ДОЈ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__БЕМЫНДӘРИҸОТ__', '__NOTOC__' ),
+       'forcetoc'                  => array( '0', '__МӘҸБУРИЈӘ_МЫНДӘРИҸОТ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__МЫНДӘРИҸОТ__', '__TOC__' ),
+       'noheader'                  => array( '0', '__БЕСӘРЛОВҺӘ__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ЕСӘТНӘ_МАНГ', 'ЕСӘТНӘ_МАНГ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ЕСӘТНӘ_МАНГ_1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'ЕСӘТНӘ_МАНГИ_НОМ', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'ЕСӘТНӘ_МАНГИ_НОМ_ҸИНС', 'CURRENTMONTHNAMEGEN' ),
+       'currentday'                => array( '1', 'ЕСӘТНӘ_РУЖ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ЕСӘТНӘ_РУЖ_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'ЕСӘТНӘ_РУЖИ_НОМ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ЕСӘТНӘ_СОР', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ЕСӘТНӘ_ВАХТ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ЕСӘТНӘ_СААТ', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'БУМИНӘ_МАНГ', 'БУМИНӘ_МАНГ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'БУМИНӘ_МАНГ_1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'БУМИНӘ_МАНГИ_НОМ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'БУМИНӘ_МАНГИ_НОМ_ҸИНС', 'LOCALMONTHNAMEGEN' ),
+       'localday'                  => array( '1', 'БУМИНӘ_РУЖ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'БУМИНӘ_РУЖ_2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'БУМИНӘ_РУЖИ_НОМ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'БУМИНӘ_СОР', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'БУМИНӘ_ВАХТ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'БУМИНӘ_СААТ', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'СӘҺИФОН_ҒӘДӘР', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'МӘҒОЛОН_ҒӘДӘР', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ФАЈЛОН_ҒӘДӘР', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'ИШТИРОКӘКОН_ҒӘДӘР', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'ТИЛИКӘ_ИШТИРОКӘКОН_ҒӘДӘР', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'ДӘГИШОН_ҒӘДӘР', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'ДИЈӘ_КАРДЕ_ҒӘДӘР', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'СӘҺИФӘ_НОМ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'СӘҺИФӘ_НОМ_2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'НОМОН_МӘКОН', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'НОМОН_МӘКОН_2', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'НОМОН_МӘКОН_ҒӘДӘР', 'NAMESPACENUMBER' ),
+       'talkspace'                 => array( '1', 'МЫЗОКИРОН_МӘКОН', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'МЫЗОКИРОН_МӘКОН_2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'МӘҒОЛОН_МӘКОН', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'МӘҒОЛОН_МӘКОН_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'СӘҺИФӘ_ПУРӘ_НОМ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'СӘҺИФӘ_ПУРӘ_НОМ_2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ЖИНТОНӘДӘ_СӘҺИФӘ_НОМ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ЖИНТОНӘДӘ_СӘҺИФӘ_НОМ_2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'СӘҺИФӘ_НОМИ_ӘСОС', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'СӘҺИФӘ_НОМИ_ӘСОС_2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'МЫЗОКИРӘ_СӘҺИФӘ_НОМ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'МЫЗОКИРӘ_СӘҺИФӘ_НОМ_2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'МӘҒОЛӘ_СӘҺИФӘ_НОМ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'МӘҒОЛӘ_СӘҺИФӘ_НОМ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'ХӘБӘ:', 'MSG:' ),
+       'subst'                     => array( '0', 'ӘВӘЗ_КАРДЕ:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'БЕВИКИ_ХӘБӘ:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'миниатјур', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'миниатјур=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'росто', 'right' ),
+       'img_left'                  => array( '1', 'чәпо', 'left' ),
+       'img_none'                  => array( '1', 'бе', 'none' ),
+       'img_width'                 => array( '1', '$1пкс', '$1px' ),
+       'img_center'                => array( '1', 'мәрәнго', 'center', 'centre' ),
+       'img_page'                  => array( '1', 'сәһифә=$1', 'сәһифә_$1', 'page=$1', 'page $1' ),
+       'sitename'                  => array( '1', 'САЈТИ_НОМ', 'SITENAME' ),
+       'localurl'                  => array( '0', 'БУМИНӘ_УНВОН:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'БУМИНӘ_УНВОН_2:', 'LOCALURLE:' ),
+       'currentweek'               => array( '1', 'ЕСӘТНӘ_ҺАФТӘ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ЕСӘТНӘ_ҺАФТӘ_РУЖ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'БУМИНӘ_ҺАФТӘ', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'БУМИНӘ_ҺАФТӘ_РУЖ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'РӘВОЈӘТИ_ID', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'РӘВОЈӘТИ_РУЖ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'РӘВОЈӘТИ_РУЖ_2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'РӘВОЈӘТИ_МАНГ', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'РӘВОЈӘТИ_МАНГ_2', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'РӘВОЈӘТИ_СОР', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'РӘВОЈӘТИ_ВАХТИ_ҒЕЈД', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'ИШТИРОКӘКӘ_РӘВОЈӘТ', 'REVISIONUSER' ),
+       'fullurl'                   => array( '0', 'ПУРӘ_УНВОН:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ПУРӘ_УНВОН_2:', 'FULLURLE:' ),
+       'currentversion'            => array( '1', 'ЕСӘТНӘ_РӘВОЈӘТ', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'ЕСӘТНӘ_ВАХТИ_ҒЕЈД', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'БУМИНӘ_ВАХТИ_ҒЕЈД', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'НОМӘ_ИСТИҒОМӘТ', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#ЗЫВОН:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'МЫҒДОРИ_ЗЫВОН', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'СӘҺИФОН_БӘ_НОМОН_МӘКОНӘДӘ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'pagesize'                  => array( '1', 'СӘҺИФӘ_ПАМЈӘ', 'PAGESIZE' ),
+       'url_wiki'                  => array( '0', 'ВИКИ', 'WIKI' ),
 );
 
 $messages = array(
@@ -39,18 +164,20 @@ $messages = array(
 'tog-hideminor' => 'Охоминә дәгишонәдә гәдә дәгишон нишо мәдә.',
 'tog-hidepatrolled' => 'Нујә дәгишон сијоһијәдә дәвинә кардә быә дәгишон нишо мәкә.',
 'tog-newpageshidepatrolled' => 'Нијони огәтеј ноғо доә быә сәһифон бә тожә сәһифон сијоһиәдә',
-'tog-usenewrc' => 'Охоминә дәгишон ән чокә сијоһи око дој (гәрәке JavaScript)',
+'tog-usenewrc' => 'Охоминә дәгишон сәһифәдә ијән ноғо доә сијоһијәдә дәгишон бә дәстон ҹо кардеј (гәрәке JavaScript)',
 'tog-numberheadings' => 'Автоматик башлығон нумрәләмиш быкә',
 'tog-showtoc' => 'Мындәриҹоти сијоһи нишо быдә (3 сәрловһәсә веј быә сәһифон)',
-'tog-watchcreations' => 'Зијод кардеј чымы офәјә быә сәһифон бә ноғо доә сијоһи',
-'tog-watchdefault' => 'Зијод кардеј демы дәгиш кардә быә сәһифон бә ноғо доә сијоһи',
-'tog-watchmoves' => 'Зијод кардеј ном дәгиш кардә быә сәһифон бә ноғо доә сијоһи',
-'tog-watchdeletion' => 'Ð\97иÑ\98од ÐºÐ°Ñ\80деÑ\98 Ñ\81Ó\99һиÑ\84он комон аз рәдд кардәме бә ноғо доә сијоһи',
-'tog-enotifwatchlistpages' => 'Ноғо доә сијоһиәдә кејнә сәһифон дәгиш бәбен бәмы е-номә бывығанд',
+'tog-watchcreations' => 'Ð\97иÑ\98од ÐºÐ°Ñ\80деÑ\98 Ñ\87Ñ\8bмÑ\8b Ð¾Ñ\84Ó\99Ñ\98Ó\99 Ð±Ñ\8bÓ\99 Ñ\81Ó\99һиÑ\84он Ð¸Ñ\98Ó\99н Ñ\84аÑ\98лон Ð±Ó\99 Ð½Ð¾Ò\93о Ð´Ð¾Ó\99 Ñ\81иÑ\98оһи',
+'tog-watchdefault' => 'Ð\97иÑ\98од ÐºÐ°Ñ\80деÑ\98 Ð´ÐµÐ¼Ñ\8b Ð´Ó\99гиÑ\88 ÐºÐ°Ñ\80дÓ\99 Ð±Ñ\8bÓ\99 Ñ\81Ó\99һиÑ\84он Ð¸Ñ\98Ó\99н Ñ\84аÑ\98лон Ð±Ó\99 Ð½Ð¾Ò\93о Ð´Ð¾Ó\99 Ñ\81иÑ\98оһи',
+'tog-watchmoves' => 'Зијод кардеј фајлон ијән ном дәгиш кардә быә сәһифон бә ноғо доә сијоһи',
+'tog-watchdeletion' => 'Ð\97иÑ\98од ÐºÐ°Ñ\80деÑ\98 Ñ\84аÑ\98лон Ð¸Ñ\98Ó\99н Ñ\81Ó\99һиÑ\84он, комон аз рәдд кардәме бә ноғо доә сијоһи',
+'tog-enotifwatchlistpages' => 'Ноғо доә сијоһиәдә кејнә сәһифон ја фајлон дәгиш бәбен бәмы е-номә бывығанд',
 'tog-watchlisthideown' => 'Чымы дәгишон ноғо доә сијһиәдә нијо кардеј',
 'tog-watchlisthidebots' => 'Нијо кардеј ботон дәгишон ноғо доә сијоһиәдә',
 'tog-watchlisthideminor' => 'Нијо кардеј гәдә дәгишон ноғо доә сијоһиәдә',
 
+'underline-always' => 'Һежо',
+
 # Dates
 'sunday' => 'Ишамбә',
 'monday' => 'Дышанбә',
@@ -220,7 +347,7 @@ $messages = array(
 'copyrightpage' => '{{ns:project}}:Мыәллифә һуғуғ',
 'currentevents' => 'Есәтнә һодисон',
 'currentevents-url' => 'Project: Есәтнә һодисон',
-'disclaimers' => 'Чы мәсулијјәтику имтина.',
+'disclaimers' => 'Че мәсулијјәтику имтино.',
 'disclaimerpage' => 'Project:Дејни бә гиј ныгәтеј',
 'edithelp' => 'Арајиш бо редактә кардеј',
 'edithelppage' => 'Help:Арајиш бо сәрост кардеј',
@@ -387,7 +514,7 @@ $messages = array(
 Ым сәһифә чоәдәнә дуз карде зәруријјәти јохләмишкәнән.
 Жинтоно нышу доә быә бычи ым сәһифә позулмуш быә.",
 'moveddeleted-notice' => 'Ым сәһифә молә быә.
-Арајиши горнә жинтоно нишо доә быән чы сәһифә молә ијән ном дәгиш кардә нывыштәјон.',
+Арајиши горнә жинтоно нишо доә быән че сәһифә молә ијән ном дәгиш кардә нывыштәјон.',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Дығғәт:''' Дахыл кардә быә ғәлибон сәкыштә памјә ве јоле.
@@ -456,7 +583,7 @@ $messages = array(
 'searchmenu-exists' => "'''Бы вики-нәхшәдә һесте сәһифә «[[:$1]]»'''",
 'searchmenu-new' => "'''Сәһифә офәјеј «[[:$1]]» бә ым вики-нахшәдә!'''",
 'searchprofile-articles' => 'Әсосә сәһифон',
-'searchprofile-project' => 'Чы араијшон ијән нахшон сәһифон',
+'searchprofile-project' => 'Че араијшон ијән нахшон сәһифон',
 'searchprofile-images' => 'Мултимедијә',
 'searchprofile-everything' => 'Һар вырәдә',
 'searchprofile-advanced' => 'һовуж',
@@ -472,14 +599,14 @@ $messages = array(
 'search-suggest' => 'Еһтимол шымә нәзәрәдә ым гәтејдәбијон: $1',
 'searchrelated' => 'ангыл кардә быә',
 'searchall' => 'Һәммәј',
-'showingresultsheader' => "{{PLURAL:$5|Нәтиҹә'''$1''' из '''$3'''|Нәтиҹон '''$1 — $2''' чы '''$3'''}} бо '''$4'''",
+'showingresultsheader' => "{{PLURAL:$5|Нәтиҹә'''$1''' из '''$3'''|Нәтиҹон '''$1 — $2''' че '''$3'''}} бо '''$4'''",
 'search-nonefound' => 'Бә шымә хәбәсә ујғун омә сәкыштә пәјдо ныбе.',
 'powersearch-field' => 'Нәве',
 'powersearch-toggleall' => 'Һәммәј',
 
 # Preferences page
 'preferences' => 'Чичсә печыније',
-'mypreferences' => 'Ð\9fеÑ\87Ñ\8bниÑ\98е',
+'mypreferences' => 'Ð\9aÑ\83кон',
 'prefsnologin' => 'Ыштәни едаштәнијоне',
 'prefsnologintext' => 'Шымә бәбе <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ыштәни едәштән]</span> бо иштирокәкә пеғәндон дәгиш кардеј.',
 'changepassword' => 'Пароли дәгиш кардеј',
@@ -509,7 +636,7 @@ $messages = array(
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|дәгиши|дәгишон}}',
 'recentchanges' => 'Ән нујә дәгишон',
-'recentchanges-legend' => 'Ó\98н Ð½Ñ\83Ñ\98Ó\99 Ð´Ó\99гиÑ\88он Ð¿ÐµÑ\87Ñ\8bниÑ\98е',
+'recentchanges-legend' => 'Ó\98н Ð½Ñ\83Ñ\98Ó\99 Ð´Ó\99гиÑ\88он ÐºÑ\83кон',
 'recentchanges-summary' => 'Тәмшо быкән бы сәһифәдә че вики охоминә дәгишон нишо доә быән.',
 'recentchanges-feed-description' => 'Ым каналәдә быә охонә дәгишон дығғәтәдә огәт.',
 'recentchanges-label-newpage' => 'Де ым дәгиши тожә сәһифә сохтә бе',
@@ -576,7 +703,7 @@ $messages = array(
 'filehist-current' => 'есәтнә',
 'filehist-datetime' => 'Тарых/Вахт',
 'filehist-thumb' => 'Гәдә шикил',
-'filehist-thumbtext' => 'Миниатјур бо рәвојәти чы вахтику $1',
+'filehist-thumbtext' => 'Миниатјур бо рәвојәти че вахтику $1',
 'filehist-user' => 'Иштирокәкә',
 'filehist-dimensions' => 'Објекти улгу',
 'filehist-comment' => 'Ғејд',
@@ -584,7 +711,7 @@ $messages = array(
 'linkstoimage' => '{{PLURAL:$1|сәһифә|$1 сәһифә}} сәбон вардә бә ын фајл:',
 'nolinkstoimage' => 'Бә ым фајли сәбон вардә сәһифон нин.',
 'sharedupload-desc-here' => 'Ым фајл чыјо пегәтә быә $1 ијән бәзыне истифодә бе бә ҹо нәхшонәдә.
-Мәлумот чы әчәј [$2 тәсвири сәһифәку] бә жиј доә быә.',
+Мәлумот чн әчәј [$2 тәсвири сәһифәку] бә жиј доә быә.',
 
 # Random page
 'randompage' => 'Рајрастә мәғолә',
@@ -614,7 +741,7 @@ $messages = array(
 
 # Special:AllPages
 'allpages' => 'Һәммәј сәһифон',
-'alphaindexline' => 'чы $1 тоса $2',
+'alphaindexline' => 'че $1 тоса $2',
 'allarticles' => 'Һәммәј сәһифон',
 'allpagessubmit' => 'Бә вырә роснијеј',
 
@@ -729,6 +856,7 @@ $messages = array(
 'allmessagesname' => 'Хәбә',
 'allmessagesdefault' => 'Иминә огәтә быә мәтн',
 'allmessages-filter-all' => 'Һаммај',
+'allmessages-filter-submit' => 'Давард',
 
 # Thumbnails
 'thumbnail-more' => 'Һејве кардеј',
@@ -737,7 +865,7 @@ $messages = array(
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Шымә иштирокәкә сәһифә',
 'tooltip-pt-mytalk' => 'Шымә мызокирон сәһифә',
-'tooltip-pt-preferences' => 'ШÑ\8bмÓ\99 Ð¿ÐµÑ\87Ñ\8bниÑ\98Ó\99Ñ\98оне',
+'tooltip-pt-preferences' => 'ШÑ\8bмÓ\99 ÐºÑ\83кон',
 'tooltip-pt-watchlist' => 'Сәһифон сијоһи, конҹо шымә де дығғәти дијә кардејдәјон бә дәгишон',
 'tooltip-pt-mycontris' => 'Шымә гәнҹон сијоһи',
 'tooltip-pt-login' => 'Ијо бәбе ыштәни ғејд кардовнијеј системәдә, интаси ым һукман ни',
@@ -766,7 +894,7 @@ $messages = array(
 'tooltip-t-whatlinkshere' => 'Бә ым сәһифә сәбон вардә һәммәј вики сәһифон сијоһи',
 'tooltip-t-recentchangeslinked' => 'Охонә дәгишон сәһифонәдә, бә ком сәһифон сәбон вардә ым сәһифә',
 'tooltip-feed-atom' => 'Транслјасијә кардеј бә Atom бо ым сәһифә',
-'tooltip-t-contributions' => 'Чы иштирок кардәкәси дагиш кардә быә сәһифон сијоһи',
+'tooltip-t-contributions' => 'Че иштирок кардәкәси дагиш кардә быә сәһифон сијоһи',
 'tooltip-t-emailuser' => 'Бы иштироәкә номә вығәнде',
 'tooltip-t-upload' => 'Шикилон јаанки мултимедијә фајлон бо жај',
 'tooltip-t-specialpages' => 'Хыдмәтә сәһифон сијоһи',
@@ -793,8 +921,6 @@ $messages = array(
 
 # Info page
 'pageinfo-header-edits' => 'Сәрост кардеј',
-'pageinfo-header-views' => 'Тәмшо',
-'pageinfo-subjectpage' => 'Сәһифә',
 
 # Browsing diffs
 'previousdiff' => '← Навынәни дәгиши',
@@ -838,12 +964,15 @@ $messages = array(
 # EXIF tags
 'exif-imagewidth' => 'Һовужи',
 'exif-imagelength' => 'Былынди',
+'exif-source' => 'Сәвон',
 'exif-languagecode' => 'Зывон',
 
 'exif-gaincontrol-0' => 'Ни',
 
 'exif-saturation-0' => 'Ади',
 
+'exif-dc-publisher' => 'Нәшрәкә',
+
 # External editor support
 'edit-externally' => 'Редактә кардеј ым фајли де заһири програм',
 'edit-externally-help' => '(Бо мыффәссәлә мәлумотон бә [//www.mediawiki.org/wiki/Manual:External_editors дәрсәвон бо сохтәј] дијә быкан)',
@@ -853,6 +982,9 @@ $messages = array(
 'namespacesall' => 'һәммәј',
 'monthsall' => 'һәммәј',
 
+# Table pager
+'table_pager_limit_submit' => 'Давард',
+
 # Watchlist editing tools
 'watchlisttools-view' => 'Сәһифонәдә дәгишон сијоһику',
 'watchlisttools-edit' => 'Дијә кардеј/сәрост кардеј сијоһи',
index 0b9588d..37356a3 100644 (file)
@@ -508,7 +508,7 @@ Ko e ʻuhinga loka ko e $1 ia.",
 
 # Recent changes
 'recentchanges' => 'Ngaahi toki liliu',
-'recentchangestext' => 'Fakatotolo ʻa e ngaahi toki liliu ki he wiki ʻi he pēsí ni.',
+'recentchanges-summary' => 'Fakatotolo ʻa e ngaahi toki liliu ki he wiki ʻi he pēsí ni.',
 'rcnote' => 'ʻOku ʻasi ʻi lalo ʻa e liliu fakamuimui ʻe <strong>$1</strong> lolotonga ʻa e ʻaho fakamuimui ʻe <strong>$2</strong> mei he taimi: $4, $5',
 'rcnotefrom' => "ʻOku ʻasi ʻi lalo ʻa e liliu talu mei '''$2''' (aʻu ki he '''$1''').",
 'rclistfrom' => 'ʻAsi mai ha ngaahi liliu foʻou ʻo kamata mei he $1',
@@ -556,8 +556,8 @@ Ko e ʻuhinga loka ko e $1 ia.",
 'badfilename' => 'Naʻe liliu ko e hingoa ʻo e faile ki he "$1".',
 'largefileserver' => 'ʻOku fuʻu lahi ange ʻa e failé ni ʻi he tauhia hono ʻinasi.',
 'emptyfile' => 'ʻOku ngalingali maha ʻa e faile naʻa ke hiki hake ai. Mahalo pē naʻa ke fakasipelahalaʻi ki he hingoa. Kātaki vakai ke ke pau te ke fiehiki ʻa e failé ni.',
-'fileexists' => "ʻOku toka ʻi ai ha peesi mo e hingoa ē; fakamolemole fakamoʻoniʻi ki he '''<tt>[[:$1]]</tt>''' kapau ʻoku ʻikai te ke pau ʻo te ke fieliliu ia.
-[[$1|thumb]]",
+'fileexists' => 'ʻOku toka ʻi ai ha peesi mo e hingoa ē; fakamolemole fakamoʻoniʻi ki he <strong>[[:$1]]</strong> kapau ʻoku ʻikai te ke pau ʻo te ke fieliliu ia.
+[[$1|thumb]]',
 'fileexists-forbidden' => 'ʻOku toka ʻi ai ha peesi mo e hingoa ē, pea ʻe ʻikai lava liliu; fakamolemole ʻe foki pea hiki hake ʻa e failé ni mo e ha hingoa foʻou. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'ʻOku toka ʻi ai ha peesi mo e hingoa ē ʻi he kalasi vahevahe; fakamolemole ʻe foki pea hiki hake ʻa e failé ni mo e ha hingoa foʻou. [[File:$1|thumb|center|$1]]',
 'uploadwarning' => 'Tokanga hiki hake',
index b1c53ba..00e4e5b 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author BarkingFish
  * @author Caffelice (on tpi.wikipedia.org)
  * @author Iketsi
  * @author Wantok
  * @author לערי ריינהארט
  */
 
+$namespaceNames = array(
+       NS_SPECIAL          => 'Sipesol',
+       NS_TALK             => 'Toktok',
+       NS_USER             => 'Yusa',
+       NS_USER_TALK        => 'Toktok_bilong_yusa',
+       NS_PROJECT_TALK     => '$1_toktok',
+       NS_FILE             => 'Fail',
+       NS_FILE_TALK        => 'Toktok_bilong_fail',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'Toktok_bilong_mediawiki',
+       NS_TEMPLATE         => 'Templet',
+       NS_TEMPLATE_TALK    => 'Toktok_bilong_templet',
+       NS_HELP             => 'Halivim',
+       NS_HELP_TALK        => 'Toktok_bilong_halivim',
+       NS_CATEGORY         => 'Grup',
+       NS_CATEGORY_TALK    => 'Toktok_bilong_grup',
+);
+
 $specialPageAliases = array(
        'Confirmemail'              => array( 'Orait long imel' ),
        'Contributions'             => array( 'Ol senis bilong yusa' ),
@@ -37,28 +56,39 @@ $messages = array(
 'tog-hideminor' => 'Noken soim ol liklik senis insait long ol nupela senis',
 'tog-hidepatrolled' => 'Noken soim ol lukluk senis insait long ol nupela senis',
 'tog-newpageshidepatrolled' => 'Noken soim ol lukluk senis insait long ol nupela pes',
-'tog-extendwatchlist' => 'Larim lukautbuk i go longpela long soim olgeta senis',
-'tog-usenewrc' => 'Moa beta stail bilong nupela senis (i nidim JavaScript)',
+'tog-extendwatchlist' => ' Larim lukautbuk i go longpela long soim olgeta senis, long halivim tasol bihain tru',
+'tog-usenewrc' => 'Moa beta stail bilong nupela senis na lukautbuk (i nidim JavaScript)',
 'tog-numberheadings' => 'Putim ol namba i go long wanwan hap bilong pes',
 'tog-showtoolbar' => 'Soim ol liklik link long wokim senis kwiktaim (i nidim JavaScript)',
 'tog-editondblclick' => 'Senisim pes taim yu paitim tupela taim kwiktaim (i nidim JavaScript)',
 'tog-editsection' => 'Soim ol [senisim] link long wanwan hap bilong ol pes',
 'tog-editsectiononrightclick' => 'Senisim ol hap bilong pes taim yu paitim nem bilong hap<br />wantaim raithan-klik (i nidim Javascript)',
 'tog-showtoc' => 'Soim ol nem bilong hap insait long liklik bokis, taim igat antap long 3 hap long pes',
-'tog-rememberpassword' => 'Holim nem bilong yusa bilong mi long dispela kompiuta (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations' => 'Putim ol nupela pes mi wokim long lukautbuk',
-'tog-watchdefault' => 'Putim ol pes mi senisim long lukautbuk bilong mi',
+'tog-rememberpassword' => 'Holim yusanem bilong mi long dispela komputa (holim pas longpela taim $1 {{PLURAL:$1|de|de}})',
+'tog-watchcreations' => 'Putim ol nupela pes mi wokim na fail mi salim long lukautbuk',
+'tog-watchdefault' => 'Putim ol pes na fail mi senisim long lukautbuk bilong mi',
 'tog-watchmoves' => 'Putim ol pes mi surikim long lukautbuk bilong mi',
 'tog-watchdeletion' => 'Putim ol pes mi rausim long lukautbuk bilong mi',
 'tog-minordefault' => 'Makim ol senis mi wokim olsem ol i liklik, sapos mi no makim',
 'tog-previewontop' => 'Soim pes mi senisim (pastaim long raitim) antap long bokis bilong wokim senis',
 'tog-previewonfirst' => 'Soim pes mi senisim pastaim long raitim',
-'tog-enotifwatchlistpages' => 'Salim imel (e-mail) long mi taim wanpela pes mi lukautim i senis',
+'tog-nocache' => ' Nogat stoa pes long browser',
+'tog-enotifwatchlistpages' => 'Salim imel long mi taim wanpela pes mi lukautim i senis',
+'tog-enotifusertalkpages' => 'Salim imel long mi wanem taim toktok bilong mi i senis',
+'tog-enotifminoredits' => 'Salim imel long mi tasol long liklik senis long pes na fail',
+'tog-enotifrevealaddr' => 'Soim imel adres bilong mi long olpela infomesen imel',
 'tog-shownumberswatching' => 'Soim hamas yusa i lukautim pes',
+'tog-oldsig' => 'Olsem wanem yu raitim nem nau',
+'tog-fancysig' => 'Dispela rot yu raitim long nem stap wikitext (i no gat otomatik link)',
+'tog-externaleditor' => 'Yusim long ausait edita oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
+'tog-externaldiff' => 'Yusim long ausait diff oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
+'tog-showjumplinks' => ' Setap ol "Go stret long" links bilong helpim',
 'tog-uselivepreview' => 'Soim ol senis kwiktaim taim mi wokim (i nidim Javascript)',
+'tog-forceeditsummary' => 'Tokim mi long wanem taim raitim mi nating long liklik toksave bilong senis',
 'tog-watchlisthideown' => 'Haitim ol senis mi wokim long lukautbuk bilong mi',
 'tog-watchlisthidebots' => 'Haitim ol senis ol bot i wokim long lukautbuk bilong mi',
 'tog-watchlisthideminor' => 'Haitim ol liklik senis long lukautbuk bilong mi',
+'tog-watchlisthideliu' => ' Haitim senis long olpela yusa husat "logged in" long lukautbuk bilong mi',
 'tog-showhiddencats' => 'Soim ol grup hait',
 
 'underline-always' => 'Olgeta taim',
index c7ba9d4..eb0155c 100644 (file)
@@ -35,6 +35,7 @@
  * @author Mirzali
  * @author Mskyrider
  * @author Myildirim2007
+ * @author Nazif İLBEK
  * @author Reedy
  * @author Runningfridgesrule
  * @author Sadrettin
@@ -137,7 +138,7 @@ $specialPageAliases = array(
        'PasswordReset'             => array( 'ParolaSıfırlama' ),
        'PermanentLink'             => array( 'KalıcıBağ' ),
        'Popularpages'              => array( 'PopülerSayfalar' ),
-       'Preferences'               => array( 'Tercihler' ),
+       'Preferences'               => array( 'Tercihler', 'Ayarlar' ),
        'Prefixindex'               => array( 'ÖnekDizini' ),
        'Protectedpages'            => array( 'KorunanSayfalar' ),
        'Protectedtitles'           => array( 'KorunanBaşlıklar' ),
@@ -178,142 +179,144 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__İÇİNDEKİLERYOK__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__GALERİYOK__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__İÇİNDEKİLERZORUNLU__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__İÇİNDEKİLER__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__DEĞİŞTİRYOK__', '__DÜZENLEMEYOK__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__BAŞLIKYOK__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'MEVCUTAY', 'MEVCUTAY2', 'GÜNCELAY', 'GÜNCELAY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'MEVCUTAY1', 'GÜNCELAY1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'MEVCUTAYADI', 'GÜNCELAYADI', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'MEVCUTAYADIİYELİK', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'MEVCUTAYKISALTMASI', 'GÜNCELAYKISALTMASI', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'MEVCUTGÜN', 'GÜNCELGÜN', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'MEVCUTGÜN2', 'GÜNCELGÜN2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'MEVCUTGÜNADI', 'GÜNCELGÜNADI', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'MEVCUTYIL', 'GÜNCELYIL', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'MEVCUTZAMAN', 'GÜNCELZAMAN', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'MEVCUTSAAT', 'GÜNCELSAAT', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'YERELAY', 'YERELAY2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'YERELAY1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'YERELAYADI', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'YERELAYADIİYELİK', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'YERELAYKISALTMASI', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'YERELGÜN', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'YERELGÜN2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'YERELGÜNADI', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'YERELYIL', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'YERELZAMAN', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'YERELSAAT', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'SAYFASAYISI', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'MADDESAYISI', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'DOSYASAYISI', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'KULLANICISAYISI', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'AKTİFKULLANICISAYISI', 'ETKİNKULLANICISAYISI', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'DEĞİŞİKLİKSAYISI', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'GÖRÜNTÜLEMESAYISI', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'SAYFAADI', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'SAYFAADIU', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ADALANI', 'İSİMALANI', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ADALANIU', 'İSİMALANIU', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'TARTIŞMAALANI', 'TARTIŞMABOŞLUĞU', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'TARTIŞMAALANIU', 'TARTIŞMABOŞLUĞUU', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'KONUALANI', 'MADDEALANI', 'KONUBOŞLUĞU', 'MADDEBOŞLUĞU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'KONUALANIU', 'MADDEALANIU', 'KONUBOŞLUĞUU', 'MADDEBOŞLUĞUU', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'TAMSAYFAADI', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'TAMSAYFAADIU', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'ALTSAYFAADI', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'ALTSAYFAADIU', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'ÜSTSAYFAADI', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'ÜSTSAYFAADIU', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'TARTIŞMASAYFASIADI', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'TARTIŞMASAYFASIADIU', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'KONUSAYFASIADI', 'MADDESAYFASIADI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'KONUSAYFASIADIU', 'MADDESAYFASIADIU', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'MSJ:', 'İLT:', 'MSG:' ),
-       'subst'                   => array( '0', 'KOPYALA:', 'AKTAR:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'GÜVENLİAKTAR:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'MSJNW:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'küçükresim', 'küçük', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'küçükresim=$1', 'küçük=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'sağ', 'right' ),
-       'img_left'                => array( '1', 'sol', 'left' ),
-       'img_none'                => array( '1', 'yok', 'none' ),
-       'img_width'               => array( '1', '$1pik', '$1piksel', '$1px' ),
-       'img_center'              => array( '1', 'orta', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'çerçeveli', 'çerçeve', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'çerçevesiz', 'frameless' ),
-       'img_page'                => array( '1', 'sayfa=$1', 'sayfa $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'dikey', 'dikey=$1', 'dikey $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'sınır', 'border' ),
-       'img_baseline'            => array( '1', 'tabançizgisi', 'altçizgi', 'baseline' ),
-       'img_sub'                 => array( '1', 'alt', 'sub' ),
-       'img_super'               => array( '1', 'üst', 'üs', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'tavan', 'tepe', 'top' ),
-       'img_text_top'            => array( '1', 'metin-tavan', 'metin-tepe', 'text-top' ),
-       'img_middle'              => array( '1', 'merkez', 'middle' ),
-       'img_bottom'              => array( '1', 'taban', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'metin-taban', 'text-bottom' ),
-       'img_link'                => array( '1', 'bağlantı=$1', 'link=$1' ),
-       'int'                     => array( '0', 'İNT:', 'INT:' ),
-       'sitename'                => array( '1', 'SİTEADI', 'SITENAME' ),
-       'ns'                      => array( '0', 'AA:', 'AB:', 'NS:' ),
-       'nse'                     => array( '0', 'AAU:', 'ABU:', 'NSE:' ),
-       'localurl'                => array( '0', 'YERELURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'YERELURLU:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'SUNUCU', 'SERVER' ),
-       'servername'              => array( '0', 'SUNUCUADI', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'BETİKYOLU', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'BİÇEMYOLU', 'STYLEPATH' ),
-       'grammar'                 => array( '0', 'GRAMER:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'CİNSİYET:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__BAŞLIKDÖNÜŞÜMÜYOK__', '__BDY__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__İÇERİKDÖNÜŞÜMÜYOK__', '__İDY__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'MEVCUTHAFTA', 'GÜNCELHAFTA', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'MEVCUTHAFTANINGÜNÜ', 'GÜNCELHAFTANINGÜNÜ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'YERELHAFTA', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'YERELHAFTANINGÜNÜ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'SÜRÜMNU', 'SÜRÜMNO', 'REVİZYONNU', 'REVİZYONNO', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'SÜRÜMGÜNÜ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'SÜRÜMGÜNÜ2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'SÜRÜMAYI', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'SÜRÜMYILI', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'SÜRÜMZAMANBİLGİSİ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'SÜRÜMKULLANICI', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'ÇOĞUL:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'TAMURL:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'TAMURLU:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'KHİLK:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'BHİLK:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'KH:', 'LC:' ),
-       'uc'                      => array( '0', 'BH:', 'UC:' ),
-       'raw'                     => array( '0', 'HAM:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'BAŞLIKGÖSTER', 'DISPLAYTITLE' ),
-       'newsectionlink'          => array( '1', '__YENİBAŞLIKBAĞLANTISI__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__YENİBAŞLIKBAĞLANTISIYOK__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'MEVCUTSÜRÜM', 'GÜNCELSÜRÜM', 'CURRENTVERSION' ),
-       'currenttimestamp'        => array( '1', 'MEVCUTZAMANBİLGİSİ', 'GÜNCELZAMANBİLGİSİ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'YERELZAMANBİLGİSİ', 'LOCALTIMESTAMP' ),
-       'language'                => array( '0', '#DİL:', '#LİSAN:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'İÇERİKDİLİ', 'İÇERİKLİSANI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'İSİMALANINDAKİSAYFALAR', 'İADAKİSAYFALAR', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'HİZMETLİSAYISI', 'NUMBEROFADMINS' ),
-       'special'                 => array( '0', 'özel', 'special' ),
-       'defaultsort'             => array( '1', 'VARSAYILANSIRALA:', 'VARSAYILANSIRALAMAANAHTARI:', 'VARSAYILANKATEGORİSIRALA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'DOSYA_YOLU:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'etiket', 'tag' ),
-       'hiddencat'               => array( '1', '__GİZLİKAT__', '__GİZLİKATEGORİ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'KATEGORİDEKİSAYFALAR', 'KATTAKİSAYFALAR', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'SAYFABOYUTU', 'PAGESIZE' ),
-       'index'                   => array( '1', '__DİZİN__', '__ENDEKS__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__DİZİNYOK__', '__ENDEKSYOK__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'GRUPTAKİSAYI', 'GRUBUNSAYISI', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__STATİKYÖNLENDİRME__', '__SABİTYÖNLENDİRME__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'KORUMASEVİYESİ', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'formattarihi', 'tarihformatı', 'formatdate', 'dateformat' ),
-       'url_wiki'                => array( '0', 'VİKİ', 'WIKI' ),
+       'redirect'                  => array( '0', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__İÇİNDEKİLERYOK__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__GALERİYOK__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__İÇİNDEKİLERZORUNLU__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__İÇİNDEKİLER__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__DEĞİŞTİRYOK__', '__DÜZENLEMEYOK__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__BAŞLIKYOK__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'MEVCUTAY', 'MEVCUTAY2', 'GÜNCELAY', 'GÜNCELAY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'MEVCUTAY1', 'GÜNCELAY1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'MEVCUTAYADI', 'GÜNCELAYADI', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'MEVCUTAYADIİYELİK', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'MEVCUTAYKISALTMASI', 'GÜNCELAYKISALTMASI', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'MEVCUTGÜN', 'GÜNCELGÜN', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'MEVCUTGÜN2', 'GÜNCELGÜN2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'MEVCUTGÜNADI', 'GÜNCELGÜNADI', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'MEVCUTYIL', 'GÜNCELYIL', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'MEVCUTZAMAN', 'GÜNCELZAMAN', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'MEVCUTSAAT', 'GÜNCELSAAT', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'YERELAY', 'YERELAY2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'YERELAY1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'YERELAYADI', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'YERELAYADIİYELİK', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'YERELAYKISALTMASI', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'YERELGÜN', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'YERELGÜN2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'YERELGÜNADI', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'YERELYIL', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'YERELZAMAN', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'YERELSAAT', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'SAYFASAYISI', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'MADDESAYISI', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'DOSYASAYISI', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'KULLANICISAYISI', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'AKTİFKULLANICISAYISI', 'ETKİNKULLANICISAYISI', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'DEĞİŞİKLİKSAYISI', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'GÖRÜNTÜLEMESAYISI', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'SAYFAADI', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'SAYFAADIU', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ADALANI', 'İSİMALANI', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ADALANIU', 'İSİMALANIU', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'TARTIŞMAALANI', 'TARTIŞMABOŞLUĞU', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'TARTIŞMAALANIU', 'TARTIŞMABOŞLUĞUU', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'KONUALANI', 'MADDEALANI', 'KONUBOŞLUĞU', 'MADDEBOŞLUĞU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'KONUALANIU', 'MADDEALANIU', 'KONUBOŞLUĞUU', 'MADDEBOŞLUĞUU', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'TAMSAYFAADI', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'TAMSAYFAADIU', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'ALTSAYFAADI', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'ALTSAYFAADIU', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'ÜSTSAYFAADI', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'ÜSTSAYFAADIU', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'TARTIŞMASAYFASIADI', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'TARTIŞMASAYFASIADIU', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'KONUSAYFASIADI', 'MADDESAYFASIADI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'KONUSAYFASIADIU', 'MADDESAYFASIADIU', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'MSJ:', 'İLT:', 'MSG:' ),
+       'subst'                     => array( '0', 'KOPYALA:', 'AKTAR:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'GÜVENLİAKTAR:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'MSJNW:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'küçükresim', 'küçük', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'küçükresim=$1', 'küçük=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'sağ', 'right' ),
+       'img_left'                  => array( '1', 'sol', 'left' ),
+       'img_none'                  => array( '1', 'yok', 'none' ),
+       'img_width'                 => array( '1', '$1pik', '$1piksel', '$1px' ),
+       'img_center'                => array( '1', 'orta', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'çerçeveli', 'çerçeve', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'çerçevesiz', 'frameless' ),
+       'img_page'                  => array( '1', 'sayfa=$1', 'sayfa $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'dikey', 'dikey=$1', 'dikey $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'sınır', 'border' ),
+       'img_baseline'              => array( '1', 'tabançizgisi', 'altçizgi', 'baseline' ),
+       'img_sub'                   => array( '1', 'alt', 'sub' ),
+       'img_super'                 => array( '1', 'üst', 'üs', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'tavan', 'tepe', 'top' ),
+       'img_text_top'              => array( '1', 'metin-tavan', 'metin-tepe', 'text-top' ),
+       'img_middle'                => array( '1', 'merkez', 'middle' ),
+       'img_bottom'                => array( '1', 'taban', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'metin-taban', 'text-bottom' ),
+       'img_link'                  => array( '1', 'bağlantı=$1', 'link=$1' ),
+       'int'                       => array( '0', 'İNT:', 'INT:' ),
+       'sitename'                  => array( '1', 'SİTEADI', 'SITENAME' ),
+       'ns'                        => array( '0', 'AA:', 'AB:', 'NS:' ),
+       'nse'                       => array( '0', 'AAU:', 'ABU:', 'NSE:' ),
+       'localurl'                  => array( '0', 'YERELURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'YERELURLU:', 'LOCALURLE:' ),
+       'pageid'                    => array( '0', 'SAYFANO', 'PAGEID' ),
+       'server'                    => array( '0', 'SUNUCU', 'SERVER' ),
+       'servername'                => array( '0', 'SUNUCUADI', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'BETİKYOLU', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'BİÇEMYOLU', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'GRAMER:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'CİNSİYET:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__BAŞLIKDÖNÜŞÜMÜYOK__', '__BDY__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__İÇERİKDÖNÜŞÜMÜYOK__', '__İDY__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'MEVCUTHAFTA', 'GÜNCELHAFTA', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'MEVCUTHAFTANINGÜNÜ', 'GÜNCELHAFTANINGÜNÜ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'YERELHAFTA', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'YERELHAFTANINGÜNÜ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'SÜRÜMNU', 'SÜRÜMNO', 'REVİZYONNU', 'REVİZYONNO', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'SÜRÜMGÜNÜ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'SÜRÜMGÜNÜ2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'SÜRÜMAYI', 'REVISIONMONTH' ),
+       'revisionyear'              => array( '1', 'SÜRÜMYILI', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'SÜRÜMZAMANBİLGİSİ', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'SÜRÜMKULLANICI', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'ÇOĞUL:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'TAMURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'TAMURLU:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'KANONİKURL', 'CANONICALURL:' ),
+       'lcfirst'                   => array( '0', 'KHİLK:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'BHİLK:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'KH:', 'LC:' ),
+       'uc'                        => array( '0', 'BH:', 'UC:' ),
+       'raw'                       => array( '0', 'HAM:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'BAŞLIKGÖSTER', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__YENİBAŞLIKBAĞLANTISI__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__YENİBAŞLIKBAĞLANTISIYOK__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'MEVCUTSÜRÜM', 'GÜNCELSÜRÜM', 'CURRENTVERSION' ),
+       'currenttimestamp'          => array( '1', 'MEVCUTZAMANBİLGİSİ', 'GÜNCELZAMANBİLGİSİ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'YERELZAMANBİLGİSİ', 'LOCALTIMESTAMP' ),
+       'language'                  => array( '0', '#DİL:', '#LİSAN:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'İÇERİKDİLİ', 'İÇERİKLİSANI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'İSİMALANINDAKİSAYFALAR', 'İADAKİSAYFALAR', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'HİZMETLİSAYISI', 'NUMBEROFADMINS' ),
+       'special'                   => array( '0', 'özel', 'special' ),
+       'defaultsort'               => array( '1', 'VARSAYILANSIRALA:', 'VARSAYILANSIRALAMAANAHTARI:', 'VARSAYILANKATEGORİSIRALA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'DOSYA_YOLU:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'etiket', 'tag' ),
+       'hiddencat'                 => array( '1', '__GİZLİKAT__', '__GİZLİKATEGORİ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'KATEGORİDEKİSAYFALAR', 'KATTAKİSAYFALAR', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'SAYFABOYUTU', 'PAGESIZE' ),
+       'index'                     => array( '1', '__DİZİN__', '__ENDEKS__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__DİZİNYOK__', '__ENDEKSYOK__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'GRUPTAKİSAYI', 'GRUBUNSAYISI', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__STATİKYÖNLENDİRME__', '__SABİTYÖNLENDİRME__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'KORUMASEVİYESİ', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'formattarihi', 'tarihformatı', 'formatdate', 'dateformat' ),
+       'url_wiki'                  => array( '0', 'VİKİ', 'WIKI' ),
 );
 
 $separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -326,58 +329,57 @@ $messages = array(
 'tog-hideminor' => 'Son değişiklikler sayfasında küçük değişiklikleri gizle',
 'tog-hidepatrolled' => 'Son değişikliklerde gözden geçirilen düzenlemeleri gizle',
 'tog-newpageshidepatrolled' => 'Kontrol edilmiş sayfaları yeni sayfalar listesinde gizle',
-'tog-extendwatchlist' => 'İzleme listesini sadece son değil, tüm değişiklikleri görmek için genişlet',
-'tog-usenewrc' => 'Gelişmiş son değişiklikleri kullan (JavaScript gerekir)',
+'tog-extendwatchlist' => 'İzleme listesini sadece en son değil, tüm değişiklikleri göstermek için genişlet',
+'tog-usenewrc' => 'Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri gruplandırma (JavaScript gerektirir)',
 'tog-numberheadings' => 'Başlıkları otomatik numaralandır',
-'tog-showtoolbar' => 'Düzenleme yaparken araç çubuğunu göster (JavaScript gerekir)',
-'tog-editondblclick' => 'Çift tıklayarak sayfayı düzenle (JavaScript gerekir)',
-'tog-editsection' => 'Bölümleri [değiştir] bağlantıları ile düzenlemeyi etkinleştir',
-'tog-editsectiononrightclick' => 'Bölümleri bölüm başlığına sağ tıklayarak değiştirebilme olanağı ver (JavaScript)',
+'tog-showtoolbar' => 'Düzenleme yaparken araç çubuğunu göster (JavaScript gerektirir)',
+'tog-editondblclick' => 'Çift tıklayarak sayfaları düzenle (JavaScript gerektirir)',
+'tog-editsection' => 'Bölümleri [{{int:Editsection}}] bağlantıları ile düzenlemeyi etkinleştir',
+'tog-editsectiononrightclick' => 'Bölüm başlığına sağ tıklayarak bölümleri düzenleyebilme olanağı ver (JavaScript gerektirir)',
 'tog-showtoc' => 'İçindekiler tablosunu göster (3 taneden fazla başlığı olan sayfalar için)',
 'tog-rememberpassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
-'tog-watchcreations' => 'Oluşturmuş olduğum sayfaları izleme listeme ekle',
-'tog-watchdefault' => 'Değişiklik yapılan sayfayı izleme listesine ekle',
-'tog-watchmoves' => 'Taşıdığım sayfaları izleme listeme ekle',
-'tog-watchdeletion' => 'Sildiğim sayfaları izleme listeme ekle',
-'tog-minordefault' => "Değişikliği 'küçük değişiklik' olarak seçili getir",
-'tog-previewontop' => 'Önizlemeyi yazma alanın üstünde göster',
-'tog-previewonfirst' => 'Değiştirmede önizlemeyi göster',
-'tog-nocache' => 'Tarayıcı sayfalarını bellekleme',
-'tog-enotifwatchlistpages' => 'Sayfa değişikliklerinde bana e-posta gönder',
-'tog-enotifusertalkpages' => 'Kullanıcı sayfamda değişiklik olduğunda bana e-posta gönder',
-'tog-enotifminoredits' => 'Sayfalardaki küçük değişikliklerde de bana e-posta gönder',
+'tog-watchcreations' => 'Açtığım sayfaları ve yüklediğim dosyaları izleme listeme ekle',
+'tog-watchdefault' => 'Düzenleme yaptığım sayfaları ve dosyaları izleme listeme ekle',
+'tog-watchmoves' => 'Taşıdığım sayfaları ve dosyaları izleme listeme ekle',
+'tog-watchdeletion' => 'Sildiğim sayfaları ve dosyaları izleme listeme ekle',
+'tog-minordefault' => 'Varsayılan olarak bütün düzenlemeleri küçük olarak işaretle',
+'tog-previewontop' => 'Ön izlemeyi düzenleme kutusunun üstünde göster',
+'tog-previewonfirst' => 'İlk düzenlemede ön izlemeyi göster',
+'tog-nocache' => 'Tarayıcı sayfalarını önbelleğe almayı devre dışı bırak',
+'tog-enotifwatchlistpages' => 'İzleme listemdeki bir sayfanın ya da dosyanın değiştirilmesi durumunda bana e-posta gönder',
+'tog-enotifusertalkpages' => 'Kullanıcı mesaj sayfamda değişiklik olduğunda bana e-posta gönder',
+'tog-enotifminoredits' => 'Sayfalardaki ve dosyalardaki küçük değişikliklerde bana e-posta gönder',
 'tog-enotifrevealaddr' => 'E-posta adresimi bildiri postalarımda göster.',
 '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' => 'Harici düzenleyici kullan (deneyimli kullanıcılar içindir; bilgisayarınızda özel ayarlar gerektirir. [detaylı bilgi için : //www.mediawiki.org/wiki/Manual:External_editors])',
-'tog-externaldiff' => 'Harici karşılaştırıcı kullan (deneyimli kullanıcılar içindir; bilgisayarınızda özel ayarlar gerektirir. [detaylı bilgi için : //www.mediawiki.org/wiki/Manual:External_editors])',
-'tog-showjumplinks' => '"Git" bağlantısı etkinleştir',
-'tog-uselivepreview' => 'Canlı önizleme özelliğini kullan (JavaScript) (daha deneme aşamasında)',
+'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',
-'tog-watchlisthideown' => 'İzleme listemden benim değişikliklerimi gizle',
+'tog-watchlisthideown' => 'İzleme listemden düzenlemelerimi gizle',
 'tog-watchlisthidebots' => 'İzleme listemden bot değişikliklerini gizle',
 'tog-watchlisthideminor' => 'İzleme listemden küçük değişiklikleri gizle',
 'tog-watchlisthideliu' => 'İzleme listemde, kayıtlı kullanıcılar tarafından yapılan değişiklikleri gösterme',
-'tog-watchlisthideanons' => 'İzleme listemde, anonim kullanıcılar tarafından yapılan değişiklikleri gösterme',
-'tog-watchlisthidepatrolled' => 'İzleme listesinde gözlenmiş değişiklikleri gizle',
-'tog-nolangconversion' => 'Varyant dönüştürmesini devre dışı bırak',
+'tog-watchlisthideanons' => 'İzleme listemde, anonim kullanıcılar tarafından yapılan değişiklikleri gizle',
+'tog-watchlisthidepatrolled' => 'İzleme listesinde kontrol edilmiş değişiklikleri gizle',
 'tog-ccmeonemails' => 'Diğer kullanıcılara gönderdiğim e-postaların kopyalarını bana da gönder',
-'tog-diffonly' => 'Sayfa içeriğini sürüm farklarının aşağısında gösterme',
+'tog-diffonly' => 'Sayfa içeriğini sürüm farklarının altında gösterme',
 'tog-showhiddencats' => 'Gizli kategorileri göster',
 'tog-noconvertlink' => 'Bağlantı başlığı dönüştürmesini devre dışı bırakma',
-'tog-norollbackdiff' => 'Rollback uygulandıktan sonra değişikliği sil',
+'tog-norollbackdiff' => 'Geridönüş uygulandıktan sonra değişikliği atla',
 
 'underline-always' => 'Daima',
 'underline-never' => 'Asla',
-'underline-default' => 'Tarayıcı karar versin',
+'underline-default' => 'Tarayıcı varsayılanı',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Değişiklik alanı yazı tipi biçemi:',
+'editfont-style' => 'Düzenleme alanının yazı tipi:',
 'editfont-default' => 'Tarayıcı varsayılanı',
-'editfont-monospace' => 'Sabit yer kaplayan yazı tipi',
-'editfont-sansserif' => 'Sans-serif yazı tipi',
-'editfont-serif' => 'Serif yazı tipi',
+'editfont-monospace' => 'Sabit aralıklı yazı tipi',
+'editfont-sansserif' => 'Çıkıntısız (Sans-serif) yazı tipi',
+'editfont-serif' => 'Çıkıntılı (serif) yazı tipi',
 
 # Dates
 'sunday' => 'Pazar',
@@ -435,14 +437,14 @@ $messages = array(
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriler}}',
 'category_header' => '"$1" kategorisindeki sayfalar',
 'subcategories' => 'Alt kategoriler',
-'category-media-header' => '"$1" kategorisindeki medya',
-'category-empty' => "''Bu kategoride henüz herhangi bir madde ya da medya bulunmamaktadır.''",
+'category-media-header' => '"$1" kategorisindeki dosyalar',
+'category-empty' => "''Bu kategoride henüz herhangi bir sayfa ya da dosya bulunmamaktadır.''",
 'hidden-categories' => '{{PLURAL:$1|Gizli kategori|Gizli kategoriler}}',
 'hidden-category-category' => 'Gizli kategoriler',
-'category-subcat-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki {{PLURAL:$1|alt kategori|$1 alt kategori}} dahil $2 alt kategori vardır.}}',
+'category-subcat-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki {{PLURAL:$1|alt kategori|$1 alt kategorisi}} dahil $2 alt kategorisi vardır.}}',
 'category-subcat-count-limited' => 'Bu kategori aşağıdaki {{PLURAL:$1|alt kategoriye|$1 alt kategoriye}} sahiptir.',
 'category-article-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki sayfayı içermektedir.|Toplam $2 taneden, aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} bu kategoridedir.}}',
-'category-article-count-limited' => 'Aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} mevcut kategoridedir.',
+'category-article-count-limited' => 'Bu kategoride {{PLURAL:$1|sayfa|$1 sayfa}} bulunmaktadır.',
 'category-file-count' => '{{PLURAL:$2|Bu kategori sadece aşağıdaki dosyayı içerir.|Toplam $2 taneden, aşağıdaki {{PLURAL:$1|dosya|$1 dosya}} bu kategoridedir.}}',
 'category-file-count-limited' => 'Aşağıdaki {{PLURAL:$1|dosya|$1 dosya}} mevcut kategoridedir.',
 'listingcontinuesabbrev' => '(devam)',
@@ -565,7 +567,7 @@ $1',
 'edithelp' => 'Nasıl değiştirilir?',
 'edithelppage' => 'Help:Sayfa nasıl değiştirilir',
 'helppage' => 'Help:İçindekiler',
-'mainpage' => 'Ana sayfa',
+'mainpage' => 'Ana Sayfa',
 'mainpage-description' => 'Ana sayfa',
 'policy-url' => 'Project:Politika',
 'portal' => 'Topluluk portali',
@@ -586,13 +588,15 @@ $1',
 'youhavenewmessages' => 'Yeni $1 var ($2).',
 'newmessageslink' => 'mesajınız',
 'newmessagesdifflink' => 'son değişiklik',
+'newmessageslinkplural' => 'mesajınız',
+'newmessagesdifflinkplural' => 'son {{PLURAL:$1|değişiklik|değişiklikler}}',
 'youhavenewmessagesmulti' => "$1'de yeni mesajınız var.",
 'editsection' => 'düzenle',
 'editold' => 'değiştir',
 'viewsourceold' => 'kaynağı gör',
 'editlink' => 'değiştir',
 'viewsourcelink' => 'kaynağı gör',
-'editsectionhint' => '$1 bölümünü değiştir',
+'editsectionhint' => 'Değiştirilen bölüm: $1',
 'toc' => 'Konu başlıkları',
 'showtoc' => 'göster',
 'hidetoc' => 'gizle',
@@ -678,10 +682,12 @@ Lütfen URL\'yi not ederek bunu bir [[Special:ListUsers/sysop|hizmetliye]] ileti
 'cannotdelete' => '"$1" sayfa ya da dosyası silinemedi.
 Başka bir kullanıcı tarafından silinmiş olabilir.',
 'cannotdelete-title' => '"$1" sayfasını silemezsiniz',
+'delete-hook-aborted' => 'Silme işlemi kanca tarafından durduruldu. 
+Hiçbir açıklama yapılmadı.',
 'badtitle' => 'Geçersiz başlık',
 'badtitletext' => 'Girilen sayfa adı ya hatalı ya boş ya da diller arası bağlantı veya vikiler arası bağlantı içerdiğinden geçerli değil. Başlıklarda kullanılması yasak olan bir ya da daha çok karakter içeriyor olabilir.',
-'perfcached' => 'Veriler daha önceden hazırlanmış olabilir. Bu sebeple güncel olmayabilir! A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Aşağıda saklanmış bilgiler bulunmaktadır, son güncelleme tarihi: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Aşağıdaki veriler önbellekten alınmıştır ve güncel olmayabilir. Önbellekte en fazla {{PLURAL:$1|bir sonuç|$1 sonuç}} mevcut.',
+'perfcachedts' => 'Aşağıdaki veri önbelleklenmiştir, son güncelleme tarihi: $1. Önbellekte en fazla {{PLURAL:$1|bir sonuç|$4 sonuç}} mevcut.',
 'querypage-no-updates' => 'Şu an için güncellemeler devre dışı bırakıldı. Buradaki veri hemen yenilenmeyecektir.',
 'wrong_wfQuery_params' => 'wfQuery() ye yanlış parametre<br />
 Fonksiyon: $1<br />
@@ -705,6 +711,9 @@ $2',
 'ns-specialprotected' => '{{ns:special}} alanadı içindeki sayfalar değiştirilemez.',
 'titleprotected' => "[[User:$1|$1]] tarafından oluşturulması engellenmesi için bu sayfa koruma altına alınmıştır.
 Verilen sebep: ''$2''.",
+'invalidtitle-knownnamespace' => '"$2" alan adı için "$3" metni geçersiz bir başlık',
+'exception-nologin' => 'Giriş yapılmamış',
+'exception-nologin-text' => 'Bu sayfa ya da eylem için bu vikide oturum açmış olmanız gerekir.',
 
 # Virus scanner
 'virus-badscanner' => "Yanlış ayarlama: bilinmeyen virüs tarayıcı: ''$1''",
@@ -714,8 +723,8 @@ Verilen sebep: ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Oturumu kapattınız.'''
 
-Şimdi kimliğinizi belirtmeksizin {{SITENAME}} sitesini kullanmaya devam edebilirsiniz, ya da [[Special:UserLogin|yeniden oturum açabilirsiniz]] (ister aynı kullanıcı adıyla, ister başka bir kullanıcı adıyla).
-Web tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hala oturumunuz açıkmış gibi görünebilir.",
+Şimdi anonim olarak {{SITENAME}} sitesini kullanmaya devam edebilirsiniz ya da aynı kullanıcı adıyla ya da ister başka bir kullanıcı adıyla [[Special:UserLogin|yeniden oturum açabilirsiniz]].
+Tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hâlâ oturumunuz açıkmış gibi görünebilir.",
 'welcomecreation' => '== Hoş geldin, $1! ==
 
 Hesabınız açıldı.
@@ -726,6 +735,7 @@ Hesabınız açıldı.
 'remembermypassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
 'securelogin-stick-https' => "Giriş yaptıktan sonra HTTPS'e bağlı kal",
 'yourdomainname' => 'Alan adınız:',
+'password-change-forbidden' => 'Bu vikide parolanızı değiştiremezsiniz.',
 'externaldberror' => 'Ya doğrulama veritabanı hatası var ya da kullanıcı hesabınızı güncellemeye yetkiniz yok.',
 'login' => 'Oturum aç',
 'nav-login-createaccount' => 'Oturum aç / hesap oluştur',
@@ -757,7 +767,7 @@ Lütfen çerez kullanımını açınız ve yeni kullanıcı adınız ve şifreni
 Çerezlerin açık olduğundan emin olun ve bu sayfayı yeniden yükleyip tekrar deneyin.',
 'noname' => 'Geçerli bir kullanıcı adı girmediniz.',
 'loginsuccesstitle' => 'Oturum açıldı',
-'loginsuccess' => '{{SITENAME}} sitesinde "$1" kullanıcı adıyla oturum açmış bulunmaktasınız.',
+'loginsuccess' => "'''{{SITENAME}} üzerinde \"\$1\" kullanıcı adıyla oturum açtınız.'''",
 'nosuchuser' => '"$1" adında bir kullanıcı bulunmamaktadır.
 Kullanıcı adları büyük-küçük harf duyarlıdır.
 Yazılışı kontrol edin veya [[Special:UserLogin/signup|yeni bir hesap açın]].',
@@ -785,7 +795,7 @@ Hizmeti kötüye kullanmayı önlemek için, her {{PLURAL:$1|bir saatte|$1 saatt
 'mailerror' => 'E-posta gönderim hatası: $1',
 'acct_creation_throttle_hit' => 'Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler son günde {{PLURAL:$1|1 hesap|$1 hesap}} oluşturdu, bu sayı bu zaman aralığında izin verilen azami sayıdır.
 Sonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.',
-'emailauthenticated' => 'E-posta adresiniz $2 $3 tarihinde doğrulanmıştı.',
+'emailauthenticated' => 'E-posta adresiniz $2 $3 tarihinde doğrulandı.',
 'emailnotauthenticated' => 'E-posta adresiniz henüz onaylanmadı.
 Aşağıdaki işlevlerin hiçbiri için e-posta gönderilmeyecektir.',
 'noemailprefs' => 'Bu özelliklerin çalışması için bir e-posta adresi belirtiniz.',
@@ -793,6 +803,7 @@ Aşağıdaki işlevlerin hiçbiri için e-posta gönderilmeyecektir.',
 'invalidemailaddress' => 'Geçersiz bir formatta yazıldığından dolayı bu e-posta adresi kabul edilemez.
 Lütfen geçerli bir formatta e-posta adresi yazın veya bu bölümü boş bırakın.',
 'cannotchangeemail' => 'Hesabın e-posta adresi bu wiki üzerinden değiştirilemez.',
+'emaildisabled' => 'Bu siteden e-posta gönderemezsiniz.',
 'accountcreated' => 'Hesap açıldı',
 'accountcreatedtext' => '$1 için bir kullanıcı hesabı açıldı.',
 'createaccount-title' => '{{SITENAME}} için yeni kullanıcı hesabı oluşturulması',
@@ -1022,8 +1033,8 @@ Yaptığınız katkının başka katılımcılar tarafından acımasızca deği
 Ayrıca buraya katkıda bulunarak, bu katkının kendiniz tarafından yazıldığına ya da kamuya açık bir kaynaktan ya da başka bir özgür/ücretsiz kaynaktan kopyalandığına güvence vermiş oluyorsunuz. '''Buraya, telif sahibinin izni olmadan telif hakkı ile korunan eserleri eklemeyiz! '''",
 'copyrightwarning2' => 'Lütfen, {{SITENAME}} sitesine bulunacağınız tüm katkıların diğer üyeler tarafından düzenlenebileceğini, değiştirilebileceğini ya da silinebileceğini hatırlayın. Yazılarınızın merhametsizce değiştirilebilmesine rıza göstermiyorsanız buraya katkıda bulunmayın. <br />
 Ayrıca bu ekleyeceğiniz yazıyı sizin yazdığınızı ya da serbest kopyalama izni veren bir kaynaktan kopyaladığınızı bize taahhüt etmektesiniz (ayrıntılar için referans: $1).',
-'longpageerror' => "'''HATA: Girdiğiniz metnin uzunluğu {{PLURAL:$1|bir kilobayt|$1 kilobayt}}, ve en fazla uzunluktan {{PLURAL:$2|bir kilobayt|$2 kilobayt}} daha fazladır.
-Kaydedilmesi mümkün değildir.'''",
+'longpageerror' => "'''Hata: Girdiğiniz metnin uzunluğu kabul edilebilir en fazla uzunluk olan {{PLURAL:$2|bir kilobayt|$2 kilobayt}}tan fazladır ve {{PLURAL:$1|bir kilobayt|$1 kilobayt}} büyüklüğündedir.'''
+Değişikliğiniz kaydedilemez.",
 'readonlywarning' => "'''DİKKAT: Bakım nedeni ile veritabanı şu anda kilitlidir. Bu sebeple değişiklikleriniz şu anda kaydedilememektedir. Yazdıklarınızı başka bir editöre alıp saklayabilir ve daha sonra tekrar buraya getirip kaydedebilirsiniz'''
 
 Kilitleyen hizmetli şu açıklamayı eklemiştir: $1",
@@ -1109,8 +1120,8 @@ $3 tarafından verilen sebep ''$2''",
 'last' => 'son',
 'page_first' => 'ilk',
 'page_last' => 'son',
-'histlegend' => "Fark seçimi: karşılaştırmayı istediğiniz 2 sürümün önündeki daireleri işaretleyip, enter'a ya da sayfanın en altında bulunan düğmeye basın.<br />
-Tanımlar: '''({{int:cur}})''' = güncel sürümle aradaki fark, '''({{int:last}})''' = bir önceki sürümle aradaki fark, '''{{int:minoreditletter}}''' = küçük değişiklik.",
+'histlegend' => "Fark seçimi: Karşılaştırmayı istediğiniz 2 sürümün önündeki daireleri işaretleyip, \"{{int:Compareselectedversions}}\" düğmesine basın.<br />
+Tanımlar: '''({{int:cur}})''' = son revizyon ile arasındaki fark, '''({{int:last}})''' = bir önceki revizyon ile arasındaki fark, '''{{int:minoreditletter}}''' = küçük değişiklik.",
 'history-fieldset-title' => 'Geçmişe gözat',
 'history-show-deleted' => 'Sadece silinenler',
 'histfirst' => 'En eski',
@@ -1258,6 +1269,7 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 
 # Diffs
 'history-title' => '"$1" sayfasının geçmişi',
+'difference-title' => '"$1" sayfasının sürümleri arasındaki fark',
 'difference-multipage' => '(Sayfalar arasındaki fark)',
 'lineno' => '$1. satır:',
 'compareselectedversions' => 'Seçilen sürümleri karşılaştır',
@@ -1353,6 +1365,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'prefs-beta' => 'Beta özellikleri',
 'prefs-datetime' => 'Tarih ve saat',
 'prefs-labs' => 'Lab özellikleri',
+'prefs-user-pages' => 'Kullanıcı sayfaları',
 'prefs-personal' => 'Kullanıcı bilgileri',
 'prefs-rc' => 'Son değişiklikler',
 'prefs-watchlist' => 'İzleme listesi',
@@ -1385,7 +1398,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'prefs-help-watchlist-token' => 'Bu alanı gizli bir anahtarla doldurmak, izleme listeniz için bir RSS beslemesi oluşturur.
 Bu alandaki anahtarı bilen herkes izleme listenizi okuyabilir, bu yüzden güvenli bir değer seçin.
 Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
-'savedprefs' => 'Ayarlar kaydedildi.',
+'savedprefs' => 'Tercihleriniz kaydedildi.',
 'timezonelegend' => 'Zaman dilimi:',
 'localtime' => 'Yerel saat:',
 'timezoneuseserverdefault' => 'Viki varsayılanını kullanın ($1)',
@@ -1674,9 +1687,9 @@ Bu sayfanın silme ve taşıma günlüğü kolaylık için burada sağlanmışt
 Önceden yüklenmiş dosyaları görmek ya da aramak için [[Special:FileList|yüklenmiş dosyalar listesine]] bakın, (tekrar) yüklenenler [[Special:Log/upload|yükleme günlüğü]]nde, silinenler [[Special:Log/delete|silinme günlüğü]]nde tutulumaktadır.
 
 Bir sayfaya dosya koymak için bağlantınızda aşağıdaki formlardan birini kullanın;
-* Dosyanın tam sürümünü kullanmak için: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.jpg]]</nowiki></tt>'''
-* Sol kenarda bir kutu içinde, altında tanım olarak 'alt metin' ile, 200 piksel genişiğindeki sürümü kullanmak için: '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.png|200px|thumb|left|alt metin]]</nowiki></tt>'''
-* Dosyayı göstermeden, dosyaya direk bağlantı vermek için: '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosya.ogg]]</nowiki></tt>'''",
+* Dosyanın tam sürümünü kullanmak için: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.jpg]]</nowiki></code>'''
+* Sol kenarda bir kutu içinde, altında tanım olarak 'alt metin' ile, 200 piksel genişiğindeki sürümü kullanmak için: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.png|200px|thumb|left|alt metin]]</nowiki></code>'''
+* Dosyayı göstermeden, dosyaya direk bağlantı vermek için: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosya.ogg]]</nowiki></code>'''",
 'upload-permitted' => 'İzin verilen dosya türleri: $1.',
 'upload-preferred' => 'Tercih edilen dosya türleri: $1.',
 'upload-prohibited' => 'Yasaklanan dosya türleri: $1.',
@@ -1718,21 +1731,21 @@ bu dosyanın boyutu $2.',
 'largefileserver' => 'Bu dosyanın uzunluğu sunucuda izin verilenden daha büyüktür.',
 'emptyfile' => 'Yüklediğiniz dosya boş görünüyor. Bunun sebebi dosya adındaki bir yazım hatası olabilir. Lütfen dosyayı gerçekten yüklemek isteyip istemediğinizden emin olun.',
 'windows-nonascii-filename' => 'Bu viki dosya isimlerinde özel karakter kullanımını desteklemiyor',
-'fileexists' => "Bu isimde bir dosya mevcut.
-Eğer değiştirmekten emin değilseniz ilk önce '''<tt>[[:$1]]</tt>''' dosyasına bir gözatın.
-[[$1|thumb]]",
-'filepageexists' => "Bu dosya için açıklama sayfası '''<tt>[[:$1]]</tt>''' adresinde zaten oluşturulmuş, fakat bu isimde bir dosya şu anda mevcut değil.
+'fileexists' => 'Bu isimde bir dosya mevcut.
+Eğer değiştirmekten emin değilseniz ilk önce <strong>[[:$1]]</strong> dosyasına bir gözatın.
+[[$1|thumb]]',
+'filepageexists' => 'Bu dosya için açıklama sayfası <strong>[[:$1]]</strong> adresinde zaten oluşturulmuş, fakat bu isimde bir dosya şu anda mevcut değil.
 Gireceğiniz özet açıklama sayfasında görünmeyecektir.
 Özetinizin orada görünmesi için, bunu elle değiştirmelisiniz.
-[[$1|küçük resim]]",
-'fileexists-extension' => "Benzer isimle başka bir dosya mevcut: [[$2|thumb]]
-* Yüklenilen dosyanın adı: '''<tt>[[:$1]]</tt>'''
-* Varolan dosyanın adı: '''<tt>[[:$2]]</tt>'''
-Lütfen başka bir isim seçin",
+[[$1|küçük resim]]',
+'fileexists-extension' => 'Benzer isimle başka bir dosya mevcut: [[$2|thumb]]
+* Yüklenilen dosyanın adı: <strong>[[:$1]]</strong>
+* Varolan dosyanın adı: <strong>[[:$2]]</strong>
+Lütfen başka bir isim seçin',
 'fileexists-thumbnail-yes' => "Bu dosya, bir resmi küçültülmüş sürümü gibi görünüyor ''(thumbnail)''. [[$1|thumb]]
-Lütfen '''<tt>[[:$1]]</tt>''' dosyasını kontrol edin .
+Lütfen <strong>[[:$1]]</strong> dosyasını kontrol edin .
 Eğer kontrol edilen dosya ile özgün boyutundaki aynı dosyaysa fazladan küçük resim yüklemeye gerek yoktur.",
-'file-thumbnail-no' => "Bu dosyanın adı '''<tt>$1</tt>''' ile başlıyor.
+'file-thumbnail-no' => "Bu dosyanın adı <strong>$1</strong> ile başlıyor.
 Bu başka bir resim küçültülmüş sürümüne benziyor ''(thumbnail)''
 Eğer sizde bu resmin tam çöznürlükteki sürümü varsa onu yükleyin, aksi takdirde lütfen dosya adını değiştirin.",
 'fileexists-forbidden' => 'Bu isimde bir dosya zaten var, ve üzerine yazılamıyor.
@@ -1808,7 +1821,7 @@ Eğer sorun tekrarlanırsa, bir [[Special:ListUsers/sysop|hizmetli]] ile temasa
 'backend-fail-opentemp' => 'Geçici dosya açılamadı.',
 'backend-fail-closetemp' => 'Geçici dosya kapanamadı.',
 'backend-fail-read' => '$1 dosyası okunamadı.',
-'backend-fail-create' => '$1 dosyası oluşturulamadı.',
+'backend-fail-create' => '$1 dosyası yazılamadı.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Dosya ZIP denetimleri için açılırken bir hata ile karşılaşıldı.',
@@ -1955,7 +1968,7 @@ Aşağıda [$2 dosya açıklama sayfasındaki] açıklama gösteriliyor.',
 
 # MIME search
 'mimesearch' => 'MIME araması',
-'mimesearch-summary' => 'Bu sayfa, MIME türü dosyaların süzülmesini sağlar. Girdi: içeriktürü/alttürü, e.g. <tt>resim/jpeg</tt>.',
+'mimesearch-summary' => 'Bu sayfa, MIME türü dosyaların süzülmesini sağlar. Girdi: içeriktürü/alttürü, e.g. <code>resim/jpeg</code>.',
 'mimetype' => 'MIME türü:',
 'download' => 'yükle',
 
@@ -2142,8 +2155,9 @@ Ayrıca [[Special:WantedCategories|İstenen kategoriler]]'e bakınız.",
 'linksearch-pat' => 'Motif ara:',
 'linksearch-ns' => 'Ad alanı:',
 'linksearch-ok' => 'Ara',
-'linksearch-text' => '"*.wikipedia.org" gibi jokerler kullanılabilir.<br />
-Desteklenen iletişim kuralları: <tt>$1</tt>',
+'linksearch-text' => '"*.wikipedia.org" gibi jokerler kullanılabilir.
+En az bir üst-seviye alan gerekir, örneğin "*.org".<br />
+Desteklenen iletişim kuralları: <code>$1</code> (bunların hiçbirini aramanıza eklemeyin).',
 'linksearch-line' => "$1'e $2'den bağlantı verilmiş",
 'linksearch-error' => 'Jokerler sadece ana makine adının başında görünebilir.',
 
@@ -2962,14 +2976,9 @@ Geçici dosya kayıp.',
 # Info page
 'pageinfo-title' => 'Bilgi için "$1"',
 'pageinfo-header-edits' => 'Değişiklikler',
-'pageinfo-header-watchlist' => 'İzleme listesi',
-'pageinfo-header-views' => 'Görüntüle',
-'pageinfo-subjectpage' => 'Sayfa',
-'pageinfo-talkpage' => 'Tartışma sayfası',
+'pageinfo-views' => 'Görüntülenme sayısı',
 'pageinfo-watchers' => 'İzleyen sayısı',
 'pageinfo-edits' => 'Değişiklik sayısı',
-'pageinfo-views' => 'Görüntülenme sayısı',
-'pageinfo-viewsperedit' => 'Değişiklik başına görüntüleme',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -3791,6 +3800,7 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'logentry-move-move' => '$1 $3 sayfasını $4 sayfasına taşıdı',
 'logentry-move-move-noredirect' => '$1 $3 sayfasını $4 sayfasına yönlendirme olmaksızın taşıdı',
 'logentry-move-move_redir' => '$1 $3 sayfasını $4 sayfasına yönlendirme üzerinden taşıdı',
+'logentry-patrol-patrol-auto' => '$1 $3 sayfasını $4 sürümü ile kontrol etti',
 'logentry-newusers-newusers' => '$1 kullanıcı hesabı oluşturdu',
 'logentry-newusers-create' => '$1 kullanıcı hesabı oluşturdu',
 'logentry-newusers-create2' => '$1 kullanıcı hesabı oluşturdu $3',
@@ -3819,6 +3829,7 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'api-error-file-too-large' => 'Gönderdiğiniz dosya çok büyük.',
 'api-error-filename-tooshort' => 'Dosya adı çok kısa.',
 'api-error-filetype-banned' => 'Bu dosya biçimi yasaklanmıştır.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|izin verilen bir dosya türü değil|izin verilen bir dosya türü değil}}. İzin verilen {{PLURAL:$3|dosya türü|dosya türleri}} $2.',
 'api-error-filetype-missing' => 'Dosya uzantısı eksik.',
 'api-error-http' => 'İç hata: sunucu ile bağlantı kurulamıyor.',
 'api-error-illegal-filename' => 'Bu dosya adına izin verilmiyor.',
diff --git a/languages/messages/MessagesTru.php b/languages/messages/MessagesTru.php
new file mode 100644 (file)
index 0000000..9076890
--- /dev/null
@@ -0,0 +1,881 @@
+<?php
+/** Turoyo (Ṫuroyo)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Ariyo
+ */
+
+$messages = array(
+# User preference toggles
+'tog-oldsig' => 'Imḍa du3do:',
+
+'underline-always' => 'Kulnaqa',
+'underline-never' => 'Hiç',
+
+# Dates
+'sunday' => 'Yawme dḤuşabo',
+'monday' => 'Yawme dTre',
+'tuesday' => 'Yawme dTloṭo',
+'wednesday' => 'Yawme dArb³o',
+'thursday' => 'Yawme dḤamşo',
+'friday' => 'Yawme d3rufto',
+'saturday' => 'Yawme dŞabṭo',
+'sun' => 'Yawme dḤuşabo',
+'mon' => 'Yawme dTre',
+'tue' => 'Yawme dTloṭo',
+'wed' => 'Yawme dArb³o',
+'thu' => 'Yawme dḤamşo',
+'fri' => 'Yawme d3rufto',
+'sat' => 'Yawme dŞabṭo',
+'january' => 'Konun ḥroy',
+'february' => 'Şboṫ',
+'march' => 'Oḍor',
+'april' => 'Nison',
+'may_long' => 'İyor',
+'june' => 'Ḥziron',
+'july' => 'Tamuz',
+'august' => 'Ob',
+'september' => 'Eylül',
+'october' => 'Teşrin qḍim',
+'november' => 'Teşrin ḥroy',
+'december' => 'Konun qḍim',
+'january-gen' => 'Konun ḥroy',
+'february-gen' => 'Şboṫ',
+'march-gen' => 'Oḍor',
+'april-gen' => 'Nison',
+'may-gen' => 'İyor',
+'june-gen' => 'Ḥziron',
+'july-gen' => 'Tamuz',
+'august-gen' => 'Ob',
+'september-gen' => 'Eylül',
+'october-gen' => 'Teşrin qḍim',
+'november-gen' => 'Teşrin ḥroy',
+'december-gen' => 'Konun qḍim',
+'jan' => 'Konun II',
+'feb' => 'Şboṫ',
+'mar' => 'Oḍor',
+'apr' => 'Nison',
+'may' => 'İyor',
+'jun' => 'Ḥziron',
+'jul' => 'Tamuz',
+'aug' => 'Ob',
+'sep' => 'Eylül',
+'oct' => 'Teşrin I',
+'nov' => 'Teşrin II',
+'dec' => 'Konun I',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Sedro|Sedre}}',
+'category_header' => 'Faṭoṭe bu Sedro "$1"',
+'subcategories' => 'Sedre na³ime',
+'category-media-header' => 'Mediya buSedro "$1"',
+'category-empty' => 'U³do layto Faṭo aw Mediya buSedrano.',
+'hidden-categories' => '{{PLURAL:$1|Hidden category|Hidden categories}}',
+'category-subcat-count' => '{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}',
+'category-article-count' => '{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}',
+'category-file-count' => '{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}',
+'listingcontinuesabbrev' => 'mdawam',
+'noindex-category' => 'Noindexed pages',
+
+'about' => '3al',
+'newwindow' => '(gmıftaḥ bKawṭo ḥaṭto)',
+'cancel' => 'Mbaṫel',
+'moredotdotdot' => 'Heşa...',
+'mypage' => 'iFaṭayḍi',
+'mytalk' => 'uMamlayḍi',
+'navigation' => 'Navigasyon',
+'and' => '&#32;u',
+
+# Cologne Blue skin
+'qbfind' => 'Ḥzay',
+'qbbrowse' => 'Krax',
+'qbedit' => 'Mşaḥlaf',
+'qbpageoptions' => 'iFaṭaṭe',
+'qbmyoptions' => 'aFaṭoṭayḍi',
+'qbspecialpages' => 'Faṭoṭe dilonoye',
+'faq' => 'Şuwole',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => 'Maḥat Fusoqo ḥaṭo',
+'vector-action-delete' => 'Slag',
+'vector-action-move' => 'Mtaxar',
+'vector-action-protect' => 'Mastar',
+'vector-view-create' => 'Xlaq',
+'vector-view-edit' => 'Mşaḥlaf',
+'vector-view-history' => 'Maktabzabno',
+'vector-view-view' => 'Qray',
+'vector-view-viewsource' => 'Maḥway li aMabu³e.',
+'actions' => 'Dubore',
+'namespaces' => 'Dukṭo luIşmo',
+'variants' => 'Variants',
+
+'errorpagetitle' => 'Fawdo',
+'returnto' => 'D³ar l$1',
+'tagline' => 'men {{SITENAME}}',
+'help' => '3udrono',
+'search' => 'krax',
+'searchbutton' => 'Krax',
+'go' => 'Zux',
+'searcharticle' => 'Zux',
+'history' => 'Maktabzabno diFaṭo',
+'history_short' => 'Maktabzabno',
+'updatedmarker' => 'aŞuḥlofe datsimi miNaqa du3boroayḍi ḥaroyo',
+'printableversion' => 'Printable version',
+'permalink' => 'Asiruṭo aminoyto',
+'print' => 'Ṫba³',
+'view' => 'Qray',
+'edit' => 'Mşaḥlaf',
+'create' => 'Xlaq',
+'editthispage' => 'Mşaḥlaf iFaṭaṭe',
+'create-this-page' => 'Xlaq iFaṭaṭe',
+'delete' => 'Slag',
+'deletethispage' => 'Slag iFaṭaṭe',
+'protect' => 'Mastar',
+'protect_change' => 'mşaḥlaf',
+'protectthispage' => 'Mastar iFaṭaṭe',
+'newpage' => 'Faṭo ḥaṭto',
+'talkpage' => 'Sım Droşo 3al iFaṭaṭe',
+'talkpagelinktext' => 'Mamlo',
+'specialpage' => 'Faṭo dilonoyto',
+'personaltools' => 'aMonayḍi',
+'postcomment' => 'Fusoqo ḥaṭo',
+'articlepage' => 'Ḥur baḤbişoṭo',
+'talk' => 'Droşo',
+'views' => 'Ḥzayoṭo',
+'toolbox' => 'Mone',
+'viewtalkpage' => 'Ḥur buDroşo',
+'otherlanguages' => 'bLeşone ḥrene',
+'redirectedfrom' => '(Redirected from $1)',
+'lastmodifiedat' => 'uŞuḥlofo ḥaroyo diFaṭaṭe bu Zabnano wa:  $1 $2 .',
+'jumpto' => 'Zux l',
+'jumptonavigation' => 'Navigasyon',
+'jumptosearch' => 'Kruxyo',
+'pool-errorunknown' => 'Fawdo nuxroyo',
+
+# 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' => '3al {{SITENAME}}',
+'aboutpage' => 'Project: 3al',
+'copyrightpage' => '{{ns:project}}:Ḥaqat duKaṭowo',
+'currentevents' => 'Gedşe ḥaṭe',
+'currentevents-url' => 'Project:Gedşe du³do',
+'disclaimers' => 'Disclaimers',
+'disclaimerpage' => 'Project: Disclaimer gawonoyo',
+'edithelp' => 'Editing help',
+'edithelppage' => 'Help:Mşaḥlaf',
+'helppage' => 'Help: Ḥbişoṭo',
+'mainpage' => 'Faṭo rişoyto',
+'mainpage-description' => 'Faṭo rişoyto',
+'portal' => 'Portal diJama³a',
+'portal-url' => 'Project: Portal diJama³a',
+'privacy' => 'Setoro daMawd³onwoṭo',
+'privacypage' => 'Project: Setoro daMawd³onwoṭo',
+
+'badaccess-group0' => 'Hat latlux uFsoso dkolozım dsaymat iḤarakaṭe.',
+
+'ok' => 'Tamam',
+'retrievedfrom' => 'men "$1"',
+'youhavenewmessages' => 'Kıtlux $1 ($2) .',
+'newmessageslink' => 'Ṫebe ḥaṭe',
+'newmessagesdifflink' => 'Degoşo ḥaroyo',
+'youhavenewmessagesmulti' => 'Kitlux Ṫebe ḥaṭe b$1',
+'editsection' => 'mşaḥlaf',
+'editold' => 'mşaḥlaf',
+'viewsourceold' => 'Maḥway li uMabu³o.',
+'editlink' => 'mşaḥlaf',
+'viewsourcelink' => 'Maḥway li uMabu³o.',
+'editsectionhint' => 'Mşaḥlaf uFusoqano: $1',
+'toc' => 'Ḥbişoṭo',
+'showtoc' => 'maḥway',
+'hidetoc' => 'tlay',
+'collapsible-collapse' => 'sxar',
+'collapsible-expand' => 'ftaḥ',
+'feedlinks' => 'Feed:',
+'site-rss-feed' => '$1 RSS feed',
+'site-atom-feed' => '$1 Atom feed',
+'page-rss-feed' => '"$1" RSS feed',
+'page-atom-feed' => 'Atom feed l"$1"',
+'red-link-title' => '$1 (layto iFaṭaṭe)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Faṭo',
+'nstab-user' => 'Faṭo duHadomo',
+'nstab-media' => 'Faṭo diMediya',
+'nstab-special' => 'Faṭo dilonoyto',
+'nstab-project' => 'Faṭo diProja',
+'nstab-image' => 'Fayl',
+'nstab-mediawiki' => 'Ṫebo',
+'nstab-template' => 'Template',
+'nstab-help' => 'Faṭo d3udrono',
+'nstab-category' => 'Sedro',
+
+# General errors
+'error' => 'Fawdo',
+'missing-article' => 'uSyomo d$1 $2 lo komaḥwe biDatabase.
+
+iFaṭaṭe belki sligo aw mtaxro merke.
+
+Elo iḍa dlo howe hawxa belki ḥselux Fawdo biSoftware. Bo³o haw Ṫebo l[[Special:ListUsers/sysop|Administrator]] u kṭaw u"URL".',
+'missingarticle-rev' => '(Numara duVersyon: $1)',
+'badtitle' => 'Bad title',
+'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
+It may contain one or more characters which cannot be used in titles.',
+'viewsource' => 'Maḥway li aMabu³e.',
+'namespaceprotected' => "Hat latlux Ḥaq dımşaḥılfat Faṭoṭe bi'''$1''' Dukṭo xliṭo.",
+
+# Virus scanner
+'virus-unknownscanner' => 'Antivirus nuxroyo:',
+
+# Login and logout pages
+'yourname' => 'Işme duHadomo:',
+'yourpassword' => 'Qliḍo:',
+'yourpasswordagain' => 'Naqla ḥreto kṭaw uQliḍo:',
+'remembermypassword' => 'Dxar uQliḍayḍi buBrowser (buSowudo $1 {{PLURAL:$1|Yawmo|Yawme}})',
+'login' => '3bar',
+'nav-login-createaccount' => '3bar / Hway Hadomo',
+'loginprompt' => 'Glozım maqablat Cookies qanna dqudrat fıtḥat {{SITENAME}}.',
+'userlogin' => '3bar / Hway Hadomo',
+'userloginnocreate' => '3bar',
+'logout' => 'Nfoqo',
+'userlogout' => 'Nfoqo',
+'notloggedin' => 'Heş lo3abirat.',
+'nologin' => 'Heş lawit Hadomo? $1',
+'nologinlink' => 'Hway Hadomo',
+'createaccount' => 'Hway Hadomo',
+'gotaccount' => 'Ma hawit ste Hadomo? $1',
+'gotaccountlink' => '3bar',
+'userlogin-resetlink' => 'Ṫa³at uQliḍayḍox?',
+'createaccountmail' => 'buEmail',
+'wrongpassword' => 'uQliḍayḍux fawdo yo.
+Mjarab Naqla ḥreto.',
+'wrongpasswordempty' => 'Lo msta³melux uQliḍayḍux.
+Mjarab Naqla ḥreto.',
+'password-name-match' => 'Glozım towe Frişuṭo beyn uQliḍo u uIşmayḍux.',
+'mailmypassword' => 'Mşadar li Qliḍo ḥaṭo',
+'loginlanguagelabel' => 'Leşono: $1',
+
+# Change password dialog
+'resetpass' => 'Mşaḥlaf uQliḍo.',
+'oldpassword' => 'Qliḍo 3atiqo:',
+'newpassword' => 'Qliḍo ḥaṭo:',
+'retypenew' => 'Qliḍo ḥaṭo (disa):',
+'resetpass-submit-loggedin' => 'Mşaḥlaf uQliḍo',
+
+# Special:PasswordReset
+'passwordreset-username' => 'Işme duHadomo:',
+
+# Special:ChangeEmail
+'changeemail-newemail' => 'Email-adres ḥaṭo:',
+
+# Edit page toolbar
+'bold_sample' => 'Ḥarfe ḥlime',
+'bold_tip' => 'Ḥarfe ḥlime',
+'italic_sample' => 'Ḥarfe 3wije',
+'italic_tip' => 'Ḥarfe 3wije',
+'link_sample' => 'Link title',
+'link_tip' => 'Internal link',
+'extlink_sample' => 'http://www.example.com link title',
+'extlink_tip' => 'External link (remember http:// prefix)',
+'headline_sample' => 'Headline text',
+'headline_tip' => 'Level 2 headline',
+'nowiki_sample' => 'Insert non-formatted text here',
+'nowiki_tip' => 'uSyomano latyo buFormat',
+'image_tip' => 'Embedded file',
+'media_tip' => 'File link',
+'sig_tip' => 'Mḍay herke u kṭaw iSa³aye muqa yo.',
+'hr_tip' => 'Horizontal line (use sparingly)',
+
+# Edit pages
+'summary' => 'Summary:',
+'minoredit' => 'This is a minor edit',
+'watchthis' => 'Watch this page',
+'savearticle' => 'Mqayad iFaṭaṭe',
+'preview' => 'Preview',
+'showpreview' => 'Show preview',
+'showdiff' => 'Maḥway aŞuḥlofe',
+'anoneditwarning' => "'''Diqad''' Heş lo 3abirat.
+uIP-Adresayḍux gmikṭaw buMaktabzabno diFaṭaṭe. Kul Noşo kibe ḥozele u lo komislag.",
+'loginreqtitle' => 'Glozım 3obrat',
+'loginreqlink' => '3bar',
+'loginreqpagetext' => 'Glozım $1 qanna dqudrat ḥozat Faṭoṭe ḥrene.',
+'newarticle' => '(Ḥaṭo)',
+'newarticletext' => "You have followed a link to a page that does not exist yet.
+To create the page, start typing in the box below (see the [[{{MediaWiki:Helppage}}|help page]] for more info).
+If you are here by mistake, click your browser's '''back''' button.",
+'noarticletext' => 'There is currently no text in this page.
+You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],
+or [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.',
+'noarticletext-nopermission' => 'There is currently no text in this page.
+You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,
+or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.',
+'previewnote' => "'''Remember that this is only a preview.'''
+Your changes have not yet been saved!",
+'editing' => 'Şuḥlofo d$1',
+'editingsection' => 'Mşaḥlaf $1 (Fusoqo)',
+'yourtext' => 'uSyomayḍux',
+'yourdiff' => 'Frişwoṭo',
+'templatesused' => '{{PLURAL:$1|Template|Templates}} used on this page:',
+'template-protected' => '(protected)',
+'template-semiprotected' => '(semi-protected)',
+'hiddencategories' => 'This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:',
+'permissionserrorstext-withaction' => 'You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:',
+'recreate-moveddeleted-warn' => "'''Warning: You are recreating a page that was previously deleted.'''
+
+You should consider whether it is appropriate to continue editing this page.
+The deletion and move log for this page are provided here for convenience:",
+'moveddeleted-notice' => 'iFaṭaṭe sligto yo.
+The deletion and move log for the page are provided below for reference.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Warning:''' Template include size is too large.
+Some templates will not be included.",
+'post-expand-template-inclusion-category' => 'Pages where template include size is exceeded',
+'post-expand-template-argument-warning' => "'''Warning:''' This page contains at least one template argument which has a too large expansion size.
+These arguments have been omitted.",
+'post-expand-template-argument-category' => 'Pages containing omitted template arguments',
+
+# History pages
+'viewpagelogs' => 'View logs for this page',
+'currentrev-asof' => 'Latest revision as of $1',
+'revisionasof' => 'Versyon 3atiqo diNaqa: $1',
+'revision-info' => 'Revision as of $1 by $2',
+'previousrevision' => '←Versyon 3atiqtır',
+'nextrevision' => 'Versyon ḥaṭtır',
+'currentrevisionlink' => 'Latest revision',
+'cur' => 'du³do',
+'next' => 'Ḥreto',
+'last' => 'dmeqım',
+'page_first' => 'Badaye',
+'page_last' => 'Ḥarayto',
+'histlegend' => "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />
+Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})''' = difference with preceding revision, '''{{int:minoreditletter}}''' = minor edit.",
+'history-fieldset-title' => 'Krax buMaktabzabno',
+'history-show-deleted' => 'Bes aSlige',
+'histfirst' => 'Meqım kulle',
+'histlast' => 'Ḥaṭo',
+'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
+'historyempty' => '(xalyo)',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1  b$2',
+
+# Revision deletion
+'rev-delundel' => 'maḥway / tlay',
+'rev-showdeleted' => 'maḥway',
+'revdelete-show-file-submit' => 'Eh',
+'revdelete-radio-same' => '(lo mşaḥalfat)',
+'revdelete-radio-set' => 'Eh',
+'revdelete-radio-unset' => 'Lo',
+'revdel-restore' => 'change visibility',
+'revdel-restore-deleted' => 'deleted revisions',
+'revdel-restore-visible' => 'visible revisions',
+'pagehist' => 'Maktabzabno diFaṭo',
+
+# Merge log
+'revertmerge' => 'Unmerge',
+
+# Diffs
+'history-title' => 'Revision history of "$1"',
+'lineno' => 'Serṫo $1:',
+'compareselectedversions' => 'Compare selected revisions',
+'editundo' => 'slag',
+'diff-multi' => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
+
+# Search results
+'searchresults' => 'Nafqe duKruxyayḍux',
+'searchresults-title' => 'Nafqe duKruxyo l"$1"',
+'searchsubtitleinvalid' => "Karixat '''$1'''",
+'prevn' => '{{PLURAL:$1|$1}} meqımtır',
+'nextn' => '{{PLURAL:$1 ḥaṭtır| $1 ḥaṭtır }}',
+'prevn-title' => '{{PLURAL:$1 Nafqo meqımtır|$1 Nafqe meqımtır}}',
+'nextn-title' => '{{PLURAL:$1|Nafqo ḥreno|$1 Nafqe ḥrene}}',
+'shown-title' => 'maḥway $1 {{PLURAL:$1|Nafqo|Nafqe}} bḥḍo Faṭo',
+'viewprevnext' => 'Maḥway ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => '3ayar duKruxyo',
+'searchmenu-exists' => "'''Kito Faṭo herke Işma \"[[:\$1]]\"yo'''",
+'searchmenu-new' => 'Kṭaw iFaṭaṭe "[[:$1]]" buWiki.',
+'searchhelp-url' => 'Help: Ḥbişoṭo',
+'searchprofile-articles' => 'Faṭoṭe daḤbişoṭo',
+'searchprofile-project' => 'Faṭoṭe du3udrono u daProjat',
+'searchprofile-images' => 'Multimediya',
+'searchprofile-everything' => 'Kulmede',
+'searchprofile-advanced' => 'Advanced',
+'searchprofile-articles-tooltip' => 'Krax b$1',
+'searchprofile-project-tooltip' => 'Krax b$1',
+'searchprofile-images-tooltip' => 'Krax Ṥurtoṭe',
+'searchprofile-everything-tooltip' => 'Krax baḤbişoṭo (baFaṭoṭe duDroşo ste)',
+'searchprofile-advanced-tooltip' => 'Search in custom namespaces',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Melṭo|$2 Mele}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Hadomo|$1 Hadome}} ({{PLURAL:$2|1 Sedro taḥtoyo|$2 Sedre taḥtoye}}, {{PLURAL:$3|1 file|$3 files}})',
+'search-redirect' => '(Asiruṭo men $1)',
+'search-section' => '(Fusoqo $1)',
+'search-suggest' => 'Ub³atwa dkıṭwat: $1?',
+'search-interwiki-more' => '(heşa)',
+'searchrelated' => 'related',
+'searchall' => 'kulle',
+'showingresultsheader' => "{{PLURAL:$5|Nafqo '''$1''' of '''$3'''|Nafqe '''$1 - $2''' men '''$3'''}} l'''$4'''",
+'search-nonefound' => 'Für deine Suchanfrage wurden keine Ergebnisse gefunden.',
+'powersearch-field' => 'Krax',
+'powersearch-togglelabel' => 'Sım Qontrol:',
+'powersearch-toggleall' => 'Kulle',
+
+# Preferences page
+'preferences' => '3ayarat',
+'mypreferences' => 'a3ayaratayḍi',
+'prefs-edits' => 'Menyono daŞuḥlofe kulle:',
+'prefs-resetpass' => 'Mşaḥlaf uQliḍo',
+'prefs-email' => '3ayarat duEmail',
+'saveprefs' => 'Mqayad',
+'searchresultshead' => 'Kruxyo',
+'timezoneregion-africa' => 'Afriqa',
+'timezoneregion-america' => 'Ameriqa',
+'timezoneregion-antarctica' => 'Antarctica',
+'timezoneregion-arctic' => 'Arctic',
+'timezoneregion-asia' => 'Asia',
+'timezoneregion-atlantic' => 'Yamo atlantikoyo',
+'timezoneregion-australia' => 'Australia',
+'timezoneregion-europe' => 'Awrifi',
+'timezoneregion-indian' => 'Yamo hindoyo',
+'youremail' => 'Adres duEmail',
+'username' => 'Işme duHadomo:',
+'prefs-memberingroups' => 'Hadomo d{{PLURAL:$1|Gudo|Gudoṭo}}:',
+'prefs-registration' => 'Zabno duSugolo:',
+'yourrealname' => 'Işmo şariro:',
+'yourlanguage' => 'Leşono',
+'yournick' => 'Imḍa ḥaṭto:',
+'yourgender' => 'Ğenso:',
+'gender-male' => 'Dekronoyo',
+'gender-female' => 'Neqıbṭonoyo',
+'email' => 'Email',
+'prefs-help-email' => 'Latat majbur dkıṭwat uEmail-Adresayḍox, elo glozam inaqla ṫo³at uQliḍayḍox u hakka dlozam dmişadar lox Qliḍo ḥaṭo.',
+'prefs-help-email-others' => 'Kibux mijğolat 3am Hadome ğer biFaṭo duMamlo u luglozam dumat Işmux.',
+'prefs-signature' => 'Imḍa',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'uEmail-Adresayḍux m³adlo yo.',
+
+# Groups
+'group-user' => 'Hadome',
+'group-all' => '(kulle)',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'Mşaḥlaf iFaṭaṭe',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|Şuḥlofo|Şuḥlofe}}',
+'recentchanges' => 'Şuḥlofe ḥaroye',
+'recentchanges-legend' => '3ayar daŞuḥlofe',
+'recentchanges-summary' => 'biFaṭaṭe kibox ḥozat aŞuḥlofe ḥaroye.',
+'recentchanges-feed-description' => 'biFaṭaṭe kibox ḥozat aŞuḥlofe ḥaroye.',
+'recentchanges-label-newpage' => 'Faṭo ḥaṭto',
+'recentchanges-label-minor' => 'This is a minor edit',
+'recentchanges-label-bot' => 'uŞuḥlofano sim muBot.',
+'recentchanges-label-unpatrolled' => 'This edit has not yet been patrolled',
+'rcnote' => "Below {{PLURAL:$1|is '''1''' change|are the last '''$1''' changes}} in the last {{PLURAL:$2|day|'''$2''' days}}, as of $5, $4.",
+'rcnotefrom' => 'Herke komaḥwın aŞuḥlofe ḥaroye men ""$2"" (hul buSowudo ""$1"").',
+'rclistfrom' => 'Maḥway li Şuḥlofe ḥaṭe men $1',
+'rcshowhideminor' => '$1 minor edits',
+'rcshowhidebots' => '$1 bots',
+'rcshowhideliu' => '$1 Hadome d3abiri',
+'rcshowhideanons' => '$1 Hadomo nuxroyo',
+'rcshowhidepatr' => '$1 patrolled edits',
+'rcshowhidemine' => 'aMaṫwoṭayḍi ($1)',
+'rclinks' => 'Maḥway li $1 aŞuḥlofe ḥaroye men meqım $2 Yawme hul u³do. <br />$3',
+'diff' => 'Frişuṭo',
+'hist' => 'Maktabzabno',
+'hide' => 'Tlay',
+'show' => 'Maḥway',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Maḥway aŞelole',
+'rc-enhanced-hide' => 'Tlay aŞelole',
+
+# Recent changes linked
+'recentchangeslinked' => 'Şuḥlofe bFaṭoṭe masre',
+'recentchangeslinked-toolbox' => 'Şuḥlofe bFaṭoṭe masre',
+'recentchangeslinked-title' => 'Şuḥlofe bFaṭoṭe dkıtne masre b$1',
+'recentchangeslinked-noresult' => 'No changes on linked pages during the given period.',
+'recentchangeslinked-summary' => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
+Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
+'recentchangeslinked-page' => 'Işmo diFaṭo',
+'recentchangeslinked-to' => 'Maḥway li Şuḥlofe dFaṭoṭe dkitne masre lerke.',
+
+# Upload
+'upload' => 'Mosaq Fayl',
+'uploadlogpage' => 'Upload log',
+'filedesc' => 'Sfiquṭo',
+'uploadedimage' => 'mosaq "[[$1]]"',
+
+'license' => 'Fsoso',
+'license-header' => 'Fsoso',
+
+# File description page
+'file-anchor-link' => 'Fayl',
+'filehist' => 'Maktabzabno duFayl',
+'filehist-help' => 'Click on a date/time to view the file as it appeared at that time.',
+'filehist-revert' => 'revert',
+'filehist-current' => 'current',
+'filehist-datetime' => 'Zabno',
+'filehist-thumb' => 'Thumbnail',
+'filehist-thumbtext' => 'Thumbnail for version as of $1',
+'filehist-user' => 'Hadomo',
+'filehist-dimensions' => 'Dimensions',
+'filehist-comment' => 'Comment',
+'imagelinks' => 'File usage',
+'linkstoimage' => 'The following {{PLURAL:$1|page links|$1 pages link}} to this file:',
+'nolinkstoimage' => 'There are no pages that link to this file.',
+'sharedupload-desc-here' => 'This file is from $1 and may be used by other projects.
+The description on its [$2 file description page] there is shown below.',
+
+# Random page
+'randompage' => 'Faṭo gedşonoyto',
+
+# Statistics
+'statistics' => 'Mardonwoṭo',
+
+'disambiguationspage' => 'Template:disambig',
+
+'brokenredirects-edit' => 'mşaḥlaf',
+'brokenredirects-delete' => 'slag',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
+'nmembers' => '$1 {{PLURAL:$1|Hadomo|Hadome}}',
+'prefixindex' => 'aFaṭoṭe kulle dkitte Prefiks',
+'usercreated' => '{{GENDER:$3|kṭule}}  $1 b$2',
+'newpages' => 'Faṭoṭe ḥaṭe',
+'move' => 'Mtaxar',
+'pager-newer-n' => '{{PLURAL:$1|1 ḥreno |$1 ḥrene}}',
+'pager-older-n' => '{{PLURAL:$1|3atiqo1|3atiqe $1}}',
+
+# Book sources
+'booksources' => 'Kruxyo baNumarat duISBN',
+'booksources-search-legend' => 'Krax Mabu³e me Kṭowe',
+'booksources-go' => 'Zux',
+
+# Special:Log
+'log' => 'Logs',
+
+# Special:AllPages
+'allpages' => 'aFaṭaṭe kulle',
+'alphaindexline' => '$1  l$2',
+'allarticles' => 'aFaṭaṭe kulle',
+'allpagesnext' => 'Ḥreto',
+'allpagessubmit' => 'Zux',
+
+# Special:Categories
+'categories' => 'Sedre',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'Maṫwoṭo slige',
+'deletedcontributions-title' => 'Maṫwoṭo slige',
+'sp-deletedcontributions-contribs' => 'Maṫwoṭo',
+
+# Special:LinkSearch
+'linksearch-ok' => 'Krax',
+'linksearch-line' => '$1 masro yo b$2',
+
+# Special:ListUsers
+'listusers-submit' => 'Maḥway',
+
+# Special:Log/newusers
+'newuserlogpage' => 'User creation log',
+
+# Special:ListGroupRights
+'listgrouprights-group' => 'Gudo',
+'listgrouprights-rights' => 'Ḥaqat',
+'listgrouprights-helppage' => 'Help: Ḥaqat diGudo',
+'listgrouprights-members' => '(Lista daHadome)',
+
+# E-mail user
+'emailuser' => 'Kṭaw Email luHadomano.',
+'emailusername' => 'Işme duHadomo:',
+'emailfrom' => 'Men:',
+'emailto' => 'Lwoṭ:',
+'emailmessage' => 'Ṫebo:',
+
+# Watchlist
+'watchlist' => 'My watchlist',
+'mywatchlist' => 'My watchlist',
+'watchlistfor2' => 'L$1 $2',
+'watch' => 'Watch',
+'unwatch' => 'Unwatch',
+'watchlist-details' => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
+'wlshowlast' => 'Maḥway li aŞuḥlofe dıtsimi meqım $1 Sa³ayat $2 Yawme $3',
+'watchlist-options' => 'Watchlist options',
+
+# Delete
+'actioncomplete' => 'uDuboro kamıl',
+'actionfailed' => 'Action failed',
+'dellogpage' => 'Deletion log',
+
+# Rollback
+'rollbacklink' => 'rollback',
+
+# Protect
+'protectlogpage' => 'Protection log',
+'protectedarticle' => 'mastar "[[$1]]"',
+
+# Undelete
+'undeletelink' => 'view/restore',
+'undeleteviewlink' => 'ḥur',
+'undelete-search-submit' => 'Krax',
+'undelete-show-file-submit' => 'Eh',
+
+# Namespace form on various pages
+'namespace' => 'Dukṭo luIşmo',
+'invert' => 'Invert selection',
+'blanknamespace' => '(Rişoyto)',
+
+# Contributions
+'contributions' => 'Maṫwoṭo duHadomo:',
+'contributions-title' => 'Maṫwoṭo d$1',
+'mycontris' => 'aMaṫwoṭayḍi',
+'contribsub2' => 'd$1 ($2)',
+'uctop' => '(ḥaroyo)',
+'month' => 'muYarḥo',
+'year' => 'hul iŞato:',
+
+'sp-contributions-newbies' => 'Bes maḥway Maṫwoṭo dHadome ḥaṭe',
+'sp-contributions-blocklog' => 'Block log',
+'sp-contributions-deleted' => 'Maṫwoṭo slige',
+'sp-contributions-uploads' => 'Fayl masalqo',
+'sp-contributions-logs' => 'logs',
+'sp-contributions-talk' => 'Mamlo',
+'sp-contributions-search' => 'Krax Maṫwoṭo',
+'sp-contributions-username' => 'IP-Adres aw Işme duHadmomo:',
+'sp-contributions-toponly' => 'Only show edits that are latest revisions',
+'sp-contributions-submit' => 'Krax',
+
+# What links here
+'whatlinkshere' => 'Asirwoṭo biFaṭaṭe',
+'whatlinkshere-title' => 'Faṭoṭe dkitte Asiruṭo 3am"$1"',
+'whatlinkshere-page' => 'Faṭo',
+'linkshere' => "aFaṭoṭani masre ne 3am '''[[:$1]]''':",
+'nolinkshere' => "Layto Faṭoṭe dkitte Asiruṭo 3am '''[[:$1]]'''.",
+'isredirect' => 'redirect page',
+'istemplate' => 'transclusion',
+'isimage' => 'Asiruṭo duFayl',
+'whatlinkshere-prev' => '{{PLURAL:$1|meqımtır|$1 meqımtır}}',
+'whatlinkshere-next' => '{{PLURAL:$1|ḥreno|$1 ḥrene}}',
+'whatlinkshere-links' => '← Asirwoṭo',
+'whatlinkshere-hideredirs' => '$1 redirects',
+'whatlinkshere-hidetrans' => '$1 transclusions',
+'whatlinkshere-hidelinks' => '$1 Asirwoṭo',
+'whatlinkshere-hideimages' => '$1 Asiruṭo duFayl',
+'whatlinkshere-filters' => 'Filtrat',
+
+# Block/unblock
+'ipboptions' => '2 Sa³ayat:2 hours,1 Yawmo:1 day,3 Yawme:3 days,1 Şabṭo:1 week,2 Şabe:2 weeks,1 Yarḥo:1 month,3 Yarḥe:3 months,6 Yarḥe :6 months,1 Şato:1 year,indefinite:infinite',
+'ipblocklist' => 'Blocked users',
+'ipblocklist-submit' => 'Krax',
+'blocklink' => 'Maḥram',
+'unblocklink' => 'unblock',
+'change-blocklink' => 'change block',
+'contribslink' => 'Maṫwoṭo',
+'blocklogpage' => 'Block log',
+'blocklogentry' => 'blocked [[$1]] with an expiry time of $2 $3',
+'block-log-flags-nocreate' => 'account creation disabled',
+
+# Move page
+'movelogpage' => 'Move log',
+'revertmove' => 'revert',
+
+# Export
+'export' => 'Mofaq iFaṭaṭe',
+
+# Namespace 8 related
+'allmessages' => 'Ṫebo duSistem dMEdiaWiki',
+'allmessagesname' => 'Işmo',
+'allmessagesdefault' => 'Syomo standard',
+'allmessages-language' => 'Leşono',
+'allmessages-filter-submit' => 'Zux',
+
+# Thumbnails
+'thumbnail-more' => 'Rabtır',
+'thumbnail_error' => 'Error creating thumbnail: $1',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'iFaṭaṭyḍox',
+'tooltip-pt-mytalk' => 'iFaṭayḍux duDroşo',
+'tooltip-pt-preferences' => 'a3ayaratayḍux',
+'tooltip-pt-watchlist' => 'Lista dFaṭoṭe dkib³at mşaḥılfat',
+'tooltip-pt-mycontris' => 'Lista daMaṫwoṭayḍox',
+'tooltip-pt-login' => 'İnaqa demqaydat ruḥox ṫawo yo, elo letat mejbur',
+'tooltip-pt-logout' => 'Nfoqo',
+'tooltip-ca-talk' => 'Droşo 3al iFaṭo daḤbişoṭo',
+'tooltip-ca-edit' => 'Kibux mşaḥılfat iFaṭaṭe, elo bo³o msta³mal uZra³lo duQontrol meqım demqaydat iFaṭo',
+'tooltip-ca-addsection' => 'Bday Fusoqo ḥaṭo',
+'tooltip-ca-viewsource' => 'This page is protected.
+You can view its source',
+'tooltip-ca-history' => 'Past revisions of this page',
+'tooltip-ca-protect' => 'Mastar iFaṭaṭe',
+'tooltip-ca-delete' => 'Slag iFaṭaṭe',
+'tooltip-ca-move' => 'Mataxar iFaṭaṭe',
+'tooltip-ca-watch' => 'Add this page to your watchlist',
+'tooltip-ca-unwatch' => 'Remove this page from your watchlist',
+'tooltip-search' => 'Krax{{SITENAME}}',
+'tooltip-search-go' => 'Zux liFaṭo dkitla tam uIşmano.',
+'tooltip-search-fulltext' => 'Krax uSyomano baFaṭoṭe',
+'tooltip-p-logo' => 'Z³ar iFaṭo rişoyto',
+'tooltip-n-mainpage' => 'Z³ar iFaṭo rişoyto',
+'tooltip-n-mainpage-description' => 'Z³ar iFaṭo rişoyto',
+'tooltip-n-portal' => '3al iProja; mın komisam u ayko u ayko ne a medone.',
+'tooltip-n-currentevents' => 'Find background information on current events',
+'tooltip-n-recentchanges' => 'Lista daŞuḥlofe ḥaroye kulle',
+'tooltip-n-randompage' => 'Ftaḥ Faṭo gedşonoyto',
+'tooltip-n-help' => 'Maḥway iFaṭo du3udrono',
+'tooltip-t-whatlinkshere' => 'Lista daFaṭoṭe kulle dkitte Asiruṭo lerke',
+'tooltip-t-recentchangeslinked' => 'Şuḥlofe ḥaroye bFaṭoṭe dkitte Asiruṭo lerke',
+'tooltip-feed-atom' => 'Atom feed diFaṭaṭe',
+'tooltip-t-contributions' => 'Lista daMaṫwoṭo duHadomano',
+'tooltip-t-emailuser' => 'Mşadar Email luHadomano',
+'tooltip-t-upload' => 'Mosaq aFayls',
+'tooltip-t-specialpages' => 'Lista daFaṭoṭe dilonoye kulle.',
+'tooltip-t-print' => 'Printable version of this page',
+'tooltip-t-permalink' => 'Asiruṭo aminoyto liFaṭaṭe',
+'tooltip-ca-nstab-main' => 'Maḥway iFaṭo daḤbişoṭo',
+'tooltip-ca-nstab-user' => 'Maḥway iFaṭo duHadomo',
+'tooltip-ca-nstab-special' => 'Haṭe Faṭo dilonoyto yo, laybux mşaḥalfatla',
+'tooltip-ca-nstab-project' => 'Maḥway iFaṭo diProja',
+'tooltip-ca-nstab-image' => 'Maḥway iFaṭo duFayl',
+'tooltip-ca-nstab-template' => 'View the template',
+'tooltip-ca-nstab-category' => 'Maḥway iFaṭo daSedre',
+'tooltip-minoredit' => 'Mark this as a minor edit',
+'tooltip-save' => 'Mqayad uŞuḥlofano',
+'tooltip-preview' => 'Preview your changes, please use this before saving!',
+'tooltip-diff' => 'Maḥway li aŞuḥlofe buSyomano',
+'tooltip-compareselectedversions' => 'See the differences between the two selected revisions of this page',
+'tooltip-watch' => 'Add this page to your watchlist',
+'tooltip-rollback' => '"Rollback" reverts edit(s) to this page of the last contributor in one click',
+'tooltip-undo' => '"Undo" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.',
+'tooltip-summary' => 'Enter a short summary',
+
+# Browsing diffs
+'previousdiff' => '← Şuḥlofo 3atiqo',
+'nextdiff' => 'Hiç lo mşaḥalfat →',
+
+# Media information
+'file-info-size' => '$1 × $2 pixels, file size: $3, MIME type: $4',
+'file-nohires' => 'No higher resolution available.',
+'svg-long-desc' => 'SCG Fayl, Rabuṭo $1 × $2 pixel, Rabuṭo duFayl: $3',
+'show-big-image' => 'Tam faṥiḥ',
+
+# Special:NewFiles
+'ilsubmit' => 'Krax',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 Ṥaniye|$1 Ṥaniyat}}',
+'ago' => 'meqım $1',
+
+# Bad image list
+'bad_image_list' => 'The format is as follows:
+
+Only list items (lines starting with *) are considered.
+The first link on a line must be a link to a bad file.
+Any subsequent links on the same line are considered to be exceptions, i.e. pages where the file may occur inline.',
+
+# Metadata
+'metadata' => 'Metadata',
+'metadata-help' => 'This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.
+If the file has been modified from its original state, some details may not fully reflect the modified file.',
+'metadata-fields' => 'Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.
+Others will be hidden by default.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
+# EXIF tags
+'exif-writer' => 'Kaṭowo',
+'exif-languagecode' => 'Leşono',
+'exif-cameraownername' => 'uMoro diQamera',
+
+# External editor support
+'edit-externally' => 'Edit this file using an external application',
+'edit-externally-help' => '(See the [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] for more information)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'kulle',
+'namespacesall' => 'kulle',
+'monthsall' => 'kulle',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'View relevant changes',
+'watchlisttools-edit' => 'View and edit watchlist',
+'watchlisttools-raw' => 'Edit raw watchlist',
+
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
+
+# Special:FilePath
+'filepath-submit' => 'Zux',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch-submit' => 'Krax',
+
+# Special:SpecialPages
+'specialpages' => 'Faṭoṭe dilonoye',
+
+# Special:BlankPage
+'blankpage' => 'Faṭo xliṭo',
+
+# External image whitelist
+'external_image_whitelist' => ' #Leave this line exactly as it is<pre>
+#Put regular expression fragments (just the part that goes between the //) below
+#These will be matched with the URLs of external (hotlinked) images
+#Those that match will be displayed as images, otherwise only a link to the image will be shown
+#Lines beginning with # are treated as comments
+#This is case-insensitive
+
+#Put all regex fragments above this line. Leave this line exactly as it is</pre>',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Tag]] filter:',
+
+# Special:ComparePages
+'compare-page1' => 'Faṭo 1',
+'compare-page2' => 'Faṭo 2',
+
+# Database error messages
+'dberr-problems' => 'Şubqono!
+iFaṭaṭe u3do kitla Qaṫre.',
+
+# HTML forms
+'htmlform-submit' => 'Mqayad',
+'htmlform-selectorother-other' => 'Ḥrene',
+
+# Feedback
+'feedback-message' => 'Ṫebo:',
+'feedback-cancel' => 'Mbaṫel',
+
+# API errors
+'api-error-unknownerror' => 'Fawdo nuxroyo: $1',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|Ṥaniye|Ṥaniyat}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Qaṫınto|Qaṫınoṭo}}',
+'duration-hours' => '$1 {{PLURAL:$1|Sa³aye|Sa³ayat}}',
+'duration-days' => '$1 {{PLURAL:$1|Yawmo|Yawme}}',
+'duration-weeks' => '$1 {{PLURAL:$1|Şabṭo|Şabe}}',
+'duration-years' => '$1 {{PLURAL:$1|Şato|Şnaye}}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decades}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Doro|Dore}}',
+
+);
index 3015bec..c4b7190 100644 (file)
@@ -172,38 +172,38 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ЮНӘЛТҮ', '#перенаправление', '#перенапр', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__БАШЛЫКЮК__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
-       'forcetoc'                => array( '0', '__ETTIQ__', '__ОБЯЗ_ОГЛ__', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ЭЧТЕЛЕК__', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__БҮЛЕКҮЗГӘРТҮЮК__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'АГЫМДАГЫ_АЙ', 'АГЫМДАГЫ_АЙ2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'АГЫМДАГЫ_АЙ_ИСЕМЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'АГЫМДАГЫ_АЙ_ИСЕМЕ_GEN', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
-       'currentday'              => array( '1', 'АГЫМДАГЫ_КӨН', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'АГЫМДАГЫ_КӨН2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'АГЫМДАГЫ_КӨН_ИСЕМЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'АГЫМДАГЫ_ЕЛ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'АГЫМДАГЫ_ВАКЫТ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
-       'numberofarticles'        => array( '1', 'МӘКАЛӘ_САНЫ', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
-       'pagename'                => array( '1', 'БИТ_ИСЕМЕ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
-       'namespace'               => array( '1', 'ИСЕМНӘР_МӘЙДАНЫ', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
-       'msg'                     => array( '0', 'ХӘБӘР', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
-       'subst'                   => array( '0', 'TÖPÇEK:', 'ПОДСТ:', 'ПОДСТАНОВКА:', 'SUBST:' ),
-       'img_right'               => array( '1', 'уңда', 'справа', 'right' ),
-       'img_left'                => array( '1', 'сулда', 'слева', 'left' ),
-       'img_none'                => array( '1', 'юк', 'без', 'none' ),
-       'img_width'               => array( '1', '$1пкс', '$1px' ),
-       'img_center'              => array( '1', 'үзәк', 'центр', 'center', 'centre' ),
-       'int'                     => array( '0', 'ЭЧКЕ:', 'ВНУТР:', 'INT:' ),
-       'sitename'                => array( '1', 'СӘХИФӘ_ИСЕМЕ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
-       'ns'                      => array( '0', 'İA:', 'ПИ:', 'NS:' ),
-       'localurl'                => array( '0', 'URINLIURL:', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URINLIURLE:', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
-       'language'                => array( '0', '#ТЕЛ:', '#ЯЗЫК:', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'махсус', 'служебная', 'special' ),
-       'tag'                     => array( '0', 'тамга', 'метка', 'тег', 'тэг', 'tag' ),
-       'noindex'                 => array( '1', '__ИНДЕКССЫЗ__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
+       'redirect'                  => array( '0', '#ЮНӘЛТҮ', '#перенаправление', '#перенапр', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__БАШЛЫКЮК__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+       'forcetoc'                  => array( '0', '__ETTIQ__', '__ОБЯЗ_ОГЛ__', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ЭЧТЕЛЕК__', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__БҮЛЕКҮЗГӘРТҮЮК__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'АГЫМДАГЫ_АЙ', 'АГЫМДАГЫ_АЙ2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'АГЫМДАГЫ_АЙ_ИСЕМЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'АГЫМДАГЫ_АЙ_ИСЕМЕ_GEN', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
+       'currentday'                => array( '1', 'АГЫМДАГЫ_КӨН', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'АГЫМДАГЫ_КӨН2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'АГЫМДАГЫ_КӨН_ИСЕМЕ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'АГЫМДАГЫ_ЕЛ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'АГЫМДАГЫ_ВАКЫТ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+       'numberofarticles'          => array( '1', 'МӘКАЛӘ_САНЫ', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
+       'pagename'                  => array( '1', 'БИТ_ИСЕМЕ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'ИСЕМНӘР_МӘЙДАНЫ', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
+       'msg'                       => array( '0', 'ХӘБӘР', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
+       'subst'                     => array( '0', 'TÖPÇEK:', 'ПОДСТ:', 'ПОДСТАНОВКА:', 'SUBST:' ),
+       'img_right'                 => array( '1', 'уңда', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'сулда', 'слева', 'left' ),
+       'img_none'                  => array( '1', 'юк', 'без', 'none' ),
+       'img_width'                 => array( '1', '$1пкс', '$1px' ),
+       'img_center'                => array( '1', 'үзәк', 'центр', 'center', 'centre' ),
+       'int'                       => array( '0', 'ЭЧКЕ:', 'ВНУТР:', 'INT:' ),
+       'sitename'                  => array( '1', 'СӘХИФӘ_ИСЕМЕ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
+       'ns'                        => array( '0', 'İA:', 'ПИ:', 'NS:' ),
+       'localurl'                  => array( '0', 'URINLIURL:', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URINLIURLE:', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
+       'language'                  => array( '0', '#ТЕЛ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'махсус', 'служебная', 'special' ),
+       'tag'                       => array( '0', 'тамга', 'метка', 'тег', 'тэг', 'tag' ),
+       'noindex'                   => array( '1', '__ИНДЕКССЫЗ__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
 );
 
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюяӘәӨөҮүҖҗҢңҺһ]+)(.*)$/sDu';
@@ -250,7 +250,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Авторизацияне узган кулланучыларның үзгәртүләре күзәтү исемлегеннән яшерелсен',
 'tog-watchlisthideanons' => 'Аноним кулланучыларның үзгәртүләре күзәтү исемлегеннән яшерелсен',
 'tog-watchlisthidepatrolled' => 'Тикшерелгән үзгәртүләр күзәтү исемлегеннән яшерелсен',
-'tog-nolangconversion' => 'Язу системаларының үзгәртүен сүндерү',
 'tog-ccmeonemails' => 'Башка кулланучыларга җибәргән хатларымның копияләре миңа да җибәрелсен',
 'tog-diffonly' => 'Юрама чагыштыру астында бит эчтәлеге күрсәтелмәсен',
 'tog-showhiddencats' => 'Яшерен төркемнәр күрсәтелсен',
@@ -329,14 +328,14 @@ $messages = array(
 'hidden-category-category' => 'Яшерен төркемнәр',
 'category-subcat-count' => '{{PLURAL:$2|Бу төркемдә түбәндәге төркемчә генә бар.|$2 төркемчәдән {{PLURAL:$1|$1 төркемчә күрсәтелгән}}.}}',
 'category-subcat-count-limited' => 'Бу төркемдә {{PLURAL:$1|$1 төркемчә}} бар.',
-'category-article-count' => '{{PLURAL:$2|Бу төркемдә бер генә бит бар.|Төркемдәге $2 битнең {{PLURAL:$1|$1 бите күрсәтелгән}}.}}',
+'category-article-count' => '{{PLURAL:$2|Бу төркемдә бер генә бит бар.|Төркемдәге $2 биттән {{PLURAL:$1|$1 күрсәтелде}}.}}',
 'category-article-count-limited' => 'Бу төркемдә {{PLURAL:$1|$1 бит}} бар.',
-'category-file-count' => '{{PLURAL:$2|Ð\91Ñ\83 Ñ\82Ó©Ñ\80кемдÓ\99 Ð±ÐµÑ\80 Ð³ÐµÐ½Ó\99 Ñ\84айл Ð±Ð°Ñ\80.|ТөÑ\80кемдÓ\99ге $2 Ñ\84айлнÑ\8bÒ£ {{PLURAL:$1|$1 Ñ\84айлÑ\8b ÐºÒ¯Ñ\80Ñ\81Ó\99Ñ\82елгÓ\99н}}.}}',
+'category-file-count' => '{{PLURAL:$2|Ð\91Ñ\83 Ñ\82Ó©Ñ\80кемдÓ\99 Ð±ÐµÑ\80 Ð³ÐµÐ½Ó\99 Ñ\84айл Ð±Ð°Ñ\80.|ТөÑ\80кемдÓ\99ге $2 Ñ\84айлдан {{PLURAL:$1|$1 ÐºÒ¯Ñ\80Ñ\81Ó\99Ñ\82елде}}.}}',
 'category-file-count-limited' => 'Бу төркемдә {{PLURAL:$1|$1 файл}} бар.',
 'listingcontinuesabbrev' => 'дәвамы',
 'index-category' => 'Индексланган битләр',
 'noindex-category' => 'Индексланмаган битләр',
-'broken-file-category' => 'ЭÑ\88лÓ\99ми Ñ\82оÑ\80ган Ñ\84айл Ñ\81Ñ\8bлÑ\82амалаÑ\80лÑ\8b битләр',
+'broken-file-category' => 'ФайллаÑ\80га Ñ\8dÑ\88лÓ\99ми Ñ\82оÑ\80ган Ñ\81Ñ\8bлÑ\82амалаÑ\80 Ð±Ñ\83лган битләр',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
@@ -970,6 +969,9 @@ $2
 'parser-template-loop-warning' => 'Үрнәкләрдә йомык сылтама табылды: [[$1]]',
 'parser-template-recursion-depth-warning' => '($1) үрнәген рекурсия итеп куллану чиге рөхсәт ителгәннән артып киткән',
 'language-converter-depth-warning' => 'Телләрне үзгәртүләре артык югарыга киткән ($1)',
+'node-count-exceeded-warning' => 'Биттә бәйләү өлешләре артып киткән',
+'expansion-depth-exceeded-category' => 'Ачыклык тирәнлеге зур булган битләр',
+'expansion-depth-exceeded-warning' => 'Биттә кертем чиге артып киткән',
 
 # "Undo" feature
 'undo-success' => 'Үзгәртүдән баш тартып була.
@@ -1419,9 +1421,9 @@ $1",
 'uploadtext' => "Бу форманы кулланып серверга файллар йөкли аласыз. Элегрәк йөкләнелгән файлларны карау өчен [[Special:FileList|йөкләнелгән файллар исемлегенә]] мәрәҗәгать итегез. Шулай ук ул [[Special:Log/upload|йөкләнмәләр исемлегенә]] һәм [[Special:Log/delete|бетерелгән файллар]] исемлегенә дә языла.
 
 Файлны мәкаләгә йөкләү өчен Сез менә бу үрнәкләрне куллана аласыз:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Рәсем.jpg]]</nowiki></tt>''' файлның тулы юрамасын кую өчен;
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Räsem.png|200px|thumb|left|тасвирламасы]]</nowiki></tt>'''  200 пиксельга кадәр киңлектәге  һәм текстның сул ягында, тасвирламасы белән;
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''биттә файлны сүрәтләмичә, бары тик сылтамасын гына кую.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Рәсем.jpg]]</nowiki></code>''' файлның тулы юрамасын кую өчен;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Räsem.png|200px|thumb|left|тасвирламасы]]</nowiki></code>'''  200 пиксельга кадәр киңлектәге  һәм текстның сул ягында, тасвирламасы белән;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''биттә файлны сүрәтләмичә, бары тик сылтамасын гына кую.",
 'upload-permitted' => 'Рөхсәт ителгән файл төрләре:$1',
 'upload-preferred' => 'Мөмкин булган файл төрләре:$1',
 'upload-prohibited' => 'Тыелган файл төрләре:$1',
index 611be9e..db0507f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tatar (Latin script) (Tatarça)
+/** Tatar (Latin script) (tatarça)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -61,30 +61,30 @@ $dateFormats = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#YÜNÄLTÜ', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__ETYUQ__', '__NOTOC__' ),
-       'forcetoc'                => array( '0', '__ETTIQ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ET__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__BÜLEMTÖZÄTÜYUQ__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'AĞIMDAĞI_AY', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'AĞIMDAĞI_AY_İSEME', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'AĞIMDAĞI_AY_İSEME_GEN', 'CURRENTMONTHNAMEGEN' ),
-       'currentday'              => array( '1', 'AĞIMDAĞI_KÖN', 'CURRENTDAY' ),
-       'currentdayname'          => array( '1', 'AĞIMDAĞI_KÖN_İSEME', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'AĞIMDAĞI_YIL', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'AĞIMDAĞI_WAQIT', 'CURRENTTIME' ),
-       'numberofarticles'        => array( '1', 'MÄQÄLÄ_SANI', 'NUMBEROFARTICLES' ),
-       'pagename'                => array( '1', 'BİTİSEME', 'PAGENAME' ),
-       'namespace'               => array( '1', 'İSEMARA', 'NAMESPACE' ),
-       'subst'                   => array( '0', 'TÖPÇEK:', 'SUBST:' ),
-       'img_right'               => array( '1', 'uñda', 'right' ),
-       'img_left'                => array( '1', 'sulda', 'left' ),
-       'img_none'                => array( '1', 'yuq', 'none' ),
-       'int'                     => array( '0', 'EÇKE:', 'INT:' ),
-       'sitename'                => array( '1', 'SÄXİFÄİSEME', 'SITENAME' ),
-       'ns'                      => array( '0', 'İA:', 'NS:' ),
-       'localurl'                => array( '0', 'URINLIURL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'URINLIURLE:', 'LOCALURLE:' ),
+       'redirect'                  => array( '0', '#YÜNÄLTÜ', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__ETYUQ__', '__NOTOC__' ),
+       'forcetoc'                  => array( '0', '__ETTIQ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ET__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__BÜLEMTÖZÄTÜYUQ__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'AĞIMDAĞI_AY', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonthname'          => array( '1', 'AĞIMDAĞI_AY_İSEME', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'AĞIMDAĞI_AY_İSEME_GEN', 'CURRENTMONTHNAMEGEN' ),
+       'currentday'                => array( '1', 'AĞIMDAĞI_KÖN', 'CURRENTDAY' ),
+       'currentdayname'            => array( '1', 'AĞIMDAĞI_KÖN_İSEME', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'AĞIMDAĞI_YIL', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'AĞIMDAĞI_WAQIT', 'CURRENTTIME' ),
+       'numberofarticles'          => array( '1', 'MÄQÄLÄ_SANI', 'NUMBEROFARTICLES' ),
+       'pagename'                  => array( '1', 'BİTİSEME', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'İSEMARA', 'NAMESPACE' ),
+       'subst'                     => array( '0', 'TÖPÇEK:', 'SUBST:' ),
+       'img_right'                 => array( '1', 'uñda', 'right' ),
+       'img_left'                  => array( '1', 'sulda', 'left' ),
+       'img_none'                  => array( '1', 'yuq', 'none' ),
+       'int'                       => array( '0', 'EÇKE:', 'INT:' ),
+       'sitename'                  => array( '1', 'SÄXİFÄİSEME', 'SITENAME' ),
+       'ns'                        => array( '0', 'İA:', 'NS:' ),
+       'localurl'                  => array( '0', 'URINLIURL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'URINLIURLE:', 'LOCALURLE:' ),
 );
 
 $fallback8bitEncoding = "windows-1254";
@@ -133,7 +133,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Avtorizatsiäne uzğan qullanuçılarnıñ üzgärtüläre küzätü isemlegennän yäşerelsen',
 'tog-watchlisthideanons' => 'Anonim qullanuçılarnıñ üzgärtüläre küzätü isemlegennän yäşerelsen',
 'tog-watchlisthidepatrolled' => 'Tikşerelgän üzgärtülär küzätü isemlegennän yäşerelsen',
-'tog-nolangconversion' => 'Yazu sistemalarınıñ üzgärtüen sünderü',
 'tog-ccmeonemails' => 'Başqa qullanuçılarğa cibärgän xatlarımnıñ kopiäläre miña da cibärelsen',
 'tog-diffonly' => 'Yurama çağıştıru astında bit eçtälege kürsätelmäsen',
 'tog-showhiddencats' => 'Yäşeren törkemnär kürsätelsen',
@@ -1189,9 +1188,9 @@ Ul $1 {{PLURAL:$1|xäreftän}} kübräk bulırğa tieş tügel.',
 'uploadtext' => "Bu formanı qullanıp serverğa fayllar yökli alasız. Elegräk yöklänelgän fayllarnı qaraw öçen [[Special:FileList|Yöklänelgän fayllar isemlegenä]] märäcäğät itegez. Şulay uq ul [[Special:Log/upload|yöklänmälär isemlegenä]] häm [[Special:Log/delete|beterelgän fayllar]] isemlegenä dä yazıla.
 
 Faylnı mäqälägä yökläw öçen Sez menä bu ürnäklärne qullana alasız:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Räsem.jpg]]</nowiki></tt>''' faylnıñ tulı yuramasın quyu öçen;
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Räsem.png|200px|thumb|left|taswirlaması]]</nowiki></tt>'''  200 pikselğa qädär kiñlektäge  häm tekstnıñ sul yağında, taswirlaması belän;
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''bittä faylnı sürätlämiçä, barı tik sıltamasın ğına quyu.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Räsem.jpg]]</nowiki></code>''' faylnıñ tulı yuramasın quyu öçen;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Räsem.png|200px|thumb|left|taswirlaması]]</nowiki></code>'''  200 pikselğa qädär kiñlektäge  häm tekstnıñ sul yağında, taswirlaması belän;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''bittä faylnı sürätlämiçä, barı tik sıltamasın ğına quyu.",
 'upload-permitted' => 'Röxsät itelgän fayl törläre:$1',
 'upload-preferred' => 'Mömkin bulğan fayl törläre:$1',
 'upload-prohibited' => 'Tıyılğan fayl törläre:$1',
index 8d2d40c..a759d0d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tuvinian (Тыва дыл)
+/** Tuvinian (тыва дыл)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -60,22 +60,24 @@ $fallback8bitEncoding = "windows-1251";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Холбааны шыяры:',
-'tog-justify' => 'Арынның дооразынга сөзүглелди дескилээри',
+'tog-justify' => 'Арынның дооразының аайы-биле сөзүглелди дескилээри',
 'tog-hideminor' => 'Сөөлгү өскерлиишкиннер арында бичии өскерлиишкиннерни чажырар',
 'tog-hidepatrolled' => 'Амгы өскерлиишкиннер арында истээн өскерлиишкиннерни чажырары',
 'tog-newpageshidepatrolled' => 'Чаа арыннарның даңзындан истээн арыннарны чажырары',
-'tog-usenewrc' => 'Use enhanced recent changes (JavaScript херек)',
+'tog-usenewrc' => 'Чаа өскерлиишкиннерниң өөделеттинген даңзызын ажыглаар (JavaScript херек)',
+'tog-numberheadings' => 'Эгелерин авто-санаар',
 'tog-showtoolbar' => 'Өскертир херекселдерни көргүзер (JavaScript)',
 'tog-editondblclick' => 'Арынны өскертирде ийи катап базар (JavaScript)',
 'tog-editsection' => '[өскертири] деп холбаалар-биле section editing enable.',
-'tog-rememberpassword' => 'Мени бо компьютерде сактып алыры ($1 {{PLURAL:$1|хүн|хүн}}ге чедир)',
-'tog-watchcreations' => 'Мээң чогааткан арыннарымны хайгаарал даңзымга немерелээри.',
-'tog-watchdefault' => 'Мээң өскерткен арыннарымны хайгаарал даңзымга немерелээри.',
-'tog-watchmoves' => 'Мээң шимчеткен арыннарымны хайгаарал даңзымга немерелээри.',
+'tog-rememberpassword' => 'Мени бо компьютерге сактыры ($1 {{PLURAL:$1|хүн|хүн}} ишти)',
+'tog-watchcreations' => 'Мээң чаяан арыннарымны хайгаарал даңзымче немээри.',
+'tog-watchdefault' => 'Мээң өскерткен арыннарымны хайгаарал даңзымче немээри.',
+'tog-watchmoves' => 'Мээң катап адаан арыннарымны хайгаарал даңзымче немээри.',
+'tog-watchdeletion' => 'Мээң казаан арыннарымны хайгаарал даңзымче немээри.',
 'tog-oldsig' => 'Амгы хол үжүү:',
-'tog-watchlisthideown' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bндан Ð¼Ñ\8dÑ\8dÒ£ Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80Ñ\8bмнÑ\8b Ñ\87ажÑ\8bÑ\80аÑ\80Ñ\8b',
-'tog-watchlisthidebots' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bндан Ñ\80обоÑ\82Ñ\82аÑ\80нÑ\8bÒ£ Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80Ñ\8bн Ñ\87ажÑ\8bÑ\80аÑ\80Ñ\8b',
-'tog-watchlisthideminor' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bндан Ð±Ð¸Ñ\87ии Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80нÑ\8b Ñ\87ажÑ\8bÑ\80аÑ\80Ñ\8b',
+'tog-watchlisthideown' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bндан Ñ\8dдиглеÑ\80имни Ñ\87ажÑ\8bÑ\80',
+'tog-watchlisthidebots' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bндан Ñ\80обоÑ\82Ñ\82аÑ\80нÑ\8bÒ£ Ñ\8dдиглеÑ\80ин Ñ\87ажÑ\8bÑ\80',
+'tog-watchlisthideminor' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bндан Ð±Ð¸Ñ\87ии Ñ\8dдиглеÑ\80ни Ñ\87ажÑ\8bÑ\80',
 'tog-watchlisthidepatrolled' => 'Хайгаарал даңзындан истээн өскерлиишкиннерны чажырары',
 'tog-showhiddencats' => 'Чажыт бөлүктерни көргүзери',
 
@@ -113,42 +115,43 @@ $messages = array(
 '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.ай',
+'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' => '{{PLURAL:$1|Бөлүк|Бөлүктер}}',
 'category_header' => '«$1» деп бөлүктүң арыннары',
-'subcategories' => 'Ð\91иÑ\87ии бөлүктер',
-'category-media-header' => '«$1» деп бөлүкте медиа',
+'subcategories' => 'Ð\90даккÑ\8b бөлүктер',
+'category-media-header' => '«$1» деп бөлүкте файлдар',
 'category-empty' => "''Амгы бо бөлүкте медиа база арыннар чок.''",
 'hidden-categories' => '{{PLURAL:$1|Чажыт бөлүк|Чажыт бөлүктер}}',
 'hidden-category-category' => 'Чажыт бөлүктер',
-'category-subcat-count-limited' => 'Ð\91о Ð±Ó©Ð»Ò¯Ðº {{PLURAL:$1|биÑ\80|$1}} Ð±Ð¸Ñ\87ии бөлүктүү.',
+'category-subcat-count-limited' => 'Ð\91о Ð±Ó©Ð»Ò¯Ðº {{PLURAL:$1|биÑ\80|$1}} Ð°Ð´Ð°ÐºÐºÑ\8b бөлүктүү.',
 'listingcontinuesabbrev' => '(уланчы)',
 'noindex-category' => 'Индекстелбес арынар',
+'broken-file-category' => 'Ажылдавайн турар файл-шөлүлгелиг арыннар',
 
 'about' => 'Дугайында',
 'article' => 'Допчу арын',
@@ -166,6 +169,7 @@ $messages = array(
 'qbbrowse' => 'Каралаары',
 'qbedit' => 'Өскертири',
 'qbpageoptions' => 'Бо арын',
+'qbpageinfo' => 'Арын дугайында медээ',
 'qbmyoptions' => 'Мээң арыннарым',
 'qbspecialpages' => 'Тускай арыннар',
 'faq' => 'Бо-ла салыр айтырыглар (БлСА)',
@@ -178,8 +182,8 @@ $messages = array(
 'vector-action-protect' => 'Камгалаары',
 'vector-action-undelete' => 'Эгидер',
 'vector-action-unprotect' => 'Камгалалды өскертири',
-'vector-view-create' => 'ЧогаадÑ\8bры',
-'vector-view-edit' => 'Өскертири',
+'vector-view-create' => 'ЧаÑ\8fары',
+'vector-view-edit' => 'Эдери',
 'vector-view-history' => 'Төөгүнү көөрү',
 'vector-view-view' => 'Номчууру',
 'vector-view-viewsource' => 'Дөзү бижиин көөрү',
@@ -195,18 +199,19 @@ $messages = array(
 'searchbutton' => 'Дилээри',
 'go' => 'Баары',
 'searcharticle' => 'Күүcедири',
-'history' => 'Арынның Төөгүзү',
+'history' => 'Арынның төөгүзү',
 'history_short' => 'Төөгү',
 'printableversion' => 'Саазынга үндүрерин көөрү',
 'permalink' => 'Турум холбаа',
 'print' => 'Саазынга үндүрер',
 'view' => 'Көөрү',
-'edit' => 'Өскертири',
+'edit' => 'Эдери',
 'create' => 'Чогаадыры',
 'editthispage' => 'Бо арынны өскертири',
 'create-this-page' => 'Бо арынны чогаадыры',
 'delete' => 'Ырадыры',
 'deletethispage' => 'Бо арынны ырадыры',
+'undelete_short' => '$1 {{PLURAL:$1|эдигни|эдиглерни}} катап үндүрери',
 'viewdeleted_short' => '{{PLURAL:$1|Бир ыраткан өскерлиишкинни|$1 ыраткан өскерлиишкиннерни}} көөрү',
 'protect' => 'Камгалаары',
 'protect_change' => 'өскертири',
@@ -232,7 +237,9 @@ $messages = array(
 'categorypage' => 'Бөлүктүң арынын көөрү',
 'viewtalkpage' => 'Чугааны көөрү',
 'otherlanguages' => 'Өске дылдарга',
-'lastmodifiedat' => 'Бо арын сөөлгү каттап $2, $1 өскерилген.',
+'redirectedfrom' => '($1 шигленген)',
+'redirectpagesub' => 'шигледир арын',
+'lastmodifiedat' => 'Бо арын сөөлгү катап $1, $2 өскерилген.',
 'protectedpage' => 'Камгалаган арын',
 'jumpto' => 'Шилчиир:',
 'jumptonavigation' => 'навигация',
@@ -247,17 +254,19 @@ $messages = array(
 'currentevents-url' => 'Project:Амгы үеде болуушкуннар',
 'disclaimers' => 'Ажыглаар харысаалгазын чөрчүүрү (ойталаары)',
 'disclaimerpage' => 'Project:Ажыглаар харысаалгазын ойталаары',
-'edithelp' => 'Өскертиринге дуза',
-'edithelppage' => 'Help:Өскертири',
+'edithelp' => 'Эдеринге дуза',
+'edithelppage' => 'Help:Эдери',
 'helppage' => 'Help:Допчузу',
 'mainpage' => 'Кол Арын',
 'mainpage-description' => 'Кол Арын',
-'policy-url' => 'Project:Ð\9fолиÑ\82ика',
+'policy-url' => 'Project:ЧÑ\83Ñ\80Ñ\83м',
 'portal' => 'Ниитилелдиң хаалгазы',
 'portal-url' => 'Project:Ниитилелдиң хаалгазы',
-'privacy' => 'Актыг бүзүрел дугуржулга',
+'privacy' => 'Актыг бүзүрел дугуржулгазы',
 'privacypage' => 'Project:Актыг бүзүрел дугуржулгазы',
 
+'badaccess' => 'Алдаг:Эргеңер чок.',
+
 'versionrequired' => 'МедиаВикиниң $1 үндүреризи херек',
 
 'ok' => 'Чөп',
@@ -266,12 +275,12 @@ $messages = array(
 'newmessageslink' => 'чаа чагаалар',
 'newmessagesdifflink' => 'эрткен өскерлиишкин',
 'youhavenewmessagesmulti' => '«$1» деп арында силерге чаа чагаалар бар.',
-'editsection' => 'өскертири',
-'editold' => 'өскертири',
+'editsection' => 'эдер',
+'editold' => 'эдер',
 'viewsourceold' => 'дөзү кодун көөрү',
-'editlink' => 'өскертири',
+'editlink' => 'эдер',
 'viewsourcelink' => 'дөзү кодун көөрү',
-'editsectionhint' => '«$1» деп салбырны өскертири',
+'editsectionhint' => '«$1» деп салбырны эдер',
 'toc' => 'Допчузу',
 'showtoc' => 'көргүзери',
 'hidetoc' => 'чажырары',
@@ -280,7 +289,7 @@ $messages = array(
 'viewdeleted' => '{{grammar:accusative|$1}} көөр?',
 'restorelink' => '{{PLURAL:$1|$1 балаттынган өскерилгелер}}',
 'feedlinks' => 'Агым:',
-'feed-invalid' => 'Ð\91ижидилгениң Ð°Ð³Ñ\8bм Ñ\8fнзÑ\8b багай-дыр.',
+'feed-invalid' => 'Ð\91ижидилгениң Ð°Ð³Ñ\8bм Ñ\85евиÑ\80и багай-дыр.',
 'site-rss-feed' => '$1 RSS Медээ Агымы',
 'site-atom-feed' => '$1 Atom Медээ Агымы',
 'page-rss-feed' => '«$1» RSS Медээ Агымы',
@@ -319,20 +328,21 @@ Please report this to an [[Special:ListUsers/sysop|administrator]], making note
 'internalerror' => 'Иштики алдаг',
 'internalerror_info' => 'Иштики алдаг: $1',
 'badtitle' => 'Багай ат',
-'viewsource' => 'Ð\91ажÑ\8b көөрү',
+'viewsource' => 'Ð\94өзүн көөрү',
 'actionthrottled' => 'Шеглээн дүрген',
+'sqlhidden' => '(SQL айтырыгны чажырган)',
 
 # Login and logout pages
 'welcomecreation' => '== Кирип моорлаңар, $1! ==
-Your account has been created.
+Силер бүрүткел бижик has been created.
 Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'yourname' => 'Aжыглакчының ады',
 'yourpassword' => 'Чажыт сөс',
 'yourpasswordagain' => 'Чажыт сөзүңерни катап бижиңер:',
 'remembermypassword' => 'Мени бо компьютерде сактып алыры ($1 {{PLURAL:$1|хүн|хүн}}ге чедир)',
 'login' => 'Кирери',
-'nav-login-createaccount' => 'Кирери / бүрүткел бижикти бүдүрери',
-'userlogin' => 'Кирери / бүрүткел бижикти бүдүрери',
+'nav-login-createaccount' => 'Кирери / бүрүткел бижикти чогаадыры',
+'userlogin' => 'Кирери / бүрүткел бижикти чогаадыры',
 'userloginnocreate' => 'Кирери',
 'logout' => 'Үнери',
 'userlogout' => 'Үнери',
@@ -354,6 +364,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'mailmypassword' => 'Меңээ чаа чажыт сөсту чорудаары',
 'accountcreated' => 'Бүрүткел бижикти бүдүрген',
 'accountcreatedtext' => '«$1» деп ажыглакчының бүрүткел бижиини бүдүрген.',
+'login-abort-generic' => 'Системаже таптыг эвес кирип тур силер',
 'loginlanguagelabel' => 'Дыл: $1',
 
 # E-mail sending
@@ -373,6 +384,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'resetpass-temp-password' => 'Түр чажыт сөс:',
 
 # Special:PasswordReset
+'passwordreset-legend' => 'Чажыт атты дүжүр',
 'passwordreset-username' => 'Aжыглакчының ады:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-email' => 'Э-чагааның адреси:',
@@ -381,6 +393,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 
 # Special:ChangeEmail
 'changeemail' => 'Э-чагааның адресин өскертири',
+'changeemail-header' => 'Бүрүткел бижиктиң э-чагааның адресин өскертири',
 'changeemail-oldemail' => 'Амгы э-чагааның адреси:',
 'changeemail-newemail' => 'Чаа э-чагааның адреси:',
 'changeemail-none' => '(чок)',
@@ -404,11 +417,12 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'image_tip' => 'Киир туткан файл',
 'media_sample' => 'Чижек.ogg',
 'media_tip' => 'Файлдың холбаазы',
+'hr_tip' => 'Доора шугум (use sparingly)',
 
 # Edit pages
 'summary' => 'Түңнел:',
 'subject' => 'Кол сөс:',
-'minoredit' => 'Бо өскерлиишкин бичии-дир',
+'minoredit' => 'Бо эдилге бичии-дир',
 'watchthis' => 'Бо арынны хайгаараары',
 'savearticle' => 'Арынны шыгжаары',
 'preview' => 'Чижеглей көөрү',
@@ -425,11 +439,14 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 
 The password for this new account can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.",
 'newarticle' => '(Чаа)',
+'userpage-userdoesnotexist' => '«<nowiki>$1</nowiki>» деп ажыглакчы is not registered.
+Please check if you want to create/edit this page.',
+'userpage-userdoesnotexist-view' => '«$1» деп ажыглакчы not registered.',
 'note' => "'''Тайылбыр:'''",
 'previewnote' => "'''Бо чүгле шенеп көөрү-дүр.'''
  Бижик ам-даа шыгжатынмаан!",
-'editing' => '«$1» деп арынны өскертип турар',
-'editingsection' => '«$1» деп арынның салбырын өскертип турар',
+'editing' => '«$1» деп арынны эдери',
+'editingsection' => '«$1» деп арынның салбырын эдери',
 'editingcomment' => '«$1» деп арынны өскертип турар (чаа салбыр)',
 'yourtext' => 'Силерниң сөзүглелиңер',
 'yourdiff' => 'Ылгалдар',
@@ -507,19 +524,21 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
 'nextn-title' => 'Дараазында $1 {{PLURAL:$1|бижик|бижик}}',
 'shown-title' => 'Арынга $1 {{PLURAL:$1|түңнелди|түңнелди}} көргүзери',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) көөрү',
-'searchmenu-new' => "'''Бо вики-проектиге «[[:$1]]» арынны чогаадыры'''",
+'searchmenu-exists' => "'''Бо викиде \"[[:\$1]]\" деп арын бар.'''",
+'searchmenu-new' => "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
 'searchhelp-url' => 'Help:Допчузу',
 'searchprofile-articles' => 'үндезин арыннар',
 'searchprofile-project' => 'Төлевилел биле дуза арыннары',
 'searchprofile-images' => 'Мультимедиа',
 'searchprofile-everything' => 'Бүгүде',
-'searchprofile-advanced' => 'делгем',
+'searchprofile-advanced' => 'Ð\9aалбаÑ\80Ñ\82Ñ\8bÑ\80Ñ\8b',
 'searchprofile-articles-tooltip' => '$1 иштинден дилээри',
 'searchprofile-project-tooltip' => '$1 иштинде дилээри',
 'searchprofile-images-tooltip' => 'Файлдар дилээри',
 'searchprofile-everything-tooltip' => 'Шупту арыннардан дилээри (сумележиишкиннерден база)',
 'searchprofile-advanced-tooltip' => 'Айыткан аттар делгемнеринден дилээри',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 сөс}})',
+'search-redirect' => '(шигледир $1)',
 'search-section' => '(«$1» деп салбыр)',
 'search-suggest' => 'Силер «$1» деп бодадыңар чадавас',
 'search-interwiki-more' => '(артык)',
@@ -635,7 +654,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'бо арынны номчууру',
-'action-edit' => 'бо арынны өскертири',
+'action-edit' => 'бо арынны эдери',
 'action-createpage' => 'арыннарны чогаадыры',
 'action-createtalk' => 'чугаалажырга арыннарны чогаадыры',
 'action-createaccount' => 'бо бүрүткел бижиктерин бүдүрери',
@@ -651,6 +670,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'recentchanges-feed-description' => 'Бо агымда викиниң сөөлгү өскерлиишкиннерин көөрү.',
 'recentchanges-label-newpage' => 'Бо өскерлиишкин чаа арынны чогааткан.',
 'recentchanges-label-minor' => 'Бо өскерлиишкин бичии-дир',
+'recentchanges-label-bot' => 'Бо эдилгени робот күүсетти.',
 'recentchanges-label-unpatrolled' => 'Бо өскерлиишкин истенмейн каан',
 'rclistfrom' => 'Starting from $1 чаа өскерлиишкиннерни көргүзери',
 'rcshowhideminor' => 'Бичии өскерлиишкиннерни $1',
@@ -743,6 +763,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'filedelete-reason-otherlist' => 'Өске чылдагаан',
 
 # MIME search
+'mimetype' => 'MIME хевири:',
 'download' => 'алыры',
 
 # Unwatched pages
@@ -797,6 +818,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'longpages' => 'Узун арыннар',
 'protectedpages' => 'Камгалаган арыннар',
 'listusers' => 'Ажыглакчылар даңзызы',
+'usereditcount' => '$1 {{PLURAL:$1|эдилге}}',
 'newpages' => 'Чаа арыннар',
 'newpages-username' => 'Ажыглакчының ады:',
 'ancientpages' => 'Эң эрги арыннар',
@@ -811,7 +833,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'booksources-go' => 'Күүcедири',
 
 # Special:Log
-'specialloguserlabel' => 'Ð\90жÑ\8bглакÑ\87Ñ\8b:',
+'specialloguserlabel' => 'Ð\9aÒ¯Ò¯Ñ\81едикÑ\87и:',
 'speciallogtitlelabel' => 'Target (aтка азы ажыглакчыга):',
 'log' => 'Журналдар',
 
@@ -828,6 +850,9 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 # Special:Categories
 'categories' => 'Бөлүктер',
 
+# Special:DeletedContributions
+'sp-deletedcontributions-contribs' => 'салыышкыннар',
+
 # Special:LinkSearch
 'linksearch' => 'Даштыкы холбааларга дилээри',
 'linksearch-ns' => 'Аттар делгеми:',
@@ -868,6 +893,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'watchthispage' => 'Бо арынны хайгаараары',
 'unwatch' => 'Хайгааравас',
 'unwatchthispage' => 'Бо арынны хайгаарабас',
+'watchlist-details' => 'Not counting talk pages, хайгаарал даңзыңарда {{PLURAL:$1|$1 арын}} бар.',
 'wlshowlast' => 'Сөөлү $1 шак болгаш $2 хүн иштинде $3 көргүзери',
 'watchlist-options' => 'Хайгаарал даңзының эдиглери',
 
@@ -877,6 +903,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 'enotif_newpagetext' => 'Бо чаа арын-дыр.',
 'enotif_impersonal_salutation' => '{{grammar:genitive|{{SITENAME}}}} ажыглакчызы',
+'changed' => 'өскертти',
 'enotif_anon_editor' => 'ат эвес ажыглакчы $1',
 
 # Delete
@@ -923,20 +950,20 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'blanknamespace' => '(Кол)',
 
 # Contributions
-'contributions' => 'Ажыглакчыниң немелделери',
-'contributions-title' => '«$1» деп ажыглакчының немелделери',
-'mycontris' => 'Мээң немелделерим',
+'contributions' => 'Ажыглакчыниң салыышкыннары',
+'contributions-title' => '«$1» деп ажыглакчының салыышкыннары',
+'mycontris' => 'Мээң салыышкыннарым',
 'contribsub2' => '$1 ($2)',
 'uctop' => '(баш)',
 'month' => 'Айдан:',
 'year' => 'Чылдан:',
 
-'sp-contributions-newbies' => 'Чүгле Ñ\87аа ÐºÐ¸Ñ\80еÑ\80илеÑ\80ниң Ð½ÐµÐ¼ÐµÐ»Ð´ÐµÐ»ÐµÑ\80ин ÐºÓ©Ñ\80гүзеÑ\80н',
+'sp-contributions-newbies' => 'Чүгле Ñ\87аа ÐºÐµÐ¶Ð¸Ð³Ò¯Ð½Ð½ÐµÑ\80ниң Ñ\81алÑ\8bÑ\8bÑ\88кÑ\8bннаÑ\80Ñ\8bн ÐºÓ©Ñ\80гүзеÑ\80и',
 'sp-contributions-blocklog' => 'кызыгаарлаашкынның журналы',
 'sp-contributions-uploads' => 'киирген чүүлдер',
 'sp-contributions-logs' => 'журналдар',
 'sp-contributions-talk' => 'чугаалажыры',
-'sp-contributions-search' => 'Ð\9dемелделеÑ\80ин дилээри',
+'sp-contributions-search' => 'СалÑ\8bÑ\8bÑ\88кÑ\8bннаÑ\80Ñ\8bн дилээри',
 'sp-contributions-username' => 'ИП-адрес азы ажыглачының ады:',
 'sp-contributions-submit' => 'Дилээри',
 
@@ -958,10 +985,14 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'whatlinkshere-filters' => 'Шүүрлер',
 
 # Block/unblock
+'block' => 'Ажыглакчыны кызыгаарлаары',
 'blockip' => 'Ажыглакчыны кызыгаарлаары',
+'blockip-title' => 'Ажыглакчыны кызыгаарлаары',
+'blockip-legend' => 'Ажыглакчыны кызыгаарлаары',
 'ipadressorusername' => 'ИП-адрес азы aжыглaкчының aды',
 'ipbreason' => 'Чылдагаан:',
 'ipbreasonotherlist' => 'Өске чылдагаан',
+'ipbsubmit' => 'Бо ажыглакчыны кызыгаарлаары',
 'ipbother' => 'Өске шак:',
 'ipboptions' => '2 шак:2 hours,1 хүн:1 day,3 хүн:3 days,1 чеди-хонук:1 week,2 чеди-хонук:2 weeks,1 ай:1 month,3 ай:3 months,6 ай:6 months,1 чыл:1 year,төнмес-батпас:infinite',
 'ipbotheroption' => 'өске',
@@ -974,7 +1005,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'blocklink' => 'кызыгаарлаары',
 'unblocklink' => 'ажыдып хостаар',
 'change-blocklink' => 'кызыгаарлаашкынны өскертири',
-'contribslink' => 'немелделер',
+'contribslink' => 'салыышкыннар',
 'blocklogpage' => 'Кызыгаарлаашкынның журналы',
 'blocklogentry' => ', [[$1]] $2 дургузунда кызыгаарлаттынган: $3',
 'block-log-flags-anononly' => 'чүгле ат эвес ажыглакчылар',
@@ -1025,11 +1056,11 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'tooltip-pt-userpage' => 'Силерниң ажыглакчы арыныңнар',
 'tooltip-pt-mytalk' => 'Силерниң чугаалажыр арыныңар',
 'tooltip-pt-preferences' => 'Силерниң шилилгеңер',
-'tooltip-pt-mycontris' => 'Силерниң немелделериңерның даңзызы',
+'tooltip-pt-mycontris' => 'Силерниң салыышкыннарыңарның даңзызы',
 'tooltip-pt-login' => 'Маңаа системаже киир бүрүткенип болур, ынчалза-даа ол албан эвес.',
 'tooltip-pt-logout' => 'Үнери',
 'tooltip-ca-talk' => 'Бо арын дугайында чыгаалажыры',
-'tooltip-ca-edit' => 'Силер бо арынны өскертип болур. Шыгжаар мурунда чижеглеп көрем.',
+'tooltip-ca-edit' => 'Силер бо арынны эдип болур. Шыгжаар мурунда чижеглеп көрем.',
 'tooltip-ca-addsection' => 'Чаа салбыр чаяар',
 'tooltip-ca-viewsource' => 'Бо арын камгалаттырган.
 Дөзү кодун көрүп болур силер.',
@@ -1053,7 +1084,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'tooltip-t-recentchangeslinked' => 'Бо арындан шөлүткен өске арыннарның сөөлгү өскерлиишкиннери',
 'tooltip-feed-rss' => 'Бо арының РСС медээ агымы',
 'tooltip-feed-atom' => 'Бо арының Атом медээ агымы',
-'tooltip-t-contributions' => 'Бо ажыглакчының немелделериниң даңзазын көөрү.',
+'tooltip-t-contributions' => 'Бо ажыглакчының салыышкыннарының даңзазын көөрү.',
 'tooltip-t-emailuser' => 'Бо ажыглакчыга э-чагааны чорудаары',
 'tooltip-t-upload' => 'Файлдарны киирери',
 'tooltip-t-specialpages' => 'Шупту тускай арыннар даңзызы',
@@ -1095,8 +1126,11 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'nextdiff' => 'Артык чаа үндүрери →',
 
 # Media information
+'thumbsize' => 'Бичии чурумалдың хемчээли:',
 'widthheightpage' => '$1x$2, $3 {{PLURAL:$3|арын}}',
-'file-info-size' => '$1 × $2 пиксел, Файл хемчээли: $3, MIME янзызы: $4',
+'file-info' => 'файлдың хемчээли: $1, MIME хевири: $2',
+'file-info-size' => '$1 × $2 пиксел, Файл хемчээли: $3, MIME хевири: $4',
+'file-info-size-pages' => '$1 × $2 пикcелдер, файл хемчээли: $3, MIME хевири: $4, $5 {{PLURAL:$5|арын|арын}}',
 'file-nohires' => 'Оон улуг хевири чок',
 'svg-long-desc' => 'SVG файл, $1 x $2 пиксел, файл хемчээли: $3',
 'show-big-image' => 'Улуг чурумал',
@@ -1108,6 +1142,13 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'noimages' => 'Nothing to see.',
 'ilsubmit' => 'Дилээр',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL: $1|$1 секунда|$1 секунда}}',
+'minutes' => '{{PLURAL: $1|$1 минут|$1 минут}}',
+'hours' => '{{PLURAL:$1|$1 шак|$1 шак}}',
+'days' => '{{PLURAL:$1|$1 хүн|$1 хүн}}',
+'ago' => '$1 бурунгаар',
+
 # Metadata
 'metadata' => 'Чурумал дугайында медээлер',
 'metadata-fields' => 'Чурумал дугайында медээлер listed in this message will be included on image page display when the metadata table is collapsed.
@@ -1134,14 +1175,21 @@ Others will be hidden by default.
 'exif-usercomment' => 'Ажыглакчының тайылбырлары',
 'exif-jpegfilecomment' => 'JPEG фалй тайылбыры',
 'exif-headline' => 'Баш ат',
+'exif-languagecode' => 'Дыл',
 'exif-pngfilecomment' => 'PNG фалй тайылбыры',
 'exif-giffilecomment' => 'GIF фалй тайылбыры',
 
 'exif-subjectdistancerange-2' => 'Чоок көрүш',
 'exif-subjectdistancerange-3' => 'ырак көрүш',
 
+'exif-dc-type' => 'Медиа хевири',
+
+'exif-iimcategory-sci' => 'Эртем база техника',
+'exif-iimcategory-spo' => 'Спорт',
+'exif-iimcategory-wea' => 'Агаар',
+
 # External editor support
-'edit-externally' => 'Бо файлды даштики application-биле өскертири',
+'edit-externally' => 'Бо файлды даштыки application-биле эдер',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'шупту',
@@ -1149,9 +1197,16 @@ Others will be hidden by default.
 'monthsall' => 'шупту',
 'limitall' => 'шупту',
 
+# Delete conflict
+'recreate' => 'Катап чогаадыры',
+
 # action=purge
 'confirm_purge_button' => 'Чөп',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'Чөп',
+'confirm-unwatch-button' => 'Чөп',
+
 # Multipage image navigation
 'imgmultipageprev' => '← эрткен арын',
 'imgmultipagenext' => 'дараазында арын →',
@@ -1177,7 +1232,7 @@ Others will be hidden by default.
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Даңзы арыннарының өскерлиишкиннери',
-'watchlisttools-edit' => 'Хайгаарал даңзыны көөрү болгаш өскертири',
+'watchlisttools-edit' => 'Хайгаарал даңзыны көөрү/эдери',
 'watchlisttools-raw' => 'Чиг хайгаарал даңзыны өскертири',
 
 # Special:Version
@@ -1193,11 +1248,12 @@ Others will be hidden by default.
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файлдың ады:',
 'fileduplicatesearch-submit' => 'Дилээри',
-'fileduplicatesearch-info' => '$1 Ã\97 $2 Ð¿Ð¸ÐºÑ\81ел<br />Файл Ñ\85емÑ\87Ñ\8dÑ\8dли: $3<br />MIME Ñ\8fнзÑ\8bзÑ\8b: $4',
+'fileduplicatesearch-info' => '$1 Ã\97 $2 Ð¿Ð¸ÐºÑ\81ел<br />Файл Ñ\85емÑ\87Ñ\8dÑ\8dли: $3<br />MIME Ñ\85евиÑ\80и: $4',
 
 # Special:SpecialPages
 'specialpages' => 'Тускай арыннар',
 'specialpages-group-other' => 'Өске тускай арыннар',
+'specialpages-group-pages' => 'Арыннарның даңзызы',
 'specialpages-group-pagetools' => 'Арын херекселдери',
 
 # Special:BlankPage
@@ -1208,6 +1264,7 @@ Others will be hidden by default.
 'tag-filter-submit' => 'Шүүрү',
 'tags-title' => 'Демдеглелдер',
 'tags-edit' => 'өскертири',
+'tags-hitcount' => '$1 {{PLURAL:$1|өскерлиишкин}}',
 
 # Special:ComparePages
 'comparepages' => 'Арыннарны дөмейлеп көөрү',
@@ -1225,4 +1282,14 @@ Others will be hidden by default.
 'feedback-message' => 'Чагаа:',
 'feedback-cancel' => 'Соксаары',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL: $1|секунда|секунда}}',
+'duration-minutes' => '$1 {{PLURAL: $1|минут|минут}}',
+'duration-hours' => '$1 {{PLURAL: $1|шак|шак}}',
+'duration-days' => '$1 {{PLURAL:$1|хүн|хүн}}',
+'duration-weeks' => '$1 {{PLURAL: $1|чеди-хонук|чеди-хонук}}',
+'duration-years' => '$1 {{PLURAL: $1|чыл|чыл}}',
+'duration-decades' => '$1 {{PLURAL:$1|он хонук|он хонук}}',
+'duration-centuries' => '$1 {{PLURAL:$1|чүс чыл|чүс чыл}}',
+
 );
index 2423ec2..bf2740e 100644 (file)
@@ -41,28 +41,28 @@ $messages = array(
 'tog-hidepatrolled' => 'يېقىنقى ئۆزگەرتىشتە كۆزەتكەن تەھرىرنى يوشۇر',
 'tog-newpageshidepatrolled' => 'يېڭى بەت تىزىملىكىدە كۆزەتكەن تەھرىرنى يوشۇر',
 'tog-extendwatchlist' => 'كۈچەيتىلگەن كۆزەت تىزىملىكىدە يېقىنقى ئۆزگەرتىشنىلا كۆرسەتمەي بەلكى ھەممە ئۆزگەرتىشنى كۆرسەت',
-'tog-usenewrc' => 'كۈچەيتىلگەن يېقىنقى ئۆزگەرتىشنى قوزغات (JavaScript زۆرۈر)',
+'tog-usenewrc' => 'بەت گۇرۇپپىلىنىشىغا ئاساسەن يېقىنقى ئۆزگەرتىش ۋە كۆزەت تىزىمى (JavaScript زۆرۈر)',
 'tog-numberheadings' => 'ماۋزۇغا ئۆزلۈكىدىن تەرتىپ نومۇرى قوش',
-'tog-showtoolbar' => 'تÛ\95ھرÙ\89ر Ù\82Ù\88راÙ\84 Ø³ØªÙ\88Ù\86Ù\89نى كۆرسەت (JavaScript زۆرۈر)',
+'tog-showtoolbar' => 'تÛ\95ھرÙ\89ر Ù\82Ù\88راÙ\84 Ø¨Ø§Ù\84داÙ\82نى كۆرسەت (JavaScript زۆرۈر)',
 'tog-editondblclick' => 'قوش چەككەندە بەت تەھرىرلە (JavaScript زۆرۈر)',
 'tog-editsection' => '[تەھرىر] ئۇلانمىسىنى چېكىپ ئابزاس تەھرىرلەشكە يول قوي',
 'tog-editsectiononrightclick' => 'ماۋزۇنى چاشقىنەكتە ئوڭ چېكىپ ئابزاس تەھرىرلەشكە يول قوي (JavaScript زۆرۈر)',
 'tog-showtoc' => 'مەزمۇن جەدۋىلى كۆرسەت (بىر بەتتە 3 تىن ئارتۇق ماۋزۇ بار بەتكە قارىتىلغان)',
 'tog-rememberpassword' => 'بۇ كومپيۇتېردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|كۈن|كۈن}})',
-'tog-watchcreations' => 'مەن قۇرغان بەتنى كۆزەت تىزىملىكىمگە قوش',
-'tog-watchdefault' => 'مەن تەھرىرلىگەن بەتنى كۆزەت تىزىملىكىمگە قوش',
-'tog-watchmoves' => 'مەن يۆتكىگەن بەتنى كۆزەت تىزىملىكىمگە قوش',
-'tog-watchdeletion' => 'مەن ئۆچۈرگەن بەتنى كۆزەت تىزىملىكىمگە قوش',
+'tog-watchcreations' => 'مەن قۇرغان بەت ۋە يۈكلىگەن ھۆججەتلەرنى كۆزەت تىزىملىكىمگە قوش',
+'tog-watchdefault' => 'مەن تەھرىرلىگەن بەت ۋە ھۆججەتنى كۆزەت تىزىملىكىمگە قوش',
+'tog-watchmoves' => 'مەن يۆتكىگەن بەت ۋە ھۆججەتنى كۆزەت تىزىملىكىمگە قوش',
+'tog-watchdeletion' => 'مەن ئۆچۈرگەن بەت ۋە ھۆججەتنى كۆزەت تىزىملىكىمگە قوش',
 'tog-minordefault' => 'ھەممە تەھرىرلەشنى ئازراقلا تەھرىرگە تەڭشە',
 'tog-previewontop' => 'تەھرىر رامكىسىنىڭ ئۈستىدە ئالدىن كۆزىتىشنى كۆرسەت',
 'tog-previewonfirst' => 'تۇنجى قېتىم تەھرىرلىگەندە ئالدىن كۆزىتىشنى كۆرسەت',
 'tog-nocache' => 'توركۆرگۈ بەت غەملەشنى چەكلە',
-'tog-enotifwatchlistpages' => 'كۆزەت تىزىملىكىمدىكى بەت ئۆزگەرگەندە ئېلخەت يوللا',
+'tog-enotifwatchlistpages' => 'كۆزەت تىزىملىكىمدىكى بەت ۋە ھۆججەت ئۆزگەرگەندە ئېلخەت يوللا',
 'tog-enotifusertalkpages' => 'مۇنازىرە بېتىم ئۆزگەرگەندە ئېلخەت يوللا',
-'tog-enotifminoredits' => 'بەت ئازراقلا تەھرىرلەنگەندىمۇ ئېلخەت يوللا',
+'tog-enotifminoredits' => 'بەت ۋە ھۆججەت ئازراقلا تەھرىرلەنگەندىمۇ ئېلخەت يوللا',
 'tog-enotifrevealaddr' => 'ئۇقتۇرۇش ئېلخەت تىزىملىكىدە ئېلخەت ئادرېسىمنى ئاشكارىلا',
 'tog-shownumberswatching' => 'بۇ بەتنى كۆزىتىۋاتقان ئىشلەتكۈچى سانىنى كۆرسەت',
-'tog-oldsig' => 'نۆۋەتتىكى ئىمزانى ئالدىن كۆزەت:',
+'tog-oldsig' => 'نۆۋەتتىكى ئىمزا:',
 'tog-fancysig' => 'ئىمزاغا wiki تېكستى سۈپىتىدە مۇئامىلە قىل (ئۆزلۈكىدىن ئۇلانما ھاسىل بولمايدۇ)',
 'tog-externaleditor' => 'كۆڭۈلدىكى ئەھۋالدا سىرتقى تەھرىرلىگۈچ ئىشلىتىدۇ (ئالىي ئىشلەتكۈچىگە تەمىنلىنىدۇ، كومپيۇتېرىڭىزدا بىر قىسىم ئالاھىدە تەڭشەش ئېلىپ بېرىشىڭىز لازىم
 [//www.mediawiki.org/wiki/Manual:External_editors تېخىمۇ كۆپ ئۇچۇر.])',
@@ -79,6 +79,7 @@ $messages = array(
 'tog-ccmeonemails' => 'مەن باشقىلارغا يوللىغان ئېلخەتنى ئۆزەمگىمۇ بىر نۇسخا يوللا',
 'tog-diffonly' => 'تۈزىتىلگەن ئىككى نەشرىنىڭ پەرقىنى سېلىشتۇرغاندا بەت مەزمۇنىنى كۆرسەتمە',
 'tog-showhiddencats' => 'يوشۇرۇن تۈرلەرنى كۆرسەت',
+'tog-noconvertlink' => 'ئۇلانما ماۋزۇ ئالماشتۇرۇشنى چەكلە',
 'tog-norollbackdiff' => 'قايتۇرۇشنى ئىجرا قىلغاندىن كېيىن پەرقنى كۆرسەتمە',
 
 'underline-always' => 'دائىم',
@@ -161,7 +162,10 @@ $messages = array(
 'listingcontinuesabbrev' => 'داۋاملاشتۇر',
 'index-category' => 'ئىندېكسلانغان بەتلەر',
 'noindex-category' => 'ئىندېكسلانمىغان بەتلەر',
-'broken-file-category' => 'بۇزۇلغان ھۆججەتكە ئۇلانغان بەتلەر',
+'broken-file-category' => 'ھۆججەت ئۇلىنىشى بۇزۇلغان بەتلەر',
+'categoryviewer-pagedlinks' => '($1) ($2)',
+
+'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
 'about' => 'ھەققىدە',
 'article' => 'مەزمۇن بېتى',
@@ -175,7 +179,7 @@ $messages = array(
 'and' => '&#32;ۋە',
 
 # Cologne Blue skin
-'qbfind' => 'ئىزدە',
+'qbfind' => 'ئىزدە:',
 'qbbrowse' => 'كۆز يۈگۈرت',
 'qbedit' => 'تەھرىر',
 'qbpageoptions' => 'بۇ بەت',
@@ -191,7 +195,7 @@ $messages = array(
 'vector-action-move' => 'يۆتكە',
 'vector-action-protect' => 'قوغدا',
 'vector-action-undelete' => 'ئەسلىگە قايتۇر',
-'vector-action-unprotect' => 'قوغداشنى ئۆزگەرت',
+'vector-action-unprotect' => 'قوغداش ئۆزگەرت',
 'vector-simplesearch-preference' => 'ئالىي ئىزدەش تەكلىپىنى ئاچ (Vector تېرىدىلا)',
 'vector-view-create' => 'قۇر',
 'vector-view-edit' => 'تەھرىر',
@@ -210,7 +214,7 @@ $messages = array(
 'searchbutton' => 'ئىزدە',
 'go' => 'يۆتكەل',
 'searcharticle' => 'يۆتكەل',
-'history' => 'بەت تارىخى',
+'history' => 'بەتنىڭ تارىخى',
 'history_short' => 'تارىخ',
 'updatedmarker' => 'مەن ئالدىنقى قېتىم زىيارەت قىلغاندىن بۇيانقى يېڭىلانغىنى',
 'printableversion' => 'باسقىلى بولىدىغان نەشرى',
@@ -224,11 +228,11 @@ $messages = array(
 'delete' => 'ئۆچۈر',
 'deletethispage' => 'بۇ بەتنى ئۆچۈر',
 'undelete_short' => 'ئۆچۈرۈلگەن {{PLURAL:$1|بىر تەھرىر|$1 تەھرىر}} ئەسلىگە كەلتۈرۈلدى',
-'viewdeleted_short' => '{{PLURAL:$1|بىر ئۆچۈرۈلگەن تەھرىر|$1 ئۆچۈرۈلگەن تەھرىر}}نى كۆرسەت',
+'viewdeleted_short' => '{{PLURAL:$1|بىر ئۆچۈرۈلگەن نەشرى|$1 ئۆچۈرۈلگەن نەشرى}}نى كۆرسەت',
 'protect' => 'قوغدا',
 'protect_change' => 'ئۆزگەرت',
 'protectthispage' => 'بۇ بەتنى قوغدا',
-'unprotect' => 'قوغداشنى ئۆزگەرت',
+'unprotect' => 'قوغداش ئۆزگەرت',
 'unprotectthispage' => 'بۇ بەتنى قوغداشنى ئۆزگەرت',
 'newpage' => 'يېڭى بەت',
 'talkpage' => 'بۇ بەتنىڭ مۇنازىرىسى',
@@ -239,7 +243,7 @@ $messages = array(
 'articlepage' => 'مەزمۇن بېتىنى كۆرسەت',
 'talk' => 'مۇنازىرە',
 'views' => 'كۆرۈنۈش',
-'toolbox' => 'Ù\82Ù\88راÙ\84 Ø³ØªÙ\88Ù\86ى',
+'toolbox' => 'Ù\82Ù\88راÙ\84 Ø³Ø§Ù\86دÛ\87Ù\82ى',
 'userpage' => 'ئىشلەتكۈچى بېتىنى كۆرسەت',
 'projectpage' => 'قۇرۇلۇش بېتىنى كۆرسەت',
 'imagepage' => 'ھۆججەت بېتىنى كۆرسەت',
@@ -277,7 +281,7 @@ $1',
 'disclaimerpage' => 'Project:ئادەتتىكى جاۋابكارلىقنى كەچۈرۈم قىلىش باياناتى',
 'edithelp' => 'تەھرىرلەش ياردىمى',
 'edithelppage' => 'Help:تەھرىرلەۋاتىدۇ',
-'helppage' => 'Help:Ù\85Û\95زÙ\85Û\87Ù\86Ù\89',
+'helppage' => 'Help:Ù\85Û\95زÙ\85Û\87Ù\86Ù\84ار',
 'mainpage' => 'باش بەت',
 'mainpage-description' => 'باش بەت',
 'policy-url' => 'Project:تاكتىكا',
@@ -295,13 +299,20 @@ $1',
 
 [[Special:Version|نەشر بېتى]] نى كۆرۈڭ.',
 
-'ok' => 'جەزملە',
+'ok' => 'ماقۇل',
+'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '← $1',
 'retrievedfrom' => '"$1" دىن ئېرىشكەن',
 'youhavenewmessages' => 'سىزدە $1 ($2) بار.',
 'newmessageslink' => 'يېڭى ئۇچۇر',
 'newmessagesdifflink' => 'ئاخىرقى ئۆزگەرتىش',
+'youhavenewmessagesfromusers' => 'سىزنىڭ {{PLURAL:$3|باشقا ئىشلەتكۈچى|$3 ئىشلەتكۈچى}} $1  ($2)ڭىز بار.',
+'youhavenewmessagesmanyusers' => 'سىزنىڭ نۇرغۇن ئىشلەتكۈچىدىن كەلگەن $1  ($2) بار.',
+'newmessageslinkplural' => '{{PLURAL:$1|بىر يېڭى |يېڭى ئۇچۇر}}ئۇچۇر',
+'newmessagesdifflinkplural' => 'ئاخىرقى $1 {{PLURAL:$1|ئۆزگەرتىش|ئۆزگەرتىش}}',
 'youhavenewmessagesmulti' => '$1 يېڭى ئۇچۇرىڭىز بار',
 'editsection' => 'تەھرىر',
+'editsection-brackets' => '[$1]',
 'editold' => 'تەھرىر',
 'viewsourceold' => 'مەنبەنى كۆرسەت',
 'editlink' => 'تەھرىر',
@@ -310,7 +321,7 @@ $1',
 'toc' => 'مەزمۇنى',
 'showtoc' => 'كۆرسەت',
 'hidetoc' => 'يوشۇر',
-'collapsible-collapse' => 'قاتلا',
+'collapsible-collapse' => 'ئابزاس ئايرىمىسى يوشۇر',
 'collapsible-expand' => 'ياي',
 'thisisdeleted' => 'كۆرسەت ياكى ئەسلىگە كەلتۈر $1 ؟',
 'viewdeleted' => '$1 كۆرسەت؟',
@@ -322,9 +333,11 @@ $1',
 'site-atom-feed' => '$1 نىڭ Atom قانالى',
 'page-rss-feed' => '"$1" نىڭ RSS قانىلى',
 'page-atom-feed' => '"$1" نىڭ Atom قانىلى',
+'feed-atom' => 'ئاتوم',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1 (بەت مەۋجۇد ئەمەس)',
-'sort-descending' => 'كېمەيگۈچى تەرتىپتە تەرتىپلە',
-'sort-ascending' => 'ئۆسكۈچى تەرتىپتە تەرتىپلە',
+'sort-descending' => 'كېمەيگۈچى تەرتىپ',
+'sort-ascending' => 'ئۆسكۈچى تەرتىپ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'بەت',
@@ -397,11 +410,14 @@ MySQL قايتۇرغان خاتالىقى"$3: $4"',
 'cannotdelete' => 'بەلگىلەنگەن "$1" ھۆججەت ياكى بەتنى ئۆچۈرەلمىدى.
 
 ئۇ باشقىلار تەرىپىدىن ئۆچۈرۈلگەن بولۇشى مۇمكىن.',
+'cannotdelete-title' => '"$1" بەتنى ئۆچۈرەلمەيدۇ',
+'delete-hook-aborted' => 'ئۆچۈرۈش ئىلمەك تەرىپىدىن چېكىندۈرۈلدى
+ئۇ سەۋەبىنى تەمىنلىمىدى.',
 'badtitle' => 'خاتا ماۋزۇ',
 'badtitletext' => 'ئىلتىماس قىلىنغان بەتنىڭ ماۋزۇسى ئىناۋەتسىز، مەۋجۇد ئەمەس، تىل ھالقىغان ياكى wiki ئۇلانمىسىدىن ھالقىغان ماۋزۇ خاتالىقى.
 ئۇ بىر ياكى بىر قانچە ماۋزۇغا ئىشلەتكىلى بولمايدىغان ھەرپنى ئۆز ئىچىگە ئالغان.',
-'perfcached' => 'تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، شۇڭلاشقا يېڭى بولماسلىقى مۇمكىن. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، ئاخىرقى يېڭىلانغان ۋاقتى $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، شۇڭلاشقا يېڭى بولماسلىقى مۇمكىن. ئەڭ كۆپ بولغاندا غەملەكتىكى {{PLURAL:$1|بىر تۈر|$1 تۈر}} نى ئىشلەتكىلى بولىدۇ.',
+'perfcachedts' => 'تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، ئاخىرقى يېڭىلانغان ۋاقتى $1. ئەڭ كۆپ بولغاندا غەملەكتىكى {{PLURAL:$1|بىر تۈر|$1 تۈر}} نى ئىشلەتكىلى بولىدۇ.',
 'querypage-no-updates' => 'نۆۋەتتە مەزكۇر بەتنى يېڭىلاش چەكلەندى.
 
 بۇ جايدىكى سانلىق مەلۇماتنى دەرھال يېڭىلىغىلى بولمايدۇ.',
@@ -411,12 +427,14 @@ MySQL قايتۇرغان خاتالىقى"$3: $4"',
 
 سۈرۈشتۈرۈش: $2',
 'viewsource' => 'مەنبەنى كۆرسەت',
+'viewsource-title' => '$1 نىڭ ئەسلى كودىنى كۆرسەت',
 'actionthrottled' => 'مەشغۇلات چەكلەندى',
 'actionthrottledtext' => 'ئەخلەتكە قارشى تۇرۇش ئۆلچىمىگە ئاساسەن، سىز بۇ بىر بۆلۈك قىسقا ۋاقىتتا بۇ مەشغۇلاتنى ئېلىپ بېرىشىڭىزنى چەكلىدى، ئەمما سىز بۇ چەكتىن ئېشىپ كەتتىڭىز.
 
 بىر قانچە مىنۇتتىن كېيىن قايتا سىناڭ.',
 'protectedpagetext' => 'بۇ بەت تەھرىرلەشنىڭ ئالدىنى ئېلىش ئۈچۈن قۇلۇپلانغان.',
 'viewsourcetext' => 'سىز بۇ بەتنى ئەسلى كودىنى كۆرەلەيسىز ۋە كۆچۈرەلەيسىز:',
+'viewyourtext' => "بۇ بەتتىكى '''تەھرىرلىگەنلىرىڭىز'''نىڭ ئەسلى كودىنى كۆرۈپ كۆچۈرەلەيسىز.",
 'protectedinterface' => 'بۇ بەت يۇمشاق دېتالنىڭ كۆرۈنۈش تېكستىنى تەمىنلىگەن، خالىغانچە تەھرىرلەشتىن ساقلىنىش ئۈچۈن قۇلۇپلانغان.',
 'editinginterface' => "'''ئاگاھلاندۇرۇش:''' سىز تەھرىرلەۋاتقان بەت يۇمشاق دېتالنىڭ كۆرۈنۈش تېكستىگە ئىشلىتىلىدۇ.
 
@@ -434,6 +452,13 @@ $2',
 'titleprotected' => 'بۇ ماۋزۇ قايتا قۇرۇشتىن ساقلىنىش ئۈچۈن [[User:$1|$1]] تەرىپىدىن قوغدالغان.
 
 سەۋەبى"\'\'$2\'\'" .',
+'filereadonlyerror' => 'بۇ ھۆججەت "$1" نى ئۆزگەرتەلمەيدۇ چۈنكى ھۆججەت خەزىنە "$2" سى پەقەت ئوقۇشقىلا بولىدىغان ھالەتتە.
+
+قۇلۇپلىغان باشقۇرغۇچى تەمىنلىگەن چۈشەندۈرۈش: "$3".',
+'invalidtitle-knownnamespace' => 'ئات بوشلۇقى "$2" ۋە تېكىست "$3" نى ئىشلەتكەن ئىناۋەتسىز ماۋزۇ',
+'invalidtitle-unknownnamespace' => 'يوچۇن ئات بوشلۇقى نومۇرى $1 ۋە تېكىست "$2" نى ئىشلەتكەن ئىناۋەتسىز ماۋزۇ',
+'exception-nologin' => 'تىزىمغا كىرمىدى',
+'exception-nologin-text' => 'بۇ بەت ياكى مەشغۇلات مەزكۇر ۋىكىغا تىزىمغا كىرىشىڭىزنى تەلەپ قىلىدۇ.',
 
 # Virus scanner
 'virus-badscanner' => "بۇزۇلغان سەپلىمە: نامەلۇم ۋىرۇسخور: ''$1''",
@@ -454,28 +479,29 @@ $2',
 'yourpassword' => 'ئىم:',
 'yourpasswordagain' => 'ئاچقۇچنى قايتا بەسىڭ:',
 'remembermypassword' => 'بۇ كومپيۇتېردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|كۈن|كۈن}})',
-'securelogin-stick-https' => 'تÙ\89زÙ\89Ù\85غا Ù\83Ù\89رگÛ\95Ù\86دÙ\89Ù\86 Ù\83Û\90Ù\8aÙ\89Ù\86 HTTPS Ø¨Ø§ØºÙ\84Ù\89Ù\86Ù\89Ø´Ù\89Ù\86Ù\89 Ø¦Ù\89Ø´Ù\84Û\95ت',
+'securelogin-stick-https' => 'تÙ\89زÙ\89Ù\85غا Ù\83Ù\89رگÛ\95Ù\86دÙ\89Ù\86 Ù\83Û\90Ù\8aÙ\89Ù\86 HTTPS Ø¨Ø§ØºÙ\84Ù\89Ù\86Ù\89Ø´Ù\86Ù\89 Ø¯Ø§Û\8bاÙ\85Ù\84اشتÛ\87ر',
 'yourdomainname' => 'دائىرە ئاتىڭىز:',
+'password-change-forbidden' => 'بۇ ۋىكىدىكى ئىمنى ئۆزگەرتەلمەيسىز.',
 'externaldberror' => 'بۇ سانداننى دەلىللەش خاتالىقى ياكى سىرتقى ھېساباتىڭىزنى يېڭىلاشنى چەكلىگەنلىكتىن بولغان بولۇشى مۇمكىن.',
 'login' => 'تىزىمغا كىر',
-'nav-login-createaccount' => 'كىر / ھېسابات قۇر',
+'nav-login-createaccount' => 'تىزىمغا كىر/ھېسابات قۇر',
 'loginprompt' => 'سىز cookies نى قوزغاتقاندىلا ئاندىن   {{SITENAME}} غا كىرەلەيسىز.',
 'userlogin' => 'تىزىمغا كىر/ھېسابات قۇر',
 'userloginnocreate' => 'تىزىمغا كىر',
 'logout' => 'تىزىمدىن چىق',
 'userlogout' => 'تىزىمدىن چىق',
-'notloggedin' => 'تىزىمغا كىرمىگەن',
+'notloggedin' => 'تىزىمغا كىرمىدى',
 'nologin' => "ھېساباتىڭىز يوقمۇ؟ '''$1'''.",
 'nologinlink' => 'ھېساباتتىن بىرنى قۇر',
 'createaccount' => 'ھېسابات قۇر',
 'gotaccount' => "ھېساباتىم بار؟ '''$1'''.",
 'gotaccountlink' => 'تىزىمغا كىر',
-'userlogin-resetlink' => 'تىزىمغا كىرىش تەپسىلاتىڭىزنى ئۇنۇتتىڭىز؟',
+'userlogin-resetlink' => 'تىزىمغا كىرىش تەپسىلاتىنى ئۇنۇتتىڭىز؟',
 'createaccountmail' => 'ئېلخەتتە',
 'createaccountreason' => 'سەۋەب:',
 'badretype' => 'سىز كىرگۈزگەن ئىم ماس كەلمىدى.',
-'userexists' => 'كىرگۈزگەن ئىشلەتكۈچى ئاتى مەۋجۇد.
-باشقا ئاتتىن بىرنى تاللاڭ.',
+'userexists' => 'كىرگۈزگەن ئىشلەتكۈچى ئاتى ئىشلىتىلىۋاتىدۇ.
+باشقا ئاتنى تاللاڭ.',
 'loginerror' => 'تىزىمغا كىرىش خاتالىقى',
 'createaccounterror' => 'ھېسابات قۇرالمىدى: $1',
 'nocookiesnew' => 'ئىشلەتكۈچى ھېساباتى قۇرۇلدى ئەمما سىز تېخى كىرمىدىڭىز..
@@ -490,15 +516,16 @@ $2',
 سىز cookies نى چەكلىگەن.
 
 ئۇنى قوزغىتىپ قايتا سىناڭ.',
-'nocookiesfornew' => 'بۇ ئىشلەتكۈچى ھېساباتى قۇرۇلمىدى، ئۇنىڭ مەنبەسىنى جەزملىيەلمەيمىز.
-سىز cookie نى قوزغاتقانلىقىڭىزنى جەزملەپ، بۇ بەتنى قايتا يۈكلەپ ئاندىن قايتا سىناڭ.',
+'nocookiesfornew' => 'ئىشلەتكۈچى ھېساباتى قۇرۇلمىدى، ئۇنىڭ مەنبەسىنى جەزملىيەلمەيمىز.
+cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتنى قايتا يۈكلەپ ئاندىن قايتا سىناڭ.',
+'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'سىز تېخى ئىناۋەتلىك ئىشلەتكۈچى ئاتىنى بەلگىلىمىدىڭىز.',
 'loginsuccesstitle' => 'تىزىمغا كىرىش مۇۋەپپەقىيەتلىك',
 'loginsuccess' => "'''سىز {{SITENAME}} غا \"\$1\" سالاھىيىتىدە كىردىڭىز.'''",
 'nosuchuser' => '"$1" ئاتلىق ئىشلەتكۈچىنى تاپالمىدى.
 ئىشلەتكۈچى ئاتىنى تەكشۈرۈڭ.
 ياكى [[Special:UserLogin/signup|يېڭى ھېسابات قۇرۇڭ]].',
-'nosuchusershort' => ' "$1" ئاتلىق ئىشلەتكۈچى يوق.
+'nosuchusershort' => '"$1" ئاتلىق ئىشلەتكۈچى يوق.
 كىرگۈزگىنىڭىزنى تەكشۈرۈڭ.',
 'nouserspecified' => 'ئىشلەتكۈچى ئاتىدىن بىرنى بەلگىلەڭ.',
 'login-userblocked' => 'بۇ ئىشلەتكۈچى چەكلەنگەن. تىزىمغا كىرىشكە يول قويۇلمايدۇ.',
@@ -508,7 +535,7 @@ $2',
 قايتا سىناڭ.',
 'passwordtooshort' => 'ئىم ئاز دېگەندە {{PLURAL:$1|1 ھەرپ|$1 ھەرپ}} بولۇشى لازىم.',
 'password-name-match' => 'ئىم ئىشلەتكۈچى ئاتىڭىزدىن پەرقلىنىشى لازىم.',
-'password-login-forbidden' => 'بۇ ئىشلەتكۈچى ئاتى ۋە ئىمنى ئىشلىتىش چەكلەنگەن.',
+'password-login-forbidden' => 'بۇ ئىشلەتكۈچى ئاتى ۋە ئىم چەكلەنگەن.',
 'mailmypassword' => 'يېڭى ئىمنى ئېخەتكە ئەۋەت',
 'passwordremindertitle' => '{{SITENAME}} ئۈچۈن يېڭى ۋاقىتلىق ئىم',
 'passwordremindertext' => 'باشقىلار (بەلكىم سىز، IP ئادرېسى $1)
@@ -536,9 +563,10 @@ $2',
 'emailnotauthenticated' => 'ئېلخەت ئادرېسىڭىز تېخى دەلىللەنمىدى.
 تۆۋەندىكى ئىقتىدارى ھېچقانداق ئېلخەت ئەۋەتمەيدۇ.',
 'noemailprefs' => 'بۇ ئىقتىدارنى ئىشلىتىش ئۈچۈن مايىللىق تەڭشىكىڭىزدە ئېلخەت ئادرېسى بەلگىلەڭ.',
-'emailconfirmlink' => 'ئېلخەت ئادرېسىڭىزنى جەزملەڭ',
+'emailconfirmlink' => 'ئېلخەت مەنزىلىڭىزنى جەزملەڭ',
 'invalidemailaddress' => 'ئېلخەت ئادرېس فورماتى خاتا.
 توغرا ئېلخەت ئادرېسى كىرگۈزۈڭ ياكى بۇ جاينى بوش قالدۇرۇڭ.',
+'emaildisabled' => 'بۇ تورتۇرا ئېلخەت يوللىيالمايدۇ.',
 'accountcreated' => 'ھېسابات قۇرۇلدى',
 'accountcreatedtext' => '$1 نىڭ ھېساباتى قۇرۇلدى.',
 'createaccount-title' => '{{SITENAME}} دا يېڭى ھېسابات قۇر',
@@ -549,18 +577,19 @@ $2',
 'usernamehasherror' => 'ئىشلەتكۈچى ئاتىدا مۇكەممەللىك كود ھەرپلىرى بولماسلىقى لازىم',
 'login-throttled' => 'سىز بۇ ھېساباتنىڭ ئىمنى كۆپ قېتىم سىنىدىڭىز.
 سەل تەخىر قىلىپ، ئاندىن قايتا سىناڭ.',
-'login-abort-generic' => 'تىزىمغا غەلبىلىك كىرەلمىدىڭىز - چېكىندى',
+'login-abort-generic' => 'تىزىمغا كىرەلمىدىڭىز - چېكىندى',
 'loginlanguagelabel' => 'تىل: $1',
 'suspicious-userlogout' => 'تىزىمدىن چىقىش ئىلتىماسىڭىز رەت قىلىندى، چۈنكى ئۇ بەلكىم بۇزۇلغان توركۆرگۈ ياكى غەملەك ۋاكالەتچىسى يوللىغان بولۇشى مۇمكىن.',
 
 # E-mail sending
-'php-mail-error-unknown' => 'PHP نىڭmail() فونكسىيەسىدىكى يوچۇن خاتالىق',
+'php-mail-error-unknown' => 'PHP نىڭ mail() فونكسىيەسىدىكى يوچۇن خاتالىق',
 'user-mail-no-addy' => 'ئېلخەت ئادرېسسىز خەت يوللاشنى سىنىدى.',
 
 # Change password dialog
 'resetpass' => 'ئىم ئۆزگەرت',
 'resetpass_announce' => 'سىز ۋاقىتلىق ئېلخەت جەزملەش كودىدا تىزىمغا كىرگەن.
 تىزىمغا كىرىشنى تاماملاشتا، بۇ جايدا يېڭى ئىم بەلگىلىشىڭىز لازىم:',
+'resetpass_text' => '<!-- بۇ يەرگە تېكست قوشۇڭ -->',
 'resetpass_header' => 'ھېسابات ئىمنى ئۆزگەرت',
 'oldpassword' => 'كونا ئىم:',
 'newpassword' => 'يېڭى ئىم:',
@@ -578,36 +607,45 @@ $2',
 'resetpass-temp-password' => 'ۋاقىتلىق ئىم:',
 
 # Special:PasswordReset
-'passwordreset' => 'ئىمنى ئەسلىگە قايتۇر',
+'passwordreset' => 'ئىمنى ئەسلىگە قايتۇرماق',
 'passwordreset-text' => 'بۇ جەدۋەل تاماملانسا ھېسابات تەپسىلاتىڭىزنى ئېلخەتىڭىزدە تاپشۇرۇۋالىسىز.',
-'passwordreset-legend' => 'ئىمنى ئەسلىگە قايتۇر',
+'passwordreset-legend' => 'ئىمنى ئەسلىگە قايتۇرماق',
 'passwordreset-disabled' => 'بۇ ۋىكىدا ئىمنى ئەسلىگە قايتۇرۇش چەكلەنگەن.',
 'passwordreset-pretext' => '{{PLURAL:$1||تۆۋەندىكى سانلىق مەلۇماتتىن بىرنى كىرگۈزۈڭ}}',
-'passwordreset-username' => 'ئÙ\89Ø´Ù\84Û\95تÙ\83Û\87Ú\86Ù\89 Ø¦Ù\89سÙ\85ى:',
+'passwordreset-username' => 'ئÙ\89Ø´Ù\84Û\95تÙ\83Û\88Ú\86Ù\89 Ø¦Ø§Øªى:',
 'passwordreset-domain' => 'دائىرە:',
-'passwordreset-email' => 'ئېلخەت ئادرېس:',
+'passwordreset-capture' => 'ھاسىل قىلىنغان ئېلخەتنى كۆرسىتەمدۇ؟',
+'passwordreset-capture-help' => 'ئەگەر بۇ رامكا تاللانسا، ئېلخەت (ۋاقىتلىق ئىمنى ئۆز ئىچىگە ئالىدۇ) كۆرسىتىپ ئىشلەتكۈچىگە يوللايدۇ.',
+'passwordreset-email' => 'ئېلخەت ئادرېس',
 'passwordreset-emailtitle' => '{{SITENAME}} دىكى ھېسابات تەپسىلاتى',
-'passwordreset-emailtext-ip' => 'بەزىلەر(بەلكىم سىز بولۇشىڭىز مۇمكىن) IP ئادرېس $1 ئارقىلىق {{SITENAME}} ($4) دىكى مۇناسىۋەتلىك ھېساباتنىڭ ئىم ئەسكەرتىشىگە ئېرىشىشنى تەلەپ قىلدى.  {{PLURAL:$3|ھېسابات|ھېسابات}} بىلەن شۇ ئېلخەت ئادرېس باغلانغان:
+'passwordreset-emailtext-ip' => 'باشقىلار (بەلكىم سىز، IP ئادرېسى $1)
+{{SITENAME}} ($4) دىكى ھېسابات تەپسىلات ئەسكەرتىشىنى ئىلتىماس قىلدى .
+تۆۋەندىكى ئىشلەتكۈچىنىڭ {{PLURAL:$3|ھېسابات|ھېسابات}}ى مۇشۇ ئېلخەتكە باغلانغان:
 
 $2
 
-بۇ {{PLURAL:$3|ۋاقىتلىق ئىم|ۋاقىتلىق ئىم}}نىڭ {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ.
-ھازىرلا تىزىمغا كىرىپ يېڭى ئىم تەڭشەڭ. ئەگەر ئىلتىماسنى باشقىلار ئوتتۇرىغا قويغان بولسا ياكى كونا ئىمنى ئەسكە ئالغان بولسىڭىز ئۆزگەرتىشنىڭ ھاجىتى يوق، بۇ ئۇچۇرغا پەرۋا قىلماي كونا ئىمنى داۋاملىق ئىشلىتىۋەرسىڭىز بولىدۇ.',
-'passwordreset-emailtext-user' => '{{SITENAME}} بېكەتتىكى $1 ئىشلەتكۈچى  {{SITENAME}}($4) دىكى مۇناسىۋەتلىك ھېساباتنىڭ ئىم ئەسكەرتىشىگە ئېرىشىشنى تەلەپ قىلدى.  {{PLURAL:$3|ھېسابات|ھېسابات}} بىلەن شۇ ئېلخەت ئادرېس باغلانغان:
+{{PLURAL:$3|بۇ ۋاقىتلىق ئىم|بۇ ۋاقىتلىق ئىم}} {{PLURAL:$5|بىر كۈن|$5 كۈن}}دە ۋاقتى ئۆتىدۇ. ئەگەر بۇ مەشغۇلاتنى سىز ئىلتىماس قىلغان بولسىڭىز، دەرھال تىزىمغا كىرىپ يېڭى ئىمدىن بىرنى تاللاڭ.
+سىز بەلگىلىگەن يېڭى ئىم  {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ. ئەگەر باشقىلار ئىلتىماس قىلغان بولسا ياكى ئۆزىڭىز بەلگىلىگەن ئىم ئېسىڭىزگە كېلىپ ئۇنى ئۆزگەرتمىسىڭىز، 
+بۇ ئۇچۇرغا پەرۋا قىلماي ئۆزىڭىزنىڭ كونا ئىمنى ئىشلىتىۋېرىڭ.',
+'passwordreset-emailtext-user' => '{{SITENAME}} دىكى $1 ئىشلەتكۈچى ھېسابات تەپسىلات ئەسكەرتىشىنى ئىلتىماس قىلدى .
+تۆۋەندىكى ئىشلەتكۈچىنىڭ {{PLURAL:$3|ھېسابات|ھېسابات}}($4)ى مۇشۇ ئېلخەتكە باغلانغان:
 
 $2
 
-بۇ {{PLURAL:$3|ۋاقىتلىق ئىم|ۋاقىتلىق ئىم}}نىڭ {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ.
-ھازىرلا تىزىمغا كىرىپ يېڭى ئىم تەڭشەڭ. ئەگەر ئىلتىماسنى باشقىلار ئوتتۇرىغا قويغان بولسا ياكى كونا ئىمنى ئەسكە ئالغان بولسىڭىز ئۆزگەرتىشنىڭ ھاجىتى يوق، بۇ ئۇچۇرغا پەرۋا قىلماي كونا ئىمنى داۋاملىق ئىشلىتىۋەرسىڭىز بولىدۇ.',
+{{PLURAL:$3|بۇ ۋاقىتلىق ئىم|بۇ ۋاقىتلىق ئىم}} {{PLURAL:$5|بىر كۈن|$5 كۈن}}دە ۋاقتى ئۆتىدۇ. ئەگەر بۇ مەشغۇلاتنى سىز ئىلتىماس قىلغان بولسىڭىز، دەرھال تىزىمغا كىرىپ يېڭى ئىمدىن بىرنى تاللاڭ.
+سىز بەلگىلىگەن يېڭى ئىم  {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ. ئەگەر باشقىلار ئىلتىماس قىلغان بولسا ياكى ئۆزىڭىز بەلگىلىگەن ئىم ئېسىڭىزگە كېلىپ ئۇنى ئۆزگەرتمىسىڭىز، 
+بۇ ئۇچۇرغا پەرۋا قىلماي ئۆزىڭىزنىڭ كونا ئىمنى ئىشلىتىۋېرىڭ.',
 'passwordreset-emailelement' => 'ئىشلەتكۈچى ئاتى: $1
 ۋاقىتلىق ئىم: $2',
-'passwordreset-emailsent' => 'ئەسكەرتىش ئېلخەت ئەۋەتىلدى.',
+'passwordreset-emailsent' => 'ئەسكەرتىش ئېلخەت يوللاندى.',
+'passwordreset-emailsent-capture' => 'ئەسكەرتىش ئېلخەت يوللاندى، تۆۋەندە كۆرسىتىلىدۇ.',
+'passwordreset-emailerror-capture' => 'ھاسىل قىلىنغان ئەسكەرتىش ئېلخەت تۆۋەندە كۆرسىتىلگەندەك ئەمما يوللىيالمىدى: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ئېلخەت ئادرېس ئۆزگەرت',
 'changeemail-header' => 'ھېساباتنىڭ ئېلخەت ئادرېسىنى ئۆزگەرت',
 'changeemail-text' => 'بۇ جەدۋەل تاماملانسا ئېلخەت ئادرېسىڭىزنى ئۆزگەرتىدۇ. سىز ئىم كىرگۈزۈپ بۇ ئۆزگەرتىشنى جەزملەيسىز.',
-'changeemail-no-info' => 'تÙ\89زÙ\89Ù\85غا Ù\83Ù\89رسÙ\89Ú­Ù\89ز Ø¦Ø§Ù\86دÙ\89Ù\86 Ø¨Û\87 Ø¨Û\95تÙ\86Ù\89 Ø¨Ù\89Û\8bاستÛ\95 Ø²Ù\89Ù\8aارÛ\95ت Ù\82Ù\89Ù\84اÙ\84اÙ\8aسÙ\89ز.',
+'changeemail-no-info' => 'سÙ\89ز ØªÙ\89زÙ\89Ù\85غا Ù\83Ù\89رگÛ\95Ù\86دÙ\89Ù\86 Ù\83Û\90Ù\8aÙ\89Ù\86 Ø¨Ù\89Û\8bاسÙ\89تÛ\95 Ø¨Û\87 Ø¨Û\95تÙ\83Û\95 Ù\83Ù\89رÙ\89Ø´Ù\89Ú­Ù\89ز Ù\84ازÙ\89Ù\85.',
 'changeemail-oldemail' => 'نۆۋەتتىكى ئېلخەت ئادرېسى:',
 'changeemail-newemail' => 'يېڭى ئېلخەت ئادرېسى:',
 'changeemail-none' => '(يوق)',
@@ -627,13 +665,15 @@ $2
 'headline_tip' => '2- دەرىجىلىك ماۋزۇ',
 'nowiki_sample' => 'فورماتى يوق تېكست قىستۇر',
 'nowiki_tip' => 'wiki فورماتىغا پەرۋا قىلما',
+'image_sample' => 'Example.jpg',
 'image_tip' => 'سىڭدۈرمە ھۆججەت',
+'media_sample' => 'Example.ogg',
 'media_tip' => 'ھۆججەت ئۇلىنىشى',
 'sig_tip' => 'ۋاقىت تامغىلىق ئىمزايىڭىز',
 'hr_tip' => 'توغرىسىغا سىزىق (ئېھتىيات بىلەن ئىشلىتىڭ)',
 
 # Edit pages
-'summary' => 'مۇھىم مەزمۇن:',
+'summary' => 'ئۈزۈندە',
 'subject' => 'تېما/ماۋزۇ:',
 'minoredit' => 'بۇ ئازراقلا تەھرىرلەش',
 'watchthis' => 'بۇ بەتنى كۆزەت',
@@ -706,17 +746,21 @@ $2
 [{{fullurl:{{FULLPAGENAME}}|action=edit}} بۇ بەتنى تەھرىرلىيەلەيسىز]</span>',
 'noarticletext-nopermission' => 'بۇ بەتتە ھازىرچە مەزمۇن يوق.
  سىز باشقا بەتتە [[Special:Search/{{PAGENAME}}|بۇ بەتنىڭ ماۋزۇسىنى ئىزدىيەلەيسىز]] ياكى <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}] مۇناسىۋەتلىك خاتىرىسىنى ئىزدىيەلەيسىز،</span>',
+'missing-revision' => '"{{PAGENAME}}" ئاتلىق بەتنىڭ تۈزىتىلگەن نەشرى #$1 مەۋجۇت ئەمەس.
+
+ئادەتتە بۇ ئۆچۈرۈلگەن بىر بەتنىڭ ئۇلانمىسىغا كىرگەنلىك سەۋەبىدىن بولىدۇ.
+تەپسىلىي ئۇچۇرنى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ئۆچۈرۈش خاتىرىسى] دىن تاپقىلى بولىدۇ.',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" ئىشلەتكۈچى خەتلەتمىگەن.
 بۇ بەتنى قۇرۇش/تەھرىرلەشتىن ئىلگىرى تەكشۈرۈپ بېقىڭ.',
 'userpage-userdoesnotexist-view' => '"$1" ئىشلەتكۈچى ھېساباتى خەتلەتمىگەن.',
 'blocked-notice-logextract' => 'بۇ ئىشلەتكۈچى نۆۋەتتە چەكلەنگەن.
-پايدىلىنىش ئۈچۈن يېقىنقى تۆۋەندە چەكلەش خاتىرە تۈرلىرى تەمىنلەندى:',
-'clearyourcache' => "'''دىققەت - ساقلىغاندىن كېيىن، تور كۆرگۈنىڭ غەملىكىنى تازىلىغاندىن كېيىنلا ئاندىن ئېلىپ بارغان ئۆزگەرتىشنى كۆرەلەيسىز.'''
+پايدىلىنىش ئۈچۈن يېقىنقى چەكلەش خاتىرە تۈرلىرى تۆۋەندە تەمىنلەندى:',
+'clearyourcache' => "'''دىققەت''' - ساقلىغاندىن كېيىن، تور كۆرگۈنىڭ غەملىكىنى تازىلىغاندىن كېيىنلا ئاندىن ئېلىپ بارغان ئۆزگەرتىشنى كۆرەلەيسىز.
 * '''Mozilla / Firefox / Safari:''' دا ''Shift'' كۇنۇپكىسىنى بېسىپ تۇرۇپ ''قايتا يۈكلە''نى ياكى ''Ctrl-F5'' ياكى ''Ctrl-R'' (''Mac تا Command-R'')؛
 * '''Google Chrome:''' دا ''Ctrl-Shift-R'' (''Command-Shift-R''  Mac)
 *'''Internet Explorer:''' دا ''Ctrl'' نى بېسىپ تۇرۇپ ''يېڭىلا,'' ياكى ''Ctrl-F5''؛
 * '''Konqueror: دا ''' ''قايتا يۈكلە'' ياكى ''F5''؛
-* '''Opera:''' دا ''قورال → مايىللىق''؛ نى بېسىڭ.",
+* '''Opera:''' دا ''قورال → مايىللىق''؛ نى بېسىپ غەملەكنى تازىلاڭ.",
 'usercssyoucanpreview' => "ئەسكەرتىش:''' ساقلاشتىن ئىلگىرى  \"{{int:showpreview}}\" توپچىنى ئىشلىتىپ يېڭى CSS نى سىناڭ.",
 'userjsyoucanpreview' => "ئەسكەرتىش:''' ساقلاشتىن ئىلگىرى  \"{{int:showpreview}}\" توپچىنى ئىشلىتىپ يېڭى JS نى سىناڭ.",
 'usercsspreview' => "'''دىققەت سىز پەقەت ئۆزىڭىزنىڭ شەخسىي CSS نى ئالدىن كۆزىتىۋاتىسىز.'''
@@ -725,7 +769,7 @@ $2
 '''ئۇ تېخى ساقلانمىدى!'''",
 'sitecsspreview' => "'''دىققەت سىز پەقەت بۇ CSS نى ئالدىن كۆزىتىۋاتىسىز.'''
 '''ئۇ تېخى ساقلانمىدى!'''",
-'sitejspreview' => "'''دىققەت سىز پەقەت بۇ JavaScript  كودىنى ئالدىن كۆزىتىۋاتىسىز.'''
+'sitejspreview' => "'''دىققەت سىز پەقەت بۇ JavaScript كودنى ئالدىن كۆزىتىۋاتىسىز.'''
 '''ئۇ تېخى ساقلانمىدى!'''",
 'userinvalidcssjstitle' => "'''ئاگاھلاندۇرۇش:''' تېرە\\\"\$1\" مەۋجۇد ئەمەس.
 ئادەتلەنگەن .css ۋە .js تور بەت ماۋزۇسىغا كىچىك يېزىلىشتىكى ھەرپ ئىشلىتىلىدۇ، مەسىلەن، {{ns:user}}:Foo/vector.css بىلەن {{ns:user}}:Foo/Vector.css ئوخشاش ئەمەس.",
@@ -733,6 +777,7 @@ $2
 'note' => "'''ئىزاھات:'''",
 'previewnote' => "'''ئېسىڭىزدە بولسۇنكى بۇ پەقەتلا ئالدىن كۆزىتىش.'''
 ئۆزگەرتكەن مەزمۇنىڭىز تېخى ساقلانمىدى!",
+'continue-editing' => 'تەھرىرلەشنى داۋاملاشتۇر',
 'previewconflict' => 'بۇ ئالدىن كۆزىتىشتە ئۈستىدىكى تېكست تەھرىرلەش رايونىدىكى مەزمۇننى كۆرسەتتى. ئۇ ساقلانى تاللىغاندىن كېيىن كۆرۈنىدۇ.',
 'session_fail_preview' => "'''كەچۈرۈڭ! سىزنىڭ جەريان سانلىق مەلۇماتىڭىز يوقاپ كەتكەندە ئېلىپ بارغان تەھرىرىڭىزنى بىر تەرەپ قىلالمايمىز.'''
 قايتا سىناڭ.
@@ -746,8 +791,9 @@ $2
 'token_suffix_mismatch' => "'''سىزنىڭ ئىشلەتكۈچى تەرەپتىكى تەھرىر بۇيرۇقى بىر قىسىم تىنىش بەلگىلىرىنى بۇزۇۋەتتى، '''
 بەتتىكى تەھرىرلەۋاتقان تېكستنىڭ بۇزۇلۇشىنىڭ ئالدىنى ئېلىش ئۈچۈن تەھرىرىڭىز رەت قىلىندى.
 بۇ خىل ئەھۋال ئادەتتە نۇرغۇن خاتالىق بار تورنى ئاساس قىلغان ئاتسىز ۋاكالەتچىنى ئىشلەتكەندە كۆرۈلىدۇ.",
-'edit_form_incomplete' => "'''تÛ\95ھرÙ\89رÙ\84Ù\89Ú¯Û\95Ù\86 Ø¬Û\95دÛ\8bÛ\95Ù\84Ù\86Ù\89Ú­ Ø¨Û\95زÙ\89 Ø¨Û\86Ù\84Ù\89Ù\83Ù\89 Ù\85Û\87Ù\84ازÙ\89Ù\85Û\90تÙ\89رغا Ù\8aÛ\95تÙ\85Ù\89دÙ\89Ø\9b ØªÛ\95ھرÙ\89رÙ\84Ù\89Ú¯Û\95Ù\86 Ù\85Û\95زÙ\85Û\87Ù\86Ù\89Ú­Ù\89زÙ\86Ù\89Ú­ Ù\85Û\87Ù\83Û\95Ù\85Ù\85Û\95Ù\84لىكىنى تەكشۈرۈپ ئاندىن قايتا سىناڭ.'''",
+'edit_form_incomplete' => "'''تÛ\95ھرÙ\89رÙ\84Ù\89Ú¯Û\95Ù\86 Ø¬Û\95دÛ\8bÛ\95Ù\84Ù\86Ù\89Ú­ Ø¨Û\95زÙ\89 Ø¨Û\86Ù\84Ù\89Ù\83Ù\89 Ù\85Û\87Ù\84ازÙ\89Ù\85Û\90تÙ\89رغا Ù\8aÛ\90تÙ\89Ù¾ Ø¨Ø§Ø±Ù\85Ù\89دÙ\89Ø\9b ØªÛ\95ھرÙ\89رÙ\84Ù\89Ú¯Û\95Ù\86 Ù\85Û\95زÙ\85Û\87Ù\86Ù\89Ú­Ù\89زÙ\86Ù\89Ú­ ØªÙ\88Ù\84Û\87Ù\82 Ø¦Ù\89Ù\83Û\95Ù\86لىكىنى تەكشۈرۈپ ئاندىن قايتا سىناڭ.'''",
 'editing' => '$1 تەھرىرلەۋاتىدۇ',
+'creating' => '$1 قۇرۇۋاتىدۇ',
 'editingsection' => '$1 تەھرىرلەۋاتىدۇ (ئابزاس)',
 'editingcomment' => '$1 تەھرىرلەۋاتىدۇ (يېڭى ئابزاس)',
 'editconflict' => 'تەھرىر توقۇنۇشى: $1',
@@ -771,7 +817,7 @@ $2
 ئەگەر يازمىڭىزنىڭ خالىغانچە ئۆزگەرتىلىشى ياكى قايتا تارقىلىشىنى خالىمىسىڭىز، يوللىماڭ. <br />
  سىز يوللىغان مەزمۇننىڭ ئۆزىڭىزنىڭ يازغانلىقى ياكى يەرلىك تور دائىرىسىدىن ياكى ئەركىن مەنبە ($1 دىكى تەپسىلاتنى كۆرۈڭ) دىن كەلگەنلىكىگە كاپالەتلىك قىلىڭ.
 '''ئىجازەتكە ئېرىشمەي تۇرۇپ يوللىماڭ!'''",
-'longpageerror' => "'''خاتالىق: سىز يوللىغان تېكستنىڭ چوڭلۇقى $1 كىلوبايت، بۇ  $2 كىلوبايتلىق ئەڭ چوڭ قىممەتتىن ئېشىپ كەتتى.'''
+'longpageerror' => "'''خاتالىق: سىز يوللىغان تېكىستنىڭ چوڭلۇقى {{PLURAL:$1|بىر كىلوبايت |$1 كىلوبايت}}، بۇ  {{PLURAL:$2|بىر كىلوبايت|$2 كىلوبايت}}لىق ئەڭ چوڭ قىممەتتىن ئېشىپ كەتتى.'''
 ئۇنى ساقلىغىلى بولمايدۇ.",
 'readonlywarning' => "'''ئاگاھلاندۇرۇش: ساندان قۇلۇپلىنىپ ئاسرىلىۋاتىدۇ، شۇڭلاشقا ئۆزگەرتىشىڭىزنى ساقلىيالمايسىز.'''
 سىز بۇ تېكستنى كۆچۈرۈپ تېكست ھۆججىتىگە ساقلاپ، سەل تۇرۇپ ئاندىن ئۆزگەرتىڭ.
@@ -789,6 +835,8 @@ $2
 'template-protected' => '(قوغدالغان)',
 'template-semiprotected' => '(يېرىم قوغدالغان)',
 'hiddencategories' => 'بۇ بەت {{PLURAL:$1|1 يوشۇرۇن تۈر|$1 يوشۇرۇن تۈر}} نىڭ ئەزالىرىغا تەۋە:',
+'edittools' => '<!-- بۇ جايدىكى تېكىست جەدۋەل تەھرىرلەش ۋە يوللاشنىڭ ئاستى تەرىپىدە كۆرۈنىدۇ. -->',
+'edittools-upload' => '-',
 'nocreatetitle' => 'بەت قۇرۇش چەكلىمىسى',
 'nocreatetext' => '{{SITENAME}} يېڭى بەت قۇرۇش ئىقتىدارىنى چەكلىگەن.
 كەينىگە قايتىپ مەۋجۇد بەتنى تەھرىرلىيەلەيسىز ياكى [[Special:UserLogin|تىزىمغا كىر ياكى يېڭى بىر ھېسابات قۇر]]الايسىز.',
@@ -813,6 +861,7 @@ $2
 'edit-no-change' => 'تەھرىرلىگىنىڭىزگە پەرۋا قىلىنمىدى، چۈنكى تېكستتە ئۆزگىرىش بولمىدى.',
 'edit-already-exists' => 'يېڭى بەت قۇرالمىدى
 ئۇ مەۋجۇد.',
+'defaultmessagetext' => 'كۆڭۈلدىكى ئۇچۇر تېكستى',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ئاگاھلاندۇرۇش:''' بۇ بەت ناھايىتى كۆپ يۇقىرى سەرپىياتتىكى گىرامماتىكىلىق ئىقتىدارنى چاقىرغان.\\n
@@ -828,6 +877,13 @@ $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' => 'بەت كېڭەيتىلگەن چوڭقۇرلۇقتىن ئېشىپ كەتتى',
+'parser-unstrip-loop-warning' => 'دەۋرىيلىك بايقالدى',
+'parser-unstrip-recursion-limit' => 'قايتىلانما چەكلىمە ($1) دىن ئېشىپ كەتتى',
+'converter-manual-rule-error' => 'قولدا ئالماشتۇرىدىغان قائىدىدە خاتالىق بايقالدى',
 
 # "Undo" feature
 'undo-success' => 'بۇ تەھرىردىن يېنىۋالغىلى بولىدۇ
@@ -877,7 +933,7 @@ $3 تەمىنلىگەن چەكلەش سەۋەبى ''$2''",
  [[Special:Search|wiki دىن ئىزدە]] نى سىناپ مۇناسىۋەتلىك يېڭى بەتكە ئېرىشىڭ.',
 
 # Revision deletion
-'rev-deleted-comment' => '(تەھرىر ئۈزۈندەسى چىقىرىۋېتىلدى)',
+'rev-deleted-comment' => '(تەھرىرلەش ئۈزۈندىسى چىقىرىۋېتىلدى)',
 'rev-deleted-user' => '(ئىشلەتكۈچى ئاتى چىقىرىۋېتىلدى)',
 'rev-deleted-event' => '(خاتىرە مەشغۇلاتى چىقىرىۋېتىلدى)',
 'rev-deleted-user-contribs' => '[ئىشلەتكۈچى ئاتى ياكى IP ئادرېس چىقىرىۋېتىلدى - تۆھپىدىن تەھرىرنى يوشۇر]',
@@ -885,25 +941,25 @@ $3 تەمىنلىگەن چەكلەش سەۋەبى ''$2''",
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ئۆچۈرۈش خاتىرىسى]دىن تەپسىلىي ئۇچۇرنى تاپقىلى بولىدۇ.",
 'rev-deleted-text-unhide' => "بۇ بەتنىڭ تۈزىتىلگەن نەشرى '''ئۆچۈرۈلگەن'''.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ئۆچۈرۈش خاتىرىسى]دىن تەپسىلىي ئۇچۇرنى تاپقىلى بولىدۇ.
¨Ø§Ø´Ù\82Û\87رغÛ\87Ú\86Ù\89 Ø¨Ù\88Ù\84Û\87Ø´ Ø³Û\88Ù¾Ù\89تÙ\89دÛ\95Ø\8c Ø¯Ø§Û\8bاÙ\85Ù\84اشتÛ\87رÙ\85اÙ\82Ú\86Ù\89 Ø¨Ù\88Ù\84سÙ\89Ú­Ù\89ز Ù\8aÛ\95Ù\86Ù\89Ù\84ا [$1 Ø¨Û\87 ØªÛ\88زÙ\89تÙ\89Ù\84Ú¯Û\95Ù\86 نەشرىنى كۆرسەت]ەلەيسىز.",
-'rev-suppressed-text-unhide' => "بÛ\87 Ø¨Û\95تÙ\86Ù\89Ú­ ØªÛ\88زÙ\89تÙ\89Ù\84Ú¯Û\95Ù\86 Ù\86Û\95شرÙ\89 '''Ù\8aÙ\88Ù\82Ù\89تÙ\89Ù\84غان'''.
-[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ù\8aÙ\88Ù\82Ù\89تÙ\89Ø´ Ø®Ø§ØªÙ\89رÙ\89سÙ\89]دÙ\89Ù\86 ØªÛ\95پسÙ\89Ù\84Ù\89Ù\8a Ø¦Û\87Ú\86Û\87رÙ\86Ù\89 ØªØ§Ù¾Ù\82Ù\89Ù\84Ù\89 Ø¨Ù\88Ù\84Ù\89دÛ\87.باشÙ\82Û\87رغÛ\87Ú\86Ù\89 Ø¨Ù\88Ù\84Û\87Ø´ Ø³Û\88Ù¾Ù\89تÙ\89دÛ\95Ø\8c داۋاملاشتۇرماقچى بولسىڭىز يەنىلا [$1 بۇ تۈزىتىلگەن نەشرىنى كۆرسەت]ەلەيسىز.",
¯Ø§Û\8bاÙ\85Ù\84اشتÛ\87رÙ\85اÙ\82Ú\86Ù\89 Ø¨Ù\88Ù\84سÙ\89Ú­Ù\89ز Ù\8aÛ\95Ù\86Ù\89Ù\84ا [$1 Ø¨Û\87 نەشرىنى كۆرسەت]ەلەيسىز.",
+'rev-suppressed-text-unhide' => "بÛ\87 Ø¨Û\95تÙ\86Ù\89Ú­ ØªÛ\88زÙ\89تÙ\89Ù\84Ú¯Û\95Ù\86 Ù\86Û\95شرÙ\89 '''Ù\86ازارÛ\95تÚ\86Ù\89 Ù\8aÙ\88Ø´Û\87رغان'''.
+[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ù\86ازارÛ\95تÚ\86Ù\89 Ù\8aÙ\88Ø´Û\87رÛ\87Ø´ Ø®Ø§ØªÙ\89رÙ\89سÙ\89]دÙ\89Ù\86 ØªÛ\95پسÙ\89Ù\84Ù\89Ù\8a Ø¦Û\87Ú\86Û\87رÙ\86Ù\89 ØªØ§Ù¾Ù\82Ù\89Ù\84Ù\89 Ø¨Ù\88Ù\84Ù\89دÛ\87. Ø¦Û\95Ú¯Û\95ر داۋاملاشتۇرماقچى بولسىڭىز يەنىلا [$1 بۇ تۈزىتىلگەن نەشرىنى كۆرسەت]ەلەيسىز.",
 'rev-deleted-text-view' => "بۇ بەتنىڭ تۈزىتىلگەن نەشرى '''ئۆچۈرۈلگەن'''.
¨Ø§Ø´Ù\82Û\87رغÛ\87Ú\86Ù\89 Ø¨Ù\88Ù\84Û\87Ø´ Ø³Û\88Ù¾Ù\89تÙ\89Ú­Ù\89ز Ø¨Ù\89Ù\84Û\95Ù\86 Ø¦Û\87Ù\86Ù\89 Ù\83Û\86رÛ\95Ù\84Û\95Ù\8aسÙ\89ز.: ØªÛ\95پسÙ\89Ù\84اتÙ\89Ù\86Ù\89 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Ø¦Û\86Ú\86Û\88رÛ\88Ø´ Ø®Ø§ØªÙ\89رÙ\89سÙ\89]دÙ\89Ù\86 ØªØ§Ù¾Ø§Ù\84اÙ\8aسÙ\89ز.",
-'rev-suppressed-text-view' => "بÛ\87 Ø¨Û\95تÙ\86Ù\89Ú­ ØªÛ\88زÙ\89تÙ\89Ù\84Ú¯Û\95Ù\86 Ù\86Û\95شرÙ\89 '''Ù\8aÙ\88Ù\82Ù\89تÙ\89Ù\84غان'''.
¨Ø§Ø´Ù\82Û\87رغÛ\87Ú\86Ù\89 Ø¨Ù\88Ù\84Û\87Ø´ Ø³Û\88Ù¾Ù\89تÙ\89Ú­Ù\89ز Ø¨Ù\89Ù\84Û\95Ù\86 Ø¦Û\87Ù\86Ù\89 Ù\83Û\86رÛ\95Ù\84Û\95Ù\8aسÙ\89ز.: ØªÛ\95پسÙ\89Ù\84اتÙ\89Ù\86Ù\89 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ù\8aÙ\88Ù\82Ù\89تÙ\89ش خاتىرىسى]دىن تاپالايسىز.",
+ئۇنى كۆرەلەيسىز.: تەپسىلاتىنى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ئۆچۈرۈش خاتىرىسى]دىن تاپالايسىز.",
+'rev-suppressed-text-view' => "بÛ\87 Ø¨Û\95تÙ\86Ù\89Ú­ ØªÛ\88زÙ\89تÙ\89Ù\84Ú¯Û\95Ù\86 Ù\86Û\95شرÙ\89 '''Ù\86ازارÛ\95تÚ\86Ù\89 Ù\8aÙ\88Ø´Û\87رغان'''.
¦Û\87Ù\86Ù\89 Ù\83Û\86رÛ\95Ù\84Û\95Ù\8aسÙ\89ز.: ØªÛ\95پسÙ\89Ù\84اتÙ\89Ù\86Ù\89 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ù\86ازارÛ\95تÚ\86Ù\89 Ù\8aÙ\88Ø´Û\87رÛ\87ش خاتىرىسى]دىن تاپالايسىز.",
 'rev-deleted-no-diff' => "بۇ پەرقنى كۆرەلمەيسىز چۈنكى بىر قېتىملىق تۈزىتىلگەن نەشرى '''ئۆچۈرۈلگەن'''
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ئۆچۈرۈش خاتىرىسى]دىن تەپسىلىي ئۇچۇرنى تاپقىلى بولىدۇ.",
 'rev-suppressed-no-diff' => "بۇ پەرقنى كۆرەلمەيسىز چۈنكى بىر قېتىملىق تۈزىتىلگەن نەشرى '''ئۆچۈرۈلگەن'''.",
 'rev-deleted-unhide-diff' => "بۇ بەتتىكى بىر قېتىملىق تۈزىتىلگەن نەشرى '''ئۆچۈرۈلگەن'''.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ئۆچۈرۈش خاتىرىسى]دىن تەپسىلىي ئۇچۇرنى تاپقىلى بولىدۇ.
¨Ø§Ø´Ù\82Û\87رغÛ\87Ú\86Ù\89 Ø¨Ù\88Ù\84Û\87Ø´ Ø³Û\88Ù¾Ù\89تÙ\89دÛ\95Ø\8c داۋاملاشتۇرماقچى بولسىڭىز يەنىلا [$1 بۇ تۈزىتىلگەن نەشرىنى كۆرسەت]ەلەيسىز.",
-'rev-suppressed-unhide-diff' => "بÛ\87 Ø¨Û\95تÙ\86Ù\89Ú­ ØªÛ\88زÙ\89تÙ\89Ù\84Ú¯Û\95Ù\86 Ù\86Û\95شرÙ\89 '''Ù\8aÙ\88Ù\82Ù\89تÙ\89Ù\84غان'''.
-[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ù\8aÙ\88Ù\82Ù\89تÙ\89Ø´ Ø®Ø§ØªÙ\89رÙ\89سÙ\89]دÙ\89Ù\86 ØªÛ\95پسÙ\89Ù\84Ù\89Ù\8a Ø¦Û\87Ú\86Û\87رÙ\86Ù\89 ØªØ§Ù¾Ù\82Ù\89Ù\84Ù\89 Ø¨Ù\88Ù\84Ù\89دÛ\87.باشÙ\82Û\87رغÛ\87Ú\86Ù\89 Ø¨Ù\88Ù\84Û\87Ø´ Ø³Û\88Ù¾Ù\89تÙ\89دÛ\95Ø\8c داۋاملاشتۇرماقچى بولسىڭىز يەنىلا [$1 بۇ تۈزىتىلگەن نەشرىنى كۆرسەت]ەلەيسىز.",
¦Û\95Ú¯Û\95ر داۋاملاشتۇرماقچى بولسىڭىز يەنىلا [$1 بۇ تۈزىتىلگەن نەشرىنى كۆرسەت]ەلەيسىز.",
+'rev-suppressed-unhide-diff' => "بÛ\87 Ø¨Û\95تÙ\86Ù\89Ú­ ØªÛ\88زÙ\89تÙ\89Ù\84Ú¯Û\95Ù\86 Ù\86Û\95شرÙ\89 '''Ù\86ازارÛ\95تÚ\86Ù\89 Ù\8aÙ\88Ø´Û\87رغان'''.
+[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ù\86ازارÛ\95تÚ\86Ù\89 Ù\8aÙ\88Ø´Û\87رÛ\87Ø´ Ø®Ø§ØªÙ\89رÙ\89سÙ\89]دÙ\89Ù\86 ØªÛ\95پسÙ\89Ù\84Ù\89Ù\8a Ø¦Û\87Ú\86Û\87رÙ\86Ù\89 ØªØ§Ù¾Ù\82Ù\89Ù\84Ù\89 Ø¨Ù\88Ù\84Ù\89دÛ\87. Ø¦Û\95Ú¯Û\95ر داۋاملاشتۇرماقچى بولسىڭىز يەنىلا [$1 بۇ تۈزىتىلگەن نەشرىنى كۆرسەت]ەلەيسىز.",
 'rev-deleted-diff-view' => "بۇ بەتنىڭ بىر قېتىملىق تۈزىتىلگەن نەشرى '''ئۆچۈرۈلگەن'''
-.باشقۇرغۇچى بولۇش سۈپىتىڭىز بىلەن بۇ پەرقنى كۆرەلەيسىز.: تەپسىلاتىنى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ئۆچۈرۈش خاتىرىسى]دىن تاپالايسىز.",
-'rev-suppressed-diff-view' => "بÛ\87 Ø¨Û\95تÙ\86Ù\89Ú­ Ø¨Ù\89ر Ù\82Û\90تÙ\89Ù\85Ù\84Ù\89Ù\82 ØªÛ\88زÙ\89تÙ\89Ù\84Ú¯Û\95Ù\86 Ù\86Û\95شرÙ\89 '''Ù\8aÙ\88Ù\82Ù\89تÙ\89Ù\84غان'''.
اشقۇرغۇچى بولۇش سۈپىتىڭىز بىلەن بۇ پەرقنى كۆرەلەيسىز.: تەپسىلاتىنى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} يوقىتىش خاتىرىسى]دىن تاپالايسىز.",
+بۇ پەرقنى كۆرەلەيسىز.: تەپسىلاتىنى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ئۆچۈرۈش خاتىرىسى]دىن تاپالايسىز.",
+'rev-suppressed-diff-view' => "بÛ\87 Ø¨Û\95تÙ\86Ù\89Ú­ Ø¨Ù\89ر Ù\82Û\90تÙ\89Ù\85Ù\84Ù\89Ù\82 ØªÛ\88زÙ\89تÙ\89Ù\84Ú¯Û\95Ù\86 Ù\86Û\95شرÙ\89 '''Ù\86ازارÛ\95تÚ\86Ù\89 Ù\8aÙ\88Ø´Û\87رغان'''.
ۇ پەرقنى كۆرەلەيسىز.: تەپسىلاتىنى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} نازارەتچى يوشۇرۇش خاتىرىسى]دىن تاپالايسىز.",
 'rev-delundel' => 'كۆرسەت/يوشۇر',
 'rev-showdeleted' => 'كۆرسەت',
 'revisiondelete' => 'تۈزىتىلگەن نەشرىنى ئۆچۈر/ئەسلىگە كەلتۈر',
@@ -968,9 +1024,9 @@ $1",
 'revdelete-offender' => 'تۈزەتكۈچى ئاپتور:',
 
 # Suppression log
-'suppressionlog' => 'خاتىرىنى چەكلە',
-'suppressionlogtext' => 'تۆۋەندىكىسى ئۆچۈرۈلگەن ۋە باشقۇرغۇچى چەكلىگەن مەزمۇنغا چېتىلىدىغان تىزىملىك.
- [[Special:IPBlockList|چەكلەنگەنIP تىزىملىكى]] نى كۆرۈڭ. نۆۋەتتە ئېلىپ بېرىلىۋاتقان چەكلەنگەن ۋە پىچەتلەنگەن تىزىملىكتىن كۆرۈڭ.',
+'suppressionlog' => 'خاتىرە نازارەت',
+'suppressionlogtext' => 'تۆۋەندىكىسى ئۆچۈرۈلگەن ۋە باشقۇرغۇچى چەكلىگەن مەزمۇنغا چېتىلىدىغان تىزىم.
+ [[Special:BlockList|چەكلەنگەن تىزىم]] نى كۆرۈڭ. نۆۋەتتە ئېلىپ بېرىلىۋاتقان چەكلەنگەن ۋە پىچەتلەنگەن تىزىمدىن كۆرۈڭ.',
 
 # History merging
 'mergehistory' => 'بەت تارىخىنى بىرلەشتۈر',
@@ -996,6 +1052,7 @@ $1",
 'mergehistory-comment' => '[[:$1]] نى [[:$2]] غا بىرلەشتۈرۈلدى: $3',
 'mergehistory-same-destination' => 'مەنبە بەت بىلەن نىشان بەت ئوخشاش بولسا بولمايدۇ',
 'mergehistory-reason' => 'سەۋەب:',
+'mergehistory-revisionrow' => '$1 ($2) $3 . . $4 $5 $6',
 
 # Merge log
 'mergelog' => 'بىرلەشتۈرۈش خاتىرىسى',
@@ -1005,6 +1062,8 @@ $1",
 
 # Diffs
 'history-title' => '"$1" نىڭ ئۆزگەرتىش خاتىرىسى',
+'difference-title' => '"$1" تۈزىتىلگەن نەشرى ئارىسىدىكى پەرق',
+'difference-title-multipage' => '"$1" بىلەن "$2" بەت ئارىسىدىكى پەرق',
 'difference-multipage' => '(بەتلەر ئارىسىدىكى پەرق)',
 'lineno' => '$1 -قۇر:',
 'compareselectedversions' => 'تاللانغان نەشرىنى سېلىشتۇر',
@@ -1171,6 +1230,7 @@ $1",
 'prefs-registration' => 'خەتلەتكەن ۋاقىت:',
 'yourrealname' => 'ﺗﻮﻟﯘﻕ ئىسىم:',
 'yourlanguage' => 'تىل:',
+'yourvariant' => 'مەزمۇن تىل شالغۇتى:',
 'yournick' => 'ئىمزا:',
 'prefs-help-signature' => 'مۇنازىرە بەتتە "<nowiki>~~~~</nowiki>" ئىمزا ئىشلىتىلسە ئۇ ئۆزلۈكىدىن ئىمزايىڭىزغا ئۆزگىرىپ ۋاقىت تامغا قوشۇلىدۇ.',
 'badsig' => 'ئەسلى ئىمزا خاتا.
@@ -1244,7 +1304,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'group-suppress' => 'نازارەتچىلەر',
 'group-all' => '(ھەممىسى)',
 
-'group-user-member' => 'ئىشلەتكۈچى',
+'group-user-member' => '{{GENDER:$1|ئىشلەتكۈچى}}',
 'group-autoconfirmed-member' => 'ئۆزلۈكىدىن جەزملەنگەن ئىشلەتكۈچى',
 'group-bot-member' => 'ماشىنا ئادەم',
 'group-sysop-member' => 'باشقۇرغۇچى',
@@ -1421,9 +1481,9 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 ئىلگىرى يۈكلەنگەن ھۆججەتلەرنى كۆرۈش ياكى ئىزدەشتە [[Special:FileList|ھۆججەت يۈكلەش تىزىملىكى]]گە كىرىپ،  (يېڭىدىن) يۈكلەنگەننى [[Special:Log/upload|يۈكلەش خاتىرىسى]]دە خاتىرىلىنىدۇ، ئۆچۈرۈلگىنى [[Special:Log/delete|ئۆچۈرۈش خاتىرىسى]]دە خاتىرىلىنىدۇ.
 
 بەتكە ھۆججەت يۈكلىمەكچى بولسىڭىز، تۆۋەندىكى ئۇلانما شەكلىنى ئىشلىتىڭ:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' ھۆججەتنىڭ تولۇق نەشرىنى ئىشلىتىدۇ
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' 200 نۇقتا كەڭلىكتىكى سول ياندىكى رامكىدا قايتا پەيدا بولىدىغان 'ئالماشتۇرىدىغان تېكست' چۈشەندۈرۈشىنى ئىشلىتىدۇ.
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' ھۆججەتنى كۆرسەتمەيلا بىۋاسىتە ئۇلىنىدۇ",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' ھۆججەتنىڭ تولۇق نەشرىنى ئىشلىتىدۇ
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 200 نۇقتا كەڭلىكتىكى سول ياندىكى رامكىدا قايتا پەيدا بولىدىغان 'ئالماشتۇرىدىغان تېكست' چۈشەندۈرۈشىنى ئىشلىتىدۇ.
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' ھۆججەتنى كۆرسەتمەيلا بىۋاسىتە ئۇلىنىدۇ",
 'upload-permitted' => 'يول قويىدىغان ھۆججەت تىپى: $1',
 'upload-preferred' => 'تەۋسىيىلىك ھۆججەت تىپى: $1',
 'upload-prohibited' => 'چەكلەيدىغان ھۆججەت تىپى: $1',
@@ -1470,21 +1530,21 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 بۇ ھۆججەت ئاتى خاتا كىرگۈزگەنلىكتىن بولۇشى مۇمكىن.
 سىز راستىنلا بۇ ھۆججەتنى يۈكلەيدىغانلىقىڭىزنى تەكشۈرۈڭ.',
 'windows-nonascii-filename' => 'بۇ ۋىكى ھۆججەت ئاتىدا ئالاھىدە ھەرپ بەلگە ئىشلىتىشنى قوللىمايدۇ.',
-'fileexists' => "ئوخشاش ئاتتىكى ھۆججەت مەۋجۇد، ئەگەر ئۇنى ئۆزگەرتىشنى جەزملىيەلمىسىڭىز '''<tt>[[:$1]]</tt>''' نى تەكشۈرۈڭ.
-[[$1|thumb]]",
-'filepageexists' => "بۇ ھۆججەتنىڭ چۈشەندۈرۈش بېتى  '''<tt>[[:$1]]</tt>''' دا قۇرۇلغان، ئەمما بۇ ئاتلىق ھۆججەت مەۋجۇد ئەمەس.
+'fileexists' => 'ئوخشاش ئاتتىكى ھۆججەت مەۋجۇد، ئەگەر ئۇنى ئۆزگەرتىشنى جەزملىيەلمىسىڭىز <strong>[[:$1]]</strong> نى تەكشۈرۈڭ.
+[[$1|thumb]]',
+'filepageexists' => 'بۇ ھۆججەتنىڭ چۈشەندۈرۈش بېتى  <strong>[[:$1]]</strong> دا قۇرۇلغان، ئەمما بۇ ئاتلىق ھۆججەت مەۋجۇد ئەمەس.
 سىز كىرگۈزگەن ئۈزۈندە چۈشەندۈرۈش بېتىدە كۆرۈنمەيدۇ.
 ئۈزۈندە شۇ جايدا كۆرۈنسۇن دەپ قارىسىڭىز، ئۆزىڭىز تەھرىرلەڭ.
-[[$1|thumb]]",
+[[$1|thumb]]',
 'fileexists-extension' => "ئوخشاپ كېتىدىغان ئاتتىكى ھۆججەتتىن بىرى مەۋجۇد: [[$2|thumb]]
-* يۈكلىگەن ھۆججەتنىڭ ئاتى: '''<tt>[[:$1]]</tt>'''
-* مەۋجۇد ھۆججەتنىڭ ئاتى:'''<tt>[[:$2]]</tt>''
+* يۈكلىگەن ھۆججەتنىڭ ئاتى: <strong>[[:$1]]</strong>
+* مەۋجۇد ھۆججەتنىڭ ئاتى:<strong>[[:$2]]</strong>''
 باشقا ئاتتىن بىرنى تاللاڭ.",
 'fileexists-thumbnail-yes' => "بۇ ھۆججەت يەنە بىر سۈرەتنىڭ كىچىكلىتىلگەن نەشرىدەك تۇرىدۇ ''(كىچىك سۈرەت)''.
 [[$1|thumb]]
-بۇ ھۆججەتنى تەپسىلىي تەكشۈرۈڭ'''<tt>[[:$1]]</tt>'''.
+بۇ ھۆججەتنى تەپسىلىي تەكشۈرۈڭ<strong>[[:$1]]</strong>.
 ئەگەر تەكشۈرۈلگەن ھۆججەت بىلەن ئەسلى چوڭلۇقتىكى سۈرەت ئوخشاش بىر پارچە سۈرەت بولسا، ئوشۇقچە كىچىك سۈرەت يوللىشىڭىزنىڭ ھاجىتى يوق.",
-'file-thumbnail-no' => "ھۆججەت ئاتى '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "ھۆججەت ئاتى <strong>$1</strong>.
  دىن باشلانغان، باشقا بىر پارچە سۈرەتنىڭ كىچىك سۈرىتى بولۇشى مۇمكىن ''(كىچىك سۈرەت)''.
 ئەگەر سىزدە ئەسلى چوڭلۇقتىكى نەشرى بولسا، ئۇنى يۈكلەڭ، بولمىسا ھۆججەت ئاتىنى ئۆزگەرتىڭ.",
 'fileexists-forbidden' => 'ئوخشاش ئاتتىكى ھۆججەت مەۋجۇد، قاپلىۋەتكىلى بولمايدۇ؛
@@ -1637,7 +1697,7 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'filehist-filesize' => 'ھۆججەت چوڭلۇقى',
 'filehist-comment' => 'ئىزاھات',
 'filehist-missing' => 'ھۆججەت يوقالغان',
-'imagelinks' => 'ھۆججەت ئۇلىنىشى',
+'imagelinks' => 'ھۆججەت ئىشلىتىلىشى',
 'linkstoimage' => 'تۆۋەندىكى {{PLURAL:$1|بەت|$1 بەت}}  بۇ ھۆججەتكە ئۇلانغان:',
 'linkstoimage-more' => '{{PLURAL:$1|دىن كۆپ بەت ئۇلانما|دىن كۆپ بەت ئۇلانما}}  بۇ ھۆججەتكە ئۇلانغان.
 تۆۋەندىكى تىزىملىك پەقەت بۇ ھۆججەتنىڭ ئەڭ بېشىدىكى {{PLURAL:$1|بەت| $1 بەت}} ئۇلىنىشىنىلا كۆرسىتىدۇ.
@@ -1689,7 +1749,7 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 # MIME search
 'mimesearch' => 'MIME ئىزدە',
 'mimesearch-summary' => 'بۇ بەت MIME تىپلىق سۈزگۈچنى قوزغاتقان.
-كىرگۈزۈش: مەزمۇن تىپى/تارماق تىپ، مەسىلەن <tt>image/jpeg</tt>.',
+كىرگۈزۈش: مەزمۇن تىپى/تارماق تىپ، مەسىلەن <code>image/jpeg</code>.',
 'mimetype' => 'MIME تىپى:',
 'download' => 'چۈشۈر',
 
@@ -1807,7 +1867,7 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'listusers-editsonly' => 'تەھرىرلەنگەن ئىشلەتكۈچىلەرنىلا كۆرسەت',
 'listusers-creationsort' => 'قۇرۇلغان ۋاقتى بويىچە تەرتىپلە',
 'usereditcount' => '$1 {{PLURAL:$1|قېتىم|قېتىم}} تەھرىرلەنگەن',
-'usercreated' => ' $1  $2 قۇرۇلغان',
+'usercreated' => '$1 دا $2 دە {{GENDER:$3|قۇرغان}}',
 'newpages' => 'يېڭى بەتلەر',
 'newpages-username' => 'ئىشلەتكۇچى ئىسمى:',
 'ancientpages' => 'ئەڭ كونا بەتلەر',
@@ -1879,7 +1939,7 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'linksearch-ns' => 'ئات بوشلۇقى:',
 'linksearch-ok' => 'ئىزدەش',
 'linksearch-text' => ' \\"*.wikipedia.org\\" غا ئوخشاش ئورتاق بەلگە ئىشلىتىشكە بولىدۇ. <br />
-قوللايدىغان كېلىشىم: <tt>$1</tt>',
+قوللايدىغان كېلىشىم: <code>$1</code>',
 'linksearch-line' => '$1 بولسا $2 دىن ئۇلانغان',
 'linksearch-error' => 'ئورتاق بەلگەنى پەقەت ئاساسىي ئاپپارات ئاتىنىڭ باشىدىلا ئىشلەتكىلى بولىدۇ.',
 
@@ -2709,15 +2769,10 @@ $1',
 # Info page
 'pageinfo-title' => '"$1" نىڭ ئۇچۇرى',
 'pageinfo-header-edits' => 'تەھرىر',
-'pageinfo-header-watchlist' => 'كۆزەت تىزىمى',
-'pageinfo-header-views' => 'كۆرۈنۈش',
-'pageinfo-subjectpage' => 'بەت',
-'pageinfo-talkpage' => 'مۇنازىرە بېتى',
+'pageinfo-views' => 'كۆرۈنۈش سانى',
 'pageinfo-watchers' => 'كۆزەتكۈچىلەر سانى',
 'pageinfo-edits' => 'تەھرىر سانى',
 'pageinfo-authors' => 'يازغۇچىلار سانى',
-'pageinfo-views' => 'كۆرۈنۈش سانى',
-'pageinfo-viewsperedit' => 'ھەر بىر تەھرىر كۆرۈنۈشى',
 
 # Patrolling
 'markaspatrolleddiff' => 'چارلاش بەلگىسى قوي',
index cf3e24a..9b3b383 100644 (file)
@@ -102,7 +102,7 @@ $bookstoreList = array(
 );
 
 $specialPageAliases = array(
-       'Activeusers'               => array( 'Активні_учасники' ),
+       'Activeusers'               => array( 'Активні_дописувачі' ),
        'Allmessages'               => array( 'Системні_повідомлення' ),
        'Allpages'                  => array( 'Усі_сторінки' ),
        'Ancientpages'              => array( 'Давні_сторінки' ),
@@ -123,14 +123,14 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'Вилучений_внесок' ),
        'Disambiguations'           => array( 'Неоднозначні_посилання' ),
        'DoubleRedirects'           => array( 'Подвійні_перенаправлення' ),
-       'EditWatchlist'             => array( 'Ð\9fÑ\80авити_список_спостереження' ),
+       'EditWatchlist'             => array( 'РедагÑ\83вати_список_спостереження' ),
        'Emailuser'                 => array( 'Лист_користувачеві' ),
        'Export'                    => array( 'Експорт' ),
-       'Fewestrevisions'           => array( 'Ð\9dайменÑ\88Ñ\96_пеÑ\80евÑ\96Ñ\80ки' ),
+       'Fewestrevisions'           => array( 'Ð\9dайменÑ\88Ñ\80едагованÑ\96' ),
        'FileDuplicateSearch'       => array( 'Пошук_дублікатів_файлів' ),
        'Filepath'                  => array( 'Шлях_до_файлу' ),
        'Import'                    => array( 'Імпорт' ),
-       'Invalidateemail'           => array( 'Нечинна_e-mail' ),
+       'Invalidateemail'           => array( 'Неперевірена_email-адреса' ),
        'BlockList'                 => array( 'Список_блокувань', 'Блокування', 'Блокування_IP-адрес' ),
        'LinkSearch'                => array( 'Пошук_посилань' ),
        'Listadmins'                => array( 'Список_адміністраторів' ),
@@ -144,9 +144,9 @@ $specialPageAliases = array(
        'Lonelypages'               => array( 'Ізольовані_сторінки' ),
        'Longpages'                 => array( 'Найдовші_сторінки' ),
        'MergeHistory'              => array( 'Об\'єднання_історії' ),
-       'MIMEsearch'                => array( 'Ð\9fоÑ\88Ñ\83к_по_MIME' ),
-       'Mostcategories'            => array( 'Ð\9dайкаÑ\82егоÑ\80изовÑ\83ванÑ\96Ñ\88і' ),
-       'Mostimages'                => array( 'Найбільш_використовувані_файли' ),
+       'MIMEsearch'                => array( 'Ð\9fоÑ\88Ñ\83к_за_MIME' ),
+       'Mostcategories'            => array( 'Ð\9dайбÑ\96лÑ\8cÑ\88_каÑ\82егоÑ\80изовані' ),
+       'Mostimages'                => array( 'Найуживаніші_файли' ),
        'Mostlinkedcategories'      => array( 'Найуживаніші_категорії' ),
        'Mostlinkedtemplates'       => array( 'Найуживаніші_шаблони' ),
        'Mostrevisions'             => array( 'Найбільш_редаговані' ),
@@ -167,7 +167,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'Випадкове_перенаправлення' ),
        'Recentchanges'             => array( 'Нові_редагування' ),
        'Recentchangeslinked'       => array( 'Пов\'язані_редагування' ),
-       'Revisiondelete'            => array( 'Ð\9fеÑ\80евÑ\96Ñ\80иÑ\82и_видалення' ),
+       'Revisiondelete'            => array( 'Ð\92илÑ\83Ñ\87иÑ\82и_Ñ\80едагÑ\83вання' ),
        'Search'                    => array( 'Пошук' ),
        'Shortpages'                => array( 'Короткі_сторінки' ),
        'Specialpages'              => array( 'Спеціальні_сторінки' ),
@@ -181,8 +181,8 @@ $specialPageAliases = array(
        'Undelete'                  => array( 'Відновити' ),
        'Unlockdb'                  => array( 'Розблокувати_базу_даних' ),
        'Unusedcategories'          => array( 'Порожні_категорії' ),
-       'Unusedimages'              => array( 'Ð\9dевикоÑ\80иÑ\81Ñ\82овÑ\83ванÑ\96\84айли' ),
-       'Unusedtemplates'           => array( 'Ð\9dевикоÑ\80иÑ\81Ñ\82овÑ\83ванÑ\96\88аблони' ),
+       'Unusedimages'              => array( 'Невикористані_файли' ),
+       'Unusedtemplates'           => array( 'Невикористані_шаблони' ),
        'Unwatchedpages'            => array( 'Неспостережувані' ),
        'Upload'                    => array( 'Завантаження' ),
        'UploadStash'               => array( 'Приховане_завантаження' ),
@@ -200,148 +200,153 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ПЕРЕНАПРАВЛЕННЯ', '#ПЕРЕНАПР', '#перенапр', '#перенаправление', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__БЕЗ_ЗМІСТУ__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__БЕЗ_ГАЛЕРЕЇ__', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__ОБОВ_ЗМІСТ__', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ЗМІСТ__', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__БЕЗ_РЕДАГУВ_РОЗДІЛУ__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__БЕЗ_ЗАГОЛОВКУ__', '__БЕЗ_ЗАГОЛОВКА__', '__NOHEADER__' ),
-       'currentmonth'            => array( '1', 'ПОТОЧНИЙ_МІСЯЦЬ', 'ПОТОЧНИЙ_МІСЯЦЬ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'ПОТОЧНИЙ_МІСЯЦЬ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'НАЗВА_ПОТОЧНОГО_МІСЯЦЯ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'НАЗВА_ПОТОЧНОГО_МІСЯЦЯ_РОД', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'НАЗВА_ПОТОЧНОГО_МІСЯЦЯ_АБР', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'ПОТОЧНИЙ_ДЕНЬ', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'ПОТОЧНИЙ_ДЕНЬ_2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'НАЗВА_ПОТОЧНОГО_ДНЯ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'ПОТОЧНИЙ_РІК', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'ПОТОЧНИЙ_ЧАС', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'ПОТОЧНА_ГОДИНА', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'ЛОКАЛЬНИЙ_МІСЯЦЬ', 'ЛОКАЛЬНИЙ_МІСЯЦЬ_2', 'МЕСТНЫЙ_МЕСЯЦ', 'МЕСТНЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'ЛОКАЛЬНИЙ_МІСЯЦЬ_1', 'МЕСТНЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_МІСЯЦЯ', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_МІСЯЦЯ_РОД', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_РОД', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_МІСЯЦЯ_АБР', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'ЛОКАЛЬНИЙ_ДЕНЬ', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'ЛОКАЛЬНИЙ_ДЕНЬ_2', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_ДНЯ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'ЛОКАЛЬНИЙ_РІК', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'ЛОКАЛЬНИЙ_ЧАС', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'ЛОКАЛЬНА_ГОДИНА', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
-       'numberofpages'           => array( '1', 'КІЛЬКІСТЬ_СТОРІНОК', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'КІЛЬКІСТЬ_СТАТЕЙ', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'КІЛЬКІСТЬ_ФАЙЛІВ', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'КІЛЬКІСТЬ_КОРИСТУВАЧІВ', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'КІЛЬКІСТЬ_АКТИВНИХ_КОРИСТУВАЧІВ', 'КОЛИЧЕСТВО_АКТИВНЫХ_УЧАСТНИКОВ', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'КІЛЬКІСТЬ_РЕДАГУВАНЬ', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'КІЛЬКІСТЬ_ПЕРЕГЛЯДІВ', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'НАЗВА_СТОРІНКИ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'НАЗВА_СТОРІНКИ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'ПРОСТІР_НАЗВ', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
-       'namespacee'              => array( '1', 'ПРОСТІР_НАЗВ_2', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
-       'talkspace'               => array( '1', 'ПРОСТІР_ОБГОВОРЕННЯ', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
-       'talkspacee'              => array( '1', 'ПРОСТІР_ОБГОВОРЕННЯ_2', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
-       'subjectspace'            => array( '1', 'ПРОСТІР_СТАТЕЙ', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'subjectspacee'           => array( '1', 'ПРОСТІР_СТАТЕЙ_2', 'ПРОСТРАНСТВО_СТАТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'ПОВНА_НАЗВА_СТОРІНКИ', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
-       'fullpagenamee'           => array( '1', 'ПОВНА_НАЗВА_СТОРІНКИ_2', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ_2', 'FULLPAGENAMEE' ),
-       'subpagename'             => array( '1', 'НАЗВА_ПІДСТОРІНКИ', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ', 'SUBPAGENAME' ),
-       'subpagenamee'            => array( '1', 'НАЗВА_ПІДСТОРІНКИ_2', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ_2', 'SUBPAGENAMEE' ),
-       'basepagename'            => array( '1', 'ОСНОВА_НАЗВИ_ПІДСТОРІНКИ', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ', 'BASEPAGENAME' ),
-       'basepagenamee'           => array( '1', 'ОСНОВА_НАЗВИ_ПІДСТОРІНКИ_2', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ_2', 'BASEPAGENAMEE' ),
-       'talkpagename'            => array( '1', 'НАЗВА_СТОРІНКИ_ОБГОВОРЕННЯ', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
-       'talkpagenamee'           => array( '1', 'НАЗВА_СТОРІНКИ_ОБГОВОРЕННЯ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ_2', 'TALKPAGENAMEE' ),
-       'subjectpagename'         => array( '1', 'НАЗВА_СТАТТІ', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'subjectpagenamee'        => array( '1', 'НАЗВА_СТАТТІ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
-       'msg'                     => array( '0', 'ПОВІД:', 'ПОВІДОМЛЕННЯ:', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
-       'subst'                   => array( '0', 'ПІДСТ:', 'ПІДСТАНОВКА:', 'ПОДСТАНОВКА:', 'ПОДСТ:', 'SUBST:' ),
-       'safesubst'               => array( '0', 'БЕЗПЕЧНА_ПІДСТАНОВКА:', 'ЗАЩПОДСТ:', 'SAFESUBST:' ),
-       'msgnw'                   => array( '0', 'ПОВІД_БЕЗ_ВІКІ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'міні', 'мініатюра', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'міні=$1', 'мініатюра=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'праворуч', 'справа', 'right' ),
-       'img_left'                => array( '1', 'ліворуч', 'слева', 'left' ),
-       'img_none'                => array( '1', 'без', 'none' ),
-       'img_width'               => array( '1', '$1пкс', '$1px' ),
-       'img_center'              => array( '1', 'центр', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'обрамити', 'рамка', 'обрамить', 'framed', 'enframed', 'frame' ),
-       'img_frameless'           => array( '1', 'безрамки', 'frameless' ),
-       'img_page'                => array( '1', 'сторінка=$1', 'сторінка $1', 'страница=$1', 'страница $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'зверхуправоруч', 'зверхуправоруч=$1', 'зверхуправоруч $1', 'сверхусправа', 'сверхусправа=$1', 'сверхусправа $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_border'              => array( '1', 'межа', 'граница', 'border' ),
-       'img_baseline'            => array( '1', 'основа', 'основание', 'baseline' ),
-       'img_sub'                 => array( '1', 'під', 'под', 'sub' ),
-       'img_super'               => array( '1', 'над', 'super', 'sup' ),
-       'img_top'                 => array( '1', 'зверху', 'сверху', 'top' ),
-       'img_text_top'            => array( '1', 'текст-зверху', 'текст-сверху', 'text-top' ),
-       'img_middle'              => array( '1', 'посередині', 'посередине', 'middle' ),
-       'img_bottom'              => array( '1', 'знизу', 'снизу', 'bottom' ),
-       'img_text_bottom'         => array( '1', 'текст-знизу', 'текст-снизу', 'text-bottom' ),
-       'img_link'                => array( '1', 'посилання=$1', 'ссылка=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'альт=$1', 'alt=$1' ),
-       'int'                     => array( '0', 'ВНУТР:', 'INT:' ),
-       'sitename'                => array( '1', 'НАЗВА_САЙТУ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
-       'ns'                      => array( '0', 'ПН:', 'ПИ:', 'NS:' ),
-       'nse'                     => array( '0', 'ПН_2:', 'ПИК:', 'NSE:' ),
-       'localurl'                => array( '0', 'ЛОКАЛЬНА_АДРЕСА:', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'ЛОКАЛЬНА_АДРЕСА_2:', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
-       'server'                  => array( '0', 'СЕРВЕР', 'SERVER' ),
-       'servername'              => array( '0', 'НАЗВА_СЕРВЕРА', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ШЛЯХ_ДО_СКРИПТУ', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'ВІДМІНОК:', 'ПАДЕЖ:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'СТАТЬ:', 'ПОЛ:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__БЕЗ_ПЕРЕТВОРЕННЯ_ЗАГОЛОВКУ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ЗАГОЛОВКА__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__БЕЗ_ПЕРЕТВОРЕННЯ_ТЕКСТУ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ТЕКСТА__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'ПОТОЧНИЙ_ТИЖДЕНЬ', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
-       'currentdow'              => array( '1', 'ПОТОЧНИЙ_ДЕНЬ_ТИЖНЯ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
-       'localweek'               => array( '1', 'ЛОКАЛЬНИЙ_ТИЖДЕНЬ', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
-       'localdow'                => array( '1', 'ЛОКАЛЬНИЙ_ДЕНЬ_ТИЖНЯ', 'МЕСТНЫЙ_ДЕНЬ_НЕДЕЛИ', 'LOCALDOW' ),
-       'revisionid'              => array( '1', 'ІД_ВЕРСІЇ', 'ИД_ВЕРСИИ', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'ДЕНЬ_ВЕРСІЇ', 'ДЕНЬ_ВЕРСИИ', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'ДЕНЬ_ВЕРСІЇ_2', 'ДЕНЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'МІСЯЦЬ_ВЕРСІЇ', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
-       'revisionyear'            => array( '1', 'РІК_ВЕРСІЇ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
-       'revisiontimestamp'       => array( '1', 'МІТКА_ЧАСУ_ВЕРСІЇ', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'            => array( '1', 'ВЕРСІЯ_КОРИСТУВАЧА', 'ВЕРСИЯ_УЧАСНИКА', 'REVISIONUSER' ),
-       'plural'                  => array( '0', 'МНОЖИНА:', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'ПОВНА_АДРЕСА:', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'ПОВНА_АДРЕСА_2:', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
-       'lcfirst'                 => array( '0', 'НР_ПЕРША:', 'ПЕРША_БУКВА_МАЛА:', 'ПЕРВАЯ_БУКВА_МАЛЕНЬКАЯ:', 'LCFIRST:' ),
-       'ucfirst'                 => array( '0', 'ВР_ПЕРША:', 'ПЕРША_БУКВА_ВЕЛИКА:', 'ПЕРВАЯ_БУКВА_БОЛЬШАЯ:', 'UCFIRST:' ),
-       'lc'                      => array( '0', 'НР:', 'НИЖНІЙ_РЕГІСТР:', 'МАЛИМИ_БУКВАМИ:', 'МАЛЕНЬКИМИ_БУКВАМИ:', 'LC:' ),
-       'uc'                      => array( '0', 'ВР:', 'ВЕРХНІЙ_РЕГІСТР:', 'ВЕЛИКИМИ_БУКВАМИ:', 'БОЛЬШИМИ_БУКВАМИ:', 'UC:' ),
-       'raw'                     => array( '0', 'НЕОБРОБ:', 'НЕОБРАБ:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ПОКАЗАТИ_ЗАГОЛОВОК', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
-       'rawsuffix'               => array( '1', 'Н', 'R' ),
-       'newsectionlink'          => array( '1', '__ПОСИЛАННЯ_НА_НОВИЙ_РОЗДІЛ__', '__ССЫЛКА_НА_НОВЫЙ_РАЗДЕЛ__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__БЕЗ_ПОСИЛАННЯ_НА_НОВИЙ_РОЗДІЛ__', '__БЕЗ_ССЫЛКИ_НА_НОВЫЙ_РАЗДЕЛ__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'ПОТОЧНА_ВЕРСІЯ', 'ТЕКУЩАЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'ЗАКОДОВАНА_АДРЕСА:', 'ЗАКОДИРОВАННЫЙ_АДРЕС:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'КОДУВАТИ_МІТКУ', 'КОДИРОВАТЬ_МЕТКУ', 'ANCHORENCODE' ),
-       'currenttimestamp'        => array( '1', 'МІТКА_ПОТОЧНОГО_ЧАСУ', 'ОТМЕТКА_ТЕКУЩЕГО_ВРЕМЕНИ', 'CURRENTTIMESTAMP' ),
-       'localtimestamp'          => array( '1', 'МІТКА_ЛОКАЛЬНОГО_ЧАСУ', 'ОТМЕТКА_МЕСТНОГО_ВРЕМЕНИ', 'LOCALTIMESTAMP' ),
-       'directionmark'           => array( '1', 'НАПРЯМОК_ПИСЬМА', 'НАПРАВЛЕНИЕ_ПИСЬМА', 'DIRECTIONMARK', 'DIRMARK' ),
-       'language'                => array( '0', '#МОВА:', '#ЯЗЫК:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'МОВА_ВМІСТУ', 'ЯЗЫК_СОДЕРЖАНИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'СТОРІНОК_У_ПРОСТОРІ_НАЗВ:', 'СТРАНИЦ_В_ПРОСТРАНСТВЕ_ИМЁН:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'КІЛЬКІСТЬ_АДМІНІСТРАТОРІВ', 'КОЛИЧЕСТВО_АДМИНИСТРАТОРОВ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'ФОРМАТУВАТИ_ЧИСЛО', 'ФОРМАТИРОВАТЬ_ЧИСЛО', 'FORMATNUM' ),
-       'padleft'                 => array( '0', 'ЗАПОВНИТИ_ЛІВОРУЧ', 'ЗАПОЛНИТЬ_СЛЕВА', 'PADLEFT' ),
-       'padright'                => array( '0', 'ЗАПОВНИТИ_ПРАВОРУЧ', 'ЗАПОЛНИТЬ_СПРАВА', 'PADRIGHT' ),
-       'special'                 => array( '0', 'спеціальна', 'служебная', 'special' ),
-       'defaultsort'             => array( '1', 'СТАНДАРТНЕ_СОРТУВАННЯ:', 'СОРТУВАННЯ:', 'СОРТИРОВКА_ПО_УМОЛЧАНИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ШЛЯХ_ДО_ФАЙЛУ:', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'тег', 'мітка', 'метка', 'тэг', 'tag' ),
-       'hiddencat'               => array( '1', '__ПРИХОВ_КАТ__', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'СТОР_В_КАТ', 'СТОР_У_КАТ', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'РОЗМІР', 'РОЗМІР_СТОРІНКИ', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
-       'index'                   => array( '1', '__ІНДЕКС__', '__ИНДЕКС__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__БЕЗ_ІНДЕКСУ__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
-       'numberingroup'           => array( '1', 'КІЛЬКІСТЬ_У_ГРУПІ', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__СТАТИЧНЕ_ПЕРЕНАПРАВЛЕННЯ__', '__СТАТИЧЕСКОЕ_ПЕРЕНАПРАВЛЕНИЕ__', '__STATICREDIRECT__' ),
-       'protectionlevel'         => array( '1', 'РІВЕНЬ_ЗАХИСТУ', 'УРОВЕНЬ_ЗАЩИТЫ', 'PROTECTIONLEVEL' ),
-       'formatdate'              => array( '0', 'форматдати', 'форматдаты', 'formatdate', 'dateformat' ),
+       'redirect'                  => array( '0', '#ПЕРЕНАПРАВЛЕННЯ', '#ПЕРЕНАПР', '#перенапр', '#перенаправление', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__БЕЗ_ЗМІСТУ__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__БЕЗ_ГАЛЕРЕЇ__', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__ОБОВ_ЗМІСТ__', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ЗМІСТ__', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__БЕЗ_РЕДАГУВ_РОЗДІЛУ__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__БЕЗ_ЗАГОЛОВКУ__', '__БЕЗ_ЗАГОЛОВКА__', '__NOHEADER__' ),
+       'currentmonth'              => array( '1', 'ПОТОЧНИЙ_МІСЯЦЬ', 'ПОТОЧНИЙ_МІСЯЦЬ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'ПОТОЧНИЙ_МІСЯЦЬ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'НАЗВА_ПОТОЧНОГО_МІСЯЦЯ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'НАЗВА_ПОТОЧНОГО_МІСЯЦЯ_РОД', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_РОД', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'НАЗВА_ПОТОЧНОГО_МІСЯЦЯ_АБР', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА_АБР', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'ПОТОЧНИЙ_ДЕНЬ', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'ПОТОЧНИЙ_ДЕНЬ_2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'НАЗВА_ПОТОЧНОГО_ДНЯ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'ПОТОЧНИЙ_РІК', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'ПОТОЧНИЙ_ЧАС', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'ПОТОЧНА_ГОДИНА', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
+       'localmonth'                => array( '1', 'ЛОКАЛЬНИЙ_МІСЯЦЬ', 'ЛОКАЛЬНИЙ_МІСЯЦЬ_2', 'МЕСТНЫЙ_МЕСЯЦ', 'МЕСТНЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'ЛОКАЛЬНИЙ_МІСЯЦЬ_1', 'МЕСТНЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_МІСЯЦЯ', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'         => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_МІСЯЦЯ_РОД', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_РОД', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'          => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_МІСЯЦЯ_АБР', 'НАЗВАНИЕ_МЕСТНОГО_МЕСЯЦА_АБР', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'ЛОКАЛЬНИЙ_ДЕНЬ', 'МЕСТНЫЙ_ДЕНЬ', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'ЛОКАЛЬНИЙ_ДЕНЬ_2', 'МЕСТНЫЙ_ДЕНЬ_2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'НАЗВА_ЛОКАЛЬНОГО_ДНЯ', 'НАЗВАНИЕ_МЕСТНОГО_ДНЯ', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'ЛОКАЛЬНИЙ_РІК', 'МЕСТНЫЙ_ГОД', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'ЛОКАЛЬНИЙ_ЧАС', 'МЕСТНОЕ_ВРЕМЯ', 'LOCALTIME' ),
+       'localhour'                 => array( '1', 'ЛОКАЛЬНА_ГОДИНА', 'МЕСТНЫЙ_ЧАС', 'LOCALHOUR' ),
+       'numberofpages'             => array( '1', 'КІЛЬКІСТЬ_СТОРІНОК', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'КІЛЬКІСТЬ_СТАТЕЙ', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'КІЛЬКІСТЬ_ФАЙЛІВ', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'КІЛЬКІСТЬ_КОРИСТУВАЧІВ', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'КІЛЬКІСТЬ_АКТИВНИХ_КОРИСТУВАЧІВ', 'КОЛИЧЕСТВО_АКТИВНЫХ_УЧАСТНИКОВ', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'КІЛЬКІСТЬ_РЕДАГУВАНЬ', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'КІЛЬКІСТЬ_ПЕРЕГЛЯДІВ', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'НАЗВА_СТОРІНКИ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'НАЗВА_СТОРІНКИ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'ПРОСТІР_НАЗВ', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'ПРОСТІР_НАЗВ_2', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
+       'talkspace'                 => array( '1', 'ПРОСТІР_ОБГОВОРЕННЯ', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ПРОСТІР_ОБГОВОРЕННЯ_2', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
+       'subjectspace'              => array( '1', 'ПРОСТІР_СТАТЕЙ', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'             => array( '1', 'ПРОСТІР_СТАТЕЙ_2', 'ПРОСТРАНСТВО_СТАТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'              => array( '1', 'ПОВНА_НАЗВА_СТОРІНКИ', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', 'ПОВНА_НАЗВА_СТОРІНКИ_2', 'ПОЛНОЕ_НАЗВАНИЕ_СТРАНИЦЫ_2', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', 'НАЗВА_ПІДСТОРІНКИ', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', 'НАЗВА_ПІДСТОРІНКИ_2', 'НАЗВАНИЕ_ПОДСТРАНИЦЫ_2', 'SUBPAGENAMEE' ),
+       'basepagename'              => array( '1', 'ОСНОВА_НАЗВИ_ПІДСТОРІНКИ', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ', 'BASEPAGENAME' ),
+       'basepagenamee'             => array( '1', 'ОСНОВА_НАЗВИ_ПІДСТОРІНКИ_2', 'ОСНОВА_НАЗВАНИЯ_СТРАНИЦЫ_2', 'BASEPAGENAMEE' ),
+       'talkpagename'              => array( '1', 'НАЗВА_СТОРІНКИ_ОБГОВОРЕННЯ', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', 'НАЗВА_СТОРІНКИ_ОБГОВОРЕННЯ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_ОБСУЖДЕНИЯ_2', 'TALKPAGENAMEE' ),
+       'subjectpagename'           => array( '1', 'НАЗВА_СТАТТІ', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'НАЗВА_СТАТТІ_2', 'НАЗВАНИЕ_СТРАНИЦЫ_СТАТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                       => array( '0', 'ПОВІД:', 'ПОВІДОМЛЕННЯ:', 'СООБЩЕНИЕ:', 'СООБЩ:', 'MSG:' ),
+       'subst'                     => array( '0', 'ПІДСТ:', 'ПІДСТАНОВКА:', 'ПОДСТАНОВКА:', 'ПОДСТ:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'БЕЗПЕЧНА_ПІДСТАНОВКА:', 'ЗАЩПОДСТ:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'ПОВІД_БЕЗ_ВІКІ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'міні', 'мініатюра', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'міні=$1', 'мініатюра=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'праворуч', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'ліворуч', 'слева', 'left' ),
+       'img_none'                  => array( '1', 'без', 'none' ),
+       'img_width'                 => array( '1', '$1пкс', '$1px' ),
+       'img_center'                => array( '1', 'центр', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'обрамити', 'рамка', 'обрамить', 'framed', 'enframed', 'frame' ),
+       'img_frameless'             => array( '1', 'безрамки', 'frameless' ),
+       'img_page'                  => array( '1', 'сторінка=$1', 'сторінка $1', 'страница=$1', 'страница $1', 'страница $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'зверхуправоруч', 'зверхуправоруч=$1', 'зверхуправоруч $1', 'сверхусправа', 'сверхусправа=$1', 'сверхусправа_$1', 'сверхусправа $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_border'                => array( '1', 'межа', 'граница', 'border' ),
+       'img_baseline'              => array( '1', 'основа', 'основание', 'baseline' ),
+       'img_sub'                   => array( '1', 'під', 'под', 'sub' ),
+       'img_super'                 => array( '1', 'над', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'зверху', 'сверху', 'top' ),
+       'img_text_top'              => array( '1', 'текст-зверху', 'текст-сверху', 'text-top' ),
+       'img_middle'                => array( '1', 'посередині', 'посередине', 'middle' ),
+       'img_bottom'                => array( '1', 'знизу', 'снизу', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'текст-знизу', 'текст-снизу', 'text-bottom' ),
+       'img_link'                  => array( '1', 'посилання=$1', 'ссылка=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'альт=$1', 'alt=$1' ),
+       'int'                       => array( '0', 'ВНУТР:', 'INT:' ),
+       'sitename'                  => array( '1', 'НАЗВА_САЙТУ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
+       'ns'                        => array( '0', 'ПН:', 'ПИ:', 'NS:' ),
+       'nse'                       => array( '0', 'ПН_2:', 'ПИК:', 'NSE:' ),
+       'localurl'                  => array( '0', 'ЛОКАЛЬНА_АДРЕСА:', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', 'ЛОКАЛЬНА_АДРЕСА_2:', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
+       'server'                    => array( '0', 'СЕРВЕР', 'SERVER' ),
+       'servername'                => array( '0', 'НАЗВА_СЕРВЕРА', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ШЛЯХ_ДО_СКРИПТУ', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
+       'stylepath'                 => array( '0', 'ШЛЯХ_ДО_СТИЛЮ', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
+       'grammar'                   => array( '0', 'ВІДМІНОК:', 'ПАДЕЖ:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'СТАТЬ:', 'ПОЛ:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__БЕЗ_ПЕРЕТВОРЕННЯ_ЗАГОЛОВКУ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ЗАГОЛОВКА__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__БЕЗ_ПЕРЕТВОРЕННЯ_ТЕКСТУ__', '__БЕЗ_ПРЕОБРАЗОВАНИЯ_ТЕКСТА__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'ПОТОЧНИЙ_ТИЖДЕНЬ', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'ПОТОЧНИЙ_ДЕНЬ_ТИЖНЯ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
+       'localweek'                 => array( '1', 'ЛОКАЛЬНИЙ_ТИЖДЕНЬ', 'МЕСТНАЯ_НЕДЕЛЯ', 'LOCALWEEK' ),
+       'localdow'                  => array( '1', 'ЛОКАЛЬНИЙ_ДЕНЬ_ТИЖНЯ', 'МЕСТНЫЙ_ДЕНЬ_НЕДЕЛИ', 'LOCALDOW' ),
+       'revisionid'                => array( '1', 'ІД_ВЕРСІЇ', 'ИД_ВЕРСИИ', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'ДЕНЬ_ВЕРСІЇ', 'ДЕНЬ_ВЕРСИИ', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'ДЕНЬ_ВЕРСІЇ_2', 'ДЕНЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'МІСЯЦЬ_ВЕРСІЇ', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'МІСЯЦЬ_ВЕРСІЇ_1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'РІК_ВЕРСІЇ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'МІТКА_ЧАСУ_ВЕРСІЇ', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'ВЕРСІЯ_КОРИСТУВАЧА', 'ВЕРСИЯ_УЧАСНИКА', 'REVISIONUSER' ),
+       'plural'                    => array( '0', 'МНОЖИНА:', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'ПОВНА_АДРЕСА:', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ПОВНА_АДРЕСА_2:', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
+       'lcfirst'                   => array( '0', 'НР_ПЕРША:', 'ПЕРША_БУКВА_МАЛА:', 'ПЕРВАЯ_БУКВА_МАЛЕНЬКАЯ:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'ВР_ПЕРША:', 'ПЕРША_БУКВА_ВЕЛИКА:', 'ПЕРВАЯ_БУКВА_БОЛЬШАЯ:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'НР:', 'НИЖНІЙ_РЕГІСТР:', 'МАЛИМИ_БУКВАМИ:', 'МАЛЕНЬКИМИ_БУКВАМИ:', 'LC:' ),
+       'uc'                        => array( '0', 'ВР:', 'ВЕРХНІЙ_РЕГІСТР:', 'ВЕЛИКИМИ_БУКВАМИ:', 'БОЛЬШИМИ_БУКВАМИ:', 'UC:' ),
+       'raw'                       => array( '0', 'НЕОБРОБ:', 'НЕОБРАБ:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ПОКАЗАТИ_ЗАГОЛОВОК', 'ПОКАЗАТЬ_ЗАГОЛОВОК', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', 'Н', 'R' ),
+       'newsectionlink'            => array( '1', '__ПОСИЛАННЯ_НА_НОВИЙ_РОЗДІЛ__', '__ССЫЛКА_НА_НОВЫЙ_РАЗДЕЛ__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__БЕЗ_ПОСИЛАННЯ_НА_НОВИЙ_РОЗДІЛ__', '__БЕЗ_ССЫЛКИ_НА_НОВЫЙ_РАЗДЕЛ__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'ПОТОЧНА_ВЕРСІЯ', 'ТЕКУЩАЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'ЗАКОДОВАНА_АДРЕСА:', 'ЗАКОДИРОВАННЫЙ_АДРЕС:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'КОДУВАТИ_МІТКУ', 'КОДИРОВАТЬ_МЕТКУ', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'МІТКА_ПОТОЧНОГО_ЧАСУ', 'ОТМЕТКА_ТЕКУЩЕГО_ВРЕМЕНИ', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'МІТКА_ЛОКАЛЬНОГО_ЧАСУ', 'ОТМЕТКА_МЕСТНОГО_ВРЕМЕНИ', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'НАПРЯМОК_ПИСЬМА', 'НАПРАВЛЕНИЕ_ПИСЬМА', 'DIRECTIONMARK', 'DIRMARK' ),
+       'language'                  => array( '0', '#МОВА:', '#ЯЗЫК:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'МОВА_ВМІСТУ', 'ЯЗЫК_СОДЕРЖАНИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'СТОРІНОК_У_ПРОСТОРІ_НАЗВ:', 'СТРАНИЦ_В_ПРОСТРАНСТВЕ_ИМЁН:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'КІЛЬКІСТЬ_АДМІНІСТРАТОРІВ', 'КОЛИЧЕСТВО_АДМИНИСТРАТОРОВ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'ФОРМАТУВАТИ_ЧИСЛО', 'ФОРМАТИРОВАТЬ_ЧИСЛО', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'ЗАПОВНИТИ_ЛІВОРУЧ', 'ЗАПОЛНИТЬ_СЛЕВА', 'PADLEFT' ),
+       'padright'                  => array( '0', 'ЗАПОВНИТИ_ПРАВОРУЧ', 'ЗАПОЛНИТЬ_СПРАВА', 'PADRIGHT' ),
+       'special'                   => array( '0', 'спеціальна', 'служебная', 'special' ),
+       'defaultsort'               => array( '1', 'СТАНДАРТНЕ_СОРТУВАННЯ:', 'СОРТУВАННЯ:', 'СОРТИРОВКА_ПО_УМОЛЧАНИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ШЛЯХ_ДО_ФАЙЛУ:', 'ПУТЬ_К_ФАЙЛУ:', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'тег', 'мітка', 'метка', 'тэг', 'tag' ),
+       'hiddencat'                 => array( '1', '__ПРИХОВ_КАТ__', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'СТОР_В_КАТ', 'СТОР_У_КАТ', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'РОЗМІР', 'РОЗМІР_СТОРІНКИ', 'РАЗМЕР_СТРАНИЦЫ', 'PAGESIZE' ),
+       'index'                     => array( '1', '__ІНДЕКС__', '__ИНДЕКС__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__БЕЗ_ІНДЕКСУ__', '__БЕЗ_ИНДЕКСА__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'КІЛЬКІСТЬ_У_ГРУПІ', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__СТАТИЧНЕ_ПЕРЕНАПРАВЛЕННЯ__', '__СТАТИЧЕСКОЕ_ПЕРЕНАПРАВЛЕНИЕ__', '__STATICREDIRECT__' ),
+       'protectionlevel'           => array( '1', 'РІВЕНЬ_ЗАХИСТУ', 'УРОВЕНЬ_ЗАЩИТЫ', 'PROTECTIONLEVEL' ),
+       'formatdate'                => array( '0', 'форматдати', 'форматдаты', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'ШЛЯХ', 'ПУТЬ', 'PATH' ),
+       'url_wiki'                  => array( '0', 'ВІКІ', 'ВИКИ', 'WIKI' ),
+       'url_query'                 => array( '0', 'ЗАПИТ', 'ЗАПРОС', 'QUERY' ),
 );
 
 $linkTrail = '/^([a-zабвгґдеєжзиіїйклмнопрстуфхцчшщьєюяёъы“»]+)(.*)$/sDu';
@@ -350,11 +355,11 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Підкреслювати посилання:',
 'tog-justify' => 'Вирівнювати текст по ширині сторінки',
-'tog-hideminor' => 'Ð¥овати незначні редагування у списку останніх змін',
+'tog-hideminor' => 'Ð\9fÑ\80иÑ\85овати незначні редагування у списку останніх змін',
 'tog-hidepatrolled' => 'Приховувати патрульовані редагування у списку нових редагувань',
 'tog-newpageshidepatrolled' => 'Приховувати патрульовані сторінки у списку нових сторінок',
 'tog-extendwatchlist' => 'Розширений список спостереження, що містить усі зміни, а не лише останню',
-'tog-usenewrc' => 'Ð\92икоÑ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¿Ð¾ÐºÑ\80аÑ\89ений Ñ\81пиÑ\81ок Ð¾Ñ\81Ñ\82аннÑ\96Ñ\85 Ð·Ð¼Ñ\96н (JavaScript)',
+'tog-usenewrc' => 'Ð\9dа Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 Ð¾Ñ\81Ñ\82аннÑ\96Ñ\85 Ð·Ð¼Ñ\96н Ñ\82а Ð² Ñ\81пиÑ\81кÑ\83 Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f Ð³Ñ\80Ñ\83пÑ\83ваÑ\82и Ñ\80едагÑ\83ваннÑ\8f (поÑ\82Ñ\80Ñ\96бен JavaScript)',
 'tog-numberheadings' => 'Автоматично нумерувати заголовки',
 'tog-showtoolbar' => 'Показувати панель інструментів (JavaScript)',
 'tog-editondblclick' => 'Редагувати сторінки при подвійному клацанні мишкою (JavaScript)',
@@ -362,17 +367,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Редагувати розділи при клацанні правою кнопкою мишки на заголовку (JavaScript)',
 'tog-showtoc' => 'Показувати зміст (для сторінок з більш ніж трьома заголовками)',
 'tog-rememberpassword' => "Запам'ятати мій обліковий запис для цього браузера (на строк не більше $1 {{PLURAL:$1|дня|днів}})",
-'tog-watchcreations' => 'Додавати створені мною сторінки до мого списку спостереження',
-'tog-watchdefault' => 'Додавати змінені мною сторінки до мого списку спостереження',
-'tog-watchmoves' => 'Додавати перейменовані мною сторінки до мого списку спостереження',
-'tog-watchdeletion' => 'Додавати вилучені мною сторінки до мого списку спостереження',
+'tog-watchcreations' => 'Додавати створені мною сторінки і завантажені мною файли до мого списку спостереження',
+'tog-watchdefault' => 'Додавати змінені мною сторінки та файли до мого списку спостереження',
+'tog-watchmoves' => 'Додавати перейменовані мною сторінки та файли до мого списку спостереження',
+'tog-watchdeletion' => 'Додавати вилучені мною сторінки та файли до мого списку спостереження',
 'tog-minordefault' => 'Спочатку позначати всі зміни незначними',
 'tog-previewontop' => 'Показувати попередній перегляд перед вікном редагування, а не після',
 'tog-previewonfirst' => 'Показувати попередній перегляд під час першого редагування',
 'tog-nocache' => 'Відключити кешування сторінок браузером',
-'tog-enotifwatchlistpages' => 'Повідомляти електронною поштою, коли сторінка з мого списку спостереження змінилася',
+'tog-enotifwatchlistpages' => 'Повідомляти електронною поштою при зміні сторінки або файлу з мого списку спостереження',
 'tog-enotifusertalkpages' => 'Повідомляти електронною поштою про зміну моєї сторінки обговорення',
-'tog-enotifminoredits' => 'Надсилати мені електронного листа навіть при незначних редагуваннях',
+'tog-enotifminoredits' => 'Надсилати мені електронного листа навіть при незначних редагуваннях сторінок та файлів',
 'tog-enotifrevealaddr' => 'Показувати мою поштову адресу в повідомленнях',
 'tog-shownumberswatching' => 'Показувати кількість користувачів, які додали сторінку до свого списку спостереження',
 'tog-oldsig' => 'Існуючий підпис:',
@@ -382,13 +387,12 @@ $messages = array(
 'tog-showjumplinks' => 'Активізувати допоміжні посилання «перейти до»',
 'tog-uselivepreview' => 'Використовувати швидкий попередній перегляд (JavaScript, експериментально)',
 'tog-forceeditsummary' => 'Попереджати, коли не зазначений короткий опис редагування',
-'tog-watchlisthideown' => 'Ð¥овати мої редагування у списку спостереження',
-'tog-watchlisthidebots' => 'Ð¥овати редагування ботів у списку спостереження',
-'tog-watchlisthideminor' => 'Ð¥овати незначні редагування у списку спостереження',
-'tog-watchlisthideliu' => 'ХоваÑ\82и Ñ\80едагÑ\83ваннÑ\8f Ð·Ð°Ñ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в Ñ\83 Ñ\81пиÑ\81кÑ\83 Ñ\81поÑ\81етереження',
-'tog-watchlisthideanons' => 'Ð¥овати редагування анонімів у списку спостереження',
+'tog-watchlisthideown' => 'Ð\9fÑ\80иÑ\85овати мої редагування у списку спостереження',
+'tog-watchlisthidebots' => 'Ð\9fÑ\80иÑ\85овати редагування ботів у списку спостереження',
+'tog-watchlisthideminor' => 'Ð\9fÑ\80иÑ\85овати незначні редагування у списку спостереження',
+'tog-watchlisthideliu' => 'Ð\9fÑ\80иÑ\85оваÑ\82и Ñ\80едагÑ\83ваннÑ\8f Ð·Ð°Ñ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 Ð´Ð¾Ð¿Ð¸Ñ\81Ñ\83ваÑ\87Ñ\96в Ñ\83 Ñ\81пиÑ\81кÑ\83 Ñ\81поÑ\81тереження',
+'tog-watchlisthideanons' => 'Ð\9fÑ\80иÑ\85овати редагування анонімів у списку спостереження',
 'tog-watchlisthidepatrolled' => 'Приховувати патрульовані редагування у списку спостререження',
-'tog-nolangconversion' => 'Відключити перетворення систем письма',
 'tog-ccmeonemails' => 'Надсилати мені копії листів, які я надсилаю іншим користувачам',
 'tog-diffonly' => 'Не показувати вміст сторінки під різницею версій',
 'tog-showhiddencats' => 'Показувати приховані категорії',
@@ -616,6 +620,8 @@ $1',
 'youhavenewmessages' => 'Ви отримали $1 ($2).',
 'newmessageslink' => 'нові повідомлення',
 'newmessagesdifflink' => 'остання зміна',
+'newmessageslinkplural' => '{{PLURAL:$1|нове повідомлення|нові повідомлення}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|остання зміна|останні зміни}}',
 'youhavenewmessagesmulti' => 'Ви отримали нові повідомлення на $1',
 'editsection' => 'ред.',
 'editsection-brackets' => '[$1]',
@@ -712,6 +718,8 @@ $1',
 'cannotdelete' => 'Неможливо вилучити сторінку або файл "$1".
 Можливо, її (його) вже вилучив хтось інший.',
 'cannotdelete-title' => 'Не вдається видалити сторінку «$1»',
+'delete-hook-aborted' => 'Вилучення було скасовано процедурою-перехоплювачем. 
+Ніяких поясненень надано не було.',
 'badtitle' => 'Неприпустима назва',
 'badtitletext' => 'Запитана назва сторінки неправильна, порожня, або неправильно зазначена міжмовна чи міжвікі назва.
 Можливо, в назві використовуються недопустимі символи.',
@@ -741,6 +749,9 @@ $1',
 'filereadonlyerror' => "Неможливо змінити файл «$1» тому, що файловий архів «$2» перебуває в режимі «лише для читання».
 Адміністратор, що заблокував його, залишив таке пояснення: «''$3''».",
 'invalidtitle-knownnamespace' => 'Неприйнятна назва у просторі імен «$2» і текстом «$3»',
+'invalidtitle-unknownnamespace' => 'Неправильний заголовок з невідомим номером простору імен ($1) і текстом: «$2»',
+'exception-nologin' => 'Не виконано вхід',
+'exception-nologin-text' => 'Ця сторінка чи дія потребує, щоб Ви ввійшли до цієї Вікі.',
 
 # Virus scanner
 'virus-badscanner' => "Помилка налаштування: невідомий сканер вірусів: ''$1''",
@@ -837,6 +848,7 @@ $1',
 'invalidemailaddress' => 'Уведена адреса не може бути прийнята, бо вона не відповідає формату адрес електронної пошти.
 Будь ласка, введіть коректну адресу або залиште поле порожнім.',
 'cannotchangeemail' => 'У цій вікі не можна міняти свою адресу ел. пошти.',
+'emaildisabled' => 'Цей сайт не може надіслати електронні листи.',
 'accountcreated' => 'Обліковий запис створено.',
 'accountcreatedtext' => 'Обліковий запис для $1 створено.',
 'createaccount-title' => 'Створення облікового запису для {{SITENAME}}',
@@ -1017,8 +1029,7 @@ $2
 'clearyourcache' => "'''Увага:''' Після збереження слід очистити кеш браузера, щоб побачити зміни.
 * '''Firefox / Safari:''' тримайте ''Shift'', коли натискаєте ''Оновити'', або натисніть ''Ctrl-F5'' чи ''Ctrl-Shift-R'' (''⌘-R'' на Apple Mac)
 * '''Google Chrome:''' натисніть ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Apple Mac)
-* '''Internet Explorer:''' тримайте ''Ctrl'', коли натискаєте ''Оновити'' або натисніть ''Ctrl-F5''
-* '''Konqueror:''' натисніть кнопку ''Оновити'' або клавішу ''F5''
+* '''Internet Explorer:''' тримайте ''Ctrl'', коли натискаєте ''Оновити'', або натисніть ''Ctrl-F5''
 * '''Opera:''' очистіть кеш за допомогою ''Інструменти → Налаштування''",
 'usercssyoucanpreview' => "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий css-файл перед збереженням.",
 'userjsyoucanpreview' => "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий код JavaScript перед збереженням.",
@@ -1118,6 +1129,7 @@ $2
 'edit-no-change' => 'Ваше редагування відхилене, оскільки в тексті не було зроблено змін.',
 'edit-already-exists' => 'Неможливо створити нову сторінку.
 Вона вже існує.',
+'defaultmessagetext' => 'Текст «за замовчування»',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Увага: Ця сторінка містить дуже багато викликів ресурсомістких функцій.
@@ -1133,7 +1145,12 @@ $2
 'parser-template-loop-warning' => 'Виявлена петля у шаблонах: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Перевищене обмеження глибини рекурсії шаблону ($1)',
 'language-converter-depth-warning' => 'Перевищене обмеження глибини мовного конвертора ($1)',
-'parser-unstrip-loop-warning' => 'Виявлено незакритий тег <pre>',
+'node-count-exceeded-category' => 'Сторінки, на яких перевищено лічильник вузлів',
+'node-count-exceeded-warning' => 'Кількість вузлів препроцесора на сторінці перевищила встановлену межу.',
+'expansion-depth-exceeded-category' => 'Сторінки, де перевищено глибину розгортання',
+'expansion-depth-exceeded-warning' => 'На сторінці перевищено межу глибини вкладеності',
+'parser-unstrip-loop-warning' => 'Виявлено незакритий тег (такий, як <pre>)',
+'parser-unstrip-recursion-limit' => 'Перевищено межу вкладеної рекурсії ($1) для парсера.',
 
 # "Undo" feature
 'undo-success' => 'Редагування може бути скасовано.
@@ -1312,7 +1329,7 @@ $1",
 
 # Diffs
 'history-title' => '$1: Історія змін',
-'difference-title' => '$1: Відмінності між версіями',
+'difference-title' => 'Відмінності між версіями «$1»',
 'difference-title-multipage' => 'Різниця між сторінками «$1» та «$2»',
 'difference-multipage' => '(Різниця між сторінками)',
 'lineno' => 'Рядок $1:',
@@ -1592,6 +1609,7 @@ $1",
 'right-writeapi' => 'Використання API для запису',
 'right-delete' => 'Вилучення сторінок',
 'right-bigdelete' => 'Вилучення сторінок з великою історією',
+'right-deletelogentry' => 'Вилучення та відновлення окремих записів журналу',
 'right-deleterevision' => 'Вилучення і відновлення окремих версій сторінок',
 'right-deletedhistory' => 'Перегляд історії вилучених сторінок без перегляду вилученого тексту',
 'right-deletedtext' => 'перегляд вилученого тексту та змін між вилученими версіями',
@@ -1599,7 +1617,7 @@ $1",
 'right-undelete' => 'Відновлення сторінок',
 'right-suppressrevision' => 'Перегляд і відновлення версій, прихованих від адміністраторів',
 'right-suppressionlog' => 'Перегляд приватних журналів',
-'right-block' => 'Ð\91локÑ\83ваннÑ\8f Ñ\96нÑ\88иÑ\85 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в Ð²Ñ\96д Ñ\80едагÑ\83ванÑ\8c',
+'right-block' => 'Ð\97абоÑ\80она Ñ\80едагÑ\83ванÑ\8c Ð´Ð»Ñ\8f Ñ\96нÑ\88иÑ\85 Ð´Ð¾Ð¿Ð¸Ñ\81Ñ\83ваÑ\87Ñ\96в',
 'right-blockemail' => 'Блокування користувачам надсилання електронної пошти',
 'right-hideuser' => 'Блокування імені користувача і приховування його',
 'right-ipblock-exempt' => 'Уникнення блокування за IP-адресою, автоблокування і блокування діапазонів',
@@ -1658,7 +1676,7 @@ $1",
 'action-undelete' => 'відновлення цієї сторінки',
 'action-suppressrevision' => 'перегляд і відновлення цієї прихованої версії',
 'action-suppressionlog' => 'перегляд цього приватного журналу',
-'action-block' => 'блокÑ\83ваннÑ\8f Ñ\86Ñ\8cого ÐºÐ¾Ñ\80иÑ\81Ñ\82увача',
+'action-block' => 'блокÑ\83ваннÑ\8f Ñ\86Ñ\8cого Ð´Ð¾Ð¿Ð¸Ñ\81увача',
 'action-protect' => 'зміну рівня захисту цієї сторінки',
 'action-rollback' => 'швидко відкотити редагування останнього користувача, що змінював певну сторінку',
 'action-import' => 'імпорт цієї сторінки з іншої вікі',
@@ -1704,7 +1722,7 @@ $1",
 'rc_categories' => 'Тільки з категорій (разділювач «|»)',
 'rc_categories_any' => 'Будь-який',
 'rc-change-size' => '$1',
-'rc-change-size-new' => 'Розмір після зміни: {{PLURAL:$1|байт|байти|байтів}}',
+'rc-change-size-new' => 'Розмір після зміни: $1 {{PLURAL:$1|байт|байти|байтів}}',
 'newsectionsummary' => '/* $1 */ нова тема',
 'rc-enhanced-expand' => 'Показати деталі (потрібен JavaScript)',
 'rc-enhanced-hide' => 'Сховати деталі',
@@ -1745,11 +1763,11 @@ $1",
 Завантаження відображаються в [[Special:Log/upload|журналі завантажень]], вилучення – у [[Special:Log/delete|журналі вилучень]].
 
 Для вставки зображень в статті можна використовувати такі рядки:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:Назва_зображення.jpg<nowiki>]]</nowiki></tt>''', щоб використати повну версію файлу
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:Назва_зображення.png|200px|thumb|left|Підпис під зображенням<nowiki>]]</nowiki></tt>''', щоб використати зображення у рамці зліва сторінки з підписом під зображенням
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:Назва_зображення.jpg<nowiki>]]</nowiki></code>''', щоб використати повну версію файлу
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:Назва_зображення.png|200px|thumb|left|Підпис під зображенням<nowiki>]]</nowiki></code>''', щоб використати зображення у рамці зліва сторінки з підписом під зображенням
 
 для інших медіа-файлів використовуйте рядок виду:
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}:Назва_файлу.ogg<nowiki>]]</nowiki></tt>'''.",
+* '''<code><nowiki>[[</nowiki>{{ns:media}}:Назва_файлу.ogg<nowiki>]]</nowiki></code>'''.",
 'upload-permitted' => 'Дозволені типи файлів: $1.',
 'upload-preferred' => 'Бажані типи файлів: $1.',
 'upload-prohibited' => 'Заборонені типи файлів: $1.',
@@ -1793,18 +1811,18 @@ $1",
 'largefileserver' => 'Розмір файлу більший за максимальнодозволений.',
 'emptyfile' => 'Завантажений вами файл ймовірно порожній. Можливо, це сталося через помилку при введенні імені файлу. Будь-ласка, перевірте, чи справді ви бажаєте звантажити цей файл.',
 'windows-nonascii-filename' => 'Ця вікі не підтримує імена файлів зі спеціальними символами.',
-'fileexists' => "Файл з такою назвою вже існує.
-Будь ласка, перевірте '''<tt>[[:$1]]</tt>''', якщо ви не впевнені, чи хочете замінити його.
-[[$1|thumb]]",
-'filepageexists' => "Сторінка опису цього файлу вже створена як '''<tt>[[:$1]]</tt>''', але файлу з такою назвою немає. Уведений опис не з'явиться на сторінці опису зображення. Щоб додати новий опис, вам доведеться змінити його вручну. [[$1|thumb]]",
-'fileexists-extension' => "Існує файл зі схожою назвою: [[$2|thumb]]
-* Назва завантаженого файлу: '''<tt>[[:$1]]</tt>'''
-* Назва існуючого файлу: '''<tt>[[:$2]]</tt>'''
-Будьте ласкаві, виберіть іншу назву.",
-'fileexists-thumbnail-yes' => "Можливо, файл є зменшеною копією (мініатюрою). [[$1|thumb]]
-Будь ласка, перевірте файл '''<tt>[[:$1]]</tt>'''.
-Якщо вказаний файл є тим самим зображенням, не варто окремо завантажувати його зменшену копію.",
-'file-thumbnail-no' => "Назва файлу починається на '''<tt>$1</tt>'''.
+'fileexists' => 'Файл з такою назвою вже існує.
+Будь ласка, перевірте <strong>[[:$1]]</strong>, якщо ви не впевнені, чи хочете замінити його.
+[[$1|thumb]]',
+'filepageexists' => "Сторінка опису цього файлу вже створена як <strong>[[:$1]]</strong>, але файлу з такою назвою немає. Уведений опис не з'явиться на сторінці опису зображення. Щоб додати новий опис, вам доведеться змінити його вручну. [[$1|thumb]]",
+'fileexists-extension' => 'Існує файл зі схожою назвою: [[$2|thumb]]
+* Назва завантаженого файлу: <strong>[[:$1]]</strong>
+* Назва існуючого файлу: <strong>[[:$2]]</strong>
+Будьте ласкаві, виберіть іншу назву.',
+'fileexists-thumbnail-yes' => 'Можливо, файл є зменшеною копією (мініатюрою). [[$1|thumb]]
+Будь ласка, перевірте файл <strong>[[:$1]]</strong>.
+Якщо вказаний файл є тим самим зображенням, не варто окремо завантажувати його зменшену копію.',
+'file-thumbnail-no' => "Назва файлу починається на <strong>$1</strong>.
 Можливо, це зменшена копія зображення ''(мініатюра)''.
 Якщо у вас є це зображення в повному розмірі, завантажте його, інакше змініть назву файлу.",
 'fileexists-forbidden' => 'Файл з такою назвою вже існує і не може бути перезаписаний.
@@ -1897,6 +1915,7 @@ $1',
 'backend-fail-internal' => 'Сталася невідома помилка у сховищі рушія "$1".',
 'backend-fail-contenttype' => 'Не вдалося визначити тип вмісту файла, щоб зберегти його в "$1".',
 'backend-fail-batchsize' => 'Серверна частина отримала блок із $1 {{PLURAL:$1|файлової операції|файлових операцій}}; обмеження складає $2 {{PLURAL:$2|файлову операцію|файлові операції|файлових операцій}}.',
+'backend-fail-usable' => 'Файл $1 не може бути записано через недостатні повноваження чи відсутність каталогів (контейнерів).',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не вдалося підключитися до бази даних журналу для сховища «$1».',
@@ -1911,6 +1930,7 @@ $1',
 'lockmanager-fail-releaselock' => 'Не вдалось розблокувати "$1".',
 'lockmanager-fail-db-bucket' => "Не вдається зв'язатися з достатньою кількістю баз блокувань в сегменті $1.",
 'lockmanager-fail-db-release' => 'Не вдалось зняти блокування бази даних $1.',
+'lockmanager-fail-svr-acquire' => 'Не вдалося одержати блокування на сервері $1.',
 'lockmanager-fail-svr-release' => 'Не вдалось зняти блокування на сервері $1.',
 
 # ZipDirectoryReader
@@ -2021,6 +2041,10 @@ $1',
 Додаткову інформацію можна знайти на [$2 сторінці опису файлу].',
 'sharedupload-desc-here' => 'Цей файл з $1 і може використовуватися в інших проектах.
 Далі наведена інформація з його [$2 сторінки опису].',
+'sharedupload-desc-edit' => 'Цей файл з $1 і може використовуватися в інших проектах. 
+Його опис можна відредагувати [$2 на відповідній сторінці тут].',
+'sharedupload-desc-create' => 'Цей файл з $1 і може використовуватися в інших проектах. 
+Його опис можна зробити [$2 на відповідній сторінці тут].',
 'filepage-nofile' => 'Не існує файлу з такою назвою.',
 'filepage-nofile-link' => 'Не існує файлу з такою назвою, але ви можете [$1 завантажити його].',
 'uploadnewversion-linktext' => 'Завантажити нову версію цього файлу',
@@ -2061,7 +2085,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'Пошук по MIME',
-'mimesearch-summary' => 'Ця сторінка дозволяє вибирати файли за їх MIME-типом. Формат вводу: тип_вмісту/підтип, наприклад <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Ця сторінка дозволяє вибирати файли за їх MIME-типом. Формат вводу: тип_вмісту/підтип, наприклад <code>image/jpeg</code>.',
 'mimetype' => 'MIME-тип:',
 'download' => 'завантажити',
 
@@ -2156,11 +2180,11 @@ $1',
 'wantedfiletext-nocat' => 'Наступні файли використовують, але вони не існують. У цей список можуть помилково потрапити файли, що знаходяться на зовнішніх сховищах. Такі хибні моменти помічаються <del>перекреслюванням</del>.',
 'wantedtemplates' => 'Необхідні шаблони',
 'mostlinked' => 'Сторінки, на які найбільше посилань',
-'mostlinkedcategories' => 'Ð\9aаÑ\82егоÑ\80Ñ\96Ñ\97, Ð½Ð° Ñ\8fкÑ\96 Ð½Ð°Ð¹Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ð¾Ñ\81иланÑ\8c',
+'mostlinkedcategories' => 'Ð\9dайбÑ\96лÑ\8cÑ\88Ñ\96 ÐºÐ°Ñ\82егоÑ\80Ñ\96Ñ\97',
 'mostlinkedtemplates' => 'Найуживаніші шаблони',
 'mostcategories' => 'Статті з найбільшою кількістю категорій',
 'mostimages' => 'Найуживаніші зображення',
-'mostrevisions' => 'СÑ\82аÑ\82Ñ\82Ñ\96 Ð· Ð½Ð°Ð¹Ð±Ñ\96лÑ\8cÑ\88оÑ\8e ÐºÑ\96лÑ\8cкÑ\96Ñ\81Ñ\82Ñ\8e Ñ\80едакÑ\86Ñ\96й',
+'mostrevisions' => 'СÑ\82аÑ\82Ñ\82Ñ\96 Ð· Ð½Ð°Ð¹Ð±Ñ\96лÑ\8cÑ\88оÑ\8e ÐºÑ\96лÑ\8cкÑ\96Ñ\81Ñ\82Ñ\8e Ñ\80едагÑ\83ванÑ\8c',
 'prefixindex' => 'Покажчик за початком назв сторінок',
 'prefixindex-namespace' => 'Усі сторінки з префіксом (простір назв $1)',
 'shortpages' => 'Короткі статті',
@@ -2214,6 +2238,7 @@ $1',
 Ви можете відфільтрувати результати за типом журналу, іменем користувача (враховується регістр) або зазначеною сторінкою (також враховується регістр).',
 'logempty' => 'В журналі немає подібних записів.',
 'log-title-wildcard' => 'Знайти заголовки, що починаються з цих символів',
+'showhideselectedlogentries' => 'Показати/приховати виділені записи журналу',
 
 # Special:AllPages
 'allpages' => 'Усі сторінки',
@@ -2234,6 +2259,7 @@ $1',
 'allpages-hide-redirects' => 'Сховати перенаправлення',
 
 # SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Ви переглядаєте кешовану версію сторінки, яка могла бути оновлена $1 тому.',
 'cachedspecial-viewing-cached-ts' => 'Ви переглядаєте кешовану версію сторінки, яка могла втратити актуальність',
 'cachedspecial-refresh-now' => 'Показати останні',
 
@@ -2258,7 +2284,7 @@ $1',
 'linksearch-ok' => 'Знайти',
 'linksearch-text' => 'Можна використовувати підстановочні символи (шаблони), наприклад, "*.wikipedia.org".
 Необхідний домен якнайменше верхнього рівня, наприклад "*.org"<br />
-Підтримувані протоколи: <tt>$1</tt> (не додавайте жоден з них у вашому пошуку)',
+Підтримувані протоколи: <code>$1</code> (не додавайте жоден з них у вашому пошуку)',
 'linksearch-line' => 'Посилання на $1 із $2',
 'linksearch-error' => 'Підстановочні знаки можуть використовуватися лише на початку адрес.',
 
@@ -2291,8 +2317,8 @@ $1',
 'listgrouprights-rights' => 'Права',
 'listgrouprights-helppage' => 'Help:Права користувачів',
 'listgrouprights-members' => '(список членів)',
-'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
-'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
+'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <code>($2)</code></span>',
+'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <code>($2)</code></span>',
 'listgrouprights-addgroup' => 'може додавати в {{PLURAL:$2|групу|групи}}: $1',
 'listgrouprights-removegroup' => 'може виключати з {{PLURAL:$2|групи|груп}}: $1',
 'listgrouprights-addgroup-all' => 'може додавати до всіх груп',
@@ -2359,7 +2385,7 @@ $1',
 'notvisiblerev' => 'Версія була вилучена',
 'watchnochange' => 'За вказаний період в статтях з списку спостереження нічого не змінено.',
 'watchlist-details' => 'У вашому списку спостереження $1 {{PLURAL:$1|сторінка|сторінки|сторінок}} (не враховуючи сторінок обговорення).',
-'wlheader-enotif' => '* Ð\97вÑ\96Ñ\81Ñ\82ка ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð¿Ð¾Ñ\88Ñ\82оÑ\8e Ð²Ð²Ñ\96мкнена.',
+'wlheader-enotif' => '* Ð¡Ð¿Ð¾Ð²Ñ\96Ñ\89еннÑ\8f ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð¿Ð¾Ñ\88Ñ\82оÑ\8e Ð²Ð²Ñ\96мкнено.',
 'wlheader-showupdated' => "* Сторінки, що змінилися після вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
 'watchmethod-recent' => 'перегляд останніх редагувань статей за якими ведеться спостереження',
 'watchmethod-list' => 'перегляд статей за якими ведеться спостереження',
@@ -2418,7 +2444,7 @@ $UNWATCHURL
 'deletepage' => 'Вилучити сторінку',
 'confirm' => 'Підтвердження',
 'excontent' => 'зміст: «$1»',
-'excontentauthor' => 'змÑ\96Ñ\81Ñ\82 Ð±Ñ\83в: Â«$1» (Ñ\94диним Ð°Ð²Ñ\82оÑ\80ом Ð±Ñ\83в [[Special:Contributions/$2|$2]])',
+'excontentauthor' => 'змÑ\96Ñ\81Ñ\82 Ð±Ñ\83в: Â«$1» (Ñ\94диний Ð°Ð²Ñ\82оÑ\80: [[Special:Contributions/$2|$2]])',
 'exbeforeblank' => 'зміст до очистки: «$1»',
 'exblank' => 'стаття була порожньою',
 'delete-confirm' => 'Вилучення «$1»',
@@ -2452,6 +2478,8 @@ $UNWATCHURL
 'rollback' => 'Відкинути редагування',
 'rollback_short' => 'Відкинути',
 'rollbacklink' => 'відкинути',
+'rollbacklinkcount' => 'скасування $1 {{PLURAL:$1|редагування|редагувань|редагувань}}',
+'rollbacklinkcount-morethan' => 'скасування більш, ніж $1 {{PLURAL:$1|редагування|редагувань|редагувань}}',
 'rollbackfailed' => 'Відкинути зміни не вдалося',
 'cantrollback' => 'Неможливо відкинути редагування, останній, хто редагував, є єдиним автором цієї сторінки.',
 'alreadyrolled' => 'Неможливо відкинути останні редагування [[:$1]], зроблені [[User:$2|$2]] ([[User talk:$2|обговорення]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); хтось інший уже змінив чи відкинув редагування цієї статті.
@@ -2597,8 +2625,8 @@ $1',
 'contribsub2' => 'Внесок $1 ($2)',
 'nocontribs' => 'Редагувань, що задовольняють заданим умовам не знайдено.',
 'uctop' => ' (остання)',
-'month' => 'Ð\92Ñ\96д Ð¼Ñ\96Ñ\81Ñ\8fÑ\86Ñ\8f (Ñ\96 Ñ\80анÑ\96Ñ\88е):',
-'year' => 'Ð\92Ñ\96д Ñ\80окÑ\83 (Ñ\96 Ñ\80анÑ\96Ñ\88е):',
+'month' => 'Ð\94о Ð¼Ñ\96Ñ\81Ñ\8fÑ\86Ñ\8f (вклÑ\8eÑ\87но):',
+'year' => 'Ð\94о Ñ\80окÑ\83 (вклÑ\8eÑ\87но):',
 
 'sp-contributions-newbies' => 'Показати лише внесок з нових облікових записів',
 'sp-contributions-newbies-sub' => 'Внесок новачків',
@@ -3135,15 +3163,10 @@ The wiki server can't provide data in a format your client can read.",
 # Info page
 'pageinfo-title' => 'Інформація про " $1 "',
 'pageinfo-header-edits' => 'Редагування',
-'pageinfo-header-watchlist' => 'Список спостереження',
-'pageinfo-header-views' => 'Перегляди',
-'pageinfo-subjectpage' => 'Сторінка',
-'pageinfo-talkpage' => 'Сторінка обговорення',
+'pageinfo-views' => 'Кількість переглядів',
 'pageinfo-watchers' => 'Кількість спостерігачів',
 'pageinfo-edits' => 'Кількість редагувань',
 'pageinfo-authors' => 'Кількість унікальних авторів',
-'pageinfo-views' => 'Кількість переглядів',
-'pageinfo-viewsperedit' => 'Переглядів на редагування',
 
 # Skin names
 'skinname-standard' => 'Стандартне',
@@ -4012,6 +4035,8 @@ MediaWiki поширюється в надії, що вона буде кори
 'version-software' => 'Установлене програмне забезпечення',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версія',
+'version-entrypoints' => 'URL-адреса точки входу',
+'version-entrypoints-header-entrypoint' => 'Точка входу',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
@@ -4165,7 +4190,7 @@ MediaWiki поширюється в надії, що вона буде кори
 
 # API errors
 'api-error-badaccess-groups' => 'Вам не дозволено завантажувати файли до цього вікіпроекту.',
-'api-error-badtoken' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\96Ñ\88нÑ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ð¿Ð¾Ð³Ð°Ð½Ð¸Ð¹ Ð·Ð½Ð°Ðº.',
+'api-error-badtoken' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\96Ñ\88нÑ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ð½ÐµÐºÐ¾Ñ\80екÑ\82ний Ñ\82окен.',
 'api-error-copyuploaddisabled' => 'На цьому сервері вимкнене завантаження за URL-адресою.',
 'api-error-duplicate' => 'Вже {{PLURAL:$1|існує  [$2 інший файл]|існують [$2 інші файли]}} з таким самим вмістом.',
 'api-error-duplicate-archive' => 'Раніше на сайті вже {{PLURAL:$1|був [$2 файл]|були [$2 файли]}} з ідентичним вмістом, але {{PLURAL:$1|був|були}} вилучені.',
@@ -4174,9 +4199,12 @@ MediaWiki поширюється в надії, що вона буде кори
 'api-error-empty-file' => 'Файл, який ви надіслали, порожній.',
 'api-error-emptypage' => 'Створення нової порожньої сторінки неприпустиме.',
 'api-error-fetchfileerror' => 'Внутрішня помилка: щось пішло не так під час отримання файлу.',
+'api-error-fileexists-forbidden' => 'Файл з назвою «$1» вже існує і його не можна перезаписати.',
+'api-error-fileexists-shared-forbidden' => 'Файл з назвою «$1» вже існує в сховищі спільних файлів, його не можна перезаписати.',
 'api-error-file-too-large' => 'Файл, який ви надіслали, завеликий.',
 'api-error-filename-tooshort' => 'Назва файлу занадто коротка.',
 'api-error-filetype-banned' => 'Цей тип файлів заборонений.',
+'api-error-filetype-banned-type' => '$1 — {{PLURAL:$4|недозволений тип файлів|недозволені типи файлів}}. {{PLURAL:$3|Дозволений тип файлів|Дозволені типи файлів}}: $2.',
 'api-error-filetype-missing' => 'У цього файла відсутнє розширення.',
 'api-error-hookaborted' => 'Зміну, що Ви намагалися зробити, відкинуто обробником.',
 'api-error-http' => 'Внутрішня помилка: Не вдається підключитися до сервера.',
index 0dc37af..b726e80 100644 (file)
  * @author Chris H
  * @author Istabani
  * @author Meno25
+ * @author Muhammad Shuaib
  * @author O.bangash
  * @author Rachitrali
  * @author Reedy
  * @author Wisesabre
  * @author ZxxZxxZ
  * @author לערי ריינהארט
+ * @author زكريا
  * @author سمرقندی
  * @author محبوب عالم
  */
@@ -51,7 +53,7 @@ $messages = array(
 'tog-hidepatrolled' => 'حالیہ تبدیلیوں میں گشتی ترمیمات چُھپاؤ',
 'tog-newpageshidepatrolled' => 'جدید صفحاتی فہرست میں گشتی صفحات چُھپاؤ',
 'tog-extendwatchlist' => 'زیرِنظرفہرست کو پھیلاؤ تاکہ اِس میں تمام ترمیمات نظر آئیں، نہ کہ صرف حالیہ ترین',
-'tog-usenewrc' => 'افزودہ حالیہ تبدیلیاں استعمال کرو (JavaScript چاہئے ہوگا)',
+'tog-usenewrc' => 'افزودہ حالیہ تبدیلیاں استعمال کریں (JavaScript درکار ہوگا)',
 'tog-numberheadings' => 'سرخیوں کو خود نمبر دو',
 'tog-showtoolbar' => 'تدوینی اوزاردان دکھاؤ ( JavaScript چاہئے)',
 'tog-editondblclick' => 'طقین پر صفحات کی ترمیم (JavaScript چاہئے)',
@@ -164,6 +166,7 @@ $messages = array(
 'category-subcat-count' => '{{PLURAL:$2|اِس زمرہ میں صرف درج ذیل ذیلی زمرہ ہے.|اِس زمرہ میں درج ذیل {{PLURAL:$1|ذیلی زمرہ|$1 ذیلی زمرہ جات}}, کل $2 میں سے.}}',
 'category-subcat-count-limited' => 'اِس زمرہ میں درج ذیل {{PLURAL:$1|ذیلی زمرہ ہے|$1 ذیلی زمرہ جات ہیں}}.',
 'listingcontinuesabbrev' => '۔جاری',
+'noindex-category' => 'غیر مندرج صفحات',
 
 'about' => 'تعارف',
 'article' => 'صفحۂ مشمول',
@@ -935,6 +938,7 @@ HTML tags جانچئے.',
 'recentchanges-label-newpage' => 'اِس ترمیم نے نیا صفحہ تخلیق کردیا',
 'recentchanges-label-minor' => 'یہ ایک معمولی ترمیم ہے',
 'recentchanges-label-bot' => 'یہ ایک روبالہ سے سرانجام شدہ ترمیم ہے',
+'recentchanges-label-unpatrolled' => 'اس ترمیم کی اب تک مراجعت نہیں کی گئی',
 'rcnote' => "درج ذیل گزشتہ {{PLURAL:$2|دِن|'''$2''' ایام}} میں ہونے والی {{PLURAL:$1|'''ایک''' تبدیلی ہے|آخری '''$1''' تبدیلیاں ہیں}}، $5، $4.",
 'rcnotefrom' => "ذیل میں '''$2''' سے کی گئی تبدیلیاں ہیں ('''$1''' تبدیلیاں دکھائی جارہی ہیں)۔",
 'rclistfrom' => '$1 سےنئی تبدیلیاں دکھانا شروع کریں',
@@ -942,6 +946,7 @@ HTML tags جانچئے.',
 'rcshowhidebots' => 'خودکار صارف $1',
 'rcshowhideliu' => 'داخل شدہ صارف $1',
 'rcshowhideanons' => 'گمنام صارف $1',
+'rcshowhidepatr' => '$1 مراجعت شدہ ترامیم',
 'rcshowhidemine' => 'ذاتی ترامیم $1',
 'rclinks' => 'آخری $2 روز میں ہونے والی $1 تبدیلیوں کا مشاہدہ کریں<br />$3',
 'diff' => 'فرق',
@@ -959,6 +964,9 @@ HTML tags جانچئے.',
 'recentchangeslinked-feed' => 'متعلقہ تبدیلیاں',
 'recentchangeslinked-toolbox' => 'متعلقہ تبدیلیاں',
 'recentchangeslinked-title' => '"$1" سے متعلقہ تبدیلیاں',
+'recentchangeslinked-summary' => 'یہ ان تبدیلیوں کی فہرست ہے جو حال ہی میں کسی مخصوص صفحہ سے مربوط صفحات (یا مخصوص زمرہ کے اراکین) میں کی گئی ہیںـ 
+
+[[SpecialWatchlist | آپ کی زیر نظر فہرست]] میں یہ صفحات متجل (bold) نظر آئیں گےـ',
 'recentchangeslinked-page' => 'صفحۂ منصوبہ دیکھئے',
 
 # Upload
@@ -988,18 +996,19 @@ HTML tags جانچئے.',
 * مندرجہ بالا رموز آپ  انگریزی میں بھی درج کرسکتے ہیں، یعنی
 <nowiki>[[Image:File name|Alt.text]]</nowiki>
 * ملف کے ساتھ براہ راست رابطہ کیلیے
-کی طرز میں ربط استعمال کیجیۓ۔ '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''
+کی طرز میں ربط استعمال کیجیۓ۔ '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''
 * ملف کا نام ؛ حرف ابجد کے لیۓ حساس ہے لہذا اگر زبراثقال کرتے وقت ملف کا نام -- name:JPG  ہے اور آپ رابطہ رکھتے وقت name:jpg یــا Name:jpg رکھتے ہیں تو ربط کام نہیں کرے گا",
 'uploadlog' => 'نوشتۂ زبراثقال (اپ لوڈ لاگ)',
 'uploadlogpage' => 'نوشتۂ زبراثقال (اپ لوڈ لاگ)',
 'uploadlogpagetext' => 'درج ذیل میں حالیہ زبراثقال (اپ لوڈ) کی گئی املاف (فائلوں) کی فہرست دی گئی ہے۔',
 'filedesc' => 'خلاصہ',
 'fileuploadsummary' => 'خلاصہ :',
+'filesource' => 'ذرائع',
 'uploadedfiles' => 'زبراثقال ملف (فائل اپ لوڈ)',
 'ignorewarning' => 'انتباہ نظرانداز کرتے ہوۓ بہرصورت ملف (فائل) کو محفوظ کرلیا جاۓ۔',
 'ignorewarnings' => 'ہر انتباہ نظرانداز کردیا جاۓ۔',
 'badfilename' => 'ملف (فائل) کا نام "$1" ، تبدیل کردیا گیا۔',
-'fileexists' => "اس نام سے ایک ملف (فائل) پہلے ہی موجود ہے، اگر آپ کو یقین نہ ہو کہ اسے حذف کردیا جانا چاہیۓ تو براہ کرم  '''<tt>[[:$1]]</tt>''' کو ایک نظر دیکھ لیجیۓ۔ [[$1|thumb]]",
+'fileexists' => 'اس نام سے ایک ملف (فائل) پہلے ہی موجود ہے، اگر آپ کو یقین نہ ہو کہ اسے حذف کردیا جانا چاہیۓ تو براہ کرم  <strong>[[:$1]]</strong> کو ایک نظر دیکھ لیجیۓ۔ [[$1|thumb]]',
 'uploadwarning' => 'انتباہ بہ سلسلۂ زبراثقال',
 'savefile' => 'فائل محفوظ کریں',
 'uploadedimage' => 'زبراثقال (اپ لوڈ) براۓ "[[$1]]"',
@@ -1045,6 +1054,7 @@ HTML tags جانچئے.',
 'statistics-header-users' => 'ارکان کے اعداد و شمار',
 
 'disambiguations' => 'ضد ابہام صفحات',
+'disambiguationspage' => 'سانچہ:ضدابہام',
 
 'doubleredirects' => 'دوہرے متبادل ربط',
 
@@ -1223,6 +1233,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'nolinkshere' => "'''[[:$1]]''' سے کوئی روابط نہیں۔",
 'isredirect' => 'لوٹایا گیا صفحہ',
 'isimage' => 'ربطِ ملف',
+'whatlinkshere-links' => 'روابط',
 'whatlinkshere-hideredirs' => 'رجوع مکررات $1',
 'whatlinkshere-hidelinks' => 'روابط $1',
 'whatlinkshere-hideimages' => 'روابطِ تصویر $1',
@@ -1339,6 +1350,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'tooltip-diff' => 'دیکھئے کہ اپنے متن میں کیا تبدیلیاں کیں',
 'tooltip-compareselectedversions' => 'اِس صفحہ کی دو منتخب نظرثانیوں میں فرق دیکھئے',
 'tooltip-watch' => 'اِس صفحہ کو اپنی زیرِنظرفہرست میں شامل کریں',
+'tooltip-undo' => "''استرجع'' اس ترمیم کو پچھلی ترمیم کے جانب واپس کردیگا اور نمائشی انداز میں خانہ ترمیم کھول دے گا۔ آپ مختصراً سبب بیان کرنے کے بھی مجاز ہونگے۔",
 'tooltip-summary' => 'مختصر خلاصہ درج کریں',
 
 # Attribution
@@ -1352,6 +1364,10 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'previousdiff' => '← پُرانی تدوین',
 'nextdiff' => 'صفحہ کا نام:',
 
+# Media information
+'file-nohires' => 'اس سے بڑی تصمیم دستیاب نہیں۔',
+'show-big-image' => 'مکمل تصمیم',
+
 # Special:NewFiles
 'newimages' => 'نئی فائلوں کی گیلری',
 'showhidebots' => '($1 بوٹ)',
@@ -1392,6 +1408,34 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchlisttools-edit' => 'زیرِنظرفہرست دیکھیں اور تدوین کریں',
 'watchlisttools-raw' => 'خام زیرِنظرفہرست تدوین کریں',
 
+# Iranian month names
+'iranian-calendar-m1' => 'فروردین',
+'iranian-calendar-m2' => 'اردیبهشت',
+'iranian-calendar-m3' => 'خرداد',
+'iranian-calendar-m4' => 'تیر',
+'iranian-calendar-m5' => 'مرداد',
+'iranian-calendar-m6' => 'شهریور',
+'iranian-calendar-m7' => 'مهر',
+'iranian-calendar-m8' => 'آبان',
+'iranian-calendar-m9' => 'آذر',
+'iranian-calendar-m10' => 'دی',
+'iranian-calendar-m11' => 'بهمن',
+'iranian-calendar-m12' => 'اسفند',
+
+# Hijri month names
+'hijri-calendar-m1' => 'محرم',
+'hijri-calendar-m2' => 'صفر',
+'hijri-calendar-m3' => 'ربیع الاول',
+'hijri-calendar-m4' => 'ربیع الثانی',
+'hijri-calendar-m5' => 'جمادی الاول',
+'hijri-calendar-m6' => 'جمادی الثانی',
+'hijri-calendar-m7' => 'رجب',
+'hijri-calendar-m8' => 'شعبان',
+'hijri-calendar-m9' => 'رمضان',
+'hijri-calendar-m10' => 'شوال',
+'hijri-calendar-m11' => 'ذوالقعدہ',
+'hijri-calendar-m12' => 'ذوالحجہ',
+
 # Special:Version
 'version' => 'ورژن',
 
index 068a010..1aa0f86 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Uzbek (Oʻzbek)
+/** Uzbek (oʻzbekcha)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -11,7 +11,9 @@
  * @author Behzod Saidov <behzodsaidov@gmail.com>
  * @author Casual
  * @author Lyncos
+ * @author Sociologist
  * @author Urhixidur
+ * @author Xexdof
  */
 
 $fallback8bitEncoding = 'windows-1252';
@@ -50,8 +52,26 @@ $namespaceAliases = array(
 $linkTrail = '/^([a-zʻʼ“»]+)(.*)$/sDu';
 
 $messages = array(
+# User preference toggles
+'tog-hideminor' => 'Yangi oʻzgarishlardagi kichik tahrirlani yashir',
+'tog-rememberpassword' => 'Hisob ma’lumotlarini ushbu kompyuterda eslab qolish (eng ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
+'tog-watchcreations' => 'Men yaratgan sahifalarni va yuklagan fayllarni kuzatuv roʻyxatimga qoʻsh',
+'tog-watchdefault' => 'Men tahrirlagan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
+'tog-watchmoves' => 'Men koʻchirgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
+'tog-watchdeletion' => 'Men yoʻqotgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
+'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-oldsig' => 'Mavjud imzo:',
+'tog-fancysig' => 'Imzoni wikimatn sifatida qara (avtomatik ishoratsiz)',
+'tog-ccmeonemails' => 'Men boshqa foydalanuvchilarga yuborayotgan xatnig nusxasi oʻzimning e-pochtamga ham yuborilsin',
+'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsat',
+
 'underline-always' => 'Har doim',
 'underline-never' => 'Hech qachon',
+'underline-default' => 'Brauzer moslamari boʻyicha',
+
+# Font style option in Special:Preferences
+'editfont-default' => 'Brauzer moslamari boʻyicha',
 
 # Dates
 'sunday' => 'Yakshanba',
@@ -111,6 +131,7 @@ $messages = array(
 'subcategories' => 'Ostturkumlar',
 'category-empty' => "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
 'hidden-categories' => '{{PLURAL:$1|Yashirin turkum|Yashirin turkumlar}}',
+'hidden-category-category' => 'Yashirin turkumlar',
 'category-subcat-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta ostturkum mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|ostturkum|$1 ostturkumlar}}, hammasi boʻlib $2 ta ostturkum mavjud.}}',
 'category-article-count' => '{{PLURAL:$2|Ushbu turkumda faqat bitta sahifa mavjud.|Ushbu turkumda quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}}, hammasi boʻlib $2 ta sahifa mavjud.}}',
 'listingcontinuesabbrev' => 'davomi',
@@ -129,8 +150,10 @@ $messages = array(
 # Cologne Blue skin
 'qbedit' => 'Tahrirlash',
 'qbspecialpages' => 'Maxsus sahifalar',
+'faq' => 'TSS',
 
 # Vector skin
+'vector-action-addsection' => 'Mavzuni qoʻsh',
 'vector-action-delete' => 'O‘chirish',
 'vector-action-move' => 'Ko‘chirish',
 'vector-view-create' => 'Yarat',
@@ -161,6 +184,7 @@ $messages = array(
 'editthispage' => 'Sahifani tahrirlash',
 'create-this-page' => 'Bu sahifani yarat',
 'delete' => 'O‘chirish',
+'deletethispage' => 'Bu sahifani oʻchir',
 'protect' => 'Himoyalash',
 'protect_change' => 'o‘zgartirish',
 'protectthispage' => 'Ushbu sahifani himoyalash',
@@ -190,6 +214,7 @@ $messages = array(
 'aboutsite' => '{{SITENAME}} haqida',
 'aboutpage' => 'Project:Haqida',
 'copyright' => 'Kontent $1 ostidadir.',
+'copyrightpage' => '{{ns:project}}:Mualliflik huquqlari',
 'currentevents' => 'Joriy hodisalar',
 'currentevents-url' => 'Project:Joriy hodisalar',
 'disclaimers' => 'Ogohlantirishlar',
@@ -204,17 +229,19 @@ $messages = array(
 'privacy' => 'Konfidensiallik siyosati',
 'privacypage' => 'Project:Konfidensiallik siyosati',
 
+'ok' => 'OK',
 'retrievedfrom' => ' "$1" dan olindi',
 'youhavenewmessages' => 'Sizga $1 keldi ($2).',
 'newmessageslink' => 'yangi xabarlar',
 'newmessagesdifflink' => 'soʻnggi oʻzgarish',
+'youhavenewmessagesmulti' => 'Sizga yangi xat keldi: $1',
 'editsection' => 'tahrirlash',
 'editold' => 'tahrir',
 'editlink' => 'tahrirla',
 'viewsourcelink' => 'manbasini koʻr',
 'editsectionhint' => 'Boʻlimni tahrirlash: $1',
 'toc' => 'Mundarija',
-'showtoc' => "Ko'rsatish",
+'showtoc' => 'koʻrsatish',
 'hidetoc' => 'yashirish',
 'collapsible-collapse' => 'Yashir',
 'collapsible-expand' => 'Koʻrsat',
@@ -225,8 +252,9 @@ $messages = array(
 'nstab-main' => 'Maqola',
 'nstab-user' => 'Foydalanuvchi sahifasi',
 'nstab-special' => 'Maxsus sahifa',
-'nstab-project' => 'Loyiha sahifasi',
+'nstab-project' => 'Vikipediya',
 'nstab-image' => 'Fayl',
+'nstab-mediawiki' => 'Xabar',
 'nstab-template' => 'Andoza',
 'nstab-help' => 'Yordam sahifasi',
 'nstab-category' => 'Turkum',
@@ -237,12 +265,18 @@ $messages = array(
 'viewsource' => 'Manbasini koʻrish',
 'protectedpagetext' => 'Bu sahifa tahrirlashdan saqlanish maqsadida qulflangan.',
 'viewsourcetext' => "Siz bu sahifaning manbasini ko'rishingiz va uni nusxasini olishingiz mumkin:",
+'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.',
 
 # Login and logout pages
 'logouttext' => "'''Siz saytdan muvaffaqiyatli chiqdingiz.'''
 
 {{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.",
+'welcomecreation' => '== Xush kelibsiz, $1! ==
+Siz yangi hisob yaratdingiz.
+[[Special:Preferences|{{SITENAME}}dagi shaxsiy moslamalaringizni]] oʻzgartirish yodingizdan chiqmasin.',
 'yourname' => 'Foydalanuvchi nomi',
 'yourpassword' => 'Maxfiy soʻz',
 'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
@@ -251,20 +285,29 @@ Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguning
 'nav-login-createaccount' => 'Kirish / Hisob yaratish',
 'loginprompt' => "{{SITENAME}}ga kirish uchun kukilar yoqilgan bo'lishi kerak.",
 'userlogin' => 'Kirish / Hisob yaratish',
+'userloginnocreate' => 'Kirish',
 'logout' => 'Chiqish',
 'userlogout' => 'Chiqish',
+'notloggedin' => 'Kirish amalga oshirilmadi',
 'nologin' => "Hisobingiz yoʻqmi? '''$1'''.",
 'nologinlink' => 'Hisob yaratish',
 'createaccount' => 'Hisob yaratish',
 'gotaccount' => "Hisobingiz bormi? '''$1'''.",
 'gotaccountlink' => 'Kirish',
+'userlogin-resetlink' => 'Kirish maʻlumotlaringiz esdan chiqdimi?',
 'loginsuccesstitle' => 'Kirish muvaffaqiyatli amalga oshdi',
 'loginsuccess' => "'''{{SITENAME}}ga \"\$1\" foydalanuvchi nomi bilan kirdingiz.'''",
+'nosuchusershort' => '"$1" ismli ishtirokchi yoʻq.
+Xatosiz yozishga urinib koʻring.',
 'wrongpassword' => 'Kiritgan mahfiy soʻzingiz notoʻgʻri. Iltimos, qaytadan kiritib koʻring.',
+'mailmypassword' => 'Yangi parolni e-mail qil',
+'emailauthenticated' => 'Sizning e-mail manzilingiz $2, $3 da tasdiqlangan.',
 'loginlanguagelabel' => 'Til: $1',
 
 # Change password dialog
+'resetpass' => 'Maxfiy soʻzni oʻzgartirish',
 'retypenew' => 'Yangi mahfiy soʻzni qayta tering:',
+'resetpass-submit-loggedin' => 'Maxfiy soʻzni oʻzgartirish',
 
 # Edit page toolbar
 'bold_sample' => 'Qalin matn',
@@ -337,18 +380,27 @@ Qulaylik uchun quyida yoʻqotilish qaydlari keltirilgan:",
 'cur' => 'joriy',
 'next' => 'keyingi',
 'last' => 'oxirgi',
+'page_first' => 'birinchi',
+'page_last' => 'oxirgi',
 'histlegend' => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
 Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 (oxirgi) = avvalgi koʻrinish bilan farq, k = kichkina tahrir.',
+'history-fieldset-title' => 'Tarixni koʻr',
 'history-show-deleted' => 'Faqat o‘chirilganlari',
 'histfirst' => 'Eng avvalgi',
 'histlast' => 'Eng soʻnggi',
+'historysize' => '({{PLURAL:$1|1 bayt|$1 bayt}})',
+'historyempty' => '(boʻsh)',
 
 # Revision feed
 'history-feed-item-nocomment' => '$1 $2 da',
 
 # Revision deletion
 'rev-delundel' => 'koʻrsat/yashir',
+'rev-showdeleted' => 'koʻrsatish',
+'revdelete-log' => 'Sabab:',
+'revdelete-otherreason' => 'Boshqa/qoʻshimcha sabab:',
+'revdelete-reasonotherlist' => 'Boshqa sabab',
 
 # Diffs
 'history-title' => '"$1"ning tarixi',
@@ -370,9 +422,12 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'nextn-title' => 'Keyingi $1 {{PLURAL:$1|natija|natijalar}}',
 'shown-title' => 'Har sahifada $1 natija koʻrsat',
 'viewprevnext' => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'Qidiruv shartlari',
+'searchmenu-exists' => "'''Ushbu vikida \"[[:\$1]]\" nomli sahifa mavjud.'''",
 'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifani yarat!'''",
 'searchhelp-url' => 'Help:Mundarija',
 'searchprofile-articles' => 'Asosiy sahifalar',
+'searchprofile-project' => 'Yordam va proekt sahifalari.',
 'searchprofile-images' => 'Multimediya',
 'searchprofile-everything' => 'Har yerda',
 'searchprofile-advanced' => 'Kengaytirilgan',
@@ -384,10 +439,13 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'search-section' => '($1 boʻlimi)',
 'search-suggest' => 'Balki buni nazarda tutgandirsiz: $1',
 'search-interwiki-default' => '$1 natijalar:',
+'searcheverything-enable' => 'Barcha nomfazolarda qidir',
 'searchall' => 'barchasi',
 'showingresults' => "#<b>$2</b> boshlanayotgan <b>$1</b> natijalar ko'rsatilyapti.",
 'showingresultsheader' => "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
+'search-nonefound' => 'Talabga javob beradigan natija topilmadi.',
 'powersearch' => 'Qidiruv',
+'powersearch-legend' => 'Kengaytirilgan qidiruv',
 'powersearch-ns' => 'Bu nom-fazolarda izla:',
 'powersearch-redir' => 'Yoʻnaltirishlarni koʻrsat',
 'powersearch-field' => 'Qidir',
@@ -395,31 +453,106 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 # Preferences page
 'preferences' => 'Moslamalar',
 'mypreferences' => 'Moslamalarim',
-'prefs-skin' => 'Tashqi ko‘rinish',
+'prefs-edits' => 'Tahrirlar soni',
+'changepassword' => 'Maxfiy soʻzni oʻzgartirish',
+'prefs-skin' => 'Tashqi ko‘rinishi',
+'datedefault' => 'Farqi yoʻq',
 'prefs-datetime' => 'Sana va vaqt',
 'prefs-personal' => 'Shaxsiy ma’lumotlar',
 'prefs-rc' => 'Yangi o‘zgartirishlar',
 'prefs-watchlist' => "Kuzatuv ro'yxati",
+'prefs-watchlist-days-max' => 'Eng ko‘pi $1 {{PLURAL:$1|kun|kun}}',
 'prefs-misc' => 'Boshqa moslamalar',
+'prefs-resetpass' => 'Maxfiy soʻzni oʻzgartirish',
+'prefs-changeemail' => 'E-mail manzilingizni o‘zgartirish',
+'prefs-rendering' => 'Tashqi ko‘rinishi',
 'saveprefs' => 'Saqlash',
 'resetprefs' => 'Bekor qilish',
+'restoreprefs' => 'Barcha moslamalarni dastlabki holiga qaytar',
 'prefs-editing' => 'Tahrirlash',
+'prefs-edit-boxsize' => 'Tahrir oynasining oʻlchami',
+'rows' => 'Qatorlar soni:',
+'columns' => 'Ustunlar soni:',
 'searchresultshead' => 'Qidiruv natijalari',
+'recentchangesdays-max' => 'Eng koʻpi $1 kun',
+'recentchangescount' => 'Sukut boʻyicha koʻrsatiladigan tahrirlar soni',
+'timezonelegend' => 'Vaqt mintaqangiz:',
+'localtime' => 'Mahalliy vaqt:',
+'servertime' => 'Server vaqti:',
+'timezoneregion-africa' => 'Afrika',
+'timezoneregion-america' => 'Amerika',
+'timezoneregion-antarctica' => 'Antarktika',
+'timezoneregion-arctic' => 'Arktika',
+'timezoneregion-asia' => 'Osiyo',
+'timezoneregion-atlantic' => 'Atlantika okeani',
+'timezoneregion-australia' => 'Avstraliya',
+'timezoneregion-europe' => 'Yevropa',
+'timezoneregion-indian' => 'Hind okeani',
+'timezoneregion-pacific' => 'Tinch okeani',
+'allowemail' => 'Boshqa foydalanuvchilardan elektron xat olishga ruxsat berish',
+'prefs-searchoptions' => 'Qidiruv shartlari',
+'prefs-namespaces' => 'Nomfazolar',
+'defaultns' => 'Aks holda quyidagi nomfazolarda qidir:',
 'prefs-files' => 'Fayllar',
+'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',
 'yourrealname' => 'Haqiqiy ism *:',
+'yourlanguage' => 'Til:',
+'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',
+'email' => 'E-mail:',
+'prefs-help-email-required' => 'E-mail manzilni koʻrsatish shart emas',
+'prefs-info' => 'Asosiy maʼlumot',
+'prefs-signature' => 'Imzo',
+'prefs-dateformat' => 'Sana formati',
+'prefs-timeoffset' => 'Vaqt farqi',
+'prefs-advancedediting' => 'Qoʻshimcha moslamalar',
+'prefs-advancedrc' => 'Qoʻshimcha moslamalar',
+'prefs-advancedrendering' => 'Qoʻshimcha moslamalar',
+'prefs-advancedsearchoptions' => 'Qoʻshimcha moslamalar',
+'prefs-advancedwatchlist' => 'Qoʻshimcha moslamalar',
+
+# User rights
+'userrights-groupsmember' => 'Aʼzolik:',
+'userrights-reason' => 'Sabab:',
 
 # Groups
+'group' => 'Guruh',
+'group-user' => 'Foydalanuvchilar',
+'group-autoconfirmed' => 'Tasdiqlangan foydalanuvchilar',
+'group-bot' => 'Botlar',
 'group-sysop' => 'Administratorlar',
+'group-bureaucrat' => 'Rasmiyatchilar',
+'group-suppress' => 'Tekshiruvchilar',
 
+'grouppage-user' => '{{ns:project}}:Foydalanuvchilar',
+'grouppage-autoconfirmed' => '{{ns:project}}:Tasdiqlangan foydalanuvchilar',
+'grouppage-bot' => '{{ns:project}}:Botlar',
 'grouppage-sysop' => '{{ns:project}}:Administratorlar',
+'grouppage-bureaucrat' => '{{ns:project}}:Rasmiyatchilar',
+'grouppage-suppress' => '{{ns:project}}:Tekshiruvchilar',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'ushbu sahifani tahrirlash',
+'action-move' => 'bu sahifani koʻchir',
+'action-move-subpages' => 'Bu sahifani va uning ostsahifalarini koʻchir',
 
 # Recent changes
 'recentchanges' => 'Yangi o‘zgartirishlar',
 'recentchanges-summary' => "Bu sahifada siz oxirgi o'zgartirishlarni ko'rishingiz mumkin.",
+'recentchanges-label-newpage' => 'Bu tahrir orqali yangi sahifa yaratildi',
+'recentchanges-label-minor' => 'Bu kichik tahrir',
+'recentchanges-label-bot' => 'Bu tahrirni bot bajardi',
+'recentchanges-label-unpatrolled' => 'Bu tahrir hali tekshirilmagan',
 'rcnote' => "Quyida $5, $4ga koʻra oxirgi {{PLURAL:$2|kun|'''$2''' kun}} davomida sodir boʻlgan {{PLURAL:$1|'''1''' oʻzgartirish|'''$1''' oʻzgartirishlar}} koʻrsatilgan.",
 'rclistfrom' => "$1dan boshlab yangi o'zgartirishlarni ko'rsat.",
 'rcshowhideminor' => 'Kichik tahrirlarni $1',
@@ -435,9 +568,12 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'show' => 'koʻrsat',
 'minoreditletter' => 'k',
 'newpageletter' => 'Y',
+'rc-enhanced-expand' => 'Tasfilotlarni koʻrsat (JavaScript talab qilinadi)',
+'rc-enhanced-hide' => 'Tafsilotlolarni yashir',
 
 # Recent changes linked
-'recentchangeslinked' => "Bog'langan o'zgarishlar",
+'recentchangeslinked' => 'Bogʻlangan oʻzgarishlar',
+'recentchangeslinked-feed' => 'Bogʻliq oʻzgarishlar',
 'recentchangeslinked-toolbox' => 'Bogʻliq oʻzgarishlar',
 'recentchangeslinked-title' => '"$1"ga aloqador oʻzgarishlar',
 'recentchangeslinked-noresult' => 'Berilgan davrda bogʻlangan sahifalarda oʻzgarishlar boʻlmagan.',
@@ -447,17 +583,27 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 # Upload
 'upload' => 'Fayl yuklash',
 'uploadbtn' => 'Fayl yukla',
+'uploaderror' => 'Yuklashda xatolik',
 'uploadlogpage' => 'Yuklash qaydlari',
 'filedesc' => 'Qisqa izoh',
+'filereuploadsummary' => 'Fayldagi oʻzgarishlar:',
+'filesource' => 'Manba:',
 'uploadedimage' => '"[[$1]]" yuklandi',
 
 # Special:ListFiles
+'imgfile' => 'fayl',
 'listfiles' => 'Fayllar roʻyxati',
+'listfiles_date' => 'Sana',
+'listfiles_user' => 'Foydalanuvchi',
+'listfiles_size' => 'Oʻlchami',
+'listfiles_description' => 'Taʻrif',
 
 # File description page
 'file-anchor-link' => 'Fayl',
 'filehist' => 'Fayl tarixi',
 'filehist-help' => 'Faylning biror paytdagi holatini koʻrish uchun tegishli sana/vaqtga bosingiz.',
+'filehist-deleteone' => 'o‘chirish',
+'filehist-revert' => 'qaytarish',
 'filehist-current' => 'joriy',
 'filehist-datetime' => 'Sana/Vaqt',
 'filehist-thumb' => 'Miniatyura',
@@ -473,6 +619,12 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'uploadnewversion-linktext' => 'Bu faylning yangi versiyasini yukla',
 
+# File reversion
+'filerevert-comment' => 'Sabab:',
+
+# File deletion
+'filedelete-comment' => 'Sabab:',
+
 # Unused templates
 'unusedtemplates' => 'Ishlatilinmagan andozalar',
 
@@ -506,6 +658,7 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'pager-older-n' => '{{PLURAL:$1|eskiroq 1|eskiroq $1}}',
 
 # Book sources
+'booksources' => 'Kitob manbaʻlar',
 'booksources-go' => 'O‘tish',
 
 # Special:Log
@@ -529,11 +682,25 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
+# Special:DeletedContributions
+'sp-deletedcontributions-contribs' => 'hissa',
+
+# Special:LinkSearch
+'linksearch-ns' => 'Nomfazo:',
+'linksearch-ok' => 'Qidirish',
+
+# Special:ListUsers
+'listusers-submit' => 'Koʻrsat',
+
 # Special:ListGroupRights
+'listgrouprights-group' => 'Guruh',
+'listgrouprights-rights' => 'Huquqlar',
 'listgrouprights-members' => '(a’zolar ro‘yxati)',
 
 # E-mail user
 'emailuser' => 'Bu foydalanuvchiga e-maktub joʻnat',
+'noemailtext' => "Bu foydalanuvchi e-mail manzil ko'rsatgani yo'q.",
+'emailsend' => 'Joʻnatish',
 
 # Watchlist
 'watchlist' => 'Kuzatuv roʻyxatim',
@@ -610,6 +777,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'blocklink' => 'chetlashtir',
 'contribslink' => 'hissasi',
 'blocklogpage' => 'Chetlashtirish qaydlari',
+'block-log-flags-nocreate' => 'hisob ochish toʻxtatilgan',
 
 # Move page
 'movearticle' => "Sahifani ko'chirish",
@@ -691,13 +859,22 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'tooltip-recreate' => "Bu sahifani u o'chirilgan bo'lishiga qaramasdan qayta yaratish",
 'tooltip-summary' => 'Qisqa mazmun kiriting',
 
+# Attribution
+'others' => 'boshqalar',
+
+# Info page
+'pageinfo-title' => '"$1" sahifasi haqida maʼlumot',
+'pageinfo-header-edits' => 'Tahrirlar',
+'pageinfo-watchers' => 'Kuzatuvchilar soni',
+'pageinfo-edits' => 'Tahrirlar soni',
+
 # Browsing diffs
 'previousdiff' => '← Avvalgi tahrir',
 'nextdiff' => 'Keyingi tahrir →',
 
 # Media information
-'imagemaxsize' => "Tasvir ta'rifi sahifasidagi tasvirning kattaligi:",
-'thumbsize' => 'Tasvirning kichiklashtirilgan versiyasining kattaligi:',
+'imagemaxsize' => 'Tasvir taʼrifi sahifasidagi tasvirning oʻlchami:',
+'thumbsize' => 'Tasvirning kichiklashtirilgan versiyasining oʻlchami:',
 'file-info-size' => '$1 × $2 piksel, fayl hajmi: $3, MIME tipi: $4',
 'file-nohires' => 'Bundan kattaroq tasvir yoʻq.',
 'svg-long-desc' => 'SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3',
@@ -711,6 +888,39 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'metadata-expand' => 'Batafsil axborot koʻrsat',
 'metadata-collapse' => 'Batafsil axborotni yashir',
 
+# EXIF tags
+'exif-imagewidth' => 'Eni',
+'exif-imagelength' => 'Boʻyi',
+'exif-artist' => 'Muallif',
+'exif-source' => 'Manba',
+'exif-iimcategory' => 'Turkum',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'Shimoliy kenglik',
+'exif-gpslatitude-s' => 'Janubiy kenglik',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'Sharqiy uzunlik',
+'exif-gpslongitude-w' => 'Gʻarbiy uzunlik',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Kilometr',
+'exif-gpsdestdistance-m' => 'Mil',
+
+'exif-iimcategory-clj' => 'Jinoyat va qonun',
+'exif-iimcategory-dis' => 'Halokatlar',
+'exif-iimcategory-fin' => 'Iqtisodiyot va biznes',
+'exif-iimcategory-edu' => 'Maʼrifat',
+'exif-iimcategory-evn' => 'Atrofimizdagi olam',
+'exif-iimcategory-hum' => 'Inson huquqlari',
+'exif-iimcategory-lab' => 'Mehnat',
+'exif-iimcategory-lif' => 'Turmush tarzi va hordiq',
+'exif-iimcategory-pol' => 'Siyosat',
+'exif-iimcategory-rel' => 'Din va imon',
+'exif-iimcategory-sci' => 'Fan va texnologiyalar',
+'exif-iimcategory-spo' => 'Sport',
+'exif-iimcategory-wea' => 'Ob-havo',
+
 # External editor support
 'edit-externally' => 'Bu faylni tashqi dasturiy ilovalar yordamida tahrirla',
 'edit-externally-help' => "(Batafsil ma'lumotlar uchun [//www.mediawiki.org/wiki/Manual:External_editors bu yerga] qarang)",
@@ -722,7 +932,45 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 
 'unit-pixel' => 'piksel',
 
+# Multipage image navigation
+'imgmultipageprev' => '← oldingi sahifa',
+'imgmultipagenext' => 'keyingi sahifa →',
+'imgmultigoto' => '$1 sahifasiga oʻtish',
+
+# Table pager
+'table_pager_next' => 'Keyingi sahifa',
+'table_pager_prev' => 'Oldingi sahifa',
+'table_pager_first' => 'Birinchi sahifa',
+'table_pager_last' => 'Oxirgi sahifa',
+
+# Auto-summaries
+'autoredircomment' => '[[$1]]ga yoʻnaltirildi',
+'autosumm-new' => '"$1" yozuvi orqali yangi sahifa yaratildi',
+
+# Watchlist editing tools
+'watchlisttools-edit' => 'Kuzatuv roʻyxatimni koʻrish/oʻzgartirish',
+'watchlisttools-raw' => 'Kuzatuv roʻyxatimni tahrirlash',
+
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|munozara]])',
+
+# Special:Version
+'version-specialpages' => 'Maxsus sahifalar',
+
 # Special:SpecialPages
 'specialpages' => 'Maxsus sahifalar',
 
+# HTML forms
+'htmlform-reset' => 'Oʻzgarishlarni bekor qilish',
+
+# New logging system
+'logentry-move-move' => '$1 $3 sahifasini $4ga koʻchirdi',
+
+# Feedback
+'feedback-close' => 'Bajarildi',
+
+# API errors
+'api-error-unknown-code' => 'Noaniq xato: "$1".',
+'api-error-unknownerror' => 'Noaniq xato: "$1".',
+
 );
index 73c51f3..5a924c6 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 $magicWords = array(
-       'redirect'                => array( '0', '#VARDA', '#RINVIA', '#RINVIO', '#RIMANDO', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#VARDA', '#RINVIA', '#RINVIO', '#RIMANDO', '#REDIRECT' ),
 );
 
 $fallback = 'it';
@@ -1506,9 +1506,9 @@ Qua ghe xe el registro de le scancelassion e dei spostamenti:",
 Par védar o sercar i file zà caricà, consulta la [[Special:FileList|lista dei file caricà]]. I caricamenti de file te pol védarli nel [[Special:Log/upload|registro dei caricamenti]], le scancelasion nel [[Special:Log/delete|registro de le scancelasion]].
 
 Par métar un file drento de na pagina, te ghè da inserir un colegamento fato come uno de sti qua:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' par doparar la version conpleta de sto file
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></tt>'''par inserir sto file co na larghessa de 200 pixel in te un riquadro a sinistra con 'testo alternativo' come descrission
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' par inserir diretamente un colegamento al file sensa che el se véda in te la pagina",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' par doparar la version conpleta de sto file
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>'''par inserir sto file co na larghessa de 200 pixel in te un riquadro a sinistra con 'testo alternativo' come descrission
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' par inserir diretamente un colegamento al file sensa che el se véda in te la pagina",
 'upload-permitted' => 'Tipi de file consentìi: $1.',
 'upload-preferred' => 'Tipi de file consiglià: $1.',
 'upload-prohibited' => 'Tipi de file mìa consentìi: $1.',
@@ -1550,19 +1550,19 @@ Varda la [[Special:NewFiles|galerìa dei file nóvi]] par na vision de insieme.'
 'largefileserver' => 'El file el supera le dimension consentìe da la configurazion del server.',
 'emptyfile' => 'El file che te ghè caricà el xè aparentemente vodo. Podarìa èssar par un eror nel nome del file. Par piaser controla se te vol dal bon caricar sto file.',
 'windows-nonascii-filename' => 'Sta wiki no suporta nomi de file co carateri speciałi.',
-'fileexists' => "Un file co sto nome el esiste de xà, par piaser controła '''<tt>[[:$1]]</tt>''' se no te sì sicuro de volerlo sovrascrìvar.
-[[$1|thumb]]",
-'filepageexists' => "La pagina de descrizion de sto file la xe zà stà creà a '''<tt>[[:$1]]</tt>''', anca se no ghe xe gnancora un file co sto nome.
+'fileexists' => 'Un file co sto nome el esiste de xà, par piaser controła <strong>[[:$1]]</strong> se no te sì sicuro de volerlo sovrascrìvar.
+[[$1|thumb]]',
+'filepageexists' => "La pagina de descrizion de sto file la xe zà stà creà a <strong>[[:$1]]</strong>, anca se no ghe xe gnancora un file co sto nome.
 La descrizion de l'ogeto inserìa in fase de caricamento no la vegnarà mìa fora su la pagina de discussion.
 Par far sì che l'ogeto el conpaja su la pagina de discussion, sarà necessario modificarla a man. [[$1|thumb]]",
-'fileexists-extension' => "Ghe xe zà un file co un nome che ghe someja a quel lì: [[$2|thumb]]
-* Nome del file cargà: '''<tt>[[:$1]]</tt>'''
-* Nome del file esistente: '''<tt>[[:$2]]</tt>'''
-Par piaser siegli un nome difarente.",
+'fileexists-extension' => 'Ghe xe zà un file co un nome che ghe someja a quel lì: [[$2|thumb]]
+* Nome del file cargà: <strong>[[:$1]]</strong>
+* Nome del file esistente: <strong>[[:$2]]</strong>
+Par piaser siegli un nome difarente.',
 'fileexists-thumbnail-yes' => "El file el pararìa èssar el risultato de n'anteprima ''(thumbnail)''. [[$1|thumb]]
-Verifica, par confronto, el file '''<tt>[[:$1]]</tt>'''.
+Verifica, par confronto, el file <strong>[[:$1]]</strong>.
 Se se trata de la stessa imagine, ne le dimension originali, no xe necessario caricarghene altre anteprime.",
-'file-thumbnail-no' => "El nome del file el scuminsia con '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "El nome del file el scuminsia con <strong>$1</strong>.
 Pararìà quindi che el fusse el risultato de n'anteprima ''(thumbnail)''.
 Se se dispone de l'imagine ne la risoluzion originale, se prega di cargarla. In caso contrario, se prega de canbiar el nome del file.",
 'fileexists-forbidden' => 'Un file con sto nome el esiste xà, e no se pode scrìvarghe insima.
@@ -1765,7 +1765,7 @@ Qua soto vien mostrà la descrission presente in te la [$2 pàxena de descrissio
 
 # MIME search
 'mimesearch' => 'Serca in base al tipo MIME',
-'mimesearch-summary' => 'Sta pagina la consente de filtrare i file in base al tipo MIME. Inserissi la stringa de riserca ne la forma tipo/sototipo, ad es. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Sta pagina la consente de filtrare i file in base al tipo MIME. Inserissi la stringa de riserca ne la forma tipo/sototipo, ad es. <code>image/jpeg</code>.',
 'mimetype' => 'Tipo MIME:',
 'download' => 'descarga',
 
@@ -1952,7 +1952,7 @@ Varda anca le [[Special:WantedCategories|categorie domandà]].',
 'linksearch-ok' => 'Serca',
 'linksearch-text' => 'Xe posibiłe doparare metacarateri, come "*.wikipedia.org".<br />
 Xe necesario almanco un dominio de primo liveło, tipo "*.org".<br />
-Protocołi suportadi: <tt>$1</tt> (no sta xontare nesuno de sti cuà inte ła to riçerca).',
+Protocołi suportadi: <code>$1</code> (no sta xontare nesuno de sti cuà inte ła to riçerca).',
 'linksearch-line' => '$1 presente ne la pagina $2',
 'linksearch-error' => "I metacaràteri i pode vegner doparài solo a l'inizio del nome de l'host.",
 
index 0ae2302..6e7d406 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Veps (Vepsän kel’)
+/** Veps (vepsän kel’)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -70,20 +70,20 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'img_right'               => array( '1', 'oiged', 'paremal', 'right' ),
-       'img_left'                => array( '1', 'hura', 'vasakul', 'left' ),
-       'img_none'                => array( '1', 'eile', 'tühi', 'none' ),
-       'img_width'               => array( '1', '$1piks', '$1px' ),
-       'img_border'              => array( '1', 'röun', 'ääris', 'border' ),
-       'img_top'                 => array( '1', 'üläh', 'top' ),
-       'img_middle'              => array( '1', 'kesk', 'middle' ),
-       'img_bottom'              => array( '1', 'ala', 'bottom' ),
-       'sitename'                => array( '1', 'SAITANNIMI', 'KOHANIMI', 'SITENAME' ),
-       'grammar'                 => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'SUGU:', 'GENDER:' ),
-       'plural'                  => array( '0', 'ÄILUGU:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'TÄUZ\'URL:', 'KOGUURL:', 'FULLURL:' ),
-       'index'                   => array( '1', '__INDEKS__', 'INDEKSIGA', '__INDEX__' ),
+       'img_right'                 => array( '1', 'oiged', 'paremal', 'right' ),
+       'img_left'                  => array( '1', 'hura', 'vasakul', 'left' ),
+       'img_none'                  => array( '1', 'eile', 'tühi', 'none' ),
+       'img_width'                 => array( '1', '$1piks', '$1px' ),
+       'img_border'                => array( '1', 'röun', 'ääris', 'border' ),
+       'img_top'                   => array( '1', 'üläh', 'top' ),
+       'img_middle'                => array( '1', 'kesk', 'middle' ),
+       'img_bottom'                => array( '1', 'ala', 'bottom' ),
+       'sitename'                  => array( '1', 'SAITANNIMI', 'KOHANIMI', 'SITENAME' ),
+       'grammar'                   => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'SUGU:', 'GENDER:' ),
+       'plural'                    => array( '0', 'ÄILUGU:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'TÄUZ\'URL:', 'KOGUURL:', 'FULLURL:' ),
+       'index'                     => array( '1', '__INDEKS__', 'INDEKSIGA', '__INDEX__' ),
 );
 
 $messages = array(
@@ -128,7 +128,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Peitta sistemha tulnuziden kävutajiden redakcijad kaclendnimikirjutesespäi',
 'tog-watchlisthideanons' => 'Peitta anonimoiden redakcijad kaclendnimikirjutesespäi',
 'tog-watchlisthidepatrolled' => 'Peitta patruliruidud redakcijad kaclendnimikirjutesespäi',
-'tog-nolangconversion' => 'Saubata kirjutandsistemoiden toižetand',
 'tog-ccmeonemails' => 'Oigeta minei kaikiden minai kirjutadud kirjeižiden kopijad',
 'tog-diffonly' => 'Ala ozuta lehtpolen süadäimištod versijoiden rindatandan al',
 'tog-showhiddencats' => 'Ozutada peittud kategorijad',
@@ -1344,8 +1343,8 @@ Lasktud {{PLURAL:$3|failantip om|failantipad oma}} $2.',
 Voib olda, necen sü om vär failannimen kirjutamine.
 Olgat hüväd, kodvgat, todeks-ik tö tahtoit jügutoitta nece fail.",
 'windows-nonascii-filename' => 'Neche vikihe ei sa tehta failannimid specialižiden znamoidenke.',
-'fileexists' => "Fail mugoman nimenke om jo olmas, olgat hüväd, kodvgat '''<tt>[[:$1]]</tt>''' ku teil ei ole varmdust, tahtoižit-ik tö toižetada sidä.
-[[$1|thumb]]",
+'fileexists' => 'Fail mugoman nimenke om jo olmas, olgat hüväd, kodvgat <strong>[[:$1]]</strong> ku teil ei ole varmdust, tahtoižit-ik tö toižetada sidä.
+[[$1|thumb]]',
 'file-exists-duplicate' => 'Nece fail om {{PLURAL:$1|necen failan|neniden failoiden}} dublikat:',
 'uploadwarning' => 'Varutuz jügutoitmižes',
 'savefile' => 'Kirjutada fail',
@@ -2376,14 +2375,10 @@ Voib olda, necil lehtpolel om kosketuz irdsaitale, kudamb om mustas nimikirjutes
 
 # Info page
 'pageinfo-header-edits' => 'Redakcijad',
-'pageinfo-header-watchlist' => 'Kaclendnimikirjutez',
-'pageinfo-header-views' => 'Kacundad',
-'pageinfo-subjectpage' => 'Lehtpol’',
-'pageinfo-talkpage' => "Lodulehtpol'",
+'pageinfo-views' => 'Kacundoiden lugu',
 'pageinfo-watchers' => 'Kaclijoiden lugu',
 'pageinfo-edits' => 'Redakcijoiden lugumär',
 'pageinfo-authors' => 'Erazvuiččiden avtoroiden lugu',
-'pageinfo-views' => 'Kacundoiden lugu',
 
 # Skin names
 'skinname-standard' => 'Klassine',
@@ -3070,6 +3065,7 @@ Kävutagat normaline ezikacund.',
 'api-error-empty-file' => "Teil oigetud fail om pall'az.",
 'api-error-filename-tooshort' => 'Lühudahk failannimi.',
 'api-error-filetype-banned' => "Nece failtip om kel'tud.",
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|om laskmatoi failantip|oma laskmatomad failantipad}}. Lasktud {{PLURAL:$3|failantip om|failantipad oma}} $2.',
 'api-error-illegal-filename' => "Kel'tud failannimi.",
 'api-error-unclassified' => 'Tundmatoi petuz.',
 'api-error-unknown-code' => 'Tundmatoi petuz: "$1"',
index 6dde200..632f2fa 100644 (file)
@@ -157,100 +157,102 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#đổi', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__KHÔNGMỤCMỤC__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__KHÔNGALBUM__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__LUÔNMỤCLỤC__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__MỤCLỤC__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__KHÔNGSỬAMỤC__', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', 'THÁNGNÀY', 'THÁNGNÀY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', 'THÁNGNÀY1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', 'TÊNTHÁNGNÀY', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'TÊNDÀITHÁNGNÀY', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'TÊNNGẮNTHÁNGNÀY', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', 'NGÀYNÀY', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', 'NGÀYNÀY2', 'CURRENTDAY2' ),
-       'currentdayname'          => array( '1', 'TÊNNGÀYNÀY', 'CURRENTDAYNAME' ),
-       'currentyear'             => array( '1', 'NĂMNÀY', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'GIỜNÀY', 'CURRENTTIME' ),
-       'localmonth'              => array( '1', 'THÁNGĐỊAPHƯƠNG', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonth1'             => array( '1', 'THÁNGĐỊAPHƯƠNG1', 'LOCALMONTH1' ),
-       'localmonthname'          => array( '1', 'TÊNTHÁNGĐỊAPHƯƠNG', 'LOCALMONTHNAME' ),
-       'localmonthabbrev'        => array( '1', 'THÁNGĐỊAPHƯƠNGTẮT', 'LOCALMONTHABBREV' ),
-       'localday'                => array( '1', 'NGÀYĐỊAPHƯƠNG', 'LOCALDAY' ),
-       'localday2'               => array( '1', 'NGÀYĐỊAPHƯƠNG2', 'LOCALDAY2' ),
-       'localdayname'            => array( '1', 'TÊNNGÀYĐỊAPHƯƠNG', 'LOCALDAYNAME' ),
-       'localyear'               => array( '1', 'NĂMĐỊAPHƯƠNG', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'GIỜĐỊAPHƯƠNG', 'LOCALTIME' ),
-       'numberofpages'           => array( '1', 'SỐTRANG', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'SỐBÀI', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', 'SỐTẬPTIN', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'SỐTHÀNHVIÊN', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', 'SỐTHÀNHVIÊNTÍCHCỰC', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'SỐSỬAĐỔI', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', 'SỐLẦNXEM', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', 'TÊNTRANG', 'PAGENAME' ),
-       'pagenamee'               => array( '1', 'TÊNTRANG2', 'PAGENAMEE' ),
-       'namespace'               => array( '1', 'KHÔNGGIANTÊN', 'NAMESPACE' ),
-       'talkspace'               => array( '1', 'KGTTHẢOLUẬN', 'TALKSPACE' ),
-       'subjectspace'            => array( '1', 'KGTNỘIDUNG', 'SUBJECTSPACE', 'ARTICLESPACE' ),
-       'fullpagename'            => array( '1', 'TÊNTRANGĐỦ', 'FULLPAGENAME' ),
-       'subpagename'             => array( '1', 'TÊNTRANGPHỤ', 'SUBPAGENAME' ),
-       'basepagename'            => array( '1', 'TÊNTRANGGỐC', 'BASEPAGENAME' ),
-       'talkpagename'            => array( '1', 'TÊNTRANGTHẢOLUẬN', 'TALKPAGENAME' ),
-       'subjectpagename'         => array( '1', 'TÊNTRANGNỘIDUNG', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
-       'msg'                     => array( '0', 'NHẮN:', 'MSG:' ),
-       'subst'                   => array( '0', 'THẾ:', 'SUBST:' ),
-       'msgnw'                   => array( '0', 'NHẮNMỚI:', 'MSGNW:' ),
-       'img_thumbnail'           => array( '1', 'nhỏ', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'nhỏ=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'phải', 'right' ),
-       'img_left'                => array( '1', 'trái', 'left' ),
-       'img_none'                => array( '1', 'không', 'none' ),
-       'img_center'              => array( '1', 'giữa', 'center', 'centre' ),
-       'img_framed'              => array( '1', 'khung', 'framed', 'enframed', 'frame' ),
-       'img_page'                => array( '1', 'trang=$1', 'trang $1', 'page=$1', 'page $1' ),
-       'img_upright'             => array( '1', 'đứng', 'đứng=$1', 'đứng $1', 'upright', 'upright=$1', 'upright $1' ),
-       'img_link'                => array( '1', 'liên_kết=$1', 'link=$1' ),
-       'int'                     => array( '0', 'NỘI:', 'INT:' ),
-       'sitename'                => array( '1', 'TÊNMẠNG', 'SITENAME' ),
-       'ns'                      => array( '0', 'KGT:', 'NS:' ),
-       'localurl'                => array( '0', 'URLĐỊAPHƯƠNG:', 'LOCALURL:' ),
-       'articlepath'             => array( '0', 'LỐIBÀI', 'ARTICLEPATH' ),
-       'server'                  => array( '0', 'MÁYCHỦ', 'SERVER' ),
-       'servername'              => array( '0', 'TÊNMÁYCHỦ', 'SERVERNAME' ),
-       'scriptpath'              => array( '0', 'ĐƯỜNGDẪNSCRIPT', 'SCRIPTPATH' ),
-       'grammar'                 => array( '0', 'NGỮPHÁP:', 'GRAMMAR:' ),
-       'gender'                  => array( '0', 'GIỐNG:', 'GENDER:' ),
-       'notitleconvert'          => array( '0', '__KHÔNGCHUYỂNTÊN__', '__NOTITLECONVERT__', '__NOTC__' ),
-       'nocontentconvert'        => array( '0', '__KHÔNGCHUYỂNNỘIDUNG__', '__NOCONTENTCONVERT__', '__NOCC__' ),
-       'currentweek'             => array( '1', 'TUẦNNÀY', 'CURRENTWEEK' ),
-       'localweek'               => array( '1', 'TUẦNĐỊAPHƯƠNG', 'LOCALWEEK' ),
-       'revisionid'              => array( '1', 'SỐBẢN', 'REVISIONID' ),
-       'revisionday'             => array( '1', 'NGÀYBẢN', 'REVISIONDAY' ),
-       'revisionday2'            => array( '1', 'NGÀYBẢN2', 'REVISIONDAY2' ),
-       'revisionmonth'           => array( '1', 'THÁNGBẢN', 'REVISIONMONTH' ),
-       'revisionmonth1'          => array( '1', 'THÁNGBẢN1', 'REVISIONMONTH1' ),
-       'revisionyear'            => array( '1', 'NĂMBẢN', 'REVISIONYEAR' ),
-       'plural'                  => array( '0', 'SỐNHIỀU:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'URLĐỦ:', 'FULLURL:' ),
-       'newsectionlink'          => array( '1', '__LIÊNKẾTMỤCMỚI__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '__KHÔNGLIÊNKẾTMỤCMỚI__', '__NONEWSECTIONLINK__' ),
-       'currentversion'          => array( '1', 'BẢNNÀY', 'CURRENTVERSION' ),
-       'urlencode'               => array( '0', 'MÃHÓAURL:', 'URLENCODE:' ),
-       'language'                => array( '0', '#NGÔNNGỮ:', '#LANGUAGE:' ),
-       'contentlanguage'         => array( '1', 'NGÔNNGỮNỘIDUNG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'CỠKHÔNGGIANTÊN:', 'CỠKGT:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
-       'numberofadmins'          => array( '1', 'SỐQUẢNLÝ', 'NUMBEROFADMINS' ),
-       'formatnum'               => array( '0', 'PHÂNCHIASỐ', 'FORMATNUM' ),
-       'defaultsort'             => array( '1', 'XẾPMẶCĐỊNH:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                => array( '0', 'ĐƯỜNGDẪNTẬPTIN', 'FILEPATH:' ),
-       'tag'                     => array( '0', 'thẻ', 'tag' ),
-       'hiddencat'               => array( '1', '__THỂLOẠIẨN__', '__HIDDENCAT__' ),
-       'pagesincategory'         => array( '1', 'CỠTHỂLOẠI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
-       'pagesize'                => array( '1', 'CỠTRANG', 'PAGESIZE' ),
-       'numberingroup'           => array( '1', 'CỠNHÓM', 'NUMBERINGROUP', 'NUMINGROUP' ),
-       'staticredirect'          => array( '1', '__ĐỔIHƯỚNGNHẤTĐỊNH__', '__STATICREDIRECT__' ),
+       'redirect'                  => array( '0', '#đổi', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__KHÔNGMỤCMỤC__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__KHÔNGALBUM__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__LUÔNMỤCLỤC__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__MỤCLỤC__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__KHÔNGSỬAMỤC__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', 'THÁNGNÀY', 'THÁNGNÀY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', 'THÁNGNÀY1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'TÊNTHÁNGNÀY', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'       => array( '1', 'TÊNDÀITHÁNGNÀY', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'        => array( '1', 'TÊNNGẮNTHÁNGNÀY', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', 'NGÀYNÀY', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'NGÀYNÀY2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'TÊNNGÀYNÀY', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'NĂMNÀY', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'GIỜNÀY', 'CURRENTTIME' ),
+       'localmonth'                => array( '1', 'THÁNGĐỊAPHƯƠNG', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'               => array( '1', 'THÁNGĐỊAPHƯƠNG1', 'LOCALMONTH1' ),
+       'localmonthname'            => array( '1', 'TÊNTHÁNGĐỊAPHƯƠNG', 'LOCALMONTHNAME' ),
+       'localmonthabbrev'          => array( '1', 'THÁNGĐỊAPHƯƠNGTẮT', 'LOCALMONTHABBREV' ),
+       'localday'                  => array( '1', 'NGÀYĐỊAPHƯƠNG', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'NGÀYĐỊAPHƯƠNG2', 'LOCALDAY2' ),
+       'localdayname'              => array( '1', 'TÊNNGÀYĐỊAPHƯƠNG', 'LOCALDAYNAME' ),
+       'localyear'                 => array( '1', 'NĂMĐỊAPHƯƠNG', 'LOCALYEAR' ),
+       'localtime'                 => array( '1', 'GIỜĐỊAPHƯƠNG', 'LOCALTIME' ),
+       'numberofpages'             => array( '1', 'SỐTRANG', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'SỐBÀI', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'SỐTẬPTIN', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'SỐTHÀNHVIÊN', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'SỐTHÀNHVIÊNTÍCHCỰC', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'SỐSỬAĐỔI', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', 'SỐLẦNXEM', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', 'TÊNTRANG', 'PAGENAME' ),
+       'pagenamee'                 => array( '1', 'TÊNTRANG2', 'PAGENAMEE' ),
+       'namespace'                 => array( '1', 'KHÔNGGIANTÊN', 'NAMESPACE' ),
+       'talkspace'                 => array( '1', 'KGTTHẢOLUẬN', 'TALKSPACE' ),
+       'subjectspace'              => array( '1', 'KGTNỘIDUNG', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'fullpagename'              => array( '1', 'TÊNTRANGĐỦ', 'FULLPAGENAME' ),
+       'subpagename'               => array( '1', 'TÊNTRANGPHỤ', 'SUBPAGENAME' ),
+       'basepagename'              => array( '1', 'TÊNTRANGGỐC', 'BASEPAGENAME' ),
+       'talkpagename'              => array( '1', 'TÊNTRANGTHẢOLUẬN', 'TALKPAGENAME' ),
+       'subjectpagename'           => array( '1', 'TÊNTRANGNỘIDUNG', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'msg'                       => array( '0', 'NHẮN:', 'MSG:' ),
+       'subst'                     => array( '0', 'THẾ:', 'SUBST:' ),
+       'msgnw'                     => array( '0', 'NHẮNMỚI:', 'MSGNW:' ),
+       'img_thumbnail'             => array( '1', 'nhỏ', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'nhỏ=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'phải', 'right' ),
+       'img_left'                  => array( '1', 'trái', 'left' ),
+       'img_none'                  => array( '1', 'không', 'none' ),
+       'img_center'                => array( '1', 'giữa', 'center', 'centre' ),
+       'img_framed'                => array( '1', 'khung', 'framed', 'enframed', 'frame' ),
+       'img_page'                  => array( '1', 'trang=$1', 'trang $1', 'page=$1', 'page $1' ),
+       'img_upright'               => array( '1', 'đứng', 'đứng=$1', 'đứng $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_link'                  => array( '1', 'liên_kết=$1', 'link=$1' ),
+       'int'                       => array( '0', 'NỘI:', 'INT:' ),
+       'sitename'                  => array( '1', 'TÊNMẠNG', 'SITENAME' ),
+       'ns'                        => array( '0', 'KGT:', 'NS:' ),
+       'localurl'                  => array( '0', 'URLĐỊAPHƯƠNG:', 'LOCALURL:' ),
+       'articlepath'               => array( '0', 'LỐIBÀI', 'ARTICLEPATH' ),
+       'server'                    => array( '0', 'MÁYCHỦ', 'SERVER' ),
+       'servername'                => array( '0', 'TÊNMÁYCHỦ', 'SERVERNAME' ),
+       'scriptpath'                => array( '0', 'ĐƯỜNGDẪNSCRIPT', 'SCRIPTPATH' ),
+       'grammar'                   => array( '0', 'NGỮPHÁP:', 'GRAMMAR:' ),
+       'gender'                    => array( '0', 'GIỐNG:', 'GENDER:' ),
+       'notitleconvert'            => array( '0', '__KHÔNGCHUYỂNTÊN__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'          => array( '0', '__KHÔNGCHUYỂNNỘIDUNG__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'               => array( '1', 'TUẦNNÀY', 'CURRENTWEEK' ),
+       'localweek'                 => array( '1', 'TUẦNĐỊAPHƯƠNG', 'LOCALWEEK' ),
+       'revisionid'                => array( '1', 'SỐBẢN', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'NGÀYBẢN', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'NGÀYBẢN2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'THÁNGBẢN', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'THÁNGBẢN1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'NĂMBẢN', 'REVISIONYEAR' ),
+       'plural'                    => array( '0', 'SỐNHIỀU:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'URLĐỦ:', 'FULLURL:' ),
+       'displaytitle'              => array( '1', 'TÊNHIỂNTHỊ', 'DISPLAYTITLE' ),
+       'newsectionlink'            => array( '1', '__LIÊNKẾTMỤCMỚI__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__KHÔNGLIÊNKẾTMỤCMỚI__', '__NONEWSECTIONLINK__' ),
+       'currentversion'            => array( '1', 'BẢNNÀY', 'CURRENTVERSION' ),
+       'urlencode'                 => array( '0', 'MÃHÓAURL:', 'URLENCODE:' ),
+       'language'                  => array( '0', '#NGÔNNGỮ:', '#LANGUAGE:' ),
+       'contentlanguage'           => array( '1', 'NGÔNNGỮNỘIDUNG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'          => array( '1', 'CỠKHÔNGGIANTÊN:', 'CỠKGT:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'            => array( '1', 'SỐQUẢNLÝ', 'NUMBEROFADMINS' ),
+       'formatnum'                 => array( '0', 'PHÂNCHIASỐ', 'FORMATNUM' ),
+       'defaultsort'               => array( '1', 'XẾPMẶCĐỊNH:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                  => array( '0', 'ĐƯỜNGDẪNTẬPTIN', 'FILEPATH:' ),
+       'tag'                       => array( '0', 'thẻ', 'tag' ),
+       'hiddencat'                 => array( '1', '__THỂLOẠIẨN__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', 'CỠTHỂLOẠI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                  => array( '1', 'CỠTRANG', 'PAGESIZE' ),
+       'numberingroup'             => array( '1', 'CỠNHÓM', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'            => array( '1', '__ĐỔIHƯỚNGNHẤTĐỊNH__', '__STATICREDIRECT__' ),
+       'url_path'                  => array( '0', 'ĐƯỜNGDẪN', 'PATH' ),
 );
 
 $datePreferences = array(
@@ -301,7 +303,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ẩn sửa đổi đã tuần tra trong trang thay đổi gần đây',
 'tog-newpageshidepatrolled' => 'Ẩn trang đã tuần tra trong danh sách các trang mới',
 'tog-extendwatchlist' => 'Mở rộng danh sách theo dõi để hiển thị tất cả các thay đổi, chứ không chỉ các thay đổi gần đây',
-'tog-usenewrc' => 'Sử dụng Thay đổi gần đây nâng cao (cần JavaScript)',
+'tog-usenewrc' => 'Thu gọn các thay đổi theo trang trong thay đổi gần đây và danh sách theo dõi (cần JavaScript)',
 'tog-numberheadings' => 'Tự động đánh số các đề mục',
 'tog-showtoolbar' => 'Hiển thị thanh định dạng (JavaScript)',
 'tog-editondblclick' => 'Nhấn đúp để sửa đổi trang (JavaScript)',
@@ -309,17 +311,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Cho phép sửa đổi đề mục bằng cách bấm chuột phải trên tên đề mục (JavaScript)',
 'tog-showtoc' => 'Hiển thị mục lục (cho trang có trên 3 đề mục)',
 'tog-rememberpassword' => 'Nhớ thông tin đăng nhập của tôi trong trình duyệt này (cho đến $1 ngày)',
-'tog-watchcreations' => 'Tự động theo dõi trang tôi viết mới',
-'tog-watchdefault' => 'Tự động theo dõi trang tôi sửa',
-'tog-watchmoves' => 'Tự động theo dõi trang tôi di chuyển',
-'tog-watchdeletion' => 'Tự động theo dõi trang tôi xóa',
+'tog-watchcreations' => 'Tự động theo dõi các trang tôi viết mới và các tập tin tôi tải lên',
+'tog-watchdefault' => 'Tự động theo dõi các trang và tập tin tôi sửa',
+'tog-watchmoves' => 'Tự động theo dõi các trang và tập tin tôi di chuyển',
+'tog-watchdeletion' => 'Tự động theo dõi các trang và tập tin tôi xóa',
 'tog-minordefault' => 'Mặc định đánh dấu tất cả sửa đổi của tôi là sửa đổi nhỏ',
 'tog-previewontop' => 'Hiển thị phần xem thử nằm trên hộp sửa đổi',
 'tog-previewonfirst' => 'Hiện xem thử tại lần sửa đầu tiên',
 'tog-nocache' => 'Không lưu trang trong bộ nhớ đệm trình duyệt',
-'tog-enotifwatchlistpages' => 'Gửi thư cho tôi khi có thay đổi tại trang tôi theo dõi',
+'tog-enotifwatchlistpages' => 'Gửi thư cho tôi khi có thay đổi tại trang hoặc tập tin tôi theo dõi',
 'tog-enotifusertalkpages' => 'Gửi thư cho tôi khi có thay đổi tại trang thảo luận của tôi',
-'tog-enotifminoredits' => 'Gửi thư cho tôi cả những thay đổi nhỏ trong trang',
+'tog-enotifminoredits' => 'Gửi thư cho tôi cả những thay đổi nhỏ trong trang và tập tin',
 'tog-enotifrevealaddr' => 'Hiện địa chỉ thư điện tử của tôi trong thư thông báo',
 'tog-shownumberswatching' => 'Hiển thị số người đang xem',
 'tog-oldsig' => 'Chữ ký hiện tại:',
@@ -335,7 +337,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ẩn sửa đổi của thành viên đã đăng nhập khỏi danh sách theo dõi',
 'tog-watchlisthideanons' => 'Ẩn sửa đổi của người dùng vô danh khỏi danh sách theo dõi',
 'tog-watchlisthidepatrolled' => 'Ẩn sửa đổi đã tuần tra trong danh sách theo dõi',
-'tog-nolangconversion' => 'Tắt chuyển đổi biến thể',
 'tog-ccmeonemails' => 'Gửi bản sao cho tôi khi gửi thư điện tử cho người khác',
 'tog-diffonly' => 'Không hiển thị nội dung trang dưới phần so sánh phiên bản',
 'tog-showhiddencats' => 'Hiển thị thể loại ẩn',
@@ -560,6 +561,10 @@ $1',
 'youhavenewmessages' => 'Bạn có $1 ($2).',
 'newmessageslink' => 'tin nhắn mới',
 'newmessagesdifflink' => 'thay đổi gần nhất',
+'youhavenewmessagesfromusers' => 'Bạn có $1 từ {{PLURAL:$3|người dùng khác|$3 người dùng}} ($2).',
+'youhavenewmessagesmanyusers' => 'Bạn có $1 từ nhiều người dùng ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1}}tin nhắn mới',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|thay đổi|các thay đổi}} gần đây',
 'youhavenewmessagesmulti' => 'Bạn có tin nhắn mới ở $1',
 'editsection' => 'sửa',
 'editold' => 'sửa',
@@ -614,9 +619,9 @@ Có danh sách trang đặc biệt tại [[Special:SpecialPages|{{int:specialpag
 'dberrortext' => 'Đã xảy ra lỗi cú pháp trong truy vấn cơ sở dữ liệu.
 Có vẻ như nguyên nhân của vấn đề này xuất phát từ một lỗi trong phần mềm.
 Truy vấn vừa rồi là:
-<blockquote><tt>$1</tt></blockquote>
-từ hàm “<tt>$2</tt>”.
-Cơ sở dữ liệu  báo lỗi “<tt>$3: $4</tt>”.',
+<blockquote><code>$1</code></blockquote>
+từ hàm “<code>$2</code>”.
+Cơ sở dữ liệu  báo lỗi “<samp>$3: $4</samp>”.',
 'dberrortextcl' => 'Đã xảy ra lỗi cú pháp trong truy vấn cơ sở dữ liệu.
 Truy vấn vừa rồi là:
 “$1”
@@ -652,6 +657,8 @@ Xin hãy báo nó cho một [[Special:ListUsers/sysop|bảo quản viên]], tron
 'badarticleerror' => 'Không thể thực hiện được tác vụ như thế tại trang này.',
 'cannotdelete' => 'Không thể xóa trang hay tập tin “$1”. Có thể nó đã bị ai đó xóa rồi.',
 'cannotdelete-title' => 'Không thể xóa trang “$1”',
+'delete-hook-aborted' => 'Một phần bổ trợ phần mềm đã bỏ qua việc xóa này.
+Không có lý do nào được đưa ra.',
 'badtitle' => 'Tựa trang sai',
 'badtitletext' => 'Tựa trang yêu cầu không đúng, rỗng, hoặc là một liên kết ngôn ngữ hoặc liên kết wiki sai. Nó có thể chứa một hoặc nhiều ký tự mà tựa trang không thể sử dụng.',
 'perfcached' => 'Dữ liệu sau được lấy từ bộ nhớ đệm và có thể đã lỗi thời. Tối đa có sẵn {{PLURAL:$1|một kết quả|$1 kết quả}} trong bộ nhớ đệm.',
@@ -683,6 +690,8 @@ Lý do được cung cấp là ''$2''.",
 Bảo quản viên khóa nó đưa lý do là: “$3”.',
 'invalidtitle-knownnamespace' => 'Tựa trang không hợp lệ có không gian tên “$2” và văn bản “$3”',
 'invalidtitle-unknownnamespace' => 'Tựa trang không hợp lệ có không gian tên số $1 không rõ và văn bản “$2”',
+'exception-nologin' => 'Chưa đăng nhập',
+'exception-nologin-text' => 'Bạn cần phải đăng nhập để truy cập trang hoặc thực hiện tác vụ này tại wiki này.',
 
 # Virus scanner
 'virus-badscanner' => "Cấu hình sau: không nhận ra bộ quét virus: ''$1''",
@@ -702,6 +711,7 @@ Tài khoản của bạn đã mở.
 '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)',
 '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.',
 'externaldberror' => 'Có lỗi khi xác nhận cơ sở dữ liệu bên ngoài hoặc bạn không được phép cập nhật tài khoản bên ngoài.',
 'login' => 'Đăng nhập',
 'nav-login-createaccount' => 'Đăng nhập / Mở tài khoản',
@@ -943,6 +953,10 @@ hoặc [{{fullurl:{{FULLPAGENAME}}|action=edit}} sửa đổi trang này]</span>
 'noarticletext-nopermission' => 'Trang này hiện đang trống.
 Bạn có thể [[Special:Search/{{PAGENAME}}|tìm kiếm tựa trang này]] tại các trang khác,
 hoặc <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tìm kiếm các nhật trình liên quan]</span>.',
+'missing-revision' => 'Phiên bản #$1 của trang có tên “{{PAGENAME}}” không tồn tại.
+
+Lỗi này thường xuất hiện đối khi theo dõi liên kết lỗi thời đến phiên bản cũ của một trang đã bị xóa.
+Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].',
 'userpage-userdoesnotexist' => 'Tài khoản mang tên “<nowiki>$1</nowiki>” chưa được đăng ký. Xin hãy kiểm tra lại nếu bạn muốn tạo/sửa trang này.',
 'userpage-userdoesnotexist-view' => 'Tài khoản “$1” chưa được đăng ký.',
 'blocked-notice-logextract' => 'Người dùng này hiện đang bị cấm sửa đổi. Nhật trình cấm gần nhất được ghi ở dưới để tiện theo dõi:',
@@ -950,7 +964,6 @@ hoặc <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE
 * '''Firefox / Safari:''' Giữ phím ''Shift'' trong khi nhấn ''Reload'' (''Tải lại''), hoặc nhấn tổ hợp ''Ctrl-F5'' hay ''Ctrl-R'' (⌘R trên Mac)
 * '''Google Chrome:''' Nhấn tổ hợp ''Ctrl-Shift-R'' (⇧⌘R trên Mac)
 * '''Internet Explorer:''' Giữ phím ''Ctrl'' trong khi nhấn ''Refresh'', hoặc nhấn tổ hợp ''Ctrl-F5''
-* '''Konqueror:''' Nhấn nút ''Reload'' hoặc nhấn ''F5''
 * '''Opera:''' Xóa bộ nhớ đệm trong ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Mẹo:''' Sử dụng nút “{{int:showpreview}}” để kiểm thử bản CSS của bạn trước khi lưu trang.",
 'userjsyoucanpreview' => "'''Mẹo:''' Sử dụng nút “{{int:showpreview}}” để kiểm thử bản JS của bạn trước khi lưu trang.",
@@ -1067,6 +1080,7 @@ Những giá trị này sẽ bị bỏ đi.',
 'expansion-depth-exceeded-warning' => 'Trang bung bản mẫu sâu quá',
 'parser-unstrip-loop-warning' => 'Vòng lặp unstrip',
 'parser-unstrip-recursion-limit' => 'Đã vượt quá giới hạn về độ sâu đệ quy unstrip ($1)',
+'converter-manual-rule-error' => 'Lỗi được phát hiện trong quy tắc chuyển đổi ngôn ngữ thủ công',
 
 # "Undo" feature
 'undo-success' => 'Các sửa đổi có thể được lùi lại. Xin hãy kiểm tra phần so sánh bên dưới để xác nhận lại những gì bạn muốn làm, sau đó lưu thay đổi ở dưới để hoàn tất việc lùi lại sửa đổi.',
@@ -1253,6 +1267,10 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
 'editundo' => 'lùi sửa',
 'diff-multi' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản {{PLURAL:$2||của $2 thành viên}} ở giữa)',
 'diff-multi-manyusers' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản của hơn $2 thành viên ở giữa)',
+'difference-missing-revision' => 'Không tìm thấy {{PLURAL:$2|một phiên bản|$2 phiên bản}} trong khác biệt này ($1).
+
+Lỗi này thường xuất hiện đối khi theo dõi liên kết lỗi thời đến khác biệt giữa các bản của trang đã bị xóa.
+Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].',
 
 # Search results
 'searchresults' => 'Kết quả tìm kiếm',
@@ -1520,12 +1538,13 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'right-writeapi' => 'Sử dụng API để viết',
 'right-delete' => 'Xóa trang',
 'right-bigdelete' => 'Xóa trang có lịch sử lớn',
+'right-deletelogentry' => 'Xóa và phục hồi khoản mục nhật trình nào đó',
 'right-deleterevision' => 'Xóa và phục hồi phiên bản nào đó của trang',
 'right-deletedhistory' => 'Xem phần lịch sử đã xóa, mà không xem nội dung đi kèm',
 'right-deletedtext' => 'Xem văn bản đã xóa và các thay đổi giữa phiên bản đã xóa',
 'right-browsearchive' => 'Tìm kiếm trang đã bị xóa',
 'right-undelete' => 'Phục hồi trang',
-'right-suppressrevision' => 'Xem lại và phục hồi phiên bản mà Sysop không thấy',
+'right-suppressrevision' => 'Xem và phục hồi phiên bản mà bảo quản viên không thấy',
 'right-suppressionlog' => 'Xem nhật trình riêng tư',
 'right-block' => 'Cấm thành viên khác sửa đổi',
 'right-blockemail' => 'Cấm người dùng gửi thư điện tử',
@@ -1584,7 +1603,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'action-deletedhistory' => 'xem các phiên bản đã bị xóa của trang này',
 'action-browsearchive' => 'tìm kiếm trang đã bị xóa',
 'action-undelete' => 'phục hồi trang này',
-'action-suppressrevision' => 'duyệt và phục hồi phiên bản bị giấu này',
+'action-suppressrevision' => 'xem và phục hồi phiên bản ẩn này',
 'action-suppressionlog' => 'xem nhật trình ẩn giấu này',
 'action-block' => 'cấm không cho người dùng này sửa đổi',
 'action-protect' => 'thay đổi mức khóa của trang này',
@@ -1665,9 +1684,9 @@ Nhật trình xóa và di chuyển của trang này được ghi ở dưới đ
 việc tải lên và tải lên lại được ghi lại trong [[Special:Log/upload|nhật trình tải lên]], việc xóa đi được ghi trong [[Special:Log/delete|nhật trình xóa]].
 
 Để đưa tập tin vào trang, hãy dùng liên kết có một trong các dạng sau:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tập tin.jpg]]</nowiki></tt>''' để phiên bản đầy đủ của tập tin
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tập tin.png|200px|nhỏ|trái|văn bản thay thế]]</nowiki></tt>''' để dùng hình đã được co lại còn 200 điểm ảnh chiều rộng đặt trong một hộp ở lề bên trái với 'văn bản thay thế' dùng để mô tả
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tập tin.ogg]]</nowiki></tt>''' để liên kết trực tiếp đến tập tin mà không hiển thị nó",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tập tin.jpg]]</nowiki></code>''' để phiên bản đầy đủ của tập tin
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tập tin.png|200px|nhỏ|trái|văn bản thay thế]]</nowiki></code>''' để dùng hình đã được co lại còn 200 điểm ảnh chiều rộng đặt trong một hộp ở lề bên trái với 'văn bản thay thế' dùng để mô tả
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tập tin.ogg]]</nowiki></code>''' để liên kết trực tiếp đến tập tin mà không hiển thị nó",
 'upload-permitted' => 'Các định dạng tập tin được phép tải lên: $1.',
 'upload-preferred' => 'Các định dạng tập tin nên dùng: $1.',
 'upload-prohibited' => 'Các định dạng tập tin bị cấm: $1.',
@@ -1711,20 +1730,20 @@ Chỉ chấp nhận {{PLURAL:$3|loại tập tin|các loại tập tin}} sau: $2
 'largefileserver' => 'Tập tin này quá lớn so với khả năng phục vụ của máy chủ.',
 'emptyfile' => 'Tập tin bạn vừa mới tải lên có vẻ trống không. Điều này có thể xảy ra khi bạn đánh sai tên tập tin. Xin hãy chắc chắn rằng bạn thật sự muốn tải lên tập tin này.',
 'windows-nonascii-filename' => 'Wiki này không hỗ trợ ký tự đặc biệt trong tên tập tin.',
-'fileexists' => "Một tập tin với tên này đã tồn tại, xin hãy kiểm tra lại '''<tt>[[:$1]]</tt>''' nếu bạn không chắc bạn có muốn thay đổi nó hay không.
-[[$1|thumb]]",
-'filepageexists' => "Trang miêu tả của tập tin này đã được tạo tại '''<tt>[[:\$1]]</tt>''', nhưng hiện không có tập tin nào có tên như vậy.
-Những gì bạn ghi trong ô \"Tóm tắt tập tin\" sẽ không hiện ra ở trang miêu tả.
+'fileexists' => 'Một tập tin với tên này đã tồn tại, xin hãy kiểm tra lại <strong>[[:$1]]</strong> nếu bạn không chắc bạn có muốn thay đổi nó hay không.
+[[$1|thumb]]',
+'filepageexists' => 'Trang miêu tả của tập tin này đã được tạo tại <strong>[[:$1]]</strong>, nhưng hiện không có tập tin nào có tên như vậy.
+Những gì bạn ghi trong ô "Tóm tắt tập tin" sẽ không hiện ra ở trang miêu tả.
 Để khiến nó hiển thị, bạn cần phải sửa đổi trang đó bằng tay.
-[[\$1|thumb]]",
-'fileexists-extension' => "Hiện có một tập tin trùng tên: [[$2|thumb]]
-* Tên tập tin đang tải lên: '''<tt>[[:$1]]</tt>'''
-* Tên tập tin có từ trước: '''<tt>[[:$2]]</tt>'''
-Xin hãy chọn một tên tập tin khác.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Hiện có một tập tin trùng tên: [[$2|thumb]]
+* Tên tập tin đang tải lên: <strong>[[:$1]]</strong>
+* Tên tập tin có từ trước: <strong>[[:$2]]</strong>
+Xin hãy chọn một tên tập tin khác.',
 'fileexists-thumbnail-yes' => "Tập tin này có vẻ là hình có kích thước thu gọn ''(hình thu nhỏ)''. [[$1|thumb]]
-Xin kiểm tra lại tập tin '''<tt>[[:$1]]</tt>'''.
+Xin kiểm tra lại tập tin <strong>[[:$1]]</strong>.
 Nếu tập tin được kiểm tra trùng với hình có kích cỡ gốc thì không cần thiết tải lên một hình thu nhỏ khác.",
-'file-thumbnail-no' => "Tên tập tin bắt đầu bằng '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Tên tập tin bắt đầu bằng <strong>$1</strong>.
 Có vẻ đây là bản thu nhỏ của hình gốc ''(thumbnail)''.
 Nếu bạn có hình ở độ phân giải tối đa, xin hãy tải bản đó lên, nếu không xin hãy đổi lại tên tập tin.",
 'fileexists-forbidden' => 'Đã có tập tin với tên gọi này, và nó không thể bị ghi đè.
@@ -1743,7 +1762,7 @@ Nếu bạn vẫn muốn tải tập tin của bạn lên, xin hãy quay lại v
 'uploadfromurl-queued' => 'Tập tin của bạn đã được xếp vào hàng đợi tải lên.',
 'uploaddisabledtext' => 'Chức năng tải tập tin đã bị tắt.',
 'php-uploaddisabledtext' => 'Việc tải tập tin trong PHP đã bị tắt. Xin hãy kiểm tra lại thiết lập file_uploads.',
-'uploadscripted' => 'Tập tin này có chứa mã HTML hoặc script có thể khiến trình duyệt web thông dịch sai.',
+'uploadscripted' => 'Tập tin này có chứa mã HTML hoặc kịch bản có thể khiến trình duyệt web thông dịch sai.',
 'uploadvirus' => 'Tập tin có virút! Chi tiết: $1',
 'uploadjava' => 'Tập tin ZIP này chứa một tập tin Java .class.
 Không được phép tải lên các tập tin Java, bởi vì chúng có thể vượt qua các hạn chế bảo mật.',
@@ -1833,6 +1852,7 @@ Nếu vẫn còn bị lỗi, xin hãy liên hệ với một [[Special:ListUsers
 'lockmanager-fail-releaselock' => 'Không thể thả khóa cho “$1”.',
 'lockmanager-fail-db-bucket' => 'Không thể liên lạc với đủ cơ sở dữ liệu khóa trong nhóm $1.',
 'lockmanager-fail-db-release' => 'Không thể thả các chìa khóa trên cơ sở dữ liệu $1.',
+'lockmanager-fail-svr-acquire' => 'Không thể lấy các chìa khóa trên máy chủ $1.',
 'lockmanager-fail-svr-release' => 'Không thể thả các chìa khóa trên máy chủ $1.',
 
 # ZipDirectoryReader
@@ -1950,6 +1970,7 @@ Có lẽ bạn muốn miêu tả nó trên [$2 trang miêu tả tập tin] tại
 'shared-repo-from' => 'tại $1',
 'shared-repo' => 'kho lưu trữ dùng chung',
 'filepage.css' => '/* Mã CSS tại đây sẽ ảnh hướng đến trang miêu tả tập tin, cũng như các wiki khách bên ngoài dựa trên wiki này */',
+'upload-disallowed-here' => 'Rất tiếc, bạn không có thể ghi đè lên hình ảnh này.',
 
 # File reversion
 'filerevert' => 'Lùi lại phiên bản của $1',
@@ -1983,7 +2004,7 @@ Có lẽ bạn muốn miêu tả nó trên [$2 trang miêu tả tập tin] tại
 
 # MIME search
 'mimesearch' => 'Tìm kiếm theo định dạng',
-'mimesearch-summary' => 'Trang này có khả năng lọc tập tin theo kiểu MIME. Đầu vào: kiểu-nội-dung/kiểu-phụ, v.d. <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Trang này có khả năng lọc tập tin theo kiểu MIME. Đầu vào: kiểu-nội-dung/kiểu-phụ, v.d. <code>image/jpeg</code>.',
 'mimetype' => 'Kiểu MIME:',
 'download' => 'tải về',
 
@@ -2031,7 +2052,7 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
 
 'disambiguations' => 'Trang liên kết đến trang định hướng',
 'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Các trang này có liên kết đến một '''trang định hướng'''. Nên sửa các liên kết này để chỉ đến một trang đúng nghĩa hơn.<br />Các trang định hướng là trang sử dụng những bản mẫu được liệt kê ở [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Các trang này có liên kết đến ít nhất một '''trang định hướng''', những trang này có thể có liên kết đến các trang đúng nghĩa hơn.<br />Các trang định hướng là trang sử dụng những bản mẫu được liệt kê ở [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Đổi hướng kép',
 'doubleredirectstext' => 'Trang này liệt kê các trang đổi hướng đến một trang đổi hướng khác.
@@ -2056,6 +2077,7 @@ Các mục <del>bị gạch bỏ</del> là các trang đã được sửa.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
 'ncategories' => '$1 {{PLURAL:$1|thể loại|thể loại}}',
+'ninterwikis' => '$1 liên kết liên wiki',
 'nlinks' => '$1 {{PLURAL:$1|liên kết|liên kết}}',
 'nmembers' => '$1 {{PLURAL:$1|trang|trang}}',
 'nrevisions' => '$1 {{PLURAL:$1|phiên bản|phiên bản}}',
@@ -2084,6 +2106,7 @@ Các mục <del>bị gạch bỏ</del> là các trang đã được sửa.',
 'mostlinkedtemplates' => 'Bản mẫu được liên kết đến nhiều nhất',
 'mostcategories' => 'Các trang có nhiều thể loại nhất',
 'mostimages' => 'Tập tin được liên kết đến nhiều nhất',
+'mostinterwikis' => 'Các trang có nhiều liên kết liên wiki nhất',
 'mostrevisions' => 'Các trang được sửa đổi nhiều lần nhất',
 'prefixindex' => 'Tất cả các trang trùng với tiền tố',
 'prefixindex-namespace' => 'Tất cả các trang trùng với tiền tố (không gian $1)',
@@ -2181,7 +2204,7 @@ Xem thêm [[Special:WantedCategories|thể loại cần thiết]].',
 'linksearch-pat' => 'Mẫu liên kết:',
 'linksearch-ns' => 'Không gian tên:',
 'linksearch-ok' => 'Tìm kiếm',
-'linksearch-text' => "Bạn có thể sử dụng ký tự đại diện (''wildcard''), ví dụ “*.wikipedia.org”; ít nhất phải có tên miền cấp cao nhất, thí dụ “*.org”.<br />Các giao thức này được hỗ trợ: <tt>$1</tt>; vui lòng không đưa giao thức vào truy vấn.",
+'linksearch-text' => "Bạn có thể sử dụng ký tự đại diện (''wildcard''), ví dụ “*.wikipedia.org”; ít nhất phải có tên miền cấp cao nhất, thí dụ “*.org”.<br />Các giao thức này được hỗ trợ: <code>$1</code>; vui lòng không đưa giao thức vào truy vấn.",
 'linksearch-line' => '$1 được liên kết từ $2',
 'linksearch-error' => "Chỉ được sử dụng ký tự đại diện (''wildcard'') vào đầu tên miền (''hostname'').",
 
@@ -2227,6 +2250,8 @@ Có [[{{MediaWiki:Listgrouprights-helppage}}|thông tin thêm]] về từng nhó
 'mailnologin' => 'Không có địa chỉ gửi thư',
 'mailnologintext' => 'Bạn phải [[Special:UserLogin|đăng nhập]] và khai báo một địa chỉ thư điện tử hợp lệ trong phần [[Special:Preferences|tùy chọn cá nhân]] thì mới gửi được thư cho người khác.',
 'emailuser' => 'Gửi thư cho người này',
+'emailuser-title-target' => '{{GENDER:$1}}Gửi thư cho người dùng này',
+'emailuser-title-notarget' => 'Gửi thư cho người dùng',
 'emailpage' => 'Gửi thư',
 'emailpagetext' => 'Mẫu dưới đây sẽ gửi một bức thư điện tử tới người dùng này.
 Địa chỉ thư điện tử mà bạn đã cung cấp trong [[Special:Preferences|tùy chọn cá nhân của mình]] sẽ xuất hiện trong phần địa chỉ “Người gửi” của bức thư, do đó người nhận sẽ có thể trả lời trực tiếp cho bạn.',
@@ -2372,6 +2397,8 @@ hãy cẩn trọng khi thực hiện.',
 'rollback' => 'Lùi tất cả sửa đổi',
 'rollback_short' => 'Lùi tất cả',
 'rollbacklink' => 'lùi tất cả',
+'rollbacklinkcount' => 'lùi tất cả $1 sửa đổi',
+'rollbacklinkcount-morethan' => 'lùi tất cả hơn $1 sửa đổi',
 'rollbackfailed' => 'Lùi sửa đổi không thành công',
 'cantrollback' => 'Không lùi sửa đổi được;
 người viết trang cuối cùng cũng là tác giả duy nhất của trang này.',
@@ -2861,8 +2888,9 @@ Tất cả những lần nhập trang từ wiki khác được ghi lại ở [[S
 'import-interwiki-source' => 'Wiki/trang mã nguồn:',
 'import-interwiki-history' => 'Sao chép tất cả các phiên bản cũ của trang này',
 'import-interwiki-templates' => 'Gồm tất cả các bản mẫu',
-'import-interwiki-submit' => 'Nhập trang',
+'import-interwiki-submit' => 'Nhập',
 'import-interwiki-namespace' => 'Không gian tên đích:',
+'import-interwiki-rootpage' => 'Trang gốc đích (tùy chọn):',
 'import-upload-filename' => 'Tên tập tin:',
 'import-comment' => 'Lý do:',
 'importtext' => 'Xin hãy xuất tập tin từ wiki nguồn dùng [[Special:Export|công cụ xuất]].
@@ -2895,6 +2923,9 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'import-error-interwiki' => 'Trang “$1” không được nhập vì tên của nó được dành riêng cho liên kết ngoài (liên wiki).',
 'import-error-special' => 'Trang “$1” không được nhập vì nó thuộc về không gian tên đặc biệt không cho phép các trang không mặc định.',
 'import-error-invalid' => 'Trang “$1” không được nhập vì tên của nó không hợp lệ.',
+'import-options-wrong' => '{{PLURAL:$2|Tùy chọn|Các tùy chọn}} có vấn đề: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Trang đích không hợp lệ.',
+'import-rootpage-nosubpage' => 'Không gian tên “$1” của trang gốc không cho phép các trang con.',
 
 # Import log
 'importlogpage' => 'Nhật trình nhập trang',
@@ -2979,7 +3010,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'tooltip-watchlistedit-raw-submit' => 'Cập nhật danh sách theo dõi',
 'tooltip-recreate' => 'Tạo lại trang dù cho nó vừa bị xóa',
 'tooltip-upload' => 'Bắt đầu tải lên',
-'tooltip-rollback' => '"Lùi tất cả" sẽ lùi mọi sửa đổi của người sửa đổi cuối cùng chỉ bằng một cú nhấp chuột.',
+'tooltip-rollback' => '“Lùi tất cả” sẽ lùi mọi sửa đổi của người sửa đổi cuối cùng chỉ bằng một cú nhấp chuột.',
 'tooltip-undo' => '"Lùi lại" sẽ lùi sửa đổi này và mở trang sửa đổi ở chế độ xem thử. Cho phép thêm lý do vào tóm lược.',
 'tooltip-preferences-save' => 'Lưu tùy chọn',
 'tooltip-summary' => 'Hãy nhập câu tóm lược',
@@ -3046,16 +3077,35 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 
 # Info page
 'pageinfo-title' => 'Thông tin về “$1”',
-'pageinfo-header-edits' => 'Lần sửa',
-'pageinfo-header-watchlist' => 'Danh sách theo dõi',
-'pageinfo-header-views' => 'Lần xem',
-'pageinfo-subjectpage' => 'Trang',
-'pageinfo-talkpage' => 'Trang thảo luận',
-'pageinfo-watchers' => 'Số người theo dõi',
-'pageinfo-edits' => 'Số lần sửa đổi',
-'pageinfo-authors' => 'Số tác giả riêng',
+'pageinfo-header-basic' => 'Thông tin cơ bản',
+'pageinfo-header-edits' => 'Lịch sử sửa đổi',
+'pageinfo-header-restrictions' => 'Mức khóa trang',
+'pageinfo-header-properties' => 'Thuộc tính trang',
+'pageinfo-display-title' => 'Tên hiển thị',
+'pageinfo-default-sort' => 'Từ khóa sắp xếp mặc định',
+'pageinfo-length' => 'Chiều dài của trang (byte)',
+'pageinfo-article-id' => 'Mã số trang',
+'pageinfo-robot-policy' => 'Trạng thái công cụ tìm kiếm',
+'pageinfo-robot-index' => 'Có thể ghi chỉ mục',
+'pageinfo-robot-noindex' => 'Không thể ghi chỉ mục',
 'pageinfo-views' => 'Số lần xem',
-'pageinfo-viewsperedit' => 'Số lần xem mỗi sửa đổi',
+'pageinfo-watchers' => 'Số người theo dõi trang',
+'pageinfo-redirects-name' => 'Số trang đổi hướng đến trang này',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Số trang con của trang này',
+'pageinfo-subpages-value' => '$1 ($2 đổi hướng; $3 không đổi hướng)',
+'pageinfo-firstuser' => 'Người dùng tạo trang',
+'pageinfo-firsttime' => 'Lúc tạo trang',
+'pageinfo-lastuser' => 'Người dùng cuối cùng sửa đổi',
+'pageinfo-lasttime' => 'Lúc sửa đổi cuối cùng',
+'pageinfo-edits' => 'Tổng số lần sửa đổi',
+'pageinfo-authors' => 'Tổng số tác giả riêng',
+'pageinfo-recent-edits' => 'Số lần sửa đổi gần đây (trong $1 qua)',
+'pageinfo-recent-authors' => 'Số người dùng sửa đổi gần đây',
+'pageinfo-restriction' => 'Mức khóa trang (<code>{{lcfirst:$1}}</code>)',
+'pageinfo-magic-words' => 'Từ thần chú ($1)',
+'pageinfo-hidden-categories' => 'Thể loại ẩn ($1)',
+'pageinfo-templates' => 'Bản mẫu được nhúng ($1)',
 
 # Skin names
 'skinname-standard' => 'Cổ điển',
@@ -3102,21 +3152,25 @@ $1',
 Nếu thực thi nó máy tính của bạn có thể bị tiếm quyền.",
 'imagemaxsize' => "Giới hạn cỡ hình:<br />''(trên trang miêu tả tập tin)''",
 'thumbsize' => 'Cỡ hình thu nhỏ:',
+'widthheight' => '$1×$2',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|trang|trang}}',
 'file-info' => 'kích thước tập tin: $1, kiểu MIME: $2',
-'file-info-size' => '$1 × $2 điểm ảnh, kích thước tập tin: $3, kiểu MIME: $4',
-'file-info-size-pages' => '$1 × $2 điểm ảnh, kích thước tập tin: $3, kiểu MIME: $4, $5 trang',
+'file-info-size' => '$1×$2 điểm ảnh, kích thước tập tin: $3, kiểu MIME: $4',
+'file-info-size-pages' => '$1×$2 điểm ảnh, kích thước tập tin: $3, kiểu MIME: $4, $5 trang',
 'file-nohires' => 'Không có độ phân giải cao hơn.',
-'svg-long-desc' => 'tập tin SVG, $1 × $2 điểm ảnh trên danh nghĩa, kích thước: $3',
+'svg-long-desc' => 'tập tin SVG, $1×$2 điểm ảnh trên danh nghĩa, kích thước: $3',
+'svg-long-desc-animated' => 'tập tin hình động SVG, $1×$2 điểm ảnh trên danh nghĩa, kích thước: $3',
 'show-big-image' => 'Độ phân giải tối đa',
 'show-big-image-preview' => 'Kích thước của ảnh xem thử: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Độ phân giải|Các độ phân giải}} khác: $1.',
-'show-big-image-size' => '$1 × $2 điểm ảnh',
+'show-big-image-size' => '$1×$2 điểm ảnh',
 'file-info-gif-looped' => 'có lặp',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|khung ảnh|khung ảnh}}',
 'file-info-png-looped' => 'có lặp',
 'file-info-png-repeat' => 'chơi $1 lần',
 'file-info-png-frames' => '$1 khung ảnh',
+'file-no-thumb-animation' => "'''Lưu ý: Do hạn chế kỹ thuật, các hình nhỏ của tập tin này sẽ không phải là hình động.'''",
+'file-no-thumb-animation-gif' => "'''Lưu ý: Do hạn chế kỹ thuật, các hình nhỏ của những hình GIF có độ phân giải cao, chẳng hạn tập tin này, sẽ không phải là hình động.'''",
 
 # Special:NewFiles
 'newimages' => 'Trang trưng bày hình ảnh mới',
@@ -3131,6 +3185,7 @@ Nếu thực thi nó máy tính của bạn có thể bị tiếm quyền.",
 'sp-newimages-showfrom' => 'Trưng bày những tập tin mới, bắt đầu từ lúc $2, ngày $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'video-dims' => '$1, $2×$3',
 'seconds-abbrev' => '$1s',
 'minutes-abbrev' => '$1m',
 'hours-abbrev' => '$1h',
@@ -3707,6 +3762,7 @@ Xin hãy xác nhận bạn thực sự muốn tạo lại trang này.",
 'confirm-unwatch-top' => 'Bạn có muốn gỡ trang này khỏi danh sách theo dõi của bạn?',
 
 # Separators for various lists, etc.
+'autocomment-prefix' => '–&#32;',
 'ellipsis' => '…',
 
 # Multipage image navigation
@@ -3736,6 +3792,17 @@ Xin hãy xác nhận bạn thực sự muốn tạo lại trang này.",
 # Size units
 'size-kilobytes' => '$1 kB',
 
+# Bitrate units
+'bitrate-bits' => '$1 bps',
+'bitrate-kilobits' => '$1 kbps',
+'bitrate-megabits' => '$1 Mbps',
+'bitrate-gigabits' => '$1 Gbps',
+'bitrate-terabits' => '$1 Tbps',
+'bitrate-petabits' => '$1 Pbps',
+'bitrate-exabits' => '$1 Ebps',
+'bitrate-zetabits' => '$1 Zbps',
+'bitrate-yottabits' => '$1 Ybps',
+
 # Live preview
 'livepreview-loading' => 'Đang tải…',
 'livepreview-ready' => 'Đang tải… Xong!',
@@ -3857,6 +3924,8 @@ hoặc [//www.gnu.org/licenses/old-licenses/gpl-2.0.html đọc nó trực tuy
 'version-entrypoints' => 'Các URL lối vào',
 'version-entrypoints-header-entrypoint' => 'Lối vào',
 'version-entrypoints-header-url' => 'URL',
+'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',
@@ -3871,7 +3940,7 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'fileduplicatesearch-legend' => 'Tìm kiếm tập tin trùng lắp',
 'fileduplicatesearch-filename' => 'Tên tập tin:',
 'fileduplicatesearch-submit' => 'Tìm kiếm',
-'fileduplicatesearch-info' => '$1 × $2 điểm ảnh<br />Kích thước tập tin: $3<br />Kiểu MIME: $4',
+'fileduplicatesearch-info' => '$1×$2 điểm ảnh<br />Kích thước tập tin: $3<br />Kiểu MIME: $4',
 'fileduplicatesearch-result-1' => 'Không có bản sao y hệt với tập tin “$1”.',
 'fileduplicatesearch-result-n' => 'Có {{PLURAL:$2|1 bản sao|$2 bản sao}} y hệt với tập tin “$1”.',
 'fileduplicatesearch-noresults' => 'Không tìm thấy tập tin nào tên “$1”.',
@@ -4018,9 +4087,12 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'api-error-empty-file' => 'Bạn đã gửi tập tin rỗng.',
 'api-error-emptypage' => 'Không cho phép tạo mới các trang rỗng.',
 'api-error-fetchfileerror' => 'Lỗi nội bộ: Việc tải tập tin bị thất bại.',
+'api-error-fileexists-forbidden' => 'Một tập tin với tên “$1” đã tồn tại; không thể ghi đè nó.',
+'api-error-fileexists-shared-forbidden' => 'Một tập tin với tên “$1” đã tồn tại ở kho tập tin dùng chung; không thể ghi đè nó.',
 'api-error-file-too-large' => 'Bạn đã gửi tập tin lớn quá hạn.',
 'api-error-filename-tooshort' => 'Tên tập tin ngắn quá.',
 'api-error-filetype-banned' => 'Kiểu tập tin này đã bị cấm.',
+'api-error-filetype-banned-type' => '{{PLURAL:$4|Định dạng|Các định dạng}} $1 không được chấp nhận. Chỉ chấp nhận {{PLURAL:$3|loại tập tin|các loại tập tin}} sau: $2.',
 'api-error-filetype-missing' => 'Tên tập tin bị thiếu phần mở rộng.',
 'api-error-hookaborted' => 'Sửa đổi của bạn bị hook phần mở rộng hủy bỏ.',
 'api-error-http' => 'Lỗi nội bộ: Không thể kết nối với dịch vụ.',
index d382711..7f0775d 100644 (file)
@@ -1244,9 +1244,9 @@ Pads [[Special:Watchlist|galädaliseda olik]] '''pakazetons'''.",
 Ad logön u sukön ragivis ya pelöpükölis, gebolös [[Special:FileList|lisedi ragivas pelöpüköl]]; (dönu)löpukams palisedons i su [[Special:Log/upload|jenotalised löpükamas]], moükams su [[Special:Log/delete|jenotalised moükamas]].
 
 Ad pladön ragivi ini pad semik, gebolös yümi fomätü:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ragiv.jpg]]</nowiki></tt>''' ad pladön ragivi in fomät lölöfik;
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ragiv.png|200px|thumb|left|vödem]]</nowiki></tt>''' ad pladön ragivi in fomät smalik (vidotü pixels 200) in bügil nedeto labü „vödem“ as bepenam;
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Ragiv.ogg]]</nowiki></tt>''' ad yümön nemediko ad ragiv nes jonön oni.",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ragiv.jpg]]</nowiki></code>''' ad pladön ragivi in fomät lölöfik;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ragiv.png|200px|thumb|left|vödem]]</nowiki></code>''' ad pladön ragivi in fomät smalik (vidotü pixels 200) in bügil nedeto labü „vödem“ as bepenam;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Ragiv.ogg]]</nowiki></code>''' ad yümön nemediko ad ragiv nes jonön oni.",
 'upload-permitted' => 'Ragivasots pedälöl: $1.',
 'upload-preferred' => 'Ragivasots buik: $1.',
 'upload-prohibited' => 'Ragivasots peproiböl: $1.',
@@ -1275,20 +1275,20 @@ Ad pladön ragivi ini pad semik, gebolös yümi fomätü:
 'large-file' => 'Pakomandos, das ragivs no binons gretikums ka mö $1; ragiv at binon mö $2.',
 'largefileserver' => 'Ragiv at binon tu gretik: dünanünöm no kanon dälon oni.',
 'emptyfile' => 'Ragiv fa ol pelöpüköl binon jiniko vägik. Kod atosa äbinon ba pöl pö ragivanem. Vilol-li jenöfo löpükön ragivi at?',
-'fileexists' => "Ragiv labü nem at ya dabinon, logolös, begö! '''<tt>[[:$1]]</tt>''' üf no sevol fümiko, va vilol votükön oni.
-[[$1|thumb]]",
-'filepageexists' => "Bepenamapad ragiva at ya pejafon ('''<tt>[[:$1]]</tt>'''), ab ragiv nonik labü nem at dabinon anu.
+'fileexists' => 'Ragiv labü nem at ya dabinon, logolös, begö! <strong>[[:$1]]</strong> üf no sevol fümiko, va vilol votükön oni.
+[[$1|thumb]]',
+'filepageexists' => 'Bepenamapad ragiva at ya pejafon (<strong>[[:$1]]</strong>), ab ragiv nonik labü nem at dabinon anu.
 Naböfodönuam olik no opubon su bepenamapad.
 Ad pübön oni us, onedol redakön oni ol it.
-[[$1|thumb]]",
-'fileexists-extension' => "Ragiv labü nem sümik ya dabinon: [[$2|thumb]]
-* Nem ragiva palöpüköl: '''<tt>[[:$1]]</tt>'''
-* Nem ragiva dabinöl: '''<tt>[[:$2]]</tt>'''
-Välolös, begö! nemi difik.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Ragiv labü nem sümik ya dabinon: [[$2|thumb]]
+* Nem ragiva palöpüköl: <strong>[[:$1]]</strong>
+* Nem ragiva dabinöl: <strong>[[:$2]]</strong>
+Välolös, begö! nemi difik.',
 'fileexists-thumbnail-yes' => "Ragiv at binon jiniko magoda gretota smalik ''(magodil)''. [[$1|thumb]]
-Logolös, begö! ragivi ya dabinöli: '''<tt>[[:$1]]</tt>'''.
+Logolös, begö! ragivi ya dabinöli: <strong>[[:$1]]</strong>.
 If ragiv ya dabinöli binon magod ot gretota rigik, no zesüdos ad löpükön magodili pluik.",
-'file-thumbnail-no' => "Ragivanem primon me '''<tt>$1</tt>'''. Binon jiniko magod gretota smalik ''(magodil)''.
+'file-thumbnail-no' => "Ragivanem primon me <strong>$1</strong>. Binon jiniko magod gretota smalik ''(magodil)''.
 Üf labol magodi at gretota rigik, löpükölos oni, pläo votükolös ragivanemi.",
 'fileexists-forbidden' => 'Ragiv labü nem at ya dabinon e no dalon paplaädön.
 If nog vilol lopükön ragivi olik, geikolös e gebolös nemi votik. [[File:$1|thumb|center|$1]]',
@@ -1415,7 +1415,7 @@ Lised dono jonon {{PLURAL:$1|padayümi balid|padayümis balid $1}} te lü ragiv
 # MIME search
 'mimesearch' => 'Sukön (MIME)',
 'mimesearch-summary' => 'Pad at mögükon ragivisulami ma MIME-sot.
-Primanünods: ninädasot/donasot, a.s. <tt>image/jpeg</tt>.',
+Primanünods: ninädasot/donasot, a.s. <code>image/jpeg</code>.',
 'mimetype' => 'Klad ela MIME:',
 'download' => 'donükön',
 
@@ -1597,7 +1597,7 @@ Logolös i [[Special:WantedCategories|klads pevilöl]].',
 'linksearch-ns' => 'Nemaspad:',
 'linksearch-ok' => 'Suk',
 'linksearch-text' => 'WilStelüls kanons pagebön, a.s. „*.wikipedia.org“.<br />
-Protoks pestütöl: <tt>$1</tt>',
+Protoks pestütöl: <code>$1</code>',
 'linksearch-line' => '$1 labon yümi se $2',
 'linksearch-error' => 'Stelüls kanons pubön te lä prim lotidiananema.',
 
@@ -2299,10 +2299,6 @@ Pad luveratiko ninädon yümi lü bevüresodatopäd plödik in blägalised.',
 
 # Info page
 'pageinfo-header-edits' => 'Redakams',
-'pageinfo-header-watchlist' => 'Galädalised',
-'pageinfo-header-views' => 'Logams',
-'pageinfo-subjectpage' => 'Pad',
-'pageinfo-talkpage' => 'Bespikapad',
 
 # Patrolling
 'markaspatrolleddiff' => 'Zepön',
index 176c3f1..460de6a 100644 (file)
@@ -10,6 +10,8 @@
  * @author 2Q
  * @author Andrijko Z.
  * @author Comp1089
+ * @author Erdemaslancan
+ * @author Paivud
  * @author Trần Nguyễn Minh Huy
  */
 
@@ -17,582 +19,832 @@ $fallback = 'fi';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Gạch chân liên kết:',
+'tog-underline' => 'Link underlining',
+
+'underline-always' => 'Alõzii',
+'underline-never' => 'Eb kõzniid',
 
 # Dates
-'january'       => 'janvaari',
-'february'      => 'fevraaľi',
-'march'         => 'martti',
-'april'         => 'aprilli',
-'may_long'      => 'mai',
-'june'          => 'juńi',
-'july'          => 'juľi',
-'august'        => 'augusti',
-'september'     => 'senťaabri',
-'october'       => 'okťaabri',
-'november'      => 'nojaabri',
-'december'      => 'dekaabri',
-'january-gen'   => 'janvaarii',
-'february-gen'  => 'fevraalii',
-'march-gen'     => 'martii',
-'april-gen'     => 'aprillii',
-'may-gen'       => 'maja',
-'june-gen'      => 'junii',
-'july-gen'      => 'juľii',
-'august-gen'    => 'augustii',
+'sunday' => 'Nätilpäivä',
+'monday' => 'Esmezarci',
+'tuesday' => 'Tõizarci',
+'wednesday' => 'Kõlmõzpäivä',
+'thursday' => 'Nelläzpäivä',
+'friday' => 'Viďďezpäivä',
+'saturday' => 'Laukopäivä',
+'sun' => 'Nät',
+'mon' => 'Esm',
+'tue' => 'Tõi',
+'wed' => 'Kõl',
+'thu' => 'Nel',
+'fri' => 'Viď',
+'sat' => 'Lau',
+'january' => 'janvaari',
+'february' => 'fevraaľi',
+'march' => 'martti',
+'april' => 'aprilli',
+'may_long' => 'mai',
+'june' => 'juńi',
+'july' => 'juľi',
+'august' => 'augusti',
+'september' => 'senťaabri',
+'october' => 'okťaabri',
+'november' => 'nojaabri',
+'december' => 'dekaabri',
+'january-gen' => 'janvaarii',
+'february-gen' => 'fevraalii',
+'march-gen' => 'martii',
+'april-gen' => 'aprillii',
+'may-gen' => 'maja',
+'june-gen' => 'junii',
+'july-gen' => 'juľii',
+'august-gen' => 'augustii',
 'september-gen' => 'senťaabrii',
-'october-gen'   => 'okťaabrii',
-'november-gen'  => 'nojaabrii',
-'december-gen'  => 'dekaabrii',
-'jan'           => 'janvaari',
-'feb'           => 'fevraali',
-'mar'           => 'martti',
-'apr'           => 'aprilli',
-'may'           => 'mai',
-'jun'           => 'juni',
-'jul'           => 'juľi',
-'aug'           => 'augusti',
-'sep'           => 'senťaabri',
-'oct'           => 'okťaabri',
-'nov'           => 'nojaabri',
-'dec'           => 'dekaabri',
+'october-gen' => 'okťaabrii',
+'november-gen' => 'nojaabrii',
+'december-gen' => 'dekaabrii',
+'jan' => 'janvaari',
+'feb' => 'fevraali',
+'mar' => 'martti',
+'apr' => 'aprilli',
+'may' => 'mai',
+'jun' => 'juni',
+'jul' => 'juľi',
+'aug' => 'augusti',
+'sep' => 'senťaabri',
+'oct' => 'okťaabri',
+'nov' => 'nojaabri',
+'dec' => 'dekaabri',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Gruppa|Gruppad}}',
-'category_header'        => 'Tšuľľed, kummad õvad gruppaz "$1"',
-'subcategories'          => 'Alagruppad',
-'hidden-categories'      => '{{PLURAL:$1|Salautõttu gruppa|Salautõtud gruppad}}',
-'category-subcat-count'  => '{{PLURAL:$2|Senez gruppaz on ainult vahtiaava alagruppa.|{{PLURAL:$1|Vahtiaava alagruppa kuulub|Vahtiaava $1 alagruppaa kuuluvad}} sihee gruppaa. Alagruppaďďe tšisla gruppaza on $2.}}',
-'category-article-count' => '{{PLURAL:$2|Senez gruppaz on ainult vahtiaava tšültši.|{{PLURAL:$1|Vahtiaava alagruppa kuulub|Vahtiaava $1 tšültšiä kuuluvad}} sihee gruppaa. Tšültšije tšisla gruppaza on $2.}}',
+'pagecategories' => '{{PLURAL:$1|Gruppa|Gruppad}}',
+'category_header' => 'Cuľľed, kummad õvad gruppaz "$1"',
+'subcategories' => 'Alagruppad',
+'category-media-header' => 'Mediafailid, kummad õvad gruppaz "$1"',
+'category-empty' => "''Kase gruppa on tühjä.''",
+'hidden-categories' => '{{PLURAL:$1|Salautõttu gruppa|Salautõtud gruppad}}',
+'category-subcat-count' => '{{PLURAL:$2|Senez gruppaz on ainult vahtiaava alagruppa.|{{PLURAL:$1|Vahtiaava alagruppa kuulub|Vahtiaava $1 alagruppaa kuuluvad}} sihee gruppaa. Alagruppaďďe cisla gruppaza on $2.}}',
+'category-article-count' => '{{PLURAL:$2|Senez gruppaz on ainult vahtiaava cülci.|{{PLURAL:$1|Vahtiaava alagruppa kuulub|Vahtiaava $1 cülciä kuuluvad}} sihee gruppaa. Cülcije cisla gruppaza on $2.}}',
+'category-file-count' => '{{PLURAL:$2|Senez gruppaz on ainult vahtiaava faili.|{{PLURAL:$1|Vahtiaava alagruppa kuulub|Vahtiaava $1 failid kuuluvad}} sihee gruppaa. Cülcije cisla gruppaza on $2.}}',
 'listingcontinuesabbrev' => 'ladvaub',
 
-'newwindow'  => '(avaub uuvvõza akkunaza)',
-'cancel'     => 'Otmeńoit',
-'mytalk'     => 'Minu juttu',
+'about' => 'Täätühsed',
+'newwindow' => '(avaub uuvvõza akkunaza)',
+'cancel' => 'Otmeńoit',
+'mypage' => 'Minu cülci',
+'mytalk' => 'Minu juttu',
 'navigation' => 'Valittsõmin',
+'and' => '&#32;ja',
 
 # Cologne Blue skin
 'qbfind' => 'Etsi',
-
-'errorpagetitle'   => 'Vika',
-'returnto'         => 'Mee takaz tšüľľelle $1.',
-'tagline'          => 'Lähe: {{SITENAME}}',
-'help'             => 'Api',
-'search'           => 'Ettsü',
-'searchbutton'     => 'Etsi',
-'searcharticle'    => 'Mee',
-'history'          => 'Tšüľľee istori',
-'history_short'    => 'Istori',
-'printableversion' => 'Petšatoittõva verzija',
-'permalink'        => 'Postojannoi linkki',
-'edit'             => 'Muuttaa',
-'create'           => 'Loo tšültši',
-'editthispage'     => 'Muutu sitä tšültšiä',
-'delete'           => 'Pühi',
-'protect'          => 'Varjaa',
-'protect_change'   => 'muutu',
-'newpage'          => 'Uusi tšültši',
-'talkpage'         => 'Juttu senessä tšüľľessä',
+'qbedit' => 'Muuttaa',
+'qbpageoptions' => 'Kase cülci',
+'qbspecialpages' => 'Osoobenoid cüľľed',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => 'Vassõn teema',
+'vector-action-delete' => 'Pühi',
+'vector-action-move' => 'Liikut',
+'vector-action-protect' => 'Varjaa',
+'vector-view-create' => 'Loo cülci',
+'vector-view-edit' => 'Muuttaa',
+'vector-view-history' => 'Istori',
+'vector-view-view' => 'Lukõa',
+'vector-view-viewsource' => 'Lähtekoodi',
+'actions' => 'Tekod',
+'namespaces' => 'Nimiruumid',
+'variants' => 'Variandid',
+
+'errorpagetitle' => 'Vika',
+'returnto' => 'Mee takaz cüľľelle $1.',
+'tagline' => 'Lähe: {{SITENAME}}',
+'help' => 'Api',
+'search' => 'Ettsü',
+'searchbutton' => 'Etsi',
+'go' => 'Mee',
+'searcharticle' => 'Mee',
+'history' => 'Cüľľee istori',
+'history_short' => 'Istori',
+'printableversion' => 'Pecatoittõva verzija',
+'permalink' => 'Postojannoi linkki',
+'view' => 'Prestavleńńõd',
+'edit' => 'Muuttaa',
+'create' => 'Loo cülci',
+'editthispage' => 'Muutu sitä cülciä',
+'delete' => 'Pühi',
+'deletethispage' => 'Pühi kase cülci',
+'protect' => 'Varjaa',
+'protect_change' => 'muutu',
+'newpage' => 'Uusi cülci',
+'talkpage' => 'Juttu senessä cüľľessä',
 'talkpagelinktext' => 'Juttu',
-'personaltools'    => 'Õmad tööriisõd',
-'talk'             => 'Juttu',
-'views'            => 'Prestavleńńõd',
-'toolbox'          => 'Tööriisõd',
-'otherlanguages'   => 'Muilla tšeelillä',
-'redirectedfrom'   => '(Mešaitõttu tšüľľeltä $1)',
-'redirectpagesub'  => 'Mešaituztšültši',
-'lastmodifiedat'   => 'Viimõin muutuz: $2 $1',
-'jumpto'           => 'Hüppä:',
+'specialpage' => 'Osoobennoi cülci',
+'personaltools' => 'Õmad tööriisõd',
+'talk' => 'Juttu',
+'views' => 'Prestavleńńõd',
+'toolbox' => 'Tööriisõd',
+'otherlanguages' => 'Muilla ceelillä',
+'redirectedfrom' => '(Mešaitõttu cüľľeltä $1)',
+'redirectpagesub' => 'Mešaituzcülci',
+'lastmodifiedat' => 'Viimõin muutuz: $2 $1',
+'jumpto' => 'Hüppä:',
 'jumptonavigation' => 'valittsõmisiisõ',
-'jumptosearch'     => 'ettsüse',
+'jumptosearch' => 'ettsüse',
 
 # 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'            => 'Tääteja {{GRAMMAR:elative|{{SITENAME}}}}',
-'aboutpage'            => 'Project:Täätühsed',
-'copyright'            => 'Sisälto on $1 litsentsii mukka svobodnoi.',
-'copyrightpage'        => '{{ns:project}}:Kopiraitti',
-'disclaimers'          => 'Tšeeltümin vassamizõõ',
-'disclaimerpage'       => 'Project:Tšeeltümin vassamizõõ',
-'edithelp'             => 'Muutuzavid',
-'edithelppage'         => 'Help:Kui muuttaa tšültšiä',
-'helppage'             => 'Help:Sisälto',
-'mainpage'             => 'Esitšültši',
+'aboutsite' => 'Tääteja {{GRAMMAR:elative|{{SITENAME}}}}',
+'aboutpage' => 'Project:Täätühsed',
+'copyright' => 'Sisälto on $1 litsentsii mukka svobodnoi.',
+'copyrightpage' => '{{ns:project}}:Kopiraitti',
+'currentevents' => 'Nücüizõd noovosťi',
+'currentevents-url' => 'Project:Nücüizõd noovosťi',
+'disclaimers' => 'Ceeltümin vassamizõõ',
+'disclaimerpage' => 'Project:Ceeltümin vassamizõõ',
+'edithelp' => 'Muutuzavid',
+'edithelppage' => 'Help:Kui muuttaa cülciä',
+'helppage' => 'Help:Sisälto',
+'mainpage' => 'Esicülci',
 'mainpage-description' => 'Esicülci',
-'privacy'              => 'Salaštrahuituz',
-'privacypage'          => 'Project:Salaštrahuituz',
+'portal' => 'Foorum',
+'portal-url' => 'Project:Foorum',
+'privacy' => 'Salaštrahuituz',
+'privacypage' => 'Project:Salaštrahuituz',
 
-'badaccess' => 'Lupa eeltistü',
+'badaccess' => 'Lupa ceeltistü',
 
-'retrievedfrom'       => 'Jältšinnü adresissa "$1"',
-'youhavenewmessages'  => 'Teill on $1 ($2).',
-'newmessageslink'     => 'Uusiit zapiskoit',
+'ok' => 'OK',
+'retrievedfrom' => 'Jälcinnü adresissa "$1"',
+'youhavenewmessages' => 'Teill on $1 ($2).',
+'newmessageslink' => 'Uusiit zapiskoit',
 'newmessagesdifflink' => 'viimõin muutuz',
-'editsection'         => 'muuttaa',
-'editold'             => 'muuttaa',
-'editlink'            => 'muuttaa',
-'viewsourcelink'      => 'lähtekoodi',
-'editsectionhint'     => 'Muutta alajakkoa $1',
-'toc'                 => 'Sisälto',
-'showtoc'             => 'näüt väľľää',
-'hidetoc'             => 'salauta',
-'site-rss-feed'       => '$1-RSS-söötte',
-'site-atom-feed'      => '$1-Atom-söötte',
-'page-rss-feed'       => '"$1" RSS-söötte',
-'page-atom-feed'      => '"$1" Atom-söötte',
-'red-link-title'      => '$1 (tšültšiä ebõõ)',
+'editsection' => 'muuttaa',
+'editold' => 'muuttaa',
+'viewsourceold' => 'lähtekoodi',
+'editlink' => 'muuttaa',
+'viewsourcelink' => 'lähtekoodi',
+'editsectionhint' => 'Muutta alajakkoa $1',
+'toc' => 'Sisälto',
+'showtoc' => 'näüt väľľää',
+'hidetoc' => 'salauta',
+'site-rss-feed' => '$1-RSS-söötte',
+'site-atom-feed' => '$1-Atom-söötte',
+'page-rss-feed' => '"$1" RSS-söötte',
+'page-atom-feed' => '"$1" Atom-söötte',
+'red-link-title' => '$1 (cülciä ebõõ)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Artikkeli',
-'nstab-user'     => 'Tšäüttijätšültši',
-'nstab-special'  => 'Osoobennoi tšültši',
-'nstab-project'  => 'Projektitšültši',
-'nstab-image'    => 'Faili',
+'nstab-main' => 'Artikkeli',
+'nstab-user' => 'Cäüttijäcülci',
+'nstab-media' => 'Media-cülci',
+'nstab-special' => 'Osoobennoi cülci',
+'nstab-project' => 'Projekticülci',
+'nstab-image' => 'Faili',
+'nstab-mediawiki' => 'Ilmottamin',
 'nstab-template' => 'Šablooni',
 'nstab-category' => 'Gruppa',
 
 # General errors
-'missing-article'    => 'Tšüľľee sisältoa eb löütännü täätöbaazassa: $1 $2.
+'error' => 'Vika',
+'missing-article' => 'Cüľľee sisältoa eb löütännü täätöbaazassa: $1 $2.
 
-Ussassi se johtub ustaŕeloi sravńoi- vai istorilinkissä rootšittulõõ tšüľľelee.
+Ussassi se johtub ustaŕeloi sravńoi- vai istorilinkissä roocittulõõ cüľľelee.
 
-Kui tšüsümüssessä ebõõ rootšittu tšültši, võib õlla õlõttõ löütännü ošipkaa sistemalla. Õõ nii üvä ilmuttõma tšüľľee adressia vikii [[Special:ListUsers/sysop|praviťeľalõõ]].',
+Kui cüsümüssessä ebõõ roocittu cülci, võib õlla õlõttõ löütännü ošipkaa sistemalla. Õõ nii üvä ilmuttõma cüľľee adressia vikii [[Special:ListUsers/sysop|praviťeľalõõ]].',
 'missingarticle-rev' => '(verzija: $1)',
-'badtitletext'       => 'Tšüzüttü artikkelizagolofkka õli vilpilliin, tühjä vai väärii linkitettü tšeelijeväliin vai vikiiväliin linkki.',
-'viewsource'         => 'Lähtekoodi',
+'badtitle' => 'Paha zagolofkka',
+'badtitletext' => 'Cüzüttü artikkelizagolofkka õli vilpilliin, tühjä vai väärii linkitettü ceelijeväliin vai vikiiväliin linkki.',
+'viewsource' => 'Lähtekoodi',
 
 # Login and logout pages
-'yourname'                => 'Tšäüttijänimi:',
-'yourpassword'            => 'Salasõna',
-'remembermypassword'      => 'Mäleht minuu (enintään $1 {{PLURAL:$1|päivä|päivää}})',
-'login'                   => 'Tširjut süäme',
-'nav-login-createaccount' => 'Tširjut süäme vai registriiroit tšäüttijässi',
-'userlogin'               => 'Tširjut süäme',
-'logout'                  => 'Tširjut uloz',
-'userlogout'              => 'Tširjut uloz',
-'nologin'                 => "Kui Teille veel ebõõ tšäüttijänimi, '''$1'''.",
-'nologinlink'             => 'võitta loovva luguu',
-'mailmypassword'          => 'Lähet uusi salasõna elektropoštiikaa',
+'yourname' => 'Cäüttijänimi:',
+'yourpassword' => 'Salasõna',
+'remembermypassword' => 'Mäleht minuu (enintään $1 {{PLURAL:$1|päivä|päivää}})',
+'login' => 'Cirjut süäme',
+'nav-login-createaccount' => 'Cirjut süäme vai registriiroit cäüttijässi',
+'userlogin' => 'Cirjut süäme',
+'userloginnocreate' => 'Cirjut süäme',
+'logout' => 'Cirjut uloz',
+'userlogout' => 'Cirjut uloz',
+'nologin' => "Kui Teille veel ebõõ cäüttijänimi, '''$1'''.",
+'nologinlink' => 'võitta loovva luguu',
+'createaccount' => 'Uusi cäüttijää',
+'gotaccountlink' => 'Cirjut süäme',
+'createaccountreason' => 'Süü:',
+'mailmypassword' => 'Lähet uusi salasõna elektropoštiikaa',
+'loginlanguagelabel' => 'Ceeli: $1',
+
+# Change password dialog
+'resetpass-submit-cancel' => 'Otmeńoit',
+
+# Special:PasswordReset
+'passwordreset-username' => 'Cäüttijänimi:',
+
+# Special:ChangeEmail
+'changeemail-newemail' => 'Vassõn e-mail:',
+'changeemail-cancel' => 'Otmeńoit',
 
 # Edit page toolbar
-'bold_sample'     => 'Pimmiä teksti',
-'bold_tip'        => 'Pimmiä teksti',
-'italic_sample'   => 'Kursiivoi teksti',
-'italic_tip'      => 'Kursiivi',
-'link_sample'     => 'Linkki',
-'link_tip'        => 'Sisipooliin linkki',
-'extlink_sample'  => 'http://www.example.com linki nimi',
-'extlink_tip'     => 'Eräpooliin linkki (mäleht http:// prefiksi)',
+'bold_sample' => 'Pimmiä teksti',
+'bold_tip' => 'Pimmiä teksti',
+'italic_sample' => 'Kursiivoi teksti',
+'italic_tip' => 'Kursiivi',
+'link_sample' => 'Linkki',
+'link_tip' => 'Sisipooliin linkki',
+'extlink_sample' => 'http://www.example.com linki nimi',
+'extlink_tip' => 'Eräpooliin linkki (mäleht http:// prefiksi)',
 'headline_sample' => 'Zagolofkka-teksti',
-'headline_tip'    => 'Zagolofkka',
-'nowiki_sample'   => 'Lissä formattimatoo teksti tänne',
-'nowiki_tip'      => 'Ignoriiroit viki formatti',
-'image_tip'       => 'Kuva',
-'media_tip'       => 'Faililinkki',
-'sig_tip'         => 'Alatširjutuz aikamerkikaa',
-'hr_tip'          => 'Gorizontalnoi viiru',
+'headline_tip' => 'Zagolofkka',
+'nowiki_sample' => 'Lissä formattimatoo teksti tänne',
+'nowiki_tip' => 'Ignoriiroit viki formatti',
+'image_tip' => 'Kuva',
+'media_tip' => 'Faililinkki',
+'sig_tip' => 'Alacirjutuz aikamerkikaa',
+'hr_tip' => 'Gorizontalnoi viiru',
 
 # Edit pages
-'summary'                          => 'Turvotuz:',
-'subject'                          => 'Teema:',
-'minoredit'                        => 'Kase on peeni muutuz',
-'watchthis'                        => 'Lissä kattsõspiiskaa',
-'savearticle'                      => 'Salvo tšültši',
-'preview'                          => 'Prestavleńńa',
-'showpreview'                      => 'Näüt prestavleńńa',
-'showdiff'                         => 'Näüt muutussõd',
-'anoneditwarning'                  => 'Että õlõ süämme tširjutõnnu. Teďďee IP-adressi tširjuttanes sene tšüľľee muutuzistorisõ.',
-'summary-preview'                  => 'Turvotuhsõ prestavleńńa',
-'newarticle'                       => '(Uusi)',
-'newarticletext'                   => 'Sitä tšültšiä veel ebõõ.
-Võitta loovva tšüľľee tširjuttamall alla õlõvasõõ tilaa. Kui että taho loovva [[{{MediaWiki:Helppage}}|tšültšiä]], menka takaz Web-brauzeraa "back"-napuukaa.',
-'noarticletext'                    => '{{GRAMMAR:inessive|{{SITENAME}}}} ebõõ sene nimissä tšültšiä.
-* Võid [[Special:Search/{{PAGENAME}}|ettsiä tšüľľee nimellä]] muilta tšüľľeltä.
-* Võid tširjuttõma uuvvõõ tšüľľee <span class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{PAGENAME}}]</span>.',
-'previewnote'                      => "'''Kase on ainult prestavleńńa! Tšültšiä ebõõ veel salvotõttu!'''",
-'editing'                          => 'Muutun $1',
-'editingsection'                   => 'Muuttõmizõll on õsa tšüľľess $1',
-'copyrightwarning'                 => "Kõik {{SITENAME}}'lle formittu saatšid katsotaa julkaistussi $2 -litsentsi mukka ($1). Kui että taho, jot Teďďee tširjutussa muutõtaa armõttomassi ja svobodno tšävvää uuvvõllõõ, elä tširjuttõga.<br />Toož, Te luppattõ, jot tširjutittä Teďďee teksti ize, vai kopiiroizitta slobodnoissa tšüľľessä.<br />'''ELÄ TŠÄÜTTEGA TETŠEJÄÕIKUSÕKAA OĎĎÕLTUIT MAŤERIIT ILMA LUPPA!'''",
-'templatesused'                    => 'Sell tšüľľell {{PLURAL:$1|tšäütetüd šabloonid}}:',
-'templatesusedpreview'             => '{{PLURAL:$1|Šabloonid}} sellä prestavleńńalla:',
-'template-protected'               => '(oďďõttu)',
-'template-semiprotected'           => '(varjõttu anonüümeilt ja uusilt tšäüttijilt)',
-'hiddencategories'                 => 'Kase tšültši kuulub {{PLURAL:$1|vahtiaavaa salautõttuu gruppaa|vahtiaavii salautõttuisõõ gruppoisõõ}}:',
+'summary' => 'Turvotuz:',
+'subject' => 'Teema:',
+'minoredit' => 'Kase on peeni muutuz',
+'watchthis' => 'Lissä kattsõspiiskaa',
+'savearticle' => 'Salvo cülci',
+'preview' => 'Prestavleńńa',
+'showpreview' => 'Näüt prestavleńńa',
+'showdiff' => 'Näüt muutussõd',
+'anoneditwarning' => 'Että õlõ süämme cirjutõnnu. Teďďee IP-adressi cirjuttanes sene cüľľee muutuzistorisõ.',
+'summary-preview' => 'Turvotuhsõ prestavleńńa',
+'loginreqlink' => 'cirjut süäme',
+'newarticle' => '(Uusi)',
+'newarticletext' => 'Sitä cülciä veel ebõõ.
+Võitta loovva cüľľee cirjuttamall alla õlõvasõõ tilaa. Kui että taho loovva [[{{MediaWiki:Helppage}}|cülciä]], menka takaz Web-brauzeraa "back"-napuukaa.',
+'noarticletext' => '{{GRAMMAR:inessive|{{SITENAME}}}} ebõõ sene nimissä cülciä.
+* Võid [[Special:Search/{{PAGENAME}}|ettsiä cüľľee nimellä]] muilta cüľľeltä.
+* Võid cirjuttõma uuvvõõ cüľľee <span class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{PAGENAME}}]</span>.',
+'noarticletext-nopermission' => 'Paraika kazell lehocüllell eb õõ teksta.
+Tüü võittõ [[Special:Search/{{PAGENAME}}|kaze nime nimettamizõ löütä]] muiss artikkeliiss, ehci <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}löütä azjakõhaizõd cirjauhsõd žurnaaliiss]</span>.',
+'previewnote' => "'''Kase on ainult prestavleńńa.''' Cülciä ebõõ veel salvotõttu!",
+'editing' => 'Muutun $1',
+'editingsection' => 'Muuttõmizõll on õsa cüľľess $1',
+'copyrightwarning' => "Kõik {{SITENAME}}'lle formittu saacid katsotaa julkaistussi $2 -litsentsi mukka ($1). Kui että taho, jot Teďďee cirjutussa muutõtaa armõttomassi ja svobodno cävvää uuvvõllõõ, elä cirjuttõga.<br />Toož, Te luppattõ, jot cirjutittä Teďďee teksti ize, vai kopiiroizitta slobodnoissa cüľľessä.<br />'''ELÄ CÄÜTTEGA TECEJÄÕIKUSÕKAA OĎĎÕLTUIT MAŤERIIT ILMA LUPPA!'''",
+'templatesused' => 'Sell cüľľell {{PLURAL:$1|cäütetüd šabloonid}}:',
+'templatesusedpreview' => '{{PLURAL:$1|Šabloonid}} sellä prestavleńńalla:',
+'template-protected' => '(oďďõttu)',
+'template-semiprotected' => '(varjõttu anonüümeilt ja uusilt cäüttijilt)',
+'hiddencategories' => 'Kase cülci kuulub {{PLURAL:$1|vahtiaavaa salautõttuu gruppaa|vahtiaavii salautõttuisõõ gruppoisõõ}}:',
 'permissionserrorstext-withaction' => 'Teill ebõõ luppa $2 {{PLURAL:$1|vahtiaavass süüss|vahtiaaviss süiss}} peräss:',
-'moveddeleted-notice'              => "Kase tšültši on pühittü. Alla on sene tšüľľee pühi'istori.",
+'moveddeleted-notice' => "Kase cülci on pühittü. Alla on sene cüľľee pühi'istori.",
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Etetäätämin:''' lizettävije šabloonije summaarin koko on liiga suuri.
+Mõnõd šabloonad eväd lee lizettü.",
+'post-expand-template-inclusion-category' => 'Lehocülled, jõgõit vart lizettävije šabloonije sallittu koko on ületettü',
+'post-expand-template-argument-category' => 'Lehocülled, jõgad sisälletä väl’l’ä-jätettü šabloonije argumentad.',
 
 # History pages
-'viewpagelogs'           => 'Näüt sene tšüľľee logid',
-'currentrev-asof'        => 'Nütšüin verzija $1',
-'revisionasof'           => 'Verzija $1',
-'previousrevision'       => '← Vanõpi verzija',
-'nextrevision'           => 'Uuvvõpi verzija →',
-'currentrevisionlink'    => 'Nütšüin verzija',
-'cur'                    => 'nütš.',
-'last'                   => 'entin',
-'histlegend'             => "Merkid: ({{int:cur}}) = vahõ nütšüizese verzijaa, ({{int:last}}) = vahõ entiizese verzijaa, '''{{int:minoreditletter}}''' = peeni muutuz",
+'viewpagelogs' => 'Näüt sene cüľľee logid',
+'currentrev' => 'Nücüin verzija',
+'currentrev-asof' => 'Nücüin verzija $1',
+'revisionasof' => 'Verzija $1',
+'previousrevision' => '← Vanõpi verzija',
+'nextrevision' => 'Uuvvõpi verzija →',
+'currentrevisionlink' => 'Nücüin verzija',
+'cur' => 'nüc.',
+'last' => 'entin',
+'histlegend' => "Merkid: ({{int:cur}}) = vahõ nütšüizese verzijaa, ({{int:last}}) = vahõ entiizese verzijaa, '''{{int:minoreditletter}}''' = peeni muutuz",
 'history-fieldset-title' => 'Ľistvoit muutuzistoria',
-'histfirst'              => 'Kõikkõa varaizõpid',
-'histlast'               => 'Kõikkõa viimõizõpid',
+'history-show-deleted' => "Tol'ko poisõttu",
+'histfirst' => 'Kõikkõa varaizõpid',
+'histlast' => 'Kõikkõa viimõizõpid',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 .. $2',
 
 # Revision deletion
-'rev-delundel'   => 'näüt/salauta',
-'revdel-restore' => 'muutu nätšüvüss',
+'rev-delundel' => 'näüt/salauta',
+'rev-showdeleted' => 'näüt väľľää',
+'revdelete-show-file-submit' => 'Daa',
+'revdelete-radio-set' => 'Daa',
+'revdelete-radio-unset' => 'Eb',
+'revdelete-log' => 'Süü:',
+'revdel-restore' => 'muutu näcüvüss',
+'revdel-restore-deleted' => 'poizõttu verssijad',
+'revdel-restore-visible' => 'nähtäväd verssijad',
+'pagehist' => 'Cüľľee istori',
+'revdelete-reasonotherlist' => 'Muu süü',
+
+# History merging
+'mergehistory-reason' => 'Süü:',
 
 # Merge log
 'revertmerge' => 'Kummut ühesüz',
 
 # Diffs
-'history-title'           => 'Tšüľľee $1 muutuzistori',
-'difference'              => '(Vahõd verzijoďďee väliz)',
-'lineno'                  => 'Viiru $1:',
+'history-title' => 'Cüľľee $1 muutuzistori',
+'lineno' => 'Viiru $1:',
 'compareselectedversions' => 'Võrrõõ valitsõttuit verzijoit',
-'editundo'                => 'kummut',
+'editundo' => 'kummut',
 
 # Search results
-'searchresults'             => 'Etsüü tulõmuhsõd',
-'searchresults-title'       => 'Etsü tulõmuhsõd ettsüsõnalõõ "$1"',
-'searchresulttext'          => 'Lisäsoobšeńńad ettsimizessä on [[{{MediaWiki:Helppage}}|praavilatšüľľellä]].',
-'searchsubtitle'            => 'Etsizid fraaza \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|kõikõd tšüľľed, kummad alkõa fraazaakaa "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|kõikõd tšüľľed näütteväd tšüľľelee "$1"]])',
-'searchsubtitleinvalid'     => "Ettsizittä: '''$1'''",
-'notitlematches'            => 'Eb löütännü miltäiss tšültšiä sene ettsüsõnaaka',
-'notextmatches'             => 'Ettsisõnaa eb löütünnü tšüľľee tekstiissä',
-'prevn'                     => '{{PLURAL:$1|edellinen|$1 entiiss}}',
-'nextn'                     => '{{PLURAL:$1|$1}} vahtiaava →',
-'viewprevnext'              => 'Näüt ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size'        => '$1 ({{PLURAL:$2|1 sõna|$2 sõna}})',
-'search-redirect'           => '(mešaituz $1)',
-'search-section'            => '(alajako $1)',
-'search-suggest'            => 'Tähetidko: $1',
-'search-interwiki-caption'  => 'Sõzarprojektid',
-'search-interwiki-default'  => 'tulõmuhsõd $1:',
-'search-interwiki-more'     => '(lisä)',
-'search-mwsuggest-enabled'  => 'tarittsõmisijõkaa',
+'searchresults' => 'Etsüü tulõmuhsõd',
+'searchresults-title' => 'Etsü tulõmuhsõd ettsüsõnalõõ "$1"',
+'searchresulttext' => 'Lisäsoobšeńńad ettsimizessä on [[{{MediaWiki:Helppage}}|praavilacüľľellä]].',
+'searchsubtitle' => 'Etsizid fraaza \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|kõikõd cüľľed, kummad alkõa fraazaakaa "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|kõikõd cüľľed näütteväd cüľľelee "$1"]])',
+'searchsubtitleinvalid' => "Ettsizittä: '''$1'''",
+'notitlematches' => 'Eb löütännü miltäiss cülciä sene ettsüsõnaaka',
+'notextmatches' => 'Ettsisõnaa eb löütünnü cüľľee tekstiissä',
+'prevn' => '{{PLURAL:$1|edellinen|$1 entiiss}}',
+'nextn' => '{{PLURAL:$1|$1}} vahtiaava →',
+'prevn-title' => '{{PLURAL:$1|Eellin cirjauz|$1 eellissa cirjaussa}}',
+'nextn-title' => '{{PLURAL:$1|Sõurava cirjauz|$1 sõurava cirjaussa}}',
+'shown-title' => 'Näüttä $1 {{PLURAL:$1|cirjauz|cirjaussa}} lehocüllell',
+'viewprevnext' => 'Näüt ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => 'Kazez viki-projeektaz on lehocülci «[[:$1]]» õõmaz',
+'searchmenu-new' => 'Tehä lehocülci «[[:$1]]» senez viki-projeektaz!',
+'searchprofile-articles' => 'Pääcülcid',
+'searchprofile-project' => 'Selvitühse ja projeekta lehocülled',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Kõik',
+'searchprofile-advanced' => 'Lizätez',
+'searchprofile-articles-tooltip' => 'Etsi "$1":az',
+'searchprofile-project-tooltip' => 'Etsi "$1":az',
+'searchprofile-images-tooltip' => 'Failõje õttsigo',
+'searchprofile-everything-tooltip' => 'Õttsigo kõikill lehocüllill (ceskussõõmizõ lehocülled siällhulgaz)',
+'searchprofile-advanced-tooltip' => 'Annõttu nimije tiloiz õttsia',
+'search-result-size' => '$1 ({{PLURAL:$2|1 sõna|$2 sõna}})',
+'search-redirect' => '(mešaituz $1)',
+'search-section' => '(alajako $1)',
+'search-suggest' => 'Tähetidko: $1',
+'search-interwiki-caption' => 'Sõzarprojektid',
+'search-interwiki-default' => 'tulõmuhsõd $1:',
+'search-interwiki-more' => '(lisä)',
+'search-mwsuggest-enabled' => 'tarittsõmisijõkaa',
 'search-mwsuggest-disabled' => 'tarittsõmizõtta',
-'nonefound'                 => "'''Zametšańńa''': Ettsü etsib anult osiss nimiruumii.
-Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taas juttutšüľľeekaa, sablooniikaa, jne.), vai tarvittõga nimiruumi niku prefiksi.",
-'powersearch'               => 'Etenennü ettsü',
-'powersearch-legend'        => 'Etenennü ettsü',
-'powersearch-ns'            => 'Etsi nimiruumõssa:',
-'powersearch-redir'         => 'Spiiska mešaitussijõ',
-'powersearch-field'         => 'Etsi',
+'searchrelated' => 'sittu',
+'searchall' => 'kõik',
+'showingresultsheader' => "{{PLURAL:$5|Tuloz '''$1''' '''$3'''-ss|Tulohsõd '''$1-$2''' '''$3'''-ss}} «$4» vart",
+'nonefound' => "'''Zametšańńa''': Ettsü etsib anult osiss nimiruumii.
+Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taas juttucüľľeekaa, sablooniikaa, jne.), vai tarvittõga nimiruumi niku prefiksi.",
+'search-nonefound' => 'Cüsümühse mukaizõssi eb õõ mitäid löütettü.',
+'powersearch' => 'Etenennü ettsü',
+'powersearch-legend' => 'Etenennü ettsü',
+'powersearch-ns' => 'Etsi nimiruumõssa:',
+'powersearch-redir' => 'Spiiska mešaitussijõ',
+'powersearch-field' => 'Etsi',
+
+# Quickbar
+'qbsettings-none' => 'Eb õõ',
 
 # Preferences page
-'preferences'   => 'Koozid',
+'preferences' => 'Koozid',
 'mypreferences' => 'Minu koozid',
+'skin-preview' => 'Prestavleńńa',
+'prefs-datetime' => 'Kuupäivä i aika',
+'prefs-user-pages' => 'Cäüttijäcülcid',
+'prefs-rc' => 'Viimõizõd muutussõd',
+'searchresultshead' => 'Etsi',
+'timezoneregion-africa' => 'Afrikka',
+'timezoneregion-america' => 'Ameerika',
+'timezoneregion-asia' => 'Aazija',
+'timezoneregion-australia' => 'Avstraaľija',
+'timezoneregion-europe' => 'Evrooppaa',
+'prefs-files' => 'Failid',
+'youremail' => 'E-mail:',
+'username' => 'Cäüttijänimi:',
+'yourrealname' => 'Minu nimi:',
+'yourlanguage' => 'Ceeli:',
+'yourgender' => 'Sukupooli',
+'gender-male' => 'Mehin',
+'gender-female' => 'Naisin',
+'email' => 'E-mail',
+
+# User rights
+'userrights-reason' => 'Süü:',
 
 # Groups
+'group-user' => 'Сäüttijäd',
 'group-sysop' => 'Praviťeľad',
+'group-all' => '{kõik)',
+
+'group-user-member' => 'cäüttijä',
 
+'grouppage-user' => '{{ns:project}}:Сäüttijäd',
 'grouppage-sysop' => '{{ns:project}}:Praviťeľad',
 
 # User rights log
-'rightslog' => 'Tšäütteminõikuslogi',
+'rightslog' => 'Cäütteminõikuslogi',
+'rightsnone' => '(eb õõ)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'muutu sitä tšültšiä',
+'action-edit' => 'muutu sitä cülciä',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|muutuz|muutussõd}}',
-'recentchanges'                  => 'Viimõizõd muutussõd',
-'recentchanges-legend'           => 'Viimass muutuhsõss valimizõd',
+'nchanges' => '$1 {{PLURAL:$1|muutuz|muutussõd}}',
+'recentchanges' => 'Viimõizõd muutussõd',
+'recentchanges-legend' => 'Viimass muutuhsõss valimizõd',
 'recentchanges-feed-description' => 'Sell sivull võib vahtia uutizijõ muutuhsiit.',
-'rcnote'                         => 'Alla on {{PLURAL:$1|ühsi muutuz|viimeiziit $1 muutussiit}} viimeize {{PLURAL:$2|ühee päivää|$2 päivää}}, $4 $5.',
-'rclistfrom'                     => 'Näüt uuvvõd muutuhsõd $1 alguss',
-'rcshowhideminor'                => '$1 peened muutussõd',
-'rcshowhidebots'                 => '$1 botid',
-'rcshowhideliu'                  => '$1 süäme tširjutõnnud tšäüttijäd',
-'rcshowhideanons'                => '$1 anonüümid tšäüttijäd',
-'rcshowhidemine'                 => '$1 õmad muutussõd',
-'rclinks'                        => 'Näüt viimõiss $1 muutuhsõiss viimõizõ $2 päivää ajalt.<br />$3',
-'diff'                           => 'vahõ',
-'hist'                           => 'istori',
-'hide'                           => 'Salauta',
-'show'                           => 'Näüt väľľää',
-'minoreditletter'                => 'p',
-'newpageletter'                  => 'U',
-'boteditletter'                  => 'b',
-'rc-enhanced-expand'             => 'Näüt detaaľiit (JavaScript on tarviz)',
-'rc-enhanced-hide'               => 'Salauta detaaľiit',
+'recentchanges-label-newpage' => 'Kaze kirjauhsõka õli muu lehocülci lootu.',
+'recentchanges-label-minor' => 'Kase on peeni muutuz',
+'recentchanges-label-bot' => 'Kase kõrjauz on robotaka lootu',
+'recentchanges-label-unpatrolled' => 'Kasta kõrjaussa eb tarkisõtti veel',
+'rcnote' => 'Alla on {{PLURAL:$1|ühsi muutuz|viimeiziit $1 muutussiit}} viimeize {{PLURAL:$2|ühee päivää|$2 päivää}}, $4 $5.',
+'rclistfrom' => 'Näüt uuvvõd muutuhsõd $1 alguss',
+'rcshowhideminor' => '$1 peened muutussõd',
+'rcshowhidebots' => '$1 botid',
+'rcshowhideliu' => '$1 süäme cirjutõnnud cäüttijäd',
+'rcshowhideanons' => '$1 anonüümid cäüttijäd',
+'rcshowhidemine' => '$1 õmad muutussõd',
+'rclinks' => 'Näüt viimõiss $1 muutuhsõiss viimõizõ $2 päivää ajalt.<br />$3',
+'diff' => 'vahõ',
+'hist' => 'istori',
+'hide' => 'Salauta',
+'show' => 'Näüt väľľää',
+'minoreditletter' => 'p',
+'newpageletter' => 'U',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Näüt detaaľiit (JavaScript on tarviz)',
+'rc-enhanced-hide' => 'Salauta detaaľiit',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Sukulaizõd muutussõd.',
-'recentchangeslinked-title'   => 'Tšüľľelt $1 linkitettüďďe tšültšije muutuhsõd.',
-'recentchangeslinked-summary' => "Kase osoobennoi tšültši näütteb muutusõd tšültšillä, kummalõõ on seltä tšüľľeltä näüteltü.
-Tšüľľed, kummad õmad teďďellä [[Special:Watchlist|kattsõspiizgalla]] on tširjuttõnnu '''pimmiässi'''.",
-'recentchangeslinked-page'    => 'Tšüľľee nimi:',
-'recentchangeslinked-to'      => 'Näüt muutuhsõd tšültšiisee, kummall on linkki annõttuu tšültšesee',
+'recentchangeslinked' => 'Sukulaizõd muutussõd.',
+'recentchangeslinked-feed' => 'Sukulaizõd muutussõd',
+'recentchangeslinked-toolbox' => 'Sukulaizõd muutussõd',
+'recentchangeslinked-title' => 'Cüľľelt $1 linkitettüďďe cülcije muutuhsõd.',
+'recentchangeslinked-noresult' => 'Cüseizez aigakõhaz eväd õltu milliziitäid muuttumiziit.',
+'recentchangeslinked-summary' => "Kase osoobennoi cülci näütteb muutusõd cülcillä, kummalõõ on seltä cüľľeltä näüteltü.
+Cüľľed, kummad õmad teďďellä [[Special:Watchlist|kattsõspiizgalla]] on cirjuttõnnu '''pimmiässi'''.",
+'recentchangeslinked-page' => 'Cüľľee nimi:',
+'recentchangeslinked-to' => 'Näüt muutuhsõd cülciisee, kummall on linkki annõttuu cülcesee',
 
 # Upload
-'upload'        => 'Laajõngoit failia ülez',
+'upload' => 'Laajõngoit failia ülez',
+'uploadbtn' => 'Laajõngoit failia ülez',
 'uploadlogpage' => 'Faililogi',
+'filename' => 'Failinimi',
+'filedesc' => 'Turvotuz',
+'fileuploadsummary' => 'Turvotuz:',
 'uploadedimage' => '"[[$1]]" on laajõngoitõttu ülez',
 
+'license' => 'Litseenttsija:',
+'license-header' => 'Litseenttsija',
+
+# Special:ListFiles
+'imgfile' => 'faili',
+'listfiles_thumb' => 'Peenikuva',
+'listfiles_date' => 'Kuupäivä',
+'listfiles_name' => 'Nimi',
+'listfiles_user' => 'Сäüttijä',
+
 # File description page
-'filehist'                  => 'Failii istori',
-'filehist-help'             => 'Štšolkoittõga Päivätšisla/Tšelloaika näe miltäin faili õli sell aiga pilkall.',
-'filehist-current'          => 'nütšüin',
-'filehist-datetime'         => 'Päivätšisla/Tšelloaika',
-'filehist-thumb'            => 'Peenikuva',
-'filehist-thumbtext'        => 'Peenikuva $1 verzijalõõ',
-'filehist-user'             => 'Tšäüttijä',
-'filehist-dimensions'       => 'Mitad',
-'filehist-comment'          => 'Zametšańńa',
-'imagelinks'                => 'Faililinkid',
-'linkstoimage'              => 'Selle kuvallõ {{PLURAL:$1|näütteeb kase tšültši|näütteväd kaned tšüľľed}}:',
-'sharedupload'              => "Kase faili on $1'lt ja muud projektõd saavad tšäüttää sitä.",
+'file-anchor-link' => 'Faili',
+'filehist' => 'Failii istori',
+'filehist-help' => 'Šcolkoittõga Päiväcisla/Celloaika näe miltäin faili õli sell aiga pilkall.',
+'filehist-deleteone' => 'pühi',
+'filehist-revert' => 'kummut',
+'filehist-current' => 'nücüin',
+'filehist-datetime' => 'Päiväсisla/Сelloaika',
+'filehist-thumb' => 'Peenikuva',
+'filehist-thumbtext' => 'Peenikuva $1 verzijalõõ',
+'filehist-user' => 'Сäüttijä',
+'filehist-dimensions' => 'Mitad',
+'filehist-comment' => 'Zametšańńa',
+'imagelinks' => 'Faililinkid',
+'linkstoimage' => 'Selle kuvallõ {{PLURAL:$1|näütteeb kase сülсi|näütteväd kaned сüľľed}}:',
+'nolinkstoimage' => 'Eb ühelläid lehocüllell cäütetä kase faila.',
+'sharedupload' => 'Kase faili on $1:lt ja muud projektõd saavad cäüttää sitä.',
+'sharedupload-desc-here' => 'Se fajla on $1-ss ja võib muiz projeektiz õlla cäütettävänä.
+Seness [$2 kuvauhsõ lehocülless] informaattsija on alapallõ annõttu.',
 'uploadnewversion-linktext' => 'Laajõngoit uusi verzija seness failiss ülez',
 
+# File reversion
+'filerevert-comment' => 'Süü:',
+'filerevert-submit' => 'Kummut',
+
+# File deletion
+'filedelete-comment' => 'Süü:',
+'filedelete-submit' => 'Pühi',
+
+# Random page
+'randompage' => 'Satunnain lehocülci',
+
 # Statistics
 'statistics' => 'Staťisťikka',
+'statistics-pages' => 'Cülcid',
+
+'disambiguationspage' => 'Template:disambig',
+
+'brokenredirects-edit' => 'muuttaa',
+'brokenredirects-delete' => 'pühi',
+
+'withoutinterwiki-submit' => 'Näüt väľľää',
 
 # Miscellaneous special pages
-'nbytes'        => '$1 {{PLURAL:$1|baitti|baittia}}',
-'nmembers'      => '$1 {{PLURAL:$1|selttsilain|selttsilaizõd}}',
-'prefixindex'   => 'Kõik tšüľľed prefiksiikaa',
-'newpages'      => 'Uuvvõd tšüľľed',
-'move'          => 'Liikut',
-'movethispage'  => 'Liikut kase tšültši',
+'nbytes' => '$1 {{PLURAL:$1|baitti|baittia}}',
+'nmembers' => '$1 {{PLURAL:$1|selttsilain|selttsilaizõd}}',
+'prefixindex' => 'Kõik cüľľed prefiksiikaa',
+'newpages' => 'Uuvvõd cüľľed',
+'newpages-username' => 'Cäüttijänimi:',
+'move' => 'Liikut',
+'movethispage' => 'Liikut kase cülci',
 'pager-newer-n' => '{{PLURAL:$1|uuvvõpi 1|uuvvõpad $1}}',
 'pager-older-n' => '{{PLURAL:$1|vanöpi 1|vanõpad $1}}',
 
 # Book sources
-'booksources'               => 'TÅ¡irjalähed',
-'booksources-search-legend' => 'Etsi irjalähteit',
-'booksources-go'            => 'Mee',
+'booksources' => 'Сirjalähed',
+'booksources-search-legend' => 'Etsi сirjalähteit',
+'booksources-go' => 'Mee',
 
 # Special:Log
 'log' => 'Logid',
 
 # Special:AllPages
-'allpages'       => 'Kõik artikkelid',
+'allpages' => 'Kõik artikkelid',
 'alphaindexline' => '$1 ... $2',
-'prevpage'       => 'Entin tšültši ($1)',
-'allpagesfrom'   => 'Tšüľľelt',
-'allpagesto'     => 'Tšüľľessaa',
-'allarticles'    => 'Kõikõd tšüľľed',
+'prevpage' => 'Entin сülсi ($1)',
+'allpagesfrom' => 'Сüľľelt',
+'allpagesto' => 'Сüľľessaa',
+'allarticles' => 'Kõikõd cüľľed',
 'allpagessubmit' => 'Mee',
 
+# Special:Categories
+'categories' => 'Gruppad',
+
+# Special:DeletedContributions
+'sp-deletedcontributions-contribs' => 'Minu avittamizõd',
+
 # Special:LinkSearch
 'linksearch' => 'Ulkopoolizõd linkid',
+'linksearch-ns' => 'Nimiruumi:',
+'linksearch-ok' => 'Etsi',
+'linksearch-line' => 'Linki $1-sõ $2-ss',
+
+# Special:ListUsers
+'listusers-submit' => 'Näüt väľľää',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Uuvvõd äüttijäd',
+'newuserlogpage' => 'Uuvvõd cäüttijäd',
 
 # Special:ListGroupRights
 'listgrouprights-members' => '(selttsilainspiiska)',
 
 # E-mail user
-'emailuser' => 'Lähettega elektropoštia selle tšäüttijälle',
+'emailuser' => 'Lähettega elektropoštia selle cäüttijälle',
+'emailusername' => 'Cäüttijänimi:',
+'emailmessage' => 'Ilmottamin:',
 
 # Watchlist
-'watchlist'         => 'Minu kattsõspiiska',
-'mywatchlist'       => 'Minu kattsõspiiska',
-'addedwatchtext'    => "Tšültši \"[[:\$1]]\" on lisättü Teďďee [[Special:Watchlist|kattsospiizgallõ]].
-Tšültšese ja sene juttutšültšese tehäväd tulõvaizõd muutuhsõd leeväd tšisloitõtud siäll.
-Tšültši leeb tširjutõttu '''pimmiässi''' [[Special:RecentChanges|spiizgall viimeizije muutuhsijõ]].",
-'removedwatchtext'  => 'Tšültši "[[:$1]]" on pantu [[Special:Watchlist|teďďee kattsõspiizgalt]] poiz.',
-'watch'             => 'Katso',
-'watchthispage'     => 'Katso sitä tšültšiä',
-'unwatch'           => 'Lõpõt kattsõõmin',
-'watchlist-details' => 'Kattsõspiizgall on {{PLURAL:$1|$1 tšültši|$1 tšültšiä}} (ilma juttutšültšiit).',
-'wlshowlast'        => 'Näüt viimeized $1 tunnia vai $2 päivää $3',
+'watchlist' => 'Minu kattsõspiiska',
+'mywatchlist' => 'Minu kattsõspiiska',
+'watchlistfor2' => '$2 - $1 vart',
+'addedwatchtext' => "Cülci \"[[:\$1]]\" on lisättü Teďďee [[Special:Watchlist|kattsospiizgallõ]].
+Cülcese ja sene juttucülcese tehäväd tulõvaizõd muutuhsõd leeväd cisloitõtud siäll.
+Cülci leeb cirjutõttu '''pimmiässi''' [[Special:RecentChanges|spiizgall viimeizije muutuhsijõ]].",
+'removedwatchtext' => 'Cülci "[[:$1]]" on pantu [[Special:Watchlist|teďďee kattsõspiizgalt]] poiz.',
+'watch' => 'Katso',
+'watchthispage' => 'Katso sitä cülciä',
+'unwatch' => 'Lõpõt kattsõõmin',
+'watchlist-details' => 'Kattsõspiizgall on {{PLURAL:$1|$1 cülci|$1 cülciä}} (ilma juttucülciit).',
+'wlshowlast' => 'Näüt viimeized $1 tunnia vai $2 päivää $3',
 'watchlist-options' => 'Kattsõspiizgaa valimizõd',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Kattsõõn…',
+'watching' => 'Kattsõõn…',
 'unwatching' => 'Kattsõõmizõõ lõpõttõmin…',
 
+'enotif_newpagetext' => 'Kase on vassõn cülci.',
+
 # Delete
-'deletepage'            => 'Pühi tšültši',
-'confirmdeletetext'     => 'Õlõtta pühtšimässä tšüľľee vai failii ja kõigõ sene istorii. Õlka nii üvä, kõvissõga jot tahotta sitä tehä, jot saatta arvoa sledstvijäd jot pühtšimüz on [[{{MediaWiki:Policy-url}}|poolissaa]] mukka.',
-'actioncomplete'        => 'Töö tehtü lõppuu',
-'deletedtext'           => '"$1" on pühittü.
-Tšüľľellä $2 on spiiska viimeiziss pühtšimühsiiss.',
-'dellogpage'            => 'Pühitüd tšüľľed',
-'deletecomment'         => 'Süü',
-'deleteotherreason'     => 'Muu vai lisä süü',
+'deletepage' => 'Pühi cülci',
+'delete-legend' => 'Pühi',
+'confirmdeletetext' => 'Õlõtta pühcimässä cüľľee vai failii ja kõigõ sene istorii. Õlka nii üvä, kõvissõga jot tahotta sitä tehä, jot saatta arvoa sledstvijäd jot pühcimüz on [[{{MediaWiki:Policy-url}}|poolissaa]] mukka.',
+'actioncomplete' => 'Töö tehtü lõppuu',
+'actionfailed' => 'Vika',
+'deletedtext' => '"$1" on pühittü.
+Cüľľellä $2 on spiiska viimeiziss pühcimühsiiss.',
+'dellogpage' => 'Pühitüd cüľľed',
+'deletecomment' => 'Süü',
+'deleteotherreason' => 'Muu vai lisä süü',
 'deletereasonotherlist' => 'Muu süü',
 
 # Rollback
+'rollback_short' => 'Vääntega',
 'rollbacklink' => 'vääntega',
 
 # Protect
-'protectlogpage'              => 'Varjõtud tšüľľed',
-'protectedarticle'            => '"[[$1]]" on nüd varjõttu',
-'modifiedarticleprotection'   => 'muuti tšüľľee [[$1]] varjauztasoa',
-'protectcomment'              => 'Süü',
-'protectexpiry'               => 'Lõpub:',
-'protect_expiry_invalid'      => 'Lõppuaika eb kõlpa.',
-'protect_expiry_old'          => 'Lõppuaika on meneväz.',
-'protect-text'                => "Võitta kattsoa ja muuttaa tšüľľee '''$1''' lupoit.",
-'protect-locked-access'       => "Että või muuttaa tšüľľee varjauztasoa. All on tšüľľee \"'''\$1'''\" nütšüized varjauztazod:",
-'protect-cascadeon'           => 'Kase tšültši on varjõttu, ku on sisällütettü all {{PLURAL:$1|õlõvaa jadgotussi varjõttuhõõ tšültšese|õlõvii jadgotussi varjõttuisõ tšültšiise}}. Võitta muuttaa sene tšüľľee varjuztasoa, mutta se eb vaikuta jadgotõttuu varjuhsiise.',
-'protect-default'             => 'Salli kõik tšäüttijäd',
-'protect-fallback'            => 'Treebuit $1-õikuz',
-'protect-level-autoconfirmed' => 'Piättee uuvvõd ja anonüümed tšäüttijäd',
-'protect-level-sysop'         => 'Ainult praviťeľad',
-'protect-summary-cascade'     => 'jadgotõltu',
-'protect-expiring'            => 'lõpub $1',
-'protect-cascade'             => 'Varjaa jõka tšültši, kumpa on tänne tšültšesee sisällütennü.',
-'protect-cantedit'            => 'Että või muuttaa tšüľľee varjauztasoa, ku tüü että saa muuttaa tšültšiä.',
-'restriction-type'            => 'Rajauz',
-'restriction-level'           => 'Varjauz',
+'protectlogpage' => 'Varjõtud cüľľed',
+'protectedarticle' => '"[[$1]]" on nüd varjõttu',
+'modifiedarticleprotection' => 'muuti cüľľee [[$1]] varjauztasoa',
+'protectcomment' => 'Süü',
+'protectexpiry' => 'Lõpub:',
+'protect_expiry_invalid' => 'Lõppuaika eb kõlpa.',
+'protect_expiry_old' => 'Lõppuaika on meneväz.',
+'protect-text' => "Võitta kattsoa ja muuttaa cüľľee '''$1''' lupoit.",
+'protect-locked-access' => "Että või muuttaa cüľľee varjauztasoa. All on cüľľee \"'''\$1'''\" nücüized varjauztazod:",
+'protect-cascadeon' => 'Kase cülci on varjõttu, ku on sisällütettü all {{PLURAL:$1|õlõvaa jadgotussi varjõttuhõõ cülcese|õlõvii jadgotussi varjõttuisõ cülciise}}. Võitta muuttaa sene cüľľee varjuztasoa, mutta se eb vaikuta jadgotõttuu varjuhsiise.',
+'protect-default' => 'Salli kõik cäüttijäd',
+'protect-fallback' => 'Treebuit $1-õikuz',
+'protect-level-autoconfirmed' => 'Piättee uuvvõd ja anonüümed cäüttijäd',
+'protect-level-sysop' => 'Ainult praviťeľad',
+'protect-summary-cascade' => 'jadgotõltu',
+'protect-expiring' => 'lõpub $1',
+'protect-expiry-indefinite' => 'iciin',
+'protect-cascade' => 'Varjaa jõka cülci, kumpa on tänne cülcesee sisällütennü.',
+'protect-cantedit' => 'Että või muuttaa cüľľee varjauztasoa, ku tüü että saa muuttaa cülciä.',
+'protect-otherreason-op' => 'Muu süü',
+'protect-expiry-options' => '1 tunni:1 hour,1 päivä:1 day,1 näteľi:1 week,2 näteľiä:2 weeks,1 kuu:1 month,3 kuut:3 months,6 kuut:6 months,1 voosi:1 year,iciin:infinite',
+'restriction-type' => 'Rajauz',
+'restriction-level' => 'Varjauz',
+
+# Restrictions (nouns)
+'restriction-edit' => 'Muuttaa',
+'restriction-move' => 'Liikut',
+'restriction-create' => 'Loo cülci',
 
 # Undelete
 'undeletelink' => 'näüt/vääntee',
+'undeleteviewlink' => 'prestavleńńõd',
+'undeletecomment' => 'Süü:',
+'undelete-search-submit' => 'Etsi',
+'undelete-show-file-submit' => 'Daa',
+'undelete-revisionrow' => '$1 $2 ($3) $4 . . $5 $6 $7',
 
 # Namespace form on various pages
-'namespace'      => 'Nimiruumi:',
-'invert'         => 'Tšäänn nimiruumivalimin päävassaizõssi',
+'namespace' => 'Nimiruumi:',
+'invert' => 'Cäänn nimiruumivalimin päävassaizõssi',
 'blanknamespace' => '(Artikkelid)',
 
 # Contributions
-'contributions'       => 'Tšäüttijää avittamizõd',
-'contributions-title' => 'äüttijää $1 avittamizõd',
-'mycontris'           => 'Minu avittamizõd',
-'contribsub2'         => 'Tšäüttijää $1 ($2) avittamizõd',
-'uctop'               => '(ülez)',
-'month'               => 'Kuu',
-'year'                => 'Voosi:',
-
-'sp-contributions-newbies'  => 'Näüt uusijõõ tšäüttijee muutuhsõd',
+'contributions' => 'Cäüttijää avittamizõd',
+'contributions-title' => 'Cäüttijää $1 avittamizõd',
+'mycontris' => 'Minu avittamizõd',
+'contribsub2' => 'Cäüttijää $1 ($2) avittamizõd',
+'uctop' => '(ülez)',
+'month' => 'Kuu',
+'year' => 'Voosi:',
+
+'sp-contributions-newbies' => 'Näüt uusijõõ cäüttijee muutuhsõd',
 'sp-contributions-blocklog' => 'piättelemized',
-'sp-contributions-search'   => 'Etsi avittamisiit',
-'sp-contributions-username' => 'IP-adressi vai tšäüttijänimi',
-'sp-contributions-submit'   => 'Etsi',
+'sp-contributions-logs' => 'logid',
+'sp-contributions-talk' => 'Juttu',
+'sp-contributions-search' => 'Etsi avittamisiit',
+'sp-contributions-username' => 'IP-adressi vai cäüttijänimi',
+'sp-contributions-submit' => 'Etsi',
 
 # What links here
-'whatlinkshere'            => 'Linkid tänne',
-'whatlinkshere-title'      => 'Tšüľľed, kummad näütellä tšüľľelle "$1"',
-'whatlinkshere-page'       => 'Tšültši:',
-'linkshere'                => "Vahtiaavilt tšültšiilt on linkki tšüľľelle '''[[:$1]]''':",
-'isredirect'               => 'mešaituztšültši',
-'istemplate'               => 'sisällütüz šabloonii',
-'isimage'                  => 'kuvalinkki',
-'whatlinkshere-prev'       => '{{PLURAL:$1|entiin tšültši|$1 entiiss tšültšiä}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|vahtiaava tšültši|$1 vahtiaava tšültšiä}}',
-'whatlinkshere-links'      => '← linkid',
+'whatlinkshere' => 'Linkid tänne',
+'whatlinkshere-title' => 'Cüľľed, kummad näütellä cüľľelle "$1"',
+'whatlinkshere-page' => 'Cülci:',
+'linkshere' => "Vahtiaavilt cülciilt on linkki cüľľelle '''[[:$1]]''':",
+'isredirect' => 'mešaituzcülci',
+'istemplate' => 'sisällütüz šabloonii',
+'isimage' => 'kuvalinkki',
+'whatlinkshere-prev' => '{{PLURAL:$1|entiin cülci|$1 entiiss cülciä}}',
+'whatlinkshere-next' => '{{PLURAL:$1|vahtiaava cülci|$1 vahtiaava cülciä}}',
+'whatlinkshere-links' => '← linkid',
 'whatlinkshere-hideredirs' => '$1 mešaituhsõd',
-'whatlinkshere-hidetrans'  => '$1 sisällütühsed',
-'whatlinkshere-hidelinks'  => '$1 linkid',
-'whatlinkshere-filters'    => 'Fiľtrad',
+'whatlinkshere-hidetrans' => '$1 sisällütühsed',
+'whatlinkshere-hidelinks' => '$1 linkid',
+'whatlinkshere-hideimages' => '$1 faililinkid',
+'whatlinkshere-filters' => 'Fiľtrad',
 
 # Block/unblock
-'blockip'                  => 'Piättee tšäüttijää',
-'ipboptions'               => '2 tunnia:2 hours,1 päivä:1 day,3 päivää:3 days,1 näteľi:1 week,2 näteľiä:2 weeks,1 kuu:1 month,3 kuut:3 months,6 kuut:6 months,1 voosi:1 year,itšiin:infinite',
-'ipblocklist'              => 'Piäteltüd IP-adressid ja tšäüttijänimed',
-'blocklink'                => 'piättee',
-'unblocklink'              => 'rootši piäsüss',
-'change-blocklink'         => 'muutu piätüss',
-'contribslink'             => 'avittamizõd',
-'blocklogpage'             => 'Piätüzlogi',
-'blocklogentry'            => 'piätteli tšäüttijää vai IP-tšislaa [[$1]]. Piättelemin lõpub $2 $3',
-'unblocklogentry'          => 'rootši tšäüttijält $1 muutuzpiäsüss',
+'blockip' => 'Piättee cäüttijää',
+'ipbreason' => 'Süü:',
+'ipboptions' => '2 tunnia:2 hours,1 päivä:1 day,3 päivää:3 days,1 näteľi:1 week,2 näteľiä:2 weeks,1 kuu:1 month,3 kuut:3 months,6 kuut:6 months,1 voosi:1 year,iciin:infinite',
+'ipbotheroption' => 'muu',
+'ipblocklist' => 'Piäteltüd IP-adressid ja cäüttijänimed',
+'blocklist-reason' => 'Süü',
+'ipblocklist-submit' => 'Etsi',
+'infiniteblock' => 'iciin',
+'blocklink' => 'piättee',
+'unblocklink' => 'rooci piäsüss',
+'change-blocklink' => 'muutu piätüss',
+'contribslink' => 'avittamizõd',
+'blocklogpage' => 'Piätüzlogi',
+'blocklogentry' => 'piätteli cäüttijää vai IP-cislaa [[$1]]. Piättelemin lõpub $2 $3',
+'unblocklogentry' => 'rooci cäüttijält $1 muutuzpiäsüss',
 'block-log-flags-nocreate' => 'lukuloomin piäteltü',
+'proxyblocksuccess' => 'On tehtü.',
 
 # Move page
-'movepagetext'     => "Alla õlõvall ruumõll võitta anta tšüľľelle uutt nimiä; kõik tšüľľee istori leeb liikutõttu uuvvõ nimee alle.
-Vanass tšüľľess nõizõb tulõma mešaituztšültši, kumpa näütteeb uuvvõsõ tšültšese.
-Võitta obnovoittaa tšültšese silmell lüüvvävä mešaituhsõd avtomaattisessi uuvõllõ nimelle.
-Kui että taho sitä tehävää avtomaattisessi, mälehtega ettsiää [[Special:DoubleRedirects|kahskõrtaissit]] vai [[Special:BrokenRedirects|katiit]] mešaituhsiit.
+'movepagetext' => "Alla õlõvall ruumõll võitta anta cüľľelle uutt nimiä; kõik cüľľee istori leeb liikutõttu uuvvõ nimee alle.
+Vanass cüľľess nõizõb tulõma mešaituzcülci, kumpa näütteeb uuvvõsõ cülcese.
+Võitta obnovoittaa cülcese silmell lüüvvävä mešaituhsõd avtomaattisessi uuvõllõ nimelle.
+Kui että taho sitä tehävää avtomaattisessi, mälehtega ettsiää [[Special:DoubleRedirects|kahskõrtaissit]] vai [[Special:BrokenRedirects|katciit]] mešaituhsiit.
 Õlõtta vastuussa sihee, jot linkid näütteeväd sinne, kuhõõ ned pitäiziväd näütellää.
 
-Tšültšiä '''eb''' nõizõ liikuttama, kui uusi nimi on jo tšäütennü, muut kuiva kui tšültši on tühjä vai on mešaituz, kummall ebõõ muutuzistoria.
-See täheteb sitä, jot võitta liikuttaa tšüľľee takaz vanalle nimelle kui öhsünettä, mutta että või tširjuttaa eloz õlõvaa tšüľľee päälle.
+Cülciä '''eb''' nõizõ liikuttama, kui uusi nimi on jo cäütennü, muut kuiva kui cülci on tühjä vai on mešaituz, kummall ebõõ muutuzistoria.
+See täheteb sitä, jot võitta liikuttaa cüľľee takaz vanalle nimelle kui öhsünettä, mutta että või cirjuttaa eloz õlõvaa cüľľee päälle.
 
-See saattab õlla suuri ja oottõmizõtoi muutuz populaarnoille tšüľľelle. Õlka nii üvä, obespetšoittõga, jot saatta arvoa sledstvijäd ennee kui liikutta tšüľľee.",
-'movepagetalktext' => "Tšültši ja sene juttutšültši leeväd liikutõtud ühez, '''va kui''':
-*Tseeľitšüľľell on eloz juttutšültši, kumpa ebõõ tühjä, vai
+See saattab õlla suuri ja oottõmizõtoi muutuz populaarnoille cüľľelle. Õlka nii üvä, obespecoittõga, jot saatta arvoa sledstvijäd ennee kui liikutta cüľľee.",
+'movepagetalktext' => "Cülci ja sene juttucülci leeväd liikutõtud ühez, '''va kui''':
+*Tseeľicüľľell on eloz juttucülci, kumpa ebõõ tühjä, vai
 *Jätättä all õlõvaa ruuoo merkkittämättä.
 
-Neill kõhtoill piättä liikuttaa vai ühissää tšüľľee tšäzi.",
-'movearticle'      => 'Liikut tšültši',
-'newtitle'         => 'Uusi nimi tšüľľelee',
-'move-watch'       => 'Katso sitä tšültšiä',
-'movepagebtn'      => 'Liikut tšültši',
-'pagemovedsub'     => 'Liikka tuli valmessi',
-'movepage-moved'   => '\'\'\'"$1" on liikuttu nimelee "$2"\'\'\'',
-'articleexists'    => 'Tseeľitšültši on jo eloz, vai võõbornoi nimi eb kõlpa. Õlka nii üvä ja valittsõga uusi nimi.',
-'talkexists'       => "'''Tšüľľee liikka tuli valmessi, a juttitšültšiä eb õli liikutõttu, ku uuvvõ zagolofkaa all on jo juttutšültši. Juttutšültšije sisälto piättä ühinessä tšäzi.'''",
-'movedto'          => 'liikutõttu',
-'movetalk'         => 'Liikut toož juttutšültši',
-'movelogpage'      => 'Liikkalogi',
-'movereason'       => 'Süü',
-'revertmove'       => 'kummut',
+Neill kõhtoill piättä liikuttaa vai ühissää cüľľee cäzi.",
+'movearticle' => 'Liikut cülci',
+'newtitle' => 'Uusi nimi cüľľelee',
+'move-watch' => 'Katso sitä cülciä',
+'movepagebtn' => 'Liikut cülci',
+'pagemovedsub' => 'Liikka tuli valmessi',
+'movepage-moved' => '\'\'\'"$1" on liikuttu nimelee "$2"\'\'\'',
+'articleexists' => 'Tseeľicülci on jo eloz, vai võõbornoi nimi eb kõlpa. Õlka nii üvä ja valittsõga uusi nimi.',
+'talkexists' => "'''Cüľľee liikka tuli valmessi, a jutticülciä eb õli liikutõttu, ku uuvvõ zagolofkaa all on jo juttucülci. Juttucülcije sisälto piättä ühinessä cäzi.'''",
+'movedto' => 'liikutõttu',
+'movetalk' => 'Liikut toož juttucülci',
+'movelogpage' => 'Liikkalogi',
+'movereason' => 'Süü',
+'revertmove' => 'kummut',
 
 # Export
-'export' => 'Tšültšiďďee väľľää veto',
+'export' => 'Cülciďďee väľľää veto',
+
+# Namespace 8 related
+'allmessagesname' => 'Nimi',
+'allmessages-language' => 'Ceeli:',
+'allmessages-filter-submit' => 'Mee',
 
 # Thumbnails
 'thumbnail-more' => 'Suurõt',
+'thumbnail_error' => 'Vika: $1',
+
+# Special:Import
+'import-upload-filename' => 'Failinimi:',
+'import-comment' => 'Zamecańńa:',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Teďďee tšäüttijätšültši',
-'tooltip-pt-mytalk'               => 'Teďďee juttu-tšültši',
-'tooltip-pt-preferences'          => 'Teďďee koozid',
-'tooltip-pt-watchlist'            => 'Spiiska tšültšissä, kummad muutussia kattsõõtta',
-'tooltip-pt-mycontris'            => 'Spiiska teďďee avittamisiit',
-'tooltip-pt-login'                => 'Müü taritsõmmõ teit süäme tširjuttõma, a ebõõ tarvitõttõva',
-'tooltip-pt-logout'               => 'Tširjut uloz',
-'tooltip-ca-talk'                 => 'Juttu sisällossa',
-'tooltip-ca-edit'                 => 'Tüü võittõ muuttaa sitä tšültšiä.
+'tooltip-pt-userpage' => 'Teďďee cäüttijäcülci',
+'tooltip-pt-mytalk' => 'Teďďee juttu-cülci',
+'tooltip-pt-preferences' => 'Teďďee koozid',
+'tooltip-pt-watchlist' => 'Spiiska cülcissä, kummad muutussia kattsõõtta',
+'tooltip-pt-mycontris' => 'Spiiska teďďee avittamisiit',
+'tooltip-pt-login' => 'Müü taritsõmmõ teit süäme cirjuttõma, a ebõõ tarvitõttõva',
+'tooltip-pt-logout' => 'Cirjut uloz',
+'tooltip-ca-talk' => 'Juttu sisällossa',
+'tooltip-ca-edit' => 'Tüü võittõ muuttaa sitä cülciä.
 Õõ nii üvä, ennee salvomiss, retsenziroittiga!',
-'tooltip-ca-addsection'           => 'Lissä uusi alaõsa',
-'tooltip-ca-viewsource'           => 'Kase tšültši on varjõttu.
-Että või muuttaa tšültšia, mutta võittõ kattsoa sene lähtekoodi.',
-'tooltip-ca-history'              => 'Sene tšüľľee vanad verzijad',
-'tooltip-ca-protect'              => 'Varjaa kase tšültši',
-'tooltip-ca-delete'               => 'Pühi kase tšültši',
-'tooltip-ca-move'                 => 'Liikut kase tšültši',
-'tooltip-ca-watch'                => 'Lissä kase tšültši kattsõspiiskalõõ',
-'tooltip-ca-unwatch'              => 'Paa kase tšültši Teďďee kattsõspiizgalt poiz',
-'tooltip-search'                  => 'Etsi vikissa',
-'tooltip-search-go'               => 'Mee tšüľľelee, kummall on vakurat sesama nimi (kui eloz on)',
-'tooltip-search-fulltext'         => 'Etsi tšültšiltä sitä tekstiä',
-'tooltip-n-mainpage'              => 'Mee esitšüľľelee',
-'tooltip-n-mainpage-description'  => 'Mee esitšüľľelee',
-'tooltip-n-portal'                => 'Juttua projektissa: Mitä tüü võittõ tehä, kuza levvette mitä',
-'tooltip-n-currentevents'         => 'Lugõ soobšeńńad nütšüizess kõhtoiss',
-'tooltip-n-recentchanges'         => 'Spiiska uusissa muutussissa',
-'tooltip-n-randompage'            => 'Avaa tšültšia kõhtõissi',
-'tooltip-n-help'                  => 'Praavila',
-'tooltip-t-whatlinkshere'         => 'Spiiska kõikkissa tšültšissä, kummad tänne näütellä',
-'tooltip-t-recentchangeslinked'   => 'Viimõizõd muuttussõd tšültšillä, kummalõõ on siittä näüteltü',
-'tooltip-feed-rss'                => 'RSS-söötte selle tšüľľelle',
-'tooltip-feed-atom'               => 'Atom-söötte selle tšüľľelle',
-'tooltip-t-contributions'         => 'Näüt spiiska sene tšäüttijää avittamiss',
-'tooltip-t-emailuser'             => 'Lähettega elektropoštia selle tšäüttijälle',
-'tooltip-t-upload'                => 'Laajõngoit failia ülez (загружать файл)',
-'tooltip-t-specialpages'          => 'Spiiska kõikkissa osoobenoissa tšültšissä',
-'tooltip-t-print'                 => 'Sene tšüľľee petšatoittõva verzija',
-'tooltip-t-permalink'             => 'Postojannoi linkki tšüľľee selle verzijalõõ',
-'tooltip-ca-nstab-main'           => 'Näüt artikkelia',
-'tooltip-ca-nstab-user'           => 'Näüt tšäüttijätšültši',
-'tooltip-ca-nstab-special'        => 'Kase on osoobennoi tšültši, tüü ed saa sitä muuttõma',
-'tooltip-ca-nstab-project'        => 'Näüt projektitšültši',
-'tooltip-ca-nstab-image'          => 'Näüt failitšültši',
-'tooltip-ca-nstab-template'       => 'Näüt šablooni',
-'tooltip-ca-nstab-category'       => 'Näüt gruppatšültši',
-'tooltip-minoredit'               => 'Merkit kase peenessi muutuhsõssi',
-'tooltip-save'                    => 'Salvo muutussõd',
-'tooltip-preview'                 => 'Retsenziroitta muutuss. Õõ nii üvä, ennee salvomiss, retsenziroittiga!',
-'tooltip-diff'                    => 'Näüt tehtüd muutuhsõd',
+'tooltip-ca-addsection' => 'Lissä uusi alaõsa',
+'tooltip-ca-viewsource' => 'Kase cülci on varjõttu.
+Että või muuttaa cülcia, mutta võittõ kattsoa sene lähtekoodi.',
+'tooltip-ca-history' => 'Sene cüľľee vanad verzijad',
+'tooltip-ca-protect' => 'Varjaa kase cülci',
+'tooltip-ca-delete' => 'Pühi kase cülci',
+'tooltip-ca-move' => 'Liikut kase cülci',
+'tooltip-ca-watch' => 'Lissä kase cülci kattsõspiiskalõõ',
+'tooltip-ca-unwatch' => 'Paa kase cülci Teďďee kattsõspiizgalt poiz',
+'tooltip-search' => 'Etsi vikissa',
+'tooltip-search-go' => 'Mee cüľľelee, kummall on vakurat sesama nimi (kui eloz on)',
+'tooltip-search-fulltext' => 'Etsi cülciltä sitä tekstiä',
+'tooltip-p-logo' => 'Mee esicüľľelee',
+'tooltip-n-mainpage' => 'Mee esicüľľelee',
+'tooltip-n-mainpage-description' => 'Mee esicüľľelee',
+'tooltip-n-portal' => 'Juttua projektissa: Mitä tüü võittõ tehä, kuza levvette mitä',
+'tooltip-n-currentevents' => 'Lugõ soobšeńńad nücüizess kõhtoiss',
+'tooltip-n-recentchanges' => 'Spiiska uusissa muutussissa',
+'tooltip-n-randompage' => 'Avaa cülcia kõhtõissi',
+'tooltip-n-help' => 'Praavila',
+'tooltip-t-whatlinkshere' => 'Spiiska kõikkissa cülcissä, kummad tänne näütellä',
+'tooltip-t-recentchangeslinked' => 'Viimõizõd muuttussõd cülcillä, kummalõõ on siittä näüteltü',
+'tooltip-feed-rss' => 'RSS-söötte selle cüľľelle',
+'tooltip-feed-atom' => 'Atom-söötte selle cüľľelle',
+'tooltip-t-contributions' => 'Näüt spiiska sene cäüttijää avittamiss',
+'tooltip-t-emailuser' => 'Lähettega elektropoštia selle cäüttijälle',
+'tooltip-t-upload' => 'Laajõngoit failia ülez',
+'tooltip-t-specialpages' => 'Spiiska kõikkissa osoobenoissa cülcissä',
+'tooltip-t-print' => 'Sene cüľľee pecatoittõva verzija',
+'tooltip-t-permalink' => 'Postojannoi linkki cüľľee selle verzijalõõ',
+'tooltip-ca-nstab-main' => 'Näüt artikkelia',
+'tooltip-ca-nstab-user' => 'Näüt cäüttijäcülci',
+'tooltip-ca-nstab-special' => 'Kase on osoobennoi cülci, tüü ed saa sitä muuttõma',
+'tooltip-ca-nstab-project' => 'Näüt projekticülci',
+'tooltip-ca-nstab-image' => 'Näüt failicülci',
+'tooltip-ca-nstab-template' => 'Näüt šablooni',
+'tooltip-ca-nstab-category' => 'Näüt gruppacülci',
+'tooltip-minoredit' => 'Merkit kase peenessi muutuhsõssi',
+'tooltip-save' => 'Salvo muutussõd',
+'tooltip-preview' => 'Retsenziroitta muutuss. Õõ nii üvä, ennee salvomiss, retsenziroittiga!',
+'tooltip-diff' => 'Näüt tehtüd muutuhsõd',
 'tooltip-compareselectedversions' => 'Näütää vahõd 2 valitsõttuďďõ verzijoďďõ väliz',
-'tooltip-watch'                   => 'Lissä kase tšültši kattsõspiizgallõ',
-'tooltip-rollback'                => 'Vääntega tšüľľee teksti vanõmpi verzijalõõ',
-'tooltip-undo'                    => '"Kummut" väänteeb kasene muutusõõ ja avab artikkelii prestavleńńaa.
+'tooltip-watch' => 'Lissä kase cülci kattsõspiizgallõ',
+'tooltip-rollback' => 'Vääntega cüľľee teksti vanõmpi verzijalõõ',
+'tooltip-undo' => '"Kummut" väänteeb kasene muutusõõ ja avab artikkelii prestavleńńaa.
 Toož, võittõ tširjutta väänteüssee süü.',
+'tooltip-summary' => 'Turvotuz',
 
 # Browsing diffs
 'previousdiff' => '← Vanõpi muutuz',
-'nextdiff'     => 'Uuvvõpi muutuz →',
+'nextdiff' => 'Uuvvõpi muutuz →',
 
 # Media information
 'file-info-size' => '$1 × $2 px, $3, MIME-sortta: $4',
-'file-nohires'   => 'Suurõpaa kuva ebõõ.',
-'svg-long-desc'  => 'SVG-faili $1 × $2 px, failii suuruz: $3',
+'file-nohires' => 'Suurõpaa kuva ebõõ.',
+'svg-long-desc' => 'SVG-faili $1 × $2 px, failii suuruz: $3',
 'show-big-image' => 'Kõrka-rezoľuuttsiin verzija',
 
+# Special:NewFiles
+'ilsubmit' => 'Etsi',
+
 # Bad image list
 'bad_image_list' => 'Spiizgaa formatti on:
 
@@ -601,12 +853,12 @@ Esimein linkki viirulla piäb õllaa linkki kahõpäälizõlõõ faililõõ.
 Kõik muud linkid leeväd pantu panõlõõ nii ku ero.',
 
 # Metadata
-'metadata'          => 'Sisältokuvõtuz',
-'metadata-help'     => 'Kase faili sisältäb lisäinformatsijaa, mikä on lizättü tsifrovoi kamera vai skanera poolt.
+'metadata' => 'Sisältokuvõtuz',
+'metadata-help' => 'Kase faili sisältäb lisäinformatsijaa, mikä on lizättü tsifrovoi kamera vai skanera poolt.
 Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull failill.',
-'metadata-expand'   => 'Näüt lontsõkait detaaľiit',
+'metadata-expand' => 'Näüt lontsõkait detaaľiit',
 'metadata-collapse' => 'Salauta lontsõkait detaaľiit',
-'metadata-fields'   => 'Vahtiaavad platsid õvad vällez kuvatšüľľell, ku sisältotabľittsa on peenettettü.
+'metadata-fields' => 'Vahtiaavad platsid õvad vällez kuvacüľľell, ku sisältotabľittsa on peenettettü.
 * make
 * model
 * datetimeoriginal
@@ -621,21 +873,71 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
 * gpslongitude
 * gpsaltitude',
 
+# EXIF tags
+'exif-gpstimestamp' => 'GPS-aika',
+'exif-languagecode' => 'Ceeli',
+'exif-iimcategory' => 'Gruppa',
+
+'exif-meteringmode-255' => 'Muu',
+
+'exif-gaincontrol-0' => 'Eb õõ',
+
+'exif-iimcategory-ace' => 'Kunsti ja kulttuuri',
+'exif-iimcategory-hth' => 'Terveüz',
+'exif-iimcategory-pol' => 'Politiikka',
+'exif-iimcategory-wea' => 'Ilma',
+
 # External editor support
-'edit-externally'      => 'Muuttaa sitä failia ulkopoolizõõ prograammiikaa.',
+'edit-externally' => 'Muuttaa sitä failia ulkopoolizõõ prograammiikaa.',
 'edit-externally-help' => '(Kattsoga [//www.mediawiki.org/wiki/Manual:External_editors praavilõd], kui tahotta lisäinformaattsia.)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'koko istori',
 'namespacesall' => 'kõik',
-'monthsall'     => 'kõik',
+'monthsall' => 'kõik',
+'limitall' => 'kõik',
+
+# action=purge
+'confirm_purge_button' => 'OK',
+
+# action=watch/unwatch
+'confirm-watch-button' => 'OK',
+'confirm-unwatch-button' => 'OK',
+
+# Table pager
+'table_pager_first' => 'Esimein cülci',
+'table_pager_last' => 'Viimein cülci',
+'table_pager_limit_submit' => 'Mee',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Näüt muutuhsõd',
 'watchlisttools-edit' => 'Muuttaa spiiskaa',
-'watchlisttools-raw'  => 'Muut lähtefaili',
+'watchlisttools-raw' => 'Muut lähtefaili',
+
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
+
+# Special:FilePath
+'filepath-page' => 'Faili:',
+'filepath-submit' => 'Mee',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch-filename' => 'Failinimi:',
+'fileduplicatesearch-submit' => 'Etsi',
 
 # Special:SpecialPages
-'specialpages' => 'Osoobenoid tšüľľed',
+'specialpages' => 'Osoobenoid cüľľed',
+
+# Special:Tags
+'tag-filter' => "[[Special:Tags|Deskriptorije]] fil'tra:",
+'tags-edit' => 'muuttaa',
+
+# HTML forms
+'htmlform-selectorother-other' => 'Muu',
+
+# Feedback
+'feedback-message' => 'Ilmottamin:',
+'feedback-cancel' => 'Otmeńoit',
+'feedback-close' => 'On tehtü',
 
 );
index df09c18..a485807 100644 (file)
@@ -38,7 +38,7 @@ $namespaceNames = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#saadaq', '#suuna', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#saadaq', '#suuna', '#REDIRECT' ),
 );
 
 $messages = array(
@@ -83,7 +83,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'Käkiq perräkaemisnimekirän ärq nimega sisselännüisi pruukjidõ toimõndusõq',
 'tog-watchlisthideanons' => 'Käkiq perräkaemisnimekirän ärq nimeldä pruukjidõ toimõndusõq',
 'tog-watchlisthidepatrolled' => 'Näüdäku-i perräkaemisnimekirän kontrollituid toimõnduisi',
-'tog-nolangconversion' => 'Jätäq ärq variantõ võrrõlus',
 'tog-ccmeonemails' => "Saadaq mullõ kopiq e-kir'ost, miä ma saada tõisilõ pruukjilõ",
 'tog-diffonly' => 'Näüdäku-i lahkominekide lehe all lehe täüt sissu',
 'tog-showhiddencats' => 'Näütäq käkitüid katõgoorijit',
@@ -1032,17 +1031,17 @@ Helüteedüstü puhul: <b>[[media:teedüstü.ogg]]</b>.
 'large-file' => 'Teedüstüq tohe-i ollaq suurõmbaq, ku $1, a taa teedüstü om $2.',
 'largefileserver' => 'Teedüstü om suurõmb ku server lupa.',
 'emptyfile' => "Teedüstü, midä sa proovõq üles laatiq paistus ollõv tühi. Kaeq üle, et kirotit nime õigõhe ja et taa olõ-i serverile pall'o suur.",
-'fileexists' => "Sama nimega teedüstü om jo olõman.
-Katso '''<tt>[[:$1]]</tt>''', ku sa olõ-i kimmäs, et tahat taad muutaq.
-[[$1|thumb]]",
-'fileexists-extension' => "Sääntse nimega teedüstü om jo olõman: [[$2|thumb]]
-* Üleslaaditava teedüstü nimi: '''<tt>[[:$1]]</tt>'''
-* Olõmanolõva teedüstü nimi: '''<tt>[[:$2]]</tt>'''
-Ainugõnõ vaih om laendusõ suurõ/väiku algustähe man. Kaeq perrä, kas naaq ommaq üts ja tuusama teedüstü.",
+'fileexists' => 'Sama nimega teedüstü om jo olõman.
+Katso <strong>[[:$1]]</strong>, ku sa olõ-i kimmäs, et tahat taad muutaq.
+[[$1|thumb]]',
+'fileexists-extension' => 'Sääntse nimega teedüstü om jo olõman: [[$2|thumb]]
+* Üleslaaditava teedüstü nimi: <strong>[[:$1]]</strong>
+* Olõmanolõva teedüstü nimi: <strong>[[:$2]]</strong>
+Ainugõnõ vaih om laendusõ suurõ/väiku algustähe man. Kaeq perrä, kas naaq ommaq üts ja tuusama teedüstü.',
 'fileexists-thumbnail-yes' => "Taa paistus ollõv vähändet pilt ''(thumbnail)''. [[$1|thumb]]
-Kaeq teedüstü '''<tt>[[:$1]]</tt>'''üle.
+Kaeq teedüstü <strong>[[:$1]]</strong>üle.
 Ku ülekaet teedüstü om sama pilt alguperälidsen suurusõn, sis olõ-i vaia eräle vähändedüt pilti üles laatiq.",
-'file-thumbnail-no' => "Teedüstü nimi nakkas pääle '''<tt>$1</tt>'''. Taa paistus ollõv vähändet pilt ''(thumbnail)''. Ku sul om olõman taa pilt tävven suurusõn, sis laadiq üles tuu, ku olõ-i, sis muudaq teedüstü nimi ärq.",
+'file-thumbnail-no' => "Teedüstü nimi nakkas pääle <strong>$1</strong>. Taa paistus ollõv vähändet pilt ''(thumbnail)''. Ku sul om olõman taa pilt tävven suurusõn, sis laadiq üles tuu, ku olõ-i, sis muudaq teedüstü nimi ärq.",
 'fileexists-forbidden' => 'Sääntse nimega teedüstü om jo olõman. Pästäq teedüstü tõõsõ nimega. Parhillanõ teedüstü: [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Sama nimega teedüstü om jo olõman jaetuidõ teedüstüide hulgan. Pästäq teedüstü mõnõ tõõsõ nime ala. Parhillanõ teedüstü: [[File:$1|thumb|center|$1]]',
 'uploadwarning' => 'Üleslaatmishoiatus',
@@ -1127,7 +1126,7 @@ Ku ülekaet teedüstü om sama pilt alguperälidsen suurusõn, sis olõ-i vaia e
 
 # MIME search
 'mimesearch' => 'MIME-otsminõ',
-'mimesearch-summary' => 'Taa lehe pääl saat otsiq teedüstüid näide MIME-tüübi perrä. Kirodaq: sisutüüp/alltüüp, nt <tt>image/jpeg</tt>.',
+'mimesearch-summary' => 'Taa lehe pääl saat otsiq teedüstüid näide MIME-tüübi perrä. Kirodaq: sisutüüp/alltüüp, nt <code>image/jpeg</code>.',
 'mimetype' => 'MIME-tüüp:',
 'download' => 'laat',
 
index f7d549e..adeb032 100644 (file)
@@ -59,11 +59,17 @@ $specialPageAliases = array(
        'Allpages'                  => array( 'Totes_les_pådjes' ),
        'Block'                     => array( 'Bloker', 'Blocaedje' ),
        'Categories'                => array( 'Categoreyes' ),
+       'Listusers'                 => array( 'Djivêye_des_uzeus' ),
+       'Log'                       => array( 'Djournå', 'Djournås' ),
        'Preferences'               => array( 'Preferinces' ),
        'Prefixindex'               => array( 'Indecse_pa_betchete' ),
        'Search'                    => array( 'Cweri' ),
        'Specialpages'              => array( 'Pådjes_sipeciåles' ),
        'Statistics'                => array( 'Sitatistikes' ),
+       'Undelete'                  => array( 'Rapexhî' ),
+       'Upload'                    => array( 'Eberweter', 'Eberwetaedje' ),
+       'Userlogin'                 => array( 'Elodjaedje' ),
+       'Userlogout'                => array( 'Dislodjaedje' ),
        'Version'                   => array( 'Modêye' ),
        'Watchlist'                 => array( 'Pådjes_shuvowes' ),
 );
@@ -84,7 +90,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Èn nén mostrer les candjmints ddja patrouyîs',
 'tog-newpageshidepatrolled' => 'Èn nén mostrer el djivêye des novelès pådjes les cenes dedja patrouyeyes',
 'tog-extendwatchlist' => "Ragrandi l' djivêye po mostrer tos les candjmints, nén seulmint les dierins",
-'tog-usenewrc' => 'Eployî les ramidrés dierins candjmints (i fåt JavaScript)',
+'tog-usenewrc' => "Relére par pådje dins les dierins candjmints et l' djivêye des shuvous (i fåt JavaScript)",
 'tog-numberheadings' => 'Limerotaedje otomatike des tites',
 'tog-showtoolbar' => "Mostrer l' bår d' usteyes e môde candjmint (JavaScript)",
 'tog-editondblclick' => 'Candjî les pådjes avou on dobe-clitch (JavaScript)',
@@ -249,6 +255,7 @@ $messages = array(
 'printableversion' => 'Modêye sicrirece-amiståve',
 'permalink' => 'Hårdêye viè cisse modêye ci',
 'print' => 'Imprimer',
+'view' => 'Vey',
 'edit' => 'Candjî',
 'create' => 'Ahiver',
 'editthispage' => "Candjî l' pådje",
@@ -334,6 +341,8 @@ $1",
 'restorelink' => '{{PLURAL:$1|on candjmint disfacé|$1 candjmints disfacés}}',
 'feedlinks' => 'Sindicåcion:',
 'feed-invalid' => 'Sôre di sindicåcion nén valide.',
+'site-atom-feed' => 'Floûs Atom di $1',
+'page-atom-feed' => 'Floûs Atom di «$1»',
 'red-link-title' => '$1 (nén co ataké)',
 'sort-descending' => 'Discrexhant relijhaedje',
 'sort-ascending' => 'Acrexhant relijhaedje',
@@ -374,7 +383,14 @@ a pårti del fonccion «$2».
 Li båze di dnêyes a rtourné l' aroke «$3: $4».",
 'laggedslavemode' => "Asteme: I s' pout ki l' pådje n' åye nén co les dierins candjmints.",
 'readonly' => 'Li båze di dnêyes est aclawêye',
+'missing-article' => "Li båze di dnêyes n' a nén trové l' tecse d' ene pådje k' åreut dvou esse trovêye, lomêye «$1» $2.
+
+Çoula arive cwand on shût on loyén po ene diferince k' est houte ou viè l' istwere d' ene pådej disfacêye.
+
+Si c' est nén çoula, motoit k' vos avoz trové on bug dins l' programe.
+Adon dijhoz l' a on [[Special:ListUsers/sysop|manaedjeu]], sins rovyî d' mete li hårdêye (URL) ki mostere l' aroke.",
 'missingarticle-rev' => '(l° del modêye: $1)',
+'missingarticle-diff' => '(dif: $1, $2)',
 'internalerror' => 'Divintrinne aroke',
 'internalerror_info' => 'Divintrinne aroke: $1',
 'filecopyerror' => "Dji n' a savou copyî l' fitchî «$1» viè «$2».",
@@ -431,6 +447,7 @@ Vosse conte a stî ahivé.
 'createaccount' => 'Ahiver on novea conte',
 'gotaccount' => "Vos avoz ddja on conte so ç' wiki ci? '''$1'''.",
 'gotaccountlink' => 'Elodjîz vs',
+'userlogin-resetlink' => "Avoz rovyî vos detays d' elodjaedje?",
 'createaccountmail' => 'pa emile',
 'createaccountreason' => 'Råjhon:',
 'badretype' => 'Vos avoz dné deus screts diferins.',
@@ -686,6 +703,7 @@ Li dierinne intrêye do djournå est håynêye chal pa dzo po referince:",
 'templatesusedsection' => '{{PLURAL:$1|Modele eployî|Modeles eployîs}} e cisse seccion ci:',
 'template-protected' => '(protedjî)',
 'template-semiprotected' => '(dimey-protedjî)',
+'hiddencategories' => "Cisse pådje ci est mimbe {{PLURAL:$1|d' ene categoreye catcheye|di $1 categoreyes catcheyes}}:",
 'nocreatetitle' => 'Ahivaedje di pådjes limité',
 'nocreatetext' => "{{SITENAME}} a limité l' possibilité d' ahiver des novelès pådjes.
 Vos ploz rivni en erî eyet candjî ene pådje k' egzistêye dedja, oudonbén, [[Special:UserLogin|vos elodjî ou ahiver on conte d' uzeu]].",
@@ -700,6 +718,11 @@ Motoit k' elle a stî tapêye evoye.",
 'edit-no-change' => "Vosse sicrijhaedje n' a nén passé, paski rén n' a stî candjî al modêye di dvant.",
 'edit-already-exists' => "Li novele pâdje n' a savou esse ahivêye, ca cisse pâdje la egzistêye dedja.",
 
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Asteme:''' I gn a trop di modeles dins cisse pådje ci.
+Sacwants di zels ni seront nén eployîs.",
+'post-expand-template-inclusion-category' => "Pådjes ki l' inclusion d' modeles est foû limite",
+
 # Account creation failure
 'cantcreateaccounttitle' => "Vos n' ploz nén ahiver-st on conte.",
 
@@ -761,6 +784,9 @@ Les ôtes manaedjeus so {{SITENAME}} pôront todi vey li contnou catchî eyet l'
 'revdelete-radio-unset' => 'Neni',
 'revdelete-log' => 'Råjhon:',
 'revdelete-submit' => 'Apliker {{PLURAL:$1|al modêye tchoezeye|åzès modêyes tchoezeyes}}',
+'revdel-restore' => "candjî l' veyåvisté",
+'revdel-restore-deleted' => 'disfacêyès modêyes',
+'revdel-restore-visible' => 'veyåvès modêyes',
 'deletedhist' => 'Istwere disfacêye',
 
 # History merging
@@ -769,6 +795,9 @@ Les ôtes manaedjeus so {{SITENAME}} pôront todi vey li contnou catchî eyet l'
 'mergehistory-no-source' => "Li pådje sourdant $1 n' egzistêye nén.",
 'mergehistory-reason' => 'Råjhon:',
 
+# Merge log
+'revertmerge' => 'Dispårti',
+
 # Diffs
 'history-title' => 'Istwere des candjmints po «$1»',
 'lineno' => 'Roye $1:',
@@ -1073,7 +1102,13 @@ Ciste infôrmacion serè publike po tertos.",
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|candjmint|candjmints}}',
 'recentchanges' => 'Dierins candjmints',
+'recentchanges-legend' => 'Tchuzes po les dierins candjmints',
 'recentchanges-summary' => "Shuvoz chal les dierins candjmints k' i gn a yeu dsu {{SITENAME}}.",
+'recentchanges-feed-description' => "Shuvoz so ç' canå ci les dierins candjmints k' i gn a yeu sol wiki.",
+'recentchanges-label-newpage' => "Ci candjmint la est èn ahivaedje d' ene nouve pådje",
+'recentchanges-label-minor' => "Ci n' est k' on ptit candjmint",
+'recentchanges-label-bot' => 'Ci candjmint la a stî fwait pa on robot',
+'recentchanges-label-unpatrolled' => "Ci candjmint la n' a nén co stî patrouyî",
 'rcnote' => "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les '''$1''' dierins candjmints}} {{PLURAL:$2|do dierin djoû|des '''$2''' dierins djoûs}}, disk' å $4 a $5.",
 'rcnotefrom' => "Chal pa dzo les candjmints dispoy li '''$2''' (disk' a '''$1''' di mostrés).",
 'rclistfrom' => "Mostrer les candjmints k' i gn a yeu a pårti do $1",
@@ -1089,16 +1124,25 @@ Ciste infôrmacion serè publike po tertos.",
 'hide' => 'catch.',
 'show' => 'håy.',
 'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 'number_of_watching_users_pageview' => '[shuvou pa $1 {{PLURAL:$1|uzeu|uzeus}}]',
 'rc_categories' => 'Limiter åzès categoreyes (separer avou des «|»)',
 'rc_categories_any' => 'Totes',
 'rc-change-size-new' => "$1 {{PLURAL:$1|octet|octets}} après l' candjmint",
 'newsectionsummary' => '/* $1 */ novele seccion',
+'rc-enhanced-expand' => 'Mostrer les detays (i fåt JavaScript)',
+'rc-enhanced-hide' => 'Catchî les detays',
 
 # Recent changes linked
 'recentchangeslinked' => 'Candjmints aloyîs',
 'recentchangeslinked-feed' => 'Candjmints aloyîs',
 'recentchangeslinked-toolbox' => 'Candjmints aloyîs',
+'recentchangeslinked-title' => 'Candjmints aloyîs a «$1»',
+'recentchangeslinked-summary' => "Çouchal c' est ene djivêye des candjmints k' ont stî fwaits dierinnmint a des pådjes aloyeyes a pårti d' ene pådje dinêye (ou mimbes d' ene categoreye dinêye).
+Les pådjes ki [[Special:Watchlist|vos shuvoz]] sont-st e '''cråssès letes'''.",
+'recentchangeslinked-page' => 'No del pådje:',
+'recentchangeslinked-to' => "Mostere les candjmints des pådjes avou on loyén viè l' pådje dinêye purade k' å rviè",
 
 # Upload
 'upload' => 'Eberweter on fitchî',
@@ -1108,14 +1152,14 @@ Ciste infôrmacion serè publike po tertos.",
 'uploadnologintext' => 'I vs fåt esse [[Special:UserLogin|elodjî]] por vos pleur eberweter des fitchîs.',
 'upload_directory_read_only' => "Li sierveu waibe èn pout nén scrire sol ridant d' eberwetaedje ($1).",
 'uploaderror' => "Aroke d' eberwetaedje",
-'uploadtext' => "Eployîz les boesses d' intrêye chal pa dzo po-z eberweter des noveas fitchîs.
-Po håyner ou cweri des fitchîs k' ont ddja stî rçuvous, alez sol [[Special:FileList|djivêye des fitchîs ddja eberweté]].
-Les (r)eberwetaedjes sont eto metos sol [[Special:Log/uplozf|djournå des eberwetaedjes]], les disfaçaedjes sol [[Special:Log/upload|ci des disfaçaedjes]].
+'uploadtext' => "Eployîz les boesses d' intrêye chal pa dzo po-z eberweter des fitchîs.
+Po håyner ou cweri des fitchîs k' ont ddja stî rçuvous, alez sol [[Special:FileList|djivêye des fitchîs ddja eberwetés]].
+Les (r)eberwetaedjes sont eto metos sol [[Special:Log/upload|djournå des eberwetaedjes]], les disfaçaedjes sol [[Special:Log/delete|ci des disfaçaedjes]].
 
 Po mete on fitchî dins ene pådje, eployîz on loyén del fôme:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitchî.jpg]]</nowiki></tt>''' po-z eployî l' modêye e grandeu oridjinnåle do fitchî
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitchî.png|200px|thumb|left|tecse di rawete]]</nowiki></tt>''' po håyner so ene lårdjeur di 200 picsels dins ene boesse (''thumb'') sol hintche (''left''; metoz ''right'' pol mete sol droete) avou «tecse di rawete» come discrijhaedje
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fitchî.ogg]]</nowiki></tt>''' po fé on loyén viè l' fitchî, sins l' håyner",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitchî.jpg]]</nowiki></code>''' po-z eployî l' modêye e grandeu oridjinnåle do fitchî
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitchî.png|200px|thumb|left|tecse di rawete]]</nowiki></code>''' po håyner so ene lårdjeur di 200 picsels dins ene boesse (''thumb'') sol hintche (''left''; metoz ''right'' pol mete sol droete) avou «tecse di rawete» come discrijhaedje
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fitchî.ogg]]</nowiki></code>''' po fé on loyén viè l' fitchî, sins l' håyner",
 'uploadlog' => 'djournå des eberwetaedjes',
 'uploadlogpage' => 'Djournå des eberwetaedjes',
 'uploadlogpagetext' => 'Chal pa dzo li djivêye des dierins eberwetaedjes.
@@ -1132,7 +1176,7 @@ Loukîz al [[Special:NewFiles|galreye des noveas fitchîs]] po ene vuwe pus vizu
 'badfilename' => "Li no d' l' imådje a stî candjî a «$1».",
 'largefileserver' => "Ci fitchî ci est pus pezant ki çou k' li sierveu est apontyî po-z accepter.",
 'emptyfile' => "I shonnreut kel fitchî k' vos eberwetez soeye vude. Çoula pout esse cåze d' ene aroke di tapaedje dins l' no do fitchî. Acertinez si vos vloz evoyî po do bon ç' fitchî ci, s' i vs plait.",
-'fileexists' => "On fitchî avou ç' no la egzistêye dedja, loukîz s' i vs plait a '''<tt>[[:$1]]</tt>''' po vs acertiner ki vos vloz bén replaecî l' fitchî avou l' ci ki vos eberwetez asteure, oubén si vos l' voloz eberweter dizo èn ôte no.
+'fileexists' => "On fitchî avou ç' no la egzistêye dedja, loukîz s' i vs plait a <strong>[[:$1]]</strong> po vs acertiner ki vos vloz bén replaecî l' fitchî avou l' ci ki vos eberwetez asteure, oubén si vos l' voloz eberweter dizo èn ôte no.
 [[$1|thumb]]",
 'fileexists-forbidden' => "I gn a ddja on fitchî avou ç' no la, et n' pout nén esse sipotchî.
 Si vos l' voloz tot l' minme eberweter, rivnoz en erî et s' reberwetez l' fitchî dizo èn ôte no.
@@ -1155,6 +1199,7 @@ Rivnoz s' i vs plait en erî et s' reberwetez l' fitchî dizo èn ôte no si vos
 'upload-file-error' => 'Divintrinne aroke',
 
 'license' => 'Licince:',
+'license-header' => 'Licince',
 'nolicense' => 'Nole licince tchoezeye',
 'upload_source_file' => ' (on fitchî sol copiutrece da vosse)',
 
@@ -1325,6 +1370,8 @@ Notez tot l' minme ki d' ôtès waibes polèt aveur des loyéns viè ces imådje
 
 # Book sources
 'booksources' => 'Sourdants po les lives',
+'booksources-search-legend' => 'Cweri des sourdants po des lives',
+'booksources-go' => 'I va',
 
 # Special:Log
 'specialloguserlabel' => 'Fwait pa:',
@@ -1372,7 +1419,7 @@ Loukîz eto [[Special:WantedCategories|les categoreyes dimandêyes]].',
 'linksearch-ok' => 'Cweri',
 'linksearch-text' => 'Des caracteres «djokers» polèt esse eployîs, metans «*.wikipedia.org».
 Mins i fåt pol moens on dominne di prumî livea, metans «*.org»<br />
-Protocoles ricnoxhous: <tt>$1</tt> (nelzès metoz nén dins vosse tchinne di cweraedje).',
+Protocoles ricnoxhous: <code>$1</code> (nelzès metoz nén dins vosse tchinne di cweraedje).',
 'linksearch-line' => "$1 est loyî a pårti d' $2",
 'linksearch-error' => "Les caracteres djokers èn polèt esse eployîs k' a l' atake d' on no d' dominne ou d' lodjoe.",
 
@@ -1386,6 +1433,9 @@ Protocoles ricnoxhous: <tt>$1</tt> (nelzès metoz nén dins vosse tchinne di cwe
 'newuserlogpage' => 'Djournå des noveas uzeus',
 'newuserlogpagetext' => "Chal pa dzo c' est ene djivêye des uzeus novelmint eredjîstrés.",
 
+# Special:ListGroupRights
+'listgrouprights-members' => '(djivêye des mimbes)',
+
 # E-mail user
 'mailnologin' => "Nole adresse d' evoyeu",
 'mailnologintext' => "Po-z evoyî èn emile a èn ôte uzeu i vs fåt esse [[Special:UserLogin|elodjî]] eyet aveur ene adresse emile d' evoyeu ki soeye valide dins vos [[Special:Preferences|preferinces]].",
@@ -1412,6 +1462,7 @@ po ki l' riçuveu poye risponde.",
 # Watchlist
 'watchlist' => 'Pådjes shuvowes',
 'mywatchlist' => 'Pådjes shuvowes',
+'watchlistfor2' => 'Pa $1 ($2)',
 'nowatchlist' => 'Vosse djivêye des pådjes a shuve est vude.',
 'watchlistanontext' => 'I vs fåt $1 po vey ou candjî les cayets di vosse djivêye des shuvous.',
 'watchnologin' => "Vos n' estoz nén elodjî",
@@ -1438,6 +1489,7 @@ Si vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «
 'iteminvalidname' => "Åk n' a nén stî avou «$1», li no n' est nén valide...",
 'wlnote' => "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les '''$1''' dierins candjmints}} {{PLURAL:$2|del dierinne eure|des '''$2''' dierinnès eures}}, disk' å $3 a $4.",
 'wlshowlast' => 'Mostrer les dierin(nè)s $1 eures, $2 djoûs ou $3',
+'watchlist-options' => 'Tchuzes del djivêye des shuvous',
 
 'enotif_mailer' => 'Notifiaedje pa emile di {{SITENAME}}',
 'enotif_reset' => 'Mårker totes les pådjes come vizitêyes',
@@ -1592,6 +1644,7 @@ candjî l' pådje divant do disfaçaedje. Li tecse di ces modêyes disfacêyes
 ni pout esse veyou ki des manaedjeus.",
 'undeletebtn' => 'Rapexhî',
 'undeletelink' => 'vey/rapexhî',
+'undeleteviewlink' => 'vey',
 'undeletereset' => 'Netyî',
 'undeletecomment' => 'Råjhon:',
 'undeletedrevisions' => '{{PLURAL:$1|1 modêye|$1 modêyes}} di rapexheyes',
@@ -1645,6 +1698,7 @@ Li dierinne intrêye e djournå des blocaedjes est dnêye chal pa dzo po infôrm
 'linkshere' => "Les pådjes ki shuvèt ont des loyéns viè '''[[:$1]]''':",
 'nolinkshere' => "Nole pådje avou des loyéns viè '''[[:$1]]'''.",
 'isredirect' => 'pådje di redjiblaedje',
+'isimage' => "loyén viè l' fitchî",
 'whatlinkshere-prev' => '{{PLURAL:$1|di dvant|$1 di dvant}}',
 'whatlinkshere-next' => '{{PLURAL:$1|shuvant|$1 shuvants}}',
 'whatlinkshere-links' => '← loyaedjes',
@@ -1698,7 +1752,9 @@ Loukîz li [[Special:BlockList|djivêye des blocaedjes]] po verifyî les blocaed
 'expiringblock' => "disk' å $1 a $2",
 'blocklink' => 'bloker',
 'unblocklink' => 'disbloker',
+'change-blocklink' => "candjî l' blocaedje",
 'contribslink' => 'contribouwaedjes',
+'emaillink' => 'evoyî èn emile',
 'autoblocker' => "Bloké otomaticmint paski vos eployîz li minme adresse IP ki «[[User:$1|$1]]». Råjhon do blocaedje «'''$2'''».",
 'blocklogpage' => 'Djournå des blocaedjes',
 'blocklogentry' => 'a bloké «[[$1]]» po ene termene di $2 $3',
@@ -1822,7 +1878,7 @@ Et s' el schaper so voste éndjole, et poy li ristitchî droci.",
 'importstart' => "Dj' enonde li ristitchaedje...",
 'import-revision-count' => '{{PLURAL:$1|1 modêye|$1 modêyes}}',
 'importnopages' => 'Nole pådje a ristitchî.',
-'importfailed' => 'Li ristitchaedje a fwait berwete: $1',
+'importfailed' => 'Li ristitchaedje a fwait berwete: <nowiki>$1</nowiki>',
 'importunknownsource' => 'Sourdant nén cnoxhou pol ristitchaedje',
 'importcantopen' => "Dji n' sai drovi l' fitchî a ristitchî",
 'importbadinterwiki' => 'Cron loyén eterwiki',
@@ -1888,12 +1944,12 @@ Vos ploz seulmint vey li côde sourdant, mins nén l' candjî.",
 'tooltip-ca-nstab-media' => 'Vey li pådje di media',
 'tooltip-ca-nstab-special' => "Çouchal, c' est ene pådje sipeciåle, vos n' poloz nén candjî l' pådje leye-minme.",
 'tooltip-ca-nstab-project' => 'Vey li pådje di pordjet',
-'tooltip-ca-nstab-image' => "Vey li pådje d' imådje",
+'tooltip-ca-nstab-image' => 'Vey li pådje do fitchî',
 'tooltip-ca-nstab-mediawiki' => 'Vey li messaedje ratournåve do sistinme',
 'tooltip-ca-nstab-template' => 'Vey li modele',
 'tooltip-ca-nstab-help' => "Vey li pådje d' aidance",
 'tooltip-ca-nstab-category' => 'Vey li pådje di categoreye',
-'tooltip-minoredit' => "Mete çouci come on ptit candjmint d' rén do tot [alt-i]",
+'tooltip-minoredit' => "Mete çouci come on ptit candjmint d' rén do tot",
 'tooltip-save' => 'Schaper vos candjmints [alt-s]',
 'tooltip-preview' => "Prévey vos candjmints, fijhoz l' divant d' schaper s' i vs plait! [alt-p]",
 'tooltip-diff' => 'Mostrer les candjmints ki vos avoz fwait e tecse. [alt-v]',
@@ -1903,6 +1959,7 @@ Vos ploz seulmint vey li côde sourdant, mins nén l' candjî.",
 'tooltip-rollback' => "Li loyén «{{int:rollbacklink}}» permete di disfé d' on seu clitch tos les candjmints(s) fwaits sol pådje på dierin uzeu.",
 'tooltip-undo' => "Li loyén «{{int:editundo}}» permete di disfé li candjmint et drouve li boesse di candjmint e môde prévoeyaedje.
 Dj' ô bén, ça permete di disfé l' candjmint et d' mete on messaedje dins l' boesse di rascourti.",
+'tooltip-summary' => 'Dinez on ptit rascourti',
 
 # Stylesheets
 'common.css' => '/* li côde CSS metou chal serè eployî pa totes les peas et tos les uzeus */',
@@ -1914,7 +1971,7 @@ Dj' ô bén, ça permete di disfé l' candjmint et d' mete on messaedje dins l'
 # Attribution
 'anonymous' => '{{PLURAL:$1|Uzeu anonime|Uzeus anonimes}} di {{SITENAME}}',
 'siteuser' => "$1, {{GENDER:$2|uzeu d'|uzeuse di}} {{SITENAME}}",
-'anonuser' => '$1, {{GENDER:$2|uzeu|uzeuse}} anonime di {{SITENAME}}',
+'anonuser' => '$1, uzeu anonime di {{SITENAME}}',
 'lastmodifiedatby' => 'Cisse pådje a stî candjeye pol dierin côp li $2, $1 pa $3.',
 'othercontribs' => "Båzé so l' ovraedje da $1.",
 'others' => 'co ds ôtes',
@@ -1925,14 +1982,10 @@ Dj' ô bén, ça permete di disfé l' candjmint et d' mete on messaedje dins l'
 
 # Info page
 'pageinfo-title' => 'Infôrmåcion po «$1»',
-'pageinfo-header-watchlist' => 'Djivêye des shuvous',
-'pageinfo-header-views' => 'Vuwes',
-'pageinfo-subjectpage' => 'Pådje',
-'pageinfo-talkpage' => 'Pådje di copene',
+'pageinfo-views' => 'Nombe di lijhaedjes',
 'pageinfo-watchers' => 'Nombe di shuveus',
 'pageinfo-edits' => 'Nombe di candjmints',
 'pageinfo-authors' => "Nombe d' oteurs diferins",
-'pageinfo-views' => 'Nombe di lijhaedjes',
 
 # Patrolling
 'markaspatrolleddiff' => 'Marké come patrouyî',
@@ -1959,6 +2012,8 @@ Si vos l' enondez vos pôrîz infecter l' sistinme da vosse.",
 'thumbsize' => 'Grandeu po les imådjetes (thumb):',
 'widthheightpage' => '$1 × $2, $3 pådje{{PLURAL:$3||s}}',
 'file-info-size' => '$1 × $2 picsels, groxheur do fitchî: $3, del sôre "MIME": $4',
+'file-nohires' => "I n' a nén di pus grande finté.",
+'svg-long-desc' => 'Fitchî SVG, finté di $1 × $2 picsels, grandeu: $3',
 'show-big-image' => "Imådje a si grandeur d' oridjinne",
 
 # Special:NewFiles
@@ -1977,6 +2032,13 @@ Si vos l' enondez vos pôrîz infecter l' sistinme da vosse.",
 'days' => '$1 djoû{{PLURAL:$1||s}}',
 'ago' => 'i gn a $1',
 
+# Bad image list
+'bad_image_list' => "Li fôrmat est l' shuvant:
+
+Seulmint les intrêyes di djivêye (dj' ô bén, les royes ki cmincèt avou ene sitoele «*») sont acontêyes.
+Li prumî loén d' ene roye doet esse on loyén viè on fitchî k' on vout bloker si eployaedje.
+Les ôtes loyéns dnés sol minme roye sont veyous come des foû-rîle, dj' ô bén les pådjes wice ki l' fitchî pout esse eployî",
+
 # Metadata
 'metadata' => 'Meta-dnêyes',
 'metadata-help' => "Ci fitchî chal a des infôrmåcions di rawete, motoit bén radjoutêyes pa l' aparey foto limerike ou l' sicanrece eployeye po fé l' imådje.
@@ -2201,6 +2263,9 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 # Watchlist editor
 'watchlistedit-raw-titles' => 'Tites:',
 
+# Watchlist editing tools
+'watchlisttools-edit' => "Vey et candjî l' djivêye des shuvous",
+
 # Special:Version
 'version' => 'Modêye des programes',
 'version-extensions' => "Rawetes d' astalêyes",
index 8c6f606..d968f4e 100644 (file)
@@ -70,7 +70,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Tago-a in mga gin-patrol o binantayan nga mga pagliwat ha mga dipala naiha nga mga kabag-ohan',
 'tog-newpageshidepatrolled' => 'Tago-a an mga gin-patrol o binantayan nga mga pakli tikang han talaan hin bag-o nga pakli',
 'tog-extendwatchlist' => 'Padako-a an angay timan-an agod makita an tanan nga kabag-ohan, diri la an gibag-ohi',
-'tog-usenewrc' => 'Gamit hin mga gin-enhans o gindugngan nga gibag-ohi nga mga kabag-ohan (nakinahanglan hin JavaScript)',
+'tog-usenewrc' => 'Gamitin mga gin-enhans o gindugngan nga gibag-ohi nga mga kabag-ohan (nakinahanglan hin JavaScript)',
 'tog-numberheadings' => 'Auto-nga-ihap nga mga pagngaran',
 'tog-showtoolbar' => 'Igpakita an edit toolbar (nakinahanglan hin JavaScript)',
 'tog-editondblclick' => 'Igliwat in mga pakli ha doble nga klik (nakinahanglan hin JavaScript)',
@@ -351,9 +351,9 @@ $1',
 'nstab-media' => 'Pakli hin medya',
 'nstab-special' => 'Pinaurog nga pakli',
 'nstab-project' => 'Pakli han proyekto',
-'nstab-image' => 'Fayl',
+'nstab-image' => 'Paypay',
 'nstab-mediawiki' => 'Mensahe',
-'nstab-template' => 'Plantilya',
+'nstab-template' => 'Batakan',
 'nstab-help' => 'Pakli hin bulig',
 'nstab-category' => 'Kaarangay',
 
@@ -542,15 +542,20 @@ Kun pidliton mo an \"{{int:savearticle}}\" utro, an imo ginliwat in matitipig bi
 'accmailtitle' => 'Ginpadara na an tigaman-pagsulod.',
 'newarticle' => '(Bag-o)',
 'newarticletext' => "Ginsunod mo an pakli nga waray pa kahihimo.  Para ighimo an pakli, tikanga pagmakinilya ha kahon nga aada ha ubos (kitaa an [[{{MediaWiki:Helppage}}|nabulig nga pakli]] para han kadugangan nga pananabutan).  Kun sayop an imo pagkanhi, igpidlit an imo kanan panngaykay (''browser'') '''balik''' (''back'') nga piridlitan.",
+'noarticletext' => 'Waray yana nahasurat hini nga pakli.
+Puyde hi ikaw [[Special:Search/{{PAGENAME}}|magbiling para han ngaran hini nga pakli]] ha iba nga mga pakli,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} binga an mga nanginginlabot nga mga log],
+o [{{fullurl:{{FULLPAGENAME}}|action=edit}} igliwat ini nga pakli]</span>.',
 'noarticletext-nopermission' => 'Ha yana waray surat ini nga pakli.
 Puydi nimo [[Special:Search/{{PAGENAME}}|pamilngon ini nga titulo han pakli]] ha iba nga mga pakli,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pamilngon ha mga kasumpay nga talaan]</span>.',
 'userpage-userdoesnotexist-view' => "An akawnt han gumaramit ni ''$1'' in diri nakarehistro.",
 'updated' => '(Ginbag-ohan)',
 'note' => "'''Pahibaro:'''",
-'previewnote' => "'''Hinumdumi nga pahiuna-nga-paggawas la ini.'''
-An imo mga ginbag-o in waray pa katipig!",
+'previewnote' => "'''Hinumdumi nga pahiuna-nga-paggawas pa la ini.'''
+¡Waray pa katipig an imo mga ginbag-o!",
 'editing' => 'Ginliliwat an $1',
+'creating' => 'Ginhihimo an $1',
 'editingsection' => 'Ginliliwat an $1 (bahin)',
 'editingcomment' => 'Ginliliwat an $1 (bag-o nga bahin)',
 'editconflict' => 'Diri pagkakauroyon han pagliwat: $1',
@@ -767,7 +772,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'group-bot' => 'Mga bot',
 'group-sysop' => 'Mga magdudumara',
 'group-bureaucrat' => 'Mga burokrata',
-'group-suppress' => 'Mga mananahon',
+'group-suppress' => 'Mga nanginginano',
 'group-all' => '(ngatanan)',
 
 'group-user-member' => '{{HENERO:$1|gumaramit}}',
@@ -776,6 +781,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 
 'grouppage-user' => '{{ns:project}}:Mga gumaramit',
 'grouppage-sysop' => '{{ns:project}}:Mga magdudumara',
+'grouppage-suppress' => '{{ns:project}}:Nanginginano',
 
 # Rights
 'right-read' => 'Igbasa an mga pakli',
@@ -784,7 +790,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'right-createtalk' => 'Paghimo hin hiruhimangraw nga mga pakli',
 'right-minoredit' => 'Igmarka an mga ginliwat komo gutiay la',
 'right-move' => 'Igbalhin an mga pakli',
-'right-movefile' => 'Balhina an mga fayl',
+'right-movefile' => 'Balhina an mga paypay',
 'right-delete' => 'Igpara an mga pakli',
 'right-undelete' => 'Igpawara an pagpara han pakli',
 
@@ -903,8 +909,8 @@ Mga detalye: $1',
 'filehist-filesize' => 'Kadako han fayl',
 'filehist-comment' => 'Komento',
 'filehist-missing' => 'Nawawara an fayl',
-'imagelinks' => 'Mga gamit hin fayl',
-'linkstoimage' => 'An nasunod nga {{PLURAL:$1|pakli nasumpay|$1 mga pakli nasumpay}} hini nga fayl:',
+'imagelinks' => 'Mga gamit hin paypay',
+'linkstoimage' => 'An nasunod nga {{PLURAL:$1|pakli nasumpay|$1 mga pakli nasumpay}} hini nga paypay:',
 'nolinkstoimage' => 'Waray mga pakli nga nasumpay hini nga fayl.',
 'sharedupload' => 'Ini nga fayl tikang han $1 ngan puyde magamit ha iba nga mga proyekto.',
 'sharedupload-desc-there' => 'Ini nga fayl tikang han $1 ngan puyde magamit ha iba nga mga proyekto.
@@ -944,13 +950,13 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'statistics-articles' => 'Unod nga mga pakli',
 'statistics-pages' => 'Mga pakli',
 'statistics-pages-desc' => 'Ngatanan nga mga pakli ha sulod hini nga wiki, lakip an hiruhimangraw nga mga pakli, mga redirect, ngan iba pa',
-'statistics-files' => 'Ginkarga nga mga paypay',
+'statistics-files' => 'Mga paypay nga iginkarga pasaka',
 'statistics-edits' => 'Mga pagliwat hit pakli tikang gintukod hini nga {{SITENAME}}',
 'statistics-edits-average' => 'Average nga mga pagliwat kada pakli',
 'statistics-views-total' => 'Ngatanan nga mga panginano',
 'statistics-views-peredit' => 'Mga panginano kada pagliwat',
-'statistics-users' => 'Mga nakarehistro nga [[Special:ListUsers|gumaramit]]',
-'statistics-users-active' => 'Mga nanggigios nga gumaramit',
+'statistics-users' => 'Mga [[Special:ListUsers|gumaramit]] nga nakarehistro',
+'statistics-users-active' => 'Mga gumaramit nga nanggigios',
 'statistics-users-active-desc' => 'Mga gumaramit nga may-ada iginbuhat ha urhi nga {{PLURAL:$1|ka adlaw|$1 ka mga adlaw}}',
 'statistics-mostpopular' => 'Gidamoi nga ginpanginanohan nga mga pakli',
 
@@ -1046,7 +1052,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'listusers-blocked' => '(ginpugngan)',
 
 # Special:ActiveUsers
-'activeusers' => 'Lista han mga nanggigios nga gumaramit',
+'activeusers' => 'Taramdan hin mga gumaramit nga nanggigios',
 'activeusers-hidebots' => 'Igtago an mga bot',
 'activeusers-hidesysops' => 'Igtago an mga magdudumara',
 'activeusers-noresult' => 'Waray gumaramit nga nahiagian.',
@@ -1316,11 +1322,6 @@ Makikit-an nimo an ginkuhaaan',
 # Attribution
 'othercontribs' => 'Ginbasihan ha binuhat ni $1.',
 
-# Info page
-'pageinfo-header-watchlist' => 'Barantayan',
-'pageinfo-subjectpage' => 'Pakli',
-'pageinfo-talkpage' => 'Hiruhimangraw nga pakli',
-
 # Browsing diffs
 'previousdiff' => '← Durudaan nga pagliwat',
 'nextdiff' => 'Burubag-o nga pagliwat',
@@ -1349,6 +1350,8 @@ An bisan ano nga masunod nga mga sumpay ha kapareho nga bagis in igtratrato nga
 
 # Metadata
 'metadata' => 'Metadata',
+'metadata-help' => 'Iní nga paypay mayda dugang nga pagpasabot, nga bangin gindugáng tikang han digital nga camera o iskaner nga gin-gamit paghimo o pag-digitar hini.
+Kon an paypay ginliwat tikang han orihinal nga kamutangan, mayda mga detalye nga bangin diri magpakita han ginliwat nga paypay',
 'metadata-fields' => 'An mga rumbay han hulagway han metadato nga nakatala dinhi nga mensahe in iglalakip ha padayag hin hulagway nga pakli kun an taramdan metadato in nakalukot.
 An iba in daan nakatago.
 * make
@@ -1492,6 +1495,7 @@ An iba in daan nakatago.
 'version-software-product' => 'Produkto',
 
 # Special:FilePath
+'filepath-page' => 'Paypay:',
 'filepath-submit' => 'Kadto-a',
 
 # Special:FileDuplicateSearch
@@ -1505,6 +1509,16 @@ An iba in daan nakatago.
 'blankpage' => 'Blanko nga pakli',
 'intentionallyblankpage' => 'Ini nga pakli gintuyo pagpabilin nga blanko.',
 
+# External image whitelist
+'external_image_whitelist' => '#Pabay-i ini nga linea nga sugad gud la <pre>
+#Igbutang in mga regular nga expresyon nga mga fragment (iton bahin nga ada ha butnga han //) ha ubos
+#Ini igpapadis han mga URL han mga ha gawas (gin-hotlink) nga mga hulagway
+#An mga nasakto igpapakita nga mga hulagway, kon diri, sumpay la ngadto han hulagway an igpapakita
+#Mga linea nga natikang hin  # ginta-tratar nga mga komento
+# Case-insensitive ini
+
+#Igbutang an mga regex nga fragment ha igbaw hini nga linea. Pabay-i ini nga linea nga sugad gud la</pre>',
+
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Tag]] panara:',
 'tag-filter-submit' => 'Panara',
index 13c5a11..6f079c7 100644 (file)
@@ -1253,14 +1253,14 @@ Saytul [[Special:NewFiles| gaaraluwaayu dencukaay yu yees yi]] ngir gis bu gën
 'large-file' => 'Li gën mooy dayoo dencukaay bi bañ a romb $1; bii dencukaay $2 la.',
 'largefileserver' => 'Dayoo dencukaay bi romb na kem bu joxekaay bi attan.',
 'emptyfile' => 'dencukaay bi nga bëgg a yeb dafa mel ni amul dara. Xéj-na ag njuumte ci turu dencukaay bi moo ko waral. Seetal bu baax ndax dëgg-dëgg bëgg nga yeb bii dencukaay.',
-'fileexists' => "Am na dencukaay bu tudd nii ba noppi.
-Saytul '''<tt>[[:$1]]</tt>''' su dee wóoru la ne bëgg nga koo soppi.
-[[$1|thumb]]",
-'filepageexists' => "Xëtu faramfacce bu dencukaay bi sos nañ ko ba noppi ci bii màkkaan '''<tt>[[:$1]]</tt>''', waaye amagul dencukaay bu ni tudd nii-nii. Faramfacceg xët wi nga dugal ci diirub yeb gi du feeñ ci xëtu waxtaanuwaay wi. Ngir faramfacce gi feeñ ci xëtu waxtaanuwaay wi faaw nga soppi ko ak sa loxo.",
-'fileexists-extension' => "Am na dencukaay bu ni tudd ba noppi: [[$2|thumb]]
-* Turu dencukaay bi ngay yeb : '''<tt>[[:$1]]</tt>'''
-* Turu dencukaay bi fi am : '''<tt>[[:$2]]</tt>'''
-Tànnal weneen tur.",
+'fileexists' => 'Am na dencukaay bu tudd nii ba noppi.
+Saytul <strong>[[:$1]]</strong> su dee wóoru la ne bëgg nga koo soppi.
+[[$1|thumb]]',
+'filepageexists' => 'Xëtu faramfacce bu dencukaay bi sos nañ ko ba noppi ci bii màkkaan <strong>[[:$1]]</strong>, waaye amagul dencukaay bu ni tudd nii-nii. Faramfacceg xët wi nga dugal ci diirub yeb gi du feeñ ci xëtu waxtaanuwaay wi. Ngir faramfacce gi feeñ ci xëtu waxtaanuwaay wi faaw nga soppi ko ak sa loxo.',
+'fileexists-extension' => 'Am na dencukaay bu ni tudd ba noppi: [[$2|thumb]]
+* Turu dencukaay bi ngay yeb : <strong>[[:$1]]</strong>
+* Turu dencukaay bi fi am : <strong>[[:$2]]</strong>
+Tànnal weneen tur.',
 'fileexists-forbidden' => 'Am na ŋara wu ni tudd ba noppi te mano koo war; Dellul ginnaaw ngir yeb ŋara wi ak weneen tur
 [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Am na ŋara wu ni tudd ba noppi ci dencuwaayu ŋara bi ñuy bokk; Dellul ginnaaw ngir yeb ŋara wi ak weneen tur. [[File:$1|thumb|center|$1]]',
@@ -1358,7 +1358,7 @@ Faramfacce gi ci [$2 xëtu faramfaccewaayu xët wi] lañuy wone ci suuf .',
 # MIME search
 'mimesearch' => 'Seet ci xeeti ëmbiit yii di MIME',
 'mimesearch-summary' => "Xët wii dina la may nga man segg xeeti dencukaay yu MIME.
-Duggalal baat bi ci pax mi  ''xeet/''ron-xeet'', ci misaal <tt>image/jpeg</tt>.",
+Duggalal baat bi ci pax mi  ''xeet/''ron-xeet'', ci misaal <code>image/jpeg</code>.",
 'mimetype' => 'Xeet wu MIME :',
 'download' => 'yebbi',
 
index 2aea831..8f77bc5 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Kalmyk (Хальмг)
+/** Kalmyk (хальмг)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
index d487e43..c01c802 100644 (file)
@@ -195,8 +195,8 @@ $messages = array(
 'helppage' => 'Help:დინორე',
 'mainpage' => 'დუდხასჷლა',
 'mainpage-description' => 'დუდხასჷლა',
-'portal' => 'á\83¡á\83\90á\83\96á\83\9dá\83\92á\83\90á\83\93á\83\9dá\83\94á\83\91აშ ხასჷლეფი',
-'portal-url' => 'Project:á\83¡á\83\90á\83\96á\83\9dá\83\92á\83\90á\83\93á\83\9dá\83\94á\83\91á\83\90á\83¨ á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤',
+'portal' => 'á\83¯á\83\90á\83 á\83\90á\83\9aá\83£აშ ხასჷლეფი',
+'portal-url' => 'Project:á\83¯á\83\90á\83 á\83\90á\83\9aá\83£á\83\90á\83¨ á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98',
 'privacy' => 'ანონიმურობაშ პოლიტიკა',
 'privacypage' => 'Project:ანონიმურობაშ პოლიტიკა',
 
@@ -910,7 +910,7 @@ $messages = array(
 'version' => 'ვერსია',
 
 # Special:SpecialPages
-'specialpages' => 'á\83¡á\83\9eá\83\94á\83ªá\83\98á\83\90á\83\9aá\83£á\83  á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤',
+'specialpages' => 'á\83\92á\83·á\83¨á\83\90á\83\99á\83\94á\83 á\83«á\83\90á\83¤á\83\98á\83\9aá\83\98 á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98',
 
 # External image whitelist
 'external_image_whitelist' => '"#ქჷდიტე თე ღოზი კოკობო მუჭო რენ თეში<pre>
index 3e1facf..0f1744c 100644 (file)
@@ -141,43 +141,43 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#ווייטערפירן', '#הפניה', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__קיין_אינהאלט_טאבעלע__', '__ללא_תוכן_עניינים__', '__ללא_תוכן__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__קיין_גאלעריע__', '__ללא_גלריה__', '__NOGALLERY__' ),
-       'toc'                     => array( '0', '__אינהאלט__', '__תוכן_עניינים__', '__תוכן__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__נישט_רעדאקטירן__', '__ללא_עריכה__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__קיינקעפל__', '__ללא_כותרת__', '__NOHEADER__' ),
-       'currentday'              => array( '1', 'לויפיקער_טאג', 'יום נוכחי', 'CURRENTDAY' ),
-       'numberofpages'           => array( '1', 'צאל_בלעטער', 'מספר דפים כולל', 'מספר דפים', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', 'צאל_ארטיקלען', 'מספר ערכים', 'NUMBEROFARTICLES' ),
-       'pagename'                => array( '1', 'בלאטנאמען', 'שם הדף', 'PAGENAME' ),
-       'namespace'               => array( '1', 'נאמענטייל', 'מרחב השם', 'NAMESPACE' ),
-       'fullpagename'            => array( '1', 'פולבלאטנאמען', 'שם הדף המלא', 'FULLPAGENAME' ),
-       'subpagename'             => array( '1', 'אונטערבלאטנאמען', 'שם דף המשנה', 'SUBPAGENAME' ),
-       'talkpagename'            => array( '1', 'רעדנבלאטנאמען', 'שם דף השיחה', 'TALKPAGENAME' ),
-       'subst'                   => array( '0', 'ס:', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'קליין', 'ממוזער', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'קליין=$1', 'ממוזער=$1', 'thumbnail=$1', 'thumb=$1' ),
-       'img_right'               => array( '1', 'רעכטס', 'ימין', 'right' ),
-       'img_left'                => array( '1', 'לינקס', 'שמאל', 'left' ),
-       'img_none'                => array( '1', 'אן', 'ללא', 'none' ),
-       'img_center'              => array( '1', 'צענטער', 'מרכז', 'center', 'centre' ),
-       'img_sub'                 => array( '1', 'אונטער', 'תחתי', 'sub' ),
-       'img_top'                 => array( '1', 'אויבן', 'למעלה', 'top' ),
-       'img_bottom'              => array( '1', 'אונטן', 'למטה', 'bottom' ),
-       'img_link'                => array( '1', 'לינק=$1', 'קישור=$1', 'link=$1' ),
-       'img_alt'                 => array( '1', 'טעקסט=$1', 'טקסט=$1', 'alt=$1' ),
-       'grammar'                 => array( '0', 'גראמאטיק:', 'דקדוק:', 'GRAMMAR:' ),
-       'plural'                  => array( '0', 'מערצאל:', 'רבים:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'פֿולער_נאמען:', 'כתובת מלאה:', 'FULLURL:' ),
-       'raw'                     => array( '0', 'רוי:', 'ללא עיבוד:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'ווייזן_קעפל', 'כותרת תצוגה', 'DISPLAYTITLE' ),
-       'language'                => array( '0', '#שפראך:', '#שפה:', '#LANGUAGE:' ),
-       'special'                 => array( '0', 'באזונדער', 'מיוחד', 'special' ),
-       'defaultsort'             => array( '1', 'גרונטסארטיר:', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'hiddencat'               => array( '1', '__באהאלטענע_קאטעגאריע__', '__באהאלטענע_קאט__', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
-       'pagesize'                => array( '1', 'בלאטגרייס', 'גודל דף', 'PAGESIZE' ),
-       'url_wiki'                => array( '0', 'וויקי', 'ויקי', 'WIKI' ),
+       'redirect'                  => array( '0', '#ווייטערפירן', '#הפניה', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__קיין_אינהאלט_טאבעלע__', '__ללא_תוכן_עניינים__', '__ללא_תוכן__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__קיין_גאלעריע__', '__ללא_גלריה__', '__NOGALLERY__' ),
+       'toc'                       => array( '0', '__אינהאלט__', '__תוכן_עניינים__', '__תוכן__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__נישט_רעדאקטירן__', '__ללא_עריכה__', '__NOEDITSECTION__' ),
+       'noheader'                  => array( '0', '__קיינקעפל__', '__ללא_כותרת__', '__NOHEADER__' ),
+       'currentday'                => array( '1', 'לויפיקער_טאג', 'יום נוכחי', 'CURRENTDAY' ),
+       'numberofpages'             => array( '1', 'צאל_בלעטער', 'מספר דפים כולל', 'מספר דפים', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'צאל_ארטיקלען', 'מספר ערכים', 'NUMBEROFARTICLES' ),
+       'pagename'                  => array( '1', 'בלאטנאמען', 'שם הדף', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'נאמענטייל', 'מרחב השם', 'NAMESPACE' ),
+       'fullpagename'              => array( '1', 'פולבלאטנאמען', 'שם הדף המלא', 'FULLPAGENAME' ),
+       'subpagename'               => array( '1', 'אונטערבלאטנאמען', 'שם דף המשנה', 'SUBPAGENAME' ),
+       'talkpagename'              => array( '1', 'רעדנבלאטנאמען', 'שם דף השיחה', 'TALKPAGENAME' ),
+       'subst'                     => array( '0', 'ס:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'קליין', 'ממוזער', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'קליין=$1', 'ממוזער=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'רעכטס', 'ימין', 'right' ),
+       'img_left'                  => array( '1', 'לינקס', 'שמאל', 'left' ),
+       'img_none'                  => array( '1', 'אן', 'ללא', 'none' ),
+       'img_center'                => array( '1', 'צענטער', 'מרכז', 'center', 'centre' ),
+       'img_sub'                   => array( '1', 'אונטער', 'תחתי', 'sub' ),
+       'img_top'                   => array( '1', 'אויבן', 'למעלה', 'top' ),
+       'img_bottom'                => array( '1', 'אונטן', 'למטה', 'bottom' ),
+       'img_link'                  => array( '1', 'לינק=$1', 'קישור=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', 'טעקסט=$1', 'טקסט=$1', 'alt=$1' ),
+       'grammar'                   => array( '0', 'גראמאטיק:', 'דקדוק:', 'GRAMMAR:' ),
+       'plural'                    => array( '0', 'מערצאל:', 'רבים:', 'PLURAL:' ),
+       'fullurl'                   => array( '0', 'פֿולער_נאמען:', 'כתובת מלאה:', 'FULLURL:' ),
+       'raw'                       => array( '0', 'רוי:', 'ללא עיבוד:', 'RAW:' ),
+       'displaytitle'              => array( '1', 'ווייזן_קעפל', 'כותרת תצוגה', 'DISPLAYTITLE' ),
+       'language'                  => array( '0', '#שפראך:', '#שפה:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'באזונדער', 'מיוחד', 'special' ),
+       'defaultsort'               => array( '1', 'גרונטסארטיר:', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'hiddencat'                 => array( '1', '__באהאלטענע_קאטעגאריע__', '__באהאלטענע_קאט__', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
+       'pagesize'                  => array( '1', 'בלאטגרייס', 'גודל דף', 'PAGESIZE' ),
+       'url_wiki'                  => array( '0', 'וויקי', 'ויקי', 'WIKI' ),
 );
 
 $messages = array(
@@ -196,15 +196,15 @@ $messages = array(
 'tog-editsectiononrightclick' => 'באמעגליך פאראגראף ענדערונגען דורכן קוועטשן אויפן רעכטן<br />אויף אפטייל קעפל (JavaScript)',
 'tog-showtoc' => 'ווייז דאס אינהאלט קעסטל<br />(פאר בלעטער מיט מער ווי 3 קעפלעך)',
 'tog-rememberpassword' => 'געדענק מיין אריינלאגירן אין דעם בלעטערער (ביז $1 {{PLURAL:$1|טאָג|טעג}})',
-'tog-watchcreations' => 'צולייגן בלעטער וואס איך באשאף צו מיין אכטונג ליסטע',
-'tog-watchdefault' => '×\90×\95×\99פפ×\90ס×\9f ×\90×±×\98×\90Ö¸×\9e×\90Ö·×\98×\99ש ×\93×\99 ×\90ר×\98×\99ק×\9c×¢×\9f ×°×\90ָס ×\90×\99×\9a ×\91×\90Ö·×\90ַר×\91×¢×\98',
-'tog-watchmoves' => 'צולייגן בלעטער וואס איך באוועג צו מיין אכטונג ליסטע',
+'tog-watchcreations' => 'צ×\95×\9c×\99×\99×\92×\9f ×\91×\9c×¢×\98ער ×\95×\95×\90ס ×\90×\99×\9a ×\91×\90ש×\90×£ ×\90×\95×\9f ×\98עקעס ×\95×\95×\90ס ×\90×\99×\9a ×\9c×\90×\93 ×\90ר×\95×\99×£ ×¦×\95 ×\9e×\99×\99×\9f ×\90×\9b×\98×\95× ×\92 ×\9c×\99ס×\98×¢',
+'tog-watchdefault' => 'צ×\95×\9c×\99×\99×\92×\9f ×\91×\9c×¢×\98ער ×\95×\95×\90ס ×\90×\99×\9a ×¨×¢×\93×\90ק×\98×\99ר ×¦×\95 ×\9e×\99×\99×\9f ×\90×\9b×\98×\95× ×\92 ×\9c×\99ס×\98×¢',
+'tog-watchmoves' => 'צ×\95×\9c×\99×\99×\92×\9f ×\91×\9c×¢×\98ער ×\95×\95×\90ס ×\90×\99×\9a ×\91×\90×\95×\95×¢×\92 ×\90×\95×\9f ×\98עקעס ×\95×\95×\90ס ×\90×\99×\9a ×\9c×\90×\93 ×\90ר×\95×\99×£ ×¦×\95 ×\9e×\99×\99×\9f ×\90×\9b×\98×\95× ×\92 ×\9c×\99ס×\98×¢',
 'tog-watchdeletion' => 'צולייגן בלעטער וואס איך מעק אויס צו מיין אויפפאסונג ליסטע',
 'tog-minordefault' => 'באגרענעצן אלע רעדאַקטירונגען גרונטלעך אלס מינערדיק',
 'tog-previewontop' => 'צײַג די "פֿאָרויסיגע װײַזונג" גלײַך בײַ דער ערשטער באַאַרבעטונג',
 'tog-previewonfirst' => 'ווייזן פֿאראויסדיגע ווייזונג בײַ דער ערשטער רעדאקטירונג',
 'tog-nocache' => 'מבטל זײַן האַלטן בלעטער אין זאַפאַס',
-'tog-enotifwatchlistpages' => 'שיק מיר א בליצבריוו ווען א בלאט וואס איך פאס אויף ווערט געענדערט',
+'tog-enotifwatchlistpages' => 'שיקט מיר א בליצבריוו ווען א בלאט וואס איך פאס אויף ווערט געענדערט',
 'tog-enotifusertalkpages' => 'שיקט מיר ע-פאסט ווען עס ווערט געענדערט מיין באניצער רעדן בלאט',
 'tog-enotifminoredits' => 'שיקט מיר ע-פאסט אויך פֿאַר מינערדיקע רעדאַקטירונגען פֿון בלעטער',
 'tog-enotifrevealaddr' => 'דעק אויף מיין בליצפאסט אדרעס אין פאסט מודעות',
@@ -224,7 +224,6 @@ $messages = array(
 'tog-watchlisthideliu' => 'באהאלטן רעדאקטירונגען פון איינלאגירטע באניצערס פון דער אויפֿפאסונג ליסטע',
 'tog-watchlisthideanons' => 'באהאלטן רעדאקטירונגען פון אנאנימע באניצערס פון דער אויפֿפאסונג ליסטע',
 'tog-watchlisthidepatrolled' => 'באַהאַלטן פאַטראלירטע רעדאַקטירונגען פֿון דער אויפֿפאַסונג ליסטע',
-'tog-nolangconversion' => 'זיי מבטל פארשידענארטיגקייט אין קאנווערסאציע',
 'tog-ccmeonemails' => 'שיק מיר קאפיעס פון בליצבריוו וואס איך שיק צו אנדערע באַניצער',
 'tog-diffonly' => 'ווייז נישט אינהאלט אונטער די דיפערענץ',
 'tog-showhiddencats' => 'ווײַז באהאלטענע קאטעגאריעס',
@@ -242,9 +241,9 @@ $messages = array(
 'editfont-serif' => 'סעריף שריפֿט',
 
 # Dates
-'sunday' => '×\96×\95× ×\98×\90ג',
+'sunday' => '×\96×\95× ×\98×\99ג',
 'monday' => 'מאָנטיג',
-'tuesday' => '×\93×\99נס×\98×\90ג',
+'tuesday' => '×\93×\99נס×\98×\99ג',
 'wednesday' => 'מיטװאָך',
 'thursday' => 'דאָנערשטאג',
 'friday' => 'פרייטיג',
@@ -258,7 +257,7 @@ $messages = array(
 'sat' => 'שבת',
 'january' => 'יאַנואַר',
 'february' => 'פֿעברואַר',
-'march' => '×\9e×\90Ö·רץ',
+'march' => '×\9e×¢רץ',
 'april' => 'אַפּריל',
 'may_long' => 'מײַ',
 'june' => 'יוני',
@@ -282,7 +281,7 @@ $messages = array(
 'december-gen' => 'דעצעמבער',
 'jan' => 'יאַנ׳',
 'feb' => 'פֿעב׳',
-'mar' => '×\9e×\90Ö·ר׳',
+'mar' => '×\9e×¢ר׳',
 'apr' => 'אַפּר׳',
 'may' => 'מײַ',
 'jun' => 'יונ׳',
@@ -379,7 +378,7 @@ $messages = array(
 'protect_change' => 'טוישן',
 'protectthispage' => 'באשיץ דעם בלאט',
 'unprotect' => 'ענדערונג באַשיצונג',
-'unprotectthispage' => '×¢× ×\93ער×\95× ×\92 באַשיצונג פון דעם בלאַט',
+'unprotectthispage' => '×¢× ×\93ער×\9f באַשיצונג פון דעם בלאַט',
 'newpage' => 'נייער בלאַט',
 'talkpage' => 'שמועסט איבער דעם בלאט',
 'talkpagelinktext' => 'שמועס',
@@ -450,6 +449,10 @@ $1',
 'youhavenewmessages' => 'איר האט $1 ($2).',
 'newmessageslink' => 'נייע מעלדונגען',
 'newmessagesdifflink' => 'לעצטע ענדערונג',
+'youhavenewmessagesfromusers' => 'איר האט $1 פון {{PLURAL:$3|אן אנדער באניצער|$3 באניצער}} ($2).',
+'youhavenewmessagesmanyusers' => 'איר האט $1 פון אסאך באניצער ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|א נייע מעלדונג|נייע מעלדונגען}}',
+'newmessagesdifflinkplural' => 'לעצטע {{PLURAL:$1|ענדערונג|ענדערונגען}}',
 'youhavenewmessagesmulti' => 'איר האט נייע מעלדונגען אין $1',
 'editsection' => 'באַאַרבעטן',
 'editold' => 'רעדאַקטירן',
@@ -504,11 +507,11 @@ $1',
 'error' => 'פעלער',
 'databaseerror' => 'דאטנבאזע פעלער',
 'dberrortext' => 'א דאטנבאזע זוכונג סינטאקס גרייז האט פאסירט.
\93×\90ס ×\98×¢×\95ת ×§×¢×\9f ×\96×\99×\99×\9f ×¦×\95×\9c×\99×\91 ×\90 ×\91×\90×\92 ×\90×\99× ×¢×\9d ×\95×\95×\99×\99×\9b×\95×\95×\90ר×\92.
+דאס קען זיין צוליב א באג אינעם ווייכווארג.
 די לעצטע דאטנבאזע זוכונג איז געווען:
-<blockquote><tt>$1</tt></blockquote>
-פון דער פונקציע "<tt>$2</tt>".
-דאטנבאזע האט צוריקגעגעבן גרייז "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+פון דער פונקציע "<code>$2</code>".
+דאטנבאזע האט צוריקגעגעבן גרייז "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'א דאטנבאזע זוכונג סינטאקס גרייז האט פאסירט.
 די לעצטע דאטנבאזע זוכונג איז געווען:
 "$1"
@@ -545,6 +548,8 @@ $1',
 'cannotdelete' => 'נישט געווען מעגלעך אויסמעקן דעם בלאט אדער די טעקע "$1".
 קען זיין  אז דאס איז שוין געווארן אויסגעמעקט דורך אן אנדערן.',
 'cannotdelete-title' => 'מען קען נישט אויסמעקן בלאט "$1"',
+'delete-hook-aborted' => 'אויסמעקונג אנולירט דורך hook.
+נישט געגעבן קיין דערקלערונג.',
 'badtitle' => 'שלעכט קעפל',
 'badtitletext' => "דאס קעפל פון דעם געזוכטן בלאט איז געווען אומגעזעצליך, ליידיג, אן אינטערשפראך אדער אינטערוויקי לינק וואס פאסט נישט, אדער אנטהאט כאראקטערס וואס מ'קען נישט ניצן אין א קעפל.",
 'perfcached' => "די פאלגנדע דאטן זענען גענומען פונעם 'זאַפאַס' און מעגלעך נישט אקטועל. מאקסימום {{PLURAL:$1|איין רעזולטאט איז|$1 רעזולטאטן זענען}} פאראן אין זאפאס.",
@@ -578,6 +583,8 @@ $2',
 דער סיסאפ וואס האט זי פארשפארט האט געגעבן דעם הסבר:  "$3"',
 'invalidtitle-knownnamespace' => 'אומגילטירער טיטל מיט נאמענטייל "$2" און טעקסט "$3"',
 'invalidtitle-unknownnamespace' => 'אומגילטיקער טיטל מיט אומבאוואוסטן נאמענטייל נומער $1 און טעקסט "$2"',
+'exception-nologin' => 'נישט אַרײַנלאגירט',
+'exception-nologin-text' => 'דער בלאט אדער אקציע פֿאדערט אז איר זענט אריינלאגירט ביי דער וויקי.',
 
 # Virus scanner
 'virus-badscanner' => "שלעכטע קאנפֿיגוראציע: אומבאוואוסטער ווירוס איבערקוקער: ''$1''",
@@ -596,6 +603,7 @@ $2',
 'remembermypassword' => 'געדיינק מײַן אַרײַנלאגירן אויף דעם קאמפיוטער (ביז  $1 {{PLURAL:$1|טאָג|טעג}})',
 'securelogin-stick-https' => 'בלייַבן פארבונדן צו HTTPS נאָכן ארײַנלאָגירן',
 'yourdomainname' => 'אײַער געביט:',
+'password-change-forbidden' => 'איר קען נישט ענדערן פאסווערטער אויף דער וויקי.',
 'externaldberror' => 'עס איז אדער פארגעקומען אן אויטענטיקאציע דאטנבאזע פעלער אדער איר זענט נישט ערמעגליכט צו דערהיינטיגן אייער דרויסנדיגע קאנטע.',
 'login' => 'אַרײַנלאָגירן',
 'nav-login-createaccount' => 'ארײַנלאָגירן / זיך אײַנשרײַבן',
@@ -606,8 +614,8 @@ $2',
 'userlogout' => 'אַרױסלאָגירן',
 'notloggedin' => 'נישט איינגעשריבן',
 'nologin' => "איר האט נישט קיין קאנטע? '''$1'''.",
-'nologinlink' => '×\91×\90ש×\90פֿ×\98 ×\90 קאנטע',
-'createaccount' => '×\91×\90ש×\90פֿ×\98 ×\90 × ×\99×\99ע קאנטע',
+'nologinlink' => 'ש×\90ַפֿ×\9f ×\90Ö· קאנטע',
+'createaccount' => 'ש×\90ַפֿ×\9f ×\90Ö· × ×²Ö·ע קאנטע',
 'gotaccount' => "האסטו שוין א קאנטע? '''$1'''.",
 'gotaccountlink' => 'אַרײַנלאגירן',
 'userlogin-resetlink' => 'פארגעסן אײַערע אַרײַנלאָגירן פרטים?',
@@ -632,7 +640,7 @@ $2',
 'loginsuccess' => "'''איר זענט אַצינד אַרײַנלאָגירט אין {{SITENAME}} ווי \"\$1\".'''",
 'nosuchuser' => 'נישטא קיין באניצער מיטן נאמען  "$1".
 
-ק×\95ק×\98 ×\90×\99×\91ער ×\90×\99×\99ער ×\90×\95×\99ס×\9c×\99×\99×\92, ×\90×\93ער [[Special:UserLogin/signup|×\91×\90ש×\90פֿ×\98 ×\90 × ×\99×\99ע קאנטע]].',
+ק×\95ק×\98 ×\90×\99×\91ער ×\90ײַער ×\90×\95×\99ס×\9c×\99×\99×\92, ×\90×\93ער [[Special:UserLogin/signup|ש×\90ַפֿ×\98 ×\90 × ×²Ö·ע קאנטע]].',
 'nosuchusershort' => 'נישטאָ קיין באַניצער מיטן נאָמען "$1". 
 ביטע באַשטעטיקט דעם אויסלייג.',
 'nouserspecified' => 'איר ברויכט ספעציפֿיצירן א באַניצער-נאָמען.',
@@ -839,7 +847,7 @@ $2
 'newarticletext' => "איר זענט געקומען צו אַ בלאַט וואָס עקזיסטירט נאָך נישט!
 כדי שאַפֿן דעם בלאַט, קלאַפט אַרײַן טעקסט אין דעם קעסטל אונטן (זעט דעם [[{{MediaWiki:Helppage}}|הילף בלאַט]] פֿאַר מער אינפֿארמאַציע).
 אויב איר זענט אַהערגעקומען בטעות, דרוקט דאָס '''Back''' קנעפל אין אײַער בלעטערער.",
-'anontalkpagetext' => "----'''דאס איז א רעדן בלאט פון א אן אנאנימען באַניצער וואס האט נאך נישט באַשאַפֿן קיין קאנטע, אדער באניצט זיך נישט דערמיט. דערוועגן, מוזן מיר זיך באניצן מיט זיין IP אדרעס כדי אים צו אידענטיפיצירן. עס קען זיין אז עטלעכע אנדערע ניצן אויך דעם  IP אדרעס. אויב זענט איר אן אנאנימער באַניצער וואס שפירט אז איר האט באקומען מעלדונגען וואס זענען נישט שייך צו אייך, ביטע [[Special:UserLogin/signup|באַשאַפֿט א קאנטע]] אדער [[Special:UserLogin|טוט זיך אריינלאגירן]] כדי צו פארמיידן דאס אין די עתיד זיך פארמישן מיט אנדערע אנאנימע באַניצערס.'''",
+'anontalkpagetext' => "----'''דאָס איז א רעדן בלאַט פון א אַן אַנאנימען באַניצער וואָס האט נאך נישט געשאַפֿן קיין קאנטע, אדער באניצט זיך נישט דערמיט. דערוועגן, מוזן מיר זיך באניצן מיט זיין IP אדרעס כדי אים צו אידענטיפיצירן. עס קען זיין אז עטלעכע אנדערע ניצן אויך דעם  IP אדרעס. אויב זענט איר אן אנאנימער באַניצער וואס שפירט אז איר האט באקומען מעלדונגען וואס זענען נישט שייך צו אייך, ביטע [[Special:UserLogin/signup|שאַפֿט א קאנטע]] אדער [[Special:UserLogin|טוט זיך אריינלאגירן]] כדי צו פארמיידן דאס אין די עתיד זיך פארמישן מיט אנדערע אַנאנימע באַניצערס.'''",
 'noarticletext' => 'דערווייל איז נישט פאַרהאן קיין שום טעקסט אין דעם בלאט.
 איר קענט [[Special:Search/{{PAGENAME}}|זוכן דעם בלאט טיטל]] אין אנדערע בלעטער,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} זוכן די רעלעוואנטע לאגביכער],
@@ -847,7 +855,12 @@ $2
 'noarticletext-nopermission' => 'דערווײַל איז נישט פאַראַן קיין שום טעקסט אין דעם בלאַט.
 איר קענט [[Special:Search/{{PAGENAME}}| זוכן דעם בלאט טיטל]] אין אנדערע בלעטער,
 אדער <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} נאָכזוכן די רעלעוואנטע לאגביכער]</span>.',
-'userpage-userdoesnotexist' => 'באניצער קאנטע "<nowiki>$1</nowiki>" איז נישט אײַנגעשריבן. קוקט איבער צי איר ווילט שאפֿן/רעדאקטירן דעם בלאט.',
+'missing-revision' => 'די רעוויזיע #$1 פונעם בלאט "{{PAGENAME}}" עקזיסטירט נישט.
+
+דאס געשעט געוויינלעך פון פאלגן א פארעלטערטן היסטאריע לינק צו א בלאט וואס איז געווארן אויסגעמעקט.
+פרטים קען מען געפינען אינעם [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאגבוך].',
+'userpage-userdoesnotexist' => 'באניצער קאנטע "$1" איז נישט אײַנגעשריבן. 
+קוקט איבער צי איר ווילט שאפֿן/רעדאקטירן דעם בלאט.',
 'userpage-userdoesnotexist-view' => 'באניצער קאנטע "$1" איז נישט איינגעשריבן.',
 'blocked-notice-logextract' => 'דער באַניצער איז דערווייַל פֿאַרשפאַרט.
 די לעצטע בלאָקירן לאג אַקציע איז צוגעשטעלט אונטן:',
@@ -859,8 +872,6 @@ $2
 
 * '''אינטערנעט עקספלארער:''' האלט אראפ ''Ctrl'' בשעתן קליקן ''Refresh'', אדער  דרוקט ''Ctrl-F5''
 
-* '''קאנקעראר:''' קליקט ''Reload'' אדער דרוקט ''F5''
-
 * '''אפערע:''' ליידיגט אויס דעם זאַפאַס אין ''Tools → Preferences'' (''העדפות'' > ''כלים'')",
 'usercssyoucanpreview' => "'''טיפ:''' נוצט דאס {{int:showpreview}} קנעפל אויספרובירן אייער CSS בעפארן אויפהיטן.",
 'userjsyoucanpreview' => "'''טיפ:''' נוצט דאס {{int:showpreview}} קנעפל אויספרובירן אייער  JavaScript בעפארן אויפהיטן.",
@@ -933,13 +944,13 @@ $2
 'hiddencategories' => 'דער דאזיגער בלאט געהערט צו {{PLURAL:$1|איין באהאלטענער קאטעגאריע|$1 באהאלטענע קאטעגאריעס}}:',
 'edittools' => '<!-- טעקסט דא וועט געוויזן ווערן אונטער ענדערן און ארויפלאדירן פארעמס. -->',
 'nocreatetitle' => 'בלאט באשאפן באגרעניצט',
-'nocreatetext' => '×\93×\99 ×¡×\99×\99×\98 ×\94×\90×\98 ×\91×\90×\92רענ×\99צ×\98 ×\93×\99 ×\9e×¢×\92×\9c×\99×\9bק×\99×\99×\98 ×¦×\95 ×\91×\90ש×\90פ×\9f × ×\99×\99×¢ ×\91×\9c×¢×\98ער.
\90×\99ר ×§×¢× ×\98 ×¦×\95ר×\99ק×\92×\99×\99×\9f ×\90×\95×\9f ×¢× ×\93ער×\9f ×\93×\99 ×¢×§×\96×\99ס×\98×\99רנ×\93×¢ ×\91×\9c×\90×\98, ×\90×\93ער [[Special:UserLogin|×\9c×\90×\92×\99ר×\98 ×\96×\99×\9a ×\90ר×\99×\99×\9f ×\90×\95×\9f ×\91×\90שאפט א קאנטע]].',
+'nocreatetext' => 'די סייט האט באגרעניצט די מעגליכקייט צו שאפן נייע בלעטער.
\90×\99ר ×§×¢× ×\98 ×¦×\95ר×\99ק×\92×\99×\99×\9f ×\90×\95×\9f ×¢× ×\93ער×\9f ×\93×¢×\9d ×¢×§×\96×\99ס×\98×\99רנ×\93×\9f ×\91×\9c×\90×\98, ×\90×\93ער [[Special:UserLogin|×\9c×\90×\92×\99ר×\98 ×\96×\99×\9a ×\90ר×\99×\99×\9f ×\90×\93ער שאפט א קאנטע]].',
 'nocreate-loggedin' => 'איר זענט נישט ערלויבט צו שאַפֿן נײַע בלעטער.',
 'sectioneditnotsupported-title' => 'רעדאקטירן אפטיילונגען נישט געשטיצט.',
 'sectioneditnotsupported-text' => 'רעדאַקטירן אָפטיילונגען נישט געשטיצט אויף דעם בלאַט',
-'permissionserrors' => 'ער×\9c×\95×\99×\91×¢× ×\99ש×\9f ×¤×¢×\99×\9cערס',
-'permissionserrorstext' => 'איר זענט נישט ערלויבט צו טון דאס, פֿאַר  {{PLURAL:$1|דער פֿאלגנדער סיבה|די פֿאלגנדע סיבות}}:',
+'permissionserrors' => 'ערלויבענישן פעלערס',
+'permissionserrorstext' => 'איר זענט נישט ערלויבט צו טון דאס, פֿאַר {{PLURAL:$1|דער פֿאלגנדער סיבה|די פֿאלגנדע סיבות}}:',
 'permissionserrorstext-withaction' => 'איר זענט נישט ערלויבט צו $2, וועגן {{PLURAL:$1|דער פֿאלגנדער סיבה| די פֿאלגנדע סיבות}}:',
 'recreate-moveddeleted-warn' => "'''ווארענונג: איר שאפט א נייעם בלאט וואס איז שוין איינמאל  געווארן אויסגעמעקט.'''
 
@@ -1062,6 +1073,9 @@ $2
 'revdelete-show-file-submit' => 'יא',
 'revdelete-selected' => "'''{{PLURAL:$2|אויסדערוויילטע ווערסיע| אויסדערוויילטע ווערסיעס}} פון [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1| אויסדערוויילטע לאג אקציע|אויסדערוויילטע לאג אקציעס}}:'''",
+'revdelete-text' => "'''אויסגעמעקטע רעוויזיעס און געשעענישן וועלן בלייבן אין דער בלאט היסטאריע און די לאגביכער, אבער טיילן פון זייער אינהאלט וועט ווערן אומגרייכלעך צום קהל. '''
+אנדערע סיסאפן אויף {{SITENAME}} וועלן נאך האבן צוטריט צום באהאלטענעם אינהאלט און קענען אים צוריקשטעלן דורך דעם זעלבן אייבערפלאך,  אחוץ ווען מען שטעלט נאך באגרענעצונגען.",
+'revdelete-confirm' => 'זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט  [[{{MediaWiki:Policy-url}}|דער פאליסי]].',
 'revdelete-suppress-text' => "באהאלטן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגענדע פעלער:
 * אויפדעקונג פון פריוואטקייט אינפארמאציע
 * ''היים אדרעסן, טעלעפאן נומערן, אדער סאשעל סעקיורעטי, א.א.וו.:'''",
@@ -1557,9 +1571,9 @@ $1",
 כדי צו זען אדער זוכן טעקעס וואס זענען שוין אַרויפֿגעלאָדן ווענדט זיך צו דער [[Special:FileList|ליסטע פֿון אַרויפֿגעלאָדענע טעקעס]]; (ווידער)אַרויפֿלאָדונגען ווערן אויך לאגירט אינעם  [[Special:Log/upload| אַרויפֿלאָדן לאג-בוך]], אויסמעקונגען אינעם [[Special:Log/delete|אויסמעקן לאג-בוך]].
 
 כדי אײַנשליסן א טעקע אין א בלאַט, באניצט א לינק אין איינעם פון די פֿאלגנדע פֿארעמען:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' צו ניצן די פֿולע ווערסיע פֿון דער טעקע
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|טעקסט קעפל]]</nowiki></tt>''' צו ניצן א 200 פיקסל ברייט ווערסיע אין א קעסטל אויף דער לינקער זײַט, מיט דער שילדערונג 'טעקסט קעפל'
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' פֿאר א גראָדער פֿאַרבינדונג צו דער טעקע אָן צו ווײַזן זי",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' צו ניצן די פֿולע ווערסיע פֿון דער טעקע
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|טעקסט קעפל]]</nowiki></code>''' צו ניצן א 200 פיקסל ברייט ווערסיע אין א קעסטל אויף דער לינקער זײַט, מיט דער שילדערונג 'טעקסט קעפל'
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' פֿאר א גראָדער פֿאַרבינדונג צו דער טעקע אָן צו ווײַזן זי",
 'upload-permitted' => 'ערלויבטע טעקע טיפן: $1.',
 'upload-preferred' => 'פרעפֿרירטע טעקע טיפן: $1.',
 'upload-prohibited' => 'פֿאַרווערענע טעקע טיפן: $1.',
@@ -1597,16 +1611,17 @@ $1",
 'tmp-write-error' => 'טעות בײַם שרייַבן צייַטווייַליקע טעקע.',
 'large-file' => 'רעקאמענדירט אז טעקעס זאל נישט זײַן גרעסער פֿון$1;
 די טעקע איז $2.',
+'largefileserver' => 'די טעקע איז גרעסער פונעם מאקסימום פאר דעם סערווער.',
 'emptyfile' => 'די טעקע וואס איר האט ארויפֿלגעלאָדן איז ליידיג.
-עס קען זיין אז די סיבה איז פשוט א טייפא.
+עס קען זיין אז די סיבה איז פשוט א טייפא אינעם טעקע־נאמען.
 ביטע קוקט איבער צי איר ווילט ארויפֿלאדן  די דאזיקע טעקע.',
 'windows-nonascii-filename' => 'די וויקי שטיצט נישט טעקע־נעמען מיט ספעציעלע צייכענען.',
-'fileexists' => "א טעקע מיט דעם נאָמען עקזיסטירט שוין, ביטע זײַט בודק '''<tt>[[:$1]]</tt>''' ווען איר זענט נישט זיכער אַז איר ווילט זי ענדערן.
-[[$1|thumb]]",
-'fileexists-extension' => "א טעקע מיט אן ענלעכן נאמען עקזיסטירט שוין: [[$2|thumb]]
-* נאמען פון דער טעקע וואס ווערט ארויפגעלאָדן: '''<tt>[[:$1]]</tt>'''
-* נאמען פון דער פֿאראנענער טעקע: '''<tt>[[:$2]]</tt>'''
-זײַט אזוי גוט און קלויבט אן אנדער נאמען.",
+'fileexists' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין, ביטע זײַט בודק <strong>[[:$1]]</strong> ווען איר זענט נישט זיכער אַז איר ווילט זי ענדערן.
+[[$1|thumb]]',
+'fileexists-extension' => 'א טעקע מיט אן ענלעכן נאמען עקזיסטירט שוין: [[$2|thumb]]
+* נאמען פון דער טעקע וואס ווערט ארויפגעלאָדן: <strong>[[:$1]]</strong>
+* נאמען פון דער פֿאראנענער טעקע: <strong>[[:$2]]</strong>
+זײַט אזוי גוט און קלויבט אן אנדער נאמען.',
 'fileexists-forbidden' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין, און מען קען זי נישט אַריבערשרײַבן. 
 אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען. 
 [[File:$1|thumb|center|$1]]',
@@ -1614,15 +1629,19 @@ $1",
 אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען. 
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'די טעקע איז א דופליקאַט פון די פֿאלגנדע {{PLURAL:$1|טעקע|טעקעס}}:',
+'file-deleted-duplicate' => "א טעקע אידענטיש מיט דער טעקע ([[:$1]]) האט מען שוין אויסגעמעקט.
+איר זאלט קאנטראלירן דער טעקע'ס אויסמעקן היסטאריע איידער איר טוט ארויפלאדן פונדאסניי.",
 'uploadwarning' => 'אַרויפֿלאָדן וואָרענונג',
 'uploadwarning-text' => 'זײַט אַזוי גוט מאדיפֿיצירן די טעקע באַשרייבונג און פרובירט נאכאַמאָל.',
-'savefile' => '×\98עקע ×\90ױפֿ×\94×\99×\98×\9f',
+'savefile' => '×\90ױפֿ×\94×\99×\98×\9f ×\98עקע',
 'uploadedimage' => 'אַרױפֿגעלאָדן "[[$1]]"',
 'overwroteimage' => 'אַרויפֿגעלאָדן א נײַע ווערסיע פון "[[$1]]"',
 'uploaddisabled' => 'אַרויפֿלאָדן טעקעס מבוטל',
 'copyuploaddisabled' => 'ארויפלאדן דורך URL אומאקטיווירט',
-'uploadfromurl-queued' => 'אייער ארויפלאד איז אין דער רייע.',
-'uploaddisabledtext' => 'אַרויפֿלאָדן טעקעס נישט דערמעגלעכט אצינד.',
+'uploadfromurl-queued' => 'אייער ארויפֿלאד איז אין דער רייע.',
+'uploaddisabledtext' => 'אַרויפֿלאָדן טעקעס נישט דערמעגלעכט.',
+'php-uploaddisabledtext' => 'אַרויפֿלאָדן טעקעס נישט דערמעגלעכט אין PHP.
+זייט אזוי גוט בודק זיין די file_uploads שטעלונג.',
 'uploadscripted' => 'די טעקע האט א סקריפט אדער HTML קאד וואס קען ווערן פֿאלש אויסגעטייטשט דורך א בלעטערער',
 'uploadvirus' => 'די טעקע האָט אַ ווירוס! פרטים: <div dir="rtl">$1</div>',
 'upload-source' => 'מקור טעקע',
@@ -1633,6 +1652,8 @@ $1",
 'upload-description' => 'טעקע שילדערונג',
 'upload-options' => "אַרויפֿלאָדן ברירה'ס",
 'watchthisupload' => 'אויפֿפאַסן דעם בלאט',
+'filewasdeleted' => 'א טעקע מיט דעם נאמען האט מען שוין ארויפגעלאדן און דערנאך אויסגעמעקט.
+איר זאלט בודק זיין דעם $1 איידער איר הייבט אן ארויפלאדן ווידעראמאל.',
 'upload-success-subj' => 'דערפֿאלגרייכער ארויפֿלאָד',
 'upload-success-msg' => 'אײַער אַרויפֿלאָד פֿון [$2] איז געווען דערפֿאלגרייך. עס איז פֿאַראָן דאָ: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'אַרויפֿלאָדן פראבלעם',
@@ -1665,6 +1686,7 @@ $1",
 'backend-fail-closetemp' => 'קען נישט שליסן צייַטווייַליקע טעקע.',
 'backend-fail-read' => 'קען נישט ליינען טעקע "$1".',
 'backend-fail-create' => 'קען נישט שרייבן טעקע "$1".',
+'backend-fail-maxsize' => 'מ\'האט נישט געקענט שרייבן די טעקע "$1" ווייל זי איז גרעסער פון {{PLURAL:$2|איין בייט|$2 בייטן}}.',
 
 # Lock manager
 'lockmanager-notlocked' => 'מ\'קען נישט אויפֿשליסן "$1"; ער איז נישט פֿארשלאסן.',
@@ -1674,6 +1696,8 @@ $1",
 
 # Special:UploadStash
 'uploadstash' => 'אַרויפֿלאָד רעזערוו',
+'uploadstash-clear' => 'אויסמעקן טעקעס פון זאפאס',
+'uploadstash-nofiles' => 'איר האט נישט קיין טעקעס אין זאפאס.',
 'uploadstash-refresh' => 'דערפֿרישן די רשימה פון טעקעס',
 
 # img_auth script messages
@@ -1755,6 +1779,7 @@ $1",
 'shared-repo-from' => 'פֿון $1',
 'shared-repo' => 'א געמיינזאַמער זאַפאַס',
 'shared-repo-name-wikimediacommons' => 'וויקימעדיע קאמאנס',
+'upload-disallowed-here' => 'ליידער קענט איר נישט איבערשרייבן דאס בילד.',
 
 # File reversion
 'filerevert' => 'צוריקדרייען $1',
@@ -1781,6 +1806,7 @@ $1",
 ** קאפירעכט פֿאַרלעצונג
 ** דופליקאַט',
 'filedelete-edit-reasonlist' => 'רעדאַקטירן אויסמעקן סיבות',
+'filedelete-maintenance' => 'אויסמעקן און צוריקשטעלן טעקעס צײַטווײַליק אומדערמעגלעכט בשעת אויפהאלטן.',
 'filedelete-maintenance-title' => 'מען קען נישט אויסמעקן די טעקע',
 
 # MIME search
@@ -1830,7 +1856,7 @@ $1",
 
 'disambiguations' => 'בלעטער וואס פֿארבינדן מיט באדייטן בלעטער',
 'disambiguationspage' => 'Template:באדייטן',
-'disambiguations-text' => "×\93×\99 ×§×\95×\9e×¢× ×\93×\99×\92×¢ ×\91×\9c×¢×\98ער ×¤×\90ר×\91×\99× ×\93×¢×\9f ×¦×\95 ×\90 '''×\91×\90×\93×\99×\99×\98×\9f ×\91×\9c×\90×\98'''. ×\96×\99×\99 ×\91ר×\95×\99×\9b×\9f ×¢× ×\93ערש×\98 ×¤Ö¿×\90ר×\91×\99× ×\93×\9f ×¦×\95 ×\93ער ×¨×¢×\9c×¢×\95×\95×\90× ×\98ער ×\98×¢×\9e×¢ ×\91×\9c×\90×\98.<br />×\90 ×\91×\9c×\90×\98 ×\95×\95ער×\98 ×¤×\90ררע×\9b×¢× ×\98 ×\90×\9cס ×\90 ×\91×\9c×\90×\98 ×\95×\95ער×\98 ×\92ערע×\9bנט פאר א באדײַטן בלאט אויב ער באניצט זיך מיט א מוסטער וואס איז פארבינדען פון [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "×\93×\99 ×§×\95×\9e×¢× ×\93×\99×\92×¢ ×\91×\9c×¢×\98ער ×¤×\90ר×\91×\99× ×\93×\9f ×¦×\95 ×\90 '''×\91×\90×\93×\99×\99×\98×\9f ×\91×\9c×\90×\98'''. ×\96×\99×\99 ×\91ר×\95×\99×\9b×\9f ×¢× ×\93ערש×\98 ×¤Ö¿×\90ר×\91×\99× ×\93×\9f ×¦×\95 ×\93×¢×\9d ×¨×¢×\9c×¢×\95×\95×\90× ×\98×\9f ×\98×¢×\9e×¢ ×\91×\9c×\90×\98.<br />×\90 ×\91×\9c×\90×\98 ×\95×\95ער×\98 ×¤×\90ררע×\9b×¢נט פאר א באדײַטן בלאט אויב ער באניצט זיך מיט א מוסטער וואס איז פארבינדען פון [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'געטאפלטע ווײַטערפֿירונגען',
 'doubleredirectstext' => 'דער בלאט רעכנט אויס בלעטער וואס פירן ווייטער צו אנדערע ווייטערפירן בלעטער.
@@ -1848,13 +1874,14 @@ $1",
 'withoutinterwiki' => 'בלעטער אן שפראך פֿארבינדונגען',
 'withoutinterwiki-summary' => 'די פֿאלגנדע בלעטער פֿאַרבינדן נישט מיט אַנדערע שפראַך ווערסיעס',
 'withoutinterwiki-legend' => 'פרעפֿיקס',
-'withoutinterwiki-submit' => 'ווײַז',
+'withoutinterwiki-submit' => 'ווײַזן',
 
 'fewestrevisions' => 'בלעטער מיט די מינדערסטע רעוויזיעס',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|בייט|בייטן}}',
 'ncategories' => '{{PLURAL:$1|קאטעגאריע|$1 קאטעגאריעס}}',
+'ninterwikis' => '$1 {{PLURAL:$1|אינטערוויקי|אינטערוויקיס}}',
 'nlinks' => '$1 {{PLURAL:$1|לינק|לינקען}}',
 'nmembers' => '$1 {{PLURAL:$1|בלאט|בלעטער}}',
 'nrevisions' => '{{PLURAL:$1|איין רעוויזיע|$1 רעוויזיעס}}',
@@ -1875,12 +1902,14 @@ $1",
 'wantedpages' => 'געזוכטע בלעטער',
 'wantedpages-badtitle' => 'אומגילטיקער טיטל אין רעזולטאַט: $1',
 'wantedfiles' => 'געזוכטע טעקעס',
+'wantedfiletext-cat' => 'די פֿאלגנדע טעקעס ווערן געניצט אבער זיי עקזיסטירן נישט. טעקעס פון פֿרעמדע רעפאזיטאריעס קענען ווערן אריינגערעכנט טראץ זיי עקזיסטירן יא. אזעלכע גרייזן וועלן ווערן <del>אויסגעשריכן </del>. דערצו, בלעטער וואס ניצן אומעקזיסטירנדע טעקעס ווערן אריינגערעכנט אין [[:$1]].',
 'wantedtemplates' => 'געזוכטע מוסטערן',
 'mostlinked' => 'מערסט פֿארבינדענע בלעטער',
 'mostlinkedcategories' => 'מערסט פֿארבינדענע קאטעגאריעס',
 'mostlinkedtemplates' => 'מערסט פֿארבינדענע מוסטערן',
 'mostcategories' => 'אַרטיקלען מיט די מערסטע קאַטעגאָריעס',
 'mostimages' => 'מערסט פֿארבונדענע טעקעס',
+'mostinterwikis' => 'בלעטער מיט די מערסטע אינטערוויקיס',
 'mostrevisions' => 'אַרטיקלען מיט די מערסטע באַאַרבעטונגען',
 'prefixindex' => 'פּרעפֿיקס אינדעקס',
 'prefixindex-namespace' => 'אלע בלעטער מיט פרעפֿיקס ($1 נאמענטייל)',
@@ -1907,7 +1936,7 @@ $1",
 'move' => 'באַװעגן',
 'movethispage' => 'באוועג דעם בלאט',
 'unusedimagestext' => 'די פֿאלגנדע טעקעס עקזיסטירן אבער ווערן נישט גענוצט אין קיין שום בלאַט.
\92×\99×\90 אַכט אז אנדערע וועבערטער קענען פֿארבינדן צו א טעקע מיט א דירעקטן URL, און קענען דעריבער באווײַזן זיך דאָ כאטש זיי זענען אין אקטיוון באניץ.',
\92×\99×\98 אַכט אז אנדערע וועבערטער קענען פֿארבינדן צו א טעקע מיט א דירעקטן URL, און קענען דעריבער באווײַזן זיך דאָ כאטש זיי זענען אין אקטיוון באניץ.',
 'unusedcategoriestext' => 'די פֿאלגנדע קאטעגאריעס עקסיסטירן, אבער קיין בלאט אדער קאטעגאריע ניצט זיי נישט.',
 'notargettitle' => 'קיין ציל',
 'notargettext' => 'איר האט נישט ספעציפֿירט קיין ציל בלאַט אדער באַניצער אויף וועמען אויסצופֿירן די פעולה.',
@@ -1934,6 +1963,7 @@ $1",
 מען קען פֿאַרשמעלרן די אויסוואל דורך אויסוויילן א סארט לאג, באַניצער נאמען אדער אנרירנדע בלעטער.',
 'logempty' => 'נישטא קיין פאַסנדיקע זאכן אין לאג.',
 'log-title-wildcard' => 'זוכן טיטלען וואס הייבן אָן מיט דעם טעקסט',
+'showhideselectedlogentries' => 'ווײַזן/באַהאַלטן געקליבענע לאגבוך אקציעס',
 
 # Special:AllPages
 'allpages' => 'אַלע בלעטער',
@@ -2019,8 +2049,10 @@ $1",
 # E-mail user
 'mailnologin' => 'נישטא קיין אדרעס צו שיקן',
 'mailnologintext' => 'איר ברויכט זײַן [[Special:UserLogin|אַרײַנלאגירט]] און האָבן א גילטיגן ע־פאסט אַדרעס אין אײַער [[Special:Preferences|פרעפֿערענצן]] צו שיקן ע־פאסט צו אַנדערע באַניצער.',
-'emailuser' => 'אַרויסשיקן ע-פאסט צו דעם באַניצער',
-'emailpage' => 'אַרויסשיקן ע-פאסט צו באַניצער.',
+'emailuser' => 'שיקן ע-פאסט צו דעם באַניצער',
+'emailuser-title-target' => 'שיקן {{GENDER:$1|דעם באניצער|די באניצערין}} ע־פאסט',
+'emailuser-title-notarget' => 'שיקן א באניצער ע־פאסט',
+'emailpage' => 'שיקן ע-פאסט צו באַניצער',
 'emailpagetext' => 'איר קענט ניצן דעם פֿארעם אונטן צו שיקן אן בליצבריוו צו דעם דאזיגן באַניצער.
 דער ע-פאסט אדרעס וואס איר האט אריינגעלייגט אין [[Special:Preferences| אייערע באניצער פרעפערנעצן]] וועט זיך ווייזן כאילו דאס איז געקומען פון דארטן, בכדי צו דערמעגלעכן א תשובה.',
 'usermailererror' => 'בליצבריוו האט צוריקגעשיקט א טעות:',
@@ -2059,7 +2091,7 @@ $1",
 'nowatchlist' => 'איר האט נישט קיין שום בלעטער אין אייער אויפפַּאסונג ליסטע.',
 'watchlistanontext' => 'ביטע $1 כדי צו זען אדער ענדערן בלעטער אין אייער אַכטגעבן ליסטע.',
 'watchnologin' => 'איר זענט נישט אַרײַנלאגירט',
-'watchnologintext' => '×\90×\99ר ×\9e×\95×\96×\98 ×\96×\99×\99×\9f ×\90ר×\99×\99× ×\92עס×\99×\99× ×\98 [[Special:UserLogin|×\90ר×\99×\99× ×\92×\9c×\90×\92×\99ר×\98]] ×¦×\95 ×\9e×\90×\93×\99פֿ×\99צ×\99ר×\9f ×\90×\99×\99ער ×\90×\95×\99פפַּ×\90ס×\9f ליסטע.',
+'watchnologintext' => '×\90×\99ר ×\93×\90רפֿ×\98 ×\96×\99×\99×\9f [[Special:UserLogin|×\90ר×\99×\99× ×\92×\9c×\90×\92×\99ר×\98]] ×¦×\95 ×\9e×\90×\93×\99פֿ×\99צ×\99ר×\9f ×\90×\99×\99ער ×\90×\95×\99פפַּ×\90ס×\95× ×\92Ö¾ליסטע.',
 'addwatch' => 'צולייגן צו דער אויפֿפאַסונג ליסטע',
 'addedwatchtext' => "דער בלאט \"[[:\$1]]\" איז צוגעלײגט געוואָרן צו אײַער [[Special:Watchlist|אויפֿפאַסונג ליסטע]].
 
@@ -2073,12 +2105,12 @@ $1",
 'unwatchthispage' => 'ענדיגן אויפֿפאַסן',
 'notanarticle' => 'דאס איז נישט קיין אינהאלט בלאט',
 'notvisiblerev' => 'די באארבעטונג איז געווארן אויסגעמעקט',
-'watchnochange' => 'ק×\99×\99× ×¢ ×¤Ö¿×\95×\9f ×\90ײַערע ×\90×\95×\99פֿ×\92עפ×\90ַס×\98×¢ ×\91×\9c×¢×\98ער ×\96×¢× ×¢×\9f ×\91×\90Ö·×\90ַר×\91×¢×\98 ×\92×¢×\95×\95×\90ר×\9f אין דעם צײַט פעריאד געוויזן.',
+'watchnochange' => 'ק×\99×\99× ×¢ ×¤Ö¿×\95×\9f ×\90ײַערע ×\90×\95×\99פֿ×\92עפ×\90ַס×\98×¢ ×\91×\9c×¢×\98ער ×\94×\90×\91×\9f ×\96×\99×\9a ×\92×¢×¢× ×\93ער×\98 אין דעם צײַט פעריאד געוויזן.',
 'watchlist-details' => '{{PLURAL:$1|איין בלאט|$1 בלעטער}} אין אייער אויפֿפאסן ליסטע (נישט רעכענען  רעדן בלעטער).',
 'wlheader-enotif' => '* ע-פאסט מעלדונג ערמעגליכט.',
 'wlheader-showupdated' => "* בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''",
 'watchmethod-recent' => 'קאנטראלירן לעצטע ענדערונגען פֿאַר אויפֿגעפאַסטע בלעטער',
-'watchmethod-list' => 'ק×\90× ×\98ר×\90×\9c×\99ר×\9f ×\91×\9c×¢×\98ער ×\90×\99×\9f ×\90Ö·×\9b×\98×\92×¢×\91×\9fÖ¾×\9c×\99ס×\98×¢ ×¤Ö¿×\90ַר × ×²Ö·×¢ ×¨×¢×\93×\90ַק×\98×\99רונגען',
+'watchmethod-list' => 'ק×\90× ×\98ר×\90×\9c×\99ר×\9f ×\91×\9c×¢×\98ער ×\90×\99×\9f ×\90Ö·×\9b×\98×\95× ×\92Ö¾×\9c×\99ס×\98×¢ ×¤Ö¿×\90ַר ×\9cעצ×\98×¢ ×¢× ×\93×¢רונגען',
 'watchlistcontains' => 'אייער אויפֿפאסונג ליסטע אנטהאלט {{PLURAL:$1|איין בלאט|$1 בלעטער}}.',
 'iteminvalidname' => "פּראָבלעם מיט '$1', אומגילטיקער נאָמען ...",
 'wlnote' => "אונטן {{PLURAL:$1|איז די לעצטע ענדערונג|זענען די לעצטע '''$1''' ענדערונגען}} אין {{PLURAL:$2|דער לעצטער שעה|די לעצטע '''$2''' שעה'ן}} ביז $3, $4.",
@@ -2164,6 +2196,8 @@ $UNWATCHURL
 'rollback' => 'צוריקדרייען רעדאַקטירונגען',
 'rollback_short' => 'צוריקדרייען',
 'rollbacklink' => 'צוריקדרייען',
+'rollbacklinkcount' => 'צוריקדרייען $1 {{PLURAL:$1|רעדאקטירונג|רעדאקטירונגען}}',
+'rollbacklinkcount-morethan' => 'צוריקדרייען מער ווי $1 {{PLURAL:$1|רעדאקטירונג|רעדאקטירונגען}}',
 'rollbackfailed' => 'צוריקדרייען דורכגעפֿאַלן',
 'cantrollback' => 'מען קען נישט צוריקדרייען די ענדערונג – דער לעצטער בײַשטייערער איז דער איינציגסטער שרײַבער אין דעם בלאַט.',
 'alreadyrolled' => 'מען קען נישט צוריקדרייען די לעצטע ענדערונג פון בלאט [[:$1]] פֿון
@@ -2472,6 +2506,7 @@ $1',
 'proxyblockreason' => 'אייער איי.פי. אדרעס איז געווארן געבלאקט צוליב דעם ווייל דאס איז א אפענער פראקסי. ביטע פארבינדט זיך מיט אייער אינטערנעט סערוויס פראוויידער אדער טעקס סאפארט צו אינפארמירן זיי איבער דעם ערענסטן זיכערהייט פראבלעם.',
 'proxyblocksuccess' => 'געטאן.',
 'cant-block-while-blocked' => 'איר קען נישט בלאקירן קיין אנדערע באניצער ווען איר זענט אליין בלאקירט.',
+'ipbblocked' => 'איר קען נישט בלאקירן אדער אויפבלאקירן אנדערע באניצער, ווייל איר זענט אליין בלאקירט.',
 'ipbnounblockself' => 'איר זענט נישט ערלויבט זיך אליין אויסבלאקירן',
 
 # Developer tools
@@ -2547,6 +2582,7 @@ $1',
 'movepage-page-exists' => "דער בלאַט $1 עקזיסטירט שוין און מ'קען אים נישט אויטאָמאַטיש איבערשרײַבן.",
 'movepage-page-moved' => 'דער בלאַט $1 איז געוורן באַוועגט צו $2.',
 'movepage-page-unmoved' => 'מען קען נישט באוועגן בלאט $1 צו $2.',
+'movepage-max-pages' => 'דער מאקסימום פון $1 {{PLURAL:$1|בלאט|בלעטער}} האט מען שוין באוועגט און נאך בלעטער וועט מען נישט באוועגן אויטאמאטיש.',
 'movelogpage' => 'באוועגן לאג',
 'movelogpagetext' => 'פֿאלגנד איז א ליסטע פֿון  בלעטער באוועגט.',
 'movesubpage' => '{{PLURAL:$1|אונטערבלאַט|אונטערבלעטער}}',
@@ -2689,6 +2725,8 @@ $1',
 'javascripttest-disabled' => 'די  פֿונקציע איז אומאַקטיווירט אין דער דאזיקער וויקי.',
 'javascripttest-title' => 'דורכפירנדיק $1 בדיקות',
 'javascripttest-pagetext-skins' => 'קלויבט א באניצער־אייבערפלאך מיט וואס דורכצופירן די בדיקות:',
+'javascripttest-qunit-intro' => 'זעט [$1 דאקומענטאציע פאר טעסטן] בײַ mediawiki.org.',
+'javascripttest-qunit-heading' => 'מעדיעוויקי JavaScript QUnit קאנטראל־פראגראם',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'אייער באניצער בלאט',
@@ -2796,16 +2834,32 @@ $1',
 
 # Info page
 'pageinfo-title' => 'אינפֿאָרמאַציע פֿאַר "$1"',
-'pageinfo-header-edits' => 'רעדאַקטירונגען',
-'pageinfo-header-watchlist' => 'אויפֿפאַסונג ליסטע',
-'pageinfo-header-views' => 'קוקן',
-'pageinfo-subjectpage' => 'בלאַט',
-'pageinfo-talkpage' => 'רעדן בלאַט',
-'pageinfo-watchers' => 'צאָל אויפֿפאַסער',
-'pageinfo-edits' => 'צאָל ענדערונגען',
-'pageinfo-authors' => 'צאָל באַזונדערע שרײַבער',
+'pageinfo-header-basic' => 'גרונטלעכע אינפֿארמאַציע',
+'pageinfo-header-edits' => '!רעדאַקטירן היסטאריע',
+'pageinfo-header-restrictions' => 'בלאט באַשיצונג',
+'pageinfo-header-properties' => 'בלאַט אייגנשאַפֿטן',
+'pageinfo-display-title' => 'געוויזענע קעפל',
+'pageinfo-default-sort' => 'גרונט סארטירן שליסל',
+'pageinfo-length' => 'בלאט לענג (אין בייטן)',
+'pageinfo-article-id' => 'בלאט נומער',
+'pageinfo-robot-policy' => 'זוכמאשין סטאטוס',
 'pageinfo-views' => 'צאַל קוקן',
-'pageinfo-viewsperedit' => 'צאל קוקן צו א רעדאַקטירונג',
+'pageinfo-watchers' => '!צאָל בלאט אויפֿפאַסער',
+'pageinfo-redirects-name' => 'ווײַטערפירונגען צו דעם בלאט',
+'pageinfo-subpages-name' => 'אונטערבלעטער פון דעם בלאט',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ווײַטערפירונג|ווײַטערפירונגען}}; $3 {{PLURAL:$3|סתם בלאט|סתם בלעטער}})',
+'pageinfo-firstuser' => 'בלאט שאפער',
+'pageinfo-firsttime' => 'דאטע פון שאפן בלאט',
+'pageinfo-lastuser' => 'לעצטער רעדאקטירער',
+'pageinfo-lasttime' => 'דאטע פון לעצטער רעדאקטירונג',
+'pageinfo-edits' => 'סה"כ צאָל ענדערונגען',
+'pageinfo-authors' => 'סה"כ צאָל באַזונדערע שרײַבער',
+'pageinfo-recent-edits' => 'לעצטיקע צאל רעדאקטירונגען (במשך די לעצטע $1)',
+'pageinfo-recent-authors' => 'לעצטיקע צאָל באַזונדערע שרײַבער',
+'pageinfo-restriction' => 'בלאט שוץ (<code>$1</code>)',
+'pageinfo-magic-words' => '{{PLURAL:$1|מאגיש ווארט|מאגישע ווערטער}} ($1)',
+'pageinfo-hidden-categories' => 'באהאלטענע {{PLURAL:$1|קאטעגאריע|קאטעגאריעס}} ($1)',
+'pageinfo-templates' => ' {{PLURAL:$1|אריבערגעשלאסענער מוסטער|אריבערגשלאסענע מוסטערן}} ($1)',
 
 # Skin names
 'skinname-standard' => 'קלאסיש',
@@ -2850,6 +2904,9 @@ $1',
 'nextdiff' => 'קומענדיקע ווערסיע ←',
 
 # Media information
+'mediawarning' => "'''ווארענונג''': דער טעקע טיפ קען אנטהאלטן בייזוויליקן קאד.
+דורכפירן דעם קאד קען שעדיקן אייער סיסטעם.",
+'imagemaxsize' => "מאקסימאלע בילד גרייס :<br />''(פאר טעקע באשרייבונג בלעטער)''",
 'thumbsize' => 'קליינבילד גרייס:',
 'widthheight' => '$1 × $2',
 'widthheightpage' => '$1 × $2, {{PLURAL:$3|איין בלאט|$3 בלעטער}}',
@@ -2931,6 +2988,7 @@ $1',
 'exif-orientation' => 'אריענטאַציע',
 'exif-samplesperpixel' => 'צאל קאמאפאנענטן',
 'exif-planarconfiguration' => 'דאטן איינארדנונג',
+'exif-jpeginterchangeformatlength' => 'בייטן פון JPEG דאטן',
 'exif-datetime' => 'טעקע ענדערונג דאטע און צײַט',
 'exif-imagedescription' => 'בילד טיטל',
 'exif-make' => 'פֿאטא-אפאראט פֿאבריצירער',
@@ -2985,7 +3043,9 @@ $1',
 'exif-scenecapturetype' => 'סצענע אויפנעם טיפ',
 'exif-gaincontrol' => 'סצענע קאנטראל',
 'exif-contrast' => 'קאנטראסט',
-'exif-devicesettingdescription' => 'זאך סעטינגס אראפמאלונג',
+'exif-saturation' => 'זעטיקונג',
+'exif-sharpness' => 'שארף',
+'exif-devicesettingdescription' => 'אפאראט שטעלונגען אראפמאלונג',
 'exif-gpslatituderef' => 'צפון אדער דרום גארטל־ליניע',
 'exif-gpslatitude' => 'גארטל־ליניע',
 'exif-gpslongituderef' => 'מזרח אדער מערב לענג',
@@ -3023,6 +3083,9 @@ $1',
 'exif-provinceorstatedest' => 'פראווינץ אדער שטאַט געוויזן',
 'exif-citydest' => 'געוויזענע שטָאט',
 'exif-objectname' => 'קורצער טיטל',
+'exif-specialinstructions' => 'באזונדערע אנווייזונגען',
+'exif-headline' => 'קעפל',
+'exif-credit' => 'קרעדיט/פארזארגער',
 'exif-source' => 'מקור',
 'exif-editstatus' => 'רעדאקציאנעלער סטאטוס פון בילד',
 'exif-urgency' => 'דרינגלעכקייט',
@@ -3102,6 +3165,8 @@ $1',
 
 'exif-focalplaneresolutionunit-2' => 'אינטשעס',
 
+'exif-sensingmethod-1' => 'אומדעפינירט',
+
 'exif-customrendered-0' => 'נארמאלער פראצעס',
 'exif-customrendered-1' => 'קאסטעם פראצעס',
 
@@ -3131,17 +3196,20 @@ $1',
 'exif-sharpness-2' => 'הארט',
 
 'exif-subjectdistancerange-0' => 'אומבאַוויסט',
+'exif-subjectdistancerange-1' => 'מאקרא',
+'exif-subjectdistancerange-2' => 'נאנטע ווייזונג',
+'exif-subjectdistancerange-3' => 'ווײַטע ווײַזונג',
 
 # Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
-'exif-gpslatitude-n' => 'צפ×\95×\9f ×\9c×¢×\98×\99×\98×\95×\93',
-'exif-gpslatitude-s' => '×\93ר×\95×\9d ×\9c×\90×\98×\99×\98×\95×\93',
+'exif-gpslatitude-n' => 'צפ×\95×\9f ×\91ר×\99×\99×\98',
+'exif-gpslatitude-s' => '×\93ר×\95×\9d ×\91ר×\99×\99×\98',
 
 # Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
 'exif-gpslongitude-e' => 'מזרח לענג',
 'exif-gpslongitude-w' => 'מערב לענג',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|ngמעטער|מעטער}} איבערן ים־שפיגלl',
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|מעטער|מעטער}} איבערן ים־שפיגלl',
 'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|מעטער|מעטער}} אונטערן ים־שפיגל',
 
 # Pseudotags used for GPSSpeedRef
@@ -3398,16 +3466,22 @@ $5
 
 # Special:Version
 'version' => 'ווערסיע',
+'version-extensions' => 'אינסטאלירטע פארברייטערונגען',
 'version-specialpages' => 'ספעציעלע בלעטער',
 'version-variables' => 'וואַריאַבלען',
 'version-skins' => 'באניצער־אייבערפלאכן',
 'version-other' => 'אנדער',
+'version-hooks' => 'Hook סטרוקטורן',
+'version-extension-functions' => 'פארברייטערן פונקציעס',
+'version-parser-extensiontags' => 'פארזער פארברייטערן טאַגן',
+'version-hook-name' => 'נאמען פון hook',
 'version-version' => '(ווערסיע $1)',
 'version-license' => 'ליצענץ',
 'version-poweredby-others' => 'אַנדערע',
 'version-software' => 'אינסטאַלירט ווייכוואַרג',
 'version-software-product' => 'פראדוקט',
 'version-software-version' => 'ווערסיע',
+'version-entrypoints-header-entrypoint' => 'אריינגאנג פונקט',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
@@ -3432,7 +3506,7 @@ $5
 * <span class="mw-specialpagecached">באַזונדערע בלעטער פֿון זאַפאַס (קענען זײַן פֿאַרעלטערט).</span>',
 'specialpages-group-maintenance' => 'אויפֿהאַלטונג באַריכטן',
 'specialpages-group-other' => 'אַנדערע ספעציעלע בלעטער',
-'specialpages-group-login' => '×\90רײַנ×\9c×\90×\92×\99ר×\9f / ×\90ײַנשרײַ×\91×\9f',
+'specialpages-group-login' => '×\90רײַנ×\9c×\90×\92×\99ר×\9f / ×©×\90ַפֿ×\9f ×§×\90× ×\98×¢',
 'specialpages-group-changes' => 'לעצטע ענדערונגען און לאג-ביכער',
 'specialpages-group-media' => 'מעדיע באַריכטן און ארויפֿלאדן',
 'specialpages-group-users' => 'באַניצערס און רעכטן',
@@ -3515,6 +3589,10 @@ $5
 'logentry-delete-event-legacy' => '$1 האט געענדערט די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
 'logentry-delete-revision-legacy' => '$1 האט געענדערט די זעבארקייט פון רעוויזיעס אויף בלאט $3',
 'logentry-suppress-delete' => '$1 האט אונטערדריקט בלאט $3',
+'logentry-suppress-event' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
+'logentry-suppress-revision' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
+'logentry-suppress-event-legacy' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
+'logentry-suppress-revision-legacy' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון רעוויזיעס אויף בלאט $3',
 'revdelete-content-hid' => 'אינהאלט פארהוילן',
 'revdelete-summary-hid' => 'רעדאקטירונג קאנספעקט פארהוילן',
 'revdelete-uname-hid' => 'באניצער־נאמען פארהוילן',
@@ -3548,6 +3626,8 @@ $5
 'feedback-error3' => 'טעות: קיין ענטפֿער פון API',
 'feedback-thanks' => 'ייש"כ! אײַער פֿידבעק איז געווארן ארויפגעלעגט צום בלאט "[$2 $1]".',
 'feedback-close' => 'ערליידיקט',
+'feedback-bugcheck' => 'געוואלדיק! אבער זייט בודק אז עס איז נישט איינער פון די [$1 באוואוסטע באגן].',
+'feedback-bugnew' => "כ'האב בודק געווען. רעפארטירט א נייעם באג.",
 
 # API errors
 'api-error-badaccess-groups' => 'איר האט נישט קיין רעכטן אַרויפֿלאָדן טעקעס אויף דער וויקי.',
@@ -3560,9 +3640,12 @@ $5
 'api-error-empty-file' => 'די טעקע וואָס איר האט אײַנגעגעבן איז ליידיג.',
 'api-error-emptypage' => 'שאפן נייע ליידיקע בלעטער איז נישט ערלויבט.',
 'api-error-fetchfileerror' => 'אינערלעכער גרײַז: עפעס איז קאַליע געווארן בײַם ברענגען די טעקע.',
+'api-error-fileexists-forbidden' => 'שוין פאראן א טעקע מיטן נאמען "$1" , און מען קען זי נישט אריבערשרייבן.',
+'api-error-fileexists-shared-forbidden' => 'שוין פאראן א טעקע מיטן נאמען "$1" אין דער געמיינזאמער טעקע רעפאזיטאריע, און מען קען זי נישט אריבערשרייבן.',
 'api-error-file-too-large' => 'די טעקע וואָס איר האט אײַנגעגעבן איז צו גרויס.',
 'api-error-filename-tooshort' => 'דער טעקע־נאָמען איז צו קורץ.',
 'api-error-filetype-banned' => 'דער טיפ טעקע איז געאַסרט.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|איז נישט קיין דערלויבטער טעקע־טיפ |זענען נישט קיין דערלויבטע טעקע־טיפן}}. {{PLURAL:$3|דערלויבטער טעקע־טיפ איז|דערלויבטע טעקע־טיפן זענען}} $2.',
 'api-error-filetype-missing' => 'די טעקע פֿעלט אַן ענדונג.',
 'api-error-hookaborted' => 'די מאדיפיצירונג איר האט פרובירט קען נישט ווערן דורכגעפירט צוליב א פארברייטערונג.',
 'api-error-http' => 'אינערלעכער גרײַז: נישט געקענט פֿאַרבינדן צום סערווירער.',
index 9fe1f99..87aa016 100644 (file)
@@ -1428,9 +1428,9 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iṣẹ́ yín fún yín.',
 Láti wò tàbí wá àwọn fáìlì àrùsókè tẹ́lẹ̀ ẹ lọ sí [[Special:FileList|àtòjọ àwọn fáìlì àrùsókè]], àwọn à(tùn)rùsókè náà jẹ́ kíkọọ́lẹ̀ nínú [[Special:Log/upload|àkọọ́lẹ̀ ìrùsókè]], àwọn ìparẹ́ nínú [[Special:Log/delete|àkọọ́lẹ̀ ìparẹ́]].
 
 Láti fí fáìlì pọ̀mọ́ sínú ojúewé kan, ẹ lo àjápọ̀ bíi ìkan nínù àwọn ti ìsàlẹ̀ yìí:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fáìlì.jpg]]</nowiki></tt>''' láti lo àtẹ̀jáde kíkún fáiø ọ̀hún
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fáìlì.png|200px|thumb|left|ìkọ̀rọ̀]]</nowiki></tt>''' láti lo ìgbéhàn fífẹ̀ tó 200 pixel nínú àpótí ní apá ọwọ́ òsì pẹ̀lú 'ìkọ̀rọ̀' bíi ìjúwe
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fáìlì.ogg]]</nowiki></tt>''' láti ṣèjápọ̀ tààrà sí fáìlì náà láì sàgbéhàn fáìlì ọ̀hún",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fáìlì.jpg]]</nowiki></code>''' láti lo àtẹ̀jáde kíkún fáiø ọ̀hún
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fáìlì.png|200px|thumb|left|ìkọ̀rọ̀]]</nowiki></code>''' láti lo ìgbéhàn fífẹ̀ tó 200 pixel nínú àpótí ní apá ọwọ́ òsì pẹ̀lú 'ìkọ̀rọ̀' bíi ìjúwe
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fáìlì.ogg]]</nowiki></code>''' láti ṣèjápọ̀ tààrà sí fáìlì náà láì sàgbéhàn fáìlì ọ̀hún",
 'upload-permitted' => 'Àwọn irú fáìlì yíyọ̀nda: $1',
 'upload-preferred' => 'Àwọn irú fáìlì fífẹ́ràn: $1',
 'upload-prohibited' => 'Àwọn irú fáìlì dídènà: $1',
@@ -1477,21 +1477,21 @@ fáìlì yìí jẹ́ $2.',
 Ó ṣe é ṣe pé ẹ si orúkọ rẹ̀ kọ.
 Ẹ jọ̀wọ́ ẹ yẹ fáìlì náà wò bóyá òhun lẹ fẹ́ rùsókè.',
 'windows-nonascii-filename' => 'Wiki yìí kò ní àtìlẹ́yìn fún àwọn orúkọ fáìlì pẹ̀lú àwọn àmììkọ̀rọ̀ àkànṣe.',
-'fileexists' => "Fáìlì kan tilẹ̀ wà pẹ̀lú orúkọ yìí, ẹ jọ̀wọ́ ẹ yẹ '''<tt>[[:$1]]</tt>''' wò tí kò bá dá yín lójú pé ẹ fẹ́ yipadà.
-[[$1|thumb]]",
-'filepageexists' => "Ojúewé ìjúwe fún fáìlì yìí tilẹ̀ ti wà ní '''<tt>[[:$1]]</tt>''', sùgbọ́n fáìlì kankan kò sí pẹ̀lú orúkọ yìí rárá. 
+'fileexists' => 'Fáìlì kan tilẹ̀ wà pẹ̀lú orúkọ yìí, ẹ jọ̀wọ́ ẹ yẹ <strong>[[:$1]]</strong> wò tí kò bá dá yín lójú pé ẹ fẹ́ yipadà.
+[[$1|thumb]]',
+'filepageexists' => 'Ojúewé ìjúwe fún fáìlì yìí tilẹ̀ ti wà ní <strong>[[:$1]]</strong>, sùgbọ́n fáìlì kankan kò sí pẹ̀lú orúkọ yìí rárá. 
 Àkótán tí ẹ kọ kò ní hàn lórí ojúewé ìjúwe náà.
 Tí ẹ bá fẹ́ kí àkótán yín ó hàn níbẹ̀, ẹ gbọ́dọ̀ kọ ọ́ síbẹ̀ fún raara yín.
-[[$1|thumb]]",
-'fileexists-extension' => "Fáìlì kan wà pẹ̀lú orúkọ tó jọra: [[$2|thumb]]
-* Orúkọ fáìlì ìrùsókè: '''<tt>[[:$1]]</tt>'''
-* Orúkọ fáìlì tó wà: '''<tt>[[:$2]]</tt>'''
-Ẹ jọ̀wọ́ ẹ mú orúkọ tó yàtọ̀.",
+[[$1|thumb]]',
+'fileexists-extension' => 'Fáìlì kan wà pẹ̀lú orúkọ tó jọra: [[$2|thumb]]
+* Orúkọ fáìlì ìrùsókè: <strong>[[:$1]]</strong>
+* Orúkọ fáìlì tó wà: <strong>[[:$2]]</strong>
+Ẹ jọ̀wọ́ ẹ mú orúkọ tó yàtọ̀.',
 'fileexists-thumbnail-yes' => "Fáìlì náà dàbí pé ó jẹ́ àwòrán ìtóbi onírẹ̀sílẹ̀ ''(thumbnail)''.
 [[$1|thumb]]
-Ẹ jọ̀wọ́ ẹ yẹ fáìlì '''<tt>[[:$1]]</tt>''' wò.
+Ẹ jọ̀wọ́ ẹ yẹ fáìlì <strong>[[:$1]]</strong> wò.
 Tí fáìlì náà bá jẹ́ àwòrán kannáà kò pọndandan láti ṣe ìrùsókè thumbnail míràn.",
-'file-thumbnail-no' => "Orúkọ fáìlì náà bẹ̀rẹ̀ pẹ̀lú '''<tt>$1</tt>'''.
+'file-thumbnail-no' => "Orúkọ fáìlì náà bẹ̀rẹ̀ pẹ̀lú <strong>$1</strong>.
 Ó dàbí pé ó jẹ́ àwòrán ìtóbi onírẹ̀sílẹ̀ ''(thumbnail)''.
 Tí ẹ bá ní àwòrán yìí ní ìgbéhàn kúnkún ẹ ṣe ìrùsókè èyí, bíbẹ́ẹ̀kọ́ ẹ jọ̀wọ́ ẹ yí orúkọ fáìlì náà padà sí òmíràn.",
 'fileexists-forbidden' => 'Fáìlì kan wà tó ní orúkọ yìí, bẹ́ẹ̀sìni kò ṣe é kọ lélórí.
@@ -1724,7 +1724,7 @@ Tó bá jẹ́ jíjọ̀ gẹ́gẹ́bí oníṣe, àwọn fáìlì tí oníṣe
 # MIME search
 'mimesearch' => 'àwáàrí pẹ́lú MIME',
 'mimesearch-summary' => 'Ojúewé yìí únṣe ìgbàláàyè ajọ̀ àwọn fáìlì fún irú MIME wọn.
-Ìtìbọnú: contenttype/subtype, f.a. <tt>image/jpeg</tt>.',
+Ìtìbọnú: contenttype/subtype, f.a. <code>image/jpeg</code>.',
 'mimetype' => 'irú MIME:',
 'download' => 'ìrùsílẹ̀',
 
@@ -2619,15 +2619,10 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
 # Info page
 'pageinfo-title' => 'Àròyé fún "$1"',
 'pageinfo-header-edits' => 'Àwọn àtúnṣe',
-'pageinfo-header-watchlist' => 'Ìmójútó',
-'pageinfo-header-views' => 'Àwọn ìwò',
-'pageinfo-subjectpage' => 'Ojúewé',
-'pageinfo-talkpage' => 'Ojúewé ọ̀rọ̀',
+'pageinfo-views' => 'Iye àwọn ìwò',
 'pageinfo-watchers' => 'Iye àwọn aláàbójúwò',
 'pageinfo-edits' => 'Iye àwọn àtúnṣe',
 'pageinfo-authors' => 'Iye àwọn olùdá ọ̀tọ̀ọ̀tọ̀',
-'pageinfo-views' => 'Iye àwọn ìwò',
-'pageinfo-viewsperedit' => 'Iye ìwò fún àtúnṣe kọ̀ọ̀kan',
 
 # Patrolling
 'markaspatrolleddiff' => 'Ìṣààmí sí bíi sísọ́',
index ea1a0a6..fe79a49 100644 (file)
@@ -272,7 +272,6 @@ $messages = array(
 'tog-watchlisthideliu' => '響監視清單度隱藏登入用戶',
 'tog-watchlisthideanons' => '響監視清單度隱藏匿名用戶',
 'tog-watchlisthidepatrolled' => '響監視清單度隱藏巡查過嘅編輯',
-'tog-nolangconversion' => '唔要用字轉換',
 'tog-ccmeonemails' => '當我寄電郵畀其他人嗰陣寄返封副本畀我',
 'tog-diffonly' => '響差異下面唔顯示頁面內容',
 'tog-showhiddencats' => '顯示隱藏類',
@@ -1504,9 +1503,9 @@ $1",
 要睇或者搵嘢之前上載嘅圖像請去[[Special:FileList|已上載檔案一覽]],(再)上載嘅動作會喺[[Special:Log/upload|上載日誌]]裏面記錄落嚟,而刪除嘅動作會喺[[Special:Log/delete|刪除日誌]]裏面記錄落嚟。
 
 如果要喺頁面度引入呢張圖像,可以使用以下其中一種方式嘅連結:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:file.jpg<nowiki>]]</nowiki></tt>'''去用檔案嘅完整版
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}:file.png|200px|thumb|left|替代文字<nowiki>]]</nowiki></tt>'''去用200像素比例闊,靠左邊加盒,響描述度加'替代文字'
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}:file.ogg<nowiki>]]</nowiki></tt>''' 直接連結到檔案而唔顯示個檔案。",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:file.jpg<nowiki>]]</nowiki></code>'''去用檔案嘅完整版
+* '''<code><nowiki>[[</nowiki>{{ns:file}}:file.png|200px|thumb|left|替代文字<nowiki>]]</nowiki></code>'''去用200像素比例闊,靠左邊加盒,響描述度加'替代文字'
+* '''<code><nowiki>[[</nowiki>{{ns:media}}:file.ogg<nowiki>]]</nowiki></code>''' 直接連結到檔案而唔顯示個檔案。",
 'upload-permitted' => '准許嘅檔案類型: $1。',
 'upload-preferred' => '建議嘅檔案類型: $1。',
 'upload-prohibited' => '禁止嘅檔案類型: $1。',
@@ -1548,17 +1547,17 @@ $1",
 'large-file' => '建議檔案嘅大細唔好大過$1 bytes,呢個檔案有$2 bytes',
 'largefileserver' => '呢個檔案超過咗伺服器設定允許嘅大細。',
 'emptyfile' => '你上載嘅檔案似乎係空嘅。噉樣可能係因為你打錯咗個檔名。請檢查吓你係唔係真係要上載呢個檔案。',
-'fileexists' => "呢個檔名已經存在,如果你唔肯定係唔係要更改'''<tt>[[:$1]]</tt>''',請先檢查佢。 [[$1|thumb]]",
-'filepageexists' => "呢個檔嘅描述頁已經響'''<tt>[[:$1]]</tt>'''開咗,但係呢個名嘅檔案重未存在。你輸入咗嘅摘要係唔會顯示響個描述頁度。要令到個摘要響嗰度出現,你就要手動噉去改佢。
-[[$1|thumb]]",
-'fileexists-extension' => "一個相似檔名嘅檔案已經存在: [[$2|thumb]]
-* 上載檔案嘅檔名: '''<tt>[[:$1]]</tt>'''
-* 現有檔案嘅檔名: '''<tt>[[:$2]]</tt>'''
-請揀一個唔同嘅名。",
+'fileexists' => '呢個檔名已經存在,如果你唔肯定係唔係要更改<strong>[[:$1]]</strong>,請先檢查佢。 [[$1|thumb]]',
+'filepageexists' => '呢個檔嘅描述頁已經響<strong>[[:$1]]</strong>開咗,但係呢個名嘅檔案重未存在。你輸入咗嘅摘要係唔會顯示響個描述頁度。要令到個摘要響嗰度出現,你就要手動噉去改佢。
+[[$1|thumb]]',
+'fileexists-extension' => '一個相似檔名嘅檔案已經存在: [[$2|thumb]]
+* 上載檔案嘅檔名: <strong>[[:$1]]</strong>
+* 現有檔案嘅檔名: <strong>[[:$2]]</strong>
+請揀一個唔同嘅名。',
 'fileexists-thumbnail-yes' => "呢個檔案好似係一幅圖像縮細咗嘅版本''(縮圖)''。 [[$1|thumb]]
-請檢查清楚個檔案'''<tt>[[:$1]]</tt>'''
+請檢查清楚個檔案<strong>[[:$1]]</strong>
 如果檢查咗嘅檔案係同原本幅圖個大細係一樣嘅話,就唔使再上載多一幅縮圖。",
-'file-thumbnail-no' => "個檔名係以'''<tt>$1</tt>'''開始。佢好似係一幅圖像嘅縮細版本''(縮圖)''。
+'file-thumbnail-no' => "個檔名係以<strong>$1</strong>開始。佢好似係一幅圖像嘅縮細版本''(縮圖)''。
 如果你有呢幅圖像嘅完整大細,唔係嘅話請再改過個檔名。",
 'fileexists-forbidden' => '呢個檔案嘅名已經存在,唔可以覆蓋;麻煩返轉去用第二個名嚟上載呢個檔案。[[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => '共享檔案庫入面已經有一個同名嘅檔案。
@@ -1750,7 +1749,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'MIME 搜尋',
-'mimesearch-summary' => '呢一版可以過濾有關檔案嘅MIME類型。輸入方法:contenttype/subtype,例如 <tt>image/jpeg</tt>。',
+'mimesearch-summary' => '呢一版可以過濾有關檔案嘅MIME類型。輸入方法:contenttype/subtype,例如 <code>image/jpeg</code>。',
 'mimetype' => 'MIME 類型:',
 'download' => '下載',
 
@@ -1936,7 +1935,7 @@ Template:搞清楚',
 'linksearch-ns' => '空間名',
 'linksearch-ok' => '搵',
 'linksearch-text' => '可以用類似"*.wikipedia.org"嘅萬用字元。<br />
-支援嘅協議: <tt>$1</tt>',
+支援嘅協議: <code>$1</code>',
 'linksearch-line' => '$1 連自 $2',
 'linksearch-error' => '萬用字元只可以響主機名嘅開頭度用。',
 
index dff95dc..b067087 100644 (file)
@@ -211,40 +211,48 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#重定向', '#REDIRECT' ),
-       'notoc'                   => array( '0', '_无目录_', '__NOTOC__' ),
-       'nogallery'               => array( '0', '_无图库_', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '_强显目录_', '__FORCETOC__' ),
-       'toc'                     => array( '0', '_目录_', '__TOC__' ),
-       'noeditsection'           => array( '0', '_无段落编辑_', '__NOEDITSECTION__' ),
-       'currentmonth'            => array( '1', '本月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'           => array( '1', '本月1', 'CURRENTMONTH1' ),
-       'currentmonthname'        => array( '1', '本月名称', 'CURRENTMONTHNAME' ),
-       'currentmonthabbrev'      => array( '1', '本月简称', 'CURRENTMONTHABBREV' ),
-       'currentday'              => array( '1', '今天', 'CURRENTDAY' ),
-       'currentday2'             => array( '1', '今天2', 'CURRENTDAY2' ),
-       'currentyear'             => array( '1', '今年', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', '此时', '当前时间', 'CURRENTTIME' ),
-       'numberofpages'           => array( '1', '页数', 'NUMBEROFPAGES' ),
-       'numberofarticles'        => array( '1', '条目数', 'NUMBEROFARTICLES' ),
-       'numberoffiles'           => array( '1', '文件数', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', '用户数', 'NUMBEROFUSERS' ),
-       'numberofactiveusers'     => array( '1', '活跃用户数', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', '编辑数', 'NUMBEROFEDITS' ),
-       'numberofviews'           => array( '1', '访问数', 'NUMBEROFVIEWS' ),
-       'pagename'                => array( '1', '页名', 'PAGENAME' ),
-       'fullpagename'            => array( '1', '全页名', 'FULLPAGENAME' ),
-       'newsectionlink'          => array( '1', '_新段落链接_', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'        => array( '1', '_无新段落链接_', '__NONEWSECTIONLINK__' ),
-       'language'                => array( '0', '#语言:', '#LANGUAGE:' ),
-       'pagesize'                => array( '1', '页面大小', 'PAGESIZE' ),
+       'redirect'                  => array( '0', '#重定向', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__无目录__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__无图库__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__强显目录__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__目录__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__无段落编辑__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', '本月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', '本月1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', '本月名称', 'CURRENTMONTHNAME' ),
+       'currentmonthabbrev'        => array( '1', '本月简称', 'CURRENTMONTHABBREV' ),
+       'currentday'                => array( '1', '今天', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', '今天2', 'CURRENTDAY2' ),
+       'currentyear'               => array( '1', '今年', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', '此时', '当前时间', 'CURRENTTIME' ),
+       'numberofpages'             => array( '1', '页面数', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', '条目数', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', '文件数', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', '用户数', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', '活跃用户数', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', '编辑数', 'NUMBEROFEDITS' ),
+       'numberofviews'             => array( '1', '访问数', 'NUMBEROFVIEWS' ),
+       'pagename'                  => array( '1', '页面名', 'PAGENAME' ),
+       'fullpagename'              => array( '1', '完整页面名', 'FULLPAGENAME' ),
+       'img_thumbnail'             => array( '1', '缩略图', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', '缩略图=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', '右', 'right' ),
+       'img_left'                  => array( '1', '左', 'left' ),
+       'img_none'                  => array( '1', '无', 'none' ),
+       'img_width'                 => array( '1', '$1像素', '$1px' ),
+       'img_center'                => array( '1', '居中', 'center', 'centre' ),
+       'img_page'                  => array( '1', '页数=$1', '$1页', 'page=$1', 'page $1' ),
+       'img_link'                  => array( '1', '链接=$1', 'link=$1' ),
+       'img_alt'                   => array( '1', '替代文本=$1', 'alt=$1' ),
+       'newsectionlink'            => array( '1', '__新段落链接__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__无新段落链接__', '__NONEWSECTIONLINK__' ),
+       'language'                  => array( '0', '#语言:', '#LANGUAGE:' ),
+       'tag'                       => array( '0', '标记', 'tag' ),
+       'pagesize'                  => array( '1', '页面大小', 'PAGESIZE' ),
 );
 
 $linkTrail = '/^()(.*)$/sD';
 
-$extraUserToggles = array(
-       'nolangconversion',
-);
 $datePreferences = array(
        'default',
        'ISO 8601',
@@ -277,7 +285,7 @@ $messages = array(
 'tog-hidepatrolled' => '在最近更改中隐藏已巡查编辑',
 'tog-newpageshidepatrolled' => '在新页面列表中隐藏已巡查页面',
 'tog-extendwatchlist' => '扩大监视列表以显示所有更改而不仅是最近更改',
-'tog-usenewrc' => '启用增强最近更改(需要JavaScript)',
+'tog-usenewrc' => '根据页面分组最近更改和监视列表(需要JavaScript)',
 'tog-numberheadings' => '标题自动编号',
 'tog-showtoolbar' => '显示编辑工具条(需要JavaScript)',
 'tog-editondblclick' => '双击时编辑页面(需要JavaScript)',
@@ -285,17 +293,17 @@ $messages = array(
 'tog-editsectiononrightclick' => '启用右击段落标题编辑段落(需要JavaScript)',
 'tog-showtoc' => '显示目录(对于有多于3个标题的页面)',
 'tog-rememberpassword' => '在浏览器上记住我的登录状态(最长$1天)',
-'tog-watchcreations' => '添加我创建的页面至我的监视列表',
-'tog-watchdefault' => '添加我编辑的页面至我的监视列表',
-'tog-watchmoves' => '添加我移动的页面至我的监视列表',
-'tog-watchdeletion' => '添加我删除的页面至我的监视列表',
+'tog-watchcreations' => '添加我创建的页面和上传的文件至我的监视列表',
+'tog-watchdefault' => '添加我编辑的页面和文件至我的监视列表',
+'tog-watchmoves' => '将我移动的页面和文件添加到我的监视列表',
+'tog-watchdeletion' => '添加我删除的页面和文件至我的监视列表',
 'tog-minordefault' => '默认标记编辑为小编辑',
 'tog-previewontop' => '在编辑框上方显示预览',
 'tog-previewonfirst' => '首次编辑时显示预览',
 'tog-nocache' => '停用浏览器页面缓存',
-'tog-enotifwatchlistpages' => '当我的监视列表中的页面更改时发送电子邮件通知我',
+'tog-enotifwatchlistpages' => 'å½\93æ\88\91ç\9a\84ç\9b\91è§\86å\88\97表中ç\9a\84页é\9d¢æ\88\96æ\96\87件æ\9b´æ\94¹æ\97¶å\8f\91é\80\81ç\94µå­\90é\82®ä»¶é\80\9aç\9f¥æ\88\91',
 'tog-enotifusertalkpages' => '当我的讨论页更改时发送电子邮件通知我',
-'tog-enotifminoredits' => '当页面有小编辑时发送电子邮件通知我',
+'tog-enotifminoredits' => '当页面和文件有小编辑时发送电子邮件通知我',
 'tog-enotifrevealaddr' => '在通知电子邮件中显示我的电子邮件地址',
 'tog-shownumberswatching' => '显示监视用户数',
 'tog-oldsig' => '当前签名:',
@@ -311,7 +319,6 @@ $messages = array(
 'tog-watchlisthideliu' => '在监视列表中隐藏登录用户',
 'tog-watchlisthideanons' => '在监视列表中隐藏匿名用户',
 'tog-watchlisthidepatrolled' => '在监视列表中隐藏已巡查的编辑',
-'tog-nolangconversion' => '停用字词转换',
 'tog-ccmeonemails' => '把我给其他用户发送的电子邮件的副本发送给我',
 'tog-diffonly' => '比较差异时不显示页面内容',
 'tog-showhiddencats' => '显示隐藏分类',
@@ -528,14 +535,19 @@ $1',
 'badaccess-groups' => '您刚才请求的操作只有{{PLURAL:$2|这个用户组|以下用户组}}中的用户才能使用: $1',
 
 'versionrequired' => '需要版本为$1的MediaWiki',
-'versionrequiredtext' => '需要版本为$1的MediaWiki才能使用本页。请见[[Special:Version|版本页面]]。',
+'versionrequiredtext' => '需要版本为$1的MediaWiki才能使用本页。
+请见[[Special:Version|版本页面]]。',
 
 'ok' => '确定',
 'retrievedfrom' => '来自“$1”',
 'youhavenewmessages' => '你有$1($2)。',
 'newmessageslink' => '新信息',
 'newmessagesdifflink' => '最后更改',
-'youhavenewmessagesmulti' => '您在$1有一条新信息',
+'youhavenewmessagesfromusers' => '你有来自{{PLURAL:$3| 另一位用户| $3位用户}}的$1($2)。',
+'youhavenewmessagesmanyusers' => '你有来自多位用户的$1($2)。',
+'newmessageslinkplural' => '{{PLURAL:$1|一条新信息|$1条信息}}',
+'newmessagesdifflinkplural' => '最新$1次更改',
+'youhavenewmessagesmulti' => '你在$1有新信息',
 'editsection' => '编辑',
 'editold' => '编辑',
 'viewsourceold' => '查看源代码',
@@ -621,6 +633,7 @@ $1',
 'cannotdelete' => '无法删除页面或图像 "$1"。
 它可能已被其他人删除了。',
 'cannotdelete-title' => '无法删除“$1”',
+'delete-hook-aborted' => '删除被扩展钩子取消。钩子并没有给出解释。',
 'badtitle' => '错误的标题',
 'badtitletext' => '所请求页面的标题是无效的、不存在,跨语言或跨wiki链接的标题错误。它可能包含一个或更多的不能用于标题的字符。',
 'perfcached' => '下列数据已缓存,但可能已过时。最高{{PLURAL:$1|一个结果|$1个结果}}在缓存中可用。',
@@ -646,11 +659,13 @@ $2',
 'customjsprotected' => '您没有权限编辑此JavaScript页面,因为它包含另一位用户的个人设置。',
 'ns-specialprotected' => '您不能编辑特殊页面。',
 'titleprotected' => '此标题已被[[User:$1|$1]]保护以防止创建。理由是“$2”。',
-'filereadonlyerror' => '无法修改文件“$1”,因为文件库“$2”处于只读模式。 
+'filereadonlyerror' => '因为媒体库$2处于只读模式而无法修改文件$1。
 
-管理员对锁定它给出的解释是:“$3”。',
+执行锁定的管理员给出如下解释:$3。',
 'invalidtitle-knownnamespace' => '使用名字空间“$2”和文本“$3”的无效标题',
 'invalidtitle-unknownnamespace' => '使用未知名字空间编号$1和文本“$2”的无效标题',
+'exception-nologin' => '未登陆',
+'exception-nologin-text' => '此动作需要先登陆到此 wiki',
 
 # Virus scanner
 'virus-badscanner' => "错误的配置:未知的病毒扫描程序:''$1''",
@@ -662,13 +677,14 @@ $2',
 
 您可以继续以匿名方式使用{{SITENAME}},或再次以相同或不同用户身份[[Special:UserLogin|登录]]。请注意一些页面可能仍然显示您为登录状态,直到您清空您的浏览器缓存为止。",
 'welcomecreation' => '== 欢迎,$1! ==
-您的账户已经建立。别忘了设置您的[[Special:Preferences|{{SITENAME}}个人参数]]。',
+你的账户已创建。请别忘记更改你的[[Special:Preferences|{{SITENAME}}系统设置]]。',
 'yourname' => '用户名:',
 'yourpassword' => '密码:',
 'yourpasswordagain' => '再次输入密码:',
 'remembermypassword' => '在此浏览器上保留我的登录信息(最长$1{{PLURAL:$1|日|日}})',
 'securelogin-stick-https' => '登陆后继续使用 HTTPS 连接',
 'yourdomainname' => '您的域名:',
+'password-change-forbidden' => '您不能更改此wiki上的密码。',
 'externaldberror' => '这可能是由于验证数据库错误或您被禁止更新您的外部账号。',
 'login' => '登录',
 'nav-login-createaccount' => '登录/创建账户',
@@ -836,7 +852,7 @@ $2
 'anoneditwarning' => "'''警告:'''您没有登录。
 您的IP地址将记录在此页的编辑历史中。",
 'anonpreviewwarning' => "''您没有登录。保存页面将会把您的IP地址记录在此页的编辑历史中。''",
-'missingsummary' => "'''提示:''' 您没有提供一个编辑摘要。如果您再次单击“{{int:savearticle}}”,您的编辑将不带编辑摘要保存。",
+'missingsummary' => "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
 'missingcommenttext' => '请在下面输入评论。',
 'missingcommentheader' => "'''提示:''' 您没有为此评论提供一个标题。如果您再次单击“{{int:savearticle}}”,您的编辑将不带标题保存。",
 'summary-preview' => '摘要预览:',
@@ -879,16 +895,20 @@ $2
 'noarticletext' => '本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索该页标题]]、<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑本页面]。</span>',
 'noarticletext-nopermission' => '此页目前没有内容,您可以在其它页[[Special:Search/{{PAGENAME}}|搜索此页标题]],
 或<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索有关日志]</span>。',
+'missing-revision' => '“{{PAGENAME}}”的修订#$1不存在。
+
+这通常是因为进入了一个已被删除的页面的历史链接。
+详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。',
 'userpage-userdoesnotexist' => '用户账户"$1"未注册。
 请在创建/编辑该页之前进行核对。',
 'userpage-userdoesnotexist-view' => '用户账户“$1”未曾创建。',
 'blocked-notice-logextract' => '这位用户目前已被封禁。以下提供最近的封禁日志以供参考:',
-'clearyourcache' => "'''注意:在保存以后,您必须绕过浏览器缓存才能看到所作出的改变。'''
-* '''火狐(Firefox)/Safari''':按住“Shift”键再点击“刷新”,或按下“Ctrl-F5”或“Ctrl-R”(Mac上为“⌘-R”)
-* '''谷歌浏览器(Google Chrome)''':按下“Ctrl-Shift-R”(Mac上为“⌘-Shift-R”)
-* '''Internet Explorer''':按住“Ctrl”键再点击“刷新”,或按下“Ctrl-F5”
-* '''Konqueror''':点击“刷新”或按下“F5”
-* '''Opera''':在“工具→首选项”中清除缓存",
+'clearyourcache' => "'''注意:'''保存之后,你必须清除浏览器缓存才能看到做出的更改。
+* '''火狐(Firefox)/Safari:'''按住“Shift”,同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)
+* '''谷歌浏览器(Google Chrome):'''按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)
+* '''Internet Explorer:'''按住“Ctrl”,同时单击“刷新”,或按“Ctrl-F5”
+* '''Konqueror:'''点击“刷新”或按“F5”
+* '''Opera:'''在“工具→首选项”中清除缓存",
 'usercssyoucanpreview' => "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
 'userjsyoucanpreview' => "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
 'usercsspreview' => "'''记住您只是在预览您的个人 CSS。'''
@@ -946,8 +966,8 @@ $2
 
 锁定数据库的管理员有如下解释:$1",
 'protectedpagewarning' => "'''警告:本页面已被保护,只有拥有管理员权限的用户可以编辑。'''下面提供最后的日志条目以供参考:",
-'semiprotectedpagewarning' => "'''注意:''' 本页面已被保护,只有注册用户可以编辑。下面提供最后的日志条目以供参考:",
-'cascadeprotectedwarning' => "'''è­¦å\91\8aï¼\9a'''æ\9c¬é¡µé\9d¢å·²è¢«ä¿\9dæ\8a¤ï¼\8cå\8fªæ\9c\89æ\8b¥æ\9c\89管ç\90\86å\91\98æ\9d\83é\99\90ç\9a\84ç\94¨æ\88·å\8f¯ä»¥ç¼\96è¾\91ï¼\8cå\9b ä¸ºå\85¶å\8c\85å\90«äº\8eä¸\8bå\88\97受连锁保护的{{PLURAL:$1|页面}}:",
+'semiprotectedpagewarning' => "'''注意:'''本页面已被保护,只有注册用户可以编辑。下面提供最后的日志条目以供参考:",
+'cascadeprotectedwarning' => "'''è­¦å\91\8aï¼\9a'''æ\9c¬é¡µé\9d¢å·²è¢«ä¿\9dæ\8a¤ï¼\8cå\8fªæ\9c\89æ\8b¥æ\9c\89管ç\90\86å\91\98æ\9d\83é\99\90ç\9a\84ç\94¨æ\88·å\8f¯ä»¥ç¼\96è¾\91ï¼\8cå\9b ä¸ºå\85¶å\8c\85å\90«äº\8e以ä¸\8b受连锁保护的{{PLURAL:$1|页面}}:",
 'titleprotectedwarning' => "'''警告:本页面已被保护,创建本页面需要[[Special:ListGroupRights|特定权限]]。'''下面提供最后的日志条目以供参考:",
 'templatesused' => '该页面使用的{{PLURAL:$1|模板}}:',
 'templatesusedpreview' => '本预览使用的{{PLURAL:$1|模板}}:',
@@ -955,14 +975,14 @@ $2
 'template-protected' => '(保护)',
 'template-semiprotected' => '(半保护)',
 'hiddencategories' => '本页面属于$1个隐藏分类:',
-'edittools' => '<!-- 这里的文字将显示在编辑和上传表单下方。 -->',
+'edittools' => '<!-- 这里的文字将显示在编辑和上传表格下面。 -->',
 'nocreatetitle' => '创建页面受限',
 'nocreatetext' => '{{SITENAME}}限制了创建新页面的功能。你可以返回并编辑已有的页面,或者[[Special:UserLogin|登录或创建新账户]]。',
 'nocreate-loggedin' => '你没有权限创建新页面。',
 'sectioneditnotsupported-title' => '段落编辑不支持',
 'sectioneditnotsupported-text' => '本页面不支持段落编辑。',
 'permissionserrors' => '权限错误',
-'permissionserrorstext' => '根据下列{{PLURAL:$1|原因}},你没有权限进行本操作:',
+'permissionserrorstext' => '因为以下{{PLURAL:$1|原因}},你没有权限进行该操作:',
 'permissionserrorstext-withaction' => '因为以下{{PLURAL:$1|原因}},你没有权限$2:',
 'recreate-moveddeleted-warn' => "'''警告:你正在重新创建曾经被删除的页面。'''
 
@@ -999,6 +1019,7 @@ $2
 'expansion-depth-exceeded-warning' => '页面超过了扩展深度',
 'parser-unstrip-loop-warning' => '检测到回圈',
 'parser-unstrip-recursion-limit' => '递归超过限制 ($1)',
+'converter-manual-rule-error' => '手动语言转换规则中检测到错误',
 
 # "Undo" feature
 'undo-success' => '此编辑可以被撤销。请检查以下比较以核实这正是您想做的,然后保存以下更改完成撤销编辑。',
@@ -1044,14 +1065,14 @@ $3的理由是''$2''",
 尝试[[Special:Search|搜索本站]]获得相关的新建页面。',
 
 # Revision deletion
-'rev-deleted-comment' => '(编辑摘要删除)',
-'rev-deleted-user' => '(用户名删除)',
-'rev-deleted-event' => '(日志条目删除)',
-'rev-deleted-user-contribs' => '[用户名或IP地址已移除 - 从贡献中隐藏编辑]',
+'rev-deleted-comment' => '(编辑摘要删除)',
+'rev-deleted-user' => '(用户名删除)',
+'rev-deleted-event' => '(日志条目删除)',
+'rev-deleted-user-contribs' => '[用户名或IP地址被删除 - 编辑在贡献中隐藏]',
 'rev-deleted-text-permission' => "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]。",
 'rev-deleted-text-unhide' => "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。如果你想继续操作,你仍然可以[$1 查看本版本]。",
 'rev-suppressed-text-unhide' => "该页面修订已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
-'rev-deleted-text-view' => "该页面修订已经被'''删除'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到详细的信息。",
+'rev-deleted-text-view' => "本页面版本已被'''删除'''。你可以查看它,详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
 'rev-suppressed-text-view' => "该页面修订已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
 'rev-deleted-no-diff' => "因为其中一次修订已被'''删除''',您不可以查看这个差异。
 在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。",
@@ -1153,7 +1174,7 @@ $1",
 'mergelog' => '合并日志',
 'pagemerge-logentry' => '合并[[$1]]至[[$2]](版本截至$3)',
 'revertmerge' => '解除合并',
-'mergelogpagetext' => '以ä¸\8bæ\98¯ä¸\80个æ\9c\80è¿\91ç\94±ä¸\80个页é\9d¢ç\9a\84修订å\8e\86å\8f²å\90\88并å\88°å\8f¦ä¸\80个页é\9d¢的列表。',
+'mergelogpagetext' => 'ä¸\8bé\9d¢æ\98¯æ\9c\80è¿\91ç\9a\84页é\9d¢å\8e\86å\8f²å\90\88并的列表。',
 
 # Diffs
 'history-title' => '“$1”的版本历史',
@@ -1166,6 +1187,10 @@ $1",
 'editundo' => '撤销',
 'diff-multi' => '(未显示$2个用户的$1个中间版本)',
 'diff-multi-manyusers' => '(未显示超过$2个用户的$1个中间版本)',
+'difference-missing-revision' => '此差异对比的{{PLURAL:$2|一个修订|$2个修订}}($1){{PLURAL:$2|没有}}找到。
+
+这通常是因为进入了一个已被删除的页面的修订差异对比链接。
+详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。',
 
 # Search results
 'searchresults' => '搜索结果',
@@ -1205,7 +1230,7 @@ $1",
 'search-redirect' => '(重定向自“$1”)',
 'search-section' => '(“$1”段落)',
 'search-suggest' => '您是不是要找:$1',
-'search-interwiki-caption' => 'å§\90妹项目',
+'search-interwiki-caption' => 'å§\8a妹项目',
 'search-interwiki-default' => '$1项结果:',
 'search-interwiki-more' => '(更多)',
 'search-mwsuggest-enabled' => '有建议',
@@ -1242,17 +1267,17 @@ $1",
 
 # Preferences page
 'preferences' => '系统设置',
-'mypreferences' => '设置',
+'mypreferences' => '我的设置',
 'prefs-edits' => '编辑数量:',
 'prefsnologin' => '尚未登录',
 'prefsnologintext' => '您必须先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登录]</span>才能设置个人参数。',
 'changepassword' => '更改密码',
 'prefs-skin' => '皮肤',
 'skin-preview' => '预览',
-'datedefault' => '默认',
-'prefs-beta' => 'æµ\8bè¯\95ç\89\88ç\89¹è\89²',
-'prefs-datetime' => '日期时间',
-'prefs-labs' => '实验室特',
+'datedefault' => '默认格式',
+'prefs-beta' => 'æµ\8bè¯\95ç\89¹æ\80§',
+'prefs-datetime' => '日期时间',
+'prefs-labs' => '实验室特',
 'prefs-user-pages' => '用户页面',
 'prefs-personal' => '用户资料',
 'prefs-rc' => '最近更改',
@@ -1277,7 +1302,7 @@ $1",
 'columns' => '列:',
 'searchresultshead' => '搜索',
 'resultsperpage' => '每页显示链接数:',
-'stub-threshold' => '<a href="#" class="stub">ç\9f­é¡µé\9d¢é\93¾æ\8e¥</a>æ ¼å¼\8fé\97¨æ§\9b值(字节):',
+'stub-threshold' => '<a href="#" class="stub">ç\9f­é¡µé\9d¢é\93¾æ\8e¥</a>æ ¼å¼\8fé\98\88值(字节):',
 'stub-threshold-disabled' => '已停用',
 'recentchangesdays' => '最近更改中显示的天数:',
 'recentchangesdays-max' => '最多$1天',
@@ -1291,7 +1316,7 @@ $1",
 'timezoneuseoffset' => '其它(指定时差)',
 'timezoneoffset' => '时差¹:',
 'servertime' => '服务器时间:',
-'guesstimezone' => 'ä»\8eæµ\8fè§\88å\99¨å¡«å\86\99',
+'guesstimezone' => '使ç\94¨æµ\8fè§\88å\99¨è®¾ç½®',
 'timezoneregion-africa' => '非洲',
 'timezoneregion-america' => '美洲',
 'timezoneregion-antarctica' => '南极洲',
@@ -1303,7 +1328,7 @@ $1",
 'timezoneregion-indian' => '印度洋',
 'timezoneregion-pacific' => '太平洋',
 'allowemail' => '接受来自其他用户的邮件',
-'prefs-searchoptions' => '搜索选项',
+'prefs-searchoptions' => '搜索',
 'prefs-namespaces' => '名字空间',
 'defaultns' => '否则在这些名字空间中搜索:',
 'default' => '默认',
@@ -1332,12 +1357,12 @@ $1",
 'gender-male' => '男',
 'gender-female' => '女',
 'prefs-help-gender' => '选填项目。使软件使用正确的性别称呼。该信息将会公开。',
-'email' => '电子邮',
+'email' => '电子邮',
 'prefs-help-realname' => '真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。',
 'prefs-help-email' => '电子邮件地址是选填项目。但是在你忘记密码需要重置密码时需要电子邮件地址。',
 'prefs-help-email-others' => '你亦可以选择让其他用户通过你的用户页或讨论页上的链接用电子邮件联系你。其他用户联系你时你的电子邮件地址不会显示。',
 'prefs-help-email-required' => '电子邮件地址是必填项目。',
-'prefs-info' => '基本资料',
+'prefs-info' => '基本信息',
 'prefs-i18n' => '界面语言',
 'prefs-signature' => '签名',
 'prefs-dateformat' => '日期格式',
@@ -1347,10 +1372,10 @@ $1",
 'prefs-advancedrendering' => '高级选项',
 'prefs-advancedsearchoptions' => '高级选项',
 'prefs-advancedwatchlist' => '高级选项',
-'prefs-displayrc' => '显示选项',
-'prefs-displaysearchoptions' => '显示选项',
-'prefs-displaywatchlist' => '显示选项',
-'prefs-diffs' => '差异',
+'prefs-displayrc' => '显示',
+'prefs-displaysearchoptions' => '显示',
+'prefs-displaywatchlist' => '显示',
+'prefs-diffs' => '差异对比',
 
 # User preference: e-mail validation using jQuery
 'email-address-validity-valid' => '电子邮件地址有效',
@@ -1423,10 +1448,11 @@ $1",
 'right-autoconfirmed' => '编辑半保护页面',
 'right-bot' => '被视为自动过程',
 'right-nominornewtalk' => '不使小编辑在讨论页面引发新信息提示',
-'right-apihighlimits' => '在API问题中使用更高的限制',
+'right-apihighlimits' => '在API查询中使用更高的限制',
 'right-writeapi' => '使用书写API',
 'right-delete' => '删除页面',
 'right-bigdelete' => '删除有大型历史的页面',
+'right-deletelogentry' => '删除和恢复特定的日志项目',
 'right-deleterevision' => '删除和恢复页面的特定版本',
 'right-deletedhistory' => '查看被删除的历史条目,无其相关文字',
 'right-deletedtext' => '查看被删除的版本间的被删除的文字和更改',
@@ -1466,7 +1492,7 @@ $1",
 # User rights log
 'rightslog' => '用户权限日志',
 'rightslogtext' => '这是用户权限更改的日志。',
-'rightslogentry' => '更改$1的用户组自$2至$3',
+'rightslogentry' => '将$1的用户组由$2更改为$3',
 'rightslogentry-autopromote' => '被自动提升自$2至$3',
 'rightsnone' => '(无)',
 
@@ -1516,7 +1542,7 @@ $1",
 'recentchanges-label-newpage' => '这次编辑建立了一个新页面',
 'recentchanges-label-minor' => '这是一个小编辑',
 'recentchanges-label-bot' => '这次编辑是由机器人进行',
-'recentchanges-label-unpatrolled' => 'è¿\99次ç¼\96è¾\91å°\9aæ\9cªå·¡æ\9f¥è¿\87',
+'recentchanges-label-unpatrolled' => '该ç¼\96è¾\91å°\9aæ\9cªå·¡æ\9f¥',
 'rcnote' => "下面是最后'''$2'''天的最后'''$1'''个更改,截至$4 $5。",
 'rcnotefrom' => "下面是自'''$2'''起的更改(最多显示'''$1'''个)。",
 'rclistfrom' => '显示自$1起的新更改',
@@ -1567,13 +1593,12 @@ $1",
 'upload-recreate-warning' => "'''警告:一个相同名字的文件曾经被删除或者移动至别处。'''
 
 这个页面的删除和移动日志在这里提供以便参考:",
-'uploadtext' => "使用下面的表单来上传文件。
-要查看或搜索以前上传的文件,可以进入[[Special:FileList|文件上传列表]],(重新)上传也将在[[Special:Log/upload|上传日志]]中记录,而删除将在[[Special:Log/delete|删除日志]]中记录。
+'uploadtext' => "请使用下面的表格上传文件。要查看或搜索以前上传的文件,可以进入[[Special:FileList|文件上传列表]],(重新)上传也将在[[Special:Log/upload|上传日志]]中记录,而删除将在[[Special:Log/delete|删除日志]]中记录。
 
-要在页面中加入文件,使用以下其中一种形式的链接:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''使用文件的完整版本
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替换文字]]</nowiki></tt>'''使用放置于左侧的一个框内的200像素宽的图片,同时使用“替换文字”作为描述
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''直接链接到文件而不显示文件",
+要在页面中加入文件,请使用一种以下形式的链接:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''使用文件的完整版本
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替换文字]]</nowiki></code>'''使用放置于左侧的一个框内的200像素宽的图片,同时使用“替换文字”作为描述
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''直接链接到文件而不显示文件",
 'upload-permitted' => '允许的文件类型:$1。',
 'upload-preferred' => '建议的文件类型:$1。',
 'upload-prohibited' => '禁止的文件类型:$1。',
@@ -1616,19 +1641,19 @@ $1",
 'largefileserver' => '这个文件的大小比服务器配置允许的大小还要大。',
 'emptyfile' => '您所上传的文件不存在。这可能是由于文件名键入错误。请检查您是否真的要上传此文件。',
 'windows-nonascii-filename' => '本wiki不支持在文件名中使用特殊字符。',
-'fileexists' => '已存在相同名称的文件,如果您无法确定您是否要改变它,请检查<strong><tt>[[:$1]]</tt></strong>。 [[$1|thumb]]',
-'filepageexists' => '这个文件的描述页已经于<strong><tt>[[:$1]]</tt></strong>创建,但是这个名称的文件尚不存在。
+'fileexists' => '已存在相同名称的文件,如果您无法确定您是否要改变它,请检查<strong><strong>[[:$1]]</strong></strong>。 [[$1|thumb]]',
+'filepageexists' => '这个文件的描述页已经于<strong><strong>[[:$1]]</strong></strong>创建,但是这个名称的文件尚不存在。
 您输入的摘要不会显示在该描述页中。
 要令该摘要在该处中出现,您需要手动地编辑该页。
 [[$1|thumb]]',
-'fileexists-extension' => "一个相似名称的文件已经存在: [[$2|thumb]]
-* 上传文件的文件名:'''<tt>[[:$1]]</tt>'''
-* 现有文件的文件名:'''<tt>[[:$2]]</tt>'''
-请选择一个不同的名字。",
+'fileexists-extension' => '一个相似名称的文件已经存在: [[$2|thumb]]
+* 上传文件的文件名:<strong>[[:$1]]</strong>
+* 现有文件的文件名:<strong>[[:$2]]</strong>
+请选择一个不同的名字。',
 'fileexists-thumbnail-yes' => "此文件可能是另一幅图像的缩小版本''(缩略图)''。 [[$1|thumb]]
-请仔细检查该文件'''<tt>[[:$1]]</tt>'''
+请仔细检查该文件<strong>[[:$1]]</strong>
 如果被检查文件与原始大小的图像是同一幅图像,您无需上传多余的缩略图。",
-'file-thumbnail-no' => "文件名以'''<tt>$1</tt>'''开头。它可能是另一幅图像的缩小版本''(缩略图)''。
+'file-thumbnail-no' => "文件名以<strong>$1</strong>开头。它可能是另一幅图像的缩小版本''(缩略图)''。
 如果你有该图像完整分辨率的版本,请上传该完整版本。否则请修改文件名。",
 'fileexists-forbidden' => '已存在相同名称的文件,且不能覆盖;请返回并用一个新的名称来上传此文件。[[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => '在共享文件库中已存在此名称的文件。
@@ -1719,6 +1744,7 @@ $1',
 'lockmanager-fail-releaselock' => '无法为“$1”释放锁。',
 'lockmanager-fail-db-bucket' => '不能在$1池中联系到足够锁数据库。',
 'lockmanager-fail-db-release' => '不能在数据库$1上释放锁。',
+'lockmanager-fail-svr-acquire' => '无法在服务器 $1 上获得锁',
 'lockmanager-fail-svr-release' => '不能在服务器$1上释放锁。',
 
 # ZipDirectoryReader
@@ -1824,18 +1850,20 @@ $1',
 它在[$2 文件描述页面]那边上的描述于下面显示。',
 'sharedupload-desc-edit' => '该文件来自$1,它可能在其它计划项目中被使用。
 或许您可以在其[$2 文件描述页面]上编辑说明。',
-'sharedupload-desc-create' => '此文件是从 $1 和可能由其他维基项目使用。 !N !也许您想在其[ $2 文件描述页面]编辑说明。',
+'sharedupload-desc-create' => '此文件来自$1并可能由其他项目使用。
+也许您想在其[$2 文件描述页面]编辑描述信息。',
 'filepage-nofile' => '不存在此名称的文件。',
 'filepage-nofile-link' => '不存在此名称的文件,但您可以[$1 上传它]。',
 'uploadnewversion-linktext' => '上传该文件的新版本',
 'shared-repo-from' => '出自$1',
 'shared-repo' => '一个共用文件库',
 'shared-repo-name-wikimediacommons' => '维基共享资源',
+'upload-disallowed-here' => '您不可以覆盖此图像',
 
 # File reversion
 'filerevert' => '恢复$1',
 'filerevert-legend' => '恢复文件',
-'filerevert-intro' => "您现正在恢复文件'''[[Media:$1|$1]]'''到[$4 于$2 $3的版本]。",
+'filerevert-intro' => "您正在将文件'''[[Media:$1|$1]]'''恢复到[$4 于$2 $3的版本]。",
 'filerevert-comment' => '原因:',
 'filerevert-defaultcomment' => '已经恢复到于$1 $2的版本',
 'filerevert-submit' => '恢复',
@@ -1864,8 +1892,8 @@ $1',
 'filedelete-maintenance-title' => '无法删除文件',
 
 # MIME search
-'mimesearch' => 'MIME 搜索',
-'mimesearch-summary' => '本页面启用文件MIME类型过滤器。输入:内容类型/子类型,如 <tt>image/jpeg</tt>。',
+'mimesearch' => 'MIME搜索',
+'mimesearch-summary' => '本页面启用文件MIME类型过滤器。输入:内容类型/子类型,如 <code>image/jpeg</code>。',
 'mimetype' => 'MIME 类型:',
 'download' => '下载',
 
@@ -1909,9 +1937,9 @@ $1',
 'statistics-users-active-desc' => '在前$1天中操作过的用户',
 'statistics-mostpopular' => '浏览最多的页面',
 
-'disambiguations' => '链接消歧义页的页面',
+'disambiguations' => '链接消歧义页的页面',
 'disambiguationspage' => 'Template:消歧义',
-'disambiguations-text' => "以ä¸\8bç\9a\84页é\9d¢é\83½æ\9c\89å\88°'''æ¶\88æ­§ä¹\89页'''ç\9a\84é\93¾æ\8e¥ï¼\8cä½\86å®\83们åº\94该é\93¾æ\8e¥å\88°适当的页面。<br />一个页面如果使用了[[MediaWiki:Disambiguationspage]]内的模板,则会被视为消歧义页。",
+'disambiguations-text' => "以ä¸\8bç\9a\84页é\9d¢é\83½æ\9c\89å\88°'''æ¶\88æ­§ä¹\89页'''ç\9a\84é\93¾æ\8e¥ï¼\8cä½\86å®\83们å\8f¯è\83½å\8f¯ä»¥é\93¾æ\8e¥å\88°æ\9b´适当的页面。<br />一个页面如果使用了[[MediaWiki:Disambiguationspage]]内的模板,则会被视为消歧义页。",
 
 'doubleredirects' => '双重重定向页',
 'doubleredirectstext' => '此页列出了所有重定向到另一重定向页面的页面。每一行都包含有到第一和第二个重定向页面的链接,以及第二个重定向页面的目标——通常就是“真正的”目标页面,亦即是第一个重定向页面应该指向的页面。<del>已划去</del>的为已经解决的项目。',
@@ -1954,8 +1982,8 @@ $1',
 'wantedpages' => '待撰页面',
 'wantedpages-badtitle' => '在结果组上的无效标题:$1',
 'wantedfiles' => '需要的文件',
-'wantedfiletext-cat' => '以ä¸\8bæ\96\87件被使ç\94¨ï¼\8cä½\86ä¸\8då­\98å\9c¨ã\80\82å¤\96é\83¨å­\98å\82¨åº\93ç\9a\84æ\96\87件尽管ç\8e°æ\9c\89ï¼\8cä½\86å\8f¯è\83½ä¼\9aå\9c¨æ­¤å\88\97å\87ºï¼\8cä»»ä½\95此类ç\9a\84误æ\8a¥å°\86被<del>å\89\94é\99¤</del>ã\80\82æ­¤å¤\96ï¼\8cåµ\8cå\85¥äº\86ä¸\8då­\98å\9c¨ç\9a\84æ\96\87件ç\9a\84ç½\91页å°\86å\9c¨[[:$1]]å\88\97å\87º。',
-'wantedfiletext-nocat' => '以ä¸\8bæ\96\87件被使ç\94¨ï¼\8cä½\86ä¸\8då­\98å\9c¨ã\80\82å¤\96é\83¨å­\98å\82¨åº\93ç\9a\84æ\96\87件尽管ç\8e°æ\9c\89ï¼\8cä½\86å\8f¯è\83½ä¼\9aå\9c¨æ­¤å\88\97å\87ºï¼\8cä»»ä½\95此类ç\9a\84误报将被<del>剔除</del>。',
+'wantedfiletext-cat' => 'ä¸\8bå\88\97被使ç\94¨ç\9a\84æ\96\87件并ä¸\8då­\98å\9c¨ã\80\82å·²å\88\97å\87ºå\8f¯è\83½å­\98å\9c¨å¤\96é\83¨åª\92ä½\93åº\93中ç\9a\84æ\96\87件ã\80\82ä»»ä½\95此类误æ\8a¥å°\86被<del>å\89\94é\99¤</del>ã\80\82æ­¤å¤\96ï¼\8c[[:$1]]å\88\97å\87ºå\88\97å\87ºäº\86åµ\8cå\85¥ä¸\8då­\98å\9c¨æ\96\87件ç\9a\84页é\9d¢。',
+'wantedfiletext-nocat' => 'ä¸\8bå\88\97被使ç\94¨ç\9a\84æ\96\87件并ä¸\8då­\98å\9c¨ã\80\82å·²å\88\97å\87ºå\8f¯è\83½å­\98å\9c¨å¤\96é\83¨åª\92ä½\93åº\93中ç\9a\84æ\96\87件ã\80\82ä»»ä½\95此类误报将被<del>剔除</del>。',
 'wantedtemplates' => '需要的模板',
 'mostlinked' => '最多链接页面',
 'mostlinkedcategories' => '最多链接分类',
@@ -2008,14 +2036,13 @@ $1',
 'booksources-invalid-isbn' => '提供的ISBN号码并不正确,请检查原始复制来源号码是否有误。',
 
 # Special:Log
-'specialloguserlabel' => 'æ\93\8dä½\9c者:',
+'specialloguserlabel' => 'æ\89§è¡\8c者:',
 'speciallogtitlelabel' => '目标(标题或用户):',
 'log' => '日志',
 'all-logs-page' => '所有公开日志',
-'alllogstext' => '综合显示{{SITENAME}}所有的可用日志。
-您可以选择日志类型,用户名(区分大小写)或者相关页面(区分大小写)来缩小查询范围。',
+'alllogstext' => '所有{{SITENAME}}公开日志的联合展示。你可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。',
 'logempty' => '在日志中不存在匹配项。',
-'log-title-wildcard' => 'æ\90\9c索以è¿\99个æ\96\87å­\97å¼\80å§\8b的标题',
+'log-title-wildcard' => 'æ\90\9c索以该æ\96\87å­\97å¼\80头的标题',
 'showhideselectedlogentries' => '显示/隐藏所选日志项',
 
 # Special:AllPages
@@ -2061,7 +2088,7 @@ $1',
 'linksearch-ns' => '名字空间:',
 'linksearch-ok' => '搜索',
 'linksearch-text' => '制作可以使用类似“*.wikipedia.org”的通配符。必须至少是顶级域名,例如“*.org”。<br />
-支持的协议:<tt>$1</tt>(不要包含在搜索中)。',
+支持的协议:<code>$1</code>(不要包含在搜索中)。',
 'linksearch-line' => '$1 链自 $2',
 'linksearch-error' => '通配符仅可在主机名称的开头使用。',
 
@@ -2074,7 +2101,7 @@ $1',
 # Special:ActiveUsers
 'activeusers' => '活跃用户列表',
 'activeusers-intro' => '这个列表列出了最近$1天进行过操作的用户。',
-'activeusers-count' => '最近$3天编辑了$1次',
+'activeusers-count' => '最近$3天内有$1次编辑',
 'activeusers-from' => '显示用户开始于:',
 'activeusers-hidebots' => '隐藏机器人',
 'activeusers-hidesysops' => '隐藏管理员',
@@ -2082,7 +2109,7 @@ $1',
 
 # Special:Log/newusers
 'newuserlogpage' => '用户创建日志',
-'newuserlogpagetext' => '本日志是显示新注册用户的日志',
+'newuserlogpagetext' => '这是用户创建的日志。',
 
 # Special:ListGroupRights
 'listgrouprights' => '用户组权限',
@@ -2108,8 +2135,7 @@ $1',
 'mailnologintext' => '你必须[[Special:UserLogin|登录]]并在你的[[Special:Preferences|系统设置]]中拥有有效的电子邮件地址才能向其他用户发送电子邮件。',
 'emailuser' => '电邮联系',
 'emailpage' => '电邮联系',
-'emailpagetext' => '您可以用下面的表格去寄一封电邮给这位用户。
-您在[[Special:Preferences|您的参数设置]]中所输入的电子邮箱地址将出现在邮件“发件人”一栏中,这样该用户就可以回复您。',
+'emailpagetext' => '你可以使用下面的表格向该用户发送电子邮件信息。你在[[Special:Preferences|你的系统设置]]中输入的电子邮件地址将显示为邮件的“发件人”地址,所以该用户将可以直接回复你。',
 'usermailererror' => 'Mail 对象返回错误:',
 'defemailsubject' => '{{SITENAME}}来自用户“$1”的电子邮件',
 'usermaildisabled' => '用户电邮已停用',
@@ -2180,14 +2206,14 @@ $1',
 'changed' => '更改',
 'created' => '创建',
 'enotif_subject' => '{{SITENAME}}页面“$PAGETITLE”已被$PAGEEDITOR$CHANGEDORCREATED',
-'enotif_lastvisited' => '请浏览$1查看你上次访问后的所有更改。',
-'enotif_lastdiff' => '请浏览$1查看该更改。',
+'enotif_lastvisited' => '请浏览 $1 查看你上次访问后的所有更改。',
+'enotif_lastdiff' => '请浏览 $1 查看该更改。',
 'enotif_anon_editor' => '匿名用户$1',
 'enotif_body' => '亲爱的$WATCHINGUSERNAME:
 
 你好!
 
-{{SITENAME}}页面$PAGETITLE已于$PAGEEDITDATE被$PAGEEDITOR$CHANGEDORCREATED,请浏览$PAGETITLE_URL查看当前版本。
+{{SITENAME}}页面$PAGETITLE已于$PAGEEDITDATE被$PAGEEDITOR $CHANGEDORCREATED,请浏览 $PAGETITLE_URL 查看当前版本。
 $NEWPAGE
 编辑摘要:$PAGESUMMARY $PAGEMINOREDIT
 
@@ -2226,7 +2252,7 @@ $UNWATCHURL
 'actionfailed' => '操作失败',
 'deletedtext' => '“$1”已经被删除。最近删除的记录请参见$2。',
 'dellogpage' => '删除日志',
-'dellogpagetext' => '以ä¸\8b是最近的删除的列表。',
+'dellogpagetext' => 'ä¸\8bé\9d¢是最近的删除的列表。',
 'deletionlog' => '删除记录',
 'reverted' => '恢复到早期版本',
 'deletecomment' => '原因:',
@@ -2236,7 +2262,7 @@ $UNWATCHURL
 ** 作者申请
 ** 侵犯著作权
 ** 破坏行为',
-'delete-edit-reasonlist' => '编辑删除理由',
+'delete-edit-reasonlist' => '编辑删除原因',
 'delete-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。',
 'delete-warning-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。',
 
@@ -2244,6 +2270,8 @@ $UNWATCHURL
 'rollback' => '回退编辑',
 'rollback_short' => '回退',
 'rollbacklink' => '回退',
+'rollbacklinkcount' => '回退$1次编辑',
+'rollbacklinkcount-morethan' => '回退超过$1次的编辑',
 'rollbackfailed' => '回退失败',
 'cantrollback' => '无法恢复编辑。最后的贡献者是本文的唯一作者。',
 'alreadyrolled' => '无法回退[[User:$2|$2]]([[User talk:$2|讨论]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])对[[:$1]]的编辑,其他人已经编辑或者回退了该页。
@@ -2255,17 +2283,17 @@ $UNWATCHURL
 'rollback-success' => '已恢复$1的编辑,更改回$2的最后修订版本。',
 
 # Edit tokens
-'sessionfailure-title' => '登录信息失败',
+'sessionfailure-title' => '会话无效',
 'sessionfailure' => '似乎您的登录会话有问题;
 为了防止会话劫持,这个操作已经被取消。
 请返回先前的页面,重新载入该页面,然后重试。',
 
 # Protect
 'protectlogpage' => '保护日志',
-'protectlogtext' => '以ä¸\8bæ\98¯é¡µé\9d¢ä¿\9dæ\8a¤ç\9a\84æ\9b´æ\94¹æ\97¥å¿\97ã\80\82[[Special:ProtectedPages|ä¿\9dæ\8a¤é¡µå\88\97表]]å\88\97å\87ºç\9b®å\89\8då­\98å\9c¨ç\9a\84页é\9d¢ä¿\9dæ\8a¤。',
+'protectlogtext' => 'ä¸\8bé\9d¢æ\98¯é¡µé\9d¢ä¿\9dæ\8a¤æ\9b´æ\94¹ç\9a\84å\88\97表ã\80\82请è§\81[[Special:ProtectedPages|å\8f\97ä¿\9dæ\8a¤é¡µé\9d¢å\88\97表]]æ\9f¥ç\9c\8bç\9b®å\89\8dæ­£å\9c¨è¿\9bè¡\8cç\9a\84页é\9d¢ä¿\9dæ\8a¤ç\9a\84å\88\97表。',
 'protectedarticle' => '保护“[[$1]]”',
-'modifiedarticleprotection' => 'æ\9b´æ\94¹â\80\9c[[$1]]â\80\9dç\9a\84ä¿\9dæ\8a¤çº§å\88«',
-'unprotectedarticle' => '除“[[$1]]”的保护',
+'modifiedarticleprotection' => 'æ\9b´æ\94¹â\80\9c[[$1]]â\80\9dç\9a\84ä¿\9dæ\8a¤ç­\89级',
+'unprotectedarticle' => '除“[[$1]]”的保护',
 'movedarticleprotection' => '移动保护设置自“[[$2]]”至“[[$1]]”',
 'protect-title' => '更改“$1”的保护等级',
 'protect-title-notallowed' => '查看“$1”的保护等级',
@@ -2303,7 +2331,7 @@ $UNWATCHURL
 ** 过多垃圾信息
 ** 负面的编辑战
 ** 高流量页面',
-'protect-edit-reasonlist' => '编辑保护理由',
+'protect-edit-reasonlist' => '编辑保护原因',
 'protect-expiry-options' => '1小时:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,无限期:infinite',
 'restriction-type' => '权限:',
 'restriction-level' => '限制级别:',
@@ -2380,7 +2408,7 @@ $1',
 # Contributions
 'contributions' => '用户贡献',
 'contributions-title' => '$1的用户贡献',
-'mycontris' => '贡献',
+'mycontris' => '我的贡献',
 'contribsub2' => '$1的贡献($2)',
 'nocontribs' => '没有找到符合特征的更改。',
 'uctop' => '(最后更改)',
@@ -2390,7 +2418,7 @@ $1',
 'sp-contributions-newbies' => '只显示新账户的贡献',
 'sp-contributions-newbies-sub' => '新手',
 'sp-contributions-newbies-title' => '新手的用户贡献',
-'sp-contributions-blocklog' => '封禁记录',
+'sp-contributions-blocklog' => '封禁日志',
 'sp-contributions-deleted' => '已删除的用户贡献',
 'sp-contributions-uploads' => '上传',
 'sp-contributions-logs' => '日志',
@@ -2409,7 +2437,7 @@ $1',
 'whatlinkshere' => '链入页面',
 'whatlinkshere-title' => '链接至“$1”的页面',
 'whatlinkshere-page' => '页面:',
-'linkshere' => "ä¸\8bå\88\97页面链接至'''[[:$1]]''':",
+'linkshere' => "以ä¸\8b页面链接至'''[[:$1]]''':",
 'nolinkshere' => "没有页面链接至'''[[:$1]]'''。",
 'nolinkshere-ns' => "在所选的名字空间内没有页面链接到'''[[:$1]]'''。",
 'isredirect' => '重定向页',
@@ -2425,7 +2453,7 @@ $1',
 'whatlinkshere-filters' => '过滤器',
 
 # Block/unblock
-'autoblockid' => '自动查封 #$1',
+'autoblockid' => '自动封禁#$1',
 'block' => '封禁用户',
 'unblock' => '解封用户',
 'blockip' => '封禁用户',
@@ -2446,7 +2474,7 @@ $1',
 ** 恐吓行为/骚扰
 ** 滥用多个账户
 ** 不能接受的用户名',
-'ipb-hardblock' => 'é\98²æ­¢å·²ç\99»å½\95ç\9a\84ç\94¨æ\88·ä»\8e该IP地址编辑',
+'ipb-hardblock' => 'é\98»æ­¢ç\99»å½\95ç\94¨æ\88·ä½¿ç\94¨该IP地址编辑',
 'ipbcreateaccount' => '阻止创建新账号',
 'ipbemailban' => '阻止用户发送电邮',
 'ipbenableautoblock' => '自动封禁该用户最后使用的IP地址,以及他们随后试图用于编辑的所有IP地址',
@@ -2456,8 +2484,8 @@ $1',
 'ipbotheroption' => '其他',
 'ipbotherreason' => '其他/附加原因:',
 'ipbhidename' => '在编辑及列表中隐藏用户名',
-'ipbwatchuser' => 'ç\9b\91è§\86è¿\99ä½\8dç\94¨æ\88·ç\9a\84ç\94¨æ\88·é¡µé\9d¢ä»¥å\8f\8aå\85¶å¯¹è¯\9d页面',
-'ipb-disableusertalk' => '禁止被封禁用户编辑自己的对话页',
+'ipbwatchuser' => 'ç\9b\91è§\86该ç\94¨æ\88·ç\9a\84ç\94¨æ\88·é¡µé\9d¢å\92\8c讨论页面',
+'ipb-disableusertalk' => '阻止用户在封禁期间编辑自己的讨论页面',
 'ipb-change-block' => '使用这些设置重新封禁用户',
 'ipb-confirm' => '确认封禁',
 'badipaddress' => '无效IP地址',
@@ -2466,7 +2494,7 @@ $1',
 参见[[Special:BlockList|封禁列表]]以复核封禁。',
 'ipb-blockingself' => '您将要封禁自己!确实要这样做吗?',
 'ipb-confirmhideuser' => '您即将在封禁用户的同时启用“隐藏账户”功能。这将从所有列表和日志记录中隐藏这个用户名。您确认这样做吗?',
-'ipb-edit-dropdown' => '编辑封禁理由',
+'ipb-edit-dropdown' => '编辑封禁原因',
 'ipb-unblock-addr' => '解封$1',
 'ipb-unblock' => '解封用户名或IP地址',
 'ipb-blocklist' => '查看现有封禁',
@@ -2479,48 +2507,48 @@ $1',
 'unblocked-id' => '封禁$1已被解除',
 'blocklist' => '被封禁用户',
 'ipblocklist' => '被封禁用户',
-'ipblocklist-legend' => '查找封禁用户',
+'ipblocklist-legend' => '查找封禁用户',
 'blocklist-userblocks' => '隐藏帐户封禁',
 'blocklist-tempblocks' => '隐藏临时封禁',
 'blocklist-addressblocks' => '隐藏单个IP封禁',
 'blocklist-rangeblocks' => '隐藏IP段封禁',
-'blocklist-timestamp' => '时间',
+'blocklist-timestamp' => '时间',
 'blocklist-target' => '目标',
-'blocklist-expiry' => '期',
-'blocklist-by' => '执行者',
-'blocklist-params' => 'å°\81ç¦\81设置',
+'blocklist-expiry' => '期',
+'blocklist-by' => '封禁管理员',
+'blocklist-params' => 'å°\81ç¦\81è\8c\83å\9b´',
 'blocklist-reason' => '原因',
 'ipblocklist-submit' => '搜索',
 'ipblocklist-localblock' => '本地封禁',
 'ipblocklist-otherblocks' => '其他{{PLURAL:$1|封禁}}',
 'infiniteblock' => '无限期',
 'expiringblock' => '$1 $2到期',
-'anononlyblock' => '仅匿名用户',
-'noautoblockblock' => '禁用自动封禁',
-'createaccountblock' => '禁止创建账户',
-'emailblock' => 'ç¦\81æ­¢ç\94µå­\90é\82®ä»¶',
-'blocklist-nousertalk' => '禁止编辑自己的用户讨论页',
+'anononlyblock' => '仅匿名用户',
+'noautoblockblock' => '自动封禁停用',
+'createaccountblock' => '账户创建停用',
+'emailblock' => 'ç\94µå­\90é\82®ä»¶å\81\9cç\94¨',
+'blocklist-nousertalk' => '不能编辑自己的讨论页面',
 'ipblocklist-empty' => '封禁列表为空。',
 'ipblocklist-no-results' => '请求的IP地址或用户名没有被封禁。',
 'blocklink' => '封禁',
-'unblocklink' => '解é\99¤å°\81ç¦\81',
+'unblocklink' => '解å°\81',
 'change-blocklink' => '更改封禁',
 'contribslink' => '贡献',
 'emaillink' => '发送电邮',
 'autoblocker' => '由于您与“[[User:$1|$1]]”共享一个IP地址而被自动封禁。
 $1被封禁的理由是:“$2”',
 'blocklogpage' => '封禁日志',
-'blocklog-showlog' => '此用户曾被封禁。以下列出封禁日志以供参考:',
-'blocklog-showsuppresslog' => '此用户曾被封禁并隐藏。以下列出隐藏日志以供参考:',
-'blocklogentry' => '封禁[[$1]],终止时间为$2$3',
-'reblock-logentry' => '更改[[$1]]的封禁终止时间 $2 $3',
-'blocklogtext' => '此处给出了封禁和解封用户的操作日志,被自动封禁的IP地址不在此表。请查看[[Special:BlockList|封禁列表]]获知当前被封禁的用户和IP地址。',
-'unblocklogentry' => '已解封 $1',
+'blocklog-showlog' => '该用户曾被封禁。下面提供封禁日志以供参考:',
+'blocklog-showsuppresslog' => '该用户曾被封禁并隐藏。下面提供封锁日志以供参考:',
+'blocklogentry' => '封禁[[$1]],到期时间为$2$3',
+'reblock-logentry' => '更改[[$1]]的封禁设置,到期时间为$2$3',
+'blocklogtext' => '这是用户封禁和解封操作的日志。自动封禁IP地址没有列出。请见[[Special:BlockList|封禁列表]]查看目前正在进行的阻止和封禁的列表。',
+'unblocklogentry' => '解封$1',
 'block-log-flags-anononly' => '仅限匿名用户',
-'block-log-flags-nocreate' => '停用账户创建',
-'block-log-flags-noautoblock' => '禁用自动封禁',
-'block-log-flags-noemail' => 'ç¦\81æ­¢ç\94µå­\90é\82®ä»¶',
-'block-log-flags-nousertalk' => '禁止编辑自己的用户讨论页',
+'block-log-flags-nocreate' => '账户创建停用',
+'block-log-flags-noautoblock' => '自动封禁停用',
+'block-log-flags-noemail' => 'ç\94µå­\90é\82®ä»¶å\81\9cç\94¨',
+'block-log-flags-nousertalk' => '不能编辑自己的讨论页面',
 'block-log-flags-angry-autoblock' => '已启用增强型自动封禁',
 'block-log-flags-hiddenname' => '隐藏用户名',
 'range_block_disabled' => '管理员执行段封禁的权限已被禁用。',
@@ -2602,16 +2630,16 @@ $1被封禁的理由是:“$2”',
 
 在这些情况下,您在必要时必须手工移动或合并页面。",
 'movearticle' => '移动页面:',
-'moveuserpage-warning' => "'''警告:'''您将会移动一个用户页面。请留意该页面在移动后该用户的名字是''不会''变更的。",
+'moveuserpage-warning' => "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
 'movenologin' => '未登录',
 'movenologintext' => '您必须是一名登记用户并且[[Special:UserLogin|登录]]
 后才可移动一个页面。',
-'movenotallowed' => '您并没有权限去移动页面。',
-'movenotallowedfile' => '您并没有权限去移动文件。',
-'cant-move-user-page' => '您并没有许可权去移动用户页面(它的子页面除外)。',
-'cant-move-to-user-page' => '您并没有许可权去移动到用户页面(它的子页面除外)。',
+'movenotallowed' => '你没有权限移动页面。',
+'movenotallowedfile' => '你没有权限移动文件。',
+'cant-move-user-page' => '你没有权限移动用户页面(子页面除外)。',
+'cant-move-to-user-page' => '你没有权限移动页面至用户页面(用户子页面除外)。',
 'newtitle' => '新标题:',
-'move-watch' => '监视来源以及目标页',
+'move-watch' => '监视来源页面和目标页面',
 'movepagebtn' => '移动页面',
 'pagemovedsub' => '移动成功',
 'movepage-moved' => "'''“$1”已移动到“$2”'''",
@@ -2629,9 +2657,9 @@ $1被封禁的理由是:“$2”',
 'movepage-page-unmoved' => '页面$1无法移动到$2。',
 'movepage-max-pages' => '所移动$1个页面的数量已达最大限额,无法同时自动移动更多页面。',
 'movelogpage' => '移动日志',
-'movelogpagetext' => '以ä¸\8bæ\98¯æ\89\80æ\9c\89移å\8a¨ç\9a\84页é\9d¢å\88\97表ï¼\9a',
-'movesubpage' => '{{PLURAL:$1|子页面|子页面}}',
-'movesubpagetext' => 'è¿\99个页é\9d¢æ\9c\89$1个å­\90页é\9d¢ï¼\8cå\88\97示å¦\82ä¸\8b。',
+'movelogpagetext' => 'ä¸\8bé\9d¢æ\98¯æ\89\80æ\9c\89页é\9d¢ç§»å\8a¨ç\9a\84å\88\97表ã\80\82',
+'movesubpage' => '{{PLURAL:$1|子页面}}',
+'movesubpagetext' => '该页é\9d¢æ\9c\89$1个å­\90页é\9d¢å\9c¨ä¸\8bé\9d¢å±\95示。',
 'movenosubpage' => '这个页面没有子页面。',
 'movereason' => '原因:',
 'revertmove' => '恢复',
@@ -2653,10 +2681,8 @@ $1被封禁的理由是:“$2”',
 'imageinvalidfilename' => '目标文件名称无效',
 'fix-double-redirects' => '更新所有指向原始标题的重定向',
 'move-leave-redirect' => '保留重定向',
-'protectedpagemovewarning' => "'''警告:'''这个页面已经被保护,只有拥有管理员权限的用户才可以移动它。
-最近的日志在下面提供以便参考:",
-'semiprotectedpagemovewarning' => "'''注意:'''这个页面已经被保护,只有已经注册的用户才可以移动它。
-最近的日志在下面提供以便参考:",
+'protectedpagemovewarning' => "'''警告:'''本页面已被保护,只有拥有管理员权限的用户可以移动。下面提供最后的日志条目以供参考:",
+'semiprotectedpagemovewarning' => "'''注意:'''本页面已被保护,只有注册用户可以移动。下面提供最后的日志条目以供参考:",
 'move-over-sharedrepo' => '== 文件已存在 ==
 [[:$1]]已于共享资源存在,将文件移动到此标题会覆盖共享资源中的文件。',
 'file-exists-sharedrepo' => '同名文件已于共享资源存在。
@@ -2664,11 +2690,9 @@ $1被封禁的理由是:“$2”',
 
 # Export
 'export' => '导出页面',
-'exporttext' => '您可以将特定页面或一组页面的文本以及编辑历史以 XML 格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”页面导入到另一个运行 MediaWiki 的网站。
+'exporttext' => '您可以将特定页面或一组页面的文本以及编辑历史以XML格式导出;这样可以将有关页面通过“[[Special:Import|导入页面]]”页面导入到另一个运行MediaWiki的网站。
 
-要导出页面,请在下面的文本框中输入页面标题,每行一个标题,
-并选择你是否需要导出带有页面历史的以前的修订本,
-或是只选择导出带有最后一次编辑信息的当前修订版本。
+要导出页面,请在下面的文本框中输入页面标题,每行一个标题,并选择你是否需要导出带有页面历史的以前的修订本,或是只选择导出带有最后一次编辑信息的当前修订版本。
 
 此外你还可以利用链接导出文件,例如你可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]导出“[[{{MediaWiki:Mainpage}}]]”页面。',
 'exportall' => '导出所有页面',
@@ -2677,9 +2701,9 @@ $1被封禁的理由是:“$2”',
 '''注意:'''由于性能原因,从此表单导出页面的全部历史已被禁用。",
 'exportlistauthors' => '为每个页面包含贡献者的完整列表',
 'export-submit' => '导出',
-'export-addcattext' => '由分类中添加页面:',
+'export-addcattext' => '从分类添加页面:',
 'export-addcat' => '添加',
-'export-addnstext' => '由名字空间中添加页面:',
+'export-addnstext' => '从名字空间添加页面:',
 'export-addns' => '添加',
 'export-download' => '另存为文件',
 'export-templates' => '包含模板',
@@ -2718,13 +2742,14 @@ $1被封禁的理由是:“$2”',
 
 # Special:Import
 'import' => '导入页面',
-'importinterwiki' => '跨维基导入',
+'importinterwiki' => '跨wiki导入',
 'import-interwiki-text' => '选择要导入的wiki和页面标题,导入修订的日期和编辑者名称会被保存。所有的跨wiki导入操作都将记录到[[Special:Log/import|导入日志]]。',
 'import-interwiki-source' => '来源wiki/页面:',
 'import-interwiki-history' => '复制此页的所有历史修订版本',
 'import-interwiki-templates' => '包含所有模板',
 'import-interwiki-submit' => '导入',
 'import-interwiki-namespace' => '目标名字空间:',
+'import-interwiki-rootpage' => '目的根页(可选):',
 'import-upload-filename' => '文件名:',
 'import-comment' => '注释:',
 'importtext' => '请使用[[Special:Export|导出功能]]从源 wiki 导出文件,
@@ -2754,21 +2779,22 @@ $1被封禁的理由是:“$2”',
 'import-invalid-interwiki' => '不能从指定的wiki导入。',
 'import-error-edit' => '"$1"页面不导入,因为您不准对其进行编辑。',
 'import-error-create' => '"$1"页面不导入,因为您不准创建它。',
-'import-error-interwiki' => '页面“$1”未能导入,因为它的名称需要使用外部跨维基链接。',
+'import-error-interwiki' => '页面“$1”未能导入,因为它的名称需要使用外部跨wiki链接。',
 'import-error-special' => '页面“$1”未导入,因为它需要使用一个不能创建页面的特殊名字空间。',
 'import-error-invalid' => '页面“$1”未能导入,因为它的名字无效。',
+'import-options-wrong' => '{{PLURAL:$2|选项}}出错:<nowiki>$1</nowiki>',
 
 # Import log
 'importlogpage' => '导入日志',
-'importlogpagetext' => 'ç\94±ç®¡ç\90\86å\91\98ä»\8eå\85¶ä»\96wiki导å\85¥ç\9a\84带有编辑历史的页面。',
-'import-logentry-upload' => '通过文件上传导入的[[$1]]',
+'importlogpagetext' => '管ç\90\86æ\80§å¯¼å\85¥å\9c¨å\85¶ä»\96wikiä¸\8a有编辑历史的页面。',
+'import-logentry-upload' => '以文件上传导入[[$1]]',
 'import-logentry-upload-detail' => '$1个版本',
-'import-logentry-interwiki' => '跨站导入 $1',
+'import-logentry-interwiki' => '跨wiki$1',
 'import-logentry-interwiki-detail' => '来自$2的$1个修订',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript测试',
-'javascripttest-disabled' => '该维基站点上尚未启用此功能。',
+'javascripttest-disabled' => '该wiki站点上尚未启用此功能。',
 'javascripttest-title' => '运行$1测试',
 'javascripttest-pagetext-noframework' => '此页面被保留用于运行JavaScript测试。',
 'javascripttest-pagetext-unknownframework' => '未知的框架“$1”。',
@@ -2825,7 +2851,7 @@ $1被封禁的理由是:“$2”',
 'tooltip-ca-nstab-user' => '查看用户页面',
 'tooltip-ca-nstab-media' => '查看媒体文件页面',
 'tooltip-ca-nstab-special' => '本页为特殊页面,你不能编辑本页',
-'tooltip-ca-nstab-project' => '查看计划页面',
+'tooltip-ca-nstab-project' => '查看项目页面',
 'tooltip-ca-nstab-image' => '查看文件页面',
 'tooltip-ca-nstab-mediawiki' => '查看系统信息',
 'tooltip-ca-nstab-template' => '查看模板',
@@ -2905,15 +2931,10 @@ $1被封禁的理由是:“$2”',
 # Info page
 'pageinfo-title' => '"$1" 的信息',
 'pageinfo-header-edits' => '编辑',
-'pageinfo-header-watchlist' => '监视列表',
-'pageinfo-header-views' => '视图',
-'pageinfo-subjectpage' => '页面',
-'pageinfo-talkpage' => '讨论页',
+'pageinfo-views' => '视图的数量',
 'pageinfo-watchers' => '监视者数目',
 'pageinfo-edits' => '编辑数量',
 'pageinfo-authors' => '作者数量',
-'pageinfo-views' => '视图的数量',
-'pageinfo-viewsperedit' => '每个编辑视图',
 
 # Skin names
 'skinname-standard' => '标准',
@@ -2935,7 +2956,7 @@ $1被封禁的理由是:“$2”',
 
 # Patrol log
 'patrol-log-page' => '巡查日志',
-'patrol-log-header' => 'è¿\99æ\98¯å·²å·¡æ\9f¥ç\9a\84修订ç\89\88æ\9c¬ç\9a\84æ\97¥å¿\97ã\80\82',
+'patrol-log-header' => '这是已巡查版本的日志。',
 'log-show-hide-patrol' => '$1巡查纪录',
 
 # Image deletion
@@ -2977,7 +2998,7 @@ $1',
 # Special:NewFiles
 'newimages' => '新文件库',
 'imagelisttext' => "以下是按$2排列的'''$1'''个文件列表。",
-'newimages-summary' => 'æ­¤ç\89¹æ®\8a页é\9d¢æ\98¾ç¤ºæ\9c\80è¿\91上传的文件。',
+'newimages-summary' => 'æ\9c¬ç\89¹æ®\8a页é\9d¢å±\95示æ\9c\80å\90\8e上传的文件。',
 'newimages-legend' => '过滤',
 'newimages-label' => '文件名(或它的一部份):',
 'showhidebots' => '($1机器人)',
@@ -3073,7 +3094,7 @@ Variants for Chinese language
 'exif-model' => '相机型号',
 'exif-software' => '使用软件',
 'exif-artist' => '作者',
-'exif-copyright' => '著作权所有',
+'exif-copyright' => '著作权所有',
 'exif-exifversion' => 'Exif版本',
 'exif-flashpixversion' => '支持的Flashpix版本',
 'exif-colorspace' => '色彩空间',
@@ -3081,8 +3102,8 @@ Variants for Chinese language
 'exif-compressedbitsperpixel' => '图像压缩模式',
 'exif-pixelydimension' => '图像宽度',
 'exif-pixelxdimension' => '图像高度',
-'exif-usercomment' => '用户注释',
-'exif-relatedsoundfile' => '相关的音频文件',
+'exif-usercomment' => '用户评论',
+'exif-relatedsoundfile' => '相关声音文件',
 'exif-datetimeoriginal' => '数据生成日期时间',
 'exif-datetimedigitized' => '数字化日期时间',
 'exif-subsectime' => '修改时间厘秒数',
@@ -3118,7 +3139,7 @@ Variants for Chinese language
 'exif-exposuremode' => '曝光模式',
 'exif-whitebalance' => '白平衡',
 'exif-digitalzoomratio' => '数字变焦比率',
-'exif-focallengthin35mmfilm' => '35毫米胶片焦距',
+'exif-focallengthin35mmfilm' => '35 mm胶片焦距',
 'exif-scenecapturetype' => '场景模式',
 'exif-gaincontrol' => '场景控制',
 'exif-contrast' => '对比度',
@@ -3159,7 +3180,7 @@ Variants for Chinese language
 'exif-gpsdatestamp' => 'GPS日期',
 'exif-gpsdifferential' => 'GPS差动修正',
 'exif-jpegfilecomment' => 'JPEG 文件注释',
-'exif-keywords' => '关键',
+'exif-keywords' => '关键',
 'exif-worldregioncreated' => '照片中的世界区域',
 'exif-countrycreated' => '在拍摄图片的国家',
 'exif-countrycodecreated' => '在拍摄图片的国家代码',
@@ -3168,60 +3189,60 @@ Variants for Chinese language
 'exif-sublocationcreated' => '照片拍摄地点在城市中的位置',
 'exif-worldregiondest' => '世界区域显示',
 'exif-countrydest' => '所示的国家',
-'exif-countrycodedest' => '国家所示的代码',
+'exif-countrycodedest' => '国家代码',
 'exif-provinceorstatedest' => '省或状态显示',
 'exif-citydest' => '所示的城市',
 'exif-sublocationdest' => '显示城市中的详细地点',
 'exif-objectname' => '简称',
 'exif-specialinstructions' => '特别说明',
 'exif-headline' => '标题',
-'exif-credit' => '信用/供应商',
-'exif-source' => '源',
+'exif-credit' => '提供人',
+'exif-source' => 'æ\9d¥æº\90',
 'exif-editstatus' => '编辑状态的图像',
-'exif-urgency' => '紧性',
+'exif-urgency' => '紧性',
 'exif-fixtureidentifier' => '夹具名称',
 'exif-locationdest' => '位置描述',
 'exif-locationdestcode' => '位置所示的代码',
-'exif-objectcycle' => '媒体应当使用的时间段',
+'exif-objectcycle' => '媒体文件使用时间要求',
 'exif-contact' => '联系信息',
-'exif-writer' => '作',
+'exif-writer' => '作',
 'exif-languagecode' => '语言',
 'exif-iimversion' => 'IIM 版本',
 'exif-iimcategory' => '类别',
 'exif-iimsupplementalcategory' => '补充的类别',
-'exif-datetimeexpires' => 'ä¸\8dè¦\81使ç\94¨å\90\8e',
+'exif-datetimeexpires' => '使ç\94¨æ\88ªæ­¢æ\97¥æ\9c\9f',
 'exif-datetimereleased' => '发表',
 'exif-originaltransmissionref' => '传输位置的原代码',
 'exif-identifier' => '标识符',
 'exif-lens' => '使用的镜头',
-'exif-serialnumber' => '相机序列号',
-'exif-cameraownername' => '相机的所有者',
+'exif-serialnumber' => '相机序列号',
+'exif-cameraownername' => '相机所有人',
 'exif-label' => '标签',
-'exif-datetimemetadata' => '上次修改日期的元数据',
+'exif-datetimemetadata' => '原始数据最后修改日期',
 'exif-nickname' => '非正式的图像的名称',
-'exif-rating' => '评分(满分为5)',
+'exif-rating' => '分级(最高为5)',
 'exif-rightscertificate' => '权利管理证书',
 'exif-copyrighted' => '著作权状况',
-'exif-copyrightowner' => '著作权所有',
+'exif-copyrightowner' => '著作权所有',
 'exif-usageterms' => '使用条款',
-'exif-webstatement' => '网上版权说明',
-'exif-originaldocumentid' => '原始文档的唯一 ID',
-'exif-licenseurl' => '版权许可的 URL',
-'exif-morepermissionsurl' => '替代的许可信息',
+'exif-webstatement' => '在线著作权声明',
+'exif-originaldocumentid' => '原始文件唯一ID',
+'exif-licenseurl' => '著作权授权协议的URL',
+'exif-morepermissionsurl' => '其他授权协议信息',
 'exif-attributionurl' => '二次使用本作品时,请链接至',
 'exif-preferredattributionname' => '二次使用本作品时,请署名',
-'exif-pngfilecomment' => 'PNG 文件注释',
+'exif-pngfilecomment' => 'PNG文件注释',
 'exif-disclaimer' => '免责声明',
 'exif-contentwarning' => '内容的警告',
-'exif-giffilecomment' => 'GIF 文件注释',
+'exif-giffilecomment' => 'GIF文件注释',
 'exif-intellectualgenre' => '项目类型',
 'exif-subjectnewscode' => '主题代码',
 'exif-scenecode' => 'IPTC 现场代码',
 'exif-event' => '事件描述',
 'exif-organisationinimage' => '组织描述',
 'exif-personinimage' => '描述的人',
-'exif-originalimageheight' => '之前它被裁剪图像的高度',
-'exif-originalimagewidth' => '之前它被裁剪图像的宽度',
+'exif-originalimageheight' => '裁剪前的图像高度',
+'exif-originalimagewidth' => '裁剪前的图像宽度',
 
 # EXIF attributes
 'exif-compression-1' => '未压缩',
@@ -3292,15 +3313,15 @@ Variants for Chinese language
 
 # Flash modes
 'exif-flash-fired-0' => '闪光灯未点亮',
-'exif-flash-fired-1' => '闪光灯开',
+'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' => 'è\87ªå\8a¨æ\96¹式',
+'exif-flash-mode-1' => '闪光灯强制开启',
+'exif-flash-mode-2' => '闪光灯强制关闭',
+'exif-flash-mode-3' => 'è\87ªå\8a¨æ¨¡式',
 'exif-flash-function-1' => '无闪光灯功能',
-'exif-flash-redeye-1' => '红眼减退方式',
+'exif-flash-redeye-1' => '防红眼模式',
 
 'exif-focalplaneresolutionunit-2' => '英寸',
 
@@ -3388,9 +3409,9 @@ Variants for Chinese language
 'exif-gpsdop-fair' => '平等($1)',
 'exif-gpsdop-poor' => '不好($1)',
 
-'exif-objectcycle-a' => '只有上午',
-'exif-objectcycle-p' => '只有晚上',
-'exif-objectcycle-b' => '早上和晚上',
+'exif-objectcycle-a' => '仅上午(AM)',
+'exif-objectcycle-p' => '仅下午(PM)',
+'exif-objectcycle-b' => '上午(AM)下午(PM)皆可',
 
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => '真实方位',
@@ -3403,14 +3424,14 @@ Variants for Chinese language
 'exif-dc-coverage' => '介质的空间或时间范围',
 'exif-dc-date' => '日期',
 'exif-dc-publisher' => '发布者',
-'exif-dc-relation' => '相关体裁',
+'exif-dc-relation' => '相关文件',
 'exif-dc-rights' => '权利',
-'exif-dc-source' => '原始体裁',
-'exif-dc-type' => 'ä½\93è£\81',
+'exif-dc-source' => '原始文件',
+'exif-dc-type' => 'ä»\8b质类å\9e\8b',
 
 'exif-rating-rejected' => '拒绝',
 
-'exif-isospeedratings-overflow' => '超过65535',
+'exif-isospeedratings-overflow' => '大于65535',
 
 'exif-iimcategory-ace' => '艺术、 文化和娱乐',
 'exif-iimcategory-clj' => '犯罪和法律',
@@ -3609,10 +3630,10 @@ $5
 'version-specialpages' => '特殊页面',
 'version-parserhooks' => '解析器钩',
 'version-variables' => '变量',
-'version-antispam' => 'å\9e\83å\9c¾é\98²止',
+'version-antispam' => 'å\9e\83å\9c¾é\98»止',
 'version-skins' => '皮肤',
 'version-other' => '其他',
-'version-mediahandlers' => '媒体处理器',
+'version-mediahandlers' => '媒体文件处理器',
 'version-hooks' => '钩',
 'version-extension-functions' => '扩展函数',
 'version-parser-extensiontags' => '解析器扩展标签',
@@ -3631,8 +3652,8 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'version-software' => '已安装的软件',
 'version-software-product' => '产品',
 'version-software-version' => '版本',
-'version-entrypoints' => '入口点 URL',
-'version-entrypoints-header-entrypoint' => '入口点',
+'version-entrypoints' => '接入点URL',
+'version-entrypoints-header-entrypoint' => '接入点',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
@@ -3655,12 +3676,11 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 # Special:SpecialPages
 'specialpages' => '特殊页面',
 'specialpages-note' => '----
-* 常规特殊页面。
-* <span class="mw-specialpagerestricted">受限特殊页面。</span>
-* <span class="mw-specialpagecached">已缓存特殊页面(可能已过时)。</span>',
+*普通特殊页面。
+*<span class="mw-specialpagerestricted">非公开特殊页面。</span>',
 'specialpages-group-maintenance' => '维护报告',
 'specialpages-group-other' => '其它特殊页面',
-'specialpages-group-login' => '登录/注册',
+'specialpages-group-login' => '登录/创建账户',
 'specialpages-group-changes' => '最近更改与日志',
 'specialpages-group-media' => '媒体文件报告与上传',
 'specialpages-group-users' => '用户与权限',
@@ -3676,27 +3696,27 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'intentionallyblankpage' => '这个页面被故意留为空白',
 
 # External image whitelist
-'external_image_whitelist' => ' #请保留此行文本<pre>
-#在下方书写正则表达式(//中间的部份)
+'external_image_whitelist' => ' #请原样保留本行文字<pre>
+#在下方书写正则表达式片段(//中间的部份)
 #这些规则将与外部(盗链)图像的URL匹配
 #匹配的URL将被显示为图像,否则只会显示链向图像的链接
-#以#开头的行会被视为注释
-#大小写不敏感
+#以#开头的行视为评论
+#不区分大小写
 
-#å\9c¨æ­¤è¡\8cä¸\8aæ\96¹è¾\93å\85¥æ\89\80æ\9c\89ç\9a\84æ­£å\88\99表达å¼\8fã\80\82请ä¿\9dç\95\99æ­¤è¡\8cæ\96\87æ\9c¬</pre>',
+#å\9c¨æ\9c¬è¡\8cä¸\8aé\9d¢è¾\93å\85¥æ\89\80æ\9c\89æ­£å\88\99表达å¼\8fã\80\82请å\8e\9fæ ·ä¿\9dç\95\99æ\9c¬è¡\8cæ\96\87å­\97</pre>',
 
 # Special:Tags
 'tags' => '有效的更改标签',
 'tag-filter' => '[[Special:Tags|标签]]过滤器:',
 'tag-filter-submit' => '过滤器',
 'tags-title' => '标签',
-'tags-intro' => '本页面列出了建站软件可能用来标记编辑的标签及它们的含义。',
+'tags-intro' => '本页面列出了软件可能用于标记编辑的标签和它们的含义。',
 'tags-tag' => '标签名称',
 'tags-display-header' => '更改列表中的表现形式',
 'tags-description-header' => '完整含义说明',
-'tags-hitcount-header' => '标记的更改',
+'tags-hitcount-header' => '标记的更改',
 'tags-edit' => '编辑',
-'tags-hitcount' => '$1更改',
+'tags-hitcount' => '$1更改',
 
 # Special:ComparePages
 'comparepages' => '对比页面',
@@ -3784,7 +3804,7 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'feedback-bugnew' => '我检查了。报告新bug',
 
 # API errors
-'api-error-badaccess-groups' => '你没有权限将文件上传到此维基。',
+'api-error-badaccess-groups' => '你没有将文件上传到此wiki的权限。',
 'api-error-badtoken' => '内部错误:会话无效。',
 'api-error-copyuploaddisabled' => '通过URL上传的功能已被此服务器禁用。',
 'api-error-duplicate' => '在网站上已经具有相同内容的{{PLURAL:$1|[$2 另一个文件]|[$2 另一些文件]}}。',
@@ -3794,14 +3814,17 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'api-error-empty-file' => '您提交的文件是空的。',
 'api-error-emptypage' => '不能创建没有内容的新页面。',
 'api-error-fetchfileerror' => '内部错误:获取文件时发生错误。',
-'api-error-file-too-large' => '您提交的文件太大了。',
-'api-error-filename-tooshort' => '文件名太短了。',
+'api-error-fileexists-forbidden' => '名为$1的文件已经存在而且无法覆盖。',
+'api-error-fileexists-shared-forbidden' => '名为$1的文件已经存在于共享媒体库中而且无法覆盖。',
+'api-error-file-too-large' => '您提交的文件过大。',
+'api-error-filename-tooshort' => '文件名过短。',
 'api-error-filetype-banned' => '此类文件被禁止。',
+'api-error-filetype-banned-type' => '$1{{PLURAL:$4|不是允许的文件类型}}。允许的{{PLURAL:$3|文件类型是|文件类型有}}$2。',
 'api-error-filetype-missing' => '该文件没有扩展名。',
 'api-error-hookaborted' => '你试图进行的修改被一个扩展钩子终止。',
 'api-error-http' => '内部错误:无法连接到服务器。',
 'api-error-illegal-filename' => '文件名非法。',
-'api-error-internal-error' => '内部错误:此维基项目在处理你的上传数据时出现了错误。',
+'api-error-internal-error' => '内部错误:此wiki在处理你的上传数据时出现了错误。',
 'api-error-invalid-file-key' => '内部错误:找不到临时文件。',
 'api-error-missingparam' => '内部错误:请求中缺少参数。',
 'api-error-missingresult' => '内部错误:无法确定是否复制成功。',
@@ -3813,23 +3836,23 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'api-error-overwrite' => '不允许覆盖现有文件。',
 'api-error-stashfailed' => '内部错误:服务器保存临时文件失败。',
 'api-error-timeout' => '服务器没有在预期内响应。',
-'api-error-unclassified' => 'å\8f\91ç\94\9fæ\9cªç\9f¥é\94\99误',
+'api-error-unclassified' => 'å\87ºç\8e°æ\9cªç\9f¥é\94\99误ã\80\82',
 'api-error-unknown-code' => '未知错误:$1',
 'api-error-unknown-error' => '内部错误:尝试上传文件时出错。',
 'api-error-unknown-warning' => '未知的警告:$1',
 'api-error-unknownerror' => '未知错误:$1。',
-'api-error-uploaddisabled' => '这个维基不接受上传。',
+'api-error-uploaddisabled' => '此wiki关闭了上传功能。',
 'api-error-verification-error' => '此文件可能已损坏,或有错误的扩展名。',
 
 # Durations
-'duration-seconds' => '$1{{PLURAL:$1|秒|秒}}',
-'duration-minutes' => '$1{{PLURAL:$1|分钟|分钟}}',
-'duration-hours' => '$1{{PLURAL:$1|小时|小时}}',
-'duration-days' => '$1{{PLURAL:$1|天|天}}',
-'duration-weeks' => '$1{{PLURAL:$1|星期|星期}}',
-'duration-years' => '$1{{PLURAL:$1|年|年}}',
-'duration-decades' => '$1{{PLURAL:$1|0年|0年}}',
-'duration-centuries' => '$1{{PLURAL:$1|00年|00年}}',
-'duration-millennia' => '$1{{PLURAL:$1|千年|千年}}',
+'duration-seconds' => '$1',
+'duration-minutes' => '$1',
+'duration-hours' => '$1小时',
+'duration-days' => '$1',
+'duration-weeks' => '$1',
+'duration-years' => '$1',
+'duration-decades' => '$10年',
+'duration-centuries' => '$1个世纪',
+'duration-millennia' => '$1千年',
 
 );
index 6400811..27f19e8 100644 (file)
@@ -33,6 +33,7 @@
  * @author PhiLiP
  * @author Philip
  * @author Shinjiman
+ * @author Shirayuki
  * @author Shizhao
  * @author Simon Shek
  * @author Skjackey tse
@@ -213,10 +214,10 @@ $messages = array(
 'tog-underline' => '連結加底線:',
 'tog-justify' => '段落對齊',
 'tog-hideminor' => '最近更改中隱藏小修改',
-'tog-hidepatrolled' => 'æ\96¼æ\9c\80è¿\91æ\9b´æ\94¹ä¸­é\9a±è\97\8få·¡æ\9f¥é\81\8eç\9a\84編輯',
-'tog-newpageshidepatrolled' => 'æ\96¼æ\96°é \81é\9d¢æ¸\85å\96®ä¸­é\9a±è\97\8få·¡æ\9f¥é\81\8eç\9a\84é \81é\9d¢',
+'tog-hidepatrolled' => '最近更改中隱藏巡查過的編輯',
+'tog-newpageshidepatrolled' => '新頁面清單中隱藏巡查過的頁面',
 'tog-extendwatchlist' => '展開監視清單以顯示所有更改,不只是最近的',
-'tog-usenewrc' => '使用增強最近更改 (需要JavaScript)',
+'tog-usenewrc' => '在最近更改和監視列表中整合同一頁的修改 (需要JavaScript)',
 'tog-numberheadings' => '標題自動編號',
 'tog-showtoolbar' => '顯示編輯工具欄 (需要JavaScript)',
 'tog-editondblclick' => '雙擊編輯頁面 (需要JavaScript)',
@@ -224,17 +225,17 @@ $messages = array(
 'tog-editsectiononrightclick' => '允許右擊標題編輯段落 (需要JavaScript)',
 'tog-showtoc' => '顯示目錄 (針對一頁超過3個標題的頁面)',
 'tog-rememberpassword' => '在這個瀏覽器上記住我的登入資訊(可維持 $1 {{PLURAL:$1|天|天}})',
-'tog-watchcreations' => '將我建立的頁面添加到我的監視列表中',
-'tog-watchdefault' => '將我更改的頁面添加到我的監視列表中',
-'tog-watchmoves' => 'å°\87æ\88\91移å\8b\95ç\9a\84é \81é\9d¢å\8a å\85¥我的監視列表',
-'tog-watchdeletion' => 'å°\87æ\88\91å\88ªé\99¤ç\9a\84é \81é\9d¢å\8a å\85¥我的監視列表',
+'tog-watchcreations' => '將我建立的頁面和檔案添加到我的監視列表中',
+'tog-watchdefault' => '將我更改的頁面和檔案添加到我的監視列表中',
+'tog-watchmoves' => 'å°\87æ\88\91移å\8b\95ç\9a\84é \81é\9d¢å\92\8cæª\94æ¡\88æ·»å\8a å\88°我的監視列表',
+'tog-watchdeletion' => 'å°\87æ\88\91å\88ªé\99¤ç\9a\84é \81é\9d¢å\92\8cæª\94æ¡\88æ·»å\8a å\88°我的監視列表',
 'tog-minordefault' => '預設將編輯設定為小編輯',
 'tog-previewontop' => '在編輯框上方顯示預覽',
-'tog-previewonfirst' => '第一次編輯時顯示原文內容的預覽',
+'tog-previewonfirst' => '第一次編輯時顯示預覽',
 'tog-nocache' => '禁止瀏覽器頁面快取',
-'tog-enotifwatchlistpages' => '當在我的監視列表中的頁面改變時發電子郵件給我',
-'tog-enotifusertalkpages' => '當我的對話頁發生改變時發電子郵件給我',
-'tog-enotifminoredits' => '即使是頁面的小修改也向我發電子郵件',
+'tog-enotifwatchlistpages' => 'ç\95¶å\9c¨æ\88\91ç\9a\84ç\9b£è¦\96å\88\97表中ç\9a\84é \81é\9d¢æ\88\96æª\94æ¡\88æ\94¹è®\8aæ\99\82ç\99¼é\9b»å­\90é\83µä»¶çµ¦æ\88\91',
+'tog-enotifusertalkpages' => '當我的對話頁更改時發電子郵件給我',
+'tog-enotifminoredits' => '即使是頁面和檔案的小修改也向我發電子郵件',
 'tog-enotifrevealaddr' => '在通知電子郵件中顯示我的電子郵件位址',
 'tog-shownumberswatching' => '顯示監視用戶的數目',
 'tog-oldsig' => '原有簽名:',
@@ -250,9 +251,8 @@ $messages = array(
 'tog-watchlisthideliu' => '監視列表中隱藏登入用戶',
 'tog-watchlisthideanons' => '監視列表中隱藏匿名用戶',
 'tog-watchlisthidepatrolled' => '監視清單中隱藏已巡查的編輯',
-'tog-nolangconversion' => '不進行用字轉換',
-'tog-ccmeonemails' => '當我寄電子郵件給其他用戶時,也寄一份複本到我的信箱。',
-'tog-diffonly' => '在比較兩個修訂版本差異時不顯示頁面內容',
+'tog-ccmeonemails' => '當我寄電子郵件給其他用戶時,也寄一份複本到我的信箱',
+'tog-diffonly' => '比較版本差異時不顯示頁面內容',
 'tog-showhiddencats' => '顯示隱藏分類',
 'tog-noconvertlink' => '不轉換連結標題',
 'tog-norollbackdiff' => '進行回退後略過差異比較',
@@ -426,16 +426,16 @@ $messages = array(
 'viewtalkpage' => '檢視討論頁面',
 'otherlanguages' => '其他語言',
 'redirectedfrom' => '(重定向自$1)',
-'redirectpagesub' => '重定向頁',
+'redirectpagesub' => '重定向頁',
 'lastmodifiedat' => '此頁面最後修訂於 $1 $2。',
 'viewcount' => '本頁面已經被瀏覽$1次。',
 'protectedpage' => '受保護頁面',
 'jumpto' => '跳轉到:',
 'jumptonavigation' => '導覽',
 'jumptosearch' => '搜尋',
-'view-pool-error' => '抱歉,伺服器在這段時間中已經超出負荷。
-太多用戶嘗試檢視這個頁面
-在嘗試訪問這個頁面之前請再稍等一會
+'view-pool-error' => '抱歉,現時伺服器已超出負荷。
+太多用戶正嘗試檢視此頁
+請稍等一會後再次訪問此頁
 
 $1',
 'pool-timeout' => '等待鎖死時超時',
@@ -457,7 +457,7 @@ $1',
 'mainpage' => '首頁',
 'mainpage-description' => '首頁',
 'policy-url' => 'Project:方針',
-'portal' => '社群入口',
+'portal' => '社群主頁',
 'portal-url' => 'Project:社區主頁',
 'privacy' => '隱私權政策',
 'privacypage' => 'Project:隱私權政策',
@@ -467,13 +467,18 @@ $1',
 'badaccess-groups' => '您剛才的請求只有{{PLURAL:$2|這個|這些}}用戶組的用戶才能使用:$1',
 
 'versionrequired' => '需要MediaWiki $1 版',
-'versionrequiredtext' => '需要版本$1的 MediaWiki 才能使用此頁。參見[[Special:Version|版本頁]]。',
+'versionrequiredtext' => '需要版本$1的 MediaWiki 才能使用此頁。
+參見[[Special:Version|版本頁]]。',
 
 'ok' => '確定',
 'retrievedfrom' => '取自「$1」',
 'youhavenewmessages' => '您有$1($2)。',
 'newmessageslink' => '新訊息',
-'newmessagesdifflink' => '上次更改',
+'newmessagesdifflink' => '最後更改',
+'youhavenewmessagesfromusers' => '你有來自{{PLURAL:$3| 另一位用戶| $3位用戶}}的$1 ( $2 )。',
+'youhavenewmessagesmanyusers' => '你有來自多位用戶的$1( $2 )。',
+'newmessageslinkplural' => '$1項新訊息',
+'newmessagesdifflinkplural' => '最新$1次更改',
 'youhavenewmessagesmulti' => '您在 $1 有一條新訊息',
 'editsection' => '編輯',
 'editold' => '編輯',
@@ -510,7 +515,7 @@ $1',
 'nstab-mediawiki' => '訊息',
 'nstab-template' => '模板',
 'nstab-help' => '幫助頁面',
-'nstab-category' => '類別',
+'nstab-category' => '分類',
 
 # Main script and global functions
 'nosuchaction' => '這個命令不存在',
@@ -528,10 +533,10 @@ $1',
 'dberrortext' => '發生資料庫查詢語法錯誤。
 可能是由於軟體自身的錯誤所引起。
 最後一次資料庫查詢指令是:
-<blockquote><tt>$1</tt></blockquote>
-來自於函數 "<tt>$2</tt>"。
-數據庫返回錯誤 "<tt>$3: $4</tt>"。',
-'dberrortextcl' => '發生了一個資料庫查詢語法錯誤。
+<blockquote><code>$1</code></blockquote>
+來自於函數 "<code>$2</code>"。
+數據庫返回錯誤 "<samp>$3: $4</samp>"。',
+'dberrortextcl' => '發生資料庫查詢語法錯誤。
 最後一次的資料庫查詢是:
 「$1」
 來自於函數「$2」。
@@ -567,6 +572,8 @@ $1',
 'cannotdelete' => '無法刪除頁面或圖片"$1"。
 它可能已經被其他人刪除了。',
 'cannotdelete-title' => '無法刪除“$1”',
+'delete-hook-aborted' => '刪除被勾點中止。
+它沒有提供解釋。',
 'badtitle' => '錯誤的標題',
 'badtitletext' => '所請求頁面的標題是無效的、不存在,跨語言或跨wiki連結的標題錯誤。它可能包含一個或更多的不能用於標題的字符。',
 'perfcached' => '下列是快取資料,因此可能不是最新的。最多{{PLURAL:$1|只有1個結果|$1個結果}}可用。',
@@ -596,6 +603,8 @@ $2',
 管理員鎖定它的解釋是:" $3 "。',
 'invalidtitle-knownnamespace' => '使用名字空間“$2”和文本“$3”的無效標題',
 'invalidtitle-unknownnamespace' => '使用未知名字空間編號$1和文本“$2”的無效標題',
+'exception-nologin' => '未登入',
+'exception-nologin-text' => '你需要登錄此wiki查閲此頁或進行操作。',
 
 # Virus scanner
 'virus-badscanner' => "損壞設定: 未知的病毒掃瞄器: ''$1''",
@@ -616,6 +625,7 @@ $2',
 'remembermypassword' => '在這個瀏覽器上記住我的登入資訊(可維持 $1 {{PLURAL:$1|天|天}})',
 'securelogin-stick-https' => '登入後繼續以HTTPS連接',
 'yourdomainname' => '您的網域:',
+'password-change-forbidden' => '您不可更改此wiki上的密碼。',
 'externaldberror' => '這可能是由於驗證資料庫錯誤或您被禁止更新您的外部賬號。',
 'login' => '登入',
 'nav-login-createaccount' => '登入/建立新帳號',
@@ -844,16 +854,19 @@ $2
 或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯此頁]</span>。',
 'noarticletext-nopermission' => '此頁目前沒有內容,您可以在其它頁[[Special:Search/{{PAGENAME}}|搜索此頁標題]],
 或<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索有關日誌]</span>。',
+'missing-revision' => '「{{PAGENAME}}」的#$1修訂版本不存在。
+
+這通常是因為過時的頁面歷史鏈接被刪除。
+詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。',
 'userpage-userdoesnotexist' => '未曾創建用戶名「<nowiki>$1</nowiki>」。請在創建/編輯這個頁面前先檢查一下。',
 'userpage-userdoesnotexist-view' => '未曾建立用戶名「$1」。',
 'blocked-notice-logextract' => '這位用戶現正被封鎖。
 下面有最近的封鎖紀錄以供參考:',
-'clearyourcache' => "'''注意:在保存以後,您必須繞過瀏覽器緩存才能看到所作出的改變。'''
-* '''火狐(Firefox)/Safari''':按住“Shift”鍵再點擊“刷新”,或按下“Ctrl-F5”或“Ctrl-R”(Mac上為“⌘-R”)
-* '''谷歌瀏覽器(Google Chrome)''':按下“Ctrl-Shift-R”(Mac上為“⌘-Shift-R”)
-* '''Internet Explorer''':按住“Ctrl”鍵再點擊“刷新”,或按下“Ctrl-F5”
-* '''Konqueror''':點擊“刷新”或按下“F5”
-* '''Opera''':在“工具→首選項”中清除緩存",
+'clearyourcache' => "'''注意:'''在保存以後,您必須繞過瀏覽器緩存才能看到所作出的改變。
+* '''火狐(Firefox)/Safari:'''按住“Shift”鍵再點擊“刷新”,或按下“Ctrl-F5”或“Ctrl-R”(Mac上為“⌘-R”)
+* '''谷歌瀏覽器(Google Chrome):'''按下“Ctrl-Shift-R”(Mac上為“⌘-Shift-R”)
+* '''Internet Explorer:'''按住“Ctrl”鍵再點擊“刷新”,或按下“Ctrl-F5”
+* '''Opera:'''在“工具→首選項”中清除緩存",
 'usercssyoucanpreview' => "'''提示:''' 在保存前請用「{{int:showpreview}}」按鈕來測試您新的 CSS 。",
 'userjsyoucanpreview' => "'''提示:''' 在保存前請用「{{int:showpreview}}」按鈕來測試您新的 JavaScript 。",
 'usercsspreview' => "'''記住您只是在預覽您的個人 CSS。'''
@@ -970,6 +983,7 @@ $2
 'expansion-depth-exceeded-warning' => '頁面超出擴展深度',
 'parser-unstrip-loop-warning' => '檢測到迴圈',
 'parser-unstrip-recursion-limit' => '遞歸超過限制 ($1)',
+'converter-manual-rule-error' => '手動語言轉換規則中檢測到錯誤',
 
 # "Undo" feature
 'undo-success' => '該編輯可以被撤銷。請檢查以下對比以核實這正是您想做的,然後儲存以下更改以完成撤銷編輯。',
@@ -1138,6 +1152,10 @@ $1",
 'editundo' => '撤銷',
 'diff-multi' => '(由{{PLURAL:$2|1名用戶|$2名用戶}}作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}}未被顯示)',
 'diff-multi-manyusers' => '(由多於$2名用戶作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}} 未被顯示)',
+'difference-missing-revision' => '{{PLURAL:$2|1次修訂|$2 次修訂}}差異($1)不存在。
+
+這通常是因為過時的頁面修訂差異鏈接被刪除。
+詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。',
 
 # Search results
 'searchresults' => '搜尋結果',
@@ -1294,7 +1312,7 @@ $1",
 'prefs-memberingroups' => '{{PLURAL:$1|群組}}:',
 'prefs-registration' => '註冊時間:',
 'yourrealname' => '真實姓名:',
-'yourlanguage' => '介面語言:',
+'yourlanguage' => '語言:',
 'yourvariant' => '內容語言變體:',
 'prefs-help-variant' => '您希望用於顯示本站內容的語種或拼寫語系。',
 'yournick' => '新簽名:',
@@ -1403,13 +1421,14 @@ $1",
 'right-writeapi' => '使用API編寫',
 'right-delete' => '刪除頁面',
 'right-bigdelete' => '刪除大量歷史之頁面',
-'right-deleterevision' => '刪除及同反刪除頁面中的指定修訂',
+'right-deletelogentry' => '刪除及恢復特定的日誌項目',
+'right-deleterevision' => '刪除及同恢復頁面中的指定修訂',
 'right-deletedhistory' => '檢視已刪除之歷史項目,不含關聯的文本',
 'right-deletedtext' => '檢視已刪除修訂中之已刪除的字以及更改',
 'right-browsearchive' => '搜尋已刪除之頁面',
 'right-undelete' => '反刪除頁面',
 'right-suppressrevision' => '檢視及恢復由操作員隱藏之修訂',
-'right-suppressionlog' => '檢視私人的日誌',
+'right-suppressionlog' => '檢視非公開的日誌',
 'right-block' => '封鎖其他用戶防止編輯',
 'right-blockemail' => '封鎖用戶不可發電郵',
 'right-hideuser' => '封鎖用戶名,對公眾隱藏',
@@ -1548,9 +1567,9 @@ $1",
 要檢視或搜尋以前上傳的檔案,可以進入[[Special:FileList|檔案上傳清單]],(重新)上傳也將在[[Special:Log/upload|上傳日誌]]中記錄,而刪除將在[[Special:Log/delete|刪除日誌]]中記錄。
 
 要在頁面中加入檔案,使用以下其中一種形式的連結:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''使用檔案的完整版本
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替換文字]]</nowiki></tt>'''使用放置於左側的一個框內的 200 像素寬的圖片,同時使用「替換文字」作為描述
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''直接連結到檔案而不顯示檔案",
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''使用檔案的完整版本
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替換文字]]</nowiki></code>'''使用放置於左側的一個框內的 200 像素寬的圖片,同時使用「替換文字」作為描述
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''直接連結到檔案而不顯示檔案",
 'upload-permitted' => '准許的檔案類型: $1。',
 'upload-preferred' => '建議的檔案類型: $1。',
 'upload-prohibited' => '禁止的檔案類型: $1。',
@@ -1594,17 +1613,17 @@ $1",
 'largefileserver' => '這個檔案的大小比伺服器配置允許的大小還要大。',
 'emptyfile' => '您所上傳的檔案不存在。這可能是由於檔案名鍵入錯誤。請檢查您是否真的要上傳此檔案。',
 'windows-nonascii-filename' => '本維基不支持帶特殊字符的檔案名。',
-'fileexists' => "已存在相同名稱的檔案,如果您無法確定您是否要改變它,請檢查'''<tt>[[:$1]]</tt>'''。 [[$1|thumb]]",
-'filepageexists' => "這個檔案的描述頁已於'''<tt>[[:$1]]</tt>'''建立,但是這個名稱的檔案尚未存在。因此您所輸入的摘要不會顯示在該描述頁中。如要摘要在該處中出現,您必需手動編輯它。
-[[$1|thumb]]",
-'fileexists-extension' => "一個相似檔名的檔案已經存在: [[$2|thumb]]
-* 上載檔案的檔名: '''<tt>[[:$1]]</tt>'''
-* 現有檔案的檔名: '''<tt>[[:$2]]</tt>'''
-請選擇一個不同的名字。",
+'fileexists' => '已存在相同名稱的檔案,如果您無法確定您是否要改變它,請檢查<strong>[[:$1]]</strong>。 [[$1|thumb]]',
+'filepageexists' => '這個檔案的描述頁已於<strong>[[:$1]]</strong>建立,但是這個名稱的檔案尚未存在。因此您所輸入的摘要不會顯示在該描述頁中。如要摘要在該處中出現,您必需手動編輯它。
+[[$1|thumb]]',
+'fileexists-extension' => '一個相似檔名的檔案已經存在: [[$2|thumb]]
+* 上載檔案的檔名: <strong>[[:$1]]</strong>
+* 現有檔案的檔名: <strong>[[:$2]]</strong>
+請選擇一個不同的名字。',
 'fileexists-thumbnail-yes' => "這個檔案好像是一幅圖片的縮圖版本''(縮圖)''。 [[$1|thumb]]
-請檢查清楚該檔案'''<tt>[[:$1]]</tt>'''
+請檢查清楚該檔案<strong>[[:$1]]</strong>
 如果檢查後的檔案是同原本圖片的大小是一樣的話,就不用再上載多一幅縮圖。",
-'file-thumbnail-no' => "此圖片的檔案名稱以'''<tt>$1</tt>'''開始。它好像某幅圖片的縮小版本''(縮圖)''。
+'file-thumbnail-no' => "此圖片的檔案名稱以<strong>$1</strong>開始。它好像某幅圖片的縮小版本''(縮圖)''。
 如果{{GENDER:|你|妳|你}}有該圖片的完整大小版本,請上載它;否則請修改檔名。",
 'fileexists-forbidden' => '已存在相同名稱的檔案,且不能覆蓋;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => '在共享檔案庫中已存在此名稱的檔案。
@@ -1695,6 +1714,7 @@ $1',
 'lockmanager-fail-releaselock' => '無法為「$1」釋放鎖。',
 'lockmanager-fail-db-bucket' => '不能在$1池中聯繫到足夠鎖數據庫。',
 'lockmanager-fail-db-release' => '不能在數據庫$1上釋放鎖。',
+'lockmanager-fail-svr-acquire' => '無法取得伺服器$1上的鎖。',
 'lockmanager-fail-svr-release' => '不能在服務器$1上釋放鎖。',
 
 # ZipDirectoryReader
@@ -1803,15 +1823,16 @@ $1',
 'sharedupload-desc-here' => '該檔案來自於$1,它可能在其它計劃項目中被應用。
 它在[$2 檔案描述頁面]那邊上的描述於下面顯示。',
 'sharedupload-desc-edit' => '該檔案來自$1,它可能在其它計劃項目中被使用。
-或許您可以在其[$2 檔ð£\97\88æ\8f\8fè¿°é \81é\9d¢]ä¸\8a編輯說æ\98\8eã\80\82',
+或許您可以在其[$2 檔æ¡\88æ\8f\8fè¿°é \81é\9d¢]ä¸\8a編輯說æ\98\8eã\80\82',
 'sharedupload-desc-create' => '該檔案來自$1,它可能在其它計劃項目中被使用。
-或許您可以在那邊的[$2 檔ð£\97\88æ\8f\8fè¿°é \81é\9d¢]ä¸\8a編輯å\85¶èªªæ\98\8eã\80\82',
+或許您可以在那邊的[$2 檔æ¡\88æ\8f\8fè¿°é \81é\9d¢]ä¸\8a編輯å\85¶èªªæ\98\8eã\80\82',
 'filepage-nofile' => '不存在此名稱的檔案。',
 'filepage-nofile-link' => '不存在此名稱的檔案,但您可以[$1 上傳它]。',
 'uploadnewversion-linktext' => '上傳該檔案的新版本',
 'shared-repo-from' => '出自$1',
 'shared-repo' => '一個共用檔案庫',
 'shared-repo-name-wikimediacommons' => '維基共享資源',
+'upload-disallowed-here' => '您不可以覆蓋此圖像。',
 
 # File reversion
 'filerevert' => '恢復$1',
@@ -1846,7 +1867,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'MIME 搜尋',
-'mimesearch-summary' => '本頁面啟用檔案MIME類型過濾器。輸入︰內容類型/子類型,如 <tt>image/jpeg</tt>。',
+'mimesearch-summary' => '本頁面啟用檔案MIME類型過濾器。輸入︰內容類型/子類型,如 <code>image/jpeg</code>。',
 'mimetype' => 'MIME 類型:',
 'download' => '下載',
 
@@ -1898,7 +1919,7 @@ Template:消歧义
 Template:消除歧义
 Template:消歧義
 Template:消除歧義',
-'disambiguations-text' => "以下的頁面都有到'''消歧義頁'''的鏈接,但它們應該鏈接到適當的頁面。<br />一個頁面如果使用了[[MediaWiki:Disambiguationspage]]內的模板,則會被視為消歧義頁。",
+'disambiguations-text' => "以下的頁面都有至少一個連到'''消歧義頁'''的鏈接,但它們應鏈接到合適的頁面。<br />一個頁面如果使用了[[MediaWiki:Disambiguationspage]]內的模板,則會被視為消歧義頁。",
 
 'doubleredirects' => '雙重重定向頁面',
 'doubleredirectstext' => '這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結,以及第二個重定向頁面的目標,通常顯示的都會是"真正"的目標頁面,也就是第一個重定向頁面應該指向的頁面。
@@ -1922,6 +1943,7 @@ Template:消除歧義',
 # Miscellaneous special pages
 'nbytes' => '$1位元組',
 'ncategories' => '$1個分類',
+'ninterwikis' => '$1 個跨維基',
 'nlinks' => '$1個連結',
 'nmembers' => '$1個成員',
 'nrevisions' => '$1個修訂',
@@ -1950,6 +1972,7 @@ Template:消除歧義',
 'mostlinkedtemplates' => '最多連結模板',
 'mostcategories' => '最多分類頁面',
 'mostimages' => '最多連結檔案',
+'mostinterwikis' => '最多跨維基頁面',
 'mostrevisions' => '最多修訂頁面',
 'prefixindex' => '所有有前綴的頁面',
 'prefixindex-namespace' => '帶有前綴的頁面(屬於$1名字空間)',
@@ -1999,7 +2022,7 @@ Template:消除歧義',
 'specialloguserlabel' => '操作者:',
 'speciallogtitlelabel' => '目標(標題或用戶):',
 'log' => '日誌',
-'all-logs-page' => '所有公日誌',
+'all-logs-page' => '所有公日誌',
 'alllogstext' => '綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。',
 'logempty' => '在日誌中不存在匹配項。',
 'log-title-wildcard' => '搜尋以這個文字開始的標題',
@@ -2048,7 +2071,7 @@ Template:消除歧義',
 'linksearch-ns' => '名字空間:',
 'linksearch-ok' => '搜尋',
 'linksearch-text' => '製作可以使用類似“*.wikipedia.org”的通配符。必須至少是頂級域名,例如“*.org”。<br />
-支持的協議:<tt>$1</tt>(不要包含在搜索中)。',
+支持的協議:<code>$1</code>(不要包含在搜索中)。',
 'linksearch-line' => '$1 連自 $2',
 'linksearch-error' => '萬用字元僅可在主機名稱的開頭使用。',
 
@@ -2061,7 +2084,7 @@ Template:消除歧義',
 # Special:ActiveUsers
 'activeusers' => '活躍用戶列表',
 'activeusers-intro' => '這個是在最近$1天之內有一些動作的用戶列表。',
-'activeusers-count' => 'æ\96¼$3天å\85§ç\9a\84$1次編輯',
+'activeusers-count' => 'æ\9c\80è¿\91$3天å\85§æ\9c\89$1次編輯',
 'activeusers-from' => '顯示用戶開始於:',
 'activeusers-hidebots' => '隱藏機器人',
 'activeusers-hidesysops' => '隱藏管理員',
@@ -2096,6 +2119,8 @@ Template:消除歧義',
 並在[[Special:Preferences|偏好設定]]
 中有一個有效的 e-mail 地址才可以電郵其他用戶。',
 'emailuser' => 'E-mail該用戶',
+'emailuser-title-target' => '電郵這位{{GENDER:$1|用戶}}',
+'emailuser-title-notarget' => 'E-mail用戶',
 'emailpage' => 'E-mail用戶',
 'emailpagetext' => '您可以用下面的表格去寄一封電郵給這位用戶。
 您在[[Special:Preferences|您的參數設置]]中所輸入的電子郵件地址將出現在郵件「發件人」一欄中,這樣該用戶就可以回覆您。',
@@ -2170,8 +2195,8 @@ Template:消除歧義',
 'changed' => '更改',
 'created' => '建立了',
 'enotif_subject' => '{{SITENAME}}頁面“$PAGETITLE”已被$PAGEEDITOR$CHANGEDORCREATED',
-'enotif_lastvisited' => '檢視您上次訪問後的所有更改請參閱$1。',
-'enotif_lastdiff' => '檢視更改請參閱$1。',
+'enotif_lastvisited' => '請參閱 $1 檢視你上次訪問後的所有更改。',
+'enotif_lastdiff' => '請參閱 $1 檢視該更改。',
 'enotif_anon_editor' => '匿名用戶$1',
 'enotif_body' => '親愛的$WATCHINGUSERNAME:
 
@@ -2239,6 +2264,8 @@ $UNWATCHURL
 'rollback' => '恢復編輯',
 'rollback_short' => '恢復',
 'rollbacklink' => '恢復',
+'rollbacklinkcount' => '恢復 $1 次編輯',
+'rollbacklinkcount-morethan' => '恢復多過 $1 次編輯',
 'rollbackfailed' => '無法恢復',
 'cantrollback' => '無法恢復編輯;最後的貢獻者是本文的唯一作者。',
 'alreadyrolled' => '無法回退由[[User:$2|$2]]([[User talk:$2|討論]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]在[[:$1]]上的編輯;其他人已經編輯或者回退了該頁。
@@ -2513,8 +2540,8 @@ $1被封禁的理由是“$2”',
 'blocklogpage' => '查封日誌',
 'blocklog-showlog' => '這位用戶曾經被封鎖過。在下列提供封鎖記錄以便參考:',
 'blocklog-showsuppresslog' => '這位用戶曾經被封鎖和隱藏過。在下列提供廢止記錄以便參考:',
-'blocklogentry' => 'å·²å°\81ç¦\81â\80\9c[[$1]]â\80\9d $3è\80\8cçµ\82æ­¢æ\99\82é\96\93ç\82º$2',
-'reblock-logentry' => '更改[[$1]]的封禁設定時間 $2 $3',
+'blocklogentry' => 'å°\81ç¦\81[[$1]]ï¼\8cå\88°æ\9c\9fæ\99\82é\96\93ç\88²$2$3',
+'reblock-logentry' => '更改[[$1]]的封禁設置,到期時間爲$2$3',
 'blocklogtext' => '這是關於用戶封禁和解除封禁操作的記錄。被自動封禁的IP地址沒有被列出。請參閱[[Special:BlockList|被查封的IP地址和用戶列表]]。',
 'unblocklogentry' => '已解封 $1',
 'block-log-flags-anononly' => '僅限匿名用戶',
@@ -2670,13 +2697,11 @@ $1被封禁的理由是“$2”',
 
 # Export
 'export' => '匯出頁面',
-'exporttext' => '您可以將特定頁面或一組頁面的文字以及編輯歷史以 XML 格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行 MediaWiki 的網站。
+'exporttext' => '您可以將特定頁面或一組頁面的文字以及編輯歷史以XML格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行MediaWiki的網站。
 
-要匯出頁面,請在下面的文字框中輸入頁面標題,每行一個標題,
-並選擇{{GENDER:|你|妳|你}}是否需要匯出帶有頁面歷史的以前的修訂版本,
-或是只選擇匯出帶有最後一次編輯訊息的目前修訂版本。
+要匯出頁面,請在下面的文字框中輸入頁面標題,每行一個標題,並選擇{{GENDER:|你|妳|你}}是否需要匯出帶有頁面歷史的以前的修訂版本,或是只選擇匯出帶有最後一次編輯訊息的目前修訂版本。
 
-此外{{GENDER:|你|妳|你}}還可以利用連結匯出檔案,例如{{GENDER:|你|妳|你}}可以使用 [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] 匯出「[[{{MediaWiki:Mainpage}}]]」頁面。',
+此外{{GENDER:|你|妳|你}}還可以利用連結匯出檔案,例如{{GENDER:|你|妳|你}}可以使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]匯出「[[{{MediaWiki:Mainpage}}]]」頁面。',
 'exportall' => '導出所有頁面',
 'exportcuronly' => '僅包含目前的修訂,而不是全部的歷史。',
 'exportnohistory' => "----
@@ -2733,6 +2758,7 @@ $1被封禁的理由是“$2”',
 'import-interwiki-templates' => '包含所有模板',
 'import-interwiki-submit' => '匯入',
 'import-interwiki-namespace' => '目的名字空間:',
+'import-interwiki-rootpage' => '目標根頁(可選):',
 'import-upload-filename' => '檔案名稱:',
 'import-comment' => '註解:',
 'importtext' => '請使用[[Special:Export|匯出功能]]從來源維基匯出檔案,
@@ -2765,6 +2791,9 @@ $1被封禁的理由是“$2”',
 'import-error-interwiki' => '頁面"$1"未能導入,這是因為他的頁面名稱預留了供跨維基連結使用。',
 'import-error-special' => '"$1"未能導入因為該頁面使用一個不能創建頁面的特殊名字空間。',
 'import-error-invalid' => '"$1"不能導入,因為名字無效。',
+'import-options-wrong' => '{{PLURAL:$2|選項}}出錯:<nowiki>$1</nowiki>',
+'import-rootpage-invalid' => '指定的根頁標題無效。',
+'import-rootpage-nosubpage' => '名字空間「$1」的根頁面不允許子頁面。',
 
 # Import log
 'importlogpage' => '匯入日誌',
@@ -2912,16 +2941,34 @@ $1被封禁的理由是“$2”',
 
 # Info page
 'pageinfo-title' => '" $1 "的信息',
-'pageinfo-header-edits' => '編輯',
-'pageinfo-header-watchlist' => '監視列表',
-'pageinfo-header-views' => '檢視',
-'pageinfo-subjectpage' => '頁',
-'pageinfo-talkpage' => '討論頁',
-'pageinfo-watchers' => '監視者數目',
-'pageinfo-edits' => '編輯次數',
-'pageinfo-authors' => '作者數',
+'pageinfo-header-basic' => '基本資料',
+'pageinfo-header-edits' => '編輯歷史',
+'pageinfo-header-restrictions' => '保護頁面',
+'pageinfo-header-properties' => '頁面屬性',
+'pageinfo-display-title' => '顯示標題',
+'pageinfo-default-sort' => '預設排序字:',
+'pageinfo-length' => '頁面長度 (以位元組為單位)',
+'pageinfo-article-id' => '頁面編號',
+'pageinfo-robot-policy' => '搜尋引擎狀態',
+'pageinfo-robot-index' => '可索引',
+'pageinfo-robot-noindex' => '不可索引',
 'pageinfo-views' => '觀看次數',
-'pageinfo-viewsperedit' => '每次編輯檢視數',
+'pageinfo-watchers' => '頁面監視者數目',
+'pageinfo-redirects-name' => '重定向到此頁',
+'pageinfo-subpages-name' => '此頁面的子頁面',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|重定向|重定向}}; $3 {{PLURAL:$3|非重定向|非重定向}})',
+'pageinfo-firstuser' => '頁面的建立者',
+'pageinfo-firsttime' => '頁面創建日期',
+'pageinfo-lastuser' => '最近編者',
+'pageinfo-lasttime' => '最新編輯日期',
+'pageinfo-edits' => '編輯總次數',
+'pageinfo-authors' => '作者總數',
+'pageinfo-recent-edits' => '最近編輯次數 (過去 $1 內)',
+'pageinfo-recent-authors' => '最近作者數目',
+'pageinfo-restriction' => '保護頁面 ( <code>{{lcfirst:$1}}</code> )',
+'pageinfo-magic-words' => '魔術{{PLURAL:$1|字|字}} ( $1 )',
+'pageinfo-hidden-categories' => '隱藏{{PLURAL:$1|分類|分類}} ( $1 )',
+'pageinfo-templates' => '被引用的{{PLURAL:$1|模版|模版}} ( $1 )',
 
 # Skin names
 'skinname-standard' => '標準',
@@ -2972,6 +3019,7 @@ $1',
 'file-info-size-pages' => '$1 × $2像素,檔案大小: $3,檔案類型: $4, $5 {{PLURAL:$5|頁|頁}}',
 'file-nohires' => '無更高解像度可提供。',
 'svg-long-desc' => 'SVG 檔案,表面大小:$1 × $2 像素,檔案大小:$3',
+'svg-long-desc-animated' => 'SVG 動畫檔案,表面大小:$1 × $2 像素,檔案大小:$3',
 'show-big-image' => '完整解像度',
 'show-big-image-preview' => '此預覽的大小:$1.',
 'show-big-image-other' => '其他{{PLURAL:$2||}}解析度:$1。',
@@ -2981,6 +3029,8 @@ $1',
 'file-info-png-looped' => '循環',
 'file-info-png-repeat' => '已播放$1次',
 'file-info-png-frames' => '$1幀',
+'file-no-thumb-animation' => "'''注意: 由於技術限制,不能播放此檔案縮圖的動畫。'''",
+'file-no-thumb-animation-gif' => "'''注意: 由於技術限制,不能播放此高解析度GIF圖像縮圖的動畫。'''",
 
 # Special:NewFiles
 'newimages' => '新建圖片畫廊',
@@ -3666,7 +3716,7 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 * <span class="mw-specialpagecached">用於重新整理的特殊頁面(可能過時)。</span>',
 'specialpages-group-maintenance' => '維護報告',
 'specialpages-group-other' => '其它特殊頁面',
-'specialpages-group-login' => '登入/創建',
+'specialpages-group-login' => '登入/建立新帳號',
 'specialpages-group-changes' => '最近更改和日誌',
 'specialpages-group-media' => '媒體報告和上傳',
 'specialpages-group-users' => '用戶和權限',
@@ -3800,9 +3850,12 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'api-error-empty-file' => '您提交的檔案是空的。',
 'api-error-emptypage' => '不許創建沒有內容的新頁面。',
 'api-error-fetchfileerror' => '內部錯誤:獲取文件時發生錯誤。',
+'api-error-fileexists-forbidden' => '以" $1 "命名的檔案已經存在,並且不能被重寫。',
+'api-error-fileexists-shared-forbidden' => '以" $1 "命名的檔案已經存在於共用檔案儲存庫上,並且不能被重寫。',
 'api-error-file-too-large' => '您提交的檔案太大了。',
 'api-error-filename-tooshort' => '檔案名過短。',
 'api-error-filetype-banned' => '這種類型的檔案是被禁止的。',
+'api-error-filetype-banned-type' => '$1{{PLURAL:$4|不是允許的檔案類型|不是允許的檔案類型}}。  允許的{{PLURAL:$3|檔案類型是|檔案類型是}} $2。',
 'api-error-filetype-missing' => '本檔案缺少了副檔名。',
 'api-error-hookaborted' => '你試圖進行的修改被一個擴展鉤子終止。',
 'api-error-http' => '內部錯誤:無法連接到伺服器。',
index 8a53bdf..1fbc434 100644 (file)
@@ -325,7 +325,6 @@ $messages = array(
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索有關日誌],
 或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯此頁]</span>。',
 'userpage-userdoesnotexist'  => '使用者帳號「<nowiki>$1</nowiki>」未曾建立。請在建立/編輯這個頁面前先檢查一下。',
-'clearyourcache'             => "'''注意:''' 在儲存以後, 您必須清除瀏覽器的快取才能看到所作出的改變。 '''Mozilla / Firefox / Safari:''' 按著 ''Shift'' 再點擊''重新整理''(或按下''Ctrl-Shift-R'',在蘋果Mac上按下''Cmd-Shift-R'');'''IE:''' 按著 ''Ctrl'' 再點擊 ''重新整理'',或按下 ''Ctrl-F5'';'''Konqueror:''' 只需點擊 ''重新整理'';'''Opera:''' 使用者需要在 ''工具-設定'' 中完整地清除它們的快取。",
 'usercsspreview'             => "'''注意您只是在預覽您的個人 CSS, 還沒有儲存﹗'''",
 'userjspreview'              => "'''注意您只是在測試/預覽您的個人 JavaScript,還沒有儲存﹗'''",
 'previewnote'                => "'''請記住這只是預覽,內容尚未儲存!'''",
diff --git a/languages/utils/CLDRPluralRuleEvaluator.php b/languages/utils/CLDRPluralRuleEvaluator.php
new file mode 100644 (file)
index 0000000..6b11704
--- /dev/null
@@ -0,0 +1,574 @@
+<?php
+/**
+ * Parse and evaluate a plural rule.
+ *
+ * http://unicode.org/reports/tr35/#Language_Plural_Rules
+ *
+ * @author Niklas Laxstrom, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @file
+ * @since 1.20
+ */
+
+class CLDRPluralRuleEvaluator {
+       /**
+        * Evaluate a number against a set of plural rules. If a rule passes,
+        * return the index of plural rule.
+        *
+        * @param int The number to be evaluated against the rules
+        * @param array The associative array of plural rules in pluralform => rule format.
+        * @return int The index of the plural form which passed the evaluation
+        */
+       public static function evaluate( $number, array $rules ) {
+               $rules = self::compile( $rules );
+               return self::evaluateCompiled( $number, $rules );
+       }
+
+       /**
+        * Convert a set of rules to a compiled form which is optimised for
+        * fast evaluation. The result will be an array of strings, and may be cached.
+        *
+        * @param $rules The rules to compile
+        * @return An array of compile rules.
+        */
+       public static function compile( array $rules ) {
+               // We can't use array_map() for this because it generates a warning if
+               // there is an exception.
+               foreach ( $rules as &$rule ) {
+                       $rule = CLDRPluralRuleConverter::convert( $rule );
+               }
+               return $rules;
+       }
+
+       /**
+        * Evaluate a compiled set of rules returned by compile(). Do not allow
+        * the user to edit the compiled form, or else PHP errors may result.
+        */
+       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  ) {
+                       $stack = array();
+                       $zero = ord( '0' );
+                       $nine = ord( '9' );
+                       foreach ( StringUtils::explode( ' ', $rule ) as $token ) {
+                               $ord = ord( $token );
+                               if ( $token === 'n' ) {
+                                       $stack[] = $number;
+                               } elseif ( $ord >= $zero && $ord <= $nine ) {
+                                       $stack[] = intval( $token );
+                               } else {
+                                       $right = array_pop( $stack );
+                                       $left = array_pop( $stack );
+                                       $result = self::doOperation( $token, $left, $right );
+                                       $stack[] = $result;
+                               }
+                       }
+                       if ( $stack[0] ) {
+                               return $i;
+                       }
+               }
+               // None of the provided rules match. The number belongs to caregory
+               // 'other' which comes last.
+               return count( $rules );
+       }
+
+       /**
+        * Do a single operation
+        *
+        * @param $token string The token string
+        * @param $left The left operand. If it is an object, its state may be destroyed.
+        * @param $right The right operand
+        * @return mixed
+        */
+       private static function doOperation( $token, $left, $right ) {
+               if ( in_array( $token, array( 'in', 'not-in', 'within', 'not-within' ) ) ) {
+                       if ( !($right instanceof CLDRPluralRuleEvaluator_Range ) ) {
+                               $right = new CLDRPluralRuleEvaluator_Range( $right );
+                       }
+               }
+               switch ( $token ) {
+                       case 'or':
+                               return $left || $right;
+                       case 'and':
+                               return $left && $right;
+                       case 'is':
+                               return $left == $right;
+                       case 'is-not':
+                               return $left != $right;
+                       case 'in':
+                               return $right->isNumberIn( $left );
+                       case 'not-in':
+                               return !$right->isNumberIn( $left );
+                       case 'within':
+                               return $right->isNumberWithin( $left );
+                       case 'not-within':
+                               return !$right->isNumberWithin( $left );
+                       case 'mod':
+                               if ( is_int( $left ) ) {
+                                       return (int) fmod( $left, $right );
+                               }
+                               return fmod( $left, $right );
+                       case ',':
+                               if ( $left instanceof CLDRPluralRuleEvaluator_Range ) {
+                                       $range = $left;
+                               } else {
+                                       $range = new CLDRPluralRuleEvaluator_Range( $left );
+                               }
+                               $range->add( $right );
+                               return $range;
+                       case '..':
+                               return new CLDRPluralRuleEvaluator_Range( $left, $right );
+                       default:
+                               throw new CLDRPluralRuleError( "Invalid RPN token" );
+               }
+       }
+}
+
+/**
+ * Evaluator helper class representing a range list.
+ */
+class CLDRPluralRuleEvaluator_Range {
+       var $parts = array();
+
+       function __construct( $start, $end = false ) {
+               if ( $end === false ) {
+                       $this->parts[] = $start;
+               } else {
+                       $this->parts[] = array( $start, $end );
+               }
+       }
+
+       /**
+        * Determine if the given number is inside the range. If $integerConstraint
+        * is true, the number must additionally be an integer if it is to match
+        * any interval part.
+        */
+       function isNumberIn( $number, $integerConstraint = true ) {
+               foreach ( $this->parts as $part ) {
+                       if ( is_array( $part ) ) {
+                               if ( ( !$integerConstraint || floor( $number ) === (float)$number )
+                                       && $number >= $part[0] && $number <= $part[1] )
+                               {
+                                       return true;
+                               }
+                       } else {
+                               if ( $number == $part ) {
+                                       return true;
+                               }
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Readable alias for isNumberIn( $number, false ), and the implementation
+        * of the "within" operator.
+        */
+       function isNumberWithin( $number ) {
+               return $this->isNumberIn( $number, false );
+       }
+
+       /**
+        * Add another part to this range. The supplied new part may either be a
+        * range object itself, or a single number.
+        */
+       function add( $other ) {
+               if ( $other instanceof self ) {
+                       $this->parts = array_merge( $this->parts, $other->parts );
+               } else {
+                       $this->parts[] = $other;
+               }
+       }
+
+       /**
+        * For debugging
+        */
+       function __toString() {
+               $s = 'Range(';
+               foreach ( $this->parts as $i => $part ) {
+                       if ( $i ) {
+                               $s .= ', ';
+                       }
+                       if ( is_array( $part ) ) {
+                               $s .= $part[0] . '..' . $part[1];
+                       } else {
+                               $s .= $part;
+                       }
+               }
+               $s .= ')';
+               return $s;
+       }
+
+}
+
+/**
+ * Helper class for converting rules to reverse polish notation (RPN).
+ */
+class CLDRPluralRuleConverter {
+       var $rule, $pos, $end;
+       var $operators = array();
+       var $operands = array();
+
+       /**
+        * Precedence levels. Note that there's no need to worry about associativity
+        * for the level 4 operators, since they return boolean and don't accept
+        * boolean inputs.
+        */
+       static $precedence = array(
+               'or' => 2,
+               'and' => 3,
+               'is' => 4,
+               'is-not' => 4,
+               'in' => 4,
+               'not-in' => 4,
+               'within' => 4,
+               'not-within' => 4,
+               'mod' => 5,
+               ',' => 6,
+               '..' => 7,
+       );
+
+       /**
+        * A character list defining whitespace, for use in strspn() etc.
+        */
+       const WHITESPACE_CLASS = " \t\r\n";
+
+       /**
+        * Same for digits. Note that the grammar given in UTS #35 doesn't allow
+        * negative numbers or decimals.
+        */
+       const NUMBER_CLASS = '0123456789';
+
+       /**
+        * An anchored regular expression which matches a word at the current offset.
+        */
+       const WORD_REGEX = '/[a-zA-Z]+/A';
+
+       /**
+        * Convert a rule to RPN. This is the only public entry point.
+        */
+       public static function convert( $rule ) {
+               $parser = new self( $rule );
+               return $parser->doConvert();
+       }
+
+       /**
+        * Private constructor.
+        */
+       protected function __construct( $rule ) {
+               $this->rule = $rule;
+               $this->pos = 0;
+               $this->end = strlen( $rule );
+       }
+
+       /**
+        * Do the operation.
+        */
+       protected function doConvert() {
+               $expectOperator = true;
+
+               // Iterate through all tokens, saving the operators and operands to a
+               // stack per Dijkstra's shunting yard algorithm.
+               while ( false !== ( $token = $this->nextToken() ) ) {
+                       // In this grammar, there are only binary operators, so every valid
+                       // rule string will alternate between operator and operand tokens.
+                       $expectOperator = !$expectOperator;
+
+                       if ( $token instanceof CLDRPluralRuleConverter_Expression ) {
+                               // Operand
+                               if ( $expectOperator ) {
+                                       $token->error( 'unexpected operand' );
+                               }
+                               $this->operands[] = $token;
+                               continue;
+                       } else {
+                               // Operator
+                               if  ( !$expectOperator ) {
+                                       $token->error( 'unexpected operator' );
+                               }
+                               // Resolve higher precedence levels
+                               $lastOp = end( $this->operators );
+                               while ( $lastOp && self::$precedence[$token->name] <= self::$precedence[$lastOp->name] ) {
+                                       $this->doOperation( $lastOp, $this->operands );
+                                       array_pop( $this->operators );
+                                       $lastOp = end( $this->operators );
+                               }
+                               $this->operators[] = $token;
+                       }
+               }
+
+               // Finish off the stack
+               while ( $op = array_pop( $this->operators ) ) {
+                       $this->doOperation( $op, $this->operands );
+               }
+
+               // Make sure the result is sane. The first case is possible for an empty
+               // string input, the second should be unreachable.
+               if ( !count( $this->operands ) ) {
+                       $this->error( 'condition expected' );
+               } elseif ( count( $this->operands ) > 1 ) {
+                       $this->error( 'missing operator or too many operands' );
+               }
+
+               $value = $this->operands[0];
+               if ( $value->type !== 'boolean' ) {
+                       $this->error( 'the result must have a boolean type' );
+               }
+
+               return $this->operands[0]->rpn;
+       }
+
+       /**
+        * Fetch the next token from the input string. Return it as a
+        * CLDRPluralRuleConverter_Fragment object.
+        */
+       protected function nextToken() {
+               if ( $this->pos >= $this->end ) {
+                       return false;
+               }
+
+               // Whitespace
+               $length = strspn( $this->rule, self::WHITESPACE_CLASS, $this->pos );
+               $this->pos += $length;
+
+               if ( $this->pos >= $this->end ) {
+                       return false;
+               }
+
+               // Number
+               $length = strspn( $this->rule, self::NUMBER_CLASS, $this->pos );
+               if ( $length !== 0 ) {
+                       $token = $this->newNumber( substr( $this->rule, $this->pos, $length ), $this->pos );
+                       $this->pos += $length;
+                       return $token;
+               }
+
+               // Comma
+               if ( $this->rule[$this->pos] === ',' ) {
+                       $token = $this->newOperator( ',', $this->pos, 1 );
+                       $this->pos ++;
+                       return $token;
+               }
+
+               // Dot dot
+               if ( substr( $this->rule, $this->pos, 2 ) === '..' ) {
+                       $token = $this->newOperator( '..', $this->pos, 2 );
+                       $this->pos += 2;
+                       return $token;
+               }
+
+               // Word
+               if ( !preg_match( self::WORD_REGEX, $this->rule, $m, 0, $this->pos ) ) {
+                       $this->error( 'unexpected character "' . $this->rule[$this->pos] . '"'  );
+               }
+               $word1 = strtolower( $m[0] );
+               $word2 = '';
+               $nextTokenPos = $this->pos + strlen( $word1 );
+               if ( $word1 === 'not' || $word1 === 'is' ) {
+                       // Look ahead one word
+                       $nextTokenPos += strspn( $this->rule, self::WHITESPACE_CLASS, $nextTokenPos );
+                       if ( $nextTokenPos < $this->end
+                                       && preg_match( self::WORD_REGEX, $this->rule, $m, 0, $nextTokenPos ) )
+                       {
+                               $word2 = strtolower( $m[0] );
+                               $nextTokenPos += strlen( $word2 );
+                       }
+               }
+
+               // Two-word operators like "is not" take precedence over single-word operators like "is"
+               if ( $word2 !== '' ) {
+                       $bothWords = "{$word1}-{$word2}";
+                       if ( isset( self::$precedence[$bothWords] ) ) {
+                               $token = $this->newOperator( $bothWords, $this->pos, $nextTokenPos - $this->pos );
+                               $this->pos = $nextTokenPos;
+                               return $token;
+                       }
+               }
+
+               // Single-word operators
+               if ( isset( self::$precedence[$word1] ) ) {
+                       $token = $this->newOperator( $word1, $this->pos, strlen( $word1 ) );
+                       $this->pos += strlen( $word1 );
+                       return $token;
+               }
+
+               // The special numerical keyword "n"
+               if ( $word1 === 'n' ) {
+                       $token = $this->newNumber( 'n', $this->pos );
+                       $this->pos ++;
+                       return $token;
+               }
+
+               $this->error( 'unrecognised word' );
+       }
+
+       /**
+        * For the binary operator $op, pop its operands off the stack and push
+        * a fragment with rpn and type members describing the result of that
+        * operation.
+        */
+       protected function doOperation( $op ) {
+               if ( count( $this->operands ) < 2 ) {
+                       $op->error( 'missing operand' );
+               }
+               $right = array_pop( $this->operands );
+               $left = array_pop( $this->operands );
+               $result = $op->operate( $left, $right );
+               $this->operands[] = $result;
+       }
+
+       /**
+        * Create a numerical expression object
+        */
+       protected function newNumber( $text, $pos ) {
+               return new CLDRPluralRuleConverter_Expression( $this, 'number', $text, $pos, strlen( $text ) );
+       }
+
+       /**
+        * Create a binary operator
+        */
+       protected function newOperator( $type, $pos, $length ) {
+               return new CLDRPluralRuleConverter_Operator( $this, $type, $pos, $length );
+       }
+
+       /**
+        * Throw an error
+        */
+       protected function error( $message ) {
+               throw new CLDRPluralRuleError( $message );
+       }
+}
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * The base class for operators and expressions, describing a region of the input string.
+ */
+class CLDRPluralRuleConverter_Fragment {
+       var $parser, $pos, $length, $end;
+
+       function __construct( $parser, $pos, $length ) {
+               $this->parser = $parser;
+               $this->pos = $pos;
+               $this->length = $length;
+               $this->end = $pos + $length;
+       }
+
+       public function error( $message ) {
+               $text = $this->getText();
+               throw new CLDRPluralRuleError( "$message at position " . ( $this->pos + 1 ) . ": \"$text\"" );
+       }
+
+       public function getText() {
+               return substr( $this->parser->rule, $this->pos, $this->length );
+       }
+}
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * An expression object, representing a region of the input string (for error
+ * messages), the RPN notation used to evaluate it, and the result type for
+ * validation.
+ */
+class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragment {
+       var $type, $rpn;
+
+       function __construct( $parser, $type, $rpn, $pos, $length ) {
+               parent::__construct( $parser, $pos, $length );
+               $this->type = $type;
+               $this->rpn = $rpn;
+       }
+
+       public function isType( $type ) {
+               if ( $type === 'range' && ( $this->type === 'range' || $this->type === 'number' ) ) {
+                       return true;
+               }
+               if ( $type === $this->type ) {
+                       return true;
+               }
+               return false;
+       }
+}
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * An operator object, representing a region of the input string (for error
+ * messages), and the binary operator at that location.
+ */
+class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment {
+       var $name;
+
+       /**
+        * Each op type has three characters: left operand type, right operand type and result type
+        *
+        *   b = boolean
+        *   n = number
+        *   r = range
+        *
+        * A number is a kind of range.
+        */
+       static $opTypes = array(
+               'or' => 'bbb',
+               'and' => 'bbb',
+               'is' => 'nnb',
+               'is-not' => 'nnb',
+               'in' => 'nrb',
+               'not-in' => 'nrb',
+               'within' => 'nrb',
+               'not-within' => 'nrb',
+               'mod' => 'nnn',
+               ',' => 'rrr',
+               '..' => 'nnr',
+       );
+
+       /**
+        * Map converting from the abbrevation to the full form.
+        */
+       static $typeSpecMap = array(
+               'b' => 'boolean',
+               'n' => 'number',
+               'r' => 'range',
+       );
+
+       function __construct( $parser, $name, $pos, $length ) {
+               parent::__construct( $parser, $pos, $length );
+               $this->name = $name;
+       }
+
+       public function operate( $left, $right ) {
+               $typeSpec = self::$opTypes[$this->name];
+
+               $leftType = self::$typeSpecMap[$typeSpec[0]];
+               $rightType = self::$typeSpecMap[$typeSpec[1]];
+               $resultType = self::$typeSpecMap[$typeSpec[2]];
+
+               $start = min( $this->pos, $left->pos, $right->pos );
+               $end = max( $this->end, $left->end, $right->end );
+               $length = $end - $start;
+
+               $newExpr = new CLDRPluralRuleConverter_Expression( $this->parser, $resultType,
+                       "{$left->rpn} {$right->rpn} {$this->name}",
+                       $start, $length );
+
+               if ( !$left->isType( $leftType ) ) {
+                       $newExpr->error( "invalid type for left operand: expected $leftType, got {$left->type}" );
+               }
+
+               if ( !$right->isType( $rightType ) ) {
+                       $newExpr->error( "invalid type for right operand: expected $rightType, got {$right->type}" );
+               }
+               return $newExpr;
+       }
+}
+
+/**
+ * The exception class for all the classes in this file. This will be thrown
+ * back to the caller if there is any validation error.
+ */
+class CLDRPluralRuleError extends MWException {
+       function __construct( $message ) {
+               parent::__construct( 'CLDR plural rule error: ' . $message );
+       }
+}
index 4c72080..f363c3f 100644 (file)
--- a/load.php
+++ b/load.php
@@ -24,6 +24,7 @@
 
 // Bail if PHP is too low
 if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
+       // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
        require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
        wfPHPVersionError( 'load.php' );
 }
@@ -31,7 +32,7 @@ if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require ( 'phase3/includes/WebStart.php' );
 } else {
-       require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
+       require ( __DIR__ . '/includes/WebStart.php' );
 }
 
 wfProfileIn( 'load.php' );
index aeb2e9d..b60a196 100644 (file)
@@ -182,7 +182,7 @@ EXAMPLE_PATH           =
 EXAMPLE_PATTERNS       = *
 EXAMPLE_RECURSIVE      = NO
 IMAGE_PATH             =
-INPUT_FILTER           =
+INPUT_FILTER           = "{{INPUT_FILTER}}"
 FILTER_PATTERNS        =
 FILTER_SOURCE_FILES    = NO
 FILTER_SOURCE_PATTERNS =
index cec1270..69d1131 100644 (file)
  * @defgroup Maintenance Maintenance
  */
 
+// Make sure we're on PHP5.3.2 or better
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
+       // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
+       require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+       wfPHPVersionError( 'cli' );
+}
+
 /**
  * @defgroup MaintenanceArchive Maintenance archives
  * @ingroup Maintenance
  */
 
 // Define this so scripts can easily find doMaintenance.php
-define( 'RUN_MAINTENANCE_IF_MAIN', dirname( __FILE__ ) . '/doMaintenance.php' );
+define( 'RUN_MAINTENANCE_IF_MAIN', __DIR__ . '/doMaintenance.php' );
 define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
 
 $maintClass = false;
 
-// Make sure we're on PHP5 or better
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
-       require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
-       wfPHPVersionError( 'cli' );
-}
-
 /**
  * Abstract maintenance class for quickly writing and churning out
  * maintenance scripts with minimal effort. All that _must_ be defined
@@ -123,7 +124,7 @@ abstract class Maintenance {
                global $IP;
                $IP = strval( getenv( 'MW_INSTALL_PATH' ) ) !== ''
                        ? getenv( 'MW_INSTALL_PATH' )
-                       : realpath( dirname( __FILE__ ) . '/..' );
+                       : realpath( __DIR__ . '/..' );
 
                $this->addDefaultParams();
                register_shutdown_function( array( $this, 'outputChanneled' ), false );
@@ -988,7 +989,7 @@ abstract class Maintenance {
         * @return string
         */
        protected function getDir() {
-               return dirname( __FILE__ );
+               return __DIR__;
        }
 
        /**
@@ -1009,9 +1010,9 @@ abstract class Maintenance {
        protected static function getCoreScripts() {
                if ( !self::$mCoreScripts ) {
                        $paths = array(
-                               dirname( __FILE__ ),
-                               dirname( __FILE__ ) . '/language',
-                               dirname( __FILE__ ) . '/storage',
+                               __DIR__,
+                               __DIR__ . '/language',
+                               __DIR__ . '/storage',
                        );
                        self::$mCoreScripts = array();
                        foreach ( $paths as $p ) {
index 6c07858..4356d70 100644 (file)
@@ -8,8 +8,6 @@ CREATE TABLE /*_*/filejournal (
   fj_backend varchar(255) NOT NULL,
   -- The storage path that was affected (may be internal paths)
   fj_path blob NOT NULL,
-  -- SHA-1 file path hash in base-36
-  fj_path_sha1 varbinary(32) NOT NULL default '',
   -- Primitive operation description (create/update/delete)
   fj_op varchar(16) NOT NULL default '',
   -- SHA-1 file content hash in base-36
index 1765bd9..d406ea8 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceArchive
  */
 
-require( dirname( __FILE__ ) . '/../commandLine.inc' );
+require( __DIR__ . '/../commandLine.inc' );
 
 class UpdateLogging {
 
index 78cae8c..475cafc 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to correct wrong values in the `page_latest` field
index 3846ef5..84aac57 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/backup.inc' );
+require_once( __DIR__ . '/backup.inc' );
 
 /**
  * @ingroup Maintenance
@@ -171,10 +171,6 @@ class TextPassDumper extends BackupDumper {
                $input = fopen( $this->input, "rt" );
                $result = $this->readDump( $input );
 
-               if ( WikiError::isError( $result ) ) {
-                       throw new MWException( $result->getMessage() );
-               }
-
                if ( $this->spawnProc ) {
                        $this->closeSpawn();
                }
@@ -328,6 +324,10 @@ class TextPassDumper extends BackupDumper {
                }
        }
 
+       /**
+        * @throws MWException Failure to parse XML input
+        * @return true
+        */
        function readDump( $input ) {
                $this->buffer = "";
                $this->openElement = false;
@@ -352,7 +352,18 @@ class TextPassDumper extends BackupDumper {
                        $chunk = fread( $input, $bufferSize );
                        if ( !xml_parse( $parser, $chunk, feof( $input ) ) ) {
                                wfDebug( "TextDumpPass::readDump encountered XML parsing error\n" );
-                               return new WikiXmlError( $parser, 'XML import parse failure', $chunk, $offset );
+
+                               $byte = xml_get_current_byte_index( $parser );
+                               $msg = wfMessage( 'xml-error-string',
+                                       'XML import parse failure',
+                                       xml_get_current_line_number( $parser ),
+                                       xml_get_current_column_number( $parser ),
+                                       $byte . ( is_null( $chunk ) ? null : ( '; "' . substr( $chunk, $byte -$offset, 16 ) . '"' ) ),
+                                       xml_error_string( xml_get_error_code( $parser ) ) )->escaped();
+
+                               xml_parser_free( $parser );
+
+                               throw new MWException( $msg );
                        }
                        $offset += strlen( $chunk );
                } while ( $chunk !== false && !feof( $input ) );
index 0056c3c..822f1a6 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Benchmark
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 abstract class Benchmarker extends Maintenance {
        private $results;
 
index cf62aad..fb836c1 100644 (file)
@@ -22,7 +22,7 @@
  * @author  Platonides
  */
 
-require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+require_once( __DIR__ . '/Benchmarker.php' );
 class bench_HTTP_HTTPS extends Benchmarker {
 
        public function __construct() {
index 7138552..6e44864 100644 (file)
@@ -4,7 +4,7 @@
  * @ingroup Benchmark
  */
 
-require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+require_once( __DIR__ . '/Benchmarker.php' );
 
 class BenchmarkDeleteTruncate extends Benchmarker {
 
index dafce05..4a3abd4 100644 (file)
@@ -22,7 +22,7 @@
  * @author  Platonides
  */
 
-require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+require_once( __DIR__ . '/Benchmarker.php' );
 class bench_if_switch extends Benchmarker {
 
        public function __construct() {
index 73ace2b..cce7879 100644 (file)
@@ -4,7 +4,7 @@
  * @ingroup Benchmark
  */
 
-require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+require_once( __DIR__ . '/Benchmarker.php' );
 
 function bfNormalizeTitleStrTr( $str ) {
     return strtr( $str, '_', ' ' );
index 2e4b902..d71f5f5 100644 (file)
@@ -1,22 +1,22 @@
 <?php
-/**\r
- * @file\r
- * @ingroup Benchmark\r
- */\r
-\r
-require_once( dirname( __FILE__ ) . '/Benchmarker.php' );\r
+/**
+ * @file
+ * @ingroup Benchmark
+ */
+
+require_once( __DIR__ . '/Benchmarker.php' );
 
 /**
  * This little benchmark executes the regexp used in Language->checkTitleEncoding() and compares its execution time
  * against that of mb_check_encoding, if available.
- */\r
+ */
 class bench_utf8_title_check extends Benchmarker {
 
        private $canRun;
 
        private $data;
 
-       public function __construct() {\r
+       public function __construct() {
                parent::__construct();
 
                $this->data = array (
@@ -43,14 +43,14 @@ class bench_utf8_title_check extends Benchmarker {
 
                $this->canRun = function_exists ( 'mb_check_encoding' );
 
-               if ( $this->canRun ) {\r
+               if ( $this->canRun ) {
                        $this->mDescription = "Benchmark for using a regexp vs. mb_check_encoding to check for UTF-8 encoding.";
                        mb_internal_encoding( 'UTF-8' );
                } else {
                        $this->mDescription = "CANNOT RUN benchmark using mb_check_encoding: function not available.";
-               }\r
-       }\r
-\r
+               }
+       }
+
        public function execute() {
                if ( !$this->canRun ) {
                        return;
@@ -69,22 +69,22 @@ class bench_utf8_title_check extends Benchmarker {
                                'function' => array( $this, 'use_regexp_once_only' ),
                                'args' => array( rawurldecode ( $val ) )
                        );
-                       $benchmarks[] = array(\r
-                               'function' => array( $this, 'use_mb_check_encoding' ),\r
-                               'args' => array( rawurldecode ( $val ) )\r
+                       $benchmarks[] = array(
+                               'function' => array( $this, 'use_mb_check_encoding' ),
+                               'args' => array( rawurldecode ( $val ) )
                        );
-               }\r
+               }
                $this->bench( $benchmarks );
-               print $this->getFormattedResults();\r
-       }\r
+               print $this->getFormattedResults();
+       }
 
        private $isutf8;
-\r
+
        function use_regexp( $s ) {
                $this->isutf8 = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );\r
-       }\r
-\r
+                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+       }
+
        function use_regexp_non_capturing( $s ) {
                // Same as above with a non-capturing subgroup.
                $this->isutf8 = preg_match( '/^(?:[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
@@ -97,11 +97,11 @@ class bench_utf8_title_check extends Benchmarker {
                                '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
-       function use_mb_check_encoding( $s ) {\r
-               $this->isutf8 = mb_check_encoding( $s, 'UTF-8' );\r
-       }\r
-\r
-}\r
-\r
-$maintClass = 'bench_utf8_title_check';\r
-require_once( RUN_MAINTENANCE_IF_MAIN );\r
+       function use_mb_check_encoding( $s ) {
+               $this->isutf8 = mb_check_encoding( $s, 'UTF-8' );
+       }
+
+}
+
+$maintClass = 'bench_utf8_title_check';
+require_once( RUN_MAINTENANCE_IF_MAIN );
index 4caebc5..cd07fbd 100644 (file)
@@ -22,7 +22,7 @@
  * @author  Platonides
  */
 
-require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+require_once( __DIR__ . '/Benchmarker.php' );
 class bench_wfIsWindows extends Benchmarker {
 
        public function __construct() {
index 4ec2616..508ea80 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup Benchmark
  */
 
-require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+require_once( __DIR__ . '/Benchmarker.php' );
 
 class BenchmarkHooks extends Benchmarker {
 
index e9d2ec7..4d36d26 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Benchmark
  */
 
-require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+require_once( __DIR__ . '/Benchmarker.php' );
 
 class BenchmarkPurge extends Benchmarker {
 
index 270f7a6..c06c2cd 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 /** */
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
 
 function cdbShowHelp( $command ) {
        $commandList = array(
index e4063f9..f276fc1 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to change the password of a given user.
index ea6c09f..8d0e442 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to check classes definitions in the autoloader.
index f8b8955..670b93d 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to check that pages marked as being redirects really are.
index d7463ec..c05d915 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  * @ingroup Maintenance
  */
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to check images to see if they exist, are readable, etc.
index 3019b84..0a22f58 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to check syntax of all PHP files in MediaWiki.
index 6a9294a..dd5e002 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to check that database usernames are actually valid.
index 56d7698..dbc2e0d 100644 (file)
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to cleans up old database tables, dropping old indexes
+ * and fields.
+ *
+ * @ingroup Maintenance
+ */
 class CleanupAncientTables extends Maintenance {
 
        public function __construct() {
index 6f8e180..ec2aa95 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Script to clean up broken page links when somebody turns on $wgCapitalLinks.
+ * Clean up broken page links when somebody turns on $wgCapitalLinks.
  *
  * Usage: php cleanupCaps.php [--dry-run]
  * Options:
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/cleanupTable.inc' );
+require_once( __DIR__ . '/cleanupTable.inc' );
 
+/**
+ * Maintenance script to clean up broken page links when somebody turns on $wgCapitalLinks.
+ *
+ * @ingroup Maintenance
+ */
 class CapsCleanup extends TableCleanup {
        public function __construct() {
                parent::__construct();
index 687a95c..4e7b937 100644 (file)
@@ -1,12 +1,12 @@
 <?php
 /**
- * Script to clean up broken, unparseable upload filenames.
+ * Clean up broken, unparseable upload filenames.
  *
  * Usage: php cleanupImages.php [--fix]
  * Options:
  *   --fix  Actually clean up titles; otherwise just checks for them
  *
- * Copyright (C) 2005-2006 Brion Vibber <brion@pobox.com>
+ * Copyright © 2005-2006 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/cleanupTable.inc' );
+require_once( __DIR__ . '/cleanupTable.inc' );
 
+/**
+ * Maintenance script to clean up broken, unparseable upload filenames.
+ *
+ * @ingroup Maintenance
+ */
 class ImageCleanup extends TableCleanup {
        protected $defaultParams = array(
                'table' => 'image',
diff --git a/maintenance/cleanupPreferences.php b/maintenance/cleanupPreferences.php
new file mode 100755 (executable)
index 0000000..f37af77
--- /dev/null
@@ -0,0 +1,52 @@
+<?php\r
+/**\r
+ * Remove hidden preferences from the database.\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along\r
+ * with this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
+ * http://www.gnu.org/copyleft/gpl.html\r
+ *\r
+ * @file\r
+ * @author TyA <tya.wiki@gmail.com>\r
+ * @see [[bugzilla:30976]]\r
+ * @ingroup Maintenance\r
+ */\r
+\r
+require_once( __DIR__ . '/Maintenance.php' );\r
+\r
+/**\r
+ * Maintenance script that removes hidden preferences from the database.\r
+ *\r
+ * @ingroup Maintenance\r
+ */\r
+class CleanupPreferences extends Maintenance {\r
+       public function execute() {\r
+               global $wgHiddenPrefs;\r
+\r
+               $dbw = wfGetDB( DB_MASTER );\r
+               $dbw->begin();\r
+               foreach( $wgHiddenPrefs as $item ) {\r
+                       $dbw->delete(\r
+                               'user_properties',\r
+                               array( 'up_property' => $item ),\r
+                               __METHOD__\r
+                       );\r
+               };\r
+               $dbw->commit();\r
+               $this->output( "Finished!\n" );\r
+       }\r
+}\r
+\r
+$maintClass = 'CleanupPreferences'; // Tells it to run the class\r
+require_once( RUN_MAINTENANCE_IF_MAIN );\r
index fb8afd2..2085da9 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
- * Maintenance script to remove cache entries for removed ResourceLoader modules
- * from the database
+ * Remove cache entries for removed ResourceLoader modules from the database.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @author Roan Kattouw
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to remove cache entries for removed ResourceLoader modules
+ * from the database.
+ *
+ * @ingroup Maintenance
+ */
 class CleanupRemovedModules extends Maintenance {
 
        public function __construct() {
index f104899..e20bcd8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Cleanup all spam from a given hostname
+ * Cleanup all spam from a given hostname.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to cleanup all spam from a given hostname.
+ *
+ * @ingroup Maintenance
+ */
 class CleanupSpam extends Maintenance {
 
        public function __construct() {
@@ -36,7 +41,7 @@ class CleanupSpam extends Maintenance {
        public function execute() {
                global $wgLocalDatabases, $wgUser;
 
-               $username = wfMsg( 'spambot_username' );
+               $username = wfMessage( 'spambot_username' )->text();
                $wgUser = User::newFromName( $username );
                if ( !$wgUser ) {
                        $this->error( "Invalid username", true );
@@ -113,16 +118,16 @@ class CleanupSpam extends Maintenance {
                        if ( $rev ) {
                                // Revert to this revision
                                $this->output( "reverting\n" );
-                               $page->doEdit( $rev->getText(), wfMsgForContent( 'spam_reverting', $domain ),
+                               $page->doEdit( $rev->getText(), wfMessage( 'spam_reverting', $domain )->inContentLanguage()->text(),
                                        EDIT_UPDATE, $rev->getId() );
                        } elseif ( $this->hasOption( 'delete' ) ) {
                                // Didn't find a non-spammy revision, blank the page
                                $this->output( "deleting\n" );
-                               $page->doDeleteArticle( wfMsgForContent( 'spam_deleting', $domain ) );
+                               $page->doDeleteArticle( wfMessage( 'spam_deleting', $domain )->inContentLanguage()->text() );
                        } else {
                                // Didn't find a non-spammy revision, blank the page
                                $this->output( "blanking\n" );
-                               $page->doEdit( '', wfMsgForContent( 'spam_blanking', $domain ) );
+                               $page->doEdit( '', wfMessage( 'spam_blanking', $domain )->inContentLanguage()->text() );
                        }
                        $dbw->commit( __METHOD__ );
                }
index 1c27976..85911ba 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Generic table cleanup class. Already subclasses maintenance
+ * Generic class to cleanup a database table.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Generic class to cleanup a database table. Already subclasses Maintenance.
+ *
+ * @ingroup Maintenance
+ */
 class TableCleanup extends Maintenance {
        protected $defaultParams = array(
                'table' => 'page',
index 4fc6415..ad2577a 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Script to clean up broken, unparseable titles.
+ * Clean up broken, unparseable titles.
  *
  * Usage: php cleanupTitles.php [--fix]
  * Options:
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/cleanupTable.inc' );
+require_once( __DIR__ . '/cleanupTable.inc' );
 
+/**
+ * Maintenance script to clean up broken, unparseable titles.
+ *
+ * @ingroup Maintenance
+ */
 class TitleCleanup extends TableCleanup {
        public function __construct() {
                parent::__construct();
index c8d8924..cc32946 100644 (file)
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to remove old or broken uploads from temporary uploaded
+ * file storage and clean up associated database records.
+ *
+ * @ingroup Maintenance
+ */
 class UploadStashCleanup extends Maintenance {
 
        public function __construct() {
index a9b20fe..fbab6a3 100644 (file)
@@ -1,12 +1,12 @@
 <?php
 /**
- * Script to remove broken, unparseable titles in the Watchlist.
+ * Remove broken, unparseable titles in the watchlist table.
  *
  * Usage: php cleanupWatchlist.php [--fix]
  * Options:
  *   --fix  Actually remove entries; without will only report.
  *
- * Copyright (C) 2005,2006 Brion Vibber <brion@pobox.com>
+ * Copyright © 2005,2006 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/cleanupTable.inc' );
+require_once( __DIR__ . '/cleanupTable.inc' );
 
+/**
+ * Maintenance script to remove broken, unparseable titles in the watchlist table.
+ *
+ * @ingroup Maintenance
+ */
 class WatchlistCleanup extends TableCleanup {
        protected $defaultParams = array(
                'table' => 'watchlist',
index 953bd4c..88769df 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
- * This script is used to clear the interwiki links for ALL languages in
- * the cache.
+ * Clear the cache of interwiki prefixes for all local wikis.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to clear the cache of interwiki prefixes for all local wikis.
+ *
+ * @ingroup Maintenance
+ */
 class ClearInterwikiCache extends Maintenance {
 
        public function __construct() {
index 61314e6..4581d53 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * This script remove all statistics tracking from the cache
+ * Removes all statistics tracking from the cache.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to remove all statistics tracking from the cache.
+ *
+ * @ingroup Maintenance
+ */
 class clear_stats extends Maintenance {
 
        public function __construct() {
index c7adbfb..86a558d 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 global $optionsWithArgs;
 if ( !isset( $optionsWithArgs ) ) {
index 4fe4e4d..a333717 100644 (file)
@@ -6,8 +6,9 @@
  *
  * Templates etc are pulled from the local wiki database, not from the dump.
  *
- * Copyright (C) 2011 Platonides - http://www.mediawiki.org/
- * 
+ * Copyright © 2011 Platonides
+ * http://www.mediawiki.org/
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * @file
  * @ingroup Maintenance
  */
-require_once( dirname( __FILE__ ) . '/dumpIterator.php' );
 
+require_once( __DIR__ . '/dumpIterator.php' );
+
+/**
+ * Maintenance script to take page text out of an XML dump file and render
+ * basic HTML out to files.
+ *
+ * @ingroup Maintenance
+ */
 class CompareParsers extends DumpIterator {
 
        private $count = 0;
@@ -51,10 +58,10 @@ class CompareParsers extends DumpIterator {
                if ( $this->hasOption('save-failed') ) {
                        $this->saveFailed = $this->getOption('save-failed');
                }
-               
+
                $this->stripParametersEnabled = $this->hasOption( 'strip-parameters' );
                $this->showParsedOutput = $this->hasOption( 'show-parsed-output' );
-               
+
                $this->showDiff = $this->hasOption( 'show-diff' );
                if ( $this->showDiff ) {
                        $bin = $this->getOption( 'diff-bin', getenv( 'DIFF' ) );
@@ -63,10 +70,10 @@ class CompareParsers extends DumpIterator {
                                $wgDiff = $bin;
                        }
                }
-               
-               $user = new User();             
+
+               $user = new User();
                $this->options = ParserOptions::newFromUser( $user );
-               
+
                if ( $this->hasOption( 'tidy' ) ) {
                        global $wgUseTidy;
                        if ( !$wgUseTidy ) {
@@ -74,46 +81,46 @@ class CompareParsers extends DumpIterator {
                        }
                        $this->options->setTidy( true );
                }
-               
+
                $this->failed = 0;
        }
-       
-       public function conclusions() { 
+
+       public function conclusions() {
                $this->error( "{$this->failed} failed revisions out of {$this->count}" );
                if ($this->count > 0)
                        $this->output( " (" . ( $this->failed / $this->count ) . "%)\n" );
        }
-       
+
        function stripParameters( $text ) {
                if ( !$this->stripParametersEnabled ) {
                        return $text;
                }
                return preg_replace( '/(<a) [^>]+>/', '$1>', $text );
        }
-       
+
        /**
         * Callback function for each revision, parse with both parsers and compare
         * @param $rev Revision
         */
        public function processRevision( $rev ) {
                $title = $rev->getTitle();
-                               
+
                $parser1Name = $this->getOption( 'parser1' );
                $parser2Name = $this->getOption( 'parser2' );
-               
+
                self::checkParserLocally( $parser1Name );
                self::checkParserLocally( $parser2Name );
-               
+
                $parser1 = new $parser1Name();
                $parser2 = new $parser2Name();
-               
+
                $output1 = $parser1->parse( $rev->getText(), $title, $this->options );
                $output2 = $parser2->parse( $rev->getText(), $title, $this->options );
 
                if ( $output1->getText() != $output2->getText() ) {
                        $this->failed++;
                        $this->error( "Parsing for {$title->getPrefixedText()} differs\n" );
-                       
+
                        if ( $this->saveFailed ) {
                                file_put_contents( $this->saveFailed . '/' . rawurlencode( $title->getPrefixedText() ) . ".txt", $rev->getText());
                        }
@@ -127,7 +134,7 @@ class CompareParsers extends DumpIterator {
                        }
                }
        }
-       
+
        private static function checkParserLocally( $parserName ) {
                /* Look for the parser in a file appropiately named in the current folder */
                if ( !class_exists( $parserName ) && file_exists( "$parserName.php" ) ) {
index 275d8fa..5f7b02e 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to convert from the old links schema (string->ID)
index e666b65..7c9ca26 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to convert user options to the new `user_properties` table.
index 07f6199..aebdee1 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copy all files in one container of one backend to another.
+ * Copy all files in some containers of one backend to another.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Copy all files in one container of one backend to another.
@@ -37,61 +37,163 @@ require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 class CopyFileBackend extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Copy all the files in one backend to another.";
+               $this->mDescription = "Copy files in one backend to another.";
                $this->addOption( 'src', 'Backend containing the source files', true, true );
                $this->addOption( 'dst', 'Backend where files should be copied to', true, true );
                $this->addOption( 'containers', 'Pipe separated list of containers', true, true );
-               $this->addOption( 'fast', 'Skip SHA-1 checks on pre-existing files' );
+               $this->addOption( 'subdir', 'Only do items in this child directory', false, true );
+               $this->addOption( 'ratefile', 'File to check periodically for batch size', false, true );
+               $this->addOption( 'skiphash', 'Skip SHA-1 sync checks for files' );
+               $this->addOption( 'missingonly', 'Only copy files missing from destination listing' );
+               $this->addOption( 'utf8only', 'Skip source files that do not have valid UTF-8 names' );
+               $this->setBatchSize( 50 );
        }
 
        public function execute() {
                $src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
                $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
-
                $containers = explode( '|', $this->getOption( 'containers' ) );
+               $subDir = $this->getOption( rtrim( 'subdir', '/' ), '' );
+
+               $rateFile = $this->getOption( 'ratefile' );
+
+               if ( $this->hasOption( 'utf8only' ) && !extension_loaded( 'mbstring' ) ) {
+                       $this->error( "Cannot check for UTF-8, mbstring extension missing.", 1 ); // die
+               }
+
+               $count = 0;
                foreach ( $containers as $container ) {
-                       $this->output( "Doing container $container...\n" );
+                       if ( $subDir != '' ) {
+                               $backendRel = "$container/$subDir";
+                               $this->output( "Doing container '$container', directory '$subDir'...\n" );
+                       } else {
+                               $backendRel = $container;
+                               $this->output( "Doing container '$container'...\n" );
+                       }
 
-                       $srcPathsRel = $src->getFileList(
-                               array( 'dir' => $src->getRootStoragePath() . "/$container" ) );
+                       $srcPathsRel = $src->getFileList( array(
+                               'dir' => $src->getRootStoragePath() . "/$backendRel" ) );
                        if ( $srcPathsRel === null ) {
                                $this->error( "Could not list files in $container.", 1 ); // die
                        }
-                       foreach ( $srcPathsRel as $srcPathRel ) {
-                               $srcPath = $src->getRootStoragePath() . "/$container/$srcPathRel";
-                               $dstPath = $dst->getRootStoragePath() . "/$container/$srcPathRel";
 
-                               if ( $dst->fileExists( array( 'src' => $dstPath, 'latest' => 1 ) ) ) {
-                                       if ( $this->hasOption( 'fast' ) ) {
-                                               $this->output( "Already have $dstPath.\n" );
-                                               continue; // assume already copied...
-                                       }
-                                       $srcSha1 = $src->getFileSha1Base36( array( 'src' => $srcPath ) );
-                                       $dstSha1 = $dst->getFileSha1Base36( array( 'src' => $dstPath ) );
-                                       if ( $srcSha1 && $srcSha1 === $dstSha1 ) {
-                                               $this->output( "Already have $dstPath.\n" );
-                                               continue; // already copied...
-                                       }
+                       // Do a listing comparison if specified
+                       if ( $this->hasOption( 'missingonly' ) ) {
+                               $relFilesSrc = array();
+                               $relFilesDst = array();
+                               foreach ( $srcPathsRel as $srcPathRel ) {
+                                       $relFilesSrc[] = $srcPathRel;
                                }
-
-                               $fsFile = $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
-                               if ( !$fsFile ) {
-                                       $this->error( "Could not get local copy of $srcPath.", 1 ); // die
+                               $dstPathsRel = $dst->getFileList( array(
+                                       'dir' => $dst->getRootStoragePath() . "/$backendRel" ) );
+                               if ( $dstPathsRel === null ) {
+                                       $this->error( "Could not list files in $container.", 1 ); // die
                                }
+                               foreach ( $dstPathsRel as $dstPathRel ) {
+                                       $relFilesDst[] = $dstPathRel;
+                               }
+                               // Only copy the missing files over in the next loop
+                               $srcPathsRel = array_diff( $relFilesSrc, $relFilesDst );
+                               $this->output( count( $srcPathsRel ) . " file(s) need to be copied.\n" );
+                               unset( $relFilesSrc );
+                               unset( $relFilesDst );
+                       }
 
-                               $status = $dst->prepare( array( 'dir' => dirname( $dstPath ) ) );
-                               $status->merge( $dst->store(
-                                       array( 'src' => $fsFile->getPath(), 'dst' => $dstPath ),
-                                       array( 'nonLocking' => 1, 'nonJournaled' => 1 )
-                               ) );
-                               if ( !$status->isOK() ) {
-                                       print_r( $status->getErrorsArray() );
-                                       $this->error( "Could not copy $srcPath to $dstPath.", 1 ); // die
+                       $batchPaths = array();
+                       foreach ( $srcPathsRel as $srcPathRel ) {
+                               // Check up on the rate file periodically to adjust the concurrency
+                               if ( $rateFile && ( !$count || ( $count % 500 ) == 0 ) ) {
+                                       $this->mBatchSize = max( 1, (int)file_get_contents( $rateFile ) );
+                                       $this->output( "Batch size is now {$this->mBatchSize}.\n" );
+                               }
+                               $batchPaths[$srcPathRel] = 1; // remove duplicates
+                               if ( count( $batchPaths ) >= $this->mBatchSize ) {
+                                       $this->copyFileBatch( array_keys( $batchPaths ), $backendRel, $src, $dst );
+                                       $batchPaths = array(); // done
                                }
+                               ++$count;
+                       }
+                       if ( count( $batchPaths ) ) { // left-overs
+                               $this->copyFileBatch( array_keys( $batchPaths ), $backendRel, $src, $dst );
+                               $batchPaths = array(); // done
+                       }
 
-                               $this->output( "Copied $srcPath to $dstPath.\n" );
+                       if ( $subDir != '' ) {
+                               $this->output( "Finished container '$container', directory '$subDir'.\n" );
+                       } else {
+                               $this->output( "Finished container '$container'.\n" );
                        }
                }
+
+               $this->output( "Done [$count file(s)].\n" );
+       }
+
+       protected function copyFileBatch(
+               array $srcPathsRel, $backendRel, FileBackend $src, FileBackend $dst
+       ) {
+               $ops = array();
+               $fsFiles = array();
+               $copiedRel = array(); // for output message
+               foreach ( $srcPathsRel as $srcPathRel ) {
+                       $srcPath = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
+                       $dstPath = $dst->getRootStoragePath() . "/$backendRel/$srcPathRel";
+                       if ( $this->hasOption( 'utf8only' ) && !mb_check_encoding( $srcPath, 'UTF-8' ) ) {
+                               $this->error( "Detected illegal (non-UTF8) path for $srcPath." );
+                               continue;
+                       } elseif ( $this->filesAreSame( $src, $dst, $srcPath, $dstPath ) ) {
+                               $this->output( "Already have $srcPathRel.\n" );
+                               continue; // assume already copied...
+                       }
+                       // Note: getLocalReference() is fast for FS backends
+                       $fsFile = $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
+                       if ( !$fsFile ) {
+                               $this->error( "Could not get local copy of $srcPath.", 1 ); // die
+                       } elseif ( !$fsFile->exists() ) {
+                               // FSFileBackends just return the path for getLocalReference() and paths with
+                               // illegal slashes may get normalized to a different path. This can cause the
+                               // local reference to not exist...skip these broken files.
+                               $this->error( "Detected possible illegal path for $srcPath." );
+                               continue;
+                       }
+                       $fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
+                       // Note: prepare() is usually fast for key/value backends
+                       $status = $dst->prepare( array( 'dir' => dirname( $dstPath ), 'bypassReadOnly' => 1 ) );
+                       if ( !$status->isOK() ) {
+                               $this->error( print_r( $status->getErrorsArray(), true ) );
+                               $this->error( "Could not copy $srcPath to $dstPath.", 1 ); // die
+                       }
+                       $ops[] = array( 'op' => 'store',
+                               'src' => $fsFile->getPath(), 'dst' => $dstPath, 'overwrite' => 1 );
+                       $copiedRel[] = $srcPathRel;
+               }
+
+               $t_start = microtime( true );
+               $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+               if ( !$status->isOK() ) {
+                       sleep( 10 ); // wait and retry copy again
+                       $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+               }
+               $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
+               if ( !$status->isOK() ) {
+                       $this->error( print_r( $status->getErrorsArray(), true ) );
+                       $this->error( "Could not copy file batch.", 1 ); // die
+               } elseif ( count( $copiedRel ) ) {
+                       $this->output( "\nCopied these file(s) [{$ellapsed_ms}ms]:\n" .
+                               implode( "\n", $copiedRel ) . "\n\n" );
+               }
+       }
+
+       protected function filesAreSame( FileBackend $src, FileBackend $dst, $sPath, $dPath ) {
+               $skipHash = $this->hasOption( 'skiphash' );
+               return (
+                       ( $src->fileExists( array( 'src' => $sPath, 'latest' => 1 ) )
+                               === $dst->fileExists( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
+                       ) && ( $src->getFileSize( array( 'src' => $sPath, 'latest' => 1 ) )
+                               === $dst->getFileSize( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
+                       ) && ( $skipHash || ( $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
+                               === $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) )
+                       ) )
+               );
        }
 }
 
index 3f328f9..ad5333f 100644 (file)
@@ -22,7 +22,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
  * Maintenance script to create an account and grant it administrator rights.
index 728997d..e638b17 100644 (file)
@@ -50,8 +50,8 @@ class DeleteArchivedFilesImplementation {
                                __METHOD__,
                                array( 'FOR UPDATE' )
                        );
-                       if ( $path && file_exists( $path ) && !$inuse ) {
-                               if( unlink( $path ) ) { // delete
+                       if ( $path && $repo->fileExists( $path ) && !$inuse ) {
+                               if ( $repo->quickPurge( $path ) ) {
                                        $count++;
                                        $dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" );
                                } else {
index 8709ee8..85ffc23 100644 (file)
@@ -24,8 +24,8 @@
  * @author Aaron Schulz
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-require_once( dirname( __FILE__ ) . '/deleteArchivedFiles.inc' );
+require_once( __DIR__ . '/Maintenance.php' );
+require_once( __DIR__ . '/deleteArchivedFiles.inc' );
 
 /**
  * Maintenance script to delete archived (non-current) files from the database.
index 197ffab..414d41a 100644 (file)
@@ -1,7 +1,6 @@
 <?php
-
 /**
- * Delete archived (deleted from public) revisions from the database
+ * Helper methods for the deleteArchivedRevisions.php maintenance script.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
+/**
+ * Helper methods for the deleteArchivedRevisions.php maintenance script.
+ *
+ * @ingroup Maintenance
+ */
 class DeleteArchivedRevisionsImplementation {
 
        /**
index 353661a..4b658bb 100644 (file)
@@ -24,8 +24,8 @@
  * @author Aaron Schulz
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-require_once( dirname( __FILE__ ) . '/deleteArchivedRevisions.inc' );
+require_once( __DIR__ . '/Maintenance.php' );
+require_once( __DIR__ . '/deleteArchivedRevisions.inc' );
 
 /**
  * Maintenance script to delete archived (deleted from public) revisions
index 8963ae1..936a52b 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Deletes a batch of pages
+ * Deletes a batch of pages.
  * Usage: php deleteBatch.php [-u <user>] [-r <reason>] [-i <interval>] [listfile]
  * where
  *     [listfile] is a file where each line contains the title of a page to be
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to delete a batch of pages.
+ *
+ * @ingroup Maintenance
+ */
 class DeleteBatch extends Maintenance {
 
        public function __construct() {
index 4f5889b..4ab6d1d 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that deletes all pages in the MediaWiki namespace
+ * which were last edited by "MediaWiki default".
+ *
+ * @ingroup Maintenance
+ */
 class DeleteDefaultMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
index 007f0d1..3c8c5fd 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * This script delete image information from the cache.
+ * Delete image information from the object cache.
  *
  * Usage example:
  * php deleteImageMemcached.php --until "2005-09-05 00:00:00" --sleep 0
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that deletes image information from the object cache.
+ *
+ * @ingroup Maintenance
+ */
 class DeleteImageCache extends Maintenance {
        public function __construct() {
                parent::__construct();
index 8347a29..6a3e211 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Delete old (non-current) revisions from the database
  *
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that deletes old (non-current) revisions from the database.
+ *
+ * @ingroup Maintenance
+ */
 class DeleteOldRevisions extends Maintenance {
        public function __construct() {
                parent::__construct();
index 9fe5794..5dc7567 100644 (file)
@@ -1,8 +1,7 @@
 <?php
-
 /**
- * Maintenance script to delete revisions which refer to a nonexisting page
- * Sometimes manual deletion done in a rush leaves crap in the database
+ * Delete revisions which refer to a nonexisting page.
+ * Sometimes manual deletion done in a rush leaves crap in the database.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Rob Church <robchur@gmail.com>
  * @todo More efficient cleanup of text records
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that deletes revisions which refer to a nonexisting page.
+ *
+ * @ingroup Maintenance
+ */
 class DeleteOrphanedRevisions extends Maintenance {
        public function __construct() {
                parent::__construct();
index 5e8ecaa..ad6470d 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that deletes one or more revisions by moving them
+ * to the archive table.
+ *
+ * @ingroup Maintenance
+ */
 class DeleteRevision extends Maintenance {
 
        public function __construct() {
index 447d3bd..da220d6 100644 (file)
@@ -1,10 +1,6 @@
 <?php
 /**
- * We want to make this whole thing as seamless as possible to the
- * end-user. Unfortunately, we can't do _all_ of the work in the class
- * because A) included files are not in global scope, but in the scope
- * of their caller, and B) MediaWiki has way too many globals. So instead
- * we'll kinda fake it, and do the requires() inline. <3 PHP
+ * Delete self-references to $wgServer from the externallinks table.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that deletes self-references to $wgServer
+ * from the externallinks table.
+ *
+ * @ingroup Maintenance
+ */
 class DeleteSelfExternals extends Maintenance {
        public function __construct() {
                parent::__construct();
index 3021b93..7ce8794 100644 (file)
@@ -1,12 +1,14 @@
 # Include-able script to determine the location of our php if any
+# We search for a environment var called PHP, native php,
+# a local copy, home directory location used by installphp.sh
+# and previous home directory location
+# The binary path is returned in $PHP if any
 
-if [ -d "$DEV/php" -a -x "$DEV/php/bin/php" ]; then
-       # Quick local copy
-       PHP="$DEV/php/bin/php"
-elif [ -d "$HOME/.mediawiki/php" -a -x "$HOME/.mediawiki/php/bin/php" ]; then
-       # Previous home directory location to install php in
-       PHP="$HOME/.mediawiki/php/bin/php"
-elif [ -d "$HOME/.mwphp" -a -x "$HOME/.mwphp/bin/php" ]; then
-       # Previous home directory location to install php in
-       PHP="$HOME/.mwphp/bin/php"
-fi
+for binary in $PHP `which php || true` "$DEV/php/bin/php" "$HOME/.mediawiki/php/bin/php" "$HOME/.mwphp/bin/php" ]; do
+       if [ -x "$binary" ]; then
+               if "$binary" -r 'exit((int)!version_compare(PHP_VERSION, "5.4", ">="));'; then
+                       PHP="$binary"
+                       break
+               fi
+       fi
+done
index 6b29c5f..2bb2a0f 100644 (file)
@@ -93,6 +93,11 @@ if ( $maintenance->getDbType() === Maintenance::DB_ADMIN &&
 {
        require( MWInit::interpretedPath( 'AdminSettings.php' ) );
 }
+
+if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
+       if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) )
+               $wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
+}
 $maintenance->finalSetup();
 // Some last includes
 require_once( MWInit::compiledPath( 'includes/Setup.php' ) );
index 4638468..c9546c6 100644 (file)
@@ -29,8 +29,8 @@ $originalDir = getcwd();
 
 $optionsWithArgs = array( 'pagelist', 'start', 'end', 'revstart', 'revend');
 
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
-require_once( dirname( __FILE__ ) . '/backup.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
+require_once( __DIR__ . '/backup.inc' );
 
 $dumper = new BackupDumper( $argv );
 
index 470bc56..485218c 100644 (file)
@@ -4,7 +4,8 @@
  * Used as a base class for CompareParsers and PreprocessDump.
  * We implement below the simple task of searching inside a dump.
  *
- * Copyright (C) 2011 Platonides - http://www.mediawiki.org/
+ * Copyright © 2011 Platonides
+ * http://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Base class for interating over a dump.
+ *
+ * @ingroup Maintenance
+ */
 abstract class DumpIterator extends Maintenance {
 
        private $count = 0;
@@ -141,6 +147,11 @@ abstract class DumpIterator extends Maintenance {
        abstract public function processRevision( $rev );
 }
 
+/**
+ * Maintenance script that runs a regex in the revisions from a dump.
+ *
+ * @ingroup Maintenance
+ */
 class SearchDump extends DumpIterator {
 
        public function __construct() {
index 0101dc8..153fdd7 100644 (file)
@@ -1,8 +1,5 @@
 <?php
 /**
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
  * Quick demo hack to generate a plaintext link dump,
  * per the proposed wiki link database standard:
  * http://www.usemod.com/cgi-bin/mb.pl?LinkDatabase
@@ -11,6 +8,9 @@
  * Does not include interwiki or URL links.
  * Dumps ASCII text to stdout; command-line.
  *
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that generates a plaintext link dump.
+ *
+ * @ingroup Maintenance
+ */
 class DumpLinks extends Maintenance {
        public function __construct() {
                parent::__construct();
index f5abcd1..e05e154 100644 (file)
@@ -3,7 +3,7 @@
  * Quickie page name dump script for SisterSites usage.
  * http://www.eekim.com/cgi-bin/wiki.pl?SisterSites
  *
- * Copyright (C) 2006 Brion Vibber <brion@pobox.com>
+ * Copyright © 2006 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that generates a page name dump for SisterSites usage.
+ *
+ * @ingroup Maintenance
+ */
 class DumpSisterSites extends Maintenance {
        public function __construct() {
                parent::__construct();
index 41a7a68..72d7d97 100644 (file)
@@ -26,8 +26,8 @@
 
 $originalDir = getcwd();
 
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
-require_once( dirname( __FILE__ ) . '/backupTextPass.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
+require_once( __DIR__ . '/backupTextPass.inc' );
 
 
 $dumper = new TextPassDumper( $argv );
index 919bb4d..0d0dfcf 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Dump a the list of files uploaded, for feeding to tar or similar
+ * Dump a the list of files uploaded, for feeding to tar or similar.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to dump a the list of files uploaded,
+ * for feeding to tar or similar.
+ *
+ * @ingroup Maintenance
+ */
 class UploadDumper extends Maintenance {
        public function __construct() {
                parent::__construct();
index 8857371..59df5e8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Make an edit
+ * Make a page edit.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to make a page edit.
+ *
+ * @ingroup Maintenance
+ */
 class EditCLI extends Maintenance {
        public function __construct() {
                parent::__construct();
index 3bd164f..5aefe1c 100644 (file)
@@ -34,7 +34,7 @@
 $optionsWithArgs = array( 'd' );
 
 /** */
-require_once( dirname( __FILE__ ) . "/commandLine.inc" );
+require_once( __DIR__ . "/commandLine.inc" );
 
 if ( isset( $options['d'] ) ) {
        $d = $options['d'];
index 3b43bcd..a705bcc 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Communications protocol...
+ * Communications protocol.
  * This is used by dumpTextPass.php when the --spawn option is present.
  *
  * This program is free software; you can redistribute it and/or modify
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script used to fetch page text in a subprocess.
+ *
+ * @ingroup Maintenance
+ */
 class FetchText extends Maintenance {
        public function __construct() {
                parent::__construct();
index b16bd95..501bcfc 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Maintenance script to test fileop performance
+ * Test for fileop performance.
  *
  * 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
@@ -25,8 +25,13 @@ $initialTime = microtime( true );
 $wgProfiler = array( 'class' => 'ProfilerSimpleText' );
 error_reporting( E_ALL );
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to test fileop performance.
+ *
+ * @ingroup Maintenance
+ */
 class TestFileOpPerformance extends Maintenance {
        public function __construct() {
                parent::__construct();
@@ -35,6 +40,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->addOption( 'b2', 'Backend 2', false, true );
                $this->addOption( 'srcdir', 'File source directory', true, true );
                $this->addOption( 'maxfiles', 'Max files', false, true );
+               $this->addOption( 'quick', 'Avoid operation pre-checks' );
        }
 
        public function execute() {
@@ -71,11 +77,14 @@ class TestFileOpPerformance extends Maintenance {
                        if ( $file[0] != '.' ) {
                                $this->output( "Using '$dirname/$file' in operations.\n" );
                                $dst = $baseDir . '/' . wfBaseName( $file );
-                               $ops1[] = array( 'op' => 'store', 'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1);
-                               $ops2[] = array( 'op' => 'copy', 'src' => "$dst", 'dst' => "$dst-1", 'overwrite' => 1);
-                               $ops3[] = array( 'op' => 'move', 'src' => $dst, 'dst' => "$dst-2", 'overwrite' => 1);
-                               $ops4[] = array( 'op' => 'delete', 'src' => "$dst-1", 'overwrite' => 1 );
-                               $ops5[] = array( 'op' => 'delete', 'src' => "$dst-2", 'overwrite' => 1 );
+                               $ops1[] = array( 'op' => 'store',
+                                       'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1);
+                               $ops2[] = array( 'op' => 'copy',
+                                       'src' => "$dst", 'dst' => "$dst-1", 'overwrite' => 1 );
+                               $ops3[] = array( 'op' => 'move',
+                                       'src' => $dst, 'dst' => "$dst-2", 'overwrite' => 1 );
+                               $ops4[] = array( 'op' => 'delete', 'src' => "$dst-1" );
+                               $ops5[] = array( 'op' => 'delete', 'src' => "$dst-2" );
                        }
                        if ( count( $ops1 ) >= $this->getOption( 'maxfiles', 20 ) ) {
                                break; // enough
@@ -84,8 +93,10 @@ class TestFileOpPerformance extends Maintenance {
                closedir( $dir );
                $this->output( "\n" );
 
+               $method = $this->hasOption( 'quick' ) ? 'doQuickOperations' : 'doOperations';
+
                $start = microtime( true );
-               $status = $backend->doOperations( $ops1, array( 'force' => 1 ) );
+               $status = $backend->$method( $ops1, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
@@ -94,7 +105,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->output( $backend->getName() . ": Stored " . count( $ops1 ) . " files in $e ms.\n" );
 
                $start = microtime( true );
-               $backend->doOperations( $ops2, array( 'force' => 1 ) );
+               $backend->$method( $ops2, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
@@ -103,7 +114,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->output( $backend->getName() . ": Copied " . count( $ops2 ) . " files in $e ms.\n" );
 
                $start = microtime( true );
-               $backend->doOperations( $ops3, array( 'force' => 1 ) );
+               $backend->$method( $ops3, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
@@ -112,7 +123,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->output( $backend->getName() . ": Moved " . count( $ops3 ) . " files in $e ms.\n" );
 
                $start = microtime( true );
-               $backend->doOperations( $ops4, array( 'force' => 1 ) );
+               $backend->$method( $ops4, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
@@ -121,7 +132,7 @@ class TestFileOpPerformance extends Maintenance {
                $this->output( $backend->getName() . ": Deleted " . count( $ops4 ) . " files in $e ms.\n" );
 
                $start = microtime( true );
-               $backend->doOperations( $ops5, array( 'force' => 1 ) );
+               $backend->$method( $ops5, array( 'force' => 1 ) );
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
index b8512e5..e273c54 100644 (file)
  * @author Antoine Musso <hashar at free dot fr>
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that compares documented and actually present mismatches.
+ *
+ * @ingroup Maintenance
+ */
 class FindHooks extends Maintenance {
        public function __construct() {
                parent::__construct();
index c1d14dd..6f017ec 100644 (file)
@@ -1,8 +1,8 @@
 <?php
 /**
- * Script to fix double redirects.
+ * Fix double redirects.
  *
- * Copyright (C) 2011 Ilmari Karonen <nospam@vyznev.net>
+ * Copyright © 2011 Ilmari Karonen <nospam@vyznev.net>
  * http://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that fixes double redirects.
+ *
+ * @ingroup Maintenance
+ */
 class FixDoubleRedirects extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Script to fix double redirects";
                $this->addOption( 'async', 'Don\'t fix anything directly, just queue the jobs' );
                $this->addOption( 'title', 'Fix only redirects pointing to this page', false, true );
-               $this->addOption( 'dry-run', 'Perform a dry run, fix nothing' );                
+               $this->addOption( 'dry-run', 'Perform a dry run, fix nothing' );
        }
 
        public function execute() {
index 0cabe81..2403ec6 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that fixes any entriy for protocol-relative URLs
+ * in the externallinks table.
+ *
+ * @ingroup Maintenance
+ */
 class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
        public function __construct() {
                parent::__construct();
index 7731d3e..8bf556f 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Fix erroneous page_latest values due to slave desynchronisation.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that fixes erroneous page_latest values
+ * due to slave desynchronisation.
+ *
+ * @ingroup Maintenance
+ */
 class FixSlaveDesync extends Maintenance {
        public function __construct() {
                parent::__construct();
index 3e3bd0a..84d08d3 100644 (file)
@@ -1,10 +1,10 @@
 <?php
 /**
- * This script fixes timestamp corruption caused by one or more webservers
- * temporarily being set to the wrong time. The time offset must be known and
- * consistent. Start and end times (in 14-character format) restrict the search,
- * and must bracket the damage. There must be a majority of good timestamps in the
- * search period.
+ * Fixes timestamp corruption caused by one or more webservers temporarily
+ * being set to the wrong time.
+ * The time offset must be known and consistent. Start and end times
+ * (in 14-character format) restrict the search, and must bracket the damage.
+ * There must be a majority of good timestamps in the search period.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that fixes timestamp corruption caused by one or
+ * more webservers temporarily being set to the wrong time.
+ *
+ * @ingroup Maintenance
+ */
 class FixTimestamps extends Maintenance {
        public function __construct() {
                parent::__construct();
index d4ff7c2..91d42a5 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that fixes the user_registration field.
+ *
+ * @ingroup Maintenance
+ */
 class FixUserRegistration extends Maintenance {
        public function __construct() {
                parent::__construct();
index fa98813..600ca97 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Format RELEASE-NOTE file to wiki text or HTML markup.
+ *
  * 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 Maintenance
  */
 
-require_once( dirname( __FILE__ ) .'/Maintenance.php' );
+require_once( __DIR__ .'/Maintenance.php' );
 
+/**
+ * Maintenance script that formats RELEASE-NOTE file to wiki text or HTML markup.
+ *
+ * @ingroup Maintenance
+ */
 class MaintenanceFormatInstallDoc extends Maintenance {
        function __construct() {
                parent::__construct();
index 216af37..1c96a57 100644 (file)
@@ -181,7 +181,7 @@ TODO:
 // ///////////////////////// COMMAND LINE HELP ////////////////////////////////////
 
 // This is a command line script, load MediaWiki env (gives command line options);
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
 
 // if the user asked for an explanation of command line options.
 if ( isset( $options["help"] ) ) {
@@ -381,7 +381,6 @@ class wikiFuzz {
                        "br"         => array( "CLASS", "ID", "STYLE", "title", "clear" ),
                        "cite"       => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
                        "var"        => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
-                       "dl"         => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
                        "ruby"       => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
                        "rt"         => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
                        "rp"         => array( "CLASS", "ID", "STYLE", "lang", "dir", "title" ),
@@ -1360,6 +1359,7 @@ class viewPageTest extends pageTest {
                                "rdfrom"         => wikiFuzz::makeFuzz( 2 ),  // things from Article.php from here on:
                                "token"          => wikiFuzz::makeFuzz( 2 ),
                                "tbid"           => wikiFuzz::makeFuzz( 2 ),
+                               // @todo FIXME: Duplicate array key.
                                "action"         => wikiFuzz::chooseInput( array( "purge", wikiFuzz::makeFuzz( 2 ) ) ),
                                "wpReason"       => wikiFuzz::makeFuzz( 2 ),
                                "wpEditToken"    => wikiFuzz::makeFuzz( 2 ),
index 7e83d5f..f3a5d87 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Creates a sitemap for the site
+ * Creates a sitemap for the site.
  *
  * Copyright © 2005, Ævar Arnfjörð Bjarmason, Jens Frank <jeluf@gmx.de> and
  * Brion Vibber <brion@pobox.com>
  * @see http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that generates a sitemap for the site.
+ *
+ * @ingroup Maintenance
+ */
 class GenerateSitemap extends Maintenance {
        const GS_MAIN = -2;
        const GS_TALK = -1;
index 0322fa2..72b1d48 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Display replication lag times.
+ *
  * 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
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that displays replication lag times.
+ *
+ * @ingroup Maintenance
+ */
 class GetLagTimes extends Maintenance {
        public function __construct() {
                parent::__construct();
index 3d13bc4..ec9ed20 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * This script reports the hostname of a slave server.
+ * Reports the hostname of a slave server.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that reports the hostname of a slave server.
+ *
+ * @ingroup Maintenance
+ */
 class GetSlaveServer extends Maintenance {
        public function __construct() {
                parent::__construct();
index eb04411..3e2f854 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 /**
- * Outputs page text to stdout, useful for command-line editing automation.
+ * Outputs page text to stdout.
+ * Useful for command-line editing automation.
  * Example: php getText.php "page title" | sed -e '...' | php edit.php "page title"
  *
  * This program is free software; you can redistribute it and/or modify
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that outputs page text to stdout.
+ *
+ * @ingroup Maintenance
+ */
 class GetTextMaint extends Maintenance {
        public function __construct() {
                parent::__construct();
index 2bb9951..2fa70dc 100755 (executable)
@@ -2,7 +2,7 @@
 <?php
 
 define( 'MW_CONFIG_CALLBACK', 'MakeHipHop::noConfigNeeded' );
-require( dirname( __FILE__ ) . '/../Maintenance.php' );
+require( __DIR__ . '/../Maintenance.php' );
 
 class MakeHipHop extends Maintenance {
        function noConfigNeeded() {}
@@ -12,7 +12,7 @@ class MakeHipHop extends Maintenance {
 
                $startTime = time();
 
-               $thisDir = realpath( dirname( __FILE__ ) );
+               $thisDir = realpath( __DIR__ );
                $IP = realpath( "$thisDir/../.." );
                if ( strval( $wgHipHopBuildDirectory ) !== '' ) {
                        $buildDir = $wgHipHopBuildDirectory;
@@ -278,7 +278,7 @@ class MakeHipHop extends Maintenance {
                        }
                }
 
-               $extraCoreFiles = array_map( 'trim', file( dirname( __FILE__ ) . '/extra-files' ) );
+               $extraCoreFiles = array_map( 'trim', file( __DIR__ . '/extra-files' ) );
                foreach ( $extraCoreFiles as $file ) {
                        if ( $file === '' ) {
                                continue;
index 0ad4313..1c4b51f 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/hphpi -f
 <?php
 
-require( dirname( __FILE__ ) . '/../Maintenance.php' );
+require( __DIR__ . '/../Maintenance.php' );
 
 class RunHipHopServer extends Maintenance {
        function __construct() {
@@ -19,7 +19,7 @@ class RunHipHopServer extends Maintenance {
 
        function runCompiled() {
                global $wgHipHopBuildDirectory;
-               $thisDir = realpath( dirname( __FILE__ ) );
+               $thisDir = realpath( __DIR__ );
                $IP = realpath( "$thisDir/../.." );
                if ( strval( $wgHipHopBuildDirectory ) !== '' ) {
                        $buildDir = $wgHipHopBuildDirectory;
@@ -51,7 +51,7 @@ class RunHipHopServer extends Maintenance {
        }
 
        function runInterpreted() {
-               $thisDir = realpath( dirname( __FILE__ ) );
+               $thisDir = realpath( __DIR__ );
                $IP = realpath( "$thisDir/../.." );
                $sourceBase = realpath( "$IP/.." );
 
index 2ad0872..b089f70 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 /**
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Import XML dump files into the current wiki.
+ *
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 /**
+ * Maintenance script that imports XML dump files into the current wiki.
+ *
  * @ingroup Maintenance
  */
 class BackupReader extends Maintenance {
index 5eb68f2..ac5d144 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Support functions for the importImages script
+ * Support functions for the importImages.php script
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index bd077ff..8d92383 100644 (file)
@@ -1,8 +1,7 @@
 <?php
-
 /**
- * Maintenance script to import one or more images from the local file system into
- * the wiki without using the web-based interface.
+ * Import one or more images from the local file system into the wiki without
+ * using the web-based interface.
  *
  * "Smart import" additions:
  * - aim: preserve the essential metadata (user, description) when importing medias from an existing wiki
@@ -33,8 +32,8 @@
  */
 
 $optionsWithArgs = array( 'extensions', 'comment', 'comment-file', 'comment-ext', 'user', 'license', 'sleep', 'limit', 'from', 'source-wiki-url' );
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
-require_once( dirname( __FILE__ ) . '/importImages.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
+require_once( __DIR__ . '/importImages.inc' );
 $processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
 
 echo( "Import Images\n\n" );
index 0ce9388..e369cb1 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
- * Maintenance script to import all scripts in the MediaWiki namespace from a
- * local site.
+ * Import all scripts in the MediaWiki namespace from a local site.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to import all scripts in the MediaWiki namespace from a
+ * local site.
+ *
+ * @ingroup Maintenance
+ */
 class ImportSiteScripts extends Maintenance {
        public function __construct() {
                parent::__construct();
@@ -32,17 +37,17 @@ class ImportSiteScripts extends Maintenance {
                $this->addArg( 'index', 'index.php base url' );
                $this->addOption( 'username', 'User name of the script importer' );
        }
-       
+
        public function execute() {
                global $wgUser;
 
                $user = User::newFromName( $this->getOption( 'username', 'ScriptImporter' ) );
                $wgUser = $user;
-               
+
                $baseUrl = $this->getArg( 1 );
                $pageList = $this->fetchScriptList();
                $this->output( 'Importing ' . count( $pageList ) . " pages\n" );
-               
+
                foreach ( $pageList as $page ) {
                        $title = Title::makeTitleSafe( NS_MEDIAWIKI, $page );
                        if ( !$title ) {
@@ -51,34 +56,34 @@ class ImportSiteScripts extends Maintenance {
                        }
 
                        $this->output( "Importing $page\n" );
-                       $url = wfAppendQuery( $baseUrl, array( 
-                               'action' => 'raw', 
+                       $url = wfAppendQuery( $baseUrl, array(
+                               'action' => 'raw',
                                'title' => "MediaWiki:{$page}" ) );
                        $text = Http::get( $url );
 
                        $wikiPage = WikiPage::factory( $title );
                        $wikiPage->doEdit( $text, "Importing from $url", 0, false, $user );
                }
-               
+
        }
-       
+
        protected function fetchScriptList() {
-               $data = array( 
+               $data = array(
                        'action' => 'query',
                        'format' => 'php',//'json',
                        'list' => 'allpages',
                        'apnamespace' => '8',
-                       'aplimit' => '500', 
+                       'aplimit' => '500',
                );
                $baseUrl = $this->getArg( 0 );
                $pages = array();
-               
+
                do {
                        $url = wfAppendQuery( $baseUrl, $data );
                        $strResult = Http::get( $url );
                        //$result = FormatJson::decode( $strResult ); // Still broken
                        $result = unserialize( $strResult );
-                       
+
                        if ( !empty( $result['query']['allpages'] ) ) {
                                foreach ( $result['query']['allpages'] as $page ) {
                                        if ( substr( $page['title'], -3 ) === '.js' ) {
@@ -92,9 +97,9 @@ class ImportSiteScripts extends Maintenance {
                                $this->output( "Fetching new batch from {$data['apfrom']}\n" );
                        }
                } while ( isset( $result['query-continue'] ) );
-               
+
                return $pages;
-               
+
        }
 }
 
index ec9ff00..adb5063 100644 (file)
@@ -1,8 +1,6 @@
 <?php
-
 /**
- * Maintenance script allows creating or editing pages using
- * the contents of a text file
+ * Create or edit pages using the contents of a text file.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,7 +24,7 @@
 
 $options = array( 'help', 'nooverwrite', 'norc' );
 $optionsWithArgs = array( 'title', 'user', 'comment' );
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
 echo( "Import Text File\n\n" );
 
 if ( count( $args ) < 1 || isset( $options['help'] ) ) {
index 0f13645..3135b4c 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class InitEditCount extends Maintenance {
        public function __construct() {
index eab9c8d..5d8b886 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Maintenance script to re-initialise or update the site statistics table
+ * Re-initialise or update the site statistics table.
  *
  * 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
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to re-initialise or update the site statistics table
+ *
+ * @ingroup Maintenance
+ */
 class InitStats extends Maintenance {
        public function __construct() {
                parent::__construct();
index 65d6a70..762bb94 100644 (file)
@@ -1,6 +1,7 @@
 <?php
-
 /**
+ * CLI-based MediaWiki installation and configuration.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -16,8 +17,8 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
- * @see wfWaitForSlaves()
  */
 
 if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
@@ -29,8 +30,13 @@ if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
-require_once( dirname( dirname( __FILE__ ) )."/maintenance/Maintenance.php" );
+require_once( dirname( __DIR__ )."/maintenance/Maintenance.php" );
 
+/**
+ * Maintenance script to install and configure MediaWiki
+ *
+ * @ingroup Maintenance
+ */
 class CommandLineInstaller extends Maintenance {
        function __construct() {
                parent::__construct();
@@ -39,7 +45,7 @@ class CommandLineInstaller extends Maintenance {
                $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. You will be prompted for this if it isn\'t provided', false, true );
+               $this->addOption( 'pass', 'The password for the wiki administrator.', true, true );
                /* $this->addOption( 'email', 'The email for the wiki administrator', false, true ); */
                $this->addOption( 'scriptpath', 'The relative path of the wiki in the web server (/wiki)', false, true );
 
index da6798e..ceafc39 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Maintenance script to do test JavaScript validity parses using jsmin+'s parser
+ * Test JavaScript validity parses using jsmin+'s parser
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to do test JavaScript validity parses using jsmin+'s parser
+ *
+ * @ingroup Maintenance
+ */
 class JSParseHelper extends Maintenance {
        var $errs = 0;
 
@@ -35,7 +41,7 @@ class JSParseHelper extends Maintenance {
                if ( $this->hasArg() ) {
                        $files = $this->mArgs;
                } else {
-                       $this->maybeHelp( true ); // @fixme this is a lame API :)
+                       $this->maybeHelp( true ); // @todo fixme this is a lame API :)
                        exit( 1 ); // it should exit from the above first...
                }
 
index dc8bff5..3ad0864 100644 (file)
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to show database lag.
+ *
+ * @ingroup Maintenance
+ */
 class DatabaseLag extends Maintenance {
        public function __construct() {
                parent::__construct();
index f872e6a..b537f9b 100644 (file)
@@ -20,7 +20,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class AllTrans extends Maintenance {
        public function __construct() {
index ea5b187..1888c4c 100644 (file)
@@ -21,8 +21,8 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
-$messagesDir = dirname( __FILE__ ) . '/../../languages/messages/';
+require_once( __DIR__ . '/../commandLine.inc' );
+$messagesDir = __DIR__ . '/../../languages/messages/';
 $runTest = false;
 $run = false;
 $runMode = 'text';
index a58a8f5..ebc62b6 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
+require_once( __DIR__ . '/../commandLine.inc' );
 require_once( 'languages.inc' );
 require_once( 'checkLanguage.inc' );
 
index 69f6108..99ba4e9 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
+require_once( __DIR__ . '/../commandLine.inc' );
 require_once( 'checkLanguage.inc' );
 require_once( 'languages.inc' );
 
index f949ddc..d37d22e 100644 (file)
@@ -20,7 +20,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class CountMessages extends Maintenance {
        public function __construct() {
index 04f5e8b..505cb57 100644 (file)
@@ -20,7 +20,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class DateFormats extends Maintenance {
 
index a80ac01..7e729b4 100644 (file)
@@ -18,7 +18,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class Digit2Html extends Maintenance {
 
index 9bdda09..9292ce3 100644 (file)
@@ -22,7 +22,7 @@
  * @todo Make this more useful, right now just dumps $wgContentLang
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class DumpMessages extends Maintenance {
        public function __construct() {
@@ -35,7 +35,7 @@ class DumpMessages extends Maintenance {
 
                $messages = array();
                foreach ( array_keys( Language::getMessagesFor( 'en' ) ) as $key ) {
-                       $messages[$key] = wfMsg( $key );
+                       $messages[$key] = wfMessage( $key )->text();
                }
                $this->output( "MediaWiki $wgVersion language file\n" );
                $this->output( serialize( $messages ) );
index 4cb90ff..c4a8e54 100644 (file)
@@ -21,7 +21,7 @@
  * @file
  */
 
-require_once( dirname( __FILE__ ) .'/../Maintenance.php' );
+require_once( __DIR__ .'/../Maintenance.php' );
 
 /**
  * Generate first letter data files for Collation.php
index 3dfda92..f3cc568 100644 (file)
@@ -21,9 +21,9 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
-require_once( dirname( __FILE__ ) . '/../../includes/normal/UtfNormalUtil.php' );
+require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
 
 /**
  * Generates normalizer data files for Arabic and Malayalam.
index 28fe120..2323638 100644 (file)
@@ -22,8 +22,8 @@
  */
 
 /** This is a command line script */
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
-require_once( dirname( __FILE__ ) . '/languages.inc' );
+require_once( __DIR__ . '/../Maintenance.php' );
+require_once( __DIR__ . '/languages.inc' );
 
 class LangMemUsage extends Maintenance {
 
index 15fa712..b76f921 100644 (file)
@@ -46,7 +46,7 @@ class languages {
         * @param $exif bool Treat the EXIF messages?
         */
        function __construct( $exif = true ) {
-               require( dirname(__FILE__) . '/messageTypes.inc' );
+               require( __DIR__ . '/messageTypes.inc' );
                $this->mIgnoredMessages = $wgIgnoredMessages;
                if ( $exif ) {
                        $this->mOptionalMessages = array_merge( $wgOptionalMessages );
index 9cdbf34..ce1dbb9 100644 (file)
@@ -169,6 +169,7 @@ $wgIgnoredMessages = array(
        'mostlinkedtemplates-summary',
        'mostcategories-summary',
        'mostimages-summary',
+       'mostinterwikis-summary',
        'mostrevisions-summary',
        'prefixindex-summary',
        'shortpages-summary',
@@ -188,6 +189,7 @@ $wgIgnoredMessages = array(
        'wantedtemplates-summary',
        'activeusers-summary',
        'search-summary',
+       'editpage-head-copy-warn',
        'editpage-tos-summary',
        'addsection-preload',
        'addsection-editintro',
@@ -241,6 +243,9 @@ $wgIgnoredMessages = array(
        'version-entrypoints-index-php',
        'version-entrypoints-api-php',
        'version-entrypoints-load-php',
+       'ipb-default-expiry',
+       'pageinfo-header',
+       'pageinfo-footer',
 );
 
 /** Optional messages, which may be translated only if changed in the target language. */
@@ -251,7 +256,6 @@ $wgOptionalMessages = array(
        'feed-rss',
        'unit-pixel',
        'userrights-irreversible-marker',
-       'tog-nolangconversion',
        'tog-noconvertlink',
        'variantname-zh-hans',
        'variantname-zh-hant',
@@ -474,6 +478,7 @@ $wgOptionalMessages = array(
        'mergehistory-revisionrow',
        'categoryviewer-pagedlinks',
        'undelete-revisionrow',
+       'pageinfo-redirects-value',
 );
 
 /** EXIF messages, which may be set as optional in several checks, but are generally mandatory */
index fbdef20..b644d8e 100644 (file)
@@ -67,7 +67,6 @@ $wgMessageStructure = array(
                'tog-watchlisthideliu',
                'tog-watchlisthideanons',
                'tog-watchlisthidepatrolled',
-               'tog-nolangconversion',
                'tog-ccmeonemails',
                'tog-diffonly',
                'tog-showhiddencats',
@@ -306,6 +305,10 @@ $wgMessageStructure = array(
                'youhavenewmessages',
                'newmessageslink',
                'newmessagesdifflink',
+               'youhavenewmessagesfromusers',
+               'youhavenewmessagesmanyusers',
+               'newmessageslinkplural',
+               'newmessagesdifflinkplural',
                'youhavenewmessagesmulti',
                'newtalkseparator',
                'editsection',
@@ -368,9 +371,9 @@ $wgMessageStructure = array(
                'readonly',
                'enterlockreason',
                'readonlytext',
-               'missing-article',
-               'missingarticle-rev',
-               'missingarticle-diff',
+               'missing-article', // not used anymore in core, but kept for extensions
+               'missingarticle-rev', // not used anymore in core, but kept for extensions
+               'missingarticle-diff', // not used anymore in core, but kept for extensions
                'readonly_lag',
                'internalerror',
                'internalerror_info',
@@ -387,6 +390,7 @@ $wgMessageStructure = array(
                'badarticleerror',
                'cannotdelete',
                'cannotdelete-title',
+               'delete-hook-aborted',
                'badtitle',
                'badtitletext',
                'perfcached',
@@ -412,6 +416,8 @@ $wgMessageStructure = array(
                'filereadonlyerror',
                'invalidtitle-knownnamespace',
                'invalidtitle-unknownnamespace',
+               'exception-nologin',
+               'exception-nologin-text',
        ),
        'virus' => array(
                'virus-badscanner',
@@ -427,6 +433,7 @@ $wgMessageStructure = array(
                'remembermypassword',
                'securelogin-stick-https',
                'yourdomainname',
+               'password-change-forbidden',
                'externaldberror',
                'login',
                'nav-login-createaccount',
@@ -612,6 +619,7 @@ $wgMessageStructure = array(
                'noarticletext',
                'noarticletext-nopermission',
                'noarticletextanon',
+               'missing-revision',
                'userpage-userdoesnotexist',
                'userpage-userdoesnotexist-view',
                'blocked-notice-logextract',
@@ -645,6 +653,7 @@ $wgMessageStructure = array(
                'yourdiff',
                'copyrightwarning',
                'copyrightwarning2',
+               'editpage-head-copy-warn',
                'editpage-tos-summary',
                'longpage-hint',
                'longpageerror',
@@ -697,6 +706,7 @@ $wgMessageStructure = array(
                'expansion-depth-exceeded-warning',
                'parser-unstrip-loop-warning',
                'parser-unstrip-recursion-limit',
+               'converter-manual-rule-error',
        ),
        'undo' => array(
                'undo-success',
@@ -853,6 +863,7 @@ $wgMessageStructure = array(
                'editundo',
                'diff-multi',
                'diff-multi-manyusers',
+               'difference-missing-revision',
        ),
        'search' => array(
                'search-summary',
@@ -1131,6 +1142,7 @@ $wgMessageStructure = array(
                'right-writeapi',
                'right-delete',
                'right-bigdelete',
+               'right-deletelogentry',
                'right-deleterevision',
                'right-deletedhistory',
                'right-deletedtext',
@@ -1407,9 +1419,11 @@ $wgMessageStructure = array(
                'lockmanager-fail-deletelock',
                'lockmanager-fail-acquirelock',
                'lockmanager-fail-openlock',
+               'lockmanager-fail-acquirelock',
                'lockmanager-fail-releaselock',
                'lockmanager-fail-db-bucket',
                'lockmanager-fail-db-release',
+               'lockmanager-fail-svr-acquire',
                'lockmanager-fail-svr-release'
        ),
 
@@ -1522,6 +1536,7 @@ $wgMessageStructure = array(
                'shared-repo',
                'shared-repo-name-wikimediacommons',
                'filepage.css',
+               'upload-disallowed-here',
        ),
        'filerevert' => array(
                'filerevert',
@@ -1637,6 +1652,7 @@ $wgMessageStructure = array(
        'specialpages' => array(
                'nbytes',
                'ncategories',
+               'ninterwikis',
                'nlinks',
                'nmembers',
                'nrevisions',
@@ -1683,6 +1699,8 @@ $wgMessageStructure = array(
                'mostcategories-summary',
                'mostimages',
                'mostimages-summary',
+               'mostinterwikis',
+               'mostinterwikis-summary',
                'mostrevisions',
                'mostrevisions-summary',
                'prefixindex',
@@ -1845,6 +1863,8 @@ $wgMessageStructure = array(
                'mailnologin',
                'mailnologintext',
                'emailuser',
+               'emailuser-title-target',
+               'emailuser-title-notarget',
                'emailuser-summary',
                'emailpage',
                'emailpagetext',
@@ -1956,6 +1976,8 @@ $wgMessageStructure = array(
                'rollback',
                'rollback_short',
                'rollbacklink',
+               'rollbacklinkcount',
+               'rollbacklinkcount-morethan',
                'rollbackfailed',
                'cantrollback',
                'alreadyrolled',
@@ -2245,6 +2267,7 @@ $wgMessageStructure = array(
                'cant-see-hidden-user',
                'ipbblocked',
                'ipbnounblockself',
+               'ipb-default-expiry',
        ),
        'developertools' => array(
                'lockdb',
@@ -2383,6 +2406,7 @@ $wgMessageStructure = array(
                'import-interwiki-templates',
                'import-interwiki-submit',
                'import-interwiki-namespace',
+               'import-interwiki-rootpage',
                'import-upload-filename',
                'import-comment',
                'importtext',
@@ -2414,6 +2438,9 @@ $wgMessageStructure = array(
                'import-error-interwiki',
                'import-error-special',
                'import-error-invalid',
+               'import-options-wrong',
+               'import-rootpage-invalid',
+               'import-rootpage-nosubpage',
        ),
        'importlog' => array(
                'importlogpage',
@@ -2637,17 +2664,38 @@ $wgMessageStructure = array(
                'spam_deleting',
        ),
        'info' => array(
+               'pageinfo-header',
                'pageinfo-title',
+               'pageinfo-header-basic',
                'pageinfo-header-edits',
-               'pageinfo-header-watchlist',
-               'pageinfo-header-views',
-               'pageinfo-subjectpage',
-               'pageinfo-talkpage',
+               'pageinfo-header-restrictions',
+               'pageinfo-header-properties',
+               'pageinfo-display-title',
+               'pageinfo-default-sort',
+               'pageinfo-length',
+               'pageinfo-article-id',
+               'pageinfo-robot-policy',
+               'pageinfo-robot-index',
+               'pageinfo-robot-noindex',
+               'pageinfo-views',
                'pageinfo-watchers',
+               'pageinfo-redirects-name',
+               'pageinfo-redirects-value',
+               'pageinfo-subpages-name',
+               'pageinfo-subpages-value',
+               'pageinfo-firstuser',
+               'pageinfo-firsttime',
+               'pageinfo-lastuser',
+               'pageinfo-lasttime',
                'pageinfo-edits',
                'pageinfo-authors',
-               'pageinfo-views',
-               'pageinfo-viewsperedit',
+               'pageinfo-recent-edits',
+               'pageinfo-recent-authors',
+               'pageinfo-restriction',
+               'pageinfo-magic-words',
+               'pageinfo-hidden-categories',
+               'pageinfo-templates',
+               'pageinfo-footer',
        ),
        'skin' => array(
                'skinname-standard',
@@ -2701,6 +2749,7 @@ $wgMessageStructure = array(
                'file-info-size-pages',
                'file-nohires',
                'svg-long-desc',
+               'svg-long-desc-animated',
                'show-big-image',
                'show-big-image-preview',
                'show-big-image-other',
@@ -2710,6 +2759,8 @@ $wgMessageStructure = array(
                'file-info-png-looped',
                'file-info-png-repeat',
                'file-info-png-frames',
+               'file-no-thumb-animation',
+               'file-no-thumb-animation-gif',
        ),
        'newfiles' => array(
                'newimages',
@@ -3698,9 +3749,12 @@ $wgMessageStructure = array(
                'api-error-empty-file',
                'api-error-emptypage',
                'api-error-fetchfileerror',
+               'api-error-fileexists-forbidden',
+               'api-error-fileexists-shared-forbidden',
                'api-error-file-too-large',
                'api-error-filename-tooshort',
                'api-error-filetype-banned',
+               'api-error-filetype-banned-type',
                'api-error-filetype-missing',
                'api-error-hookaborted',
                'api-error-http',
index ed2dae7..ad83905 100644 (file)
@@ -22,7 +22,7 @@
  * @defgroup MaintenanceLanguage MaintenanceLanguage
  */
 
-require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
+require_once( __DIR__ . '/../commandLine.inc' );
 require_once( 'languages.inc' );
 require_once( 'writeMessagesArray.inc' );
 
index a298841..ba50322 100644 (file)
@@ -28,9 +28,9 @@
  */
 $optionsWithArgs = array( 'output' );
 
-require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
+require_once( __DIR__ . '/../commandLine.inc' );
 require_once( 'languages.inc' );
-require_once( dirname( __FILE__ ) . '/StatOutputs.php' );
+require_once( __DIR__ . '/StatOutputs.php' );
 
 
 if ( isset( $options['help'] ) ) {
index 1e97c37..751e744 100644 (file)
@@ -30,7 +30,7 @@ array_shift( $argv );
 define( 'MEDIAWIKI', 1 );
 define( 'NOT_REALLY_MEDIAWIKI', 1 );
 
-$IP = dirname( __FILE__ ) . '/../..';
+$IP = __DIR__ . '/../..';
 
 require_once( "$IP/includes/Defines.php" );
 require_once( "$IP/languages/Language.php" );
index cd36847..b2e04c7 100644 (file)
@@ -105,7 +105,7 @@ $messages = array(
         */
        public static function writeMessagesArray( $messages, $ignoredComments = false, $prefix = false, $removeUnknown = false ) {
                # Load messages
-               $dir = $prefix ? $prefix : dirname( __FILE__ );
+               $dir = $prefix ? $prefix : __DIR__;
 
                require( $dir . '/messages.inc' );
                self::$messageStructure = $wgMessageStructure;
index ba778f4..689c930 100644 (file)
@@ -239,7 +239,7 @@ class LockServerDaemon {
                        list( $session, $key, $command, $type, $values ) = $m;
                        if ( sha1( $session . $command . $type . $values . $this->authKey ) !== $key ) {
                                return 'BAD_KEY';
-                       } elseif ( strlen( $session ) !== 31 ) {
+                       } elseif ( strlen( $session ) !== 32 ) {
                                return 'BAD_SESSION';
                        }
                        $values = explode( '|', $values );
@@ -272,7 +272,7 @@ class LockServerDaemon {
        /**
         * Remove a socket's corresponding session from tracking and
         * store it in the dead session tracking if it still has locks.
-        * 
+        *
         * @param $socket resource
         * @return bool
         */
@@ -309,7 +309,7 @@ class LockServerDaemon {
 
        /**
         * Get the current timestamp and memory usage
-        * 
+        *
         * @return string
         */
        protected function stat() {
@@ -479,10 +479,10 @@ class LockHolder {
 
        /**
         * @param $session string
-        * @return bool 
+        * @return bool
         */
        public function sessionHasLocks( $session ) {
-               return isset( $this->sessionIndexSh[$session] ) 
+               return isset( $this->sessionIndexSh[$session] )
                        || isset( $this->sessionIndexEx[$session] );
        }
 
index 0244527..e07e62d 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 /** */
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
 
 $mcc = new MWMemcached( array( 'persistent' => true/*, 'debug' => true*/ ) );
 $mcc->set_servers( $wgMemCachedServers );
index 088eaa3..691b832 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
- * This script makes several 'set', 'incr' and 'get' requests on every
- * memcached server and shows a report.
+ * Makes several 'set', 'incr' and 'get' requests on every memcached
+ * server and shows a report.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that  makes several 'set', 'incr' and 'get' requests
+ * on every memcached server and shows a report.
+ *
+ * @ingroup Maintenance
+ */
 class mcTest extends Maintenance {
        public function __construct() {
                parent::__construct();
index 8669fe3..cea6433 100644 (file)
 # Start from scratch
 define( 'MW_NO_EXTENSION_MESSAGES', 1 );
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 $maintClass = 'MergeMessageFileList';
 $mmfl = false;
+
+/**
+ * Maintenance script that merges $wgExtensionMessagesFiles from various
+ * extensions to produce a single array containing all message files.
+ *
+ * @ingroup Maintenance
+ */
 class MergeMessageFileList extends Maintenance {
 
        function __construct() {
                parent::__construct();
                $this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', true, true );
+               $this->addOption( 'extensions-dir', 'Path where extensions can be found.', false, true );
                $this->addOption( 'output', 'Send output to this file (omit for stdout)', false, true );
                $this->mDescription = 'Merge $wgExtensionMessagesFiles from various extensions to produce a ' .
                        'single array containing all message files.';
@@ -41,11 +49,36 @@ class MergeMessageFileList extends Maintenance {
        public function execute() {
                global $mmfl;
 
+               # Add setup files contained in file passed to --list-file
                $lines = file( $this->getOption( 'list-file' ) );
                if ( $lines === false ) {
                        $this->error( 'Unable to open list file.' );
                }
                $mmfl = array( 'setupFiles' => array_map( 'trim', $lines ) );
+
+               # Now find out files in a directory
+               $hasError = false;
+               if ( $this->hasOption( 'extensions-dir' ) ) {
+                       $extdir = $this->getOption( 'extensions-dir' );
+                       $entries = scandir( $extdir );
+                       foreach( $entries as $extname ) {
+                               if ( $extname == '.' || $extname == '..' || !is_dir( "$extdir/$extname" ) ) {
+                                       continue;
+                               }
+                               $extfile = "{$extdir}/{$extname}/{$extname}.php";
+                               if ( file_exists( $extfile ) ) {
+                                       $mmfl['setupFiles'][] = $extfile;
+                               } else {
+                                       $hasError = true;
+                                       $this->error( "Extension {$extname} in {$extdir} lacks expected {$extname}.php" );
+                               }
+                       }
+               }
+
+               if ( $hasError ) {
+                       $this->error( "Some files are missing (see above). Giving up.", 1 );
+               }
+
                if ( $this->hasOption( 'output' ) ) {
                        $mmfl['output'] = $this->getOption( 'output' );
                }
@@ -71,7 +104,7 @@ $s =
 
 $dirs = array(
        $IP,
-       dirname( dirname( __FILE__ ) ),
+       dirname( __DIR__ ),
        realpath( $IP )
 );
 
index e6eea66..496af72 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that re-assigns users from an old group to a new one.
+ *
+ * @ingroup Maintenance
+ */
 class MigrateUserGroup extends Maintenance {
        public function __construct() {
                parent::__construct();
index e1fd862..9f5a909 100644 (file)
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that minifies a file or set of files.
+ *
+ * @ingroup Maintenance
+ */
 class MinifyScript extends Maintenance {
        var $outDir;
 
index a7739c2..7d15959 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Maintenance script to move a batch of pages
+ * Move a batch of pages.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,6 +17,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Tim Starling
  *
  * e.g. immobile_namespace for namespaces which can't be moved
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to move a batch of pages.
+ *
+ * @ingroup Maintenance
+ */
 class MoveBatch extends Maintenance {
        public function __construct() {
                parent::__construct();
@@ -96,7 +102,7 @@ class MoveBatch extends Maintenance {
                        $err = $source->moveTo( $dest, false, $reason );
                        if ( $err !== true ) {
                                $msg = array_shift( $err[0] );
-                               $this->output( "\nFAILED: " . wfMsg( $msg, $err[0] ) );
+                               $this->output( "\nFAILED: " . wfMessage( $msg, $err[0] )->text() );
                        }
                        $dbw->commit( __METHOD__ );
                        $this->output( "\n" );
diff --git a/maintenance/mwdoc-filter.php b/maintenance/mwdoc-filter.php
new file mode 100644 (file)
index 0000000..ab05a3e
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Doxygen filter to show correct member variable types in documentation.
+ *
+ * Should be filled in doxygen INPUT_FILTER as "php mwdoc-filter.php"
+ *
+ * Original source code by Goran Rakic
+ * http://blog.goranrakic.com/
+ * http://stackoverflow.com/questions/4325224
+ *
+ * @file
+ */
+
+$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);
+
+echo $source;
index 2edeaba..583249a 100644 (file)
@@ -49,7 +49,7 @@ if ( php_sapi_name() != 'cli' ) {
 }
 
 /** Figure out the base directory for MediaWiki location */
-$mwPath = dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR;
+$mwPath = dirname( __DIR__ ) . DIRECTORY_SEPARATOR;
 
 /** doxygen binary script */
 $doxygenBin = 'doxygen';
@@ -57,6 +57,9 @@ $doxygenBin = 'doxygen';
 /** doxygen configuration template for mediawiki */
 $doxygenTemplate = $mwPath . 'maintenance/Doxyfile';
 
+/** doxygen input filter to tweak source file before they are parsed */
+$doxygenInputFilter = "php {$mwPath}maintenance/mwdoc-filter.php";
+
 /** svnstat command, used to get the version of each file */
 $svnstat = $mwPath . 'bin/svnstat';
 
@@ -134,9 +137,9 @@ function getSvnRevision( $dir ) {
  * @return string
  */
 function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $svnstat, $input, $exclude, $excludePatterns, $doxyGenerateMan ) {
+       global $doxygenInputFilter;
 
        $template = file_get_contents( $doxygenTemplate );
-
        // Replace template placeholders by correct values.
        $replacements = array(
                '{{OUTPUT_DIRECTORY}}' => $outputDirectory,
@@ -148,6 +151,7 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
                '{{EXCLUDE_PATTERNS}}' => $excludePatterns,
                '{{HAVE_DOT}}'         => `which dot` ? 'YES' : 'NO',
                '{{GENERATE_MAN}}'     => $doxyGenerateMan ? 'YES' : 'NO',
+               '{{INPUT_FILTER}}'     => $doxygenInputFilter,
        );
        $tmpCfg = str_replace( array_keys( $replacements ), array_values( $replacements ), $template );
        $tmpFileName = tempnam( wfTempDir(), 'mwdocgen-' );
index 74bd657..4197a35 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Check for articles to fix after adding/deleting namespaces
  *
- * Copyright (C) 2005-2007 Brion Vibber <brion@pobox.com>
+ * Copyright © 2005-2007 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that checks for articles to fix after
+ * adding/deleting namespaces.
+ *
+ * @ingroup Maintenance
+ */
 class NamespaceConflictChecker extends Maintenance {
 
        /**
index ac4e723..e66e981 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @todo Make this work on PostgreSQL and maybe other database servers
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that picks a database that has pending jobs.
+ *
+ * @ingroup Maintenance
+ */
 class nextJobDB extends Maintenance {
        public function __construct() {
                parent::__construct();
index 5d4f374..c471a44 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Remove pages with only 1 revision from the MediaWiki namespace, without
  * flooding recent changes, delete logs, etc.
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Steve Sanbeg
  * based on nukePage by Rob Church
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that removes pages with only one revision from the
+ * MediaWiki namespace.
+ *
+ * @ingroup Maintenance
+ */
 class NukeNS extends Maintenance {
        public function __construct() {
                parent::__construct();
index f63de43..89dffe0 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that erases a page record from the database.
+ *
+ * @ingroup Maintenance
+ */
 class NukePage extends Maintenance {
        public function __construct() {
                parent::__construct();
index aa20782..e222314 100644 (file)
@@ -26,7 +26,7 @@
  * i.e.: GRANT REFERENCES (user_id) ON mwuser TO hubclient;
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class AlterSharedConstraints extends Maintenance {
        public function __construct() {
diff --git a/maintenance/oracle/archives/patch-ipblocks_i05_index.sql b/maintenance/oracle/archives/patch-ipblocks_i05_index.sql
new file mode 100644 (file)
index 0000000..1427538
--- /dev/null
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+CREATE INDEX &mw_prefix.ipblocks_i05 ON &mw_prefix.ipblocks (ipb_parent_block_id);
+
diff --git a/maintenance/oracle/archives/patch-page_restrictions_pkuk_fix.sql b/maintenance/oracle/archives/patch-page_restrictions_pkuk_fix.sql
new file mode 100644 (file)
index 0000000..56c392c
--- /dev/null
@@ -0,0 +1,7 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.page_restrictions DROP CONSTRAINT &mw_prefix.page_restrictions_pk;
+
+ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_pk PRIMARY KEY (pr_id);
+
+CREATE UNIQUE INDEX &mw_prefix.page_restrictions_u01 ON &mw_prefix.page_restrictions (pr_page,pr_type);
diff --git a/maintenance/oracle/archives/patch-revision_i05_index.sql b/maintenance/oracle/archives/patch-revision_i05_index.sql
new file mode 100644 (file)
index 0000000..929c7b3
--- /dev/null
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+CREATE INDEX &mw_prefix.revision_i05 ON &mw_prefix.revision (rev_page,rev_user,rev_timestamp);
+
diff --git a/maintenance/oracle/archives/patch-ufg_group-length-increase.sql b/maintenance/oracle/archives/patch-ufg_group-length-increase.sql
new file mode 100644 (file)
index 0000000..a48b8bf
--- /dev/null
@@ -0,0 +1,9 @@
+define mw_prefix='{$wgDBprefix}';
+
+/*$mw$*/
+BEGIN
+       EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.user_former_groups MODIFY ufg_group VARCHAR2(32) NOT NULL';
+EXCEPTION WHEN OTHERS THEN
+       IF (SQLCODE = -01442) THEN NULL; ELSE RAISE; END IF;
+END;
+/*$mw$*/
index 00a3d0c..89e5532 100644 (file)
@@ -1,3 +1,9 @@
 define mw_prefix='{$wgDBprefix}';
 
-ALTER TABLE &mw_prefix.user_groups MODIFY ug_group VARCHAR2(32) NOT NULL;
+/*$mw$*/
+BEGIN
+       EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.user_groups MODIFY ug_group VARCHAR2(32) NOT NULL';
+EXCEPTION WHEN OTHERS THEN
+       IF (SQLCODE = -01442) THEN NULL; ELSE RAISE; END IF;
+END;
+/*$mw$*/
index 3722120..3f9b376 100644 (file)
@@ -116,6 +116,7 @@ CREATE INDEX &mw_prefix.revision_i01 ON &mw_prefix.revision (rev_timestamp);
 CREATE INDEX &mw_prefix.revision_i02 ON &mw_prefix.revision (rev_page,rev_timestamp);
 CREATE INDEX &mw_prefix.revision_i03 ON &mw_prefix.revision (rev_user,rev_timestamp);
 CREATE INDEX &mw_prefix.revision_i04 ON &mw_prefix.revision (rev_user_text,rev_timestamp);
+CREATE INDEX &mw_prefix.revision_i05 ON &mw_prefix.revision (rev_page,rev_user,rev_timestamp);
 
 CREATE SEQUENCE text_old_id_seq;
 CREATE TABLE &mw_prefix.pagecontent ( -- replaces reserved word 'text'
@@ -283,6 +284,7 @@ CREATE INDEX &mw_prefix.ipblocks_i01 ON &mw_prefix.ipblocks (ipb_user);
 CREATE INDEX &mw_prefix.ipblocks_i02 ON &mw_prefix.ipblocks (ipb_range_start, ipb_range_end);
 CREATE INDEX &mw_prefix.ipblocks_i03 ON &mw_prefix.ipblocks (ipb_timestamp);
 CREATE INDEX &mw_prefix.ipblocks_i04 ON &mw_prefix.ipblocks (ipb_expiry);
+CREATE INDEX &mw_prefix.ipblocks_i05 ON &mw_prefix.ipblocks (ipb_parent_block_id);
 
 CREATE TABLE &mw_prefix.image (
   img_name         VARCHAR2(255)      NOT NULL,
@@ -565,8 +567,9 @@ CREATE TABLE &mw_prefix.page_restrictions (
   pr_user    NUMBER          NULL,
   pr_expiry  TIMESTAMP(6) WITH TIME ZONE      NULL
 );
-ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_pk PRIMARY KEY (pr_page,pr_type);
+ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_pk PRIMARY KEY (pr_id);
 ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_fk1 FOREIGN KEY (pr_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+CREATE UNIQUE INDEX &mw_prefix.page_restrictions_u01 ON &mw_prefix.page_restrictions (pr_page,pr_type);
 CREATE INDEX &mw_prefix.page_restrictions_i01 ON &mw_prefix.page_restrictions (pr_type,pr_level);
 CREATE INDEX &mw_prefix.page_restrictions_i02 ON &mw_prefix.page_restrictions (pr_level);
 CREATE INDEX &mw_prefix.page_restrictions_i03 ON &mw_prefix.page_restrictions (pr_cascade);
index faaadd3..78f98f5 100644 (file)
@@ -1,11 +1,11 @@
 <?php
 /**
- * Look for 'orphan' revisions hooked to pages which don't exist
- * And 'childless' pages with no revisions.
+ * Look for 'orphan' revisions hooked to pages which don't exist and
+ * 'childless' pages with no revisions.
  * Then, kill the poor widows and orphans.
  * Man this is depressing.
  *
- * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @author <brion@pobox.com>
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that looks for 'orphan' revisions hooked to pages which
+ * don't exist and 'childless' pages with no revisions.
+ *
+ * @ingroup Maintenance
+ */
 class Orphans extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Look for 'orphan' revisions hooked to pages which don't exist\n" .
-                                                               "And 'childless' pages with no revisions\n" .
+                                                               "and 'childless' pages with no revisions\n" .
                                                                "Then, kill the poor widows and orphans\n" .
                                                                "Man this is depressing";
                $this->addOption( 'fix', 'Actually fix broken entries' );
index 876f28e..b0ab624 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 /**
- * CLI script to easily parse some wikitext.
+ * Parse some wikitext.
+ *
  * Wikitext can be given by stdin or using a file. The wikitext will be parsed
  * using 'CLIParser' as a title. This can be overriden with --title option.
  *
  * </p>$
  * @endcode
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
  * @ingroup Maintenance
  * @author Antoine Musso <hashar at free dot fr>
  * @license GNU General Public License 2.0 or later
  */
-require_once( dirname(__FILE__) . '/Maintenance.php' );
 
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to parse some wikitext.
+ *
+ * @ingroup Maintenance
+ */
 class CLIParser extends Maintenance {
        protected $parser;
 
@@ -66,7 +89,8 @@ class CLIParser extends Maintenance {
                $input_file = $this->getArg( 0, $php_stdin );
 
                if( $input_file === $php_stdin ) {
-                       $this->error( basename(__FILE__) .": warning: reading wikitext from STDIN\n" );
+                       $ctrl = wfIsWindows() ? 'CTRL+Z' : 'CTRL+D';
+                       $this->error( basename(__FILE__) .": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
                }
 
                return file_get_contents( $input_file );
index 1f96d62..1f39355 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that manually runs an SQL patch outside of the general updaters.
+ *
+ * @ingroup Maintenance
+ */
 class PatchSql extends Maintenance {
        public function __construct() {
                parent::__construct();
index 0b45493..ae54d69 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Script to populate category table.
+ * Populate the category table.
  *
  * 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
  * @author Simetrical
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Mainteance script to populate the category table.
+ *
+ * @ingroup Maintenance
+ */
 class PopulateCategory extends Maintenance {
 
        const REPORTING_INTERVAL = 1000;
index 0847edf..37429a3 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to populate the img_sha1 field.
+ *
+ * @ingroup Maintenance
+ */
 class PopulateImageSha1 extends LoggedUpdateMaintenance {
        public function __construct() {
                parent::__construct();
index e3f6067..99d8155 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that makes the required database updates for populating the
+ * log_search table retroactively
+ *
+ * @ingroup Maintenance
+ */
 class PopulateLogSearch extends LoggedUpdateMaintenance {
        static $tableMap = array( 'rev' => 'revision', 'fa' => 'filearchive', 'oi' => 'oldimage', 'ar' => 'archive' );
 
index eaac68c..059b6fe 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that makes the required database updates for
+ * Special:ProtectedPages to show all protected pages.
+ *
+ * @ingroup Maintenance
+ */
 class PopulateLogUsertext extends LoggedUpdateMaintenance {
        public function __construct() {
                parent::__construct();
index b6d2067..e81d4ff 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that makes the required database updates for rev_parent_id
+ * to be of any use.
+ *
+ * @ingroup Maintenance
+ */
 class PopulateParentId extends LoggedUpdateMaintenance {
        public function __construct() {
                parent::__construct();
index 6626cbc..6c835f4 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that populates the rev_len field for old revisions
+ * created before MW 1.10.
+ *
+ * @ingroup Maintenance
+ */
 class PopulateRevisionLength extends LoggedUpdateMaintenance {
        public function __construct() {
                parent::__construct();
index 1d8e4c8..2e14d31 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that fills the rev_sha1 and ar_sha1 columns of revision
+ * and archive tables for revisions created before MW 1.19.
+ *
+ * @ingroup Maintenance
+ */
 class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
        public function __construct() {
                parent::__construct();
index ad9b4f1..5952fd9 100644 (file)
@@ -1,10 +1,10 @@
 <?php
 /**
  * Take page text out of an XML dump file and preprocess it to obj.
- * It may be useful for getting preprocessor statistics or filling the 
+ * It may be useful for getting preprocessor statistics or filling the
  * preprocessor cache.
  *
- * Copyright (C) 2011 Platonides - http://www.mediawiki.org/
+ * Copyright © 2011 Platonides - http://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/dumpIterator.php' );
+require_once( __DIR__ . '/dumpIterator.php' );
 
+/**
+ * Maintenance script that takes page text out of an XML dump file and
+ * preprocesses it to obj.
+ *
+ * @ingroup Maintenance
+ */
 class PreprocessDump extends DumpIterator {
 
        /* Variables for dressing up as a parser */
index 9dee67e..a53bc88 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
 
 $wgHooks['BeforeParserFetchTemplateAndtitle'][] = 'PPFuzzTester::templateHook';
 
index e772d67..2f6aa1a 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Protect or unprotect an article.
+ * Protect or unprotect a page.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that protects or unprotects a page.
+ *
+ * @ingroup Maintenance
+ */
 class Protect extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Protect or unprotect an article from the command line.";
+               $this->mDescription = "Protect or unprotect a page from the command line.";
                $this->addOption( 'unprotect', 'Removes protection' );
                $this->addOption( 'semiprotect', 'Adds semi-protection' );
                $this->addOption( 'cascade', 'Add cascading protection' );
index f1a1cfd..e058e3e 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Prune file cache for pages, objects, resources, ect...
+ * Prune file cache for pages, objects, resources, etc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that prunes file cache for pages, objects, resources, etc.
+ *
+ * @ingroup Maintenance
+ */
 class PruneFileCache extends Maintenance {
 
        protected $minSurviveTimestamp;
index c8d4fc0..cd62716 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Scans the deletion log and purges affected files within a timeframe.
+ * Scan the deletion log and purges affected files within a timeframe.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that scans the deletion log and purges affected files
+ * within a timeframe.
+ *
+ * @ingroup Maintenance
+ */
 class PurgeDeletedFiles extends Maintenance {
        public function __construct() {
                parent::__construct();
@@ -74,7 +81,7 @@ class PurgeDeletedFiles extends Maintenance {
 
        protected function purgeFromArchiveTable( LocalFile $file ) {
                $db = $file->getRepo()->getSlaveDB();
-               $res = $db->select( 'filearchive', 
+               $res = $db->select( 'filearchive',
                        array( 'fa_archive_name' ),
                        array( 'fa_name' => $file->getName() ),
                        __METHOD__
index f1452bc..4b3c382 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that sends purge requests for listed pages to squid.
+ *
+ * @ingroup Maintenance
+ */
 class PurgeList extends Maintenance {
        public function __construct() {
                parent::__construct();
index 0cbc724..1f0b063 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that purges old text records from the database.
+ *
+ * @ingroup Maintenance
+ */
 class PurgeOldText extends Maintenance {
        public function __construct() {
                parent::__construct();
index 84a2b51..1c41798 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Maintenance script to remove old objects from the parser cache.
+ * Remove old objects from the parser cache.
  * This only works when the parser cache is in an SQL database.
  *
  * This program is free software; you can redistribute it and/or modify
  * @ingroup Maintenance
  */
 
-require( dirname( __FILE__ ) . '/Maintenance.php' );
+require( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to remove old objects from the parser cache.
+ *
+ * @ingroup Maintenance
+ */
 class PurgeParserCache extends Maintenance {
        var $lastProgress;
 
        function __construct() {
                parent::__construct();
-               $this->addDescription( "Remove old objects from the parser cache. " . 
+               $this->addDescription( "Remove old objects from the parser cache. " .
                        "This only works when the parser cache is in an SQL database." );
                $this->addOption( 'expiredate', 'Delete objects expiring before this date.', false, true );
-               $this->addOption( 'age', 
-                       'Delete objects created more than this many seconds ago, assuming $wgParserCacheExpireTime '.
-                               'has been consistent.', 
+               $this->addOption( 'age',
+                       'Delete objects created more than this many seconds ago, assuming $wgParserCacheExpireTime ' .
+                               'has been consistent.',
                        false, true );
        }
 
index ec7b081..225400f 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup Maintenance Memcached
  */
 
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
 
 function purgeStaleMemcachedText() {
        global $wgMemc, $wgDBname;
index da9fa53..a91abf9 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Rob Church <robchur@gmail.com>
  * @licence GNU General Public Licence 2.0 or later
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that reassigns edits from a user or IP address
+ * to another user.
+ *
+ * @ingroup Maintenance
+ */
 class ReassignEdits extends Maintenance {
        public function __construct() {
                parent::__construct();
index ea07f19..3165b97 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that builds file cache for content pages.
+ *
+ * @ingroup Maintenance
+ */
 class RebuildFileCache extends Maintenance {
        public function __construct() {
                parent::__construct();
@@ -97,7 +103,7 @@ class RebuildFileCache extends Maintenance {
                        foreach ( $res as $row ) {
                                $rebuilt = false;
                                $wgRequestTime = microtime( true ); # bug 22852
-                               
+
                                $wgTitle = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
                                if ( null == $wgTitle ) {
                                        $this->output( "Page {$row->page_id} has bad title\n" );
index fe3b35c..f5d06e4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Script to update image metadata records
+ * Update image metadata records.
  *
  * Usage: php rebuildImages.php [--missing] [--dry-run]
  * Options:
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to update image metadata records.
+ *
+ * @ingroup Maintenance
+ */
 class ImageBuilder extends Maintenance {
 
        /**
@@ -189,7 +194,7 @@ class ImageBuilder extends Maintenance {
                                $filename = $altname;
                                $this->output( "Estimating transcoding... $altname\n" );
                        } else {
-                               # @FIXME: create renameFile()
+                               # @todo FIXME: create renameFile()
                                $filename = $this->renameFile( $filename );
                        }
                }
index 5915a6b..83849de 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to rebuild the localisation cache.
+ *
+ * @ingroup Maintenance
+ */
 class RebuildLocalisationCache extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Rebuild the localisation cache";
                $this->addOption( 'force', 'Rebuild all files, even ones not out of date' );
                $this->addOption( 'threads', 'Fork more than one thread', false, true );
-               $this->addOption( 'outdir', 'Override the output directory (normally $wgCacheDirectory)', 
+               $this->addOption( 'outdir', 'Override the output directory (normally $wgCacheDirectory)',
                        false, true );
        }
 
        public function memoryLimit() {
+               if ( $this->hasOption( 'memory-limit' ) ) {
+                       return parent::memoryLimit();
+               }
                return '1000M';
        }
 
index dbbed86..882ae1b 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that rebuilds link tracking tables from scratch.
+ *
+ * @ingroup Maintenance
+ */
 class RebuildAll extends Maintenance {
        public function __construct() {
                parent::__construct();
index de37da7..a70e591 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * This script purges all language messages from the cache
+ * Purge all languages from the message cache.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that purges all languages from the message cache.
+ *
+ * @ingroup Maintenance
+ */
 class RebuildMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
index 92d6090..0278f72 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
- * Rebuild link tracking tables from scratch.  This takes several
- * hours, depending on the database size and server configuration.
+ * Rebuild recent changes from scratch.  This takes several hours,
+ * depending on the database size and server configuration.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @todo Document
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that rebuilds recent changes from scratch.
+ *
+ * @ingroup Maintenance
+ */
 class RebuildRecentchanges extends Maintenance {
        public function __construct() {
                parent::__construct();
index 494e0a7..41b245f 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @todo document
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that rebuilds search index table from scratch.
+ *
+ * @ingroup Maintenance
+ */
 class RebuildTextIndex extends Maintenance {
        const RTI_CHUNK_SIZE = 500;
 
index f9bdeea..be6bd18 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class RefreshImageCount extends Maintenance {
        public function __construct() {
index 958b2ba..12da7a8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Script to refresh image metadata fields. See also rebuildImages.php
+ * Refresh image metadata fields. See also rebuildImages.php
  *
  * Usage: php refreshImageMetadata.php
  *
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to refresh image metadata fields.
+ *
+ * @ingroup Maintenance
+ */
 class RefreshImageMetadata extends Maintenance {
 
        /**
index b5aa85f..3d9270b 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to refresh link tables.
+ *
+ * @ingroup Maintenance
+ */
 class RefreshLinks extends Maintenance {
        public function __construct() {
                parent::__construct();
index b288c2f..8bc27c1 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that removes unused user accounts from the database.
+ *
+ * @ingroup Maintenance
+ */
 class RemoveUnusedAccounts extends Maintenance {
        public function __construct() {
                parent::__construct();
index 289e747..6f24479 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 /**
+ * Change the prefix of database tables.
  * Run this script to after changing $wgDBprefix on a wiki.
  * The wiki will have to get downtime to do this correctly.
  *
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that changes the prefix of database tables.
+ *
+ * @ingroup Maintenance
+ */
 class RenameDbPrefix extends Maintenance {
        public function __construct() {
                parent::__construct();
index 78c5b6f..b25fb94 100644 (file)
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that takes page text out of an XML dump file
+ * and render basic HTML out to files.
+ *
+ * @ingroup Maintenance
+ */
 class DumpRenderer extends Maintenance {
 
        private $count = 0;
index a1c4eae..d7f8c6d 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
- * Script to reset the user_token for all users on the wiki. Useful if you
- * believe that your user table was acidentally leaked to an external source.
+ * Reset the user_token for all users on the wiki. Useful if you believe
+ * that your user table was acidentally leaked to an external source.
  *
  * 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
  * @author Daniel Friesen <mediawiki@danielfriesen.name>
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to reset the user_token for all users on the wiki.
+ *
+ * @ingroup Maintenance
+ */
 class ResetUserTokens extends Maintenance {
        public function __construct() {
                parent::__construct();
@@ -33,7 +38,7 @@ class ResetUserTokens extends Maintenance {
        }
 
        public function execute() {
-               
+
                if ( !$this->getOption( 'nowarn' ) ) {
                        $this->output( "The script is about to reset the user_token for ALL USERS in the database.\n" );
                        $this->output( "This may log some of them out and is not necessary unless you believe your\n" );
@@ -42,7 +47,7 @@ class ResetUserTokens extends Maintenance {
                        $this->output( "Abort with control-c in the next five seconds (skip this countdown with --nowarn) ... " );
                        wfCountDown( 5 );
                }
-               
+
                // We list user by user_id from one of the slave database
                $dbr = wfGetDB( DB_SLAVE );
                $result = $dbr->select( 'user',
@@ -53,19 +58,19 @@ class ResetUserTokens extends Maintenance {
 
                foreach ( $result as $id ) {
                        $user = User::newFromId( $id->user_id );
-                       
+
                        $username = $user->getName();
-                       
+
                        $this->output( "Resetting user_token for $username: " );
-                       
+
                        // Change value
                        $user->setToken();
                        $user->saveSettings();
-                       
+
                        $this->output( " OK\n" );
-                       
+
                }
-               
+
        }
 }
 
index 3e57e01..4660bce 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to rollback all edits by a given user or IP provided
+ * they're the most recent edit.
+ *
+ * @ingroup Maintenance
+ */
 class RollbackEdits extends Maintenance {
        public function __construct() {
                parent::__construct();
index 83e0cab..e113916 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script to run a database query in batches and wait for slaves.
+ *
+ * @ingroup Maintenance
+ */
 class BatchedQueryRunner extends Maintenance {
        public function __construct() {
                parent::__construct();
index a75696a..e909bc0 100644 (file)
@@ -1,8 +1,8 @@
 <?php
 /**
- * This script starts pending jobs.
+ * Run pending jobs.
  *
- * Usage:
+ * Options:
  *  --maxjobs <num> (default 10000)
  *  --type <job_cmd>
  *
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that runs pending jobs.
+ *
+ * @ingroup Maintenance
+ */
 class RunJobs extends Maintenance {
        public function __construct() {
                parent::__construct();
@@ -37,6 +43,9 @@ class RunJobs extends Maintenance {
        }
 
        public function memoryLimit() {
+               if ( $this->hasOption( 'memory-limit' ) ) {
+                       return parent::memoryLimit();
+               }
                // Don't eat all memory on the machine if we get a bad job.
                return "150M";
        }
@@ -60,11 +69,11 @@ class RunJobs extends Maintenance {
                $wgTitle = Title::newFromText( 'RunJobs.php' );
                $dbw = wfGetDB( DB_MASTER );
                $n = 0;
-               $conds = '';
+
                if ( $type === false ) {
                        $conds = Job::defaultQueueConditions( );
                } else {
-                       $conds = "job_cmd = " . $dbw->addQuotes( $type );
+                       $conds = array( 'job_cmd' => $type );
                }
 
                while ( $dbw->selectField( 'job', 'job_id', $conds, 'runJobs.php' ) ) {
@@ -79,6 +88,7 @@ class RunJobs extends Maintenance {
                                wfWaitForSlaves();
                                $t = microtime( true );
                                $offset = $job->id;
+                               $this->runJobsLog( $job->toString() . " STARTING" );
                                $status = $job->run();
                                $t = microtime( true ) - $t;
                                $timeMs = intval( $t * 1000 );
index ff7d3fc..edcbdd6 100644 (file)
@@ -24,7 +24,7 @@
  * @author Antoine Musso
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class ShowJobs extends Maintenance {
        public function __construct() {
index b284a9a..f16853d 100644 (file)
@@ -28,7 +28,7 @@
  * @license GNU General Public License 2.0 or later
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class ShowStats extends Maintenance {
        public function __construct() {
index c4af630..7483dcc 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class MwSql extends Maintenance {
        public function __construct() {
index 864d5ab..7a22df5 100644 (file)
@@ -20,7 +20,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class SqliteMaintenance extends Maintenance {
        public function __construct() {
index 46926dd..cbea24b 100644 (file)
@@ -20,7 +20,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class CacheStats extends Maintenance {
 
index 29904db..6c669bf 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 if ( !defined( 'MEDIAWIKI' ) ) {
-       require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
+       require_once( __DIR__ . '/../commandLine.inc' );
 
        $cs = new CheckStorage;
        $fix = isset( $options['fix'] );
index 5064fe7..4594db7 100644 (file)
@@ -41,7 +41,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class CompressOld extends Maintenance {
        /**
index b200d8a..6020f22 100644 (file)
@@ -18,7 +18,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class DumpRev extends Maintenance {
        public function __construct() {
index cf30b0e..52ee825 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class FixBug20757 extends Maintenance {
        var $batchSize = 10000;
index 64f3ada..2dcc25c 100644 (file)
@@ -24,8 +24,8 @@
 define( 'REPORTING_INTERVAL', 1 );
 
 if ( !defined( 'MEDIAWIKI' ) ) {
-       require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
-       require_once( dirname( __FILE__ ) . '/../../includes/ExternalStoreDB.php' );
+       require_once( __DIR__ . '/../commandLine.inc' );
+       require_once( __DIR__ . '/../../includes/ExternalStoreDB.php' );
        require_once( 'resolveStubs.php' );
 
        $fname = 'moveToExternal';
index f30f07e..82ee135 100644 (file)
@@ -20,7 +20,7 @@
  *
  * @ingroup Maintenance ExternalStorage
  */
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class OrphanStats extends Maintenance {
        public function __construct() {
@@ -28,7 +28,7 @@ class OrphanStats extends Maintenance {
                $this->mDescription = "how some statistics on the blob_orphans table, created with trackBlobs.php";
        }
 
-       private function getDB( $cluster ) {
+       protected function &getDB( $cluster, $groups = array(), $wiki = false ) {
                $lb = wfGetLBFactory()->getExternalLB( $cluster );
                return $lb->getConnection( DB_SLAVE );
        }
index 158aa34..4098077 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 $optionsWithArgs = RecompressTracked::getOptionsWithArgs();
-require( dirname( __FILE__ ) . '/../commandLine.inc' );
+require( __DIR__ . '/../commandLine.inc' );
 
 if ( count( $args ) < 1 ) {
        echo "Usage: php recompressTracked.php [options] <cluster> [... <cluster>...]
index 08d0ee0..7e288e1 100644 (file)
@@ -27,7 +27,7 @@ define( 'REPORTING_INTERVAL', 100 );
 if ( !defined( 'MEDIAWIKI' ) ) {
        $optionsWithArgs = array( 'm' );
 
-       require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
+       require_once( __DIR__ . '/../commandLine.inc' );
 
        resolveStubs();
 }
index 817659f..1afecc4 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
 
 class StorageTypeStats extends Maintenance {
        function execute() {
index 9ae2633..998ebe4 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 $optionsWithArgs = array( 'start', 'limit', 'type' );
-require( dirname( __FILE__ ) . '/../commandLine.inc' );
+require( __DIR__ . '/../commandLine.inc' );
 
 if ( !isset( $args[0] )  ) {
        echo "Usage: php testCompression.php [--type=<type>] [--start=<start-date>] [--limit=<num-revs>] <page-title>\n";
index b5f8004..214168a 100644 (file)
@@ -22,7 +22,7 @@
  * @see wfWaitForSlaves()
  */
 
-require( dirname( __FILE__ ) . '/../commandLine.inc' );
+require( __DIR__ . '/../commandLine.inc' );
 
 
 if ( count( $args ) < 1 ) {
@@ -113,7 +113,7 @@ class TrackBlobs {
                        $dbw->query( 'DROP TABLE ' . $dbw->tableName( 'blob_tracking' ) );
                        $dbw->query( 'DROP TABLE ' . $dbw->tableName( 'blob_orphans' ) );
                }
-               $dbw->sourceFile( dirname( __FILE__ ) . '/blob_tracking.sql' );
+               $dbw->sourceFile( __DIR__ . '/blob_tracking.sql' );
        }
 
        function getTextClause() {
index 0d5c9de..18d57c3 100644 (file)
@@ -20,7 +20,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class SyncFileBackend extends Maintenance {
        public function __construct() {
@@ -39,12 +39,11 @@ class SyncFileBackend extends Maintenance {
                $src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
                $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
 
-               $posFile = $this->getOption( 'posdir' )
-                       ? $this->getOption( 'posdir' ) . '/' . wfWikiID()
-                       : false;
+               $posDir = $this->getOption( 'posdir' );
+               $posFile = $posDir ? $posDir . '/' . wfWikiID() : false;
 
                $start = $this->getOption( 'start', 0 );
-               if ( !$start && $posFile ) {
+               if ( !$start && $posFile && is_dir( $posDir ) ) {
                        $start = is_file( $posFile )
                                ? (int)trim( file_get_contents( $posFile ) )
                                : 0;
@@ -66,8 +65,11 @@ class SyncFileBackend extends Maintenance {
 
                // Update the sync position file
                if ( $startFromPosFile && $lastOKPos >= $start ) { // successfully advanced
-                       file_put_contents( $posFile, $lastOKPos, LOCK_EX );
-                       $this->output( "Updated journal position file.\n" );
+                       if ( file_put_contents( $posFile, $lastOKPos, LOCK_EX ) !== false ) {
+                               $this->output( "Updated journal position file.\n" );
+                       } else {
+                               $this->output( "Could not update journal position file.\n" );
+                       }
                }
 
                if ( $lastOKPos === false ) {
@@ -127,7 +129,7 @@ class SyncFileBackend extends Maintenance {
                        if ( $status->isOK() ) {
                                $lastOKPos = max( $lastOKPos, $lastPosInBatch );
                        } else {
-                               $this->output( print_r( $status->getErrorsArray(), true ) );
+                               $this->error( print_r( $status->getErrorsArray(), true ) );
                                break; // no gaps; everything up to $lastPos must be OK
                        }
 
@@ -183,7 +185,8 @@ class SyncFileBackend extends Maintenance {
                                }
                                $fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
                                // Note: prepare() is usually fast for key/value backends
-                               $status->merge( $dst->prepare( array( 'dir' => dirname( $dPath ) ) ) );
+                               $status->merge( $dst->prepare( array(
+                                       'dir' => dirname( $dPath ), 'bypassReadOnly' => 1 ) ) );
                                if ( !$status->isOK() ) {
                                        return $status;
                                }
@@ -198,10 +201,12 @@ class SyncFileBackend extends Maintenance {
                        }
                }
 
-               $status->merge( $dst->doOperations( $ops,
-                       array( 'nonLocking' => 1, 'nonJournaled' => 1 ) ) );
+               $t_start = microtime( true );
+               $status->merge( $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) ) );
+               $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
                if ( $status->isOK() && $this->getOption( 'verbose' ) ) {
-                       $this->output( "Synchronized these file(s):\n" . implode( "\n", $dPaths ) . "\n" );
+                       $this->output( "Synchronized these file(s) [{$ellapsed_ms}ms]:\n" .
+                               implode( "\n", $dPaths ) . "\n" );
                }
 
                return $status;
index 1c3b14a..ea8b0c4 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class Undelete extends Maintenance {
        public function __construct() {
index 741ec90..78e8827 100644 (file)
@@ -32,7 +32,7 @@ if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '
 }
 
 $wgUseMasterForMaintenance = true;
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class UpdateMediaWiki extends Maintenance {
 
index dbbfb80..730a1f6 100644 (file)
@@ -23,7 +23,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class UpdateArticleCount extends Maintenance {
 
index 6160a30..ec99c99 100644 (file)
 
 #$optionsWithArgs = array( 'begin', 'max-slave-lag' );
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class UpdateCollation extends Maintenance {
        const BATCH_SIZE = 50; // Number of rows to process in one batch
        const SYNC_INTERVAL = 20; // Wait for slaves after this many batches
 
+       var $sizeHistogram = array();
+
        public function __construct() {
                parent::__construct();
 
@@ -50,6 +52,13 @@ TEXT;
                        'categorylinks table is large. This will only update rows with that ' .
                        'collation, though, so it may miss out-of-date rows with a different, ' .
                        'even older collation.', false, true );
+               $this->addOption( 'target-collation', 'Set this to the new collation type to ' .
+                       'use instead of $wgCategoryCollation. Usually you should not use this, ' . 
+                       'you should just update $wgCategoryCollation in LocalSettings.php.', 
+                       false, true );
+               $this->addOption( 'dry-run', 'Don\'t actually change the collations, just ' .
+                       'compile statistics.' );
+               $this->addOption( 'verbose-stats', 'Show more statistics.' );
        }
 
        public function execute() {
@@ -57,10 +66,19 @@ TEXT;
 
                $dbw = $this->getDB( DB_MASTER );
                $force = $this->getOption( 'force' );
+               $dryRun = $this->getOption( 'dry-run' );
+               $verboseStats = $this->getOption( 'verbose-stats' );
+               if ( $this->hasOption( 'target-collation' ) ) {
+                       $collationName = $this->getOption( 'target-collation' );
+                       $collation = Collation::factory( $collationName );
+               } else {
+                       $collationName = $wgCategoryCollation;
+                       $collation = Collation::singleton();
+               }
 
                $options = array( 'LIMIT' => self::BATCH_SIZE, 'STRAIGHT_JOIN' );
 
-               if ( $force ) {
+               if ( $force || $dryRun ) {
                        $options['ORDER BY'] = 'cl_from, cl_to';
                        $collationConds = array();
                } else {
@@ -68,7 +86,7 @@ TEXT;
                                $collationConds['cl_collation'] = $this->getOption( 'previous-collation' );
                        } else {
                                $collationConds = array( 0 =>
-                                       'cl_collation != ' . $dbw->addQuotes( $wgCategoryCollation )
+                                       'cl_collation != ' . $dbw->addQuotes( $collationName )
                                );
                        }
 
@@ -79,13 +97,19 @@ TEXT;
                                        $collationConds,
                                        __METHOD__
                                );
-
-                               if ( $count == 0 ) {
-                                       $this->output( "Collations up-to-date.\n" );
-                                       return;
-                               }
-                               $this->output( "Fixing collation for $count rows.\n" );
+                       } else {
+                               $count = $dbw->estimateRowCount(
+                                       'categorylinks',
+                                       '*',
+                                       $collationConds,
+                                       __METHOD__
+                               );
+                       }
+                       if ( $count == 0 ) {
+                               $this->output( "Collations up-to-date.\n" );
+                               return;
                        }
+                       $this->output( "Fixing collation for $count rows.\n" );
                }
 
                $count = 0;
@@ -104,7 +128,9 @@ TEXT;
                        );
                        $this->output( " processing..." );
 
-                       $dbw->begin( __METHOD__ );
+                       if ( !$dryRun ) {
+                               $dbw->begin( __METHOD__ );
+                       }
                        foreach ( $res as $row ) {
                                $title = Title::newFromRow( $row );
                                if ( !$row->cl_collation ) {
@@ -129,23 +155,32 @@ TEXT;
                                } else {
                                        $type = 'page';
                                }
-                               $dbw->update(
-                                       'categorylinks',
-                                       array(
-                                               'cl_sortkey' => Collation::singleton()->getSortKey(
-                                                       $title->getCategorySortkey( $prefix ) ),
-                                               'cl_sortkey_prefix' => $prefix,
-                                               'cl_collation' => $wgCategoryCollation,
-                                               'cl_type' => $type,
-                                               'cl_timestamp = cl_timestamp',
-                                       ),
-                                       array( 'cl_from' => $row->cl_from, 'cl_to' => $row->cl_to ),
-                                       __METHOD__
-                               );
+                               $newSortKey = $collation->getSortKey(
+                                       $title->getCategorySortkey( $prefix ) );
+                               if ( $verboseStats ) {
+                                       $this->updateSortKeySizeHistogram( $newSortKey );
+                               }
+
+                               if ( !$dryRun ) {
+                                       $dbw->update(
+                                               'categorylinks',
+                                               array(
+                                                       'cl_sortkey' => $newSortKey,
+                                                       'cl_sortkey_prefix' => $prefix,
+                                                       'cl_collation' => $collationName,
+                                                       'cl_type' => $type,
+                                                       'cl_timestamp = cl_timestamp',
+                                               ),
+                                               array( 'cl_from' => $row->cl_from, 'cl_to' => $row->cl_to ),
+                                               __METHOD__
+                                       );
+                               }
+                       }
+                       if ( !$dryRun ) {
+                               $dbw->commit( __METHOD__ );
                        }
-                       $dbw->commit( __METHOD__ );
 
-                       if ( $force && $row ) {
+                       if ( ( $force || $dryRun ) && $row ) {
                                $encFrom = $dbw->addQuotes( $row->cl_from );
                                $encTo = $dbw->addQuotes( $row->cl_to );
                                $batchConds = array(
@@ -156,12 +191,83 @@ TEXT;
                        $count += $res->numRows();
                        $this->output( "$count done.\n" );
 
-                       if ( ++$batchCount % self::SYNC_INTERVAL == 0 ) {
+                       if ( !$dryRun && ++$batchCount % self::SYNC_INTERVAL == 0 ) {
                                $this->output( "Waiting for slaves ... " );
                                wfWaitForSlaves();
                                $this->output( "done\n" );
                        }
                } while ( $res->numRows() == self::BATCH_SIZE );
+
+               $this->output( "$count rows processed\n" );
+
+               if ( $verboseStats ) {
+                       $this->output( "\n" );
+                       $this->showSortKeySizeHistogram();
+               }
+       }
+
+       function updateSortKeySizeHistogram( $key ) {
+               $length = strlen( $key );
+               if ( !isset( $this->sizeHistogram[$length] ) ) {
+                       $this->sizeHistogram[$length] = 0;
+               }
+               $this->sizeHistogram[$length]++;
+       }
+
+       function showSortKeySizeHistogram() {
+               $maxLength = max( array_keys( $this->sizeHistogram ) );
+               if ( $maxLength == 0 ) {
+                       return;
+               }
+               $numBins = 20;
+               $coarseHistogram = array_fill( 0, $numBins, 0 );
+               $coarseBoundaries = array();
+               $boundary = 0;
+               for ( $i = 0; $i < $numBins - 1; $i++ ) {
+                       $boundary += $maxLength / $numBins;
+                       $coarseBoundaries[$i] = round( $boundary );
+               }
+               $coarseBoundaries[$numBins - 1] = $maxLength + 1;
+               $raw = '';
+               for ( $i = 0; $i <= $maxLength; $i++ ) {
+                       if ( $raw !== '' ) {
+                               $raw .= ', ';
+                       }
+                       if ( !isset( $this->sizeHistogram[$i] ) ) {
+                               $val = 0;
+                       } else {
+                               $val = $this->sizeHistogram[$i];
+                       }
+                       for ( $coarseIndex = 0; $coarseIndex < $numBins - 1; $coarseIndex++ ) {
+                               if ( $coarseBoundaries[$coarseIndex] > $i ) {
+                                       $coarseHistogram[$coarseIndex] += $val;
+                                       break;
+                               }
+                       }
+                       if ( $coarseIndex == $numBins - 1 ) {
+                               $coarseHistogram[$coarseIndex] += $val;
+                       }
+                       $raw .= $val;
+               }
+
+               $this->output( "Sort key size histogram\nRaw data: $raw\n\n" );
+
+               $maxBinVal = max( $coarseHistogram );
+               $scale = 60 / $maxBinVal;
+               $prevBoundary = 0;
+               for ( $coarseIndex = 0; $coarseIndex < $numBins; $coarseIndex++ ) {
+                       if ( !isset( $coarseHistogram[$coarseIndex] ) ) {
+                               $val = 0;
+                       } else {
+                               $val = $coarseHistogram[$coarseIndex];
+                       }
+                       $boundary = $coarseBoundaries[$coarseIndex];
+                       $this->output( sprintf( "%-10s %-10d |%s\n",
+                               $prevBoundary . '-' . ( $boundary - 1 ) . ': ',
+                               $val,
+                               str_repeat( '*', $scale * $val ) ) );
+                       $prevBoundary = $boundary;
+               }
        }
 }
 
index 61545f8..bcceab3 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class UpdateDoubleWidthSearch extends Maintenance {
 
index ffbdb2b..04e7f41 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class UpdateRestrictions extends Maintenance {
        public function __construct() {
index eed3571..59acc9a 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class UpdateSearchIndex extends Maintenance {
 
index a1a2e2f..c1e497d 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class UpdateSpecialPages extends Maintenance {
        public function __construct() {
index f0807b6..13faece 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 define( 'MW_UPGRADE_COPY',     false );
 define( 'MW_UPGRADE_ENCODE',   true  );
index 5e35747..2a06657 100644 (file)
@@ -25,7 +25,7 @@
 $options = array( 'list', 'nowarn', 'quiet', 'usage', 'dry' );
 $optionsWithArgs = array( 'old', 'new' );
 
-require_once( dirname( __FILE__ ) . '/commandLine.inc' );
+require_once( __DIR__ . '/commandLine.inc' );
 
 /**
  * @ingroup Maintenance
index 720ca28..468e239 100644 (file)
@@ -22,7 +22,7 @@
  * @see wfWaitForSlaves()
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
 class WaitForSlave extends Maintenance {
        public function __construct() {
index 3f993f0..065d187 100644 (file)
@@ -8,11 +8,11 @@
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
-chdir( dirname( dirname( __FILE__ ) ) );
+chdir( dirname( __DIR__ ) );
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require ( 'core/includes/WebStart.php' );
 } else {
-       require( dirname( dirname( __FILE__ ) ) . '/includes/WebStart.php' );
+       require( dirname( __DIR__ ) . '/includes/WebStart.php' );
 }
 
 wfInstallerMain();
index a5e48fa..95f028a 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-require_once( dirname(__FILE__) . '/includes/WebStart.php' );
+require_once( __DIR__ . '/includes/WebStart.php' );
 
 if( $wgRequest->getVal( 'ctype' ) == 'application/xml' ) {
        // Makes testing tweaks about a billion times easier
@@ -54,7 +54,7 @@ print Xml::openElement( 'OpenSearchDescription',
 //
 // Behavior seems about the same between Firefox and IE 7/8 here.
 // 'Description' doesn't appear to be used by either.
-$fullName = wfMsgForContent( 'opensearch-desc' );
+$fullName = wfMessage( 'opensearch-desc' )->inContentLanguage()->text();
 print Xml::element( 'ShortName', null, $fullName );
 print Xml::element( 'Description', null, $fullName );
 
index ef038c1..bbd5fc8 100644 (file)
@@ -31,7 +31,7 @@ $wgEnableProfileInfo = $wgProfileToDatabase = false;
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require ( 'core/includes/WebStart.php' );
 } else {
-       require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
+       require ( __DIR__ . '/includes/WebStart.php' );
 }
 
 
index fde960e..5e6cfee 100644 (file)
@@ -24,7 +24,7 @@
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require ( 'phase3/includes/WebStart.php' );
 } else {
-       require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
+       require ( __DIR__ . '/includes/WebStart.php' );
 }
 
 global $wgArticlePath;
index fb6f2ff..82ab718 100644 (file)
@@ -106,6 +106,10 @@ return array(
                'scripts' => 'resources/jquery/jquery.autoEllipsis.js',
                'dependencies' => 'jquery.highlightText',
        ),
+       'jquery.badge' => array(
+               'scripts' => 'resources/jquery/jquery.badge.js',
+               'styles' => 'resources/jquery/jquery.badge.css',
+       ),
        'jquery.byteLength' => array(
                'scripts' => 'resources/jquery/jquery.byteLength.js',
        ),
@@ -200,6 +204,10 @@ return array(
                'scripts' => 'resources/jquery/jquery.spinner.js',
                'styles' => 'resources/jquery/jquery.spinner.css',
        ),
+       'jquery.jStorage' => array(
+               'scripts' => 'resources/jquery/jquery.jStorage.js',
+               'dependencies' => 'jquery.json',
+       ),
        'jquery.suggestions' => array(
                'scripts' => 'resources/jquery/jquery.suggestions.js',
                'styles' => 'resources/jquery/jquery.suggestions.css',
@@ -352,7 +360,6 @@ return array(
                        'fa' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js',
                        'fi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js',
                        'fo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js',
-                       'fr-ch' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js',
                        'fr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
                        'gl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js',
                        'he' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-he.js',
@@ -610,6 +617,7 @@ return array(
                'scripts' => 'resources/mediawiki/mediawiki.user.js',
                'dependencies' => array(
                        'jquery.cookie',
+                       'mediawiki.api',
                ),
        ),
        'mediawiki.util' => array(
@@ -632,6 +640,7 @@ return array(
                        'jquery.textSelection',
                        'jquery.byteLimit',
                ),
+               'position' => 'top',
        ),
        'mediawiki.action.history' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
@@ -655,21 +664,9 @@ return array(
        'mediawiki.action.view.rightClickEdit' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
        ),
+       // Alias for backwards compatibility
        'mediawiki.action.watch.ajax' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.watch.ajax.js',
-               'dependencies' => array(
-                       'mediawiki.api.watch',
-                       'mediawiki.util',
-               ),
-               'messages' => array(
-                       'watch',
-                       'unwatch',
-                       'watching',
-                       'unwatching',
-                       'tooltip-ca-watch',
-                       'tooltip-ca-unwatch',
-                       'watcherrortext',
-               ),
+               'dependencies' => 'mediawiki.page.watch.ajax'
        ),
 
        /* MediaWiki Language */
@@ -678,7 +675,6 @@ return array(
                'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
                'languageScripts' => array(
                        'am' => 'resources/mediawiki.language/languages/am.js',
-                       'ar' => 'resources/mediawiki.language/languages/ar.js',
                        'bat-smg' => 'resources/mediawiki.language/languages/bat-smg.js',
                        'be' => 'resources/mediawiki.language/languages/be.js',
                        'be-tarask' => 'resources/mediawiki.language/languages/be-tarask.js',
@@ -694,7 +690,6 @@ return array(
                        'gd' => 'resources/mediawiki.language/languages/gd.js',
                        'gv' => 'resources/mediawiki.language/languages/gv.js',
                        'he' => 'resources/mediawiki.language/languages/he.js',
-                       'hi' => 'resources/mediawiki.language/languages/hi.js',
                        'hr' => 'resources/mediawiki.language/languages/hr.js',
                        'hsb' => 'resources/mediawiki.language/languages/hsb.js',
                        'hu' => 'resources/mediawiki.language/languages/hu.js',
@@ -708,12 +703,9 @@ return array(
                        'mk' => 'resources/mediawiki.language/languages/mk.js',
                        'mo' => 'resources/mediawiki.language/languages/mo.js',
                        'mt' => 'resources/mediawiki.language/languages/mt.js',
-                       'nl' => 'resources/mediawiki.language/languages/nl.js',
                        'nso' => 'resources/mediawiki.language/languages/nso.js',
                        'os' => 'resources/mediawiki.language/languages/os.js',
                        'pl' => 'resources/mediawiki.language/languages/pl.js',
-                       'pt' => 'resources/mediawiki.language/languages/pt.js',
-                       'pt-br' => 'resources/mediawiki.language/languages/pt-br.js',
                        'ro' => 'resources/mediawiki.language/languages/ro.js',
                        'ru' => 'resources/mediawiki.language/languages/ru.js',
                        'se' => 'resources/mediawiki.language/languages/se.js',
@@ -729,7 +721,21 @@ return array(
                        'uk' => 'resources/mediawiki.language/languages/uk.js',
                        'wa' => 'resources/mediawiki.language/languages/wa.js',
                ),
-               'dependencies' => array( 'mediawiki.language.data' ),
+               'dependencies' => array(
+                               'mediawiki.language.data',
+                               'mediawiki.cldr'
+                       ),
+       ),
+
+       'mediawiki.cldr' => array(
+               'scripts' => 'resources/mediawiki.language/mediawiki.cldr.js',
+               'dependencies' => array(
+                       'mediawiki.libs.pluralruleparser',
+               ),
+       ),
+
+       'mediawiki.libs.pluralruleparser' => array(
+               'scripts' => 'resources/mediawiki.libs/CLDRPluralRuleParser.js',
        ),
 
        'mediawiki.language.init' => array(
@@ -770,7 +776,23 @@ return array(
                ),
                'position' => 'top',
        ),
-
+       'mediawiki.page.watch.ajax' => array(
+               'scripts' => 'resources/mediawiki.page/mediawiki.page.watch.ajax.js',
+               'dependencies' => array(
+                       'mediawiki.page.startup',
+                       'mediawiki.api.watch',
+                       'mediawiki.util'
+               ),
+               'messages' => array(
+                       'watch',
+                       'unwatch',
+                       'watching',
+                       'unwatching',
+                       'tooltip-ca-watch',
+                       'tooltip-ca-unwatch',
+                       'watcherrortext',
+               ),
+       ),
 
        /* MediaWiki Special pages */
 
index 686cdb7..1e99769 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Blind 1.8.21
+ * jQuery UI Effects Blind 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index e3fc3d8..7927a4a 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Bounce 1.8.21
+ * jQuery UI Effects Bounce 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -32,7 +32,7 @@ $.effects.bounce = function(o) {
                $.effects.createWrapper(el); // Create Wrapper
                var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
                var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
+               var distance = o.options.distance || (ref == 'top' ? el.outerHeight(true) / 3 : el.outerWidth(true) / 3);
                if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
                if (mode == 'hide') distance = distance / (times * 2);
                if (mode != 'hide') times--;
index 2b43554..d8b8218 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Clip 1.8.21
+ * jQuery UI Effects Clip 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index cc31827..91ac575 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects 1.8.21
+ * jQuery UI Effects 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -75,7 +75,8 @@ function getColor(elem, attr) {
                var color;
 
                do {
-                               color = $.curCSS(elem, attr);
+                               // jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
+                               color = ($.curCSS || $.css)(elem, attr);
 
                                // Keep going until we find an element that has color, or we hit the body
                                if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
@@ -306,7 +307,7 @@ $.fn.extend({
 /******************************************************************************/
 
 $.extend($.effects, {
-       version: "1.8.21",
+       version: "1.8.23",
 
        // Saves a set of properties in a data storage
        save: function(element, set) {
@@ -563,210 +564,49 @@ $.fn.extend({
 /*********************************** EASING ***********************************/
 /******************************************************************************/
 
-/*
- * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
- *
- * Uses the built in easing capabilities added In jQuery 1.1
- * to offer multiple easing options
- *
- * TERMS OF USE - jQuery Easing
- *
- * Open source under the BSD License.
- *
- * Copyright 2008 George McGinley Smith
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * Neither the name of the author nor the names of contributors may be used to endorse
- * or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
-*/
+// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
 
-// t: current time, b: begInnIng value, c: change In value, d: duration
-$.easing.jswing = $.easing.swing;
+var baseEasings = {};
 
-$.extend($.easing,
-{
-       def: 'easeOutQuad',
-       swing: function (x, t, b, c, d) {
-               //alert($.easing.default);
-               return $.easing[$.easing.def](x, t, b, c, d);
-       },
-       easeInQuad: function (x, t, b, c, d) {
-               return c*(t/=d)*t + b;
-       },
-       easeOutQuad: function (x, t, b, c, d) {
-               return -c *(t/=d)*(t-2) + b;
-       },
-       easeInOutQuad: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return c/2*t*t + b;
-               return -c/2 * ((--t)*(t-2) - 1) + b;
-       },
-       easeInCubic: function (x, t, b, c, d) {
-               return c*(t/=d)*t*t + b;
-       },
-       easeOutCubic: function (x, t, b, c, d) {
-               return c*((t=t/d-1)*t*t + 1) + b;
-       },
-       easeInOutCubic: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return c/2*t*t*t + b;
-               return c/2*((t-=2)*t*t + 2) + b;
-       },
-       easeInQuart: function (x, t, b, c, d) {
-               return c*(t/=d)*t*t*t + b;
-       },
-       easeOutQuart: function (x, t, b, c, d) {
-               return -c * ((t=t/d-1)*t*t*t - 1) + b;
-       },
-       easeInOutQuart: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
-               return -c/2 * ((t-=2)*t*t*t - 2) + b;
-       },
-       easeInQuint: function (x, t, b, c, d) {
-               return c*(t/=d)*t*t*t*t + b;
-       },
-       easeOutQuint: function (x, t, b, c, d) {
-               return c*((t=t/d-1)*t*t*t*t + 1) + b;
-       },
-       easeInOutQuint: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
-               return c/2*((t-=2)*t*t*t*t + 2) + b;
-       },
-       easeInSine: function (x, t, b, c, d) {
-               return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
-       },
-       easeOutSine: function (x, t, b, c, d) {
-               return c * Math.sin(t/d * (Math.PI/2)) + b;
-       },
-       easeInOutSine: function (x, t, b, c, d) {
-               return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
-       },
-       easeInExpo: function (x, t, b, c, d) {
-               return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
-       },
-       easeOutExpo: function (x, t, b, c, d) {
-               return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
-       },
-       easeInOutExpo: function (x, t, b, c, d) {
-               if (t==0) return b;
-               if (t==d) return b+c;
-               if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
-               return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
-       },
-       easeInCirc: function (x, t, b, c, d) {
-               return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
-       },
-       easeOutCirc: function (x, t, b, c, d) {
-               return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
-       },
-       easeInOutCirc: function (x, t, b, c, d) {
-               if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
-               return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
-       },
-       easeInElastic: function (x, t, b, c, d) {
-               var s=1.70158;var p=0;var a=c;
-               if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
-               if (a < Math.abs(c)) { a=c; var s=p/4; }
-               else var s = p/(2*Math.PI) * Math.asin (c/a);
-               return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
-       },
-       easeOutElastic: function (x, t, b, c, d) {
-               var s=1.70158;var p=0;var a=c;
-               if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
-               if (a < Math.abs(c)) { a=c; var s=p/4; }
-               else var s = p/(2*Math.PI) * Math.asin (c/a);
-               return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
-       },
-       easeInOutElastic: function (x, t, b, c, d) {
-               var s=1.70158;var p=0;var a=c;
-               if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
-               if (a < Math.abs(c)) { a=c; var s=p/4; }
-               else var s = p/(2*Math.PI) * Math.asin (c/a);
-               if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
-               return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
-       },
-       easeInBack: function (x, t, b, c, d, s) {
-               if (s == undefined) s = 1.70158;
-               return c*(t/=d)*t*((s+1)*t - s) + b;
-       },
-       easeOutBack: function (x, t, b, c, d, s) {
-               if (s == undefined) s = 1.70158;
-               return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
+       baseEasings[ name ] = function( p ) {
+               return Math.pow( p, i + 2 );
+       };
+});
+
+$.extend( baseEasings, {
+       Sine: function ( p ) {
+               return 1 - Math.cos( p * Math.PI / 2 );
        },
-       easeInOutBack: function (x, t, b, c, d, s) {
-               if (s == undefined) s = 1.70158;
-               if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
-               return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+       Circ: function ( p ) {
+               return 1 - Math.sqrt( 1 - p * p );
        },
-       easeInBounce: function (x, t, b, c, d) {
-               return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+       Elastic: function( p ) {
+               return p === 0 || p === 1 ? p :
+                       -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
        },
-       easeOutBounce: function (x, t, b, c, d) {
-               if ((t/=d) < (1/2.75)) {
-                       return c*(7.5625*t*t) + b;
-               } else if (t < (2/2.75)) {
-                       return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
-               } else if (t < (2.5/2.75)) {
-                       return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
-               } else {
-                       return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
-               }
+       Back: function( p ) {
+               return p * p * ( 3 * p - 2 );
        },
-       easeInOutBounce: function (x, t, b, c, d) {
-               if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
-               return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+       Bounce: function ( p ) {
+               var pow2,
+                       bounce = 4;
+
+               while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
+               return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
        }
 });
 
-/*
- *
- * TERMS OF USE - EASING EQUATIONS
- *
- * Open source under the BSD License.
- *
- * Copyright 2001 Robert Penner
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * Neither the name of the author nor the names of contributors may be used to endorse
- * or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
+$.each( baseEasings, function( name, easeIn ) {
+       $.easing[ "easeIn" + name ] = easeIn;
+       $.easing[ "easeOut" + name ] = function( p ) {
+               return 1 - easeIn( 1 - p );
+       };
+       $.easing[ "easeInOut" + name ] = function( p ) {
+               return p < .5 ?
+                       easeIn( p * 2 ) / 2 :
+                       easeIn( p * -2 + 2 ) / -2 + 1;
+       };
+});
 
 })(jQuery);
index 1fa5660..6d25bd3 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Drop 1.8.21
+ * jQuery UI Effects Drop 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -28,7 +28,7 @@ $.effects.drop = function(o) {
                $.effects.createWrapper(el); // Create Wrapper
                var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
                var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
+               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) / 2 : el.outerWidth( true ) / 2);
                if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
 
                // Animation
index f50e257..1caeca8 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Explode 1.8.21
+ * jQuery UI Effects Explode 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index c62037f..6124979 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Fade 1.8.21
+ * jQuery UI Effects Fade 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index a660eed..81b15b8 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Fold 1.8.21
+ * jQuery UI Effects Fold 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index e65bda3..dee0639 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Highlight 1.8.21
+ * jQuery UI Effects Highlight 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index a512184..45cdc88 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Pulsate 1.8.21
+ * jQuery UI Effects Pulsate 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index c312195..44ecee1 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Scale 1.8.21
+ * jQuery UI Effects Scale 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 08ce5a8..bc1fd19 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Shake 1.8.21
+ * jQuery UI Effects Shake 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 3258a9a..0a43027 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Slide 1.8.21
+ * jQuery UI Effects Slide 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -28,7 +28,7 @@ $.effects.slide = function(o) {
                $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
                var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
                var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
+               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) : el.outerWidth( true ));
                if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
 
                // Animation
index 97514f1..64f2a17 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Transfer 1.8.21
+ * jQuery UI Effects Transfer 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 9a80e94..fef8c4b 100644 (file)
Binary files a/resources/jquery.tipsy/images/tipsy.png and b/resources/jquery.tipsy/images/tipsy.png differ
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js
deleted file mode 100644 (file)
index 244eacf..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Swiss-French initialisation for the jQuery UI date picker plugin. */
-/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
-jQuery(function($){
-       $.datepicker.regional['fr-CH'] = {
-               closeText: 'Fermer',
-               prevText: '&#x3c;Préc',
-               nextText: 'Suiv&#x3e;',
-               currentText: 'Courant',
-               monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
-               'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
-               monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
-               'Jul','Aoû','Sep','Oct','Nov','Déc'],
-               dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
-               dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
-               dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
-               weekHeader: 'Sm',
-               dateFormat: 'dd.mm.yy',
-               firstDay: 1,
-               isRTL: false,
-               showMonthAfterYear: false,
-               yearSuffix: ''};
-       $.datepicker.setDefaults($.datepicker.regional['fr-CH']);
-});
\ No newline at end of file
index fe0a729..b3340e0 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Accordion 1.8.21
+ * jQuery UI Accordion 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -518,7 +518,7 @@ $.widget( "ui.accordion", {
 });
 
 $.extend( $.ui.accordion, {
-       version: "1.8.21",
+       version: "1.8.23",
        animations: {
                slide: function( options, additions ) {
                        options = $.extend({
index f8009c6..b634cce 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Autocomplete 1.8.21
+ * jQuery UI Autocomplete 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 47bd6aa..db2637e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Button 1.8.21
+ * jQuery UI Button 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 2a8a2c1..1285a6d 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI 1.8.21
+ * jQuery UI 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -18,7 +18,7 @@ if ( $.ui.version ) {
 }
 
 $.extend( $.ui, {
-       version: "1.8.21",
+       version: "1.8.23",
 
        keyCode: {
                ALT: 18,
@@ -131,49 +131,52 @@ $.fn.extend({
        }
 });
 
-$.each( [ "Width", "Height" ], function( i, name ) {
-       var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
-               type = name.toLowerCase(),
-               orig = {
-                       innerWidth: $.fn.innerWidth,
-                       innerHeight: $.fn.innerHeight,
-                       outerWidth: $.fn.outerWidth,
-                       outerHeight: $.fn.outerHeight
-               };
+// support: jQuery <1.8
+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
+       $.each( [ "Width", "Height" ], function( i, name ) {
+               var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+                       type = name.toLowerCase(),
+                       orig = {
+                               innerWidth: $.fn.innerWidth,
+                               innerHeight: $.fn.innerHeight,
+                               outerWidth: $.fn.outerWidth,
+                               outerHeight: $.fn.outerHeight
+                       };
+
+               function reduce( elem, size, border, margin ) {
+                       $.each( side, function() {
+                               size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
+                               if ( border ) {
+                                       size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
+                               }
+                               if ( margin ) {
+                                       size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+                               }
+                       });
+                       return size;
+               }
 
-       function reduce( elem, size, border, margin ) {
-               $.each( side, function() {
-                       size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
-                       if ( border ) {
-                               size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
-                       }
-                       if ( margin ) {
-                               size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+               $.fn[ "inner" + name ] = function( size ) {
+                       if ( size === undefined ) {
+                               return orig[ "inner" + name ].call( this );
                        }
-               });
-               return size;
-       }
-
-       $.fn[ "inner" + name ] = function( size ) {
-               if ( size === undefined ) {
-                       return orig[ "inner" + name ].call( this );
-               }
 
-               return this.each(function() {
-                       $( this ).css( type, reduce( this, size ) + "px" );
-               });
-       };
+                       return this.each(function() {
+                               $( this ).css( type, reduce( this, size ) + "px" );
+                       });
+               };
 
-       $.fn[ "outer" + name] = function( size, margin ) {
-               if ( typeof size !== "number" ) {
-                       return orig[ "outer" + name ].call( this, size );
-               }
+               $.fn[ "outer" + name] = function( size, margin ) {
+                       if ( typeof size !== "number" ) {
+                               return orig[ "outer" + name ].call( this, size );
+                       }
 
-               return this.each(function() {
-                       $( this).css( type, reduce( this, size, true, margin ) + "px" );
-               });
-       };
-});
+                       return this.each(function() {
+                               $( this).css( type, reduce( this, size, true, margin ) + "px" );
+                       });
+               };
+       });
+}
 
 // selectors
 function focusable( element, isTabIndexNotNaN ) {
@@ -205,9 +208,16 @@ function visible( element ) {
 }
 
 $.extend( $.expr[ ":" ], {
-       data: function( elem, i, match ) {
-               return !!$.data( elem, match[ 3 ] );
-       },
+       data: $.expr.createPseudo ?
+               $.expr.createPseudo(function( dataName ) {
+                       return function( elem ) {
+                               return !!$.data( elem, dataName );
+                       };
+               }) :
+               // support: jQuery <1.8
+               function( elem, i, match ) {
+                       return !!$.data( elem, match[ 3 ] );
+               },
 
        focusable: function( element ) {
                return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
@@ -245,6 +255,11 @@ $(function() {
        body.removeChild( div ).style.display = "none";
 });
 
+// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
+if ( !$.curCSS ) {
+       $.curCSS = $.css;
+}
+
 
 
 
index 8ca1b15..7ea5b07 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Datepicker 1.8.21
+ * jQuery UI Datepicker 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -12,7 +12,7 @@
  */
 (function( $, undefined ) {
 
-$.extend($.ui, { datepicker: { version: "1.8.21" } });
+$.extend($.ui, { datepicker: { version: "1.8.23" } });
 
 var PROP_NAME = 'datepicker';
 var dpuuid = new Date().getTime();
@@ -308,7 +308,7 @@ $.extend(Datepicker.prototype, {
                        this.uuid += 1;
                        var id = 'dp' + this.uuid;
                        this._dialogInput = $('<input type="text" id="' + id +
-                               '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
+                               '" style="position: absolute; top: -100px; width: 0px;"/>');
                        this._dialogInput.keydown(this._doKeyDown);
                        $('body').append(this._dialogInput);
                        inst = this._dialogInst = this._newInst(this._dialogInput, false);
@@ -714,6 +714,7 @@ $.extend(Datepicker.prototype, {
                var borders = $.datepicker._getBorders(inst.dpDiv);
                instActive = inst; // for delegate hover events
                inst.dpDiv.empty().append(this._generateHTML(inst));
+               this._attachHandlers(inst);
                var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
                if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
                        cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
@@ -764,8 +765,8 @@ $.extend(Datepicker.prototype, {
                var dpHeight = inst.dpDiv.outerHeight();
                var inputWidth = inst.input ? inst.input.outerWidth() : 0;
                var inputHeight = inst.input ? inst.input.outerHeight() : 0;
-               var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
-               var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+               var viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft());
+               var viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
 
                offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
                offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
@@ -1402,6 +1403,43 @@ $.extend(Datepicker.prototype, {
                        return startDate;
        },
 
+       /* Attach the onxxx handlers.  These are declared statically so
+        * they work with static code transformers like Caja.
+        */
+       _attachHandlers: function(inst) {
+               var stepMonths = this._get(inst, 'stepMonths');
+               var id = '#' + inst.id.replace( /\\\\/g, "\\" );
+               inst.dpDiv.find('[data-handler]').map(function () {
+                       var handler = {
+                               prev: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, -stepMonths, 'M');
+                               },
+                               next: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, +stepMonths, 'M');
+                               },
+                               hide: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._hideDatepicker();
+                               },
+                               today: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._gotoToday(id);
+                               },
+                               selectDay: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._selectDay(id, +this.getAttribute('data-month'), +this.getAttribute('data-year'), this);
+                                       return false;
+                               },
+                               selectMonth: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'M');
+                                       return false;
+                               },
+                               selectYear: function () {
+                                       window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'Y');
+                                       return false;
+                               }
+                       };
+                       $(this).bind(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]);
+               });
+       },
+       
        /* Generate the HTML for the current state of the date picker. */
        _generateHTML: function(inst) {
                var today = new Date();
@@ -1444,8 +1482,7 @@ $.extend(Datepicker.prototype, {
                        this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
                        this._getFormatConfig(inst)));
                var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
-                       '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
-                       '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
+                       '<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click"' +
                        ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
                        (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
                var nextText = this._get(inst, 'nextText');
@@ -1453,19 +1490,17 @@ $.extend(Datepicker.prototype, {
                        this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
                        this._getFormatConfig(inst)));
                var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
-                       '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
-                       '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
+                       '<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click"' +
                        ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
                        (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
                var currentText = this._get(inst, 'currentText');
                var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
                currentText = (!navigationAsDateFormat ? currentText :
                        this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
-               var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
-                       '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
+               var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">' +
+                       this._get(inst, 'closeText') + '</button>' : '');
                var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
-                       (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
-                       '.datepicker._gotoToday(\'#' + inst.id + '\');"' +
+                       (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click"' +
                        '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
                var firstDay = parseInt(this._get(inst, 'firstDay'),10);
                firstDay = (isNaN(firstDay) ? 0 : firstDay);
@@ -1544,8 +1579,7 @@ $.extend(Datepicker.prototype, {
                                                        (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
                                                        (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
                                                        ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
-                                                       (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
-                                                       inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
+                                                       (unselectable ? '' : ' data-handler="selectDay" data-event="click" data-month="' + printDate.getMonth() + '" data-year="' + printDate.getFullYear() + '"') + '>' + // actions
                                                        (otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
                                                        (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
                                                        (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
@@ -1588,9 +1622,7 @@ $.extend(Datepicker.prototype, {
                else {
                        var inMinYear = (minDate && minDate.getFullYear() == drawYear);
                        var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
-                       monthHtml += '<select class="ui-datepicker-month" ' +
-                               'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
-                               '>';
+                       monthHtml += '<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';
                        for (var month = 0; month < 12; month++) {
                                if ((!inMinYear || month >= minDate.getMonth()) &&
                                                (!inMaxYear || month <= maxDate.getMonth()))
@@ -1621,9 +1653,7 @@ $.extend(Datepicker.prototype, {
                                var endYear = Math.max(year, determineYear(years[1] || ''));
                                year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
                                endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
-                               inst.yearshtml += '<select class="ui-datepicker-year" ' +
-                                       'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
-                                       '>';
+                               inst.yearshtml += '<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';
                                for (; year <= endYear; year++) {
                                        inst.yearshtml += '<option value="' + year + '"' +
                                                (year == drawYear ? ' selected="selected"' : '') +
@@ -1815,7 +1845,7 @@ $.fn.datepicker = function(options){
 $.datepicker = new Datepicker(); // singleton instance
 $.datepicker.initialized = false;
 $.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.21";
+$.datepicker.version = "1.8.23";
 
 // Workaround for #4055
 // Add another global to avoid noConflict issues with inline event handlers
index e7e05b1..082bf2c 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Dialog 1.8.21
+ * jQuery UI Dialog 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -37,18 +37,6 @@ var uiDialogClasses =
                maxWidth: true,
                minHeight: true,
                minWidth: true
-       },
-       // support for jQuery 1.3.2 - handle common attrFn methods for dialog
-       attrFn = $.attrFn || {
-               val: true,
-               css: true,
-               html: true,
-               text: true,
-               data: true,
-               width: true,
-               height: true,
-               offset: true,
-               click: true
        };
 
 $.widget("ui.dialog", {
@@ -397,7 +385,7 @@ $.widget("ui.dialog", {
                                        if ( key === "click" ) {
                                                return;
                                        }
-                                       if ( key in attrFn ) {
+                                       if ( key in button ) {
                                                button[ key ]( value );
                                        } else {
                                                button.attr( key, value );
@@ -702,7 +690,7 @@ $.widget("ui.dialog", {
 });
 
 $.extend($.ui.dialog, {
-       version: "1.8.21",
+       version: "1.8.23",
 
        uuid: 0,
        maxZ: 0,
index 40a0c52..6da1aaf 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Draggable 1.8.21
+ * jQuery UI Draggable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -513,7 +513,7 @@ $.widget("ui.draggable", $.ui.mouse, {
 });
 
 $.extend($.ui.draggable, {
-       version: "1.8.21"
+       version: "1.8.23"
 });
 
 $.ui.plugin.add("draggable", "connectToSortable", {
index a749161..4b98b3a 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Droppable 1.8.21
+ * jQuery UI Droppable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -147,7 +147,7 @@ $.widget("ui.droppable", {
 });
 
 $.extend($.ui.droppable, {
-       version: "1.8.21"
+       version: "1.8.23"
 });
 
 $.ui.intersect = function(draggable, droppable, toleranceMode) {
index a4392de..e051055 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Mouse 1.8.21
+ * jQuery UI Mouse 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -45,9 +45,11 @@ $.widget("ui.mouse", {
        // other instances of mouse
        _mouseDestroy: function() {
                this.element.unbind('.'+this.widgetName);
-               $(document)
-                       .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
-                       .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+               if ( this._mouseMoveDelegate ) {
+                       $(document)
+                               .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+                               .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+               }
        },
 
        _mouseDown: function(event) {
index 164804b..03f2606 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Position 1.8.21
+ * jQuery UI Position 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -257,6 +257,11 @@ if ( !$.offset.setOffset ) {
        };
 }
 
+// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
+if ( !$.curCSS ) {
+       $.curCSS = $.css;
+}
+
 // fraction support test (older versions of jQuery don't support fractions)
 (function () {
        var body = document.getElementsByTagName( "body" )[ 0 ], 
index 4139be6..c1d9f3c 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Progressbar 1.8.21
+ * jQuery UI Progressbar 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -103,7 +103,7 @@ $.widget( "ui.progressbar", {
 });
 
 $.extend( $.ui.progressbar, {
-       version: "1.8.21"
+       version: "1.8.23"
 });
 
 })( jQuery );
index 904be47..f6ce694 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Resizable 1.8.21
+ * jQuery UI Resizable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -540,7 +540,7 @@ $.widget("ui.resizable", $.ui.mouse, {
 });
 
 $.extend($.ui.resizable, {
-       version: "1.8.21"
+       version: "1.8.23"
 });
 
 /*
index 403e62d..ac5bf04 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Selectable 1.8.21
+ * jQuery UI Selectable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -261,7 +261,7 @@ $.widget("ui.selectable", $.ui.mouse, {
 });
 
 $.extend($.ui.selectable, {
-       version: "1.8.21"
+       version: "1.8.23"
 });
 
 })(jQuery);
index 8629dc6..5ea589e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Slider 1.8.21
+ * jQuery UI Slider 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -656,7 +656,7 @@ $.widget( "ui.slider", $.ui.mouse, {
 });
 
 $.extend( $.ui.slider, {
-       version: "1.8.21"
+       version: "1.8.23"
 });
 
 }(jQuery));
index 45fbb1c..1d87f65 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Sortable 1.8.21
+ * jQuery UI Sortable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -1034,6 +1034,8 @@ $.widget("ui.sortable", $.ui.mouse, {
                                for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
                                this._trigger("stop", event, this._uiHash());
                        }
+
+                       this.fromOutside = false;
                        return false;
                }
 
@@ -1076,7 +1078,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 });
 
 $.extend($.ui.sortable, {
-       version: "1.8.21"
+       version: "1.8.23"
 });
 
 })(jQuery);
index d9e2fdf..de453cc 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Tabs 1.8.21
+ * jQuery UI Tabs 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -698,7 +698,7 @@ $.widget( "ui.tabs", {
 });
 
 $.extend( $.ui.tabs, {
-       version: "1.8.21"
+       version: "1.8.23"
 });
 
 /*
index 4f7aea7..befdcc2 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Widget 1.8.21
+ * jQuery UI Widget 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 4ad0cec..1ce7d5e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Accordion 1.8.21
+ * jQuery UI Accordion 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 428e66a..a9817ce 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Autocomplete 1.8.21
+ * jQuery UI Autocomplete 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -13,7 +13,7 @@
 * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
 
 /*
- * jQuery UI Menu 1.8.21
+ * jQuery UI Menu 1.8.23
  *
  * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index f5fe74e..c1f2600 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Button 1.8.21
+ * jQuery UI Button 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index f19df47..c24627e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI CSS Framework 1.8.21
+ * jQuery UI CSS Framework 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 4c0ca36..0282eee 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Datepicker 1.8.21
+ * jQuery UI Datepicker 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -56,8 +56,6 @@
 
 /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
 .ui-datepicker-cover {
-    display: none; /*sorry for IE5*/
-    display/**/: block; /*sorry for IE5*/
     position: absolute; /*must have*/
     z-index: -1; /*must have*/
     filter: mask(); /*must have*/
index 77329fb..ba50ba5 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Dialog 1.8.21
+ * jQuery UI Dialog 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 4c2a52d..c775a33 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Progressbar 1.8.21
+ * jQuery UI Progressbar 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 0105c8a..420c4af 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Resizable 1.8.21
+ * jQuery UI Resizable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 1d89569..3320274 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Selectable 1.8.21
+ * jQuery UI Selectable 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 9bd0fd9..650ad7e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Slider 1.8.21
+ * jQuery UI Slider 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index d4645f8..64ac9bf 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Tabs 1.8.21
+ * jQuery UI Tabs 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index aad5943..536c8e0 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI CSS Framework 1.8.21
+ * jQuery UI CSS Framework 1.8.23
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index e46467b..28eb1fc 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png and b/resources/jquery.ui/themes/vector/images/button-disabled-blue.png differ
index 7125691..0e29d85 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-green.png and b/resources/jquery.ui/themes/vector/images/button-disabled-green.png differ
index 9d01bbc..ede6998 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-red.png and b/resources/jquery.ui/themes/vector/images/button-disabled-red.png differ
index bfaf84e..e4e4ec1 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled.png and b/resources/jquery.ui/themes/vector/images/button-disabled.png differ
index 781a281..766e574 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-down-blue.png and b/resources/jquery.ui/themes/vector/images/button-down-blue.png differ
index 60bba29..90969c3 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-down-green.png and b/resources/jquery.ui/themes/vector/images/button-down-green.png differ
index 54c847d..f625729 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-down-red.png and b/resources/jquery.ui/themes/vector/images/button-down-red.png differ
index 29508a0..c646757 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-down.png and b/resources/jquery.ui/themes/vector/images/button-down.png differ
index a5fdd7d..109907f 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-off-green.png and b/resources/jquery.ui/themes/vector/images/button-off-green.png differ
index 89a0e9a..cc5eb11 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-off.png and b/resources/jquery.ui/themes/vector/images/button-off.png differ
index fbde737..47a0b1b 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-over-green.png and b/resources/jquery.ui/themes/vector/images/button-over-green.png differ
index b2d4c0b..a244536 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-over-red.png and b/resources/jquery.ui/themes/vector/images/button-over-red.png differ
index 2400f62..558f1f8 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-over.png and b/resources/jquery.ui/themes/vector/images/button-over.png differ
index b36dafb..ef0dd9e 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/close.png and b/resources/jquery.ui/themes/vector/images/close.png differ
index 2146cb0..09de537 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png differ
index 6ff03d5..c06dd56 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png differ
index 28b566c..5308b46 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png differ
index dac8462..0c8997f 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png differ
index ad7f982..3149255 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png differ
index 8169ec3..09b2376 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png differ
index 54aff0c..66627c1 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png differ
index 3d87ac7..ccb6dc0 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png differ
index 365a795..006bbea 100644 (file)
@@ -4,18 +4,16 @@
 .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
 .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
 button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
-.ui-button-icons-only { width: 3.4em; } 
-button.ui-button-icons-only { width: 3.7em; } 
+.ui-button-icons-only { width: 3.4em; }
+button.ui-button-icons-only { width: 3.7em; }
 
 /*button text element */
-.ui-button .ui-button-text { display: block; line-height: 1.4em;  }
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
 .ui-button-text-only .ui-button-text { padding: 0.3em 1em 0.25em 1em; }
 .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: 0.3em; text-indent: -9999999px; }
 .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: 0.3em 1em 0.25em 2.1em; }
 .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: 0.3em 2.1em 0.25em 1em; }
 .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
-/* for older versions of jQuery UI */
-.ui-button-text-icon .ui-button-text { padding: 0.3em 1em 0.3em 2.1em; }
 
 /* no icon support for input elements, provide padding by default */
 input.ui-button { padding: 0.3em 1em; }
@@ -34,10 +32,7 @@ input.ui-button { padding: 0.3em 1em; }
 button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
 
 body .ui-button {
-       -moz-border-radius: 4px;
-       -webkit-border-radius: 4px;
-       border-radius: 4px;
-       margin: 0.5em 0 0.5em 0.4em !important;
+       margin: 0.5em 0 0.5em 0.4em;
        border: 1px solid #a6a6a6 !important;
        /* @embed */
        background: #f2f2f2 url(images/button-off.png) repeat-x scroll 50% 100% !important;
@@ -47,6 +42,15 @@ body .ui-button {
        width: auto;
        overflow: visible;
 }
+
+/* Corner radius */
+/* This is normally handled in jquery.ui.theme.css, but in our case, the corner
+   styling of our buttons doesn't match our default widget corner styling */
+.ui-button.ui-corner-all, .ui-button.ui-corner-top, .ui-button.ui-corner-left, .ui-button.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.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; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-button.ui-corner-all, .ui-button.ui-corner-bottom, .ui-button.ui-corner-left, .ui-button.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-button.ui-corner-all, .ui-button.ui-corner-bottom, .ui-button.ui-corner-right, .ui-button.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
 body .ui-button:hover {
        border-color: #6e7273;
        /* @embed */
index 2af4c94..83d6ff8 100644 (file)
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png and b/resources/jquery/images/jquery.arrowSteps.divider-ltr.png differ
index 6aba7f2..529d7b8 100644 (file)
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-rtl.png and b/resources/jquery/images/jquery.arrowSteps.divider-rtl.png differ
index 6046103..f8f6e95 100644 (file)
@@ -42,4 +42,4 @@
        /* TODO: eliminate duplication of jquery.arrowSteps.head.png embedding */
        /* @embed */
        background: url(images/jquery.arrowSteps.head-ltr.png) no-repeat right center;
-}
\ No newline at end of file
+}
index f963754..1b414dd 100644 (file)
@@ -1,21 +1,21 @@
 /**
  * jQuery arrowSteps plugin
  * Copyright Neil Kandalgaonkar, 2010
- * 
- * This work is licensed under the terms of the GNU General Public License, 
- * version 2 or later. 
- * (see http://www.fsf.org/licensing/licenses/gpl.html). 
- * Derivative works and later versions of the code must be free software 
+ *
+ * This work is licensed under the terms of the GNU General Public License,
+ * version 2 or later.
+ * (see http://www.fsf.org/licensing/licenses/gpl.html).
+ * Derivative works and later versions of the code must be free software
  * licensed under the same or a compatible license.
  *
  *
  * DESCRIPTION
  *
- * Show users their progress through a series of steps, via a row of items that fit 
+ * Show users their progress through a series of steps, via a row of items that fit
  * together like arrows. One item can be highlighted at a time.
  *
  *
- * SYNOPSIS 
+ * SYNOPSIS
  *
  * <ul id="robin-hood-daffy">
  *   <li id="guard"><div>Guard!</div></li>
  *   <li id="thrust"><div>Thrust!</div></li>
  * </ul>
  *
- * <script language="javascript"><!-- 
+ * <script>
  *   $( '#robin-hood-daffy' ).arrowSteps();
  *
  *   $( '#robin-hood-daffy' ).arrowStepsHighlight( '#guard' );
  *   // 'Guard!' is highlighted.
  *
  *   // ... user completes the 'guard' step ...
- * 
+ *
  *   $( '#robin-hood-daffy' ).arrowStepsHighlight( '#turn' );
  *   // 'Turn!' is highlighted.
- *
- *   //-->
  * </script>
  *
  */
 
-( function( $j ) { 
-       $j.fn.arrowSteps = function() {
+( function ( $ ) {
+       $.fn.arrowSteps = function () {
                this.addClass( 'arrowSteps' );
                var $steps = this.find( 'li' );
 
                var width = parseInt( 100 / $steps.length, 10 );
                $steps.css( 'width', width + '%' );
 
-               // every step except the last one has an arrow at the right hand side. Also add in the padding 
+               // every step except the last one has an arrow at the right hand side. Also add in the padding
                // for the calculated arrow width.
                var arrowWidth = parseInt( this.outerHeight(), 10 );
                $steps.filter( ':not(:last-child)' ).addClass( 'arrow' )
                this.data( 'arrowSteps', $steps );
                return this;
        };
-       
-       $j.fn.arrowStepsHighlight = function( selector ) {
+
+       $.fn.arrowStepsHighlight = function ( selector ) {
                var $steps = this.data( 'arrowSteps' );
                var $previous;
-               $j.each( $steps, function( i, step ) {
-                       var $step = $j( step );
+               $.each( $steps, function ( i, step ) {
+                       var $step = $( step );
                        if ( $step.is( selector ) ) {
                                if ($previous) {
                                        $previous.addClass( 'tail' );
@@ -75,7 +73,7 @@
                                $step.removeClass( 'head tail lasthead' );
                        }
                        $previous = $step;
-               } ); 
+               } );
        };
 
-} )( jQuery );
+}( jQuery ) );
index 9a5fcc9..23ba074 100644 (file)
@@ -1,23 +1,26 @@
 /**
  * Plugin that automatically truncates the plain text contents of an element and adds an ellipsis
  */
-( function( $ ) {
+( function ( $ ) {
 
 // Cache ellipsed substrings for every string-width-position combination
 var cache = { };
 // Use a separate cache when match highlighting is enabled
 var matchTextCache = { };
 
-$.fn.autoEllipsis = function( options ) {
+$.fn.autoEllipsis = function ( options ) {
        options = $.extend( {
-               'position': 'center',
-               'tooltip': false,
-               'restoreText': false,
-               'hasSpan': false,
-               'matchText': null
+               position: 'center',
+               tooltip: false,
+               restoreText: false,
+               hasSpan: false,
+               matchText: null
        }, options );
-       $(this).each( function() {
-               var $el = $(this);
+       $(this).each( function () {
+               var $container, $trimmableText,
+                       text, trimmableText, w, pw,
+                       l, r, i, side,
+                       $el = $(this);
                if ( options.restoreText ) {
                        if ( !$el.data( 'autoEllipsis.originalText' ) ) {
                                $el.data( 'autoEllipsis.originalText', $el.text() );
@@ -27,16 +30,13 @@ $.fn.autoEllipsis = function( options ) {
                }
 
                // container element - used for measuring against
-               var $container = $el;
-               // trimmable text element - only the text within this element will be trimmed
-               var $trimmableText = null;
-               // protected text element - the width of this element is counted, but next is never trimmed from it
-               var $protectedText = null;
+               $container = $el;
 
+               // trimmable text element - only the text within this element will be trimmed
                if ( options.hasSpan ) {
                        $trimmableText = $el.children( options.selector );
                } else {
-                       $trimmableText = $( '<span />' )
+                       $trimmableText = $( '<span>' )
                                .css( 'whiteSpace', 'nowrap' )
                                .text( $el.text() );
                        $el
@@ -44,10 +44,11 @@ $.fn.autoEllipsis = function( options ) {
                                .append( $trimmableText );
                }
 
-               var text = $container.text();
-               var trimmableText = $trimmableText.text();
-               var w = $container.width();
-               var pw = $protectedText ? $protectedText.width() : 0;
+               text = $container.text();
+               trimmableText = $trimmableText.text();
+               w = $container.width();
+               pw = 0;
+
                // Try cache
                if ( options.matchText ) {
                        if ( !( text in matchTextCache ) ) {
@@ -86,7 +87,8 @@ $.fn.autoEllipsis = function( options ) {
                        switch ( options.position ) {
                                case 'right':
                                        // Use binary search-like technique for efficiency
-                                       var l = 0, r = trimmableText.length;
+                                       l = 0;
+                                       r = trimmableText.length;
                                        do {
                                                var m = Math.ceil( ( l + r ) / 2 );
                                                $trimmableText.text( trimmableText.substr( 0, m ) + '...' );
@@ -101,9 +103,10 @@ $.fn.autoEllipsis = function( options ) {
                                        break;
                                case 'center':
                                        // TODO: Use binary search like for 'right'
-                                       var i = [Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 )];
-                                       var side = 1; // Begin with making the end shorter
-                                       while ( $trimmableText.outerWidth() + pw > w  && i[0] > 0 ) {
+                                       i = [Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 )];
+                                       // Begin with making the end shorter
+                                       side = 1;
+                                       while ( $trimmableText.outerWidth() + pw > w && i[0] > 0 ) {
                                                $trimmableText.text( trimmableText.substr( 0, i[0] ) + '...' + trimmableText.substr( i[1] ) );
                                                // Alternate between trimming the end and begining
                                                if ( side === 0 ) {
@@ -119,7 +122,7 @@ $.fn.autoEllipsis = function( options ) {
                                        break;
                                case 'left':
                                        // TODO: Use binary search like for 'right'
-                                       var r = 0;
+                                       r = 0;
                                        while ( $trimmableText.outerWidth() + pw > w && r < trimmableText.length ) {
                                                $trimmableText.text( '...' + trimmableText.substr( r ) );
                                                r++;
@@ -140,4 +143,4 @@ $.fn.autoEllipsis = function( options ) {
        } );
 };
 
-} )( jQuery );
\ No newline at end of file
+}( jQuery ) );
\ No newline at end of file
diff --git a/resources/jquery/jquery.badge.css b/resources/jquery/jquery.badge.css
new file mode 100644 (file)
index 0000000..49063ba
--- /dev/null
@@ -0,0 +1,39 @@
+.mw-badge {
+       min-width: 8px;
+       height: 14px;
+       border: 1px solid white;
+       border-radius: 8px;
+       -moz-border-radius: 8px;
+       -webkit-border-radius: 8px;
+       box-shadow: 0px 1px 4px #ccc;
+       -moz-box-shadow: 0px 1px 4px #ccc;
+       -webkit-box-shadow: 0px 1px 4px #ccc;
+       background-color: #b60a00;
+       background-image: linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
+       background-image: -o-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
+       background-image: -moz-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
+       background-image: -webkit-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
+       background-image: -ms-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
+       background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #a70802), color-stop(1, #cf0e00));
+       padding: 0 3px;
+       text-align: center;
+}
+
+.mw-badge-content {
+       font-size: 12px;
+       line-height: 14px;
+       color: white;
+       vertical-align: top;
+}
+
+.mw-badge-inline {
+       display: inline-block;
+       margin-left: 3px;
+}
+
+.mw-badge-overlay {
+       position: absolute;
+       bottom: -1px;
+       right: -3px;
+       z-index: 50;
+}
diff --git a/resources/jquery/jquery.badge.js b/resources/jquery/jquery.badge.js
new file mode 100644 (file)
index 0000000..d40acc6
--- /dev/null
@@ -0,0 +1,78 @@
+// Badger v1.0 by Daniel Raftery
+// http://thrivingkings.com/badger
+// http://twitter.com/ThrivingKings
+// Modified by Ryan Kaldari <rkaldari@wikimedia.org>
+
+/**
+ * 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.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY.
+ */
+
+(function( $ ) {
+       $.fn.badge = function( badge, options ) {
+               var existingBadge = this.find( '.mw-badge' );
+               options = $.extend( {}, options );
+
+               badge = String(badge);
+               if ( badge.charAt(0) === '+' ) {
+                       if ( existingBadge.length > 0 ) {
+                               oldBadge = existingBadge.text();
+                               badge = Math.round( Number( oldBadge ) + Number( badge.substr(1) ) );
+                       } else {
+                               badge = badge.substr(1);
+                       }
+               } else if ( badge.charAt(0) === '-' ) {
+                       if ( existingBadge.length > 0 ) {
+                               oldBadge = existingBadge.text();
+                               badge = Math.round( Number( oldBadge ) - Number( badge.substr(1) ) );
+                       } else {
+                               badge = 0;
+                       }
+               }
+
+               if ( Number(badge) <= 0 ) {
+                       // Clear any existing badge
+                       existingBadge.remove();
+               } else {
+                       // Don't add duplicates
+                       var $badge = existingBadge;
+                       if ( existingBadge.length > 0 ) {
+                               this.find( '.mw-badge-content' ).text( badge );
+                       } else {
+                               $badge = $('<div/>')
+                                       .addClass('mw-badge')
+                                       .addClass('mw-badge-overlay')
+                                       .append(
+                                               $('<span/>')
+                                                       .addClass('mw-badge-content')
+                                                       .text(badge)
+                                       );
+                               this.append($badge);
+                       }
+
+                       if ( options.type ) {
+                               if ( options.type == 'inline' ) {
+                                       $badge.removeClass('mw-badge-overlay')
+                                               .addClass('mw-badge-inline');
+                               } else if ( options.type == 'overlay' ) {
+                                       $badge.removeClass('mw-badge-inline')
+                                               .addClass('mw-badge-overlay');
+                               }
+                       }
+
+                       // If a callback was specified, call it with the badge number
+                       if ( options.callback ) {
+                               options.callback( badge );
+                       }
+               }
+       };
+} ) ( jQuery );
index 20fa5c8..3d5b720 100644 (file)
@@ -3,9 +3,9 @@
  *
  * Calculate the byte length of a string (accounting for UTF-8).
  *
- * @author Jan Paul Posma
+ * @author Jan Paul Posma, 2011
  */
-jQuery.byteLength = function( str ) {
+jQuery.byteLength = function ( str ) {
 
        // This basically figures out how many bytes a UTF-16 string (which is what js sees)
        // will take in UTF-8 by replacing a 2 byte character with 2 *'s, etc, and counting that.
@@ -16,4 +16,4 @@ jQuery.byteLength = function( str ) {
                .replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' )
                .replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' )
                .length;
-}
+};
index 45df39a..484651e 100644 (file)
@@ -4,7 +4,7 @@
  * @author Jan Paul Posma, 2011
  * @author Timo Tijhof, 2011-2012
  */
-( function ( $, undefined ) {
+( function ( $ ) {
 
        /**
         * Enforces a byte limit to a textbox, so that UTF-8 entries are counted as well, when, for example,
                        // that affects the next each() iteration as well.
                        elLimit = limit === undefined ? $el.prop( 'maxLength' ) : limit;
        
+                       // If there is no (valid) limit passed or found in the property,
+                       // skip this. The < 0 check is required for Firefox, which returns
+                       // -1  (instead of undefined) for maxLength if it is not set.
+                       if ( !elLimit || elLimit < 0 ) {
+                               return;
+                       }
+
                        // Update/set attribute value, but only if there is no callback set.
                        // If there's a callback set, it's possible that the limit being enforced
                        // is too low (ie. if the callback would return "Foo" for "User:Foo").
                                $el.removeProp( 'maxLength' );
                        }
        
-                       // Nothing passed and/or empty attribute, return without binding an event.
-                       if ( elLimit === undefined ) {
-                               return;
-                       }
-       
                        // Save function for reference
-                       $el.data( 'byteLimit-callback', fn );
+                       $el.data( 'byteLimitCallback', fn );
        
                        // We've got something, go for it:
                        $el.keypress( function ( e ) {
index 0a1d7d7..3d7f94d 100644 (file)
@@ -7,22 +7,22 @@
  * @license GPL v2
  */
 ( function( $ ) {
-$.fn.checkboxShiftClick = function( text ) {
-       var prevCheckbox = null;
-       var $box = this;
-       // When our boxes are clicked..
-       $box.click( function( e ) {
-               // And one has been clicked before...
-               if ( prevCheckbox !== null && e.shiftKey ) {
-                       // Check or uncheck this one and all in-between checkboxes
-                       $box.slice(
-                               Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
-                               Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
-                       ).prop( 'checked', e.target.checked ? true : false );
-               }
-               // Either way, update the prevCheckbox variable to the one clicked now
-               prevCheckbox = e.target;
-       } );
-       return $box;
-};
-} )( jQuery );
\ No newline at end of file
+       $.fn.checkboxShiftClick = function ( text ) {
+               var prevCheckbox = null;
+               var $box = this;
+               // When our boxes are clicked..
+               $box.click( function ( e ) {
+                       // And one has been clicked before...
+                       if ( prevCheckbox !== null && e.shiftKey ) {
+                               // Check or uncheck this one and all in-between checkboxes
+                               $box.slice(
+                                       Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
+                                       Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
+                               ).prop( 'checked', e.target.checked ? true : false );
+                       }
+                       // Either way, update the prevCheckbox variable to the one clicked now
+                       prevCheckbox = e.target;
+               } );
+               return $box;
+       };
+}( jQuery ) );
index 2c6e257..26eea96 100644 (file)
@@ -32,6 +32,8 @@
                 *  }
                 */
                profile: function ( nav ) {
+                       /*jshint boss:true */
+
                        if ( nav === undefined ) {
                                nav = window.navigator;
                        }
                 * @return Boolean true if browser known or assumed to be supported, false if blacklisted
                 */
                test: function ( map, profile ) {
+                       /*jshint evil:true */
+
                        var conditions, dir, i, op, val;
                        profile = $.isPlainObject( profile ) ? profile : $.client.profile();
 
index 1784f86..cb25796 100644 (file)
@@ -1,30 +1,34 @@
-/*
+/**
  * Collapsible tabs jQuery Plugin
  */
-( function( $ ) {
-       $.fn.collapsibleTabs = function( options ) {
+( function ( $ ) {
+       $.fn.collapsibleTabs = function ( options ) {
                // return if the function is called on an empty jquery object
-               if( !this.length ) return this;
-               //merge options into the defaults
+               if ( !this.length ) {
+                       return this;
+               }
+               // Merge options into the defaults
                var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
 
-               this.each( function() {
-                       var $this = $( this );
+               this.each( function () {
+                       var $el = $( this );
                        // add the element to our array of collapsible managers
-                       $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length == 0 ?
-                               $this : $.collapsibleTabs.instances.add( $this ) );
+                       $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
+                               $el : $.collapsibleTabs.instances.add( $el ) );
                        // attach the settings to the elements
-                       $this.data( 'collapsibleTabsSettings', $settings );
+                       $el.data( 'collapsibleTabsSettings', $settings );
                        // attach data to our collapsible elements
-                       $this.children( $settings.collapsible ).each( function() {
+                       $el.children( $settings.collapsible ).each( function () {
                                $.collapsibleTabs.addData( $( this ) );
                        } );
                } );
 
                // if we haven't already bound our resize hanlder, bind it now
-               if( !$.collapsibleTabs.boundEvent ) {
+               if ( !$.collapsibleTabs.boundEvent ) {
                        $( window )
-                               .delayedBind( '500', 'resize', function( ) { $.collapsibleTabs.handleResize(); } );
+                               .delayedBind( '500', 'resize', function ( ) {
+                                       $.collapsibleTabs.handleResize();
+                               } );
                }
                // call our resize handler to setup the page
                $.collapsibleTabs.handleResize();
                        collapsedContainer: '#p-cactions ul',
                        collapsible: 'li.collapsible',
                        shifting: false,
-                       expandCondition: function( eleWidth ) {
+                       expandCondition: function ( eleWidth ) {
                                return ( $( '#left-navigation' ).position().left + $( '#left-navigation' ).width() )
                                        < ( $( '#right-navigation' ).position().left - eleWidth );
                        },
-                       collapseCondition: function() {
+                       collapseCondition: function () {
                                return ( $( '#left-navigation' ).position().left + $( '#left-navigation' ).width() )
                                        > $( '#right-navigation' ).position().left;
                        }
                },
-               addData: function( $collapsible ) {
+               addData: function ( $collapsible ) {
                        var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
-                       if ( $settings != null ) {
+                       if ( $settings !== null ) {
                                $collapsible.data( 'collapsibleTabsSettings', {
-                                       'expandedContainer': $settings.expandedContainer,
-                                       'collapsedContainer': $settings.collapsedContainer,
-                                       'expandedWidth': $collapsible.width(),
-                                       'prevElement': $collapsible.prev()
+                                       expandedContainer: $settings.expandedContainer,
+                                       collapsedContainer: $settings.collapsedContainer,
+                                       expandedWidth: $collapsible.width(),
+                                       prevElement: $collapsible.prev()
                                } );
                        }
                },
-               getSettings: function( $collapsible ) {
+               getSettings: function ( $collapsible ) {
                        var $settings = $collapsible.data( 'collapsibleTabsSettings' );
-                       if ( typeof $settings == 'undefined' ) {
+                       if ( $settings === undefined ) {
                                $.collapsibleTabs.addData( $collapsible );
                                $settings = $collapsible.data( 'collapsibleTabsSettings' );
                        }
                        return $settings;
                },
-               handleResize: function( e ){
-                       $.collapsibleTabs.instances.each( function() {
-                               var $this = $( this ), data = $.collapsibleTabs.getSettings( $this );
-                               if( data.shifting ) return;
+               handleResize: function ( e ) {
+                       $.collapsibleTabs.instances.each( function () {
+                               var $el = $( this ),
+                                       data = $.collapsibleTabs.getSettings( $el );
+
+                               if ( data.shifting ) {
+                                       return;
+                               }
 
                                // if the two navigations are colliding
-                               if( $this.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
+                               if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
 
-                                       $this.trigger( "beforeTabCollapse" );
+                                       $el.trigger( 'beforeTabCollapse' );
                                        // move the element to the dropdown menu
-                                       $.collapsibleTabs.moveToCollapsed( $this.children( data.collapsible + ':last' ) );
+                                       $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
                                }
 
                                // if there are still moveable items in the dropdown menu,
                                // and there is sufficient space to place them in the tab container
-                               if( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0
+                               if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0
                                                && data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
-                                                               data.collapsible+":first" ) ).expandedWidth ) ) {
+                                                               data.collapsible + ':first' ) ).expandedWidth ) ) {
                                        //move the element from the dropdown to the tab
-                                       $this.trigger( "beforeTabExpand" );
+                                       $el.trigger( 'beforeTabExpand' );
                                        $.collapsibleTabs
-                                               .moveToExpanded( data.collapsedContainer + " " + data.collapsible + ':first' );
+                                               .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
                                }
                        });
                },
-               moveToCollapsed: function( ele ) {
-                       var $moving = $( ele );
-                       var data = $.collapsibleTabs.getSettings( $moving );
-                       var dataExp = $.collapsibleTabs.getSettings( data.expandedContainer );
+               moveToCollapsed: function ( ele ) {
+                       var $moving = $( ele ),
+                               data = $.collapsibleTabs.getSettings( $moving ),
+                               dataExp = $.collapsibleTabs.getSettings( data.expandedContainer );
                        dataExp.shifting = true;
                        $moving
                                .detach()
                        dataExp.shifting = false;
                        $.collapsibleTabs.handleResize();
                },
-               moveToExpanded: function( ele ) {
-                       var $moving = $( ele );
-                       var data = $.collapsibleTabs.getSettings( $moving );
-                       var dataExp = $.collapsibleTabs.getSettings( data.expandedContainer );
+               moveToExpanded: function ( ele ) {
+                       var $moving = $( ele ),
+                               data = $.collapsibleTabs.getSettings( $moving ),
+                               dataExp = $.collapsibleTabs.getSettings( data.expandedContainer );
                        dataExp.shifting = true;
                        // remove this element from where it's at and put it in the dropdown menu
                        $moving.detach().insertAfter( data.prevElement ).data( 'collapsibleTabsSettings', data );
                        $.collapsibleTabs.handleResize();
                }
        };
-} )( jQuery );
+
+}( jQuery ) );
index 8a619b5..8bc45c9 100644 (file)
@@ -1,44 +1,54 @@
 /**
  * jQuery Color Animations
- * Copyright 2007 John Resig
+ *
+ * @author John Resig, 2007
+ * @author Krinkle, 2011
  * Released under the MIT and GPL licenses.
  *
- * - 2011-01-05: Modified by Krinkle to use the jQuery.colorUtil plugin (which has to be loaded first!)
+ * - 2011-01-05: Forked for MediaWiki. See also jQuery.colorUtil plugin
  */
-(function( $ ) {
+( function ( $ ) {
 
-       // We override the animation for all of these color styles
-       $.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'],
-               function( i, attr ) {
-                       $.fx.step[attr] = function( fx ) {
-                               if ( fx.state == 0 ) {
-                                       fx.start = getColor( fx.elem, attr );
-                                       fx.end = $.colorUtil.getRGB( fx.end );
-                               }
-
-                               fx.elem.style[attr] = 'rgb(' + [
-                                       Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
-                                       Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
-                                       Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
-                               ].join( ',' ) + ')';
-                       }
-               }
-       );
-
-       function getColor(elem, attr) {
+       function getColor( elem, attr ) {
+               /*jshint boss:true */
                var color;
 
                do {
-                       color = $.curCSS(elem, attr);
+                       color = $.curCSS( elem, attr );
 
                        // Keep going until we find an element that has color, or we hit the body
-                       if ( color != '' && color != 'transparent' || $.nodeName(elem, 'body') )
+                       if ( color !== '' && color !== 'transparent' || $.nodeName( elem, 'body' ) ) {
                                break;
+                       }
 
                        attr = 'backgroundColor';
                } while ( elem = elem.parentNode );
 
-               return $.colorUtil.getRGB(color);
-       };
+               return $.colorUtil.getRGB( color );
+       }
+
+       // We override the animation for all of these color styles
+       $.each([
+               'backgroundColor',
+               'borderBottomColor',
+               'borderLeftColor',
+               'borderRightColor',
+               'borderTopColor',
+               'color',
+               'outlineColor'
+       ], function ( i, attr ) {
+               $.fx.step[attr] = function ( fx ) {
+                       if ( fx.state === 0 ) {
+                               fx.start = getColor( fx.elem, attr );
+                               fx.end = $.colorUtil.getRGB( fx.end );
+                       }
+
+                       fx.elem.style[attr] = 'rgb(' + [
+                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10 ), 255 ), 0 )
+                       ].join( ',' ) + ')';
+               };
+       } );
 
-} )( jQuery );
+}( jQuery ) );
index 1116aec..c1fe7fe 100644 (file)
  * jQuery Color Utilities
  * Written by Krinkle in 2011
  * Released under the MIT and GPL licenses.
- * Mostly based on other plugins and functions (taken through JSLint and optimized a little).
- * Sources cited locally.
+ * Mostly based on other plugins and functions (linted and optimized a little).
+ * Sources cited inline.
  */
-( function( $ ) {
-$.colorUtil = {
-
-       // Color Conversion function from highlightFade
-       // By Blair Mitchelmore
-       // http://jquery.offput.ca/highlightFade/
-       // Parse strings looking for color tuples [255,255,255]
-       getRGB : function( color ) {
-               var result;
-
-               // Check if we're already dealing with an array of colors
-               if ( color && color.constructor == Array && color.length == 3 ){
-                       return color;
-               }
+( function ( $ ) {
+       $.colorUtil = {
 
-               // Look for rgb(num,num,num)
-               if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) {
-                       return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
-               }
+               // Color Conversion function from highlightFade
+               // By Blair Mitchelmore
+               // http://jquery.offput.ca/highlightFade/
+               // Parse strings looking for color tuples [255,255,255]
+               getRGB : function ( color ) {
+                       /*jshint boss:true */
+                       var result;
 
-               // Look for rgb(num%,num%,num%)
-               if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) {
-                       return [parseFloat(result[1],10)*2.55, parseFloat(result[2],10)*2.55, parseFloat(result[3])*2.55];
-               }
+                       // Check if we're already dealing with an array of colors
+                       if ( color && $.isArray( color ) && color.length === 3 ) {
+                               return color;
+                       }
 
-               // Look for #a0b1c2
-               if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) {
-                       return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
-               }
+                       // Look for rgb(num,num,num)
+                       if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) {
+                               return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+                       }
 
-               // Look for #fff
-               if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) {
-                       return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
-               }
+                       // Look for rgb(num%,num%,num%)
+                       if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) {
+                               return [parseFloat(result[1],10)*2.55, parseFloat(result[2],10)*2.55, parseFloat(result[3])*2.55];
+                       }
 
-               // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
-               if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) {
-                       return $.colorUtil.colors.transparent;
-               }
+                       // Look for #a0b1c2
+                       if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) {
+                               return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+                       }
 
-               // Otherwise, we're most likely dealing with a named color
-               return $.colorUtil.colors[$.trim(color).toLowerCase()];
-       },
-
-       // Some named colors to work with
-       // From Interface by Stefan Petre
-       // http://interface.eyecon.ro/
-       colors: {
-               aqua:[0,255,255],
-               azure:[240,255,255],
-               beige:[245,245,220],
-               black:[0,0,0],
-               blue:[0,0,255],
-               brown:[165,42,42],
-               cyan:[0,255,255],
-               darkblue:[0,0,139],
-               darkcyan:[0,139,139],
-               darkgrey:[169,169,169],
-               darkgreen:[0,100,0],
-               darkkhaki:[189,183,107],
-               darkmagenta:[139,0,139],
-               darkolivegreen:[85,107,47],
-               darkorange:[255,140,0],
-               darkorchid:[153,50,204],
-               darkred:[139,0,0],
-               darksalmon:[233,150,122],
-               darkviolet:[148,0,211],
-               fuchsia:[255,0,255],
-               gold:[255,215,0],
-               green:[0,128,0],
-               indigo:[75,0,130],
-               khaki:[240,230,140],
-               lightblue:[173,216,230],
-               lightcyan:[224,255,255],
-               lightgreen:[144,238,144],
-               lightgrey:[211,211,211],
-               lightpink:[255,182,193],
-               lightyellow:[255,255,224],
-               lime:[0,255,0],
-               magenta:[255,0,255],
-               maroon:[128,0,0],
-               navy:[0,0,128],
-               olive:[128,128,0],
-               orange:[255,165,0],
-               pink:[255,192,203],
-               purple:[128,0,128],
-               violet:[128,0,128],
-               red:[255,0,0],
-               silver:[192,192,192],
-               white:[255,255,255],
-               yellow:[255,255,0],
-               transparent: [255,255,255]
-       },
-       /**
-        * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-        * Converts an RGB color value to HSL. Conversion formula
-        * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
-        * Assumes r, g, and b are contained in the set [0, 255] and
-        * returns h, s, and l in the set [0, 1].
-        *
-        * @param       Number  R               The red color value
-        * @param       Number  G               The green color value
-        * @param       Number  B               The blue color value
-        * @return      Array                   The HSL representation
-        */
-       rgbToHsl: function( R, G, B ) {
-               var     r = R / 255,
-                       g = G / 255,
-                       b = B / 255;
-               var max = Math.max(r, g, b), min = Math.min(r, g, b);
-               var h, s, l = (max + min) / 2;
-
-               if(max == min){
-                       h = s = 0; // achromatic
-               }else{
-                       var d = max - min;
-                       s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
-                       switch(max){
-                               case r: h = (g - b) / d + (g < b ? 6 : 0); break;
-                               case g: h = (b - r) / d + 2; break;
-                               case b: h = (r - g) / d + 4; break;
+                       // Look for #fff
+                       if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) {
+                               return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+                       }
+
+                       // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+                       if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) {
+                               return $.colorUtil.colors.transparent;
                        }
-                       h /= 6;
-               }
 
-               return [h, s, l];
-       },
-       /**
-        * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-        * Converts an HSL color value to RGB. Conversion formula
-        * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
-        * Assumes h, s, and l are contained in the set [0, 1] and
-        * returns r, g, and b in the set [0, 255].
-        *
-        * @param       Number  h               The hue
-        * @param       Number  s               The saturation
-        * @param       Number  l               The lightness
-        * @return      Array                   The RGB representation
-        */
-       hslToRgb: function( h, s, l ) {
-               var r, g, b;
-
-               if(s === 0){
-                       r = g = b = l; // achromatic
-               }else{
-                       var hue2rgb = function(p, q, t){
-                               if(t < 0){ t += 1; }
-                               if(t > 1){ t -= 1; }
-                               if(t < 1/6){ return p + (q - p) * 6 * t; }
-                               if(t < 1/2){ return q; }
-                               if(t < 2/3){ return p + (q - p) * (2/3 - t) * 6; }
-                               return p;
-                       };
-
-                       var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
-                       var p = 2 * l - q;
-                       r = hue2rgb(p, q, h + 1/3);
-                       g = hue2rgb(p, q, h);
-                       b = hue2rgb(p, q, h - 1/3);
+                       // Otherwise, we're most likely dealing with a named color
+                       return $.colorUtil.colors[$.trim(color).toLowerCase()];
+               },
+
+               // Some named colors to work with
+               // From Interface by Stefan Petre
+               // http://interface.eyecon.ro/
+               colors: {
+                       aqua: [0,255,255],
+                       azure: [240,255,255],
+                       beige: [245,245,220],
+                       black: [0,0,0],
+                       blue: [0,0,255],
+                       brown: [165,42,42],
+                       cyan: [0,255,255],
+                       darkblue: [0,0,139],
+                       darkcyan: [0,139,139],
+                       darkgrey: [169,169,169],
+                       darkgreen: [0,100,0],
+                       darkkhaki: [189,183,107],
+                       darkmagenta: [139,0,139],
+                       darkolivegreen: [85,107,47],
+                       darkorange: [255,140,0],
+                       darkorchid: [153,50,204],
+                       darkred: [139,0,0],
+                       darksalmon: [233,150,122],
+                       darkviolet: [148,0,211],
+                       fuchsia: [255,0,255],
+                       gold: [255,215,0],
+                       green: [0,128,0],
+                       indigo: [75,0,130],
+                       khaki: [240,230,140],
+                       lightblue: [173,216,230],
+                       lightcyan: [224,255,255],
+                       lightgreen: [144,238,144],
+                       lightgrey: [211,211,211],
+                       lightpink: [255,182,193],
+                       lightyellow: [255,255,224],
+                       lime: [0,255,0],
+                       magenta: [255,0,255],
+                       maroon: [128,0,0],
+                       navy: [0,0,128],
+                       olive: [128,128,0],
+                       orange: [255,165,0],
+                       pink: [255,192,203],
+                       purple: [128,0,128],
+                       violet: [128,0,128],
+                       red: [255,0,0],
+                       silver: [192,192,192],
+                       white: [255,255,255],
+                       yellow: [255,255,0],
+                       transparent: [255,255,255]
+               },
+
+               /**
+                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
+                * Converts an RGB color value to HSL. Conversion formula
+                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
+                * Assumes r, g, and b are contained in the set [0, 255] and
+                * returns h, s, and l in the set [0, 1].
+                *
+                * @param       Number  R               The red color value
+                * @param       Number  G               The green color value
+                * @param       Number  B               The blue color value
+                * @return      Array                   The HSL representation
+                */
+               rgbToHsl: function ( R, G, B ) {
+                       var r = R / 255,
+                               g = G / 255,
+                               b = B / 255;
+                       var max = Math.max( r, g, b ), min = Math.min( r, g, b );
+                       var h, s, l = (max + min) / 2;
+
+                       if ( max === min ) {
+                               // achromatic
+                               h = s = 0;
+                       } else {
+                               var d = max - min;
+                               s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+                               switch ( max ) {
+                                       case r:
+                                               h = (g - b) / d + (g < b ? 6 : 0);
+                                               break;
+                                       case g:
+                                               h = (b - r) / d + 2;
+                                               break;
+                                       case b:
+                                               h = (r - g) / d + 4;
+                                               break;
+                               }
+                               h /= 6;
+                       }
+
+                       return [h, s, l];
+               },
+
+               /**
+                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
+                * Converts an HSL color value to RGB. Conversion formula
+                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
+                * Assumes h, s, and l are contained in the set [0, 1] and
+                * returns r, g, and b in the set [0, 255].
+                *
+                * @param       Number  h               The hue
+                * @param       Number  s               The saturation
+                * @param       Number  l               The lightness
+                * @return      Array                   The RGB representation
+                */
+               hslToRgb: function ( h, s, l ) {
+                       var r, g, b;
+
+                       if ( s === 0 ) {
+                               r = g = b = l; // achromatic
+                       } else {
+                               var hue2rgb = function ( p, q, t ) {
+                                       if ( t < 0 ) {
+                                               t += 1;
+                                       }
+                                       if ( t > 1 ) {
+                                               t -= 1;
+                                       }
+                                       if ( t < 1/6 ) {
+                                               return p + (q - p) * 6 * t;
+                                       }
+                                       if ( t < 1/2 ) {
+                                               return q;
+                                       }
+                                       if ( t < 2/3 ) {
+                                               return p + (q - p) * (2/3 - t) * 6;
+                                       }
+                                       return p;
+                               };
+
+                               var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+                               var p = 2 * l - q;
+                               r = hue2rgb( p, q, h + 1/3 );
+                               g = hue2rgb( p, q, h );
+                               b = hue2rgb( p, q, h - 1/3 );
+                       }
+
+                       return [r * 255, g * 255, b * 255];
+               },
+
+               /**
+                * Get's a brighter or darker rgb() value string.
+                *
+                * @author Krinkle
+                *
+                * @example     getCSSColorMod( 'red', +0.1 )
+                * @example     getCSSColorMod( 'rgb(200,50,50)', -0.2 )
+                *
+                * @param       Mixed   currentColor current value in css
+                * @param       Number  mod wanted brightness modification between -1 and 1
+                * @return      String 'rgb(r,g,b)'
+                */
+               getColorBrightness: function ( currentColor, mod ) {
+                       var rgbArr = $.colorUtil.getRGB( currentColor ),
+                               hslArr = $.colorUtil.rgbToHsl(rgbArr[0], rgbArr[1], rgbArr[2] );
+                       rgbArr = $.colorUtil.hslToRgb(hslArr[0], hslArr[1], hslArr[2]+mod);
+
+                       return 'rgb(' +
+                               [parseInt( rgbArr[0], 10), parseInt( rgbArr[1], 10 ), parseInt( rgbArr[2], 10 )].join( ',' ) +
+                               ')';
                }
 
-               return [r * 255, g * 255, b * 255];
-       },
-       /**
-        * Get's a brighter or darker rgb() value string.
-        *
-        * @author Krinkle
-        *
-        * @example     getCSSColorMod( 'red', +0.1 )
-        * @example     getCSSColorMod( 'rgb(200,50,50)', -0.2 )
-        *
-        * @param       Mixed   currentColor current value in css
-        * @param       Number  mod wanted brightness modification between -1 and 1
-        * @return      String 'rgb(r,g,b)'
-        */
-       getColorBrightness: function( currentColor, mod ) {
-               var     rgbArr = $.colorUtil.getRGB( currentColor ),
-                       hslArr = $.colorUtil.rgbToHsl(rgbArr[0], rgbArr[1], rgbArr[2] );
-               rgbArr = $.colorUtil.hslToRgb(hslArr[0], hslArr[1], hslArr[2]+mod);
-               return 'rgb(' +
-                       [parseInt( rgbArr[0], 10), parseInt( rgbArr[1], 10 ), parseInt( rgbArr[2], 10 )].join( ',' ) +
-                       ')';
-       }
-
-};
-} )( jQuery );
\ No newline at end of file
+       };
+
+}( jQuery ) );
index 79317f7..6d5974a 100644 (file)
@@ -1,96 +1,47 @@
-/**
- * Cookie plugin
+/*!
+ * jQuery Cookie Plugin
+ * https://github.com/carhartl/jquery-cookie
  *
- * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
- * Dual licensed under the MIT and GPL licenses:
+ * Copyright 2011, Klaus Hartl
+ * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
+ * http://www.opensource.org/licenses/GPL-2.0
  */
+(function($) {
+    $.cookie = function(key, value, options) {
 
-/**
- * Create a cookie with the given name and value and other optional parameters.
- *
- * @example $.cookie('the_cookie', 'the_value');
- * @desc Set the value of a cookie.
- * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
- * @desc Create a cookie with all available options.
- * @example $.cookie('the_cookie', 'the_value');
- * @desc Create a session cookie.
- * @example $.cookie('the_cookie', null);
- * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
- *       used when the cookie was set.
- *
- * @param String name The name of the cookie.
- * @param String value The value of the cookie.
- * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
- * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
- *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
- *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
- *                             when the the browser exits.
- * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
- * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
- * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
- *                        require a secure protocol (like HTTPS).
- * @type undefined
- *
- * @name $.cookie
- * @cat Plugins/Cookie
- * @author Klaus Hartl/klaus.hartl@stilbuero.de
- */
+        // key and at least value given, set cookie...
+        if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) {
+            options = $.extend({}, options);
 
-/**
- * Get the value of a cookie with the given name.
- *
- * @example $.cookie('the_cookie');
- * @desc Get the value of a cookie.
- *
- * @param String name The name of the cookie.
- * @return The value of the cookie.
- * @type String
- *
- * @name $.cookie
- * @cat Plugins/Cookie
- * @author Klaus Hartl/klaus.hartl@stilbuero.de
- */
-jQuery.cookie = function(name, value, options) {
-    if (typeof value != 'undefined') { // name and value given, set cookie
-        options = options || {};
-        if (value === null) {
-            value = '';
-            options.expires = -1;
-        }
-        var expires = '';
-        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
-            var date;
-            if (typeof options.expires == 'number') {
-                date = new Date();
-                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
-            } else {
-                date = options.expires;
+            if (value === null || value === undefined) {
+                options.expires = -1;
             }
-            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
-        }
-        // CAUTION: Needed to parenthesize options.path and options.domain
-        // in the following expressions, otherwise they evaluate to undefined
-        // in the packed version for some reason...
-        var path = options.path ? '; path=' + (options.path) : '';
-        var domain = options.domain ? '; domain=' + (options.domain) : '';
-        var secure = options.secure ? '; secure' : '';
-        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
-    } else { // only name given, get cookie
-        var cookieValue = null;
-        if (document.cookie && document.cookie != '') {
-            var cookies = document.cookie.split(';');
-            for (var i = 0; i < cookies.length; i++) {
-                var cookie = jQuery.trim(cookies[i]);
-                // Does this cookie string begin with the name we want?
-                if (cookie.substring(0, name.length + 1) == (name + '=')) {
-                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
-                    break;
-                }
+
+            if (typeof options.expires === 'number') {
+                var days = options.expires, t = options.expires = new Date();
+                t.setDate(t.getDate() + days);
             }
+
+            value = String(value);
+
+            return (document.cookie = [
+                encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),
+                options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+                options.path    ? '; path=' + options.path : '',
+                options.domain  ? '; domain=' + options.domain : '',
+                options.secure  ? '; secure' : ''
+            ].join(''));
+        }
+
+        // key and possibly options given, get cookie...
+        options = value || {};
+        var decode = options.raw ? function(s) { return s; } : decodeURIComponent;
+
+        var pairs = document.cookie.split('; ');
+        for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) {
+            if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined
         }
-        return cookieValue;
-    }
-};
+        return null;
+    };
+})(jQuery);
index d84ee26..5d32b6b 100644 (file)
@@ -1,4 +1,4 @@
-(function( $ ) {
+( function ( $ ) {
 /**
  * Function that escapes spaces in event names. This is needed because
  * "_delayedBind-foo bar-1000" refers to two events
@@ -18,25 +18,26 @@ $.fn.extend( {
         * @param data Data to pass to the event handler (optional)
         * @param callback Function to call
         */
-       delayedBind: function( timeout, event, data, callback ) {
-               if ( arguments.length == 3 ) {
+       delayedBind: function ( timeout, event, data, callback ) {
+               if ( arguments.length === 3 ) {
                        // Shift optional parameter down
                        callback = data;
                        data = undefined;
                }
                var encEvent = encodeEvent( event );
-               return this.each( function() {
+               return this.each( function () {
                        var that = this;
                        // Bind the top half
                        // Do this only once for every (event, timeout) pair
                        if (  !( $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout ) ) ) {
                                $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout, true );
-                               $(this).bind( event, function() {
+                               $(this).bind( event, function () {
                                        var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout );
                                        // Cancel the running timer
-                                       if ( typeof timerID != 'undefined' )
+                                       if ( timerID !== null ) {
                                                clearTimeout( timerID );
-                                       timerID = setTimeout( function() {
+                                       }
+                                       timerID = setTimeout( function () {
                                                $(that).trigger( '_delayedBind-' + encEvent + '-' + timeout );
                                        }, timeout );
                                        $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout, timerID );
@@ -51,23 +52,25 @@ $.fn.extend( {
        /**
         * Cancel the timers for delayed events on the selected elements.
         */
-       delayedBindCancel: function( timeout, event ) {
+       delayedBindCancel: function ( timeout, event ) {
                var encEvent = encodeEvent( event );
-               return this.each( function() {
+               return this.each( function () {
                        var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout );
-                       if ( typeof timerID != 'undefined' )
+                       if ( timerID !== null ) {
                                clearTimeout( timerID );
+                       }
                } );
        },
        
        /**
         * Unbind an event bound with delayedBind()
         */
-       delayedBindUnbind: function( timeout, event, callback ) {
+       delayedBindUnbind: function ( timeout, event, callback ) {
                var encEvent = encodeEvent( event );
-               return this.each( function() {
+               return this.each( function () {
                        $(this).unbind( '_delayedBind-' + encEvent + '-' + timeout, callback );
                } );
        }
 } );
-} )( jQuery );
\ No newline at end of file
+
+}( jQuery ) );
index 3c65d01..a3396a2 100644 (file)
  * Options:
  *
  */
-( function( $ ) {
-
-$.expandableField = {
-       /**
-        * Expand the field, make the callback
-        */
-       expandField: function( e, context ) {
-               context.config.beforeExpand.call( context.data.$field, context );
-               context.data.$field
-                       .animate( { 'width': context.data.expandedWidth }, 'fast', function() {
-                               context.config.afterExpand.call( this, context );
-                       } );
-       },
-       /**
-        * Condense the field, make the callback
-        */
-       condenseField: function( e, context ) {
-               context.config.beforeCondense.call( context.data.$field, context );
-               context.data.$field
-                       .animate( { 'width': context.data.condensedWidth }, 'fast', function() {
-                               context.config.afterCondense.call( this, context );
-                       } );
-       },
-       /**
-        * Sets the value of a property, and updates the widget accordingly
-        * @param property String Name of property
-        * @param value Mixed Value to set property with
-        */
-       configure: function( context, property, value ) {
-               // Validate creation using fallback values
-               switch( property ) {
-                       default:
-                               context.config[property] = value;
-                               break;
-               }
-       }
-
-};
-$.fn.expandableField = function() {
-       
-       // Multi-context fields
-       var returnValue = null;
-       var args = arguments;
-       
-       $( this ).each( function() {
-
-               /* Construction / Loading */
-               
-               var context = $( this ).data( 'expandableField-context' );
-               if ( context == null ) {
-                       context = {
-                               config: {
-                                       // callback function for before collapse
-                                       'beforeCondense': function( context ) {},
-                                       // callback function for before expand
-                                       'beforeExpand': function( context ) {},
-                                       // callback function for after collapse
-                                       'afterCondense': function( context ) {},
-                                       // callback function for after expand
-                                       'afterExpand': function( context ) {},
-                                       // Whether the field should expand to the left or the right -- defaults to left
-                                       'expandToLeft': true
-                               }
-                       };
+( function ( $ ) {
+
+       $.expandableField = {
+               /**
+                * Expand the field, make the callback
+                */
+               expandField: function ( e, context ) {
+                       context.config.beforeExpand.call( context.data.$field, context );
+                       context.data.$field
+                               .animate( { 'width': context.data.expandedWidth }, 'fast', function () {
+                                       context.config.afterExpand.call( this, context );
+                               } );
+               },
+               /**
+                * Condense the field, make the callback
+                */
+               condenseField: function ( e, context ) {
+                       context.config.beforeCondense.call( context.data.$field, context );
+                       context.data.$field
+                               .animate( { 'width': context.data.condensedWidth }, 'fast', function () {
+                                       context.config.afterCondense.call( this, context );
+                               } );
+               },
+               /**
+                * Sets the value of a property, and updates the widget accordingly
+                * @param property String Name of property
+                * @param value Mixed Value to set property with
+                */
+               configure: function ( context, property, value ) {
+                       // TODO: Validate creation using fallback values
+                       context.config[property] = value;
                }
-               
-               /* API */
-               // Handle various calling styles
-               if ( args.length > 0 ) {
-                       if ( typeof args[0] == 'object' ) {
-                               // Apply set of properties
-                               for ( var key in args[0] ) {
-                                       $.expandableField.configure( context, key, args[0][key] );
-                               }
-                       } else if ( typeof args[0] == 'string' ) {
-                               if ( args.length > 1 ) {
-                                       // Set property values
-                                       $.expandableField.configure( context, args[0], args[1] );
-                               } else if ( returnValue == null ) {
-                                       // Get property values, but don't give access to internal data - returns only the first
-                                       returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+
+       };
+
+       $.fn.expandableField = function () {
+
+               // Multi-context fields
+               var returnValue;
+               var args = arguments;
+
+               $( this ).each( function () {
+                       var key;
+
+                       /* Construction / Loading */
+
+                       var context = $( this ).data( 'expandableField-context' );
+
+                       // TODO: Do we need to check both null and undefined?
+                       if ( context === undefined || context === null ) {
+                               context = {
+                                       config: {
+                                               // callback function for before collapse
+                                               beforeCondense: function ( context ) {},
+
+                                               // callback function for before expand
+                                               beforeExpand: function ( context ) {},
+
+                                               // callback function for after collapse
+                                               afterCondense: function ( context ) {},
+
+                                               // callback function for after expand
+                                               afterExpand: function ( context ) {},
+
+                                               // Whether the field should expand to the left or the right -- defaults to left
+                                               expandToLeft: true
+                                       }
+                               };
+                       }
+
+                       /* API */
+                       // Handle various calling styles
+                       if ( args.length > 0 ) {
+                               if ( typeof args[0] === 'object' ) {
+                                       // Apply set of properties
+                                       for ( key in args[0] ) {
+                                               $.expandableField.configure( context, key, args[0][key] );
+                                       }
+                               } else if ( typeof args[0] === 'string' ) {
+                                       if ( args.length > 1 ) {
+                                               // Set property values
+                                               $.expandableField.configure( context, args[0], args[1] );
+
+                                       // TODO: Do we need to check both null and undefined?
+                                       } else if ( returnValue === null || returnValue === undefined ) {
+                                               // Get property values, but don't give access to internal data - returns only the first
+                                               returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+                                       }
                                }
                        }
-               }
-               
-               /* Initialization */
-               
-               if ( typeof context.data == 'undefined' ) {
-                       context.data = {
-                               // The width of the field in it's condensed state
-                               'condensedWidth': $( this ).width(),
-                               // The width of the field in it's expanded state
-                               'expandedWidth': $( this ).width() * 2,
-                               // Reference to the field
-                               '$field': $( this )
-                       };
-                       
-                       $( this )
-                               .addClass( 'expandableField' )
-                               .focus( function( e ) {
-                                       $.expandableField.expandField( e, context );
-                               } )
-                               .delayedBind( 250, 'blur', function( e ) {
-                                       $.expandableField.condenseField( e, context );
-                               } );
-               }
-               // Store the context for next time
-               $( this ).data( 'expandableField-context', context );
-       } );
-       return returnValue !== null ? returnValue : $(this);
-};
 
-} )( jQuery );
+                       /* Initialization */
+
+                       if ( context.data === undefined ) {
+                               context.data = {
+                                       // The width of the field in it's condensed state
+                                       condensedWidth: $( this ).width(),
+
+                                       // The width of the field in it's expanded state
+                                       expandedWidth: $( this ).width() * 2,
+
+                                       // Reference to the field
+                                       $field: $( this )
+                               };
+
+                               $( this )
+                                       .addClass( 'expandableField' )
+                                       .focus( function ( e ) {
+                                               $.expandableField.expandField( e, context );
+                                       } )
+                                       .delayedBind( 250, 'blur', function ( e ) {
+                                               $.expandableField.condenseField( e, context );
+                                       } );
+                       }
+                       // Store the context for next time
+                       $( this ).data( 'expandableField-context', context );
+               } );
+               return returnValue !== undefined ? returnValue : $(this);
+       };
+
+}( jQuery ) );
index fdcdd15..13e9a55 100644 (file)
 /*!
  * jQuery Form Plugin
- * version: 2.84 (12-AUG-2011)
+ * version: 3.14 (30-JUL-2012)
  * @requires jQuery v1.3.2 or later
  *
  * Examples and documentation at: http://malsup.com/jquery/form/
+ * Project repository: https://github.com/malsup/form
  * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
+ *    http://malsup.github.com/mit-license.txt
+ *    http://malsup.github.com/gpl-license-v2.txt
  */
+/*global ActiveXObject alert */
 ;(function($) {
+"use strict";
 
 /*
-       Usage Note:
-       -----------
-       Do not use both ajaxSubmit and ajaxForm on the same form.  These
-       functions are intended to be exclusive.  Use ajaxSubmit if you want
-       to bind your own submit handler to the form.  For example,
-
-       $(document).ready(function() {
-               $('#myForm').bind('submit', function(e) {
-                       e.preventDefault(); // <-- important
-                       $(this).ajaxSubmit({
-                               target: '#output'
-                       });
-               });
-       });
-
-       Use ajaxForm when you want the plugin to manage all the event binding
-       for you.  For example,
-
-       $(document).ready(function() {
-               $('#myForm').ajaxForm({
-                       target: '#output'
-               });
-       });
-
-       When using ajaxForm, the ajaxSubmit function will be invoked for you
-       at the appropriate time.
+    Usage Note:
+    -----------
+    Do not use both ajaxSubmit and ajaxForm on the same form.  These
+    functions are mutually exclusive.  Use ajaxSubmit if you want
+    to bind your own submit handler to the form.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').on('submit', function(e) {
+            e.preventDefault(); // <-- important
+            $(this).ajaxSubmit({
+                target: '#output'
+            });
+        });
+    });
+
+    Use ajaxForm when you want the plugin to manage all the event binding
+    for you.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').ajaxForm({
+            target: '#output'
+        });
+    });
+    
+    You can also use ajaxForm with delegation (requires jQuery v1.7+), so the
+    form does not have to exist when you invoke ajaxForm:
+
+    $('#myForm').ajaxForm({
+        delegation: true,
+        target: '#output'
+    });
+    
+    When using ajaxForm, the ajaxSubmit function will be invoked for you
+    at the appropriate time.
 */
 
+/**
+ * Feature detection
+ */
+var feature = {};
+feature.fileapi = $("<input type='file'/>").get(0).files !== undefined;
+feature.formdata = window.FormData !== undefined;
+
 /**
  * ajaxSubmit() provides a mechanism for immediately submitting
  * an HTML form using AJAX.
  */
 $.fn.ajaxSubmit = function(options) {
-       // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
-       if (!this.length) {
-               log('ajaxSubmit: skipping submit process - no element selected');
-               return this;
-       }
-       
-       var method, action, url, $form = this;
-
-       if (typeof options == 'function') {
-               options = { success: options };
-       }
-
-       method = this.attr('method');
-       action = this.attr('action');
-       url = (typeof action === 'string') ? $.trim(action) : '';
-       url = url || window.location.href || '';
-       if (url) {
-               // clean url (don't include hash vaue)
-               url = (url.match(/^([^#]+)/)||[])[1];
-       }
-
-       options = $.extend(true, {
-               url:  url,
-               success: $.ajaxSettings.success,
-               type: method || 'GET',
-               iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
-       }, options);
-
-       // hook for manipulating the form data before it is extracted;
-       // convenient for use with rich editors like tinyMCE or FCKEditor
-       var veto = {};
-       this.trigger('form-pre-serialize', [this, options, veto]);
-       if (veto.veto) {
-               log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
-               return this;
-       }
-
-       // provide opportunity to alter form data before it is serialized
-       if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
-               log('ajaxSubmit: submit aborted via beforeSerialize callback');
-               return this;
-       }
-
-       var n,v,a = this.formToArray(options.semantic);
-       if (options.data) {
-               options.extraData = options.data;
-               for (n in options.data) {
-                       if( $.isArray(options.data[n]) ) {
-                               for (var k in options.data[n]) {
-                                       a.push( { name: n, value: options.data[n][k] } );
-                               }
-                       }
-                       else {
-                               v = options.data[n];
-                               v = $.isFunction(v) ? v() : v; // if value is fn, invoke it
-                               a.push( { name: n, value: v } );
-                       }
-               }
-       }
-
-       // give pre-submit callback an opportunity to abort the submit
-       if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
-               log('ajaxSubmit: submit aborted via beforeSubmit callback');
-               return this;
-       }
-
-       // fire vetoable 'validate' event
-       this.trigger('form-submit-validate', [a, this, options, veto]);
-       if (veto.veto) {
-               log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
-               return this;
-       }
-
-       var q = $.param(a);
-
-       if (options.type.toUpperCase() == 'GET') {
-               options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
-               options.data = null;  // data is null for 'get'
-       }
-       else {
-               options.data = q; // data is the query string for 'post'
-       }
-
-       var callbacks = [];
-       if (options.resetForm) {
-               callbacks.push(function() { $form.resetForm(); });
-       }
-       if (options.clearForm) {
-               callbacks.push(function() { $form.clearForm(); });
-       }
-
-       // perform a load on the target only if dataType is not provided
-       if (!options.dataType && options.target) {
-               var oldSuccess = options.success || function(){};
-               callbacks.push(function(data) {
-                       var fn = options.replaceTarget ? 'replaceWith' : 'html';
-                       $(options.target)[fn](data).each(oldSuccess, arguments);
-               });
-       }
-       else if (options.success) {
-               callbacks.push(options.success);
-       }
-
-       options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
-               var context = options.context || options;   // jQuery 1.4+ supports scope context 
-               for (var i=0, max=callbacks.length; i < max; i++) {
-                       callbacks[i].apply(context, [data, status, xhr || $form, $form]);
-               }
-       };
-
-       // are there files to upload?
-       var fileInputs = $('input:file', this).length > 0;
-       var mp = 'multipart/form-data';
-       var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
-
-       // options.iframe allows user to force iframe mode
-       // 06-NOV-09: now defaulting to iframe mode if file input is detected
-   if (options.iframe !== false && (fileInputs || options.iframe || multipart)) {
-          // hack to fix Safari hang (thanks to Tim Molendijk for this)
-          // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
-          if (options.closeKeepAlive) {
-                  $.get(options.closeKeepAlive, function() { fileUpload(a); });
-               }
-          else {
-                  fileUpload(a);
-               }
-   }
-   else {
-               // IE7 massage (see issue 57)
-               if ($.browser.msie && method == 'get') { 
-                       var ieMeth = $form[0].getAttribute('method');
-                       if (typeof ieMeth === 'string')
-                               options.type = ieMeth;
-               }
-               $.ajax(options);
-   }
-
-       // fire 'notify' event
-       this.trigger('form-submit-notify', [this, options]);
-       return this;
-
-
-       // private function for handling file uploads (hat tip to YAHOO!)
-       function fileUpload(a) {
-               var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
+    /*jshint scripturl:true */
+
+    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+    if (!this.length) {
+        log('ajaxSubmit: skipping submit process - no element selected');
+        return this;
+    }
+    
+    var method, action, url, $form = this;
+
+    if (typeof options == 'function') {
+        options = { success: options };
+    }
+
+    method = this.attr('method');
+    action = this.attr('action');
+    url = (typeof action === 'string') ? $.trim(action) : '';
+    url = url || window.location.href || '';
+    if (url) {
+        // clean url (don't include hash vaue)
+        url = (url.match(/^([^#]+)/)||[])[1];
+    }
+
+    options = $.extend(true, {
+        url:  url,
+        success: $.ajaxSettings.success,
+        type: method || 'GET',
+        iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
+    }, options);
+
+    // hook for manipulating the form data before it is extracted;
+    // convenient for use with rich editors like tinyMCE or FCKEditor
+    var veto = {};
+    this.trigger('form-pre-serialize', [this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+        return this;
+    }
+
+    // provide opportunity to alter form data before it is serialized
+    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+        log('ajaxSubmit: submit aborted via beforeSerialize callback');
+        return this;
+    }
+
+    var traditional = options.traditional;
+    if ( traditional === undefined ) {
+        traditional = $.ajaxSettings.traditional;
+    }
+    
+    var elements = [];
+    var qx, a = this.formToArray(options.semantic, elements);
+    if (options.data) {
+        options.extraData = options.data;
+        qx = $.param(options.data, traditional);
+    }
+
+    // give pre-submit callback an opportunity to abort the submit
+    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+        log('ajaxSubmit: submit aborted via beforeSubmit callback');
+        return this;
+    }
+
+    // fire vetoable 'validate' event
+    this.trigger('form-submit-validate', [a, this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+        return this;
+    }
+
+    var q = $.param(a, traditional);
+    if (qx) {
+        q = ( q ? (q + '&' + qx) : qx );
+    }    
+    if (options.type.toUpperCase() == 'GET') {
+        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+        options.data = null;  // data is null for 'get'
+    }
+    else {
+        options.data = q; // data is the query string for 'post'
+    }
+
+    var callbacks = [];
+    if (options.resetForm) {
+        callbacks.push(function() { $form.resetForm(); });
+    }
+    if (options.clearForm) {
+        callbacks.push(function() { $form.clearForm(options.includeHidden); });
+    }
+
+    // perform a load on the target only if dataType is not provided
+    if (!options.dataType && options.target) {
+        var oldSuccess = options.success || function(){};
+        callbacks.push(function(data) {
+            var fn = options.replaceTarget ? 'replaceWith' : 'html';
+            $(options.target)[fn](data).each(oldSuccess, arguments);
+        });
+    }
+    else if (options.success) {
+        callbacks.push(options.success);
+    }
+
+    options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
+        var context = options.context || this ;    // jQuery 1.4+ supports scope context 
+        for (var i=0, max=callbacks.length; i < max; i++) {
+            callbacks[i].apply(context, [data, status, xhr || $form, $form]);
+        }
+    };
+
+    // are there files to upload?
+    var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113)
+    var hasFileInputs = fileInputs.length > 0;
+    var mp = 'multipart/form-data';
+    var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
+
+    var fileAPI = feature.fileapi && feature.formdata;
+    log("fileAPI :" + fileAPI);
+    var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;
+
+    // options.iframe allows user to force iframe mode
+    // 06-NOV-09: now defaulting to iframe mode if file input is detected
+    if (options.iframe !== false && (options.iframe || shouldUseFrame)) {
+        // hack to fix Safari hang (thanks to Tim Molendijk for this)
+        // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+        if (options.closeKeepAlive) {
+            $.get(options.closeKeepAlive, function() {
+                fileUploadIframe(a);
+            });
+        }
+          else {
+            fileUploadIframe(a);
+          }
+    }
+    else if ((hasFileInputs || multipart) && fileAPI) {
+        fileUploadXhr(a);
+    }
+    else {
+        $.ajax(options);
+    }
+
+    // clear element array
+    for (var k=0; k < elements.length; k++)
+        elements[k] = null;
+
+    // fire 'notify' event
+    this.trigger('form-submit-notify', [this, options]);
+    return this;
+
+     // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)
+    function fileUploadXhr(a) {
+        var formdata = new FormData();
+
+        for (var i=0; i < a.length; i++) {
+            formdata.append(a[i].name, a[i].value);
+        }
+
+        if (options.extraData) {
+            for (var p in options.extraData)
+                if (options.extraData.hasOwnProperty(p))
+                    formdata.append(p, options.extraData[p]);
+        }
+
+        options.data = null;
+
+        var s = $.extend(true, {}, $.ajaxSettings, options, {
+            contentType: false,
+            processData: false,
+            cache: false,
+            type: 'POST'
+        });
+        
+        if (options.uploadProgress) {
+            // workaround because jqXHR does not expose upload property
+            s.xhr = function() {
+                var xhr = jQuery.ajaxSettings.xhr();
+                if (xhr.upload) {
+                    xhr.upload.onprogress = function(event) {
+                        var percent = 0;
+                        var position = event.loaded || event.position; /*event.position is deprecated*/
+                        var total = event.total;
+                        if (event.lengthComputable) {
+                            percent = Math.ceil(position / total * 100);
+                        }
+                        options.uploadProgress(event, position, total, percent);
+                    };
+                }
+                return xhr;
+            };
+        }
+
+        s.data = null;
+            var beforeSend = s.beforeSend;
+            s.beforeSend = function(xhr, o) {
+                o.data = formdata;
+                if(beforeSend)
+                    beforeSend.call(this, xhr, o);
+        };
+        $.ajax(s);
+    }
+
+    // private function for handling file uploads (hat tip to YAHOO!)
+    function fileUploadIframe(a) {
+        var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
         var useProp = !!$.fn.prop;
 
+        if ($(':input[name=submit],:input[id=submit]', form).length) {
+            // if there is an input with a name or id of 'submit' then we won't be
+            // able to invoke the submit fn on the form (at least not x-browser)
+            alert('Error: Form elements must not have name or id of "submit".');
+            return;
+        }
+        
         if (a) {
-               // ensure that every serialized input is still enabled
-               for (i=0; i < a.length; i++) {
-                el = $(form[a[i].name]);
-                el[ useProp ? 'prop' : 'attr' ]('disabled', false);
-               }
-        }
-
-               if ($(':input[name=submit],:input[id=submit]', form).length) {
-                       // if there is an input with a name or id of 'submit' then we won't be
-                       // able to invoke the submit fn on the form (at least not x-browser)
-                       alert('Error: Form elements must not have name or id of "submit".');
-                       return;
-               }
-               
-               s = $.extend(true, {}, $.ajaxSettings, options);
-               s.context = s.context || s;
-               id = 'jqFormIO' + (new Date().getTime());
-               if (s.iframeTarget) {
-                       $io = $(s.iframeTarget);
-                       n = $io.attr('name');
-                       if (n == null)
-                               $io.attr('name', id);
-                       else
-                               id = n;
-               }
-               else {
-                       $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
-                       $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
-               }
-               io = $io[0];
-
-
-               xhr = { // mock object
-                       aborted: 0,
-                       responseText: null,
-                       responseXML: null,
-                       status: 0,
-                       statusText: 'n/a',
-                       getAllResponseHeaders: function() {},
-                       getResponseHeader: function() {},
-                       setRequestHeader: function() {},
-                       abort: function(status) {
-                               var e = (status === 'timeout' ? 'timeout' : 'aborted');
-                               log('aborting upload... ' + e);
-                               this.aborted = 1;
-                               $io.attr('src', s.iframeSrc); // abort op in progress
-                               xhr.error = e;
-                               s.error && s.error.call(s.context, xhr, e, status);
-                               g && $.event.trigger("ajaxError", [xhr, s, e]);
-                               s.complete && s.complete.call(s.context, xhr, e);
-                       }
-               };
-
-               g = s.global;
-               // trigger ajax global events so that activity/block indicators work like normal
-               if (g && ! $.active++) {
-                       $.event.trigger("ajaxStart");
-               }
-               if (g) {
-                       $.event.trigger("ajaxSend", [xhr, s]);
-               }
-
-               if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
-                       if (s.global) {
-                               $.active--;
-                       }
-                       return;
-               }
-               if (xhr.aborted) {
-                       return;
-               }
-
-               // add submitting element to data if we know it
-               sub = form.clk;
-               if (sub) {
-                       n = sub.name;
-                       if (n && !sub.disabled) {
-                               s.extraData = s.extraData || {};
-                               s.extraData[n] = sub.value;
-                               if (sub.type == "image") {
-                                       s.extraData[n+'.x'] = form.clk_x;
-                                       s.extraData[n+'.y'] = form.clk_y;
-                               }
-                       }
-               }
-               
-               var CLIENT_TIMEOUT_ABORT = 1;
-               var SERVER_ABORT = 2;
-
-               function getDoc(frame) {
-                       var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
-                       return doc;
-               }
-               
-               // take a breath so that pending repaints get some cpu time before the upload starts
-               function doSubmit() {
-                       // make sure form attrs are set
-                       var t = $form.attr('target'), a = $form.attr('action');
-
-                       // update form attrs in IE friendly way
-                       form.setAttribute('target',id);
-                       if (!method) {
-                               form.setAttribute('method', 'POST');
-                       }
-                       if (a != s.url) {
-                               form.setAttribute('action', s.url);
-                       }
-
-                       // ie borks in some cases when setting encoding
-                       if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
-                               $form.attr({
-                                       encoding: 'multipart/form-data',
-                                       enctype:  'multipart/form-data'
-                               });
-                       }
-
-                       // support timout
-                       if (s.timeout) {
-                               timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
-                       }
-                       
-                       // look for server aborts
-                       function checkState() {
-                               try {
-                                       var state = getDoc(io).readyState;
-                                       log('state = ' + state);
-                                       if (state.toLowerCase() == 'uninitialized')
-                                               setTimeout(checkState,50);
-                               }
-                               catch(e) {
-                                       log('Server abort: ' , e, ' (', e.name, ')');
-                                       cb(SERVER_ABORT);
-                                       timeoutHandle && clearTimeout(timeoutHandle);
-                                       timeoutHandle = undefined;
-                               }
-                       }
-
-                       // add "extra" data to form if provided in options
-                       var extraInputs = [];
-                       try {
-                               if (s.extraData) {
-                                       for (var n in s.extraData) {
-                                               extraInputs.push(
-                                                       $('<input type="hidden" name="'+n+'" />').attr('value',s.extraData[n])
-                                                               .appendTo(form)[0]);
-                                       }
-                               }
-
-                               if (!s.iframeTarget) {
-                                       // add iframe to doc and submit the form
-                                       $io.appendTo('body');
-                       io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
-                               }
-                               setTimeout(checkState,15);
-                               form.submit();
-                       }
-                       finally {
-                               // reset attrs and remove "extra" input elements
-                               form.setAttribute('action',a);
-                               if(t) {
-                                       form.setAttribute('target', t);
-                               } else {
-                                       $form.removeAttr('target');
-                               }
-                               $(extraInputs).remove();
-                       }
-               }
-
-               if (s.forceSync) {
-                       doSubmit();
-               }
-               else {
-                       setTimeout(doSubmit, 10); // this lets dom updates render
-               }
-
-               var data, doc, domCheckCount = 50, callbackProcessed;
-
-               function cb(e) {
-                       if (xhr.aborted || callbackProcessed) {
-                               return;
-                       }
-                       try {
-                               doc = getDoc(io);
-                       }
-                       catch(ex) {
-                               log('cannot access response document: ', ex);
-                               e = SERVER_ABORT;
-                       }
-                       if (e === CLIENT_TIMEOUT_ABORT && xhr) {
-                               xhr.abort('timeout');
-                               return;
-                       }
-                       else if (e == SERVER_ABORT && xhr) {
-                               xhr.abort('server abort');
-                               return;
-                       }
-
-                       if (!doc || doc.location.href == s.iframeSrc) {
-                               // response not received yet
-                               if (!timedOut)
-                                       return;
-                       }
-            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
-
-                       var status = 'success', errMsg;
-                       try {
-                               if (timedOut) {
-                                       throw 'timeout';
-                               }
-
-                               var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
-                               log('isXml='+isXml);
-                               if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
-                                       if (--domCheckCount) {
-                                               // in some browsers (Opera) the iframe DOM is not always traversable when
-                                               // the onload callback fires, so we loop a bit to accommodate
-                                               log('requeing onLoad callback, DOM not available');
-                                               setTimeout(cb, 250);
-                                               return;
-                                       }
-                                       // let this fall through because server response could be an empty document
-                                       //log('Could not access iframe DOM after mutiple tries.');
-                                       //throw 'DOMException: not available';
-                               }
-
-                               //log('response detected');
+            // ensure that every serialized input is still enabled
+            for (i=0; i < elements.length; i++) {
+                el = $(elements[i]);
+                if ( useProp )
+                    el.prop('disabled', false);
+                else
+                    el.removeAttr('disabled');
+            }
+        }
+
+        s = $.extend(true, {}, $.ajaxSettings, options);
+        s.context = s.context || s;
+        id = 'jqFormIO' + (new Date().getTime());
+        if (s.iframeTarget) {
+            $io = $(s.iframeTarget);
+            n = $io.attr('name');
+            if (!n)
+                 $io.attr('name', id);
+            else
+                id = n;
+        }
+        else {
+            $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
+            $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+        }
+        io = $io[0];
+
+
+        xhr = { // mock object
+            aborted: 0,
+            responseText: null,
+            responseXML: null,
+            status: 0,
+            statusText: 'n/a',
+            getAllResponseHeaders: function() {},
+            getResponseHeader: function() {},
+            setRequestHeader: function() {},
+            abort: function(status) {
+                var e = (status === 'timeout' ? 'timeout' : 'aborted');
+                log('aborting upload... ' + e);
+                this.aborted = 1;
+                // #214
+                if (io.contentWindow.document.execCommand) {
+                    try { // #214
+                        io.contentWindow.document.execCommand('Stop');
+                    } catch(ignore) {}
+                }
+                $io.attr('src', s.iframeSrc); // abort op in progress
+                xhr.error = e;
+                if (s.error)
+                    s.error.call(s.context, xhr, e, status);
+                if (g)
+                    $.event.trigger("ajaxError", [xhr, s, e]);
+                if (s.complete)
+                    s.complete.call(s.context, xhr, e);
+            }
+        };
+
+        g = s.global;
+        // trigger ajax global events so that activity/block indicators work like normal
+        if (g && 0 === $.active++) {
+            $.event.trigger("ajaxStart");
+        }
+        if (g) {
+            $.event.trigger("ajaxSend", [xhr, s]);
+        }
+
+        if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
+            if (s.global) {
+                $.active--;
+            }
+            return;
+        }
+        if (xhr.aborted) {
+            return;
+        }
+
+        // add submitting element to data if we know it
+        sub = form.clk;
+        if (sub) {
+            n = sub.name;
+            if (n && !sub.disabled) {
+                s.extraData = s.extraData || {};
+                s.extraData[n] = sub.value;
+                if (sub.type == "image") {
+                    s.extraData[n+'.x'] = form.clk_x;
+                    s.extraData[n+'.y'] = form.clk_y;
+                }
+            }
+        }
+        
+        var CLIENT_TIMEOUT_ABORT = 1;
+        var SERVER_ABORT = 2;
+
+        function getDoc(frame) {
+            var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
+            return doc;
+        }
+        
+        // Rails CSRF hack (thanks to Yvan Barthelemy)
+        var csrf_token = $('meta[name=csrf-token]').attr('content');
+        var csrf_param = $('meta[name=csrf-param]').attr('content');
+        if (csrf_param && csrf_token) {
+            s.extraData = s.extraData || {};
+            s.extraData[csrf_param] = csrf_token;
+        }
+
+        // take a breath so that pending repaints get some cpu time before the upload starts
+        function doSubmit() {
+            // make sure form attrs are set
+            var t = $form.attr('target'), a = $form.attr('action');
+
+            // update form attrs in IE friendly way
+            form.setAttribute('target',id);
+            if (!method) {
+                form.setAttribute('method', 'POST');
+            }
+            if (a != s.url) {
+                form.setAttribute('action', s.url);
+            }
+
+            // ie borks in some cases when setting encoding
+            if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
+                $form.attr({
+                    encoding: 'multipart/form-data',
+                    enctype:  'multipart/form-data'
+                });
+            }
+
+            // support timout
+            if (s.timeout) {
+                timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
+            }
+            
+            // look for server aborts
+            function checkState() {
+                try {
+                    var state = getDoc(io).readyState;
+                    log('state = ' + state);
+                    if (state && state.toLowerCase() == 'uninitialized')
+                        setTimeout(checkState,50);
+                }
+                catch(e) {
+                    log('Server abort: ' , e, ' (', e.name, ')');
+                    cb(SERVER_ABORT);
+                    if (timeoutHandle)
+                        clearTimeout(timeoutHandle);
+                    timeoutHandle = undefined;
+                }
+            }
+
+            // add "extra" data to form if provided in options
+            var extraInputs = [];
+            try {
+                if (s.extraData) {
+                    for (var n in s.extraData) {
+                        if (s.extraData.hasOwnProperty(n)) {
+                           // if using the $.param format that allows for multiple values with the same name
+                           if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {
+                               extraInputs.push(
+                               $('<input type="hidden" name="'+s.extraData[n].name+'">').attr('value',s.extraData[n].value)
+                                   .appendTo(form)[0]);
+                           } else {
+                               extraInputs.push(
+                               $('<input type="hidden" name="'+n+'">').attr('value',s.extraData[n])
+                                   .appendTo(form)[0]);
+                           }
+                        }
+                    }
+                }
+
+                if (!s.iframeTarget) {
+                    // add iframe to doc and submit the form
+                    $io.appendTo('body');
+                    if (io.attachEvent)
+                        io.attachEvent('onload', cb);
+                    else
+                        io.addEventListener('load', cb, false);
+                }
+                setTimeout(checkState,15);
+                form.submit();
+            }
+            finally {
+                // reset attrs and remove "extra" input elements
+                form.setAttribute('action',a);
+                if(t) {
+                    form.setAttribute('target', t);
+                } else {
+                    $form.removeAttr('target');
+                }
+                $(extraInputs).remove();
+            }
+        }
+
+        if (s.forceSync) {
+            doSubmit();
+        }
+        else {
+            setTimeout(doSubmit, 10); // this lets dom updates render
+        }
+
+        var data, doc, domCheckCount = 50, callbackProcessed;
+
+        function cb(e) {
+            if (xhr.aborted || callbackProcessed) {
+                return;
+            }
+            try {
+                doc = getDoc(io);
+            }
+            catch(ex) {
+                log('cannot access response document: ', ex);
+                e = SERVER_ABORT;
+            }
+            if (e === CLIENT_TIMEOUT_ABORT && xhr) {
+                xhr.abort('timeout');
+                return;
+            }
+            else if (e == SERVER_ABORT && xhr) {
+                xhr.abort('server abort');
+                return;
+            }
+
+            if (!doc || doc.location.href == s.iframeSrc) {
+                // response not received yet
+                if (!timedOut)
+                    return;
+            }
+            if (io.detachEvent)
+                io.detachEvent('onload', cb);
+            else    
+                io.removeEventListener('load', cb, false);
+
+            var status = 'success', errMsg;
+            try {
+                if (timedOut) {
+                    throw 'timeout';
+                }
+
+                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
+                log('isXml='+isXml);
+                if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {
+                    if (--domCheckCount) {
+                        // in some browsers (Opera) the iframe DOM is not always traversable when
+                        // the onload callback fires, so we loop a bit to accommodate
+                        log('requeing onLoad callback, DOM not available');
+                        setTimeout(cb, 250);
+                        return;
+                    }
+                    // let this fall through because server response could be an empty document
+                    //log('Could not access iframe DOM after mutiple tries.');
+                    //throw 'DOMException: not available';
+                }
+
+                //log('response detected');
                 var docRoot = doc.body ? doc.body : doc.documentElement;
                 xhr.responseText = docRoot ? docRoot.innerHTML : null;
-                               xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
-                               if (isXml)
-                                       s.dataType = 'xml';
-                               xhr.getResponseHeader = function(header){
-                                       var headers = {'content-type': s.dataType};
-                                       return headers[header];
-                               };
+                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+                if (isXml)
+                    s.dataType = 'xml';
+                xhr.getResponseHeader = function(header){
+                    var headers = {'content-type': s.dataType};
+                    return headers[header];
+                };
                 // support for XHR 'status' & 'statusText' emulation :
                 if (docRoot) {
                     xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
                     xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
                 }
 
-                               var dt = s.dataType || '';
-                               var scr = /(json|script|text)/.test(dt.toLowerCase());
-                               if (scr || s.textarea) {
-                                       // see if user embedded response in textarea
-                                       var ta = doc.getElementsByTagName('textarea')[0];
-                                       if (ta) {
-                                               xhr.responseText = ta.value;
+                var dt = (s.dataType || '').toLowerCase();
+                var scr = /(json|script|text)/.test(dt);
+                if (scr || s.textarea) {
+                    // see if user embedded response in textarea
+                    var ta = doc.getElementsByTagName('textarea')[0];
+                    if (ta) {
+                        xhr.responseText = ta.value;
                         // support for XHR 'status' & 'statusText' emulation :
                         xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
                         xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
-                                       }
-                                       else if (scr) {
-                                               // account for browsers injecting pre around json response
-                                               var pre = doc.getElementsByTagName('pre')[0];
-                                               var b = doc.getElementsByTagName('body')[0];
-                                               if (pre) {
-                                                       xhr.responseText = pre.textContent ? pre.textContent : pre.innerHTML;
-                                               }
-                                               else if (b) {
-                                                       xhr.responseText = b.innerHTML;
-                                               }
-                                       }
-                               }
-                               else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
-                                       xhr.responseXML = toXml(xhr.responseText);
-                               }
+                    }
+                    else if (scr) {
+                        // account for browsers injecting pre around json response
+                        var pre = doc.getElementsByTagName('pre')[0];
+                        var b = doc.getElementsByTagName('body')[0];
+                        if (pre) {
+                            xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;
+                        }
+                        else if (b) {
+                            xhr.responseText = b.textContent ? b.textContent : b.innerText;
+                        }
+                    }
+                }
+                else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) {
+                    xhr.responseXML = toXml(xhr.responseText);
+                }
 
                 try {
-                    data = httpData(xhr, s.dataType, s);
+                    data = httpData(xhr, dt, s);
                 }
                 catch (e) {
                     status = 'parsererror';
                     xhr.error = errMsg = (e || status);
                 }
-                       }
-                       catch (e) {
-                               log('error caught: ',e);
-                               status = 'error';
+            }
+            catch (e) {
+                log('error caught: ',e);
+                status = 'error';
                 xhr.error = errMsg = (e || status);
-                       }
+            }
 
-                       if (xhr.aborted) {
-                               log('upload aborted');
-                               status = null;
-                       }
+            if (xhr.aborted) {
+                log('upload aborted');
+                status = null;
+            }
 
             if (xhr.status) { // we've set xhr.status
                 status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
             }
 
-                       // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
-                       if (status === 'success') {
-                               s.success && s.success.call(s.context, data, 'success', xhr);
-                               g && $.event.trigger("ajaxSuccess", [xhr, s]);
-                       }
+            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+            if (status === 'success') {
+                if (s.success)
+                    s.success.call(s.context, data, 'success', xhr);
+                if (g)
+                    $.event.trigger("ajaxSuccess", [xhr, s]);
+            }
             else if (status) {
-                               if (errMsg == undefined)
-                                       errMsg = xhr.statusText;
-                               s.error && s.error.call(s.context, xhr, status, errMsg);
-                               g && $.event.trigger("ajaxError", [xhr, s, errMsg]);
-            }
-
-                       g && $.event.trigger("ajaxComplete", [xhr, s]);
-
-                       if (g && ! --$.active) {
-                               $.event.trigger("ajaxStop");
-                       }
-
-                       s.complete && s.complete.call(s.context, xhr, status);
-
-                       callbackProcessed = true;
-                       if (s.timeout)
-                               clearTimeout(timeoutHandle);
-
-                       // clean up
-                       setTimeout(function() {
-                               if (!s.iframeTarget)
-                                       $io.remove();
-                               xhr.responseXML = null;
-                       }, 100);
-               }
-
-               var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
-                       if (window.ActiveXObject) {
-                               doc = new ActiveXObject('Microsoft.XMLDOM');
-                               doc.async = 'false';
-                               doc.loadXML(s);
-                       }
-                       else {
-                               doc = (new DOMParser()).parseFromString(s, 'text/xml');
-                       }
-                       return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
-               };
-               var parseJSON = $.parseJSON || function(s) {
-                       return window['eval']('(' + s + ')');
-               };
-
-               var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
-
-                       var ct = xhr.getResponseHeader('content-type') || '',
-                               xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
-                               data = xml ? xhr.responseXML : xhr.responseText;
-
-                       if (xml && data.documentElement.nodeName === 'parsererror') {
-                               $.error && $.error('parsererror');
-                       }
-                       if (s && s.dataFilter) {
-                               data = s.dataFilter(data, type);
-                       }
-                       if (typeof data === 'string') {
-                               if (type === 'json' || !type && ct.indexOf('json') >= 0) {
-                                       data = parseJSON(data);
-                               } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
-                                       $.globalEval(data);
-                               }
-                       }
-                       return data;
-               };
-       }
+                if (errMsg === undefined)
+                    errMsg = xhr.statusText;
+                if (s.error)
+                    s.error.call(s.context, xhr, status, errMsg);
+                if (g)
+                    $.event.trigger("ajaxError", [xhr, s, errMsg]);
+            }
+
+            if (g)
+                $.event.trigger("ajaxComplete", [xhr, s]);
+
+            if (g && ! --$.active) {
+                $.event.trigger("ajaxStop");
+            }
+
+            if (s.complete)
+                s.complete.call(s.context, xhr, status);
+
+            callbackProcessed = true;
+            if (s.timeout)
+                clearTimeout(timeoutHandle);
+
+            // clean up
+            setTimeout(function() {
+                if (!s.iframeTarget)
+                    $io.remove();
+                xhr.responseXML = null;
+            }, 100);
+        }
+
+        var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
+            if (window.ActiveXObject) {
+                doc = new ActiveXObject('Microsoft.XMLDOM');
+                doc.async = 'false';
+                doc.loadXML(s);
+            }
+            else {
+                doc = (new DOMParser()).parseFromString(s, 'text/xml');
+            }
+            return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
+        };
+        var parseJSON = $.parseJSON || function(s) {
+            /*jslint evil:true */
+            return window['eval']('(' + s + ')');
+        };
+
+        var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
+
+            var ct = xhr.getResponseHeader('content-type') || '',
+                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
+                data = xml ? xhr.responseXML : xhr.responseText;
+
+            if (xml && data.documentElement.nodeName === 'parsererror') {
+                if ($.error)
+                    $.error('parsererror');
+            }
+            if (s && s.dataFilter) {
+                data = s.dataFilter(data, type);
+            }
+            if (typeof data === 'string') {
+                if (type === 'json' || !type && ct.indexOf('json') >= 0) {
+                    data = parseJSON(data);
+                } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
+                    $.globalEval(data);
+                }
+            }
+            return data;
+        };
+    }
 };
 
 /**
@@ -560,9 +680,9 @@ $.fn.ajaxSubmit = function(options) {
  * The advantages of using this method instead of ajaxSubmit() are:
  *
  * 1: This method will include coordinates for <input type="image" /> elements (if the element
- *     is used to submit the form).
+ *    is used to submit the form).
  * 2. This method will include the submit element's name/value data (for the element that was
- *     used to submit the form).
+ *    used to submit the form).
  * 3. This method binds the submit() method to the form for you.
  *
  * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
@@ -570,60 +690,83 @@ $.fn.ajaxSubmit = function(options) {
  * the form itself.
  */
 $.fn.ajaxForm = function(options) {
-       // in jQuery 1.3+ we can fix mistakes with the ready state
-       if (this.length === 0) {
-               var o = { s: this.selector, c: this.context };
-               if (!$.isReady && o.s) {
-                       log('DOM not ready, queuing ajaxForm');
-                       $(function() {
-                               $(o.s,o.c).ajaxForm(options);
-                       });
-                       return this;
-               }
-               // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-               log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-               return this;
-       }
-
-       return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
-               if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
-                       e.preventDefault();
-                       $(this).ajaxSubmit(options);
-               }
-       }).bind('click.form-plugin', function(e) {
-               var target = e.target;
-               var $el = $(target);
-               if (!($el.is(":submit,input:image"))) {
-                       // is this a child element of the submit el?  (ex: a span within a button)
-                       var t = $el.closest(':submit');
-                       if (t.length == 0) {
-                               return;
-                       }
-                       target = t[0];
-               }
-               var form = this;
-               form.clk = target;
-               if (target.type == 'image') {
-                       if (e.offsetX != undefined) {
-                               form.clk_x = e.offsetX;
-                               form.clk_y = e.offsetY;
-                       } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
-                               var offset = $el.offset();
-                               form.clk_x = e.pageX - offset.left;
-                               form.clk_y = e.pageY - offset.top;
-                       } else {
-                               form.clk_x = e.pageX - target.offsetLeft;
-                               form.clk_y = e.pageY - target.offsetTop;
-                       }
-               }
-               // clear form vars
-               setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
-       });
+    options = options || {};
+    options.delegation = options.delegation && $.isFunction($.fn.on);
+    
+    // in jQuery 1.3+ we can fix mistakes with the ready state
+    if (!options.delegation && this.length === 0) {
+        var o = { s: this.selector, c: this.context };
+        if (!$.isReady && o.s) {
+            log('DOM not ready, queuing ajaxForm');
+            $(function() {
+                $(o.s,o.c).ajaxForm(options);
+            });
+            return this;
+        }
+        // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+        log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+        return this;
+    }
+
+    if ( options.delegation ) {
+        $(document)
+            .off('submit.form-plugin', this.selector, doAjaxSubmit)
+            .off('click.form-plugin', this.selector, captureSubmittingElement)
+            .on('submit.form-plugin', this.selector, options, doAjaxSubmit)
+            .on('click.form-plugin', this.selector, options, captureSubmittingElement);
+        return this;
+    }
+
+    return this.ajaxFormUnbind()
+        .bind('submit.form-plugin', options, doAjaxSubmit)
+        .bind('click.form-plugin', options, captureSubmittingElement);
 };
 
+// private event handlers    
+function doAjaxSubmit(e) {
+    /*jshint validthis:true */
+    var options = e.data;
+    if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
+        e.preventDefault();
+        $(this).ajaxSubmit(options);
+    }
+}
+    
+function captureSubmittingElement(e) {
+    /*jshint validthis:true */
+    var target = e.target;
+    var $el = $(target);
+    if (!($el.is(":submit,input:image"))) {
+        // is this a child element of the submit el?  (ex: a span within a button)
+        var t = $el.closest(':submit');
+        if (t.length === 0) {
+            return;
+        }
+        target = t[0];
+    }
+    var form = this;
+    form.clk = target;
+    if (target.type == 'image') {
+        if (e.offsetX !== undefined) {
+            form.clk_x = e.offsetX;
+            form.clk_y = e.offsetY;
+        } else if (typeof $.fn.offset == 'function') {
+            var offset = $el.offset();
+            form.clk_x = e.pageX - offset.left;
+            form.clk_y = e.pageY - offset.top;
+        } else {
+            form.clk_x = e.pageX - target.offsetLeft;
+            form.clk_y = e.pageY - target.offsetTop;
+        }
+    }
+    // clear form vars
+    setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
+}
+
+
 // ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
 $.fn.ajaxFormUnbind = function() {
-       return this.unbind('submit.form-plugin click.form-plugin');
+    return this.unbind('submit.form-plugin click.form-plugin');
 };
 
 /**
@@ -637,56 +780,74 @@ $.fn.ajaxFormUnbind = function() {
  * It is this array that is passed to pre-submit callback functions provided to the
  * ajaxSubmit() and ajaxForm() methods.
  */
-$.fn.formToArray = function(semantic) {
-       var a = [];
-       if (this.length === 0) {
-               return a;
-       }
-
-       var form = this[0];
-       var els = semantic ? form.getElementsByTagName('*') : form.elements;
-       if (!els) {
-               return a;
-       }
-
-       var i,j,n,v,el,max,jmax;
-       for(i=0, max=els.length; i < max; i++) {
-               el = els[i];
-               n = el.name;
-               if (!n) {
-                       continue;
-               }
-
-               if (semantic && form.clk && el.type == "image") {
-                       // handle image inputs on the fly when semantic == true
-                       if(!el.disabled && form.clk == el) {
-                               a.push({name: n, value: $(el).val()});
-                               a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-                       }
-                       continue;
-               }
-
-               v = $.fieldValue(el, true);
-               if (v && v.constructor == Array) {
-                       for(j=0, jmax=v.length; j < jmax; j++) {
-                               a.push({name: n, value: v[j]});
-                       }
-               }
-               else if (v !== null && typeof v != 'undefined') {
-                       a.push({name: n, value: v});
-               }
-       }
-
-       if (!semantic && form.clk) {
-               // input type=='image' are not found in elements array! handle it here
-               var $input = $(form.clk), input = $input[0];
-               n = input.name;
-               if (n && !input.disabled && input.type == 'image') {
-                       a.push({name: n, value: $input.val()});
-                       a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-               }
-       }
-       return a;
+$.fn.formToArray = function(semantic, elements) {
+    var a = [];
+    if (this.length === 0) {
+        return a;
+    }
+
+    var form = this[0];
+    var els = semantic ? form.getElementsByTagName('*') : form.elements;
+    if (!els) {
+        return a;
+    }
+
+    var i,j,n,v,el,max,jmax;
+    for(i=0, max=els.length; i < max; i++) {
+        el = els[i];
+        n = el.name;
+        if (!n) {
+            continue;
+        }
+
+        if (semantic && form.clk && el.type == "image") {
+            // handle image inputs on the fly when semantic == true
+            if(!el.disabled && form.clk == el) {
+                a.push({name: n, value: $(el).val(), type: el.type });
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+            }
+            continue;
+        }
+
+        v = $.fieldValue(el, true);
+        if (v && v.constructor == Array) {
+            if (elements) 
+                elements.push(el);
+            for(j=0, jmax=v.length; j < jmax; j++) {
+                a.push({name: n, value: v[j]});
+            }
+        }
+        else if (feature.fileapi && el.type == 'file' && !el.disabled) {
+            if (elements) 
+                elements.push(el);
+            var files = el.files;
+            if (files.length) {
+                for (j=0; j < files.length; j++) {
+                    a.push({name: n, value: files[j], type: el.type});
+                }
+            }
+            else {
+                // #180
+                a.push({ name: n, value: '', type: el.type });
+            }
+        }
+        else if (v !== null && typeof v != 'undefined') {
+            if (elements) 
+                elements.push(el);
+            a.push({name: n, value: v, type: el.type, required: el.required});
+        }
+    }
+
+    if (!semantic && form.clk) {
+        // input type=='image' are not found in elements array! handle it here
+        var $input = $(form.clk), input = $input[0];
+        n = input.name;
+        if (n && !input.disabled && input.type == 'image') {
+            a.push({name: n, value: $input.val()});
+            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+        }
+    }
+    return a;
 };
 
 /**
@@ -694,8 +855,8 @@ $.fn.formToArray = function(semantic) {
  * in the format: name1=value1&amp;name2=value2
  */
 $.fn.formSerialize = function(semantic) {
-       //hand off to jQuery.param for proper encoding
-       return $.param(this.formToArray(semantic));
+    //hand off to jQuery.param for proper encoding
+    return $.param(this.formToArray(semantic));
 };
 
 /**
@@ -703,36 +864,36 @@ $.fn.formSerialize = function(semantic) {
  * This method will return a string in the format: name1=value1&amp;name2=value2
  */
 $.fn.fieldSerialize = function(successful) {
-       var a = [];
-       this.each(function() {
-               var n = this.name;
-               if (!n) {
-                       return;
-               }
-               var v = $.fieldValue(this, successful);
-               if (v && v.constructor == Array) {
-                       for (var i=0,max=v.length; i < max; i++) {
-                               a.push({name: n, value: v[i]});
-                       }
-               }
-               else if (v !== null && typeof v != 'undefined') {
-                       a.push({name: this.name, value: v});
-               }
-       });
-       //hand off to jQuery.param for proper encoding
-       return $.param(a);
+    var a = [];
+    this.each(function() {
+        var n = this.name;
+        if (!n) {
+            return;
+        }
+        var v = $.fieldValue(this, successful);
+        if (v && v.constructor == Array) {
+            for (var i=0,max=v.length; i < max; i++) {
+                a.push({name: n, value: v[i]});
+            }
+        }
+        else if (v !== null && typeof v != 'undefined') {
+            a.push({name: this.name, value: v});
+        }
+    });
+    //hand off to jQuery.param for proper encoding
+    return $.param(a);
 };
 
 /**
  * Returns the value(s) of the element in the matched set.  For example, consider the following form:
  *
  *  <form><fieldset>
- *       <input name="A" type="text" />
- *       <input name="A" type="text" />
- *       <input name="B" type="checkbox" value="B1" />
- *       <input name="B" type="checkbox" value="B2"/>
- *       <input name="C" type="radio" value="C1" />
- *       <input name="C" type="radio" value="C2" />
+ *      <input name="A" type="text" />
+ *      <input name="A" type="text" />
+ *      <input name="B" type="checkbox" value="B1" />
+ *      <input name="B" type="checkbox" value="B2"/>
+ *      <input name="C" type="radio" value="C1" />
+ *      <input name="C" type="radio" value="C2" />
  *  </fieldset></form>
  *
  *  var v = $(':text').fieldValue();
@@ -759,60 +920,63 @@ $.fn.fieldSerialize = function(successful) {
  * for each element is returned.
  *
  * Note: This method *always* returns an array.  If no valid value can be determined the
- *        array will be empty, otherwise it will contain one or more values.
+ *    array will be empty, otherwise it will contain one or more values.
  */
 $.fn.fieldValue = function(successful) {
-       for (var val=[], i=0, max=this.length; i < max; i++) {
-               var el = this[i];
-               var v = $.fieldValue(el, successful);
-               if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
-                       continue;
-               }
-               v.constructor == Array ? $.merge(val, v) : val.push(v);
-       }
-       return val;
+    for (var val=[], i=0, max=this.length; i < max; i++) {
+        var el = this[i];
+        var v = $.fieldValue(el, successful);
+        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
+            continue;
+        }
+        if (v.constructor == Array)
+            $.merge(val, v);
+        else
+            val.push(v);
+    }
+    return val;
 };
 
 /**
  * Returns the value of the field element.
  */
 $.fieldValue = function(el, successful) {
-       var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
-       if (successful === undefined) {
-               successful = true;
-       }
-
-       if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
-               (t == 'checkbox' || t == 'radio') && !el.checked ||
-               (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
-               tag == 'select' && el.selectedIndex == -1)) {
-                       return null;
-       }
-
-       if (tag == 'select') {
-               var index = el.selectedIndex;
-               if (index < 0) {
-                       return null;
-               }
-               var a = [], ops = el.options;
-               var one = (t == 'select-one');
-               var max = (one ? index+1 : ops.length);
-               for(var i=(one ? index : 0); i < max; i++) {
-                       var op = ops[i];
-                       if (op.selected) {
-                               var v = op.value;
-                               if (!v) { // extra pain for IE...
-                                       v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
-                               }
-                               if (one) {
-                                       return v;
-                               }
-                               a.push(v);
-                       }
-               }
-               return a;
-       }
-       return $(el).val();
+    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+    if (successful === undefined) {
+        successful = true;
+    }
+
+    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+        (t == 'checkbox' || t == 'radio') && !el.checked ||
+        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+        tag == 'select' && el.selectedIndex == -1)) {
+            return null;
+    }
+
+    if (tag == 'select') {
+        var index = el.selectedIndex;
+        if (index < 0) {
+            return null;
+        }
+        var a = [], ops = el.options;
+        var one = (t == 'select-one');
+        var max = (one ? index+1 : ops.length);
+        for(var i=(one ? index : 0); i < max; i++) {
+            var op = ops[i];
+            if (op.selected) {
+                var v = op.value;
+                if (!v) { // extra pain for IE...
+                    v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
+                }
+                if (one) {
+                    return v;
+                }
+                a.push(v);
+            }
+        }
+        return a;
+    }
+    return $(el).val();
 };
 
 /**
@@ -823,54 +987,63 @@ $.fieldValue = function(el, successful) {
  *  - inputs of type submit, button, reset, and hidden will *not* be effected
  *  - button elements will *not* be effected
  */
-$.fn.clearForm = function() {
-       return this.each(function() {
-               $('input,select,textarea', this).clearFields();
-       });
+$.fn.clearForm = function(includeHidden) {
+    return this.each(function() {
+        $('input,select,textarea', this).clearFields(includeHidden);
+    });
 };
 
 /**
  * Clears the selected form elements.
  */
-$.fn.clearFields = $.fn.clearInputs = function() {
-       var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
-       return this.each(function() {
-               var t = this.type, tag = this.tagName.toLowerCase();
-               if (re.test(t) || tag == 'textarea') {
-                       this.value = '';
-               }
-               else if (t == 'checkbox' || t == 'radio') {
-                       this.checked = false;
-               }
-               else if (tag == 'select') {
-                       this.selectedIndex = -1;
-               }
-       });
+$.fn.clearFields = $.fn.clearInputs = function(includeHidden) {
+    var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
+    return this.each(function() {
+        var t = this.type, tag = this.tagName.toLowerCase();
+        if (re.test(t) || tag == 'textarea') {
+            this.value = '';
+        }
+        else if (t == 'checkbox' || t == 'radio') {
+            this.checked = false;
+        }
+        else if (tag == 'select') {
+            this.selectedIndex = -1;
+        }
+        else if (includeHidden) {
+            // includeHidden can be the value true, or it can be a selector string
+            // indicating a special test; for example:
+            //  $('#myForm').clearForm('.special:hidden')
+            // the above would clean hidden inputs that have the class of 'special'
+            if ( (includeHidden === true && /hidden/.test(t)) ||
+                 (typeof includeHidden == 'string' && $(this).is(includeHidden)) )
+                this.value = '';
+        }
+    });
 };
 
 /**
  * Resets the form data.  Causes all form elements to be reset to their original value.
  */
 $.fn.resetForm = function() {
-       return this.each(function() {
-               // guard against an input with the name of 'reset'
-               // note that IE reports the reset function as an 'object'
-               if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
-                       this.reset();
-               }
-       });
+    return this.each(function() {
+        // guard against an input with the name of 'reset'
+        // note that IE reports the reset function as an 'object'
+        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
+            this.reset();
+        }
+    });
 };
 
 /**
  * Enables or disables any matching elements.
  */
 $.fn.enable = function(b) {
-       if (b === undefined) {
-               b = true;
-       }
-       return this.each(function() {
-               this.disabled = !b;
-       });
+    if (b === undefined) {
+        b = true;
+    }
+    return this.each(function() {
+        this.disabled = !b;
+    });
 };
 
 /**
@@ -878,34 +1051,39 @@ $.fn.enable = function(b) {
  * selects/deselects and matching option elements.
  */
 $.fn.selected = function(select) {
-       if (select === undefined) {
-               select = true;
-       }
-       return this.each(function() {
-               var t = this.type;
-               if (t == 'checkbox' || t == 'radio') {
-                       this.checked = select;
-               }
-               else if (this.tagName.toLowerCase() == 'option') {
-                       var $sel = $(this).parent('select');
-                       if (select && $sel[0] && $sel[0].type == 'select-one') {
-                               // deselect all other options
-                               $sel.find('option').selected(false);
-                       }
-                       this.selected = select;
-               }
-       });
+    if (select === undefined) {
+        select = true;
+    }
+    return this.each(function() {
+        var t = this.type;
+        if (t == 'checkbox' || t == 'radio') {
+            this.checked = select;
+        }
+        else if (this.tagName.toLowerCase() == 'option') {
+            var $sel = $(this).parent('select');
+            if (select && $sel[0] && $sel[0].type == 'select-one') {
+                // deselect all other options
+                $sel.find('option').selected(false);
+            }
+            this.selected = select;
+        }
+    });
 };
 
+// expose debug var
+$.fn.ajaxSubmit.debug = false;
+
 // helper fn for console logging
 function log() {
-       var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
-       if (window.console && window.console.log) {
-               window.console.log(msg);
-       }
-       else if (window.opera && window.opera.postError) {
-               window.opera.postError(msg);
-       }
-};
+    if (!$.fn.ajaxSubmit.debug) 
+        return;
+    var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
+    if (window.console && window.console.log) {
+        window.console.log(msg);
+    }
+    else if (window.opera && window.opera.postError) {
+        window.opera.postError(msg);
+    }
+}
 
 })(jQuery);
index c05012d..25b806b 100644 (file)
@@ -3,8 +3,8 @@
  *
  * @author Timo Tijhof, 2011
  */
-jQuery.fn.getAttrs = function( all ) {
-       var     map = this[0].attributes,
+jQuery.fn.getAttrs = function ( all ) {
+       var map = this[0].attributes,
                attrs = {},
                len = map.length,
                i, v;
index 42b1194..fa4416c 100644 (file)
@@ -1,64 +1,67 @@
 /**
- * Plugin that highlights matched word partials in a given element
- * TODO: add a function for restoring the previous text
- * TODO: accept mappings for converting shortcuts like WP: to Wikipedia: 
+ * Plugin that highlights matched word partials in a given element.
+ * TODO: Add a function for restoring the previous text.
+ * TODO: Accept mappings for converting shortcuts like WP: to Wikipedia:.
  */
-( function( $ ) {
+( function ( $ ) {
 
-$.highlightText = {
-       
-       // Split our pattern string at spaces and run our highlight function on the results
-       splitAndHighlight: function( node, pat ) {
-               var patArray = pat.split(" ");
-               for ( var i = 0; i < patArray.length; i++ ) {
-                       if ( patArray[i].length == 0 ) continue;
-                       $.highlightText.innerHighlight( node, patArray[i] );
-               }
-               return node;
-       },
-       // scans a node looking for the pattern and wraps a span around each match 
-       innerHighlight: function( node, pat ) {
-               // if this is a text node
-               if ( node.nodeType == 3 ) {
-                       // TODO - need to be smarter about the character matching here. 
-                       // non latin characters can make regex think a new word has begun: do not use \b
-                       // http://stackoverflow.com/questions/3787072/regex-wordwrap-with-utf8-characters-in-js
-                       // look for an occurrence of our pattern and store the starting position
-                       var match = node.data.match( new RegExp( "(^|\\s)" + $.escapeRE( pat ), "i" ) );
-                       if ( match ) {
-                               var pos = match.index + match[1].length; // include length of any matched spaces
-                               // create the span wrapper for the matched text
-                               var spannode = document.createElement( 'span' );
-                               spannode.className = 'highlight';
-                               // shave off the characters preceding the matched text
-                               var middlebit = node.splitText( pos );
-                               // shave off any unmatched text off the end
-                               middlebit.splitText( pat.length );
-                               // clone for appending to our span
-                               var middleclone = middlebit.cloneNode( true );
-                               // append the matched text node to the span
-                               spannode.appendChild( middleclone );
-                               // replace the matched node, with our span-wrapped clone of the matched node
-                               middlebit.parentNode.replaceChild( spannode, middlebit );
+       $.highlightText = {
+
+               // Split our pattern string at spaces and run our highlight function on the results
+               splitAndHighlight: function ( node, pat ) {
+                       var patArray = pat.split( ' ' );
+                       for ( var i = 0; i < patArray.length; i++ ) {
+                               if ( patArray[i].length === 0 ) {
+                                       continue;
+                               }
+                               $.highlightText.innerHighlight( node, patArray[i] );
                        }
-               // if this is an element with childnodes, and not a script, style or an element we created
-               } else if ( node.nodeType == 1 && node.childNodes && !/(script|style)/i.test( node.tagName )
-                               && !( node.tagName.toLowerCase() == 'span' && node.className.match( /\bhighlight/ ) ) ) {
-                       for ( var i = 0; i < node.childNodes.length; ++i ) {
-                               // call the highlight function for each child node
-                               $.highlightText.innerHighlight( node.childNodes[i], pat );
+                       return node;
+               },
+
+               // scans a node looking for the pattern and wraps a span around each match
+               innerHighlight: function ( node, pat ) {
+                       // if this is a text node
+                       if ( node.nodeType === 3 ) {
+                               // TODO - need to be smarter about the character matching here.
+                               // non latin characters can make regex think a new word has begun: do not use \b
+                               // http://stackoverflow.com/questions/3787072/regex-wordwrap-with-utf8-characters-in-js
+                               // look for an occurrence of our pattern and store the starting position
+                               var match = node.data.match( new RegExp( "(^|\\s)" + $.escapeRE( pat ), "i" ) );
+                               if ( match ) {
+                                       var pos = match.index + match[1].length; // include length of any matched spaces
+                                       // create the span wrapper for the matched text
+                                       var spannode = document.createElement( 'span' );
+                                       spannode.className = 'highlight';
+                                       // shave off the characters preceding the matched text
+                                       var middlebit = node.splitText( pos );
+                                       // shave off any unmatched text off the end
+                                       middlebit.splitText( pat.length );
+                                       // clone for appending to our span
+                                       var middleclone = middlebit.cloneNode( true );
+                                       // append the matched text node to the span
+                                       spannode.appendChild( middleclone );
+                                       // replace the matched node, with our span-wrapped clone of the matched node
+                                       middlebit.parentNode.replaceChild( spannode, middlebit );
+                               }
+                       // if this is an element with childnodes, and not a script, style or an element we created
+                       } else if ( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test( node.tagName )
+                                       && !( node.tagName.toLowerCase() === 'span' && node.className.match( /\bhighlight/ ) ) ) {
+                               for ( var i = 0; i < node.childNodes.length; ++i ) {
+                                       // call the highlight function for each child node
+                                       $.highlightText.innerHighlight( node.childNodes[i], pat );
+                               }
                        }
                }
-       }
-};
+       };
 
-$.fn.highlightText = function( matchString ) {
-       return $( this ).each( function() {
-               var $this = $( this );
-               $this.data( 'highlightText', { originalText: $this.text() } );
-               $.highlightText.splitAndHighlight( this, matchString );
-       } );
-};
+       $.fn.highlightText = function ( matchString ) {
+               return $( this ).each( function () {
+                       var $el = $( this );
+                       $el.data( 'highlightText', { originalText: $el.text() } );
+                       $.highlightText.splitAndHighlight( this, matchString );
+               } );
+       };
 
-} )( jQuery );
+}( jQuery ) );
 
diff --git a/resources/jquery/jquery.jStorage.js b/resources/jquery/jquery.jStorage.js
new file mode 100644 (file)
index 0000000..95959cf
--- /dev/null
@@ -0,0 +1,532 @@
+/*
+ * ----------------------------- JSTORAGE -------------------------------------
+ * Simple local storage wrapper to save data on the browser side, supporting
+ * all major browsers - IE6+, Firefox2+, Safari4+, Chrome4+ and Opera 10.5+
+ *
+ * Copyright (c) 2010 Andris Reinman, andris.reinman@gmail.com
+ * Project homepage: www.jstorage.info
+ *
+ * Taken from Github with slight modifications by Hoo man
+ * https://raw.github.com/andris9/jStorage/master/jstorage.js
+ *
+ * Licensed under MIT-style license:
+ *
+ * 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 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.
+ */
+
+/**
+ * $.jStorage
+ *
+ * USAGE:
+ *
+ * jStorage requires Prototype, MooTools or jQuery! If jQuery is used, then
+ * jQuery-JSON (http://code.google.com/p/jquery-json/) is also needed.
+ * (jQuery-JSON needs to be loaded BEFORE jStorage!)
+ *
+ * Methods:
+ *
+ * -set(key, value[, options])
+ * $.jStorage.set(key, value) -> saves a value
+ *
+ * -get(key[, default])
+ * value = $.jStorage.get(key [, default]) ->
+ *    retrieves value if key exists, or default if it doesn't
+ *
+ * -deleteKey(key)
+ * $.jStorage.deleteKey(key) -> removes a key from the storage
+ *
+ * -flush()
+ * $.jStorage.flush() -> clears the cache
+ *
+ * -storageObj()
+ * $.jStorage.storageObj() -> returns a read-ony copy of the actual storage
+ *
+ * -storageSize()
+ * $.jStorage.storageSize() -> returns the size of the storage in bytes
+ *
+ * -index()
+ * $.jStorage.index() -> returns the used keys as an array
+ *
+ * -storageAvailable()
+ * $.jStorage.storageAvailable() -> returns true if storage is available
+ *
+ * -reInit()
+ * $.jStorage.reInit() -> reloads the data from browser storage
+ *
+ * <value> can be any JSON-able value, including objects and arrays.
+ *
+ **/
+
+(function($){
+    if(!$ || !($.toJSON || Object.toJSON || window.JSON)){
+        throw new Error("jQuery, MooTools or Prototype needs to be loaded before jStorage!");
+    }
+
+    var
+        /* This is the object, that holds the cached values */
+        _storage = {},
+
+        /* Actual browser storage (localStorage or globalStorage['domain']) */
+        _storage_service = {jStorage:"{}"},
+
+        /* DOM element for older IE versions, holds userData behavior */
+        _storage_elm = null,
+
+        /* How much space does the storage take */
+        _storage_size = 0,
+
+        /* function to encode objects to JSON strings */
+        json_encode = $.toJSON || Object.toJSON || (window.JSON && (JSON.encode || JSON.stringify)),
+
+        /* function to decode objects from JSON strings */
+        json_decode = $.evalJSON || (window.JSON && (JSON.decode || JSON.parse)) || function(str){
+            return String(str).evalJSON();
+        },
+
+        /* which backend is currently used */
+        _backend = false,
+
+        /* Next check for TTL */
+        _ttl_timeout,
+
+        /**
+         * XML encoding and decoding as XML nodes can't be JSON'ized
+         * XML nodes are encoded and decoded if the node is the value to be saved
+         * but not if it's as a property of another object
+         * Eg. -
+         *   $.jStorage.set("key", xmlNode);        // IS OK
+         *   $.jStorage.set("key", {xml: xmlNode}); // NOT OK
+         */
+        _XMLService = {
+
+            /**
+             * Validates a XML node to be XML
+             * based on jQuery.isXML function
+             */
+            isXML: function(elm){
+                var documentElement = (elm ? elm.ownerDocument || elm : 0).documentElement;
+                return documentElement ? documentElement.nodeName !== "HTML" : false;
+            },
+
+            /**
+             * Encodes a XML node to string
+             * based on http://www.mercurytide.co.uk/news/article/issues-when-working-ajax/
+             */
+            encode: function(xmlNode) {
+                if(!this.isXML(xmlNode)){
+                    return false;
+                }
+                try{ // Mozilla, Webkit, Opera
+                    return new XMLSerializer().serializeToString(xmlNode);
+                }catch(E1) {
+                    try {  // IE
+                        return xmlNode.xml;
+                    }catch(E2){}
+                }
+                return false;
+            },
+
+            /**
+             * Decodes a XML node from string
+             * loosely based on http://outwestmedia.com/jquery-plugins/xmldom/
+             */
+            decode: function(xmlString){
+                var dom_parser = ("DOMParser" in window && (new DOMParser()).parseFromString) ||
+                        (window.ActiveXObject && function(_xmlString) {
+                    var xml_doc = new ActiveXObject('Microsoft.XMLDOM');
+                    xml_doc.async = 'false';
+                    xml_doc.loadXML(_xmlString);
+                    return xml_doc;
+                }),
+                resultXML;
+                if(!dom_parser){
+                    return false;
+                }
+                resultXML = dom_parser.call("DOMParser" in window && (new DOMParser()) || window, xmlString, 'text/xml');
+                return this.isXML(resultXML)?resultXML:false;
+            }
+        };
+
+    ////////////////////////// PRIVATE METHODS ////////////////////////
+
+    /**
+     * Initialization function. Detects if the browser supports DOM Storage
+     * or userData behavior and behaves accordingly.
+     * @returns undefined
+     */
+    function _init(){
+        /* Check if browser supports localStorage */
+        var localStorageReallyWorks = false;
+        if("localStorage" in window){
+            try {
+                window.localStorage.setItem('_tmptest', 'tmpval');
+                localStorageReallyWorks = true;
+                window.localStorage.removeItem('_tmptest');
+            } catch(BogusQuotaExceededErrorOnIos5) {
+                // Thanks be to iOS5 Private Browsing mode which throws
+                // QUOTA_EXCEEDED_ERRROR DOM Exception 22.
+            }
+        }
+        if(localStorageReallyWorks){
+            try {
+                if(window.localStorage) {
+                    _storage_service = window.localStorage;
+                    _backend = "localStorage";
+                }
+            } catch(E3) {/* Firefox fails when touching localStorage and cookies are disabled */}
+        }
+        /* Check if browser supports globalStorage */
+        else if("globalStorage" in window){
+            try {
+                if(window.globalStorage) {
+                    _storage_service = window.globalStorage[window.location.hostname];
+                    _backend = "globalStorage";
+                }
+            } catch(E4) {/* Firefox fails when touching localStorage and cookies are disabled */}
+        }
+        /* Check if browser supports userData behavior */
+        else {
+            _storage_elm = document.createElement('link');
+            if(_storage_elm.addBehavior){
+
+                /* Use a DOM element to act as userData storage */
+                _storage_elm.style.behavior = 'url(#default#userData)';
+
+                /* userData element needs to be inserted into the DOM! */
+                document.getElementsByTagName('head')[0].appendChild(_storage_elm);
+
+                _storage_elm.load("jStorage");
+                var data = "{}";
+                try{
+                    data = _storage_elm.getAttribute("jStorage");
+                }catch(E5){}
+                _storage_service.jStorage = data;
+                _backend = "userDataBehavior";
+            }else{
+                _storage_elm = null;
+                return;
+            }
+        }
+
+        _load_storage();
+
+        // remove dead keys
+        _handleTTL();
+    }
+
+    /**
+     * Loads the data from the storage based on the supported mechanism
+     * @returns undefined
+     */
+    function _load_storage(){
+        /* if jStorage string is retrieved, then decode it */
+        if(_storage_service.jStorage){
+            try{
+                _storage = json_decode(String(_storage_service.jStorage));
+            }catch(E6){_storage_service.jStorage = "{}";}
+        }else{
+            _storage_service.jStorage = "{}";
+        }
+        _storage_size = _storage_service.jStorage?String(_storage_service.jStorage).length:0;
+    }
+
+    /**
+     * This functions provides the "save" mechanism to store the jStorage object
+     * @returns undefined
+     */
+    function _save(){
+        try{
+            _storage_service.jStorage = json_encode(_storage);
+            // If userData is used as the storage engine, additional
+            if(_storage_elm) {
+                _storage_elm.setAttribute("jStorage",_storage_service.jStorage);
+                _storage_elm.save("jStorage");
+            }
+            _storage_size = _storage_service.jStorage?String(_storage_service.jStorage).length:0;
+        }catch(E7){/* probably cache is full, nothing is saved this way*/}
+    }
+
+    /**
+     * Function checks if a key is set and is string or numberic
+     */
+    function _checkKey(key){
+        if(!key || (typeof key !== "string" && typeof key !== "number")){
+            throw new TypeError('Key name must be string or numeric');
+        }
+        if(key === "__jstorage_meta"){
+            throw new TypeError('Reserved key name');
+        }
+        return true;
+    }
+
+    /**
+     * Removes expired keys
+     */
+    function _handleTTL(){
+        var curtime, i, TTL, nextExpire = Infinity, changed = false;
+
+        clearTimeout(_ttl_timeout);
+
+        if(!_storage.__jstorage_meta || typeof _storage.__jstorage_meta.TTL !== "object"){
+            // nothing to do here
+            return;
+        }
+
+        curtime = +new Date();
+        TTL = _storage.__jstorage_meta.TTL;
+        for(i in TTL){
+            if(TTL.hasOwnProperty(i)){
+                if(TTL[i] <= curtime){
+                    delete TTL[i];
+                    delete _storage[i];
+                    changed = true;
+                }else if(TTL[i] < nextExpire){
+                    nextExpire = TTL[i];
+                }
+            }
+        }
+
+        // set next check
+        if(nextExpire != Infinity){
+            _ttl_timeout = setTimeout(_handleTTL, nextExpire - curtime);
+        }
+
+        // save changes
+        if(changed){
+            _save();
+        }
+    }
+
+    ////////////////////////// PUBLIC INTERFACE /////////////////////////
+
+    $.jStorage = {
+        /* Version number */
+        version: "0.1.7.0",
+
+        /**
+         * Sets a key's value.
+         *
+         * @param {String} key - Key to set. If this value is not set or not
+         *              a string an exception is raised.
+         * @param {Mixed} value - Value to set. This can be any value that is JSON
+         *              compatible (Numbers, Strings, Objects etc.).
+         * @param {Object} [options] - possible options to use
+         * @param {Number} [options.TTL] - optional TTL value
+         * @returns the used value
+         */
+        set: function(key, value, options){
+            _checkKey(key);
+
+            options = options || {};
+
+            if(_XMLService.isXML(value)){
+                value = {_is_xml:true,xml:_XMLService.encode(value)};
+            }else if(typeof value === "function"){
+                value = null; // functions can't be saved!
+            }else if(value && typeof value === "object"){
+                // clone the object before saving to _storage tree
+                value = json_decode(json_encode(value));
+            }
+            _storage[key] = value;
+
+            if(!isNaN(options.TTL)){
+                this.setTTL(key, options.TTL);
+                // also handles saving
+            }else{
+                _save();
+            }
+            return value;
+        },
+
+        /**
+         * Looks up a key in cache
+         *
+         * @param {String} key - Key to look up.
+         * @param {mixed} def - Default value to return, if key didn't exist.
+         * @returns the key value, default value or <null>
+         */
+        get: function(key, def){
+            _checkKey(key);
+            if(key in _storage){
+                if(_storage[key] && typeof _storage[key] === "object" &&
+                        _storage[key]._is_xml &&
+                            _storage[key]._is_xml){
+                    return _XMLService.decode(_storage[key].xml);
+                }else{
+                    return _storage[key];
+                }
+            }
+            return typeof(def) === 'undefined' ? null : def;
+        },
+
+        /**
+         * Deletes a key from cache.
+         *
+         * @param {String} key - Key to delete.
+         * @returns true if key existed or false if it didn't
+         */
+        deleteKey: function(key){
+            _checkKey(key);
+            if(key in _storage){
+                delete _storage[key];
+                // remove from TTL list
+                if(_storage.__jstorage_meta &&
+                  typeof _storage.__jstorage_meta.TTL === "object" &&
+                  key in _storage.__jstorage_meta.TTL){
+                    delete _storage.__jstorage_meta.TTL[key];
+                }
+                _save();
+                return true;
+            }
+            return false;
+        },
+
+        /**
+         * Sets a TTL for a key, or remove it if ttl value is 0 or below
+         *
+         * @param {String} key - key to set the TTL for
+         * @param {Number} ttl - TTL timeout in milliseconds
+         * @returns true if key existed or false if it didn't
+         */
+        setTTL: function(key, ttl){
+            var curtime = +new Date();
+            _checkKey(key);
+            ttl = Number(ttl) || 0;
+            if(key in _storage){
+
+                if(!_storage.__jstorage_meta){
+                    _storage.__jstorage_meta = {};
+                }
+                if(!_storage.__jstorage_meta.TTL){
+                    _storage.__jstorage_meta.TTL = {};
+                }
+
+                // Set TTL value for the key
+                if(ttl>0){
+                    _storage.__jstorage_meta.TTL[key] = curtime + ttl;
+                }else{
+                    delete _storage.__jstorage_meta.TTL[key];
+                }
+
+                _save();
+
+                _handleTTL();
+                return true;
+            }
+            return false;
+        },
+
+        /**
+         * Deletes everything in cache.
+         *
+         * @return true
+         */
+        flush: function(){
+            _storage = {};
+            _save();
+            return true;
+        },
+
+        /**
+         * Returns a read-only copy of _storage
+         *
+         * @returns Object
+        */
+        storageObj: function(){
+            function F() {}
+            F.prototype = _storage;
+            return new F();
+        },
+
+        /**
+         * Returns an index of all used keys as an array
+         * ['key1', 'key2',..'keyN']
+         *
+         * @returns Array
+        */
+        index: function(){
+            var index = [], i;
+            for(i in _storage){
+                if(_storage.hasOwnProperty(i) && i !== "__jstorage_meta"){
+                    index.push(i);
+                }
+            }
+            return index;
+        },
+
+        /**
+         * How much space in bytes does the storage take?
+         *
+         * @returns Number
+         */
+        storageSize: function(){
+            return _storage_size;
+        },
+
+        /**
+         * Which backend is currently in use?
+         *
+         * @returns String
+         */
+        currentBackend: function(){
+            return _backend;
+        },
+
+        /**
+         * Test if storage is available
+         *
+         * @returns Boolean
+         */
+        storageAvailable: function(){
+            return !!_backend;
+        },
+
+        /**
+         * Reloads the data from browser storage
+         *
+         * @returns undefined
+         */
+        reInit: function(){
+            var new_storage_elm, data;
+            if(_storage_elm && _storage_elm.addBehavior){
+                new_storage_elm = document.createElement('link');
+
+                _storage_elm.parentNode.replaceChild(new_storage_elm, _storage_elm);
+                _storage_elm = new_storage_elm;
+
+                /* Use a DOM element to act as userData storage */
+                _storage_elm.style.behavior = 'url(#default#userData)';
+
+                /* userData element needs to be inserted into the DOM! */
+                document.getElementsByTagName('head')[0].appendChild(_storage_elm);
+
+                _storage_elm.load("jStorage");
+                data = "{}";
+                try{
+                    data = _storage_elm.getAttribute("jStorage");
+                }catch(E5){}
+                _storage_service.jStorage = data;
+                _backend = "userDataBehavior";
+            }
+
+            _load_storage();
+        }
+    };
+
+    // Initialize jStorage
+    _init();
+
+})(window.$ || window.jQuery);
index 3774ff9..0770682 100644 (file)
@@ -1,31 +1,28 @@
 /*!
- * jQuery JavaScript Library v1.7.2
+ * jQuery JavaScript Library v1.8.0
  * http://jquery.com/
  *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
  * Includes Sizzle.js
  * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
  *
- * Date: Wed Mar 21 12:46:34 2012 -0700
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Thu Aug 09 2012 16:24:48 GMT-0400 (Eastern Daylight Time)
  */
 (function( window, undefined ) {
+var
+       // A central reference to the root jQuery(document)
+       rootjQuery,
 
-// Use the correct document accordingly with window argument (sandbox)
-var document = window.document,
-       navigator = window.navigator,
-       location = window.location;
-var jQuery = (function() {
+       // The deferred used on DOM ready
+       readyList,
 
-// Define a local copy of jQuery
-var jQuery = function( selector, context ) {
-               // The jQuery object is actually just the init constructor 'enhanced'
-               return new jQuery.fn.init( selector, context, rootjQuery );
-       },
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+       location = window.location,
+       navigator = window.navigator,
 
        // Map over jQuery in case of overwrite
        _jQuery = window.jQuery,
@@ -33,63 +30,64 @@ var jQuery = function( selector, context ) {
        // Map over the $ in case of overwrite
        _$ = window.$,
 
-       // A central reference to the root jQuery(document)
-       rootjQuery,
+       // Save a reference to some core methods
+       core_push = Array.prototype.push,
+       core_slice = Array.prototype.slice,
+       core_indexOf = Array.prototype.indexOf,
+       core_toString = Object.prototype.toString,
+       core_hasOwn = Object.prototype.hasOwnProperty,
+       core_trim = String.prototype.trim,
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
 
-       // A simple way to check for HTML strings or ID strings
-       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-       quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+       // Used for matching numbers
+       core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
 
-       // Check if a string has a non-whitespace character in it
-       rnotwhite = /\S/,
+       // Used for detecting and trimming whitespace
+       core_rnotwhite = /\S/,
+       core_rspace = /\s+/,
 
-       // Used for trimming whitespace
-       trimLeft = /^\s+/,
-       trimRight = /\s+$/,
+       // IE doesn't match non-breaking spaces with \s
+       rtrim = core_rnotwhite.test("\xA0") ? (/^[\s\xA0]+|[\s\xA0]+$/g) : /^\s+|\s+$/g,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
 
        // Match a standalone tag
-       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
 
        // JSON RegExp
        rvalidchars = /^[\],:{}\s]*$/,
-       rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
-       rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
        rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
-       // Useragent RegExp
-       rwebkit = /(webkit)[ \/]([\w.]+)/,
-       ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
-       rmsie = /(msie) ([\w.]+)/,
-       rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
 
        // Matches dashed string for camelizing
-       rdashAlpha = /-([a-z]|[0-9])/ig,
        rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([\da-z])/gi,
 
        // Used by jQuery.camelCase as callback to replace()
        fcamelCase = function( all, letter ) {
                return ( letter + "" ).toUpperCase();
        },
 
-       // Keep a UserAgent string for use with jQuery.browser
-       userAgent = navigator.userAgent,
-
-       // For matching the engine and version of the browser
-       browserMatch,
-
-       // The deferred used on DOM ready
-       readyList,
-
-       // The ready event handler
-       DOMContentLoaded,
-
-       // Save a reference to some core methods
-       toString = Object.prototype.toString,
-       hasOwn = Object.prototype.hasOwnProperty,
-       push = Array.prototype.push,
-       slice = Array.prototype.slice,
-       trim = String.prototype.trim,
-       indexOf = Array.prototype.indexOf,
+       // The ready event handler and self cleanup method
+       DOMContentLoaded = function() {
+               if ( document.addEventListener ) {
+                       document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+                       jQuery.ready();
+               } else if ( document.readyState === "complete" ) {
+                       // we're here because readyState === "complete" in oldIE
+                       // which is good enough for us to call the dom ready!
+                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                       jQuery.ready();
+               }
+       },
 
        // [[Class]] -> type pairs
        class2type = {};
@@ -99,7 +97,7 @@ jQuery.fn = jQuery.prototype = {
        init: function( selector, context, rootjQuery ) {
                var match, elem, ret, doc;
 
-               // Handle $(""), $(null), or $(undefined)
+               // Handle $(""), $(null), $(undefined), $(false)
                if ( !selector ) {
                        return this;
                }
@@ -111,55 +109,33 @@ jQuery.fn = jQuery.prototype = {
                        return this;
                }
 
-               // The body element only exists once, optimize finding it
-               if ( selector === "body" && !context && document.body ) {
-                       this.context = document;
-                       this[0] = document.body;
-                       this.selector = selector;
-                       this.length = 1;
-                       return this;
-               }
-
                // Handle HTML strings
                if ( typeof selector === "string" ) {
-                       // Are we dealing with HTML string or an ID?
                        if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
                                // Assume that strings that start and end with <> are HTML and skip the regex check
                                match = [ null, selector, null ];
 
                        } else {
-                               match = quickExpr.exec( selector );
+                               match = rquickExpr.exec( selector );
                        }
 
-                       // Verify a match, and that no context was specified for #id
+                       // Match html or make sure no context is specified for #id
                        if ( match && (match[1] || !context) ) {
 
                                // HANDLE: $(html) -> $(array)
                                if ( match[1] ) {
                                        context = context instanceof jQuery ? context[0] : context;
-                                       doc = ( context ? context.ownerDocument || context : document );
-
-                                       // If a single string is passed in and it's a single tag
-                                       // just do a createElement and skip the rest
-                                       ret = rsingleTag.exec( selector );
-
-                                       if ( ret ) {
-                                               if ( jQuery.isPlainObject( context ) ) {
-                                                       selector = [ document.createElement( ret[1] ) ];
-                                                       jQuery.fn.attr.call( selector, context, true );
-
-                                               } else {
-                                                       selector = [ doc.createElement( ret[1] ) ];
-                                               }
+                                       doc = ( context && context.nodeType ? context.ownerDocument || context : document );
 
-                                       } else {
-                                               ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
-                                               selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+                                       // scripts is true for back-compat
+                                       selector = jQuery.parseHTML( match[1], doc, true );
+                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+                                               this.attr.call( selector, context, true );
                                        }
 
                                        return jQuery.merge( this, selector );
 
-                               // HANDLE: $("#id")
+                               // HANDLE: $(#id)
                                } else {
                                        elem = document.getElementById( match[2] );
 
@@ -210,7 +186,7 @@ jQuery.fn = jQuery.prototype = {
        selector: "",
 
        // The current version of jQuery being used
-       jquery: "1.7.2",
+       jquery: "1.8.0",
 
        // The default length of a jQuery object is 0
        length: 0,
@@ -221,7 +197,7 @@ jQuery.fn = jQuery.prototype = {
        },
 
        toArray: function() {
-               return slice.call( this, 0 );
+               return core_slice.call( this );
        },
 
        // Get the Nth element in the matched element set OR
@@ -239,15 +215,9 @@ jQuery.fn = jQuery.prototype = {
        // Take an array of elements and push it onto the stack
        // (returning the new matched element set)
        pushStack: function( elems, name, selector ) {
-               // Build a new jQuery matched element set
-               var ret = this.constructor();
 
-               if ( jQuery.isArray( elems ) ) {
-                       push.apply( ret, elems );
-
-               } else {
-                       jQuery.merge( ret, elems );
-               }
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
 
                // Add the old object onto the stack (as a reference)
                ret.prevObject = this;
@@ -272,11 +242,8 @@ jQuery.fn = jQuery.prototype = {
        },
 
        ready: function( fn ) {
-               // Attach the listeners
-               jQuery.bindReady();
-
                // Add the callback
-               readyList.add( fn );
+               jQuery.ready.promise().done( fn );
 
                return this;
        },
@@ -297,8 +264,8 @@ jQuery.fn = jQuery.prototype = {
        },
 
        slice: function() {
-               return this.pushStack( slice.apply( this, arguments ),
-                       "slice", slice.call(arguments).join(",") );
+               return this.pushStack( core_slice.apply( this, arguments ),
+                       "slice", core_slice.call(arguments).join(",") );
        },
 
        map: function( callback ) {
@@ -313,7 +280,7 @@ jQuery.fn = jQuery.prototype = {
 
        // For internal use only.
        // Behaves like an Array's method, not like a jQuery method.
-       push: push,
+       push: core_push,
        sort: [].sort,
        splice: [].splice
 };
@@ -416,73 +383,31 @@ jQuery.extend({
 
        // Handle when the DOM is ready
        ready: function( wait ) {
-               // Either a released hold or an DOMready/load event and not yet ready
-               if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
-                       // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-                       if ( !document.body ) {
-                               return setTimeout( jQuery.ready, 1 );
-                       }
-
-                       // Remember that the DOM is ready
-                       jQuery.isReady = true;
-
-                       // If a normal DOM Ready event fired, decrement, and wait if need be
-                       if ( wait !== true && --jQuery.readyWait > 0 ) {
-                               return;
-                       }
-
-                       // If there are functions bound, to execute
-                       readyList.fireWith( document, [ jQuery ] );
-
-                       // Trigger any bound ready events
-                       if ( jQuery.fn.trigger ) {
-                               jQuery( document ).trigger( "ready" ).off( "ready" );
-                       }
-               }
-       },
 
-       bindReady: function() {
-               if ( readyList ) {
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
                        return;
                }
 
-               readyList = jQuery.Callbacks( "once memory" );
-
-               // Catch cases where $(document).ready() is called after the
-               // browser event has already occurred.
-               if ( document.readyState === "complete" ) {
-                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( !document.body ) {
                        return setTimeout( jQuery.ready, 1 );
                }
 
-               // Mozilla, Opera and webkit nightlies currently support this event
-               if ( document.addEventListener ) {
-                       // Use the handy event callback
-                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
-                       // A fallback to window.onload, that will always work
-                       window.addEventListener( "load", jQuery.ready, false );
-
-               // If IE event model is used
-               } else if ( document.attachEvent ) {
-                       // ensure firing before onload,
-                       // maybe late but safe also for iframes
-                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
-                       // A fallback to window.onload, that will always work
-                       window.attachEvent( "onload", jQuery.ready );
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
 
-                       // If IE and not a frame
-                       // continually check to see if the document is ready
-                       var toplevel = false;
+               // If a normal DOM Ready event fired, decrement, and wait if need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
 
-                       try {
-                               toplevel = window.frameElement == null;
-                       } catch(e) {}
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
 
-                       if ( document.documentElement.doScroll && toplevel ) {
-                               doScrollCheck();
-                       }
+               // Trigger any bound ready events
+               if ( jQuery.fn.trigger ) {
+                       jQuery( document ).trigger("ready").off("ready");
                }
        },
 
@@ -508,7 +433,7 @@ jQuery.extend({
        type: function( obj ) {
                return obj == null ?
                        String( obj ) :
-                       class2type[ toString.call(obj) ] || "object";
+                       class2type[ core_toString.call(obj) ] || "object";
        },
 
        isPlainObject: function( obj ) {
@@ -522,8 +447,8 @@ jQuery.extend({
                try {
                        // Not own constructor property must be Object
                        if ( obj.constructor &&
-                               !hasOwn.call(obj, "constructor") &&
-                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               !core_hasOwn.call(obj, "constructor") &&
+                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
                                return false;
                        }
                } catch ( e ) {
@@ -537,11 +462,12 @@ jQuery.extend({
                var key;
                for ( key in obj ) {}
 
-               return key === undefined || hasOwn.call( obj, key );
+               return key === undefined || core_hasOwn.call( obj, key );
        },
 
        isEmptyObject: function( obj ) {
-               for ( var name in obj ) {
+               var name;
+               for ( name in obj ) {
                        return false;
                }
                return true;
@@ -551,8 +477,32 @@ jQuery.extend({
                throw new Error( msg );
        },
 
+       // data: string of html
+       // context (optional): If specified, the fragment will be created in this context, defaults to document
+       // scripts (optional): If true, will include scripts passed in the html string
+       parseHTML: function( data, context, scripts ) {
+               var parsed;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               if ( typeof context === "boolean" ) {
+                       scripts = context;
+                       context = 0;
+               }
+               context = context || document;
+
+               // Single tag
+               if ( (parsed = rsingleTag.exec( data )) ) {
+                       return [ context.createElement( parsed[1] ) ];
+               }
+
+               parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+               return jQuery.merge( [],
+                       (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+       },
+
        parseJSON: function( data ) {
-               if ( typeof data !== "string" || !data ) {
+               if ( !data || typeof data !== "string") {
                        return null;
                }
 
@@ -578,10 +528,10 @@ jQuery.extend({
 
        // Cross-browser xml parsing
        parseXML: function( data ) {
-               if ( typeof data !== "string" || !data ) {
+               var xml, tmp;
+               if ( !data || typeof data !== "string" ) {
                        return null;
                }
-               var xml, tmp;
                try {
                        if ( window.DOMParser ) { // Standard
                                tmp = new DOMParser();
@@ -606,7 +556,7 @@ jQuery.extend({
        // Workarounds based on findings by Jim Driscoll
        // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
        globalEval: function( data ) {
-               if ( data && rnotwhite.test( data ) ) {
+               if ( data && core_rnotwhite.test( data ) ) {
                        // We use execScript on Internet Explorer
                        // We use an anonymous function so that context is window
                        // rather than jQuery in Firefox
@@ -627,21 +577,22 @@ jQuery.extend({
        },
 
        // args is for internal usage only
-       each: function( object, callback, args ) {
-               var name, i = 0,
-                       length = object.length,
-                       isObj = length === undefined || jQuery.isFunction( object );
+       each: function( obj, callback, args ) {
+               var name,
+                       i = 0,
+                       length = obj.length,
+                       isObj = length === undefined || jQuery.isFunction( obj );
 
                if ( args ) {
                        if ( isObj ) {
-                               for ( name in object ) {
-                                       if ( callback.apply( object[ name ], args ) === false ) {
+                               for ( name in obj ) {
+                                       if ( callback.apply( obj[ name ], args ) === false ) {
                                                break;
                                        }
                                }
                        } else {
                                for ( ; i < length; ) {
-                                       if ( callback.apply( object[ i++ ], args ) === false ) {
+                                       if ( callback.apply( obj[ i++ ], args ) === false ) {
                                                break;
                                        }
                                }
@@ -650,71 +601,72 @@ jQuery.extend({
                // A special, fast, case for the most common use of each
                } else {
                        if ( isObj ) {
-                               for ( name in object ) {
-                                       if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+                               for ( name in obj ) {
+                                       if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
                                                break;
                                        }
                                }
                        } else {
                                for ( ; i < length; ) {
-                                       if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+                                       if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
                                                break;
                                        }
                                }
                        }
                }
 
-               return object;
+               return obj;
        },
 
        // Use native String.trim function wherever possible
-       trim: trim ?
+       trim: core_trim ?
                function( text ) {
                        return text == null ?
                                "" :
-                               trim.call( text );
+                               core_trim.call( text );
                } :
 
                // Otherwise use our own trimming functionality
                function( text ) {
                        return text == null ?
                                "" :
-                               text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+                               text.toString().replace( rtrim, "" );
                },
 
        // results is for internal usage only
-       makeArray: function( array, results ) {
-               var ret = results || [];
+       makeArray: function( arr, results ) {
+               var type,
+                       ret = results || [];
 
-               if ( array != null ) {
+               if ( arr != null ) {
                        // The window, strings (and functions) also have 'length'
                        // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-                       var type = jQuery.type( array );
+                       type = jQuery.type( arr );
 
-                       if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
-                               push.call( ret, array );
+                       if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+                               core_push.call( ret, arr );
                        } else {
-                               jQuery.merge( ret, array );
+                               jQuery.merge( ret, arr );
                        }
                }
 
                return ret;
        },
 
-       inArray: function( elem, array, i ) {
+       inArray: function( elem, arr, i ) {
                var len;
 
-               if ( array ) {
-                       if ( indexOf ) {
-                               return indexOf.call( array, elem, i );
+               if ( arr ) {
+                       if ( core_indexOf ) {
+                               return core_indexOf.call( arr, elem, i );
                        }
 
-                       len = array.length;
+                       len = arr.length;
                        i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
 
                        for ( ; i < len; i++ ) {
                                // Skip accessing in sparse arrays
-                               if ( i in array && array[ i ] === elem ) {
+                               if ( i in arr && arr[ i ] === elem ) {
                                        return i;
                                }
                        }
@@ -724,11 +676,12 @@ jQuery.extend({
        },
 
        merge: function( first, second ) {
-               var i = first.length,
+               var l = second.length,
+                       i = first.length,
                        j = 0;
 
-               if ( typeof second.length === "number" ) {
-                       for ( var l = second.length; j < l; j++ ) {
+               if ( typeof l === "number" ) {
+                       for ( ; j < l; j++ ) {
                                first[ i++ ] = second[ j ];
                        }
 
@@ -744,12 +697,15 @@ jQuery.extend({
        },
 
        grep: function( elems, callback, inv ) {
-               var ret = [], retVal;
+               var retVal,
+                       ret = [],
+                       i = 0,
+                       length = elems.length;
                inv = !!inv;
 
                // Go through the array, only saving the items
                // that pass the validator function
-               for ( var i = 0, length = elems.length; i < length; i++ ) {
+               for ( ; i < length; i++ ) {
                        retVal = !!callback( elems[ i ], i );
                        if ( inv !== retVal ) {
                                ret.push( elems[ i ] );
@@ -761,7 +717,8 @@ jQuery.extend({
 
        // arg is for internal usage only
        map: function( elems, callback, arg ) {
-               var value, key, ret = [],
+               var value, key,
+                       ret = [],
                        i = 0,
                        length = elems.length,
                        // jquery objects are treated as arrays
@@ -798,8 +755,10 @@ jQuery.extend({
        // Bind a function to a context, optionally partially applying any
        // arguments.
        proxy: function( fn, context ) {
+               var tmp, args, proxy;
+
                if ( typeof context === "string" ) {
-                       var tmp = fn[ context ];
+                       tmp = fn[ context ];
                        context = fn;
                        fn = tmp;
                }
@@ -811,10 +770,10 @@ jQuery.extend({
                }
 
                // Simulated bind
-               var args = slice.call( arguments, 2 ),
-                       proxy = function() {
-                               return fn.apply( context, args.concat( slice.call( arguments ) ) );
-                       };
+               args = core_slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+               };
 
                // Set the guid of unique handler to the same of original handler, so it can be removed
                proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
@@ -822,7 +781,7 @@ jQuery.extend({
                return proxy;
        },
 
-       // Mutifunctional method to get and set values to a collection
+       // Multifunctional method to get and set values of a collection
        // The value/s can optionally be executed if it's a function
        access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
                var exec,
@@ -877,136 +836,95 @@ jQuery.extend({
 
        now: function() {
                return ( new Date() ).getTime();
-       },
-
-       // Use of jQuery.browser is frowned upon.
-       // More details: http://docs.jquery.com/Utilities/jQuery.browser
-       uaMatch: function( ua ) {
-               ua = ua.toLowerCase();
+       }
+});
 
-               var match = rwebkit.exec( ua ) ||
-                       ropera.exec( ua ) ||
-                       rmsie.exec( ua ) ||
-                       ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
-                       [];
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
 
-               return { browser: match[1] || "", version: match[2] || "0" };
-       },
+               readyList = jQuery.Deferred();
 
-       sub: function() {
-               function jQuerySub( selector, context ) {
-                       return new jQuerySub.fn.init( selector, context );
-               }
-               jQuery.extend( true, jQuerySub, this );
-               jQuerySub.superclass = this;
-               jQuerySub.fn = jQuerySub.prototype = this();
-               jQuerySub.fn.constructor = jQuerySub;
-               jQuerySub.sub = this.sub;
-               jQuerySub.fn.init = function init( selector, context ) {
-                       if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
-                               context = jQuerySub( context );
-                       }
+               // Catch cases where $(document).ready() is called after the
+               // browser event has already occurred.
+               if ( document.readyState === "complete" || ( document.readyState !== "loading" && document.addEventListener ) ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       setTimeout( jQuery.ready, 1 );
 
-                       return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-               };
-               jQuerySub.fn.init.prototype = jQuerySub.fn;
-               var rootjQuerySub = jQuerySub(document);
-               return jQuerySub;
-       },
+               // Standards-based browsers support DOMContentLoaded
+               } else if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
 
-       browser: {}
-});
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", jQuery.ready, false );
 
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-       class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
+               // If IE event model is used
+               } else {
+                       // Ensure firing before onload, maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
 
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
-       jQuery.browser[ browserMatch.browser ] = true;
-       jQuery.browser.version = browserMatch.version;
-}
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", jQuery.ready );
 
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
-       jQuery.browser.safari = true;
-}
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var top = false;
 
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
-       trimLeft = /^[\s\xA0]+/;
-       trimRight = /[\s\xA0]+$/;
-}
+                       try {
+                               top = window.frameElement == null && document.documentElement;
+                       } catch(e) {}
 
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
+                       if ( top && top.doScroll ) {
+                               (function doScrollCheck() {
+                                       if ( !jQuery.isReady ) {
 
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
-       DOMContentLoaded = function() {
-               document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-               jQuery.ready();
-       };
+                                               try {
+                                                       // Use the trick by Diego Perini
+                                                       // http://javascript.nwbox.com/IEContentLoaded/
+                                                       top.doScroll("left");
+                                               } catch(e) {
+                                                       return setTimeout( doScrollCheck, 50 );
+                                               }
 
-} else if ( document.attachEvent ) {
-       DOMContentLoaded = function() {
-               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-               if ( document.readyState === "complete" ) {
-                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
-                       jQuery.ready();
+                                               // and execute any waiting functions
+                                               jQuery.ready();
+                                       }
+                               })();
+                       }
                }
-       };
-}
-
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
-       if ( jQuery.isReady ) {
-               return;
-       }
-
-       try {
-               // If IE is used, use the trick by Diego Perini
-               // http://javascript.nwbox.com/IEContentLoaded/
-               document.documentElement.doScroll("left");
-       } catch(e) {
-               setTimeout( doScrollCheck, 1 );
-               return;
        }
+       return readyList.promise( obj );
+};
 
-       // and execute any waiting functions
-       jQuery.ready();
-}
-
-return jQuery;
-
-})();
-
-
-// String to Object flags format cache
-var flagsCache = {};
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
 
-// Convert String-formatted flags into Object-formatted ones and store in cache
-function createFlags( flags ) {
-       var object = flagsCache[ flags ] = {},
-               i, length;
-       flags = flags.split( /\s+/ );
-       for ( i = 0, length = flags.length; i < length; i++ ) {
-               object[ flags[i] ] = true;
-       }
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+       var object = optionsCache[ options ] = {};
+       jQuery.each( options.split( core_rspace ), function( _, flag ) {
+               object[ flag ] = true;
+       });
        return object;
 }
 
 /*
  * Create a callback list using the following parameters:
  *
- *     flags:  an optional list of space-separated flags that will change how
- *                     the callback list behaves
+ *     options: an optional list of space-separated options that will change how
+ *                     the callback list behaves or a more traditional option object
  *
  * By default a callback list will act like an event callback list and can be
  * "fired" multiple times.
  *
- * Possible flags:
+ * Possible options:
  *
  *     once:                   will ensure the callback list can only be fired once (like a Deferred)
  *
@@ -1019,17 +937,15 @@ function createFlags( flags ) {
  *     stopOnFalse:    interrupt callings when a callback returns false
  *
  */
-jQuery.Callbacks = function( flags ) {
+jQuery.Callbacks = function( options ) {
 
-       // Convert flags from String-formatted to Object-formatted
+       // Convert options from String-formatted to Object-formatted if needed
        // (we check in cache first)
-       flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+       options = typeof options === "string" ?
+               ( optionsCache[ options ] || createOptions( options ) ) :
+               jQuery.extend( {}, options );
 
-       var // Actual callback list
-               list = [],
-               // Stack of fire calls for repeatable lists
-               stack = [],
-               // Last fire value (for non-forgettable lists)
+       var // Last fire value (for non-forgettable lists)
                memory,
                // Flag to know if list was already fired
                fired,
@@ -1041,53 +957,34 @@ jQuery.Callbacks = function( flags ) {
                firingLength,
                // Index of currently firing callback (modified by remove if needed)
                firingIndex,
-               // Add one or several callbacks to the list
-               add = function( args ) {
-                       var i,
-                               length,
-                               elem,
-                               type,
-                               actual;
-                       for ( i = 0, length = args.length; i < length; i++ ) {
-                               elem = args[ i ];
-                               type = jQuery.type( elem );
-                               if ( type === "array" ) {
-                                       // Inspect recursively
-                                       add( elem );
-                               } else if ( type === "function" ) {
-                                       // Add if not in unique mode and callback is not in
-                                       if ( !flags.unique || !self.has( elem ) ) {
-                                               list.push( elem );
-                                       }
-                               }
-                       }
-               },
+               // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = !options.once && [],
                // Fire callbacks
-               fire = function( context, args ) {
-                       args = args || [];
-                       memory = !flags.memory || [ context, args ];
+               fire = function( data ) {
+                       memory = options.memory && data;
                        fired = true;
-                       firing = true;
                        firingIndex = firingStart || 0;
                        firingStart = 0;
                        firingLength = list.length;
+                       firing = true;
                        for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-                               if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
-                                       memory = true; // Mark as halted
+                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+                                       memory = false; // To prevent further calls using add
                                        break;
                                }
                        }
                        firing = false;
                        if ( list ) {
-                               if ( !flags.once ) {
-                                       if ( stack && stack.length ) {
-                                               memory = stack.shift();
-                                               self.fireWith( memory[ 0 ], memory[ 1 ] );
+                               if ( stack ) {
+                                       if ( stack.length ) {
+                                               fire( stack.shift() );
                                        }
-                               } else if ( memory === true ) {
-                                       self.disable();
-                               } else {
+                               } else if ( memory ) {
                                        list = [];
+                               } else {
+                                       self.disable();
                                }
                        }
                },
@@ -1096,18 +993,27 @@ jQuery.Callbacks = function( flags ) {
                        // Add a callback or a collection of callbacks to the list
                        add: function() {
                                if ( list ) {
-                                       var length = list.length;
-                                       add( arguments );
+                                       // First, we save the current length
+                                       var start = list.length;
+                                       (function add( args ) {
+                                               jQuery.each( args, function( _, arg ) {
+                                                       if ( jQuery.isFunction( arg ) && ( !options.unique || !self.has( arg ) ) ) {
+                                                               list.push( arg );
+                                                       } else if ( arg && arg.length ) {
+                                                               // Inspect recursively
+                                                               add( arg );
+                                                       }
+                                               });
+                                       })( arguments );
                                        // Do we need to add the callbacks to the
                                        // current firing batch?
                                        if ( firing ) {
                                                firingLength = list.length;
                                        // With memory, if we're not firing then
-                                       // we should call right away, unless previous
-                                       // firing was halted (stopOnFalse)
-                                       } else if ( memory && memory !== true ) {
-                                               firingStart = length;
-                                               fire( memory[ 0 ], memory[ 1 ] );
+                                       // we should call right away
+                                       } else if ( memory ) {
+                                               firingStart = start;
+                                               fire( memory );
                                        }
                                }
                                return this;
@@ -1115,46 +1021,27 @@ jQuery.Callbacks = function( flags ) {
                        // Remove a callback from the list
                        remove: function() {
                                if ( list ) {
-                                       var args = arguments,
-                                               argIndex = 0,
-                                               argLength = args.length;
-                                       for ( ; argIndex < argLength ; argIndex++ ) {
-                                               for ( var i = 0; i < list.length; i++ ) {
-                                                       if ( args[ argIndex ] === list[ i ] ) {
-                                                               // Handle firingIndex and firingLength
-                                                               if ( firing ) {
-                                                                       if ( i <= firingLength ) {
-                                                                               firingLength--;
-                                                                               if ( i <= firingIndex ) {
-                                                                                       firingIndex--;
-                                                                               }
-                                                                       }
+                                       jQuery.each( arguments, function( _, arg ) {
+                                               var index;
+                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                                       list.splice( index, 1 );
+                                                       // Handle firing indexes
+                                                       if ( firing ) {
+                                                               if ( index <= firingLength ) {
+                                                                       firingLength--;
                                                                }
-                                                               // Remove the element
-                                                               list.splice( i--, 1 );
-                                                               // If we have some unicity property then
-                                                               // we only need to do this once
-                                                               if ( flags.unique ) {
-                                                                       break;
+                                                               if ( index <= firingIndex ) {
+                                                                       firingIndex--;
                                                                }
                                                        }
                                                }
-                                       }
+                                       });
                                }
                                return this;
                        },
                        // Control if a given callback is in the list
                        has: function( fn ) {
-                               if ( list ) {
-                                       var i = 0,
-                                               length = list.length;
-                                       for ( ; i < length; i++ ) {
-                                               if ( fn === list[ i ] ) {
-                                                       return true;
-                                               }
-                                       }
-                               }
-                               return false;
+                               return jQuery.inArray( fn, list ) > -1;
                        },
                        // Remove all callbacks from the list
                        empty: function() {
@@ -1173,7 +1060,7 @@ jQuery.Callbacks = function( flags ) {
                        // Lock the list in its current state
                        lock: function() {
                                stack = undefined;
-                               if ( !memory || memory === true ) {
+                               if ( !memory ) {
                                        self.disable();
                                }
                                return this;
@@ -1184,13 +1071,13 @@ jQuery.Callbacks = function( flags ) {
                        },
                        // Call all callbacks with the given context and arguments
                        fireWith: function( context, args ) {
-                               if ( stack ) {
+                               args = args || [];
+                               args = [ context, args.slice ? args.slice() : args ];
+                               if ( list && ( !fired || stack ) ) {
                                        if ( firing ) {
-                                               if ( !flags.once ) {
-                                                       stack.push( [ context, args ] );
-                                               }
-                                       } else if ( !( flags.once && memory ) ) {
-                                               fire( context, args );
+                                               stack.push( args );
+                                       } else {
+                                               fire( args );
                                        }
                                }
                                return this;
@@ -1208,98 +1095,85 @@ jQuery.Callbacks = function( flags ) {
 
        return self;
 };
-
-
-
-
-var // Static reference to slice
-       sliceDeferred = [].slice;
-
 jQuery.extend({
 
        Deferred: function( func ) {
-               var doneList = jQuery.Callbacks( "once memory" ),
-                       failList = jQuery.Callbacks( "once memory" ),
-                       progressList = jQuery.Callbacks( "memory" ),
+               var tuples = [
+                               // action, add listener, listener list, final state
+                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+                               [ "notify", "progress", jQuery.Callbacks("memory") ]
+                       ],
                        state = "pending",
-                       lists = {
-                               resolve: doneList,
-                               reject: failList,
-                               notify: progressList
-                       },
                        promise = {
-                               done: doneList.add,
-                               fail: failList.add,
-                               progress: progressList.add,
-
                                state: function() {
                                        return state;
                                },
-
-                               // Deprecated
-                               isResolved: doneList.fired,
-                               isRejected: failList.fired,
-
-                               then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
-                                       deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
-                                       return this;
-                               },
                                always: function() {
-                                       deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+                                       deferred.done( arguments ).fail( arguments );
                                        return this;
                                },
-                               pipe: function( fnDone, fnFail, fnProgress ) {
+                               then: function( /* fnDone, fnFail, fnProgress */ ) {
+                                       var fns = arguments;
                                        return jQuery.Deferred(function( newDefer ) {
-                                               jQuery.each( {
-                                                       done: [ fnDone, "resolve" ],
-                                                       fail: [ fnFail, "reject" ],
-                                                       progress: [ fnProgress, "notify" ]
-                                               }, function( handler, data ) {
-                                                       var fn = data[ 0 ],
-                                                               action = data[ 1 ],
-                                                               returned;
-                                                       if ( jQuery.isFunction( fn ) ) {
-                                                               deferred[ handler ](function() {
-                                                                       returned = fn.apply( this, arguments );
+                                               jQuery.each( tuples, function( i, tuple ) {
+                                                       var action = tuple[ 0 ],
+                                                               fn = fns[ i ];
+                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
+                                                       deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+                                                               function() {
+                                                                       var returned = fn.apply( this, arguments );
                                                                        if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                                                               returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+                                                                               returned.promise()
+                                                                                       .done( newDefer.resolve )
+                                                                                       .fail( newDefer.reject )
+                                                                                       .progress( newDefer.notify );
                                                                        } else {
                                                                                newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
                                                                        }
-                                                               });
-                                                       } else {
-                                                               deferred[ handler ]( newDefer[ action ] );
-                                                       }
+                                                               } :
+                                                               newDefer[ action ]
+                                                       );
                                                });
+                                               fns = null;
                                        }).promise();
                                },
                                // Get a promise for this deferred
                                // If obj is provided, the promise aspect is added to the object
                                promise: function( obj ) {
-                                       if ( obj == null ) {
-                                               obj = promise;
-                                       } else {
-                                               for ( var key in promise ) {
-                                                       obj[ key ] = promise[ key ];
-                                               }
-                                       }
-                                       return obj;
+                                       return typeof obj === "object" ? jQuery.extend( obj, promise ) : promise;
                                }
                        },
-                       deferred = promise.promise({}),
-                       key;
+                       deferred = {};
 
-               for ( key in lists ) {
-                       deferred[ key ] = lists[ key ].fire;
-                       deferred[ key + "With" ] = lists[ key ].fireWith;
-               }
+               // Keep pipe for back-compat
+               promise.pipe = promise.then;
+
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 3 ];
+
+                       // promise[ done | fail | progress ] = list.add
+                       promise[ tuple[1] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(function() {
+                                       // state = [ resolved | rejected ]
+                                       state = stateString;
 
-               // Handle state
-               deferred.done( function() {
-                       state = "resolved";
-               }, failList.disable, progressList.lock ).fail( function() {
-                       state = "rejected";
-               }, doneList.disable, progressList.lock );
+                               // [ reject_list | resolve_list ].disable; progress_list.lock
+                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       }
+
+                       // deferred[ resolve | reject | notify ] = list.fire
+                       deferred[ tuple[0] ] = list.fire;
+                       deferred[ tuple[0] + "With" ] = list.fireWith;
+               });
+
+               // Make the deferred a promise
+               promise.promise( deferred );
 
                // Call given func if any
                if ( func ) {
@@ -1311,52 +1185,57 @@ jQuery.extend({
        },
 
        // Deferred helper
-       when: function( firstParam ) {
-               var args = sliceDeferred.call( arguments, 0 ),
-                       i = 0,
-                       length = args.length,
-                       pValues = new Array( length ),
-                       count = length,
-                       pCount = length,
-                       deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
-                               firstParam :
-                               jQuery.Deferred(),
-                       promise = deferred.promise();
-               function resolveFunc( i ) {
-                       return function( value ) {
-                               args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
-                               if ( !( --count ) ) {
-                                       deferred.resolveWith( deferred, args );
-                               }
-                       };
-               }
-               function progressFunc( i ) {
-                       return function( value ) {
-                               pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
-                               deferred.notifyWith( promise, pValues );
-                       };
-               }
+       when: function( subordinate /* , ..., subordinateN */ ) {
+               var i = 0,
+                       resolveValues = core_slice.call( arguments ),
+                       length = resolveValues.length,
+
+                       // the count of uncompleted subordinates
+                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+                       // Update function for both resolve and progress values
+                       updateFunc = function( i, contexts, values ) {
+                               return function( value ) {
+                                       contexts[ i ] = this;
+                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+                                       if( values === progressValues ) {
+                                               deferred.notifyWith( contexts, values );
+                                       } else if ( !( --remaining ) ) {
+                                               deferred.resolveWith( contexts, values );
+                                       }
+                               };
+                       },
+
+                       progressValues, progressContexts, resolveContexts;
+
+               // add listeners to Deferred subordinates; treat others as resolved
                if ( length > 1 ) {
+                       progressValues = new Array( length );
+                       progressContexts = new Array( length );
+                       resolveContexts = new Array( length );
                        for ( ; i < length; i++ ) {
-                               if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
-                                       args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+                                       resolveValues[ i ].promise()
+                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
+                                               .fail( deferred.reject )
+                                               .progress( updateFunc( i, progressContexts, progressValues ) );
                                } else {
-                                       --count;
+                                       --remaining;
                                }
                        }
-                       if ( !count ) {
-                               deferred.resolveWith( deferred, args );
-                       }
-               } else if ( deferred !== firstParam ) {
-                       deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
                }
-               return promise;
-       }
-});
-
-
 
+               // if we're not waiting on anything, resolve the master
+               if ( !remaining ) {
+                       deferred.resolveWith( resolveContexts, resolveValues );
+               }
 
+               return deferred.promise();
+       }
+});
 jQuery.support = (function() {
 
        var support,
@@ -1366,20 +1245,19 @@ jQuery.support = (function() {
                opt,
                input,
                fragment,
-               tds,
-               events,
                eventName,
                i,
                isSupported,
-               div = document.createElement( "div" ),
-               documentElement = document.documentElement;
+               clickFn,
+               div = document.createElement("div");
 
        // Preliminary tests
-       div.setAttribute("className", "t");
-       div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+       div.setAttribute( "className", "t" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
 
-       all = div.getElementsByTagName( "*" );
-       a = div.getElementsByTagName( "a" )[ 0 ];
+       all = div.getElementsByTagName("*");
+       a = div.getElementsByTagName("a")[ 0 ];
+       a.style.cssText = "top:1px;float:left;opacity:.5";
 
        // Can't get basic test support
        if ( !all || !all.length || !a ) {
@@ -1387,9 +1265,9 @@ jQuery.support = (function() {
        }
 
        // First batch of supports tests
-       select = document.createElement( "select" );
+       select = document.createElement("select");
        opt = select.appendChild( document.createElement("option") );
-       input = div.getElementsByTagName( "input" )[ 0 ];
+       input = div.getElementsByTagName("input")[ 0 ];
 
        support = {
                // IE strips leading whitespace when .innerHTML is used
@@ -1414,7 +1292,7 @@ jQuery.support = (function() {
                // Make sure that element opacity exists
                // (IE uses filter instead)
                // Use a regex to work around a WebKit issue. See #5145
-               opacity: /^0.55/.test( a.style.opacity ),
+               opacity: /^0.5/.test( a.style.opacity ),
 
                // Verify style float existence
                // (IE uses styleFloat instead of cssFloat)
@@ -1439,6 +1317,9 @@ jQuery.support = (function() {
                // Where outerHTML is undefined, this still works
                html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
 
+               // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+               boxModel: ( document.compatMode === "CSS1Compat" ),
+
                // Will be defined later
                submitBubbles: true,
                changeBubbles: true,
@@ -1448,12 +1329,10 @@ jQuery.support = (function() {
                inlineBlockNeedsLayout: false,
                shrinkWrapBlocks: false,
                reliableMarginRight: true,
-               pixelMargin: true
+               boxSizingReliable: true,
+               pixelPosition: false
        };
 
-       // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
-       jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
-
        // Make sure checked status is properly cloned
        input.checked = true;
        support.noCloneChecked = input.cloneNode( true ).checked;
@@ -1472,22 +1351,23 @@ jQuery.support = (function() {
        }
 
        if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-               div.attachEvent( "onclick", function() {
+               div.attachEvent( "onclick", clickFn = function() {
                        // Cloning a node shouldn't copy over any
                        // bound event handlers (IE does this)
                        support.noCloneEvent = false;
                });
-               div.cloneNode( true ).fireEvent( "onclick" );
+               div.cloneNode( true ).fireEvent("onclick");
+               div.detachEvent( "onclick", clickFn );
        }
 
        // Check if a radio maintains its value
        // after being appended to the DOM
        input = document.createElement("input");
        input.value = "t";
-       input.setAttribute("type", "radio");
+       input.setAttribute( "type", "radio" );
        support.radioValue = input.value === "t";
 
-       input.setAttribute("checked", "checked");
+       input.setAttribute( "checked", "checked" );
 
        // #11217 - WebKit loses check when the name is after the checked attribute
        input.setAttribute( "name", "t" );
@@ -1514,9 +1394,9 @@ jQuery.support = (function() {
        // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
        if ( div.attachEvent ) {
                for ( i in {
-                       submit: 1,
-                       change: 1,
-                       focusin: 1
+                       submit: true,
+                       change: true,
+                       focusin: true
                }) {
                        eventName = "on" + i;
                        isSupported = ( eventName in div );
@@ -1528,16 +1408,10 @@ jQuery.support = (function() {
                }
        }
 
-       fragment.removeChild( div );
-
-       // Null elements to avoid leaks in IE
-       fragment = select = opt = div = input = null;
-
        // Run tests that need a body at doc ready
        jQuery(function() {
-               var container, outer, inner, table, td, offsetSupport,
-                       marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
-                       paddingMarginBorderVisibility, paddingMarginBorder,
+               var container, div, tds, marginDiv,
+                       divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
                        body = document.getElementsByTagName("body")[0];
 
                if ( !body ) {
@@ -1545,17 +1419,8 @@ jQuery.support = (function() {
                        return;
                }
 
-               conMarginTop = 1;
-               paddingMarginBorder = "padding:0;margin:0;border:";
-               positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
-               paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
-               style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
-               html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
-                       "<table " + style + "' cellpadding='0' cellspacing='0'>" +
-                       "<tr><td></td></tr></table>";
-
                container = document.createElement("div");
-               container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+               container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
                body.insertBefore( container, body.firstChild );
 
                // Construct the test element
@@ -1569,8 +1434,9 @@ jQuery.support = (function() {
                // display:none (it is still safe to use offsets if a parent element is
                // hidden; don safety goggles and see bug #4512 for more information).
                // (only IE 8 fails this test)
-               div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
-               tds = div.getElementsByTagName( "td" );
+               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+               tds = div.getElementsByTagName("td");
+               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
                isSupported = ( tds[ 0 ].offsetHeight === 0 );
 
                tds[ 0 ].style.display = "";
@@ -1580,20 +1446,32 @@ jQuery.support = (function() {
                // (IE <= 8 fail this test)
                support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
 
-               // Check if div with explicit width and no margin-right incorrectly
-               // gets computed margin-right based on width of container. For more
-               // info see bug #3333
-               // Fails in WebKit before Feb 2011 nightlies
-               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+               // Check box-sizing and margin behavior
+               div.innerHTML = "";
+               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+               support.boxSizing = ( div.offsetWidth === 4 );
+               support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+               // NOTE: To any future maintainer, window.getComputedStyle was used here
+               // instead of getComputedStyle because it gave a better gzip size.
+               // The difference between window.getComputedStyle and getComputedStyle is
+               // 7 bytes
                if ( window.getComputedStyle ) {
-                       div.innerHTML = "";
-                       marginDiv = document.createElement( "div" );
-                       marginDiv.style.width = "0";
-                       marginDiv.style.marginRight = "0";
-                       div.style.width = "2px";
+                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+                       // Check if div with explicit width and no margin-right incorrectly
+                       // gets computed margin-right based on width of container. For more
+                       // info see bug #3333
+                       // Fails in WebKit before Feb 2011 nightlies
+                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                       marginDiv = document.createElement("div");
+                       marginDiv.style.cssText = div.style.cssText = divReset;
+                       marginDiv.style.marginRight = marginDiv.style.width = "0";
+                       div.style.width = "1px";
                        div.appendChild( marginDiv );
                        support.reliableMarginRight =
-                               ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
                }
 
                if ( typeof div.style.zoom !== "undefined" ) {
@@ -1602,73 +1480,39 @@ jQuery.support = (function() {
                        // them layout
                        // (IE < 8 does this)
                        div.innerHTML = "";
-                       div.style.width = div.style.padding = "1px";
-                       div.style.border = 0;
-                       div.style.overflow = "hidden";
-                       div.style.display = "inline";
-                       div.style.zoom = 1;
+                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
                        support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
 
                        // Check if elements with layout shrink-wrap their children
                        // (IE 6 does this)
                        div.style.display = "block";
                        div.style.overflow = "visible";
-                       div.innerHTML = "<div style='width:5px;'></div>";
+                       div.innerHTML = "<div></div>";
+                       div.firstChild.style.width = "5px";
                        support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-               }
-
-               div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
-               div.innerHTML = html;
-
-               outer = div.firstChild;
-               inner = outer.firstChild;
-               td = outer.nextSibling.firstChild.firstChild;
-
-               offsetSupport = {
-                       doesNotAddBorder: ( inner.offsetTop !== 5 ),
-                       doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
-               };
 
-               inner.style.position = "fixed";
-               inner.style.top = "20px";
-
-               // safari subtracts parent border width here which is 5px
-               offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
-               inner.style.position = inner.style.top = "";
-
-               outer.style.overflow = "hidden";
-               outer.style.position = "relative";
-
-               offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
-               offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
-
-               if ( window.getComputedStyle ) {
-                       div.style.marginTop = "1%";
-                       support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
-               }
-
-               if ( typeof container.style.zoom !== "undefined" ) {
                        container.style.zoom = 1;
                }
 
+               // Null elements to avoid leaks in IE
                body.removeChild( container );
-               marginDiv = div = container = null;
-
-               jQuery.extend( support, offsetSupport );
+               container = div = tds = marginDiv = null;
        });
 
+       // Null elements to avoid leaks in IE
+       fragment.removeChild( div );
+       all = a = select = opt = input = fragment = div = null;
+
        return support;
 })();
-
-
-
-
 var rbrace = /^(?:\{.*\}|\[.*\])$/,
        rmultiDash = /([A-Z])/g;
 
 jQuery.extend({
        cache: {},
 
+       deletedIds: [],
+
        // Please use with caution
        uuid: 0,
 
@@ -1695,7 +1539,7 @@ jQuery.extend({
                        return;
                }
 
-               var privateCache, thisCache, ret,
+               var thisCache, ret,
                        internalKey = jQuery.expando,
                        getByName = typeof name === "string",
 
@@ -1709,12 +1553,11 @@ jQuery.extend({
 
                        // Only defining an ID for JS objects if its cache already exists allows
                        // the code to shortcut on the same path as a DOM node with no cache
-                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
-                       isEvents = name === "events";
+                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
 
                // Avoid doing any more work than we need to when trying to get data on an
                // object that has no data at all
-               if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+               if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
                        return;
                }
 
@@ -1722,7 +1565,7 @@ jQuery.extend({
                        // Only DOM nodes need a new unique ID for each element since their data
                        // ends up in the global cache
                        if ( isNode ) {
-                               elem[ internalKey ] = id = ++jQuery.uuid;
+                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;
                        } else {
                                id = internalKey;
                        }
@@ -1748,7 +1591,7 @@ jQuery.extend({
                        }
                }
 
-               privateCache = thisCache = cache[ id ];
+               thisCache = cache[ id ];
 
                // jQuery data() is stored in a separate object inside the object's internal data
                // cache in order to avoid key collisions between internal data and user-defined
@@ -1765,12 +1608,6 @@ jQuery.extend({
                        thisCache[ jQuery.camelCase( name ) ] = data;
                }
 
-               // Users should not attempt to inspect the internal events object using jQuery.data,
-               // it is undocumented and subject to change. But does anyone listen? No.
-               if ( isEvents && !thisCache[ name ] ) {
-                       return privateCache.events;
-               }
-
                // Check for both converted-to-camel and non-converted data property names
                // If a data property was specified
                if ( getByName ) {
@@ -1798,16 +1635,11 @@ jQuery.extend({
 
                var thisCache, i, l,
 
-                       // Reference to internal data cache key
-                       internalKey = jQuery.expando,
-
                        isNode = elem.nodeType,
 
                        // See jQuery.data for more information
                        cache = isNode ? jQuery.cache : elem,
-
-                       // See jQuery.data for more information
-                       id = isNode ? elem[ internalKey ] : internalKey;
+                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
 
                // If there is already no cache entry for this object, there is no
                // purpose in continuing
@@ -1834,7 +1666,7 @@ jQuery.extend({
                                                if ( name in thisCache ) {
                                                        name = [ name ];
                                                } else {
-                                                       name = name.split( " " );
+                                                       name = name.split(" ");
                                                }
                                        }
                                }
@@ -1857,35 +1689,23 @@ jQuery.extend({
 
                        // Don't destroy the parent cache unless the internal data object
                        // had been the only thing left in it
-                       if ( !isEmptyDataObject(cache[ id ]) ) {
+                       if ( !isEmptyDataObject( cache[ id ] ) ) {
                                return;
                        }
                }
 
-               // Browsers that fail expando deletion also refuse to delete expandos on
-               // the window, but it will allow it on all other JS objects; other browsers
-               // don't care
-               // Ensure that `cache` is not a window object #10080
-               if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+               // Destroy the cache
+               if ( isNode ) {
+                       jQuery.cleanData( [ elem ], true );
+
+               // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+               } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
                        delete cache[ id ];
+
+               // When all else fails, null
                } else {
                        cache[ id ] = null;
                }
-
-               // We destroyed the cache and need to eliminate the expando on the node to avoid
-               // false lookups in the cache for entries that no longer exist
-               if ( isNode ) {
-                       // IE does not allow us to delete expando properties from nodes,
-                       // nor does it have a removeAttribute function on Document nodes;
-                       // we must handle all of these cases
-                       if ( jQuery.support.deleteExpando ) {
-                               delete elem[ internalKey ];
-                       } else if ( elem.removeAttribute ) {
-                               elem.removeAttribute( internalKey );
-                       } else {
-                               elem[ internalKey ] = null;
-                       }
-               }
        },
 
        // For internal use only.
@@ -1895,15 +1715,10 @@ jQuery.extend({
 
        // A method for determining if a DOM node can handle the data expando
        acceptData: function( elem ) {
-               if ( elem.nodeName ) {
-                       var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
-                       if ( match ) {
-                               return !(match === true || elem.getAttribute("classid") !== match);
-                       }
-               }
+               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
 
-               return true;
+               // nodes accept data unless otherwise specified; rejection can be conditional
+               return !noData || noData !== true && elem.getAttribute("classid") === noData;
        }
 });
 
@@ -1996,8 +1811,9 @@ function dataAttr( elem, key, data ) {
                                data = data === "true" ? true :
                                data === "false" ? false :
                                data === "null" ? null :
-                               jQuery.isNumeric( data ) ? +data :
-                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                               // Only convert to a number if it doesn't change the string
+                               +data + "" === data ? +data :
+                               rbrace.test( data ) ? jQuery.parseJSON( data ) :
                                        data;
                        } catch( e ) {}
 
@@ -2014,7 +1830,8 @@ function dataAttr( elem, key, data ) {
 
 // checks a cache object for emptiness
 function isEmptyDataObject( obj ) {
-       for ( var name in obj ) {
+       var name;
+       for ( name in obj ) {
 
                // if the public data object is empty, the private is still empty
                if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
@@ -2027,73 +1844,23 @@ function isEmptyDataObject( obj ) {
 
        return true;
 }
-
-
-
-
-function handleQueueMarkDefer( elem, type, src ) {
-       var deferDataKey = type + "defer",
-               queueDataKey = type + "queue",
-               markDataKey = type + "mark",
-               defer = jQuery._data( elem, deferDataKey );
-       if ( defer &&
-               ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
-               ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
-               // Give room for hard-coded callbacks to fire first
-               // and eventually mark/queue something else on the element
-               setTimeout( function() {
-                       if ( !jQuery._data( elem, queueDataKey ) &&
-                               !jQuery._data( elem, markDataKey ) ) {
-                               jQuery.removeData( elem, deferDataKey, true );
-                               defer.fire();
-                       }
-               }, 0 );
-       }
-}
-
 jQuery.extend({
-
-       _mark: function( elem, type ) {
-               if ( elem ) {
-                       type = ( type || "fx" ) + "mark";
-                       jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
-               }
-       },
-
-       _unmark: function( force, elem, type ) {
-               if ( force !== true ) {
-                       type = elem;
-                       elem = force;
-                       force = false;
-               }
-               if ( elem ) {
-                       type = type || "fx";
-                       var key = type + "mark",
-                               count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
-                       if ( count ) {
-                               jQuery._data( elem, key, count );
-                       } else {
-                               jQuery.removeData( elem, key, true );
-                               handleQueueMarkDefer( elem, type, "mark" );
-                       }
-               }
-       },
-
        queue: function( elem, type, data ) {
-               var q;
+               var queue;
+
                if ( elem ) {
                        type = ( type || "fx" ) + "queue";
-                       q = jQuery._data( elem, type );
+                       queue = jQuery._data( elem, type );
 
                        // Speed up dequeue by getting out quickly if this is just a lookup
                        if ( data ) {
-                               if ( !q || jQuery.isArray(data) ) {
-                                       q = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               if ( !queue || jQuery.isArray(data) ) {
+                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
                                } else {
-                                       q.push( data );
+                                       queue.push( data );
                                }
                        }
-                       return q || [];
+                       return queue || [];
                }
        },
 
@@ -2102,7 +1869,10 @@ jQuery.extend({
 
                var queue = jQuery.queue( elem, type ),
                        fn = queue.shift(),
-                       hooks = {};
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
 
                // If the fx queue is dequeued, always remove the progress sentinel
                if ( fn === "inprogress" ) {
@@ -2110,22 +1880,31 @@ jQuery.extend({
                }
 
                if ( fn ) {
+
                        // Add a progress sentinel to prevent the fx queue from being
                        // automatically dequeued
                        if ( type === "fx" ) {
                                queue.unshift( "inprogress" );
                        }
 
-                       jQuery._data( elem, type + ".run", hooks );
-                       fn.call( elem, function() {
-                               jQuery.dequeue( elem, type );
-                       }, hooks );
+                       // clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
                }
-
-               if ( !queue.length ) {
-                       jQuery.removeData( elem, type + "queue " + type + ".run", true );
-                       handleQueueMarkDefer( elem, type, "queue" );
+               if ( !queue.length && hooks ) {
+                       hooks.empty.fire();
                }
+       },
+
+       // not intended for public consumption - generates a queueHooks object, or returns the current one
+       _queueHooks: function( elem, type ) {
+               var key = type + "queueHooks";
+               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+                       empty: jQuery.Callbacks("once memory").add(function() {
+                               jQuery.removeData( elem, type + "queue", true );
+                               jQuery.removeData( elem, key, true );
+                       })
+               });
        }
 });
 
@@ -2148,6 +1927,9 @@ jQuery.fn.extend({
                        this.each(function() {
                                var queue = jQuery.queue( this, type, data );
 
+                               // ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
+
                                if ( type === "fx" && queue[0] !== "inprogress" ) {
                                        jQuery.dequeue( this, type );
                                }
@@ -2176,51 +1958,42 @@ jQuery.fn.extend({
        },
        // Get a promise resolved when queues of a certain type
        // are emptied (fx is the type by default)
-       promise: function( type, object ) {
+       promise: function( type, obj ) {
+               var tmp,
+                       count = 1,
+                       defer = jQuery.Deferred(),
+                       elements = this,
+                       i = this.length,
+                       resolve = function() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
+                       };
+
                if ( typeof type !== "string" ) {
-                       object = type;
+                       obj = type;
                        type = undefined;
                }
                type = type || "fx";
-               var defer = jQuery.Deferred(),
-                       elements = this,
-                       i = elements.length,
-                       count = 1,
-                       deferDataKey = type + "defer",
-                       queueDataKey = type + "queue",
-                       markDataKey = type + "mark",
-                       tmp;
-               function resolve() {
-                       if ( !( --count ) ) {
-                               defer.resolveWith( elements, [ elements ] );
-                       }
-               }
+
                while( i-- ) {
-                       if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
-                                       ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
-                                               jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
-                                       jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+                       if ( (tmp = jQuery._data( elements[ i ], type + "queueHooks" )) && tmp.empty ) {
                                count++;
-                               tmp.add( resolve );
+                               tmp.empty.add( resolve );
                        }
                }
                resolve();
-               return defer.promise( object );
+               return defer.promise( obj );
        }
 });
-
-
-
-
-var rclass = /[\n\t\r]/g,
-       rspace = /\s+/,
+var nodeHook, boolHook, fixSpecified,
+       rclass = /[\t\r\n]/g,
        rreturn = /\r/g,
        rtype = /^(?:button|input)$/i,
        rfocusable = /^(?:button|input|object|select|textarea)$/i,
-       rclickable = /^a(?:rea)?$/i,
+       rclickable = /^a(?:rea|)$/i,
        rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-       getSetAttribute = jQuery.support.getSetAttribute,
-       nodeHook, boolHook, fixSpecified;
+       getSetAttribute = jQuery.support.getSetAttribute;
 
 jQuery.fn.extend({
        attr: function( name, value ) {
@@ -2259,7 +2032,7 @@ jQuery.fn.extend({
                }
 
                if ( value && typeof value === "string" ) {
-                       classNames = value.split( rspace );
+                       classNames = value.split( core_rspace );
 
                        for ( i = 0, l = this.length; i < l; i++ ) {
                                elem = this[ i ];
@@ -2286,31 +2059,30 @@ jQuery.fn.extend({
        },
 
        removeClass: function( value ) {
-               var classNames, i, l, elem, className, c, cl;
+               var removes, className, elem, c, cl, i, l;
 
                if ( jQuery.isFunction( value ) ) {
                        return this.each(function( j ) {
                                jQuery( this ).removeClass( value.call(this, j, this.className) );
                        });
                }
-
                if ( (value && typeof value === "string") || value === undefined ) {
-                       classNames = ( value || "" ).split( rspace );
+                       removes = ( value || "" ).split( core_rspace );
 
                        for ( i = 0, l = this.length; i < l; i++ ) {
                                elem = this[ i ];
-
                                if ( elem.nodeType === 1 && elem.className ) {
-                                       if ( value ) {
-                                               className = (" " + elem.className + " ").replace( rclass, " " );
-                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                       className = className.replace(" " + classNames[ c ] + " ", " ");
-                                               }
-                                               elem.className = jQuery.trim( className );
 
-                                       } else {
-                                               elem.className = "";
+                                       className = (" " + elem.className + " ").replace( rclass, " " );
+
+                                       // loop over each item in the removal list
+                                       for ( c = 0, cl = removes.length; c < cl; c++ ) {
+                                               // Remove until there is nothing to remove,
+                                               while ( className.indexOf(" " + removes[ c ] + " ") > -1 ) {
+                                                       className = className.replace( " " + removes[ c ] + " " , " " );
+                                               }
                                        }
+                                       elem.className = value ? jQuery.trim( className ) : "";
                                }
                        }
                }
@@ -2335,10 +2107,10 @@ jQuery.fn.extend({
                                        i = 0,
                                        self = jQuery( this ),
                                        state = stateVal,
-                                       classNames = value.split( rspace );
+                                       classNames = value.split( core_rspace );
 
                                while ( (className = classNames[ i++ ]) ) {
-                                       // check each className given, space seperated list
+                                       // check each className given, space separated list
                                        state = isBool ? state : !self.hasClass( className );
                                        self[ state ? "addClass" : "removeClass" ]( className );
                                }
@@ -2395,7 +2167,8 @@ jQuery.fn.extend({
                isFunction = jQuery.isFunction( value );
 
                return this.each(function( i ) {
-                       var self = jQuery(this), val;
+                       var val,
+                               self = jQuery(this);
 
                        if ( this.nodeType !== 1 ) {
                                return;
@@ -2497,16 +2270,8 @@ jQuery.extend({
                }
        },
 
-       attrFn: {
-               val: true,
-               css: true,
-               html: true,
-               text: true,
-               data: true,
-               width: true,
-               height: true,
-               offset: true
-       },
+       // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+       attrFn: {},
 
        attr: function( elem, name, value, pass ) {
                var ret, hooks, notxml,
@@ -2517,7 +2282,7 @@ jQuery.extend({
                        return;
                }
 
-               if ( pass && name in jQuery.attrFn ) {
+               if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
                        return jQuery( elem )[ name ]( value );
                }
 
@@ -2564,14 +2329,14 @@ jQuery.extend({
        },
 
        removeAttr: function( elem, value ) {
-               var propName, attrNames, name, l, isBool,
+               var propName, attrNames, name, isBool,
                        i = 0;
 
                if ( value && elem.nodeType === 1 ) {
-                       attrNames = value.toLowerCase().split( rspace );
-                       l = attrNames.length;
 
-                       for ( ; i < l; i++ ) {
+                       attrNames = value.split( core_rspace );
+
+                       for ( ; i < attrNames.length; i++ ) {
                                name = attrNames[ i ];
 
                                if ( name ) {
@@ -2701,9 +2466,6 @@ jQuery.extend({
        }
 });
 
-// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
-jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
-
 // Hook for boolean attributes
 boolHook = {
        get: function( elem, name ) {
@@ -2750,8 +2512,8 @@ if ( !getSetAttribute ) {
                get: function( elem, name ) {
                        var ret;
                        ret = elem.getAttributeNode( name );
-                       return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
-                               ret.nodeValue :
+                       return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+                               ret.value :
                                undefined;
                },
                set: function( elem, value, name ) {
@@ -2761,13 +2523,10 @@ if ( !getSetAttribute ) {
                                ret = document.createAttribute( name );
                                elem.setAttributeNode( ret );
                        }
-                       return ( ret.nodeValue = value + "" );
+                       return ( ret.value = value + "" );
                }
        };
 
-       // Apply the nodeHook to tabindex
-       jQuery.attrHooks.tabindex.set = nodeHook.set;
-
        // Set width and height to auto instead of 0 on empty string( Bug #8150 )
        // This is for removals
        jQuery.each([ "width", "height" ], function( i, name ) {
@@ -2865,35 +2624,12 @@ jQuery.each([ "radio", "checkbox" ], function() {
                }
        });
 });
-
-
-
-
 var rformElems = /^(?:textarea|input|select)$/i,
-       rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
-       rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
+       rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
        rkeyEvent = /^key/,
        rmouseEvent = /^(?:mouse|contextmenu)|click/,
        rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-       rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
-       quickParse = function( selector ) {
-               var quick = rquickIs.exec( selector );
-               if ( quick ) {
-                       //   0  1    2   3
-                       // [ _, tag, id, class ]
-                       quick[1] = ( quick[1] || "" ).toLowerCase();
-                       quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
-               }
-               return quick;
-       },
-       quickIs = function( elem, m ) {
-               var attrs = elem.attributes || {};
-               return (
-                       (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
-                       (!m[2] || (attrs.id || {}).value === m[2]) &&
-                       (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
-               );
-       },
        hoverHack = function( events ) {
                return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
        };
@@ -2908,7 +2644,7 @@ jQuery.event = {
 
                var elemData, eventHandle, events,
                        t, tns, type, namespaces, handleObj,
-                       handleObjIn, quick, handlers, special;
+                       handleObjIn, handlers, special;
 
                // Don't attach events to noData or text/comment nodes (allow plain objects tho)
                if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
@@ -2971,7 +2707,6 @@ jQuery.event = {
                                handler: handler,
                                guid: handler.guid,
                                selector: selector,
-                               quick: selector && quickParse( selector ),
                                namespace: namespaces.join(".")
                        }, handleObjIn );
 
@@ -3021,9 +2756,9 @@ jQuery.event = {
        // Detach an event or set of events from an element
        remove: function( elem, types, handler, selector, mappedTypes ) {
 
-               var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
-                       t, tns, type, origType, namespaces, origCount,
-                       j, events, special, handle, eventType, handleObj;
+               var t, tns, type, origType, namespaces, origCount,
+                       j, events, special, eventType, handleObj,
+                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
 
                if ( !elemData || !(events = elemData.events) ) {
                        return;
@@ -3048,7 +2783,7 @@ jQuery.event = {
                        type = ( selector? special.delegateType : special.bindType ) || type;
                        eventType = events[ type ] || [];
                        origCount = eventType.length;
-                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
 
                        // Remove matching events
                        for ( j = 0; j < eventType.length; j++ ) {
@@ -3072,7 +2807,7 @@ jQuery.event = {
                        // Remove generic event handler if we removed something and no more handlers exist
                        // (avoids potential for endless recursion during removal of special event handlers)
                        if ( eventType.length === 0 && origCount !== eventType.length ) {
-                               if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
                                        jQuery.removeEvent( elem, type, elemData.handle );
                                }
 
@@ -3082,14 +2817,11 @@ jQuery.event = {
 
                // Remove the expando if it's no longer used
                if ( jQuery.isEmptyObject( events ) ) {
-                       handle = elemData.handle;
-                       if ( handle ) {
-                               handle.elem = null;
-                       }
+                       delete elemData.handle;
 
                        // removeData also checks for emptiness and clears the expando if empty
                        // so use it instead of delete
-                       jQuery.removeData( elem, [ "events", "handle" ], true );
+                       jQuery.removeData( elem, "events", true );
                }
        },
 
@@ -3108,9 +2840,9 @@ jQuery.event = {
                }
 
                // Event object or event type
-               var type = event.type || event,
-                       namespaces = [],
-                       cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+               var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+                       type = event.type || event,
+                       namespaces = [];
 
                // focus/blur morphs to focusin/out; ensure we're not firing them right now
                if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
@@ -3148,7 +2880,7 @@ jQuery.event = {
                event.isTrigger = true;
                event.exclusive = exclusive;
                event.namespace = namespaces.join( "." );
-               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
                ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
 
                // Handle a global trigger
@@ -3187,14 +2919,13 @@ jQuery.event = {
 
                        bubbleType = special.delegateType || type;
                        cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
-                       old = null;
-                       for ( ; cur; cur = cur.parentNode ) {
+                       for ( old = elem; cur; cur = cur.parentNode ) {
                                eventPath.push([ cur, bubbleType ]);
                                old = cur;
                        }
 
                        // Only add window if we got to document (e.g., not plain obj or detached DOM)
-                       if ( old && old === elem.ownerDocument ) {
+                       if ( old === (elem.ownerDocument || document) ) {
                                eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
                        }
                }
@@ -3256,13 +2987,13 @@ jQuery.event = {
                // Make a writable jQuery.Event from the native event object
                event = jQuery.event.fix( event || window.event );
 
-               var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+               var i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related,
+                       handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
                        delegateCount = handlers.delegateCount,
-                       args = [].slice.call( arguments, 0 ),
+                       args = [].slice.call( arguments ),
                        run_all = !event.exclusive && !event.namespace,
                        special = jQuery.event.special[ event.type ] || {},
-                       handlerQueue = [],
-                       i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+                       handlerQueue = [];
 
                // Use the fix-ed jQuery.Event rather than the (read-only) native event
                args[0] = event;
@@ -3279,12 +3010,12 @@ jQuery.event = {
 
                        // Pregenerate a single jQuery object for reuse with .is()
                        jqcur = jQuery(this);
-                       jqcur.context = this.ownerDocument || this;
+                       jqcur.context = this;
 
                        for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
 
-                               // Don't process events on disabled elements (#6911, #8165)
-                               if ( cur.disabled !== true ) {
+                               // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #xxxx)
+                               if ( cur.disabled !== true || event.type !== "click" ) {
                                        selMatch = {};
                                        matches = [];
                                        jqcur[0] = cur;
@@ -3293,9 +3024,7 @@ jQuery.event = {
                                                sel = handleObj.selector;
 
                                                if ( selMatch[ sel ] === undefined ) {
-                                                       selMatch[ sel ] = (
-                                                               handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
-                                                       );
+                                                       selMatch[ sel ] = jqcur.is( sel );
                                                }
                                                if ( selMatch[ sel ] ) {
                                                        matches.push( handleObj );
@@ -3429,10 +3158,8 @@ jQuery.event = {
                        event.target = event.target.parentNode;
                }
 
-               // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
-               if ( event.metaKey === undefined ) {
-                       event.metaKey = event.ctrlKey;
-               }
+               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+               event.metaKey = !!event.metaKey;
 
                return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
        },
@@ -3505,8 +3232,17 @@ jQuery.removeEvent = document.removeEventListener ?
                }
        } :
        function( elem, type, handle ) {
+               var name = "on" + type;
+
                if ( elem.detachEvent ) {
-                       elem.detachEvent( "on" + type, handle );
+
+                       // #8545, #7054, preventing memory leaks for custom events in IE6-8 –
+                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
+                       if ( typeof elem[ name ] === "undefined" ) {
+                               elem[ name ] = null;
+                       }
+
+                       elem.detachEvent( name, handle );
                }
        };
 
@@ -3603,11 +3339,11 @@ jQuery.each({
                bindType: fix,
 
                handle: function( event ) {
-                       var target = this,
+                       var ret,
+                               target = this,
                                related = event.relatedTarget,
                                handleObj = event.handleObj,
-                               selector = handleObj.selector,
-                               ret;
+                               selector = handleObj.selector;
 
                        // For mousenter/leave call the handler if related is outside the target.
                        // NB: No relatedTarget if the mouse left/entered the browser window
@@ -3636,16 +3372,16 @@ if ( !jQuery.support.submitBubbles ) {
                                // Node name check avoids a VML-related crash in IE (#9807)
                                var elem = e.target,
                                        form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-                               if ( form && !form._submit_attached ) {
+                               if ( form && !jQuery._data( form, "_submit_attached" ) ) {
                                        jQuery.event.add( form, "submit._submit", function( event ) {
                                                event._submit_bubble = true;
                                        });
-                                       form._submit_attached = true;
+                                       jQuery._data( form, "_submit_attached", true );
                                }
                        });
                        // return undefined since we don't need an event listener
                },
-               
+
                postDispatch: function( event ) {
                        // If form was submitted by the user, bubble the event up the tree
                        if ( event._submit_bubble ) {
@@ -3688,8 +3424,9 @@ if ( !jQuery.support.changeBubbles ) {
                                        jQuery.event.add( this, "click._change", function( event ) {
                                                if ( this._just_changed && !event.isTrigger ) {
                                                        this._just_changed = false;
-                                                       jQuery.event.simulate( "change", this, event, true );
                                                }
+                                               // Allow triggered, simulated change events (#11500)
+                                               jQuery.event.simulate( "change", this, event, true );
                                        });
                                }
                                return false;
@@ -3698,13 +3435,13 @@ if ( !jQuery.support.changeBubbles ) {
                        jQuery.event.add( this, "beforeactivate._change", function( e ) {
                                var elem = e.target;
 
-                               if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
                                        jQuery.event.add( elem, "change._change", function( event ) {
                                                if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
                                                        jQuery.event.simulate( "change", this.parentNode, event, true );
                                                }
                                        });
-                                       elem._change_attached = true;
+                                       jQuery._data( elem, "_change_attached", true );
                                }
                        });
                },
@@ -3810,9 +3547,10 @@ jQuery.fn.extend({
                return this.on( types, selector, data, fn, 1 );
        },
        off: function( types, selector, fn ) {
+               var handleObj, type;
                if ( types && types.preventDefault && types.handleObj ) {
                        // ( event )  dispatched jQuery.Event
-                       var handleObj = types.handleObj;
+                       handleObj = types.handleObj;
                        jQuery( types.delegateTarget ).off(
                                handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
                                handleObj.selector,
@@ -3822,7 +3560,7 @@ jQuery.fn.extend({
                }
                if ( typeof types === "object" ) {
                        // ( types-object [, selector] )
-                       for ( var type in types ) {
+                       for ( type in types ) {
                                this.off( type, selector, types[ type ] );
                        }
                        return this;
@@ -3861,7 +3599,7 @@ jQuery.fn.extend({
        },
        undelegate: function( selector, types, fn ) {
                // ( namespace ) or ( selector, types [, fn] )
-               return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+               return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
        },
 
        trigger: function( type, data ) {
@@ -3922,10 +3660,6 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
                        this.trigger( name );
        };
 
-       if ( jQuery.attrFn ) {
-               jQuery.attrFn[ name ] = true;
-       }
-
        if ( rkeyEvent.test( name ) ) {
                jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
        }
@@ -3934,1609 +3668,1595 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
                jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
        }
 });
+/*!\r
+ * Sizzle CSS Selector Engine\r
+ *  Copyright 2012 jQuery Foundation and other contributors\r
+ *  Released under the MIT license\r
+ *  http://sizzlejs.com/\r
+ */\r
+(function( window, undefined ) {\r
+\r
+var cachedruns,\r
+       dirruns,\r
+       sortOrder,\r
+       siblingCheck,\r
+       assertGetIdNotName,\r
+\r
+       document = window.document,\r
+       docElem = document.documentElement,\r
+\r
+       strundefined = "undefined",\r
+       hasDuplicate = false,\r
+       baseHasDuplicate = true,\r
+       done = 0,\r
+       slice = [].slice,\r
+       push = [].push,\r
+\r
+       expando = ( "sizcache" + Math.random() ).replace( ".", "" ),\r
+\r
+       // Regex\r
+\r
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\r
+       whitespace = "[\\x20\\t\\r\\n\\f]",\r
+       // http://www.w3.org/TR/css3-syntax/#characters\r
+       characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",\r
+\r
+       // Loosely modeled on CSS identifier characters\r
+       // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\r
+       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\r
+       identifier = characterEncoding.replace( "w", "w#" ),\r
+\r
+       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\r
+       operators = "([*^$|!~]?=)",\r
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +\r
+               "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",\r
+       pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",\r
+       pos = ":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",\r
+       combinators = whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*",\r
+       groups = "(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|" + attributes + "|" + pseudos.replace( 2, 7 ) + "|[^\\\\(),])+",\r
+\r
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),\r
+\r
+       rcombinators = new RegExp( "^" + combinators ),\r
+\r
+       // All simple (non-comma) selectors, excluding insignifant trailing whitespace\r
+       rgroups = new RegExp( groups + "?(?=" + whitespace + "*,|$)", "g" ),\r
+\r
+       // A selector, or everything after leading whitespace\r
+       // Optionally followed in either case by a ")" for terminating sub-selectors\r
+       rselector = new RegExp( "^(?:(?!,)(?:(?:^|,)" + whitespace + "*" + groups + ")*?|" + whitespace + "*(.*?))(\\)|$)" ),\r
+\r
+       // All combinators and selector components (attribute test, tag, pseudo, etc.), the latter appearing together when consecutive\r
+       rtokens = new RegExp( groups.slice( 19, -6 ) + "\\x20\\t\\r\\n\\f>+~])+|" + combinators, "g" ),\r
+\r
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors\r
+       rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,\r
+\r
+       rsibling = /[\x20\t\r\n\f]*[+~]/,\r
+       rendsWithNot = /:not\($/,\r
+\r
+       rheader = /h\d/i,\r
+       rinputs = /input|select|textarea|button/i,\r
+\r
+       rbackslash = /\\(?!\\)/g,\r
+\r
+       matchExpr = {\r
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),\r
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),\r
+               "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),\r
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "[-", "[-\\*" ) + ")" ),\r
+               "ATTR": new RegExp( "^" + attributes ),\r
+               "PSEUDO": new RegExp( "^" + pseudos ),\r
+               "CHILD": new RegExp( "^:(only|nth|last|first)-child(?:\\(" + whitespace +\r
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +\r
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),\r
+               "POS": new RegExp( pos, "ig" ),\r
+               // For use in libraries implementing .is()\r
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )\r
+       },\r
+\r
+       classCache = {},\r
+       cachedClasses = [],\r
+       compilerCache = {},\r
+       cachedSelectors = [],\r
+\r
+       // Mark a function for use in filtering\r
+       markFunction = function( fn ) {\r
+               fn.sizzleFilter = true;\r
+               return fn;\r
+       },\r
+\r
+       // Returns a function to use in pseudos for input types\r
+       createInputFunction = function( type ) {\r
+               return function( elem ) {\r
+                       // Check the input's nodeName and type\r
+                       return elem.nodeName.toLowerCase() === "input" && elem.type === type;\r
+               };\r
+       },\r
+\r
+       // Returns a function to use in pseudos for buttons\r
+       createButtonFunction = function( type ) {\r
+               return function( elem ) {\r
+                       var name = elem.nodeName.toLowerCase();\r
+                       return (name === "input" || name === "button") && elem.type === type;\r
+               };\r
+       },\r
+\r
+       // Used for testing something on an element\r
+       assert = function( fn ) {\r
+               var pass = false,\r
+                       div = document.createElement("div");\r
+               try {\r
+                       pass = fn( div );\r
+               } catch (e) {}\r
+               // release memory in IE\r
+               div = null;\r
+               return pass;\r
+       },\r
+\r
+       // Check if attributes should be retrieved by attribute nodes\r
+       assertAttributes = assert(function( div ) {\r
+               div.innerHTML = "<select></select>";\r
+               var type = typeof div.lastChild.getAttribute("multiple");\r
+               // IE8 returns a string for some attributes even when not present\r
+               return type !== "boolean" && type !== "string";\r
+       }),\r
+\r
+       // Check if getElementById returns elements by name\r
+       // Check if getElementsByName privileges form controls or returns elements by ID\r
+       assertUsableName = assert(function( div ) {\r
+               // Inject content\r
+               div.id = expando + 0;\r
+               div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";\r
+               docElem.insertBefore( div, docElem.firstChild );\r
+\r
+               // Test\r
+               var pass = document.getElementsByName &&\r
+                       // buggy browsers will return fewer than the correct 2\r
+                       document.getElementsByName( expando ).length ===\r
+                       // buggy browsers will return more than the correct 0\r
+                       2 + document.getElementsByName( expando + 0 ).length;\r
+               assertGetIdNotName = !document.getElementById( expando );\r
+\r
+               // Cleanup\r
+               docElem.removeChild( div );\r
+\r
+               return pass;\r
+       }),\r
+\r
+       // Check if the browser returns only elements\r
+       // when doing getElementsByTagName("*")\r
+       assertTagNameNoComments = assert(function( div ) {\r
+               div.appendChild( document.createComment("") );\r
+               return div.getElementsByTagName("*").length === 0;\r
+       }),\r
+\r
+       // Check if getAttribute returns normalized href attributes\r
+       assertHrefNotNormalized = assert(function( div ) {\r
+               div.innerHTML = "<a href='#'></a>";\r
+               return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\r
+                       div.firstChild.getAttribute("href") === "#";\r
+       }),\r
+\r
+       // Check if getElementsByClassName can be trusted\r
+       assertUsableClassName = assert(function( div ) {\r
+               // Opera can't find a second classname (in 9.6)\r
+               div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";\r
+               if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {\r
+                       return false;\r
+               }\r
+\r
+               // Safari caches class attributes, doesn't catch changes (in 3.2)\r
+               div.lastChild.className = "e";\r
+               return div.getElementsByClassName("e").length !== 1;\r
+       });\r
+\r
+var Sizzle = function( selector, context, results, seed ) {\r
+       results = results || [];\r
+       context = context || document;\r
+       var match, elem, xml, m,\r
+               nodeType = context.nodeType;\r
+\r
+       if ( nodeType !== 1 && nodeType !== 9 ) {\r
+               return [];\r
+       }\r
+\r
+       if ( !selector || typeof selector !== "string" ) {\r
+               return results;\r
+       }\r
+\r
+       xml = isXML( context );\r
+\r
+       if ( !xml && !seed ) {\r
+               if ( (match = rquickExpr.exec( selector )) ) {\r
+                       // Speed-up: Sizzle("#ID")\r
+                       if ( (m = match[1]) ) {\r
+                               if ( nodeType === 9 ) {\r
+                                       elem = context.getElementById( m );\r
+                                       // Check parentNode to catch when Blackberry 4.6 returns\r
+                                       // nodes that are no longer in the document #6963\r
+                                       if ( elem && elem.parentNode ) {\r
+                                               // Handle the case where IE, Opera, and Webkit return items\r
+                                               // by name instead of ID\r
+                                               if ( elem.id === m ) {\r
+                                                       results.push( elem );\r
+                                                       return results;\r
+                                               }\r
+                                       } else {\r
+                                               return results;\r
+                                       }\r
+                               } else {\r
+                                       // Context is not a document\r
+                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\r
+                                               contains( context, elem ) && elem.id === m ) {\r
+                                               results.push( elem );\r
+                                               return results;\r
+                                       }\r
+                               }\r
+\r
+                       // Speed-up: Sizzle("TAG")\r
+                       } else if ( match[2] ) {\r
+                               push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\r
+                               return results;\r
+\r
+                       // Speed-up: Sizzle(".CLASS")\r
+                       } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\r
+                               push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\r
+                               return results;\r
+                       }\r
+               }\r
+       }\r
+\r
+       // All others\r
+       return select( selector, context, results, seed, xml );\r
+};\r
+\r
+var Expr = Sizzle.selectors = {\r
+\r
+       // Can be adjusted by the user\r
+       cacheLength: 50,\r
+\r
+       match: matchExpr,\r
+\r
+       order: [ "ID", "TAG" ],\r
+\r
+       attrHandle: {},\r
+\r
+       createPseudo: markFunction,\r
+\r
+       find: {\r
+               "ID": assertGetIdNotName ?\r
+                       function( id, context, xml ) {\r
+                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
+                                       var m = context.getElementById( id );\r
+                                       // Check parentNode to catch when Blackberry 4.6 returns\r
+                                       // nodes that are no longer in the document #6963\r
+                                       return m && m.parentNode ? [m] : [];\r
+                               }\r
+                       } :\r
+                       function( id, context, xml ) {\r
+                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
+                                       var m = context.getElementById( id );\r
+\r
+                                       return m ?\r
+                                               m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?\r
+                                                       [m] :\r
+                                                       undefined :\r
+                                               [];\r
+                               }\r
+                       },\r
+\r
+               "TAG": assertTagNameNoComments ?\r
+                       function( tag, context ) {\r
+                               if ( typeof context.getElementsByTagName !== strundefined ) {\r
+                                       return context.getElementsByTagName( tag );\r
+                               }\r
+                       } :\r
+                       function( tag, context ) {\r
+                               var results = context.getElementsByTagName( tag );\r
+\r
+                               // Filter out possible comments\r
+                               if ( tag === "*" ) {\r
+                                       var elem,\r
+                                               tmp = [],\r
+                                               i = 0;\r
+\r
+                                       for ( ; (elem = results[i]); i++ ) {\r
+                                               if ( elem.nodeType === 1 ) {\r
+                                                       tmp.push( elem );\r
+                                               }\r
+                                       }\r
+\r
+                                       return tmp;\r
+                               }\r
+                               return results;\r
+                       }\r
+       },\r
+\r
+       relative: {\r
+               ">": { dir: "parentNode", first: true },\r
+               " ": { dir: "parentNode" },\r
+               "+": { dir: "previousSibling", first: true },\r
+               "~": { dir: "previousSibling" }\r
+       },\r
+\r
+       preFilter: {\r
+               "ATTR": function( match ) {\r
+                       match[1] = match[1].replace( rbackslash, "" );\r
+\r
+                       // Move the given value to match[3] whether quoted or unquoted\r
+                       match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );\r
+\r
+                       if ( match[2] === "~=" ) {\r
+                               match[3] = " " + match[3] + " ";\r
+                       }\r
+\r
+                       return match.slice( 0, 4 );\r
+               },\r
+\r
+               "CHILD": function( match ) {\r
+                       /* matches from matchExpr.CHILD\r
+                               1 type (only|nth|...)\r
+                               2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)\r
+                               3 xn-component of xn+y argument ([+-]?\d*n|)\r
+                               4 sign of xn-component\r
+                               5 x of xn-component\r
+                               6 sign of y-component\r
+                               7 y of y-component\r
+                       */\r
+                       match[1] = match[1].toLowerCase();\r
+\r
+                       if ( match[1] === "nth" ) {\r
+                               // nth-child requires argument\r
+                               if ( !match[2] ) {\r
+                                       Sizzle.error( match[0] );\r
+                               }\r
+\r
+                               // numeric x and y parameters for Expr.filter.CHILD\r
+                               // remember that false/true cast respectively to 0/1\r
+                               match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );\r
+                               match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );\r
+\r
+                       // other types prohibit arguments\r
+                       } else if ( match[2] ) {\r
+                               Sizzle.error( match[0] );\r
+                       }\r
+\r
+                       return match;\r
+               },\r
+\r
+               "PSEUDO": function( match ) {\r
+                       var argument,\r
+                               unquoted = match[4];\r
+\r
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {\r
+                               return null;\r
+                       }\r
+\r
+                       // Relinquish our claim on characters in `unquoted` from a closing parenthesis on\r
+                       if ( unquoted && (argument = rselector.exec( unquoted )) && argument.pop() ) {\r
+\r
+                               match[0] = match[0].slice( 0, argument[0].length - unquoted.length - 1 );\r
+                               unquoted = argument[0].slice( 0, -1 );\r
+                       }\r
+\r
+                       // Quoted or unquoted, we have the full argument\r
+                       // Return only captures needed by the pseudo filter method (type and argument)\r
+                       match.splice( 2, 3, unquoted || match[3] );\r
+                       return match;\r
+               }\r
+       },\r
+\r
+       filter: {\r
+               "ID": assertGetIdNotName ?\r
+                       function( id ) {\r
+                               id = id.replace( rbackslash, "" );\r
+                               return function( elem ) {\r
+                                       return elem.getAttribute("id") === id;\r
+                               };\r
+                       } :\r
+                       function( id ) {\r
+                               id = id.replace( rbackslash, "" );\r
+                               return function( elem ) {\r
+                                       var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");\r
+                                       return node && node.value === id;\r
+                               };\r
+                       },\r
+\r
+               "TAG": function( nodeName ) {\r
+                       if ( nodeName === "*" ) {\r
+                               return function() { return true; };\r
+                       }\r
+                       nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();\r
+\r
+                       return function( elem ) {\r
+                               return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\r
+                       };\r
+               },\r
+\r
+               "CLASS": function( className ) {\r
+                       var pattern = classCache[ className ];\r
+                       if ( !pattern ) {\r
+                               pattern = classCache[ className ] = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" );\r
+                               cachedClasses.push( className );\r
+                               // Avoid too large of a cache\r
+                               if ( cachedClasses.length > Expr.cacheLength ) {\r
+                                       delete classCache[ cachedClasses.shift() ];\r
+                               }\r
+                       }\r
+                       return function( elem ) {\r
+                               return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );\r
+                       };\r
+               },\r
+\r
+               "ATTR": function( name, operator, check ) {\r
+                       if ( !operator ) {\r
+                               return function( elem ) {\r
+                                       return Sizzle.attr( elem, name ) != null;\r
+                               };\r
+                       }\r
+\r
+                       return function( elem ) {\r
+                               var result = Sizzle.attr( elem, name ),\r
+                                       value = result + "";\r
+\r
+                               if ( result == null ) {\r
+                                       return operator === "!=";\r
+                               }\r
+\r
+                               switch ( operator ) {\r
+                                       case "=":\r
+                                               return value === check;\r
+                                       case "!=":\r
+                                               return value !== check;\r
+                                       case "^=":\r
+                                               return check && value.indexOf( check ) === 0;\r
+                                       case "*=":\r
+                                               return check && value.indexOf( check ) > -1;\r
+                                       case "$=":\r
+                                               return check && value.substr( value.length - check.length ) === check;\r
+                                       case "~=":\r
+                                               return ( " " + value + " " ).indexOf( check ) > -1;\r
+                                       case "|=":\r
+                                               return value === check || value.substr( 0, check.length + 1 ) === check + "-";\r
+                               }\r
+                       };\r
+               },\r
+\r
+               "CHILD": function( type, argument, first, last ) {\r
+\r
+                       if ( type === "nth" ) {\r
+                               var doneName = done++;\r
+\r
+                               return function( elem ) {\r
+                                       var parent, diff,\r
+                                               count = 0,\r
+                                               node = elem;\r
+\r
+                                       if ( first === 1 && last === 0 ) {\r
+                                               return true;\r
+                                       }\r
+\r
+                                       parent = elem.parentNode;\r
+\r
+                                       if ( parent && (parent[ expando ] !== doneName || !elem.sizset) ) {\r
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               node.sizset = ++count;\r
+                                                               if ( node === elem ) {\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               parent[ expando ] = doneName;\r
+                                       }\r
+\r
+                                       diff = elem.sizset - last;\r
+\r
+                                       if ( first === 0 ) {\r
+                                               return diff === 0;\r
+\r
+                                       } else {\r
+                                               return ( diff % first === 0 && diff / first >= 0 );\r
+                                       }\r
+                               };\r
+                       }\r
+\r
+                       return function( elem ) {\r
+                               var node = elem;\r
+\r
+                               switch ( type ) {\r
+                                       case "only":\r
+                                       case "first":\r
+                                               while ( (node = node.previousSibling) ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               return false;\r
+                                                       }\r
+                                               }\r
+\r
+                                               if ( type === "first" ) {\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               node = elem;\r
+\r
+                                               /* falls through */\r
+                                       case "last":\r
+                                               while ( (node = node.nextSibling) ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               return false;\r
+                                                       }\r
+                                               }\r
+\r
+                                               return true;\r
+                               }\r
+                       };\r
+               },\r
+\r
+               "PSEUDO": function( pseudo, argument, context, xml ) {\r
+                       // pseudo-class names are case-insensitive\r
+                       // http://www.w3.org/TR/selectors/#pseudo-classes\r
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\r
+                       var fn = Expr.pseudos[ pseudo ] || Expr.pseudos[ pseudo.toLowerCase() ];\r
+\r
+                       if ( !fn ) {\r
+                               Sizzle.error( "unsupported pseudo: " + pseudo );\r
+                       }\r
+\r
+                       // The user may set fn.sizzleFilter to indicate\r
+                       // that arguments are needed to create the filter function\r
+                       // just as Sizzle does\r
+                       if ( !fn.sizzleFilter ) {\r
+                               return fn;\r
+                       }\r
+\r
+                       return fn( argument, context, xml );\r
+               }\r
+       },\r
+\r
+       pseudos: {\r
+               "not": markFunction(function( selector, context, xml ) {\r
+                       // Trim the selector passed to compile\r
+                       // to avoid treating leading and trailing\r
+                       // spaces as combinators\r
+                       var matcher = compile( selector.replace( rtrim, "$1" ), context, xml );\r
+                       return function( elem ) {\r
+                               return !matcher( elem );\r
+                       };\r
+               }),\r
+\r
+               "enabled": function( elem ) {\r
+                       return elem.disabled === false;\r
+               },\r
+\r
+               "disabled": function( elem ) {\r
+                       return elem.disabled === true;\r
+               },\r
+\r
+               "checked": function( elem ) {\r
+                       // In CSS3, :checked should return both checked and selected elements\r
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
+                       var nodeName = elem.nodeName.toLowerCase();\r
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);\r
+               },\r
+\r
+               "selected": function( elem ) {\r
+                       // Accessing this property makes selected-by-default\r
+                       // options in Safari work properly\r
+                       if ( elem.parentNode ) {\r
+                               elem.parentNode.selectedIndex;\r
+                       }\r
+\r
+                       return elem.selected === true;\r
+               },\r
+\r
+               "parent": function( elem ) {\r
+                       return !Expr.pseudos["empty"]( elem );\r
+               },\r
+\r
+               "empty": function( elem ) {\r
+                       // http://www.w3.org/TR/selectors/#empty-pseudo\r
+                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\r
+                       //   not comment, processing instructions, or others\r
+                       // Thanks to Diego Perini for the nodeName shortcut\r
+                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")\r
+                       var nodeType;\r
+                       elem = elem.firstChild;\r
+                       while ( elem ) {\r
+                               if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\r
+                                       return false;\r
+                               }\r
+                               elem = elem.nextSibling;\r
+                       }\r
+                       return true;\r
+               },\r
+\r
+               "contains": markFunction(function( text ) {\r
+                       return function( elem ) {\r
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\r
+                       };\r
+               }),\r
+\r
+               "has": markFunction(function( selector ) {\r
+                       return function( elem ) {\r
+                               return Sizzle( selector, elem ).length > 0;\r
+                       };\r
+               }),\r
+\r
+               "header": function( elem ) {\r
+                       return rheader.test( elem.nodeName );\r
+               },\r
+\r
+               "text": function( elem ) {\r
+                       var type, attr;\r
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\r
+                       // use getAttribute instead to test this case\r
+                       return elem.nodeName.toLowerCase() === "input" &&\r
+                               (type = elem.type) === "text" &&\r
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );\r
+               },\r
+\r
+               // Input types\r
+               "radio": createInputFunction("radio"),\r
+               "checkbox": createInputFunction("checkbox"),\r
+               "file": createInputFunction("file"),\r
+               "password": createInputFunction("password"),\r
+               "image": createInputFunction("image"),\r
+\r
+               "submit": createButtonFunction("submit"),\r
+               "reset": createButtonFunction("reset"),\r
+\r
+               "button": function( elem ) {\r
+                       var name = elem.nodeName.toLowerCase();\r
+                       return name === "input" && elem.type === "button" || name === "button";\r
+               },\r
+\r
+               "input": function( elem ) {\r
+                       return rinputs.test( elem.nodeName );\r
+               },\r
+\r
+               "focus": function( elem ) {\r
+                       var doc = elem.ownerDocument;\r
+                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);\r
+               },\r
+\r
+               "active": function( elem ) {\r
+                       return elem === elem.ownerDocument.activeElement;\r
+               }\r
+       },\r
+\r
+       setFilters: {\r
+               "first": function( elements, argument, not ) {\r
+                       return not ? elements.slice( 1 ) : [ elements[0] ];\r
+               },\r
+\r
+               "last": function( elements, argument, not ) {\r
+                       var elem = elements.pop();\r
+                       return not ? elements : [ elem ];\r
+               },\r
+\r
+               "even": function( elements, argument, not ) {\r
+                       var results = [],\r
+                               i = not ? 1 : 0,\r
+                               len = elements.length;\r
+                       for ( ; i < len; i = i + 2 ) {\r
+                               results.push( elements[i] );\r
+                       }\r
+                       return results;\r
+               },\r
+\r
+               "odd": function( elements, argument, not ) {\r
+                       var results = [],\r
+                               i = not ? 0 : 1,\r
+                               len = elements.length;\r
+                       for ( ; i < len; i = i + 2 ) {\r
+                               results.push( elements[i] );\r
+                       }\r
+                       return results;\r
+               },\r
+\r
+               "lt": function( elements, argument, not ) {\r
+                       return not ? elements.slice( +argument ) : elements.slice( 0, +argument );\r
+               },\r
+\r
+               "gt": function( elements, argument, not ) {\r
+                       return not ? elements.slice( 0, +argument + 1 ) : elements.slice( +argument + 1 );\r
+               },\r
+\r
+               "eq": function( elements, argument, not ) {\r
+                       var elem = elements.splice( +argument, 1 );\r
+                       return not ? elements : elem;\r
+               }\r
+       }\r
+};\r
+\r
+// Deprecated\r
+Expr.setFilters["nth"] = Expr.setFilters["eq"];\r
+\r
+// Back-compat\r
+Expr.filters = Expr.pseudos;\r
+\r
+// IE6/7 return a modified href\r
+if ( !assertHrefNotNormalized ) {\r
+       Expr.attrHandle = {\r
+               "href": function( elem ) {\r
+                       return elem.getAttribute( "href", 2 );\r
+               },\r
+               "type": function( elem ) {\r
+                       return elem.getAttribute("type");\r
+               }\r
+       };\r
+}\r
+\r
+// Add getElementsByName if usable\r
+if ( assertUsableName ) {\r
+       Expr.order.push("NAME");\r
+       Expr.find["NAME"] = function( name, context ) {\r
+               if ( typeof context.getElementsByName !== strundefined ) {\r
+                       return context.getElementsByName( name );\r
+               }\r
+       };\r
+}\r
+\r
+// Add getElementsByClassName if usable\r
+if ( assertUsableClassName ) {\r
+       Expr.order.splice( 1, 0, "CLASS" );\r
+       Expr.find["CLASS"] = function( className, context, xml ) {\r
+               if ( typeof context.getElementsByClassName !== strundefined && !xml ) {\r
+                       return context.getElementsByClassName( className );\r
+               }\r
+       };\r
+}\r
+\r
+// If slice is not available, provide a backup\r
+try {\r
+       slice.call( docElem.childNodes, 0 )[0].nodeType;\r
+} catch ( e ) {\r
+       slice = function( i ) {\r
+               var elem, results = [];\r
+               for ( ; (elem = this[i]); i++ ) {\r
+                       results.push( elem );\r
+               }\r
+               return results;\r
+       };\r
+}\r
+\r
+var isXML = Sizzle.isXML = function( elem ) {\r
+       // documentElement is verified for cases where it doesn't yet exist\r
+       // (such as loading iframes in IE - #4833)\r
+       var documentElement = elem && (elem.ownerDocument || elem).documentElement;\r
+       return documentElement ? documentElement.nodeName !== "HTML" : false;\r
+};\r
+\r
+// Element contains another\r
+var contains = Sizzle.contains = docElem.compareDocumentPosition ?\r
+       function( a, b ) {\r
+               return !!( a.compareDocumentPosition( b ) & 16 );\r
+       } :\r
+       docElem.contains ?\r
+       function( a, b ) {\r
+               var adown = a.nodeType === 9 ? a.documentElement : a,\r
+                       bup = b.parentNode;\r
+               return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\r
+       } :\r
+       function( a, b ) {\r
+               while ( (b = b.parentNode) ) {\r
+                       if ( b === a ) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       };\r
+\r
+/**\r
+ * Utility function for retrieving the text value of an array of DOM nodes\r
+ * @param {Array|Element} elem\r
+ */\r
+var getText = Sizzle.getText = function( elem ) {\r
+       var node,\r
+               ret = "",\r
+               i = 0,\r
+               nodeType = elem.nodeType;\r
+\r
+       if ( nodeType ) {\r
+               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r
+                       // Use textContent for elements\r
+                       // innerText usage removed for consistency of new lines (see #11153)\r
+                       if ( typeof elem.textContent === "string" ) {\r
+                               return elem.textContent;\r
+                       } else {\r
+                               // Traverse its children\r
+                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r
+                                       ret += getText( elem );\r
+                               }\r
+                       }\r
+               } else if ( nodeType === 3 || nodeType === 4 ) {\r
+                       return elem.nodeValue;\r
+               }\r
+               // Do not include comment or processing instruction nodes\r
+       } else {\r
+\r
+               // If no nodeType, this is expected to be an array\r
+               for ( ; (node = elem[i]); i++ ) {\r
+                       // Do not traverse comment nodes\r
+                       ret += getText( node );\r
+               }\r
+       }\r
+       return ret;\r
+};\r
+\r
+Sizzle.attr = function( elem, name ) {\r
+       var attr,\r
+               xml = isXML( elem );\r
+\r
+       if ( !xml ) {\r
+               name = name.toLowerCase();\r
+       }\r
+       if ( Expr.attrHandle[ name ] ) {\r
+               return Expr.attrHandle[ name ]( elem );\r
+       }\r
+       if ( assertAttributes || xml ) {\r
+               return elem.getAttribute( name );\r
+       }\r
+       attr = elem.getAttributeNode( name );\r
+       return attr ?\r
+               typeof elem[ name ] === "boolean" ?\r
+                       elem[ name ] ? name : null :\r
+                       attr.specified ? attr.value : null :\r
+               null;\r
+};\r
+\r
+Sizzle.error = function( msg ) {\r
+       throw new Error( "Syntax error, unrecognized expression: " + msg );\r
+};\r
+\r
+// Check if the JavaScript engine is using some sort of\r
+// optimization where it does not always call our comparision\r
+// function. If that is the case, discard the hasDuplicate value.\r
+//   Thus far that includes Google Chrome.\r
+[0, 0].sort(function() {\r
+       return (baseHasDuplicate = 0);\r
+});\r
+\r
+\r
+if ( docElem.compareDocumentPosition ) {\r
+       sortOrder = function( a, b ) {\r
+               if ( a === b ) {\r
+                       hasDuplicate = true;\r
+                       return 0;\r
+               }\r
+\r
+               return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\r
+                       a.compareDocumentPosition :\r
+                       a.compareDocumentPosition(b) & 4\r
+               ) ? -1 : 1;\r
+       };\r
+\r
+} else {\r
+       sortOrder = function( a, b ) {\r
+               // The nodes are identical, we can exit early\r
+               if ( a === b ) {\r
+                       hasDuplicate = true;\r
+                       return 0;\r
+\r
+               // Fallback to using sourceIndex (in IE) if it's available on both nodes\r
+               } else if ( a.sourceIndex && b.sourceIndex ) {\r
+                       return a.sourceIndex - b.sourceIndex;\r
+               }\r
+\r
+               var al, bl,\r
+                       ap = [],\r
+                       bp = [],\r
+                       aup = a.parentNode,\r
+                       bup = b.parentNode,\r
+                       cur = aup;\r
+\r
+               // If the nodes are siblings (or identical) we can do a quick check\r
+               if ( aup === bup ) {\r
+                       return siblingCheck( a, b );\r
+\r
+               // If no parents were found then the nodes are disconnected\r
+               } else if ( !aup ) {\r
+                       return -1;\r
+\r
+               } else if ( !bup ) {\r
+                       return 1;\r
+               }\r
+\r
+               // Otherwise they're somewhere else in the tree so we need\r
+               // to build up a full list of the parentNodes for comparison\r
+               while ( cur ) {\r
+                       ap.unshift( cur );\r
+                       cur = cur.parentNode;\r
+               }\r
+\r
+               cur = bup;\r
+\r
+               while ( cur ) {\r
+                       bp.unshift( cur );\r
+                       cur = cur.parentNode;\r
+               }\r
+\r
+               al = ap.length;\r
+               bl = bp.length;\r
+\r
+               // Start walking down the tree looking for a discrepancy\r
+               for ( var i = 0; i < al && i < bl; i++ ) {\r
+                       if ( ap[i] !== bp[i] ) {\r
+                               return siblingCheck( ap[i], bp[i] );\r
+                       }\r
+               }\r
+\r
+               // We ended someplace up the tree so do a sibling check\r
+               return i === al ?\r
+                       siblingCheck( a, bp[i], -1 ) :\r
+                       siblingCheck( ap[i], b, 1 );\r
+       };\r
+\r
+       siblingCheck = function( a, b, ret ) {\r
+               if ( a === b ) {\r
+                       return ret;\r
+               }\r
+\r
+               var cur = a.nextSibling;\r
+\r
+               while ( cur ) {\r
+                       if ( cur === b ) {\r
+                               return -1;\r
+                       }\r
+\r
+                       cur = cur.nextSibling;\r
+               }\r
+\r
+               return 1;\r
+       };\r
+}\r
+\r
+// Document sorting and removing duplicates\r
+Sizzle.uniqueSort = function( results ) {\r
+       var elem,\r
+               i = 1;\r
+\r
+       if ( sortOrder ) {\r
+               hasDuplicate = baseHasDuplicate;\r
+               results.sort( sortOrder );\r
+\r
+               if ( hasDuplicate ) {\r
+                       for ( ; (elem = results[i]); i++ ) {\r
+                               if ( elem === results[ i - 1 ] ) {\r
+                                       results.splice( i--, 1 );\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return results;\r
+};\r
+\r
+function multipleContexts( selector, contexts, results, seed ) {\r
+       var i = 0,\r
+               len = contexts.length;\r
+       for ( ; i < len; i++ ) {\r
+               Sizzle( selector, contexts[i], results, seed );\r
+       }\r
+}\r
+\r
+function handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {\r
+       var results,\r
+               fn = Expr.setFilters[ posfilter.toLowerCase() ];\r
+\r
+       if ( !fn ) {\r
+               Sizzle.error( posfilter );\r
+       }\r
+\r
+       if ( selector || !(results = seed) ) {\r
+               multipleContexts( selector || "*", contexts, (results = []), seed );\r
+       }\r
+\r
+       return results.length > 0 ? fn( results, argument, not ) : [];\r
+}\r
+\r
+function handlePOS( selector, context, results, seed, groups ) {\r
+       var match, not, anchor, ret, elements, currentContexts, part, lastIndex,\r
+               i = 0,\r
+               len = groups.length,\r
+               rpos = matchExpr["POS"],\r
+               // This is generated here in case matchExpr["POS"] is extended\r
+               rposgroups = new RegExp( "^" + rpos.source + "(?!" + whitespace + ")", "i" ),\r
+               // This is for making sure non-participating\r
+               // matching groups are represented cross-browser (IE6-8)\r
+               setUndefined = function() {\r
+                       var i = 1,\r
+                               len = arguments.length - 2;\r
+                       for ( ; i < len; i++ ) {\r
+                               if ( arguments[i] === undefined ) {\r
+                                       match[i] = undefined;\r
+                               }\r
+                       }\r
+               };\r
+\r
+       for ( ; i < len; i++ ) {\r
+               // Reset regex index to 0\r
+               rpos.exec("");\r
+               selector = groups[i];\r
+               ret = [];\r
+               anchor = 0;\r
+               elements = seed;\r
+               while ( (match = rpos.exec( selector )) ) {\r
+                       lastIndex = rpos.lastIndex = match.index + match[0].length;\r
+                       if ( lastIndex > anchor ) {\r
+                               part = selector.slice( anchor, match.index );\r
+                               anchor = lastIndex;\r
+                               currentContexts = [ context ];\r
+\r
+                               if ( rcombinators.test(part) ) {\r
+                                       if ( elements ) {\r
+                                               currentContexts = elements;\r
+                                       }\r
+                                       elements = seed;\r
+                               }\r
+\r
+                               if ( (not = rendsWithNot.test( part )) ) {\r
+                                       part = part.slice( 0, -5 ).replace( rcombinators, "$&*" );\r
+                               }\r
+\r
+                               if ( match.length > 1 ) {\r
+                                       match[0].replace( rposgroups, setUndefined );\r
+                               }\r
+                               elements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );\r
+                       }\r
+               }\r
+\r
+               if ( elements ) {\r
+                       ret = ret.concat( elements );\r
+\r
+                       if ( (part = selector.slice( anchor )) && part !== ")" ) {\r
+                               if ( rcombinators.test(part) ) {\r
+                                       multipleContexts( part, ret, results, seed );\r
+                               } else {\r
+                                       Sizzle( part, context, results, seed ? seed.concat(elements) : elements );\r
+                               }\r
+                       } else {\r
+                               push.apply( results, ret );\r
+                       }\r
+               } else {\r
+                       Sizzle( selector, context, results, seed );\r
+               }\r
+       }\r
+\r
+       // Do not sort if this is a single filter\r
+       return len === 1 ? results : Sizzle.uniqueSort( results );\r
+}\r
+\r
+function tokenize( selector, context, xml ) {\r
+       var tokens, soFar, type,\r
+               groups = [],\r
+               i = 0,\r
+\r
+               // Catch obvious selector issues: terminal ")"; nonempty fallback match\r
+               // rselector never fails to match *something*\r
+               match = rselector.exec( selector ),\r
+               matched = !match.pop() && !match.pop(),\r
+               selectorGroups = matched && selector.match( rgroups ) || [""],\r
+\r
+               preFilters = Expr.preFilter,\r
+               filters = Expr.filter,\r
+               checkContext = !xml && context !== document;\r
+\r
+       for ( ; (soFar = selectorGroups[i]) != null && matched; i++ ) {\r
+               groups.push( tokens = [] );\r
+\r
+               // Need to make sure we're within a narrower context if necessary\r
+               // Adding a descendant combinator will generate what is needed\r
+               if ( checkContext ) {\r
+                       soFar = " " + soFar;\r
+               }\r
+\r
+               while ( soFar ) {\r
+                       matched = false;\r
+\r
+                       // Combinators\r
+                       if ( (match = rcombinators.exec( soFar )) ) {\r
+                               soFar = soFar.slice( match[0].length );\r
+\r
+                               // Cast descendant combinators to space\r
+                               matched = tokens.push({ part: match.pop().replace( rtrim, " " ), captures: match });\r
+                       }\r
+\r
+                       // Filters\r
+                       for ( type in filters ) {\r
+                               if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r
+                                       (match = preFilters[ type ]( match, context, xml )) ) ) {\r
+\r
+                                       soFar = soFar.slice( match.shift().length );\r
+                                       matched = tokens.push({ part: type, captures: match });\r
+                               }\r
+                       }\r
+\r
+                       if ( !matched ) {\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if ( !matched ) {\r
+               Sizzle.error( selector );\r
+       }\r
+\r
+       return groups;\r
+}\r
+\r
+function addCombinator( matcher, combinator, context ) {\r
+       var dir = combinator.dir,\r
+               doneName = done++;\r
+\r
+       if ( !matcher ) {\r
+               // If there is no matcher to check, check against the context\r
+               matcher = function( elem ) {\r
+                       return elem === context;\r
+               };\r
+       }\r
+       return combinator.first ?\r
+               function( elem, context ) {\r
+                       while ( (elem = elem[ dir ]) ) {\r
+                               if ( elem.nodeType === 1 ) {\r
+                                       return matcher( elem, context ) && elem;\r
+                               }\r
+                       }\r
+               } :\r
+               function( elem, context ) {\r
+                       var cache,\r
+                               dirkey = doneName + "." + dirruns,\r
+                               cachedkey = dirkey + "." + cachedruns;\r
+                       while ( (elem = elem[ dir ]) ) {\r
+                               if ( elem.nodeType === 1 ) {\r
+                                       if ( (cache = elem[ expando ]) === cachedkey ) {\r
+                                               return elem.sizset;\r
+                                       } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {\r
+                                               if ( elem.sizset ) {\r
+                                                       return elem;\r
+                                               }\r
+                                       } else {\r
+                                               elem[ expando ] = cachedkey;\r
+                                               if ( matcher( elem, context ) ) {\r
+                                                       elem.sizset = true;\r
+                                                       return elem;\r
+                                               }\r
+                                               elem.sizset = false;\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
+}\r
+\r
+function addMatcher( higher, deeper ) {\r
+       return higher ?\r
+               function( elem, context ) {\r
+                       var result = deeper( elem, context );\r
+                       return result && higher( result === true ? elem : result, context );\r
+               } :\r
+               deeper;\r
+}\r
+\r
+// ["TAG", ">", "ID", " ", "CLASS"]\r
+function matcherFromTokens( tokens, context, xml ) {\r
+       var token, matcher,\r
+               i = 0;\r
+\r
+       for ( ; (token = tokens[i]); i++ ) {\r
+               if ( Expr.relative[ token.part ] ) {\r
+                       matcher = addCombinator( matcher, Expr.relative[ token.part ], context );\r
+               } else {\r
+                       token.captures.push( context, xml );\r
+                       matcher = addMatcher( matcher, Expr.filter[ token.part ].apply( null, token.captures ) );\r
+               }\r
+       }\r
+\r
+       return matcher;\r
+}\r
+\r
+function matcherFromGroupMatchers( matchers ) {\r
+       return function( elem, context ) {\r
+               var matcher,\r
+                       j = 0;\r
+               for ( ; (matcher = matchers[j]); j++ ) {\r
+                       if ( matcher(elem, context) ) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       };\r
+}\r
+\r
+var compile = Sizzle.compile = function( selector, context, xml ) {\r
+       var tokens, group, i,\r
+               cached = compilerCache[ selector ];\r
+\r
+       // Return a cached group function if already generated (context dependent)\r
+       if ( cached && cached.context === context ) {\r
+               return cached;\r
+       }\r
+\r
+       // Generate a function of recursive functions that can be used to check each element\r
+       group = tokenize( selector, context, xml );\r
+       for ( i = 0; (tokens = group[i]); i++ ) {\r
+               group[i] = matcherFromTokens( tokens, context, xml );\r
+       }\r
+\r
+       // Cache the compiled function\r
+       cached = compilerCache[ selector ] = matcherFromGroupMatchers( group );\r
+       cached.context = context;\r
+       cached.runs = cached.dirruns = 0;\r
+       cachedSelectors.push( selector );\r
+       // Ensure only the most recent are cached\r
+       if ( cachedSelectors.length > Expr.cacheLength ) {\r
+               delete compilerCache[ cachedSelectors.shift() ];\r
+       }\r
+       return cached;\r
+};\r
+\r
+Sizzle.matches = function( expr, elements ) {\r
+       return Sizzle( expr, null, null, elements );\r
+};\r
+\r
+Sizzle.matchesSelector = function( elem, expr ) {\r
+       return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
+};\r
+\r
+var select = function( selector, context, results, seed, xml ) {\r
+       // Remove excessive whitespace\r
+       selector = selector.replace( rtrim, "$1" );\r
+       var elements, matcher, i, len, elem, token,\r
+               type, findContext, notTokens,\r
+               match = selector.match( rgroups ),\r
+               tokens = selector.match( rtokens ),\r
+               contextNodeType = context.nodeType;\r
+\r
+       // POS handling\r
+       if ( matchExpr["POS"].test(selector) ) {\r
+               return handlePOS( selector, context, results, seed, match );\r
+       }\r
+\r
+       if ( seed ) {\r
+               elements = slice.call( seed, 0 );\r
+\r
+       // To maintain document order, only narrow the\r
+       // set if there is one group\r
+       } else if ( match && match.length === 1 ) {\r
+\r
+               // Take a shortcut and set the context if the root selector is an ID\r
+               if ( tokens.length > 1 && contextNodeType === 9 && !xml &&\r
+                               (match = matchExpr["ID"].exec( tokens[0] )) ) {\r
+\r
+                       context = Expr.find["ID"]( match[1], context, xml )[0];\r
+                       if ( !context ) {\r
+                               return results;\r
+                       }\r
+\r
+                       selector = selector.slice( tokens.shift().length );\r
+               }\r
+\r
+               findContext = ( (match = rsibling.exec( tokens[0] )) && !match.index && context.parentNode ) || context;\r
+\r
+               // Get the last token, excluding :not\r
+               notTokens = tokens.pop();\r
+               token = notTokens.split(":not")[0];\r
+\r
+               for ( i = 0, len = Expr.order.length; i < len; i++ ) {\r
+                       type = Expr.order[i];\r
+\r
+                       if ( (match = matchExpr[ type ].exec( token )) ) {\r
+                               elements = Expr.find[ type ]( (match[1] || "").replace( rbackslash, "" ), findContext, xml );\r
+\r
+                               if ( elements == null ) {\r
+                                       continue;\r
+                               }\r
+\r
+                               if ( token === notTokens ) {\r
+                                       selector = selector.slice( 0, selector.length - notTokens.length ) +\r
+                                               token.replace( matchExpr[ type ], "" );\r
+\r
+                                       if ( !selector ) {\r
+                                               push.apply( results, slice.call(elements, 0) );\r
+                                       }\r
+                               }\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       // Only loop over the given elements once\r
+       // If selector is empty, we're already done\r
+       if ( selector ) {\r
+               matcher = compile( selector, context, xml );\r
+               dirruns = matcher.dirruns++;\r
+\r
+               if ( elements == null ) {\r
+                       elements = Expr.find["TAG"]( "*", (rsibling.test( selector ) && context.parentNode) || context );\r
+               }\r
+               for ( i = 0; (elem = elements[i]); i++ ) {\r
+                       cachedruns = matcher.runs++;\r
+                       if ( matcher(elem, context) ) {\r
+                               results.push( elem );\r
+                       }\r
+               }\r
+       }\r
+\r
+       return results;\r
+};\r
+\r
+if ( document.querySelectorAll ) {\r
+       (function() {\r
+               var disconnectedMatch,\r
+                       oldSelect = select,\r
+                       rescape = /'|\\/g,\r
+                       rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,\r
+                       rbuggyQSA = [],\r
+                       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\r
+                       // A support test would require too much code (would include document ready)\r
+                       // just skip matchesSelector for :active\r
+                       rbuggyMatches = [":active"],\r
+                       matches = docElem.matchesSelector ||\r
+                               docElem.mozMatchesSelector ||\r
+                               docElem.webkitMatchesSelector ||\r
+                               docElem.oMatchesSelector ||\r
+                               docElem.msMatchesSelector;\r
+\r
+               // Build QSA regex\r
+               // Regex strategy adopted from Diego Perini\r
+               assert(function( div ) {\r
+                       div.innerHTML = "<select><option selected></option></select>";\r
+\r
+                       // IE8 - Some boolean attributes are not treated correctly\r
+                       if ( !div.querySelectorAll("[selected]").length ) {\r
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );\r
+                       }\r
+\r
+                       // Webkit/Opera - :checked should return selected option elements\r
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
+                       // IE8 throws error here (do not put tests after this one)\r
+                       if ( !div.querySelectorAll(":checked").length ) {\r
+                               rbuggyQSA.push(":checked");\r
+                       }\r
+               });\r
+\r
+               assert(function( div ) {\r
+\r
+                       // Opera 10-12/IE9 - ^= $= *= and empty values\r
+                       // Should not select anything\r
+                       div.innerHTML = "<p test=''></p>";\r
+                       if ( div.querySelectorAll("[test^='']").length ) {\r
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );\r
+                       }\r
+\r
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\r
+                       // IE8 throws error here (do not put tests after this one)\r
+                       div.innerHTML = "<input type='hidden'>";\r
+                       if ( !div.querySelectorAll(":enabled").length ) {\r
+                               rbuggyQSA.push(":enabled", ":disabled");\r
+                       }\r
+               });\r
+\r
+               rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );\r
+\r
+               select = function( selector, context, results, seed, xml ) {\r
+                       // Only use querySelectorAll when not filtering,\r
+                       // when this is not xml,\r
+                       // and when no QSA bugs apply\r
+                       if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\r
+                               if ( context.nodeType === 9 ) {\r
+                                       try {\r
+                                               push.apply( results, slice.call(context.querySelectorAll( selector ), 0) );\r
+                                               return results;\r
+                                       } catch(qsaError) {}\r
+                               // qSA works strangely on Element-rooted queries\r
+                               // We can work around this by specifying an extra ID on the root\r
+                               // and working up from there (Thanks to Andrew Dupont for the technique)\r
+                               // IE 8 doesn't work on object elements\r
+                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {\r
+                                       var old = context.getAttribute("id"),\r
+                                               nid = old || expando,\r
+                                               newContext = rsibling.test( selector ) && context.parentNode || context;\r
+\r
+                                       if ( old ) {\r
+                                               nid = nid.replace( rescape, "\\$&" );\r
+                                       } else {\r
+                                               context.setAttribute( "id", nid );\r
+                                       }\r
+\r
+                                       try {\r
+                                               push.apply( results, slice.call( newContext.querySelectorAll(\r
+                                                       selector.replace( rgroups, "[id='" + nid + "'] $&" )\r
+                                               ), 0 ) );\r
+                                               return results;\r
+                                       } catch(qsaError) {\r
+                                       } finally {\r
+                                               if ( !old ) {\r
+                                                       context.removeAttribute("id");\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return oldSelect( selector, context, results, seed, xml );\r
+               };\r
+\r
+               if ( matches ) {\r
+                       assert(function( div ) {\r
+                               // Check to see if it's possible to do matchesSelector\r
+                               // on a disconnected node (IE 9)\r
+                               disconnectedMatch = matches.call( div, "div" );\r
+\r
+                               // This should fail with an exception\r
+                               // Gecko does not error, returns false instead\r
+                               try {\r
+                                       matches.call( div, "[test!='']:sizzle" );\r
+                                       rbuggyMatches.push( Expr.match.PSEUDO );\r
+                               } catch ( e ) {}\r
+                       });\r
+\r
+                       // rbuggyMatches always contains :active, so no need for a length check\r
+                       rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );\r
+\r
+                       Sizzle.matchesSelector = function( elem, expr ) {\r
+                               // Make sure that attribute selectors are quoted\r
+                               expr = expr.replace( rattributeQuotes, "='$1']" );\r
+\r
+                               // rbuggyMatches always contains :active, so no need for an existence check\r
+                               if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {\r
+                                       try {\r
+                                               var ret = matches.call( elem, expr );\r
+\r
+                                               // IE 9's matchesSelector returns false on disconnected nodes\r
+                                               if ( ret || disconnectedMatch ||\r
+                                                               // As well, disconnected nodes are said to be in a document\r
+                                                               // fragment in IE 9\r
+                                                               elem.document && elem.document.nodeType !== 11 ) {\r
+                                                       return ret;\r
+                                               }\r
+                                       } catch(e) {}\r
+                               }\r
+\r
+                               return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
+                       };\r
+               }\r
+       })();\r
+}\r
+\r
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+\r
+\r
+})( window );\r
+var runtil = /Until$/,
+       rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       isSimple = /^.[^:#\[\.,]*$/,
+       rneedsContext = jQuery.expr.match.needsContext,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
 
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i, l, length, n, r, ret,
+                       self = this;
 
-
-/*!
- * Sizzle CSS Selector Engine
- *  Copyright 2011, The Dojo Foundation
- *  Released under the MIT, BSD, and GPL Licenses.
- *  More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
-       expando = "sizcache" + (Math.random() + '').replace('.', ''),
-       done = 0,
-       toString = Object.prototype.toString,
-       hasDuplicate = false,
-       baseHasDuplicate = true,
-       rBackslash = /\\/g,
-       rReturn = /\r\n/g,
-       rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-//   Thus far that includes Google Chrome.
-[0, 0].sort(function() {
-       baseHasDuplicate = false;
-       return 0;
-});
-
-var Sizzle = function( selector, context, results, seed ) {
-       results = results || [];
-       context = context || document;
-
-       var origContext = context;
-
-       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
-               return [];
-       }
-
-       if ( !selector || typeof selector !== "string" ) {
-               return results;
-       }
-
-       var m, set, checkSet, extra, ret, cur, pop, i,
-               prune = true,
-               contextXML = Sizzle.isXML( context ),
-               parts = [],
-               soFar = selector;
-
-       // Reset the position of the chunker regexp (start from head)
-       do {
-               chunker.exec( "" );
-               m = chunker.exec( soFar );
-
-               if ( m ) {
-                       soFar = m[3];
-
-                       parts.push( m[1] );
-
-                       if ( m[2] ) {
-                               extra = m[3];
-                               break;
-                       }
+               if ( typeof selector !== "string" ) {
+                       return jQuery( selector ).filter(function() {
+                               for ( i = 0, l = self.length; i < l; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       });
                }
-       } while ( m );
-
-       if ( parts.length > 1 && origPOS.exec( selector ) ) {
 
-               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
-                       set = posProcess( parts[0] + parts[1], context, seed );
+               ret = this.pushStack( "", "find", selector );
 
-               } else {
-                       set = Expr.relative[ parts[0] ] ?
-                               [ context ] :
-                               Sizzle( parts.shift(), context );
-
-                       while ( parts.length ) {
-                               selector = parts.shift();
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       length = ret.length;
+                       jQuery.find( selector, this[i], ret );
 
-                               if ( Expr.relative[ selector ] ) {
-                                       selector += parts.shift();
+                       if ( i > 0 ) {
+                               // Make sure that the results are unique
+                               for ( n = length; n < ret.length; n++ ) {
+                                       for ( r = 0; r < length; r++ ) {
+                                               if ( ret[r] === ret[n] ) {
+                                                       ret.splice(n--, 1);
+                                                       break;
+                                               }
+                                       }
                                }
-
-                               set = posProcess( selector, set, seed );
                        }
                }
 
-       } else {
-               // Take a shortcut and set the context if the root selector is an ID
-               // (but not if it'll be faster if the inner selector is an ID)
-               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
-                               Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
-                       ret = Sizzle.find( parts.shift(), context, contextXML );
-                       context = ret.expr ?
-                               Sizzle.filter( ret.expr, ret.set )[0] :
-                               ret.set[0];
-               }
-
-               if ( context ) {
-                       ret = seed ?
-                               { expr: parts.pop(), set: makeArray(seed) } :
-                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
-                       set = ret.expr ?
-                               Sizzle.filter( ret.expr, ret.set ) :
-                               ret.set;
-
-                       if ( parts.length > 0 ) {
-                               checkSet = makeArray( set );
-
-                       } else {
-                               prune = false;
-                       }
-
-                       while ( parts.length ) {
-                               cur = parts.pop();
-                               pop = cur;
+               return ret;
+       },
 
-                               if ( !Expr.relative[ cur ] ) {
-                                       cur = "";
-                               } else {
-                                       pop = parts.pop();
-                               }
+       has: function( target ) {
+               var i,
+                       targets = jQuery( target, this ),
+                       len = targets.length;
 
-                               if ( pop == null ) {
-                                       pop = context;
+               return this.filter(function() {
+                       for ( i = 0; i < len; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
                                }
-
-                               Expr.relative[ cur ]( checkSet, pop, contextXML );
                        }
+               });
+       },
 
-               } else {
-                       checkSet = parts = [];
-               }
-       }
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector, false), "not", selector);
+       },
 
-       if ( !checkSet ) {
-               checkSet = set;
-       }
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
+       },
 
-       if ( !checkSet ) {
-               Sizzle.error( cur || selector );
-       }
+       is: function( selector ) {
+               return !!selector && (
+                       typeof selector === "string" ?
+                               // If this is a positional/relative selector, check membership in the returned set
+                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                               rneedsContext.test( selector ) ?
+                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
+                                       jQuery.filter( selector, this ).length > 0 :
+                               this.filter( selector ).length > 0 );
+       },
 
-       if ( toString.call(checkSet) === "[object Array]" ) {
-               if ( !prune ) {
-                       results.push.apply( results, checkSet );
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       ret = [],
+                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
 
-               } else if ( context && context.nodeType === 1 ) {
-                       for ( i = 0; checkSet[i] != null; i++ ) {
-                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
-                                       results.push( set[i] );
-                               }
-                       }
+               for ( ; i < l; i++ ) {
+                       cur = this[i];
 
-               } else {
-                       for ( i = 0; checkSet[i] != null; i++ ) {
-                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
-                                       results.push( set[i] );
+                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+                                       ret.push( cur );
+                                       break;
                                }
+                               cur = cur.parentNode;
                        }
                }
 
-       } else {
-               makeArray( checkSet, results );
-       }
+               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
 
-       if ( extra ) {
-               Sizzle( extra, origContext, results, seed );
-               Sizzle.uniqueSort( results );
-       }
+               return this.pushStack( ret, "closest", selectors );
+       },
 
-       return results;
-};
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
 
-Sizzle.uniqueSort = function( results ) {
-       if ( sortOrder ) {
-               hasDuplicate = baseHasDuplicate;
-               results.sort( sortOrder );
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+               }
 
-               if ( hasDuplicate ) {
-                       for ( var i = 1; i < results.length; i++ ) {
-                               if ( results[i] === results[ i - 1 ] ) {
-                                       results.splice( i--, 1 );
-                               }
-                       }
-               }
-       }
-
-       return results;
-};
-
-Sizzle.matches = function( expr, set ) {
-       return Sizzle( expr, null, null, set );
-};
-
-Sizzle.matchesSelector = function( node, expr ) {
-       return Sizzle( expr, null, null, [node] ).length > 0;
-};
-
-Sizzle.find = function( expr, context, isXML ) {
-       var set, i, len, match, type, left;
-
-       if ( !expr ) {
-               return [];
-       }
-
-       for ( i = 0, len = Expr.order.length; i < len; i++ ) {
-               type = Expr.order[i];
-
-               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
-                       left = match[1];
-                       match.splice( 1, 1 );
-
-                       if ( left.substr( left.length - 1 ) !== "\\" ) {
-                               match[1] = (match[1] || "").replace( rBackslash, "" );
-                               set = Expr.find[ type ]( match, context, isXML );
-
-                               if ( set != null ) {
-                                       expr = expr.replace( Expr.match[ type ], "" );
-                                       break;
-                               }
-                       }
-               }
-       }
-
-       if ( !set ) {
-               set = typeof context.getElementsByTagName !== "undefined" ?
-                       context.getElementsByTagName( "*" ) :
-                       [];
-       }
-
-       return { set: set, expr: expr };
-};
-
-Sizzle.filter = function( expr, set, inplace, not ) {
-       var match, anyFound,
-               type, found, item, filter, left,
-               i, pass,
-               old = expr,
-               result = [],
-               curLoop = set,
-               isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
-       while ( expr && set.length ) {
-               for ( type in Expr.filter ) {
-                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
-                               filter = Expr.filter[ type ];
-                               left = match[1];
-
-                               anyFound = false;
-
-                               match.splice(1,1);
-
-                               if ( left.substr( left.length - 1 ) === "\\" ) {
-                                       continue;
-                               }
-
-                               if ( curLoop === result ) {
-                                       result = [];
-                               }
-
-                               if ( Expr.preFilter[ type ] ) {
-                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
-                                       if ( !match ) {
-                                               anyFound = found = true;
-
-                                       } else if ( match === true ) {
-                                               continue;
-                                       }
-                               }
-
-                               if ( match ) {
-                                       for ( i = 0; (item = curLoop[i]) != null; i++ ) {
-                                               if ( item ) {
-                                                       found = filter( item, match, i, curLoop );
-                                                       pass = not ^ found;
-
-                                                       if ( inplace && found != null ) {
-                                                               if ( pass ) {
-                                                                       anyFound = true;
-
-                                                               } else {
-                                                                       curLoop[i] = false;
-                                                               }
-
-                                                       } else if ( pass ) {
-                                                               result.push( item );
-                                                               anyFound = true;
-                                                       }
-                                               }
-                                       }
-                               }
-
-                               if ( found !== undefined ) {
-                                       if ( !inplace ) {
-                                               curLoop = result;
-                                       }
-
-                                       expr = expr.replace( Expr.match[ type ], "" );
-
-                                       if ( !anyFound ) {
-                                               return [];
-                                       }
-
-                                       break;
-                               }
-                       }
-               }
-
-               // Improper expression
-               if ( expr === old ) {
-                       if ( anyFound == null ) {
-                               Sizzle.error( expr );
-
-                       } else {
-                               break;
-                       }
-               }
-
-               old = expr;
-       }
-
-       return curLoop;
-};
-
-Sizzle.error = function( msg ) {
-       throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Utility function for retreiving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-var getText = Sizzle.getText = function( elem ) {
-    var i, node,
-               nodeType = elem.nodeType,
-               ret = "";
-
-       if ( nodeType ) {
-               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-                       // Use textContent || innerText for elements
-                       if ( typeof elem.textContent === 'string' ) {
-                               return elem.textContent;
-                       } else if ( typeof elem.innerText === 'string' ) {
-                               // Replace IE's carriage returns
-                               return elem.innerText.replace( rReturn, '' );
-                       } else {
-                               // Traverse it's children
-                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
-                                       ret += getText( elem );
-                               }
-                       }
-               } else if ( nodeType === 3 || nodeType === 4 ) {
-                       return elem.nodeValue;
-               }
-       } else {
-
-               // If no nodeType, this is expected to be an array
-               for ( i = 0; (node = elem[i]); i++ ) {
-                       // Do not traverse comment nodes
-                       if ( node.nodeType !== 8 ) {
-                               ret += getText( node );
-                       }
-               }
-       }
-       return ret;
-};
-
-var Expr = Sizzle.selectors = {
-       order: [ "ID", "NAME", "TAG" ],
-
-       match: {
-               ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-               CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
-               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
-               TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
-               CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
-               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
-               PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
-       },
-
-       leftMatch: {},
-
-       attrMap: {
-               "class": "className",
-               "for": "htmlFor"
-       },
-
-       attrHandle: {
-               href: function( elem ) {
-                       return elem.getAttribute( "href" );
-               },
-               type: function( elem ) {
-                       return elem.getAttribute( "type" );
-               }
-       },
-
-       relative: {
-               "+": function(checkSet, part){
-                       var isPartStr = typeof part === "string",
-                               isTag = isPartStr && !rNonWord.test( part ),
-                               isPartStrNotTag = isPartStr && !isTag;
-
-                       if ( isTag ) {
-                               part = part.toLowerCase();
-                       }
-
-                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
-                               if ( (elem = checkSet[i]) ) {
-                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
-                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
-                                               elem || false :
-                                               elem === part;
-                               }
-                       }
-
-                       if ( isPartStrNotTag ) {
-                               Sizzle.filter( part, checkSet, true );
-                       }
-               },
-
-               ">": function( checkSet, part ) {
-                       var elem,
-                               isPartStr = typeof part === "string",
-                               i = 0,
-                               l = checkSet.length;
-
-                       if ( isPartStr && !rNonWord.test( part ) ) {
-                               part = part.toLowerCase();
-
-                               for ( ; i < l; i++ ) {
-                                       elem = checkSet[i];
-
-                                       if ( elem ) {
-                                               var parent = elem.parentNode;
-                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
-                                       }
-                               }
-
-                       } else {
-                               for ( ; i < l; i++ ) {
-                                       elem = checkSet[i];
-
-                                       if ( elem ) {
-                                               checkSet[i] = isPartStr ?
-                                                       elem.parentNode :
-                                                       elem.parentNode === part;
-                                       }
-                               }
-
-                               if ( isPartStr ) {
-                                       Sizzle.filter( part, checkSet, true );
-                               }
-                       }
-               },
-
-               "": function(checkSet, part, isXML){
-                       var nodeCheck,
-                               doneName = done++,
-                               checkFn = dirCheck;
-
-                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
-                               part = part.toLowerCase();
-                               nodeCheck = part;
-                               checkFn = dirNodeCheck;
-                       }
-
-                       checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
-               },
-
-               "~": function( checkSet, part, isXML ) {
-                       var nodeCheck,
-                               doneName = done++,
-                               checkFn = dirCheck;
-
-                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
-                               part = part.toLowerCase();
-                               nodeCheck = part;
-                               checkFn = dirNodeCheck;
-                       }
-
-                       checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
-               }
-       },
-
-       find: {
-               ID: function( match, context, isXML ) {
-                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
-                               var m = context.getElementById(match[1]);
-                               // Check parentNode to catch when Blackberry 4.6 returns
-                               // nodes that are no longer in the document #6963
-                               return m && m.parentNode ? [m] : [];
-                       }
-               },
-
-               NAME: function( match, context ) {
-                       if ( typeof context.getElementsByName !== "undefined" ) {
-                               var ret = [],
-                                       results = context.getElementsByName( match[1] );
-
-                               for ( var i = 0, l = results.length; i < l; i++ ) {
-                                       if ( results[i].getAttribute("name") === match[1] ) {
-                                               ret.push( results[i] );
-                                       }
-                               }
-
-                               return ret.length === 0 ? null : ret;
-                       }
-               },
-
-               TAG: function( match, context ) {
-                       if ( typeof context.getElementsByTagName !== "undefined" ) {
-                               return context.getElementsByTagName( match[1] );
-                       }
-               }
-       },
-       preFilter: {
-               CLASS: function( match, curLoop, inplace, result, not, isXML ) {
-                       match = " " + match[1].replace( rBackslash, "" ) + " ";
-
-                       if ( isXML ) {
-                               return match;
-                       }
-
-                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
-                               if ( elem ) {
-                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
-                                               if ( !inplace ) {
-                                                       result.push( elem );
-                                               }
-
-                                       } else if ( inplace ) {
-                                               curLoop[i] = false;
-                                       }
-                               }
-                       }
-
-                       return false;
-               },
-
-               ID: function( match ) {
-                       return match[1].replace( rBackslash, "" );
-               },
-
-               TAG: function( match, curLoop ) {
-                       return match[1].replace( rBackslash, "" ).toLowerCase();
-               },
-
-               CHILD: function( match ) {
-                       if ( match[1] === "nth" ) {
-                               if ( !match[2] ) {
-                                       Sizzle.error( match[0] );
-                               }
-
-                               match[2] = match[2].replace(/^\+|\s*/g, '');
-
-                               // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
-                               var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
-                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
-                                       !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
-                               // calculate the numbers (first)n+(last) including if they are negative
-                               match[2] = (test[1] + (test[2] || 1)) - 0;
-                               match[3] = test[3] - 0;
-                       }
-                       else if ( match[2] ) {
-                               Sizzle.error( match[0] );
-                       }
-
-                       // TODO: Move to normal caching system
-                       match[0] = done++;
-
-                       return match;
-               },
-
-               ATTR: function( match, curLoop, inplace, result, not, isXML ) {
-                       var name = match[1] = match[1].replace( rBackslash, "" );
-
-                       if ( !isXML && Expr.attrMap[name] ) {
-                               match[1] = Expr.attrMap[name];
-                       }
-
-                       // Handle if an un-quoted value was used
-                       match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
-                       if ( match[2] === "~=" ) {
-                               match[4] = " " + match[4] + " ";
-                       }
-
-                       return match;
-               },
-
-               PSEUDO: function( match, curLoop, inplace, result, not ) {
-                       if ( match[1] === "not" ) {
-                               // If we're dealing with a complex expression, or a simple one
-                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
-                                       match[3] = Sizzle(match[3], null, null, curLoop);
-
-                               } else {
-                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
-
-                                       if ( !inplace ) {
-                                               result.push.apply( result, ret );
-                                       }
-
-                                       return false;
-                               }
-
-                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
-                               return true;
-                       }
-
-                       return match;
-               },
-
-               POS: function( match ) {
-                       match.unshift( true );
-
-                       return match;
-               }
-       },
-
-       filters: {
-               enabled: function( elem ) {
-                       return elem.disabled === false && elem.type !== "hidden";
-               },
-
-               disabled: function( elem ) {
-                       return elem.disabled === true;
-               },
-
-               checked: function( elem ) {
-                       return elem.checked === true;
-               },
-
-               selected: function( elem ) {
-                       // Accessing this property makes selected-by-default
-                       // options in Safari work properly
-                       if ( elem.parentNode ) {
-                               elem.parentNode.selectedIndex;
-                       }
-
-                       return elem.selected === true;
-               },
-
-               parent: function( elem ) {
-                       return !!elem.firstChild;
-               },
-
-               empty: function( elem ) {
-                       return !elem.firstChild;
-               },
-
-               has: function( elem, i, match ) {
-                       return !!Sizzle( match[3], elem ).length;
-               },
-
-               header: function( elem ) {
-                       return (/h\d/i).test( elem.nodeName );
-               },
-
-               text: function( elem ) {
-                       var attr = elem.getAttribute( "type" ), type = elem.type;
-                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
-                       // use getAttribute instead to test this case
-                       return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
-               },
-
-               radio: function( elem ) {
-                       return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
-               },
-
-               checkbox: function( elem ) {
-                       return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
-               },
-
-               file: function( elem ) {
-                       return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
-               },
-
-               password: function( elem ) {
-                       return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
-               },
-
-               submit: function( elem ) {
-                       var name = elem.nodeName.toLowerCase();
-                       return (name === "input" || name === "button") && "submit" === elem.type;
-               },
-
-               image: function( elem ) {
-                       return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
-               },
-
-               reset: function( elem ) {
-                       var name = elem.nodeName.toLowerCase();
-                       return (name === "input" || name === "button") && "reset" === elem.type;
-               },
-
-               button: function( elem ) {
-                       var name = elem.nodeName.toLowerCase();
-                       return name === "input" && "button" === elem.type || name === "button";
-               },
-
-               input: function( elem ) {
-                       return (/input|select|textarea|button/i).test( elem.nodeName );
-               },
-
-               focus: function( elem ) {
-                       return elem === elem.ownerDocument.activeElement;
-               }
-       },
-       setFilters: {
-               first: function( elem, i ) {
-                       return i === 0;
-               },
-
-               last: function( elem, i, match, array ) {
-                       return i === array.length - 1;
-               },
-
-               even: function( elem, i ) {
-                       return i % 2 === 0;
-               },
-
-               odd: function( elem, i ) {
-                       return i % 2 === 1;
-               },
-
-               lt: function( elem, i, match ) {
-                       return i < match[3] - 0;
-               },
-
-               gt: function( elem, i, match ) {
-                       return i > match[3] - 0;
-               },
-
-               nth: function( elem, i, match ) {
-                       return match[3] - 0 === i;
-               },
-
-               eq: function( elem, i, match ) {
-                       return match[3] - 0 === i;
-               }
-       },
-       filter: {
-               PSEUDO: function( elem, match, i, array ) {
-                       var name = match[1],
-                               filter = Expr.filters[ name ];
-
-                       if ( filter ) {
-                               return filter( elem, i, match, array );
-
-                       } else if ( name === "contains" ) {
-                               return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
-
-                       } else if ( name === "not" ) {
-                               var not = match[3];
-
-                               for ( var j = 0, l = not.length; j < l; j++ ) {
-                                       if ( not[j] === elem ) {
-                                               return false;
-                                       }
-                               }
-
-                               return true;
-
-                       } else {
-                               Sizzle.error( name );
-                       }
-               },
-
-               CHILD: function( elem, match ) {
-                       var first, last,
-                               doneName, parent, cache,
-                               count, diff,
-                               type = match[1],
-                               node = elem;
-
-                       switch ( type ) {
-                               case "only":
-                               case "first":
-                                       while ( (node = node.previousSibling) ) {
-                                               if ( node.nodeType === 1 ) {
-                                                       return false;
-                                               }
-                                       }
-
-                                       if ( type === "first" ) {
-                                               return true;
-                                       }
-
-                                       node = elem;
-
-                                       /* falls through */
-                               case "last":
-                                       while ( (node = node.nextSibling) ) {
-                                               if ( node.nodeType === 1 ) {
-                                                       return false;
-                                               }
-                                       }
-
-                                       return true;
-
-                               case "nth":
-                                       first = match[2];
-                                       last = match[3];
-
-                                       if ( first === 1 && last === 0 ) {
-                                               return true;
-                                       }
-
-                                       doneName = match[0];
-                                       parent = elem.parentNode;
-
-                                       if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
-                                               count = 0;
-
-                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
-                                                       if ( node.nodeType === 1 ) {
-                                                               node.nodeIndex = ++count;
-                                                       }
-                                               }
-
-                                               parent[ expando ] = doneName;
-                                       }
-
-                                       diff = elem.nodeIndex - last;
-
-                                       if ( first === 0 ) {
-                                               return diff === 0;
-
-                                       } else {
-                                               return ( diff % first === 0 && diff / first >= 0 );
-                                       }
-                       }
-               },
-
-               ID: function( elem, match ) {
-                       return elem.nodeType === 1 && elem.getAttribute("id") === match;
-               },
-
-               TAG: function( elem, match ) {
-                       return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
-               },
-
-               CLASS: function( elem, match ) {
-                       return (" " + (elem.className || elem.getAttribute("class")) + " ")
-                               .indexOf( match ) > -1;
-               },
-
-               ATTR: function( elem, match ) {
-                       var name = match[1],
-                               result = Sizzle.attr ?
-                                       Sizzle.attr( elem, name ) :
-                                       Expr.attrHandle[ name ] ?
-                                       Expr.attrHandle[ name ]( elem ) :
-                                       elem[ name ] != null ?
-                                               elem[ name ] :
-                                               elem.getAttribute( name ),
-                               value = result + "",
-                               type = match[2],
-                               check = match[4];
-
-                       return result == null ?
-                               type === "!=" :
-                               !type && Sizzle.attr ?
-                               result != null :
-                               type === "=" ?
-                               value === check :
-                               type === "*=" ?
-                               value.indexOf(check) >= 0 :
-                               type === "~=" ?
-                               (" " + value + " ").indexOf(check) >= 0 :
-                               !check ?
-                               value && result !== false :
-                               type === "!=" ?
-                               value !== check :
-                               type === "^=" ?
-                               value.indexOf(check) === 0 :
-                               type === "$=" ?
-                               value.substr(value.length - check.length) === check :
-                               type === "|=" ?
-                               value === check || value.substr(0, check.length + 1) === check + "-" :
-                               false;
-               },
-
-               POS: function( elem, match, i, array ) {
-                       var name = match[2],
-                               filter = Expr.setFilters[ name ];
-
-                       if ( filter ) {
-                               return filter( elem, i, match, array );
-                       }
-               }
-       }
-};
-
-var origPOS = Expr.match.POS,
-       fescape = function(all, num){
-               return "\\" + (num - 0 + 1);
-       };
-
-for ( var type in Expr.match ) {
-       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
-       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
-}
-// Expose origPOS
-// "global" as in regardless of relation to brackets/parens
-Expr.match.globalPOS = origPOS;
-
-var makeArray = function( array, results ) {
-       array = Array.prototype.slice.call( array, 0 );
-
-       if ( results ) {
-               results.push.apply( results, array );
-               return results;
-       }
-
-       return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-try {
-       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
-} catch( e ) {
-       makeArray = function( array, results ) {
-               var i = 0,
-                       ret = results || [];
-
-               if ( toString.call(array) === "[object Array]" ) {
-                       Array.prototype.push.apply( ret, array );
-
-               } else {
-                       if ( typeof array.length === "number" ) {
-                               for ( var l = array.length; i < l; i++ ) {
-                                       ret.push( array[i] );
-                               }
-
-                       } else {
-                               for ( ; array[i]; i++ ) {
-                                       ret.push( array[i] );
-                               }
-                       }
-               }
-
-               return ret;
-       };
-}
-
-var sortOrder, siblingCheck;
-
-if ( document.documentElement.compareDocumentPosition ) {
-       sortOrder = function( a, b ) {
-               if ( a === b ) {
-                       hasDuplicate = true;
-                       return 0;
-               }
-
-               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
-                       return a.compareDocumentPosition ? -1 : 1;
-               }
-
-               return a.compareDocumentPosition(b) & 4 ? -1 : 1;
-       };
-
-} else {
-       sortOrder = function( a, b ) {
-               // The nodes are identical, we can exit early
-               if ( a === b ) {
-                       hasDuplicate = true;
-                       return 0;
-
-               // Fallback to using sourceIndex (in IE) if it's available on both nodes
-               } else if ( a.sourceIndex && b.sourceIndex ) {
-                       return a.sourceIndex - b.sourceIndex;
-               }
-
-               var al, bl,
-                       ap = [],
-                       bp = [],
-                       aup = a.parentNode,
-                       bup = b.parentNode,
-                       cur = aup;
-
-               // If the nodes are siblings (or identical) we can do a quick check
-               if ( aup === bup ) {
-                       return siblingCheck( a, b );
-
-               // If no parents were found then the nodes are disconnected
-               } else if ( !aup ) {
-                       return -1;
-
-               } else if ( !bup ) {
-                       return 1;
-               }
-
-               // Otherwise they're somewhere else in the tree so we need
-               // to build up a full list of the parentNodes for comparison
-               while ( cur ) {
-                       ap.unshift( cur );
-                       cur = cur.parentNode;
-               }
-
-               cur = bup;
-
-               while ( cur ) {
-                       bp.unshift( cur );
-                       cur = cur.parentNode;
-               }
-
-               al = ap.length;
-               bl = bp.length;
-
-               // Start walking down the tree looking for a discrepancy
-               for ( var i = 0; i < al && i < bl; i++ ) {
-                       if ( ap[i] !== bp[i] ) {
-                               return siblingCheck( ap[i], bp[i] );
-                       }
-               }
-
-               // We ended someplace up the tree so do a sibling check
-               return i === al ?
-                       siblingCheck( a, bp[i], -1 ) :
-                       siblingCheck( ap[i], b, 1 );
-       };
-
-       siblingCheck = function( a, b, ret ) {
-               if ( a === b ) {
-                       return ret;
-               }
-
-               var cur = a.nextSibling;
-
-               while ( cur ) {
-                       if ( cur === b ) {
-                               return -1;
-                       }
-
-                       cur = cur.nextSibling;
-               }
-
-               return 1;
-       };
-}
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
-       // We're going to inject a fake input element with a specified name
-       var form = document.createElement("div"),
-               id = "script" + (new Date()).getTime(),
-               root = document.documentElement;
-
-       form.innerHTML = "<a name='" + id + "'/>";
-
-       // Inject it into the root element, check its status, and remove it quickly
-       root.insertBefore( form, root.firstChild );
-
-       // The workaround has to do additional checks after a getElementById
-       // Which slows things down for other browsers (hence the branching)
-       if ( document.getElementById( id ) ) {
-               Expr.find.ID = function( match, context, isXML ) {
-                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
-                               var m = context.getElementById(match[1]);
-
-                               return m ?
-                                       m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
-                                               [m] :
-                                               undefined :
-                                       [];
-                       }
-               };
-
-               Expr.filter.ID = function( elem, match ) {
-                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-
-                       return elem.nodeType === 1 && node && node.nodeValue === match;
-               };
-       }
-
-       root.removeChild( form );
-
-       // release memory in IE
-       root = form = null;
-})();
-
-(function(){
-       // Check to see if the browser returns only elements
-       // when doing getElementsByTagName("*")
-
-       // Create a fake element
-       var div = document.createElement("div");
-       div.appendChild( document.createComment("") );
-
-       // Make sure no comments are found
-       if ( div.getElementsByTagName("*").length > 0 ) {
-               Expr.find.TAG = function( match, context ) {
-                       var results = context.getElementsByTagName( match[1] );
-
-                       // Filter out possible comments
-                       if ( match[1] === "*" ) {
-                               var tmp = [];
-
-                               for ( var i = 0; results[i]; i++ ) {
-                                       if ( results[i].nodeType === 1 ) {
-                                               tmp.push( results[i] );
-                                       }
-                               }
-
-                               results = tmp;
-                       }
-
-                       return results;
-               };
-       }
-
-       // Check to see if an attribute returns normalized href attributes
-       div.innerHTML = "<a href='#'></a>";
-
-       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
-                       div.firstChild.getAttribute("href") !== "#" ) {
-
-               Expr.attrHandle.href = function( elem ) {
-                       return elem.getAttribute( "href", 2 );
-               };
-       }
-
-       // release memory in IE
-       div = null;
-})();
-
-if ( document.querySelectorAll ) {
-       (function(){
-               var oldSizzle = Sizzle,
-                       div = document.createElement("div"),
-                       id = "__sizzle__";
-
-               div.innerHTML = "<p class='TEST'></p>";
-
-               // Safari can't handle uppercase or unicode characters when
-               // in quirks mode.
-               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
-                       return;
-               }
-
-               Sizzle = function( query, context, extra, seed ) {
-                       context = context || document;
-
-                       // Only use querySelectorAll on non-XML documents
-                       // (ID selectors don't work in non-HTML documents)
-                       if ( !seed && !Sizzle.isXML(context) ) {
-                               // See if we find a selector to speed up
-                               var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-
-                               if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
-                                       // Speed-up: Sizzle("TAG")
-                                       if ( match[1] ) {
-                                               return makeArray( context.getElementsByTagName( query ), extra );
-
-                                       // Speed-up: Sizzle(".CLASS")
-                                       } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
-                                               return makeArray( context.getElementsByClassName( match[2] ), extra );
-                                       }
-                               }
-
-                               if ( context.nodeType === 9 ) {
-                                       // Speed-up: Sizzle("body")
-                                       // The body element only exists once, optimize finding it
-                                       if ( query === "body" && context.body ) {
-                                               return makeArray( [ context.body ], extra );
-
-                                       // Speed-up: Sizzle("#ID")
-                                       } else if ( match && match[3] ) {
-                                               var elem = context.getElementById( match[3] );
-
-                                               // Check parentNode to catch when Blackberry 4.6 returns
-                                               // nodes that are no longer in the document #6963
-                                               if ( elem && elem.parentNode ) {
-                                                       // Handle the case where IE and Opera return items
-                                                       // by name instead of ID
-                                                       if ( elem.id === match[3] ) {
-                                                               return makeArray( [ elem ], extra );
-                                                       }
-
-                                               } else {
-                                                       return makeArray( [], extra );
-                                               }
-                                       }
-
-                                       try {
-                                               return makeArray( context.querySelectorAll(query), extra );
-                                       } catch(qsaError) {}
-
-                               // qSA works strangely on Element-rooted queries
-                               // We can work around this by specifying an extra ID on the root
-                               // and working up from there (Thanks to Andrew Dupont for the technique)
-                               // IE 8 doesn't work on object elements
-                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-                                       var oldContext = context,
-                                               old = context.getAttribute( "id" ),
-                                               nid = old || id,
-                                               hasParent = context.parentNode,
-                                               relativeHierarchySelector = /^\s*[+~]/.test( query );
-
-                                       if ( !old ) {
-                                               context.setAttribute( "id", nid );
-                                       } else {
-                                               nid = nid.replace( /'/g, "\\$&" );
-                                       }
-                                       if ( relativeHierarchySelector && hasParent ) {
-                                               context = context.parentNode;
-                                       }
-
-                                       try {
-                                               if ( !relativeHierarchySelector || hasParent ) {
-                                                       return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
-                                               }
-
-                                       } catch(pseudoError) {
-                                       } finally {
-                                               if ( !old ) {
-                                                       oldContext.removeAttribute( "id" );
-                                               }
-                                       }
-                               }
-                       }
-
-                       return oldSizzle(query, context, extra, seed);
-               };
-
-               for ( var prop in oldSizzle ) {
-                       Sizzle[ prop ] = oldSizzle[ prop ];
-               }
-
-               // release memory in IE
-               div = null;
-       })();
-}
-
-(function(){
-       var html = document.documentElement,
-               matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
-       if ( matches ) {
-               // Check to see if it's possible to do matchesSelector
-               // on a disconnected node (IE 9 fails this)
-               var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
-                       pseudoWorks = false;
-
-               try {
-                       // This should fail with an exception
-                       // Gecko does not error, returns false instead
-                       matches.call( document.documentElement, "[test!='']:sizzle" );
-
-               } catch( pseudoError ) {
-                       pseudoWorks = true;
-               }
-
-               Sizzle.matchesSelector = function( node, expr ) {
-                       // Make sure that attribute selectors are quoted
-                       expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
-
-                       if ( !Sizzle.isXML( node ) ) {
-                               try {
-                                       if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
-                                               var ret = matches.call( node, expr );
-
-                                               // IE 9's matchesSelector returns false on disconnected nodes
-                                               if ( ret || !disconnectedMatch ||
-                                                               // As well, disconnected nodes are said to be in a document
-                                                               // fragment in IE 9, so check for that
-                                                               node.document && node.document.nodeType !== 11 ) {
-                                                       return ret;
-                                               }
-                                       }
-                               } catch(e) {}
-                       }
-
-                       return Sizzle(expr, null, null, [node]).length > 0;
-               };
-       }
-})();
-
-(function(){
-       var div = document.createElement("div");
-
-       div.innerHTML = "<div class='test e'></div><div class='test'></div>";
-
-       // Opera can't find a second classname (in 9.6)
-       // Also, make sure that getElementsByClassName actually exists
-       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
-               return;
-       }
-
-       // Safari caches class attributes, doesn't catch changes (in 3.2)
-       div.lastChild.className = "e";
-
-       if ( div.getElementsByClassName("e").length === 1 ) {
-               return;
-       }
-
-       Expr.order.splice(1, 0, "CLASS");
-       Expr.find.CLASS = function( match, context, isXML ) {
-               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
-                       return context.getElementsByClassName(match[1]);
-               }
-       };
-
-       // release memory in IE
-       div = null;
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-               var elem = checkSet[i];
-
-               if ( elem ) {
-                       var match = false;
-
-                       elem = elem[dir];
-
-                       while ( elem ) {
-                               if ( elem[ expando ] === doneName ) {
-                                       match = checkSet[elem.sizset];
-                                       break;
-                               }
-
-                               if ( elem.nodeType === 1 && !isXML ){
-                                       elem[ expando ] = doneName;
-                                       elem.sizset = i;
-                               }
-
-                               if ( elem.nodeName.toLowerCase() === cur ) {
-                                       match = elem;
-                                       break;
-                               }
-
-                               elem = elem[dir];
-                       }
-
-                       checkSet[i] = match;
-               }
-       }
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-               var elem = checkSet[i];
-
-               if ( elem ) {
-                       var match = false;
-
-                       elem = elem[dir];
-
-                       while ( elem ) {
-                               if ( elem[ expando ] === doneName ) {
-                                       match = checkSet[elem.sizset];
-                                       break;
-                               }
-
-                               if ( elem.nodeType === 1 ) {
-                                       if ( !isXML ) {
-                                               elem[ expando ] = doneName;
-                                               elem.sizset = i;
-                                       }
-
-                                       if ( typeof cur !== "string" ) {
-                                               if ( elem === cur ) {
-                                                       match = true;
-                                                       break;
-                                               }
-
-                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
-                                               match = elem;
-                                               break;
-                                       }
-                               }
-
-                               elem = elem[dir];
-                       }
-
-                       checkSet[i] = match;
-               }
-       }
-}
-
-if ( document.documentElement.contains ) {
-       Sizzle.contains = function( a, b ) {
-               return a !== b && (a.contains ? a.contains(b) : true);
-       };
-
-} else if ( document.documentElement.compareDocumentPosition ) {
-       Sizzle.contains = function( a, b ) {
-               return !!(a.compareDocumentPosition(b) & 16);
-       };
-
-} else {
-       Sizzle.contains = function() {
-               return false;
-       };
-}
-
-Sizzle.isXML = function( elem ) {
-       // documentElement is verified for cases where it doesn't yet exist
-       // (such as loading iframes in IE - #4833)
-       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
-       return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-var posProcess = function( selector, context, seed ) {
-       var match,
-               tmpSet = [],
-               later = "",
-               root = context.nodeType ? [context] : context;
-
-       // Position selectors must be done after the filter
-       // And so must :not(positional) so we move all PSEUDOs to the end
-       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
-               later += match[0];
-               selector = selector.replace( Expr.match.PSEUDO, "" );
-       }
-
-       selector = Expr.relative[selector] ? selector + "*" : selector;
-
-       for ( var i = 0, l = root.length; i < l; i++ ) {
-               Sizzle( selector, root[i], tmpSet, seed );
-       }
-
-       return Sizzle.filter( later, tmpSet );
-};
-
-// EXPOSE
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-Sizzle.selectors.attrMap = {};
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.filters;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})();
-
-
-var runtil = /Until$/,
-       rparentsprev = /^(?:parents|prevUntil|prevAll)/,
-       // Note: This RegExp should be improved, or likely pulled from Sizzle
-       rmultiselector = /,/,
-       isSimple = /^.[^:#\[\.,]*$/,
-       slice = Array.prototype.slice,
-       POS = jQuery.expr.match.globalPOS,
-       // methods guaranteed to produce a unique set when starting from a unique set
-       guaranteedUnique = {
-               children: true,
-               contents: true,
-               next: true,
-               prev: true
-       };
-
-jQuery.fn.extend({
-       find: function( selector ) {
-               var self = this,
-                       i, l;
-
-               if ( typeof selector !== "string" ) {
-                       return jQuery( selector ).filter(function() {
-                               for ( i = 0, l = self.length; i < l; i++ ) {
-                                       if ( jQuery.contains( self[ i ], this ) ) {
-                                               return true;
-                                       }
-                               }
-                       });
-               }
-
-               var ret = this.pushStack( "", "find", selector ),
-                       length, n, r;
-
-               for ( i = 0, l = this.length; i < l; i++ ) {
-                       length = ret.length;
-                       jQuery.find( selector, this[i], ret );
-
-                       if ( i > 0 ) {
-                               // Make sure that the results are unique
-                               for ( n = length; n < ret.length; n++ ) {
-                                       for ( r = 0; r < length; r++ ) {
-                                               if ( ret[r] === ret[n] ) {
-                                                       ret.splice(n--, 1);
-                                                       break;
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               return ret;
-       },
-
-       has: function( target ) {
-               var targets = jQuery( target );
-               return this.filter(function() {
-                       for ( var i = 0, l = targets.length; i < l; i++ ) {
-                               if ( jQuery.contains( this, targets[i] ) ) {
-                                       return true;
-                               }
-                       }
-               });
-       },
-
-       not: function( selector ) {
-               return this.pushStack( winnow(this, selector, false), "not", selector);
-       },
-
-       filter: function( selector ) {
-               return this.pushStack( winnow(this, selector, true), "filter", selector );
-       },
-
-       is: function( selector ) {
-               return !!selector && (
-                       typeof selector === "string" ?
-                               // If this is a positional selector, check membership in the returned set
-                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
-                               POS.test( selector ) ?
-                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
-                                       jQuery.filter( selector, this ).length > 0 :
-                               this.filter( selector ).length > 0 );
-       },
-
-       closest: function( selectors, context ) {
-               var ret = [], i, l, cur = this[0];
-
-               // Array (deprecated as of jQuery 1.7)
-               if ( jQuery.isArray( selectors ) ) {
-                       var level = 1;
-
-                       while ( cur && cur.ownerDocument && cur !== context ) {
-                               for ( i = 0; i < selectors.length; i++ ) {
-
-                                       if ( jQuery( cur ).is( selectors[ i ] ) ) {
-                                               ret.push({ selector: selectors[ i ], elem: cur, level: level });
-                                       }
-                               }
-
-                               cur = cur.parentNode;
-                               level++;
-                       }
-
-                       return ret;
-               }
-
-               // String
-               var pos = POS.test( selectors ) || typeof selectors !== "string" ?
-                               jQuery( selectors, context || this.context ) :
-                               0;
-
-               for ( i = 0, l = this.length; i < l; i++ ) {
-                       cur = this[i];
-
-                       while ( cur ) {
-                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-                                       ret.push( cur );
-                                       break;
-
-                               } else {
-                                       cur = cur.parentNode;
-                                       if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
-                                               break;
-                                       }
-                               }
-                       }
-               }
-
-               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
-               return this.pushStack( ret, "closest", selectors );
-       },
-
-       // Determine the position of an element within
-       // the matched set of elements
-       index: function( elem ) {
-
-               // No argument, return index in parent
-               if ( !elem ) {
-                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
-               }
-
-               // index in selector
-               if ( typeof elem === "string" ) {
-                       return jQuery.inArray( this[0], jQuery( elem ) );
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
                }
 
                // Locate the position of the desired element
@@ -5556,17 +5276,29 @@ jQuery.fn.extend({
                        jQuery.unique( all ) );
        },
 
-       andSelf: function() {
-               return this.add( this.prevObject );
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
        }
 });
 
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
 // A painfully simple check to see if an element is disconnected
 // from a document (should be improved, where feasible).
 function isDisconnected( node ) {
        return !node || !node.parentNode || node.parentNode.nodeType === 11;
 }
 
+function sibling( cur, dir ) {
+       do {
+               cur = cur[ dir ];
+       } while ( cur && cur.nodeType !== 1 );
+
+       return cur;
+}
+
 jQuery.each({
        parent: function( elem ) {
                var parent = elem.parentNode;
@@ -5579,10 +5311,10 @@ jQuery.each({
                return jQuery.dir( elem, "parentNode", until );
        },
        next: function( elem ) {
-               return jQuery.nth( elem, 2, "nextSibling" );
+               return sibling( elem, "nextSibling" );
        },
        prev: function( elem ) {
-               return jQuery.nth( elem, 2, "previousSibling" );
+               return sibling( elem, "previousSibling" );
        },
        nextAll: function( elem ) {
                return jQuery.dir( elem, "nextSibling" );
@@ -5605,7 +5337,7 @@ jQuery.each({
        contents: function( elem ) {
                return jQuery.nodeName( elem, "iframe" ) ?
                        elem.contentDocument || elem.contentWindow.document :
-                       jQuery.makeArray( elem.childNodes );
+                       jQuery.merge( [], elem.childNodes );
        }
 }, function( name, fn ) {
        jQuery.fn[ name ] = function( until, selector ) {
@@ -5621,11 +5353,11 @@ jQuery.each({
 
                ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
 
-               if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+               if ( this.length > 1 && rparentsprev.test( name ) ) {
                        ret = ret.reverse();
                }
 
-               return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+               return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
        };
 });
 
@@ -5653,19 +5385,6 @@ jQuery.extend({
                return matched;
        },
 
-       nth: function( cur, result, dir, elem ) {
-               result = result || 1;
-               var num = 0;
-
-               for ( ; cur; cur = cur[dir] ) {
-                       if ( cur.nodeType === 1 && ++num === result ) {
-                               break;
-                       }
-               }
-
-               return cur;
-       },
-
        sibling: function( n, elem ) {
                var r = [];
 
@@ -5713,10 +5432,6 @@ function winnow( elements, qualifier, keep ) {
                return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
        });
 }
-
-
-
-
 function createSafeFragment( document ) {
        var list = nodeNames.split( "|" ),
        safeFrag = document.createDocumentFragment();
@@ -5733,19 +5448,20 @@ function createSafeFragment( document ) {
 
 var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
                "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-       rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
        rleadingWhitespace = /^\s+/,
-       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
        rtagName = /<([\w:]+)/,
        rtbody = /<tbody/i,
        rhtml = /<|&#?\w+;/,
-       rnoInnerhtml = /<(?:script|style)/i,
+       rnoInnerhtml = /<(?:script|style|link)/i,
        rnocache = /<(?:script|object|embed|option|style)/i,
        rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+       rcheckableType = /^(?:checkbox|radio)$/,
        // checked="checked" or checked
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        rscriptType = /\/(java|ecma)script/i,
-       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
        wrapMap = {
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
                legend: [ 1, "<fieldset>", "</fieldset>" ],
@@ -5756,15 +5472,17 @@ var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figca
                area: [ 1, "<map>", "</map>" ],
                _default: [ 0, "", "" ]
        },
-       safeFragment = createSafeFragment( document );
+       safeFragment = createSafeFragment( document ),
+       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
 
 wrapMap.optgroup = wrapMap.option;
 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
 wrapMap.th = wrapMap.td;
 
-// IE can't serialize <link> and <script> tags normally
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
 if ( !jQuery.support.htmlSerialize ) {
-       wrapMap._default = [ 1, "div<div>", "</div>" ];
+       wrapMap._default = [ 1, "X<div>", "</div>" ];
 }
 
 jQuery.fn.extend({
@@ -5843,7 +5561,7 @@ jQuery.fn.extend({
 
        append: function() {
                return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
                                this.appendChild( elem );
                        }
                });
@@ -5851,39 +5569,44 @@ jQuery.fn.extend({
 
        prepend: function() {
                return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
                                this.insertBefore( elem, this.firstChild );
                        }
                });
        },
 
        before: function() {
-               if ( this[0] && this[0].parentNode ) {
+               if ( !isDisconnected( this[0] ) ) {
                        return this.domManip(arguments, false, function( elem ) {
                                this.parentNode.insertBefore( elem, this );
                        });
-               } else if ( arguments.length ) {
+               }
+
+               if ( arguments.length ) {
                        var set = jQuery.clean( arguments );
-                       set.push.apply( set, this.toArray() );
-                       return this.pushStack( set, "before", arguments );
+                       return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
                }
        },
 
        after: function() {
-               if ( this[0] && this[0].parentNode ) {
+               if ( !isDisconnected( this[0] ) ) {
                        return this.domManip(arguments, false, function( elem ) {
                                this.parentNode.insertBefore( elem, this.nextSibling );
                        });
-               } else if ( arguments.length ) {
-                       var set = this.pushStack( this, "after", arguments );
-                       set.push.apply( set, jQuery.clean(arguments) );
-                       return set;
+               }
+
+               if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
                }
        },
 
        // keepData is for internal use only--do not document
        remove: function( selector, keepData ) {
-               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+               var elem,
+                       i = 0;
+
+               for ( ; (elem = this[i]) != null; i++ ) {
                        if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
                                if ( !keepData && elem.nodeType === 1 ) {
                                        jQuery.cleanData( elem.getElementsByTagName("*") );
@@ -5900,7 +5623,10 @@ jQuery.fn.extend({
        },
 
        empty: function() {
-               for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+               var elem,
+                       i = 0;
+
+               for ( ; (elem = this[i]) != null; i++ ) {
                        // Remove element nodes and prevent memory leaks
                        if ( elem.nodeType === 1 ) {
                                jQuery.cleanData( elem.getElementsByTagName("*") );
@@ -5933,11 +5659,12 @@ jQuery.fn.extend({
                        if ( value === undefined ) {
                                return elem.nodeType === 1 ?
                                        elem.innerHTML.replace( rinlinejQuery, "" ) :
-                                       null;
+                                       undefined;
                        }
 
-
+                       // See if we can take a shortcut and just use innerHTML
                        if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
                                ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
                                !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
 
@@ -5966,7 +5693,7 @@ jQuery.fn.extend({
        },
 
        replaceWith: function( value ) {
-               if ( this[0] && this[0].parentNode ) {
+               if ( !isDisconnected( this[0] ) ) {
                        // Make sure that the elements are removed from the DOM before they are inserted
                        // this can help fix replacing a parent with child elements
                        if ( jQuery.isFunction( value ) ) {
@@ -5992,11 +5719,11 @@ jQuery.fn.extend({
                                        jQuery(parent).append( value );
                                }
                        });
-               } else {
-                       return this.length ?
-                               this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-                               this;
                }
+
+               return this.length ?
+                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                       this;
        },
 
        detach: function( selector ) {
@@ -6004,78 +5731,78 @@ jQuery.fn.extend({
        },
 
        domManip: function( args, table, callback ) {
-               var results, first, fragment, parent,
+
+               // Flatten any nested arrays
+               args = [].concat.apply( [], args );
+
+               var results, first, fragment, iNoClone,
+                       i = 0,
                        value = args[0],
-                       scripts = [];
+                       scripts = [],
+                       l = this.length;
 
                // We can't cloneNode fragments that contain checked, in WebKit
-               if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+               if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
                        return this.each(function() {
-                               jQuery(this).domManip( args, table, callback, true );
+                               jQuery(this).domManip( args, table, callback );
                        });
                }
 
                if ( jQuery.isFunction(value) ) {
                        return this.each(function(i) {
                                var self = jQuery(this);
-                               args[0] = value.call(this, i, table ? self.html() : undefined);
+                               args[0] = value.call( this, i, table ? self.html() : undefined );
                                self.domManip( args, table, callback );
                        });
                }
 
                if ( this[0] ) {
-                       parent = value && value.parentNode;
-
-                       // If we're in a fragment, just use that instead of building a new one
-                       if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
-                               results = { fragment: parent };
-
-                       } else {
-                               results = jQuery.buildFragment( args, this, scripts );
-                       }
-
+                       results = jQuery.buildFragment( args, this, scripts );
                        fragment = results.fragment;
+                       first = fragment.firstChild;
 
                        if ( fragment.childNodes.length === 1 ) {
-                               first = fragment = fragment.firstChild;
-                       } else {
-                               first = fragment.firstChild;
+                               fragment = first;
                        }
 
                        if ( first ) {
                                table = table && jQuery.nodeName( first, "tr" );
 
-                               for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+                               // Use the original fragment for the last item instead of the first because it can end up
+                               // being emptied incorrectly in certain situations (#8070).
+                               // Fragments from the fragment cache must always be cloned and never used in place.
+                               for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
                                        callback.call(
-                                               table ?
-                                                       root(this[i], first) :
+                                               table && jQuery.nodeName( this[i], "table" ) ?
+                                                       findOrAppend( this[i], "tbody" ) :
                                                        this[i],
-                                               // Make sure that we do not leak memory by inadvertently discarding
-                                               // the original fragment (which might have attached data) instead of
-                                               // using it; in addition, use the original fragment object for the last
-                                               // item instead of first because it can end up being emptied incorrectly
-                                               // in certain situations (Bug #8070).
-                                               // Fragments from the fragment cache must always be cloned and never used
-                                               // in place.
-                                               results.cacheable || ( l > 1 && i < lastIndex ) ?
-                                                       jQuery.clone( fragment, true, true ) :
-                                                       fragment
+                                               i === iNoClone ?
+                                                       fragment :
+                                                       jQuery.clone( fragment, true, true )
                                        );
                                }
                        }
 
+                       // Fix #11809: Avoid leaking memory
+                       fragment = first = null;
+
                        if ( scripts.length ) {
                                jQuery.each( scripts, function( i, elem ) {
                                        if ( elem.src ) {
-                                               jQuery.ajax({
-                                                       type: "GET",
-                                                       global: false,
-                                                       url: elem.src,
-                                                       async: false,
-                                                       dataType: "script"
-                                               });
+                                               if ( jQuery.ajax ) {
+                                                       jQuery.ajax({
+                                                               url: elem.src,
+                                                               type: "GET",
+                                                               dataType: "script",
+                                                               async: false,
+                                                               global: false,
+                                                               "throws": true
+                                                       });
+                                               } else {
+                                                       jQuery.error("no ajax");
+                                               }
                                        } else {
-                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
                                        }
 
                                        if ( elem.parentNode ) {
@@ -6089,11 +5816,8 @@ jQuery.fn.extend({
        }
 });
 
-function root( elem, cur ) {
-       return jQuery.nodeName(elem, "table") ?
-               (elem.getElementsByTagName("tbody")[0] ||
-               elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
-               elem;
+function findOrAppend( elem, tag ) {
+       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
 }
 
 function cloneCopyEvent( src, dest ) {
@@ -6146,19 +5870,27 @@ function cloneFixAttributes( src, dest ) {
 
        nodeName = dest.nodeName.toLowerCase();
 
-       // IE6-8 fail to clone children inside object elements that use
-       // the proprietary classid attribute value (rather than the type
-       // attribute) to identify the type of content to display
        if ( nodeName === "object" ) {
-               dest.outerHTML = src.outerHTML;
+               // IE6-10 improperly clones children of object elements using classid.
+               // IE10 throws NoModificationAllowedError if parent is null, #12132.
+               if ( dest.parentNode ) {
+                       dest.outerHTML = src.outerHTML;
+               }
+
+               // This path appears unavoidable for IE9. When cloning an object
+               // element in IE9, the outerHTML strategy above is not sufficient.
+               // If the src has innerHTML and the destination does not,
+               // copy the src.innerHTML into the dest.innerHTML. #10324
+               if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+                       dest.innerHTML = src.innerHTML;
+               }
 
-       } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
                // IE6-8 fails to persist the checked state of a cloned checkbox
                // or radio button. Worse, IE6-7 fail to give the cloned element
                // a checked appearance if the defaultChecked value isn't also set
-               if ( src.checked ) {
-                       dest.defaultChecked = dest.checked = src.checked;
-               }
+
+               dest.defaultChecked = dest.checked = src.checked;
 
                // IE6-7 get confused and end up setting the value of a cloned
                // checkbox/radio button to an empty string instead of "on"
@@ -6184,29 +5916,21 @@ function cloneFixAttributes( src, dest ) {
        // Event data gets referenced instead of copied if the expando
        // gets copied too
        dest.removeAttribute( jQuery.expando );
-
-       // Clear flags for bubbling special change/submit events, they must
-       // be reattached when the newly cloned events are first activated
-       dest.removeAttribute( "_submit_attached" );
-       dest.removeAttribute( "_change_attached" );
 }
 
-jQuery.buildFragment = function( args, nodes, scripts ) {
-       var fragment, cacheable, cacheresults, doc,
-       first = args[ 0 ];
+jQuery.buildFragment = function( args, context, scripts ) {
+       var fragment, cacheable, cachehit,
+               first = args[ 0 ];
 
-       // nodes may contain either an explicit document object,
-       // a jQuery collection or context object.
-       // If nodes[0] contains a valid object to assign to doc
-       if ( nodes && nodes[0] ) {
-               doc = nodes[0].ownerDocument || nodes[0];
-       }
+       // Set context from what may come in as undefined or a jQuery collection or a node
+       context = context || document;
+       context = (context[0] || context).ownerDocument || context[0] || context;
 
        // Ensure that an attr object doesn't incorrectly stand in as a document object
        // Chrome and Firefox seem to allow this to occur and will throw exception
        // Fixes #8950
-       if ( !doc.createDocumentFragment ) {
-               doc = document;
+       if ( typeof context.createDocumentFragment === "undefined" ) {
+               context = document;
        }
 
        // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
@@ -6214,26 +5938,26 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
        // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
        // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
        // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
-       if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+       if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
                first.charAt(0) === "<" && !rnocache.test( first ) &&
                (jQuery.support.checkClone || !rchecked.test( first )) &&
                (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
 
+               // Mark cacheable and look for a hit
                cacheable = true;
-
-               cacheresults = jQuery.fragments[ first ];
-               if ( cacheresults && cacheresults !== 1 ) {
-                       fragment = cacheresults;
-               }
+               fragment = jQuery.fragments[ first ];
+               cachehit = fragment !== undefined;
        }
 
        if ( !fragment ) {
-               fragment = doc.createDocumentFragment();
-               jQuery.clean( args, doc, fragment, scripts );
-       }
+               fragment = context.createDocumentFragment();
+               jQuery.clean( args, context, fragment, scripts );
 
-       if ( cacheable ) {
-               jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+               // Update the cache, but only store false
+               // unless this is a second parsing of the same content
+               if ( cacheable ) {
+                       jQuery.fragments[ first ] = cachehit && fragment;
+               }
        }
 
        return { fragment: fragment, cacheable: cacheable };
@@ -6249,17 +5973,19 @@ jQuery.each({
        replaceAll: "replaceWith"
 }, function( name, original ) {
        jQuery.fn[ name ] = function( selector ) {
-               var ret = [],
+               var elems,
+                       i = 0,
+                       ret = [],
                        insert = jQuery( selector ),
+                       l = insert.length,
                        parent = this.length === 1 && this[0].parentNode;
 
-               if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+               if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
                        insert[ original ]( this[0] );
                        return this;
-
                } else {
-                       for ( var i = 0, l = insert.length; i < l; i++ ) {
-                               var elems = ( i > 0 ? this.clone(true) : this ).get();
+                       for ( ; i < l; i++ ) {
+                               elems = ( i > 0 ? this.clone(true) : this ).get();
                                jQuery( insert[i] )[ original ]( elems );
                                ret = ret.concat( elems );
                        }
@@ -6283,39 +6009,26 @@ function getAll( elem ) {
 
 // Used in clean, fixes the defaultChecked property
 function fixDefaultChecked( elem ) {
-       if ( elem.type === "checkbox" || elem.type === "radio" ) {
+       if ( rcheckableType.test( elem.type ) ) {
                elem.defaultChecked = elem.checked;
        }
 }
-// Finds all inputs and passes them to fixDefaultChecked
-function findInputs( elem ) {
-       var nodeName = ( elem.nodeName || "" ).toLowerCase();
-       if ( nodeName === "input" ) {
-               fixDefaultChecked( elem );
-       // Skip scripts, get other children
-       } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
-               jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
-       }
-}
-
-// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
-function shimCloneNode( elem ) {
-       var div = document.createElement( "div" );
-       safeFragment.appendChild( div );
-
-       div.innerHTML = elem.outerHTML;
-       return div.firstChild;
-}
 
 jQuery.extend({
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
                var srcElements,
                        destElements,
                        i,
-                       // IE<=8 does not properly clone detached, unknown element nodes
-                       clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
-                               elem.cloneNode( true ) :
-                               shimCloneNode( elem );
+                       clone;
+
+               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+                       clone = elem.cloneNode( true );
+
+               // IE<=8 does not properly clone detached, unknown element nodes
+               } else {
+                       fragmentDiv.innerHTML = elem.outerHTML;
+                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               }
 
                if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
                                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
@@ -6363,17 +6076,17 @@ jQuery.extend({
        },
 
        clean: function( elems, context, fragment, scripts ) {
-               var checkScriptType, script, j,
-                               ret = [];
-
-               context = context || document;
+               var j, safe, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+                       i = 0,
+                       ret = [];
 
-               // !context.createElement fails in IE with an error but returns typeof 'object'
-               if ( typeof context.createElement === "undefined" ) {
-                       context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+               // Ensure that context is a document
+               if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+                       context = document;
                }
 
-               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+               // Use the already-created safe fragment if context permits
+               for ( safe = context === document && safeFragment; (elem = elems[i]) != null; i++ ) {
                        if ( typeof elem === "number" ) {
                                elem += "";
                        }
@@ -6387,27 +6100,17 @@ jQuery.extend({
                                if ( !rhtml.test( elem ) ) {
                                        elem = context.createTextNode( elem );
                                } else {
+                                       // Ensure a safe container in which to render the html
+                                       safe = safe || createSafeFragment( context );
+                                       div = div || safe.appendChild( context.createElement("div") );
+
                                        // Fix "XHTML"-style tags in all browsers
                                        elem = elem.replace(rxhtmlTag, "<$1></$2>");
 
-                                       // Trim whitespace, otherwise indexOf won't work as expected
-                                       var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
-                                               wrap = wrapMap[ tag ] || wrapMap._default,
-                                               depth = wrap[0],
-                                               div = context.createElement("div"),
-                                               safeChildNodes = safeFragment.childNodes,
-                                               remove;
-
-                                       // Append wrapper element to unknown element safe doc fragment
-                                       if ( context === document ) {
-                                               // Use the fragment we've already created for this document
-                                               safeFragment.appendChild( div );
-                                       } else {
-                                               // Use a fragment created with the owner document
-                                               createSafeFragment( context ).appendChild( div );
-                                       }
-
                                        // Go to html and back, then peel off extra wrappers
+                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+                                       wrap = wrapMap[ tag ] || wrapMap._default;
+                                       depth = wrap[0];
                                        div.innerHTML = wrap[1] + elem + wrap[2];
 
                                        // Move to the right depth
@@ -6419,7 +6122,7 @@ jQuery.extend({
                                        if ( !jQuery.support.tbody ) {
 
                                                // String was a <table>, *may* have spurious <tbody>
-                                               var hasBody = rtbody.test(elem),
+                                               hasBody = rtbody.test(elem);
                                                        tbody = tag === "table" && !hasBody ?
                                                                div.firstChild && div.firstChild.childNodes :
 
@@ -6442,33 +6145,8 @@ jQuery.extend({
 
                                        elem = div.childNodes;
 
-                                       // Clear elements from DocumentFragment (safeFragment or otherwise)
-                                       // to avoid hoarding elements. Fixes #11356
-                                       if ( div ) {
-                                               div.parentNode.removeChild( div );
-
-                                               // Guard against -1 index exceptions in FF3.6
-                                               if ( safeChildNodes.length > 0 ) {
-                                                       remove = safeChildNodes[ safeChildNodes.length - 1 ];
-
-                                                       if ( remove && remove.parentNode ) {
-                                                               remove.parentNode.removeChild( remove );
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Resets defaultChecked for any radios and checkboxes
-                       // about to be appended to the DOM in IE 6/7 (#8060)
-                       var len;
-                       if ( !jQuery.support.appendChecked ) {
-                               if ( elem[0] && typeof (len = elem.length) === "number" ) {
-                                       for ( j = 0; j < len; j++ ) {
-                                               findInputs( elem[j] );
-                                       }
-                               } else {
-                                       findInputs( elem );
+                                       // Remember the top-level container for proper cleanup
+                                       div = safe.lastChild;
                                }
                        }
 
@@ -6479,22 +6157,51 @@ jQuery.extend({
                        }
                }
 
+               // Fix #11356: Clear elements from safeFragment
+               if ( div ) {
+                       safe.removeChild( div );
+                       elem = div = safe = null;
+               }
+
+               // Reset defaultChecked for any radios and checkboxes
+               // about to be appended to the DOM in IE 6/7 (#8060)
+               if ( !jQuery.support.appendChecked ) {
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               if ( jQuery.nodeName( elem, "input" ) ) {
+                                       fixDefaultChecked( elem );
+                               } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+                               }
+                       }
+               }
+
+               // Append elements to a provided document fragment
                if ( fragment ) {
-                       checkScriptType = function( elem ) {
-                               return !elem.type || rscriptType.test( elem.type );
+                       // Special handling of each script element
+                       handleScript = function( elem ) {
+                               // Check if we consider it executable
+                               if ( !elem.type || rscriptType.test( elem.type ) ) {
+                                       // Detach the script and store it in the scripts array (if provided) or the fragment
+                                       // Return truthy to indicate that it has been handled
+                                       return scripts ?
+                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+                                               fragment.appendChild( elem );
+                               }
                        };
-                       for ( i = 0; ret[i]; i++ ) {
-                               script = ret[i];
-                               if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
-                                       scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
 
-                               } else {
-                                       if ( script.nodeType === 1 ) {
-                                               var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               // Check if we're done after handling an executable script
+                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+                                       // Append to fragment and handle embedded scripts
+                                       fragment.appendChild( elem );
+                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
 
+                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
                                                ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                               i += jsTags.length;
                                        }
-                                       fragment.appendChild( script );
                                }
                        }
                }
@@ -6502,81 +6209,250 @@ jQuery.extend({
                return ret;
        },
 
-       cleanData: function( elems ) {
-               var data, id,
+       cleanData: function( elems, /* internal */ acceptData ) {
+               var data, id, elem, type,
+                       i = 0,
+                       internalKey = jQuery.expando,
                        cache = jQuery.cache,
-                       special = jQuery.event.special,
-                       deleteExpando = jQuery.support.deleteExpando;
+                       deleteExpando = jQuery.support.deleteExpando,
+                       special = jQuery.event.special;
 
-               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-                       if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
-                               continue;
-                       }
+               for ( ; (elem = elems[i]) != null; i++ ) {
 
-                       id = elem[ jQuery.expando ];
+                       if ( acceptData || jQuery.acceptData( elem ) ) {
 
-                       if ( id ) {
-                               data = cache[ id ];
+                               id = elem[ internalKey ];
+                               data = id && cache[ id ];
 
-                               if ( data && data.events ) {
-                                       for ( var type in data.events ) {
-                                               if ( special[ type ] ) {
-                                                       jQuery.event.remove( elem, type );
+                               if ( data ) {
+                                       if ( data.events ) {
+                                               for ( type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
 
-                                               // This is a shortcut to avoid jQuery.event.remove's overhead
-                                               } else {
-                                                       jQuery.removeEvent( elem, type, data.handle );
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
                                                }
                                        }
 
-                                       // Null the DOM reference to avoid IE6/7/8 leak (#7054)
-                                       if ( data.handle ) {
-                                               data.handle.elem = null;
-                                       }
-                               }
+                                       // Remove cache only if it was not already removed by jQuery.event.remove
+                                       if ( cache[ id ] ) {
 
-                               if ( deleteExpando ) {
-                                       delete elem[ jQuery.expando ];
+                                               delete cache[ id ];
 
-                               } else if ( elem.removeAttribute ) {
-                                       elem.removeAttribute( jQuery.expando );
-                               }
+                                               // IE does not allow us to delete expando properties from nodes,
+                                               // nor does it have a removeAttribute function on Document nodes;
+                                               // we must handle all of these cases
+                                               if ( deleteExpando ) {
+                                                       delete elem[ internalKey ];
+
+                                               } else if ( elem.removeAttribute ) {
+                                                       elem.removeAttribute( internalKey );
+
+                                               } else {
+                                                       elem[ internalKey ] = null;
+                                               }
 
-                               delete cache[ id ];
+                                               jQuery.deletedIds.push( id );
+                                       }
+                               }
                        }
                }
        }
 });
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+       ua = ua.toLowerCase();
+
+       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+               /(msie) ([\w.]+)/.exec( ua ) ||
+               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+               [];
+
+       return {
+               browser: match[ 1 ] || "",
+               version: match[ 2 ] || "0"
+       };
+};
 
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
+
+if ( matched.browser ) {
+       browser[ matched.browser ] = true;
+       browser.version = matched.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+// Maintained for back-compat only
+if ( browser.webkit ) {
+       browser.safari = true;
+}
 
+jQuery.browser = browser;
 
+jQuery.sub = function() {
+       function jQuerySub( selector, context ) {
+               return new jQuerySub.fn.init( selector, context );
+       }
+       jQuery.extend( true, jQuerySub, this );
+       jQuerySub.superclass = this;
+       jQuerySub.fn = jQuerySub.prototype = this();
+       jQuerySub.fn.constructor = jQuerySub;
+       jQuerySub.sub = this.sub;
+       jQuerySub.fn.init = function init( selector, context ) {
+               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                       context = jQuerySub( context );
+               }
 
-var ralpha = /alpha\([^)]*\)/i,
+               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+       };
+       jQuerySub.fn.init.prototype = jQuerySub.fn;
+       var rootjQuerySub = jQuerySub(document);
+       return jQuerySub;
+};
+       
+})();
+var curCSS, iframe, iframeDoc,
+       ralpha = /alpha\([^)]*\)/i,
        ropacity = /opacity=([^)]*)/,
-       // fixed for IE9, see #8346
-       rupper = /([A-Z]|^ms)/g,
-       rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
-       rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
-       rrelNum = /^([\-+])=([\-+.\de]+)/,
+       rposition = /^(top|right|bottom|left)$/,
        rmargin = /^margin/,
+       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+       rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+       elemdisplay = {},
 
        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: 0,
+               fontWeight: 400,
+               lineHeight: 1
+       },
 
-       // order is important!
        cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
 
-       curCSS,
+       eventsToggle = jQuery.fn.toggle;
 
-       getComputedStyle,
-       currentStyle;
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
 
-jQuery.fn.css = function( name, value ) {
-       return jQuery.access( this, function( elem, name, value ) {
-               return value !== undefined ?
-                       jQuery.style( elem, name, value ) :
-                       jQuery.css( elem, name );
-       }, name, value, arguments.length > 1 );
-};
+       // shortcut for names that are not vendor prefixed
+       if ( name in style ) {
+               return name;
+       }
+
+       // check for vendor prefixed names
+       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+               origName = name,
+               i = cssPrefixes.length;
+
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in style ) {
+                       return name;
+               }
+       }
+
+       return origName;
+}
+
+function isHidden( elem, el ) {
+       elem = el || elem;
+       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+       var elem, display,
+               values = [],
+               index = 0,
+               length = elements.length;
+
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               values[ index ] = jQuery._data( elem, "olddisplay" );
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && elem.style.display === "none" ) {
+                               elem.style.display = "";
+                       }
+
+                       // Set elements which have been overridden with display: none
+                       // in a stylesheet to whatever the default browser style is
+                       // for such an element
+                       if ( elem.style.display === "" && isHidden( elem ) ) {
+                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+                       display = curCSS( elem, "display" );
+
+                       if ( !values[ index ] && display !== "none" ) {
+                               jQuery._data( elem, "olddisplay", display );
+                       }
+               }
+       }
+
+       // Set the display of most of the elements in a second loop
+       // to avoid the constant reflow
+       for ( index = 0; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+                       elem.style.display = show ? values[ index ] || "" : "none";
+               }
+       }
+
+       return elements;
+}
+
+jQuery.fn.extend({
+       css: function( name, value ) {
+               return jQuery.access( this, function( elem, name, value ) {
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
+       },
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state, fn2 ) {
+               var bool = typeof state === "boolean";
+
+               if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+                       return eventsToggle.apply( this, arguments );
+               }
+
+               return this.each(function() {
+                       if ( bool ? state : isHidden( this ) ) {
+                               jQuery( this ).show();
+                       } else {
+                               jQuery( this ).hide();
+                       }
+               });
+       }
+});
 
 jQuery.extend({
        // Add in style property hooks for overriding the default
@@ -6589,8 +6465,6 @@ jQuery.extend({
                                        var ret = curCSS( elem, "opacity" );
                                        return ret === "" ? "1" : ret;
 
-                               } else {
-                                       return elem.style.opacity;
                                }
                        }
                }
@@ -6623,10 +6497,15 @@ jQuery.extend({
                }
 
                // Make sure that we're working with the right name
-               var ret, type, origName = jQuery.camelCase( name ),
-                       style = elem.style, hooks = jQuery.cssHooks[ origName ];
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       style = elem.style;
+
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
 
-               name = jQuery.cssProps[ origName ] || origName;
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
                // Check if we're setting a value
                if ( value !== undefined ) {
@@ -6634,7 +6513,7 @@ jQuery.extend({
 
                        // convert relative number strings (+= or -=) to relative numbers. #7345
                        if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-                               value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
                                // Fixes bug #9237
                                type = "number";
                        }
@@ -6650,7 +6529,7 @@ jQuery.extend({
                        }
 
                        // If a hook was provided, use that value, otherwise just set the specified value
-                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
                                // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
                                // Fixes bug #5509
                                try {
@@ -6669,33 +6548,44 @@ jQuery.extend({
                }
        },
 
-       css: function( elem, name, extra ) {
-               var ret, hooks;
+       css: function( elem, name, numeric, extra ) {
+               var val, num, hooks,
+                       origName = jQuery.camelCase( name );
 
                // Make sure that we're working with the right name
-               name = jQuery.camelCase( name );
-               hooks = jQuery.cssHooks[ name ];
-               name = jQuery.cssProps[ name ] || name;
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
 
-               // cssFloat needs a special treatment
-               if ( name === "cssFloat" ) {
-                       name = "float";
-               }
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
                // If a hook was provided get the computed value from there
-               if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
-                       return ret;
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
 
                // Otherwise, if a way to get the computed value exists, use that
-               } else if ( curCSS ) {
-                       return curCSS( elem, name );
+               if ( val === undefined ) {
+                       val = curCSS( elem, name );
+               }
+
+               //convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
+
+               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               if ( numeric || extra !== undefined ) {
+                       num = parseFloat( val );
+                       return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
                }
+               return val;
        },
 
        // A method for quickly swapping in/out CSS properties to get correct calculations
        swap: function( elem, options, callback ) {
-               var old = {},
-                       ret, name;
+               var ret, name,
+                       old = {};
 
                // Remember the old values, and insert the new ones
                for ( name in options ) {
@@ -6714,49 +6604,51 @@ jQuery.extend({
        }
 });
 
-// DEPRECATED in 1.3, Use jQuery.css() instead
-jQuery.curCSS = jQuery.css;
-
-if ( document.defaultView && document.defaultView.getComputedStyle ) {
-       getComputedStyle = function( elem, name ) {
-               var ret, defaultView, computedStyle, width,
+// NOTE: To any future maintainer, we've used both window.getComputedStyle
+// and getComputedStyle here to produce a better gzip size
+if ( window.getComputedStyle ) {
+       curCSS = function( elem, name ) {
+               var ret, width, minWidth, maxWidth,
+                       computed = getComputedStyle( elem, null ),
                        style = elem.style;
 
-               name = name.replace( rupper, "-$1" ).toLowerCase();
+               if ( computed ) {
 
-               if ( (defaultView = elem.ownerDocument.defaultView) &&
-                               (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
-
-                       ret = computedStyle.getPropertyValue( name );
+                       ret = computed[ name ];
                        if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
                                ret = jQuery.style( elem, name );
                        }
-               }
 
-               // A tribute to the "awesome hack by Dean Edwards"
-               // WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
-               // which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-               if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
-                       width = style.width;
-                       style.width = ret;
-                       ret = computedStyle.width;
-                       style.width = width;
+                       // A tribute to the "awesome hack by Dean Edwards"
+                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+                               width = style.width;
+                               minWidth = style.minWidth;
+                               maxWidth = style.maxWidth;
+
+                               style.minWidth = style.maxWidth = style.width = ret;
+                               ret = computed.width;
+
+                               style.width = width;
+                               style.minWidth = minWidth;
+                               style.maxWidth = maxWidth;
+                       }
                }
 
                return ret;
        };
-}
-
-if ( document.documentElement.currentStyle ) {
-       currentStyle = function( elem, name ) {
-               var left, rsLeft, uncomputed,
+} else if ( document.documentElement.currentStyle ) {
+       curCSS = function( elem, name ) {
+               var left, rsLeft,
                        ret = elem.currentStyle && elem.currentStyle[ name ],
                        style = elem.style;
 
                // Avoid setting ret to empty string here
                // so we don't default to auto
-               if ( ret == null && style && (uncomputed = style[ name ]) ) {
-                       ret = uncomputed;
+               if ( ret == null && style && style[ name ] ) {
+                       ret = style[ name ];
                }
 
                // From the awesome hack by Dean Edwards
@@ -6764,7 +6656,9 @@ if ( document.documentElement.currentStyle ) {
 
                // If we're not dealing with a regular pixel number
                // but a number that has a weird ending, we need to convert it to pixels
-               if ( rnumnonpx.test( ret ) ) {
+               // but not position css attributes, as those are proportional to the parent element instead
+               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
 
                        // Remember the original values
                        left = style.left;
@@ -6774,81 +6668,156 @@ if ( document.documentElement.currentStyle ) {
                        if ( rsLeft ) {
                                elem.runtimeStyle.left = elem.currentStyle.left;
                        }
-                       style.left = name === "fontSize" ? "1em" : ret;
-                       ret = style.pixelLeft + "px";
+                       style.left = name === "fontSize" ? "1em" : ret;
+                       ret = style.pixelLeft + "px";
+
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = rsLeft;
+                       }
+               }
+
+               return ret === "" ? "auto" : ret;
+       };
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+       var matches = rnumsplit.exec( value );
+       return matches ?
+                       Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+                       value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+       var i = extra === ( isBorderBox ? "border" : "content" ) ?
+               // If we already have the right measurement, avoid augmentation
+               4 :
+               // Otherwise initialize for horizontal or vertical properties
+               name === "width" ? 1 : 0,
+
+               val = 0;
+
+       for ( ; i < 4; i += 2 ) {
+               // both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       // we use jQuery.css instead of curCSS here
+                       // because of the reliableMarginRight CSS hook!
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true );
+               }
+
+               // From this point on we use curCSS for maximum performance (relevant in animations)
+               if ( isBorderBox ) {
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+                       }
+
+                       // at this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+                       }
+               } else {
+                       // at this point, extra isn't content, so add padding
+                       val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
 
-                       // Revert the changed values
-                       style.left = left;
-                       if ( rsLeft ) {
-                               elem.runtimeStyle.left = rsLeft;
+                       // at this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
                        }
                }
+       }
 
-               return ret === "" ? "auto" : ret;
-       };
+       return val;
 }
 
-curCSS = getComputedStyle || currentStyle;
-
 function getWidthOrHeight( elem, name, extra ) {
 
-       // Start with offset property
+       // Start with offset property, which is equivalent to the border-box value
        var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-               i = name === "width" ? 1 : 0,
-               len = 4;
-
-       if ( val > 0 ) {
-               if ( extra !== "border" ) {
-                       for ( ; i < len; i += 2 ) {
-                               if ( !extra ) {
-                                       val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
-                               }
-                               if ( extra === "margin" ) {
-                                       val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
-                               } else {
-                                       val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                               }
-                       }
+               valueIsBorderBox = true,
+               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+
+       if ( val <= 0 ) {
+               // Fall back to computed then uncomputed css if necessary
+               val = curCSS( elem, name );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
                }
 
-               return val + "px";
-       }
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
+               }
+
+               // we need the check for style in case a browser which returns unreliable values
+               // for getComputedStyle silently falls back to the reliable elem.style
+               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
 
-       // Fall back to computed then uncomputed css if necessary
-       val = curCSS( elem, name );
-       if ( val < 0 || val == null ) {
-               val = elem.style[ name ];
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
        }
 
-       // Computed unit is not pixels. Stop here and return.
-       if ( rnumnonpx.test(val) ) {
-               return val;
+       // use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox
+               )
+       ) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+       if ( elemdisplay[ nodeName ] ) {
+               return elemdisplay[ nodeName ];
        }
 
-       // Normalize "", auto, and prepare for extra
-       val = parseFloat( val ) || 0;
+       var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
+               display = elem.css("display");
+       elem.remove();
+
+       // If the simple way fails,
+       // get element's real default display by attaching it to a temp iframe
+       if ( display === "none" || display === "" ) {
+               // Use the already-created iframe if possible
+               iframe = document.body.appendChild(
+                       iframe || jQuery.extend( document.createElement("iframe"), {
+                               frameBorder: 0,
+                               width: 0,
+                               height: 0
+                       })
+               );
 
-       // Add padding, border, margin
-       if ( extra ) {
-               for ( ; i < len; i += 2 ) {
-                       val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
-                       if ( extra !== "padding" ) {
-                               val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                       }
-                       if ( extra === "margin" ) {
-                               val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
-                       }
+               // Create a cacheable copy of the iframe document on first call.
+               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+               // document to it; WebKit & Firefox won't allow reusing the iframe document.
+               if ( !iframeDoc || !iframe.createElement ) {
+                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+                       iframeDoc.write("<!doctype html><html><body>");
+                       iframeDoc.close();
                }
+
+               elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+
+               display = curCSS( elem, "display" );
+               document.body.removeChild( iframe );
        }
 
-       return val + "px";
+       // Store the correct default display
+       elemdisplay[ nodeName ] = display;
+
+       return display;
 }
 
 jQuery.each([ "height", "width" ], function( i, name ) {
        jQuery.cssHooks[ name ] = {
                get: function( elem, computed, extra ) {
                        if ( computed ) {
-                               if ( elem.offsetWidth !== 0 ) {
+                               if ( elem.offsetWidth !== 0 || curCSS( elem, "display" ) !== "none" ) {
                                        return getWidthOrHeight( elem, name, extra );
                                } else {
                                        return jQuery.swap( elem, cssShow, function() {
@@ -6858,10 +6827,15 @@ jQuery.each([ "height", "width" ], function( i, name ) {
                        }
                },
 
-               set: function( elem, value ) {
-                       return rnum.test( value ) ?
-                               value + "px" :
-                               value;
+               set: function( elem, value, extra ) {
+                       return setPositiveNumber( elem, value, extra ?
+                               augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+                               ) : 0
+                       );
                }
        };
 });
@@ -6871,7 +6845,7 @@ if ( !jQuery.support.opacity ) {
                get: function( elem, computed ) {
                        // IE uses filters for opacity
                        return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-                               ( parseFloat( RegExp.$1 ) / 100 ) + "" :
+                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
                                computed ? "1" : "";
                },
 
@@ -6886,7 +6860,8 @@ if ( !jQuery.support.opacity ) {
                        style.zoom = 1;
 
                        // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+                               style.removeAttribute ) {
 
                                // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
                                // if "filter:" is present at all, clearType is disabled, we want to avoid this
@@ -6907,9 +6882,9 @@ if ( !jQuery.support.opacity ) {
        };
 }
 
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
 jQuery(function() {
-       // This hook cannot be added until DOM ready because the support test
-       // for it is not run until after DOM ready
        if ( !jQuery.support.reliableMarginRight ) {
                jQuery.cssHooks.marginRight = {
                        get: function( elem, computed ) {
@@ -6917,22 +6892,35 @@ jQuery(function() {
                                // Work around by temporarily setting element display to inline-block
                                return jQuery.swap( elem, { "display": "inline-block" }, function() {
                                        if ( computed ) {
-                                               return curCSS( elem, "margin-right" );
-                                       } else {
-                                               return elem.style.marginRight;
+                                               return curCSS( elem, "marginRight" );
                                        }
                                });
                        }
                };
        }
+
+       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+       // getComputedStyle returns percent when specified for top/left/bottom/right
+       // rather than make the css module depend on the offset module, we just check for it here
+       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+               jQuery.each( [ "top", "left" ], function( i, prop ) {
+                       jQuery.cssHooks[ prop ] = {
+                               get: function( elem, computed ) {
+                                       if ( computed ) {
+                                               var ret = curCSS( elem, prop );
+                                               // if curCSS returns percentage, fallback to offset
+                                               return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+                                       }
+                               }
+                       };
+               });
+       }
+
 });
 
 if ( jQuery.expr && jQuery.expr.filters ) {
        jQuery.expr.filters.hidden = function( elem ) {
-               var width = elem.offsetWidth,
-                       height = elem.offsetHeight;
-
-               return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+               return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
        };
 
        jQuery.expr.filters.visible = function( elem ) {
@@ -6946,7 +6934,6 @@ jQuery.each({
        padding: "",
        border: "Width"
 }, function( prefix, suffix ) {
-
        jQuery.cssHooks[ prefix + suffix ] = {
                expand: function( value ) {
                        var i,
@@ -6963,27 +6950,127 @@ jQuery.each({
                        return expanded;
                }
        };
+
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+});
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+       rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map(function(){
+                       return this.elements ? jQuery.makeArray( this.elements ) : this;
+               })
+               .filter(function(){
+                       return this.name && !this.disabled &&
+                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
+                                       rinput.test( this.type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val, i ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
 });
 
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+       var prefix,
+               s = [],
+               add = function( key, value ) {
+                       // If value is a function, invoke it and return its value
+                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+               };
+
+       // Set traditional to true for jQuery <= 1.3.2 behavior.
+       if ( traditional === undefined ) {
+               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+       }
+
+       // If an array was passed in, assume that it is an array of form elements.
+       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+               // Serialize the form elements
+               jQuery.each( a, function() {
+                       add( this.name, this.value );
+               });
 
+       } else {
+               // If traditional, encode the "old" way (the way 1.3.2 or older
+               // did it), otherwise encode params recursively.
+               for ( prefix in a ) {
+                       buildParams( prefix, a[ prefix ], traditional, add );
+               }
+       }
 
+       // Return the resulting serialization
+       return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
+
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
+
+                       } else {
+                               // If array item is non-scalar (array or object), encode its
+                               // numeric index to resolve deserialization ambiguity issues.
+                               // Note that rack (as of 1.0.0) can't currently deserialize
+                               // nested arrays properly, and attempting to do so may cause
+                               // a server error. Possible fixes are to modify rack's
+                               // deserialization algorithm or to provide an option or flag
+                               // to force array serialization to be shallow.
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
+
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+var // Document location
+       ajaxLocation,
+       // Document location segments
+       ajaxLocParts,
 
-var r20 = /%20/g,
-       rbracket = /\[\]$/,
-       rCRLF = /\r?\n/g,
        rhash = /#.*$/,
        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
        // #7653, #8125, #8152: local protocol detection
        rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
        rnoContent = /^(?:GET|HEAD)$/,
        rprotocol = /^\/\//,
        rquery = /\?/,
        rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-       rselectTextarea = /^(?:select|textarea)/i,
-       rspacesAjax = /\s+/,
        rts = /([?&])_=[^&]*/,
-       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
 
        // Keep a copy of the old load method
        _load = jQuery.fn.load,
@@ -7006,12 +7093,6 @@ var r20 = /%20/g,
         */
        transports = {},
 
-       // Document location
-       ajaxLocation,
-
-       // Document location segments
-       ajaxLocParts,
-
        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
        allTypes = ["*/"] + ["*"];
 
@@ -7041,14 +7122,12 @@ function addToPrefiltersOrTransports( structure ) {
                        dataTypeExpression = "*";
                }
 
-               if ( jQuery.isFunction( func ) ) {
-                       var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
-                               i = 0,
-                               length = dataTypes.length,
-                               dataType,
-                               list,
-                               placeBefore;
+               var dataType, list, placeBefore,
+                       dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+                       i = 0,
+                       length = dataTypes.length;
 
+               if ( jQuery.isFunction( func ) ) {
                        // For each dataType in the dataTypeExpression
                        for ( ; i < length; i++ ) {
                                dataType = dataTypes[ i ];
@@ -7075,11 +7154,11 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
 
        inspected[ dataType ] = true;
 
-       var list = structure[ dataType ],
+       var selection,
+               list = structure[ dataType ],
                i = 0,
                length = list ? list.length : 0,
-               executeOnly = ( structure === prefilters ),
-               selection;
+               executeOnly = ( structure === prefilters );
 
        for ( ; i < length && ( executeOnly || !selection ); i++ ) {
                selection = list[ i ]( options, originalOptions, jqXHR );
@@ -7122,109 +7201,75 @@ function ajaxExtend( target, src ) {
        }
 }
 
-jQuery.fn.extend({
-       load: function( url, params, callback ) {
-               if ( typeof url !== "string" && _load ) {
-                       return _load.apply( this, arguments );
+jQuery.fn.load = function( url, params, callback ) {
+       if ( typeof url !== "string" && _load ) {
+               return _load.apply( this, arguments );
+       }
 
-               // Don't do a request if no elements are being requested
-               } else if ( !this.length ) {
-                       return this;
-               }
+       // Don't do a request if no elements are being requested
+       if ( !this.length ) {
+               return this;
+       }
 
-               var off = url.indexOf( " " );
-               if ( off >= 0 ) {
-                       var selector = url.slice( off, url.length );
-                       url = url.slice( 0, off );
-               }
+       var selector, type, response,
+               self = this,
+               off = url.indexOf(" ");
+
+       if ( off >= 0 ) {
+               selector = url.slice( off, url.length );
+               url = url.slice( 0, off );
+       }
+
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
 
-               // Default to a GET request
-               var type = "GET";
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
 
-               // If the second parameter was provided
-               if ( params ) {
-                       // If it's a function
-                       if ( jQuery.isFunction( params ) ) {
-                               // We assume that it's the callback
-                               callback = params;
-                               params = undefined;
+       // Otherwise, build a param string
+       } else if ( typeof params === "object" ) {
+               type = "POST";
+       }
+
+       // Request the remote document
+       jQuery.ajax({
+               url: url,
 
-                       // Otherwise, build a param string
-                       } else if ( typeof params === "object" ) {
-                               params = jQuery.param( params, jQuery.ajaxSettings.traditional );
-                               type = "POST";
+               // if "type" variable is undefined, then "GET" method will be used
+               type: type,
+               dataType: "html",
+               data: params,
+               complete: function( jqXHR, status ) {
+                       if ( callback ) {
+                               self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
                        }
                }
+       }).done(function( responseText ) {
 
-               var self = this;
+               // Save response for use in complete callback
+               response = arguments;
 
-               // Request the remote document
-               jQuery.ajax({
-                       url: url,
-                       type: type,
-                       dataType: "html",
-                       data: params,
-                       // Complete callback (responseText is used internally)
-                       complete: function( jqXHR, status, responseText ) {
-                               // Store the response as specified by the jqXHR object
-                               responseText = jqXHR.responseText;
-                               // If successful, inject the HTML into all the matched elements
-                               if ( jqXHR.isResolved() ) {
-                                       // #4825: Get the actual response in case
-                                       // a dataFilter is present in ajaxSettings
-                                       jqXHR.done(function( r ) {
-                                               responseText = r;
-                                       });
-                                       // See if a selector was specified
-                                       self.html( selector ?
-                                               // Create a dummy div to hold the results
-                                               jQuery("<div>")
-                                                       // inject the contents of the document in, removing the scripts
-                                                       // to avoid any 'Permission Denied' errors in IE
-                                                       .append(responseText.replace(rscript, ""))
-
-                                                       // Locate the specified elements
-                                                       .find(selector) :
-
-                                               // If not, just inject the full result
-                                               responseText );
-                               }
+               // See if a selector was specified
+               self.html( selector ?
 
-                               if ( callback ) {
-                                       self.each( callback, [ responseText, status, jqXHR ] );
-                               }
-                       }
-               });
+                       // Create a dummy div to hold the results
+                       jQuery("<div>")
 
-               return this;
-       },
+                               // inject the contents of the document in, removing the scripts
+                               // to avoid any 'Permission Denied' errors in IE
+                               .append( responseText.replace( rscript, "" ) )
 
-       serialize: function() {
-               return jQuery.param( this.serializeArray() );
-       },
+                               // Locate the specified elements
+                               .find( selector ) :
 
-       serializeArray: function() {
-               return this.map(function(){
-                       return this.elements ? jQuery.makeArray( this.elements ) : this;
-               })
-               .filter(function(){
-                       return this.name && !this.disabled &&
-                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
-                                       rinput.test( this.type ) );
-               })
-               .map(function( i, elem ){
-                       var val = jQuery( this ).val();
+                       // If not, just inject the full result
+                       responseText );
 
-                       return val == null ?
-                               null :
-                               jQuery.isArray( val ) ?
-                                       jQuery.map( val, function( val, i ){
-                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                                       }) :
-                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-               }).get();
-       }
-});
+       });
+
+       return this;
+};
 
 // Attach a bunch of functions for handling common AJAX events
 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
@@ -7293,6 +7338,7 @@ jQuery.extend({
                username: null,
                password: null,
                cache: null,
+               throws: false,
                traditional: false,
                headers: {},
                */
@@ -7359,7 +7405,22 @@ jQuery.extend({
                // Force options to be an object
                options = options || {};
 
-               var // Create the final options object
+               var // ifModified key
+                       ifModifiedKey,
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+                       // transport
+                       transport,
+                       // timeout handle
+                       timeoutTimer,
+                       // Cross-domain detection vars
+                       parts,
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+                       // Loop variable
+                       i,
+                       // Create the final options object
                        s = jQuery.ajaxSetup( {}, options ),
                        // Callbacks context
                        callbackContext = s.context || s,
@@ -7374,26 +7435,13 @@ jQuery.extend({
                        completeDeferred = jQuery.Callbacks( "once memory" ),
                        // Status-dependent callbacks
                        statusCode = s.statusCode || {},
-                       // ifModified key
-                       ifModifiedKey,
                        // Headers (they are sent all at once)
                        requestHeaders = {},
                        requestHeadersNames = {},
-                       // Response headers
-                       responseHeadersString,
-                       responseHeaders,
-                       // transport
-                       transport,
-                       // timeout handle
-                       timeoutTimer,
-                       // Cross-domain detection vars
-                       parts,
                        // The jqXHR state
                        state = 0,
-                       // To know if global events are to be dispatched
-                       fireGlobals,
-                       // Loop variable
-                       i,
+                       // Default abort message
+                       strAbort = "canceled",
                        // Fake xhr
                        jqXHR = {
 
@@ -7439,7 +7487,7 @@ jQuery.extend({
 
                                // Cancel the request
                                abort: function( statusText ) {
-                                       statusText = statusText || "abort";
+                                       statusText = statusText || strAbort;
                                        if ( transport ) {
                                                transport.abort( statusText );
                                        }
@@ -7452,6 +7500,8 @@ jQuery.extend({
                // It is defined here because jslint complains if it is declared
                // at the end of the function (which would be more logical and readable)
                function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
 
                        // Called once
                        if ( state === 2 ) {
@@ -7476,13 +7526,10 @@ jQuery.extend({
                        // Set readyState
                        jqXHR.readyState = status > 0 ? 4 : 0;
 
-                       var isSuccess,
-                               success,
-                               error,
-                               statusText = nativeStatusText,
-                               response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
-                               lastModified,
-                               etag;
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
+                       }
 
                        // If successful, handle type chaining
                        if ( status >= 200 && status < 300 || status === 304 ) {
@@ -7490,11 +7537,13 @@ jQuery.extend({
                                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
                                if ( s.ifModified ) {
 
-                                       if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
-                                               jQuery.lastModified[ ifModifiedKey ] = lastModified;
+                                       modified = jqXHR.getResponseHeader("Last-Modified");
+                                       if ( modified ) {
+                                               jQuery.lastModified[ ifModifiedKey ] = modified;
                                        }
-                                       if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
-                                               jQuery.etag[ ifModifiedKey ] = etag;
+                                       modified = jqXHR.getResponseHeader("Etag");
+                                       if ( modified ) {
+                                               jQuery.etag[ ifModifiedKey ] = modified;
                                        }
                                }
 
@@ -7507,15 +7556,11 @@ jQuery.extend({
                                // If we have data
                                } else {
 
-                                       try {
-                                               success = ajaxConvert( s, response );
-                                               statusText = "success";
-                                               isSuccess = true;
-                                       } catch(e) {
-                                               // We have a parsererror
-                                               statusText = "parsererror";
-                                               error = e;
-                                       }
+                                       isSuccess = ajaxConvert( s, response );
+                                       statusText = isSuccess.state;
+                                       success = isSuccess.data;
+                                       error = isSuccess.error;
+                                       isSuccess = !error;
                                }
                        } else {
                                // We extract error from statusText
@@ -7577,7 +7622,7 @@ jQuery.extend({
                                        }
                                } else {
                                        tmp = map[ jqXHR.status ];
-                                       jqXHR.then( tmp, tmp );
+                                       jqXHR.always( tmp );
                                }
                        }
                        return this;
@@ -7589,7 +7634,7 @@ jQuery.extend({
                s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
 
                // Extract dataTypes list
-               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
 
                // Determine if a cross-domain request is in order
                if ( s.crossDomain == null ) {
@@ -7611,7 +7656,7 @@ jQuery.extend({
 
                // If request was aborted inside a prefilter, stop there
                if ( state === 2 ) {
-                       return false;
+                       return jqXHR;
                }
 
                // We can fire global events as of now if asked to
@@ -7684,12 +7729,14 @@ jQuery.extend({
 
                // Allow custom headers/mimetypes and early abort
                if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-                               // Abort if not done already
-                               jqXHR.abort();
-                               return false;
+                               // Abort if not done already and return
+                               return jqXHR.abort();
 
                }
 
+               // aborting is no longer a cancellation
+               strAbort = "abort";
+
                // Install callbacks on deferreds
                for ( i in { success: 1, error: 1, complete: 1 } ) {
                        jqXHR[ i ]( s[ i ] );
@@ -7728,79 +7775,8 @@ jQuery.extend({
                        }
                }
 
-               return jqXHR;
-       },
-
-       // Serialize an array of form elements or a set of
-       // key/values into a query string
-       param: function( a, traditional ) {
-               var s = [],
-                       add = function( key, value ) {
-                               // If value is a function, invoke it and return its value
-                               value = jQuery.isFunction( value ) ? value() : value;
-                               s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-                       };
-
-               // Set traditional to true for jQuery <= 1.3.2 behavior.
-               if ( traditional === undefined ) {
-                       traditional = jQuery.ajaxSettings.traditional;
-               }
-
-               // If an array was passed in, assume that it is an array of form elements.
-               if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-                       // Serialize the form elements
-                       jQuery.each( a, function() {
-                               add( this.name, this.value );
-                       });
-
-               } else {
-                       // If traditional, encode the "old" way (the way 1.3.2 or older
-                       // did it), otherwise encode params recursively.
-                       for ( var prefix in a ) {
-                               buildParams( prefix, a[ prefix ], traditional, add );
-                       }
-               }
-
-               // Return the resulting serialization
-               return s.join( "&" ).replace( r20, "+" );
-       }
-});
-
-function buildParams( prefix, obj, traditional, add ) {
-       if ( jQuery.isArray( obj ) ) {
-               // Serialize array item.
-               jQuery.each( obj, function( i, v ) {
-                       if ( traditional || rbracket.test( prefix ) ) {
-                               // Treat each array item as a scalar.
-                               add( prefix, v );
-
-                       } else {
-                               // If array item is non-scalar (array or object), encode its
-                               // numeric index to resolve deserialization ambiguity issues.
-                               // Note that rack (as of 1.0.0) can't currently deserialize
-                               // nested arrays properly, and attempting to do so may cause
-                               // a server error. Possible fixes are to modify rack's
-                               // deserialization algorithm or to provide an option or flag
-                               // to force array serialization to be shallow.
-                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
-                       }
-               });
-
-       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-               // Serialize object item.
-               for ( var name in obj ) {
-                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-               }
-
-       } else {
-               // Serialize scalar item.
-               add( prefix, obj );
-       }
-}
-
-// This is still on the jQuery object... for now
-// Want to move this to jQuery.ajax some day
-jQuery.extend({
+               return jqXHR;
+       },
 
        // Counter for holding the number of active queries
        active: 0,
@@ -7818,13 +7794,10 @@ jQuery.extend({
  */
 function ajaxHandleResponses( s, jqXHR, responses ) {
 
-       var contents = s.contents,
+       var ct, type, finalDataType, firstDataType,
+               contents = s.contents,
                dataTypes = s.dataTypes,
-               responseFields = s.responseFields,
-               ct,
-               type,
-               finalDataType,
-               firstDataType;
+               responseFields = s.responseFields;
 
        // Fill responseXXX fields
        for ( type in responseFields ) {
@@ -7883,154 +7856,137 @@ function ajaxHandleResponses( s, jqXHR, responses ) {
 // Chain conversions given the request and the original response
 function ajaxConvert( s, response ) {
 
+       var conv, conv2, current, tmp,
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice(),
+               prev = dataTypes[ 0 ],
+               converters = {},
+               i = 0;
+
        // Apply the dataFilter if provided
        if ( s.dataFilter ) {
                response = s.dataFilter( response, s.dataType );
        }
 
-       var dataTypes = s.dataTypes,
-               converters = {},
-               i,
-               key,
-               length = dataTypes.length,
-               tmp,
-               // Current and previous dataTypes
-               current = dataTypes[ 0 ],
-               prev,
-               // Conversion expression
-               conversion,
-               // Conversion function
-               conv,
-               // Conversion functions (transitive conversion)
-               conv1,
-               conv2;
-
-       // For each dataType in the chain
-       for ( i = 1; i < length; i++ ) {
-
-               // Create converters map
-               // with lowercased keys
-               if ( i === 1 ) {
-                       for ( key in s.converters ) {
-                               if ( typeof key === "string" ) {
-                                       converters[ key.toLowerCase() ] = s.converters[ key ];
-                               }
-                       }
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
                }
+       }
 
-               // Get the dataTypes
-               prev = current;
-               current = dataTypes[ i ];
-
-               // If current is auto dataType, update it to prev
-               if ( current === "*" ) {
-                       current = prev;
-               // If no auto and dataTypes are actually different
-               } else if ( prev !== "*" && prev !== current ) {
-
-                       // Get the converter
-                       conversion = prev + " " + current;
-                       conv = converters[ conversion ] || converters[ "* " + current ];
-
-                       // If there is no direct converter, search transitively
-                       if ( !conv ) {
-                               conv2 = undefined;
-                               for ( conv1 in converters ) {
-                                       tmp = conv1.split( " " );
-                                       if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
-                                               conv2 = converters[ tmp[1] + " " + current ];
-                                               if ( conv2 ) {
-                                                       conv1 = converters[ conv1 ];
-                                                       if ( conv1 === true ) {
-                                                               conv = conv2;
-                                                       } else if ( conv2 === true ) {
-                                                               conv = conv1;
+       // Convert to each sequential dataType, tolerating list modification
+       for ( ; (current = dataTypes[++i]); ) {
+
+               // There's only work to do if current dataType is non-auto
+               if ( current !== "*" ) {
+
+                       // Convert response if prev dataType is non-auto and differs from current
+                       if ( prev !== "*" && prev !== current ) {
+
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
+
+                                               // If conv2 outputs current
+                                               tmp = conv2.split(" ");
+                                               if ( tmp[ 1 ] === current ) {
+
+                                                       // If prev can be converted to accepted input
+                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
+                                                               converters[ "* " + tmp[ 0 ] ];
+                                                       if ( conv ) {
+                                                               // Condense equivalence converters
+                                                               if ( conv === true ) {
+                                                                       conv = converters[ conv2 ];
+
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.splice( i--, 0, current );
+                                                               }
+
+                                                               break;
                                                        }
-                                                       break;
                                                }
                                        }
                                }
-                       }
-                       // If we found no converter, dispatch an error
-                       if ( !( conv || conv2 ) ) {
-                               jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
-                       }
-                       // If found converter is not an equivalence
-                       if ( conv !== true ) {
-                               // Convert with 1 or 2 converters accordingly
-                               response = conv ? conv( response ) : conv2( conv1(response) );
-                       }
-               }
-       }
-       return response;
-}
 
+                               // Apply converter (if not an equivalence)
+                               if ( conv !== true ) {
 
+                                       // Unless errors are allowed to bubble, catch and return them
+                                       if ( conv && s["throws"] ) {
+                                               response = conv( response );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+                                               }
+                                       }
+                               }
+                       }
 
+                       // Update prev for next iteration
+                       prev = current;
+               }
+       }
 
-var jsc = jQuery.now(),
-       jsre = /(\=)\?(&|$)|\?\?/i;
+       return { state: "success", data: response };
+}
+var oldCallbacks = [],
+       rquestion = /\?/,
+       rjsonp = /(=)\?(?=&|$)|\?\?/,
+       nonce = jQuery.now();
 
 // Default jsonp settings
 jQuery.ajaxSetup({
        jsonp: "callback",
        jsonpCallback: function() {
-               return jQuery.expando + "_" + ( jsc++ );
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+               this[ callback ] = true;
+               return callback;
        }
 });
 
 // Detect, normalize options and install callbacks for jsonp requests
 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
 
-       var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
-
-       if ( s.dataTypes[ 0 ] === "jsonp" ||
-               s.jsonp !== false && ( jsre.test( s.url ) ||
-                               inspectData && jsre.test( s.data ) ) ) {
-
-               var responseContainer,
-                       jsonpCallback = s.jsonpCallback =
-                               jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
-                       previous = window[ jsonpCallback ],
-                       url = s.url,
-                       data = s.data,
-                       replace = "$1" + jsonpCallback + "$2";
-
-               if ( s.jsonp !== false ) {
-                       url = url.replace( jsre, replace );
-                       if ( s.url === url ) {
-                               if ( inspectData ) {
-                                       data = data.replace( jsre, replace );
-                               }
-                               if ( s.data === data ) {
-                                       // Add callback manually
-                                       url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
-                               }
-                       }
+       var callbackName, overwritten, responseContainer,
+               data = s.data,
+               url = s.url,
+               hasCallback = s.jsonp !== false,
+               replaceInUrl = hasCallback && rjsonp.test( url ),
+               replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+                       !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+                       rjsonp.test( data );
+
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
+               overwritten = window[ callbackName ];
+
+               // Insert callback into url or form data
+               if ( replaceInUrl ) {
+                       s.url = url.replace( rjsonp, "$1" + callbackName );
+               } else if ( replaceInData ) {
+                       s.data = data.replace( rjsonp, "$1" + callbackName );
+               } else if ( hasCallback ) {
+                       s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
                }
 
-               s.url = url;
-               s.data = data;
-
-               // Install callback
-               window[ jsonpCallback ] = function( response ) {
-                       responseContainer = [ response ];
-               };
-
-               // Clean-up function
-               jqXHR.always(function() {
-                       // Set callback back to previous value
-                       window[ jsonpCallback ] = previous;
-                       // Call if it was a function and we have a response
-                       if ( responseContainer && jQuery.isFunction( previous ) ) {
-                               window[ jsonpCallback ]( responseContainer[ 0 ] );
-                       }
-               });
-
                // Use data converter to retrieve json after script execution
                s.converters["script json"] = function() {
                        if ( !responseContainer ) {
-                               jQuery.error( jsonpCallback + " was not called" );
+                               jQuery.error( callbackName + " was not called" );
                        }
                        return responseContainer[ 0 ];
                };
@@ -8038,14 +7994,37 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
                // force json dataType
                s.dataTypes[ 0 ] = "json";
 
-               // Delegate to script
-               return "script";
-       }
-});
+               // Install callback
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
+
+               // Clean-up function (fires after converters)
+               jqXHR.always(function() {
+                       // Restore preexisting value
+                       window[ callbackName ] = overwritten;
+
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+                               // make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
 
+                               // save the callback name for future use
+                               oldCallbacks.push( callbackName );
+                       }
 
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 0 ] );
+                       }
 
+                       responseContainer = overwritten = undefined;
+               });
 
+               // Delegate to script
+               return "script";
+       }
+});
 // Install script dataType
 jQuery.ajaxSetup({
        accepts: {
@@ -8131,19 +8110,15 @@ jQuery.ajaxTransport( "script", function(s) {
                };
        }
 });
-
-
-
-
-var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+var xhrCallbacks,
+       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
        xhrOnUnloadAbort = window.ActiveXObject ? function() {
                // Abort all pending requests
                for ( var key in xhrCallbacks ) {
                        xhrCallbacks[ key ]( 0, 1 );
                }
        } : false,
-       xhrId = 0,
-       xhrCallbacks;
+       xhrId = 0;
 
 // Functions to create xhrs
 function createStandardXHR() {
@@ -8194,9 +8169,8 @@ if ( jQuery.support.ajax ) {
                                send: function( headers, complete ) {
 
                                        // Get a new xhr
-                                       var xhr = s.xhr(),
-                                               handle,
-                                               i;
+                                       var handle, i,
+                                               xhr = s.xhr();
 
                                        // Open the socket
                                        // Passing null username, generates a login popup on Opera (#2865)
@@ -8249,7 +8223,7 @@ if ( jQuery.support.ajax ) {
                                                        xml;
 
                                                // Firefox throws exceptions when accessing properties
-                                               // of an xhr when a network error occured
+                                               // of an xhr when a network error occurred
                                                // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
                                                try {
 
@@ -8325,11 +8299,13 @@ if ( jQuery.support.ajax ) {
                                                }
                                        };
 
-                                       // if we're in sync mode or it's in cache
-                                       // and has been retrieved directly (IE6 & IE7)
-                                       // we need to manually fire the callback
-                                       if ( !s.async || xhr.readyState === 4 ) {
+                                       if ( !s.async ) {
+                                               // if we're in sync mode we fire the callback
                                                callback();
+                                       } else if ( xhr.readyState === 4 ) {
+                                               // (IE6 & IE7) if it's in cache and has been
+                                               // retrieved directly we need to fire the callback
+                                               setTimeout( callback, 0 );
                                        } else {
                                                handle = ++xhrId;
                                                if ( xhrOnUnloadAbort ) {
@@ -8353,793 +8329,662 @@ if ( jQuery.support.ajax ) {
                                }
                        };
                }
-       });
-}
-
-
-
-
-var elemdisplay = {},
-       iframe, iframeDoc,
-       rfxtypes = /^(?:toggle|show|hide)$/,
-       rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
-       timerId,
-       fxAttrs = [
-               // height animations
-               [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
-               // width animations
-               [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
-               // opacity animations
-               [ "opacity" ]
-       ],
-       fxNow;
-
-jQuery.fn.extend({
-       show: function( speed, easing, callback ) {
-               var elem, display;
-
-               if ( speed || speed === 0 ) {
-                       return this.animate( genFx("show", 3), speed, easing, callback );
-
-               } else {
-                       for ( var i = 0, j = this.length; i < j; i++ ) {
-                               elem = this[ i ];
-
-                               if ( elem.style ) {
-                                       display = elem.style.display;
-
-                                       // Reset the inline display of this element to learn if it is
-                                       // being hidden by cascaded rules or not
-                                       if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
-                                               display = elem.style.display = "";
-                                       }
-
-                                       // Set elements which have been overridden with display: none
-                                       // in a stylesheet to whatever the default browser style is
-                                       // for such an element
-                                       if ( (display === "" && jQuery.css(elem, "display") === "none") ||
-                                               !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
-                                               jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
-                                       }
-                               }
-                       }
-
-                       // Set the display of most of the elements in a second loop
-                       // to avoid the constant reflow
-                       for ( i = 0; i < j; i++ ) {
-                               elem = this[ i ];
-
-                               if ( elem.style ) {
-                                       display = elem.style.display;
-
-                                       if ( display === "" || display === "none" ) {
-                                               elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
-                                       }
-                               }
-                       }
-
-                       return this;
-               }
-       },
-
-       hide: function( speed, easing, callback ) {
-               if ( speed || speed === 0 ) {
-                       return this.animate( genFx("hide", 3), speed, easing, callback);
-
-               } else {
-                       var elem, display,
-                               i = 0,
-                               j = this.length;
-
-                       for ( ; i < j; i++ ) {
-                               elem = this[i];
-                               if ( elem.style ) {
-                                       display = jQuery.css( elem, "display" );
-
-                                       if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
-                                               jQuery._data( elem, "olddisplay", display );
-                                       }
-                               }
-                       }
-
-                       // Set the display of the elements in a second loop
-                       // to avoid the constant reflow
-                       for ( i = 0; i < j; i++ ) {
-                               if ( this[i].style ) {
-                                       this[i].style.display = "none";
-                               }
-                       }
-
-                       return this;
-               }
-       },
-
-       // Save the old toggle function
-       _toggle: jQuery.fn.toggle,
-
-       toggle: function( fn, fn2, callback ) {
-               var bool = typeof fn === "boolean";
-
-               if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
-                       this._toggle.apply( this, arguments );
-
-               } else if ( fn == null || bool ) {
-                       this.each(function() {
-                               var state = bool ? fn : jQuery(this).is(":hidden");
-                               jQuery(this)[ state ? "show" : "hide" ]();
-                       });
-
-               } else {
-                       this.animate(genFx("toggle", 3), fn, fn2, callback);
-               }
-
-               return this;
-       },
-
-       fadeTo: function( speed, to, easing, callback ) {
-               return this.filter(":hidden").css("opacity", 0).show().end()
-                                       .animate({opacity: to}, speed, easing, callback);
-       },
-
-       animate: function( prop, speed, easing, callback ) {
-               var optall = jQuery.speed( speed, easing, callback );
-
-               if ( jQuery.isEmptyObject( prop ) ) {
-                       return this.each( optall.complete, [ false ] );
-               }
-
-               // Do not change referenced properties as per-property easing will be lost
-               prop = jQuery.extend( {}, prop );
-
-               function doAnimation() {
-                       // XXX 'this' does not always have a nodeName when running the
-                       // test suite
-
-                       if ( optall.queue === false ) {
-                               jQuery._mark( this );
-                       }
-
-                       var opt = jQuery.extend( {}, optall ),
-                               isElement = this.nodeType === 1,
-                               hidden = isElement && jQuery(this).is(":hidden"),
-                               name, val, p, e, hooks, replace,
-                               parts, start, end, unit,
-                               method;
-
-                       // will store per property easing and be used to determine when an animation is complete
-                       opt.animatedProperties = {};
-
-                       // first pass over propertys to expand / normalize
-                       for ( p in prop ) {
-                               name = jQuery.camelCase( p );
-                               if ( p !== name ) {
-                                       prop[ name ] = prop[ p ];
-                                       delete prop[ p ];
-                               }
-
-                               if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
-                                       replace = hooks.expand( prop[ name ] );
-                                       delete prop[ name ];
-
-                                       // not quite $.extend, this wont overwrite keys already present.
-                                       // also - reusing 'p' from above because we have the correct "name"
-                                       for ( p in replace ) {
-                                               if ( ! ( p in prop ) ) {
-                                                       prop[ p ] = replace[ p ];
-                                               }
-                                       }
-                               }
-                       }
-
-                       for ( name in prop ) {
-                               val = prop[ name ];
-                               // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
-                               if ( jQuery.isArray( val ) ) {
-                                       opt.animatedProperties[ name ] = val[ 1 ];
-                                       val = prop[ name ] = val[ 0 ];
-                               } else {
-                                       opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
-                               }
-
-                               if ( val === "hide" && hidden || val === "show" && !hidden ) {
-                                       return opt.complete.call( this );
-                               }
-
-                               if ( isElement && ( name === "height" || name === "width" ) ) {
-                                       // Make sure that nothing sneaks out
-                                       // Record all 3 overflow attributes because IE does not
-                                       // change the overflow attribute when overflowX and
-                                       // overflowY are set to the same value
-                                       opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
-
-                                       // Set display property to inline-block for height/width
-                                       // animations on inline elements that are having width/height animated
-                                       if ( jQuery.css( this, "display" ) === "inline" &&
-                                                       jQuery.css( this, "float" ) === "none" ) {
-
-                                               // inline-level elements accept inline-block;
-                                               // block-level elements need to be inline with layout
-                                               if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
-                                                       this.style.display = "inline-block";
-
-                                               } else {
-                                                       this.style.zoom = 1;
-                                               }
-                                       }
-                               }
-                       }
-
-                       if ( opt.overflow != null ) {
-                               this.style.overflow = "hidden";
-                       }
-
-                       for ( p in prop ) {
-                               e = new jQuery.fx( this, opt, p );
-                               val = prop[ p ];
-
-                               if ( rfxtypes.test( val ) ) {
-
-                                       // Tracks whether to show or hide based on private
-                                       // data attached to the element
-                                       method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
-                                       if ( method ) {
-                                               jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
-                                               e[ method ]();
-                                       } else {
-                                               e[ val ]();
-                                       }
-
-                               } else {
-                                       parts = rfxnum.exec( val );
-                                       start = e.cur();
-
-                                       if ( parts ) {
-                                               end = parseFloat( parts[2] );
-                                               unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
-
-                                               // We need to compute starting value
-                                               if ( unit !== "px" ) {
-                                                       jQuery.style( this, p, (end || 1) + unit);
-                                                       start = ( (end || 1) / e.cur() ) * start;
-                                                       jQuery.style( this, p, start + unit);
-                                               }
-
-                                               // If a +=/-= token was provided, we're doing a relative animation
-                                               if ( parts[1] ) {
-                                                       end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
-                                               }
-
-                                               e.custom( start, end, unit );
-
-                                       } else {
-                                               e.custom( start, val, "" );
-                                       }
-                               }
-                       }
-
-                       // For JS strict compliance
-                       return true;
-               }
-
-               return optall.queue === false ?
-                       this.each( doAnimation ) :
-                       this.queue( optall.queue, doAnimation );
-       },
-
-       stop: function( type, clearQueue, gotoEnd ) {
-               if ( typeof type !== "string" ) {
-                       gotoEnd = clearQueue;
-                       clearQueue = type;
-                       type = undefined;
-               }
-               if ( clearQueue && type !== false ) {
-                       this.queue( type || "fx", [] );
-               }
-
-               return this.each(function() {
-                       var index,
-                               hadTimers = false,
-                               timers = jQuery.timers,
-                               data = jQuery._data( this );
-
-                       // clear marker counters if we know they won't be
-                       if ( !gotoEnd ) {
-                               jQuery._unmark( true, this );
-                       }
-
-                       function stopQueue( elem, data, index ) {
-                               var hooks = data[ index ];
-                               jQuery.removeData( elem, index, true );
-                               hooks.stop( gotoEnd );
-                       }
-
-                       if ( type == null ) {
-                               for ( index in data ) {
-                                       if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
-                                               stopQueue( this, data, index );
-                                       }
-                               }
-                       } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
-                               stopQueue( this, data, index );
-                       }
-
-                       for ( index = timers.length; index--; ) {
-                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-                                       if ( gotoEnd ) {
-
-                                               // force the next step to be the last
-                                               timers[ index ]( true );
-                                       } else {
-                                               timers[ index ].saveState();
-                                       }
-                                       hadTimers = true;
-                                       timers.splice( index, 1 );
-                               }
-                       }
-
-                       // start the next in the queue if the last step wasn't forced
-                       // timers currently will call their complete callbacks, which will dequeue
-                       // but only if they were gotoEnd
-                       if ( !( gotoEnd && hadTimers ) ) {
-                               jQuery.dequeue( this, type );
-                       }
-               });
-       }
-
-});
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-       setTimeout( clearFxNow, 0 );
-       return ( fxNow = jQuery.now() );
-}
-
-function clearFxNow() {
-       fxNow = undefined;
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, num ) {
-       var obj = {};
-
-       jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
-               obj[ this ] = type;
-       });
-
-       return obj;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
-       slideDown: genFx( "show", 1 ),
-       slideUp: genFx( "hide", 1 ),
-       slideToggle: genFx( "toggle", 1 ),
-       fadeIn: { opacity: "show" },
-       fadeOut: { opacity: "hide" },
-       fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-       jQuery.fn[ name ] = function( speed, easing, callback ) {
-               return this.animate( props, speed, easing, callback );
+       });
+}
+var fxNow, timerId,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+       rrun = /queueHooks$/,
+       animationPrefilters = [ defaultPrefilter ],
+       tweeners = {
+               "*": [function( prop, value ) {
+                       var end, unit, prevScale,
+                               tween = this.createTween( prop, value ),
+                               parts = rfxnum.exec( value ),
+                               target = tween.cur(),
+                               start = +target || 0,
+                               scale = 1;
+
+                       if ( parts ) {
+                               end = +parts[2];
+                               unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+                               // We need to compute starting value
+                               if ( unit !== "px" && start ) {
+                                       // Iteratively approximate from a nonzero starting point
+                                       // Prefer the current property, because this process will be trivial if it uses the same units
+                                       // Fallback to end or a simple constant
+                                       start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+                                       do {
+                                               // If previous iteration zeroed out, double until we get *something*
+                                               // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+                                               prevScale = scale = scale || ".5";
+
+                                               // Adjust and apply
+                                               start = start / scale;
+                                               jQuery.style( tween.elem, prop, start + unit );
+
+                                               // Update scale, tolerating zeroes from tween.cur()
+                                               scale = tween.cur() / target;
+
+                                       // Stop looping if we've hit the mark or scale is unchanged
+                                       } while ( scale !== 1 && scale !== prevScale );
+                               }
+
+                               tween.unit = unit;
+                               tween.start = start;
+                               // If a +=/-= token was provided, we're doing a relative animation
+                               tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+                       }
+                       return tween;
+               }]
        };
-});
 
-jQuery.extend({
-       speed: function( speed, easing, fn ) {
-               var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-                       complete: fn || !fn && easing ||
-                               jQuery.isFunction( speed ) && speed,
-                       duration: speed,
-                       easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-               };
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout(function() {
+               fxNow = undefined;
+       }, 0 );
+       return ( fxNow = jQuery.now() );
+}
 
-               opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-                       opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+function createTweens( animation, props ) {
+       jQuery.each( props, function( prop, value ) {
+               var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+                       index = 0,
+                       length = collection.length;
+               for ( ; index < length; index++ ) {
+                       if ( collection[ index ].call( animation, prop, value ) ) {
 
-               // normalize opt.queue - true/undefined/null -> "fx"
-               if ( opt.queue == null || opt.queue === true ) {
-                       opt.queue = "fx";
+                               // we're done with this property
+                               return;
+                       }
                }
+       });
+}
 
-               // Queueing
-               opt.old = opt.complete;
-
-               opt.complete = function( noUnmark ) {
-                       if ( jQuery.isFunction( opt.old ) ) {
-                               opt.old.call( this );
+function Animation( elem, properties, options ) {
+       var result,
+               index = 0,
+               tweenerIndex = 0,
+               length = animationPrefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+                       // don't match elem in the :animated selector
+                       delete tick.elem;
+               }),
+               tick = function() {
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+                               percent = 1 - ( remaining / animation.duration || 0 ),
+                               index = 0,
+                               length = animation.tweens.length;
+
+                       for ( ; index < length ; index++ ) {
+                               animation.tweens[ index ].run( percent );
+                       }
+
+                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+                       if ( percent < 1 && length ) {
+                               return remaining;
+                       } else {
+                               deferred.resolveWith( elem, [ animation ] );
+                               return false;
                        }
+               },
+               animation = deferred.promise({
+                       elem: elem,
+                       props: jQuery.extend( {}, properties ),
+                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
+                       originalProperties: properties,
+                       originalOptions: options,
+                       startTime: fxNow || createFxNow(),
+                       duration: options.duration,
+                       tweens: [],
+                       createTween: function( prop, end, easing ) {
+                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
+                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
+                               animation.tweens.push( tween );
+                               return tween;
+                       },
+                       stop: function( gotoEnd ) {
+                               var index = 0,
+                                       // if we are going to the end, we want to run all the tweens
+                                       // otherwise we skip this part
+                                       length = gotoEnd ? animation.tweens.length : 0;
+
+                               for ( ; index < length ; index++ ) {
+                                       animation.tweens[ index ].run( 1 );
+                               }
 
-                       if ( opt.queue ) {
-                               jQuery.dequeue( this, opt.queue );
-                       } else if ( noUnmark !== false ) {
-                               jQuery._unmark( this );
+                               // resolve when we played the last frame
+                               // otherwise, reject
+                               if ( gotoEnd ) {
+                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                               } else {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                               }
+                               return this;
                        }
-               };
+               }),
+               props = animation.props;
 
-               return opt;
-       },
+       propFilter( props, animation.opts.specialEasing );
 
-       easing: {
-               linear: function( p ) {
-                       return p;
-               },
-               swing: function( p ) {
-                       return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
+       for ( ; index < length ; index++ ) {
+               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       return result;
                }
-       },
-
-       timers: [],
+       }
 
-       fx: function( elem, options, prop ) {
-               this.options = options;
-               this.elem = elem;
-               this.prop = prop;
+       createTweens( animation, props );
 
-               options.orig = options.orig || {};
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
        }
 
-});
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       anim: animation,
+                       queue: animation.opts.queue,
+                       elem: elem
+               })
+       );
 
-jQuery.fx.prototype = {
-       // Simple function for setting a style value
-       update: function() {
-               if ( this.options.step ) {
-                       this.options.step.call( this.elem, this.now, this );
-               }
+       // attach callbacks from options
+       return animation.progress( animation.opts.progress )
+               .done( animation.opts.done, animation.opts.complete )
+               .fail( animation.opts.fail )
+               .always( animation.opts.always );
+}
 
-               ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
-       },
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
 
-       // Get the current size
-       cur: function() {
-               if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
-                       return this.elem[ this.prop ];
+       // camelCase, specialEasing and expand cssHook pass
+       for ( index in props ) {
+               name = jQuery.camelCase( index );
+               easing = specialEasing[ name ];
+               value = props[ index ];
+               if ( jQuery.isArray( value ) ) {
+                       easing = value[ 1 ];
+                       value = props[ index ] = value[ 0 ];
                }
 
-               var parsed,
-                       r = jQuery.css( this.elem, this.prop );
-               // Empty strings, null, undefined and "auto" are converted to 0,
-               // complex values such as "rotate(1rad)" are returned as is,
-               // simple values such as "10px" are parsed to Float.
-               return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
-       },
-
-       // Start an animation from one number to another
-       custom: function( from, to, unit ) {
-               var self = this,
-                       fx = jQuery.fx;
-
-               this.startTime = fxNow || createFxNow();
-               this.end = to;
-               this.now = this.start = from;
-               this.pos = this.state = 0;
-               this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
-
-               function t( gotoEnd ) {
-                       return self.step( gotoEnd );
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
                }
 
-               t.queue = this.options.queue;
-               t.elem = this.elem;
-               t.saveState = function() {
-                       if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
-                               if ( self.options.hide ) {
-                                       jQuery._data( self.elem, "fxshow" + self.prop, self.start );
-                               } else if ( self.options.show ) {
-                                       jQuery._data( self.elem, "fxshow" + self.prop, self.end );
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
+
+                       // not quite $.extend, this wont overwrite keys already present.
+                       // also - reusing 'index' from above because we have the correct "name"
+                       for ( index in value ) {
+                               if ( !( index in props ) ) {
+                                       props[ index ] = value[ index ];
+                                       specialEasing[ index ] = easing;
                                }
                        }
-               };
-
-               if ( t() && jQuery.timers.push(t) && !timerId ) {
-                       timerId = setInterval( fx.tick, fx.interval );
+               } else {
+                       specialEasing[ name ] = easing;
                }
-       },
-
-       // Simple 'show' function
-       show: function() {
-               var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+       }
+}
 
-               // Remember where we started, so that we can go back to it later
-               this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
-               this.options.show = true;
+jQuery.Animation = jQuery.extend( Animation, {
 
-               // Begin the animation
-               // Make sure that we start at a small width/height to avoid any flash of content
-               if ( dataShow !== undefined ) {
-                       // This show is picking up where a previous hide or show left off
-                       this.custom( this.cur(), dataShow );
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
                } else {
-                       this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+                       props = props.split(" ");
                }
 
-               // Start by showing the element
-               jQuery( this.elem ).show();
-       },
-
-       // Simple 'hide' function
-       hide: function() {
-               // Remember where we started, so that we can go back to it later
-               this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
-               this.options.hide = true;
+               var prop,
+                       index = 0,
+                       length = props.length;
 
-               // Begin the animation
-               this.custom( this.cur(), 0 );
+               for ( ; index < length ; index++ ) {
+                       prop = props[ index ];
+                       tweeners[ prop ] = tweeners[ prop ] || [];
+                       tweeners[ prop ].unshift( callback );
+               }
        },
 
-       // Each step of an animation
-       step: function( gotoEnd ) {
-               var p, n, complete,
-                       t = fxNow || createFxNow(),
-                       done = true,
-                       elem = this.elem,
-                       options = this.options;
-
-               if ( gotoEnd || t >= options.duration + this.startTime ) {
-                       this.now = this.end;
-                       this.pos = this.state = 1;
-                       this.update();
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       animationPrefilters.unshift( callback );
+               } else {
+                       animationPrefilters.push( callback );
+               }
+       }
+});
 
-                       options.animatedProperties[ this.prop ] = true;
+function defaultPrefilter( elem, props, opts ) {
+       var index, prop, value, length, dataShow, tween, hooks, oldfire,
+               anim = this,
+               style = elem.style,
+               orig = {},
+               handled = [],
+               hidden = elem.nodeType && isHidden( elem );
+
+       // handle queue: false promises
+       if ( !opts.queue ) {
+               hooks = jQuery._queueHooks( elem, "fx" );
+               if ( hooks.unqueued == null ) {
+                       hooks.unqueued = 0;
+                       oldfire = hooks.empty.fire;
+                       hooks.empty.fire = function() {
+                               if ( !hooks.unqueued ) {
+                                       oldfire();
+                               }
+                       };
+               }
+               hooks.unqueued++;
 
-                       for ( p in options.animatedProperties ) {
-                               if ( options.animatedProperties[ p ] !== true ) {
-                                       done = false;
+               anim.always(function() {
+                       // doing this makes sure that the complete handler will be called
+                       // before this completes
+                       anim.always(function() {
+                               hooks.unqueued--;
+                               if ( !jQuery.queue( elem, "fx" ).length ) {
+                                       hooks.empty.fire();
                                }
-                       }
+                       });
+               });
+       }
 
-                       if ( done ) {
-                               // Reset the overflow
-                               if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+       // height/width overflow pass
+       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+               // Make sure that nothing sneaks out
+               // Record all 3 overflow attributes because IE does not
+               // change the overflow attribute when overflowX and
+               // overflowY are set to the same value
+               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
 
-                                       jQuery.each( [ "", "X", "Y" ], function( index, value ) {
-                                               elem.style[ "overflow" + value ] = options.overflow[ index ];
-                                       });
-                               }
+               // Set display property to inline-block for height/width
+               // animations on inline elements that are having width/height animated
+               if ( jQuery.css( elem, "display" ) === "inline" &&
+                               jQuery.css( elem, "float" ) === "none" ) {
 
-                               // Hide the element if the "hide" operation was done
-                               if ( options.hide ) {
-                                       jQuery( elem ).hide();
-                               }
+                       // inline-level elements accept inline-block;
+                       // block-level elements need to be inline with layout
+                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+                               style.display = "inline-block";
 
-                               // Reset the properties, if the item has been hidden or shown
-                               if ( options.hide || options.show ) {
-                                       for ( p in options.animatedProperties ) {
-                                               jQuery.style( elem, p, options.orig[ p ] );
-                                               jQuery.removeData( elem, "fxshow" + p, true );
-                                               // Toggle data is no longer needed
-                                               jQuery.removeData( elem, "toggle" + p, true );
-                                       }
-                               }
+                       } else {
+                               style.zoom = 1;
+                       }
+               }
+       }
 
-                               // Execute the complete function
-                               // in the event that the complete function throws an exception
-                               // we must ensure it won't be called twice. #5684
+       if ( opts.overflow ) {
+               style.overflow = "hidden";
+               if ( !jQuery.support.shrinkWrapBlocks ) {
+                       anim.done(function() {
+                               style.overflow = opts.overflow[ 0 ];
+                               style.overflowX = opts.overflow[ 1 ];
+                               style.overflowY = opts.overflow[ 2 ];
+                       });
+               }
+       }
 
-                               complete = options.complete;
-                               if ( complete ) {
 
-                                       options.complete = false;
-                                       complete.call( elem );
-                               }
+       // show/hide pass
+       for ( index in props ) {
+               value = props[ index ];
+               if ( rfxtypes.exec( value ) ) {
+                       delete props[ index ];
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
+                               continue;
                        }
+                       handled.push( index );
+               }
+       }
 
-                       return false;
-
+       length = handled.length;
+       if ( length ) {
+               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+               if ( hidden ) {
+                       jQuery( elem ).show();
                } else {
-                       // classical easing cannot be used with an Infinity duration
-                       if ( options.duration == Infinity ) {
-                               this.now = t;
-                       } else {
-                               n = t - this.startTime;
-                               this.state = n / options.duration;
+                       anim.done(function() {
+                               jQuery( elem ).hide();
+                       });
+               }
+               anim.done(function() {
+                       var prop;
+                       jQuery.removeData( elem, "fxshow", true );
+                       for ( prop in orig ) {
+                               jQuery.style( elem, prop, orig[ prop ] );
+                       }
+               });
+               for ( index = 0 ; index < length ; index++ ) {
+                       prop = handled[ index ];
+                       tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+                       orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
 
-                               // Perform the easing function, defaults to swing
-                               this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
-                               this.now = this.start + ( (this.end - this.start) * this.pos );
+                       if ( !( prop in dataShow ) ) {
+                               dataShow[ prop ] = tween.start;
+                               if ( hidden ) {
+                                       tween.end = tween.start;
+                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                               }
                        }
-                       // Perform the next step of the animation
-                       this.update();
                }
-
-               return true;
        }
-};
+}
 
-jQuery.extend( jQuery.fx, {
-       tick: function() {
-               var timer,
-                       timers = jQuery.timers,
-                       i = 0;
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
 
-               for ( ; i < timers.length; i++ ) {
-                       timer = timers[ i ];
-                       // Checks the timer has not already been removed
-                       if ( !timer() && timers[ i ] === timer ) {
-                               timers.splice( i--, 1 );
-                       }
+Tween.prototype = {
+       constructor: Tween,
+       init: function( elem, options, prop, end, easing, unit ) {
+               this.elem = elem;
+               this.prop = prop;
+               this.easing = easing || "swing";
+               this.options = options;
+               this.start = this.now = this.cur();
+               this.end = end;
+               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+       },
+       cur: function() {
+               var hooks = Tween.propHooks[ this.prop ];
+
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
+       },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
+
+               this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration );
+               this.now = ( this.end - this.start ) * eased + this.start;
+
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
                }
 
-               if ( !timers.length ) {
-                       jQuery.fx.stop();
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
                }
-       },
+               return this;
+       }
+};
 
-       interval: 13,
+Tween.prototype.init.prototype = Tween.prototype;
 
-       stop: function() {
-               clearInterval( timerId );
-               timerId = null;
-       },
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
 
-       speeds: {
-               slow: 600,
-               fast: 200,
-               // Default speed
-               _default: 400
-       },
+                       if ( tween.elem[ tween.prop ] != null &&
+                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+                               return tween.elem[ tween.prop ];
+                       }
 
-       step: {
-               opacity: function( fx ) {
-                       jQuery.style( fx.elem, "opacity", fx.now );
+                       // passing any value as a 4th parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails
+                       // so, simple values such as "10px" are parsed to Float.
+                       // complex values such as "rotate(1rad)" are returned as is.
+                       result = jQuery.css( tween.elem, tween.prop, false, "" );
+                       // Empty strings, null, undefined and "auto" are converted to 0.
+                       return !result || result === "auto" ? 0 : result;
                },
-
-               _default: function( fx ) {
-                       if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
-                               fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+               set: function( tween ) {
+                       // use step hook for back compat - use cssHook if its there - use .style if its
+                       // available and use plain properties where available
+                       if ( jQuery.fx.step[ tween.prop ] ) {
+                               jQuery.fx.step[ tween.prop ]( tween );
+                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
                        } else {
-                               fx.elem[ fx.prop ] = fx.now;
+                               tween.elem[ tween.prop ] = tween.now;
                        }
                }
        }
-});
+};
 
-// Ensure props that can't be negative don't go there on undershoot easing
-jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
-       // exclude marginTop, marginLeft, marginBottom and marginRight from this list
-       if ( prop.indexOf( "margin" ) ) {
-               jQuery.fx.step[ prop ] = function( fx ) {
-                       jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
-               };
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+       set: function( tween ) {
+               if ( tween.elem.nodeType && tween.elem.parentNode ) {
+                       tween.elem[ tween.prop ] = tween.now;
+               }
        }
-});
+};
 
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.animated = function( elem ) {
-               return jQuery.grep(jQuery.timers, function( fn ) {
-                       return elem === fn.elem;
-               }).length;
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+       var cssFn = jQuery.fn[ name ];
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return speed == null || typeof speed === "boolean" ||
+                       // special check for .toggle( handler, handler, ... )
+                       ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
        };
-}
+});
 
-// Try to restore the default display value of an element
-function defaultDisplay( nodeName ) {
+jQuery.fn.extend({
+       fadeTo: function( speed, to, easing, callback ) {
 
-       if ( !elemdisplay[ nodeName ] ) {
+               // show any hidden elements after setting opacity to 0
+               return this.filter( isHidden ).css( "opacity", 0 ).show()
 
-               var body = document.body,
-                       elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
-                       display = elem.css( "display" );
-               elem.remove();
+                       // animate to the value specified
+                       .end().animate({ opacity: to }, speed, easing, callback );
+       },
+       animate: function( prop, speed, easing, callback ) {
+               var empty = jQuery.isEmptyObject( prop ),
+                       optall = jQuery.speed( speed, easing, callback ),
+                       doAnimation = function() {
+                               // Operate on a copy of prop so per-property easing won't be lost
+                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
 
-               // If the simple way fails,
-               // get element's real default display by attaching it to a temp iframe
-               if ( display === "none" || display === "" ) {
-                       // No iframe to use yet, so create it
-                       if ( !iframe ) {
-                               iframe = document.createElement( "iframe" );
-                               iframe.frameBorder = iframe.width = iframe.height = 0;
-                       }
+                               // Empty animations resolve immediately
+                               if ( empty ) {
+                                       anim.stop( true );
+                               }
+                       };
 
-                       body.appendChild( iframe );
+               return empty || optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+       stop: function( type, clearQueue, gotoEnd ) {
+               var stopQueue = function( hooks ) {
+                       var stop = hooks.stop;
+                       delete hooks.stop;
+                       stop( gotoEnd );
+               };
+
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
+
+               return this.each(function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
 
-                       // Create a cacheable copy of the iframe document on first call.
-                       // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
-                       // document to it; WebKit & Firefox won't allow reusing the iframe document.
-                       if ( !iframeDoc || !iframe.createElement ) {
-                               iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-                               iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
-                               iframeDoc.close();
+                       if ( index ) {
+                               if ( data[ index ] && data[ index ].stop ) {
+                                       stopQueue( data[ index ] );
+                               }
+                       } else {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+                                               stopQueue( data[ index ] );
+                                       }
+                               }
                        }
 
-                       elem = iframeDoc.createElement( nodeName );
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                       timers[ index ].anim.stop( gotoEnd );
+                                       dequeue = false;
+                                       timers.splice( index, 1 );
+                               }
+                       }
 
-                       iframeDoc.body.appendChild( elem );
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( dequeue || !gotoEnd ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       }
+});
 
-                       display = jQuery.css( elem, "display" );
-                       body.removeChild( iframe );
-               }
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+       var which,
+               attrs = { height: type },
+               i = 0;
+
+       // if we include width, step value is 1 to do all cssExpand values,
+       // if we don't include width, step value is 2 to skip over Left and Right
+       for( ; i < 4 ; i += 2 - includeWidth ) {
+               which = cssExpand[ i ];
+               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+       }
 
-               // Store the correct default display
-               elemdisplay[ nodeName ] = display;
+       if ( includeWidth ) {
+               attrs.opacity = attrs.width = type;
        }
 
-       return elemdisplay[ nodeName ];
+       return attrs;
 }
 
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show"),
+       slideUp: genFx("hide"),
+       slideToggle: genFx("toggle"),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
 
+jQuery.speed = function( speed, easing, fn ) {
+       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+               complete: fn || !fn && easing ||
+                       jQuery.isFunction( speed ) && speed,
+               duration: speed,
+               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+       };
 
+       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
 
-var getOffset,
-       rtable = /^t(?:able|d|h)$/i,
-       rroot = /^(?:body|html)$/i;
+       // normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
+       }
 
-if ( "getBoundingClientRect" in document.documentElement ) {
-       getOffset = function( elem, doc, docElem, box ) {
-               try {
-                       box = elem.getBoundingClientRect();
-               } catch(e) {}
+       // Queueing
+       opt.old = opt.complete;
 
-               // Make sure we're not dealing with a disconnected DOM node
-               if ( !box || !jQuery.contains( docElem, elem ) ) {
-                       return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
                }
 
-               var body = doc.body,
-                       win = getWindow( doc ),
-                       clientTop  = docElem.clientTop  || body.clientTop  || 0,
-                       clientLeft = docElem.clientLeft || body.clientLeft || 0,
-                       scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
-                       scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
-                       top  = box.top  + scrollTop  - clientTop,
-                       left = box.left + scrollLeft - clientLeft;
-
-               return { top: top, left: left };
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
+               }
        };
 
-} else {
-       getOffset = function( elem, doc, docElem ) {
-               var computedStyle,
-                       offsetParent = elem.offsetParent,
-                       prevOffsetParent = elem,
-                       body = doc.body,
-                       defaultView = doc.defaultView,
-                       prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
-                       top = elem.offsetTop,
-                       left = elem.offsetLeft;
-
-               while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
-                       if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
-                               break;
-                       }
+       return opt;
+};
 
-                       computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
-                       top  -= elem.scrollTop;
-                       left -= elem.scrollLeft;
+jQuery.easing = {
+       linear: function( p ) {
+               return p;
+       },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p*Math.PI ) / 2;
+       }
+};
 
-                       if ( elem === offsetParent ) {
-                               top  += elem.offsetTop;
-                               left += elem.offsetLeft;
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+       var timer,
+               timers = jQuery.timers,
+               i = 0;
 
-                               if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
-                                       top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-                                       left += parseFloat( computedStyle.borderLeftWidth ) || 0;
-                               }
+       for ( ; i < timers.length; i++ ) {
+               timer = timers[ i ];
+               // Checks the timer has not already been removed
+               if ( !timer() && timers[ i ] === timer ) {
+                       timers.splice( i--, 1 );
+               }
+       }
 
-                               prevOffsetParent = offsetParent;
-                               offsetParent = elem.offsetParent;
-                       }
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+};
 
-                       if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
-                               top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-                               left += parseFloat( computedStyle.borderLeftWidth ) || 0;
-                       }
+jQuery.fx.timer = function( timer ) {
+       if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+       }
+};
 
-                       prevComputedStyle = computedStyle;
-               }
+jQuery.fx.interval = 13;
 
-               if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
-                       top  += body.offsetTop;
-                       left += body.offsetLeft;
-               }
+jQuery.fx.stop = function() {
+       clearInterval( timerId );
+       timerId = null;
+};
 
-               if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
-                       top  += Math.max( docElem.scrollTop, body.scrollTop );
-                       left += Math.max( docElem.scrollLeft, body.scrollLeft );
-               }
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+       // Default speed
+       _default: 400
+};
 
-               return { top: top, left: left };
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
        };
 }
+var rroot = /^(?:body|html)$/i;
 
 jQuery.fn.offset = function( options ) {
        if ( arguments.length ) {
@@ -9150,18 +8995,35 @@ jQuery.fn.offset = function( options ) {
                        });
        }
 
-       var elem = this[0],
+       var box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left,
+               elem = this[ 0 ],
                doc = elem && elem.ownerDocument;
 
        if ( !doc ) {
-               return null;
+               return;
        }
 
-       if ( elem === doc.body ) {
+       if ( (body = doc.body) === elem ) {
                return jQuery.offset.bodyOffset( elem );
        }
 
-       return getOffset( elem, doc, doc.documentElement );
+       docElem = doc.documentElement;
+
+       // Make sure we're not dealing with a disconnected DOM node
+       if ( !jQuery.contains( docElem, elem ) ) {
+               return { top: 0, left: 0 };
+       }
+
+       box = elem.getBoundingClientRect();
+       win = getWindow( doc );
+       clientTop  = docElem.clientTop  || body.clientTop  || 0;
+       clientLeft = docElem.clientLeft || body.clientLeft || 0;
+       scrollTop  = win.pageYOffset || docElem.scrollTop;
+       scrollLeft = win.pageXOffset || docElem.scrollLeft;
+       top  = box.top  + scrollTop  - clientTop;
+       left = box.left + scrollLeft - clientLeft;
+
+       return { top: top, left: left };
 };
 
 jQuery.offset = {
@@ -9227,7 +9089,7 @@ jQuery.fn.extend({
 
        position: function() {
                if ( !this[0] ) {
-                       return null;
+                       return;
                }
 
                var elem = this[0],
@@ -9262,7 +9124,7 @@ jQuery.fn.extend({
                        while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
                                offsetParent = offsetParent.offsetParent;
                        }
-                       return offsetParent;
+                       return offsetParent || document.body;
                });
        }
 });
@@ -9278,8 +9140,7 @@ jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( me
 
                        if ( val === undefined ) {
                                return win ? (prop in win) ? win[ prop ] :
-                                       jQuery.support.boxModel && win.document.documentElement[ method ] ||
-                                               win.document.body[ method ] :
+                                       win.document.documentElement[ method ] :
                                        elem[ method ];
                        }
 
@@ -9303,83 +9164,47 @@ function getWindow( elem ) {
                        elem.defaultView || elem.parentWindow :
                        false;
 }
-
-
-
-
-// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-       var clientProp = "client" + name,
-               scrollProp = "scroll" + name,
-               offsetProp = "offset" + name;
-
-       // innerHeight and innerWidth
-       jQuery.fn[ "inner" + name ] = function() {
-               var elem = this[0];
-               return elem ?
-                       elem.style ?
-                       parseFloat( jQuery.css( elem, type, "padding" ) ) :
-                       this[ type ]() :
-                       null;
-       };
-
-       // outerHeight and outerWidth
-       jQuery.fn[ "outer" + name ] = function( margin ) {
-               var elem = this[0];
-               return elem ?
-                       elem.style ?
-                       parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
-                       this[ type ]() :
-                       null;
-       };
-
-       jQuery.fn[ type ] = function( value ) {
-               return jQuery.access( this, function( elem, type, value ) {
-                       var doc, docElemProp, orig, ret;
-
-                       if ( jQuery.isWindow( elem ) ) {
-                               // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
-                               doc = elem.document;
-                               docElemProp = doc.documentElement[ clientProp ];
-                               return jQuery.support.boxModel && docElemProp ||
-                                       doc.body && doc.body[ clientProp ] || docElemProp;
-                       }
-
-                       // Get document width or height
-                       if ( elem.nodeType === 9 ) {
-                               // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
-                               doc = elem.documentElement;
-
-                               // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
-                               // so we can't use max, as it'll choose the incorrect offset[Width/Height]
-                               // instead we use the correct client[Width/Height]
-                               // support:IE6
-                               if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
-                                       return doc[ clientProp ];
+       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+               // margin is only for outerHeight, outerWidth
+               jQuery.fn[ funcName ] = function( margin, value ) {
+                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+                       return jQuery.access( this, function( elem, type, value ) {
+                               var doc;
+
+                               if ( jQuery.isWindow( elem ) ) {
+                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
+                                       // https://github.com/jquery/jquery/pull/764
+                                       return elem.document.documentElement[ "client" + name ];
+                               }
+
+                               // Get document width or height
+                               if ( elem.nodeType === 9 ) {
+                                       doc = elem.documentElement;
+
+                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+                                       return Math.max(
+                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
+                                               doc[ "client" + name ]
+                                       );
                                }
 
-                               return Math.max(
-                                       elem.body[ scrollProp ], doc[ scrollProp ],
-                                       elem.body[ offsetProp ], doc[ offsetProp ]
-                               );
-                       }
-
-                       // Get width or height on the element
-                       if ( value === undefined ) {
-                               orig = jQuery.css( elem, type );
-                               ret = parseFloat( orig );
-                               return jQuery.isNumeric( ret ) ? ret : orig;
-                       }
+                               return value === undefined ?
+                                       // Get width or height on the element, requesting but not forcing parseFloat
+                                       jQuery.css( elem, type, value, extra ) :
 
-                       // Set the width or height on the element
-                       jQuery( elem ).css( type, value );
-               }, type, value, arguments.length, null );
-       };
+                                       // Set width or height on the element
+                                       jQuery.style( elem, type, value, extra );
+                       }, type, chainable ? margin : undefined, chainable );
+               };
+       });
 });
-
-
-
-
 // Expose jQuery to the global object
 window.jQuery = window.$ = jQuery;
 
@@ -9399,6 +9224,4 @@ if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
        define( "jquery", [], function () { return jQuery; } );
 }
 
-
-
 })( window );
index 42554e0..3e786ec 100644 (file)
 /**
  * Simple Placeholder-based Localization
  *
- * Call on a selection of HTML which contains <html:msg key="message-key" /> elements or elements with
- * title-msg="message-key" or alt-msg="message-key" attributes. <html:msg /> elements will be replaced
- * with localized text, elements with title-msg and alt-msg attributes will receive localized title
- * and alt attributes.
- * *
+ * Call on a selection of HTML which contains <html:msg key="message-key" /> elements or elements
+ * with title-msg="message-key", alt-msg="message-key" or placeholder-msg="message-key" attributes.
+ * <html:msg /> elements will be replaced with localized text, *-msg attributes will be replaced
+ * with attributes that do not have the "-msg" suffix and contain a localized message.
+ *
+ * Example:
+ *     // Messages: { 'title': 'Awesome', 'desc': 'Cat doing backflip' 'search' contains 'Search' }
+ *     var html = '\
+ *         <p>\
+ *             <html:msg key="title" />\
+ *             <img src="something.jpg" title-msg="title" alt-msg="desc" />\
+ *             <input type="text" placeholder-msg="search" />\
+ *         </p>';
+ *     $( 'body' ).append( $( html ).localize() );
+ *
+ * Appends something like this to the body...
+ *     <p>
+ *         Awesome
+ *         <img src="something.jpg" title="Awesome" alt="Cat doing backflip" />
+ *         <input type="text" placeholder="Search" />
+ *     </p>
+ *
+ * Arguments can be passed into uses of a message using the params property of the options object
+ * given to .localize(). Multiple messages can be given parameters, because the params property is
+ * an object keyed by the message key to apply the parameters to, each containing an array of
+ * parameters to use. The limitation is that you can not use different parameters to individual uses
+ * of a message in the same selection being localized - they will all recieve the same parameters.
+ *
  * Example:
- *             <p class="somethingCool">
- *                     <html:msg key="my-message" />
- *                     <img src="something.jpg" title-msg="my-title-message" alt-msg="my-alt-message" />
- *             </p>
- *
- * Localizes to...
- *             <p class="somethingCool">
- *                     My Message
- *                     <img src="something.jpg" title="My Title Message" alt="My Alt Message" />
- *             </p>
+ *     // Messages: { 'easy-as': 'Easy as $1 $2 $3.' }
+ *     var html = '<p><html:msg key="easy-as" /></p>';
+ *     $( 'body' ).append( $( html ).localize( { 'params': { 'easy-as': ['a', 'b', 'c'] } } ) );
+ *
+ * Appends something like this to the body...
+ *     <p>Easy as a, b, c</p>
+ *
+ * Raw HTML content can be used, instead of it being escaped as text. To do this, just use the raw
+ * attribute on a msg element.
+ *
+ * Example:
+ *     // Messages: { 'hello': '<b><i>Hello</i> $1!</b>' }
+ *     var html = '\
+ *         <p>\
+ *             <!-- escaped: --><html:msg key="hello" />\
+ *             <!-- raw: --><html:msg key="hello" raw />\
+ *         </p>';
+ *     $( 'body' ).append( $( html ).localize( { 'params': { 'hello': ['world'] } } ) );
+ *
+ * Appends something like this to the body...
+ *     <p>
+ *         <!-- escaped: -->&lt;b&gt;&lt;i&gt;Hello&lt;/i&gt; world!&lt;/b&gt;
+ *         <!-- raw: --><b><i>Hello</i> world!</b>
+ *     </p>
+ *
+ * Message keys can also be remapped, allowing the same generic template to be used with a variety
+ * of messages. This is important for improving re-usability of templates.
+ *
+ * Example:
+ *     // Messages: { 'good-afternoon': 'Good afternoon' }
+ *     var html = '<p><html:msg key="greeting" /></p>';
+ *     $( 'body' ).append( $( html ).localize( { 'keys': { 'greeting': 'good-afternoon' } } ) );
+ *
+ * Appends something like this to the body...
+ *     <p>Good afternoon</p>
+ *
+ * Message keys can also be prefixed globally, which is handy when writing extensions, where by
+ * convention all messages are prefixed with the extension's name.
+ *
+ * Example:
+ *     // Messages: { 'teleportation-warning': 'You may not get there all in one piece.' }
+ *     var html = '<p><html:msg key="warning" /></p>';
+ *     $( 'body' ).append( $( html ).localize( { 'prefix': 'teleportation-' } ) );
+ *
+ * Appends something like this to the body...
+ *     <p>You may not get there all in one piece.</p>
+ *
+ */
+( function ( $, mw ) {
+
+/**
+ * Gets a localized message, using parameters from options if present.
+ *
+ * @function
+ * @param {String} key Message key to get localized message for
+ * @returns {String} Localized message
  */
-( function( $ ) {
+function msg( options, key ) {
+       var args = options.params[key] || [];
+       // Format: mw.msg( key [, p1, p2, ...] )
+       args.unshift( options.prefix + ( options.keys[key] || key ) );
+       return mw.msg.apply( mw, args );
+}
+
 /**
  * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
  * localized title and alt attributes to elements with title-msg and alt-msg attributes
  * respectively.
  *
- * @param Object: options Map of options
- *  * prefix: Message prefix to use when localizing elements and attributes
+ * @method
+ * @param {Object} options Map of options to be used while localizing
+ * @param {String} options.prefix String to prepend to all message keys
+ * @param {Object} options.keys Message key aliases, used for remapping keys to a template
+ * @param {Object} options.params Lists of parameters to use with certain message keys
+ * @returns {jQuery} This selection
  */
+$.fn.localize = function ( options ) {
+       var $target = this,
+               attributes = ['title', 'alt', 'placeholder'];
+
+       // Extend options
+       options = $.extend( {
+               prefix: '',
+               keys: {},
+               params: {}
+       }, options );
+
+       // Elements
+       // Ok, so here's the story on this selector. In IE 6/7, searching for 'msg' turns up the
+       // 'html:msg', but searching for 'html:msg' doesn't. In later IE and other browsers, searching
+       // for 'html:msg' turns up the 'html:msg', but searching for 'msg' doesn't. So searching for
+       // both 'msg' and 'html:msg' seems to get the job done. This feels pretty icky, though.
+       $target.find( 'msg,html\\:msg' ).each( function () {
+               var $el = $(this);
+               // Escape by default
+               if ( $el.attr( 'raw' ) ) {
+                       $el.html( msg( options, $el.attr( 'key' ) ) );
+               } else {
+                       $el.text( msg( options, $el.attr( 'key' ) ) );
+               }
+               // Remove wrapper
+               $el.replaceWith( $el.html() );
+       } );
 
-$.fn.localize = function( options ) {
-       options = $.extend( { 'prefix': '', 'keys': {}, 'params': {} }, options );
-       function msg( key ) {
-               var args = key in options.params ? options.params[key] : [];
-               // Format: mw.msg( key [, p1, p2, ...] )
-               args.unshift( options.prefix + ( key in options.keys ? options.keys[key] : key ) );
-               return mw.msg.apply( mw, args );
-       };
-       return $(this)
-               // Ok, so here's the story on this selector.
-               // In IE 6/7, searching for 'msg' turns up the 'html:msg', but searching for 'html:msg' does not.
-               // In later IE and other browsers, searching for 'html:msg' turns up the 'html:msg', but searching for 'msg' does not.
-               // So searching for both 'msg' and 'html:msg' seems to get the job done.
-               // This feels pretty icky, though.
-               .find( 'msg,html\\:msg' )
-                       .each( function() {
-                               var $el = $(this);
-                               var msgText = msg( $el.attr( 'key' ) );
+       // Attributes
+       // Note: there's no way to prevent escaping of values being injected into attributes, this is
+       // on purpose, not a design flaw.
+       $.each( attributes, function ( i, attr ) {
+               var msgAttr = attr + '-msg';
+               $target.find( '[' + msgAttr + ']' ).each( function () {
+                       var $el = $(this);
+                       $el.attr( attr, msg( options, $el.attr( msgAttr ) ) ).removeAttr( msgAttr );
+               } );
+       } );
 
-                               if ( $el.attr('raw') ) {
-                                       $el.html(msgText);
-                               } else {
-                                       $el.text(msgText);
-                               }
-                               
-                               $el
-                                       .replaceWith( $el.html() );
-                       } )
-                       .end()
-               .find( '[title-msg]' )
-                       .each( function() {
-                               var $el = $(this);
-                               $el
-                                       .attr( 'title', msg( $el.attr( 'title-msg' ) ) )
-                                       .removeAttr( 'title-msg' );
-                       } )
-                       .end()
-               .find( '[alt-msg]' )
-                       .each( function() {
-                               var $el = $(this);
-                               $el
-                                       .attr( 'alt', msg( $el.attr( 'alt-msg' ) ) )
-                                       .removeAttr( 'alt-msg' );
-                       } )
-                       .end();
+       // HTML, Text for elements which cannot have children e.g. OPTION
+       $target.find( '[data-msg-text]' ).each( function() {
+               var $el = $( this );
+               $el.text( msg( options, $el.attr( 'data-msg-text' ) ) );
+       } );
+
+       $target.find( '[data-msg-html]' ).each( function() {
+               var $el = $( this );
+               $el.html( msg( options, $el.attr( 'data-msg-html' ) ) );
+       } );
+
+       return $target;
 };
 
 // Let IE know about the msg tag before it's used...
 document.createElement( 'msg' );
-} )( jQuery );
+
+}( jQuery, mediaWiki ) );
index 7a1897c..33f8752 100644 (file)
  * @license CC-BY 3.0 <http://creativecommons.org/licenses/by/3.0>
  * @license GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
  */
-( function( $, mw ) {
+( function ( $, mw ) {
 
-$.fn.makeCollapsible = function() {
+$.fn.makeCollapsible = function () {
 
-       return this.each(function() {
-               var _fn = 'jquery.makeCollapsible> ';
+       return this.each(function () {
+               var lpx = 'jquery.makeCollapsible> ';
 
                // Define reused variables and functions
-               var     $that = $(this).addClass( 'mw-collapsible' ), // case: $( '#myAJAXelement' ).makeCollapsible()
+               var $toggle,
+                       $that = $(this).addClass( 'mw-collapsible' ), // case: $( '#myAJAXelement' ).makeCollapsible()
                        that = this,
                        collapsetext = $(this).attr( 'data-collapsetext' ),
                        expandtext = $(this).attr( 'data-expandtext' ),
-                       toggleElement = function( $collapsible, action, $defaultToggle, instantHide ) {
+                       toggleElement = function ( $collapsible, action, $defaultToggle, instantHide ) {
+                               var $collapsibleContent, $containers;
+
                                // Validate parameters
                                if ( !$collapsible.jquery ) { // $collapsible must be an instance of jQuery
                                        return;
                                }
-                               if ( action != 'expand' && action != 'collapse' ) {
+                               if ( action !== 'expand' && action !== 'collapse' ) {
                                        // action must be string with 'expand' or 'collapse'
                                        return;
                                }
-                               if ( typeof $defaultToggle == 'undefined' ) {
+                               if ( $defaultToggle === undefined ) {
                                        $defaultToggle = null;
                                }
                                if ( $defaultToggle !== null && !($defaultToggle instanceof $) ) {
@@ -45,9 +48,7 @@ $.fn.makeCollapsible = function() {
                                        return;
                                }
 
-                               var $containers = null;
-
-                               if ( action == 'collapse' ) {
+                               if ( action === 'collapse' ) {
 
                                        // Collapse the element
                                        if ( $collapsible.is( 'table' ) ) {
@@ -80,7 +81,7 @@ $.fn.makeCollapsible = function() {
                                                }
 
                                        } else { // <div>, <p> etc.
-                                               var $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
+                                               $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
 
                                                // If a collapsible-content is defined, collapse it
                                                if ( $collapsibleContent.length ) {
@@ -123,7 +124,7 @@ $.fn.makeCollapsible = function() {
                                                }
 
                                        } else { // <div>, <p> etc.
-                                               var $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
+                                               $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
 
                                                // If a collapsible-content is defined, collapse it
                                                if ( $collapsibleContent.length ) {
@@ -142,8 +143,8 @@ $.fn.makeCollapsible = function() {
                                }
                        },
                        // Toggles collapsible and togglelink class and updates text label
-                       toggleLinkDefault = function( that, e ) {
-                               var     $that = $(that),
+                       toggleLinkDefault = function ( that, e ) {
+                               var $that = $(that),
                                        $collapsible = $that.closest( '.mw-collapsible.mw-made-collapsible' ).toggleClass( 'mw-collapsed' );
                                e.preventDefault();
                                e.stopPropagation();
@@ -175,9 +176,9 @@ $.fn.makeCollapsible = function() {
                                return;
                        },
                        // Toggles collapsible and togglelink class
-                       toggleLinkPremade = function( $that, e ) {
-                               var     $collapsible = $that.eq(0).closest( '.mw-collapsible.mw-made-collapsible' ).toggleClass( 'mw-collapsed' );
-                               if ( $(e.target).is('a') ) {
+                       toggleLinkPremade = function ( $that, e ) {
+                               var $collapsible = $that.eq(0).closest( '.mw-collapsible.mw-made-collapsible' ).toggleClass( 'mw-collapsed' );
+                               if ( $(e.target).is( 'a' ) ) {
                                        return true;
                                }
                                e.preventDefault();
@@ -200,11 +201,11 @@ $.fn.makeCollapsible = function() {
                                return;
                        },
                        // Toggles customcollapsible
-                       toggleLinkCustom = function( $that, e, $collapsible ) {
+                       toggleLinkCustom = function ( $that, e, $collapsible ) {
                                // For the initial state call of customtogglers there is no event passed
                                if (e) {
                                        e.preventDefault();
-                               e.stopPropagation();
+                                       e.stopPropagation();
                                }
                                // Get current state and toggle to the opposite
                                var action = $collapsible.hasClass( 'mw-collapsed' ) ? 'expand' : 'collapse';
@@ -214,7 +215,7 @@ $.fn.makeCollapsible = function() {
                        };
 
                // Use custom text or default ?
-               if( !collapsetext ) {
+               if ( !collapsetext ) {
                        collapsetext = mw.msg( 'collapsible-collapse' );
                }
                if ( !expandtext ) {
@@ -229,7 +230,7 @@ $.fn.makeCollapsible = function() {
                                .parent()
                                .prepend( '&nbsp;[' )
                                .append( ']&nbsp;' )
-                               .bind( 'click.mw-collapse', function(e) {
+                               .bind( 'click.mw-collapse', function (e) {
                                        toggleLinkDefault( this, e );
                                } );
 
@@ -247,15 +248,15 @@ $.fn.makeCollapsible = function() {
 
                        var thatId = $that.attr( 'id' ),
                                $customTogglers = $( '.' + thatId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
-                       mw.log( _fn + 'Found custom collapsible: #' + thatId );
+                       mw.log( lpx + 'Found custom collapsible: #' + thatId );
 
                        // Double check that there is actually a customtoggle link
                        if ( $customTogglers.length ) {
-                               $customTogglers.bind( 'click.mw-collapse', function( e ) {
+                               $customTogglers.bind( 'click.mw-collapse', function ( e ) {
                                        toggleLinkCustom( $(this), e, $that );
                                } );
                        } else {
-                               mw.log( _fn + '#' + thatId + ': Missing toggler!' );
+                               mw.log( lpx + '#' + thatId + ': Missing toggler!' );
                        }
 
                        // Initial state
@@ -271,22 +272,22 @@ $.fn.makeCollapsible = function() {
                        // Elements are treated differently
                        if ( $that.is( 'table' ) ) {
                                // The toggle-link will be in one the the cells (td or th) of the first row
-                               var     $firstRowCells = $( 'tr:first th, tr:first td', that ),
-                                       $toggle = $firstRowCells.find( '> .mw-collapsible-toggle' );
+                               var $firstRowCells = $that.find( 'tr:first th, tr:first td' );
+                               $toggle = $firstRowCells.find( '> .mw-collapsible-toggle' );
 
                                // If theres no toggle link, add it to the last cell
                                if ( !$toggle.length ) {
                                        $firstRowCells.eq(-1).prepend( $toggleLink );
                                } else {
-                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function( e ) {
+                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) {
                                                toggleLinkPremade( $toggle, e );
                                        } );
                                }
 
                        } else if ( $that.is( 'ul' ) || $that.is( 'ol' ) ) {
                                // The toggle-link will be in the first list-item
-                               var     $firstItem = $( 'li:first', $that),
-                                       $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
+                               var $firstItem = $that.find( 'li:first' );
+                               $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
 
                                // If theres no toggle link, add it
                                if ( !$toggle.length ) {
@@ -294,12 +295,12 @@ $.fn.makeCollapsible = function() {
                                        // to be "1". Except if the value-attribute is already used.
                                        // If no value was set WebKit returns "", Mozilla returns '-1', others return null or undefined.
                                        var firstval = $firstItem.attr( 'value' );
-                                       if ( firstval === undefined || !firstval || firstval == '-1' ) {
+                                       if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
                                                $firstItem.attr( 'value', '1' );
                                        }
                                        $that.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
                                } else {
-                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function( e ) {
+                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) {
                                                toggleLinkPremade( $toggle, e );
                                        } );
                                }
@@ -307,7 +308,7 @@ $.fn.makeCollapsible = function() {
                        } else { // <div>, <p> etc.
 
                                // The toggle-link will be the first child of the element
-                               var $toggle = $that.find( '> .mw-collapsible-toggle' );
+                               $toggle = $that.find( '> .mw-collapsible-toggle' );
 
                                // If a direct child .content-wrapper does not exists, create it
                                if ( !$that.find( '> .mw-collapsible-content' ).length ) {
@@ -318,7 +319,7 @@ $.fn.makeCollapsible = function() {
                                if ( !$toggle.length ) {
                                        $that.prepend( $toggleLink );
                                } else {
-                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function( e ) {
+                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) {
                                                toggleLinkPremade( $toggle, e );
                                        } );
                                }
@@ -336,4 +337,5 @@ $.fn.makeCollapsible = function() {
                }
        } );
 };
-} )( jQuery, mediaWiki );
+
+}( jQuery, mediaWiki ) );
index 690fedd..c088bc4 100644 (file)
  * @license CC-BY 3.0 <http://creativecommons.org/licenses/by/3.0>
  * @license GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
  */
-( function( $ ) {
-// @return jQuery object of the message box
-$.messageBoxNew = function( options ) {
+( function ( $ ) {
+
+/** @return jQuery object of the message box */
+$.messageBoxNew = function ( options ) {
        options = $.extend( {
-               'id': 'js-messagebox', // unique identifier for this message box
-               'parent': 'body', // jQuery/CSS selector
-               'insert': 'prepend' // 'prepend' or 'append'
+               // unique identifier for this message box
+               id: 'js-messagebox',
+
+               // jQuery/CSS selector
+               parent: 'body',
+
+               // 'prepend' or 'append'
+               insert: 'prepend'
        }, options );
        var $curBox = $( '#' + options.id );
        // Only create a new box if it doesn't exist already
@@ -47,17 +53,21 @@ $.messageBoxNew = function( options ) {
                }
        }
 };
-// Calling with no message or message set to empty string or null will hide the group,
-// setting 'replace' to true as well will reset and hide the group entirely.
-// If there are no visible groups the main message box is hidden automatically,
-// and shown again once there are messages
-// @return jQuery object of message group
-$.messageBox = function( options ) {
+
+/**
+ * Calling with no message or message set to empty string or null will hide the group,
+ * setting 'replace' to true as well will reset and hide the group entirely.
+ * If there are no visible groups the main message box is hidden automatically,
+ * and shown again once there are messages
+ * @return {jQuery}: jQuery object of message group.
+ */
+$.messageBox = function ( options ) {
        options = $.extend( {
-               'message': '',
-               'group': 'default',
-               'replace': false, // if true replaces any previous message in this group
-               'target': 'js-messagebox'
+               message: '',
+               group: 'default',
+               // if replace=true, it replaces any previous message in this group
+               replace: false,
+               target: 'js-messagebox'
        }, options );
        var $target = $.messageBoxNew( { id: options.target } );
        var groupID = options.target + '-' + options.group;
@@ -95,4 +105,5 @@ $.messageBox = function( options ) {
        }
        return $group;
 };
-} )( jQuery );
+
+}( jQuery ) );
index 023ea7f..3757393 100644 (file)
@@ -1,26 +1,26 @@
 /*
  * JavaScript backwards-compatibility alternatives and other convenience functions
  */
-( function( $ ) {
+( function ( $ ) {
 
        $.extend({
-               trimLeft: function( str ) {
+               trimLeft: function ( str ) {
                        return str === null ? '' : str.toString().replace( /^\s+/, '' );
                },
-               trimRight: function( str ) {
+               trimRight: function ( str ) {
                        return str === null ?
                                        '' : str.toString().replace( /\s+$/, '' );
                },
-               ucFirst: function( str ) {
+               ucFirst: function ( str ) {
                        return str.charAt( 0 ).toUpperCase() + str.substr( 1 );
                },
-               escapeRE: function( str ) {
-                       return str.replace ( /([\\{}()|.?*+\-^$\[\]])/g, "\\$1" );
+               escapeRE: function ( str ) {
+                       return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, "\\$1" );
                },
-               isDomElement: function( el ) {
+               isDomElement: function ( el ) {
                        return !!el && !!el.nodeType;
                },
-               isEmpty: function( v ) {
+               isEmpty: function ( v ) {
                        if ( v === '' || v === 0 || v === '0' || v === null
                                || v === false || v === undefined )
                        {
@@ -39,8 +39,8 @@
                        }
                        return false;
                },
-               compareArray: function( arrThis, arrAgainst ) {
-                       if ( arrThis.length != arrAgainst.length ) {
+               compareArray: function ( arrThis, arrAgainst ) {
+                       if ( arrThis.length !== arrAgainst.length ) {
                                return false;
                        }
                        for ( var i = 0; i < arrThis.length; i++ ) {
                        }
                        return true;
                },
-               compareObject: function( objectA, objectB ) {
+               compareObject: function ( objectA, objectB ) {
 
                        // Do a simple check if the types match
-                       if ( typeof objectA == typeof objectB ) {
+                       if ( typeof objectA === typeof objectB ) {
 
                                // Only loop over the contents if it really is an object
-                               if ( typeof objectA == 'object' ) {
+                               if ( typeof objectA === 'object' ) {
                                        // If they are aliases of the same object (ie. mw and mediaWiki) return now
                                        if ( objectA === objectB ) {
                                                return true;
@@ -72,7 +72,7 @@
                                                        if ( prop in objectB ) {
                                                                // Compare the types of the properties
                                                                var type = typeof objectA[prop];
-                                                               if ( type == typeof objectB[prop] ) {
+                                                               if ( type === typeof objectB[prop] ) {
                                                                        // Recursively check objects inside this one
                                                                        switch ( type ) {
                                                                                case 'object' :
                }
        });
 
-} )( jQuery );
+}( jQuery ) );
index 8310cef..5ec05f2 100644 (file)
@@ -3,85 +3,86 @@
  *
  * This will automatically use the HTML5 placeholder attribute if supported, or emulate this behavior if not.
  *
- * @author Trevor Parscal <tparscal@wikimedia.org>
- * @author Krinkle <krinklemail@gmail.com>
+ * @author Trevor Parscal <tparscal@wikimedia.org>, 2012
+ * @author Krinkle <krinklemail@gmail.com>, 2012
  * @version 0.2.0
  * @license GPL v2
  */
-( function( $ ) {
+( function ( $ ) {
 
-$.fn.placeholder = function() {
+       $.fn.placeholder = function () {
 
-       return this.each( function() {
+               return this.each( function () {
 
-               // If the HTML5 placeholder attribute is supported, use it
-               if ( this.placeholder && 'placeholder' in document.createElement( this.tagName ) ) {
-                       return;
-               }
+                       // If the HTML5 placeholder attribute is supported, use it
+                       if ( this.placeholder && 'placeholder' in document.createElement( this.tagName ) ) {
+                               return;
+                       }
 
-               var placeholder = this.getAttribute( 'placeholder' );
-               var $input = $(this);
+                       var placeholder = this.getAttribute( 'placeholder' );
+                       var $input = $(this);
 
-               // Show initially, if empty
-               if ( this.value === '' || this.value === placeholder ) {
-                       $input.addClass( 'placeholder' ).val( placeholder );
-               }
+                       // Show initially, if empty
+                       if ( this.value === '' || this.value === placeholder ) {
+                               $input.addClass( 'placeholder' ).val( placeholder );
+                       }
 
-               $input
-                       // Show on blur if empty
-                       .blur( function() {
-                               if ( this.value === '' ) {
-                                       this.value = placeholder;
-                                       $input.addClass( 'placeholder' );
-                               }
-                       } )
+                       $input
+                               // Show on blur if empty
+                               .blur( function () {
+                                       if ( this.value === '' ) {
+                                               this.value = placeholder;
+                                               $input.addClass( 'placeholder' );
+                                       }
+                               } )
+
+                               // Hide on focus
+                               // Also listen for other events in case $input was
+                               // already focused when the events were bound
+                               .bind( 'focus drop keydown paste', function ( e ) {
+                                       if ( $input.hasClass( 'placeholder' ) ) {
+                                               if ( e.type === 'drop' && e.originalEvent.dataTransfer ) {
+                                                       // Support for drag&drop. Instead of inserting the dropped
+                                                       // text somewhere in the middle of the placeholder string,
+                                                       // we want to set the contents of the search box to the
+                                                       // dropped text.
 
-                       // Hide on focus
-                       // Also listen for other events in case $input was
-                       // already focused when the events were bound
-                       .bind( 'focus drop keydown paste', function( e ) {
-                               if ( $input.hasClass( 'placeholder' ) ) {
-                                       if ( e.type == 'drop' && e.originalEvent.dataTransfer ) {
-                                               // Support for drag&drop. Instead of inserting the dropped
-                                               // text somewhere in the middle of the placeholder string,
-                                               // we want to set the contents of the search box to the
-                                               // dropped text.
+                                                       // IE wants getData( 'text' ) but Firefox wants getData( 'text/plain' )
+                                                       // Firefox fails gracefully with an empty string, IE barfs with an error
+                                                       try {
+                                                               // Try the Firefox way
+                                                               this.value = e.originalEvent.dataTransfer.getData( 'text/plain' );
+                                                       } catch ( exception ) {
+                                                               // Got an exception, so use the IE way
+                                                               this.value = e.originalEvent.dataTransfer.getData( 'text' );
+                                                       }
 
-                                               // IE wants getData( 'text' ) but Firefox wants getData( 'text/plain' )
-                                               // Firefox fails gracefully with an empty string, IE barfs with an error
-                                               try {
-                                                       // Try the Firefox way
-                                                       this.value = e.originalEvent.dataTransfer.getData( 'text/plain' );
-                                               } catch ( exception ) {
-                                                       // Got an exception, so use the IE way
-                                                       this.value = e.originalEvent.dataTransfer.getData( 'text' );
+                                                       // On Firefox, drop fires after the dropped text has been inserted,
+                                                       // but on IE it fires before. If we don't prevent the default action,
+                                                       // IE will insert the dropped text twice.
+                                                       e.preventDefault();
+                                               } else {
+                                                       this.value = '';
                                                }
+                                               $input.removeClass( 'placeholder' );
+                                       }
+                               } );
 
-                                               // On Firefox, drop fires after the dropped text has been inserted,
-                                               // but on IE it fires before. If we don't prevent the default action,
-                                               // IE will insert the dropped text twice.
-                                               e.preventDefault();
-                                       } else {
-                                               this.value = '';
+                       // Blank on submit -- prevents submitting with unintended value
+                       if ( this.form ) {
+                               $( this.form ).submit( function () {
+                                       // $input.trigger( 'focus' ); would be problematic
+                                       // because it actually focuses $input, leading
+                                       // to nasty behavior in mobile browsers
+                                       if ( $input.hasClass( 'placeholder' ) ) {
+                                               $input
+                                                       .val( '' )
+                                                       .removeClass( 'placeholder' );
                                        }
-                                       $input.removeClass( 'placeholder' );
-                               }
-                       } );
+                               });
+                       }
 
-               // Blank on submit -- prevents submitting with unintended value
-               if ( this.form ) {
-                       $( this.form ).submit( function() {
-                               // $input.trigger( 'focus' ); would be problematic
-                               // because it actually focuses $input, leading
-                               // to nasty behavior in mobile browsers
-                               if ( $input.hasClass( 'placeholder' ) ) {
-                                       $input
-                                               .val( '' )
-                                               .removeClass( 'placeholder' );
-                               }
-                       });
-               }
+               });
+       };
 
-       });
-};
-} )( jQuery );
+}( jQuery ) );
index 2db0629..d54e66c 100644 (file)
@@ -43,8 +43,9 @@
                                length = arguments.length;
 
                        for ( ; i < length; i++ ) {
+                               options = arguments[ i ];
                                // Only deal with non-null/undefined values
-                               if ( (options = arguments[ i ]) != null ) {
+                               if ( options !== null && options !== undefined ) {
                                        // Extend the base object
                                        for ( name in options ) {
                                                src = target[ name ];
        };
 
 
-/**
- * CompletenessTest
- * @constructor
- *
- * @example
- *  var myTester = new CompletenessTest( myLib );
- * @param masterVariable {Object} The root variable that contains all object
- *  members. CompletenessTest will recursively traverse objects and keep track
- *  of all methods.
- * @param ignoreFn {Function} Optionally pass a function to filter out certain
- *  methods. Example: You may want to filter out instances of jQuery or some
- *  other constructor. Otherwise "missingTests" will include all methods that
- *  were not called from that instance.
- */
-var CompletenessTest = function ( masterVariable, ignoreFn ) {
-
-       // Keep track in these objects. Keyed by strings with the
-       // method names (ie. 'my.foo', 'my.bar', etc.) values are boolean true.
-       this.injectionTracker = {};
-       this.methodCallTracker = {};
-       this.missingTests = {};
-
-       this.ignoreFn = undefined === ignoreFn ? function () { return false; } : ignoreFn;
+       /**
+        * CompletenessTest
+        * @constructor
+        *
+        * @example
+        *  var myTester = new CompletenessTest( myLib );
+        * @param masterVariable {Object} The root variable that contains all object
+        *  members. CompletenessTest will recursively traverse objects and keep track
+        *  of all methods.
+        * @param ignoreFn {Function} Optionally pass a function to filter out certain
+        *  methods. Example: You may want to filter out instances of jQuery or some
+        *  other constructor. Otherwise "missingTests" will include all methods that
+        *  were not called from that instance.
+        */
+       var CompletenessTest = function ( masterVariable, ignoreFn ) {
 
-       // Lazy limit in case something weird happends (like recurse (part of) ourself).
-       this.lazyLimit = 2000;
-       this.lazyCounter = 0;
+               // Keep track in these objects. Keyed by strings with the
+               // method names (ie. 'my.foo', 'my.bar', etc.) values are boolean true.
+               this.injectionTracker = {};
+               this.methodCallTracker = {};
+               this.missingTests = {};
 
-       var that = this;
+               this.ignoreFn = undefined === ignoreFn ? function () { return false; } : ignoreFn;
 
-       // Bind begin and end to QUnit.
-       QUnit.begin( function () {
-               that.walkTheObject( null, masterVariable, masterVariable, [], CompletenessTest.ACTION_INJECT );
-               log( 'CompletenessTest/walkTheObject/ACTION_INJECT', that );
-       });
+               // Lazy limit in case something weird happends (like recurse (part of) ourself).
+               this.lazyLimit = 2000;
+               this.lazyCounter = 0;
 
-       QUnit.done( function () {
-               that.populateMissingTests();
-               log( 'CompletenessTest/populateMissingTests', that );
+               var that = this;
 
-               var toolbar, testResults, cntTotal, cntCalled, cntMissing;
+               // Bind begin and end to QUnit.
+               QUnit.begin( function () {
+                       that.walkTheObject( null, masterVariable, masterVariable, [], CompletenessTest.ACTION_INJECT );
+                       log( 'CompletenessTest/walkTheObject/ACTION_INJECT', that );
+               });
 
-               cntTotal = util.keys( that.injectionTracker ).length;
-               cntCalled = util.keys( that.methodCallTracker ).length;
-               cntMissing = util.keys( that.missingTests ).length;
+               QUnit.done( function () {
+                       that.populateMissingTests();
+                       log( 'CompletenessTest/populateMissingTests', that );
 
-               function makeTestResults( blob, title, style ) {
-                       var elOutputWrapper, elTitle, elContainer, elList, elFoot;
+                       var toolbar, testResults, cntTotal, cntCalled, cntMissing;
 
-                       elTitle = document.createElement( 'strong' );
-                       elTitle.textContent = title || 'Values';
+                       cntTotal = util.keys( that.injectionTracker ).length;
+                       cntCalled = util.keys( that.methodCallTracker ).length;
+                       cntMissing = util.keys( that.missingTests ).length;
 
-                       elList = document.createElement( 'ul' );
-                       util.each( blob, function ( key ) {
-                               var elItem = document.createElement( 'li' );
-                               elItem.textContent = key;
-                               elList.appendChild( elItem );
-                       });
+                       function makeTestResults( blob, title, style ) {
+                               var elOutputWrapper, elTitle, elContainer, elList, elFoot;
 
-                       elFoot = document.createElement( 'p' );
-                       elFoot.innerHTML = '<em>&mdash; CompletenessTest</em>';
+                               elTitle = document.createElement( 'strong' );
+                               elTitle.textContent = title || 'Values';
 
-                       elContainer = document.createElement( 'div' );
-                       elContainer.appendChild( elTitle );
-                       elContainer.appendChild( elList );
-                       elContainer.appendChild( elFoot );
+                               elList = document.createElement( 'ul' );
+                               util.each( blob, function ( key ) {
+                                       var elItem = document.createElement( 'li' );
+                                       elItem.textContent = key;
+                                       elList.appendChild( elItem );
+                               });
 
-                       elOutputWrapper = document.getElementById( 'qunit-completenesstest' );
-                       if ( !elOutputWrapper ) {
-                               elOutputWrapper = document.createElement( 'div' );
-                               elOutputWrapper.id = 'qunit-completenesstest';
-                       }
-                       elOutputWrapper.appendChild( elContainer );
+                               elFoot = document.createElement( 'p' );
+                               elFoot.innerHTML = '<em>&mdash; CompletenessTest</em>';
 
-                       util.each( style, function ( key, value ) {
-                               elOutputWrapper.style[key] = value;
-                       });
-                       return elOutputWrapper;
-               }
+                               elContainer = document.createElement( 'div' );
+                               elContainer.appendChild( elTitle );
+                               elContainer.appendChild( elList );
+                               elContainer.appendChild( elFoot );
 
-               if ( cntMissing === 0 ) {
-                       // Good
-                       testResults = makeTestResults(
-                               {},
-                               'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. No missing tests!',
-                               {
-                                       backgroundColor: '#D2E0E6',
-                                       color: '#366097',
-                                       paddingTop: '1em',
-                                       paddingRight: '1em',
-                                       paddingBottom: '1em',
-                                       paddingLeft: '1em'
-                               }
-                       );
-               } else {
-                       // Bad
-                       testResults = makeTestResults(
-                               that.missingTests,
-                               'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. ' + cntMissing + ' methods not covered:',
-                               {
-                                       backgroundColor: '#EE5757',
-                                       color: 'black',
-                                       paddingTop: '1em',
-                                       paddingRight: '1em',
-                                       paddingBottom: '1em',
-                                       paddingLeft: '1em'
+                               elOutputWrapper = document.getElementById( 'qunit-completenesstest' );
+                               if ( !elOutputWrapper ) {
+                                       elOutputWrapper = document.createElement( 'div' );
+                                       elOutputWrapper.id = 'qunit-completenesstest';
                                }
-                       );
-               }
+                               elOutputWrapper.appendChild( elContainer );
 
-               toolbar = document.getElementById( 'qunit-testrunner-toolbar' );
-               if ( toolbar ) {
-                       toolbar.insertBefore( testResults, toolbar.firstChild );
-               }
-       });
+                               util.each( style, function ( key, value ) {
+                                       elOutputWrapper.style[key] = value;
+                               });
+                               return elOutputWrapper;
+                       }
 
-       return this;
-};
+                       if ( cntMissing === 0 ) {
+                               // Good
+                               testResults = makeTestResults(
+                                       {},
+                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. No missing tests!',
+                                       {
+                                               backgroundColor: '#D2E0E6',
+                                               color: '#366097',
+                                               paddingTop: '1em',
+                                               paddingRight: '1em',
+                                               paddingBottom: '1em',
+                                               paddingLeft: '1em'
+                                       }
+                               );
+                       } else {
+                               // Bad
+                               testResults = makeTestResults(
+                                       that.missingTests,
+                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. ' + cntMissing + ' methods not covered:',
+                                       {
+                                               backgroundColor: '#EE5757',
+                                               color: 'black',
+                                               paddingTop: '1em',
+                                               paddingRight: '1em',
+                                               paddingBottom: '1em',
+                                               paddingLeft: '1em'
+                                       }
+                               );
+                       }
 
-/* Static members */
-CompletenessTest.ACTION_INJECT = 500;
-CompletenessTest.ACTION_CHECK = 501;
+                       toolbar = document.getElementById( 'qunit-testrunner-toolbar' );
+                       if ( toolbar ) {
+                               toolbar.insertBefore( testResults, toolbar.firstChild );
+                       }
+               });
 
-/* Public methods */
-CompletenessTest.fn = CompletenessTest.prototype = {
+               return this;
+       };
 
-       /**
-        * CompletenessTest.fn.walkTheObject
-        *
-        * This function recursively walks through the given object, calling itself as it goes.
-        * Depending on the action it either injects our listener into the methods, or
-        * reads from our tracker and records which methods have not been called by the test suite.
-        *
-        * @param currName {String|Null} Name of the given object member (Initially this is null).
-        * @param currVar {mixed} The variable to check (initially an object,
-        *  further down it could be anything).
-        * @param masterVariable {Object} Throughout our interation, always keep track of the master/root.
-        *  Initially this is the same as currVar.
-        * @param parentPathArray {Array} Array of names that indicate our breadcrumb path starting at
-        *  masterVariable. Not including currName.
-        * @param action {Number} What is this function supposed to do (ACTION_INJECT or ACTION_CHECK)
-        */
-       walkTheObject: function ( currName, currVar, masterVariable, parentPathArray, action ) {
+       /* Static members */
+       CompletenessTest.ACTION_INJECT = 500;
+       CompletenessTest.ACTION_CHECK = 501;
+
+       /* Public methods */
+       CompletenessTest.fn = CompletenessTest.prototype = {
+
+               /**
+                * CompletenessTest.fn.walkTheObject
+                *
+                * This function recursively walks through the given object, calling itself as it goes.
+                * Depending on the action it either injects our listener into the methods, or
+                * reads from our tracker and records which methods have not been called by the test suite.
+                *
+                * @param currName {String|Null} Name of the given object member (Initially this is null).
+                * @param currVar {mixed} The variable to check (initially an object,
+                *  further down it could be anything).
+                * @param masterVariable {Object} Throughout our interation, always keep track of the master/root.
+                *  Initially this is the same as currVar.
+                * @param parentPathArray {Array} Array of names that indicate our breadcrumb path starting at
+                *  masterVariable. Not including currName.
+                * @param action {Number} What is this function supposed to do (ACTION_INJECT or ACTION_CHECK)
+                */
+               walkTheObject: function ( currName, currVar, masterVariable, parentPathArray, action ) {
+
+                       var key, value, tmpPathArray,
+                               type = util.type( currVar ),
+                               that = this;
+
+                       // Hard ignores
+                       if ( this.ignoreFn( currVar, that, parentPathArray ) ) {
+                               return null;
+                       }
 
-               var key, value, tmpPathArray,
-                       type = util.type( currVar ),
-                       that = this;
+                       // Handle the lazy limit
+                       this.lazyCounter++;
+                       if ( this.lazyCounter > this.lazyLimit ) {
+                               log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, parentPathArray );
+                               return null;
+                       }
 
-               // Hard ignores
-               if ( this.ignoreFn( currVar, that, parentPathArray ) ) {
-                       return null;
-               }
+                       // Functions
+                       if ( type === 'function' ) {
 
-               // Handle the lazy limit
-               this.lazyCounter++;
-               if ( this.lazyCounter > this.lazyLimit ) {
-                       log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, parentPathArray );
-                       return null;
-               }
+                               if ( !currVar.prototype || util.isEmptyObject( currVar.prototype ) ) {
 
-               // Functions
-               if ( type === 'function' ) {
+                                       if ( action === CompletenessTest.ACTION_INJECT ) {
 
-                       if ( !currVar.prototype || util.isEmptyObject( currVar.prototype ) ) {
+                                               that.injectionTracker[ parentPathArray.join( '.' ) ] = true;
+                                               that.injectCheck( masterVariable, parentPathArray, function () {
+                                                       that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
+                                               } );
+                                       }
 
-                               if ( action === CompletenessTest.ACTION_INJECT ) {
+                               // We don't support checking object constructors yet...
+                               // ...we can check the prototypes fine, though.
+                               } else {
+                                       if ( action === CompletenessTest.ACTION_INJECT ) {
 
-                                       that.injectionTracker[ parentPathArray.join( '.' ) ] = true;
-                                       that.injectCheck( masterVariable, parentPathArray, function () {
-                                               that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
-                                       } );
-                               }
+                                               for ( key in currVar.prototype ) {
+                                                       if ( hasOwn.call( currVar.prototype, key ) ) {
+                                                               value = currVar.prototype[key];
+                                                               if ( key === 'constructor' ) {
+                                                                       continue;
+                                                               }
 
-                       // We don't support checking object constructors yet...
-                       // ...we can check the prototypes fine, though.
-                       } else {
-                               if ( action === CompletenessTest.ACTION_INJECT ) {
+                                                               // Clone and break reference to parentPathArray
+                                                               tmpPathArray = util.extend( [], parentPathArray );
+                                                               tmpPathArray.push( 'prototype' );
+                                                               tmpPathArray.push( key );
 
-                                       for ( key in currVar.prototype ) {
-                                               if ( hasOwn.call( currVar.prototype, key ) ) {
-                                                       value = currVar.prototype[key];
-                                                       if ( key === 'constructor' ) {
-                                                               continue;
+                                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
                                                        }
-
-                                                       // Clone and break reference to parentPathArray
-                                                       tmpPathArray = util.extend( [], parentPathArray );
-                                                       tmpPathArray.push( 'prototype' );
-                                                       tmpPathArray.push( key );
-
-                                                       that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
                                                }
-                                       }
 
+                                       }
                                }
-                       }
 
-               }
+                       }
 
-               // Recursively. After all, this is the *completeness* test
-               if ( type === 'function' || type === 'object' ) {
-                       for ( key in currVar ) {
-                               if ( hasOwn.call( currVar, key ) ) {
-                                       value = currVar[key];
+                       // Recursively. After all, this is the *completeness* test
+                       if ( type === 'function' || type === 'object' ) {
+                               for ( key in currVar ) {
+                                       if ( hasOwn.call( currVar, key ) ) {
+                                               value = currVar[key];
 
-                                       // Clone and break reference to parentPathArray
-                                       tmpPathArray = util.extend( [], parentPathArray );
-                                       tmpPathArray.push( key );
+                                               // Clone and break reference to parentPathArray
+                                               tmpPathArray = util.extend( [], parentPathArray );
+                                               tmpPathArray.push( key );
 
-                                       that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                                       }
                                }
                        }
-               }
-       },
+               },
 
-       populateMissingTests: function () {
-               var ct = this;
-               util.each( ct.injectionTracker, function ( key ) {
-                       ct.hasTest( key );
-               });
-       },
+               populateMissingTests: function () {
+                       var ct = this;
+                       util.each( ct.injectionTracker, function ( key ) {
+                               ct.hasTest( key );
+                       });
+               },
 
-       /**
-        * CompletenessTest.fn.hasTest
-        *
-        * Checks if the given method name (ie. 'my.foo.bar')
-        * was called during the test suite (as far as the tracker knows).
-        * If not it adds it to missingTests.
-        *
-        * @param fnName {String}
-        * @return {Boolean}
-        */
-       hasTest: function ( fnName ) {
-               if ( !( fnName in this.methodCallTracker ) ) {
-                       this.missingTests[fnName] = true;
-                       return false;
-               }
-               return true;
-       },
+               /**
+                * CompletenessTest.fn.hasTest
+                *
+                * Checks if the given method name (ie. 'my.foo.bar')
+                * was called during the test suite (as far as the tracker knows).
+                * If not it adds it to missingTests.
+                *
+                * @param fnName {String}
+                * @return {Boolean}
+                */
+               hasTest: function ( fnName ) {
+                       if ( !( fnName in this.methodCallTracker ) ) {
+                               this.missingTests[fnName] = true;
+                               return false;
+                       }
+                       return true;
+               },
 
-       /**
-        * CompletenessTest.fn.injectCheck
-        *
-        * Injects a function (such as a spy that updates methodCallTracker when
-        * it's called) inside another function.
-        *
-        * @param masterVariable {Object}
-        * @param objectPathArray {Array}
-        * @param injectFn {Function}
-        */
-       injectCheck: function ( masterVariable, objectPathArray, injectFn ) {
-               var i, len, prev, memberName, lastMember,
-                       curr = masterVariable;
-
-               // Get the object in question through the path from the master variable,
-               // We can't pass the value directly because we need to re-define the object
-               // member and keep references to the parent object, member name and member
-               // value at all times.
-               for ( i = 0, len = objectPathArray.length; i < len; i++ ) {
-                       memberName = objectPathArray[i];
-
-                       prev = curr;
-                       curr = prev[memberName];
-                       lastMember = memberName;
-               }
+               /**
+                * CompletenessTest.fn.injectCheck
+                *
+                * Injects a function (such as a spy that updates methodCallTracker when
+                * it's called) inside another function.
+                *
+                * @param masterVariable {Object}
+                * @param objectPathArray {Array}
+                * @param injectFn {Function}
+                */
+               injectCheck: function ( masterVariable, objectPathArray, injectFn ) {
+                       var i, len, prev, memberName, lastMember,
+                               curr = masterVariable;
+
+                       // Get the object in question through the path from the master variable,
+                       // We can't pass the value directly because we need to re-define the object
+                       // member and keep references to the parent object, member name and member
+                       // value at all times.
+                       for ( i = 0, len = objectPathArray.length; i < len; i++ ) {
+                               memberName = objectPathArray[i];
+
+                               prev = curr;
+                               curr = prev[memberName];
+                               lastMember = memberName;
+                       }
 
-               // Objects are by reference, members (unless objects) are not.
-               prev[lastMember] = function () {
-                       injectFn();
-                       return curr.apply( this, arguments );
-               };
-       }
-};
+                       // Objects are by reference, members (unless objects) are not.
+                       prev[lastMember] = function () {
+                               injectFn();
+                               return curr.apply( this, arguments );
+                       };
+               }
+       };
 
-window.CompletenessTest = CompletenessTest;
+       /* Expose */
+       window.CompletenessTest = CompletenessTest;
 
-} )( jQuery );
+}( jQuery ) );
index 5684a44..257b224 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * QUnit v1.8.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.9.0 - A JavaScript Unit Testing Framework
  *
  * http://docs.jquery.com/QUnit
  *
        line-height: 1em;
        font-weight: normal;
 
-       border-radius: 15px 15px 0 0;
-       -moz-border-radius: 15px 15px 0 0;
-       -webkit-border-top-right-radius: 15px;
-       -webkit-border-top-left-radius: 15px;
+       border-radius: 5px 5px 0 0;
+       -moz-border-radius: 5px 5px 0 0;
+       -webkit-border-top-right-radius: 5px;
+       -webkit-border-top-left-radius: 5px;
 }
 
 #qunit-header a {
@@ -54,9 +54,9 @@
        color: #fff;
 }
 
-#qunit-header label {
+#qunit-testrunner-toolbar label {
        display: inline-block;
-       padding-left: 0.5em;
+       padding: 0 .5em 0 .1em;
 }
 
 #qunit-banner {
 
        background-color: #fff;
 
-       border-radius: 15px;
-       -moz-border-radius: 15px;
-       -webkit-border-radius: 15px;
-
-       box-shadow: inset 0px 2px 13px #999;
-       -moz-box-shadow: inset 0px 2px 13px #999;
-       -webkit-box-shadow: inset 0px 2px 13px #999;
+       border-radius: 5px;
+       -moz-border-radius: 5px;
+       -webkit-border-radius: 5px;
 }
 
 #qunit-tests table {
 #qunit-tests b.failed                       { color: #710909; }
 
 #qunit-tests li li {
-       margin: 0.5em;
-       padding: 0.4em 0.5em 0.4em 0.5em;
+       padding: 5px;
        background-color: #fff;
        border-bottom: none;
        list-style-position: inside;
 /*** Passing Styles */
 
 #qunit-tests li li.pass {
-       color: #5E740B;
+       color: #3c510c;
        background-color: #fff;
-       border-left: 26px solid #C6E746;
+       border-left: 10px solid #C6E746;
 }
 
 #qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
 #qunit-tests li li.fail {
        color: #710909;
        background-color: #fff;
-       border-left: 26px solid #EE5757;
+       border-left: 10px solid #EE5757;
        white-space: pre;
 }
 
 #qunit-tests > li:last-child {
-       border-radius: 0 0 15px 15px;
-       -moz-border-radius: 0 0 15px 15px;
-       -webkit-border-bottom-right-radius: 15px;
-       -webkit-border-bottom-left-radius: 15px;
+       border-radius: 0 0 5px 5px;
+       -moz-border-radius: 0 0 5px 5px;
+       -webkit-border-bottom-right-radius: 5px;
+       -webkit-border-bottom-left-radius: 5px;
 }
 
 #qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
index c1570c2..9efedcb 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * QUnit v1.8.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.9.0 - A JavaScript Unit Testing Framework
  *
  * http://docs.jquery.com/QUnit
  *
@@ -403,6 +403,8 @@ QUnit = {
 QUnit.assert = {
        /**
         * Asserts rough true-ish result.
+        * @name ok
+        * @function
         * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
         */
        ok: function( result, msg ) {
@@ -437,36 +439,59 @@ QUnit.assert = {
        /**
         * Assert that the first two arguments are equal, with an optional message.
         * Prints out both actual and expected values.
+        * @name equal
+        * @function
         * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
         */
        equal: function( actual, expected, message ) {
                QUnit.push( expected == actual, actual, expected, message );
        },
 
+       /**
+        * @name notEqual
+        * @function
+        */
        notEqual: function( actual, expected, message ) {
                QUnit.push( expected != actual, actual, expected, message );
        },
 
+       /**
+        * @name deepEqual
+        * @function
+        */
        deepEqual: function( actual, expected, message ) {
                QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
        },
 
+       /**
+        * @name notDeepEqual
+        * @function
+        */
        notDeepEqual: function( actual, expected, message ) {
                QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
        },
 
+       /**
+        * @name strictEqual
+        * @function
+        */
        strictEqual: function( actual, expected, message ) {
                QUnit.push( expected === actual, actual, expected, message );
        },
 
+       /**
+        * @name notStrictEqual
+        * @function
+        */
        notStrictEqual: function( actual, expected, message ) {
                QUnit.push( expected !== actual, actual, expected, message );
        },
 
-       raises: function( block, expected, message ) {
+       throws: function( block, expected, message ) {
                var actual,
                        ok = false;
 
+               // 'expected' is optional
                if ( typeof expected === "string" ) {
                        message = expected;
                        expected = null;
@@ -494,18 +519,29 @@ QUnit.assert = {
                        } else if ( expected.call( {}, actual ) === true ) {
                                ok = true;
                        }
-               }
 
-               QUnit.push( ok, actual, null, message );
+                       QUnit.push( ok, actual, null, message );
+               } else {
+                       QUnit.pushFailure( message, null, 'No exception was thrown.' );
+               }
        }
 };
 
-// @deprecated: Kept assertion helpers in root for backwards compatibility
+/**
+ * @deprecate since 1.8.0
+ * Kept assertion helpers in root for backwards compatibility
+ */
 extend( QUnit, QUnit.assert );
 
 /**
- * @deprecated: Kept for backwards compatibility
- * next step: remove entirely
+ * @deprecated since 1.9.0
+ * Kept global "raises()" for backwards compatibility
+ */
+QUnit.raises = QUnit.assert.throws;
+
+/**
+ * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
+ * Kept to avoid TypeErrors for undefined methods.
  */
 QUnit.equals = function() {
        QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
@@ -549,7 +585,20 @@ config = {
        // when enabled, all tests must call expect()
        requireExpects: false,
 
-       urlConfig: [ "noglobals", "notrycatch" ],
+       // add checkboxes that are persisted in the query-string
+       // when enabled, the id is set to `true` as a `QUnit.config` property
+       urlConfig: [
+               {
+                       id: "noglobals",
+                       label: "Check for Globals",
+                       tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
+               },
+               {
+                       id: "notrycatch",
+                       label: "No try-catch",
+                       tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
+               }
+       ],
 
        // logging callback queues
        begin: [],
@@ -770,7 +819,7 @@ extend( QUnit, {
                });
        },
 
-       pushFailure: function( message, source ) {
+       pushFailure: function( message, source, actual ) {
                if ( !config.current ) {
                        throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
                }
@@ -781,15 +830,23 @@ extend( QUnit, {
                                message: message
                        };
 
-               message = escapeInnerText(message ) || "error";
+               message = escapeInnerText( message ) || "error";
                message = "<span class='test-message'>" + message + "</span>";
                output = message;
 
+               output += "<table>";
+
+               if ( actual ) {
+                       output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeInnerText( actual ) + "</pre></td></tr>";
+               }
+
                if ( source ) {
                        details.source = source;
-                       output += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr></table>";
+                       output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr>";
                }
 
+               output += "</table>";
+
                runLoggingCallbacks( "log", QUnit, details );
 
                config.current.assertions.push({
@@ -859,7 +916,7 @@ QUnit.load = function() {
        runLoggingCallbacks( "begin", QUnit, {} );
 
        // Initialize the config, saving the execution queue
-       var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
+       var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes,
                urlConfigHtml = "",
                oldconfig = extend( {}, config );
 
@@ -872,8 +929,15 @@ QUnit.load = function() {
 
        for ( i = 0; i < len; i++ ) {
                val = config.urlConfig[i];
-               config[val] = QUnit.urlParams[val];
-               urlConfigHtml += "<label><input name='" + val + "' type='checkbox'" + ( config[val] ? " checked='checked'" : "" ) + ">" + val + "</label>";
+               if ( typeof val === "string" ) {
+                       val = {
+                               id: val,
+                               label: val,
+                               tooltip: "[no tooltip available]"
+                       };
+               }
+               config[ val.id ] = QUnit.urlParams[ val.id ];
+               urlConfigHtml += "<input id='qunit-urlconfig-" + val.id + "' name='" + val.id + "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) + " title='" + val.tooltip + "'><label for='qunit-urlconfig-" + val.id + "' title='" + val.tooltip + "'>" + val.label + "</label>";
        }
 
        // `userAgent` initialized at top of scope
@@ -885,12 +949,7 @@ QUnit.load = function() {
        // `banner` initialized at top of scope
        banner = id( "qunit-header" );
        if ( banner ) {
-               banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined }) + "'>" + banner.innerHTML + "</a> " + urlConfigHtml;
-               addEvent( banner, "change", function( event ) {
-                       var params = {};
-                       params[ event.target.name ] = event.target.checked ? true : undefined;
-                       window.location = QUnit.url( params );
-               });
+               banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
        }
 
        // `toolbar` initialized at top of scope
@@ -931,8 +990,18 @@ QUnit.load = function() {
                // `label` initialized at top of scope
                label = document.createElement( "label" );
                label.setAttribute( "for", "qunit-filter-pass" );
+               label.setAttribute( "title", "Only show tests and assertons that fail. Stored in sessionStorage." );
                label.innerHTML = "Hide passed tests";
                toolbar.appendChild( label );
+
+               urlConfigCheckboxes = document.createElement( 'span' );
+               urlConfigCheckboxes.innerHTML = urlConfigHtml;
+               addEvent( urlConfigCheckboxes, "change", function( event ) {
+                       var params = {};
+                       params[ event.target.name ] = event.target.checked ? true : undefined;
+                       window.location = QUnit.url( params );
+               });
+               toolbar.appendChild( urlConfigCheckboxes );
        }
 
        // `main` initialized at top of scope
@@ -1051,14 +1120,14 @@ function done() {
 function validTest( test ) {
        var include,
                filter = config.filter && config.filter.toLowerCase(),
-               module = config.module,
+               module = config.module && config.module.toLowerCase(),
                fullName = (test.module + ": " + test.testName).toLowerCase();
 
        if ( config.testNumber ) {
                return test.testNumber === config.testNumber;
        }
 
-       if ( module && test.module !== module ) {
+       if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
                return false;
        }
 
index 87e4538..e8b683e 100644 (file)
@@ -3,42 +3,42 @@
  *
  * Simple jQuery plugin to create, inject and remove spinners.
  */
-( function( $ ) {
+( function ( $ ) {
 
-$.extend( {
-       /**
-        * Creates a spinner element.
-        *
-        * @param id {String} id of the spinner
-        * @return {jQuery} spinner
-        */
-       createSpinner: function( id ) {
-               return $( '<div>' ).attr( {
-                       id: 'mw-spinner-' + id,
-                       'class': 'mw-spinner',
-                       title: '...'
-               } );
-       },
+       $.extend( {
+               /**
+                * Creates a spinner element.
+                *
+                * @param id {String} id of the spinner
+                * @return {jQuery} spinner
+                */
+               createSpinner: function ( id ) {
+                       return $( '<div>' ).attr( {
+                               id: 'mw-spinner-' + id,
+                               'class': 'mw-spinner',
+                               title: '...'
+                       } );
+               },
+
+               /**
+                * Removes a spinner element.
+                *
+                * @param id {String}
+                * @return {jQuery} spinner
+                */
+               removeSpinner: function ( id ) {
+                       return $( '#mw-spinner-' + id ).remove();
+               }
+       } );
 
        /**
-        * Removes a spinner element.
+        * Injects a spinner after the elements in the jQuery collection.
         *
-        * @param id {String}
-        * @return {jQuery} spinner
+        * @param id String id of the spinner
+        * @return {jQuery}
         */
-       removeSpinner: function( id ) {
-               return $( '#mw-spinner-' + id ).remove();
-       }
-} );
-
-/**
- * Injects a spinner after the elements in the jQuery collection.
- *
- * @param id String id of the spinner
- * @return {jQuery}
- */
-$.fn.injectSpinner = function( id ) {
-       return this.after( $.createSpinner( id ) );
-};
+       $.fn.injectSpinner = function ( id ) {
+               return this.after( $.createSpinner( id ) );
+       };
 
-} )( jQuery );
+}( jQuery ) );
index 466c551..dff5535 100644 (file)
  * highlightInput: Whether to hightlight matched portions of the input or not
  *             Type: Boolean, Default: false
  */
-( function( $ ) {
+( function ( $ ) {
 
 $.suggestions = {
        /**
         * Cancel any delayed updateSuggestions() call and inform the user so
         * they can cancel their result fetching if they use AJAX or something
         */
-       cancel: function( context ) {
-               if ( context.data.timerID != null ) {
+       cancel: function ( context ) {
+               if ( context.data.timerID !== null ) {
                        clearTimeout( context.data.timerID );
                }
                if ( $.isFunction( context.config.cancel ) ) {
@@ -61,7 +61,7 @@ $.suggestions = {
         * restores the value the currently displayed suggestions are based on, rather than the value just before
         * highlight() overwrote it; the former is arguably slightly more sensible.
         */
-       restore: function( context ) {
+       restore: function ( context ) {
                context.data.$textbox.val( context.data.prevText );
        },
        /**
@@ -70,7 +70,7 @@ $.suggestions = {
         * function does nothing.
         * @param {Boolean} delayed Whether or not to delay this by the currently configured amount of time
         */
-       update: function( context, delayed ) {
+       update: function ( context, delayed ) {
                // Only fetch if the value in the textbox changed and is not empty
                // if the textbox is empty then clear the result div, but leave other settings intouched
                function maybeFetch() {
@@ -86,7 +86,7 @@ $.suggestions = {
                }
 
                // Cancel previous call
-               if ( context.data.timerID != null ) {
+               if ( context.data.timerID !== null ) {
                        clearTimeout( context.data.timerID );
                }
                if ( delayed ) {
@@ -97,11 +97,11 @@ $.suggestions = {
                }
                $.suggestions.special( context );
        },
-       special: function( context ) {
+       special: function ( context ) {
                // Allow custom rendering - but otherwise don't do any rendering
                if ( typeof context.config.special.render === 'function' ) {
                        // Wait for the browser to update the value
-                       setTimeout( function() {
+                       setTimeout( function () {
                                // Render special
                                var $special = context.data.$container.find( '.suggestions-special' );
                                context.config.special.render.call( $special, context.data.$textbox.val() );
@@ -113,7 +113,7 @@ $.suggestions = {
         * @param property String Name of property
         * @param value Mixed Value to set property with
         */
-       configure: function( context, property, value ) {
+       configure: function ( context, property, value ) {
                // Validate creation using fallback values
                switch( property ) {
                        case 'fetch':
@@ -154,12 +154,13 @@ $.suggestions = {
                                                var $autoEllipseMe = $( [] );
                                                var matchedText = null;
                                                for ( var i = 0; i < context.config.suggestions.length; i++ ) {
+                                                       /*jshint loopfunc:true */
                                                        var text = context.config.suggestions[i];
                                                        var $result = $( '<div>' )
                                                                .addClass( 'suggestions-result' )
                                                                .attr( 'rel', i )
                                                                .data( 'text', context.config.suggestions[i] )
-                                                               .mousemove( function( e ) {
+                                                               .mousemove( function ( e ) {
                                                                        context.data.selectedWithMouse = true;
                                                                        $.suggestions.highlight(
                                                                                context, $(this).closest( '.suggestions-results div' ), false
@@ -220,9 +221,9 @@ $.suggestions = {
         * @param result <tr> to highlight: jQuery object, or 'prev' or 'next'
         * @param updateTextbox If true, put the suggestion in the textbox
         */
-       highlight: function( context, result, updateTextbox ) {
+       highlight: function ( context, result, updateTextbox ) {
                var selected = context.data.$container.find( '.suggestions-result-current' );
-               if ( !result.get || selected.get( 0 ) != result.get( 0 ) ) {
+               if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
                        if ( result === 'prev' ) {
                                if( selected.is( '.suggestions-special' ) ) {
                                        result = context.data.$container.find( '.suggestions-result:last' );
@@ -277,8 +278,8 @@ $.suggestions = {
         * Respond to keypress event
         * @param key Integer Code of key pressed
         */
-       keypress: function( e, context, key ) {
-               var     wasVisible = context.data.$container.is( ':visible' ),
+       keypress: function ( e, context, key ) {
+               var wasVisible = context.data.$container.is( ':visible' ),
                        preventDefault = false;
                switch ( key ) {
                        // Arrow down
@@ -340,13 +341,13 @@ $.suggestions = {
                }
        }
 };
-$.fn.suggestions = function() {
+$.fn.suggestions = function () {
 
        // Multi-context fields
-       var returnValue = null;
+       var returnValue;
        var args = arguments;
 
-       $(this).each( function() {
+       $(this).each( function () {
 
                /* Construction / Loading */
 
@@ -354,8 +355,8 @@ $.fn.suggestions = function() {
                if ( context === undefined || context === null ) {
                        context = {
                                config: {
-                                       'fetch' : function() {},
-                                       'cancel': function() {},
+                                       'fetch' : function () {},
+                                       'cancel': function () {},
                                        'special': {},
                                        'result': {},
                                        '$region': $(this),
@@ -383,7 +384,7 @@ $.fn.suggestions = function() {
                                if ( args.length > 1 ) {
                                        // Set property values
                                        $.suggestions.configure( context, args[0], args[1] );
-                               } else if ( returnValue == null ) {
+                               } else if ( returnValue === null || returnValue === undefined ) {
                                        // Get property values, but don't give access to internal data - returns only the first
                                        returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
                                }
@@ -395,15 +396,18 @@ $.fn.suggestions = function() {
                if ( context.data === undefined ) {
                        context.data = {
                                // ID of running timer
-                               'timerID': null,
+                               timerID: null,
+
                                // Text in textbox when suggestions were last fetched
-                               'prevText': null,
+                               prevText: null,
+
                                // Number of results visible without scrolling
-                               'visibleResults': 0,
+                               visibleResults: 0,
+
                                // Suggestion the last mousedown event occured on
-                               'mouseDownOn': $( [] ),
-                               '$textbox': $(this),
-                               'selectedWithMouse': false
+                               mouseDownOn: $( [] ),
+                               $textbox: $(this),
+                               selectedWithMouse: false
                        };
                        // Setup the css for positioning the results box
                        var newCSS = {
@@ -426,14 +430,14 @@ $.fn.suggestions = function() {
                                        $( '<div>' ).addClass( 'suggestions-results' )
                                                // Can't use click() because the container div is hidden when the textbox loses focus. Instead,
                                                // listen for a mousedown followed by a mouseup on the same div
-                                               .mousedown( function( e ) {
+                                               .mousedown( function ( e ) {
                                                        context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results div' );
                                                } )
-                                               .mouseup( function( e ) {
+                                               .mouseup( function ( e ) {
                                                        var $result = $( e.target ).closest( '.suggestions-results div' );
                                                        var $other = context.data.mouseDownOn;
                                                        context.data.mouseDownOn = $( [] );
-                                                       if ( $result.get( 0 ) != $other.get( 0 ) ) {
+                                                       if ( $result.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
                                                        }
                                                        $.suggestions.highlight( context, $result, true );
@@ -448,14 +452,14 @@ $.fn.suggestions = function() {
                                        $( '<div>' ).addClass( 'suggestions-special' )
                                                // Can't use click() because the container div is hidden when the textbox loses focus. Instead,
                                                // listen for a mousedown followed by a mouseup on the same div
-                                               .mousedown( function( e ) {
+                                               .mousedown( function ( e ) {
                                                        context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
                                                } )
-                                               .mouseup( function( e ) {
+                                               .mouseup( function ( e ) {
                                                        var $special = $( e.target ).closest( '.suggestions-special' );
                                                        var $other = context.data.mouseDownOn;
                                                        context.data.mouseDownOn = $( [] );
-                                                       if ( $special.get( 0 ) != $other.get( 0 ) ) {
+                                                       if ( $special.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
                                                        }
                                                        context.data.$container.hide();
@@ -464,7 +468,7 @@ $.fn.suggestions = function() {
                                                        }
                                                        context.data.$textbox.focus();
                                                } )
-                                               .mousemove( function( e ) {
+                                               .mousemove( function ( e ) {
                                                        context.data.selectedWithMouse = true;
                                                        $.suggestions.highlight(
                                                                context, $( e.target ).closest( '.suggestions-special' ), false
@@ -475,9 +479,9 @@ $.fn.suggestions = function() {
                        $(this)
                                // Stop browser autocomplete from interfering
                                .attr( 'autocomplete', 'off')
-                               .keydown( function( e ) {
+                               .keydown( function ( e ) {
                                        // Store key pressed to handle later
-                                       context.data.keypressed = ( e.keyCode === undefined ) ? e.which : e.keyCode;
+                                       context.data.keypressed = e.which;
                                        context.data.keypressedCount = 0;
 
                                        switch ( context.data.keypressed ) {
@@ -496,18 +500,18 @@ $.fn.suggestions = function() {
                                                        }
                                        }
                                } )
-                               .keypress( function( e ) {
+                               .keypress( function ( e ) {
                                        context.data.keypressedCount++;
                                        $.suggestions.keypress( e, context, context.data.keypressed );
                                } )
-                               .keyup( function( e ) {
+                               .keyup( function ( e ) {
                                        // Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
                                        // keypress in between, solve it
                                        if ( context.data.keypressedCount === 0 ) {
                                                $.suggestions.keypress( e, context, context.data.keypressed );
                                        }
                                } )
-                               .blur( function() {
+                               .blur( function () {
                                        // When losing focus because of a mousedown
                                        // on a suggestion, don't hide the suggestions
                                        if ( context.data.mouseDownOn.length > 0 ) {
@@ -520,6 +524,7 @@ $.fn.suggestions = function() {
                // Store the context for next time
                $(this).data( 'suggestions-context', context );
        } );
-       return returnValue !== null ? returnValue : $(this);
+       return returnValue !== undefined ? returnValue : $(this);
 };
-} )( jQuery );
\ No newline at end of file
+
+}( jQuery ) );
index 75731d7..cdae0ba 100644 (file)
@@ -1,50 +1,52 @@
 /**
  * jQuery tabIndex
  */
-( function( $ ) {
-/**
- * Finds the lowerst tabindex in use within a selection
- *
- * @return number Lowest tabindex on the page
- */
-$.fn.firstTabIndex = function() {
-       var minTabIndex = null;
-       $(this).find( '[tabindex]' ).each( function() {
-               var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
-               // In IE6/IE7 the above jQuery selector returns all elements,
-               // becuase it has a default value for tabIndex in IE6/IE7 of 0
-               // (rather than null/undefined). Therefore check "> 0" as well.
-               // Under IE7 under Windows NT 5.2 is also capable of returning NaN.
-               if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
-                       // Initial value
-                       if ( minTabIndex === null ) {
-                               minTabIndex = tabIndex;
-                       } else if ( tabIndex < minTabIndex ) {
-                               minTabIndex = tabIndex;
+( function ( $ ) {
+
+       /**
+        * Finds the lowerst tabindex in use within a selection
+        *
+        * @return number Lowest tabindex on the page
+        */
+       $.fn.firstTabIndex = function () {
+               var minTabIndex = null;
+               $(this).find( '[tabindex]' ).each( function () {
+                       var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
+                       // In IE6/IE7 the above jQuery selector returns all elements,
+                       // becuase it has a default value for tabIndex in IE6/IE7 of 0
+                       // (rather than null/undefined). Therefore check "> 0" as well.
+                       // Under IE7 under Windows NT 5.2 is also capable of returning NaN.
+                       if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
+                               // Initial value
+                               if ( minTabIndex === null ) {
+                                       minTabIndex = tabIndex;
+                               } else if ( tabIndex < minTabIndex ) {
+                                       minTabIndex = tabIndex;
+                               }
                        }
-               }
-       } );
-       return minTabIndex;
-};
+               } );
+               return minTabIndex;
+       };
 
-/**
- * Finds the highest tabindex in use within a selection
- *
- * @return number Highest tabindex on the page
- */
-$.fn.lastTabIndex = function() {
-       var maxTabIndex = null;
-       $(this).find( '[tabindex]' ).each( function() {
-               var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
-               if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
-                       // Initial value
-                       if ( maxTabIndex === null ) {
-                               maxTabIndex = tabIndex;
-                       } else if ( tabIndex > maxTabIndex ) {
-                               maxTabIndex = tabIndex;
+       /**
+        * Finds the highest tabindex in use within a selection
+        *
+        * @return number Highest tabindex on the page
+        */
+       $.fn.lastTabIndex = function () {
+               var maxTabIndex = null;
+               $(this).find( '[tabindex]' ).each( function () {
+                       var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
+                       if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
+                               // Initial value
+                               if ( maxTabIndex === null ) {
+                                       maxTabIndex = tabIndex;
+                               } else if ( tabIndex > maxTabIndex ) {
+                                       maxTabIndex = tabIndex;
+                               }
                        }
-               }
-       } );
-       return maxTabIndex;
-};
-} )( jQuery );
+               } );
+               return maxTabIndex;
+       };
+
+}( jQuery ) );
index ea86b64..3ef71d5 100644 (file)
  * @author Christian Bach/christian.bach@polyester.se
  */
 
-( function( $ ) {
+( function ( $, mw ) {
 
        /* Local scope */
 
-       var     ts,
+       var ts,
                parsers = [];
 
        /* Parser utility functions */
 
        function getElementText( node ) {
                var $node = $( node ),
-                       data = $node.attr( 'data-sort-value' );
-               if ( data !== undefined ) {
-                       return data;
+                       // Use data-sort-value attribute.
+                       // Use data() instead of attr() so that live value changes
+                       // are processed as well (bug 38152).
+                       data = $node.data( 'sortValue' );
+
+               if ( data !== null && data !== undefined ) {
+                       // Cast any numbers or other stuff to a string, methods
+                       // like charAt, toLowerCase and split are expected.
+                       return String( data );
                } else {
                        return $node.text();
                }
        }
 
        function detectParserForColumn( table, rows, cellIndex ) {
-               var     l = parsers.length,
+               var l = parsers.length,
                        nodeValue,
                        // Start with 1 because 0 is the fallback parser
                        i = 1,
        }
 
        function buildParserCache( table, $headers ) {
-               var     rows = table.tBodies[0].rows,
+               var rows = table.tBodies[0].rows,
                        sortType,
                        parsers = [];
 
                if ( rows[0] ) {
 
-                       var     cells = rows[0].cells,
+                       var cells = rows[0].cells,
                                len = cells.length,
                                i, parser;
 
        /* Other utility functions */
 
        function buildCache( table ) {
-               var     totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length ) || 0,
+               var totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length ) || 0,
                        totalCells = ( table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length ) || 0,
                        parsers = table.config.parsers,
                        cache = {
                for ( var i = 0; i < totalRows; ++i ) {
 
                        // Add the table data to main data array
-                       var     $row = $( table.tBodies[0].rows[i] ),
+                       var $row = $( table.tBodies[0].rows[i] ),
                                cols = [];
 
                        // if this is a child row, add it to the last row's children and
        }
 
        function appendToTable( table, cache ) {
-               var     row = cache.row,
+               var row = cache.row,
                        normalized = cache.normalized,
                        totalRows = normalized.length,
                        checkCell = ( normalized[0].length - 1 ),
                }
                table.tBodies[0].appendChild( fragment );
        }
-       
+
        /**
         * Find all header rows in a thead-less table and put them in a <thead> tag.
         * This only treats a row as a header row if it contains only <th>s (no <td>s)
         * and if it is preceded entirely by header rows. The algorithm stops when
         * it encounters the first non-header row.
-        * 
+        *
         * After this, it will look at all rows at the bottom for footer rows
         * And place these in a tfoot using similar rules.
         * @param $table jQuery object for a <table>
-        */ 
+        */
        function emulateTHeadAndFoot( $table ) {
                var $rows = $table.find( '> tbody > tr' );
                if( !$table.get(0).tHead ) {
                        var $thead = $( '<thead>' );
-                       $rows.each( function() {
+                       $rows.each( function () {
                                if ( $(this).children( 'td' ).length > 0 ) {
                                        // This row contains a <td>, so it's not a header row
                                        // Stop here
                                        break;
                                }
                                $tfoot.prepend( $( $rows[i] ));
-                       } 
+                       }
                        $table.append( $tfoot );
                }
        }
 
        function buildHeaders( table, msg ) {
-               var     maxSeen = 0,
+               var maxSeen = 0,
                        longest,
                        realCellIndex = 0,
                        $tableHeaders = $( 'thead:eq(0) > tr', table );
                if ( $tableHeaders.length > 1 ) {
-                       $tableHeaders.each( function() {
+                       $tableHeaders.each( function () {
                                if ( this.cells.length > maxSeen ) {
                                        maxSeen = this.cells.length;
                                        longest = this;
                        });
                        $tableHeaders = $( longest );
                }
-               $tableHeaders = $tableHeaders.children( 'th' ).each( function( index ) {
+               $tableHeaders = $tableHeaders.children( 'th' ).each( function ( index ) {
                        this.column = realCellIndex;
 
                        var colspan = this.colspan;
        function isValueInArray( v, a ) {
                var l = a.length;
                for ( var i = 0; i < l; i++ ) {
-                       if ( a[i][0] == v ) {
+                       if ( a[i][0] === v ) {
                                return true;
                        }
                }
                $headers.removeClass( css[0] ).removeClass( css[1] );
 
                var h = [];
-               $headers.each( function( offset ) {
+               $headers.each( function ( offset ) {
                        if ( !this.sortDisabled ) {
                                h[this.column] = $( this );
                        }
        }
 
        function sortText( a, b ) {
-               return ( (a < b) ? false : ((a > b) ? true : 0) );
+               return ( (a < b) ? -1 : ((a > b) ? 1 : 0) );
        }
 
        function sortTextDesc( a, b ) {
-               return ( (b < a) ? false : ((b > a) ? true : 0) );
+               return ( (b < a) ? -1 : ((b > a) ? 1 : 0) );
        }
 
-       function checkSorting( array1, array2, sortList ) {
-               var col, fn, ret;
-               for ( var i = 0, len = sortList.length; i < len; i++ ) {
-                       col = sortList[i][0];
-                       fn = ( sortList[i][1] ) ? sortTextDesc : sortText;
-                       ret = fn.call( this, array1[col], array2[col] );
-                       if ( ret !== 0 ) {
-                               return ret;
-                       }
+       function multisort( table, sortList, cache ) {
+               var sortFn = [];
+               var len = sortList.length;
+               for ( var i = 0; i < len; i++ ) {
+                       sortFn[i] = ( sortList[i][1] ) ? sortTextDesc : sortText;
                }
-               return ret;
-       }
-
-       // Merge sort algorithm
-       // Based on http://en.literateprograms.org/Merge_sort_(JavaScript)
-       function mergeSortHelper( array, begin, beginRight, end, sortList ) {
-               for ( ; begin < beginRight; ++begin ) {
-                       if ( checkSorting( array[begin], array[beginRight], sortList ) ) {
-                               var v = array[begin];
-                               array[begin] = array[beginRight];
-                               var begin2 = beginRight;
-                               while ( begin2 + 1 < end && checkSorting( v, array[begin2 + 1], sortList ) ) {
-                                       var tmp = array[begin2];
-                                       array[begin2] = array[begin2 + 1];
-                                       array[begin2 + 1] = tmp;
-                                       ++begin2;
+               cache.normalized.sort( function ( array1, array2 ) {
+                       var col, ret;
+                       for ( var i = 0; i < len; i++ ) {
+                               col = sortList[i][0];
+                               ret = sortFn[i].call( this, array1[col], array2[col] );
+                               if ( ret !== 0 ) {
+                                       return ret;
                                }
-                               array[begin2] = v;
                        }
-               }
-       }
-
-       function mergeSort(array, begin, end, sortList) {
-               var size = end - begin;
-               if ( size < 2 ) {
-                       return;
-               }
-
-               var beginRight = begin + Math.floor(size / 2);
-
-               mergeSort( array, begin, beginRight, sortList );
-               mergeSort( array, beginRight, end, sortList );
-               mergeSortHelper( array, begin, beginRight, end, sortList );
-       }
-
-       function multisort( table, sortList, cache ) {
-               var i = sortList.length;
-               mergeSort( cache.normalized, 0, cache.normalized.length, sortList );
-
+                       // Fall back to index number column to ensure stable sort
+                       return sortText.call( this, array1[array1.length - 1], array2[array2.length - 1] );
+               } );
                return cache;
        }
 
 
        function buildDateTable() {
                var regex = [];
-               ts.monthNames = [
-                       [],
-                       []
-               ];
+               ts.monthNames = {};
 
                for ( var i = 1; i < 13; i++ ) {
-                       ts.monthNames[0][i] = mw.config.get( 'wgMonthNames' )[i].toLowerCase();
-                       ts.monthNames[1][i] = mw.config.get( 'wgMonthNamesShort' )[i].toLowerCase().replace( '.', '' );
-                       regex.push( $.escapeRE( ts.monthNames[0][i] ) );
-                       regex.push( $.escapeRE( ts.monthNames[1][i] ) );
+                       var name = mw.config.get( 'wgMonthNames' )[i].toLowerCase();
+                       ts.monthNames[name] = i;
+                       regex.push( $.escapeRE( name ) );
+                       name = mw.config.get( 'wgMonthNamesShort' )[i].toLowerCase().replace( '.', '' );
+                       ts.monthNames[name] = i;
+                       regex.push( $.escapeRE( name ) );
                }
 
                // Build piped string
 
                // Build RegEx
                // Any date formated with . , ' - or /
-               ts.dateRegex[0] = new RegExp( /^\s*\d{1,2}[\,\.\-\/'\s]{1,2}\d{1,2}[\,\.\-\/'\s]{1,2}\d{2,4}\s*?/i);
+               ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i);
 
                // Written Month name, dmy
-               ts.dateRegex[1] = new RegExp( '^\\s*\\d{1,2}[\\,\\.\\-\\/\'\\s]*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*\\d{2,4}\\s*$', 'i' );
+               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
 
                // Written Month name, mdy
-               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*\\d{1,2}[\\,\\.\\-\\/\'\\s]*\\d{2,4}\\s*$', 'i' );
+               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
 
        }
 
        function explodeRowspans( $table ) {
                // Split multi row cells into multiple cells with the same content
-               $table.find( '> tbody > tr > [rowspan]' ).each(function() {
+               $table.find( '> tbody > tr > [rowspan]' ).each(function () {
                        var rowSpan = this.rowSpan;
                        this.rowSpan = 1;
                        var cell = $( this );
                                new RegExp( /^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$/)
                        ],
                        currency: [
-                               new RegExp( /^[£$€?.]/),
-                               new RegExp( /[£$€]/g)
+                               new RegExp( /(^[£$€¥]|[£$€¥]$)/),
+                               new RegExp( /[£$€¥]/g)
                        ],
                        url: [
                                new RegExp( /^(https?|ftp|file):\/\/$/),
                        },
 
                        dateRegex: [],
-                       monthNames: [],
+                       monthNames: {},
 
                        /**
                         * @param $tables {jQuery}
                         * @param settings {Object} (optional)
                         */
-                       construct: function( $tables, settings ) {
-                               return $tables.each( function( i, table ) {
+                       construct: function ( $tables, settings ) {
+                               return $tables.each( function ( i, table ) {
                                        // Declare and cache.
-                                       var     $document, $headers, cache, config, sortOrder,
+                                       var $document, $headers, cache, config, sortOrder,
                                                $table = $( table ),
                                                shiftDown = 0,
                                                firstTime = true;
                                                // No thead found. Look for rows with <th>s and
                                                // move them into a <thead> tag or a <tfoot> tag
                                                emulateTHeadAndFoot( $table );
-                                               
+
                                                // Still no thead? Then quit
                                                if ( !table.tHead ) {
                                                        return;
 
                                        // Apply event handling to headers
                                        // this is too big, perhaps break it out?
-                                       $headers.click( function( e ) {
-                                               if ( e.target.nodeName.toLowerCase() == 'a' ) {
+                                       $headers.click( function ( e ) {
+                                               if ( e.target.nodeName.toLowerCase() === 'a' ) {
                                                        // The user clicked on a link inside a table header
                                                        // Do nothing and let the default link click action continue
                                                        return true;
                                                        explodeRowspans( $table );
                                                        // try to auto detect column type, and store in tables config
                                                        table.config.parsers = buildParserCache( table, $headers );
-                                                       // build the cache for the tbody cells
-                                                       cache = buildCache( table );
                                                }
+
+                                               // Build the cache for the tbody cells
+                                               // to share between calculations for this sort action.
+                                               // Re-calculated each time a sort action is performed due to possiblity
+                                               // that sort values change. Shouldn't be too expensive, but if it becomes
+                                               // too slow an event based system should be implemented somehow where
+                                               // cells get event .change() and bubbles up to the <table> here
+                                               cache = buildCache( table );
+
                                                var totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
                                                if ( !table.sortDisabled && totalRows > 0 ) {
 
                                                                        for ( var j = 0; j < config.sortList.length; j++ ) {
                                                                                var s = config.sortList[j],
                                                                                        o = config.headerList[s[0]];
-                                                                               if ( s[0] == i ) {
+                                                                               if ( s[0] === i ) {
                                                                                        o.count = s[1];
                                                                                        o.count++;
                                                                                        s[1] = o.count % 2;
                                                }
 
                                        // Cancel selection
-                                       } ).mousedown( function() {
+                                       } ).mousedown( function () {
                                                if ( config.cancelSelection ) {
-                                                       this.onselectstart = function() {
+                                                       this.onselectstart = function () {
                                                                return false;
                                                        };
                                                        return false;
                                } );
                        },
 
-                       addParser: function( parser ) {
-                               var     l = parsers.length,
+                       addParser: function ( parser ) {
+                               var l = parsers.length,
                                        a = true;
                                for ( var i = 0; i < l; i++ ) {
-                                       if ( parsers[i].id.toLowerCase() == parser.id.toLowerCase() ) {
+                                       if ( parsers[i].id.toLowerCase() === parser.id.toLowerCase() ) {
                                                a = false;
                                        }
                                }
                                }
                        },
 
-                       formatDigit: function( s ) {
+                       formatDigit: function ( s ) {
                                if ( ts.transformTable !== false ) {
-                                       var     out = '',
+                                       var out = '',
                                                c;
                                        for ( var p = 0; p < s.length; p++ ) {
                                                c = s.charAt(p);
                                return ( isNaN(i)) ? 0 : i;
                        },
 
-                       formatFloat: function( s ) {
+                       formatFloat: function ( s ) {
                                var i = parseFloat(s);
                                return ( isNaN(i)) ? 0 : i;
                        },
 
-                       formatInt: function( s ) {
+                       formatInt: function ( s ) {
                                var i = parseInt( s, 10 );
                                return ( isNaN(i)) ? 0 : i;
                        },
 
-                       clearTableBody: function( table ) {
+                       clearTableBody: function ( table ) {
                                if ( $.browser.msie ) {
-                                       var empty = function( el ) {
+                                       var empty = function ( el ) {
                                                while ( el.firstChild ) {
                                                        el.removeChild( el.firstChild );
                                                }
        ts = $.tablesorter;
 
        // Register as jQuery prototype method
-       $.fn.tablesorter = function( settings ) {
+       $.fn.tablesorter = function ( settings ) {
                return ts.construct( this, settings );
        };
 
        // Add default parsers
        ts.addParser( {
                id: 'text',
-               is: function( s ) {
+               is: function ( s ) {
                        return true;
                },
-               format: function( s ) {
+               format: function ( s ) {
                        s = $.trim( s.toLowerCase() );
                        if ( ts.collationRegex ) {
                                var tsc = ts.collationTable;
-                               s = s.replace( ts.collationRegex, function( match ) {
+                               s = s.replace( ts.collationRegex, function ( match ) {
                                        var r = tsc[match] ? tsc[match] : tsc[match.toUpperCase()];
                                        return r.toLowerCase();
                                } );
 
        ts.addParser( {
                id: 'IPAddress',
-               is: function( s ) {
+               is: function ( s ) {
                        return ts.rgx.IPAddress[0].test(s);
                },
-               format: function( s ) {
-                       var     a = s.split( '.' ),
+               format: function ( s ) {
+                       var a = s.split( '.' ),
                                r = '',
                                l = a.length;
                        for ( var i = 0; i < l; i++ ) {
                                var item = a[i];
-                               if ( item.length == 1 ) {
+                               if ( item.length === 1 ) {
                                        r += '00' + item;
-                               } else if ( item.length == 2 ) {
+                               } else if ( item.length === 2 ) {
                                        r += '0' + item;
                                } else {
                                        r += item;
 
        ts.addParser( {
                id: 'currency',
-               is: function( s ) {
+               is: function ( s ) {
                        return ts.rgx.currency[0].test(s);
                },
-               format: function( s ) {
+               format: function ( s ) {
                        return $.tablesorter.formatDigit( s.replace( ts.rgx.currency[1], '' ) );
                },
                type: 'numeric'
 
        ts.addParser( {
                id: 'url',
-               is: function( s ) {
+               is: function ( s ) {
                        return ts.rgx.url[0].test(s);
                },
-               format: function( s ) {
+               format: function ( s ) {
                        return $.trim( s.replace( ts.rgx.url[1], '' ) );
                },
                type: 'text'
 
        ts.addParser( {
                id: 'isoDate',
-               is: function( s ) {
+               is: function ( s ) {
                        return ts.rgx.isoDate[0].test(s);
                },
-               format: function( s ) {
+               format: function ( s ) {
                        return $.tablesorter.formatFloat((s !== '') ? new Date(s.replace(
                        new RegExp( /-/g), '/')).getTime() : '0' );
                },
 
        ts.addParser( {
                id: 'usLongDate',
-               is: function( s ) {
+               is: function ( s ) {
                        return ts.rgx.usLongDate[0].test(s);
                },
-               format: function( s ) {
+               format: function ( s ) {
                        return $.tablesorter.formatFloat( new Date(s).getTime() );
                },
                type: 'numeric'
 
        ts.addParser( {
                id: 'date',
-               is: function( s ) {
+               is: function ( s ) {
                        return ( ts.dateRegex[0].test(s) || ts.dateRegex[1].test(s) || ts.dateRegex[2].test(s ));
                },
-               format: function( s, table ) {
+               format: function ( s, table ) {
+                       var match;
                        s = $.trim( s.toLowerCase() );
 
-                       for ( var i = 1, j = 0; i < 13 && j < 2; i++ ) {
-                               s = s.replace( ts.monthNames[j][i], i );
-                               if ( i == 12 ) {
-                                       j++;
-                                       i = 0;
+                       if ( ( match = s.match( ts.dateRegex[0] ) ) !== null ) {
+                               if ( mw.config.get( 'wgDefaultDateFormat' ) === 'mdy' || mw.config.get( 'wgContentLanguage' ) === 'en' ) {
+                                       s = [ match[3], match[1], match[2] ];
+                               } else if ( mw.config.get( 'wgDefaultDateFormat' ) === 'dmy' ) {
+                                       s = [ match[3], match[2], match[1] ];
                                }
+                       } else if ( ( match = s.match( ts.dateRegex[1] ) ) !== null ) {
+                               s = [ match[3], '' + ts.monthNames[match[2]], match[1] ];
+                       } else if ( ( match = s.match( ts.dateRegex[2] ) ) !== null ) {
+                               s = [ match[3], '' + ts.monthNames[match[1]], match[2] ];
+                       } else {
+                               // Should never get here
+                               return '99999999';
                        }
 
-                       s = s.replace( /[\-\.\,' ]/g, '/' );
-
-                       // Replace double slashes
-                       s = s.replace( /\/\//g, '/' );
-                       s = s.replace( /\/\//g, '/' );
-                       s = s.split( '/' );
-
                        // Pad Month and Day
-                       if ( s[0] && s[0].length == 1 ) {
-                               s[0] = '0' + s[0];
-                       }
-                       if ( s[1] && s[1].length == 1 ) {
+                       if ( s[1].length === 1 ) {
                                s[1] = '0' + s[1];
                        }
-                       var y;
+                       if ( s[2].length === 1 ) {
+                               s[2] = '0' + s[2];
+                       }
 
-                       if ( !s[2] ) {
-                               // Fix yearless dates
-                               s[2] = 2000;
-                       } else if ( ( y = parseInt( s[2], 10) ) < 100 ) {
+                       var y;
+                       if ( ( y = parseInt( s[0], 10) ) < 100 ) {
                                // Guestimate years without centuries
                                if ( y < 30 ) {
-                                       s[2] = 2000 + y;
+                                       s[0] = 2000 + y;
                                } else {
-                                       s[2] = 1900 + y;
+                                       s[0] = 1900 + y;
                                }
                        }
-                       // Resort array depending on preferences
-                       if ( mw.config.get( 'wgDefaultDateFormat' ) == 'mdy' || mw.config.get( 'wgContentLanguage' ) == 'en' ) {
-                               s.push( s.shift() );
-                               s.push( s.shift() );
-                       } else if ( mw.config.get( 'wgDefaultDateFormat' ) == 'dmy' ) {
-                               var d = s.shift();
-                               s.push( s.shift() );
-                               s.push(d);
+                       while ( s[0].length < 4 ) {
+                               s[0] = '0' + s[0];
                        }
                        return parseInt( s.join( '' ), 10 );
                },
 
        ts.addParser( {
                id: 'time',
-               is: function( s ) {
+               is: function ( s ) {
                        return ts.rgx.time[0].test(s);
                },
-               format: function( s ) {
+               format: function ( s ) {
                        return $.tablesorter.formatFloat( new Date( '2000/01/01 ' + s ).getTime() );
                },
                type: 'numeric'
 
        ts.addParser( {
                id: 'number',
-               is: function( s, table ) {
+               is: function ( s, table ) {
                        return $.tablesorter.numberRegex.test( $.trim( s ));
                },
-               format: function( s ) {
+               format: function ( s ) {
                        return $.tablesorter.formatDigit(s);
                },
                type: 'numeric'
        } );
 
-} )( jQuery );
+}( jQuery, mediaWiki ) );
index 91b6e75..583c1ed 100644 (file)
 /**
  * These plugins provide extra functionality for interaction with textareas.
  */
-( function( $ ) {
+( function ( $ ) {
+       /*jshint noempty:false */
 
-if (document.selection && document.selection.createRange) {
-       // On IE, patch the focus() method to restore the windows' scroll position
-       // (bug 32241)
-       $.fn.extend({
-               focus : (function ( _focus ) {
-                       return function () {
-                               if ( arguments.length == 0 ) {
-                                       var $w = $( window );
-                                       var state = {top: $w.scrollTop(), left: $w.scrollLeft()};
-                                       var result = _focus.apply( this, arguments );
-                                       window.scrollTo( state.top, state.left );
-                                       return result;
-                               }
-                               return _focus.apply( this, arguments );
-                       };
-               })( $.fn.focus )
-       });
-}
-
-$.fn.textSelection = function( command, options ) {
-
-/**
- * Helper function to get an IE TextRange object for an element
- */
-function rangeForElementIE( e ) {
-       if ( e.nodeName.toLowerCase() == 'input' ) {
-               return e.createTextRange();
-       } else {
-               var sel = document.body.createTextRange();
-               sel.moveToElementText( e );
-               return sel;
+       if ( document.selection && document.selection.createRange ) {
+               // On IE, patch the focus() method to restore the windows' scroll position
+               // (bug 32241)
+               $.fn.extend({
+                       focus: ( function ( jqFocus ) {
+                               return function () {
+                                       if ( arguments.length === 0 ) {
+                                               var $w = $( window );
+                                               var state = {top: $w.scrollTop(), left: $w.scrollLeft()};
+                                               var result = jqFocus.apply( this, arguments );
+                                               window.scrollTo( state.top, state.left );
+                                               return result;
+                                       }
+                                       return jqFocus.apply( this, arguments );
+                               };
+                       }( $.fn.focus ) )
+               });
        }
-}
 
-/**
- * Helper function for IE for activating the textarea. Called only in the
- * IE-specific code paths below; makes use of IE-specific non-standard
- * function setActive() if possible to avoid screen flicker.
- */
-function activateElementOnIE( element ) {
-       if ( element.setActive ) {
-               element.setActive(); // bug 32241: doesn't scroll
-       } else {
-               $( element ).focus(); // may scroll (but we patched it above)
-       }
-}
-
-var fn = {
-/**
- * Get the contents of the textarea
- */
-getContents: function() {
-       return this.val();
-},
-/**
- * Get the currently selected text in this textarea. Will focus the textarea
- * in some browsers (IE/Opera)
- */
-getSelection: function() {
-       var e = this.get( 0 );
-       var retval = '';
-       if ( $(e).is( ':hidden' ) ) {
-               // Do nothing
-       } else if ( document.selection && document.selection.createRange ) {
-               activateElementOnIE( e );
-               var range = document.selection.createRange();
-               retval = range.text;
-       } else if ( e.selectionStart || e.selectionStart == '0' ) {
-               retval = e.value.substring( e.selectionStart, e.selectionEnd );
-       }
-       return retval;
-},
-/**
- * Ported from skins/common/edit.js by Trevor Parscal
- * (c) 2009 Wikimedia Foundation (GPLv2) - http://www.wikimedia.org
- *
- * Inserts text at the begining and end of a text selection, optionally
- * inserting text at the caret when selection is empty.
- *
- * @fixme document the options parameters
- */
-encapsulateSelection: function( options ) {
-       return this.each( function() {
-               var pre = options.pre, post = options.post;
+       $.fn.textSelection = function ( command, options ) {
 
                /**
-                * Check if the selected text is the same as the insert text
+                * Helper function to get an IE TextRange object for an element
                 */
-               function checkSelectedText() {
-                       if ( !selText ) {
-                               selText = options.peri;
-                               isSample = true;
-                       } else if ( options.replace ) {
-                               selText = options.peri;
+               function rangeForElementIE( e ) {
+                       if ( e.nodeName.toLowerCase() === 'input' ) {
+                               return e.createTextRange();
                        } else {
-                               while ( selText.charAt( selText.length - 1 ) == ' ' ) {
-                                       // Exclude ending space char
-                                       selText = selText.substring( 0, selText.length - 1 );
-                                       post += ' ';
-                               }
-                               while ( selText.charAt( 0 ) == ' ' ) {
-                                       // Exclude prepending space char
-                                       selText = selText.substring( 1, selText.length );
-                                       pre = ' ' + pre;
-                               }
+                               var sel = document.body.createTextRange();
+                               sel.moveToElementText( e );
+                               return sel;
                        }
                }
 
                /**
-                * Do the splitlines stuff.
-                *
-                * Wrap each line of the selected text with pre and post
+                * Helper function for IE for activating the textarea. Called only in the
+                * IE-specific code paths below; makes use of IE-specific non-standard
+                * function setActive() if possible to avoid screen flicker.
                 */
-               function doSplitLines( selText, pre, post ) {
-                       var insertText = '';
-                       var selTextArr = selText.split( '\n' );
-                       for ( var i = 0; i < selTextArr.length; i++ ) {
-                               insertText += pre + selTextArr[i] + post;
-                               if ( i != selTextArr.length - 1 ) {
-                                       insertText += '\n';
-                               }
+               function activateElementOnIE( element ) {
+                       if ( element.setActive ) {
+                               element.setActive(); // bug 32241: doesn't scroll
+                       } else {
+                               $( element ).focus(); // may scroll (but we patched it above)
                        }
-                       return insertText;
                }
 
-               var isSample = false;
-               if ( this.style.display == 'none' ) {
-                       // Do nothing
-               } else if ( document.selection && document.selection.createRange ) {
-                       // IE
+               var fn = {
+                       /**
+                        * Get the contents of the textarea
+                        */
+                       getContents: function () {
+                               return this.val();
+                       },
+                       /**
+                        * Get the currently selected text in this textarea. Will focus the textarea
+                        * in some browsers (IE/Opera)
+                        */
+                       getSelection: function () {
+                               var e = this.get( 0 );
+                               var retval = '';
+                               if ( $(e).is( ':hidden' ) ) {
+                                       // Do nothing
+                               } else if ( document.selection && document.selection.createRange ) {
+                                       activateElementOnIE( e );
+                                       var range = document.selection.createRange();
+                                       retval = range.text;
+                               } else if ( e.selectionStart || e.selectionStart === 0 ) {
+                                       retval = e.value.substring( e.selectionStart, e.selectionEnd );
+                               }
+                               return retval;
+                       },
+                       /**
+                        * Ported from skins/common/edit.js by Trevor Parscal
+                        * (c) 2009 Wikimedia Foundation (GPLv2) - http://www.wikimedia.org
+                        *
+                        * Inserts text at the begining and end of a text selection, optionally
+                        * inserting text at the caret when selection is empty.
+                        *
+                        * @fixme document the options parameters
+                        */
+                       encapsulateSelection: function ( options ) {
+                               return this.each( function () {
+                                       var selText, scrollTop, insertText,
+                                               pre = options.pre,
+                                               post = options.post;
 
-                       // Note that IE9 will trigger the next section unless we check this first.
-                       // See bug 35201.
+                                       /**
+                                        * Check if the selected text is the same as the insert text
+                                        */
+                                       function checkSelectedText() {
+                                               if ( !selText ) {
+                                                       selText = options.peri;
+                                                       isSample = true;
+                                               } else if ( options.replace ) {
+                                                       selText = options.peri;
+                                               } else {
+                                                       while ( selText.charAt( selText.length - 1 ) === ' ' ) {
+                                                               // Exclude ending space char
+                                                               selText = selText.substring( 0, selText.length - 1 );
+                                                               post += ' ';
+                                                       }
+                                                       while ( selText.charAt( 0 ) === ' ' ) {
+                                                               // Exclude prepending space char
+                                                               selText = selText.substring( 1, selText.length );
+                                                               pre = ' ' + pre;
+                                                       }
+                                               }
+                                       }
 
-                       activateElementOnIE( this );
-                       if ( context ) {
-                               context.fn.restoreCursorAndScrollTop();
-                       }
-                       if ( options.selectionStart !== undefined ) {
-                               $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
-                       }
+                                       /**
+                                        * Do the splitlines stuff.
+                                        *
+                                        * Wrap each line of the selected text with pre and post
+                                        */
+                                       function doSplitLines( selText, pre, post ) {
+                                               var insertText = '';
+                                               var selTextArr = selText.split( '\n' );
+                                               for ( var i = 0; i < selTextArr.length; i++ ) {
+                                                       insertText += pre + selTextArr[i] + post;
+                                                       if ( i !== selTextArr.length - 1 ) {
+                                                               insertText += '\n';
+                                                       }
+                                               }
+                                               return insertText;
+                                       }
 
-                       var selText = $(this).textSelection( 'getSelection' );
-                       var scrollTop = this.scrollTop;
-                       var range = document.selection.createRange();
+                                       var isSample = false;
+                                       if ( this.style.display === 'none' ) {
+                                               // Do nothing
+                                       } else if ( document.selection && document.selection.createRange ) {
+                                               // IE
 
-                       checkSelectedText();
-                       var insertText = pre + selText + post;
-                       if ( options.splitlines ) {
-                               insertText = doSplitLines( selText, pre, post );
-                       }
-                       if ( options.ownline && range.moveStart ) {
-                               var range2 = document.selection.createRange();
-                               range2.collapse();
-                               range2.moveStart( 'character', -1 );
-                               // FIXME: Which check is correct?
-                               if ( range2.text != "\r" && range2.text != "\n" && range2.text != "" ) {
-                                       insertText = "\n" + insertText;
-                                       pre += "\n";
-                               }
-                               var range3 = document.selection.createRange();
-                               range3.collapse( false );
-                               range3.moveEnd( 'character', 1 );
-                               if ( range3.text != "\r" && range3.text != "\n" && range3.text != "" ) {
-                                       insertText += "\n";
-                                       post += "\n";
-                               }
-                       }
+                                               // Note that IE9 will trigger the next section unless we check this first.
+                                               // See bug 35201.
 
-                       range.text = insertText;
-                       if ( isSample && options.selectPeri && range.moveStart ) {
-                               range.moveStart( 'character', - post.length - selText.length );
-                               range.moveEnd( 'character', - post.length );
-                       }
-                       range.select();
-                       // Restore the scroll position
-                       this.scrollTop = scrollTop;
-               } else if ( this.selectionStart || this.selectionStart == '0' ) {
-                       // Mozilla/Opera
+                                               activateElementOnIE( this );
+                                               if ( context ) {
+                                                       context.fn.restoreCursorAndScrollTop();
+                                               }
+                                               if ( options.selectionStart !== undefined ) {
+                                                       $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                               }
 
-                       $(this).focus();
-                       if ( options.selectionStart !== undefined ) {
-                               $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
-                       }
-                       
-                       var selText = $(this).textSelection( 'getSelection' );
-                       var startPos = this.selectionStart;
-                       var endPos = this.selectionEnd;
-                       var scrollTop = this.scrollTop;
-                       checkSelectedText();
-                       if ( options.selectionStart !== undefined
-                                       && endPos - startPos != options.selectionEnd - options.selectionStart )
-                       {
-                               // This means there is a difference in the selection range returned by browser and what we passed.
-                               // This happens for Chrome in the case of composite characters. Ref bug #30130
-                               // Set the startPos to the correct position.
-                               startPos = options.selectionStart;
-                       }
+                                               selText = $(this).textSelection( 'getSelection' );
+                                               scrollTop = this.scrollTop;
+                                               var range = document.selection.createRange();
 
-                       var insertText = pre + selText + post;
-                       if ( options.splitlines ) {
-                               insertText = doSplitLines( selText, pre, post );
-                       }
-                       if ( options.ownline ) {
-                               if ( startPos != 0 && this.value.charAt( startPos - 1 ) != "\n" && this.value.charAt( startPos - 1 ) != "\r" ) {
-                                       insertText = "\n" + insertText;
-                                       pre += "\n";
-                               }
-                               if ( this.value.charAt( endPos ) != "\n" && this.value.charAt( endPos ) != "\r" ) {
-                                       insertText += "\n";
-                                       post += "\n";
-                               }
-                       }
-                       this.value = this.value.substring( 0, startPos ) + insertText +
-                               this.value.substring( endPos, this.value.length );
-                       // Setting this.value scrolls the textarea to the top, restore the scroll position
-                       this.scrollTop = scrollTop;
-                       if ( window.opera ) {
-                               pre = pre.replace( /\r?\n/g, "\r\n" );
-                               selText = selText.replace( /\r?\n/g, "\r\n" );
-                               post = post.replace( /\r?\n/g, "\r\n" );
-                       }
-                       if ( isSample && options.selectPeri && !options.splitlines ) {
-                               this.selectionStart = startPos + pre.length;
-                               this.selectionEnd = startPos + pre.length + selText.length;
-                       } else {
-                               this.selectionStart = startPos + insertText.length;
-                               this.selectionEnd = this.selectionStart;
-                       }
-               }
-               $(this).trigger( 'encapsulateSelection', [ options.pre, options.peri, options.post, options.ownline,
-                       options.replace, options.spitlines ] );
-       });
-},
-/**
- * Ported from Wikia's LinkSuggest extension
- * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
- * Some code copied from
- * http://www.dedestruct.com/2008/03/22/howto-cross-browser-cursor-position-in-textareas/
- *
- * Get the position (in resolution of bytes not nessecarily characters)
- * in a textarea
- *
- * Will focus the textarea in some browsers (IE/Opera)
- *
- * @fixme document the options parameters
- */
- getCaretPosition: function( options ) {
-       function getCaret( e ) {
-               var caretPos = 0, endPos = 0;
-               if ( document.selection && document.selection.createRange ) {
-                       // IE doesn't properly report non-selected caret position through
-                       // the selection ranges when textarea isn't focused. This can
-                       // lead to saving a bogus empty selection, which then screws up
-                       // whatever we do later (bug 31847).
-                       activateElementOnIE( e );
+                                               checkSelectedText();
+                                               insertText = pre + selText + post;
+                                               if ( options.splitlines ) {
+                                                       insertText = doSplitLines( selText, pre, post );
+                                               }
+                                               if ( options.ownline && range.moveStart ) {
+                                                       var range2 = document.selection.createRange();
+                                                       range2.collapse();
+                                                       range2.moveStart( 'character', -1 );
+                                                       // FIXME: Which check is correct?
+                                                       if ( range2.text !== "\r" && range2.text !== "\n" && range2.text !== "" ) {
+                                                               insertText = "\n" + insertText;
+                                                               pre += "\n";
+                                                       }
+                                                       var range3 = document.selection.createRange();
+                                                       range3.collapse( false );
+                                                       range3.moveEnd( 'character', 1 );
+                                                       if ( range3.text !== "\r" && range3.text !== "\n" && range3.text !== "" ) {
+                                                               insertText += "\n";
+                                                               post += "\n";
+                                                       }
+                                               }
 
-                       // IE Support
-                       var preFinished = false;
-                       var periFinished = false;
-                       var postFinished = false;
-                       var preText, rawPreText, periText;
-                       var rawPeriText, postText, rawPostText;
-                       // Create range containing text in the selection
-                       var periRange = document.selection.createRange().duplicate();
-                       // Create range containing text before the selection
-                       var preRange = rangeForElementIE( e );
-                       // Move the end where we need it
-                       preRange.setEndPoint("EndToStart", periRange);
-                       // Create range containing text after the selection
-                       var postRange = rangeForElementIE( e );
-                       // Move the start where we need it
-                       postRange.setEndPoint("StartToEnd", periRange);
-                       // Load the text values we need to compare
-                       preText = rawPreText = preRange.text;
-                       periText = rawPeriText = periRange.text;
-                       postText = rawPostText = postRange.text;
-                       /*
-                        * Check each range for trimmed newlines by shrinking the range by 1
-                        * character and seeing if the text property has changed. If it has
-                        * not changed then we know that IE has trimmed a \r\n from the end.
-                        */
-                       do {
-                               if ( !preFinished ) {
-                                       if ( preRange.compareEndPoints( "StartToEnd", preRange ) == 0 ) {
-                                               preFinished = true;
-                                       } else {
-                                               preRange.moveEnd( "character", -1 );
-                                               if ( preRange.text == preText ) {
-                                                       rawPreText += "\r\n";
+                                               range.text = insertText;
+                                               if ( isSample && options.selectPeri && range.moveStart ) {
+                                                       range.moveStart( 'character', - post.length - selText.length );
+                                                       range.moveEnd( 'character', - post.length );
+                                               }
+                                               range.select();
+                                               // Restore the scroll position
+                                               this.scrollTop = scrollTop;
+                                       } else if ( this.selectionStart || this.selectionStart === 0 ) {
+                                               // Mozilla/Opera
+
+                                               $(this).focus();
+                                               if ( options.selectionStart !== undefined ) {
+                                                       $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                               }
+
+                                               selText = $(this).textSelection( 'getSelection' );
+                                               var startPos = this.selectionStart;
+                                               var endPos = this.selectionEnd;
+                                               scrollTop = this.scrollTop;
+                                               checkSelectedText();
+                                               if ( options.selectionStart !== undefined
+                                                               && endPos - startPos !== options.selectionEnd - options.selectionStart )
+                                               {
+                                                       // This means there is a difference in the selection range returned by browser and what we passed.
+                                                       // This happens for Chrome in the case of composite characters. Ref bug #30130
+                                                       // Set the startPos to the correct position.
+                                                       startPos = options.selectionStart;
+                                               }
+
+                                               insertText = pre + selText + post;
+                                               if ( options.splitlines ) {
+                                                       insertText = doSplitLines( selText, pre, post );
+                                               }
+                                               if ( options.ownline ) {
+                                                       if ( startPos !== 0 && this.value.charAt( startPos - 1 ) !== "\n" && this.value.charAt( startPos - 1 ) !== "\r" ) {
+                                                               insertText = "\n" + insertText;
+                                                               pre += "\n";
+                                                       }
+                                                       if ( this.value.charAt( endPos ) !== "\n" && this.value.charAt( endPos ) !== "\r" ) {
+                                                               insertText += "\n";
+                                                               post += "\n";
+                                                       }
+                                               }
+                                               this.value = this.value.substring( 0, startPos ) + insertText +
+                                                       this.value.substring( endPos, this.value.length );
+                                               // Setting this.value scrolls the textarea to the top, restore the scroll position
+                                               this.scrollTop = scrollTop;
+                                               if ( window.opera ) {
+                                                       pre = pre.replace( /\r?\n/g, "\r\n" );
+                                                       selText = selText.replace( /\r?\n/g, "\r\n" );
+                                                       post = post.replace( /\r?\n/g, "\r\n" );
+                                               }
+                                               if ( isSample && options.selectPeri && !options.splitlines ) {
+                                                       this.selectionStart = startPos + pre.length;
+                                                       this.selectionEnd = startPos + pre.length + selText.length;
                                                } else {
-                                                       preFinished = true;
+                                                       this.selectionStart = startPos + insertText.length;
+                                                       this.selectionEnd = this.selectionStart;
                                                }
                                        }
+                                       $(this).trigger( 'encapsulateSelection', [ options.pre, options.peri, options.post, options.ownline,
+                                               options.replace, options.spitlines ] );
+                               });
+                       },
+                       /**
+                        * Ported from Wikia's LinkSuggest extension
+                        * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
+                        * Some code copied from
+                        * http://www.dedestruct.com/2008/03/22/howto-cross-browser-cursor-position-in-textareas/
+                        *
+                        * Get the position (in resolution of bytes not nessecarily characters)
+                        * in a textarea
+                        *
+                        * Will focus the textarea in some browsers (IE/Opera)
+                        *
+                        * @fixme document the options parameters
+                        */
+                        getCaretPosition: function ( options ) {
+                               function getCaret( e ) {
+                                       var caretPos = 0, endPos = 0;
+                                       if ( document.selection && document.selection.createRange ) {
+                                               // IE doesn't properly report non-selected caret position through
+                                               // the selection ranges when textarea isn't focused. This can
+                                               // lead to saving a bogus empty selection, which then screws up
+                                               // whatever we do later (bug 31847).
+                                               activateElementOnIE( e );
+
+                                               // IE Support
+                                               var preFinished = false;
+                                               var periFinished = false;
+                                               var postFinished = false;
+                                               var preText, rawPreText, periText;
+                                               var rawPeriText, postText, rawPostText;
+                                               // Create range containing text in the selection
+                                               var periRange = document.selection.createRange().duplicate();
+                                               // Create range containing text before the selection
+                                               var preRange = rangeForElementIE( e );
+                                               // Move the end where we need it
+                                               preRange.setEndPoint( 'EndToStart', periRange );
+                                               // Create range containing text after the selection
+                                               var postRange = rangeForElementIE( e );
+                                               // Move the start where we need it
+                                               postRange.setEndPoint( 'StartToEnd', periRange );
+                                               // Load the text values we need to compare
+                                               preText = rawPreText = preRange.text;
+                                               periText = rawPeriText = periRange.text;
+                                               postText = rawPostText = postRange.text;
+                                               /*
+                                                * Check each range for trimmed newlines by shrinking the range by 1
+                                                * character and seeing if the text property has changed. If it has
+                                                * not changed then we know that IE has trimmed a \r\n from the end.
+                                                */
+                                               do {
+                                                       if ( !preFinished ) {
+                                                               if ( preRange.compareEndPoints( 'StartToEnd', preRange ) === 0 ) {
+                                                                       preFinished = true;
+                                                               } else {
+                                                                       preRange.moveEnd( 'character', -1 );
+                                                                       if ( preRange.text === preText ) {
+                                                                               rawPreText += "\r\n";
+                                                                       } else {
+                                                                               preFinished = true;
+                                                                       }
+                                                               }
+                                                       }
+                                                       if ( !periFinished ) {
+                                                               if ( periRange.compareEndPoints( 'StartToEnd', periRange ) === 0 ) {
+                                                                       periFinished = true;
+                                                               } else {
+                                                                       periRange.moveEnd( 'character', -1 );
+                                                                       if ( periRange.text === periText ) {
+                                                                               rawPeriText += "\r\n";
+                                                                       } else {
+                                                                               periFinished = true;
+                                                                       }
+                                                               }
+                                                       }
+                                                       if ( !postFinished ) {
+                                                               if ( postRange.compareEndPoints( 'StartToEnd', postRange ) === 0 ) {
+                                                                       postFinished = true;
+                                                               } else {
+                                                                       postRange.moveEnd( 'character', -1 );
+                                                                       if ( postRange.text === postText ) {
+                                                                               rawPostText += "\r\n";
+                                                                       } else {
+                                                                               postFinished = true;
+                                                                       }
+                                                               }
+                                                       }
+                                               } while ( ( !preFinished || !periFinished || !postFinished ) );
+                                               caretPos = rawPreText.replace( /\r\n/g, "\n" ).length;
+                                               endPos = caretPos + rawPeriText.replace( /\r\n/g, "\n" ).length;
+                                       } else if ( e.selectionStart || e.selectionStart === 0 ) {
+                                               // Firefox support
+                                               caretPos = e.selectionStart;
+                                               endPos = e.selectionEnd;
+                                       }
+                                       return options.startAndEnd ? [ caretPos, endPos ] : caretPos;
                                }
-                               if ( !periFinished ) {
-                                       if ( periRange.compareEndPoints( "StartToEnd", periRange ) == 0 ) {
-                                               periFinished = true;
-                                       } else {
-                                               periRange.moveEnd( "character", -1 );
-                                               if ( periRange.text == periText ) {
-                                                       rawPeriText += "\r\n";
+                               return getCaret( this.get( 0 ) );
+                       },
+                       /**
+                        * @fixme document the options parameters
+                        */
+                       setSelection: function ( options ) {
+                               return this.each( function () {
+                                       if ( $(this).is( ':hidden' ) ) {
+                                               // Do nothing
+                                       } else if ( this.selectionStart || this.selectionStart === 0 ) {
+                                               // Opera 9.0 doesn't allow setting selectionStart past
+                                               // selectionEnd; any attempts to do that will be ignored
+                                               // Make sure to set them in the right order
+                                               if ( options.start > this.selectionEnd ) {
+                                                       this.selectionEnd = options.end;
+                                                       this.selectionStart = options.start;
                                                } else {
-                                                       periFinished = true;
+                                                       this.selectionStart = options.start;
+                                                       this.selectionEnd = options.end;
+                                               }
+                                       } else if ( document.body.createTextRange ) {
+                                               var selection = rangeForElementIE( this );
+                                               var length = this.value.length;
+                                               // IE doesn't count \n when computing the offset, so we won't either
+                                               var newLines = this.value.match( /\n/g );
+                                               if ( newLines ) {
+                                                       length = length - newLines.length;
                                                }
+                                               selection.moveStart( 'character', options.start );
+                                               selection.moveEnd( 'character', -length + options.end );
+
+                                               // This line can cause an error under certain circumstances (textarea empty, no selection)
+                                               // Silence that error
+                                               try {
+                                                       selection.select();
+                                               } catch( e ) { }
                                        }
+                               });
+                       },
+                       /**
+                        * Ported from Wikia's LinkSuggest extension
+                        * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
+                        *
+                        * Scroll a textarea to the current cursor position. You can set the cursor
+                        * position with setSelection()
+                        * @param options boolean Whether to force a scroll even if the caret position
+                        *  is already visible. Defaults to false
+                        *
+                        * @fixme document the options parameters (function body suggests options.force is a boolean, not options itself)
+                        */
+                       scrollToCaretPosition: function ( options ) {
+                               function getLineLength( e ) {
+                                       return Math.floor( e.scrollWidth / ( $.client.profile().platform === 'linux' ? 7 : 8 ) );
                                }
-                               if ( !postFinished ) {
-                                       if ( postRange.compareEndPoints("StartToEnd", postRange) == 0 ) {
-                                               postFinished = true;
-                                       } else {
-                                               postRange.moveEnd( "character", -1 );
-                                               if ( postRange.text == postText ) {
-                                                       rawPostText += "\r\n";
-                                               } else {
-                                                       postFinished = true;
+                               function getCaretScrollPosition( e ) {
+                                       var i, j;
+                                       // FIXME: This functions sucks and is off by a few lines most
+                                       // of the time. It should be replaced by something decent.
+                                       var text = e.value.replace( /\r/g, '' );
+                                       var caret = $( e ).textSelection( 'getCaretPosition' );
+                                       var lineLength = getLineLength( e );
+                                       var row = 0;
+                                       var charInLine = 0;
+                                       var lastSpaceInLine = 0;
+                                       for ( i = 0; i < caret; i++ ) {
+                                               charInLine++;
+                                               if ( text.charAt( i ) === ' ' ) {
+                                                       lastSpaceInLine = charInLine;
+                                               } else if ( text.charAt( i ) === "\n" ) {
+                                                       lastSpaceInLine = 0;
+                                                       charInLine = 0;
+                                                       row++;
+                                               }
+                                               if ( charInLine > lineLength ) {
+                                                       if ( lastSpaceInLine > 0 ) {
+                                                               charInLine = charInLine - lastSpaceInLine;
+                                                               lastSpaceInLine = 0;
+                                                               row++;
+                                                       }
                                                }
                                        }
+                                       var nextSpace = 0;
+                                       for ( j = caret; j < caret + lineLength; j++ ) {
+                                               if (
+                                                       text.charAt( j ) === ' ' ||
+                                                       text.charAt( j ) === "\n" ||
+                                                       caret === text.length
+                                               ) {
+                                                       nextSpace = j;
+                                                       break;
+                                               }
+                                       }
+                                       if ( nextSpace > lineLength && caret <= lineLength ) {
+                                               charInLine = caret - lastSpaceInLine;
+                                               row++;
+                                       }
+                                       return ( $.client.profile().platform === 'mac' ? 13 : ( $.client.profile().platform === 'linux' ? 15 : 16 ) ) * row;
                                }
-                       } while ( ( !preFinished || !periFinished || !postFinished ) );
-                       caretPos = rawPreText.replace( /\r\n/g, "\n" ).length;
-                       endPos = caretPos + rawPeriText.replace( /\r\n/g, "\n" ).length;
-               } else if ( e.selectionStart || e.selectionStart == '0' ) {
-                       // Firefox support
-                       caretPos = e.selectionStart;
-                       endPos = e.selectionEnd;
-               }
-               return options.startAndEnd ? [ caretPos, endPos ] : caretPos;
-       }
-       return getCaret( this.get( 0 ) );
-},
-/**
- * @fixme document the options parameters
- */
-setSelection: function( options ) {
-       return this.each( function() {
-               if ( $(this).is( ':hidden' ) ) {
-                       // Do nothing
-               } else if ( this.selectionStart || this.selectionStart == '0' ) {
-                       // Opera 9.0 doesn't allow setting selectionStart past
-                       // selectionEnd; any attempts to do that will be ignored
-                       // Make sure to set them in the right order
-                       if ( options.start > this.selectionEnd ) {
-                               this.selectionEnd = options.end;
-                               this.selectionStart = options.start;
-                       } else {
-                               this.selectionStart = options.start;
-                               this.selectionEnd = options.end;
+                               return this.each(function () {
+                                       if ( $(this).is( ':hidden' ) ) {
+                                               // Do nothing
+                                       } else if ( this.selectionStart || this.selectionStart === 0 ) {
+                                               // Mozilla
+                                               var scroll = getCaretScrollPosition( this );
+                                               if ( options.force || scroll < $(this).scrollTop() ||
+                                                               scroll > $(this).scrollTop() + $(this).height() ) {
+                                                       $(this).scrollTop( scroll );
+                                               }
+                                       } else if ( document.selection && document.selection.createRange ) {
+                                               // IE / Opera
+                                               /*
+                                                * IE automatically scrolls the selected text to the
+                                                * bottom of the textarea at range.select() time, except
+                                                * if it was already in view and the cursor position
+                                                * wasn't changed, in which case it does nothing. To
+                                                * cover that case, we'll force it to act by moving one
+                                                * character back and forth.
+                                                */
+                                               var range = document.body.createTextRange();
+                                               var savedRange = document.selection.createRange();
+                                               var pos = $(this).textSelection( 'getCaretPosition' );
+                                               var oldScrollTop = this.scrollTop;
+                                               range.moveToElementText( this );
+                                               range.collapse();
+                                               range.move( 'character', pos + 1);
+                                               range.select();
+                                               if ( this.scrollTop !== oldScrollTop ) {
+                                                       this.scrollTop += range.offsetTop;
+                                               } else if ( options.force ) {
+                                                       range.move( 'character', -1 );
+                                                       range.select();
+                                               }
+                                               savedRange.select();
+                                       }
+                                       $(this).trigger( 'scrollToPosition' );
+                               } );
                        }
-               } else if ( document.body.createTextRange ) {
-                       var selection = rangeForElementIE( this );
-                       var length = this.value.length;
-                       // IE doesn't count \n when computing the offset, so we won't either
-                       var newLines = this.value.match( /\n/g );
-                       if ( newLines ) length = length - newLines.length;
-                       selection.moveStart( 'character', options.start );
-                       selection.moveEnd( 'character', -length + options.end );
+               };
 
-                       // This line can cause an error under certain circumstances (textarea empty, no selection)
-                       // Silence that error
-                       try {
-                               selection.select();
-                       } catch( e ) { }
-               }
-       });
-},
-/**
- * Ported from Wikia's LinkSuggest extension
- * https://svn.wikia-code.com/wikia/trunk/extensions/wikia/LinkSuggest
- *
- * Scroll a textarea to the current cursor position. You can set the cursor
- * position with setSelection()
- * @param options boolean Whether to force a scroll even if the caret position
- *  is already visible. Defaults to false
- *
- * @fixme document the options parameters (function body suggests options.force is a boolean, not options itself)
- */
-scrollToCaretPosition: function( options ) {
-       function getLineLength( e ) {
-               return Math.floor( e.scrollWidth / ( $.client.profile().platform == 'linux' ? 7 : 8 ) );
-       }
-       function getCaretScrollPosition( e ) {
-               // FIXME: This functions sucks and is off by a few lines most
-               // of the time. It should be replaced by something decent.
-               var text = e.value.replace( /\r/g, "" );
-               var caret = $( e ).textSelection( 'getCaretPosition' );
-               var lineLength = getLineLength( e );
-               var row = 0;
-               var charInLine = 0;
-               var lastSpaceInLine = 0;
-               for ( i = 0; i < caret; i++ ) {
-                       charInLine++;
-                       if ( text.charAt( i ) == " " ) {
-                               lastSpaceInLine = charInLine;
-                       } else if ( text.charAt( i ) == "\n" ) {
-                               lastSpaceInLine = 0;
-                               charInLine = 0;
-                               row++;
-                       }
-                       if ( charInLine > lineLength ) {
-                               if ( lastSpaceInLine > 0 ) {
-                                       charInLine = charInLine - lastSpaceInLine;
-                                       lastSpaceInLine = 0;
-                                       row++;
+               // Apply defaults
+               switch ( command ) {
+                       //case 'getContents': // no params
+                       //case 'setContents': // no params with defaults
+                       //case 'getSelection': // no params
+                       case 'encapsulateSelection':
+                               options = $.extend( {
+                                       pre: '', // Text to insert before the cursor/selection
+                                       peri: '', // Text to insert between pre and post and select afterwards
+                                       post: '', // Text to insert after the cursor/selection
+                                       ownline: false, // Put the inserted text on a line of its own
+                                       replace: false, // If there is a selection, replace it with peri instead of leaving it alone
+                                       selectPeri: true, // Select the peri text if it was inserted (but not if there was a selection and replace==false, or if splitlines==true)
+                                       splitlines: false, // If multiple lines are selected, encapsulate each line individually
+                                       selectionStart: undefined, // Position to start selection at
+                                       selectionEnd: undefined // Position to end selection at. Defaults to start
+                               }, options );
+                               break;
+                       case 'getCaretPosition':
+                               options = $.extend( {
+                                       // Return [start, end] instead of just start
+                                       startAndEnd: false
+                               }, options );
+                               // FIXME: We may not need character position-based functions if we insert markers in the right places
+                               break;
+                       case 'setSelection':
+                               options = $.extend( {
+                                       // Position to start selection at
+                                       start: undefined,
+                                       // Position to end selection at. Defaults to start
+                                       end: undefined,
+                                       // Element to start selection in (iframe only)
+                                       startContainer: undefined,
+                                       // Element to end selection in (iframe only). Defaults to startContainer
+                                       endContainer: undefined
+                               }, options );
+
+                               if ( options.end === undefined ) {
+                                       options.end = options.start;
                                }
-                       }
-               }
-               var nextSpace = 0;
-               for ( j = caret; j < caret + lineLength; j++ ) {
-                       if (
-                               text.charAt( j ) == " " ||
-                               text.charAt( j ) == "\n" ||
-                               caret == text.length
-                       ) {
-                               nextSpace = j;
+                               if ( options.endContainer === undefined ) {
+                                       options.endContainer = options.startContainer;
+                               }
+                               // FIXME: We may not need character position-based functions if we insert markers in the right places
+                               break;
+                       case 'scrollToCaretPosition':
+                               options = $.extend( {
+                                       force: false // Force a scroll even if the caret position is already visible
+                               }, options );
                                break;
-                       }
                }
-               if ( nextSpace > lineLength && caret <= lineLength ) {
-                       charInLine = caret - lastSpaceInLine;
-                       row++;
+
+               var context = $(this).data( 'wikiEditor-context' );
+               var hasIframe = typeof context !== 'undefined' && context && typeof context.$iframe !== 'undefined';
+
+               // IE selection restore voodoo
+               var needSave = false;
+               if ( hasIframe && context.savedSelection !== null ) {
+                       context.fn.restoreSelection();
+                       needSave = true;
                }
-               return ( $.client.profile().platform == 'mac' ? 13 : ( $.client.profile().platform == 'linux' ? 15 : 16 ) ) * row;
-       }
-       return this.each(function() {
-               if ( $(this).is( ':hidden' ) ) {
-                       // Do nothing
-               } else if ( this.selectionStart || this.selectionStart == '0' ) {
-                       // Mozilla
-                       var scroll = getCaretScrollPosition( this );
-                       if ( options.force || scroll < $(this).scrollTop() ||
-                                       scroll > $(this).scrollTop() + $(this).height() )
-                               $(this).scrollTop( scroll );
-               } else if ( document.selection && document.selection.createRange ) {
-                       // IE / Opera
-                       /*
-                        * IE automatically scrolls the selected text to the
-                        * bottom of the textarea at range.select() time, except
-                        * if it was already in view and the cursor position
-                        * wasn't changed, in which case it does nothing. To
-                        * cover that case, we'll force it to act by moving one
-                        * character back and forth.
-                        */
-                       var range = document.body.createTextRange();
-                       var savedRange = document.selection.createRange();
-                       var pos = $(this).textSelection( 'getCaretPosition' );
-                       var oldScrollTop = this.scrollTop;
-                       range.moveToElementText( this );
-                       range.collapse();
-                       range.move( 'character', pos + 1);
-                       range.select();
-                       if ( this.scrollTop != oldScrollTop )
-                               this.scrollTop += range.offsetTop;
-                       else if ( options.force ) {
-                               range.move( 'character', -1 );
-                               range.select();
-                       }
-                       savedRange.select();
+               var retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
+               if ( hasIframe && needSave ) {
+                       context.fn.saveSelection();
                }
-               $(this).trigger( 'scrollToPosition' );
-       } );
-}
-};
-       // Apply defaults
-       switch ( command ) {
-               //case 'getContents': // no params
-               //case 'setContents': // no params with defaults
-               //case 'getSelection': // no params
-               case 'encapsulateSelection':
-                       options = $.extend( {
-                               'pre': '', // Text to insert before the cursor/selection
-                               'peri': '', // Text to insert between pre and post and select afterwards
-                               'post': '', // Text to insert after the cursor/selection
-                               'ownline': false, // Put the inserted text on a line of its own
-                               'replace': false, // If there is a selection, replace it with peri instead of leaving it alone
-                               'selectPeri': true, // Select the peri text if it was inserted (but not if there was a selection and replace==false, or if splitlines==true)
-                               'splitlines': false, // If multiple lines are selected, encapsulate each line individually
-                               'selectionStart': undefined, // Position to start selection at
-                               'selectionEnd': undefined // Position to end selection at. Defaults to start
-                       }, options );
-                       break;
-               case 'getCaretPosition':
-                       options = $.extend( {
-                               'startAndEnd': false // Return [start, end] instead of just start
-                       }, options );
-                       // FIXME: We may not need character position-based functions if we insert markers in the right places
-                       break;
-               case 'setSelection':
-                       options = $.extend( {
-                               'start': undefined, // Position to start selection at
-                               'end': undefined, // Position to end selection at. Defaults to start
-                               'startContainer': undefined, // Element to start selection in (iframe only)
-                               'endContainer': undefined // Element to end selection in (iframe only). Defaults to startContainer
-                       }, options );
-                       if ( options.end === undefined )
-                               options.end = options.start;
-                       if ( options.endContainer == undefined )
-                               options.endContainer = options.startContainer;
-                       // FIXME: We may not need character position-based functions if we insert markers in the right places
-                       break;
-               case 'scrollToCaretPosition':
-                       options = $.extend( {
-                               'force': false // Force a scroll even if the caret position is already visible
-                       }, options );
-                       break;
-       }
-       var context = $(this).data( 'wikiEditor-context' );
-       var hasIframe = typeof context !== 'undefined' && context && typeof context.$iframe !== 'undefined';
 
-       // IE selection restore voodoo
-       var needSave = false;
-       if ( hasIframe && context.savedSelection !== null ) {
-               context.fn.restoreSelection();
-               needSave = true;
-       }
-       var retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
-       if ( hasIframe && needSave ) {
-               context.fn.saveSelection();
-       }
-       return retval;
-};
-} )( jQuery );
+               return retval;
+       };
+
+}( jQuery ) );
index e685ca9..1c51c97 100644 (file)
@@ -1,42 +1,74 @@
-( function ( $, mw ) {
-       var isReady, toolbar, currentFocused;
+( function ( mw, $ ) {
+       var isReady, toolbar, currentFocused, queue, $toolbar, slice;
 
        isReady = false;
+       queue = [];
+       $toolbar = false;
+       slice = Array.prototype.slice;
+
+       /**
+        * Internal helper that does the actual insertion
+        * of the button into the toolbar.
+        * See mw.toolbar.addButton for parameter documentation.
+        */
+       function insertButton( b /* imageFile */, speedTip, tagOpen, tagClose, sampleText, imageId, selectText ) {
+               // Backwards compatibility
+               if ( typeof b !== 'object' ) {
+                       b = {
+                               imageFile: b,
+                               speedTip: speedTip,
+                               tagOpen: tagOpen,
+                               tagClose: tagClose,
+                               sampleText: sampleText,
+                               imageId: imageId,
+                               selectText: selectText
+                       };
+               }
+               var $image = $( '<img>', {
+                       width : 23,
+                       height: 22,
+                       src   : b.imageFile,
+                       alt   : b.speedTip,
+                       title : b.speedTip,
+                       id    : b.imageId || undefined,
+                       'class': 'mw-toolbar-editbutton'
+               } ).click( function () {
+                       toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText, b.selectText );
+                       return false;
+               } );
+
+               $toolbar.append( $image );
+               return true;
+       }
 
        toolbar = {
-               $toolbar: false,
-               buttons: [],
                /**
-                * If you want to add buttons, use
-                * mw.toolbar.addButton( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId, selectText );
+                * Add buttons to the toolbar.
+                * Takes care of race conditions and time-based dependencies
+                * by placing buttons in a queue if this method is called before
+                * the toolbar is created.
+                * @param {Object} button: Object with the following properties:
+                * - imageFile
+                * - speedTip
+                * - tagOpen
+                * - tagClose
+                * - sampleText
+                * - imageId
+                * - selectText
+                * For compatiblity, passing the above as separate arguments
+                * (in the listed order) is also supported.
                 */
                addButton: function () {
                        if ( isReady ) {
-                               toolbar.insertButton.apply( toolbar, arguments );
+                               insertButton.apply( toolbar, arguments );
                        } else {
-                               toolbar.buttons.push( [].slice.call( arguments ) );
-                       }       
-               },
-               insertButton: function ( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId, selectText ) {
-                       var image = $('<img>', {
-                               width : 23,
-                               height: 22,
-                               src   : imageFile,
-                               alt   : speedTip,
-                               title : speedTip,
-                               id    : imageId || '',
-                               'class': 'mw-toolbar-editbutton'
-                       } ).click( function () {
-                               mw.toolbar.insertTags( tagOpen, tagClose, sampleText, selectText );
-                               return false;
-                       } );
-
-                       toolbar.$toolbar.append( image );
-                       return true;
+                               // Convert arguments list to array
+                               queue.push( slice.call( arguments ) );
+                       }
                },
 
                /**
-                * apply tagOpen/tagClose to selection in textarea,
+                * Apply tagOpen/tagClose to selection in textarea,
                 * use sampleText instead of selection if there is none.
                 */
                insertTags: function ( tagOpen, tagClose, sampleText, selectText ) {
@@ -51,7 +83,8 @@
                        }
                },
 
-               // For backwards compatibility
+               // For backwards compatibility,
+               // Called from EditPage.php, maybe in other places as well.
                init: function () {}
        };
 
        window.addButton = toolbar.addButton;
        window.insertTags = toolbar.insertTags;
 
-       // Explose publicly
+       // Explose API publicly
        mw.toolbar = toolbar;
 
        $( document ).ready( function () {
-               var buttons, i, c, iframe;
+               var buttons, i, b, $iframe;
 
                // currentFocus is used to determine where to insert tags
                currentFocused = $( '#wpTextbox1' );
 
-               // Populate the selector cache for $toolbar 
-               toolbar.$toolbar = $( '#toolbar' );
+               // Populate the selector cache for $toolbar
+               $toolbar = $( '#toolbar' );
 
                // Legacy: Merge buttons from mwCustomEditButtons
-               buttons = [].concat( toolbar.buttons, window.mwCustomEditButtons );
+               buttons = [].concat( queue, window.mwCustomEditButtons );
+               // Clear queue
+               queue.length = 0;
                for ( i = 0; i < buttons.length; i++ ) {
-                       if ( $.isArray( buttons[i] ) ) {
-                               // Passes our button array as arguments
-                               toolbar.insertButton.apply( toolbar, buttons[i] );
+                       b = buttons[i];
+                       if ( $.isArray( b ) ) {
+                               // Forwarded arguments array from mw.toolbar.addButton
+                               insertButton.apply( toolbar, b );
                        } else {
-                               // Legacy mwCustomEditButtons is an object
-                               c = buttons[i];
-                               toolbar.insertButton( c.imageFile, c.speedTip, c.tagOpen, 
-                                       c.tagClose, c.sampleText, c.imageId, c.selectText );
+                               // Raw object from legacy mwCustomEditButtons
+                               insertButton( b );
                        }
                }
 
                isReady = true;
 
                // Make sure edit summary does not exceed byte limit
-               $( '#wpSummary' ).byteLimit( 250 );
+               $( '#wpSummary' ).byteLimit( 255 );
 
                /**
                 * Restore the edit box scroll state following a preview operation,
 
                // HACK: make currentFocused work with the usability iframe
                // With proper focus detection support (HTML 5!) this'll be much cleaner
-               iframe = $( '.wikiEditor-ui-text iframe' );
-               if ( iframe.length > 0 ) {
-                       $( iframe.get( 0 ).contentWindow.document )
+               // TODO: Get rid of this WikiEditor code from MediaWiki core!
+               $iframe = $( '.wikiEditor-ui-text iframe' );
+               if ( $iframe.length > 0 ) {
+                       $( $iframe.get( 0 ).contentWindow.document )
                                // for IE
-                               .add( iframe.get( 0 ).contentWindow.document.body )
+                               .add( $iframe.get( 0 ).contentWindow.document.body )
                                .focus( function () {
-                                       currentFocused = iframe;
+                                       currentFocused = $iframe;
                                } );
                }
        });
 
-}( jQuery, mediaWiki ) );
+}( mediaWiki, jQuery ) );
index 76b0e6c..55f799e 100644 (file)
@@ -30,20 +30,20 @@ jQuery( document ).ready( function ( $ ) {
                                return true;
                        }
 
-                       if ( $oldidRadio.prop( 'checked' ) ) { 
+                       if ( $oldidRadio.prop( 'checked' ) ) {
                                oldLi = true;
                                $li.addClass( 'selected' );
                                $oldidRadio.css( 'visibility', 'visible' );
                                $diffRadio.css( 'visibility', 'hidden' );
 
-                       } else if ( $diffRadio.prop( 'checked' ) ) { 
+                       } else if ( $diffRadio.prop( 'checked' ) ) {
                                diffLi = true;
                                $li.addClass( 'selected' );
                                $oldidRadio.css( 'visibility', 'hidden' );
                                $diffRadio.css( 'visibility', 'visible' );
 
                        // This list item has neither checked
-                       } else { 
+                       } else {
                                // We're below the selected radios
                                if ( diffLi && oldLi ) {
                                        $oldidRadio.css( 'visibility', 'visible' );
index b1d906f..7a9ceee 100644 (file)
@@ -1,12 +1,14 @@
 /**
  * This module enables double-click-to-edit functionality
  */
-jQuery( document ).ready( function( $ ) {
-       var url = $( '#ca-edit a' ).attr( 'href' );
-       if ( url ) {
-               mw.util.$content.dblclick( function( e ) {
-                       e.preventDefault();
-                       window.location = url;
-               } );
-       }
-} );
+( function ( mw, $ ) {
+       $( function () {
+               var url = $( '#ca-edit a' ).attr( 'href' );
+               if ( url ) {
+                       mw.util.$content.dblclick( function ( e ) {
+                               e.preventDefault();
+                               window.location = url;
+                       } );
+               }
+       } );
+}( mediaWiki, jQuery ) );
index b791cab..ce3c674 100644 (file)
@@ -1,39 +1,43 @@
-// Exif metadata display for MediaWiki file uploads
-//
-// Add an expand/collapse link and collapse by default if set to
-// (with JS disabled, user will see all items)
-//
+/**
+ * Exif metadata display for MediaWiki file uploads
+ *
+ * Add an expand/collapse link and collapse by default if set to
+ * (with JS disabled, user will see all items)
+ */
+( function ( mw, $ ) {
+       $( function () {
+               var $row, $col, $link,
+                       showText = mw.msg( 'metadata-expand' ),
+                       hideText = mw.msg( 'metadata-collapse' ),
+                       $table = $( '#mw_metadata' ),
+                       $tbody = $table.find( 'tbody' );
 
-jQuery( document ).ready( function( $ ) {
-       var showText = mw.msg( 'metadata-expand' );
-       var hideText = mw.msg( 'metadata-collapse' );
+               if ( !$tbody.length ) {
+                       return;
+               }
 
-       var $table = $( '#mw_metadata' );
-       var $tbody = $table.find( 'tbody' );
-       if ( !$tbody.length ) {
-               return;
-       }
+               $row = $( '<tr class="mw-metadata-show-hide-extended"></tr>' );
+               $col = $( '<td colspan="2"></td>' );
 
-       var $row = $( '<tr class="mw-metadata-show-hide-extended"></tr>' );
-       var $col = $( '<td colspan="2"></td>' );
+               $link = $( '<a>', {
+                       text: showText,
+                       href: '#'
+               }).click(function () {
+                       if ( $table.hasClass( 'collapsed' ) ) {
+                               $( this ).text( hideText );
+                       } else {
+                               $( this ).text( showText );
+                       }
+                       $table.toggleClass( 'expanded collapsed' );
+                       return false;
+               });
 
-       var $link = $( '<a></a>', {
-               'text': showText,
-               'href': '#'
-       }).click(function() {
-               if ( $table.hasClass( 'collapsed' ) ) {
-                       $( this ).text( hideText );
-               } else {
-                       $( this ).text( showText );
-               }
-               $table.toggleClass( 'expanded collapsed' );
-               return false;
-       });
+               $col.append( $link );
+               $row.append( $col );
+               $tbody.append( $row );
 
-       $col.append( $link );
-       $row.append( $col );
-       $tbody.append( $row );
+               // And collapse!
+               $table.addClass( 'collapsed' );
+       } );
 
-       // And collapse!
-       $table.addClass( 'collapsed' );
-} );
+}( mediaWiki, jQuery ) );
\ No newline at end of file
diff --git a/resources/mediawiki.action/mediawiki.action.watch.ajax.js b/resources/mediawiki.action/mediawiki.action.watch.ajax.js
deleted file mode 100644 (file)
index 090e4c3..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * Animate watch/unwatch links to use asynchronous API requests to
- * watch pages, rather than navigating to a different URI.
- */
-( function ( $, mw, undefined ) {
-
-       /**
-        * The name of the page to watch or unwatch.
-        */
-       var title = mw.config.get( 'wgRelevantPageName', mw.config.get( 'wgPageName' ) );
-
-       /**
-        * Update the link text, link href attribute and (if applicable)
-        * "loading" class.
-        *
-        * @param $link {jQuery} Anchor tag of (un)watch link.
-        * @param action {String} One of 'watch', 'unwatch'.
-        * @param state {String} [optional] 'idle' or 'loading'. Default is 'idle'.
-        */
-       function updateWatchLink( $link, action, state ) {
-               var accesskeyTip, msgKey, $li;
-
-               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
-               msgKey = state === 'loading' ? action + 'ing' : action;
-               accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
-               $li = $link.closest( 'li' );
-
-               $link
-                       .text( mw.msg( msgKey ) )
-                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
-                               ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
-                       )
-                       .attr( 'href', mw.util.wikiScript() + '?' + $.param({
-                                       title: title,
-                                       action: action
-                               })
-                       );
-
-               // Special case for vector icon
-               if ( $li.hasClass( 'icon' ) ) {
-                       if ( state === 'loading' ) {
-                               $link.addClass( 'loading' );
-                       } else {
-                               $link.removeClass( 'loading' );
-                       }
-               }
-       }
-
-       /**
-        * @todo This should be moved somewhere more accessible.
-        * @param url {String}
-        * @return {String} The extracted action, defaults to 'view'.
-        */
-       function mwUriGetAction( url ) {
-               var action, actionPaths, key, i, m, parts;
-
-               actionPaths = mw.config.get( 'wgActionPaths' );
-
-               // @todo: Does MediaWiki give action path or query param
-               // precedence ? If the former, move this to the bottom
-               action = mw.util.getParamValue( 'action', url );
-               if ( action !== null ) {
-                       return action;
-               }
-
-               for ( key in actionPaths ) {
-                       if ( actionPaths.hasOwnProperty( key ) ) {
-                               parts = actionPaths[key].split( '$1' );
-                               for ( i = 0; i < parts.length; i += 1 ) {
-                                       parts[i] = $.escapeRE( parts[i] );
-                               }
-                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
-                               if ( m && m[1] ) {
-                                       return key;
-                               }
-
-                       }
-               }
-
-               return 'view';
-       }
-
-       $( document ).ready( function () {
-               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
-                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
-                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
-
-               // Allowing people to add inline animated links is a little scary
-               $links = $links.filter( ':not( #bodyContent *, #content * )' );
-
-               $links.click( function ( e ) {
-                       var action, api, $link;
-
-                       action = mwUriGetAction( this.href );
-
-                       if ( action !== 'watch' && action !== 'unwatch' ) {
-                               // Could not extract target action from link url,
-                               // let native browsing handle it further
-                               return true;
-                       }
-                       e.preventDefault();
-                       e.stopPropagation();
-
-                       $link = $( this );
-
-                       updateWatchLink( $link, action, 'loading' );
-
-                       api = new mw.Api();
-                       api[action](
-                               title,
-                               // Success
-                               function ( watchResponse ) {
-                                       var $li, otherAction;
-
-                                       otherAction = action === 'watch' ? 'unwatch' : 'watch';
-                                       $li = $link.closest( 'li' );
-
-                                       mw.util.jsMessage( watchResponse.message, 'ajaxwatch' );
-
-                                       // Set link to opposite
-                                       updateWatchLink( $link, otherAction );
-
-                                       // Most common ID style
-                                       if ( $li.prop( 'id' ) === 'ca-' + otherAction || $li.prop( 'id' ) === 'ca-' + action ) {
-                                               $li.prop( 'id', 'ca-' + otherAction );
-                                       }
-
-                                       // Bug 12395 - update the watch checkbox on edit pages when the
-                                       // page is watched or unwatched via the tab.
-                                       if ( watchResponse.watched !== undefined ) {
-                                               $( '#wpWatchthis' ).prop( 'checked', true );
-                                       } else {
-                                               $( '#wpWatchthis' ).removeProp( 'checked' );
-                                       }
-                               },
-                               // Error
-                               function () {
-                                       var cleanTitle, html, link;
-
-                                       // Reset link to non-loading mode
-                                       updateWatchLink( $link, action );
-
-                                       // Format error message
-                                       cleanTitle = title.replace( /_/g, ' ' );
-                                       link = mw.html.element(
-                                               'a', {
-                                                       href: mw.util.wikiGetlink( title ),
-                                                       title: cleanTitle
-                                               }, cleanTitle
-                                       );
-                                       html = mw.msg( 'watcherrortext', link );
-
-                                       // Report to user about the error
-                                       mw.util.jsMessage( html, 'ajaxwatch' );
-
-                               }
-                       );
-               });
-       });
-
-}( jQuery, mediaWiki ) );
index a9d488a..5197396 100644 (file)
                 */
                getEditToken: function( tokenCallback, err ) {
                        var parameters = {
-                                       prop: 'info',
-                                       intoken: 'edit',
-                                       // we need some kind of dummy page to get a token from. This will return a response
-                                       // complaining that the page is missing, but we should also get an edit token
-                                       titles: 'DummyPageForEditToken'
+                                       action: 'tokens',
+                                       type: 'edit'
                                },
                                ok = function( data ) {
                                        var token;
-                                       $.each( data.query.pages, function( i, page ) {
-                                               if ( page.edittoken ) {
-                                                       token = page.edittoken;
-                                                       return false;
-                                               }
-                                       } );
-                                       if ( token !== undefined ) {
+                                       // If token type is not available for this user,
+                                       // key 'edittoken' is missing or can contain Boolean false
+                                       if ( data.tokens && data.tokens.edittoken ) {
+                                               token = data.tokens.edittoken;
                                                cachedToken = token;
                                                tokenCallback( token );
                                        } else {
index 74306d5..080725a 100644 (file)
@@ -1,5 +1,6 @@
-/* mw.Api objects represent the API of a particular MediaWiki server. */
-
+/**
+ * mw.Api objects represent the API of a particular MediaWiki server.
+ */
 ( function( $, mw, undefined ) {
 
        /**
                        ajax: {
                                url: mw.util.wikiScript( 'api' ),
 
-                               ok: function() {},
-
-                               // caller can supply handlers for http transport error or api errors
-                               err: function( code, result ) {
-                                       mw.log( 'mw.Api error: ' + code, 'debug' );
-                               },
-
-                               timeout: 30000, // 30 seconds
+                               timeout: 30 * 1000, // 30 seconds
 
                                dataType: 'json'
                        }
        mw.Api.prototype = {
 
                /**
-                * For api queries, in simple cases the caller just passes a success callback.
-                * In complex cases they pass an object with a success property as callback and
-                * probably other options.
-                * Normalize the argument so that it's always the latter case.
+                * Normalize the ajax options for compatibility and/or convenience methods.
                 *
-                * @param {Object|Function} An object contaning one or more of options.ajax,
+                * @param {undefined|Object|Function} An object contaning one or more of options.ajax,
                 * or just a success function (options.ajax.ok).
                 * @return {Object} Normalized ajax options.
                 */
-               normalizeAjaxOptions: function( arg ) {
-                       var opt = arg;
+               normalizeAjaxOptions: function ( arg ) {
+                       // Arg argument is usually empty
+                       // (before MW 1.20 it was often used to pass ok/err callbacks)
+                       var opts = arg || {};
+                       // Options can also be a success callback handler
                        if ( typeof arg === 'function' ) {
-                               opt = { 'ok': arg };
+                               opts = { ok: arg };
                        }
-                       if ( !opt.ok ) {
-                               throw new Error( 'ajax options must include ok callback' );
-                       }
-                       return opt;
+                       return opts;
                },
 
                /**
                 * Perform API get request
                 *
                 * @param {Object} request parameters
-                * @param {Object|Function} ajax options, or just a success function
-                * @return {jqXHR}
+                * @param {Object|Function} [optional] ajax options
+                * @return {jQuery.Promise}
                 */
                get: function( parameters, ajaxOptions ) {
                        ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
                 * @todo Post actions for nonlocal will need proxy
                 *
                 * @param {Object} request parameters
-                * @param {Object|Function} ajax options, or just a success function
-                * @return {jqXHR}
+                * @param {Object|Function} [optional] ajax options
+                * @return {jQuery.Promise}
                 */
                post: function( parameters, ajaxOptions ) {
                        ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
                 *
                 * @param {Object} request parameters
                 * @param {Object} ajax options
-                * @return {jqXHR}
+                * @return {jQuery.Promise}
+                * - done: API response data as first argument
+                * - fail: errorcode as first arg, details (string or object) as second arg.
                 */
                ajax: function( parameters, ajaxOptions ) {
-                       var token;
+                       var token,
+                               apiDeferred = $.Deferred();
+
                        parameters = $.extend( {}, this.defaults.parameters, parameters );
                        ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
 
                        // So let's escape them here. See bug #28235
                        // This works because jQuery accepts data as a query string or as an Object
                        ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
+
                        // If we extracted a token parameter, add it back in.
                        if ( token ) {
                                ajaxOptions.data += '&token=' + encodeURIComponent( token );
                        }
-                       ajaxOptions.error = function( xhr, textStatus, exception ) {
-                               ajaxOptions.err( 'http', {
-                                       xhr: xhr,
-                                       textStatus: textStatus,
-                                       exception: exception
+
+                       // Backwards compatibility: Before MediaWiki 1.20,
+                       // callbacks were done with the 'ok' and 'err' property in ajaxOptions.
+                       if ( ajaxOptions.ok ) {
+                               apiDeferred.done( ajaxOptions.ok );
+                               delete ajaxOptions.ok;
+                       }
+                       if ( ajaxOptions.err ) {
+                               apiDeferred.fail( ajaxOptions.err );
+                               delete ajaxOptions.err;
+                       }
+
+                       // Make the AJAX request
+                       $.ajax( ajaxOptions )
+                               // If AJAX fails, reject API call with error code 'http'
+                               // and details in second argument.
+                               .fail( function ( xhr, textStatus, exception ) {
+                                       apiDeferred.reject( 'http', {
+                                               xhr: xhr,
+                                               textStatus: textStatus,
+                                               exception: exception
+                                       } );
+                               } )
+                               // AJAX success just means "200 OK" response, also check API error codes
+                               .done( function ( result ) {
+                                       if ( result === undefined || result === null || result === '' ) {
+                                               apiDeferred.reject( 'ok-but-empty',
+                                                       'OK response but empty result (check HTTP headers?)'
+                                               );
+                                       } else if ( result.error ) {
+                                               var code = result.error.code === undefined ? 'unknown' : result.error.code;
+                                               apiDeferred.reject( code, result );
+                                       } else {
+                                               apiDeferred.resolve( result );
+                                       }
                                } );
-                       };
-
-                       // Success just means 200 OK; also check for output and API errors
-                       ajaxOptions.success = function( result ) {
-                               if ( result === undefined || result === null || result === '' ) {
-                                       ajaxOptions.err( 'ok-but-empty',
-                                               'OK response but empty result (check HTTP headers?)' );
-                               } else if ( result.error ) {
-                                       var code = result.error.code === undefined ? 'unknown' : result.error.code;
-                                       ajaxOptions.err( code, result );
-                               } else {
-                                       ajaxOptions.ok( result );
-                               }
-                       };
-
-                       return $.ajax( ajaxOptions );
+
+                       // Return the Promise
+                       return apiDeferred.promise().fail( function ( code, details ) {
+                               mw.log( 'mw.Api error: ', code, details );
+                       });
                }
 
        };
                'file-too-large',
                'filetype-missing',
                'filetype-banned',
+               'filetype-banned-type',
                'filename-tooshort',
                'illegal-filename',
                'verification-error',
index 1cc68f2..e784ef7 100644 (file)
@@ -1,31 +1,42 @@
 /**
- * Additional mw.Api methods to assist with API calls related to parsing wikitext.
+ * mw.Api methods for parsing wikitext.
  */
-
-( function( $, mw ) {
+( function ( mw, $ ) {
 
        $.extend( mw.Api.prototype, {
                /**
                 * Convinience method for 'action=parse'. Parses wikitext into HTML.
                 *
                 * @param wikiText {String}
-                * @param success {Function} callback to which to pass success HTML
-                * @param err {Function} callback if error (optional)
-                * @return {jqXHR}
+                * @param ok {Function} [optional] deprecated (success callback)
+                * @param err {Function} [optional] deprecated (error callback)
+                * @return {jQuery.Promise}
                 */
-               parse: function( wikiText, success, err ) {
-                       var params = {
-                                       text: wikiText,
-                                       action: 'parse'
-                               },
-                               ok = function( data ) {
+               parse: function( wikiText, ok, err ) {
+                       var apiDeferred = $.Deferred();
+
+                       // Backwards compatibility (< MW 1.20)
+                       if ( ok ) {
+                               apiDeferred.done( ok );
+                       }
+                       if ( err ) {
+                               apiDeferred.fail( err );
+                       }
+
+                       this.get( {
+                                       action: 'parse',
+                                       text: wikiText
+                               } )
+                               .done( function ( data ) {
                                        if ( data.parse && data.parse.text && data.parse.text['*'] ) {
-                                               success( data.parse.text['*'] );
+                                               apiDeferred.resolve( data.parse.text['*'] );
                                        }
-                               };
-                       return this.get( params, { ok: ok, err: err } );
-               }
+                               } )
+                               .fail( apiDeferred.reject );
 
+                       // Return the promise
+                       return apiDeferred.promise();
+               }
        } );
 
-} )( jQuery, mediaWiki );
+} )( mediaWiki, jQuery );
diff --git a/resources/mediawiki.language/languages/ar.js b/resources/mediawiki.language/languages/ar.js
deleted file mode 100644 (file)
index d21df7e..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Arabic (العربية) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 6 );
-       if ( count == 0 ) {
-               return forms[0];
-       }
-       if ( count == 1 ) {
-               return forms[1];
-       }
-       if ( count == 2 ) {
-               return forms[2];
-       }
-       if ( count % 100 >= 3 && count % 100 <= 10 ) {
-               return forms[3];
-       }
-       if ( count % 100 >= 11 && count % 100 <= 99 ) {
-               return forms[4];
-       }
-       return forms[5];
-};
-
index e737a7c..d35f77e 100644 (file)
@@ -2,17 +2,6 @@
  * Hebrew (עברית) language functions
  */
 
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       if ( count == 2 && forms[2] ) {
-               return forms[2];
-       }
-       return forms[1];
-};
-
 mediaWiki.language.convertGrammar = function( word, form ) {
        var grammarForms = mw.language.getData( 'he', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
diff --git a/resources/mediawiki.language/languages/hi.js b/resources/mediawiki.language/languages/hi.js
deleted file mode 100644 (file)
index a22a0e1..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Hindi (हिन्दी) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( count <= 1 ) ? forms[0] : forms[1];
-};
diff --git a/resources/mediawiki.language/mediawiki.cldr.js b/resources/mediawiki.language/mediawiki.cldr.js
new file mode 100644 (file)
index 0000000..6660eca
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ *  CLDR related utility methods
+ */
+( function( mw ) {
+       "use strict";
+
+       var cldr = {
+               /**
+                * For the number, get the plural for index
+                * In case none of the rules passed, we return pluralRules.length
+                * That means it is the "other" form.
+                * @param number
+                * @param pluralRules
+                * @return plural form index
+                */
+               getPluralForm: function( number, pluralRules ) {
+                       var pluralFormIndex = 0;
+                       for ( pluralFormIndex = 0; pluralFormIndex < pluralRules.length; pluralFormIndex++ ) {
+                               if ( mw.libs.pluralRuleParser( pluralRules[pluralFormIndex], number ) ) {
+                                       break;
+                               }
+                       }
+                       return pluralFormIndex;
+               }
+       };
+
+       mw.cldr = cldr;
+} )( mediaWiki );
index b49823c..8d2ffae 100644 (file)
@@ -2,7 +2,7 @@
  * Base language object with methods for storing and getting
  * language data.
  */
-( function( $, mw ) {
+( function ( mw, $ ) {
 
        var language = {
                /**
@@ -58,4 +58,4 @@
 
        mw.language = language;
 
-} )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
index 78a6309..935d4ff 100644 (file)
@@ -3,7 +3,7 @@
  * Language.php in MediaWiki.
  * This adds methods for transforming message text.
  */
-( function( $, mw ) {
+( function ( mw, $ ) {
 
 var language = {
 
@@ -12,13 +12,13 @@ var language = {
         *
         * @param {object} template Template object
         * @format template
-        *      {
-        *              'title': [title of template],
-        *              'parameters': [template parameters]
-        *      }
+        *  {
+        *      'title': [title of template],
+        *      'parameters': [template parameters]
+        *  }
         * @example {{Template:title|params}}
         */
-       'procPLURAL': function( template ) {
+       procPLURAL: function ( template ) {
                if ( template.title && template.parameters && mw.language.convertPlural ) {
                        // Check if we have forms to replace
                        if ( template.parameters.length === 0 ) {
@@ -35,6 +35,7 @@ var language = {
                }
                return '';
        },
+
        /**
         * Plural form transformations, needed for some languages.
         *
@@ -42,12 +43,21 @@ var language = {
         * @param forms array List of plural forms
         * @return string Correct form for quantifier in this language
         */
-       'convertPlural': function( count, forms ){
+       convertPlural: function( count, forms ) {
+               var pluralFormIndex = 0;
                if ( !forms || forms.length === 0 ) {
                        return '';
                }
-               return ( parseInt( count, 10 ) == 1 ) ? forms[0] : forms[1];
+               var pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
+               if ( !pluralRules ) {
+                       // default fallback.
+                       return ( count === 1 ) ? forms[0] : forms[1];
+               }
+               pluralFormIndex = mw.cldr.getPluralForm( count, pluralRules );
+               pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
+               return forms[pluralFormIndex];
        },
+
        /**
         * Pads an array to a specific length by copying the last one element.
         *
@@ -55,38 +65,41 @@ var language = {
         * @param count integer Number of forms required
         * @return array Padded array of forms
         */
-       'preConvertPlural': function( forms, count ) {
+       preConvertPlural: function ( forms, count ) {
                while ( forms.length < count ) {
                        forms.push( forms[ forms.length-1 ] );
                }
                return forms;
        },
+
        /**
         * Converts a number using digitTransformTable.
         *
         * @param {num} number Value to be converted
         * @param {boolean} integer Convert the return value to an integer
         */
-       'convertNumber': function( num, integer ) {
+       convertNumber: function( num, integer ) {
+               var i, tmp, transformTable;
+
                if ( !mw.language.digitTransformTable ) {
                        return num;
                }
                // Set the target Transform table:
-               var transformTable = mw.language.digitTransformTable;
+               transformTable = mw.language.digitTransformTable;
                // Check if the "restore" to Latin number flag is set:
                if ( integer ) {
-                       if ( parseInt( num, 10 ) == num ) {
+                       if ( parseInt( num, 10 ) === num ) {
                                return num;
                        }
-                       var tmp = [];
-                       for ( var i in transformTable ) {
+                       tmp = [];
+                       for ( i in transformTable ) {
                                tmp[ transformTable[ i ] ] = i;
                        }
                        transformTable = tmp;
                }
-               var numberString =  '' + num;
+               var numberString = '' + num;
                var convertedNumber = '';
-               for ( var i = 0; i < numberString.length; i++ ) {
+               for ( i = 0; i < numberString.length; i++ ) {
                        if ( transformTable[ numberString[i] ] ) {
                                convertedNumber += transformTable[numberString[i]];
                        } else {
@@ -95,6 +108,7 @@ var language = {
                }
                return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
        },
+
        /**
         * Provides an alternative text depending on specified gender.
         * Usage {{gender:[gender|user object]|masculine|feminine|neutral}}.
@@ -107,7 +121,7 @@ var language = {
         *
         * @return string
         */
-       'gender': function( gender, forms ) {
+       gender: function( gender, forms ) {
                if ( !forms || forms.length === 0 ) {
                        return '';
                }
@@ -140,9 +154,9 @@ var language = {
        },
 
        // Digit Transform Table, populated by language classes where applicable
-       'digitTransformTable': mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' )
+       digitTransformTable: mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' )
 };
 
 $.extend( mw.language, language );
 
-} )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.libs/CLDRPluralRuleParser.js b/resources/mediawiki.libs/CLDRPluralRuleParser.js
new file mode 100644 (file)
index 0000000..bb1491d
--- /dev/null
@@ -0,0 +1,306 @@
+/* This is cldrpluralparser 1.0, ported to MediaWiki ResourceLoader */
+
+/**
+* cldrpluralparser.js
+* A parser engine for CLDR plural rules.
+*
+* Copyright 2012 GPLV3+, Santhosh Thottingal
+*
+* @version 0.1.0-alpha
+* @source https://github.com/santhoshtr/CLDRPluralRuleParser
+* @author Santhosh Thottingal <santhosh.thottingal@gmail.com>
+* @author Timo Tijhof
+* @author Amir Aharoni
+*/
+
+/**
+ * Evaluates a plural rule in CLDR syntax for a number
+ * @param rule
+ * @param number
+ * @return true|false|null
+ */
+( function( mw ) {
+
+function pluralRuleParser(rule, number) {
+       /*
+       Syntax: see http://unicode.org/reports/tr35/#Language_Plural_Rules
+       -----------------------------------------------------------------
+
+       condition     = and_condition ('or' and_condition)*
+       and_condition = relation ('and' relation)*
+       relation      = is_relation | in_relation | within_relation | 'n' <EOL>
+       is_relation   = expr 'is' ('not')? value
+       in_relation   = expr ('not')? 'in' range_list
+       within_relation = expr ('not')? 'within' range_list
+       expr          = 'n' ('mod' value)?
+       range_list    = (range | value) (',' range_list)*
+       value         = digit+
+       digit         = 0|1|2|3|4|5|6|7|8|9
+       range         = value'..'value
+
+       */
+       // Indicates current position in the rule as we parse through it.
+       // Shared among all parsing functions below.
+       var pos = 0;
+
+       var whitespace = makeRegexParser(/^\s+/);
+       var digits = makeRegexParser(/^\d+/);
+
+       var _n_ = makeStringParser('n');
+       var _is_ = makeStringParser('is');
+       var _mod_ = makeStringParser('mod');
+       var _not_ = makeStringParser('not');
+       var _in_ = makeStringParser('in');
+       var _within_ = makeStringParser('within');
+       var _range_ = makeStringParser('..');
+       var _comma_ = makeStringParser(',');
+       var _or_ = makeStringParser('or');
+       var _and_ = makeStringParser('and');
+
+       function debug() {
+               /* console.log.apply(console, arguments);*/
+       }
+
+       debug('pluralRuleParser', rule, number);
+
+       // Try parsers until one works, if none work return null
+       function choice(parserSyntax) {
+               return function () {
+                       for (var i = 0; i < parserSyntax.length; i++) {
+                               var result = parserSyntax[i]();
+                               if (result !== null) {
+                                       return result;
+                               }
+                       }
+                       return null;
+               };
+       }
+
+       // Try several parserSyntax-es in a row.
+       // All must succeed; otherwise, return null.
+       // This is the only eager one.
+       function sequence(parserSyntax) {
+               var originalPos = pos;
+               var result = [];
+               for (var i = 0; i < parserSyntax.length; i++) {
+                       var res = parserSyntax[i]();
+                       if (res === null) {
+                               pos = originalPos;
+                               return null;
+                       }
+                       result.push(res);
+               }
+               return result;
+       }
+
+       // Run the same parser over and over until it fails.
+       // Must succeed a minimum of n times; otherwise, return null.
+       function nOrMore(n, p) {
+               return function () {
+                       var originalPos = pos;
+                       var result = [];
+                       var parsed = p();
+                       while (parsed !== null) {
+                               result.push(parsed);
+                               parsed = p();
+                       }
+                       if (result.length < n) {
+                               pos = originalPos;
+                               return null;
+                       }
+                       return result;
+               };
+       }
+
+       // Helpers -- just make parserSyntax out of simpler JS builtin types
+
+       function makeStringParser(s) {
+               var len = s.length;
+               return function () {
+                       var result = null;
+                       if (rule.substr(pos, len) === s) {
+                               result = s;
+                               pos += len;
+                       }
+                       return result;
+               };
+       }
+
+       function makeRegexParser(regex) {
+               return function () {
+                       var matches = rule.substr(pos).match(regex);
+                       if (matches === null) {
+                               return null;
+                       }
+                       pos += matches[0].length;
+                       return matches[0];
+               };
+       }
+
+       function n() {
+               var result = _n_();
+               if (result === null) {
+                       debug(" -- failed n");
+                       return result;
+               }
+               result = parseInt(number, 10);
+               debug(" -- passed n ", result);
+               return result;
+       }
+
+       var expression = choice([mod, n]);
+
+       function mod() {
+               var result = sequence([n, whitespace, _mod_, whitespace, digits]);
+               if (result === null) {
+                       debug(" -- failed mod");
+                       return null;
+               }
+               debug(" -- passed mod");
+               return parseInt(result[0], 10) % parseInt(result[4], 10);
+       }
+
+       function not() {
+               var result = sequence([whitespace, _not_]);
+               if (result === null) {
+                       debug(" -- failed not");
+                       return null;
+               } else {
+                       return result[1];
+               }
+       }
+
+       function is() {
+               var result = sequence([expression, whitespace, _is_, nOrMore(0, not), whitespace, digits]);
+               if (result !== null) {
+                       debug(" -- passed is");
+                       if (result[3][0] === 'not') {
+                               return result[0] !== parseInt(result[5], 10);
+                       } else {
+                               return result[0] === parseInt(result[5], 10);
+                       }
+               }
+               debug(" -- failed is");
+               return null;
+       }
+
+       function rangeList() {
+               // range_list    = (range | value) (',' range_list)*
+               var result = sequence([choice([range, digits]), nOrMore(0, rangeTail)]);
+               var resultList = [];
+               if (result !== null) {
+                       resultList = resultList.concat(result[0], result[1][0]);
+                       return resultList;
+               }
+               debug(" -- failed rangeList");
+               return null;
+       }
+
+       function rangeTail() {
+               // ',' range_list
+               var result = sequence([_comma_, rangeList]);
+               if (result !== null) {
+                       return result[1];
+               }
+               debug(" -- failed rangeTail");
+               return null;
+       }
+
+       function range() {
+               var result = sequence([digits, _range_, digits]);
+               if (result !== null) {
+                       debug(" -- passed range");
+                       var array = [];
+                       var left = parseInt(result[0], 10);
+                       var right = parseInt(result[2], 10);
+                       for ( i = left; i <= right; i++) {
+                               array.push(i);
+                       }
+                       return array;
+               }
+               debug(" -- failed range");
+               return null;
+       }
+
+       function _in() {
+               // in_relation   = expr ('not')? 'in' range_list
+               var result = sequence([expression, nOrMore(0, not), whitespace, _in_, whitespace, rangeList]);
+               if (result !== null) {
+                       debug(" -- passed _in");
+                       var range_list = result[5];
+                       for (var i = 0; i < range_list.length; i++) {
+                               if (parseInt(range_list[i], 10) === result[0]) {
+                                       return (result[1][0] !== 'not');
+                               }
+                       }
+                       return (result[1][0] === 'not');
+               }
+               debug(" -- failed _in ");
+               return null;
+       }
+
+       function within() {
+               var result = sequence([expression, whitespace, _within_, whitespace, rangeList]);
+               if (result !== null) {
+                       debug(" -- passed within ");
+                       var range_list = result[4];
+                       return (parseInt( range_list[0],10 )<= result[0] && result[0] <= parseInt( range_list[1], 10));
+               }
+               debug(" -- failed within ");
+               return null;
+       }
+
+
+       var relation = choice([is, _in, within]);
+
+       function and() {
+               var result = sequence([relation, whitespace, _and_, whitespace, condition]);
+               if (result) {
+                       debug(" -- passed and");
+                       return result[0] && result[4];
+               }
+               debug(" -- failed and");
+               return null;
+       }
+
+       function or() {
+               var result = sequence([relation, whitespace, _or_, whitespace, condition]);
+               if (result) {
+                       debug(" -- passed or");
+                       return result[0] || result[4];
+               }
+               debug(" -- failed or");
+               return null;
+       }
+
+       var condition = choice([and, or, relation]);
+
+       function start() {
+               var result = condition();
+               return result;
+       }
+
+
+       var result = start();
+
+       /*
+        * For success, the pos must have gotten to the end of the rule
+        * and returned a non-null.
+        * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
+        */
+       if (result === null || pos !== rule.length) {
+               // throw new Error("Parse error at position " + pos.toString() + " in input: " + rule + " result is " + result);
+       }
+
+       return result;
+}
+
+/* For module loaders, e.g. NodeJS, NPM */
+if (typeof module !== 'undefined' && module.exports) {
+       module.exports = pluralRuleParser;
+}
+
+/* pluralRuleParser ends here */
+mw.libs.pluralRuleParser = pluralRuleParser;
+
+} )( mediaWiki );
index a5541ef..6a11d3e 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function ( mw, $ ) {
 
        mw.page = {};
 
@@ -15,4 +15,4 @@
        // is defined for them.
        $( mw.util.init );
 
-} )( jQuery );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.watch.ajax.js b/resources/mediawiki.page/mediawiki.page.watch.ajax.js
new file mode 100644 (file)
index 0000000..14557d4
--- /dev/null
@@ -0,0 +1,175 @@
+/**
+ * Animate watch/unwatch links to use asynchronous API requests to
+ * watch pages, rather than navigating to a different URI.
+ */
+( function ( mw, $ ) {
+       /**
+        * The name of the page to watch or unwatch.
+        */
+       var title = mw.config.get( 'wgRelevantPageName', mw.config.get( 'wgPageName' ) );
+
+       /**
+        * Update the link text, link href attribute and (if applicable)
+        * "loading" class.
+        *
+        * @param $link {jQuery} Anchor tag of (un)watch link.
+        * @param action {String} One of 'watch', 'unwatch'.
+        * @param state {String} [optional] 'idle' or 'loading'. Default is 'idle'.
+        */
+       function updateWatchLink( $link, action, state ) {
+               var accesskeyTip, msgKey, $li, otherAction;
+
+               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
+               msgKey = state === 'loading' ? action + 'ing' : action;
+               otherAction = action === 'watch' ? 'unwatch' : 'watch';
+               accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
+               $li = $link.closest( 'li' );
+               /**
+                * Trigger a 'watchpage' event for this List item.
+                * Announce the otherAction value as the first param.
+                * Used to monitor the state of watch link.
+                * TODO: Revise when system wide hooks are implemented
+                */
+               if( state === undefined ) {
+                       $li.trigger( 'watchpage.mw', otherAction );
+               }
+
+               $link
+                       .text( mw.msg( msgKey ) )
+                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
+                               ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
+                       )
+                       .attr( 'href', mw.util.wikiScript() + '?' + $.param({
+                                       title: title,
+                                       action: action
+                               })
+                       );
+
+               // Most common ID style
+               if ( $li.prop( 'id' ) === 'ca-' + otherAction ) {
+                       $li.prop( 'id', 'ca-' + action );
+               }
+
+               // Special case for vector icon
+               if ( $li.hasClass( 'icon' ) ) {
+                       if ( state === 'loading' ) {
+                               $link.addClass( 'loading' );
+                       } else {
+                               $link.removeClass( 'loading' );
+                       }
+               }
+       }
+
+       /**
+        * @todo This should be moved somewhere more accessible.
+        * @param url {String}
+        * @return {String} The extracted action, defaults to 'view'.
+        */
+       function mwUriGetAction( url ) {
+               var action, actionPaths, key, i, m, parts;
+
+               actionPaths = mw.config.get( 'wgActionPaths' );
+
+               // @todo: Does MediaWiki give action path or query param
+               // precedence ? If the former, move this to the bottom
+               action = mw.util.getParamValue( 'action', url );
+               if ( action !== null ) {
+                       return action;
+               }
+
+               for ( key in actionPaths ) {
+                       if ( actionPaths.hasOwnProperty( key ) ) {
+                               parts = actionPaths[key].split( '$1' );
+                               for ( i = 0; i < parts.length; i += 1 ) {
+                                       parts[i] = $.escapeRE( parts[i] );
+                               }
+                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
+                               if ( m && m[1] ) {
+                                       return key;
+                               }
+
+                       }
+               }
+
+               return 'view';
+       }
+
+       // Expose local methods
+       mw.page.watch = {
+               'updateWatchLink': updateWatchLink
+       };
+
+       $( document ).ready( function () {
+               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
+                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
+                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
+
+               // Allowing people to add inline animated links is a little scary
+               $links = $links.filter( ':not( #bodyContent *, #content * )' );
+
+               $links.click( function ( e ) {
+                       var action, api, $link;
+
+                       action = mwUriGetAction( this.href );
+
+                       if ( action !== 'watch' && action !== 'unwatch' ) {
+                               // Could not extract target action from link url,
+                               // let native browsing handle it further
+                               return true;
+                       }
+                       e.preventDefault();
+                       e.stopPropagation();
+
+                       $link = $( this );
+
+                       updateWatchLink( $link, action, 'loading' );
+
+                       api = new mw.Api();
+                       api[action](
+                               title,
+                               // Success
+                               function ( watchResponse ) {
+                                       var $li, otherAction;
+
+                                       otherAction = action === 'watch' ? 'unwatch' : 'watch';
+                                       $li = $link.closest( 'li' );
+
+                                       mw.util.jsMessage( watchResponse.message, 'ajaxwatch' );
+
+                                       // Set link to opposite
+                                       updateWatchLink( $link, otherAction );
+
+                                       // Bug 12395 - update the watch checkbox on edit pages when the
+                                       // page is watched or unwatched via the tab.
+                                       if ( watchResponse.watched !== undefined ) {
+                                               $( '#wpWatchthis' ).prop( 'checked', true );
+                                       } else {
+                                               $( '#wpWatchthis' ).removeProp( 'checked' );
+                                       }
+                               },
+                               // Error
+                               function () {
+                                       var cleanTitle, html, link;
+
+                                       // Reset link to non-loading mode
+                                       updateWatchLink( $link, action );
+
+                                       // Format error message
+                                       cleanTitle = title.replace( /_/g, ' ' );
+                                       link = mw.html.element(
+                                               'a', {
+                                                       href: mw.util.wikiGetlink( title ),
+                                                       title: cleanTitle
+                                               }, cleanTitle
+                                       );
+                                       html = mw.msg( 'watcherrortext', link );
+
+                                       // Report to user about the error
+                                       mw.util.jsMessage( html, 'ajaxwatch' );
+
+                               }
+                       );
+               });
+       });
+
+}( mediaWiki, jQuery ) );
index 00e14fa..cab0bbd 100644 (file)
@@ -1,12 +1,12 @@
 /*
  * JavaScript for Special:ChangeEmail
  */
-( function( $, mw ) {
+( function ( mw, $ ) {
 
 /**
  * Given an email validity status (true, false, null) update the label CSS class
  */
-var updateMailValidityLabel = function( mail ) {
+function updateMailValidityLabel( mail ) {
        var     isValid = mw.util.validateEmail( mail ),
                $label = $( '#mw-emailaddress-validity' );
 
@@ -22,21 +22,21 @@ var updateMailValidityLabel = function( mail ) {
        } else {
                $label.text( mw.msg( 'email-address-validity-invalid' ) ).addClass( 'invalid' ).removeClass( 'valid' );
        }
-};
+}
 
-$( document ).ready( function() {
+$( document ).ready( function () {
        // Lame tip to let user know if its email is valid. See bug 22449
        // Only bind once for 'blur' so that the user can fill it in without errors
        // After that look at every keypress for direct feedback if it was invalid onblur
-       $( '#wpNewEmail' ).one( 'blur', function() {
+       $( '#wpNewEmail' ).one( 'blur', function () {
                if ( $( '#mw-emailaddress-validity' ).length === 0 ) {
                        $(this).after( '<label for="wpNewEmail" id="mw-emailaddress-validity"></label>' );
                }
                updateMailValidityLabel( $(this).val() );
-               $(this).keyup( function() {
+               $(this).keyup( function () {
                        updateMailValidityLabel( $(this).val() );
                } );
        } );
 } );
 
-} )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
index cdc9704..8a5421e 100644 (file)
@@ -57,3 +57,7 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
        /* @embed */
        background: url(images/arrow-expanded.png) no-repeat left center;
 }
+
+.mw-changeslist-line-watched .mw-title {
+       font-weight: bold;
+}
index d413f60..808d5fe 100644 (file)
@@ -1,33 +1,37 @@
-/*
+/**
  * JavaScript for Special:JavaScriptTest
  */
-jQuery( document ).ready( function( $ ) {
+( function ( mw, $ ) {
+       $( function () {
 
-       // Create useskin dropdown menu and reload onchange to the selected skin
-       // (only if a framework was found, not on error pages).
-       $( '#mw-javascripttest-summary.mw-javascripttest-frameworkfound' ).append( function() {
+               // Create useskin dropdown menu and reload onchange to the selected skin
+               // (only if a framework was found, not on error pages).
+               $( '#mw-javascripttest-summary.mw-javascripttest-frameworkfound' ).append( function () {
 
-               var     $html = $( '<p><label for="useskin">'
-                               + mw.message( 'javascripttest-pagetext-skins' ).escaped()
-                               + ' '
-                               + '</label></p>' ),
-                       select = '<select name="useskin" id="useskin">';
+                       var     $html = $( '<p><label for="useskin">'
+                                       + mw.message( 'javascripttest-pagetext-skins' ).escaped()
+                                       + ' '
+                                       + '</label></p>' ),
+                               select = '<select name="useskin" id="useskin">';
 
-               // Build <select> further
-               $.each( mw.config.get( 'wgAvailableSkins' ), function( id ) {
-                       select += '<option value="' + id + '"'
-                               + ( mw.config.get( 'skin' ) === id ? ' selected="selected"' : '' )
-                               + '>' + mw.message( 'skinname-' + id ).escaped() + '</option>';
-               } );
-               select += '</select>';
+                       // Build <select> further
+                       $.each( mw.config.get( 'wgAvailableSkins' ), function ( id ) {
+                               select += '<option value="' + id + '"'
+                                       + ( mw.config.get( 'skin' ) === id ? ' selected="selected"' : '' )
+                                       + '>' + mw.message( 'skinname-' + id ).escaped() + '</option>';
+                       } );
+                       select += '</select>';
 
-               // Bind onchange event handler and append to form
-               $html.append(
-                       $( select ).change( function() {
-                               window.location = QUnit.url( { useskin: $(this).val() } );
-                       } )
-               );
+                       // Bind onchange event handler and append to form
+                       $html.append(
+                               $( select ).change( function () {
+                                       window.location = QUnit.url( { useskin: $(this).val() } );
+                               } )
+                       );
 
-               return $html;
+                       return $html;
+               } );
        } );
-} );
+
+}( mediaWiki, jQuery ) );
+
index e9df83c..0804825 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * JavaScript for Special:Preferences
  */
-jQuery( document ).ready( function( $ ) {
+jQuery( document ).ready( function ( $ ) {
 $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
 var $preftoc = $('<ul id="preftoc"></ul>');
 var $preferences = $( '#preferences' )
@@ -15,8 +15,35 @@ var $fieldsets = $preferences.children( 'fieldset' )
 var $legends = $fieldsets.children( 'legend' )
        .addClass( 'mainLegend' );
 
+/**
+ * It uses document.getElementById for security reasons (html injections in
+ * jQuery()).
+ *
+ * @param String name: the name of a tab without the prefix ("mw-prefsection-")
+ * @param String mode: [optional] A hash will be set according to the current
+ * open section. Set mode 'noHash' to surpress this.
+ */
+function switchPrefTab( name, mode ) {
+       var $tab, scrollTop;
+       // Handle hash manually to prevent jumping,
+       // therefore save and restore scrollTop to prevent jumping.
+       scrollTop = $( window ).scrollTop();
+       if ( mode !== 'noHash' ) {
+               window.location.hash = '#mw-prefsection-' + name;
+       }
+       $( window ).scrollTop( scrollTop );
+
+       $preftoc.find( 'li' ).removeClass( 'selected' );
+       $tab = $( document.getElementById( 'preftab-' + name ) );
+       if ( $tab.length ) {
+               $tab.parent().addClass( 'selected' );
+               $preferences.children( 'fieldset' ).hide();
+               $( document.getElementById( 'mw-prefsection-' + name ) ).show();
+       }
+}
+
 // Populate the prefToc
-$legends.each( function( i, legend ) {
+$legends.each( function ( i, legend ) {
        var $legend = $(legend);
        if ( i === 0 ) {
                $legend.parent().show();
@@ -30,18 +57,6 @@ $legends.each( function( i, legend ) {
                text : $legend.text(),
                id : ident.replace( 'mw-prefsection', 'preftab' ),
                href : '#' + ident
-       }).click( function( e ) {
-               e.preventDefault();
-               // Handle hash manually to prevent jumping
-               // Therefore save and restore scrollTop to prevent jumping
-               var scrollTop = $(window).scrollTop();
-               window.location.hash = $(this).attr('href');
-               $(window).scrollTop(scrollTop);
-
-               $preftoc.find( 'li' ).removeClass( 'selected' );
-               $(this).parent().addClass( 'selected' );
-               $( '#preferences > fieldset' ).hide();
-               $( '#' + ident ).show();
        });
        $li.append( $a );
        $preftoc.append( $li );
@@ -50,11 +65,34 @@ $legends.each( function( i, legend ) {
 // If we've reloaded the page or followed an open-in-new-window,
 // make the selected tab visible.
 var hash = window.location.hash;
-if( hash.match( /^#mw-prefsection-[\w-]+/ ) ) {
-       var $tab = $( hash.replace( 'mw-prefsection', 'preftab' ) );
-       $tab.click();
+if ( hash.match( /^#mw-prefsection-[\w-]+/ ) ) {
+       switchPrefTab( hash.replace( '#mw-prefsection-' , '' ) );
 }
 
+// In browsers that support the onhashchange event we will not bind click
+// handlers and instead let the browser do the default behavior (clicking the
+// <a href="#.."> will naturally set the hash, handled by onhashchange.
+// But other things that change the hash will also be catched (e.g. using
+// the Back and Forward browser navigation).
+if ( 'onhashchange' in window ) {
+       $(window).on( 'hashchange' , function () {
+               var hash = window.location.hash;
+               if ( hash.match( /^#mw-prefsection-[\w-]+/ ) ) {
+                       switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
+               } else if ( hash === '' ) {
+                       switchPrefTab( 'personal', 'noHash' );
+               }
+       });
+// In older browsers we'll bind a click handler as fallback.
+// We must not have onhashchange *and* the click handlers, other wise
+// the click handler calls switchPrefTab() which sets the hash value,
+// which triggers onhashcange and calls switchPrefTab() again.
+} else {
+       $preftoc.on( 'click', 'li a', function ( e ) {
+               switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
+               e.preventDefault();
+       });
+}
 
 /**
 * Timezone functions.
@@ -68,7 +106,7 @@ var $localtimeHolder = $( '#wpLocalTime' );
 var servertime = parseInt( $( 'input[name=wpServerTime]' ).val(), 10 );
 var minuteDiff = 0;
 
-var minutesToHours = function( min ) {
+var minutesToHours = function ( min ) {
        var tzHour = Math.floor( Math.abs( min ) / 60 );
        var tzMin = Math.abs( min ) % 60;
        var tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
@@ -76,7 +114,7 @@ var minutesToHours = function( min ) {
        return tzString;
 };
 
-var hoursToMinutes = function( hour ) {
+var hoursToMinutes = function ( hour ) {
        var arr = hour.split( ':' );
        arr[0] = parseInt( arr[0], 10 );
 
@@ -99,7 +137,7 @@ var hoursToMinutes = function( hour ) {
        }
 };
 
-var updateTimezoneSelection = function() {
+var updateTimezoneSelection = function () {
        var type = $tzSelect.val();
        if ( type == 'guess' ) {
                // Get browser timezone & fill it in
@@ -130,8 +168,8 @@ var updateTimezoneSelection = function() {
 };
 
 if ( $tzSelect.length && $tzTextbox.length ) {
-       $tzSelect.change( function() { updateTimezoneSelection(); } );
-       $tzTextbox.blur( function() { updateTimezoneSelection(); } );
+       $tzSelect.change( function () { updateTimezoneSelection(); } );
+       $tzTextbox.blur( function () { updateTimezoneSelection(); } );
        updateTimezoneSelection();
 }
 } );
index 3d520f5..7996d93 100644 (file)
@@ -1,5 +1,5 @@
 /* JavaScript for Special:RecentChanges */
-( function( $ ) {
+( function ( mw, $ ) {
 
        var checkboxes = [ 'nsassociated', 'nsinvert' ];
 
                 * Handler to disable/enable the namespace selector checkboxes when the
                 * special 'all' namespace is selected/unselected respectively.
                 */
-               updateCheckboxes: function() {
+               updateCheckboxes: function () {
                        // The option element for the 'all' namespace has an empty value
-                       var isAllNS = ('' === $select.find('option:selected').val() );
+                       var isAllNS = $select.find('option:selected').val() === '';
 
                        // Iterates over checkboxes and propagate the selected option
-                       $.each( checkboxes, function( i, id ) {
+                       $.each( checkboxes, function ( i, id ) {
                                $( '#' + id ).prop( 'disabled', isAllNS );
                        });
                },
 
-               init: function() {
+               init: function () {
                        // Populate
                        $select = $( '#namespace' );
 
@@ -36,4 +36,4 @@
        // Run when document is ready
        $( rc.init );
 
-})( jQuery );
+}( mediaWiki, jQuery ) );
index f7a4b1f..63e8971 100644 (file)
-/*
+/**
  * JavaScript for Special:Upload
  * Note that additional code still lives in skins/common/upload.js
  */
-
-/**
- * Add a preview to the upload form
- */
-jQuery( function( $ ) {
-       /**
-        * Is the FileAPI available with sufficient functionality?
-        */
-       function hasFileAPI(){
-               return typeof window.FileReader !== 'undefined';
-       }
-
+( function ( mw, $ ) {
        /**
-        * Check if this is a recognizable image type...
-        * Also excludes files over 10M to avoid going insane on memory usage.
-        *
-        * @todo is there a way we can ask the browser what's supported in <img>s?
-        * @todo put SVG back after working around Firefox 7 bug <https://bugzilla.wikimedia.org/show_bug.cgi?id=31643>
-        *
-        * @param {File} file
-        * @return boolean
+        * Add a preview to the upload form
         */
-       function fileIsPreviewable( file ) {
-               var     known = ['image/png', 'image/gif', 'image/jpeg', 'image/svg+xml'],
-                       tooHuge = 10 * 1024 * 1024;
-               return ( $.inArray( file.type, known ) !== -1 ) && file.size > 0 && file.size < tooHuge;
-       }
+       $( function ( $ ) {
+               /**
+                * Is the FileAPI available with sufficient functionality?
+                */
+               function hasFileAPI() {
+                       return typeof window.FileReader !== 'undefined';
+               }
 
-       /**
-        * Show a thumbnail preview of PNG, JPEG, GIF, and SVG files prior to upload
-        * in browsers supporting HTML5 FileAPI.
-        *
-        * As of this writing, known good:
-        * - Firefox 3.6+
-        * - Chrome 7.something
-        *
-        * @todo check file size limits and warn of likely failures
-        *
-        * @param {File} file
-        */
-       function showPreview( file ) {
-               var     previewSize = 180,
-                       thumb = $( '<div id="mw-upload-thumbnail" class="thumb tright">' +
-                                               '<div class="thumbinner">' +
-                                                       '<div class="mw-small-spinner" style="width: 180px; height: 180px"></div>' +
-                                                       '<div class="thumbcaption"><div class="filename"></div><div class="fileinfo"></div></div>' +
-                                               '</div>' +
-                                       '</div>' );
-               thumb.find( '.filename' ).text( file.name ).end()
-                       .find( '.fileinfo' ).text( prettySize( file.size ) ).end();
+               /**
+                * Check if this is a recognizable image type...
+                * Also excludes files over 10M to avoid going insane on memory usage.
+                *
+                * @todo is there a way we can ask the browser what's supported in <img>s?
+                * @todo put SVG back after working around Firefox 7 bug <https://bugzilla.wikimedia.org/show_bug.cgi?id=31643>
+                *
+                * @param {File} file
+                * @return boolean
+                */
+               function fileIsPreviewable( file ) {
+                       var     known = ['image/png', 'image/gif', 'image/jpeg', 'image/svg+xml'],
+                               tooHuge = 10 * 1024 * 1024;
+                       return ( $.inArray( file.type, known ) !== -1 ) && file.size > 0 && file.size < tooHuge;
+               }
 
-               var     $canvas = $('<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>'),
-                       ctx = $canvas[0].getContext( '2d' );
-               $( '#mw-htmlform-source' ).parent().prepend( thumb );
+               /**
+                * Show a thumbnail preview of PNG, JPEG, GIF, and SVG files prior to upload
+                * in browsers supporting HTML5 FileAPI.
+                *
+                * As of this writing, known good:
+                * - Firefox 3.6+
+                * - Chrome 7.something
+                *
+                * @todo check file size limits and warn of likely failures
+                *
+                * @param {File} file
+                */
+               function showPreview( file ) {
+                       var     previewSize = 180,
+                               thumb = $( '<div id="mw-upload-thumbnail" class="thumb tright">' +
+                                                       '<div class="thumbinner">' +
+                                                               '<div class="mw-small-spinner" style="width: 180px; height: 180px"></div>' +
+                                                               '<div class="thumbcaption"><div class="filename"></div><div class="fileinfo"></div></div>' +
+                                                       '</div>' +
+                                               '</div>' );
+                       thumb.find( '.filename' ).text( file.name ).end()
+                               .find( '.fileinfo' ).text( prettySize( file.size ) ).end();
 
-               var meta;
-               fetchPreview( file, function( dataURL ) {
-                       var     img = new Image(),
-                               rotation = 0;
+                       var     $canvas = $('<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>'),
+                               ctx = $canvas[0].getContext( '2d' );
+                       $( '#mw-htmlform-source' ).parent().prepend( thumb );
 
-                       if ( meta && meta.tiff && meta.tiff.Orientation ) {
-                               rotation = (360 - function () {
-                                       // See includes/media/Bitmap.php
-                                       switch ( meta.tiff.Orientation.value ) {
-                                               case 8:
-                                                       return 90;
-                                               case 3:
-                                                       return 180;
-                                               case 6:
-                                                       return 270;
-                                               default:
-                                                       return 0;
-                                       }
-                               }() ) % 360;
-                       }
+                       var meta;
+                       fetchPreview( file, function( dataURL ) {
+                               var     img = new Image(),
+                                       rotation = 0;
 
-                       img.onload = function() {
-                               var width, height, x, y, dx, dy, logicalWidth, logicalHeight;
-                               // Fit the image within the previewSizexpreviewSize box
-                               if ( img.width > img.height ) {
-                                       width = previewSize;
-                                       height = img.height / img.width * previewSize;
-                               } else {
-                                       height = previewSize;
-                                       width = img.width / img.height * previewSize;
+                               if ( meta && meta.tiff && meta.tiff.Orientation ) {
+                                       rotation = ( 360 - ( function () {
+                                               // See includes/media/Bitmap.php
+                                               switch ( meta.tiff.Orientation.value ) {
+                                                       case 8:
+                                                               return 90;
+                                                       case 3:
+                                                               return 180;
+                                                       case 6:
+                                                               return 270;
+                                                       default:
+                                                               return 0;
+                                               }
+                                       }() ) ) % 360;
                                }
-                               // Determine the offset required to center the image
-                               dx = (180 - width) / 2;
-                               dy = (180 - height) / 2;
-                               switch ( rotation ) {
-                                       // If a rotation is applied, the direction of the axis
-                                       // changes as well. You can derive the values below by
-                                       // drawing on paper an axis system, rotate it and see
-                                       // where the positive axis direction is
-                                       case 0:
-                                               x = dx;
-                                               y = dy;
-                                               logicalWidth = img.width;
-                                               logicalHeight = img.height;
-                                               break;
-                                       case 90:
 
-                                               x = dx;
-                                               y = dy - previewSize;
-                                               logicalWidth = img.height;
-                                               logicalHeight = img.width;
-                                               break;
-                                       case 180:
-                                               x = dx - previewSize;
-                                               y = dy - previewSize;
-                                               logicalWidth = img.width;
-                                               logicalHeight = img.height;
-                                               break;
-                                       case 270:
-                                               x = dx - previewSize;
-                                               y = dy;
-                                               logicalWidth = img.height;
-                                               logicalHeight = img.width;
-                                               break;
-                               }
-
-                               ctx.clearRect( 0, 0, 180, 180 );
-                               ctx.rotate( rotation / 180 * Math.PI );
-                               ctx.drawImage( img, x, y, width, height );
-                               thumb.find('.mw-small-spinner').replaceWith($canvas);
+                               img.onload = function () {
+                                       var width, height, x, y, dx, dy, logicalWidth, logicalHeight;
+                                       // Fit the image within the previewSizexpreviewSize box
+                                       if ( img.width > img.height ) {
+                                               width = previewSize;
+                                               height = img.height / img.width * previewSize;
+                                       } else {
+                                               height = previewSize;
+                                               width = img.width / img.height * previewSize;
+                                       }
+                                       // Determine the offset required to center the image
+                                       dx = (180 - width) / 2;
+                                       dy = (180 - height) / 2;
+                                       switch ( rotation ) {
+                                               // If a rotation is applied, the direction of the axis
+                                               // changes as well. You can derive the values below by
+                                               // drawing on paper an axis system, rotate it and see
+                                               // where the positive axis direction is
+                                               case 0:
+                                                       x = dx;
+                                                       y = dy;
+                                                       logicalWidth = img.width;
+                                                       logicalHeight = img.height;
+                                                       break;
+                                               case 90:
 
-                               // Image size
-                               var info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
-                                       ', ' + prettySize( file.size );
-                               $( '#mw-upload-thumbnail .fileinfo' ).text( info );
-                       };
-                       img.src = dataURL;
-               }, mw.config.get( 'wgFileCanRotate' ) ? function ( data ) {
-                       try {
-                               meta = mw.libs.jpegmeta( data, file.fileName );
-                               meta._binary_data = null;
-                       } catch ( e ) {
-                               meta = null;
-                       }
-               } : null );
-       }
+                                                       x = dx;
+                                                       y = dy - previewSize;
+                                                       logicalWidth = img.height;
+                                                       logicalHeight = img.width;
+                                                       break;
+                                               case 180:
+                                                       x = dx - previewSize;
+                                                       y = dy - previewSize;
+                                                       logicalWidth = img.width;
+                                                       logicalHeight = img.height;
+                                                       break;
+                                               case 270:
+                                                       x = dx - previewSize;
+                                                       y = dy;
+                                                       logicalWidth = img.height;
+                                                       logicalHeight = img.width;
+                                                       break;
+                                       }
 
-       /**
-        * Start loading a file into memory; when complete, pass it as a
-        * data URL to the callback function. If the callbackBinary is set it will
-        * first be read as binary and afterwards as data URL. Useful if you want
-        * to do preprocessing on the binary data first.
-        *
-        * @param {File} file
-        * @param {function} callback
-        * @param {function} callbackBinary
-        */
-       function fetchPreview( file, callback, callbackBinary ) {
-               var reader = new FileReader();
-               if ( callbackBinary && 'readAsBinaryString' in reader ) {
-                       // To fetch JPEG metadata we need a binary string; start there.
-                       // todo: 
-                       reader.onload = function() {
-                               callbackBinary( reader.result );
+                                       ctx.clearRect( 0, 0, 180, 180 );
+                                       ctx.rotate( rotation / 180 * Math.PI );
+                                       ctx.drawImage( img, x, y, width, height );
+                                       thumb.find('.mw-small-spinner').replaceWith($canvas);
 
-                               // Now run back through the regular code path.
-                               fetchPreview( file, callback );
-                       };
-                       reader.readAsBinaryString( file );
-               } else if ( callbackBinary && 'readAsArrayBuffer' in reader ) {
-                       // readAsArrayBuffer replaces readAsBinaryString
-                       // However, our JPEG metadata library wants a string.
-                       // So, this is going to be an ugly conversion.
-                       reader.onload = function() {
-                               var buffer = new Uint8Array( reader.result ),
-                                       string = '';
-                               for ( var i = 0; i < buffer.byteLength; i++ ) {
-                                       string += String.fromCharCode( buffer[i] );
+                                       // Image size
+                                       var info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
+                                               ', ' + prettySize( file.size );
+                                       $( '#mw-upload-thumbnail .fileinfo' ).text( info );
+                               };
+                               img.src = dataURL;
+                       }, mw.config.get( 'wgFileCanRotate' ) ? function ( data ) {
+                               try {
+                                       meta = mw.libs.jpegmeta( data, file.fileName );
+                                       meta._binary_data = null;
+                               } catch ( e ) {
+                                       meta = null;
                                }
-                               callbackBinary( string );
-
-                               // Now run back through the regular code path.
-                               fetchPreview( file, callback );
-                       };
-                       reader.readAsArrayBuffer( file );
-               } else if ( 'URL' in window && 'createObjectURL' in window.URL ) {
-                       // Supported in Firefox 4.0 and above <https://developer.mozilla.org/en/DOM/window.URL.createObjectURL>
-                       // WebKit has it in a namespace for now but that's ok. ;)
-                       //
-                       // Lifetime of this URL is until document close, which is fine
-                       // for Special:Upload -- if this code gets used on longer-running
-                       // pages, add a revokeObjectURL() when it's no longer needed.
-                       //
-                       // Prefer this over readAsDataURL for Firefox 7 due to bug reading
-                       // some SVG files from data URIs <https://bugzilla.mozilla.org/show_bug.cgi?id=694165>
-                       callback( window.URL.createObjectURL( file ) );
-               } else {
-                       // This ends up decoding the file to base-64 and back again, which
-                       // feels horribly inefficient.
-                       reader.onload = function() {
-                               callback( reader.result );
-                       };
-                       reader.readAsDataURL( file );
+                       } : null );
                }
-       }
 
-       /**
-        * Format a file size attractively.
-        * @todo match numeric formatting
-        *
-        * @param {number} s
-        * @return string
-        */
-       function prettySize( s ) {
-               var sizes = ['size-bytes', 'size-kilobytes', 'size-megabytes', 'size-gigabytes'];
-               while ( s >= 1024 && sizes.length > 1 ) {
-                       s /= 1024;
-                       sizes = sizes.slice( 1 );
-               }
-               return mw.msg( sizes[0], Math.round( s ) );
-       }
+               /**
+                * Start loading a file into memory; when complete, pass it as a
+                * data URL to the callback function. If the callbackBinary is set it will
+                * first be read as binary and afterwards as data URL. Useful if you want
+                * to do preprocessing on the binary data first.
+                *
+                * @param {File} file
+                * @param {function} callback
+                * @param {function} callbackBinary
+                */
+               function fetchPreview( file, callback, callbackBinary ) {
+                       var reader = new FileReader();
+                       if ( callbackBinary && 'readAsBinaryString' in reader ) {
+                               // To fetch JPEG metadata we need a binary string; start there.
+                               // todo:
+                               reader.onload = function() {
+                                       callbackBinary( reader.result );
 
-       /**
-        * Clear the file upload preview area.
-        */
-       function clearPreview() {
-               $( '#mw-upload-thumbnail' ).remove();
-       }
+                                       // Now run back through the regular code path.
+                                       fetchPreview( file, callback );
+                               };
+                               reader.readAsBinaryString( file );
+                       } else if ( callbackBinary && 'readAsArrayBuffer' in reader ) {
+                               // readAsArrayBuffer replaces readAsBinaryString
+                               // However, our JPEG metadata library wants a string.
+                               // So, this is going to be an ugly conversion.
+                               reader.onload = function() {
+                                       var buffer = new Uint8Array( reader.result ),
+                                               string = '';
+                                       for ( var i = 0; i < buffer.byteLength; i++ ) {
+                                               string += String.fromCharCode( buffer[i] );
+                                       }
+                                       callbackBinary( string );
 
-       /**
-        * Check if the file does not exceed the maximum size
-        */
-       function checkMaxUploadSize( file ) {
-               function getMaxUploadSize( type ) {
-                       var sizes = mw.config.get( 'wgMaxUploadSize' );
-                       if ( sizes[type] !== undefined ) {
-                               return sizes[type];
+                                       // Now run back through the regular code path.
+                                       fetchPreview( file, callback );
+                               };
+                               reader.readAsArrayBuffer( file );
+                       } else if ( 'URL' in window && 'createObjectURL' in window.URL ) {
+                               // Supported in Firefox 4.0 and above <https://developer.mozilla.org/en/DOM/window.URL.createObjectURL>
+                               // WebKit has it in a namespace for now but that's ok. ;)
+                               //
+                               // Lifetime of this URL is until document close, which is fine
+                               // for Special:Upload -- if this code gets used on longer-running
+                               // pages, add a revokeObjectURL() when it's no longer needed.
+                               //
+                               // Prefer this over readAsDataURL for Firefox 7 due to bug reading
+                               // some SVG files from data URIs <https://bugzilla.mozilla.org/show_bug.cgi?id=694165>
+                               callback( window.URL.createObjectURL( file ) );
+                       } else {
+                               // This ends up decoding the file to base-64 and back again, which
+                               // feels horribly inefficient.
+                               reader.onload = function() {
+                                       callback( reader.result );
+                               };
+                               reader.readAsDataURL( file );
                        }
-                       return sizes['*'];
                }
-               $( '.mw-upload-source-error' ).remove();
 
-               var maxSize = getMaxUploadSize( 'file' );
-               if ( file.size > maxSize ) {
-                       var error = $( '<p class="error mw-upload-source-error" id="wpSourceTypeFile-error">' +
-                                       mw.message( 'largefileserver', file.size, maxSize ).escaped() + '</p>' );
-                       $( '#wpUploadFile' ).after( error );
-                       return false;
+               /**
+                * Format a file size attractively.
+                * @todo match numeric formatting
+                *
+                * @param {number} s
+                * @return string
+                */
+               function prettySize( s ) {
+                       var sizeMsgs = ['size-bytes', 'size-kilobytes', 'size-megabytes', 'size-gigabytes'];
+                       while ( s >= 1024 && sizeMsgs.length > 1 ) {
+                               s /= 1024;
+                               sizeMsgs = sizeMsgs.slice( 1 );
+                       }
+                       return mw.msg( sizeMsgs[0], Math.round( s ) );
                }
-               return true;
-       }
-
 
-       /**
-        * Initialization
-        */
-       if ( hasFileAPI() ) {
-               // Update thumbnail when the file selection control is updated.
-               $( '#wpUploadFile' ).change( function() {
-                       clearPreview();
-                       if ( this.files && this.files.length ) {
-                               // Note: would need to be updated to handle multiple files.
-                               var file = this.files[0];
+               /**
+                * Clear the file upload preview area.
+                */
+               function clearPreview() {
+                       $( '#mw-upload-thumbnail' ).remove();
+               }
 
-                               if ( !checkMaxUploadSize( file ) ) {
-                                       return;
+               /**
+                * Check if the file does not exceed the maximum size
+                */
+               function checkMaxUploadSize( file ) {
+                       function getMaxUploadSize( type ) {
+                               var sizes = mw.config.get( 'wgMaxUploadSize' );
+                               if ( sizes[type] !== undefined ) {
+                                       return sizes[type];
                                }
+                               return sizes['*'];
+                       }
+                       $( '.mw-upload-source-error' ).remove();
 
-                               if ( fileIsPreviewable( file ) ) {
-                                       showPreview( file );
-                               }
+                       var maxSize = getMaxUploadSize( 'file' );
+                       if ( file.size > maxSize ) {
+                               var error = $( '<p class="error mw-upload-source-error" id="wpSourceTypeFile-error">' +
+                                               mw.message( 'largefileserver', file.size, maxSize ).escaped() + '</p>' );
+                               $( '#wpUploadFile' ).after( error );
+                               return false;
                        }
-               } );
-       }
-} );
+                       return true;
+               }
 
-/**
- * Disable all upload source fields except the selected one
- */
-jQuery( function ( $ ) {
-       var rows = $( '.mw-htmlform-field-UploadSourceField' );
-       for ( var i = rows.length; i; i-- ) {
-               var row = rows[i - 1];
-               $( 'input[name="wpSourceType"]', row ).change( function () {
-                       var currentRow = row; // Store current row in our own scope
-                       return function () {
-                               $( '.mw-upload-source-error' ).remove();
-                               if ( this.checked ) {
-                                       // Disable all inputs
-                                       $( 'input[name!="wpSourceType"]', rows ).prop( 'disabled', 'disabled' );
-                                       // Re-enable the current one
-                                       $( 'input', currentRow ).prop( 'disabled', false );
+
+               /**
+                * Initialization
+                */
+               if ( hasFileAPI() ) {
+                       // Update thumbnail when the file selection control is updated.
+                       $( '#wpUploadFile' ).change( function () {
+                               clearPreview();
+                               if ( this.files && this.files.length ) {
+                                       // Note: would need to be updated to handle multiple files.
+                                       var file = this.files[0];
+
+                                       if ( !checkMaxUploadSize( file ) ) {
+                                               return;
+                                       }
+
+                                       if ( fileIsPreviewable( file ) ) {
+                                               showPreview( file );
+                                       }
                                }
-                       };
-               }() );
-       }
-} );
+                       } );
+               }
+       } );
+
+       /**
+        * Disable all upload source fields except the selected one
+        */
+       $( function ( $ ) {
+               var i, row,
+                       rows = $( '.mw-htmlform-field-UploadSourceField' );
+               for ( i = rows.length; i; i-- ) {
+                       row = rows[i - 1];
+                       $( 'input[name="wpSourceType"]', row ).change( ( function () {
+                               var currentRow = row; // Store current row in our own scope
+                               return function () {
+                                       $( '.mw-upload-source-error' ).remove();
+                                       if ( this.checked ) {
+                                               // Disable all inputs
+                                               $( 'input[name!="wpSourceType"]', rows ).prop( 'disabled', true );
+                                               // Re-enable the current one
+                                               $( 'input', currentRow ).prop( 'disabled', false );
+                                       }
+                               };
+                       }() ) );
+               }
+       } );
 
+}( mediaWiki, jQuery ) );
index 8d7996c..6b6e586 100644 (file)
@@ -7,7 +7,7 @@
  *
  * Relies on: mw.config (wgFormattedNamespaces, wgNamespaceIds, wgCaseSensitiveNamespaces), mw.util.wikiGetlink
  */
-( function( $ ) {
+( function ( mw, $ ) {
 
        /* Local space */
 
         * @param namespace {Number} (optional) Namespace id. If given, title will be taken as-is.
         * @return {Title} this
         */
-var    Title = function( title, namespace ) {
-               this._ns = 0; // integer namespace id
-               this._name = null; // name in canonical 'database' form
-               this._ext = null; // extension
+       function Title( title, namespace ) {
+               this.ns = 0; // integer namespace id
+               this.name = null; // name in canonical 'database' form
+               this.ext = null; // extension
 
                if ( arguments.length === 2 ) {
                        setNameAndExtension( this, title );
-                       this._ns = fixNsId( namespace );
+                       this.ns = fixNsId( namespace );
                } else if ( arguments.length === 1 ) {
                        setAll( this, title );
                }
                return this;
-       },
+       }
 
+var
        /**
         * Strip some illegal chars: control chars, colon, less than, greater than,
         * brackets, braces, pipe, whitespace and normal spaces. This still leaves some insanity
@@ -41,7 +42,7 @@ var   Title = function( title, namespace ) {
         * @param s {String}
         * @return {String}
         */
-       clean = function( s ) {
+       clean = function ( s ) {
                if ( s !== undefined ) {
                        return s.replace( /[\x00-\x1f\x23\x3c\x3e\x5b\x5d\x7b\x7c\x7d\x7f\s]+/g, '_' );
                }
@@ -63,14 +64,14 @@ var Title = function( title, namespace ) {
        /**
         * Sanitize name.
         */
-       fixName = function( s ) {
+       fixName = function ( s ) {
                return clean( $.trim( s ) );
        },
 
        /**
         * Sanitize name.
         */
-       fixExt = function( s ) {
+       fixExt = function ( s ) {
                return clean( s );
        },
 
@@ -79,7 +80,7 @@ var   Title = function( title, namespace ) {
         * @param id {Number} Namespace id.
         * @return {Number|Boolean} The id as-is or boolean false if invalid.
         */
-       fixNsId = function( id ) {
+       fixNsId = function ( id ) {
                // wgFormattedNamespaces is an object of *string* key-vals (ie. arr["0"] not arr[0] )
                var ns = mw.config.get( 'wgFormattedNamespaces' )[id.toString()];
 
@@ -98,9 +99,13 @@ var  Title = function( title, namespace ) {
         * @param ns {String} Namespace name (case insensitive, leading/trailing space ignored).
         * @return {Number|Boolean} Namespace id or boolean false if unrecognized.
         */
-       getNsIdByName = function( ns ) {
-               // toLowerCase throws exception on null/undefined. Return early.
-               if ( ns == null ) {
+       getNsIdByName = function ( ns ) {
+               // Don't cast non-strings to strings, because null or undefined
+               // should not result in returning the id of a potential namespace
+               // called "Null:" (e.g. on nullwiki.example.org)
+               // Also, toLowerCase throws exception on null/undefined, because
+               // it is a String.prototype method.
+               if ( typeof ns !== 'string' ) {
                        return false;
                }
                ns = clean( $.trim( ns.toLowerCase() ) ); // Normalize
@@ -119,7 +124,7 @@ var Title = function( title, namespace ) {
         * @param raw {String}
         * @return {mw.Title}
         */
-       setAll = function( title, s ) {
+       setAll = function ( title, s ) {
                // In normal browsers the match-array contains null/undefined if there's no match,
                // IE returns an empty string.
                var     matches = s.match( /^(?:([^:]+):)?(.*?)(?:\.(\w{1,5}))?$/ ),
@@ -127,14 +132,14 @@ var       Title = function( title, namespace ) {
 
                // Namespace must be valid, and title must be a non-empty string.
                if ( ns_match && typeof matches[2] === 'string' && matches[2] !== '' ) {
-                       title._ns = ns_match;
-                       title._name = fixName( matches[2] );
+                       title.ns = ns_match;
+                       title.name = fixName( matches[2] );
                        if ( typeof matches[3] === 'string' && matches[3] !== '' ) {
-                               title._ext = fixExt( matches[3] );
+                               title.ext = fixExt( matches[3] );
                        }
                } else {
                        // Consistency with MediaWiki PHP: Unknown namespace -> fallback to main namespace.
-                       title._ns = 0;
+                       title.ns = 0;
                        setNameAndExtension( title, s );
                }
                return title;
@@ -147,16 +152,16 @@ var       Title = function( title, namespace ) {
         * @param raw {String}
         * @return {mw.Title}
         */
-       setNameAndExtension = function( title, raw ) {
+       setNameAndExtension = function ( title, raw ) {
                // In normal browsers the match-array contains null/undefined if there's no match,
                // IE returns an empty string.
                var matches = raw.match( /^(?:)?(.*?)(?:\.(\w{1,5}))?$/ );
 
                // Title must be a non-empty string.
                if ( typeof matches[1] === 'string' && matches[1] !== '' ) {
-                       title._name = fixName( matches[1] );
+                       title.name = fixName( matches[1] );
                        if ( typeof matches[2] === 'string' && matches[2] !== '' ) {
-                               title._ext = fixExt( matches[2] );
+                               title.ext = fixExt( matches[2] );
                        }
                } else {
                        throw new Error( 'mw.Title: Could not parse title "' + raw + '"' );
@@ -172,7 +177,7 @@ var Title = function( title, namespace ) {
         * @param title {mixed} prefixed db-key name (string) or instance of Title
         * @return {mixed} Boolean true/false if the information is available. Otherwise null.
         */
-       Title.exists = function( title ) {
+       Title.exists = function ( title ) {
                var type = $.type( title ), obj = Title.exist.pages, match;
                if ( type === 'string' ) {
                        match = obj[title];
@@ -203,7 +208,7 @@ var Title = function( title, namespace ) {
                 * @param state {Boolean} (optional) State of the given titles. Defaults to true.
                 * @return {Boolean}
                 */
-               set: function( titles, state ) {
+               set: function ( titles, state ) {
                        titles = $.isArray( titles ) ? titles : [titles];
                        state = state === undefined ? true : !!state;
                        var pages = this.pages, i, len = titles.length;
@@ -223,8 +228,8 @@ var Title = function( title, namespace ) {
                 * Get the namespace number.
                 * @return {Number}
                 */
-               getNamespaceId: function(){
-                       return this._ns;
+               getNamespaceId: function (){
+                       return this.ns;
                },
 
                /**
@@ -232,19 +237,19 @@ var       Title = function( title, namespace ) {
                 * In NS_MAIN this is '', otherwise namespace name plus ':'
                 * @return {String}
                 */
-               getNamespacePrefix: function(){
-                       return mw.config.get( 'wgFormattedNamespaces' )[this._ns].replace( / /g, '_' ) + (this._ns === 0 ? '' : ':');
+               getNamespacePrefix: function (){
+                       return mw.config.get( 'wgFormattedNamespaces' )[this.ns].replace( / /g, '_' ) + (this.ns === 0 ? '' : ':');
                },
 
                /**
                 * The name, like "Foo_bar"
                 * @return {String}
                 */
-               getName: function() {
-                       if ( $.inArray( this._ns, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
-                               return this._name;
+               getName: function () {
+                       if ( $.inArray( this.ns, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
+                               return this.name;
                        } else {
-                               return $.ucFirst( this._name );
+                               return $.ucFirst( this.name );
                        }
                },
 
@@ -252,7 +257,7 @@ var Title = function( title, namespace ) {
                 * The name, like "Foo bar"
                 * @return {String}
                 */
-               getNameText: function() {
+               getNameText: function () {
                        return text( this.getName() );
                },
 
@@ -260,7 +265,7 @@ var Title = function( title, namespace ) {
                 * Get full name in prefixed DB form, like File:Foo_bar.jpg,
                 * most useful for API calls, anything that must identify the "title".
                 */
-               getPrefixedDb: function() {
+               getPrefixedDb: function () {
                        return this.getNamespacePrefix() + this.getMain();
                },
 
@@ -268,7 +273,7 @@ var Title = function( title, namespace ) {
                 * Get full name in text form, like "File:Foo bar.jpg".
                 * @return {String}
                 */
-               getPrefixedText: function() {
+               getPrefixedText: function () {
                        return text( this.getPrefixedDb() );
                },
 
@@ -276,7 +281,7 @@ var Title = function( title, namespace ) {
                 * The main title (without namespace), like "Foo_bar.jpg"
                 * @return {String}
                 */
-               getMain: function() {
+               getMain: function () {
                        return this.getName() + this.getDotExtension();
                },
 
@@ -284,7 +289,7 @@ var Title = function( title, namespace ) {
                 * The "text" form, like "Foo bar.jpg"
                 * @return {String}
                 */
-               getMainText: function() {
+               getMainText: function () {
                        return text( this.getMain() );
                },
 
@@ -292,23 +297,23 @@ var       Title = function( title, namespace ) {
                 * Get the extension (returns null if there was none)
                 * @return {String|null} extension
                 */
-               getExtension: function() {
-                       return this._ext;
+               getExtension: function () {
+                       return this.ext;
                },
 
                /**
                 * Convenience method: return string like ".jpg", or "" if no extension
                 * @return {String}
                 */
-               getDotExtension: function() {
-                       return this._ext === null ? '' : '.' + this._ext;
+               getDotExtension: function () {
+                       return this.ext === null ? '' : '.' + this.ext;
                },
 
                /**
                 * Return the URL to this title
                 * @return {String}
                 */
-               getUrl: function() {
+               getUrl: function () {
                        return mw.util.wikiGetlink( this.toString() );
                },
 
@@ -316,7 +321,7 @@ var Title = function( title, namespace ) {
                 * Whether this title exists on the wiki.
                 * @return {mixed} Boolean true/false if the information is available. Otherwise null.
                 */
-               exists: function() {
+               exists: function () {
                        return Title.exists( this );
                }
        };
@@ -331,4 +336,4 @@ var Title = function( title, namespace ) {
        // Expose
        mw.Title = Title;
 
-})(jQuery);
+}( mediaWiki, jQuery ) );
index e8a0118..bd12b21 100644 (file)
                 * @constructor
                 * @param {Object|String} URI string, or an Object with appropriate properties (especially another URI object to clone).
                 * Object must have non-blank 'protocol', 'host', and 'path' properties.
+                * This parameter is optional. If omitted (or set to undefined, null or empty string), then an object will be created
+                * for the default uri of this constructor (e.g. document.location for mw.Uri in MediaWiki core).
                 * @param {Object|Boolean} Object with options, or (backwards compatibility) a boolean for strictMode
                 * - strictMode {Boolean} Trigger strict mode parsing of the url. Default: false
                 * - overrideKeys {Boolean} Wether to let duplicate query parameters override eachother (true) or automagically
                                overrideKeys: false
                        }, options );
 
-                       if ( uri !== undefined && uri !== null || uri !== '' ) {
+                       if ( uri !== undefined && uri !== null && uri !== '' ) {
                                if ( typeof uri === 'string' ) {
                                        this.parse( uri, options );
                                } else if ( typeof uri === 'object' ) {
-                                       var uriObj = this;
-                                       $.each( properties, function ( i, property ) {
-                                               uriObj[property] = uri[property];
-                                       } );
-                                       if ( this.query === undefined ) {
+                                       // Copy data over from existing URI object
+                                       for ( var prop in uri ) {
+                                               // Only copy direct properties, not inherited ones
+                                               if ( uri.hasOwnProperty( prop ) ) {
+                                                       // Deep copy object properties
+                                                       if ( $.isArray( uri[prop] ) || $.isPlainObject( uri[prop] ) ) {
+                                                               this[prop] = $.extend( true, {}, uri[prop] );
+                                                       } else {
+                                                               this[prop] = uri[prop];
+                                                       }
+                                               }
+                                       }
+                                       if ( !this.query ) {
                                                this.query = {};
                                        }
                                }
+                       } else {
+                               // If we didn't get a URI in the constructor, use the default one.
+                               return defaultUri.clone();
                        }
 
                        // protocol-relative URLs
                                var args = [];
                                $.each( this.query, function ( key, val ) {
                                        var k = Uri.encode( key ),
-                                               vals = val === null ? [ null ] : $.makeArray( val );
+                                               vals = $.isArray( val ) ? val : [ val ];
                                        $.each( vals, function ( i, v ) {
                                                args.push( k + ( v === null ? '' : '=' + Uri.encode( v ) ) );
                                        } );
 
                defaultUri = new Uri( documentLocation );
 
-               return Uri;     
+               return Uri;
        };
 
        // if we are running in a browser, inject the current document location, for relative URLs
-       if ( document && document.location && document.location.href ) { 
+       if ( document && document.location && document.location.href ) {
                mw.Uri = mw.UriRelative( document.location.href );
        }
 
index e631c76..36628eb 100644 (file)
@@ -5,12 +5,13 @@
  * @since 1.19
  */
 
-( function ( $, mw, undefined ) {
-"use strict";
+( function ( mw, $ ) {
+       'use strict';
 
-       var hovzer = $.getFootHovzer();
+       var debug,
+               hovzer = $.getFootHovzer();
 
-       var debug = mw.Debug = {
+       debug = mw.Debug = {
                /**
                 * Toolbar container element
                 *
                        paneTriggerBitDiv( 'includes', 'PHP includes', this.data.includes.length );
 
                        var gitInfo = '';
-                       if ( this.data.gitRevision != false ) {
+                       if ( this.data.gitRevision !== false ) {
                                gitInfo = '(' + this.data.gitRevision.substring( 0, 7 ) + ')';
-                               if ( this.data.gitViewUrl != false ) {
-                                       gitInfo = $( '<a></a>' ).attr( 'href', this.data.gitViewUrl ).text( gitInfo );
+                               if ( this.data.gitViewUrl !== false ) {
+                                       gitInfo = $( '<a>' ).attr( 'href', this.data.gitViewUrl ).text( gitInfo );
                                }
                        }
 
                                .append( ': ' + this.data.mwVersion + ' ' )
                                .append( gitInfo );
 
-                       if ( this.data.gitBranch != false ) {
+                       if ( this.data.gitBranch !== false ) {
                                bitDiv( 'gitbranch' ).text( 'Git branch: ' + this.data.gitBranch );
                        }
 
 
                        $table = $( '<table id="mw-debug-console">' );
 
-                       $('<colgroup>').css( 'width', /*padding=*/20 + ( 10*/*fontSize*/11 ) ).appendTo( $table );
+                       $('<colgroup>').css( 'width', /*padding=*/20 + ( 10 * /*fontSize*/11 ) ).appendTo( $table );
                        $('<colgroup>').appendTo( $table );
                        $('<colgroup>').css( 'width', 350 ).appendTo( $table );
 
                }
        };
 
-} )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
index 9a4a729..f0f78c2 100644 (file)
  * Minimal example in how to use it:
  *
  *    var feedback = new mw.Feedback();
- *    $( '#myButton' ).click( function() { feedback.launch(); } );
+ *    $( '#myButton' ).click( function () { feedback.launch(); } );
  *
  * You can also launch the feedback form with a prefilled subject and body.
  * See the docs for the launch() method.
  */
-( function( mw, $, undefined ) {
+( function ( mw, $ ) {
        /**
         * Thingy for collecting user feedback on a wiki page
         * @param {Array} options -- optional, all properties optional.
-        *              api: {mw.Api} if omitted, will just create a standard API
-        *              title: {mw.Title} the title of the page where you collect feedback. Defaults to "Feedback".
-        *              dialogTitleMessageKey: {String} message key for the title of the dialog box
-        *              bugsLink: {mw.Uri|String} url where bugs can be posted
-        *              bugsListLink: {mw.Uri|String} url where bugs can be listed
+        *  api: {mw.Api} if omitted, will just create a standard API
+        *  title: {mw.Title} the title of the page where you collect feedback. Defaults to "Feedback".
+        *  dialogTitleMessageKey: {String} message key for the title of the dialog box
+        *  bugsLink: {mw.Uri|String} url where bugs can be posted
+        *  bugsListLink: {mw.Uri|String} url where bugs can be listed
         */
-       mw.Feedback = function( options ) {
+       mw.Feedback = function ( options ) {
                if ( options === undefined ) {
                        options = {};
                }
        };
 
        mw.Feedback.prototype = {
-               setup: function() {
-                       var _this = this;
+               setup: function () {
+                       var fb = this;
 
-                       var $feedbackPageLink = $( '<a></a>' )
-                               .attr( { 'href': _this.title.getUrl(), 'target': '_blank' } )
+                       var $feedbackPageLink = $( '<a>' )
+                               .attr( { 'href': fb.title.getUrl(), 'target': '_blank' } )
                                .css( { 'white-space': 'nowrap' } );
 
-                       var $bugNoteLink = $( '<a></a>' ).attr( { 'href': '#' } ).click( function() { _this.displayBugs(); } );
+                       var $bugNoteLink = $( '<a>' ).attr( { 'href': '#' } ).click( function () {
+                               fb.displayBugs();
+                       } );
 
-                       var $bugsListLink = $( '<a></a>' ).attr( { 'href': _this.bugsListLink, 'target': '_blank' } );
+                       var $bugsListLink = $( '<a>' ).attr( { 'href': fb.bugsListLink, 'target': '_blank' } );
 
+                       // TODO: Use a stylesheet instead of these inline styles
                        this.$dialog =
-                               $( '<div style="position:relative;"></div>' ).append(
+                               $( '<div style="position: relative;"></div>' ).append(
                                        $( '<div class="feedback-mode feedback-form"></div>' ).append(
-                                               $( '<small></small>' ).append(
-                                                       $( '<p></p>' ).msg(
+                                               $( '<small>' ).append(
+                                                       $( '<p>' ).msg(
                                                                'feedback-bugornote',
                                                                $bugNoteLink,
-                                                               _this.title.getNameText(),
+                                                               fb.title.getNameText(),
                                                                $feedbackPageLink.clone()
                                                        )
                                                ),
-                                               $( '<div style="margin-top:1em;"></div>' ).append(
+                                               $( '<div style="margin-top: 1em;"></div>' ).append(
                                                        mw.msg( 'feedback-subject' ),
-                                                       $( '<br/>' ),
-                                                       $( '<input type="text" class="feedback-subject" name="subject" maxlength="60" style="width:99%;"/>' )
+                                                       $( '<br>' ),
+                                                       $( '<input type="text" class="feedback-subject" name="subject" maxlength="60" style="width: 99%;"/>' )
                                                ),
-                                               $( '<div style="margin-top:0.4em;"></div>' ).append(
+                                               $( '<div style="margin-top: 0.4em;"></div>' ).append(
                                                        mw.msg( 'feedback-message' ),
-                                                       $( '<br/>' ),
-                                                       $( '<textarea name="message" class="feedback-message" style="width:99%;" rows="5" cols="60"></textarea>' )
+                                                       $( '<br>' ),
+                                                       $( '<textarea name="message" class="feedback-message" style="width: 99%;" rows="5" cols="60"></textarea>' )
                                                )
                                        ),
                                        $( '<div class="feedback-mode feedback-bugs"></div>' ).append(
                                                $( '<p>' ).msg( 'feedback-bugcheck', $bugsListLink )
                                        ),
-                                       $( '<div class="feedback-mode feedback-submitting" style="text-align:center;margin:3em 0;"></div>' ).append(
+                                       $( '<div class="feedback-mode feedback-submitting" style="text-align: center; margin: 3em 0;"></div>' ).append(
                                                mw.msg( 'feedback-adding' ),
                                                $( '<br/>' ),
                                                $( '<span class="feedback-spinner"></span>' )
                                        ),
-                                       $( '<div class="feedback-mode feedback-thanks" style="text-align:center;margin:1em"></div>' ).msg(
-                                               'feedback-thanks', _this.title.getNameText(), $feedbackPageLink.clone()
+                                       $( '<div class="feedback-mode feedback-thanks" style="text-align: center; margin:1em"></div>' ).msg(
+                                               'feedback-thanks', fb.title.getNameText(), $feedbackPageLink.clone()
                                        ),
-                                       $( '<div class="feedback-mode feedback-error" style="position:relative;"></div>' ).append(
-                                               $( '<div class="feedback-error-msg style="color:#990000;margin-top:0.4em;"></div>' )
+                                       $( '<div class="feedback-mode feedback-error" style="position: relative;"></div>' ).append(
+                                               $( '<div class="feedback-error-msg style="color: #990000; margin-top: 0.4em;"></div>' )
                                        )
                                );
 
                                // undo some damage from dialog css
-                               this.$dialog.find( 'a' ).css( { 'color': '#0645ad' } );
+                               this.$dialog.find( 'a' ).css( {
+                                       color: '#0645ad'
+                               } );
 
                                this.$dialog.dialog({
                                        width: 500,
                                        autoOpen: false,
                                        title: mw.msg( this.dialogTitleMessageKey ),
                                        modal: true,
-                                       buttons: _this.buttons
+                                       buttons: fb.buttons
                                });
 
                        this.subjectInput = this.$dialog.find( 'input.feedback-subject' ).get(0);
 
                },
 
-               display: function( s ) {
+               display: function ( s ) {
                        this.$dialog.dialog( { buttons:{} } ); // hide the buttons
                        this.$dialog.find( '.feedback-mode' ).hide(); // hide everything
                        this.$dialog.find( '.feedback-' + s ).show(); // show the desired div
                },
 
-               displaySubmitting: function() {
+               displaySubmitting: function () {
                        this.display( 'submitting' );
                },
 
-               displayBugs: function() {
-                       var _this = this;
+               displayBugs: function () {
+                       var fb = this;
                        this.display( 'bugs' );
                        var bugsButtons = {};
-                       bugsButtons[ mw.msg( 'feedback-bugnew' ) ] = function() { window.open( _this.bugsLink, '_blank' ); };
-                       bugsButtons[ mw.msg( 'feedback-cancel' ) ] = function() { _this.cancel(); };
-                       this.$dialog.dialog( { buttons: bugsButtons } );
+                       bugsButtons[ mw.msg( 'feedback-bugnew' ) ] = function () {
+                               window.open( fb.bugsLink, '_blank' );
+                       };
+                       bugsButtons[ mw.msg( 'feedback-cancel' ) ] = function () {
+                               fb.cancel();
+                       };
+                       this.$dialog.dialog( {
+                               buttons: bugsButtons
+                       } );
                },
 
-               displayThanks: function() {
-                       var _this = this;
+               displayThanks: function () {
+                       var fb = this;
                        this.display( 'thanks' );
                        var closeButton = {};
-                       closeButton[ mw.msg( 'feedback-close' ) ] = function() { _this.$dialog.dialog( 'close' ); };
-                       this.$dialog.dialog( { buttons: closeButton } );
+                       closeButton[ mw.msg( 'feedback-close' ) ] = function () {
+                               fb.$dialog.dialog( 'close' );
+                       };
+                       this.$dialog.dialog( {
+                               buttons: closeButton
+                       } );
                },
 
                /**
                 * Display the feedback form
                 * @param {Object} optional prefilled contents for the feedback form. Object with properties:
-                *                                              subject: {String}
-                *                                              message: {String}
+                *  subject: {String}
+                *      message: {String}
                 */
-               displayForm: function( contents ) {
-                       var _this = this;
-                       this.subjectInput.value = (contents && contents.subject) ? contents.subject : '';
-                       this.messageInput.value = (contents && contents.message) ? contents.message : '';
+               displayForm: function ( contents ) {
+                       var fb = this;
+                       this.subjectInput.value = ( contents && contents.subject ) ? contents.subject : '';
+                       this.messageInput.value = ( contents && contents.message ) ? contents.message : '';
 
                        this.display( 'form' );
 
                        // Set up buttons for dialog box. We have to do it the hard way since the json keys are localized
                        var formButtons = {};
-                       formButtons[ mw.msg( 'feedback-submit' ) ] = function() { _this.submit(); };
-                       formButtons[ mw.msg( 'feedback-cancel' ) ] = function() { _this.cancel(); };
+                       formButtons[ mw.msg( 'feedback-submit' ) ] = function () {
+                               fb.submit();
+                       };
+                       formButtons[ mw.msg( 'feedback-cancel' ) ] = function () {
+                               fb.cancel();
+                       };
                        this.$dialog.dialog( { buttons: formButtons } ); // put the buttons back
                },
 
-               displayError: function( message ) {
-                       var _this = this;
+               displayError: function ( message ) {
+                       var fb = this;
                        this.display( 'error' );
                        this.$dialog.find( '.feedback-error-msg' ).msg( message );
                        var closeButton = {};
-                       closeButton[ mw.msg( 'feedback-close' ) ] = function() { _this.$dialog.dialog( 'close' ); };
+                       closeButton[ mw.msg( 'feedback-close' ) ] = function () {
+                               fb.$dialog.dialog( 'close' );
+                       };
                        this.$dialog.dialog( { buttons: closeButton } );
                },
 
-               cancel: function() {
+               cancel: function () {
                        this.$dialog.dialog( 'close' );
                },
 
-               submit: function() {
-                       var _this = this;
+               submit: function () {
+                       var fb = this;
 
                        // get the values to submit
                        var subject = this.subjectInput.value;
 
-                       var message = "<small>User agent: " + navigator.userAgent + "</small>\n\n"
+                       var message = '<small>User agent: ' + mw.html.escape( navigator.userAgent ) + '</small>\n\n'
                                 + this.messageInput.value;
-                       if ( message.indexOf( '~~~' ) == -1 ) {
-                               message += " ~~~~";
+                       if ( message.indexOf( '~~~' ) === -1 ) {
+                               message += ' ~~~~';
                        }
 
                        this.displaySubmitting();
 
-                       var ok = function( result ) {
+                       var ok = function ( result ) {
                                if ( result.edit !== undefined ) {
                                        if ( result.edit.result === 'Success' ) {
-                                               _this.displayThanks();
+                                               fb.displayThanks();
                                        } else {
-                                               _this.displayError( 'feedback-error1' ); // unknown API result
+                                               // unknown API result
+                                               fb.displayError( 'feedback-error1' );
                                        }
                                } else {
-                                       _this.displayError( 'feedback-error2' ); // edit failed
+                                       // edit failed
+                                       fb.displayError( 'feedback-error2' );
                                }
                        };
 
-                       var err = function( code, info ) {
-                               _this.displayError( 'feedback-error3' ); // ajax request failed
+                       var err = function ( code, info ) {
+                               // ajax request failed
+                               fb.displayError( 'feedback-error3' );
                        };
 
                        this.api.newSection( this.title, subject, message, ok, err );
                 *                                              subject: {String}
                 *                                              message: {String}
                 */
-               launch: function( contents ) {
+               launch: function ( contents ) {
                        this.displayForm( contents );
                        this.$dialog.dialog( 'open' );
                        this.subjectInput.focus();
 
        };
 
-} )( window.mediaWiki, jQuery );
+}( mediaWiki, jQuery ) );
index 17a02cf..df62105 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * Utility functions for jazzing up HTMLForm elements
  */
-( function( $ ) {
+( function ( $ ) {
 
 /**
  * jQuery plugin to fade or snap to visible state.
@@ -9,7 +9,7 @@
  * @param boolean instantToggle (optional)
  * @return jQuery
  */
-$.fn.goIn = function( instantToggle ) {
+$.fn.goIn = function ( instantToggle ) {
        if ( instantToggle === true ) {
                return $(this).show();
        }
@@ -22,7 +22,7 @@ $.fn.goIn = function( instantToggle ) {
  * @param boolean instantToggle (optional)
  * @return jQuery
  */
-$.fn.goOut = function( instantToggle ) {
+$.fn.goOut = function ( instantToggle ) {
        if ( instantToggle === true ) {
                return $(this).hide();
        }
@@ -35,20 +35,20 @@ $.fn.goOut = function( instantToggle ) {
  * @param callback function taking one paramter, which is Bool true when the event
  *     is called immediately, and the EventArgs object when triggered from an event
  */
-$.fn.liveAndTestAtStart = function( callback ){
+$.fn.liveAndTestAtStart = function ( callback ){
        $(this)
                .live( 'change', callback )
-               .each( function( index, element ){
+               .each( function ( index, element ){
                        callback.call( this, true );
                } );
 };
 
 // Document ready:
-$( function() {
+$( function () {
 
        // Animate the SelectOrOther fields, to only show the text field when
        // 'other' is selected.
-       $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function( instant ) {
+       $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function ( instant ) {
                var $other = $( '#' + $(this).attr( 'id' ) + '-other' );
                $other = $other.add( $other.siblings( 'br' ) );
                if ( $(this).val() === 'other' ) {
@@ -61,4 +61,4 @@ $( function() {
 });
 
 
-})( jQuery );
+}( jQuery ) );
index 043ebce..def1225 100644 (file)
@@ -1,22 +1,27 @@
 /**
- * Experimental advanced wikitext parser-emitter. 
- * See: http://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
- * 
- * @author neilk@wikimedia.org
- */
-
-( function( mw, $, undefined ) {
-
-       mw.jqueryMsg = {};
+* Experimental advanced wikitext parser-emitter.
+* See: http://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
+*
+* @author neilk@wikimedia.org
+*/
+( function ( mw, $ ) {
+       var slice = Array.prototype.slice,
+               parserDefaults = {
+                       magic : {
+                               'SITENAME' : mw.config.get( 'wgSiteName' )
+                       },
+                       messages : mw.messages,
+                       language : mw.language
+               };
 
        /**
         * Given parser options, return a function that parses a key and replacements, returning jQuery object
         * @param {Object} parser options
         * @return {Function} accepting ( String message key, String replacement1, String replacement2 ... ) and returning {jQuery}
         */
-       function getFailableParserFn( options ) { 
-               var parser = new mw.jqueryMsg.parser( options ); 
-               /** 
+       function getFailableParserFn( options ) {
+               var parser = new mw.jqueryMsg.parser( options );
+               /**
                 * Try to parse a key and optional replacements, returning a jQuery object that may be a tree of jQuery nodes.
                 * If there was an error parsing, return the key and the error message (wrapped in jQuery). This should put the error right into
                 * the interface, without causing the page to halt script execution, and it hopefully should be clearer how to fix it.
                 * @param {Array} first element is the key, replacements may be in array in 2nd element, or remaining elements.
                 * @return {jQuery}
                 */
-               return function( args ) {
+               return function ( args ) {
                        var key = args[0];
-                       var argsArray = $.isArray( args[1] ) ? args[1] : $.makeArray( args ).slice( 1 ); 
-                       var escapedArgsArray = $.map( argsArray, function( arg ) { 
-                               return typeof arg === 'string' ? mw.html.escape( arg ) : arg;
-                       } );
+                       var argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
                        try {
-                               return parser.parse( key, escapedArgsArray );
+                               return parser.parse( key, argsArray );
                        } catch ( e ) {
-                               return $( '<span></span>' ).append( key + ': ' + e.message );
+                               return $( '<span>' ).append( key + ': ' + e.message );
                        }
                };
        }
 
+       mw.jqueryMsg = {};
+
        /**
-        * Class method. 
+        * Class method.
         * Returns a function suitable for use as a global, to construct strings from the message key (and optional replacements).
-        * e.g.  
+        * e.g.
         *       window.gM = mediaWiki.parser.getMessageFunction( options );
         *       $( 'p#headline' ).html( gM( 'hello-user', username ) );
         *
         * @param {Array} parser options
         * @return {Function} function suitable for assigning to window.gM
         */
-       mw.jqueryMsg.getMessageFunction = function( options ) { 
+       mw.jqueryMsg.getMessageFunction = function ( options ) {
                var failableParserFn = getFailableParserFn( options );
-               /** 
+               /**
                 * N.B. replacements are variadic arguments or an array in second parameter. In other words:
-                *    somefunction(a, b, c, d) 
-                * is equivalent to 
+                *    somefunction(a, b, c, d)
+                * is equivalent to
                 *    somefunction(a, [b, c, d])
                 *
                 * @param {String} message key
                 * @param {Array} optional replacements (can also specify variadically)
                 * @return {String} rendered HTML as string
                 */
-               return function( /* key, replacements */ ) {
+               return function ( /* key, replacements */ ) {
                        return failableParserFn( arguments ).html();
                };
        };
 
        /**
-        * Class method. 
-        * Returns a jQuery plugin which parses the message in the message key, doing replacements optionally, and appends the nodes to 
-        * the current selector. Bindings to passed-in jquery elements are preserved. Functions become click handlers for [$1 linktext] links.  
-        * e.g.  
+        * Class method.
+        * Returns a jQuery plugin which parses the message in the message key, doing replacements optionally, and appends the nodes to
+        * the current selector. Bindings to passed-in jquery elements are preserved. Functions become click handlers for [$1 linktext] links.
+        * e.g.
         *        $.fn.msg = mediaWiki.parser.getJqueryPlugin( options );
-        *        var userlink = $( '<a>' ).click( function() { alert( "hello!!") } );
+        *        var userlink = $( '<a>' ).click( function () { alert( "hello!!") } );
         *        $( 'p#headline' ).msg( 'hello-user', userlink );
         *
         * @param {Array} parser options
         * @return {Function} function suitable for assigning to jQuery plugin, such as $.fn.msg
         */
-       mw.jqueryMsg.getPlugin = function( options ) {
+       mw.jqueryMsg.getPlugin = function ( options ) {
                var failableParserFn = getFailableParserFn( options );
-               /** 
+               /**
                 * N.B. replacements are variadic arguments or an array in second parameter. In other words:
-                *    somefunction(a, b, c, d) 
-                * is equivalent to 
+                *    somefunction(a, b, c, d)
+                * is equivalent to
                 *    somefunction(a, [b, c, d])
-                * 
+                *
                 * We append to 'this', which in a jQuery plugin context will be the selected elements.
                 * @param {String} message key
                 * @param {Array} optional replacements (can also specify variadically)
                 * @return {jQuery} this
                 */
-               return function( /* key, replacements */ ) {
+               return function ( /* key, replacements */ ) {
                        var $target = this.empty();
-                       $.each( failableParserFn( arguments ).contents(), function( i, node ) {
+                       $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
                                $target.append( node );
                        } );
                        return $target;
                };
        };
 
-       var parserDefaults = { 
-               'magic' : {
-                       'SITENAME' : mw.config.get( 'wgSiteName' )
-               },
-               'messages' : mw.messages,
-               'language' : mw.language
-       };
-
        /**
         * The parser itself.
         * Describes an object, whose primary duty is to .parse() message keys.
         * @param {Array} options
         */
-       mw.jqueryMsg.parser = function( options ) {
+       mw.jqueryMsg.parser = function ( options ) {
                this.settings = $.extend( {}, parserDefaults, options );
                this.emitter = new mw.jqueryMsg.htmlEmitter( this.settings.language, this.settings.magic );
        };
 
        mw.jqueryMsg.parser.prototype = {
-
                // cache, map of mediaWiki message key to the AST of the message. In most cases, the message is a string so this is identical.
                // (This is why we would like to move this functionality server-side).
                astCache: {},
                 * @param {Array} replacements for $1, $2... $n
                 * @return {jQuery}
                 */
-               parse: function( key, replacements ) {
+               parse: function ( key, replacements ) {
                        return this.emitter.emit( this.getAst( key ), replacements );
                },
-
                /**
-                * Fetch the message string associated with a key, return parsed structure. Memoized.
-                * Note that we pass '[' + key + ']' back for a missing message here. 
-                * @param {String} key
+                * Fetch the message string associated with a key, return parsed structure. Memoized.
+                * Note that we pass '[' + key + ']' back for a missing message here.
+                * @param {String} key
                 * @return {String|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
                 */
-               getAst: function( key ) {
-                       if ( this.astCache[ key ] === undefined ) { 
+               getAst: function ( key ) {
+                       if ( this.astCache[ key ] === undefined ) {
                                var wikiText = this.settings.messages.get( key );
                                if ( typeof wikiText !== 'string' ) {
                                        wikiText = "\\[" + key + "\\]";
                                }
                                this.astCache[ key ] = this.wikiTextToAst( wikiText );
                        }
-                       return this.astCache[ key ];    
+                       return this.astCache[ key ];
                },
-
                /*
                 * Parses the input wikiText into an abstract syntax tree, essentially an s-expression.
                 *
                 * CAVEAT: This does not parse all wikitext. It could be more efficient, but it's pretty good already.
                 * n.b. We want to move this functionality to the server. Nothing here is required to be on the client.
-                * 
+                *
                 * @param {String} message string wikitext
                 * @throws Error
                 * @return {Mixed} abstract syntax tree
                 */
-               wikiTextToAst: function( input ) {
-                       
-                       // Indicates current position in input as we parse through it.  
-                       // Shared among all parsing functions below. 
-                       var pos = 0;
+               wikiTextToAst: function ( input ) {
 
+                       // Indicates current position in input as we parse through it.
+                       // Shared among all parsing functions below.
+                       var pos = 0;
                        // =========================================================
                        // parsing combinators - could be a library on its own
                        // =========================================================
-
-
-                       // Try parsers until one works, if none work return null 
+                       // Try parsers until one works, if none work return null
                        function choice( ps ) {
-                               return function() {
+                               return function () {
                                        for ( var i = 0; i < ps.length; i++ ) {
                                                var result = ps[i]();
                                                if ( result !== null ) {
                                        return null;
                                };
                        }
-
                        // try several ps in a row, all must succeed or return null
                        // this is the only eager one
                        function sequence( ps ) {
                                var originalPos = pos;
                                var result = [];
-                               for ( var i = 0; i < ps.length; i++ ) { 
+                               for ( var i = 0; i < ps.length; i++ ) {
                                        var res = ps[i]();
                                        if ( res === null ) {
                                                pos = originalPos;
                                                return null;
-                                       } 
+                                       }
                                        result.push( res );
                                }
                                return result;
                        }
-
                        // run the same parser over and over until it fails.
                        // must succeed a minimum of n times or return null
                        function nOrMore( n, p ) {
-                               return function() {
+                               return function () {
                                        var originalPos = pos;
                                        var result = [];
                                        var parsed = p();
                                        if ( result.length < n ) {
                                                pos = originalPos;
                                                return null;
-                                       } 
+                                       }
                                        return result;
                                };
                        }
-
                        // There is a general pattern -- parse a thing, if that worked, apply transform, otherwise return null.
                        // But using this as a combinator seems to cause problems when combined with nOrMore().
                        // May be some scoping issue
                        function transform( p, fn ) {
-                               return function() { 
+                               return function () {
                                        var result = p();
                                        return result === null ? null : fn( result );
                                };
                        }
-
                        // Helpers -- just make ps out of simpler JS builtin types
-
-                       function makeStringParser( s ) { 
+                       function makeStringParser( s ) {
                                var len = s.length;
-                               return function() {
+                               return function () {
                                        var result = null;
                                        if ( input.substr( pos, len ) === s ) {
                                                 result = s;
                                        return result;
                                };
                        }
-
                        function makeRegexParser( regex ) {
-                               return function() { 
+                               return function () {
                                        var matches = input.substr( pos ).match( regex );
-                                       if ( matches === null ) { 
+                                       if ( matches === null ) {
                                                return null;
-                                       } 
+                                       }
                                        pos += matches[0].length;
                                        return matches[0];
                                };
                        }
-                                                
 
-                       /** 
-                        *  =================================================================== 
+                       /**
+                        *  ===================================================================
                         *  General patterns above this line -- wikitext specific parsers below
-                        *  =================================================================== 
+                        *  ===================================================================
                         */
-
                        // Parsing functions follow. All parsing functions work like this:
                        // They don't accept any arguments.
                        // Instead, they just operate non destructively on the string 'input'
                        // As they can consume parts of the string, they advance the shared variable pos,
                        // and return tokens (or whatever else they want to return).
-
                        // some things are defined as closures and other things as ordinary functions
                        // converting everything to a closure makes it a lot harder to debug... errors pop up
                        // but some debuggers can't tell you exactly where they come from. Also the mutually
                        // recursive functions seem not to work in all browsers then. (Tested IE6-7, Opera, Safari, FF)
                        // This may be because, to save code, memoization was removed
-
-
-                       var regularLiteral = makeRegexParser( /^[^{}[\]$\\]/ );
-                       var regularLiteralWithoutBar = makeRegexParser(/^[^{}[\]$\\|]/);
-                       var regularLiteralWithoutSpace = makeRegexParser(/^[^{}[\]$\s]/);
-
+                       var regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
+                       var regularLiteralWithoutBar = makeRegexParser(/^[^{}\[\]$\\|]/);
+                       var regularLiteralWithoutSpace = makeRegexParser(/^[^{}\[\]$\s]/);
                        var backslash = makeStringParser( "\\" );
                        var anyCharacter = makeRegexParser( /^./ );
-
                        function escapedLiteral() {
                                var result = sequence( [
-                                       backslash, 
+                                       backslash,
                                        anyCharacter
                                ] );
                                return result === null ? null : result[1];
                        }
-
                        var escapedOrLiteralWithoutSpace = choice( [
                                escapedLiteral,
                                regularLiteralWithoutSpace
                        ] );
-
                        var escapedOrLiteralWithoutBar = choice( [
                                escapedLiteral,
                                regularLiteralWithoutBar
                        ] );
-
-                       var escapedOrRegularLiteral = choice( [ 
+                       var escapedOrRegularLiteral = choice( [
                                escapedLiteral,
                                regularLiteral
                        ] );
-
                        // Used to define "literals" without spaces, in space-delimited situations
                        function literalWithoutSpace() {
                                 var result = nOrMore( 1, escapedOrLiteralWithoutSpace )();
                                 return result === null ? null : result.join('');
                        }
-
-                       // Used to define "literals" within template parameters. The pipe character is the parameter delimeter, so by default 
+                       // Used to define "literals" within template parameters. The pipe character is the parameter delimeter, so by default
                        // it is not a literal in the parameter
                        function literalWithoutBar() {
                                 var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
                                 return result === null ? null : result.join('');
                        }
-
                        function literal() {
                                 var result = nOrMore( 1, escapedOrRegularLiteral )();
                                 return result === null ? null : result.join('');
                        }
-
-                       var whitespace = makeRegexParser( /^\s+/ ); 
+                       var whitespace = makeRegexParser( /^\s+/ );
                        var dollar = makeStringParser( '$' );
-                       var digits = makeRegexParser( /^\d+/ );   
+                       var digits = makeRegexParser( /^\d+/ );
 
                        function replacement() {
                                var result = sequence( [
                                        dollar,
                                        digits
                                ] );
-                               if ( result === null ) { 
+                               if ( result === null ) {
                                        return null;
                                }
                                return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
                        }
-
-
                        var openExtlink = makeStringParser( '[' );
                        var closeExtlink = makeStringParser( ']' );
-
                        // this extlink MUST have inner text, e.g. [foo] not allowed; [foo bar] is allowed
                        function extlink() {
                                var result = null;
                                }
                                return result;
                        }
-
+                       // this is the same as the above extlink, except that the url is being passed on as a parameter
+                       function extLinkParam() {
+                               var result = sequence( [
+                                       openExtlink,
+                                       dollar,
+                                       digits,
+                                       whitespace,
+                                       expression,
+                                       closeExtlink
+                               ] );
+                               if ( result === null ) {
+                                       return null;
+                               }
+                               return [ 'LINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
+                       }
                        var openLink = makeStringParser( '[[' );
                        var closeLink = makeStringParser( ']]' );
-
                        function link() {
                                var result = null;
                                var parsedResult = sequence( [
                                }
                                return result;
                        }
-
-                       var templateName = transform( 
+                       var templateName = transform(
                                // see $wgLegalTitleChars
                                // not allowing : due to the need to catch "PLURAL:$1"
-                               makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+-]+/ ),
-                               function( result ) { return result.toString(); }
+                               makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+\-]+/ ),
+                               function ( result ) { return result.toString(); }
                        );
-
                        function templateParam() {
-                               var result = sequence( [ 
+                               var result = sequence( [
                                        pipe,
                                        nOrMore( 0, paramExpression )
                                ] );
                                // use a "CONCAT" operator if there are multiple nodes, otherwise return the first node, raw.
                                return expr.length > 1 ? [ "CONCAT" ].concat( expr ) : expr[0];
                        }
-
                        var pipe = makeStringParser( '|' );
-
                        function templateWithReplacement() {
                                var result = sequence( [
                                        templateName,
                                ] );
                                return result === null ? null : [ result[0], result[2] ];
                        }
-
                        function templateWithOutReplacement() {
                                var result = sequence( [
                                        templateName,
                                ] );
                                return result === null ? null : [ result[0], result[2] ];
                        }
-
                        var colon = makeStringParser(':');
-
                        var templateContents = choice( [
-                               function() {
+                               function () {
                                        var res = sequence( [
                                                // templates can have placeholders for dynamic replacement eg: {{PLURAL:$1|one car|$1 cars}}
                                                // or no placeholders eg: {{GRAMMAR:genitive|{{SITENAME}}}
                                        ] );
                                        return res === null ? null : res[0].concat( res[1] );
                                },
-                               function() { 
+                               function () {
                                        var res = sequence( [
                                                templateName,
-                                               nOrMore( 0, templateParam ) 
+                                               nOrMore( 0, templateParam )
                                        ] );
                                        if ( res === null ) {
                                                return null;
                                        return [ res[0] ].concat( res[1] );
                                }
                        ] );
-
                        var openTemplate = makeStringParser('{{');
                        var closeTemplate = makeStringParser('}}');
-
                        function template() {
                                var result = sequence( [
                                        openTemplate,
                                ] );
                                return result === null ? null : result[1];
                        }
-
                        var nonWhitespaceExpression = choice( [
-                               template,        
+                               template,
                                link,
+                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutSpace
                        ] );
-
                        var paramExpression = choice( [
-                               template,        
+                               template,
                                link,
+                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutBar
                        ] );
-
-                       var expression = choice( [ 
+                       var expression = choice( [
                                template,
                                link,
+                               extLinkParam,
                                extlink,
                                replacement,
-                               literal 
+                               literal
                        ] );
-
                        function start() {
                                var result = nOrMore( 0, expression )();
                                if ( result === null ) {
                                }
                                return [ "CONCAT" ].concat( result );
                        }
-
                        // everything above this point is supposed to be stateless/static, but
                        // I am deferring the work of turning it into prototypes & objects. It's quite fast enough
-
                        // finally let's do some actual work...
-
                        var result = start();
-                       
+
                        /*
-                        * For success, the p must have gotten to the end of the input 
+                        * For success, the p must have gotten to the end of the input
                         * and returned a non-null.
                         * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
                         */
                        }
                        return result;
                }
-                       
-       };
 
+       };
        /**
         * htmlEmitter - object which primarily exists to emit HTML from parser ASTs
         */
-       mw.jqueryMsg.htmlEmitter = function( language, magic ) {
+       mw.jqueryMsg.htmlEmitter = function ( language, magic ) {
                this.language = language;
-               var _this = this;
-
-               $.each( magic, function( key, val ) { 
-                       _this[ key.toLowerCase() ] = function() { return val; };
+               var jmsg = this;
+               $.each( magic, function ( key, val ) {
+                       jmsg[ key.toLowerCase() ] = function () {
+                               return val;
+                       };
                } );
-
                /**
                 * (We put this method definition here, and not in prototype, to make sure it's not overwritten by any magic.)
                 * Walk entire node structure, applying replacements and template functions when appropriate
                 * @param {Array} replacements for $1, $2, ... $n
                 * @return {Mixed} single-string node or array of nodes suitable for jQuery appending
                 */
-               this.emit = function( node, replacements ) {
+               this.emit = function ( node, replacements ) {
                        var ret = null;
-                       var _this = this;
-                       switch( typeof node ) {
+                       var jmsg = this;
+                       switch ( typeof node ) {
                                case 'string':
                                case 'number':
                                        ret = node;
                                        break;
                                case 'object': // node is an array of nodes
-                                       var subnodes = $.map( node.slice( 1 ), function( n ) { 
-                                               return _this.emit( n, replacements );
+                                       var subnodes = $.map( node.slice( 1 ), function ( n ) {
+                                               return jmsg.emit( n, replacements );
                                        } );
                                        var operation = node[0].toLowerCase();
-                                       if ( typeof _this[operation] === 'function' ) { 
-                                               ret = _this[ operation ]( subnodes, replacements );
+                                       if ( typeof jmsg[operation] === 'function' ) {
+                                               ret = jmsg[ operation ]( subnodes, replacements );
                                        } else {
-                                               throw new Error( 'unknown operation "' + operation + '"' );
+                                               throw new Error( 'Unknown operation "' + operation + '"' );
                                        }
                                        break;
                                case 'undefined':
                                        ret = '';
                                        break;
                                default:
-                                       throw new Error( 'unexpected type in AST: ' + typeof node );
+                                       throw new Error( 'Unexpected type in AST: ' + typeof node );
                        }
                        return ret;
                };
-
        };
-
        // For everything in input that follows double-open-curly braces, there should be an equivalent parser
-       // function. For instance {{PLURAL ... }} will be processed by 'plural'. 
+       // function. For instance {{PLURAL ... }} will be processed by 'plural'.
        // If you have 'magic words' then configure the parser to have them upon creation.
        //
        // An emitter method takes the parent node, the array of subnodes and the array of replacements (the values that $1, $2... should translate to).
        // Note: all such functions must be pure, with the exception of referring to other pure functions via this.language (convertPlural and so on)
        mw.jqueryMsg.htmlEmitter.prototype = {
-
                /**
                 * Parsing has been applied depth-first we can assume that all nodes here are single nodes
                 * Must return a single node to parents -- a jQuery with synthetic span
                 * @param {Array} nodes - mixed, some single nodes, some arrays of nodes
                 * @return {jQuery}
                 */
-               concat: function( nodes ) {
-                       var span = $( '<span>' ).addClass( 'mediaWiki_htmlEmitter' );
-                       $.each( nodes, function( i, node ) { 
+               concat: function ( nodes ) {
+                       var $span = $( '<span>' ).addClass( 'mediaWiki_htmlEmitter' );
+                       $.each( nodes, function ( i, node ) {
                                if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
-                                       $.each( node.contents(), function( j, childNode ) {
-                                               span.append( childNode );
+                                       $.each( node.contents(), function ( j, childNode ) {
+                                               $span.append( childNode );
                                        } );
                                } else {
                                        // strings, integers, anything else
-                                       span.append( node );
+                                       $span.append( node );
                                }
                        } );
-                       return span;
+                       return $span;
                },
 
                /**
-                * Return replacement of correct index, or string if unavailable.
+                * Return escaped replacement of correct index, or string if unavailable.
                 * Note that we expect the parsed parameter to be zero-based. i.e. $1 should have become [ 0 ].
                 * if the specified parameter is not found return the same string
                 * (e.g. "$99" -> parameter 98 -> not found -> return "$99" )
                 * @param {Array} of one element, integer, n >= 0
                 * @return {String} replacement
                 */
-               replace: function( nodes, replacements ) {
+               replace: function ( nodes, replacements ) {
                        var index = parseInt( nodes[0], 10 );
-                       return index < replacements.length ? replacements[index] : '$' + ( index + 1 ); 
+
+                       if ( index < replacements.length ) {
+                               if ( typeof arg === 'string' ) {
+                                       // replacement is a string, escape it
+                                       return mw.html.escape( replacements[index] );
+                               } else {
+                                       // replacement is no string, don't touch!
+                                       return replacements[index];
+                               }
+                       } else {
+                               // index not found, fallback to displaying variable
+                               return '$' + ( index + 1 );
+                       }
                },
 
-               /** 
+               /**
                 * Transform wiki-link
-                * TODO unimplemented 
+                * TODO unimplemented
                 */
-               wlink: function( nodes ) {
-                       return "unimplemented";
+               wlink: function ( nodes ) {
+                       return 'unimplemented';
                },
 
                /**
                 * If the href is a jQuery object, treat it as "enclosing" the link text.
                 *              ... function, treat it as the click handler
                 *              ... string, treat it as a URI
-                * TODO: throw an error if nodes.length > 2 ? 
+                * TODO: throw an error if nodes.length > 2 ?
                 * @param {Array} of two elements, {jQuery|Function|String} and {String}
                 * @return {jQuery}
                 */
-               link: function( nodes ) {
+               link: function ( nodes ) {
                        var arg = nodes[0];
                        var contents = nodes[1];
-                       var $el; 
+                       var $el;
                        if ( arg instanceof jQuery ) {
                                $el = arg;
                        } else {
                                        $el.attr( 'href', arg.toString() );
                                }
                        }
-                       $el.append( contents ); 
+                       $el.append( contents );
                        return $el;
                },
 
+               /**
+                * This is basically use a combination of replace + link (link with parameter
+                * as url), but we don't want to run the regular replace here-on: inserting a
+                * url as href-attribute of a link will automatically escape it already, so
+                * we don't want replace to (manually) escape it as well.
+                * TODO throw error if nodes.length > 1 ?
+                * @param {Array} of one element, integer, n >= 0
+                * @return {String} replacement
+                */
+               linkparam: function ( nodes, replacements ) {
+                       var replacement,
+                               index = parseInt( nodes[0], 10 );
+                       if ( index < replacements.length) {
+                               replacement = replacements[index];
+                       } else {
+                               replacement = '$' + ( index + 1 );
+                       }
+                       return this.link( [ replacement, nodes[1] ] );
+               },
+
                /**
                 * Transform parsed structure into pluralization
                 * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
                 * So convert it back with the current language's convertNumber.
-                * @param {Array} of nodes, [ {String|Number}, {String}, {String} ... ] 
+                * @param {Array} of nodes, [ {String|Number}, {String}, {String} ... ]
                 * @return {String} selected pluralized form according to current language
                 */
-               plural: function( nodes ) { 
+               plural: function ( nodes ) {
                        var count = parseInt( this.language.convertNumber( nodes[0], true ), 10 );
                        var forms = nodes.slice(1);
                        return forms.length ? this.language.convertPlural( count, forms ) : '';
                /**
                 * Transform parsed structure into gender
                 * Usage {{gender:[gender| mw.user object ] | masculine|feminine|neutral}}.
-                * @param {Array} of nodes, [ {String|mw.User}, {String}, {String} , {String} ] 
+                * @param {Array} of nodes, [ {String|mw.User}, {String}, {String} , {String} ]
                 * @return {String} selected gender form according to current language
                 */
-               gender: function( nodes ) { 
+               gender: function ( nodes ) {
                        var gender;
                        if  ( nodes[0] && nodes[0].options instanceof mw.Map ){
                                gender = nodes[0].options.get( 'gender' );
                 * @param {Array} of nodes [{Grammar case eg: genitive}, {String word}]
                 * @return {String} selected grammatical form according to current language
                 */
-               grammar: function( nodes ) {
+               grammar: function ( nodes ) {
                        var form = nodes[0];
                        var word = nodes[1];
                        return word && form && this.language.convertGrammar( word, form );
                }
        };
-
-       // deprecated! don't rely on gM existing.
-       // the window.gM ought not to be required - or if required, not required here. But moving it to extensions breaks it (?!)
+       // Deprecated! don't rely on gM existing.
+       // The window.gM ought not to be required - or if required, not required here.
+       // But moving it to extensions breaks it (?!)
        // Need to fix plugin so it could do attributes as well, then will be okay to remove this.
-       window.gM = mw.jqueryMsg.getMessageFunction(); 
-
+       window.gM = mw.jqueryMsg.getMessageFunction();
        $.fn.msg = mw.jqueryMsg.getPlugin();
-       
+
        // Replace the default message parser with jqueryMsg
        var oldParser = mw.Message.prototype.parser;
-       mw.Message.prototype.parser = function() {
+       mw.Message.prototype.parser = function () {
                // TODO: should we cache the message function so we don't create a new one every time? Benchmark this maybe?
                // Caching is somewhat problematic, because we do need different message functions for different maps, so
                // we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
-               
                // Do not use mw.jqueryMsg unless required
                if ( this.map.get( this.key ).indexOf( '{{' ) < 0 ) {
                        // Fall back to mw.msg's simple parser
                        return oldParser.apply( this );
                }
-               
                var messageFunction = mw.jqueryMsg.getMessageFunction( { 'messages': this.map } );
                return messageFunction( this.key, this.parameters );
        };
 
-} )( mediaWiki, jQuery );
+}( mediaWiki, jQuery ) );
index 66309bb..f0e464d 100644 (file)
@@ -1,5 +1,3 @@
-/*jslint browser: true, continue: true, white: true, forin: true*/
-/*global jQuery*/
 /*
  * Core MediaWiki JavaScript Library
  */
@@ -9,7 +7,9 @@ var mw = ( function ( $, undefined ) {
 
        /* Private Members */
 
-       var hasOwn = Object.prototype.hasOwnProperty;
+       var hasOwn = Object.prototype.hasOwnProperty,
+               slice = Array.prototype.slice;
+
        /* Object constructors */
 
        /**
@@ -45,7 +45,7 @@ var mw = ( function ( $, undefined ) {
                        var results, i;
 
                        if ( $.isArray( selection ) ) {
-                               selection = $.makeArray( selection );
+                               selection = slice.call( selection );
                                results = {};
                                for ( i = 0; i < selection.length; i += 1 ) {
                                        results[selection[i]] = this.get( selection[i], fallback );
@@ -130,7 +130,7 @@ var mw = ( function ( $, undefined ) {
                this.format = 'plain';
                this.map = map;
                this.key = key;
-               this.parameters = parameters === undefined ? [] : $.makeArray( parameters );
+               this.parameters = parameters === undefined ? [] : slice.call( parameters );
                return this;
        }
 
@@ -141,7 +141,7 @@ var mw = ( function ( $, undefined ) {
                 *
                 * This function will not be called for nonexistent messages.
                 */
-               parser: function() {
+               parser: function () {
                        var parameters = this.parameters;
                        return this.map.get( this.key ).replace( /\$(\d+)/g, function ( str, match ) {
                                var index = parseInt( match, 10 ) - 1;
@@ -168,7 +168,7 @@ var mw = ( function ( $, undefined ) {
                 *
                 * @return string Message as a string in the current form or <key> if key does not exist.
                 */
-               toString: function() {
+               toString: function () {
                        var text;
 
                        if ( !this.exists() ) {
@@ -205,7 +205,7 @@ var mw = ( function ( $, undefined ) {
                 *
                 * @return {string} String form of parsed message
                 */
-               parse: function() {
+               parse: function () {
                        this.format = 'parse';
                        return this.toString();
                },
@@ -215,7 +215,7 @@ var mw = ( function ( $, undefined ) {
                 *
                 * @return {string} String form of plain message
                 */
-               plain: function() {
+               plain: function () {
                        this.format = 'plain';
                        return this.toString();
                },
@@ -225,7 +225,7 @@ var mw = ( function ( $, undefined ) {
                 *
                 * @return {string} String form of html escaped message
                 */
-               escaped: function() {
+               escaped: function () {
                        this.format = 'escaped';
                        return this.toString();
                },
@@ -235,7 +235,7 @@ var mw = ( function ( $, undefined ) {
                 *
                 * @return {string} String form of parsed message
                 */
-               exists: function() {
+               exists: function () {
                        return this.map.exists( this.key );
                }
        };
@@ -247,7 +247,7 @@ var mw = ( function ( $, undefined ) {
                 * Dummy function which in debug mode can be replaced with a function that
                 * emulates console.log in console-less environments.
                 */
-               log: function() { },
+               log: function () { },
 
                /**
                 * @var constructor Make the Map constructor publicly available.
@@ -298,7 +298,7 @@ var mw = ( function ( $, undefined ) {
                        var parameters;
                        // Support variadic arguments
                        if ( parameter_1 !== undefined ) {
-                               parameters = $.makeArray( arguments );
+                               parameters = slice.call( arguments );
                                parameters.shift();
                        } else {
                                parameters = [];
@@ -307,7 +307,7 @@ var mw = ( function ( $, undefined ) {
                },
 
                /**
-                * Gets a message string, similar to wfMsg()
+                * Gets a message string, similar to wfMessage()
                 *
                 * @param key string Key of message to get
                 * @param parameters mixed First argument in a list of variadic arguments,
@@ -341,7 +341,7 @@ var mw = ( function ( $, undefined ) {
                         *      {
                         *              'moduleName': {
                         *                      'version': ############## (unix timestamp),
-                        *                      'dependencies': ['required.foo', 'bar.also', ...], (or) function() {}
+                        *                      'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
                         *                      'group': 'somegroup', (or) null,
                         *                      'source': 'local', 'someforeignwiki', (or) null
                         *                      'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing'
@@ -351,7 +351,7 @@ var mw = ( function ( $, undefined ) {
                         *              }
                         *      }
                         */
-                       var     registry = {},
+                       var registry = {},
                                /**
                                 * Mapping of sources, keyed by source-id, values are objects.
                                 * Format:
@@ -368,17 +368,9 @@ var mw = ( function ( $, undefined ) {
                                queue = [],
                                // List of callback functions waiting for modules to be ready to be called
                                jobs = [],
-                               // Flag indicating that document ready has occured
-                               ready = false,
                                // Selector cache for the marker element. Use getMarker() to get/use the marker!
                                $marker = null;
 
-                       /* Cache document ready status */
-
-                       $(document).ready( function () {
-                               ready = true;
-                       } );
-
                        /* Private methods */
 
                        function getMarker() {
@@ -626,17 +618,23 @@ var mw = ( function ( $, undefined ) {
 
                        /**
                         * Log a message to window.console, if possible. Useful to force logging of some
-                        * errors that are otherwise hard to detect, even if mw.log is not available. (I.e.,
-                        * this logs also if not in debug mode.)
+                        * errors that are otherwise hard to detect (I.e., this logs also in production mode).
+                        * Gets console references in each invocation, so that delayed debugging tools work
+                        * fine. No need for optimization here, which would only result in losing logs.
                         *
-                        * @param msg String text for the log entry
-                        * @param e   Error [optional] to also log.
+                        * @param msg String text for the log entry.
+                        * @param e Error [optional] to also log.
                         */
                        function log( msg, e ) {
-                               if ( window.console && typeof window.console.log === 'function' ) {
+                               var console = window.console;
+                               if ( console && console.log ) {
                                        console.log( msg );
-                                       if ( e ) {
-                                               console.log( e );
+                                       // If we have an exception object, log it through .error() to trigger
+                                       // proper stacktraces in browsers that support it. There are no (known)
+                                       // browsers that don't support .error(), that do support .log() and
+                                       // have useful exception handling through .log().
+                                       if ( e && console.error ) {
+                                               console.error( e );
                                        }
                                }
                        }
@@ -693,7 +691,7 @@ var mw = ( function ( $, undefined ) {
                                                                } catch ( ex ) {
                                                                        // A user-defined operation raised an exception. Swallow to protect
                                                                        // our state machine!
-                                                                       log( 'mw.loader::handlePending> Exception thrown by job.error()', ex );
+                                                                       log( 'Exception thrown by job.error()', ex );
                                                                }
                                                        }
                                                }
@@ -719,8 +717,13 @@ var mw = ( function ( $, undefined ) {
                         * @param callback Function: Optional callback which will be run when the script is done
                         */
                        function addScript( src, callback, async ) {
-                               var done = false, script, head;
-                               if ( ready || async ) {
+                               /*jshint evil:true */
+                               var script, head,
+                                       done = false;
+
+                               // Using isReady directly instead of storing it locally from
+                               // a $.fn.ready callback (bug 31895).
+                               if ( $.isReady || async ) {
                                        // jQuery's getScript method is NOT better than doing this the old-fashioned way
                                        // because jQuery will eval the script's code, and errors will not have sane
                                        // line numbers.
@@ -729,7 +732,7 @@ var mw = ( function ( $, undefined ) {
                                        script.setAttribute( 'type', 'text/javascript' );
                                        if ( $.isFunction( callback ) ) {
                                                // Attach handlers for all browsers (based on jQuery.ajax)
-                                               script.onload = script.onreadystatechange = function() {
+                                               script.onload = script.onreadystatechange = function () {
 
                                                        if (
                                                                !done
@@ -766,7 +769,7 @@ var mw = ( function ( $, undefined ) {
                                                // scripts only start loading after  the document has been rendered,
                                                // but so be it. Opera users don't deserve faster web pages if their
                                                // browser makes it impossible
-                                               $( function() { document.body.appendChild( script ); } );
+                                               $( function () { document.body.appendChild( script ); } );
                                        } else {
                                                // IE-safe way of getting the <head> . document.documentElement.head doesn't
                                                // work in scripts that run in the <head>
@@ -828,7 +831,7 @@ var mw = ( function ( $, undefined ) {
                                // Execute script
                                try {
                                        script = registry[module].script;
-                                       markModuleReady = function() {
+                                       markModuleReady = function () {
                                                registry[module].state = 'ready';
                                                handlePending( module );
                                        };
@@ -841,7 +844,7 @@ var mw = ( function ( $, undefined ) {
                                                        return;
                                                }
 
-                                               addScript( arr[i], function() {
+                                               addScript( arr[i], function () {
                                                        nestedAddScript( arr, callback, async, i + 1 );
                                                }, async );
                                        };
@@ -850,8 +853,9 @@ var mw = ( function ( $, undefined ) {
                                                registry[module].state = 'loading';
                                                nestedAddScript( script, markModuleReady, registry[module].async, 0 );
                                        } else if ( $.isFunction( script ) ) {
+                                               registry[module].state = 'ready';
                                                script( $ );
-                                               markModuleReady();
+                                               handlePending( module );
                                        }
                                } catch ( e ) {
                                        // This needs to NOT use mw.log because these errors are common in production mode
@@ -878,15 +882,6 @@ var mw = ( function ( $, undefined ) {
                                // Allow calling by single module name
                                if ( typeof dependencies === 'string' ) {
                                        dependencies = [dependencies];
-                                       if ( registry[dependencies[0]] !== undefined ) {
-                                               // Cache repetitively accessed deep level object member
-                                               regItemDeps = registry[dependencies[0]].dependencies;
-                                               // Cache to avoid looped access to length property
-                                               regItemDepLen = regItemDeps.length;
-                                               for ( n = 0; n < regItemDepLen; n += 1 ) {
-                                                       dependencies[dependencies.length] = regItemDeps[n];
-                                               }
-                                       }
                                }
 
                                // Add ready and error callbacks if they were given
@@ -1332,7 +1327,7 @@ var mw = ( function ( $, undefined ) {
                                                }
                                        }
 
-                                       if (filtered.length === 0) {
+                                       if ( filtered.length === 0 ) {
                                                return;
                                        }
                                        // Resolve entire dependency map
index ad4c73d..9ce8305 100644 (file)
@@ -6,7 +6,7 @@
  * @author Trevor Parscal <tparscal@wikimedia.org>
  */
 
-( function ( $ ) {
+( function ( mw, $ ) {
 
        /**
         * Logs a message to the console.
@@ -17,7 +17,7 @@
         *
         * @param {String} First in list of variadic messages to output to console.
         */
-       mw.log = function( /* logmsg, logmsg, */ ) {
+       mw.log = function ( /* logmsg, logmsg, */ ) {
                // 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)
@@ -67,4 +67,4 @@
                } );
        };
 
-})( jQuery );
+}( mediaWiki, jQuery ) );
index 7f881b0..b5f124b 100644 (file)
@@ -2,7 +2,7 @@
  * Implementation for mediaWiki.user
  */
 
-(function( $ ) {
+( function ( mw, $ ) {
 
        /**
         * User object
                /* Private Members */
 
                var that = this;
+               var callbacks = {};
+
+               /**
+                * Gets the current user's groups or rights.
+                * @param {String} info: One of 'groups' or 'rights'.
+                * @param {Function} callback
+                */
+               function getUserInfo( info, callback ) {
+                       var api;
+                       if ( callbacks[info] ) {
+                               callbacks[info].add( callback );
+                               return;
+                       }
+                       callbacks.rights = $.Callbacks('once memory');
+                       callbacks.groups = $.Callbacks('once memory');
+                       callbacks[info].add( callback );
+                       api = new mw.Api();
+                       api.get( {
+                               action: 'query',
+                               meta: 'userinfo',
+                               uiprop: 'rights|groups'
+                       } ).always( function ( data ) {
+                               var rights, groups;
+                               if ( data.query && data.query.userinfo ) {
+                                       rights = data.query.userinfo.rights;
+                                       groups = data.query.userinfo.groups;
+                               }
+                               callbacks.rights.fire( rights || [] );
+                               callbacks.groups.fire( groups || [] );
+                       } );
+               }
 
                /* Public Members */
 
@@ -25,7 +56,7 @@
                 * Generates a random user session ID (32 alpha-numeric characters).
                 *
                 * This information would potentially be stored in a cookie to identify a user during a
-                * session or series of sessions. It's uniqueness should not be depended on.
+                * session or series of sessions. Its uniqueness should not be depended on.
                 *
                 * @return String: Random set of 32 alpha-numeric characters
                 */
                 *
                 * @return Mixed: User name string or null if users is anonymous
                 */
-               this.name = function() {
+               this.getName = function () {
                        return mw.config.get( 'wgUserName' );
                };
 
+               /**
+                * @deprecated since 1.20 use mw.user.getName() instead
+                */
+               this.name = function () {
+                       return this.getName();
+               };
+
                /**
                 * Checks if the current user is anonymous.
                 *
                 * @return Boolean
                 */
-               this.anonymous = function() {
-                       return that.name() ? false : true;
+               this.isAnon = function () {
+                       return that.getName() === null;
+               };
+
+               /**
+                * @deprecated since 1.20 use mw.user.isAnon() instead
+                */
+               this.anonymous = function () {
+                       return that.isAnon();
                };
 
                /**
                 */
                this.sessionId = function () {
                        var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
-                       if ( typeof sessionId == 'undefined' || sessionId === null ) {
+                       if ( typeof sessionId === 'undefined' || sessionId === null ) {
                                sessionId = generateId();
                                $.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
                        }
                 * @return String: User name or random session ID
                 */
                this.id = function() {
-                       var name = that.name();
+                       var name = that.getName();
                        if ( name ) {
                                return name;
                        }
                        var id = $.cookie( 'mediaWiki.user.id' );
-                       if ( typeof id == 'undefined' || id === null ) {
+                       if ( typeof id === 'undefined' || id === null ) {
                                id = generateId();
                        }
                        // Set cookie if not set, or renew it if already set
-                       $.cookie( 'mediaWiki.user.id', id, { 'expires': 365, 'path': '/' } );
+                       $.cookie( 'mediaWiki.user.id', id, {
+                               expires: 365,
+                               path: '/'
+                       } );
                        return id;
                };
 
                 *         'expires': 7
                 *     } );
                 */
-               this.bucket = function( key, options ) {
+               this.bucket = function ( key, options ) {
                        options = $.extend( {
                                'buckets': {},
                                'version': 0,
                        // Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
                        if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) > 0 ) {
                                var parts = cookie.split( ':' );
-                               if ( parts.length > 1 && parts[0] == options.version ) {
+                               if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
                                        version = Number( parts[0] );
                                        bucket = String( parts[1] );
                                }
                                        }
                                }
                                if ( options.tracked ) {
-                                       mw.loader.using( 'jquery.clickTracking', function() {
+                                       mw.loader.using( 'jquery.clickTracking', function () {
                                                $.trackAction(
                                                        'mediaWiki.user.bucket:' + key + '@' + version + ':' + bucket
                                                );
                        }
                        return bucket;
                };
+
+               /**
+                * Gets the current user's groups.
+                */
+               this.getGroups = function ( callback ) {
+                       getUserInfo( 'groups', callback );
+               };
+
+               /**
+                * Gets the current user's rights.
+                */
+               this.getRights = function ( callback ) {
+                       getUserInfo( 'rights', callback );
+               };
        }
 
        // Extend the skeleton mw.user from mediawiki.js
        // This is kind of ugly but we're stuck with this for b/c reasons
        mw.user = new User( mw.user.options, mw.user.tokens );
 
-})(jQuery);
\ No newline at end of file
+}( mediaWiki, jQuery ) );
index 9202d2e..c697692 100644 (file)
@@ -1,11 +1,13 @@
 /**
  * Implements mediaWiki.util library
  */
-( function ( $, mw ) {
-       "use strict";
+( function ( mw, $ ) {
+       'use strict';
 
        // Local cache and alias
-       var util = {
+       var hideMessageTimeout,
+               messageBoxEvents = false,
+               util = {
 
                /**
                 * Initialisation
                                && profile.name === 'safari'
                                && profile.layoutVersion > 526 ) {
                                util.tooltipAccessKeyPrefix = 'ctrl-alt-';
-
+                       // Firefox 14+ on Mac
+                       } else if ( profile.platform === 'mac'
+                               && profile.name === 'firefox'
+                               && profile.versionNumber >= 14 ) {
+                               util.tooltipAccessKeyPrefix = 'ctrl-option-';
                        // Safari/Konqueror on any platform, or any browser on Mac
                        // (but not Safari on Windows)
                        } else if ( !( profile.platform === 'win' && profile.name === 'safari' )
                 * @return string Address to script (eg. '/w/api.php' )
                 */
                wikiScript: function ( str ) {
-                       return mw.config.get( 'wgScriptPath' ) + '/' + ( str || 'index' ) +
-                               mw.config.get( 'wgScriptExtension' );
+                       str = str || 'index';
+                       if ( str === 'index' ) {
+                               return mw.config.get( 'wgScript' );
+                       } else if ( str === 'load' ) {
+                               return mw.config.get( 'wgLoadScript' );
+                       } else {
+                               return mw.config.get( 'wgScriptPath' ) + '/' + str +
+                                       mw.config.get( 'wgScriptExtension' );
+                       }
                },
 
                /**
                                        return null;
                                }
                                // Select the first (most likely only) unordered list inside the portlet
-                               $ul = $portlet.find( 'ul' );
+                               $ul = $portlet.find( 'ul' ).eq( 0 );
 
                                // If it didn't have an unordered list yet, create it
                                if ( $ul.length === 0 ) {
+
+                                       $ul = $( '<ul>' );
+
                                        // If there's no <div> inside, append it to the portlet directly
                                        if ( $portlet.find( 'div:first' ).length === 0 ) {
-                                               $portlet.append( '<ul></ul>' );
+                                               $portlet.append( $ul );
                                        } else {
                                                // otherwise if there's a div (such as div.body or div.pBody)
                                                // append the <ul> to last (most likely only) div
-                                               $portlet.find( 'div' ).eq( -1 ).append( '<ul></ul>' );
+                                               $portlet.find( 'div' ).eq( -1 ).append( $ul );
                                        }
-                                       // Select the created element
-                                       $ul = $portlet.find( 'ul' ).eq( 0 );
                                }
                                // Just in case..
                                if ( $ul.length === 0 ) {
                 * @return {Boolean} True on success, false on failure.
                 */
                jsMessage: function ( message, className ) {
+                       var $messageDiv = $( '#mw-js-message' );
+
                        if ( !arguments.length || message === '' || message === null ) {
-                               $( '#mw-js-message' ).empty().hide();
+                               $messageDiv.empty().hide();
+                               stopHideMessageTimeout();
                                return true; // Emptying and hiding message is intended behaviour, return true
-
                        } else {
                                // We special-case skin structures provided by the software. Skins that
                                // choose to abandon or significantly modify our formatting can just define
                                // an mw-js-message div to start with.
-                               var $messageDiv = $( '#mw-js-message' );
                                if ( !$messageDiv.length ) {
                                        $messageDiv = $( '<div id="mw-js-message"></div>' );
                                        if ( util.$content.parent().length ) {
                                        }
                                }
 
+                               if ( !messageBoxEvents ) {
+                                       messageBoxEvents = true;
+                                       $messageDiv
+                                               .on( {
+                                                       'mouseenter': stopHideMessageTimeout,
+                                                       'mouseleave': startHideMessageTimeout,
+                                                       'click': hideMessage
+                                               } )
+                                               .on( 'click', 'a', function ( e ) {
+                                                       // Prevent links, even those that don't exist yet, from causing the
+                                                       // message box to close when clicked
+                                                       e.stopPropagation();
+                                               } );
+                               }
+
                                if ( className ) {
-                                       $messageDiv.prop( 'class', 'mw-js-message-' + className );
+                                       $messageDiv.prop( 'className', 'mw-js-message-' + className );
                                }
 
                                if ( typeof message === 'object' ) {
                                }
 
                                $messageDiv.slideDown();
+                               startHideMessageTimeout();
                                return true;
                        }
                },
                }
        };
 
+       // Message auto-hide helpers
+       function hideMessage() {
+               $( '#mw-js-message' ).fadeOut( 'slow' );
+       }
+       function stopHideMessageTimeout() {
+               clearTimeout( hideMessageTimeout );
+       }
+       function startHideMessageTimeout() {
+               clearTimeout( hideMessageTimeout );
+               hideMessageTimeout = setTimeout( hideMessage, 5000 );
+       }
+
        mw.util = util;
 
-} )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
index d8fb2b3..0e0ce80 100644 (file)
@@ -3,7 +3,7 @@
 if ( !defined( 'MEDIAWIKI' ) ) {
        $wgNoDBParam = true;
        $optionsWithArgs = array( 'o' );
-       require_once( dirname(__FILE__).'/../maintenance/commandLine.inc' );
+       require_once( __DIR__ .'/../maintenance/commandLine.inc' );
 
        $stderr = fopen( 'php://stderr', 'w' );
        if ( !isset( $args[0] ) ) {
index 214d9bc..913c19b 100644 (file)
@@ -84,14 +84,14 @@ class CologneBlueTemplate extends LegacyTemplate {
 
                $s .= '<td class="top" nowrap="nowrap">';
                $s .= '<a href="' . htmlspecialchars( $mainPageObj->getLocalURL() ) . '">';
-               $s .= '<span id="sitetitle">' . wfMsg( 'sitetitle' ) . '</span></a>';
+               $s .= '<span id="sitetitle">' . wfMessage( 'sitetitle' )->escaped() . '</span></a>';
 
                $s .= '</td><td class="top" id="top-syslinks" width="100%">';
                $s .= $this->sysLinks();
                $s .= '</td></tr><tr><td class="top-subheader">';
 
                $s .= '<font size="-1"><span id="sitesub">';
-               $s .= htmlspecialchars( wfMsg( 'sitesubtitle' ) ) . '</span></font>';
+               $s .= wfMessage( 'sitesubtitle' )->escaped() . '</span></font>';
                $s .= '</td><td class="top-linkcollection">';
 
                $s .= '<font size="-1"><span id="langlinks">';
@@ -128,15 +128,11 @@ class CologneBlueTemplate extends LegacyTemplate {
 
                $s .= $this->bottomLinks();
                $s .= $this->getSkin()->getLanguage()->pipeList( array(
-                       "\n<br />" . Linker::link(
-                               Title::newMainPage(),
-                               null,
-                               array(),
-                               array(),
-                               array( 'known', 'noclasses' )
+                       "\n<br />" . Linker::linkKnown(
+                               Title::newMainPage()
                        ),
                        $this->getSkin()->aboutLink(),
-                       $this->searchForm( wfMsg( 'qbfind' ) )
+                       $this->searchForm( wfMessage( 'qbfind' )->text() )
                ) );
 
                $s .= "\n<br />" . $this->pageStats();
@@ -167,16 +163,16 @@ class CologneBlueTemplate extends LegacyTemplate {
                $s = array(
                        $this->getSkin()->mainPageLink(),
                        Linker::linkKnown(
-                               Title::newFromText( wfMsgForContent( 'aboutpage' ) ),
-                               wfMsg( 'about' )
+                               Title::newFromText( wfMessage( 'aboutpage' )->inContentLanguage()->text() ),
+                               wfMessage( 'about' )->text()
                        ),
                        Linker::linkKnown(
-                               Title::newFromText( wfMsgForContent( 'helppage' ) ),
-                               wfMsg( 'help' )
+                               Title::newFromText( wfMessage( 'helppage' )->inContentLanguage()->text() ),
+                               wfMessage( 'help' )->text()
                        ),
                        Linker::linkKnown(
-                               Title::newFromText( wfMsgForContent( 'faqpage' ) ),
-                               wfMsg( 'faq' )
+                               Title::newFromText( wfMessage( 'faqpage' )->inContentLanguage()->text() ),
+                               wfMessage( 'faq' )->text()
                        ),
                        Linker::specialLink( 'Specialpages' )
                );
@@ -191,14 +187,14 @@ class CologneBlueTemplate extends LegacyTemplate {
                if ( $this->data['loggedin'] ) {
                        $s[] = Linker::linkKnown(
                                $lo,
-                               wfMsg( 'logout' ),
+                               wfMessage( 'logout' )->text(),
                                array(),
                                $q
                        );
                } else {
                        $s[] = Linker::linkKnown(
                                $li,
-                               wfMsg( 'login' ),
+                               wfMessage( 'login' )->text(),
                                array(),
                                $q
                        );
@@ -257,8 +253,8 @@ class CologneBlueTemplate extends LegacyTemplate {
                        $s .= '<strong>' . $this->editThisPage() . '</strong>';
 
                        $s .= $sep . Linker::linkKnown(
-                               Title::newFromText( wfMsgForContent( 'edithelppage' ) ),
-                               wfMsg( 'edithelp' )
+                               Title::newFromText( wfMessage( 'edithelppage' )->inContentLanguage()->text() ),
+                               wfMessage( 'edithelp' )->text()
                        );
 
                        if( $this->data['loggedin'] ) {
@@ -309,31 +305,22 @@ class CologneBlueTemplate extends LegacyTemplate {
 
                $s .= $this->menuHead( 'qbmyoptions' );
                if ( $this->data['loggedin'] ) {
-                       $tl = Linker::link(
+                       $tl = Linker::linkKnown(
                                $user->getTalkPage(),
-                               wfMsg( 'mytalk' ),
-                               array(),
-                               array(),
-                               array( 'known', 'noclasses' )
+                               wfMessage( 'mytalk' )->escaped()
                        );
                        if ( $user->getNewtalk() ) {
                                $tl .= ' *';
                        }
 
-                       $s .= Linker::link(
+                       $s .= Linker::linkKnown(
                                        $user->getUserPage(),
-                                       wfMsg( 'mypage' ),
-                                       array(),
-                                       array(),
-                                       array( 'known', 'noclasses' )
+                                       wfMessage( 'mypage' )->escaped()
                                ) . $sep . $tl . $sep . Linker::specialLink( 'Watchlist' )
                                        . $sep .
-                               Linker::link(
+                               Linker::linkKnown(
                                        SpecialPage::getSafeTitleFor( 'Contributions', $user->getName() ),
-                                       wfMsg( 'mycontris' ),
-                                       array(),
-                                       array(),
-                                       array( 'known', 'noclasses' )
+                                       wfMessage( 'mycontris' )->escaped()
                                ) . $sep . Linker::specialLink( 'Preferences' )
                                . $sep . Linker::specialLink( 'Userlogout' );
                } else {
@@ -352,15 +339,12 @@ class CologneBlueTemplate extends LegacyTemplate {
 
                if( $wgSiteSupportPage ) {
                        $s .= $sep . '<a href="' . htmlspecialchars( $wgSiteSupportPage ) . '" class="internal">'
-                                       . wfMsg( 'sitesupport' ) . '</a>';
+                                       . wfMessage( 'sitesupport' )->escaped() . '</a>';
                }
 
-               $s .= $sep . Linker::link(
+               $s .= $sep . Linker::linkKnown(
                        SpecialPage::getTitleFor( 'Specialpages' ),
-                       wfMsg( 'moredotdotdot' ),
-                       array(),
-                       array(),
-                       array( 'known', 'noclasses' )
+                       wfMessage( 'moredotdotdot' )->text()
                );
 
                $s .= $sep . "\n</div>\n";
@@ -372,7 +356,7 @@ class CologneBlueTemplate extends LegacyTemplate {
         * @return string
         */
        function menuHead( $key ) {
-               $s = "\n<h6>" . wfMsg( $key ) . "</h6>";
+               $s = "\n<h6>" . wfMessage( $key )->text() . "</h6>";
                return $s;
        }
 
@@ -392,12 +376,12 @@ class CologneBlueTemplate extends LegacyTemplate {
 
                $s .= "<input type='text' id=\"searchInput{$this->searchboxes}\" class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\""
                        . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" /><br />"
-                       . "<input type='submit' id=\"searchGoButton{$this->searchboxes}\" class=\"searchButton\" name=\"go\" value=\"" . htmlspecialchars( wfMsg( 'searcharticle' ) ) . "\" />";
+                       . "<input type='submit' id=\"searchGoButton{$this->searchboxes}\" class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
 
                if( $wgUseTwoButtonsSearchForm ) {
-                       $s .= "<input type='submit' id=\"mw-searchButton{$this->searchboxes}\" class=\"searchButton\" name=\"fulltext\" value=\"" . htmlspecialchars( wfMsg( 'search' ) ) . "\" />\n";
+                       $s .= "<input type='submit' id=\"mw-searchButton{$this->searchboxes}\" class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'search' )->escaped() . "\" />\n";
                } else {
-                       $s .= '<div><a href="' . $action . '" rel="search">' . wfMsg( 'powersearch-legend' ) . "</a></div>\n";
+                       $s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
                }
 
                $s .= '</form>';
index 1656524..6e87786 100644 (file)
@@ -92,7 +92,7 @@ class ModernTemplate extends MonoBookTemplate {
                <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><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></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') ?>
                <div class='mw_clear'></div>
index 8282fb3..5c7ca14 100644 (file)
@@ -93,7 +93,7 @@ class MonoBookTemplate extends BaseTemplate {
 <?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><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
+               <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') ?>
index 98437e2..c3f73e5 100644 (file)
@@ -99,8 +99,8 @@ class NostalgiaTemplate extends LegacyTemplate {
                } else {
                        /* show user page and user talk links */
                        $user = $this->getSkin()->getUser();
-                       $s .= $sep . Linker::link( $user->getUserPage(), wfMsgHtml( 'mypage' ) );
-                       $s .= $sep . Linker::link( $user->getTalkPage(), wfMsgHtml( 'mytalk' ) );
+                       $s .= $sep . Linker::link( $user->getUserPage(), wfMessage( 'mypage' )->escaped() );
+                       $s .= $sep . Linker::link( $user->getTalkPage(), wfMessage( 'mytalk' )->escaped() );
                        if ( $user->getNewtalk() ) {
                                $s .= ' *';
                        }
@@ -109,7 +109,7 @@ class NostalgiaTemplate extends LegacyTemplate {
                        /* show my contributions link */
                        $s .= $sep . Linker::link(
                                SpecialPage::getSafeTitleFor( 'Contributions', $this->data['username'] ),
-                               wfMsgHtml( 'mycontris' ) );
+                               wfMessage( 'mycontris' )->escaped() );
                        /* show my preferences link */
                        $s .= $sep . Linker::specialLink( 'Preferences' );
                        /* show upload file link */
index d06bdfd..9a3ab94 100644 (file)
@@ -26,7 +26,7 @@ if( !defined( 'MEDIAWIKI' ) )
        die( -1 );
 
 /** */
-require_once( dirname(__FILE__) . '/MonoBook.php' );
+require_once( __DIR__ . '/MonoBook.php' );
 
 /**
  * Inherit main code from SkinTemplate, set the CSS and template filter.
index 1114e7d..5461309 100644 (file)
@@ -67,7 +67,7 @@ class StandardTemplate extends LegacyTemplate {
                wfProfileOut( __METHOD__ . '-1' );
                wfProfileIn( __METHOD__ . '-2' );
                $l = $this->getSkin()->getLanguage()->alignStart();
-               $s .= "<td class='bottom' align='$l' valign='top'>";
+               $s .= "<td class='bottom' style='text-align: $l; vertical-align: top;'>";
 
                $s .= $this->bottomLinks();
                $s .= "\n<br />" . $this->getSkin()->getLanguage()->pipeList( array(
@@ -133,7 +133,7 @@ class StandardTemplate extends LegacyTemplate {
                                        $s.= Linker::specialLink( 'Watchlist' ) ;
                                        $s .= $sep . Linker::linkKnown(
                                                SpecialPage::getTitleFor( 'Contributions' ),
-                                               wfMsg( 'mycontris' ),
+                                               wfMessage( 'mycontris' )->escaped(),
                                                array(),
                                                array( 'target' => $this->data['username'] )
                                        );
@@ -158,34 +158,34 @@ class StandardTemplate extends LegacyTemplate {
                                                case NS_TEMPLATE_TALK:
                                                case NS_HELP_TALK:
                                                case NS_CATEGORY_TALK:
-                                                       $text = wfMsg('viewtalkpage');
+                                                       $text = wfMessage('viewtalkpage');
                                                        break;
                                                case NS_MAIN:
-                                                       $text = wfMsg( 'articlepage' );
+                                                       $text = wfMessage( 'articlepage' );
                                                        break;
                                                case NS_USER:
-                                                       $text = wfMsg( 'userpage' );
+                                                       $text = wfMessage( 'userpage' );
                                                        break;
                                                case NS_PROJECT:
-                                                       $text = wfMsg( 'projectpage' );
+                                                       $text = wfMessage( 'projectpage' );
                                                        break;
                                                case NS_FILE:
-                                                       $text = wfMsg( 'imagepage' );
+                                                       $text = wfMessage( 'imagepage' );
                                                        break;
                                                case NS_MEDIAWIKI:
-                                                       $text = wfMsg( 'mediawikipage' );
+                                                       $text = wfMessage( 'mediawikipage' );
                                                        break;
                                                case NS_TEMPLATE:
-                                                       $text = wfMsg( 'templatepage' );
+                                                       $text = wfMessage( 'templatepage' );
                                                        break;
                                                case NS_HELP:
-                                                       $text = wfMsg( 'viewhelppage' );
+                                                       $text = wfMessage( 'viewhelppage' );
                                                        break;
                                                case NS_CATEGORY:
-                                                       $text = wfMsg( 'categorypage' );
+                                                       $text = wfMessage( 'categorypage' );
                                                        break;
                                                default:
-                                                       $text = wfMsg( 'articlepage' );
+                                                       $text = wfMessage( 'articlepage' );
                                        }
 
                                        $link = $title->getText();
@@ -194,11 +194,11 @@ class StandardTemplate extends LegacyTemplate {
                                                $link = $nstext . ':' . $link;
                                        }
 
-                                       $s .= Linker::link( Title::newFromText( $link ), $text );
+                                       $s .= Linker::link( Title::newFromText( $link ), $text->escaped() );
                                } elseif( $title->getNamespace() != NS_SPECIAL ) {
                                        # we just throw in a "New page" text to tell the user that he's in edit mode,
                                        # and to avoid messing with the separator that is prepended to the next item
-                                       $s .= '<strong>' . wfMsg( 'newpage' ) . '</strong>';
+                                       $s .= '<strong>' . wfMessage( 'newpage' )->escaped() . '</strong>';
                                }
                        }
 
@@ -206,7 +206,7 @@ class StandardTemplate extends LegacyTemplate {
                        if( ( $title->isTalkPage() || $this->getSkin()->getOutput()->showNewSectionLink() ) && $action != 'edit' && !$wpPreview )
                                $s .= '<br />' . Linker::link(
                                        $title,
-                                       wfMsg( 'postcomment' ),
+                                       wfMessage( 'postcomment' )->escaped(),
                                        array(),
                                        array(
                                                'action' => 'edit',
@@ -268,12 +268,11 @@ class StandardTemplate extends LegacyTemplate {
                global $wgSiteSupportPage;
                if( $wgSiteSupportPage ) {
                        $s .= "\n<br /><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
-                       '" class="internal">' . wfMsg( 'sitesupport' ) . '</a>';
+                       '" class="internal">' . wfMessage( 'sitesupport' )->escaped() . '</a>';
                }
 
                $s .= "\n<br /></div>\n";
                wfProfileOut( __METHOD__ );
                return $s;
        }
-
 }
index 6ac3f08..6045ed6 100644 (file)
@@ -103,7 +103,7 @@ class VectorTemplate extends BaseTemplate {
                $nav = $this->data['content_navigation'];
 
                if ( $wgVectorUseIconWatch ) {
-                       $mode = $this->getSkin()->getRelevantTitle()->userIsWatching() ? 'unwatch' : 'watch';
+                       $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() ) ? 'unwatch' : 'watch';
                        if ( isset( $nav['actions'][$mode] ) ) {
                                $nav['views'][$mode] = $nav['actions'][$mode];
                                $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
@@ -190,7 +190,8 @@ class VectorTemplate extends BaseTemplate {
                                <?php if ( $this->data['showjumplinks'] ): ?>
                                <!-- jumpto -->
                                <div id="jump-to-nav" class="mw-jump">
-                                       <?php $this->msg( 'jumpto' ) ?> <a href="#mw-head"><?php $this->msg( 'jumptonavigation' ) ?></a>,
+                                       <?php $this->msg( 'jumpto' ) ?>
+                                       <a href="#mw-head"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?>
                                        <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
                                </div>
                                <!-- /jumpto -->
index 08296a9..bc67a4b 100644 (file)
Binary files a/skins/common/images/Arr_.png and b/skins/common/images/Arr_.png differ
index f82f45d..3497423 100644 (file)
Binary files a/skins/common/images/add.png and b/skins/common/images/add.png differ
index 3288d10..72203fd 100644 (file)
Binary files a/skins/common/images/ajax-loader.gif and b/skins/common/images/ajax-loader.gif differ
index 5fc956d..e524f6c 100644 (file)
Binary files a/skins/common/images/ar/button_bold.png and b/skins/common/images/ar/button_bold.png differ
index 4888e73..c9c63f6 100644 (file)
Binary files a/skins/common/images/ar/button_link.png and b/skins/common/images/ar/button_link.png differ
index 5283179..12b986b 100644 (file)
Binary files a/skins/common/images/ar/button_nowiki.png and b/skins/common/images/ar/button_nowiki.png differ
index d02aeee..5c10cfe 100644 (file)
Binary files a/skins/common/images/be-tarask/button_bold.png and b/skins/common/images/be-tarask/button_bold.png differ
index 26e0192..19e4ad4 100644 (file)
Binary files a/skins/common/images/button_hr.png and b/skins/common/images/button_hr.png differ
index 24e0095..ff7348a 100644 (file)
Binary files a/skins/common/images/button_sig.png and b/skins/common/images/button_sig.png differ
index 51951c6..53b6f92 100644 (file)
Binary files a/skins/common/images/button_template.png and b/skins/common/images/button_template.png differ
index cd262c4..990702e 100644 (file)
Binary files a/skins/common/images/closewindow.png and b/skins/common/images/closewindow.png differ
index 348e548..c96d9ff 100644 (file)
Binary files a/skins/common/images/closewindow19x19.png and b/skins/common/images/closewindow19x19.png differ
index 3c2666e..b958d22 100644 (file)
Binary files a/skins/common/images/cyrl/button_italic.png and b/skins/common/images/cyrl/button_italic.png differ
index 4008cb9..33f91ed 100644 (file)
Binary files a/skins/common/images/fa/button_italic.png and b/skins/common/images/fa/button_italic.png differ
index 5283179..12b986b 100644 (file)
Binary files a/skins/common/images/fa/button_nowiki.png and b/skins/common/images/fa/button_nowiki.png differ
index af869d2..cd657c3 100644 (file)
Binary files a/skins/common/images/nextredirectltr.png and b/skins/common/images/nextredirectltr.png differ
index c9bf355..b788f33 100644 (file)
Binary files a/skins/common/images/nextredirectrtl.png and b/skins/common/images/nextredirectrtl.png differ
index 37d3a43..6146be4 100644 (file)
Binary files a/skins/common/images/spinner.gif and b/skins/common/images/spinner.gif differ
index 96a2e9a..ba5718a 100644 (file)
Binary files a/skins/common/images/tooltip_icon.png and b/skins/common/images/tooltip_icon.png differ
index 9e76ca0..823d467 100644 (file)
@@ -8,11 +8,11 @@
                $( mw ).trigger( 'LivePreviewPrepare' );
 
                var postData = $('#editform').formToArray();
-               postData.push( { 'name' : 'wpPreview', 'value' : '1' } );
+               postData.push( { 'name' : e.target.name, 'value' : '1' } );
 
                // Hide active diff, used templates, old preview if shown
-               var copyElements = ['#wikiPreview', '.templatesUsed', '.hiddencats',
-                                                       '#catlinks'];
+               var copyElements = ['#wikiPreview', '#wikiDiff', '.templatesUsed', '.hiddencats',
+                                                       '#catlinks', '#p-lang', '.mw-summary-preview'];
                var copySelector = copyElements.join(',');
 
                $.each( copyElements, function(k,v) { $(v).fadeOut('fast'); } );
        };
 
        $(document).ready( function() {
-               $('#wpPreview').click( doLivePreview );
+               // construct space for interwiki links if missing
+               // (it is usually not shown when action=edit, but shown if action=submit)
+               if ( !document.getElementById( 'p-lang' ) && document.getElementById( 'p-tb' ) ) {
+                       // we need not hide this, because it's empty anyway
+                       $( '#p-tb' ).after( $( '<div>' ).attr( 'id', 'p-lang' ) );
+               }
+
+               // construct space for summary preview if missing
+               if ( $( '.mw-summary-preview' ).length === 0 ) {
+                       $( '.editCheckboxes' ).before( $( '<div>' ).addClass( 'mw-summary-preview' ) );
+               }
+
+               // construct space for diff if missing. also load diff styles.
+               if ( !document.getElementById( 'wikiDiff' ) && document.getElementById( 'wikiPreview' ) ) {
+                       $( '#wikiPreview' ).after( $( '<div>' ).attr( 'id', 'wikiDiff' ) );
+                       // diff styles are by default only loaded when needed
+                       // if there was no diff container, we can expect the styles not to be there either
+                       mw.loader.load( 'mediawiki.action.history.diff' );
+               }
+
+               $( '#wpPreview, #wpDiff' ).click( doLivePreview );
        } );
 }) ( jQuery );
index 1b839b5..8c35626 100644 (file)
@@ -116,14 +116,19 @@ span.texhtml {
 #wpTextbox1 {
        clear: both;
 }
+
 #toolbar img {
        cursor: pointer;
 }
+
 div#mw-js-message {
        margin: 1em 5%;
        padding: 0.5em 2.5%;
        border: solid 1px #ddd;
        background-color: #fcfcfc;
+       /* Message hides on-click */
+       /* See also mw.util.jsMessage */
+       cursor: pointer;
 }
 
 /* Edit section links */
@@ -828,12 +833,13 @@ h1:lang(hi),
 h1:lang(kn),
 h1:lang(ml),
 h1:lang(mr),
+h1:lang(my),
 h1:lang(or),
 h1:lang(pa),
 h1:lang(sa),
 h1:lang(ta),
 h1:lang(te) {
-       line-height: 1.5em !important;
+       line-height: 1.6em !important;
 }
 h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
 h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
@@ -844,6 +850,7 @@ h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
 h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
 h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
 h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
+h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my),
 h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
 h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
 h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
index 8e08af3..df819e1 100644 (file)
@@ -1,4 +1,4 @@
-( function () {
+( function ( mw, $ ) {
 var    ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
        fileExtensions = mw.config.get( 'wgFileExtensions' );
 
@@ -241,10 +241,17 @@ window.fillDestFilename = function(id) {
        }
 
        // Output result
-       var destFile = document.getElementById('wpDestFile');
-       if (destFile) {
-               destFile.value = fname;
-               wgUploadWarningObj.checkNow(fname) ;
+       var destFile = document.getElementById( 'wpDestFile' );
+       if ( destFile ) {
+               // Call decodeURIComponent function to remove possible URL-encoded characters
+               // from the file name (bug 30390). Especially likely with upload-form-url.
+               // decodeURIComponent can throw an exception in input is invalid utf-8
+               try {
+                       destFile.value = decodeURIComponent( fname );
+               } catch ( e ) {
+                       destFile.value = fname;
+               }
+               wgUploadWarningObj.checkNow( fname );
        }
 };
 
@@ -302,4 +309,4 @@ window.wgUploadLicenseObj = {
 
 $( document ).ready( uploadSetup );
 
-}() );
+}( mediaWiki, jQuery ) );
index 8f47499..6526e8b 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * MediaWiki legacy wikibits
  */
-(function(){
+( function ( mw ) {
 
 window.clientPC = navigator.userAgent.toLowerCase(); // Get client info
 window.is_gecko = /gecko/.test( clientPC ) &&
@@ -515,55 +515,14 @@ window.redirectToFragment = function( fragment ) {
  * Add a cute little box at the top of the screen to inform the user of
  * something, replacing any preexisting message.
  *
- * @param message String -or- Dom Object  HTML to be put inside the right div
- * @param className String   Used in adding a class; should be different for each
- *   call to allow CSS/JS to hide different boxes.  null = no class used.
- * @return Boolean       True on success, false on failure
+ * @deprecated since 1.17 Use mw.util.jsMessage instead.
+ * @param {String|HTMLElement} message To be put inside the message box.
+ * @param {String} className Used in adding a class; Can be used to selectively
+ *  apply CSS to a certain category of messages.  null = no class used.
+ * @return {Boolean} True on success, false on failure
  */
-window.jsMsg = function( message, className ) {
-       if ( !document.getElementById ) {
-               return false;
-       }
-       // We special-case skin structures provided by the software.  Skins that
-       // choose to abandon or significantly modify our formatting can just define
-       // an mw-js-message div to start with.
-       var messageDiv = document.getElementById( 'mw-js-message' );
-       if ( !messageDiv ) {
-               messageDiv = document.createElement( 'div' );
-               if ( document.getElementById( 'column-content' )
-               && document.getElementById( 'content' ) ) {
-                       // MonoBook, presumably
-                       document.getElementById( 'content' ).insertBefore(
-                               messageDiv,
-                               document.getElementById( 'content' ).firstChild
-                       );
-               } else if ( document.getElementById( 'content' )
-               && document.getElementById( 'article' ) ) {
-                       // Non-Monobook but still recognizable (old-style)
-                       document.getElementById( 'article').insertBefore(
-                               messageDiv,
-                               document.getElementById( 'article' ).firstChild
-                       );
-               } else {
-                       return false;
-               }
-       }
-
-       messageDiv.setAttribute( 'id', 'mw-js-message' );
-       messageDiv.style.display = 'block';
-       if( className ) {
-               messageDiv.setAttribute( 'class', 'mw-js-message-' + className );
-       }
-
-       if ( typeof message === 'object' ) {
-               while ( messageDiv.hasChildNodes() ) { // Remove old content
-                       messageDiv.removeChild( messageDiv.firstChild );
-               }
-               messageDiv.appendChild( message ); // Append new content
-       } else {
-               messageDiv.innerHTML = message;
-       }
-       return true;
+window.jsMsg = function () {
+       return mw.util.jsMessage.apply( mw.util, arguments );
 };
 
 /**
@@ -663,4 +622,4 @@ if ( ie6_bugs ) {
        importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' );
 }
 
-})();
+}( mediaWiki ) );
index 3b3cf81..ee46a50 100644 (file)
Binary files a/skins/modern/document.png and b/skins/modern/document.png differ
index dfc8e62..72b8724 100644 (file)
Binary files a/skins/modern/footer-grad.png and b/skins/modern/footer-grad.png differ
index b8f5abb..4d3cb47 100644 (file)
Binary files a/skins/modern/news_icon.png and b/skins/modern/news_icon.png differ
index dff165e..e535c0c 100644 (file)
Binary files a/skins/modern/video.png and b/skins/modern/video.png differ
index 3b3cf81..ee46a50 100644 (file)
Binary files a/skins/monobook/document.png and b/skins/monobook/document.png differ
index 2fe259e..5c7ad82 100644 (file)
@@ -840,7 +840,7 @@ div#searchTargetHide {
 }
 
 #powersearch p {
-       margin-top:0px;
+       margin-top: 0px;
 }
 
 div.multipageimagenavbox {
@@ -913,3 +913,18 @@ div.mw-lag-warn-high {
 .tipsy {
        font-size: 127%;
 }
+
+/* jsMessage */
+
+div#mw-js-message {
+       position: absolute;
+       margin: 0;
+       padding: 0.25em 1em;
+       right: 1em;
+       top: 1em;
+       width: 20em;
+       z-index: 10000;
+       -moz-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.125);
+       -webkit-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.125);
+       box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.125);
+}
index b8f5abb..4d3cb47 100644 (file)
Binary files a/skins/monobook/news_icon.png and b/skins/monobook/news_icon.png differ
index 3286583..d86dbe0 100644 (file)
Binary files a/skins/monobook/video.png and b/skins/monobook/video.png differ
index f500c9e..7640bd1 100644 (file)
Binary files a/skins/vector/images/arrow-down-focus-icon.png and b/skins/vector/images/arrow-down-focus-icon.png differ
index 255c7d1..12e3b93 100644 (file)
Binary files a/skins/vector/images/arrow-down-icon.png and b/skins/vector/images/arrow-down-icon.png differ
index b32678f..5a1d2f4 100644 (file)
Binary files a/skins/vector/images/audio-icon.png and b/skins/vector/images/audio-icon.png differ
index 0cf02db..f9ca8cc 100644 (file)
Binary files a/skins/vector/images/border.png and b/skins/vector/images/border.png differ
index bd429c2..7bae98f 100644 (file)
Binary files a/skins/vector/images/bullet-icon.png and b/skins/vector/images/bullet-icon.png differ
index 9148bdb..b70efaa 100644 (file)
Binary files a/skins/vector/images/link-icon.png and b/skins/vector/images/link-icon.png differ
index 5fa9e82..a9ba8a7 100644 (file)
Binary files a/skins/vector/images/lock-icon.png and b/skins/vector/images/lock-icon.png differ
index 16002f7..9823d72 100644 (file)
Binary files a/skins/vector/images/mail-icon.png and b/skins/vector/images/mail-icon.png differ
index 4ca31da..b3ecd30 100644 (file)
Binary files a/skins/vector/images/page-base.png and b/skins/vector/images/page-base.png differ
index b93c027..1436cda 100644 (file)
Binary files a/skins/vector/images/page-fade.png and b/skins/vector/images/page-fade.png differ
index 3ef0b26..90c3918 100644 (file)
Binary files a/skins/vector/images/portal-break.png and b/skins/vector/images/portal-break.png differ
index 696135b..8e0082b 100644 (file)
Binary files a/skins/vector/images/preferences-base.png and b/skins/vector/images/preferences-base.png differ
index 7e25a05..e59f578 100644 (file)
Binary files a/skins/vector/images/preferences-break.png and b/skins/vector/images/preferences-break.png differ
index 7963b76..411a1aa 100644 (file)
Binary files a/skins/vector/images/preferences-edge.png and b/skins/vector/images/preferences-edge.png differ
index 3996fb4..638084d 100644 (file)
Binary files a/skins/vector/images/preferences-fade.png and b/skins/vector/images/preferences-fade.png differ
index 140feae..6cb7d28 100644 (file)
Binary files a/skins/vector/images/search-fade.png and b/skins/vector/images/search-fade.png differ
index d6eabd5..b8f772f 100644 (file)
Binary files a/skins/vector/images/tab-current-fade.png and b/skins/vector/images/tab-current-fade.png differ
index 1bedd33..57f9f8d 100644 (file)
Binary files a/skins/vector/images/user-icon.png and b/skins/vector/images/user-icon.png differ
index 1ec8456..e934a0f 100644 (file)
Binary files a/skins/vector/images/video-icon.png and b/skins/vector/images/video-icon.png differ
index 32a6489..bab8822 100644 (file)
@@ -149,7 +149,7 @@ div.vectorTabs ul li {
        background-image: url(images/tab-normal-fade.png);
        background-position: bottom left;
        background-repeat: repeat-x;
-       white-space:nowrap;
+       white-space: nowrap;
 }
 /* IGNORED BY IE6 */
 div.vectorTabs ul > li {
@@ -197,7 +197,7 @@ div.vectorTabs span {
 }
 div.vectorTabs li.selected a,
 div.vectorTabs li.selected a:visited{
-       color: #333333;
+       color: #333;
        text-decoration: none;
 }
 div.vectorTabs li.new a,
@@ -342,7 +342,7 @@ div.vectorMenu li > a {
 }
 div.vectorMenu li.selected a,
 div.vectorMenu li.selected a:visited {
-       color: #333333;
+       color: #333;
        text-decoration: none;
 }
 /* Search */
@@ -369,7 +369,7 @@ div#simpleSearch {
        margin-top: 0.65em;
        position: relative;
        min-height: 1px; /* Gotta trigger hasLayout for IE7 */
-       border: solid 1px #AAAAAA;
+       border: solid 1px #aaa;
        color: black;
        background-color: white;
        /* @embed */
@@ -394,10 +394,10 @@ div#simpleSearch input:focus {
        outline: none;
 }
 div#simpleSearch input.placeholder {
-       color: #999999;
+       color: #999;
 }
 div#simpleSearch input::-webkit-input-placeholder {
-       color: #999999;
+       color: #999;
 }
 div#simpleSearch input#searchInput {
        position: absolute;
@@ -459,7 +459,7 @@ div#mw-panel div.portal {
 }
 div#mw-panel div.portal h5 {
        font-weight: normal;
-       color: #444444;
+       color: #444;
        padding: 0.25em;
        padding-top: 0;
        padding-left: 1.75em;
@@ -488,8 +488,8 @@ div#mw-panel div.portal div.body ul li {
        padding: 0;
        padding-bottom: 0.5em;
        margin: 0;
-       overflow: hidden;
        font-size: 0.75em;
+       word-wrap: break-word;
 }
 div#mw-panel div.portal div.body ul li a {
        color: #0645ad;
@@ -520,7 +520,7 @@ div#footer ul li {
        padding: 0;
        padding-top: 0.5em;
        padding-bottom: 0.5em;
-       color: #333333;
+       color: #333;
        font-size: 0.7em;
 }
 div#footer #footer-icons {
@@ -619,7 +619,7 @@ div#footer #footer-places li {
                background-image: url(images/preferences-fade.png);
                background-position: bottom;
                background-repeat: repeat-x;
-               color: #333333;
+               color: #333;
                text-decoration: none;
        }
 #preferences {
@@ -628,14 +628,14 @@ div#footer #footer-places li {
        margin: 0;
        margin-top: -2px;
        clear: both;
-       border: solid 1px #cccccc;
+       border: solid 1px #ccc;
        background-color: #f9f9f9;
        /* @embed */
        background-image: url(images/preferences-base.png);
 }
 #preferences fieldset {
        border: none;
-       border-top: solid 1px #cccccc;
+       border-top: solid 1px #ccc;
 }
 #preferences fieldset.prefsection {
        border: none;
@@ -643,7 +643,7 @@ div#footer #footer-places li {
        margin: 1em;
 }
 #preferences legend {
-       color: #666666;
+       color: #666;
 }
 #preferences fieldset.prefsection legend.mainLegend {
        display: none;
@@ -655,7 +655,7 @@ div#footer #footer-places li {
 .htmlform-tip {
        font-size: x-small;
        padding: .2em 2em;
-       color: #666666;
+       color: #666;
 }
 #preferences div.mw-prefs-buttons {
        padding: 1em;
@@ -784,8 +784,22 @@ div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
        position: relative;
        width: 100%;
 }
-#mw-js-message {
+div#mw-js-message {
+       background-color: #fff;
+       background-color: rgba(255, 255, 255, 0.93);
        font-size: 0.8em;
+       position: absolute;
+       margin: 0;
+       padding: 1em 2em;
+       right: 1em;
+       top: 7em;
+       width: 20em;
+       z-index: 10000;
+       border: solid 1px #a7d7f9;
+       border-radius: 0.75em;
+       -moz-box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.125);
+       -webkit-box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.125);
+       box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.125);
 }
 div#bodyContent {
        line-height: 1.5em;
@@ -835,9 +849,9 @@ div#bodyContent {
 }
 div.vectorTabs ul {
        /* @embed */
-       background-image:url(images/tab-break.png);
-       background-position:right bottom;
-       background-repeat:no-repeat;
+       background-image: url(images/tab-break.png);
+       background-position: right bottom;
+       background-repeat: no-repeat;
 }
 
 /* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
@@ -849,39 +863,39 @@ div.vectorTabs ul {
 
 body.vector-animateLayout div#content,
 body.vector-animateLayout div#footer {
-       transition: margin-left 250ms, padding 250ms;
        -moz-transition: margin-left 250ms, padding 250ms;
        -webkit-transition: margin-left 250ms, padding 250ms;
        -o-transition: margin-left 250ms, padding 250ms;
+       transition: margin-left 250ms, padding 250ms;
 }
 body.vector-animateLayout #p-logo,
 body.vector-animateLayout #left-navigation {
-       transition: left 250ms;
        -moz-transition: left 250ms;
        -webkit-transition: left 250ms;
        -o-transition: left 250ms;
+       transition: left 250ms;
 }
 body.vector-animateLayout #mw-panel {
-       transition: padding-left 250ms;
        -moz-transition: padding-left 250ms;
        -webkit-transition: padding-left 250ms;
        -o-transition: padding-left 250ms;
+       transition: padding-left 250ms;
 }
 body.vector-animateLayout #p-search {
-       transition: margin-right 250ms;
        -moz-transition: margin-right 250ms;
        -webkit-transition: margin-right 250ms;
        -o-transition: margin-right 250ms;
+       transition: margin-right 250ms;
 }
 body.vector-animateLayout #p-personal {
-       transition: right 250ms;
        -moz-transition: right 250ms;
        -webkit-transition: right 250ms;
        -o-transition: right 250ms;
+       transition: right 250ms;
 }
 body.vector-animateLayout #mw-head-base {
-       transition: margin-left 250ms;
        -moz-transition: margin-left 250ms;
        -webkit-transition: margin-left 250ms;
        -o-transition: margin-left 250ms;
+       transition: margin-left 250ms;
 }
index cc76b32..8b719e5 100644 (file)
@@ -1,21 +1,21 @@
-/*
+/**
  * Vector-specific scripts
  */
-jQuery( function( $ ) {
-       $( 'div.vectorMenu' ).each( function() {
-               var self = this;
-               $( 'h5:first a:first', this )
+jQuery( function ( $ ) {
+       $( 'div.vectorMenu' ).each( function () {
+               var $el = $( this );
+               $el.find( 'h5:first a:first' )
                        // For accessibility, show the menu when the hidden link in the menu is clicked (bug 24298)
-                       .click( function( e ) {
-                               $( '.menu:first', self ).toggleClass( 'menuForceShow' );
+                       .click( function ( e ) {
+                               $el.find( '.menu:first' ).toggleClass( 'menuForceShow' );
                                e.preventDefault();
-                       })
+                       } )
                        // When the hidden link has focus, also set a class that will change the arrow icon
-                       .focus( function() {
-                               $( self ).addClass( 'vectorMenuFocus' );
-                       })
-                       .blur( function() {
-                               $( self ).removeClass( 'vectorMenuFocus' );
-                       });
-       });
-});
+                       .focus( function () {
+                               $el.addClass( 'vectorMenuFocus' );
+                       } )
+                       .blur( function () {
+                               $el.removeClass( 'vectorMenuFocus' );
+                       } );
+       } );
+} );
index 9cadd75..28501ea 100644 (file)
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-$IP = dirname( dirname( __FILE__ ) );
+$IP = dirname( __DIR__ );
 
 define( 'SELENIUMTEST', true );
 
-//require_once( dirname( __FILE__ ) . '/../maintenance/commandLine.inc' );
-require( dirname( __FILE__ ) . '/../maintenance/Maintenance.php' );
+//require_once( __DIR__ . '/../maintenance/commandLine.inc' );
+require( __DIR__ . '/../maintenance/Maintenance.php' );
 
 require_once( 'PHPUnit/Runner/Version.php' );
 if( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '>=' ) ) {
@@ -43,7 +43,7 @@ if( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '>=' ) ) {
 require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
 include_once( 'PHPUnit/Util/Log/JUnit.php' );
 
-require_once( dirname( __FILE__ ) . "/selenium/SeleniumServerManager.php" );
+require_once( __DIR__ . "/selenium/SeleniumServerManager.php" );
 
 class SeleniumTester extends Maintenance {
        protected $selenium;
index 3125284..cb5ca36 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 global $wgAutoloadClasses;
-$testFolder = dirname( __FILE__ );
+$testFolder = __DIR__;
 
 $wgAutoloadClasses += array(
 
@@ -13,7 +13,6 @@ $wgAutoloadClasses += array(
 
        //includes
        'BlockTest' => "$testFolder/phpunit/includes/BlockTest.php",
-       'MockOutputPage' => "$testFolder/phpunit/includes/MockOutputPage.php",
 
        //API
        'ApiFormatTestBase' => "$testFolder/phpunit/includes/api/format/ApiFormatTestBase.php",
index 1ac8dcb..4301587 100644 (file)
@@ -14,7 +14,7 @@
  *
  */ 
 
-$maintenanceDir = dirname( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) ) . '/maintenance';
+$maintenanceDir = dirname( dirname( dirname( dirname( __DIR__ ) ) ) ) . '/maintenance';
 
 require( "$maintenanceDir/Maintenance.php" );
 
@@ -57,10 +57,11 @@ class MakeLanguageSpec extends Maintenance {
                        foreach ( self::$keyToTestArgs as $key => $testArgs ) {
                                foreach ($testArgs as $args) {
                                        // get the raw template, without any transformations
-                                       $template = wfMsgGetKey( $key, /* useDb */ true, $languageCode, /* transform */ false );
+                                       $template = wfMessage( $key )->inLanguage( $languageCode )->plain();
 
                                        // get the magic-parsed version with args
                                        $wfMsgExtArgs = array_merge( array( $key, $wfMsgExtOptions ), $args );
+                                       // @todo FIXME: Use Message class.
                                        $result = call_user_func_array( 'wfMsgExt', $wfMsgExtArgs ); 
 
                                        // record the template, args, language, and expected result
index deb5c5a..cd59833 100644 (file)
@@ -710,6 +710,9 @@ class ParserTest {
 
                $this->savedGlobals = array();
 
+               /** @since 1.20 */
+               wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
+
                foreach ( $settings as $var => $val ) {
                        if ( array_key_exists( $var, $GLOBALS ) ) {
                                $this->savedGlobals[$var] = $GLOBALS[$var];
index 2ef95fa..5036268 100644 (file)
@@ -84,6 +84,29 @@ This is a simple paragraph.
 </p>
 !! end
 
+!! test
+Paragraphs with extra newline spacing
+!! input
+foo
+
+bar
+
+
+baz
+
+
+
+booz
+!! result
+<p>foo
+</p><p>bar
+</p><p><br />
+baz
+</p><p><br />
+</p><p>booz
+</p>
+!! end
+
 !! test
 Simple list
 !! input
@@ -134,6 +157,285 @@ Italics and bold
 
 !! end
 
+###
+### 2-quote opening sequence tests
+###
+!! test
+Italics and bold: 2-quote opening sequence: (2,2)
+!! input
+''foo''
+!! result
+<p><i>foo</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 2-quote opening sequence: (2,3)
+!! input
+''foo'''
+!! result
+<p><i>foo'</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 2-quote opening sequence: (2,4)
+!! input
+''foo''''
+!! result
+<p><i>foo''</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 2-quote opening sequence: (2,5)
+!! input
+''foo'''''
+!! result
+<p><i>foo</i>
+</p>
+!!end
+
+
+###
+### 3-quote opening sequence tests
+###
+
+!! test
+Italics and bold: 3-quote opening sequence: (3,2)
+!! input
+'''foo''
+!! result
+<p>'<i>foo</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 3-quote opening sequence: (3,3)
+!! input
+'''foo'''
+!! result
+<p><b>foo</b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 3-quote opening sequence: (3,4)
+!! input
+'''foo''''
+!! result
+<p><b>foo'</b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 3-quote opening sequence: (3,5)
+!! input
+'''foo'''''
+!! result
+<p><b>foo</b>
+</p>
+!!end
+
+
+###
+### 4-quote opening sequence tests
+###
+
+!! test
+Italics and bold: 4-quote opening sequence: (4,2)
+!! input
+''''foo''
+!! result
+<p>''<i>foo</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 4-quote opening sequence: (4,3)
+!! input
+''''foo'''
+!! result
+<p>'<b>foo</b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 4-quote opening sequence: (4,4)
+!! input
+''''foo''''
+!! result
+<p>'<b>foo'</b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 4-quote opening sequence: (4,5)
+!! input
+''''foo'''''
+!! result
+<p>'<b>foo</b>
+</p>
+!!end
+
+
+###
+### 5-quote opening sequence tests
+###
+
+!! test
+Italics and bold: 5-quote opening sequence: (5,2)
+!! input
+'''''foo''
+!! result
+<p><b><i>foo</i></b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 5-quote opening sequence: (5,3)
+!! input
+'''''foo'''
+!! result
+<p><i><b>foo</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 5-quote opening sequence: (5,4)
+!! input
+'''''foo''''
+!! result
+<p><i><b>foo'</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 5-quote opening sequence: (5,5)
+!! input
+'''''foo'''''
+!! result
+<p><i><b>foo</b></i>
+</p>
+!!end
+
+###
+### multiple quote sequences in a line
+###
+!! test
+Italics and bold: multiple quote sequences: (2,4,2)
+!! input
+''foo''''bar''
+!! result
+<p><i>foo'<b>bar</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: multiple quote sequences: (2,4,3)
+!! input
+''foo''''bar'''
+!! result
+<p><i>foo'<b>bar</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: multiple quote sequences: (2,4,4)
+!! input
+''foo''''bar''''
+!! result
+<p><i>foo'<b>bar'</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: multiple quote sequences: (3,4,2)
+!! input
+'''foo''''bar''
+!! result
+<p><b>foo'</b>bar
+</p>
+!!end
+
+
+!! test
+Italics and bold: multiple quote sequences: (3,4,3)
+!! input
+'''foo''''bar'''
+!! result
+<p><b>foo'</b>bar
+</p>
+!!end
+
+###
+### other quote tests
+###
+!! test
+Italics and bold: other quote tests: (2,3,5)
+!! input
+''this is about '''foo's family'''''
+!! result
+<p><i>this is about <b>foo's family</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: other quote tests: (2,(3,3),2)
+!! input
+''this is about '''foo's''' family''
+!! result
+<p><i>this is about <b>foo's</b> family</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: other quote tests: (3,2,3,2)
+!! input
+'''this is about ''foo'''s family''
+!! result
+<p><b>this is about <i>foo</i></b><i>s family</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: other quote tests: (3,2,3,3)
+!! input
+'''this is about ''foo'''s family'''
+!! result
+<p>'<i>this is about </i>foo<b>s family</b>
+</p>
+!!end
+
+
+
+!! test
+Italics and bold: other quote tests: (3,(2,2),3)
+!! input
+'''this is about ''foo's'' family'''
+!! result
+<p><b>this is about <i>foo's</i> family</b>
+</p>
+!!end
+
 ###
 ### <nowiki> test cases
 ###
@@ -471,185 +773,556 @@ Bug 6200: Preformatted in <blockquote>
 </pre>
 
 !! result
-<pre>
-&lt;nowiki&gt;
-</pre>
-<p>&lt;/nowiki&gt;
-&lt;/pre&gt;
-</p><p>
-&lt;pre&gt;
-&lt;nowiki&gt;
-&lt;/pre&gt;
+<pre>
+&lt;nowiki&gt;
+</pre>
+<p>&lt;/nowiki&gt;
+&lt;/pre&gt;
+</p><p>
+&lt;pre&gt;
+&lt;nowiki&gt;
+&lt;/pre&gt;
+
+&lt;/pre&gt;
+</p>
+!! end
+
+
+###
+### Definition lists
+###
+!! test
+Simple definition
+!! input
+; name : Definition
+!! result
+<dl><dt> name&#160;</dt><dd> Definition
+</dd></dl>
+
+!! end
+
+!! test
+Definition list for indentation only
+!! input
+: Indented text
+!! result
+<dl><dd> Indented text
+</dd></dl>
+
+!! end
+
+!! test
+Definition list with no space
+!! input
+;name:Definition
+!! result
+<dl><dt>name</dt><dd>Definition
+</dd></dl>
+
+!!end
+
+!! test
+Definition list with URL link
+!! input
+; http://example.com/ : definition
+!! result
+<dl><dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt><dd> definition
+</dd></dl>
+
+!! end
+
+!! test
+Definition list with bracketed URL link
+!! input
+;[http://www.example.com/ Example]:Something about it
+!! result
+<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
+</dd></dl>
+
+!! end
+
+!! test
+Definition list with wikilink containing colon
+!! input
+; [[Help:FAQ]]: The least-read page on Wikipedia
+!! result
+<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt><dd> The least-read page on Wikipedia
+</dd></dl>
+
+!! end
+
+# At Brion's and JeLuF's insistence... :)
+!! test
+Definition list with news link containing colon
+!! input
+;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
+!! result
+<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt><dd> This isn't even a real newsgroup!
+</dd></dl>
+
+!! end
+
+!! test
+Malformed definition list with colon
+!! input
+;  news:alt.wikipedia.rox -- don't crash or enter an infinite loop
+!! result
+<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
+</dt></dl>
+
+!! end
+
+!! test
+Definition lists: colon in external link text
+!! input
+; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
+!! result
+<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
+</dd></dl>
+
+!! end
+
+!! test
+Definition lists: colon in HTML attribute
+!! input
+;<b style="display: inline">bold</b>
+!! result
+<dl><dt><b style="display: inline">bold</b>
+</dt></dl>
+
+!! end
+
+
+!! test
+Definition lists: self-closed tag
+!! input
+;one<br/>two : two-line fun
+!! result
+<dl><dt>one<br />two&#160;</dt><dd> two-line fun
+</dd></dl>
+
+!! end
+
+!! test
+Bug 11748: Literal closing tags
+!! options
+disabled
+!! input
+<dl>
+<dt>test 1</dt>
+<dd>test test test test test</dd>
+<dt>test 2</dt>
+<dd>test test test test test</dd>
+</dl>
+!! result
+<dl>
+<dt>test 1</dt>
+<dd>test test test test test</dd>
+<dt>test 2</dt>
+<dd>test test test test test</dd>
+</dl>
+!! end
+
+!! test
+Definition and unordered list using wiki syntax nested in unordered list using html tags.
+!! input
+<ul><li>
+; term : description 
+* unordered
+</li>
+</ul>
+!! result
+<ul><li>
+<dl><dt> term&#160;</dt><dd> description 
+</dd></dl>
+<ul><li> unordered
+</li></ul>
+</li>
+</ul>
+
+!! end
+
+!! test
+Definition list with empty definition and following paragraph
+!! input
+; term:
+Paragraph text
+!! result
+<dl><dt> term</dt><dd>
+</dd></dl>
+<p>Paragraph text
+</p>
+!! end
+
+!! test
+Definition Lists: No nesting: Multiple dd's
+!! input
+;x
+:a
+:b
+!! result
+<dl><dt>x
+</dt><dd>a
+</dd><dd>b
+</dd></dl>
+
+!! end
+
+!! test
+Definition Lists: Indentation: Regular
+!! input
+:i1
+::i2
+:::i3
+!! result
+<dl><dd>i1
+<dl><dd>i2
+<dl><dd>i3
+</dd></dl>
+</dd></dl>
+</dd></dl>
+
+!! end
+
+!! test
+Definition Lists: Indentation: Missing 1st level
+!! input
+::i2
+:::i3
+!! result
+<dl><dd><dl><dd>i2
+<dl><dd>i3
+</dd></dl>
+</dd></dl>
+</dd></dl>
+
+!! end
+
+!! test
+Definition Lists: Indentation: Multi-level indent
+!! input
+:::i3
+!! result
+<dl><dd><dl><dd><dl><dd>i3
+</dd></dl>
+</dd></dl>
+</dd></dl>
+
+!! end
+
+## The PHP parser treats : items (dd) without a corresponding ; item (dt)
+## as an empty dt item.  It also ignores all but the last ";" when followed
+## by ":" later on.  So, ";" are not ignored in ";;;t3" but are ignored  in
+## ";;;t3 :d1".  So, PHP parser behavior is a little inconsistent wrt multiple
+## ";"s.
+##
+## Ex: ";;t2 ::d2" is transformed into:
+##
+## <dl>
+##   <dt>t2 </dt>
+##   <dd>
+##     <dl>
+##       <dt></dt>
+##       <dd>d2</dd>
+##     </dl>
+##   </dd>
+## </dl>
+##
+## But, Parsoid treats "; :" as a tight atomic unit and excess ":" as plain text
+## So, the same wikitext above (;;t2 ::d2) is transformed into:
+##
+## <dl>
+##   <dt>
+##     <dl>
+##       <dt>t2 </dt>
+##       <dd>:d2</dd>
+##     </dl>
+##    </dt>
+## </dl>
+##
+## All Parsoid only definition list tests have this difference.
+##
+## See also: https://bugzilla.wikimedia.org/show_bug.cgi?id=6569 
+## and http://lists.wikimedia.org/pipermail/wikitext-l/2011-November/000483.html
+
+!! test
+Definition Lists: Nesting: Multi-level (Parsoid only)
+!! options
+disabled
+!! input
+;t1 :d1
+;;t2 ::d2
+;;;t3 :::d3
+!! result
+<dl>
+  <dt>t1 </dt>
+  <dd>d1</dd>
+  <dt>
+    <dl>
+      <dt>t2 </dt>
+      <dd>:d2</dd>
+      <dt>
+        <dl>
+          <dt>t3 </dt>
+          <dd>::d3</dd>
+        </dl>
+      </dt>
+    </dl>
+  </dt>
+</dl>
+
+
+!! end
+
+
+!! test
+Definition Lists: Nesting: Test 2 (Parsoid only)
+!! options
+disabled
+!! input
+;t1
+::d2
+!! result
+<dl>
+  <dt>t1</dt>
+  <dd>
+    <dl>
+      <dd>d2</dd>
+    </dl>
+  </dd>
+</dl>
 
-&lt;/pre&gt;
-</p>
 !! end
 
 
-###
-### Definition lists
-###
 !! test
-Simple definition
+Definition Lists: Nesting: Test 3 (Parsoid only)
+!! options
+disabled
 !! input
-; name : Definition
+:;t1
+::::d2
 !! result
-<dl><dt> name&#160;</dt><dd> Definition
-</dd></dl>
+<dl>
+  <dd>
+    <dl>
+      <dt>t1</dt>
+      <dd>
+        <dl>
+          <dd>
+            <dl>
+              <dd>d2</dd>
+            </dl>
+          </dd>
+        </dl>
+      </dd>
+    </dl>
+  </dd>
+</dl>
 
 !! end
 
+
 !! test
-Definition list for indentation only
+Definition Lists: Nesting: Test 4
 !! input
-: Indented text
+::;t3
+:::d3
 !! result
-<dl><dd> Indented text
+<dl><dd><dl><dd><dl><dt>t3
+</dt><dd>d3
+</dd></dl>
+</dd></dl>
 </dd></dl>
 
 !! end
 
+
 !! test
-Definition list with no space
+Definition Lists: Mixed Lists: Test 1
 !! input
-;name:Definition
+:;* foo
+::* bar
+:; baz
 !! result
-<dl><dt>name</dt><dd>Definition
+<dl><dd><dl><dt><ul><li> foo
+</li><li> bar
+</li></ul>
+</dt></dl>
+<dl><dt> baz
+</dt></dl>
 </dd></dl>
 
-!!end
+!! end
+
 
 !! test
-Definition list with URL link
+Definition Lists: Mixed Lists: Test 2
 !! input
-; http://example.com/ : definition
+*: d1
+*: d2
 !! result
-<dl><dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt><dd> definition
+<ul><li><dl><dd> d1
+</dd><dd> d2
 </dd></dl>
+</li></ul>
 
 !! end
 
+
 !! test
-Definition list with bracketed URL link
+Definition Lists: Mixed Lists: Test 3
 !! input
-;[http://www.example.com/ Example]:Something about it
+*::: d1
+*::: d2
 !! result
-<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
+<ul><li><dl><dd><dl><dd><dl><dd> d1
+</dd><dd> d2
 </dd></dl>
+</dd></dl>
+</dd></dl>
+</li></ul>
 
 !! end
 
+
 !! test
-Definition list with wikilink containing colon
+Definition Lists: Mixed Lists: Test 4
 !! input
-; [[Help:FAQ]]: The least-read page on Wikipedia
+*;d1 :d2
+*;d3 :d4
 !! result
-<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt><dd> The least-read page on Wikipedia
+<ul><li><dl><dt>d1&#160;</dt><dd>d2
+</dd><dt>d3&#160;</dt><dd>d4
 </dd></dl>
+</li></ul>
 
 !! end
 
-# At Brion's and JeLuF's insistence... :)
+
 !! test
-Definition list with news link containing colon
+Definition Lists: Mixed Lists: Test 5
 !! input
-;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
+*:d1
+*:: d2
 !! result
-<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt><dd> This isn't even a real newsgroup!
+<ul><li><dl><dd>d1
+<dl><dd> d2
+</dd></dl>
 </dd></dl>
+</li></ul>
 
 !! end
 
+
 !! test
-Malformed definition list with colon
+Definition Lists: Mixed Lists: Test 6
 !! input
-;  news:alt.wikipedia.rox -- don't crash or enter an infinite loop
+#*:d1
+#*::: d3
 !! result
-<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
-</dt></dl>
+<ol><li><ul><li><dl><dd>d1
+<dl><dd><dl><dd> d3
+</dd></dl>
+</dd></dl>
+</dd></dl>
+</li></ul>
+</li></ol>
 
 !! end
 
+
 !! test
-Definition lists: colon in external link text
+Definition Lists: Mixed Lists: Test 7
 !! input
-; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
+:* d1
+:* d2
 !! result
-<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
+<dl><dd><ul><li> d1
+</li><li> d2
+</li></ul>
 </dd></dl>
 
 !! end
 
+
 !! test
-Definition lists: colon in HTML attribute
+Definition Lists: Mixed Lists: Test 8
 !! input
-;<b style="display: inline">bold</b>
+:* d1
+::* d2
 !! result
-<dl><dt><b style="display: inline">bold</b>
-</dt></dl>
+<dl><dd><ul><li> d1
+</li></ul>
+<dl><dd><ul><li> d2
+</li></ul>
+</dd></dl>
+</dd></dl>
 
 !! end
 
 
 !! test
-Definition lists: self-closed tag
+Definition Lists: Mixed Lists: Test 9
 !! input
-;one<br/>two : two-line fun
+*;foo :bar
 !! result
-<dl><dt>one<br />two&#160;</dt><dd> two-line fun
+<ul><li><dl><dt>foo&#160;</dt><dd>bar
 </dd></dl>
+</li></ul>
 
 !! end
 
+
 !! test
-Bug 11748: Literal closing tags
-!! options
-disabled
+Definition Lists: Mixed Lists: Test 10
 !! input
-<dl>
-<dt>test 1</dt>
-<dd>test test test test test</dd>
-<dt>test 2</dt>
-<dd>test test test test test</dd>
-</dl>
+*#;foo :bar
 !! result
-<dl>
-<dt>test 1</dt>
-<dd>test test test test test</dd>
-<dt>test 2</dt>
-<dd>test test test test test</dd>
-</dl>
+<ul><li><ol><li><dl><dt>foo&#160;</dt><dd>bar
+</dd></dl>
+</li></ol>
+</li></ul>
+
 !! end
 
+
 !! test
-Definition and unordered list using wiki syntax nested in unordered list using html tags.
+Definition Lists: Mixed Lists: Test 11
 !! input
-<ul><li>
-; term : description 
-* unordered
-</li>
-</ul>
+*#*#;*;;foo :bar
+*#*#;boo :baz
 !! result
-<ul><li>
-<dl><dt> term&#160;</dt><dd> description 
+<ul><li><ol><li><ul><li><ol><li><dl><dt>foo&#160;</dt><dd><ul><li><dl><dt><dl><dt>bar
+</dt></dl>
 </dd></dl>
-<ul><li> unordered
 </li></ul>
-</li>
-</ul>
+</dd></dl>
+<dl><dt>boo&#160;</dt><dd>baz
+</dd></dl>
+</li></ol>
+</li></ul>
+</li></ol>
+</li></ul>
 
 !! end
 
+
 !! test
-Definition list with empty definition and following paragraph
+Definition Lists: Weird Ones: Test 1
 !! input
-; term:
-Paragraph text
+*#;*::;; foo : bar (who uses this?)
 !! result
-<dl><dt> term</dt><dd>
+<ul><li><ol><li><dl><dt> foo&#160;</dt><dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> bar (who uses this?)
+</dt></dl>
 </dd></dl>
-<p>Paragraph text
-</p>
+</dd></dl>
+</dd></dl>
+</li></ul>
+</dd></dl>
+</li></ol>
+</li></ul>
+
 !! end
 
 ###
@@ -931,6 +1604,23 @@ External links: [IDN ignored character reference in hostname; strip it right off
 </p>
 !! end
 
+# FIXME: This test (the IDN characters in the text of a link) is an inconsistency.
+# Where an external link could easily circumvent the sanitization of the text of
+# a link like this (where an IDN-ignore character is in the URL somewhere), this
+# test demands a higher standard. That's a bit strange.
+#
+# Example:
+#
+# http://e‌xample.com -> [http://example.com|http://example.com]
+# [http://example.com|http://e‌xample.com] -> [http://example.com|http://e‌xample.com]
+#
+# The first example is sanitized, but the second is not. Any security benefits
+# from this production are trivial to circumvent. Either remove this test and
+# let the parser(s) do their thing unaccosted, or fix the inconsistency and change
+# the test accordingly.
+#
+# All our love,
+# The Parsoid team.
 !! test
 External links: IDN ignored character reference in hostname; strip it right off
 !! input
@@ -1269,6 +1959,8 @@ Normal text.
 '''This year''''s election ''should'' beat '''last year''''s.
 
 ''Tom'''s car is bigger than ''Susan'''s.
+
+Plain ''italic'''s plain
 !! result
 <p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
 </p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
@@ -1279,6 +1971,7 @@ Normal text.
 </p><p>Normal text.
 </p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
 </p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
+</p><p>Plain <i>italic'</i>s plain
 </p>
 !! end
 
@@ -2063,20 +2756,58 @@ Failing to transform badly formed HTML into correct XHTML
 </p>
 !!end
 
-!! test 
+!! test
 Horizontal ruler (should it add that extra space?)
-!! input 
+!! input
 <hr>
 <hr >
 foo <hr
 > bar
-!! result 
+!! result
 <hr />
 <hr />
 foo <hr /> bar
 
 !! end
 
+!! test
+Horizontal ruler -- 4+ dashes render hr
+!! input
+----
+!! result
+<hr />
+
+!! end
+
+!! test
+Horizontal ruler -- eats additional dashes on the same line
+!! input
+---------
+!! result
+<hr />
+
+!! end
+
+!! test
+Horizontal ruler -- does not collaps dashes on consecutive lines
+!! input
+----
+----
+!! result
+<hr />
+<hr />
+
+!! end
+
+!! test
+Horizontal ruler -- <4 dashes render as plain text
+!! input
+---
+!! result
+<p>---
+</p>
+!! end
+
 ###
 ### Block-level elements
 ###
@@ -2237,6 +2968,36 @@ Nested lists 6 (both elements empty)
 
 !! end
 
+!! test
+Nested lists 7 (skip initial nesting levels)
+!! input
+*** foo
+!! result
+<ul><li><ul><li><ul><li> foo
+</li></ul>
+</li></ul>
+</li></ul>
+
+!! end
+
+!! test
+Nested lists 8 (multiple nesting transitions)
+!! input
+* foo
+*** bar
+** baz
+* boo
+!! result
+<ul><li> foo
+<ul><li><ul><li> bar
+</li></ul>
+</li><li> baz
+</li></ul>
+</li><li> boo
+</li></ul>
+
+!! end
+
 
 !! test
 List items are not parsed correctly following a <pre> block (bug 785)
@@ -3936,7 +4697,7 @@ Image with link parameter, URL target
 !! input
 [[Image:foobar.jpg|link=http://example.com/]]
 !! result
-<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
@@ -3947,7 +4708,29 @@ Image with link parameter, wgExternalLinkTarget
 !! config
 wgExternalLinkTarget='foobar'
 !! result
-<p><a href="http://example.com/" target="foobar"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" target="foobar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! end
+
+!! test
+Image with link parameter, wgNoFollowLinks set to false
+!! input
+[[Image:foobar.jpg|link=http://example.com/]]
+!! config
+wgNoFollowLinks=false
+!! result
+<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! end
+
+!! test
+Image with link parameter, wgNoFollowDomainExceptions
+!! input
+[[Image:foobar.jpg|link=http://example.com/]]
+!! config
+wgNoFollowDomainExceptions='example.com'
+!! result
+<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
@@ -3958,7 +4741,7 @@ Image with link parameter, wgExternalLinkTarget, unnamed parameter
 !! config
 wgExternalLinkTarget='foobar'
 !! result
-<p><a href="http://example.com/" title="Title" target="foobar"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
@@ -3985,7 +4768,7 @@ Image with link parameter (URL target) and unnamed parameter
 !! input
 [[Image:foobar.jpg|link=http://example.com/|Title]]
 !! result
-<p><a href="http://example.com/" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
@@ -4201,6 +4984,15 @@ Bug 3090: External links other than http: in image captions
 
 !! end
 
+!! test
+Custom class
+!! input
+[[Image:foobar.jpg|a|class=b]]
+!! result
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="a"><img alt="a" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="b" /></a>
+</p>
+!! end
+
 !! article 
 File:Barfoo.jpg
 !! text
@@ -4725,6 +5517,30 @@ section 5
 </p>
 !! end
 
+!! test
+Headers with excess '=' characters
+(Are similar tests necessary beyond the 1st level?)
+!! input
+=foo==
+==foo=
+=''italic'' heading==
+==''italic'' heading=
+!! result
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#italic_heading.3D"><span class="tocnumber">3</span> <span class="toctext"><i>italic</i> heading=</span></a></li>
+<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>
+
+!! end
+
 !! test
 BUG 1219 URL next to image (broken)
 !! input
@@ -8645,6 +9461,17 @@ wgUseDynamicDates=true
 </p>
 !! end
 
+!! test
+formatdate parser function, with default format and on a page of which the content language is always English and different from the wiki content language
+!! options
+language=nl title=[[MediaWiki:Common.css]]
+!! input
+{{#formatdate:2009-03-24|dmy}}
+!! result
+<p><span class="mw-formatted-date" title="2009-03-24">24 March 2009</span>
+</p>
+!! end
+
 #
 #
 #
@@ -9501,10 +10328,10 @@ abc
 </p>
 !! end
 
+
 TODO:
 more images
 more tables
-math
 character entities
 and much more
 Try for 100% code coverage
index d930ac5..4df9a61 100644 (file)
@@ -27,7 +27,7 @@
 $otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled' );
 $optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
 
-require_once( dirname( __FILE__ ) . '/../maintenance/commandLine.inc' );
+require_once( __DIR__ . '/../maintenance/commandLine.inc' );
 
 if ( isset( $options['help'] ) ) {
        echo <<<ENDS
index 783f031..6dd8ea3 100644 (file)
@@ -10,6 +10,8 @@ abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
        public function setUp() {
                global $wgLanguageCode, $wgLang, $wgContLang;
 
+               parent::setUp();
+
                self::$oldLang = $wgLang;
                self::$oldContLang = $wgContLang;
 
@@ -23,6 +25,7 @@ abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
 
                $wgContLang = $wgLang = Language::factory( $wgLanguageCode );
                MessageCache::singleton()->disable();
+
        }
 
        public function tearDown() {
@@ -32,6 +35,8 @@ abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
                $wgContLang = self::$oldContLang;
                $wgLanguageCode = $wgContLang->getCode();
                self::$oldContLang = self::$oldLang = null;
+
+               parent::tearDown();
        }
 
 }
index ea385ad..fca3251 100644 (file)
@@ -37,7 +37,7 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
                # PHPUnit uses stream_resolve_include_path() internally
                # See bug 32022
                set_include_path(
-                       dirname( __FILE__ )
+                       __DIR__
                        .PATH_SEPARATOR
                        . get_include_path()
                );
index 3729796..49c2a70 100644 (file)
@@ -115,7 +115,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        }
 
        protected function tearDown() {
-               // Cleaning up temoporary files
+               // Cleaning up temporary files
                foreach ( $this->tmpfiles as $fname ) {
                        if ( is_file( $fname ) || ( is_link( $fname ) ) ) {
                                unlink( $fname );
@@ -124,6 +124,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        }
                }
 
+               // clean up open transactions
+               if( $this->needsDB() && $this->db ) {
+                       while( $this->db->trxLevel() > 0 ) {
+                               $this->db->rollback();
+                       }
+               }
+
                parent::tearDown();
        }
 
@@ -326,10 +333,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        }
 
-       public static function disableInterwikis( $prefix, &$data ) {
-               return false;
-       }
-
        /**
         * Don't throw a warning if $function is deprecated and called later
         *
@@ -348,6 +351,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * the values given in the order of the columns in the $fields parameter.
         * Note that the rows are sorted by the columns given in $fields.
         *
+        * @since 1.20
+        *
         * @param $table String|Array the table(s) to query
         * @param $fields String|Array the columns to include in the result (and to sort by)
         * @param $condition String|Array "where" condition(s)
@@ -387,19 +392,90 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->assertFalse( $r, "found extra row (after #$i)" );
        }
 
+       /**
+        * Utility method taking an array of elements and wrapping
+        * each element in it's own array. Useful for data providers
+        * that only return a single argument.
+        *
+        * @since 1.20
+        *
+        * @param array $elements
+        *
+        * @return array
+        */
+       protected function arrayWrap( array $elements ) {
+               return array_map(
+                       function( $element ) {
+                               return array( $element );
+                       },
+                       $elements
+               );
+       }
+
+       /**
+        * Assert that two arrays are equal. By default this means that both arrays need to hold
+        * the same set of values. Using additional arguments, order and associated key can also
+        * be set as relevant.
+        *
+        * @since 1.20
+        *
+        * @param array $expected
+        * @param array $actual
+        * @param boolean $ordered If the order of the values should match
+        * @param boolean $named If the keys should match
+        */
+       protected function assertArrayEquals( array $expected, array $actual, $ordered = false, $named = false ) {
+               if ( !$ordered ) {
+                       $this->objectAssociativeSort( $expected );
+                       $this->objectAssociativeSort( $actual );
+               }
+
+               if ( !$named ) {
+                       $expected = array_values( $expected );
+                       $actual = array_values( $actual );
+               }
+
+               call_user_func_array(
+                       array( $this, 'assertEquals' ),
+                       array_merge( array( $expected, $actual ), array_slice( func_get_args(), 4 ) )
+               );
+       }
+
+       /**
+        * Does an associative sort that works for objects.
+        *
+        * @since 1.20
+        *
+        * @param array $array
+        */
+       protected function objectAssociativeSort( array &$array ) {
+               uasort(
+                       $array,
+                       function( $a, $b ) {
+                               return serialize( $a ) > serialize( $b ) ? 1 : -1;
+                       }
+               );
+       }
+
        /**
         * Utility function for eliminating all string keys from an array.
         * Useful to turn a database result row as returned by fetchRow() into
         * a pure indexed array.
         *
-        * @static
+        * @since 1.20
+        *
         * @param $r mixed the array to remove string keys from.
         */
        protected static function stripStringKeys( &$r ) {
-               if ( !is_array( $r ) ) return;
+               if ( !is_array( $r ) ) {
+                       return;
+               }
 
                foreach ( $r as $k => $v ) {
-                       if ( is_string( $k ) ) unset( $r[$k] );
+                       if ( is_string( $k ) ) {
+                               unset( $r[$k] );
+                       }
                }
        }
+
 }
index 08eb50f..933767e 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 ( dirname( __FILE__ ) . "/phpunit.php" );
+       require_once ( __DIR__ . "/phpunit.php" );
 }
 
 // Output a notice when running with older versions of PHPUnit
index f99b484..4013734 100644 (file)
Binary files a/tests/phpunit/data/media/exif-gps.jpg and b/tests/phpunit/data/media/exif-gps.jpg differ
diff --git a/tests/phpunit/data/xmp/gps.result.php b/tests/phpunit/data/xmp/gps.result.php
new file mode 100644 (file)
index 0000000..2d1243d
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+
+$result = array( 'xmp-exif' =>
+       array(
+               'GPSAltitude' => -3.14159265301,
+               'GPSDOP' => '5/1',
+               'GPSLatitude' => 88.51805555,
+               'GPSLongitude' => -21.12356945,
+               'GPSVersionID' => '2.2.0.0'
+        )
+);
+
diff --git a/tests/phpunit/data/xmp/gps.xmp b/tests/phpunit/data/xmp/gps.xmp
new file mode 100644 (file)
index 0000000..e52d2c8
--- /dev/null
@@ -0,0 +1,17 @@
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.30'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
+
+ <rdf:Description rdf:about=''
+  xmlns:exif='http://ns.adobe.com/exif/1.0/'>
+  <exif:GPSAltitude>103993/33102</exif:GPSAltitude>
+  <exif:GPSAltitudeRef>1</exif:GPSAltitudeRef>
+  <exif:GPSDOP>5/1</exif:GPSDOP>
+  <exif:GPSLatitude>88,31.083333N</exif:GPSLatitude>
+  <exif:GPSLongitude>21,7.414167W</exif:GPSLongitude>
+  <exif:GPSVersionID>2.2.0.0</exif:GPSVersionID>
+ </rdf:Description>
+
+</rdf:RDF>
+</x:xmpmeta>
+<?xpacket end='w'?>
diff --git a/tests/phpunit/docs/ExportDemoTest.php b/tests/phpunit/docs/ExportDemoTest.php
new file mode 100644 (file)
index 0000000..ce65d49
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Test for the demo xml
+ *
+ * @group Dump
+ */
+class ExportDemoTest extends DumpTestCase {
+
+       /**
+        * @group large
+        */
+       function testExportDemo() {
+               $this->validateXmlFileAgainstXsd( "../../docs/export-demo.xml" );
+       }
+
+       /**
+        * Validates a xml file against the xsd.
+        *
+        * The validation is slow, because php has to read the xsd on each call.
+        *
+        * @param $fname string: name of file to validate
+        */
+       protected function validateXmlFileAgainstXsd( $fname ) {
+               $version = WikiExporter::schemaVersion();
+
+               $dom = new DomDocument();
+               $dom->load( $fname );
+
+               try {
+                       $this->assertTrue( $dom->schemaValidate( "../../docs/export-" . $version . ".xsd" ),
+                               "schemaValidate has found an error" );
+               } catch( Exception $e ) {
+                       $this->fail( "xml not valid against xsd: " . $e->getMessage() );
+               }
+       }
+}
index 02571b5..17cee6e 100644 (file)
@@ -17,14 +17,14 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
 
                $wgLang = Language::factory( 'fr' );
                $status = $page->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', 0, false, $user );
-               $templates1 = $page->getUsedTemplates();
+               $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->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', EDIT_UPDATE, false, $user );
-               $templates2 = $page->getUsedTemplates();
+               $templates2 = $title->getTemplateLinksFrom();
 
                $this->assertEquals( $templates1, $templates2 );
                $this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
index f197da8..0c95b8d 100644 (file)
@@ -123,6 +123,67 @@ class BlockTest extends MediaWikiLangTestCase {
                );
        }
 
+       function testBlockedUserCanNotCreateAccount() {
+               $username = 'BlockedUserToCreateAccountWith';
+               $u = User::newFromName( $username );
+               $u->setPassword( 'NotRandomPass' );
+               $u->addToDatabase();
+               unset( $u );
+
+
+               // Sanity check
+               $this->assertNull(
+                       Block::newFromTarget( $username ),
+                       "$username should not be blocked"
+               );
+
+               // Reload user
+               $u = User::newFromName( $username );
+               $this->assertFalse(
+                       $u->isBlockedFromCreateAccount(),
+                       "Our sandbox user should be able to create account before being blocked"
+               );
+
+               // Foreign perspective (blockee not on current wiki)...
+               $block = new Block(
+                       /* $address */ $username,
+                       /* $user */ 14146,
+                       /* $by */ 0,
+                       /* $reason */ 'crosswiki block...',
+                       /* $timestamp */ wfTimestampNow(),
+                       /* $auto */ false,
+                       /* $expiry */ $this->db->getInfinity(),
+                       /* anonOnly */ false,
+                       /* $createAccount */ true,
+                       /* $enableAutoblock */ true,
+                       /* $hideName (ipb_deleted) */ true,
+                       /* $blockEmail */ true,
+                       /* $allowUsertalk */ false,
+                       /* $byName */ 'MetaWikiUser'
+               );
+               $block->insert();
+
+               // Reload block from DB
+               $userBlock = Block::newFromTarget( $username );
+               $this->assertTrue(
+                       (bool) $block->prevents( 'createaccount' ),
+                       "Block object in DB should prevents 'createaccount'"
+               );
+
+               $this->assertInstanceOf(
+                       'Block',
+                       $userBlock,
+                       "'$username' block block object should be existent"
+               );
+
+               // Reload user
+               $u = User::newFromName( $username );
+               $this->assertTrue(
+                       (bool) $u->isBlockedFromCreateAccount(),
+                       "Our sandbox user '$username' should NOT be able to create account"
+               );
+       }
+
        function testCrappyCrossWikiBlocks() {
                // Delete the last round's block if it's still there
                $oldBlock = Block::newFromTarget( 'UserOnForeignWiki' );
index a9088cb..903a6d2 100644 (file)
@@ -21,6 +21,8 @@ class ExtraParserTest extends MediaWikiTestCase {
                $this->options = new ParserOptions;
                $this->options->setTemplateCallback( array( __CLASS__, 'statelessFetchTemplate' ) );
                $this->parser = new Parser;
+
+               MagicWord::clearCache();
        }
 
        // Bug 8689 - Long numeric lines kill the parser
@@ -146,7 +148,7 @@ class ExtraParserTest extends MediaWikiTestCase {
         */
        function testTrackingCategory() {
                $title = Title::newFromText( __FUNCTION__ );
-               $catName =  wfMsgForContent( 'broken-file-category' );
+               $catName =  wfMessage( 'broken-file-category' )->inContentLanguage()->text();
                $cat = Title::makeTitleSafe( NS_CATEGORY, $catName );
                $expected = array( $cat->getDBkey() );
                $parserOutput = $this->parser->parse( "[[file:nonexistent]]" , $title, $this->options );
index 94158bf..9097d30 100644 (file)
@@ -311,7 +311,7 @@ class GlobalTest extends MediaWikiTestCase {
        
        function testDebugFunctionTest() {
        
-               global $wgDebugLogFile, $wgOut, $wgShowDebug, $wgDebugTimestamps;
+               global $wgDebugLogFile, $wgDebugTimestamps;
                
                $old_log_file = $wgDebugLogFile;
                $wgDebugLogFile = tempnam( wfTempDir(), 'mw-' );
@@ -333,33 +333,7 @@ class GlobalTest extends MediaWikiTestCase {
                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 );
-               
-               
-               
-               $old_wgOut = $wgOut;
-               $old_wgShowDebug = $wgShowDebug;
-               
-               $wgOut = new MockOutputPage;
-               
-               $wgShowDebug = true;
-               
-               $message = "\00305This has böth UTF and control chars\003";
-               
-               wfDebug( $message );
-               
-               if( $wgOut->message == "JAJA is a stupid error message. Anyway, here's your message: $message" ) {
-                       $this->assertTrue( true, 'MockOutputPage called, set the proper message.' );
-               }
-               else {
-                       $this->assertTrue( false, 'MockOutputPage was not called.' );
-               }
-               
-               $wgOut = $old_wgOut;
-               $wgShowDebug = $old_wgShowDebug;                
-               unlink( $wgDebugLogFile );
-               
-               
-               
+
                wfDebugMem();
                $this->assertGreaterThan( 5000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
                unlink( $wgDebugLogFile );
index 8b019d7..0dd85c1 100644 (file)
@@ -6,15 +6,18 @@ class HtmlTest extends MediaWikiTestCase {
        private static $oldContLang;
        private static $oldLanguageCode;
        private static $oldNamespaces;
+       private static $oldHTML5;
 
        public function setUp() {
-               global $wgLang, $wgContLang, $wgLanguageCode;
-               
+               global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
+
+               // Save globals
                self::$oldLang = $wgLang;
                self::$oldContLang = $wgContLang;
                self::$oldNamespaces = $wgContLang->getNamespaces();
                self::$oldLanguageCode = $wgLanguageCode;
-               
+               self::$oldHTML5 = $wgHTML5;
+
                $wgLanguageCode = 'en';
                $wgContLang = $wgLang = Language::factory( $wgLanguageCode );
 
@@ -42,14 +45,35 @@ class HtmlTest extends MediaWikiTestCase {
                        101  => 'Custom_talk',
                ) );
        }
-       
+
        public function tearDown() {
-               global $wgLang, $wgContLang, $wgLanguageCode;
+               global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
 
+               // Restore globals
                $wgContLang->setNamespaces( self::$oldNamespaces );
                $wgLang = self::$oldLang;
                $wgContLang = self::$oldContLang;
                $wgLanguageCode = self::$oldLanguageCode;
+               $wgHTML5 = self::$oldHTML5;
+       }
+
+       /**
+        * Wrapper to easily set $wgHTML5 = true.
+        * Original value will be restored after test completion.
+        * @todo Move to MediaWikiTestCase
+        */
+       public function enableHTML5() {
+               global $wgHTML5;
+               $wgHTML5 = true;
+       }
+       /**
+        * Wrapper to easily set $wgHTML5 = false
+        * Original value will be restored after test completion.
+        * @todo Move to MediaWikiTestCase
+        */
+       public function disableHTML5() {
+               global $wgHTML5;
+               $wgHTML5 = false;
        }
 
        public function testExpandAttributesSkipsNullAndFalse() {
diff --git a/tests/phpunit/includes/LocalisationCacheTest.php b/tests/phpunit/includes/LocalisationCacheTest.php
new file mode 100644 (file)
index 0000000..356db87
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+class LocalisationCacheTest extends MediaWikiTestCase {
+       public function testPuralRulesFallback() {
+               $cache = Language::getLocalisationCache();
+
+               $this->assertEquals(
+                       $cache->getItem( 'ru', 'pluralRules' ),
+                       $cache->getItem( 'os', 'pluralRules' ),
+                       'os plural rules (undefined) fallback to ru (defined)'
+               );
+
+               $this->assertEquals(
+                       $cache->getItem( 'ru', 'compiledPluralRules' ),
+                       $cache->getItem( 'os', 'compiledPluralRules' ),
+                       'os compiled plural rules (undefined) fallback to ru (defined)'
+               );
+
+               $this->assertNotEquals(
+                       $cache->getItem( 'ksh', 'pluralRules' ),
+                       $cache->getItem( 'de', 'pluralRules' ),
+                       'ksh plural rules (defined) dont fallback to de (defined)'
+               );
+
+               $this->assertNotEquals(
+                       $cache->getItem( 'ksh', 'compiledPluralRules' ),
+                       $cache->getItem( 'de', 'compiledPluralRules' ),
+                       'ksh compiled plural rules (defined) dont fallback to de (defined)'
+               );
+       }
+}
index da36ffd..3b05d67 100644 (file)
@@ -437,6 +437,36 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $wgContentNamespaces = $saved;
        }
 
+       /**
+        */
+       public function testGetSubjectNamespaces() {
+               $subjectsNS = MWNamespace::getSubjectNamespaces();
+               $this->assertContains(    NS_MAIN, $subjectsNS,
+                       "Talk namespaces should have NS_MAIN" );
+               $this->assertNotContains( NS_TALK, $subjectsNS,
+                       "Talk namespaces should have NS_TALK" );
+
+               $this->assertNotContains( NS_MEDIA, $subjectsNS,
+                       "Talk namespaces should not have NS_MEDIA" );
+               $this->assertNotContains( NS_SPECIAL, $subjectsNS,
+                       "Talk namespaces should not have NS_SPECIAL" );
+       }
+
+       /**
+        */
+       public function testGetTalkNamespaces() {
+               $talkNS = MWNamespace::getTalkNamespaces();
+               $this->assertContains(    NS_TALK, $talkNS,
+                       "Subject namespaces should have NS_TALK" );
+               $this->assertNotContains( NS_MAIN, $talkNS,
+                       "Subject namespaces should not have NS_MAIN" );
+
+               $this->assertNotContains( NS_MEDIA, $talkNS,
+                       "Subject namespaces should not have NS_MEDIA" );
+               $this->assertNotContains( NS_SPECIAL, $talkNS,
+                       "Subject namespaces should not have NS_SPECIAL" );
+       }
+
        /**
         * Some namespaces are always capitalized per code definition
         * in MWNamespace::$alwaysCapitalizedNamespaces
diff --git a/tests/phpunit/includes/MockOutputPage.php b/tests/phpunit/includes/MockOutputPage.php
deleted file mode 100644 (file)
index bdee483..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-class MockOutputPage {
-
-       public $message;
-
-       function debug( $message ) {
-               $this->message = "JAJA is a stupid error message. Anyway, here's your message: $message";
-       }
-}
index 20199b2..6d82d0c 100644 (file)
@@ -213,6 +213,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testRevText()
        {
+               $this->hideDeprecated( 'Revision::revText' );
                $orig = $this->makeRevision( array( 'text' => 'hello hello rev.' ) );
                $rev = Revision::newFromId( $orig->getId() );
 
index 77a371d..59ba0a0 100644 (file)
@@ -47,7 +47,7 @@ class TestSample extends MediaWikiLangTestCase {
                        array( 'Text', null, 'Text' ),
                        array( 'text', null, 'Text' ),
                        array( 'Text', NS_USER, 'User:Text' ),
-                       array( 'Photo.jpg', NS_IMAGE, 'File:Photo.jpg' )
+                       array( 'Photo.jpg', NS_FILE, 'File:Photo.jpg' )
                );
        }
 
index b76aa5c..c929989 100644 (file)
@@ -110,21 +110,37 @@ class SanitizerTest extends MediaWikiTestCase {
                $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=&foobar;' ), array( 'foo' => '&foobar;' ), 'Entity-like items are accepted' );
        }
 
-       function testDeprecatedAttributes() {
-               $GLOBALS['wgCleanupPresentationalAttributes'] = true;
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'clear="left"', 'br' ), ' style="clear: left;"', 'Deprecated attributes are converted to styles when enabled.' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'clear="all"', 'br' ), ' style="clear: both;"', 'clear=all is converted to clear: both; not clear: all;' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'CLEAR="ALL"', 'br' ), ' style="clear: both;"', 'clear=ALL is not treated differently from clear=all' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'width="100"', 'td' ), ' style="width: 100px;"', 'Numeric sizes use pixels instead of numbers.' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'width="100%"', 'td' ), ' style="width: 100%;"', 'Units are allowed in sizes.' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'WIDTH="100%"', 'td' ), ' style="width: 100%;"', 'Uppercase WIDTH is treated as lowercase width.' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'WiDTh="100%"', 'td' ), ' style="width: 100%;"', 'Mixed case does not break WiDTh.' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'nowrap="true"', 'td' ), ' style="white-space: nowrap;"', 'nowrap attribute is output as white-space: nowrap; not something else.' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'nowrap=""', 'td' ), ' style="white-space: nowrap;"', 'nowrap="" is considered true, not false' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'NOWRAP="true"', 'td' ), ' style="white-space: nowrap;"', 'nowrap attribute works when uppercase.' );
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'NoWrAp="true"', 'td' ), ' style="white-space: nowrap;"', 'nowrap attribute works when mixed-case.' );
+       function testDeprecatedAttributesDisabled() {
                $GLOBALS['wgCleanupPresentationalAttributes'] = false;
-               $this->assertEquals( Sanitizer::fixTagAttributes( 'clear="left"', 'br' ), ' clear="left"', 'Deprecated attributes are not converted to styles when enabled.' );
+               $this->assertEquals( ' clear="left"', Sanitizer::fixTagAttributes( 'clear="left"', 'br' ), 'Deprecated attributes are not converted to styles when enabled.' );
+       }
+
+       /**
+        * @dataProvider provideDeprecatedAttributes
+        */
+       function testDeprecatedAttributes( $input, $tag, $expected, $message = null ) {
+               $GLOBALS['wgCleanupPresentationalAttributes'] = true;
+               $this->assertEquals( $expected, Sanitizer::fixTagAttributes( $input, $tag ), $message );
+       }
+
+       function provideDeprecatedAttributes() {
+               return array(
+                       array( 'clear="left"', 'br', ' style="clear: left;"', 'Deprecated attributes are converted to styles when enabled.' ),
+                       array( 'clear="all"', 'br', ' style="clear: both;"', 'clear=all is converted to clear: both; not clear: all;' ),
+                       array( 'CLEAR="ALL"', 'br', ' style="clear: both;"', 'clear=ALL is not treated differently from clear=all' ),
+                       array( 'width="100"', 'td', ' style="width: 100px;"', 'Numeric sizes use pixels instead of numbers.' ),
+                       array( 'width="100%"', 'td', ' style="width: 100%;"', 'Units are allowed in sizes.' ),
+                       array( 'WIDTH="100%"', 'td', ' style="width: 100%;"', 'Uppercase WIDTH is treated as lowercase width.' ),
+                       array( 'WiDTh="100%"', 'td', ' style="width: 100%;"', 'Mixed case does not break WiDTh.' ),
+                       array( 'nowrap="true"', 'td', ' style="white-space: nowrap;"', 'nowrap attribute is output as white-space: nowrap; not something else.' ),
+                       array( 'nowrap=""', 'td', ' style="white-space: nowrap;"', 'nowrap="" is considered true, not false' ),
+                       array( 'NOWRAP="true"', 'td', ' style="white-space: nowrap;"', 'nowrap attribute works when uppercase.' ),
+                       array( 'NoWrAp="true"', 'td', ' style="white-space: nowrap;"', 'nowrap attribute works when mixed-case.' ),
+                       array( 'align="right"', 'td', ' style="text-align: right;"', 'align on table cells gets converted to text-align' ),
+                       array( 'align="center"', 'td', ' style="text-align: center;"', 'align on table cells gets converted to text-align' ),
+                       array( 'align="left"', 'div', ' style="float: left;"', 'align=(left|right) on non-cells gets converted to float' ),
+                       array( 'align="center"', 'div', ' style="margin-left: auto; margin-right: auto;"', 'align="center" on non-cells' ),
+               );
        }
 
        /**
index 416ec86..39ce6e3 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @group Database
  */
-require dirname( __FILE__ ) . "/../../../maintenance/runJobs.php";
+require __DIR__ . "/../../../maintenance/runJobs.php";
 
 class TemplateCategoriesTest extends MediaWikiLangTestCase {
 
index ef03e83..7a424ae 100644 (file)
@@ -140,4 +140,32 @@ class UserTest extends MediaWikiTestCase {
                        array( 'Ab cd', false, ' Ideographic space' ),
                );
        }
+
+       /**
+        * Test, if for all rights a right- message exist,
+        * which is used on Special:ListGroupRights as help text
+        * Extensions and core
+        */
+       public function testAllRightsWithMessage() {
+               //Getting all user rights, for core: User::$mCoreRights, for extensions: $wgAvailableRights
+               $allRights = User::getAllRights();
+               $allMessageKeys = Language::getMessageKeysFor( 'en' );
+
+               $rightsWithMessage = array();
+               foreach ( $allMessageKeys as $message ) {
+                       // === 0: must be at beginning of string (position 0)
+                       if ( strpos( $message, 'right-' ) === 0 ) {
+                               $rightsWithMessage[] = substr( $message, strlen( 'right-' ) );
+                       }
+               }
+
+               sort( $allRights );
+               sort( $rightsWithMessage );
+
+               $this->assertEquals(
+                       $allRights,
+                       $rightsWithMessage,
+                       'Each user rights (core/extensions) has a corresponding right- message.'
+               );
+       }
 }
index c8606cc..2949a3a 100644 (file)
@@ -478,7 +478,7 @@ more stuff
                $this->assertEquals( $expected, $text );
        }
 
-       /* @FIXME: fix this!
+       /* @todo FIXME: fix this!
        public function testGetUndoText() {
                global $wgDiff3;
 
@@ -769,6 +769,7 @@ more stuff
         * @dataProvider dataPreSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
+               $this->hideDeprecated( 'WikiPage::preSaveTransform' );
                $user = new User();
                $user->setName("127.0.0.1");
 
index 1d4a36f..93ed3dc 100644 (file)
@@ -251,6 +251,15 @@ class XmlTest extends MediaWikiTestCase {
                );
        }
 
+       function testLanguageSelector() {
+               $select = Xml::languageSelector( 'en', true, null,
+                       array( 'id' => 'testlang' ), wfMessage( 'yourlanguage' ) );
+               $this->assertEquals(
+                       '<label for="testlang">Language:</label>',
+                       $select[0]
+               );
+       }
+
        #
        # JS
        #
index f7ca59e..d90a695 100644 (file)
@@ -4,7 +4,7 @@ class ZipDirectoryReaderTest extends MediaWikiTestCase {
        var $zipDir, $entries;
 
        function setUp() {
-               $this->zipDir = dirname( __FILE__ ) . '/../data/zip';
+               $this->zipDir = __DIR__ . '/../data/zip';
        }
 
        function zipCallback( $entry ) {
index 1f40b5a..5dfceee 100644 (file)
@@ -56,7 +56,7 @@ class ApiBlockTest extends ApiTestCase {
                        'action' => 'block',
                        'user' => 'UTApiBlockee',
                        'reason' => 'Some reason',
-                       'token' => $pageinfo['blocktoken'] ), $data, false, self::$users['sysop']->user );
+                       'token' => $pageinfo['blocktoken'] ), null, false, self::$users['sysop']->user );
 
                $block = Block::newFromTarget('UTApiBlockee');
 
diff --git a/tests/phpunit/includes/api/ApiEditPageTest.php b/tests/phpunit/includes/api/ApiEditPageTest.php
new file mode 100644 (file)
index 0000000..5297d6d
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * Tests for MediaWiki api.php?action=edit.
+ *
+ * @author Daniel Kinzler
+ *
+ * @group API
+ * @group Database
+ */
+class ApiEditPageTest extends ApiTestCase {
+
+       function setUp() {
+               parent::setUp();
+               $this->doLogin();
+       }
+
+       function testEdit( ) {
+               $name = 'ApiEditPageTest_testEdit';
+
+               // -- test new page --------------------------------------------
+               $apiResult = $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $name,
+                               'text' => 'some text', ) );
+               $apiResult = $apiResult[0];
+
+               # Validate API result data
+               $this->assertArrayHasKey( 'edit', $apiResult );
+               $this->assertArrayHasKey( 'result', $apiResult['edit'] );
+               $this->assertEquals( 'Success', $apiResult['edit']['result'] );
+
+               $this->assertArrayHasKey( 'new', $apiResult['edit'] );
+               $this->assertArrayNotHasKey( 'nochange', $apiResult['edit'] );
+
+               $this->assertArrayHasKey( 'pageid', $apiResult['edit'] );
+
+               // -- test existing page, no change ----------------------------
+               $data = $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $name,
+                               'text' => 'some text', ) );
+
+               $this->assertEquals( 'Success', $data[0]['edit']['result'] );
+
+               $this->assertArrayNotHasKey( 'new', $data[0]['edit'] );
+               $this->assertArrayHasKey( 'nochange', $data[0]['edit'] );
+
+               // -- test existing page, with change --------------------------
+               $data = $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $name,
+                               'text' => 'different text' ) );
+
+               $this->assertEquals( 'Success', $data[0]['edit']['result'] );
+
+               $this->assertArrayNotHasKey( 'new', $data[0]['edit'] );
+               $this->assertArrayNotHasKey( 'nochange', $data[0]['edit'] );
+
+               $this->assertArrayHasKey( 'oldrevid', $data[0]['edit'] );
+               $this->assertArrayHasKey( 'newrevid', $data[0]['edit'] );
+               $this->assertNotEquals(
+                       $data[0]['edit']['newrevid'],
+                       $data[0]['edit']['oldrevid'],
+                       "revision id should change after edit"
+               );
+       }
+
+       function testEditAppend() {
+               $this->markTestIncomplete( "not yet implemented" );
+       }
+
+       function testEditSection() {
+               $this->markTestIncomplete( "not yet implemented" );
+       }
+
+       function testUndo() {
+               $this->markTestIncomplete( "not yet implemented" );
+       }
+
+       function testEditNonText() {
+               $this->markTestIncomplete( "not yet implemented" );
+       }
+}
index 8801391..d6c48cb 100644 (file)
@@ -43,15 +43,31 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
        }
 
-       protected function doApiRequest( $params, $session = null, $appendModule = false, $user = null ) {
+       protected function doApiRequest( Array $params, Array $session = null, $appendModule = false, User $user = null ) {
+               global $wgRequest, $wgUser;
+
                if ( is_null( $session ) ) {
-                       $session = array();
+                       # re-use existing global session by default
+                       $session = $wgRequest->getSessionArray();
+               }
+
+               # set up global environment
+               if ( $user ) {
+                       $wgUser = $user;
                }
 
-               $context = $this->apiContext->newTestContext( $params, $session, $user );
+               $wgRequest = new FauxRequest( $params, true, $session );
+               RequestContext::getMain()->setRequest( $wgRequest );
+
+               # set up local environment
+               $context = $this->apiContext->newTestContext( $wgRequest, $wgUser );
+
                $module = new ApiMain( $context, true );
+
+               # run it!
                $module->execute();
 
+               # construct result
                $results = array(
                        $module->getResultData(),
                        $context->getRequest(),
@@ -68,11 +84,17 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         * Add an edit token to the API request
         * This is cheating a bit -- we grab a token in the correct format and then add it to the pseudo-session and to the
         * request, without actually requesting a "real" edit token
-        * @param $params: key-value API params
-        * @param $session: session array
-        * @param $user String|null A User object for the context 
+        * @param $params Array: key-value API params
+        * @param $session Array|null: session array
+        * @param $user User|null A User object for the context
         */
-       protected function doApiRequestWithToken( $params, $session, $user = null ) {
+       protected function doApiRequestWithToken( Array $params, Array $session = null, User $user = null ) {
+               global $wgRequest;
+
+               if ( $session === null ) {
+                       $session = $wgRequest->getSessionArray();
+               }
+
                if ( $session['wsToken'] ) {
                        // add edit token to fake session
                        $session['wsEditToken'] = $session['wsToken'];
@@ -97,17 +119,17 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        'lgtoken' => $token,
                        'lgname' => self::$users['sysop']->username,
                        'lgpassword' => self::$users['sysop']->password
-                       ), $data );
+                       ), $data[2] );
 
                return $data;
        }
 
-       protected function getTokenList( $user ) {
+       protected function getTokenList( $user, $session = null ) {
                $data = $this->doApiRequest( array(
                        'action' => 'query',
                        'titles' => 'Main Page',
-                       'intoken' => 'edit|delete|protect|move|block|unblock',
-                       'prop' => 'info' ), false, $user->user );
+                       'intoken' => 'edit|delete|protect|move|block|unblock|watch',
+                       'prop' => 'info' ), $session, false, $user->user );
                return $data;
        }
 }
@@ -154,14 +176,13 @@ class ApiTestContext extends RequestContext {
        /**
         * Returns a DerivativeContext with the request variables in place
         *
-        * @param $params Array key-value API params
-        * @param $session Array session data
+        * @param $request WebRequest request object including parameters and session
         * @param $user User or null
         * @return DerivativeContext
         */
-       public function newTestContext( $params, $session, $user = null ) {
+       public function newTestContext( WebRequest $request, User $user = null ) {
                $context = new DerivativeContext( $this );
-               $context->setRequest( new FauxRequest( $params, true, $session ) );
+               $context->setRequest( $request );
                if ( $user !== null ) {
                        $context->setUser( $user );
                }
index d2c742a..d2e9815 100644 (file)
@@ -13,26 +13,26 @@ class ApiWatchTest extends ApiTestCase {
        }
 
        function getTokens() {
-               return $this->getTokenList( self::$users['sysop'] );
+               $data = $this->getTokenList( self::$users['sysop'] );
+
+               $keys = array_keys( $data[0]['query']['pages'] );
+               $key = array_pop( $keys );
+               $pageinfo = $data[0]['query']['pages'][$key];
+
+               return $pageinfo;
        }
 
        /**
-        * @group Broken
         */
        function testWatchEdit() {
-
-               $data = $this->getTokens();
-
-               $keys = array_keys( $data[0]['query']['pages'] );
-               $key = array_pop( $keys );
-               $pageinfo = $data[0]['query']['pages'][$key];
+               $pageinfo = $this->getTokens();
 
                $data = $this->doApiRequest( array(
                        'action' => 'edit',
                        'title' => 'UTPage',
                        'text' => 'new text',
                        'token' => $pageinfo['edittoken'],
-                       'watchlist' => 'watch' ), $data );
+                       'watchlist' => 'watch' ) );
                $this->assertArrayHasKey( 'edit', $data[0] );
                $this->assertArrayHasKey( 'result', $data[0]['edit'] );
                $this->assertEquals( 'Success', $data[0]['edit']['result'] );
@@ -42,13 +42,14 @@ class ApiWatchTest extends ApiTestCase {
 
        /**
         * @depends testWatchEdit
-        * @group Broken
         */
        function testWatchClear() {
 
+               $pageinfo = $this->getTokens();
+
                $data = $this->doApiRequest( array(
                        'action' => 'query',
-                       'list' => 'watchlist' ), $data );
+                       'list' => 'watchlist' ) );
 
                if ( isset( $data[0]['query']['watchlist'] ) ) {
                        $wl = $data[0]['query']['watchlist'];
@@ -57,7 +58,8 @@ class ApiWatchTest extends ApiTestCase {
                                $data = $this->doApiRequest( array(
                                        'action' => 'watch',
                                        'title' => $page['title'],
-                                       'unwatch' => true ), $data );
+                                       'unwatch' => true,
+                                       'token' => $pageinfo['watchtoken'] ) );
                        }
                }
                $data = $this->doApiRequest( array(
@@ -71,22 +73,17 @@ class ApiWatchTest extends ApiTestCase {
        }
 
        /**
-        * @group Broken
         */
        function testWatchProtect() {
 
-               $data = $this->getTokens();
-
-               $keys = array_keys( $data[0]['query']['pages'] );
-               $key = array_pop( $keys );
-               $pageinfo = $data[0]['query']['pages'][$key];
+               $pageinfo = $this->getTokens();
 
                $data = $this->doApiRequest( array(
                        'action' => 'protect',
                        'token' => $pageinfo['protecttoken'],
                        'title' => 'UTPage',
                        'protections' => 'edit=sysop',
-                       'watchlist' => 'unwatch' ), $data );
+                       'watchlist' => 'unwatch' ) );
 
                $this->assertArrayHasKey( 'protect', $data[0] );
                $this->assertArrayHasKey( 'protections', $data[0]['protect'] );
@@ -95,21 +92,20 @@ class ApiWatchTest extends ApiTestCase {
        }
 
        /**
-        * @group Broken
         */
        function testGetRollbackToken() {
 
-               $data = $this->getTokens();
+               $pageinfo = $this->getTokens();
 
                if ( !Title::newFromText( 'UTPage' )->exists() ) {
-                       $this->markTestIncomplete( "The article [[UTPage]] does not exist" );
+                       $this->markTestSkipped( "The article [[UTPage]] does not exist" ); //TODO: just create it?
                }
 
                $data = $this->doApiRequest( array(
                        'action' => 'query',
                        'prop' => 'revisions',
                        'titles' => 'UTPage',
-                       'rvtoken' => 'rollback' ), $data );
+                       'rvtoken' => 'rollback' ) );
 
                $this->assertArrayHasKey( 'query', $data[0] );
                $this->assertArrayHasKey( 'pages', $data[0]['query'] );
@@ -117,7 +113,7 @@ class ApiWatchTest extends ApiTestCase {
                $key = array_pop( $keys );
 
                if ( isset( $data[0]['query']['pages'][$key]['missing'] ) ) {
-                       $this->markTestIncomplete( "Target page (UTPage) doesn't exist" );
+                       $this->markTestSkipped( "Target page (UTPage) doesn't exist" );
                }
 
                $this->assertArrayHasKey( 'pageid', $data[0]['query']['pages'][$key] );
@@ -129,21 +125,27 @@ class ApiWatchTest extends ApiTestCase {
        }
 
        /**
-        * @depends testGetRollbackToken
         * @group Broken
+        * Broken because there is currently no revision info in the $pageinfo
+        *
+        * @depends testGetRollbackToken
         */
        function testWatchRollback( $data ) {
                $keys = array_keys( $data[0]['query']['pages'] );
                $key = array_pop( $keys );
-               $pageinfo = $data[0]['query']['pages'][$key]['revisions'][0];
+               $pageinfo = $data[0]['query']['pages'][$key];
+               $revinfo = $pageinfo['revisions'][0];
 
                try {
                        $data = $this->doApiRequest( array(
                                'action' => 'rollback',
                                'title' => 'UTPage',
-                               'user' => $pageinfo['user'],
+                               'user' => $revinfo['user'],
                                'token' => $pageinfo['rollbacktoken'],
-                               'watchlist' => 'watch' ), $data );
+                               'watchlist' => 'watch' ) );
+
+                       $this->assertArrayHasKey( 'rollback', $data[0] );
+                       $this->assertArrayHasKey( 'title', $data[0]['rollback'] );
                } catch( UsageException $ue ) {
                        if( $ue->getCodeString() == 'onlyauthor' ) {
                                $this->markTestIncomplete( "Only one author to 'UTPage', cannot test rollback" );
@@ -151,32 +153,23 @@ class ApiWatchTest extends ApiTestCase {
                                $this->fail( "Received error '" . $ue->getCodeString() . "'" );
                        }
                }
-
-               $this->assertArrayHasKey( 'rollback', $data[0] );
-               $this->assertArrayHasKey( 'title', $data[0]['rollback'] );
        }
 
        /**
-        * @group Broken
         */
        function testWatchDelete() {
-
-               $data = $this->getTokens();
-
-               $keys = array_keys( $data[0]['query']['pages'] );
-               $key = array_pop( $keys );
-               $pageinfo = $data[0]['query']['pages'][$key];
+               $pageinfo = $this->getTokens();
 
                $data = $this->doApiRequest( array(
                        'action' => 'delete',
                        'token' => $pageinfo['deletetoken'],
-                       'title' => 'UTPage' ), $data );
+                       'title' => 'UTPage' ) );
                $this->assertArrayHasKey( 'delete', $data[0] );
                $this->assertArrayHasKey( 'title', $data[0]['delete'] );
 
                $data = $this->doApiRequest( array(
                        'action' => 'query',
-                       'list' => 'watchlist' ), $data );
+                       'list' => 'watchlist' ) );
 
                $this->markTestIncomplete( 'This test needs to verify the deleted article was added to the users watchlist' );
        }
index 86c0a82..8b6a384 100644 (file)
@@ -79,7 +79,7 @@ class RandomImageGenerator {
                        foreach ( array(
                                        '/usr/share/dict/words',
                                        '/usr/dict/words',
-                                       dirname( __FILE__ ) . '/words.txt' )
+                                       __DIR__ . '/words.txt' )
                                        as $dictionaryFile ) {
                                if ( is_file( $dictionaryFile ) and is_readable( $dictionaryFile ) ) {
                                        $this->dictionaryFile = $dictionaryFile;
index f3a14e5..ee34562 100644 (file)
@@ -6,14 +6,18 @@
  */
 
 // Evaluate the include path relative to this file
-$IP = dirname( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) );
+$IP = dirname( dirname( dirname( dirname( __DIR__ ) ) ) );
 
 // Start up MediaWiki in command-line mode
 require_once( "$IP/maintenance/Maintenance.php" );
-require("RandomImageGenerator.php");
+require(  __DIR__ . "/RandomImageGenerator.php" );
 
 class GenerateRandomImages extends Maintenance {
 
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
+
        public function execute() {
 
                $getOptSpec = array(
diff --git a/tests/phpunit/includes/cache/ProcessCacheLRUTest.php b/tests/phpunit/includes/cache/ProcessCacheLRUTest.php
new file mode 100644 (file)
index 0000000..30bfb12
--- /dev/null
@@ -0,0 +1,239 @@
+<?php
+
+/**
+ * Test for ProcessCacheLRU class.
+ *
+ * Note that it uses the ProcessCacheLRUTestable class which extends some
+ * properties and methods visibility. That class is defined at the end of the
+ * file containing this class.
+ *
+ * @group Cache
+ */
+class ProcessCacheLRUTest extends MediaWikiTestCase {
+
+       /**
+        * Helper to verify emptiness of a cache object.
+        * Compare against an array so we get the cache content difference.
+        */
+       function assertCacheEmpty( $cache, $msg = 'Cache should be empty' ) {
+               $this->assertAttributeEquals( array(), 'cache', $cache, $msg );
+       }
+
+       /**
+        * Helper to fill a cache object passed by reference
+        */
+       function fillCache( &$cache, $numEntries ) {
+               // Fill cache with three values
+               for( $i=1; $i<=$numEntries; $i++) {
+                       $cache->set( "cache-key-$i", "prop-$i", "value-$i" );
+               }
+       }
+
+       /**
+        * Generates an array of what would be expected in cache for a given cache
+        * size and a number of entries filled in sequentially
+        */
+       function getExpectedCache( $cacheMaxEntries, $entryToFill ) {
+               $expected = array();
+
+               if( $entryToFill === 0 ) {
+                       # The cache is empty!
+                       return array();
+               } elseif( $entryToFill <= $cacheMaxEntries ) {
+                       # Cache is not fully filled
+                       $firstKey = 1;
+               } else {
+                       # Cache overflowed
+                       $firstKey = 1 + $entryToFill - $cacheMaxEntries;
+               }
+
+               $lastKey  = $entryToFill;
+
+               for( $i=$firstKey; $i<=$lastKey; $i++ ) {
+                       $expected["cache-key-$i"] = array( "prop-$i" => "value-$i" );
+               }
+               return $expected;
+       }
+
+       /**
+        * Highlight diff between assertEquals and assertNotSame
+        */
+       function testPhpUnitArrayEquality() {
+               $one = array( 'A' => 1, 'B' => 2 );
+               $two = array( 'B' => 2, 'A' => 1 );
+               $this->assertEquals( $one, $two );  // ==
+               $this->assertNotSame( $one, $two ); // ===
+       }
+
+       /**
+        * @dataProvider provideInvalidConstructorArg
+        * @expectedException MWException
+        */
+       function testConstructorGivenInvalidValue( $maxSize ) {
+               $c = new ProcessCacheLRUTestable( $maxSize );
+       }
+
+       /**
+        * Value which are forbidden by the constructor
+        */
+       function provideInvalidConstructorArg() {
+               return array(
+                       array( null ),
+                       array( array() ),
+                       array( new stdClass() ),
+                       array( 0 ),
+                       array( '5' ),
+                       array( -1 ),
+               );
+       }
+
+       function testAddAndGetAKey() {
+               $oneCache = new ProcessCacheLRUTestable( 1 );
+               $this->assertCacheEmpty( $oneCache );
+
+               // First set just one value
+               $oneCache->set( 'cache-key', 'prop1', 'value1' );
+               $this->assertEquals( 1, $oneCache->getEntriesCount() );
+               $this->assertTrue( $oneCache->has( 'cache-key', 'prop1' ) );
+               $this->assertEquals( 'value1', $oneCache->get( 'cache-key', 'prop1' ) );
+       }
+
+       function testDeleteOldKey() {
+               $oneCache = new ProcessCacheLRUTestable( 1 );
+               $this->assertCacheEmpty( $oneCache );
+
+               $oneCache->set( 'cache-key', 'prop1', 'value1' );
+               $oneCache->set( 'cache-key', 'prop1', 'value2' );
+               $this->assertEquals( 'value2', $oneCache->get( 'cache-key', 'prop1' ) );
+       }
+
+       /**
+        * This test that we properly overflow when filling a cache with
+        * a sequence of always different cache-keys. Meant to verify we correclty
+        * delete the older key.
+        *
+        * @dataProvider provideCacheFilling
+        * @param $cacheMaxEntries Maximum entry the created cache will hold
+        * @param $entryToFill Number of entries to insert in the created cache.
+        */
+       function testFillingCache( $cacheMaxEntries, $entryToFill, $msg = '' ) {
+               $cache = new ProcessCacheLRUTestable( $cacheMaxEntries );
+               $this->fillCache( $cache, $entryToFill);
+
+               $this->assertSame(
+                       $this->getExpectedCache( $cacheMaxEntries, $entryToFill ),
+                       $cache->getCache(),
+                       "Filling a $cacheMaxEntries entries cache with $entryToFill entries"
+               );
+
+       }
+
+       /**
+        * Provider for testFillingCache
+        */
+       function provideCacheFilling() {
+               // ($cacheMaxEntries, $entryToFill, $msg='')
+               return array(
+                       array( 1,  0 ),
+                       array( 1,  1 ),
+                       array( 1,  2 ), # overflow
+                       array( 5, 33 ), # overflow
+               );
+
+       }
+
+       /**
+        * Create a cache with only one remaining entry then update
+        * the first inserted entry. Should bump it to the top.
+        */
+       function testReplaceExistingKeyShouldBumpEntryToTop() {
+               $maxEntries = 3;
+
+               $cache = new ProcessCacheLRUTestable( $maxEntries );
+               // Fill cache leaving just one remaining slot
+               $this->fillCache( $cache, $maxEntries - 1 );
+
+               // Set an existing cache key
+               $cache->set( "cache-key-1", "prop-1", "new-value-for-1" );
+
+               $this->assertSame(
+                       array(
+                               'cache-key-2' => array( 'prop-2' => 'value-2' ),
+                               'cache-key-1' => array( 'prop-1' => 'new-value-for-1' ),
+                       ),
+                       $cache->getCache()
+               );
+       }
+
+       function testRecentlyAccessedKeyStickIn() {
+               $cache = new ProcessCacheLRUTestable( 2 );
+               $cache->set( 'first' , 'prop1', 'value1' );
+               $cache->set( 'second', 'prop2', 'value2' );
+
+               // Get first
+               $cache->get( 'first', 'prop1' );
+               // Cache a third value, should invalidate the least used one
+               $cache->set( 'third', 'prop3', 'value3' );
+
+               $this->assertFalse( $cache->has( 'second', 'prop2' ) );
+       }
+
+       /**
+        * This first create a full cache then update the value for the 2nd
+        * filled entry.
+        * Given a cache having 1,2,3 as key, updating 2 should bump 2 to
+        * the top of the queue with the new value: 1,3,2* (* = updated).
+        */
+       function testReplaceExistingKeyInAFullCacheShouldBumpToTop() {
+               $maxEntries = 3;
+
+               $cache = new ProcessCacheLRUTestable( $maxEntries );
+               $this->fillCache( $cache, $maxEntries );
+
+               // Set an existing cache key
+               $cache->set( "cache-key-2", "prop-2", "new-value-for-2" );
+               $this->assertSame(
+                       array(
+                               'cache-key-1' => array( 'prop-1' => 'value-1' ),
+                               'cache-key-3' => array( 'prop-3' => 'value-3' ),
+                               'cache-key-2' => array( 'prop-2' => 'new-value-for-2' ),
+                       ),
+                       $cache->getCache()
+               );
+               $this->assertEquals( 'new-value-for-2',
+                       $cache->get( 'cache-key-2', 'prop-2' )
+               );
+       }
+
+       function testBumpExistingKeyToTop() {
+               $cache = new ProcessCacheLRUTestable( 3 );
+               $this->fillCache( $cache, 3 );
+
+               // Set the very first cache key to a new value
+               $cache->set( "cache-key-1", "prop-1", "new value for 1" );
+               $this->assertEquals(
+                       array(
+                               'cache-key-2' => array( 'prop-2' => 'value-2' ),
+                               'cache-key-3' => array( 'prop-3' => 'value-3' ),
+                               'cache-key-1' => array( 'prop-1' => 'new value for 1' ),
+                       ),
+                       $cache->getCache()
+               );
+
+       }
+
+}
+
+/**
+ * Overrides some ProcessCacheLRU methods and properties accessibility.
+ */
+class ProcessCacheLRUTestable extends ProcessCacheLRU {
+       public $cache = array();
+
+       public function getCache() {
+               return $this->cache;
+       }
+       public function getEntriesCount() {
+               return count( $this->cache );
+       }
+}
diff --git a/tests/phpunit/includes/db/DatabaseSQLTest.php b/tests/phpunit/includes/db/DatabaseSQLTest.php
new file mode 100644 (file)
index 0000000..0df5a46
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * Test the abstract database layer
+ * Using Mysql for the sql at the moment TODO
+ *
+ * @group Database
+ */
+class DatabaseSQLTest extends MediaWikiTestCase {
+
+       public function setUp() {
+               // TODO support other DBMS or find another way to do it
+               if( $this->db->getType() !== 'mysql' ) {
+                       $this->markTestSkipped( 'No mysql database' );
+               }
+       }
+
+       /**
+        * @dataProvider dataSelectSQLText
+        */
+       function testSelectSQLText( $sql, $sqlText ) {
+               $this->assertEquals( trim( $this->db->selectSQLText(
+                       isset( $sql['tables'] ) ? $sql['tables'] : array(),
+                       isset( $sql['fields'] ) ? $sql['fields'] : array(),
+                       isset( $sql['conds'] ) ? $sql['conds'] : array(),
+                       __METHOD__,
+                       isset( $sql['options'] ) ? $sql['options'] : array(),
+                       isset( $sql['join_conds'] ) ? $sql['join_conds'] : array()
+               ) ), $sqlText );
+       }
+
+       function dataSelectSQLText() {
+               return array(
+                       array(
+                               array(
+                                       'tables' => 'table',
+                                       'fields' => array( 'field', 'alias' => 'field2' ),
+                                       'conds' => array( 'alias' => 'text' ),
+                               ),
+                               "SELECT  field,field2 AS alias  " .
+                               "FROM `unittest_table`  " .
+                               "WHERE alias = 'text'"
+                       ),
+                       array(
+                               array(
+                                       'tables' => 'table',
+                                       'fields' => array( 'field', 'alias' => 'field2' ),
+                                       'conds' => array( 'alias' => 'text' ),
+                                       'options' => array( 'LIMIT' => 1, 'ORDER BY' => 'field' ),
+                               ),
+                               "SELECT  field,field2 AS alias  " .
+                               "FROM `unittest_table`  " .
+                               "WHERE alias = 'text'  " .
+                               "ORDER BY field " .
+                               "LIMIT 1"
+                       ),
+                       array(
+                               array(
+                                       'tables' => array( 'table', 't2' => 'table2' ),
+                                       'fields' => array( 'tid', 'field', 'alias' => 'field2', 't2.id' ),
+                                       'conds' => array( 'alias' => 'text' ),
+                                       'options' => array( 'LIMIT' => 1, 'ORDER BY' => 'field' ),
+                                       'join_conds' => array( 't2' => array(
+                                               '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'  " .
+                               "ORDER BY field " .
+                               "LIMIT 1"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataConditional
+        */
+       function testConditional( $sql, $sqlText ) {
+               $this->assertEquals( trim( $this->db->conditional(
+                       $sql['conds'],
+                       $sql['true'],
+                       $sql['false']
+               ) ), $sqlText );
+       }
+
+       function dataConditional() {
+               return array(
+                       array(
+                               array(
+                                       'conds' => array( 'field' => 'text' ),
+                                       'true' => 1,
+                                       'false' => 'NULL',
+                               ),
+                               "(CASE WHEN field = 'text' THEN 1 ELSE NULL END)"
+                       ),
+                       array(
+                               array(
+                                       'conds' => 'field=1',
+                                       'true' => 1,
+                                       'false' => 'NULL',
+                               ),
+                               "(CASE WHEN field=1 THEN 1 ELSE NULL END)"
+                       ),
+               );
+       }
+}
\ No newline at end of file
index 672e664..379ffb1 100644 (file)
@@ -57,6 +57,98 @@ class DatabaseTest extends MediaWikiTestCase {
                        $this->db->addQuotes( "string's cause trouble" ) );
        }
 
+       private function getSharedTableName( $table, $database, $prefix, $format = 'quoted' ) {
+               global $wgSharedDB, $wgSharedTables, $wgSharedPrefix;
+
+               $oldName = $wgSharedDB;
+               $oldTables = $wgSharedTables;
+               $oldPrefix = $wgSharedPrefix;
+
+               $wgSharedDB = $database;
+               $wgSharedTables = array( $table );
+               $wgSharedPrefix = $prefix;
+
+               $ret = $this->db->tableName( $table, $format );
+
+               $wgSharedDB = $oldName;
+               $wgSharedTables = $oldTables;
+               $wgSharedPrefix = $oldPrefix;
+
+               return $ret;
+       }
+
+       private function prefixAndQuote( $table, $database = null, $prefix = null, $format = 'quoted' ) {
+               if ( $this->db->getType() === 'sqlite' || $format !== 'quoted' ) {
+                       $quote = '';
+               } elseif ( $this->db->getType() === 'mysql' ) {
+                       $quote = '`';
+               } else {
+                       $quote = '"';
+               }
+
+               if ( $database !== null ) {
+                       $database = $quote . $database . $quote . '.';
+               }
+
+               if ( $prefix === null ) {
+                       $prefix = $this->dbPrefix();
+               }
+
+               return $database . $quote . $prefix . $table . $quote;
+       }
+
+       function testTableNameLocal() {
+               $this->assertEquals(
+                       $this->prefixAndQuote( 'tablename' ),
+                       $this->db->tableName( 'tablename' )
+               );
+       }
+
+       function testTableNameRawLocal() {
+               $this->assertEquals(
+                       $this->prefixAndQuote( 'tablename', null, null, 'raw' ),
+                       $this->db->tableName( 'tablename', 'raw' )
+               );
+       }
+
+       function testTableNameShared() {
+               $this->assertEquals(
+                       $this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_' ),
+                       $this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_' )
+               );
+
+               $this->assertEquals(
+                       $this->prefixAndQuote( 'tablename', 'sharedatabase', null ),
+                       $this->getSharedTableName( 'tablename', 'sharedatabase', null )
+               );
+       }
+
+       function testTableNameRawShared() {
+               $this->assertEquals(
+                       $this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_', 'raw' ),
+                       $this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_', 'raw' )
+               );
+
+               $this->assertEquals(
+                       $this->prefixAndQuote( 'tablename', 'sharedatabase', null, 'raw' ),
+                       $this->getSharedTableName( 'tablename', 'sharedatabase', null, 'raw' )
+               );
+       }
+
+       function testTableNameForeign() {
+               $this->assertEquals(
+                       $this->prefixAndQuote( 'tablename', 'databasename', '' ),
+                       $this->db->tableName( 'databasename.tablename' )
+               );
+       }
+
+       function testTableNameRawForeign() {
+               $this->assertEquals(
+                       $this->prefixAndQuote( 'tablename', 'databasename', '', 'raw' ),
+                       $this->db->tableName( 'databasename.tablename', 'raw' )
+               );
+       }
+
        function testFillPreparedEmpty() {
                $sql = $this->db->fillPrepared(
                        'SELECT * FROM interwiki', array() );
index ca3e9e6..afd1cb8 100644 (file)
@@ -38,7 +38,7 @@
  * @licence GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-require_once dirname( __FILE__ ) . "/ORMRowTest.php";
+require_once __DIR__ . "/ORMRowTest.php";
 
 class TestORMRowTest extends ORMRowTest {
 
@@ -68,7 +68,7 @@ class TestORMRowTest extends ORMRowTest {
                $idField = $isSqlite ? 'INTEGER' : 'INT unsigned';
                $primaryKey = $isSqlite ? 'PRIMARY KEY AUTOINCREMENT' : 'auto_increment PRIMARY KEY';
 
-               $dbw->safeQuery(
+               $dbw->query(
                        'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
                                test_id                    ' . $idField . '        NOT NULL ' . $primaryKey . ',
                                test_name                  VARCHAR(255)        NOT NULL,
index 1627c47..246b291 100644 (file)
@@ -12,6 +12,11 @@ class MWDebugTest extends MediaWikiTestCase {
                }
                /** Clear log before each test */
                MWDebug::clearLog();
+               wfSuppressWarnings();
+       }
+
+       function tearDown() {
+               wfRestoreWarnings();
        }
 
        function testAddLog() {
index 710ad83..a2dc5c6 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group FileRepo
  * @group FileBackend
+ * @group medium
  */
 class FileBackendTest extends MediaWikiTestCase {
        private $backend, $multiBackend;
@@ -26,6 +27,9 @@ class FileBackendTest extends MediaWikiTestCase {
                                        }
                                }
                                $useConfig['name'] = 'localtesting'; // swap name
+                               $useConfig['shardViaHashLevels'] = array( // test sharding
+                                       'unittest-cont1' => array( 'levels' => 1, 'base' => 16, 'repeat' => 1 )
+                               );
                                $class = $useConfig['class'];
                                self::$backendToUse = new $class( $useConfig );
                                $this->singleBackend = self::$backendToUse;
@@ -240,13 +244,15 @@ class FileBackendTest extends MediaWikiTestCase {
                $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
                $this->assertEquals( $props1, $props2,
                        "Source and destination have the same props ($backendName)." );
+
+               $this->assertBackendPathsConsistent( array( $dest ) );
        }
 
        public function provider_testStore() {
                $cases = array();
 
                $tmpName = TempFSFile::factory( "unittests_", 'txt' )->getPath();
-               $toPath = $this->baseStorePath() . '/unittest-cont1/fun/obj1.txt';
+               $toPath = $this->baseStorePath() . '/unittest-cont1/e/fun/obj1.txt';
                $op = array( 'op' => 'store', 'src' => $tmpName, 'dst' => $toPath );
                $cases[] = array(
                        $op, // operation
@@ -327,13 +333,15 @@ class FileBackendTest extends MediaWikiTestCase {
                $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
                $this->assertEquals( $props1, $props2,
                        "Source and destination have the same props ($backendName)." );
+
+               $this->assertBackendPathsConsistent( array( $source, $dest ) );
        }
 
        public function provider_testCopy() {
                $cases = array();
 
-               $source = $this->baseStorePath() . '/unittest-cont1/file.txt';
-               $dest = $this->baseStorePath() . '/unittest-cont2/fileMoved.txt';
+               $source = $this->baseStorePath() . '/unittest-cont1/e/file.txt';
+               $dest = $this->baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
 
                $op = array( 'op' => 'copy', 'src' => $source, 'dst' => $dest );
                $cases[] = array(
@@ -416,13 +424,15 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Source file does not exist accourding to props ($backendName)." );
                $this->assertEquals( true, $props2['fileExists'],
                        "Destination file exists accourding to props ($backendName)." );
+
+               $this->assertBackendPathsConsistent( array( $source, $dest ) );
        }
 
        public function provider_testMove() {
                $cases = array();
 
-               $source = $this->baseStorePath() . '/unittest-cont1/file.txt';
-               $dest = $this->baseStorePath() . '/unittest-cont2/fileMoved.txt';
+               $source = $this->baseStorePath() . '/unittest-cont1/e/file.txt';
+               $dest = $this->baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
 
                $op = array( 'op' => 'move', 'src' => $source, 'dst' => $dest );
                $cases[] = array(
@@ -501,12 +511,14 @@ class FileBackendTest extends MediaWikiTestCase {
                $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
                $this->assertFalse( $props1['fileExists'],
                        "Source file $source does not exist according to props ($backendName)." );
+
+               $this->assertBackendPathsConsistent( array( $source ) );
        }
 
        public function provider_testDelete() {
                $cases = array();
 
-               $source = $this->baseStorePath() . '/unittest-cont1/myfacefile.txt';
+               $source = $this->baseStorePath() . '/unittest-cont1/e/myfacefile.txt';
 
                $op = array( 'op' => 'delete', 'src' => $source );
                $cases[] = array(
@@ -592,6 +604,8 @@ class FileBackendTest extends MediaWikiTestCase {
                                $this->backend->getFileSize( array( 'src' => $dest ) ),
                                "Destination file $dest has original size according to props ($backendName)." );
                }
+
+               $this->assertBackendPathsConsistent( array( $dest ) );
        }
 
        /**
@@ -600,7 +614,7 @@ class FileBackendTest extends MediaWikiTestCase {
        public function provider_testCreate() {
                $cases = array();
 
-               $dest = $this->baseStorePath() . '/unittest-cont2/myspacefile.txt';
+               $dest = $this->baseStorePath() . '/unittest-cont2/a/myspacefile.txt';
 
                $op = array( 'op' => 'create', 'content' => 'test test testing', 'dst' => $dest );
                $cases[] = array(
@@ -666,9 +680,9 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $base = $this->baseStorePath();
                $files = array(
-                       "$base/unittest-cont1/fileA.a",
-                       "$base/unittest-cont1/fileB.a",
-                       "$base/unittest-cont1/fileC.a"
+                       "$base/unittest-cont1/e/fileA.a",
+                       "$base/unittest-cont1/e/fileB.a",
+                       "$base/unittest-cont1/e/fileC.a"
                );
                $ops = array();
                $purgeOps = array();
@@ -786,16 +800,16 @@ class FileBackendTest extends MediaWikiTestCase {
                $rand = mt_rand( 0, 2000000000 ) . time();
                $dest = wfTempDir() . "/randomfile!$rand.txt";
                $srcs = array(
-                       $this->baseStorePath() . '/unittest-cont1/file1.txt',
-                       $this->baseStorePath() . '/unittest-cont1/file2.txt',
-                       $this->baseStorePath() . '/unittest-cont1/file3.txt',
-                       $this->baseStorePath() . '/unittest-cont1/file4.txt',
-                       $this->baseStorePath() . '/unittest-cont1/file5.txt',
-                       $this->baseStorePath() . '/unittest-cont1/file6.txt',
-                       $this->baseStorePath() . '/unittest-cont1/file7.txt',
-                       $this->baseStorePath() . '/unittest-cont1/file8.txt',
-                       $this->baseStorePath() . '/unittest-cont1/file9.txt',
-                       $this->baseStorePath() . '/unittest-cont1/file10.txt'
+                       $this->baseStorePath() . '/unittest-cont1/e/file1.txt',
+                       $this->baseStorePath() . '/unittest-cont1/e/file2.txt',
+                       $this->baseStorePath() . '/unittest-cont1/e/file3.txt',
+                       $this->baseStorePath() . '/unittest-cont1/e/file4.txt',
+                       $this->baseStorePath() . '/unittest-cont1/e/file5.txt',
+                       $this->baseStorePath() . '/unittest-cont1/e/file6.txt',
+                       $this->baseStorePath() . '/unittest-cont1/e/file7.txt',
+                       $this->baseStorePath() . '/unittest-cont1/e/file8.txt',
+                       $this->baseStorePath() . '/unittest-cont1/e/file9.txt',
+                       $this->baseStorePath() . '/unittest-cont1/e/file10.txt'
                );
                $content = array(
                        'egfage',
@@ -869,6 +883,20 @@ class FileBackendTest extends MediaWikiTestCase {
                                "Correct file size of '$path'" );
                        $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 10,
                                "Correct file timestamp of '$path'" );
+
+                       $this->backend->clearCache( array( $path ) );
+
+                       $size = $this->backend->getFileSize( array( 'src' => $path ) );
+
+                       $this->assertEquals( strlen( $content ), $size,
+                               "Correct file size of '$path'" );
+
+                       $this->backend->preloadCache( array( $path ) );
+
+                       $size = $this->backend->getFileSize( array( 'src' => $path ) );
+
+                       $this->assertEquals( strlen( $content ), $size,
+                               "Correct file size of '$path'" );
                } else {
                        $size = $this->backend->getFileSize( array( 'src' => $path ) );
                        $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
@@ -884,9 +912,9 @@ class FileBackendTest extends MediaWikiTestCase {
                $cases = array();
 
                $base = $this->baseStorePath();
-               $cases[] = array( "$base/unittest-cont1/b/z/some_file.txt", "some file contents", true );
-               $cases[] = array( "$base/unittest-cont1/b/some-other_file.txt", "", true );
-               $cases[] = array( "$base/unittest-cont1/b/some-diff_file.txt", null, false );
+               $cases[] = array( "$base/unittest-cont1/e/b/z/some_file.txt", "some file contents", true );
+               $cases[] = array( "$base/unittest-cont1/e/b/some-other_file.txt", "", true );
+               $cases[] = array( "$base/unittest-cont1/e/b/some-diff_file.txt", null, false );
 
                return $cases;
        }
@@ -930,8 +958,8 @@ class FileBackendTest extends MediaWikiTestCase {
                $cases = array();
 
                $base = $this->baseStorePath();
-               $cases[] = array( "$base/unittest-cont1/b/z/some_file.txt", "some file contents" );
-               $cases[] = array( "$base/unittest-cont1/b/some-other_file.txt", "more file contents" );
+               $cases[] = array( "$base/unittest-cont1/e/b/z/some_file.txt", "some file contents" );
+               $cases[] = array( "$base/unittest-cont1/e/b/some-other_file.txt", "more file contents" );
 
                return $cases;
        }
@@ -973,8 +1001,8 @@ class FileBackendTest extends MediaWikiTestCase {
                $cases = array();
 
                $base = $this->baseStorePath();
-               $cases[] = array( "$base/unittest-cont1/a/z/some_file.txt", "some file contents" );
-               $cases[] = array( "$base/unittest-cont1/a/some-other_file.txt", "more file contents" );
+               $cases[] = array( "$base/unittest-cont1/e/a/z/some_file.txt", "some file contents" );
+               $cases[] = array( "$base/unittest-cont1/e/a/some-other_file.txt", "more file contents" );
 
                return $cases;
        }
@@ -1015,8 +1043,8 @@ class FileBackendTest extends MediaWikiTestCase {
                $cases = array();
 
                $base = $this->baseStorePath();
-               $cases[] = array( "$base/unittest-cont1/a/z/some_file.txt", "some file contents" );
-               $cases[] = array( "$base/unittest-cont1/a/some-other_file.txt", "more file contents" );
+               $cases[] = array( "$base/unittest-cont1/e/a/z/some_file.txt", "some file contents" );
+               $cases[] = array( "$base/unittest-cont1/e/a/some-other_file.txt", "more file contents" );
 
                return $cases;
        }
@@ -1037,7 +1065,7 @@ class FileBackendTest extends MediaWikiTestCase {
        function provider_testPrepareAndClean() {
                $base = $this->baseStorePath();
                return array(
-                       array( "$base/unittest-cont1/a/z/some_file1.txt", true ),
+                       array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
                        array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
                        # Specific to FS backend with no basePath field set
                        #array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
@@ -1085,18 +1113,18 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $base = $this->baseStorePath();
                $dirs = array(
-                       "$base/unittest-cont1/a",
-                       "$base/unittest-cont1/a/b",
-                       "$base/unittest-cont1/a/b/c",
-                       "$base/unittest-cont1/a/b/c/d0",
-                       "$base/unittest-cont1/a/b/c/d1",
-                       "$base/unittest-cont1/a/b/c/d2",
-                       "$base/unittest-cont1/a/b/c/d0/1",
-                       "$base/unittest-cont1/a/b/c/d0/2",
-                       "$base/unittest-cont1/a/b/c/d1/3",
-                       "$base/unittest-cont1/a/b/c/d1/4",
-                       "$base/unittest-cont1/a/b/c/d2/5",
-                       "$base/unittest-cont1/a/b/c/d2/6"
+                       "$base/unittest-cont1/e/a",
+                       "$base/unittest-cont1/e/a/b",
+                       "$base/unittest-cont1/e/a/b/c",
+                       "$base/unittest-cont1/e/a/b/c/d0",
+                       "$base/unittest-cont1/e/a/b/c/d1",
+                       "$base/unittest-cont1/e/a/b/c/d2",
+                       "$base/unittest-cont1/e/a/b/c/d0/1",
+                       "$base/unittest-cont1/e/a/b/c/d0/2",
+                       "$base/unittest-cont1/e/a/b/c/d1/3",
+                       "$base/unittest-cont1/e/a/b/c/d1/4",
+                       "$base/unittest-cont1/e/a/b/c/d2/5",
+                       "$base/unittest-cont1/e/a/b/c/d2/6"
                );
                foreach ( $dirs as $dir ) {
                        $status = $this->prepare( array( 'dir' => $dir ) );
@@ -1134,38 +1162,18 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
                $this->doTestDoOperations();
                $this->tearDownFiles();
-
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestDoOperations2();
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestDoOperations2();
-               $this->tearDownFiles();
-
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestDoOperationsFailing();
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestDoOperationsFailing();
-               $this->tearDownFiles();
        }
 
        private function doTestDoOperations() {
                $base = $this->baseStorePath();
 
-               $fileA = "$base/unittest-cont1/a/b/fileA.txt";
+               $fileA = "$base/unittest-cont1/e/a/b/fileA.txt";
                $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
-               $fileB = "$base/unittest-cont1/a/b/fileB.txt";
+               $fileB = "$base/unittest-cont1/e/a/b/fileB.txt";
                $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
-               $fileC = "$base/unittest-cont1/a/b/fileC.txt";
+               $fileC = "$base/unittest-cont1/e/a/b/fileC.txt";
                $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
-               $fileD = "$base/unittest-cont1/a/b/fileD.txt";
+               $fileD = "$base/unittest-cont1/e/a/b/fileD.txt";
 
                $this->prepare( array( 'dir' => dirname( $fileA ) ) );
                $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
@@ -1229,8 +1237,20 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
+       public function testDoOperationsPipeline() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestDoOperationsPipeline();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestDoOperationsPipeline();
+               $this->tearDownFiles();
+       }
+
        // concurrency orientated
-       private function doTestDoOperations2() {
+       private function doTestDoOperationsPipeline() {
                $base = $this->baseStorePath();
 
                $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
@@ -1248,10 +1268,10 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->filesToPrune[] = $tmpNameB; # avoid file leaking
                $this->filesToPrune[] = $tmpNameC; # avoid file leaking
 
-               $fileA = "$base/unittest-cont1/a/b/fileA.txt";
-               $fileB = "$base/unittest-cont1/a/b/fileB.txt";
-               $fileC = "$base/unittest-cont1/a/b/fileC.txt";
-               $fileD = "$base/unittest-cont1/a/b/fileD.txt";
+               $fileA = "$base/unittest-cont1/e/a/b/fileA.txt";
+               $fileB = "$base/unittest-cont1/e/a/b/fileB.txt";
+               $fileC = "$base/unittest-cont1/e/a/b/fileC.txt";
+               $fileD = "$base/unittest-cont1/e/a/b/fileD.txt";
 
                $this->prepare( array( 'dir' => dirname( $fileA ) ) );
                $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
@@ -1316,6 +1336,18 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
+       public function testDoOperationsFailing() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestDoOperationsFailing();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestDoOperationsFailing();
+               $this->tearDownFiles();
+       }
+
        private function doTestDoOperationsFailing() {
                $base = $this->baseStorePath();
 
@@ -1398,20 +1430,20 @@ class FileBackendTest extends MediaWikiTestCase {
                $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont-notexists" ) );
 
                $files = array(
-                       "$base/unittest-cont1/test1.txt",
-                       "$base/unittest-cont1/test2.txt",
-                       "$base/unittest-cont1/test3.txt",
-                       "$base/unittest-cont1/subdir1/test1.txt",
-                       "$base/unittest-cont1/subdir1/test2.txt",
-                       "$base/unittest-cont1/subdir2/test3.txt",
-                       "$base/unittest-cont1/subdir2/test4.txt",
-                       "$base/unittest-cont1/subdir2/subdir/test1.txt",
-                       "$base/unittest-cont1/subdir2/subdir/test2.txt",
-                       "$base/unittest-cont1/subdir2/subdir/test3.txt",
-                       "$base/unittest-cont1/subdir2/subdir/test4.txt",
-                       "$base/unittest-cont1/subdir2/subdir/test5.txt",
-                       "$base/unittest-cont1/subdir2/subdir/sub/test0.txt",
-                       "$base/unittest-cont1/subdir2/subdir/sub/120-px-file.txt",
+                       "$base/unittest-cont1/e/test1.txt",
+                       "$base/unittest-cont1/e/test2.txt",
+                       "$base/unittest-cont1/e/test3.txt",
+                       "$base/unittest-cont1/e/subdir1/test1.txt",
+                       "$base/unittest-cont1/e/subdir1/test2.txt",
+                       "$base/unittest-cont1/e/subdir2/test3.txt",
+                       "$base/unittest-cont1/e/subdir2/test4.txt",
+                       "$base/unittest-cont1/e/subdir2/subdir/test1.txt",
+                       "$base/unittest-cont1/e/subdir2/subdir/test2.txt",
+                       "$base/unittest-cont1/e/subdir2/subdir/test3.txt",
+                       "$base/unittest-cont1/e/subdir2/subdir/test4.txt",
+                       "$base/unittest-cont1/e/subdir2/subdir/test5.txt",
+                       "$base/unittest-cont1/e/subdir2/subdir/sub/test0.txt",
+                       "$base/unittest-cont1/e/subdir2/subdir/sub/120-px-file.txt",
                );
 
                // Add the files
@@ -1428,20 +1460,20 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Expected listing
                $expected = array(
-                       "test1.txt",
-                       "test2.txt",
-                       "test3.txt",
-                       "subdir1/test1.txt",
-                       "subdir1/test2.txt",
-                       "subdir2/test3.txt",
-                       "subdir2/test4.txt",
-                       "subdir2/subdir/test1.txt",
-                       "subdir2/subdir/test2.txt",
-                       "subdir2/subdir/test3.txt",
-                       "subdir2/subdir/test4.txt",
-                       "subdir2/subdir/test5.txt",
-                       "subdir2/subdir/sub/test0.txt",
-                       "subdir2/subdir/sub/120-px-file.txt",
+                       "e/test1.txt",
+                       "e/test2.txt",
+                       "e/test3.txt",
+                       "e/subdir1/test1.txt",
+                       "e/subdir1/test2.txt",
+                       "e/subdir2/test3.txt",
+                       "e/subdir2/test4.txt",
+                       "e/subdir2/subdir/test1.txt",
+                       "e/subdir2/subdir/test2.txt",
+                       "e/subdir2/subdir/test3.txt",
+                       "e/subdir2/subdir/test4.txt",
+                       "e/subdir2/subdir/test5.txt",
+                       "e/subdir2/subdir/sub/test0.txt",
+                       "e/subdir2/subdir/sub/120-px-file.txt",
                );
                sort( $expected );
 
@@ -1479,7 +1511,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Actual listing (no trailing slash)
                $list = array();
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) );
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -1489,7 +1521,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Actual listing (with trailing slash)
                $list = array();
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/subdir2/subdir/" ) );
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir/" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -1518,7 +1550,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Actual listing (top files only)
                $list = array();
-               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) );
+               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -1551,20 +1583,20 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $base = $this->baseStorePath();
                $files = array(
-                       "$base/unittest-cont1/test1.txt",
-                       "$base/unittest-cont1/test2.txt",
-                       "$base/unittest-cont1/test3.txt",
-                       "$base/unittest-cont1/subdir1/test1.txt",
-                       "$base/unittest-cont1/subdir1/test2.txt",
-                       "$base/unittest-cont1/subdir2/test3.txt",
-                       "$base/unittest-cont1/subdir2/test4.txt",
-                       "$base/unittest-cont1/subdir2/subdir/test1.txt",
-                       "$base/unittest-cont1/subdir3/subdir/test2.txt",
-                       "$base/unittest-cont1/subdir4/subdir/test3.txt",
-                       "$base/unittest-cont1/subdir4/subdir/test4.txt",
-                       "$base/unittest-cont1/subdir4/subdir/test5.txt",
-                       "$base/unittest-cont1/subdir4/subdir/sub/test0.txt",
-                       "$base/unittest-cont1/subdir4/subdir/sub/120-px-file.txt",
+                       "$base/unittest-cont1/e/test1.txt",
+                       "$base/unittest-cont1/e/test2.txt",
+                       "$base/unittest-cont1/e/test3.txt",
+                       "$base/unittest-cont1/e/subdir1/test1.txt",
+                       "$base/unittest-cont1/e/subdir1/test2.txt",
+                       "$base/unittest-cont1/e/subdir2/test3.txt",
+                       "$base/unittest-cont1/e/subdir2/test4.txt",
+                       "$base/unittest-cont1/e/subdir2/subdir/test1.txt",
+                       "$base/unittest-cont1/e/subdir3/subdir/test2.txt",
+                       "$base/unittest-cont1/e/subdir4/subdir/test3.txt",
+                       "$base/unittest-cont1/e/subdir4/subdir/test4.txt",
+                       "$base/unittest-cont1/e/subdir4/subdir/test5.txt",
+                       "$base/unittest-cont1/e/subdir4/subdir/sub/test0.txt",
+                       "$base/unittest-cont1/e/subdir4/subdir/sub/120-px-file.txt",
                );
 
                // Add the files
@@ -1579,6 +1611,32 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( true, $status->isOK(),
                        "Creation of files succeeded with OK status ($backendName)." );
 
+               $this->assertEquals( true,
+                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/e/subdir1" ) ),
+                       "Directory exists in ($backendName)." );
+               $this->assertEquals( true,
+                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) ),
+                       "Directory exists in ($backendName)." );
+               $this->assertEquals( false,
+                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/e/subdir2/test1.txt" ) ),
+                       "Directory does not exists in ($backendName)." );
+
+               // Expected listing
+               $expected = array(
+                       "e",
+               );
+               sort( $expected );
+
+               // Actual listing (no trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
                // Expected listing
                $expected = array(
                        "subdir1",
@@ -1588,19 +1646,9 @@ class FileBackendTest extends MediaWikiTestCase {
                );
                sort( $expected );
 
-               $this->assertEquals( true,
-                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir1" ) ),
-                       "Directory exists in ($backendName)." );
-               $this->assertEquals( true,
-                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) ),
-                       "Directory exists in ($backendName)." );
-               $this->assertEquals( false,
-                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir2/test1.txt" ) ),
-                       "Directory does not exists in ($backendName)." );
-
                // Actual listing (no trailing slash)
                $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1" ) );
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -1610,7 +1658,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Actual listing (with trailing slash)
                $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -1626,7 +1674,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Actual listing (no trailing slash)
                $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir2" ) );
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -1636,7 +1684,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Actual listing (with trailing slash)
                $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir2/" ) );
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2/" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -1655,14 +1703,15 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Expected listing (recursive)
                $expected = array(
-                       "subdir1",
-                       "subdir2",
-                       "subdir3",
-                       "subdir4",
-                       "subdir2/subdir",
-                       "subdir3/subdir",
-                       "subdir4/subdir",
-                       "subdir4/subdir/sub",
+                       "e",
+                       "e/subdir1",
+                       "e/subdir2",
+                       "e/subdir3",
+                       "e/subdir4",
+                       "e/subdir2/subdir",
+                       "e/subdir3/subdir",
+                       "e/subdir4/subdir",
+                       "e/subdir4/subdir/sub",
                );
                sort( $expected );
 
@@ -1685,7 +1734,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Actual listing (recursive)
                $list = array();
-               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir4" ) );
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir4" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -1802,6 +1851,13 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->backend->clean( array( 'dir' => "$base/$container", 'recursive' => 1 ) );
        }
 
+       function assertBackendPathsConsistent( array $paths ) {
+               if ( $this->backend instanceof FileBackendMultiWrite ) {
+                       $status = $this->backend->consistencyCheck( $paths );
+                       $this->assertGoodStatus( $status, "Files synced: " . implode( ',', $paths ) );
+               }
+       }
+
        function assertGoodStatus( $status, $msg ) {
                $this->assertEquals( print_r( array(), 1 ), print_r( $status->errors, 1 ), $msg );
        }
index 6abceeb..3ab56af 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 /**
  * @group FileRepo
+ * @group medium
  */
 class StoreBatchTest extends MediaWikiTestCase {
 
diff --git a/tests/phpunit/includes/libs/CSSJanusTest.php b/tests/phpunit/includes/libs/CSSJanusTest.php
new file mode 100644 (file)
index 0000000..54f6607
--- /dev/null
@@ -0,0 +1,560 @@
+<?php
+/**
+ * Based on the test suite of the original Python
+ * CSSJanus libary:
+ * http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus_test.py
+ * Ported to PHP for ResourceLoader and has been extended since.
+ */
+class CSSJanusTest extends MediaWikiTestCase {
+       /**
+        * @dataProvider provideTransformCases
+        */
+       function testTransform( $cssA, $cssB = null ) {
+
+               if ( $cssB ) {
+                       $transformedA = CSSJanus::transform( $cssA );
+                       $this->assertEquals( $transformedA, $cssB, 'Test A-B transformation' );
+
+                       $transformedB = CSSJanus::transform( $cssB );
+                       $this->assertEquals( $transformedB, $cssA, 'Test B-A transformation' );
+
+               // If no B version is provided, it means
+               // the output should equal the input.
+               } else {
+                       $transformedA = CSSJanus::transform( $cssA );
+                       $this->assertEquals( $transformedA, $cssA, 'Nothing was flipped' );
+               }
+       }
+
+       /**
+        * @dataProvider provideTransformAdvancedCases
+        */
+       function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
+               $swapLtrRtlInURL = isset( $options['swapLtrRtlInURL'] ) ? $options['swapLtrRtlInURL'] : false;
+               $swapLeftRightInURL = isset( $options['swapLeftRightInURL'] ) ? $options['swapLeftRightInURL'] : false;
+
+               $flipped = CSSJanus::transform( $code, $swapLtrRtlInURL, $swapLeftRightInURL );
+
+               $this->assertEquals( $expectedOutput, $flipped,
+                       'Test flipping, options: url-ltr-rtl=' . ($swapLtrRtlInURL ? 'true' : 'false')
+                               . ' url-left-right=' . ($swapLeftRightInURL ? 'true' : 'false')
+               );
+       }
+       /**
+        * @dataProvider provideTransformBrokenCases
+        * @group Broken
+        */
+       function testTransformBroken( $code, $expectedOutput ) {
+               $flipped = CSSJanus::transform( $code );
+
+               $this->assertEquals( $expectedOutput, $flipped, 'Test flipping' );
+       }
+
+       /**
+        * These transform cases are tested *in both directions*
+        * No need to declare a principle twice in both directions here.
+        */
+       function provideTransformCases() {
+               return array(
+                       // Property keys
+                       array(
+                               '.foo { left: 0; }',
+                               '.foo { right: 0; }'
+                       ),
+                       // Guard against partial keys
+                       // (CSS currently doesn't have flippable properties
+                       // that contain the direction as part of the key without
+                       // dash separation)
+                       array(
+                               '.foo { alright: 0; }'
+                       ),
+                       array(
+                               '.foo { balleft: 0; }'
+                       ),
+
+                       // Dashed property keys
+                       array(
+                               '.foo { padding-left: 0; }',
+                               '.foo { padding-right: 0; }'
+                       ),
+                       array(
+                               '.foo { margin-left: 0; }',
+                               '.foo { margin-right: 0; }'
+                       ),
+                       array(
+                               '.foo { border-left: 0; }',
+                               '.foo { border-right: 0; }'
+                       ),
+
+                       // Double-dashed property keys
+                       array(
+                               '.foo { border-left-color: red; }',
+                               '.foo { border-right-color: red; }'
+                       ),
+                       array(
+                               // Includes unknown properties?
+                               '.foo { x-left-y: 0; }',
+                               '.foo { x-right-y: 0; }'
+                       ),
+
+                       // Multi-value properties
+                       array(
+                               '.foo { padding: 0; }'
+                       ),
+                       array(
+                               '.foo { padding: 0 1px; }'
+                       ),
+                       array(
+                               '.foo { padding: 0 1px 2px; }'
+                       ),
+                       array(
+                               '.foo { padding: 0 1px 2px 3px; }',
+                               '.foo { padding: 0 3px 2px 1px; }'
+                       ),
+
+                       // Shorthand / Four notation
+                       array(
+                               '.foo { padding: .25em 15px 0pt 0ex; }',
+                               '.foo { padding: .25em 0ex 0pt 15px; }'
+                       ),
+                       array(
+                               '.foo { margin: 1px -4px 3px 2px; }',
+                               '.foo { margin: 1px 2px 3px -4px; }'
+                       ),
+                       array(
+                               '.foo { padding: 0 15px .25em 0; }',
+                               '.foo { padding: 0 0 .25em 15px; }'
+                       ),
+                       array(
+                               '.foo { padding: 1px 4.1grad 3px 2%; }',
+                               '.foo { padding: 1px 2% 3px 4.1grad; }'
+                       ),
+                       array(
+                               '.foo { padding: 1px 2px 3px auto; }',
+                               '.foo { padding: 1px auto 3px 2px; }'
+                       ),
+                       array(
+                               '.foo { padding: 1px inherit 3px auto; }',
+                               '.foo { padding: 1px auto 3px inherit; }'
+                       ),
+                       array(
+                               '.foo { border-radius: .25em 15px 0pt 0ex; }',
+                               '.foo { border-radius: .25em 0ex 0pt 15px; }'
+                       ),
+                       array(
+                               '.foo { x-unknown: a b c d; }'
+                       ),
+                       array(
+                               '.foo barpx 0 2% { opacity: 0; }'
+                       ),
+                       array(
+                               '#settings td p strong'
+                       ),
+                       array(
+                               # Not sure how 4+ values should behave,
+                               # testing to make sure changes are detected
+                               '.foo { x-unknown: 1 2 3 4 5; }',
+                               '.foo { x-unknown: 1 4 3 2 5; }',
+                       ),
+                       array(
+                               '.foo { x-unknown: 1 2 3 4 5 6; }',
+                               '.foo { x-unknown: 1 4 3 2 5 6; }',
+                       ),
+
+                       // Shorthand / Three notation
+                       array(
+                               '.foo { margin: 1em 0 .25em; }'
+                       ),
+                       array(
+                               '.foo { margin:-1.5em 0 -.75em; }'
+                       ),
+
+                       // Shorthand / Two notation
+                       array(
+                               '.foo { padding: 1px 2px; }'
+                       ),
+
+                       // Shorthand / One notation
+                       array(
+                               '.foo { padding: 1px; }'
+                       ),
+
+                       // Direction
+                       // Note: This differs from the Python implementation,
+                       // see also CSSJanus::fixDirection for more info.
+                       array(
+                               '.foo { direction: ltr; }',
+                               '.foo { direction: rtl; }'
+                       ),
+                       array(
+                               '.foo { direction: rtl; }',
+                               '.foo { direction: ltr; }'
+                       ),
+                       array(
+                               'input { direction: ltr; }',
+                               'input { direction: rtl; }'
+                       ),
+                       array(
+                               'input { direction: rtl; }',
+                               'input { direction: ltr; }'
+                       ),
+                       array(
+                               'body { direction: ltr; }',
+                               'body { direction: rtl; }'
+                       ),
+                       array(
+                               '.foo, body, input { direction: ltr; }',
+                               '.foo, body, input { direction: rtl; }'
+                       ),
+                       array(
+                               'body { padding: 10px; direction: ltr; }',
+                               'body { padding: 10px; direction: rtl; }'
+                       ),
+                       array(
+                               'body { direction: ltr } .myClass { direction: ltr }',
+                               'body { direction: rtl } .myClass { direction: rtl }'
+                       ),
+
+                       // Left/right values
+                       array(
+                               '.foo { float: left; }',
+                               '.foo { float: right; }'
+                       ),
+                       array(
+                               '.foo { text-align: left; }',
+                               '.foo { text-align: right; }'
+                       ),
+                       array(
+                               '.foo { -x-unknown: left; }',
+                               '.foo { -x-unknown: right; }'
+                       ),
+                       // Guard against selectors that look flippable
+                       array(
+                               '.column-left { width: 0; }'
+                       ),
+                       array(
+                               'a.left { width: 0; }'
+                       ),
+                       array(
+                               'a.leftification { width: 0; }'
+                       ),
+                       array(
+                               'a.ltr { width: 0; }'
+                       ),
+                       array(
+                               # <div class="a-ltr png">
+                               '.a-ltr.png { width: 0; }'
+                       ),
+                       array(
+                               # <foo-ltr attr="x">
+                               'foo-ltr[attr="x"] { width: 0; }'
+                       ),
+                       array(
+                               'div.left > span.right+span.left { width: 0; }'
+                       ),
+                       array(
+                               '.thisclass .left .myclass { width: 0; }'
+                       ),
+                       array(
+                               '.thisclass .left .myclass #myid { width: 0; }'
+                       ),
+
+                       // Cursor values (east/west)
+                       array(
+                               '.foo { cursor: e-resize; }',
+                               '.foo { cursor: w-resize; }'
+                       ),
+                       array(
+                               '.foo { cursor: se-resize; }',
+                               '.foo { cursor: sw-resize; }'
+                       ),
+                       array(
+                               '.foo { cursor: ne-resize; }',
+                               '.foo { cursor: nw-resize; }'
+                       ),
+
+                       // Background
+                       array(
+                               '.foo { background-position: top left; }',
+                               '.foo { background-position: top right; }'
+                       ),
+                       array(
+                               '.foo { background: url(/foo/bar.png) top left; }',
+                               '.foo { background: url(/foo/bar.png) top right; }'
+                       ),
+                       array(
+                               '.foo { background: url(/foo/bar.png) top left no-repeat; }',
+                               '.foo { background: url(/foo/bar.png) top right no-repeat; }'
+                       ),
+                       array(
+                               '.foo { background: url(/foo/bar.png) no-repeat top left; }',
+                               '.foo { background: url(/foo/bar.png) no-repeat top right; }'
+                       ),
+                       array(
+                               '.foo { background: #fff url(/foo/bar.png) no-repeat top left; }',
+                               '.foo { background: #fff url(/foo/bar.png) no-repeat top right; }'
+                       ),
+                       array(
+                               '.foo { background-position: 100% 40%; }',
+                               '.foo { background-position: 0% 40%; }'
+                       ),
+                       array(
+                               '.foo { background-position: 23% 0; }',
+                               '.foo { background-position: 77% 0; }'
+                       ),
+                       array(
+                               '.foo { background-position: 23% auto; }',
+                               '.foo { background-position: 77% auto; }'
+                       ),
+                       array(
+                               '.foo { background-position-x: 23%; }',
+                               '.foo { background-position-x: 77%; }'
+                       ),
+                       array(
+                               '.foo { background-position-y: 23%; }',
+                               '.foo { background-position-y: 23%; }'
+                       ),
+                       array(
+                               '.foo { background:url(../foo.png) no-repeat 75% 50%; }',
+                               '.foo { background:url(../foo.png) no-repeat 25% 50%; }'
+                       ),
+                       array(
+                               '.foo { background: 10% 20% } .bar { background: 40% 30% }',
+                               '.foo { background: 90% 20% } .bar { background: 60% 30% }'
+                       ),
+
+                       // Multiple rules
+                       array(
+                               'body { direction: rtl; float: right; } .foo { direction: ltr; float: right; }',
+                               'body { direction: ltr; float: left; } .foo { direction: rtl; float: left; }',
+                       ),
+
+                       // Duplicate properties
+                       array(
+                               '.foo { float: left; float: right; float: left; }',
+                               '.foo { float: right; float: left; float: right; }',
+                       ),
+
+                       // Preserve comments
+                       array(
+                               '/* left /* right */left: 10px',
+                               '/* left /* right */right: 10px'
+                       ),
+                       array(
+                               '/*left*//*left*/left: 10px',
+                               '/*left*//*left*/right: 10px'
+                       ),
+                       array(
+                               '/* Going right is cool */ .foo { width: 0 }',
+                       ),
+                       array(
+                               "/* padding-right 1 2 3 4 */\n#test { width: 0}\n/*right*/"
+                       ),
+                       array(
+                               "/** Two line comment\n * left\n \*/\n#test {width: 0}"
+                       ),
+
+                       // @noflip annotation
+                       array(
+                               // before selector (single)
+                               '/* @noflip */ div { float: left; }'
+                       ),
+                       array(
+                               // before selector (multiple)
+                               '/* @noflip */ div, .notme { float: left; }'
+                       ),
+                       array(
+                               // inside selector
+                               'div, /* @noflip */ .foo { float: left; }'
+                       ),
+                       array(
+                               // after selector
+                               'div, .notme /* @noflip */ { float: left; }'
+                       ),
+                       array(
+                               // before multiple rules
+                               '/* @noflip */ div { float: left; } .foo { float: left; }',
+                               '/* @noflip */ div { float: left; } .foo { float: right; }'
+                       ),
+                       array(
+                               // after multiple rules
+                               '.foo { float: left; } /* @noflip */ div { float: left; }',
+                               '.foo { float: right; } /* @noflip */ div { float: left; }'
+                       ),
+                       array(
+                               // before multiple properties
+                               'div { /* @noflip */ float: left; text-align: left; }',
+                               'div { /* @noflip */ float: left; text-align: right; }'
+                       ),
+                       array(
+                               // after multiple properties
+                               'div { float: left; /* @noflip */ text-align: left; }',
+                               'div { float: right; /* @noflip */ text-align: left; }'
+                       ),
+
+                       // Guard against css3 stuff
+                       array(
+                               'background-image: -moz-linear-gradient(#326cc1, #234e8c);'
+                       ),
+                       array(
+                               'background-image: -webkit-gradient(linear, 100% 0%, 0% 0%, from(#666666), to(#ffffff));'
+                       ),
+
+                       // CSS syntax / white-space variations
+                       // spaces, no spaces, tabs, new lines, omitting semi-colons
+                       array(
+                               ".foo { left: 0; }",
+                               ".foo { right: 0; }"
+                       ),
+                       array(
+                               ".foo{ left: 0; }",
+                               ".foo{ right: 0; }"
+                       ),
+                       array(
+                               ".foo{ left: 0 }",
+                               ".foo{ right: 0 }"
+                       ),
+                       array(
+                               ".foo{left:0 }",
+                               ".foo{right:0 }"
+                       ),
+                       array(
+                               ".foo{left:0}",
+                               ".foo{right:0}"
+                       ),
+                       array(
+                               ".foo  {  left : 0 ; }",
+                               ".foo  {  right : 0 ; }"
+                       ),
+                       array(
+                               ".foo\n  {  left : 0 ; }",
+                               ".foo\n  {  right : 0 ; }"
+                       ),
+                       array(
+                               ".foo\n  {  \nleft : 0 ; }",
+                               ".foo\n  {  \nright : 0 ; }"
+                       ),
+                       array(
+                               ".foo\n  { \n left : 0 ; }",
+                               ".foo\n  { \n right : 0 ; }"
+                       ),
+                       array(
+                               ".foo\n  { \n left\n  : 0; }",
+                               ".foo\n  { \n right\n  : 0; }"
+                       ),
+                       array(
+                               ".foo \n  { \n left\n  : 0; }",
+                               ".foo \n  { \n right\n  : 0; }"
+                       ),
+                       array(
+                               ".foo\n{\nleft\n:\n0;}",
+                               ".foo\n{\nright\n:\n0;}"
+                       ),
+                       array(
+                               ".foo\n.bar {\n\tleft: 0;\n}",
+                               ".foo\n.bar {\n\tright: 0;\n}"
+                       ),
+                       array(
+                               ".foo\t{\tleft\t:\t0;}",
+                               ".foo\t{\tright\t:\t0;}"
+                       ),
+               );
+       }
+
+       /**
+        * These cases are tested in one way only (format: actual, expected, msg).
+        * If both ways can be tested, either put both versions in here or move
+        * it to provideTransformCases().
+        */
+       function provideTransformAdvancedCases() {
+               $bgPairs = array(
+                       # [ - _ . ] <-> [ left right ltr rtl ]
+                       'foo.jpg' => 'foo.jpg',
+                       'left.jpg' => 'right.jpg',
+                       'ltr.jpg' => 'rtl.jpg',
+
+                       'foo-left.png' => 'foo-right.png',
+                       'foo_left.png' => 'foo_right.png',
+                       'foo.left.png' => 'foo.right.png',
+
+                       'foo-ltr.png' => 'foo-rtl.png',
+                       'foo_ltr.png' => 'foo_rtl.png',
+                       'foo.ltr.png' => 'foo.rtl.png',
+
+                       'left-foo.png' => 'right-foo.png',
+                       'left_foo.png' => 'right_foo.png',
+                       'left.foo.png' => 'right.foo.png',
+
+                       'ltr-foo.png' => 'rtl-foo.png',
+                       'ltr_foo.png' => 'rtl_foo.png',
+                       'ltr.foo.png' => 'rtl.foo.png',
+
+                       'foo-ltr-left.gif' => 'foo-rtl-right.gif',
+                       'foo_ltr_left.gif' => 'foo_rtl_right.gif',
+                       'foo.ltr.left.gif' => 'foo.rtl.right.gif',
+                       'foo-ltr_left.gif' => 'foo-rtl_right.gif',
+                       'foo_ltr.left.gif' => 'foo_rtl.right.gif',
+               );
+               $provider = array();
+               foreach ( $bgPairs as $left => $right ) {
+                       # By default '-rtl' and '-left' etc. are not touched,
+                       # Only when the appropiate parameter is set.
+                       $provider[] = array(
+                               ".foo { background: url(images/$left); }",
+                               ".foo { background: url(images/$left); }"
+                       );
+                       $provider[] = array(
+                               ".foo { background: url(images/$right); }",
+                               ".foo { background: url(images/$right); }"
+                       );
+                       $provider[] = array(
+                               ".foo { background: url(images/$left); }",
+                               ".foo { background: url(images/$right); }",
+                               array(
+                                       'swapLtrRtlInURL' => true,
+                                       'swapLeftRightInURL' => true,
+                               )
+                       );
+                       $provider[] = array(
+                               ".foo { background: url(images/$right); }",
+                               ".foo { background: url(images/$left); }",
+                               array(
+                                       'swapLtrRtlInURL' => true,
+                                       'swapLeftRightInURL' => true,
+                               )
+                       );
+               }
+
+               return $provider;
+       }
+
+       /**
+        * Cases that are currently failing, but
+        * should be looked at in the future as enhancements and/or bug fix
+        */
+       function provideTransformBrokenCases() {
+               return array(
+                       // Guard against partial keys
+                       array(
+                               '.foo { leftxx: 0; }',
+                               '.foo { leftxx: 0; }'
+                       ),
+                       array(
+                               '.foo { rightxx: 0; }',
+                               '.foo { rightxx: 0; }'
+                       ),
+
+                       // Guard against selectors that look flippable
+                       array(
+                               # <foo-left-x attr="x">
+                               'foo-left-x[attr="x"] { width: 0; }',
+                               'foo-left-x[attr="x"] { width: 0; }'
+                       ),
+                       array(
+                               # <div class="foo" data-left="x">
+                               '.foo[data-left="x"] { width: 0; }',
+                               '.foo[data-left="x"] { width: 0; }'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/libs/GenericArrayObjectTest.php b/tests/phpunit/includes/libs/GenericArrayObjectTest.php
new file mode 100644 (file)
index 0000000..70fce11
--- /dev/null
@@ -0,0 +1,245 @@
+<?php
+
+/**
+ * Tests for the GenericArrayObject and deriving classes.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.20
+ *
+ * @ingroup Test
+ * @group GenericArrayObject
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class GenericArrayObjectTest extends MediaWikiTestCase {
+
+       /**
+        * Returns objects that can serve as elements in the concrete GenericArrayObject deriving class being tested.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public abstract function elementInstancesProvider();
+
+       /**
+        * Returns the name of the concrete class being tested.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       public abstract function getInstanceClass();
+
+       /**
+        * Provides instances of the concrete class being tested.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function instanceProvider() {
+               $instances = array();
+
+               foreach ( $this->elementInstancesProvider() as $elementInstances ) {
+                       $instances[] = $this->getNew( $elementInstances );
+               }
+
+               return $this->arrayWrap( $instances );
+       }
+
+       /**
+        * @since 1.20
+        *
+        * @param array $elements
+        *
+        * @return GenericArrayObject
+        */
+       protected function getNew( array $elements = array() ) {
+               $class = $this->getInstanceClass();
+               return new $class( $elements );
+       }
+
+       /**
+        * @dataProvider elementInstancesProvider
+        *
+        * @since 1.20
+        *
+        * @param array $elements
+        */
+       public function testConstructor( array $elements ) {
+               $arrayObject = $this->getNew( $elements );
+
+               $this->assertEquals( count( $elements ), $arrayObject->count() );
+       }
+
+       /**
+        * @dataProvider elementInstancesProvider
+        *
+        * @since 1.20
+        *
+        * @param array $elements
+        */
+       public function testIsEmpty( array $elements ) {
+               $arrayObject = $this->getNew( $elements );
+
+               $this->assertEquals( $elements === array(), $arrayObject->isEmpty() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        *
+        * @since 1.20
+        *
+        * @param GenericArrayObject $list
+        */
+       public function testUnset( GenericArrayObject $list ) {
+               if ( !$list->isEmpty() ) {
+                       $offset = $list->getIterator()->key();
+                       $count = $list->count();
+                       $list->offsetUnset( $offset );
+                       $this->assertEquals( $count - 1, $list->count() );
+               }
+
+               if ( !$list->isEmpty() ) {
+                       $offset = $list->getIterator()->key();
+                       $count = $list->count();
+                       unset( $list[$offset] );
+                       $this->assertEquals( $count - 1, $list->count() );
+               }
+
+               $exception = null;
+               try { $list->offsetUnset( 'sdfsedtgsrdysftu' ); } catch ( \Exception $exception ){}
+               $this->assertInstanceOf( '\Exception', $exception );
+       }
+
+       /**
+        * @dataProvider elementInstancesProvider
+        *
+        * @since 1.20
+        *
+        * @param array $elements
+        */
+       public function testAppend( array $elements ) {
+               $list = $this->getNew();
+
+               $listSize = count( $elements );
+
+               foreach ( $elements as $element ) {
+                       $list->append( $element );
+               }
+
+               $this->assertEquals( $listSize, $list->count() );
+
+               $list = $this->getNew();
+
+               foreach ( $elements as $element ) {
+                       $list[] = $element;
+               }
+
+               $this->assertEquals( $listSize, $list->count() );
+
+               $this->checkTypeChecks( function( GenericArrayObject $list, $element ) {
+                       $list->append( $element );
+               } );
+       }
+
+       /**
+        * @since 1.20
+        *
+        * @param callback $function
+        */
+       protected function checkTypeChecks( $function ) {
+               $excption = null;
+               $list = $this->getNew();
+
+               $elementClass = $list->getObjectType();
+
+               foreach ( array( 42, 'foo', array(), new \stdClass(), 4.2 ) as $element ) {
+                       $validValid = $element instanceof $elementClass;
+
+                       try{
+                               call_user_func( $function, $list, $element );
+                               $valid = true;
+                       }
+                       catch ( InvalidArgumentException $exception ) {
+                               $valid = false;
+                       }
+
+                       $this->assertEquals(
+                               $validValid,
+                               $valid,
+                               'Object of invalid type got successfully added to a GenericArrayObject'
+                       );
+               }
+       }
+
+       /**
+        * @dataProvider elementInstancesProvider
+        *
+        * @since 1.20
+        *
+        * @param array $elements
+        */
+       public function testOffsetSet( array $elements ) {
+               if ( $elements === array() ) {
+                       $this->assertTrue( true );
+                       return;
+               }
+
+               $list = $this->getNew();
+
+               $element = reset( $elements );
+               $list->offsetSet( 42, $element );
+               $this->assertEquals( $element, $list->offsetGet( 42 ) );
+
+               $list = $this->getNew();
+
+               $element = reset( $elements );
+               $list['oHai'] = $element;
+               $this->assertEquals( $element, $list['oHai'] );
+
+               $list = $this->getNew();
+
+               $element = reset( $elements );
+               $list->offsetSet( 9001, $element );
+               $this->assertEquals( $element, $list[9001] );
+
+               $list = $this->getNew();
+
+               $element = reset( $elements );
+               $list->offsetSet( null, $element );
+               $this->assertEquals( $element, $list[0] );
+
+               $list = $this->getNew();
+               $offset = 0;
+
+               foreach ( $elements as $element ) {
+                       $list->offsetSet( null, $element );
+                       $this->assertEquals( $element, $list[$offset++] );
+               }
+
+               $this->assertEquals( count( $elements ), $list->count() );
+
+               $this->checkTypeChecks( function( GenericArrayObject $list, $element ) {
+                       $list->offsetSet( mt_rand(), $element );
+               } );
+       }
+
+}
index d2bfeed..f121b01 100644 (file)
@@ -4,9 +4,18 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
 
        function provideCases() {
                return array(
-                       // Basic tokens
+
+                       // Basic whitespace and comments that should be stripped entirely
                        array( "\r\t\f \v\n\r", "" ),
                        array( "/* Foo *\n*bar\n*/", "" ),
+
+                       /**
+                        * Slashes used inside block comments (bug 26931).
+                        * At some point there was a bug that caused this comment to be ended at '* /',
+                        * causing /M... to be left as the beginning of a regex.
+                        */
+                       array( "/**\n * Foo\n * {\n * 'bar' : {\n * //Multiple rules with configurable operators\n * 'baz' : false\n * }\n */", ""),
+
                        /**
                         * '  Foo \' bar \
                         *  baz \' quox '  .
@@ -15,11 +24,13 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        array( "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \"  .length", "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \".length" ),
                        array( "// Foo b/ar baz", "" ),
                        array( "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /  .length", "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /.length" ),
+
                        // HTML comments
                        array( "<!-- Foo bar", "" ),
                        array( "<!-- Foo --> bar", "" ),
                        array( "--> Foo", "" ),
                        array( "x --> y", "x-->y" ),
+
                        // Semicolon insertion
                        array( "(function(){return\nx;})", "(function(){return\nx;})" ),
                        array( "throw\nx;", "throw\nx;" ),
@@ -35,12 +46,19 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        array( "5.\nx;", "5.\nx;" ),
                        array( "0xFF.\nx;", "0xFF.x;" ),
                        array( "5.3.\nx;", "5.3.x;" ),
+
+                       // Semicolon insertion between an expression having an inline
+                       // comment after it, and a statement on the next line (bug 27046).
+                       array( "var a = this //foo bar \n for ( b = 0; c < d; b++ ) {}", "var a=this\nfor(b=0;c<d;b++){}" ),
+
                        // Token separation
                        array( "x  in  y", "x in y" ),
                        array( "/x/g  in  y", "/x/g in y" ),
                        array( "x  in  30", "x in 30" ),
                        array( "x  +  ++  y", "x+ ++y" ),
+                       array( "x ++  +  y", "x++ +y" ),
                        array( "x  /  /y/.exec(z)", "x/ /y/.exec(z)" ),
+
                        // State machine
                        array( "/  x/g", "/  x/g" ),
                        array( "(function(){return/  x/g})", "(function(){return/  x/g})" ),
@@ -63,15 +81,18 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        array( "function x(){}/  x/g", "function x(){}/  x/g" ),
                        array( "+function x(){}/  x/g", "+function x(){}/x/g" ),
                        
-                       // Tests for things that broke in the past
                        // Multiline quoted string
                        array( "var foo=\"\\\nblah\\\n\";", "var foo=\"\\\nblah\\\n\";" ),
+
                        // Multiline quoted string followed by string with spaces
                        array( "var foo=\"\\\nblah\\\n\";\nvar baz = \" foo \";\n", "var foo=\"\\\nblah\\\n\";var baz=\" foo \";" ),
+
                        // URL in quoted string ( // is not a comment)
                        array( "aNode.setAttribute('href','http://foo.bar.org/baz');", "aNode.setAttribute('href','http://foo.bar.org/baz');" ),
+
                        // URL in quoted string after multiline quoted string
                        array( "var foo=\"\\\nblah\\\n\";\naNode.setAttribute('href','http://foo.bar.org/baz');", "var foo=\"\\\nblah\\\n\";aNode.setAttribute('href','http://foo.bar.org/baz');" ),
+
                        // Division vs. regex nastiness
                        array( "alert( (10+10) / '/'.charCodeAt( 0 ) + '//' );", "alert((10+10)/'/'.charCodeAt(0)+'//');" ),
                        array( "if(1)/a /g.exec('Pa ss');", "if(1)/a /g.exec('Pa ss');" ),
@@ -81,11 +102,12 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
 
                        // Unicode letter characters should pass through ok in identifiers (bug 31187)
                        array( "var KaŝSkatolVal = {}", 'var KaŝSkatolVal={}'),
-                       // And also per spec unicode char escape values should work in identifiers,
+
+                       // Per spec unicode char escape values should work in identifiers,
                        // as long as it's a valid char. In future it might get normalized.
                        array( "var Ka\\u015dSkatolVal = {}", 'var Ka\\u015dSkatolVal={}'),
 
-                       /* Some structures that might look invalid at first sight */
+                       // Some structures that might look invalid at first sight
                        array( "var a = 5.;", "var a=5.;" ),
                        array( "5.0.toString();", "5.0.toString();" ),
                        array( "5..toString();", "5..toString();" ),
@@ -110,24 +132,6 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
        }
 
-       /**
-        * @dataProvider provideBug32548
-        */
-       function testBug32548Exponent($num) {
-               // Long line breaking was being incorrectly done between the base and
-               // exponent part of a number, causing a syntax error. The line should
-               // instead break at the start of the number.
-               $prefix = 'var longVarName' . str_repeat('_', 973) . '=';
-               $suffix = ',shortVarName=0;';
-
-               $input = $prefix . $num . $suffix;
-               $expected = $prefix . "\n" . $num . $suffix;
-
-               $minified = JavaScriptMinifier::minify( $input );
-
-               $this->assertEquals( $expected, $minified, "Line breaks must not occur in middle of exponent");
-       }
-
        function provideBug32548() {
                return array(
                        array(
@@ -145,4 +149,22 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        ),
                );
        }
+
+       /**
+        * @dataProvider provideBug32548
+        */
+       function testBug32548Exponent( $num ) {
+               // Long line breaking was being incorrectly done between the base and
+               // exponent part of a number, causing a syntax error. The line should
+               // instead break at the start of the number.
+               $prefix = 'var longVarName' . str_repeat( '_', 973 ) . '=';
+               $suffix = ',shortVarName=0;';
+
+               $input = $prefix . $num . $suffix;
+               $expected = $prefix . "\n" . $num . $suffix;
+
+               $minified = JavaScriptMinifier::minify( $input );
+
+               $this->assertEquals( $expected, $minified, "Line breaks must not occur in middle of exponent");
+       }
 }
index f4f52dd..d6e2547 100644 (file)
@@ -2,7 +2,7 @@
 class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 
        public function setUp() {
-               $this->filePath = dirname( __FILE__ ) . '/../../data/media/';
+               $this->filePath = __DIR__ . '/../../data/media/';
        }
 
        /**
index 1e2d1bb..6af52dd 100644 (file)
@@ -8,7 +8,7 @@ class ExifRotationTest extends MediaWikiTestCase {
        function setUp() {
                parent::setUp();
                $this->handler = new BitmapHandler();
-               $filePath = dirname( __FILE__ ) . '/../../data/media';
+               $filePath = __DIR__ . '/../../data/media';
 
                $tmpDir = $this->getNewTempDirectory();
 
index 80aaac2..045777d 100644 (file)
@@ -2,7 +2,7 @@
 class ExifTest extends MediaWikiTestCase {
 
        public function setUp() {
-               $this->mediaPath = dirname( __FILE__ ) . '/../../data/media/';
+               $this->mediaPath = __DIR__ . '/../../data/media/';
 
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
@@ -25,7 +25,7 @@ class ExifTest extends MediaWikiTestCase {
                $expected = array(
                        'GPSLatitude' => 88.5180555556,
                        'GPSLongitude' => -21.12357,
-                       'GPSAltitude' => -200,
+                       'GPSAltitude' => -3.141592653,
                        'GPSDOP' => '5/1',
                        'GPSVersionID' => '2.2.0.0',
                );
index 8a632f5..6ade670 100644 (file)
@@ -4,7 +4,7 @@ class FormatMetadataTest extends MediaWikiTestCase {
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
-               $filePath = dirname( __FILE__ ) .  '/../../data/media';
+               $filePath = __DIR__ .  '/../../data/media';
                $this->backend = new FSFileBackend( array(
                        'name'           => 'localtesting',
                        'lockManager'    => 'nullLockManager',
index 47fc368..650fdd5 100644 (file)
@@ -2,7 +2,7 @@
 class GIFMetadataExtractorTest extends MediaWikiTestCase {
 
        public function setUp() {
-               $this->mediaPath = dirname( __FILE__ ) . '/../../data/media/';
+               $this->mediaPath = __DIR__ . '/../../data/media/';
        }
        /**
         * Put in a file, and see if the metadata coming out is as expected.
index 3665835..5dcbeee 100644 (file)
@@ -2,7 +2,7 @@
 class GIFHandlerTest extends MediaWikiTestCase {
 
        public function setUp() {
-               $this->filePath = dirname( __FILE__ ) .  '/../../data/media';
+               $this->filePath = __DIR__ .  '/../../data/media';
                $this->backend = new FSFileBackend( array(
                        'name'           => 'localtesting',
                        'lockManager'    => 'nullLockManager',
index f48382a..41d8119 100644 (file)
@@ -9,7 +9,7 @@
 class JpegMetadataExtractorTest extends MediaWikiTestCase {
 
        public function setUp() {
-               $this->filePath = dirname( __FILE__ ) . '/../../data/media/';
+               $this->filePath = __DIR__ . '/../../data/media/';
        }
 
        /**
index ddabf5b..ea007f9 100644 (file)
@@ -2,7 +2,7 @@
 class JpegTest extends MediaWikiTestCase {
 
        public function setUp() {
-               $this->filePath = dirname( __FILE__ ) . '/../../data/media/';
+               $this->filePath = __DIR__ . '/../../data/media/';
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
index 9f702c5..1b1b2ec 100644 (file)
@@ -2,7 +2,7 @@
 class PNGMetadataExtractorTest extends MediaWikiTestCase {
 
        function setUp() {
-               $this->filePath = dirname( __FILE__ ) . '/../../data/media/';   
+               $this->filePath = __DIR__ . '/../../data/media/';
        }
        /**
         * Tests zTXt tag (compressed textual metadata) 
index b6f911f..fe73c9c 100644 (file)
@@ -2,7 +2,7 @@
 class PNGHandlerTest extends MediaWikiTestCase {
 
        public function setUp() {
-               $this->filePath = dirname( __FILE__ ) .  '/../../data/media';
+               $this->filePath = __DIR__ .  '/../../data/media';
                $this->backend = new FSFileBackend( array(
                        'name'           => 'localtesting',
                        'lockManager'    => 'nullLockManager',
index 526beae..2116554 100644 (file)
@@ -39,27 +39,33 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
        }
 
        function providerSvgFiles() {
-               $base = dirname( __FILE__ ) . '/../../data/media';
+               $base = __DIR__ . '/../../data/media';
                return array(
                        array(
                                "$base/Wikimedia-logo.svg",
                                array(
                                        'width' => 1024,
-                                       'height' => 1024
+                                       'height' => 1024,
+                                       'originalWidth' => '1024',
+                                       'originalHeight' => '1024',
                                )
                        ),
                        array(
                                "$base/QA_icon.svg",
                                array(
                                        'width' => 60,
-                                       'height' => 60
+                                       'height' => 60,
+                                       'originalWidth' => '60',
+                                       'originalHeight' => '60',
                                )
                        ),
                        array(
                                "$base/Gtk-media-play-ltr.svg",
                                array(
                                        'width' => 60,
-                                       'height' => 60
+                                       'height' => 60,
+                                       'originalWidth' => '60.0000000',
+                                       'originalHeight' => '60.0000000',
                                )
                        ),
                        array(
@@ -67,14 +73,16 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                                // This file triggered bug 31719, needs entity expansion in the xmlns checks
                                array(
                                        'width' => 385,
-                                       'height' => 385
+                                       'height' => 385,
+                                       'originalWidth' => '385',
+                                       'originalHeight' => '385.0004883',
                                )
                        )
                );
        }
 
        function providerSvgFilesWithXMLMetadata() {
-               $base = dirname( __FILE__ ) . '/../../data/media';
+               $base = __DIR__ . '/../../data/media';
                $metadata = 
     '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
       <ns4:Work xmlns:ns4="http://creativecommons.org/ns#" rdf:about="">
@@ -89,7 +97,9 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                                array(
                                        'height' => 593,
                                        'metadata' => $metadata,
-                                       'width' => 959
+                                       'width' => 959,
+                                       'originalWidth' => '958.69',
+                                       'originalHeight' => '592.78998',
                                )
                        ),
                );
index d4cf503..4c79f66 100644 (file)
@@ -5,7 +5,7 @@ class TiffTest extends MediaWikiTestCase {
                global $wgShowEXIF;
                $this->showExif = $wgShowEXIF;
                $wgShowEXIF = true;
-               $this->filePath = dirname( __FILE__ ) . '/../../data/media/';
+               $this->filePath = __DIR__ . '/../../data/media/';
                $this->handler = new TiffHandler;
        }
 
index c952b23..8198d3b 100644 (file)
@@ -22,11 +22,11 @@ class XMPTest extends MediaWikiTestCase {
                }
                $reader = new XMPReader;
                $reader->parse( $xmp );
-               $this->assertEquals( $expected, $reader->getResults(), $info );
+               $this->assertEquals( $expected, $reader->getResults(), $info, 0.0000000001 );
        }
 
        public function dataXMPParse() {
-               $xmpPath = dirname( __FILE__ ) . '/../../data/xmp/' ;
+               $xmpPath = __DIR__ . '/../../data/xmp/' ;
                $data = array();
 
                // $xmpFiles format: array of arrays with first arg file base name,
@@ -52,6 +52,7 @@ class XMPTest extends MediaWikiTestCase {
                        array( 'utf32BE', 'UTF-32BE encoding' ),
                        array( 'utf32LE', 'UTF-32LE encoding' ),
                        array( 'xmpExt', 'Extended XMP missing second part' ),
+                       array( 'gps', 'Handling of exif GPS parameters in XMP' ),
                 );
                foreach( $xmpFiles as $file ) {
                        $xmp = file_get_contents( $xmpPath . $file[0] . '.xmp' );
@@ -72,7 +73,7 @@ class XMPTest extends MediaWikiTestCase {
         * world example file to double check the support for this is right.
         */
        function testExtendedXMP() {
-               $xmpPath = dirname( __FILE__ ) . '/../../data/xmp/';
+               $xmpPath = __DIR__ . '/../../data/xmp/';
                $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
                $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
 
@@ -102,7 +103,7 @@ class XMPTest extends MediaWikiTestCase {
         * and thus should only return the StandardXMP, not the ExtendedXMP.
         */
        function testExtendedXMPWithWrongGUID() {
-               $xmpPath = dirname( __FILE__ ) . '/../../data/xmp/';
+               $xmpPath = __DIR__ . '/../../data/xmp/';
                $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
                $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
 
@@ -130,7 +131,7 @@ class XMPTest extends MediaWikiTestCase {
         * which should cause it to ignore the ExtendedXMP packet.
         */
        function testExtendedXMPMissingPacket() {
-               $xmpPath = dirname( __FILE__ ) . '/../../data/xmp/';
+               $xmpPath = __DIR__ . '/../../data/xmp/';
                $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
                $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
 
index 816c017..6a6fded 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-require_once( dirname( __FILE__ ) . '/NewParserTest.php' );
+require_once( __DIR__ . '/NewParserTest.php' );
 
 /**
  * The UnitTest must be either a class that inherits from MediaWikiTestCase
index d9b1671..ff6e472 100644 (file)
@@ -186,7 +186,7 @@ class NewParserTest extends MediaWikiTestCase {
                if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
                        $image->recordUpload2(
                                '', // archive name
-                               'Upload of some lame file', 
+                               'Upload of some lame file',
                                'Some lame file',
                                array(
                                        'size'        => 12345,
@@ -197,7 +197,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        'mime'        => 'image/jpeg',
                                        'metadata'    => serialize( array() ),
                                        'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
-                                       'fileExists'  => true ), 
+                                       'fileExists'  => true ),
                                $this->db->timestamp( '20010115123500' ), $user
                        );
                }
@@ -207,8 +207,8 @@ class NewParserTest extends MediaWikiTestCase {
                if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
                        $image->recordUpload2(
                                '', // archive name
-                               'zomgnotcensored', 
-                               'Borderline image', 
+                               'zomgnotcensored',
+                               'Borderline image',
                                array(
                                        'size'        => 12345,
                                        'width'       => 320,
@@ -218,7 +218,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        'mime'        => 'image/jpeg',
                                        'metadata'    => serialize( array() ),
                                        'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
-                                       'fileExists'  => true ), 
+                                       'fileExists'  => true ),
                                $this->db->timestamp( '20010115123500' ), $user
                        );
                }
@@ -345,6 +345,9 @@ class NewParserTest extends MediaWikiTestCase {
 
                $this->savedGlobals = array();
 
+               /** @since 1.20 */
+               wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
+
                foreach ( $settings as $var => $val ) {
                        if ( array_key_exists( $var, $GLOBALS ) ) {
                                $this->savedGlobals[$var] = $GLOBALS[$var];
@@ -380,7 +383,7 @@ class NewParserTest extends MediaWikiTestCase {
                # The entries saved into RepoGroup cache with previous globals will be wrong.
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
-               MessageCache::singleton()->destroyInstance();
+               MessageCache::destroyInstance();
 
                return $context;
        }
@@ -596,7 +599,7 @@ class NewParserTest extends MediaWikiTestCase {
         * Run a fuzz test series
         * Draw input from a set of test files
         *
-        * @todo @fixme Needs some work to not eat memory until the world explodes
+        * @todo fixme Needs some work to not eat memory until the world explodes
         *
         * @group ParserFuzz
         */
diff --git a/tests/phpunit/includes/parser/ParserMethodsTest.php b/tests/phpunit/includes/parser/ParserMethodsTest.php
new file mode 100644 (file)
index 0000000..dea406c
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+class ParserMethodsTest extends MediaWikiLangTestCase {
+
+       public function dataPreSaveTransform() {
+               return array(
+                       array( 'hello this is ~~~',
+                              "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
+                       ),
+                       array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                              'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataPreSaveTransform
+        */
+       public function testPreSaveTransform( $text, $expected ) {
+               global $wgParser;
+
+               $title = Title::newFromText( str_replace( '::', '__', __METHOD__ ) );
+               $user = new User();
+               $user->setName( "127.0.0.1" );
+               $popts = ParserOptions::newFromUser( $user );
+               $text = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+       // TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
+}
+
index 9d3499a..fee5674 100644 (file)
@@ -103,7 +103,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                        array( "{{foo|bar=|}", "<root>{{foo|bar=|}</root>"),
                        array( "{{Foo|} Bar=", "<root>{{Foo|} Bar=</root>"),
                        array( "{{Foo|} Bar=}}", "<root><template><title>Foo</title><part><name>} Bar</name>=<value></value></part></template></root>"),
-                       /* array( file_get_contents( dirname( __FILE__ ) . '/QuoteQuran.txt' ), file_get_contents( dirname( __FILE__ ) . '/QuoteQuranExpanded.txt' ) ), */
+                       /* array( file_get_contents( __DIR__ . '/QuoteQuran.txt' ), file_get_contents( __DIR__ . '/QuoteQuranExpanded.txt' ) ), */
                );
        }
 
@@ -165,7 +165,7 @@ class PreprocessorTest extends MediaWikiTestCase {
         * @dataProvider provideFiles
         */
        function testPreprocessorOutputFiles( $filename ) {
-               $folder = dirname( __FILE__ ) . "/../../../parser/preprocess";
+               $folder = __DIR__ . "/../../../parser/preprocess";
                $wikiText = file_get_contents( "$folder/$filename.txt" );
                $output = $this->preprocessToXml( $wikiText );
 
index c6498fa..f66c387 100644 (file)
@@ -20,7 +20,7 @@ class UploadFromUrlTest extends ApiTestCase {
                }
        }
 
-       protected function doApiRequest( $params, $unused = null, $appendModule = false, $user = null ) {
+       protected function doApiRequest( Array $params, Array $unused = null, $appendModule = false, User $user = null ) {
                $sessionId = session_id();
                session_write_close();
 
index c9dbb13..dc1c2ac 100644 (file)
@@ -12,7 +12,7 @@ class UploadStashTest extends MediaWikiTestCase {
                parent::setUp();
 
                // Setup a file for bug 29408
-               $this->bug29408File = dirname( __FILE__ ) . '/bug29408';
+               $this->bug29408File = __DIR__ . '/bug29408';
                file_put_contents( $this->bug29408File, "\x00" );
 
                self::$users = array(
index 4293d23..6948f5b 100644 (file)
@@ -12,7 +12,9 @@ class UploadTest extends MediaWikiTestCase {
 
                $this->upload = new UploadTestHandler;
                $this->hooks = $wgHooks;
-               $wgHooks['InterwikiLoadPrefix'][] = 'MediaWikiTestCase::disableInterwikis';
+               $wgHooks['InterwikiLoadPrefix'][] = function( $prefix, &$data ) {
+                       return false;
+               };
        }
 
        function tearDown() {
index 9ac0f95..7833da7 100644 (file)
@@ -18,31 +18,31 @@ class LanguageHeTest extends MediaWikiTestCase {
 
        /** @dataProvider providerPluralDual */
        function testPluralDual( $result, $value ) {
-               $forms = array( 'one', 'many', 'two' );
+               $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
        }
 
        function providerPluralDual() {
                return array (
-                       array( 'many', 0 ), // Zero -> plural
+                       array( 'other', 0 ), // Zero -> plural
                        array( 'one', 1 ), // Singular
                        array( 'two', 2 ), // Dual
-                       array( 'many', 3 ), // Plural
+                       array( 'other', 3 ), // Plural
                );
        }
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
                return array (
-                       array( 'many', 0 ), // Zero -> plural
+                       array( 'other', 0 ), // Zero -> plural
                        array( 'one', 1 ), // Singular
-                       array( 'many', 2 ), // Plural, no dual provided
-                       array( 'many', 3 ), // Plural
+                       array( 'other', 2 ), // Plural, no dual provided
+                       array( 'other', 3 ), // Plural
                );
        }
 }
index 188f0ae..d44ecf8 100644 (file)
@@ -12,9 +12,9 @@
  * @file
  */
 
-require_once dirname( dirname( __FILE__ ) ) . '/bootstrap.php';
+require_once dirname( __DIR__ ) . '/bootstrap.php';
 
-/** Tests for MediaWiki languages/LanguageTr.php */
+/** Tests for MediaWiki languages/LanguageSr.php */
 class LanguageSrTest extends MediaWikiTestCase {
        /* Language object. Initialized before each test */
        private $lang;
index a1a6d59..7025449 100644 (file)
@@ -24,43 +24,195 @@ class LanguageTest extends MediaWikiTestCase {
                );
        }
 
-       /** @dataProvider provideFormattableTimes */
+       /**
+        * @dataProvider provideFormattableTimes
+        */
        function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
                $this->assertEquals( $expected, $this->lang->formatTimePeriod( $seconds, $format ), $desc );
        }
 
        function provideFormattableTimes() {
                return array(
-                       array( 9.45, array(), '9.5s', 'formatTimePeriod() rounding (<10s)' ),
-                       array( 9.45, array( 'noabbrevs' => true ), '9.5 seconds', 'formatTimePeriod() rounding (<10s)' ),
-                       array( 9.95, array(), '10s', 'formatTimePeriod() rounding (<10s)' ),
-                       array( 9.95, array( 'noabbrevs' => true ), '10 seconds', 'formatTimePeriod() rounding (<10s)' ),
-                       array( 59.55, array(), '1m 0s', 'formatTimePeriod() rounding (<60s)' ),
-                       array( 59.55, array( 'noabbrevs' => true ), '1 minute 0 seconds', 'formatTimePeriod() rounding (<60s)' ),
-                       array( 119.55, array(), '2m 0s', 'formatTimePeriod() rounding (<1h)' ),
-                       array( 119.55, array( 'noabbrevs' => true ), '2 minutes 0 seconds', 'formatTimePeriod() rounding (<1h)' ),
-                       array( 3599.55, array(), '1h 0m 0s', 'formatTimePeriod() rounding (<1h)' ),
-                       array( 3599.55, array( 'noabbrevs' => true ), '1 hour 0 minutes 0 seconds', 'formatTimePeriod() rounding (<1h)' ),
-                       array( 7199.55, array(), '2h 0m 0s', 'formatTimePeriod() rounding (>=1h)' ),
-                       array( 7199.55, array( 'noabbrevs' => true ), '2 hours 0 minutes 0 seconds', 'formatTimePeriod() rounding (>=1h)' ),
-                       array( 7199.55, 'avoidseconds', '2h 0m', 'formatTimePeriod() rounding (>=1h), avoidseconds' ),
-                       array( 7199.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '2 hours 0 minutes', 'formatTimePeriod() rounding (>=1h), avoidseconds' ),
-                       array( 7199.55, 'avoidminutes', '2h 0m', 'formatTimePeriod() rounding (>=1h), avoidminutes' ),
-                       array( 7199.55, array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ), '2 hours 0 minutes', 'formatTimePeriod() rounding (>=1h), avoidminutes' ),
-                       array( 172799.55, 'avoidseconds', '48h 0m', 'formatTimePeriod() rounding (=48h), avoidseconds' ),
-                       array( 172799.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '48 hours 0 minutes', 'formatTimePeriod() rounding (=48h), avoidseconds' ),
-                       array( 259199.55, 'avoidminutes', '3d 0h', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
-                       array( 259199.55, array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ), '3 days 0 hours', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
-                       array( 176399.55, 'avoidseconds', '2d 1h 0m', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
-                       array( 176399.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '2 days 1 hour 0 minutes', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
-                       array( 176399.55, 'avoidminutes', '2d 1h', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
-                       array( 176399.55, array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ), '2 days 1 hour', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
-                       array( 259199.55, 'avoidseconds', '3d 0h 0m', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
-                       array( 259199.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '3 days 0 hours 0 minutes', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
-                       array( 172801.55, 'avoidseconds', '2d 0h 0m', 'formatTimePeriod() rounding, (>48h), avoidseconds' ),
-                       array( 172801.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '2 days 0 hours 0 minutes', 'formatTimePeriod() rounding, (>48h), avoidseconds' ),
-                       array( 176460.55, array(), '2d 1h 1m 1s', 'formatTimePeriod() rounding, recursion, (>48h)' ),
-                       array( 176460.55, array( 'noabbrevs' => true ), '2 days 1 hour 1 minute 1 second', 'formatTimePeriod() rounding, recursion, (>48h)' ),
+                       array(
+                               9.45,
+                               array(),
+                               '9.5s',
+                               'formatTimePeriod() rounding (<10s)'
+                       ),
+                       array(
+                               9.45,
+                               array( 'noabbrevs' => true ),
+                               '9.5 seconds',
+                               'formatTimePeriod() rounding (<10s)'
+                       ),
+                       array(
+                               9.95,
+                               array(),
+                               '10s',
+                               'formatTimePeriod() rounding (<10s)'
+                       ),
+                       array(
+                               9.95,
+                               array( 'noabbrevs' => true ),
+                               '10 seconds',
+                               'formatTimePeriod() rounding (<10s)'
+                       ),
+                       array(
+                               59.55,
+                               array(),
+                               '1m 0s',
+                               'formatTimePeriod() rounding (<60s)'
+                       ),
+                       array(
+                               59.55,
+                               array( 'noabbrevs' => true ),
+                               '1 minute 0 seconds',
+                               'formatTimePeriod() rounding (<60s)'
+                       ),
+                       array(
+                               119.55,
+                               array(),
+                               '2m 0s',
+                               'formatTimePeriod() rounding (<1h)'
+                       ),
+                       array(
+                               119.55,
+                               array( 'noabbrevs' => true ),
+                               '2 minutes 0 seconds',
+                               'formatTimePeriod() rounding (<1h)'
+                       ),
+                       array(
+                               3599.55,
+                               array(),
+                               '1h 0m 0s',
+                               'formatTimePeriod() rounding (<1h)'
+                       ),
+                       array(
+                               3599.55,
+                               array( 'noabbrevs' => true ),
+                               '1 hour 0 minutes 0 seconds',
+                               'formatTimePeriod() rounding (<1h)'
+                       ),
+                       array(
+                               7199.55,
+                               array(),
+                               '2h 0m 0s',
+                               'formatTimePeriod() rounding (>=1h)'
+                       ),
+                       array(
+                               7199.55,
+                               array( 'noabbrevs' => true ),
+                               '2 hours 0 minutes 0 seconds',
+                               'formatTimePeriod() rounding (>=1h)'
+                       ),
+                       array(
+                               7199.55,
+                               'avoidseconds',
+                               '2h 0m',
+                               'formatTimePeriod() rounding (>=1h), avoidseconds'
+                       ),
+                       array(
+                               7199.55,
+                               array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
+                               '2 hours 0 minutes',
+                               'formatTimePeriod() rounding (>=1h), avoidseconds'
+                       ),
+                       array(
+                               7199.55,
+                               'avoidminutes',
+                               '2h 0m',
+                               'formatTimePeriod() rounding (>=1h), avoidminutes'
+                       ),
+                       array(
+                               7199.55,
+                               array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ),
+                               '2 hours 0 minutes',
+                               'formatTimePeriod() rounding (>=1h), avoidminutes'
+                       ),
+                       array(
+                               172799.55,
+                               'avoidseconds',
+                               '48h 0m',
+                               'formatTimePeriod() rounding (=48h), avoidseconds'
+                       ),
+                       array(
+                               172799.55,
+                               array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
+                               '48 hours 0 minutes',
+                               'formatTimePeriod() rounding (=48h), avoidseconds'
+                       ),
+                       array(
+                               259199.55,
+                               'avoidminutes',
+                               '3d 0h',
+                               'formatTimePeriod() rounding (>48h), avoidminutes'
+                       ),
+                       array(
+                               259199.55,
+                               array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ),
+                               '3 days 0 hours',
+                               'formatTimePeriod() rounding (>48h), avoidminutes'
+                       ),
+                       array(
+                               176399.55,
+                               'avoidseconds',
+                               '2d 1h 0m',
+                               'formatTimePeriod() rounding (>48h), avoidseconds'
+                       ),
+                       array(
+                               176399.55,
+                               array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
+                               '2 days 1 hour 0 minutes',
+                               'formatTimePeriod() rounding (>48h), avoidseconds'
+                       ),
+                       array(
+                               176399.55,
+                               'avoidminutes',
+                               '2d 1h',
+                               'formatTimePeriod() rounding (>48h), avoidminutes'
+                       ),
+                       array(
+                               176399.55,
+                               array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ),
+                               '2 days 1 hour',
+                               'formatTimePeriod() rounding (>48h), avoidminutes'
+                       ),
+                       array(
+                               259199.55,
+                               'avoidseconds',
+                               '3d 0h 0m',
+                               'formatTimePeriod() rounding (>48h), avoidseconds'
+                       ),
+                       array(
+                               259199.55,
+                               array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
+                               '3 days 0 hours 0 minutes',
+                               'formatTimePeriod() rounding (>48h), avoidseconds'
+                       ),
+                       array(
+                               172801.55,
+                               'avoidseconds',
+                               '2d 0h 0m',
+                               'formatTimePeriod() rounding, (>48h), avoidseconds'
+                       ),
+                       array(
+                               172801.55,
+                               array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
+                               '2 days 0 hours 0 minutes',
+                               'formatTimePeriod() rounding, (>48h), avoidseconds'
+                       ),
+                       array(
+                               176460.55,
+                               array(),
+                               '2d 1h 1m 1s',
+                               'formatTimePeriod() rounding, recursion, (>48h)'
+                       ),
+                       array(
+                               176460.55,
+                               array( 'noabbrevs' => true ),
+                               '2 days 1 hour 1 minute 1 second',
+                               'formatTimePeriod() rounding, recursion, (>48h)'
+                       ),
                );
 
        }
@@ -98,8 +250,8 @@ class LanguageTest extends MediaWikiTestCase {
        }
 
        /**
-       * @dataProvider provideHTMLTruncateData()
-       */
+        * @dataProvider provideHTMLTruncateData()
+        */
        function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
                // Actual HTML...
                $this->assertEquals(
@@ -792,16 +944,16 @@ class LanguageTest extends MediaWikiTestCase {
                );
        }
 
-       /**\r
-        * @dataProvider provideCheckTitleEncodingData\r
-        */\r
-       function testCheckTitleEncoding( $s ) {\r
-               $this->assertEquals(\r
-                       $s,\r
-                       $this->lang->checkTitleEncoding($s),\r
-                       "checkTitleEncoding('$s')"\r
-               );\r
-       }\r
+       /**
+        * @dataProvider provideCheckTitleEncodingData
+        */
+       function testCheckTitleEncoding( $s ) {
+               $this->assertEquals(
+                       $s,
+                       $this->lang->checkTitleEncoding($s),
+                       "checkTitleEncoding('$s')"
+               );
+       }
 
        function provideCheckTitleEncodingData() {
                return array (
@@ -815,44 +967,103 @@ class LanguageTest extends MediaWikiTestCase {
                        ),
                        // The following two data sets come from bug 36839. They fail if checkTitleEncoding uses a regexp to test for
                        // valid UTF-8 encoding and the pcre.recursion_limit is low (like, say, 1024). They succeed if checkTitleEncoding
-                   // uses mb_check_encoding for its test.
+                       // uses mb_check_encoding for its test.
                        array(
                                rawurldecode(
                                        "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn%7C"
-                                       . "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
-                                       . "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
-                                       . "Les%20Experts%20(s%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e)%7CLes%20Experts%20:%20Manhattan%7C"
-                                       . "Les%20Experts%20:%20Miami%7CListe%20des%20personnages%20des%20Experts%7C"
-                                       . "Liste%20des%20%C3%A9pisodes%20des%20Experts%7CMod%C3%A8le%20discussion:Palette%20Les%20Experts%7C"
-                                       . "Nick%20Stokes%7CPersonnage%20de%20fiction%7CPersonnage%20fictif%7CPersonnage%20de%20fiction%7C"
-                                       . "Personnages%20r%C3%A9currents%20dans%20Les%20Experts%7CRaymond%20Langston%7CRiley%20Adams%7C"
-                                       . "Saison%201%20des%20Experts%7CSaison%2010%20des%20Experts%7CSaison%2011%20des%20Experts%7C"
-                                       . "Saison%2012%20des%20Experts%7CSaison%202%20des%20Experts%7CSaison%203%20des%20Experts%7C"
-                                       . "Saison%204%20des%20Experts%7CSaison%205%20des%20Experts%7CSaison%206%20des%20Experts%7C"
-                                       . "Saison%207%20des%20Experts%7CSaison%208%20des%20Experts%7CSaison%209%20des%20Experts%7C"
-                                       . "Sara%20Sidle%7CSofia%20Curtis%7CS%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e%7CWallace%20Langham%7C"
-                                       . "Warrick%20Brown%7CWendy%20Simms%7C%C3%89tats-Unis"
+                                               . "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
+                                               . "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
+                                               . "Les%20Experts%20(s%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e)%7CLes%20Experts%20:%20Manhattan%7C"
+                                               . "Les%20Experts%20:%20Miami%7CListe%20des%20personnages%20des%20Experts%7C"
+                                               . "Liste%20des%20%C3%A9pisodes%20des%20Experts%7CMod%C3%A8le%20discussion:Palette%20Les%20Experts%7C"
+                                               . "Nick%20Stokes%7CPersonnage%20de%20fiction%7CPersonnage%20fictif%7CPersonnage%20de%20fiction%7C"
+                                               . "Personnages%20r%C3%A9currents%20dans%20Les%20Experts%7CRaymond%20Langston%7CRiley%20Adams%7C"
+                                               . "Saison%201%20des%20Experts%7CSaison%2010%20des%20Experts%7CSaison%2011%20des%20Experts%7C"
+                                               . "Saison%2012%20des%20Experts%7CSaison%202%20des%20Experts%7CSaison%203%20des%20Experts%7C"
+                                               . "Saison%204%20des%20Experts%7CSaison%205%20des%20Experts%7CSaison%206%20des%20Experts%7C"
+                                               . "Saison%207%20des%20Experts%7CSaison%208%20des%20Experts%7CSaison%209%20des%20Experts%7C"
+                                               . "Sara%20Sidle%7CSofia%20Curtis%7CS%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e%7CWallace%20Langham%7C"
+                                               . "Warrick%20Brown%7CWendy%20Simms%7C%C3%89tats-Unis"
                                ),
                        ),
                        array(
                                rawurldecode(
                                        "Mod%C3%A8le%3AArrondissements%20homonymes%7CMod%C3%A8le%3ABandeau%20standard%20pour%20page%20d'homonymie%7C"
-                                       . "Mod%C3%A8le%3ABatailles%20homonymes%7CMod%C3%A8le%3ACantons%20homonymes%7C"
-                                       . "Mod%C3%A8le%3ACommunes%20fran%C3%A7aises%20homonymes%7CMod%C3%A8le%3AFilms%20homonymes%7C"
-                                       . "Mod%C3%A8le%3AGouvernements%20homonymes%7CMod%C3%A8le%3AGuerres%20homonymes%7CMod%C3%A8le%3AHomonymie%7C"
-                                       . "Mod%C3%A8le%3AHomonymie%20bateau%7CMod%C3%A8le%3AHomonymie%20d'%C3%A9tablissements%20scolaires%20ou"
-                                       . "%20universitaires%7CMod%C3%A8le%3AHomonymie%20d'%C3%AEles%7CMod%C3%A8le%3AHomonymie%20de%20clubs%20sportifs%7C"
-                                       . "Mod%C3%A8le%3AHomonymie%20de%20comt%C3%A9s%7CMod%C3%A8le%3AHomonymie%20de%20monument%7C"
-                                       . "Mod%C3%A8le%3AHomonymie%20de%20nom%20romain%7CMod%C3%A8le%3AHomonymie%20de%20parti%20politique%7C"
-                                       . "Mod%C3%A8le%3AHomonymie%20de%20route%7CMod%C3%A8le%3AHomonymie%20dynastique%7C"
-                                       . "Mod%C3%A8le%3AHomonymie%20vid%C3%A9oludique%7CMod%C3%A8le%3AHomonymie%20%C3%A9difice%20religieux%7C"
-                                       . "Mod%C3%A8le%3AInternationalisation%7CMod%C3%A8le%3AIsom%C3%A9rie%7CMod%C3%A8le%3AParonymie%7C"
-                                       . "Mod%C3%A8le%3APatronyme%7CMod%C3%A8le%3APatronyme%20basque%7CMod%C3%A8le%3APatronyme%20italien%7C"
-                                       . "Mod%C3%A8le%3APatronymie%7CMod%C3%A8le%3APersonnes%20homonymes%7CMod%C3%A8le%3ASaints%20homonymes%7C"
-                                       . "Mod%C3%A8le%3ATitres%20homonymes%7CMod%C3%A8le%3AToponymie%7CMod%C3%A8le%3AUnit%C3%A9s%20homonymes%7C"
-                                       . "Mod%C3%A8le%3AVilles%20homonymes%7CMod%C3%A8le%3A%C3%89difices%20religieux%20homonymes"
+                                               . "Mod%C3%A8le%3ABatailles%20homonymes%7CMod%C3%A8le%3ACantons%20homonymes%7C"
+                                               . "Mod%C3%A8le%3ACommunes%20fran%C3%A7aises%20homonymes%7CMod%C3%A8le%3AFilms%20homonymes%7C"
+                                               . "Mod%C3%A8le%3AGouvernements%20homonymes%7CMod%C3%A8le%3AGuerres%20homonymes%7CMod%C3%A8le%3AHomonymie%7C"
+                                               . "Mod%C3%A8le%3AHomonymie%20bateau%7CMod%C3%A8le%3AHomonymie%20d'%C3%A9tablissements%20scolaires%20ou"
+                                               . "%20universitaires%7CMod%C3%A8le%3AHomonymie%20d'%C3%AEles%7CMod%C3%A8le%3AHomonymie%20de%20clubs%20sportifs%7C"
+                                               . "Mod%C3%A8le%3AHomonymie%20de%20comt%C3%A9s%7CMod%C3%A8le%3AHomonymie%20de%20monument%7C"
+                                               . "Mod%C3%A8le%3AHomonymie%20de%20nom%20romain%7CMod%C3%A8le%3AHomonymie%20de%20parti%20politique%7C"
+                                               . "Mod%C3%A8le%3AHomonymie%20de%20route%7CMod%C3%A8le%3AHomonymie%20dynastique%7C"
+                                               . "Mod%C3%A8le%3AHomonymie%20vid%C3%A9oludique%7CMod%C3%A8le%3AHomonymie%20%C3%A9difice%20religieux%7C"
+                                               . "Mod%C3%A8le%3AInternationalisation%7CMod%C3%A8le%3AIsom%C3%A9rie%7CMod%C3%A8le%3AParonymie%7C"
+                                               . "Mod%C3%A8le%3APatronyme%7CMod%C3%A8le%3APatronyme%20basque%7CMod%C3%A8le%3APatronyme%20italien%7C"
+                                               . "Mod%C3%A8le%3APatronymie%7CMod%C3%A8le%3APersonnes%20homonymes%7CMod%C3%A8le%3ASaints%20homonymes%7C"
+                                               . "Mod%C3%A8le%3ATitres%20homonymes%7CMod%C3%A8le%3AToponymie%7CMod%C3%A8le%3AUnit%C3%A9s%20homonymes%7C"
+                                               . "Mod%C3%A8le%3AVilles%20homonymes%7CMod%C3%A8le%3A%C3%89difices%20religieux%20homonymes"
                                )
                        )
                );
        }
+
+       /**
+        * @dataProvider provideRomanNumeralsData
+        */
+       function testRomanNumerals( $num, $numerals ) {
+               $this->assertEquals(
+                       $numerals,
+                       Language::romanNumeral( $num ),
+                       "romanNumeral('$num')"
+               );
+       }
+
+       function provideRomanNumeralsData() {
+               return array(
+                       array( 1, 'I' ),
+                       array( 2, 'II' ),
+                       array( 3, 'III' ),
+                       array( 4, 'IV' ),
+                       array( 5, 'V' ),
+                       array( 6, 'VI' ),
+                       array( 7, 'VII' ),
+                       array( 8, 'VIII' ),
+                       array( 9, 'IX' ),
+                       array( 10, 'X' ),
+                       array( 20, 'XX' ),
+                       array( 30, 'XXX' ),
+                       array( 40, 'XL' ),
+                       array( 49, 'XLIX' ),
+                       array( 50, 'L' ),
+                       array( 60, 'LX' ),
+                       array( 70, 'LXX' ),
+                       array( 80, 'LXXX' ),
+                       array( 90, 'XC' ),
+                       array( 99, 'XCIX' ),
+                       array( 100, 'C' ),
+                       array( 200, 'CC' ),
+                       array( 300, 'CCC' ),
+                       array( 400, 'CD' ),
+                       array( 500, 'D' ),
+                       array( 600, 'DC' ),
+                       array( 700, 'DCC' ),
+                       array( 800, 'DCCC' ),
+                       array( 900, 'CM' ),
+                       array( 999, 'CMXCIX' ),
+                       array( 1000, 'M' ),
+                       array( 1989, 'MCMLXXXIX' ),
+                       array( 2000, 'MM' ),
+                       array( 3000, 'MMM' ),
+                       array( 4000, 'MMMM' ),
+                       array( 5000, 'MMMMM' ),
+                       array( 6000, 'MMMMMM' ),
+                       array( 7000, 'MMMMMMM' ),
+                       array( 8000, 'MMMMMMMM' ),
+                       array( 9000, 'MMMMMMMMM' ),
+                       array( 9999, 'MMMMMMMMMCMXCIX'),
+                       array( 10000, 'MMMMMMMMMM' ),
+               );
+       }
 }
+
diff --git a/tests/phpunit/languages/LanguageUzTest.php b/tests/phpunit/languages/LanguageUzTest.php
new file mode 100644 (file)
index 0000000..7238728
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+/**
+ * PHPUnit tests for the Uzbek language.
+ * The language can be represented using two scripts:
+ *  - Latin (uz-latn)
+ *  - Cyrillic (uz-cyrl)
+ *
+ * @author Robin Pepermans
+ * @author Antoine Musso <hashar at free dot fr>
+ * @copyright Copyright © 2012, Robin Pepermans
+ * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
+ * @file
+ */
+
+require_once dirname( __DIR__ ) . '/bootstrap.php';
+
+/** Tests for MediaWiki languages/LanguageUz.php */
+class LanguageUzTest extends MediaWikiTestCase {
+       /* Language object. Initialized before each test */
+       private $lang;
+
+       function setUp() {
+               $this->lang = Language::factory( 'uz' );
+       }
+       function tearDown() {
+               unset( $this->lang );
+       }
+
+       /**
+        * @author Nikola Smolenski
+        */
+       function testConversionToCyrillic() {
+               // A convertion of Latin to Cyrillic
+               $this->assertEquals( 'абвгғ',
+                       $this->convertToCyrillic( 'abvggʻ' )
+               );
+               // Same as above, but assert that -{}-s must be removed and not converted
+               $this->assertEquals( 'ljабnjвгўоdb',
+                       $this->convertToCyrillic( '-{lj}-ab-{nj}-vgoʻo-{db}-' )
+               );
+               // A simple convertion of Cyrillic to Cyrillic
+               $this->assertEquals( 'абвг',
+                       $this->convertToCyrillic( 'абвг' )
+               );
+               // Same as above, but assert that -{}-s must be removed and not converted
+               $this->assertEquals( 'ljабnjвгdaž',
+                       $this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{da}-ž' )
+               );
+       }
+
+       function testConversionToLatin() {
+               // A simple convertion of Latin to Latin
+               $this->assertEquals( 'abdef',
+                       $this->convertToLatin( 'abdef' )
+               );
+               // A convertion of Cyrillic to Latin
+               $this->assertEquals( 'gʻabtsdOʻQyo',
+                       $this->convertToLatin( 'ғабцдЎҚё' )
+               );
+       }
+
+       ##### HELPERS #####################################################
+       /**
+        * Wrapper to verify text stay the same after applying conversion
+        * @param $text string Text to convert
+        * @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
+        * @param $msg string Optional message
+        */
+       function assertUnConverted( $text, $variant, $msg = '' ) {
+               $this->assertEquals(
+                       $text,
+                       $this->convertTo( $text, $variant ),
+                       $msg
+               );
+       }
+       /**
+        * Wrapper to verify a text is different once converted to a variant.
+        * @param $text string Text to convert
+        * @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
+        * @param $msg string Optional message
+        */
+       function assertConverted( $text, $variant, $msg = '' ) {
+               $this->assertNotEquals(
+                       $text,
+                       $this->convertTo( $text, $variant ),
+                       $msg
+               );
+       }
+
+       /**
+        * Verifiy the given Cyrillic text is not converted when using
+        * using the cyrillic variant and converted to Latin when using
+        * the Latin variant.
+        */
+       function assertCyrillic( $text, $msg = '' ) {
+               $this->assertUnConverted( $text, 'uz-cyrl', $msg );
+               $this->assertConverted( $text, 'uz-latn', $msg );
+       }
+       /**
+        * Verifiy the given Latin text is not converted when using
+        * using the Latin variant and converted to Cyrillic when using
+        * the Cyrillic variant.
+        */
+       function assertLatin( $text, $msg = '' ) {
+               $this->assertUnConverted( $text, 'uz-latn', $msg );
+               $this->assertConverted( $text, 'uz-cyrl', $msg );
+       }
+
+
+       /** Wrapper for converter::convertTo() method*/
+       function convertTo( $text, $variant ) {
+               return $this->lang->mConverter->convertTo( $text, $variant );
+       }
+       function convertToCyrillic( $text ) {
+               return $this->convertTo( $text, 'uz-cyrl' );
+       }
+       function convertToLatin( $text ) {
+               return $this->convertTo( $text, 'uz-latn' );
+       }
+}
diff --git a/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php b/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
new file mode 100644 (file)
index 0000000..033164b
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+/**
+ * @author Niklas Laxström
+ * @file
+ */
+
+class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
+       /**
+        * @dataProvider validTestCases
+        */
+       function testValidRules( $expected, $rules, $number, $comment ) {
+               $result = CLDRPluralRuleEvaluator::evaluate( $number, (array) $rules );
+               $this->assertEquals( $expected, $result, $comment );
+       }
+
+       /**
+        * @dataProvider invalidTestCases
+        * @expectedException CLDRPluralRuleError
+        */
+       function testInvalidRules( $rules, $comment ) {
+               CLDRPluralRuleEvaluator::evaluate( 1, (array) $rules );
+       }
+
+       function validTestCases() {
+               $tests = array(
+                       # expected, number, rule, comment
+                       array( 0, 'n is 1', 1, 'integer number and is' ),
+                       array( 0, 'n is 1', "1", 'string integer number and is' ),
+                       array( 0, 'n is 1', 1.0, 'float number and is' ),
+                       array( 0, 'n is 1', "1.0", 'string float number and is' ),
+                       array( 1, 'n is 1', 1.1, 'float number and is' ),
+                       array( 1, 'n is 1', 2, 'float number and is' ),
+
+                       array( 0, 'n in 1,3,5',     3, '' ),
+                       array( 1, 'n not in 1,3,5', 5, '' ),
+
+                       array( 1, 'n in 1,3,5',     2, '' ),
+                       array( 0, 'n not in 1,3,5', 4, '' ),
+
+                       array( 0, 'n in 1..3',      2, '' ),
+                       array( 0, 'n in 1..3',      3, 'in is inclusive' ),
+                       array( 1, 'n in 1..3',      0, '' ),
+
+                       array( 1, 'n not in 1..3',      2, '' ),
+                       array( 1, 'n not in 1..3',      3, 'in is inclusive' ),
+                       array( 0, 'n not in 1..3',      0, '' ),
+
+                       array( 1, 'n is not 1 and n is not 2 and n is not 3', 1, 'and relation' ),
+                       array( 0, 'n is not 1 and n is not 2 and n is not 4', 3, 'and relation' ),
+
+                       array( 0, 'n is not 1 or n is 1', 1, 'or relation' ),
+                       array( 1, 'n is 1 or n is 2', 3, 'or relation' ),
+
+                       array( 0, 'n              is      1', 1, 'extra whitespace' ),
+
+                       array( 0, 'n mod 3 is 1', 7, 'mod' ),
+                       array( 0, 'n mod 3 is not 1', 4.3, 'mod with floats' ),
+
+                       array( 0, 'n within 1..3', 2, 'within with integer' ),
+                       array( 0, 'n within 1..3', 2.5, 'within with float' ),
+                       array( 0, 'n in 1..3', 2, 'in with integer' ),
+                       array( 1, 'n in 1..3', 2.5, 'in with float' ),
+
+                       array( 0, 'n in 3 or n is 4 and n is 5', 3, 'and binds more tightly than or' ),
+                       array( 1, 'n is 3 or n is 4 and n is 5', 4, 'and binds more tightly than or' ),
+
+                       array( 0, 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99', 24, 'breton rule' ),
+                       array( 1, 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99', 25, 'breton rule' ),
+
+                       array( 0, 'n within 0..2 and n is not 2', 0, 'french rule' ),
+                       array( 0, 'n within 0..2 and n is not 2', 1, 'french rule' ),
+                       array( 0, 'n within 0..2 and n is not 2', 1.2, 'french rule' ),
+                       array( 1, 'n within 0..2 and n is not 2', 2, 'french rule' ),
+
+                       array( 1, 'n in 3..10,13..19', 2, 'scottish rule - ranges with comma' ),
+                       array( 0, 'n in 3..10,13..19', 4, 'scottish rule - ranges with comma' ),
+                       array( 1, 'n in 3..10,13..19', 12.999, 'scottish rule - ranges with comma' ),
+                       array( 0, 'n in 3..10,13..19', 13, 'scottish rule - ranges with comma' ),
+
+                       array( 0, '5 mod 3 is n', 2, 'n as result of mod - no need to pass' ),
+               );
+
+               return $tests;
+       }
+
+       function invalidTestCases() {
+               $tests = array(
+                       array( 'n mod mod 5 is 1', 'mod mod' ),
+                       array( 'n', 'just n' ),
+                       array( 'n is in 5', 'is in' ),
+               );
+               return $tests;
+       }
+
+}
index e71e76c..d134438 100644 (file)
@@ -45,7 +45,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                                return array( $revision_id, $text_id );
                        }
                }
-               throw new MWException( "Could not determine revision id (" . $status->getXML() . ")" );
+               throw new MWException( "Could not determine revision id (" . $status->getWikiText() . ")" );
        }
 
 
@@ -303,7 +303,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                $this->skipWhitespace();
 
                $this->assertTextNode( "id", $id );
-               if( $parentid ) {
+               if ( $parentid !== false ) {
                        $this->assertTextNode( "parentid", $parentid );
                }
                $this->assertTextNode( "timestamp", false );
index 6ec802c..8ff8557 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-require_once dirname( __FILE__ ) . "/../../../maintenance/backupPrefetch.inc";
+require_once __DIR__ . "/../../../maintenance/backupPrefetch.inc";
 
 /**
  * Tests for BaseDump
@@ -209,7 +209,6 @@ class BaseDumpTest extends MediaWikiTestCase {
     <id>2</id>
     <revision>
       <id>2</id>
-      <parentid>5</parentid>
       <timestamp>2012-04-01T16:46:05Z</timestamp>
       <contributor>
         <ip>127.0.0.1</ip>
@@ -220,6 +219,7 @@ class BaseDumpTest extends MediaWikiTestCase {
     </revision>
     <revision>
       <id>5</id>
+      <parentid>2</parentid>
       <timestamp>2012-04-01T16:46:05Z</timestamp>
       <contributor>
         <ip>127.0.0.1</ip>
index 8b5928d..f669b26 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-require_once dirname( __FILE__ ) . "/../../../maintenance/backupTextPass.inc";
+require_once __DIR__ . "/../../../maintenance/backupTextPass.inc";
 
 /**
  * Tests for page dumps of BackupDumper
@@ -114,16 +114,16 @@ class TextPassDumperTest extends DumpTestCase {
                $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
                $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
                        $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
-                       "BackupDumperTestP2Text1", $this->revId2_2 );
+                       "BackupDumperTestP2Text1" );
                $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
                        $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
-                       "BackupDumperTestP2Text2", $this->revId2_3 );
+                       "BackupDumperTestP2Text2", $this->revId2_1 );
                $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
                        $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
-                       "BackupDumperTestP2Text3", $this->revId2_4 );
+                       "BackupDumperTestP2Text3", $this->revId2_2 );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
-                       "BackupDumperTestP2Text4 some additional Text" );
+                       "BackupDumperTestP2Text4 some additional Text", $this->revId2_3 );
                $this->assertPageEnd();
 
                // Page 3
@@ -180,18 +180,18 @@ class TextPassDumperTest extends DumpTestCase {
                $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
                $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
                        $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
-                       "BackupDumperTestP2Text1", $this->revId2_2 );
+                       "BackupDumperTestP2Text1" );
                $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
                        $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
-                       "BackupDumperTestP2Text2", $this->revId2_3 );
+                       "BackupDumperTestP2Text2", $this->revId2_1 );
                // Prefetch kicks in. This is still the SHA-1 of the original text,
                // But the actual text (with different SHA-1) comes from prefetch.
                $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
                        $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
-                       "Prefetch_________2Text3", $this->revId2_4 );
+                       "Prefetch_________2Text3", $this->revId2_2 );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
-                       "BackupDumperTestP2Text4 some additional Text" );
+                       "BackupDumperTestP2Text4 some additional Text", $this->revId2_3 );
                $this->assertPageEnd();
 
                // Page 3
@@ -332,17 +332,18 @@ class TextPassDumperTest extends DumpTestCase {
                                        "BackupDumperTestP2" );
                                $this->assertRevision( $this->revId2_1 + $i * self::$numOfRevs, "BackupDumperTestP2Summary1",
                                        $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
-                                       "BackupDumperTestP2Text1", $this->revId2_2 + $i * self::$numOfRevs );
+                                       "BackupDumperTestP2Text1" );
                                $this->assertRevision( $this->revId2_2 + $i * self::$numOfRevs, "BackupDumperTestP2Summary2",
                                        $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
-                                       "BackupDumperTestP2Text2", $this->revId2_3 + $i * self::$numOfRevs );
+                                       "BackupDumperTestP2Text2", $this->revId2_1 + $i * self::$numOfRevs );
                                $this->assertRevision( $this->revId2_3 + $i * self::$numOfRevs, "BackupDumperTestP2Summary3",
                                        $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
-                                       "BackupDumperTestP2Text3", $this->revId2_4 + $i * self::$numOfRevs );
+                                       "BackupDumperTestP2Text3", $this->revId2_2 + $i * self::$numOfRevs );
                                $this->assertRevision( $this->revId2_4 + $i * self::$numOfRevs,
                                        "BackupDumperTestP2Summary4 extra",
                                        $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
-                                       "BackupDumperTestP2Text4 some additional Text" );
+                                       "BackupDumperTestP2Text4 some additional Text",
+                                       $this->revId2_3 + $i * self::$numOfRevs );
                                $this->assertPageEnd();
 
                                $lookingForPage = 4;
@@ -419,10 +420,10 @@ class TextPassDumperTest extends DumpTestCase {
         *           file is generated that is automatically removed upon
         *           tearDown.
         * @param $iterations integer: (Optional) specifies how often the block
-        *           of 3 pages should go into the stub file. The page id
-        *           increase further and further, while the revision and text
-        *           ids of the first iteration are reused. The pages of
-        *           iteration > 1 have no corresponding representation in the
+        *           of 3 pages should go into the stub file. The page and
+        *           revision id increase further and further, while the text
+        *           id of the first iteration is reused. The pages and revision
+        *           of iteration > 1 have no corresponding representation in the
         *           database.
         * @return string absolute filename of the stub
         */
@@ -490,7 +491,6 @@ class TextPassDumperTest extends DumpTestCase {
     <id>' . ( $this->pageId2 + $i * self::$numOfPages ) . '</id>
     <revision>
       <id>' . ( $this->revId2_1 + $i * self::$numOfRevs ) . '</id>
-      <parentid>' . ( $this->revId2_2 + $i * self::$numOfRevs ) . '</parentid>
       <timestamp>2012-04-01T16:46:05Z</timestamp>
       <contributor>
         <ip>127.0.0.1</ip>
@@ -501,7 +501,7 @@ class TextPassDumperTest extends DumpTestCase {
     </revision>
     <revision>
       <id>' . ( $this->revId2_2 + $i * self::$numOfRevs ) . '</id>
-      <parentid>' . ( $this->revId2_3 + $i * self::$numOfRevs ) . '</parentid>
+      <parentid>' . ( $this->revId2_1 + $i * self::$numOfRevs ) . '</parentid>
       <timestamp>2012-04-01T16:46:05Z</timestamp>
       <contributor>
         <ip>127.0.0.1</ip>
@@ -512,7 +512,7 @@ class TextPassDumperTest extends DumpTestCase {
     </revision>
     <revision>
       <id>' . ( $this->revId2_3 + $i * self::$numOfRevs ) . '</id>
-      <parentid>' . ( $this->revId2_4 + $i * self::$numOfRevs ) . '</parentid>
+      <parentid>' . ( $this->revId2_2 + $i * self::$numOfRevs ) . '</parentid>
       <timestamp>2012-04-01T16:46:05Z</timestamp>
       <contributor>
         <ip>127.0.0.1</ip>
@@ -523,6 +523,7 @@ class TextPassDumperTest extends DumpTestCase {
     </revision>
     <revision>
       <id>' . ( $this->revId2_4 + $i * self::$numOfRevs ) . '</id>
+      <parentid>' . ( $this->revId2_3 + $i * self::$numOfRevs ) . '</parentid>
       <timestamp>2012-04-01T16:46:05Z</timestamp>
       <contributor>
         <ip>127.0.0.1</ip>
index f0689b6..e7ffa01 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-require_once dirname( __FILE__ ) . "/../../../maintenance/fetchText.php";
+require_once __DIR__ . "/../../../maintenance/fetchText.php";
 
 /**
  * Mock for the input/output of FetchText
index 8635614..0b7c758 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-require_once dirname( __FILE__ ) . "/../../../maintenance/getSlaveServer.php";
+require_once __DIR__ . "/../../../maintenance/getSlaveServer.php";
 
 /**
  * Tests for getSlaveServer
index 61a20f1..bcbf4ec 100755 (executable)
@@ -9,7 +9,7 @@
 /* Configuration */
 
 // Evaluate the include path relative to this file
-$IP = dirname( dirname( dirname( __FILE__ ) ) );
+$IP = dirname( dirname( __DIR__ ) );
 
 // Set a flag which can be used to detect when other scripts have been entered through this entry point or not
 define( 'MW_PHPUNIT_TEST', true );
@@ -34,6 +34,10 @@ class PHPUnitMaintClass extends Maintenance {
                global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
                global $wgLanguageConverterCacheType, $wgUseDatabaseMessages;
                global $wgLocaltimezone, $wgLocalisationCacheConf;
+               global $wgDevelopmentWarnings;
+
+               // wfWarn should cause tests to fail
+               $wgDevelopmentWarnings = true;
 
                $wgMainCacheType = CACHE_NONE;
                $wgMessageCacheType = CACHE_NONE;
index 6779ad4..f263811 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-require_once( dirname( dirname( __FILE__ ) ) . '/includes/upload/UploadFromUrlTest.php' );
+require_once( dirname( __DIR__ ) . '/includes/upload/UploadFromUrlTest.php' );
 
 class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
        public $savedGlobals = array();
index 9e1e9b2..59ae73c 100644 (file)
@@ -19,14 +19,18 @@ return array(
                        'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.textSelection.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
-                       'tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
                ),
                'dependencies' => array(
                        'jquery.autoEllipsis',
@@ -43,12 +47,16 @@ return array(
                        'jquery.tablesorter',
                        'jquery.textSelection',
                        'mediawiki',
+                       'mediawiki.api',
+                       'mediawiki.api.parse',
+                       'mediawiki.jqueryMsg',
                        'mediawiki.Title',
                        'mediawiki.Uri',
                        'mediawiki.user',
                        'mediawiki.util',
                        'mediawiki.special.recentchanges',
-                       'mediawiki.jqueryMsg',
+                       'mediawiki.language',
+                       'mediawiki.cldr',
                ),
                'position' => 'top',
        )
diff --git a/tests/qunit/data/load.mock.php b/tests/qunit/data/load.mock.php
new file mode 100644 (file)
index 0000000..1c18970
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Mock load.php with pre-defined test modules.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * 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
+ * @package MediaWiki
+ * @author Lupo
+ * @since 1.20
+ */
+header( 'Content-Type: text/javascript; charset=utf-8' );
+
+require_once '../../../includes/Xml.php';
+
+$moduleImplementations = array(
+       'testUsesMissing' => "
+mw.loader.implement( 'testUsesMissing', function () {
+       QUnit.ok( false, 'Module test.usesMissing script should not run.');
+       QUnit.start();
+}, {}, {});
+",
+
+       'testUsesNestedMissing' => "
+mw.loader.implement( 'testUsesNestedMissing', function () {
+       QUnit.ok( false, 'Module testUsesNestedMissing script should not run.');
+}, {}, {});
+",
+);
+
+$response = '';
+
+// Only support for non-encoded module names, full module names expected
+if ( isset( $_GET['modules'] ) ) {
+       $modules = explode( ',', $_GET['modules'] );
+       foreach ( $modules as $module ) {
+               if ( isset( $moduleImplementations[$module] ) ) {
+                       $response .= $moduleImplementations[$module];
+               } else {
+                       $response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ) );
+               }
+       }
+}
+
+echo $response;
index 2fb6e01..25c42d6 100644 (file)
@@ -1,2 +1,2 @@
-start();
-ok( true, 'Successfully loaded!');
+QUnit.start();
+QUnit.assert.ok( true, 'Successfully loaded!');
diff --git a/tests/qunit/data/testloader.php b/tests/qunit/data/testloader.php
deleted file mode 100644 (file)
index 7f4c48d..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-/**
- * ResourceLoader stub working with pre-defined test modules.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * 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
- * @package MediaWiki
- * @author Lupo
- * @since 1.20
- */
-header( 'Content-Type: text/javascript; charset=utf-8' );\r
-
-require_once "../../../includes/Xml.php";
-
-$modules = array (
-       'test.use_missing' => array (
-               'src' => 'mw.loader.implement("test.use_missing", function () {start(); ok(false, "Module test.use_missing should not run.");}, {}, {});',
-               'deps' => array ( 'test.missing' )
-       ),
-       'test.use_missing2' => array (
-               'src' => 'mw.loader.implement("test.use_missing2", function () {start(); ok(false, "Module test.use_missing2 should not run.");}, {}, {});',
-               'deps' => array ( 'test.missing2' )
-       )
-);
-
-// Copied from ResourceLoaderContext
-function expandModuleNames( $modules ) {\r
-       $retval = array();\r
-       // For backwards compatibility with an earlier hack, replace ! with .\r
-       $modules = str_replace( '!', '.', $modules );\r
-       $exploded = explode( '|', $modules );\r
-       foreach ( $exploded as $group ) {\r
-               if ( strpos( $group, ',' ) === false ) {\r
-                       // This is not a set of modules in foo.bar,baz notation\r
-                       // but a single module\r
-                       $retval[] = $group;\r
-               } else {\r
-                       // This is a set of modules in foo.bar,baz notation\r
-                       $pos = strrpos( $group, '.' );\r
-                       if ( $pos === false ) {\r
-                               // Prefixless modules, i.e. without dots\r
-                               $retval = explode( ',', $group );\r
-                       } else {\r
-                               // We have a prefix and a bunch of suffixes\r
-                               $prefix = substr( $group, 0, $pos ); // 'foo'\r
-                               $suffixes = explode( ',', substr( $group, $pos + 1 ) ); // array( 'bar', 'baz' )\r
-                               foreach ( $suffixes as $suffix ) {\r
-                                       $retval[] = "$prefix.$suffix";\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       return $retval;\r
-}
-
-function addModule ( $moduleName, &$gotten ) {
-       global $modules;
-
-       $result = "";
-       if ( isset( $gotten[$moduleName] ) ) {
-               return $result;
-       }
-       $gotten[$moduleName] = true;
-       if ( isset( $modules[$moduleName] ) ) {
-               $deps = $modules[$moduleName]['deps'];
-               foreach ( $deps as $depName ) {
-                       $result .= addModule( $depName, $gotten ) . "\n";
-               }
-               $result .= $modules[$moduleName]['src'] . "\n";
-       } else {
-               $result .= 'mw.loader.state( ' . Xml::encodeJsVar( $moduleName ) . ', "missing" );' . "\n";
-       }
-       return $result . "\n";
-}
-
-$result = "";
-
-if ( isset( $_GET['modules'] ) ) {
-       $toGet = expandModuleNames( $_GET['modules'] );
-       $gotten = array();
-       foreach ( $toGet as $moduleName ) {
-               $result .= addModule( $moduleName, $gotten );
-       }
-}
-
-echo $result;
index f3176ab..efa6549 100644 (file)
@@ -1,5 +1,7 @@
 ( function ( $, mw, QUnit, undefined ) {
-"use strict";
+/*global CompletenessTest */
+/*jshint evil:true */
+'use strict';
 
 var mwTestIgnore, mwTester, addons;
 
@@ -26,7 +28,11 @@ QUnit.fixurl = function ( value ) {
 QUnit.config.testTimeout = 10 * 1000;
 
 // Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
-QUnit.config.urlConfig.push( 'debug' );
+QUnit.config.urlConfig.push( {
+       id: 'debug',
+       label: 'Enable ResourceLoaderDebug',
+       tooltip: 'Enable debug mode in ResourceLoader'
+} );
 
 /**
  * Load TestSwarm agent
@@ -45,7 +51,11 @@ if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) )
  * CompletenessTest
  */
 // Adds toggle checkbox to header
-QUnit.config.urlConfig.push( 'completenesstest' );
+QUnit.config.urlConfig.push( {
+       id: 'completenesstest',
+       label: 'Run CompletenessTest',
+       tooltip: 'Run the completeness test'
+} );
 
 // Initiate when enabled
 if ( QUnit.urlParams.completenesstest ) {
@@ -130,7 +140,7 @@ QUnit.newMwEnvironment = ( function () {
                                mw.config.values = freshConfigCopy( localEnv.config );
                                mw.messages.values = freshMessagesCopy( localEnv.messages );
 
-                               localEnv.setup()
+                               localEnv.setup();
                        },
 
                        teardown: function () {
@@ -147,6 +157,24 @@ QUnit.newMwEnvironment = ( function () {
        };
 }() );
 
+// $.when stops as soon as one fails, which makes sense in most
+// practical scenarios, but not in a unit test where we really do
+// need to wait until all of them are finished.
+QUnit.whenPromisesComplete = function () {
+       var altPromises = [];
+
+       $.each( arguments, function ( i, arg ) {
+               var alt = $.Deferred();
+               altPromises.push( alt );
+
+               // Whether this one fails or not, forwards it to
+               // the 'done' (resolve) callback of the alternative promise.
+               arg.always( alt.resolve );
+       });
+
+       return $.when.apply( $, altPromises );
+};
+
 /**
  * Add-on assertion helpers
  */
@@ -155,12 +183,12 @@ addons = {
 
        // Expect boolean true
        assertTrue: function ( actual, message ) {
-               strictEqual( actual, true, message );
+               QUnit.push( actual === true, actual, true, message );
        },
 
        // Expect boolean false
        assertFalse: function ( actual, message ) {
-               strictEqual( actual, false, message );
+               QUnit.push( actual === false, actual, false, message );
        },
 
        // Expect numerical value less than X
@@ -181,22 +209,17 @@ addons = {
        // Expect numerical value greater than or equal to X
        gtOrEq: function ( actual, expected, message ) {
                QUnit.push( actual >= expected, actual, 'greater than or equal to ' + expected, message );
-       },
-
-       // Backwards compatible with new verions of QUnit
-       equals: window.equal,
-       same: window.deepEqual
+       }
 };
 
-$.extend( QUnit, addons );
-$.extend( window, addons );
+$.extend( QUnit.assert, addons );
 
 /**
  * Small test suite to confirm proper functionality of the utilities and
  * initializations in this file.
  */
 var envExecCount = 0;
-module( 'mediawiki.tests.qunit.testrunner', QUnit.newMwEnvironment({
+QUnit.module( 'mediawiki.tests.qunit.testrunner', QUnit.newMwEnvironment({
        setup: function () {
                envExecCount += 1;
                this.mwHtmlLive = mw.html;
@@ -217,33 +240,27 @@ module( 'mediawiki.tests.qunit.testrunner', QUnit.newMwEnvironment({
        }
 }) );
 
-test( 'Setup', function () {
-       expect( 3 );
-
-       equal( mw.html.escape( 'foo' ), 'mocked-1', 'extra setup() callback was ran.' );
-       equal( mw.config.get( 'testVar' ), 'foo', 'config object applied' );
-       equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object applied' );
+QUnit.test( 'Setup', 3, function ( assert ) {
+       assert.equal( mw.html.escape( 'foo' ), 'mocked-1', 'extra setup() callback was ran.' );
+       assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object applied' );
+       assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object applied' );
 
        mw.config.set( 'testVar', 'bar' );
        mw.messages.set( 'testMsg', 'Bar.' );
 });
 
-test( 'Teardown', function () {
-       expect( 3 );
-
-       equal( mw.html.escape( 'foo' ), 'mocked-2', 'extra setup() callback was re-ran.' );
-       equal( mw.config.get( 'testVar' ), 'foo', 'config object restored and re-applied after test()' );
-       equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
+QUnit.test( 'Teardown', 3, function ( assert ) {
+       assert.equal( mw.html.escape( 'foo' ), 'mocked-2', 'extra setup() callback was re-ran.' );
+       assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object restored and re-applied after test()' );
+       assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
 });
 
-module( 'mediawiki.tests.qunit.testrunner-after', QUnit.newMwEnvironment() );
-
-test( 'Teardown', function () {
-       expect( 3 );
+QUnit.module( 'mediawiki.tests.qunit.testrunner-after', QUnit.newMwEnvironment() );
 
-       equal( mw.html.escape( '<' ), '&lt;', 'extra teardown() callback was ran.' );
-       equal( mw.config.get( 'testVar' ), null, 'config object restored to live in next module()' );
-       equal( mw.messages.get( 'testMsg' ), null, 'messages object restored to live in next module()' );
+QUnit.test( 'Teardown', 3, function ( assert ) {
+       assert.equal( mw.html.escape( '<' ), '&lt;', 'extra teardown() callback was ran.' );
+       assert.equal( mw.config.get( 'testVar' ), null, 'config object restored to live in next module()' );
+       assert.equal( mw.messages.get( 'testMsg' ), null, 'messages object restored to live in next module()' );
 });
 
-})( jQuery, mediaWiki, QUnit );
+}( jQuery, mediaWiki, QUnit ) );
index 6e37138..0dee2ef 100644 (file)
@@ -1,9 +1,6 @@
-module( 'jquery.autoEllipsis', QUnit.newMwEnvironment() );
+( function ( mw, $ ) {
 
-test( '-- Initial check', function() {
-       expect(1);
-       ok( $.fn.autoEllipsis, 'jQuery.fn.autoEllipsis defined' );
-});
+QUnit.module( 'jquery.autoEllipsis', QUnit.newMwEnvironment() );
 
 function createWrappedDiv( text, width ) {
        var $wrapper = $( '<div>' ).css( 'width', width );
@@ -14,15 +11,13 @@ function createWrappedDiv( text, width ) {
 
 function findDivergenceIndex( a, b ) {
        var i = 0;
-       while ( i < a.length && i < b.length && a[i] == b[i] ) {
+       while ( i < a.length && i < b.length && a[i] === b[i] ) {
                i++;
        }
        return i;
 }
 
-test( 'Position right', function() {
-       expect(4);
-
+QUnit.test( 'Position right', 4, function ( assert ) {
        // We need this thing to be visible, so append it to the DOM
        var origText = 'This is a really long random string and there is no way it fits in 100 pixels.';
        var $wrapper = createWrappedDiv( origText, '100px' );
@@ -31,25 +26,27 @@ test( 'Position right', function() {
 
        // Verify that, and only one, span element was created
        var $span = $wrapper.find( '> span' );
-       strictEqual( $span.length, 1, 'autoEllipsis wrapped the contents in a span element' );
+       assert.strictEqual( $span.length, 1, 'autoEllipsis wrapped the contents in a span element' );
 
        // Check that the text fits by turning on word wrapping
        $span.css( 'whiteSpace', 'nowrap' );
-       ltOrEq( $span.width(), $span.parent().width(), "Text fits (making the span 'white-space:nowrap' does not make it wider than its parent)" );
+       assert.ltOrEq( $span.width(), $span.parent().width(), "Text fits (making the span 'white-space:nowrap' does not make it wider than its parent)" );
 
        // Add two characters using scary black magic
        var spanText = $span.text();
        var d = findDivergenceIndex( origText, spanText );
        var spanTextNew = spanText.substr( 0, d ) + origText[d] + origText[d] + '...';
 
-       gt( spanTextNew.length, spanText.length, 'Verify that the new span-length is indeed greater' );
+       assert.gt( spanTextNew.length, spanText.length, 'Verify that the new span-length is indeed greater' );
 
        // Put this text in the span and verify it doesn't fit
        $span.text( spanTextNew );
        // In IE6 width works like min-width, allow IE6's width to be "equal to"
        if ( $.browser.msie && Number( $.browser.version ) === 6 ) {
-               gtOrEq( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more) - IE6: Maybe equal to as well due to width behaving like min-width in IE6' );
+               assert.gtOrEq( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more) - IE6: Maybe equal to as well due to width behaving like min-width in IE6' );
        } else {
-               gt( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more)' );
+               assert.gt( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more)' );
        }
 });
+
+}( mediaWiki, jQuery ) );
index 15fac69..8d4ac03 100644 (file)
@@ -1,30 +1,21 @@
-module( 'jquery.byteLength', QUnit.newMwEnvironment() );
-
-test( '-- Initial check', function() {
-       expect(1);
-       ok( $.byteLength, 'jQuery.byteLength defined' );
-} );
-
-test( 'Simple text', function() {
-       expect(5);
+QUnit.module( 'jquery.byteLength', QUnit.newMwEnvironment() );
 
+QUnit.test( 'Simple text', 5, function ( assert ) {
        var     azLc = 'abcdefghijklmnopqrstuvwxyz',
                azUc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                num = '0123456789',
                x = '*',
                space = '   ';
 
-       equal( $.byteLength( azLc ), 26, 'Lowercase a-z' );
-       equal( $.byteLength( azUc ), 26, 'Uppercase A-Z' );
-       equal( $.byteLength( num ), 10, 'Numbers 0-9' );
-       equal( $.byteLength( x ), 1, 'An asterisk' );
-       equal( $.byteLength( space ), 3, '3 spaces' );
+       assert.equal( $.byteLength( azLc ), 26, 'Lowercase a-z' );
+       assert.equal( $.byteLength( azUc ), 26, 'Uppercase A-Z' );
+       assert.equal( $.byteLength( num ), 10, 'Numbers 0-9' );
+       assert.equal( $.byteLength( x ), 1, 'An asterisk' );
+       assert.equal( $.byteLength( space ), 3, '3 spaces' );
 
 } );
 
-test( 'Special text', window.foo = function() {
-       expect(5);
-
+QUnit.test( 'Special text', 5, function ( assert ) {
        // http://en.wikipedia.org/wiki/UTF-8
        var     U_0024 = '\u0024',
                U_00A2 = '\u00A2',
@@ -34,9 +25,9 @@ test( 'Special text', window.foo = function() {
                // according to http://www.fileformat.info/info/unicode/char/24B62/index.htm
                U_024B62_alt = '\uD852\uDF62';
 
-       strictEqual( $.byteLength( U_0024 ), 1, 'U+0024: 1 byte. \u0024 (dollar sign)' );
-       strictEqual( $.byteLength( U_00A2 ), 2, 'U+00A2: 2 bytes. \u00A2 (cent sign)' );
-       strictEqual( $.byteLength( U_20AC ), 3, 'U+20AC: 3 bytes. \u20AC (euro sign)' );
-       strictEqual( $.byteLength( U_024B62 ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character)' );
-       strictEqual( $.byteLength( U_024B62_alt ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character) - alternative method' );
+       assert.strictEqual( $.byteLength( U_0024 ), 1, 'U+0024: 1 byte. \u0024 (dollar sign)' );
+       assert.strictEqual( $.byteLength( U_00A2 ), 2, 'U+00A2: 2 bytes. \u00A2 (cent sign)' );
+       assert.strictEqual( $.byteLength( U_20AC ), 3, 'U+20AC: 3 bytes. \u20AC (euro sign)' );
+       assert.strictEqual( $.byteLength( U_024B62 ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character)' );
+       assert.strictEqual( $.byteLength( U_024B62_alt ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character) - alternative method' );
 } );
index 21effdb..23a93a7 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        var simpleSample, U_20AC, mbSample;
 
-       module( 'jquery.byteLimit', QUnit.newMwEnvironment() );
+       QUnit.module( 'jquery.byteLimit', QUnit.newMwEnvironment() );
 
        // Simple sample (20 chars, 20 bytes)
        simpleSample = '12345678901234567890';
@@ -54,7 +54,7 @@
                        limit: null
                }, options);
 
-               test( opt.description, function () {
+               QUnit.test( opt.description, function ( assert ) {
                        var rawVal, fn, newVal;
 
                        opt.$input.appendTo( '#qunit-fixture' );
                        newVal = $.isFunction( fn ) ? fn( rawVal ) : rawVal;
 
                        if ( opt.hasLimit ) {
-                               expect(3);
+                               QUnit.expect(3);
 
-                               QUnit.ltOrEq(
+                               assert.ltOrEq(
                                        $.byteLength( newVal ),
                                        opt.limit,
                                        'Prevent keypresses after byteLimit was reached, length never exceeded the limit'
                                );
-                               equal(
+                               assert.equal(
                                        $.byteLength( rawVal ),
                                        $.byteLength( opt.expected ),
                                        'Not preventing keypresses too early, length has reached the expected length'
                                );
-                               equal( rawVal, opt.expected, 'New value matches the expected string' );
+                               assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
 
                        } else {
-                               expect(2);
-                               equal( newVal, opt.expected, 'New value matches the expected string' );
-                               equal(
+                               QUnit.expect(2);
+                               assert.equal( newVal, opt.expected, 'New value matches the expected string' );
+                               assert.equal(
                                        $.byteLength( newVal ),
                                        $.byteLength( opt.expected ),
                                        'Unlimited scenarios are not affected, expected length reached'
                } );
        }
 
-       test( '-- Initial check', function () {
-               expect(1);
-               ok( $.fn.byteLimit, 'jQuery.fn.byteLimit defined' );
-       } );
-
        byteLimitTest({
                description: 'Plain text input',
                $input: $( '<input>' )
                expected: simpleSample
        });
 
+       byteLimitTest({
+               description: 'Plain text input. Calling byteLimit with no parameters and no maxLength property (bug 36310)',
+               $input: $( '<input>' )
+                       .attr( 'type', 'text' )
+                       .byteLimit(),
+               sample: simpleSample,
+               hasLimit: false,
+               expected: simpleSample
+       });
+
        byteLimitTest({
                description: 'Limit using the maxlength attribute',
                $input: $( '<input>' )
                expected: 'User:Sample'
        });
 
-       test( 'Confirm properties and attributes set', function () {
+       QUnit.test( 'Confirm properties and attributes set', 5, function ( assert ) {
                var $el, $elA, $elB;
 
-               expect(5);
-
                $el = $( '<input>' )
                        .attr( 'type', 'text' )
                        .prop( 'maxLength', '7' )
                        .appendTo( '#qunit-fixture' )
                        .byteLimit();
 
-               strictEqual( $el.prop( 'maxLength' ), 7, 'Pre-set maxLength property unchanged' );
+               assert.strictEqual( $el.prop( 'maxLength' ), 7, 'Pre-set maxLength property unchanged' );
 
                $el = $( '<input>' )
                        .attr( 'type', 'text' )
                        .appendTo( '#qunit-fixture' )
                        .byteLimit( 12 );
 
-               strictEqual( $el.prop( 'maxLength' ), 12, 'maxLength property updated if value was passed to $.fn.byteLimit' );
+               assert.strictEqual( $el.prop( 'maxLength' ), 12, 'maxLength property updated if value was passed to $.fn.byteLimit' );
 
                $elA = $( '<input>' )
                        .addClass( 'mw-test-byteLimit-foo' )
 
                $el = $( '.mw-test-byteLimit-foo' );
 
-               strictEqual( $el.length, 2, 'Verify that there are no other elements clashing with this test suite' );
+               assert.strictEqual( $el.length, 2, 'Verify that there are no other elements clashing with this test suite' );
 
                $el.byteLimit();
 
                // because $.fn.byteLimit sets:
                // `limit = limitArg || this.prop( 'maxLength' ); this.prop( 'maxLength', limit )`
                // and did so outside the each() loop.
-               strictEqual( $elA.prop( 'maxLength' ), 7, 'maxLength was not incorrectly set on #1 when calling byteLimit on multiple elements (bug 35294)' );
-               strictEqual( $elB.prop( 'maxLength' ), 12, 'maxLength was not incorrectly set on #2 when calling byteLimit on multiple elements (bug 35294)' );
+               assert.strictEqual( $elA.prop( 'maxLength' ), 7, 'maxLength was not incorrectly set on #1 when calling byteLimit on multiple elements (bug 35294)' );
+               assert.strictEqual( $elB.prop( 'maxLength' ), 12, 'maxLength was not incorrectly set on #2 when calling byteLimit on multiple elements (bug 35294)' );
        });
 
 }( jQuery ) );
index 2c0b8e3..bf62b39 100644 (file)
@@ -1,14 +1,9 @@
-module( 'jquery.client', QUnit.newMwEnvironment() );
-
-test( '-- Initial check', function() {
-       expect(1);
-       ok( jQuery.client, 'jQuery.client defined' );
-});
+QUnit.module( 'jquery.client', QUnit.newMwEnvironment() );
 
 /** Number of user-agent defined */
 var uacount = 0;
 
-var uas = (function() {
+var uas = (function () {
 
        // Object keyed by userAgent. Value is an array (human-readable name, client-profile object, navigator.platform value)
        // Info based on results from http://toolserver.org/~krinkle/testswarm/job/174/
@@ -225,40 +220,39 @@ var uas = (function() {
                        }
                }
        };
-       $.each( uas, function() { uacount++ });
+       $.each( uas, function () {
+               uacount++;
+       });
        return uas;
-})();
-
-test( 'profile userAgent support', function() {
-       expect(uacount);
+}());
 
+QUnit.test( 'profile userAgent support', uacount, function ( assert ) {
        // Generate a client profile object and compare recursively
        var uaTest = function( rawUserAgent, data ) {
                var ret = $.client.profile( {
                        userAgent: rawUserAgent,
                        platform: data.platform
                } );
-               deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
+               assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
        };
 
        // Loop through and run tests
        $.each( uas, uaTest );
 } );
 
-test( 'profile return validation for current user agent', function() {
-       expect(7);
+QUnit.test( 'profile return validation for current user agent', 7, function ( assert ) {
        var p = $.client.profile();
-       var unknownOrType = function( val, type, summary ) {
-               return ok( typeof val === type || val === 'unknown', summary );
-       };
+       function unknownOrType( val, type, summary ) {
+               assert.ok( typeof val === type || val === 'unknown', summary );
+       }
 
-       equal( typeof p, 'object', 'profile returns an object' );
+       assert.equal( typeof p, 'object', 'profile returns an object' );
        unknownOrType( p.layout, 'string', 'p.layout is a string (or "unknown")' );
        unknownOrType( p.layoutVersion, 'number', 'p.layoutVersion is a number (or "unknown")' );
        unknownOrType( p.platform, 'string', 'p.platform is a string (or "unknown")' );
        unknownOrType( p.version, 'string', 'p.version is a string (or "unknown")' );
        unknownOrType( p.versionBase, 'string', 'p.versionBase is a string (or "unknown")' );
-       equal( typeof p.versionNumber, 'number', 'p.versionNumber is a number' );
+       assert.equal( typeof p.versionNumber, 'number', 'p.versionNumber is a number' );
 });
 
 // Example from WikiEditor
@@ -289,20 +283,16 @@ var testMap = {
        }
 };
 
-test( 'test', function() {
-       expect(1);
-
+QUnit.test( 'test', 1, function ( assert ) {
        // .test() uses eval, make sure no exceptions are thrown
        // then do a basic return value type check
        var testMatch = $.client.test( testMap );
 
-       equal( typeof testMatch, 'boolean', 'test returns a boolean value' );
+       assert.equal( typeof testMatch, 'boolean', 'test returns a boolean value' );
 
 });
 
-test( 'User-agent matches against WikiEditor\'s compatibility map', function() {
-       expect( uacount * 2 ); // double since we test both LTR and RTL
-
+QUnit.test( 'User-agent matches against WikiEditor\'s compatibility map', uacount * 2, function ( assert ) {
        var     $body = $( 'body' ),
                bodyClasses = $body.attr( 'class' );
 
@@ -317,7 +307,7 @@ test( 'User-agent matches against WikiEditor\'s compatibility map', function() {
                        var testMatch = $.client.test( testMap, profile );
                        $body.removeClass( dir );
 
-                       equal( testMatch, data.wikiEditor[dir], 'testing comparison based on ' + dir + ', ' + agent );
+                       assert.equal( testMatch, data.wikiEditor[dir], 'testing comparison based on ' + dir + ', ' + agent );
                });
        });
 
index 655ee56..7b37f5a 100644 (file)
@@ -1,40 +1,31 @@
-module( 'jquery.colorUtil', QUnit.newMwEnvironment() );
-
-test( '-- Initial check', function() {
-       expect(1);
-       ok( $.colorUtil, '$.colorUtil defined' );
-});
-
-test( 'getRGB', function() {
-       expect(18);
-
-       strictEqual( $.colorUtil.getRGB(), undefined, 'No arguments' );
-       strictEqual( $.colorUtil.getRGB( '' ), undefined, 'Empty string' );
-       deepEqual( $.colorUtil.getRGB( [0, 100, 255] ), [0, 100, 255], 'Parse array of rgb values' );
-       deepEqual( $.colorUtil.getRGB( 'rgb(0,100,255)' ), [0, 100, 255], 'Parse simple rgb string' );
-       deepEqual( $.colorUtil.getRGB( 'rgb(0, 100, 255)' ), [0, 100, 255], 'Parse simple rgb string with spaces' );
-       deepEqual( $.colorUtil.getRGB( 'rgb(0%,20%,40%)' ), [0, 51, 102], 'Parse rgb string with percentages' );
-       deepEqual( $.colorUtil.getRGB( 'rgb(0%, 20%, 40%)' ), [0, 51, 102], 'Parse rgb string with percentages and spaces' );
-       deepEqual( $.colorUtil.getRGB( '#f2ddee' ), [242, 221, 238], 'Hex string: 6 char lowercase' );
-       deepEqual( $.colorUtil.getRGB( '#f2DDEE' ), [242, 221, 238], 'Hex string: 6 char uppercase' );
-       deepEqual( $.colorUtil.getRGB( '#f2DdEe' ), [242, 221, 238], 'Hex string: 6 char mixed' );
-       deepEqual( $.colorUtil.getRGB( '#eee' ), [238, 238, 238], 'Hex string: 3 char lowercase' );
-       deepEqual( $.colorUtil.getRGB( '#EEE' ), [238, 238, 238], 'Hex string: 3 char uppercase' );
-       deepEqual( $.colorUtil.getRGB( '#eEe' ), [238, 238, 238], 'Hex string: 3 char mixed' );
-       deepEqual( $.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [255, 255, 255], 'Zero rgba for Safari 3; Transparent (whitespace)' );
+QUnit.module( 'jquery.colorUtil', QUnit.newMwEnvironment() );
+
+QUnit.test( 'getRGB', 18, function ( assert ) {
+       assert.strictEqual( $.colorUtil.getRGB(), undefined, 'No arguments' );
+       assert.strictEqual( $.colorUtil.getRGB( '' ), undefined, 'Empty string' );
+       assert.deepEqual( $.colorUtil.getRGB( [0, 100, 255] ), [0, 100, 255], 'Parse array of rgb values' );
+       assert.deepEqual( $.colorUtil.getRGB( 'rgb(0,100,255)' ), [0, 100, 255], 'Parse simple rgb string' );
+       assert.deepEqual( $.colorUtil.getRGB( 'rgb(0, 100, 255)' ), [0, 100, 255], 'Parse simple rgb string with spaces' );
+       assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%,20%,40%)' ), [0, 51, 102], 'Parse rgb string with percentages' );
+       assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%, 20%, 40%)' ), [0, 51, 102], 'Parse rgb string with percentages and spaces' );
+       assert.deepEqual( $.colorUtil.getRGB( '#f2ddee' ), [242, 221, 238], 'Hex string: 6 char lowercase' );
+       assert.deepEqual( $.colorUtil.getRGB( '#f2DDEE' ), [242, 221, 238], 'Hex string: 6 char uppercase' );
+       assert.deepEqual( $.colorUtil.getRGB( '#f2DdEe' ), [242, 221, 238], 'Hex string: 6 char mixed' );
+       assert.deepEqual( $.colorUtil.getRGB( '#eee' ), [238, 238, 238], 'Hex string: 3 char lowercase' );
+       assert.deepEqual( $.colorUtil.getRGB( '#EEE' ), [238, 238, 238], 'Hex string: 3 char uppercase' );
+       assert.deepEqual( $.colorUtil.getRGB( '#eEe' ), [238, 238, 238], 'Hex string: 3 char mixed' );
+       assert.deepEqual( $.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [255, 255, 255], 'Zero rgba for Safari 3; Transparent (whitespace)' );
 
        // Perhaps this is a bug in colorUtil, but it is the current behaviour so, let's keep
        // track of it, so we will know in case it would ever change.
-       strictEqual( $.colorUtil.getRGB( 'rgba(0,0,0,0)' ), undefined, 'Zero rgba without whitespace' );
+       assert.strictEqual( $.colorUtil.getRGB( 'rgba(0,0,0,0)' ), undefined, 'Zero rgba without whitespace' );
 
-       deepEqual( $.colorUtil.getRGB( 'lightGreen' ), [144, 238, 144], 'Color names (lightGreen)' );
-       deepEqual( $.colorUtil.getRGB( 'transparent' ), [255, 255, 255], 'Color names (transparent)' );
-       strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
+       assert.deepEqual( $.colorUtil.getRGB( 'lightGreen' ), [144, 238, 144], 'Color names (lightGreen)' );
+       assert.deepEqual( $.colorUtil.getRGB( 'transparent' ), [255, 255, 255], 'Color names (transparent)' );
+       assert.strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
 });
 
-test( 'rgbToHsl', function() {
-       expect(1);
-
+QUnit.test( 'rgbToHsl', 1, function ( assert ) {
        var hsl = $.colorUtil.rgbToHsl( 144, 238, 144 );
 
        // Cross-browser differences in decimals...
@@ -45,27 +36,23 @@ test( 'rgbToHsl', function() {
        // Re-create the rgbToHsl return array items, limited to two decimals.
        var ret = [dualDecimals(hsl[0]), dualDecimals(hsl[1]), dualDecimals(hsl[2])];
 
-       deepEqual( ret, [0.33, 0.73, 0.75], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
+       assert.deepEqual( ret, [0.33, 0.73, 0.75], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
 });
 
-test( 'hslToRgb', function() {
-       expect(1);
-
+QUnit.test( 'hslToRgb', 1, function ( assert ) {
        var rgb = $.colorUtil.hslToRgb( 0.3, 0.7, 0.8 );
 
        // Cross-browser differences in decimals...
        // Re-create the hslToRgb return array items, rounded to whole numbers.
        var ret = [Math.round(rgb[0]), Math.round(rgb[1]), Math.round(rgb[2])];
 
-       deepEqual( ret ,[183, 240, 168], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
+       assert.deepEqual( ret ,[183, 240, 168], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
 });
 
-test( 'getColorBrightness', function() {
-       expect(2);
-
+QUnit.test( 'getColorBrightness', 2, function ( assert ) {
        var a = $.colorUtil.getColorBrightness( 'red', +0.1 );
-       equal( a, 'rgb(255,50,50)', 'Start with named color "red", brighten 10%' );
+       assert.equal( a, 'rgb(255,50,50)', 'Start with named color "red", brighten 10%' );
 
        var b = $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
-       equal( b, 'rgb(118,29,29)', 'Start with rgb string "rgb(200,50,50)", darken 20%' );
+       assert.equal( b, 'rgb(118,29,29)', 'Start with rgb string "rgb(200,50,50)", darken 20%' );
 });
index 6489a1f..a307983 100644 (file)
@@ -1,41 +1,35 @@
-test('jquery.delayedBind with data option', function() {
+QUnit.asyncTest('jquery.delayedBind with data option', 2, function ( assert ) {
        var $fixture = $('<div>').appendTo('#qunit-fixture'),
                data = { magic: "beeswax" },
                delay = 50;
 
-       $fixture.delayedBind(delay, 'testevent', data, function(event) {
-               start(); // continue!
-               ok(true, 'testevent fired');
-               ok(event.data === data, 'data is passed through delayedBind');
+       $fixture.delayedBind(delay, 'testevent', data, function ( e ) {
+               QUnit.start(); // continue!
+               assert.ok( true, 'testevent fired');
+               assert.ok( e.data === data, 'data is passed through delayedBind');
        });
 
-       expect(2);
-       stop(); // async!
-
        // We'll trigger it thrice, but it should only happen once.
-       $fixture.trigger('testevent', {});
-       $fixture.trigger('testevent', {});
-       $fixture.trigger('testevent', {});
-       $fixture.trigger('testevent', {});
+       $fixture.trigger( 'testevent', {} );
+       $fixture.trigger( 'testevent', {} );
+       $fixture.trigger( 'testevent', {} );
+       $fixture.trigger( 'testevent', {} );
 });
 
-test('jquery.delayedBind without data option', function() {
+QUnit.asyncTest('jquery.delayedBind without data option', 1, function ( assert ) {
        var $fixture = $('<div>').appendTo('#qunit-fixture'),
                data = { magic: "beeswax" },
                delay = 50;
 
-       $fixture.delayedBind(delay, 'testevent', function(event) {
-               start(); // continue!
-               ok(true, 'testevent fired');
+       $fixture.delayedBind(delay, 'testevent', function ( e ) {
+               QUnit.start(); // continue!
+               assert.ok(true, 'testevent fired');
        });
 
-       expect(1);
-       stop(); // async!
-
        // We'll trigger it thrice, but it should only happen once.
-       $fixture.trigger('testevent', {});
-       $fixture.trigger('testevent', {});
-       $fixture.trigger('testevent', {});
-       $fixture.trigger('testevent', {});
+       $fixture.trigger( 'testevent', {} );
+       $fixture.trigger( 'testevent', {} );
+       $fixture.trigger( 'testevent', {} );
+       $fixture.trigger( 'testevent', {} );
 });
 
index 9377a2f..6eef1ab 100644 (file)
@@ -1,17 +1,11 @@
-module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
+QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
 
-test( '-- Initial check', function() {
-       expect(1);
-       ok( $.fn.getAttrs, 'jQuery.fn.getAttrs defined' );
-} );
-
-test( 'Check', function() {
-       expect(1);
+QUnit.test( 'Check', 1, function ( assert ) {
        var     attrs = {
                        foo: 'bar',
                        'class': 'lorem'
                },
-               $el = $( '<div>', attrs );
+               $el = jQuery( '<div>', attrs );
 
-       deepEqual( $el.getAttrs(), attrs, 'getAttrs() return object should match the attributes set, no more, no less' );
+       assert.deepEqual( $el.getAttrs(), attrs, 'getAttrs() return object should match the attributes set, no more, no less' );
 } );
index 4750d2b..a94dca3 100644 (file)
@@ -1,12 +1,7 @@
-module( 'jquery.highlightText', QUnit.newMwEnvironment() );
+QUnit.module( 'jquery.highlightText', QUnit.newMwEnvironment() );
 
-test( '-- Initial check', function() {
-       expect(1);
-       ok( $.fn.highlightText, 'jQuery.fn.highlightText defined' );
-} );
-
-test( 'Check', function() {
-       var cases = [
+QUnit.test( 'Check', function ( assert ) {
+       var $fixture, cases = [
                {
                        desc: 'Test 001',
                        text: 'Blue Öyster Cult',
@@ -224,16 +219,14 @@ test( 'Check', function() {
                        expected: '<span class="highlight">بو</span>ل إيردوس'
                }
        ];
-       expect(cases.length);
-       var $fixture;
+       QUnit.expect( cases.length );
 
-       $.each(cases, function( i, item ) {
-               $fixture = $( '<p></p>' ).text( item.text );
-               $fixture.highlightText( item.highlight );
-               equals(
+       $.each( cases, function ( i, item ) {
+               $fixture = $( '<p>' ).text( item.text ).highlightText( item.highlight );
+               assert.equal(
                        $fixture.html(),
-                       $('<p>' + item.expected + '</p>').html(), // re-parse to normalize!
+                       $( '<p>' ).html( item.expected ).html(), // re-parse to normalize!
                        item.desc || undefined
-                       );
+               );
        } );
 } );
index cd82863..c8e1d9f 100644 (file)
@@ -1,13 +1,6 @@
-module( 'jquery.localize', QUnit.newMwEnvironment() );
-
-test( '-- Initial check', function() {
-       expect(1);
-       ok( $.fn.localize, 'jQuery.fn.localize defined' );
-} );
-
-test( 'Handle basic replacements', function() {
-       expect(3);
+QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
 
+QUnit.test( 'Handle basic replacements', 4, function ( assert ) {
        var html, $lc;
        mw.messages.set( 'basic', 'Basic stuff' );
 
@@ -15,24 +8,28 @@ test( 'Handle basic replacements', function() {
        html = '<div><span><html:msg key="basic" /></span></div>';
        $lc = $( html ).localize().find( 'span' );
 
-       strictEqual( $lc.text(), 'Basic stuff', 'Tag: html:msg' );
+       assert.strictEqual( $lc.text(), 'Basic stuff', 'Tag: html:msg' );
 
        // Attribute: title-msg
-       html = '<div><span title-msg="basic" /></span></div>';
+       html = '<div><span title-msg="basic"></span></div>';
        $lc = $( html ).localize().find( 'span' );
 
-       strictEqual( $lc.attr( 'title' ), 'Basic stuff', 'Attribute: title-msg' );
+       assert.strictEqual( $lc.attr( 'title' ), 'Basic stuff', 'Attribute: title-msg' );
 
        // Attribute: alt-msg
-       html = '<div><span alt-msg="basic" /></span></div>';
+       html = '<div><span alt-msg="basic"></span></div>';
        $lc = $( html ).localize().find( 'span' );
 
-       strictEqual( $lc.attr( 'alt' ), 'Basic stuff', 'Attribute: alt-msg' );
-} );
+       assert.strictEqual( $lc.attr( 'alt' ), 'Basic stuff', 'Attribute: alt-msg' );
 
-test( 'Proper escaping', function() {
-       expect(2);
+       // Attribute: placeholder-msg
+       html = '<div><input placeholder-msg="basic" /></div>';
+       $lc = $( html ).localize().find( 'input' );
 
+       assert.strictEqual( $lc.attr( 'placeholder' ), 'Basic stuff', 'Attribute: placeholder-msg' );
+} );
+
+QUnit.test( 'Proper escaping', 2, function ( assert ) {
        var html, $lc;
        mw.messages.set( 'properfoo', '<proper esc="test">' );
 
@@ -40,21 +37,19 @@ test( 'Proper escaping', function() {
        // making sure it is actually using text() and attr() (or something with the same effect)
 
        // Text escaping
-       html = '<div><span><html:msg key="properfoo" /></span></div>';
+       html = '<div><span><html:msg key="properfoo"></span></div>';
        $lc = $( html ).localize().find( 'span' );
 
-       strictEqual( $lc.text(), mw.msg( 'properfoo' ), 'Content is inserted as text, not as html.' );
+       assert.strictEqual( $lc.text(), mw.msg( 'properfoo' ), 'Content is inserted as text, not as html.' );
 
        // Attribute escaping
-       html = '<div><span title-msg="properfoo" /></span></div>';
+       html = '<div><span title-msg="properfoo"></span></div>';
        $lc = $( html ).localize().find( 'span' );
 
-       strictEqual( $lc.attr( 'title' ), mw.msg( 'properfoo' ), 'Attributes are not inserted raw.' );
+       assert.strictEqual( $lc.attr( 'title' ), mw.msg( 'properfoo' ), 'Attributes are not inserted raw.' );
 } );
 
-test( 'Options', function() {
-       expect(7);
-
+QUnit.test( 'Options', 7, function ( assert ) {
        mw.messages.set( {
                'foo-lorem': 'Lorem',
                'foo-ipsum': 'Ipsum',
@@ -67,17 +62,17 @@ test( 'Options', function() {
        var html, $lc, attrs, x, sitename = 'Wikipedia';
 
        // Message key prefix
-       html = '<div><span title-msg="lorem"><html:msg key="ipsum" /></span></div>';
+       html = '<div><span title-msg="lorem"><html:msg key="ipsum"></span></div>';
        $lc = $( html ).localize( {
                prefix: 'foo-'
        } ).find( 'span' );
 
-       strictEqual( $lc.attr( 'title' ), 'Lorem', 'Message key prefix - attr' );
-       strictEqual( $lc.text(), 'Ipsum', 'Message key prefix - text' );
+       assert.strictEqual( $lc.attr( 'title' ), 'Lorem', 'Message key prefix - attr' );
+       assert.strictEqual( $lc.text(), 'Ipsum', 'Message key prefix - text' );
 
        // Variable keys mapping
        x = 'bar';
-       html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
+       html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
        $lc = $( html ).localize( {
                keys: {
                        'title': 'foo-' + x + '-title',
@@ -85,22 +80,22 @@ test( 'Options', function() {
                }
        } ).find( 'span' );
 
-       strictEqual( $lc.attr( 'title' ), 'Read more about bars', 'Variable keys mapping - attr' );
-       strictEqual( $lc.text(), 'The Bars', 'Variable keys mapping - text' );
+       assert.strictEqual( $lc.attr( 'title' ), 'Read more about bars', 'Variable keys mapping - attr' );
+       assert.strictEqual( $lc.text(), 'The Bars', 'Variable keys mapping - text' );
 
        // Passing parameteters to mw.msg
-       html = '<div><span><html:msg key="foo-welcome" /></span></div>';
+       html = '<div><span><html:msg key="foo-welcome"></span></div>';
        $lc = $( html ).localize( {
                params: {
                        'foo-welcome': [sitename, 'yesterday']
                }
        } ).find( 'span' );
 
-       strictEqual( $lc.text(), 'Welcome to Wikipedia! (last visit: yesterday)', 'Passing parameteters to mw.msg' );
+       assert.strictEqual( $lc.text(), 'Welcome to Wikipedia! (last visit: yesterday)', 'Passing parameteters to mw.msg' );
 
        // Combination of options prefix, params and keys
        x = 'bazz';
-       html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
+       html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
        $lc = $( html ).localize( {
                prefix: 'foo-',
                keys: {
@@ -114,6 +109,25 @@ test( 'Options', function() {
                }
        } ).find( 'span' );
 
-       strictEqual( $lc.text(), 'The Bazz (Wikipedia)', 'Combination of options prefix, params and keys - text' );
-       strictEqual( $lc.attr( 'title' ), 'Read more about bazz at Wikipedia (last modified: 3 minutes ago)', 'Combination of options prefix, params and keys - attr' );
+       assert.strictEqual( $lc.text(), 'The Bazz (Wikipedia)', 'Combination of options prefix, params and keys - text' );
+       assert.strictEqual( $lc.attr( 'title' ), 'Read more about bazz at Wikipedia (last modified: 3 minutes ago)', 'Combination of options prefix, params and keys - attr' );
+} );
+
+QUnit.test( 'Handle data text', 2, function ( assert ) {
+       var html, $lc;
+       mw.messages.set( 'option-one', 'Item 1' );
+       mw.messages.set( 'option-two', 'Item 2' );
+       html = '<select><option data-msg-text="option-one"></option><option data-msg-text="option-two"></option></select>';
+       $lc = $( html ).localize().find( 'option' );
+       assert.strictEqual( $lc.eq( 0 ).text(), mw.msg( 'option-one' ), 'data-msg-text becomes text of options' );
+       assert.strictEqual( $lc.eq( 1 ).text(), mw.msg( 'option-two' ), 'data-msg-text becomes text of options' );
+} );
+
+QUnit.test( 'Handle data html', 2, function ( assert ) {
+       var html, $lc;
+       mw.messages.set( 'html', 'behold... there is a <a>link</a> here!!' );
+       html = '<div><div data-msg-html="html"></div></div>';
+       $lc = $( html ).localize().find( 'a' );
+       assert.strictEqual( $lc.length, 1, 'link is created' );
+       assert.strictEqual( $lc.text(), 'link', 'the link text got added' );
 } );
index 3a2d0d8..5b566ae 100644 (file)
@@ -1,58 +1,58 @@
-module( 'jquery.mwExtension', QUnit.newMwEnvironment() );
+QUnit.module( 'jquery.mwExtension', QUnit.newMwEnvironment() );
 
-test( 'String functions', function() {
+QUnit.test( 'String functions', function ( assert ) {
 
-       equal( $.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
-       equal( $.trimRight( '  foo bar  ' ), '  foo bar', 'trimRight' );
-       equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
+       assert.equal( $.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
+       assert.equal( $.trimRight( '  foo bar  ' ), '  foo bar', 'trimRight' );
+       assert.equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
 
-       equal( $.escapeRE( '<!-- ([{+mW+}]) $^|?>' ),
+       assert.equal( $.escapeRE( '<!-- ([{+mW+}]) $^|?>' ),
         '<!\\-\\- \\(\\[\\{\\+mW\\+\\}\\]\\) \\$\\^\\|\\?>', 'escapeRE - Escape specials' );
-       equal( $.escapeRE( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ),
+       assert.equal( $.escapeRE( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ),
         'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'escapeRE - Leave uppercase alone' );
-       equal( $.escapeRE( 'abcdefghijklmnopqrstuvwxyz' ),
+       assert.equal( $.escapeRE( 'abcdefghijklmnopqrstuvwxyz' ),
         'abcdefghijklmnopqrstuvwxyz', 'escapeRE - Leave lowercase alone' );
-       equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
+       assert.equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
 });
 
-test( 'Is functions', function() {
+QUnit.test( 'Is functions', function ( assert ) {
 
-       strictEqual( $.isDomElement( document.getElementById( 'qunit-header' ) ), true,
+       assert.strictEqual( $.isDomElement( document.getElementById( 'qunit-header' ) ), true,
         'isDomElement: #qunit-header Node' );
-       strictEqual( $.isDomElement( document.getElementById( 'random-name' ) ), false,
+       assert.strictEqual( $.isDomElement( document.getElementById( 'random-name' ) ), false,
         'isDomElement: #random-name (null)' );
-       strictEqual( $.isDomElement( document.getElementsByTagName( 'div' ) ), false,
+       assert.strictEqual( $.isDomElement( document.getElementsByTagName( 'div' ) ), false,
         'isDomElement: getElementsByTagName Array' );
-       strictEqual( $.isDomElement( document.getElementsByTagName( 'div' )[0] ), true,
+       assert.strictEqual( $.isDomElement( document.getElementsByTagName( 'div' )[0] ), true,
         'isDomElement: getElementsByTagName(..)[0] Node' );
-       strictEqual( $.isDomElement( $( 'div' ) ), false,
+       assert.strictEqual( $.isDomElement( $( 'div' ) ), false,
         'isDomElement: jQuery object' );
-       strictEqual( $.isDomElement( $( 'div' ).get(0) ), true,
+       assert.strictEqual( $.isDomElement( $( 'div' ).get(0) ), true,
         'isDomElement: jQuery object > Get node' );
-       strictEqual( $.isDomElement( document.createElement( 'div' ) ), true,
+       assert.strictEqual( $.isDomElement( document.createElement( 'div' ) ), true,
         'isDomElement: createElement' );
-       strictEqual( $.isDomElement( { foo: 1 } ), false,
+       assert.strictEqual( $.isDomElement( { foo: 1 } ), false,
         'isDomElement: Object' );
 
-       strictEqual( $.isEmpty( 'string' ), false, 'isEmptry: "string"' );
-       strictEqual( $.isEmpty( '0' ), true, 'isEmptry: "0"' );
-       strictEqual( $.isEmpty( '' ), true, 'isEmptry: ""' );
-       strictEqual( $.isEmpty( 1 ), false, 'isEmptry: 1' );
-       strictEqual( $.isEmpty( [] ), true, 'isEmptry: []' );
-       strictEqual( $.isEmpty( {} ), true, 'isEmptry: {}' );
+       assert.strictEqual( $.isEmpty( 'string' ), false, 'isEmptry: "string"' );
+       assert.strictEqual( $.isEmpty( '0' ), true, 'isEmptry: "0"' );
+       assert.strictEqual( $.isEmpty( '' ), true, 'isEmptry: ""' );
+       assert.strictEqual( $.isEmpty( 1 ), false, 'isEmptry: 1' );
+       assert.strictEqual( $.isEmpty( [] ), true, 'isEmptry: []' );
+       assert.strictEqual( $.isEmpty( {} ), true, 'isEmptry: {}' );
 
        // Documented behaviour
-       strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmptry: { length: 0 }' );
+       assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmptry: { length: 0 }' );
 });
 
-test( 'Comparison functions', function() {
+QUnit.test( 'Comparison functions', function ( assert ) {
 
-       ok( $.compareArray( [0, 'a', [], [2, 'b'] ], [0, "a", [], [2, "b"] ] ),
+       assert.ok( $.compareArray( [0, 'a', [], [2, 'b'] ], [0, "a", [], [2, "b"] ] ),
         'compareArray: Two deep arrays that are excactly the same' );
-       ok( !$.compareArray( [1], [2] ), 'compareArray: Two different arrays (false)' );
+       assert.ok( !$.compareArray( [1], [2] ), 'compareArray: Two different arrays (false)' );
 
-       ok( $.compareObject( {}, {} ), 'compareObject: Two empty objects' );
-       ok( $.compareObject( { foo: 1 }, { foo: 1 } ), 'compareObject: Two the same objects' );
-       ok( !$.compareObject( { bar: true }, { baz: false } ),
+       assert.ok( $.compareObject( {}, {} ), 'compareObject: Two empty objects' );
+       assert.ok( $.compareObject( { foo: 1 }, { foo: 1 } ), 'compareObject: Two the same objects' );
+       assert.ok( !$.compareObject( { bar: true }, { baz: false } ),
         'compareObject: Two different objects (false)' );
 });
index 98ff550..161f0cd 100644 (file)
@@ -1,15 +1,6 @@
-module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
-
-test( '-- Initial check', function() {
-       expect(2);
-
-       ok( $.fn.firstTabIndex, '$.fn.firstTabIndex defined' );
-       ok( $.fn.lastTabIndex, '$.fn.lastTabIndex defined' );
-});
-
-test( 'firstTabIndex', function() {
-       expect(2);
+QUnit.module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
 
+QUnit.test( 'firstTabIndex', 2, function ( assert ) {
        var testEnvironment =
 '<form>' +
        '<input tabindex="7" />' +
@@ -19,15 +10,13 @@ test( 'firstTabIndex', function() {
 '</form>';
 
        var $testA = $( '<div>' ).html( testEnvironment ).appendTo( '#qunit-fixture' );
-       strictEqual( $testA.firstTabIndex(), 2, 'First tabindex should be 2 within this context.' );
+       assert.strictEqual( $testA.firstTabIndex(), 2, 'First tabindex should be 2 within this context.' );
 
        var $testB = $( '<div>' );
-       strictEqual( $testB.firstTabIndex(), null, 'Return null if none available.' );
+       assert.strictEqual( $testB.firstTabIndex(), null, 'Return null if none available.' );
 });
 
-test( 'lastTabIndex', function() {
-       expect(2);
-
+QUnit.test( 'lastTabIndex', 2, function ( assert ) {
        var testEnvironment =
 '<form>' +
        '<input tabindex="7" />' +
@@ -37,8 +26,8 @@ test( 'lastTabIndex', function() {
 '</form>';
 
        var $testA = $( '<div>' ).html( testEnvironment ).appendTo( '#qunit-fixture' );
-       strictEqual( $testA.lastTabIndex(), 9, 'Last tabindex should be 9 within this context.' );
+       assert.strictEqual( $testA.lastTabIndex(), 9, 'Last tabindex should be 9 within this context.' );
 
        var $testB = $( '<div>' );
-       strictEqual( $testB.lastTabIndex(), null, 'Return null if none available.' );
+       assert.strictEqual( $testB.lastTabIndex(), null, 'Return null if none available.' );
 });
index f028dbc..16d8170 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function ( $, mw ) {
 
 var config = {
        wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
@@ -7,12 +7,7 @@ var config = {
        wgContentLanguage: 'en'
 };
 
-module( 'jquery.tablesorter', QUnit.newMwEnvironment({ config: config }) );
-
-test( '-- Initial check', function() {
-       expect(1);
-       ok( $.tablesorter, '$.tablesorter defined' );
-});
+QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment({ config: config }) );
 
 /**
  * Create an HTML table from an array of row arrays containing text strings.
@@ -22,28 +17,29 @@ test( '-- Initial check', function() {
  * @param {String[][]} data
  * @return jQuery
  */
-var tableCreate = function( header, data ) {
-       var $table = $( '<table class="sortable"><thead></thead><tbody></tbody></table>' ),
+function tableCreate(  header, data ) {
+       var i,
+               $table = $( '<table class="sortable"><thead></thead><tbody></tbody></table>' ),
                $thead = $table.find( 'thead' ),
                $tbody = $table.find( 'tbody' ),
                $tr = $( '<tr>' );
 
-       $.each( header, function( i, str ) {
+       $.each( header, function ( i, str ) {
                var $th = $( '<th>' );
                $th.text( str ).appendTo( $tr );
        });
        $tr.appendTo( $thead );
 
-       for (var i = 0; i < data.length; i++) {
+       for ( i = 0; i < data.length; i++ ) {
                $tr = $( '<tr>' );
-               $.each( data[i], function( j, str ) {
+               $.each( data[i], function ( j, str ) {
                        var $td = $( '<td>' );
                        $td.text( str ).appendTo( $tr );
                });
                $tr.appendTo( $tbody );
        }
        return $table;
-};
+}
 
 /**
  * Extract text from table.
@@ -51,7 +47,7 @@ var tableCreate = function( header, data ) {
  * @param {jQuery} $table
  * @return String[][]
  */
-var tableExtract = function( $table ) {
+function tableExtract( $table ) {
        var data = [];
 
        $table.find( 'tbody' ).find( 'tr' ).each( function( i, tr ) {
@@ -62,7 +58,7 @@ var tableExtract = function( $table ) {
                data.push( row );
        });
        return data;
-};
+}
 
 /**
  * Run a table test by building a table with the given data,
@@ -74,10 +70,8 @@ var tableExtract = function( $table ) {
  * @param {String[][]} expected rows/cols to compare against at end
  * @param {function($table)} callback something to do with the table before we compare
  */
-var tableTest = function( msg, header, data, expected, callback ) {
-       test( msg, function() {
-               expect(1);
-
+function tableTest( msg, header, data, expected, callback ) {
+       QUnit.test( msg, 1, function ( assert ) {
                var $table = tableCreate( header, data );
 
                // Give caller a chance to set up sorting and manipulate the table.
@@ -86,15 +80,18 @@ var tableTest = function( msg, header, data, expected, callback ) {
                // Table sorting is done synchronously; if it ever needs to change back
                // to asynchronous, we'll need a timeout or a callback here.
                var extracted = tableExtract( $table );
-               deepEqual( extracted, expected, msg );
+               assert.deepEqual( extracted, expected, msg );
        });
-};
+}
 
-var reversed = function(arr) {
+function reversed(arr) {
+       // Clone array
        var arr2 = arr.slice(0);
+
        arr2.reverse();
+
        return arr2;
-};
+}
 
 // Sample data set using planets named and their radius
 var header  = [ 'Planet' , 'Radius (km)'],
@@ -115,7 +112,7 @@ tableTest(
        header,
        planets,
        ascendingName,
-       function( $table ) {
+       function ( $table ) {
                $table.tablesorter();
                $table.find( '.headerSort:eq(0)' ).click();
        }
@@ -125,7 +122,7 @@ tableTest(
        header,
        planets,
        ascendingName,
-       function( $table ) {
+       function ( $table ) {
                $table.tablesorter();
                $table.find( '.headerSort:eq(0)' ).click();
        }
@@ -135,7 +132,7 @@ tableTest(
        header,
        planets,
        reversed(ascendingName),
-       function( $table ) {
+       function ( $table ) {
                $table.tablesorter();
                $table.find( '.headerSort:eq(0)' ).click().click();
        }
@@ -145,7 +142,7 @@ tableTest(
        header,
        planets,
        ascendingRadius,
-       function( $table ) {
+       function ( $table ) {
                $table.tablesorter();
                $table.find( '.headerSort:eq(1)' ).click();
        }
@@ -155,7 +152,7 @@ tableTest(
        header,
        planets,
        reversed(ascendingRadius),
-       function( $table ) {
+       function ( $table ) {
                $table.tablesorter();
                $table.find( '.headerSort:eq(1)' ).click().click();
        }
@@ -180,7 +177,7 @@ tableTest(
                ['09.11.2011'],
                ['11.11.2011']
        ],
-       function( $table ) {
+       function ( $table ) {
                mw.config.set( 'wgDefaultDateFormat', 'dmy' );
                mw.config.set( 'wgContentLanguage', 'de' );
 
@@ -206,7 +203,7 @@ tableTest(
                ['09.11.2011'],
                ['11.11.2011']
        ],
-       function( $table ) {
+       function ( $table ) {
                mw.config.set( 'wgDefaultDateFormat', 'mdy' );
 
                $table.tablesorter();
@@ -242,7 +239,7 @@ tableTest(
        ['IP'],
        ipv4,
        ipv4Sorted,
-       function( $table ) {
+       function ( $table ) {
                $table.tablesorter();
                $table.find( '.headerSort:eq(0)' ).click();
        }
@@ -252,7 +249,7 @@ tableTest(
        ['IP'],
        ipv4,
        reversed(ipv4Sorted),
-       function( $table ) {
+       function ( $table ) {
                $table.tablesorter();
                $table.find( '.headerSort:eq(0)' ).click().click();
        }
@@ -287,7 +284,7 @@ tableTest(
        ['Name'],
        umlautWords,
        umlautWordsSorted,
-       function( $table ) {
+       function ( $table ) {
                mw.config.set( 'tableSorterCollation', {
                        'ä': 'ae',
                        'ö': 'oe',
@@ -301,14 +298,14 @@ tableTest(
 );
 
 var planetsRowspan = [["Earth","6051.8"], jupiter, ["Mars","6051.8"], mercury, saturn, venus];
-var planetsRowspanII = [jupiter, mercury, saturn, ['Venus', '6371.0'], venus, ['Venus', '3390.0']];
+var planetsRowspanII = [jupiter, mercury, saturn, venus, ['Venus', '6371.0'], ['Venus', '3390.0']];
 
 tableTest(
        'Basic planet table: same value for multiple rows via rowspan',
        header,
        planets,
        planetsRowspan,
-       function( $table ) {
+       function ( $table ) {
                // Modify the table to have a multiuple-row-spanning cell:
                // - Remove 2nd cell of 4th row, and, 2nd cell or 5th row.
                $table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
@@ -325,7 +322,7 @@ tableTest(
        header,
        planets,
        planetsRowspanII,
-       function( $table ) {
+       function ( $table ) {
                // Modify the table to have a multiuple-row-spanning cell:
                // - Remove 1st cell of 4th row, and, 1st cell or 5th row.
                $table.find( 'tr:eq(3) td:eq(0), tr:eq(4) td:eq(0)' ).remove();
@@ -348,11 +345,11 @@ var complexMDYDates = [
 ];
 
 var complexMDYSorted = [
-       ["5.12.1990"],
-       ["April 21 1991"],
-       ["04 22 1991"],
-       ["January, 19 2010"],
-       ["December 12 '10"]
+       ['5.12.1990'],
+       ['April 21 1991'],
+       ['04 22 1991'],
+       ['January, 19 2010'],
+       ['December 12 \'10']
 ];
 
 tableTest(
@@ -360,7 +357,7 @@ tableTest(
        ['date'],
        complexMDYDates,
        complexMDYSorted,
-       function( $table ) {
+       function ( $table ) {
                mw.config.set( 'wgDefaultDateFormat', 'mdy' );
 
                $table.tablesorter();
@@ -368,6 +365,39 @@ tableTest(
        }
 );
 
+var currencyUnsorted = [
+       ['1.02 $'],
+       ['$ 3.00'],
+       ['€ 2,99'],
+       ['$ 1.00'],
+       ['$3.50'],
+       ['$ 1.50'],
+       ['€ 0.99']
+];
+
+var currencySorted = [
+       ['€ 0.99'],
+       ['$ 1.00'],
+       ['1.02 $'],
+       ['$ 1.50'],
+       ['$ 3.00'],
+       ['$3.50'],
+       // Comma's sort after dots
+       // Not intentional but test to detect changes
+       ['€ 2,99']
+];
+
+tableTest(
+       'Currency parsing I',
+       ['currency'],
+       currencyUnsorted,
+       currencySorted,
+       function ( $table ) {
+               $table.tablesorter();
+               $table.find( '.headerSort:eq(0)' ).click();
+       }
+);
+
 var ascendingNameLegacy = ascendingName.slice(0);
 ascendingNameLegacy[4] = ascendingNameLegacy[5];
 ascendingNameLegacy.pop();
@@ -384,8 +414,9 @@ tableTest(
        }
 );
 
+
 /** FIXME: the diff output is not very readeable. */
-test( 'bug 32047 - caption must be before thead', function() {
+QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {
        var $table;
        $table = $(
                '<table class="sortable">' +
@@ -398,17 +429,18 @@ test( 'bug 32047 - caption must be before thead', function() {
                );
        $table.tablesorter();
 
-       equals(
+       assert.equal(
                $table.children( ).get( 0 ).nodeName,
                'CAPTION',
                'First element after <thead> must be <caption> (bug 32047)'
        );
 });
 
-test( 'data-sort-value attribute, when available, should override sorting position', function() {
+QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
        var $table, data;
 
-       // Simple example, one without data-sort-value which should be sorted at it's text.
+       // Example 1: All cells except one cell without data-sort-value,
+       // which should be sorted at it's text content value.
        $table = $(
                '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
                        '<tbody>' +
@@ -424,30 +456,33 @@ test( 'data-sort-value attribute, when available, should override sorting positi
        data = [];
        $table.find( 'tbody > tr' ).each( function( i, tr ) {
                $( tr ).find( 'td' ).each( function( i, td ) {
-                       data.push( { data: $( td ).data( 'sort-value' ), text: $( td ).text() } );
+                       data.push( {
+                               data: $( td ).data( 'sortValue' ),
+                               text: $( td ).text()
+                       } );
                });
        });
 
-       deepEqual( data, [
+       assert.deepEqual( data, [
                {
-                       "data": "Apple",
-                       "text": "Bird"
+                       data: 'Apple',
+                       text: 'Bird'
                }, {
-                       "data": "Bananna",
-                       "text": "Ferret"
+                       data: 'Bananna',
+                       text: 'Ferret'
                }, {
-                       "data": undefined,
-                       "text": "Cheetah"
+                       data: undefined,
+                       text: 'Cheetah'
                }, {
-                       "data": "Cherry",
-                       "text": "Dolphin"
+                       data: 'Cherry',
+                       text: 'Dolphin'
                }, {
-                       "data": "Drupe",
-                       "text": "Elephant"
+                       data: 'Drupe',
+                       text: 'Elephant'
                }
-       ] );
+       ], 'Order matches expected order (based on data-sort-value attribute values)' );
 
-       // Another example
+       // Example 2
        $table = $(
                '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
                        '<tbody>' +
@@ -460,31 +495,92 @@ test( 'data-sort-value attribute, when available, should override sorting positi
        );
        $table.tablesorter().find( '.headerSort:eq(0)' ).click();
 
+       data = [];
+       $table.find( 'tbody > tr' ).each( function ( i, tr ) {
+               $( tr ).find( 'td' ).each( function ( i, td ) {
+                       data.push( {
+                               data: $( td ).data( 'sortValue' ),
+                               text: $( td ).text()
+                       } );
+               });
+       });
+
+       assert.deepEqual( data, [
+               {
+                       data: undefined,
+                       text: 'B'
+               }, {
+                       data: undefined,
+                       text: 'D'
+               }, {
+                       data: 'E',
+                       text: 'A'
+               }, {
+                       data: 'F',
+                       text: 'C'
+               }, {
+                       data: undefined,
+                       text: 'G'
+               }
+       ], 'Order matches expected order (based on data-sort-value attribute values)' );
+
+       // Example 3: Test that live changes are used from data-sort-value,
+       // even if they change after the tablesorter is constructed (bug 38152).
+       $table = $(
+               '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
+                       '<tbody>' +
+                       '<tr><td>D</td></tr>' +
+                       '<tr><td data-sort-value="1">A</td></tr>' +
+                       '<tr><td>B</td></tr>' +
+                       '<tr><td data-sort-value="2">G</td></tr>' +
+                       '<tr><td>C</td></tr>' +
+               '</tbody></table>'
+       );
+       // initialize table sorter and sort once
+       $table
+               .tablesorter()
+               .find( '.headerSort:eq(0)' ).click();
+
+       // Change the sortValue data properties (bug 38152)
+       // - change data
+       $table.find( 'td:contains(A)' ).data( 'sortValue', 3 );
+       // - add data
+       $table.find( 'td:contains(B)' ).data( 'sortValue', 1 );
+       // - remove data, bring back attribute: 2
+       $table.find( 'td:contains(G)' ).removeData( 'sortValue' );
+
+       // Now sort again (twice, so it is back at Ascending)
+       $table.find( '.headerSort:eq(0)' ).click();
+       $table.find( '.headerSort:eq(0)' ).click();
+
        data = [];
        $table.find( 'tbody > tr' ).each( function( i, tr ) {
                $( tr ).find( 'td' ).each( function( i, td ) {
-                       data.push( { data: $( td ).data( 'sort-value' ), text: $( td ).text() } );
+                       data.push( {
+                               data: $( td ).data( 'sortValue' ),
+                               text: $( td ).text()
+                       } );
                });
        });
 
-       deepEqual( data, [
+       assert.deepEqual( data, [
                {
-                       "data": undefined,
-                       "text": "B"
+                       data: 1,
+                       text: "B"
                }, {
-                       "data": undefined,
-                       "text": "D"
+                       data: 2,
+                       text: "G"
                }, {
-                       "data": "E",
-                       "text": "A"
+                       data: 3,
+                       text: "A"
                }, {
-                       "data": "F",
-                       "text": "C"
+                       data: undefined,
+                       text: "C"
                }, {
-                       "data": undefined,
-                       "text": "G"
+                       data: undefined,
+                       text: "D"
                }
-       ] );
+       ], 'Order matches expected order, using the current sortValue in $.data()' );
 
 });
 
@@ -522,13 +618,11 @@ tableTest( 'bug 8115: sort numbers with commas (descending)',
 );
 // TODO add numbers sorting tests for bug 8115 with a different language
 
-test( 'bug 32888 - Tables inside a tableheader cell', function() {
-       expect(2);
-
+QUnit.test( 'bug 32888 - Tables inside a tableheader cell', 2, function ( assert ) {
        var $table;
        $table = $(
-               '<table class="sortable" id="32888">' +
-               '<tr><th>header<table id="32888-2">'+
+               '<table class="sortable" id="mw-bug-32888">' +
+               '<tr><th>header<table id="mw-bug-32888-2">'+
                        '<tr><th>1</th><th>2</th></tr>' +
                '</table></th></tr>' +
                '<tr><td>A</td></tr>' +
@@ -537,16 +631,67 @@ test( 'bug 32888 - Tables inside a tableheader cell', function() {
                );
        $table.tablesorter();
 
-       equals(
+       assert.equal(
                $table.find('> thead:eq(0) > tr > th.headerSort').length,
                1,
                'Child tables inside a headercell should not interfere with sortable headers (bug 32888)'
        );
-       equals(
-               $('#32888-2').find('th.headerSort').length,
+       assert.equal(
+               $( '#mw-bug-32888-2' ).find('th.headerSort').length,
                0,
                'The headers of child tables inside a headercell should not be sortable themselves (bug 32888)'
        );
 });
 
-})( jQuery );
+
+var correctDateSorting1 = [
+       ['01 January 2010'],
+       ['05 February 2010'],
+       ['16 January 2010']
+];
+
+var correctDateSortingSorted1 = [
+       ['01 January 2010'],
+       ['16 January 2010'],
+       ['05 February 2010']
+];
+
+tableTest(
+       'Correct date sorting I',
+       ['date'],
+       correctDateSorting1,
+       correctDateSortingSorted1,
+       function ( $table ) {
+               mw.config.set( 'wgDefaultDateFormat', 'mdy' );
+
+               $table.tablesorter();
+               $table.find( '.headerSort:eq(0)' ).click();
+       }
+);
+
+var correctDateSorting2 = [
+       ['January 01 2010'],
+       ['February 05 2010'],
+       ['January 16 2010']
+];
+
+var correctDateSortingSorted2 = [
+       ['January 01 2010'],
+       ['January 16 2010'],
+       ['February 05 2010']
+];
+
+tableTest(
+       'Correct date sorting II',
+       ['date'],
+       correctDateSorting2,
+       correctDateSortingSorted2,
+       function ( $table ) {
+               mw.config.set( 'wgDefaultDateFormat', 'dmy' );
+
+               $table.tablesorter();
+               $table.find( '.headerSort:eq(0)' ).click();
+       }
+);
+
+}( jQuery, mediaWiki ) );
index e01f217..f0a210f 100644 (file)
@@ -1,9 +1,4 @@
-module( 'jquery.textSelection', QUnit.newMwEnvironment() );
-
-test( '-- Initial check', function() {
-       expect(1);
-       ok( $.fn.textSelection, 'jQuery.fn.textSelection defined' );
-} );
+QUnit.module( 'jquery.textSelection', QUnit.newMwEnvironment() );
 
 /**
  * Test factory for $.fn.textSelection( 'encapsulateText' )
@@ -16,7 +11,7 @@ test( '-- Initial check', function() {
  *   end {int} ending char for selection
  *   params {object} add'l parameters for $().textSelection( 'encapsulateText' )
  */
-var encapsulateTest = function( options ) {
+function encapsulateTest( options ) {
        var opt = $.extend({
                description: '',
                before: {},
@@ -34,12 +29,12 @@ var encapsulateTest = function( options ) {
                selected: null
        }, opt.after);
 
-       test( opt.description, function() {
+       QUnit.test( opt.description, function ( assert ) {
                var tests = 1;
                if ( opt.after.selected !== null ) {
                        tests++;
                }
-               expect( tests );
+               QUnit.expect( tests );
 
                var $textarea = $( '<textarea>' );
 
@@ -65,15 +60,15 @@ var encapsulateTest = function( options ) {
 
                var text = $textarea.textSelection( 'getContents' ).replace( /\r\n/g, "\n" );
 
-               equal( text, opt.after.text, 'Checking full text after encapsulation' );
+               assert.equal( text, opt.after.text, 'Checking full text after encapsulation' );
 
                if (opt.after.selected !== null) {
                        var selected = $textarea.textSelection( 'getSelection' );
-                       equal( selected, opt.after.selected, 'Checking selected text after encapsulation.' );
+                       assert.equal( selected, opt.after.selected, 'Checking selected text after encapsulation.' );
                }
 
        } );
-};
+}
 
 var sig = {
        'pre': "--~~~~"
@@ -86,7 +81,7 @@ var sig = {
        'peri': 'Heading 2',
        'post': ' ==',
        'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,
-       'regexReplace': "\$1==\$3==\$4",
+       'regexReplace': "$1==$3==$4",
        'ownline': true
 }, ulist = {
        'pre': "* ",
@@ -222,28 +217,26 @@ encapsulateTest({
 });
 
 
-var caretTest = function(options) {
-       test(options.description, function() {
-               expect(2);
-
-               var $textarea = $( '<textarea>' ).text(options.text);
+function caretTest( options ) {
+       QUnit.test( options.description, 2, function ( assert ) {
+               var $textarea = $( '<textarea>' ).text( options.text );
 
                $( '#qunit-fixture' ).append( $textarea );
 
-               if (options.mode == 'set') {
+               if ( options.mode === 'set' ) {
                        $textarea.textSelection('setSelection', {
                                start: options.start,
                                end: options.end
                        });
                }
 
-               var among = function(actual, expected, message) {
-                       if ($.isArray(expected)) {
-                               ok($.inArray(actual, expected) !== -1 , message + ' (got ' + actual + '; expected one of ' + expected.join(', ') + ')');
+               function among( actual, expected, message ) {
+                       if ( $.isArray( expected ) ) {
+                               assert.ok( $.inArray( actual, expected ) !== -1 , message + ' (got ' + actual + '; expected one of ' + expected.join(', ') + ')' );
                        } else {
-                               equal(actual, expected, message);
+                               assert.equal( actual, expected, message );
                        }
-               };
+               }
 
                var pos = $textarea.textSelection('getCaretPosition', {startAndEnd: true});
                among(pos[0], options.start, 'Caret start should be where we set it.');
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
new file mode 100644 (file)
index 0000000..3d3f630
--- /dev/null
@@ -0,0 +1,26 @@
+QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment() );
+
+QUnit.asyncTest( 'Hello world', function ( assert ) {
+       var api;
+       QUnit.expect( 6 );
+
+       api = new mw.Api();
+
+       api.parse( "'''Hello world'''" )
+               .done( function ( html ) {
+                       // Parse into a document fragment instead of comparing HTML, due to
+                       // presence of Tidy influencing whitespace.
+                       // Html also contains "NewPP report" comment.
+                       var $res = $( '<div>' ).html( html ).children(),
+                               res = $res.get( 0 );
+                       assert.equal( $res.length, 1, 'Response contains 1 element' );
+                       assert.equal( res.nodeName.toLowerCase(), 'p', 'Response is a paragraph' );
+                       assert.equal( $res.children().length, 1, 'Response has 1 child element' );
+                       assert.equal( $res.children().get( 0 ).nodeName.toLowerCase(), 'b', 'Child element is a bold tag' );
+                       // Trim since Tidy may or may not mess with the spacing here
+                       assert.equal( $.trim( $res.text() ), 'Hello world', 'Response contains given text' );
+                       assert.equal( $res.find( 'b' ).text(), 'Hello world', 'Bold tag wraps the entire, same, text' );
+
+                       QUnit.start();
+               });
+});
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
new file mode 100644 (file)
index 0000000..79bd730
--- /dev/null
@@ -0,0 +1,59 @@
+QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment() );
+
+QUnit.asyncTest( 'Basic functionality', function ( assert ) {
+       var api, d1, d2, d3;
+       QUnit.expect( 3 );
+
+       api = new mw.Api();
+
+       d1 = api.get( {} )
+               .done( function ( data ) {
+                       assert.deepEqual( data, [], 'If request succeeds without errors, resolve deferred' );
+               });
+
+       d2 = api.get({
+                       action: 'doesntexist'
+               })
+               .fail( function ( errorCode, details ) {
+                       assert.equal( errorCode, 'unknown_action', 'API error (e.g. "unknown_action") should reject the deferred' );
+               });
+
+       d3 = api.post( {} )
+               .done( function ( data ) {
+                       assert.deepEqual( data, [], 'Simple POST request' );
+               });
+
+       // After all are completed, continue the test suite.
+       QUnit.whenPromisesComplete( d1, d2, d3 ).always( function () {
+               QUnit.start();
+       });
+});
+
+QUnit.asyncTest( 'Deprecated callback methods', function ( assert ) {
+       var api, d1, d2, d3;
+       QUnit.expect( 3 );
+
+       api = new mw.Api();
+
+       d1 = api.get( {}, function () {
+               assert.ok( true, 'Function argument treated as success callback.' );
+       });
+
+       d2 = api.get( {}, {
+               ok: function ( data ) {
+                       assert.ok( true, '"ok" property treated as success callback.' );
+               }
+       });
+
+       d3 = api.get({
+                       action: 'doesntexist'
+               }, {
+               err: function ( data ) {
+                       assert.ok( true, '"err" property treated as error callback.' );
+               }
+       });
+
+       QUnit.whenPromisesComplete( d1, d2, d3 ).always( function () {
+               QUnit.start();
+       });
+});
index d73fe5a..7fe7baf 100644 (file)
@@ -1,13 +1,8 @@
-module( 'mediawiki.special.recentchanges', QUnit.newMwEnvironment() );
+QUnit.module( 'mediawiki.special.recentchanges', QUnit.newMwEnvironment() );
 
-test( '-- Initial check', function() {
-       expect( 2 );
-       ok( mw.special.recentchanges.init, 'mw.special.recentchanges.init defined' );
-       ok( mw.special.recentchanges.updateCheckboxes, 'mw.special.recentchanges.updateCheckboxes defined' );
-       // TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
-});
+// TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
 
-test( '"all" namespace disable checkboxes', function() {
+QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
 
        // from Special:Recentchanges
        var select =
@@ -33,15 +28,15 @@ test( '"all" namespace disable checkboxes', function() {
        // TODO abstract the double strictEquals
 
        // At first checkboxes are enabled
-       strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
-       strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
+       assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
+       assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
 
        // Initiate the recentchanges module
        mw.special.recentchanges.init();
 
        // By default
-       strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
-       strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
+       assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
+       assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
 
        // select second option...
        var $options = $( '#namespace' ).find( 'option' );
@@ -50,8 +45,8 @@ test( '"all" namespace disable checkboxes', function() {
        $( '#namespace' ).change();
 
        // ... and checkboxes should be enabled again
-       strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
-       strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
+       assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
+       assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
 
        // select first option ( 'all' namespace)...
        $options.eq(1).removeProp( 'selected' );
@@ -59,8 +54,8 @@ test( '"all" namespace disable checkboxes', function() {
        $( '#namespace' ).change();
 
        // ... and checkboxes should now be disabled
-       strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
-       strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
+       assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
+       assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
 
        // DOM cleanup
        $env.remove();
index 7ff0fb8..6360925 100644 (file)
@@ -55,147 +55,127 @@ var config = {
        "wgCaseSensitiveNamespaces": []
 };
 
-module( 'mediawiki.Title', QUnit.newMwEnvironment({ config: config }) );
+QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment({ config: config }) );
 
-test( '-- Initial check', function () {
-       expect(1);
-       ok( mw.Title, 'mw.Title defined' );
-});
-
-test( 'Transformation', function () {
-       expect(8);
 
+QUnit.test( 'Transformation', 8, function ( assert ) {
        var title;
 
        title = new mw.Title( 'File:quux pif.jpg' );
-       equal( title.getName(), 'Quux_pif' );
+       assert.equal( title.getName(), 'Quux_pif' );
 
        title = new mw.Title( 'File:Glarg_foo_glang.jpg' );
-       equal( title.getNameText(), 'Glarg foo glang' );
+       assert.equal( title.getNameText(), 'Glarg foo glang' );
 
        title = new mw.Title( 'User:ABC.DEF' );
-       equal( title.toText(), 'User:ABC.DEF' );
-       equal( title.getNamespaceId(), 2 );
-       equal( title.getNamespacePrefix(), 'User:' );
+       assert.equal( title.toText(), 'User:ABC.DEF' );
+       assert.equal( title.getNamespaceId(), 2 );
+       assert.equal( title.getNamespacePrefix(), 'User:' );
 
        title = new mw.Title( 'uSEr:hAshAr' );
-       equal( title.toText(), 'User:HAshAr' );
-       equal( title.getNamespaceId(), 2 );
+       assert.equal( title.toText(), 'User:HAshAr' );
+       assert.equal( title.getNamespaceId(), 2 );
 
        title = new mw.Title( '   MediaWiki:  Foo   bar   .js   ' );
        // Don't ask why, it's the way the backend works. One space is kept of each set
-       equal( title.getName(), 'Foo_bar_.js', "Merge multiple spaces to a single space." );
+       assert.equal( title.getName(), 'Foo_bar_.js', "Merge multiple spaces to a single space." );
 });
 
-test( 'Main text for filename', function () {
-       expect(8);
-
+QUnit.test( 'Main text for filename', 8, function ( assert ) {
        var title = new mw.Title( 'File:foo_bar.JPG' );
 
-       equal( title.getNamespaceId(), 6 );
-       equal( title.getNamespacePrefix(), 'File:' );
-       equal( title.getName(), 'Foo_bar' );
-       equal( title.getNameText(), 'Foo bar' );
-       equal( title.getMain(), 'Foo_bar.JPG' );
-       equal( title.getMainText(), 'Foo bar.JPG' );
-       equal( title.getExtension(), 'JPG' );
-       equal( title.getDotExtension(), '.JPG' );
+       assert.equal( title.getNamespaceId(), 6 );
+       assert.equal( title.getNamespacePrefix(), 'File:' );
+       assert.equal( title.getName(), 'Foo_bar' );
+       assert.equal( title.getNameText(), 'Foo bar' );
+       assert.equal( title.getMain(), 'Foo_bar.JPG' );
+       assert.equal( title.getMainText(), 'Foo bar.JPG' );
+       assert.equal( title.getExtension(), 'JPG' );
+       assert.equal( title.getDotExtension(), '.JPG' );
 });
 
-test( 'Namespace detection and conversion', function () {
-       expect(6);
-
+QUnit.test( 'Namespace detection and conversion', 6, function ( assert ) {
        var title;
 
        title = new mw.Title( 'something.PDF', 6 );
-       equal( title.toString(), 'File:Something.PDF' );
+       assert.equal( title.toString(), 'File:Something.PDF' );
 
        title = new mw.Title( 'NeilK', 3 );
-       equal( title.toString(), 'User_talk:NeilK' );
-       equal( title.toText(), 'User talk:NeilK' );
+       assert.equal( title.toString(), 'User_talk:NeilK' );
+       assert.equal( title.toText(), 'User talk:NeilK' );
 
        title = new mw.Title( 'Frobisher', 100 );
-       equal( title.toString(), 'Penguins:Frobisher' );
+       assert.equal( title.toString(), 'Penguins:Frobisher' );
 
        title = new mw.Title( 'antarctic_waterfowl:flightless_yet_cute.jpg' );
-       equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
+       assert.equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
 
        title = new mw.Title( 'Penguins:flightless_yet_cute.jpg' );
-       equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
+       assert.equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
 });
 
-test( 'Throw error on invalid title', function () {
-       expect(1);
-
-       raises(function () {
+QUnit.test( 'Throw error on invalid title', 1, function ( assert ) {
+       assert.throws(function () {
                var title = new mw.Title( '' );
        }, 'Throw error on empty string' );
 });
 
-test( 'Case-sensivity', function () {
-       expect(3);
-
+QUnit.test( 'Case-sensivity', 3, function ( assert ) {
        var title;
 
        // Default config
        mw.config.set( 'wgCaseSensitiveNamespaces', [] );
 
        title = new mw.Title( 'article' );
-       equal( title.toString(), 'Article', 'Default config: No sensitive namespaces by default. First-letter becomes uppercase' );
+       assert.equal( title.toString(), 'Article', 'Default config: No sensitive namespaces by default. First-letter becomes uppercase' );
 
        // $wgCapitalLinks = false;
        mw.config.set( 'wgCaseSensitiveNamespaces', [0, -2, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15] );
 
        title = new mw.Title( 'article' );
-       equal( title.toString(), 'article', '$wgCapitalLinks=false: Article namespace is sensitive, first-letter case stays lowercase' );
+       assert.equal( title.toString(), 'article', '$wgCapitalLinks=false: Article namespace is sensitive, first-letter case stays lowercase' );
 
        title = new mw.Title( 'john', 2 );
-       equal( title.toString(), 'User:John', '$wgCapitalLinks=false: User namespace is insensitive, first-letter becomes uppercase' );
+       assert.equal( title.toString(), 'User:John', '$wgCapitalLinks=false: User namespace is insensitive, first-letter becomes uppercase' );
 });
 
-test( 'toString / toText', function () {
-       expect(2);
-
+QUnit.test( 'toString / toText', 2, function ( assert ) {
        var title = new mw.Title( 'Some random page' );
 
-       equal( title.toString(), title.getPrefixedDb() );
-       equal( title.toText(), title.getPrefixedText() );
+       assert.equal( title.toString(), title.getPrefixedDb() );
+       assert.equal( title.toText(), title.getPrefixedText() );
 });
 
-test( 'Exists', function () {
-       expect(3);
-
+QUnit.test( 'Exists', 3, function ( assert ) {
        var title;
 
        // Empty registry, checks default to null
 
        title = new mw.Title( 'Some random page', 4 );
-       strictEqual( title.exists(), null, 'Return null with empty existance registry' );
+       assert.strictEqual( title.exists(), null, 'Return null with empty existance registry' );
 
        // Basic registry, checks default to boolean
        mw.Title.exist.set( ['Does_exist', 'User_talk:NeilK', 'Wikipedia:Sandbox_rules'], true );
        mw.Title.exist.set( ['Does_not_exist', 'User:John', 'Foobar'], false );
 
        title = new mw.Title( 'Project:Sandbox rules' );
-       assertTrue( title.exists(), 'Return true for page titles marked as existing' );
+       assert.assertTrue( title.exists(), 'Return true for page titles marked as existing' );
        title = new mw.Title( 'Foobar' );
-       assertFalse( title.exists(), 'Return false for page titles marked as nonexistent' );
+       assert.assertFalse( title.exists(), 'Return false for page titles marked as nonexistent' );
 
 });
 
-test( 'Url', function () {
-       expect(2);
-
+QUnit.test( 'Url', 2, function ( assert ) {
        var title;
 
        // Config
        mw.config.set( 'wgArticlePath', '/wiki/$1' );
 
        title = new mw.Title( 'Foobar' );
-       equal( title.getUrl(), '/wiki/Foobar', 'Basic functionally, toString passing to wikiGetlink' );
+       assert.equal( title.getUrl(), '/wiki/Foobar', 'Basic functionally, toString passing to wikiGetlink' );
 
        title = new mw.Title( 'John Doe', 3 );
-       equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
+       assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
 });
 
 }() );
\ No newline at end of file
index b834aeb..b2026c1 100644 (file)
@@ -1,29 +1,23 @@
-module( 'mediawiki.Uri', QUnit.newMwEnvironment() );
-
-test( '-- Initial check', function () {
-       expect( 2 );
-
-       // Ensure we have a generic mw.Uri constructor. By default mediawiki.uri,
-       // will use the currrent window ocation as base. But for testing we need
-       // to have a generic one, so that it doens't return false negatives if
-       // we run the test suite from an https server.
-       mw.Uri = mw.UriRelative( 'http://example.org/w/index.php' );
-
-       ok( mw.UriRelative, 'mw.UriRelative defined' );
-       ok( mw.Uri, 'mw.Uri defined' );
-} );
+QUnit.module( 'mediawiki.Uri', QUnit.newMwEnvironment({
+       setup: function () {
+               this.mwUriOrg = mw.Uri;
+               mw.Uri = mw.UriRelative( 'http://example.org/w/index.php' );
+       },
+       teardown: function () {
+               mw.Uri = this.mwUriOrg;
+               delete this.mwUriOrg;
+       }
+}) );
 
 $.each( [true, false], function ( i, strictMode ) {
-       test( 'Basic mw.Uri object test in ' + ( strictMode ? '' : 'non-' ) + 'strict mode for a simple HTTP URI', function () {
+       QUnit.test( 'Basic mw.Uri object test in ' + ( strictMode ? '' : 'non-' ) + 'strict mode for a simple HTTP URI', 2, function ( assert ) {
                var uriString, uri;
-               expect( 2 );
-
                uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
                uri = new mw.Uri( uriString, {
                        strictMode: strictMode
                });
 
-               deepEqual(
+               assert.deepEqual(
                        {
                                protocol: uri.protocol,
                                host: uri.host,
@@ -42,7 +36,7 @@ $.each( [true, false], function ( i, strictMode ) {
                        'basic object properties'
                );
 
-               deepEqual(
+               assert.deepEqual(
                        {
                                userInfo: uri.getUserInfo(),
                                authority: uri.getAuthority(),
@@ -65,13 +59,10 @@ $.each( [true, false], function ( i, strictMode ) {
        });
 });
 
-test( 'Parse an ftp URI correctly with user and password', function () {
-       var uri;
-       expect( 1 );
+QUnit.test( 'Parse an ftp URI correctly with user and password', 1, function ( assert ) {
+       var uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
 
-       uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
-
-       deepEqual(
+       assert.deepEqual(
                {
                        protocol: uri.protocol,
                        user: uri.user,
@@ -96,13 +87,10 @@ test( 'Parse an ftp URI correctly with user and password', function () {
        );
 } );
 
-test( 'Parse a uri with simple querystring', function () {
-       var uri;
-       expect( 1 );
-
-       uri = new mw.Uri( 'http://www.google.com/?q=uri' );
+QUnit.test( 'Parse a uri with simple querystring', 1, function ( assert ) {
+       var uri = new mw.Uri( 'http://www.google.com/?q=uri' );
 
-       deepEqual(
+       assert.deepEqual(
                {
                        protocol: uri.protocol,
                        host: uri.host,
@@ -125,67 +113,60 @@ test( 'Parse a uri with simple querystring', function () {
        );
 } );
 
-test( 'Handle multiple query parameter (overrideKeys on)', function () {
-       var uri;
-       expect( 5 );
-
-       uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
+QUnit.test( 'Handle multiple query parameter (overrideKeys on)', 5, function ( assert ) {
+       var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
                overrideKeys: true
        });
 
-       equal( uri.query.n, '1', 'multiple parameters are parsed' );
-       equal( uri.query.m, 'bar', 'last key overrides earlier keys' );
+       assert.equal( uri.query.n, '1', 'multiple parameters are parsed' );
+       assert.equal( uri.query.m, 'bar', 'last key overrides earlier keys' );
 
        uri.query.n = [ 'x', 'y', 'z' ];
 
        // Verify parts and total length instead of entire string because order
        // of iteration can vary.
-       ok( uri.toString().indexOf( 'm=bar' ), 'toString preserves other values' );
-       ok( uri.toString().indexOf( 'n=x&n=y&n=z' ), 'toString parameter includes all values of an array query parameter' );
-       equal( uri.toString().length, 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
+       assert.ok( uri.toString().indexOf( 'm=bar' ), 'toString preserves other values' );
+       assert.ok( uri.toString().indexOf( 'n=x&n=y&n=z' ), 'toString parameter includes all values of an array query parameter' );
+       assert.equal( uri.toString().length, 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
 } );
 
-test( 'Handle multiple query parameter (overrideKeys off)', function () {
-       var uri;
-       expect( 9 );
-
-       uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
+QUnit.test( 'Handle multiple query parameter (overrideKeys off)', 9, function ( assert ) {
+       var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
                overrideKeys: false
        });
 
        // Strict comparison so that types are also verified (n should be string '1')
-       strictEqual( uri.query.m.length, 2, 'multi-value query should be an array with 2 items' );
-       strictEqual( uri.query.m[0], 'foo', 'order and value is correct' );
-       strictEqual( uri.query.m[1], 'bar', 'order and value is correct' );
-       strictEqual( uri.query.n, '1', 'n=1 is parsed with the correct value of the expected type' );
+       assert.strictEqual( uri.query.m.length, 2, 'multi-value query should be an array with 2 items' );
+       assert.strictEqual( uri.query.m[0], 'foo', 'order and value is correct' );
+       assert.strictEqual( uri.query.m[1], 'bar', 'order and value is correct' );
+       assert.strictEqual( uri.query.n, '1', 'n=1 is parsed with the correct value of the expected type' );
 
        // Change query values
        uri.query.n = [ 'x', 'y', 'z' ];
 
        // Verify parts and total length instead of entire string because order
        // of iteration can vary.
-       ok( uri.toString().indexOf( 'm=foo&m=bar' ) >= 0, 'toString preserves other values' );
-       ok( uri.toString().indexOf( 'n=x&n=y&n=z' ) >= 0, 'toString parameter includes all values of an array query parameter' );
-       equal( uri.toString().length, 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
+       assert.ok( uri.toString().indexOf( 'm=foo&m=bar' ) >= 0, 'toString preserves other values' );
+       assert.ok( uri.toString().indexOf( 'n=x&n=y&n=z' ) >= 0, 'toString parameter includes all values of an array query parameter' );
+       assert.equal( uri.toString().length, 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
 
        // Remove query values
        uri.query.m.splice( 0, 1 );
        delete uri.query.n;
 
-       equal( uri.toString(), 'http://www.example.com/dir/?m=bar', 'deletion properties' );
+       assert.equal( uri.toString(), 'http://www.example.com/dir/?m=bar', 'deletion properties' );
 
        // Remove more query values, leaving an empty array
        uri.query.m.splice( 0, 1 );
-       equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
+       assert.equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
 } );
 
-test( 'All-dressed URI with everything', function () {
+QUnit.test( 'All-dressed URI with everything', 11, function ( assert ) {
        var uri, queryString, relativePath;
-       expect( 11 );
 
        uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
 
-       deepEqual(
+       assert.deepEqual(
                {
                        protocol: uri.protocol,
                        user: uri.user,
@@ -209,51 +190,55 @@ test( 'All-dressed URI with everything', function () {
                'basic object properties'
        );
 
-       equal( uri.getUserInfo(), 'auth', 'user info' );
+       assert.equal( uri.getUserInfo(), 'auth', 'user info' );
 
-       equal( uri.getAuthority(), 'auth@www.example.com:81', 'authority equal to auth@hostport' );
+       assert.equal( uri.getAuthority(), 'auth@www.example.com:81', 'authority equal to auth@hostport' );
 
-       equal( uri.getHostPort(), 'www.example.com:81', 'hostport equal to host:port' );
+       assert.equal( uri.getHostPort(), 'www.example.com:81', 'hostport equal to host:port' );
 
        queryString = uri.getQueryString();
-       ok( queryString.indexOf( 'q1=0' ) >= 0, 'query param with numbers' );
-       ok( queryString.indexOf( 'test1' ) >= 0, 'query param with null value is included' );
-       ok( queryString.indexOf( 'test1=' ) === -1, 'query param with null value does not generate equals sign' );
-       ok( queryString.indexOf( 'test2=value+%28escaped%29' ) >= 0, 'query param is url escaped' );
+       assert.ok( queryString.indexOf( 'q1=0' ) >= 0, 'query param with numbers' );
+       assert.ok( queryString.indexOf( 'test1' ) >= 0, 'query param with null value is included' );
+       assert.ok( queryString.indexOf( 'test1=' ) === -1, 'query param with null value does not generate equals sign' );
+       assert.ok( queryString.indexOf( 'test2=value+%28escaped%29' ) >= 0, 'query param is url escaped' );
 
        relativePath = uri.getRelativePath();
-       ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
-       ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
-       ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' );
+       assert.ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
+       assert.ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
+       assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' );
 } );
 
-test( 'Cloning', function () {
+QUnit.test( 'Cloning', 6, function ( assert ) {
        var original, clone;
-       expect( 5 );
 
-       original = new mw.Uri( 'http://en.wiki.local/w/api.php?action=query&foo=bar' );
+       original = new mw.Uri( 'http://foo.example.org/index.php?one=1&two=2' );
        clone = original.clone();
 
-       deepEqual( clone, original, 'clone has equivalent properties' );
-       equal( original.toString(), clone.toString(), 'toString matches original' );
+       assert.deepEqual( clone, original, 'clone has equivalent properties' );
+       assert.equal( original.toString(), clone.toString(), 'toString matches original' );
 
-       notStrictEqual( clone, original, 'clone is not the same when compared by reference' );
+       assert.notStrictEqual( clone, original, 'clone is a different object when compared by reference' );
 
-       clone.host = 'fr.wiki.local';
-       notEqual( original.host, clone.host, 'manipulating clone did not effect original' );
-       notEqual( original.toString(), clone.toString(), 'toString no longer matches original' );
-} );
+       clone.host = 'bar.example.org';
+       assert.notEqual( original.host, clone.host, 'manipulating clone did not effect original' );
+       assert.notEqual( original.toString(), clone.toString(), 'Stringified url no longer matches original' );
 
-test( 'Constructing mw.Uri from plain object', function () {
-       var uri;
-       expect( 3 );
+       clone.query.three = 3;
 
-       uri = new mw.Uri({
+       assert.deepEqual(
+               original.query,
+               { 'one': '1', 'two': '2' },
+               'Properties is deep cloned (bug 37708)'
+       );
+} );
+
+QUnit.test( 'Constructing mw.Uri from plain object', 3, function ( assert ) {
+       var uri = new mw.Uri({
                protocol: 'http',
                host: 'www.foo.local',
                path: '/this'
        });
-       equal( uri.toString(), 'http://www.foo.local/this', 'Basic properties' );
+       assert.equal( uri.toString(), 'http://www.foo.local/this', 'Basic properties' );
 
        uri = new mw.Uri({
                protocol: 'http',
@@ -262,9 +247,9 @@ test( 'Constructing mw.Uri from plain object', function () {
                query: { hi: 'there' },
                fragment: 'blah'
        });
-       equal( uri.toString(), 'http://www.foo.local/this?hi=there#blah', 'More complex properties' );
+       assert.equal( uri.toString(), 'http://www.foo.local/this?hi=there#blah', 'More complex properties' );
 
-       raises(
+       assert.throws(
                function () {
                        var uri = new mw.Uri({
                                protocol: 'http',
@@ -278,87 +263,64 @@ test( 'Constructing mw.Uri from plain object', function () {
        );
 } );
 
-test( 'Manipulate properties', function () {
+QUnit.test( 'Manipulate properties', 8, function ( assert ) {
        var uriBase, uri;
-       expect( 8 );
 
        uriBase = new mw.Uri( 'http://en.wiki.local/w/api.php' );
 
        uri = uriBase.clone();
        uri.fragment = 'frag';
-       equal( uri.toString(), 'http://en.wiki.local/w/api.php#frag', 'add a fragment' );
+       assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php#frag', 'add a fragment' );
 
        uri = uriBase.clone();
        uri.host = 'fr.wiki.local';
        uri.port = '8080';
-       equal( uri.toString(), 'http://fr.wiki.local:8080/w/api.php', 'change host and port' );
+       assert.equal( uri.toString(), 'http://fr.wiki.local:8080/w/api.php', 'change host and port' );
 
        uri = uriBase.clone();
        uri.query.foo = 'bar';
-       equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'add query arguments' );
+       assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'add query arguments' );
 
        delete uri.query.foo;
-       equal( uri.toString(), 'http://en.wiki.local/w/api.php', 'delete query arguments' );
+       assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php', 'delete query arguments' );
 
        uri = uriBase.clone();
        uri.query.foo = 'bar';
-       equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'extend query arguments' );
+       assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'extend query arguments' );
        uri.extend({
                foo: 'quux',
                pif: 'paf'
        });
-       ok( uri.toString().indexOf( 'foo=quux' ) >= 0, 'extend query arguments' );
-       ok( uri.toString().indexOf( 'foo=bar' ) === -1, 'extend query arguments' );
-       ok( uri.toString().indexOf( 'pif=paf' ) >= 0 , 'extend query arguments' );
+       assert.ok( uri.toString().indexOf( 'foo=quux' ) >= 0, 'extend query arguments' );
+       assert.ok( uri.toString().indexOf( 'foo=bar' ) === -1, 'extend query arguments' );
+       assert.ok( uri.toString().indexOf( 'pif=paf' ) >= 0 , 'extend query arguments' );
 } );
 
-test( 'Handle protocol-relative URLs', function () {
+QUnit.test( 'Handle protocol-relative URLs', 5, function ( assert ) {
        var UriRel, uri;
-       expect( 5 );
 
        UriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
 
        uri = new UriRel( '//en.wiki.local/w/api.php' );
-       equal( uri.protocol, 'glork', 'create protocol-relative URLs with same protocol as document' );
+       assert.equal( uri.protocol, 'glork', 'create protocol-relative URLs with same protocol as document' );
 
        uri = new UriRel( '/foo.com' );
-       equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in loose mode' );
+       assert.equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in loose mode' );
 
        uri = new UriRel( 'http:/foo.com' );
-       equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in loose mode' );
+       assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in loose mode' );
 
        uri = new UriRel( '/foo.com', true );
-       equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in strict mode' );
+       assert.equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in strict mode' );
 
        uri = new UriRel( 'http:/foo.com', true );
-       equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
+       assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
 } );
 
-test( 'Bad calls', function () {
+QUnit.test( 'Bad calls', 3, function ( assert ) {
        var uri;
-       expect( 5 );
 
-       raises(
-               function () {
-                       new mw.Uri();
-               },
-               function ( e ) {
-                       return e.message === 'Bad constructor arguments';
-               },
-               'throw error on no arguments to constructor'
-       );
-
-       raises(
-               function () {
-                       new mw.Uri( '' );
-               },
-               function ( e ) {
-                       return e.message === 'Bad constructor arguments';
-               },
-               'throw error on empty string as argument to constructor'
-       );
-
-       raises(
+       assert.throws(
                function () {
                        new mw.Uri( 'glaswegian penguins' );
                },
@@ -368,7 +330,7 @@ test( 'Bad calls', function () {
                'throw error on non-URI as argument to constructor'
        );
 
-       raises(
+       assert.throws(
                function () {
                        new mw.Uri( 'foo.com/bar/baz', {
                                strictMode: true
@@ -383,12 +345,10 @@ test( 'Bad calls', function () {
        uri = new mw.Uri( 'foo.com/bar/baz', {
                strictMode: false
        });
-       equal( uri.toString(), 'http://foo.com/bar/baz', 'normalize URI without protocol or // in loose mode' );
+       assert.equal( uri.toString(), 'http://foo.com/bar/baz', 'normalize URI without protocol or // in loose mode' );
 });
 
-test( 'bug 35658', function () {
-       expect( 2 );
-
+QUnit.test( 'bug 35658', 2, function ( assert ) {
        var testProtocol, testServer, testPort, testPath, UriClass, uri, href;
 
        testProtocol = 'https://';
@@ -399,11 +359,30 @@ test( 'bug 35658', function () {
        UriClass = mw.UriRelative( testProtocol + testServer + '/some/path/index.html' );
        uri = new UriClass( testPath );
        href = uri.toString();
-       equal( href, testProtocol + testServer + testPath, 'Root-relative URL gets host & protocol supplied' );
+       assert.equal( href, testProtocol + testServer + testPath, 'Root-relative URL gets host & protocol supplied' );
 
        UriClass = mw.UriRelative( testProtocol + testServer + ':' + testPort + '/some/path.php' );
        uri = new UriClass( testPath );
        href = uri.toString();
-       equal( href, testProtocol + testServer + ':' + testPort + testPath, 'Root-relative URL gets host, protocol, and port supplied' );
+       assert.equal( href, testProtocol + testServer + ':' + testPort + testPath, 'Root-relative URL gets host, protocol, and port supplied' );
+
+} );
+
+QUnit.test( 'Constructor falls back to default location', 4, function ( assert ) {
+       var testuri, MyUri, uri;
+
+       testuri = 'http://example.org/w/index.php';
+       MyUri = mw.UriRelative( testuri );
+
+       uri = new MyUri();
+       assert.equal( uri.toString(), testuri, 'no arguments' );
+
+       uri = new MyUri( undefined );
+       assert.equal( uri.toString(), testuri, 'undefined' );
+
+       uri = new MyUri( null );
+       assert.equal( uri.toString(), testuri, 'null' );
 
+       uri = new MyUri( '' );
+       assert.equal( uri.toString(), testuri, 'empty string' );
 } );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js
new file mode 100644 (file)
index 0000000..09a11b0
--- /dev/null
@@ -0,0 +1,67 @@
+module( 'mediawiki.cldr' );
+
+test( '-- Initial check', function() {
+       expect( 1 );
+       ok( mw.cldr, 'mw.cldr defined' );
+} );
+
+var pluralTestcases = {
+       /*
+        * Sample:
+        *"languagecode" : [
+        *      [ number, [ "form1", "form2", ... ],  "expected", "description" ],
+        * ]
+        */
+       "en": [
+               [ 0, [ "one", "other" ], "other", "English plural test- 0 is other" ],
+               [ 1, [ "one", "other" ], "one", "English plural test- 1 is one" ]
+       ],
+       "hi": [
+               [ 0, [ "one", "other" ], "one", "Hindi plural test- 0 is one" ],
+               [ 1, [ "one", "other" ], "one", "Hindi plural test- 1 is one" ],
+               [ 2, [ "one", "other" ], "other", "Hindi plural test- 2 is other" ]
+       ],
+       "he": [
+               [ 0, [ "one", "other" ], "other", "Hebrew plural test- 0 is other" ],
+               [ 1, [ "one", "other" ], "one", "Hebrew plural test- 1 is one" ],
+               [ 2, [ "one", "other" ], "other", "Hebrew plural test- 2 is other with 2 forms" ],
+               [ 2, [ "one", "dual", "other" ], "dual", "Hebrew plural test- 2 is dual with 3 forms" ]
+       ],
+       "ar": [
+               [ 0, [ "zero", "one", "two", "few", "many", "other" ], "zero", "Arabic plural test - 0 is zero" ],
+               [ 1, [ "zero", "one", "two", "few", "many", "other" ], "one", "Arabic plural test - 1 is one" ],
+               [ 2, [ "zero", "one", "two", "few", "many", "other" ], "two", "Arabic plural test - 2 is two" ],
+               [ 3, [ "zero", "one", "two", "few", "many", "other" ], "few", "Arabic plural test - 3 is few" ],
+               [ 9, [ "zero", "one", "two", "few", "many", "other" ], "few", "Arabic plural test - 9 is few" ],
+               [ "9", [ "zero", "one", "two", "few", "many", "other" ], "few", "Arabic plural test - 9 is few" ],
+               [ 110, [ "zero", "one", "two", "few", "many", "other" ], "few", "Arabic plural test - 110 is few" ],
+               [ 11, [ "zero", "one", "two", "few", "many", "other" ], "many", "Arabic plural test - 11 is many" ],
+               [ 15, [ "zero", "one", "two", "few", "many", "other" ], "many", "Arabic plural test - 15 is many" ],
+               [ 99, [ "zero", "one", "two", "few", "many", "other" ], "many", "Arabic plural test - 99 is many" ],
+               [ 9999, [ "zero", "one", "two", "few", "many", "other" ], "many", "Arabic plural test - 9999 is many" ],
+               [ 100, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 100 is other" ],
+               [ 102, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 102 is other" ],
+               [ 1000, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 1000 is other" ]
+               // FIXME plural rules for decimal numbers does not work
+               // [ 1.7, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 1.7 is other" ],
+       ]
+};
+
+function pluralTest( langCode, tests ) {
+       QUnit.test('-- Plural Test for ' + langCode, function( assert ) {
+               QUnit.expect( tests.length );
+               for ( var i = 0; i < tests.length; i++ ) {
+                       assert.equal(
+                               mw.language.convertPlural( tests[i][0], tests[i][1] ),
+                               tests[i][2], // Expected plural form
+                               tests[i][3] // Description
+                       );
+               }
+       } );
+}
+
+$.each( pluralTestcases, function( langCode, tests ) {
+       if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
+               pluralTest( langCode, tests );
+       }
+} );
index 2abe016..b8193a9 100644 (file)
@@ -1,55 +1,97 @@
-module( 'mediawiki.jqueryMsg' );
+QUnit.module( 'mediawiki.jqueryMsg' );
 
-test( '-- Initial check', function() {
-       expect( 1 );
-       ok( mw.jqueryMsg, 'mw.jqueryMsg defined' );
-} );
-
-test( 'mw.jqueryMsg Plural', function() {
-       expect( 5 );
+QUnit.test( 'mw.jqueryMsg Plural', 3, function ( assert ) {
        var parser = mw.jqueryMsg.getMessageFunction();
-       ok( parser, 'Parser Function initialized' );
-       ok( mw.messages.set( 'plural-msg', 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
-       equal( parser( 'plural-msg', 0 ) , 'Found 0 items', 'Plural test for english with zero as count' );
-       equal( parser( 'plural-msg', 1 ) , 'Found 1 item', 'Singular test for english' );
-       equal( parser( 'plural-msg', 2 ) , 'Found 2 items', 'Plural test for english' );
+
+       mw.messages.set( 'plural-msg', 'Found $1 {{PLURAL:$1|item|items}}' );
+       assert.equal( parser( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
+       assert.equal( parser( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
+       assert.equal( parser( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
 } );
 
 
-test( 'mw.jqueryMsg Gender', function() {
-       expect( 16 );
-       //TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
-       var user = mw.user;
+QUnit.test( 'mw.jqueryMsg Gender', 11, function ( assert ) {
+       // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
+       // TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
+       var user = mw.user,
+               parser = mw.jqueryMsg.getMessageFunction();
+
+       // The values here are not significant,
+       // what matters is which of the values is choosen by the parser
+       mw.messages.set( 'gender-msg', '$1: {{GENDER:$2|blue|pink|green}}' );
+
        user.options.set( 'gender', 'male' );
-       var parser = mw.jqueryMsg.getMessageFunction();
-       ok( parser, 'Parser Function initialized' );
-       //TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
-       ok( mw.messages.set( 'gender-msg', '$1 reverted {{GENDER:$2|his|her|their}} last edit' ), 'mw.messages.set: Register' );
-       equal( parser( 'gender-msg', 'Bob', 'male' ) , 'Bob reverted his last edit', 'Gender masculine' );
-       equal( parser( 'gender-msg', 'Bob', user ) , 'Bob reverted his last edit', 'Gender masculine' );
+       assert.equal(
+               parser( 'gender-msg', 'Bob', 'male' ),
+               'Bob: blue',
+               'Masculine from string "male"'
+       );
+       assert.equal(
+               parser( 'gender-msg', 'Bob', user ),
+               'Bob: blue',
+               'Masculine from mw.user object'
+       );
+
        user.options.set( 'gender', 'unknown' );
-       equal( parser( 'gender-msg', 'They', user ) , 'They reverted their last edit', 'Gender neutral or unknown' );
-       equal( parser( 'gender-msg', 'Alice', 'female' ) , 'Alice reverted her last edit', 'Gender feminine' );
-       equal( parser( 'gender-msg', 'User' ) , 'User reverted their last edit', 'Gender neutral' );
-       equal( parser( 'gender-msg', 'User', 'unknown' ) , 'User reverted their last edit', 'Gender neutral' );
-       ok( mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}} reverted last $2 {{PLURAL:$2|edit|edits}}' ), 'mw.messages.set: Register' );
-       equal( parser( 'gender-msg-one-form', 'male', 10 ) , 'User reverted last 10 edits', 'Gender neutral and plural form' );
-       equal( parser( 'gender-msg-one-form', 'female', 1 ) , 'User reverted last 1 edit', 'Gender neutral and singular form' );
-       ok( mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' ), 'mw.messages.set: Register' );
-       equal( parser( 'gender-msg-lowercase', 'male' ) , 'he is awesome', 'Gender masculine' );
-       equal( parser( 'gender-msg-lowercase', 'female' ) , 'she is awesome', 'Gender feminine' );
-       ok( mw.messages.set( 'gender-msg-wrong', '{{gender}} is awesome' ), 'mw.messages.set: Register' );
-       equal( parser( 'gender-msg-wrong', 'female' ) , ' is awesome', 'Wrong syntax used, but ignore the {{gender}}' );
+       assert.equal(
+               parser( 'gender-msg', 'Foo', user ),
+               'Foo: green',
+               'Neutral from mw.user object' );
+       assert.equal(
+               parser( 'gender-msg', 'Alice', 'female' ),
+               'Alice: pink',
+               'Feminine from string "female"' );
+       assert.equal(
+               parser( 'gender-msg', 'User' ),
+               'User: green',
+               'Neutral when no parameter given' );
+       assert.equal(
+               parser( 'gender-msg', 'User', 'unknown' ),
+               'User: green',
+               'Neutral from string "unknown"'
+       );
+
+       mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}}: $2 {{PLURAL:$2|edit|edits}}' );
+
+       assert.equal(
+               parser( 'gender-msg-one-form', 'male', 10 ),
+               'User: 10 edits',
+               'Gender neutral and plural form'
+       );
+       assert.equal(
+               parser( 'gender-msg-one-form', 'female', 1 ),
+               'User: 1 edit',
+               'Gender neutral and singular form'
+       );
+
+       mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' );
+       assert.equal(
+               parser( 'gender-msg-lowercase', 'male' ),
+               'he is awesome',
+               'Gender masculine'
+       );
+       assert.equal(
+               parser( 'gender-msg-lowercase', 'female' ),
+               'she is awesome',
+               'Gender feminine'
+       );
+
+       mw.messages.set( 'gender-msg-wrong', '{{gender}} test' );
+       assert.equal(
+               parser( 'gender-msg-wrong', 'female' ),
+               ' test',
+               'Invalid syntax should result in {{gender}} simply being stripped away'
+       );
 } );
 
 
-test( 'mw.jqueryMsg Grammar', function() {
-       expect( 5 );
+QUnit.test( 'mw.jqueryMsg Grammar', 2, function ( assert ) {
        var parser = mw.jqueryMsg.getMessageFunction();
-       ok( parser, 'Parser Function initialized' );
-       // Hope the grammar form grammar_case_foo is not valid in any language
-       ok( mw.messages.set( 'grammar-msg', 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}' ), 'mw.messages.set: Register' );
-       equal( parser( 'grammar-msg' ) , 'Przeszukaj ' + mw.config.get( 'wgSiteName' ) , 'Grammar Test with sitename' );
-       ok( mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' ), 'mw.messages.set: Register' );
-       equal( parser( 'grammar-msg-wrong-syntax' ) , 'Przeszukaj ' , 'Grammar Test with wrong grammar template syntax' );
+
+       // Assume the grammar form grammar_case_foo is not valid in any language
+       mw.messages.set( 'grammar-msg', 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}' );
+       assert.equal( parser( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
+
+       mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
+       assert.equal( parser( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ' , 'Grammar Test with wrong grammar template syntax' );
 } );
index 24005b6..2baa4f3 100644 (file)
@@ -1,24 +1,24 @@
 /* Some misc JavaScript compatibility tests, just to make sure the environments we run in are consistent */
 
-module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
+QUnit.module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
 
-test( 'Variable with Unicode letter in name', function() {
-       expect(3);
+QUnit.test( 'Variable with Unicode letter in name', 3, function ( assert ) {
        var orig = "some token";
        var ŝablono = orig;
-       deepEqual( ŝablono, orig, 'ŝablono' );
-       deepEqual( \u015dablono, orig, '\\u015dablono' );
-       deepEqual( \u015Dablono, orig, '\\u015Dablono' );
+
+       assert.deepEqual( ŝablono, orig, 'ŝablono' );
+       assert.deepEqual( \u015dablono, orig, '\\u015dablono' );
+       assert.deepEqual( \u015Dablono, orig, '\\u015Dablono' );
 });
 
 /*
 // Not that we need this. ;)
 // This fails on IE 6-8
 // Works on IE 9, Firefox 6, Chrome 14
-test( 'Keyword workaround: "if" as variable name using Unicode escapes', function() {
+QUnit.test( 'Keyword workaround: "if" as variable name using Unicode escapes', function ( assert ) {
        var orig = "another token";
        \u0069\u0066 = orig;
-       deepEqual( \u0069\u0066, orig, '\\u0069\\u0066' );
+       assert.deepEqual( \u0069\u0066, orig, '\\u0069\\u0066' );
 });
 */
 
@@ -26,37 +26,37 @@ test( 'Keyword workaround: "if" as variable name using Unicode escapes', functio
 // Not that we need this. ;)
 // This fails on IE 6-9
 // Works on Firefox 6, Chrome 14
-test( 'Keyword workaround: "if" as member variable name using Unicode escapes', function() {
+QUnit.test( 'Keyword workaround: "if" as member variable name using Unicode escapes', function ( assert ) {
        var orig = "another token";
        var foo = {};
        foo.\u0069\u0066 = orig;
-       deepEqual( foo.\u0069\u0066, orig, 'foo.\\u0069\\u0066' );
+       assert.deepEqual( foo.\u0069\u0066, orig, 'foo.\\u0069\\u0066' );
 });
 */
 
-test( 'Stripping of single initial newline from textarea\'s literal contents (bug 12130)', function() {
+QUnit.test( 'Stripping of single initial newline from textarea\'s literal contents (bug 12130)', function ( assert ) {
        var maxn = 4;
-       expect(maxn * 2);
+       QUnit.expect( maxn * 2 );
 
-       var repeat = function(str, n) {
-               if (n <= 0) {
+       function repeat( str, n ) {
+               if ( n <= 0 ) {
                        return '';
                } else {
-                       var out = Array(n);
-                       for (var i = 0; i < n; i++) {
+                       var out = new Array(n);
+                       for ( var i = 0; i < n; i++ ) {
                                out[i] = str;
                        }
                        return out.join('');
                }
-       };
+       }
 
-       for (var n = 0; n < maxn; n++) {
+       for ( var n = 0; n < maxn; n++ ) {
                var expected = repeat('\n', n) + 'some text';
 
                var $textarea = $('<textarea>\n' + expected + '</textarea>');
-               equal($textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + (n + 1) + ')');
+               assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + (n + 1) + ')' );
 
                var $textarea2 = $('<textarea>').val(expected);
-               equal($textarea2.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')');
+               assert.equal( $textarea2.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')' );
        }
 });
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
new file mode 100644 (file)
index 0000000..5d67a6e
--- /dev/null
@@ -0,0 +1,395 @@
+var liveLangData = mw.language.data.values;
+QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment({
+       setup: function () {
+               // New independent copy for this test
+               mw.language.data = $.extend( {}, liveLangData, true );
+       },
+       teardown: function () {
+               // Restore original
+               mw.language.data = liveLangData;
+       }
+}) );
+
+QUnit.test( 'mw.language getData and setData', function ( assert ) {
+       QUnit.expect( 2 );
+
+       mw.language.setData( 'en', 'testkey', 'testvalue' );
+       assert.equal(  mw.language.getData( 'en', 'testkey' ), 'testvalue', 'Getter setter test for mw.language' );
+       assert.equal(  mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
+} );
+
+function grammarTest( langCode, test ) {
+       // The test works only if the content language is opt.language
+       // because it requires [lang].js to be loaded.
+       QUnit.test( 'Grammar test for lang=' + langCode, function ( assert ) {
+               QUnit.expect( test.length );
+
+               for ( var i = 0 ; i < test.length; i++ ) {
+                       assert.equal(
+                               mw.language.convertGrammar( test[i].word, test[i].grammarForm ),
+                               test[i].expected,
+                               test[i].description
+                       );
+               }
+       });
+}
+
+var grammarTests = {
+       bs: [
+               {
+                       word: 'word',
+                       grammarForm: 'instrumental',
+                       expected: 's word',
+                       description: 'Grammar test for instrumental case'
+               },
+               {
+                       word: 'word',
+                       grammarForm: 'lokativ',
+                       expected: 'o word',
+                       description: 'Grammar test for lokativ case'
+               }
+       ],
+
+       he: [
+               {
+                       word: "ויקיפדיה",
+                       grammarForm: 'prefixed',
+                       expected: "וויקיפדיה",
+                       description: 'Duplicate the "Waw" if prefixed'
+               },
+               {
+                       word: "וולפגנג",
+                       grammarForm: 'prefixed',
+                       expected: "וולפגנג",
+                       description: 'Duplicate the "Waw" if prefixed, but not if it is already duplicated.'
+               },
+               {
+                       word: "הקובץ",
+                       grammarForm: 'prefixed',
+                       expected: "קובץ",
+                       description: 'Remove the "He" if prefixed'
+               },
+               {
+                       word: 'Wikipedia',
+                       grammarForm: 'תחילית',
+                       expected: '־Wikipedia',
+                       description: 'GAdd a hyphen (maqaf) before non-Hebrew letters'
+               },
+               {
+                       word: '1995',
+                       grammarForm: 'תחילית',
+                       expected: '־1995',
+                       description: 'Add a hyphen (maqaf) before numbers'
+               }
+       ],
+
+       hsb: [
+               {
+                       word: 'word',
+                       grammarForm: 'instrumental',
+                       expected: 'z word',
+                       description: 'Grammar test for instrumental case'
+               },
+               {
+                       word: 'word',
+                       grammarForm: 'lokatiw',
+                       expected: 'wo word',
+                       description: 'Grammar test for lokatiw case'
+               }
+       ],
+
+       dsb: [
+               {
+                       word: 'word',
+                       grammarForm: 'instrumental',
+                       expected: 'z word',
+                       description: 'Grammar test for instrumental case'
+               },
+               {
+                       word: 'word',
+                       grammarForm: 'lokatiw',
+                       expected: 'wo word',
+                       description: 'Grammar test for lokatiw case'
+               }
+       ],
+
+       hy: [
+               {
+                       word: 'Մաունա',
+                       grammarForm: 'genitive',
+                       expected: 'Մաունայի',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'հետո',
+                       grammarForm: 'genitive',
+                       expected: 'հետոյի',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'գիրք',
+                       grammarForm: 'genitive',
+                       expected: 'գրքի',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'ժամանակի',
+                       grammarForm: 'genitive',
+                       expected: 'ժամանակիի',
+                       description: 'Grammar test for genitive case'
+               }
+       ],
+
+       fi: [
+               {
+                       word: 'talo',
+                       grammarForm: 'genitive',
+                       expected: 'talon',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'linux',
+                       grammarForm: 'genitive',
+                       expected: 'linuxin',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'talo',
+                       grammarForm: 'elative',
+                       expected: 'talosta',
+                       description: 'Grammar test for elative case'
+               },
+               {
+                       word: 'pastöroitu',
+                       grammarForm: 'partitive',
+                       expected: 'pastöroitua',
+                       description: 'Grammar test for partitive case'
+               },
+               {
+                       word: 'talo',
+                       grammarForm: 'partitive',
+                       expected: 'taloa',
+                       description: 'Grammar test for partitive case'
+               },
+               {
+                       word: 'talo',
+                       grammarForm: 'illative',
+                       expected: 'taloon',
+                       description: 'Grammar test for illative case'
+               },
+               {
+                       word: 'linux',
+                       grammarForm: 'inessive',
+                       expected: 'linuxissa',
+                       description: 'Grammar test for inessive case'
+               }
+       ],
+
+       ru: [
+               {
+                       word: 'тесть',
+                       grammarForm: 'genitive',
+                       expected: 'тестя',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'привилегия',
+                       grammarForm: 'genitive',
+                       expected: 'привилегии',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'установка',
+                       grammarForm: 'genitive',
+                       expected: 'установки',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'похоти',
+                       grammarForm: 'genitive',
+                       expected: 'похотей',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'доводы',
+                       grammarForm: 'genitive',
+                       expected: 'доводов',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'песчаник',
+                       grammarForm: 'genitive',
+                       expected: 'песчаника',
+                       description: 'Grammar test for genitive case'
+               }
+       ],
+
+
+       hu: [
+               {
+                       word: 'Wikipédiá',
+                       grammarForm: 'rol',
+                       expected: 'Wikipédiáról',
+                       description: 'Grammar test for rol case'
+               },
+               {
+                       word: 'Wikipédiá',
+                       grammarForm: 'ba',
+                       expected: 'Wikipédiába',
+                       description: 'Grammar test for ba case'
+               },
+               {
+                       word: 'Wikipédiá',
+                       grammarForm: 'k',
+                       expected: 'Wikipédiák',
+                       description: 'Grammar test for k case'
+               }
+       ],
+
+       ga: [
+               {
+                       word: 'an Domhnach',
+                       grammarForm: 'ainmlae',
+                       expected: 'Dé Domhnaigh',
+                       description: 'Grammar test for ainmlae case'
+               },
+               {
+                       word: 'an Luan',
+                       grammarForm: 'ainmlae',
+                       expected: 'Dé Luain',
+                       description: 'Grammar test for ainmlae case'
+               },
+               {
+                       word: 'an Satharn',
+                       grammarForm: 'ainmlae',
+                       expected: 'Dé Sathairn',
+                       description: 'Grammar test for ainmlae case'
+               }
+       ],
+
+       uk: [
+               {
+                       word: 'тесть',
+                       grammarForm: 'genitive',
+                       expected: 'тестя',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'Вікіпедія',
+                       grammarForm: 'genitive',
+                       expected: 'Вікіпедії',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'установка',
+                       grammarForm: 'genitive',
+                       expected: 'установки',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'похоти',
+                       grammarForm: 'genitive',
+                       expected: 'похотей',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'доводы',
+                       grammarForm: 'genitive',
+                       expected: 'доводов',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'песчаник',
+                       grammarForm: 'genitive',
+                       expected: 'песчаника',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'Вікіпедія',
+                       grammarForm: 'accusative',
+                       expected: 'Вікіпедію',
+                       description: 'Grammar test for accusative case'
+               }
+       ],
+
+       sl: [
+               {
+                       word: 'word',
+                       grammarForm: 'orodnik',
+                       expected: 'z word',
+                       description: 'Grammar test for orodnik case'
+               },
+               {
+                       word: 'word',
+                       grammarForm: 'mestnik',
+                       expected: 'o word',
+                       description: 'Grammar test for mestnik case'
+               }
+       ],
+
+       os: [
+               {
+                       word: 'бæстæ',
+                       grammarForm: 'genitive',
+                       expected: 'бæсты',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'бæстæ',
+                       grammarForm: 'allative',
+                       expected: 'бæстæм',
+                       description: 'Grammar test for allative case'
+               },
+               {
+                       word: 'Тигр',
+                       grammarForm: 'dative',
+                       expected: 'Тигрæн',
+                       description: 'Grammar test for dative case'
+               },
+               {
+                       word: 'цъити',
+                       grammarForm: 'dative',
+                       expected: 'цъитийæн',
+                       description: 'Grammar test for dative case'
+               },
+               {
+                       word: 'лæппу',
+                       grammarForm: 'genitive',
+                       expected: 'лæппуйы',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: '2011',
+                       grammarForm: 'equative',
+                       expected: '2011-ау',
+                       description: 'Grammar test for equative case'
+               }
+       ],
+
+       la: [
+               {
+                       word: 'Translatio',
+                       grammarForm: 'genitive',
+                       expected: 'Translationis',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'Translatio',
+                       grammarForm: 'accusative',
+                       expected: 'Translationem',
+                       description: 'Grammar test for accusative case'
+               },
+               {
+                       word: 'Translatio',
+                       grammarForm: 'ablative',
+                       expected: 'Translatione',
+                       description: 'Grammar test for ablative case'
+               }
+       ]
+};
+
+$.each( grammarTests, function ( langCode, test ) {
+       if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
+               grammarTest( langCode, test );
+       }
+});
index 2f11521..58e56ad 100644 (file)
@@ -1,24 +1,21 @@
-module( 'mediawiki', QUnit.newMwEnvironment() );
-
-test( '-- Initial check', function() {
-       expect(8);
-
-       ok( window.jQuery, 'jQuery defined' );
-       ok( window.$, '$j defined' );
-       ok( window.$j, '$j defined' );
-       strictEqual( window.$, window.jQuery, '$ alias to jQuery' );
-       strictEqual( window.$j, window.jQuery, '$j alias to jQuery' );
-
-       ok( window.mediaWiki, 'mediaWiki defined' );
-       ok( window.mw, 'mw defined' );
-       strictEqual( window.mw, window.mediaWiki, 'mw alias to mediaWiki' );
+QUnit.module( 'mediawiki', QUnit.newMwEnvironment() );
+
+QUnit.test( '-- Initial check', 8, function ( assert ) {
+       assert.ok( window.jQuery, 'jQuery defined' );
+       assert.ok( window.$, '$j defined' );
+       assert.ok( window.$j, '$j defined' );
+       assert.strictEqual( window.$, window.jQuery, '$ alias to jQuery' );
+       assert.strictEqual( window.$j, window.jQuery, '$j alias to jQuery' );
+
+       assert.ok( window.mediaWiki, 'mediaWiki defined' );
+       assert.ok( window.mw, 'mw defined' );
+       assert.strictEqual( window.mw, window.mediaWiki, 'mw alias to mediaWiki' );
 });
 
-test( 'mw.Map', function() {
+QUnit.test( 'mw.Map', 17, function ( assert ) {
        var arry, conf, funky, globalConf, nummy, someValues;
-       expect(17);
 
-       ok( mw.Map, 'mw.Map defined' );
+       assert.ok( mw.Map, 'mw.Map defined' );
 
        conf = new mw.Map();
        // Dummy variables
@@ -27,14 +24,14 @@ test( 'mw.Map', function() {
        nummy = 7;
 
        // Tests for input validation
-       strictEqual( conf.get( 'inexistantKey' ), null, 'Map.get returns null if selection was a string and the key was not found' );
-       strictEqual( conf.set( 'myKey', 'myValue' ), true, 'Map.set returns boolean true if a value was set for a valid key string' );
-       strictEqual( conf.set( funky, 'Funky' ), false, 'Map.set returns boolean false if key was invalid (Function)' );
-       strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
-       strictEqual( conf.set( nummy, 'Nummy' ), false, 'Map.set returns boolean false if key was invalid (Number)' );
-       equal( conf.get( 'myKey' ), 'myValue', 'Map.get returns a single value value correctly' );
-       strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
-       strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
+       assert.strictEqual( conf.get( 'inexistantKey' ), null, 'Map.get returns null if selection was a string and the key was not found' );
+       assert.strictEqual( conf.set( 'myKey', 'myValue' ), true, 'Map.set returns boolean true if a value was set for a valid key string' );
+       assert.strictEqual( conf.set( funky, 'Funky' ), false, 'Map.set returns boolean false if key was invalid (Function)' );
+       assert.strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
+       assert.strictEqual( conf.set( nummy, 'Nummy' ), false, 'Map.set returns boolean false if key was invalid (Number)' );
+       assert.equal( conf.get( 'myKey' ), 'myValue', 'Map.get returns a single value value correctly' );
+       assert.strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
+       assert.strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
 
        // Multiple values at once
        someValues = {
@@ -42,31 +39,31 @@ test( 'mw.Map', function() {
                'lorem': 'ipsum',
                'MediaWiki': true
        };
-       strictEqual( conf.set( someValues ), true, 'Map.set returns boolean true if multiple values were set by passing an object' );
-       deepEqual( conf.get( ['foo', 'lorem'] ), {
+       assert.strictEqual( conf.set( someValues ), true, 'Map.set returns boolean true if multiple values were set by passing an object' );
+       assert.deepEqual( conf.get( ['foo', 'lorem'] ), {
                'foo': 'bar',
                'lorem': 'ipsum'
        }, 'Map.get returns multiple values correctly as an object' );
 
-       deepEqual( conf.get( ['foo', 'notExist'] ), {
+       assert.deepEqual( conf.get( ['foo', 'notExist'] ), {
                'foo': 'bar',
                'notExist': null
        }, 'Map.get return includes keys that were not found as null values' );
 
-       strictEqual( conf.exists( 'foo' ), true, 'Map.exists returns boolean true if a key exists' );
-       strictEqual( conf.exists( 'notExist' ), false, 'Map.exists returns boolean false if a key does not exists' );
+       assert.strictEqual( conf.exists( 'foo' ), true, 'Map.exists returns boolean true if a key exists' );
+       assert.strictEqual( conf.exists( 'notExist' ), false, 'Map.exists returns boolean false if a key does not exists' );
 
        // Interacting with globals and accessing the values object
-       strictEqual( conf.get(), conf.values, 'Map.get returns the entire values object by reference (if called without arguments)' );
+       assert.strictEqual( conf.get(), conf.values, 'Map.get returns the entire values object by reference (if called without arguments)' );
 
        conf.set( 'globalMapChecker', 'Hi' );
 
-       ok( false === 'globalMapChecker' in window, 'new mw.Map did not store its values in the global window object by default' );
+       assert.ok( false === 'globalMapChecker' in window, 'new mw.Map did not store its values in the global window object by default' );
 
        globalConf = new mw.Map( true );
        globalConf.set( 'anotherGlobalMapChecker', 'Hello' );
 
-       ok( 'anotherGlobalMapChecker' in window, 'new mw.Map( true ) did store its values in the global window object' );
+       assert.ok( 'anotherGlobalMapChecker' in window, 'new mw.Map( true ) did store its values in the global window object' );
 
        // Whitelist this global variable for QUnit's 'noglobal' mode
        if ( QUnit.config.noglobals ) {
@@ -74,87 +71,78 @@ test( 'mw.Map', function() {
        }
 });
 
-test( 'mw.config', function() {
-       expect(1);
-
-       ok( mw.config instanceof mw.Map, 'mw.config instance of mw.Map' );
+QUnit.test( 'mw.config', 1, function ( assert ) {
+       assert.ok( mw.config instanceof mw.Map, 'mw.config instance of mw.Map' );
 });
 
-test( 'mw.message & mw.messages', function() {
+QUnit.test( 'mw.message & mw.messages', 20, function ( assert ) {
        var goodbye, hello, pluralMessage;
-       expect(20);
 
-       ok( mw.messages, 'messages defined' );
-       ok( mw.messages instanceof mw.Map, 'mw.messages instance of mw.Map' );
-       ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
+       assert.ok( mw.messages, 'messages defined' );
+       assert.ok( mw.messages instanceof mw.Map, 'mw.messages instance of mw.Map' );
+       assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
 
        hello = mw.message( 'hello' );
 
-       equal( hello.format, 'plain', 'Message property "format" defaults to "plain"' );
-       strictEqual( hello.map, mw.messages, 'Message property "map" defaults to the global instance in mw.messages' );
-       equal( hello.key, 'hello', 'Message property "key" (currect key)' );
-       deepEqual( hello.parameters, [], 'Message property "parameters" defaults to an empty array' );
+       assert.equal( hello.format, 'plain', 'Message property "format" defaults to "plain"' );
+       assert.strictEqual( hello.map, mw.messages, 'Message property "map" defaults to the global instance in mw.messages' );
+       assert.equal( hello.key, 'hello', 'Message property "key" (currect key)' );
+       assert.deepEqual( hello.parameters, [], 'Message property "parameters" defaults to an empty array' );
 
        // Todo
-       ok( hello.params, 'Message prototype "params"' );
+       assert.ok( hello.params, 'Message prototype "params"' );
 
        hello.format = 'plain';
-       equal( hello.toString(), 'Hello <b>awesome</b> world', 'Message.toString returns the message as a string with the current "format"' );
+       assert.equal( hello.toString(), 'Hello <b>awesome</b> world', 'Message.toString returns the message as a string with the current "format"' );
 
-       equal( hello.escaped(), 'Hello &lt;b&gt;awesome&lt;/b&gt; world', 'Message.escaped returns the escaped message' );
-       equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
+       assert.equal( hello.escaped(), 'Hello &lt;b&gt;awesome&lt;/b&gt; world', 'Message.escaped returns the escaped message' );
+       assert.equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
 
        hello.parse();
-       equal( hello.format, 'parse', 'Message.parse correctly updated the "format" property' );
+       assert.equal( hello.format, 'parse', 'Message.parse correctly updated the "format" property' );
 
        hello.plain();
-       equal( hello.format, 'plain', 'Message.plain correctly updated the "format" property' );
+       assert.equal( hello.format, 'plain', 'Message.plain correctly updated the "format" property' );
 
-       strictEqual( hello.exists(), true, 'Message.exists returns true for existing messages' );
+       assert.strictEqual( hello.exists(), true, 'Message.exists returns true for existing messages' );
 
        goodbye = mw.message( 'goodbye' );
-       strictEqual( goodbye.exists(), false, 'Message.exists returns false for nonexistent messages' );
+       assert.strictEqual( goodbye.exists(), false, 'Message.exists returns false for nonexistent messages' );
 
-       equal( goodbye.plain(), '<goodbye>', 'Message.toString returns plain <key> if format is "plain" and key does not exist' );
+       assert.equal( goodbye.plain(), '<goodbye>', 'Message.toString returns plain <key> if format is "plain" and key does not exist' );
        // bug 30684
-       equal( goodbye.escaped(), '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if format is "escaped" and key does not exist' );
+       assert.equal( goodbye.escaped(), '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if format is "escaped" and key does not exist' );
 
-       ok( mw.messages.set( 'pluraltestmsg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
+       assert.ok( mw.messages.set( 'pluraltestmsg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
        pluralMessage = mw.message( 'pluraltestmsg' , 6 );
-       equal( pluralMessage.plain(), 'There are 6 results', 'plural get resolved when format is plain' );
-       equal( pluralMessage.parse(), 'There are 6 results', 'plural get resolved when format is parse' );
+       assert.equal( pluralMessage.plain(), 'There are 6 results', 'plural get resolved when format is plain' );
+       assert.equal( pluralMessage.parse(), 'There are 6 results', 'plural get resolved when format is parse' );
 
 });
 
-test( 'mw.msg', function() {
-       expect(11);
-
-       ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
-       equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
-       equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
+QUnit.test( 'mw.msg', 11, function ( assert ) {
+       assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
+       assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
+       assert.equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
 
-       ok( mw.messages.set( 'plural-item' , 'Found $1 {{PLURAL:$1|item|items}}' ) );
-       equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
-       equal( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
-       equal( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );
+       assert.ok( mw.messages.set( 'plural-item' , 'Found $1 {{PLURAL:$1|item|items}}' ) );
+       assert.equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
+       assert.equal( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
+       assert.equal( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );
 
-       ok( mw.messages.set('gender-plural-msg' , '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome' ) );
-       equal( mw.msg( 'gender-plural-msg', 'male', 1 ), 'he is awesome', 'Gender test for male, plural count 1' );
-       equal( mw.msg( 'gender-plural-msg', 'female', '1' ), 'she is awesome', 'Gender test for female, plural count 1' );
-       equal( mw.msg( 'gender-plural-msg', 'unknown', 10 ), 'they are awesome', 'Gender test for neutral, plural count 10' );
+       assert.ok( mw.messages.set('gender-plural-msg' , '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome' ) );
+       assert.equal( mw.msg( 'gender-plural-msg', 'male', 1 ), 'he is awesome', 'Gender test for male, plural count 1' );
+       assert.equal( mw.msg( 'gender-plural-msg', 'female', '1' ), 'she is awesome', 'Gender test for female, plural count 1' );
+       assert.equal( mw.msg( 'gender-plural-msg', 'unknown', 10 ), 'they are awesome', 'Gender test for neutral, plural count 10' );
 
 });
 
-test( 'mw.loader', function() {
+QUnit.asyncTest( 'mw.loader', 2, function ( assert ) {
        var isAwesomeDone;
-       expect(2);
-
-       // Async ahead
-       stop();
 
        mw.loader.testCallback = function () {
-               start();
-               strictEqual( isAwesomeDone, undefined, 'Implementing module is.awesome: isAwesomeDone should still be undefined');
+               QUnit.start();
+               assert.strictEqual( isAwesomeDone, undefined, 'Implementing module is.awesome: isAwesomeDone should still be undefined');
                isAwesomeDone = true;
        };
 
@@ -164,21 +152,17 @@ test( 'mw.loader', function() {
 
                // /sample/awesome.js declares the "mw.loader.testCallback" function
                // which contains a call to start() and ok()
-               strictEqual( isAwesomeDone, true, "test.callback module should've caused isAwesomeDone to be true" );
+               assert.strictEqual( isAwesomeDone, true, "test.callback module should've caused isAwesomeDone to be true" );
                delete mw.loader.testCallback;
 
        }, function () {
-               start();
-               ok( false, 'Error callback fired while loader.using "test.callback" module' );
+               QUnit.start();
+               assert.ok( false, 'Error callback fired while loader.using "test.callback" module' );
        });
 });
 
-test( 'mw.loader.implement', function () {
+QUnit.asyncTest( 'mw.loader.implement', 5, function ( assert ) {
        var isJsExecuted, $element, styleTestUrl;
-       expect(5);
-
-       // Async ahead
-       stop();
 
        styleTestUrl = QUnit.fixurl(
                mw.config.get( 'wgScriptPath' )
@@ -195,14 +179,14 @@ test( 'mw.loader.implement', function () {
                function () {
                        var styleTestTimeout, styleTestStart, styleTestSince;
 
-                       strictEqual( isJsExecuted, undefined, 'javascript not executed multiple times' );
+                       assert.strictEqual( isJsExecuted, undefined, 'javascript not executed multiple times' );
                        isJsExecuted = true;
 
-                       equal( mw.loader.getState( 'test.implement' ), 'loaded', 'module state is "loaded" while implement() is executing javascript' );
+                       assert.equal( mw.loader.getState( 'test.implement' ), 'ready', 'module state is "ready" while implement() is executing javascript' );
 
                        $element = $( '<div class="mw-test-loaderimplement">Foo bar</div>' ).appendTo( '#qunit-fixture' );
 
-                       equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded before javascript execution' );
+                       assert.equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded before javascript execution' );
 
                        // The @import test. This is, in a way, also an open bug for ResourceLoader
                        // ("execute js after styles are loaded"), but browsers don't offer a way to
@@ -225,16 +209,16 @@ test( 'mw.loader.implement', function () {
                                styleTestSince = new Date().getTime() - styleTestStart;
                                // If it is passing or if we timed out, run the real test and stop the loop
                                if ( isCssImportApplied() || styleTestSince > styleTestTimeout ) {
-                                       equal( $element.css( 'float' ), 'right',
+                                       assert.equal( $element.css( 'float' ), 'right',
                                                'CSS stylesheet via @import was applied (after ' + styleTestSince + 'ms) (bug 34669). ("float: right")'
                                        );
 
-                                       equal( $element.css( 'text-align' ),'center',
+                                       assert.equal( $element.css( 'text-align' ),'center',
                                                'CSS styles after the @import are working ("text-align: center")'
                                        );
 
                                        // Async done
-                                       start();
+                                       QUnit.start();
 
                                        return;
                                }
@@ -261,80 +245,77 @@ test( 'mw.loader.implement', function () {
 
 });
 
-test( 'mw.loader erroneous indirect dependency', function() {
-       expect( 3 );
+QUnit.test( 'mw.loader erroneous indirect dependency', 3, function ( assert ) {
        mw.loader.register( [
                ['test.module1', '0'],
                ['test.module2', '0', ['test.module1']],
                ['test.module3', '0', ['test.module2']]
        ] );
-       mw.loader.implement( 'test.module1', function() { throw new Error( 'expected' ); }, {}, {} );
-       strictEqual( mw.loader.getState( 'test.module1' ), 'error', 'Expected "error" state for test.module1' );
-       strictEqual( mw.loader.getState( 'test.module2' ), 'error', 'Expected "error" state for test.module2' );
-       strictEqual( mw.loader.getState( 'test.module3' ), 'error', 'Expected "error" state for test.module3' );
+       mw.loader.implement( 'test.module1', function () { throw new Error( 'expected' ); }, {}, {} );
+       assert.strictEqual( mw.loader.getState( 'test.module1' ), 'error', 'Expected "error" state for test.module1' );
+       assert.strictEqual( mw.loader.getState( 'test.module2' ), 'error', 'Expected "error" state for test.module2' );
+       assert.strictEqual( mw.loader.getState( 'test.module3' ), 'error', 'Expected "error" state for test.module3' );
 } );
 
-test( 'mw.loader out-of-order implementation', function() {
-       expect( 9 );
+QUnit.test( 'mw.loader out-of-order implementation', 9, function ( assert ) {
        mw.loader.register( [
                ['test.module4', '0'],
                ['test.module5', '0', ['test.module4']],
                ['test.module6', '0', ['test.module5']]
        ] );
-       mw.loader.implement( 'test.module4', function() {}, {}, {} );
-       strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
-       strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
-       strictEqual( mw.loader.getState( 'test.module6' ), 'registered', 'Expected "registered" state for test.module6' );
-       mw.loader.implement( 'test.module6', function() {}, {}, {} );
-       strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
-       strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
-       strictEqual( mw.loader.getState( 'test.module6' ), 'loaded', 'Expected "loaded" state for test.module6' );
+       mw.loader.implement( 'test.module4', function () {}, {}, {} );
+       assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
+       assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
+       assert.strictEqual( mw.loader.getState( 'test.module6' ), 'registered', 'Expected "registered" state for test.module6' );
+       mw.loader.implement( 'test.module6', function () {}, {}, {} );
+       assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
+       assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
+       assert.strictEqual( mw.loader.getState( 'test.module6' ), 'loaded', 'Expected "loaded" state for test.module6' );
        mw.loader.implement( 'test.module5', function() {}, {}, {} );
-       strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
-       strictEqual( mw.loader.getState( 'test.module5' ), 'ready', 'Expected "ready" state for test.module5' );
-       strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'Expected "ready" state for test.module6' );
+       assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
+       assert.strictEqual( mw.loader.getState( 'test.module5' ), 'ready', 'Expected "ready" state for test.module5' );
+       assert.strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'Expected "ready" state for test.module6' );
 } );
 
-test( 'mw.loader missing dependency', function() {
-       expect( 13 );
+QUnit.test( 'mw.loader missing dependency', 13, function ( assert ) {
        mw.loader.register( [
                ['test.module7', '0'],
                ['test.module8', '0', ['test.module7']],
                ['test.module9', '0', ['test.module8']]
        ] );
-       mw.loader.implement( 'test.module8', function() {}, {}, {} );
-       strictEqual( mw.loader.getState( 'test.module7' ), 'registered', 'Expected "registered" state for test.module7' );
-       strictEqual( mw.loader.getState( 'test.module8' ), 'loaded', 'Expected "loaded" state for test.module8' );
-       strictEqual( mw.loader.getState( 'test.module9' ), 'registered', 'Expected "registered" state for test.module9' );
+       mw.loader.implement( 'test.module8', function () {}, {}, {} );
+       assert.strictEqual( mw.loader.getState( 'test.module7' ), 'registered', 'Expected "registered" state for test.module7' );
+       assert.strictEqual( mw.loader.getState( 'test.module8' ), 'loaded', 'Expected "loaded" state for test.module8' );
+       assert.strictEqual( mw.loader.getState( 'test.module9' ), 'registered', 'Expected "registered" state for test.module9' );
        mw.loader.state( 'test.module7', 'missing' );
-       strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
-       strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
-       strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
-       mw.loader.implement( 'test.module9', function() {}, {}, {} );
-       strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
-       strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
-       strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
+       assert.strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
+       assert.strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
+       assert.strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
+       mw.loader.implement( 'test.module9', function () {}, {}, {} );
+       assert.strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
+       assert.strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
+       assert.strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
        mw.loader.using(
                ['test.module7'],
-               function() {
-                       ok( false, "Success fired despite missing dependency" );
-                       ok( true , "QUnit expected() count dummy" );
+               function () {
+                       assert.ok( false, "Success fired despite missing dependency" );
+                       assert.ok( true , "QUnit expected() count dummy" );
                },
-               function( e, dependencies ) {
-                       strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
-                       deepEqual( dependencies, ['test.module7'], 'Error callback called with module test.module7' );
+               function ( e, dependencies ) {
+                       assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
+                       assert.deepEqual( dependencies, ['test.module7'], 'Error callback called with module test.module7' );
                }
        );
        mw.loader.using(
                ['test.module9'],
-               function() {
-                       ok( false, "Success fired despite missing dependency" );
-                       ok( true , "QUnit expected() count dummy" );
+               function () {
+                       assert.ok( false, "Success fired despite missing dependency" );
+                       assert.ok( true , "QUnit expected() count dummy" );
                },
-               function( e, dependencies ) {
-                       strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
+               function ( e, dependencies ) {
+                       assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
                        dependencies.sort();
-                       deepEqual(
+                       assert.deepEqual(
                                dependencies,
                                ['test.module7', 'test.module8', 'test.module9'],
                                'Error callback called with all three modules as dependencies'
@@ -343,73 +324,68 @@ test( 'mw.loader missing dependency', function() {
        );
 } );
 
-test( 'mw.loader real missing dependency', function() {
-       expect( 6 );
-
+QUnit.asyncTest( 'mw.loader dependency handling', 5, function ( assert ) {
        mw.loader.addSource(
-               'test',
-               {'loadScript' : QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/testloader.php' )}
+               'testloader',
+               {
+                       loadScript: QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/load.mock.php' )
+               }
        );
+
        mw.loader.register( [
-               ['test.missing', '0', [], null, 'test'], ['test.missing2', '0', [], null, 'test'],
-               ['test.use_missing', '0', ['test.missing'], null, 'test'],
-               ['test.use_missing2', '0', ['test.missing2'], null, 'test']
+               // [module, version, dependencies, group, source]
+               ['testMissing', '1', [], null, 'testloader'],
+               ['testUsesMissing', '1', ['testMissing'], null, 'testloader'],
+               ['testUsesNestedMissing', '1', ['testUsesMissing'], null, 'testloader']
        ] );
 
-       stop();
-       // Asynch ahead
-
-       mw.loader.load( ['test.use_missing'] );
-
        function verifyModuleStates() {
-               strictEqual( mw.loader.getState( 'test.missing' ), 'missing', 'Module "test.missing" must have state "missing"' );
-               strictEqual( mw.loader.getState( 'test.missing2' ), 'missing', 'Module "test.missing2" must have state "missing"' );
-               strictEqual( mw.loader.getState( 'test.use_missing' ), 'error', 'Module "test.use_missing" must have state "error"' );
-               strictEqual( mw.loader.getState( 'test.use_missing2' ), 'error', 'Module "test.use_missing2" must have state "error"' );
+               assert.equal( mw.loader.getState( 'testMissing' ), 'missing', 'Module not known to server must have state "missing"' );
+               assert.equal( mw.loader.getState( 'testUsesMissing' ), 'error', 'Module with missing dependency must have state "error"' );
+               assert.equal( mw.loader.getState( 'testUsesNestedMissing' ), 'error', 'Module with indirect missing dependency must have state "error"' );
        }
 
-       mw.loader.using( ['test.use_missing2'],
-               function() {
-                       start();
-                       ok( false, "Success called wrongly." );
-                       ok( true , "QUnit expected() count dummy" );
+       mw.loader.using( ['testUsesNestedMissing'],
+               function () {
+                       assert.ok( false, 'Error handler should be invoked.' );
+                       assert.ok( true ); // Dummy to reach QUnit expect()
+
                        verifyModuleStates();
+
+                       QUnit.start();
                },
-               function( e, dependencies ) {
-                       start();
-                       ok( true, "Error handler called correctly." );
-                       deepEqual( dependencies, ['test.missing2'], "Dependencies correct." );
+               function ( e, badmodules ) {
+                       assert.ok( true, 'Error handler should be invoked.' );
+                       // As soon as server spits out state('testMissing', 'missing');
+                       // it will bubble up and trigger the error callback.
+                       // Therefor the badmodules array is not testUsesMissing or testUsesNestedMissing.
+                       assert.deepEqual( badmodules, ['testMissing'], 'Bad modules as expected.' );
+
                        verifyModuleStates();
+
+                       QUnit.start();
                }
        );
 } );
 
-test( 'mw.loader bug29107' , function () {
-       expect(2);
-
+QUnit.asyncTest( 'mw.loader bug29107' , 2, function ( assert ) {
        // Message doesn't exist already
-       ok( !mw.messages.exists( 'bug29107' ) );
-
-       // Async! Failure in this test may lead to neither the success nor error callbacks getting called.
-       // Due to QUnit's timeout feauture we won't hang here forever if this happends.
-       stop();
+       assert.ok( !mw.messages.exists( 'bug29107' ) );
 
        mw.loader.implement( 'bug29107.messages-only', [], {}, {'bug29107': 'loaded'} );
        mw.loader.using( 'bug29107.messages-only', function() {
-               start();
-               ok( mw.messages.exists( 'bug29107' ), 'Bug 29107: messages-only module should implement ok' );
+               QUnit.start();
+               assert.ok( mw.messages.exists( 'bug29107' ), 'Bug 29107: messages-only module should implement ok' );
        }, function() {
-               start();
-               ok( false, 'Error callback fired while implementing "bug29107.messages-only" module' );
+               QUnit.start();
+               assert.ok( false, 'Error callback fired while implementing "bug29107.messages-only" module' );
        });
 });
 
-test( 'mw.loader.bug30825', function() {
+QUnit.asyncTest( 'mw.loader.bug30825', 2, function ( assert ) {
        // This bug was actually already fixed in 1.18 and later when discovered in 1.17.
        // Test is for regressions!
 
-       expect(2);
-
        // Forge an URL to the test callback script
        var target = QUnit.fixurl(
                mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/qunitOkCall.js'
@@ -418,33 +394,31 @@ test( 'mw.loader.bug30825', function() {
        // Confirm that mw.loader.load() works with protocol-relative URLs
        target = target.replace( /https?:/, '' );
 
-       equal( target.substr( 0, 2 ), '//',
+       assert.equal( target.substr( 0, 2 ), '//',
                'URL must be relative to test relative URLs!'
        );
 
        // Async!
-       stop();
+       // The target calls QUnit.start
        mw.loader.load( target );
 });
 
-test( 'mw.html', function () {
-       expect(13);
-
-       raises( function () {
+QUnit.test( 'mw.html', 13, function ( assert ) {
+       assert.throws( function () {
                mw.html.escape();
        }, TypeError, 'html.escape throws a TypeError if argument given is not a string' );
 
-       equal( mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
+       assert.equal( mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
                '&lt;mw awesome=&quot;awesome&quot; value=&#039;test&#039; /&gt;', 'escape() escapes special characters to html entities' );
 
-       equal( mw.html.element(),
+       assert.equal( mw.html.element(),
                '<undefined/>', 'element() always returns a valid html string (even without arguments)' );
 
-       equal( mw.html.element( 'div' ), '<div/>', 'element() Plain DIV (simple)' );
+       assert.equal( mw.html.element( 'div' ), '<div/>', 'element() Plain DIV (simple)' );
 
-       equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'element() Basic DIV (simple)' );
+       assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'element() Basic DIV (simple)' );
 
-       equal(
+       assert.equal(
                mw.html.element(
                        'div', {
                                id: 'foobar'
@@ -453,12 +427,12 @@ test( 'mw.html', function () {
                '<div id="foobar"/>',
                'html.element DIV (attribs)' );
 
-       equal( mw.html.element( 'p', null, 12 ), '<p>12</p>', 'Numbers are valid content and should be casted to a string' );
+       assert.equal( mw.html.element( 'p', null, 12 ), '<p>12</p>', 'Numbers are valid content and should be casted to a string' );
 
-       equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'Numbers are valid attribute values' );
+       assert.equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'Numbers are valid attribute values' );
 
        // Example from https://www.mediawiki.org/wiki/ResourceLoader/Default_modules#mediaWiki.html
-       equal(
+       assert.equal(
                mw.html.element(
                        'div',
                        {},
@@ -470,7 +444,7 @@ test( 'mw.html', function () {
                'Raw inclusion of another element'
        );
 
-       equal(
+       assert.equal(
                mw.html.element(
                        'option', {
                                selected: true
@@ -480,7 +454,7 @@ test( 'mw.html', function () {
                'Attributes may have boolean values. True copies the attribute name to the value.'
        );
 
-       equal(
+       assert.equal(
                mw.html.element(
                        'option', {
                                value: 'foo',
@@ -491,12 +465,12 @@ test( 'mw.html', function () {
                'Attributes may have boolean values. False keeps the attribute from output.'
        );
 
-       equal( mw.html.element( 'div',
+       assert.equal( mw.html.element( 'div',
                        null, 'a' ),
                '<div>a</div>',
                'html.element DIV (content)' );
 
-       equal( mw.html.element( 'a',
+       assert.equal( mw.html.element( 'a',
                        { href: 'http://mediawiki.org/w/index.php?title=RL&action=history' }, 'a' ),
                '<a href="http://mediawiki.org/w/index.php?title=RL&amp;action=history">a</a>',
                'html.element DIV (attribs + content)' );
index 15265db..c823baf 100644 (file)
@@ -1,21 +1,12 @@
-module( 'mediawiki.user', QUnit.newMwEnvironment() );
+( function ( mw ) {
 
-test( '-- Initial check', function() {
-       expect(1);
+QUnit.module( 'mediawiki.user', QUnit.newMwEnvironment() );
 
-       ok( mw.user, 'mw.user defined' );
+QUnit.test( 'options', 1, function ( assert ) {
+       assert.ok( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
 });
 
-
-test( 'options', function() {
-       expect(1);
-
-       ok( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
-});
-
-test( 'User login status', function() {
-       expect(5);
-
+QUnit.test( 'user status', 9, function ( assert ) {
        /**
         * Tests can be run under three different conditions:
         *   1) From tests/qunit/index.html, user will be anonymous.
@@ -24,16 +15,42 @@ test( 'User login status', function() {
         */
 
        // Forge an anonymous user:
-       mw.config.set( 'wgUserName', null);
+       mw.config.set( 'wgUserName', null );
 
-       strictEqual( mw.user.name(), null, 'user.name should return null when anonymous' );
-       ok( mw.user.anonymous(), 'user.anonymous should reutrn true when anonymous' );
+       assert.strictEqual( mw.user.getName(), null, 'user.getName() returns null when anonymous' );
+       assert.strictEqual( mw.user.name(), null, 'user.name() compatibility' );
+       assert.assertTrue( mw.user.isAnon(), 'user.isAnon() returns true when anonymous' );
+       assert.assertTrue( mw.user.anonymous(), 'user.anonymous() compatibility' );
 
        // Not part of startUp module
        mw.config.set( 'wgUserName', 'John' );
 
-       equal( mw.user.name(), 'John', 'user.name returns username when logged-in' );
-       ok( !mw.user.anonymous(), 'user.anonymous returns false when logged-in' );
+       assert.equal( mw.user.getName(), 'John', 'user.getName() returns username when logged-in' );
+       assert.equal( mw.user.name(), 'John', 'user.name() compatibility' );
+       assert.assertFalse( mw.user.isAnon(), 'user.isAnon() returns false when logged-in' );
+       assert.assertFalse( mw.user.anonymous(), 'user.anonymous() compatibility' );
 
-       equal( mw.user.id(), 'John', 'user.id Returns username when logged-in' );
+       assert.equal( mw.user.id(), 'John', 'user.id Returns username when logged-in' );
 });
+
+QUnit.asyncTest( 'getGroups', 3, function ( assert ) {
+       mw.user.getGroups( function ( groups ) {
+               // First group should always be '*'
+               assert.equal( $.type( groups ), 'array', 'Callback gets an array' );
+               assert.equal( groups[0], '*', '"*"" is the first group' );
+               // Sort needed because of different methods if creating the arrays,
+               // only the content matters.
+               assert.deepEqual( groups.sort(), mw.config.get( 'wgUserGroups' ).sort(), 'Array contains all groups, just like wgUserGroups' );
+               QUnit.start();
+       });
+});
+
+QUnit.asyncTest( 'getRights', 1, function ( assert ) {
+       mw.user.getRights( function ( rights ) {
+               // First group should always be '*'
+               assert.equal( $.type( rights ), 'array', 'Callback gets an array' );
+               QUnit.start();
+       });
+});
+
+}( mediaWiki ) );
index d396b04..ababa8d 100644 (file)
@@ -1,73 +1,58 @@
-module( 'mediawiki.util', QUnit.newMwEnvironment() );
+QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment() );
 
-test( '-- Initial check', function() {
-       expect(1);
-
-       ok( mw.util, 'mw.util defined' );
-});
-
-test( 'rawurlencode', function() {
-       expect(1);
-
-       equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
+QUnit.test( 'rawurlencode', 1, function ( assert ) {
+       assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
 });
 
-test( 'wikiUrlencode', function() {
-       expect(1);
-
-       equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
+QUnit.test( 'wikiUrlencode', 1, function ( assert ) {
+       assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
 });
 
-test( 'wikiGetlink', function() {
-       expect(3);
-
+QUnit.test( 'wikiGetlink', 3, function ( assert ) {
        // Not part of startUp module
        mw.config.set( 'wgArticlePath', '/wiki/$1' );
        mw.config.set( 'wgPageName', 'Foobar' );
 
        var hrefA = mw.util.wikiGetlink( 'Sandbox' );
-       equal( hrefA, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
+       assert.equal( hrefA, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
 
        var hrefB = mw.util.wikiGetlink( 'Foo:Sandbox ? 5+5=10 ! (test)/subpage' );
-       equal( hrefB, '/wiki/Foo:Sandbox_%3F_5%2B5%3D10_%21_%28test%29/subpage',
+       assert.equal( hrefB, '/wiki/Foo:Sandbox_%3F_5%2B5%3D10_%21_%28test%29/subpage',
                'Advanced title; Get link for "Foo:Sandbox ? 5+5=10 ! (test)/subpage"' );
 
        var hrefC = mw.util.wikiGetlink();
-       equal( hrefC, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
+       assert.equal( hrefC, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
 });
 
-test( 'wikiScript', function() {
-       expect(2);
-
+QUnit.test( 'wikiScript', 4, function ( assert ) {
        mw.config.set({
-               'wgScript': '/w/index.php',
+               'wgScript': '/w/i.php', // customized wgScript for bug 39103
+               'wgLoadScript': '/w/l.php', // customized wgLoadScript for bug 39103
                'wgScriptPath': '/w',
                'wgScriptExtension': '.php'
        });
 
-       equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ), 'Defaults to index.php and is equal to wgScript' );
-       equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
+       assert.equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ), 'wikiScript() returns wgScript' );
+       assert.equal( mw.util.wikiScript( 'index' ), mw.config.get( 'wgScript' ), "wikiScript( 'index' ) returns wgScript" );
+       assert.equal( mw.util.wikiScript( 'load' ), mw.config.get( 'wgLoadScript' ), "wikiScript( 'load' ) returns wgLoadScript" );
+       assert.equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
 });
 
-test( 'addCSS', function() {
-       expect(3);
-
+QUnit.test( 'addCSS', 3, function ( assert ) {
        var $testEl = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( '#qunit-fixture' );
 
        var style = mw.util.addCSS( '#mw-addcsstest { visibility: hidden; }' );
-       equal( typeof style, 'object', 'addCSS returned an object' );
-       strictEqual( style.disabled, false, 'property "disabled" is available and set to false' );
+       assert.equal( typeof style, 'object', 'addCSS returned an object' );
+       assert.strictEqual( style.disabled, false, 'property "disabled" is available and set to false' );
 
-       equal( $testEl.css( 'visibility' ), 'hidden', 'Added style properties are in effect' );
+       assert.equal( $testEl.css( 'visibility' ), 'hidden', 'Added style properties are in effect' );
 
        // Clean up
        $( style.ownerNode ).remove();
 });
 
-test( 'toggleToc', function() {
-       expect(4);
-
-       strictEqual( mw.util.toggleToc(), null, 'Return null if there is no table of contents on the page.' );
+QUnit.asyncTest( 'toggleToc', 4, function ( assert ) {
+       assert.strictEqual( mw.util.toggleToc(), null, 'Return null if there is no table of contents on the page.' );
 
        var     tocHtml =
        '<table id="toc" class="toc"><tr><td>' +
@@ -80,57 +65,46 @@ test( 'toggleToc', function() {
                $toc = $(tocHtml).appendTo( '#qunit-fixture' ),
                $toggleLink = $( '#togglelink' );
 
-       strictEqual( $toggleLink.length, 1, 'Toggle link is appended to the page.' );
-
-       // Toggle animation is asynchronous
-       // QUnit should not finish this test() untill they are all done
-       stop();
+       assert.strictEqual( $toggleLink.length, 1, 'Toggle link is appended to the page.' );
 
        var actionC = function() {
-               start();
+               QUnit.start();
        };
        var actionB = function() {
-               start(); stop();
-               strictEqual( mw.util.toggleToc( $toggleLink, actionC ), true, 'Return boolean true if the TOC is now visible.' );
+               assert.strictEqual( mw.util.toggleToc( $toggleLink, actionC ), true, 'Return boolean true if the TOC is now visible.' );
        };
        var actionA = function() {
-               strictEqual( mw.util.toggleToc( $toggleLink, actionB ), false, 'Return boolean false if the TOC is now hidden.' );
+               assert.strictEqual( mw.util.toggleToc( $toggleLink, actionB ), false, 'Return boolean false if the TOC is now hidden.' );
        };
 
        actionA();
 });
 
-test( 'getParamValue', function() {
-       expect(5);
-
+QUnit.test( 'getParamValue', 5, function ( assert ) {
        var     url1 = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
 
-       equal( mw.util.getParamValue( 'foo', url1 ), 'right', 'Use latest one, ignore hash' );
-       strictEqual( mw.util.getParamValue( 'bar', url1 ), null, 'Return null when not found' );
+       assert.equal( mw.util.getParamValue( 'foo', url1 ), 'right', 'Use latest one, ignore hash' );
+       assert.strictEqual( mw.util.getParamValue( 'bar', url1 ), null, 'Return null when not found' );
 
        var url2 = 'http://example.org/#&foo=bad';
-       strictEqual( mw.util.getParamValue( 'foo', url2 ), null, 'Ignore hash if param is not in querystring but in hash (bug 27427)' );
+       assert.strictEqual( mw.util.getParamValue( 'foo', url2 ), null, 'Ignore hash if param is not in querystring but in hash (bug 27427)' );
 
        var url3 = 'example.org?' + $.param({ 'TEST': 'a b+c' });
-       strictEqual( mw.util.getParamValue( 'TEST', url3 ), 'a b+c', 'Bug 30441: getParamValue must understand "+" encoding of space' );
+       assert.strictEqual( mw.util.getParamValue( 'TEST', url3 ), 'a b+c', 'Bug 30441: getParamValue must understand "+" encoding of space' );
 
        var url4 = 'example.org?' + $.param({ 'TEST': 'a b+c d' }); // check for sloppy code from r95332 :)
-       strictEqual( mw.util.getParamValue( 'TEST', url4 ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
+       assert.strictEqual( mw.util.getParamValue( 'TEST', url4 ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
 });
 
-test( 'tooltipAccessKey', function() {
-       expect(3);
-
-       equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'mw.util.tooltipAccessKeyPrefix must be a string' );
-       ok( mw.util.tooltipAccessKeyRegexp instanceof RegExp, 'mw.util.tooltipAccessKeyRegexp instance of RegExp' );
-       ok( mw.util.updateTooltipAccessKeys, 'mw.util.updateTooltipAccessKeys' );
+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' );
 });
 
-test( '$content', function() {
-       expect(2);
-
-       ok( mw.util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
-       strictEqual( mw.util.$content.length, 1, 'mw.util.$content must have length of 1' );
+QUnit.test( '$content', 2, function ( assert ) {
+       assert.ok( mw.util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
+       assert.strictEqual( mw.util.$content.length, 1, 'mw.util.$content must have length of 1' );
 });
 
 
@@ -138,84 +112,98 @@ test( '$content', function() {
  * Portlet names are prefixed with 'p-test' to avoid conflict with core
  * when running the test suite under a wiki page.
  * Previously, test elements where invisible to the selector since only
- * one element can have a given id. 
+ * one element can have a given id.
  */
-test( 'addPortletLink', function () {
-       var pTestTb, vectorTabs, tbRL, tbMW, $tbMW, tbRLDM, caFoo;
-       expect(7);
-
+QUnit.test( 'addPortletLink', 8, function ( assert ) {
+       var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo;
        pTestTb = '\
        <div class="portlet" id="p-test-tb">\
+               <h5>Toolbox</h5>\
                <ul class="body"></ul>\
        </div>';
+       pCustom = '\
+       <div class="portlet" id="p-test-custom">\
+               <h5>Views</h5>\
+               <ul class="body">\
+                       <li id="c-foo"><a href="#">Foo</a></li>\
+                       <li id="c-barmenu">\
+                               <ul>\
+                                       <li id="c-bar-baz"><a href="#">Baz</a></a>\
+                               </ul>\
+                       </li>\
+               </ul>\
+       </div>';
        vectorTabs = '\
        <div id="p-test-views" class="vectorTabs">\
                <h5>Views</h5>\
                <ul></ul>\
        </div>';
 
-       $('#qunit-fixture').append(pTestTb, vectorTabs);
+       $( '#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' );
 
-       ok( $.isDomElement( tbRL ), 'addPortletLink returns a valid DOM Element according to $.isDomElement' );
+       assert.ok( $.isDomElement( tbRL ), 'addPortletLink returns a valid DOM Element according to $.isDomElement' );
 
        tbMW = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
                'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', tbRL );
        $tbMW = $( tbMW );
 
 
-       equal( $tbMW.attr( 'id' ), 't-mworg', 'Link has correct ID set' );
-       equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
-       equal( $tbMW.next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing nextnode)' );
+       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 = $(cuQuux);
+
+       assert.equal(
+               $( '#p-test-custom #c-barmenu ul li' ).length,
+               1,
+               'addPortletLink did not add the item to all <ul> elements in the portlet (bug 35082)'
+       );
 
        tbRLDM = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
 
-       equal( $( tbRLDM ).next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing CSS selector)' );
+       assert.equal( $( tbRLDM ).next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing CSS selector)' );
 
        caFoo = mw.util.addPortletLink( 'p-test-views', '#', 'Foo' );
 
-       strictEqual( $tbMW.find( 'span').length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
-       strictEqual( $( caFoo ).find( 'span').length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
+       assert.strictEqual( $tbMW.find( 'span').length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
+       assert.strictEqual( $( caFoo ).find( 'span').length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
 });
 
-test( 'jsMessage', function() {
-       expect(1);
-
+QUnit.test( 'jsMessage', 1, function ( assert ) {
        var a = mw.util.jsMessage( "MediaWiki is <b>Awesome</b>." );
-       ok( a, 'Basic checking of return value' );
+       assert.ok( a, 'Basic checking of return value' );
 
        // Clean up
        $( '#mw-js-message' ).remove();
 });
 
-test( 'validateEmail', function() {
-       expect(6);
-
-       strictEqual( mw.util.validateEmail( "" ), null, 'Should return null for empty string ' );
-       strictEqual( mw.util.validateEmail( "user@localhost" ), true, 'Return true for a valid e-mail address' );
+QUnit.test( 'validateEmail', 6, function ( assert ) {
+       assert.strictEqual( mw.util.validateEmail( "" ), null, 'Should return null for empty string ' );
+       assert.strictEqual( mw.util.validateEmail( "user@localhost" ), true, 'Return true for a valid e-mail address' );
 
        // testEmailWithCommasAreInvalids
-       strictEqual( mw.util.validateEmail( "user,foo@example.org" ), false, 'Emails with commas are invalid' );
-       strictEqual( mw.util.validateEmail( "userfoo@ex,ample.org" ), false, 'Emails with commas are invalid' );
+       assert.strictEqual( mw.util.validateEmail( "user,foo@example.org" ), false, 'Emails with commas are invalid' );
+       assert.strictEqual( mw.util.validateEmail( "userfoo@ex,ample.org" ), false, 'Emails with commas are invalid' );
 
        // testEmailWithHyphens
-       strictEqual( mw.util.validateEmail( "user-foo@example.org" ), true, 'Emails may contain a hyphen' );
-       strictEqual( mw.util.validateEmail( "userfoo@ex-ample.org" ), true, 'Emails may contain a hyphen' );
+       assert.strictEqual( mw.util.validateEmail( "user-foo@example.org" ), true, 'Emails may contain a hyphen' );
+       assert.strictEqual( mw.util.validateEmail( "userfoo@ex-ample.org" ), true, 'Emails may contain a hyphen' );
 });
 
-test( 'isIPv6Address', function() {
-       expect(40);
-
+QUnit.test( 'isIPv6Address', 40, function ( assert ) {
        // Shortcuts
-       var     assertFalseIPv6 = function( addy, summary ) {
-                       return strictEqual( mw.util.isIPv6Address( addy ), false, summary );
-               },
-               assertTrueIPv6 = function( addy, summary ) {
-                       return strictEqual( mw.util.isIPv6Address( addy ), true, summary );
-               };
+       function assertFalseIPv6( addy, summary ) {
+               return assert.strictEqual( mw.util.isIPv6Address( addy ), false, summary );
+       }
+       function assertTrueIPv6( addy, summary ) {
+               return assert.strictEqual( mw.util.isIPv6Address( addy ), true, summary );
+       }
 
        // Based on IPTest.php > testisIPv6
        assertFalseIPv6( ':fc:100::', 'IPv6 starting with lone ":"' );
@@ -229,7 +217,7 @@ test( 'isIPv6Address', function() {
        'fc:100:a:d::',
        'fc:100:a:d:1::',
        'fc:100:a:d:1:e::',
-       'fc:100:a:d:1:e:ac::'], function( i, addy ){
+       'fc:100:a:d:1:e:ac::'], function ( i, addy ){
                assertTrueIPv6( addy, addy + ' is a valid IP' );
        });
 
@@ -250,7 +238,7 @@ test( 'isIPv6Address', function() {
        '::fc:100:a:d:1:e',
        '::fc:100:a:d:1:e:ac',
 
-       'fc:100:a:d:1:e:ac:0'], function( i, addy ){
+       'fc:100:a:d:1:e:ac:0'], function ( i, addy ){
                assertTrueIPv6( addy, addy + ' is a valid IP' );
        });
 
@@ -275,16 +263,14 @@ test( 'isIPv6Address', function() {
        assertFalseIPv6( 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' );
 });
 
-test( 'isIPv4Address', function() {
-       expect(11);
-
+QUnit.test( 'isIPv4Address', 11, function ( assert ) {
        // Shortcuts
-       var     assertFalseIPv4 = function( addy, summary ) {
-                       return strictEqual( mw.util.isIPv4Address( addy ), false, summary );
-               },
-               assertTrueIPv4 = function( addy, summary ) {
-                       return strictEqual( mw.util.isIPv4Address( addy ), true, summary );
-               };
+       function assertFalseIPv4( addy, summary ) {
+               assert.strictEqual( mw.util.isIPv4Address( addy ), false, summary );
+       }
+       function assertTrueIPv4( addy, summary ) {
+               assert.strictEqual( mw.util.isIPv4Address( addy ), true, summary );
+       }
 
        // Based on IPTest.php > testisIPv4
        assertFalseIPv4( false, 'Boolean false is not an IP' );
index bf5b379..8bca4b0 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 
-require_once (dirname(__FILE__).'/'.'MediaWikiInstallationCommonFunction.php');
+require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
 
 /**
  * Test Case ID   : 30 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
@@ -99,4 +99,4 @@ class MediaWikiButtonsAvailabilityTestCase extends MediaWikiInstallationCommonFu
         $this->assertTrue( $this->isElementPresent( "submit-back" ));
         $this->assertTrue( $this->isElementPresent( "submit-continue" ));
     }
-}
\ No newline at end of file
+}
index f1b7945..8e2afe7 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 
-require_once ( dirname( __FILE__ ) . '/MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
 
 /**
  * Test Case ID   : 04 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 2d623af..55ad461 100644 (file)
@@ -27,7 +27,7 @@
  *
  */
 
-require_once ( dirname( __FILE__ ) . '/MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
 
 /**
  * Test Case ID   : 02 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index b112bc0..825ca42 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 
-require_once ( dirname( __FILE__ ) . '/MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
 
 /**
  * Test Case ID   : 09 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 024fe5d..c2b3505 100644 (file)
@@ -33,7 +33,7 @@
  * Version        : MediaWiki 1.18alpha
 */
 
-require_once ( dirname( __FILE__ ) . '/MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
 
 class MediaWikiErrorsNamepageTestCase extends MediaWikiInstallationCommonFunction {
 
index 806fcfd..78205cf 100644 (file)
@@ -33,7 +33,7 @@
  * Version        : MediaWiki 1.18alpha
 */
 
-require_once ( dirname( __FILE__ ) . '/MediaWikiInstallationCommonFunction.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
 
 class MediaWikiHelpFieldHintTestCase extends MediaWikiInstallationCommonFunction {
 
index 99df8a2..353fa2e 100644 (file)
@@ -27,9 +27,9 @@
  */
 
 require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
-require_once ( dirname( __FILE__ ) . '/MediaWikiInstallationConfig.php' );
-require_once ( dirname(__FILE__) . '/MediaWikiInstallationMessage.php' );
-require_once ( dirname(__FILE__) . '/MediaWikiInstallationVariables.php');
+require_once ( __DIR__ . '/MediaWikiInstallationConfig.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationMessage.php' );
+require_once ( __DIR__ . '/MediaWikiInstallationVariables.php');
 
 
 class MediaWikiInstallationCommonFunction extends PHPUnit_Extensions_SeleniumTestCase {
index 386a50e..58ccc7c 100644 (file)
 require_once 'PHPUnit/Framework.php';
 require_once 'PHPUnit/Framework/TestSuite.php';
 
-require_once ( dirname( __FILE__ ) . '/MediaWikiUserInterfaceTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiButtonsAvailabilityTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiHelpFieldHintTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiRightFrameworkLinksTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiRestartInstallationTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiErrorsConnectToDatabasePageTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiErrorsNamepageTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiMySQLDataBaseTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiMySQLiteDataBaseTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiUpgradeExistingDatabaseTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiDifferntDatabasePrefixTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiDifferentDatabaseAccountTestCase.php' );
-require_once ( dirname( __FILE__ ) . '/MediaWikiOnAlreadyInstalledTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiUserInterfaceTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiButtonsAvailabilityTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiHelpFieldHintTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiRightFrameworkLinksTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiRestartInstallationTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiErrorsConnectToDatabasePageTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiErrorsNamepageTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiMySQLDataBaseTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiMySQLiteDataBaseTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiUpgradeExistingDatabaseTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiDifferntDatabasePrefixTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiDifferentDatabaseAccountTestCase.php' );
+require_once ( __DIR__ . '/MediaWikiOnAlreadyInstalledTestCase.php' );
 
 
 
index 399ed4e..16d065c 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 
-require_once (dirname(__FILE__).'/'.'MediaWikiInstallationCommonFunction.php');
+require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
 
 /**
  * Test Case ID   : 01 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index f57c1a5..4ca6916 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 
-require_once (dirname(__FILE__).'/'.'MediaWikiInstallationCommonFunction.php');
+require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
 
 /**
  * Test Case ID   : 06 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 4c05266..7a1b615 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 
-require_once (dirname(__FILE__).'/'.'MediaWikiInstallationCommonFunction.php');
+require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
 
 
 /**
index b9ca830..ea87de0 100644 (file)
@@ -29,7 +29,7 @@
 
 
 
-require_once (dirname(__FILE__).'/'.'MediaWikiInstallationCommonFunction.php');
+require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
 
 /**
  * Test Case ID   : 11, 12 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 700172c..7b0fcf3 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 
-require_once (dirname(__FILE__).'/'.'MediaWikiInstallationCommonFunction.php');
+require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
 
 /**
  * Test Case ID   : 14, 15, 16, 17 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index eb82071..5cdc8d4 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 
-require_once (dirname(__FILE__).'/'.'MediaWikiInstallationCommonFunction.php');
+require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
 
 /**
  * Test Case ID   : 05 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
@@ -114,4 +114,4 @@ class MediaWikiUpgradeExistingDatabaseTestCase extends MediaWikiInstallationComm
         $this->chooseCancelOnNextConfirmation();
         parent::restartInstallation();
     }
-}
\ No newline at end of file
+}
index 0994892..15fad95 100644 (file)
@@ -27,7 +27,7 @@
  *
  */
 
-require_once (dirname(__FILE__).'/'.'MediaWikiInstallationCommonFunction.php');
+require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
 
 /**
  * Test Case ID   : 18 - 27 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 5fc1a5a..6b8fc97 100644 (file)
@@ -43,7 +43,7 @@ class MediawikiCoreSmokeTestCase extends SeleniumTestCase {
                $this->login();
                $this->open( $this->getUrl() .
                        '/index.php?title=Special:Upload' );
-               $this->type( 'wpUploadFile', dirname( __FILE__ ) .
+               $this->type( 'wpUploadFile', __DIR__ .
                        "\\..\\data\\Wikipedia-logo-v2-de.png" );
                $this->check( 'wpIgnoreWarning' );
                $this->click( 'wpUpload' );
index 01d87e4..b8d2d48 100644 (file)
@@ -27,7 +27,7 @@
  *
  */
 
-require_once dirname( dirname( __FILE__ ) ) . '/SeleniumTestConstants.php';
+require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
 
 class MyContributionsTestCase extends SeleniumTestCase {
 
index d1ee3e7..998fab9 100644 (file)
@@ -27,7 +27,7 @@
  *
  */
 
-require_once dirname( dirname( __FILE__ ) ) . '/SeleniumTestConstants.php';
+require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
 
 class MyWatchListTestCase extends SeleniumTestCase {
 
index 50d3754..8307b48 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -25,7 +25,7 @@ define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require( 'core/includes/WebStart.php' );
 } else {
-       require( dirname( __FILE__ ) . '/includes/WebStart.php' );
+       require( __DIR__ . '/includes/WebStart.php' );
 }
 
 // Don't use fancy mime detection, just check the file extension for jpg/gif/png
@@ -65,19 +65,22 @@ function wfThumbHandle404() {
        # that to the 404 handler, and puts the original request in REDIRECT_URL.
        if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
                # The URL is un-encoded, so put it back how it was
-               $uri = str_replace( "%2F", "/", urlencode( $_SERVER['REDIRECT_URL'] ) );
-               # Just get the URI path (REDIRECT_URL is either a full URL or a path)
-               if ( $uri[0] !== '/' ) {
-                       $bits = wfParseUrl( $uri );
-                       if ( $bits && isset( $bits['path'] ) ) {
-                               $uri = $bits['path'];
-                       }
-               }
+               $uriPath = str_replace( "%2F", "/", urlencode( $_SERVER['REDIRECT_URL'] ) );
        } else {
-               $uri = $_SERVER['REQUEST_URI'];
+               $uriPath = $_SERVER['REQUEST_URI'];
+       }
+       # Just get the URI path (REDIRECT_URL/REQUEST_URI is either a full URL or a path)
+       if ( substr( $uriPath, 0, 1 ) !== '/' ) {
+               $bits = wfParseUrl( $uriPath );
+               if ( $bits && isset( $bits['path'] ) ) {
+                       $uriPath = $bits['path'];
+               } else {
+                       wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+                       return;
+               }
        }
 
-       $params = wfExtractThumbParams( $uri ); // basic wiki URL param extracting
+       $params = wfExtractThumbParams( $uriPath ); // basic wiki URL param extracting
        if ( $params == null ) {
                wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
                return;
@@ -126,13 +129,13 @@ function wfStreamThumb( array $params ) {
                // Format is <timestamp>!<name>
                $bits = explode( '!', $fileName, 2 );
                if ( count( $bits ) != 2 ) {
-                       wfThumbError( 404, wfMsg( 'badtitletext' ) );
+                       wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
                        wfProfileOut( __METHOD__ );
                        return;
                }
                $title = Title::makeTitleSafe( NS_FILE, $bits[1] );
                if ( !$title ) {
-                       wfThumbError( 404, wfMsg( 'badtitletext' ) );
+                       wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
                        wfProfileOut( __METHOD__ );
                        return;
                }
@@ -144,7 +147,7 @@ function wfStreamThumb( array $params ) {
                // Get the name without the timestamp so hash paths are correctly computed
                $title = Title::makeTitleSafe( NS_FILE, isset( $bits[1] ) ? $bits[1] : $fileName );
                if ( !$title ) {
-                       wfThumbError( 404, wfMsg( 'badtitletext' ) );
+                       wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
                        wfProfileOut( __METHOD__ );
                        return;
                }
@@ -169,7 +172,7 @@ function wfStreamThumb( array $params ) {
 
        // Check the source file storage path
        if ( !$img ) {
-               wfThumbError( 404, wfMsg( 'badtitletext' ) );
+               wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
                wfProfileOut( __METHOD__ );
                return;
        }
@@ -240,15 +243,16 @@ function wfStreamThumb( array $params ) {
 
        // Check for thumbnail generation errors...
        $errorMsg = false;
+       $msg = wfMessage( 'thumbnail_error' );
        if ( !$thumb ) {
-               $errorMsg = wfMsgHtml( 'thumbnail_error', 'File::transform() returned false' );
+               $errorMsg = $msg->rawParams( 'File::transform() returned false' )->escaped();
        } elseif ( $thumb->isError() ) {
                $errorMsg = $thumb->getHtmlMsg();
        } elseif ( !$thumb->hasFile() ) {
-               $errorMsg = wfMsgHtml( 'thumbnail_error', 'No path supplied in thumbnail object' );
+               $errorMsg = $msg->rawParams( 'No path supplied in thumbnail object' )->escaped();
        } elseif ( $thumb->fileIsSource() ) {
-               $errorMsg = wfMsgHtml( 'thumbnail_error',
-                       'Image was not scaled, is the requested width bigger than the source?' );
+               $errorMsg = $msg->
+                       rawParams( 'Image was not scaled, is the requested width bigger than the source?' )->escaped();
        }
 
        if ( $errorMsg !== false ) {
@@ -265,22 +269,22 @@ function wfStreamThumb( array $params ) {
  * Extract the required params for thumb.php from the thumbnail request URI.
  * At least 'width' and 'f' should be set if the result is an array.
  *
- * @param $uri String Thumbnail request URI path
+ * @param $uriPath String Thumbnail request URI path
  * @return Array|null associative params array or null
  */
-function wfExtractThumbParams( $uri ) {
+function wfExtractThumbParams( $uriPath ) {
        $repo = RepoGroup::singleton()->getLocalRepo();
 
-       $zoneURI = $repo->getZoneUrl( 'thumb' );
-       if ( substr( $zoneURI, 0, 1 ) !== '/' ) {
-               $bits = wfParseUrl( $zoneURI );
-               if ( $bits && isset( $bits['path'] ) ) {
-                       $zoneURI = $bits['path'];
-               } else {
-                       return null;
-               }
+       $zoneUriPath = $repo->getZoneHandlerUrl( 'thumb' )
+               ? $repo->getZoneHandlerUrl( 'thumb' ) // custom URL
+               : $repo->getZoneUrl( 'thumb' ); // default to main URL
+       // URL might be relative ("/images") or protocol-relative ("//lang.site/image")
+       $bits = wfParseUrl( wfExpandUrl( $zoneUriPath, PROTO_INTERNAL ) );
+       if ( $bits && isset( $bits['path'] ) ) {
+               $zoneUriPath = $bits['path'];
+       } else {
+               return null;
        }
-       $zoneUrlRegex = preg_quote( $zoneURI );
 
        $hashDirRegex = $subdirRegex = '';
        for ( $i = 0; $i < $repo->getHashLevels(); $i++ ) {
@@ -288,10 +292,11 @@ function wfExtractThumbParams( $uri ) {
                $hashDirRegex .= "$subdirRegex/";
        }
 
-       $thumbUrlRegex = "!^$zoneUrlRegex/((archive/|temp/)?$hashDirRegex([^/]*)/([^/]*))$!";
+       $thumbPathRegex = "!^" . preg_quote( $zoneUriPath ) .
+               "/((archive/|temp/)?$hashDirRegex([^/]*)/([^/]*))$!";
 
        // Check if this is a valid looking thumbnail request...
-       if ( preg_match( $thumbUrlRegex, $uri, $matches ) ) {
+       if ( preg_match( $thumbPathRegex, $uriPath, $matches ) ) {
                list( /* all */, $rel, $archOrTemp, $filename, $thumbname ) = $matches;
                $filename = urldecode( $filename );
                $thumbname = urldecode( $thumbname );
index abc71dd..69bdddd 100644 (file)
@@ -26,4 +26,4 @@ define( 'THUMB_HANDLER', true );
 
 # Execute thumb.php, having set THUMB_HANDLER so that
 # it knows to extract params from a thumbnail file URL.
-require( dirname( __FILE__ ) . '/thumb.php' );
+require( __DIR__ . '/thumb.php' );